@epic-web/workshop-app 4.5.1 → 4.6.0

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 (54) hide show
  1. package/bin/epicshop.js +3 -3
  2. package/build/client/assets/_exerciseNumber-rfzZiDNa.js +2 -0
  3. package/build/client/assets/_exerciseNumber-rfzZiDNa.js.map +1 -0
  4. package/build/client/assets/_exerciseNumber_._stepNumber-C37pli7_.js.map +1 -1
  5. package/build/client/assets/_exerciseNumber_.finished-B7SgnqdS.js +2 -0
  6. package/build/client/assets/_exerciseNumber_.finished-B7SgnqdS.js.map +1 -0
  7. package/build/client/assets/_layout-BG1Jwh7V.js +2 -0
  8. package/build/client/assets/_layout-BG1Jwh7V.js.map +1 -0
  9. package/build/client/assets/_layout-CNgYirUN.js.map +1 -1
  10. package/build/client/assets/_layout-D0zbQZjf.js.map +1 -1
  11. package/build/client/assets/{diff-tDYfSlOc.js → diff-BKsbFB6w.js} +2 -2
  12. package/build/client/assets/diff-BKsbFB6w.js.map +1 -0
  13. package/build/client/assets/{diff-DZFtsH-a.js → diff-KDzcgGYL.js} +2 -2
  14. package/build/client/assets/diff-KDzcgGYL.js.map +1 -0
  15. package/build/client/assets/epic-video-BwtXsHGU.js.map +1 -1
  16. package/build/client/assets/error-boundary-Bcric_4t.js.map +1 -1
  17. package/build/client/assets/finished-BI2-0Ykt.js +2 -0
  18. package/build/client/assets/finished-BI2-0Ykt.js.map +1 -0
  19. package/build/client/assets/index-BQRtqn3g.js.map +1 -1
  20. package/build/client/assets/index-Bg9MMnnf.js.map +1 -1
  21. package/build/client/assets/manifest-c65c0481.js +1 -0
  22. package/build/client/assets/mdx-BYvGbvEr.js.map +1 -1
  23. package/build/client/assets/misc-DNgC2Frq.js.map +1 -1
  24. package/build/client/assets/og-l0sNRNKZ.js +2 -0
  25. package/build/client/assets/og-l0sNRNKZ.js.map +1 -0
  26. package/build/client/assets/presence-BJPzwbUy.js.map +1 -1
  27. package/build/client/assets/progress-CF9Xwfxf.js.map +1 -1
  28. package/build/client/assets/progress-bar-7LK87ZMh.js.map +1 -1
  29. package/build/client/assets/{root-BJrmef-V.js → root-BXq0yevS.js} +4 -4
  30. package/build/client/assets/root-BXq0yevS.js.map +1 -0
  31. package/build/client/assets/seo-CHrqghsC.js +2 -0
  32. package/build/client/assets/seo-CHrqghsC.js.map +1 -0
  33. package/build/client/img/epicweb-og-background.png +0 -0
  34. package/build/server/index.js +465 -100
  35. package/build/server/index.js.map +1 -1
  36. package/node_modules/tslib/package.json +1 -1
  37. package/node_modules/tslib/tslib.d.ts +1 -1
  38. package/node_modules/tslib/tslib.es6.js +7 -3
  39. package/node_modules/tslib/tslib.es6.mjs +10 -7
  40. package/node_modules/tslib/tslib.js +7 -4
  41. package/package.json +4 -3
  42. package/start.js +2 -2
  43. package/build/client/assets/_exerciseNumber-jTT5JRgC.js +0 -2
  44. package/build/client/assets/_exerciseNumber-jTT5JRgC.js.map +0 -1
  45. package/build/client/assets/_exerciseNumber_.finished-zgJKkJ7I.js +0 -2
  46. package/build/client/assets/_exerciseNumber_.finished-zgJKkJ7I.js.map +0 -1
  47. package/build/client/assets/_layout-CGUp6BkS.js +0 -2
  48. package/build/client/assets/_layout-CGUp6BkS.js.map +0 -1
  49. package/build/client/assets/diff-DZFtsH-a.js.map +0 -1
  50. package/build/client/assets/diff-tDYfSlOc.js.map +0 -1
  51. package/build/client/assets/finished-BSWdtBA4.js +0 -2
  52. package/build/client/assets/finished-BSWdtBA4.js.map +0 -1
  53. package/build/client/assets/manifest-03cfc48d.js +0 -1
  54. package/build/client/assets/root-BJrmef-V.js.map +0 -1
@@ -2,7 +2,7 @@
2
2
  "name": "tslib",
3
3
  "author": "Microsoft Corp.",
4
4
  "homepage": "https://www.typescriptlang.org/",
5
- "version": "2.6.2",
5
+ "version": "2.6.3",
6
6
  "license": "0BSD",
7
7
  "description": "Runtime library for TypeScript helper functions",
