@epic-web/workshop-app 6.47.10 → 6.47.12
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/_layout-DBBP4DOc.js +2 -0
- package/build/client/assets/_layout-DBBP4DOc.js.map +1 -0
- package/build/client/assets/{manifest-2680d130.js → manifest-22982a43.js} +1 -1
- package/build/client/assets/presence-D6KivDVU.js +27 -0
- package/build/client/assets/presence-D6KivDVU.js.map +1 -0
- package/build/client/assets/{root-8Sq6HSdp.js → root-1p9mpscc.js} +2 -2
- package/build/client/assets/{root-8Sq6HSdp.js.map → root-1p9mpscc.js.map} +1 -1
- package/build/client/assets/tailwind-RrZj7_KO.css +1 -0
- package/build/server/index.js +270 -88
- package/build/server/index.js.map +1 -1
- package/package.json +3 -3
- package/build/client/assets/_layout-BulHW5p3.js +0 -2
- package/build/client/assets/_layout-BulHW5p3.js.map +0 -1
- package/build/client/assets/presence-OxG7Cpak.js +0 -27
- package/build/client/assets/presence-OxG7Cpak.js.map +0 -1
- package/build/client/assets/tailwind-Dwn16kR6.css +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@epic-web/workshop-app",
|
|
3
|
-
"version": "6.47.
|
|
3
|
+
"version": "6.47.12",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
"@epic-web/invariant": "^1.0.0",
|
|
43
43
|
"@epic-web/remember": "^1.1.0",
|
|
44
44
|
"@epic-web/restore-scroll": "^2.0.0",
|
|
45
|
-
"@epic-web/workshop-presence": "6.47.
|
|
46
|
-
"@epic-web/workshop-utils": "6.47.
|
|
45
|
+
"@epic-web/workshop-presence": "6.47.12",
|
|
46
|
+
"@epic-web/workshop-utils": "6.47.12",
|
|
47
47
|
"@mdx-js/mdx": "^3.1.1",
|
|
48
48
|
"@mux/mux-player-react": "^3.8.0",
|
|
49
49
|
"@nasa-gcn/remix-seo": "^2.0.1",
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{w as ae,b as H,O as oe,L as c,e as G,N as v}from"./chunk-UIGDSWPH-BWkP6tD5.js";import{j as e}from"./jsx-runtime-C5WNSv3b.js";import{c as f,I as w,a as h,m as E,n as k}from"./misc-BapXpylh.js";import{r as L}from"./index-Az39ZADK.js";import{a as le}from"./pe-Bs-DFNma.js";import{L as A}from"./product-CGPgWFTC.js";import{u as ie}from"./revalidation-ws-BahUMYqf.js";import{D as ce,a as de,b as fe,c as he,d as ue,u as V}from"./presence-OxG7Cpak.js";import{S as P,T as me,a as z,b as R,c as F}from"./tooltip-C2AQeNhD.js";import{c as D,b as xe}from"./user-DtZkTMil.js";import{u as K}from"./workshop-config-DCYN9tG7.js";import{u as q}from"./online-Dw7HU4wM.js";import{b as pe,s as X,c as ge,d as be,e as Z,m as u,u as je,f as ve}from"./progress-DJ4oeyzx.js";import{T as O}from"./index-_LzGTKVC.js";import"./root-loader-C5P2c7MU.js";import"./types-Cl2NuNg4.js";import"./index-Cod-PQ6D.js";import"./index-CjiomtK6.js";function we(t){t.values.forEach(s=>s.stop())}function $(t,s){[...s].reverse().forEach(a=>{const i=t.getVariant(a);i&&X(t,i),t.variantChildren&&t.variantChildren.forEach(o=>{$(o,s)})})}function Ne(t,s){if(Array.isArray(s))return $(t,s);if(typeof s=="string")return $(t,[s]);X(t,s)}function ye(){const t=new Set,s={subscribe(n){return t.add(n),()=>void t.delete(n)},start(n,a){const i=[];return t.forEach(o=>{i.push(pe(o,n,{transitionOverride:a}))}),Promise.all(i)},set(n){return t.forEach(a=>{Ne(a,n)})},stop(){t.forEach(n=>{we(n)})},mount(){return()=>{s.stop()}}};return s}function U(){const t=ge(ye);return be(t.mount,[]),t}function ke(t,s){function n(){return window.matchMedia(t).matches}function a(i){const o=window.matchMedia(t);return o.addEventListener("change",i),()=>{o.removeEventListener("change",i)}}return function(){return L.useSyncExternalStore(a,n,()=>s)}}const B=["opacity-70","opacity-80","opacity-90","opacity-100"],Q=["shadow-[0_0_2px_0_rgba(0,0,0,0.3)]","shadow-[0_0_4px_0_rgba(0,0,0,0.3)]","shadow-[0_0_7px_0_rgba(0,0,0,0.3)]","shadow-[0_0_10px_0_rgba(0,0,0,0.3)]"];function J(t){const s=Math.round(t*B.length-1),n=Math.round(t*Q.length-1);return f("shadow-purple-700 hover:opacity-100 focus:opacity-100 dark:shadow-purple-200",B[s]??"opacity-60",Q[n]??"shadow-none",t===1?"animate-pulse hover:animate-none focus:animate-none":null)}function M({isMenuOpened:t}){const s=D(),{users:n}=V(),{product:{displayNameShort:a}}=K(),i=t?17:0,o=n.length-i,p=o>(t?1:0);if(!n.length)return null;const m=t&&n.length===1?e.jsx(c,{target:"_blank",rel:"noopener noreferrer",to:"https://www.youtube.com/watch?v=w6Q3mHyzn78",children:e.jsx("img",{alt:"Tiffany Tunes",className:f("h-8 w-8 rounded-full border object-cover",J(1)),src:"/img/tiffany.png"})}):null,d=`${o}${t?" more ":" "}${a} Dev${o===1?"":"s"} working now`;return e.jsx("div",{className:"flex flex-wrap items-center gap-2",children:e.jsxs(me,{children:[(p?n.slice(0,i):n).map(({user:r,score:N})=>{const y=J(N),x=Ee(r.location),l=r.imageUrlSmall||r.avatarUrl,g=r.hasAccess,C=r.location?.origin?.includes("localhost");let j;return g?j=C?"working":"referencing":j=C?"previewing":"reviewing",e.jsxs(z,{children:[e.jsx(R,{asChild:!0,children:l?e.jsx("img",{tabIndex:0,alt:r.name||a,className:f("h-8 w-8 rounded-full border object-cover",y),src:l}):e.jsx("div",{tabIndex:0,"aria-label":r.name||`${a} Dev`,className:f("flex h-8 w-8 items-center justify-center rounded-full border",y),children:e.jsx(w,{name:"User"})})}),e.jsx(F,{children:e.jsxs("span",{className:"flex flex-col items-center justify-center gap-1",children:[e.jsxs("span",{children:[r.name||`${a} Dev`," ",x?` is ${j} ${N===1&&s?.id!==r.id?"with you":""} on`:null]}),x?.line1?e.jsx("span",{children:x.line1}):null,x?.line2?e.jsx("span",{children:x.line2}):null]})})]},r.id)}),m,p?e.jsxs(z,{children:[e.jsx(R,{asChild:!0,children:e.jsx("div",{tabIndex:0,"aria-label":d,className:f("bg-accent text-accent-foreground flex items-center justify-center rounded-full border text-xs",t?"h-8 w-8":"h-6 w-6"),children:e.jsx("span",{className:f("pointer-events-none overflow-hidden text-center text-ellipsis whitespace-nowrap",t?"w-8":"w-6"),children:t?`+${o}`:o})})}),e.jsx(F,{children:d})]}):null]})})}const ee=ke("(min-width: 640px)",!0),Ge=ae(function(){const s=H(),n=D(),a=ee(),i=le(),[o,p]=L.useState(s.isMenuOpened);ie({watchPaths:["./exercises/README.mdx"]});function m(d){p(d),document.cookie=`es_menu_open=${d.toString()}; path=/; SameSite=Lax;`}return e.jsxs("div",{className:"flex flex-col",children:[n?null:e.jsx(Ce,{}),i&&a?null:e.jsx(Pe,{isMenuOpened:o,onMenuOpenChange:m}),e.jsxs("div",{className:f("flex grow flex-col sm:flex-row",{"h-[calc(100vh-128px-env(safe-area-inset-top)-env(safe-area-inset-bottom))] sm:h-[calc(100vh-64px-env(safe-area-inset-top)-env(safe-area-inset-bottom))]":!n,"h-[calc(100vh-64px-env(safe-area-inset-top)-env(safe-area-inset-bottom))] sm:h-[calc(100vh-env(safe-area-inset-top)-env(safe-area-inset-bottom))]":n,"h-[unset]":!a&&o}),children:[a?e.jsx(Se,{isMenuOpened:o,onMenuOpenChange:m}):null,e.jsx("div",{className:f("h-full w-full max-w-full sm:max-w-[calc(100%-56px)]",o?"hidden md:block":""),children:e.jsx(oe,{})})]})]})});function Ee(t){if(!t)return null;const{exercise:s}=t,n=[s?[s.exerciseNumber,s.stepNumber].filter(Boolean).map(a=>a.toString().padStart(2,"0")).join("/"):null,s?.type].filter(Boolean).join(" - ");return{line1:t.workshopTitle,line2:n}}function Ce(){const t=ee(),{product:{host:s,displayName:n}}=K(),a=xe(),i=e.jsx("div",{children:ENV.EPICSHOP_DEPLOYED?e.jsxs("div",{children:["This is the deployed version. ",e.jsxs(e.Fragment,{children:[e.jsx(c,{className:"underline",target:"_blank",rel:"noopener noreferrer",to:ENV.EPICSHOP_GITHUB_REPO,children:"Run locally"})," for full experience."]})," "]}):a?e.jsxs("div",{children:[e.jsx(c,{to:"/login",className:"underline",children:"Login"})," ","or"," ",e.jsx("a",{href:`https://${s}/login`,className:"underline",children:"join for free"})," ","for the full experience."]}):null});return e.jsx("div",{className:"z-10 flex h-16 items-center justify-between border-b bg-linear-to-tr from-blue-500 to-indigo-500 pl-4 text-white",children:t?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"hidden flex-1 flex-wrap items-center gap-4 sm:flex",children:[e.jsx(A,{size:"lg",style:"monochrome"}),e.jsxs("div",{className:"flex flex-1 flex-wrap items-center",children:[e.jsxs("p",{className:"mr-2",children:["Welcome to the"," ",e.jsx(c,{to:`https://${s}`,className:"underline",target:"_blank",children:n})," ","Workshop app!"]}),i]})]}),a?null:e.jsxs("div",{className:"hidden h-full flex-col items-center sm:flex md:flex-row",children:[e.jsxs(c,{to:`https://${s}`,target:"_blank",className:"flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold",children:[e.jsxs("span",{className:"drop-shadow-sm",children:["Join ",n]}),e.jsx("span",{children:"↗︎"})]}),e.jsxs(c,{to:ENV.EPICSHOP_DEPLOYED?`https://${s}/login`:"/login",className:"flex h-full items-center justify-center space-x-1.5 bg-white/20 px-5 text-sm font-semibold shadow-md transition hover:bg-white/30",children:[e.jsx(w,{name:"User",size:"lg"}),e.jsx("span",{className:"drop-shadow-sm",children:"Login"})]})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex flex-1 flex-wrap items-center gap-4 sm:hidden",children:[e.jsx("a",{href:`https://${s}`,children:e.jsx(A,{size:"lg",style:"monochrome"})}),e.jsxs(ce,{children:[e.jsx(de,{children:e.jsx(w,{name:"Question",size:"lg",className:"animate-pulse"})}),e.jsxs(fe,{children:[e.jsxs(he,{children:[e.jsx(A,{size:"lg",style:"monochrome"}),e.jsx("span",{className:"text-lg font-semibold",children:n})]}),e.jsxs(ue,{children:["Welcome to the"," ",e.jsx(c,{to:`https://${s}`,className:"underline",children:n})," ","Workshop app!"]}),i]})]})]}),a?null:e.jsxs("div",{className:"flex h-full items-center",children:[e.jsxs(c,{to:`https://${s}`,target:"_blank",className:"flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold",children:[e.jsx("span",{className:"drop-shadow-sm",children:"Join"}),e.jsx("span",{children:"↗︎"})]}),e.jsxs(c,{to:ENV.EPICSHOP_DEPLOYED?`https://${s}/login`:"/login",className:"flex h-full items-center justify-center space-x-1.5 bg-white/20 px-5 text-sm font-semibold shadow-md transition hover:bg-white/30",children:[e.jsx(w,{name:"User",size:"lg"}),e.jsx("span",{className:"drop-shadow-sm",children:"Login"})]})]})]})})}const te={hidden:{opacity:0,x:-20},visible:{opacity:1,x:0}};function ne({exerciseNumber:t,children:s}){const n=je(t);return e.jsx(u.li,{variants:te,className:f("py-[6px] first:pt-3 last:pb-3",n?`${n} before:border-t`:null),children:e.jsx("span",{className:"inline-block pl-2",children:s})})}function S({children:t,...s}){const n=ve(s);return e.jsx(u.li,{variants:te,className:f("py-[6px] first:pt-3 last:pb-3",n?`${n} before:border-t`:null),children:e.jsx("span",{className:"inline-block pl-2",children:t})})}function Pe({isMenuOpened:t,onMenuOpenChange:s}){const n=H(),a=D(),i=Z(),o=G(),p=q(),{users:m}=V(),d={visible:{opacity:1,transition:{duration:.05,when:"beforeChildren",staggerChildren:.03}},hidden:{opacity:0}};return e.jsx("nav",{className:"flex w-full border-b sm:hidden",children:e.jsx("div",{className:"w-full",children:e.jsxs("div",{className:f("flex items-center",{"flex-col":t,"h-14":!t}),children:[e.jsx(se,{title:n.workshopTitle,isMenuOpened:t,setMenuOpened:s}),t&&e.jsxs(u.div,{className:"scrollbar-thin scrollbar-thumb-scrollbar flex w-full grow flex-col justify-between overflow-x-auto p-6",initial:{opacity:0},animate:{opacity:1},children:[e.jsxs(u.ul,{variants:d,initial:"hidden",animate:"visible",className:"flex flex-col",children:[e.jsx("span",{children:e.jsx(v,{prefetch:"intent",to:"/",className:({isActive:r})=>h("relative px-2 py-0.5 pr-3 text-2xl font-bold whitespace-nowrap outline-none hover:underline focus:underline",'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":r}),children:"Home"})}),n.exercises.map(({exerciseNumber:r,title:N,steps:y})=>{const x=Number(o.exerciseNumber)===r,l=!x&&n.playground.exerciseNumber===r;return e.jsxs(ne,{exerciseNumber:r,children:[e.jsxs("span",{className:"flex items-center gap-1 text-2xl font-bold",children:[e.jsx(c,{prefetch:"intent",to:E(r),className:h("relative px-2 py-0.5 pr-3 whitespace-nowrap outline-none hover:underline focus:underline",'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":x}),children:N}),l?e.jsx(c,{to:k(n.playground.exerciseNumber,n.playground.stepNumber,n.playground.type),prefetch:"intent",children:"🛝"}):null]}),x?e.jsxs(u.ul,{variants:d,initial:"hidden",animate:"visible",className:"mt-2 ml-4 flex flex-col",children:[e.jsx(S,{type:"instructions",exerciseNumber:r,children:e.jsx(c,{to:E(r),prefetch:"intent",className:h('after:bg-background relative px-2 py-0.5 pr-3 text-xl font-medium whitespace-nowrap outline-none after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":!o.stepNumber}),children:"Intro"})},r),y.filter(Boolean).map(({stepNumber:g,title:C,problem:j,solution:_})=>e.jsx(S,{type:"step",stepNumber:g,exerciseNumber:r,children:e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsxs(c,{to:k(r,g),prefetch:"intent",className:"leading-tight font-semibold",children:[g.toString().padStart(2,"0"),"."," ",C]}),e.jsxs("div",{className:"mt-0.5 ml-3 flex gap-1",children:[j&&e.jsxs(v,{to:k(r,g,"problem"),prefetch:"intent",className:({isActive:b})=>h("relative px-2 py-0.5 pr-3 whitespace-nowrap outline-none hover:underline focus:underline",'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":b}),children:["Problem",j.name===n.playground.appName?" 🛝":""]}),_&&e.jsxs(v,{to:k(r,g,"solution"),prefetch:"intent",className:({isActive:b})=>h("relative px-2 py-0.5 pr-3 whitespace-nowrap outline-none hover:underline focus:underline",'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":b}),children:["Solution",_.name===n.playground.appName?" 🛝":""]})]})]})},g)),e.jsx(S,{type:"finished",exerciseNumber:r,children:e.jsx(v,{to:E(r,"finished"),prefetch:"intent",className:({isActive:g})=>h('after:bg-background relative px-2 py-0.5 pr-3 text-base font-medium whitespace-nowrap outline-none after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":g}),children:"📝 Elaboration"})})]}):null]},r)})]}),e.jsx("div",{className:"mt-6",children:e.jsx(v,{to:"/finished",className:({isActive:r})=>h("relative text-lg font-bold whitespace-nowrap outline-none hover:underline focus:underline",{'after:bg-background bg-black text-white after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[""]':r}),children:"📝 Workshop Feedback"})})]}),e.jsx("div",{className:"grow"}),p?null:e.jsx(P,{content:t?null:"You are offline",children:e.jsx("div",{className:f("flex h-14 animate-pulse items-center justify-start p-4",t?"w-full border-t":"border-l"),children:e.jsx(w,{name:"WifiNoConnection",className:"text-foreground-destructive",children:t?"You are offline":null})})}),e.jsx("div",{className:f("flex items-center justify-start p-4",t&&m.length>4?"min-h-14":"h-14",t?"w-full border-t":"border-l"),children:e.jsx(M,{isMenuOpened:t})}),ENV.EPICSHOP_DEPLOYED?null:a?e.jsx(P,{content:t?null:"Your account",children:e.jsxs(c,{className:f("flex h-14 shrink-0 items-center justify-start space-x-3 px-4 py-4 text-center no-underline hover:underline",{"border-l":!t,"w-full border-t":t}),to:"/account",children:[a.imageUrlSmall?e.jsx("img",{alt:a.name??a.email,src:a.imageUrlSmall,className:"h-full rounded-full"}):e.jsx(w,{name:"User",className:"shrink-0",size:"lg"}),t?e.jsx(u.div,{className:"flex items-center whitespace-nowrap",initial:{opacity:0},animate:{opacity:1},children:"Your Account"}):e.jsx("span",{className:"sr-only",children:"Your account"})]})}):null,ENV.EPICSHOP_DEPLOYED?null:a&&i?e.jsx(P,{content:t?null:"Continue to next lesson",children:e.jsxs(c,{to:i,prefetch:"intent",className:h("flex h-14 w-full items-center space-x-3 border-l px-4 py-4 pl-[18px] no-underline hover:underline"),state:{from:"continue next lesson button"},children:[e.jsx(w,{name:"FastForward",className:"shrink-0",size:"md"}),t?e.jsx(u.div,{className:"flex items-center whitespace-nowrap",initial:{opacity:0},animate:{opacity:1},children:"Continue to next lesson"}):e.jsx("span",{className:"sr-only",children:"Continue to next lesson"})]})}):null,e.jsx("div",{className:f("flex h-14 w-14 items-center justify-center self-start p-4 sm:mb-4 sm:w-full",{"w-full border-t":t,"border-l":!t}),children:e.jsx(O,{})})]})})})}const T=400;function Se({isMenuOpened:t,onMenuOpenChange:s}){const n=H(),a=D(),i=Z(),o=G(),p=q(),{users:m}=V(),d=n.exercises.find(l=>l.exerciseNumber===Number(o.exerciseNumber)),r=o.type==="solution"?d?.solutions.find(l=>l.stepNumber===Number(o.stepNumber)):o.type==="problem"?d?.problems.find(l=>l.stepNumber===Number(o.stepNumber)):null,N=U(),y={close:{width:56},open:{width:T}},x={visible:{opacity:1,transition:{duration:.05,when:"beforeChildren",staggerChildren:.03}},hidden:{opacity:0}};return e.jsx("nav",{className:"hidden border-r sm:flex",children:e.jsx(u.div,{initial:t?"open":"close",variants:y,animate:N,children:e.jsxs("div",{className:"flex h-full flex-col items-center justify-between",children:[e.jsx(se,{title:n.workshopTitle,menuControls:N,isMenuOpened:t,setMenuOpened:s}),t&&e.jsxs(u.div,{style:{width:T},className:"scrollbar-thin scrollbar-thumb-scrollbar flex grow flex-col justify-between overflow-y-auto p-6",initial:{opacity:0},animate:{opacity:1},children:[e.jsxs(u.ul,{variants:x,initial:"hidden",animate:"visible",className:"flex flex-col",children:[e.jsx("span",{children:e.jsx(v,{prefetch:"intent",to:"/",className:({isActive:l})=>h("relative px-2 py-0.5 pr-3 text-2xl font-bold whitespace-nowrap outline-none hover:underline focus:underline",'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":l}),children:"Home"})}),n.exercises.map(({exerciseNumber:l,title:g,steps:C})=>{const j=Number(o.exerciseNumber)===l,_=!j&&n.playground.exerciseNumber===l;return e.jsxs(ne,{exerciseNumber:l,children:[e.jsxs("span",{className:"flex items-center gap-1 text-2xl font-bold",children:[e.jsx(c,{prefetch:"intent",to:E(l),className:h("relative px-2 py-0.5 pr-3 whitespace-nowrap outline-none hover:underline focus:underline",'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":j}),children:g}),_?e.jsx(c,{to:k(n.playground.exerciseNumber,n.playground.stepNumber,n.playground.type),prefetch:"intent",children:"🛝"}):null]}),j?e.jsxs(u.ul,{variants:x,initial:"hidden",animate:"visible",className:"mt-2 ml-4 flex flex-col",children:[e.jsx(S,{type:"instructions",exerciseNumber:l,children:e.jsx(c,{to:E(l),prefetch:"intent",className:h('after:bg-background relative px-2 py-0.5 pr-3 text-xl font-medium whitespace-nowrap outline-none after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":!o.stepNumber}),children:"Intro"})},l),C.filter(Boolean).map(({stepNumber:b,title:re,problem:Y,solution:W})=>e.jsx(S,{type:"step",stepNumber:b,exerciseNumber:l,children:e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsxs(c,{to:k(l,b),prefetch:"intent",className:"leading-tight font-semibold",children:[b.toString().padStart(2,"0"),"."," ",re]}),e.jsxs("div",{className:"mt-0.5 ml-3 flex gap-1",children:[Y&&e.jsxs(v,{to:k(l,b,"problem"),prefetch:"intent",className:({isActive:I})=>h("relative px-2 py-0.5 pr-3 whitespace-nowrap outline-none hover:underline focus:underline",'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":I}),children:["Problem",Y.name===n.playground.appName?" 🛝":""]}),W&&e.jsxs(v,{to:k(l,b,"solution"),prefetch:"intent",className:({isActive:I})=>h("relative px-2 py-0.5 pr-3 whitespace-nowrap outline-none hover:underline focus:underline",'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":I}),children:["Solution",W.name===n.playground.appName?" 🛝":""]})]})]})},b)),e.jsx(S,{type:"finished",exerciseNumber:l,children:e.jsx(v,{to:E(l,"finished"),prefetch:"intent",className:({isActive:b})=>h('after:bg-background relative px-2 py-0.5 pr-3 text-base font-medium whitespace-nowrap outline-none after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":b}),children:"📝 Elaboration"})})]}):null]},l)})]}),e.jsx("div",{className:"mt-6",children:e.jsx(v,{to:"/finished",className:({isActive:l})=>h("relative text-lg font-bold whitespace-nowrap outline-none hover:underline focus:underline",{'after:bg-background bg-black text-white after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[""]':l}),children:"📝 Workshop Feedback"})})]}),!t&&e.jsx("div",{className:"flex grow flex-col justify-center",children:e.jsxs("div",{className:"orientation-sideways w-full font-mono text-sm leading-none font-medium uppercase",children:[d?.title?e.jsx(c,{to:E(Number(o.exerciseNumber)),children:d.title}):null,d?.title&&r?.title?" — ":null,r?.title?e.jsx(c,{to:k(Number(o.exerciseNumber),r.stepNumber),children:r.title}):null]})}),p?null:e.jsx(P,{content:t?null:"You are offline",children:e.jsx("div",{className:f("flex w-full animate-pulse items-center border-t p-4",t?"justify-start":"justify-center"),children:e.jsx(w,{name:"WifiNoConnection",className:"text-foreground-destructive",children:t?e.jsx("span",{className:"whitespace-nowrap",children:"You are offline"}):null})})}),e.jsx("div",{className:f("flex w-full items-center justify-start border-t p-4 transition-[height]",t&&m.length>4?"h-28":"h-14"),style:t?{width:T}:{},children:e.jsx(M,{isMenuOpened:t})}),ENV.EPICSHOP_DEPLOYED?null:a?e.jsx(P,{content:t?null:"Your account",children:e.jsxs(c,{className:"flex h-14 w-full shrink-0 items-center justify-start space-x-3 border-t px-4 py-4 text-center no-underline hover:underline",to:"/account",children:[a.imageUrlSmall?e.jsx("img",{alt:a.name??a.email,src:a.imageUrlSmall,className:"h-full rounded-full"}):e.jsx(w,{name:"User",className:"shrink-0",size:"lg"}),t?e.jsx(u.div,{className:"flex items-center whitespace-nowrap",initial:{opacity:0},animate:{opacity:1},children:"Your Account"}):e.jsx("span",{className:"sr-only",children:"Your account"})]})}):null,ENV.EPICSHOP_DEPLOYED?null:a&&i?e.jsx(P,{content:t?null:"Continue to next lesson",children:e.jsxs(c,{to:i,prefetch:"intent",className:h("flex h-14 w-full items-center space-x-3 border-t px-4 py-4 pl-[18px] no-underline hover:underline"),state:{from:"continue next lesson button"},children:[e.jsx(w,{name:"FastForward",className:"shrink-0",size:"md"}),t?e.jsx(u.div,{className:"flex items-center whitespace-nowrap",initial:{opacity:0},animate:{opacity:1},children:"Continue to next lesson"}):e.jsx("span",{className:"sr-only",children:"Continue to next lesson"})]})}):null,e.jsx("div",{className:"mb-4 w-full self-start border-t pt-[15px] pl-3",children:e.jsx(O,{})})]})})})}function se({title:t,isMenuOpened:s,setMenuOpened:n,menuControls:a}){const i=L.useRef(s),o=L.useRef(null),p={open:{d:"M3.06061 2.99999L21.0606 21"},closed:{d:"M0 9.5L24 9.5"}},m={open:{d:"M3.00006 21.0607L21 3.06064"},moving:{d:"M0 14.5L24 14.5"},closed:{d:"M0 14.5L15 14.5"}},d=U(),r=U();async function N(){a?.start(s?"close":"open"),n(!s),s?(d.start(p.closed),await r.start(m.moving),r.start(m.closed)):(await r.start(m.moving),d.start(p.open),r.start(m.open))}return L.useEffect(()=>{if(!s)return;function y(x){x.key==="Escape"&&o.current?.click()}return document.addEventListener("keyup",y),()=>document.removeEventListener("keyup",y)},[s]),e.jsxs("div",{className:f("relative inline-flex h-14 shrink-0 items-center justify-between overflow-hidden border-r sm:w-full sm:border-r-0 sm:border-b",{"w-full":s}),children:[e.jsx("button",{ref:o,className:"flex h-14 w-14 items-center justify-center","aria-label":"Open Navigation menu",onClick:N,children:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",children:[e.jsx(u.path,{...p[i.current?"open":"closed"],animate:d,transition:{duration:.2},stroke:"currentColor",strokeWidth:1.5}),e.jsx(u.path,{...m[i.current?"open":"closed"],animate:r,transition:{duration:.2},stroke:"currentColor",strokeWidth:1.5})]})}),s&&e.jsx(u.p,{transition:{delay:.2},initial:{opacity:0,y:5},animate:{opacity:1,y:0},className:"absolute right-5 font-mono text-sm whitespace-nowrap uppercase",children:e.jsx(c,{to:"/",children:t})})]})}export{Ge as default};
|
|
2
|
-
//# sourceMappingURL=_layout-BulHW5p3.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_layout-BulHW5p3.js","sources":["../../../../../node_modules/framer-motion/dist/es/animation/hooks/animation-controls.mjs","../../../../../node_modules/framer-motion/dist/es/animation/hooks/use-animation.mjs","../../../app/components/media-query.ts","../../../app/routes/_app+/_layout.tsx"],"sourcesContent":["import { invariant } from 'motion-utils';\nimport { setTarget } from '../../render/utils/setters.mjs';\nimport { animateVisualElement } from '../interfaces/visual-element.mjs';\n\nfunction stopAnimation(visualElement) {\n visualElement.values.forEach((value) => value.stop());\n}\nfunction setVariants(visualElement, variantLabels) {\n const reversedLabels = [...variantLabels].reverse();\n reversedLabels.forEach((key) => {\n const variant = visualElement.getVariant(key);\n variant && setTarget(visualElement, variant);\n if (visualElement.variantChildren) {\n visualElement.variantChildren.forEach((child) => {\n setVariants(child, variantLabels);\n });\n }\n });\n}\nfunction setValues(visualElement, definition) {\n if (Array.isArray(definition)) {\n return setVariants(visualElement, definition);\n }\n else if (typeof definition === \"string\") {\n return setVariants(visualElement, [definition]);\n }\n else {\n setTarget(visualElement, definition);\n }\n}\n/**\n * @public\n */\nfunction animationControls() {\n /**\n * Track whether the host component has mounted.\n */\n let hasMounted = false;\n /**\n * A collection of linked component animation controls.\n */\n const subscribers = new Set();\n const controls = {\n subscribe(visualElement) {\n subscribers.add(visualElement);\n return () => void subscribers.delete(visualElement);\n },\n start(definition, transitionOverride) {\n invariant(hasMounted, \"controls.start() should only be called after a component has mounted. Consider calling within a useEffect hook.\");\n const animations = [];\n subscribers.forEach((visualElement) => {\n animations.push(animateVisualElement(visualElement, definition, {\n transitionOverride,\n }));\n });\n return Promise.all(animations);\n },\n set(definition) {\n invariant(hasMounted, \"controls.set() should only be called after a component has mounted. Consider calling within a useEffect hook.\");\n return subscribers.forEach((visualElement) => {\n setValues(visualElement, definition);\n });\n },\n stop() {\n subscribers.forEach((visualElement) => {\n stopAnimation(visualElement);\n });\n },\n mount() {\n hasMounted = true;\n return () => {\n hasMounted = false;\n controls.stop();\n };\n },\n };\n return controls;\n}\n\nexport { animationControls, setValues };\n","\"use client\";\nimport { useConstant } from '../../utils/use-constant.mjs';\nimport { useIsomorphicLayoutEffect } from '../../utils/use-isomorphic-effect.mjs';\nimport { animationControls } from './animation-controls.mjs';\n\n/**\n * Creates `LegacyAnimationControls`, which can be used to manually start, stop\n * and sequence animations on one or more components.\n *\n * The returned `LegacyAnimationControls` should be passed to the `animate` property\n * of the components you want to animate.\n *\n * These components can then be animated with the `start` method.\n *\n * ```jsx\n * import * as React from 'react'\n * import { motion, useAnimation } from 'framer-motion'\n *\n * export function MyComponent(props) {\n * const controls = useAnimation()\n *\n * controls.start({\n * x: 100,\n * transition: { duration: 0.5 },\n * })\n *\n * return <motion.div animate={controls} />\n * }\n * ```\n *\n * @returns Animation controller with `start` and `stop` methods\n *\n * @public\n */\nfunction useAnimationControls() {\n const controls = useConstant(animationControls);\n useIsomorphicLayoutEffect(controls.mount, []);\n return controls;\n}\nconst useAnimation = useAnimationControls;\n\nexport { useAnimation, useAnimationControls };\n","import { useSyncExternalStore } from 'react'\n\nexport function makeMediaQueryStore(\n\tmediaQuery: string,\n\tserverSnapshot: boolean,\n) {\n\tfunction getSnapshot() {\n\t\treturn window.matchMedia(mediaQuery).matches\n\t}\n\n\tfunction subscribe(callback: () => void) {\n\t\tconst mediaQueryList = window.matchMedia(mediaQuery)\n\t\tmediaQueryList.addEventListener('change', callback)\n\t\treturn () => {\n\t\t\tmediaQueryList.removeEventListener('change', callback)\n\t\t}\n\t}\n\n\treturn function useMediaQuery() {\n\t\treturn useSyncExternalStore(subscribe, getSnapshot, () => serverSnapshot)\n\t}\n}\n","import {\n\textractNumbersAndTypeFromAppNameOrPath,\n\tgetExercises,\n\tgetPlaygroundAppName,\n} from '@epic-web/workshop-utils/apps.server'\nimport { getWorkshopConfig } from '@epic-web/workshop-utils/config.server'\nimport {\n\tcombineServerTimings,\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport { clsx } from 'clsx'\nimport { motion, useAnimationControls } from 'framer-motion'\nimport * as React from 'react'\nimport {\n\tLink,\n\tNavLink,\n\tOutlet,\n\tuseLoaderData,\n\tuseParams,\n\tdata,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n} from 'react-router'\nimport { useHydrated } from 'remix-utils/use-hydrated'\nimport { Icon } from '#app/components/icons.tsx'\nimport { makeMediaQueryStore } from '#app/components/media-query.ts'\nimport { Logo } from '#app/components/product.tsx'\nimport { useRevalidationWS } from '#app/components/revalidation-ws.tsx'\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogHeader,\n\tDialogTrigger,\n} from '#app/components/ui/dialog.tsx'\nimport {\n\tSimpleTooltip,\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from '#app/components/ui/tooltip.tsx'\nimport { useOptionalUser, useUserHasAccess } from '#app/components/user.tsx'\nimport { useWorkshopConfig } from '#app/components/workshop-config.tsx'\nimport { cn, getExercisePath, getExerciseStepPath } from '#app/utils/misc.tsx'\nimport { useIsOnline } from '#app/utils/online.ts'\nimport { usePresence, type User } from '#app/utils/presence.tsx'\nimport {\n\tuseExerciseProgressClassName,\n\tuseNextExerciseRoute,\n\tuseProgressItemClassName,\n\ttype ProgressItemSearch,\n} from '../progress.tsx'\nimport { ThemeSwitch } from '../theme/index.tsx'\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('appLayoutLoader')\n\tconst { title: workshopTitle } = getWorkshopConfig()\n\tconst [exercises, playgroundAppName] = await Promise.all([\n\t\tgetExercises({ request, timings }),\n\t\tgetPlaygroundAppName(),\n\t])\n\n\tconst playgroundNumbersAndType = extractNumbersAndTypeFromAppNameOrPath(\n\t\tplaygroundAppName ?? '',\n\t)\n\tconst playground = {\n\t\tappName: playgroundAppName,\n\t\texerciseNumber: Number(playgroundNumbersAndType?.exerciseNumber),\n\t\tstepNumber: Number(playgroundNumbersAndType?.stepNumber),\n\t\ttype: playgroundNumbersAndType?.type,\n\t}\n\n\tconst result = data(\n\t\t{\n\t\t\tworkshopTitle,\n\t\t\texercises: exercises.map((e) => ({\n\t\t\t\texerciseNumber: e.exerciseNumber,\n\t\t\t\ttitle: e.title,\n\t\t\t\tsolutions: e.solutions.map(({ stepNumber, title, name }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle,\n\t\t\t\t\tname,\n\t\t\t\t})),\n\t\t\t\tproblems: e.problems.map(({ stepNumber, title, name }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle,\n\t\t\t\t\tname,\n\t\t\t\t})),\n\t\t\t\tsteps: e.steps.map(({ stepNumber, problem, solution }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle: problem?.title ?? solution?.title ?? 'Unknown',\n\t\t\t\t\tname: problem?.name ?? solution?.name ?? 'Unknown',\n\t\t\t\t\tproblem: problem\n\t\t\t\t\t\t? { name: problem.name, title: problem.title }\n\t\t\t\t\t\t: null,\n\t\t\t\t\tsolution: solution\n\t\t\t\t\t\t? { name: solution.name, title: solution.title }\n\t\t\t\t\t\t: null,\n\t\t\t\t})),\n\t\t\t})),\n\t\t\tplayground,\n\t\t\tisMenuOpened:\n\t\t\t\trequest.headers.get('cookie')?.includes('es_menu_open=true') ?? false,\n\t\t},\n\t\t{\n\t\t\theaders: {\n\t\t\t\tVary: 'Cookie',\n\t\t\t\t'Server-Timing': getServerTimeHeader(timings),\n\t\t\t},\n\t\t},\n\t)\n\treturn result\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders, parentHeaders }) => {\n\tconst headers = {\n\t\t'Cache-Control': loaderHeaders.get('Cache-Control') ?? '',\n\t\tVary: 'Cookie',\n\t\t'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nconst opacities = ['opacity-70', 'opacity-80', 'opacity-90', 'opacity-100']\nconst shadows = [\n\t'shadow-[0_0_2px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_4px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_7px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_10px_0_rgba(0,0,0,0.3)]',\n]\nfunction getScoreClassNames(score: number) {\n\tconst opacityNumber = Math.round(score * opacities.length - 1)\n\tconst shadowNumber = Math.round(score * shadows.length - 1)\n\treturn cn(\n\t\t'shadow-purple-700 hover:opacity-100 focus:opacity-100 dark:shadow-purple-200',\n\t\topacities[opacityNumber] ?? 'opacity-60',\n\t\tshadows[shadowNumber] ?? 'shadow-none',\n\t\tscore === 1 ? 'animate-pulse hover:animate-none focus:animate-none' : null,\n\t)\n}\n\nfunction FacePile({ isMenuOpened }: { isMenuOpened: boolean }) {\n\tconst loggedInUser = useOptionalUser()\n\tconst { users } = usePresence()\n\tconst {\n\t\tproduct: { displayNameShort },\n\t} = useWorkshopConfig()\n\tconst limit = isMenuOpened ? 17 : 0\n\tconst numberOverLimit = users.length - limit\n\tconst shouldShowNumberOverLimit = numberOverLimit > (isMenuOpened ? 1 : 0)\n\n\tif (!users.length) return null\n\n\tconst tiffany =\n\t\tisMenuOpened && users.length === 1 ? (\n\t\t\t<Link\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\tto=\"https://www.youtube.com/watch?v=w6Q3mHyzn78\"\n\t\t\t>\n\t\t\t\t<img\n\t\t\t\t\talt=\"Tiffany Tunes\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'h-8 w-8 rounded-full border object-cover',\n\t\t\t\t\t\tgetScoreClassNames(1),\n\t\t\t\t\t)}\n\t\t\t\t\tsrc=\"/img/tiffany.png\"\n\t\t\t\t/>\n\t\t\t</Link>\n\t\t) : null\n\tconst overLimitLabel = `${numberOverLimit}${\n\t\tisMenuOpened ? ' more ' : ' '\n\t}${displayNameShort} Dev${numberOverLimit === 1 ? '' : 's'} working now`\n\treturn (\n\t\t<div className=\"flex flex-wrap items-center gap-2\">\n\t\t\t<TooltipProvider>\n\t\t\t\t{(shouldShowNumberOverLimit ? users.slice(0, limit) : users).map(\n\t\t\t\t\t({ user, score }) => {\n\t\t\t\t\t\tconst scoreClassNames = getScoreClassNames(score)\n\t\t\t\t\t\tconst locationLabel = getLocationLabel(user.location)\n\t\t\t\t\t\tconst imageUrl = user.imageUrlSmall || user.avatarUrl\n\t\t\t\t\t\tconst hasAccess = user.hasAccess\n\t\t\t\t\t\tconst local = user.location?.origin?.includes('localhost')\n\n\t\t\t\t\t\tlet doingLabel: string\n\t\t\t\t\t\tif (hasAccess) {\n\t\t\t\t\t\t\tdoingLabel = local ? 'working' : 'referencing'\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdoingLabel = local ? 'previewing' : 'reviewing'\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Tooltip key={user.id}>\n\t\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t\t{imageUrl ? (\n\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\t\t\t\talt={user.name || displayNameShort}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'h-8 w-8 rounded-full border object-cover',\n\t\t\t\t\t\t\t\t\t\t\t\tscoreClassNames,\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\tsrc={imageUrl}\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<div\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\t\t\t\taria-label={user.name || `${displayNameShort} Dev`}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'flex h-8 w-8 items-center justify-center rounded-full border',\n\t\t\t\t\t\t\t\t\t\t\t\tscoreClassNames,\n\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\t\t<Icon name=\"User\" />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t\t\t<span className=\"flex flex-col items-center justify-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t{user.name || `${displayNameShort} Dev`}{' '}\n\t\t\t\t\t\t\t\t\t\t\t{locationLabel\n\t\t\t\t\t\t\t\t\t\t\t\t? ` is ${doingLabel} ${\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tscore === 1 && loggedInUser?.id !== user.id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'with you'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t\t\t\t\t\t\t\t} on`\n\t\t\t\t\t\t\t\t\t\t\t\t: null}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t{locationLabel?.line1 ? (\n\t\t\t\t\t\t\t\t\t\t\t<span>{locationLabel.line1}</span>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t{locationLabel?.line2 ? (\n\t\t\t\t\t\t\t\t\t\t\t<span>{locationLabel.line2}</span>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t)}\n\t\t\t\t{tiffany}\n\t\t\t\t{shouldShowNumberOverLimit ? (\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\taria-label={overLimitLabel}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'bg-accent text-accent-foreground flex items-center justify-center rounded-full border text-xs',\n\t\t\t\t\t\t\t\t\tisMenuOpened ? 'h-8 w-8' : 'h-6 w-6',\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<span\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'pointer-events-none overflow-hidden text-center text-ellipsis whitespace-nowrap',\n\t\t\t\t\t\t\t\t\t\tisMenuOpened ? 'w-8' : 'w-6',\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\t{isMenuOpened ? `+${numberOverLimit}` : numberOverLimit}\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</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>{overLimitLabel}</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t) : null}\n\t\t\t</TooltipProvider>\n\t\t</div>\n\t)\n}\n\nconst useIsWide = makeMediaQueryStore('(min-width: 640px)', true)\n\nexport default function App() {\n\tconst data = useLoaderData<typeof loader>()\n\tconst user = useOptionalUser()\n\tconst isWide = useIsWide()\n\tconst isHydrated = useHydrated()\n\n\tconst [isMenuOpened, setMenuOpenedState] = React.useState(data.isMenuOpened)\n\tuseRevalidationWS({ watchPaths: ['./exercises/README.mdx'] })\n\n\tfunction setMenuOpened(value: boolean) {\n\t\tsetMenuOpenedState(value)\n\t\tdocument.cookie = `es_menu_open=${value.toString()}; path=/; SameSite=Lax;`\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col\">\n\t\t\t{user ? null : <NoUserBanner />}\n\t\t\t{/*\n\t\t\t\tthis isn't placed in a conditional with isWide because the server render\n\t\t\t\tdoesn't know whether it should be around or not so we just use CSS to hide it\n\t\t\t\tif it's not supposed to show up.\n\n\t\t\t\tWe don't just use media queries for the wider screen nav because we want\n\t\t\t\tto avoid running all the logic in there unnecessarily.\n\t\t\t*/}\n\t\t\t{isHydrated && isWide ? null : (\n\t\t\t\t<MobileNavigation\n\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\tonMenuOpenChange={setMenuOpened}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<div\n\t\t\t\t// this nonsense is here because we want the panels to be scrollable rather\n\t\t\t\t// than having the entire page be scrollable (at least on wider screens)\n\t\t\t\tclassName={cn('flex grow flex-col sm:flex-row', {\n\t\t\t\t\t'h-[calc(100vh-128px-env(safe-area-inset-top)-env(safe-area-inset-bottom))] sm:h-[calc(100vh-64px-env(safe-area-inset-top)-env(safe-area-inset-bottom))]':\n\t\t\t\t\t\t!user,\n\t\t\t\t\t'h-[calc(100vh-64px-env(safe-area-inset-top)-env(safe-area-inset-bottom))] sm:h-[calc(100vh-env(safe-area-inset-top)-env(safe-area-inset-bottom))]':\n\t\t\t\t\t\tuser,\n\t\t\t\t\t'h-[unset]': !isWide && isMenuOpened,\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t{isWide ? (\n\t\t\t\t\t<Navigation\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tonMenuOpenChange={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'h-full w-full max-w-full sm:max-w-[calc(100%-56px)]',\n\t\t\t\t\t\tisMenuOpened ? 'hidden md:block' : '',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Outlet />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction getLocationLabel(location: User['location']) {\n\tif (!location) return null\n\n\tconst { exercise } = location\n\n\tconst exercisePortion = [\n\t\texercise\n\t\t\t? [exercise.exerciseNumber, exercise.stepNumber]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.map((s) => s.toString().padStart(2, '0'))\n\t\t\t\t\t.join('/')\n\t\t\t: null,\n\t\texercise?.type,\n\t]\n\t\t.filter(Boolean)\n\t\t.join(' - ')\n\treturn { line1: location.workshopTitle, line2: exercisePortion }\n}\n\nfunction NoUserBanner() {\n\tconst isWide = useIsWide()\n\tconst {\n\t\tproduct: { host, displayName },\n\t} = useWorkshopConfig()\n\tconst userHasAccess = useUserHasAccess()\n\tconst details = (\n\t\t<div>\n\t\t\t{ENV.EPICSHOP_DEPLOYED ? (\n\t\t\t\t<div>\n\t\t\t\t\t{`This is the deployed version. `}\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tto={ENV.EPICSHOP_GITHUB_REPO}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tRun locally\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t{` for full experience.`}\n\t\t\t\t\t</>{' '}\n\t\t\t\t</div>\n\t\t\t) : userHasAccess ? (\n\t\t\t\t<div>\n\t\t\t\t\t<Link to=\"/login\" className=\"underline\">\n\t\t\t\t\t\tLogin\n\t\t\t\t\t</Link>{' '}\n\t\t\t\t\tor{' '}\n\t\t\t\t\t<a href={`https://${host}/login`} className=\"underline\">\n\t\t\t\t\t\tjoin for free\n\t\t\t\t\t</a>{' '}\n\t\t\t\t\tfor the full experience.\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</div>\n\t)\n\treturn (\n\t\t<div className=\"z-10 flex h-16 items-center justify-between border-b bg-linear-to-tr from-blue-500 to-indigo-500 pl-4 text-white\">\n\t\t\t{isWide ? (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"hidden flex-1 flex-wrap items-center gap-4 sm:flex\">\n\t\t\t\t\t\t<Logo size=\"lg\" style=\"monochrome\" />\n\t\t\t\t\t\t<div className=\"flex flex-1 flex-wrap items-center\">\n\t\t\t\t\t\t\t<p className=\"mr-2\">\n\t\t\t\t\t\t\t\tWelcome to the{' '}\n\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\tto={`https://${host}`}\n\t\t\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t</Link>{' '}\n\t\t\t\t\t\t\t\tWorkshop app!\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t{details}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t{userHasAccess ? null : (\n\t\t\t\t\t\t<div className=\"hidden h-full flex-col items-center sm:flex md:flex-row\">\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={`https://${host}`}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Join {displayName}</span>\n\t\t\t\t\t\t\t\t<span>↗︎</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={ENV.EPICSHOP_DEPLOYED ? `https://${host}/login` : '/login'}\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 bg-white/20 px-5 text-sm font-semibold shadow-md transition hover:bg-white/30\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"User\" size=\"lg\" />\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Login</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"flex flex-1 flex-wrap items-center gap-4 sm:hidden\">\n\t\t\t\t\t\t<a href={`https://${host}`}>\n\t\t\t\t\t\t\t<Logo size=\"lg\" style=\"monochrome\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<Dialog>\n\t\t\t\t\t\t\t<DialogTrigger>\n\t\t\t\t\t\t\t\t<Icon name=\"Question\" size=\"lg\" className=\"animate-pulse\" />\n\t\t\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t\t\t<DialogContent>\n\t\t\t\t\t\t\t\t<DialogHeader>\n\t\t\t\t\t\t\t\t\t<Logo size=\"lg\" style=\"monochrome\" />\n\t\t\t\t\t\t\t\t\t<span className=\"text-lg font-semibold\">{displayName}</span>\n\t\t\t\t\t\t\t\t</DialogHeader>\n\t\t\t\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\t\t\t\tWelcome to the{' '}\n\t\t\t\t\t\t\t\t\t<Link to={`https://${host}`} className=\"underline\">\n\t\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t\t</Link>{' '}\n\t\t\t\t\t\t\t\t\tWorkshop app!\n\t\t\t\t\t\t\t\t</DialogDescription>\n\t\t\t\t\t\t\t\t{details}\n\t\t\t\t\t\t\t</DialogContent>\n\t\t\t\t\t\t</Dialog>\n\t\t\t\t\t</div>\n\t\t\t\t\t{userHasAccess ? null : (\n\t\t\t\t\t\t<div className=\"flex h-full items-center\">\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={`https://${host}`}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Join</span>\n\t\t\t\t\t\t\t\t<span>↗︎</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={ENV.EPICSHOP_DEPLOYED ? `https://${host}/login` : '/login'}\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 bg-white/20 px-5 text-sm font-semibold shadow-md transition hover:bg-white/30\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"User\" size=\"lg\" />\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Login</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\nconst itemVariants = {\n\thidden: { opacity: 0, x: -20 },\n\tvisible: { opacity: 1, x: 0 },\n}\nfunction NavigationExerciseListItem({\n\texerciseNumber,\n\tchildren,\n}: {\n\texerciseNumber: number\n\tchildren: React.ReactNode\n}) {\n\tconst progressClassName = useExerciseProgressClassName(exerciseNumber)\n\treturn (\n\t\t<motion.li\n\t\t\tvariants={itemVariants}\n\t\t\tclassName={cn(\n\t\t\t\t// add gap of 3 to children, but using padding so the progress extends through the whole height\n\t\t\t\t'py-[6px] first:pt-3 last:pb-3',\n\t\t\t\tprogressClassName ? `${progressClassName} before:border-t` : null,\n\t\t\t)}\n\t\t>\n\t\t\t<span className=\"inline-block pl-2\">{children}</span>\n\t\t</motion.li>\n\t)\n}\n\nfunction NavigationExerciseStepListItem({\n\tchildren,\n\t...progressItemSearch\n}: {\n\tchildren: React.ReactNode\n} & ProgressItemSearch) {\n\tconst progressClassName = useProgressItemClassName(progressItemSearch)\n\treturn (\n\t\t<motion.li\n\t\t\tvariants={itemVariants}\n\t\t\tclassName={cn(\n\t\t\t\t// add gap of 3 to children, but using padding so the progress extends through the whole height\n\t\t\t\t'py-[6px] first:pt-3 last:pb-3',\n\t\t\t\tprogressClassName ? `${progressClassName} before:border-t` : null,\n\t\t\t)}\n\t\t>\n\t\t\t<span className=\"inline-block pl-2\">{children}</span>\n\t\t</motion.li>\n\t)\n}\n\nfunction MobileNavigation({\n\tisMenuOpened,\n\tonMenuOpenChange: setMenuOpened,\n}: {\n\tisMenuOpened: boolean\n\tonMenuOpenChange: (change: boolean) => void\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tconst user = useOptionalUser()\n\tconst nextExerciseRoute = useNextExerciseRoute()\n\tconst params = useParams()\n\tconst isOnline = useIsOnline()\n\tconst { users } = usePresence()\n\n\t// items\n\tconst listVariants = {\n\t\tvisible: {\n\t\t\topacity: 1,\n\t\t\ttransition: {\n\t\t\t\tduration: 0.05,\n\t\t\t\twhen: 'beforeChildren',\n\t\t\t\tstaggerChildren: 0.03,\n\t\t\t},\n\t\t},\n\t\thidden: {\n\t\t\topacity: 0,\n\t\t},\n\t}\n\n\treturn (\n\t\t<nav className=\"flex w-full border-b sm:hidden\">\n\t\t\t<div className=\"w-full\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn('flex items-center', {\n\t\t\t\t\t\t'flex-col': isMenuOpened,\n\t\t\t\t\t\t'h-14': !isMenuOpened,\n\t\t\t\t\t})}\n\t\t\t\t>\n\t\t\t\t\t<NavToggle\n\t\t\t\t\t\ttitle={data.workshopTitle}\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tsetMenuOpened={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t\t{isMenuOpened && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tclassName=\"scrollbar-thin scrollbar-thumb-scrollbar flex w-full grow flex-col justify-between overflow-x-auto p-6\"\n\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\tclassName=\"flex flex-col\"\n\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\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\tto=\"/\"\n\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t'relative px-2 py-0.5 pr-3 text-2xl font-bold whitespace-nowrap outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\n\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\tHome\n\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{data.exercises.map(({ exerciseNumber, title, steps }) => {\n\t\t\t\t\t\t\t\t\tconst isActive =\n\t\t\t\t\t\t\t\t\t\tNumber(params.exerciseNumber) === exerciseNumber\n\t\t\t\t\t\t\t\t\tconst showPlayground =\n\t\t\t\t\t\t\t\t\t\t!isActive &&\n\t\t\t\t\t\t\t\t\t\tdata.playground.exerciseNumber === exerciseNumber\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<NavigationExerciseListItem\n\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\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=\"flex items-center gap-1 text-2xl font-bold\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative px-2 py-0.5 pr-3 whitespace-nowrap outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t{showPlayground ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.exerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.stepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.type,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t🛝\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t) : null}\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{isActive ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"mt-2 ml-4 flex flex-col\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"instructions\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background relative px-2 py-0.5 pr-3 text-xl font-medium whitespace-nowrap outline-none after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t!params.stepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tIntro\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{steps\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.map(({ stepNumber, title, problem, solution }) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"step\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col gap-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"leading-tight font-semibold\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{stepNumber.toString().padStart(2, '0')}.{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"mt-0.5 ml-3 flex gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'problem',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative px-2 py-0.5 pr-3 whitespace-nowrap outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProblem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'solution',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative px-2 py-0.5 pr-3 whitespace-nowrap outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSolution\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"finished\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber, 'finished')}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background relative px-2 py-0.5 pr-3 text-base font-medium whitespace-nowrap outline-none after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background': isActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t📝 Elaboration\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</NavigationExerciseListItem>\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</motion.ul>\n\t\t\t\t\t\t\t<div className=\"mt-6\">\n\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\tto=\"/finished\"\n\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t'relative text-lg font-bold whitespace-nowrap outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background bg-black text-white after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"]':\n\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\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>\n\t\t\t\t\t\t\t\t\t📝 Workshop Feedback\n\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"grow\" />\n\t\t\t\t\t{isOnline ? null : (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'You are offline'}>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex h-14 animate-pulse items-center justify-start p-4',\n\t\t\t\t\t\t\t\t\tisMenuOpened ? 'w-full border-t' : 'border-l',\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<Icon\n\t\t\t\t\t\t\t\t\tname=\"WifiNoConnection\"\n\t\t\t\t\t\t\t\t\tclassName=\"text-foreground-destructive\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{isMenuOpened ? 'You are offline' : null}\n\t\t\t\t\t\t\t\t</Icon>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t)}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex items-center justify-start p-4',\n\t\t\t\t\t\t\tisMenuOpened && users.length > 4 ? 'min-h-14' : 'h-14',\n\t\t\t\t\t\t\tisMenuOpened ? 'w-full border-t' : 'border-l',\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<FacePile isMenuOpened={isMenuOpened} />\n\t\t\t\t\t</div>\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user ? (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'Your account'}>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex h-14 shrink-0 items-center justify-start space-x-3 px-4 py-4 text-center no-underline hover:underline',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t'border-l': !isMenuOpened,\n\t\t\t\t\t\t\t\t\t\t'w-full border-t': isMenuOpened,\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\tto=\"/account\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{user.imageUrlSmall ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\talt={user.name ?? user.email}\n\t\t\t\t\t\t\t\t\t\tsrc={user.imageUrlSmall}\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-full rounded-full\"\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\t<Icon name=\"User\" className=\"shrink-0\" size=\"lg\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tYour Account\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Your account</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user && nextExerciseRoute ? (\n\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\tcontent={isMenuOpened ? null : 'Continue to next lesson'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={nextExerciseRoute}\n\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'flex h-14 w-full items-center space-x-3 border-l px-4 py-4 pl-[18px] no-underline hover:underline',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstate={{ from: 'continue next lesson button' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"FastForward\" className=\"shrink-0\" size=\"md\" />\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tContinue to next lesson\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Continue to next lesson</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex h-14 w-14 items-center justify-center self-start p-4 sm:mb-4 sm:w-full',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t'w-full border-t': isMenuOpened,\n\t\t\t\t\t\t\t\t'border-l': !isMenuOpened,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ThemeSwitch />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</nav>\n\t)\n}\n\nconst OPENED_MENU_WIDTH = 400\n\nfunction Navigation({\n\tisMenuOpened,\n\tonMenuOpenChange: setMenuOpened,\n}: {\n\tisMenuOpened: boolean\n\tonMenuOpenChange: (change: boolean) => void\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tconst user = useOptionalUser()\n\tconst nextExerciseRoute = useNextExerciseRoute()\n\tconst params = useParams()\n\tconst isOnline = useIsOnline()\n\tconst { users } = usePresence()\n\n\tconst exercise = data.exercises.find(\n\t\t(e) => e.exerciseNumber === Number(params.exerciseNumber),\n\t)\n\tconst app =\n\t\tparams.type === 'solution'\n\t\t\t? exercise?.solutions.find(\n\t\t\t\t\t(s) => s.stepNumber === Number(params.stepNumber),\n\t\t\t\t)\n\t\t\t: params.type === 'problem'\n\t\t\t\t? exercise?.problems.find(\n\t\t\t\t\t\t(p) => p.stepNumber === Number(params.stepNumber),\n\t\t\t\t\t)\n\t\t\t\t: null\n\n\t// container\n\tconst menuControls = useAnimationControls()\n\tconst menuVariants = {\n\t\tclose: { width: 56 },\n\t\topen: { width: OPENED_MENU_WIDTH },\n\t}\n\n\t// items\n\tconst listVariants = {\n\t\tvisible: {\n\t\t\topacity: 1,\n\t\t\ttransition: {\n\t\t\t\tduration: 0.05,\n\t\t\t\twhen: 'beforeChildren',\n\t\t\t\tstaggerChildren: 0.03,\n\t\t\t},\n\t\t},\n\t\thidden: {\n\t\t\topacity: 0,\n\t\t},\n\t}\n\n\treturn (\n\t\t<nav className=\"hidden border-r sm:flex\">\n\t\t\t<motion.div\n\t\t\t\tinitial={isMenuOpened ? 'open' : 'close'}\n\t\t\t\tvariants={menuVariants}\n\t\t\t\tanimate={menuControls}\n\t\t\t>\n\t\t\t\t<div className=\"flex h-full flex-col items-center justify-between\">\n\t\t\t\t\t<NavToggle\n\t\t\t\t\t\ttitle={data.workshopTitle}\n\t\t\t\t\t\tmenuControls={menuControls}\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tsetMenuOpened={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t\t{isMenuOpened && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tstyle={{ width: OPENED_MENU_WIDTH }}\n\t\t\t\t\t\t\tclassName=\"scrollbar-thin scrollbar-thumb-scrollbar flex grow flex-col justify-between overflow-y-auto p-6\"\n\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\tclassName=\"flex flex-col\"\n\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\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\tto=\"/\"\n\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t'relative px-2 py-0.5 pr-3 text-2xl font-bold whitespace-nowrap outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\n\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\tHome\n\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{data.exercises.map(({ exerciseNumber, title, steps }) => {\n\t\t\t\t\t\t\t\t\tconst isActive =\n\t\t\t\t\t\t\t\t\t\tNumber(params.exerciseNumber) === exerciseNumber\n\t\t\t\t\t\t\t\t\tconst showPlayground =\n\t\t\t\t\t\t\t\t\t\t!isActive &&\n\t\t\t\t\t\t\t\t\t\tdata.playground.exerciseNumber === exerciseNumber\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<NavigationExerciseListItem\n\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\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=\"flex items-center gap-1 text-2xl font-bold\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative px-2 py-0.5 pr-3 whitespace-nowrap outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t{showPlayground ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.exerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.stepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.type,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t🛝\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t) : null}\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{isActive ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"mt-2 ml-4 flex flex-col\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"instructions\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background relative px-2 py-0.5 pr-3 text-xl font-medium whitespace-nowrap outline-none after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t!params.stepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tIntro\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{steps\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.map(({ stepNumber, title, problem, solution }) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"step\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col gap-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"leading-tight font-semibold\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{stepNumber.toString().padStart(2, '0')}.{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"mt-0.5 ml-3 flex gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'problem',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative px-2 py-0.5 pr-3 whitespace-nowrap outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProblem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'solution',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative px-2 py-0.5 pr-3 whitespace-nowrap outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSolution\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"finished\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber, 'finished')}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background relative px-2 py-0.5 pr-3 text-base font-medium whitespace-nowrap outline-none after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background': isActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t📝 Elaboration\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</NavigationExerciseListItem>\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</motion.ul>\n\t\t\t\t\t\t\t<div className=\"mt-6\">\n\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\tto=\"/finished\"\n\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t'relative text-lg font-bold whitespace-nowrap outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background bg-black text-white after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"]':\n\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\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>\n\t\t\t\t\t\t\t\t\t📝 Workshop Feedback\n\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t\t{!isMenuOpened && (\n\t\t\t\t\t\t<div className=\"flex grow flex-col justify-center\">\n\t\t\t\t\t\t\t<div className=\"orientation-sideways w-full font-mono text-sm leading-none font-medium uppercase\">\n\t\t\t\t\t\t\t\t{exercise?.title ? (\n\t\t\t\t\t\t\t\t\t<Link to={getExercisePath(Number(params.exerciseNumber))}>\n\t\t\t\t\t\t\t\t\t\t{exercise.title}\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t{exercise?.title && app?.title ? ' — ' : null}\n\t\t\t\t\t\t\t\t{app?.title ? (\n\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\tNumber(params.exerciseNumber),\n\t\t\t\t\t\t\t\t\t\t\tapp.stepNumber,\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{app.title}\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{isOnline ? null : (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'You are offline'}>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex w-full animate-pulse items-center border-t p-4',\n\t\t\t\t\t\t\t\t\tisMenuOpened ? 'justify-start' : 'justify-center',\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<Icon\n\t\t\t\t\t\t\t\t\tname=\"WifiNoConnection\"\n\t\t\t\t\t\t\t\t\tclassName=\"text-foreground-destructive\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t\t<span className=\"whitespace-nowrap\">You are offline</span>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</Icon>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t)}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex w-full items-center justify-start border-t p-4 transition-[height]',\n\t\t\t\t\t\t\tisMenuOpened && users.length > 4 ? 'h-28' : 'h-14',\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={isMenuOpened ? { width: OPENED_MENU_WIDTH } : {}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<FacePile isMenuOpened={isMenuOpened} />\n\t\t\t\t\t</div>\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user ? (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'Your account'}>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tclassName=\"flex h-14 w-full shrink-0 items-center justify-start space-x-3 border-t px-4 py-4 text-center no-underline hover:underline\"\n\t\t\t\t\t\t\t\tto=\"/account\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{user.imageUrlSmall ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\talt={user.name ?? user.email}\n\t\t\t\t\t\t\t\t\t\tsrc={user.imageUrlSmall}\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-full rounded-full\"\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\t<Icon name=\"User\" className=\"shrink-0\" size=\"lg\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tYour Account\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Your account</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user && nextExerciseRoute ? (\n\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\tcontent={isMenuOpened ? null : 'Continue to next lesson'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={nextExerciseRoute}\n\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'flex h-14 w-full items-center space-x-3 border-t px-4 py-4 pl-[18px] no-underline hover:underline',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstate={{ from: 'continue next lesson button' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"FastForward\" className=\"shrink-0\" size=\"md\" />\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tContinue to next lesson\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Continue to next lesson</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<div className=\"mb-4 w-full self-start border-t pt-[15px] pl-3\">\n\t\t\t\t\t\t<ThemeSwitch />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</motion.div>\n\t\t</nav>\n\t)\n}\n\nfunction NavToggle({\n\ttitle,\n\tisMenuOpened,\n\tsetMenuOpened,\n\tmenuControls,\n}: {\n\ttitle: string\n\tisMenuOpened: boolean\n\tsetMenuOpened: (value: boolean) => void\n\tmenuControls?: ReturnType<typeof useAnimationControls>\n}) {\n\tconst initialOpenRef = React.useRef(isMenuOpened)\n\tconst menuButtonRef = React.useRef<HTMLButtonElement>(null)\n\tconst path01Variants = {\n\t\topen: { d: 'M3.06061 2.99999L21.0606 21' },\n\t\tclosed: { d: 'M0 9.5L24 9.5' },\n\t}\n\tconst path02Variants = {\n\t\topen: { d: 'M3.00006 21.0607L21 3.06064' },\n\t\tmoving: { d: 'M0 14.5L24 14.5' },\n\t\tclosed: { d: 'M0 14.5L15 14.5' },\n\t}\n\tconst path01Controls = useAnimationControls()\n\tconst path02Controls = useAnimationControls()\n\n\tasync function toggleMenu() {\n\t\tvoid menuControls?.start(isMenuOpened ? 'close' : 'open')\n\t\tsetMenuOpened(!isMenuOpened)\n\t\tif (isMenuOpened) {\n\t\t\tvoid path01Controls.start(path01Variants.closed)\n\t\t\tawait path02Controls.start(path02Variants.moving)\n\t\t\tvoid path02Controls.start(path02Variants.closed)\n\t\t} else {\n\t\t\tawait path02Controls.start(path02Variants.moving)\n\t\t\tvoid path01Controls.start(path01Variants.open)\n\t\t\tvoid path02Controls.start(path02Variants.open)\n\t\t}\n\t}\n\n\tReact.useEffect(() => {\n\t\tif (!isMenuOpened) return\n\n\t\tfunction handleKeyUp(event: KeyboardEvent) {\n\t\t\tif (event.key === 'Escape') {\n\t\t\t\tmenuButtonRef.current?.click()\n\t\t\t}\n\t\t}\n\t\tdocument.addEventListener('keyup', handleKeyUp)\n\t\treturn () => document.removeEventListener('keyup', handleKeyUp)\n\t}, [isMenuOpened])\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'relative inline-flex h-14 shrink-0 items-center justify-between overflow-hidden border-r sm:w-full sm:border-r-0 sm:border-b',\n\t\t\t\t{\n\t\t\t\t\t'w-full': isMenuOpened,\n\t\t\t\t},\n\t\t\t)}\n\t\t>\n\t\t\t<button\n\t\t\t\tref={menuButtonRef}\n\t\t\t\tclassName=\"flex h-14 w-14 items-center justify-center\"\n\t\t\t\taria-label=\"Open Navigation menu\"\n\t\t\t\tonClick={toggleMenu}\n\t\t\t>\n\t\t\t\t<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<motion.path\n\t\t\t\t\t\t{...path01Variants[initialOpenRef.current ? 'open' : 'closed']}\n\t\t\t\t\t\tanimate={path01Controls}\n\t\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t/>\n\t\t\t\t\t<motion.path\n\t\t\t\t\t\t{...path02Variants[initialOpenRef.current ? 'open' : 'closed']}\n\t\t\t\t\t\tanimate={path02Controls}\n\t\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t</button>\n\t\t\t{isMenuOpened && (\n\t\t\t\t<motion.p\n\t\t\t\t\ttransition={{ delay: 0.2 }}\n\t\t\t\t\tinitial={{ opacity: 0, y: 5 }}\n\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\tclassName=\"absolute right-5 font-mono text-sm whitespace-nowrap uppercase\"\n\t\t\t\t>\n\t\t\t\t\t<Link to=\"/\">{title}</Link>\n\t\t\t\t</motion.p>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n"],"names":["stopAnimation","visualElement","value","setVariants","variantLabels","key","variant","setTarget","child","setValues","definition","animationControls","subscribers","controls","transitionOverride","animations","animateVisualElement","useAnimationControls","useConstant","useIsomorphicLayoutEffect","makeMediaQueryStore","mediaQuery","serverSnapshot","getSnapshot","subscribe","callback","mediaQueryList","useSyncExternalStore","opacities","shadows","getScoreClassNames","score","opacityNumber","Math","round","length","shadowNumber","cn","FacePile","isMenuOpened","loggedInUser","useOptionalUser","users","usePresence","product","displayNameShort","useWorkshopConfig","limit","numberOverLimit","shouldShowNumberOverLimit","tiffany","jsx","Link","target","rel","to","children","alt","className","src","overLimitLabel","TooltipProvider","slice","map","user","scoreClassNames","locationLabel","getLocationLabel","location","imageUrl","imageUrlSmall","avatarUrl","hasAccess","local","origin","includes","doingLabel","Tooltip","TooltipTrigger","asChild","tabIndex","name","Icon","TooltipContent","jsxs","id","line1","line2","useIsWide","_layout","_UNSAFE_withComponentProps","data","useLoaderData","isWide","isHydrated","useHydrated","setMenuOpenedState","React","useRevalidationWS","watchPaths","setMenuOpened","document","cookie","toString","NoUserBanner","MobileNavigation","onMenuOpenChange","Navigation","Outlet","exercise","exercisePortion","exerciseNumber","stepNumber","filter","Boolean","s","padStart","join","type","workshopTitle","host","displayName","userHasAccess","useUserHasAccess","details","ENV","EPICSHOP_DEPLOYED","Fragment","EPICSHOP_GITHUB_REPO","href","Logo","size","style","Dialog","DialogTrigger","DialogContent","DialogHeader","DialogDescription","itemVariants","hidden","opacity","x","visible","NavigationExerciseListItem","progressClassName","useExerciseProgressClassName","motion","li","variants","NavigationExerciseStepListItem","progressItemSearch","useProgressItemClassName","nextExerciseRoute","useNextExerciseRoute","params","useParams","isOnline","useIsOnline","listVariants","transition","duration","when","staggerChildren","NavToggle","title","div","initial","animate","ul","NavLink","prefetch","isActive","clsx","exercises","steps","Number","showPlayground","playground","getExercisePath","getExerciseStepPath","problem","solution","appName","SimpleTooltip","content","email","state","from","ThemeSwitch","OPENED_MENU_WIDTH","find","e","app","solutions","problems","p","menuControls","menuVariants","close","width","open","initialOpenRef","menuButtonRef","path01Variants","d","closed","path02Variants","moving","path01Controls","path02Controls","toggleMenu","start","handleKeyUp","event","current","click","addEventListener","removeEventListener","ref","onClick","height","viewBox","path","stroke","strokeWidth","delay","y"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import{j as i}from"./jsx-runtime-C5WNSv3b.js";import{r as a}from"./index-Az39ZADK.js";import{u as Ce,e as Ne,f as O,g as L,P as E,h as w,i as M,j as De,D as Te,n as Pe}from"./tooltip-C2AQeNhD.js";import{P as Re,h as Se,R as Oe,u as ke,F as Ie}from"./index-Cod-PQ6D.js";import{c as C,I as Le}from"./misc-BapXpylh.js";import{o as m,s as g,a1 as Me,as as G,aJ as Q,l as v,a as V,a2 as q}from"./types-Cl2NuNg4.js";import{e as je}from"./chunk-UIGDSWPH-BWkP6tD5.js";import{u as We}from"./online-Dw7HU4wM.js";import{u as P,a as Ae}from"./root-loader-C5P2c7MU.js";var R="Dialog",[J]=Ne(R),[Ue,f]=J(R),Y=e=>{const{__scopeDialog:t,children:s,open:n,defaultOpen:o,onOpenChange:r,modal:u=!0}=e,c=a.useRef(null),l=a.useRef(null),[h,p]=Ce({prop:n,defaultProp:o??!1,onChange:r,caller:R});return i.jsx(Ue,{scope:t,triggerRef:c,contentRef:l,contentId:O(),titleId:O(),descriptionId:O(),open:h,onOpenChange:p,onOpenToggle:a.useCallback(()=>p(d=>!d),[p]),modal:u,children:s})};Y.displayName=R;var K="DialogTrigger",Z=a.forwardRef((e,t)=>{const{__scopeDialog:s,...n}=e,o=f(K,s),r=L(t,o.triggerRef);return i.jsx(E.button,{type:"button","aria-haspopup":"dialog","aria-expanded":o.open,"aria-controls":o.contentId,"data-state":A(o.open),...n,ref:r,onClick:w(e.onClick,o.onOpenToggle)})});Z.displayName=K;var j="DialogPortal",[Fe,X]=J(j,{forceMount:void 0}),ee=e=>{const{__scopeDialog:t,forceMount:s,children:n,container:o}=e,r=f(j,t);return i.jsx(Fe,{scope:t,forceMount:s,children:a.Children.map(n,u=>i.jsx(M,{present:s||r.open,children:i.jsx(Re,{asChild:!0,container:o,children:u})}))})};ee.displayName=j;var T="DialogOverlay",te=a.forwardRef((e,t)=>{const s=X(T,e.__scopeDialog),{forceMount:n=s.forceMount,...o}=e,r=f(T,e.__scopeDialog);return r.modal?i.jsx(M,{present:n||r.open,children:i.jsx(Ge,{...o,ref:t})}):null});te.displayName=T;var $e=De("DialogOverlay.RemoveScroll"),Ge=a.forwardRef((e,t)=>{const{__scopeDialog:s,...n}=e,o=f(T,s);return i.jsx(Oe,{as:$e,allowPinchZoom:!0,shards:[o.contentRef],children:i.jsx(E.div,{"data-state":A(o.open),...n,ref:t,style:{pointerEvents:"auto",...n.style}})})}),b="DialogContent",se=a.forwardRef((e,t)=>{const s=X(b,e.__scopeDialog),{forceMount:n=s.forceMount,...o}=e,r=f(b,e.__scopeDialog);return i.jsx(M,{present:n||r.open,children:r.modal?i.jsx(qe,{...o,ref:t}):i.jsx(He,{...o,ref:t})})});se.displayName=b;var qe=a.forwardRef((e,t)=>{const s=f(b,e.__scopeDialog),n=a.useRef(null),o=L(t,s.contentRef,n);return a.useEffect(()=>{const r=n.current;if(r)return Se(r)},[]),i.jsx(oe,{...e,ref:o,trapFocus:s.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:w(e.onCloseAutoFocus,r=>{r.preventDefault(),s.triggerRef.current?.focus()}),onPointerDownOutside:w(e.onPointerDownOutside,r=>{const u=r.detail.originalEvent,c=u.button===0&&u.ctrlKey===!0;(u.button===2||c)&&r.preventDefault()}),onFocusOutside:w(e.onFocusOutside,r=>r.preventDefault())})}),He=a.forwardRef((e,t)=>{const s=f(b,e.__scopeDialog),n=a.useRef(!1),o=a.useRef(!1);return i.jsx(oe,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:r=>{e.onCloseAutoFocus?.(r),r.defaultPrevented||(n.current||s.triggerRef.current?.focus(),r.preventDefault()),n.current=!1,o.current=!1},onInteractOutside:r=>{e.onInteractOutside?.(r),r.defaultPrevented||(n.current=!0,r.detail.originalEvent.type==="pointerdown"&&(o.current=!0));const u=r.target;s.triggerRef.current?.contains(u)&&r.preventDefault(),r.detail.originalEvent.type==="focusin"&&o.current&&r.preventDefault()}})}),oe=a.forwardRef((e,t)=>{const{__scopeDialog:s,trapFocus:n,onOpenAutoFocus:o,onCloseAutoFocus:r,...u}=e,c=f(b,s),l=a.useRef(null),h=L(t,l);return ke(),i.jsxs(i.Fragment,{children:[i.jsx(Ie,{asChild:!0,loop:!0,trapped:n,onMountAutoFocus:o,onUnmountAutoFocus:r,children:i.jsx(Te,{role:"dialog",id:c.contentId,"aria-describedby":c.descriptionId,"aria-labelledby":c.titleId,"data-state":A(c.open),...u,ref:h,onDismiss:()=>c.onOpenChange(!1)})}),i.jsxs(i.Fragment,{children:[i.jsx(ze,{titleId:c.titleId}),i.jsx(Qe,{contentRef:l,descriptionId:c.descriptionId})]})]})}),W="DialogTitle",ne=a.forwardRef((e,t)=>{const{__scopeDialog:s,...n}=e,o=f(W,s);return i.jsx(E.h2,{id:o.titleId,...n,ref:t})});ne.displayName=W;var re="DialogDescription",ie=a.forwardRef((e,t)=>{const{__scopeDialog:s,...n}=e,o=f(re,s);return i.jsx(E.p,{id:o.descriptionId,...n,ref:t})});ie.displayName=re;var ae="DialogClose",ce=a.forwardRef((e,t)=>{const{__scopeDialog:s,...n}=e,o=f(ae,s);return i.jsx(E.button,{type:"button",...n,ref:t,onClick:w(e.onClick,()=>o.onOpenChange(!1))})});ce.displayName=ae;function A(e){return e?"open":"closed"}var le="DialogTitleWarning",[It,ue]=Pe(le,{contentName:b,titleName:W,docsSlug:"dialog"}),ze=({titleId:e})=>{const t=ue(le),s=`\`${t.contentName}\` requires a \`${t.titleName}\` for the component to be accessible for screen reader users.
|
|
2
|
-
|
|
3
|
-
If you want to hide the \`${t.titleName}\`, you can wrap it with our VisuallyHidden component.
|
|
4
|
-
|
|
5
|
-
For more information, see https://radix-ui.com/primitives/docs/components/${t.docsSlug}`;return a.useEffect(()=>{e&&(document.getElementById(e)||console.error(s))},[s,e]),null},Be="DialogDescriptionWarning",Qe=({contentRef:e,descriptionId:t})=>{const n=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${ue(Be).contentName}}.`;return a.useEffect(()=>{const o=e.current?.getAttribute("aria-describedby");t&&o&&(document.getElementById(t)||console.warn(n))},[n,e,t]),null},Ve=Y,Je=Z,Ye=ee,de=te,he=se,pe=ne,fe=ie,Ke=ce;const Lt=Ve,Mt=Je,Ze=Ye;function me({className:e,ref:t,...s}){return i.jsx(de,{ref:t,className:C("bg-background/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 backdrop-blur-sm",e),...s})}me.displayName=de.displayName;function Xe({className:e,children:t,ref:s,...n}){return i.jsxs(Ze,{children:[i.jsx(me,{}),i.jsxs(he,{ref:s,className:C("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] fixed top-[50%] left-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border p-6 shadow-lg duration-200 sm:rounded-lg md:w-full",e),...n,children:[t,i.jsxs(Ke,{className:"ring-offset-background data-[state=open]:bg-accent data-[state=open]:text-muted-foreground focus:ring-ring absolute top-4 right-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:pointer-events-none",children:[i.jsx(Le,{name:"Close"}),i.jsx("span",{className:"sr-only",children:"Close"})]})]})]})}Xe.displayName=he.displayName;function et({className:e,...t}){return i.jsx("div",{className:C("flex flex-col space-y-1.5 text-center sm:text-left",e),...t})}et.displayName="DialogHeader";function tt({className:e,ref:t,...s}){return i.jsx(pe,{ref:t,className:C("text-lg leading-none font-semibold tracking-tight",e),...s})}tt.displayName=pe.displayName;function st({className:e,ref:t,...s}){return i.jsx(fe,{ref:t,className:C("text-muted-foreground text-sm",e),...s})}st.displayName=fe.displayName;const ge="epic-web-presence",ot=`https://epic-web-presence.kentcdodds.partykit.dev/parties/main/${ge}`,I=m({id:g(),hasAccess:Me().nullable().optional(),avatarUrl:g().nullable().optional(),imageUrlSmall:g().nullable().optional(),imageUrlLarge:g().nullable().optional(),name:g().nullable().optional(),location:m({workshopTitle:g().nullable().optional(),origin:g().nullable().optional(),exercise:m({type:Q([v("problem"),v("solution")]).nullable().optional(),exerciseNumber:G().nullable().optional(),stepNumber:G().nullable().optional()}).nullable().optional()}).nullable().optional()}),nt=m({type:v("remove-user"),payload:m({id:g()})}).or(m({type:v("add-user"),payload:I})).or(m({type:v("presence"),payload:m({users:V(I)})}));m({users:V(I)});(!globalThis.EventTarget||!globalThis.Event)&&console.error(`
|
|
6
|
-
PartySocket requires a global 'EventTarget' class to be available!
|
|
7
|
-
You can polyfill this global by adding this to your code before any partysocket imports:
|
|
8
|
-
|
|
9
|
-
\`\`\`
|
|
10
|
-
import 'partysocket/event-target-polyfill';
|
|
11
|
-
\`\`\`
|
|
12
|
-
Please file an issue at https://github.com/partykit/partykit if you're still having trouble.
|
|
13
|
-
`);var _e=class extends Event{message;error;constructor(e,t){super("error",t),this.message=e.message,this.error=e}},ye=class extends Event{code;reason;wasClean=!0;constructor(e=1e3,t="",s){super("close",s),this.code=e,this.reason=t}},k={Event,ErrorEvent:_e,CloseEvent:ye};function rt(e,t){if(!e)throw new Error(t)}function it(e){return new e.constructor(e.type,e)}function at(e){return"data"in e?new MessageEvent(e.type,e):"code"in e||"reason"in e?new ye(e.code||1999,e.reason||"unknown reason",e):"error"in e?new _e(e.error,e):new Event(e.type,e)}var H,ct=typeof process<"u"&&typeof((H=process.versions)==null?void 0:H.node)<"u"&&typeof document>"u",D=ct?at:it,_={maxReconnectionDelay:1e4,minReconnectionDelay:1e3+Math.random()*4e3,minUptime:5e3,reconnectionDelayGrowFactor:1.3,connectionTimeout:4e3,maxRetries:Number.POSITIVE_INFINITY,maxEnqueuedMessages:Number.POSITIVE_INFINITY},z=!1,lt=class y extends EventTarget{_ws;_retryCount=-1;_uptimeTimeout;_connectTimeout;_shouldReconnect=!0;_connectLock=!1;_binaryType="blob";_closeCalled=!1;_messageQueue=[];_debugLogger=console.log.bind(console);_url;_protocols;_options;constructor(t,s,n={}){super(),this._url=t,this._protocols=s,this._options=n,this._options.startClosed&&(this._shouldReconnect=!1),this._options.debugLogger&&(this._debugLogger=this._options.debugLogger),this._connect()}static get CONNECTING(){return 0}static get OPEN(){return 1}static get CLOSING(){return 2}static get CLOSED(){return 3}get CONNECTING(){return y.CONNECTING}get OPEN(){return y.OPEN}get CLOSING(){return y.CLOSING}get CLOSED(){return y.CLOSED}get binaryType(){return this._ws?this._ws.binaryType:this._binaryType}set binaryType(t){this._binaryType=t,this._ws&&(this._ws.binaryType=t)}get retryCount(){return Math.max(this._retryCount,0)}get bufferedAmount(){return this._messageQueue.reduce((s,n)=>(typeof n=="string"?s+=n.length:n instanceof Blob?s+=n.size:s+=n.byteLength,s),0)+(this._ws?this._ws.bufferedAmount:0)}get extensions(){return this._ws?this._ws.extensions:""}get protocol(){return this._ws?this._ws.protocol:""}get readyState(){return this._ws?this._ws.readyState:this._options.startClosed?y.CLOSED:y.CONNECTING}get url(){return this._ws?this._ws.url:""}get shouldReconnect(){return this._shouldReconnect}onclose=null;onerror=null;onmessage=null;onopen=null;close(t=1e3,s){if(this._closeCalled=!0,this._shouldReconnect=!1,this._clearTimeouts(),!this._ws){this._debug("close enqueued: no ws instance");return}if(this._ws.readyState===this.CLOSED){this._debug("close: already closed");return}this._ws.close(t,s)}reconnect(t,s){this._shouldReconnect=!0,this._closeCalled=!1,this._retryCount=-1,!this._ws||this._ws.readyState===this.CLOSED?this._connect():(this._disconnect(t,s),this._connect())}send(t){if(this._ws&&this._ws.readyState===this.OPEN)this._debug("send",t),this._ws.send(t);else{const{maxEnqueuedMessages:s=_.maxEnqueuedMessages}=this._options;this._messageQueue.length<s&&(this._debug("enqueue",t),this._messageQueue.push(t))}}_debug(...t){this._options.debug&&this._debugLogger("RWS>",...t)}_getNextDelay(){const{reconnectionDelayGrowFactor:t=_.reconnectionDelayGrowFactor,minReconnectionDelay:s=_.minReconnectionDelay,maxReconnectionDelay:n=_.maxReconnectionDelay}=this._options;let o=0;return this._retryCount>0&&(o=s*t**(this._retryCount-1),o>n&&(o=n)),this._debug("next delay",o),o}_wait(){return new Promise(t=>{setTimeout(t,this._getNextDelay())})}_getNextProtocols(t){if(!t)return Promise.resolve(null);if(typeof t=="string"||Array.isArray(t))return Promise.resolve(t);if(typeof t=="function"){const s=t();if(!s)return Promise.resolve(null);if(typeof s=="string"||Array.isArray(s))return Promise.resolve(s);if(s.then)return s}throw Error("Invalid protocols")}_getNextUrl(t){if(typeof t=="string")return Promise.resolve(t);if(typeof t=="function"){const s=t();if(typeof s=="string")return Promise.resolve(s);if(s.then)return s}throw Error("Invalid URL")}_connect(){if(this._connectLock||!this._shouldReconnect)return;this._connectLock=!0;const{maxRetries:t=_.maxRetries,connectionTimeout:s=_.connectionTimeout}=this._options;if(this._retryCount>=t){this._debug("max retries reached",this._retryCount,">=",t);return}this._retryCount++,this._debug("connect",this._retryCount),this._removeListeners(),this._wait().then(()=>Promise.all([this._getNextUrl(this._url),this._getNextProtocols(this._protocols||null)])).then(([n,o])=>{if(this._closeCalled){this._connectLock=!1;return}!this._options.WebSocket&&typeof WebSocket>"u"&&!z&&(console.error(`‼️ No WebSocket implementation available. You should define options.WebSocket.
|
|
14
|
-
|
|
15
|
-
For example, if you're using node.js, run \`npm install ws\`, and then in your code:
|
|
16
|
-
|
|
17
|
-
import PartySocket from 'partysocket';
|
|
18
|
-
import WS from 'ws';
|
|
19
|
-
|
|
20
|
-
const partysocket = new PartySocket({
|
|
21
|
-
host: "127.0.0.1:1999",
|
|
22
|
-
room: "test-room",
|
|
23
|
-
WebSocket: WS
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
`),z=!0);const r=this._options.WebSocket||WebSocket;this._debug("connect",{url:n,protocols:o}),this._ws=o?new r(n,o):new r(n),this._ws.binaryType=this._binaryType,this._connectLock=!1,this._addListeners(),this._connectTimeout=setTimeout(()=>this._handleTimeout(),s)}).catch(n=>{this._connectLock=!1,this._handleError(new k.ErrorEvent(Error(n.message),this))})}_handleTimeout(){this._debug("timeout event"),this._handleError(new k.ErrorEvent(Error("TIMEOUT"),this))}_disconnect(t=1e3,s){if(this._clearTimeouts(),!!this._ws){this._removeListeners();try{(this._ws.readyState===this.OPEN||this._ws.readyState===this.CONNECTING)&&this._ws.close(t,s),this._handleClose(new k.CloseEvent(t,s,this))}catch{}}}_acceptOpen(){this._debug("accept open"),this._retryCount=0}_handleOpen=t=>{this._debug("open event");const{minUptime:s=_.minUptime}=this._options;clearTimeout(this._connectTimeout),this._uptimeTimeout=setTimeout(()=>this._acceptOpen(),s),rt(this._ws,"WebSocket is not defined"),this._ws.binaryType=this._binaryType,this._messageQueue.forEach(n=>{var o;(o=this._ws)==null||o.send(n)}),this._messageQueue=[],this.onopen&&this.onopen(t),this.dispatchEvent(D(t))};_handleMessage=t=>{this._debug("message event"),this.onmessage&&this.onmessage(t),this.dispatchEvent(D(t))};_handleError=t=>{this._debug("error event",t.message),this._disconnect(void 0,t.message==="TIMEOUT"?"timeout":void 0),this.onerror&&this.onerror(t),this._debug("exec error listeners"),this.dispatchEvent(D(t)),this._connect()};_handleClose=t=>{this._debug("close event"),this._clearTimeouts(),this._shouldReconnect&&this._connect(),this.onclose&&this.onclose(t),this.dispatchEvent(D(t))};_removeListeners(){this._ws&&(this._debug("removeListeners"),this._ws.removeEventListener("open",this._handleOpen),this._ws.removeEventListener("close",this._handleClose),this._ws.removeEventListener("message",this._handleMessage),this._ws.removeEventListener("error",this._handleError))}_addListeners(){this._ws&&(this._debug("addListeners"),this._ws.addEventListener("open",this._handleOpen),this._ws.addEventListener("close",this._handleClose),this._ws.addEventListener("message",this._handleMessage),this._ws.addEventListener("error",this._handleError))}_clearTimeouts(){clearTimeout(this._connectTimeout),clearTimeout(this._uptimeTimeout)}};var ut=e=>e[1]!==null&&e[1]!==void 0;function dt(){if(crypto!=null&&crypto.randomUUID)return crypto.randomUUID();let e=Date.now(),t=performance?.now&&performance.now()*1e3||0;return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(s){let n=Math.random()*16;return e>0?(n=(e+n)%16|0,e=Math.floor(e/16)):(n=(t+n)%16|0,t=Math.floor(t/16)),(s==="x"?n:n&3|8).toString(16)})}function ve(e,t,s={}){const{host:n,path:o,protocol:r,room:u,party:c,basePath:l,prefix:h,query:p}=e;let d=n.replace(/^(http|https|ws|wss):\/\//,"");if(d.endsWith("/")&&(d=d.slice(0,-1)),o?.startsWith("/"))throw new Error("path must not start with a slash");const S=c??"main",N=o?`/${o}`:"",x=r||(d.startsWith("localhost:")||d.startsWith("127.0.0.1:")||d.startsWith("192.168.")||d.startsWith("10.")||d.startsWith("172.")&&d.split(".")[1]>="16"&&d.split(".")[1]<="31"||d.startsWith("[::ffff:7f00:1]:")?t:`${t}s`),F=`${x}://${d}/${l||`${h||"parties"}/${S}/${u}`}${N}`,$=(Ee={})=>`${F}?${new URLSearchParams([...Object.entries(s),...Object.entries(Ee).filter(ut)])}`,we=typeof p=="function"?async()=>$(await p()):$(p);return{host:d,path:N,room:u,name:S,protocol:x,partyUrl:F,urlProvider:we}}var ht=class extends lt{constructor(e){var t,s;const n=B(e);super(n.urlProvider,n.protocols,n.socketOptions),this.partySocketOptions=e,this.setWSProperties(n),e.disableNameValidation||((t=e.party)!=null&&t.includes("/")&&console.warn(`PartySocket: party name "${e.party}" contains forward slash which may cause routing issues. Consider using a name without forward slashes or set disableNameValidation: true to bypass this warning.`),(s=e.room)!=null&&s.includes("/")&&console.warn(`PartySocket: room name "${e.room}" contains forward slash which may cause routing issues. Consider using a name without forward slashes or set disableNameValidation: true to bypass this warning.`))}_pk;_pkurl;name;room;host;path;updateProperties(e){const t=B({...this.partySocketOptions,...e,host:e.host??this.host,room:e.room??this.room,path:e.path??this.path});this._url=t.urlProvider,this._protocols=t.protocols,this._options=t.socketOptions,this.setWSProperties(t)}setWSProperties(e){const{_pk:t,_pkurl:s,name:n,room:o,host:r,path:u}=e;this._pk=t,this._pkurl=s,this.name=n,this.room=o,this.host=r,this.path=u}reconnect(e,t){if(!this.room||!this.host)throw new Error("The room and host must be set before connecting, use `updateProperties` method to set them or pass them to the constructor.");super.reconnect(e,t)}get id(){return this._pk}get roomUrl(){return this._pkurl}static async fetch(e,t){const s=ve(e,"http"),n=typeof s.urlProvider=="string"?s.urlProvider:await s.urlProvider();return(e.fetch??fetch)(n,t)}};function B(e){const{id:t,host:s,path:n,party:o,room:r,protocol:u,query:c,protocols:l,...h}=e,p=t||dt(),d=ve(e,"ws",{_pk:p});return{_pk:p,_pkurl:d.partyUrl,name:d.name,room:d.room,host:d.host,path:d.path,protocols:l,socketOptions:h,urlProvider:d.urlProvider}}var pt=(e,t)=>{const s=a.useRef(t);s.current=t,a.useEffect(()=>{const n=c=>{var l,h;return(h=(l=s.current)==null?void 0:l.onOpen)==null?void 0:h.call(l,c)},o=c=>{var l,h;return(h=(l=s.current)==null?void 0:l.onMessage)==null?void 0:h.call(l,c)},r=c=>{var l,h;return(h=(l=s.current)==null?void 0:l.onClose)==null?void 0:h.call(l,c)},u=c=>{var l,h;return(h=(l=s.current)==null?void 0:l.onError)==null?void 0:h.call(l,c)};return e.addEventListener("open",n),e.addEventListener("close",r),e.addEventListener("error",u),e.addEventListener("message",o),()=>{e.removeEventListener("open",n),e.removeEventListener("close",r),e.removeEventListener("error",u),e.removeEventListener("message",o)}},[e])},ft=e=>[e.startClosed,e.minUptime,e.maxRetries,e.connectionTimeout,e.maxEnqueuedMessages,e.maxReconnectionDelay,e.minReconnectionDelay,e.reconnectionDelayGrowFactor,e.debug];function mt({options:e,createSocket:t,createSocketMemoKey:s}){const n=s(e),o=a.useMemo(()=>e,[n]),[r,u]=a.useState(()=>t({...o,startClosed:!0})),c=a.useRef(null),l=a.useRef(t);return l.current=t,a.useEffect(()=>{if(c.current===r){const h=l.current({...o,startClosed:!1});u(h)}else return!c.current&&o.startClosed!==!0&&r.reconnect(),c.current=r,()=>{r.close()}},[r,o]),r}function gt(e){const{host:t,...s}=e,n=mt({options:{host:t||(typeof window<"u"?window.location.host:"dummy-domain.com"),...s},createSocket:o=>new ht(o),createSocketMemoKey:o=>JSON.stringify([o.query,o.id,o.host,o.room,o.party,o.path,o.protocol,o.protocols,o.basePath,o.prefix,...ft(o)])});return pt(n,e),n}const U=a.createContext(null);function _t(){return P()?.preferences?.presence??null}function yt(){return P()?.workshopTitle??null}const vt=m({type:Q([v("problem"),v("solution")]).optional(),exerciseNumber:q.number().finite(),stepNumber:q.number().finite().optional()});function bt(e,t){const[s]=a.useState(()=>new Promise(c=>setTimeout(c,t))),n=a.useRef(!0),o=a.useRef(null),r=a.useRef(e);return a.useEffect(()=>{r.current=e},[e]),a.useCallback((...c)=>{const l=Symbol();o.current=l,s.then(()=>{n.current&&o.current===l&&r.current(...c)})},[s])}function be(){const e=yt(),t=Ae(),s=je(),n=vt.safeParse(s),o=n.success?n.data:null;return{workshopTitle:e,origin:t.origin,...o?{exercise:{type:o.type,exerciseNumber:o.exerciseNumber,stepNumber:o.stepNumber}}:null}}function xt(e){const t=_t(),{userHasAccess:s=!1,userId:n,presence:o}=P()??{},[r,u]=a.useState(o?.users??[]),c=be(),l=bt(N=>{const x=nt.safeParse(JSON.parse(String(N.data)));x.success&&x.data.type==="presence"&&u(x.data.payload.users)},2e3),h=gt({host:new URL(ot).host,room:ge,onMessage:l});let p=null;e?t?.optOut?p={type:"remove-user",payload:{id:e.id}}:p={type:"add-user",payload:{id:e.id,name:e.name,hasAccess:s,imageUrlSmall:e.imageUrlSmall,imageUrlLarge:e.imageUrlLarge,location:c}}:n?.id&&(p={type:"add-user",payload:{id:n.id,location:c}});const d=p?JSON.stringify(p):null;return a.useEffect(()=>{d&&h.send(d)},[d,h]),{users:xe({id:n?.id,location:c},r)}}function xe(e,t){const{location:s}=e;return t.map(o=>{let r=0;const u=5;return o.hasAccess&&(r+=1),s?.workshopTitle===o.location?.workshopTitle&&(r+=1,s?.exercise?.exerciseNumber&&s.exercise.exerciseNumber===o.location?.exercise?.exerciseNumber&&(r+=1,s.exercise.stepNumber&&s.exercise.stepNumber===o.location.exercise.stepNumber&&(r+=1,s.exercise.type&&s.exercise.type===o.location.exercise.type&&(r+=1)))),{user:o,score:Math.floor(r/u*10)/10}}).sort((o,r)=>o.user.id===e?.id?-1:r.user.id===e?.id?1:o.score===r.score?0:o.score>r.score?-1:1)}function wt({user:e,children:t}){return i.jsx(U.Provider,{value:xt(e),children:t})}function Et({user:e,children:t}){const s=be(),{presence:n}=P()??{};return i.jsx(U.Provider,{value:{users:xe({id:e?.id,location:s},n?.users??[])},children:t})}function jt({user:e,children:t}){return We()?i.jsx(wt,{user:e,children:t}):i.jsx(Et,{user:e,children:t})}function Wt(){const e=a.useContext(U);if(!e)throw new Error("usePresence must be used within a PresenceProvider");return e}export{Lt as D,jt as P,Mt as a,Xe as b,et as c,st as d,tt as e,Wt as u};
|
|
27
|
-
//# sourceMappingURL=presence-OxG7Cpak.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"presence-OxG7Cpak.js","sources":["../../../../../node_modules/@radix-ui/react-dialog/dist/index.mjs","../../../app/components/ui/dialog.tsx","../../../../workshop-presence/src/presence.ts","../../../../../node_modules/partysocket/dist/chunk-V6LO7DXK.mjs","../../../../../node_modules/partysocket/dist/chunk-7TNWDF55.mjs","../../../../../node_modules/partysocket/dist/chunk-PTE3YP23.mjs","../../../../../node_modules/partysocket/dist/react.mjs","../../../app/utils/presence.tsx"],"sourcesContent":["\"use client\";\n\n// src/dialog.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContext, createContextScope } from \"@radix-ui/react-context\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { FocusScope } from \"@radix-ui/react-focus-scope\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useFocusGuards } from \"@radix-ui/react-focus-guards\";\nimport { RemoveScroll } from \"react-remove-scroll\";\nimport { hideOthers } from \"aria-hidden\";\nimport { createSlot } from \"@radix-ui/react-slot\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nvar DIALOG_NAME = \"Dialog\";\nvar [createDialogContext, createDialogScope] = createContextScope(DIALOG_NAME);\nvar [DialogProvider, useDialogContext] = createDialogContext(DIALOG_NAME);\nvar Dialog = (props) => {\n const {\n __scopeDialog,\n children,\n open: openProp,\n defaultOpen,\n onOpenChange,\n modal = true\n } = props;\n const triggerRef = React.useRef(null);\n const contentRef = React.useRef(null);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: DIALOG_NAME\n });\n return /* @__PURE__ */ jsx(\n DialogProvider,\n {\n scope: __scopeDialog,\n triggerRef,\n contentRef,\n contentId: useId(),\n titleId: useId(),\n descriptionId: useId(),\n open,\n onOpenChange: setOpen,\n onOpenToggle: React.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]),\n modal,\n children\n }\n );\n};\nDialog.displayName = DIALOG_NAME;\nvar TRIGGER_NAME = \"DialogTrigger\";\nvar DialogTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...triggerProps } = props;\n const context = useDialogContext(TRIGGER_NAME, __scopeDialog);\n const composedTriggerRef = useComposedRefs(forwardedRef, context.triggerRef);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": context.open,\n \"aria-controls\": context.contentId,\n \"data-state\": getState(context.open),\n ...triggerProps,\n ref: composedTriggerRef,\n onClick: composeEventHandlers(props.onClick, context.onOpenToggle)\n }\n );\n }\n);\nDialogTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"DialogPortal\";\nvar [PortalProvider, usePortalContext] = createDialogContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar DialogPortal = (props) => {\n const { __scopeDialog, forceMount, children, container } = props;\n const context = useDialogContext(PORTAL_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopeDialog, forceMount, children: React.Children.map(children, (child) => /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, container, children: child }) })) });\n};\nDialogPortal.displayName = PORTAL_NAME;\nvar OVERLAY_NAME = \"DialogOverlay\";\nvar DialogOverlay = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(OVERLAY_NAME, props.__scopeDialog);\n const { forceMount = portalContext.forceMount, ...overlayProps } = props;\n const context = useDialogContext(OVERLAY_NAME, props.__scopeDialog);\n return context.modal ? /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(DialogOverlayImpl, { ...overlayProps, ref: forwardedRef }) }) : null;\n }\n);\nDialogOverlay.displayName = OVERLAY_NAME;\nvar Slot = createSlot(\"DialogOverlay.RemoveScroll\");\nvar DialogOverlayImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...overlayProps } = props;\n const context = useDialogContext(OVERLAY_NAME, __scopeDialog);\n return (\n // Make sure `Content` is scrollable even when it doesn't live inside `RemoveScroll`\n // ie. when `Overlay` and `Content` are siblings\n /* @__PURE__ */ jsx(RemoveScroll, { as: Slot, allowPinchZoom: true, shards: [context.contentRef], children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": getState(context.open),\n ...overlayProps,\n ref: forwardedRef,\n style: { pointerEvents: \"auto\", ...overlayProps.style }\n }\n ) })\n );\n }\n);\nvar CONTENT_NAME = \"DialogContent\";\nvar DialogContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeDialog);\n const { forceMount = portalContext.forceMount, ...contentProps } = props;\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: context.modal ? /* @__PURE__ */ jsx(DialogContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(DialogContentNonModal, { ...contentProps, ref: forwardedRef }) });\n }\n);\nDialogContent.displayName = CONTENT_NAME;\nvar DialogContentModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, context.contentRef, contentRef);\n React.useEffect(() => {\n const content = contentRef.current;\n if (content) return hideOthers(content);\n }, []);\n return /* @__PURE__ */ jsx(\n DialogContentImpl,\n {\n ...props,\n ref: composedRefs,\n trapFocus: context.open,\n disableOutsidePointerEvents: true,\n onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {\n event.preventDefault();\n context.triggerRef.current?.focus();\n }),\n onPointerDownOutside: composeEventHandlers(props.onPointerDownOutside, (event) => {\n const originalEvent = event.detail.originalEvent;\n const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;\n const isRightClick = originalEvent.button === 2 || ctrlLeftClick;\n if (isRightClick) event.preventDefault();\n }),\n onFocusOutside: composeEventHandlers(\n props.onFocusOutside,\n (event) => event.preventDefault()\n )\n }\n );\n }\n);\nvar DialogContentNonModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n const hasInteractedOutsideRef = React.useRef(false);\n const hasPointerDownOutsideRef = React.useRef(false);\n return /* @__PURE__ */ jsx(\n DialogContentImpl,\n {\n ...props,\n ref: forwardedRef,\n trapFocus: false,\n disableOutsidePointerEvents: false,\n onCloseAutoFocus: (event) => {\n props.onCloseAutoFocus?.(event);\n if (!event.defaultPrevented) {\n if (!hasInteractedOutsideRef.current) context.triggerRef.current?.focus();\n event.preventDefault();\n }\n hasInteractedOutsideRef.current = false;\n hasPointerDownOutsideRef.current = false;\n },\n onInteractOutside: (event) => {\n props.onInteractOutside?.(event);\n if (!event.defaultPrevented) {\n hasInteractedOutsideRef.current = true;\n if (event.detail.originalEvent.type === \"pointerdown\") {\n hasPointerDownOutsideRef.current = true;\n }\n }\n const target = event.target;\n const targetIsTrigger = context.triggerRef.current?.contains(target);\n if (targetIsTrigger) event.preventDefault();\n if (event.detail.originalEvent.type === \"focusin\" && hasPointerDownOutsideRef.current) {\n event.preventDefault();\n }\n }\n }\n );\n }\n);\nvar DialogContentImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, trapFocus, onOpenAutoFocus, onCloseAutoFocus, ...contentProps } = props;\n const context = useDialogContext(CONTENT_NAME, __scopeDialog);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, contentRef);\n useFocusGuards();\n return /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n FocusScope,\n {\n asChild: true,\n loop: true,\n trapped: trapFocus,\n onMountAutoFocus: onOpenAutoFocus,\n onUnmountAutoFocus: onCloseAutoFocus,\n children: /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n role: \"dialog\",\n id: context.contentId,\n \"aria-describedby\": context.descriptionId,\n \"aria-labelledby\": context.titleId,\n \"data-state\": getState(context.open),\n ...contentProps,\n ref: composedRefs,\n onDismiss: () => context.onOpenChange(false)\n }\n )\n }\n ),\n /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(TitleWarning, { titleId: context.titleId }),\n /* @__PURE__ */ jsx(DescriptionWarning, { contentRef, descriptionId: context.descriptionId })\n ] })\n ] });\n }\n);\nvar TITLE_NAME = \"DialogTitle\";\nvar DialogTitle = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...titleProps } = props;\n const context = useDialogContext(TITLE_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(Primitive.h2, { id: context.titleId, ...titleProps, ref: forwardedRef });\n }\n);\nDialogTitle.displayName = TITLE_NAME;\nvar DESCRIPTION_NAME = \"DialogDescription\";\nvar DialogDescription = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...descriptionProps } = props;\n const context = useDialogContext(DESCRIPTION_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(Primitive.p, { id: context.descriptionId, ...descriptionProps, ref: forwardedRef });\n }\n);\nDialogDescription.displayName = DESCRIPTION_NAME;\nvar CLOSE_NAME = \"DialogClose\";\nvar DialogClose = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...closeProps } = props;\n const context = useDialogContext(CLOSE_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n ...closeProps,\n ref: forwardedRef,\n onClick: composeEventHandlers(props.onClick, () => context.onOpenChange(false))\n }\n );\n }\n);\nDialogClose.displayName = CLOSE_NAME;\nfunction getState(open) {\n return open ? \"open\" : \"closed\";\n}\nvar TITLE_WARNING_NAME = \"DialogTitleWarning\";\nvar [WarningProvider, useWarningContext] = createContext(TITLE_WARNING_NAME, {\n contentName: CONTENT_NAME,\n titleName: TITLE_NAME,\n docsSlug: \"dialog\"\n});\nvar TitleWarning = ({ titleId }) => {\n const titleWarningContext = useWarningContext(TITLE_WARNING_NAME);\n const MESSAGE = `\\`${titleWarningContext.contentName}\\` requires a \\`${titleWarningContext.titleName}\\` for the component to be accessible for screen reader users.\n\nIf you want to hide the \\`${titleWarningContext.titleName}\\`, you can wrap it with our VisuallyHidden component.\n\nFor more information, see https://radix-ui.com/primitives/docs/components/${titleWarningContext.docsSlug}`;\n React.useEffect(() => {\n if (titleId) {\n const hasTitle = document.getElementById(titleId);\n if (!hasTitle) console.error(MESSAGE);\n }\n }, [MESSAGE, titleId]);\n return null;\n};\nvar DESCRIPTION_WARNING_NAME = \"DialogDescriptionWarning\";\nvar DescriptionWarning = ({ contentRef, descriptionId }) => {\n const descriptionWarningContext = useWarningContext(DESCRIPTION_WARNING_NAME);\n const MESSAGE = `Warning: Missing \\`Description\\` or \\`aria-describedby={undefined}\\` for {${descriptionWarningContext.contentName}}.`;\n React.useEffect(() => {\n const describedById = contentRef.current?.getAttribute(\"aria-describedby\");\n if (descriptionId && describedById) {\n const hasDescription = document.getElementById(descriptionId);\n if (!hasDescription) console.warn(MESSAGE);\n }\n }, [MESSAGE, contentRef, descriptionId]);\n return null;\n};\nvar Root = Dialog;\nvar Trigger = DialogTrigger;\nvar Portal = DialogPortal;\nvar Overlay = DialogOverlay;\nvar Content = DialogContent;\nvar Title = DialogTitle;\nvar Description = DialogDescription;\nvar Close = DialogClose;\nexport {\n Close,\n Content,\n Description,\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n Overlay,\n Portal,\n Root,\n Title,\n Trigger,\n WarningProvider,\n createDialogScope\n};\n//# sourceMappingURL=index.mjs.map\n","import * as DialogPrimitive from '@radix-ui/react-dialog'\nimport * as React from 'react'\nimport { cn } from '#app/utils/misc.tsx'\nimport { Icon } from '../icons'\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nfunction DialogOverlay({\n\tclassName,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n\treturn (\n\t\t<DialogPrimitive.Overlay\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'bg-background/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 backdrop-blur-sm',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nfunction DialogContent({\n\tclassName,\n\tchildren,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Content>) {\n\treturn (\n\t\t<DialogPortal>\n\t\t\t<DialogOverlay />\n\t\t\t<DialogPrimitive.Content\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] fixed top-[50%] left-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border p-6 shadow-lg duration-200 sm:rounded-lg md:w-full',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t<DialogPrimitive.Close className=\"ring-offset-background data-[state=open]:bg-accent data-[state=open]:text-muted-foreground focus:ring-ring absolute top-4 right-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:pointer-events-none\">\n\t\t\t\t\t<Icon name=\"Close\" />\n\t\t\t\t\t<span className=\"sr-only\">Close</span>\n\t\t\t\t</DialogPrimitive.Close>\n\t\t\t</DialogPrimitive.Content>\n\t\t</DialogPortal>\n\t)\n}\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nfunction DialogHeader({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'flex flex-col space-y-1.5 text-center sm:text-left',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogHeader.displayName = 'DialogHeader'\n\nfunction DialogFooter({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogFooter.displayName = 'DialogFooter'\n\nfunction DialogTitle({\n\tclassName,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n\treturn (\n\t\t<DialogPrimitive.Title\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'text-lg leading-none font-semibold tracking-tight',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nfunction DialogDescription({\n\tclassName,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n\treturn (\n\t\t<DialogPrimitive.Description\n\t\t\tref={ref}\n\t\t\tclassName={cn('text-muted-foreground text-sm', className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n\tDialog,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogOverlay,\n\tDialogPortal,\n\tDialogTitle,\n\tDialogTrigger,\n}\n","import { z } from 'zod'\n\nexport const partykitRoom = 'epic-web-presence'\n// export const partykitBaseUrl = `http://127.0.0.1:1999/parties/main/${partykitRoom}`\nexport const partykitBaseUrl = `https://epic-web-presence.kentcdodds.partykit.dev/parties/main/${partykitRoom}`\n\nexport const UserSchema = z.object({\n\tid: z.string(),\n\thasAccess: z.boolean().nullable().optional(),\n\t// TODO: remove the avatarUrl field once people have updated their workshops\n\tavatarUrl: z.string().nullable().optional(),\n\timageUrlSmall: z.string().nullable().optional(),\n\timageUrlLarge: z.string().nullable().optional(),\n\tname: z.string().nullable().optional(),\n\tlocation: z\n\t\t.object({\n\t\t\tworkshopTitle: z.string().nullable().optional(),\n\t\t\torigin: z.string().nullable().optional(),\n\t\t\texercise: z\n\t\t\t\t.object({\n\t\t\t\t\ttype: z\n\t\t\t\t\t\t.union([z.literal('problem'), z.literal('solution')])\n\t\t\t\t\t\t.nullable()\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\texerciseNumber: z.number().nullable().optional(),\n\t\t\t\t\tstepNumber: z.number().nullable().optional(),\n\t\t\t\t})\n\t\t\t\t.nullable()\n\t\t\t\t.optional(),\n\t\t})\n\t\t.nullable()\n\t\t.optional(),\n})\n\nexport const MessageSchema = z\n\t.object({\n\t\ttype: z.literal('remove-user'),\n\t\tpayload: z.object({ id: z.string() }),\n\t})\n\t.or(z.object({ type: z.literal('add-user'), payload: UserSchema }))\n\t.or(\n\t\tz.object({\n\t\t\ttype: z.literal('presence'),\n\t\t\tpayload: z.object({ users: z.array(UserSchema) }),\n\t\t}),\n\t)\n\nexport type Message = z.infer<typeof MessageSchema>\n\nexport type User = z.infer<typeof UserSchema>\n\nexport const PresenceSchema = z.object({ users: z.array(UserSchema) })\n","// src/ws.ts\nif (!globalThis.EventTarget || !globalThis.Event) {\n console.error(`\n PartySocket requires a global 'EventTarget' class to be available!\n You can polyfill this global by adding this to your code before any partysocket imports: \n \n \\`\\`\\`\n import 'partysocket/event-target-polyfill';\n \\`\\`\\`\n Please file an issue at https://github.com/partykit/partykit if you're still having trouble.\n`);\n}\nvar ErrorEvent = class extends Event {\n message;\n error;\n // biome-ignore lint/suspicious/noExplicitAny: vibes\n constructor(error, target) {\n super(\"error\", target);\n this.message = error.message;\n this.error = error;\n }\n};\nvar CloseEvent = class extends Event {\n code;\n reason;\n wasClean = true;\n // biome-ignore lint/suspicious/noExplicitAny: legacy\n constructor(code = 1e3, reason = \"\", target) {\n super(\"close\", target);\n this.code = code;\n this.reason = reason;\n }\n};\nvar Events = {\n Event,\n ErrorEvent,\n CloseEvent\n};\nfunction assert(condition, msg) {\n if (!condition) {\n throw new Error(msg);\n }\n}\nfunction cloneEventBrowser(e) {\n return new e.constructor(e.type, e);\n}\nfunction cloneEventNode(e) {\n if (\"data\" in e) {\n const evt2 = new MessageEvent(e.type, e);\n return evt2;\n }\n if (\"code\" in e || \"reason\" in e) {\n const evt2 = new CloseEvent(\n // @ts-expect-error we need to fix event/listener types\n e.code || 1999,\n // @ts-expect-error we need to fix event/listener types\n e.reason || \"unknown reason\",\n e\n );\n return evt2;\n }\n if (\"error\" in e) {\n const evt2 = new ErrorEvent(e.error, e);\n return evt2;\n }\n const evt = new Event(e.type, e);\n return evt;\n}\nvar _a;\nvar isNode =\n typeof process !== \"undefined\" &&\n typeof ((_a = process.versions) == null ? void 0 : _a.node) !== \"undefined\" &&\n typeof document === \"undefined\";\nvar cloneEvent = isNode ? cloneEventNode : cloneEventBrowser;\nvar DEFAULT = {\n maxReconnectionDelay: 1e4,\n minReconnectionDelay: 1e3 + Math.random() * 4e3,\n minUptime: 5e3,\n reconnectionDelayGrowFactor: 1.3,\n connectionTimeout: 4e3,\n maxRetries: Number.POSITIVE_INFINITY,\n maxEnqueuedMessages: Number.POSITIVE_INFINITY,\n startClosed: false,\n debug: false\n};\nvar didWarnAboutMissingWebSocket = false;\nvar ReconnectingWebSocket = class _ReconnectingWebSocket extends EventTarget {\n _ws;\n _retryCount = -1;\n _uptimeTimeout;\n _connectTimeout;\n _shouldReconnect = true;\n _connectLock = false;\n _binaryType = \"blob\";\n _closeCalled = false;\n _messageQueue = [];\n _debugLogger = console.log.bind(console);\n _url;\n _protocols;\n _options;\n constructor(url, protocols, options = {}) {\n super();\n this._url = url;\n this._protocols = protocols;\n this._options = options;\n if (this._options.startClosed) {\n this._shouldReconnect = false;\n }\n if (this._options.debugLogger) {\n this._debugLogger = this._options.debugLogger;\n }\n this._connect();\n }\n static get CONNECTING() {\n return 0;\n }\n static get OPEN() {\n return 1;\n }\n static get CLOSING() {\n return 2;\n }\n static get CLOSED() {\n return 3;\n }\n get CONNECTING() {\n return _ReconnectingWebSocket.CONNECTING;\n }\n get OPEN() {\n return _ReconnectingWebSocket.OPEN;\n }\n get CLOSING() {\n return _ReconnectingWebSocket.CLOSING;\n }\n get CLOSED() {\n return _ReconnectingWebSocket.CLOSED;\n }\n get binaryType() {\n return this._ws ? this._ws.binaryType : this._binaryType;\n }\n set binaryType(value) {\n this._binaryType = value;\n if (this._ws) {\n this._ws.binaryType = value;\n }\n }\n /**\n * Returns the number or connection retries\n */\n get retryCount() {\n return Math.max(this._retryCount, 0);\n }\n /**\n * The number of bytes of data that have been queued using calls to send() but not yet\n * transmitted to the network. This value resets to zero once all queued data has been sent.\n * This value does not reset to zero when the connection is closed; if you keep calling send(),\n * this will continue to climb. Read only\n */\n get bufferedAmount() {\n const bytes = this._messageQueue.reduce((acc, message) => {\n if (typeof message === \"string\") {\n acc += message.length;\n } else if (message instanceof Blob) {\n acc += message.size;\n } else {\n acc += message.byteLength;\n }\n return acc;\n }, 0);\n return bytes + (this._ws ? this._ws.bufferedAmount : 0);\n }\n /**\n * The extensions selected by the server. This is currently only the empty string or a list of\n * extensions as negotiated by the connection\n */\n get extensions() {\n return this._ws ? this._ws.extensions : \"\";\n }\n /**\n * A string indicating the name of the sub-protocol the server selected;\n * this will be one of the strings specified in the protocols parameter when creating the\n * WebSocket object\n */\n get protocol() {\n return this._ws ? this._ws.protocol : \"\";\n }\n /**\n * The current state of the connection; this is one of the Ready state constants\n */\n get readyState() {\n if (this._ws) {\n return this._ws.readyState;\n }\n return this._options.startClosed\n ? _ReconnectingWebSocket.CLOSED\n : _ReconnectingWebSocket.CONNECTING;\n }\n /**\n * The URL as resolved by the constructor\n */\n get url() {\n return this._ws ? this._ws.url : \"\";\n }\n /**\n * Whether the websocket object is now in reconnectable state\n */\n get shouldReconnect() {\n return this._shouldReconnect;\n }\n /**\n * An event listener to be called when the WebSocket connection's readyState changes to CLOSED\n */\n onclose = null;\n /**\n * An event listener to be called when an error occurs\n */\n onerror = null;\n /**\n * An event listener to be called when a message is received from the server\n */\n onmessage = null;\n /**\n * An event listener to be called when the WebSocket connection's readyState changes to OPEN;\n * this indicates that the connection is ready to send and receive data\n */\n onopen = null;\n /**\n * Closes the WebSocket connection or connection attempt, if any. If the connection is already\n * CLOSED, this method does nothing\n */\n close(code = 1e3, reason) {\n this._closeCalled = true;\n this._shouldReconnect = false;\n this._clearTimeouts();\n if (!this._ws) {\n this._debug(\"close enqueued: no ws instance\");\n return;\n }\n if (this._ws.readyState === this.CLOSED) {\n this._debug(\"close: already closed\");\n return;\n }\n this._ws.close(code, reason);\n }\n /**\n * Closes the WebSocket connection or connection attempt and connects again.\n * Resets retry counter;\n */\n reconnect(code, reason) {\n this._shouldReconnect = true;\n this._closeCalled = false;\n this._retryCount = -1;\n if (!this._ws || this._ws.readyState === this.CLOSED) {\n this._connect();\n } else {\n this._disconnect(code, reason);\n this._connect();\n }\n }\n /**\n * Enqueue specified data to be transmitted to the server over the WebSocket connection\n */\n send(data) {\n if (this._ws && this._ws.readyState === this.OPEN) {\n this._debug(\"send\", data);\n this._ws.send(data);\n } else {\n const { maxEnqueuedMessages = DEFAULT.maxEnqueuedMessages } =\n this._options;\n if (this._messageQueue.length < maxEnqueuedMessages) {\n this._debug(\"enqueue\", data);\n this._messageQueue.push(data);\n }\n }\n }\n _debug(...args) {\n if (this._options.debug) {\n this._debugLogger(\"RWS>\", ...args);\n }\n }\n _getNextDelay() {\n const {\n reconnectionDelayGrowFactor = DEFAULT.reconnectionDelayGrowFactor,\n minReconnectionDelay = DEFAULT.minReconnectionDelay,\n maxReconnectionDelay = DEFAULT.maxReconnectionDelay\n } = this._options;\n let delay = 0;\n if (this._retryCount > 0) {\n delay =\n minReconnectionDelay *\n reconnectionDelayGrowFactor ** (this._retryCount - 1);\n if (delay > maxReconnectionDelay) {\n delay = maxReconnectionDelay;\n }\n }\n this._debug(\"next delay\", delay);\n return delay;\n }\n _wait() {\n return new Promise((resolve) => {\n setTimeout(resolve, this._getNextDelay());\n });\n }\n _getNextProtocols(protocolsProvider) {\n if (!protocolsProvider) return Promise.resolve(null);\n if (\n typeof protocolsProvider === \"string\" ||\n Array.isArray(protocolsProvider)\n ) {\n return Promise.resolve(protocolsProvider);\n }\n if (typeof protocolsProvider === \"function\") {\n const protocols = protocolsProvider();\n if (!protocols) return Promise.resolve(null);\n if (typeof protocols === \"string\" || Array.isArray(protocols)) {\n return Promise.resolve(protocols);\n }\n if (protocols.then) {\n return protocols;\n }\n }\n throw Error(\"Invalid protocols\");\n }\n _getNextUrl(urlProvider) {\n if (typeof urlProvider === \"string\") {\n return Promise.resolve(urlProvider);\n }\n if (typeof urlProvider === \"function\") {\n const url = urlProvider();\n if (typeof url === \"string\") {\n return Promise.resolve(url);\n }\n if (url.then) {\n return url;\n }\n }\n throw Error(\"Invalid URL\");\n }\n _connect() {\n if (this._connectLock || !this._shouldReconnect) {\n return;\n }\n this._connectLock = true;\n const {\n maxRetries = DEFAULT.maxRetries,\n connectionTimeout = DEFAULT.connectionTimeout\n } = this._options;\n if (this._retryCount >= maxRetries) {\n this._debug(\"max retries reached\", this._retryCount, \">=\", maxRetries);\n return;\n }\n this._retryCount++;\n this._debug(\"connect\", this._retryCount);\n this._removeListeners();\n this._wait()\n .then(() =>\n Promise.all([\n this._getNextUrl(this._url),\n this._getNextProtocols(this._protocols || null)\n ])\n )\n .then(([url, protocols]) => {\n if (this._closeCalled) {\n this._connectLock = false;\n return;\n }\n if (\n !this._options.WebSocket &&\n typeof WebSocket === \"undefined\" &&\n !didWarnAboutMissingWebSocket\n ) {\n console.error(`\\u203C\\uFE0F No WebSocket implementation available. You should define options.WebSocket. \n\nFor example, if you're using node.js, run \\`npm install ws\\`, and then in your code:\n\nimport PartySocket from 'partysocket';\nimport WS from 'ws';\n\nconst partysocket = new PartySocket({\n host: \"127.0.0.1:1999\",\n room: \"test-room\",\n WebSocket: WS\n});\n\n`);\n didWarnAboutMissingWebSocket = true;\n }\n const WS = this._options.WebSocket || WebSocket;\n this._debug(\"connect\", { url, protocols });\n this._ws = protocols ? new WS(url, protocols) : new WS(url);\n this._ws.binaryType = this._binaryType;\n this._connectLock = false;\n this._addListeners();\n this._connectTimeout = setTimeout(\n () => this._handleTimeout(),\n connectionTimeout\n );\n })\n .catch((err) => {\n this._connectLock = false;\n this._handleError(new Events.ErrorEvent(Error(err.message), this));\n });\n }\n _handleTimeout() {\n this._debug(\"timeout event\");\n this._handleError(new Events.ErrorEvent(Error(\"TIMEOUT\"), this));\n }\n _disconnect(code = 1e3, reason) {\n this._clearTimeouts();\n if (!this._ws) {\n return;\n }\n this._removeListeners();\n try {\n if (\n this._ws.readyState === this.OPEN ||\n this._ws.readyState === this.CONNECTING\n ) {\n this._ws.close(code, reason);\n }\n this._handleClose(new Events.CloseEvent(code, reason, this));\n } catch (_error) {}\n }\n _acceptOpen() {\n this._debug(\"accept open\");\n this._retryCount = 0;\n }\n _handleOpen = (event) => {\n this._debug(\"open event\");\n const { minUptime = DEFAULT.minUptime } = this._options;\n clearTimeout(this._connectTimeout);\n this._uptimeTimeout = setTimeout(() => this._acceptOpen(), minUptime);\n assert(this._ws, \"WebSocket is not defined\");\n this._ws.binaryType = this._binaryType;\n this._messageQueue.forEach((message) => {\n var _a2;\n (_a2 = this._ws) == null ? void 0 : _a2.send(message);\n });\n this._messageQueue = [];\n if (this.onopen) {\n this.onopen(event);\n }\n this.dispatchEvent(cloneEvent(event));\n };\n _handleMessage = (event) => {\n this._debug(\"message event\");\n if (this.onmessage) {\n this.onmessage(event);\n }\n this.dispatchEvent(cloneEvent(event));\n };\n _handleError = (event) => {\n this._debug(\"error event\", event.message);\n this._disconnect(void 0, event.message === \"TIMEOUT\" ? \"timeout\" : void 0);\n if (this.onerror) {\n this.onerror(event);\n }\n this._debug(\"exec error listeners\");\n this.dispatchEvent(cloneEvent(event));\n this._connect();\n };\n _handleClose = (event) => {\n this._debug(\"close event\");\n this._clearTimeouts();\n if (this._shouldReconnect) {\n this._connect();\n }\n if (this.onclose) {\n this.onclose(event);\n }\n this.dispatchEvent(cloneEvent(event));\n };\n _removeListeners() {\n if (!this._ws) {\n return;\n }\n this._debug(\"removeListeners\");\n this._ws.removeEventListener(\"open\", this._handleOpen);\n this._ws.removeEventListener(\"close\", this._handleClose);\n this._ws.removeEventListener(\"message\", this._handleMessage);\n this._ws.removeEventListener(\"error\", this._handleError);\n }\n _addListeners() {\n if (!this._ws) {\n return;\n }\n this._debug(\"addListeners\");\n this._ws.addEventListener(\"open\", this._handleOpen);\n this._ws.addEventListener(\"close\", this._handleClose);\n this._ws.addEventListener(\"message\", this._handleMessage);\n this._ws.addEventListener(\"error\", this._handleError);\n }\n _clearTimeouts() {\n clearTimeout(this._connectTimeout);\n clearTimeout(this._uptimeTimeout);\n }\n};\n\nexport { ErrorEvent, CloseEvent, ReconnectingWebSocket };\n/*!\n * Reconnecting WebSocket\n * by Pedro Ladaria <pedro.ladaria@gmail.com>\n * https://github.com/pladaria/reconnecting-websocket\n * License MIT\n */\n//# sourceMappingURL=chunk-V6LO7DXK.mjs.map\n","import { ReconnectingWebSocket } from \"./chunk-V6LO7DXK.mjs\";\n\n// src/index.ts\nvar valueIsNotNil = (keyValuePair) =>\n keyValuePair[1] !== null && keyValuePair[1] !== void 0;\nfunction generateUUID() {\n if (crypto == null ? void 0 : crypto.randomUUID) {\n return crypto.randomUUID();\n }\n let d = Date.now();\n let d2 =\n ((performance == null ? void 0 : performance.now) &&\n performance.now() * 1e3) ||\n 0;\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n let r = Math.random() * 16;\n if (d > 0) {\n r = (d + r) % 16 | 0;\n d = Math.floor(d / 16);\n } else {\n r = (d2 + r) % 16 | 0;\n d2 = Math.floor(d2 / 16);\n }\n return (c === \"x\" ? r : (r & 3) | 8).toString(16);\n });\n}\nfunction getPartyInfo(partySocketOptions, defaultProtocol, defaultParams = {}) {\n const {\n host: rawHost,\n path: rawPath,\n protocol: rawProtocol,\n room,\n party,\n basePath,\n prefix,\n query\n } = partySocketOptions;\n let host = rawHost.replace(/^(http|https|ws|wss):\\/\\//, \"\");\n if (host.endsWith(\"/\")) {\n host = host.slice(0, -1);\n }\n if (rawPath == null ? void 0 : rawPath.startsWith(\"/\")) {\n throw new Error(\"path must not start with a slash\");\n }\n const name = party ?? \"main\";\n const path = rawPath ? `/${rawPath}` : \"\";\n const protocol =\n rawProtocol ||\n (host.startsWith(\"localhost:\") ||\n host.startsWith(\"127.0.0.1:\") ||\n host.startsWith(\"192.168.\") ||\n host.startsWith(\"10.\") ||\n (host.startsWith(\"172.\") &&\n host.split(\".\")[1] >= \"16\" &&\n host.split(\".\")[1] <= \"31\") ||\n host.startsWith(\"[::ffff:7f00:1]:\")\n ? // http / ws\n defaultProtocol\n : // https / wss\n `${defaultProtocol}s`);\n const baseUrl = `${protocol}://${host}/${basePath || `${prefix || \"parties\"}/${name}/${room}`}${path}`;\n const makeUrl = (query2 = {}) =>\n `${baseUrl}?${new URLSearchParams([\n ...Object.entries(defaultParams),\n ...Object.entries(query2).filter(valueIsNotNil)\n ])}`;\n const urlProvider =\n typeof query === \"function\"\n ? async () => makeUrl(await query())\n : makeUrl(query);\n return {\n host,\n path,\n room,\n name,\n protocol,\n partyUrl: baseUrl,\n urlProvider\n };\n}\nvar PartySocket = class extends ReconnectingWebSocket {\n constructor(partySocketOptions) {\n var _a, _b;\n const wsOptions = getWSOptions(partySocketOptions);\n super(wsOptions.urlProvider, wsOptions.protocols, wsOptions.socketOptions);\n this.partySocketOptions = partySocketOptions;\n this.setWSProperties(wsOptions);\n if (!partySocketOptions.disableNameValidation) {\n if ((_a = partySocketOptions.party) == null ? void 0 : _a.includes(\"/\")) {\n console.warn(\n `PartySocket: party name \"${partySocketOptions.party}\" contains forward slash which may cause routing issues. Consider using a name without forward slashes or set disableNameValidation: true to bypass this warning.`\n );\n }\n if ((_b = partySocketOptions.room) == null ? void 0 : _b.includes(\"/\")) {\n console.warn(\n `PartySocket: room name \"${partySocketOptions.room}\" contains forward slash which may cause routing issues. Consider using a name without forward slashes or set disableNameValidation: true to bypass this warning.`\n );\n }\n }\n }\n _pk;\n _pkurl;\n name;\n room;\n host;\n path;\n updateProperties(partySocketOptions) {\n const wsOptions = getWSOptions({\n ...this.partySocketOptions,\n ...partySocketOptions,\n host: partySocketOptions.host ?? this.host,\n room: partySocketOptions.room ?? this.room,\n path: partySocketOptions.path ?? this.path\n });\n this._url = wsOptions.urlProvider;\n this._protocols = wsOptions.protocols;\n this._options = wsOptions.socketOptions;\n this.setWSProperties(wsOptions);\n }\n setWSProperties(wsOptions) {\n const { _pk, _pkurl, name, room, host, path } = wsOptions;\n this._pk = _pk;\n this._pkurl = _pkurl;\n this.name = name;\n this.room = room;\n this.host = host;\n this.path = path;\n }\n reconnect(code, reason) {\n if (!this.room || !this.host) {\n throw new Error(\n \"The room and host must be set before connecting, use `updateProperties` method to set them or pass them to the constructor.\"\n );\n }\n super.reconnect(code, reason);\n }\n get id() {\n return this._pk;\n }\n /**\n * Exposes the static PartyKit room URL without applying query parameters.\n * To access the currently connected WebSocket url, use PartySocket#url.\n */\n get roomUrl() {\n return this._pkurl;\n }\n // a `fetch` method that uses (almost) the same options as `PartySocket`\n static async fetch(options, init) {\n const party = getPartyInfo(options, \"http\");\n const url =\n typeof party.urlProvider === \"string\"\n ? party.urlProvider\n : await party.urlProvider();\n const doFetch = options.fetch ?? fetch;\n return doFetch(url, init);\n }\n};\nfunction getWSOptions(partySocketOptions) {\n const {\n id,\n host: _host,\n path: _path,\n party: _party,\n room: _room,\n protocol: _protocol,\n query: _query,\n protocols,\n ...socketOptions\n } = partySocketOptions;\n const _pk = id || generateUUID();\n const party = getPartyInfo(partySocketOptions, \"ws\", { _pk });\n return {\n _pk,\n _pkurl: party.partyUrl,\n name: party.name,\n room: party.room,\n host: party.host,\n path: party.path,\n protocols,\n socketOptions,\n urlProvider: party.urlProvider\n };\n}\n\nexport { PartySocket };\n//# sourceMappingURL=chunk-7TNWDF55.mjs.map\n","import { ReconnectingWebSocket } from \"./chunk-V6LO7DXK.mjs\";\n\n// src/use-handlers.ts\nimport { useEffect, useRef } from \"react\";\nvar useAttachWebSocketEventHandlers = (socket, options) => {\n const handlersRef = useRef(options);\n handlersRef.current = options;\n useEffect(() => {\n const onOpen = (event) => {\n var _a, _b;\n return (_b = (_a = handlersRef.current) == null ? void 0 : _a.onOpen) ==\n null\n ? void 0\n : _b.call(_a, event);\n };\n const onMessage = (event) => {\n var _a, _b;\n return (_b =\n (_a = handlersRef.current) == null ? void 0 : _a.onMessage) == null\n ? void 0\n : _b.call(_a, event);\n };\n const onClose = (event) => {\n var _a, _b;\n return (_b = (_a = handlersRef.current) == null ? void 0 : _a.onClose) ==\n null\n ? void 0\n : _b.call(_a, event);\n };\n const onError = (event) => {\n var _a, _b;\n return (_b = (_a = handlersRef.current) == null ? void 0 : _a.onError) ==\n null\n ? void 0\n : _b.call(_a, event);\n };\n socket.addEventListener(\"open\", onOpen);\n socket.addEventListener(\"close\", onClose);\n socket.addEventListener(\"error\", onError);\n socket.addEventListener(\"message\", onMessage);\n return () => {\n socket.removeEventListener(\"open\", onOpen);\n socket.removeEventListener(\"close\", onClose);\n socket.removeEventListener(\"error\", onError);\n socket.removeEventListener(\"message\", onMessage);\n };\n }, [socket]);\n};\n\n// src/use-socket.ts\nimport {\n useEffect as useEffect2,\n useMemo,\n useRef as useRef2,\n useState\n} from \"react\";\nvar getOptionsThatShouldCauseRestartWhenChanged = (options) => [\n options.startClosed,\n options.minUptime,\n options.maxRetries,\n options.connectionTimeout,\n options.maxEnqueuedMessages,\n options.maxReconnectionDelay,\n options.minReconnectionDelay,\n options.reconnectionDelayGrowFactor,\n options.debug\n];\nfunction useStableSocket({\n options,\n createSocket,\n createSocketMemoKey: createOptionsMemoKey\n}) {\n const shouldReconnect = createOptionsMemoKey(options);\n const socketOptions = useMemo(() => {\n return options;\n }, [shouldReconnect]);\n const [socket, setSocket] = useState(() =>\n // only connect on first mount\n createSocket({ ...socketOptions, startClosed: true })\n );\n const socketInitializedRef = useRef2(null);\n const createSocketRef = useRef2(createSocket);\n createSocketRef.current = createSocket;\n useEffect2(() => {\n if (socketInitializedRef.current === socket) {\n const newSocket = createSocketRef.current({\n ...socketOptions,\n // when reconnecting because of options change, we always reconnect\n // (startClosed only applies to initial mount)\n startClosed: false\n });\n setSocket(newSocket);\n } else {\n if (!socketInitializedRef.current && socketOptions.startClosed !== true) {\n socket.reconnect();\n }\n socketInitializedRef.current = socket;\n return () => {\n socket.close();\n };\n }\n }, [socket, socketOptions]);\n return socket;\n}\n\n// src/use-ws.ts\nfunction useWebSocket(url, protocols, options = {}) {\n const socket = useStableSocket({\n options,\n createSocket: (options2) =>\n new ReconnectingWebSocket(url, protocols, options2),\n createSocketMemoKey: (options2) =>\n JSON.stringify([\n // will reconnect if url or protocols are specified as a string.\n // if they are functions, the WebSocket will handle reconnection\n url,\n protocols,\n ...getOptionsThatShouldCauseRestartWhenChanged(options2)\n ])\n });\n useAttachWebSocketEventHandlers(socket, options);\n return socket;\n}\n\nexport {\n useAttachWebSocketEventHandlers,\n getOptionsThatShouldCauseRestartWhenChanged,\n useStableSocket,\n useWebSocket\n};\n//# sourceMappingURL=chunk-PTE3YP23.mjs.map\n","import { PartySocket } from \"./chunk-7TNWDF55.mjs\";\nimport {\n getOptionsThatShouldCauseRestartWhenChanged,\n useAttachWebSocketEventHandlers,\n useStableSocket,\n useWebSocket\n} from \"./chunk-PTE3YP23.mjs\";\nimport \"./chunk-V6LO7DXK.mjs\";\n\n// src/react.ts\nfunction usePartySocket(options) {\n const { host, ...otherOptions } = options;\n const socket = useStableSocket({\n options: {\n host:\n host ||\n (typeof window !== \"undefined\"\n ? window.location.host\n : \"dummy-domain.com\"),\n ...otherOptions\n },\n createSocket: (options2) => new PartySocket(options2),\n createSocketMemoKey: (options2) =>\n JSON.stringify([\n // NOTE: if query is defined as a function, the socket\n // won't reconnect when you change the function identity\n options2.query,\n options2.id,\n options2.host,\n options2.room,\n options2.party,\n options2.path,\n options2.protocol,\n options2.protocols,\n options2.basePath,\n options2.prefix,\n ...getOptionsThatShouldCauseRestartWhenChanged(options2)\n ])\n });\n useAttachWebSocketEventHandlers(socket, options);\n return socket;\n}\nexport { usePartySocket as default, usePartySocket, useWebSocket };\n//# sourceMappingURL=react.mjs.map\n","import {\n\tMessageSchema,\n\tpartykitBaseUrl,\n\tpartykitRoom,\n\ttype Message,\n\ttype User,\n} from '@epic-web/workshop-presence/presence'\nimport { usePartySocket } from 'partysocket/react'\nimport {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseRef,\n\tuseState,\n} from 'react'\nimport { useParams } from 'react-router'\nimport { z } from 'zod'\nimport { useIsOnline } from './online.ts'\nimport { useRequestInfo, useRootLoaderData } from './root-loader.ts'\n\nexport * from '@epic-web/workshop-presence/presence'\n\nconst PresenceContext = createContext<ReturnType<\n\ttypeof usePresenceSocket\n> | null>(null)\n\nexport function usePresencePreferences() {\n\tconst data = useRootLoaderData()\n\treturn data?.preferences?.presence ?? null\n}\n\nexport function useOptionalWorkshopTitle() {\n\tconst data = useRootLoaderData()\n\treturn data?.workshopTitle ?? null\n}\n\nconst ExerciseAppParamsSchema = z.object({\n\ttype: z.union([z.literal('problem'), z.literal('solution')]).optional(),\n\texerciseNumber: z.coerce.number().finite(),\n\tstepNumber: z.coerce.number().finite().optional(),\n})\n\n/**\n * useFirstCallDelayedCallback\n *\n * This hook creates a callback that is delayed on its first call.\n * It's useful for scenarios where you want to delay the execution of a function\n * for a certain amount of time, but only on the initial call.\n *\n * If it's called again before the delay expires, then the prior call is ignored\n * and when the delay expires, the latest call is executed.\n *\n * The motivation here is that the server may get one set of presence and by the\n * time it shows up on the client it's stale. This delays the re-rendering of\n * the UI to avoid a flicker as soon as you land on the page.\n *\n * @param cb The callback function to be delayed\n * @param delay The delay in milliseconds before the callback is executed\n * @returns A new function that wraps the original callback with the delay logic\n */\nfunction useFirstCallDelayedCallback<Args extends unknown[]>(\n\tcb: (...args: Args) => void,\n\tdelay: number,\n) {\n\tconst [timedPromise] = useState(\n\t\t() => new Promise((resolve) => setTimeout(resolve, delay)),\n\t)\n\tconst mounted = useRef(true)\n\tconst currentCallRef = useRef<symbol | null>(null)\n\tconst lastCbRef = useRef(cb)\n\n\tuseEffect(() => {\n\t\tlastCbRef.current = cb\n\t}, [cb])\n\n\tconst delayedCb = useCallback(\n\t\t(...args: Args) => {\n\t\t\tconst thisOne = Symbol()\n\t\t\tcurrentCallRef.current = thisOne\n\t\t\tvoid timedPromise.then(() => {\n\t\t\t\tif (!mounted.current) return\n\t\t\t\tif (currentCallRef.current !== thisOne) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tlastCbRef.current(...args)\n\t\t\t})\n\t\t},\n\t\t[timedPromise],\n\t)\n\n\treturn delayedCb\n}\n\nfunction useUsersLocation() {\n\tconst workshopTitle = useOptionalWorkshopTitle()\n\tconst requestInfo = useRequestInfo()\n\tconst rawParams = useParams()\n\tconst paramsResult = ExerciseAppParamsSchema.safeParse(rawParams)\n\tconst params = paramsResult.success ? paramsResult.data : null\n\n\treturn {\n\t\tworkshopTitle,\n\t\torigin: requestInfo.origin,\n\t\t...(params\n\t\t\t? {\n\t\t\t\t\texercise: {\n\t\t\t\t\t\ttype: params.type,\n\t\t\t\t\t\texerciseNumber: params.exerciseNumber,\n\t\t\t\t\t\tstepNumber: params.stepNumber,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: null),\n\t} satisfies User['location']\n}\n\nfunction usePresenceSocket(user?: User | null) {\n\tconst prefs = usePresencePreferences()\n\tconst { userHasAccess = false, userId, presence } = useRootLoaderData() ?? {}\n\tconst [users, setUsers] = useState(presence?.users ?? [])\n\tconst usersLocation = useUsersLocation()\n\n\tconst handleMessage = useFirstCallDelayedCallback((evt: MessageEvent) => {\n\t\tconst messageResult = MessageSchema.safeParse(JSON.parse(String(evt.data)))\n\t\tif (!messageResult.success) return\n\t\tif (messageResult.data.type === 'presence') {\n\t\t\tsetUsers(messageResult.data.payload.users)\n\t\t}\n\t}, 2000)\n\n\tconst socket = usePartySocket({\n\t\thost: new URL(partykitBaseUrl).host,\n\t\troom: partykitRoom,\n\t\tonMessage: handleMessage,\n\t})\n\n\tlet message: Message | null = null\n\tif (user) {\n\t\tif (prefs?.optOut) {\n\t\t\tmessage = { type: 'remove-user', payload: { id: user.id } }\n\t\t} else {\n\t\t\tmessage = {\n\t\t\t\ttype: 'add-user',\n\t\t\t\tpayload: {\n\t\t\t\t\tid: user.id,\n\t\t\t\t\tname: user.name,\n\t\t\t\t\thasAccess: userHasAccess,\n\t\t\t\t\timageUrlSmall: user.imageUrlSmall,\n\t\t\t\t\timageUrlLarge: user.imageUrlLarge,\n\t\t\t\t\tlocation: usersLocation,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t} else if (userId?.id) {\n\t\tmessage = {\n\t\t\ttype: 'add-user',\n\t\t\tpayload: { id: userId.id, location: usersLocation },\n\t\t}\n\t}\n\n\tconst messageJson = message ? JSON.stringify(message) : null\n\tuseEffect(() => {\n\t\tif (messageJson) socket.send(messageJson)\n\t}, [messageJson, socket])\n\n\tconst scoredUsers = scoreUsers(\n\t\t{ id: userId?.id, location: usersLocation },\n\t\tusers,\n\t)\n\n\treturn { users: scoredUsers }\n}\n\nfunction scoreUsers(\n\tuser: { id?: string | null; location: User['location'] },\n\tusers: Array<User>,\n) {\n\tconst { location } = user\n\tconst scoredUsers = users.map((user) => {\n\t\tlet score = 0\n\t\tconst available = 5\n\t\tif (user.hasAccess) {\n\t\t\tscore += 1\n\t\t}\n\t\tif (location?.workshopTitle === user.location?.workshopTitle) {\n\t\t\tscore += 1\n\t\t\tif (\n\t\t\t\tlocation?.exercise?.exerciseNumber &&\n\t\t\t\tlocation.exercise.exerciseNumber ===\n\t\t\t\t\tuser.location?.exercise?.exerciseNumber\n\t\t\t) {\n\t\t\t\tscore += 1\n\t\t\t\tif (\n\t\t\t\t\tlocation.exercise.stepNumber &&\n\t\t\t\t\tlocation.exercise.stepNumber === user.location.exercise.stepNumber\n\t\t\t\t) {\n\t\t\t\t\tscore += 1\n\t\t\t\t\tif (\n\t\t\t\t\t\tlocation.exercise.type &&\n\t\t\t\t\t\tlocation.exercise.type === user.location.exercise.type\n\t\t\t\t\t) {\n\t\t\t\t\t\tscore += 1\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { user, score: Math.floor((score / available) * 10) / 10 }\n\t})\n\treturn scoredUsers.sort((a, b) => {\n\t\tif (a.user.id === user?.id) return -1\n\t\tif (b.user.id === user?.id) return 1\n\t\tif (a.score === b.score) return 0\n\t\treturn a.score > b.score ? -1 : 1\n\t})\n}\n\nfunction PresenceOnline({\n\tuser,\n\tchildren,\n}: {\n\tuser?: User | null\n\tchildren: React.ReactNode\n}) {\n\treturn (\n\t\t<PresenceContext.Provider value={usePresenceSocket(user)}>\n\t\t\t{children}\n\t\t</PresenceContext.Provider>\n\t)\n}\n\nfunction PresenceOffline({\n\tuser,\n\tchildren,\n}: {\n\tuser?: User | null\n\tchildren: React.ReactNode\n}) {\n\tconst usersLocation = useUsersLocation()\n\tconst { presence } = useRootLoaderData() ?? {}\n\treturn (\n\t\t<PresenceContext.Provider\n\t\t\tvalue={{\n\t\t\t\tusers: scoreUsers(\n\t\t\t\t\t{ id: user?.id, location: usersLocation },\n\t\t\t\t\tpresence?.users ?? [],\n\t\t\t\t),\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</PresenceContext.Provider>\n\t)\n}\n\nexport function Presence({\n\tuser,\n\tchildren,\n}: {\n\tuser?: User | null\n\tchildren: React.ReactNode\n}) {\n\tconst isOnline = useIsOnline()\n\tif (isOnline) {\n\t\treturn <PresenceOnline user={user}>{children}</PresenceOnline>\n\t} else {\n\t\treturn <PresenceOffline user={user}>{children}</PresenceOffline>\n\t}\n}\n\nexport function usePresence() {\n\tconst presence = useContext(PresenceContext)\n\tif (!presence) {\n\t\tthrow new Error('usePresence must be used within a PresenceProvider')\n\t}\n\treturn presence\n}\n"],"names":["DIALOG_NAME","createDialogContext","createContextScope","DialogProvider","useDialogContext","Dialog","props","__scopeDialog","children","openProp","defaultOpen","onOpenChange","modal","triggerRef","React.useRef","contentRef","open","setOpen","useControllableState","jsx","useId","React.useCallback","prevOpen","TRIGGER_NAME","DialogTrigger","React.forwardRef","forwardedRef","triggerProps","context","composedTriggerRef","useComposedRefs","Primitive","getState","composeEventHandlers","PORTAL_NAME","PortalProvider","usePortalContext","DialogPortal","forceMount","container","React.Children","child","Presence","PortalPrimitive","OVERLAY_NAME","DialogOverlay","portalContext","overlayProps","DialogOverlayImpl","Slot","createSlot","RemoveScroll","CONTENT_NAME","DialogContent","contentProps","DialogContentModal","DialogContentNonModal","composedRefs","React.useEffect","content","hideOthers","DialogContentImpl","event","originalEvent","ctrlLeftClick","hasInteractedOutsideRef","hasPointerDownOutsideRef","target","trapFocus","onOpenAutoFocus","onCloseAutoFocus","useFocusGuards","jsxs","Fragment","FocusScope","DismissableLayer","TitleWarning","DescriptionWarning","TITLE_NAME","DialogTitle","titleProps","DESCRIPTION_NAME","DialogDescription","descriptionProps","CLOSE_NAME","DialogClose","closeProps","TITLE_WARNING_NAME","WarningProvider","useWarningContext","createContext","titleId","titleWarningContext","MESSAGE","DESCRIPTION_WARNING_NAME","descriptionId","describedById","Root","Trigger","Portal","Overlay","Content","Title","Description","Close","DialogPrimitive.Root","DialogPrimitive.Trigger","DialogPrimitive.Portal","className","ref","DialogPrimitive.Overlay","cn","DialogPrimitive.Content","DialogPrimitive.Close","Icon","DialogHeader","DialogPrimitive.Title","DialogPrimitive.Description","partykitRoom","partykitBaseUrl","UserSchema","z.object","z.string","z.boolean","z.union","z.literal","z.number","MessageSchema","z.array","ErrorEvent","error","CloseEvent","code","reason","Events","assert","condition","msg","cloneEventBrowser","cloneEventNode","_a","isNode","cloneEvent","DEFAULT","didWarnAboutMissingWebSocket","ReconnectingWebSocket","_ReconnectingWebSocket","url","protocols","options","value","acc","message","data","maxEnqueuedMessages","args","reconnectionDelayGrowFactor","minReconnectionDelay","maxReconnectionDelay","delay","resolve","protocolsProvider","urlProvider","maxRetries","connectionTimeout","WS","err","minUptime","_a2","valueIsNotNil","keyValuePair","generateUUID","d","d2","c","r","getPartyInfo","partySocketOptions","defaultProtocol","defaultParams","rawHost","rawPath","rawProtocol","room","party","basePath","prefix","query","host","name","path","protocol","baseUrl","makeUrl","query2","PartySocket","_b","wsOptions","getWSOptions","_pk","_pkurl","init","id","_host","_path","_party","_room","_protocol","_query","socketOptions","useAttachWebSocketEventHandlers","socket","handlersRef","useRef","useEffect","onOpen","onMessage","onClose","onError","getOptionsThatShouldCauseRestartWhenChanged","useStableSocket","createSocket","createOptionsMemoKey","shouldReconnect","useMemo","setSocket","useState","socketInitializedRef","useRef2","createSocketRef","useEffect2","newSocket","usePartySocket","otherOptions","options2","PresenceContext","usePresencePreferences","useRootLoaderData","useOptionalWorkshopTitle","ExerciseAppParamsSchema","z.coerce","useFirstCallDelayedCallback","cb","timedPromise","mounted","currentCallRef","lastCbRef","useCallback","thisOne","useUsersLocation","workshopTitle","requestInfo","useRequestInfo","rawParams","useParams","paramsResult","params","usePresenceSocket","user","prefs","userHasAccess","userId","presence","users","setUsers","usersLocation","handleMessage","evt","messageResult","messageJson","scoreUsers","location","score","available","a","b","PresenceOnline","PresenceOffline","useIsOnline","usePresence","useContext"],"mappings":"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","x_google_ignoreList":[0,3,4,5,6]}
|