@epic-web/workshop-app 6.69.1 → 6.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/client/assets/{_-BnmXymJG.js → _-dWSrc4Ox.js} +2 -2
- package/build/client/assets/{_-BnmXymJG.js.map → _-dWSrc4Ox.js.map} +1 -1
- package/build/client/assets/{_basePickBy-D6pFkWVF.js → _basePickBy-D77BeQbR.js} +2 -2
- package/build/client/assets/{_basePickBy-D6pFkWVF.js.map → _basePickBy-D77BeQbR.js.map} +1 -1
- package/build/client/assets/{_baseUniq-BbljtzXr.js → _baseUniq-DTO-tFvD.js} +2 -2
- package/build/client/assets/{_baseUniq-BbljtzXr.js.map → _baseUniq-DTO-tFvD.js.map} +1 -1
- package/build/client/assets/{_exerciseNumber-77g7-L-x.js → _exerciseNumber-DgMb13KP.js} +2 -2
- package/build/client/assets/{_exerciseNumber-77g7-L-x.js.map → _exerciseNumber-DgMb13KP.js.map} +1 -1
- package/build/client/assets/{_exerciseNumber_._stepNumber.index-DYb7kg06.js → _exerciseNumber_._stepNumber.index-WLW-sVZ0.js} +2 -2
- package/build/client/assets/{_exerciseNumber_._stepNumber.index-DYb7kg06.js.map → _exerciseNumber_._stepNumber.index-WLW-sVZ0.js.map} +1 -1
- package/build/client/assets/{_exerciseNumber_.finished-CGoPhVVF.js → _exerciseNumber_.finished-DkAs61X_.js} +2 -2
- package/build/client/assets/_exerciseNumber_.finished-DkAs61X_.js.map +1 -0
- package/build/client/assets/_extra-fwsy2qkP.js +2 -0
- package/build/client/assets/_extra-fwsy2qkP.js.map +1 -0
- package/build/client/assets/_layout-BQ8VYaze.js +2 -0
- package/build/client/assets/_layout-BQ8VYaze.js.map +1 -0
- package/build/client/assets/_layout-DR0LQ06M.js +2 -0
- package/build/client/assets/_layout-DR0LQ06M.js.map +1 -0
- package/build/client/assets/{accordion-CzXT3k43.js → accordion-CQ7oujC6.js} +2 -2
- package/build/client/assets/{accordion-CzXT3k43.js.map → accordion-CQ7oujC6.js.map} +1 -1
- package/build/client/assets/{account-Cs3Te0is.js → account-C96cpeZR.js} +2 -2
- package/build/client/assets/{account-Cs3Te0is.js.map → account-C96cpeZR.js.map} +1 -1
- package/build/client/assets/app-CJniokic.js +2 -0
- package/build/client/assets/{app-TcFAQB2o.js.map → app-CJniokic.js.map} +1 -1
- package/build/client/assets/{arc-BHxP6xxO.js → arc-ChVm3d4e.js} +2 -2
- package/build/client/assets/{arc-BHxP6xxO.js.map → arc-ChVm3d4e.js.map} +1 -1
- package/build/client/assets/{architectureDiagram-VXUJARFQ-oEJHJt7x.js → architectureDiagram-VXUJARFQ-DkqyKZ50.js} +2 -2
- package/build/client/assets/{architectureDiagram-VXUJARFQ-oEJHJt7x.js.map → architectureDiagram-VXUJARFQ-DkqyKZ50.js.map} +1 -1
- package/build/client/assets/{blockDiagram-VD42YOAC-7xzSJqoM.js → blockDiagram-VD42YOAC-Cqa8Z0qT.js} +2 -2
- package/build/client/assets/{blockDiagram-VD42YOAC-7xzSJqoM.js.map → blockDiagram-VD42YOAC-Cqa8Z0qT.js.map} +1 -1
- package/build/client/assets/{button-CIlVtsau.js → button-Cd-ekki5.js} +2 -2
- package/build/client/assets/{button-CIlVtsau.js.map → button-Cd-ekki5.js.map} +1 -1
- package/build/client/assets/{c4Diagram-YG6GDRKO-BUdT9rCJ.js → c4Diagram-YG6GDRKO-BHQRSJ1P.js} +2 -2
- package/build/client/assets/{c4Diagram-YG6GDRKO-BUdT9rCJ.js.map → c4Diagram-YG6GDRKO-BHQRSJ1P.js.map} +1 -1
- package/build/client/assets/{cache-MJu_dqFS.js → cache-CAr50MIB.js} +2 -2
- package/build/client/assets/{cache-MJu_dqFS.js.map → cache-CAr50MIB.js.map} +1 -1
- package/build/client/assets/channel-B7uExpgv.js +2 -0
- package/build/client/assets/{channel-BLJkdd1O.js.map → channel-B7uExpgv.js.map} +1 -1
- package/build/client/assets/{chunk-4BX2VUAB-qrzenNNi.js → chunk-4BX2VUAB-BOJM4J9w.js} +2 -2
- package/build/client/assets/{chunk-4BX2VUAB-qrzenNNi.js.map → chunk-4BX2VUAB-BOJM4J9w.js.map} +1 -1
- package/build/client/assets/{chunk-55IACEB6-BOr0rES3.js → chunk-55IACEB6-CO_GT_87.js} +2 -2
- package/build/client/assets/{chunk-55IACEB6-BOr0rES3.js.map → chunk-55IACEB6-CO_GT_87.js.map} +1 -1
- package/build/client/assets/{chunk-B4BG7PRW-C2qQTBXm.js → chunk-B4BG7PRW-CqfZTumF.js} +2 -2
- package/build/client/assets/{chunk-B4BG7PRW-C2qQTBXm.js.map → chunk-B4BG7PRW-CqfZTumF.js.map} +1 -1
- package/build/client/assets/{chunk-DI55MBZ5-CSfEUcAq.js → chunk-DI55MBZ5-CxSXOmoK.js} +2 -2
- package/build/client/assets/{chunk-DI55MBZ5-CSfEUcAq.js.map → chunk-DI55MBZ5-CxSXOmoK.js.map} +1 -1
- package/build/client/assets/{chunk-FMBD7UC4-CyJoWksV.js → chunk-FMBD7UC4-ChHVMdVq.js} +2 -2
- package/build/client/assets/{chunk-FMBD7UC4-CyJoWksV.js.map → chunk-FMBD7UC4-ChHVMdVq.js.map} +1 -1
- package/build/client/assets/{chunk-QN33PNHL-BpbvTQdp.js → chunk-QN33PNHL-DKEBwj3f.js} +2 -2
- package/build/client/assets/{chunk-QN33PNHL-BpbvTQdp.js.map → chunk-QN33PNHL-DKEBwj3f.js.map} +1 -1
- package/build/client/assets/{chunk-QZHKN3VN-C2RN0CtQ.js → chunk-QZHKN3VN-Cu5tuE5n.js} +2 -2
- package/build/client/assets/{chunk-QZHKN3VN-C2RN0CtQ.js.map → chunk-QZHKN3VN-Cu5tuE5n.js.map} +1 -1
- package/build/client/assets/{chunk-TZMSLE5B-0z8lxtDn.js → chunk-TZMSLE5B-BpvH1fVS.js} +2 -2
- package/build/client/assets/{chunk-TZMSLE5B-0z8lxtDn.js.map → chunk-TZMSLE5B-BpvH1fVS.js.map} +1 -1
- package/build/client/assets/classDiagram-2ON5EDUG-BjjlpwdW.js +2 -0
- package/build/client/assets/{classDiagram-2ON5EDUG-_kfNpv_f.js.map → classDiagram-2ON5EDUG-BjjlpwdW.js.map} +1 -1
- package/build/client/assets/classDiagram-v2-WZHVMYZB-BjjlpwdW.js +2 -0
- package/build/client/assets/{classDiagram-v2-WZHVMYZB-_kfNpv_f.js.map → classDiagram-v2-WZHVMYZB-BjjlpwdW.js.map} +1 -1
- package/build/client/assets/clone-DRkw5ylZ.js +2 -0
- package/build/client/assets/{clone-CztDUJhf.js.map → clone-DRkw5ylZ.js.map} +1 -1
- package/build/client/assets/{cose-bilkent-S5V4N54A-DQM-J4RL.js → cose-bilkent-S5V4N54A-9tAqXXXx.js} +2 -2
- package/build/client/assets/{cose-bilkent-S5V4N54A-DQM-J4RL.js.map → cose-bilkent-S5V4N54A-9tAqXXXx.js.map} +1 -1
- package/build/client/assets/{dagre-6UL2VRFP-BdfvKPZ9.js → dagre-6UL2VRFP-DdQahM76.js} +2 -2
- package/build/client/assets/{dagre-6UL2VRFP-BdfvKPZ9.js.map → dagre-6UL2VRFP-DdQahM76.js.map} +1 -1
- package/build/client/assets/{db-x6v-Uxrh.js → db-DAnX-T3_.js} +2 -2
- package/build/client/assets/{db-x6v-Uxrh.js.map → db-DAnX-T3_.js.map} +1 -1
- package/build/client/assets/{diagram-PSM6KHXK-CgwBEb3G.js → diagram-PSM6KHXK-D2ghOCFR.js} +2 -2
- package/build/client/assets/{diagram-PSM6KHXK-CgwBEb3G.js.map → diagram-PSM6KHXK-D2ghOCFR.js.map} +1 -1
- package/build/client/assets/{diagram-QEK2KX5R-DEaXdLXz.js → diagram-QEK2KX5R-CVdPnwKa.js} +2 -2
- package/build/client/assets/{diagram-QEK2KX5R-DEaXdLXz.js.map → diagram-QEK2KX5R-CVdPnwKa.js.map} +1 -1
- package/build/client/assets/{diagram-S2PKOQOG-Dq5QQWqq.js → diagram-S2PKOQOG-ByHcRNai.js} +2 -2
- package/build/client/assets/{diagram-S2PKOQOG-Dq5QQWqq.js.map → diagram-S2PKOQOG-ByHcRNai.js.map} +1 -1
- package/build/client/assets/{dialog-DnpUg3VT.js → dialog-CzO65Z5w.js} +3 -3
- package/build/client/assets/{dialog-DnpUg3VT.js.map → dialog-CzO65Z5w.js.map} +1 -1
- package/build/client/assets/{diff-CxEbhF8Q.js → diff-BhWzqoVN.js} +2 -2
- package/build/client/assets/{diff-CxEbhF8Q.js.map → diff-BhWzqoVN.js.map} +1 -1
- package/build/client/assets/{diff-eAvgXb3f.js → diff-DC-wn6-x.js} +2 -2
- package/build/client/assets/{diff-eAvgXb3f.js.map → diff-DC-wn6-x.js.map} +1 -1
- package/build/client/assets/{discord-DlU9y5Iz.js → discord-BJkw0IrB.js} +2 -2
- package/build/client/assets/{discord-DlU9y5Iz.js.map → discord-BJkw0IrB.js.map} +1 -1
- package/build/client/assets/{discord-CuxZiU8E.js → discord-r3m19sUM.js} +2 -2
- package/build/client/assets/discord-r3m19sUM.js.map +1 -0
- package/build/client/assets/{epic-video-Bx8Ctiez.js → epic-video-8Hv_HMMr.js} +2 -2
- package/build/client/assets/{epic-video-Bx8Ctiez.js.map → epic-video-8Hv_HMMr.js.map} +1 -1
- package/build/client/assets/{epic-video-BVcJzJzi.js → epic-video-D0drHmgC.js} +2 -2
- package/build/client/assets/{epic-video-BVcJzJzi.js.map → epic-video-D0drHmgC.js.map} +1 -1
- package/build/client/assets/{erDiagram-Q2GNP2WA-CW73Zw0q.js → erDiagram-Q2GNP2WA-CBRWzQzK.js} +2 -2
- package/build/client/assets/{erDiagram-Q2GNP2WA-CW73Zw0q.js.map → erDiagram-Q2GNP2WA-CBRWzQzK.js.map} +1 -1
- package/build/client/assets/{error-boundary-DFBd6s0g.js → error-boundary-DVp6wKiz.js} +2 -2
- package/build/client/assets/{error-boundary-DFBd6s0g.js.map → error-boundary-DVp6wKiz.js.map} +1 -1
- package/build/client/assets/{finished-CmV4aFjA.js → finished-CiVHAeSV.js} +2 -2
- package/build/client/assets/{finished-CmV4aFjA.js.map → finished-CiVHAeSV.js.map} +1 -1
- package/build/client/assets/{flowDiagram-NV44I4VS-BbxV9VQf.js → flowDiagram-NV44I4VS-L32__tfK.js} +2 -2
- package/build/client/assets/{flowDiagram-NV44I4VS-BbxV9VQf.js.map → flowDiagram-NV44I4VS-L32__tfK.js.map} +1 -1
- package/build/client/assets/{ganttDiagram-JELNMOA3-CRBJBlE5.js → ganttDiagram-JELNMOA3-Dpp5PKJc.js} +2 -2
- package/build/client/assets/{ganttDiagram-JELNMOA3-CRBJBlE5.js.map → ganttDiagram-JELNMOA3-Dpp5PKJc.js.map} +1 -1
- package/build/client/assets/{gitGraphDiagram-NY62KEGX-CU0X3hfs.js → gitGraphDiagram-NY62KEGX-zn4IXANG.js} +2 -2
- package/build/client/assets/{gitGraphDiagram-NY62KEGX-CU0X3hfs.js.map → gitGraphDiagram-NY62KEGX-zn4IXANG.js.map} +1 -1
- package/build/client/assets/{graph-CEUh1UxC.js → graph-Da5nhwRG.js} +2 -2
- package/build/client/assets/{graph-CEUh1UxC.js.map → graph-Da5nhwRG.js.map} +1 -1
- package/build/client/assets/guide-Cinib8Ji.js +9 -0
- package/build/client/assets/guide-Cinib8Ji.js.map +1 -0
- package/build/client/assets/{index-D3zOGeBE.js → index-BKAVQvm5.js} +2 -2
- package/build/client/assets/{index-D3zOGeBE.js.map → index-BKAVQvm5.js.map} +1 -1
- package/build/client/assets/{index-BOhw3wcM.js → index-CJDOQ1bl.js} +2 -2
- package/build/client/assets/{index-BOhw3wcM.js.map → index-CJDOQ1bl.js.map} +1 -1
- package/build/client/assets/{index-B-9GR1C2.js → index-C_wcF1aP.js} +2 -2
- package/build/client/assets/{index-B-9GR1C2.js.map → index-C_wcF1aP.js.map} +1 -1
- package/build/client/assets/{index-BW8stNyh.js → index-CdzVFL-Z.js} +3 -3
- package/build/client/assets/{index-BW8stNyh.js.map → index-CdzVFL-Z.js.map} +1 -1
- package/build/client/assets/index-CmflCPTU.js +2 -0
- package/build/client/assets/index-CmflCPTU.js.map +1 -0
- package/build/client/assets/index-DuFMeXSm.js +2 -0
- package/build/client/assets/index-DuFMeXSm.js.map +1 -0
- package/build/client/assets/index-hhQHCvb9.js +2 -0
- package/build/client/assets/{index-EdNV8gTk.js.map → index-hhQHCvb9.js.map} +1 -1
- package/build/client/assets/{index-C_KjwKVt.js → index-ynYvVAOK.js} +2 -2
- package/build/client/assets/{index-C_KjwKVt.js.map → index-ynYvVAOK.js.map} +1 -1
- package/build/client/assets/{infoDiagram-WHAUD3N6-BplcSre1.js → infoDiagram-WHAUD3N6-CToPP1ur.js} +2 -2
- package/build/client/assets/{infoDiagram-WHAUD3N6-BplcSre1.js.map → infoDiagram-WHAUD3N6-CToPP1ur.js.map} +1 -1
- package/build/client/assets/{journeyDiagram-XKPGCS4Q-yxvCkf49.js → journeyDiagram-XKPGCS4Q-BBRpqEuF.js} +2 -2
- package/build/client/assets/{journeyDiagram-XKPGCS4Q-yxvCkf49.js.map → journeyDiagram-XKPGCS4Q-BBRpqEuF.js.map} +1 -1
- package/build/client/assets/{kanban-definition-3W4ZIXB7-DFEBMrRH.js → kanban-definition-3W4ZIXB7-CyGlZ-MK.js} +2 -2
- package/build/client/assets/{kanban-definition-3W4ZIXB7-DFEBMrRH.js.map → kanban-definition-3W4ZIXB7-CyGlZ-MK.js.map} +1 -1
- package/build/client/assets/{launch-editor-B2dmpkaO.js → launch-editor-D2exGfVu.js} +2 -2
- package/build/client/assets/{launch-editor-B2dmpkaO.js.map → launch-editor-D2exGfVu.js.map} +1 -1
- package/build/client/assets/{layout-CiHrgFnf.js → layout-CUEelucj.js} +2 -2
- package/build/client/assets/{layout-CiHrgFnf.js.map → layout-CUEelucj.js.map} +1 -1
- package/build/client/assets/{linear-C-81cvJP.js → linear-DzZ9bjHs.js} +2 -2
- package/build/client/assets/{linear-C-81cvJP.js.map → linear-DzZ9bjHs.js.map} +1 -1
- package/build/client/assets/{loading-CUydCGD3.js → loading-CDNzW5oO.js} +2 -2
- package/build/client/assets/{loading-CUydCGD3.js.map → loading-CDNzW5oO.js.map} +1 -1
- package/build/client/assets/{login-DvBmP_ce.js → login-mWjVXGbJ.js} +2 -2
- package/build/client/assets/{login-DvBmP_ce.js.map → login-mWjVXGbJ.js.map} +1 -1
- package/build/client/assets/manifest-970c9ad1.js +1 -0
- package/build/client/assets/{mdx-vrch0szL.js → mdx-BzyhMqFg.js} +3 -3
- package/build/client/assets/{mdx-vrch0szL.js.map → mdx-BzyhMqFg.js.map} +1 -1
- package/build/client/assets/{mermaid.core-D3y7PO8B.js → mermaid.core-BdxLLjl2.js} +5 -5
- package/build/client/assets/{mermaid.core-D3y7PO8B.js.map → mermaid.core-BdxLLjl2.js.map} +1 -1
- package/build/client/assets/{mindmap-definition-VGOIOE7T-VMZ6ZZlW.js → mindmap-definition-VGOIOE7T-DeKD8ncg.js} +2 -2
- package/build/client/assets/{mindmap-definition-VGOIOE7T-VMZ6ZZlW.js.map → mindmap-definition-VGOIOE7T-DeKD8ncg.js.map} +1 -1
- package/build/client/assets/{misc-DVYuZMjW.js → misc-W4055b-0.js} +2 -2
- package/build/client/assets/{misc-DVYuZMjW.js.map → misc-W4055b-0.js.map} +1 -1
- package/build/client/assets/{nav-chevrons-DlNUibJV.js → nav-chevrons-Dk4GtZwQ.js} +2 -2
- package/build/client/assets/{nav-chevrons-DlNUibJV.js.map → nav-chevrons-Dk4GtZwQ.js.map} +1 -1
- package/build/client/assets/{offline-videos-Do9PBh87.js → offline-videos-BP7_xJkO.js} +2 -2
- package/build/client/assets/{offline-videos-Do9PBh87.js.map → offline-videos-BP7_xJkO.js.map} +1 -1
- package/build/client/assets/{onboarding-indicator-CVwXz3Cn.js → onboarding-indicator-B-XR90_G.js} +2 -2
- package/build/client/assets/{onboarding-indicator-CVwXz3Cn.js.map → onboarding-indicator-B-XR90_G.js.map} +1 -1
- package/build/client/assets/{pieDiagram-ADFJNKIX-CKbrBdQs.js → pieDiagram-ADFJNKIX-BQ4sFDrB.js} +2 -2
- package/build/client/assets/{pieDiagram-ADFJNKIX-CKbrBdQs.js.map → pieDiagram-ADFJNKIX-BQ4sFDrB.js.map} +1 -1
- package/build/client/assets/playground-DmEAkxG1.js +2 -0
- package/build/client/assets/playground-DmEAkxG1.js.map +1 -0
- package/build/client/assets/{playground-window-D9a7P7rH.js → playground-window-x2mQ5o1O.js} +2 -2
- package/build/client/assets/{playground-window-D9a7P7rH.js.map → playground-window-x2mQ5o1O.js.map} +1 -1
- package/build/client/assets/{preferences-BCvK10k2.js → preferences-D6HQ5bK1.js} +2 -2
- package/build/client/assets/{preferences-BCvK10k2.js.map → preferences-D6HQ5bK1.js.map} +1 -1
- package/build/client/assets/{preview-CiDtuQCc.js → preview-fhmjENlm.js} +2 -2
- package/build/client/assets/{preview-CiDtuQCc.js.map → preview-fhmjENlm.js.map} +1 -1
- package/build/client/assets/{product-GLsnY1u3.js → product-CvyMpYD_.js} +2 -2
- package/build/client/assets/{product-GLsnY1u3.js.map → product-CvyMpYD_.js.map} +1 -1
- package/build/client/assets/{progress-fKsNxmmt.js → progress-ILaVQtOO.js} +2 -2
- package/build/client/assets/{progress-fKsNxmmt.js.map → progress-ILaVQtOO.js.map} +1 -1
- package/build/client/assets/{progress-bar-B27isaGl.js → progress-bar-DpWhcyhC.js} +2 -2
- package/build/client/assets/{progress-bar-B27isaGl.js.map → progress-bar-DpWhcyhC.js.map} +1 -1
- package/build/client/assets/{quadrantDiagram-AYHSOK5B-Bb5EtkPw.js → quadrantDiagram-AYHSOK5B-QnjodHfi.js} +2 -2
- package/build/client/assets/{quadrantDiagram-AYHSOK5B-Bb5EtkPw.js.map → quadrantDiagram-AYHSOK5B-QnjodHfi.js.map} +1 -1
- package/build/client/assets/{requirementDiagram-UZGBJVZJ-BNsXiFG2.js → requirementDiagram-UZGBJVZJ-mL9Oeda0.js} +2 -2
- package/build/client/assets/{requirementDiagram-UZGBJVZJ-BNsXiFG2.js.map → requirementDiagram-UZGBJVZJ-mL9Oeda0.js.map} +1 -1
- package/build/client/assets/{root-Ch373D3a.js → root-Bktp3RtN.js} +2 -2
- package/build/client/assets/{root-Ch373D3a.js.map → root-Bktp3RtN.js.map} +1 -1
- package/build/client/assets/{sankeyDiagram-TZEHDZUN-qlPqhk7P.js → sankeyDiagram-TZEHDZUN-B8_zpQVR.js} +2 -2
- package/build/client/assets/{sankeyDiagram-TZEHDZUN-qlPqhk7P.js.map → sankeyDiagram-TZEHDZUN-B8_zpQVR.js.map} +1 -1
- package/build/client/assets/{sequenceDiagram-WL72ISMW-C3d31B7K.js → sequenceDiagram-WL72ISMW-BDd5tjuk.js} +2 -2
- package/build/client/assets/{sequenceDiagram-WL72ISMW-C3d31B7K.js.map → sequenceDiagram-WL72ISMW-BDd5tjuk.js.map} +1 -1
- package/build/client/assets/{set-playground-DeMY9i7p.js → set-playground-BSGwH9dH.js} +2 -2
- package/build/client/assets/{set-playground-DeMY9i7p.js.map → set-playground-BSGwH9dH.js.map} +1 -1
- package/build/client/assets/{stateDiagram-FKZM4ZOC-C1eIQm_7.js → stateDiagram-FKZM4ZOC-DGPNpRbW.js} +2 -2
- package/build/client/assets/{stateDiagram-FKZM4ZOC-C1eIQm_7.js.map → stateDiagram-FKZM4ZOC-DGPNpRbW.js.map} +1 -1
- package/build/client/assets/stateDiagram-v2-4FDKWEC3-DxaFuKxL.js +2 -0
- package/build/client/assets/{stateDiagram-v2-4FDKWEC3-CAmcrDIS.js.map → stateDiagram-v2-4FDKWEC3-DxaFuKxL.js.map} +1 -1
- package/build/client/assets/status-indicator-C6DiLYL5.js +2 -0
- package/build/client/assets/status-indicator-C6DiLYL5.js.map +1 -0
- package/build/client/assets/tailwind-B97VvnKU.css +1 -0
- package/build/client/assets/test-DtQCjBBX.js +2 -0
- package/build/client/assets/{test-CdEKoDoS.js.map → test-DtQCjBBX.js.map} +1 -1
- package/build/client/assets/{tests-xD9PppmM.js → tests-fDISNsE-.js} +2 -2
- package/build/client/assets/{tests-xD9PppmM.js.map → tests-fDISNsE-.js.map} +1 -1
- package/build/client/assets/{timeline-definition-IT6M3QCI-Di_ZGPjO.js → timeline-definition-IT6M3QCI-BnMOh0dz.js} +2 -2
- package/build/client/assets/{timeline-definition-IT6M3QCI-Di_ZGPjO.js.map → timeline-definition-IT6M3QCI-BnMOh0dz.js.map} +1 -1
- package/build/client/assets/{tooltip-Chzzs4KB.js → tooltip-Tlsyx2YO.js} +2 -2
- package/build/client/assets/{tooltip-Chzzs4KB.js.map → tooltip-Tlsyx2YO.js.map} +1 -1
- package/build/client/assets/{treemap-KMMF4GRG-DZrMUxqR.js → treemap-KMMF4GRG-Ds3XkDP-.js} +2 -2
- package/build/client/assets/{treemap-KMMF4GRG-DZrMUxqR.js.map → treemap-KMMF4GRG-Ds3XkDP-.js.map} +1 -1
- package/build/client/assets/{workspace-structure-i_5Tiikk.js → workspace-structure-B6Rpl-B2.js} +2 -2
- package/build/client/assets/{workspace-structure-i_5Tiikk.js.map → workspace-structure-B6Rpl-B2.js.map} +1 -1
- package/build/client/assets/{xychartDiagram-PRI3JC2R-BxuKJVc7.js → xychartDiagram-PRI3JC2R-DH_JPNZp.js} +2 -2
- package/build/client/assets/{xychartDiagram-PRI3JC2R-BxuKJVc7.js.map → xychartDiagram-PRI3JC2R-DH_JPNZp.js.map} +1 -1
- package/build/server/index.js +690 -114
- package/build/server/index.js.map +1 -1
- package/package.json +3 -3
- package/build/client/assets/_exerciseNumber_.finished-CGoPhVVF.js.map +0 -1
- package/build/client/assets/_extra-BZPB_nWQ.js +0 -2
- package/build/client/assets/_extra-BZPB_nWQ.js.map +0 -1
- package/build/client/assets/_layout-BxQPZuW6.js +0 -2
- package/build/client/assets/_layout-BxQPZuW6.js.map +0 -1
- package/build/client/assets/_layout-yxOoJ6Yg.js +0 -2
- package/build/client/assets/_layout-yxOoJ6Yg.js.map +0 -1
- package/build/client/assets/app-TcFAQB2o.js +0 -2
- package/build/client/assets/channel-BLJkdd1O.js +0 -2
- package/build/client/assets/classDiagram-2ON5EDUG-_kfNpv_f.js +0 -2
- package/build/client/assets/classDiagram-v2-WZHVMYZB-_kfNpv_f.js +0 -2
- package/build/client/assets/clone-CztDUJhf.js +0 -2
- package/build/client/assets/discord-CuxZiU8E.js.map +0 -1
- package/build/client/assets/guide-B4wAqzq_.js +0 -9
- package/build/client/assets/guide-B4wAqzq_.js.map +0 -1
- package/build/client/assets/index-C6vQqVxz.js +0 -2
- package/build/client/assets/index-C6vQqVxz.js.map +0 -1
- package/build/client/assets/index-EdNV8gTk.js +0 -2
- package/build/client/assets/manifest-34df6718.js +0 -1
- package/build/client/assets/playground-C_aP_pE8.js +0 -2
- package/build/client/assets/playground-C_aP_pE8.js.map +0 -1
- package/build/client/assets/stateDiagram-v2-4FDKWEC3-CAmcrDIS.js +0 -2
- package/build/client/assets/tailwind-D_K12wB7.css +0 -1
- package/build/client/assets/test-CdEKoDoS.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_layout-BQ8VYaze.js","sources":["../../../../../node_modules/framer-motion/dist/es/animation/hooks/animation-controls.mjs","../../../../../node_modules/framer-motion/dist/es/animation/hooks/use-animation.mjs","../../../app/components/media-query.ts","../../../app/components/ui/popover.tsx","../../../app/routes/_app+/_layout.tsx"],"sourcesContent":["import { animateVisualElement, setTarget } from 'motion-dom';\nimport { invariant } from 'motion-utils';\n\nfunction stopAnimation(visualElement) {\n visualElement.values.forEach((value) => value.stop());\n}\nfunction setVariants(visualElement, variantLabels) {\n const reversedLabels = [...variantLabels].reverse();\n reversedLabels.forEach((key) => {\n const variant = visualElement.getVariant(key);\n variant && setTarget(visualElement, variant);\n if (visualElement.variantChildren) {\n visualElement.variantChildren.forEach((child) => {\n setVariants(child, variantLabels);\n });\n }\n });\n}\nfunction setValues(visualElement, definition) {\n if (Array.isArray(definition)) {\n return setVariants(visualElement, definition);\n }\n else if (typeof definition === \"string\") {\n return setVariants(visualElement, [definition]);\n }\n else {\n setTarget(visualElement, definition);\n }\n}\n/**\n * @public\n */\nfunction animationControls() {\n /**\n * Track whether the host component has mounted.\n */\n let hasMounted = false;\n /**\n * A collection of linked component animation controls.\n */\n const subscribers = new Set();\n const controls = {\n subscribe(visualElement) {\n subscribers.add(visualElement);\n return () => void subscribers.delete(visualElement);\n },\n start(definition, transitionOverride) {\n invariant(hasMounted, \"controls.start() should only be called after a component has mounted. Consider calling within a useEffect hook.\");\n const animations = [];\n subscribers.forEach((visualElement) => {\n animations.push(animateVisualElement(visualElement, definition, {\n transitionOverride,\n }));\n });\n return Promise.all(animations);\n },\n set(definition) {\n invariant(hasMounted, \"controls.set() should only be called after a component has mounted. Consider calling within a useEffect hook.\");\n return subscribers.forEach((visualElement) => {\n setValues(visualElement, definition);\n });\n },\n stop() {\n subscribers.forEach((visualElement) => {\n stopAnimation(visualElement);\n });\n },\n mount() {\n hasMounted = true;\n return () => {\n hasMounted = false;\n controls.stop();\n };\n },\n };\n return controls;\n}\n\nexport { animationControls, setValues };\n//# sourceMappingURL=animation-controls.mjs.map\n","\"use client\";\nimport { useConstant } from '../../utils/use-constant.mjs';\nimport { useIsomorphicLayoutEffect } from '../../utils/use-isomorphic-effect.mjs';\nimport { animationControls } from './animation-controls.mjs';\n\n/**\n * Creates `LegacyAnimationControls`, which can be used to manually start, stop\n * and sequence animations on one or more components.\n *\n * The returned `LegacyAnimationControls` should be passed to the `animate` property\n * of the components you want to animate.\n *\n * These components can then be animated with the `start` method.\n *\n * ```jsx\n * import * as React from 'react'\n * import { motion, useAnimation } from 'framer-motion'\n *\n * export function MyComponent(props) {\n * const controls = useAnimation()\n *\n * controls.start({\n * x: 100,\n * transition: { duration: 0.5 },\n * })\n *\n * return <motion.div animate={controls} />\n * }\n * ```\n *\n * @returns Animation controller with `start` and `stop` methods\n *\n * @public\n */\nfunction useAnimationControls() {\n const controls = useConstant(animationControls);\n useIsomorphicLayoutEffect(controls.mount, []);\n return controls;\n}\nconst useAnimation = useAnimationControls;\n\nexport { useAnimation, useAnimationControls };\n//# sourceMappingURL=use-animation.mjs.map\n","import { useSyncExternalStore } from 'react'\n\nexport function makeMediaQueryStore(\n\tmediaQuery: string,\n\tserverSnapshot: boolean,\n) {\n\tfunction getSnapshot() {\n\t\treturn window.matchMedia(mediaQuery).matches\n\t}\n\n\tfunction subscribe(callback: () => void) {\n\t\tconst mediaQueryList = window.matchMedia(mediaQuery)\n\t\tmediaQueryList.addEventListener('change', callback)\n\t\treturn () => {\n\t\t\tmediaQueryList.removeEventListener('change', callback)\n\t\t}\n\t}\n\n\treturn function useMediaQuery() {\n\t\treturn useSyncExternalStore(subscribe, getSnapshot, () => serverSnapshot)\n\t}\n}\n","import * as PopoverPrimitive from '@radix-ui/react-popover'\nimport * as React from 'react'\nimport { cn } from '#app/utils/misc.tsx'\n\nfunction Popover({\n\t...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n\treturn <PopoverPrimitive.Root {...props} />\n}\n\nfunction PopoverTrigger({\n\t...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n\treturn <PopoverPrimitive.Trigger {...props} />\n}\n\nfunction PopoverContent({\n\tclassName,\n\talign = 'center',\n\tsideOffset = 4,\n\t...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n\treturn (\n\t\t<PopoverPrimitive.Portal>\n\t\t\t<PopoverPrimitive.Content\n\t\t\t\talign={align}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 rounded-md border p-2 shadow-md outline-none',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</PopoverPrimitive.Portal>\n\t)\n}\n\nexport { Popover, PopoverContent, PopoverTrigger }\n","import {\n\textractNumbersAndTypeFromAppNameOrPath,\n\tgetApps,\n\tgetExercises,\n\tgetPlaygroundAppName,\n\tisExtraApp,\n} from '@epic-web/workshop-utils/apps.server'\nimport { getWorkshopConfig } from '@epic-web/workshop-utils/config.server'\nimport { getProcesses } from '@epic-web/workshop-utils/process-manager.server'\nimport {\n\tcombineServerTimings,\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport { clsx } from 'clsx'\nimport { motion, useAnimationControls } from 'framer-motion'\nimport * as React from 'react'\nimport {\n\tLink,\n\tNavLink,\n\tOutlet,\n\tuseLoaderData,\n\tuseLocation,\n\tuseParams,\n\tdata,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n} from 'react-router'\nimport { useHydrated } from 'remix-utils/use-hydrated'\nimport { Icon } from '#app/components/icons.tsx'\nimport { makeMediaQueryStore } from '#app/components/media-query.ts'\nimport {\n\tOnboardingBadge,\n\tuseOnboardingIndicator,\n} from '#app/components/onboarding-indicator.tsx'\nimport { Logo } from '#app/components/product.tsx'\nimport { useRevalidationWS } from '#app/components/revalidation-ws.tsx'\nimport { StatusIndicator } from '#app/components/status-indicator.tsx'\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogHeader,\n\tDialogTrigger,\n} from '#app/components/ui/dialog.tsx'\nimport {\n\tPopover,\n\tPopoverContent,\n\tPopoverTrigger,\n} from '#app/components/ui/popover.tsx'\nimport {\n\tSimpleTooltip,\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from '#app/components/ui/tooltip.tsx'\nimport { useOptionalUser, useUserHasAccess } from '#app/components/user.tsx'\nimport { useWorkshopConfig } from '#app/components/workshop-config.tsx'\nimport { cn, getExercisePath, getExerciseStepPath } from '#app/utils/misc.tsx'\nimport { useIsOnline } from '#app/utils/online.ts'\nimport {\n\tgetProductHostEmoji,\n\tproductHostEmojis,\n\tusePresence,\n\ttype Location,\n\ttype User,\n} from '#app/utils/presence.tsx'\nimport { useRequestInfo, useApps } from '#app/utils/root-loader.ts'\nimport {\n\tuseExerciseProgressClassName,\n\tuseNextExerciseRoute,\n\tuseProgressItemClassName,\n\tuseRandomCompletedExerciseRoute,\n\ttype ProgressItemSearch,\n} from '../progress.tsx'\nimport { ThemeSwitch, useTheme } from '../theme/index.tsx'\n\nfunction getSidecarStatus() {\n\tconst { sidecarProcesses } = getProcesses()\n\tif (sidecarProcesses.size === 0) return null\n\n\tconst processes = Array.from(sidecarProcesses.entries()).map(\n\t\t([name, { process }]) => ({\n\t\t\tname,\n\t\t\trunning: process.exitCode === null,\n\t\t}),\n\t)\n\n\tconst hasFailure = processes.some((p) => !p.running)\n\tconst failureCount = processes.filter((p) => !p.running).length\n\treturn { processes, hasFailure, count: processes.length, failureCount }\n}\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('appLayoutLoader')\n\tconst { title: workshopTitle } = getWorkshopConfig()\n\tconst [exercises, playgroundAppName, apps] = await Promise.all([\n\t\tgetExercises({ request, timings }),\n\t\tgetPlaygroundAppName(),\n\t\tgetApps({ request, timings }),\n\t])\n\n\tconst playgroundNumbersAndType = extractNumbersAndTypeFromAppNameOrPath(\n\t\tplaygroundAppName ?? '',\n\t)\n\tconst playground = {\n\t\tappName: playgroundAppName,\n\t\texerciseNumber: Number(playgroundNumbersAndType?.exerciseNumber),\n\t\tstepNumber: Number(playgroundNumbersAndType?.stepNumber),\n\t\ttype: playgroundNumbersAndType?.type,\n\t}\n\n\tconst sidecarStatus = getSidecarStatus()\n\n\tconst result = data(\n\t\t{\n\t\t\tworkshopTitle,\n\t\t\texercises: exercises.map((e) => ({\n\t\t\t\texerciseNumber: e.exerciseNumber,\n\t\t\t\ttitle: e.title,\n\t\t\t\tsolutions: e.solutions.map(({ stepNumber, title, name }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle,\n\t\t\t\t\tname,\n\t\t\t\t})),\n\t\t\t\tproblems: e.problems.map(({ stepNumber, title, name }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle,\n\t\t\t\t\tname,\n\t\t\t\t})),\n\t\t\t\tsteps: e.steps.map(({ stepNumber, problem, solution }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle: problem?.title ?? solution?.title ?? 'Unknown',\n\t\t\t\t\tname: problem?.name ?? solution?.name ?? 'Unknown',\n\t\t\t\t\tproblem: problem\n\t\t\t\t\t\t? { name: problem.name, title: problem.title }\n\t\t\t\t\t\t: null,\n\t\t\t\t\tsolution: solution\n\t\t\t\t\t\t? { name: solution.name, title: solution.title }\n\t\t\t\t\t\t: null,\n\t\t\t\t})),\n\t\t\t})),\n\t\t\textras: apps\n\t\t\t\t.filter(isExtraApp)\n\t\t\t\t.sort((a, b) =>\n\t\t\t\t\ta.title.localeCompare(b.title, undefined, {\n\t\t\t\t\t\tnumeric: true,\n\t\t\t\t\t\tsensitivity: 'base',\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.map((extra) => ({\n\t\t\t\t\tdirName: extra.dirName,\n\t\t\t\t\ttitle: extra.title,\n\t\t\t\t\tname: extra.name,\n\t\t\t\t})),\n\t\t\tplayground,\n\t\t\tisMenuOpened:\n\t\t\t\trequest.headers.get('cookie')?.includes('es_menu_open=true') ?? false,\n\t\t\tsidecarStatus,\n\t\t},\n\t\t{\n\t\t\theaders: {\n\t\t\t\tVary: 'Cookie',\n\t\t\t\t'Server-Timing': getServerTimeHeader(timings),\n\t\t\t},\n\t\t},\n\t)\n\treturn result\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders, parentHeaders }) => {\n\tconst headers = {\n\t\t'Cache-Control': loaderHeaders.get('Cache-Control') ?? '',\n\t\tVary: 'Cookie',\n\t\t'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nconst opacities = ['opacity-70', 'opacity-80', 'opacity-90', 'opacity-100']\nconst shadows = [\n\t'shadow-[0_0_2px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_4px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_7px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_10px_0_rgba(0,0,0,0.3)]',\n]\nfunction getScoreClassNames(score: number) {\n\tconst opacityNumber = Math.round(score * opacities.length - 1)\n\tconst shadowNumber = Math.round(score * shadows.length - 1)\n\treturn cn(\n\t\t'shadow-highlight hover:opacity-100 focus:opacity-100',\n\t\topacities[opacityNumber] ?? 'opacity-60',\n\t\tshadows[shadowNumber] ?? 'shadow-none',\n\t\tscore === 1 ? 'animate-pulse hover:animate-none focus:animate-none' : null,\n\t)\n}\n\nfunction FacePile({ isMenuOpened }: { isMenuOpened: boolean }) {\n\tconst loggedInUser = useOptionalUser()\n\tconst { users } = usePresence()\n\tconst {\n\t\tproduct: { displayNameShort },\n\t} = useWorkshopConfig()\n\tconst limit = isMenuOpened ? 17 : 0\n\tconst numberOverLimit = users.length - limit\n\tconst shouldShowNumberOverLimit = numberOverLimit > (isMenuOpened ? 1 : 0)\n\n\tif (!users.length) return null\n\n\tconst tiffany =\n\t\tisMenuOpened && users.length === 1 ? (\n\t\t\t<Link\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\tto=\"https://www.youtube.com/watch?v=w6Q3mHyzn78\"\n\t\t\t>\n\t\t\t\t<img\n\t\t\t\t\talt=\"Tiffany Tunes\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'h-8 w-8 rounded-full border object-cover',\n\t\t\t\t\t\tgetScoreClassNames(1),\n\t\t\t\t\t)}\n\t\t\t\t\tsrc=\"/img/tiffany.png\"\n\t\t\t\t/>\n\t\t\t</Link>\n\t\t) : null\n\tconst overLimitLabel = `${numberOverLimit}${\n\t\tisMenuOpened ? ' more ' : ' '\n\t}${displayNameShort} Dev${numberOverLimit === 1 ? '' : 's'} working now`\n\treturn (\n\t\t<div className=\"flex flex-wrap items-center gap-2\">\n\t\t\t<TooltipProvider>\n\t\t\t\t{(shouldShowNumberOverLimit ? users.slice(0, limit) : users).map(\n\t\t\t\t\t({ user, score }) => {\n\t\t\t\t\t\tconst scoreClassNames = getScoreClassNames(score)\n\t\t\t\t\t\tconst locations = getUserLocations(user)\n\t\t\t\t\t\tconst imageUrl = user.imageUrlSmall || user.avatarUrl\n\t\t\t\t\t\tconst hasAccess = user.hasAccess\n\t\t\t\t\t\tconst local = locations.some((loc) =>\n\t\t\t\t\t\t\tloc.origin?.includes('localhost'),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst productHostEmojis = getUniqueProductHostEmojis(locations)\n\t\t\t\t\t\tconst loggedInEmojis = getLoggedInProductEmojis(\n\t\t\t\t\t\t\tuser.loggedInProductHosts,\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\t// Handle opted-out users\n\t\t\t\t\t\tif (user.optOut) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Tooltip key={user.id}>\n\t\t\t\t\t\t\t\t\t<TooltipTrigger asChild tabIndex={0}>\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"relative\"\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Anonymous user (opted out)\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-muted flex h-8 w-8 items-center justify-center rounded-full border opacity-50',\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<Icon name=\"User\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t\t\t\t<span className=\"flex flex-col items-center justify-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-1.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t{loggedInEmojis ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs\">{loggedInEmojis}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t\tAnonymous (opted out of sharing)\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet doingLabel: string\n\t\t\t\t\t\tif (hasAccess) {\n\t\t\t\t\t\t\tdoingLabel = local ? 'working' : 'referencing'\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdoingLabel = local ? 'previewing' : 'reviewing'\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Tooltip key={user.id}>\n\t\t\t\t\t\t\t\t<TooltipTrigger asChild tabIndex={0}>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName=\"relative\"\n\t\t\t\t\t\t\t\t\t\taria-label={user.name || `${displayNameShort} Dev`}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{imageUrl ? (\n\t\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\t\talt={user.name || displayNameShort}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'h-8 w-8 rounded-full border object-cover',\n\t\t\t\t\t\t\t\t\t\t\t\t\tscoreClassNames,\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\tsrc={imageUrl}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'flex h-8 w-8 items-center justify-center rounded-full border',\n\t\t\t\t\t\t\t\t\t\t\t\t\tscoreClassNames,\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<Icon name=\"User\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{productHostEmojis ? (\n\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"absolute -top-1 -left-1 text-xs leading-none\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Workshop products\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{productHostEmojis}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t\t\t<span className=\"flex flex-col items-center justify-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-1.5\">\n\t\t\t\t\t\t\t\t\t\t\t{loggedInEmojis ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs\">{loggedInEmojis}</span>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t{user.name || `${displayNameShort} Dev`}\n\t\t\t\t\t\t\t\t\t\t\t{locations.length > 0\n\t\t\t\t\t\t\t\t\t\t\t\t? ` is ${doingLabel} ${\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tscore === 1 && loggedInUser?.id !== user.id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'with you'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t\t\t\t\t\t\t\t} on`\n\t\t\t\t\t\t\t\t\t\t\t\t: null}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t{locations.map((loc, index) => {\n\t\t\t\t\t\t\t\t\t\t\tconst locationLabel = getLocationLabel(loc)\n\t\t\t\t\t\t\t\t\t\t\tif (!locationLabel) return null\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={`${loc.workshopTitle}-${index}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'flex flex-col items-center',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlocations.length > 1\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'border-border mt-1 border-t pt-1 first:mt-0 first:border-t-0 first:pt-0'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: '',\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{locationLabel.line1 ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{getProductHostEmoji(loc.productHost)}{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{locationLabel.line1}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{locationLabel.line2 ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground text-xs\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{locationLabel.line2}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t)}\n\t\t\t\t{tiffany}\n\t\t\t\t{shouldShowNumberOverLimit ? (\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild tabIndex={0}>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\taria-label={overLimitLabel}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'bg-accent text-accent-foreground flex items-center justify-center rounded-full border text-xs',\n\t\t\t\t\t\t\t\t\tisMenuOpened ? 'h-8 w-8' : 'h-6 w-6',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'pointer-events-none truncate text-center',\n\t\t\t\t\t\t\t\t\t\tisMenuOpened ? 'w-8' : 'w-6',\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{isMenuOpened ? `+${numberOverLimit}` : numberOverLimit}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>{overLimitLabel}</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t) : null}\n\t\t\t</TooltipProvider>\n\t\t</div>\n\t)\n}\n\nfunction getLoggedInProductEmojis(\n\thosts: string[] | null | undefined,\n): string | null {\n\tif (!hosts || hosts.length === 0) return null\n\treturn hosts\n\t\t.map((host) => productHostEmojis[host])\n\t\t.filter(Boolean)\n\t\t.join(' ')\n}\n\nfunction getUserLocations(user: User): Location[] {\n\tif (user.locations && user.locations.length > 0) {\n\t\treturn user.locations.filter(Boolean) as Location[]\n\t}\n\tif (user.location) {\n\t\treturn [user.location]\n\t}\n\treturn []\n}\n\nfunction getUniqueProductHostEmojis(locations: Location[]): string | null {\n\tconst uniqueHosts = new Set<string>()\n\tfor (const loc of locations) {\n\t\tif (loc.productHost) {\n\t\t\tuniqueHosts.add(loc.productHost)\n\t\t}\n\t}\n\tif (uniqueHosts.size === 0) return null\n\treturn Array.from(uniqueHosts)\n\t\t.map((host) => getProductHostEmoji(host))\n\t\t.filter(Boolean)\n\t\t.join('')\n}\n\nfunction hasExtras(apps: Array<{ relativePath: string }>) {\n\treturn apps.some((app) => {\n\t\tconst rootDir = app.relativePath.split(/[\\\\/]/)[0]\n\t\treturn (\n\t\t\trootDir === 'extra' || rootDir === 'example' || rootDir === 'examples'\n\t\t)\n\t})\n}\n\nconst useIsWide = makeMediaQueryStore('(min-width: 640px)', true)\n\nexport default function App() {\n\tconst data = useLoaderData<typeof loader>()\n\tconst user = useOptionalUser()\n\tconst isWide = useIsWide()\n\tconst isHydrated = useHydrated()\n\n\tconst [isMenuOpened, setMenuOpenedState] = React.useState(data.isMenuOpened)\n\tuseRevalidationWS({\n\t\twatchPaths: [\n\t\t\t'./exercises/README.mdx',\n\t\t\t'./extra',\n\t\t\t'./example',\n\t\t\t'./examples',\n\t\t],\n\t})\n\n\tfunction setMenuOpened(value: boolean) {\n\t\tsetMenuOpenedState(value)\n\t\tdocument.cookie = `es_menu_open=${value.toString()}; path=/; SameSite=Lax;`\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col\">\n\t\t\t{user ? null : <NoUserBanner />}\n\t\t\t{/*\n\t\t\t\tthis isn't placed in a conditional with isWide because the server render\n\t\t\t\tdoesn't know whether it should be around or not so we just use CSS to hide it\n\t\t\t\tif it's not supposed to show up.\n\n\t\t\t\tWe don't just use media queries for the wider screen nav because we want\n\t\t\t\tto avoid running all the logic in there unnecessarily.\n\t\t\t*/}\n\t\t\t{isHydrated && isWide ? null : (\n\t\t\t\t<MobileNavigation\n\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\tonMenuOpenChange={setMenuOpened}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<div\n\t\t\t\t// this nonsense is here because we want the panels to be scrollable rather\n\t\t\t\t// than having the entire page be scrollable (at least on wider screens)\n\t\t\t\tclassName={cn('flex grow flex-col sm:flex-row', {\n\t\t\t\t\t'h-[calc(100vh-128px-env(safe-area-inset-top)-env(safe-area-inset-bottom))] sm:h-[calc(100vh-64px-env(safe-area-inset-top)-env(safe-area-inset-bottom))]':\n\t\t\t\t\t\t!user,\n\t\t\t\t\t'h-[calc(100vh-64px-env(safe-area-inset-top)-env(safe-area-inset-bottom))] sm:h-[calc(100vh-env(safe-area-inset-top)-env(safe-area-inset-bottom))]':\n\t\t\t\t\t\tuser,\n\t\t\t\t\t'h-[unset]': !isWide && isMenuOpened,\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t{isWide ? (\n\t\t\t\t\t<Navigation\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tonMenuOpenChange={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'h-full w-full max-w-full sm:max-w-[calc(100%-56px)]',\n\t\t\t\t\t\tisMenuOpened ? 'hidden md:block' : '',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Outlet />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction getLocationLabel(location: User['location']) {\n\tif (!location) return null\n\n\tconst { exercise } = location\n\n\tconst exercisePortion = [\n\t\texercise\n\t\t\t? [exercise.exerciseNumber, exercise.stepNumber]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.map((s) => s.toString().padStart(2, '0'))\n\t\t\t\t\t.join('/')\n\t\t\t: null,\n\t\texercise?.type,\n\t]\n\t\t.filter(Boolean)\n\t\t.join(' - ')\n\treturn { line1: location.workshopTitle, line2: exercisePortion }\n}\n\nfunction NoUserBanner() {\n\tconst isWide = useIsWide()\n\tconst {\n\t\tproduct: { host, displayName },\n\t} = useWorkshopConfig()\n\tconst userHasAccess = useUserHasAccess()\n\tconst [showLoginBadge, dismissLoginBadge] =\n\t\tuseOnboardingIndicator('login-button')\n\tconst details = (\n\t\t<div>\n\t\t\t{ENV.EPICSHOP_DEPLOYED ? (\n\t\t\t\t<div>\n\t\t\t\t\t{`This is the deployed version. `}\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tto={ENV.EPICSHOP_GITHUB_REPO}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tRun locally\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t{` for full experience.`}\n\t\t\t\t\t</>{' '}\n\t\t\t\t</div>\n\t\t\t) : userHasAccess ? (\n\t\t\t\t<div>\n\t\t\t\t\t<Link to=\"/login\" className=\"underline\">\n\t\t\t\t\t\tLogin\n\t\t\t\t\t</Link>{' '}\n\t\t\t\t\tor{' '}\n\t\t\t\t\t<a href={`https://${host}/login`} className=\"underline\">\n\t\t\t\t\t\tjoin for free\n\t\t\t\t\t</a>{' '}\n\t\t\t\t\tfor the full experience.\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</div>\n\t)\n\treturn (\n\t\t<div className=\"from-highlight to-info text-info-foreground z-10 flex h-16 items-center justify-between border-b bg-linear-to-tr pl-4\">\n\t\t\t{isWide ? (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"hidden flex-1 flex-wrap items-center gap-4 sm:flex\">\n\t\t\t\t\t\t<Logo size=\"lg\" style=\"monochrome\" />\n\t\t\t\t\t\t<div className=\"flex flex-1 flex-wrap items-center\">\n\t\t\t\t\t\t\t<p className=\"mr-2\">\n\t\t\t\t\t\t\t\tWelcome to the{' '}\n\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\tto={`https://${host}`}\n\t\t\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t</Link>{' '}\n\t\t\t\t\t\t\t\tWorkshop app!\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t{details}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t{userHasAccess ? null : (\n\t\t\t\t\t\t<div className=\"hidden h-full flex-col items-center sm:flex md:flex-row\">\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={`https://${host}`}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Join {displayName}</span>\n\t\t\t\t\t\t\t\t<span>↗︎</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={ENV.EPICSHOP_DEPLOYED ? `https://${host}/login` : '/login'}\n\t\t\t\t\t\t\t\tclassName=\"bg-info-foreground/20 hover:bg-info-foreground/30 relative flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold shadow-md transition\"\n\t\t\t\t\t\t\t\tonClick={dismissLoginBadge}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"User\" size=\"lg\" />\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Login</span>\n\t\t\t\t\t\t\t\t{showLoginBadge ? (\n\t\t\t\t\t\t\t\t\t<OnboardingBadge\n\t\t\t\t\t\t\t\t\t\ttooltip=\"Login for the full experience!\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"flex flex-1 flex-wrap items-center gap-4 sm:hidden\">\n\t\t\t\t\t\t<a href={`https://${host}`}>\n\t\t\t\t\t\t\t<Logo size=\"lg\" style=\"monochrome\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<Dialog>\n\t\t\t\t\t\t\t<DialogTrigger>\n\t\t\t\t\t\t\t\t<Icon name=\"Question\" size=\"lg\" className=\"animate-pulse\" />\n\t\t\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t\t\t<DialogContent>\n\t\t\t\t\t\t\t\t<DialogHeader>\n\t\t\t\t\t\t\t\t\t<Logo size=\"lg\" style=\"monochrome\" />\n\t\t\t\t\t\t\t\t\t<span className=\"text-lg font-semibold\">{displayName}</span>\n\t\t\t\t\t\t\t\t</DialogHeader>\n\t\t\t\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\t\t\t\tWelcome to the{' '}\n\t\t\t\t\t\t\t\t\t<Link to={`https://${host}`} className=\"underline\">\n\t\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t\t</Link>{' '}\n\t\t\t\t\t\t\t\t\tWorkshop app!\n\t\t\t\t\t\t\t\t</DialogDescription>\n\t\t\t\t\t\t\t\t{details}\n\t\t\t\t\t\t\t</DialogContent>\n\t\t\t\t\t\t</Dialog>\n\t\t\t\t\t</div>\n\t\t\t\t\t{userHasAccess ? null : (\n\t\t\t\t\t\t<div className=\"flex h-full items-center\">\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={`https://${host}`}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Join</span>\n\t\t\t\t\t\t\t\t<span>↗︎</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={ENV.EPICSHOP_DEPLOYED ? `https://${host}/login` : '/login'}\n\t\t\t\t\t\t\t\tclassName=\"bg-info-foreground/20 hover:bg-info-foreground/30 relative flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold shadow-md transition\"\n\t\t\t\t\t\t\t\tonClick={dismissLoginBadge}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"User\" size=\"lg\" />\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Login</span>\n\t\t\t\t\t\t\t\t{showLoginBadge ? (\n\t\t\t\t\t\t\t\t\t<OnboardingBadge\n\t\t\t\t\t\t\t\t\t\ttooltip=\"Login for the full experience!\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\nconst itemVariants = {\n\thidden: { opacity: 0, x: -20 },\n\tvisible: { opacity: 1, x: 0 },\n}\nfunction NavigationExerciseListItem({\n\texerciseNumber,\n\tchildren,\n}: {\n\texerciseNumber: number\n\tchildren: React.ReactNode\n}) {\n\tconst progressClassName = useExerciseProgressClassName(exerciseNumber)\n\treturn (\n\t\t<motion.li\n\t\t\tvariants={itemVariants}\n\t\t\tclassName={cn(\n\t\t\t\t// add gap of 3 to children, but using padding so the progress extends through the whole height\n\t\t\t\t'py-[6px] first:pt-3 last:pb-3',\n\t\t\t\tprogressClassName ? `${progressClassName} before:border-t` : null,\n\t\t\t)}\n\t\t>\n\t\t\t<span className=\"inline-block pl-2\">{children}</span>\n\t\t</motion.li>\n\t)\n}\n\nfunction NavigationExerciseStepListItem({\n\tchildren,\n\t...progressItemSearch\n}: {\n\tchildren: React.ReactNode\n} & ProgressItemSearch) {\n\tconst progressClassName = useProgressItemClassName(progressItemSearch)\n\treturn (\n\t\t<motion.li\n\t\t\tvariants={itemVariants}\n\t\t\tclassName={cn(\n\t\t\t\t// add gap of 3 to children, but using padding so the progress extends through the whole height\n\t\t\t\t'py-[6px] first:pt-3 last:pb-3',\n\t\t\t\tprogressClassName ? `${progressClassName} before:border-t` : null,\n\t\t\t)}\n\t\t>\n\t\t\t<span className=\"inline-block pl-2\">{children}</span>\n\t\t</motion.li>\n\t)\n}\n\nfunction NavigationExtrasListItem({ children }: { children: React.ReactNode }) {\n\treturn (\n\t\t<motion.li\n\t\t\tvariants={itemVariants}\n\t\t\tclassName=\"py-[6px] first:pt-3 last:pb-3\"\n\t\t>\n\t\t\t<span className=\"inline-block pl-2\">{children}</span>\n\t\t</motion.li>\n\t)\n}\n\nconst navHighlightBaseClassName =\n\t'relative px-2 py-0.5 pr-3 whitespace-nowrap outline-none hover:underline focus:underline after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"]'\n\nfunction getNavHighlightClassName(\n\tisActive: boolean,\n\tclassName?: string | null,\n) {\n\treturn clsx(navHighlightBaseClassName, className, {\n\t\t'bg-foreground text-background': isActive,\n\t})\n}\n\nfunction MobileNavigation({\n\tisMenuOpened,\n\tonMenuOpenChange: setMenuOpened,\n}: {\n\tisMenuOpened: boolean\n\tonMenuOpenChange: (change: boolean) => void\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tconst apps = useApps()\n\tconst user = useOptionalUser()\n\tconst nextExerciseRoute = useNextExerciseRoute()\n\tconst randomExerciseRoute = useRandomCompletedExerciseRoute()\n\tconst params = useParams()\n\tconst location = useLocation()\n\tconst isOnline = useIsOnline()\n\tconst { users } = usePresence()\n\n\t// Onboarding indicators\n\tconst [showAccountBadge, dismissAccountBadge] =\n\t\tuseOnboardingIndicator('account-link')\n\tconst showExtrasLink = hasExtras(apps)\n\tconst playgroundExtra = data.extras.find(\n\t\t(extra) => extra.name === data.playground.appName,\n\t)\n\tconst isExtrasActive =\n\t\tlocation.pathname === '/extra' || location.pathname.startsWith('/extra/')\n\tconst showExtrasPlaygroundLink = Boolean(playgroundExtra) && !isExtrasActive\n\n\t// items\n\tconst listVariants = {\n\t\tvisible: {\n\t\t\topacity: 1,\n\t\t\ttransition: {\n\t\t\t\tduration: 0.05,\n\t\t\t\twhen: 'beforeChildren',\n\t\t\t\tstaggerChildren: 0.03,\n\t\t\t},\n\t\t},\n\t\thidden: {\n\t\t\topacity: 0,\n\t\t},\n\t}\n\n\tconst handleOpenShortcuts = React.useCallback(() => {\n\t\tif (typeof window === 'undefined') return\n\t\twindow.dispatchEvent(new CustomEvent('toggle-keyboard-shortcuts'))\n\t}, [])\n\n\tconst requestInfo = useRequestInfo()\n\tconst currentTheme = requestInfo.session.theme ?? 'system'\n\tconst themeLabel = {\n\t\tlight: 'Light',\n\t\tdark: 'Dark',\n\t\tsystem: 'System',\n\t}[currentTheme]\n\tconst [isMobilePopoverOpen, setIsMobilePopoverOpen] = React.useState(false)\n\n\treturn (\n\t\t<nav className=\"flex w-full border-b sm:hidden\">\n\t\t\t<div className=\"w-full\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn('flex items-center', {\n\t\t\t\t\t\t'flex-col': isMenuOpened,\n\t\t\t\t\t\t'h-14': !isMenuOpened,\n\t\t\t\t\t})}\n\t\t\t\t>\n\t\t\t\t\t<NavToggle\n\t\t\t\t\t\ttitle={data.workshopTitle}\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tsetMenuOpened={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t\t{isMenuOpened && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tclassName=\"scrollbar-thin scrollbar-thumb-scrollbar flex w-full grow flex-col justify-between overflow-x-auto p-6\"\n\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\tclassName=\"flex flex-col\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\tto=\"/\"\n\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t'relative px-2 py-0.5 pr-3 text-2xl font-bold whitespace-nowrap outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tHome\n\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{data.exercises.map(({ exerciseNumber, title, steps }) => {\n\t\t\t\t\t\t\t\t\tconst isActive =\n\t\t\t\t\t\t\t\t\t\tNumber(params.exerciseNumber) === exerciseNumber\n\t\t\t\t\t\t\t\t\tconst showPlayground =\n\t\t\t\t\t\t\t\t\t\t!isActive &&\n\t\t\t\t\t\t\t\t\t\tdata.playground.exerciseNumber === exerciseNumber\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<NavigationExerciseListItem\n\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-1 text-2xl font-bold\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative px-2 py-0.5 pr-3 whitespace-nowrap outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t{showPlayground ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.exerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.stepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.type,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t🛝\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t{isActive ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"mt-2 ml-4 flex flex-col\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"instructions\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background relative px-2 py-0.5 pr-3 text-xl font-medium whitespace-nowrap outline-none after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t!params.stepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tIntro\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{steps\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.map(({ stepNumber, title, problem, solution }) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"step\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col gap-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"leading-tight font-semibold\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{stepNumber.toString().padStart(2, '0')}.{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"mt-0.5 ml-3 flex gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'problem',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgetNavHighlightClassName(isActive)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProblem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'solution',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgetNavHighlightClassName(isActive)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSolution\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"finished\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber, 'finished')}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background relative px-2 py-0.5 pr-3 text-base font-medium whitespace-nowrap outline-none after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background': isActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t📝 Elaboration\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</NavigationExerciseListItem>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t{showExtrasLink ? (\n\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-1 text-2xl font-bold\">\n\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\tto=\"/extra\"\n\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative px-2 py-0.5 pr-3 whitespace-nowrap outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\n\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t📚 Extras\n\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t{showExtrasPlaygroundLink && playgroundExtra ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\tto={`/extra/${playgroundExtra.dirName}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t🛝\n\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t{isExtrasActive && data.extras.length ? (\n\t\t\t\t\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"mt-2 ml-4 flex flex-col\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{data.extras.map((extra) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExtrasListItem key={extra.dirName}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={`/extra/${extra.dirName}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgetNavHighlightClassName(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'leading-tight font-semibold',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{extra.title}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{extra.name === data.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExtrasListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t<div className=\"mt-6\">\n\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\tto=\"/finished\"\n\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t'relative text-lg font-bold whitespace-nowrap outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background bg-foreground text-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"]':\n\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t📝 Workshop Feedback\n\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"grow\" />\n\t\t\t\t\t{isOnline ? null : (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'You are offline'}>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex h-14 animate-pulse items-center justify-start p-4',\n\t\t\t\t\t\t\t\t\tisMenuOpened ? 'w-full border-t' : 'border-l',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\tname=\"WifiNoConnection\"\n\t\t\t\t\t\t\t\t\tclassName=\"text-foreground-destructive\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{isMenuOpened ? 'You are offline' : null}\n\t\t\t\t\t\t\t\t</Icon>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t)}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex items-center justify-start p-4',\n\t\t\t\t\t\t\tisMenuOpened && users.length > 4 ? 'min-h-14' : 'h-14',\n\t\t\t\t\t\t\tisMenuOpened ? 'w-full border-t' : 'border-l',\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<FacePile isMenuOpened={isMenuOpened} />\n\t\t\t\t\t</div>\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user ? (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'Your account'}>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'relative flex h-14 shrink-0 items-center justify-start space-x-3 px-4 py-4 text-center no-underline hover:underline',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t'border-l': !isMenuOpened,\n\t\t\t\t\t\t\t\t\t\t'w-full border-t': isMenuOpened,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tto=\"/account\"\n\t\t\t\t\t\t\t\tonClick={dismissAccountBadge}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{user.imageUrlSmall ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\talt={user.name ?? user.email}\n\t\t\t\t\t\t\t\t\t\tsrc={user.imageUrlSmall}\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-full rounded-full\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<Icon name=\"User\" className=\"shrink-0\" size=\"lg\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tYour Account\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Your account</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{showAccountBadge ? (\n\t\t\t\t\t\t\t\t\t<OnboardingBadge\n\t\t\t\t\t\t\t\t\t\ttooltip=\"View your account and preferences\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user && nextExerciseRoute ? (\n\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\tcontent={isMenuOpened ? null : 'Continue to next lesson'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={nextExerciseRoute}\n\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'flex h-14 w-full items-center space-x-3 border-l px-4 py-4 pl-[18px] no-underline hover:underline',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstate={{ from: 'continue next lesson button' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"FastForward\" className=\"shrink-0\" size=\"md\" />\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tContinue to next lesson\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Continue to next lesson</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user && randomExerciseRoute ? (\n\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\tcontent={isMenuOpened ? null : 'Practice a past 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={randomExerciseRoute}\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>\n\t\t\t\t\t\t\t\t<Icon name=\"Refresh\" className=\"shrink-0\" size=\"md\" />\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tPractice a past 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\">Practice a past lesson</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex h-14 items-center justify-center gap-2 self-start p-4 sm:mb-4',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t'w-full border-t': isMenuOpened,\n\t\t\t\t\t\t\t\t'w-14 border-l': !isMenuOpened,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<ThemeSwitch />\n\t\t\t\t\t\t\t\t<SidecarStatusIndicator status={data.sidecarStatus} />\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<Popover\n\t\t\t\t\t\t\t\topen={isMobilePopoverOpen}\n\t\t\t\t\t\t\t\tonOpenChange={setIsMobilePopoverOpen}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{data.sidecarStatus?.hasFailure ? (\n\t\t\t\t\t\t\t\t\t<PopoverTrigger asChild>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Process error - click to see details\"\n\t\t\t\t\t\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\t\t\t\t\t\tisMobilePopoverOpen\n\t\t\t\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'Process error - click to see details'\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground hover:bg-muted flex h-8 w-8 items-center justify-center rounded-md transition-colors\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<StatusIndicator status=\"failed\" />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</PopoverTrigger>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<PopoverTrigger asChild>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"More options\"\n\t\t\t\t\t\t\t\t\t\t\ttitle={isMobilePopoverOpen ? undefined : 'More options'}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground hover:bg-muted flex h-8 w-8 items-center justify-center rounded-md transition-colors\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\twidth=\"20\"\n\t\t\t\t\t\t\t\t\t\t\t\theight=\"20\"\n\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 20 20\"\n\t\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<circle cx=\"5\" cy=\"10\" r=\"1.5\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<circle cx=\"10\" cy=\"10\" r=\"1.5\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<circle cx=\"15\" cy=\"10\" r=\"1.5\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</PopoverTrigger>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<PopoverContent\n\t\t\t\t\t\t\t\t\tside=\"top\"\n\t\t\t\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\t\t\t\tclassName=\"flex flex-col gap-1 p-2\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ThemeSwitchRow\n\t\t\t\t\t\t\t\t\t\tthemeLabel={themeLabel}\n\t\t\t\t\t\t\t\t\t\tdisableTooltip={isMobilePopoverOpen}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t{data.sidecarStatus ? (\n\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\tto=\"/admin\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"hover:bg-muted flex items-center gap-3 rounded-md px-2 py-1.5 text-sm transition-colors\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex h-5 w-5 items-center justify-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t<StatusIndicator\n\t\t\t\t\t\t\t\t\t\t\t\t\tstatus={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.sidecarStatus.hasFailure ? 'failed' : 'running'\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</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex-1 text-left\">\n\t\t\t\t\t\t\t\t\t\t\t\tSidecar process{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t{data.sidecarStatus.hasFailure ? 'error' : 'running'}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</PopoverContent>\n\t\t\t\t\t\t\t</Popover>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</nav>\n\t)\n}\n\nconst OPENED_MENU_WIDTH = 400\n\nfunction SidecarStatusIndicator({\n\tstatus,\n}: {\n\tstatus: { hasFailure: boolean; count: number; failureCount: number } | null\n}) {\n\tif (!status) return null\n\n\treturn (\n\t\t<SimpleTooltip\n\t\t\tcontent={\n\t\t\t\tstatus.hasFailure\n\t\t\t\t\t? `${status.failureCount} sidecar${status.failureCount === 1 ? '' : 's'} failed`\n\t\t\t\t\t: 'All sidecars running'\n\t\t\t}\n\t\t>\n\t\t\t<Link\n\t\t\t\tto=\"/admin\"\n\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground hover:bg-muted flex h-8 w-8 items-center justify-center rounded-md transition-colors\"\n\t\t\t>\n\t\t\t\t<StatusIndicator status={status.hasFailure ? 'failed' : 'running'} />\n\t\t\t</Link>\n\t\t</SimpleTooltip>\n\t)\n}\n\nfunction Navigation({\n\tisMenuOpened,\n\tonMenuOpenChange: setMenuOpened,\n}: {\n\tisMenuOpened: boolean\n\tonMenuOpenChange: (change: boolean) => void\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tconst apps = useApps()\n\tconst user = useOptionalUser()\n\tconst nextExerciseRoute = useNextExerciseRoute()\n\tconst randomExerciseRoute = useRandomCompletedExerciseRoute()\n\tconst params = useParams()\n\tconst location = useLocation()\n\tconst isOnline = useIsOnline()\n\tconst { users } = usePresence()\n\n\t// Onboarding indicators\n\tconst [showAccountBadge, dismissAccountBadge] =\n\t\tuseOnboardingIndicator('account-link')\n\tconst showExtrasLink = hasExtras(apps)\n\tconst playgroundExtra = data.extras.find(\n\t\t(extra) => extra.name === data.playground.appName,\n\t)\n\tconst isExtrasActive =\n\t\tlocation.pathname === '/extra' || location.pathname.startsWith('/extra/')\n\tconst showExtrasPlaygroundLink = Boolean(playgroundExtra) && !isExtrasActive\n\n\tconst exercise = data.exercises.find(\n\t\t(e) => e.exerciseNumber === Number(params.exerciseNumber),\n\t)\n\tconst app =\n\t\tparams.type === 'solution'\n\t\t\t? exercise?.solutions.find(\n\t\t\t\t\t(s) => s.stepNumber === Number(params.stepNumber),\n\t\t\t\t)\n\t\t\t: params.type === 'problem'\n\t\t\t\t? exercise?.problems.find(\n\t\t\t\t\t\t(p) => p.stepNumber === Number(params.stepNumber),\n\t\t\t\t\t)\n\t\t\t\t: null\n\n\t// container\n\tconst menuControls = useAnimationControls()\n\tconst menuVariants = {\n\t\tclose: { width: 56 },\n\t\topen: { width: OPENED_MENU_WIDTH },\n\t}\n\n\t// items\n\tconst listVariants = {\n\t\tvisible: {\n\t\t\topacity: 1,\n\t\t\ttransition: {\n\t\t\t\tduration: 0.05,\n\t\t\t\twhen: 'beforeChildren',\n\t\t\t\tstaggerChildren: 0.03,\n\t\t\t},\n\t\t},\n\t\thidden: {\n\t\t\topacity: 0,\n\t\t},\n\t}\n\n\tconst handleOpenShortcuts = React.useCallback(() => {\n\t\tif (typeof window === 'undefined') return\n\t\twindow.dispatchEvent(new CustomEvent('toggle-keyboard-shortcuts'))\n\t}, [])\n\n\tconst requestInfo = useRequestInfo()\n\tconst currentTheme = requestInfo.session.theme ?? 'system'\n\tconst themeLabel = {\n\t\tlight: 'Light',\n\t\tdark: 'Dark',\n\t\tsystem: 'System',\n\t}[currentTheme]\n\tconst [isPopoverOpen, setIsPopoverOpen] = React.useState(false)\n\n\treturn (\n\t\t<nav className=\"hidden border-r sm:flex\">\n\t\t\t<motion.div\n\t\t\t\tinitial={isMenuOpened ? 'open' : 'close'}\n\t\t\t\tvariants={menuVariants}\n\t\t\t\tanimate={menuControls}\n\t\t\t>\n\t\t\t\t<div className=\"flex h-full flex-col items-center justify-between\">\n\t\t\t\t\t<NavToggle\n\t\t\t\t\t\ttitle={data.workshopTitle}\n\t\t\t\t\t\tmenuControls={menuControls}\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tsetMenuOpened={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t\t{isMenuOpened && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tstyle={{ width: OPENED_MENU_WIDTH }}\n\t\t\t\t\t\t\tclassName=\"scrollbar-thin scrollbar-thumb-scrollbar flex grow flex-col justify-between overflow-y-auto p-6\"\n\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\tclassName=\"flex flex-col\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\tto=\"/\"\n\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t'relative px-2 py-0.5 pr-3 text-2xl font-bold whitespace-nowrap outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tHome\n\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{data.exercises.map(({ exerciseNumber, title, steps }) => {\n\t\t\t\t\t\t\t\t\tconst isActive =\n\t\t\t\t\t\t\t\t\t\tNumber(params.exerciseNumber) === exerciseNumber\n\t\t\t\t\t\t\t\t\tconst showPlayground =\n\t\t\t\t\t\t\t\t\t\t!isActive &&\n\t\t\t\t\t\t\t\t\t\tdata.playground.exerciseNumber === exerciseNumber\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<NavigationExerciseListItem\n\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-1 text-2xl font-bold\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative px-2 py-0.5 pr-3 whitespace-nowrap outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t{showPlayground ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.exerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.stepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.type,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t🛝\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t{isActive ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"mt-2 ml-4 flex flex-col\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"instructions\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background relative px-2 py-0.5 pr-3 text-xl font-medium whitespace-nowrap outline-none after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t!params.stepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tIntro\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{steps\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.map(({ stepNumber, title, problem, solution }) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"step\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col gap-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"leading-tight font-semibold\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{stepNumber.toString().padStart(2, '0')}.{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"mt-0.5 ml-3 flex gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'problem',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgetNavHighlightClassName(isActive)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProblem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'solution',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgetNavHighlightClassName(isActive)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSolution\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"finished\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber, 'finished')}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background relative px-2 py-0.5 pr-3 text-base font-medium whitespace-nowrap outline-none after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background': isActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t📝 Elaboration\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</NavigationExerciseListItem>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t{showExtrasLink ? (\n\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-1 text-2xl font-bold\">\n\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\tto=\"/extra\"\n\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative px-2 py-0.5 pr-3 whitespace-nowrap outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\n\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t📚 Extras\n\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t{showExtrasPlaygroundLink && playgroundExtra ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\tto={`/extra/${playgroundExtra.dirName}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t🛝\n\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t{isExtrasActive && data.extras.length ? (\n\t\t\t\t\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"mt-2 ml-4 flex flex-col\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{data.extras.map((extra) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExtrasListItem key={extra.dirName}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={`/extra/${extra.dirName}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgetNavHighlightClassName(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'leading-tight font-semibold',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{extra.title}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{extra.name === data.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExtrasListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t<div className=\"mt-6\">\n\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\tto=\"/finished\"\n\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t'relative text-lg font-bold whitespace-nowrap outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-background bg-foreground text-background after:absolute after:-right-2.5 after:-bottom-2.5 after:h-5 after:w-5 after:scale-75 after:rotate-45 after:content-[\"\"]':\n\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t📝 Workshop Feedback\n\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t\t{!isMenuOpened && (\n\t\t\t\t\t\t<div className=\"flex grow flex-col justify-center\">\n\t\t\t\t\t\t\t<div className=\"orientation-sideways w-full font-mono text-sm leading-none font-medium uppercase\">\n\t\t\t\t\t\t\t\t{exercise?.title ? (\n\t\t\t\t\t\t\t\t\t<Link to={getExercisePath(Number(params.exerciseNumber))}>\n\t\t\t\t\t\t\t\t\t\t{exercise.title}\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t{exercise?.title && app?.title ? ' — ' : null}\n\t\t\t\t\t\t\t\t{app?.title ? (\n\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\tNumber(params.exerciseNumber),\n\t\t\t\t\t\t\t\t\t\t\tapp.stepNumber,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{app.title}\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{isOnline ? null : (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'You are offline'}>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex w-full animate-pulse items-center border-t p-4',\n\t\t\t\t\t\t\t\t\tisMenuOpened ? 'justify-start' : 'justify-center',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\tname=\"WifiNoConnection\"\n\t\t\t\t\t\t\t\t\tclassName=\"text-foreground-destructive\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t\t<span className=\"whitespace-nowrap\">You are offline</span>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</Icon>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t)}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex w-full items-center justify-start border-t p-4 transition-[height]',\n\t\t\t\t\t\t\tisMenuOpened && users.length > 4 ? 'h-28' : 'h-14',\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={isMenuOpened ? { width: OPENED_MENU_WIDTH } : {}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<FacePile isMenuOpened={isMenuOpened} />\n\t\t\t\t\t</div>\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user ? (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'Your account'}>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tclassName=\"relative flex h-14 w-full shrink-0 items-center justify-start space-x-3 border-t px-4 py-4 text-center no-underline hover:underline\"\n\t\t\t\t\t\t\t\tto=\"/account\"\n\t\t\t\t\t\t\t\tonClick={dismissAccountBadge}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{user.imageUrlSmall ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\talt={user.name ?? user.email}\n\t\t\t\t\t\t\t\t\t\tsrc={user.imageUrlSmall}\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-full rounded-full\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<Icon name=\"User\" className=\"shrink-0\" size=\"lg\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tYour Account\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Your account</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{showAccountBadge ? (\n\t\t\t\t\t\t\t\t\t<OnboardingBadge\n\t\t\t\t\t\t\t\t\t\ttooltip=\"View your account and preferences\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user && nextExerciseRoute ? (\n\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\tcontent={isMenuOpened ? null : 'Continue to next lesson'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={nextExerciseRoute}\n\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'flex h-14 w-full items-center space-x-3 border-t px-4 py-4 pl-[18px] no-underline hover:underline',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstate={{ from: 'continue next lesson button' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"FastForward\" className=\"shrink-0\" size=\"md\" />\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tContinue to next lesson\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Continue to next lesson</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user && randomExerciseRoute ? (\n\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\tcontent={isMenuOpened ? null : 'Practice a past 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={randomExerciseRoute}\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>\n\t\t\t\t\t\t\t\t<Icon name=\"Refresh\" className=\"shrink-0\" size=\"md\" />\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tPractice a past 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\">Practice a past lesson</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<div className=\"mb-4 w-full self-start border-t pt-[15px] pl-3\">\n\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<ThemeSwitch />\n\t\t\t\t\t\t\t\t<SimpleTooltip content=\"Keyboard shortcuts (press ?)\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Keyboard shortcuts\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleOpenShortcuts}\n\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground hover:bg-muted focus-visible:ring-ring flex h-8 w-8 items-center justify-center rounded-md transition-colors focus-visible:ring-2 focus-visible:ring-offset-2\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Icon name=\"Question\" size=\"md\" />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t\t\t\t<SidecarStatusIndicator status={data.sidecarStatus} />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<Popover open={isPopoverOpen} onOpenChange={setIsPopoverOpen}>\n\t\t\t\t\t\t\t\t{data.sidecarStatus?.hasFailure ? (\n\t\t\t\t\t\t\t\t\t<PopoverTrigger asChild>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Process error - click to see details\"\n\t\t\t\t\t\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\t\t\t\t\t\tisPopoverOpen\n\t\t\t\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'Process error - click to see details'\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground hover:bg-muted flex h-8 w-8 items-center justify-center rounded-md transition-colors\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<StatusIndicator status=\"failed\" />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</PopoverTrigger>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<PopoverTrigger asChild>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"More options\"\n\t\t\t\t\t\t\t\t\t\t\ttitle={isPopoverOpen ? undefined : 'More options'}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground hover:bg-muted flex h-8 w-8 items-center justify-center rounded-md transition-colors\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\twidth=\"20\"\n\t\t\t\t\t\t\t\t\t\t\t\theight=\"20\"\n\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 20 20\"\n\t\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<circle cx=\"5\" cy=\"10\" r=\"1.5\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<circle cx=\"10\" cy=\"10\" r=\"1.5\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<circle cx=\"15\" cy=\"10\" r=\"1.5\" fill=\"currentColor\" />\n\t\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</PopoverTrigger>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<PopoverContent\n\t\t\t\t\t\t\t\t\tside=\"top\"\n\t\t\t\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\t\t\t\tclassName=\"flex flex-col gap-1 p-2\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ThemeSwitchRow\n\t\t\t\t\t\t\t\t\t\tthemeLabel={themeLabel}\n\t\t\t\t\t\t\t\t\t\tdisableTooltip={isPopoverOpen}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Keyboard shortcuts\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleOpenShortcuts}\n\t\t\t\t\t\t\t\t\t\tclassName=\"hover:bg-muted flex items-center gap-3 rounded-md px-2 py-1.5 text-sm transition-colors\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex h-5 w-5 items-center justify-center\">\n\t\t\t\t\t\t\t\t\t\t\t<Icon name=\"Question\" size=\"md\" />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<span className=\"flex-1 text-left\">Keyboard shortcuts</span>\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t{data.sidecarStatus ? (\n\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\tto=\"/admin\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"hover:bg-muted flex items-center gap-3 rounded-md px-2 py-1.5 text-sm transition-colors\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex h-5 w-5 items-center justify-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t<StatusIndicator\n\t\t\t\t\t\t\t\t\t\t\t\t\tstatus={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.sidecarStatus.hasFailure ? 'failed' : 'running'\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</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex-1 text-left\">\n\t\t\t\t\t\t\t\t\t\t\t\tSidecar process{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t{data.sidecarStatus.hasFailure ? 'error' : 'running'}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</PopoverContent>\n\t\t\t\t\t\t\t</Popover>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</motion.div>\n\t\t</nav>\n\t)\n}\n\nfunction ThemeSwitchRow({\n\tthemeLabel,\n\tdisableTooltip,\n}: {\n\tthemeLabel: string\n\tdisableTooltip?: boolean\n}) {\n\tconst wrapperRef = React.useRef<HTMLDivElement>(null)\n\n\tconst handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n\t\tconst form = wrapperRef.current?.querySelector<HTMLFormElement>('form')\n\t\tif (!form) return\n\t\tconst submitButton = form.querySelector<HTMLButtonElement>(\n\t\t\t'button[type=\"submit\"]',\n\t\t)\n\t\t// Don't trigger click if the event originated from the submit button itself\n\t\tif (submitButton?.contains(event.target as Node)) {\n\t\t\treturn\n\t\t}\n\t\tsubmitButton?.click()\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tref={wrapperRef}\n\t\t\tonClick={handleClick}\n\t\t\tclassName=\"hover:bg-muted flex cursor-pointer items-center gap-3 rounded-md px-2 py-1.5 text-sm transition-colors\"\n\t\t>\n\t\t\t<div className=\"flex h-5 w-5 items-center justify-center\">\n\t\t\t\t<ThemeSwitch disableTooltip={disableTooltip} />\n\t\t\t</div>\n\t\t\t<span className=\"flex-1 text-left\">{themeLabel} theme</span>\n\t\t</div>\n\t)\n}\n\nfunction NavToggle({\n\ttitle,\n\tisMenuOpened,\n\tsetMenuOpened,\n\tmenuControls,\n}: {\n\ttitle: string\n\tisMenuOpened: boolean\n\tsetMenuOpened: (value: boolean) => void\n\tmenuControls?: ReturnType<typeof useAnimationControls>\n}) {\n\tconst initialOpenRef = React.useRef(isMenuOpened)\n\tconst menuButtonRef = React.useRef<HTMLButtonElement>(null)\n\tconst path01Variants = {\n\t\topen: { d: 'M3.06061 2.99999L21.0606 21' },\n\t\tclosed: { d: 'M0 9.5L24 9.5' },\n\t}\n\tconst path02Variants = {\n\t\topen: { d: 'M3.00006 21.0607L21 3.06064' },\n\t\tmoving: { d: 'M0 14.5L24 14.5' },\n\t\tclosed: { d: 'M0 14.5L15 14.5' },\n\t}\n\tconst path01Controls = useAnimationControls()\n\tconst path02Controls = useAnimationControls()\n\n\tasync function toggleMenu() {\n\t\tvoid menuControls?.start(isMenuOpened ? 'close' : 'open')\n\t\tsetMenuOpened(!isMenuOpened)\n\t\tif (isMenuOpened) {\n\t\t\tvoid path01Controls.start(path01Variants.closed)\n\t\t\tawait path02Controls.start(path02Variants.moving)\n\t\t\tvoid path02Controls.start(path02Variants.closed)\n\t\t} else {\n\t\t\tawait path02Controls.start(path02Variants.moving)\n\t\t\tvoid path01Controls.start(path01Variants.open)\n\t\t\tvoid path02Controls.start(path02Variants.open)\n\t\t}\n\t}\n\n\tReact.useEffect(() => {\n\t\tif (!isMenuOpened) return\n\n\t\tfunction handleKeyDown(event: KeyboardEvent) {\n\t\t\tif (event.key !== 'Escape' || event.defaultPrevented) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst hasOpenDialog = Boolean(\n\t\t\t\tdocument.querySelector(\n\t\t\t\t\t'[role=\"dialog\"][data-state=\"open\"], [role=\"alertdialog\"][data-state=\"open\"]',\n\t\t\t\t),\n\t\t\t)\n\n\t\t\tif (!hasOpenDialog) {\n\t\t\t\tmenuButtonRef.current?.click()\n\t\t\t}\n\t\t}\n\t\tdocument.addEventListener('keydown', handleKeyDown)\n\t\treturn () => document.removeEventListener('keydown', handleKeyDown)\n\t}, [isMenuOpened])\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'relative inline-flex h-14 shrink-0 items-center justify-between overflow-hidden border-r sm:w-full sm:border-r-0 sm:border-b',\n\t\t\t\t{\n\t\t\t\t\t'w-full': isMenuOpened,\n\t\t\t\t},\n\t\t\t)}\n\t\t>\n\t\t\t<button\n\t\t\t\tref={menuButtonRef}\n\t\t\t\tclassName=\"flex h-14 w-14 items-center justify-center\"\n\t\t\t\taria-label=\"Open Navigation menu\"\n\t\t\t\tonClick={toggleMenu}\n\t\t\t>\n\t\t\t\t<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<motion.path\n\t\t\t\t\t\t{...path01Variants[initialOpenRef.current ? 'open' : 'closed']}\n\t\t\t\t\t\tanimate={path01Controls}\n\t\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t/>\n\t\t\t\t\t<motion.path\n\t\t\t\t\t\t{...path02Variants[initialOpenRef.current ? 'open' : 'closed']}\n\t\t\t\t\t\tanimate={path02Controls}\n\t\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t</button>\n\t\t\t{isMenuOpened && (\n\t\t\t\t<motion.p\n\t\t\t\t\ttransition={{ delay: 0.2 }}\n\t\t\t\t\tinitial={{ opacity: 0, y: 5 }}\n\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\tclassName=\"absolute right-5 font-mono text-sm whitespace-nowrap uppercase\"\n\t\t\t\t>\n\t\t\t\t\t<Link to=\"/\">{title}</Link>\n\t\t\t\t</motion.p>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n"],"names":["stopAnimation","visualElement","value","setVariants","variantLabels","key","variant","setTarget","child","setValues","definition","animationControls","subscribers","controls","transitionOverride","animations","animateVisualElement","useAnimationControls","useConstant","useIsomorphicLayoutEffect","makeMediaQueryStore","mediaQuery","serverSnapshot","getSnapshot","subscribe","callback","mediaQueryList","useSyncExternalStore","Popover","props","jsx","PopoverPrimitive.Root","PopoverTrigger","PopoverPrimitive.Trigger","PopoverContent","className","align","sideOffset","PopoverPrimitive.Portal","PopoverPrimitive.Content","cn","opacities","shadows","getScoreClassNames","score","opacityNumber","Math","round","length","shadowNumber","FacePile","isMenuOpened","loggedInUser","useOptionalUser","users","usePresence","product","displayNameShort","useWorkshopConfig","limit","numberOverLimit","shouldShowNumberOverLimit","tiffany","Link","target","rel","to","children","alt","src","overLimitLabel","TooltipProvider","slice","map","user","scoreClassNames","locations","getUserLocations","imageUrl","imageUrlSmall","avatarUrl","hasAccess","local","some","loc","origin","includes","productHostEmojis","getUniqueProductHostEmojis","loggedInEmojis","getLoggedInProductEmojis","loggedInProductHosts","optOut","Tooltip","TooltipTrigger","asChild","tabIndex","Icon","name","TooltipContent","jsxs","id","doingLabel","index","locationLabel","getLocationLabel","line1","getProductHostEmoji","productHost","line2","workshopTitle","hosts","host","filter","Boolean","join","location","uniqueHosts","Set","add","size","Array","from","hasExtras","apps","app","rootDir","relativePath","split","useIsWide","_layout","_UNSAFE_withComponentProps","data","useLoaderData","isWide","isHydrated","useHydrated","setMenuOpenedState","React","useRevalidationWS","watchPaths","setMenuOpened","document","cookie","toString","NoUserBanner","MobileNavigation","onMenuOpenChange","Navigation","Outlet","exercise","exercisePortion","exerciseNumber","stepNumber","s","padStart","type","displayName","userHasAccess","useUserHasAccess","showLoginBadge","dismissLoginBadge","useOnboardingIndicator","details","ENV","EPICSHOP_DEPLOYED","Fragment","EPICSHOP_GITHUB_REPO","href","Logo","style","onClick","OnboardingBadge","tooltip","Dialog","DialogTrigger","DialogContent","DialogHeader","DialogDescription","itemVariants","hidden","opacity","x","visible","NavigationExerciseListItem","progressClassName","useExerciseProgressClassName","motion","li","variants","NavigationExerciseStepListItem","progressItemSearch","useProgressItemClassName","NavigationExtrasListItem","navHighlightBaseClassName","getNavHighlightClassName","isActive","clsx","useApps","nextExerciseRoute","useNextExerciseRoute","randomExerciseRoute","useRandomCompletedExerciseRoute","params","useParams","useLocation","isOnline","useIsOnline","showAccountBadge","dismissAccountBadge","showExtrasLink","playgroundExtra","extras","find","extra","playground","appName","isExtrasActive","pathname","startsWith","showExtrasPlaygroundLink","listVariants","transition","duration","when","staggerChildren","window","dispatchEvent","CustomEvent","currentTheme","useRequestInfo","session","theme","themeLabel","light","dark","system","isMobilePopoverOpen","setIsMobilePopoverOpen","NavToggle","title","div","initial","animate","ul","NavLink","prefetch","exercises","steps","Number","showPlayground","getExercisePath","getExerciseStepPath","problem","solution","dirName","SimpleTooltip","content","email","state","ThemeSwitch","SidecarStatusIndicator","status","sidecarStatus","open","onOpenChange","hasFailure","StatusIndicator","width","height","viewBox","fill","xmlns","cx","cy","r","side","ThemeSwitchRow","disableTooltip","OPENED_MENU_WIDTH","failureCount","e","solutions","problems","p","menuControls","menuVariants","close","handleOpenShortcuts","isPopoverOpen","setIsPopoverOpen","wrapperRef","handleClick","event","form","current","querySelector","submitButton","contains","click","ref","initialOpenRef","menuButtonRef","path01Variants","d","closed","path02Variants","moving","path01Controls","path02Controls","toggleMenu","start","handleKeyDown","defaultPrevented","addEventListener","removeEventListener","path","stroke","strokeWidth","delay","y"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{b as f,d as C,L as h,A as k,w as D,a as L,O}from"./chunk-EPOLDU6W-BCLmut3y.js";import{j as e}from"./jsx-runtime-C5WNSv3b.js";import{E as I}from"./index-CEVyDj51.js";import{r as x}from"./index-CqIc3cxq.js";import{G as R}from"./error-boundary-DVp6wKiz.js";import{N as $}from"./nav-chevrons-Dk4GtZwQ.js";import{u as A}from"./revalidation-ws-BJWJviUX.js";import{L as j,E as T}from"./launch-editor-D2exGfVu.js";import{P as B}from"./progress-ILaVQtOO.js";import{S}from"./set-playground-BSGwH9dH.js";import{l as U,c as v,I as g,m as H,n as V}from"./misc-W4055b-0.js";import{a as _,g as F}from"./root-loader-BOzEMapJ.js";import{g as Y}from"./seo-t5J-DRxw.js";import{s as y,a as M}from"./split-layout-DnRER1bP.js";import{E as q}from"./error-boundary-BDqWjIFP.js";import{E as G}from"./epic-video-D0drHmgC.js";import{S as N}from"./tooltip-Tlsyx2YO.js";import{M as X}from"./mdx-BzyhMqFg.js";import{R as z,T as K,P as Q,C as W}from"./index-CmflCPTU.js";import{u as J,O as Z}from"./onboarding-indicator-B-XR90_G.js";import"./preload-helper-BXl3LOEh.js";import"./schemas-Uj5SZtvt.js";import"./progress-bar-DpWhcyhC.js";import"./pe-CIZUOJMr.js";import"./index-CJDOQ1bl.js";import"./index-vDCSPjrM.js";import"./index-ynYvVAOK.js";import"./button-Cd-ekki5.js";import"./dialog-CzO65Z5w.js";import"./chunk-FNSCYPCZ-BHgC5cdx.js";import"./coerce-CkHW0SMv.js";import"./use-event-source-BuD4_2SF.js";import"./index-DzdDahau.js";import"./index-CdzVFL-Z.js";import"./online-DiNLkgTC.js";import"./loading-CDNzW5oO.js";import"./user-BsPobzjB.js";import"./workshop-config-Zfc8zU0x.js";const P=x.createContext(null);function ee(){const r=x.useContext(P);if(!r)throw new Error("useStepContext must be used within a StepContextProvider");return r}function ne({children:r,inBrowserBrowserRef:n}){return e.jsx(P,{value:{inBrowserBrowserRef:n},children:r})}const re={DiffLink:b,PrevDiffLink:ie,NextDiffLink:se,InlineFile:oe,LinkToApp:ae};function te({inBrowserBrowserRef:r}){const n=f();return n.exerciseStepApp.instructionsCode?e.jsx(ne,{inBrowserBrowserRef:r,children:e.jsx(G,{epicVideoInfosPromise:n.epicVideoInfosPromise,children:e.jsx("div",{className:"prose dark:prose-invert sm:prose-lg",children:e.jsx(X,{code:n.exerciseStepApp.instructionsCode,components:re})})})}):null}function w(r,n,t){const s=new URLSearchParams(r);return t===null?s.delete(n):s.set(n,t),s}function se({app:r=0,fullPage:n=!1,children:t}){return e.jsx(b,{app1:r,app2:r+1,fullPage:n,children:t})}function ie({app:r=-1,fullPage:n=!1,children:t}){return e.jsx(b,{app1:r,app2:r+1,fullPage:n,children:t})}function b({app1:r=0,app2:n=1,children:t,fullPage:s=!1,to:l}){const i=f();if(!l&&!r&&!n)return e.jsx("callout-danger",{className:"notification",children:e.jsx("div",{className:"title",children:"DiffLink Error: invalid input"})});function c(o){if(typeof o=="number"){const u=i.exerciseIndex+o;return i.allApps[u]?.name}if(!o)return null;for(const{name:u,stepName:d}of i.allApps)if(o===u||o===d)return u;return null}if(l){const o=new URLSearchParams(l);r=o.get("app1"),n=o.get("app2")}const a=c(r),p=c(n);if(!a||!p)return e.jsxs("callout-danger",{className:"notification",children:[e.jsx("div",{className:"title",children:"DiffLink Error: invalid input"}),!a&&e.jsxs("div",{children:['app1: "',r,'" is not a valid app name']}),!p&&e.jsxs("div",{children:['app2: "',n,'" is not a valid app name']})]});l||(l=`app1=${a}&app2=${p}`);const m=s?`/diff?${l}`:`?${decodeURIComponent(w(new URLSearchParams,"preview",`diff&${l}`).toString())}`;return t||(t=e.jsxs("span",{children:["Go to Diff ",s?"":"Preview"," from: ",e.jsx("code",{children:a})," to:"," ",e.jsx("code",{children:p})]})),e.jsx(h,{to:m,children:t})}function oe({file:r,type:n="playground",children:t=e.jsx("code",{children:r}),...s}){const l=f(),i=l[n]||l[l.type],c=e.jsxs("div",{className:"launch-editor-button-wrapper flex underline underline-offset-4",children:[t," ",e.jsx("svg",{height:24,width:24,children:e.jsx("use",{href:`${H}#Keyboard`})})]});return ENV.EPICSHOP_DEPLOYED&&i?e.jsx("div",{className:"inline-block grow",children:e.jsx(j,{appFile:r,appName:i.name,...s,children:c})}):i?e.jsx("div",{className:"inline-block grow",children:e.jsx(j,{appFile:r,appName:i.name,...s,children:c})}):n==="playground"?e.jsx(N,{content:"You must 'Set to Playground' before opening a file",children:e.jsx("div",{className:"inline-block grow cursor-not-allowed",children:c})}):e.jsx(e.Fragment,{children:"children"})}function le(r){return r==="problem"?"problem":r==="solution"?"solution":"playground"}function ae({to:r,children:n=e.jsx("code",{children:r.toString()}),...t}){const[s]=C(),l=`?${w(s,"pathname",r.toString()).toString()}`,i=f(),c=le(s.get("preview")),a=_(),p=i[c],m=p?.dev.type==="script"?U({domain:a.domain,port:p.dev.portNumber}):i.playground?.dev.type==="browser"||i.playground?.dev.type==="export"?i.playground.dev.pathname:null,{inBrowserBrowserRef:o}=ee(),u=m?m.slice(0,-1)+r.toString():null;return e.jsxs("div",{className:"inline-flex items-center justify-between gap-1",children:[e.jsx(h,{to:l,...t,className:v(t.className,{"cursor-not-allowed":ENV.EPICSHOP_DEPLOYED}),title:ENV.EPICSHOP_DEPLOYED?"Cannot link to app in deployed version":void 0,onClick:d=>{ENV.EPICSHOP_DEPLOYED&&d.preventDefault(),t.onClick?.(d),o.current?.handleExtrnalNavigation(r.toString())},children:n}),u?e.jsx(N,{content:"Open in new tab",children:e.jsx("a",{href:u,target:"_blank",rel:"noreferrer",className:v("flex aspect-square items-center justify-center",{"cursor-not-allowed":ENV.EPICSHOP_DEPLOYED}),title:ENV.EPICSHOP_DEPLOYED?"Cannot link to app in deployed version":"Open in new tab",onClick:d=>{ENV.EPICSHOP_DEPLOYED&&d.preventDefault()},children:e.jsx(g,{name:"ExternalLink"})})}):null]})}function ce({diffFilesPromise:r}){const n=f(),[t,s]=J("files-popover"),[l,i]=x.useState(!1),c=x.useRef(null);function a(o){i(o),o&&s()}function p(){i(!1)}const m=n.playground?.appName;return e.jsx(e.Fragment,{children:e.jsxs(z,{open:l,onOpenChange:a,children:[e.jsx(K,{asChild:!0,children:e.jsxs("button",{className:"relative flex h-full items-center gap-1 border-r px-6 py-3 font-mono text-sm uppercase","aria-label":"Relevant Files",children:[e.jsx(g,{name:"Files"}),e.jsx("span",{className:"hidden @min-[640px]:inline",children:"Files"}),t?e.jsx(Z,{tooltip:"Click to see which files to edit!"}):null]})}),e.jsx(Q,{children:e.jsx(W,{ref:c,className:"slideRightContent lg:slideUpContent invert-theme bg-background text-foreground z-10 rounded px-9 py-8 select-none",align:"start",sideOffset:5,children:e.jsxs("div",{className:"launch-editor-wrapper",children:[e.jsx("strong",{className:"inline-block px-2 pb-2 font-semibold uppercase",children:"Relevant Files"}),e.jsxs("p",{className:"text-muted-foreground mb-4 max-w-2xs px-2 text-sm",children:["These are the files you'll need to modify for this exercise. Click any file to open it directly in your editor at the right location."," ",e.jsx(h,{to:"/guide#file-links",className:"text-highlight underline",onClick:()=>i(!1),children:"Learn more →"})]}),n.problem&&n.playground?.appName!==n.problem.name?e.jsx("div",{className:"mb-2 rounded p-1 font-mono font-medium",children:e.jsx(S,{appName:n.problem.name})}):null,e.jsx("div",{id:"files",children:e.jsx(x.Suspense,{fallback:e.jsx(N,{content:"Loading diff",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(g,{name:"Refresh",className:"h-8 w-8 animate-spin"})})}),children:e.jsx(k,{resolve:r,errorElement:e.jsx("div",{className:"text-foreground-destructive",children:"Something went wrong."}),children:o=>{if(!o)return e.jsx("p",{className:"text-foreground-destructive",children:"Unable to determine diff"});if(typeof o=="string")return e.jsx("p",{className:"text-foreground-destructive",children:o});if(!o.length)return e.jsx("p",{children:"No files changed"});const u=m||ENV.EPICSHOP_GITHUB_ROOT?{}:{title:"You must 'Set to Playground' before opening a file",className:"not-allowed"};return e.jsxs("ul",{...u,children:[o.length>1&&!ENV.EPICSHOP_DEPLOYED?e.jsx("div",{className:"border-opacity-50 mb-2 border-b border-b-gray-50 pb-2 font-sans",children:e.jsx(j,{appFile:o.map(d=>`${d.path},${d.line},1`),appName:"playground",onUpdate:p,children:e.jsx("p",{children:"Open All Files"})})}):null,o.map(d=>e.jsx("li",{"data-state":d.status,children:e.jsx(j,{appFile:`${d.path},${d.line},1`,appName:ENV.EPICSHOP_DEPLOYED?n.problem?.name??"playground":"playground",onUpdate:p,children:e.jsx("code",{children:d.path})})},d.path))]})}})})})]})})})]})})}function E(r,n){const t=r?.exerciseStepApp.exerciseNumber.toString().padStart(2,"0")??"00",s=r?.exerciseStepApp.stepNumber.toString().padStart(2,"0")??"00",l={problem:"💪",solution:"🏁"}[r?.type??"problem"],i=r?.[r.type]?.title??"N/A";return{emoji:l,stepNumber:s,title:i,exerciseNumber:t,exerciseTitle:r?.exerciseTitle??"Unknown exercise",workshopTitle:n,type:r?.type??"problem"}}const ze=({loaderData:r,matches:n,params:t})=>{const s=F(n);if(!r||!s)return[{title:"🦉 | Error"}];const{emoji:l,stepNumber:i,title:c,exerciseNumber:a,exerciseTitle:p}=E(r);return Y({title:`${l} | ${i}. ${c} | ${a}. ${p} | ${s.workshopTitle}`,description:`${t.type} step for exercise ${a}. ${p}`,ogTitle:c,ogDescription:`${p} step ${Number(i)} ${t.type}`,instructor:s.instructor,requestInfo:s.requestInfo})},Ke=D(function({loaderData:n}){const t=x.useRef(null),s=x.useRef(null),l=x.useRef(null),[i,c]=x.useState(n.splitPercent),a=E(n);A({watchPaths:[`${n.exerciseStepApp.relativePath}/README.mdx`]});const p=n.problem?n.playground?.appName!==n.problem.name:!1;return e.jsx("div",{className:"flex max-w-full grow flex-col",children:e.jsxs("main",{ref:s,className:"flex grow flex-col overflow-y-auto sm:h-full sm:min-h-[800px] md:min-h-[unset] lg:flex-row lg:overflow-y-hidden",children:[e.jsxs("div",{className:"relative flex min-w-0 flex-none basis-auto flex-col sm:col-span-1 sm:row-span-1 lg:h-full lg:basis-(--split-pct)",style:{"--split-pct":`${i}%`},ref:l,children:[e.jsx("h1",{className:"@container h-14 border-b pr-5 pl-10 text-sm leading-tight font-medium",children:e.jsxs("div",{className:"flex h-14 items-center justify-between gap-x-2 py-2 whitespace-nowrap",children:[e.jsxs("div",{className:"flex items-center justify-start gap-x-2 uppercase",children:[e.jsxs(h,{to:V(n.exerciseStepApp.exerciseNumber),className:"hover:underline",children:[e.jsxs("span",{children:[a.exerciseNumber,"."]}),e.jsxs("span",{className:"hidden @min-[500px]:inline",children:[" ",a.exerciseTitle]})]}),e.jsx("span",{children:"/"}),e.jsxs(h,{to:".",className:"hover:underline",children:[e.jsxs("span",{children:[a.stepNumber,"."]}),e.jsxs("span",{className:"hidden @min-[300px]:inline",children:[" ",a.title]}),e.jsxs("span",{children:[" (",a.emoji]}),e.jsxs("span",{className:"hidden @min-[400px]:inline",children:[" ",a.type]}),e.jsx("span",{children:")"})]})]}),n.problem&&(n.playground?.appName!==n.problem.name||!n.playground?.isUpToDate)?e.jsx(S,{appName:n.problem.name,isOutdated:n.playground?.isUpToDate===!1,hideTextOnNarrow:!0,showOnboardingIndicator:p}):null]})}),e.jsxs("article",{id:n.articleId,className:"shadow-on-scrollbox scrollbar-thin scrollbar-thumb-scrollbar flex w-full max-w-none scroll-pt-6 flex-col justify-between space-y-6 p-2 sm:p-10 sm:pt-8 lg:h-full lg:flex-1 lg:overflow-y-auto",children:[n.exerciseStepApp.instructionsCode?e.jsx(te,{inBrowserBrowserRef:t}):e.jsx("div",{className:"flex h-full items-center justify-center text-lg",children:e.jsx("p",{children:"No instructions yet..."})}),e.jsxs("div",{className:"mt-auto flex justify-between",children:[n.prevStepLink?e.jsxs(h,{to:n.prevStepLink.to,"aria-label":"Previous Step","data-keyboard-action":"g+p",prefetch:"intent",children:[e.jsx("span",{"aria-hidden":!0,children:"←"}),e.jsx("span",{className:"hidden xl:inline",children:" Previous"})]}):e.jsx("span",{}),n.nextStepLink?e.jsxs(h,{to:n.nextStepLink.to,"aria-label":"Next Step","data-keyboard-action":"g+n",prefetch:"intent",children:[e.jsx("span",{className:"hidden xl:inline",children:"Next "}),e.jsx("span",{"aria-hidden":!0,children:"→"})]}):e.jsx("span",{})]})]},n.articleId),e.jsx(I,{elementQuery:`#${n.articleId}`},`scroll-${n.articleId}`),n.type==="solution"?e.jsx(B,{type:"step",exerciseNumber:n.exerciseStepApp.exerciseNumber,stepNumber:n.exerciseStepApp.stepNumber,className:"h-14 border-t px-6"}):null,e.jsxs("div",{className:"@container flex h-16 justify-between border-t border-b-4 lg:border-b-0",children:[e.jsx("div",{children:e.jsx("div",{className:"h-full",children:e.jsx(ce,{diffFilesPromise:n.diffFiles})})}),e.jsx(T,{appName:n.exerciseStepApp.name,relativePath:`${n.exerciseStepApp.relativePath}/README.mdx`}),e.jsx($,{prev:n.prevStepLink?{to:n.prevStepLink.to,"aria-label":"Previous Step"}:null,next:n.nextStepLink?{to:n.nextStepLink.to,"aria-label":"Next Step"}:null})]})]}),e.jsx("div",{role:"separator","aria-orientation":"vertical",title:"Drag to resize",className:"bg-border hover:bg-accent hidden w-1 cursor-col-resize lg:block",onMouseDown:m=>y({container:s.current,initialClientX:m.clientX,setSplitPercent:c}),onDoubleClick:()=>{c(M(50))},onTouchStart:m=>{const o=m.touches?.[0];o&&y({container:s.current,initialClientX:o.clientX,setSplitPercent:c})}}),e.jsx("div",{className:"flex min-h-[50vh] min-w-0 flex-none lg:min-h-0 lg:flex-1",children:e.jsx(O,{context:{inBrowserBrowserRef:t}})})]})})}),Qe=L(function(){return e.jsx(R,{className:"container flex items-center justify-center",statusHandlers:{404:q}})});export{Qe as ErrorBoundary,Ke as default,ze as meta};
|
|
2
|
+
//# sourceMappingURL=_layout-DR0LQ06M.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_layout-DR0LQ06M.js","sources":["../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/step-mdx.tsx","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/touched-files.tsx","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout.tsx"],"sourcesContent":["import * as React from 'react'\nimport { type PropsWithChildren } from 'react'\nimport {\n\tLink,\n\tuseLoaderData,\n\tuseSearchParams,\n\ttype LinkProps,\n} from 'react-router'\nimport iconsSvg from '#app/assets/icons.svg'\nimport { EpicVideoInfoProvider } from '#app/components/epic-video.tsx'\nimport { Icon } from '#app/components/icons.tsx'\nimport { type InBrowserBrowserRef } from '#app/components/in-browser-browser.tsx'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.tsx'\nimport { LaunchEditor } from '#app/routes/launch-editor.tsx'\nimport { Mdx } from '#app/utils/mdx.tsx'\nimport { cn, getBaseUrl } from '#app/utils/misc.tsx'\nimport { useRequestInfo } from '#app/utils/root-loader.ts'\nimport { type loader } from '../_layout.tsx'\n\ntype StepContextType = {\n\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n}\nconst StepContext = React.createContext<StepContextType | null>(null)\n\nfunction useStepContext() {\n\tconst context = React.useContext(StepContext)\n\tif (!context) {\n\t\tthrow new Error('useStepContext must be used within a StepContextProvider')\n\t}\n\treturn context\n}\n\nfunction StepContextProvider({\n\tchildren,\n\tinBrowserBrowserRef,\n}: {\n\tchildren: React.ReactNode\n\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n}) {\n\treturn <StepContext value={{ inBrowserBrowserRef }}>{children}</StepContext>\n}\n\nconst stepMdxComponents = {\n\tDiffLink,\n\tPrevDiffLink,\n\tNextDiffLink,\n\tInlineFile,\n\tLinkToApp,\n}\n\nexport function StepMdx({\n\tinBrowserBrowserRef,\n}: {\n\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tif (!data.exerciseStepApp.instructionsCode) return null\n\treturn (\n\t\t<StepContextProvider inBrowserBrowserRef={inBrowserBrowserRef}>\n\t\t\t<EpicVideoInfoProvider epicVideoInfosPromise={data.epicVideoInfosPromise}>\n\t\t\t\t<div className=\"prose dark:prose-invert sm:prose-lg\">\n\t\t\t\t\t<Mdx\n\t\t\t\t\t\tcode={data.exerciseStepApp.instructionsCode}\n\t\t\t\t\t\tcomponents={stepMdxComponents}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</EpicVideoInfoProvider>\n\t\t</StepContextProvider>\n\t)\n}\n\nfunction withParam(\n\tsearchParams: URLSearchParams,\n\tkey: string,\n\tvalue: string | null,\n) {\n\tconst newSearchParams = new URLSearchParams(searchParams)\n\tif (value === null) {\n\t\tnewSearchParams.delete(key)\n\t} else {\n\t\tnewSearchParams.set(key, value)\n\t}\n\treturn newSearchParams\n}\n\nfunction NextDiffLink({\n\tapp = 0,\n\tfullPage = false,\n\tchildren,\n}: {\n\tapp: number\n\tfullPage?: boolean\n\tchildren?: React.ReactNode\n}) {\n\treturn (\n\t\t<DiffLink app1={app} app2={app + 1} fullPage={fullPage}>\n\t\t\t{children}\n\t\t</DiffLink>\n\t)\n}\n\nfunction PrevDiffLink({\n\tapp = -1,\n\tfullPage = false,\n\tchildren,\n}: {\n\tapp: number\n\tfullPage?: boolean\n\tchildren?: React.ReactNode\n}) {\n\treturn (\n\t\t<DiffLink app1={app} app2={app + 1} fullPage={fullPage}>\n\t\t\t{children}\n\t\t</DiffLink>\n\t)\n}\n\nfunction DiffLink({\n\tapp1 = 0,\n\tapp2 = 1,\n\tchildren,\n\tfullPage = false,\n\tto,\n}: {\n\tapp1?: string | number | null\n\tapp2?: string | number | null\n\tto?: string\n\tfullPage?: boolean\n\tchildren?: React.ReactNode\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tif (!to && !app1 && !app2) {\n\t\treturn (\n\t\t\t<callout-danger className=\"notification\">\n\t\t\t\t<div className=\"title\">DiffLink Error: invalid input</div>\n\t\t\t</callout-danger>\n\t\t)\n\t}\n\n\tfunction getAppName(input: typeof app1) {\n\t\tif (typeof input === 'number') {\n\t\t\tconst stepIndex = data.exerciseIndex + input\n\t\t\treturn data.allApps[stepIndex]?.name\n\t\t}\n\t\tif (!input) return null\n\t\tfor (const { name, stepName } of data.allApps) {\n\t\t\tif (input === name || input === stepName) {\n\t\t\t\treturn name\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\tif (to) {\n\t\tconst params = new URLSearchParams(to)\n\t\tapp1 = params.get('app1')\n\t\tapp2 = params.get('app2')\n\t}\n\tconst app1Name = getAppName(app1)\n\tconst app2Name = getAppName(app2)\n\tif (!app1Name || !app2Name) {\n\t\treturn (\n\t\t\t<callout-danger className=\"notification\">\n\t\t\t\t<div className=\"title\">DiffLink Error: invalid input</div>\n\t\t\t\t{!app1Name && <div>app1: \"{app1}\" is not a valid app name</div>}\n\t\t\t\t{!app2Name && <div>app2: \"{app2}\" is not a valid app name</div>}\n\t\t\t</callout-danger>\n\t\t)\n\t}\n\n\tif (!to) {\n\t\tto = `app1=${app1Name}&app2=${app2Name}`\n\t}\n\tconst pathToDiff = fullPage\n\t\t? `/diff?${to}`\n\t\t: `?${decodeURIComponent(\n\t\t\t\twithParam(new URLSearchParams(), 'preview', `diff&${to}`).toString(),\n\t\t\t)}`\n\n\tif (!children) {\n\t\tchildren = (\n\t\t\t<span>\n\t\t\t\tGo to Diff {fullPage ? '' : 'Preview'} from: <code>{app1Name}</code> to:{' '}\n\t\t\t\t<code>{app2Name}</code>\n\t\t\t</span>\n\t\t)\n\t}\n\n\treturn <Link to={pathToDiff}>{children}</Link>\n}\n\nfunction InlineFile({\n\tfile,\n\ttype = 'playground',\n\tchildren = <code>{file}</code>,\n\t...props\n}: Omit<PropsWithChildren<typeof LaunchEditor>, 'appName'> & {\n\tfile: string\n\ttype?: 'playground' | 'solution' | 'problem'\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tconst app = data[type] || data[data.type]\n\n\tconst info = (\n\t\t<div className=\"launch-editor-button-wrapper flex underline underline-offset-4\">\n\t\t\t{children}{' '}\n\t\t\t<svg height={24} width={24}>\n\t\t\t\t<use href={`${iconsSvg}#Keyboard`} />\n\t\t\t</svg>\n\t\t</div>\n\t)\n\n\treturn ENV.EPICSHOP_DEPLOYED && app ? (\n\t\t<div className=\"inline-block grow\">\n\t\t\t<LaunchEditor appFile={file} appName={app.name} {...props}>\n\t\t\t\t{info}\n\t\t\t</LaunchEditor>\n\t\t</div>\n\t) : app ? (\n\t\t<div className=\"inline-block grow\">\n\t\t\t<LaunchEditor appFile={file} appName={app.name} {...props}>\n\t\t\t\t{info}\n\t\t\t</LaunchEditor>\n\t\t</div>\n\t) : type === 'playground' ? (\n\t\t// playground does not exist yet\n\t\t<SimpleTooltip content=\"You must 'Set to Playground' before opening a file\">\n\t\t\t<div className=\"inline-block grow cursor-not-allowed\">{info}</div>\n\t\t</SimpleTooltip>\n\t) : (\n\t\t<>children</>\n\t)\n}\n\nfunction getPreviewType(\n\tpreview: string | null,\n): 'playground' | 'problem' | 'solution' {\n\tif (preview === 'problem') return 'problem'\n\tif (preview === 'solution') return 'solution'\n\treturn 'playground'\n}\n\nfunction LinkToApp({\n\tto: appTo,\n\tchildren = <code>{appTo.toString()}</code>,\n\t...props\n}: LinkProps) {\n\tconst [searchParams] = useSearchParams()\n\tconst to = `?${withParam(\n\t\tsearchParams,\n\t\t'pathname',\n\t\tappTo.toString(),\n\t).toString()}`\n\tconst data = useLoaderData<typeof loader>()\n\tconst type = getPreviewType(searchParams.get('preview'))\n\tconst requestInfo = useRequestInfo()\n\tconst app = data[type]\n\tconst previewAppUrl =\n\t\tapp?.dev.type === 'script'\n\t\t\t? getBaseUrl({\n\t\t\t\t\tdomain: requestInfo.domain,\n\t\t\t\t\tport: app.dev.portNumber,\n\t\t\t\t})\n\t\t\t: data.playground?.dev.type === 'browser' ||\n\t\t\t\t data.playground?.dev.type === 'export'\n\t\t\t\t? data.playground.dev.pathname\n\t\t\t\t: null\n\tconst { inBrowserBrowserRef } = useStepContext()\n\tconst href = previewAppUrl\n\t\t? previewAppUrl.slice(0, -1) + appTo.toString()\n\t\t: null\n\treturn (\n\t\t<div className=\"inline-flex items-center justify-between gap-1\">\n\t\t\t<Link\n\t\t\t\tto={to}\n\t\t\t\t{...props}\n\t\t\t\tclassName={cn(props.className, {\n\t\t\t\t\t'cursor-not-allowed': ENV.EPICSHOP_DEPLOYED,\n\t\t\t\t})}\n\t\t\t\ttitle={\n\t\t\t\t\tENV.EPICSHOP_DEPLOYED\n\t\t\t\t\t\t? 'Cannot link to app in deployed version'\n\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t\tonClick={(event) => {\n\t\t\t\t\tif (ENV.EPICSHOP_DEPLOYED) event.preventDefault()\n\n\t\t\t\t\tprops.onClick?.(event)\n\t\t\t\t\tinBrowserBrowserRef.current?.handleExtrnalNavigation(appTo.toString())\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</Link>\n\t\t\t{href ? (\n\t\t\t\t<SimpleTooltip content=\"Open in new tab\">\n\t\t\t\t\t<a\n\t\t\t\t\t\thref={href}\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t\tclassName={cn('flex aspect-square items-center justify-center', {\n\t\t\t\t\t\t\t'cursor-not-allowed': ENV.EPICSHOP_DEPLOYED,\n\t\t\t\t\t\t})}\n\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\tENV.EPICSHOP_DEPLOYED\n\t\t\t\t\t\t\t\t? 'Cannot link to app in deployed version'\n\t\t\t\t\t\t\t\t: 'Open in new tab'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\tif (ENV.EPICSHOP_DEPLOYED) event.preventDefault()\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"ExternalLink\" />\n\t\t\t\t\t</a>\n\t\t\t\t</SimpleTooltip>\n\t\t\t) : null}\n\t\t</div>\n\t)\n}\n","import * as Popover from '@radix-ui/react-popover'\nimport * as React from 'react'\nimport { Await, Link, useLoaderData } from 'react-router'\nimport { Icon } from '#app/components/icons.tsx'\nimport {\n\tOnboardingBadge,\n\tuseOnboardingIndicator,\n} from '#app/components/onboarding-indicator.tsx'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.tsx'\nimport { LaunchEditor } from '#app/routes/launch-editor.tsx'\nimport { SetAppToPlayground } from '#app/routes/set-playground.tsx'\nimport { type Route as LayoutRoute } from '../+types/_layout.tsx'\n\nfunction TouchedFiles({\n\tdiffFilesPromise,\n}: {\n\tdiffFilesPromise: LayoutRoute.ComponentProps['loaderData']['diffFiles']\n}) {\n\tconst data = useLoaderData<LayoutRoute.ComponentProps['loaderData']>()\n\tconst [showFilesBadge, dismissFilesBadge] =\n\t\tuseOnboardingIndicator('files-popover')\n\n\tconst [open, setOpen] = React.useState(false)\n\tconst contentRef = React.useRef<HTMLDivElement>(null)\n\n\tfunction handleOpenChange(isOpen: boolean) {\n\t\tsetOpen(isOpen)\n\t\t// Mark as complete when opening the popover for the first time\n\t\tif (isOpen) {\n\t\t\tdismissFilesBadge()\n\t\t}\n\t}\n\n\tfunction handleLaunchUpdate() {\n\t\tsetOpen(false)\n\t}\n\n\tconst appName = data.playground?.appName\n\n\treturn (\n\t\t<>\n\t\t\t<Popover.Root open={open} onOpenChange={handleOpenChange}>\n\t\t\t\t<Popover.Trigger asChild>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclassName=\"relative flex h-full items-center gap-1 border-r px-6 py-3 font-mono text-sm uppercase\"\n\t\t\t\t\t\taria-label=\"Relevant Files\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"Files\" />\n\t\t\t\t\t\t<span className=\"hidden @min-[640px]:inline\">Files</span>\n\t\t\t\t\t\t{showFilesBadge ? (\n\t\t\t\t\t\t\t<OnboardingBadge tooltip=\"Click to see which files to edit!\" />\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</button>\n\t\t\t\t</Popover.Trigger>\n\t\t\t\t<Popover.Portal>\n\t\t\t\t\t<Popover.Content\n\t\t\t\t\t\tref={contentRef}\n\t\t\t\t\t\tclassName=\"slideRightContent lg:slideUpContent invert-theme bg-background text-foreground z-10 rounded px-9 py-8 select-none\"\n\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\tsideOffset={5}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"launch-editor-wrapper\">\n\t\t\t\t\t\t\t<strong className=\"inline-block px-2 pb-2 font-semibold uppercase\">\n\t\t\t\t\t\t\t\tRelevant Files\n\t\t\t\t\t\t\t</strong>\n\t\t\t\t\t\t\t<p className=\"text-muted-foreground mb-4 max-w-2xs px-2 text-sm\">\n\t\t\t\t\t\t\t\tThese are the files you'll need to modify for this exercise.\n\t\t\t\t\t\t\t\tClick any file to open it directly in your editor at the right\n\t\t\t\t\t\t\t\tlocation.{' '}\n\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\tto=\"/guide#file-links\"\n\t\t\t\t\t\t\t\t\tclassName=\"text-highlight underline\"\n\t\t\t\t\t\t\t\t\tonClick={() => setOpen(false)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tLearn more →\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t{data.problem &&\n\t\t\t\t\t\t\tdata.playground?.appName !== data.problem.name ? (\n\t\t\t\t\t\t\t\t<div className=\"mb-2 rounded p-1 font-mono font-medium\">\n\t\t\t\t\t\t\t\t\t<SetAppToPlayground appName={data.problem.name} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t<div id=\"files\">\n\t\t\t\t\t\t\t\t<React.Suspense\n\t\t\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t\t\t<SimpleTooltip content=\"Loading diff\">\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex justify-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Icon name=\"Refresh\" className=\"h-8 w-8 animate-spin\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</SimpleTooltip>\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<Await\n\t\t\t\t\t\t\t\t\t\tresolve={diffFilesPromise}\n\t\t\t\t\t\t\t\t\t\terrorElement={\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-foreground-destructive\">\n\t\t\t\t\t\t\t\t\t\t\t\tSomething went wrong.\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{(diffFiles) => {\n\t\t\t\t\t\t\t\t\t\t\tif (!diffFiles) {\n\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<p className=\"text-foreground-destructive\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tUnable to determine diff\n\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif (typeof diffFiles === 'string') {\n\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<p className=\"text-foreground-destructive\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{diffFiles}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif (!diffFiles.length) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn <p>No files changed</p>\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tconst props =\n\t\t\t\t\t\t\t\t\t\t\t\tappName || ENV.EPICSHOP_GITHUB_ROOT\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: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"You must 'Set to Playground' before opening a file\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName: 'not-allowed',\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\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<ul {...props}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{diffFiles.length > 1 && !ENV.EPICSHOP_DEPLOYED ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"border-opacity-50 mb-2 border-b border-b-gray-50 pb-2 font-sans\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<LaunchEditor\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tappFile={diffFiles.map(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(file) => `${file.path},${file.line},1`,\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\tappName=\"playground\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonUpdate={handleLaunchUpdate}\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\t\t<p>Open All Files</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</LaunchEditor>\n\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) : null}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{diffFiles.map((file) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<li key={file.path} data-state={file.status}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<LaunchEditor\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tappFile={`${file.path},${file.line},1`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tappName={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tENV.EPICSHOP_DEPLOYED\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? (data.problem?.name ?? 'playground')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'playground'\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\tonUpdate={handleLaunchUpdate}\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\t\t<code>{file.path}</code>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</LaunchEditor>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</li>\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</ul>\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</Await>\n\t\t\t\t\t\t\t\t</React.Suspense>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Popover.Content>\n\t\t\t\t</Popover.Portal>\n\t\t\t</Popover.Root>\n\t\t</>\n\t)\n}\n\nexport default TouchedFiles\n","import { ElementScrollRestoration } from '@epic-web/restore-scroll'\nimport {\n\tgetAppDisplayName,\n\tgetAppPageRoute,\n\tgetApps,\n\tgetExerciseApp,\n\tgetNextExerciseApp,\n\tgetPrevExerciseApp,\n\tisExerciseStepApp,\n\tisPlaygroundApp,\n\trequireExercise,\n\trequireExerciseApp,\n\ttype App,\n\ttype ExerciseStepApp,\n} from '@epic-web/workshop-utils/apps.server'\nimport { getWorkshopConfig } from '@epic-web/workshop-utils/config.server'\nimport { getDiffFiles } from '@epic-web/workshop-utils/diff.server'\nimport { getEpicVideoInfos } from '@epic-web/workshop-utils/epic-api.server'\nimport {\n\tcombineServerTimings,\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport slugify from '@sindresorhus/slugify'\nimport { useRef, useState } from 'react'\nimport {\n\tLink,\n\tOutlet,\n\tdata,\n\tredirect,\n\ttype HeadersFunction,\n} from 'react-router'\nimport { GeneralErrorBoundary } from '#app/components/error-boundary.tsx'\nimport { type InBrowserBrowserRef } from '#app/components/in-browser-browser.tsx'\nimport { NavChevrons } from '#app/components/nav-chevrons.tsx'\nimport { useRevalidationWS } from '#app/components/revalidation-ws.tsx'\nimport { EditFileOnGitHub } from '#app/routes/launch-editor.tsx'\nimport { ProgressToggle } from '#app/routes/progress.tsx'\nimport { SetAppToPlayground } from '#app/routes/set-playground.tsx'\nimport { getExercisePath } from '#app/utils/misc.tsx'\nimport { getRootMatchLoaderData } from '#app/utils/root-loader.ts'\nimport { getSeoMetaTags } from '#app/utils/seo.ts'\nimport {\n\tgetSplitPercentFromRequest,\n\tsetSplitPercentCookie,\n\tstartSplitDrag,\n} from '#app/utils/split-layout.ts'\nimport { getStep404Data } from '../__shared/error-boundary.server.ts'\nimport { Exercise404ErrorBoundary } from '../__shared/error-boundary.tsx'\nimport { type Route } from './+types/_layout.tsx'\nimport { StepMdx } from './__shared/step-mdx.tsx'\nimport TouchedFiles from './__shared/touched-files.tsx'\n\nfunction pageTitle(\n\tdata: Awaited<Route.ComponentProps['loaderData']> | undefined,\n\tworkshopTitle?: string,\n) {\n\tconst exerciseNumber =\n\t\tdata?.exerciseStepApp.exerciseNumber.toString().padStart(2, '0') ?? '00'\n\tconst stepNumber =\n\t\tdata?.exerciseStepApp.stepNumber.toString().padStart(2, '0') ?? '00'\n\tconst emoji = (\n\t\t{\n\t\t\tproblem: '💪',\n\t\t\tsolution: '🏁',\n\t\t} as const\n\t)[data?.type ?? 'problem']\n\tconst title = data?.[data.type]?.title ?? 'N/A'\n\treturn {\n\t\temoji,\n\t\tstepNumber,\n\t\ttitle,\n\t\texerciseNumber,\n\t\texerciseTitle: data?.exerciseTitle ?? 'Unknown exercise',\n\t\tworkshopTitle,\n\t\ttype: data?.type ?? 'problem',\n\t}\n}\n\nexport const meta: Route.MetaFunction = ({ loaderData, matches, params }) => {\n\tconst rootData = getRootMatchLoaderData(matches)\n\tif (!loaderData || !rootData) return [{ title: '🦉 | Error' }]\n\tconst { emoji, stepNumber, title, exerciseNumber, exerciseTitle } =\n\t\tpageTitle(loaderData)\n\n\treturn getSeoMetaTags({\n\t\ttitle: `${emoji} | ${stepNumber}. ${title} | ${exerciseNumber}. ${exerciseTitle} | ${rootData.workshopTitle}`,\n\t\tdescription: `${params.type} step for exercise ${exerciseNumber}. ${exerciseTitle}`,\n\t\togTitle: title,\n\t\togDescription: `${exerciseTitle} step ${Number(stepNumber)} ${params.type}`,\n\t\tinstructor: rootData.instructor,\n\t\trequestInfo: rootData.requestInfo,\n\t})\n}\n\nexport async function loader({ request, params }: Route.LoaderArgs) {\n\tconst timings = makeTimings('exerciseStepTypeLayoutLoader')\n\tconst url = new URL(request.url)\n\tconst { type } = params\n\tconst { title: workshopTitle } = getWorkshopConfig()\n\n\tconst cacheOptions = { request, timings }\n\n\tconst [allAppsFull, problemApp, solutionApp] = await Promise.all([\n\t\tgetApps(cacheOptions),\n\t\tgetExerciseApp({ ...params, type: 'problem' }, cacheOptions),\n\t\tgetExerciseApp({ ...params, type: 'solution' }, cacheOptions),\n\t])\n\n\tconst reqUrl = new URL(request.url)\n\tconst pathnameParam = reqUrl.searchParams.get('pathname')\n\tif (pathnameParam === '' || pathnameParam === '/') {\n\t\treqUrl.searchParams.delete('pathname')\n\t\tthrow redirect(reqUrl.toString())\n\t}\n\n\tif (\n\t\t(type === 'problem' && !problemApp) ||\n\t\t(type === 'solution' && !solutionApp)\n\t) {\n\t\tconst errorData = await getStep404Data({\n\t\t\texerciseNumber: params.exerciseNumber,\n\t\t})\n\t\tthrow Response.json(errorData, { status: 404 })\n\t}\n\n\tconst exerciseStepApp = await requireExerciseApp(params, cacheOptions)\n\n\tconst playgroundApp = allAppsFull.find(isPlaygroundApp)\n\n\tfunction getStepId(a: ExerciseStepApp) {\n\t\treturn (\n\t\t\ta.exerciseNumber * 1000 +\n\t\t\ta.stepNumber * 10 +\n\t\t\t(a.type === 'problem' ? 0 : 1)\n\t\t)\n\t}\n\n\tfunction getStepNameAndId(a: App) {\n\t\tif (isExerciseStepApp(a)) {\n\t\t\tconst exerciseNumberStr = String(a.exerciseNumber).padStart(2, '0')\n\t\t\tconst stepNumberStr = String(a.stepNumber).padStart(2, '0')\n\n\t\t\treturn {\n\t\t\t\tstepName: `${exerciseNumberStr}/${stepNumberStr}.${a.type}`,\n\t\t\t\tstepId: getStepId(a),\n\t\t\t}\n\t\t}\n\t\treturn { stepName: '', stepId: -1 }\n\t}\n\n\tconst allApps = allAppsFull\n\t\t.filter((a, i, ar) => ar.findIndex((b) => a.name === b.name) === i)\n\t\t.map((a) => ({\n\t\t\tdisplayName: getAppDisplayName(a, allAppsFull),\n\t\t\tname: a.name,\n\t\t\ttitle: a.title,\n\t\t\ttype: a.type,\n\t\t\t...getStepNameAndId(a),\n\t\t}))\n\n\tallApps.sort((a, b) => {\n\t\t// order them by their stepId\n\t\tif (a.stepId > 0 && b.stepId > 0) return a.stepId - b.stepId\n\n\t\t// non-step apps should come after step apps\n\t\tif (a.stepId > 0) return -1\n\t\tif (b.stepId > 0) return 1\n\n\t\treturn 0\n\t})\n\tconst exerciseId = getStepId(exerciseStepApp)\n\tconst exerciseIndex = allApps.findIndex((step) => step.stepId === exerciseId)\n\n\t// These depend on exerciseStepApp\n\tconst [exercise, nextApp, prevApp] = await Promise.all([\n\t\trequireExercise(exerciseStepApp.exerciseNumber, cacheOptions),\n\t\tgetNextExerciseApp(exerciseStepApp, cacheOptions),\n\t\tgetPrevExerciseApp(exerciseStepApp, cacheOptions),\n\t])\n\n\tconst exerciseApps = allAppsFull\n\t\t.filter(isExerciseStepApp)\n\t\t.filter((app) => app.exerciseNumber === exerciseStepApp.exerciseNumber)\n\tconst isLastStep =\n\t\texerciseApps[exerciseApps.length - 1]?.name === exerciseStepApp.name\n\tconst isFirstStep = exerciseApps[0]?.name === exerciseStepApp.name\n\n\tconst articleId = `workshop-${slugify(workshopTitle)}-${\n\t\texercise.exerciseNumber\n\t}-${exerciseStepApp.stepNumber}-${exerciseStepApp.type}`\n\n\tconst subroute = url.pathname.split(\n\t\t`/exercise/${params.exerciseNumber}/${params.stepNumber}/${params.type}/`,\n\t)[1]\n\n\t// read persisted split percentage from cookie (10-90, default 50)\n\tconst splitPercent = getSplitPercentFromRequest(request, 50)\n\n\treturn data(\n\t\t{\n\t\t\tarticleId,\n\t\t\ttype: params.type as 'problem' | 'solution',\n\t\t\texerciseStepApp,\n\t\t\texerciseTitle: exercise.title,\n\t\t\tepicVideoInfosPromise: getEpicVideoInfos(exerciseStepApp.epicVideoEmbeds),\n\t\t\texerciseIndex,\n\t\t\tallApps,\n\t\t\tsplitPercent,\n\t\t\tprevStepLink: isFirstStep\n\t\t\t\t? {\n\t\t\t\t\t\tto: `/exercise/${exerciseStepApp.exerciseNumber\n\t\t\t\t\t\t\t.toString()\n\t\t\t\t\t\t\t.padStart(2, '0')}`,\n\t\t\t\t\t}\n\t\t\t\t: prevApp\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tto: getAppPageRoute(prevApp, {\n\t\t\t\t\t\t\t\tsubroute,\n\t\t\t\t\t\t\t\tsearchParams: url.searchParams,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t}\n\t\t\t\t\t: null,\n\t\t\tnextStepLink: isLastStep\n\t\t\t\t? {\n\t\t\t\t\t\tto: `/exercise/${exerciseStepApp.exerciseNumber\n\t\t\t\t\t\t\t.toString()\n\t\t\t\t\t\t\t.padStart(2, '0')}/finished`,\n\t\t\t\t\t}\n\t\t\t\t: nextApp\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tto: getAppPageRoute(nextApp, {\n\t\t\t\t\t\t\t\tsubroute,\n\t\t\t\t\t\t\t\tsearchParams: url.searchParams,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t}\n\t\t\t\t\t: null,\n\t\t\tplayground: playgroundApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'playground',\n\t\t\t\t\t\tappName: playgroundApp.appName,\n\t\t\t\t\t\tname: playgroundApp.name,\n\t\t\t\t\t\tfullPath: playgroundApp.fullPath,\n\t\t\t\t\t\tdev: playgroundApp.dev,\n\t\t\t\t\t\tisUpToDate: playgroundApp.isUpToDate,\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tproblem: problemApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'problem',\n\t\t\t\t\t\ttitle: problemApp.title,\n\t\t\t\t\t\tname: problemApp.name,\n\t\t\t\t\t\tfullPath: problemApp.fullPath,\n\t\t\t\t\t\tdev: problemApp.dev,\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tsolution: solutionApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'solution',\n\t\t\t\t\t\ttitle: solutionApp.title,\n\t\t\t\t\t\tname: solutionApp.name,\n\t\t\t\t\t\tfullPath: solutionApp.fullPath,\n\t\t\t\t\t\tdev: solutionApp.dev,\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tdiffFiles:\n\t\t\t\tproblemApp && solutionApp\n\t\t\t\t\t? getDiffFiles(problemApp, solutionApp, {\n\t\t\t\t\t\t\t...cacheOptions,\n\t\t\t\t\t\t\tforceFresh: url.searchParams.get('forceFresh') === 'diff',\n\t\t\t\t\t\t}).catch((e) => {\n\t\t\t\t\t\t\tconsole.error(e)\n\t\t\t\t\t\t\treturn 'There was a problem generating the diff (check the terminal output)'\n\t\t\t\t\t\t})\n\t\t\t\t\t: 'No diff available',\n\t\t} as const,\n\t\t{\n\t\t\theaders: {\n\t\t\t\t'Server-Timing': getServerTimeHeader(timings),\n\t\t\t},\n\t\t},\n\t)\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders, parentHeaders }) => {\n\tconst headers = {\n\t\t'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nexport default function ExercisePartRoute({\n\tloaderData: data,\n}: Route.ComponentProps) {\n\tconst inBrowserBrowserRef = useRef<InBrowserBrowserRef>(null)\n\tconst containerRef = useRef<HTMLDivElement>(null)\n\tconst leftPaneRef = useRef<HTMLDivElement>(null)\n\tconst [splitPercent, setSplitPercent] = useState<number>(data.splitPercent)\n\n\tconst titleBits = pageTitle(data)\n\n\tuseRevalidationWS({\n\t\twatchPaths: [`${data.exerciseStepApp.relativePath}/README.mdx`],\n\t})\n\n\tconst showPlaygroundIndicator = data.problem\n\t\t? data.playground?.appName !== data.problem.name\n\t\t: false\n\n\treturn (\n\t\t<div className=\"flex max-w-full grow flex-col\">\n\t\t\t<main\n\t\t\t\tref={containerRef}\n\t\t\t\tclassName=\"flex grow flex-col overflow-y-auto sm:h-full sm:min-h-[800px] md:min-h-[unset] lg:flex-row lg:overflow-y-hidden\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"relative flex min-w-0 flex-none basis-auto flex-col sm:col-span-1 sm:row-span-1 lg:h-full lg:basis-(--split-pct)\"\n\t\t\t\t\tstyle={{ ['--split-pct' as any]: `${splitPercent}%` }}\n\t\t\t\t\tref={leftPaneRef}\n\t\t\t\t>\n\t\t\t\t\t<h1 className=\"@container h-14 border-b pr-5 pl-10 text-sm leading-tight font-medium\">\n\t\t\t\t\t\t<div className=\"flex h-14 items-center justify-between gap-x-2 py-2 whitespace-nowrap\">\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-start gap-x-2 uppercase\">\n\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\tto={getExercisePath(data.exerciseStepApp.exerciseNumber)}\n\t\t\t\t\t\t\t\t\tclassName=\"hover:underline\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span>{titleBits.exerciseNumber}.</span>\n\t\t\t\t\t\t\t\t\t<span className=\"hidden @min-[500px]:inline\">\n\t\t\t\t\t\t\t\t\t\t{' '}\n\t\t\t\t\t\t\t\t\t\t{titleBits.exerciseTitle}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t<span>/</span>\n\t\t\t\t\t\t\t\t<Link to=\".\" className=\"hover:underline\">\n\t\t\t\t\t\t\t\t\t<span>{titleBits.stepNumber}.</span>\n\t\t\t\t\t\t\t\t\t<span className=\"hidden @min-[300px]:inline\">\n\t\t\t\t\t\t\t\t\t\t{' '}\n\t\t\t\t\t\t\t\t\t\t{titleBits.title}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<span> ({titleBits.emoji}</span>\n\t\t\t\t\t\t\t\t\t<span className=\"hidden @min-[400px]:inline\">\n\t\t\t\t\t\t\t\t\t\t{' '}\n\t\t\t\t\t\t\t\t\t\t{titleBits.type}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<span>)</span>\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{data.problem &&\n\t\t\t\t\t\t\t(data.playground?.appName !== data.problem.name ||\n\t\t\t\t\t\t\t\t!data.playground?.isUpToDate) ? (\n\t\t\t\t\t\t\t\t<SetAppToPlayground\n\t\t\t\t\t\t\t\t\tappName={data.problem.name}\n\t\t\t\t\t\t\t\t\tisOutdated={data.playground?.isUpToDate === false}\n\t\t\t\t\t\t\t\t\thideTextOnNarrow\n\t\t\t\t\t\t\t\t\tshowOnboardingIndicator={showPlaygroundIndicator}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</h1>\n\t\t\t\t\t<article\n\t\t\t\t\t\tid={data.articleId}\n\t\t\t\t\t\tkey={data.articleId}\n\t\t\t\t\t\tclassName=\"shadow-on-scrollbox scrollbar-thin scrollbar-thumb-scrollbar flex w-full max-w-none scroll-pt-6 flex-col justify-between space-y-6 p-2 sm:p-10 sm:pt-8 lg:h-full lg:flex-1 lg:overflow-y-auto\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{data.exerciseStepApp.instructionsCode ? (\n\t\t\t\t\t\t\t<StepMdx inBrowserBrowserRef={inBrowserBrowserRef} />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div className=\"flex h-full items-center justify-center text-lg\">\n\t\t\t\t\t\t\t\t<p>No instructions yet...</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<div className=\"mt-auto flex justify-between\">\n\t\t\t\t\t\t\t{data.prevStepLink ? (\n\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\tto={data.prevStepLink.to}\n\t\t\t\t\t\t\t\t\taria-label=\"Previous Step\"\n\t\t\t\t\t\t\t\t\tdata-keyboard-action=\"g+p\"\n\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span aria-hidden>←</span>\n\t\t\t\t\t\t\t\t\t<span className=\"hidden xl:inline\"> Previous</span>\n\t\t\t\t\t\t\t\t</Link>\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)}\n\t\t\t\t\t\t\t{data.nextStepLink ? (\n\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\tto={data.nextStepLink.to}\n\t\t\t\t\t\t\t\t\taria-label=\"Next Step\"\n\t\t\t\t\t\t\t\t\tdata-keyboard-action=\"g+n\"\n\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span className=\"hidden xl:inline\">Next </span>\n\t\t\t\t\t\t\t\t\t<span aria-hidden>→</span>\n\t\t\t\t\t\t\t\t</Link>\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)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</article>\n\t\t\t\t\t<ElementScrollRestoration\n\t\t\t\t\t\telementQuery={`#${data.articleId}`}\n\t\t\t\t\t\tkey={`scroll-${data.articleId}`}\n\t\t\t\t\t/>\n\t\t\t\t\t{data.type === 'solution' ? (\n\t\t\t\t\t\t<ProgressToggle\n\t\t\t\t\t\t\ttype=\"step\"\n\t\t\t\t\t\t\texerciseNumber={data.exerciseStepApp.exerciseNumber}\n\t\t\t\t\t\t\tstepNumber={data.exerciseStepApp.stepNumber}\n\t\t\t\t\t\t\tclassName=\"h-14 border-t px-6\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<div className=\"@container flex h-16 justify-between border-t border-b-4 lg:border-b-0\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<div className=\"h-full\">\n\t\t\t\t\t\t\t\t<TouchedFiles diffFilesPromise={data.diffFiles} />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<EditFileOnGitHub\n\t\t\t\t\t\t\tappName={data.exerciseStepApp.name}\n\t\t\t\t\t\t\trelativePath={`${data.exerciseStepApp.relativePath}/README.mdx`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<NavChevrons\n\t\t\t\t\t\t\tprev={\n\t\t\t\t\t\t\t\tdata.prevStepLink\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\tto: data.prevStepLink.to,\n\t\t\t\t\t\t\t\t\t\t\t'aria-label': 'Previous Step',\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnext={\n\t\t\t\t\t\t\t\tdata.nextStepLink\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\tto: data.nextStepLink.to,\n\t\t\t\t\t\t\t\t\t\t\t'aria-label': 'Next Step',\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\trole=\"separator\"\n\t\t\t\t\taria-orientation=\"vertical\"\n\t\t\t\t\ttitle=\"Drag to resize\"\n\t\t\t\t\tclassName=\"bg-border hover:bg-accent hidden w-1 cursor-col-resize lg:block\"\n\t\t\t\t\tonMouseDown={(event) =>\n\t\t\t\t\t\tstartSplitDrag({\n\t\t\t\t\t\t\tcontainer: containerRef.current,\n\t\t\t\t\t\t\tinitialClientX: event.clientX,\n\t\t\t\t\t\t\tsetSplitPercent,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\tonDoubleClick={() => {\n\t\t\t\t\t\tsetSplitPercent(setSplitPercentCookie(50))\n\t\t\t\t\t}}\n\t\t\t\t\tonTouchStart={(event) => {\n\t\t\t\t\t\tconst firstTouch = event.touches?.[0]\n\t\t\t\t\t\tif (!firstTouch) return\n\t\t\t\t\t\tstartSplitDrag({\n\t\t\t\t\t\t\tcontainer: containerRef.current,\n\t\t\t\t\t\t\tinitialClientX: firstTouch.clientX,\n\t\t\t\t\t\t\tsetSplitPercent,\n\t\t\t\t\t\t})\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t<div className=\"flex min-h-[50vh] min-w-0 flex-none lg:min-h-0 lg:flex-1\">\n\t\t\t\t\t<Outlet context={{ inBrowserBrowserRef }} />\n\t\t\t\t</div>\n\t\t\t</main>\n\t\t</div>\n\t)\n}\n\nexport function ErrorBoundary() {\n\treturn (\n\t\t<GeneralErrorBoundary\n\t\t\tclassName=\"container flex items-center justify-center\"\n\t\t\tstatusHandlers={{\n\t\t\t\t404: Exercise404ErrorBoundary,\n\t\t\t}}\n\t\t/>\n\t)\n}\n"],"names":["StepContext","React.createContext","useStepContext","context","React.useContext","StepContextProvider","children","inBrowserBrowserRef","stepMdxComponents","DiffLink","PrevDiffLink","NextDiffLink","InlineFile","LinkToApp","StepMdx","data","useLoaderData","jsx","EpicVideoInfoProvider","Mdx","withParam","searchParams","key","value","newSearchParams","app","fullPage","app1","app2","to","getAppName","input","stepIndex","name","stepName","params","app1Name","app2Name","jsxs","pathToDiff","Link","file","type","props","info","iconsSvg","LaunchEditor","SimpleTooltip","getPreviewType","preview","appTo","useSearchParams","requestInfo","useRequestInfo","previewAppUrl","getBaseUrl","href","cn","event","Icon","TouchedFiles","diffFilesPromise","showFilesBadge","dismissFilesBadge","useOnboardingIndicator","open","setOpen","React.useState","contentRef","React.useRef","handleOpenChange","isOpen","handleLaunchUpdate","appName","Popover.Root","Popover.Trigger","OnboardingBadge","Popover.Portal","Popover.Content","SetAppToPlayground","React.Suspense","Await","diffFiles","pageTitle","workshopTitle","exerciseNumber","exerciseStepApp","toString","padStart","stepNumber","emoji","problem","solution","title","exerciseTitle","meta","loaderData","matches","rootData","getRootMatchLoaderData","getSeoMetaTags","description","ogTitle","ogDescription","Number","instructor","_layout","_UNSAFE_withComponentProps","useRef","containerRef","leftPaneRef","splitPercent","setSplitPercent","useState","titleBits","useRevalidationWS","watchPaths","relativePath","showPlaygroundIndicator","playground","className","ref","style","getExercisePath","isUpToDate","isOutdated","hideTextOnNarrow","showOnboardingIndicator","id","articleId","instructionsCode","prevStepLink","prefetch","nextStepLink","ElementScrollRestoration","elementQuery","ProgressToggle","EditFileOnGitHub","NavChevrons","prev","next","role","onMouseDown","startSplitDrag","container","current","initialClientX","clientX","onDoubleClick","setSplitPercentCookie","onTouchStart","firstTouch","touches","Outlet","ErrorBoundary","_UNSAFE_withErrorBoundaryProps","GeneralErrorBoundary","statusHandlers","Exercise404ErrorBoundary"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as p,R as f}from"./index-CqIc3cxq.js";import{j as a}from"./jsx-runtime-C5WNSv3b.js";import{
|
|
2
|
-
//# sourceMappingURL=accordion-
|
|
1
|
+
import{r as p,R as f}from"./index-CqIc3cxq.js";import{j as a}from"./jsx-runtime-C5WNSv3b.js";import{a as G,u as M,b as U,P as I,e as z,f as pe,d as q,n as ue}from"./tooltip-Tlsyx2YO.js";import{g as fe,u as me}from"./index-CJDOQ1bl.js";import{a as V,I as j}from"./misc-W4055b-0.js";var w="Collapsible",[xe,Y]=G(w),[he,B]=xe(w),J=p.forwardRef((o,t)=>{const{__scopeCollapsible:e,open:r,defaultOpen:n,disabled:s,onOpenChange:i,...c}=o,[d,u]=M({prop:r,defaultProp:n??!1,onChange:i,caller:w});return a.jsx(he,{scope:e,disabled:s,contentId:U(),open:d,onOpenToggle:p.useCallback(()=>u(m=>!m),[u]),children:a.jsx(I.div,{"data-state":H(d),"data-disabled":s?"":void 0,...c,ref:t})})});J.displayName=w;var Q="CollapsibleTrigger",W=p.forwardRef((o,t)=>{const{__scopeCollapsible:e,...r}=o,n=B(Q,e);return a.jsx(I.button,{type:"button","aria-controls":n.contentId,"aria-expanded":n.open||!1,"data-state":H(n.open),"data-disabled":n.disabled?"":void 0,disabled:n.disabled,...r,ref:t,onClick:z(o.onClick,n.onOpenToggle)})});W.displayName=Q;var L="CollapsibleContent",X=p.forwardRef((o,t)=>{const{forceMount:e,...r}=o,n=B(L,o.__scopeCollapsible);return a.jsx(pe,{present:e||n.open,children:({present:s})=>a.jsx(Ce,{...r,ref:t,present:s})})});X.displayName=L;var Ce=p.forwardRef((o,t)=>{const{__scopeCollapsible:e,present:r,children:n,...s}=o,i=B(L,e),[c,d]=p.useState(r),u=p.useRef(null),m=q(t,u),x=p.useRef(0),A=x.current,C=p.useRef(0),y=C.current,v=i.open||c,b=p.useRef(v),g=p.useRef(void 0);return p.useEffect(()=>{const l=requestAnimationFrame(()=>b.current=!1);return()=>cancelAnimationFrame(l)},[]),ue(()=>{const l=u.current;if(l){g.current=g.current||{transitionDuration:l.style.transitionDuration,animationName:l.style.animationName},l.style.transitionDuration="0s",l.style.animationName="none";const R=l.getBoundingClientRect();x.current=R.height,C.current=R.width,b.current||(l.style.transitionDuration=g.current.transitionDuration,l.style.animationName=g.current.animationName),d(r)}},[i.open,r]),a.jsx(I.div,{"data-state":H(i.open),"data-disabled":i.disabled?"":void 0,id:i.contentId,hidden:!v,...s,ref:m,style:{"--radix-collapsible-content-height":A?`${A}px`:void 0,"--radix-collapsible-content-width":y?`${y}px`:void 0,...o.style},children:v&&n})});function H(o){return o?"open":"closed"}var ve=J,be=W,ge=X,h="Accordion",Ae=["Home","End","ArrowDown","ArrowUp","ArrowLeft","ArrowRight"],[K,Re,je]=fe(h),[_]=G(h,[je,Y]),$=Y(),Z=f.forwardRef((o,t)=>{const{type:e,...r}=o,n=r,s=r;return a.jsx(K.Provider,{scope:o.__scopeAccordion,children:e==="multiple"?a.jsx(we,{...s,ref:t}):a.jsx(Ne,{...n,ref:t})})});Z.displayName=h;var[ee,Ie]=_(h),[oe,ye]=_(h,{collapsible:!1}),Ne=f.forwardRef((o,t)=>{const{value:e,defaultValue:r,onValueChange:n=()=>{},collapsible:s=!1,...i}=o,[c,d]=M({prop:e,defaultProp:r??"",onChange:n,caller:h});return a.jsx(ee,{scope:o.__scopeAccordion,value:f.useMemo(()=>c?[c]:[],[c]),onItemOpen:d,onItemClose:f.useCallback(()=>s&&d(""),[s,d]),children:a.jsx(oe,{scope:o.__scopeAccordion,collapsible:s,children:a.jsx(te,{...i,ref:t})})})}),we=f.forwardRef((o,t)=>{const{value:e,defaultValue:r,onValueChange:n=()=>{},...s}=o,[i,c]=M({prop:e,defaultProp:r??[],onChange:n,caller:h}),d=f.useCallback(m=>c((x=[])=>[...x,m]),[c]),u=f.useCallback(m=>c((x=[])=>x.filter(A=>A!==m)),[c]);return a.jsx(ee,{scope:o.__scopeAccordion,value:i,onItemOpen:d,onItemClose:u,children:a.jsx(oe,{scope:o.__scopeAccordion,collapsible:!0,children:a.jsx(te,{...s,ref:t})})})}),[_e,E]=_(h),te=f.forwardRef((o,t)=>{const{__scopeAccordion:e,disabled:r,dir:n,orientation:s="vertical",...i}=o,c=f.useRef(null),d=q(c,t),u=Re(e),x=me(n)==="ltr",A=z(o.onKeyDown,C=>{if(!Ae.includes(C.key))return;const y=C.target,v=u().filter(k=>!k.ref.current?.disabled),b=v.findIndex(k=>k.ref.current===y),g=v.length;if(b===-1)return;C.preventDefault();let l=b;const R=0,P=g-1,D=()=>{l=b+1,l>P&&(l=R)},S=()=>{l=b-1,l<R&&(l=P)};switch(C.key){case"Home":l=R;break;case"End":l=P;break;case"ArrowRight":s==="horizontal"&&(x?D():S());break;case"ArrowDown":s==="vertical"&&D();break;case"ArrowLeft":s==="horizontal"&&(x?S():D());break;case"ArrowUp":s==="vertical"&&S();break}const de=l%g;v[de].ref.current?.focus()});return a.jsx(_e,{scope:e,disabled:r,direction:n,orientation:s,children:a.jsx(K.Slot,{scope:e,children:a.jsx(I.div,{...i,"data-orientation":s,ref:d,onKeyDown:r?void 0:A})})})}),N="AccordionItem",[Ee,F]=_(N),re=f.forwardRef((o,t)=>{const{__scopeAccordion:e,value:r,...n}=o,s=E(N,e),i=Ie(N,e),c=$(e),d=U(),u=r&&i.value.includes(r)||!1,m=s.disabled||o.disabled;return a.jsx(Ee,{scope:e,open:u,disabled:m,triggerId:d,children:a.jsx(ve,{"data-orientation":s.orientation,"data-state":le(u),...c,...n,ref:t,disabled:m,open:u,onOpenChange:x=>{x?i.onItemOpen(r):i.onItemClose(r)}})})});re.displayName=N;var ne="AccordionHeader",ae=f.forwardRef((o,t)=>{const{__scopeAccordion:e,...r}=o,n=E(h,e),s=F(ne,e);return a.jsx(I.h3,{"data-orientation":n.orientation,"data-state":le(s.open),"data-disabled":s.disabled?"":void 0,...r,ref:t})});ae.displayName=ne;var T="AccordionTrigger",se=f.forwardRef((o,t)=>{const{__scopeAccordion:e,...r}=o,n=E(h,e),s=F(T,e),i=ye(T,e),c=$(e);return a.jsx(K.ItemSlot,{scope:e,children:a.jsx(be,{"aria-disabled":s.open&&!i.collapsible||void 0,"data-orientation":n.orientation,id:s.triggerId,...c,...r,ref:t})})});se.displayName=T;var ie="AccordionContent",ce=f.forwardRef((o,t)=>{const{__scopeAccordion:e,...r}=o,n=E(h,e),s=F(ie,e),i=$(e);return a.jsx(ge,{role:"region","aria-labelledby":s.triggerId,"data-orientation":n.orientation,...i,...r,ref:t,style:{"--radix-accordion-content-height":"var(--radix-collapsible-content-height)","--radix-accordion-content-width":"var(--radix-collapsible-content-width)",...o.style}})});ce.displayName=ie;function le(o){return o?"open":"closed"}var Fe=Z,Pe=re,De=ae,Se=se,ke=ce;const Oe=p.createContext(null),O={didCatch:!1,error:null};class Ge extends p.Component{constructor(t){super(t),this.resetErrorBoundary=this.resetErrorBoundary.bind(this),this.state=O}static getDerivedStateFromError(t){return{didCatch:!0,error:t}}resetErrorBoundary(...t){const{error:e}=this.state;e!==null&&(this.props.onReset?.({args:t,reason:"imperative-api"}),this.setState(O))}componentDidCatch(t,e){this.props.onError?.(t,e)}componentDidUpdate(t,e){const{didCatch:r}=this.state,{resetKeys:n}=this.props;r&&e.error!==null&&Te(t.resetKeys,n)&&(this.props.onReset?.({next:n,prev:t.resetKeys,reason:"keys"}),this.setState(O))}render(){const{children:t,fallbackRender:e,FallbackComponent:r,fallback:n}=this.props,{didCatch:s,error:i}=this.state;let c=t;if(s){const d={error:i,resetErrorBoundary:this.resetErrorBoundary};if(typeof e=="function")c=e(d);else if(r)c=p.createElement(r,d);else if(n!==void 0)c=n;else throw i}return p.createElement(Oe.Provider,{value:{didCatch:s,error:i,resetErrorBoundary:this.resetErrorBoundary}},c)}}function Te(o=[],t=[]){return o.length!==t.length||o.some((e,r)=>!Object.is(e,t[r]))}const Ue=({title:o,children:t,variant:e,icon:r,forceMount:n=!1})=>{const s=()=>{switch(e){case"changed":return a.jsx(j,{name:"Modified","aria-label":"Modified",className:"text-[#fb923c]"});case"renamed":return a.jsx(j,{name:"Renamed","aria-label":"Renamed",className:"text-[#fb923c]"});case"added":return a.jsx(j,{name:"Added","aria-label":"Added",className:"text-[#10b981]"});case"deleted":return a.jsx(j,{name:"Deleted","aria-label":"Deleted",className:"text-[#ef4444]"});default:return a.jsx(j,{name:"Modified","aria-label":"Modified",className:"text-[#fb923c]"})}},i=()=>{switch(e){case"changed":return"modified";default:return e}},c=o.replace(/\\\\/g,"\\");return a.jsxs(Pe,{value:o,children:[a.jsxs(Me,{variant:i(),children:[r||s()," ",c]}),a.jsx(Ve,{forceMount:n,className:V("prose dark:prose-invert prose-pre:m-0 prose-pre:mb-1 prose-pre:rounded-none max-w-none whitespace-pre-wrap",{"radix-state-closed:hidden":n}),children:t})]})},Me=({ref:o,children:t,className:e,variant:r,...n})=>a.jsx(De,{className:"flex",asChild:!0,children:a.jsxs(Se,{className:V("group hover:bg-foreground/20 flex w-full items-center justify-between border-b p-4 pr-3 font-mono text-sm leading-none font-medium",e),...n,ref:o,children:[a.jsx("div",{className:"flex items-center gap-1.5",children:t}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-muted-foreground font-mono text-xs font-normal uppercase",children:r}),a.jsx(j,{name:"TriangleDownSmall",className:"group-radix-state-open:rotate-180 transition","aria-hidden":!0})]})]})}),Ve=({ref:o,children:t,className:e,...r})=>a.jsx(ke,{className:V("",e),...r,ref:o,children:a.jsx("div",{children:t})});export{Ue as A,Fe as R,Ge as m};
|
|
2
|
+
//# sourceMappingURL=accordion-CQ7oujC6.js.map
|