8
8
  "keywords": [
@@ -123,7 +123,7 @@ export declare function __generator(thisArg: any, body: Function): any;
123
123
  * Creates bindings for all enumerable properties of `m` on `exports`
124
124
  *
125
125
  * @param m The source object
126
- * @param exports The `exports` object.
126
+ * @param o The `exports` object.
127
127
  */
128
128
  export declare function __exportStar(m: any, o: any): void;
129
129
 
@@ -228,8 +228,9 @@ export function __await(v) {
228
228
  export function __asyncGenerator(thisArg, _arguments, generator) {
229
229
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
230
230
  var g = generator.apply(thisArg, _arguments || []), i, q = [];
231
- return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
232
- function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
231
+ return i = {}, verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
232
+ function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
233
+ function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
233
234
  function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
234
235
  function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
235
236
  function fulfill(value) { resume("next", value); }
@@ -295,7 +296,7 @@ export function __classPrivateFieldIn(state, receiver) {
295
296
  export function __addDisposableResource(env, value, async) {
296
297
  if (value !== null && value !== void 0) {
297
298
  if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
298
- var dispose;
299
+ var dispose, inner;
299
300
  if (async) {
300
301
  if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
301
302
  dispose = value[Symbol.asyncDispose];
@@ -303,14 +304,17 @@ export function __addDisposableResource(env, value, async) {
303
304
  if (dispose === void 0) {
304
305
  if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
305
306
  dispose = value[Symbol.dispose];
307
+ if (async) inner = dispose;
306
308
  }
307
309
  if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
310
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
308
311
  env.stack.push({ value: value, dispose: dispose, async: async });
309
312
  }
310
313
  else if (async) {
311
314
  env.stack.push({ async: true });
312
315
  }
313
316
  return value;
317
+
314
318
  }
315
319
 
316
320
  var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
@@ -228,8 +228,9 @@ export function __await(v) {
228
228
  export function __asyncGenerator(thisArg, _arguments, generator) {
229
229
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
230
230
  var g = generator.apply(thisArg, _arguments || []), i, q = [];
231
- return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
232
- function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
231
+ return i = {}, verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
232
+ function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
233
+ function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
233
234
  function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
234
235
  function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
235
236
  function fulfill(value) { resume("next", value); }
@@ -295,16 +296,18 @@ export function __classPrivateFieldIn(state, receiver) {
295
296
  export function __addDisposableResource(env, value, async) {
296
297
  if (value !== null && value !== void 0) {
297
298
  if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
298
- var dispose;
299
+ var dispose, inner;
299
300
  if (async) {
300
- if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
301
- dispose = value[Symbol.asyncDispose];
301
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
302
+ dispose = value[Symbol.asyncDispose];
302
303
  }
303
304
  if (dispose === void 0) {
304
- if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
305
- dispose = value[Symbol.dispose];
305
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
306
+ dispose = value[Symbol.dispose];
307
+ if (async) inner = dispose;
306
308
  }
307
309
  if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
310
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
308
311
  env.stack.push({ value: value, dispose: dispose, async: async });
309
312
  }
310
313
  else if (async) {
@@ -276,10 +276,11 @@ var __disposeResources;
276
276
  __asyncGenerator = function (thisArg, _arguments, generator) {
277
277
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
278
278
  var g = generator.apply(thisArg, _arguments || []), i, q = [];
279
- return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
280
- function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
279
+ return i = {}, verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
280
+ function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
281
+ function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
281
282
  function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
282
- function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
283
+ function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
283
284
  function fulfill(value) { resume("next", value); }
284
285
  function reject(value) { resume("throw", value); }
285
286
  function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
@@ -343,7 +344,7 @@ var __disposeResources;
343
344
  __addDisposableResource = function (env, value, async) {
344
345
  if (value !== null && value !== void 0) {
345
346
  if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
346
- var dispose;
347
+ var dispose, inner;
347
348
  if (async) {
348
349
  if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
349
350
  dispose = value[Symbol.asyncDispose];
@@ -351,8 +352,10 @@ var __disposeResources;
351
352
  if (dispose === void 0) {
352
353
  if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
353
354
  dispose = value[Symbol.dispose];
355
+ if (async) inner = dispose;
354
356
  }
355
357
  if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
358
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
356
359
  env.stack.push({ value: value, dispose: dispose, async: async });
357
360
  }
358
361
  else if (async) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@epic-web/workshop-app",
3
- "version": "4.5.1",
3
+ "version": "4.6.0",
4
4
  "sideEffects": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -44,8 +44,8 @@
44
44
  "@epic-web/invariant": "^1.0.0",
45
45
  "@epic-web/remember": "^1.0.2",
46
46
  "@epic-web/restore-scroll": "^1.1.1",
47
- "@epic-web/workshop-presence": "4.5.1",
48
- "@epic-web/workshop-utils": "4.5.1",
47
+ "@epic-web/workshop-presence": "4.6.0",
48
+ "@epic-web/workshop-utils": "4.6.0",
49
49
  "@mdx-js/mdx": "^3.0.1",
50
50
  "@mux/mux-player-react": "^2.6.0",
51
51
  "@paralleldrive/cuid2": "^2.2.2",
@@ -63,6 +63,7 @@
63
63
  "@sindresorhus/slugify": "^2.2.1",
64
64
  "@types/chai": "^4.3.16",
65
65
  "@types/chai-dom": "^1.11.3",
66
+ "@vercel/og": "^0.6.2",
66
67
  "address": "^2.0.2",
67
68
  "ansi-to-html": "^0.7.2",
68
69
  "chai": "^5.1.1",
package/start.js CHANGED
@@ -30,13 +30,13 @@ if (packageJson.epicshop.githubRoot) {
30
30
  }
31
31
 
32
32
  if (process.env.NODE_ENV === 'production') {
33
- await import('./dist/server/index.js').catch(err => {
33
+ await import('./dist/server/index.js').catch((err) => {
34
34
  console.error('Encountered error importing the server, exiting...')
35
35
  console.error(err)
36
36
  process.exit(1)
37
37
  })
38
38
  } else {
39
- await import('./server/index.ts').catch(err => {
39
+ await import('./server/index.ts').catch((err) => {
40
40
  console.error('Encountered error importing the server, exiting...')
41
41
  console.error(err)
42
42
  process.exit(1)
@@ -1,2 +0,0 @@
1
- import{j as r,a as n,i as c}from"./index-D6ygCrVn.js";import{E as a}from"./index-9nNr0Zqr.js";import{E as d}from"./epic-video-BwtXsHGU.js";import{M as m,E as p}from"./mdx-BYvGbvEr.js";import{P as x}from"./progress-CF9Xwfxf.js";import{g as u}from"./misc-DNgC2Frq.js";import{u as f,L as h}from"./components-C5xBZAiL.js";import"./index-Bg9MMnnf.js";import"./request-info-Dyls4H67.js";import"./tooltip-Kw0lYWBI.js";import"./client-hints-BKxdo5Js.js";import"./loading-C9f_vBoM.js";import"./clsx-B-dksMZM.js";import"./progress-bar-7LK87ZMh.js";const C=({data:e,matches:o})=>{var i;if(!e)return[{title:"📝 | Error"}];const s=e.exercise.exerciseNumber.toString().padStart(2,"0"),t=(i=o.find(l=>l.id==="root"))==null?void 0:i.data;return[{title:`📝 | ${s}. ${e.exercise.title} | ${t==null?void 0:t.workshopTitle}`}]},b={h1:()=>null};function M(){var t;const e=f(),s=`${String(((t=e.firstStep)==null?void 0:t.stepNumber)??"01").padStart(2,"0")}/${e.firstType}`;return r.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:[r.jsxs("article",{id:e.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:[r.jsx("div",{children:r.jsx("h1",{className:"text-[clamp(3rem,6vw,8.5rem)] font-extrabold leading-none",children:e.exercise.title})}),r.jsx("div",{children:e.exercise.instructionsCode?r.jsx(d,{epicVideoInfosPromise:e.epicVideoInfosPromise,children:r.jsx("div",{className:"prose dark:prose-invert sm:prose-lg",children:r.jsx(m,{code:e.exercise.instructionsCode,components:b})})}):"No instructions yet..."})]},e.articleId),r.jsx(a,{elementQuery:`#${e.articleId}`},`scroll-${e.articleId}`),r.jsx(x,{type:"instructions",exerciseNumber:e.exerciseNumber,className:"h-14 border-t px-6"}),r.jsxs("div",{className:"flex h-16 justify-between border-b-4 border-t lg:border-b-0",children:[r.jsx("div",{}),r.jsx(p,{file:e.exerciseReadme.file,relativePath:e.exerciseReadme.relativePath}),r.jsx(h,{to:s,prefetch:"intent",className:"flex h-full items-center justify-center bg-foreground px-7 text-background",children:"Start Learning"})]})]})}function T(){const e=n();return typeof document<"u"&&console.error(e),c(e)?e.status===404?r.jsx("p",{children:"Sorry, we couldn't find that step."}):r.jsxs("p",{children:[e.status," ",e.data]}):r.jsx("p",{children:u(e)})}export{T as ErrorBoundary,M as default,C as meta};
2
- //# sourceMappingURL=_exerciseNumber-jTT5JRgC.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_exerciseNumber-jTT5JRgC.js","sources":["../../../app/routes/_app+/_exercises+/$exerciseNumber.tsx"],"sourcesContent":["import path from 'path'\nimport { invariantResponse } from '@epic-web/invariant'\nimport { ElementScrollRestoration } from '@epic-web/restore-scroll'\nimport {\n\tgetExercises,\n\tgetWorkshopRoot,\n\tgetWorkshopTitle,\n} from '@epic-web/workshop-utils/apps.server'\nimport {\n\tcombineServerTimings,\n\tgetServerTimeHeader,\n\tmakeTimings,\n\ttime,\n} from '@epic-web/workshop-utils/timing.server'\nimport {\n\tdefer,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n\ttype MetaFunction,\n} from '@remix-run/node'\nimport {\n\tLink,\n\tisRouteErrorResponse,\n\tuseLoaderData,\n\tuseRouteError,\n} from '@remix-run/react'\nimport slugify from '@sindresorhus/slugify'\nimport { EpicVideoInfoProvider } from '#app/components/epic-video.tsx'\nimport { type loader as rootLoader } from '#app/root.tsx'\nimport { EditFileOnGitHub } from '#app/routes/launch-editor.tsx'\nimport { ProgressToggle } from '#app/routes/progress.tsx'\nimport { getEpicVideoInfos } from '#app/utils/epic-api.ts'\nimport { Mdx } from '#app/utils/mdx.tsx'\nimport { getErrorMessage } from '#app/utils/misc.tsx'\n\nexport const meta: MetaFunction<typeof loader, { root: typeof rootLoader }> = ({\n\tdata,\n\tmatches,\n}) => {\n\tif (!data) {\n\t\treturn [{ title: '📝 | Error' }]\n\t}\n\tconst number = data.exercise.exerciseNumber.toString().padStart(2, '0')\n\n\tconst rootData = matches.find(m => m.id === 'root')?.data\n\treturn [\n\t\t{\n\t\t\ttitle: `📝 | ${number}. ${data.exercise.title} | ${rootData?.workshopTitle}`,\n\t\t},\n\t]\n}\n\nexport async function loader({ request, params }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('exerciseNumberLoader')\n\tinvariantResponse(params.exerciseNumber, 'exerciseNumber is required')\n\tconst [exercises, workshopTitle] = await Promise.all([\n\t\ttime(() => getExercises({ request, timings }), {\n\t\t\ttimings,\n\t\t\ttype: 'getExercises',\n\t\t\tdesc: 'getExercises in $exerciseNumber.tsx',\n\t\t}),\n\t\ttime(() => getWorkshopTitle(), {\n\t\t\ttimings,\n\t\t\ttype: 'getWorkshopTitle',\n\t\t\tdesc: 'getWorkshopTitle in $exerciseNumber.tsx',\n\t\t}),\n\t])\n\tconst exercise = exercises.find(\n\t\te => e.exerciseNumber === Number(params.exerciseNumber),\n\t)\n\tif (!exercise) {\n\t\tthrow new Response('Not found', { status: 404 })\n\t}\n\n\tconst readmeFilepath = path.join(\n\t\tgetWorkshopRoot(),\n\t\t'exercises',\n\t\texercise.dirName,\n\t\t'README.mdx',\n\t)\n\n\tconst firstStep = exercise.steps.find(Boolean)\n\n\tconst articleId = `workshop-${slugify(workshopTitle)}-${\n\t\texercise.exerciseNumber\n\t}-instructions`\n\n\treturn defer(\n\t\t{\n\t\t\tarticleId,\n\t\t\texercise,\n\t\t\texerciseNumber: exercise.exerciseNumber,\n\t\t\texerciseReadme: {\n\t\t\t\tfile: readmeFilepath,\n\t\t\t\trelativePath: `exercises/${exercise.dirName}`,\n\t\t\t},\n\t\t\texerciseTitle: exercise.title,\n\t\t\tfirstStep,\n\t\t\tfirstType: firstStep?.problem ? 'problem' : 'solution',\n\t\t\ttitle: workshopTitle,\n\t\t\tepicVideoInfosPromise: getEpicVideoInfos(\n\t\t\t\texercise.instructionsEpicVideoEmbeds,\n\t\t\t\t{ request },\n\t\t\t),\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 }\nexport default function ExerciseNumberRoute() {\n\tconst data = useLoaderData<typeof loader>()\n\n\tconst firstStepNumber = String(data.firstStep?.stepNumber ?? '01')\n\tconst firstStepPath = `${firstStepNumber.padStart(2, '0')}/${data.firstType}`\n\treturn (\n\t\t<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\">\n\t\t\t<article\n\t\t\t\tid={data.articleId}\n\t\t\t\tkey={data.articleId}\n\t\t\t\tclassName=\"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\"\n\t\t\t>\n\t\t\t\t<div>\n\t\t\t\t\t<h1 className=\"text-[clamp(3rem,6vw,8.5rem)] font-extrabold leading-none\">\n\t\t\t\t\t\t{data.exercise.title}\n\t\t\t\t\t</h1>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t{data.exercise.instructionsCode ? (\n\t\t\t\t\t\t<EpicVideoInfoProvider\n\t\t\t\t\t\t\tepicVideoInfosPromise={data.epicVideoInfosPromise}\n\t\t\t\t\t\t>\n\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<Mdx\n\t\t\t\t\t\t\t\t\tcode={data.exercise.instructionsCode}\n\t\t\t\t\t\t\t\t\tcomponents={mdxComponents}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</EpicVideoInfoProvider>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t'No instructions yet...'\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</article>\n\t\t\t<ElementScrollRestoration\n\t\t\t\telementQuery={`#${data.articleId}`}\n\t\t\t\tkey={`scroll-${data.articleId}`}\n\t\t\t/>\n\t\t\t<ProgressToggle\n\t\t\t\ttype=\"instructions\"\n\t\t\t\texerciseNumber={data.exerciseNumber}\n\t\t\t\tclassName=\"h-14 border-t px-6\"\n\t\t\t/>\n\t\t\t<div className=\"flex h-16 justify-between border-b-4 border-t lg:border-b-0\">\n\t\t\t\t<div />\n\t\t\t\t<EditFileOnGitHub\n\t\t\t\t\tfile={data.exerciseReadme.file}\n\t\t\t\t\trelativePath={data.exerciseReadme.relativePath}\n\t\t\t\t/>\n\t\t\t\t<Link\n\t\t\t\t\tto={firstStepPath}\n\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\tclassName=\"flex h-full items-center justify-center bg-foreground px-7 text-background\"\n\t\t\t\t>\n\t\t\t\t\tStart Learning\n\t\t\t\t</Link>\n\t\t\t</div>\n\t\t</main>\n\t)\n}\n\nexport function ErrorBoundary() {\n\tconst error = useRouteError()\n\n\tif (typeof document !== 'undefined') {\n\t\tconsole.error(error)\n\t}\n\n\treturn isRouteErrorResponse(error) ? (\n\t\terror.status === 404 ? (\n\t\t\t<p>Sorry, we couldn't find that step.</p>\n\t\t) : (\n\t\t\t<p>\n\t\t\t\t{error.status} {error.data}\n\t\t\t</p>\n\t\t)\n\t) : (\n\t\t<p>{getErrorMessage(error)}</p>\n\t)\n}\n"],"names":["meta","data","matches","title","number","exercise","exerciseNumber","toString","padStart","rootData","find","m","id","workshopTitle","mdxComponents","h1","ExerciseNumberRoute","useLoaderData","firstStepPath","String","firstStep","stepNumber","firstType","jsxs","className","children","articleId","jsx","instructionsCode","EpicVideoInfoProvider","epicVideoInfosPromise","Mdx","code","components","ElementScrollRestoration","elementQuery","ProgressToggle","type","EditFileOnGitHub","file","exerciseReadme","relativePath","Link","to","prefetch","ErrorBoundary","error","useRouteError","document","console","isRouteErrorResponse","status","getErrorMessage"],"mappings":"0hBAmCO,MAAMA,EAAiEA,CAAC,CAC9EC,KAAAA,EACAC,QAAAA,CACD,IAAM,OACL,GAAI,CAACD,EACJ,MAAO,CAAC,CAAEE,MAAO,YAAa,CAAC,EAE1B,MAAAC,EAASH,EAAKI,SAASC,eAAeC,WAAWC,SAAS,EAAG,GAAG,EAEhEC,GAAWP,EAAAA,EAAQQ,QAAUC,EAAEC,KAAO,MAAM,IAAjCV,YAAAA,EAAoCD,KAC9C,MAAA,CACN,CACCE,MAAO,QAAQC,CAAM,KAAKH,EAAKI,SAASF,KAAK,MAAMM,GAAAA,YAAAA,EAAUI,aAAa,EAC3E,CAAA,CAEF,EAuEMC,EAAgB,CAAEC,GAAIA,IAAM,IAAK,EACvC,SAAwBC,GAAsB,OAC7C,MAAMf,EAAOgB,IAGPC,EAAgB,GADEC,SAAOlB,EAAAA,EAAKmB,YAALnB,YAAAA,EAAgBoB,aAAc,IAAI,EACxBb,SAAS,EAAG,GAAG,CAAC,IAAIP,EAAKqB,SAAS,GAE1E,OAAAC,EAAAA,KAAC,OAAK,CAAAC,UAAU,4FACfC,SAAA,CAAAF,EAAA,KAAC,UAAA,CACAX,GAAIX,EAAKyB,UAETF,UAAU,8JAEVC,SAAA,CAACE,EAAA,IAAA,MAAA,CACAF,eAAC,KAAG,CAAAD,UAAU,4DACZC,SAAKxB,EAAAI,SAASF,MAChB,CACD,CAAA,EACCwB,EAAA,IAAA,MAAA,CACCF,SAAKxB,EAAAI,SAASuB,iBACdD,EAAAA,IAACE,EAAA,CACAC,sBAAuB7B,EAAK6B,sBAE5BL,SAAAE,EAAA,IAAC,MAAI,CAAAH,UAAU,sCACdC,SAAAE,EAAA,IAACI,EAAA,CACAC,KAAM/B,EAAKI,SAASuB,iBACpBK,WAAYnB,EACb,EACD,CACD,CAAA,EAEA,wBAEF,CAAA,CAAA,CAAA,EAvBKb,EAAKyB,SAwBX,EACAC,EAAAA,IAACO,EAAA,CACAC,aAAc,IAAIlC,EAAKyB,SAAS,EAAA,EAC3B,UAAUzB,EAAKyB,SAAS,EAC9B,EACAC,EAAA,IAACS,EAAA,CACAC,KAAK,eACL/B,eAAgBL,EAAKK,eACrBkB,UAAU,oBAAA,CACX,EACAD,EAAA,KAAC,MAAI,CAAAC,UAAU,8DACdC,SAAA,CAAAE,EAAAA,IAAC,MAAI,CAAA,CAAA,EACLA,EAAA,IAACW,EAAA,CACAC,KAAMtC,EAAKuC,eAAeD,KAC1BE,aAAcxC,EAAKuC,eAAeC,YAAA,CACnC,EACAd,EAAA,IAACe,EAAA,CACAC,GAAIzB,EACJ0B,SAAS,SACTpB,UAAU,6EACVC,SAAA,gBAAA,CAED,CAAA,CACD,CAAA,CAAA,CACD,CAAA,CAEF,CAEO,SAASoB,GAAgB,CAC/B,MAAMC,EAAQC,IAEV,OAAA,OAAOC,SAAa,KACvBC,QAAQH,MAAMA,CAAK,EAGbI,EAAqBJ,CAAK,EAChCA,EAAMK,SAAW,IAChBxB,EAAA,IAAC,IAAE,CAAAF,SAAA,oCAAA,CAAkC,EAErCF,EAAA,KAAC,IACC,CAAAE,SAAA,CAAMqB,EAAAK,OAAO,IAAEL,EAAM7C,IAAA,CAAA,CACvB,EAGD0B,EAAA,IAAC,IAAG,CAAAF,SAAA2B,EAAgBN,CAAK,CAAE,CAAA,CAE7B"}
@@ -1,2 +0,0 @@
1
- import{j as e,r as a}from"./index-D6ygCrVn.js";import{E as n}from"./index-9nNr0Zqr.js";import{E as c}from"./epic-video-BwtXsHGU.js";import{L as d}from"./loading-C9f_vBoM.js";import{N as x}from"./nav-chevrons-DOYtx9XE.js";import{M as m,E as p}from"./mdx-BYvGbvEr.js";import{P as f}from"./progress-CF9Xwfxf.js";import{c as h}from"./misc-DNgC2Frq.js";import{u,L as j}from"./components-C5xBZAiL.js";import"./index-Bg9MMnnf.js";import"./request-info-Dyls4H67.js";import"./tooltip-Kw0lYWBI.js";import"./client-hints-BKxdo5Js.js";import"./clsx-B-dksMZM.js";import"./progress-bar-7LK87ZMh.js";const M=({data:r,matches:s})=>{var o;if(!r)return[{title:"🦉 | Error"}];const t=r.exercise.exerciseNumber.toString().padStart(2,"0"),i=(o=s.find(l=>l.id==="root"))==null?void 0:o.data;return[{title:`🦉 | ${t}. ${r.exercise.title} | ${i==null?void 0:i.workshopTitle}`}]},b={h1:()=>null};function R(){const r=u(),s=r.exercise.exerciseNumber.toString().padStart(2,"0");return e.jsx("div",{className:"flex 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(j,{to:`/${s}`,className:"hover:underline",children:`${s}. ${r.exercise.title}`}),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-10 pt-8 scrollbar-thin scrollbar-thumb-scrollbar",id:r.articleId,children:r.exercise.finishedCode?e.jsx(c,{epicVideoInfosPromise:r.epicVideoInfosPromise,children:e.jsx("div",{className:"prose dark:prose-invert sm:prose-lg",children:e.jsx(m,{code:r.exercise.finishedCode,components:b})})}):"No finished instructions yet..."}),e.jsx(n,{elementQuery:`#${r.articleId}`}),e.jsx(f,{type:"finished",exerciseNumber:r.exercise.exerciseNumber,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",{}),r.exerciseFinished?e.jsx(p,{file:r.exerciseFinished.file,relativePath:r.exerciseFinished.relativePath}):null,e.jsx(x,{prev:r.prevStepLink,next:r.nextStepLink})]})]}),e.jsx(g,{exerciseFormEmbedUrl:r.exerciseFormEmbedUrl,exerciseTitle:r.exercise.title})]})})}function g({exerciseFormEmbedUrl:r,exerciseTitle:s}){const[t,i]=a.useState(!1);return e.jsxs("div",{className:"relative flex-shrink-0",children:[t?null:e.jsx("div",{className:"absolute inset-0 z-10 flex items-center justify-center",children:e.jsx(d,{children:e.jsxs("span",{children:["Loading ",s," Elaboration form"]})})}),e.jsx("iframe",{onLoad:()=>i(!0),title:"Elaboration",src:r,className:h("absolute inset-0 flex h-full w-full transition-opacity duration-300",t?"opacity-100":"opacity-0")})]})}export{R as default,M as meta};
2
- //# sourceMappingURL=_exerciseNumber_.finished-zgJKkJ7I.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_exerciseNumber_.finished-zgJKkJ7I.js","sources":["../../../app/routes/_app+/_exercises+/$exerciseNumber_.finished.tsx"],"sourcesContent":["import path from 'path'\nimport { invariantResponse } from '@epic-web/invariant'\nimport { ElementScrollRestoration } from '@epic-web/restore-scroll'\nimport {\n\tgetAppPageRoute,\n\tgetApps,\n\tgetExercise,\n\tgetWorkshopRoot,\n\tgetWorkshopTitle,\n\tisExerciseStepApp,\n} from '@epic-web/workshop-utils/apps.server'\nimport {\n\tcombineServerTimings,\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport { getPkgProp } from '@epic-web/workshop-utils/utils.server'\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 { EditFileOnGitHub } from '#app/routes/launch-editor.tsx'\nimport { ProgressToggle } from '#app/routes/progress.tsx'\nimport { getEpicVideoInfos } from '#app/utils/epic-api.ts'\nimport { Mdx } from '#app/utils/mdx.tsx'\nimport { cn } from '#app/utils/misc.tsx'\n\nexport const meta: MetaFunction<typeof loader, { root: typeof rootLoader }> = ({\n\tdata,\n\tmatches,\n}) => {\n\tif (!data) {\n\t\treturn [{ title: '🦉 | Error' }]\n\t}\n\tconst number = data.exercise.exerciseNumber.toString().padStart(2, '0')\n\n\tconst rootData = matches.find(m => m.id === 'root')?.data\n\treturn [\n\t\t{\n\t\t\ttitle: `🦉 | ${number}. ${data.exercise.title} | ${rootData?.workshopTitle}`,\n\t\t},\n\t]\n}\n\nexport async function loader({ request, params }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('exerciseFinishedLoader')\n\tinvariantResponse(params.exerciseNumber, 'exerciseNumber is required')\n\tconst exercise = await getExercise(params.exerciseNumber, {\n\t\ttimings,\n\t\trequest,\n\t})\n\tif (!exercise) {\n\t\tthrow new Response('Not found', { status: 404 })\n\t}\n\tconst workshopTitle = await getWorkshopTitle()\n\tconst workshopRoot = getWorkshopRoot()\n\tconst exerciseFormTemplate = await getPkgProp(\n\t\tworkshopRoot,\n\t\t'epicshop.forms.exercise',\n\t\t`https://docs.google.com/forms/d/e/1FAIpQLSf3o9xyjQepTlOTH5Z7ZwkeSTdXh6YWI_RGc9KiyD3oUN0p6w/viewform?hl=en&embedded=true&entry.1836176234={workshopTitle}&entry.428900931={exerciseTitle}`,\n\t)\n\tconst exerciseFormEmbedUrl = exerciseFormTemplate\n\t\t.replace('{workshopTitle}', encodeURIComponent(workshopTitle))\n\t\t.replace('{exerciseTitle}', encodeURIComponent(exercise.title))\n\tconst nextExercise = await getExercise(exercise.exerciseNumber + 1, {\n\t\ttimings,\n\t\trequest,\n\t})\n\n\tconst finishedFilepath = path.join(\n\t\tgetWorkshopRoot(),\n\t\t'exercises',\n\t\texercise.dirName,\n\t\t'FINISHED.mdx',\n\t)\n\n\tconst apps = await getApps({ request, timings })\n\tconst exerciseApps = apps\n\t\t.filter(isExerciseStepApp)\n\t\t.filter(app => app.exerciseNumber === exercise.exerciseNumber)\n\tconst prevApp = exerciseApps[exerciseApps.length - 1]\n\n\tconst articleId = `workshop-${slugify(workshopTitle)}-${\n\t\texercise.exerciseNumber\n\t}-finished`\n\n\treturn defer(\n\t\t{\n\t\t\tarticleId,\n\t\t\tworkshopTitle,\n\t\t\texercise,\n\t\t\texerciseFormEmbedUrl,\n\t\t\tepicVideoInfosPromise: getEpicVideoInfos(\n\t\t\t\texercise.finishedEpicVideoEmbeds,\n\t\t\t\t{ request },\n\t\t\t),\n\t\t\texerciseFinished: exercise.finishedCode\n\t\t\t\t? {\n\t\t\t\t\t\tfile: finishedFilepath,\n\t\t\t\t\t\trelativePath: `exercises/${exercise.dirName}/FINISHED.mdx`,\n\t\t\t\t\t}\n\t\t\t\t: null,\n\t\t\tprevStepLink: prevApp\n\t\t\t\t? {\n\t\t\t\t\t\tto: getAppPageRoute(prevApp),\n\t\t\t\t\t\t'aria-label': `${prevApp.title} (${prevApp.type})`,\n\t\t\t\t\t}\n\t\t\t\t: null,\n\t\t\tnextStepLink: nextExercise\n\t\t\t\t? {\n\t\t\t\t\t\tto: `/${nextExercise.exerciseNumber.toString().padStart(2, '0')}`,\n\t\t\t\t\t\t'aria-label': `${nextExercise.title}`,\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tto: '/finished',\n\t\t\t\t\t\t'aria-label': 'Finished! 🎉',\n\t\t\t\t\t},\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 }\nexport default function ExerciseFinished() {\n\tconst data = useLoaderData<typeof loader>()\n\tconst exerciseNumber = data.exercise.exerciseNumber\n\t\t.toString()\n\t\t.padStart(2, '0')\n\n\treturn (\n\t\t<div className=\"flex 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={`/${exerciseNumber}`} className=\"hover:underline\">\n\t\t\t\t\t\t\t\t\t{`${exerciseNumber}. ${data.exercise.title}`}\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\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-10 pt-8 scrollbar-thin scrollbar-thumb-scrollbar\"\n\t\t\t\t\t\tid={data.articleId}\n\t\t\t\t\t>\n\t\t\t\t\t\t{data.exercise.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\n\t\t\t\t\t\t\t\t\t\tcode={data.exercise.finishedCode}\n\t\t\t\t\t\t\t\t\t\tcomponents={mdxComponents}\n\t\t\t\t\t\t\t\t\t/>\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=\"finished\"\n\t\t\t\t\t\texerciseNumber={data.exercise.exerciseNumber}\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.exerciseFinished ? (\n\t\t\t\t\t\t\t<EditFileOnGitHub\n\t\t\t\t\t\t\t\tfile={data.exerciseFinished.file}\n\t\t\t\t\t\t\t\trelativePath={data.exerciseFinished.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={data.nextStepLink} />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<Survey\n\t\t\t\t\texerciseFormEmbedUrl={data.exerciseFormEmbedUrl}\n\t\t\t\t\texerciseTitle={data.exercise.title}\n\t\t\t\t/>\n\t\t\t</main>\n\t\t</div>\n\t)\n}\n\nfunction Survey({\n\texerciseFormEmbedUrl,\n\texerciseTitle,\n}: {\n\texerciseFormEmbedUrl: string\n\texerciseTitle: 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 {exerciseTitle} 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\ttitle=\"Elaboration\"\n\t\t\t\tsrc={exerciseFormEmbedUrl}\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":["meta","data","matches","title","number","exercise","exerciseNumber","toString","padStart","rootData","find","m","id","workshopTitle","mdxComponents","h1","ExerciseFinished","useLoaderData","className","children","jsxs","jsx","Link","to","articleId","finishedCode","EpicVideoInfoProvider","epicVideoInfosPromise","Mdx","code","components","ElementScrollRestoration","elementQuery","ProgressToggle","type","exerciseFinished","EditFileOnGitHub","file","relativePath","NavChevrons","prev","prevStepLink","next","nextStepLink","Survey","exerciseFormEmbedUrl","exerciseTitle","iframeLoaded","setIframeLoaded","React","Loading","onLoad","src","cn"],"mappings":"ykBAoCO,MAAMA,EAAiEA,CAAC,CAC9EC,KAAAA,EACAC,QAAAA,CACD,IAAM,OACL,GAAI,CAACD,EACJ,MAAO,CAAC,CAAEE,MAAO,YAAa,CAAC,EAE1B,MAAAC,EAASH,EAAKI,SAASC,eAAeC,WAAWC,SAAS,EAAG,GAAG,EAEhEC,GAAWP,EAAAA,EAAQQ,QAAUC,EAAEC,KAAO,MAAM,IAAjCV,YAAAA,EAAoCD,KAC9C,MAAA,CACN,CACCE,MAAO,QAAQC,CAAM,KAAKH,EAAKI,SAASF,KAAK,MAAMM,GAAAA,YAAAA,EAAUI,aAAa,EAC3E,CAAA,CAEF,EA4FMC,EAAgB,CAAEC,GAAIA,IAAM,IAAK,EACvC,SAAwBC,GAAmB,CAC1C,MAAMf,EAAOgB,IACPX,EAAiBL,EAAKI,SAASC,eACnCC,WACAC,SAAS,EAAG,GAAG,EAEjB,aACE,MAAI,CAAAU,UAAU,0BACdC,SAACC,EAAA,KAAA,OAAA,CAAKF,UAAU,8EACfC,SAAA,CAACC,EAAA,KAAA,MAAA,CAAIF,UAAU,kEACdC,SAAA,CAACE,EAAA,IAAA,KAAA,CAAGH,UAAU,sEACbC,SAACE,EAAA,IAAA,MAAA,CAAIH,UAAU,gEACdC,SAAAC,EAAA,KAAC,MAAI,CAAAF,UAAU,0CACdC,SAAA,CAAAE,EAAA,IAACC,EAAK,CAAAC,GAAI,IAAIjB,CAAc,GAAIY,UAAU,kBACxCC,SAAA,GAAGb,CAAc,KAAKL,EAAKI,SAASF,KAAK,EAC3C,CAAA,EACAkB,EAAA,IAAC,QAAKF,SAAC,GAAA,CAAA,EACPE,EAAA,IAAC,QAAKF,SAAW,aAAA,CAAA,CAAA,EAClB,EACD,CACD,CAAA,EAEAE,EAAA,IAAC,UAAA,CACAH,UAAU,+IACVN,GAAIX,EAAKuB,UAERL,SAAAlB,EAAKI,SAASoB,aACdJ,EAAAA,IAACK,EAAA,CACAC,sBAAuB1B,EAAK0B,sBAE5BR,SAAAE,EAAA,IAAC,MAAI,CAAAH,UAAU,sCACdC,SAAAE,EAAA,IAACO,EAAA,CACAC,KAAM5B,EAAKI,SAASoB,aACpBK,WAAYhB,EACb,EACD,CAAA,CACD,EAGA,iCAAA,CAEF,QACCiB,EAAyB,CAAAC,aAAc,IAAI/B,EAAKuB,SAAS,EAAI,CAAA,EAC9DH,EAAA,IAACY,EAAA,CACAC,KAAK,WACL5B,eAAgBL,EAAKI,SAASC,eAC9BY,UAAU,oBAAA,CACX,EACAE,EAAA,KAAC,MAAI,CAAAF,UAAU,8DACdC,SAAA,CAAAE,EAAA,IAAC,MAAI,CAAA,CAAA,EACJpB,EAAKkC,iBACLd,EAAA,IAACe,EAAA,CACAC,KAAMpC,EAAKkC,iBAAiBE,KAC5BC,aAAcrC,EAAKkC,iBAAiBG,aACrC,EACG,WACHC,EAAY,CAAAC,KAAMvC,EAAKwC,aAAcC,KAAMzC,EAAK0C,YAAc,CAAA,CAAA,CAChE,CAAA,CAAA,CACD,CAAA,EACAtB,EAAA,IAACuB,EAAA,CACAC,qBAAsB5C,EAAK4C,qBAC3BC,cAAe7C,EAAKI,SAASF,KAAA,CAC9B,CAAA,EACD,CACD,CAAA,CAEF,CAEA,SAASyC,EAAO,CACfC,qBAAAA,EACAC,cAAAA,CACD,EAGG,CACF,KAAM,CAACC,EAAcC,CAAe,EAAIC,WAAe,EAAK,EAE3D,OAAA7B,EAAAA,KAAC,MAAI,CAAAF,UAAU,yBACbC,SAAA,CAAC4B,EAME,WALF,MAAI,CAAA7B,UAAU,yDACdC,SAACE,EAAA,IAAA6B,EAAA,CACA/B,gBAAC,OAAK,CAAAA,SAAA,CAAA,WAAS2B,EAAc,mBAAA,EAAiB,EAC/C,EACD,EAEDzB,EAAA,IAAC,SAAA,CACA8B,OAAQA,IAAMH,EAAgB,EAAI,EAClC7C,MAAM,cACNiD,IAAKP,EACL3B,UAAWmC,EACV,sEACAN,EAAe,cAAgB,WAChC,CAAA,CACD,CAAA,CACD,CAAA,CAEF"}
@@ -1,2 +0,0 @@
1
- import{r as c,j as e,g as me,h as xe,d as ht}from"./index-D6ygCrVn.js";import{E as mt}from"./index-9nNr0Zqr.js";import{$ as Ne,_ as B,d as Se,e as Pe,f as xt,g as te,h as z,i as Ee,j as Ce,S as K,T as bt,a as fe,b as pe,c as he,k as Ye,l as gt,m as vt,n as $t,o as jt,p as wt}from"./tooltip-Kw0lYWBI.js";import{$ as yt,a as Be,b as Nt,c as St,d as Pt,e as Et,f as Ct,g as Tt,h as Dt,i as Ot,j as Rt,k as kt,l as _t,m as Mt,n as It,o as Ft,p as Lt,A as At,q as Ut,r as Ht,R as Yt,s as Bt,t as Vt,D as zt}from"./diff-tDYfSlOc.js";import{c as ee}from"./clsx-B-dksMZM.js";import{G as Gt}from"./error-boundary-Bcric_4t.js";import{N as Kt}from"./nav-chevrons-DOYtx9XE.js";import{M as Wt,L as le,E as Zt}from"./mdx-BYvGbvEr.js";import{P as qt}from"./progress-CF9Xwfxf.js";import{I as O,u as Te,a as De,c as ve,b as Oe}from"./misc-DNgC2Frq.js";import{s as Re}from"./progress-bar-7LK87ZMh.js";import{a as W,u as Z,A as Ve,L as ae,c as ke,F as Qt}from"./components-C5xBZAiL.js";import{L as ze}from"./loading-C9f_vBoM.js";import{u as Jt}from"./client-hints-BKxdo5Js.js";import{D as Xt,u as en}from"./discord-0kv66Q6F.js";import{A as tn}from"./index-r90CY6Wk.js";import{z as h,u as _e}from"./request-info-Dyls4H67.js";import{B as Ge}from"./button-BfWwrI9B.js";import{E as nn}from"./epic-video-BwtXsHGU.js";import{u as rn}from"./use-event-source-aW6X9lN1.js";import"./user-73ocDYRe.js";import"./index-Bg9MMnnf.js";const ge="rovingFocusGroup.onEntryFocus",sn={bubbles:!1,cancelable:!0},Me="RovingFocusGroup",[$e,Ke,an]=yt(Me),[on,We]=Ne(Me,[an]),[cn,ln]=on(Me),un=c.forwardRef((t,s)=>c.createElement($e.Provider,{scope:t.__scopeRovingFocusGroup},c.createElement($e.Slot,{scope:t.__scopeRovingFocusGroup},c.createElement(dn,B({},t,{ref:s}))))),dn=c.forwardRef((t,s)=>{const{__scopeRovingFocusGroup:n,orientation:r,loop:a=!1,dir:o,currentTabStopId:i,defaultCurrentTabStopId:u,onCurrentTabStopIdChange:l,onEntryFocus:x,...d}=t,m=c.useRef(null),b=Se(s,m),y=Be(o),[S=null,f]=Pe({prop:i,defaultProp:u,onChange:l}),[P,C]=c.useState(!1),v=xt(x),D=Ke(n),L=c.useRef(!1),[R,I]=c.useState(0);return c.useEffect(()=>{const k=m.current;if(k)return k.addEventListener(ge,v),()=>k.removeEventListener(ge,v)},[v]),c.createElement(cn,{scope:n,orientation:r,dir:y,loop:a,currentTabStopId:S,onItemFocus:c.useCallback(k=>f(k),[f]),onItemShiftTab:c.useCallback(()=>C(!0),[]),onFocusableItemAdd:c.useCallback(()=>I(k=>k+1),[]),onFocusableItemRemove:c.useCallback(()=>I(k=>k-1),[])},c.createElement(te.div,B({tabIndex:P||R===0?-1:0,"data-orientation":r},d,{ref:b,style:{outline:"none",...t.style},onMouseDown:z(t.onMouseDown,()=>{L.current=!0}),onFocus:z(t.onFocus,k=>{const U=!L.current;if(k.target===k.currentTarget&&U&&!P){const Y=new CustomEvent(ge,sn);if(k.currentTarget.dispatchEvent(Y),!Y.defaultPrevented){const M=D().filter(p=>p.focusable),T=M.find(p=>p.active),q=M.find(p=>p.id===S),w=[T,q,...M].filter(Boolean).map(p=>p.ref.current);Ze(w)}}L.current=!1}),onBlur:z(t.onBlur,()=>C(!1))})))}),fn="RovingFocusGroupItem",pn=c.forwardRef((t,s)=>{const{__scopeRovingFocusGroup:n,focusable:r=!0,active:a=!1,tabStopId:o,...i}=t,u=Ee(),l=o||u,x=ln(fn,n),d=x.currentTabStopId===l,m=Ke(n),{onFocusableItemAdd:b,onFocusableItemRemove:y}=x;return c.useEffect(()=>{if(r)return b(),()=>y()},[r,b,y]),c.createElement($e.ItemSlot,{scope:n,id:l,focusable:r,active:a},c.createElement(te.span,B({tabIndex:d?0:-1,"data-orientation":x.orientation},i,{ref:s,onMouseDown:z(t.onMouseDown,S=>{r?x.onItemFocus(l):S.preventDefault()}),onFocus:z(t.onFocus,()=>x.onItemFocus(l)),onKeyDown:z(t.onKeyDown,S=>{if(S.key==="Tab"&&S.shiftKey){x.onItemShiftTab();return}if(S.target!==S.currentTarget)return;const f=xn(S,x.orientation,x.dir);if(f!==void 0){S.preventDefault();let C=m().filter(v=>v.focusable).map(v=>v.ref.current);if(f==="last")C.reverse();else if(f==="prev"||f==="next"){f==="prev"&&C.reverse();const v=C.indexOf(S.currentTarget);C=x.loop?bn(C,v+1):C.slice(v+1)}setTimeout(()=>Ze(C))}})})))}),hn={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function mn(t,s){return s!=="rtl"?t:t==="ArrowLeft"?"ArrowRight":t==="ArrowRight"?"ArrowLeft":t}function xn(t,s,n){const r=mn(t.key,n);if(!(s==="vertical"&&["ArrowLeft","ArrowRight"].includes(r))&&!(s==="horizontal"&&["ArrowUp","ArrowDown"].includes(r)))return hn[r]}function Ze(t){const s=document.activeElement;for(const n of t)if(n===s||(n.focus(),document.activeElement!==s))return}function bn(t,s){return t.map((n,r)=>t[(s+r)%t.length])}const gn=un,vn=pn,qe="Tabs",[$n,ls]=Ne(qe,[We]),Qe=We(),[jn,Ie]=$n(qe),wn=c.forwardRef((t,s)=>{const{__scopeTabs:n,value:r,onValueChange:a,defaultValue:o,orientation:i="horizontal",dir:u,activationMode:l="automatic",...x}=t,d=Be(u),[m,b]=Pe({prop:r,onChange:a,defaultProp:o});return c.createElement(jn,{scope:n,baseId:Ee(),value:m,onValueChange:b,orientation:i,dir:d,activationMode:l},c.createElement(te.div,B({dir:d,"data-orientation":i},x,{ref:s})))}),yn="TabsList",Nn=c.forwardRef((t,s)=>{const{__scopeTabs:n,loop:r=!0,...a}=t,o=Ie(yn,n),i=Qe(n);return c.createElement(gn,B({asChild:!0},i,{orientation:o.orientation,dir:o.dir,loop:r}),c.createElement(te.div,B({role:"tablist","aria-orientation":o.orientation},a,{ref:s})))}),Sn="TabsTrigger",Pn=c.forwardRef((t,s)=>{const{__scopeTabs:n,value:r,disabled:a=!1,...o}=t,i=Ie(Sn,n),u=Qe(n),l=Je(i.baseId,r),x=Xe(i.baseId,r),d=r===i.value;return c.createElement(vn,B({asChild:!0},u,{focusable:!a,active:d}),c.createElement(te.button,B({type:"button",role:"tab","aria-selected":d,"aria-controls":x,"data-state":d?"active":"inactive","data-disabled":a?"":void 0,disabled:a,id:l},o,{ref:s,onMouseDown:z(t.onMouseDown,m=>{!a&&m.button===0&&m.ctrlKey===!1?i.onValueChange(r):m.preventDefault()}),onKeyDown:z(t.onKeyDown,m=>{[" ","Enter"].includes(m.key)&&i.onValueChange(r)}),onFocus:z(t.onFocus,()=>{const m=i.activationMode!=="manual";!d&&!a&&m&&i.onValueChange(r)})})))}),En="TabsContent",Cn=c.forwardRef((t,s)=>{const{__scopeTabs:n,value:r,forceMount:a,children:o,...i}=t,u=Ie(En,n),l=Je(u.baseId,r),x=Xe(u.baseId,r),d=r===u.value,m=c.useRef(d);return c.useEffect(()=>{const b=requestAnimationFrame(()=>m.current=!1);return()=>cancelAnimationFrame(b)},[]),c.createElement(Ce,{present:a||d},({present:b})=>c.createElement(te.div,B({"data-state":d?"active":"inactive","data-orientation":u.orientation,role:"tabpanel","aria-labelledby":l,hidden:!b,id:x,tabIndex:0},i,{ref:s,style:{...t.style,animationDuration:m.current?"0s":void 0}}),b&&o))});function Je(t,s){return`${t}-trigger-${s}`}function Xe(t,s){return`${t}-content-${s}`}const Tn=wn,Dn=Nn,On=Pn,se=Cn;function je({appName:t,reset:s=!1,tooltipText:n,...r}){var i;const a=W(),o=e.jsx("button",{type:"submit",...r,className:ee(r.className,a.state!=="idle"?"cursor-progress":null,((i=a.data)==null?void 0:i.status)==="error"?"cursor-not-allowed":null)});return e.jsxs(a.Form,{action:"/set-playground",method:"POST",className:"inline-flex items-center justify-center",children:[e.jsx("input",{type:"hidden",name:"appName",value:t}),s?e.jsx("input",{type:"hidden",name:"reset",value:"true"}):null,Re,n?e.jsx(K,{content:n,children:o}):o]})}function Rn({playgroundAppName:t,allApps:s}){var r;const n=W();return e.jsxs(Nt,{name:"appName",value:t,onValueChange:a=>{n.submit({appName:a},{method:"POST",action:"/set-playground"})},children:[e.jsxs(St,{"aria-label":"Select app for playground",className:ee("flex h-full w-full items-center justify-between text-left radix-placeholder:text-gray-500 focus-visible:outline-none",n.state!=="idle"?"cursor-progress":null,((r=n.data)==null?void 0:r.status)==="error"?"cursor-not-allowed":null),children:[e.jsx("span",{className:"w-80 flex-1 overflow-hidden text-ellipsis whitespace-nowrap scrollbar-thin scrollbar-thumb-scrollbar",children:e.jsx(Pt,{placeholder:"Select current app",className:"inline-block w-40 text-ellipsis"})}),e.jsx(Et,{children:e.jsx(O,{name:"TriangleDownSmall"})})]}),e.jsx(Ct,{children:e.jsxs(Tt,{position:"popper",align:"start",className:"z-20 max-h-[50vh] bg-black text-white lg:max-h-[70vh]",children:[e.jsx(Dt,{className:"flex h-5 cursor-default items-center justify-center ",children:e.jsx(O,{name:"ChevronUp"})}),e.jsx(Ot,{className:"p-3",children:e.jsxs(Rt,{children:[e.jsx(kt,{className:"px-5 pb-3 font-mono uppercase",children:"App"}),s.filter(a=>a.name!=="playground").map(a=>e.jsx(kn,{value:a.name,children:a.displayName},a.name))]})}),e.jsx(_t,{className:"flex h-5 cursor-default items-center justify-center ",children:e.jsx(O,{name:"ChevronDown"})})]})})]})}function kn({value:t,children:s}){return e.jsxs(Mt,{value:t,className:"relative flex cursor-pointer select-none items-center rounded px-10 py-2 leading-none opacity-80 radix-disabled:text-red-500 radix-highlighted:opacity-100 radix-highlighted:outline-none radix-state-checked:opacity-100",children:[e.jsx(It,{children:s}),e.jsx(Ft,{className:"absolute left-0 inline-flex w-[25px] items-center justify-center",children:e.jsx(O,{name:"CheckSmall"})})]})}function Fe({appName:t}){return ENV.EPICSHOP_DEPLOYED?null:e.jsx(je,{appName:t,tooltipText:"Playground is not set to the right app. Click to set Playground.",children:e.jsxs("span",{className:"flex items-center justify-center gap-1 text-foreground-danger hover:underline",children:[e.jsx(O,{name:"Unlinked",className:"animate-ping"})," ",e.jsx("span",{className:"uppercase",children:"Set to Playground"})]})})}var et={exports:{}};(function(t,s){(function(n,r){t.exports=r()})(xe,function(){var n=1e3,r=6e4,a=36e5,o="millisecond",i="second",u="minute",l="hour",x="day",d="week",m="month",b="quarter",y="year",S="date",f="Invalid Date",P=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,C=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,v={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(w){var p=["th","st","nd","rd"],g=w%100;return"["+w+(p[(g-20)%10]||p[g]||p[0])+"]"}},D=function(w,p,g){var N=String(w);return!N||N.length>=p?w:""+Array(p+1-N.length).join(g)+w},L={s:D,z:function(w){var p=-w.utcOffset(),g=Math.abs(p),N=Math.floor(g/60),$=g%60;return(p<=0?"+":"-")+D(N,2,"0")+":"+D($,2,"0")},m:function w(p,g){if(p.date()<g.date())return-w(g,p);var N=12*(g.year()-p.year())+(g.month()-p.month()),$=p.clone().add(N,m),E=g-$<0,j=p.clone().add(N+(E?-1:1),m);return+(-(N+(g-$)/(E?$-j:j-$))||0)},a:function(w){return w<0?Math.ceil(w)||0:Math.floor(w)},p:function(w){return{M:m,y,w:d,d:x,D:S,h:l,m:u,s:i,ms:o,Q:b}[w]||String(w||"").toLowerCase().replace(/s$/,"")},u:function(w){return w===void 0}},R="en",I={};I[R]=v;var k="$isDayjsObject",U=function(w){return w instanceof q||!(!w||!w[k])},Y=function w(p,g,N){var $;if(!p)return R;if(typeof p=="string"){var E=p.toLowerCase();I[E]&&($=E),g&&(I[E]=g,$=E);var j=p.split("-");if(!$&&j.length>1)return w(j[0])}else{var _=p.name;I[_]=p,$=_}return!N&&$&&(R=$),$||!N&&R},M=function(w,p){if(U(w))return w.clone();var g=typeof p=="object"?p:{};return g.date=w,g.args=arguments,new q(g)},T=L;T.l=Y,T.i=U,T.w=function(w,p){return M(w,{locale:p.$L,utc:p.$u,x:p.$x,$offset:p.$offset})};var q=function(){function w(g){this.$L=Y(g.locale,null,!0),this.parse(g),this.$x=this.$x||g.x||{},this[k]=!0}var p=w.prototype;return p.parse=function(g){this.$d=function(N){var $=N.date,E=N.utc;if($===null)return new Date(NaN);if(T.u($))return new Date;if($ instanceof Date)return new Date($);if(typeof $=="string"&&!/Z$/i.test($)){var j=$.match(P);if(j){var _=j[2]-1||0,A=(j[7]||"0").substring(0,3);return E?new Date(Date.UTC(j[1],_,j[3]||1,j[4]||0,j[5]||0,j[6]||0,A)):new Date(j[1],_,j[3]||1,j[4]||0,j[5]||0,j[6]||0,A)}}return new Date($)}(g),this.init()},p.init=function(){var g=this.$d;this.$y=g.getFullYear(),this.$M=g.getMonth(),this.$D=g.getDate(),this.$W=g.getDay(),this.$H=g.getHours(),this.$m=g.getMinutes(),this.$s=g.getSeconds(),this.$ms=g.getMilliseconds()},p.$utils=function(){return T},p.isValid=function(){return this.$d.toString()!==f},p.isSame=function(g,N){var $=M(g);return this.startOf(N)<=$&&$<=this.endOf(N)},p.isAfter=function(g,N){return M(g)<this.startOf(N)},p.isBefore=function(g,N){return this.endOf(N)<M(g)},p.$g=function(g,N,$){return T.u(g)?this[N]:this.set($,g)},p.unix=function(){return Math.floor(this.valueOf()/1e3)},p.valueOf=function(){return this.$d.getTime()},p.startOf=function(g,N){var $=this,E=!!T.u(N)||N,j=T.p(g),_=function(X,V){var Q=T.w($.$u?Date.UTC($.$y,V,X):new Date($.$y,V,X),$);return E?Q:Q.endOf(x)},A=function(X,V){return T.w($.toDate()[X].apply($.toDate("s"),(E?[0,0,0,0]:[23,59,59,999]).slice(V)),$)},F=this.$W,H=this.$M,G=this.$D,re="set"+(this.$u?"UTC":"");switch(j){case y:return E?_(1,0):_(31,11);case m:return E?_(1,H):_(0,H+1);case d:var J=this.$locale().weekStart||0,ie=(F<J?F+7:F)-J;return _(E?G-ie:G+(6-ie),H);case x:case S:return A(re+"Hours",0);case l:return A(re+"Minutes",1);case u:return A(re+"Seconds",2);case i:return A(re+"Milliseconds",3);default:return this.clone()}},p.endOf=function(g){return this.startOf(g,!1)},p.$set=function(g,N){var $,E=T.p(g),j="set"+(this.$u?"UTC":""),_=($={},$[x]=j+"Date",$[S]=j+"Date",$[m]=j+"Month",$[y]=j+"FullYear",$[l]=j+"Hours",$[u]=j+"Minutes",$[i]=j+"Seconds",$[o]=j+"Milliseconds",$)[E],A=E===x?this.$D+(N-this.$W):N;if(E===m||E===y){var F=this.clone().set(S,1);F.$d[_](A),F.init(),this.$d=F.set(S,Math.min(this.$D,F.daysInMonth())).$d}else _&&this.$d[_](A);return this.init(),this},p.set=function(g,N){return this.clone().$set(g,N)},p.get=function(g){return this[T.p(g)]()},p.add=function(g,N){var $,E=this;g=Number(g);var j=T.p(N),_=function(H){var G=M(E);return T.w(G.date(G.date()+Math.round(H*g)),E)};if(j===m)return this.set(m,this.$M+g);if(j===y)return this.set(y,this.$y+g);if(j===x)return _(1);if(j===d)return _(7);var A=($={},$[u]=r,$[l]=a,$[i]=n,$)[j]||1,F=this.$d.getTime()+g*A;return T.w(F,this)},p.subtract=function(g,N){return this.add(-1*g,N)},p.format=function(g){var N=this,$=this.$locale();if(!this.isValid())return $.invalidDate||f;var E=g||"YYYY-MM-DDTHH:mm:ssZ",j=T.z(this),_=this.$H,A=this.$m,F=this.$M,H=$.weekdays,G=$.months,re=$.meridiem,J=function(V,Q,ce,de){return V&&(V[Q]||V(N,E))||ce[Q].slice(0,de)},ie=function(V){return T.s(_%12||12,V,"0")},X=re||function(V,Q,ce){var de=V<12?"AM":"PM";return ce?de.toLowerCase():de};return E.replace(C,function(V,Q){return Q||function(ce){switch(ce){case"YY":return String(N.$y).slice(-2);case"YYYY":return T.s(N.$y,4,"0");case"M":return F+1;case"MM":return T.s(F+1,2,"0");case"MMM":return J($.monthsShort,F,G,3);case"MMMM":return J(G,F);case"D":return N.$D;case"DD":return T.s(N.$D,2,"0");case"d":return String(N.$W);case"dd":return J($.weekdaysMin,N.$W,H,2);case"ddd":return J($.weekdaysShort,N.$W,H,3);case"dddd":return H[N.$W];case"H":return String(_);case"HH":return T.s(_,2,"0");case"h":return ie(1);case"hh":return ie(2);case"a":return X(_,A,!0);case"A":return X(_,A,!1);case"m":return String(A);case"mm":return T.s(A,2,"0");case"s":return String(N.$s);case"ss":return T.s(N.$s,2,"0");case"SSS":return T.s(N.$ms,3,"0");case"Z":return j}return null}(V)||j.replace(":","")})},p.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},p.diff=function(g,N,$){var E,j=this,_=T.p(N),A=M(g),F=(A.utcOffset()-this.utcOffset())*r,H=this-A,G=function(){return T.m(j,A)};switch(_){case y:E=G()/12;break;case m:E=G();break;case b:E=G()/3;break;case d:E=(H-F)/6048e5;break;case x:E=(H-F)/864e5;break;case l:E=H/a;break;case u:E=H/r;break;case i:E=H/n;break;default:E=H}return $?E:T.a(E)},p.daysInMonth=function(){return this.endOf(m).$D},p.$locale=function(){return I[this.$L]},p.locale=function(g,N){if(!g)return this.$L;var $=this.clone(),E=Y(g,N,!0);return E&&($.$L=E),$},p.clone=function(){return T.w(this.$d,this)},p.toDate=function(){return new Date(this.valueOf())},p.toJSON=function(){return this.isValid()?this.toISOString():null},p.toISOString=function(){return this.$d.toISOString()},p.toString=function(){return this.$d.toUTCString()},w}(),ne=q.prototype;return M.prototype=ne,[["$ms",o],["$s",i],["$m",u],["$H",l],["$W",x],["$M",m],["$y",y],["$D",S]].forEach(function(w){ne[w[1]]=function(p){return this.$g(p,w[0],w[1])}}),M.extend=function(w,p){return w.$i||(w(p,q,M),w.$i=!0),M},M.locale=Y,M.isDayjs=U,M.unix=function(w){return M(1e3*w)},M.en=I[R],M.Ls=I,M.p={},M})})(et);var _n=et.exports;const be=me(_n);var tt={exports:{}};(function(t,s){(function(n,r){t.exports=r()})(xe,function(){return function(n,r,a){n=n||{};var o=r.prototype,i={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function u(x,d,m,b){return o.fromToBase(x,d,m,b)}a.en.relativeTime=i,o.fromToBase=function(x,d,m,b,y){for(var S,f,P,C=m.$locale().relativeTime||i,v=n.thresholds||[{l:"s",r:44,d:"second"},{l:"m",r:89},{l:"mm",r:44,d:"minute"},{l:"h",r:89},{l:"hh",r:21,d:"hour"},{l:"d",r:35},{l:"dd",r:25,d:"day"},{l:"M",r:45},{l:"MM",r:10,d:"month"},{l:"y",r:17},{l:"yy",d:"year"}],D=v.length,L=0;L<D;L+=1){var R=v[L];R.d&&(S=b?a(x).diff(m,R.d,!0):m.diff(x,R.d,!0));var I=(n.rounding||Math.round)(Math.abs(S));if(P=S>0,I<=R.r||!R.r){I<=1&&L>0&&(R=v[L-1]);var k=C[R.l];y&&(I=y(""+I)),f=typeof k=="string"?k.replace("%d",I):k(I,d,R.l,P);break}}if(d)return f;var U=P?C.future:C.past;return typeof U=="function"?U(f):U.replace("%s",f)},o.to=function(x,d){return u(x,d,this,!0)},o.from=function(x,d){return u(x,d,this)};var l=function(x){return x.$u?a.utc():a()};o.toNow=function(x){return this.to(l(this),x)},o.fromNow=function(x){return this.from(l(this),x)}}})})(tt);var Mn=tt.exports;const In=me(Mn);var nt={exports:{}};(function(t,s){(function(n,r){t.exports=r()})(xe,function(){var n={year:0,month:1,day:2,hour:3,minute:4,second:5},r={};return function(a,o,i){var u,l=function(b,y,S){S===void 0&&(S={});var f=new Date(b),P=function(C,v){v===void 0&&(v={});var D=v.timeZoneName||"short",L=C+"|"+D,R=r[L];return R||(R=new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:C,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",timeZoneName:D}),r[L]=R),R}(y,S);return P.formatToParts(f)},x=function(b,y){for(var S=l(b,y),f=[],P=0;P<S.length;P+=1){var C=S[P],v=C.type,D=C.value,L=n[v];L>=0&&(f[L]=parseInt(D,10))}var R=f[3],I=R===24?0:R,k=f[0]+"-"+f[1]+"-"+f[2]+" "+I+":"+f[4]+":"+f[5]+":000",U=+b;return(i.utc(k).valueOf()-(U-=U%1e3))/6e4},d=o.prototype;d.tz=function(b,y){b===void 0&&(b=u);var S=this.utcOffset(),f=this.toDate(),P=f.toLocaleString("en-US",{timeZone:b}),C=Math.round((f-new Date(P))/1e3/60),v=i(P,{locale:this.$L}).$set("millisecond",this.$ms).utcOffset(15*-Math.round(f.getTimezoneOffset()/15)-C,!0);if(y){var D=v.utcOffset();v=v.add(S-D,"minute")}return v.$x.$timezone=b,v},d.offsetName=function(b){var y=this.$x.$timezone||i.tz.guess(),S=l(this.valueOf(),y,{timeZoneName:b}).find(function(f){return f.type.toLowerCase()==="timezonename"});return S&&S.value};var m=d.startOf;d.startOf=function(b,y){if(!this.$x||!this.$x.$timezone)return m.call(this,b,y);var S=i(this.format("YYYY-MM-DD HH:mm:ss:SSS"),{locale:this.$L});return m.call(S,b,y).tz(this.$x.$timezone,!0)},i.tz=function(b,y,S){var f=S&&y,P=S||y||u,C=x(+i(),P);if(typeof b!="string")return i(b).tz(P);var v=function(I,k,U){var Y=I-60*k*1e3,M=x(Y,U);if(k===M)return[Y,k];var T=x(Y-=60*(M-k)*1e3,U);return M===T?[Y,M]:[I-60*Math.min(M,T)*1e3,Math.max(M,T)]}(i.utc(b,f).valueOf(),C,P),D=v[0],L=v[1],R=i(D).utcOffset(L);return R.$x.$timezone=P,R},i.tz.guess=function(){return Intl.DateTimeFormat().resolvedOptions().timeZone},i.tz.setDefault=function(b){u=b}}})})(nt);var Fn=nt.exports;const Ln=me(Fn);var rt={exports:{}};(function(t,s){(function(n,r){t.exports=r()})(xe,function(){var n="minute",r=/[+-]\d\d(?::?\d\d)?/g,a=/([+-]|\d\d)/g;return function(o,i,u){var l=i.prototype;u.utc=function(f){var P={date:f,utc:!0,args:arguments};return new i(P)},l.utc=function(f){var P=u(this.toDate(),{locale:this.$L,utc:!0});return f?P.add(this.utcOffset(),n):P},l.local=function(){return u(this.toDate(),{locale:this.$L,utc:!1})};var x=l.parse;l.parse=function(f){f.utc&&(this.$u=!0),this.$utils().u(f.$offset)||(this.$offset=f.$offset),x.call(this,f)};var d=l.init;l.init=function(){if(this.$u){var f=this.$d;this.$y=f.getUTCFullYear(),this.$M=f.getUTCMonth(),this.$D=f.getUTCDate(),this.$W=f.getUTCDay(),this.$H=f.getUTCHours(),this.$m=f.getUTCMinutes(),this.$s=f.getUTCSeconds(),this.$ms=f.getUTCMilliseconds()}else d.call(this)};var m=l.utcOffset;l.utcOffset=function(f,P){var C=this.$utils().u;if(C(f))return this.$u?0:C(this.$offset)?m.call(this):this.$offset;if(typeof f=="string"&&(f=function(R){R===void 0&&(R="");var I=R.match(r);if(!I)return null;var k=(""+I[0]).match(a)||["-",0,0],U=k[0],Y=60*+k[1]+ +k[2];return Y===0?0:U==="+"?Y:-Y}(f),f===null))return this;var v=Math.abs(f)<=16?60*f:f,D=this;if(P)return D.$offset=v,D.$u=f===0,D;if(f!==0){var L=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();(D=this.local().add(v+L,n)).$offset=v,D.$x.$localOffset=L}else D=this.utc();return D};var b=l.format;l.format=function(f){var P=f||(this.$u?"YYYY-MM-DDTHH:mm:ss[Z]":"");return b.call(this,P)},l.valueOf=function(){var f=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*f},l.isUTC=function(){return!!this.$u},l.toISOString=function(){return this.toDate().toISOString()},l.toString=function(){return this.toDate().toUTCString()};var y=l.toDate;l.toDate=function(f){return f==="s"&&this.$offset?u(this.format("YYYY-MM-DD HH:mm:ss:SSS")).toDate():y.call(this)};var S=l.diff;l.diff=function(f,P,C){if(f&&this.$u===f.$u)return S.call(this,f,P,C);var v=this.local(),D=u(f).local();return S.call(v,D,P,C)}}})})(rt);var An=rt.exports;const Un=me(An);be.extend(Un);be.extend(Ln);be.extend(In);function Hn(){const t=Z();return e.jsxs("div",{className:"flex h-full w-full flex-col gap-4 pt-4",children:[e.jsx("div",{className:"text-center",children:e.jsx(Xt,{discordAuthUrl:t.discordAuthUrl})}),e.jsx("div",{className:"flex-1 overflow-y-scroll bg-accent pb-4 scrollbar-thin scrollbar-thumb-scrollbar",children:e.jsx(Yn,{})})]})}function Yn(){const t=Z(),s=en({discordAuthUrl:t.discordAuthUrl}),n=Te();return e.jsxs("div",{className:"flex h-full flex-col items-center justify-between",children:[e.jsx(c.Suspense,{fallback:e.jsx("div",{className:"flex h-full w-full flex-col items-center justify-center",children:e.jsx(ze,{children:"Loading Discord Posts"})}),children:e.jsx(Ve,{resolve:t.discordPostsPromise,errorElement:e.jsx("div",{className:"text-red-500",children:"There was a problem loading the discord posts"}),children:r=>e.jsx("ul",{className:"flex w-full flex-col gap-4 p-3 xl:p-12",children:r.map(a=>e.jsx("li",{className:"rounded-xl border bg-background transition-all duration-200 focus-within:-translate-y-1 focus-within:shadow-lg hover:-translate-y-1 hover:shadow-lg",children:e.jsx(Bn,{thread:a})},a.id))})})}),e.jsx("div",{children:e.jsxs(ae,{to:n&&!s.includes("oauth")?s.replace(/^https/,"discord"):s,target:s.includes("oauth")?void 0:"_blank",rel:"noreferrer noopener",onClick:n?r=>{r.preventDefault(),window.open(r.currentTarget.href,"_blank","noreferrer noopener")}:void 0,className:"flex items-center gap-2 p-2 text-xl hover:underline",children:["Create Post ",e.jsx(O,{name:"ExternalLink"})]})})]})}function Bn({thread:t}){const s=t.reactions.filter(r=>r.count),n=Jt();return e.jsx("div",{children:e.jsxs("div",{className:"flex flex-col gap-2 p-4",children:[e.jsxs("div",{className:"flex gap-4",children:[e.jsxs("div",{className:"flex flex-col gap-1",children:[t.tags.length?e.jsx("div",{className:"flex gap-2",children:t.tags.map(r=>e.jsxs("div",{className:"flex items-center justify-center gap-1 rounded-full bg-accent px-2 py-1 text-sm",children:[e.jsx("span",{className:"h-3 w-3 leading-3",children:e.jsx(Ue,{name:r.emojiName,url:r.emojiUrl})}),e.jsx("span",{children:r.name})]},r.name))}):null,e.jsx("strong",{className:"text-xl font-bold",children:t.name}),e.jsxs("div",{className:"flex items-start gap-1",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[t.authorAvatarUrl?e.jsx("img",{src:t.authorAvatarUrl,alt:"",className:"h-6 w-6 rounded-full"}):null,e.jsxs("span",{children:[e.jsx("span",{className:"font-bold",style:t.authorHexAccentColor?{color:t.authorHexAccentColor}:{},children:t.authorDisplayName}),":"," "]})]}),e.jsx("span",{className:"flex-1 overflow-ellipsis text-muted-foreground",children:t.messagePreview})]})]}),t.previewImageUrl?e.jsx("img",{src:t.previewImageUrl,alt:"",className:"h-28 w-28 rounded-lg object-cover"}):null]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{children:s.length?e.jsx("ul",{className:"flex items-center gap-2",children:s.map((r,a)=>e.jsxs("li",{className:"flex items-center gap-1 rounded-md border border-blue-600 bg-blue-500/20 px-[5px] py-[0.5px] text-sm",children:[e.jsx("span",{className:"h-3 w-3 leading-3",children:e.jsx(Ue,{name:r.emojiName,url:r.emojiUrl})}),e.jsx("span",{children:r.count})]},a))}):null}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(O,{name:"Chat"})," ",t.messageCount]}),` · ${be(t.lastUpdated).tz(n.timeZone).fromNow()}`]})]}),e.jsxs("span",{className:"flex items-center gap-4",children:[e.jsx("a",{href:t.link.replace(/^https/,"discord"),children:e.jsx(O,{name:"Discord"})}),e.jsx("a",{href:t.link,target:"_blank",rel:"noreferrer noopener",children:e.jsx(O,{name:"ExternalLink"})})]})]})]})})}function Ue({name:t,url:s}){return s?e.jsx("img",{src:s,alt:t,className:"h-full w-full"}):t||null}function st({playgroundAppName:t,problemAppName:s,isUpToDate:n,allApps:r,children:a}){const o=t===s,i=o&&n?e.jsx(O,{size:"xl",name:"Linked"}):e.jsx(O,{size:"xl",name:"Unlinked",className:"animate-pulse text-foreground-danger"});let u="Click to reset Playground.";return n||(u="Playground is out of date. Click to reset Playground."),o||(u="Playground is not set to the right app. Click to set Playground."),e.jsxs("div",{className:"flex h-full w-full flex-col justify-between",children:[e.jsxs("div",{className:"flex h-14 flex-shrink-0 items-center justify-start gap-2 border-b px-3",children:[e.jsx("div",{className:"display-alt-up",children:s?e.jsx(je,{appName:s,tooltipText:u,children:i}):e.jsx(K,{content:"No problem app available for this step",children:e.jsx("div",{children:e.jsx(O,{name:"Question"})})})}),e.jsx("div",{className:"display-alt-down",children:t?e.jsx(je,{appName:t,reset:!0,tooltipText:"Reset Playground",children:e.jsx("div",{className:"flex h-7 w-7 items-center justify-center",children:e.jsx(O,{name:"Refresh"})})}):e.jsx("div",{className:"h-7 w-7"})}),e.jsx(Rn,{allApps:r,playgroundAppName:t})]}),e.jsx("div",{className:"flex h-full flex-1 flex-grow items-center justify-center",children:a})]})}function Vn({name:t}){var o;const s=W(),n=(o=s.formData)==null?void 0:o.get("intent"),r=n==="stop"?"Stopping App":n==="restart"?"Restarting App":null,a=Te();return e.jsxs(s.Form,{method:"POST",action:"/start",children:[Re,e.jsx("input",{type:"hidden",name:"name",value:t}),e.jsx("button",{type:"submit",name:"intent",value:a?"restart":"stop",className:"h-full border-r px-3 py-4 font-mono text-xs uppercase leading-none",children:r||(a?"Restart App":"Stop App")})]})}function at({port:t}){const s=W();return e.jsxs(s.Form,{method:"POST",action:"/start",children:[e.jsx("input",{type:"hidden",name:"port",value:t}),e.jsx(Ge,{varient:"mono",type:"submit",name:"intent",value:"stop-port",children:s.state==="idle"?"Stop Port":"Stopping Port"})]})}function zn({name:t}){var n;const s=W();return((n=s.data)==null?void 0:n.status)==="app-not-started"?s.data.error==="port-unavailable"?e.jsxs("div",{children:["The port is unavailable. Would you like to stop whatever is running on that port and try again?",e.jsx(at,{port:s.data.port})]}):e.jsx("div",{children:"An unknown error has happened."}):e.jsxs(s.Form,{method:"POST",action:"/start",children:[e.jsx("input",{type:"hidden",name:"name",value:t}),s.state==="idle"?e.jsx(Ge,{type:"submit",name:"intent",value:"start",varient:"mono",children:"Start App"}):e.jsx("div",{children:e.jsx(ze,{children:"Starting App"})})]})}const Gn=h.intersection(h.object({type:h.literal("epicshop:history-call")}),h.union([h.object({method:h.literal("pushState"),args:h.union([h.tuple([h.object({}).passthrough(),h.unknown()]),h.tuple([h.object({}).passthrough(),h.unknown(),h.string()])])}),h.object({method:h.literal("replaceState"),args:h.union([h.tuple([h.object({}).passthrough(),h.unknown()]),h.tuple([h.object({}).passthrough(),h.unknown(),h.string()])])}),h.object({method:h.literal("go"),args:h.tuple([h.number().optional()])}),h.object({method:h.literal("forward"),args:h.tuple([])}),h.object({method:h.literal("back"),args:h.tuple([])}),h.object({method:h.literal("popstate"),pathname:h.string(),delta:h.number()})])),Kn=h.object({type:h.literal("epicshop:loaded"),url:h.string()}),Wn=h.union([Gn,Kn]);function He(t,s,n){return Math.min(Math.max(t+s,0),n)}const Zn=c.forwardRef(qn);function qn({name:t,port:s,portIsAvailable:n,isRunning:r,baseUrl:a,id:o,initialRoute:i},u){const l=_e();return r?e.jsx(Qn,{baseUrl:a,id:o,name:t,ref:u,initialRoute:i}):n===!1?e.jsxs("div",{className:"flex flex-col items-center justify-center",children:[e.jsxs("p",{className:"max-w-xs pb-5 text-center",role:"status",children:["The port for this app is unavailable. It could be that you're running it ",e.jsx("a",{href:De({domain:l.domain,port:s}),className:"underline",children:"elsewhere"}),"?"]}),e.jsx(at,{port:s})]}):e.jsx(zn,{name:t})}const Qn=c.forwardRef(Jn);function Jn({baseUrl:t,id:s,name:n,initialRoute:r},a){const[o,i]=ke(),u=o.get("pathname")??r,[l,x]=c.useState(0),d=s+l,m=c.useRef("new"),b=c.useRef(null),[y,S]=c.useState({history:[u],index:0}),[f,P]=c.useState(u),C=c.useRef(null),v=new URL(u,t),D=c.useRef(v);c.useEffect(()=>{D.current=v});const[L,R]=c.useState(v),I=c.useRef(s);I.current!==s&&(I.current=s,R(D.current)),c.useEffect(()=>{I.current=s}),c.useEffect(()=>{function w(p){var E;if(p.source!==((E=C.current)==null?void 0:E.contentWindow))return;const g=Wn.safeParse(p.data,{path:["messageEvent","data"]});if(!g.success)return;const{data:N}=g;if(N.type==="epicshop:loaded"){S(j=>{const _=A=>He(j.index,A,j.history.length-1);if(m.current==="back")return{...j,index:_(-1)};if(m.current==="forward")return{...j,index:_(1)};if(m.current==="new"){const A=j.history[j.index],F=new URL(N.url).pathname;if(A===F)return j;const H=[...j.history.slice(0,j.index+1),F];return{history:H,index:H.length-1}}else throw new Error("Unexpected lastDirectionRef value")});return}const{method:$}=N;S(j=>{const _=F=>He(j.index,F,j.history.length-1),A=j.history[j.index];switch($){case"popstate":return{...j,index:_(N.delta)};case"forward":return{...j,index:_(1)};case"back":return{...j,index:_(-1)};case"pushState":{const F=N.args[2]??A,H=[...j.history.slice(0,j.index+1),F].filter(Boolean);return{...j,history:H,index:H.length-1}}case"replaceState":{const F=N.args[2]??A;return{...j,history:[...j.history.slice(0,j.index),F,...j.history.slice(j.index+1)].filter(Boolean)}}case"go":{const[F=0]=N.args;return{...j,index:_(F)}}}})}return window.addEventListener("message",w),()=>{window.removeEventListener("message",w)}},[]);const k=c.useRef(i);c.useEffect(()=>{k.current=i},[i]);const U=y.history[y.index];c.useEffect(()=>{if(!U)return;P(U);const w=new URLSearchParams(window.location.search);U==="/"?w.delete("pathname"):w.set("pathname",U),`?${w.toString()}`!==window.location.search&&k.current(w,{replace:!0})},[U]);const Y=(...w)=>{var g,N;const p=w[0];typeof p=="number"?m.current=p>0?"forward":"back":m.current="new",b.current&&clearTimeout(b.current),b.current=setTimeout(()=>{m.current="new"},100),(N=(g=C.current)==null?void 0:g.contentWindow)==null||N.postMessage({type:"epicshop:navigate-call",params:w},"*")};function M(w=f){P(w);const p=y.history[y.index];Y(w,{replace:p===w})}c.useImperativeHandle(a,()=>({handleExtrnalNavigation:M}));const T=y.index===y.history.length-1,q=y.index<=0,ne=[];for(const[w,p]of o.entries())w!=="pathname"&&ne.push(e.jsx("input",{type:"hidden",name:w,value:p},w));return e.jsx(bt,{children:e.jsxs("div",{className:"flex h-full flex-grow flex-col",children:[e.jsxs("div",{className:"flex items-center justify-between border-b pl-1.5",children:[e.jsxs("div",{className:"mr-2 flex items-center justify-center gap-2 px-1",children:[e.jsxs(fe,{children:[e.jsx(pe,{asChild:!0,children:e.jsx("button",{type:"button",className:"flex aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40",disabled:q,onClick:()=>Y(-1),children:e.jsx(O,{name:"ArrowLeft","aria-hidden":"true"})})}),e.jsx(he,{children:"Go back"})]}),e.jsxs(fe,{children:[e.jsx(pe,{asChild:!0,children:e.jsx("button",{type:"button",className:"flex aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40",disabled:T,onClick:()=>Y(1),children:e.jsx(O,{name:"ArrowRight","aria-hidden":"true"})})}),e.jsx(he,{children:"Go forward"})]}),e.jsxs(fe,{children:[e.jsx(pe,{asChild:!0,children:e.jsx("button",{type:"button",className:"flex aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40",onClick:()=>{R(v),x(l+1),S({history:[v.pathname],index:0})},children:e.jsx(O,{name:"Refresh","aria-hidden":"true"})})}),e.jsx(he,{children:"Refresh"})]})]}),e.jsxs(Qt,{method:"get",replace:!0,className:"flex flex-1 gap-2",onSubmit:()=>M(),children:[ne,e.jsxs("div",{className:"flex flex-1 items-center border-x bg-background p-3 leading-none text-foreground",children:[e.jsx("a",{href:v.toString(),target:"_blank",rel:"noreferrer",children:L.host}),e.jsx("input",{"aria-label":"pathname",className:"flex-1 bg-background focus-visible:outline-none",value:f,name:"pathname",onChange:w=>P(w.currentTarget.value)})]})]}),e.jsx(Vn,{name:n}),e.jsxs(fe,{children:[e.jsx(pe,{asChild:!0,children:e.jsx("a",{href:v.toString(),target:"_blank",rel:"noreferrer",className:ee("flex aspect-square items-center justify-center px-3.5"),children:e.jsx(O,{name:"ExternalLink"})})}),e.jsx(he,{children:"Open in new tab"})]})]}),e.jsx("div",{className:"flex h-full w-full flex-grow dark:bg-white",children:e.jsx("iframe",{title:n,ref:C,src:L.toString(),className:"h-full w-full flex-grow bg-white"},d)})]})})}function we({id:t,appInfo:s,inBrowserBrowserRef:n}){const r=_e();if(!s)return e.jsx("p",{children:"No app here. Sorry."});const{isRunning:a,dev:o,name:i,portIsAvailable:u,title:l}=s;if(o.type==="script"){const x=De({domain:r.domain,port:o.portNumber});return e.jsx(Zn,{ref:n,isRunning:a,id:t??i,name:i,portIsAvailable:u,port:o.portNumber,baseUrl:x,initialRoute:o.initialRoute})}else return o.type==="browser"?e.jsxs("div",{className:"relative h-full flex-grow overflow-y-auto scrollbar-thin scrollbar-thumb-scrollbar",children:[e.jsxs("a",{href:o.pathname,target:"_blank",rel:"noreferrer",className:ve("absolute bottom-5 right-5 flex items-center justify-center rounded-full bg-gray-100 p-2.5 transition hover:bg-gray-200 dark:bg-gray-800 hover:dark:bg-gray-600"),children:[e.jsx(O,{name:"ExternalLink","aria-hidden":"true"}),e.jsx("span",{className:"sr-only",children:"Open in New Window"})]}),e.jsx("iframe",{title:l,src:o.pathname,className:"h-full w-full flex-grow bg-white"})]}):e.jsxs("p",{children:["Preview for dev type of ",e.jsx("code",{children:o.type})," not supported."]})}function Xn({appInfo:t,inBrowserBrowserRef:s,problemAppName:n,allApps:r,isUpToDate:a}){return e.jsx(st,{playgroundAppName:t==null?void 0:t.appName,problemAppName:n,allApps:r,isUpToDate:a,children:(t==null?void 0:t.dev.type)==="none"?e.jsxs("div",{children:[e.jsx("div",{className:"text-foreground-secondary flex h-full items-center justify-center text-2xl",children:"Non-UI playground"}),e.jsx("div",{children:e.jsxs("div",{className:"text-foreground-secondary flex flex-wrap gap-1 text-center",children:["Navigate to"," ",e.jsx(K,{content:t.fullPath,children:e.jsx("span",{className:"underline",onClick:()=>{navigator.clipboard.writeText(t.fullPath),tn.success("Copied playground path to clipboard")},children:"the playground directory"})})," ","in your editor and terminal to work on this exercise!"]})})]}):t?e.jsx(we,{id:t.appName,appInfo:t,inBrowserBrowserRef:s}):e.jsxs("div",{className:"flex flex-col justify-center gap-2",children:[e.jsx("p",{children:"Please set the playground first"}),n?e.jsx(Fe,{appName:n}):null]})})}function er({handleClick:t,cacheLocation:s,embeddedKey:n,appFullPath:r}){const a=W();return e.jsxs(a.Form,{action:"/update-mdx-cache",method:"POST",children:[Re,e.jsx("input",{type:"hidden",name:"cacheLocation",value:s}),e.jsx("input",{type:"hidden",name:"embeddedKey",value:n}),e.jsx("input",{type:"hidden",name:"appFullPath",value:r}),e.jsx("button",{type:"submit",onClick:t,className:ee("launch_button",a.state==="idle"?null:"cursor-progress"),children:"Cancel Warning"})]})}const ot=c.createContext(null);function tr(){const t=c.useContext(ot);if(!t)throw new Error("useStepContext must be used within a StepContext.Provider");return t}function nr({children:t,inBrowserBrowserRef:s}){return e.jsx(ot.Provider,{value:{inBrowserBrowserRef:s},children:t})}const rr={CodeFile:ir,CodeFileNotification:cr,DiffLink:Le,PrevDiffLink:or,NextDiffLink:ar,InlineFile:lr,LinkToApp:dr};function sr({inBrowserBrowserRef:t}){const s=Z();return s.exerciseStepApp.instructionsCode?e.jsx(nr,{inBrowserBrowserRef:t,children:e.jsx(nn,{epicVideoInfosPromise:s.epicVideoInfosPromise,children:e.jsx("div",{className:"prose dark:prose-invert sm:prose-lg",children:e.jsx(Wt,{code:s.exerciseStepApp.instructionsCode,components:rr})})})}):null}function it(t,s,n){const r=new URLSearchParams(t);return n===null?r.delete(s):r.set(s,n),r}function ar({app:t=0,fullPage:s=!1,children:n}){return e.jsx(Le,{app1:t,app2:t+1,fullPage:s,children:n})}function or({app:t=-1,fullPage:s=!1,children:n}){return e.jsx(Le,{app1:t,app2:t+1,fullPage:s,children:n})}function Le({app1:t=0,app2:s=1,children:n,fullPage:r=!1,to:a}){const o=Z();if(!a&&!t&&!s)return e.jsx("callout-danger",{className:"notification",children:e.jsx("div",{className:"title",children:"DiffLink Error: invalid input"})});function i(d){var m;if(typeof d=="number"){const b=o.exerciseIndex+d;return(m=o.allApps[b])==null?void 0:m.name}if(!d)return null;for(const{name:b,stepName:y}of o.allApps)if(d===b||d===y)return b;return null}if(a){const d=new URLSearchParams(a);t=d.get("app1"),s=d.get("app2")}const u=i(t),l=i(s);if(!u||!l)return e.jsxs("callout-danger",{className:"notification",children:[e.jsx("div",{className:"title",children:"DiffLink Error: invalid input"}),!u&&e.jsxs("div",{children:['app1: "',t,'" is not a valid app name']}),!l&&e.jsxs("div",{children:['app2: "',s,'" is not a valid app name']})]});a||(a=`app1=${u}&app2=${l}`);const x=r?`/diff?${a}`:`?${decodeURIComponent(it(new URLSearchParams,"preview",`diff&${a}`).toString())}`;return n||(n=e.jsxs("span",{children:["Go to Diff ",r?"":"Preview"," from: ",e.jsx("code",{children:u})," to:"," ",e.jsx("code",{children:l})]})),e.jsx(ae,{to:x,children:n})}function ir({file:t}){return e.jsxs("div",{className:"border-4 border-[#ff4545] bg-[#ff454519] p-4 text-lg",children:["Something went wrong compiling ",e.jsx("b",{children:"CodeFile"})," for file: ",e.jsx("u",{children:t})," to markdown"]})}function cr({file:t,type:s="problem",children:n,variant:r,cacheLocation:a,embeddedKey:o,...i}){const[u,l]=c.useState("visible"),d=Z()[s],m=()=>{u==="visible"&&(l("collapse"),setTimeout(()=>{l("none")},400))},b=ee("rounded px-4 py-1 font-mono text-sm font-semibold outline-none transition duration-300 ease-in-out",{"bg-amber-300/70 hover:bg-amber-300/40 active:bg-amber-300/50":r==="warning","bg-red-300/70 hover:bg-red-300/40 active:bg-red-300/50":r==="error"});return e.jsxs("div",{className:ee("notification important h-15 relative",{"duration-400 !my-0 !h-0 !py-0 !opacity-0 transition-all ease-out":u!=="visible",hidden:u==="none"}),children:[e.jsxs("div",{className:"absolute right-3 top-3 z-50 flex gap-4",children:[d?e.jsx("div",{className:b,title:`Edit ${t}`,children:e.jsx(le,{appFile:t,appName:d.name,...i,children:"Edit this File"})}):null,d&&r==="warning"?e.jsx("div",{className:b,title:`Remove the warning from here and from ${t} cache file`,children:e.jsx(er,{handleClick:m,cacheLocation:a,embeddedKey:o,appFullPath:d.fullPath})}):null]}),n]})}function lr({file:t,type:s="playground",children:n=e.jsx("code",{children:t}),...r}){const a=Z(),o=a[s]||a[a.type],i=e.jsxs("div",{className:"launch-editor-button-wrapper flex underline underline-offset-4",children:[n," ",e.jsx("svg",{height:24,width:24,children:e.jsx("use",{href:"/icons.svg#keyboard"})})]});return ENV.EPICSHOP_DEPLOYED&&o?e.jsx("div",{className:"inline-block grow",children:e.jsx(le,{appFile:t,appName:o.name,...r,children:i})}):o?e.jsx("div",{className:"inline-block grow",children:e.jsx(le,{appFile:t,appName:o.name,...r,children:i})}):s==="playground"?e.jsx(K,{content:"You must 'Set to Playground' before opening a file",children:e.jsx("div",{className:"inline-block grow cursor-not-allowed",children:i})}):e.jsx(e.Fragment,{children:"children"})}function ur(t){return t==="problem"?"problem":t==="solution"?"solution":"playground"}function dr({to:t,children:s=e.jsx("code",{children:t.toString()}),...n}){var b;const[r]=ke(),a=`?${it(r,"pathname",t.toString()).toString()}`,o=Z(),i=ur(r.get("preview")),u=_e(),l=o[i],x=(l==null?void 0:l.dev.type)==="script"?De({domain:u.domain,port:l.dev.portNumber}):((b=o.playground)==null?void 0:b.dev.type)==="browser"?o.playground.dev.pathname:null,{inBrowserBrowserRef:d}=tr(),m=x?x.slice(0,-1)+t.toString():null;return e.jsxs("div",{className:"inline-flex items-center justify-between gap-1",children:[e.jsx(ae,{to:a,...n,className:ve(n.className,{"cursor-not-allowed":ENV.EPICSHOP_DEPLOYED}),title:ENV.EPICSHOP_DEPLOYED?"Cannot link to app in deployed version":void 0,onClick:y=>{var S,f;ENV.EPICSHOP_DEPLOYED&&y.preventDefault(),(S=n.onClick)==null||S.call(n,y),(f=d.current)==null||f.handleExtrnalNavigation(t.toString())},children:s}),m?e.jsx(K,{content:"Open in new tab",children:e.jsx("a",{href:m,target:"_blank",rel:"noreferrer",className:ve("flex aspect-square items-center justify-center",{"cursor-not-allowed":ENV.EPICSHOP_DEPLOYED}),title:ENV.EPICSHOP_DEPLOYED?"Cannot link to app in deployed version":"Open in new tab",onClick:y=>{ENV.EPICSHOP_DEPLOYED&&y.preventDefault()},children:e.jsx(O,{name:"ExternalLink"})})}):null]})}const fr=h.intersection(h.object({type:h.literal("epicshop:test-status-update"),timestamp:h.number()}),h.union([h.object({status:h.literal("pending")}),h.object({status:h.literal("pass")}),h.object({status:h.literal("fail"),error:h.string()})])),pr=h.object({type:h.literal("epicshop:test-step-update"),status:h.literal("pass"),title:h.string(),timestamp:h.number()}),hr=h.union([pr,fr]);function mr({pathname:t,testFile:s}){const n=c.useRef(null),[r,a]=c.useState(null),[o,i]=c.useState([]);c.useEffect(()=>{function d(m){var S;if(m.source!==((S=n.current)==null?void 0:S.contentWindow)||"request"in m.data)return;const b=hr.safeParse(m.data,{path:["messageEvent","data"]});if(!b.success){console.error("Invalid message from test iframe",m.data,b.error);return}const{data:y}=b;y.type==="epicshop:test-status-update"&&(y.status==="pending"&&i([]),a(y)),y.type==="epicshop:test-step-update"&&i(f=>[...f,y])}return window.addEventListener("message",d),()=>{window.removeEventListener("message",d)}},[]);const u={pending:e.jsx(Oe,{"aria-label":"Pending"}),pass:e.jsx(O,{name:"CheckSmall","aria-label":"Passed",className:"text-emerald-700"}),fail:e.jsx(O,{name:"Remove","aria-label":"Failed",className:"text-foreground-danger"}),unknown:e.jsx(O,{name:"Question","aria-label":"Unknown",className:"animate-pulse"})}[(r==null?void 0:r.status)??"unknown"],l=o.sort((d,m)=>d.timestamp-m.timestamp),x={pass:e.jsx(O,{name:"CheckSmall","aria-label":"Passed"}),fail:e.jsx(O,{name:"Remove","aria-label":"Failed"}),unknown:e.jsx(O,{name:"Question","aria-label":"Unknown",className:"animate-pulse"})};return e.jsx(e.Fragment,{children:e.jsx(Lt,{className:"w-full",type:"multiple",children:e.jsx(At,{icon:u,title:s,forceMount:!0,children:e.jsxs("div",{className:"not-prose",children:[e.jsxs("div",{className:"p-5 pt-3",children:[e.jsx("ul",{className:"",children:l.map(d=>e.jsx("li",{children:e.jsxs("div",{className:"flex items-baseline gap-2 text-emerald-700",children:[e.jsx("span",{children:x[d.status]}),e.jsx("pre",{className:"whitespace-pre-wrap",children:d.title})]})},d.timestamp+d.title))}),(r==null?void 0:r.status)==="fail"?e.jsxs("div",{className:"flex items-baseline gap-2 text-foreground-danger",children:[e.jsx("span",{children:x.fail}),e.jsx("pre",{className:"max-h-48 overflow-y-auto text-foreground-danger scrollbar-thin scrollbar-thumb-scrollbar",children:r.error})]}):null,e.jsx("iframe",{ref:n,title:s,src:t+s,className:"mt-5 min-h-[420px] w-full border bg-white"})]}),e.jsxs("div",{className:"flex border-y",children:[e.jsx("button",{onClick:()=>{var d,m;return(m=(d=n.current)==null?void 0:d.contentWindow)==null?void 0:m.location.reload()},className:"border-r p-3",children:e.jsx(O,{name:"Refresh","aria-label":"Rerun Tests"})}),e.jsx("a",{href:t+s,target:"_blank",rel:"noreferrer",className:"border-r p-3",children:e.jsx(O,{name:"ExternalLink","aria-label":"Open in New Window"})})]})]})})})})}const xr=h.union([h.object({type:h.literal("init"),exitCode:h.number().nullable().optional(),isRunning:h.boolean(),output:h.array(h.object({type:h.union([h.literal("stdout"),h.literal("stderr")]),html:h.string(),timestamp:h.number()}))}),h.object({type:h.union([h.literal("stdout"),h.literal("stderr")]),data:h.string(),timestamp:h.number()}),h.object({type:h.literal("exit"),isRunning:h.literal(!1),code:h.number().nullable()})]),br=h.array(xr);function gr(t,s){return s(t)}function vr({name:t}){const[s,n]=c.useReducer(gr,{version:0,isRunning:!1,exitCode:void 0,lines:[]}),{version:r,isRunning:a,exitCode:o,lines:i}=s,u=rn(`/test?${new URLSearchParams({name:t})}&v=${r}`);return c.useEffect(()=>{if(!u)return;const l=JSON.parse(u),x=br.safeParse(l);if(!x.success){console.error(x.error.flatten());return}for(const d of x.data)switch(d.type){case"exit":{const{isRunning:m,code:b}=d;n(y=>({...y,isRunning:m,exitCode:b}));break}case"init":{const{output:m,exitCode:b,isRunning:y}=d;n(S=>({...S,lines:m,exitCode:b,isRunning:y}));break}case"stderr":case"stdout":{const{type:m,data:b,timestamp:y}=d;n(S=>({...S,lines:[...S.lines,{type:m,html:b,timestamp:y}].sort((f,P)=>f.timestamp-P.timestamp),isRunning:!0}));break}}},[u]),e.jsxs("div",{className:"relative flex h-full w-full flex-col",children:[e.jsxs("div",{className:"flex h-12 w-full flex-shrink-0 items-center justify-between border-b",children:[e.jsxs("div",{className:"flex h-full items-center",children:[!a&&e.jsx($r,{name:t,onRun:()=>{n(l=>({...l,exitCode:void 0,lines:[],version:l.version+1}))}}),a?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"flex h-full flex-grow items-center justify-center border-r px-3.5",children:e.jsx(Oe,{role:"status","aria-label":"Running Tests"})}),e.jsx(wr,{name:t})]}):null]}),!a&&o!==void 0&&e.jsx("p",{className:"pr-3.5 leading-none",children:o===0?"Tests passed":`Test failed (exit code ${String(o)})`}),!a&&o!==void 0&&e.jsx(jr,{name:t,onClear:()=>{n(l=>({...l,exitCode:void 0,lines:[]}))}})]}),e.jsxs("div",{className:"flex h-full flex-col gap-5 p-5",children:[e.jsx("p",{className:"font-mono text-sm font-medium uppercase",children:"Test Output"}),e.jsx("pre",{className:"shadow-on-scrollbox flex-1 overflow-y-scroll scrollbar-thin scrollbar-thumb-scrollbar",children:i.map(l=>e.jsx("code",{"data-type":l.type,dangerouslySetInnerHTML:{__html:l.html}},l.timestamp))})]})]})}function $r({name:t,onRun:s}){const n=W(),r=c.useRef(s);return c.useEffect(()=>{r.current=s},[s]),c.useEffect(()=>{var a,o;(a=n.data)!=null&&a.success&&((o=r.current)==null||o.call(r))},[n.data]),e.jsxs(n.Form,{method:"POST",action:"/test",className:"h-full",children:[e.jsx("input",{type:"hidden",name:"name",value:t}),e.jsx(K,{content:n.state==="idle"?"Run Tests":"Running Tests...",children:e.jsx("button",{type:"submit",name:"intent",value:"run",className:"flex h-full flex-grow items-center justify-center border-r px-3.5",children:n.state==="idle"?e.jsx(O,{name:"TriangleSmall"}):e.jsx(Oe,{role:"status"})})})]})}function jr({name:t,onClear:s}){const n=W(),r=c.useRef(s);return c.useEffect(()=>{r.current=s},[s]),c.useEffect(()=>{var a,o;(a=n.data)!=null&&a.success&&((o=r.current)==null||o.call(r))},[n.data]),e.jsxs(n.Form,{method:"POST",action:"/test",className:"h-full",children:[e.jsx("input",{type:"hidden",name:"name",value:t}),e.jsx(K,{content:n.state==="idle"?"Clear Tests":"Clearing Tests...",children:e.jsx("button",{type:"submit",name:"intent",value:"clear",className:"flex h-full flex-grow items-center justify-center border-l px-3.5",children:n.state==="idle"?e.jsx(O,{name:"Clear"}):e.jsx(O,{name:"Clear",className:"animate-pulse",role:"status"})})})]})}function wr({name:t,onStop:s}){const n=W(),r=c.useRef(s);return c.useEffect(()=>{r.current=s},[s]),c.useEffect(()=>{var a,o;(a=n.data)!=null&&a.success&&((o=r.current)==null||o.call(r))},[n.data]),e.jsxs(n.Form,{method:"POST",action:"/test",className:"h-full",children:[e.jsx("input",{type:"hidden",name:"name",value:t}),e.jsx(K,{content:n.state==="idle"?"Stop Tests":"Stopping Tests...",children:e.jsx("button",{type:"submit",name:"intent",value:"stop",className:"flex h-full flex-grow items-center justify-center border-r px-3.5",children:n.state==="idle"?e.jsx(O,{name:"Stop"}):e.jsx(O,{name:"Stop",className:"animate-pulse",role:"status"})})})]})}function yr({appInfo:t,problemAppName:s,allApps:n,isUpToDate:r}){const[a,o]=c.useState(0);let i=e.jsx("p",{children:"No tests here. Sorry."});if((t==null?void 0:t.test.type)==="script"&&(i=e.jsx(vr,{name:t.name})),(t==null?void 0:t.test.type)==="browser"){const{pathname:u}=t.test;i=e.jsxs("div",{className:"flex h-full w-full flex-grow flex-col",children:[t.test.testFiles.map(l=>e.jsx("div",{children:e.jsx(mr,{pathname:u,testFile:l})},l)),e.jsx("div",{className:"px-3 py-[21px]",children:e.jsxs("button",{onClick:()=>o(l=>l+1),className:"flex items-center gap-2 font-mono text-sm uppercase leading-none",children:[e.jsx(O,{name:"Refresh","aria-hidden":!0})," Rerun All Tests"]})})]},a)}return e.jsx(st,{playgroundAppName:t==null?void 0:t.appName,problemAppName:s,allApps:n,isUpToDate:r,children:i})}const ct="Popover",[lt,us]=Ne(ct,[Ye]),Ae=Ye(),[Nr,oe]=lt(ct),Sr=t=>{const{__scopePopover:s,children:n,open:r,defaultOpen:a,onOpenChange:o,modal:i=!1}=t,u=Ae(s),l=c.useRef(null),[x,d]=c.useState(!1),[m=!1,b]=Pe({prop:r,defaultProp:a,onChange:o});return c.createElement(gt,u,c.createElement(Nr,{scope:s,contentId:Ee(),triggerRef:l,open:m,onOpenChange:b,onOpenToggle:c.useCallback(()=>b(y=>!y),[b]),hasCustomAnchor:x,onCustomAnchorAdd:c.useCallback(()=>d(!0),[]),onCustomAnchorRemove:c.useCallback(()=>d(!1),[]),modal:i},n))},Pr="PopoverTrigger",Er=c.forwardRef((t,s)=>{const{__scopePopover:n,...r}=t,a=oe(Pr,n),o=Ae(n),i=Se(s,a.triggerRef),u=c.createElement(te.button,B({type:"button","aria-haspopup":"dialog","aria-expanded":a.open,"aria-controls":a.contentId,"data-state":ft(a.open)},r,{ref:i,onClick:z(t.onClick,a.onOpenToggle)}));return a.hasCustomAnchor?u:c.createElement(vt,B({asChild:!0},o),u)}),ut="PopoverPortal",[Cr,Tr]=lt(ut,{forceMount:void 0}),Dr=t=>{const{__scopePopover:s,forceMount:n,children:r,container:a}=t,o=oe(ut,s);return c.createElement(Cr,{scope:s,forceMount:n},c.createElement(Ce,{present:n||o.open},c.createElement(Ut,{asChild:!0,container:a},r)))},ue="PopoverContent",Or=c.forwardRef((t,s)=>{const n=Tr(ue,t.__scopePopover),{forceMount:r=n.forceMount,...a}=t,o=oe(ue,t.__scopePopover);return c.createElement(Ce,{present:r||o.open},o.modal?c.createElement(Rr,B({},a,{ref:s})):c.createElement(kr,B({},a,{ref:s})))}),Rr=c.forwardRef((t,s)=>{const n=oe(ue,t.__scopePopover),r=c.useRef(null),a=Se(s,r),o=c.useRef(!1);return c.useEffect(()=>{const i=r.current;if(i)return Ht(i)},[]),c.createElement(Yt,{as:$t,allowPinchZoom:!0},c.createElement(dt,B({},t,{ref:a,trapFocus:n.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:z(t.onCloseAutoFocus,i=>{var u;i.preventDefault(),o.current||(u=n.triggerRef.current)===null||u===void 0||u.focus()}),onPointerDownOutside:z(t.onPointerDownOutside,i=>{const u=i.detail.originalEvent,l=u.button===0&&u.ctrlKey===!0,x=u.button===2||l;o.current=x},{checkForDefaultPrevented:!1}),onFocusOutside:z(t.onFocusOutside,i=>i.preventDefault(),{checkForDefaultPrevented:!1})})))}),kr=c.forwardRef((t,s)=>{const n=oe(ue,t.__scopePopover),r=c.useRef(!1),a=c.useRef(!1);return c.createElement(dt,B({},t,{ref:s,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:o=>{var i;if((i=t.onCloseAutoFocus)===null||i===void 0||i.call(t,o),!o.defaultPrevented){var u;r.current||(u=n.triggerRef.current)===null||u===void 0||u.focus(),o.preventDefault()}r.current=!1,a.current=!1},onInteractOutside:o=>{var i,u;(i=t.onInteractOutside)===null||i===void 0||i.call(t,o),o.defaultPrevented||(r.current=!0,o.detail.originalEvent.type==="pointerdown"&&(a.current=!0));const l=o.target;((u=n.triggerRef.current)===null||u===void 0?void 0:u.contains(l))&&o.preventDefault(),o.detail.originalEvent.type==="focusin"&&a.current&&o.preventDefault()}}))}),dt=c.forwardRef((t,s)=>{const{__scopePopover:n,trapFocus:r,onOpenAutoFocus:a,onCloseAutoFocus:o,disableOutsidePointerEvents:i,onEscapeKeyDown:u,onPointerDownOutside:l,onFocusOutside:x,onInteractOutside:d,...m}=t,b=oe(ue,n),y=Ae(n);return Bt(),c.createElement(Vt,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:a,onUnmountAutoFocus:o},c.createElement(jt,{asChild:!0,disableOutsidePointerEvents:i,onInteractOutside:d,onEscapeKeyDown:u,onPointerDownOutside:l,onFocusOutside:x,onDismiss:()=>b.onOpenChange(!1)},c.createElement(wt,B({"data-state":ft(b.open),role:"dialog",id:b.contentId},y,m,{ref:s,style:{...m.style,"--radix-popover-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-popover-content-available-width":"var(--radix-popper-available-width)","--radix-popover-content-available-height":"var(--radix-popper-available-height)","--radix-popover-trigger-width":"var(--radix-popper-anchor-width)","--radix-popover-trigger-height":"var(--radix-popper-anchor-height)"}}))))});function ft(t){return t?"open":"closed"}const _r=Sr,Mr=Er,Ir=Dr,Fr=Or;function Lr(){var i,u;const t=Z(),[s,n]=c.useState(!1),r=c.useRef(null);function a(){n(!1)}const o=(i=t.playground)==null?void 0:i.appName;return e.jsx(e.Fragment,{children:e.jsxs(_r,{open:s,onOpenChange:n,children:[e.jsx(Mr,{asChild:!0,children:e.jsxs("button",{className:"flex h-full items-center gap-1 border-r px-6 py-3 font-mono text-sm uppercase","aria-label":"Relevant Files",children:[e.jsx(O,{name:"Files"}),"Files"]})}),e.jsx(Ir,{children:e.jsx(Fr,{ref:r,className:"slideRightContent lg:slideUpContent invert-theme z-10 select-none rounded bg-background px-9 py-8 text-foreground",align:"start",sideOffset:5,children:e.jsxs("div",{className:"launch-editor-wrapper",children:[e.jsx("strong",{className:"inline-block px-2 pb-4 font-semibold uppercase",children:"Relevant Files"}),t.problem&&((u=t.playground)==null?void 0:u.appName)!==t.problem.name?e.jsx("div",{className:"mb-2 rounded p-1 font-mono font-medium",children:e.jsx(Fe,{appName:t.problem.name})}):null,e.jsx("div",{id:"files",children:e.jsx(c.Suspense,{fallback:e.jsx(K,{content:"Loading diff",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(O,{name:"Refresh",className:"h-8 w-8 animate-spin"})})}),children:e.jsx(Ve,{resolve:t.diff,errorElement:e.jsx("div",{className:"text-foreground-danger",children:"Something went wrong."}),children:({diffFiles:l})=>{if(!l)return e.jsx("p",{className:"text-foreground-danger",children:"Unable to determine diff"});if(typeof l=="string")return e.jsx("p",{className:"text-foreground-danger",children:l});if(!l.length)return e.jsx("p",{children:"No files changed"});const x=o||ENV.EPICSHOP_GITHUB_ROOT?{}:{title:"You must 'Set to Playground' before opening a file",className:"not-allowed"};return e.jsxs("ul",{...x,children:[l.length>1&&!ENV.EPICSHOP_DEPLOYED?e.jsx("div",{className:"mb-2 border-b border-b-gray-50 border-opacity-50 pb-2 font-sans",children:e.jsx(le,{appFile:l.map(d=>`${d.path},${d.line},1`),appName:"playground",onUpdate:a,children:e.jsx("p",{children:"Open All Files"})})}):null,l.map(d=>{var m;return e.jsx("li",{"data-state":d.status,children:e.jsx(le,{appFile:`${d.path},${d.line},1`,appName:ENV.EPICSHOP_DEPLOYED?((m=t.problem)==null?void 0:m.name)??"playground":"playground",onUpdate:a,children:e.jsx("code",{children:d.path})})},d.path)})]})}})})})]})})})]})})}function pt(t,s){var i;const n=(t==null?void 0:t.exerciseStepApp.exerciseNumber.toString().padStart(2,"0"))??"00",r=(t==null?void 0:t.exerciseStepApp.stepNumber.toString().padStart(2,"0"))??"00",a={problem:"💪",solution:"🏁"}[(t==null?void 0:t.type)??"problem"],o=((i=t==null?void 0:t[t.type])==null?void 0:i.title)??"N/A";return{emoji:a,stepNumber:r,title:o,exerciseNumber:n,exerciseTitle:(t==null?void 0:t.exerciseTitle)??"Unknown exercise",workshopTitle:s,type:(t==null?void 0:t.type)??"problem"}}const ds=({data:t,matches:s})=>{var l;const n=(l=s.find(x=>x.id==="root"))==null?void 0:l.data,{emoji:r,stepNumber:a,title:o,exerciseNumber:i,exerciseTitle:u}=pt(t);return[{title:`${r} | ${a}. ${o} | ${i}. ${u} | ${(n==null?void 0:n.workshopTitle)??"Epic Workshop"}`}]},ye=["playground","problem","solution","tests","diff","chat"],Ar=t=>!!(t&&ye.includes(t));function Ur(t,s,n){const r=new URLSearchParams(t);return n===null?r.delete(s):r.set(s,n),r}function fs(){var m,b,y,S,f,P,C;const t=Z(),[s]=ke(),n=s.get("preview"),r=c.useRef(null),a=pt(t),o=Te(),i=ht();function u(v){var D,L;if(v==="tests")return ENV.EPICSHOP_DEPLOYED||!t.playground||t.playground.test.type==="none";if(v==="problem"||v==="solution"){if(((D=t[v])==null?void 0:D.dev.type)==="none")return!0;if(ENV.EPICSHOP_DEPLOYED)return((L=t[v])==null?void 0:L.dev.type)!=="browser"}return!!(v==="playground"&&ENV.EPICSHOP_DEPLOYED)}const l=Ar(n)?n:ye.find(v=>!u(v)),x=`/diff?${new URLSearchParams({app1:((m=t.problem)==null?void 0:m.name)??"",app2:((b=t.solution)==null?void 0:b.name)??""})}`;function d(v){v.altKey&&!v.ctrlKey&&!v.shiftKey&&!v.metaKey&&(v.preventDefault(),i(x))}return e.jsx("div",{className:"flex 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 leading-tight",children:e.jsxs("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 uppercase",children:[e.jsxs(ae,{to:`/${a.exerciseNumber}`,className:"hover:underline",children:[a.exerciseNumber,". ",a.exerciseTitle]}),"/",e.jsxs(ae,{to:".",className:"hover:underline",children:[a.stepNumber,". ",a.title," (",a.emoji," ",a.type,")"]})]}),t.problem&&((y=t.playground)==null?void 0:y.appName)!==t.problem.name?e.jsx(Fe,{appName:t.problem.name}):null]})}),e.jsx("article",{id:t.articleId,className:"shadow-on-scrollbox h-full w-full max-w-none flex-1 scroll-pt-6 space-y-6 overflow-y-auto p-10 pt-8 scrollbar-thin scrollbar-thumb-scrollbar",children:t.exerciseStepApp.instructionsCode?e.jsx("div",{className:"prose dark:prose-invert sm:prose-lg",children:e.jsx(sr,{inBrowserBrowserRef:r})}):e.jsx("p",{children:"No instructions yet..."})},t.articleId),e.jsx(mt,{elementQuery:`#${t.articleId}`},`scroll-${t.articleId}`),t.type==="solution"?e.jsx(qt,{type:"step",exerciseNumber:t.exerciseStepApp.exerciseNumber,stepNumber:t.exerciseStepApp.stepNumber,className:"h-14 border-t px-6"}):null,e.jsxs("div",{className:"flex h-16 justify-between border-b-4 border-t lg:border-b-0",children:[e.jsx("div",{children:e.jsx("div",{className:"h-full",children:e.jsx(Lr,{})})}),e.jsx(Zt,{appName:t.exerciseStepApp.name,relativePath:t.exerciseStepApp.relativePath}),e.jsx(Kt,{prev:t.prevStepLink?{to:t.prevStepLink.to,"aria-label":"Previous Step"}:null,next:t.nextStepLink?{to:t.nextStepLink.to,"aria-label":"Next Step"}:null})]})]}),e.jsxs(Tn,{className:"relative col-span-1 row-span-1 flex flex-col overflow-y-auto",value:l,children:[e.jsx(Dn,{className:"h-14 min-h-14 overflow-x-hidden border-b scrollbar-thin scrollbar-thumb-scrollbar",children:ye.map(v=>{const D=u(v);return e.jsx(On,{value:v,hidden:D,asChild:!0,children:e.jsx(ae,{id:`${v}-tab`,className:ee("clip-path-button relative h-full px-6 py-4 font-mono text-sm uppercase outline-none radix-state-active:z-10 radix-state-active:bg-foreground radix-state-active:text-background radix-state-active:hover:bg-foreground/80 radix-state-active:hover:text-background/80 radix-state-inactive:hover:bg-foreground/20 radix-state-inactive:hover:text-foreground/80 focus:bg-foreground/80 focus:text-background/80",D?"hidden":"inline-block"),preventScrollReset:!0,prefetch:"intent",onClick:d,to:v==="diff"&&o?x:`?${Ur(s,"preview",v==="playground"?null:v)}`,children:v})},v)})}),e.jsxs("div",{className:"relative z-10 flex flex-grow flex-col overflow-y-auto",children:[e.jsx(se,{value:"playground",className:"flex flex-grow items-center justify-center radix-state-inactive:hidden",children:e.jsx(Xn,{appInfo:t.playground,problemAppName:(S=t.problem)==null?void 0:S.name,inBrowserBrowserRef:r,allApps:t.allApps,isUpToDate:((f=t.playground)==null?void 0:f.isUpToDate)??!1})}),e.jsx(se,{value:"problem",className:"flex flex-grow items-center justify-center radix-state-inactive:hidden",children:e.jsx(we,{appInfo:t.problem,inBrowserBrowserRef:r})}),e.jsx(se,{value:"solution",className:"flex flex-grow items-center justify-center radix-state-inactive:hidden",children:e.jsx(we,{appInfo:t.solution,inBrowserBrowserRef:r})}),e.jsx(se,{value:"tests",className:"flex flex-grow items-start justify-center overflow-hidden radix-state-inactive:hidden",children:e.jsx(yr,{appInfo:t.playground,problemAppName:(P=t.problem)==null?void 0:P.name,allApps:t.allApps,isUpToDate:((C=t.playground)==null?void 0:C.isUpToDate)??!1})}),e.jsx(se,{value:"diff",className:"flex h-full flex-grow items-start justify-center radix-state-inactive:hidden",children:e.jsx(zt,{diff:t.diff,allApps:t.allApps})}),e.jsx(se,{value:"chat",className:"flex h-full flex-grow items-start justify-center radix-state-inactive:hidden",children:e.jsx(Hn,{})})]})]})]})})}function ps(){return e.jsx(Gt,{statusHandlers:{404:()=>e.jsx("p",{children:"Sorry, we couldn't find an app here."})}})}export{ps as ErrorBoundary,fs as default,ds as meta};
2
- //# sourceMappingURL=_layout-CGUp6BkS.js.map