@epic-web/workshop-app 4.22.4 → 4.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/build/client/assets/_-BtebIQXw.js +2 -0
  2. package/build/client/assets/{_-DbrWZazo.js.map → _-BtebIQXw.js.map} +1 -1
  3. package/build/client/assets/_exerciseNumber-DPHRlskl.js +2 -0
  4. package/build/client/assets/{_exerciseNumber-CpcJsfoV.js.map → _exerciseNumber-DPHRlskl.js.map} +1 -1
  5. package/build/client/assets/_exerciseNumber_._stepNumber-D1CLZqv3.js +2 -0
  6. package/build/client/assets/{_exerciseNumber_._stepNumber-B5pmJ29o.js.map → _exerciseNumber_._stepNumber-D1CLZqv3.js.map} +1 -1
  7. package/build/client/assets/_exerciseNumber_.finished-BtU0LxSx.js +2 -0
  8. package/build/client/assets/{_exerciseNumber_.finished-Ddb3J5ls.js.map → _exerciseNumber_.finished-BtU0LxSx.js.map} +1 -1
  9. package/build/client/assets/_layout-D2SdN9lJ.js +2 -0
  10. package/build/client/assets/{_layout-CGLKLU3y.js.map → _layout-D2SdN9lJ.js.map} +1 -1
  11. package/build/client/assets/_layout-D9AYVDws.js +2 -0
  12. package/build/client/assets/_layout-D9AYVDws.js.map +1 -0
  13. package/build/client/assets/_layout-DN2lWivk.js +6 -0
  14. package/build/client/assets/_layout-DN2lWivk.js.map +1 -0
  15. package/build/client/assets/accordion-BTylpyuo.js +2 -0
  16. package/build/client/assets/{accordion-BroSqIct.js.map → accordion-BTylpyuo.js.map} +1 -1
  17. package/build/client/assets/account-Boc55rcF.js +2 -0
  18. package/build/client/assets/{account-7o6O4ruO.js.map → account-Boc55rcF.js.map} +1 -1
  19. package/build/client/assets/app-D21SF96g.js +2 -0
  20. package/build/client/assets/{app-BhrXo-z3.js.map → app-D21SF96g.js.map} +1 -1
  21. package/build/client/assets/{button-BklqyTPS.js → button-D3GGLffs.js} +2 -2
  22. package/build/client/assets/{button-BklqyTPS.js.map → button-D3GGLffs.js.map} +1 -1
  23. package/build/client/assets/diff-Dlhnb9s0.js +2 -0
  24. package/build/client/assets/{diff-Cr4LLBag.js.map → diff-Dlhnb9s0.js.map} +1 -1
  25. package/build/client/assets/diff-_Yp5qaGd.js +2 -0
  26. package/build/client/assets/{diff-BNr0PhFR.js.map → diff-_Yp5qaGd.js.map} +1 -1
  27. package/build/client/assets/discord-BZFQqiA1.js +2 -0
  28. package/build/client/assets/discord-BZFQqiA1.js.map +1 -0
  29. package/build/client/assets/{discord-Dq4e30wV.js → discord-ClGJ4reK.js} +2 -2
  30. package/build/client/assets/{discord-Dq4e30wV.js.map → discord-ClGJ4reK.js.map} +1 -1
  31. package/build/client/assets/{epic-video-CxZy3iqK.js → epic-video-BDMU5eQx.js} +96 -96
  32. package/build/client/assets/{epic-video-CxZy3iqK.js.map → epic-video-BDMU5eQx.js.map} +1 -1
  33. package/build/client/assets/{error-boundary-DDTvdkB4.js → error-boundary-w-YmME9H.js} +2 -2
  34. package/build/client/assets/{error-boundary-DDTvdkB4.js.map → error-boundary-w-YmME9H.js.map} +1 -1
  35. package/build/client/assets/finished-DpVgSUHh.js +2 -0
  36. package/build/client/assets/{finished-CU8QBU41.js.map → finished-DpVgSUHh.js.map} +1 -1
  37. package/build/client/assets/icons-CnZJXICl.svg +544 -0
  38. package/build/client/assets/index-4mfbmNml.js +2 -0
  39. package/build/client/assets/{index-BotyhhDm.js.map → index-4mfbmNml.js.map} +1 -1
  40. package/build/client/assets/index-BMMmOqxO.js +2 -0
  41. package/build/client/assets/{index-c5oITeyN.js.map → index-BMMmOqxO.js.map} +1 -1
  42. package/build/client/assets/{index-BXWoOGxB.js → index-Cr2THg3v.js} +2 -2
  43. package/build/client/assets/{index-BXWoOGxB.js.map → index-Cr2THg3v.js.map} +1 -1
  44. package/build/client/assets/{index-hogig2HK.js → index-CrCyg109.js} +2 -2
  45. package/build/client/assets/{index-hogig2HK.js.map → index-CrCyg109.js.map} +1 -1
  46. package/build/client/assets/index-lG6dAghh.js +36 -0
  47. package/build/client/assets/index-lG6dAghh.js.map +1 -0
  48. package/build/client/assets/loading-CYX0lUnA.js +2 -0
  49. package/build/client/assets/{loading-C5uX0jJw.js.map → loading-CYX0lUnA.js.map} +1 -1
  50. package/build/client/assets/login-BfJnysK5.js +2 -0
  51. package/build/client/assets/login-BfJnysK5.js.map +1 -0
  52. package/build/client/assets/manifest-d74ec995.js +1 -0
  53. package/build/client/assets/mdx-DGrucPXJ.js +2 -0
  54. package/build/client/assets/{mdx-D7ttfz2V.js.map → mdx-DGrucPXJ.js.map} +1 -1
  55. package/build/client/assets/misc-BvHlNnqL.js +2 -0
  56. package/build/client/assets/misc-BvHlNnqL.js.map +1 -0
  57. package/build/client/assets/{nav-chevrons-B82nbdyj.js → nav-chevrons-DNlM2M58.js} +2 -2
  58. package/build/client/assets/{nav-chevrons-B82nbdyj.js.map → nav-chevrons-DNlM2M58.js.map} +1 -1
  59. package/build/client/assets/onboarding-C9YKrBRk.js +2 -0
  60. package/build/client/assets/{onboarding-Co4cldZ0.js.map → onboarding-C9YKrBRk.js.map} +1 -1
  61. package/build/client/assets/preview-cQAZ1sWw.js +2 -0
  62. package/build/client/assets/{preview-CdiZ0d0L.js.map → preview-cQAZ1sWw.js.map} +1 -1
  63. package/build/client/assets/product-BUD74Itn.js +2 -0
  64. package/build/client/assets/product-BUD74Itn.js.map +1 -0
  65. package/build/client/assets/{progress-Biq-ngNF.js → progress-Dn5gs-vs.js} +2 -2
  66. package/build/client/assets/{progress-Biq-ngNF.js.map → progress-Dn5gs-vs.js.map} +1 -1
  67. package/build/client/assets/{progress-bar-CSvo1ZXP.js → progress-bar-C7Wl3UWv.js} +2 -2
  68. package/build/client/assets/{progress-bar-CSvo1ZXP.js.map → progress-bar-C7Wl3UWv.js.map} +1 -1
  69. package/build/client/assets/{root-D_FY953d.js → root-BO8-KppB.js} +6 -6
  70. package/build/client/assets/{root-D_FY953d.js.map → root-BO8-KppB.js.map} +1 -1
  71. package/build/client/assets/set-playground-CCm119Nm.js +2 -0
  72. package/build/client/assets/{set-playground-BXHckvUG.js.map → set-playground-CCm119Nm.js.map} +1 -1
  73. package/build/client/assets/test-CPv5Bgs_.js +2 -0
  74. package/build/client/assets/{test-BRkbo9G9.js.map → test-CPv5Bgs_.js.map} +1 -1
  75. package/build/client/assets/{tests-DQuoxpDA.js → tests-DCK6NqSg.js} +2 -2
  76. package/build/client/assets/{tests-DQuoxpDA.js.map → tests-DCK6NqSg.js.map} +1 -1
  77. package/build/client/assets/{tooltip-BiHTe_7F.js → tooltip-fa2eC7LQ.js} +2 -2
  78. package/build/client/assets/{tooltip-BiHTe_7F.js.map → tooltip-fa2eC7LQ.js.map} +1 -1
  79. package/build/client/assets/workshop-config-CL4F08kr.js +2 -0
  80. package/build/client/assets/workshop-config-CL4F08kr.js.map +1 -0
  81. package/build/client/logo.svg +48 -0
  82. package/build/server/index.js +180 -99
  83. package/build/server/index.js.map +1 -1
  84. package/package.json +3 -3
  85. package/build/client/assets/_-DbrWZazo.js +0 -2
  86. package/build/client/assets/_exerciseNumber-CpcJsfoV.js +0 -2
  87. package/build/client/assets/_exerciseNumber_._stepNumber-B5pmJ29o.js +0 -2
  88. package/build/client/assets/_exerciseNumber_.finished-Ddb3J5ls.js +0 -2
  89. package/build/client/assets/_layout-BLsKV5zF.js +0 -6
  90. package/build/client/assets/_layout-BLsKV5zF.js.map +0 -1
  91. package/build/client/assets/_layout-CGLKLU3y.js +0 -2
  92. package/build/client/assets/_layout-DVR5FOsb.js +0 -2
  93. package/build/client/assets/_layout-DVR5FOsb.js.map +0 -1
  94. package/build/client/assets/accordion-BroSqIct.js +0 -2
  95. package/build/client/assets/account-7o6O4ruO.js +0 -2
  96. package/build/client/assets/app-BhrXo-z3.js +0 -2
  97. package/build/client/assets/client-hints-DNUUFGmB.js +0 -36
  98. package/build/client/assets/client-hints-DNUUFGmB.js.map +0 -1
  99. package/build/client/assets/clsx-B-dksMZM.js +0 -2
  100. package/build/client/assets/clsx-B-dksMZM.js.map +0 -1
  101. package/build/client/assets/diff-BNr0PhFR.js +0 -2
  102. package/build/client/assets/diff-Cr4LLBag.js +0 -2
  103. package/build/client/assets/discord-CHP4_JLJ.js +0 -2
  104. package/build/client/assets/discord-CHP4_JLJ.js.map +0 -1
  105. package/build/client/assets/finished-CU8QBU41.js +0 -2
  106. package/build/client/assets/index-6GyYWV9G.js +0 -2
  107. package/build/client/assets/index-6GyYWV9G.js.map +0 -1
  108. package/build/client/assets/index-BotyhhDm.js +0 -2
  109. package/build/client/assets/index-c5oITeyN.js +0 -2
  110. package/build/client/assets/loading-C5uX0jJw.js +0 -2
  111. package/build/client/assets/login-4cvVFzF8.js +0 -2
  112. package/build/client/assets/login-4cvVFzF8.js.map +0 -1
  113. package/build/client/assets/manifest-da85ee1f.js +0 -1
  114. package/build/client/assets/mdx-D7ttfz2V.js +0 -2
  115. package/build/client/assets/misc-ENVX3CWf.js +0 -2
  116. package/build/client/assets/misc-ENVX3CWf.js.map +0 -1
  117. package/build/client/assets/onboarding-Co4cldZ0.js +0 -2
  118. package/build/client/assets/preview-CdiZ0d0L.js +0 -2
  119. package/build/client/assets/set-playground-BXHckvUG.js +0 -2
  120. package/build/client/assets/test-BRkbo9G9.js +0 -2
  121. package/build/client/icons.svg +0 -529
