@epic-web/workshop-app 6.14.2 → 6.14.4
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/{_-DV4Ha66L.js → _-9LaapxAI.js} +2 -2
- package/build/client/assets/{_-DV4Ha66L.js.map → _-9LaapxAI.js.map} +1 -1
- package/build/client/assets/_-BlUNM4zq.js +2 -0
- package/build/client/assets/_-BlUNM4zq.js.map +1 -0
- package/build/client/assets/{_basePickBy-BXbL7qon.js → _basePickBy-CbAJC3M4.js} +2 -2
- package/build/client/assets/{_basePickBy-BXbL7qon.js.map → _basePickBy-CbAJC3M4.js.map} +1 -1
- package/build/client/assets/{_baseUniq-CtZFfRif.js → _baseUniq-DTVooXyu.js} +2 -2
- package/build/client/assets/{_baseUniq-CtZFfRif.js.map → _baseUniq-DTVooXyu.js.map} +1 -1
- package/build/client/assets/{_exerciseNumber-BcHM923A.js → _exerciseNumber-BjFJaUkO.js} +2 -2
- package/build/client/assets/{_exerciseNumber-BcHM923A.js.map → _exerciseNumber-BjFJaUkO.js.map} +1 -1
- package/build/client/assets/{_exerciseNumber_._stepNumber-DkoV9tCf.js → _exerciseNumber_._stepNumber-CF1R08wi.js} +2 -2
- package/build/client/assets/{_exerciseNumber_._stepNumber-DkoV9tCf.js.map → _exerciseNumber_._stepNumber-CF1R08wi.js.map} +1 -1
- package/build/client/assets/_exerciseNumber_._stepNumber.index-C_6vCTaR.js +2 -0
- package/build/client/assets/_exerciseNumber_._stepNumber.index-C_6vCTaR.js.map +1 -0
- package/build/client/assets/{_exerciseNumber_.finished-BzyI4yot.js → _exerciseNumber_.finished-CYjuSr3V.js} +2 -2
- package/build/client/assets/{_exerciseNumber_.finished-BzyI4yot.js.map → _exerciseNumber_.finished-CYjuSr3V.js.map} +1 -1
- package/build/client/assets/{_layout-EWv-HN0t.js → _layout-4_y1jBpR.js} +2 -2
- package/build/client/assets/{_layout-EWv-HN0t.js.map → _layout-4_y1jBpR.js.map} +1 -1
- package/build/client/assets/{_layout-DHLUa4_9.js → _layout-BENlQ_xx.js} +2 -2
- package/build/client/assets/{_layout-DHLUa4_9.js.map → _layout-BENlQ_xx.js.map} +1 -1
- package/build/client/assets/{_layout-C2qBYSs9.js → _layout-CTcFGMiI.js} +2 -2
- package/build/client/assets/{_layout-C2qBYSs9.js.map → _layout-CTcFGMiI.js.map} +1 -1
- package/build/client/assets/_layout-jvQa-VjB.js +2 -0
- package/build/client/assets/{_layout-DQs7hBSg.js.map → _layout-jvQa-VjB.js.map} +1 -1
- package/build/client/assets/{accordion-BNwue7tP.js → accordion-BpWAQcUa.js} +2 -2
- package/build/client/assets/{accordion-BNwue7tP.js.map → accordion-BpWAQcUa.js.map} +1 -1
- package/build/client/assets/{account-DpWyl5D8.js → account-BLfcW032.js} +2 -2
- package/build/client/assets/{account-DpWyl5D8.js.map → account-BLfcW032.js.map} +1 -1
- package/build/client/assets/api._-C_6vCTaR.js +2 -0
- package/build/client/assets/api._-C_6vCTaR.js.map +1 -0
- package/build/client/assets/app-6dAYCqBT.js +2 -0
- package/build/client/assets/{app-B6Asqz0_.js.map → app-6dAYCqBT.js.map} +1 -1
- package/build/client/assets/app.epic_ws_.js_-C_6vCTaR.js +2 -0
- package/build/client/assets/app.epic_ws_.js_-C_6vCTaR.js.map +1 -0
- package/build/client/assets/apps-C_6vCTaR.js +2 -0
- package/build/client/assets/apps-C_6vCTaR.js.map +1 -0
- package/build/client/assets/apps-TWHOUoXd.js +2 -0
- package/build/client/assets/apps-TWHOUoXd.js.map +1 -0
- package/build/client/assets/{arc-BMVfhJT3.js → arc-BskUIF5k.js} +2 -2
- package/build/client/assets/{arc-BMVfhJT3.js.map → arc-BskUIF5k.js.map} +1 -1
- package/build/client/assets/{architectureDiagram-NQ2NVSRB-BIdrgV0s.js → architectureDiagram-NQ2NVSRB-D1HJz8yO.js} +2 -2
- package/build/client/assets/{architectureDiagram-NQ2NVSRB-BIdrgV0s.js.map → architectureDiagram-NQ2NVSRB-D1HJz8yO.js.map} +1 -1
- package/build/client/assets/{blockDiagram-PHRCVELO-BbpPuqMV.js → blockDiagram-PHRCVELO-DCrhcwkq.js} +2 -2
- package/build/client/assets/{blockDiagram-PHRCVELO-BbpPuqMV.js.map → blockDiagram-PHRCVELO-DCrhcwkq.js.map} +1 -1
- package/build/client/assets/{button-D02M3k_A.js → button-BNGMuAvW.js} +2 -2
- package/build/client/assets/{button-D02M3k_A.js.map → button-BNGMuAvW.js.map} +1 -1
- package/build/client/assets/{c4Diagram-6F6E4RAY-fp3r0ui0.js → c4Diagram-6F6E4RAY-ab4B6ycV.js} +2 -2
- package/build/client/assets/{c4Diagram-6F6E4RAY-fp3r0ui0.js.map → c4Diagram-6F6E4RAY-ab4B6ycV.js.map} +1 -1
- package/build/client/assets/cache-C_6vCTaR.js +2 -0
- package/build/client/assets/cache-C_6vCTaR.js.map +1 -0
- package/build/client/assets/channel-DWOje55X.js +2 -0
- package/build/client/assets/{channel-BWGVHDK-.js.map → channel-DWOje55X.js.map} +1 -1
- package/build/client/assets/{chunk-353BL4L5-C8aHupyU.js → chunk-353BL4L5-Bz7wi5XS.js} +2 -2
- package/build/client/assets/{chunk-353BL4L5-C8aHupyU.js.map → chunk-353BL4L5-Bz7wi5XS.js.map} +1 -1
- package/build/client/assets/{chunk-67H74DCK-BOeVunjk.js → chunk-67H74DCK-D5BP4wQy.js} +2 -2
- package/build/client/assets/{chunk-67H74DCK-BOeVunjk.js.map → chunk-67H74DCK-D5BP4wQy.js.map} +1 -1
- package/build/client/assets/{chunk-6OLS64BW-CFvuQ04p.js → chunk-6OLS64BW-DJ3kJWo9.js} +2 -2
- package/build/client/assets/{chunk-6OLS64BW-CFvuQ04p.js.map → chunk-6OLS64BW-DJ3kJWo9.js.map} +1 -1
- package/build/client/assets/{chunk-AACKK3MU-BetTIqd0.js → chunk-AACKK3MU-CaKDxoFt.js} +2 -2
- package/build/client/assets/{chunk-AACKK3MU-BetTIqd0.js.map → chunk-AACKK3MU-CaKDxoFt.js.map} +1 -1
- package/build/client/assets/{chunk-BFAMUDN2-C2PbRhzm.js → chunk-BFAMUDN2-FXeA9ocP.js} +2 -2
- package/build/client/assets/{chunk-BFAMUDN2-C2PbRhzm.js.map → chunk-BFAMUDN2-FXeA9ocP.js.map} +1 -1
- package/build/client/assets/{chunk-E2GYISFI-Bl4n1xdN.js → chunk-E2GYISFI-BQkQlNBL.js} +2 -2
- package/build/client/assets/{chunk-E2GYISFI-Bl4n1xdN.js.map → chunk-E2GYISFI-BQkQlNBL.js.map} +1 -1
- package/build/client/assets/{chunk-QEP2MXWD-mvodIAlz.js → chunk-QEP2MXWD-Cck1IPNo.js} +2 -2
- package/build/client/assets/{chunk-QEP2MXWD-mvodIAlz.js.map → chunk-QEP2MXWD-Cck1IPNo.js.map} +1 -1
- package/build/client/assets/{chunk-QMGIS6GS-Du-_uMOD.js → chunk-QMGIS6GS-X4HtlbLW.js} +2 -2
- package/build/client/assets/{chunk-QMGIS6GS-Du-_uMOD.js.map → chunk-QMGIS6GS-X4HtlbLW.js.map} +1 -1
- package/build/client/assets/{chunk-SKB7J2MH-Bbw5Ks_7.js → chunk-SKB7J2MH-BRNfjEbC.js} +2 -2
- package/build/client/assets/{chunk-SKB7J2MH-Bbw5Ks_7.js.map → chunk-SKB7J2MH-BRNfjEbC.js.map} +1 -1
- package/build/client/assets/classDiagram-BGRH5UQR-C9gEbhZD.js +2 -0
- package/build/client/assets/{classDiagram-BGRH5UQR-B43E4NNs.js.map → classDiagram-BGRH5UQR-C9gEbhZD.js.map} +1 -1
- package/build/client/assets/classDiagram-v2-O24JOBDK-C9gEbhZD.js +2 -0
- package/build/client/assets/{classDiagram-v2-O24JOBDK-B43E4NNs.js.map → classDiagram-v2-O24JOBDK-C9gEbhZD.js.map} +1 -1
- package/build/client/assets/clone-Dw92nCw9.js +2 -0
- package/build/client/assets/{clone-BniOf7Yb.js.map → clone-Dw92nCw9.js.map} +1 -1
- package/build/client/assets/{dagre-FFZHY6LT-vKH6qeW_.js → dagre-FFZHY6LT-B3IZ9n5v.js} +2 -2
- package/build/client/assets/{dagre-FFZHY6LT-vKH6qeW_.js.map → dagre-FFZHY6LT-B3IZ9n5v.js.map} +1 -1
- package/build/client/assets/{diagram-3EMPZRKU-D3BTQE0v.js → diagram-3EMPZRKU-C94TV-tA.js} +2 -2
- package/build/client/assets/{diagram-3EMPZRKU-D3BTQE0v.js.map → diagram-3EMPZRKU-C94TV-tA.js.map} +1 -1
- package/build/client/assets/{diagram-5UYTHUR4-BadShsGf.js → diagram-5UYTHUR4-BToN03QA.js} +2 -2
- package/build/client/assets/{diagram-5UYTHUR4-BadShsGf.js.map → diagram-5UYTHUR4-BToN03QA.js.map} +1 -1
- package/build/client/assets/{diagram-ZTM2IBQH-D9jJN3bl.js → diagram-ZTM2IBQH-0Lnh9m5j.js} +2 -2
- package/build/client/assets/{diagram-ZTM2IBQH-D9jJN3bl.js.map → diagram-ZTM2IBQH-0Lnh9m5j.js.map} +1 -1
- package/build/client/assets/diff-CN-quaHO.js +2 -0
- package/build/client/assets/{diff-CQVU7E-h.js.map → diff-CN-quaHO.js.map} +1 -1
- package/build/client/assets/{diff-B376IevU.js → diff-CiQricTa.js} +2 -2
- package/build/client/assets/{diff-B376IevU.js.map → diff-CiQricTa.js.map} +1 -1
- package/build/client/assets/{discord-Cx03Cky4.js → discord-BIqeUp96.js} +2 -2
- package/build/client/assets/{discord-Cx03Cky4.js.map → discord-BIqeUp96.js.map} +1 -1
- package/build/client/assets/discord-BWD2Bv5N.js +2 -0
- package/build/client/assets/discord-BWD2Bv5N.js.map +1 -0
- package/build/client/assets/{entry.client-C-f7Acxq.js → entry.client-CZqsV16s.js} +2 -2
- package/build/client/assets/{entry.client-C-f7Acxq.js.map → entry.client-CZqsV16s.js.map} +1 -1
- package/build/client/assets/{epic-video-CYB9v08Z.js → epic-video-7tluZCfa.js} +2 -2
- package/build/client/assets/{epic-video-CYB9v08Z.js.map → epic-video-7tluZCfa.js.map} +1 -1
- package/build/client/assets/epic_ws_.js_-C_6vCTaR.js +2 -0
- package/build/client/assets/epic_ws_.js_-C_6vCTaR.js.map +1 -0
- package/build/client/assets/{erDiagram-R3QVA2FD-DA8ObfcQ.js → erDiagram-R3QVA2FD-afF_yaYi.js} +2 -2
- package/build/client/assets/{erDiagram-R3QVA2FD-DA8ObfcQ.js.map → erDiagram-R3QVA2FD-afF_yaYi.js.map} +1 -1
- package/build/client/assets/{error-boundary-BVQLpMgs.js → error-boundary-oSG-ExEd.js} +2 -2
- package/build/client/assets/{error-boundary-BVQLpMgs.js.map → error-boundary-oSG-ExEd.js.map} +1 -1
- package/build/client/assets/exercises-C_6vCTaR.js +2 -0
- package/build/client/assets/exercises-C_6vCTaR.js.map +1 -0
- package/build/client/assets/{finished-CdbbjXVl.js → finished-DiGjrltK.js} +2 -2
- package/build/client/assets/{finished-CdbbjXVl.js.map → finished-DiGjrltK.js.map} +1 -1
- package/build/client/assets/{flowDiagram-PKI6S5ZS-Cl53QYkW.js → flowDiagram-PKI6S5ZS-DywOldvN.js} +2 -2
- package/build/client/assets/{flowDiagram-PKI6S5ZS-Cl53QYkW.js.map → flowDiagram-PKI6S5ZS-DywOldvN.js.map} +1 -1
- package/build/client/assets/{ganttDiagram-EK5VF46D-BvSMSlCf.js → ganttDiagram-EK5VF46D-CZ-7epBO.js} +2 -2
- package/build/client/assets/{ganttDiagram-EK5VF46D-BvSMSlCf.js.map → ganttDiagram-EK5VF46D-CZ-7epBO.js.map} +1 -1
- package/build/client/assets/{gitGraphDiagram-GW3U2K7C-BC4jDCQG.js → gitGraphDiagram-GW3U2K7C-Btut14eC.js} +2 -2
- package/build/client/assets/{gitGraphDiagram-GW3U2K7C-BC4jDCQG.js.map → gitGraphDiagram-GW3U2K7C-Btut14eC.js.map} +1 -1
- package/build/client/assets/{graph-DmoNxkW1.js → graph-CiKthlUH.js} +2 -2
- package/build/client/assets/{graph-DmoNxkW1.js.map → graph-CiKthlUH.js.map} +1 -1
- package/build/client/assets/healthcheck-C_6vCTaR.js +2 -0
- package/build/client/assets/healthcheck-C_6vCTaR.js.map +1 -0
- package/build/client/assets/{index-CBUrmkWa.js → index-B8ExQ-5A.js} +2 -2
- package/build/client/assets/{index-CBUrmkWa.js.map → index-B8ExQ-5A.js.map} +1 -1
- package/build/client/assets/{index-DxebmNVe.js → index-BOxmeO6h.js} +2 -2
- package/build/client/assets/{index-DxebmNVe.js.map → index-BOxmeO6h.js.map} +1 -1
- package/build/client/assets/{index-DhyRhm-a.js → index-BrSaFy9r.js} +2 -2
- package/build/client/assets/{index-DhyRhm-a.js.map → index-BrSaFy9r.js.map} +1 -1
- package/build/client/assets/{index-B8smZwSG.js → index-CGfgwl2o.js} +2 -2
- package/build/client/assets/{index-B8smZwSG.js.map → index-CGfgwl2o.js.map} +1 -1
- package/build/client/assets/{index-wYr49Min.js → index-CICRWfwA.js} +2 -2
- package/build/client/assets/{index-wYr49Min.js.map → index-CICRWfwA.js.map} +1 -1
- package/build/client/assets/{index-CsJM7KSY.js → index-CQ9ND9HU.js} +2 -2
- package/build/client/assets/{index-CsJM7KSY.js.map → index-CQ9ND9HU.js.map} +1 -1
- package/build/client/assets/index-C_6vCTaR.js +2 -0
- package/build/client/assets/index-C_6vCTaR.js.map +1 -0
- package/build/client/assets/index-Clt4RPat.js +2 -0
- package/build/client/assets/index-Clt4RPat.js.map +1 -0
- package/build/client/assets/{index-C245u_6M.js → index-CxkovwXQ.js} +2 -2
- package/build/client/assets/{index-C245u_6M.js.map → index-CxkovwXQ.js.map} +1 -1
- package/build/client/assets/{index-2LBjIZsR.js → index-DHMekvRa.js} +2 -2
- package/build/client/assets/{index-2LBjIZsR.js.map → index-DHMekvRa.js.map} +1 -1
- package/build/client/assets/{index-CQpafIsR.js → index-Dn1v9SdB.js} +2 -2
- package/build/client/assets/{index-CQpafIsR.js.map → index-Dn1v9SdB.js.map} +1 -1
- package/build/client/assets/index-TWHOUoXd.js +2 -0
- package/build/client/assets/index-TWHOUoXd.js.map +1 -0
- package/build/client/assets/infoDiagram-XT3IWWJI-D1T7Cq6a.js +3 -0
- package/build/client/assets/{infoDiagram-XT3IWWJI-_8npXlsz.js.map → infoDiagram-XT3IWWJI-D1T7Cq6a.js.map} +1 -1
- package/build/client/assets/{journeyDiagram-EWQZEKCU-CLMB5SLF.js → journeyDiagram-EWQZEKCU-B9UIsr9b.js} +2 -2
- package/build/client/assets/{journeyDiagram-EWQZEKCU-CLMB5SLF.js.map → journeyDiagram-EWQZEKCU-B9UIsr9b.js.map} +1 -1
- package/build/client/assets/{jsx-runtime-DKBD_fLS.js → jsx-runtime-DsURZTcu.js} +2 -2
- package/build/client/assets/{jsx-runtime-DKBD_fLS.js.map → jsx-runtime-DsURZTcu.js.map} +1 -1
- package/build/client/assets/{kanban-definition-ILFWEQ3N-5PudnDcU.js → kanban-definition-ILFWEQ3N-CyKyZ6Wh.js} +2 -2
- package/build/client/assets/{kanban-definition-ILFWEQ3N-5PudnDcU.js.map → kanban-definition-ILFWEQ3N-CyKyZ6Wh.js.map} +1 -1
- package/build/client/assets/l-8o5tPY9F.js +2 -0
- package/build/client/assets/{l-CjuVWd7j.js.map → l-8o5tPY9F.js.map} +1 -1
- package/build/client/assets/launch-editor-C_6vCTaR.js +2 -0
- package/build/client/assets/launch-editor-C_6vCTaR.js.map +1 -0
- package/build/client/assets/{layout-BXfvL1vj.js → layout-BA1bIau_.js} +2 -2
- package/build/client/assets/{layout-BXfvL1vj.js.map → layout-BA1bIau_.js.map} +1 -1
- package/build/client/assets/{linear-DhCwCW7Y.js → linear-Bug06cVg.js} +2 -2
- package/build/client/assets/{linear-DhCwCW7Y.js.map → linear-Bug06cVg.js.map} +1 -1
- package/build/client/assets/{loading-BuvISkeY.js → loading-DzDAEykN.js} +2 -2
- package/build/client/assets/{loading-BuvISkeY.js.map → loading-DzDAEykN.js.map} +1 -1
- package/build/client/assets/{login-BH4ljGt7.js → login-CL5KBzmc.js} +2 -2
- package/build/client/assets/{login-BH4ljGt7.js.map → login-CL5KBzmc.js.map} +1 -1
- package/build/client/assets/login-sse-C_6vCTaR.js +2 -0
- package/build/client/assets/login-sse-C_6vCTaR.js.map +1 -0
- package/build/client/assets/lookout-C_6vCTaR.js +2 -0
- package/build/client/assets/lookout-C_6vCTaR.js.map +1 -0
- package/build/client/assets/manifest-b5b0413b.js +1 -0
- package/build/client/assets/{mdx-DdK1AGxI.js → mdx-Dvg0ifxF.js} +3 -3
- package/build/client/assets/{mdx-DdK1AGxI.js.map → mdx-Dvg0ifxF.js.map} +1 -1
- package/build/client/assets/{mermaid.core-tdjgKLol.js → mermaid.core-CRanZ2_x.js} +5 -5
- package/build/client/assets/{mermaid.core-tdjgKLol.js.map → mermaid.core-CRanZ2_x.js.map} +1 -1
- package/build/client/assets/{mindmap-definition-CZNETY7S-DocEjJYU.js → mindmap-definition-CZNETY7S-DtPMn4z7.js} +2 -2
- package/build/client/assets/{mindmap-definition-CZNETY7S-DocEjJYU.js.map → mindmap-definition-CZNETY7S-DtPMn4z7.js.map} +1 -1
- package/build/client/assets/{misc-D7yrZhQB.js → misc-C_Wy6Ozi.js} +2 -2
- package/build/client/assets/{misc-D7yrZhQB.js.map → misc-C_Wy6Ozi.js.map} +1 -1
- package/build/client/assets/{nav-chevrons-DWkM88G0.js → nav-chevrons-CkjJbQ8J.js} +2 -2
- package/build/client/assets/{nav-chevrons-DWkM88G0.js.map → nav-chevrons-CkjJbQ8J.js.map} +1 -1
- package/build/client/assets/notifications-C_6vCTaR.js +2 -0
- package/build/client/assets/notifications-C_6vCTaR.js.map +1 -0
- package/build/client/assets/og-C_6vCTaR.js +2 -0
- package/build/client/assets/og-C_6vCTaR.js.map +1 -0
- package/build/client/assets/{onboarding-C59GmR50.js → onboarding-BNOIjq0D.js} +2 -2
- package/build/client/assets/{onboarding-C59GmR50.js.map → onboarding-BNOIjq0D.js.map} +1 -1
- package/build/client/assets/{online-D4vODkth.js → online-TZVMTbWw.js} +2 -2
- package/build/client/assets/{online-D4vODkth.js.map → online-TZVMTbWw.js.map} +1 -1
- package/build/client/assets/{pe-CdmQkMqU.js → pe-Cte41gbF.js} +2 -2
- package/build/client/assets/{pe-CdmQkMqU.js.map → pe-Cte41gbF.js.map} +1 -1
- package/build/client/assets/{pieDiagram-NIOCPIFQ-DVmMnK74.js → pieDiagram-NIOCPIFQ-i9_oP5Hn.js} +2 -2
- package/build/client/assets/{pieDiagram-NIOCPIFQ-DVmMnK74.js.map → pieDiagram-NIOCPIFQ-i9_oP5Hn.js.map} +1 -1
- package/build/client/assets/{preferences-DfB9rP8a.js → preferences-C7fRT1yj.js} +2 -2
- package/build/client/assets/{preferences-DfB9rP8a.js.map → preferences-C7fRT1yj.js.map} +1 -1
- package/build/client/assets/{presence-DWQewy5j.js → presence-BgXbhCXw.js} +2 -2
- package/build/client/assets/{presence-DWQewy5j.js.map → presence-BgXbhCXw.js.map} +1 -1
- package/build/client/assets/{preview-CwjqbpcS.js → preview-BhbWtM_7.js} +2 -2
- package/build/client/assets/{preview-CwjqbpcS.js.map → preview-BhbWtM_7.js.map} +1 -1
- package/build/client/assets/processes-C_6vCTaR.js +2 -0
- package/build/client/assets/processes-C_6vCTaR.js.map +1 -0
- package/build/client/assets/{product-KkdaVQou.js → product-CYLzCZoj.js} +2 -2
- package/build/client/assets/{product-KkdaVQou.js.map → product-CYLzCZoj.js.map} +1 -1
- package/build/client/assets/{progress-CdZ-Vcyn.js → progress-BV2BTh46.js} +2 -2
- package/build/client/assets/{progress-CdZ-Vcyn.js.map → progress-BV2BTh46.js.map} +1 -1
- package/build/client/assets/progress-C_6vCTaR.js +2 -0
- package/build/client/assets/progress-C_6vCTaR.js.map +1 -0
- package/build/client/assets/{progress-bar-B3_pKtoN.js → progress-bar-D6ygvlaD.js} +2 -2
- package/build/client/assets/{progress-bar-B3_pKtoN.js.map → progress-bar-D6ygvlaD.js.map} +1 -1
- package/build/client/assets/{quadrantDiagram-2OG54O6I-BpG5BmQ3.js → quadrantDiagram-2OG54O6I-18jYaX1U.js} +2 -2
- package/build/client/assets/{quadrantDiagram-2OG54O6I-BpG5BmQ3.js.map → quadrantDiagram-2OG54O6I-18jYaX1U.js.map} +1 -1
- package/build/client/assets/{requirementDiagram-SO3GGRV7-CeVkImIX.js → requirementDiagram-SO3GGRV7-Xw6z7_yk.js} +2 -2
- package/build/client/assets/{requirementDiagram-SO3GGRV7-CeVkImIX.js.map → requirementDiagram-SO3GGRV7-Xw6z7_yk.js.map} +1 -1
- package/build/client/assets/{revalidation-ws-Do4fE9JQ.js → revalidation-ws-kMaOT4Vi.js} +2 -2
- package/build/client/assets/{revalidation-ws-Do4fE9JQ.js.map → revalidation-ws-kMaOT4Vi.js.map} +1 -1
- package/build/client/assets/robots_._txt-C_6vCTaR.js +2 -0
- package/build/client/assets/robots_._txt-C_6vCTaR.js.map +1 -0
- package/build/client/assets/{root-C0Bm0Ely.js → root-CeBcwH5A.js} +2 -2
- package/build/client/assets/{root-C0Bm0Ely.js.map → root-CeBcwH5A.js.map} +1 -1
- package/build/client/assets/{sankeyDiagram-4UZDY2LN-CMy-UAmy.js → sankeyDiagram-4UZDY2LN-BqXSiD2M.js} +2 -2
- package/build/client/assets/{sankeyDiagram-4UZDY2LN-CMy-UAmy.js.map → sankeyDiagram-4UZDY2LN-BqXSiD2M.js.map} +1 -1
- package/build/client/assets/{seo-P_yhbn7-.js → seo-CQ4WV-0-.js} +2 -2
- package/build/client/assets/{seo-P_yhbn7-.js.map → seo-CQ4WV-0-.js.map} +1 -1
- package/build/client/assets/{sequenceDiagram-ZIKVLSP4-BvE7ME5W.js → sequenceDiagram-ZIKVLSP4-vUDUv2_D.js} +2 -2
- package/build/client/assets/{sequenceDiagram-ZIKVLSP4-BvE7ME5W.js.map → sequenceDiagram-ZIKVLSP4-vUDUv2_D.js.map} +1 -1
- package/build/client/assets/set-playground-C_6vCTaR.js +2 -0
- package/build/client/assets/set-playground-C_6vCTaR.js.map +1 -0
- package/build/client/assets/{set-playground-1BzordBz.js → set-playground-UCfTdubZ.js} +2 -2
- package/build/client/assets/{set-playground-1BzordBz.js.map → set-playground-UCfTdubZ.js.map} +1 -1
- package/build/client/assets/sitemap_._xml-C_6vCTaR.js +2 -0
- package/build/client/assets/sitemap_._xml-C_6vCTaR.js.map +1 -0
- package/build/client/assets/start-C_6vCTaR.js +2 -0
- package/build/client/assets/start-C_6vCTaR.js.map +1 -0
- package/build/client/assets/{stateDiagram-XX37X6EN-DZlrR-hS.js → stateDiagram-XX37X6EN-CS5kjJa3.js} +2 -2
- package/build/client/assets/{stateDiagram-XX37X6EN-DZlrR-hS.js.map → stateDiagram-XX37X6EN-CS5kjJa3.js.map} +1 -1
- package/build/client/assets/stateDiagram-v2-GD6S3NHB-Bc7inWs3.js +2 -0
- package/build/client/assets/{stateDiagram-v2-GD6S3NHB-D6K_ePXI.js.map → stateDiagram-v2-GD6S3NHB-Bc7inWs3.js.map} +1 -1
- package/build/client/assets/{support-D2ZulF0D.js → support-cdfZuAYQ.js} +2 -2
- package/build/client/assets/{support-D2ZulF0D.js.map → support-cdfZuAYQ.js.map} +1 -1
- package/build/client/assets/test-C_6vCTaR.js +2 -0
- package/build/client/assets/test-C_6vCTaR.js.map +1 -0
- package/build/client/assets/test-G3KOcfVS.js +2 -0
- package/build/client/assets/{test-D7r_HsN4.js.map → test-G3KOcfVS.js.map} +1 -1
- package/build/client/assets/test._testName-C_6vCTaR.js +2 -0
- package/build/client/assets/test._testName-C_6vCTaR.js.map +1 -0
- package/build/client/assets/test.epic_ws_.js_-C_6vCTaR.js +2 -0
- package/build/client/assets/test.epic_ws_.js_-C_6vCTaR.js.map +1 -0
- package/build/client/assets/{tests-DaEG5aZr.js → tests-Gj3hJRKB.js} +2 -2
- package/build/client/assets/{tests-DaEG5aZr.js.map → tests-Gj3hJRKB.js.map} +1 -1
- package/build/client/assets/{timeline-definition-RI47OAVP-1EQPBN04.js → timeline-definition-RI47OAVP-D__Fk2gz.js} +2 -2
- package/build/client/assets/{timeline-definition-RI47OAVP-1EQPBN04.js.map → timeline-definition-RI47OAVP-D__Fk2gz.js.map} +1 -1
- package/build/client/assets/{tooltip-CUdKgIRf.js → tooltip-JOPrmP6Z.js} +2 -2
- package/build/client/assets/{tooltip-CUdKgIRf.js.map → tooltip-JOPrmP6Z.js.map} +1 -1
- package/build/client/assets/{treemap-6Y5VK53G-CCaJF09R.js → treemap-6Y5VK53G-BgPKoFn0.js} +2 -2
- package/build/client/assets/{treemap-6Y5VK53G-CCaJF09R.js.map → treemap-6Y5VK53G-BgPKoFn0.js.map} +1 -1
- package/build/client/assets/{use-event-source-BOTYusqH.js → use-event-source-B37FxEl1.js} +2 -2
- package/build/client/assets/{use-event-source-BOTYusqH.js.map → use-event-source-B37FxEl1.js.map} +1 -1
- package/build/client/assets/{user-BUyyWGpK.js → user-CW_hpuGs.js} +2 -2
- package/build/client/assets/{user-BUyyWGpK.js.map → user-CW_hpuGs.js.map} +1 -1
- package/build/client/assets/{version-VDBggzrB.js → version-DxzF7eZh.js} +2 -2
- package/build/client/assets/{version-VDBggzrB.js.map → version-DxzF7eZh.js.map} +1 -1
- package/build/client/assets/workshop-config-gL_m3l7d.js +2 -0
- package/build/client/assets/{workshop-config-eejws2-k.js.map → workshop-config-gL_m3l7d.js.map} +1 -1
- package/build/client/assets/{workspace-structure-DwQUtU0r.js → workspace-structure-DrXtkCLM.js} +2 -2
- package/build/client/assets/{workspace-structure-DwQUtU0r.js.map → workspace-structure-DrXtkCLM.js.map} +1 -1
- package/build/client/assets/{xychartDiagram-H2YORKM3-ZB2741wi.js → xychartDiagram-H2YORKM3-CGqU7y0V.js} +2 -2
- package/build/client/assets/{xychartDiagram-H2YORKM3-ZB2741wi.js.map → xychartDiagram-H2YORKM3-CGqU7y0V.js.map} +1 -1
- package/build/server/index.js +2 -2
- package/package.json +1 -1
- package/build/client/assets/_-BEfdnu_S.js +0 -2
- package/build/client/assets/_-BEfdnu_S.js.map +0 -1
- package/build/client/assets/_exerciseNumber_._stepNumber.index-D9zwSM-a.js +0 -2
- package/build/client/assets/_exerciseNumber_._stepNumber.index-D9zwSM-a.js.map +0 -1
- package/build/client/assets/_layout-DQs7hBSg.js +0 -2
- package/build/client/assets/api._-D9zwSM-a.js +0 -2
- package/build/client/assets/api._-D9zwSM-a.js.map +0 -1
- package/build/client/assets/app-B6Asqz0_.js +0 -2
- package/build/client/assets/app.epic_ws_.js_-D9zwSM-a.js +0 -2
- package/build/client/assets/app.epic_ws_.js_-D9zwSM-a.js.map +0 -1
- package/build/client/assets/apps-D9zwSM-a.js +0 -2
- package/build/client/assets/apps-D9zwSM-a.js.map +0 -1
- package/build/client/assets/apps-DxgBeJoD.js +0 -2
- package/build/client/assets/apps-DxgBeJoD.js.map +0 -1
- package/build/client/assets/cache-D9zwSM-a.js +0 -2
- package/build/client/assets/cache-D9zwSM-a.js.map +0 -1
- package/build/client/assets/channel-BWGVHDK-.js +0 -2
- package/build/client/assets/classDiagram-BGRH5UQR-B43E4NNs.js +0 -2
- package/build/client/assets/classDiagram-v2-O24JOBDK-B43E4NNs.js +0 -2
- package/build/client/assets/clone-BniOf7Yb.js +0 -2
- package/build/client/assets/diff-CQVU7E-h.js +0 -2
- package/build/client/assets/discord-B39XeN10.js +0 -2
- package/build/client/assets/discord-B39XeN10.js.map +0 -1
- package/build/client/assets/epic_ws_.js_-D9zwSM-a.js +0 -2
- package/build/client/assets/epic_ws_.js_-D9zwSM-a.js.map +0 -1
- package/build/client/assets/exercises-D9zwSM-a.js +0 -2
- package/build/client/assets/exercises-D9zwSM-a.js.map +0 -1
- package/build/client/assets/healthcheck-D9zwSM-a.js +0 -2
- package/build/client/assets/healthcheck-D9zwSM-a.js.map +0 -1
- package/build/client/assets/index-BcumkKvQ.js +0 -2
- package/build/client/assets/index-BcumkKvQ.js.map +0 -1
- package/build/client/assets/index-D9zwSM-a.js +0 -2
- package/build/client/assets/index-D9zwSM-a.js.map +0 -1
- package/build/client/assets/index-DxgBeJoD.js +0 -2
- package/build/client/assets/index-DxgBeJoD.js.map +0 -1
- package/build/client/assets/infoDiagram-XT3IWWJI-_8npXlsz.js +0 -3
- package/build/client/assets/l-CjuVWd7j.js +0 -2
- package/build/client/assets/launch-editor-D9zwSM-a.js +0 -2
- package/build/client/assets/launch-editor-D9zwSM-a.js.map +0 -1
- package/build/client/assets/login-sse-D9zwSM-a.js +0 -2
- package/build/client/assets/login-sse-D9zwSM-a.js.map +0 -1
- package/build/client/assets/lookout-D9zwSM-a.js +0 -2
- package/build/client/assets/lookout-D9zwSM-a.js.map +0 -1
- package/build/client/assets/manifest-f4a6d68a.js +0 -1
- package/build/client/assets/notifications-D9zwSM-a.js +0 -2
- package/build/client/assets/notifications-D9zwSM-a.js.map +0 -1
- package/build/client/assets/og-D9zwSM-a.js +0 -2
- package/build/client/assets/og-D9zwSM-a.js.map +0 -1
- package/build/client/assets/processes-D9zwSM-a.js +0 -2
- package/build/client/assets/processes-D9zwSM-a.js.map +0 -1
- package/build/client/assets/progress-D9zwSM-a.js +0 -2
- package/build/client/assets/progress-D9zwSM-a.js.map +0 -1
- package/build/client/assets/robots_._txt-D9zwSM-a.js +0 -2
- package/build/client/assets/robots_._txt-D9zwSM-a.js.map +0 -1
- package/build/client/assets/set-playground-D9zwSM-a.js +0 -2
- package/build/client/assets/set-playground-D9zwSM-a.js.map +0 -1
- package/build/client/assets/sitemap_._xml-D9zwSM-a.js +0 -2
- package/build/client/assets/sitemap_._xml-D9zwSM-a.js.map +0 -1
- package/build/client/assets/start-D9zwSM-a.js +0 -2
- package/build/client/assets/start-D9zwSM-a.js.map +0 -1
- package/build/client/assets/stateDiagram-v2-GD6S3NHB-D6K_ePXI.js +0 -2
- package/build/client/assets/test-D7r_HsN4.js +0 -2
- package/build/client/assets/test-D9zwSM-a.js +0 -2
- package/build/client/assets/test-D9zwSM-a.js.map +0 -1
- package/build/client/assets/test._testName-D9zwSM-a.js +0 -2
- package/build/client/assets/test._testName-D9zwSM-a.js.map +0 -1
- package/build/client/assets/test.epic_ws_.js_-D9zwSM-a.js +0 -2
- package/build/client/assets/test.epic_ws_.js_-D9zwSM-a.js.map +0 -1
- package/build/client/assets/workshop-config-eejws2-k.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_layout-DHLUa4_9.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","../../../../../node_modules/@radix-ui/react-dialog/dist/index.mjs","../../../app/components/ui/dialog.tsx","../../../app/routes/_app+/_layout.tsx"],"sourcesContent":["import { invariant } from 'motion-utils';\nimport { setTarget } from '../../render/utils/setters.mjs';\nimport { animateVisualElement } from '../interfaces/visual-element.mjs';\n\nfunction stopAnimation(visualElement) {\n visualElement.values.forEach((value) => value.stop());\n}\nfunction setVariants(visualElement, variantLabels) {\n const reversedLabels = [...variantLabels].reverse();\n reversedLabels.forEach((key) => {\n const variant = visualElement.getVariant(key);\n variant && setTarget(visualElement, variant);\n if (visualElement.variantChildren) {\n visualElement.variantChildren.forEach((child) => {\n setVariants(child, variantLabels);\n });\n }\n });\n}\nfunction setValues(visualElement, definition) {\n if (Array.isArray(definition)) {\n return setVariants(visualElement, definition);\n }\n else if (typeof definition === \"string\") {\n return setVariants(visualElement, [definition]);\n }\n else {\n setTarget(visualElement, definition);\n }\n}\n/**\n * @public\n */\nfunction animationControls() {\n /**\n * Track whether the host component has mounted.\n */\n let hasMounted = false;\n /**\n * A collection of linked component animation controls.\n */\n const subscribers = new Set();\n const controls = {\n subscribe(visualElement) {\n subscribers.add(visualElement);\n return () => void subscribers.delete(visualElement);\n },\n start(definition, transitionOverride) {\n invariant(hasMounted, \"controls.start() should only be called after a component has mounted. Consider calling within a useEffect hook.\");\n const animations = [];\n subscribers.forEach((visualElement) => {\n animations.push(animateVisualElement(visualElement, definition, {\n transitionOverride,\n }));\n });\n return Promise.all(animations);\n },\n set(definition) {\n invariant(hasMounted, \"controls.set() should only be called after a component has mounted. Consider calling within a useEffect hook.\");\n return subscribers.forEach((visualElement) => {\n setValues(visualElement, definition);\n });\n },\n stop() {\n subscribers.forEach((visualElement) => {\n stopAnimation(visualElement);\n });\n },\n mount() {\n hasMounted = true;\n return () => {\n hasMounted = false;\n controls.stop();\n };\n },\n };\n return controls;\n}\n\nexport { animationControls, setValues };\n","import { useConstant } from '../../utils/use-constant.mjs';\nimport { useIsomorphicLayoutEffect } from '../../utils/use-isomorphic-effect.mjs';\nimport { animationControls } from './animation-controls.mjs';\n\n/**\n * Creates `LegacyAnimationControls`, which can be used to manually start, stop\n * and sequence animations on one or more components.\n *\n * The returned `LegacyAnimationControls` should be passed to the `animate` property\n * of the components you want to animate.\n *\n * These components can then be animated with the `start` method.\n *\n * ```jsx\n * import * as React from 'react'\n * import { motion, useAnimation } from 'framer-motion'\n *\n * export function MyComponent(props) {\n * const controls = useAnimation()\n *\n * controls.start({\n * x: 100,\n * transition: { duration: 0.5 },\n * })\n *\n * return <motion.div animate={controls} />\n * }\n * ```\n *\n * @returns Animation controller with `start` and `stop` methods\n *\n * @public\n */\nfunction useAnimationControls() {\n const controls = useConstant(animationControls);\n useIsomorphicLayoutEffect(controls.mount, []);\n return controls;\n}\nconst useAnimation = useAnimationControls;\n\nexport { useAnimation, useAnimationControls };\n","import { useSyncExternalStore } from 'react'\n\nexport function makeMediaQueryStore(\n\tmediaQuery: string,\n\tserverSnapshot: boolean,\n) {\n\tfunction getSnapshot() {\n\t\treturn window.matchMedia(mediaQuery).matches\n\t}\n\n\tfunction subscribe(callback: () => void) {\n\t\tconst mediaQueryList = window.matchMedia(mediaQuery)\n\t\tmediaQueryList.addEventListener('change', callback)\n\t\treturn () => {\n\t\t\tmediaQueryList.removeEventListener('change', callback)\n\t\t}\n\t}\n\n\treturn function useMediaQuery() {\n\t\treturn useSyncExternalStore(subscribe, getSnapshot, () => serverSnapshot)\n\t}\n}\n","\"use client\";\n\n// src/dialog.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContext, createContextScope } from \"@radix-ui/react-context\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { FocusScope } from \"@radix-ui/react-focus-scope\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useFocusGuards } from \"@radix-ui/react-focus-guards\";\nimport { RemoveScroll } from \"react-remove-scroll\";\nimport { hideOthers } from \"aria-hidden\";\nimport { createSlot } from \"@radix-ui/react-slot\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nvar DIALOG_NAME = \"Dialog\";\nvar [createDialogContext, createDialogScope] = createContextScope(DIALOG_NAME);\nvar [DialogProvider, useDialogContext] = createDialogContext(DIALOG_NAME);\nvar Dialog = (props) => {\n const {\n __scopeDialog,\n children,\n open: openProp,\n defaultOpen,\n onOpenChange,\n modal = true\n } = props;\n const triggerRef = React.useRef(null);\n const contentRef = React.useRef(null);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: DIALOG_NAME\n });\n return /* @__PURE__ */ jsx(\n DialogProvider,\n {\n scope: __scopeDialog,\n triggerRef,\n contentRef,\n contentId: useId(),\n titleId: useId(),\n descriptionId: useId(),\n open,\n onOpenChange: setOpen,\n onOpenToggle: React.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]),\n modal,\n children\n }\n );\n};\nDialog.displayName = DIALOG_NAME;\nvar TRIGGER_NAME = \"DialogTrigger\";\nvar DialogTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...triggerProps } = props;\n const context = useDialogContext(TRIGGER_NAME, __scopeDialog);\n const composedTriggerRef = useComposedRefs(forwardedRef, context.triggerRef);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": context.open,\n \"aria-controls\": context.contentId,\n \"data-state\": getState(context.open),\n ...triggerProps,\n ref: composedTriggerRef,\n onClick: composeEventHandlers(props.onClick, context.onOpenToggle)\n }\n );\n }\n);\nDialogTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"DialogPortal\";\nvar [PortalProvider, usePortalContext] = createDialogContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar DialogPortal = (props) => {\n const { __scopeDialog, forceMount, children, container } = props;\n const context = useDialogContext(PORTAL_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopeDialog, forceMount, children: React.Children.map(children, (child) => /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, container, children: child }) })) });\n};\nDialogPortal.displayName = PORTAL_NAME;\nvar OVERLAY_NAME = \"DialogOverlay\";\nvar DialogOverlay = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(OVERLAY_NAME, props.__scopeDialog);\n const { forceMount = portalContext.forceMount, ...overlayProps } = props;\n const context = useDialogContext(OVERLAY_NAME, props.__scopeDialog);\n return context.modal ? /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(DialogOverlayImpl, { ...overlayProps, ref: forwardedRef }) }) : null;\n }\n);\nDialogOverlay.displayName = OVERLAY_NAME;\nvar Slot = createSlot(\"DialogOverlay.RemoveScroll\");\nvar DialogOverlayImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...overlayProps } = props;\n const context = useDialogContext(OVERLAY_NAME, __scopeDialog);\n return (\n // Make sure `Content` is scrollable even when it doesn't live inside `RemoveScroll`\n // ie. when `Overlay` and `Content` are siblings\n /* @__PURE__ */ jsx(RemoveScroll, { as: Slot, allowPinchZoom: true, shards: [context.contentRef], children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": getState(context.open),\n ...overlayProps,\n ref: forwardedRef,\n style: { pointerEvents: \"auto\", ...overlayProps.style }\n }\n ) })\n );\n }\n);\nvar CONTENT_NAME = \"DialogContent\";\nvar DialogContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeDialog);\n const { forceMount = portalContext.forceMount, ...contentProps } = props;\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: context.modal ? /* @__PURE__ */ jsx(DialogContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(DialogContentNonModal, { ...contentProps, ref: forwardedRef }) });\n }\n);\nDialogContent.displayName = CONTENT_NAME;\nvar DialogContentModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, context.contentRef, contentRef);\n React.useEffect(() => {\n const content = contentRef.current;\n if (content) return hideOthers(content);\n }, []);\n return /* @__PURE__ */ jsx(\n DialogContentImpl,\n {\n ...props,\n ref: composedRefs,\n trapFocus: context.open,\n disableOutsidePointerEvents: true,\n onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {\n event.preventDefault();\n context.triggerRef.current?.focus();\n }),\n onPointerDownOutside: composeEventHandlers(props.onPointerDownOutside, (event) => {\n const originalEvent = event.detail.originalEvent;\n const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;\n const isRightClick = originalEvent.button === 2 || ctrlLeftClick;\n if (isRightClick) event.preventDefault();\n }),\n onFocusOutside: composeEventHandlers(\n props.onFocusOutside,\n (event) => event.preventDefault()\n )\n }\n );\n }\n);\nvar DialogContentNonModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n const hasInteractedOutsideRef = React.useRef(false);\n const hasPointerDownOutsideRef = React.useRef(false);\n return /* @__PURE__ */ jsx(\n DialogContentImpl,\n {\n ...props,\n ref: forwardedRef,\n trapFocus: false,\n disableOutsidePointerEvents: false,\n onCloseAutoFocus: (event) => {\n props.onCloseAutoFocus?.(event);\n if (!event.defaultPrevented) {\n if (!hasInteractedOutsideRef.current) context.triggerRef.current?.focus();\n event.preventDefault();\n }\n hasInteractedOutsideRef.current = false;\n hasPointerDownOutsideRef.current = false;\n },\n onInteractOutside: (event) => {\n props.onInteractOutside?.(event);\n if (!event.defaultPrevented) {\n hasInteractedOutsideRef.current = true;\n if (event.detail.originalEvent.type === \"pointerdown\") {\n hasPointerDownOutsideRef.current = true;\n }\n }\n const target = event.target;\n const targetIsTrigger = context.triggerRef.current?.contains(target);\n if (targetIsTrigger) event.preventDefault();\n if (event.detail.originalEvent.type === \"focusin\" && hasPointerDownOutsideRef.current) {\n event.preventDefault();\n }\n }\n }\n );\n }\n);\nvar DialogContentImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, trapFocus, onOpenAutoFocus, onCloseAutoFocus, ...contentProps } = props;\n const context = useDialogContext(CONTENT_NAME, __scopeDialog);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, contentRef);\n useFocusGuards();\n return /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n FocusScope,\n {\n asChild: true,\n loop: true,\n trapped: trapFocus,\n onMountAutoFocus: onOpenAutoFocus,\n onUnmountAutoFocus: onCloseAutoFocus,\n children: /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n role: \"dialog\",\n id: context.contentId,\n \"aria-describedby\": context.descriptionId,\n \"aria-labelledby\": context.titleId,\n \"data-state\": getState(context.open),\n ...contentProps,\n ref: composedRefs,\n onDismiss: () => context.onOpenChange(false)\n }\n )\n }\n ),\n /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(TitleWarning, { titleId: context.titleId }),\n /* @__PURE__ */ jsx(DescriptionWarning, { contentRef, descriptionId: context.descriptionId })\n ] })\n ] });\n }\n);\nvar TITLE_NAME = \"DialogTitle\";\nvar DialogTitle = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...titleProps } = props;\n const context = useDialogContext(TITLE_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(Primitive.h2, { id: context.titleId, ...titleProps, ref: forwardedRef });\n }\n);\nDialogTitle.displayName = TITLE_NAME;\nvar DESCRIPTION_NAME = \"DialogDescription\";\nvar DialogDescription = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...descriptionProps } = props;\n const context = useDialogContext(DESCRIPTION_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(Primitive.p, { id: context.descriptionId, ...descriptionProps, ref: forwardedRef });\n }\n);\nDialogDescription.displayName = DESCRIPTION_NAME;\nvar CLOSE_NAME = \"DialogClose\";\nvar DialogClose = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...closeProps } = props;\n const context = useDialogContext(CLOSE_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n ...closeProps,\n ref: forwardedRef,\n onClick: composeEventHandlers(props.onClick, () => context.onOpenChange(false))\n }\n );\n }\n);\nDialogClose.displayName = CLOSE_NAME;\nfunction getState(open) {\n return open ? \"open\" : \"closed\";\n}\nvar TITLE_WARNING_NAME = \"DialogTitleWarning\";\nvar [WarningProvider, useWarningContext] = createContext(TITLE_WARNING_NAME, {\n contentName: CONTENT_NAME,\n titleName: TITLE_NAME,\n docsSlug: \"dialog\"\n});\nvar TitleWarning = ({ titleId }) => {\n const titleWarningContext = useWarningContext(TITLE_WARNING_NAME);\n const MESSAGE = `\\`${titleWarningContext.contentName}\\` requires a \\`${titleWarningContext.titleName}\\` for the component to be accessible for screen reader users.\n\nIf you want to hide the \\`${titleWarningContext.titleName}\\`, you can wrap it with our VisuallyHidden component.\n\nFor more information, see https://radix-ui.com/primitives/docs/components/${titleWarningContext.docsSlug}`;\n React.useEffect(() => {\n if (titleId) {\n const hasTitle = document.getElementById(titleId);\n if (!hasTitle) console.error(MESSAGE);\n }\n }, [MESSAGE, titleId]);\n return null;\n};\nvar DESCRIPTION_WARNING_NAME = \"DialogDescriptionWarning\";\nvar DescriptionWarning = ({ contentRef, descriptionId }) => {\n const descriptionWarningContext = useWarningContext(DESCRIPTION_WARNING_NAME);\n const MESSAGE = `Warning: Missing \\`Description\\` or \\`aria-describedby={undefined}\\` for {${descriptionWarningContext.contentName}}.`;\n React.useEffect(() => {\n const describedById = contentRef.current?.getAttribute(\"aria-describedby\");\n if (descriptionId && describedById) {\n const hasDescription = document.getElementById(descriptionId);\n if (!hasDescription) console.warn(MESSAGE);\n }\n }, [MESSAGE, contentRef, descriptionId]);\n return null;\n};\nvar Root = Dialog;\nvar Trigger = DialogTrigger;\nvar Portal = DialogPortal;\nvar Overlay = DialogOverlay;\nvar Content = DialogContent;\nvar Title = DialogTitle;\nvar Description = DialogDescription;\nvar Close = DialogClose;\nexport {\n Close,\n Content,\n Description,\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n Overlay,\n Portal,\n Root,\n Title,\n Trigger,\n WarningProvider,\n createDialogScope\n};\n//# sourceMappingURL=index.mjs.map\n","import * as DialogPrimitive from '@radix-ui/react-dialog'\nimport * as React from 'react'\nimport { cn } from '#app/utils/misc.tsx'\nimport { Icon } from '../icons'\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nfunction DialogOverlay({\n\tclassName,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n\treturn (\n\t\t<DialogPrimitive.Overlay\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nfunction DialogContent({\n\tclassName,\n\tchildren,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Content>) {\n\treturn (\n\t\t<DialogPortal>\n\t\t\t<DialogOverlay />\n\t\t\t<DialogPrimitive.Content\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t<DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity data-[state=open]:bg-accent data-[state=open]:text-muted-foreground hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none\">\n\t\t\t\t\t<Icon name=\"Close\" />\n\t\t\t\t\t<span className=\"sr-only\">Close</span>\n\t\t\t\t</DialogPrimitive.Close>\n\t\t\t</DialogPrimitive.Content>\n\t\t</DialogPortal>\n\t)\n}\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nfunction DialogHeader({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'flex flex-col space-y-1.5 text-center sm:text-left',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogHeader.displayName = 'DialogHeader'\n\nfunction DialogFooter({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogFooter.displayName = 'DialogFooter'\n\nfunction DialogTitle({\n\tclassName,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n\treturn (\n\t\t<DialogPrimitive.Title\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'text-lg font-semibold leading-none tracking-tight',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nfunction DialogDescription({\n\tclassName,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n\treturn (\n\t\t<DialogPrimitive.Description\n\t\t\tref={ref}\n\t\t\tclassName={cn('text-sm text-muted-foreground', className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n\tDialog,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogOverlay,\n\tDialogPortal,\n\tDialogTitle,\n\tDialogTrigger,\n}\n","import {\n\textractNumbersAndTypeFromAppNameOrPath,\n\tgetExercises,\n\tgetPlaygroundAppName,\n} from '@epic-web/workshop-utils/apps.server'\nimport { getWorkshopConfig } from '@epic-web/workshop-utils/config.server'\nimport {\n\tcombineServerTimings,\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport { clsx } from 'clsx'\nimport { motion, useAnimationControls } from 'framer-motion'\nimport * as React from 'react'\nimport {\n\tLink,\n\tNavLink,\n\tOutlet,\n\tuseLoaderData,\n\tuseParams,\n\tdata,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n} from 'react-router'\nimport { useHydrated } from 'remix-utils/use-hydrated'\nimport { Icon } from '#app/components/icons.tsx'\nimport { makeMediaQueryStore } from '#app/components/media-query.ts'\nimport { Logo } from '#app/components/product.tsx'\nimport { useRevalidationWS } from '#app/components/revalidation-ws.js'\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogHeader,\n\tDialogTrigger,\n} from '#app/components/ui/dialog.js'\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.js'\nimport { cn, getExercisePath, getExerciseStepPath } from '#app/utils/misc.tsx'\nimport { useIsOnline } from '#app/utils/online.ts'\nimport { usePresence, type User } from '#app/utils/presence.tsx'\nimport {\n\tuseExerciseProgressClassName,\n\tuseNextExerciseRoute,\n\tuseProgressItemClassName,\n\ttype ProgressItemSearch,\n} from '../progress.tsx'\nimport { ThemeSwitch } from '../theme/index.tsx'\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('appLayoutLoader')\n\tconst { title: workshopTitle } = getWorkshopConfig()\n\tconst [exercises, playgroundAppName] = await Promise.all([\n\t\tgetExercises({ request, timings }),\n\t\tgetPlaygroundAppName(),\n\t])\n\n\tconst playgroundNumbersAndType = extractNumbersAndTypeFromAppNameOrPath(\n\t\tplaygroundAppName ?? '',\n\t)\n\tconst playground = {\n\t\tappName: playgroundAppName,\n\t\texerciseNumber: Number(playgroundNumbersAndType?.exerciseNumber),\n\t\tstepNumber: Number(playgroundNumbersAndType?.stepNumber),\n\t\ttype: playgroundNumbersAndType?.type,\n\t}\n\n\tconst result = data(\n\t\t{\n\t\t\tworkshopTitle,\n\t\t\texercises: exercises.map((e) => ({\n\t\t\t\texerciseNumber: e.exerciseNumber,\n\t\t\t\ttitle: e.title,\n\t\t\t\tsolutions: e.solutions.map(({ stepNumber, title, name }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle,\n\t\t\t\t\tname,\n\t\t\t\t})),\n\t\t\t\tproblems: e.problems.map(({ stepNumber, title, name }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle,\n\t\t\t\t\tname,\n\t\t\t\t})),\n\t\t\t\tsteps: e.steps.map(({ stepNumber, problem, solution }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle: problem?.title ?? solution?.title ?? 'Unknown',\n\t\t\t\t\tname: problem?.name ?? solution?.name ?? 'Unknown',\n\t\t\t\t\tproblem: problem\n\t\t\t\t\t\t? { name: problem.name, title: problem.title }\n\t\t\t\t\t\t: null,\n\t\t\t\t\tsolution: solution\n\t\t\t\t\t\t? { name: solution.name, title: solution.title }\n\t\t\t\t\t\t: null,\n\t\t\t\t})),\n\t\t\t})),\n\t\t\tplayground,\n\t\t\tisMenuOpened:\n\t\t\t\trequest.headers.get('cookie')?.includes('es_menu_open=true') ?? false,\n\t\t},\n\t\t{\n\t\t\theaders: {\n\t\t\t\tVary: 'Cookie',\n\t\t\t\t'Server-Timing': getServerTimeHeader(timings),\n\t\t\t},\n\t\t},\n\t)\n\treturn result\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders, parentHeaders }) => {\n\tconst headers = {\n\t\t'Cache-Control': loaderHeaders.get('Cache-Control') ?? '',\n\t\tVary: 'Cookie',\n\t\t'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nconst opacities = ['opacity-70', 'opacity-80', 'opacity-90', 'opacity-100']\nconst shadows = [\n\t'shadow-[0_0_2px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_4px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_7px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_10px_0_rgba(0,0,0,0.3)]',\n]\nfunction getScoreClassNames(score: number) {\n\tconst opacityNumber = Math.round(score * opacities.length - 1)\n\tconst shadowNumber = Math.round(score * shadows.length - 1)\n\treturn cn(\n\t\t'shadow-purple-700 hover:opacity-100 focus:opacity-100 dark:shadow-purple-200',\n\t\topacities[opacityNumber] ?? 'opacity-60',\n\t\tshadows[shadowNumber] ?? 'shadow-none',\n\t\tscore === 1 ? 'animate-pulse hover:animate-none focus:animate-none' : null,\n\t)\n}\n\nfunction FacePile({ isMenuOpened }: { isMenuOpened: boolean }) {\n\tconst loggedInUser = useOptionalUser()\n\tconst { users } = usePresence()\n\tconst {\n\t\tproduct: { displayNameShort },\n\t} = useWorkshopConfig()\n\tconst limit = isMenuOpened ? 17 : 0\n\tconst numberOverLimit = users.length - limit\n\tconst shouldShowNumberOverLimit = numberOverLimit > (isMenuOpened ? 1 : 0)\n\n\tif (!users.length) return null\n\n\tconst tiffany =\n\t\tisMenuOpened && users.length === 1 ? (\n\t\t\t<Link\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\tto=\"https://www.youtube.com/watch?v=w6Q3mHyzn78\"\n\t\t\t>\n\t\t\t\t<img\n\t\t\t\t\talt=\"Tiffany Tunes\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'h-8 w-8 rounded-full border object-cover',\n\t\t\t\t\t\tgetScoreClassNames(1),\n\t\t\t\t\t)}\n\t\t\t\t\tsrc=\"/img/tiffany.png\"\n\t\t\t\t/>\n\t\t\t</Link>\n\t\t) : null\n\tconst overLimitLabel = `${numberOverLimit}${\n\t\tisMenuOpened ? ' more ' : ' '\n\t}${displayNameShort} Dev${numberOverLimit === 1 ? '' : 's'} working now`\n\treturn (\n\t\t<div className=\"flex flex-wrap items-center gap-2\">\n\t\t\t<TooltipProvider>\n\t\t\t\t{(shouldShowNumberOverLimit ? users.slice(0, limit) : users).map(\n\t\t\t\t\t({ user, score }) => {\n\t\t\t\t\t\tconst scoreClassNames = getScoreClassNames(score)\n\t\t\t\t\t\tconst locationLabel = getLocationLabel(user.location)\n\t\t\t\t\t\tconst imageUrl = user.imageUrlSmall || user.avatarUrl\n\t\t\t\t\t\tconst hasAccess = user.hasAccess\n\t\t\t\t\t\tconst local = user.location?.origin?.includes('localhost')\n\n\t\t\t\t\t\tlet doingLabel: string\n\t\t\t\t\t\tif (hasAccess) {\n\t\t\t\t\t\t\tdoingLabel = local ? 'working' : 'referencing'\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdoingLabel = local ? 'previewing' : 'reviewing'\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Tooltip key={user.id}>\n\t\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t\t{imageUrl ? (\n\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\t\t\t\talt={user.name || displayNameShort}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'h-8 w-8 rounded-full border object-cover',\n\t\t\t\t\t\t\t\t\t\t\t\tscoreClassNames,\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\tsrc={imageUrl}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\t\t\t\taria-label={user.name || `${displayNameShort} Dev`}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'flex h-8 w-8 items-center justify-center rounded-full border',\n\t\t\t\t\t\t\t\t\t\t\t\tscoreClassNames,\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Icon name=\"User\" />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t\t\t<span className=\"flex flex-col items-center justify-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t{user.name || `${displayNameShort} Dev`}{' '}\n\t\t\t\t\t\t\t\t\t\t\t{locationLabel\n\t\t\t\t\t\t\t\t\t\t\t\t? ` is ${doingLabel} ${\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tscore === 1 && loggedInUser?.id !== user.id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'with you'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t\t\t\t\t\t\t\t} on`\n\t\t\t\t\t\t\t\t\t\t\t\t: null}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t{locationLabel?.line1 ? (\n\t\t\t\t\t\t\t\t\t\t\t<span>{locationLabel.line1}</span>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t{locationLabel?.line2 ? (\n\t\t\t\t\t\t\t\t\t\t\t<span>{locationLabel.line2}</span>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t)}\n\t\t\t\t{tiffany}\n\t\t\t\t{shouldShowNumberOverLimit ? (\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\taria-label={overLimitLabel}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex items-center justify-center rounded-full border bg-accent text-xs text-accent-foreground',\n\t\t\t\t\t\t\t\t\tisMenuOpened ? 'h-8 w-8' : 'h-6 w-6',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'pointer-events-none overflow-hidden text-ellipsis whitespace-nowrap 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\nconst useIsWide = makeMediaQueryStore('(min-width: 640px)', true)\n\nexport default function App() {\n\tconst data = useLoaderData<typeof loader>()\n\tconst user = useOptionalUser()\n\tconst isWide = useIsWide()\n\tconst isHydrated = useHydrated()\n\n\tconst [isMenuOpened, setMenuOpenedState] = React.useState(data.isMenuOpened)\n\tuseRevalidationWS({ watchPaths: ['./exercises/README.mdx'] })\n\n\tfunction setMenuOpened(value: boolean) {\n\t\tsetMenuOpenedState(value)\n\t\tdocument.cookie = `es_menu_open=${value.toString()}; path=/; SameSite=Lax;`\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col\">\n\t\t\t{user ? null : <NoUserBanner />}\n\t\t\t{/*\n\t\t\t\tthis isn't placed in a conditional with isWide because the server render\n\t\t\t\tdoesn't know whether it should be around or not so we just use CSS to hide it\n\t\t\t\tif it's not supposed to show up.\n\n\t\t\t\tWe don't just use media queries for the wider screen nav because we want\n\t\t\t\tto avoid running all the logic in there unnecessarily.\n\t\t\t*/}\n\t\t\t{isHydrated && isWide ? null : (\n\t\t\t\t<MobileNavigation\n\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\tonMenuOpenChange={setMenuOpened}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<div\n\t\t\t\t// this nonsense is here because we want the panels to be scrollable rather\n\t\t\t\t// than having the entire page be scrollable (at least on wider screens)\n\t\t\t\tclassName={cn('flex flex-grow flex-col sm:flex-row', {\n\t\t\t\t\t'h-[calc(100vh-128px-env(safe-area-inset-top)-env(safe-area-inset-bottom))] sm:h-[calc(100vh-64px-env(safe-area-inset-top)-env(safe-area-inset-bottom))]':\n\t\t\t\t\t\t!user,\n\t\t\t\t\t'h-[calc(100vh-64px-env(safe-area-inset-top)-env(safe-area-inset-bottom))] sm:h-[calc(100vh-env(safe-area-inset-top)-env(safe-area-inset-bottom))]':\n\t\t\t\t\t\tuser,\n\t\t\t\t\t'h-[unset]': !isWide && isMenuOpened,\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t{isWide ? (\n\t\t\t\t\t<Navigation\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tonMenuOpenChange={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'h-full w-full max-w-full sm:max-w-[calc(100%-56px)]',\n\t\t\t\t\t\tisMenuOpened ? 'hidden md:block' : '',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Outlet />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction getLocationLabel(location: User['location']) {\n\tif (!location) return null\n\n\tconst { exercise } = location\n\n\tconst exercisePortion = [\n\t\texercise\n\t\t\t? [exercise.exerciseNumber, exercise.stepNumber]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.map((s) => s.toString().padStart(2, '0'))\n\t\t\t\t\t.join('/')\n\t\t\t: null,\n\t\texercise?.type,\n\t]\n\t\t.filter(Boolean)\n\t\t.join(' - ')\n\treturn { line1: location.workshopTitle, line2: exercisePortion }\n}\n\nfunction NoUserBanner() {\n\tconst isWide = useIsWide()\n\tconst {\n\t\tproduct: { host, displayName },\n\t} = useWorkshopConfig()\n\tconst userHasAccess = useUserHasAccess()\n\tconst details = (\n\t\t<div>\n\t\t\t{ENV.EPICSHOP_DEPLOYED ? (\n\t\t\t\t<div>\n\t\t\t\t\t{`This is the deployed version. `}\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tto={ENV.EPICSHOP_GITHUB_REPO}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tRun locally\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t{` for full experience.`}\n\t\t\t\t\t</>{' '}\n\t\t\t\t</div>\n\t\t\t) : userHasAccess ? (\n\t\t\t\t<div>\n\t\t\t\t\t<Link to=\"/login\" className=\"underline\">\n\t\t\t\t\t\tLogin\n\t\t\t\t\t</Link>{' '}\n\t\t\t\t\tor{' '}\n\t\t\t\t\t<a href={`https://${host}/login`} className=\"underline\">\n\t\t\t\t\t\tjoin for free\n\t\t\t\t\t</a>{' '}\n\t\t\t\t\tfor the full experience.\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</div>\n\t)\n\treturn (\n\t\t<div className=\"z-10 flex h-16 items-center justify-between border-b bg-gradient-to-tr from-blue-500 to-indigo-500 pl-4 text-white\">\n\t\t\t{isWide ? (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"hidden flex-1 flex-wrap items-center gap-4 sm:flex\">\n\t\t\t\t\t\t<Logo size=\"lg\" style=\"monochrome\" />\n\t\t\t\t\t\t<div className=\"flex flex-1 flex-wrap items-center\">\n\t\t\t\t\t\t\t<p className=\"mr-2\">\n\t\t\t\t\t\t\t\tWelcome to the{' '}\n\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\tto={`https://${host}`}\n\t\t\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t</Link>{' '}\n\t\t\t\t\t\t\t\tWorkshop app!\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t{details}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t{userHasAccess ? null : (\n\t\t\t\t\t\t<div className=\"hidden h-full flex-col items-center sm:flex md:flex-row\">\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={`https://${host}`}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Join {displayName}</span>\n\t\t\t\t\t\t\t\t<span>↗︎</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={ENV.EPICSHOP_DEPLOYED ? `https://${host}/login` : '/login'}\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 bg-white/20 px-5 text-sm font-semibold shadow-md transition hover:bg-white/30\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"User\" size=\"lg\" />\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Login</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"flex flex-1 flex-wrap items-center gap-4 sm:hidden\">\n\t\t\t\t\t\t<a href={`https://${host}`}>\n\t\t\t\t\t\t\t<Logo size=\"lg\" style=\"monochrome\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<Dialog>\n\t\t\t\t\t\t\t<DialogTrigger>\n\t\t\t\t\t\t\t\t<Icon name=\"Question\" size=\"lg\" className=\"animate-pulse\" />\n\t\t\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t\t\t<DialogContent>\n\t\t\t\t\t\t\t\t<DialogHeader>\n\t\t\t\t\t\t\t\t\t<Logo size=\"lg\" style=\"monochrome\" />\n\t\t\t\t\t\t\t\t\t<span className=\"text-lg font-semibold\">{displayName}</span>\n\t\t\t\t\t\t\t\t</DialogHeader>\n\t\t\t\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\t\t\t\tWelcome to the{' '}\n\t\t\t\t\t\t\t\t\t<Link to={`https://${host}`} className=\"underline\">\n\t\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t\t</Link>{' '}\n\t\t\t\t\t\t\t\t\tWorkshop app!\n\t\t\t\t\t\t\t\t</DialogDescription>\n\t\t\t\t\t\t\t\t{details}\n\t\t\t\t\t\t\t</DialogContent>\n\t\t\t\t\t\t</Dialog>\n\t\t\t\t\t</div>\n\t\t\t\t\t{userHasAccess ? null : (\n\t\t\t\t\t\t<div className=\"flex h-full items-center\">\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={`https://${host}`}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Join</span>\n\t\t\t\t\t\t\t\t<span>↗︎</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={ENV.EPICSHOP_DEPLOYED ? `https://${host}/login` : '/login'}\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 bg-white/20 px-5 text-sm font-semibold shadow-md transition hover:bg-white/30\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"User\" size=\"lg\" />\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Login</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\nconst itemVariants = {\n\thidden: { opacity: 0, x: -20 },\n\tvisible: { opacity: 1, x: 0 },\n}\nfunction NavigationExerciseListItem({\n\texerciseNumber,\n\tchildren,\n}: {\n\texerciseNumber: number\n\tchildren: React.ReactNode\n}) {\n\tconst progressClassName = useExerciseProgressClassName(exerciseNumber)\n\treturn (\n\t\t<motion.li\n\t\t\tvariants={itemVariants}\n\t\t\tclassName={cn(\n\t\t\t\t// add gap of 3 to children, but using padding so the progress extends through the whole height\n\t\t\t\t'py-[6px] first:pt-3 last:pb-3',\n\t\t\t\tprogressClassName ? `${progressClassName} before:border-t` : null,\n\t\t\t)}\n\t\t>\n\t\t\t<span className=\"inline-block pl-2\">{children}</span>\n\t\t</motion.li>\n\t)\n}\n\nfunction NavigationExerciseStepListItem({\n\tchildren,\n\t...progressItemSearch\n}: {\n\tchildren: React.ReactNode\n} & ProgressItemSearch) {\n\tconst progressClassName = useProgressItemClassName(progressItemSearch)\n\treturn (\n\t\t<motion.li\n\t\t\tvariants={itemVariants}\n\t\t\tclassName={cn(\n\t\t\t\t// add gap of 3 to children, but using padding so the progress extends through the whole height\n\t\t\t\t'py-[6px] first:pt-3 last:pb-3',\n\t\t\t\tprogressClassName ? `${progressClassName} before:border-t` : null,\n\t\t\t)}\n\t\t>\n\t\t\t<span className=\"inline-block pl-2\">{children}</span>\n\t\t</motion.li>\n\t)\n}\n\nfunction MobileNavigation({\n\tisMenuOpened,\n\tonMenuOpenChange: setMenuOpened,\n}: {\n\tisMenuOpened: boolean\n\tonMenuOpenChange: (change: boolean) => void\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tconst user = useOptionalUser()\n\tconst nextExerciseRoute = useNextExerciseRoute()\n\tconst params = useParams()\n\tconst isOnline = useIsOnline()\n\tconst { users } = usePresence()\n\n\t// items\n\tconst listVariants = {\n\t\tvisible: {\n\t\t\topacity: 1,\n\t\t\ttransition: {\n\t\t\t\tduration: 0.05,\n\t\t\t\twhen: 'beforeChildren',\n\t\t\t\tstaggerChildren: 0.03,\n\t\t\t},\n\t\t},\n\t\thidden: {\n\t\t\topacity: 0,\n\t\t},\n\t}\n\n\treturn (\n\t\t<nav className=\"flex w-full border-b sm:hidden\">\n\t\t\t<div className=\"w-full\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn('flex items-center', {\n\t\t\t\t\t\t'flex-col': isMenuOpened,\n\t\t\t\t\t\t'h-14': !isMenuOpened,\n\t\t\t\t\t})}\n\t\t\t\t>\n\t\t\t\t\t<NavToggle\n\t\t\t\t\t\ttitle={data.workshopTitle}\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tsetMenuOpened={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t\t{isMenuOpened && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tclassName=\"flex w-full flex-grow flex-col justify-between overflow-x-auto p-6 scrollbar-thin scrollbar-thumb-scrollbar\"\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 whitespace-nowrap px-2 py-0.5 pr-3 text-2xl font-bold outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background 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 whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background 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=\"ml-4 mt-2 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'relative whitespace-nowrap px-2 py-0.5 pr-3 text-xl font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background 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=\"font-semibold leading-tight\"\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=\"ml-3 mt-0.5 flex gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'problem',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProblem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'solution',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSolution\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"finished\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber, 'finished')}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-base font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background': isActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t📝 Elaboration\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</NavigationExerciseListItem>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t<div className=\"mt-6\">\n\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\tto=\"/finished\"\n\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap text-lg font-bold 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'bg-black text-white after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background 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=\"flex-grow\" />\n\t\t\t\t\t{isOnline ? null : (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'You are offline'}>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex h-14 animate-pulse items-center justify-start p-4',\n\t\t\t\t\t\t\t\t\tisMenuOpened ? 'w-full border-t' : 'border-l',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\tname=\"WifiNoConnection\"\n\t\t\t\t\t\t\t\t\tclassName=\"text-foreground-destructive\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{isMenuOpened ? 'You are offline' : null}\n\t\t\t\t\t\t\t\t</Icon>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t)}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex items-center justify-start p-4',\n\t\t\t\t\t\t\tisMenuOpened && users.length > 4 ? 'min-h-14' : 'h-14',\n\t\t\t\t\t\t\tisMenuOpened ? 'w-full border-t' : 'border-l',\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<FacePile isMenuOpened={isMenuOpened} />\n\t\t\t\t\t</div>\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user ? (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'Your account'}>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex h-14 flex-shrink-0 items-center justify-start space-x-3 px-4 py-4 text-center no-underline hover:underline',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t'border-l': !isMenuOpened,\n\t\t\t\t\t\t\t\t\t\t'w-full border-t': isMenuOpened,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tto=\"/account\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{user.imageUrlSmall ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\talt={user.name ?? user.email}\n\t\t\t\t\t\t\t\t\t\tsrc={user.imageUrlSmall}\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-full rounded-full\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<Icon name=\"User\" className=\"flex-shrink-0\" size=\"lg\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tYour Account\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Your account</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user && nextExerciseRoute ? (\n\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\tcontent={isMenuOpened ? null : 'Continue to next lesson'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={nextExerciseRoute}\n\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'flex h-14 w-full items-center space-x-3 border-l px-4 py-4 pl-[18px] no-underline hover:underline',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstate={{ from: 'continue next lesson button' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"FastForward\" className=\"flex-shrink-0\" size=\"md\" />\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tContinue to next lesson\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Continue to next lesson</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex h-14 w-14 items-center justify-center self-start p-4 sm:mb-4 sm:w-full',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t'w-full border-t': isMenuOpened,\n\t\t\t\t\t\t\t\t'border-l': !isMenuOpened,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ThemeSwitch />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</nav>\n\t)\n}\n\nconst OPENED_MENU_WIDTH = 400\n\nfunction Navigation({\n\tisMenuOpened,\n\tonMenuOpenChange: setMenuOpened,\n}: {\n\tisMenuOpened: boolean\n\tonMenuOpenChange: (change: boolean) => void\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tconst user = useOptionalUser()\n\tconst nextExerciseRoute = useNextExerciseRoute()\n\tconst params = useParams()\n\tconst isOnline = useIsOnline()\n\tconst { users } = usePresence()\n\n\tconst exercise = data.exercises.find(\n\t\t(e) => e.exerciseNumber === Number(params.exerciseNumber),\n\t)\n\tconst app =\n\t\tparams.type === 'solution'\n\t\t\t? exercise?.solutions.find(\n\t\t\t\t\t(s) => s.stepNumber === Number(params.stepNumber),\n\t\t\t\t)\n\t\t\t: params.type === 'problem'\n\t\t\t\t? exercise?.problems.find(\n\t\t\t\t\t\t(p) => p.stepNumber === Number(params.stepNumber),\n\t\t\t\t\t)\n\t\t\t\t: null\n\n\t// container\n\tconst menuControls = useAnimationControls()\n\tconst menuVariants = {\n\t\tclose: { width: 56 },\n\t\topen: { width: OPENED_MENU_WIDTH },\n\t}\n\n\t// items\n\tconst listVariants = {\n\t\tvisible: {\n\t\t\topacity: 1,\n\t\t\ttransition: {\n\t\t\t\tduration: 0.05,\n\t\t\t\twhen: 'beforeChildren',\n\t\t\t\tstaggerChildren: 0.03,\n\t\t\t},\n\t\t},\n\t\thidden: {\n\t\t\topacity: 0,\n\t\t},\n\t}\n\n\treturn (\n\t\t<nav className=\"hidden border-r sm:flex\">\n\t\t\t<motion.div\n\t\t\t\tinitial={isMenuOpened ? 'open' : 'close'}\n\t\t\t\tvariants={menuVariants}\n\t\t\t\tanimate={menuControls}\n\t\t\t>\n\t\t\t\t<div className=\"flex h-full flex-col items-center justify-between\">\n\t\t\t\t\t<NavToggle\n\t\t\t\t\t\ttitle={data.workshopTitle}\n\t\t\t\t\t\tmenuControls={menuControls}\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tsetMenuOpened={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t\t{isMenuOpened && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tstyle={{ width: OPENED_MENU_WIDTH }}\n\t\t\t\t\t\t\tclassName=\"flex flex-grow flex-col justify-between overflow-y-auto p-6 scrollbar-thin scrollbar-thumb-scrollbar\"\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 whitespace-nowrap px-2 py-0.5 pr-3 text-2xl font-bold outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background 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 whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background 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=\"ml-4 mt-2 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'relative whitespace-nowrap px-2 py-0.5 pr-3 text-xl font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background 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=\"font-semibold leading-tight\"\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=\"ml-3 mt-0.5 flex gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'problem',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProblem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'solution',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSolution\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"finished\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber, 'finished')}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-base font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background': isActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t📝 Elaboration\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</NavigationExerciseListItem>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t<div className=\"mt-6\">\n\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\tto=\"/finished\"\n\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap text-lg font-bold 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'bg-black text-white after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background 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 flex-grow flex-col justify-center\">\n\t\t\t\t\t\t\t<div className=\"orientation-sideways w-full font-mono text-sm font-medium uppercase leading-none\">\n\t\t\t\t\t\t\t\t{exercise?.title ? (\n\t\t\t\t\t\t\t\t\t<Link to={getExercisePath(Number(params.exerciseNumber))}>\n\t\t\t\t\t\t\t\t\t\t{exercise.title}\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t{exercise?.title && app?.title ? ' — ' : null}\n\t\t\t\t\t\t\t\t{app?.title ? (\n\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\tNumber(params.exerciseNumber),\n\t\t\t\t\t\t\t\t\t\t\tapp.stepNumber,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{app.title}\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{isOnline ? null : (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'You are offline'}>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex w-full animate-pulse items-center border-t p-4',\n\t\t\t\t\t\t\t\t\tisMenuOpened ? 'justify-start' : 'justify-center',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\tname=\"WifiNoConnection\"\n\t\t\t\t\t\t\t\t\tclassName=\"text-foreground-destructive\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t\t<span className=\"whitespace-nowrap\">You are offline</span>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</Icon>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t)}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex w-full items-center justify-start border-t p-4 transition-[height]',\n\t\t\t\t\t\t\tisMenuOpened && users.length > 4 ? 'h-28' : 'h-14',\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={isMenuOpened ? { width: OPENED_MENU_WIDTH } : {}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<FacePile isMenuOpened={isMenuOpened} />\n\t\t\t\t\t</div>\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user ? (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'Your account'}>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tclassName=\"flex h-14 w-full flex-shrink-0 items-center justify-start space-x-3 border-t px-4 py-4 text-center no-underline hover:underline\"\n\t\t\t\t\t\t\t\tto=\"/account\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{user.imageUrlSmall ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\talt={user.name ?? user.email}\n\t\t\t\t\t\t\t\t\t\tsrc={user.imageUrlSmall}\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-full rounded-full\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<Icon name=\"User\" className=\"flex-shrink-0\" size=\"lg\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tYour Account\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Your account</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user && nextExerciseRoute ? (\n\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\tcontent={isMenuOpened ? null : 'Continue to next lesson'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={nextExerciseRoute}\n\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'flex h-14 w-full items-center space-x-3 border-t px-4 py-4 pl-[18px] no-underline hover:underline',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstate={{ from: 'continue next lesson button' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"FastForward\" className=\"flex-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 pl-3 pt-[15px]\">\n\t\t\t\t\t\t<ThemeSwitch />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</motion.div>\n\t\t</nav>\n\t)\n}\n\nfunction NavToggle({\n\ttitle,\n\tisMenuOpened,\n\tsetMenuOpened,\n\tmenuControls,\n}: {\n\ttitle: string\n\tisMenuOpened: boolean\n\tsetMenuOpened: (value: boolean) => void\n\tmenuControls?: ReturnType<typeof useAnimationControls>\n}) {\n\tconst initialOpenRef = React.useRef(isMenuOpened)\n\tconst menuButtonRef = React.useRef<HTMLButtonElement>(null)\n\tconst path01Variants = {\n\t\topen: { d: 'M3.06061 2.99999L21.0606 21' },\n\t\tclosed: { d: 'M0 9.5L24 9.5' },\n\t}\n\tconst path02Variants = {\n\t\topen: { d: 'M3.00006 21.0607L21 3.06064' },\n\t\tmoving: { d: 'M0 14.5L24 14.5' },\n\t\tclosed: { d: 'M0 14.5L15 14.5' },\n\t}\n\tconst path01Controls = useAnimationControls()\n\tconst path02Controls = useAnimationControls()\n\n\tasync function toggleMenu() {\n\t\tvoid menuControls?.start(isMenuOpened ? 'close' : 'open')\n\t\tsetMenuOpened(!isMenuOpened)\n\t\tif (isMenuOpened) {\n\t\t\tvoid path01Controls.start(path01Variants.closed)\n\t\t\tawait path02Controls.start(path02Variants.moving)\n\t\t\tvoid path02Controls.start(path02Variants.closed)\n\t\t} else {\n\t\t\tawait path02Controls.start(path02Variants.moving)\n\t\t\tvoid path01Controls.start(path01Variants.open)\n\t\t\tvoid path02Controls.start(path02Variants.open)\n\t\t}\n\t}\n\n\tReact.useEffect(() => {\n\t\tif (!isMenuOpened) return\n\n\t\tfunction handleKeyUp(event: KeyboardEvent) {\n\t\t\tif (event.key === 'Escape') {\n\t\t\t\tmenuButtonRef.current?.click()\n\t\t\t}\n\t\t}\n\t\tdocument.addEventListener('keyup', handleKeyUp)\n\t\treturn () => document.removeEventListener('keyup', handleKeyUp)\n\t}, [isMenuOpened])\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'relative inline-flex h-14 flex-shrink-0 items-center justify-between overflow-hidden border-r sm:w-full sm:border-b sm:border-r-0',\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 whitespace-nowrap font-mono text-sm 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","DIALOG_NAME","createDialogContext","createDialogScope","createContextScope","DialogProvider","useDialogContext","Dialog","props","__scopeDialog","children","openProp","defaultOpen","onOpenChange","modal","triggerRef","React.useRef","contentRef","open","setOpen","useControllableState","jsx","useId","React.useCallback","prevOpen","TRIGGER_NAME","DialogTrigger","React.forwardRef","forwardedRef","triggerProps","context","composedTriggerRef","useComposedRefs","Primitive","getState","composeEventHandlers","PORTAL_NAME","PortalProvider","usePortalContext","DialogPortal","forceMount","container","React.Children","Presence","PortalPrimitive","OVERLAY_NAME","DialogOverlay","portalContext","overlayProps","DialogOverlayImpl","Slot","createSlot","RemoveScroll","CONTENT_NAME","DialogContent","contentProps","DialogContentModal","DialogContentNonModal","composedRefs","React.useEffect","content","hideOthers","DialogContentImpl","event","originalEvent","ctrlLeftClick","hasInteractedOutsideRef","hasPointerDownOutsideRef","target","trapFocus","onOpenAutoFocus","onCloseAutoFocus","useFocusGuards","jsxs","Fragment","FocusScope","DismissableLayer","TitleWarning","DescriptionWarning","TITLE_NAME","DialogTitle","titleProps","DESCRIPTION_NAME","DialogDescription","descriptionProps","CLOSE_NAME","DialogClose","closeProps","TITLE_WARNING_NAME","WarningProvider","useWarningContext","createContext","titleId","titleWarningContext","MESSAGE","DESCRIPTION_WARNING_NAME","descriptionId","describedById","Root","Trigger","Portal","Overlay","Content","Title","Description","Close","DialogPrimitive.Root","DialogPrimitive.Trigger","DialogPrimitive.Portal","className","ref","DialogPrimitive.Overlay","cn","DialogPrimitive.Content","DialogPrimitive.Close","Icon","DialogHeader","DialogPrimitive.Title","DialogPrimitive.Description","opacities","shadows","getScoreClassNames","score","opacityNumber","Math","round","length","shadowNumber","FacePile","isMenuOpened","loggedInUser","useOptionalUser","users","usePresence","product","displayNameShort","useWorkshopConfig","limit","numberOverLimit","shouldShowNumberOverLimit","tiffany","Link","rel","to","alt","src","overLimitLabel","TooltipProvider","slice","map","user","scoreClassNames","locationLabel","getLocationLabel","location","imageUrl","imageUrlSmall","avatarUrl","hasAccess","local","origin","includes","doingLabel","Tooltip","TooltipTrigger","asChild","tabIndex","name","TooltipContent","id","line1","line2","useIsWide","_layout","_UNSAFE_withComponentProps","data","useLoaderData","isWide","isHydrated","useHydrated","setMenuOpenedState","React","useRevalidationWS","watchPaths","setMenuOpened","document","cookie","toString","NoUserBanner","MobileNavigation","onMenuOpenChange","Navigation","Outlet","exercise","exercisePortion","exerciseNumber","stepNumber","filter","Boolean","s","padStart","join","type","workshopTitle","host","displayName","userHasAccess","useUserHasAccess","details","ENV","EPICSHOP_DEPLOYED","EPICSHOP_GITHUB_REPO","href","Logo","size","style","itemVariants","hidden","opacity","x","visible","NavigationExerciseListItem","progressClassName","useExerciseProgressClassName","motion","li","variants","NavigationExerciseStepListItem","progressItemSearch","useProgressItemClassName","nextExerciseRoute","useNextExerciseRoute","params","useParams","isOnline","useIsOnline","listVariants","transition","duration","when","staggerChildren","NavToggle","title","div","initial","animate","ul","NavLink","prefetch","isActive","clsx","exercises","steps","Number","showPlayground","playground","getExercisePath","getExerciseStepPath","problem","solution","appName","SimpleTooltip","email","state","from","ThemeSwitch","OPENED_MENU_WIDTH","find","e","app","solutions","problems","p","menuControls","menuVariants","close","width","initialOpenRef","menuButtonRef","path01Variants","d","closed","path02Variants","moving","path01Controls","path02Controls","toggleMenu","start","handleKeyUp","current","click","addEventListener","removeEventListener","onClick","height","viewBox","path","stroke","strokeWidth","delay","y"],"mappings":"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","x_google_ignoreList":[0,1,3]}
|
|
1
|
+
{"version":3,"file":"_layout-BENlQ_xx.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","../../../../../node_modules/@radix-ui/react-dialog/dist/index.mjs","../../../app/components/ui/dialog.tsx","../../../app/routes/_app+/_layout.tsx"],"sourcesContent":["import { invariant } from 'motion-utils';\nimport { setTarget } from '../../render/utils/setters.mjs';\nimport { animateVisualElement } from '../interfaces/visual-element.mjs';\n\nfunction stopAnimation(visualElement) {\n visualElement.values.forEach((value) => value.stop());\n}\nfunction setVariants(visualElement, variantLabels) {\n const reversedLabels = [...variantLabels].reverse();\n reversedLabels.forEach((key) => {\n const variant = visualElement.getVariant(key);\n variant && setTarget(visualElement, variant);\n if (visualElement.variantChildren) {\n visualElement.variantChildren.forEach((child) => {\n setVariants(child, variantLabels);\n });\n }\n });\n}\nfunction setValues(visualElement, definition) {\n if (Array.isArray(definition)) {\n return setVariants(visualElement, definition);\n }\n else if (typeof definition === \"string\") {\n return setVariants(visualElement, [definition]);\n }\n else {\n setTarget(visualElement, definition);\n }\n}\n/**\n * @public\n */\nfunction animationControls() {\n /**\n * Track whether the host component has mounted.\n */\n let hasMounted = false;\n /**\n * A collection of linked component animation controls.\n */\n const subscribers = new Set();\n const controls = {\n subscribe(visualElement) {\n subscribers.add(visualElement);\n return () => void subscribers.delete(visualElement);\n },\n start(definition, transitionOverride) {\n invariant(hasMounted, \"controls.start() should only be called after a component has mounted. Consider calling within a useEffect hook.\");\n const animations = [];\n subscribers.forEach((visualElement) => {\n animations.push(animateVisualElement(visualElement, definition, {\n transitionOverride,\n }));\n });\n return Promise.all(animations);\n },\n set(definition) {\n invariant(hasMounted, \"controls.set() should only be called after a component has mounted. Consider calling within a useEffect hook.\");\n return subscribers.forEach((visualElement) => {\n setValues(visualElement, definition);\n });\n },\n stop() {\n subscribers.forEach((visualElement) => {\n stopAnimation(visualElement);\n });\n },\n mount() {\n hasMounted = true;\n return () => {\n hasMounted = false;\n controls.stop();\n };\n },\n };\n return controls;\n}\n\nexport { animationControls, setValues };\n","import { useConstant } from '../../utils/use-constant.mjs';\nimport { useIsomorphicLayoutEffect } from '../../utils/use-isomorphic-effect.mjs';\nimport { animationControls } from './animation-controls.mjs';\n\n/**\n * Creates `LegacyAnimationControls`, which can be used to manually start, stop\n * and sequence animations on one or more components.\n *\n * The returned `LegacyAnimationControls` should be passed to the `animate` property\n * of the components you want to animate.\n *\n * These components can then be animated with the `start` method.\n *\n * ```jsx\n * import * as React from 'react'\n * import { motion, useAnimation } from 'framer-motion'\n *\n * export function MyComponent(props) {\n * const controls = useAnimation()\n *\n * controls.start({\n * x: 100,\n * transition: { duration: 0.5 },\n * })\n *\n * return <motion.div animate={controls} />\n * }\n * ```\n *\n * @returns Animation controller with `start` and `stop` methods\n *\n * @public\n */\nfunction useAnimationControls() {\n const controls = useConstant(animationControls);\n useIsomorphicLayoutEffect(controls.mount, []);\n return controls;\n}\nconst useAnimation = useAnimationControls;\n\nexport { useAnimation, useAnimationControls };\n","import { useSyncExternalStore } from 'react'\n\nexport function makeMediaQueryStore(\n\tmediaQuery: string,\n\tserverSnapshot: boolean,\n) {\n\tfunction getSnapshot() {\n\t\treturn window.matchMedia(mediaQuery).matches\n\t}\n\n\tfunction subscribe(callback: () => void) {\n\t\tconst mediaQueryList = window.matchMedia(mediaQuery)\n\t\tmediaQueryList.addEventListener('change', callback)\n\t\treturn () => {\n\t\t\tmediaQueryList.removeEventListener('change', callback)\n\t\t}\n\t}\n\n\treturn function useMediaQuery() {\n\t\treturn useSyncExternalStore(subscribe, getSnapshot, () => serverSnapshot)\n\t}\n}\n","\"use client\";\n\n// src/dialog.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContext, createContextScope } from \"@radix-ui/react-context\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { FocusScope } from \"@radix-ui/react-focus-scope\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useFocusGuards } from \"@radix-ui/react-focus-guards\";\nimport { RemoveScroll } from \"react-remove-scroll\";\nimport { hideOthers } from \"aria-hidden\";\nimport { createSlot } from \"@radix-ui/react-slot\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nvar DIALOG_NAME = \"Dialog\";\nvar [createDialogContext, createDialogScope] = createContextScope(DIALOG_NAME);\nvar [DialogProvider, useDialogContext] = createDialogContext(DIALOG_NAME);\nvar Dialog = (props) => {\n const {\n __scopeDialog,\n children,\n open: openProp,\n defaultOpen,\n onOpenChange,\n modal = true\n } = props;\n const triggerRef = React.useRef(null);\n const contentRef = React.useRef(null);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: DIALOG_NAME\n });\n return /* @__PURE__ */ jsx(\n DialogProvider,\n {\n scope: __scopeDialog,\n triggerRef,\n contentRef,\n contentId: useId(),\n titleId: useId(),\n descriptionId: useId(),\n open,\n onOpenChange: setOpen,\n onOpenToggle: React.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]),\n modal,\n children\n }\n );\n};\nDialog.displayName = DIALOG_NAME;\nvar TRIGGER_NAME = \"DialogTrigger\";\nvar DialogTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...triggerProps } = props;\n const context = useDialogContext(TRIGGER_NAME, __scopeDialog);\n const composedTriggerRef = useComposedRefs(forwardedRef, context.triggerRef);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": context.open,\n \"aria-controls\": context.contentId,\n \"data-state\": getState(context.open),\n ...triggerProps,\n ref: composedTriggerRef,\n onClick: composeEventHandlers(props.onClick, context.onOpenToggle)\n }\n );\n }\n);\nDialogTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"DialogPortal\";\nvar [PortalProvider, usePortalContext] = createDialogContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar DialogPortal = (props) => {\n const { __scopeDialog, forceMount, children, container } = props;\n const context = useDialogContext(PORTAL_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopeDialog, forceMount, children: React.Children.map(children, (child) => /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, container, children: child }) })) });\n};\nDialogPortal.displayName = PORTAL_NAME;\nvar OVERLAY_NAME = \"DialogOverlay\";\nvar DialogOverlay = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(OVERLAY_NAME, props.__scopeDialog);\n const { forceMount = portalContext.forceMount, ...overlayProps } = props;\n const context = useDialogContext(OVERLAY_NAME, props.__scopeDialog);\n return context.modal ? /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(DialogOverlayImpl, { ...overlayProps, ref: forwardedRef }) }) : null;\n }\n);\nDialogOverlay.displayName = OVERLAY_NAME;\nvar Slot = createSlot(\"DialogOverlay.RemoveScroll\");\nvar DialogOverlayImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...overlayProps } = props;\n const context = useDialogContext(OVERLAY_NAME, __scopeDialog);\n return (\n // Make sure `Content` is scrollable even when it doesn't live inside `RemoveScroll`\n // ie. when `Overlay` and `Content` are siblings\n /* @__PURE__ */ jsx(RemoveScroll, { as: Slot, allowPinchZoom: true, shards: [context.contentRef], children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": getState(context.open),\n ...overlayProps,\n ref: forwardedRef,\n style: { pointerEvents: \"auto\", ...overlayProps.style }\n }\n ) })\n );\n }\n);\nvar CONTENT_NAME = \"DialogContent\";\nvar DialogContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeDialog);\n const { forceMount = portalContext.forceMount, ...contentProps } = props;\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: context.modal ? /* @__PURE__ */ jsx(DialogContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(DialogContentNonModal, { ...contentProps, ref: forwardedRef }) });\n }\n);\nDialogContent.displayName = CONTENT_NAME;\nvar DialogContentModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, context.contentRef, contentRef);\n React.useEffect(() => {\n const content = contentRef.current;\n if (content) return hideOthers(content);\n }, []);\n return /* @__PURE__ */ jsx(\n DialogContentImpl,\n {\n ...props,\n ref: composedRefs,\n trapFocus: context.open,\n disableOutsidePointerEvents: true,\n onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {\n event.preventDefault();\n context.triggerRef.current?.focus();\n }),\n onPointerDownOutside: composeEventHandlers(props.onPointerDownOutside, (event) => {\n const originalEvent = event.detail.originalEvent;\n const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;\n const isRightClick = originalEvent.button === 2 || ctrlLeftClick;\n if (isRightClick) event.preventDefault();\n }),\n onFocusOutside: composeEventHandlers(\n props.onFocusOutside,\n (event) => event.preventDefault()\n )\n }\n );\n }\n);\nvar DialogContentNonModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n const hasInteractedOutsideRef = React.useRef(false);\n const hasPointerDownOutsideRef = React.useRef(false);\n return /* @__PURE__ */ jsx(\n DialogContentImpl,\n {\n ...props,\n ref: forwardedRef,\n trapFocus: false,\n disableOutsidePointerEvents: false,\n onCloseAutoFocus: (event) => {\n props.onCloseAutoFocus?.(event);\n if (!event.defaultPrevented) {\n if (!hasInteractedOutsideRef.current) context.triggerRef.current?.focus();\n event.preventDefault();\n }\n hasInteractedOutsideRef.current = false;\n hasPointerDownOutsideRef.current = false;\n },\n onInteractOutside: (event) => {\n props.onInteractOutside?.(event);\n if (!event.defaultPrevented) {\n hasInteractedOutsideRef.current = true;\n if (event.detail.originalEvent.type === \"pointerdown\") {\n hasPointerDownOutsideRef.current = true;\n }\n }\n const target = event.target;\n const targetIsTrigger = context.triggerRef.current?.contains(target);\n if (targetIsTrigger) event.preventDefault();\n if (event.detail.originalEvent.type === \"focusin\" && hasPointerDownOutsideRef.current) {\n event.preventDefault();\n }\n }\n }\n );\n }\n);\nvar DialogContentImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, trapFocus, onOpenAutoFocus, onCloseAutoFocus, ...contentProps } = props;\n const context = useDialogContext(CONTENT_NAME, __scopeDialog);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, contentRef);\n useFocusGuards();\n return /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n FocusScope,\n {\n asChild: true,\n loop: true,\n trapped: trapFocus,\n onMountAutoFocus: onOpenAutoFocus,\n onUnmountAutoFocus: onCloseAutoFocus,\n children: /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n role: \"dialog\",\n id: context.contentId,\n \"aria-describedby\": context.descriptionId,\n \"aria-labelledby\": context.titleId,\n \"data-state\": getState(context.open),\n ...contentProps,\n ref: composedRefs,\n onDismiss: () => context.onOpenChange(false)\n }\n )\n }\n ),\n /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(TitleWarning, { titleId: context.titleId }),\n /* @__PURE__ */ jsx(DescriptionWarning, { contentRef, descriptionId: context.descriptionId })\n ] })\n ] });\n }\n);\nvar TITLE_NAME = \"DialogTitle\";\nvar DialogTitle = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...titleProps } = props;\n const context = useDialogContext(TITLE_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(Primitive.h2, { id: context.titleId, ...titleProps, ref: forwardedRef });\n }\n);\nDialogTitle.displayName = TITLE_NAME;\nvar DESCRIPTION_NAME = \"DialogDescription\";\nvar DialogDescription = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...descriptionProps } = props;\n const context = useDialogContext(DESCRIPTION_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(Primitive.p, { id: context.descriptionId, ...descriptionProps, ref: forwardedRef });\n }\n);\nDialogDescription.displayName = DESCRIPTION_NAME;\nvar CLOSE_NAME = \"DialogClose\";\nvar DialogClose = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...closeProps } = props;\n const context = useDialogContext(CLOSE_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n ...closeProps,\n ref: forwardedRef,\n onClick: composeEventHandlers(props.onClick, () => context.onOpenChange(false))\n }\n );\n }\n);\nDialogClose.displayName = CLOSE_NAME;\nfunction getState(open) {\n return open ? \"open\" : \"closed\";\n}\nvar TITLE_WARNING_NAME = \"DialogTitleWarning\";\nvar [WarningProvider, useWarningContext] = createContext(TITLE_WARNING_NAME, {\n contentName: CONTENT_NAME,\n titleName: TITLE_NAME,\n docsSlug: \"dialog\"\n});\nvar TitleWarning = ({ titleId }) => {\n const titleWarningContext = useWarningContext(TITLE_WARNING_NAME);\n const MESSAGE = `\\`${titleWarningContext.contentName}\\` requires a \\`${titleWarningContext.titleName}\\` for the component to be accessible for screen reader users.\n\nIf you want to hide the \\`${titleWarningContext.titleName}\\`, you can wrap it with our VisuallyHidden component.\n\nFor more information, see https://radix-ui.com/primitives/docs/components/${titleWarningContext.docsSlug}`;\n React.useEffect(() => {\n if (titleId) {\n const hasTitle = document.getElementById(titleId);\n if (!hasTitle) console.error(MESSAGE);\n }\n }, [MESSAGE, titleId]);\n return null;\n};\nvar DESCRIPTION_WARNING_NAME = \"DialogDescriptionWarning\";\nvar DescriptionWarning = ({ contentRef, descriptionId }) => {\n const descriptionWarningContext = useWarningContext(DESCRIPTION_WARNING_NAME);\n const MESSAGE = `Warning: Missing \\`Description\\` or \\`aria-describedby={undefined}\\` for {${descriptionWarningContext.contentName}}.`;\n React.useEffect(() => {\n const describedById = contentRef.current?.getAttribute(\"aria-describedby\");\n if (descriptionId && describedById) {\n const hasDescription = document.getElementById(descriptionId);\n if (!hasDescription) console.warn(MESSAGE);\n }\n }, [MESSAGE, contentRef, descriptionId]);\n return null;\n};\nvar Root = Dialog;\nvar Trigger = DialogTrigger;\nvar Portal = DialogPortal;\nvar Overlay = DialogOverlay;\nvar Content = DialogContent;\nvar Title = DialogTitle;\nvar Description = DialogDescription;\nvar Close = DialogClose;\nexport {\n Close,\n Content,\n Description,\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n Overlay,\n Portal,\n Root,\n Title,\n Trigger,\n WarningProvider,\n createDialogScope\n};\n//# sourceMappingURL=index.mjs.map\n","import * as DialogPrimitive from '@radix-ui/react-dialog'\nimport * as React from 'react'\nimport { cn } from '#app/utils/misc.tsx'\nimport { Icon } from '../icons'\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nfunction DialogOverlay({\n\tclassName,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n\treturn (\n\t\t<DialogPrimitive.Overlay\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nfunction DialogContent({\n\tclassName,\n\tchildren,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Content>) {\n\treturn (\n\t\t<DialogPortal>\n\t\t\t<DialogOverlay />\n\t\t\t<DialogPrimitive.Content\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t<DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity data-[state=open]:bg-accent data-[state=open]:text-muted-foreground hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none\">\n\t\t\t\t\t<Icon name=\"Close\" />\n\t\t\t\t\t<span className=\"sr-only\">Close</span>\n\t\t\t\t</DialogPrimitive.Close>\n\t\t\t</DialogPrimitive.Content>\n\t\t</DialogPortal>\n\t)\n}\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nfunction DialogHeader({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'flex flex-col space-y-1.5 text-center sm:text-left',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogHeader.displayName = 'DialogHeader'\n\nfunction DialogFooter({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogFooter.displayName = 'DialogFooter'\n\nfunction DialogTitle({\n\tclassName,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n\treturn (\n\t\t<DialogPrimitive.Title\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'text-lg font-semibold leading-none tracking-tight',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nfunction DialogDescription({\n\tclassName,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n\treturn (\n\t\t<DialogPrimitive.Description\n\t\t\tref={ref}\n\t\t\tclassName={cn('text-sm text-muted-foreground', className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n\tDialog,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogOverlay,\n\tDialogPortal,\n\tDialogTitle,\n\tDialogTrigger,\n}\n","import {\n\textractNumbersAndTypeFromAppNameOrPath,\n\tgetExercises,\n\tgetPlaygroundAppName,\n} from '@epic-web/workshop-utils/apps.server'\nimport { getWorkshopConfig } from '@epic-web/workshop-utils/config.server'\nimport {\n\tcombineServerTimings,\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport { clsx } from 'clsx'\nimport { motion, useAnimationControls } from 'framer-motion'\nimport * as React from 'react'\nimport {\n\tLink,\n\tNavLink,\n\tOutlet,\n\tuseLoaderData,\n\tuseParams,\n\tdata,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n} from 'react-router'\nimport { useHydrated } from 'remix-utils/use-hydrated'\nimport { Icon } from '#app/components/icons.tsx'\nimport { makeMediaQueryStore } from '#app/components/media-query.ts'\nimport { Logo } from '#app/components/product.tsx'\nimport { useRevalidationWS } from '#app/components/revalidation-ws.js'\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogHeader,\n\tDialogTrigger,\n} from '#app/components/ui/dialog.js'\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.js'\nimport { cn, getExercisePath, getExerciseStepPath } from '#app/utils/misc.tsx'\nimport { useIsOnline } from '#app/utils/online.ts'\nimport { usePresence, type User } from '#app/utils/presence.tsx'\nimport {\n\tuseExerciseProgressClassName,\n\tuseNextExerciseRoute,\n\tuseProgressItemClassName,\n\ttype ProgressItemSearch,\n} from '../progress.tsx'\nimport { ThemeSwitch } from '../theme/index.tsx'\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('appLayoutLoader')\n\tconst { title: workshopTitle } = getWorkshopConfig()\n\tconst [exercises, playgroundAppName] = await Promise.all([\n\t\tgetExercises({ request, timings }),\n\t\tgetPlaygroundAppName(),\n\t])\n\n\tconst playgroundNumbersAndType = extractNumbersAndTypeFromAppNameOrPath(\n\t\tplaygroundAppName ?? '',\n\t)\n\tconst playground = {\n\t\tappName: playgroundAppName,\n\t\texerciseNumber: Number(playgroundNumbersAndType?.exerciseNumber),\n\t\tstepNumber: Number(playgroundNumbersAndType?.stepNumber),\n\t\ttype: playgroundNumbersAndType?.type,\n\t}\n\n\tconst result = data(\n\t\t{\n\t\t\tworkshopTitle,\n\t\t\texercises: exercises.map((e) => ({\n\t\t\t\texerciseNumber: e.exerciseNumber,\n\t\t\t\ttitle: e.title,\n\t\t\t\tsolutions: e.solutions.map(({ stepNumber, title, name }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle,\n\t\t\t\t\tname,\n\t\t\t\t})),\n\t\t\t\tproblems: e.problems.map(({ stepNumber, title, name }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle,\n\t\t\t\t\tname,\n\t\t\t\t})),\n\t\t\t\tsteps: e.steps.map(({ stepNumber, problem, solution }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle: problem?.title ?? solution?.title ?? 'Unknown',\n\t\t\t\t\tname: problem?.name ?? solution?.name ?? 'Unknown',\n\t\t\t\t\tproblem: problem\n\t\t\t\t\t\t? { name: problem.name, title: problem.title }\n\t\t\t\t\t\t: null,\n\t\t\t\t\tsolution: solution\n\t\t\t\t\t\t? { name: solution.name, title: solution.title }\n\t\t\t\t\t\t: null,\n\t\t\t\t})),\n\t\t\t})),\n\t\t\tplayground,\n\t\t\tisMenuOpened:\n\t\t\t\trequest.headers.get('cookie')?.includes('es_menu_open=true') ?? false,\n\t\t},\n\t\t{\n\t\t\theaders: {\n\t\t\t\tVary: 'Cookie',\n\t\t\t\t'Server-Timing': getServerTimeHeader(timings),\n\t\t\t},\n\t\t},\n\t)\n\treturn result\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders, parentHeaders }) => {\n\tconst headers = {\n\t\t'Cache-Control': loaderHeaders.get('Cache-Control') ?? '',\n\t\tVary: 'Cookie',\n\t\t'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nconst opacities = ['opacity-70', 'opacity-80', 'opacity-90', 'opacity-100']\nconst shadows = [\n\t'shadow-[0_0_2px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_4px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_7px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_10px_0_rgba(0,0,0,0.3)]',\n]\nfunction getScoreClassNames(score: number) {\n\tconst opacityNumber = Math.round(score * opacities.length - 1)\n\tconst shadowNumber = Math.round(score * shadows.length - 1)\n\treturn cn(\n\t\t'shadow-purple-700 hover:opacity-100 focus:opacity-100 dark:shadow-purple-200',\n\t\topacities[opacityNumber] ?? 'opacity-60',\n\t\tshadows[shadowNumber] ?? 'shadow-none',\n\t\tscore === 1 ? 'animate-pulse hover:animate-none focus:animate-none' : null,\n\t)\n}\n\nfunction FacePile({ isMenuOpened }: { isMenuOpened: boolean }) {\n\tconst loggedInUser = useOptionalUser()\n\tconst { users } = usePresence()\n\tconst {\n\t\tproduct: { displayNameShort },\n\t} = useWorkshopConfig()\n\tconst limit = isMenuOpened ? 17 : 0\n\tconst numberOverLimit = users.length - limit\n\tconst shouldShowNumberOverLimit = numberOverLimit > (isMenuOpened ? 1 : 0)\n\n\tif (!users.length) return null\n\n\tconst tiffany =\n\t\tisMenuOpened && users.length === 1 ? (\n\t\t\t<Link\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\tto=\"https://www.youtube.com/watch?v=w6Q3mHyzn78\"\n\t\t\t>\n\t\t\t\t<img\n\t\t\t\t\talt=\"Tiffany Tunes\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'h-8 w-8 rounded-full border object-cover',\n\t\t\t\t\t\tgetScoreClassNames(1),\n\t\t\t\t\t)}\n\t\t\t\t\tsrc=\"/img/tiffany.png\"\n\t\t\t\t/>\n\t\t\t</Link>\n\t\t) : null\n\tconst overLimitLabel = `${numberOverLimit}${\n\t\tisMenuOpened ? ' more ' : ' '\n\t}${displayNameShort} Dev${numberOverLimit === 1 ? '' : 's'} working now`\n\treturn (\n\t\t<div className=\"flex flex-wrap items-center gap-2\">\n\t\t\t<TooltipProvider>\n\t\t\t\t{(shouldShowNumberOverLimit ? users.slice(0, limit) : users).map(\n\t\t\t\t\t({ user, score }) => {\n\t\t\t\t\t\tconst scoreClassNames = getScoreClassNames(score)\n\t\t\t\t\t\tconst locationLabel = getLocationLabel(user.location)\n\t\t\t\t\t\tconst imageUrl = user.imageUrlSmall || user.avatarUrl\n\t\t\t\t\t\tconst hasAccess = user.hasAccess\n\t\t\t\t\t\tconst local = user.location?.origin?.includes('localhost')\n\n\t\t\t\t\t\tlet doingLabel: string\n\t\t\t\t\t\tif (hasAccess) {\n\t\t\t\t\t\t\tdoingLabel = local ? 'working' : 'referencing'\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdoingLabel = local ? 'previewing' : 'reviewing'\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Tooltip key={user.id}>\n\t\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t\t{imageUrl ? (\n\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\t\t\t\talt={user.name || displayNameShort}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'h-8 w-8 rounded-full border object-cover',\n\t\t\t\t\t\t\t\t\t\t\t\tscoreClassNames,\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\tsrc={imageUrl}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\t\t\t\taria-label={user.name || `${displayNameShort} Dev`}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'flex h-8 w-8 items-center justify-center rounded-full border',\n\t\t\t\t\t\t\t\t\t\t\t\tscoreClassNames,\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Icon name=\"User\" />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t\t\t<span className=\"flex flex-col items-center justify-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t{user.name || `${displayNameShort} Dev`}{' '}\n\t\t\t\t\t\t\t\t\t\t\t{locationLabel\n\t\t\t\t\t\t\t\t\t\t\t\t? ` is ${doingLabel} ${\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tscore === 1 && loggedInUser?.id !== user.id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'with you'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t\t\t\t\t\t\t\t} on`\n\t\t\t\t\t\t\t\t\t\t\t\t: null}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t{locationLabel?.line1 ? (\n\t\t\t\t\t\t\t\t\t\t\t<span>{locationLabel.line1}</span>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t{locationLabel?.line2 ? (\n\t\t\t\t\t\t\t\t\t\t\t<span>{locationLabel.line2}</span>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t)}\n\t\t\t\t{tiffany}\n\t\t\t\t{shouldShowNumberOverLimit ? (\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\taria-label={overLimitLabel}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex items-center justify-center rounded-full border bg-accent text-xs text-accent-foreground',\n\t\t\t\t\t\t\t\t\tisMenuOpened ? 'h-8 w-8' : 'h-6 w-6',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'pointer-events-none overflow-hidden text-ellipsis whitespace-nowrap 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\nconst useIsWide = makeMediaQueryStore('(min-width: 640px)', true)\n\nexport default function App() {\n\tconst data = useLoaderData<typeof loader>()\n\tconst user = useOptionalUser()\n\tconst isWide = useIsWide()\n\tconst isHydrated = useHydrated()\n\n\tconst [isMenuOpened, setMenuOpenedState] = React.useState(data.isMenuOpened)\n\tuseRevalidationWS({ watchPaths: ['./exercises/README.mdx'] })\n\n\tfunction setMenuOpened(value: boolean) {\n\t\tsetMenuOpenedState(value)\n\t\tdocument.cookie = `es_menu_open=${value.toString()}; path=/; SameSite=Lax;`\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col\">\n\t\t\t{user ? null : <NoUserBanner />}\n\t\t\t{/*\n\t\t\t\tthis isn't placed in a conditional with isWide because the server render\n\t\t\t\tdoesn't know whether it should be around or not so we just use CSS to hide it\n\t\t\t\tif it's not supposed to show up.\n\n\t\t\t\tWe don't just use media queries for the wider screen nav because we want\n\t\t\t\tto avoid running all the logic in there unnecessarily.\n\t\t\t*/}\n\t\t\t{isHydrated && isWide ? null : (\n\t\t\t\t<MobileNavigation\n\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\tonMenuOpenChange={setMenuOpened}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<div\n\t\t\t\t// this nonsense is here because we want the panels to be scrollable rather\n\t\t\t\t// than having the entire page be scrollable (at least on wider screens)\n\t\t\t\tclassName={cn('flex flex-grow flex-col sm:flex-row', {\n\t\t\t\t\t'h-[calc(100vh-128px-env(safe-area-inset-top)-env(safe-area-inset-bottom))] sm:h-[calc(100vh-64px-env(safe-area-inset-top)-env(safe-area-inset-bottom))]':\n\t\t\t\t\t\t!user,\n\t\t\t\t\t'h-[calc(100vh-64px-env(safe-area-inset-top)-env(safe-area-inset-bottom))] sm:h-[calc(100vh-env(safe-area-inset-top)-env(safe-area-inset-bottom))]':\n\t\t\t\t\t\tuser,\n\t\t\t\t\t'h-[unset]': !isWide && isMenuOpened,\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t{isWide ? (\n\t\t\t\t\t<Navigation\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tonMenuOpenChange={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'h-full w-full max-w-full sm:max-w-[calc(100%-56px)]',\n\t\t\t\t\t\tisMenuOpened ? 'hidden md:block' : '',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Outlet />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction getLocationLabel(location: User['location']) {\n\tif (!location) return null\n\n\tconst { exercise } = location\n\n\tconst exercisePortion = [\n\t\texercise\n\t\t\t? [exercise.exerciseNumber, exercise.stepNumber]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.map((s) => s.toString().padStart(2, '0'))\n\t\t\t\t\t.join('/')\n\t\t\t: null,\n\t\texercise?.type,\n\t]\n\t\t.filter(Boolean)\n\t\t.join(' - ')\n\treturn { line1: location.workshopTitle, line2: exercisePortion }\n}\n\nfunction NoUserBanner() {\n\tconst isWide = useIsWide()\n\tconst {\n\t\tproduct: { host, displayName },\n\t} = useWorkshopConfig()\n\tconst userHasAccess = useUserHasAccess()\n\tconst details = (\n\t\t<div>\n\t\t\t{ENV.EPICSHOP_DEPLOYED ? (\n\t\t\t\t<div>\n\t\t\t\t\t{`This is the deployed version. `}\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tto={ENV.EPICSHOP_GITHUB_REPO}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tRun locally\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t{` for full experience.`}\n\t\t\t\t\t</>{' '}\n\t\t\t\t</div>\n\t\t\t) : userHasAccess ? (\n\t\t\t\t<div>\n\t\t\t\t\t<Link to=\"/login\" className=\"underline\">\n\t\t\t\t\t\tLogin\n\t\t\t\t\t</Link>{' '}\n\t\t\t\t\tor{' '}\n\t\t\t\t\t<a href={`https://${host}/login`} className=\"underline\">\n\t\t\t\t\t\tjoin for free\n\t\t\t\t\t</a>{' '}\n\t\t\t\t\tfor the full experience.\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</div>\n\t)\n\treturn (\n\t\t<div className=\"z-10 flex h-16 items-center justify-between border-b bg-gradient-to-tr from-blue-500 to-indigo-500 pl-4 text-white\">\n\t\t\t{isWide ? (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"hidden flex-1 flex-wrap items-center gap-4 sm:flex\">\n\t\t\t\t\t\t<Logo size=\"lg\" style=\"monochrome\" />\n\t\t\t\t\t\t<div className=\"flex flex-1 flex-wrap items-center\">\n\t\t\t\t\t\t\t<p className=\"mr-2\">\n\t\t\t\t\t\t\t\tWelcome to the{' '}\n\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\tto={`https://${host}`}\n\t\t\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t</Link>{' '}\n\t\t\t\t\t\t\t\tWorkshop app!\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t{details}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t{userHasAccess ? null : (\n\t\t\t\t\t\t<div className=\"hidden h-full flex-col items-center sm:flex md:flex-row\">\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={`https://${host}`}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Join {displayName}</span>\n\t\t\t\t\t\t\t\t<span>↗︎</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={ENV.EPICSHOP_DEPLOYED ? `https://${host}/login` : '/login'}\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 bg-white/20 px-5 text-sm font-semibold shadow-md transition hover:bg-white/30\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"User\" size=\"lg\" />\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Login</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"flex flex-1 flex-wrap items-center gap-4 sm:hidden\">\n\t\t\t\t\t\t<a href={`https://${host}`}>\n\t\t\t\t\t\t\t<Logo size=\"lg\" style=\"monochrome\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<Dialog>\n\t\t\t\t\t\t\t<DialogTrigger>\n\t\t\t\t\t\t\t\t<Icon name=\"Question\" size=\"lg\" className=\"animate-pulse\" />\n\t\t\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t\t\t<DialogContent>\n\t\t\t\t\t\t\t\t<DialogHeader>\n\t\t\t\t\t\t\t\t\t<Logo size=\"lg\" style=\"monochrome\" />\n\t\t\t\t\t\t\t\t\t<span className=\"text-lg font-semibold\">{displayName}</span>\n\t\t\t\t\t\t\t\t</DialogHeader>\n\t\t\t\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\t\t\t\tWelcome to the{' '}\n\t\t\t\t\t\t\t\t\t<Link to={`https://${host}`} className=\"underline\">\n\t\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t\t</Link>{' '}\n\t\t\t\t\t\t\t\t\tWorkshop app!\n\t\t\t\t\t\t\t\t</DialogDescription>\n\t\t\t\t\t\t\t\t{details}\n\t\t\t\t\t\t\t</DialogContent>\n\t\t\t\t\t\t</Dialog>\n\t\t\t\t\t</div>\n\t\t\t\t\t{userHasAccess ? null : (\n\t\t\t\t\t\t<div className=\"flex h-full items-center\">\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={`https://${host}`}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Join</span>\n\t\t\t\t\t\t\t\t<span>↗︎</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={ENV.EPICSHOP_DEPLOYED ? `https://${host}/login` : '/login'}\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 bg-white/20 px-5 text-sm font-semibold shadow-md transition hover:bg-white/30\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"User\" size=\"lg\" />\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Login</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\nconst itemVariants = {\n\thidden: { opacity: 0, x: -20 },\n\tvisible: { opacity: 1, x: 0 },\n}\nfunction NavigationExerciseListItem({\n\texerciseNumber,\n\tchildren,\n}: {\n\texerciseNumber: number\n\tchildren: React.ReactNode\n}) {\n\tconst progressClassName = useExerciseProgressClassName(exerciseNumber)\n\treturn (\n\t\t<motion.li\n\t\t\tvariants={itemVariants}\n\t\t\tclassName={cn(\n\t\t\t\t// add gap of 3 to children, but using padding so the progress extends through the whole height\n\t\t\t\t'py-[6px] first:pt-3 last:pb-3',\n\t\t\t\tprogressClassName ? `${progressClassName} before:border-t` : null,\n\t\t\t)}\n\t\t>\n\t\t\t<span className=\"inline-block pl-2\">{children}</span>\n\t\t</motion.li>\n\t)\n}\n\nfunction NavigationExerciseStepListItem({\n\tchildren,\n\t...progressItemSearch\n}: {\n\tchildren: React.ReactNode\n} & ProgressItemSearch) {\n\tconst progressClassName = useProgressItemClassName(progressItemSearch)\n\treturn (\n\t\t<motion.li\n\t\t\tvariants={itemVariants}\n\t\t\tclassName={cn(\n\t\t\t\t// add gap of 3 to children, but using padding so the progress extends through the whole height\n\t\t\t\t'py-[6px] first:pt-3 last:pb-3',\n\t\t\t\tprogressClassName ? `${progressClassName} before:border-t` : null,\n\t\t\t)}\n\t\t>\n\t\t\t<span className=\"inline-block pl-2\">{children}</span>\n\t\t</motion.li>\n\t)\n}\n\nfunction MobileNavigation({\n\tisMenuOpened,\n\tonMenuOpenChange: setMenuOpened,\n}: {\n\tisMenuOpened: boolean\n\tonMenuOpenChange: (change: boolean) => void\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tconst user = useOptionalUser()\n\tconst nextExerciseRoute = useNextExerciseRoute()\n\tconst params = useParams()\n\tconst isOnline = useIsOnline()\n\tconst { users } = usePresence()\n\n\t// items\n\tconst listVariants = {\n\t\tvisible: {\n\t\t\topacity: 1,\n\t\t\ttransition: {\n\t\t\t\tduration: 0.05,\n\t\t\t\twhen: 'beforeChildren',\n\t\t\t\tstaggerChildren: 0.03,\n\t\t\t},\n\t\t},\n\t\thidden: {\n\t\t\topacity: 0,\n\t\t},\n\t}\n\n\treturn (\n\t\t<nav className=\"flex w-full border-b sm:hidden\">\n\t\t\t<div className=\"w-full\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn('flex items-center', {\n\t\t\t\t\t\t'flex-col': isMenuOpened,\n\t\t\t\t\t\t'h-14': !isMenuOpened,\n\t\t\t\t\t})}\n\t\t\t\t>\n\t\t\t\t\t<NavToggle\n\t\t\t\t\t\ttitle={data.workshopTitle}\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tsetMenuOpened={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t\t{isMenuOpened && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tclassName=\"flex w-full flex-grow flex-col justify-between overflow-x-auto p-6 scrollbar-thin scrollbar-thumb-scrollbar\"\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 whitespace-nowrap px-2 py-0.5 pr-3 text-2xl font-bold outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background 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 whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background 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=\"ml-4 mt-2 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'relative whitespace-nowrap px-2 py-0.5 pr-3 text-xl font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background 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=\"font-semibold leading-tight\"\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=\"ml-3 mt-0.5 flex gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'problem',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProblem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'solution',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSolution\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"finished\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber, 'finished')}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-base font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background': isActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t📝 Elaboration\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</NavigationExerciseListItem>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t<div className=\"mt-6\">\n\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\tto=\"/finished\"\n\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap text-lg font-bold 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'bg-black text-white after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background 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=\"flex-grow\" />\n\t\t\t\t\t{isOnline ? null : (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'You are offline'}>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex h-14 animate-pulse items-center justify-start p-4',\n\t\t\t\t\t\t\t\t\tisMenuOpened ? 'w-full border-t' : 'border-l',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\tname=\"WifiNoConnection\"\n\t\t\t\t\t\t\t\t\tclassName=\"text-foreground-destructive\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{isMenuOpened ? 'You are offline' : null}\n\t\t\t\t\t\t\t\t</Icon>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t)}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex items-center justify-start p-4',\n\t\t\t\t\t\t\tisMenuOpened && users.length > 4 ? 'min-h-14' : 'h-14',\n\t\t\t\t\t\t\tisMenuOpened ? 'w-full border-t' : 'border-l',\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<FacePile isMenuOpened={isMenuOpened} />\n\t\t\t\t\t</div>\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user ? (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'Your account'}>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex h-14 flex-shrink-0 items-center justify-start space-x-3 px-4 py-4 text-center no-underline hover:underline',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t'border-l': !isMenuOpened,\n\t\t\t\t\t\t\t\t\t\t'w-full border-t': isMenuOpened,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tto=\"/account\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{user.imageUrlSmall ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\talt={user.name ?? user.email}\n\t\t\t\t\t\t\t\t\t\tsrc={user.imageUrlSmall}\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-full rounded-full\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<Icon name=\"User\" className=\"flex-shrink-0\" size=\"lg\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tYour Account\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Your account</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user && nextExerciseRoute ? (\n\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\tcontent={isMenuOpened ? null : 'Continue to next lesson'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={nextExerciseRoute}\n\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'flex h-14 w-full items-center space-x-3 border-l px-4 py-4 pl-[18px] no-underline hover:underline',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstate={{ from: 'continue next lesson button' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"FastForward\" className=\"flex-shrink-0\" size=\"md\" />\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tContinue to next lesson\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Continue to next lesson</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex h-14 w-14 items-center justify-center self-start p-4 sm:mb-4 sm:w-full',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t'w-full border-t': isMenuOpened,\n\t\t\t\t\t\t\t\t'border-l': !isMenuOpened,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ThemeSwitch />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</nav>\n\t)\n}\n\nconst OPENED_MENU_WIDTH = 400\n\nfunction Navigation({\n\tisMenuOpened,\n\tonMenuOpenChange: setMenuOpened,\n}: {\n\tisMenuOpened: boolean\n\tonMenuOpenChange: (change: boolean) => void\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tconst user = useOptionalUser()\n\tconst nextExerciseRoute = useNextExerciseRoute()\n\tconst params = useParams()\n\tconst isOnline = useIsOnline()\n\tconst { users } = usePresence()\n\n\tconst exercise = data.exercises.find(\n\t\t(e) => e.exerciseNumber === Number(params.exerciseNumber),\n\t)\n\tconst app =\n\t\tparams.type === 'solution'\n\t\t\t? exercise?.solutions.find(\n\t\t\t\t\t(s) => s.stepNumber === Number(params.stepNumber),\n\t\t\t\t)\n\t\t\t: params.type === 'problem'\n\t\t\t\t? exercise?.problems.find(\n\t\t\t\t\t\t(p) => p.stepNumber === Number(params.stepNumber),\n\t\t\t\t\t)\n\t\t\t\t: null\n\n\t// container\n\tconst menuControls = useAnimationControls()\n\tconst menuVariants = {\n\t\tclose: { width: 56 },\n\t\topen: { width: OPENED_MENU_WIDTH },\n\t}\n\n\t// items\n\tconst listVariants = {\n\t\tvisible: {\n\t\t\topacity: 1,\n\t\t\ttransition: {\n\t\t\t\tduration: 0.05,\n\t\t\t\twhen: 'beforeChildren',\n\t\t\t\tstaggerChildren: 0.03,\n\t\t\t},\n\t\t},\n\t\thidden: {\n\t\t\topacity: 0,\n\t\t},\n\t}\n\n\treturn (\n\t\t<nav className=\"hidden border-r sm:flex\">\n\t\t\t<motion.div\n\t\t\t\tinitial={isMenuOpened ? 'open' : 'close'}\n\t\t\t\tvariants={menuVariants}\n\t\t\t\tanimate={menuControls}\n\t\t\t>\n\t\t\t\t<div className=\"flex h-full flex-col items-center justify-between\">\n\t\t\t\t\t<NavToggle\n\t\t\t\t\t\ttitle={data.workshopTitle}\n\t\t\t\t\t\tmenuControls={menuControls}\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tsetMenuOpened={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t\t{isMenuOpened && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tstyle={{ width: OPENED_MENU_WIDTH }}\n\t\t\t\t\t\t\tclassName=\"flex flex-grow flex-col justify-between overflow-y-auto p-6 scrollbar-thin scrollbar-thumb-scrollbar\"\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 whitespace-nowrap px-2 py-0.5 pr-3 text-2xl font-bold outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background 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 whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background 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=\"ml-4 mt-2 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'relative whitespace-nowrap px-2 py-0.5 pr-3 text-xl font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background 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=\"font-semibold leading-tight\"\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=\"ml-3 mt-0.5 flex gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'problem',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProblem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'solution',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSolution\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"finished\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber, 'finished')}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-base font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background': isActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t📝 Elaboration\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</NavigationExerciseListItem>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t<div className=\"mt-6\">\n\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\tto=\"/finished\"\n\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap text-lg font-bold 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'bg-black text-white after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background 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 flex-grow flex-col justify-center\">\n\t\t\t\t\t\t\t<div className=\"orientation-sideways w-full font-mono text-sm font-medium uppercase leading-none\">\n\t\t\t\t\t\t\t\t{exercise?.title ? (\n\t\t\t\t\t\t\t\t\t<Link to={getExercisePath(Number(params.exerciseNumber))}>\n\t\t\t\t\t\t\t\t\t\t{exercise.title}\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t{exercise?.title && app?.title ? ' — ' : null}\n\t\t\t\t\t\t\t\t{app?.title ? (\n\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\tNumber(params.exerciseNumber),\n\t\t\t\t\t\t\t\t\t\t\tapp.stepNumber,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{app.title}\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{isOnline ? null : (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'You are offline'}>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex w-full animate-pulse items-center border-t p-4',\n\t\t\t\t\t\t\t\t\tisMenuOpened ? 'justify-start' : 'justify-center',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\tname=\"WifiNoConnection\"\n\t\t\t\t\t\t\t\t\tclassName=\"text-foreground-destructive\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t\t<span className=\"whitespace-nowrap\">You are offline</span>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</Icon>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t)}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex w-full items-center justify-start border-t p-4 transition-[height]',\n\t\t\t\t\t\t\tisMenuOpened && users.length > 4 ? 'h-28' : 'h-14',\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={isMenuOpened ? { width: OPENED_MENU_WIDTH } : {}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<FacePile isMenuOpened={isMenuOpened} />\n\t\t\t\t\t</div>\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user ? (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'Your account'}>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tclassName=\"flex h-14 w-full flex-shrink-0 items-center justify-start space-x-3 border-t px-4 py-4 text-center no-underline hover:underline\"\n\t\t\t\t\t\t\t\tto=\"/account\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{user.imageUrlSmall ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\talt={user.name ?? user.email}\n\t\t\t\t\t\t\t\t\t\tsrc={user.imageUrlSmall}\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-full rounded-full\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<Icon name=\"User\" className=\"flex-shrink-0\" size=\"lg\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tYour Account\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Your account</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user && nextExerciseRoute ? (\n\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\tcontent={isMenuOpened ? null : 'Continue to next lesson'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={nextExerciseRoute}\n\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'flex h-14 w-full items-center space-x-3 border-t px-4 py-4 pl-[18px] no-underline hover:underline',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstate={{ from: 'continue next lesson button' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"FastForward\" className=\"flex-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 pl-3 pt-[15px]\">\n\t\t\t\t\t\t<ThemeSwitch />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</motion.div>\n\t\t</nav>\n\t)\n}\n\nfunction NavToggle({\n\ttitle,\n\tisMenuOpened,\n\tsetMenuOpened,\n\tmenuControls,\n}: {\n\ttitle: string\n\tisMenuOpened: boolean\n\tsetMenuOpened: (value: boolean) => void\n\tmenuControls?: ReturnType<typeof useAnimationControls>\n}) {\n\tconst initialOpenRef = React.useRef(isMenuOpened)\n\tconst menuButtonRef = React.useRef<HTMLButtonElement>(null)\n\tconst path01Variants = {\n\t\topen: { d: 'M3.06061 2.99999L21.0606 21' },\n\t\tclosed: { d: 'M0 9.5L24 9.5' },\n\t}\n\tconst path02Variants = {\n\t\topen: { d: 'M3.00006 21.0607L21 3.06064' },\n\t\tmoving: { d: 'M0 14.5L24 14.5' },\n\t\tclosed: { d: 'M0 14.5L15 14.5' },\n\t}\n\tconst path01Controls = useAnimationControls()\n\tconst path02Controls = useAnimationControls()\n\n\tasync function toggleMenu() {\n\t\tvoid menuControls?.start(isMenuOpened ? 'close' : 'open')\n\t\tsetMenuOpened(!isMenuOpened)\n\t\tif (isMenuOpened) {\n\t\t\tvoid path01Controls.start(path01Variants.closed)\n\t\t\tawait path02Controls.start(path02Variants.moving)\n\t\t\tvoid path02Controls.start(path02Variants.closed)\n\t\t} else {\n\t\t\tawait path02Controls.start(path02Variants.moving)\n\t\t\tvoid path01Controls.start(path01Variants.open)\n\t\t\tvoid path02Controls.start(path02Variants.open)\n\t\t}\n\t}\n\n\tReact.useEffect(() => {\n\t\tif (!isMenuOpened) return\n\n\t\tfunction handleKeyUp(event: KeyboardEvent) {\n\t\t\tif (event.key === 'Escape') {\n\t\t\t\tmenuButtonRef.current?.click()\n\t\t\t}\n\t\t}\n\t\tdocument.addEventListener('keyup', handleKeyUp)\n\t\treturn () => document.removeEventListener('keyup', handleKeyUp)\n\t}, [isMenuOpened])\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'relative inline-flex h-14 flex-shrink-0 items-center justify-between overflow-hidden border-r sm:w-full sm:border-b sm:border-r-0',\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 whitespace-nowrap font-mono text-sm 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","DIALOG_NAME","createDialogContext","createDialogScope","createContextScope","DialogProvider","useDialogContext","Dialog","props","__scopeDialog","children","openProp","defaultOpen","onOpenChange","modal","triggerRef","React.useRef","contentRef","open","setOpen","useControllableState","jsx","useId","React.useCallback","prevOpen","TRIGGER_NAME","DialogTrigger","React.forwardRef","forwardedRef","triggerProps","context","composedTriggerRef","useComposedRefs","Primitive","getState","composeEventHandlers","PORTAL_NAME","PortalProvider","usePortalContext","DialogPortal","forceMount","container","React.Children","Presence","PortalPrimitive","OVERLAY_NAME","DialogOverlay","portalContext","overlayProps","DialogOverlayImpl","Slot","createSlot","RemoveScroll","CONTENT_NAME","DialogContent","contentProps","DialogContentModal","DialogContentNonModal","composedRefs","React.useEffect","content","hideOthers","DialogContentImpl","event","originalEvent","ctrlLeftClick","hasInteractedOutsideRef","hasPointerDownOutsideRef","target","trapFocus","onOpenAutoFocus","onCloseAutoFocus","useFocusGuards","jsxs","Fragment","FocusScope","DismissableLayer","TitleWarning","DescriptionWarning","TITLE_NAME","DialogTitle","titleProps","DESCRIPTION_NAME","DialogDescription","descriptionProps","CLOSE_NAME","DialogClose","closeProps","TITLE_WARNING_NAME","WarningProvider","useWarningContext","createContext","titleId","titleWarningContext","MESSAGE","DESCRIPTION_WARNING_NAME","descriptionId","describedById","Root","Trigger","Portal","Overlay","Content","Title","Description","Close","DialogPrimitive.Root","DialogPrimitive.Trigger","DialogPrimitive.Portal","className","ref","DialogPrimitive.Overlay","cn","DialogPrimitive.Content","DialogPrimitive.Close","Icon","DialogHeader","DialogPrimitive.Title","DialogPrimitive.Description","opacities","shadows","getScoreClassNames","score","opacityNumber","Math","round","length","shadowNumber","FacePile","isMenuOpened","loggedInUser","useOptionalUser","users","usePresence","product","displayNameShort","useWorkshopConfig","limit","numberOverLimit","shouldShowNumberOverLimit","tiffany","Link","rel","to","alt","src","overLimitLabel","TooltipProvider","slice","map","user","scoreClassNames","locationLabel","getLocationLabel","location","imageUrl","imageUrlSmall","avatarUrl","hasAccess","local","origin","includes","doingLabel","Tooltip","TooltipTrigger","asChild","tabIndex","name","TooltipContent","id","line1","line2","useIsWide","_layout","_UNSAFE_withComponentProps","data","useLoaderData","isWide","isHydrated","useHydrated","setMenuOpenedState","React","useRevalidationWS","watchPaths","setMenuOpened","document","cookie","toString","NoUserBanner","MobileNavigation","onMenuOpenChange","Navigation","Outlet","exercise","exercisePortion","exerciseNumber","stepNumber","filter","Boolean","s","padStart","join","type","workshopTitle","host","displayName","userHasAccess","useUserHasAccess","details","ENV","EPICSHOP_DEPLOYED","EPICSHOP_GITHUB_REPO","href","Logo","size","style","itemVariants","hidden","opacity","x","visible","NavigationExerciseListItem","progressClassName","useExerciseProgressClassName","motion","li","variants","NavigationExerciseStepListItem","progressItemSearch","useProgressItemClassName","nextExerciseRoute","useNextExerciseRoute","params","useParams","isOnline","useIsOnline","listVariants","transition","duration","when","staggerChildren","NavToggle","title","div","initial","animate","ul","NavLink","prefetch","isActive","clsx","exercises","steps","Number","showPlayground","playground","getExercisePath","getExerciseStepPath","problem","solution","appName","SimpleTooltip","email","state","from","ThemeSwitch","OPENED_MENU_WIDTH","find","e","app","solutions","problems","p","menuControls","menuVariants","close","width","initialOpenRef","menuButtonRef","path01Variants","d","closed","path02Variants","moving","path01Controls","path02Controls","toggleMenu","start","handleKeyUp","current","click","addEventListener","removeEventListener","onClick","height","viewBox","path","stroke","strokeWidth","delay","y"],"mappings":"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","x_google_ignoreList":[0,1,3]}
|