@epic-web/workshop-app 5.4.1 → 5.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.
- package/build/client/assets/{_-BrkpfnBb.js → _-hAKYb2AG.js} +2 -2
- package/build/client/assets/{_-BrkpfnBb.js.map → _-hAKYb2AG.js.map} +1 -1
- package/build/client/assets/_exerciseNumber-PTdG9GGB.js +2 -0
- package/build/client/assets/_exerciseNumber-PTdG9GGB.js.map +1 -0
- package/build/client/assets/{_exerciseNumber_._stepNumber-BIMJh_sg.js → _exerciseNumber_._stepNumber-03erOIGo.js} +2 -2
- package/build/client/assets/{_exerciseNumber_._stepNumber-BIMJh_sg.js.map → _exerciseNumber_._stepNumber-03erOIGo.js.map} +1 -1
- package/build/client/assets/_exerciseNumber_.finished-DQg4F1NL.js +2 -0
- package/build/client/assets/_exerciseNumber_.finished-DQg4F1NL.js.map +1 -0
- package/build/client/assets/{_layout-88n0To1b.js → _layout-B4JGpA3A.js} +2 -2
- package/build/client/assets/{_layout-88n0To1b.js.map → _layout-B4JGpA3A.js.map} +1 -1
- package/build/client/assets/{_layout-Dfmv2zcn.js → _layout-BJbMl6SJ.js} +2 -2
- package/build/client/assets/{_layout-Dfmv2zcn.js.map → _layout-BJbMl6SJ.js.map} +1 -1
- package/build/client/assets/_layout-Bu0lel3p.js +6 -0
- package/build/client/assets/_layout-Bu0lel3p.js.map +1 -0
- package/build/client/assets/_layout-DHoH74NH.js +2 -0
- package/build/client/assets/_layout-DHoH74NH.js.map +1 -0
- package/build/client/assets/{accordion-D9-D-n9p.js → accordion-DLg7gJkp.js} +2 -2
- package/build/client/assets/{accordion-D9-D-n9p.js.map → accordion-DLg7gJkp.js.map} +1 -1
- package/build/client/assets/account-DLDPrc9J.js +2 -0
- package/build/client/assets/account-DLDPrc9J.js.map +1 -0
- package/build/client/assets/app-DJDjmdlu.js +2 -0
- package/build/client/assets/{app-DgTXXO8s.js.map → app-DJDjmdlu.js.map} +1 -1
- package/build/client/assets/{button-_qPvcoqR.js → button-39zQyNX6.js} +2 -2
- package/build/client/assets/{button-_qPvcoqR.js.map → button-39zQyNX6.js.map} +1 -1
- package/build/client/assets/{components-Be92gVxW.js → components-DUNtf72c.js} +2 -2
- package/build/client/assets/{components-Be92gVxW.js.map → components-DUNtf72c.js.map} +1 -1
- package/build/client/assets/diff-B3oaU_KB.js +2 -0
- package/build/client/assets/{diff-BhRAIPKc.js.map → diff-B3oaU_KB.js.map} +1 -1
- package/build/client/assets/{diff-8nlDkmpc.js → diff-BNCREJvf.js} +2 -2
- package/build/client/assets/{diff-8nlDkmpc.js.map → diff-BNCREJvf.js.map} +1 -1
- package/build/client/assets/{discord-BUWZUTEC.js → discord-CEOqKs_c.js} +2 -2
- package/build/client/assets/{discord-BUWZUTEC.js.map → discord-CEOqKs_c.js.map} +1 -1
- package/build/client/assets/discord-CpIgvYus.js +2 -0
- package/build/client/assets/discord-CpIgvYus.js.map +1 -0
- package/build/client/assets/{entry.client-DqIWuxf8.js → entry.client-CrlHhRMR.js} +2 -2
- package/build/client/assets/{entry.client-DqIWuxf8.js.map → entry.client-CrlHhRMR.js.map} +1 -1
- package/build/client/assets/epic-video-D8ex9vao.js +2 -0
- package/build/client/assets/epic-video-D8ex9vao.js.map +1 -0
- package/build/client/assets/error-boundary-3zItlMUO.js +2 -0
- package/build/client/assets/{error-boundary-BZA-ffa8.js.map → error-boundary-3zItlMUO.js.map} +1 -1
- package/build/client/assets/finished-rUzUjnEm.js +2 -0
- package/build/client/assets/finished-rUzUjnEm.js.map +1 -0
- package/build/client/assets/index-BajUQsFT.js +3053 -0
- package/build/client/assets/index-BajUQsFT.js.map +1 -0
- package/build/client/assets/{index-BCxBKsqT.js → index-CLNXC84j.js} +2 -2
- package/build/client/assets/{index-BCxBKsqT.js.map → index-CLNXC84j.js.map} +1 -1
- package/build/client/assets/{index-BCTr8uu6.js → index-CV3nxGFp.js} +2 -2
- package/build/client/assets/{index-BCTr8uu6.js.map → index-CV3nxGFp.js.map} +1 -1
- package/build/client/assets/{index-BFGhCX_U.js → index-C_B1-9rF.js} +2 -2
- package/build/client/assets/{index-BFGhCX_U.js.map → index-C_B1-9rF.js.map} +1 -1
- package/build/client/assets/{index-pkiQppkK.js → index-DDqzbGM2.js} +2 -2
- package/build/client/assets/{index-pkiQppkK.js.map → index-DDqzbGM2.js.map} +1 -1
- package/build/client/assets/index-DE-jwnOP.js +2 -0
- package/build/client/assets/index-DE-jwnOP.js.map +1 -0
- package/build/client/assets/{index-DZDhtMuq.js → index-DFqQCjCw.js} +2 -2
- package/build/client/assets/{index-DZDhtMuq.js.map → index-DFqQCjCw.js.map} +1 -1
- package/build/client/assets/{index-Bdg3v8tC.js → index-DH1w3QmP.js} +2 -2
- package/build/client/assets/{index-Bdg3v8tC.js.map → index-DH1w3QmP.js.map} +1 -1
- package/build/client/assets/{index-C9Hx0Dey.js → index-LjRZeU7x.js} +2 -2
- package/build/client/assets/{index-C9Hx0Dey.js.map → index-LjRZeU7x.js.map} +1 -1
- package/build/client/assets/index-mivnjq36.js +2 -0
- package/build/client/assets/index-mivnjq36.js.map +1 -0
- package/build/client/assets/{loading-XhMtj4mp.js → loading-DW_I206H.js} +2 -2
- package/build/client/assets/{loading-XhMtj4mp.js.map → loading-DW_I206H.js.map} +1 -1
- package/build/client/assets/{login-C1oOgi98.js → login-CdNej0Z7.js} +2 -2
- package/build/client/assets/{login-C1oOgi98.js.map → login-CdNej0Z7.js.map} +1 -1
- package/build/client/assets/manifest-62ea49c4.js +1 -0
- package/build/client/assets/{mdx-CEjzXoEx.js → mdx-C9dqA6IZ.js} +2 -2
- package/build/client/assets/{mdx-CEjzXoEx.js.map → mdx-C9dqA6IZ.js.map} +1 -1
- package/build/client/assets/{misc-DUy_whwE.js → misc-DIdEn_jt.js} +2 -2
- package/build/client/assets/{misc-DUy_whwE.js.map → misc-DIdEn_jt.js.map} +1 -1
- package/build/client/assets/{nav-chevrons-DnR25VLp.js → nav-chevrons-B3SvZV8B.js} +2 -2
- package/build/client/assets/{nav-chevrons-DnR25VLp.js.map → nav-chevrons-B3SvZV8B.js.map} +1 -1
- package/build/client/assets/onboarding-CC9zz4rl.js +2 -0
- package/build/client/assets/onboarding-CC9zz4rl.js.map +1 -0
- package/build/client/assets/{pe-ChIwTk8v.js → pe-D5h19vSo.js} +2 -2
- package/build/client/assets/{pe-ChIwTk8v.js.map → pe-D5h19vSo.js.map} +1 -1
- package/build/client/assets/presence-D1DPz__2.js +28 -0
- package/build/client/assets/presence-D1DPz__2.js.map +1 -0
- package/build/client/assets/{preview-DaZd0wMb.js → preview-BEtmdi0E.js} +2 -2
- package/build/client/assets/{preview-DaZd0wMb.js.map → preview-BEtmdi0E.js.map} +1 -1
- package/build/client/assets/{product-DIAmCwmZ.js → product-CYOFfeJM.js} +2 -2
- package/build/client/assets/{product-DIAmCwmZ.js.map → product-CYOFfeJM.js.map} +1 -1
- package/build/client/assets/{progress-DQt_Bn9o.js → progress-D6SP0Gec.js} +2 -2
- package/build/client/assets/{progress-DQt_Bn9o.js.map → progress-D6SP0Gec.js.map} +1 -1
- package/build/client/assets/{progress-bar-BaTU3Yx_.js → progress-bar-CBDBzRQ2.js} +2 -2
- package/build/client/assets/{progress-bar-BaTU3Yx_.js.map → progress-bar-CBDBzRQ2.js.map} +1 -1
- package/build/client/assets/{request-info-ByUEfOil.js → request-info-vBkaf3Rk.js} +2 -2
- package/build/client/assets/{request-info-ByUEfOil.js.map → request-info-vBkaf3Rk.js.map} +1 -1
- package/build/client/assets/{revalidation-ws-dUa9CAqr.js → revalidation-ws-DK5QOPlL.js} +2 -2
- package/build/client/assets/{revalidation-ws-dUa9CAqr.js.map → revalidation-ws-DK5QOPlL.js.map} +1 -1
- package/build/client/assets/{root-a3d3Qwip.js → root-Bg-hxaOK.js} +2 -2
- package/build/client/assets/{root-a3d3Qwip.js.map → root-Bg-hxaOK.js.map} +1 -1
- package/build/client/assets/{set-playground-CBHBA46B.js → set-playground-CMoUFgkO.js} +2 -2
- package/build/client/assets/{set-playground-CBHBA46B.js.map → set-playground-CMoUFgkO.js.map} +1 -1
- package/build/client/assets/{support-CIz02V_r.js → support-CPzYlWkd.js} +2 -2
- package/build/client/assets/{support-CIz02V_r.js.map → support-CPzYlWkd.js.map} +1 -1
- package/build/client/assets/test-C8wkLh9a.js +2 -0
- package/build/client/assets/{test-DoKJvNug.js.map → test-C8wkLh9a.js.map} +1 -1
- package/build/client/assets/{tests-DbuyD2cI.js → tests-CiM4RPOf.js} +2 -2
- package/build/client/assets/tests-CiM4RPOf.js.map +1 -0
- package/build/client/assets/{tooltip-DO9uwurQ.js → tooltip-BoVikCa-.js} +2 -2
- package/build/client/assets/{tooltip-DO9uwurQ.js.map → tooltip-BoVikCa-.js.map} +1 -1
- package/build/client/assets/{use-event-source-x59d4R2Z.js → use-event-source-M87p8Tme.js} +2 -2
- package/build/client/assets/{use-event-source-x59d4R2Z.js.map → use-event-source-M87p8Tme.js.map} +1 -1
- package/build/client/assets/{user-Bv6wYhQP.js → user-CbbIYEs8.js} +2 -2
- package/build/client/assets/{user-Bv6wYhQP.js.map → user-CbbIYEs8.js.map} +1 -1
- package/build/client/assets/{version-lxUUxt3s.js → version-CIF3cX3N.js} +2 -2
- package/build/client/assets/{version-lxUUxt3s.js.map → version-CIF3cX3N.js.map} +1 -1
- package/build/client/assets/{workshop-config-WVltG_BV.js → workshop-config-C5sYl312.js} +2 -2
- package/build/client/assets/{workshop-config-WVltG_BV.js.map → workshop-config-C5sYl312.js.map} +1 -1
- package/build/server/index.js +456 -782
- package/build/server/index.js.map +1 -1
- package/package.json +8 -8
- package/build/client/assets/_exerciseNumber-DCSM0NCG.js +0 -2
- package/build/client/assets/_exerciseNumber-DCSM0NCG.js.map +0 -1
- package/build/client/assets/_exerciseNumber_.finished-nbpk1ToO.js +0 -2
- package/build/client/assets/_exerciseNumber_.finished-nbpk1ToO.js.map +0 -1
- package/build/client/assets/_layout-Cbz7Qt-S.js +0 -6
- package/build/client/assets/_layout-Cbz7Qt-S.js.map +0 -1
- package/build/client/assets/_layout-DTAM9xh5.js +0 -2
- package/build/client/assets/_layout-DTAM9xh5.js.map +0 -1
- package/build/client/assets/account-C4Piztoz.js +0 -2
- package/build/client/assets/account-C4Piztoz.js.map +0 -1
- package/build/client/assets/app-DgTXXO8s.js +0 -2
- package/build/client/assets/diff-BhRAIPKc.js +0 -2
- package/build/client/assets/discord-Bdnx7fu-.js +0 -2
- package/build/client/assets/discord-Bdnx7fu-.js.map +0 -1
- package/build/client/assets/epic-video-Bp4BOD2R.js +0 -3053
- package/build/client/assets/epic-video-Bp4BOD2R.js.map +0 -1
- package/build/client/assets/error-boundary-BZA-ffa8.js +0 -2
- package/build/client/assets/finished-C0cpfAFL.js +0 -2
- package/build/client/assets/finished-C0cpfAFL.js.map +0 -1
- package/build/client/assets/index-Bi1TbRTj.js +0 -2
- package/build/client/assets/index-Bi1TbRTj.js.map +0 -1
- package/build/client/assets/index-Ca4vBON4.js +0 -2
- package/build/client/assets/index-Ca4vBON4.js.map +0 -1
- package/build/client/assets/manifest-e5b2a6e1.js +0 -1
- package/build/client/assets/onboarding-C2YNq60k.js +0 -2
- package/build/client/assets/onboarding-C2YNq60k.js.map +0 -1
- package/build/client/assets/presence-DJGFvdDh.js +0 -28
- package/build/client/assets/presence-DJGFvdDh.js.map +0 -1
- package/build/client/assets/test-DoKJvNug.js +0 -2
- package/build/client/assets/tests-DbuyD2cI.js.map +0 -1
- /package/build/client/assets/{epic-video-DUnRvy1A.css → index-DUnRvy1A.css} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{a as b,j as e}from"./index-C_B1-9rF.js";import{I as p}from"./misc-DIdEn_jt.js";import{S as j}from"./tooltip-BoVikCa-.js";import{a as g}from"./progress-D6SP0Gec.js";import{u as f,L as h,F as i}from"./components-DUNtf72c.js";import"./pe-D5h19vSo.js";const C={getSitemapEntries:()=>null},L=({matches:s})=>{var r;const t=(r=s.find(o=>o.id==="root"))==null?void 0:r.data;return[{title:`👷 | ${t==null?void 0:t.workshopTitle}`}]};function N(s,t){return s.type==="unknown"&&t.type==="unknown"?0:s.type==="unknown"?-1:t.type==="unknown"?1:0}function S(s){switch(s.type){case"workshop-instructions":return"/";case"workshop-finished":return"/finished";case"instructions":return`/${s.exerciseNumber.toString().padStart(2,"0")}`;case"step":return`/${s.exerciseNumber.toString().padStart(2,"0")}/${s.stepNumber.toString().padStart(2,"0")}`;case"finished":return`/${s.exerciseNumber.toString().padStart(2,"0")}/finished`;default:return""}}function T(){var a,c;const s=f(),t=b(),r=g(),o=((a=t.formData)==null?void 0:a.get("intent"))==="inspect",u=((c=t.formData)==null?void 0:c.get("intent"))==="stop-inspect",x={completed:"bg-blue-500",incomplete:"bg-yellow-500"};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-bold",children:"Progress"}),r?e.jsx("ul",{className:"flex max-h-72 flex-col gap-2 overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar",children:r.sort(N).map(n=>{const l=n.epicCompletedAt?"completed":"incomplete",d=[n.epicLessonSlug,n.epicCompletedAt?`(${n.epicCompletedAt})`:null].filter(Boolean).join(" ");return e.jsxs("li",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`h-3 w-3 rounded-full ${x[l]}`,title:l}),n.type==="unknown"?e.jsxs("span",{className:"flex items-center gap-1",children:[d,e.jsx("span",{className:"text-red-500",children:e.jsx(j,{content:"This video is in the workshop on EpicWeb.dev, but not in the local workshop.",children:e.jsx(p,{name:"Close"})})})]}):e.jsx(h,{to:S(n),children:d}),e.jsx(h,{to:n.epicLessonUrl,children:e.jsx(p,{name:"ExternalLink"})})]},n.epicLessonSlug)})}):e.jsx("p",{children:"No progress data"})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-bold",children:"Commands"}),e.jsxs("ul",{className:"max-h-48 overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar",children:[e.jsx("li",{children:e.jsx(i,{method:"POST",children:e.jsx("button",{name:"intent",value:"clear-caches",children:"Clear local caches"})})}),e.jsx("li",{children:e.jsx(i,{method:"POST",children:e.jsx("button",{name:"intent",value:"clear-data",children:"Clear all local data (including auth data)"})})}),e.jsx("li",{children:s.inspectorRunning?e.jsx(i,{method:"POST",children:e.jsx("button",{name:"intent",value:"stop-inspect",children:o?"Stopping inspector...":"Stop inspector"})}):e.jsx(i,{method:"POST",children:e.jsx("button",{name:"intent",value:"inspect",children:u?"Starting inspector...":"Start inspector"})})})]})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-bold",children:"Apps"}),e.jsx("ul",{className:"max-h-48 list-none overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar",children:s.apps.map(n=>e.jsxs("li",{className:"flex items-center gap-2 py-1",children:[s.processes[n.name]?e.jsx(m,{status:"running"}):e.jsx(m,{status:"stopped"}),n.name]},n.name))})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-bold",children:"Processes"}),e.jsx("ul",{className:"overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar",children:Object.entries(s.processes).map(([n,l])=>e.jsx("li",{children:e.jsxs("span",{children:[n," - Port: ",l.port," - PID ",l.pid," -"," ",l.color]})},n))})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-bold",children:"Test Processes"}),e.jsx("ul",{className:"overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar",children:Object.entries(s.testProcesses).map(([n,l])=>e.jsx("li",{children:e.jsxs("span",{children:[n," - PID ",l.pid," - Exit code: ",l.exitCode]})},n))})]})]})}function m({status:s}){const t={running:{pinger:"bg-green-400",circle:"bg-green-500"},starting:{pinger:"bg-sky-400",circle:"bg-sky-500"},stopped:{circle:"bg-gray-500"},taken:{pinger:"bg-red-400",circle:"bg-red-500"}}[s];return e.jsxs("span",{className:"relative flex h-3 w-3",children:[t.pinger?e.jsx("span",{className:`absolute inline-flex h-full w-full animate-ping rounded-full ${t.pinger} opacity-75`}):null,e.jsx("span",{className:`relative inline-flex h-3 w-3 rounded-full ${t.circle}`})]})}export{T as default,C as handle,L as meta};
|
|
2
|
+
//# sourceMappingURL=index-DDqzbGM2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-pkiQppkK.js","sources":["../../../app/routes/admin+/index.tsx"],"sourcesContent":["import { getApps } from '@epic-web/workshop-utils/apps.server'\nimport { getProcesses } from '@epic-web/workshop-utils/process-manager.server'\nimport {\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport { type SEOHandle } from '@nasa-gcn/remix-seo'\nimport {\n\tunstable_data as data,\n\ttype ActionFunctionArgs,\n\ttype LoaderFunctionArgs,\n\ttype MetaFunction,\n} from '@remix-run/node'\nimport { Form, Link, useLoaderData, useNavigation } from '@remix-run/react'\nimport { Icon } from '#app/components/icons.tsx'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.tsx'\nimport { type loader as rootLoader } from '#app/root.tsx'\nimport {\n\tuseEpicProgress,\n\ttype SerializedProgress,\n} from '#app/routes/progress.tsx'\nimport { ensureUndeployed } from '#app/utils/misc.tsx'\nimport {\n\tclearCaches,\n\tclearData,\n\tstartInspector,\n\tstopInspector,\n} from './admin-utils.server.tsx'\n\ndeclare global {\n\tvar __inspector_open__: boolean | undefined\n}\n\nexport const handle: SEOHandle = {\n\tgetSitemapEntries: () => null,\n}\n\nexport const meta: MetaFunction<typeof loader, { root: typeof rootLoader }> = ({\n\tmatches,\n}) => {\n\tconst rootData = matches.find((m) => m.id === 'root')?.data\n\treturn [{ title: `👷 | ${rootData?.workshopTitle}` }]\n}\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tensureUndeployed()\n\tconst timings = makeTimings('adminLoader')\n\tconst apps = (await getApps({ request, timings })).filter(\n\t\t(a, i, ar) => ar.findIndex((b) => a.name === b.name) === i,\n\t)\n\tconst processes: Record<\n\t\tstring,\n\t\t{ port: number; pid?: number; color: string }\n\t> = {}\n\tconst testProcesses: Record<\n\t\tstring,\n\t\t{ pid?: number; exitCode?: number | null }\n\t> = {}\n\tfor (const [\n\t\tname,\n\t\t{ port, process, color },\n\t] of getProcesses().devProcesses.entries()) {\n\t\tprocesses[name] = { port, pid: process.pid, color }\n\t}\n\n\tfor (const [\n\t\tname,\n\t\t{ process, exitCode },\n\t] of getProcesses().testProcesses.entries()) {\n\t\ttestProcesses[name] = { pid: process?.pid, exitCode }\n\t}\n\treturn data(\n\t\t{\n\t\t\tapps,\n\t\t\tprocesses,\n\t\t\ttestProcesses,\n\t\t\tinspectorRunning: global.__inspector_open__,\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 async function action({ request }: ActionFunctionArgs) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst intent = formData.get('intent')\n\tswitch (intent) {\n\t\tcase 'clear-data': {\n\t\t\tawait clearData()\n\t\t\treturn { success: true }\n\t\t}\n\t\tcase 'clear-caches': {\n\t\t\tawait clearCaches()\n\t\t\treturn { success: true }\n\t\t}\n\t\tcase 'inspect': {\n\t\t\tawait startInspector()\n\t\t\treturn { success: true }\n\t\t}\n\t\tcase 'stop-inspect': {\n\t\t\tawait stopInspector()\n\t\t\treturn { success: true }\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Unknown intent: ${intent}`)\n\t\t}\n\t}\n}\n\nfunction sortProgress(a: SerializedProgress, b: SerializedProgress) {\n\treturn a.type === 'unknown' && b.type === 'unknown'\n\t\t? 0\n\t\t: a.type === 'unknown'\n\t\t\t? -1\n\t\t\t: b.type === 'unknown'\n\t\t\t\t? 1\n\t\t\t\t: 0\n}\n\nfunction linkProgress(progress: SerializedProgress) {\n\tswitch (progress.type) {\n\t\tcase 'workshop-instructions':\n\t\t\treturn '/'\n\t\tcase 'workshop-finished':\n\t\t\treturn '/finished'\n\t\tcase 'instructions':\n\t\t\treturn `/${progress.exerciseNumber.toString().padStart(2, '0')}`\n\t\tcase 'step':\n\t\t\treturn `/${progress.exerciseNumber\n\t\t\t\t.toString()\n\t\t\t\t.padStart(2, '0')}/${progress.stepNumber.toString().padStart(2, '0')}`\n\t\tcase 'finished':\n\t\t\treturn `/${progress.exerciseNumber.toString().padStart(2, '0')}/finished`\n\t\tdefault:\n\t\t\treturn ''\n\t}\n}\n\nexport default function AdminLayout() {\n\tconst data = useLoaderData<typeof loader>()\n\tconst navigation = useNavigation()\n\tconst epicProgress = useEpicProgress()\n\n\tconst isStartingInspector = navigation.formData?.get('intent') === 'inspect'\n\tconst isStoppingInspector =\n\t\tnavigation.formData?.get('intent') === 'stop-inspect'\n\n\tconst progressStatus = {\n\t\tcompleted: 'bg-blue-500',\n\t\tincomplete: 'bg-yellow-500',\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div>\n\t\t\t\t<h2 className=\"text-lg font-bold\">Progress</h2>\n\t\t\t\t{epicProgress ? (\n\t\t\t\t\t<ul className=\"flex max-h-72 flex-col gap-2 overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t\t\t{epicProgress.sort(sortProgress).map((progress) => {\n\t\t\t\t\t\t\tconst status = progress.epicCompletedAt\n\t\t\t\t\t\t\t\t? 'completed'\n\t\t\t\t\t\t\t\t: 'incomplete'\n\t\t\t\t\t\t\tconst label = [\n\t\t\t\t\t\t\t\tprogress.epicLessonSlug,\n\t\t\t\t\t\t\t\tprogress.epicCompletedAt\n\t\t\t\t\t\t\t\t\t? `(${progress.epicCompletedAt})`\n\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t.join(' ')\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tkey={progress.epicLessonSlug}\n\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-2\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName={`h-3 w-3 rounded-full ${progressStatus[status]}`}\n\t\t\t\t\t\t\t\t\t\ttitle={status}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t{progress.type === 'unknown' ? (\n\t\t\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-red-500\">\n\t\t\t\t\t\t\t\t\t\t\t\t<SimpleTooltip content=\"This video is in the workshop on EpicWeb.dev, but not in the local workshop.\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Icon name=\"Close\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<Link to={linkProgress(progress)}>{label}</Link>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<Link to={progress.epicLessonUrl}>\n\t\t\t\t\t\t\t\t\t\t<Icon name=\"ExternalLink\"></Icon>\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})}\n\t\t\t\t\t</ul>\n\t\t\t\t) : (\n\t\t\t\t\t<p>No progress data</p>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<h2 className=\"text-lg font-bold\">Commands</h2>\n\t\t\t\t<ul className=\"max-h-48 overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t<button name=\"intent\" value=\"clear-caches\">\n\t\t\t\t\t\t\t\tClear local caches\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</Form>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t<button name=\"intent\" value=\"clear-data\">\n\t\t\t\t\t\t\t\tClear all local data (including auth data)\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</Form>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t{data.inspectorRunning ? (\n\t\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t\t<button name=\"intent\" value=\"stop-inspect\">\n\t\t\t\t\t\t\t\t\t{isStartingInspector\n\t\t\t\t\t\t\t\t\t\t? 'Stopping inspector...'\n\t\t\t\t\t\t\t\t\t\t: 'Stop inspector'}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</Form>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t\t<button name=\"intent\" value=\"inspect\">\n\t\t\t\t\t\t\t\t\t{isStoppingInspector\n\t\t\t\t\t\t\t\t\t\t? 'Starting inspector...'\n\t\t\t\t\t\t\t\t\t\t: 'Start inspector'}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</Form>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<h2 className=\"text-lg font-bold\">Apps</h2>\n\t\t\t\t<ul className=\"max-h-48 list-none overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t\t{data.apps.map((app) => (\n\t\t\t\t\t\t<li key={app.name} className=\"flex items-center gap-2 py-1\">\n\t\t\t\t\t\t\t{data.processes[app.name] ? (\n\t\t\t\t\t\t\t\t<Pinger status=\"running\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<Pinger status=\"stopped\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{app.name}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<h2 className=\"text-lg font-bold\">Processes</h2>\n\t\t\t\t<ul className=\"overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t\t{Object.entries(data.processes).map(([key, process]) => (\n\t\t\t\t\t\t<li key={key}>\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t{key} - Port: {process.port} - PID {process.pid} -{' '}\n\t\t\t\t\t\t\t\t{process.color}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<h2 className=\"text-lg font-bold\">Test Processes</h2>\n\t\t\t\t<ul className=\"overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t\t{Object.entries(data.testProcesses).map(([key, process]) => (\n\t\t\t\t\t\t<li key={key}>\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t{key} - PID {process.pid} - Exit code: {process.exitCode}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction Pinger({\n\tstatus,\n}: {\n\tstatus: 'running' | 'starting' | 'stopped' | 'taken'\n}) {\n\tconst colors = {\n\t\trunning: {\n\t\t\tpinger: 'bg-green-400',\n\t\t\tcircle: 'bg-green-500',\n\t\t},\n\t\tstarting: {\n\t\t\tpinger: 'bg-sky-400',\n\t\t\tcircle: 'bg-sky-500',\n\t\t},\n\t\tstopped: {\n\t\t\tcircle: 'bg-gray-500',\n\t\t},\n\t\ttaken: {\n\t\t\tpinger: 'bg-red-400',\n\t\t\tcircle: 'bg-red-500',\n\t\t},\n\t}[status]\n\treturn (\n\t\t<span className=\"relative flex h-3 w-3\">\n\t\t\t{colors.pinger ? (\n\t\t\t\t<span\n\t\t\t\t\tclassName={`absolute inline-flex h-full w-full animate-ping rounded-full ${colors.pinger} opacity-75`}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t\t<span\n\t\t\t\tclassName={`relative inline-flex h-3 w-3 rounded-full ${colors.circle}`}\n\t\t\t/>\n\t\t</span>\n\t)\n}\n"],"names":["handle","getSitemapEntries","meta","matches","rootData","find","m","id","data","title","workshopTitle","sortProgress","a","b","type","linkProgress","progress","exerciseNumber","toString","padStart","stepNumber","AdminLayout","useLoaderData","navigation","useNavigation","epicProgress","useEpicProgress","isStartingInspector","formData","get","isStoppingInspector","progressStatus","completed","incomplete","jsxs","className","children","jsx","sort","map","status","epicCompletedAt","label","epicLessonSlug","filter","Boolean","join","SimpleTooltip","content","Icon","name","Link","to","epicLessonUrl","Form","method","value","inspectorRunning","apps","app","processes","Pinger","Object","entries","key","process","port","pid","color","testProcesses","exitCode","colors","running","pinger","circle","starting","stopped","taken"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-DDqzbGM2.js","sources":["../../../app/routes/admin+/index.tsx"],"sourcesContent":["import { getApps } from '@epic-web/workshop-utils/apps.server'\nimport { getProcesses } from '@epic-web/workshop-utils/process-manager.server'\nimport {\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport { type SEOHandle } from '@nasa-gcn/remix-seo'\nimport {\n\tunstable_data as data,\n\ttype ActionFunctionArgs,\n\ttype LoaderFunctionArgs,\n\ttype MetaFunction,\n} from '@remix-run/node'\nimport { Form, Link, useLoaderData, useNavigation } from '@remix-run/react'\nimport { Icon } from '#app/components/icons.tsx'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.tsx'\nimport { type loader as rootLoader } from '#app/root.tsx'\nimport {\n\tuseEpicProgress,\n\ttype SerializedProgress,\n} from '#app/routes/progress.tsx'\nimport { ensureUndeployed } from '#app/utils/misc.tsx'\nimport {\n\tclearCaches,\n\tclearData,\n\tstartInspector,\n\tstopInspector,\n} from './admin-utils.server.tsx'\n\ndeclare global {\n\tvar __inspector_open__: boolean | undefined\n}\n\nexport const handle: SEOHandle = {\n\tgetSitemapEntries: () => null,\n}\n\nexport const meta: MetaFunction<typeof loader, { root: typeof rootLoader }> = ({\n\tmatches,\n}) => {\n\tconst rootData = matches.find((m) => m.id === 'root')?.data\n\treturn [{ title: `👷 | ${rootData?.workshopTitle}` }]\n}\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tensureUndeployed()\n\tconst timings = makeTimings('adminLoader')\n\tconst apps = (await getApps({ request, timings })).filter(\n\t\t(a, i, ar) => ar.findIndex((b) => a.name === b.name) === i,\n\t)\n\tconst processes: Record<\n\t\tstring,\n\t\t{ port: number; pid?: number; color: string }\n\t> = {}\n\tconst testProcesses: Record<\n\t\tstring,\n\t\t{ pid?: number; exitCode?: number | null }\n\t> = {}\n\tfor (const [\n\t\tname,\n\t\t{ port, process, color },\n\t] of getProcesses().devProcesses.entries()) {\n\t\tprocesses[name] = { port, pid: process.pid, color }\n\t}\n\n\tfor (const [\n\t\tname,\n\t\t{ process, exitCode },\n\t] of getProcesses().testProcesses.entries()) {\n\t\ttestProcesses[name] = { pid: process?.pid, exitCode }\n\t}\n\treturn data(\n\t\t{\n\t\t\tapps,\n\t\t\tprocesses,\n\t\t\ttestProcesses,\n\t\t\tinspectorRunning: global.__inspector_open__,\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 async function action({ request }: ActionFunctionArgs) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst intent = formData.get('intent')\n\tswitch (intent) {\n\t\tcase 'clear-data': {\n\t\t\tawait clearData()\n\t\t\treturn { success: true }\n\t\t}\n\t\tcase 'clear-caches': {\n\t\t\tawait clearCaches()\n\t\t\treturn { success: true }\n\t\t}\n\t\tcase 'inspect': {\n\t\t\tawait startInspector()\n\t\t\treturn { success: true }\n\t\t}\n\t\tcase 'stop-inspect': {\n\t\t\tawait stopInspector()\n\t\t\treturn { success: true }\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Unknown intent: ${intent}`)\n\t\t}\n\t}\n}\n\nfunction sortProgress(a: SerializedProgress, b: SerializedProgress) {\n\treturn a.type === 'unknown' && b.type === 'unknown'\n\t\t? 0\n\t\t: a.type === 'unknown'\n\t\t\t? -1\n\t\t\t: b.type === 'unknown'\n\t\t\t\t? 1\n\t\t\t\t: 0\n}\n\nfunction linkProgress(progress: SerializedProgress) {\n\tswitch (progress.type) {\n\t\tcase 'workshop-instructions':\n\t\t\treturn '/'\n\t\tcase 'workshop-finished':\n\t\t\treturn '/finished'\n\t\tcase 'instructions':\n\t\t\treturn `/${progress.exerciseNumber.toString().padStart(2, '0')}`\n\t\tcase 'step':\n\t\t\treturn `/${progress.exerciseNumber\n\t\t\t\t.toString()\n\t\t\t\t.padStart(2, '0')}/${progress.stepNumber.toString().padStart(2, '0')}`\n\t\tcase 'finished':\n\t\t\treturn `/${progress.exerciseNumber.toString().padStart(2, '0')}/finished`\n\t\tdefault:\n\t\t\treturn ''\n\t}\n}\n\nexport default function AdminLayout() {\n\tconst data = useLoaderData<typeof loader>()\n\tconst navigation = useNavigation()\n\tconst epicProgress = useEpicProgress()\n\n\tconst isStartingInspector = navigation.formData?.get('intent') === 'inspect'\n\tconst isStoppingInspector =\n\t\tnavigation.formData?.get('intent') === 'stop-inspect'\n\n\tconst progressStatus = {\n\t\tcompleted: 'bg-blue-500',\n\t\tincomplete: 'bg-yellow-500',\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div>\n\t\t\t\t<h2 className=\"text-lg font-bold\">Progress</h2>\n\t\t\t\t{epicProgress ? (\n\t\t\t\t\t<ul className=\"flex max-h-72 flex-col gap-2 overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t\t\t{epicProgress.sort(sortProgress).map((progress) => {\n\t\t\t\t\t\t\tconst status = progress.epicCompletedAt\n\t\t\t\t\t\t\t\t? 'completed'\n\t\t\t\t\t\t\t\t: 'incomplete'\n\t\t\t\t\t\t\tconst label = [\n\t\t\t\t\t\t\t\tprogress.epicLessonSlug,\n\t\t\t\t\t\t\t\tprogress.epicCompletedAt\n\t\t\t\t\t\t\t\t\t? `(${progress.epicCompletedAt})`\n\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t.join(' ')\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tkey={progress.epicLessonSlug}\n\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-2\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName={`h-3 w-3 rounded-full ${progressStatus[status]}`}\n\t\t\t\t\t\t\t\t\t\ttitle={status}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t{progress.type === 'unknown' ? (\n\t\t\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-red-500\">\n\t\t\t\t\t\t\t\t\t\t\t\t<SimpleTooltip content=\"This video is in the workshop on EpicWeb.dev, but not in the local workshop.\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Icon name=\"Close\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<Link to={linkProgress(progress)}>{label}</Link>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<Link to={progress.epicLessonUrl}>\n\t\t\t\t\t\t\t\t\t\t<Icon name=\"ExternalLink\"></Icon>\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})}\n\t\t\t\t\t</ul>\n\t\t\t\t) : (\n\t\t\t\t\t<p>No progress data</p>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<h2 className=\"text-lg font-bold\">Commands</h2>\n\t\t\t\t<ul className=\"max-h-48 overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t<button name=\"intent\" value=\"clear-caches\">\n\t\t\t\t\t\t\t\tClear local caches\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</Form>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t<button name=\"intent\" value=\"clear-data\">\n\t\t\t\t\t\t\t\tClear all local data (including auth data)\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</Form>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t{data.inspectorRunning ? (\n\t\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t\t<button name=\"intent\" value=\"stop-inspect\">\n\t\t\t\t\t\t\t\t\t{isStartingInspector\n\t\t\t\t\t\t\t\t\t\t? 'Stopping inspector...'\n\t\t\t\t\t\t\t\t\t\t: 'Stop inspector'}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</Form>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t\t<button name=\"intent\" value=\"inspect\">\n\t\t\t\t\t\t\t\t\t{isStoppingInspector\n\t\t\t\t\t\t\t\t\t\t? 'Starting inspector...'\n\t\t\t\t\t\t\t\t\t\t: 'Start inspector'}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</Form>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<h2 className=\"text-lg font-bold\">Apps</h2>\n\t\t\t\t<ul className=\"max-h-48 list-none overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t\t{data.apps.map((app) => (\n\t\t\t\t\t\t<li key={app.name} className=\"flex items-center gap-2 py-1\">\n\t\t\t\t\t\t\t{data.processes[app.name] ? (\n\t\t\t\t\t\t\t\t<Pinger status=\"running\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<Pinger status=\"stopped\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{app.name}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<h2 className=\"text-lg font-bold\">Processes</h2>\n\t\t\t\t<ul className=\"overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t\t{Object.entries(data.processes).map(([key, process]) => (\n\t\t\t\t\t\t<li key={key}>\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t{key} - Port: {process.port} - PID {process.pid} -{' '}\n\t\t\t\t\t\t\t\t{process.color}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<h2 className=\"text-lg font-bold\">Test Processes</h2>\n\t\t\t\t<ul className=\"overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t\t{Object.entries(data.testProcesses).map(([key, process]) => (\n\t\t\t\t\t\t<li key={key}>\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t{key} - PID {process.pid} - Exit code: {process.exitCode}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction Pinger({\n\tstatus,\n}: {\n\tstatus: 'running' | 'starting' | 'stopped' | 'taken'\n}) {\n\tconst colors = {\n\t\trunning: {\n\t\t\tpinger: 'bg-green-400',\n\t\t\tcircle: 'bg-green-500',\n\t\t},\n\t\tstarting: {\n\t\t\tpinger: 'bg-sky-400',\n\t\t\tcircle: 'bg-sky-500',\n\t\t},\n\t\tstopped: {\n\t\t\tcircle: 'bg-gray-500',\n\t\t},\n\t\ttaken: {\n\t\t\tpinger: 'bg-red-400',\n\t\t\tcircle: 'bg-red-500',\n\t\t},\n\t}[status]\n\treturn (\n\t\t<span className=\"relative flex h-3 w-3\">\n\t\t\t{colors.pinger ? (\n\t\t\t\t<span\n\t\t\t\t\tclassName={`absolute inline-flex h-full w-full animate-ping rounded-full ${colors.pinger} opacity-75`}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t\t<span\n\t\t\t\tclassName={`relative inline-flex h-3 w-3 rounded-full ${colors.circle}`}\n\t\t\t/>\n\t\t</span>\n\t)\n}\n"],"names":["handle","getSitemapEntries","meta","matches","rootData","find","m","id","data","title","workshopTitle","sortProgress","a","b","type","linkProgress","progress","exerciseNumber","toString","padStart","stepNumber","AdminLayout","useLoaderData","navigation","useNavigation","epicProgress","useEpicProgress","isStartingInspector","formData","get","isStoppingInspector","progressStatus","completed","incomplete","jsxs","className","children","jsx","sort","map","status","epicCompletedAt","label","epicLessonSlug","filter","Boolean","join","SimpleTooltip","content","Icon","name","Link","to","epicLessonUrl","Form","method","value","inspectorRunning","apps","app","processes","Pinger","Object","entries","key","process","port","pid","color","testProcesses","exitCode","colors","running","pinger","circle","starting","stopped","taken"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as l,j as t,e as xe}from"./index-C_B1-9rF.js";import{h as pe,u as O,n as ve,P,f as N,e as K,d as he,g as ge,S as je}from"./tooltip-BoVikCa-.js";import{f as be,u as B}from"./index-DFqQCjCw.js";import{u as $,I as E,c as we}from"./misc-DIdEn_jt.js";import{D as Ne}from"./diff-BNCREJvf.js";import{G as ye}from"./error-boundary-3zItlMUO.js";import{L as Ce}from"./loading-DW_I206H.js";import{D as Te,u as Pe}from"./discord-CEOqKs_c.js";import{u as V,A as Ee,L as H,e as Ie}from"./components-DUNtf72c.js";import{J as Se}from"./index-LjRZeU7x.js";import{S as De}from"./set-playground-CMoUFgkO.js";import{P as Re,a as Fe}from"./tests-CiM4RPOf.js";import{P as F}from"./preview-BEtmdi0E.js";import"./index-CV3nxGFp.js";import"./accordion-DLg7gJkp.js";import"./mdx-C9dqA6IZ.js";import"./epic-video-D8ex9vao.js";import"./index-DH1w3QmP.js";import"./request-info-vBkaf3Rk.js";import"./pe-D5h19vSo.js";import"./index-BajUQsFT.js";import"./user-CbbIYEs8.js";import"./workshop-config-C5sYl312.js";import"./progress-bar-CBDBzRQ2.js";import"./revalidation-ws-DK5QOPlL.js";import"./use-event-source-M87p8Tme.js";import"./button-39zQyNX6.js";function _e(e,n=[]){let r=[];function s(p,o){const c=l.createContext(o),m=r.length;r=[...r,o];function d(u){const{scope:x,children:w,...f}=u,g=(x==null?void 0:x[e][m])||c,a=l.useMemo(()=>f,Object.values(f));return t.jsx(g.Provider,{value:a,children:w})}function v(u,x){const w=(x==null?void 0:x[e][m])||c,f=l.useContext(w);if(f)return f;if(o!==void 0)return o;throw new Error(`\`${u}\` must be used within \`${p}\``)}return d.displayName=p+"Provider",[d,v]}const i=()=>{const p=r.map(o=>l.createContext(o));return function(c){const m=(c==null?void 0:c[e])||p;return l.useMemo(()=>({[`__scope${e}`]:{...c,[e]:m}}),[c,m])}};return i.scopeName=e,[s,Ae(i,...n)]}function Ae(...e){const n=e[0];if(e.length===1)return n;const r=()=>{const s=e.map(i=>({useScope:i(),scopeName:i.scopeName}));return function(p){const o=s.reduce((c,{useScope:m,scopeName:d})=>{const u=m(p)[`__scope${d}`];return{...c,...u}},{});return l.useMemo(()=>({[`__scope${n.scopeName}`]:o}),[o])}};return r.scopeName=n.scopeName,r}var R="rovingFocusGroup.onEntryFocus",ke={bubbles:!1,cancelable:!0},I="RovingFocusGroup",[_,Y,Le]=be(I),[Ue,z]=_e(I,[Le]),[Me,Ge]=Ue(I),J=l.forwardRef((e,n)=>t.jsx(_.Provider,{scope:e.__scopeRovingFocusGroup,children:t.jsx(_.Slot,{scope:e.__scopeRovingFocusGroup,children:t.jsx(Oe,{...e,ref:n})})}));J.displayName=I;var Oe=l.forwardRef((e,n)=>{const{__scopeRovingFocusGroup:r,orientation:s,loop:i=!1,dir:p,currentTabStopId:o,defaultCurrentTabStopId:c,onCurrentTabStopIdChange:m,onEntryFocus:d,preventScrollOnEntryFocus:v=!1,...u}=e,x=l.useRef(null),w=pe(n,x),f=B(p),[g=null,a]=O({prop:o,defaultProp:c,onChange:m}),[h,b]=l.useState(!1),C=ve(d),le=Y(r),S=l.useRef(!1),[ce,U]=l.useState(0);return l.useEffect(()=>{const j=x.current;if(j)return j.addEventListener(R,C),()=>j.removeEventListener(R,C)},[C]),t.jsx(Me,{scope:r,orientation:s,dir:f,loop:i,currentTabStopId:g,onItemFocus:l.useCallback(j=>a(j),[a]),onItemShiftTab:l.useCallback(()=>b(!0),[]),onFocusableItemAdd:l.useCallback(()=>U(j=>j+1),[]),onFocusableItemRemove:l.useCallback(()=>U(j=>j-1),[]),children:t.jsx(P.div,{tabIndex:h||ce===0?-1:0,"data-orientation":s,...u,ref:w,style:{outline:"none",...e.style},onMouseDown:N(e.onMouseDown,()=>{S.current=!0}),onFocus:N(e.onFocus,j=>{const ue=!S.current;if(j.target===j.currentTarget&&ue&&!h){const M=new CustomEvent(R,ke);if(j.currentTarget.dispatchEvent(M),!M.defaultPrevented){const D=le().filter(y=>y.focusable),de=D.find(y=>y.active),fe=D.find(y=>y.id===g),me=[de,fe,...D].filter(Boolean).map(y=>y.ref.current);Q(me,v)}}S.current=!1}),onBlur:N(e.onBlur,()=>b(!1))})})}),W="RovingFocusGroupItem",q=l.forwardRef((e,n)=>{const{__scopeRovingFocusGroup:r,focusable:s=!0,active:i=!1,tabStopId:p,...o}=e,c=K(),m=p||c,d=Ge(W,r),v=d.currentTabStopId===m,u=Y(r),{onFocusableItemAdd:x,onFocusableItemRemove:w}=d;return l.useEffect(()=>{if(s)return x(),()=>w()},[s,x,w]),t.jsx(_.ItemSlot,{scope:r,id:m,focusable:s,active:i,children:t.jsx(P.span,{tabIndex:v?0:-1,"data-orientation":d.orientation,...o,ref:n,onMouseDown:N(e.onMouseDown,f=>{s?d.onItemFocus(m):f.preventDefault()}),onFocus:N(e.onFocus,()=>d.onItemFocus(m)),onKeyDown:N(e.onKeyDown,f=>{if(f.key==="Tab"&&f.shiftKey){d.onItemShiftTab();return}if(f.target!==f.currentTarget)return;const g=$e(f,d.orientation,d.dir);if(g!==void 0){if(f.metaKey||f.ctrlKey||f.altKey||f.shiftKey)return;f.preventDefault();let h=u().filter(b=>b.focusable).map(b=>b.ref.current);if(g==="last")h.reverse();else if(g==="prev"||g==="next"){g==="prev"&&h.reverse();const b=h.indexOf(f.currentTarget);h=d.loop?Ve(h,b+1):h.slice(b+1)}setTimeout(()=>Q(h))}})})})});q.displayName=W;var Ke={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function Be(e,n){return n!=="rtl"?e:e==="ArrowLeft"?"ArrowRight":e==="ArrowRight"?"ArrowLeft":e}function $e(e,n,r){const s=Be(e.key,r);if(!(n==="vertical"&&["ArrowLeft","ArrowRight"].includes(s))&&!(n==="horizontal"&&["ArrowUp","ArrowDown"].includes(s)))return Ke[s]}function Q(e,n=!1){const r=document.activeElement;for(const s of e)if(s===r||(s.focus({preventScroll:n}),document.activeElement!==r))return}function Ve(e,n){return e.map((r,s)=>e[(n+s)%e.length])}var He=J,Ye=q,k="Tabs",[ze,Ft]=he(k,[z]),X=z(),[Je,L]=ze(k),Z=l.forwardRef((e,n)=>{const{__scopeTabs:r,value:s,onValueChange:i,defaultValue:p,orientation:o="horizontal",dir:c,activationMode:m="automatic",...d}=e,v=B(c),[u,x]=O({prop:s,onChange:i,defaultProp:p});return t.jsx(Je,{scope:r,baseId:K(),value:u,onValueChange:x,orientation:o,dir:v,activationMode:m,children:t.jsx(P.div,{dir:v,"data-orientation":o,...d,ref:n})})});Z.displayName=k;var ee="TabsList",te=l.forwardRef((e,n)=>{const{__scopeTabs:r,loop:s=!0,...i}=e,p=L(ee,r),o=X(r);return t.jsx(He,{asChild:!0,...o,orientation:p.orientation,dir:p.dir,loop:s,children:t.jsx(P.div,{role:"tablist","aria-orientation":p.orientation,...i,ref:n})})});te.displayName=ee;var re="TabsTrigger",se=l.forwardRef((e,n)=>{const{__scopeTabs:r,value:s,disabled:i=!1,...p}=e,o=L(re,r),c=X(r),m=ae(o.baseId,s),d=ie(o.baseId,s),v=s===o.value;return t.jsx(Ye,{asChild:!0,...c,focusable:!i,active:v,children:t.jsx(P.button,{type:"button",role:"tab","aria-selected":v,"aria-controls":d,"data-state":v?"active":"inactive","data-disabled":i?"":void 0,disabled:i,id:m,...p,ref:n,onMouseDown:N(e.onMouseDown,u=>{!i&&u.button===0&&u.ctrlKey===!1?o.onValueChange(s):u.preventDefault()}),onKeyDown:N(e.onKeyDown,u=>{[" ","Enter"].includes(u.key)&&o.onValueChange(s)}),onFocus:N(e.onFocus,()=>{const u=o.activationMode!=="manual";!v&&!i&&u&&o.onValueChange(s)})})})});se.displayName=re;var ne="TabsContent",oe=l.forwardRef((e,n)=>{const{__scopeTabs:r,value:s,forceMount:i,children:p,...o}=e,c=L(ne,r),m=ae(c.baseId,s),d=ie(c.baseId,s),v=s===c.value,u=l.useRef(v);return l.useEffect(()=>{const x=requestAnimationFrame(()=>u.current=!1);return()=>cancelAnimationFrame(x)},[]),t.jsx(ge,{present:i||v,children:({present:x})=>t.jsx(P.div,{"data-state":v?"active":"inactive","data-orientation":c.orientation,role:"tabpanel","aria-labelledby":m,hidden:!x,id:d,tabIndex:0,...o,ref:n,style:{...e.style,animationDuration:u.current?"0s":void 0},children:x&&p})})});oe.displayName=ne;function ae(e,n){return`${e}-trigger-${n}`}function ie(e,n){return`${e}-content-${n}`}var We=Z,qe=te,Qe=se,T=oe;function Xe(){return t.jsxs("div",{className:"flex h-full w-full flex-col gap-4 pt-4",children:[t.jsx("div",{className:"text-center",children:t.jsx(Te,{})}),t.jsx("div",{className:"flex-1 overflow-y-scroll bg-accent pb-4 scrollbar-thin scrollbar-thumb-scrollbar",children:t.jsx(Ze,{})})]})}function Ze(){const e=V(),n=Pe(),r=$();return t.jsxs("div",{className:"flex h-full flex-col items-center justify-between",children:[t.jsx(l.Suspense,{fallback:t.jsx("div",{className:"flex h-full w-full flex-col items-center justify-center",children:t.jsx(Ce,{children:"Loading Discord Posts"})}),children:t.jsx(Ee,{resolve:e.discordPostsPromise,errorElement:t.jsx("div",{className:"text-red-500",children:"There was a problem loading the discord posts"}),children:s=>t.jsx("ul",{className:"flex w-full flex-col gap-4 p-3 xl:p-12",children:s.map(i=>t.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:t.jsx(et,{thread:i})},i.id))})})}),t.jsx("div",{children:t.jsxs(H,{to:r&&!n.includes("oauth")?n.replace(/^https/,"discord"):n,target:n.includes("oauth")?void 0:"_blank",rel:"noreferrer noopener",onClick:r?s=>{s.preventDefault(),window.open(s.currentTarget.href,"_blank","noreferrer noopener")}:void 0,className:"flex items-center gap-2 p-2 text-xl hover:underline",children:["Create Post ",t.jsx(E,{name:"ExternalLink"})]})})]})}function et({thread:e}){const n=e.reactions.filter(r=>r.count);return t.jsx("div",{children:t.jsxs("div",{className:"flex flex-col gap-2 p-4",children:[t.jsxs("div",{className:"flex gap-4",children:[t.jsxs("div",{className:"flex flex-col gap-1",children:[e.tags.length?t.jsx("div",{className:"flex gap-2",children:e.tags.map(r=>t.jsxs("div",{className:"flex items-center justify-center gap-1 rounded-full bg-accent px-2 py-1 text-sm",children:[t.jsx("span",{className:"h-3 w-3 leading-3",children:t.jsx(G,{name:r.emojiName,url:r.emojiUrl})}),t.jsx("span",{children:r.name})]},r.name))}):null,t.jsx("strong",{className:"text-xl font-bold",children:e.name}),t.jsxs("div",{className:"flex items-start gap-1",children:[t.jsxs("div",{className:"flex items-center gap-1",children:[e.authorAvatarUrl?t.jsx("img",{src:e.authorAvatarUrl,alt:"",className:"h-6 w-6 rounded-full"}):null,t.jsxs("span",{children:[t.jsx("span",{className:"font-bold",style:e.authorHexAccentColor?{color:e.authorHexAccentColor}:{},children:e.authorDisplayName}),":"," "]})]}),t.jsx("span",{className:"flex-1 overflow-ellipsis text-muted-foreground",children:e.messagePreview})]})]}),e.previewImageUrl?t.jsx("img",{src:e.previewImageUrl,alt:"",className:"h-28 w-28 rounded-lg object-cover"}):null]}),t.jsxs("div",{className:"flex justify-between",children:[t.jsxs("div",{className:"flex items-center gap-3",children:[t.jsx("span",{children:n.length?t.jsx("ul",{className:"flex items-center gap-2",children:n.map((r,s)=>t.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:[t.jsx("span",{className:"h-3 w-3 leading-3",children:t.jsx(G,{name:r.emojiName,url:r.emojiUrl})}),t.jsx("span",{children:r.count})]},s))}):null}),t.jsxs("span",{className:"flex items-center gap-1",children:[t.jsxs("span",{className:"inline-flex items-center gap-1",children:[t.jsx(E,{name:"Chat"})," ",e.messageCount]}),` · ${e.lastUpdatedDisplay}`]})]}),t.jsxs("span",{className:"flex items-center gap-4",children:[t.jsx("a",{href:e.link.replace(/^https/,"discord"),children:t.jsx(E,{name:"Discord"})}),t.jsx("a",{href:e.link,target:"_blank",rel:"noreferrer noopener",children:t.jsx(E,{name:"ExternalLink"})})]})]})]})})}function G({name:e,url:n}){return n?t.jsx("img",{src:n,alt:e,className:"h-full w-full"}):e||null}function tt({appInfo:e,inBrowserBrowserRef:n,problemAppName:r,allApps:s,isUpToDate:i}){return t.jsx(Re,{playgroundAppName:e==null?void 0:e.appName,problemAppName:r,allApps:s,isUpToDate:i,children:(e==null?void 0:e.dev.type)==="none"?t.jsxs("div",{children:[t.jsx("div",{className:"text-foreground-secondary flex h-full items-center justify-center text-2xl",children:"Non-UI playground"}),t.jsx("div",{children:t.jsxs("div",{className:"text-foreground-secondary flex flex-wrap gap-1 text-center",children:["Navigate to"," ",t.jsx(je,{content:e.fullPath,children:t.jsx("span",{className:"underline",onClick:()=>{navigator.clipboard.writeText(e.fullPath),Se.success("Copied playground path to clipboard")},children:"the playground directory"})})," ","in your editor and terminal to work on this exercise!"]})})]}):e?t.jsx(F,{id:e.appName,appInfo:e,inBrowserBrowserRef:n}):t.jsxs("div",{className:"flex flex-col justify-center gap-2",children:[t.jsx("p",{children:"Please set the playground first"}),r?t.jsx(De,{appName:r}):null]})})}const A=["playground","problem","solution","tests","diff","chat"],rt=e=>!!(e&&A.includes(e));function st(e,n,r){const s=new URLSearchParams(e);return r===null?s.delete(n):s.set(n,r),s}function _t(){var v,u,x,w,f,g;const e=V(),[n]=Ie(),r=n.get("preview"),s=l.useRef(null),i=$(),p=xe();function o(a){var h,b,C;if(a==="tests")return ENV.EPICSHOP_DEPLOYED||!e.playground||e.playground.test.type==="none";if(a==="problem"||a==="solution"){if(((h=e[a])==null?void 0:h.dev.type)==="none")return!0;if(ENV.EPICSHOP_DEPLOYED)return((b=e[a])==null?void 0:b.dev.type)!=="browser"&&!((C=e[a])!=null&&C.stackBlitzUrl)}return!!(a==="playground"&&ENV.EPICSHOP_DEPLOYED)}const c=rt(r)?r:A.find(a=>!o(a)),m=`/diff?${new URLSearchParams({app1:((v=e.problem)==null?void 0:v.name)??"",app2:((u=e.solution)==null?void 0:u.name)??""})}`;function d(a){a.altKey&&!a.ctrlKey&&!a.shiftKey&&!a.metaKey&&(a.preventDefault(),p(m))}return t.jsxs(We,{className:"relative flex flex-col overflow-y-auto sm:col-span-1 sm:row-span-1",value:c,children:[t.jsx(qe,{className:"h-14 min-h-14 overflow-x-hidden border-b scrollbar-thin scrollbar-thumb-scrollbar",children:A.map(a=>{const h=o(a);return t.jsx(Qe,{value:a,hidden:h,asChild:!0,children:t.jsx(H,{id:`${a}-tab`,className:we("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",h?"hidden":"inline-block"),preventScrollReset:!0,prefetch:"intent",onClick:d,to:a==="diff"&&i?m:`?${st(n,"preview",a==="playground"?null:a)}`,children:a})},a)})}),t.jsxs("div",{className:"relative z-10 flex min-h-96 flex-grow flex-col overflow-y-auto",children:[t.jsx(T,{value:"playground",className:"flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden",children:t.jsx(tt,{appInfo:e.playground,problemAppName:(x=e.problem)==null?void 0:x.name,inBrowserBrowserRef:s,allApps:e.allApps,isUpToDate:((w=e.playground)==null?void 0:w.isUpToDate)??!1})}),t.jsx(T,{value:"problem",className:"flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden",children:t.jsx(F,{appInfo:e.problem,inBrowserBrowserRef:s})}),t.jsx(T,{value:"solution",className:"flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden",children:t.jsx(F,{appInfo:e.solution,inBrowserBrowserRef:s})}),t.jsx(T,{value:"tests",className:"flex w-full flex-grow items-start justify-center self-start overflow-hidden radix-state-inactive:hidden",children:t.jsx(Fe,{appInfo:e.playground,problemAppName:(f=e.problem)==null?void 0:f.name,allApps:e.allApps,isUpToDate:((g=e.playground)==null?void 0:g.isUpToDate)??!1})}),t.jsx(T,{value:"diff",className:"flex h-full w-full flex-grow items-start justify-center self-start radix-state-inactive:hidden",children:t.jsx(Ne,{diff:e.diff,allApps:e.allApps})}),t.jsx(T,{value:"chat",className:"flex h-full w-full flex-grow items-start justify-center self-start radix-state-inactive:hidden",children:t.jsx(Xe,{})})]})]})}function At(){return t.jsx(ye,{statusHandlers:{404:()=>t.jsx("p",{children:"Sorry, we couldn't find an app here."})}})}export{At as ErrorBoundary,_t as default};
|
|
2
|
+
//# sourceMappingURL=index-DE-jwnOP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-DE-jwnOP.js","sources":["../../../../../node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-context/dist/index.mjs","../../../../../node_modules/@radix-ui/react-roving-focus/dist/index.mjs","../../../../../node_modules/@radix-ui/react-tabs/dist/index.mjs","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/discord.tsx","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/playground.tsx","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index.tsx"],"sourcesContent":["// packages/react/context/src/createContext.tsx\nimport * as React from \"react\";\nimport { jsx } from \"react/jsx-runtime\";\nfunction createContext2(rootComponentName, defaultContext) {\n const Context = React.createContext(defaultContext);\n function Provider(props) {\n const { children, ...context } = props;\n const value = React.useMemo(() => context, Object.values(context));\n return /* @__PURE__ */ jsx(Context.Provider, { value, children });\n }\n function useContext2(consumerName) {\n const context = React.useContext(Context);\n if (context) return context;\n if (defaultContext !== void 0) return defaultContext;\n throw new Error(`\\`${consumerName}\\` must be used within \\`${rootComponentName}\\``);\n }\n Provider.displayName = rootComponentName + \"Provider\";\n return [Provider, useContext2];\n}\nfunction createContextScope(scopeName, createContextScopeDeps = []) {\n let defaultContexts = [];\n function createContext3(rootComponentName, defaultContext) {\n const BaseContext = React.createContext(defaultContext);\n const index = defaultContexts.length;\n defaultContexts = [...defaultContexts, defaultContext];\n function Provider(props) {\n const { scope, children, ...context } = props;\n const Context = scope?.[scopeName][index] || BaseContext;\n const value = React.useMemo(() => context, Object.values(context));\n return /* @__PURE__ */ jsx(Context.Provider, { value, children });\n }\n function useContext2(consumerName, scope) {\n const Context = scope?.[scopeName][index] || BaseContext;\n const context = React.useContext(Context);\n if (context) return context;\n if (defaultContext !== void 0) return defaultContext;\n throw new Error(`\\`${consumerName}\\` must be used within \\`${rootComponentName}\\``);\n }\n Provider.displayName = rootComponentName + \"Provider\";\n return [Provider, useContext2];\n }\n const createScope = () => {\n const scopeContexts = defaultContexts.map((defaultContext) => {\n return React.createContext(defaultContext);\n });\n return function useScope(scope) {\n const contexts = scope?.[scopeName] || scopeContexts;\n return React.useMemo(\n () => ({ [`__scope${scopeName}`]: { ...scope, [scopeName]: contexts } }),\n [scope, contexts]\n );\n };\n };\n createScope.scopeName = scopeName;\n return [createContext3, composeContextScopes(createScope, ...createContextScopeDeps)];\n}\nfunction composeContextScopes(...scopes) {\n const baseScope = scopes[0];\n if (scopes.length === 1) return baseScope;\n const createScope = () => {\n const scopeHooks = scopes.map((createScope2) => ({\n useScope: createScope2(),\n scopeName: createScope2.scopeName\n }));\n return function useComposedScopes(overrideScopes) {\n const nextScopes = scopeHooks.reduce((nextScopes2, { useScope, scopeName }) => {\n const scopeProps = useScope(overrideScopes);\n const currentScope = scopeProps[`__scope${scopeName}`];\n return { ...nextScopes2, ...currentScope };\n }, {});\n return React.useMemo(() => ({ [`__scope${baseScope.scopeName}`]: nextScopes }), [nextScopes]);\n };\n };\n createScope.scopeName = baseScope.scopeName;\n return createScope;\n}\nexport {\n createContext2 as createContext,\n createContextScope\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// packages/react/roving-focus/src/RovingFocusGroup.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createCollection } from \"@radix-ui/react-collection\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { jsx } from \"react/jsx-runtime\";\nvar ENTRY_FOCUS = \"rovingFocusGroup.onEntryFocus\";\nvar EVENT_OPTIONS = { bubbles: false, cancelable: true };\nvar GROUP_NAME = \"RovingFocusGroup\";\nvar [Collection, useCollection, createCollectionScope] = createCollection(GROUP_NAME);\nvar [createRovingFocusGroupContext, createRovingFocusGroupScope] = createContextScope(\n GROUP_NAME,\n [createCollectionScope]\n);\nvar [RovingFocusProvider, useRovingFocusContext] = createRovingFocusGroupContext(GROUP_NAME);\nvar RovingFocusGroup = React.forwardRef(\n (props, forwardedRef) => {\n return /* @__PURE__ */ jsx(Collection.Provider, { scope: props.__scopeRovingFocusGroup, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: props.__scopeRovingFocusGroup, children: /* @__PURE__ */ jsx(RovingFocusGroupImpl, { ...props, ref: forwardedRef }) }) });\n }\n);\nRovingFocusGroup.displayName = GROUP_NAME;\nvar RovingFocusGroupImpl = React.forwardRef((props, forwardedRef) => {\n const {\n __scopeRovingFocusGroup,\n orientation,\n loop = false,\n dir,\n currentTabStopId: currentTabStopIdProp,\n defaultCurrentTabStopId,\n onCurrentTabStopIdChange,\n onEntryFocus,\n preventScrollOnEntryFocus = false,\n ...groupProps\n } = props;\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const direction = useDirection(dir);\n const [currentTabStopId = null, setCurrentTabStopId] = useControllableState({\n prop: currentTabStopIdProp,\n defaultProp: defaultCurrentTabStopId,\n onChange: onCurrentTabStopIdChange\n });\n const [isTabbingBackOut, setIsTabbingBackOut] = React.useState(false);\n const handleEntryFocus = useCallbackRef(onEntryFocus);\n const getItems = useCollection(__scopeRovingFocusGroup);\n const isClickFocusRef = React.useRef(false);\n const [focusableItemsCount, setFocusableItemsCount] = React.useState(0);\n React.useEffect(() => {\n const node = ref.current;\n if (node) {\n node.addEventListener(ENTRY_FOCUS, handleEntryFocus);\n return () => node.removeEventListener(ENTRY_FOCUS, handleEntryFocus);\n }\n }, [handleEntryFocus]);\n return /* @__PURE__ */ jsx(\n RovingFocusProvider,\n {\n scope: __scopeRovingFocusGroup,\n orientation,\n dir: direction,\n loop,\n currentTabStopId,\n onItemFocus: React.useCallback(\n (tabStopId) => setCurrentTabStopId(tabStopId),\n [setCurrentTabStopId]\n ),\n onItemShiftTab: React.useCallback(() => setIsTabbingBackOut(true), []),\n onFocusableItemAdd: React.useCallback(\n () => setFocusableItemsCount((prevCount) => prevCount + 1),\n []\n ),\n onFocusableItemRemove: React.useCallback(\n () => setFocusableItemsCount((prevCount) => prevCount - 1),\n []\n ),\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n tabIndex: isTabbingBackOut || focusableItemsCount === 0 ? -1 : 0,\n \"data-orientation\": orientation,\n ...groupProps,\n ref: composedRefs,\n style: { outline: \"none\", ...props.style },\n onMouseDown: composeEventHandlers(props.onMouseDown, () => {\n isClickFocusRef.current = true;\n }),\n onFocus: composeEventHandlers(props.onFocus, (event) => {\n const isKeyboardFocus = !isClickFocusRef.current;\n if (event.target === event.currentTarget && isKeyboardFocus && !isTabbingBackOut) {\n const entryFocusEvent = new CustomEvent(ENTRY_FOCUS, EVENT_OPTIONS);\n event.currentTarget.dispatchEvent(entryFocusEvent);\n if (!entryFocusEvent.defaultPrevented) {\n const items = getItems().filter((item) => item.focusable);\n const activeItem = items.find((item) => item.active);\n const currentItem = items.find((item) => item.id === currentTabStopId);\n const candidateItems = [activeItem, currentItem, ...items].filter(\n Boolean\n );\n const candidateNodes = candidateItems.map((item) => item.ref.current);\n focusFirst(candidateNodes, preventScrollOnEntryFocus);\n }\n }\n isClickFocusRef.current = false;\n }),\n onBlur: composeEventHandlers(props.onBlur, () => setIsTabbingBackOut(false))\n }\n )\n }\n );\n});\nvar ITEM_NAME = \"RovingFocusGroupItem\";\nvar RovingFocusGroupItem = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeRovingFocusGroup,\n focusable = true,\n active = false,\n tabStopId,\n ...itemProps\n } = props;\n const autoId = useId();\n const id = tabStopId || autoId;\n const context = useRovingFocusContext(ITEM_NAME, __scopeRovingFocusGroup);\n const isCurrentTabStop = context.currentTabStopId === id;\n const getItems = useCollection(__scopeRovingFocusGroup);\n const { onFocusableItemAdd, onFocusableItemRemove } = context;\n React.useEffect(() => {\n if (focusable) {\n onFocusableItemAdd();\n return () => onFocusableItemRemove();\n }\n }, [focusable, onFocusableItemAdd, onFocusableItemRemove]);\n return /* @__PURE__ */ jsx(\n Collection.ItemSlot,\n {\n scope: __scopeRovingFocusGroup,\n id,\n focusable,\n active,\n children: /* @__PURE__ */ jsx(\n Primitive.span,\n {\n tabIndex: isCurrentTabStop ? 0 : -1,\n \"data-orientation\": context.orientation,\n ...itemProps,\n ref: forwardedRef,\n onMouseDown: composeEventHandlers(props.onMouseDown, (event) => {\n if (!focusable) event.preventDefault();\n else context.onItemFocus(id);\n }),\n onFocus: composeEventHandlers(props.onFocus, () => context.onItemFocus(id)),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if (event.key === \"Tab\" && event.shiftKey) {\n context.onItemShiftTab();\n return;\n }\n if (event.target !== event.currentTarget) return;\n const focusIntent = getFocusIntent(event, context.orientation, context.dir);\n if (focusIntent !== void 0) {\n if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) return;\n event.preventDefault();\n const items = getItems().filter((item) => item.focusable);\n let candidateNodes = items.map((item) => item.ref.current);\n if (focusIntent === \"last\") candidateNodes.reverse();\n else if (focusIntent === \"prev\" || focusIntent === \"next\") {\n if (focusIntent === \"prev\") candidateNodes.reverse();\n const currentIndex = candidateNodes.indexOf(event.currentTarget);\n candidateNodes = context.loop ? wrapArray(candidateNodes, currentIndex + 1) : candidateNodes.slice(currentIndex + 1);\n }\n setTimeout(() => focusFirst(candidateNodes));\n }\n })\n }\n )\n }\n );\n }\n);\nRovingFocusGroupItem.displayName = ITEM_NAME;\nvar MAP_KEY_TO_FOCUS_INTENT = {\n ArrowLeft: \"prev\",\n ArrowUp: \"prev\",\n ArrowRight: \"next\",\n ArrowDown: \"next\",\n PageUp: \"first\",\n Home: \"first\",\n PageDown: \"last\",\n End: \"last\"\n};\nfunction getDirectionAwareKey(key, dir) {\n if (dir !== \"rtl\") return key;\n return key === \"ArrowLeft\" ? \"ArrowRight\" : key === \"ArrowRight\" ? \"ArrowLeft\" : key;\n}\nfunction getFocusIntent(event, orientation, dir) {\n const key = getDirectionAwareKey(event.key, dir);\n if (orientation === \"vertical\" && [\"ArrowLeft\", \"ArrowRight\"].includes(key)) return void 0;\n if (orientation === \"horizontal\" && [\"ArrowUp\", \"ArrowDown\"].includes(key)) return void 0;\n return MAP_KEY_TO_FOCUS_INTENT[key];\n}\nfunction focusFirst(candidates, preventScroll = false) {\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;\n for (const candidate of candidates) {\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate.focus({ preventScroll });\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n}\nfunction wrapArray(array, startIndex) {\n return array.map((_, index) => array[(startIndex + index) % array.length]);\n}\nvar Root = RovingFocusGroup;\nvar Item = RovingFocusGroupItem;\nexport {\n Item,\n Root,\n RovingFocusGroup,\n RovingFocusGroupItem,\n createRovingFocusGroupScope\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\n\n// packages/react/tabs/src/Tabs.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { createRovingFocusGroupScope } from \"@radix-ui/react-roving-focus\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport * as RovingFocusGroup from \"@radix-ui/react-roving-focus\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { jsx } from \"react/jsx-runtime\";\nvar TABS_NAME = \"Tabs\";\nvar [createTabsContext, createTabsScope] = createContextScope(TABS_NAME, [\n createRovingFocusGroupScope\n]);\nvar useRovingFocusGroupScope = createRovingFocusGroupScope();\nvar [TabsProvider, useTabsContext] = createTabsContext(TABS_NAME);\nvar Tabs = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeTabs,\n value: valueProp,\n onValueChange,\n defaultValue,\n orientation = \"horizontal\",\n dir,\n activationMode = \"automatic\",\n ...tabsProps\n } = props;\n const direction = useDirection(dir);\n const [value, setValue] = useControllableState({\n prop: valueProp,\n onChange: onValueChange,\n defaultProp: defaultValue\n });\n return /* @__PURE__ */ jsx(\n TabsProvider,\n {\n scope: __scopeTabs,\n baseId: useId(),\n value,\n onValueChange: setValue,\n orientation,\n dir: direction,\n activationMode,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n dir: direction,\n \"data-orientation\": orientation,\n ...tabsProps,\n ref: forwardedRef\n }\n )\n }\n );\n }\n);\nTabs.displayName = TABS_NAME;\nvar TAB_LIST_NAME = \"TabsList\";\nvar TabsList = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, loop = true, ...listProps } = props;\n const context = useTabsContext(TAB_LIST_NAME, __scopeTabs);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeTabs);\n return /* @__PURE__ */ jsx(\n RovingFocusGroup.Root,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n orientation: context.orientation,\n dir: context.dir,\n loop,\n children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n role: \"tablist\",\n \"aria-orientation\": context.orientation,\n ...listProps,\n ref: forwardedRef\n }\n )\n }\n );\n }\n);\nTabsList.displayName = TAB_LIST_NAME;\nvar TRIGGER_NAME = \"TabsTrigger\";\nvar TabsTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, value, disabled = false, ...triggerProps } = props;\n const context = useTabsContext(TRIGGER_NAME, __scopeTabs);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeTabs);\n const triggerId = makeTriggerId(context.baseId, value);\n const contentId = makeContentId(context.baseId, value);\n const isSelected = value === context.value;\n return /* @__PURE__ */ jsx(\n RovingFocusGroup.Item,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n focusable: !disabled,\n active: isSelected,\n children: /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n role: \"tab\",\n \"aria-selected\": isSelected,\n \"aria-controls\": contentId,\n \"data-state\": isSelected ? \"active\" : \"inactive\",\n \"data-disabled\": disabled ? \"\" : void 0,\n disabled,\n id: triggerId,\n ...triggerProps,\n ref: forwardedRef,\n onMouseDown: composeEventHandlers(props.onMouseDown, (event) => {\n if (!disabled && event.button === 0 && event.ctrlKey === false) {\n context.onValueChange(value);\n } else {\n event.preventDefault();\n }\n }),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if ([\" \", \"Enter\"].includes(event.key)) context.onValueChange(value);\n }),\n onFocus: composeEventHandlers(props.onFocus, () => {\n const isAutomaticActivation = context.activationMode !== \"manual\";\n if (!isSelected && !disabled && isAutomaticActivation) {\n context.onValueChange(value);\n }\n })\n }\n )\n }\n );\n }\n);\nTabsTrigger.displayName = TRIGGER_NAME;\nvar CONTENT_NAME = \"TabsContent\";\nvar TabsContent = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeTabs, value, forceMount, children, ...contentProps } = props;\n const context = useTabsContext(CONTENT_NAME, __scopeTabs);\n const triggerId = makeTriggerId(context.baseId, value);\n const contentId = makeContentId(context.baseId, value);\n const isSelected = value === context.value;\n const isMountAnimationPreventedRef = React.useRef(isSelected);\n React.useEffect(() => {\n const rAF = requestAnimationFrame(() => isMountAnimationPreventedRef.current = false);\n return () => cancelAnimationFrame(rAF);\n }, []);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || isSelected, children: ({ present }) => /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": isSelected ? \"active\" : \"inactive\",\n \"data-orientation\": context.orientation,\n role: \"tabpanel\",\n \"aria-labelledby\": triggerId,\n hidden: !present,\n id: contentId,\n tabIndex: 0,\n ...contentProps,\n ref: forwardedRef,\n style: {\n ...props.style,\n animationDuration: isMountAnimationPreventedRef.current ? \"0s\" : void 0\n },\n children: present && children\n }\n ) });\n }\n);\nTabsContent.displayName = CONTENT_NAME;\nfunction makeTriggerId(baseId, value) {\n return `${baseId}-trigger-${value}`;\n}\nfunction makeContentId(baseId, value) {\n return `${baseId}-content-${value}`;\n}\nvar Root2 = Tabs;\nvar List = TabsList;\nvar Trigger = TabsTrigger;\nvar Content = TabsContent;\nexport {\n Content,\n List,\n Root2 as Root,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Trigger,\n createTabsScope\n};\n//# sourceMappingURL=index.mjs.map\n","import { type SerializeFrom } from '@remix-run/node'\nimport { Await, Link, useLoaderData } from '@remix-run/react'\nimport * as React from 'react'\nimport { Icon } from '#app/components/icons.tsx'\nimport { Loading } from '#app/components/loading.tsx'\nimport { DiscordCTA, useDiscordCTALink } from '#app/routes/_app+/discord.tsx'\nimport { useAltDown } from '#app/utils/misc.tsx'\nimport { type loader } from '../index.tsx'\n\nexport function DiscordChat() {\n\treturn (\n\t\t<div className=\"flex h-full w-full flex-col gap-4 pt-4\">\n\t\t\t<div className=\"text-center\">\n\t\t\t\t<DiscordCTA />\n\t\t\t</div>\n\t\t\t<div className=\"flex-1 overflow-y-scroll bg-accent pb-4 scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t<DiscordPosts />\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction DiscordPosts() {\n\tconst data = useLoaderData<typeof loader>()\n\tconst ctaLink = useDiscordCTALink()\n\tconst altDown = useAltDown()\n\treturn (\n\t\t<div className=\"flex h-full flex-col items-center justify-between\">\n\t\t\t<React.Suspense\n\t\t\t\tfallback={\n\t\t\t\t\t<div className=\"flex h-full w-full flex-col items-center justify-center\">\n\t\t\t\t\t\t<Loading>Loading Discord Posts</Loading>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<Await\n\t\t\t\t\tresolve={data.discordPostsPromise}\n\t\t\t\t\terrorElement={\n\t\t\t\t\t\t<div className=\"text-red-500\">\n\t\t\t\t\t\t\tThere was a problem loading the discord posts\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{(posts) => (\n\t\t\t\t\t\t<ul className=\"flex w-full flex-col gap-4 p-3 xl:p-12\">\n\t\t\t\t\t\t\t{posts.map((post) => (\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tkey={post.id}\n\t\t\t\t\t\t\t\t\tclassName=\"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\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<DiscordPost thread={post} />\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t</Await>\n\t\t\t</React.Suspense>\n\t\t\t<div>\n\t\t\t\t<Link\n\t\t\t\t\tto={\n\t\t\t\t\t\taltDown && !ctaLink.includes('oauth')\n\t\t\t\t\t\t\t? ctaLink.replace(/^https/, 'discord')\n\t\t\t\t\t\t\t: ctaLink\n\t\t\t\t\t}\n\t\t\t\t\ttarget={ctaLink.includes('oauth') ? undefined : '_blank'}\n\t\t\t\t\trel=\"noreferrer noopener\"\n\t\t\t\t\tonClick={\n\t\t\t\t\t\taltDown\n\t\t\t\t\t\t\t? (e) => {\n\t\t\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\t\t\twindow.open(\n\t\t\t\t\t\t\t\t\t\te.currentTarget.href,\n\t\t\t\t\t\t\t\t\t\t'_blank',\n\t\t\t\t\t\t\t\t\t\t'noreferrer noopener',\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tclassName=\"flex items-center gap-2 p-2 text-xl hover:underline\"\n\t\t\t\t>\n\t\t\t\t\tCreate Post <Icon name=\"ExternalLink\" />\n\t\t\t\t</Link>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction DiscordPost({\n\tthread,\n}: {\n\tthread: Awaited<SerializeFrom<typeof loader>['discordPostsPromise']>[number]\n}) {\n\tconst reactionsWithCounts = thread.reactions.filter((r) => r.count)\n\n\treturn (\n\t\t<div>\n\t\t\t<div className=\"flex flex-col gap-2 p-4\">\n\t\t\t\t<div className=\"flex gap-4\">\n\t\t\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t\t\t{thread.tags.length ? (\n\t\t\t\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t\t\t\t{thread.tags.map((t) => (\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tkey={t.name}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-center gap-1 rounded-full bg-accent px-2 py-1 text-sm\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<span className=\"h-3 w-3 leading-3\">\n\t\t\t\t\t\t\t\t\t\t\t<Emoji name={t.emojiName} url={t.emojiUrl} />\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<span>{t.name}</span>\n\t\t\t\t\t\t\t\t\t</div>\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) : null}\n\t\t\t\t\t\t<strong className=\"text-xl font-bold\">{thread.name}</strong>\n\t\t\t\t\t\t<div className=\"flex items-start gap-1\">\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t\t{thread.authorAvatarUrl ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\tsrc={thread.authorAvatarUrl}\n\t\t\t\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-6 w-6 rounded-full\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName=\"font-bold\"\n\t\t\t\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\t\t\t\tthread.authorHexAccentColor\n\t\t\t\t\t\t\t\t\t\t\t\t? { color: thread.authorHexAccentColor }\n\t\t\t\t\t\t\t\t\t\t\t\t: {}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{thread.authorDisplayName}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t:{' '}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<span className=\"flex-1 overflow-ellipsis text-muted-foreground\">\n\t\t\t\t\t\t\t\t{thread.messagePreview}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t{thread.previewImageUrl ? (\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={thread.previewImageUrl}\n\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\tclassName=\"h-28 w-28 rounded-lg object-cover\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t{reactionsWithCounts.length ? (\n\t\t\t\t\t\t\t\t<ul className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t{reactionsWithCounts.map((r, i) => (\n\t\t\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 rounded-md border border-blue-600 bg-blue-500/20 px-[5px] py-[0.5px] text-sm\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"h-3 w-3 leading-3\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Emoji name={r.emojiName} url={r.emojiUrl} />\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t<span>{r.count}</span>\n\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t<span className=\"inline-flex items-center gap-1\">\n\t\t\t\t\t\t\t\t<Icon name=\"Chat\" /> {thread.messageCount}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{` · ${thread.lastUpdatedDisplay}`}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span className=\"flex items-center gap-4\">\n\t\t\t\t\t\t<a href={thread.link.replace(/^https/, 'discord')}>\n\t\t\t\t\t\t\t<Icon name=\"Discord\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<a href={thread.link} target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t\t\t<Icon name=\"ExternalLink\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction Emoji({ name, url }: { name?: string; url?: string }) {\n\treturn url ? (\n\t\t<img src={url} alt={name} className=\"h-full w-full\" />\n\t) : name ? (\n\t\tname\n\t) : null\n}\n","import { toast as showToast } from 'sonner'\nimport { type InBrowserBrowserRef } from '#app/components/in-browser-browser'\nimport { SimpleTooltip } from '#app/components/ui/tooltip'\nimport { SetAppToPlayground } from '#app/routes/set-playground'\nimport { PlaygroundWindow } from './playground-window'\nimport { Preview } from './preview'\n\nexport function Playground({\n\tappInfo: playgroundAppInfo,\n\tinBrowserBrowserRef,\n\tproblemAppName,\n\tallApps,\n\tisUpToDate,\n}: {\n\tappInfo: Parameters<typeof Preview>['0']['appInfo'] | null\n\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n\tproblemAppName?: string\n\tallApps: Array<{ name: string; displayName: string }>\n\tisUpToDate: boolean\n}) {\n\treturn (\n\t\t<PlaygroundWindow\n\t\t\tplaygroundAppName={playgroundAppInfo?.appName}\n\t\t\tproblemAppName={problemAppName}\n\t\t\tallApps={allApps}\n\t\t\tisUpToDate={isUpToDate}\n\t\t>\n\t\t\t{playgroundAppInfo?.dev.type === 'none' ? (\n\t\t\t\t<div>\n\t\t\t\t\t<div className=\"text-foreground-secondary flex h-full items-center justify-center text-2xl\">\n\t\t\t\t\t\tNon-UI playground\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div className=\"text-foreground-secondary flex flex-wrap gap-1 text-center\">\n\t\t\t\t\t\t\tNavigate to{' '}\n\t\t\t\t\t\t\t<SimpleTooltip content={playgroundAppInfo.fullPath}>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(\n\t\t\t\t\t\t\t\t\t\t\tplaygroundAppInfo.fullPath,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\tshowToast.success('Copied playground path to clipboard')\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tthe playground directory\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</SimpleTooltip>{' '}\n\t\t\t\t\t\t\tin your editor and terminal to work on this exercise!\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t) : playgroundAppInfo ? (\n\t\t\t\t<Preview\n\t\t\t\t\tid={playgroundAppInfo.appName}\n\t\t\t\t\tappInfo={playgroundAppInfo}\n\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div className=\"flex flex-col justify-center gap-2\">\n\t\t\t\t\t<p>Please set the playground first</p>\n\t\t\t\t\t{problemAppName ? (\n\t\t\t\t\t\t<SetAppToPlayground appName={problemAppName} />\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</PlaygroundWindow>\n\t)\n}\n","import {\n\tgetAppByName,\n\tgetAppDisplayName,\n\tgetApps,\n\tgetExerciseApp,\n\tisExerciseStepApp,\n\tisPlaygroundApp,\n\trequireExerciseApp,\n\ttype App,\n\ttype ExerciseStepApp,\n} from '@epic-web/workshop-utils/apps.server'\nimport { compileMarkdownString } from '@epic-web/workshop-utils/compile-mdx.server'\nimport {\n\tcombineServerTimings,\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport * as Tabs from '@radix-ui/react-tabs'\nimport {\n\tunstable_data as data,\n\tredirect,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n} from '@remix-run/node'\nimport {\n\tLink,\n\tuseLoaderData,\n\tuseNavigate,\n\tuseSearchParams,\n} from '@remix-run/react'\nimport { clsx } from 'clsx'\nimport * as React from 'react'\nimport { useRef } from 'react'\nimport { Diff } from '#app/components/diff.tsx'\nimport { GeneralErrorBoundary } from '#app/components/error-boundary.tsx'\nimport { type InBrowserBrowserRef } from '#app/components/in-browser-browser.tsx'\nimport { getDiffCode } from '#app/utils/diff.server.ts'\nimport { userHasAccessToWorkshop } from '@epic-web/workshop-utils/epic-api.server'\nimport { useAltDown } from '#app/utils/misc.tsx'\nimport { fetchDiscordPosts } from './__shared/discord.server.ts'\nimport { DiscordChat } from './__shared/discord.tsx'\nimport { Playground } from './__shared/playground.tsx'\nimport { Preview } from './__shared/preview.tsx'\nimport { Tests } from './__shared/tests.tsx'\nimport { getAppRunningState } from './__shared/utils.tsx'\n\nexport async function loader({ request, params }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('exerciseStepTypeIndexLoader')\n\tconst userHasAccess = await userHasAccessToWorkshop({\n\t\trequest,\n\t\ttimings,\n\t})\n\tconst searchParams = new URL(request.url).searchParams\n\tconst cacheOptions = { request, timings }\n\tconst exerciseStepApp = await requireExerciseApp(params, cacheOptions)\n\tconst reqUrl = new URL(request.url)\n\n\tconst pathnameParam = reqUrl.searchParams.get('pathname')\n\tif (pathnameParam === '' || pathnameParam === '/') {\n\t\treqUrl.searchParams.delete('pathname')\n\t\tthrow redirect(reqUrl.toString())\n\t}\n\n\tconst problemApp = await getExerciseApp(\n\t\t{ ...params, type: 'problem' },\n\t\tcacheOptions,\n\t)\n\tconst solutionApp = await getExerciseApp(\n\t\t{ ...params, type: 'solution' },\n\t\tcacheOptions,\n\t)\n\n\tif (!problemApp && !solutionApp) {\n\t\tthrow new Response('Not found', { status: 404 })\n\t}\n\n\tconst allAppsFull = await getApps(cacheOptions)\n\tconst playgroundApp = allAppsFull.find(isPlaygroundApp)\n\n\tconst app1Name = reqUrl.searchParams.get('app1')\n\tconst app2Name = reqUrl.searchParams.get('app2')\n\tconst app1 = app1Name\n\t\t? await getAppByName(app1Name)\n\t\t: playgroundApp || problemApp\n\tconst app2 = app2Name ? await getAppByName(app2Name) : solutionApp\n\n\tfunction getStepId(a: ExerciseStepApp) {\n\t\treturn (\n\t\t\ta.exerciseNumber * 1000 +\n\t\t\ta.stepNumber * 10 +\n\t\t\t(a.type === 'problem' ? 0 : 1)\n\t\t)\n\t}\n\n\tfunction getStepNameAndId(a: App) {\n\t\tif (isExerciseStepApp(a)) {\n\t\t\tconst exerciseNumberStr = String(a.exerciseNumber).padStart(2, '0')\n\t\t\tconst stepNumberStr = String(a.stepNumber).padStart(2, '0')\n\n\t\t\treturn {\n\t\t\t\tstepName: `${exerciseNumberStr}/${stepNumberStr}.${a.type}`,\n\t\t\t\tstepId: getStepId(a),\n\t\t\t}\n\t\t}\n\t\treturn { stepName: '', stepId: -1 }\n\t}\n\n\tconst allApps = allAppsFull\n\t\t.filter((a, i, ar) => ar.findIndex((b) => a.name === b.name) === i)\n\t\t.map((a) => ({\n\t\t\tdisplayName: getAppDisplayName(a, allAppsFull),\n\t\t\tname: a.name,\n\t\t\ttitle: a.title,\n\t\t\ttype: a.type,\n\t\t\t...getStepNameAndId(a),\n\t\t}))\n\n\tallApps.sort((a, b) => {\n\t\t// order them by their stepId\n\t\tif (a.stepId > 0 && b.stepId > 0) return a.stepId - b.stepId\n\n\t\t// non-step apps should come after step apps\n\t\tif (a.stepId > 0) return -1\n\t\tif (b.stepId > 0) return 1\n\n\t\treturn 0\n\t})\n\n\tasync function getDiffProp() {\n\t\tif (!app1 || !app2) {\n\t\t\treturn {\n\t\t\t\tapp1: app1?.name,\n\t\t\t\tapp2: app2?.name,\n\t\t\t\tdiffCode: null,\n\t\t\t}\n\t\t}\n\t\tif (!userHasAccess) {\n\t\t\treturn {\n\t\t\t\tapp1: app1?.name,\n\t\t\t\tapp2: app2?.name,\n\t\t\t\tdiffCode: await compileMarkdownString(\n\t\t\t\t\t`<h1>Access Denied</h1><p>You must login or register for the workshop to view the diff</p>`,\n\t\t\t\t),\n\t\t\t}\n\t\t}\n\t\tconst diffCode = await getDiffCode(app1, app2, {\n\t\t\t...cacheOptions,\n\t\t\tforceFresh: searchParams.get('forceFresh') === 'diff',\n\t\t}).catch((e) => {\n\t\t\tconsole.error(e)\n\t\t\treturn null\n\t\t})\n\t\treturn {\n\t\t\tapp1: app1.name,\n\t\t\tapp2: app2.name,\n\t\t\tdiffCode,\n\t\t}\n\t}\n\n\treturn data(\n\t\t{\n\t\t\ttype: params.type as 'problem' | 'solution',\n\t\t\texerciseStepApp,\n\t\t\tallApps,\n\t\t\t// defer this promise so that we don't block the response from being sent\n\t\t\tdiscordPostsPromise: fetchDiscordPosts({ request }),\n\t\t\tplayground: playgroundApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'playground',\n\t\t\t\t\t\tfullPath: playgroundApp.fullPath,\n\t\t\t\t\t\tdev: playgroundApp.dev,\n\t\t\t\t\t\ttest: playgroundApp.test,\n\t\t\t\t\t\ttitle: playgroundApp.title,\n\t\t\t\t\t\tname: playgroundApp.name,\n\t\t\t\t\t\tappName: playgroundApp.appName,\n\t\t\t\t\t\tisUpToDate: playgroundApp.isUpToDate,\n\t\t\t\t\t\tstackBlitzUrl: playgroundApp.stackBlitzUrl,\n\t\t\t\t\t\t...(await getAppRunningState(playgroundApp)),\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tproblem: problemApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'problem',\n\t\t\t\t\t\tfullPath: problemApp.fullPath,\n\t\t\t\t\t\tdev: problemApp.dev,\n\t\t\t\t\t\ttest: problemApp.test,\n\t\t\t\t\t\ttitle: problemApp.title,\n\t\t\t\t\t\tname: problemApp.name,\n\t\t\t\t\t\tstackBlitzUrl: problemApp.stackBlitzUrl,\n\t\t\t\t\t\t...(await getAppRunningState(problemApp)),\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tsolution: solutionApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'solution',\n\t\t\t\t\t\tfullPath: solutionApp.fullPath,\n\t\t\t\t\t\tdev: solutionApp.dev,\n\t\t\t\t\t\ttest: solutionApp.test,\n\t\t\t\t\t\ttitle: solutionApp.title,\n\t\t\t\t\t\tname: solutionApp.name,\n\t\t\t\t\t\tstackBlitzUrl: solutionApp.stackBlitzUrl,\n\t\t\t\t\t\t...(await getAppRunningState(solutionApp)),\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tdiff: getDiffProp(),\n\t\t} as const,\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'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nconst tabs = [\n\t'playground',\n\t'problem',\n\t'solution',\n\t'tests',\n\t'diff',\n\t'chat',\n] as const\nconst isValidPreview = (s: string | null): s is (typeof tabs)[number] =>\n\tBoolean(s && tabs.includes(s as (typeof tabs)[number]))\n\nfunction withParam(\n\tsearchParams: URLSearchParams,\n\tkey: string,\n\tvalue: string | null,\n) {\n\tconst newSearchParams = new URLSearchParams(searchParams)\n\tif (value === null) {\n\t\tnewSearchParams.delete(key)\n\t} else {\n\t\tnewSearchParams.set(key, value)\n\t}\n\treturn newSearchParams\n}\n\nexport default function ExercisePartRoute() {\n\tconst data = useLoaderData<typeof loader>()\n\tconst [searchParams] = useSearchParams()\n\n\tconst preview = searchParams.get('preview')\n\tconst inBrowserBrowserRef = useRef<InBrowserBrowserRef>(null)\n\n\tconst altDown = useAltDown()\n\tconst navigate = useNavigate()\n\n\tfunction shouldHideTab(tab: (typeof tabs)[number]) {\n\t\tif (tab === 'tests') {\n\t\t\treturn (\n\t\t\t\tENV.EPICSHOP_DEPLOYED ||\n\t\t\t\t!data.playground ||\n\t\t\t\tdata.playground.test.type === 'none'\n\t\t\t)\n\t\t}\n\t\tif (tab === 'problem' || tab === 'solution') {\n\t\t\tif (data[tab]?.dev.type === 'none') return true\n\t\t\tif (ENV.EPICSHOP_DEPLOYED) {\n\t\t\t\treturn data[tab]?.dev.type !== 'browser' && !data[tab]?.stackBlitzUrl\n\t\t\t}\n\t\t}\n\t\tif (tab === 'playground' && ENV.EPICSHOP_DEPLOYED) return true\n\t\treturn false\n\t}\n\n\tconst activeTab = isValidPreview(preview)\n\t\t? preview\n\t\t: tabs.find((t) => !shouldHideTab(t))\n\n\t// when alt is held down, the diff tab should open to the full-page diff view\n\t// between the problem and solution (this is more for the instructor than the student)\n\tconst altDiffUrl = `/diff?${new URLSearchParams({\n\t\tapp1: data.problem?.name ?? '',\n\t\tapp2: data.solution?.name ?? '',\n\t})}`\n\n\tfunction handleDiffTabClick(event: React.MouseEvent<HTMLAnchorElement>) {\n\t\tif (event.altKey && !event.ctrlKey && !event.shiftKey && !event.metaKey) {\n\t\t\tevent.preventDefault()\n\t\t\tnavigate(altDiffUrl)\n\t\t}\n\t}\n\n\treturn (\n\t\t<Tabs.Root\n\t\t\tclassName=\"relative flex flex-col overflow-y-auto sm:col-span-1 sm:row-span-1\"\n\t\t\tvalue={activeTab}\n\t\t\t// intentionally no onValueChange here because the Link will trigger the\n\t\t\t// change.\n\t\t>\n\t\t\t<Tabs.List className=\"h-14 min-h-14 overflow-x-hidden border-b scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t{tabs.map((tab) => {\n\t\t\t\t\tconst hidden = shouldHideTab(tab)\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Tabs.Trigger key={tab} value={tab} hidden={hidden} asChild>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tid={`${tab}-tab`}\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'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',\n\t\t\t\t\t\t\t\t\thidden ? 'hidden' : 'inline-block',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tpreventScrollReset\n\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\tonClick={handleDiffTabClick}\n\t\t\t\t\t\t\t\tto={\n\t\t\t\t\t\t\t\t\ttab === 'diff' && altDown\n\t\t\t\t\t\t\t\t\t\t? altDiffUrl\n\t\t\t\t\t\t\t\t\t\t: `?${withParam(\n\t\t\t\t\t\t\t\t\t\t\t\tsearchParams,\n\t\t\t\t\t\t\t\t\t\t\t\t'preview',\n\t\t\t\t\t\t\t\t\t\t\t\ttab === 'playground' ? null : tab,\n\t\t\t\t\t\t\t\t\t\t\t)}`\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{tab}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</Tabs.Trigger>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</Tabs.List>\n\t\t\t<div className=\"relative z-10 flex min-h-96 flex-grow flex-col overflow-y-auto\">\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"playground\"\n\t\t\t\t\tclassName=\"flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t>\n\t\t\t\t\t<Playground\n\t\t\t\t\t\tappInfo={data.playground}\n\t\t\t\t\t\tproblemAppName={data.problem?.name}\n\t\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t\t\tallApps={data.allApps}\n\t\t\t\t\t\tisUpToDate={data.playground?.isUpToDate ?? false}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"problem\"\n\t\t\t\t\tclassName=\"flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t>\n\t\t\t\t\t<Preview\n\t\t\t\t\t\tappInfo={data.problem}\n\t\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"solution\"\n\t\t\t\t\tclassName=\"flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t>\n\t\t\t\t\t<Preview\n\t\t\t\t\t\tappInfo={data.solution}\n\t\t\t\t\t\tinBrowserBrowserRef={inBrowserBrowserRef}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"tests\"\n\t\t\t\t\tclassName=\"flex w-full flex-grow items-start justify-center self-start overflow-hidden radix-state-inactive:hidden\"\n\t\t\t\t>\n\t\t\t\t\t<Tests\n\t\t\t\t\t\tappInfo={data.playground}\n\t\t\t\t\t\tproblemAppName={data.problem?.name}\n\t\t\t\t\t\tallApps={data.allApps}\n\t\t\t\t\t\tisUpToDate={data.playground?.isUpToDate ?? false}\n\t\t\t\t\t/>\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"diff\"\n\t\t\t\t\tclassName=\"flex h-full w-full flex-grow items-start justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t>\n\t\t\t\t\t<Diff diff={data.diff} allApps={data.allApps} />\n\t\t\t\t</Tabs.Content>\n\t\t\t\t<Tabs.Content\n\t\t\t\t\tvalue=\"chat\"\n\t\t\t\t\tclassName=\"flex h-full w-full flex-grow items-start justify-center self-start radix-state-inactive:hidden\"\n\t\t\t\t>\n\t\t\t\t\t<DiscordChat />\n\t\t\t\t</Tabs.Content>\n\t\t\t</div>\n\t\t</Tabs.Root>\n\t)\n}\n\nexport function ErrorBoundary() {\n\treturn (\n\t\t<GeneralErrorBoundary\n\t\t\tstatusHandlers={{\n\t\t\t\t404: () => <p>Sorry, we couldn't find an app here.</p>,\n\t\t\t}}\n\t\t/>\n\t)\n}\n"],"names":["createContextScope","scopeName","createContextScopeDeps","defaultContexts","createContext3","rootComponentName","defaultContext","BaseContext","React.createContext","index","Provider","props","scope","children","context","Context","value","React.useMemo","jsx","useContext2","consumerName","React.useContext","createScope","scopeContexts","contexts","composeContextScopes","scopes","baseScope","scopeHooks","createScope2","overrideScopes","nextScopes","nextScopes2","useScope","currentScope","ENTRY_FOCUS","EVENT_OPTIONS","GROUP_NAME","Collection","useCollection","createCollectionScope","createCollection","createRovingFocusGroupContext","createRovingFocusGroupScope","RovingFocusProvider","useRovingFocusContext","RovingFocusGroup","React.forwardRef","forwardedRef","RovingFocusGroupImpl","__scopeRovingFocusGroup","orientation","loop","dir","currentTabStopIdProp","defaultCurrentTabStopId","onCurrentTabStopIdChange","onEntryFocus","preventScrollOnEntryFocus","groupProps","ref","React.useRef","composedRefs","useComposedRefs","direction","useDirection","currentTabStopId","setCurrentTabStopId","useControllableState","isTabbingBackOut","setIsTabbingBackOut","React.useState","handleEntryFocus","useCallbackRef","getItems","isClickFocusRef","focusableItemsCount","setFocusableItemsCount","React.useEffect","node","React.useCallback","tabStopId","prevCount","Primitive","composeEventHandlers","event","isKeyboardFocus","entryFocusEvent","items","item","activeItem","currentItem","candidateNodes","focusFirst","ITEM_NAME","RovingFocusGroupItem","focusable","active","itemProps","autoId","useId","id","isCurrentTabStop","onFocusableItemAdd","onFocusableItemRemove","focusIntent","getFocusIntent","currentIndex","wrapArray","MAP_KEY_TO_FOCUS_INTENT","getDirectionAwareKey","key","candidates","preventScroll","PREVIOUSLY_FOCUSED_ELEMENT","candidate","array","startIndex","_","Root","Item","TABS_NAME","createTabsContext","createTabsScope","useRovingFocusGroupScope","TabsProvider","useTabsContext","Tabs","__scopeTabs","valueProp","onValueChange","defaultValue","activationMode","tabsProps","setValue","TAB_LIST_NAME","TabsList","listProps","rovingFocusGroupScope","RovingFocusGroup.Root","TRIGGER_NAME","TabsTrigger","disabled","triggerProps","triggerId","makeTriggerId","contentId","makeContentId","isSelected","RovingFocusGroup.Item","isAutomaticActivation","CONTENT_NAME","TabsContent","forceMount","contentProps","isMountAnimationPreventedRef","rAF","Presence","present","baseId","Root2","List","Trigger","Content","DiscordChat","jsxs","DiscordCTA","DiscordPosts","data","useLoaderData","ctaLink","useDiscordCTALink","altDown","useAltDown","React.Suspense","Loading","Await","posts","post","DiscordPost","Link","e","Icon","thread","reactionsWithCounts","t","Emoji","i","name","url","Playground","playgroundAppInfo","inBrowserBrowserRef","problemAppName","allApps","isUpToDate","PlaygroundWindow","SimpleTooltip","showToast","Preview","SetAppToPlayground","tabs","isValidPreview","s","Boolean","includes","withParam","searchParams","newSearchParams","URLSearchParams","delete","set","ExercisePartRoute","useSearchParams","preview","get","useRef","navigate","useNavigate","shouldHideTab","tab","ENV","EPICSHOP_DEPLOYED","playground","test","type","dev","stackBlitzUrl","activeTab","find","altDiffUrl","app1","problem","app2","solution","handleDiffTabClick","altKey","ctrlKey","shiftKey","metaKey","preventDefault","className","map","hidden","asChild","clsx","preventScrollReset","prefetch","onClick","to","appInfo","Tests","Diff","diff","ErrorBoundary","GeneralErrorBoundary","statusHandlers"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as o,j as f,R as J}from"./index-BFGhCX_U.js";import{r as be}from"./components-Be92gVxW.js";import{h as O,k as Se,d as rt,j as _e,A as st,P as D,f as E,i as $,D as ct,C as lt,e as Te,l as it,V as at,n as dt,u as Re,R as ut}from"./tooltip-DO9uwurQ.js";import{h as pt,u as ft,R as mt,F as ht,P as vt}from"./index-BCTr8uu6.js";function Ee(t,[c,e]){return Math.min(e,Math.max(c,t))}function gt(t,c=[]){let e=[];function i(d,n){const r=o.createContext(n),s=e.length;e=[...e,n];function p(x){const{scope:y,children:C,...g}=x,a=(y==null?void 0:y[t][s])||r,m=o.useMemo(()=>g,Object.values(g));return f.jsx(a.Provider,{value:m,children:C})}function S(x,y){const C=(y==null?void 0:y[t][s])||r,g=o.useContext(C);if(g)return g;if(n!==void 0)return n;throw new Error(`\`${x}\` must be used within \`${d}\``)}return p.displayName=d+"Provider",[p,S]}const l=()=>{const d=e.map(n=>o.createContext(n));return function(r){const s=(r==null?void 0:r[t])||d;return o.useMemo(()=>({[`__scope${t}`]:{...r,[t]:s}}),[r,s])}};return l.scopeName=t,[i,St(l,...c)]}function St(...t){const c=t[0];if(t.length===1)return c;const e=()=>{const i=t.map(l=>({useScope:l(),scopeName:l.scopeName}));return function(d){const n=i.reduce((r,{useScope:s,scopeName:p})=>{const x=s(d)[`__scope${p}`];return{...r,...x}},{});return o.useMemo(()=>({[`__scope${c.scopeName}`]:n}),[n])}};return e.scopeName=c.scopeName,e}function xt(t){const c=t+"CollectionProvider",[e,i]=gt(c),[l,d]=e(c,{collectionRef:{current:null},itemMap:new Map}),n=C=>{const{scope:g,children:a}=C,m=J.useRef(null),w=J.useRef(new Map).current;return f.jsx(l,{scope:g,itemMap:w,collectionRef:m,children:a})};n.displayName=c;const r=t+"CollectionSlot",s=J.forwardRef((C,g)=>{const{scope:a,children:m}=C,w=d(r,a),u=O(g,w.collectionRef);return f.jsx(Se,{ref:u,children:m})});s.displayName=r;const p=t+"CollectionItemSlot",S="data-radix-collection-item",x=J.forwardRef((C,g)=>{const{scope:a,children:m,...w}=C,u=J.useRef(null),h=O(g,u),b=d(p,a);return J.useEffect(()=>(b.itemMap.set(u,{ref:u,...w}),()=>void b.itemMap.delete(u))),f.jsx(Se,{[S]:"",ref:h,children:m})});x.displayName=p;function y(C){const g=d(t+"CollectionConsumer",C);return J.useCallback(()=>{const m=g.collectionRef.current;if(!m)return[];const w=Array.from(m.querySelectorAll(`[${S}]`));return Array.from(g.itemMap.values()).sort((b,M)=>w.indexOf(b.ref.current)-w.indexOf(M.ref.current))},[g.collectionRef,g.itemMap])}return[{Provider:n,Slot:s,ItemSlot:x},y,i]}var wt=o.createContext(void 0);function Ct(t){const c=o.useContext(wt);return t||c||"ltr"}function yt(t){const c=o.useRef({value:t,previous:t});return o.useMemo(()=>(c.current.value!==t&&(c.current.previous=c.current.value,c.current.value=t),c.current.previous),[t])}var It=[" ","Enter","ArrowUp","ArrowDown"],Tt=[" ","Enter"],se="Select",[ae,de,Pt]=xt(se),[te,$t]=rt(se,[Pt,_e]),ue=_e(),[Rt,z]=te(se),[Et,bt]=te(se),Ne=t=>{const{__scopeSelect:c,children:e,open:i,defaultOpen:l,onOpenChange:d,value:n,defaultValue:r,onValueChange:s,dir:p,name:S,autoComplete:x,disabled:y,required:C,form:g}=t,a=ue(c),[m,w]=o.useState(null),[u,h]=o.useState(null),[b,M]=o.useState(!1),oe=Ct(p),[_=!1,L]=Re({prop:i,defaultProp:l,onChange:d}),[U,Y]=Re({prop:n,defaultProp:r,onChange:s}),V=o.useRef(null),B=m?g||!!m.closest("form"):!0,[K,H]=o.useState(new Set),F=Array.from(K).map(N=>N.props.value).join(";");return f.jsx(ut,{...a,children:f.jsxs(Rt,{required:C,scope:c,trigger:m,onTriggerChange:w,valueNode:u,onValueNodeChange:h,valueNodeHasChildren:b,onValueNodeHasChildrenChange:M,contentId:Te(),value:U,onValueChange:Y,open:_,onOpenChange:L,dir:oe,triggerPointerDownPosRef:V,disabled:y,children:[f.jsx(ae.Provider,{scope:c,children:f.jsx(Et,{scope:t.__scopeSelect,onNativeOptionAdd:o.useCallback(N=>{H(k=>new Set(k).add(N))},[]),onNativeOptionRemove:o.useCallback(N=>{H(k=>{const W=new Set(k);return W.delete(N),W})},[]),children:e})}),B?f.jsxs(tt,{"aria-hidden":!0,required:C,tabIndex:-1,name:S,autoComplete:x,value:U,onChange:N=>Y(N.target.value),disabled:y,form:g,children:[U===void 0?f.jsx("option",{value:""}):null,Array.from(K)]},F):null]})})};Ne.displayName=se;var Me="SelectTrigger",Ae=o.forwardRef((t,c)=>{const{__scopeSelect:e,disabled:i=!1,...l}=t,d=ue(e),n=z(Me,e),r=n.disabled||i,s=O(c,n.onTriggerChange),p=de(e),S=o.useRef("touch"),[x,y,C]=ot(a=>{const m=p().filter(h=>!h.disabled),w=m.find(h=>h.value===n.value),u=nt(m,a,w);u!==void 0&&n.onValueChange(u.value)}),g=a=>{r||(n.onOpenChange(!0),C()),a&&(n.triggerPointerDownPosRef.current={x:Math.round(a.pageX),y:Math.round(a.pageY)})};return f.jsx(st,{asChild:!0,...d,children:f.jsx(D.button,{type:"button",role:"combobox","aria-controls":n.contentId,"aria-expanded":n.open,"aria-required":n.required,"aria-autocomplete":"none",dir:n.dir,"data-state":n.open?"open":"closed",disabled:r,"data-disabled":r?"":void 0,"data-placeholder":et(n.value)?"":void 0,...l,ref:s,onClick:E(l.onClick,a=>{a.currentTarget.focus(),S.current!=="mouse"&&g(a)}),onPointerDown:E(l.onPointerDown,a=>{S.current=a.pointerType;const m=a.target;m.hasPointerCapture(a.pointerId)&&m.releasePointerCapture(a.pointerId),a.button===0&&a.ctrlKey===!1&&a.pointerType==="mouse"&&(g(a),a.preventDefault())}),onKeyDown:E(l.onKeyDown,a=>{const m=x.current!=="";!(a.ctrlKey||a.altKey||a.metaKey)&&a.key.length===1&&y(a.key),!(m&&a.key===" ")&&It.includes(a.key)&&(g(),a.preventDefault())})})})});Ae.displayName=Me;var Oe="SelectValue",De=o.forwardRef((t,c)=>{const{__scopeSelect:e,className:i,style:l,children:d,placeholder:n="",...r}=t,s=z(Oe,e),{onValueNodeHasChildrenChange:p}=s,S=d!==void 0,x=O(c,s.onValueNodeChange);return $(()=>{p(S)},[p,S]),f.jsx(D.span,{...r,ref:x,style:{pointerEvents:"none"},children:et(s.value)?f.jsx(f.Fragment,{children:n}):d})});De.displayName=Oe;var _t="SelectIcon",je=o.forwardRef((t,c)=>{const{__scopeSelect:e,children:i,...l}=t;return f.jsx(D.span,{"aria-hidden":!0,...l,ref:c,children:i||"▼"})});je.displayName=_t;var Nt="SelectPortal",Le=t=>f.jsx(vt,{asChild:!0,...t});Le.displayName=Nt;var Q="SelectContent",ke=o.forwardRef((t,c)=>{const e=z(Q,t.__scopeSelect),[i,l]=o.useState();if($(()=>{l(new DocumentFragment)},[]),!e.open){const d=i;return d?be.createPortal(f.jsx(Ve,{scope:t.__scopeSelect,children:f.jsx(ae.Slot,{scope:t.__scopeSelect,children:f.jsx("div",{children:t.children})})}),d):null}return f.jsx(Be,{...t,ref:c})});ke.displayName=Q;var j=10,[Ve,q]=te(Q),Mt="SelectContentImpl",Be=o.forwardRef((t,c)=>{const{__scopeSelect:e,position:i="item-aligned",onCloseAutoFocus:l,onEscapeKeyDown:d,onPointerDownOutside:n,side:r,sideOffset:s,align:p,alignOffset:S,arrowPadding:x,collisionBoundary:y,collisionPadding:C,sticky:g,hideWhenDetached:a,avoidCollisions:m,...w}=t,u=z(Q,e),[h,b]=o.useState(null),[M,oe]=o.useState(null),_=O(c,v=>b(v)),[L,U]=o.useState(null),[Y,V]=o.useState(null),B=de(e),[K,H]=o.useState(!1),F=o.useRef(!1);o.useEffect(()=>{if(h)return pt(h)},[h]),ft();const N=o.useCallback(v=>{const[R,...A]=B().map(T=>T.ref.current),[P]=A.slice(-1),I=document.activeElement;for(const T of v)if(T===I||(T==null||T.scrollIntoView({block:"nearest"}),T===R&&M&&(M.scrollTop=0),T===P&&M&&(M.scrollTop=M.scrollHeight),T==null||T.focus(),document.activeElement!==I))return},[B,M]),k=o.useCallback(()=>N([L,h]),[N,L,h]);o.useEffect(()=>{K&&k()},[K,k]);const{onOpenChange:W,triggerPointerDownPosRef:G}=u;o.useEffect(()=>{if(h){let v={x:0,y:0};const R=P=>{var I,T;v={x:Math.abs(Math.round(P.pageX)-(((I=G.current)==null?void 0:I.x)??0)),y:Math.abs(Math.round(P.pageY)-(((T=G.current)==null?void 0:T.y)??0))}},A=P=>{v.x<=10&&v.y<=10?P.preventDefault():h.contains(P.target)||W(!1),document.removeEventListener("pointermove",R),G.current=null};return G.current!==null&&(document.addEventListener("pointermove",R),document.addEventListener("pointerup",A,{capture:!0,once:!0})),()=>{document.removeEventListener("pointermove",R),document.removeEventListener("pointerup",A,{capture:!0})}}},[h,W,G]),o.useEffect(()=>{const v=()=>W(!1);return window.addEventListener("blur",v),window.addEventListener("resize",v),()=>{window.removeEventListener("blur",v),window.removeEventListener("resize",v)}},[W]);const[pe,ce]=ot(v=>{const R=B().filter(I=>!I.disabled),A=R.find(I=>I.ref.current===document.activeElement),P=nt(R,v,A);P&&setTimeout(()=>P.ref.current.focus())}),fe=o.useCallback((v,R,A)=>{const P=!F.current&&!A;(u.value!==void 0&&u.value===R||P)&&(U(v),P&&(F.current=!0))},[u.value]),me=o.useCallback(()=>h==null?void 0:h.focus(),[h]),ee=o.useCallback((v,R,A)=>{const P=!F.current&&!A;(u.value!==void 0&&u.value===R||P)&&V(v)},[u.value]),le=i==="popper"?xe:He,ne=le===xe?{side:r,sideOffset:s,align:p,alignOffset:S,arrowPadding:x,collisionBoundary:y,collisionPadding:C,sticky:g,hideWhenDetached:a,avoidCollisions:m}:{};return f.jsx(Ve,{scope:e,content:h,viewport:M,onViewportChange:oe,itemRefCallback:fe,selectedItem:L,onItemLeave:me,itemTextRefCallback:ee,focusSelectedItem:k,selectedItemText:Y,position:i,isPositioned:K,searchRef:pe,children:f.jsx(mt,{as:Se,allowPinchZoom:!0,children:f.jsx(ht,{asChild:!0,trapped:u.open,onMountAutoFocus:v=>{v.preventDefault()},onUnmountAutoFocus:E(l,v=>{var R;(R=u.trigger)==null||R.focus({preventScroll:!0}),v.preventDefault()}),children:f.jsx(ct,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:d,onPointerDownOutside:n,onFocusOutside:v=>v.preventDefault(),onDismiss:()=>u.onOpenChange(!1),children:f.jsx(le,{role:"listbox",id:u.contentId,"data-state":u.open?"open":"closed",dir:u.dir,onContextMenu:v=>v.preventDefault(),...w,...ne,onPlaced:()=>H(!0),ref:_,style:{display:"flex",flexDirection:"column",outline:"none",...w.style},onKeyDown:E(w.onKeyDown,v=>{const R=v.ctrlKey||v.altKey||v.metaKey;if(v.key==="Tab"&&v.preventDefault(),!R&&v.key.length===1&&ce(v.key),["ArrowUp","ArrowDown","Home","End"].includes(v.key)){let P=B().filter(I=>!I.disabled).map(I=>I.ref.current);if(["ArrowUp","End"].includes(v.key)&&(P=P.slice().reverse()),["ArrowUp","ArrowDown"].includes(v.key)){const I=v.target,T=P.indexOf(I);P=P.slice(T+1)}setTimeout(()=>N(P)),v.preventDefault()}})})})})})})});Be.displayName=Mt;var At="SelectItemAlignedPosition",He=o.forwardRef((t,c)=>{const{__scopeSelect:e,onPlaced:i,...l}=t,d=z(Q,e),n=q(Q,e),[r,s]=o.useState(null),[p,S]=o.useState(null),x=O(c,_=>S(_)),y=de(e),C=o.useRef(!1),g=o.useRef(!0),{viewport:a,selectedItem:m,selectedItemText:w,focusSelectedItem:u}=n,h=o.useCallback(()=>{if(d.trigger&&d.valueNode&&r&&p&&a&&m&&w){const _=d.trigger.getBoundingClientRect(),L=p.getBoundingClientRect(),U=d.valueNode.getBoundingClientRect(),Y=w.getBoundingClientRect();if(d.dir!=="rtl"){const I=Y.left-L.left,T=U.left-I,X=_.left-T,Z=_.width+X,he=Math.max(Z,L.width),ve=window.innerWidth-j,ge=Ee(T,[j,Math.max(j,ve-he)]);r.style.minWidth=Z+"px",r.style.left=ge+"px"}else{const I=L.right-Y.right,T=window.innerWidth-U.right-I,X=window.innerWidth-_.right-T,Z=_.width+X,he=Math.max(Z,L.width),ve=window.innerWidth-j,ge=Ee(T,[j,Math.max(j,ve-he)]);r.style.minWidth=Z+"px",r.style.right=ge+"px"}const V=y(),B=window.innerHeight-j*2,K=a.scrollHeight,H=window.getComputedStyle(p),F=parseInt(H.borderTopWidth,10),N=parseInt(H.paddingTop,10),k=parseInt(H.borderBottomWidth,10),W=parseInt(H.paddingBottom,10),G=F+N+K+W+k,pe=Math.min(m.offsetHeight*5,G),ce=window.getComputedStyle(a),fe=parseInt(ce.paddingTop,10),me=parseInt(ce.paddingBottom,10),ee=_.top+_.height/2-j,le=B-ee,ne=m.offsetHeight/2,v=m.offsetTop+ne,R=F+N+v,A=G-R;if(R<=ee){const I=V.length>0&&m===V[V.length-1].ref.current;r.style.bottom="0px";const T=p.clientHeight-a.offsetTop-a.offsetHeight,X=Math.max(le,ne+(I?me:0)+T+k),Z=R+X;r.style.height=Z+"px"}else{const I=V.length>0&&m===V[0].ref.current;r.style.top="0px";const X=Math.max(ee,F+a.offsetTop+(I?fe:0)+ne)+A;r.style.height=X+"px",a.scrollTop=R-ee+a.offsetTop}r.style.margin=`${j}px 0`,r.style.minHeight=pe+"px",r.style.maxHeight=B+"px",i==null||i(),requestAnimationFrame(()=>C.current=!0)}},[y,d.trigger,d.valueNode,r,p,a,m,w,d.dir,i]);$(()=>h(),[h]);const[b,M]=o.useState();$(()=>{p&&M(window.getComputedStyle(p).zIndex)},[p]);const oe=o.useCallback(_=>{_&&g.current===!0&&(h(),u==null||u(),g.current=!1)},[h,u]);return f.jsx(Dt,{scope:e,contentWrapper:r,shouldExpandOnScrollRef:C,onScrollButtonChange:oe,children:f.jsx("div",{ref:s,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:b},children:f.jsx(D.div,{...l,ref:x,style:{boxSizing:"border-box",maxHeight:"100%",...l.style}})})})});He.displayName=At;var Ot="SelectPopperPosition",xe=o.forwardRef((t,c)=>{const{__scopeSelect:e,align:i="start",collisionPadding:l=j,...d}=t,n=ue(e);return f.jsx(lt,{...n,...d,ref:c,align:i,collisionPadding:l,style:{boxSizing:"border-box",...d.style,"--radix-select-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-select-content-available-width":"var(--radix-popper-available-width)","--radix-select-content-available-height":"var(--radix-popper-available-height)","--radix-select-trigger-width":"var(--radix-popper-anchor-width)","--radix-select-trigger-height":"var(--radix-popper-anchor-height)"}})});xe.displayName=Ot;var[Dt,Pe]=te(Q,{}),we="SelectViewport",Fe=o.forwardRef((t,c)=>{const{__scopeSelect:e,nonce:i,...l}=t,d=q(we,e),n=Pe(we,e),r=O(c,d.onViewportChange),s=o.useRef(0);return f.jsxs(f.Fragment,{children:[f.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}"},nonce:i}),f.jsx(ae.Slot,{scope:e,children:f.jsx(D.div,{"data-radix-select-viewport":"",role:"presentation",...l,ref:r,style:{position:"relative",flex:1,overflow:"hidden auto",...l.style},onScroll:E(l.onScroll,p=>{const S=p.currentTarget,{contentWrapper:x,shouldExpandOnScrollRef:y}=n;if(y!=null&&y.current&&x){const C=Math.abs(s.current-S.scrollTop);if(C>0){const g=window.innerHeight-j*2,a=parseFloat(x.style.minHeight),m=parseFloat(x.style.height),w=Math.max(a,m);if(w<g){const u=w+C,h=Math.min(g,u),b=u-h;x.style.height=h+"px",x.style.bottom==="0px"&&(S.scrollTop=b>0?b:0,x.style.justifyContent="flex-end")}}}s.current=S.scrollTop})})})]})});Fe.displayName=we;var We="SelectGroup",[jt,Lt]=te(We),Ue=o.forwardRef((t,c)=>{const{__scopeSelect:e,...i}=t,l=Te();return f.jsx(jt,{scope:e,id:l,children:f.jsx(D.div,{role:"group","aria-labelledby":l,...i,ref:c})})});Ue.displayName=We;var Ke="SelectLabel",Ge=o.forwardRef((t,c)=>{const{__scopeSelect:e,...i}=t,l=Lt(Ke,e);return f.jsx(D.div,{id:l.id,...i,ref:c})});Ge.displayName=Ke;var ie="SelectItem",[kt,$e]=te(ie),ze=o.forwardRef((t,c)=>{const{__scopeSelect:e,value:i,disabled:l=!1,textValue:d,...n}=t,r=z(ie,e),s=q(ie,e),p=r.value===i,[S,x]=o.useState(d??""),[y,C]=o.useState(!1),g=O(c,u=>{var h;return(h=s.itemRefCallback)==null?void 0:h.call(s,u,i,l)}),a=Te(),m=o.useRef("touch"),w=()=>{l||(r.onValueChange(i),r.onOpenChange(!1))};if(i==="")throw new Error("A <Select.Item /> must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.");return f.jsx(kt,{scope:e,value:i,disabled:l,textId:a,isSelected:p,onItemTextChange:o.useCallback(u=>{x(h=>h||((u==null?void 0:u.textContent)??"").trim())},[]),children:f.jsx(ae.ItemSlot,{scope:e,value:i,disabled:l,textValue:S,children:f.jsx(D.div,{role:"option","aria-labelledby":a,"data-highlighted":y?"":void 0,"aria-selected":p&&y,"data-state":p?"checked":"unchecked","aria-disabled":l||void 0,"data-disabled":l?"":void 0,tabIndex:l?void 0:-1,...n,ref:g,onFocus:E(n.onFocus,()=>C(!0)),onBlur:E(n.onBlur,()=>C(!1)),onClick:E(n.onClick,()=>{m.current!=="mouse"&&w()}),onPointerUp:E(n.onPointerUp,()=>{m.current==="mouse"&&w()}),onPointerDown:E(n.onPointerDown,u=>{m.current=u.pointerType}),onPointerMove:E(n.onPointerMove,u=>{var h;m.current=u.pointerType,l?(h=s.onItemLeave)==null||h.call(s):m.current==="mouse"&&u.currentTarget.focus({preventScroll:!0})}),onPointerLeave:E(n.onPointerLeave,u=>{var h;u.currentTarget===document.activeElement&&((h=s.onItemLeave)==null||h.call(s))}),onKeyDown:E(n.onKeyDown,u=>{var b;((b=s.searchRef)==null?void 0:b.current)!==""&&u.key===" "||(Tt.includes(u.key)&&w(),u.key===" "&&u.preventDefault())})})})})});ze.displayName=ie;var re="SelectItemText",qe=o.forwardRef((t,c)=>{const{__scopeSelect:e,className:i,style:l,...d}=t,n=z(re,e),r=q(re,e),s=$e(re,e),p=bt(re,e),[S,x]=o.useState(null),y=O(c,w=>x(w),s.onItemTextChange,w=>{var u;return(u=r.itemTextRefCallback)==null?void 0:u.call(r,w,s.value,s.disabled)}),C=S==null?void 0:S.textContent,g=o.useMemo(()=>f.jsx("option",{value:s.value,disabled:s.disabled,children:C},s.value),[s.disabled,s.value,C]),{onNativeOptionAdd:a,onNativeOptionRemove:m}=p;return $(()=>(a(g),()=>m(g)),[a,m,g]),f.jsxs(f.Fragment,{children:[f.jsx(D.span,{id:s.textId,...d,ref:y}),s.isSelected&&n.valueNode&&!n.valueNodeHasChildren?be.createPortal(d.children,n.valueNode):null]})});qe.displayName=re;var Ye="SelectItemIndicator",Xe=o.forwardRef((t,c)=>{const{__scopeSelect:e,...i}=t;return $e(Ye,e).isSelected?f.jsx(D.span,{"aria-hidden":!0,...i,ref:c}):null});Xe.displayName=Ye;var Ce="SelectScrollUpButton",Ze=o.forwardRef((t,c)=>{const e=q(Ce,t.__scopeSelect),i=Pe(Ce,t.__scopeSelect),[l,d]=o.useState(!1),n=O(c,i.onScrollButtonChange);return $(()=>{if(e.viewport&&e.isPositioned){let r=function(){const p=s.scrollTop>0;d(p)};const s=e.viewport;return r(),s.addEventListener("scroll",r),()=>s.removeEventListener("scroll",r)}},[e.viewport,e.isPositioned]),l?f.jsx(Qe,{...t,ref:n,onAutoScroll:()=>{const{viewport:r,selectedItem:s}=e;r&&s&&(r.scrollTop=r.scrollTop-s.offsetHeight)}}):null});Ze.displayName=Ce;var ye="SelectScrollDownButton",Je=o.forwardRef((t,c)=>{const e=q(ye,t.__scopeSelect),i=Pe(ye,t.__scopeSelect),[l,d]=o.useState(!1),n=O(c,i.onScrollButtonChange);return $(()=>{if(e.viewport&&e.isPositioned){let r=function(){const p=s.scrollHeight-s.clientHeight,S=Math.ceil(s.scrollTop)<p;d(S)};const s=e.viewport;return r(),s.addEventListener("scroll",r),()=>s.removeEventListener("scroll",r)}},[e.viewport,e.isPositioned]),l?f.jsx(Qe,{...t,ref:n,onAutoScroll:()=>{const{viewport:r,selectedItem:s}=e;r&&s&&(r.scrollTop=r.scrollTop+s.offsetHeight)}}):null});Je.displayName=ye;var Qe=o.forwardRef((t,c)=>{const{__scopeSelect:e,onAutoScroll:i,...l}=t,d=q("SelectScrollButton",e),n=o.useRef(null),r=de(e),s=o.useCallback(()=>{n.current!==null&&(window.clearInterval(n.current),n.current=null)},[]);return o.useEffect(()=>()=>s(),[s]),$(()=>{var S;const p=r().find(x=>x.ref.current===document.activeElement);(S=p==null?void 0:p.ref.current)==null||S.scrollIntoView({block:"nearest"})},[r]),f.jsx(D.div,{"aria-hidden":!0,...l,ref:c,style:{flexShrink:0,...l.style},onPointerDown:E(l.onPointerDown,()=>{n.current===null&&(n.current=window.setInterval(i,50))}),onPointerMove:E(l.onPointerMove,()=>{var p;(p=d.onItemLeave)==null||p.call(d),n.current===null&&(n.current=window.setInterval(i,50))}),onPointerLeave:E(l.onPointerLeave,()=>{s()})})}),Vt="SelectSeparator",Bt=o.forwardRef((t,c)=>{const{__scopeSelect:e,...i}=t;return f.jsx(D.div,{"aria-hidden":!0,...i,ref:c})});Bt.displayName=Vt;var Ie="SelectArrow",Ht=o.forwardRef((t,c)=>{const{__scopeSelect:e,...i}=t,l=ue(e),d=z(Ie,e),n=q(Ie,e);return d.open&&n.position==="popper"?f.jsx(it,{...l,...i,ref:c}):null});Ht.displayName=Ie;function et(t){return t===""||t===void 0}var tt=o.forwardRef((t,c)=>{const{value:e,...i}=t,l=o.useRef(null),d=O(c,l),n=yt(e);return o.useEffect(()=>{const r=l.current,s=window.HTMLSelectElement.prototype,S=Object.getOwnPropertyDescriptor(s,"value").set;if(n!==e&&S){const x=new Event("change",{bubbles:!0});S.call(r,e),r.dispatchEvent(x)}},[n,e]),f.jsx(at,{asChild:!0,children:f.jsx("select",{...i,ref:d,defaultValue:e})})});tt.displayName="BubbleSelect";function ot(t){const c=dt(t),e=o.useRef(""),i=o.useRef(0),l=o.useCallback(n=>{const r=e.current+n;c(r),function s(p){e.current=p,window.clearTimeout(i.current),p!==""&&(i.current=window.setTimeout(()=>s(""),1e3))}(r)},[c]),d=o.useCallback(()=>{e.current="",window.clearTimeout(i.current)},[]);return o.useEffect(()=>()=>window.clearTimeout(i.current),[]),[e,l,d]}function nt(t,c,e){const l=c.length>1&&Array.from(c).every(p=>p===c[0])?c[0]:c,d=e?t.indexOf(e):-1;let n=Ft(t,Math.max(d,0));l.length===1&&(n=n.filter(p=>p!==e));const s=n.find(p=>p.textValue.toLowerCase().startsWith(l.toLowerCase()));return s!==e?s:void 0}function Ft(t,c){return t.map((e,i)=>t[(c+i)%t.length])}var zt=Ne,qt=Ae,Yt=De,Xt=je,Zt=Le,Jt=ke,Qt=Fe,eo=Ue,to=Ge,oo=ze,no=qe,ro=Xe,so=Ze,co=Je;export{Jt as C,eo as G,Xt as I,to as L,Zt as P,zt as R,so as S,qt as T,Yt as V,Qt as a,co as b,oo as c,no as d,ro as e,xt as f,Ct as u};
|
|
2
|
-
//# sourceMappingURL=index-
|
|
1
|
+
import{r as o,j as f,R as J}from"./index-C_B1-9rF.js";import{r as be}from"./components-DUNtf72c.js";import{h as O,k as Se,d as rt,j as _e,A as st,P as D,f as E,i as $,D as ct,C as lt,e as Te,l as it,V as at,n as dt,u as Re,R as ut}from"./tooltip-BoVikCa-.js";import{h as pt,u as ft,R as mt,F as ht,P as vt}from"./index-CV3nxGFp.js";function Ee(t,[c,e]){return Math.min(e,Math.max(c,t))}function gt(t,c=[]){let e=[];function i(d,n){const r=o.createContext(n),s=e.length;e=[...e,n];function p(x){const{scope:y,children:C,...g}=x,a=(y==null?void 0:y[t][s])||r,m=o.useMemo(()=>g,Object.values(g));return f.jsx(a.Provider,{value:m,children:C})}function S(x,y){const C=(y==null?void 0:y[t][s])||r,g=o.useContext(C);if(g)return g;if(n!==void 0)return n;throw new Error(`\`${x}\` must be used within \`${d}\``)}return p.displayName=d+"Provider",[p,S]}const l=()=>{const d=e.map(n=>o.createContext(n));return function(r){const s=(r==null?void 0:r[t])||d;return o.useMemo(()=>({[`__scope${t}`]:{...r,[t]:s}}),[r,s])}};return l.scopeName=t,[i,St(l,...c)]}function St(...t){const c=t[0];if(t.length===1)return c;const e=()=>{const i=t.map(l=>({useScope:l(),scopeName:l.scopeName}));return function(d){const n=i.reduce((r,{useScope:s,scopeName:p})=>{const x=s(d)[`__scope${p}`];return{...r,...x}},{});return o.useMemo(()=>({[`__scope${c.scopeName}`]:n}),[n])}};return e.scopeName=c.scopeName,e}function xt(t){const c=t+"CollectionProvider",[e,i]=gt(c),[l,d]=e(c,{collectionRef:{current:null},itemMap:new Map}),n=C=>{const{scope:g,children:a}=C,m=J.useRef(null),w=J.useRef(new Map).current;return f.jsx(l,{scope:g,itemMap:w,collectionRef:m,children:a})};n.displayName=c;const r=t+"CollectionSlot",s=J.forwardRef((C,g)=>{const{scope:a,children:m}=C,w=d(r,a),u=O(g,w.collectionRef);return f.jsx(Se,{ref:u,children:m})});s.displayName=r;const p=t+"CollectionItemSlot",S="data-radix-collection-item",x=J.forwardRef((C,g)=>{const{scope:a,children:m,...w}=C,u=J.useRef(null),h=O(g,u),b=d(p,a);return J.useEffect(()=>(b.itemMap.set(u,{ref:u,...w}),()=>void b.itemMap.delete(u))),f.jsx(Se,{[S]:"",ref:h,children:m})});x.displayName=p;function y(C){const g=d(t+"CollectionConsumer",C);return J.useCallback(()=>{const m=g.collectionRef.current;if(!m)return[];const w=Array.from(m.querySelectorAll(`[${S}]`));return Array.from(g.itemMap.values()).sort((b,M)=>w.indexOf(b.ref.current)-w.indexOf(M.ref.current))},[g.collectionRef,g.itemMap])}return[{Provider:n,Slot:s,ItemSlot:x},y,i]}var wt=o.createContext(void 0);function Ct(t){const c=o.useContext(wt);return t||c||"ltr"}function yt(t){const c=o.useRef({value:t,previous:t});return o.useMemo(()=>(c.current.value!==t&&(c.current.previous=c.current.value,c.current.value=t),c.current.previous),[t])}var It=[" ","Enter","ArrowUp","ArrowDown"],Tt=[" ","Enter"],se="Select",[ae,de,Pt]=xt(se),[te,$t]=rt(se,[Pt,_e]),ue=_e(),[Rt,z]=te(se),[Et,bt]=te(se),Ne=t=>{const{__scopeSelect:c,children:e,open:i,defaultOpen:l,onOpenChange:d,value:n,defaultValue:r,onValueChange:s,dir:p,name:S,autoComplete:x,disabled:y,required:C,form:g}=t,a=ue(c),[m,w]=o.useState(null),[u,h]=o.useState(null),[b,M]=o.useState(!1),oe=Ct(p),[_=!1,L]=Re({prop:i,defaultProp:l,onChange:d}),[U,Y]=Re({prop:n,defaultProp:r,onChange:s}),V=o.useRef(null),B=m?g||!!m.closest("form"):!0,[K,H]=o.useState(new Set),F=Array.from(K).map(N=>N.props.value).join(";");return f.jsx(ut,{...a,children:f.jsxs(Rt,{required:C,scope:c,trigger:m,onTriggerChange:w,valueNode:u,onValueNodeChange:h,valueNodeHasChildren:b,onValueNodeHasChildrenChange:M,contentId:Te(),value:U,onValueChange:Y,open:_,onOpenChange:L,dir:oe,triggerPointerDownPosRef:V,disabled:y,children:[f.jsx(ae.Provider,{scope:c,children:f.jsx(Et,{scope:t.__scopeSelect,onNativeOptionAdd:o.useCallback(N=>{H(k=>new Set(k).add(N))},[]),onNativeOptionRemove:o.useCallback(N=>{H(k=>{const W=new Set(k);return W.delete(N),W})},[]),children:e})}),B?f.jsxs(tt,{"aria-hidden":!0,required:C,tabIndex:-1,name:S,autoComplete:x,value:U,onChange:N=>Y(N.target.value),disabled:y,form:g,children:[U===void 0?f.jsx("option",{value:""}):null,Array.from(K)]},F):null]})})};Ne.displayName=se;var Me="SelectTrigger",Ae=o.forwardRef((t,c)=>{const{__scopeSelect:e,disabled:i=!1,...l}=t,d=ue(e),n=z(Me,e),r=n.disabled||i,s=O(c,n.onTriggerChange),p=de(e),S=o.useRef("touch"),[x,y,C]=ot(a=>{const m=p().filter(h=>!h.disabled),w=m.find(h=>h.value===n.value),u=nt(m,a,w);u!==void 0&&n.onValueChange(u.value)}),g=a=>{r||(n.onOpenChange(!0),C()),a&&(n.triggerPointerDownPosRef.current={x:Math.round(a.pageX),y:Math.round(a.pageY)})};return f.jsx(st,{asChild:!0,...d,children:f.jsx(D.button,{type:"button",role:"combobox","aria-controls":n.contentId,"aria-expanded":n.open,"aria-required":n.required,"aria-autocomplete":"none",dir:n.dir,"data-state":n.open?"open":"closed",disabled:r,"data-disabled":r?"":void 0,"data-placeholder":et(n.value)?"":void 0,...l,ref:s,onClick:E(l.onClick,a=>{a.currentTarget.focus(),S.current!=="mouse"&&g(a)}),onPointerDown:E(l.onPointerDown,a=>{S.current=a.pointerType;const m=a.target;m.hasPointerCapture(a.pointerId)&&m.releasePointerCapture(a.pointerId),a.button===0&&a.ctrlKey===!1&&a.pointerType==="mouse"&&(g(a),a.preventDefault())}),onKeyDown:E(l.onKeyDown,a=>{const m=x.current!=="";!(a.ctrlKey||a.altKey||a.metaKey)&&a.key.length===1&&y(a.key),!(m&&a.key===" ")&&It.includes(a.key)&&(g(),a.preventDefault())})})})});Ae.displayName=Me;var Oe="SelectValue",De=o.forwardRef((t,c)=>{const{__scopeSelect:e,className:i,style:l,children:d,placeholder:n="",...r}=t,s=z(Oe,e),{onValueNodeHasChildrenChange:p}=s,S=d!==void 0,x=O(c,s.onValueNodeChange);return $(()=>{p(S)},[p,S]),f.jsx(D.span,{...r,ref:x,style:{pointerEvents:"none"},children:et(s.value)?f.jsx(f.Fragment,{children:n}):d})});De.displayName=Oe;var _t="SelectIcon",je=o.forwardRef((t,c)=>{const{__scopeSelect:e,children:i,...l}=t;return f.jsx(D.span,{"aria-hidden":!0,...l,ref:c,children:i||"▼"})});je.displayName=_t;var Nt="SelectPortal",Le=t=>f.jsx(vt,{asChild:!0,...t});Le.displayName=Nt;var Q="SelectContent",ke=o.forwardRef((t,c)=>{const e=z(Q,t.__scopeSelect),[i,l]=o.useState();if($(()=>{l(new DocumentFragment)},[]),!e.open){const d=i;return d?be.createPortal(f.jsx(Ve,{scope:t.__scopeSelect,children:f.jsx(ae.Slot,{scope:t.__scopeSelect,children:f.jsx("div",{children:t.children})})}),d):null}return f.jsx(Be,{...t,ref:c})});ke.displayName=Q;var j=10,[Ve,q]=te(Q),Mt="SelectContentImpl",Be=o.forwardRef((t,c)=>{const{__scopeSelect:e,position:i="item-aligned",onCloseAutoFocus:l,onEscapeKeyDown:d,onPointerDownOutside:n,side:r,sideOffset:s,align:p,alignOffset:S,arrowPadding:x,collisionBoundary:y,collisionPadding:C,sticky:g,hideWhenDetached:a,avoidCollisions:m,...w}=t,u=z(Q,e),[h,b]=o.useState(null),[M,oe]=o.useState(null),_=O(c,v=>b(v)),[L,U]=o.useState(null),[Y,V]=o.useState(null),B=de(e),[K,H]=o.useState(!1),F=o.useRef(!1);o.useEffect(()=>{if(h)return pt(h)},[h]),ft();const N=o.useCallback(v=>{const[R,...A]=B().map(T=>T.ref.current),[P]=A.slice(-1),I=document.activeElement;for(const T of v)if(T===I||(T==null||T.scrollIntoView({block:"nearest"}),T===R&&M&&(M.scrollTop=0),T===P&&M&&(M.scrollTop=M.scrollHeight),T==null||T.focus(),document.activeElement!==I))return},[B,M]),k=o.useCallback(()=>N([L,h]),[N,L,h]);o.useEffect(()=>{K&&k()},[K,k]);const{onOpenChange:W,triggerPointerDownPosRef:G}=u;o.useEffect(()=>{if(h){let v={x:0,y:0};const R=P=>{var I,T;v={x:Math.abs(Math.round(P.pageX)-(((I=G.current)==null?void 0:I.x)??0)),y:Math.abs(Math.round(P.pageY)-(((T=G.current)==null?void 0:T.y)??0))}},A=P=>{v.x<=10&&v.y<=10?P.preventDefault():h.contains(P.target)||W(!1),document.removeEventListener("pointermove",R),G.current=null};return G.current!==null&&(document.addEventListener("pointermove",R),document.addEventListener("pointerup",A,{capture:!0,once:!0})),()=>{document.removeEventListener("pointermove",R),document.removeEventListener("pointerup",A,{capture:!0})}}},[h,W,G]),o.useEffect(()=>{const v=()=>W(!1);return window.addEventListener("blur",v),window.addEventListener("resize",v),()=>{window.removeEventListener("blur",v),window.removeEventListener("resize",v)}},[W]);const[pe,ce]=ot(v=>{const R=B().filter(I=>!I.disabled),A=R.find(I=>I.ref.current===document.activeElement),P=nt(R,v,A);P&&setTimeout(()=>P.ref.current.focus())}),fe=o.useCallback((v,R,A)=>{const P=!F.current&&!A;(u.value!==void 0&&u.value===R||P)&&(U(v),P&&(F.current=!0))},[u.value]),me=o.useCallback(()=>h==null?void 0:h.focus(),[h]),ee=o.useCallback((v,R,A)=>{const P=!F.current&&!A;(u.value!==void 0&&u.value===R||P)&&V(v)},[u.value]),le=i==="popper"?xe:He,ne=le===xe?{side:r,sideOffset:s,align:p,alignOffset:S,arrowPadding:x,collisionBoundary:y,collisionPadding:C,sticky:g,hideWhenDetached:a,avoidCollisions:m}:{};return f.jsx(Ve,{scope:e,content:h,viewport:M,onViewportChange:oe,itemRefCallback:fe,selectedItem:L,onItemLeave:me,itemTextRefCallback:ee,focusSelectedItem:k,selectedItemText:Y,position:i,isPositioned:K,searchRef:pe,children:f.jsx(mt,{as:Se,allowPinchZoom:!0,children:f.jsx(ht,{asChild:!0,trapped:u.open,onMountAutoFocus:v=>{v.preventDefault()},onUnmountAutoFocus:E(l,v=>{var R;(R=u.trigger)==null||R.focus({preventScroll:!0}),v.preventDefault()}),children:f.jsx(ct,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:d,onPointerDownOutside:n,onFocusOutside:v=>v.preventDefault(),onDismiss:()=>u.onOpenChange(!1),children:f.jsx(le,{role:"listbox",id:u.contentId,"data-state":u.open?"open":"closed",dir:u.dir,onContextMenu:v=>v.preventDefault(),...w,...ne,onPlaced:()=>H(!0),ref:_,style:{display:"flex",flexDirection:"column",outline:"none",...w.style},onKeyDown:E(w.onKeyDown,v=>{const R=v.ctrlKey||v.altKey||v.metaKey;if(v.key==="Tab"&&v.preventDefault(),!R&&v.key.length===1&&ce(v.key),["ArrowUp","ArrowDown","Home","End"].includes(v.key)){let P=B().filter(I=>!I.disabled).map(I=>I.ref.current);if(["ArrowUp","End"].includes(v.key)&&(P=P.slice().reverse()),["ArrowUp","ArrowDown"].includes(v.key)){const I=v.target,T=P.indexOf(I);P=P.slice(T+1)}setTimeout(()=>N(P)),v.preventDefault()}})})})})})})});Be.displayName=Mt;var At="SelectItemAlignedPosition",He=o.forwardRef((t,c)=>{const{__scopeSelect:e,onPlaced:i,...l}=t,d=z(Q,e),n=q(Q,e),[r,s]=o.useState(null),[p,S]=o.useState(null),x=O(c,_=>S(_)),y=de(e),C=o.useRef(!1),g=o.useRef(!0),{viewport:a,selectedItem:m,selectedItemText:w,focusSelectedItem:u}=n,h=o.useCallback(()=>{if(d.trigger&&d.valueNode&&r&&p&&a&&m&&w){const _=d.trigger.getBoundingClientRect(),L=p.getBoundingClientRect(),U=d.valueNode.getBoundingClientRect(),Y=w.getBoundingClientRect();if(d.dir!=="rtl"){const I=Y.left-L.left,T=U.left-I,X=_.left-T,Z=_.width+X,he=Math.max(Z,L.width),ve=window.innerWidth-j,ge=Ee(T,[j,Math.max(j,ve-he)]);r.style.minWidth=Z+"px",r.style.left=ge+"px"}else{const I=L.right-Y.right,T=window.innerWidth-U.right-I,X=window.innerWidth-_.right-T,Z=_.width+X,he=Math.max(Z,L.width),ve=window.innerWidth-j,ge=Ee(T,[j,Math.max(j,ve-he)]);r.style.minWidth=Z+"px",r.style.right=ge+"px"}const V=y(),B=window.innerHeight-j*2,K=a.scrollHeight,H=window.getComputedStyle(p),F=parseInt(H.borderTopWidth,10),N=parseInt(H.paddingTop,10),k=parseInt(H.borderBottomWidth,10),W=parseInt(H.paddingBottom,10),G=F+N+K+W+k,pe=Math.min(m.offsetHeight*5,G),ce=window.getComputedStyle(a),fe=parseInt(ce.paddingTop,10),me=parseInt(ce.paddingBottom,10),ee=_.top+_.height/2-j,le=B-ee,ne=m.offsetHeight/2,v=m.offsetTop+ne,R=F+N+v,A=G-R;if(R<=ee){const I=V.length>0&&m===V[V.length-1].ref.current;r.style.bottom="0px";const T=p.clientHeight-a.offsetTop-a.offsetHeight,X=Math.max(le,ne+(I?me:0)+T+k),Z=R+X;r.style.height=Z+"px"}else{const I=V.length>0&&m===V[0].ref.current;r.style.top="0px";const X=Math.max(ee,F+a.offsetTop+(I?fe:0)+ne)+A;r.style.height=X+"px",a.scrollTop=R-ee+a.offsetTop}r.style.margin=`${j}px 0`,r.style.minHeight=pe+"px",r.style.maxHeight=B+"px",i==null||i(),requestAnimationFrame(()=>C.current=!0)}},[y,d.trigger,d.valueNode,r,p,a,m,w,d.dir,i]);$(()=>h(),[h]);const[b,M]=o.useState();$(()=>{p&&M(window.getComputedStyle(p).zIndex)},[p]);const oe=o.useCallback(_=>{_&&g.current===!0&&(h(),u==null||u(),g.current=!1)},[h,u]);return f.jsx(Dt,{scope:e,contentWrapper:r,shouldExpandOnScrollRef:C,onScrollButtonChange:oe,children:f.jsx("div",{ref:s,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:b},children:f.jsx(D.div,{...l,ref:x,style:{boxSizing:"border-box",maxHeight:"100%",...l.style}})})})});He.displayName=At;var Ot="SelectPopperPosition",xe=o.forwardRef((t,c)=>{const{__scopeSelect:e,align:i="start",collisionPadding:l=j,...d}=t,n=ue(e);return f.jsx(lt,{...n,...d,ref:c,align:i,collisionPadding:l,style:{boxSizing:"border-box",...d.style,"--radix-select-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-select-content-available-width":"var(--radix-popper-available-width)","--radix-select-content-available-height":"var(--radix-popper-available-height)","--radix-select-trigger-width":"var(--radix-popper-anchor-width)","--radix-select-trigger-height":"var(--radix-popper-anchor-height)"}})});xe.displayName=Ot;var[Dt,Pe]=te(Q,{}),we="SelectViewport",Fe=o.forwardRef((t,c)=>{const{__scopeSelect:e,nonce:i,...l}=t,d=q(we,e),n=Pe(we,e),r=O(c,d.onViewportChange),s=o.useRef(0);return f.jsxs(f.Fragment,{children:[f.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}"},nonce:i}),f.jsx(ae.Slot,{scope:e,children:f.jsx(D.div,{"data-radix-select-viewport":"",role:"presentation",...l,ref:r,style:{position:"relative",flex:1,overflow:"hidden auto",...l.style},onScroll:E(l.onScroll,p=>{const S=p.currentTarget,{contentWrapper:x,shouldExpandOnScrollRef:y}=n;if(y!=null&&y.current&&x){const C=Math.abs(s.current-S.scrollTop);if(C>0){const g=window.innerHeight-j*2,a=parseFloat(x.style.minHeight),m=parseFloat(x.style.height),w=Math.max(a,m);if(w<g){const u=w+C,h=Math.min(g,u),b=u-h;x.style.height=h+"px",x.style.bottom==="0px"&&(S.scrollTop=b>0?b:0,x.style.justifyContent="flex-end")}}}s.current=S.scrollTop})})})]})});Fe.displayName=we;var We="SelectGroup",[jt,Lt]=te(We),Ue=o.forwardRef((t,c)=>{const{__scopeSelect:e,...i}=t,l=Te();return f.jsx(jt,{scope:e,id:l,children:f.jsx(D.div,{role:"group","aria-labelledby":l,...i,ref:c})})});Ue.displayName=We;var Ke="SelectLabel",Ge=o.forwardRef((t,c)=>{const{__scopeSelect:e,...i}=t,l=Lt(Ke,e);return f.jsx(D.div,{id:l.id,...i,ref:c})});Ge.displayName=Ke;var ie="SelectItem",[kt,$e]=te(ie),ze=o.forwardRef((t,c)=>{const{__scopeSelect:e,value:i,disabled:l=!1,textValue:d,...n}=t,r=z(ie,e),s=q(ie,e),p=r.value===i,[S,x]=o.useState(d??""),[y,C]=o.useState(!1),g=O(c,u=>{var h;return(h=s.itemRefCallback)==null?void 0:h.call(s,u,i,l)}),a=Te(),m=o.useRef("touch"),w=()=>{l||(r.onValueChange(i),r.onOpenChange(!1))};if(i==="")throw new Error("A <Select.Item /> must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.");return f.jsx(kt,{scope:e,value:i,disabled:l,textId:a,isSelected:p,onItemTextChange:o.useCallback(u=>{x(h=>h||((u==null?void 0:u.textContent)??"").trim())},[]),children:f.jsx(ae.ItemSlot,{scope:e,value:i,disabled:l,textValue:S,children:f.jsx(D.div,{role:"option","aria-labelledby":a,"data-highlighted":y?"":void 0,"aria-selected":p&&y,"data-state":p?"checked":"unchecked","aria-disabled":l||void 0,"data-disabled":l?"":void 0,tabIndex:l?void 0:-1,...n,ref:g,onFocus:E(n.onFocus,()=>C(!0)),onBlur:E(n.onBlur,()=>C(!1)),onClick:E(n.onClick,()=>{m.current!=="mouse"&&w()}),onPointerUp:E(n.onPointerUp,()=>{m.current==="mouse"&&w()}),onPointerDown:E(n.onPointerDown,u=>{m.current=u.pointerType}),onPointerMove:E(n.onPointerMove,u=>{var h;m.current=u.pointerType,l?(h=s.onItemLeave)==null||h.call(s):m.current==="mouse"&&u.currentTarget.focus({preventScroll:!0})}),onPointerLeave:E(n.onPointerLeave,u=>{var h;u.currentTarget===document.activeElement&&((h=s.onItemLeave)==null||h.call(s))}),onKeyDown:E(n.onKeyDown,u=>{var b;((b=s.searchRef)==null?void 0:b.current)!==""&&u.key===" "||(Tt.includes(u.key)&&w(),u.key===" "&&u.preventDefault())})})})})});ze.displayName=ie;var re="SelectItemText",qe=o.forwardRef((t,c)=>{const{__scopeSelect:e,className:i,style:l,...d}=t,n=z(re,e),r=q(re,e),s=$e(re,e),p=bt(re,e),[S,x]=o.useState(null),y=O(c,w=>x(w),s.onItemTextChange,w=>{var u;return(u=r.itemTextRefCallback)==null?void 0:u.call(r,w,s.value,s.disabled)}),C=S==null?void 0:S.textContent,g=o.useMemo(()=>f.jsx("option",{value:s.value,disabled:s.disabled,children:C},s.value),[s.disabled,s.value,C]),{onNativeOptionAdd:a,onNativeOptionRemove:m}=p;return $(()=>(a(g),()=>m(g)),[a,m,g]),f.jsxs(f.Fragment,{children:[f.jsx(D.span,{id:s.textId,...d,ref:y}),s.isSelected&&n.valueNode&&!n.valueNodeHasChildren?be.createPortal(d.children,n.valueNode):null]})});qe.displayName=re;var Ye="SelectItemIndicator",Xe=o.forwardRef((t,c)=>{const{__scopeSelect:e,...i}=t;return $e(Ye,e).isSelected?f.jsx(D.span,{"aria-hidden":!0,...i,ref:c}):null});Xe.displayName=Ye;var Ce="SelectScrollUpButton",Ze=o.forwardRef((t,c)=>{const e=q(Ce,t.__scopeSelect),i=Pe(Ce,t.__scopeSelect),[l,d]=o.useState(!1),n=O(c,i.onScrollButtonChange);return $(()=>{if(e.viewport&&e.isPositioned){let r=function(){const p=s.scrollTop>0;d(p)};const s=e.viewport;return r(),s.addEventListener("scroll",r),()=>s.removeEventListener("scroll",r)}},[e.viewport,e.isPositioned]),l?f.jsx(Qe,{...t,ref:n,onAutoScroll:()=>{const{viewport:r,selectedItem:s}=e;r&&s&&(r.scrollTop=r.scrollTop-s.offsetHeight)}}):null});Ze.displayName=Ce;var ye="SelectScrollDownButton",Je=o.forwardRef((t,c)=>{const e=q(ye,t.__scopeSelect),i=Pe(ye,t.__scopeSelect),[l,d]=o.useState(!1),n=O(c,i.onScrollButtonChange);return $(()=>{if(e.viewport&&e.isPositioned){let r=function(){const p=s.scrollHeight-s.clientHeight,S=Math.ceil(s.scrollTop)<p;d(S)};const s=e.viewport;return r(),s.addEventListener("scroll",r),()=>s.removeEventListener("scroll",r)}},[e.viewport,e.isPositioned]),l?f.jsx(Qe,{...t,ref:n,onAutoScroll:()=>{const{viewport:r,selectedItem:s}=e;r&&s&&(r.scrollTop=r.scrollTop+s.offsetHeight)}}):null});Je.displayName=ye;var Qe=o.forwardRef((t,c)=>{const{__scopeSelect:e,onAutoScroll:i,...l}=t,d=q("SelectScrollButton",e),n=o.useRef(null),r=de(e),s=o.useCallback(()=>{n.current!==null&&(window.clearInterval(n.current),n.current=null)},[]);return o.useEffect(()=>()=>s(),[s]),$(()=>{var S;const p=r().find(x=>x.ref.current===document.activeElement);(S=p==null?void 0:p.ref.current)==null||S.scrollIntoView({block:"nearest"})},[r]),f.jsx(D.div,{"aria-hidden":!0,...l,ref:c,style:{flexShrink:0,...l.style},onPointerDown:E(l.onPointerDown,()=>{n.current===null&&(n.current=window.setInterval(i,50))}),onPointerMove:E(l.onPointerMove,()=>{var p;(p=d.onItemLeave)==null||p.call(d),n.current===null&&(n.current=window.setInterval(i,50))}),onPointerLeave:E(l.onPointerLeave,()=>{s()})})}),Vt="SelectSeparator",Bt=o.forwardRef((t,c)=>{const{__scopeSelect:e,...i}=t;return f.jsx(D.div,{"aria-hidden":!0,...i,ref:c})});Bt.displayName=Vt;var Ie="SelectArrow",Ht=o.forwardRef((t,c)=>{const{__scopeSelect:e,...i}=t,l=ue(e),d=z(Ie,e),n=q(Ie,e);return d.open&&n.position==="popper"?f.jsx(it,{...l,...i,ref:c}):null});Ht.displayName=Ie;function et(t){return t===""||t===void 0}var tt=o.forwardRef((t,c)=>{const{value:e,...i}=t,l=o.useRef(null),d=O(c,l),n=yt(e);return o.useEffect(()=>{const r=l.current,s=window.HTMLSelectElement.prototype,S=Object.getOwnPropertyDescriptor(s,"value").set;if(n!==e&&S){const x=new Event("change",{bubbles:!0});S.call(r,e),r.dispatchEvent(x)}},[n,e]),f.jsx(at,{asChild:!0,children:f.jsx("select",{...i,ref:d,defaultValue:e})})});tt.displayName="BubbleSelect";function ot(t){const c=dt(t),e=o.useRef(""),i=o.useRef(0),l=o.useCallback(n=>{const r=e.current+n;c(r),function s(p){e.current=p,window.clearTimeout(i.current),p!==""&&(i.current=window.setTimeout(()=>s(""),1e3))}(r)},[c]),d=o.useCallback(()=>{e.current="",window.clearTimeout(i.current)},[]);return o.useEffect(()=>()=>window.clearTimeout(i.current),[]),[e,l,d]}function nt(t,c,e){const l=c.length>1&&Array.from(c).every(p=>p===c[0])?c[0]:c,d=e?t.indexOf(e):-1;let n=Ft(t,Math.max(d,0));l.length===1&&(n=n.filter(p=>p!==e));const s=n.find(p=>p.textValue.toLowerCase().startsWith(l.toLowerCase()));return s!==e?s:void 0}function Ft(t,c){return t.map((e,i)=>t[(c+i)%t.length])}var zt=Ne,qt=Ae,Yt=De,Xt=je,Zt=Le,Jt=ke,Qt=Fe,eo=Ue,to=Ge,oo=ze,no=qe,ro=Xe,so=Ze,co=Je;export{Jt as C,eo as G,Xt as I,to as L,Zt as P,zt as R,so as S,qt as T,Yt as V,Qt as a,co as b,oo as c,no as d,ro as e,xt as f,Ct as u};
|
|
2
|
+
//# sourceMappingURL=index-DFqQCjCw.js.map
|