@epic-web/workshop-app 6.69.0 → 6.70.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-DNg1F_Vn.js} +2 -2
- package/build/client/assets/{_exerciseNumber-77g7-L-x.js.map → _exerciseNumber-DNg1F_Vn.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-BmUlhiS8.js} +2 -2
- package/build/client/assets/_exerciseNumber_.finished-BmUlhiS8.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-BLOYb3Iq.js +2 -0
- package/build/client/assets/_layout-BLOYb3Iq.js.map +1 -0
- package/build/client/assets/_layout-C-j5TKNx.js +2 -0
- package/build/client/assets/_layout-C-j5TKNx.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-Cr3pXmrH.js} +2 -2
- package/build/client/assets/{finished-CmV4aFjA.js.map → finished-Cr3pXmrH.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/index-AMZhCeTP.js +2 -0
- package/build/client/assets/index-AMZhCeTP.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-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-hhQHCvb9.js +2 -0
- package/build/client/assets/{index-EdNV8gTk.js.map → index-hhQHCvb9.js.map} +1 -1
- package/build/client/assets/{index-B-9GR1C2.js → index-wDjETrF-.js} +2 -2
- package/build/client/assets/{index-B-9GR1C2.js.map → index-wDjETrF-.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-e2f9a54b.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-By6-_9Ii.js} +2 -2
- package/build/client/assets/{progress-fKsNxmmt.js.map → progress-By6-_9Ii.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-BkPGxm0k.js} +2 -2
- package/build/client/assets/{root-Ch373D3a.js.map → root-BkPGxm0k.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/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 +443 -111
- 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/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/test-CdEKoDoS.js +0 -2
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_layout-yxOoJ6Yg.js","sources":["../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/step-mdx.tsx","../../../../../node_modules/@radix-ui/react-popover/dist/index.mjs","../../../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","\"use client\";\n\n// src/popover.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { useFocusGuards } from \"@radix-ui/react-focus-guards\";\nimport { FocusScope } from \"@radix-ui/react-focus-scope\";\nimport { useId } from \"@radix-ui/react-id\";\nimport * as PopperPrimitive from \"@radix-ui/react-popper\";\nimport { createPopperScope } from \"@radix-ui/react-popper\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { createSlot } from \"@radix-ui/react-slot\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { hideOthers } from \"aria-hidden\";\nimport { RemoveScroll } from \"react-remove-scroll\";\nimport { jsx } from \"react/jsx-runtime\";\nvar POPOVER_NAME = \"Popover\";\nvar [createPopoverContext, createPopoverScope] = createContextScope(POPOVER_NAME, [\n createPopperScope\n]);\nvar usePopperScope = createPopperScope();\nvar [PopoverProvider, usePopoverContext] = createPopoverContext(POPOVER_NAME);\nvar Popover = (props) => {\n const {\n __scopePopover,\n children,\n open: openProp,\n defaultOpen,\n onOpenChange,\n modal = false\n } = props;\n const popperScope = usePopperScope(__scopePopover);\n const triggerRef = React.useRef(null);\n const [hasCustomAnchor, setHasCustomAnchor] = React.useState(false);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: POPOVER_NAME\n });\n return /* @__PURE__ */ jsx(PopperPrimitive.Root, { ...popperScope, children: /* @__PURE__ */ jsx(\n PopoverProvider,\n {\n scope: __scopePopover,\n contentId: useId(),\n triggerRef,\n open,\n onOpenChange: setOpen,\n onOpenToggle: React.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]),\n hasCustomAnchor,\n onCustomAnchorAdd: React.useCallback(() => setHasCustomAnchor(true), []),\n onCustomAnchorRemove: React.useCallback(() => setHasCustomAnchor(false), []),\n modal,\n children\n }\n ) });\n};\nPopover.displayName = POPOVER_NAME;\nvar ANCHOR_NAME = \"PopoverAnchor\";\nvar PopoverAnchor = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...anchorProps } = props;\n const context = usePopoverContext(ANCHOR_NAME, __scopePopover);\n const popperScope = usePopperScope(__scopePopover);\n const { onCustomAnchorAdd, onCustomAnchorRemove } = context;\n React.useEffect(() => {\n onCustomAnchorAdd();\n return () => onCustomAnchorRemove();\n }, [onCustomAnchorAdd, onCustomAnchorRemove]);\n return /* @__PURE__ */ jsx(PopperPrimitive.Anchor, { ...popperScope, ...anchorProps, ref: forwardedRef });\n }\n);\nPopoverAnchor.displayName = ANCHOR_NAME;\nvar TRIGGER_NAME = \"PopoverTrigger\";\nvar PopoverTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...triggerProps } = props;\n const context = usePopoverContext(TRIGGER_NAME, __scopePopover);\n const popperScope = usePopperScope(__scopePopover);\n const composedTriggerRef = useComposedRefs(forwardedRef, context.triggerRef);\n const trigger = /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": context.open,\n \"aria-controls\": context.contentId,\n \"data-state\": getState(context.open),\n ...triggerProps,\n ref: composedTriggerRef,\n onClick: composeEventHandlers(props.onClick, context.onOpenToggle)\n }\n );\n return context.hasCustomAnchor ? trigger : /* @__PURE__ */ jsx(PopperPrimitive.Anchor, { asChild: true, ...popperScope, children: trigger });\n }\n);\nPopoverTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"PopoverPortal\";\nvar [PortalProvider, usePortalContext] = createPopoverContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar PopoverPortal = (props) => {\n const { __scopePopover, forceMount, children, container } = props;\n const context = usePopoverContext(PORTAL_NAME, __scopePopover);\n return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopePopover, forceMount, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, container, children }) }) });\n};\nPopoverPortal.displayName = PORTAL_NAME;\nvar CONTENT_NAME = \"PopoverContent\";\nvar PopoverContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopePopover);\n const { forceMount = portalContext.forceMount, ...contentProps } = props;\n const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: context.modal ? /* @__PURE__ */ jsx(PopoverContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(PopoverContentNonModal, { ...contentProps, ref: forwardedRef }) });\n }\n);\nPopoverContent.displayName = CONTENT_NAME;\nvar Slot = createSlot(\"PopoverContent.RemoveScroll\");\nvar PopoverContentModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, contentRef);\n const isRightClickOutsideRef = React.useRef(false);\n React.useEffect(() => {\n const content = contentRef.current;\n if (content) return hideOthers(content);\n }, []);\n return /* @__PURE__ */ jsx(RemoveScroll, { as: Slot, allowPinchZoom: true, children: /* @__PURE__ */ jsx(\n PopoverContentImpl,\n {\n ...props,\n ref: composedRefs,\n trapFocus: context.open,\n disableOutsidePointerEvents: true,\n onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {\n event.preventDefault();\n if (!isRightClickOutsideRef.current) context.triggerRef.current?.focus();\n }),\n onPointerDownOutside: composeEventHandlers(\n props.onPointerDownOutside,\n (event) => {\n const originalEvent = event.detail.originalEvent;\n const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;\n const isRightClick = originalEvent.button === 2 || ctrlLeftClick;\n isRightClickOutsideRef.current = isRightClick;\n },\n { checkForDefaultPrevented: false }\n ),\n onFocusOutside: composeEventHandlers(\n props.onFocusOutside,\n (event) => event.preventDefault(),\n { checkForDefaultPrevented: false }\n )\n }\n ) });\n }\n);\nvar PopoverContentNonModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);\n const hasInteractedOutsideRef = React.useRef(false);\n const hasPointerDownOutsideRef = React.useRef(false);\n return /* @__PURE__ */ jsx(\n PopoverContentImpl,\n {\n ...props,\n ref: forwardedRef,\n trapFocus: false,\n disableOutsidePointerEvents: false,\n onCloseAutoFocus: (event) => {\n props.onCloseAutoFocus?.(event);\n if (!event.defaultPrevented) {\n if (!hasInteractedOutsideRef.current) context.triggerRef.current?.focus();\n event.preventDefault();\n }\n hasInteractedOutsideRef.current = false;\n hasPointerDownOutsideRef.current = false;\n },\n onInteractOutside: (event) => {\n props.onInteractOutside?.(event);\n if (!event.defaultPrevented) {\n hasInteractedOutsideRef.current = true;\n if (event.detail.originalEvent.type === \"pointerdown\") {\n hasPointerDownOutsideRef.current = true;\n }\n }\n const target = event.target;\n const targetIsTrigger = context.triggerRef.current?.contains(target);\n if (targetIsTrigger) event.preventDefault();\n if (event.detail.originalEvent.type === \"focusin\" && hasPointerDownOutsideRef.current) {\n event.preventDefault();\n }\n }\n }\n );\n }\n);\nvar PopoverContentImpl = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopePopover,\n trapFocus,\n onOpenAutoFocus,\n onCloseAutoFocus,\n disableOutsidePointerEvents,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onInteractOutside,\n ...contentProps\n } = props;\n const context = usePopoverContext(CONTENT_NAME, __scopePopover);\n const popperScope = usePopperScope(__scopePopover);\n useFocusGuards();\n return /* @__PURE__ */ jsx(\n FocusScope,\n {\n asChild: true,\n loop: true,\n trapped: trapFocus,\n onMountAutoFocus: onOpenAutoFocus,\n onUnmountAutoFocus: onCloseAutoFocus,\n children: /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n asChild: true,\n disableOutsidePointerEvents,\n onInteractOutside,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onDismiss: () => context.onOpenChange(false),\n children: /* @__PURE__ */ jsx(\n PopperPrimitive.Content,\n {\n \"data-state\": getState(context.open),\n role: \"dialog\",\n id: context.contentId,\n ...popperScope,\n ...contentProps,\n ref: forwardedRef,\n style: {\n ...contentProps.style,\n // re-namespace exposed content custom properties\n ...{\n \"--radix-popover-content-transform-origin\": \"var(--radix-popper-transform-origin)\",\n \"--radix-popover-content-available-width\": \"var(--radix-popper-available-width)\",\n \"--radix-popover-content-available-height\": \"var(--radix-popper-available-height)\",\n \"--radix-popover-trigger-width\": \"var(--radix-popper-anchor-width)\",\n \"--radix-popover-trigger-height\": \"var(--radix-popper-anchor-height)\"\n }\n }\n }\n )\n }\n )\n }\n );\n }\n);\nvar CLOSE_NAME = \"PopoverClose\";\nvar PopoverClose = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...closeProps } = props;\n const context = usePopoverContext(CLOSE_NAME, __scopePopover);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n ...closeProps,\n ref: forwardedRef,\n onClick: composeEventHandlers(props.onClick, () => context.onOpenChange(false))\n }\n );\n }\n);\nPopoverClose.displayName = CLOSE_NAME;\nvar ARROW_NAME = \"PopoverArrow\";\nvar PopoverArrow = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...arrowProps } = props;\n const popperScope = usePopperScope(__scopePopover);\n return /* @__PURE__ */ jsx(PopperPrimitive.Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef });\n }\n);\nPopoverArrow.displayName = ARROW_NAME;\nfunction getState(open) {\n return open ? \"open\" : \"closed\";\n}\nvar Root2 = Popover;\nvar Anchor2 = PopoverAnchor;\nvar Trigger = PopoverTrigger;\nvar Portal = PopoverPortal;\nvar Content2 = PopoverContent;\nvar Close = PopoverClose;\nvar Arrow2 = PopoverArrow;\nexport {\n Anchor2 as Anchor,\n Arrow2 as Arrow,\n Close,\n Content2 as Content,\n Popover,\n PopoverAnchor,\n PopoverArrow,\n PopoverClose,\n PopoverContent,\n PopoverPortal,\n PopoverTrigger,\n Portal,\n Root2 as Root,\n Trigger,\n createPopoverScope\n};\n//# sourceMappingURL=index.mjs.map\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","POPOVER_NAME","createPopoverContext","createContextScope","createPopperScope","usePopperScope","PopoverProvider","usePopoverContext","Popover","__scopePopover","openProp","defaultOpen","onOpenChange","modal","popperScope","triggerRef","React.useRef","hasCustomAnchor","setHasCustomAnchor","React.useState","open","setOpen","useControllableState","PopperPrimitive.Root","useId","React.useCallback","prevOpen","ANCHOR_NAME","PopoverAnchor","React.forwardRef","forwardedRef","anchorProps","onCustomAnchorAdd","onCustomAnchorRemove","React.useEffect","PopperPrimitive.Anchor","TRIGGER_NAME","PopoverTrigger","triggerProps","composedTriggerRef","useComposedRefs","trigger","Primitive","getState","composeEventHandlers","PORTAL_NAME","PortalProvider","usePortalContext","PopoverPortal","forceMount","container","Presence","PortalPrimitive","CONTENT_NAME","PopoverContent","portalContext","contentProps","PopoverContentModal","PopoverContentNonModal","Slot","createSlot","contentRef","composedRefs","isRightClickOutsideRef","content","hideOthers","RemoveScroll","PopoverContentImpl","originalEvent","ctrlLeftClick","isRightClick","hasInteractedOutsideRef","hasPointerDownOutsideRef","target","trapFocus","onOpenAutoFocus","onCloseAutoFocus","disableOutsidePointerEvents","onEscapeKeyDown","onPointerDownOutside","onFocusOutside","onInteractOutside","useFocusGuards","FocusScope","DismissableLayer","PopperPrimitive.Content","CLOSE_NAME","PopoverClose","closeProps","ARROW_NAME","PopoverArrow","arrowProps","PopperPrimitive.Arrow","Root2","Trigger","Portal","Content2","TouchedFiles","diffFilesPromise","showFilesBadge","dismissFilesBadge","useOnboardingIndicator","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","current","initialClientX","clientX","onDoubleClick","setSplitPercentCookie","onTouchStart","firstTouch","touches","Outlet","ErrorBoundary","_UNSAFE_withErrorBoundaryProps","GeneralErrorBoundary","statusHandlers","Exercise404ErrorBoundary"],"mappings":"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","x_google_ignoreList":[1]}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{w as t,b as p}from"./chunk-EPOLDU6W-BCLmut3y.js";import{j as s}from"./jsx-runtime-C5WNSv3b.js";import{r as i}from"./index-CqIc3cxq.js";import{P as m}from"./preview-CiDtuQCc.js";import"./misc-DVYuZMjW.js";import"./button-CIlVtsau.js";import"./loading-CUydCGD3.js";import"./index-BW8stNyh.js";import"./tooltip-Chzzs4KB.js";import"./index-vDCSPjrM.js";import"./root-loader-BOzEMapJ.js";import"./pe-CIZUOJMr.js";import"./schemas-Uj5SZtvt.js";import"./progress-bar-B27isaGl.js";const L=t(function(){const{appInfo:r}=p(),o=i.useRef(null);return s.jsx(m,{appInfo:r,inBrowserBrowserRef:o})});export{L as default};
|
|
2
|
-
//# sourceMappingURL=app-TcFAQB2o.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-B4BG7PRW-C2qQTBXm.js";import{_ as i}from"./mermaid.core-D3y7PO8B.js";import"./chunk-FMBD7UC4-CyJoWksV.js";import"./chunk-55IACEB6-BOr0rES3.js";import"./chunk-QN33PNHL-BpbvTQdp.js";import"./preload-helper-BXl3LOEh.js";import"./misc-DVYuZMjW.js";import"./jsx-runtime-C5WNSv3b.js";import"./index-CqIc3cxq.js";import"./chunk-EPOLDU6W-BCLmut3y.js";var c={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{c as diagram};
|
|
2
|
-
//# sourceMappingURL=classDiagram-2ON5EDUG-_kfNpv_f.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-B4BG7PRW-C2qQTBXm.js";import{_ as i}from"./mermaid.core-D3y7PO8B.js";import"./chunk-FMBD7UC4-CyJoWksV.js";import"./chunk-55IACEB6-BOr0rES3.js";import"./chunk-QN33PNHL-BpbvTQdp.js";import"./preload-helper-BXl3LOEh.js";import"./misc-DVYuZMjW.js";import"./jsx-runtime-C5WNSv3b.js";import"./index-CqIc3cxq.js";import"./chunk-EPOLDU6W-BCLmut3y.js";var c={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{c as diagram};
|
|
2
|
-
//# sourceMappingURL=classDiagram-v2-WZHVMYZB-_kfNpv_f.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"discord-CuxZiU8E.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{w as C,k as S,L as N,F as h}from"./chunk-EPOLDU6W-BCLmut3y.js";import{j as e}from"./jsx-runtime-C5WNSv3b.js";import{a as g,I as o,c as j,e as P}from"./misc-DVYuZMjW.js";import{S as y}from"./tooltip-Chzzs4KB.js";import{a as A}from"./progress-fKsNxmmt.js";import{g as T}from"./root-loader-BOzEMapJ.js";import"./index-CqIc3cxq.js";import"./index-vDCSPjrM.js";import"./pe-CIZUOJMr.js";const H={getSitemapEntries:()=>null},U=({matches:s})=>[{title:`👷 | ${T(s)?.workshopTitle}`}];function D(s,t){return s.type==="unknown"&&t.type==="unknown"?0:s.type==="unknown"?-1:t.type==="unknown"?1:0}function L(s){switch(s.type){case"workshop-instructions":return"/";case"workshop-finished":return"/finished";case"instructions":return`/${s.exerciseNumber.toString().padStart(2,"0")}`;case"step":return`/${s.exerciseNumber.toString().padStart(2,"0")}/${s.stepNumber.toString().padStart(2,"0")}`;case"finished":return`/${s.exerciseNumber.toString().padStart(2,"0")}/finished`;default:return""}}const q=C(function({loaderData:t}){const i=S(),a=A(),p=i.formData?.get("intent")==="inspect",w=i.formData?.get("intent")==="stop-inspect",k={completed:"bg-success",incomplete:"bg-warning"};return e.jsxs("div",{className:"flex flex-col gap-6 p-6",children:[e.jsxs("div",{className:"mb-2",children:[e.jsx("h1",{className:"text-foreground text-2xl font-bold",children:"Admin Panel"}),e.jsx("p",{className:"text-muted-foreground mt-1 text-sm",children:"Manage workshop settings and monitor processes"})]}),e.jsxs("div",{className:"grid gap-6 md:grid-cols-2",children:[e.jsxs(c,{children:[e.jsxs(d,{children:[e.jsx(m,{children:"Progress"}),e.jsx(u,{children:"EpicWeb.dev lesson progress"})]}),e.jsx(x,{children:a?e.jsx("ul",{className:"scrollbar-thin scrollbar-thumb-scrollbar flex max-h-72 flex-col gap-2 overflow-y-auto",children:a.sort(D).map(n=>{const r=n.epicCompletedAt?"completed":"incomplete",b=[n.epicLessonSlug,n.epicCompletedAt?`(${n.epicCompletedAt})`:null].filter(Boolean).join(" ");return e.jsxs("li",{className:"hover:bg-muted/50 flex items-center gap-3 rounded-md p-2",children:[e.jsx("span",{className:g("h-3 w-3 shrink-0 rounded-full",k[r]),title:r}),n.type==="unknown"?e.jsxs("span",{className:"flex flex-1 items-center gap-2 truncate text-sm",children:[e.jsx("span",{className:"truncate",children:b}),e.jsx(y,{content:"This video is in the workshop on EpicWeb.dev, but not in the local workshop.",children:e.jsx(o,{name:"Close",className:"text-destructive h-4 w-4 shrink-0"})})]}):e.jsx(N,{to:L(n),className:"text-foreground flex-1 truncate text-sm hover:underline",children:b}),e.jsx(N,{to:n.epicLessonUrl,className:"text-muted-foreground hover:text-foreground shrink-0",children:e.jsx(o,{name:"ExternalLink",className:"h-4 w-4"})})]},n.epicLessonSlug)})}):e.jsx("p",{className:"text-muted-foreground text-sm",children:"No progress data"})})]}),e.jsxs(c,{children:[e.jsxs(d,{children:[e.jsx(m,{children:"Commands"}),e.jsx(u,{children:"Workshop management actions"})]}),e.jsx(x,{children:e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx(h,{method:"POST",children:e.jsxs(v,{name:"intent",value:"clear-caches",children:[e.jsx(o,{name:"Clear",className:"h-4 w-4"}),"Clear local caches"]})}),e.jsx(h,{method:"POST",children:e.jsxs(v,{name:"intent",value:"clear-data",className:"border-destructive bg-destructive/80 text-destructive-foreground hover:bg-destructive hover:text-destructive-foreground",doubleCheckClassName:"border-destructive bg-destructive text-destructive-foreground",children:[e.jsx(o,{name:"TriangleAlert",className:"h-4 w-4"}),"Clear all local data (including auth data)"]})}),t.inspectorRunning?e.jsx(h,{method:"POST",children:e.jsxs(f,{name:"intent",value:"stop-inspect",children:[e.jsx(o,{name:"Stop",className:"h-4 w-4"}),w?"Stopping inspector...":"Stop inspector"]})}):e.jsx(h,{method:"POST",children:e.jsx(f,{name:"intent",value:"inspect",children:p?"Starting inspector...":"Start inspector"})})]})})]}),e.jsxs(c,{children:[e.jsxs(d,{children:[e.jsx(m,{children:"Apps"}),e.jsx(u,{children:"Available workshop apps"})]}),e.jsx(x,{children:e.jsx("ul",{className:"scrollbar-thin scrollbar-thumb-scrollbar flex max-h-48 flex-col gap-2 overflow-y-auto",children:t.apps.length>0?t.apps.map(n=>e.jsxs("li",{className:"hover:bg-muted/50 flex items-center gap-3 rounded-md p-2",children:[t.processes[n.name]?e.jsx(l,{status:"running"}):e.jsx(l,{status:"stopped"}),e.jsx("span",{className:"font-mono text-sm",children:n.name})]},n.name)):e.jsx("p",{className:"text-muted-foreground text-sm",children:"No apps available"})})})]}),e.jsxs(c,{children:[e.jsxs(d,{children:[e.jsx(m,{children:"Processes"}),e.jsx(u,{children:"Running development processes"})]}),e.jsx(x,{children:e.jsx("ul",{className:"scrollbar-thin scrollbar-thumb-scrollbar flex max-h-48 flex-col gap-2 overflow-y-auto",children:Object.entries(t.processes).length>0?Object.entries(t.processes).map(([n,r])=>e.jsxs("li",{className:"border-border bg-muted/30 rounded-md border p-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(l,{status:"running"}),e.jsx("span",{className:"font-mono text-sm font-semibold",children:n})]}),e.jsxs("div",{className:"text-muted-foreground mt-2 flex flex-wrap gap-x-4 gap-y-1 text-xs",children:[e.jsxs("span",{children:[e.jsx("span",{className:"font-medium",children:"Port:"})," ",r.port]}),r.pid&&e.jsxs("span",{children:[e.jsx("span",{className:"font-medium",children:"PID:"})," ",r.pid]}),e.jsxs("span",{children:[e.jsx("span",{className:"font-medium",children:"Color:"})," ",e.jsx("span",{className:"inline-block h-3 w-3 rounded-full",style:{backgroundColor:r.color}})]})]})]},n)):e.jsx("p",{className:"text-muted-foreground text-sm",children:"No processes running"})})})]}),Object.entries(t.testProcesses).length>0&&e.jsxs(c,{className:"md:col-span-2",children:[e.jsxs(d,{children:[e.jsx(m,{children:"Test Processes"}),e.jsx(u,{children:"Test execution processes"})]}),e.jsx(x,{children:e.jsx("ul",{className:"scrollbar-thin scrollbar-thumb-scrollbar flex flex-col gap-2 overflow-y-auto",children:Object.entries(t.testProcesses).map(([n,r])=>e.jsxs("li",{className:"border-border bg-muted/30 rounded-md border p-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[r.exitCode===null||r.exitCode===void 0?e.jsx(l,{status:"running"}):r.exitCode===0?e.jsx(l,{status:"stopped"}):e.jsx(l,{status:"taken"}),e.jsx("span",{className:"font-mono text-sm font-semibold",children:n})]}),e.jsxs("div",{className:"text-muted-foreground mt-2 flex flex-wrap gap-x-4 gap-y-1 text-xs",children:[r.pid&&e.jsxs("span",{children:[e.jsx("span",{className:"font-medium",children:"PID:"})," ",r.pid]}),e.jsxs("span",{children:[e.jsx("span",{className:"font-medium",children:"Exit code:"})," ",r.exitCode===null||r.exitCode===void 0?"Running":r.exitCode]})]})]},n))})})]})]})]})});function c({children:s,className:t}){return e.jsx("div",{className:j("border-border bg-card rounded-lg border p-6 shadow-sm",t),children:s})}function d({children:s}){return e.jsx("div",{className:"mb-4",children:s})}function m({children:s}){return e.jsx("h2",{className:"text-foreground text-lg font-semibold",children:s})}function u({children:s}){return e.jsx("p",{className:"text-muted-foreground mt-1 text-sm",children:s})}function x({children:s}){return e.jsx("div",{children:s})}function f({children:s,...t}){return e.jsx("button",{...t,className:j("border-border bg-background text-foreground hover:bg-muted hover:text-foreground focus:ring-ring inline-flex w-full items-center justify-center gap-2 rounded-md border px-4 py-2 text-sm font-medium transition-colors focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:pointer-events-none disabled:opacity-50",t.className),children:s})}function v({children:s,doubleCheckClassName:t,...i}){const{doubleCheck:a,getButtonProps:p}=P();return e.jsx(f,{...p(i),className:j(i.className,a?t??"border-destructive bg-destructive text-destructive-foreground":null),children:a?e.jsxs(e.Fragment,{children:[e.jsx(o,{name:"TriangleAlert",className:"h-4 w-4"}),"Are you sure?"]}):s})}function l({status:s}){const t={running:{pinger:"bg-success/60",circle:"bg-success"},starting:{pinger:"bg-info/60",circle:"bg-info"},stopped:{circle:"bg-muted-foreground"},taken:{pinger:"bg-destructive/60",circle:"bg-destructive"}}[s];return e.jsxs("span",{className:"relative flex h-3 w-3 shrink-0",children:[t.pinger?e.jsx("span",{className:g("absolute inline-flex h-full w-full animate-ping rounded-full opacity-75",t.pinger)}):null,e.jsx("span",{className:g("relative inline-flex h-3 w-3 rounded-full",t.circle)})]})}export{q as default,H as handle,U as meta};
|
|
2
|
-
//# sourceMappingURL=index-C6vQqVxz.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-C6vQqVxz.js","sources":["../../../app/routes/admin+/index.tsx"],"sourcesContent":["import { getApps } from '@epic-web/workshop-utils/apps.server'\nimport { getProcesses } from '@epic-web/workshop-utils/process-manager.server'\nimport {\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport { type SEOHandle } from '@nasa-gcn/remix-seo'\nimport { clsx } from 'clsx'\nimport { data, Form, Link, useNavigation } from 'react-router'\nimport { Icon } from '#app/components/icons.tsx'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.tsx'\nimport {\n\tuseEpicProgress,\n\ttype SerializedProgress,\n} from '#app/routes/progress.tsx'\nimport { cn, ensureUndeployed, useDoubleCheck } from '#app/utils/misc.tsx'\nimport { getRootMatchLoaderData } from '#app/utils/root-loader.ts'\nimport { type Route } from './+types/index.tsx'\nimport {\n\tclearCaches,\n\tclearData,\n\tisInspectorRunning,\n\tstartInspector,\n\tstopInspector,\n} from './admin-utils.server.tsx'\n\nexport const handle: SEOHandle = {\n\tgetSitemapEntries: () => null,\n}\n\nexport const meta: Route.MetaFunction = ({ matches }) => {\n\tconst rootData = getRootMatchLoaderData(matches)\n\treturn [{ title: `👷 | ${rootData?.workshopTitle}` }]\n}\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\tensureUndeployed()\n\tconst timings = makeTimings('adminLoader')\n\tconst apps = (await getApps({ request, timings })).filter(\n\t\t(a, i, ar) => ar.findIndex((b) => a.name === b.name) === i,\n\t)\n\tconst processes: Record<\n\t\tstring,\n\t\t{ port: number; pid?: number; color: string }\n\t> = {}\n\tconst testProcesses: Record<\n\t\tstring,\n\t\t{ pid?: number; exitCode?: number | null }\n\t> = {}\n\tfor (const [\n\t\tname,\n\t\t{ port, process, color },\n\t] of getProcesses().devProcesses.entries()) {\n\t\tprocesses[name] = { port, pid: process.pid, color }\n\t}\n\n\tfor (const [\n\t\tname,\n\t\t{ process, exitCode },\n\t] of getProcesses().testProcesses.entries()) {\n\t\ttestProcesses[name] = { pid: process?.pid, exitCode }\n\t}\n\treturn data(\n\t\t{\n\t\t\tapps,\n\t\t\tprocesses,\n\t\t\ttestProcesses,\n\t\t\tinspectorRunning: isInspectorRunning(),\n\t\t},\n\t\t{\n\t\t\theaders: {\n\t\t\t\t'Server-Timing': getServerTimeHeader(timings),\n\t\t\t},\n\t\t},\n\t)\n}\n\nexport async function action({ request }: Route.ActionArgs) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst intent = formData.get('intent')\n\tswitch (intent) {\n\t\tcase 'clear-data': {\n\t\t\tawait clearData()\n\t\t\treturn { success: true }\n\t\t}\n\t\tcase 'clear-caches': {\n\t\t\tawait clearCaches()\n\t\t\treturn { success: true }\n\t\t}\n\t\tcase 'inspect': {\n\t\t\tawait startInspector()\n\t\t\treturn { success: true }\n\t\t}\n\t\tcase 'stop-inspect': {\n\t\t\tawait stopInspector()\n\t\t\treturn { success: true }\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Unknown intent: ${intent}`)\n\t\t}\n\t}\n}\n\nfunction sortProgress(a: SerializedProgress, b: SerializedProgress) {\n\treturn a.type === 'unknown' && b.type === 'unknown'\n\t\t? 0\n\t\t: a.type === 'unknown'\n\t\t\t? -1\n\t\t\t: b.type === 'unknown'\n\t\t\t\t? 1\n\t\t\t\t: 0\n}\n\nfunction linkProgress(progress: SerializedProgress) {\n\tswitch (progress.type) {\n\t\tcase 'workshop-instructions':\n\t\t\treturn '/'\n\t\tcase 'workshop-finished':\n\t\t\treturn '/finished'\n\t\tcase 'instructions':\n\t\t\treturn `/${progress.exerciseNumber.toString().padStart(2, '0')}`\n\t\tcase 'step':\n\t\t\treturn `/${progress.exerciseNumber\n\t\t\t\t.toString()\n\t\t\t\t.padStart(2, '0')}/${progress.stepNumber.toString().padStart(2, '0')}`\n\t\tcase 'finished':\n\t\t\treturn `/${progress.exerciseNumber.toString().padStart(2, '0')}/finished`\n\t\tdefault:\n\t\t\treturn ''\n\t}\n}\n\nexport default function AdminLayout({\n\tloaderData: data,\n}: Route.ComponentProps) {\n\tconst navigation = useNavigation()\n\tconst epicProgress = useEpicProgress()\n\n\tconst isStartingInspector = navigation.formData?.get('intent') === 'inspect'\n\tconst isStoppingInspector =\n\t\tnavigation.formData?.get('intent') === 'stop-inspect'\n\n\tconst progressStatus = {\n\t\tcompleted: 'bg-success',\n\t\tincomplete: 'bg-warning',\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-6 p-6\">\n\t\t\t<div className=\"mb-2\">\n\t\t\t\t<h1 className=\"text-foreground text-2xl font-bold\">Admin Panel</h1>\n\t\t\t\t<p className=\"text-muted-foreground mt-1 text-sm\">\n\t\t\t\t\tManage workshop settings and monitor processes\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<div className=\"grid gap-6 md:grid-cols-2\">\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>Progress</CardTitle>\n\t\t\t\t\t\t<CardDescription>EpicWeb.dev lesson progress</CardDescription>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t{epicProgress ? (\n\t\t\t\t\t\t\t<ul className=\"scrollbar-thin scrollbar-thumb-scrollbar flex max-h-72 flex-col gap-2 overflow-y-auto\">\n\t\t\t\t\t\t\t\t{epicProgress.sort(sortProgress).map((progress) => {\n\t\t\t\t\t\t\t\t\tconst status = progress.epicCompletedAt\n\t\t\t\t\t\t\t\t\t\t? 'completed'\n\t\t\t\t\t\t\t\t\t\t: 'incomplete'\n\t\t\t\t\t\t\t\t\tconst label = [\n\t\t\t\t\t\t\t\t\t\tprogress.epicLessonSlug,\n\t\t\t\t\t\t\t\t\t\tprogress.epicCompletedAt\n\t\t\t\t\t\t\t\t\t\t\t? `(${progress.epicCompletedAt})`\n\t\t\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t\t\t.join(' ')\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\t\t\tkey={progress.epicLessonSlug}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"hover:bg-muted/50 flex items-center gap-3 rounded-md p-2\"\n\t\t\t\t\t\t\t\t\t\t>\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={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'h-3 w-3 shrink-0 rounded-full',\n\t\t\t\t\t\t\t\t\t\t\t\t\tprogressStatus[status],\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\ttitle={status}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t{progress.type === 'unknown' ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex flex-1 items-center gap-2 truncate text-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"truncate\">{label}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SimpleTooltip content=\"This video is in the workshop on EpicWeb.dev, but not in the local workshop.\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tname=\"Close\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-destructive h-4 w-4 shrink-0\"\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</SimpleTooltip>\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\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\tto={linkProgress(progress)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-foreground flex-1 truncate text-sm hover:underline\"\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{label}\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)}\n\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\tto={progress.epicLessonUrl}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground shrink-0\"\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=\"ExternalLink\" className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<p className=\"text-muted-foreground text-sm\">No progress data</p>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>Commands</CardTitle>\n\t\t\t\t\t\t<CardDescription>Workshop management actions</CardDescription>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<div className=\"flex flex-col gap-3\">\n\t\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t\t<DoubleCheckAdminButton name=\"intent\" value=\"clear-caches\">\n\t\t\t\t\t\t\t\t\t<Icon name=\"Clear\" className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\tClear local caches\n\t\t\t\t\t\t\t\t</DoubleCheckAdminButton>\n\t\t\t\t\t\t\t</Form>\n\t\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t\t<DoubleCheckAdminButton\n\t\t\t\t\t\t\t\t\tname=\"intent\"\n\t\t\t\t\t\t\t\t\tvalue=\"clear-data\"\n\t\t\t\t\t\t\t\t\tclassName=\"border-destructive bg-destructive/80 text-destructive-foreground hover:bg-destructive hover:text-destructive-foreground\"\n\t\t\t\t\t\t\t\t\tdoubleCheckClassName=\"border-destructive bg-destructive text-destructive-foreground\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon name=\"TriangleAlert\" className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\tClear all local data (including auth data)\n\t\t\t\t\t\t\t\t</DoubleCheckAdminButton>\n\t\t\t\t\t\t\t</Form>\n\t\t\t\t\t\t\t{data.inspectorRunning ? (\n\t\t\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t\t\t<AdminButton name=\"intent\" value=\"stop-inspect\">\n\t\t\t\t\t\t\t\t\t\t<Icon name=\"Stop\" className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\t\t{isStoppingInspector\n\t\t\t\t\t\t\t\t\t\t\t? 'Stopping inspector...'\n\t\t\t\t\t\t\t\t\t\t\t: 'Stop inspector'}\n\t\t\t\t\t\t\t\t\t</AdminButton>\n\t\t\t\t\t\t\t\t</Form>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t\t\t<AdminButton name=\"intent\" value=\"inspect\">\n\t\t\t\t\t\t\t\t\t\t{isStartingInspector\n\t\t\t\t\t\t\t\t\t\t\t? 'Starting inspector...'\n\t\t\t\t\t\t\t\t\t\t\t: 'Start inspector'}\n\t\t\t\t\t\t\t\t\t</AdminButton>\n\t\t\t\t\t\t\t\t</Form>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>Apps</CardTitle>\n\t\t\t\t\t\t<CardDescription>Available workshop apps</CardDescription>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<ul className=\"scrollbar-thin scrollbar-thumb-scrollbar flex max-h-48 flex-col gap-2 overflow-y-auto\">\n\t\t\t\t\t\t\t{data.apps.length > 0 ? (\n\t\t\t\t\t\t\t\tdata.apps.map((app) => (\n\t\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\t\tkey={app.name}\n\t\t\t\t\t\t\t\t\t\tclassName=\"hover:bg-muted/50 flex items-center gap-3 rounded-md p-2\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{data.processes[app.name] ? (\n\t\t\t\t\t\t\t\t\t\t\t<Pinger status=\"running\" />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<Pinger status=\"stopped\" />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-sm\">{app.name}</span>\n\t\t\t\t\t\t\t\t\t</li>\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<p className=\"text-muted-foreground text-sm\">\n\t\t\t\t\t\t\t\t\tNo apps available\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>Processes</CardTitle>\n\t\t\t\t\t\t<CardDescription>Running development processes</CardDescription>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<ul className=\"scrollbar-thin scrollbar-thumb-scrollbar flex max-h-48 flex-col gap-2 overflow-y-auto\">\n\t\t\t\t\t\t\t{Object.entries(data.processes).length > 0 ? (\n\t\t\t\t\t\t\t\tObject.entries(data.processes).map(([key, process]) => (\n\t\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\t\t\tclassName=\"border-border bg-muted/30 rounded-md border p-3\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t<Pinger status=\"running\" />\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-sm font-semibold\">\n\t\t\t\t\t\t\t\t\t\t\t\t{key}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"text-muted-foreground mt-2 flex flex-wrap gap-x-4 gap-y-1 text-xs\">\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\t<span className=\"font-medium\">Port:</span>{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t{process.port}\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{process.pid && (\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\t<span className=\"font-medium\">PID:</span>{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{process.pid}\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\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium\">Color:</span>{' '}\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\tclassName=\"inline-block h-3 w-3 rounded-full\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ backgroundColor: process.color }}\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</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</li>\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<p className=\"text-muted-foreground text-sm\">\n\t\t\t\t\t\t\t\t\tNo processes running\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\n\t\t\t\t{Object.entries(data.testProcesses).length > 0 && (\n\t\t\t\t\t<Card className=\"md:col-span-2\">\n\t\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t\t<CardTitle>Test Processes</CardTitle>\n\t\t\t\t\t\t\t<CardDescription>Test execution processes</CardDescription>\n\t\t\t\t\t\t</CardHeader>\n\t\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t\t<ul className=\"scrollbar-thin scrollbar-thumb-scrollbar flex flex-col gap-2 overflow-y-auto\">\n\t\t\t\t\t\t\t\t{Object.entries(data.testProcesses).map(([key, process]) => (\n\t\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\t\t\tclassName=\"border-border bg-muted/30 rounded-md border p-3\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t{process.exitCode === null ||\n\t\t\t\t\t\t\t\t\t\t\tprocess.exitCode === undefined ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<Pinger status=\"running\" />\n\t\t\t\t\t\t\t\t\t\t\t) : process.exitCode === 0 ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<Pinger status=\"stopped\" />\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<Pinger status=\"taken\" />\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-sm font-semibold\">\n\t\t\t\t\t\t\t\t\t\t\t\t{key}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"text-muted-foreground mt-2 flex flex-wrap gap-x-4 gap-y-1 text-xs\">\n\t\t\t\t\t\t\t\t\t\t\t{process.pid && (\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\t<span className=\"font-medium\">PID:</span>{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{process.pid}\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\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium\">Exit code:</span>{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t{process.exitCode === null ||\n\t\t\t\t\t\t\t\t\t\t\t\tprocess.exitCode === undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'Running'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: process.exitCode}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t</CardContent>\n\t\t\t\t\t</Card>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction Card({\n\tchildren,\n\tclassName,\n}: {\n\tchildren: React.ReactNode\n\tclassName?: string\n}) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'border-border bg-card rounded-lg border p-6 shadow-sm',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t)\n}\n\nfunction CardHeader({ children }: { children: React.ReactNode }) {\n\treturn <div className=\"mb-4\">{children}</div>\n}\n\nfunction CardTitle({ children }: { children: React.ReactNode }) {\n\treturn <h2 className=\"text-foreground text-lg font-semibold\">{children}</h2>\n}\n\nfunction CardDescription({ children }: { children: React.ReactNode }) {\n\treturn <p className=\"text-muted-foreground mt-1 text-sm\">{children}</p>\n}\n\nfunction CardContent({ children }: { children: React.ReactNode }) {\n\treturn <div>{children}</div>\n}\n\nfunction AdminButton({\n\tchildren,\n\t...props\n}: React.ComponentPropsWithoutRef<'button'>) {\n\treturn (\n\t\t<button\n\t\t\t{...props}\n\t\t\tclassName={cn(\n\t\t\t\t'border-border bg-background text-foreground hover:bg-muted hover:text-foreground focus:ring-ring inline-flex w-full items-center justify-center gap-2 rounded-md border px-4 py-2 text-sm font-medium transition-colors focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:pointer-events-none disabled:opacity-50',\n\t\t\t\tprops.className,\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t)\n}\n\nfunction DoubleCheckAdminButton({\n\tchildren,\n\tdoubleCheckClassName,\n\t...props\n}: React.ComponentPropsWithoutRef<'button'> & {\n\tdoubleCheckClassName?: string\n}) {\n\tconst { doubleCheck, getButtonProps } = useDoubleCheck()\n\n\treturn (\n\t\t<AdminButton\n\t\t\t{...getButtonProps(props)}\n\t\t\tclassName={cn(\n\t\t\t\tprops.className,\n\t\t\t\tdoubleCheck\n\t\t\t\t\t? (doubleCheckClassName ??\n\t\t\t\t\t\t\t'border-destructive bg-destructive text-destructive-foreground')\n\t\t\t\t\t: null,\n\t\t\t)}\n\t\t>\n\t\t\t{doubleCheck ? (\n\t\t\t\t<>\n\t\t\t\t\t<Icon name=\"TriangleAlert\" className=\"h-4 w-4\" />\n\t\t\t\t\tAre you sure?\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\tchildren\n\t\t\t)}\n\t\t</AdminButton>\n\t)\n}\n\nfunction Pinger({\n\tstatus,\n}: {\n\tstatus: 'running' | 'starting' | 'stopped' | 'taken'\n}) {\n\tconst colors = {\n\t\trunning: {\n\t\t\tpinger: 'bg-success/60',\n\t\t\tcircle: 'bg-success',\n\t\t},\n\t\tstarting: {\n\t\t\tpinger: 'bg-info/60',\n\t\t\tcircle: 'bg-info',\n\t\t},\n\t\tstopped: {\n\t\t\tcircle: 'bg-muted-foreground',\n\t\t},\n\t\ttaken: {\n\t\t\tpinger: 'bg-destructive/60',\n\t\t\tcircle: 'bg-destructive',\n\t\t},\n\t}[status]\n\treturn (\n\t\t<span className=\"relative flex h-3 w-3 shrink-0\">\n\t\t\t{colors.pinger ? (\n\t\t\t\t<span\n\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t'absolute inline-flex h-full w-full animate-ping rounded-full opacity-75',\n\t\t\t\t\t\tcolors.pinger,\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t\t<span\n\t\t\t\tclassName={clsx(\n\t\t\t\t\t'relative inline-flex h-3 w-3 rounded-full',\n\t\t\t\t\tcolors.circle,\n\t\t\t\t)}\n\t\t\t/>\n\t\t</span>\n\t)\n}\n"],"names":["handle","getSitemapEntries","meta","matches","title","getRootMatchLoaderData","workshopTitle","sortProgress","a","b","type","linkProgress","progress","exerciseNumber","toString","padStart","stepNumber","index","_UNSAFE_withComponentProps","loaderData","data","navigation","useNavigation","epicProgress","useEpicProgress","isStartingInspector","formData","get","isStoppingInspector","progressStatus","completed","incomplete","jsxs","className","children","jsx","Card","CardHeader","CardTitle","CardDescription","CardContent","sort","map","status","epicCompletedAt","label","epicLessonSlug","filter","Boolean","join","clsx","SimpleTooltip","content","Icon","name","Link","to","epicLessonUrl","Form","method","DoubleCheckAdminButton","value","doubleCheckClassName","inspectorRunning","AdminButton","apps","length","app","processes","Pinger","Object","entries","key","process","port","pid","style","backgroundColor","color","testProcesses","exitCode","cn","props","doubleCheck","getButtonProps","useDoubleCheck","Fragment","colors","running","pinger","circle","starting","stopped","taken"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{w as j,a as E,c as A,d as C,e as N}from"./chunk-EPOLDU6W-BCLmut3y.js";import{j as r}from"./jsx-runtime-C5WNSv3b.js";import{g as T,R as H,P as U,C as t,a as b,D as B}from"./playground-C_aP_pE8.js";import{U as I}from"./diff-CxEbhF8Q.js";import{G as R}from"./error-boundary-DFBd6s0g.js";import{u as S}from"./workshop-config-Zfc8zU0x.js";import{u as O}from"./misc-DVYuZMjW.js";import{P as a}from"./preview-CiDtuQCc.js";import{T as k}from"./tests-xD9PppmM.js";import"./index-CqIc3cxq.js";import"./loading-CUydCGD3.js";import"./index-BW8stNyh.js";import"./tooltip-Chzzs4KB.js";import"./index-vDCSPjrM.js";import"./root-loader-BOzEMapJ.js";import"./pe-CIZUOJMr.js";import"./schemas-Uj5SZtvt.js";import"./discord-DlU9y5Iz.js";import"./user-BsPobzjB.js";import"./online-DiNLkgTC.js";import"./index-BOhw3wcM.js";import"./index-C_KjwKVt.js";import"./index-DzdDahau.js";import"./set-playground-DeMY9i7p.js";import"./button-CIlVtsau.js";import"./onboarding-indicator-CVwXz3Cn.js";import"./progress-bar-B27isaGl.js";import"./dialog-DnpUg3VT.js";import"./playground-window-D9a7P7rH.js";import"./accordion-CzXT3k43.js";import"./mdx-vrch0szL.js";import"./epic-video-BVcJzJzi.js";import"./use-event-source-BuD4_2SF.js";import"./preload-helper-BXl3LOEh.js";import"./launch-editor-B2dmpkaO.js";import"./revalidation-ws-BJWJviUX.js";const p=["playground","problem","solution","tests","diff","chat"],L=n=>!!(n&&p.includes(n)),vs=j(function({loaderData:e}){const{inBrowserBrowserRef:l}=A(),d=S(),[u]=C(),f=u.get("preview"),h=O(),x=N();function m(s){if(s==="tests")return ENV.EPICSHOP_DEPLOYED||!e.playground||e.playground.test.type==="none";if(s==="problem"||s==="solution"){if(e[s]?.dev.type==="none")return!0;if(ENV.EPICSHOP_DEPLOYED){const i=e[s]?.dev.type;return i!=="browser"&&i!=="export"&&!e[s]?.stackBlitzUrl}}return s==="playground"&&ENV.EPICSHOP_DEPLOYED?!0:s==="chat"?!d.product.discordChannelId:!1}function w(s){if(s==="tests"){if(!e.playground)return null;const{isTestRunning:i,testExitCode:o}=e.playground;return i?"running":o===0?"passed":o!==null&&o!==0?"failed":null}return(s==="problem"||s==="solution"||s==="playground")&&(s==="playground"?e.playground:e[s])?.isRunning?"running":null}const y=L(f)?f:p.find(s=>!m(s)),c=`/diff?${new URLSearchParams({app1:e.problem?.name??"",app2:e.solution?.name??""})}`;function g(s){s.altKey&&!s.ctrlKey&&!s.shiftKey&&!s.metaKey&&(s.preventDefault(),x(c))}const v=p.map(s=>{const i=m(s),o=w(s),P=s==="diff"&&h?c:`?${T(u,s,"playground")}`;return{id:s,label:s,hidden:i,status:o,to:P,onClick:s==="diff"?g:void 0}});return r.jsxs(H,{className:"relative flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden sm:col-span-1 sm:row-span-1",value:y,children:[r.jsx(U,{tabs:v}),r.jsxs("div",{className:"relative z-10 flex min-h-0 flex-1 flex-col overflow-hidden",children:[r.jsx(t,{value:"playground",className:"radix-state-inactive:hidden flex min-h-0 w-full grow basis-0 items-stretch justify-center self-start",forceMount:!0,children:r.jsx(b,{appInfo:e.playground,problemAppName:e.problem?.name,inBrowserBrowserRef:l,allApps:e.allApps,isUpToDate:e.playground?.isUpToDate??!1})}),r.jsx(t,{value:"problem",className:"radix-state-inactive:hidden flex min-h-0 w-full grow basis-0 items-stretch justify-center self-start",forceMount:!0,children:r.jsx(a,{appInfo:e.problem,inBrowserBrowserRef:l})}),r.jsx(t,{value:"solution",className:"radix-state-inactive:hidden flex min-h-0 w-full grow basis-0 items-stretch justify-center self-start",forceMount:!0,children:r.jsx(a,{appInfo:e.solution,inBrowserBrowserRef:l})}),r.jsx(t,{value:"tests",className:"radix-state-inactive:hidden flex min-h-0 w-full grow basis-0 items-stretch justify-center self-start overflow-hidden",children:r.jsx(k,{appInfo:e.playground,problemAppName:e.problem?.name,allApps:e.allApps,isUpToDate:e.playground?.isUpToDate??!1,userHasAccessPromise:e.userHasAccessPromise})}),r.jsx(t,{value:"diff",className:"radix-state-inactive:hidden flex h-full min-h-0 w-full grow basis-0 items-stretch justify-center self-start",children:r.jsx(I,{diff:e.diff,allApps:e.allApps,userHasAccessPromise:e.userHasAccessPromise})}),r.jsx(t,{value:"chat",className:"radix-state-inactive:hidden flex h-full min-h-0 w-full grow basis-0 items-stretch justify-center self-start",children:r.jsx(B,{discordPostsPromise:e.discordPostsPromise})})]})]})}),Ps=E(function(){return r.jsx(R,{statusHandlers:{404:()=>r.jsx("p",{children:"Sorry, we couldn't find an app here."})}})});export{Ps as ErrorBoundary,vs as default};
|
|
2
|
-
//# sourceMappingURL=index-EdNV8gTk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
window.__reactRouterManifest={"entry":{"module":"/assets/entry.client-Dbw2ihVI.js","imports":["/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/preload-helper-BXl3LOEh.js"],"css":[]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/root-Ch373D3a.js","imports":["/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/preload-helper-BXl3LOEh.js","/assets/misc-DVYuZMjW.js","/assets/client-only-BeMV-Wuv.js","/assets/error-boundary-DFBd6s0g.js","/assets/dialog-DnpUg3VT.js","/assets/progress-bar-B27isaGl.js","/assets/index-DzdDahau.js","/assets/tooltip-Chzzs4KB.js","/assets/schemas-Uj5SZtvt.js","/assets/index-BW8stNyh.js","/assets/presence-VCvV2mg7.js","/assets/seo-t5J-DRxw.js","/assets/pe-CIZUOJMr.js","/assets/index-C_KjwKVt.js","/assets/root-loader-BOzEMapJ.js","/assets/online-DiNLkgTC.js","/assets/coerce-CkHW0SMv.js"],"css":[]},"routes/$":{"id":"routes/$","parentId":"root","path":"*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_-BnmXymJG.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/error-boundary-DFBd6s0g.js","/assets/misc-DVYuZMjW.js","/assets/index-CqIc3cxq.js","/assets/preload-helper-BXl3LOEh.js"],"css":[]},"routes/_app+/_layout":{"id":"routes/_app+/_layout","parentId":"root","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-BxQPZuW6.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-DVYuZMjW.js","/assets/index-CqIc3cxq.js","/assets/pe-CIZUOJMr.js","/assets/onboarding-indicator-CVwXz3Cn.js","/assets/product-GLsnY1u3.js","/assets/revalidation-ws-BJWJviUX.js","/assets/dialog-DnpUg3VT.js","/assets/tooltip-Chzzs4KB.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/online-DiNLkgTC.js","/assets/presence-VCvV2mg7.js","/assets/root-loader-BOzEMapJ.js","/assets/progress-fKsNxmmt.js","/assets/index-BW8stNyh.js","/assets/schemas-Uj5SZtvt.js","/assets/index-C_KjwKVt.js","/assets/index-vDCSPjrM.js","/assets/coerce-CkHW0SMv.js"],"css":[]},"routes/_app+/account":{"id":"routes/_app+/account","parentId":"routes/_app+/_layout","path":"account","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/account-Cs3Te0is.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-CIlVtsau.js","/assets/misc-DVYuZMjW.js","/assets/onboarding-indicator-CVwXz3Cn.js","/assets/tooltip-Chzzs4KB.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/index-CqIc3cxq.js","/assets/root-loader-BOzEMapJ.js","/assets/index-vDCSPjrM.js"],"css":[]},"routes/_app+/app.$appName+/$":{"id":"routes/_app+/app.$appName+/$","parentId":"routes/_app+/_layout","path":"app/:appName/*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/api.$":{"id":"routes/_app+/app.$appName+/api.$","parentId":"routes/_app+/_layout","path":"app/:appName/api/*","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/api._-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/epic_ws[.js]":{"id":"routes/_app+/app.$appName+/epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/:appName/epic_ws.js","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/index":{"id":"routes/_app+/app.$appName+/index","parentId":"routes/_app+/_layout","path":"app/:appName","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/test.$testName":{"id":"routes/_app+/app.$appName+/test.$testName","parentId":"routes/_app+/_layout","path":"app/:appName/test/:testName","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test._testName-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/test.epic_ws[.js]":{"id":"routes/_app+/app.$appName+/test.epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/:appName/test/epic_ws.js","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test.epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.epic_ws[.js]":{"id":"routes/_app+/app.epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/epic_ws.js","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/app.epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/discord":{"id":"routes/_app+/discord","parentId":"routes/_app+/_layout","path":"discord","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/discord-CuxZiU8E.js","imports":["/assets/discord-DlU9y5Iz.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/index-CqIc3cxq.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-DVYuZMjW.js","/assets/user-BsPobzjB.js","/assets/root-loader-BOzEMapJ.js","/assets/workshop-config-Zfc8zU0x.js"],"css":[]},"routes/_app+/exercise+/_layout":{"id":"routes/_app+/exercise+/_layout","parentId":"routes/_app+/_layout","path":"exercise","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-BvtJxESE.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber":{"id":"routes/_app+/exercise+/$exerciseNumber","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_exerciseNumber-77g7-L-x.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/epic-video-BVcJzJzi.js","/assets/error-boundary-DFBd6s0g.js","/assets/revalidation-ws-BJWJviUX.js","/assets/launch-editor-B2dmpkaO.js","/assets/progress-fKsNxmmt.js","/assets/mdx-vrch0szL.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/error-boundary-BDqWjIFP.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-BW8stNyh.js","/assets/misc-DVYuZMjW.js","/assets/tooltip-Chzzs4KB.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CUydCGD3.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-B27isaGl.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/coerce-CkHW0SMv.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/:stepNumber/:type","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_layout-yxOoJ6Yg.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/index-CqIc3cxq.js","/assets/error-boundary-DFBd6s0g.js","/assets/nav-chevrons-DlNUibJV.js","/assets/revalidation-ws-BJWJviUX.js","/assets/launch-editor-B2dmpkaO.js","/assets/progress-fKsNxmmt.js","/assets/set-playground-DeMY9i7p.js","/assets/misc-DVYuZMjW.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/split-layout-DnRER1bP.js","/assets/error-boundary-BDqWjIFP.js","/assets/epic-video-BVcJzJzi.js","/assets/tooltip-Chzzs4KB.js","/assets/mdx-vrch0szL.js","/assets/index-C_KjwKVt.js","/assets/onboarding-indicator-CVwXz3Cn.js","/assets/preload-helper-BXl3LOEh.js","/assets/schemas-Uj5SZtvt.js","/assets/progress-bar-B27isaGl.js","/assets/pe-CIZUOJMr.js","/assets/index-BOhw3wcM.js","/assets/index-vDCSPjrM.js","/assets/button-CIlVtsau.js","/assets/dialog-DnpUg3VT.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/coerce-CkHW0SMv.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-BW8stNyh.js","/assets/online-DiNLkgTC.js","/assets/loading-CUydCGD3.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","path":"app","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/app-TcFAQB2o.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/preview-CiDtuQCc.js","/assets/misc-DVYuZMjW.js","/assets/button-CIlVtsau.js","/assets/loading-CUydCGD3.js","/assets/index-BW8stNyh.js","/assets/tooltip-Chzzs4KB.js","/assets/index-vDCSPjrM.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/progress-bar-B27isaGl.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/index-EdNV8gTk.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/playground-C_aP_pE8.js","/assets/diff-CxEbhF8Q.js","/assets/error-boundary-DFBd6s0g.js","/assets/workshop-config-Zfc8zU0x.js","/assets/misc-DVYuZMjW.js","/assets/preview-CiDtuQCc.js","/assets/tests-xD9PppmM.js","/assets/index-CqIc3cxq.js","/assets/loading-CUydCGD3.js","/assets/index-BW8stNyh.js","/assets/tooltip-Chzzs4KB.js","/assets/index-vDCSPjrM.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/discord-DlU9y5Iz.js","/assets/user-BsPobzjB.js","/assets/online-DiNLkgTC.js","/assets/index-BOhw3wcM.js","/assets/index-C_KjwKVt.js","/assets/index-DzdDahau.js","/assets/set-playground-DeMY9i7p.js","/assets/button-CIlVtsau.js","/assets/onboarding-indicator-CVwXz3Cn.js","/assets/progress-bar-B27isaGl.js","/assets/dialog-DnpUg3VT.js","/assets/playground-window-D9a7P7rH.js","/assets/accordion-CzXT3k43.js","/assets/mdx-vrch0szL.js","/assets/epic-video-BVcJzJzi.js","/assets/use-event-source-BuD4_2SF.js","/assets/preload-helper-BXl3LOEh.js","/assets/launch-editor-B2dmpkaO.js","/assets/revalidation-ws-BJWJviUX.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","path":"test","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test-CdEKoDoS.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/tests-xD9PppmM.js","/assets/index-CqIc3cxq.js","/assets/accordion-CzXT3k43.js","/assets/tooltip-Chzzs4KB.js","/assets/index-vDCSPjrM.js","/assets/misc-DVYuZMjW.js","/assets/index-BOhw3wcM.js","/assets/index-C_KjwKVt.js","/assets/epic-video-BVcJzJzi.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-BW8stNyh.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CUydCGD3.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/playground-window-D9a7P7rH.js","/assets/set-playground-DeMY9i7p.js","/assets/button-CIlVtsau.js","/assets/onboarding-indicator-CVwXz3Cn.js","/assets/progress-bar-B27isaGl.js","/assets/dialog-DnpUg3VT.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/:stepNumber","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_exerciseNumber_._stepNumber.index-DYb7kg06.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/error-boundary-DFBd6s0g.js","/assets/error-boundary-BDqWjIFP.js","/assets/index-CqIc3cxq.js","/assets/preload-helper-BXl3LOEh.js","/assets/misc-DVYuZMjW.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/schemas-Uj5SZtvt.js","/assets/coerce-CkHW0SMv.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber_.finished":{"id":"routes/_app+/exercise+/$exerciseNumber_.finished","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/finished","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_exerciseNumber_.finished-CGoPhVVF.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/index-CqIc3cxq.js","/assets/epic-video-BVcJzJzi.js","/assets/misc-DVYuZMjW.js","/assets/loading-CUydCGD3.js","/assets/nav-chevrons-DlNUibJV.js","/assets/revalidation-ws-BJWJviUX.js","/assets/launch-editor-B2dmpkaO.js","/assets/progress-fKsNxmmt.js","/assets/index-BW8stNyh.js","/assets/mdx-vrch0szL.js","/assets/online-DiNLkgTC.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/schemas-Uj5SZtvt.js","/assets/tooltip-Chzzs4KB.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/progress-bar-B27isaGl.js","/assets/pe-CIZUOJMr.js","/assets/preload-helper-BXl3LOEh.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/extra+/_layout":{"id":"routes/_app+/extra+/_layout","parentId":"routes/_app+/_layout","path":"extra","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-jJ6TnDJF.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/extra+/$extra":{"id":"routes/_app+/extra+/$extra","parentId":"routes/_app+/extra+/_layout","path":":extra","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_extra-BZPB_nWQ.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/playground-C_aP_pE8.js","/assets/index-CqIc3cxq.js","/assets/diff-CxEbhF8Q.js","/assets/epic-video-BVcJzJzi.js","/assets/error-boundary-DFBd6s0g.js","/assets/nav-chevrons-DlNUibJV.js","/assets/revalidation-ws-BJWJviUX.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preview-CiDtuQCc.js","/assets/launch-editor-B2dmpkaO.js","/assets/set-playground-DeMY9i7p.js","/assets/mdx-vrch0szL.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/split-layout-DnRER1bP.js","/assets/misc-DVYuZMjW.js","/assets/loading-CUydCGD3.js","/assets/index-BW8stNyh.js","/assets/tooltip-Chzzs4KB.js","/assets/index-vDCSPjrM.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/discord-DlU9y5Iz.js","/assets/user-BsPobzjB.js","/assets/online-DiNLkgTC.js","/assets/index-BOhw3wcM.js","/assets/index-C_KjwKVt.js","/assets/index-DzdDahau.js","/assets/playground-window-D9a7P7rH.js","/assets/accordion-CzXT3k43.js","/assets/use-event-source-BuD4_2SF.js","/assets/preload-helper-BXl3LOEh.js","/assets/button-CIlVtsau.js","/assets/progress-bar-B27isaGl.js","/assets/onboarding-indicator-CVwXz3Cn.js","/assets/dialog-DnpUg3VT.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/extra+/index":{"id":"routes/_app+/extra+/index","parentId":"routes/_app+/extra+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/index-D3zOGeBE.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/epic-video-BVcJzJzi.js","/assets/error-boundary-DFBd6s0g.js","/assets/revalidation-ws-BJWJviUX.js","/assets/launch-editor-B2dmpkaO.js","/assets/mdx-vrch0szL.js","/assets/misc-DVYuZMjW.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-BW8stNyh.js","/assets/tooltip-Chzzs4KB.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CUydCGD3.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-B27isaGl.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/finished":{"id":"routes/_app+/finished","parentId":"routes/_app+/_layout","path":"finished","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/finished-CmV4aFjA.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/index-CqIc3cxq.js","/assets/epic-video-BVcJzJzi.js","/assets/misc-DVYuZMjW.js","/assets/loading-CUydCGD3.js","/assets/nav-chevrons-DlNUibJV.js","/assets/revalidation-ws-BJWJviUX.js","/assets/mdx-vrch0szL.js","/assets/online-DiNLkgTC.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/launch-editor-B2dmpkaO.js","/assets/progress-fKsNxmmt.js","/assets/index-BW8stNyh.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/schemas-Uj5SZtvt.js","/assets/tooltip-Chzzs4KB.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-B27isaGl.js","/assets/pe-CIZUOJMr.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/guide":{"id":"routes/_app+/guide","parentId":"routes/_app+/_layout","path":"guide","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/guide-B4wAqzq_.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/index":{"id":"routes/_app+/index","parentId":"routes/_app+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/index-B-9GR1C2.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/epic-video-BVcJzJzi.js","/assets/error-boundary-DFBd6s0g.js","/assets/launch-editor-B2dmpkaO.js","/assets/mdx-vrch0szL.js","/assets/misc-DVYuZMjW.js","/assets/progress-fKsNxmmt.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-BW8stNyh.js","/assets/tooltip-Chzzs4KB.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CUydCGD3.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-B27isaGl.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/l":{"id":"routes/_app+/l","parentId":"routes/_app+/_layout","path":"l","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/l-BWU2-fsj.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/login":{"id":"routes/_app+/login","parentId":"routes/_app+/_layout","path":"login","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/login-DvBmP_ce.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/button-CIlVtsau.js","/assets/loading-CUydCGD3.js","/assets/product-GLsnY1u3.js","/assets/workshop-config-Zfc8zU0x.js","/assets/schemas-Uj5SZtvt.js","/assets/misc-DVYuZMjW.js","/assets/index-BW8stNyh.js","/assets/tooltip-Chzzs4KB.js","/assets/index-vDCSPjrM.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js"],"css":[]},"routes/_app+/preferences":{"id":"routes/_app+/preferences","parentId":"routes/_app+/_layout","path":"preferences","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/preferences-BCvK10k2.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-CIlVtsau.js","/assets/misc-DVYuZMjW.js","/assets/tooltip-Chzzs4KB.js","/assets/root-loader-BOzEMapJ.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js"],"css":[]},"routes/_app+/support":{"id":"routes/_app+/support","parentId":"routes/_app+/_layout","path":"support","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/support-D5mDQ-c-.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/workspace-structure":{"id":"routes/_app+/workspace-structure","parentId":"routes/_app+/_layout","path":"workspace-structure","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/workspace-structure-i_5Tiikk.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-CIlVtsau.js","/assets/index-CqIc3cxq.js","/assets/misc-DVYuZMjW.js"],"css":[]},"routes/admin+/_layout":{"id":"routes/admin+/_layout","parentId":"root","path":"admin","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-CunOyAg4.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/root-loader-BOzEMapJ.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/admin+/apps":{"id":"routes/admin+/apps","parentId":"routes/admin+/_layout","path":"apps","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/apps-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/cache":{"id":"routes/admin+/cache","parentId":"routes/admin+/_layout","path":"cache","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/cache-MJu_dqFS.js","imports":["/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/client-only-BeMV-Wuv.js","/assets/button-CIlVtsau.js","/assets/misc-DVYuZMjW.js","/assets/launch-editor-B2dmpkaO.js","/assets/pe-CIZUOJMr.js","/assets/progress-bar-B27isaGl.js","/assets/root-loader-BOzEMapJ.js"],"css":[]},"routes/admin+/cache.$":{"id":"routes/admin+/cache.$","parentId":"routes/admin+/cache","path":"*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/cache._-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/db":{"id":"routes/admin+/db","parentId":"routes/admin+/_layout","path":"db","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/db-x6v-Uxrh.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-DVYuZMjW.js","/assets/tooltip-Chzzs4KB.js","/assets/launch-editor-B2dmpkaO.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js","/assets/progress-bar-B27isaGl.js","/assets/pe-CIZUOJMr.js","/assets/root-loader-BOzEMapJ.js"],"css":[]},"routes/admin+/index":{"id":"routes/admin+/index","parentId":"routes/admin+/_layout","index":true,"hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-C6vQqVxz.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-DVYuZMjW.js","/assets/tooltip-Chzzs4KB.js","/assets/progress-fKsNxmmt.js","/assets/root-loader-BOzEMapJ.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js","/assets/pe-CIZUOJMr.js"],"css":[]},"routes/admin+/notifications":{"id":"routes/admin+/notifications","parentId":"routes/admin+/_layout","path":"notifications","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/notifications-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/offline-videos":{"id":"routes/admin+/offline-videos","parentId":"routes/admin+/_layout","path":"offline-videos","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-videos-Do9PBh87.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-DVYuZMjW.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/admin+/version":{"id":"routes/admin+/version","parentId":"routes/admin+/_layout","path":"version","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/version-f8qqYbyU.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/workshop-config-Zfc8zU0x.js","/assets/index-CqIc3cxq.js","/assets/root-loader-BOzEMapJ.js"],"css":[]},"routes/admin+/version[.json]":{"id":"routes/admin+/version[.json]","parentId":"routes/admin+/_layout","path":"version.json","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/version_.json_-l0sNRNKZ.js","imports":[],"css":[]},"routes/apps":{"id":"routes/apps","parentId":"root","path":"apps","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/apps-DP2rzg_V.js","imports":[],"css":[]},"routes/diff":{"id":"routes/diff","parentId":"root","path":"diff","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/diff-eAvgXb3f.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-DVYuZMjW.js","/assets/diff-CxEbhF8Q.js","/assets/nav-chevrons-DlNUibJV.js","/assets/index-CqIc3cxq.js","/assets/accordion-CzXT3k43.js","/assets/tooltip-Chzzs4KB.js","/assets/index-vDCSPjrM.js","/assets/index-BOhw3wcM.js","/assets/index-C_KjwKVt.js","/assets/mdx-vrch0szL.js","/assets/index-DzdDahau.js","/assets/epic-video-BVcJzJzi.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-BW8stNyh.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CUydCGD3.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/launch-editor-B2dmpkaO.js","/assets/progress-bar-B27isaGl.js","/assets/revalidation-ws-BJWJviUX.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/diff.$shortcut":{"id":"routes/diff.$shortcut","parentId":"routes/diff","path":":shortcut","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/diff._shortcut-l0sNRNKZ.js","imports":[],"css":[]},"routes/exercises":{"id":"routes/exercises","parentId":"root","path":"exercises","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/exercises-l0sNRNKZ.js","imports":[],"css":[]},"routes/launch-editor":{"id":"routes/launch-editor","parentId":"root","path":"launch-editor","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/launch-editor-l0sNRNKZ.js","imports":[],"css":[]},"routes/login-sse":{"id":"routes/login-sse","parentId":"root","path":"login-sse","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/login-sse-l0sNRNKZ.js","imports":[],"css":[]},"routes/mark-onboarding-complete":{"id":"routes/mark-onboarding-complete","parentId":"root","path":"mark-onboarding-complete","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/mark-onboarding-complete-l0sNRNKZ.js","imports":[],"css":[]},"routes/mcp-ui+/epic-video":{"id":"routes/mcp-ui+/epic-video","parentId":"root","path":"mcp-ui/epic-video","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/epic-video-Bx8Ctiez.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/epic-video-BVcJzJzi.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-BW8stNyh.js","/assets/misc-DVYuZMjW.js","/assets/tooltip-Chzzs4KB.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CUydCGD3.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/og":{"id":"routes/og","parentId":"root","path":"og","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/og-l0sNRNKZ.js","imports":[],"css":[]},"routes/persist-playground":{"id":"routes/persist-playground","parentId":"root","path":"persist-playground","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/persist-playground-l0sNRNKZ.js","imports":[],"css":[]},"routes/processes":{"id":"routes/processes","parentId":"root","path":"processes","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/processes-l0sNRNKZ.js","imports":[],"css":[]},"routes/progress":{"id":"routes/progress","parentId":"root","path":"progress","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/progress-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/healthcheck":{"id":"routes/resources+/healthcheck","parentId":"root","path":"resources/healthcheck","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/healthcheck-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/lookout":{"id":"routes/resources+/lookout","parentId":"root","path":"resources/lookout","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/lookout-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/offline-video-progress.$playbackId":{"id":"routes/resources+/offline-video-progress.$playbackId","parentId":"root","path":"resources/offline-video-progress/:playbackId","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-video-progress._playbackId-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/offline-videos":{"id":"routes/resources+/offline-videos","parentId":"root","path":"resources/offline-videos","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-videos-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/offline-videos.$playbackId":{"id":"routes/resources+/offline-videos.$playbackId","parentId":"routes/resources+/offline-videos","path":":playbackId","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-videos._playbackId-l0sNRNKZ.js","imports":[],"css":[]},"routes/robots[.]txt":{"id":"routes/robots[.]txt","parentId":"root","path":"robots.txt","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/robots_._txt-l0sNRNKZ.js","imports":[],"css":[]},"routes/saved-playgrounds":{"id":"routes/saved-playgrounds","parentId":"root","path":"saved-playgrounds","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/saved-playgrounds-l0sNRNKZ.js","imports":[],"css":[]},"routes/set-playground":{"id":"routes/set-playground","parentId":"root","path":"set-playground","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/set-playground-l0sNRNKZ.js","imports":[],"css":[]},"routes/sitemap[.]xml":{"id":"routes/sitemap[.]xml","parentId":"root","path":"sitemap.xml","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/sitemap_._xml-l0sNRNKZ.js","imports":[],"css":[]},"routes/start":{"id":"routes/start","parentId":"root","path":"start","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/start-l0sNRNKZ.js","imports":[],"css":[]},"routes/test":{"id":"routes/test","parentId":"root","path":"test","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test-l0sNRNKZ.js","imports":[],"css":[]},"routes/theme/index":{"id":"routes/theme/index","parentId":"root","path":"theme","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-DP2rzg_V.js","imports":[],"css":[]},"routes/video-player/index":{"id":"routes/video-player/index","parentId":"root","path":"video-player","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-K6Dvbx-E.js","imports":[],"css":[]}},"url":"/assets/manifest-34df6718.js","version":"34df6718"};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e}from"./jsx-runtime-C5WNSv3b.js";import{r as l}from"./index-CqIc3cxq.js";import{A as ue,L as M}from"./chunk-EPOLDU6W-BCLmut3y.js";import{u as de,I as N,c as fe}from"./misc-DVYuZMjW.js";import{L as me}from"./loading-CUydCGD3.js";import{D as xe,u as pe}from"./discord-DlU9y5Iz.js";import{u as he}from"./online-DiNLkgTC.js";import{c as G,d as O,P as T,f as g,e as ve,u as K,o as ge,g as be,S as je}from"./tooltip-Chzzs4KB.js";import{g as we,u as $}from"./index-BOhw3wcM.js";import{t as Ne}from"./index-DzdDahau.js";import{S as Te}from"./set-playground-DeMY9i7p.js";import{P as Ie}from"./playground-window-D9a7P7rH.js";import{P as Ce}from"./preview-CiDtuQCc.js";var _="rovingFocusGroup.onEntryFocus",ye={bubbles:!1,cancelable:!0},I="RovingFocusGroup",[A,V,Fe]=we(I),[Re,B]=G(I,[Fe]),[Pe,Se]=Re(I),z=l.forwardRef((t,s)=>e.jsx(A.Provider,{scope:t.__scopeRovingFocusGroup,children:e.jsx(A.Slot,{scope:t.__scopeRovingFocusGroup,children:e.jsx(Ee,{...t,ref:s})})}));z.displayName=I;var Ee=l.forwardRef((t,s)=>{const{__scopeRovingFocusGroup:n,orientation:r,loop:a=!1,dir:u,currentTabStopId:i,defaultCurrentTabStopId:m,onCurrentTabStopIdChange:v,onEntryFocus:x,preventScrollOnEntryFocus:o=!1,...c}=t,p=l.useRef(null),C=ve(s,p),y=$(u),[F,d]=K({prop:i,defaultProp:m??null,onChange:v,caller:I}),[b,P]=l.useState(!1),h=ge(x),j=V(n),S=l.useRef(!1),[oe,k]=l.useState(0);return l.useEffect(()=>{const f=p.current;if(f)return f.addEventListener(_,h),()=>f.removeEventListener(_,h)},[h]),e.jsx(Pe,{scope:n,orientation:r,dir:y,loop:a,currentTabStopId:F,onItemFocus:l.useCallback(f=>d(f),[d]),onItemShiftTab:l.useCallback(()=>P(!0),[]),onFocusableItemAdd:l.useCallback(()=>k(f=>f+1),[]),onFocusableItemRemove:l.useCallback(()=>k(f=>f-1),[]),children:e.jsx(T.div,{tabIndex:b||oe===0?-1:0,"data-orientation":r,...c,ref:C,style:{outline:"none",...t.style},onMouseDown:g(t.onMouseDown,()=>{S.current=!0}),onFocus:g(t.onFocus,f=>{const ae=!S.current;if(f.target===f.currentTarget&&ae&&!b){const L=new CustomEvent(_,ye);if(f.currentTarget.dispatchEvent(L),!L.defaultPrevented){const E=j().filter(w=>w.focusable),ie=E.find(w=>w.active),le=E.find(w=>w.id===F),ce=[ie,le,...E].filter(Boolean).map(w=>w.ref.current);Y(ce,o)}}S.current=!1}),onBlur:g(t.onBlur,()=>P(!1))})})}),H="RovingFocusGroupItem",W=l.forwardRef((t,s)=>{const{__scopeRovingFocusGroup:n,focusable:r=!0,active:a=!1,tabStopId:u,children:i,...m}=t,v=O(),x=u||v,o=Se(H,n),c=o.currentTabStopId===x,p=V(n),{onFocusableItemAdd:C,onFocusableItemRemove:y,currentTabStopId:F}=o;return l.useEffect(()=>{if(r)return C(),()=>y()},[r,C,y]),e.jsx(A.ItemSlot,{scope:n,id:x,focusable:r,active:a,children:e.jsx(T.span,{tabIndex:c?0:-1,"data-orientation":o.orientation,...m,ref:s,onMouseDown:g(t.onMouseDown,d=>{r?o.onItemFocus(x):d.preventDefault()}),onFocus:g(t.onFocus,()=>o.onItemFocus(x)),onKeyDown:g(t.onKeyDown,d=>{if(d.key==="Tab"&&d.shiftKey){o.onItemShiftTab();return}if(d.target!==d.currentTarget)return;const b=De(d,o.orientation,o.dir);if(b!==void 0){if(d.metaKey||d.ctrlKey||d.altKey||d.shiftKey)return;d.preventDefault();let h=p().filter(j=>j.focusable).map(j=>j.ref.current);if(b==="last")h.reverse();else if(b==="prev"||b==="next"){b==="prev"&&h.reverse();const j=h.indexOf(d.currentTarget);h=o.loop?ke(h,j+1):h.slice(j+1)}setTimeout(()=>Y(h))}}),children:typeof i=="function"?i({isCurrentTabStop:c,hasTabStop:F!=null}):i})})});W.displayName=H;var _e={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function Ae(t,s){return s!=="rtl"?t:t==="ArrowLeft"?"ArrowRight":t==="ArrowRight"?"ArrowLeft":t}function De(t,s,n){const r=Ae(t.key,n);if(!(s==="vertical"&&["ArrowLeft","ArrowRight"].includes(r))&&!(s==="horizontal"&&["ArrowUp","ArrowDown"].includes(r)))return _e[r]}function Y(t,s=!1){const n=document.activeElement;for(const r of t)if(r===n||(r.focus({preventScroll:s}),document.activeElement!==n))return}function ke(t,s){return t.map((n,r)=>t[(s+r)%t.length])}var Le=z,Ue=W,R="Tabs",[Me]=G(R,[B]),q=B(),[Ge,D]=Me(R),J=l.forwardRef((t,s)=>{const{__scopeTabs:n,value:r,onValueChange:a,defaultValue:u,orientation:i="horizontal",dir:m,activationMode:v="automatic",...x}=t,o=$(m),[c,p]=K({prop:r,onChange:a,defaultProp:u??"",caller:R});return e.jsx(Ge,{scope:n,baseId:O(),value:c,onValueChange:p,orientation:i,dir:o,activationMode:v,children:e.jsx(T.div,{dir:o,"data-orientation":i,...x,ref:s})})});J.displayName=R;var Q="TabsList",X=l.forwardRef((t,s)=>{const{__scopeTabs:n,loop:r=!0,...a}=t,u=D(Q,n),i=q(n);return e.jsx(Le,{asChild:!0,...i,orientation:u.orientation,dir:u.dir,loop:r,children:e.jsx(T.div,{role:"tablist","aria-orientation":u.orientation,...a,ref:s})})});X.displayName=Q;var Z="TabsTrigger",ee=l.forwardRef((t,s)=>{const{__scopeTabs:n,value:r,disabled:a=!1,...u}=t,i=D(Z,n),m=q(n),v=ne(i.baseId,r),x=re(i.baseId,r),o=r===i.value;return e.jsx(Ue,{asChild:!0,...m,focusable:!a,active:o,children:e.jsx(T.button,{type:"button",role:"tab","aria-selected":o,"aria-controls":x,"data-state":o?"active":"inactive","data-disabled":a?"":void 0,disabled:a,id:v,...u,ref:s,onMouseDown:g(t.onMouseDown,c=>{!a&&c.button===0&&c.ctrlKey===!1?i.onValueChange(r):c.preventDefault()}),onKeyDown:g(t.onKeyDown,c=>{[" ","Enter"].includes(c.key)&&i.onValueChange(r)}),onFocus:g(t.onFocus,()=>{const c=i.activationMode!=="manual";!o&&!a&&c&&i.onValueChange(r)})})})});ee.displayName=Z;var te="TabsContent",se=l.forwardRef((t,s)=>{const{__scopeTabs:n,value:r,forceMount:a,children:u,...i}=t,m=D(te,n),v=ne(m.baseId,r),x=re(m.baseId,r),o=r===m.value,c=l.useRef(o);return l.useEffect(()=>{const p=requestAnimationFrame(()=>c.current=!1);return()=>cancelAnimationFrame(p)},[]),e.jsx(be,{present:a||o,children:({present:p})=>e.jsx(T.div,{"data-state":o?"active":"inactive","data-orientation":m.orientation,role:"tabpanel","aria-labelledby":v,hidden:!p,id:x,tabIndex:0,...i,ref:s,style:{...t.style,animationDuration:c.current?"0s":void 0},children:p&&u})})});se.displayName=te;function ne(t,s){return`${t}-trigger-${s}`}function re(t,s){return`${t}-content-${s}`}var ot=J,Oe=X,Ke=ee,at=se;function it({discordPostsPromise:t}){return e.jsxs("div",{className:"flex h-full w-full flex-col gap-4 pt-4",children:[e.jsx("div",{className:"text-center",children:e.jsx(xe,{})}),e.jsx("div",{className:"bg-accent scrollbar-thin scrollbar-thumb-scrollbar flex-1 overflow-y-scroll pb-4",children:e.jsx($e,{discordPostsPromise:t})})]})}function $e({discordPostsPromise:t}){const s=pe(),n=de();return he()?e.jsxs("div",{className:"flex h-full flex-col items-center justify-between",children:[e.jsx(l.Suspense,{fallback:e.jsx("div",{className:"flex h-full w-full flex-col items-center justify-center",children:e.jsx(me,{children:"Loading Discord Posts"})}),children:e.jsx(ue,{resolve:t,errorElement:e.jsx("div",{className:"text-foreground-destructive",children:"There was a problem loading the discord posts"}),children:a=>e.jsx("ul",{className:"flex w-full flex-col gap-4 p-3 xl:p-12",children:a.map(u=>e.jsx("li",{className:"bg-background rounded-xl border transition-all duration-200 focus-within:-translate-y-1 focus-within:shadow-lg hover:-translate-y-1 hover:shadow-lg",children:e.jsx(Ve,{thread:u})},u.id))})})}),e.jsx("div",{children:e.jsxs(M,{to:n&&!s.includes("oauth")?s.replace(/^https/,"discord"):s,target:s.includes("oauth")?void 0:"_blank",rel:"noreferrer noopener",onClick:n?a=>{a.preventDefault(),window.open(a.currentTarget.href,"_blank","noreferrer noopener")}:void 0,className:"flex items-center gap-2 p-2 text-xl hover:underline",children:["Create Post ",e.jsx(N,{name:"ExternalLink"})]})})]}):e.jsx("div",{className:"flex h-full flex-col items-center justify-between",children:e.jsx("div",{className:"text-foreground-destructive flex h-full w-full flex-col items-center justify-center",children:e.jsx(N,{name:"WifiNoConnection",size:"xl",children:"Unable to load discord messages when offline"})})})}function Ve({thread:t}){const s=t.reactions.filter(n=>n.count);return e.jsx("div",{children:e.jsxs("div",{className:"flex flex-col gap-2 p-4",children:[e.jsxs("div",{className:"flex min-w-0 gap-4",children:[e.jsxs("div",{className:"flex min-w-0 flex-col gap-1",children:[t.tags.length?e.jsx("div",{className:"flex gap-2",children:t.tags.map(n=>e.jsxs("div",{className:"bg-accent flex items-center justify-center gap-1 rounded-full px-2 py-1 text-sm",children:[e.jsx("span",{className:"h-3 w-3 leading-3",children:e.jsx(U,{name:n.emojiName,url:n.emojiUrl})}),e.jsx("span",{children:n.name})]},`${n.name}-${n.emojiName??n.emojiUrl??"tag"}`))}):null,e.jsx("strong",{className:"text-xl font-bold",children:t.name}),e.jsxs("div",{className:"flex min-w-0 flex-col gap-1",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[t.authorAvatarUrl?e.jsx("img",{src:t.authorAvatarUrl,alt:"",className:"h-6 w-6 rounded-full"}):null,e.jsxs("span",{children:[e.jsx("span",{className:"font-bold",style:t.authorHexAccentColor?{color:t.authorHexAccentColor}:{},children:t.authorDisplayName}),":"," "]})]}),e.jsx("span",{className:"text-muted-foreground line-clamp-4 min-w-0",children:t.messagePreview})]})]}),t.previewImageUrl?e.jsx("img",{src:t.previewImageUrl,alt:"",className:"h-28 w-28 rounded-lg object-cover"}):null]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{children:s.length?e.jsx("ul",{className:"flex items-center gap-2",children:s.map((n,r)=>e.jsxs("li",{className:"border-info/60 bg-info/10 text-info flex items-center gap-1 rounded-md border px-[5px] py-[0.5px] text-sm",children:[e.jsx("span",{className:"h-3 w-3 leading-3",children:e.jsx(U,{name:n.emojiName,url:n.emojiUrl})}),e.jsx("span",{children:n.count})]},`${n.emojiName??n.emojiUrl??"reaction"}-${r}`))}):null}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(N,{name:"Chat"})," ",t.messageCount]}),` · ${t.lastUpdatedDisplay}`]})]}),e.jsxs("span",{className:"flex items-center gap-4",children:[e.jsx("a",{href:t.link.replace(/^https/,"discord"),children:e.jsx(N,{name:"Discord"})}),e.jsx("a",{href:t.link,target:"_blank",rel:"noreferrer noopener",children:e.jsx(N,{name:"ExternalLink"})})]})]})]})})}function U({name:t,url:s}){return s?e.jsx("img",{src:s,alt:t,className:"h-full w-full"}):t||null}function Be({status:t}){const s={running:{pinger:"bg-yellow-500/60",circle:"bg-yellow-500"},passed:{circle:"bg-success"},failed:{circle:"bg-destructive"},stopped:{circle:"bg-muted-foreground"}}[t];return e.jsxs("span",{className:"relative flex h-3 w-3",children:[s.pinger?e.jsx("span",{className:`absolute inline-flex h-full w-full animate-ping rounded-full ${s.pinger} opacity-75`}):null,e.jsx("span",{className:`relative inline-flex h-3 w-3 rounded-full ${s.circle}`})]})}function lt(t,s,n){const r=new URLSearchParams(t);return s===n?r.delete("preview"):r.set("preview",s),r}function ct({tabs:t}){return e.jsx(Oe,{className:"scrollbar-thin scrollbar-thumb-scrollbar h-14 min-h-14 overflow-x-auto border-b whitespace-nowrap",children:t.map(s=>e.jsx(Ke,{value:s.id,hidden:s.hidden,asChild:!0,children:e.jsx(M,{id:`${s.id}-tab`,className:fe("clip-path-button radix-state-active:z-10 radix-state-active:bg-foreground radix-state-active:text-background radix-state-active:hover:bg-foreground/80 radix-state-active:hover:text-background/80 radix-state-inactive:hover:bg-foreground/20 radix-state-inactive:hover:text-foreground/80 focus:bg-foreground/80 focus:text-background/80 relative h-full px-6 py-4 font-mono text-sm uppercase outline-none",s.hidden?"hidden":"inline-block"),preventScrollReset:!0,prefetch:"intent",onClick:s.onClick,to:s.to,children:e.jsxs("span",{className:"flex items-center gap-2",children:[s.status?e.jsx(Be,{status:s.status}):null,e.jsx("span",{children:s.label})]})})},s.id))})}function ut({appInfo:t,inBrowserBrowserRef:s,problemAppName:n,allApps:r,isUpToDate:a}){return e.jsx(Ie,{playgroundAppName:t?.appName,problemAppName:n,allApps:r,isUpToDate:a,children:t?.dev?.type==="none"?e.jsxs("div",{className:"flex h-full flex-col items-center justify-center gap-4",children:[e.jsx("div",{className:"text-secondary-foreground text-2xl",children:"Non-UI exercise"}),e.jsxs("div",{className:"text-secondary-foreground max-w-md text-center text-balance",children:["This exercise has no application or other UI associated with it."," ",e.jsx("br",{}),"Navigate to"," ",e.jsx(je,{content:t.fullPath,children:e.jsxs("span",{className:"inline-flex cursor-pointer items-center gap-1.5 underline",onClick:()=>{navigator.clipboard.writeText(t.fullPath),Ne.success("Copied playground path to clipboard")},children:["the playground directory",e.jsx(N,{name:"Copy",size:"sm"})]})})," ","in your editor and follow the exercise instructions to complete it."]})]}):t?e.jsx(Ce,{id:t.appName,appInfo:t,inBrowserBrowserRef:s}):e.jsxs("div",{className:"flex flex-col justify-center gap-2",children:[e.jsx("p",{children:"Please set the playground first"}),n?e.jsx(Te,{appName:n}):null]})})}export{at as C,it as D,ct as P,ot as R,ut as a,lt as g};
|
|
2
|
-
//# sourceMappingURL=playground-C_aP_pE8.js.map
|