@epic-web/workshop-app 6.70.0 → 6.71.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/client/assets/{_exerciseNumber-DNg1F_Vn.js → _exerciseNumber-DOydVFcz.js} +2 -2
- package/build/client/assets/{_exerciseNumber-DNg1F_Vn.js.map → _exerciseNumber-DOydVFcz.js.map} +1 -1
- package/build/client/assets/{_exerciseNumber_.finished-BmUlhiS8.js → _exerciseNumber_.finished-OYmKydkm.js} +2 -2
- package/build/client/assets/{_exerciseNumber_.finished-BmUlhiS8.js.map → _exerciseNumber_.finished-OYmKydkm.js.map} +1 -1
- package/build/client/assets/{_extra-fwsy2qkP.js → _extra-DAAdPX1Q.js} +2 -2
- package/build/client/assets/{_extra-fwsy2qkP.js.map → _extra-DAAdPX1Q.js.map} +1 -1
- package/build/client/assets/_layout-BQ8VYaze.js +2 -0
- package/build/client/assets/_layout-BQ8VYaze.js.map +1 -0
- package/build/client/assets/{_layout-C-j5TKNx.js → _layout-CeuWC4em.js} +2 -2
- package/build/client/assets/{_layout-C-j5TKNx.js.map → _layout-CeuWC4em.js.map} +1 -1
- package/build/client/assets/{diff-DC-wn6-x.js → diff-CLewaNfR.js} +2 -2
- package/build/client/assets/{diff-DC-wn6-x.js.map → diff-CLewaNfR.js.map} +1 -1
- package/build/client/assets/{diff-BhWzqoVN.js → diff-DrdM1MAZ.js} +2 -2
- package/build/client/assets/{diff-BhWzqoVN.js.map → diff-DrdM1MAZ.js.map} +1 -1
- package/build/client/assets/{epic-video-8Hv_HMMr.js → epic-video-BO6oqwle.js} +2 -2
- package/build/client/assets/{epic-video-8Hv_HMMr.js.map → epic-video-BO6oqwle.js.map} +1 -1
- package/build/client/assets/{epic-video-D0drHmgC.js → epic-video-Ca_s42j5.js} +2 -2
- package/build/client/assets/{epic-video-D0drHmgC.js.map → epic-video-Ca_s42j5.js.map} +1 -1
- package/build/client/assets/{finished-Cr3pXmrH.js → finished-CqdoWQ9b.js} +2 -2
- package/build/client/assets/{finished-Cr3pXmrH.js.map → finished-CqdoWQ9b.js.map} +1 -1
- package/build/client/assets/guide-Cinib8Ji.js +9 -0
- package/build/client/assets/guide-Cinib8Ji.js.map +1 -0
- package/build/client/assets/{index-wDjETrF-.js → index-BHfJ4hna.js} +2 -2
- package/build/client/assets/{index-wDjETrF-.js.map → index-BHfJ4hna.js.map} +1 -1
- package/build/client/assets/{index-hhQHCvb9.js → index-BRVfMMSd.js} +2 -2
- package/build/client/assets/{index-hhQHCvb9.js.map → index-BRVfMMSd.js.map} +1 -1
- package/build/client/assets/index-CdzVFL-Z.js.map +1 -1
- package/build/client/assets/index-DuFMeXSm.js +2 -0
- package/build/client/assets/index-DuFMeXSm.js.map +1 -0
- package/build/client/assets/{index-BKAVQvm5.js → index-o922xZRF.js} +2 -2
- package/build/client/assets/{index-BKAVQvm5.js.map → index-o922xZRF.js.map} +1 -1
- package/build/client/assets/{manifest-e2f9a54b.js → manifest-cb3787c7.js} +1 -1
- package/build/client/assets/{mdx-BzyhMqFg.js → mdx-BGwe7vvs.js} +2 -2
- package/build/client/assets/{mdx-BzyhMqFg.js.map → mdx-BGwe7vvs.js.map} +1 -1
- package/build/client/assets/{progress-By6-_9Ii.js → progress-ILaVQtOO.js} +2 -2
- package/build/client/assets/{progress-By6-_9Ii.js.map → progress-ILaVQtOO.js.map} +1 -1
- package/build/client/assets/{root-BkPGxm0k.js → root-BwuJUAM7.js} +2 -2
- package/build/client/assets/{root-BkPGxm0k.js.map → root-BwuJUAM7.js.map} +1 -1
- package/build/client/assets/tailwind-C1_1LEqo.css +1 -0
- package/build/client/assets/{test-DtQCjBBX.js → test-CvHPFyBI.js} +2 -2
- package/build/client/assets/{test-DtQCjBBX.js.map → test-CvHPFyBI.js.map} +1 -1
- package/build/client/assets/{tests-fDISNsE-.js → tests-DlDV-wXQ.js} +2 -2
- package/build/client/assets/{tests-fDISNsE-.js.map → tests-DlDV-wXQ.js.map} +1 -1
- package/build/server/index.js +280 -36
- package/build/server/index.js.map +1 -1
- package/package.json +3 -3
- package/build/client/assets/_layout-BLOYb3Iq.js +0 -2
- package/build/client/assets/_layout-BLOYb3Iq.js.map +0 -1
- package/build/client/assets/guide-B4wAqzq_.js +0 -9
- package/build/client/assets/guide-B4wAqzq_.js.map +0 -1
- package/build/client/assets/index-AMZhCeTP.js +0 -2
- package/build/client/assets/index-AMZhCeTP.js.map +0 -1
- package/build/client/assets/tailwind-D_K12wB7.css +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@epic-web/workshop-app",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.71.1",
|
|
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.
|
|
46
|
-
"@epic-web/workshop-utils": "6.
|
|
45
|
+
"@epic-web/workshop-presence": "6.71.1",
|
|
46
|
+
"@epic-web/workshop-utils": "6.71.1",
|
|
47
47
|
"@mdx-js/mdx": "^3.1.1",
|
|
48
48
|
"@mux/mux-player-react": "^3.10.2",
|
|
49
49
|
"@nasa-gcn/remix-seo": "^2.0.1",
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{w as He,b as re,O as Te,L as i,i as me,u as xe,p}from"./chunk-EPOLDU6W-BCLmut3y.js";import{j as e}from"./jsx-runtime-C5WNSv3b.js";import{c as f,I as j,a as x,n as T,o as P}from"./misc-W4055b-0.js";import{r as C}from"./index-CqIc3cxq.js";import{a as $e}from"./pe-CIZUOJMr.js";import{u as ae,O as q}from"./onboarding-indicator-B-XR90_G.js";import{L as X}from"./product-CvyMpYD_.js";import{u as Be}from"./revalidation-ws-BJWJviUX.js";import{S as R}from"./status-indicator-C6DiLYL5.js";import{D as ze,f as Ue,a as Ve,b as Fe,d as We}from"./dialog-CzO65Z5w.js";import{R as Re,T as Ye,P as qe,C as Qe}from"./index-CmflCPTU.js";import{S as A,m as Ke,T as Z,j as M,k as ee}from"./tooltip-Tlsyx2YO.js";import{c as K,b as Oe}from"./user-BsPobzjB.js";import{u as pe}from"./workshop-config-Zfc8zU0x.js";import{u as ge}from"./online-DiNLkgTC.js";import{u as oe,g as je,p as Je}from"./presence-VCvV2mg7.js";import{b as be,a as ve}from"./root-loader-BOzEMapJ.js";import{b as Ge,s as we,c as Xe,d as Ze,e as ye,m as h,u as Me,f as et}from"./progress-By6-_9Ii.js";import{T as le}from"./index-CdzVFL-Z.js";import"./schemas-Uj5SZtvt.js";import"./index-ynYvVAOK.js";import"./index-vDCSPjrM.js";import"./coerce-CkHW0SMv.js";function tt(t){t.values.forEach(n=>n.stop())}function se(t,n){[...n].reverse().forEach(o=>{const a=t.getVariant(o);a&&we(t,a),t.variantChildren&&t.variantChildren.forEach(l=>{se(l,n)})})}function st(t,n){if(Array.isArray(n))return se(t,n);if(typeof n=="string")return se(t,[n]);we(t,n)}function nt(){const t=new Set,n={subscribe(s){return t.add(s),()=>void t.delete(s)},start(s,o){const a=[];return t.forEach(l=>{a.push(Ge(l,s,{transitionOverride:o}))}),Promise.all(a)},set(s){return t.forEach(o=>{st(o,s)})},stop(){t.forEach(s=>{tt(s)})},mount(){return()=>{n.stop()}}};return n}function ne(){const t=Xe(nt);return Ze(t.mount,[]),t}function rt(t,n){function s(){return window.matchMedia(t).matches}function o(a){const l=window.matchMedia(t);return l.addEventListener("change",a),()=>{l.removeEventListener("change",a)}}return function(){return C.useSyncExternalStore(o,s,()=>n)}}function Ne({...t}){return e.jsx(Re,{...t})}function Q({...t}){return e.jsx(Ye,{...t})}function ke({className:t,align:n="center",sideOffset:s=4,...o}){return e.jsx(qe,{children:e.jsx(Qe,{align:n,sideOffset:s,className:f("bg-popover text-popover-foreground 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-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 rounded-md border p-2 shadow-md outline-none",t),...o})})}const ue=["opacity-70","opacity-80","opacity-90","opacity-100"],fe=["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 he(t){const n=Math.round(t*ue.length-1),s=Math.round(t*fe.length-1);return f("shadow-highlight hover:opacity-100 focus:opacity-100",ue[n]??"opacity-60",fe[s]??"shadow-none",t===1?"animate-pulse hover:animate-none focus:animate-none":null)}function Ce({isMenuOpened:t}){const n=K(),{users:s}=oe(),{product:{displayNameShort:o}}=pe(),a=t?17:0,l=s.length-a,d=l>(t?1:0);if(!s.length)return null;const m=t&&s.length===1?e.jsx(i,{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",he(1)),src:"/img/tiffany.png"})}):null,g=`${l}${t?" more ":" "}${o} Dev${l===1?"":"s"} working now`;return e.jsx("div",{className:"flex flex-wrap items-center gap-2",children:e.jsxs(Ke,{children:[(d?s.slice(0,a):s).map(({user:u,score:L})=>{const E=he(L),b=ot(u),w=u.imageUrlSmall||u.avatarUrl,H=u.hasAccess,$=b.some(S=>S.origin?.includes("localhost")),v=lt(b),y=at(u.loggedInProductHosts);if(u.optOut)return e.jsxs(Z,{children:[e.jsx(M,{asChild:!0,tabIndex:0,children:e.jsx("div",{className:"relative","aria-label":"Anonymous user (opted out)",children:e.jsx("div",{className:f("bg-muted flex h-8 w-8 items-center justify-center rounded-full border opacity-50"),children:e.jsx(j,{name:"User"})})})}),e.jsx(ee,{children:e.jsx("span",{className:"flex flex-col items-center justify-center gap-1",children:e.jsxs("span",{className:"flex items-center gap-1.5",children:[y?e.jsx("span",{className:"text-xs",children:y}):null,"Anonymous (opted out of sharing)"]})})})]},u.id);let I;return H?I=$?"working":"referencing":I=$?"previewing":"reviewing",e.jsxs(Z,{children:[e.jsx(M,{asChild:!0,tabIndex:0,children:e.jsxs("div",{className:"relative","aria-label":u.name||`${o} Dev`,children:[w?e.jsx("img",{alt:u.name||o,className:f("h-8 w-8 rounded-full border object-cover",E),src:w}):e.jsx("div",{className:f("flex h-8 w-8 items-center justify-center rounded-full border",E),children:e.jsx(j,{name:"User"})}),v?e.jsx("span",{className:"absolute -top-1 -left-1 text-xs leading-none","aria-label":"Workshop products",children:v}):null]})}),e.jsx(ee,{children:e.jsxs("span",{className:"flex flex-col items-center justify-center gap-1",children:[e.jsxs("span",{className:"flex items-center gap-1.5",children:[y?e.jsx("span",{className:"text-xs",children:y}):null,u.name||`${o} Dev`,b.length>0?` is ${I} ${L===1&&n?.id!==u.id?"with you":""} on`:null]}),b.map((S,N)=>{const k=it(S);return k?e.jsxs("span",{className:f("flex flex-col items-center",b.length>1?"border-border mt-1 border-t pt-1 first:mt-0 first:border-t-0 first:pt-0":""),children:[k.line1?e.jsxs("span",{children:[je(S.productHost)," ",k.line1]}):null,k.line2?e.jsx("span",{className:"text-muted-foreground text-xs",children:k.line2}):null]},`${S.workshopTitle}-${N}`):null})]})})]},u.id)}),m,d?e.jsxs(Z,{children:[e.jsx(M,{asChild:!0,tabIndex:0,children:e.jsx("div",{"aria-label":g,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 truncate text-center",t?"w-8":"w-6"),children:t?`+${l}`:l})})}),e.jsx(ee,{children:g})]}):null]})})}function at(t){return!t||t.length===0?null:t.map(n=>Je[n]).filter(Boolean).join(" ")}function ot(t){return t.locations&&t.locations.length>0?t.locations.filter(Boolean):t.location?[t.location]:[]}function lt(t){const n=new Set;for(const s of t)s.productHost&&n.add(s.productHost);return n.size===0?null:Array.from(n).map(s=>je(s)).filter(Boolean).join("")}function Ee(t){return t.some(n=>{const s=n.relativePath.split(/[\\/]/)[0];return s==="extra"||s==="example"||s==="examples"})}const Se=rt("(min-width: 640px)",!0),$t=He(function(){const n=re(),s=K(),o=Se(),a=$e(),[l,d]=C.useState(n.isMenuOpened);Be({watchPaths:["./exercises/README.mdx","./extra","./example","./examples"]});function m(g){d(g),document.cookie=`es_menu_open=${g.toString()}; path=/; SameSite=Lax;`}return e.jsxs("div",{className:"flex flex-col",children:[s?null:e.jsx(ct,{}),a&&o?null:e.jsx(ut,{isMenuOpened:l,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))]":!s,"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))]":s,"h-[unset]":!o&&l}),children:[o?e.jsx(ft,{isMenuOpened:l,onMenuOpenChange:m}):null,e.jsx("div",{className:f("h-full w-full max-w-full sm:max-w-[calc(100%-56px)]",l?"hidden md:block":""),children:e.jsx(Te,{})})]})]})});function it(t){if(!t)return null;const{exercise:n}=t,s=[n?[n.exerciseNumber,n.stepNumber].filter(Boolean).map(o=>o.toString().padStart(2,"0")).join("/"):null,n?.type].filter(Boolean).join(" - ");return{line1:t.workshopTitle,line2:s}}function ct(){const t=Se(),{product:{host:n,displayName:s}}=pe(),o=Oe(),[a,l]=ae("login-button"),d=e.jsx("div",{children:ENV.EPICSHOP_DEPLOYED?e.jsxs("div",{children:["This is the deployed version. ",e.jsxs(e.Fragment,{children:[e.jsx(i,{className:"underline",target:"_blank",rel:"noopener noreferrer",to:ENV.EPICSHOP_GITHUB_REPO,children:"Run locally"})," for full experience."]})," "]}):o?e.jsxs("div",{children:[e.jsx(i,{to:"/login",className:"underline",children:"Login"})," ","or"," ",e.jsx("a",{href:`https://${n}/login`,className:"underline",children:"join for free"})," ","for the full experience."]}):null});return e.jsx("div",{className:"from-highlight to-info text-info-foreground z-10 flex h-16 items-center justify-between border-b bg-linear-to-tr pl-4",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(X,{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(i,{to:`https://${n}`,className:"underline",target:"_blank",children:s})," ","Workshop app!"]}),d]})]}),o?null:e.jsxs("div",{className:"hidden h-full flex-col items-center sm:flex md:flex-row",children:[e.jsxs(i,{to:`https://${n}`,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 ",s]}),e.jsx("span",{children:"↗︎"})]}),e.jsxs(i,{to:ENV.EPICSHOP_DEPLOYED?`https://${n}/login`:"/login",className:"bg-info-foreground/20 hover:bg-info-foreground/30 relative flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold shadow-md transition",onClick:l,children:[e.jsx(j,{name:"User",size:"lg"}),e.jsx("span",{className:"drop-shadow-sm",children:"Login"}),a?e.jsx(q,{tooltip:"Login for the full experience!",size:"sm"}):null]})]})]}):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://${n}`,children:e.jsx(X,{size:"lg",style:"monochrome"})}),e.jsxs(ze,{children:[e.jsx(Ue,{children:e.jsx(j,{name:"Question",size:"lg",className:"animate-pulse"})}),e.jsxs(Ve,{children:[e.jsxs(Fe,{children:[e.jsx(X,{size:"lg",style:"monochrome"}),e.jsx("span",{className:"text-lg font-semibold",children:s})]}),e.jsxs(We,{children:["Welcome to the"," ",e.jsx(i,{to:`https://${n}`,className:"underline",children:s})," ","Workshop app!"]}),d]})]})]}),o?null:e.jsxs("div",{className:"flex h-full items-center",children:[e.jsxs(i,{to:`https://${n}`,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(i,{to:ENV.EPICSHOP_DEPLOYED?`https://${n}/login`:"/login",className:"bg-info-foreground/20 hover:bg-info-foreground/30 relative flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold shadow-md transition",onClick:l,children:[e.jsx(j,{name:"User",size:"lg"}),e.jsx("span",{className:"drop-shadow-sm",children:"Login"}),a?e.jsx(q,{tooltip:"Login for the full experience!",size:"sm"}):null]})]})]})})}const ie={hidden:{opacity:0,x:-20},visible:{opacity:1,x:0}};function Pe({exerciseNumber:t,children:n}){const s=Me(t);return e.jsx(h.li,{variants:ie,className:f("py-[6px] first:pt-3 last:pb-3",s?`${s} before:border-t`:null),children:e.jsx("span",{className:"inline-block pl-2",children:n})})}function z({children:t,...n}){const s=et(n);return e.jsx(h.li,{variants:ie,className:f("py-[6px] first:pt-3 last:pb-3",s?`${s} before:border-t`:null),children:e.jsx("span",{className:"inline-block pl-2",children:t})})}function Le({children:t}){return e.jsx(h.li,{variants:ie,className:"py-[6px] first:pt-3 last:pb-3",children:e.jsx("span",{className:"inline-block pl-2",children:t})})}const dt='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-[""]';function U(t,n){return x(dt,n,{"bg-foreground text-background":t})}function ut({isMenuOpened:t,onMenuOpenChange:n}){const s=re(),o=be(),a=K(),l=ye(),d=me(),m=xe(),g=ge(),{users:u}=oe(),[L,E]=ae("account-link"),b=Ee(o),w=s.extras.find(c=>c.name===s.playground.appName),H=m.pathname==="/extra"||m.pathname.startsWith("/extra/"),$=!!w&&!H,v={visible:{opacity:1,transition:{duration:.05,when:"beforeChildren",staggerChildren:.03}},hidden:{opacity:0}};C.useCallback(()=>{typeof window>"u"||window.dispatchEvent(new CustomEvent("toggle-keyboard-shortcuts"))},[]);const I=ve().session.theme??"system",S={light:"Light",dark:"Dark",system:"System"}[I],[N,k]=C.useState(!1);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(De,{title:s.workshopTitle,isMenuOpened:t,setMenuOpened:n}),t&&e.jsxs(h.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(h.ul,{variants:v,initial:"hidden",animate:"visible",className:"flex flex-col",children:[e.jsx("span",{children:e.jsx(p,{prefetch:"intent",to:"/",className:({isActive:c})=>x("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":c}),children:"Home"})}),s.exercises.map(({exerciseNumber:c,title:V,steps:O})=>{const _=Number(d.exerciseNumber)===c,J=!_&&s.playground.exerciseNumber===c;return e.jsxs(Pe,{exerciseNumber:c,children:[e.jsxs("span",{className:"flex items-center gap-1 text-2xl font-bold",children:[e.jsx(i,{prefetch:"intent",to:T(c),className:x("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":_}),children:V}),J?e.jsx(i,{to:P(s.playground.exerciseNumber,s.playground.stepNumber,s.playground.type),prefetch:"intent",children:"🛝"}):null]}),_?e.jsxs(h.ul,{variants:v,initial:"hidden",animate:"visible",className:"mt-2 ml-4 flex flex-col",children:[e.jsx(z,{type:"instructions",exerciseNumber:c,children:e.jsx(i,{to:T(c),prefetch:"intent",className:x('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":!d.stepNumber}),children:"Intro"})},c),O.filter(Boolean).map(({stepNumber:r,title:F,problem:Y,solution:B})=>e.jsx(z,{type:"step",stepNumber:r,exerciseNumber:c,children:e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsxs(i,{to:P(c,r),prefetch:"intent",className:"leading-tight font-semibold",children:[r.toString().padStart(2,"0"),"."," ",F]}),e.jsxs("div",{className:"mt-0.5 ml-3 flex gap-1",children:[Y&&e.jsxs(p,{to:P(c,r,"problem"),prefetch:"intent",className:({isActive:W})=>U(W),children:["Problem",Y.name===s.playground.appName?" 🛝":""]}),B&&e.jsxs(p,{to:P(c,r,"solution"),prefetch:"intent",className:({isActive:W})=>U(W),children:["Solution",B.name===s.playground.appName?" 🛝":""]})]})]})},r)),e.jsx(z,{type:"finished",exerciseNumber:c,children:e.jsx(p,{to:T(c,"finished"),prefetch:"intent",className:({isActive:r})=>x('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":r}),children:"📝 Elaboration"})})]}):null]},c)}),b?e.jsxs("span",{children:[e.jsxs("span",{className:"flex items-center gap-1 text-2xl font-bold",children:[e.jsx(p,{to:"/extra",prefetch:"intent",className:({isActive:c})=>x("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":c}),children:"📚 Extras"}),$&&w?e.jsx(i,{to:`/extra/${w.dirName}`,prefetch:"intent",children:"🛝"}):null]}),H&&s.extras.length?e.jsx(h.ul,{variants:v,initial:"hidden",animate:"visible",className:"mt-2 ml-4 flex flex-col",children:s.extras.map(c=>e.jsx(Le,{children:e.jsxs(p,{to:`/extra/${c.dirName}`,prefetch:"intent",className:({isActive:V})=>U(V,"leading-tight font-semibold"),children:[c.title,c.name===s.playground.appName?" 🛝":""]})},c.dirName))}):null]}):null]}),e.jsx("div",{className:"mt-6",children:e.jsx(p,{to:"/finished",className:({isActive:c})=>x("relative text-lg font-bold whitespace-nowrap outline-none hover:underline focus:underline",{'after:bg-background bg-foreground text-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-[""]':c}),children:"📝 Workshop Feedback"})})]}),e.jsx("div",{className:"grow"}),g?null:e.jsx(A,{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(j,{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&&u.length>4?"min-h-14":"h-14",t?"w-full border-t":"border-l"),children:e.jsx(Ce,{isMenuOpened:t})}),ENV.EPICSHOP_DEPLOYED?null:a?e.jsx(A,{content:t?null:"Your account",children:e.jsxs(i,{className:f("relative 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",onClick:E,children:[a.imageUrlSmall?e.jsx("img",{alt:a.name??a.email,src:a.imageUrlSmall,className:"h-full rounded-full"}):e.jsx(j,{name:"User",className:"shrink-0",size:"lg"}),t?e.jsx(h.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"}),L?e.jsx(q,{tooltip:"View your account and preferences",size:"sm"}):null]})}):null,ENV.EPICSHOP_DEPLOYED?null:a&&l?e.jsx(A,{content:t?null:"Continue to next lesson",children:e.jsxs(i,{to:l,prefetch:"intent",className:x("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(j,{name:"FastForward",className:"shrink-0",size:"md"}),t?e.jsx(h.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 items-center justify-center gap-2 self-start p-4 sm:mb-4",{"w-full border-t":t,"w-14 border-l":!t}),children:t?e.jsxs(e.Fragment,{children:[e.jsx(le,{}),e.jsx(Ie,{status:s.sidecarStatus})]}):e.jsxs(Ne,{open:N,onOpenChange:k,children:[s.sidecarStatus?.hasFailure?e.jsx(Q,{asChild:!0,children:e.jsx("button",{type:"button","aria-label":"Process error - click to see details",title:N?void 0:"Process error - click to see details",className:"text-muted-foreground hover:text-foreground hover:bg-muted flex h-8 w-8 items-center justify-center rounded-md transition-colors",children:e.jsx(R,{status:"failed"})})}):e.jsx(Q,{asChild:!0,children:e.jsx("button",{type:"button","aria-label":"More options",title:N?void 0:"More options",className:"text-muted-foreground hover:text-foreground hover:bg-muted flex h-8 w-8 items-center justify-center rounded-md transition-colors",children:e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[e.jsx("circle",{cx:"5",cy:"10",r:"1.5",fill:"currentColor"}),e.jsx("circle",{cx:"10",cy:"10",r:"1.5",fill:"currentColor"}),e.jsx("circle",{cx:"15",cy:"10",r:"1.5",fill:"currentColor"})]})})}),e.jsxs(ke,{side:"top",align:"start",className:"flex flex-col gap-1 p-2",children:[e.jsx(_e,{themeLabel:S,disableTooltip:N}),s.sidecarStatus?e.jsxs(i,{to:"/admin",className:"hover:bg-muted flex items-center gap-3 rounded-md px-2 py-1.5 text-sm transition-colors",children:[e.jsx("div",{className:"flex h-5 w-5 items-center justify-center",children:e.jsx(R,{status:s.sidecarStatus.hasFailure?"failed":"running"})}),e.jsxs("span",{className:"flex-1 text-left",children:["Sidecar process"," ",s.sidecarStatus.hasFailure?"error":"running"]})]}):null]})]})})]})})})}const te=400;function Ie({status:t}){return t?e.jsx(A,{content:t.hasFailure?`${t.failureCount} sidecar${t.failureCount===1?"":"s"} failed`:"All sidecars running",children:e.jsx(i,{to:"/admin",className:"text-muted-foreground hover:text-foreground hover:bg-muted flex h-8 w-8 items-center justify-center rounded-md transition-colors",children:e.jsx(R,{status:t.hasFailure?"failed":"running"})})}):null}function ft({isMenuOpened:t,onMenuOpenChange:n}){const s=re(),o=be(),a=K(),l=ye(),d=me(),m=xe(),g=ge(),{users:u}=oe(),[L,E]=ae("account-link"),b=Ee(o),w=s.extras.find(r=>r.name===s.playground.appName),H=m.pathname==="/extra"||m.pathname.startsWith("/extra/"),$=!!w&&!H,v=s.exercises.find(r=>r.exerciseNumber===Number(d.exerciseNumber)),y=d.type==="solution"?v?.solutions.find(r=>r.stepNumber===Number(d.stepNumber)):d.type==="problem"?v?.problems.find(r=>r.stepNumber===Number(d.stepNumber)):null,I=ne(),S={close:{width:56},open:{width:te}},N={visible:{opacity:1,transition:{duration:.05,when:"beforeChildren",staggerChildren:.03}},hidden:{opacity:0}},k=C.useCallback(()=>{typeof window>"u"||window.dispatchEvent(new CustomEvent("toggle-keyboard-shortcuts"))},[]),V=ve().session.theme??"system",O={light:"Light",dark:"Dark",system:"System"}[V],[_,J]=C.useState(!1);return e.jsx("nav",{className:"hidden border-r sm:flex",children:e.jsx(h.div,{initial:t?"open":"close",variants:S,animate:I,children:e.jsxs("div",{className:"flex h-full flex-col items-center justify-between",children:[e.jsx(De,{title:s.workshopTitle,menuControls:I,isMenuOpened:t,setMenuOpened:n}),t&&e.jsxs(h.div,{style:{width:te},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(h.ul,{variants:N,initial:"hidden",animate:"visible",className:"flex flex-col",children:[e.jsx("span",{children:e.jsx(p,{prefetch:"intent",to:"/",className:({isActive:r})=>x("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"})}),s.exercises.map(({exerciseNumber:r,title:F,steps:Y})=>{const B=Number(d.exerciseNumber)===r,W=!B&&s.playground.exerciseNumber===r;return e.jsxs(Pe,{exerciseNumber:r,children:[e.jsxs("span",{className:"flex items-center gap-1 text-2xl font-bold",children:[e.jsx(i,{prefetch:"intent",to:T(r),className:x("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:F}),W?e.jsx(i,{to:P(s.playground.exerciseNumber,s.playground.stepNumber,s.playground.type),prefetch:"intent",children:"🛝"}):null]}),B?e.jsxs(h.ul,{variants:N,initial:"hidden",animate:"visible",className:"mt-2 ml-4 flex flex-col",children:[e.jsx(z,{type:"instructions",exerciseNumber:r,children:e.jsx(i,{to:T(r),prefetch:"intent",className:x('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":!d.stepNumber}),children:"Intro"})},r),Y.filter(Boolean).map(({stepNumber:D,title:Ae,problem:ce,solution:de})=>e.jsx(z,{type:"step",stepNumber:D,exerciseNumber:r,children:e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsxs(i,{to:P(r,D),prefetch:"intent",className:"leading-tight font-semibold",children:[D.toString().padStart(2,"0"),"."," ",Ae]}),e.jsxs("div",{className:"mt-0.5 ml-3 flex gap-1",children:[ce&&e.jsxs(p,{to:P(r,D,"problem"),prefetch:"intent",className:({isActive:G})=>U(G),children:["Problem",ce.name===s.playground.appName?" 🛝":""]}),de&&e.jsxs(p,{to:P(r,D,"solution"),prefetch:"intent",className:({isActive:G})=>U(G),children:["Solution",de.name===s.playground.appName?" 🛝":""]})]})]})},D)),e.jsx(z,{type:"finished",exerciseNumber:r,children:e.jsx(p,{to:T(r,"finished"),prefetch:"intent",className:({isActive:D})=>x('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":D}),children:"📝 Elaboration"})})]}):null]},r)}),b?e.jsxs("span",{children:[e.jsxs("span",{className:"flex items-center gap-1 text-2xl font-bold",children:[e.jsx(p,{to:"/extra",prefetch:"intent",className:({isActive:r})=>x("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":r}),children:"📚 Extras"}),$&&w?e.jsx(i,{to:`/extra/${w.dirName}`,prefetch:"intent",children:"🛝"}):null]}),H&&s.extras.length?e.jsx(h.ul,{variants:N,initial:"hidden",animate:"visible",className:"mt-2 ml-4 flex flex-col",children:s.extras.map(r=>e.jsx(Le,{children:e.jsxs(p,{to:`/extra/${r.dirName}`,prefetch:"intent",className:({isActive:F})=>U(F,"leading-tight font-semibold"),children:[r.title,r.name===s.playground.appName?" 🛝":""]})},r.dirName))}):null]}):null]}),e.jsx("div",{className:"mt-6",children:e.jsx(p,{to:"/finished",className:({isActive:r})=>x("relative text-lg font-bold whitespace-nowrap outline-none hover:underline focus:underline",{'after:bg-background bg-foreground text-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-[""]':r}),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:[v?.title?e.jsx(i,{to:T(Number(d.exerciseNumber)),children:v.title}):null,v?.title&&y?.title?" — ":null,y?.title?e.jsx(i,{to:P(Number(d.exerciseNumber),y.stepNumber),children:y.title}):null]})}),g?null:e.jsx(A,{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(j,{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&&u.length>4?"h-28":"h-14"),style:t?{width:te}:{},children:e.jsx(Ce,{isMenuOpened:t})}),ENV.EPICSHOP_DEPLOYED?null:a?e.jsx(A,{content:t?null:"Your account",children:e.jsxs(i,{className:"relative 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",onClick:E,children:[a.imageUrlSmall?e.jsx("img",{alt:a.name??a.email,src:a.imageUrlSmall,className:"h-full rounded-full"}):e.jsx(j,{name:"User",className:"shrink-0",size:"lg"}),t?e.jsx(h.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"}),L?e.jsx(q,{tooltip:"View your account and preferences",size:"sm"}):null]})}):null,ENV.EPICSHOP_DEPLOYED?null:a&&l?e.jsx(A,{content:t?null:"Continue to next lesson",children:e.jsxs(i,{to:l,prefetch:"intent",className:x("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(j,{name:"FastForward",className:"shrink-0",size:"md"}),t?e.jsx(h.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:t?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(le,{}),e.jsx(A,{content:"Keyboard shortcuts (press ?)",children:e.jsx("button",{type:"button","aria-label":"Keyboard shortcuts",onClick:k,className:"text-muted-foreground hover:text-foreground hover:bg-muted focus-visible:ring-ring flex h-8 w-8 items-center justify-center rounded-md transition-colors focus-visible:ring-2 focus-visible:ring-offset-2",children:e.jsx(j,{name:"Question",size:"md"})})}),e.jsx(Ie,{status:s.sidecarStatus})]}):e.jsxs(Ne,{open:_,onOpenChange:J,children:[s.sidecarStatus?.hasFailure?e.jsx(Q,{asChild:!0,children:e.jsx("button",{type:"button","aria-label":"Process error - click to see details",title:_?void 0:"Process error - click to see details",className:"text-muted-foreground hover:text-foreground hover:bg-muted flex h-8 w-8 items-center justify-center rounded-md transition-colors",children:e.jsx(R,{status:"failed"})})}):e.jsx(Q,{asChild:!0,children:e.jsx("button",{type:"button","aria-label":"More options",title:_?void 0:"More options",className:"text-muted-foreground hover:text-foreground hover:bg-muted flex h-8 w-8 items-center justify-center rounded-md transition-colors",children:e.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[e.jsx("circle",{cx:"5",cy:"10",r:"1.5",fill:"currentColor"}),e.jsx("circle",{cx:"10",cy:"10",r:"1.5",fill:"currentColor"}),e.jsx("circle",{cx:"15",cy:"10",r:"1.5",fill:"currentColor"})]})})}),e.jsxs(ke,{side:"top",align:"start",className:"flex flex-col gap-1 p-2",children:[e.jsx(_e,{themeLabel:O,disableTooltip:_}),e.jsxs("button",{type:"button","aria-label":"Keyboard shortcuts",onClick:k,className:"hover:bg-muted flex items-center gap-3 rounded-md px-2 py-1.5 text-sm transition-colors",children:[e.jsx("div",{className:"flex h-5 w-5 items-center justify-center",children:e.jsx(j,{name:"Question",size:"md"})}),e.jsx("span",{className:"flex-1 text-left",children:"Keyboard shortcuts"})]}),s.sidecarStatus?e.jsxs(i,{to:"/admin",className:"hover:bg-muted flex items-center gap-3 rounded-md px-2 py-1.5 text-sm transition-colors",children:[e.jsx("div",{className:"flex h-5 w-5 items-center justify-center",children:e.jsx(R,{status:s.sidecarStatus.hasFailure?"failed":"running"})}),e.jsxs("span",{className:"flex-1 text-left",children:["Sidecar process"," ",s.sidecarStatus.hasFailure?"error":"running"]})]}):null]})]})})]})})})}function _e({themeLabel:t,disableTooltip:n}){const s=C.useRef(null),o=a=>{const l=s.current?.querySelector("form");if(!l)return;const d=l.querySelector('button[type="submit"]');d?.contains(a.target)||d?.click()};return e.jsxs("div",{ref:s,onClick:o,className:"hover:bg-muted flex cursor-pointer items-center gap-3 rounded-md px-2 py-1.5 text-sm transition-colors",children:[e.jsx("div",{className:"flex h-5 w-5 items-center justify-center",children:e.jsx(le,{disableTooltip:n})}),e.jsxs("span",{className:"flex-1 text-left",children:[t," theme"]})]})}function De({title:t,isMenuOpened:n,setMenuOpened:s,menuControls:o}){const a=C.useRef(n),l=C.useRef(null),d={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"}},g=ne(),u=ne();async function L(){o?.start(n?"close":"open"),s(!n),n?(g.start(d.closed),await u.start(m.moving),u.start(m.closed)):(await u.start(m.moving),g.start(d.open),u.start(m.open))}return C.useEffect(()=>{if(!n)return;function E(b){if(b.key!=="Escape"||b.defaultPrevented)return;!!document.querySelector('[role="dialog"][data-state="open"], [role="alertdialog"][data-state="open"]')||l.current?.click()}return document.addEventListener("keydown",E),()=>document.removeEventListener("keydown",E)},[n]),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":n}),children:[e.jsx("button",{ref:l,className:"flex h-14 w-14 items-center justify-center","aria-label":"Open Navigation menu",onClick:L,children:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",children:[e.jsx(h.path,{...d[a.current?"open":"closed"],animate:g,transition:{duration:.2},stroke:"currentColor",strokeWidth:1.5}),e.jsx(h.path,{...m[a.current?"open":"closed"],animate:u,transition:{duration:.2},stroke:"currentColor",strokeWidth:1.5})]})}),n&&e.jsx(h.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(i,{to:"/",children:t})})]})}export{$t as default};
|
|
2
|
-
//# sourceMappingURL=_layout-BLOYb3Iq.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_layout-BLOYb3Iq.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/components/ui/popover.tsx","../../../app/routes/_app+/_layout.tsx"],"sourcesContent":["import { animateVisualElement, setTarget } from 'motion-dom';\nimport { invariant } from 'motion-utils';\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//# sourceMappingURL=animation-controls.mjs.map\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//# sourceMappingURL=use-animation.mjs.map\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 * as PopoverPrimitive from '@radix-ui/react-popover'\nimport * as React from 'react'\nimport { cn } from '#app/utils/misc.tsx'\n\nfunction Popover({\n\t...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n\treturn <PopoverPrimitive.Root {...props} />\n}\n\nfunction PopoverTrigger({\n\t...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n\treturn <PopoverPrimitive.Trigger {...props} />\n}\n\nfunction PopoverContent({\n\tclassName,\n\talign = 'center',\n\tsideOffset = 4,\n\t...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n\treturn (\n\t\t<PopoverPrimitive.Portal>\n\t\t\t<PopoverPrimitive.Content\n\t\t\t\talign={align}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'bg-popover text-popover-foreground 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-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 rounded-md border p-2 shadow-md outline-none',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</PopoverPrimitive.Portal>\n\t)\n}\n\nexport { Popover, PopoverContent, PopoverTrigger }\n","import {\n\textractNumbersAndTypeFromAppNameOrPath,\n\tgetApps,\n\tgetExercises,\n\tgetPlaygroundAppName,\n\tisExtraApp,\n} from '@epic-web/workshop-utils/apps.server'\nimport { getWorkshopConfig } from '@epic-web/workshop-utils/config.server'\nimport { getProcesses } from '@epic-web/workshop-utils/process-manager.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\tuseLocation,\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 {\n\tOnboardingBadge,\n\tuseOnboardingIndicator,\n} from '#app/components/onboarding-indicator.tsx'\nimport { Logo } from '#app/components/product.tsx'\nimport { useRevalidationWS } from '#app/components/revalidation-ws.tsx'\nimport { StatusIndicator } from '#app/components/status-indicator.tsx'\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogHeader,\n\tDialogTrigger,\n} from '#app/components/ui/dialog.tsx'\nimport {\n\tPopover,\n\tPopoverContent,\n\tPopoverTrigger,\n} from '#app/components/ui/popover.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 {\n\tgetProductHostEmoji,\n\tproductHostEmojis,\n\tusePresence,\n\ttype Location,\n\ttype User,\n} from '#app/utils/presence.tsx'\nimport { useRequestInfo, useApps } from '#app/utils/root-loader.ts'\nimport {\n\tuseExerciseProgressClassName,\n\tuseNextExerciseRoute,\n\tuseProgressItemClassName,\n\ttype ProgressItemSearch,\n} from '../progress.tsx'\nimport { ThemeSwitch, useTheme } from '../theme/index.tsx'\n\nfunction getSidecarStatus() {\n\tconst { sidecarProcesses } = getProcesses()\n\tif (sidecarProcesses.size === 0) return null\n\n\tconst processes = Array.from(sidecarProcesses.entries()).map(\n\t\t([name, { process }]) => ({\n\t\t\tname,\n\t\t\trunning: process.exitCode === null,\n\t\t}),\n\t)\n\n\tconst hasFailure = processes.some((p) => !p.running)\n\tconst failureCount = processes.filter((p) => !p.running).length\n\treturn { processes, hasFailure, count: processes.length, failureCount }\n}\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('appLayoutLoader')\n\tconst { title: workshopTitle } = getWorkshopConfig()\n\tconst [exercises, playgroundAppName, apps] = await Promise.all([\n\t\tgetExercises({ request, timings }),\n\t\tgetPlaygroundAppName(),\n\t\tgetApps({ request, timings }),\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 sidecarStatus = getSidecarStatus()\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\textras: apps\n\t\t\t\t.filter(isExtraApp)\n\t\t\t\t.sort((a, b) =>\n\t\t\t\t\ta.title.localeCompare(b.title, undefined, {\n\t\t\t\t\t\tnumeric: true,\n\t\t\t\t\t\tsensitivity: 'base',\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.map((extra) => ({\n\t\t\t\t\tdirName: extra.dirName,\n\t\t\t\t\ttitle: extra.title,\n\t\t\t\t\tname: extra.name,\n\t\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\tsidecarStatus,\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-highlight hover:opacity-100 focus:opacity-100',\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 locations = getUserLocations(user)\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 = locations.some((loc) =>\n\t\t\t\t\t\t\tloc.origin?.includes('localhost'),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst productHostEmojis = getUniqueProductHostEmojis(locations)\n\t\t\t\t\t\tconst loggedInEmojis = getLoggedInProductEmojis(\n\t\t\t\t\t\t\tuser.loggedInProductHosts,\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\t// Handle opted-out users\n\t\t\t\t\t\tif (user.optOut) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Tooltip key={user.id}>\n\t\t\t\t\t\t\t\t\t<TooltipTrigger asChild tabIndex={0}>\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"relative\"\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Anonymous user (opted out)\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\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\t'bg-muted flex h-8 w-8 items-center justify-center rounded-full border opacity-50',\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>\n\t\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\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t\t\t<TooltipContent>\n\t\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\t<span className=\"flex items-center gap-1.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t{loggedInEmojis ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs\">{loggedInEmojis}</span>\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\tAnonymous (opted out of sharing)\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\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 tabIndex={0}>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName=\"relative\"\n\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>\n\t\t\t\t\t\t\t\t\t\t{imageUrl ? (\n\t\t\t\t\t\t\t\t\t\t\t<img\n\t\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\t\tclassName={cn(\n\t\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\t\tscoreClassNames,\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\tsrc={imageUrl}\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<div\n\t\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\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\t\tscoreClassNames,\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>\n\t\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\t</div>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{productHostEmojis ? (\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\tclassName=\"absolute -top-1 -left-1 text-xs leading-none\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Workshop products\"\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{productHostEmojis}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t</div>\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 className=\"flex items-center gap-1.5\">\n\t\t\t\t\t\t\t\t\t\t\t{loggedInEmojis ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs\">{loggedInEmojis}</span>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\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{locations.length > 0\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{locations.map((loc, index) => {\n\t\t\t\t\t\t\t\t\t\t\tconst locationLabel = getLocationLabel(loc)\n\t\t\t\t\t\t\t\t\t\t\tif (!locationLabel) return null\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={`${loc.workshopTitle}-${index}`}\n\t\t\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\t\t'flex flex-col items-center',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlocations.length > 1\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'border-border mt-1 border-t pt-1 first:mt-0 first:border-t-0 first:pt-0'\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)}\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{locationLabel.line1 ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{getProductHostEmoji(loc.productHost)}{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{locationLabel.line1}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\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\t\t{locationLabel.line2 ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground text-xs\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{locationLabel.line2}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\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\t</span>\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</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 tabIndex={0}>\n\t\t\t\t\t\t\t<div\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 truncate text-center',\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\nfunction getLoggedInProductEmojis(\n\thosts: string[] | null | undefined,\n): string | null {\n\tif (!hosts || hosts.length === 0) return null\n\treturn hosts\n\t\t.map((host) => productHostEmojis[host])\n\t\t.filter(Boolean)\n\t\t.join(' ')\n}\n\nfunction getUserLocations(user: User): Location[] {\n\tif (user.locations && user.locations.length > 0) {\n\t\treturn user.locations.filter(Boolean) as Location[]\n\t}\n\tif (user.location) {\n\t\treturn [user.location]\n\t}\n\treturn []\n}\n\nfunction getUniqueProductHostEmojis(locations: Location[]): string | null {\n\tconst uniqueHosts = new Set<string>()\n\tfor (const loc of locations) {\n\t\tif (loc.productHost) {\n\t\t\tuniqueHosts.add(loc.productHost)\n\t\t}\n\t}\n\tif (uniqueHosts.size === 0) return null\n\treturn Array.from(uniqueHosts)\n\t\t.map((host) => getProductHostEmoji(host))\n\t\t.filter(Boolean)\n\t\t.join('')\n}\n\nfunction hasExtras(apps: Array<{ relativePath: string }>) {\n\treturn apps.some((app) => {\n\t\tconst rootDir = app.relativePath.split(/[\\\\/]/)[0]\n\t\treturn (\n\t\t\trootDir === 'extra' || rootDir === 'example' || rootDir === 'examples'\n\t\t)\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({\n\t\twatchPaths: [\n\t\t\t'./exercises/README.mdx',\n\t\t\t'./extra',\n\t\t\t'./example',\n\t\t\t'./examples',\n\t\t],\n\t})\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 [showLoginBadge, dismissLoginBadge] =\n\t\tuseOnboardingIndicator('login-button')\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=\"from-highlight to-info text-info-foreground z-10 flex h-16 items-center justify-between border-b bg-linear-to-tr pl-4\">\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=\"bg-info-foreground/20 hover:bg-info-foreground/30 relative flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold shadow-md transition\"\n\t\t\t\t\t\t\t\tonClick={dismissLoginBadge}\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\t{showLoginBadge ? (\n\t\t\t\t\t\t\t\t\t<OnboardingBadge\n\t\t\t\t\t\t\t\t\t\ttooltip=\"Login for the full experience!\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</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=\"bg-info-foreground/20 hover:bg-info-foreground/30 relative flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold shadow-md transition\"\n\t\t\t\t\t\t\t\tonClick={dismissLoginBadge}\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\t{showLoginBadge ? (\n\t\t\t\t\t\t\t\t\t<OnboardingBadge\n\t\t\t\t\t\t\t\t\t\ttooltip=\"Login for the full experience!\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</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 NavigationExtrasListItem({ children }: { children: React.ReactNode }) {\n\treturn (\n\t\t<motion.li\n\t\t\tvariants={itemVariants}\n\t\t\tclassName=\"py-[6px] first:pt-3 last:pb-3\"\n\t\t>\n\t\t\t<span className=\"inline-block pl-2\">{children}</span>\n\t\t</motion.li>\n\t)\n}\n\nconst navHighlightBaseClassName =\n\t'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-[\"\"]'\n\nfunction getNavHighlightClassName(\n\tisActive: boolean,\n\tclassName?: string | null,\n) {\n\treturn clsx(navHighlightBaseClassName, className, {\n\t\t'bg-foreground text-background': isActive,\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 apps = useApps()\n\tconst user = useOptionalUser()\n\tconst nextExerciseRoute = useNextExerciseRoute()\n\tconst params = useParams()\n\tconst location = useLocation()\n\tconst isOnline = useIsOnline()\n\tconst { users } = usePresence()\n\n\t// Onboarding indicators\n\tconst [showAccountBadge, dismissAccountBadge] =\n\t\tuseOnboardingIndicator('account-link')\n\tconst showExtrasLink = hasExtras(apps)\n\tconst playgroundExtra = data.extras.find(\n\t\t(extra) => extra.name === data.playground.appName,\n\t)\n\tconst isExtrasActive =\n\t\tlocation.pathname === '/extra' || location.pathname.startsWith('/extra/')\n\tconst showExtrasPlaygroundLink = Boolean(playgroundExtra) && !isExtrasActive\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\tconst handleOpenShortcuts = React.useCallback(() => {\n\t\tif (typeof window === 'undefined') return\n\t\twindow.dispatchEvent(new CustomEvent('toggle-keyboard-shortcuts'))\n\t}, [])\n\n\tconst requestInfo = useRequestInfo()\n\tconst currentTheme = requestInfo.session.theme ?? 'system'\n\tconst themeLabel = {\n\t\tlight: 'Light',\n\t\tdark: 'Dark',\n\t\tsystem: 'System',\n\t}[currentTheme]\n\tconst [isMobilePopoverOpen, setIsMobilePopoverOpen] = React.useState(false)\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\tgetNavHighlightClassName(isActive)\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\tgetNavHighlightClassName(isActive)\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\t{showExtrasLink ? (\n\t\t\t\t\t\t\t\t\t<span>\n\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<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\tto=\"/extra\"\n\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\tclassName={({ isActive }) =>\n\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'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>\n\t\t\t\t\t\t\t\t\t\t\t\t📚 Extras\n\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t{showExtrasPlaygroundLink && playgroundExtra ? (\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\tto={`/extra/${playgroundExtra.dirName}`}\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>\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</Link>\n\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{isExtrasActive && data.extras.length ? (\n\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\tvariants={listVariants}\n\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\tanimate=\"visible\"\n\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>\n\t\t\t\t\t\t\t\t\t\t\t\t{data.extras.map((extra) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExtrasListItem key={extra.dirName}>\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={`/extra/${extra.dirName}`}\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\tgetNavHighlightClassName(\n\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'leading-tight font-semibold',\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{extra.title}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{extra.name === data.playground.appName\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: ''}\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</NavigationExtrasListItem>\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</motion.ul>\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) : null}\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-foreground text-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-[\"\"]':\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'relative 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\tonClick={dismissAccountBadge}\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\t{showAccountBadge ? (\n\t\t\t\t\t\t\t\t\t<OnboardingBadge\n\t\t\t\t\t\t\t\t\t\ttooltip=\"View your account and preferences\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</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 items-center justify-center gap-2 self-start p-4 sm:mb-4',\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'w-14 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{isMenuOpened ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<ThemeSwitch />\n\t\t\t\t\t\t\t\t<SidecarStatusIndicator status={data.sidecarStatus} />\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<Popover open={isMobilePopoverOpen} onOpenChange={setIsMobilePopoverOpen}>\n\t\t\t\t\t\t\t\t{data.sidecarStatus?.hasFailure ? (\n\t\t\t\t\t\t\t\t\t<PopoverTrigger asChild>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Process error - click to see details\"\n\t\t\t\t\t\t\t\t\t\t\ttitle={isMobilePopoverOpen ? undefined : \"Process error - click to see details\"}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground hover:bg-muted flex h-8 w-8 items-center justify-center rounded-md transition-colors\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<StatusIndicator status=\"failed\" />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</PopoverTrigger>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<PopoverTrigger asChild>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"More options\"\n\t\t\t\t\t\t\t\t\t\t\ttitle={isMobilePopoverOpen ? undefined : \"More options\"}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground hover:bg-muted flex h-8 w-8 items-center justify-center rounded-md transition-colors\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\twidth=\"20\"\n\t\t\t\t\t\t\t\t\t\t\t\theight=\"20\"\n\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 20 20\"\n\t\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\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<circle cx=\"5\" cy=\"10\" r=\"1.5\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<circle cx=\"10\" cy=\"10\" r=\"1.5\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<circle cx=\"15\" cy=\"10\" r=\"1.5\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</PopoverTrigger>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<PopoverContent\n\t\t\t\t\t\t\t\t\tside=\"top\"\n\t\t\t\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\t\t\t\tclassName=\"flex flex-col gap-1 p-2\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ThemeSwitchRow themeLabel={themeLabel} disableTooltip={isMobilePopoverOpen} />\n\t\t\t\t\t\t\t\t\t{data.sidecarStatus ? (\n\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\tto=\"/admin\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"hover:bg-muted flex items-center gap-3 rounded-md px-2 py-1.5 text-sm transition-colors\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex h-5 w-5 items-center justify-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t<StatusIndicator\n\t\t\t\t\t\t\t\t\t\t\t\t\tstatus={data.sidecarStatus.hasFailure ? 'failed' : 'running'}\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</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex-1 text-left\">\n\t\t\t\t\t\t\t\t\t\t\t\tSidecar process{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t{data.sidecarStatus.hasFailure ? 'error' : 'running'}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</PopoverContent>\n\t\t\t\t\t\t\t</Popover>\n\t\t\t\t\t\t)}\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 SidecarStatusIndicator({\n\tstatus,\n}: {\n\tstatus: { hasFailure: boolean; count: number; failureCount: number } | null\n}) {\n\tif (!status) return null\n\n\treturn (\n\t\t<SimpleTooltip\n\t\t\tcontent={\n\t\t\t\tstatus.hasFailure\n\t\t\t\t\t? `${status.failureCount} sidecar${status.failureCount === 1 ? '' : 's'} failed`\n\t\t\t\t\t: 'All sidecars running'\n\t\t\t}\n\t\t>\n\t\t\t<Link\n\t\t\t\tto=\"/admin\"\n\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground hover:bg-muted flex h-8 w-8 items-center justify-center rounded-md transition-colors\"\n\t\t\t>\n\t\t\t\t<StatusIndicator\n\t\t\t\t\tstatus={status.hasFailure ? 'failed' : 'running'}\n\t\t\t\t/>\n\t\t\t</Link>\n\t\t</SimpleTooltip>\n\t)\n}\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 apps = useApps()\n\tconst user = useOptionalUser()\n\tconst nextExerciseRoute = useNextExerciseRoute()\n\tconst params = useParams()\n\tconst location = useLocation()\n\tconst isOnline = useIsOnline()\n\tconst { users } = usePresence()\n\n\t// Onboarding indicators\n\tconst [showAccountBadge, dismissAccountBadge] =\n\t\tuseOnboardingIndicator('account-link')\n\tconst showExtrasLink = hasExtras(apps)\n\tconst playgroundExtra = data.extras.find(\n\t\t(extra) => extra.name === data.playground.appName,\n\t)\n\tconst isExtrasActive =\n\t\tlocation.pathname === '/extra' || location.pathname.startsWith('/extra/')\n\tconst showExtrasPlaygroundLink = Boolean(playgroundExtra) && !isExtrasActive\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\tconst handleOpenShortcuts = React.useCallback(() => {\n\t\tif (typeof window === 'undefined') return\n\t\twindow.dispatchEvent(new CustomEvent('toggle-keyboard-shortcuts'))\n\t}, [])\n\n\tconst requestInfo = useRequestInfo()\n\tconst currentTheme = requestInfo.session.theme ?? 'system'\n\tconst themeLabel = {\n\t\tlight: 'Light',\n\t\tdark: 'Dark',\n\t\tsystem: 'System',\n\t}[currentTheme]\n\tconst [isPopoverOpen, setIsPopoverOpen] = React.useState(false)\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\tgetNavHighlightClassName(isActive)\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\tgetNavHighlightClassName(isActive)\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\t{showExtrasLink ? (\n\t\t\t\t\t\t\t\t\t<span>\n\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<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\tto=\"/extra\"\n\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\tclassName={({ isActive }) =>\n\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'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>\n\t\t\t\t\t\t\t\t\t\t\t\t📚 Extras\n\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t{showExtrasPlaygroundLink && playgroundExtra ? (\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\tto={`/extra/${playgroundExtra.dirName}`}\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>\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</Link>\n\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{isExtrasActive && data.extras.length ? (\n\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\tvariants={listVariants}\n\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\tanimate=\"visible\"\n\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>\n\t\t\t\t\t\t\t\t\t\t\t\t{data.extras.map((extra) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExtrasListItem key={extra.dirName}>\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={`/extra/${extra.dirName}`}\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\tgetNavHighlightClassName(\n\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'leading-tight font-semibold',\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{extra.title}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{extra.name === data.playground.appName\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: ''}\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</NavigationExtrasListItem>\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</motion.ul>\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) : null}\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-foreground text-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-[\"\"]':\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=\"relative 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\tonClick={dismissAccountBadge}\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\t{showAccountBadge ? (\n\t\t\t\t\t\t\t\t\t<OnboardingBadge\n\t\t\t\t\t\t\t\t\t\ttooltip=\"View your account and preferences\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</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{isMenuOpened ? (\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<ThemeSwitch />\n\t\t\t\t\t\t\t\t<SimpleTooltip content=\"Keyboard shortcuts (press ?)\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Keyboard shortcuts\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleOpenShortcuts}\n\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground hover:bg-muted focus-visible:ring-ring flex h-8 w-8 items-center justify-center rounded-md transition-colors focus-visible:ring-2 focus-visible:ring-offset-2\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Icon name=\"Question\" size=\"md\" />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t\t\t\t<SidecarStatusIndicator status={data.sidecarStatus} />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<Popover open={isPopoverOpen} onOpenChange={setIsPopoverOpen}>\n\t\t\t\t\t\t\t\t{data.sidecarStatus?.hasFailure ? (\n\t\t\t\t\t\t\t\t\t<PopoverTrigger asChild>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Process error - click to see details\"\n\t\t\t\t\t\t\t\t\t\t\ttitle={isPopoverOpen ? undefined : \"Process error - click to see details\"}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground hover:bg-muted flex h-8 w-8 items-center justify-center rounded-md transition-colors\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<StatusIndicator status=\"failed\" />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</PopoverTrigger>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<PopoverTrigger asChild>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"More options\"\n\t\t\t\t\t\t\t\t\t\t\ttitle={isPopoverOpen ? undefined : \"More options\"}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground hover:bg-muted flex h-8 w-8 items-center justify-center rounded-md transition-colors\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\twidth=\"20\"\n\t\t\t\t\t\t\t\t\t\t\t\theight=\"20\"\n\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 20 20\"\n\t\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\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<circle cx=\"5\" cy=\"10\" r=\"1.5\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<circle cx=\"10\" cy=\"10\" r=\"1.5\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<circle cx=\"15\" cy=\"10\" r=\"1.5\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</PopoverTrigger>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<PopoverContent\n\t\t\t\t\t\t\t\t\tside=\"top\"\n\t\t\t\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\t\t\t\tclassName=\"flex flex-col gap-1 p-2\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ThemeSwitchRow themeLabel={themeLabel} disableTooltip={isPopoverOpen} />\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Keyboard shortcuts\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleOpenShortcuts}\n\t\t\t\t\t\t\t\t\t\tclassName=\"hover:bg-muted flex items-center gap-3 rounded-md px-2 py-1.5 text-sm transition-colors\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex h-5 w-5 items-center justify-center\">\n\t\t\t\t\t\t\t\t\t\t\t<Icon name=\"Question\" size=\"md\" />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<span className=\"flex-1 text-left\">Keyboard shortcuts</span>\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t{data.sidecarStatus ? (\n\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\tto=\"/admin\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"hover:bg-muted flex items-center gap-3 rounded-md px-2 py-1.5 text-sm transition-colors\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex h-5 w-5 items-center justify-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t<StatusIndicator\n\t\t\t\t\t\t\t\t\t\t\t\t\tstatus={data.sidecarStatus.hasFailure ? 'failed' : 'running'}\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</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex-1 text-left\">\n\t\t\t\t\t\t\t\t\t\t\t\tSidecar process{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t{data.sidecarStatus.hasFailure ? 'error' : 'running'}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</PopoverContent>\n\t\t\t\t\t\t\t</Popover>\n\t\t\t\t\t\t)}\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 ThemeSwitchRow({\n\tthemeLabel,\n\tdisableTooltip,\n}: {\n\tthemeLabel: string\n\tdisableTooltip?: boolean\n}) {\n\tconst wrapperRef = React.useRef<HTMLDivElement>(null)\n\n\tconst handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n\t\tconst form = wrapperRef.current?.querySelector<HTMLFormElement>('form')\n\t\tif (!form) return\n\t\tconst submitButton = form.querySelector<HTMLButtonElement>(\n\t\t\t'button[type=\"submit\"]',\n\t\t)\n\t\t// Don't trigger click if the event originated from the submit button itself\n\t\tif (submitButton?.contains(event.target as Node)) {\n\t\t\treturn\n\t\t}\n\t\tsubmitButton?.click()\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tref={wrapperRef}\n\t\t\tonClick={handleClick}\n\t\t\tclassName=\"hover:bg-muted flex cursor-pointer items-center gap-3 rounded-md px-2 py-1.5 text-sm transition-colors\"\n\t\t>\n\t\t\t<div className=\"flex h-5 w-5 items-center justify-center\">\n\t\t\t\t<ThemeSwitch disableTooltip={disableTooltip} />\n\t\t\t</div>\n\t\t\t<span className=\"flex-1 text-left\">{themeLabel} theme</span>\n\t\t</div>\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 handleKeyDown(event: KeyboardEvent) {\n\t\t\tif (event.key !== 'Escape' || event.defaultPrevented) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst hasOpenDialog = Boolean(\n\t\t\t\tdocument.querySelector(\n\t\t\t\t\t'[role=\"dialog\"][data-state=\"open\"], [role=\"alertdialog\"][data-state=\"open\"]',\n\t\t\t\t),\n\t\t\t)\n\n\t\t\tif (!hasOpenDialog) {\n\t\t\t\tmenuButtonRef.current?.click()\n\t\t\t}\n\t\t}\n\t\tdocument.addEventListener('keydown', handleKeyDown)\n\t\treturn () => document.removeEventListener('keydown', handleKeyDown)\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","Popover","props","jsx","PopoverPrimitive.Root","PopoverTrigger","PopoverPrimitive.Trigger","PopoverContent","className","align","sideOffset","PopoverPrimitive.Portal","PopoverPrimitive.Content","cn","opacities","shadows","getScoreClassNames","score","opacityNumber","Math","round","length","shadowNumber","FacePile","isMenuOpened","loggedInUser","useOptionalUser","users","usePresence","product","displayNameShort","useWorkshopConfig","limit","numberOverLimit","shouldShowNumberOverLimit","tiffany","Link","target","rel","to","children","alt","src","overLimitLabel","TooltipProvider","slice","map","user","scoreClassNames","locations","getUserLocations","imageUrl","imageUrlSmall","avatarUrl","hasAccess","local","some","loc","origin","includes","productHostEmojis","getUniqueProductHostEmojis","loggedInEmojis","getLoggedInProductEmojis","loggedInProductHosts","optOut","Tooltip","TooltipTrigger","asChild","tabIndex","Icon","name","TooltipContent","jsxs","id","doingLabel","index","locationLabel","getLocationLabel","line1","getProductHostEmoji","productHost","line2","workshopTitle","hosts","host","filter","Boolean","join","location","uniqueHosts","Set","add","size","Array","from","hasExtras","apps","app","rootDir","relativePath","split","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","s","padStart","type","displayName","userHasAccess","useUserHasAccess","showLoginBadge","dismissLoginBadge","useOnboardingIndicator","details","ENV","EPICSHOP_DEPLOYED","Fragment","EPICSHOP_GITHUB_REPO","href","Logo","style","onClick","OnboardingBadge","tooltip","Dialog","DialogTrigger","DialogContent","DialogHeader","DialogDescription","itemVariants","hidden","opacity","x","visible","NavigationExerciseListItem","progressClassName","useExerciseProgressClassName","motion","li","variants","NavigationExerciseStepListItem","progressItemSearch","useProgressItemClassName","NavigationExtrasListItem","navHighlightBaseClassName","getNavHighlightClassName","isActive","clsx","useApps","nextExerciseRoute","useNextExerciseRoute","params","useParams","useLocation","isOnline","useIsOnline","showAccountBadge","dismissAccountBadge","showExtrasLink","playgroundExtra","extras","find","extra","playground","appName","isExtrasActive","pathname","startsWith","showExtrasPlaygroundLink","listVariants","transition","duration","when","staggerChildren","window","dispatchEvent","CustomEvent","currentTheme","useRequestInfo","session","theme","themeLabel","light","dark","system","isMobilePopoverOpen","setIsMobilePopoverOpen","NavToggle","title","div","initial","animate","ul","NavLink","prefetch","exercises","steps","Number","showPlayground","getExercisePath","getExerciseStepPath","problem","solution","dirName","SimpleTooltip","content","email","state","ThemeSwitch","SidecarStatusIndicator","status","sidecarStatus","open","onOpenChange","hasFailure","StatusIndicator","width","height","viewBox","fill","xmlns","cx","cy","r","side","ThemeSwitchRow","disableTooltip","OPENED_MENU_WIDTH","failureCount","e","solutions","problems","p","menuControls","menuVariants","close","handleOpenShortcuts","isPopoverOpen","setIsPopoverOpen","wrapperRef","handleClick","event","form","current","querySelector","submitButton","contains","click","ref","initialOpenRef","menuButtonRef","path01Variants","d","closed","path02Variants","moving","path01Controls","path02Controls","toggleMenu","start","handleKeyDown","defaultPrevented","addEventListener","removeEventListener","path","stroke","strokeWidth","delay","y"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import{w as c,L as d}from"./chunk-EPOLDU6W-BCLmut3y.js";import{j as e}from"./jsx-runtime-C5WNSv3b.js";import{r as n}from"./index-CqIc3cxq.js";const p={getSitemapEntries:()=>[{route:"/guide"}]},l=[{id:"tutorial",label:"Tutorial"},{id:"logging-in",label:"Logging In"},{id:"workshop-structure",label:"Workshop Structure"},{id:"lesson-page",label:"The Lesson Page"},{id:"file-links",label:"File Links"},{id:"setting-playground",label:"Setting the Playground"},{id:"diff-tab",label:"The Diff Tab"},{id:"tests",label:"Tests"},{id:"keyboard-shortcuts",label:"Keyboard Shortcuts"},{id:"cli-commands",label:"CLI Commands"},{id:"ai-assistant",label:"AI Assistant (MCP)"},{id:"emoji-key",label:"Emoji Key"},{id:"need-help",label:"Need More Help?"}];function h({activeSection:i}){return e.jsxs("nav",{className:"sticky top-4 hidden lg:block",children:[e.jsx("h2",{className:"text-muted-foreground mb-3 text-sm font-semibold tracking-wide uppercase",children:"On this page"}),e.jsx("ul",{className:"space-y-2 text-sm",children:l.map(s=>e.jsx("li",{children:e.jsx("a",{href:`#${s.id}`,className:`block transition-colors ${i===s.id?"text-highlight font-medium":"text-muted-foreground hover:text-foreground"}`,children:s.label})},s.id))})]})}const g=c(function(){const[s,a]=n.useState(null);return n.useEffect(()=>{const r=new IntersectionObserver(o=>{for(const t of o)t.isIntersecting&&a(t.target.id)},{rootMargin:"-20% 0px -60% 0px",threshold:0});for(const o of l){const t=document.getElementById(o.id);t&&r.observe(t)}return()=>r.disconnect()},[]),e.jsx("div",{className:"h-full w-full overflow-y-auto",children:e.jsxs("div",{className:"container mt-12 flex max-w-5xl gap-12 pb-24",children:[e.jsxs("main",{className:"flex w-full max-w-3xl grow flex-col gap-8",children:[e.jsx("h1",{className:"text-h1 mb-4",children:"Workshop App Guide"}),e.jsx("p",{className:"text-lg",children:"This guide will help you get the most out of the Epic Workshop App. Whether you're just getting started or need help troubleshooting, you'll find useful information here."}),e.jsxs("div",{id:"tutorial",className:"bg-accent scroll-mt-8 rounded-lg p-6",children:[e.jsx("h2",{className:"text-h4 mb-2",children:"🎓 New to the Workshop App?"}),e.jsx("p",{className:"mb-4",children:"We highly recommend going through the official tutorial to learn all the features the workshop app has to offer:"}),e.jsx("code",{className:"bg-background block rounded p-3 font-mono text-sm",children:"npx epicshop add epicshop-tutorial"}),e.jsx("p",{className:"text-muted-foreground mt-2 text-sm",children:"This will add the tutorial workshop to your setup so you can learn at your own pace."})]}),e.jsxs("section",{id:"logging-in",className:"scroll-mt-8",children:[e.jsx("h2",{className:"text-h3 mb-4",children:"Logging In"}),e.jsx("p",{className:"mb-4",children:"Logging in unlocks important features that enhance your learning experience:"}),e.jsxs("ul",{className:"list-disc space-y-2 pl-6",children:[e.jsxs("li",{children:[e.jsx("strong",{children:"Progress tracking"})," – Your progress syncs across devices and persists between sessions"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Video access"})," – Watch premium workshop videos (requires a valid license)"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Discord integration"})," – Connect with the community and instructors"]})]}),e.jsx("h3",{className:"text-h5 mt-6 mb-3",children:"How to Log In"}),e.jsxs("p",{className:"mb-4",children:["Click the ",e.jsx("strong",{children:"Account"})," link in the navigation (top right) and follow the login prompts. You can also log in via the CLI:"]}),e.jsx("code",{className:"bg-muted mb-4 block rounded p-3 font-mono text-sm",children:"epicshop auth login"}),e.jsx("p",{className:"mb-4",children:"This opens a browser window where you can authenticate with your EpicWeb.dev, EpicReact.dev, or EpicAI.pro account."}),e.jsx("p",{className:"text-muted-foreground text-sm",children:"Tip: Log in early to start tracking your progress from the beginning!"})]}),e.jsxs("section",{id:"workshop-structure",className:"scroll-mt-8",children:[e.jsx("h2",{className:"text-h3 mb-4",children:"Workshop Structure"}),e.jsx("p",{className:"mb-4",children:"Each workshop is a standalone project with a consistent structure:"}),e.jsxs("ul",{className:"list-disc space-y-2 pl-6",children:[e.jsxs("li",{children:[e.jsx("strong",{children:"exercises/"}),' – Contains the "problem" and "solution" versions of each step. Treat this as a reference for after the workshop.']}),e.jsxs("li",{children:[e.jsx("strong",{children:"playground/"})," – This is where your work takes place. We recommend opening this directory as its own editor instance for efficient file searching."]})]})]}),e.jsxs("section",{id:"lesson-page",className:"scroll-mt-8",children:[e.jsx("h2",{className:"text-h3 mb-4",children:"The Lesson Page"}),e.jsx("p",{className:"mb-4",children:"When you click into a lesson, the app displays the video along with written content, code snippets, and other useful information. To the right is a pane with tabs:"}),e.jsxs("ul",{className:"list-disc space-y-2 pl-6",children:[e.jsxs("li",{children:[e.jsx("strong",{children:"Playground"})," – Where you'll spend most of your time. You can interact with the app here or open it in a dedicated tab."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Problem"})," – The starting point of the exercise."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Solution"})," – The completed exercise state."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Diff"})," – Compare your current version against the finished state. Use this if you get stuck, but try to avoid it if possible."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Tests"})," – If the exercise includes tests, they'll appear here to verify your work."]})]})]}),e.jsxs("section",{id:"file-links",className:"scroll-mt-8",children:[e.jsx("h2",{className:"text-h3 mb-4",children:"File Links"}),e.jsxs("p",{className:"mb-4",children:["At the bottom of a lesson page, the ",e.jsx("strong",{children:'"Files"'})," ","button opens a list of relevant files for the current exercise. Clicking a file opens it directly in your editor at the right location."]}),e.jsx("p",{className:"mb-4",children:"Key things to know:"}),e.jsxs("ul",{className:"list-disc space-y-2 pl-6",children:[e.jsx("li",{children:"Files are tied to your current Playground – make sure it's set to the lesson you're working on."}),e.jsxs("li",{children:["A ",e.jsx("strong",{children:'"+"'})," icon next to a filename means you need to create that file. Clicking it will create and open the file."]}),e.jsx("li",{children:'If you see a red "Set to Playground" link, click it to sync the playground for the current exercise.'})]}),e.jsx("h3",{id:"file-links-troubleshooting",className:"text-h4 mt-8 mb-4 scroll-mt-8",children:"Troubleshooting"}),e.jsxs("p",{className:"mb-4",children:["If you're unable to open file links from the workshop app, create a ",e.jsx("code",{className:"bg-muted rounded px-1",children:".env"})," file in the root of the workshop project and add:"]}),e.jsx("code",{className:"bg-muted mb-4 block rounded p-3 font-mono text-sm",children:'EPICSHOP_EDITOR="path/to/your/editor"'}),e.jsx("p",{className:"mb-4",children:"Examples:"}),e.jsxs("ul",{className:"list-disc space-y-2 pl-6",children:[e.jsxs("li",{children:[e.jsx("strong",{children:"VS Code:"})," ",e.jsx("code",{className:"bg-muted rounded px-1",children:"EPICSHOP_EDITOR=code"})]}),e.jsxs("li",{children:[e.jsx("strong",{children:"VS Code on Windows:"})," ",e.jsx("code",{className:"bg-muted rounded px-1",children:`EPICSHOP_EDITOR='"C:\\Program Files\\Microsoft VS Code\\bin\\code.cmd"'`})]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Cursor:"})," ",e.jsx("code",{className:"bg-muted rounded px-1",children:"EPICSHOP_EDITOR=cursor"})]})]}),e.jsx("p",{className:"text-muted-foreground mt-4 text-sm",children:"Note: If the path includes spaces, wrap it in quotes as shown in the Windows example."}),e.jsx("p",{className:"mt-4",children:`For Cursor/VS Code users, you can also install the 'code' command in your PATH by opening the Command Palette (⌘⇧P on Mac, Ctrl+Shift+P on Windows) and searching for "Install 'code' command in PATH".`})]}),e.jsxs("section",{id:"setting-playground",className:"scroll-mt-8",children:[e.jsx("h2",{className:"text-h3 mb-4",children:"Setting the Playground"}),e.jsxs("p",{className:"mb-4",children:["If you navigate to a different exercise than what's currently loaded, a red ",e.jsx("strong",{children:'"Set to Playground"'})," link will appear. Clicking this syncs the playground for the appropriate exercise."]}),e.jsxs("p",{className:"bg-warning text-warning-foreground rounded-lg p-4",children:[e.jsx("strong",{children:"Important:"})," Always have your Playground set to the lesson you're working on! This is not automated because you might want to refer back to previous exercises without losing your current work."]})]}),e.jsxs("section",{id:"diff-tab",className:"scroll-mt-8",children:[e.jsx("h2",{className:"text-h3 mb-4",children:"The Diff Tab"}),e.jsx("p",{className:"mb-4",children:"The diff tab helps you get unstuck when you're totally stuck. It shows the difference between your playground and the solution. This is especially useful for catching typos or small mistakes."}),e.jsxs("ul",{className:"list-disc space-y-2 pl-6",children:[e.jsxs("li",{children:[e.jsx("span",{className:"text-success font-mono",children:"+"})," lines (green) show code that needs to be added"]}),e.jsxs("li",{children:[e.jsx("span",{className:"text-foreground-destructive font-mono",children:"-"})," ","lines (red) show code that needs to be removed"]}),e.jsx("li",{children:"Unchanged lines provide context around the changes"})]}),e.jsx("p",{className:"text-muted-foreground mt-4 text-sm",children:"Tip: Try to avoid using the diff tab until you've made a solid attempt at the exercise. The learning happens in the struggle!"})]}),e.jsxs("section",{id:"tests",className:"scroll-mt-8",children:[e.jsx("h2",{className:"text-h3 mb-4",children:"Tests"}),e.jsx("p",{className:"mb-4",children:"Some exercises include tests to verify your work. If available, they appear in the Tests tab. Tests can run in two ways:"}),e.jsxs("ul",{className:"list-disc space-y-2 pl-6",children:[e.jsxs("li",{children:[e.jsx("strong",{children:"Script-based:"})," A button runs the test script and streams the output"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Browser-based:"})," Test files are compiled and run directly in the browser"]})]}),e.jsxs("p",{className:"mt-4",children:["Look for 🚨 ",e.jsx("strong",{children:"Alfred the Alert"})," in test failures for helpful explanations about what went wrong."]})]}),e.jsxs("section",{id:"keyboard-shortcuts",className:"scroll-mt-8",children:[e.jsx("h2",{className:"text-h3 mb-4",children:"Keyboard Shortcuts"}),e.jsx("p",{className:"mb-4",children:"When the workshop server is running in your terminal, you can use these keyboard shortcuts:"}),e.jsxs("ul",{className:"list-disc space-y-2 pl-6",children:[e.jsxs("li",{children:[e.jsx("kbd",{className:"bg-muted rounded px-2 py-1 font-mono text-sm",children:"u"})," ","– Check for and apply updates to the workshop"]}),e.jsxs("li",{children:[e.jsx("kbd",{className:"bg-muted rounded px-2 py-1 font-mono text-sm",children:"d"})," ","– Dismiss update notifications"]})]}),e.jsx("p",{className:"text-muted-foreground mt-4 text-sm",children:"The server automatically restarts after updates are applied."})]}),e.jsxs("section",{id:"cli-commands",className:"scroll-mt-8",children:[e.jsx("h2",{className:"text-h3 mb-4",children:"CLI Commands"}),e.jsxs("p",{className:"mb-4",children:["The ",e.jsx("code",{className:"bg-muted rounded px-1",children:"epicshop"})," CLI provides useful commands for managing your workshop:"]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("code",{className:"bg-muted block rounded p-3 font-mono text-sm",children:"epicshop start"}),e.jsxs("p",{className:"text-muted-foreground mt-1 text-sm",children:["Start the workshop (or just run"," ",e.jsx("code",{className:"bg-muted rounded px-1",children:"npm start"}),")"]})]}),e.jsxs("div",{children:[e.jsx("code",{className:"bg-muted block rounded p-3 font-mono text-sm",children:"epicshop playground set"}),e.jsx("p",{className:"text-muted-foreground mt-1 text-sm",children:"Set the playground to the next incomplete step"})]}),e.jsxs("div",{children:[e.jsx("code",{className:"bg-muted block rounded p-3 font-mono text-sm",children:"epicshop diff"}),e.jsx("p",{className:"text-muted-foreground mt-1 text-sm",children:"Show the diff between your playground and the solution in the terminal"})]}),e.jsxs("div",{children:[e.jsx("code",{className:"bg-muted block rounded p-3 font-mono text-sm",children:"epicshop progress"}),e.jsx("p",{className:"text-muted-foreground mt-1 text-sm",children:"View your progress through the workshop"})]}),e.jsxs("div",{children:[e.jsx("code",{className:"bg-muted block rounded p-3 font-mono text-sm",children:"epicshop exercises"}),e.jsx("p",{className:"text-muted-foreground mt-1 text-sm",children:"List all exercises with completion status"})]})]}),e.jsxs("p",{className:"mt-4",children:["Run ",e.jsx("code",{className:"bg-muted rounded px-1",children:"epicshop --help"})," ","to see all available commands."]})]}),e.jsxs("section",{id:"ai-assistant",className:"scroll-mt-8",children:[e.jsx("h2",{className:"text-h3 mb-4",children:"AI Assistant (MCP)"}),e.jsxs("p",{className:"mb-4",children:["If you use an AI assistant that supports"," ",e.jsx("a",{href:"https://modelcontextprotocol.io/",target:"_blank",rel:"noopener noreferrer",className:"underline",children:"MCP (Model Context Protocol)"}),", you can install the Epic Workshop MCP server to enhance your learning experience."]}),e.jsx("h3",{className:"text-h5 mt-6 mb-3",children:"What it provides"}),e.jsxs("ul",{className:"list-disc space-y-2 pl-6",children:[e.jsxs("li",{children:[e.jsx("strong",{children:"Exercise context:"})," Your AI can understand what you're working on and provide relevant help"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Progress tracking:"})," Mark lessons complete directly through your AI"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Diff viewing:"})," Ask your AI to show you what changes are needed"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"File opening:"})," Have your AI open the relevant files in your editor"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Quiz mode:"})," Ask your AI to quiz you on workshop topics"]})]}),e.jsx("h3",{className:"text-h5 mt-6 mb-3",children:"Installation"}),e.jsx("p",{className:"mb-4",children:"Add the following to your AI assistant's MCP configuration (e.g., Claude Desktop):"}),e.jsx("pre",{className:"bg-muted overflow-x-auto rounded p-4 font-mono text-sm",children:`{
|
|
2
|
-
"mcpServers": {
|
|
3
|
-
"epicshop": {
|
|
4
|
-
"command": "npx",
|
|
5
|
-
"args": ["-y", "@epic-web/workshop-mcp"]
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
}`}),e.jsx("p",{className:"text-muted-foreground mt-4 text-sm",children:"Make sure to run your AI assistant from within the workshop directory so the MCP server can find the right files."})]}),e.jsxs("section",{id:"emoji-key",className:"scroll-mt-8",children:[e.jsx("h2",{className:"text-h3 mb-4",children:"Emoji Key"}),e.jsx("p",{className:"mb-4",children:"Each exercise has comments with helpful emoji characters:"}),e.jsxs("ul",{className:"space-y-2 pl-6",children:[e.jsxs("li",{children:[e.jsx("strong",{children:"👨💼 Peter the Product Manager"})," – Helps you know what users want"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"🧝♀️ Kellie the Co-worker"})," – Your co-worker who sometimes does work ahead of your exercises"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"🐨 Kody the Koala"})," – Tells you when there's something specific to do"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"🦺 Lily the Life Jacket"})," – Helps with TypeScript-specific parts"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"💰 Marty the Money Bag"})," – Gives specific tips and sometimes code"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"📝 Nancy the Notepad"})," – Encourages you to take notes"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"🦉 Olivia the Owl"})," – Gives useful tidbits and best practices"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"📜 Dominic the Document"})," – Links to useful documentation"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"💣 Barry the Bomb"})," – Indicates code to delete"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"💪 Matthew the Muscle"})," – Indicates you're working with an exercise"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"🏁 Chuck the Checkered Flag"})," – Indicates a final step"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"🚨 Alfred the Alert"})," – Shows up in test failures with explanations"]})]})]}),e.jsxs("section",{id:"need-help",className:"scroll-mt-8",children:[e.jsx("h2",{className:"text-h3 mb-4",children:"Need More Help?"}),e.jsxs("p",{children:["Visit our"," ",e.jsx(d,{to:"/support",className:"underline",children:"Support page"})," ","for additional help options, including Discord access and how to report issues."]})]})]}),e.jsx("aside",{className:"hidden w-48 shrink-0 lg:block",children:e.jsx(h,{activeSection:s})})]})})});export{g as default,p as handle};
|
|
9
|
-
//# sourceMappingURL=guide-B4wAqzq_.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"guide-B4wAqzq_.js","sources":["../../../app/routes/_app+/guide.tsx"],"sourcesContent":["import { type SEOHandle } from '@nasa-gcn/remix-seo'\nimport * as React from 'react'\nimport { Link } from 'react-router'\n\nexport const handle: SEOHandle = {\n\tgetSitemapEntries: () => [{ route: '/guide' }],\n}\n\nconst sections = [\n\t{ id: 'tutorial', label: 'Tutorial' },\n\t{ id: 'logging-in', label: 'Logging In' },\n\t{ id: 'workshop-structure', label: 'Workshop Structure' },\n\t{ id: 'lesson-page', label: 'The Lesson Page' },\n\t{ id: 'file-links', label: 'File Links' },\n\t{ id: 'setting-playground', label: 'Setting the Playground' },\n\t{ id: 'diff-tab', label: 'The Diff Tab' },\n\t{ id: 'tests', label: 'Tests' },\n\t{ id: 'keyboard-shortcuts', label: 'Keyboard Shortcuts' },\n\t{ id: 'cli-commands', label: 'CLI Commands' },\n\t{ id: 'ai-assistant', label: 'AI Assistant (MCP)' },\n\t{ id: 'emoji-key', label: 'Emoji Key' },\n\t{ id: 'need-help', label: 'Need More Help?' },\n] as const\n\nfunction TableOfContents({ activeSection }: { activeSection: string | null }) {\n\treturn (\n\t\t<nav className=\"sticky top-4 hidden lg:block\">\n\t\t\t<h2 className=\"text-muted-foreground mb-3 text-sm font-semibold tracking-wide uppercase\">\n\t\t\t\tOn this page\n\t\t\t</h2>\n\t\t\t<ul className=\"space-y-2 text-sm\">\n\t\t\t\t{sections.map((section) => (\n\t\t\t\t\t<li key={section.id}>\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref={`#${section.id}`}\n\t\t\t\t\t\t\tclassName={`block transition-colors ${\n\t\t\t\t\t\t\t\tactiveSection === section.id\n\t\t\t\t\t\t\t\t\t? 'text-highlight font-medium'\n\t\t\t\t\t\t\t\t\t: 'text-muted-foreground hover:text-foreground'\n\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{section.label}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</li>\n\t\t\t\t))}\n\t\t\t</ul>\n\t\t</nav>\n\t)\n}\n\nexport default function Guide() {\n\tconst [activeSection, setActiveSection] = React.useState<string | null>(null)\n\n\tReact.useEffect(() => {\n\t\tconst observer = new IntersectionObserver(\n\t\t\t(entries) => {\n\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\t\tsetActiveSection(entry.target.id)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\trootMargin: '-20% 0px -60% 0px',\n\t\t\t\tthreshold: 0,\n\t\t\t},\n\t\t)\n\n\t\tfor (const section of sections) {\n\t\t\tconst element = document.getElementById(section.id)\n\t\t\tif (element) {\n\t\t\t\tobserver.observe(element)\n\t\t\t}\n\t\t}\n\n\t\treturn () => observer.disconnect()\n\t}, [])\n\n\treturn (\n\t\t<div className=\"h-full w-full overflow-y-auto\">\n\t\t\t<div className=\"container mt-12 flex max-w-5xl gap-12 pb-24\">\n\t\t\t\t<main className=\"flex w-full max-w-3xl grow flex-col gap-8\">\n\t\t\t\t\t<h1 className=\"text-h1 mb-4\">Workshop App Guide</h1>\n\n\t\t\t\t\t<p className=\"text-lg\">\n\t\t\t\t\t\tThis guide will help you get the most out of the Epic Workshop App.\n\t\t\t\t\t\tWhether you're just getting started or need help troubleshooting,\n\t\t\t\t\t\tyou'll find useful information here.\n\t\t\t\t\t</p>\n\n\t\t\t\t\t<div id=\"tutorial\" className=\"bg-accent scroll-mt-8 rounded-lg p-6\">\n\t\t\t\t\t\t<h2 className=\"text-h4 mb-2\">🎓 New to the Workshop App?</h2>\n\t\t\t\t\t\t<p className=\"mb-4\">\n\t\t\t\t\t\t\tWe highly recommend going through the official tutorial to learn\n\t\t\t\t\t\t\tall the features the workshop app has to offer:\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<code className=\"bg-background block rounded p-3 font-mono text-sm\">\n\t\t\t\t\t\t\tnpx epicshop add epicshop-tutorial\n\t\t\t\t\t\t</code>\n\t\t\t\t\t\t<p className=\"text-muted-foreground mt-2 text-sm\">\n\t\t\t\t\t\t\tThis will add the tutorial workshop to your setup so you can learn\n\t\t\t\t\t\t\tat your own pace.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<section id=\"logging-in\" className=\"scroll-mt-8\">\n\t\t\t\t\t\t<h2 className=\"text-h3 mb-4\">Logging In</h2>\n\t\t\t\t\t\t<p className=\"mb-4\">\n\t\t\t\t\t\t\tLogging in unlocks important features that enhance your learning\n\t\t\t\t\t\t\texperience:\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<ul className=\"list-disc space-y-2 pl-6\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>Progress tracking</strong> – Your progress syncs across\n\t\t\t\t\t\t\t\tdevices and persists between sessions\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>Video access</strong> – Watch premium workshop videos\n\t\t\t\t\t\t\t\t(requires a valid license)\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>Discord integration</strong> – Connect with the\n\t\t\t\t\t\t\t\tcommunity and instructors\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\n\t\t\t\t\t\t<h3 className=\"text-h5 mt-6 mb-3\">How to Log In</h3>\n\t\t\t\t\t\t<p className=\"mb-4\">\n\t\t\t\t\t\t\tClick the <strong>Account</strong> link in the navigation (top\n\t\t\t\t\t\t\tright) and follow the login prompts. You can also log in via the\n\t\t\t\t\t\t\tCLI:\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<code className=\"bg-muted mb-4 block rounded p-3 font-mono text-sm\">\n\t\t\t\t\t\t\tepicshop auth login\n\t\t\t\t\t\t</code>\n\t\t\t\t\t\t<p className=\"mb-4\">\n\t\t\t\t\t\t\tThis opens a browser window where you can authenticate with your\n\t\t\t\t\t\t\tEpicWeb.dev, EpicReact.dev, or EpicAI.pro account.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p className=\"text-muted-foreground text-sm\">\n\t\t\t\t\t\t\tTip: Log in early to start tracking your progress from the\n\t\t\t\t\t\t\tbeginning!\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</section>\n\n\t\t\t\t\t<section id=\"workshop-structure\" className=\"scroll-mt-8\">\n\t\t\t\t\t\t<h2 className=\"text-h3 mb-4\">Workshop Structure</h2>\n\t\t\t\t\t\t<p className=\"mb-4\">\n\t\t\t\t\t\t\tEach workshop is a standalone project with a consistent structure:\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<ul className=\"list-disc space-y-2 pl-6\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>exercises/</strong> – Contains the \"problem\" and\n\t\t\t\t\t\t\t\t\"solution\" versions of each step. Treat this as a reference for\n\t\t\t\t\t\t\t\tafter the workshop.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>playground/</strong> – This is where your work takes\n\t\t\t\t\t\t\t\tplace. We recommend opening this directory as its own editor\n\t\t\t\t\t\t\t\tinstance for efficient file searching.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</section>\n\n\t\t\t\t\t<section id=\"lesson-page\" className=\"scroll-mt-8\">\n\t\t\t\t\t\t<h2 className=\"text-h3 mb-4\">The Lesson Page</h2>\n\t\t\t\t\t\t<p className=\"mb-4\">\n\t\t\t\t\t\t\tWhen you click into a lesson, the app displays the video along\n\t\t\t\t\t\t\twith written content, code snippets, and other useful information.\n\t\t\t\t\t\t\tTo the right is a pane with tabs:\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<ul className=\"list-disc space-y-2 pl-6\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>Playground</strong> – Where you'll spend most of your\n\t\t\t\t\t\t\t\ttime. You can interact with the app here or open it in a\n\t\t\t\t\t\t\t\tdedicated tab.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>Problem</strong> – The starting point of the exercise.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>Solution</strong> – The completed exercise state.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>Diff</strong> – Compare your current version against the\n\t\t\t\t\t\t\t\tfinished state. Use this if you get stuck, but try to avoid it\n\t\t\t\t\t\t\t\tif possible.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>Tests</strong> – If the exercise includes tests, they'll\n\t\t\t\t\t\t\t\tappear here to verify your work.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</section>\n\n\t\t\t\t\t<section id=\"file-links\" className=\"scroll-mt-8\">\n\t\t\t\t\t\t<h2 className=\"text-h3 mb-4\">File Links</h2>\n\t\t\t\t\t\t<p className=\"mb-4\">\n\t\t\t\t\t\t\tAt the bottom of a lesson page, the <strong>\"Files\"</strong>{' '}\n\t\t\t\t\t\t\tbutton opens a list of relevant files for the current exercise.\n\t\t\t\t\t\t\tClicking a file opens it directly in your editor at the right\n\t\t\t\t\t\t\tlocation.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p className=\"mb-4\">Key things to know:</p>\n\t\t\t\t\t\t<ul className=\"list-disc space-y-2 pl-6\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\tFiles are tied to your current Playground – make sure it's set\n\t\t\t\t\t\t\t\tto the lesson you're working on.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\tA <strong>\"+\"</strong> icon next to a filename means you need to\n\t\t\t\t\t\t\t\tcreate that file. Clicking it will create and open the file.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\tIf you see a red \"Set to Playground\" link, click it to sync the\n\t\t\t\t\t\t\t\tplayground for the current exercise.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\n\t\t\t\t\t\t<h3\n\t\t\t\t\t\t\tid=\"file-links-troubleshooting\"\n\t\t\t\t\t\t\tclassName=\"text-h4 mt-8 mb-4 scroll-mt-8\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tTroubleshooting\n\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t<p className=\"mb-4\">\n\t\t\t\t\t\t\tIf you're unable to open file links from the workshop app, create\n\t\t\t\t\t\t\ta <code className=\"bg-muted rounded px-1\">.env</code> file in the\n\t\t\t\t\t\t\troot of the workshop project and add:\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<code className=\"bg-muted mb-4 block rounded p-3 font-mono text-sm\">\n\t\t\t\t\t\t\tEPICSHOP_EDITOR=\"path/to/your/editor\"\n\t\t\t\t\t\t</code>\n\t\t\t\t\t\t<p className=\"mb-4\">Examples:</p>\n\t\t\t\t\t\t<ul className=\"list-disc space-y-2 pl-6\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>VS Code:</strong>{' '}\n\t\t\t\t\t\t\t\t<code className=\"bg-muted rounded px-1\">\n\t\t\t\t\t\t\t\t\tEPICSHOP_EDITOR=code\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>VS Code on Windows:</strong>{' '}\n\t\t\t\t\t\t\t\t<code className=\"bg-muted rounded px-1\">\n\t\t\t\t\t\t\t\t\tEPICSHOP_EDITOR='\"C:\\Program Files\\Microsoft VS\n\t\t\t\t\t\t\t\t\tCode\\bin\\code.cmd\"'\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>Cursor:</strong>{' '}\n\t\t\t\t\t\t\t\t<code className=\"bg-muted rounded px-1\">\n\t\t\t\t\t\t\t\t\tEPICSHOP_EDITOR=cursor\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t<p className=\"text-muted-foreground mt-4 text-sm\">\n\t\t\t\t\t\t\tNote: If the path includes spaces, wrap it in quotes as shown in\n\t\t\t\t\t\t\tthe Windows example.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p className=\"mt-4\">\n\t\t\t\t\t\t\tFor Cursor/VS Code users, you can also install the 'code' command\n\t\t\t\t\t\t\tin your PATH by opening the Command Palette (⌘⇧P on Mac,\n\t\t\t\t\t\t\tCtrl+Shift+P on Windows) and searching for \"Install 'code' command\n\t\t\t\t\t\t\tin PATH\".\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</section>\n\n\t\t\t\t\t<section id=\"setting-playground\" className=\"scroll-mt-8\">\n\t\t\t\t\t\t<h2 className=\"text-h3 mb-4\">Setting the Playground</h2>\n\t\t\t\t\t\t<p className=\"mb-4\">\n\t\t\t\t\t\t\tIf you navigate to a different exercise than what's currently\n\t\t\t\t\t\t\tloaded, a red <strong>\"Set to Playground\"</strong> link will\n\t\t\t\t\t\t\tappear. Clicking this syncs the playground for the appropriate\n\t\t\t\t\t\t\texercise.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p className=\"bg-warning text-warning-foreground rounded-lg p-4\">\n\t\t\t\t\t\t\t<strong>Important:</strong> Always have your Playground set to the\n\t\t\t\t\t\t\tlesson you're working on! This is not automated because you might\n\t\t\t\t\t\t\twant to refer back to previous exercises without losing your\n\t\t\t\t\t\t\tcurrent work.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</section>\n\n\t\t\t\t\t<section id=\"diff-tab\" className=\"scroll-mt-8\">\n\t\t\t\t\t\t<h2 className=\"text-h3 mb-4\">The Diff Tab</h2>\n\t\t\t\t\t\t<p className=\"mb-4\">\n\t\t\t\t\t\t\tThe diff tab helps you get unstuck when you're totally stuck. It\n\t\t\t\t\t\t\tshows the difference between your playground and the solution.\n\t\t\t\t\t\t\tThis is especially useful for catching typos or small mistakes.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<ul className=\"list-disc space-y-2 pl-6\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<span className=\"text-success font-mono\">+</span> lines (green)\n\t\t\t\t\t\t\t\tshow code that needs to be added\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<span className=\"text-foreground-destructive font-mono\">-</span>{' '}\n\t\t\t\t\t\t\t\tlines (red) show code that needs to be removed\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>Unchanged lines provide context around the changes</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t<p className=\"text-muted-foreground mt-4 text-sm\">\n\t\t\t\t\t\t\tTip: Try to avoid using the diff tab until you've made a solid\n\t\t\t\t\t\t\tattempt at the exercise. The learning happens in the struggle!\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</section>\n\n\t\t\t\t\t<section id=\"tests\" className=\"scroll-mt-8\">\n\t\t\t\t\t\t<h2 className=\"text-h3 mb-4\">Tests</h2>\n\t\t\t\t\t\t<p className=\"mb-4\">\n\t\t\t\t\t\t\tSome exercises include tests to verify your work. If available,\n\t\t\t\t\t\t\tthey appear in the Tests tab. Tests can run in two ways:\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<ul className=\"list-disc space-y-2 pl-6\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>Script-based:</strong> A button runs the test script and\n\t\t\t\t\t\t\t\tstreams the output\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>Browser-based:</strong> Test files are compiled and run\n\t\t\t\t\t\t\t\tdirectly in the browser\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t<p className=\"mt-4\">\n\t\t\t\t\t\t\tLook for 🚨 <strong>Alfred the Alert</strong> in test failures for\n\t\t\t\t\t\t\thelpful explanations about what went wrong.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</section>\n\n\t\t\t\t\t<section id=\"keyboard-shortcuts\" className=\"scroll-mt-8\">\n\t\t\t\t\t\t<h2 className=\"text-h3 mb-4\">Keyboard Shortcuts</h2>\n\t\t\t\t\t\t<p className=\"mb-4\">\n\t\t\t\t\t\t\tWhen the workshop server is running in your terminal, you can use\n\t\t\t\t\t\t\tthese keyboard shortcuts:\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<ul className=\"list-disc space-y-2 pl-6\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<kbd className=\"bg-muted rounded px-2 py-1 font-mono text-sm\">\n\t\t\t\t\t\t\t\t\tu\n\t\t\t\t\t\t\t\t</kbd>{' '}\n\t\t\t\t\t\t\t\t– Check for and apply updates to the workshop\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<kbd className=\"bg-muted rounded px-2 py-1 font-mono text-sm\">\n\t\t\t\t\t\t\t\t\td\n\t\t\t\t\t\t\t\t</kbd>{' '}\n\t\t\t\t\t\t\t\t– Dismiss update notifications\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t<p className=\"text-muted-foreground mt-4 text-sm\">\n\t\t\t\t\t\t\tThe server automatically restarts after updates are applied.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</section>\n\n\t\t\t\t\t<section id=\"cli-commands\" className=\"scroll-mt-8\">\n\t\t\t\t\t\t<h2 className=\"text-h3 mb-4\">CLI Commands</h2>\n\t\t\t\t\t\t<p className=\"mb-4\">\n\t\t\t\t\t\t\tThe <code className=\"bg-muted rounded px-1\">epicshop</code> CLI\n\t\t\t\t\t\t\tprovides useful commands for managing your workshop:\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<code className=\"bg-muted block rounded p-3 font-mono text-sm\">\n\t\t\t\t\t\t\t\t\tepicshop start\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground mt-1 text-sm\">\n\t\t\t\t\t\t\t\t\tStart the workshop (or just run{' '}\n\t\t\t\t\t\t\t\t\t<code className=\"bg-muted rounded px-1\">npm start</code>)\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<code className=\"bg-muted block rounded p-3 font-mono text-sm\">\n\t\t\t\t\t\t\t\t\tepicshop playground set\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground mt-1 text-sm\">\n\t\t\t\t\t\t\t\t\tSet the playground to the next incomplete step\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<code className=\"bg-muted block rounded p-3 font-mono text-sm\">\n\t\t\t\t\t\t\t\t\tepicshop diff\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground mt-1 text-sm\">\n\t\t\t\t\t\t\t\t\tShow the diff between your playground and the solution in the\n\t\t\t\t\t\t\t\t\tterminal\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<code className=\"bg-muted block rounded p-3 font-mono text-sm\">\n\t\t\t\t\t\t\t\t\tepicshop progress\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground mt-1 text-sm\">\n\t\t\t\t\t\t\t\t\tView your progress through the workshop\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<code className=\"bg-muted block rounded p-3 font-mono text-sm\">\n\t\t\t\t\t\t\t\t\tepicshop exercises\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground mt-1 text-sm\">\n\t\t\t\t\t\t\t\t\tList all exercises with completion status\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<p className=\"mt-4\">\n\t\t\t\t\t\t\tRun <code className=\"bg-muted rounded px-1\">epicshop --help</code>{' '}\n\t\t\t\t\t\t\tto see all available commands.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</section>\n\n\t\t\t\t\t<section id=\"ai-assistant\" className=\"scroll-mt-8\">\n\t\t\t\t\t\t<h2 className=\"text-h3 mb-4\">AI Assistant (MCP)</h2>\n\t\t\t\t\t\t<p className=\"mb-4\">\n\t\t\t\t\t\t\tIf you use an AI assistant that supports{' '}\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref=\"https://modelcontextprotocol.io/\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tMCP (Model Context Protocol)\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t, you can install the Epic Workshop MCP server to enhance your\n\t\t\t\t\t\t\tlearning experience.\n\t\t\t\t\t\t</p>\n\n\t\t\t\t\t\t<h3 className=\"text-h5 mt-6 mb-3\">What it provides</h3>\n\t\t\t\t\t\t<ul className=\"list-disc space-y-2 pl-6\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>Exercise context:</strong> Your AI can understand what\n\t\t\t\t\t\t\t\tyou're working on and provide relevant help\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>Progress tracking:</strong> Mark lessons complete\n\t\t\t\t\t\t\t\tdirectly through your AI\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>Diff viewing:</strong> Ask your AI to show you what\n\t\t\t\t\t\t\t\tchanges are needed\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>File opening:</strong> Have your AI open the relevant\n\t\t\t\t\t\t\t\tfiles in your editor\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>Quiz mode:</strong> Ask your AI to quiz you on workshop\n\t\t\t\t\t\t\t\ttopics\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\n\t\t\t\t\t\t<h3 className=\"text-h5 mt-6 mb-3\">Installation</h3>\n\t\t\t\t\t\t<p className=\"mb-4\">\n\t\t\t\t\t\t\tAdd the following to your AI assistant's MCP configuration (e.g.,\n\t\t\t\t\t\t\tClaude Desktop):\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<pre className=\"bg-muted overflow-x-auto rounded p-4 font-mono text-sm\">\n\t\t\t\t\t\t\t{`{\n \"mcpServers\": {\n \"epicshop\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@epic-web/workshop-mcp\"]\n }\n }\n}`}\n\t\t\t\t\t\t</pre>\n\t\t\t\t\t\t<p className=\"text-muted-foreground mt-4 text-sm\">\n\t\t\t\t\t\t\tMake sure to run your AI assistant from within the workshop\n\t\t\t\t\t\t\tdirectory so the MCP server can find the right files.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</section>\n\n\t\t\t\t\t<section id=\"emoji-key\" className=\"scroll-mt-8\">\n\t\t\t\t\t\t<h2 className=\"text-h3 mb-4\">Emoji Key</h2>\n\t\t\t\t\t\t<p className=\"mb-4\">\n\t\t\t\t\t\t\tEach exercise has comments with helpful emoji characters:\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<ul className=\"space-y-2 pl-6\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>👨💼 Peter the Product Manager</strong> – Helps you know\n\t\t\t\t\t\t\t\twhat users want\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>🧝♀️ Kellie the Co-worker</strong> – Your co-worker who\n\t\t\t\t\t\t\t\tsometimes does work ahead of your exercises\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>🐨 Kody the Koala</strong> – Tells you when there's\n\t\t\t\t\t\t\t\tsomething specific to do\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>🦺 Lily the Life Jacket</strong> – Helps with\n\t\t\t\t\t\t\t\tTypeScript-specific parts\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>💰 Marty the Money Bag</strong> – Gives specific tips\n\t\t\t\t\t\t\t\tand sometimes code\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>📝 Nancy the Notepad</strong> – Encourages you to take\n\t\t\t\t\t\t\t\tnotes\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>🦉 Olivia the Owl</strong> – Gives useful tidbits and\n\t\t\t\t\t\t\t\tbest practices\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>📜 Dominic the Document</strong> – Links to useful\n\t\t\t\t\t\t\t\tdocumentation\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>💣 Barry the Bomb</strong> – Indicates code to delete\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>💪 Matthew the Muscle</strong> – Indicates you're\n\t\t\t\t\t\t\t\tworking with an exercise\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>🏁 Chuck the Checkered Flag</strong> – Indicates a final\n\t\t\t\t\t\t\t\tstep\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<strong>🚨 Alfred the Alert</strong> – Shows up in test failures\n\t\t\t\t\t\t\t\twith explanations\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</section>\n\n\t\t\t\t\t<section id=\"need-help\" className=\"scroll-mt-8\">\n\t\t\t\t\t\t<h2 className=\"text-h3 mb-4\">Need More Help?</h2>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\tVisit our{' '}\n\t\t\t\t\t\t\t<Link to=\"/support\" className=\"underline\">\n\t\t\t\t\t\t\t\tSupport page\n\t\t\t\t\t\t\t</Link>{' '}\n\t\t\t\t\t\t\tfor additional help options, including Discord access and how to\n\t\t\t\t\t\t\treport issues.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</section>\n\t\t\t\t</main>\n\t\t\t\t<aside className=\"hidden w-48 shrink-0 lg:block\">\n\t\t\t\t\t<TableOfContents activeSection={activeSection} />\n\t\t\t\t</aside>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n"],"names":["handle","getSitemapEntries","route","sections","id","label","TableOfContents","activeSection","jsxs","className","children","jsx","map","section","href","guide","_UNSAFE_withComponentProps","setActiveSection","React","observer","IntersectionObserver","entries","entry","isIntersecting","target","rootMargin","threshold","element","document","getElementById","observe","disconnect","rel","Link","to"],"mappings":"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"}
|