diff --git a/asset-manifest.json b/asset-manifest.json index 86d787f..ce907b0 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,14 +1,14 @@ { "files": { "main.css": "/workout-editor/static/css/main.20aa8553.chunk.css", - "main.js": "/workout-editor/static/js/main.4b7a8f6f.chunk.js", - "main.js.map": "/workout-editor/static/js/main.4b7a8f6f.chunk.js.map", + "main.js": "/workout-editor/static/js/main.76098227.chunk.js", + "main.js.map": "/workout-editor/static/js/main.76098227.chunk.js.map", "runtime-main.js": "/workout-editor/static/js/runtime-main.766fd1ba.js", "runtime-main.js.map": "/workout-editor/static/js/runtime-main.766fd1ba.js.map", "static/js/2.b48a3bc0.chunk.js": "/workout-editor/static/js/2.b48a3bc0.chunk.js", "static/js/2.b48a3bc0.chunk.js.map": "/workout-editor/static/js/2.b48a3bc0.chunk.js.map", "index.html": "/workout-editor/index.html", - "precache-manifest.7461dbd6d5601f13aabef61166f9015f.js": "/workout-editor/precache-manifest.7461dbd6d5601f13aabef61166f9015f.js", + "precache-manifest.e595006a1dc3aabc6c8efeac41232097.js": "/workout-editor/precache-manifest.e595006a1dc3aabc6c8efeac41232097.js", "service-worker.js": "/workout-editor/service-worker.js", "static/css/main.20aa8553.chunk.css.map": "/workout-editor/static/css/main.20aa8553.chunk.css.map", "static/js/2.b48a3bc0.chunk.js.LICENSE.txt": "/workout-editor/static/js/2.b48a3bc0.chunk.js.LICENSE.txt" @@ -17,6 +17,6 @@ "static/js/runtime-main.766fd1ba.js", "static/js/2.b48a3bc0.chunk.js", "static/css/main.20aa8553.chunk.css", - "static/js/main.4b7a8f6f.chunk.js" + "static/js/main.76098227.chunk.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index 03e3981..d370a4d 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -
\ No newline at end of file
+
\ No newline at end of file
diff --git a/precache-manifest.7461dbd6d5601f13aabef61166f9015f.js b/precache-manifest.e595006a1dc3aabc6c8efeac41232097.js
similarity index 73%
rename from precache-manifest.7461dbd6d5601f13aabef61166f9015f.js
rename to precache-manifest.e595006a1dc3aabc6c8efeac41232097.js
index 14c2044..6f0a9eb 100644
--- a/precache-manifest.7461dbd6d5601f13aabef61166f9015f.js
+++ b/precache-manifest.e595006a1dc3aabc6c8efeac41232097.js
@@ -1,10 +1,10 @@
self.__precacheManifest = (self.__precacheManifest || []).concat([
{
- "revision": "6446188adc54e6f50fd4f4be1d68e163",
+ "revision": "496a771a30ed094d5d7a25ec23a36b8f",
"url": "/workout-editor/index.html"
},
{
- "revision": "4abd2cc3dc54e5f43b1f",
+ "revision": "f702c6fd1b9387f0b4a7",
"url": "/workout-editor/static/css/main.20aa8553.chunk.css"
},
{
@@ -16,8 +16,8 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([
"url": "/workout-editor/static/js/2.b48a3bc0.chunk.js.LICENSE.txt"
},
{
- "revision": "4abd2cc3dc54e5f43b1f",
- "url": "/workout-editor/static/js/main.4b7a8f6f.chunk.js"
+ "revision": "f702c6fd1b9387f0b4a7",
+ "url": "/workout-editor/static/js/main.76098227.chunk.js"
},
{
"revision": "b5e368ec906fbe804156",
diff --git a/service-worker.js b/service-worker.js
index f9bbb89..1c5fe65 100644
--- a/service-worker.js
+++ b/service-worker.js
@@ -14,7 +14,7 @@
importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js");
importScripts(
- "/workout-editor/precache-manifest.7461dbd6d5601f13aabef61166f9015f.js"
+ "/workout-editor/precache-manifest.e595006a1dc3aabc6c8efeac41232097.js"
);
self.addEventListener('message', (event) => {
diff --git a/static/js/main.4b7a8f6f.chunk.js b/static/js/main.4b7a8f6f.chunk.js
deleted file mode 100644
index 3851031..0000000
--- a/static/js/main.4b7a8f6f.chunk.js
+++ /dev/null
@@ -1,2 +0,0 @@
-(this["webpackJsonpworkout-editor"]=this["webpackJsonpworkout-editor"]||[]).push([[0],{120:function(n,e,t){"use strict";t.r(e);var r=t(0),a=t.n(r),o=t(56),c=t.n(o),i=(t(67),t(20)),u=t(1),l=t(2),s=t(3);function d(){var n=Object(u.a)(["\n border-bottom-left-radius: 10px;\n border-bottom-right-radius: 10px;\n height: ","%;\n clip-path: ",";\n background: linear-gradient(\n to right,\n ",",\n ","\n );\n"]);return d=function(){return n},n}function f(){var n=Object(u.a)(["\n border-radius: 10px;\n height: ","%;\n background: ",";\n"]);return f=function(){return n},n}function g(){var n=Object(u.a)(["\n display: inline-block;\n vertical-align: bottom;\n margin-right: 0.1%;\n /* exclude 0.1% margin from bar width */\n width: ","%;\n transition: width 0.1s, height 0.1s, background-color 0.1s;\n"]);return g=function(){return n},n}var b=l.a.div(g(),(function(n){return n.durationPercentage-.1})),h={free:"linear-gradient(to top, rgba(204,204,204,1), rgba(255,255,255,0))",Z1:"#7f7f7f",Z2:"#338cff",Z3:"#59bf59",Z4:"#ffcc3f",Z5:"#ff6639",Z6:"#ff330c"},m=Object(l.a)(b)(f(),(function(n){return"free"===n.zone?100:n.intensityPercentage}),(function(n){return h[n.zone]})),p=Object(l.a)(b)(d(),(function(n){return n.maxIntensityPercentage}),(function(n){var e=n.direction,t=n.relativeMinIntensityPercentage;return"up"===e?"polygon(0% 100%, 100% 100%, 100% 0%, 0% ".concat(t,"%)"):function(n){return"polygon(0% 0%, 0% 100%, 100% 100%, 100% ".concat(n,"%)")}(t)}),(function(n){return h[n.startZone]}),(function(n){return h[n.endZone]}));function v(){var n=Object(u.a)(["\n white-space: nowrap;\n overflow: hidden;\n height: 200px;\n border-radius: 5px;\n padding: 5px;\n margin: 10px 0;\n"]);return v=function(){return n},n}var x=l.a.div(v()),E=function(n){var e=n.intervals,t=Object(s.totalDuration)(e),r=Object(s.maximumIntensity)(e);return a.a.createElement(x,null,e.map((function(n,e){return n.intensity instanceof s.RangeIntensity?a.a.createElement(p,Object.assign({key:e},function(n,e,t){var r=Math.min(n.intensity.start,n.intensity.end)/t.value*100,a=Math.max(n.intensity.start,n.intensity.end)/t.value*100;return{durationPercentage:n.duration.seconds/e.seconds*100,maxIntensityPercentage:a,relativeMinIntensityPercentage:100-r/a*100,direction:n.intensity.start$&").replace(/-?(\d{1,2}:)?\d{1,2}:\d{1,2}/g,"$&").replace(/\d+%/g,"$&").replace(/\d+rpm/g,"$&").replace(/\.\./g,"$&").replace(/@(.*?)$/gm,"@$1")}(o?function(n,e){var t=new RegExp("^((?:[^\\n]*?\\n){".concat(e,"})([^\\n]*?)\\n"));return n.replace(t,"$1$2\n")}(n,o.loc.row):n)}),[o]);return a.a.createElement(N,{value:e,onValueChange:t,highlight:c})};function W(){var n=Object(u.a)(["\n border: 1px solid #bbb;\n border-radius: 3px;\n padding: 10px;\n"]);return W=function(){return n},n}function V(){var n=Object(u.a)(["\n font-weight: normal;\n font-size: 16px;\n"]);return V=function(){return n},n}var q=l.a.h2(V()),A=l.a.pre(W()),$=function(n){var e=n.workout;return a.a.createElement("div",null,a.a.createElement(q,null,"Generated Zwift workout file (.zwo):"),a.a.createElement(A,null,Object(s.generateZwo)(e)))},_=t(61),nn=t.n(_);function en(){var n=Object(u.a)(["\n display: inline-block;\n color: #cc2222;\n opacity: 0.7;\n font-size: 20px;\n font-weight: bold;\n transform: rotate(20deg) translate(-15px, -8px);\n"]);return en=function(){return n},n}function tn(){var n=Object(u.a)(["\n margin-right: 0.5em;\n vertical-align: bottom;\n"]);return tn=function(){return n},n}function rn(){var n=Object(u.a)(["\n font-weight: normal;\n"]);return rn=function(){return n},n}var an=l.a.h1(rn()),on=l.a.img.attrs({src:nn.a,width:45,height:45})(tn()),cn=l.a.span(en()),un=function(){return a.a.createElement(an,null,a.a.createElement(on,null),"Workout editor ",a.a.createElement(cn,null,"beta"))};function ln(){var n=Object(u.a)(["\n font-size: 12px;\n text-align: center;\n margin-top: 3em;\n border-top: 1px solid #eee;\n padding-top: 1em;\n color: gray;\n"]);return ln=function(){return n},n}var sn=l.a.p(ln()),dn=function(){return a.a.createElement(sn,null,"Built by Rene Saarsoo. \xb7 Graphics inspired by ",a.a.createElement("a",{href:"https://whatsonzwift.com/workouts/"},"What's on Zwift?"),"\xa0\xb7 Sweat provided by ",a.a.createElement("a",{href:"https://zwift.com"},"Zwift")," :-)")};function fn(){var n=Object(u.a)(["\n max-width: 800px;\n margin: 0 auto;\n"]);return fn=function(){return n},n}var gn="Name: Sample workout\nDescription: Try changing it, and see what happens below.\n\nWarmup: 10:00 30%..75%\nInterval: 15:00 100% 90rpm\n @ 00:00 Start off easy\n @ 01:00 Settle into rhythm\n @ 07:30 Half way through\n @ 14:00 Final minute, stay strong!\nRest: 10:00 75%\nFreeRide: 20:00\n @ 00:10 Just have some fun, riding as you wish\nCooldown: 10:00 70%..30%\n",bn=l.a.div(fn());function hn(){var n=Object(r.useState)(gn),e=Object(i.a)(n,2),t=e[0],o=e[1],c=Object(r.useState)(Object(s.parse)(gn)),u=Object(i.a)(c,2),l=u[0],d=u[1],f=Object(r.useState)(void 0),g=Object(i.a)(f,2),b=g[0],h=g[1],m=Object(r.useCallback)((function(n){o(n);try{d(Object(s.parse)(n)),h(void 0)}catch(e){if(!(e instanceof s.ParseError||e instanceof s.ValidationError))throw e;h(e)}}),[o,d,h]);return a.a.createElement(bn,null,a.a.createElement(un,null),a.a.createElement(P,{onValueChange:m,value:t,error:b}),a.a.createElement(E,{intervals:l.intervals}),b&&a.a.createElement(z,null,b.message),a.a.createElement(R,{workout:l}),a.a.createElement($,{workout:l}),a.a.createElement(dn,null))}c.a.render(a.a.createElement(a.a.StrictMode,null,a.a.createElement(hn,null)),document.getElementById("root"))},61:function(n,e){n.exports="data:image/png;base64,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"},62:function(n,e,t){n.exports=t(120)},67:function(n,e,t){},77:function(n,e){},79:function(n,e){}},[[62,1,2]]]);
-//# sourceMappingURL=main.4b7a8f6f.chunk.js.map
\ No newline at end of file
diff --git a/static/js/main.4b7a8f6f.chunk.js.map b/static/js/main.4b7a8f6f.chunk.js.map
deleted file mode 100644
index 18b5b09..0000000
--- a/static/js/main.4b7a8f6f.chunk.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["components/Bar.tsx","components/WorkoutPlot.tsx","components/formatDuration.ts","components/WorkoutStats.tsx","components/ErrorMessage.tsx","components/CodeEditor.tsx","components/ZwoOutput.tsx","components/AppTitle.tsx","components/Credits.tsx","App.tsx","index.tsx","logo.png"],"names":["BaseBar","styled","div","props","durationPercentage","zoneColorsMap","free","Z1","Z2","Z3","Z4","Z5","Z6","Bar","zone","intensityPercentage","RangeBar","maxIntensityPercentage","direction","relativeMinIntensityPercentage","middle","createDownPolygon","startZone","endZone","Plot","WorkoutPlot","intervals","workoutDuration","totalDuration","maxIntensity","maximumIntensity","map","interval","i","intensity","RangeIntensity","key","minIntensityPercentage","Math","min","start","end","value","max","duration","seconds","intensityValueToZoneType","toRangeBarProps","toBarProps","formatDuration","hours","floor","minutes","splitDuration","formatIntensity","round","StatsLine","label","StatsListItem","Container","SummarySection","section","ZonesSection","XpSection","Header","h2","List","ul","ZoneList","xpEquivalent","xp","distanceInKm","ceil","durationInHours","speed","WorkoutStats","workout","stats","averageIntensity","normalizedIntensity","tss","zones","name","ErrorMessage","p","BaseCodeEditor","Editor","attrs","padding","CodeEditor","onValueChange","error","highlightFn","useCallback","code","replace","highlight","linenr","regex","RegExp","highlightErrorLine","loc","row","ZwoCode","pre","ZwoOutput","generateZwo","Title","h1","Logo","img","src","logo","width","height","Beta","span","AppTitle","Text","Credits","href","defaultWorkout","AppContainer","App","useState","text","setText","parse","setWorkout","undefined","setError","onChange","e","ParseError","ValidationError","message","ReactDOM","render","StrictMode","document","getElementById","module","exports"],"mappings":"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","file":"static/js/main.4b7a8f6f.chunk.js","sourcesContent":["import styled from \"styled-components\";\nimport { ZoneType } from \"zwiftout\";\n\ntype BaseBarProps = {\n // Percentage of total workout length\n durationPercentage: number;\n};\n\nconst BaseBar = styled.div$&\")\n .replace(/-?(\\d{1,2}:)?\\d{1,2}:\\d{1,2}/g, \"$&\")\n .replace(/\\d+%/g, \"$&\")\n .replace(/\\d+rpm/g, \"$&\")\n .replace(/\\.\\./g, \"$&\")\n .replace(/@(.*?)$/gm, \"@$1\");\n};\n\nexport const BaseCodeEditor = styled(Editor).attrs({ padding: 10 })`\n font-family: source-code-pro, Menlo, Monaco, Consolas, \"Courier New\", monospace;\n font-size: 14px;\n line-height: 1.3;\n border: 1px inset #bbb;\n border-radius: 3px;\n background: #fff;\n\n code.keyword {\n font-weight: bold;\n }\n code.duration {\n color: #681caf;\n }\n code.intensity {\n color: #af391c;\n }\n code.cadence {\n color: #86af1c;\n }\n code.range {\n color: #888;\n }\n code.comment {\n font-style: italic;\n color: #888;\n .duration {\n color: #8d67af;\n }\n }\n code.comment-start {\n font-weight: bold;\n font-style: italic;\n color: #888;\n }\n code.error {\n background-color: rgba(252, 152, 152, 0.5);\n border-radius: 4px;\n }\n`;\n\nconst highlightErrorLine = (code: string, linenr: number): string => {\n const regex = new RegExp(`^((?:[^\\\\n]*?\\\\n){${linenr}})([^\\\\n]*?)\\\\n`);\n return code.replace(regex, \"$1$2\\n\");\n};\n\ninterface CodeEditorProps {\n value: string;\n onValueChange: (value: string) => void;\n error: ZwiftoutException | undefined;\n}\n\nexport const CodeEditor: React.FC$&").replace(/-?(\d{1,2}:)?\d{1,2}:\d{1,2}/g,"$&").replace(/\d+%/g,"$&").replace(/\d+rpm/g,"$&").replace(/\.\./g,"$&").replace(/@(.*?)$/gm,"@$1")}(o?function(n,e){var t=new RegExp("^((?:[^\\n]*?\\n){".concat(e.loc.row,"})([^\\n]*?)\\n")),r=e instanceof s.ValidationError?"validation-error":"parse-error";return n.replace(t,"$1$2\n"))}(n,o):n)}),[o]);return a.a.createElement(N,{value:e,onValueChange:t,highlight:c})};function W(){var n=Object(u.a)(["\n border: 1px solid #bbb;\n border-radius: 3px;\n padding: 10px;\n"]);return W=function(){return n},n}function V(){var n=Object(u.a)(["\n font-weight: normal;\n font-size: 16px;\n"]);return V=function(){return n},n}var q=l.a.h2(V()),A=l.a.pre(W()),$=function(n){var e=n.workout;return a.a.createElement("div",null,a.a.createElement(q,null,"Generated Zwift workout file (.zwo):"),a.a.createElement(A,null,Object(s.generateZwo)(e)))},_=t(61),nn=t.n(_);function en(){var n=Object(u.a)(["\n display: inline-block;\n color: #cc2222;\n opacity: 0.7;\n font-size: 20px;\n font-weight: bold;\n transform: rotate(20deg) translate(-15px, -8px);\n"]);return en=function(){return n},n}function tn(){var n=Object(u.a)(["\n margin-right: 0.5em;\n vertical-align: bottom;\n"]);return tn=function(){return n},n}function rn(){var n=Object(u.a)(["\n font-weight: normal;\n"]);return rn=function(){return n},n}var an=l.a.h1(rn()),on=l.a.img.attrs({src:nn.a,width:45,height:45})(tn()),cn=l.a.span(en()),un=function(){return a.a.createElement(an,null,a.a.createElement(on,null),"Workout editor ",a.a.createElement(cn,null,"beta"))};function ln(){var n=Object(u.a)(["\n font-size: 12px;\n text-align: center;\n margin-top: 3em;\n border-top: 1px solid #eee;\n padding-top: 1em;\n color: gray;\n"]);return ln=function(){return n},n}var sn=l.a.p(ln()),dn=function(){return a.a.createElement(sn,null,"Built by Rene Saarsoo. \xb7 Graphics inspired by ",a.a.createElement("a",{href:"https://whatsonzwift.com/workouts/"},"What's on Zwift?"),"\xa0\xb7 Sweat provided by ",a.a.createElement("a",{href:"https://zwift.com"},"Zwift")," :-)")};function fn(){var n=Object(u.a)(["\n max-width: 800px;\n margin: 0 auto;\n"]);return fn=function(){return n},n}var gn="Name: Sample workout\nDescription: Try changing it, and see what happens below.\n\nWarmup: 10:00 30%..75%\nInterval: 15:00 100% 90rpm\n @ 00:00 Start off easy\n @ 01:00 Settle into rhythm\n @ 07:30 Half way through\n @ 14:00 Final minute, stay strong!\nRest: 10:00 75%\nFreeRide: 20:00\n @ 00:10 Just have some fun, riding as you wish\nCooldown: 10:00 70%..30%\n",bn=l.a.div(fn());function hn(){var n=Object(r.useState)(gn),e=Object(i.a)(n,2),t=e[0],o=e[1],c=Object(r.useState)(Object(s.parse)(gn)),u=Object(i.a)(c,2),l=u[0],d=u[1],f=Object(r.useState)(void 0),g=Object(i.a)(f,2),b=g[0],h=g[1],m=Object(r.useCallback)((function(n){o(n);try{d(Object(s.parse)(n)),h(void 0)}catch(e){if(!(e instanceof s.ParseError||e instanceof s.ValidationError))throw e;h(e)}}),[o,d,h]);return a.a.createElement(bn,null,a.a.createElement(un,null),a.a.createElement(P,{onValueChange:m,value:t,error:b}),a.a.createElement(E,{intervals:l.intervals}),b&&a.a.createElement(z,null,b.message),a.a.createElement(R,{workout:l}),a.a.createElement($,{workout:l}),a.a.createElement(dn,null))}c.a.render(a.a.createElement(a.a.StrictMode,null,a.a.createElement(hn,null)),document.getElementById("root"))},61:function(n,e){n.exports="data:image/png;base64,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"},62:function(n,e,t){n.exports=t(120)},67:function(n,e,t){},77:function(n,e){},79:function(n,e){}},[[62,1,2]]]);
+//# sourceMappingURL=main.76098227.chunk.js.map
\ No newline at end of file
diff --git a/static/js/main.76098227.chunk.js.map b/static/js/main.76098227.chunk.js.map
new file mode 100644
index 0000000..69b06a5
--- /dev/null
+++ b/static/js/main.76098227.chunk.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["components/Bar.tsx","components/WorkoutPlot.tsx","components/formatDuration.ts","components/WorkoutStats.tsx","components/ErrorMessage.tsx","components/CodeEditor.tsx","components/ZwoOutput.tsx","components/AppTitle.tsx","components/Credits.tsx","App.tsx","index.tsx","logo.png"],"names":["BaseBar","styled","div","props","durationPercentage","zoneColorsMap","free","Z1","Z2","Z3","Z4","Z5","Z6","Bar","zone","intensityPercentage","RangeBar","maxIntensityPercentage","direction","relativeMinIntensityPercentage","middle","createDownPolygon","startZone","endZone","Plot","WorkoutPlot","intervals","workoutDuration","totalDuration","maxIntensity","maximumIntensity","map","interval","i","intensity","RangeIntensity","key","minIntensityPercentage","Math","min","start","end","value","max","duration","seconds","intensityValueToZoneType","toRangeBarProps","toBarProps","formatDuration","hours","floor","minutes","splitDuration","formatIntensity","round","StatsLine","label","StatsListItem","Container","SummarySection","section","ZonesSection","XpSection","Header","h2","List","ul","ZoneList","xpEquivalent","xp","distanceInKm","ceil","durationInHours","speed","WorkoutStats","workout","stats","averageIntensity","normalizedIntensity","tss","zones","name","ErrorMessage","p","BaseCodeEditor","Editor","attrs","padding","CodeEditor","onValueChange","error","highlightFn","useCallback","code","replace","highlight","regex","RegExp","loc","row","className","ValidationError","highlightErrorLine","ZwoCode","pre","ZwoOutput","generateZwo","Title","h1","Logo","img","src","logo","width","height","Beta","span","AppTitle","Text","Credits","href","defaultWorkout","AppContainer","App","useState","text","setText","parse","setWorkout","undefined","setError","onChange","e","ParseError","message","ReactDOM","render","StrictMode","document","getElementById","module","exports"],"mappings":"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","file":"static/js/main.76098227.chunk.js","sourcesContent":["import styled from \"styled-components\";\nimport { ZoneType } from \"zwiftout\";\n\ntype BaseBarProps = {\n // Percentage of total workout length\n durationPercentage: number;\n};\n\nconst BaseBar = styled.div$&\")\n .replace(/-?(\\d{1,2}:)?\\d{1,2}:\\d{1,2}/g, \"$&\")\n .replace(/\\d+%/g, \"$&\")\n .replace(/\\d+rpm/g, \"$&\")\n .replace(/\\.\\./g, \"$&\")\n .replace(/@(.*?)$/gm, \"@$1\");\n};\n\nexport const BaseCodeEditor = styled(Editor).attrs({ padding: 10 })`\n font-family: source-code-pro, Menlo, Monaco, Consolas, \"Courier New\", monospace;\n font-size: 14px;\n line-height: 1.3;\n border: 1px inset #bbb;\n border-radius: 3px;\n background: #fff;\n\n code.keyword {\n font-weight: bold;\n }\n code.duration {\n color: #681caf;\n }\n code.intensity {\n color: #af391c;\n }\n code.cadence {\n color: #86af1c;\n }\n code.range {\n color: #888;\n }\n code.comment {\n font-style: italic;\n color: #888;\n .duration {\n color: #8d67af;\n }\n }\n code.comment-start {\n font-weight: bold;\n font-style: italic;\n color: #888;\n }\n code.parse-error {\n background-color: rgba(252, 152, 152, 0.5);\n border-radius: 4px;\n }\n code.validation-error {\n background-color: rgba(252, 209, 152, 0.5);\n border-radius: 4px;\n }\n`;\n\nconst highlightErrorLine = (code: string, error: ZwiftoutException): string => {\n const regex = new RegExp(`^((?:[^\\\\n]*?\\\\n){${error.loc.row}})([^\\\\n]*?)\\\\n`);\n const className = error instanceof ValidationError ? \"validation-error\" : \"parse-error\";\n return code.replace(regex, `$1$2\\n`);\n};\n\ninterface CodeEditorProps {\n value: string;\n onValueChange: (value: string) => void;\n error: ZwiftoutException | undefined;\n}\n\nexport const CodeEditor: React.FC