From b2adb9f00062b660a96915ea665c25845eb768a4 Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Mon, 26 Dec 2022 20:41:09 +0200 Subject: [PATCH] Updates --- asset-manifest.json | 8 ++++---- index.html | 2 +- ... precache-manifest.719b7202eae437868e1d9a53892cf7af.js | 8 ++++---- service-worker.js | 2 +- static/js/main.8dd5c635.chunk.js | 2 -- static/js/main.8dd5c635.chunk.js.map | 1 - static/js/main.d9d6cdce.chunk.js | 2 ++ static/js/main.d9d6cdce.chunk.js.map | 1 + 8 files changed, 13 insertions(+), 13 deletions(-) rename precache-manifest.42466d82a651f42506b6f930e1a34b6b.js => precache-manifest.719b7202eae437868e1d9a53892cf7af.js (73%) delete mode 100644 static/js/main.8dd5c635.chunk.js delete mode 100644 static/js/main.8dd5c635.chunk.js.map create mode 100644 static/js/main.d9d6cdce.chunk.js create mode 100644 static/js/main.d9d6cdce.chunk.js.map diff --git a/asset-manifest.json b/asset-manifest.json index 224ad38..204d669 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.8dd5c635.chunk.js", - "main.js.map": "/workout-editor/static/js/main.8dd5c635.chunk.js.map", + "main.js": "/workout-editor/static/js/main.d9d6cdce.chunk.js", + "main.js.map": "/workout-editor/static/js/main.d9d6cdce.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.317bd3cc.chunk.js": "/workout-editor/static/js/2.317bd3cc.chunk.js", "static/js/2.317bd3cc.chunk.js.map": "/workout-editor/static/js/2.317bd3cc.chunk.js.map", "index.html": "/workout-editor/index.html", - "precache-manifest.42466d82a651f42506b6f930e1a34b6b.js": "/workout-editor/precache-manifest.42466d82a651f42506b6f930e1a34b6b.js", + "precache-manifest.719b7202eae437868e1d9a53892cf7af.js": "/workout-editor/precache-manifest.719b7202eae437868e1d9a53892cf7af.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.317bd3cc.chunk.js.LICENSE.txt": "/workout-editor/static/js/2.317bd3cc.chunk.js.LICENSE.txt" @@ -17,6 +17,6 @@ "static/js/runtime-main.766fd1ba.js", "static/js/2.317bd3cc.chunk.js", "static/css/main.20aa8553.chunk.css", - "static/js/main.8dd5c635.chunk.js" + "static/js/main.d9d6cdce.chunk.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index ce26ed9..eacf49d 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -Workout editorFork me on GitHub
\ No newline at end of file +Workout editorFork me on GitHub
\ No newline at end of file diff --git a/precache-manifest.42466d82a651f42506b6f930e1a34b6b.js b/precache-manifest.719b7202eae437868e1d9a53892cf7af.js similarity index 73% rename from precache-manifest.42466d82a651f42506b6f930e1a34b6b.js rename to precache-manifest.719b7202eae437868e1d9a53892cf7af.js index 4da2f6e..4272829 100644 --- a/precache-manifest.42466d82a651f42506b6f930e1a34b6b.js +++ b/precache-manifest.719b7202eae437868e1d9a53892cf7af.js @@ -1,10 +1,10 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ { - "revision": "f3da0e65c0dccc8f34a6f1f0da9d4e15", + "revision": "abc953eebe662776e9f71300b7c3abf8", "url": "/workout-editor/index.html" }, { - "revision": "672b819b8cff43b65f45", + "revision": "4dc054f245084734635e", "url": "/workout-editor/static/css/main.20aa8553.chunk.css" }, { @@ -16,8 +16,8 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ "url": "/workout-editor/static/js/2.317bd3cc.chunk.js.LICENSE.txt" }, { - "revision": "672b819b8cff43b65f45", - "url": "/workout-editor/static/js/main.8dd5c635.chunk.js" + "revision": "4dc054f245084734635e", + "url": "/workout-editor/static/js/main.d9d6cdce.chunk.js" }, { "revision": "b5e368ec906fbe804156", diff --git a/service-worker.js b/service-worker.js index b7c71f4..3a125b2 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.42466d82a651f42506b6f930e1a34b6b.js" + "/workout-editor/precache-manifest.719b7202eae437868e1d9a53892cf7af.js" ); self.addEventListener('message', (event) => { diff --git a/static/js/main.8dd5c635.chunk.js b/static/js/main.8dd5c635.chunk.js deleted file mode 100644 index e8ef912..0000000 --- a/static/js/main.8dd5c635.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this["webpackJsonpworkout-editor"]=this["webpackJsonpworkout-editor"]||[]).push([[0],{121: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(15)),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})),m={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"},h=Object(l.a)(b)(f(),(function(n){return"free"===n.zone?100:n.intensityPercentage}),(function(n){return m[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 m[n.startZone]}),(function(n){return m[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.start0?"".concat(t,"h ").concat(r,"min"):r>0?"".concat(r,"min"):a>0?"".concat(a,"sec"):"-"};function w(){var n=Object(u.a)(["\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n"]);return w=function(){return n},n}function y(){var n=Object(u.a)(["\n margin: 1m 0;\n padding: 0;\n list-style: none;\n"]);return y=function(){return n},n}function j(){var n=Object(u.a)(["\n margin: 0;\n font-size: 14px;\n font-weight: normal;\n"]);return j=function(){return n},n}function C(){var n=Object(u.a)(["\n grid-area: xp;\n"]);return C=function(){return n},n}function Q(){var n=Object(u.a)(["\n grid-area: zones;\n"]);return Q=function(){return n},n}function U(){var n=Object(u.a)(["\n grid-area: summary;\n"]);return U=function(){return n},n}function D(){var n=Object(u.a)(['\n display: grid;\n grid-template-columns: 1fr 3fr;\n grid-template-areas:\n "summary zones"\n "xp xp ";\n border: 1px solid #bbb;\n border-radius: 10px;\n padding: 10px;\n font-size: 12px;\n background: rgba(255, 255, 255, 0.6);\n']);return D=function(){return n},n}var k=function(n){return"".concat(Math.round(100*n.value),"%")},T=function(n){var e=n.label,t=n.value;return a.a.createElement(a.a.Fragment,null,a.a.createElement("strong",null,e)," ",t)},M=function(n){return a.a.createElement("li",null,a.a.createElement(T,n))},I=l.a.div(D()),X=l.a.section(U()),F=l.a.section(Q()),Y=l.a.section(C()),G=l.a.h2(j()),Z=l.a.ul(y()),L=Object(l.a)(Z)(w()),K=function(n,e){var t=Math.ceil(n/20),r=e.seconds/60/60,a=Math.round(t/r);return"equivalent to riding ".concat(t," km at ").concat(a," km/h")},R=function(n){var e=n.workout,t=Object(s.stats)(e),r=t.totalDuration,o=t.averageIntensity,c=t.normalizedIntensity,i=t.tss,u=t.xp,l=t.zones;return a.a.createElement(I,null,a.a.createElement(X,null,a.a.createElement(G,null,"Summary"),a.a.createElement(Z,null,a.a.createElement(M,{label:"Duration:",value:O(r)}),a.a.createElement(M,{label:"Average intensity:",value:k(o)}),a.a.createElement(M,{label:"Normalized intensity:",value:k(c)}),a.a.createElement(M,{label:"TSS:",value:Math.round(i)}))),a.a.createElement(F,null,a.a.createElement(G,null,"Zone distribution"),a.a.createElement(L,null,l.map((function(n){return a.a.createElement(M,{key:n.name,label:n.name,value:O(n.duration)})})))),a.a.createElement(Y,null,a.a.createElement(T,{label:"Zwift XP:",value:"".concat(u," (").concat(K(u,r),")")}),";"))};function B(){var n=Object(u.a)(["\n color: red;\n background: #fee;\n border-radius: 10px;\n border: 2px solid red;\n padding: 5px;\n margin: 10px 0;\n"]);return B=function(){return n},n}var z=l.a.p(B()),S=t(60),H=t.n(S);function J(){var n=Object(u.a)(['\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']);return J=function(){return n},n}var N=Object(l.a)(H.a).attrs({padding:10})(J()),P=function(n){var e=n.value,t=n.onValueChange,o=n.error,c=Object(r.useCallback)((function(n){return function(n){return n.replace(/^(Name|Author|Description|Warmup|Rest|Interval|Cooldown|FreeRide):/gm,"$&").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=l.a.div(fn());function bn(){var n=Object(r.useState)(!1),e=Object(i.a)(n,2),t=e[0],o=e[1],c=Object(r.useState)(""),u=Object(i.a)(c,2),l=u[0],d=u[1],f=Object(r.useState)(Object(s.parse)("")),g=Object(i.a)(f,2),b=g[0],m=g[1],h=Object(r.useState)(void 0),p=Object(i.a)(h,2),v=p[0],x=p[1],O=Object(r.useCallback)((function(n){d(n);try{m(Object(s.parse)(n)),x(void 0)}catch(e){if(!(e instanceof s.ParseError||e instanceof s.ValidationError))throw e;x(e)}}),[d,m,x]);return Object(r.useEffect)((function(){t?function(n){localStorage.setItem("workout-editor-text",n)}(l):(o(!0),O(function(){var n=localStorage.getItem("workout-editor-text");return n&&""!==n.trim()?n:"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"}()))}),[l,O,o,t]),a.a.createElement(gn,null,a.a.createElement(un,null),a.a.createElement(P,{onValueChange:O,value:l,error:v}),a.a.createElement(E,{intervals:b.intervals}),v&&a.a.createElement(z,null,v.message),a.a.createElement(R,{workout:b}),a.a.createElement($,{workout:b}),a.a.createElement(dn,null))}c.a.render(a.a.createElement(a.a.StrictMode,null,a.a.createElement(bn,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(121)},67:function(n,e,t){},77:function(n,e){},79:function(n,e){}},[[62,1,2]]]); -//# sourceMappingURL=main.8dd5c635.chunk.js.map \ No newline at end of file diff --git a/static/js/main.8dd5c635.chunk.js.map b/static/js/main.8dd5c635.chunk.js.map deleted file mode 100644 index bab2999..0000000 --- a/static/js/main.8dd5c635.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","storage.ts","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","AppContainer","App","useState","loaded","setLoaded","text","setText","parse","setWorkout","undefined","setError","onChange","e","ParseError","useEffect","localStorage","setItem","saveWorkout","getItem","trim","loadWorkout","message","ReactDOM","render","StrictMode","document","getElementById","module","exports"],"mappings":"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","file":"static/js/main.8dd5c635.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 display: inline-block;\n vertical-align: bottom;\n margin-right: 0.1%;\n /* exclude 0.1% margin from bar width */\n width: ${(props) => props.durationPercentage - 0.1}%;\n transition: width 0.1s, height 0.1s, background-color 0.1s;\n`;\n\nexport type BarProps = BaseBarProps & {\n // Percentage of maximum intensity in workout\n intensityPercentage: number;\n zone: ZoneType;\n};\n\nconst zoneColorsMap: Record = {\n free: \"linear-gradient(to top, rgba(204,204,204,1), rgba(255,255,255,0))\",\n Z1: \"#7f7f7f\",\n Z2: \"#338cff\",\n Z3: \"#59bf59\",\n Z4: \"#ffcc3f\",\n Z5: \"#ff6639\",\n Z6: \"#ff330c\",\n};\n\nexport const Bar = styled(BaseBar)`\n border-radius: 10px;\n height: ${(props) => (props.zone === \"free\" ? 100 : props.intensityPercentage)}%;\n background: ${(props) => zoneColorsMap[props.zone]};\n`;\n\nexport type RangeBarProps = BaseBarProps & {\n // Percentage of maximum intensity in workout\n maxIntensityPercentage: number;\n // Percentage relative to `maxIntensityPercentage`\n relativeMinIntensityPercentage: number;\n startZone: ZoneType;\n endZone: ZoneType;\n direction: \"up\" | \"down\";\n};\n\nconst createUpPolygon = (middle: number) => `polygon(0% 100%, 100% 100%, 100% 0%, 0% ${middle}%)`;\nconst createDownPolygon = (middle: number) => `polygon(0% 0%, 0% 100%, 100% 100%, 100% ${middle}%)`;\n\nexport const RangeBar = styled(BaseBar)`\n border-bottom-left-radius: 10px;\n border-bottom-right-radius: 10px;\n height: ${(props) => props.maxIntensityPercentage}%;\n clip-path: ${({ direction, relativeMinIntensityPercentage }) =>\n direction === \"up\"\n ? createUpPolygon(relativeMinIntensityPercentage)\n : createDownPolygon(relativeMinIntensityPercentage)};\n background: linear-gradient(\n to right,\n ${(props) => zoneColorsMap[props.startZone]},\n ${(props) => zoneColorsMap[props.endZone]}\n );\n`;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport {\n Interval,\n Intensity,\n Duration,\n totalDuration,\n maximumIntensity,\n RangeIntensity,\n intensityValueToZoneType,\n} from \"zwiftout\";\nimport { BarProps, Bar, RangeBar, RangeBarProps } from \"./Bar\";\n\nconst Plot = styled.div`\n white-space: nowrap;\n overflow: hidden;\n height: 200px;\n border-radius: 5px;\n padding: 5px;\n margin: 10px 0;\n`;\n\nconst toBarProps = (interval: Interval, workoutDuration: Duration, maxIntensity: Intensity): BarProps => ({\n zone: interval.intensity.zone,\n durationPercentage: (interval.duration.seconds / workoutDuration.seconds) * 100,\n intensityPercentage: (interval.intensity.value / maxIntensity.value) * 100,\n});\n\nconst toRangeBarProps = (interval: Interval, workoutDuration: Duration, maxIntensity: Intensity): RangeBarProps => {\n const minIntensityPercentage =\n (Math.min(interval.intensity.start, interval.intensity.end) / maxIntensity.value) * 100;\n const maxIntensityPercentage =\n (Math.max(interval.intensity.start, interval.intensity.end) / maxIntensity.value) * 100;\n\n return {\n durationPercentage: (interval.duration.seconds / workoutDuration.seconds) * 100,\n maxIntensityPercentage: maxIntensityPercentage,\n relativeMinIntensityPercentage: 100 - (minIntensityPercentage / maxIntensityPercentage) * 100,\n direction: interval.intensity.start < interval.intensity.end ? \"up\" : \"down\",\n startZone: intensityValueToZoneType(interval.intensity.start),\n endZone: intensityValueToZoneType(interval.intensity.end),\n };\n};\n\nexport const WorkoutPlot: React.FC<{ intervals: Interval[] }> = ({ intervals }) => {\n const workoutDuration = totalDuration(intervals);\n const maxIntensity = maximumIntensity(intervals);\n\n return (\n \n {intervals.map((interval, i) => {\n if (interval.intensity instanceof RangeIntensity) {\n return ;\n } else {\n return ;\n }\n })}\n \n );\n};\n","import { Duration } from \"zwiftout\";\n\nconst splitDuration = (duration: Duration) => ({\n hours: Math.floor(duration.seconds / 60 / 60),\n minutes: Math.floor(duration.seconds / 60) % 60,\n seconds: duration.seconds % 60,\n});\n\nexport const formatDuration = (duration: Duration): string => {\n const { hours, minutes, seconds } = splitDuration(duration);\n if (hours > 0) {\n return `${hours}h ${minutes}min`;\n } else if (minutes > 0) {\n return `${minutes}min`;\n } else if (seconds > 0) {\n return `${seconds}sec`;\n } else {\n return `-`;\n }\n};\n","import React from \"react\";\nimport { stats, Workout, Intensity, Duration } from \"zwiftout\";\nimport { formatDuration } from \"./formatDuration\";\nimport styled from \"styled-components\";\n\nconst formatIntensity = (intensity: Intensity): string => `${Math.round(intensity.value * 100)}%`;\n\ntype StatsProps = { label: string; value: string | number };\n\nconst StatsLine: React.FC = ({ label, value }) => (\n <>\n {label} {value}\n \n);\n\nconst StatsListItem: React.FC = (props) => (\n
  • \n \n
  • \n);\n\nconst Container = styled.div`\n display: grid;\n grid-template-columns: 1fr 3fr;\n grid-template-areas:\n \"summary zones\"\n \"xp xp \";\n border: 1px solid #bbb;\n border-radius: 10px;\n padding: 10px;\n font-size: 12px;\n background: rgba(255, 255, 255, 0.6);\n`;\nconst SummarySection = styled.section`\n grid-area: summary;\n`;\nconst ZonesSection = styled.section`\n grid-area: zones;\n`;\nconst XpSection = styled.section`\n grid-area: xp;\n`;\n\nconst Header = styled.h2`\n margin: 0;\n font-size: 14px;\n font-weight: normal;\n`;\nconst List = styled.ul`\n margin: 1m 0;\n padding: 0;\n list-style: none;\n`;\nconst ZoneList = styled(List)`\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n`;\n\nconst xpEquivalent = (xp: number, totalDuration: Duration): string => {\n const distanceInKm = Math.ceil(xp / 20);\n const durationInHours = totalDuration.seconds / 60 / 60;\n const speed = Math.round(distanceInKm / durationInHours);\n return `equivalent to riding ${distanceInKm} km at ${speed} km/h`;\n};\n\nexport const WorkoutStats: React.FC<{ workout: Workout }> = ({ workout }) => {\n const { totalDuration, averageIntensity, normalizedIntensity, tss, xp, zones } = stats(workout);\n\n return (\n \n \n
    Summary
    \n \n \n \n \n \n \n
    \n \n
    Zone distribution
    \n \n {zones.map((zone) => (\n \n ))}\n \n
    \n \n ;\n \n
    \n );\n};\n","import styled from \"styled-components\";\n\nexport const ErrorMessage = styled.p`\n color: red;\n background: #fee;\n border-radius: 10px;\n border: 2px solid red;\n padding: 5px;\n margin: 10px 0;\n`;\n","import React, { useCallback } from \"react\";\nimport Editor from \"react-simple-code-editor\";\nimport styled from \"styled-components\";\nimport { ValidationError, ZwiftoutException } from \"zwiftout\";\n\nconst highlight = (code: string): string => {\n return code\n .replace(/^(Name|Author|Description|Warmup|Rest|Interval|Cooldown|FreeRide):/gm, \"$&\")\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 = ({ value, onValueChange, error }) => {\n const highlightFn = useCallback((code: string) => highlight(error ? highlightErrorLine(code, error) : code), [error]);\n return ;\n};\n","import React from \"react\";\nimport { Workout, generateZwo } from \"zwiftout\";\nimport styled from \"styled-components\";\n\nconst Header = styled.h2`\n font-weight: normal;\n font-size: 16px;\n`;\n\nconst ZwoCode = styled.pre`\n border: 1px solid #bbb;\n border-radius: 3px;\n padding: 10px;\n`;\n\nexport const ZwoOutput: React.FC<{ workout: Workout }> = ({ workout }) => {\n return (\n
    \n
    Generated Zwift workout file (.zwo):
    \n {generateZwo(workout)}\n
    \n );\n};\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport logo from \"../logo.png\";\n\nconst Title = styled.h1`\n font-weight: normal;\n`;\n\nconst Logo = styled.img.attrs({ src: logo, width: 45, height: 45 })`\n margin-right: 0.5em;\n vertical-align: bottom;\n`;\n\nconst Beta = styled.span`\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`;\n\nexport const AppTitle: React.FC<{}> = () => (\n \n <Logo />\n Workout editor <Beta>beta</Beta>\n \n);\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nconst Text = styled.p`\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`;\n\nexport const Credits: React.FC<{}> = () => (\n \n Built by Rene Saarsoo. · Graphics inspired by What's on Zwift?\n  · Sweat provided by Zwift :-)\n \n);\n","import React, { useState, useCallback, useEffect } from \"react\";\nimport { WorkoutPlot } from \"./components/WorkoutPlot\";\nimport { WorkoutStats } from \"./components/WorkoutStats\";\nimport { parse, ParseError, ValidationError, ZwiftoutException } from \"zwiftout\";\nimport { ErrorMessage } from \"./components/ErrorMessage\";\nimport styled from \"styled-components\";\nimport { CodeEditor } from \"./components/CodeEditor\";\nimport { ZwoOutput } from \"./components/ZwoOutput\";\nimport { AppTitle } from \"./components/AppTitle\";\nimport { Credits } from \"./components/Credits\";\nimport { loadWorkout, saveWorkout } from \"./storage\";\n\nconst AppContainer = styled.div`\n max-width: 800px;\n margin: 0 auto;\n`;\n\nexport function App() {\n const [loaded, setLoaded] = useState(false);\n const [text, setText] = useState(\"\");\n const [workout, setWorkout] = useState(parse(\"\"));\n const [error, setError] = useState(undefined);\n\n const onChange = useCallback(\n (value: string) => {\n setText(value);\n try {\n setWorkout(parse(value));\n setError(undefined);\n } catch (e) {\n if (e instanceof ParseError || e instanceof ValidationError) {\n setError(e);\n } else {\n throw e;\n }\n }\n },\n [setText, setWorkout, setError],\n );\n\n useEffect(() => {\n if (loaded) {\n saveWorkout(text);\n } else {\n setLoaded(true);\n onChange(loadWorkout());\n }\n }, [text, onChange, setLoaded, loaded]);\n\n return (\n \n \n \n \n {error && {error.message}}\n \n \n \n \n );\n}\n","const defaultWorkout = `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`;\n\nexport const loadWorkout = (): string => {\n const text = localStorage.getItem(\"workout-editor-text\");\n return (!text || text.trim() === \"\") ? defaultWorkout : text;\n};\n\nexport const saveWorkout = (text: string) => localStorage.setItem(\"workout-editor-text\", text);\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport \"./index.css\";\nimport { App } from \"./App\";\n\nReactDOM.render(\n \n \n ,\n document.getElementById(\"root\"),\n);\n","module.exports = \"data:image/png;base64,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\""],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/main.d9d6cdce.chunk.js b/static/js/main.d9d6cdce.chunk.js new file mode 100644 index 0000000..73d0ec2 --- /dev/null +++ b/static/js/main.d9d6cdce.chunk.js @@ -0,0 +1,2 @@ +(this["webpackJsonpworkout-editor"]=this["webpackJsonpworkout-editor"]||[]).push([[0],{121: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(15)),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})),m={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"},h=Object(l.a)(b)(f(),(function(n){return"free"===n.zone?100:n.intensityPercentage}),(function(n){return m[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 m[n.startZone]}),(function(n){return m[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.start0?"".concat(t,"h ").concat(r,"min"):r>0?"".concat(r,"min"):a>0?"".concat(a,"sec"):"-"};function w(){var n=Object(u.a)(["\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n"]);return w=function(){return n},n}function y(){var n=Object(u.a)(["\n margin: 1m 0;\n padding: 0;\n list-style: none;\n"]);return y=function(){return n},n}function j(){var n=Object(u.a)(["\n margin: 0;\n font-size: 14px;\n font-weight: normal;\n"]);return j=function(){return n},n}function C(){var n=Object(u.a)(["\n grid-area: xp;\n"]);return C=function(){return n},n}function Q(){var n=Object(u.a)(["\n grid-area: zones;\n"]);return Q=function(){return n},n}function U(){var n=Object(u.a)(["\n grid-area: summary;\n"]);return U=function(){return n},n}function D(){var n=Object(u.a)(['\n display: grid;\n grid-template-columns: 1fr 3fr;\n grid-template-areas:\n "summary zones"\n "xp xp ";\n border: 1px solid #bbb;\n border-radius: 10px;\n padding: 10px;\n font-size: 12px;\n background: rgba(255, 255, 255, 0.6);\n']);return D=function(){return n},n}var k=function(n){return"".concat(Math.round(100*n.value),"%")},T=function(n){var e=n.label,t=n.value;return a.a.createElement(a.a.Fragment,null,a.a.createElement("strong",null,e)," ",t)},M=function(n){return a.a.createElement("li",null,a.a.createElement(T,n))},I=l.a.div(D()),X=l.a.section(U()),F=l.a.section(Q()),Y=l.a.section(C()),G=l.a.h2(j()),Z=l.a.ul(y()),L=Object(l.a)(Z)(w()),R=function(n,e){var t=Math.ceil(n/20),r=e.seconds/60/60,a=Math.round(t/r);return"equivalent to riding ".concat(t," km at ").concat(a," km/h")},K=function(n){var e=n.workout,t=Object(s.stats)(e),r=t.totalDuration,o=t.averageIntensity,c=t.normalizedIntensity,i=t.tss,u=t.xp,l=t.zones;return a.a.createElement(I,null,a.a.createElement(X,null,a.a.createElement(G,null,"Summary"),a.a.createElement(Z,null,a.a.createElement(M,{label:"Duration:",value:O(r)}),a.a.createElement(M,{label:"Average intensity:",value:k(o)}),a.a.createElement(M,{label:"Normalized intensity:",value:k(c)}),a.a.createElement(M,{label:"TSS:",value:Math.round(i)}))),a.a.createElement(F,null,a.a.createElement(G,null,"Zone distribution"),a.a.createElement(L,null,l.map((function(n){return a.a.createElement(M,{key:n.name,label:n.name,value:O(n.duration)})})))),a.a.createElement(Y,null,a.a.createElement(T,{label:"Zwift XP:",value:"".concat(u," (").concat(R(u,r),")")}),";"))};function B(){var n=Object(u.a)(["\n color: red;\n background: #fee;\n border-radius: 10px;\n border: 2px solid red;\n padding: 5px;\n margin: 10px 0;\n"]);return B=function(){return n},n}var z=l.a.p(B()),S=t(60),H=t.n(S);function J(){var n=Object(u.a)(['\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']);return J=function(){return n},n}var N=Object(l.a)(H.a).attrs({padding:10})(J()),P=function(n){var e=n.value,t=n.onValueChange,o=n.error,c=Object(r.useCallback)((function(n){return function(n){return n.replace(/^(Name|Author|Description|Warmup|Rest|Interval|Cooldown|FreeRide|Ramp):/gm,"$&").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")," :-)")},fn=function(){var n,e;return null!==(n=null!==(e=function(){if(document.location.hash)return decodeURIComponent(document.location.hash.slice(1))}())&&void 0!==e?e:function(){var n=localStorage.getItem("workout-editor-text");return n&&""!==n.trim()?n:void 0}())&&void 0!==n?n:"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"};function gn(){var n=Object(u.a)(["\n max-width: 800px;\n margin: 0 auto;\n"]);return gn=function(){return n},n}var bn=l.a.div(gn());function mn(){var n=Object(r.useState)(!1),e=Object(i.a)(n,2),t=e[0],o=e[1],c=Object(r.useState)(""),u=Object(i.a)(c,2),l=u[0],d=u[1],f=Object(r.useState)(Object(s.parse)("")),g=Object(i.a)(f,2),b=g[0],m=g[1],h=Object(r.useState)(void 0),p=Object(i.a)(h,2),v=p[0],x=p[1],O=Object(r.useCallback)((function(n){d(n);try{m(Object(s.parse)(n)),x(void 0)}catch(e){if(!(e instanceof s.ParseError||e instanceof s.ValidationError))throw e;x(e)}}),[d,m,x]);return Object(r.useEffect)((function(){t?function(n){localStorage.setItem("workout-editor-text",n)}(l):(o(!0),O(fn()))}),[l,O,o,t]),a.a.createElement(bn,null,a.a.createElement(un,null),a.a.createElement(P,{onValueChange:O,value:l,error:v}),a.a.createElement(E,{intervals:b.intervals}),v&&a.a.createElement(z,null,v.message),a.a.createElement(K,{workout:b}),a.a.createElement($,{workout:b}),a.a.createElement(dn,null))}c.a.render(a.a.createElement(a.a.StrictMode,null,a.a.createElement(mn,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(121)},67:function(n,e,t){},77:function(n,e){},79:function(n,e){}},[[62,1,2]]]); +//# sourceMappingURL=main.d9d6cdce.chunk.js.map \ No newline at end of file diff --git a/static/js/main.d9d6cdce.chunk.js.map b/static/js/main.d9d6cdce.chunk.js.map new file mode 100644 index 0000000..4b74d8e --- /dev/null +++ b/static/js/main.d9d6cdce.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","storage.ts","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","loadWorkout","document","location","hash","decodeURIComponent","slice","loadFromUrlHash","text","localStorage","getItem","trim","undefined","loadFromLocalStorage","AppContainer","App","useState","loaded","setLoaded","setText","parse","setWorkout","setError","onChange","e","ParseError","useEffect","setItem","saveWorkout","message","ReactDOM","render","StrictMode","getElementById","module","exports"],"mappings":"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","file":"static/js/main.d9d6cdce.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 display: inline-block;\n vertical-align: bottom;\n margin-right: 0.1%;\n /* exclude 0.1% margin from bar width */\n width: ${(props) => props.durationPercentage - 0.1}%;\n transition: width 0.1s, height 0.1s, background-color 0.1s;\n`;\n\nexport type BarProps = BaseBarProps & {\n // Percentage of maximum intensity in workout\n intensityPercentage: number;\n zone: ZoneType;\n};\n\nconst zoneColorsMap: Record = {\n free: \"linear-gradient(to top, rgba(204,204,204,1), rgba(255,255,255,0))\",\n Z1: \"#7f7f7f\",\n Z2: \"#338cff\",\n Z3: \"#59bf59\",\n Z4: \"#ffcc3f\",\n Z5: \"#ff6639\",\n Z6: \"#ff330c\",\n};\n\nexport const Bar = styled(BaseBar)`\n border-radius: 10px;\n height: ${(props) => (props.zone === \"free\" ? 100 : props.intensityPercentage)}%;\n background: ${(props) => zoneColorsMap[props.zone]};\n`;\n\nexport type RangeBarProps = BaseBarProps & {\n // Percentage of maximum intensity in workout\n maxIntensityPercentage: number;\n // Percentage relative to `maxIntensityPercentage`\n relativeMinIntensityPercentage: number;\n startZone: ZoneType;\n endZone: ZoneType;\n direction: \"up\" | \"down\";\n};\n\nconst createUpPolygon = (middle: number) => `polygon(0% 100%, 100% 100%, 100% 0%, 0% ${middle}%)`;\nconst createDownPolygon = (middle: number) => `polygon(0% 0%, 0% 100%, 100% 100%, 100% ${middle}%)`;\n\nexport const RangeBar = styled(BaseBar)`\n border-bottom-left-radius: 10px;\n border-bottom-right-radius: 10px;\n height: ${(props) => props.maxIntensityPercentage}%;\n clip-path: ${({ direction, relativeMinIntensityPercentage }) =>\n direction === \"up\"\n ? createUpPolygon(relativeMinIntensityPercentage)\n : createDownPolygon(relativeMinIntensityPercentage)};\n background: linear-gradient(\n to right,\n ${(props) => zoneColorsMap[props.startZone]},\n ${(props) => zoneColorsMap[props.endZone]}\n );\n`;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport {\n Interval,\n Intensity,\n Duration,\n totalDuration,\n maximumIntensity,\n RangeIntensity,\n intensityValueToZoneType,\n} from \"zwiftout\";\nimport { BarProps, Bar, RangeBar, RangeBarProps } from \"./Bar\";\n\nconst Plot = styled.div`\n white-space: nowrap;\n overflow: hidden;\n height: 200px;\n border-radius: 5px;\n padding: 5px;\n margin: 10px 0;\n`;\n\nconst toBarProps = (interval: Interval, workoutDuration: Duration, maxIntensity: Intensity): BarProps => ({\n zone: interval.intensity.zone,\n durationPercentage: (interval.duration.seconds / workoutDuration.seconds) * 100,\n intensityPercentage: (interval.intensity.value / maxIntensity.value) * 100,\n});\n\nconst toRangeBarProps = (interval: Interval, workoutDuration: Duration, maxIntensity: Intensity): RangeBarProps => {\n const minIntensityPercentage =\n (Math.min(interval.intensity.start, interval.intensity.end) / maxIntensity.value) * 100;\n const maxIntensityPercentage =\n (Math.max(interval.intensity.start, interval.intensity.end) / maxIntensity.value) * 100;\n\n return {\n durationPercentage: (interval.duration.seconds / workoutDuration.seconds) * 100,\n maxIntensityPercentage: maxIntensityPercentage,\n relativeMinIntensityPercentage: 100 - (minIntensityPercentage / maxIntensityPercentage) * 100,\n direction: interval.intensity.start < interval.intensity.end ? \"up\" : \"down\",\n startZone: intensityValueToZoneType(interval.intensity.start),\n endZone: intensityValueToZoneType(interval.intensity.end),\n };\n};\n\nexport const WorkoutPlot: React.FC<{ intervals: Interval[] }> = ({ intervals }) => {\n const workoutDuration = totalDuration(intervals);\n const maxIntensity = maximumIntensity(intervals);\n\n return (\n \n {intervals.map((interval, i) => {\n if (interval.intensity instanceof RangeIntensity) {\n return ;\n } else {\n return ;\n }\n })}\n \n );\n};\n","import { Duration } from \"zwiftout\";\n\nconst splitDuration = (duration: Duration) => ({\n hours: Math.floor(duration.seconds / 60 / 60),\n minutes: Math.floor(duration.seconds / 60) % 60,\n seconds: duration.seconds % 60,\n});\n\nexport const formatDuration = (duration: Duration): string => {\n const { hours, minutes, seconds } = splitDuration(duration);\n if (hours > 0) {\n return `${hours}h ${minutes}min`;\n } else if (minutes > 0) {\n return `${minutes}min`;\n } else if (seconds > 0) {\n return `${seconds}sec`;\n } else {\n return `-`;\n }\n};\n","import React from \"react\";\nimport { stats, Workout, Intensity, Duration } from \"zwiftout\";\nimport { formatDuration } from \"./formatDuration\";\nimport styled from \"styled-components\";\n\nconst formatIntensity = (intensity: Intensity): string => `${Math.round(intensity.value * 100)}%`;\n\ntype StatsProps = { label: string; value: string | number };\n\nconst StatsLine: React.FC = ({ label, value }) => (\n <>\n {label} {value}\n \n);\n\nconst StatsListItem: React.FC = (props) => (\n
  • \n \n
  • \n);\n\nconst Container = styled.div`\n display: grid;\n grid-template-columns: 1fr 3fr;\n grid-template-areas:\n \"summary zones\"\n \"xp xp \";\n border: 1px solid #bbb;\n border-radius: 10px;\n padding: 10px;\n font-size: 12px;\n background: rgba(255, 255, 255, 0.6);\n`;\nconst SummarySection = styled.section`\n grid-area: summary;\n`;\nconst ZonesSection = styled.section`\n grid-area: zones;\n`;\nconst XpSection = styled.section`\n grid-area: xp;\n`;\n\nconst Header = styled.h2`\n margin: 0;\n font-size: 14px;\n font-weight: normal;\n`;\nconst List = styled.ul`\n margin: 1m 0;\n padding: 0;\n list-style: none;\n`;\nconst ZoneList = styled(List)`\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n`;\n\nconst xpEquivalent = (xp: number, totalDuration: Duration): string => {\n const distanceInKm = Math.ceil(xp / 20);\n const durationInHours = totalDuration.seconds / 60 / 60;\n const speed = Math.round(distanceInKm / durationInHours);\n return `equivalent to riding ${distanceInKm} km at ${speed} km/h`;\n};\n\nexport const WorkoutStats: React.FC<{ workout: Workout }> = ({ workout }) => {\n const { totalDuration, averageIntensity, normalizedIntensity, tss, xp, zones } = stats(workout);\n\n return (\n \n \n
    Summary
    \n \n \n \n \n \n \n
    \n \n
    Zone distribution
    \n \n {zones.map((zone) => (\n \n ))}\n \n
    \n \n ;\n \n
    \n );\n};\n","import styled from \"styled-components\";\n\nexport const ErrorMessage = styled.p`\n color: red;\n background: #fee;\n border-radius: 10px;\n border: 2px solid red;\n padding: 5px;\n margin: 10px 0;\n`;\n","import React, { useCallback } from \"react\";\nimport Editor from \"react-simple-code-editor\";\nimport styled from \"styled-components\";\nimport { ValidationError, ZwiftoutException } from \"zwiftout\";\n\nconst highlight = (code: string): string => {\n return code\n .replace(\n /^(Name|Author|Description|Warmup|Rest|Interval|Cooldown|FreeRide|Ramp):/gm,\n \"$&\",\n )\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 = ({ value, onValueChange, error }) => {\n const highlightFn = useCallback((code: string) => highlight(error ? highlightErrorLine(code, error) : code), [error]);\n return ;\n};\n","import React from \"react\";\nimport { Workout, generateZwo } from \"zwiftout\";\nimport styled from \"styled-components\";\n\nconst Header = styled.h2`\n font-weight: normal;\n font-size: 16px;\n`;\n\nconst ZwoCode = styled.pre`\n border: 1px solid #bbb;\n border-radius: 3px;\n padding: 10px;\n`;\n\nexport const ZwoOutput: React.FC<{ workout: Workout }> = ({ workout }) => {\n return (\n
    \n
    Generated Zwift workout file (.zwo):
    \n {generateZwo(workout)}\n
    \n );\n};\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport logo from \"../logo.png\";\n\nconst Title = styled.h1`\n font-weight: normal;\n`;\n\nconst Logo = styled.img.attrs({ src: logo, width: 45, height: 45 })`\n margin-right: 0.5em;\n vertical-align: bottom;\n`;\n\nconst Beta = styled.span`\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`;\n\nexport const AppTitle: React.FC<{}> = () => (\n \n <Logo />\n Workout editor <Beta>beta</Beta>\n \n);\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nconst Text = styled.p`\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`;\n\nexport const Credits: React.FC<{}> = () => (\n \n Built by Rene Saarsoo. · Graphics inspired by What's on Zwift?\n  · Sweat provided by Zwift :-)\n \n);\n","const defaultWorkout = `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`;\n\nconst loadFromUrlHash = (): string | undefined => {\n if (document.location.hash) {\n // Skip the leading '#' when decoding\n return decodeURIComponent(document.location.hash.slice(1));\n }\n return undefined;\n};\n\nconst loadFromLocalStorage = (): string | undefined => {\n const text = localStorage.getItem(\"workout-editor-text\");\n return !text || text.trim() === \"\" ? undefined : text;\n};\n\nexport const loadWorkout = (): string => {\n return loadFromUrlHash() ?? loadFromLocalStorage() ?? defaultWorkout;\n};\n\nexport const saveWorkout = (text: string) => localStorage.setItem(\"workout-editor-text\", text);\n","import React, { useState, useCallback, useEffect } from \"react\";\nimport { WorkoutPlot } from \"./components/WorkoutPlot\";\nimport { WorkoutStats } from \"./components/WorkoutStats\";\nimport { parse, ParseError, ValidationError, ZwiftoutException } from \"zwiftout\";\nimport { ErrorMessage } from \"./components/ErrorMessage\";\nimport styled from \"styled-components\";\nimport { CodeEditor } from \"./components/CodeEditor\";\nimport { ZwoOutput } from \"./components/ZwoOutput\";\nimport { AppTitle } from \"./components/AppTitle\";\nimport { Credits } from \"./components/Credits\";\nimport { loadWorkout, saveWorkout } from \"./storage\";\n\nconst AppContainer = styled.div`\n max-width: 800px;\n margin: 0 auto;\n`;\n\nexport function App() {\n const [loaded, setLoaded] = useState(false);\n const [text, setText] = useState(\"\");\n const [workout, setWorkout] = useState(parse(\"\"));\n const [error, setError] = useState(undefined);\n\n const onChange = useCallback(\n (value: string) => {\n setText(value);\n try {\n setWorkout(parse(value));\n setError(undefined);\n } catch (e) {\n if (e instanceof ParseError || e instanceof ValidationError) {\n setError(e);\n } else {\n throw e;\n }\n }\n },\n [setText, setWorkout, setError],\n );\n\n useEffect(() => {\n if (loaded) {\n saveWorkout(text);\n } else {\n setLoaded(true);\n onChange(loadWorkout());\n }\n }, [text, onChange, setLoaded, loaded]);\n\n return (\n \n \n \n \n {error && {error.message}}\n \n \n \n \n );\n}\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport \"./index.css\";\nimport { App } from \"./App\";\n\nReactDOM.render(\n \n \n ,\n document.getElementById(\"root\"),\n);\n","module.exports = \"data:image/png;base64,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\""],"sourceRoot":""} \ No newline at end of file