@@ -1,2 +1,2 @@
1
- import{a as i,b as a,j as o,i as c}from"./index-1cKOJFpX.js";import{g as m}from"./misc-ENVX3CWf.js";function f({defaultStatusHandler:s=({error:r})=>o.jsxs("p",{children:[r.status," ",r.data]}),statusHandlers:e,unexpectedErrorHandler:t=r=>o.jsx("p",{children:m(r)})}){const r=i(),n=a();return typeof document<"u"&&console.error(r),o.jsx("div",{className:"container flex items-center justify-center p-20 text-h2",children:c(r)?((e==null?void 0:e[r.status])??s)({error:r,params:n}):t(r)})}export{f as G};
2
- //# sourceMappingURL=error-boundary-DDTvdkB4.js.map
1
+ import{a as i,b as a,j as o,i as c}from"./index-1cKOJFpX.js";import{g as m}from"./misc-BvHlNnqL.js";function f({defaultStatusHandler:s=({error:r})=>o.jsxs("p",{children:[r.status," ",r.data]}),statusHandlers:e,unexpectedErrorHandler:t=r=>o.jsx("p",{children:m(r)})}){const r=i(),n=a();return typeof document<"u"&&console.error(r),o.jsx("div",{className:"container flex items-center justify-center p-20 text-h2",children:c(r)?((e==null?void 0:e[r.status])??s)({error:r,params:n}):t(r)})}export{f as G};
2
+ //# sourceMappingURL=error-boundary-w-YmME9H.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"error-boundary-DDTvdkB4.js","sources":["../../../app/components/error-boundary.tsx"],"sourcesContent":["import {\n\tisRouteErrorResponse,\n\tuseParams,\n\tuseRouteError,\n\ttype ErrorResponse,\n} from '@remix-run/react'\nimport { getErrorMessage } from '#app/utils/misc.tsx'\n\ntype StatusHandler = (info: {\n\terror: ErrorResponse\n\tparams: Record<string, string | undefined>\n}) => React.ReactNode | null\n\nexport function GeneralErrorBoundary({\n\tdefaultStatusHandler = ({ error }) => (\n\t\t<p>\n\t\t\t{error.status} {error.data}\n\t\t</p>\n\t),\n\tstatusHandlers,\n\tunexpectedErrorHandler = (error) => <p>{getErrorMessage(error)}</p>,\n}: {\n\tdefaultStatusHandler?: StatusHandler\n\tstatusHandlers?: Record<number, StatusHandler>\n\tunexpectedErrorHandler?: (error: unknown) => React.ReactNode | null\n}) {\n\tconst error = useRouteError()\n\tconst params = useParams()\n\n\tif (typeof document !== 'undefined') {\n\t\tconsole.error(error)\n\t}\n\n\treturn (\n\t\t<div className=\"container flex items-center justify-center p-20 text-h2\">\n\t\t\t{isRouteErrorResponse(error)\n\t\t\t\t? (statusHandlers?.[error.status] ?? defaultStatusHandler)({\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tparams,\n\t\t\t\t\t})\n\t\t\t\t: unexpectedErrorHandler(error)}\n\t\t</div>\n\t)\n}\n"],"names":["GeneralErrorBoundary","defaultStatusHandler","error","statusHandlers","unexpectedErrorHandler","getErrorMessage","useRouteError","params","useParams","jsx","isRouteErrorResponse"],"mappings":"oGAaO,SAASA,EAAqB,CACpC,qBAAAC,EAAuB,CAAC,CAAE,MAAAC,CAAM,WAC9B,IACC,CAAA,SAAA,CAAMA,EAAA,OAAO,IAAEA,EAAM,IAAA,EACvB,EAED,eAAAC,EACA,uBAAAC,EAA0BF,SAAW,IAAG,CAAA,SAAAG,EAAgBH,CAAK,EAAE,CAChE,EAIG,CACF,MAAMA,EAAQI,IACRC,EAASC,IAEX,OAAA,OAAO,SAAa,KACvB,QAAQ,MAAMN,CAAK,EAInBO,EAAA,IAAC,MAAI,CAAA,UAAU,0DACb,SAAAC,EAAqBR,CAAK,IACvBC,GAAA,YAAAA,EAAiBD,EAAM,UAAWD,GAAsB,CACzD,MAAAC,EACA,OAAAK,CACA,CAAA,EACAH,EAAuBF,CAAK,CAChC,CAAA,CAEF"}
1
+ {"version":3,"file":"error-boundary-w-YmME9H.js","sources":["../../../app/components/error-boundary.tsx"],"sourcesContent":["import {\n\tisRouteErrorResponse,\n\tuseParams,\n\tuseRouteError,\n\ttype ErrorResponse,\n} from '@remix-run/react'\nimport { getErrorMessage } from '#app/utils/misc.tsx'\n\ntype StatusHandler = (info: {\n\terror: ErrorResponse\n\tparams: Record<string, string | undefined>\n}) => React.ReactNode | null\n\nexport function GeneralErrorBoundary({\n\tdefaultStatusHandler = ({ error }) => (\n\t\t<p>\n\t\t\t{error.status} {error.data}\n\t\t</p>\n\t),\n\tstatusHandlers,\n\tunexpectedErrorHandler = (error) => <p>{getErrorMessage(error)}</p>,\n}: {\n\tdefaultStatusHandler?: StatusHandler\n\tstatusHandlers?: Record<number, StatusHandler>\n\tunexpectedErrorHandler?: (error: unknown) => React.ReactNode | null\n}) {\n\tconst error = useRouteError()\n\tconst params = useParams()\n\n\tif (typeof document !== 'undefined') {\n\t\tconsole.error(error)\n\t}\n\n\treturn (\n\t\t<div className=\"container flex items-center justify-center p-20 text-h2\">\n\t\t\t{isRouteErrorResponse(error)\n\t\t\t\t? (statusHandlers?.[error.status] ?? defaultStatusHandler)({\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tparams,\n\t\t\t\t\t})\n\t\t\t\t: unexpectedErrorHandler(error)}\n\t\t</div>\n\t)\n}\n"],"names":["GeneralErrorBoundary","defaultStatusHandler","error","statusHandlers","unexpectedErrorHandler","getErrorMessage","useRouteError","params","useParams","jsx","isRouteErrorResponse"],"mappings":"oGAaO,SAASA,EAAqB,CACpC,qBAAAC,EAAuB,CAAC,CAAE,MAAAC,CAAM,WAC9B,IACC,CAAA,SAAA,CAAMA,EAAA,OAAO,IAAEA,EAAM,IAAA,EACvB,EAED,eAAAC,EACA,uBAAAC,EAA0BF,SAAW,IAAG,CAAA,SAAAG,EAAgBH,CAAK,EAAE,CAChE,EAIG,CACF,MAAMA,EAAQI,IACRC,EAASC,IAEX,OAAA,OAAO,SAAa,KACvB,QAAQ,MAAMN,CAAK,EAInBO,EAAA,IAAC,MAAI,CAAA,UAAU,0DACb,SAAAC,EAAqBR,CAAK,IACvBC,GAAA,YAAAA,EAAiBD,EAAM,UAAWD,GAAsB,CACzD,MAAAC,EACA,OAAAK,CACA,CAAA,EACAH,EAAuBF,CAAK,CAChC,CAAA,CAEF"}
@@ -0,0 +1,2 @@
1
+ import{j as e,r as t}from"./index-1cKOJFpX.js";import{E as l}from"./index-Dx5GmdYq.js";import{E as n}from"./epic-video-BDMU5eQx.js";import{L as a}from"./loading-CYX0lUnA.js";import{N as d}from"./nav-chevrons-DNlM2M58.js";import{M as c,E as m}from"./mdx-DGrucPXJ.js";import{a as p}from"./misc-BvHlNnqL.js";import{g as f}from"./seo-pBpFCWsy.js";import{P as h}from"./progress-Dn5gs-vs.js";import{u as x,L as u}from"./components-CME-nGId.js";import"./index-lG6dAghh.js";import"./request-info-CEhUGODY.js";import"./tooltip-fa2eC7LQ.js";import"./pe-CUZaIcdt.js";import"./user-D6tTg1yS.js";import"./workshop-config-CL4F08kr.js";import"./progress-bar-C7Wl3UWv.js";const q={getSitemapEntries:()=>[{route:"/finished"}]},R=({matches:s})=>{var o;const r=(o=s.find(i=>i.id==="root"))==null?void 0:o.data;return r?f({title:`🎉 ${r==null?void 0:r.workshopTitle}`,description:`Elaboration for ${r==null?void 0:r.workshopTitle}`,ogTitle:`Finished ${r==null?void 0:r.workshopTitle}`,ogDescription:"You finished! Time to submit feedback.",instructor:r.instructor,requestInfo:r.requestInfo}):[]},j={h1:()=>null};function U(){const s=x();return e.jsx("div",{className:"flex h-full flex-grow flex-col",children:e.jsxs("main",{className:"grid h-full flex-grow grid-cols-1 grid-rows-2 lg:grid-cols-2 lg:grid-rows-1",children:[e.jsxs("div",{className:"relative col-span-1 row-span-1 flex h-full flex-col lg:border-r",children:[e.jsx("h1",{className:"h-14 border-b pl-10 pr-5 text-sm font-medium uppercase leading-none",children:e.jsx("div",{className:"flex h-14 flex-wrap items-center justify-between gap-x-2 py-2",children:e.jsxs("div",{className:"flex items-center justify-start gap-x-2",children:[e.jsx(u,{to:"/",className:"hover:underline",children:s.workshopTitle}),e.jsx("span",{children:"/"}),e.jsx("span",{children:"Elaboration"})]})})}),e.jsx("article",{className:"shadow-on-scrollbox h-full w-full max-w-none flex-1 scroll-pt-6 space-y-6 overflow-y-auto p-2 scrollbar-thin scrollbar-thumb-scrollbar sm:p-10 sm:pt-8",id:s.articleId,children:s.finishedCode?e.jsx(n,{epicVideoInfosPromise:s.epicVideoInfosPromise,children:e.jsx("div",{className:"prose dark:prose-invert sm:prose-lg",children:e.jsx(c,{code:s.finishedCode,components:j})})}):"No finished instructions yet..."}),e.jsx(l,{elementQuery:`#${s.articleId}`}),e.jsx(h,{type:"workshop-finished",className:"h-14 border-t px-6"}),e.jsxs("div",{className:"flex h-16 justify-between border-b-4 border-t lg:border-b-0",children:[e.jsx("div",{}),s.workshopFinished.status==="success"?e.jsx(m,{file:s.workshopFinished.file,relativePath:s.workshopFinished.relativePath}):null,e.jsx(d,{prev:s.prevStepLink,next:{to:"/"}})]})]}),e.jsx(b,{workshopTitle:s.workshopTitle,workshopFormEmbedUrl:s.workshopFormEmbedUrl})]})})}function b({workshopTitle:s,workshopFormEmbedUrl:r}){const[o,i]=t.useState(!1);return e.jsxs("div",{className:"relative flex-shrink-0",children:[o?null:e.jsx("div",{className:"absolute inset-0 z-10 flex items-center justify-center",children:e.jsx(a,{children:e.jsxs("span",{children:["Loading ",s," Elaboration form"]})})}),e.jsx("iframe",{onLoad:()=>i(!0),onError:()=>i(!0),title:"Elaboration",src:r,className:p("absolute inset-0 flex h-full w-full transition-opacity duration-300",o?"opacity-100":"opacity-0")})]})}export{U as default,q as handle,R as meta};
2
+ //# sourceMappingURL=finished-DpVgSUHh.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"finished-CU8QBU41.js","sources":["../../../app/routes/_app+/finished.tsx"],"sourcesContent":["import { ElementScrollRestoration } from '@epic-web/restore-scroll'\nimport {\n\tgetExercises,\n\tgetWorkshopFinished,\n} from '@epic-web/workshop-utils/apps.server'\nimport { getWorkshopConfig } from '@epic-web/workshop-utils/config.server'\nimport {\n\tcombineServerTimings,\n\tgetServerTimeHeader,\n\tmakeTimings,\n\ttime,\n} from '@epic-web/workshop-utils/timing.server'\nimport { type SEOHandle } from '@nasa-gcn/remix-seo'\nimport {\n\tdefer,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n\ttype MetaFunction,\n} from '@remix-run/node'\nimport { Link, useLoaderData } from '@remix-run/react'\nimport slugify from '@sindresorhus/slugify'\nimport * as React from 'react'\nimport { EpicVideoInfoProvider } from '#app/components/epic-video.tsx'\nimport { Loading } from '#app/components/loading.tsx'\nimport { NavChevrons } from '#app/components/nav-chevrons.tsx'\nimport { type loader as rootLoader } from '#app/root.tsx'\nimport { getEpicVideoInfos } from '#app/utils/epic-api.ts'\nimport { Mdx } from '#app/utils/mdx.tsx'\nimport { cn } from '#app/utils/misc.tsx'\nimport { getSeoMetaTags } from '#app/utils/seo.js'\nimport { EditFileOnGitHub } from '../launch-editor.tsx'\nimport { ProgressToggle } from '../progress.tsx'\n\nexport const handle: SEOHandle = {\n\tgetSitemapEntries: () => [{ route: '/finished' }],\n}\n\nexport const meta: MetaFunction<typeof loader, { root: typeof rootLoader }> = ({\n\tmatches,\n}) => {\n\tconst rootData = matches.find((m) => m.id === 'root')?.data\n\tif (!rootData) return []\n\n\treturn getSeoMetaTags({\n\t\ttitle: `🎉 ${rootData?.workshopTitle}`,\n\t\tdescription: `Elaboration for ${rootData?.workshopTitle}`,\n\t\togTitle: `Finished ${rootData?.workshopTitle}`,\n\t\togDescription: `You finished! Time to submit feedback.`,\n\t\tinstructor: rootData.instructor,\n\t\trequestInfo: rootData.requestInfo,\n\t})\n}\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('finishedLoader')\n\tconst exercises = await getExercises({ request, timings })\n\tconst compiledFinished = await time(() => getWorkshopFinished({ request }), {\n\t\ttimings,\n\t\ttype: 'compileMdx',\n\t\tdesc: 'compileMdx in finished',\n\t})\n\n\tconst lastExercises = exercises[exercises.length - 1]\n\tconst workshopConfig = getWorkshopConfig()\n\tconst workshopTitle = workshopConfig.title\n\tconst workshopFormTemplate = workshopConfig.forms.workshop\n\tconst workshopFormEmbedUrl = workshopFormTemplate.replace(\n\t\t'{workshopTitle}',\n\t\tencodeURIComponent(workshopTitle),\n\t)\n\treturn defer(\n\t\t{\n\t\t\tarticleId: `workshop-${slugify(workshopTitle)}-finished`,\n\t\t\tworkshopTitle,\n\t\t\tworkshopFormEmbedUrl,\n\t\t\tfinishedCode:\n\t\t\t\tcompiledFinished.compiled.status === 'success'\n\t\t\t\t\t? compiledFinished.compiled.code\n\t\t\t\t\t: null,\n\t\t\tepicVideoInfosPromise:\n\t\t\t\tcompiledFinished.compiled.status === 'success'\n\t\t\t\t\t? getEpicVideoInfos(compiledFinished.compiled.epicVideoEmbeds, {\n\t\t\t\t\t\t\trequest,\n\t\t\t\t\t\t})\n\t\t\t\t\t: null,\n\t\t\tworkshopFinished: {\n\t\t\t\tstatus: compiledFinished.compiled.status,\n\t\t\t\tfile: compiledFinished.file,\n\t\t\t\trelativePath: compiledFinished.relativePath,\n\t\t\t},\n\t\t\tprevStepLink: lastExercises\n\t\t\t\t? {\n\t\t\t\t\t\tto: `/${lastExercises.exerciseNumber}/finished`,\n\t\t\t\t\t}\n\t\t\t\t: null,\n\t\t},\n\t\t{\n\t\t\theaders: {\n\t\t\t\t'Server-Timing': getServerTimeHeader(timings),\n\t\t\t},\n\t\t},\n\t)\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders, parentHeaders }) => {\n\tconst headers = {\n\t\t'Cache-Control': loaderHeaders.get('Cache-Control') ?? '',\n\t\t'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nconst mdxComponents = { h1: () => null }\n\nexport default function ExerciseFinished() {\n\tconst data = useLoaderData<typeof loader>()\n\treturn (\n\t\t<div className=\"flex h-full flex-grow flex-col\">\n\t\t\t<main className=\"grid h-full flex-grow grid-cols-1 grid-rows-2 lg:grid-cols-2 lg:grid-rows-1\">\n\t\t\t\t<div className=\"relative col-span-1 row-span-1 flex h-full flex-col lg:border-r\">\n\t\t\t\t\t<h1 className=\"h-14 border-b pl-10 pr-5 text-sm font-medium uppercase leading-none\">\n\t\t\t\t\t\t<div className=\"flex h-14 flex-wrap items-center justify-between gap-x-2 py-2\">\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-start gap-x-2\">\n\t\t\t\t\t\t\t\t<Link to=\"/\" className=\"hover:underline\">\n\t\t\t\t\t\t\t\t\t{data.workshopTitle}\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t<span>/</span>\n\t\t\t\t\t\t\t\t<span>Elaboration</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</h1>\n\t\t\t\t\t<article\n\t\t\t\t\t\tclassName=\"shadow-on-scrollbox h-full w-full max-w-none flex-1 scroll-pt-6 space-y-6 overflow-y-auto p-2 scrollbar-thin scrollbar-thumb-scrollbar sm:p-10 sm:pt-8\"\n\t\t\t\t\t\tid={data.articleId}\n\t\t\t\t\t>\n\t\t\t\t\t\t{data.finishedCode ? (\n\t\t\t\t\t\t\t<EpicVideoInfoProvider\n\t\t\t\t\t\t\t\tepicVideoInfosPromise={data.epicVideoInfosPromise}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div className=\"prose dark:prose-invert sm:prose-lg\">\n\t\t\t\t\t\t\t\t\t<Mdx code={data.finishedCode} components={mdxComponents} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</EpicVideoInfoProvider>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t// TODO: render a random dad joke...\n\t\t\t\t\t\t\t'No finished instructions yet...'\n\t\t\t\t\t\t)}\n\t\t\t\t\t</article>\n\t\t\t\t\t<ElementScrollRestoration elementQuery={`#${data.articleId}`} />\n\t\t\t\t\t<ProgressToggle\n\t\t\t\t\t\ttype=\"workshop-finished\"\n\t\t\t\t\t\tclassName=\"h-14 border-t px-6\"\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"flex h-16 justify-between border-b-4 border-t lg:border-b-0\">\n\t\t\t\t\t\t<div />\n\t\t\t\t\t\t{data.workshopFinished.status === 'success' ? (\n\t\t\t\t\t\t\t<EditFileOnGitHub\n\t\t\t\t\t\t\t\tfile={data.workshopFinished.file}\n\t\t\t\t\t\t\t\trelativePath={data.workshopFinished.relativePath}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t<NavChevrons prev={data.prevStepLink} next={{ to: '/' }} />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<Survey\n\t\t\t\t\tworkshopTitle={data.workshopTitle}\n\t\t\t\t\tworkshopFormEmbedUrl={data.workshopFormEmbedUrl}\n\t\t\t\t/>\n\t\t\t</main>\n\t\t</div>\n\t)\n}\n\nfunction Survey({\n\tworkshopTitle,\n\tworkshopFormEmbedUrl,\n}: {\n\tworkshopTitle: string\n\tworkshopFormEmbedUrl: string\n}) {\n\tconst [iframeLoaded, setIframeLoaded] = React.useState(false)\n\treturn (\n\t\t<div className=\"relative flex-shrink-0\">\n\t\t\t{!iframeLoaded ? (\n\t\t\t\t<div className=\"absolute inset-0 z-10 flex items-center justify-center\">\n\t\t\t\t\t<Loading>\n\t\t\t\t\t\t<span>Loading {workshopTitle} Elaboration form</span>\n\t\t\t\t\t</Loading>\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t\t<iframe\n\t\t\t\tonLoad={() => setIframeLoaded(true)}\n\t\t\t\t// show what would have shown if there is an error\n\t\t\t\tonError={() => setIframeLoaded(true)}\n\t\t\t\ttitle=\"Elaboration\"\n\t\t\t\tsrc={workshopFormEmbedUrl}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'absolute inset-0 flex h-full w-full transition-opacity duration-300',\n\t\t\t\t\tiframeLoaded ? 'opacity-100' : 'opacity-0',\n\t\t\t\t)}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n"],"names":["handle","getSitemapEntries","route","meta","matches","rootData","find","m","id","data","getSeoMetaTags","title","workshopTitle","description","ogTitle","ogDescription","instructor","requestInfo","mdxComponents","h1","ExerciseFinished","useLoaderData","className","children","jsxs","jsx","Link","to","articleId","finishedCode","EpicVideoInfoProvider","epicVideoInfosPromise","Mdx","code","components","ElementScrollRestoration","elementQuery","ProgressToggle","type","workshopFinished","status","EditFileOnGitHub","file","relativePath","NavChevrons","prev","prevStepLink","next","Survey","workshopFormEmbedUrl","iframeLoaded","setIframeLoaded","React","Loading","onLoad","onError","src","cn"],"mappings":"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"}
1
+ {"version":3,"file":"finished-DpVgSUHh.js","sources":["../../../app/routes/_app+/finished.tsx"],"sourcesContent":["import { ElementScrollRestoration } from '@epic-web/restore-scroll'\nimport {\n\tgetExercises,\n\tgetWorkshopFinished,\n} from '@epic-web/workshop-utils/apps.server'\nimport { getWorkshopConfig } from '@epic-web/workshop-utils/config.server'\nimport {\n\tcombineServerTimings,\n\tgetServerTimeHeader,\n\tmakeTimings,\n\ttime,\n} from '@epic-web/workshop-utils/timing.server'\nimport { type SEOHandle } from '@nasa-gcn/remix-seo'\nimport {\n\tdefer,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n\ttype MetaFunction,\n} from '@remix-run/node'\nimport { Link, useLoaderData } from '@remix-run/react'\nimport slugify from '@sindresorhus/slugify'\nimport * as React from 'react'\nimport { EpicVideoInfoProvider } from '#app/components/epic-video.tsx'\nimport { Loading } from '#app/components/loading.tsx'\nimport { NavChevrons } from '#app/components/nav-chevrons.tsx'\nimport { type loader as rootLoader } from '#app/root.tsx'\nimport { getEpicVideoInfos } from '#app/utils/epic-api.ts'\nimport { Mdx } from '#app/utils/mdx.tsx'\nimport { cn } from '#app/utils/misc.tsx'\nimport { getSeoMetaTags } from '#app/utils/seo.js'\nimport { EditFileOnGitHub } from '../launch-editor.tsx'\nimport { ProgressToggle } from '../progress.tsx'\n\nexport const handle: SEOHandle = {\n\tgetSitemapEntries: () => [{ route: '/finished' }],\n}\n\nexport const meta: MetaFunction<typeof loader, { root: typeof rootLoader }> = ({\n\tmatches,\n}) => {\n\tconst rootData = matches.find((m) => m.id === 'root')?.data\n\tif (!rootData) return []\n\n\treturn getSeoMetaTags({\n\t\ttitle: `🎉 ${rootData?.workshopTitle}`,\n\t\tdescription: `Elaboration for ${rootData?.workshopTitle}`,\n\t\togTitle: `Finished ${rootData?.workshopTitle}`,\n\t\togDescription: `You finished! Time to submit feedback.`,\n\t\tinstructor: rootData.instructor,\n\t\trequestInfo: rootData.requestInfo,\n\t})\n}\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('finishedLoader')\n\tconst exercises = await getExercises({ request, timings })\n\tconst compiledFinished = await time(() => getWorkshopFinished({ request }), {\n\t\ttimings,\n\t\ttype: 'compileMdx',\n\t\tdesc: 'compileMdx in finished',\n\t})\n\n\tconst lastExercises = exercises[exercises.length - 1]\n\tconst workshopConfig = getWorkshopConfig()\n\tconst workshopTitle = workshopConfig.title\n\tconst workshopFormTemplate = workshopConfig.forms.workshop\n\tconst workshopFormEmbedUrl = workshopFormTemplate.replace(\n\t\t'{workshopTitle}',\n\t\tencodeURIComponent(workshopTitle),\n\t)\n\treturn defer(\n\t\t{\n\t\t\tarticleId: `workshop-${slugify(workshopTitle)}-finished`,\n\t\t\tworkshopTitle,\n\t\t\tworkshopFormEmbedUrl,\n\t\t\tfinishedCode:\n\t\t\t\tcompiledFinished.compiled.status === 'success'\n\t\t\t\t\t? compiledFinished.compiled.code\n\t\t\t\t\t: null,\n\t\t\tepicVideoInfosPromise:\n\t\t\t\tcompiledFinished.compiled.status === 'success'\n\t\t\t\t\t? getEpicVideoInfos(compiledFinished.compiled.epicVideoEmbeds, {\n\t\t\t\t\t\t\trequest,\n\t\t\t\t\t\t})\n\t\t\t\t\t: null,\n\t\t\tworkshopFinished: {\n\t\t\t\tstatus: compiledFinished.compiled.status,\n\t\t\t\tfile: compiledFinished.file,\n\t\t\t\trelativePath: compiledFinished.relativePath,\n\t\t\t},\n\t\t\tprevStepLink: lastExercises\n\t\t\t\t? {\n\t\t\t\t\t\tto: `/${lastExercises.exerciseNumber}/finished`,\n\t\t\t\t\t}\n\t\t\t\t: null,\n\t\t},\n\t\t{\n\t\t\theaders: {\n\t\t\t\t'Server-Timing': getServerTimeHeader(timings),\n\t\t\t},\n\t\t},\n\t)\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders, parentHeaders }) => {\n\tconst headers = {\n\t\t'Cache-Control': loaderHeaders.get('Cache-Control') ?? '',\n\t\t'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nconst mdxComponents = { h1: () => null }\n\nexport default function ExerciseFinished() {\n\tconst data = useLoaderData<typeof loader>()\n\treturn (\n\t\t<div className=\"flex h-full flex-grow flex-col\">\n\t\t\t<main className=\"grid h-full flex-grow grid-cols-1 grid-rows-2 lg:grid-cols-2 lg:grid-rows-1\">\n\t\t\t\t<div className=\"relative col-span-1 row-span-1 flex h-full flex-col lg:border-r\">\n\t\t\t\t\t<h1 className=\"h-14 border-b pl-10 pr-5 text-sm font-medium uppercase leading-none\">\n\t\t\t\t\t\t<div className=\"flex h-14 flex-wrap items-center justify-between gap-x-2 py-2\">\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-start gap-x-2\">\n\t\t\t\t\t\t\t\t<Link to=\"/\" className=\"hover:underline\">\n\t\t\t\t\t\t\t\t\t{data.workshopTitle}\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t<span>/</span>\n\t\t\t\t\t\t\t\t<span>Elaboration</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</h1>\n\t\t\t\t\t<article\n\t\t\t\t\t\tclassName=\"shadow-on-scrollbox h-full w-full max-w-none flex-1 scroll-pt-6 space-y-6 overflow-y-auto p-2 scrollbar-thin scrollbar-thumb-scrollbar sm:p-10 sm:pt-8\"\n\t\t\t\t\t\tid={data.articleId}\n\t\t\t\t\t>\n\t\t\t\t\t\t{data.finishedCode ? (\n\t\t\t\t\t\t\t<EpicVideoInfoProvider\n\t\t\t\t\t\t\t\tepicVideoInfosPromise={data.epicVideoInfosPromise}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div className=\"prose dark:prose-invert sm:prose-lg\">\n\t\t\t\t\t\t\t\t\t<Mdx code={data.finishedCode} components={mdxComponents} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</EpicVideoInfoProvider>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t// TODO: render a random dad joke...\n\t\t\t\t\t\t\t'No finished instructions yet...'\n\t\t\t\t\t\t)}\n\t\t\t\t\t</article>\n\t\t\t\t\t<ElementScrollRestoration elementQuery={`#${data.articleId}`} />\n\t\t\t\t\t<ProgressToggle\n\t\t\t\t\t\ttype=\"workshop-finished\"\n\t\t\t\t\t\tclassName=\"h-14 border-t px-6\"\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"flex h-16 justify-between border-b-4 border-t lg:border-b-0\">\n\t\t\t\t\t\t<div />\n\t\t\t\t\t\t{data.workshopFinished.status === 'success' ? (\n\t\t\t\t\t\t\t<EditFileOnGitHub\n\t\t\t\t\t\t\t\tfile={data.workshopFinished.file}\n\t\t\t\t\t\t\t\trelativePath={data.workshopFinished.relativePath}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t<NavChevrons prev={data.prevStepLink} next={{ to: '/' }} />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<Survey\n\t\t\t\t\tworkshopTitle={data.workshopTitle}\n\t\t\t\t\tworkshopFormEmbedUrl={data.workshopFormEmbedUrl}\n\t\t\t\t/>\n\t\t\t</main>\n\t\t</div>\n\t)\n}\n\nfunction Survey({\n\tworkshopTitle,\n\tworkshopFormEmbedUrl,\n}: {\n\tworkshopTitle: string\n\tworkshopFormEmbedUrl: string\n}) {\n\tconst [iframeLoaded, setIframeLoaded] = React.useState(false)\n\treturn (\n\t\t<div className=\"relative flex-shrink-0\">\n\t\t\t{!iframeLoaded ? (\n\t\t\t\t<div className=\"absolute inset-0 z-10 flex items-center justify-center\">\n\t\t\t\t\t<Loading>\n\t\t\t\t\t\t<span>Loading {workshopTitle} Elaboration form</span>\n\t\t\t\t\t</Loading>\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t\t<iframe\n\t\t\t\tonLoad={() => setIframeLoaded(true)}\n\t\t\t\t// show what would have shown if there is an error\n\t\t\t\tonError={() => setIframeLoaded(true)}\n\t\t\t\ttitle=\"Elaboration\"\n\t\t\t\tsrc={workshopFormEmbedUrl}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'absolute inset-0 flex h-full w-full transition-opacity duration-300',\n\t\t\t\t\tiframeLoaded ? 'opacity-100' : 'opacity-0',\n\t\t\t\t)}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n"],"names":["handle","getSitemapEntries","route","meta","matches","rootData","find","m","id","data","getSeoMetaTags","title","workshopTitle","description","ogTitle","ogDescription","instructor","requestInfo","mdxComponents","h1","ExerciseFinished","useLoaderData","className","children","jsxs","jsx","Link","to","articleId","finishedCode","EpicVideoInfoProvider","epicVideoInfosPromise","Mdx","code","components","ElementScrollRestoration","elementQuery","ProgressToggle","type","workshopFinished","status","EditFileOnGitHub","file","relativePath","NavChevrons","prev","prevStepLink","next","Survey","workshopFormEmbedUrl","iframeLoaded","setIframeLoaded","React","Loading","onLoad","onError","src","cn"],"mappings":"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"}
@@ -0,0 +1,544 @@
1
+ <!-- Thank you! https://benadam.me/thoughts/react-svg-sprites/ -->
2
+
3
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
4
+ <defs>
5
+ <linearGradient id="epicGradient" x1="16.9703" y1="7.03022" x2="7.05798" y2="16.948" gradientUnits="userSpaceOnUse">
6
+ <stop stop-color="#4F75FF"></stop>
7
+ <stop offset="1" stop-color="#30AFFF"></stop>
8
+ </linearGradient>
9
+ </defs>
10
+ <symbol id="Keyboard" viewBox="0 0 24 24" fill="none">
11
+ <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"
12
+ d="M7.75 12.75h8.5m-8.5 3.5h8.5m-4.5-6.5h-5a2 2 0 0 0-2 2v5.5a2 2 0 0 0 2 2h10.5a2 2 0 0 0 2-2v-5.5a2 2 0 0 0-2-2h-5.5Zm0 0v-1.5a1 1 0 0 1 1-1h4.5a1 1 0 0 0 1-1v-1.5" />
13
+ </symbol>
14
+ <symbol id="Linked" viewBox="0 0 24 24" fill="none">
15
+ <path
16
+ d="M11 14.25H12.5C15.1234 14.25 17.25 12.1234 17.25 9.5C17.25 6.87665 15.1234 4.75 12.5 4.75H9C6.65279 4.75 4.75 6.65279 4.75 9V10.25"
17
+ stroke="currentColor"
18
+ strokeWidth="1.5"
19
+ strokeLinecap="round"
20
+ strokeLinejoin="round"
21
+ />
22
+ <path
23
+ d="M13 9.75H11.5C8.87665 9.75 6.75 11.8766 6.75 14.5C6.75 17.1234 8.87665 19.25 11.5 19.25H15C17.3472 19.25 19.25 17.3472 19.25 15V13.75"
24
+ stroke="currentColor"
25
+ strokeWidth="1.5"
26
+ strokeLinecap="round"
27
+ strokeLinejoin="round"
28
+ />
29
+ </symbol>
30
+ <symbol id="Unlinked" viewBox="0 0 24 24" fill="none">
31
+ <path
32
+ d="M17.75 12.25L18 12C19.6569 10.3431 19.6569 7.65685 18 6C16.3431 4.34314 13.6569 4.34314 12 6L11.75 6.25"
33
+ stroke="currentColor"
34
+ strokeWidth="1.5"
35
+ strokeLinecap="round"
36
+ strokeLinejoin="round"
37
+ />
38
+ <path
39
+ d="M6.24996 11.75L5.99996 12C4.34311 13.6569 4.34311 16.3431 5.99996 18C7.65682 19.6569 10.3431 19.6569 12 18L12.25 17.75"
40
+ stroke="currentColor"
41
+ strokeWidth="1.5"
42
+ strokeLinecap="round"
43
+ strokeLinejoin="round"
44
+ />
45
+ <path
46
+ d="M8.25 4.75V6.25"
47
+ stroke="currentColor"
48
+ strokeWidth="1.5"
49
+ strokeLinecap="round"
50
+ strokeLinejoin="round"
51
+ />
52
+ <path
53
+ d="M15.75 17.75V19.25"
54
+ stroke="currentColor"
55
+ strokeWidth="1.5"
56
+ strokeLinecap="round"
57
+ strokeLinejoin="round"
58
+ />
59
+ <path
60
+ d="M6.25 8.25H4.75"
61
+ stroke="currentColor"
62
+ strokeWidth="1.5"
63
+ strokeLinecap="round"
64
+ strokeLinejoin="round"
65
+ />
66
+ <path
67
+ d="M19.25 15.75H17.75"
68
+ stroke="currentColor"
69
+ strokeWidth="1.5"
70
+ strokeLinecap="round"
71
+ strokeLinejoin="round"
72
+ />
73
+ </symbol>
74
+ <symbol id="TriangleSmall" viewBox="0 0 16 16">
75
+ <g
76
+ strokeWidth="1.5"
77
+ fill="none"
78
+ stroke="currentColor"
79
+ strokeMiterlimit="10"
80
+ strokeLinecap="round"
81
+ strokeLinejoin="round"
82
+ >
83
+ <polygon points="2.5,0.5 14.5,8 2.5,15.5 " />
84
+ </g>
85
+ </symbol>
86
+ <symbol
87
+ id="ArrowLeft" viewBox="0 0 16 16">
88
+ <path
89
+ stroke="currentColor"
90
+ strokeLinecap="round"
91
+ strokeLinejoin="round"
92
+ strokeMiterlimit="10"
93
+ strokeWidth="2"
94
+ d="M6 2 1 8l5 6"
95
+ />
96
+
97
+ <path
98
+ stroke="currentColor"
99
+ strokeLinecap="round"
100
+ strokeLinejoin="round"
101
+ strokeMiterlimit="10"
102
+ strokeWidth="2"
103
+ d="M1.5 8H15"
104
+ />
105
+ </symbol>
106
+
107
+ <symbol id="ArrowRight" viewBox="0 0 16 16">
108
+ <path
109
+ stroke="currentColor"
110
+ strokeLinecap="round"
111
+ strokeLinejoin="round"
112
+ strokeMiterlimit="10"
113
+ strokeWidth="2"
114
+ d="m10 2 5 6-5 6"
115
+ />
116
+ <path
117
+ stroke="currentColor"
118
+ strokeLinecap="round"
119
+ strokeLinejoin="round"
120
+ strokeMiterlimit="10"
121
+ strokeWidth="2"
122
+ d="M14.5 8H1"
123
+ />
124
+ </symbol>
125
+
126
+ <symbol id="Sun" viewBox="0 0 16 16">
127
+ <g
128
+ strokeWidth="1"
129
+ fill="none"
130
+ stroke="currentColor"
131
+ strokeMiterlimit="10"
132
+ strokeLinecap="round"
133
+ strokeLinejoin="round"
134
+ >
135
+ <line x1="8.5" y1="1.5" x2="8.5" y2="2.5" stroke="currentColor" />
136
+ <line
137
+ x1="13.45"
138
+ y1="3.55"
139
+ x2="12.743"
140
+ y2="4.257"
141
+ stroke="currentColor"
142
+ />
143
+ <line x1="15.5" y1="8.5" x2="14.5" y2="8.5" stroke="currentColor" />
144
+ <line
145
+ x1="13.45"
146
+ y1="13.45"
147
+ x2="12.743"
148
+ y2="12.743"
149
+ stroke="currentColor"
150
+ />
151
+ <line x1="8.5" y1="15.5" x2="8.5" y2="14.5" stroke="currentColor" />
152
+ <line
153
+ x1="3.55"
154
+ y1="13.45"
155
+ x2="4.257"
156
+ y2="12.743"
157
+ stroke="currentColor"
158
+ />
159
+ <line x1="1.5" y1="8.5" x2="2.5" y2="8.5" stroke="currentColor" />
160
+ <line x1="3.55" y1="3.55" x2="4.257" y2="4.257" stroke="currentColor" />
161
+ <circle cx="8.5" cy="8.5" r="3" />
162
+ </g>
163
+ </symbol>
164
+
165
+ <symbol id="Moon"
166
+ viewBox="0 0 16 16">
167
+ <g
168
+ strokeWidth="1"
169
+ fill="none"
170
+ stroke="currentColor"
171
+ strokeMiterlimit="10"
172
+ strokeLinecap="round"
173
+ strokeLinejoin="round"
174
+ >
175
+ <path
176
+ d="M13.5,10.5 c-4.418,0-8-3.582-8-8c0-0.557,0.057-1.1,0.166-1.625C2.668,1.857,0.5,4.674,0.5,8c0,4.142,3.358,7.5,7.5,7.5 c3.326,0,6.143-2.168,7.125-5.166C14.6,10.443,14.057,10.5,13.5,10.5z" />
177
+ </g>
178
+ </symbol>
179
+
180
+ <symbol
181
+ id="ChevronLeft" viewBox="0 0 16 16">
182
+ <path
183
+ stroke="currentColor"
184
+ strokeLinecap="round"
185
+ strokeLinejoin="round"
186
+ strokeMiterlimit="10"
187
+ strokeWidth="2"
188
+ d="M10.5.5 5.5 8l5 7.5"
189
+ />
190
+ </symbol>
191
+
192
+ <symbol id="ChevronRight" viewBox="0 0 16 16">
193
+ <path
194
+ stroke="currentColor"
195
+ strokeLinecap="round"
196
+ strokeLinejoin="round"
197
+ strokeMiterlimit="10"
198
+ strokeWidth="2"
199
+ d="m5.5.5 5 7.5-5 7.5"
200
+ />
201
+ </symbol>
202
+
203
+ <symbol id="ChevronDown" viewBox="0 0 16 16">
204
+ <g
205
+ strokeWidth="1"
206
+ fill="none"
207
+ stroke="currentColor"
208
+ strokeMiterlimit="10"
209
+ strokeLinecap="round"
210
+ strokeLinejoin="round"
211
+ >
212
+ <polyline points="15.5,5.5 8,10.5 0.5,5.5" />
213
+ </g>
214
+ </symbol>
215
+
216
+ <symbol id="ChevronUp"
217
+ viewBox="0 0 16 16">
218
+ <g
219
+ strokeWidth="1"
220
+ fill="none"
221
+ stroke="currentColor"
222
+ strokeMiterlimit="10"
223
+ strokeLinecap="round"
224
+ strokeLinejoin="round"
225
+ >
226
+ <polyline points="15.5,10.5 8,5.5 0.5,10.5" />
227
+ </g>
228
+ </symbol>
229
+
230
+ <symbol id="CheckSmall"
231
+ viewBox="0 0 16 16">
232
+ <path
233
+ d="M7,11c-.256,0-.512-.098-.707-.293l-2-2c-.391-.391-.391-1.023,0-1.414s1.023-.391,1.414,0l1.293,1.293,3.293-3.293c.391-.391,1.023-.391,1.414,0s.391,1.023,0,1.414l-4,4c-.195,.195-.451,.293-.707,.293Z"
234
+ fill="currentColor"
235
+ />
236
+ </symbol>
237
+
238
+ <symbol id="TriangleDownSmall" viewBox="0 0 16 16">
239
+ <path
240
+ d="M11.943,5.269A.5.5,0,0,0,11.5,5h-7a.5.5,0,0,0-.409.787l3.5,5a.5.5,0,0,0,.818,0l3.5-5A.5.5,0,0,0,11.943,5.269Z"
241
+ fill="currentColor"
242
+ />
243
+ </symbol>
244
+
245
+ <symbol id="Question" viewBox="0 0 16 16">
246
+ <g
247
+ strokeWidth="1"
248
+ fill="none"
249
+ stroke="currentColor"
250
+ strokeLinecap="round"
251
+ strokeLinejoin="round"
252
+ >
253
+ <circle cx="8" cy="8" r="7.5" />
254
+ <circle cx="8.003" cy="12" r="1" stroke="none" fill="currentColor" />
255
+ <path
256
+ d="M6.5,3.577c.953-.86,3.018-.845,3.423.635C10.453,6.134,8,6.142,8,9"
257
+ stroke="currentColor"
258
+ />
259
+ </g>
260
+ </symbol>
261
+
262
+ <symbol id="Remove" viewBox="0 0 16 16">
263
+ <g
264
+ strokeWidth="1"
265
+ fill="none"
266
+ stroke="currentColor"
267
+ strokeLinecap="round"
268
+ strokeLinejoin="round"
269
+ >
270
+ <circle cx="8" cy="8" r="7.5" />
271
+ <line x1="11" y1="5" x2="5" y2="11" stroke="currentColor" />
272
+ <line x1="5" y1="5" x2="11" y2="11" stroke="currentColor" />
273
+ </g>
274
+ </symbol>
275
+
276
+ <symbol
277
+ id="ExternalLink" viewBox="0 0 16 16">
278
+ <g
279
+ strokeWidth="1"
280
+ fill="none"
281
+ stroke="currentColor"
282
+ strokeLinecap="round"
283
+ strokeLinejoin="round"
284
+ >
285
+ <line x1="15.5" y1="0.5" x2="7.5" y2="8.5" stroke="currentColor" />
286
+ <polyline points="8.5 0.5 15.5 0.5 15.5 7.5" stroke="currentColor" />
287
+ <path d="M4.5.5H2A1.5,1.5,0,0,0,.5,2V14A1.5,1.5,0,0,0,2,15.5H14A1.5,1.5,0,0,0,15.5,14V11.5" />
288
+ </g>
289
+ </symbol>
290
+
291
+ <symbol
292
+ id="Refresh" viewBox="0 0 16 16">
293
+ <g
294
+ strokeWidth="1"
295
+ fill="none"
296
+ stroke="currentColor"
297
+ strokeLinecap="round"
298
+ strokeLinejoin="round"
299
+ >
300
+ <path d="M14.5,8a6.5,6.5,0,1,1-1.022-3.5" stroke="currentColor" />
301
+ <polyline points="13.5 0.5 13.5 4.5 9.5 4.5" />
302
+ </g>
303
+ </symbol>
304
+
305
+ <symbol id="Files"
306
+ viewBox="0 0 16 16"
307
+
308
+ >
309
+ <path
310
+ d="M2.1667 14.4167C2.16574 14.1866 2.21035 13.4915 2.29795 13.2787C2.38556 13.0659 2.51443 12.8727 2.67712 12.71C2.83981 12.5473 3.03312 12.4184 3.24587 12.3308C3.45862 12.2432 3.68662 12.1986 3.9167 12.1995H13.8334V1.00002H3.9167C3.68662 0.999054 3.45862 1.04366 3.24587 1.13127C3.03312 1.21887 2.83981 1.34774 2.67712 1.51043C2.51443 1.67312 2.38556 1.86643 2.29795 2.07918C2.21035 2.29194 2.16574 2.51994 2.1667 2.75002V14.4167Z"
311
+ stroke="currentColor"
312
+ strokeWidth="1.16667"
313
+ strokeLinecap="round"
314
+ strokeLinejoin="round"
315
+ />
316
+ <path
317
+ d="M2.16669 14.4167V15H12.6667"
318
+ stroke="currentColor"
319
+ strokeWidth="1.16667"
320
+ strokeLinecap="round"
321
+ strokeLinejoin="round"
322
+ />
323
+ <path
324
+ d="M5.66669 5.08331H10.3333"
325
+ stroke="currentColor"
326
+ strokeWidth="1.16667"
327
+ strokeLinecap="round"
328
+ />
329
+ <path
330
+ d="M5.66669 8H10.3333"
331
+ stroke="currentColor"
332
+ strokeWidth="1.16667"
333
+ strokeLinecap="round"
334
+ />
335
+ </symbol>
336
+
337
+ <symbol
338
+ id="Clear" viewBox="0 0 16 16">
339
+ <g
340
+ strokeWidth="1.5"
341
+ fill="none"
342
+ stroke="currentColor"
343
+ strokeMiterlimit="10"
344
+ strokeLinecap="round"
345
+ strokeLinejoin="round"
346
+ >
347
+ <circle cx="8" cy="8" r="7" />
348
+ <line x1="3" y1="13" x2="13" y2="3" />
349
+ </g>
350
+ </symbol>
351
+
352
+ <symbol id="Stop"
353
+ viewBox="0 0 16 16">
354
+ <g
355
+ strokeWidth="2"
356
+ fill="none"
357
+ stroke="currentColor"
358
+ strokeMiterlimit="10"
359
+ strokeLinecap="round"
360
+ strokeLinejoin="round"
361
+ >
362
+ <path
363
+ d="M14.5,15.5h-13 c-0.552,0-1-0.448-1-1v-13c0-0.552,0.448-1,1-1h13c0.552,0,1,0.448,1,1v13C15.5,15.052,15.052,15.5,14.5,15.5z" />
364
+ </g>
365
+ </symbol>
366
+
367
+ <symbol
368
+ id="Deleted" viewBox="0 0 16 16">
369
+ <rect width="14" height="14" x="1" y="1" stroke="currentColor" rx="2" />
370
+ <path
371
+ fill="currentColor"
372
+ d="M7.993 5.112H5.52V11h2.423c1.673 0 2.833-1.092 2.833-2.97 0-1.868-1.11-2.918-2.782-2.918Zm-.06 4.864H6.73v-3.84h1.204c.98 0 1.578.64 1.578 1.929 0 1.28-.597 1.911-1.579 1.911Z"
373
+ />
374
+ </symbol>
375
+
376
+ <symbol
377
+ id="Modified" viewBox="0 0 16 16">
378
+ <rect width="14" height="14" x="1" y="1" stroke="currentColor" rx="2" />
379
+ <path
380
+ fill="currentColor"
381
+ d="M6.35 7.749 7.512 11h.999L9.68 7.749c.136-.393.324-.973.46-1.391a28.474 28.474 0 0 0-.05 1.442l-.02 3.2h1.135V5.112h-1.56l-1.297 3.72c-.086.257-.188.632-.273.94-.086-.308-.188-.683-.282-.94L6.47 5.113H4.798V11h1.135l-.017-3.191c0-.478-.026-1.135-.052-1.57.128.418.325 1.049.487 1.51Z"
382
+ />
383
+ </symbol>
384
+
385
+ <symbol
386
+ id="Added" viewBox="0 0 16 16">
387
+ <rect width="14" height="14" x="1" y="1" stroke="currentColor" rx="2" />
388
+ <path
389
+ fill="currentColor"
390
+ d="M9.763 11h1.314L8.764 5.112H7.237L4.924 11h1.263l.52-1.425h2.535L9.762 11ZM7.049 8.645l.546-1.494c.137-.384.282-.819.384-1.134.103.315.248.75.384 1.134l.546 1.494H7.05Z"
391
+ />
392
+ </symbol>
393
+
394
+ <symbol
395
+ id="Renamed" viewBox="0 0 16 16">
396
+ <rect width="14" height="14" x="1" y="1" stroke="currentColor" rx="2" />
397
+ <path
398
+ fill="currentColor"
399
+ d="m10.414 9.967-.162-.674c-.12-.486-.359-.836-.751-1.024.623-.273 1.032-.802 1.032-1.442 0-1.084-.776-1.715-2.261-1.715H5.635V11h1.212V8.747h1.092c.768 0 .982.29 1.084.683l.23.879c.052.196.145.46.29.691h1.212v-.102a4.374 4.374 0 0 1-.341-.93ZM6.847 7.774V6.12H8.17c.69 0 1.109.188 1.109.794 0 .622-.444.861-1.195.861H6.847Z"
400
+ />
401
+ </symbol>
402
+
403
+ <symbol
404
+ id="Close" viewBox="0 0 16 16">
405
+ <path
406
+ stroke="currentColor"
407
+ d="M11.7816 4.03157C12.0062 3.80702 12.0062 3.44295 11.7816 3.2184C11.5571 2.99385 11.193 2.99385 10.9685 3.2184L7.50005 6.68682L4.03164 3.2184C3.80708 2.99385 3.44301 2.99385 3.21846 3.2184C2.99391 3.44295 2.99391 3.80702 3.21846 4.03157L6.68688 7.49999L3.21846 10.9684C2.99391 11.193 2.99391 11.557 3.21846 11.7816C3.44301 12.0061 3.80708 12.0061 4.03164 11.7816L7.50005 8.31316L10.9685 11.7816C11.193 12.0061 11.5571 12.0061 11.7816 11.7816C12.0062 11.557 12.0062 11.193 11.7816 10.9684L8.31322 7.49999L11.7816 4.03157Z"
408
+ />
409
+ </symbol>
410
+
411
+ <symbol
412
+ id="Error" viewBox="0 0 24 24">
413
+ <g fill="none" strokeWidth="2" stroke="currentColor">
414
+ <path
415
+ strokeLinecap="round"
416
+ strokeLinejoin="round"
417
+ d="M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z"
418
+ />
419
+ </g>
420
+ </symbol>
421
+
422
+ <symbol
423
+ id="Notify" viewBox="0 0 24 24">
424
+ <g fill="none" strokeWidth="2" stroke="currentColor">
425
+ <path
426
+ strokeLinecap="round"
427
+ strokeLinejoin="round"
428
+ d="M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0"
429
+ />
430
+ </g>
431
+ </symbol>
432
+
433
+ <symbol
434
+ id="User" viewBox="0 0 24 24">
435
+ <g strokeLinecap="square" strokeLinejoin="miter" strokeWidth="2" fill="none"
436
+ stroke="currentColor" strokeMiterlimit="10">
437
+ <path d="M5.14,20.599c.649-3.195,3.474-5.599,6.86-5.599s6.205,2.399,6.858,5.589"
438
+ strokeLinecap="butt" stroke="currentColor" />
439
+ <circle cx="12" cy="12" r="11" />
440
+ <circle cx="12" cy="9" r="3" stroke="currentColor" />
441
+ </g>
442
+ </symbol>
443
+
444
+ <symbol
445
+ id="Success" viewBox="0 0 24 24">
446
+ <g fill="none" strokeWidth="2" stroke="currentColor">
447
+ <path
448
+ strokeLinecap="round"
449
+ strokeLinejoin="round"
450
+ d="M4.5 12.75l6 6 9-13.5"
451
+ />
452
+ </g>
453
+ </symbol>
454
+
455
+ <symbol id="Sun" viewBox="0 0 24 24" fill="none">
456
+ <circle cx="12" cy="12" r="3.25" stroke="currentColor" stroke-linecap="round"
457
+ stroke-linejoin="round" stroke-width="1.5"></circle>
458
+ <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"
459
+ d="M12 2.75V4.25"></path>
460
+ <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"
461
+ d="M17.25 6.75L16.0659 7.93416"></path>
462
+ <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"
463
+ d="M21.25 12.0001L19.75 12.0001"></path>
464
+ <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"
465
+ d="M17.25 17.2501L16.0659 16.066"></path>
466
+ <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"
467
+ d="M12 19.75V21.25"></path>
468
+ <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"
469
+ d="M7.9341 16.0659L6.74996 17.25"></path>
470
+ <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"
471
+ d="M4.25 12.0001L2.75 12.0001"></path>
472
+ <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"
473
+ d="M7.93405 7.93423L6.74991 6.75003"></path>
474
+ </symbol>
475
+
476
+ <symbol id="Moon" viewBox="0 0 24 24" fill="none">
477
+ <path
478
+ d="M18.25 15.0314C17.7575 15.1436 17.2459 15.2027 16.7209 15.2027C12.8082 15.2027 9.63607 11.9185 9.63607 7.86709C9.63607 6.75253 9.87614 5.69603 10.3057 4.75C7.12795 5.47387 4.75 8.40659 4.75 11.9143C4.75 15.9657 7.9221 19.25 11.8348 19.25C14.6711 19.25 17.1182 17.5242 18.25 15.0314Z"
479
+ stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
480
+ </symbol>
481
+
482
+ <symbol id="Laptop" viewBox="0 0 24 24" fill="none">
483
+ <path
484
+ d="M5.75 5.75C5.75 5.19772 6.19772 4.75 6.75 4.75H17.25C17.8023 4.75 18.25 5.19772 18.25 5.75V14.25H5.75V5.75Z"
485
+ stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
486
+ <path
487
+ d="M18.25 14.5L18.9961 18.044C19.1269 18.6655 18.6527 19.25 18.0175 19.25H5.98243C5.34725 19.25 4.87302 18.6655 5.00388 18.044L5.74998 14.5"
488
+ stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
489
+ </symbol>
490
+
491
+ <symbol id="Video" viewBox="0 0 24 24" fill="none">
492
+ <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"
493
+ d="M4.75 6.75C4.75 5.64543 5.64543 4.75 6.75 4.75H17.25C18.3546 4.75 19.25 5.64543 19.25 6.75V17.25C19.25 18.3546 18.3546 19.25 17.25 19.25H6.75C5.64543 19.25 4.75 18.3546 4.75 17.25V6.75Z"></path>
494
+ <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"
495
+ d="M15.25 12L9.75 8.75V15.25L15.25 12Z"></path>
496
+ </symbol>
497
+
498
+ <symbol id="EpicWeb" viewBox="0 0 24 24" fill="none">
499
+ <path
500
+ d="M12.438 11.5677C12.0131 11.8026 11.5249 12.0534 10.9784 12.3047C8.80704 13.3031 5.70429 14.314 1.986 14.3555L1.55773 14.3603L1.48003 13.9391C1.36509 13.316 1.29793 12.6714 1.29793 12.006C1.29793 6.10441 6.09863 1.30372 12.0002 1.30372C13.6287 1.30372 15.1745 1.66961 16.5585 2.32369L17.9801 1.59897C16.2189 0.582162 14.1769 0 12.0002 0C5.38709 0 0 5.38709 0 12.0002C0 14.6402 0.858474 17.0847 2.31072 19.0692C4.79741 18.6457 6.35749 17.6495 6.35749 17.6495C6.35749 17.6495 5.36137 19.2075 4.93785 21.6946C6.92114 23.1439 9.36321 24.0005 12.0002 24.0005C18.6134 24.0005 24.0005 18.6134 24.0005 12.0002C24.0005 9.82732 23.4199 7.78762 22.4053 6.02738L21.6818 7.44613C22.3364 8.83057 22.7025 10.3769 22.7025 12.006C22.7025 17.9076 17.9018 22.7083 12.0002 22.7083C11.3345 22.7083 10.6959 22.6411 10.0681 22.5264L9.646 22.4493L9.65079 22.0203C9.6923 18.2991 10.7031 15.1964 11.7016 13.0257C11.9527 12.4797 12.2033 11.9921 12.438 11.5677Z"
501
+ fill="currentColor" />
502
+ <path d="M18.2525 9.31052L15.4992 8.50683L14.6953 5.74778L23.8291 0.171387L18.2525 9.31052Z"
503
+ fill="currentColor" />
504
+ </symbol>
505
+
506
+ <symbol id="EpicWebGradient" viewBox="0 0 24 24" fill="none">
507
+ <path
508
+ d="M12.438 11.5677C12.0131 11.8026 11.5249 12.0534 10.9784 12.3047C8.80704 13.3031 5.70429 14.314 1.986 14.3555L1.55773 14.3603L1.48003 13.9391C1.36509 13.316 1.29793 12.6714 1.29793 12.006C1.29793 6.10441 6.09863 1.30372 12.0002 1.30372C13.6287 1.30372 15.1745 1.66961 16.5585 2.32369L17.9801 1.59897C16.2189 0.582162 14.1769 0 12.0002 0C5.38709 0 0 5.38709 0 12.0002C0 14.6402 0.858474 17.0847 2.31072 19.0692C4.79741 18.6457 6.35749 17.6495 6.35749 17.6495C6.35749 17.6495 5.36137 19.2075 4.93785 21.6946C6.92114 23.1439 9.36321 24.0005 12.0002 24.0005C18.6134 24.0005 24.0005 18.6134 24.0005 12.0002C24.0005 9.82732 23.4199 7.78762 22.4053 6.02738L21.6818 7.44613C22.3364 8.83057 22.7025 10.3769 22.7025 12.006C22.7025 17.9076 17.9018 22.7083 12.0002 22.7083C11.3345 22.7083 10.6959 22.6411 10.0681 22.5264L9.646 22.4493L9.65079 22.0203C9.6923 18.2991 10.7031 15.1964 11.7016 13.0257C11.9527 12.4797 12.2033 11.9921 12.438 11.5677Z"
509
+ fill="url(#epicGradient)"
510
+ >
511
+ </path>
512
+ <path
513
+ d="M18.2525 9.31052L15.4992 8.50683L14.6953 5.74778L23.8291 0.171387L18.2525 9.31052Z"
514
+ fill="currentColor"
515
+ >
516
+ </path>
517
+ </symbol>
518
+
519
+ <symbol id="FastForward" viewBox="0 0 24 24" fill="none">
520
+ <g strokeLinejoin="round" strokeLinecap="round" strokeWidth="2" fill="none"
521
+ stroke="currentColor">
522
+ <path d="M13 19l9-7-9-7v14z" />
523
+ <path d="M2 19l9-7-9-7v14z" />
524
+ </g>
525
+ </symbol>
526
+
527
+ <symbol id="Discord" viewBox="0 0 15 15" fill="none">
528
+ <path
529
+ fill-rule="evenodd"
530
+ clip-rule="evenodd"
531
+ fill="currentColor"
532
+ d="M5.07451 1.82584C5.03267 1.81926 4.99014 1.81825 4.94803 1.82284C4.10683 1.91446 2.82673 2.36828 2.07115 2.77808C2.02106 2.80525 1.97621 2.84112 1.93869 2.88402C1.62502 3.24266 1.34046 3.82836 1.11706 4.38186C0.887447 4.95076 0.697293 5.55032 0.588937 5.98354C0.236232 7.39369 0.042502 9.08728 0.0174948 10.6925C0.0162429 10.7729 0.0351883 10.8523 0.0725931 10.9234C0.373679 11.496 1.02015 12.027 1.66809 12.4152C2.32332 12.8078 3.08732 13.1182 3.70385 13.1778C3.85335 13.1922 4.00098 13.1358 4.10282 13.0255C4.2572 12.8581 4.5193 12.4676 4.71745 12.1643C4.80739 12.0267 4.89157 11.8953 4.95845 11.7901C5.62023 11.9106 6.45043 11.9801 7.50002 11.9801C8.54844 11.9801 9.37796 11.9107 10.0394 11.7905C10.1062 11.8957 10.1903 12.0269 10.2801 12.1643C10.4783 12.4676 10.7404 12.8581 10.8947 13.0255C10.9966 13.1358 11.1442 13.1922 11.2937 13.1778C11.9102 13.1182 12.6742 12.8078 13.3295 12.4152C13.9774 12.027 14.6239 11.496 14.925 10.9234C14.9624 10.8523 14.9813 10.7729 14.9801 10.6925C14.9551 9.08728 14.7613 7.39369 14.4086 5.98354C14.3003 5.55032 14.1101 4.95076 13.8805 4.38186C13.6571 3.82836 13.3725 3.24266 13.0589 2.88402C13.0214 2.84112 12.9765 2.80525 12.9264 2.77808C12.1708 2.36828 10.8907 1.91446 10.0495 1.82284C10.0074 1.81825 9.96489 1.81926 9.92305 1.82584C9.71676 1.85825 9.5391 1.96458 9.40809 2.06355C9.26977 2.16804 9.1413 2.29668 9.0304 2.42682C8.86968 2.61544 8.71437 2.84488 8.61428 3.06225C8.27237 3.03501 7.90138 3.02 7.5 3.02C7.0977 3.02 6.72593 3.03508 6.38337 3.06244C6.28328 2.84501 6.12792 2.61549 5.96716 2.42682C5.85626 2.29668 5.72778 2.16804 5.58947 2.06355C5.45846 1.96458 5.2808 1.85825 5.07451 1.82584ZM11.0181 11.5382C11.0395 11.5713 11.0615 11.6051 11.0838 11.6392C11.2169 11.843 11.3487 12.0385 11.4508 12.1809C11.8475 12.0916 12.352 11.8818 12.8361 11.5917C13.3795 11.2661 13.8098 10.8918 14.0177 10.5739C13.9852 9.06758 13.7993 7.50369 13.4773 6.21648C13.38 5.82759 13.2038 5.27021 12.9903 4.74117C12.7893 4.24326 12.5753 3.82162 12.388 3.5792C11.7376 3.24219 10.7129 2.88582 10.0454 2.78987C10.0308 2.79839 10.0113 2.81102 9.98675 2.82955C9.91863 2.881 9.84018 2.95666 9.76111 3.04945C9.71959 3.09817 9.68166 3.1471 9.64768 3.19449C9.953 3.25031 10.2253 3.3171 10.4662 3.39123C11.1499 3.6016 11.6428 3.89039 11.884 4.212C12.0431 4.42408 12.0001 4.72494 11.788 4.884C11.5759 5.04306 11.2751 5.00008 11.116 4.788C11.0572 4.70961 10.8001 4.4984 10.1838 4.30877C9.58933 4.12585 8.71356 3.98 7.5 3.98C6.28644 3.98 5.41067 4.12585 4.81616 4.30877C4.19988 4.4984 3.94279 4.70961 3.884 4.788C3.72494 5.00008 3.42408 5.04306 3.212 4.884C2.99992 4.72494 2.95694 4.42408 3.116 4.212C3.35721 3.89039 3.85011 3.6016 4.53383 3.39123C4.77418 3.31727 5.04571 3.25062 5.35016 3.19488C5.31611 3.14738 5.27808 3.09831 5.23645 3.04945C5.15738 2.95666 5.07893 2.881 5.01081 2.82955C4.98628 2.81102 4.96674 2.79839 4.95217 2.78987C4.28464 2.88582 3.25999 3.24219 2.60954 3.5792C2.42226 3.82162 2.20825 4.24326 2.00729 4.74117C1.79376 5.27021 1.61752 5.82759 1.52025 6.21648C1.19829 7.50369 1.01236 9.06758 0.97986 10.5739C1.18772 10.8918 1.61807 11.2661 2.16148 11.5917C2.64557 11.8818 3.15003 12.0916 3.5468 12.1809C3.64885 12.0385 3.78065 11.843 3.9138 11.6392C3.93626 11.6048 3.95838 11.5708 3.97996 11.5375C3.19521 11.2591 2.77361 10.8758 2.50064 10.4664C2.35359 10.2458 2.4132 9.94778 2.63377 9.80074C2.85435 9.65369 3.15236 9.71329 3.29941 9.93387C3.56077 10.3259 4.24355 11.0201 7.50002 11.0201C10.7565 11.0201 11.4392 10.326 11.7006 9.93386C11.8477 9.71329 12.1457 9.65369 12.3663 9.80074C12.5869 9.94779 12.6465 10.2458 12.4994 10.4664C12.2262 10.8762 11.8041 11.2598 11.0181 11.5382ZM4.08049 7.01221C4.32412 6.74984 4.65476 6.60162 5.00007 6.59998C5.34538 6.60162 5.67603 6.74984 5.91966 7.01221C6.16329 7.27459 6.30007 7.62974 6.30007 7.99998C6.30007 8.37021 6.16329 8.72536 5.91966 8.98774C5.67603 9.25011 5.34538 9.39833 5.00007 9.39998C4.65476 9.39833 4.32412 9.25011 4.08049 8.98774C3.83685 8.72536 3.70007 8.37021 3.70007 7.99998C3.70007 7.62974 3.83685 7.27459 4.08049 7.01221ZM9.99885 6.59998C9.65354 6.60162 9.3229 6.74984 9.07926 7.01221C8.83563 7.27459 8.69885 7.62974 8.69885 7.99998C8.69885 8.37021 8.83563 8.72536 9.07926 8.98774C9.3229 9.25011 9.65354 9.39833 9.99885 9.39998C10.3442 9.39833 10.6748 9.25011 10.9184 8.98774C11.1621 8.72536 11.2989 8.37021 11.2989 7.99998C11.2989 7.62974 11.1621 7.27459 10.9184 7.01221C10.6748 6.74984 10.3442 6.60162 9.99885 6.59998Z"
533
+ />
534
+ </symbol>
535
+
536
+ <symbol id="Chat" viewBox="0 0 15 15" fill="none">
537
+ <path
538
+ fill="currentColor"
539
+ fill-rule="evenodd"
540
+ clip-rule="evenodd"
541
+ d="M12.5 3L2.5 3.00002C1.67157 3.00002 1 3.6716 1 4.50002V9.50003C1 10.3285 1.67157 11 2.5 11H7.50003C7.63264 11 7.75982 11.0527 7.85358 11.1465L10 13.2929V11.5C10 11.2239 10.2239 11 10.5 11H12.5C13.3284 11 14 10.3285 14 9.50003V4.5C14 3.67157 13.3284 3 12.5 3ZM2.49999 2.00002L12.5 2C13.8807 2 15 3.11929 15 4.5V9.50003C15 10.8807 13.8807 12 12.5 12H11V14.5C11 14.7022 10.8782 14.8845 10.6913 14.9619C10.5045 15.0393 10.2894 14.9965 10.1464 14.8536L7.29292 12H2.5C1.11929 12 0 10.8807 0 9.50003V4.50002C0 3.11931 1.11928 2.00003 2.49999 2.00002Z"
542
+ />
543
+ </symbol>
544
+ </svg>
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./index-1cKOJFpX.js";import{E as t}from"./index-Dx5GmdYq.js";import{E as a}from"./epic-video-BDMU5eQx.js";import{G as i}from"./error-boundary-w-YmME9H.js";import{M as l,E as m}from"./mdx-DGrucPXJ.js";import{a as n}from"./misc-BvHlNnqL.js";import{P as d,u as c}from"./progress-Dn5gs-vs.js";import{u as p,L as x}from"./components-CME-nGId.js";import"./index-lG6dAghh.js";import"./request-info-CEhUGODY.js";import"./tooltip-fa2eC7LQ.js";import"./pe-CUZaIcdt.js";import"./loading-CYX0lUnA.js";import"./user-D6tTg1yS.js";import"./workshop-config-CL4F08kr.js";import"./progress-bar-C7Wl3UWv.js";function h({exercise:r}){const s=c(r.exerciseNumber);return e.jsx("li",{children:e.jsxs(x,{className:n("relative flex items-center gap-4 px-4 py-3 text-lg font-semibold transition after:absolute after:right-10 after:-translate-x-2 after:opacity-0 after:transition after:content-['→'] hover:bg-gray-50 hover:after:translate-x-0 hover:after:opacity-100 dark:hover:bg-white/5",s),to:`${r.exerciseNumber.toString().padStart(2,"0")}`,children:[e.jsx("span",{className:"text-xs font-normal tabular-nums opacity-50",children:r.exerciseNumber}),e.jsx("span",{children:r.title})]})},r.exerciseNumber)}const f={h1:()=>null};function S(){const r=p(),s=e.jsxs("ul",{className:"flex flex-col divide-y divide-border dark:divide-border/50",children:[e.jsx("strong",{className:"px-10 pb-3 font-mono text-xs uppercase",children:"Exercises"}),r.exercises.map(o=>e.jsx(h,{exercise:o},o.exerciseNumber))]});return e.jsxs("main",{className:"relative flex h-full w-full max-w-5xl flex-col justify-between border-r md:w-3/4 xl:w-2/3",children:[e.jsxs("article",{id:r.articleId,className:"shadow-on-scrollbox flex w-full flex-1 flex-col gap-12 overflow-y-scroll px-3 py-4 pt-6 scrollbar-thin scrollbar-thumb-scrollbar md:px-10 md:py-12 md:pt-16",children:[e.jsx("div",{children:e.jsx("h1",{className:"px-10 text-[clamp(3rem,6vw,7.5rem)] font-extrabold leading-none",children:r.title})}),e.jsxs("div",{className:"w-full max-w-none scroll-pt-6 border-t px-3 pt-3 md:px-10 md:pt-8",children:[e.jsx("h2",{className:"pb-5 font-mono text-xs font-semibold uppercase",children:"Intro"}),r.workshopReadme.compiled.status==="success"&&r.workshopReadme.compiled.code?e.jsx(a,{epicVideoInfosPromise:r.epicVideoInfosPromise,children:e.jsx("div",{className:"prose dark:prose-invert sm:prose-lg",children:e.jsx(l,{code:r.workshopReadme.compiled.code,components:f})})}):r.workshopReadme.compiled.status==="error"?e.jsxs("div",{className:"text-red-500",children:["There was an error:",e.jsx("pre",{children:r.workshopReadme.compiled.error})]}):"No instructions yet..."]}),e.jsx("div",{className:"pb-5 pt-10",children:r.workshopReadme.compiled.status==="success"&&r.workshopReadme.compiled.code&&r.workshopReadme.compiled.code.length>500?s:null})]}),e.jsx(t,{elementQuery:`#${r.articleId}`}),e.jsx(d,{type:"workshop-instructions",className:"h-14 border-t px-6"}),e.jsx("div",{className:"flex h-16 justify-center border-t",children:e.jsx(m,{file:r.workshopReadme.file,relativePath:r.workshopReadme.relativePath})})]})}function V(){return e.jsx(i,{})}export{V as ErrorBoundary,S as default};
2
+ //# sourceMappingURL=index-4mfbmNml.js.map