@epic-web/workshop-app 6.4.0 → 6.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. package/build/client/assets/{_-DbsI2yZ3.js → _-DOI2gHX3.js} +2 -2
  2. package/build/client/assets/{_-DbsI2yZ3.js.map → _-DOI2gHX3.js.map} +1 -1
  3. package/build/client/assets/{_-C9pypk8E.js → _-v6PvHZ90.js} +2 -2
  4. package/build/client/assets/_-v6PvHZ90.js.map +1 -0
  5. package/build/client/assets/{_basePickBy-BaGiSohD.js → _basePickBy-DK6It6WA.js} +2 -2
  6. package/build/client/assets/{_basePickBy-BaGiSohD.js.map → _basePickBy-DK6It6WA.js.map} +1 -1
  7. package/build/client/assets/{_baseUniq-BxpIs2Oy.js → _baseUniq-B14mMiqO.js} +2 -2
  8. package/build/client/assets/{_baseUniq-BxpIs2Oy.js.map → _baseUniq-B14mMiqO.js.map} +1 -1
  9. package/build/client/assets/{_exerciseNumber-uGponlfN.js → _exerciseNumber-BhK_Xufd.js} +2 -2
  10. package/build/client/assets/{_exerciseNumber-uGponlfN.js.map → _exerciseNumber-BhK_Xufd.js.map} +1 -1
  11. package/build/client/assets/{_exerciseNumber_._stepNumber-Ce6_sCcU.js → _exerciseNumber_._stepNumber-DBbWnlEd.js} +2 -2
  12. package/build/client/assets/{_exerciseNumber_._stepNumber-Ce6_sCcU.js.map → _exerciseNumber_._stepNumber-DBbWnlEd.js.map} +1 -1
  13. package/build/client/assets/_exerciseNumber_._stepNumber.index-Br7x8lR0.js +2 -0
  14. package/build/client/assets/_exerciseNumber_._stepNumber.index-Br7x8lR0.js.map +1 -0
  15. package/build/client/assets/{_exerciseNumber_.finished-BE2v5_rB.js → _exerciseNumber_.finished-B0iUZ4Jp.js} +2 -2
  16. package/build/client/assets/{_exerciseNumber_.finished-BE2v5_rB.js.map → _exerciseNumber_.finished-B0iUZ4Jp.js.map} +1 -1
  17. package/build/client/assets/_layout-BP3Hz4UU.js +2 -0
  18. package/build/client/assets/{_layout-Co6ujuzn.js.map → _layout-BP3Hz4UU.js.map} +1 -1
  19. package/build/client/assets/{_layout-Bzzu5Cz1.js → _layout-DKmpru-v.js} +2 -2
  20. package/build/client/assets/{_layout-Bzzu5Cz1.js.map → _layout-DKmpru-v.js.map} +1 -1
  21. package/build/client/assets/{_layout-vRDHFYoQ.js → _layout-DRBfGSzn.js} +2 -2
  22. package/build/client/assets/{_layout-vRDHFYoQ.js.map → _layout-DRBfGSzn.js.map} +1 -1
  23. package/build/client/assets/{_layout-BVzBSE-n.js → _layout-DxOG9P39.js} +2 -2
  24. package/build/client/assets/{_layout-BVzBSE-n.js.map → _layout-DxOG9P39.js.map} +1 -1
  25. package/build/client/assets/{accordion-BDR86Xcb.js → accordion-CQRBxCdM.js} +2 -2
  26. package/build/client/assets/{accordion-BDR86Xcb.js.map → accordion-CQRBxCdM.js.map} +1 -1
  27. package/build/client/assets/{account-Cldpf0d2.js → account-BwxqSFjk.js} +2 -2
  28. package/build/client/assets/{account-Cldpf0d2.js.map → account-BwxqSFjk.js.map} +1 -1
  29. package/build/client/assets/api._-Br7x8lR0.js +2 -0
  30. package/build/client/assets/api._-Br7x8lR0.js.map +1 -0
  31. package/build/client/assets/app-CJ-4VoDp.js +2 -0
  32. package/build/client/assets/{app-DmNyqOoy.js.map → app-CJ-4VoDp.js.map} +1 -1
  33. package/build/client/assets/app.epic_ws_.js_-Br7x8lR0.js +2 -0
  34. package/build/client/assets/app.epic_ws_.js_-Br7x8lR0.js.map +1 -0
  35. package/build/client/assets/apps-4hFOncm9.js +2 -0
  36. package/build/client/assets/apps-4hFOncm9.js.map +1 -0
  37. package/build/client/assets/apps-Br7x8lR0.js +2 -0
  38. package/build/client/assets/apps-Br7x8lR0.js.map +1 -0
  39. package/build/client/assets/{arc-DRlf7jq7.js → arc-BVQduULV.js} +2 -2
  40. package/build/client/assets/{arc-DRlf7jq7.js.map → arc-BVQduULV.js.map} +1 -1
  41. package/build/client/assets/{architectureDiagram-NQ2NVSRB-CrmRQ9SO.js → architectureDiagram-NQ2NVSRB-CR4gCI8X.js} +2 -2
  42. package/build/client/assets/{architectureDiagram-NQ2NVSRB-CrmRQ9SO.js.map → architectureDiagram-NQ2NVSRB-CR4gCI8X.js.map} +1 -1
  43. package/build/client/assets/{blockDiagram-PHRCVELO-xwBltM5R.js → blockDiagram-PHRCVELO-DuxnuM93.js} +2 -2
  44. package/build/client/assets/{blockDiagram-PHRCVELO-xwBltM5R.js.map → blockDiagram-PHRCVELO-DuxnuM93.js.map} +1 -1
  45. package/build/client/assets/{button-BlPb-37-.js → button-DGnwQ6KN.js} +2 -2
  46. package/build/client/assets/{button-BlPb-37-.js.map → button-DGnwQ6KN.js.map} +1 -1
  47. package/build/client/assets/{c4Diagram-6F6E4RAY-JkoDHTPF.js → c4Diagram-6F6E4RAY-Dqlm7faJ.js} +2 -2
  48. package/build/client/assets/{c4Diagram-6F6E4RAY-JkoDHTPF.js.map → c4Diagram-6F6E4RAY-Dqlm7faJ.js.map} +1 -1
  49. package/build/client/assets/cache-Br7x8lR0.js +2 -0
  50. package/build/client/assets/cache-Br7x8lR0.js.map +1 -0
  51. package/build/client/assets/channel-Ccfwel2m.js +2 -0
  52. package/build/client/assets/{channel-Cks3Ea6t.js.map → channel-Ccfwel2m.js.map} +1 -1
  53. package/build/client/assets/{chunk-353BL4L5-CHKdRF8O.js → chunk-353BL4L5-CY0biqke.js} +2 -2
  54. package/build/client/assets/{chunk-353BL4L5-CHKdRF8O.js.map → chunk-353BL4L5-CY0biqke.js.map} +1 -1
  55. package/build/client/assets/{chunk-67H74DCK-BMun8kdQ.js → chunk-67H74DCK-CZpFcSK7.js} +2 -2
  56. package/build/client/assets/{chunk-67H74DCK-BMun8kdQ.js.map → chunk-67H74DCK-CZpFcSK7.js.map} +1 -1
  57. package/build/client/assets/{chunk-6OLS64BW-D0k_ZwIC.js → chunk-6OLS64BW-CV0M_3sG.js} +2 -2
  58. package/build/client/assets/{chunk-6OLS64BW-D0k_ZwIC.js.map → chunk-6OLS64BW-CV0M_3sG.js.map} +1 -1
  59. package/build/client/assets/{chunk-AACKK3MU-Cj8nrtEq.js → chunk-AACKK3MU-B4Z3pj6y.js} +2 -2
  60. package/build/client/assets/{chunk-AACKK3MU-Cj8nrtEq.js.map → chunk-AACKK3MU-B4Z3pj6y.js.map} +1 -1
  61. package/build/client/assets/{chunk-BFAMUDN2-CIt8WAbe.js → chunk-BFAMUDN2-xSXsSdRc.js} +2 -2
  62. package/build/client/assets/{chunk-BFAMUDN2-CIt8WAbe.js.map → chunk-BFAMUDN2-xSXsSdRc.js.map} +1 -1
  63. package/build/client/assets/{chunk-E2GYISFI-lfUxhUba.js → chunk-E2GYISFI-XxwOHDH_.js} +2 -2
  64. package/build/client/assets/{chunk-E2GYISFI-lfUxhUba.js.map → chunk-E2GYISFI-XxwOHDH_.js.map} +1 -1
  65. package/build/client/assets/{chunk-QEP2MXWD-By0BtF5w.js → chunk-QEP2MXWD-ChxN-fyh.js} +2 -2
  66. package/build/client/assets/{chunk-QEP2MXWD-By0BtF5w.js.map → chunk-QEP2MXWD-ChxN-fyh.js.map} +1 -1
  67. package/build/client/assets/{chunk-QMGIS6GS-D3fke51R.js → chunk-QMGIS6GS-Cnm5uIBY.js} +2 -2
  68. package/build/client/assets/{chunk-QMGIS6GS-D3fke51R.js.map → chunk-QMGIS6GS-Cnm5uIBY.js.map} +1 -1
  69. package/build/client/assets/{chunk-SKB7J2MH-B4y7fFww.js → chunk-SKB7J2MH-Iq1sBnJg.js} +2 -2
  70. package/build/client/assets/{chunk-SKB7J2MH-B4y7fFww.js.map → chunk-SKB7J2MH-Iq1sBnJg.js.map} +1 -1
  71. package/build/client/assets/classDiagram-BGRH5UQR-C3baNHIn.js +2 -0
  72. package/build/client/assets/{classDiagram-BGRH5UQR-Ddac1FX8.js.map → classDiagram-BGRH5UQR-C3baNHIn.js.map} +1 -1
  73. package/build/client/assets/classDiagram-v2-O24JOBDK-C3baNHIn.js +2 -0
  74. package/build/client/assets/{classDiagram-v2-O24JOBDK-Ddac1FX8.js.map → classDiagram-v2-O24JOBDK-C3baNHIn.js.map} +1 -1
  75. package/build/client/assets/clone-CBh9K_C0.js +2 -0
  76. package/build/client/assets/{clone-BzOlX5uP.js.map → clone-CBh9K_C0.js.map} +1 -1
  77. package/build/client/assets/{dagre-FFZHY6LT-BF_ENDvI.js → dagre-FFZHY6LT-DRX4CPoT.js} +2 -2
  78. package/build/client/assets/{dagre-FFZHY6LT-BF_ENDvI.js.map → dagre-FFZHY6LT-DRX4CPoT.js.map} +1 -1
  79. package/build/client/assets/{diagram-3EMPZRKU-Co8BNYOp.js → diagram-3EMPZRKU-DnyeZVpZ.js} +2 -2
  80. package/build/client/assets/{diagram-3EMPZRKU-Co8BNYOp.js.map → diagram-3EMPZRKU-DnyeZVpZ.js.map} +1 -1
  81. package/build/client/assets/{diagram-5UYTHUR4-CTF96wbH.js → diagram-5UYTHUR4-CGNqEi7_.js} +2 -2
  82. package/build/client/assets/{diagram-5UYTHUR4-CTF96wbH.js.map → diagram-5UYTHUR4-CGNqEi7_.js.map} +1 -1
  83. package/build/client/assets/{diagram-ZTM2IBQH-BPjsVcII.js → diagram-ZTM2IBQH-TQuk-ulz.js} +2 -2
  84. package/build/client/assets/{diagram-ZTM2IBQH-BPjsVcII.js.map → diagram-ZTM2IBQH-TQuk-ulz.js.map} +1 -1
  85. package/build/client/assets/diff-C4a0B6T4.js +2 -0
  86. package/build/client/assets/{diff-C4mTCnzp.js.map → diff-C4a0B6T4.js.map} +1 -1
  87. package/build/client/assets/{diff-BHlDvw_d.js → diff-CvXO10rY.js} +2 -2
  88. package/build/client/assets/{diff-BHlDvw_d.js.map → diff-CvXO10rY.js.map} +1 -1
  89. package/build/client/assets/discord-BoNGnjEv.js +2 -0
  90. package/build/client/assets/discord-BoNGnjEv.js.map +1 -0
  91. package/build/client/assets/{discord-DajcCBfS.js → discord-CpOQOwKa.js} +2 -2
  92. package/build/client/assets/{discord-DajcCBfS.js.map → discord-CpOQOwKa.js.map} +1 -1
  93. package/build/client/assets/{entry.client-CkiXyAWa.js → entry.client-JXPtXVLj.js} +2 -2
  94. package/build/client/assets/{entry.client-CkiXyAWa.js.map → entry.client-JXPtXVLj.js.map} +1 -1
  95. package/build/client/assets/{epic-video-7egGi8C6.js → epic-video-VKhk-6Mv.js} +2 -2
  96. package/build/client/assets/{epic-video-7egGi8C6.js.map → epic-video-VKhk-6Mv.js.map} +1 -1
  97. package/build/client/assets/epic_ws_.js_-Br7x8lR0.js +2 -0
  98. package/build/client/assets/epic_ws_.js_-Br7x8lR0.js.map +1 -0
  99. package/build/client/assets/{erDiagram-R3QVA2FD-CoI7VxY8.js → erDiagram-R3QVA2FD-DcVPSaZ1.js} +2 -2
  100. package/build/client/assets/{erDiagram-R3QVA2FD-CoI7VxY8.js.map → erDiagram-R3QVA2FD-DcVPSaZ1.js.map} +1 -1
  101. package/build/client/assets/{error-boundary-DxZMubY-.js → error-boundary-BDRYzb6K.js} +2 -2
  102. package/build/client/assets/{error-boundary-DxZMubY-.js.map → error-boundary-BDRYzb6K.js.map} +1 -1
  103. package/build/client/assets/exercises-Br7x8lR0.js +2 -0
  104. package/build/client/assets/exercises-Br7x8lR0.js.map +1 -0
  105. package/build/client/assets/{finished-DqZ90XsZ.js → finished-BkL8cvWw.js} +2 -2
  106. package/build/client/assets/{finished-DqZ90XsZ.js.map → finished-BkL8cvWw.js.map} +1 -1
  107. package/build/client/assets/{flowDiagram-PKI6S5ZS-FVR0aJCb.js → flowDiagram-PKI6S5ZS-BjGswWQI.js} +2 -2
  108. package/build/client/assets/{flowDiagram-PKI6S5ZS-FVR0aJCb.js.map → flowDiagram-PKI6S5ZS-BjGswWQI.js.map} +1 -1
  109. package/build/client/assets/{ganttDiagram-EK5VF46D-Cgd-KnRJ.js → ganttDiagram-EK5VF46D-CigmRAu8.js} +2 -2
  110. package/build/client/assets/{ganttDiagram-EK5VF46D-Cgd-KnRJ.js.map → ganttDiagram-EK5VF46D-CigmRAu8.js.map} +1 -1
  111. package/build/client/assets/{gitGraphDiagram-GW3U2K7C-C5-T89ck.js → gitGraphDiagram-GW3U2K7C-BZRSDtTk.js} +2 -2
  112. package/build/client/assets/{gitGraphDiagram-GW3U2K7C-C5-T89ck.js.map → gitGraphDiagram-GW3U2K7C-BZRSDtTk.js.map} +1 -1
  113. package/build/client/assets/{graph-2blmPy0J.js → graph-ssQ5a7An.js} +2 -2
  114. package/build/client/assets/{graph-2blmPy0J.js.map → graph-ssQ5a7An.js.map} +1 -1
  115. package/build/client/assets/index-4hFOncm9.js +2 -0
  116. package/build/client/assets/index-4hFOncm9.js.map +1 -0
  117. package/build/client/assets/index-BEOsF4gu.js +2 -0
  118. package/build/client/assets/index-BEOsF4gu.js.map +1 -0
  119. package/build/client/assets/{index-DXWoNbMw.js → index-BSUgjf5i.js} +2 -2
  120. package/build/client/assets/{index-DXWoNbMw.js.map → index-BSUgjf5i.js.map} +1 -1
  121. package/build/client/assets/index-Br7x8lR0.js +2 -0
  122. package/build/client/assets/index-Br7x8lR0.js.map +1 -0
  123. package/build/client/assets/{index-DMYU8Adz.js → index-BvSgrEwH.js} +2 -2
  124. package/build/client/assets/{index-DMYU8Adz.js.map → index-BvSgrEwH.js.map} +1 -1
  125. package/build/client/assets/{index-ENEzd29c.js → index-ByKe5Bbc.js} +2 -2
  126. package/build/client/assets/{index-ENEzd29c.js.map → index-ByKe5Bbc.js.map} +1 -1
  127. package/build/client/assets/{index-BF30kxMM.js → index-CSKRws-d.js} +2 -2
  128. package/build/client/assets/{index-BF30kxMM.js.map → index-CSKRws-d.js.map} +1 -1
  129. package/build/client/assets/{index-N0rVhLdR.js → index-Ce8G4fcS.js} +2 -2
  130. package/build/client/assets/{index-N0rVhLdR.js.map → index-Ce8G4fcS.js.map} +1 -1
  131. package/build/client/assets/{index-CY2XuFSg.js → index-CfuMsJpq.js} +2 -2
  132. package/build/client/assets/{index-CY2XuFSg.js.map → index-CfuMsJpq.js.map} +1 -1
  133. package/build/client/assets/{index-BpiFo4Bs.js → index-DQHP10an.js} +2 -2
  134. package/build/client/assets/{index-BpiFo4Bs.js.map → index-DQHP10an.js.map} +1 -1
  135. package/build/client/assets/{index-BJy9GGix.js → index-DVtOZE_w.js} +2 -2
  136. package/build/client/assets/{index-BJy9GGix.js.map → index-DVtOZE_w.js.map} +1 -1
  137. package/build/client/assets/{index-C4WpsDjj.js → index-kpJjamgW.js} +2 -2
  138. package/build/client/assets/{index-C4WpsDjj.js.map → index-kpJjamgW.js.map} +1 -1
  139. package/build/client/assets/infoDiagram-RLU2ROGC-oEx_S6Vy.js +3 -0
  140. package/build/client/assets/{infoDiagram-RLU2ROGC-D9Xc3j8L.js.map → infoDiagram-RLU2ROGC-oEx_S6Vy.js.map} +1 -1
  141. package/build/client/assets/{journeyDiagram-EWQZEKCU-CYjHBCKP.js → journeyDiagram-EWQZEKCU-BX8-xfo9.js} +2 -2
  142. package/build/client/assets/{journeyDiagram-EWQZEKCU-CYjHBCKP.js.map → journeyDiagram-EWQZEKCU-BX8-xfo9.js.map} +1 -1
  143. package/build/client/assets/{jsx-runtime-B2LUJHWf.js → jsx-runtime-BcujL2Aj.js} +2 -2
  144. package/build/client/assets/{jsx-runtime-B2LUJHWf.js.map → jsx-runtime-BcujL2Aj.js.map} +1 -1
  145. package/build/client/assets/{kanban-definition-ILFWEQ3N-CzQXJAxD.js → kanban-definition-ILFWEQ3N-DSuN0acj.js} +2 -2
  146. package/build/client/assets/{kanban-definition-ILFWEQ3N-CzQXJAxD.js.map → kanban-definition-ILFWEQ3N-DSuN0acj.js.map} +1 -1
  147. package/build/client/assets/l-COkiy20v.js +2 -0
  148. package/build/client/assets/{l-F4A7XDEa.js.map → l-COkiy20v.js.map} +1 -1
  149. package/build/client/assets/launch-editor-Br7x8lR0.js +2 -0
  150. package/build/client/assets/launch-editor-Br7x8lR0.js.map +1 -0
  151. package/build/client/assets/{layout-CV-Afn_q.js → layout-CRUJr5tM.js} +2 -2
  152. package/build/client/assets/{layout-CV-Afn_q.js.map → layout-CRUJr5tM.js.map} +1 -1
  153. package/build/client/assets/{linear-jxQrrEcI.js → linear-4YOhyf6z.js} +2 -2
  154. package/build/client/assets/{linear-jxQrrEcI.js.map → linear-4YOhyf6z.js.map} +1 -1
  155. package/build/client/assets/{loading-j2MezYUg.js → loading-BQiZCXl-.js} +2 -2
  156. package/build/client/assets/{loading-j2MezYUg.js.map → loading-BQiZCXl-.js.map} +1 -1
  157. package/build/client/assets/{login-BcFnxSmx.js → login-C3y9sPuf.js} +2 -2
  158. package/build/client/assets/{login-BcFnxSmx.js.map → login-C3y9sPuf.js.map} +1 -1
  159. package/build/client/assets/login-sse-Br7x8lR0.js +2 -0
  160. package/build/client/assets/login-sse-Br7x8lR0.js.map +1 -0
  161. package/build/client/assets/manifest-93bf5827.js +1 -0
  162. package/build/client/assets/{mdx-qcm_nkgI.js → mdx-Bx84e4TR.js} +3 -3
  163. package/build/client/assets/{mdx-qcm_nkgI.js.map → mdx-Bx84e4TR.js.map} +1 -1
  164. package/build/client/assets/{mermaid.core-D3pfbveR.js → mermaid.core-DUlGGmFz.js} +5 -5
  165. package/build/client/assets/{mermaid.core-D3pfbveR.js.map → mermaid.core-DUlGGmFz.js.map} +1 -1
  166. package/build/client/assets/{mindmap-definition-CZNETY7S-C3usFkdR.js → mindmap-definition-CZNETY7S-BQAkEQ50.js} +2 -2
  167. package/build/client/assets/{mindmap-definition-CZNETY7S-C3usFkdR.js.map → mindmap-definition-CZNETY7S-BQAkEQ50.js.map} +1 -1
  168. package/build/client/assets/{misc-D-dDb89H.js → misc-CJXb1d0J.js} +2 -2
  169. package/build/client/assets/{misc-D-dDb89H.js.map → misc-CJXb1d0J.js.map} +1 -1
  170. package/build/client/assets/{nav-chevrons-BF-_ecnj.js → nav-chevrons-D9XKa1mH.js} +2 -2
  171. package/build/client/assets/{nav-chevrons-BF-_ecnj.js.map → nav-chevrons-D9XKa1mH.js.map} +1 -1
  172. package/build/client/assets/notifications-Br7x8lR0.js +2 -0
  173. package/build/client/assets/notifications-Br7x8lR0.js.map +1 -0
  174. package/build/client/assets/og-Br7x8lR0.js +2 -0
  175. package/build/client/assets/og-Br7x8lR0.js.map +1 -0
  176. package/build/client/assets/{onboarding-BM4wTFL9.js → onboarding-BaZDYUh7.js} +2 -2
  177. package/build/client/assets/{onboarding-BM4wTFL9.js.map → onboarding-BaZDYUh7.js.map} +1 -1
  178. package/build/client/assets/{online-DRbKQRzx.js → online-CgtIvFKH.js} +2 -2
  179. package/build/client/assets/{online-DRbKQRzx.js.map → online-CgtIvFKH.js.map} +1 -1
  180. package/build/client/assets/{pe-Dd-3Vdrv.js → pe-DBKBCHmz.js} +2 -2
  181. package/build/client/assets/{pe-Dd-3Vdrv.js.map → pe-DBKBCHmz.js.map} +1 -1
  182. package/build/client/assets/{pieDiagram-NIOCPIFQ-CNwdtlXk.js → pieDiagram-NIOCPIFQ-BoeOpfcZ.js} +2 -2
  183. package/build/client/assets/{pieDiagram-NIOCPIFQ-CNwdtlXk.js.map → pieDiagram-NIOCPIFQ-BoeOpfcZ.js.map} +1 -1
  184. package/build/client/assets/{preferences-CcTn1CYh.js → preferences-DgiQZThQ.js} +2 -2
  185. package/build/client/assets/{preferences-CcTn1CYh.js.map → preferences-DgiQZThQ.js.map} +1 -1
  186. package/build/client/assets/{presence-h4yTLoon.js → presence-CusrArdA.js} +2 -2
  187. package/build/client/assets/{presence-h4yTLoon.js.map → presence-CusrArdA.js.map} +1 -1
  188. package/build/client/assets/{preview-gHmuDJK-.js → preview-9FeYSEDk.js} +2 -2
  189. package/build/client/assets/{preview-gHmuDJK-.js.map → preview-9FeYSEDk.js.map} +1 -1
  190. package/build/client/assets/processes-Br7x8lR0.js +2 -0
  191. package/build/client/assets/processes-Br7x8lR0.js.map +1 -0
  192. package/build/client/assets/{product-Jj1IV1k9.js → product-CrOzBC_k.js} +2 -2
  193. package/build/client/assets/{product-Jj1IV1k9.js.map → product-CrOzBC_k.js.map} +1 -1
  194. package/build/client/assets/{progress-wyxFr9qs.js → progress-B01tSSb6.js} +2 -2
  195. package/build/client/assets/{progress-wyxFr9qs.js.map → progress-B01tSSb6.js.map} +1 -1
  196. package/build/client/assets/progress-Br7x8lR0.js +2 -0
  197. package/build/client/assets/progress-Br7x8lR0.js.map +1 -0
  198. package/build/client/assets/{progress-bar-BA_tln9A.js → progress-bar-DlBnagEk.js} +2 -2
  199. package/build/client/assets/{progress-bar-BA_tln9A.js.map → progress-bar-DlBnagEk.js.map} +1 -1
  200. package/build/client/assets/{quadrantDiagram-2OG54O6I-DJSr7VVP.js → quadrantDiagram-2OG54O6I-CGBRKetG.js} +2 -2
  201. package/build/client/assets/{quadrantDiagram-2OG54O6I-DJSr7VVP.js.map → quadrantDiagram-2OG54O6I-CGBRKetG.js.map} +1 -1
  202. package/build/client/assets/{requirementDiagram-SO3GGRV7-Dm9X6gYp.js → requirementDiagram-SO3GGRV7-DchVPiOQ.js} +2 -2
  203. package/build/client/assets/{requirementDiagram-SO3GGRV7-Dm9X6gYp.js.map → requirementDiagram-SO3GGRV7-DchVPiOQ.js.map} +1 -1
  204. package/build/client/assets/{revalidation-ws-D6cizZ34.js → revalidation-ws-SaBpRC7c.js} +2 -2
  205. package/build/client/assets/{revalidation-ws-D6cizZ34.js.map → revalidation-ws-SaBpRC7c.js.map} +1 -1
  206. package/build/client/assets/robots_._txt-Br7x8lR0.js +2 -0
  207. package/build/client/assets/robots_._txt-Br7x8lR0.js.map +1 -0
  208. package/build/client/assets/{root-LFhpEp1U.js → root-7toTLRGZ.js} +2 -2
  209. package/build/client/assets/{root-LFhpEp1U.js.map → root-7toTLRGZ.js.map} +1 -1
  210. package/build/client/assets/{sankeyDiagram-4UZDY2LN-afK9nbXy.js → sankeyDiagram-4UZDY2LN-IiFJHkzY.js} +2 -2
  211. package/build/client/assets/{sankeyDiagram-4UZDY2LN-afK9nbXy.js.map → sankeyDiagram-4UZDY2LN-IiFJHkzY.js.map} +1 -1
  212. package/build/client/assets/{seo-BRfbzXHZ.js → seo-F3atQazV.js} +2 -2
  213. package/build/client/assets/{seo-BRfbzXHZ.js.map → seo-F3atQazV.js.map} +1 -1
  214. package/build/client/assets/{sequenceDiagram-ZIKVLSP4-DU42bc3a.js → sequenceDiagram-ZIKVLSP4-Bp2zg0YM.js} +2 -2
  215. package/build/client/assets/{sequenceDiagram-ZIKVLSP4-DU42bc3a.js.map → sequenceDiagram-ZIKVLSP4-Bp2zg0YM.js.map} +1 -1
  216. package/build/client/assets/{set-playground-BGT1RjX_.js → set-playground-BA0z3_BN.js} +2 -2
  217. package/build/client/assets/{set-playground-BGT1RjX_.js.map → set-playground-BA0z3_BN.js.map} +1 -1
  218. package/build/client/assets/set-playground-Br7x8lR0.js +2 -0
  219. package/build/client/assets/set-playground-Br7x8lR0.js.map +1 -0
  220. package/build/client/assets/sitemap_._xml-Br7x8lR0.js +2 -0
  221. package/build/client/assets/sitemap_._xml-Br7x8lR0.js.map +1 -0
  222. package/build/client/assets/start-Br7x8lR0.js +2 -0
  223. package/build/client/assets/start-Br7x8lR0.js.map +1 -0
  224. package/build/client/assets/{stateDiagram-XX37X6EN-B8EwlakM.js → stateDiagram-XX37X6EN-CuKZSA6z.js} +2 -2
  225. package/build/client/assets/{stateDiagram-XX37X6EN-B8EwlakM.js.map → stateDiagram-XX37X6EN-CuKZSA6z.js.map} +1 -1
  226. package/build/client/assets/stateDiagram-v2-GD6S3NHB-bjx76_OI.js +2 -0
  227. package/build/client/assets/{stateDiagram-v2-GD6S3NHB-35ZXM1_g.js.map → stateDiagram-v2-GD6S3NHB-bjx76_OI.js.map} +1 -1
  228. package/build/client/assets/{support-sQOGILfK.js → support-DUh3BiQf.js} +2 -2
  229. package/build/client/assets/{support-sQOGILfK.js.map → support-DUh3BiQf.js.map} +1 -1
  230. package/build/client/assets/test-Br7x8lR0.js +2 -0
  231. package/build/client/assets/test-Br7x8lR0.js.map +1 -0
  232. package/build/client/assets/test-Ctr_7QVp.js +2 -0
  233. package/build/client/assets/{test-B50ljUg2.js.map → test-Ctr_7QVp.js.map} +1 -1
  234. package/build/client/assets/test._testName-Br7x8lR0.js +2 -0
  235. package/build/client/assets/test._testName-Br7x8lR0.js.map +1 -0
  236. package/build/client/assets/test.epic_ws_.js_-Br7x8lR0.js +2 -0
  237. package/build/client/assets/test.epic_ws_.js_-Br7x8lR0.js.map +1 -0
  238. package/build/client/assets/{tests-CNS1bm1R.js → tests-CZAI0vqW.js} +2 -2
  239. package/build/client/assets/{tests-CNS1bm1R.js.map → tests-CZAI0vqW.js.map} +1 -1
  240. package/build/client/assets/{timeline-definition-RI47OAVP-BfpaCaB_.js → timeline-definition-RI47OAVP-COW1irsJ.js} +2 -2
  241. package/build/client/assets/{timeline-definition-RI47OAVP-BfpaCaB_.js.map → timeline-definition-RI47OAVP-COW1irsJ.js.map} +1 -1
  242. package/build/client/assets/{tooltip-DaEk9smk.js → tooltip-Dm5SBVY5.js} +2 -2
  243. package/build/client/assets/{tooltip-DaEk9smk.js.map → tooltip-Dm5SBVY5.js.map} +1 -1
  244. package/build/client/assets/{treemap-FKARHQ26-BYAT_cTQ.js → treemap-FKARHQ26-OIm2RKyV.js} +2 -2
  245. package/build/client/assets/{treemap-FKARHQ26-BYAT_cTQ.js.map → treemap-FKARHQ26-OIm2RKyV.js.map} +1 -1
  246. package/build/client/assets/{use-event-source-D7BmAfNV.js → use-event-source-0sFFzZkm.js} +2 -2
  247. package/build/client/assets/{use-event-source-D7BmAfNV.js.map → use-event-source-0sFFzZkm.js.map} +1 -1
  248. package/build/client/assets/{user-CQfYiwjz.js → user-C6NChLGC.js} +2 -2
  249. package/build/client/assets/{user-CQfYiwjz.js.map → user-C6NChLGC.js.map} +1 -1
  250. package/build/client/assets/{version-DZ56dlh_.js → version-trzp9pgE.js} +2 -2
  251. package/build/client/assets/{version-DZ56dlh_.js.map → version-trzp9pgE.js.map} +1 -1
  252. package/build/client/assets/workshop-config-Cx9qZQEC.js +2 -0
  253. package/build/client/assets/{workshop-config-BOTAWJa-.js.map → workshop-config-Cx9qZQEC.js.map} +1 -1
  254. package/build/client/assets/{workspace-structure-DRKC9vIr.js → workspace-structure-CskVhupe.js} +2 -2
  255. package/build/client/assets/{workspace-structure-DRKC9vIr.js.map → workspace-structure-CskVhupe.js.map} +1 -1
  256. package/build/client/assets/{xychartDiagram-H2YORKM3-8frmuuIZ.js → xychartDiagram-H2YORKM3-BF6VLUdC.js} +2 -2
  257. package/build/client/assets/{xychartDiagram-H2YORKM3-8frmuuIZ.js.map → xychartDiagram-H2YORKM3-BF6VLUdC.js.map} +1 -1
  258. package/build/server/index.js +2 -2
  259. package/package.json +1 -1
  260. package/build/client/assets/_-C9pypk8E.js.map +0 -1
  261. package/build/client/assets/_exerciseNumber_._stepNumber.index-Bltw4W_f.js +0 -2
  262. package/build/client/assets/_exerciseNumber_._stepNumber.index-Bltw4W_f.js.map +0 -1
  263. package/build/client/assets/_layout-Co6ujuzn.js +0 -2
  264. package/build/client/assets/api._-Bltw4W_f.js +0 -2
  265. package/build/client/assets/api._-Bltw4W_f.js.map +0 -1
  266. package/build/client/assets/app-DmNyqOoy.js +0 -2
  267. package/build/client/assets/app.epic_ws_.js_-Bltw4W_f.js +0 -2
  268. package/build/client/assets/app.epic_ws_.js_-Bltw4W_f.js.map +0 -1
  269. package/build/client/assets/apps-Bltw4W_f.js +0 -2
  270. package/build/client/assets/apps-Bltw4W_f.js.map +0 -1
  271. package/build/client/assets/apps-D27kw0fL.js +0 -2
  272. package/build/client/assets/apps-D27kw0fL.js.map +0 -1
  273. package/build/client/assets/cache-Bltw4W_f.js +0 -2
  274. package/build/client/assets/cache-Bltw4W_f.js.map +0 -1
  275. package/build/client/assets/channel-Cks3Ea6t.js +0 -2
  276. package/build/client/assets/classDiagram-BGRH5UQR-Ddac1FX8.js +0 -2
  277. package/build/client/assets/classDiagram-v2-O24JOBDK-Ddac1FX8.js +0 -2
  278. package/build/client/assets/clone-BzOlX5uP.js +0 -2
  279. package/build/client/assets/diff-C4mTCnzp.js +0 -2
  280. package/build/client/assets/discord-CTud2-P1.js +0 -2
  281. package/build/client/assets/discord-CTud2-P1.js.map +0 -1
  282. package/build/client/assets/epic_ws_.js_-Bltw4W_f.js +0 -2
  283. package/build/client/assets/epic_ws_.js_-Bltw4W_f.js.map +0 -1
  284. package/build/client/assets/exercises-Bltw4W_f.js +0 -2
  285. package/build/client/assets/exercises-Bltw4W_f.js.map +0 -1
  286. package/build/client/assets/index-Bltw4W_f.js +0 -2
  287. package/build/client/assets/index-Bltw4W_f.js.map +0 -1
  288. package/build/client/assets/index-D27kw0fL.js +0 -2
  289. package/build/client/assets/index-D27kw0fL.js.map +0 -1
  290. package/build/client/assets/index-Drom-uLQ.js +0 -2
  291. package/build/client/assets/index-Drom-uLQ.js.map +0 -1
  292. package/build/client/assets/infoDiagram-RLU2ROGC-D9Xc3j8L.js +0 -3
  293. package/build/client/assets/l-F4A7XDEa.js +0 -2
  294. package/build/client/assets/launch-editor-Bltw4W_f.js +0 -2
  295. package/build/client/assets/launch-editor-Bltw4W_f.js.map +0 -1
  296. package/build/client/assets/login-sse-Bltw4W_f.js +0 -2
  297. package/build/client/assets/login-sse-Bltw4W_f.js.map +0 -1
  298. package/build/client/assets/manifest-a77f969d.js +0 -1
  299. package/build/client/assets/notifications-Bltw4W_f.js +0 -2
  300. package/build/client/assets/notifications-Bltw4W_f.js.map +0 -1
  301. package/build/client/assets/og-Bltw4W_f.js +0 -2
  302. package/build/client/assets/og-Bltw4W_f.js.map +0 -1
  303. package/build/client/assets/processes-Bltw4W_f.js +0 -2
  304. package/build/client/assets/processes-Bltw4W_f.js.map +0 -1
  305. package/build/client/assets/progress-Bltw4W_f.js +0 -2
  306. package/build/client/assets/progress-Bltw4W_f.js.map +0 -1
  307. package/build/client/assets/robots_._txt-Bltw4W_f.js +0 -2
  308. package/build/client/assets/robots_._txt-Bltw4W_f.js.map +0 -1
  309. package/build/client/assets/set-playground-Bltw4W_f.js +0 -2
  310. package/build/client/assets/set-playground-Bltw4W_f.js.map +0 -1
  311. package/build/client/assets/sitemap_._xml-Bltw4W_f.js +0 -2
  312. package/build/client/assets/sitemap_._xml-Bltw4W_f.js.map +0 -1
  313. package/build/client/assets/start-Bltw4W_f.js +0 -2
  314. package/build/client/assets/start-Bltw4W_f.js.map +0 -1
  315. package/build/client/assets/stateDiagram-v2-GD6S3NHB-35ZXM1_g.js +0 -2
  316. package/build/client/assets/test-B50ljUg2.js +0 -2
  317. package/build/client/assets/test-Bltw4W_f.js +0 -2
  318. package/build/client/assets/test-Bltw4W_f.js.map +0 -1
  319. package/build/client/assets/test._testName-Bltw4W_f.js +0 -2
  320. package/build/client/assets/test._testName-Bltw4W_f.js.map +0 -1
  321. package/build/client/assets/test.epic_ws_.js_-Bltw4W_f.js +0 -2
  322. package/build/client/assets/test.epic_ws_.js_-Bltw4W_f.js.map +0 -1
  323. package/build/client/assets/workshop-config-BOTAWJa-.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"_layout-Bzzu5Cz1.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/request-info.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 StepContext.Provider')\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 (\n\t\t<StepContext.Provider value={{ inBrowserBrowserRef }}>\n\t\t\t{children}\n\t\t</StepContext.Provider>\n\t)\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// @ts-expect-error 🤷‍♂️\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{/* @ts-expect-error 🤷‍♂️ */}\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// @ts-expect-error 🤷‍♂️\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\t{/* @ts-expect-error 🤷‍♂️ */}\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.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, useLoaderData } from 'react-router'\nimport { Icon } from '#app/components/icons.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\n\tconst [open, setOpen] = React.useState(false)\n\tconst contentRef = React.useRef<HTMLDivElement>(null)\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={setOpen}>\n\t\t\t\t<Popover.Trigger asChild>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclassName=\"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\tFiles\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 z-10 select-none rounded bg-background px-9 py-8 text-foreground\"\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-4 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{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=\"mb-2 border-b border-b-gray-50 border-opacity-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 } from 'react'\nimport {\n\tdata,\n\tredirect,\n\ttype HeadersFunction,\n\tLink,\n\tOutlet,\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.js'\nimport { type RootLoaderData } from '#app/root.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 { getSeoMetaTags } from '#app/utils/seo.js'\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 = ({ data, matches, params }) => {\n\tconst rootData = matches.find((m) => m?.id === 'root')?.data as RootLoaderData\n\tif (!data || !rootData) return [{ title: '🦉 | Error' }]\n\tconst { emoji, stepNumber, title, exerciseNumber, exerciseTitle } =\n\t\tpageTitle(data)\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 { title: workshopTitle } = getWorkshopConfig()\n\tconst cacheOptions = { request, timings }\n\tconst exerciseStepApp = await requireExerciseApp(params, cacheOptions)\n\tconst exercise = await requireExercise(\n\t\texerciseStepApp.exerciseNumber,\n\t\tcacheOptions,\n\t)\n\tconst reqUrl = new URL(request.url)\n\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\tconst problemApp = await getExerciseApp(\n\t\t{ ...params, type: 'problem' },\n\t\tcacheOptions,\n\t)\n\tconst solutionApp = await getExerciseApp(\n\t\t{ ...params, type: 'solution' },\n\t\tcacheOptions,\n\t)\n\n\tif (!problemApp && !solutionApp) {\n\t\tthrow new Response('Not found', { status: 404 })\n\t}\n\n\tconst allAppsFull = await getApps(cacheOptions)\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\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 nextApp = await getNextExerciseApp(exerciseStepApp, cacheOptions)\n\tconst prevApp = await getPrevExerciseApp(exerciseStepApp, cacheOptions)\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\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\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} 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\n\tconst titleBits = pageTitle(data)\n\n\tuseRevalidationWS({\n\t\twatchPaths: [`${data.exerciseStepApp.relativePath}/README.mdx`],\n\t})\n\n\treturn (\n\t\t<div className=\"flex max-w-full flex-grow flex-col\">\n\t\t\t<main className=\"flex flex-grow flex-col sm:grid sm:h-full sm:min-h-[800px] sm:grid-cols-1 sm:grid-rows-2 md:min-h-[unset] lg:grid-cols-2 lg:grid-rows-1\">\n\t\t\t\t<div className=\"relative flex flex-col sm:col-span-1 sm:row-span-1 sm:h-full lg:border-r\">\n\t\t\t\t\t<h1 className=\"h-14 border-b pl-10 pr-5 text-sm font-medium leading-tight\">\n\t\t\t\t\t\t<div className=\"flex h-14 flex-wrap items-center justify-between gap-x-2 py-2\">\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{titleBits.exerciseNumber}. {titleBits.exerciseTitle}\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t{'/'}\n\t\t\t\t\t\t\t\t<Link to=\".\" className=\"hover:underline\">\n\t\t\t\t\t\t\t\t\t{titleBits.stepNumber}. {titleBits.title}\n\t\t\t\t\t\t\t\t\t{' ('}\n\t\t\t\t\t\t\t\t\t{titleBits.emoji} {titleBits.type}\n\t\t\t\t\t\t\t\t\t{')'}\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\tdata.playground?.appName !== data.problem.name ? (\n\t\t\t\t\t\t\t\t<div className=\"hidden md:block\">\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</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 flex h-full w-full max-w-none flex-1 scroll-pt-6 flex-col justify-between space-y-6 overflow-y-auto p-2 scrollbar-thin scrollbar-thumb-scrollbar sm:p-10 sm:pt-8\"\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\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t← Previous\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\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tNext →\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=\"flex h-16 justify-between border-b-4 border-t 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}\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<Outlet />\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\tstatusHandlers={{\n\t\t\t\t404: () => <p>Sorry, we couldn't find an app here.</p>,\n\t\t\t}}\n\t\t/>\n\t)\n}\n"],"names":["StepContext","React.createContext","useStepContext","context","React.useContext","StepContextProvider","children","inBrowserBrowserRef","jsx","stepMdxComponents","DiffLink","PrevDiffLink","NextDiffLink","InlineFile","LinkToApp","StepMdx","data","useLoaderData","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","createPopoverScope","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","handleLaunchUpdate","appName","Popover.Root","Popover.Trigger","Popover.Portal","Popover.Content","SetAppToPlayground","React.Suspense","Await","diffFiles","pageTitle","workshopTitle","exerciseNumber","exerciseStepApp","toString","padStart","stepNumber","emoji","problem","solution","title","exerciseTitle","meta","matches","rootData","find","m","id","getSeoMetaTags","description","ogTitle","ogDescription","Number","instructor","_layout","_UNSAFE_withComponentProps","loaderData","useRef","titleBits","useRevalidationWS","watchPaths","relativePath","className","getExercisePath","playground","articleId","instructionsCode","prevStepLink","prefetch","nextStepLink","ElementScrollRestoration","elementQuery","ProgressToggle","EditFileOnGitHub","NavChevrons","prev","next","Outlet","ErrorBoundary","_UNSAFE_withErrorBoundaryProps","GeneralErrorBoundary","statusHandlers"],"mappings":"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","x_google_ignoreList":[1]}
1
+ {"version":3,"file":"_layout-DKmpru-v.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/request-info.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 StepContext.Provider')\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 (\n\t\t<StepContext.Provider value={{ inBrowserBrowserRef }}>\n\t\t\t{children}\n\t\t</StepContext.Provider>\n\t)\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// @ts-expect-error 🤷‍♂️\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{/* @ts-expect-error 🤷‍♂️ */}\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// @ts-expect-error 🤷‍♂️\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\t{/* @ts-expect-error 🤷‍♂️ */}\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.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, useLoaderData } from 'react-router'\nimport { Icon } from '#app/components/icons.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\n\tconst [open, setOpen] = React.useState(false)\n\tconst contentRef = React.useRef<HTMLDivElement>(null)\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={setOpen}>\n\t\t\t\t<Popover.Trigger asChild>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclassName=\"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\tFiles\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 z-10 select-none rounded bg-background px-9 py-8 text-foreground\"\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-4 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{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=\"mb-2 border-b border-b-gray-50 border-opacity-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 } from 'react'\nimport {\n\tdata,\n\tredirect,\n\ttype HeadersFunction,\n\tLink,\n\tOutlet,\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.js'\nimport { type RootLoaderData } from '#app/root.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 { getSeoMetaTags } from '#app/utils/seo.js'\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 = ({ data, matches, params }) => {\n\tconst rootData = matches.find((m) => m?.id === 'root')?.data as RootLoaderData\n\tif (!data || !rootData) return [{ title: '🦉 | Error' }]\n\tconst { emoji, stepNumber, title, exerciseNumber, exerciseTitle } =\n\t\tpageTitle(data)\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 { title: workshopTitle } = getWorkshopConfig()\n\tconst cacheOptions = { request, timings }\n\tconst exerciseStepApp = await requireExerciseApp(params, cacheOptions)\n\tconst exercise = await requireExercise(\n\t\texerciseStepApp.exerciseNumber,\n\t\tcacheOptions,\n\t)\n\tconst reqUrl = new URL(request.url)\n\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\tconst problemApp = await getExerciseApp(\n\t\t{ ...params, type: 'problem' },\n\t\tcacheOptions,\n\t)\n\tconst solutionApp = await getExerciseApp(\n\t\t{ ...params, type: 'solution' },\n\t\tcacheOptions,\n\t)\n\n\tif (!problemApp && !solutionApp) {\n\t\tthrow new Response('Not found', { status: 404 })\n\t}\n\n\tconst allAppsFull = await getApps(cacheOptions)\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\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 nextApp = await getNextExerciseApp(exerciseStepApp, cacheOptions)\n\tconst prevApp = await getPrevExerciseApp(exerciseStepApp, cacheOptions)\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\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\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} 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\n\tconst titleBits = pageTitle(data)\n\n\tuseRevalidationWS({\n\t\twatchPaths: [`${data.exerciseStepApp.relativePath}/README.mdx`],\n\t})\n\n\treturn (\n\t\t<div className=\"flex max-w-full flex-grow flex-col\">\n\t\t\t<main className=\"flex flex-grow flex-col sm:grid sm:h-full sm:min-h-[800px] sm:grid-cols-1 sm:grid-rows-2 md:min-h-[unset] lg:grid-cols-2 lg:grid-rows-1\">\n\t\t\t\t<div className=\"relative flex flex-col sm:col-span-1 sm:row-span-1 sm:h-full lg:border-r\">\n\t\t\t\t\t<h1 className=\"h-14 border-b pl-10 pr-5 text-sm font-medium leading-tight\">\n\t\t\t\t\t\t<div className=\"flex h-14 flex-wrap items-center justify-between gap-x-2 py-2\">\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{titleBits.exerciseNumber}. {titleBits.exerciseTitle}\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t{'/'}\n\t\t\t\t\t\t\t\t<Link to=\".\" className=\"hover:underline\">\n\t\t\t\t\t\t\t\t\t{titleBits.stepNumber}. {titleBits.title}\n\t\t\t\t\t\t\t\t\t{' ('}\n\t\t\t\t\t\t\t\t\t{titleBits.emoji} {titleBits.type}\n\t\t\t\t\t\t\t\t\t{')'}\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\tdata.playground?.appName !== data.problem.name ? (\n\t\t\t\t\t\t\t\t<div className=\"hidden md:block\">\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</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 flex h-full w-full max-w-none flex-1 scroll-pt-6 flex-col justify-between space-y-6 overflow-y-auto p-2 scrollbar-thin scrollbar-thumb-scrollbar sm:p-10 sm:pt-8\"\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\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t← Previous\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\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tNext →\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=\"flex h-16 justify-between border-b-4 border-t 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}\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<Outlet />\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\tstatusHandlers={{\n\t\t\t\t404: () => <p>Sorry, we couldn't find an app here.</p>,\n\t\t\t}}\n\t\t/>\n\t)\n}\n"],"names":["StepContext","React.createContext","useStepContext","context","React.useContext","StepContextProvider","children","inBrowserBrowserRef","jsx","stepMdxComponents","DiffLink","PrevDiffLink","NextDiffLink","InlineFile","LinkToApp","StepMdx","data","useLoaderData","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","createPopoverScope","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","handleLaunchUpdate","appName","Popover.Root","Popover.Trigger","Popover.Portal","Popover.Content","SetAppToPlayground","React.Suspense","Await","diffFiles","pageTitle","workshopTitle","exerciseNumber","exerciseStepApp","toString","padStart","stepNumber","emoji","problem","solution","title","exerciseTitle","meta","matches","rootData","find","m","id","getSeoMetaTags","description","ogTitle","ogDescription","Number","instructor","_layout","_UNSAFE_withComponentProps","loaderData","useRef","titleBits","useRevalidationWS","watchPaths","relativePath","className","getExercisePath","playground","articleId","instructionsCode","prevStepLink","prefetch","nextStepLink","ElementScrollRestoration","elementQuery","ProgressToggle","EditFileOnGitHub","NavChevrons","prev","next","Outlet","ErrorBoundary","_UNSAFE_withErrorBoundaryProps","GeneralErrorBoundary","statusHandlers"],"mappings":"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","x_google_ignoreList":[1]}
@@ -1,6 +1,6 @@
1
- import{r as d,w as He,c as z,O as Ue,L as h,e as se,N as D}from"./chunk-QMGIS6GS-D3fke51R.js";import{j as e}from"./jsx-runtime-B2LUJHWf.js";import{c as m}from"./clsx-B-dksMZM.js";import{a as Ve}from"./pe-Dd-3Vdrv.js";import{c as p,I as y,b as k,e as E}from"./misc-D-dDb89H.js";import"./_-C9pypk8E.js";import{L as O}from"./product-Jj1IV1k9.js";import{u as Ye}from"./revalidation-ws-D6cizZ34.js";import{u as ze,d as Be,e as H,h as B,P as L,f as I,g as G,k as Ge,D as Qe,n as Je,S,T as Ke,a as X,b as ee,c as te}from"./tooltip-DaEk9smk.js";import{P as Me,h as qe,R as Ze,u as Xe,F as et}from"./index-BpiFo4Bs.js";import{c as $,b as tt}from"./user-CQfYiwjz.js";import{u as oe}from"./workshop-config-BOTAWJa-.js";import{u as le}from"./online-DRbKQRzx.js";import{u as Q}from"./presence-h4yTLoon.js";import{b as nt,s as ie,c as at,d as rt,e as ce,m as x,u as st,f as ot}from"./progress-wyxFr9qs.js";import{T as de}from"./index-DXWoNbMw.js";import"./index-C4WpsDjj.js";function lt(t){t.values.forEach(n=>n.stop())}function V(t,n){[...n].reverse().forEach(r=>{const o=t.getVariant(r);o&&ie(t,o),t.variantChildren&&t.variantChildren.forEach(s=>{V(s,n)})})}function it(t,n){if(Array.isArray(n))return V(t,n);if(typeof n=="string")return V(t,[n]);ie(t,n)}function ct(){const t=new Set,n={subscribe(a){return t.add(a),()=>void t.delete(a)},start(a,r){const o=[];return t.forEach(s=>{o.push(nt(s,a,{transitionOverride:r}))}),Promise.all(o)},set(a){return t.forEach(r=>{it(r,a)})},stop(){t.forEach(a=>{lt(a)})},mount(){return()=>{n.stop()}}};return n}function Y(){const t=at(ct);return rt(t.mount,[]),t}function dt(t,n){function a(){return window.matchMedia(t).matches}function r(o){const s=window.matchMedia(t);return s.addEventListener("change",o),()=>{s.removeEventListener("change",o)}}return function(){return d.useSyncExternalStore(r,a,()=>n)}}var F="Dialog",[fe,Kt]=Be(F),[ft,N]=fe(F),ue=t=>{const{__scopeDialog:n,children:a,open:r,defaultOpen:o,onOpenChange:s,modal:f=!0}=t,c=d.useRef(null),u=d.useRef(null),[l,b]=ze({prop:r,defaultProp:o??!1,onChange:s,caller:F});return e.jsx(ft,{scope:n,triggerRef:c,contentRef:u,contentId:H(),titleId:H(),descriptionId:H(),open:l,onOpenChange:b,onOpenToggle:d.useCallback(()=>b(w=>!w),[b]),modal:f,children:a})};ue.displayName=F;var he="DialogTrigger",pe=d.forwardRef((t,n)=>{const{__scopeDialog:a,...r}=t,o=N(he,a),s=B(n,o.triggerRef);return e.jsx(L.button,{type:"button","aria-haspopup":"dialog","aria-expanded":o.open,"aria-controls":o.contentId,"data-state":M(o.open),...r,ref:s,onClick:I(t.onClick,o.onOpenToggle)})});pe.displayName=he;var J="DialogPortal",[ut,me]=fe(J,{forceMount:void 0}),xe=t=>{const{__scopeDialog:n,forceMount:a,children:r,container:o}=t,s=N(J,n);return e.jsx(ut,{scope:n,forceMount:a,children:d.Children.map(r,f=>e.jsx(G,{present:a||s.open,children:e.jsx(Me,{asChild:!0,container:o,children:f})}))})};xe.displayName=J;var T="DialogOverlay",ge=d.forwardRef((t,n)=>{const a=me(T,t.__scopeDialog),{forceMount:r=a.forceMount,...o}=t,s=N(T,t.__scopeDialog);return s.modal?e.jsx(G,{present:r||s.open,children:e.jsx(pt,{...o,ref:n})}):null});ge.displayName=T;var ht=Ge("DialogOverlay.RemoveScroll"),pt=d.forwardRef((t,n)=>{const{__scopeDialog:a,...r}=t,o=N(T,a);return e.jsx(Ze,{as:ht,allowPinchZoom:!0,shards:[o.contentRef],children:e.jsx(L.div,{"data-state":M(o.open),...r,ref:n,style:{pointerEvents:"auto",...r.style}})})}),P="DialogContent",be=d.forwardRef((t,n)=>{const a=me(P,t.__scopeDialog),{forceMount:r=a.forceMount,...o}=t,s=N(P,t.__scopeDialog);return e.jsx(G,{present:r||s.open,children:s.modal?e.jsx(mt,{...o,ref:n}):e.jsx(xt,{...o,ref:n})})});be.displayName=P;var mt=d.forwardRef((t,n)=>{const a=N(P,t.__scopeDialog),r=d.useRef(null),o=B(n,a.contentRef,r);return d.useEffect(()=>{const s=r.current;if(s)return qe(s)},[]),e.jsx(je,{...t,ref:o,trapFocus:a.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:I(t.onCloseAutoFocus,s=>{s.preventDefault(),a.triggerRef.current?.focus()}),onPointerDownOutside:I(t.onPointerDownOutside,s=>{const f=s.detail.originalEvent,c=f.button===0&&f.ctrlKey===!0;(f.button===2||c)&&s.preventDefault()}),onFocusOutside:I(t.onFocusOutside,s=>s.preventDefault())})}),xt=d.forwardRef((t,n)=>{const a=N(P,t.__scopeDialog),r=d.useRef(!1),o=d.useRef(!1);return e.jsx(je,{...t,ref:n,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:s=>{t.onCloseAutoFocus?.(s),s.defaultPrevented||(r.current||a.triggerRef.current?.focus(),s.preventDefault()),r.current=!1,o.current=!1},onInteractOutside:s=>{t.onInteractOutside?.(s),s.defaultPrevented||(r.current=!0,s.detail.originalEvent.type==="pointerdown"&&(o.current=!0));const f=s.target;a.triggerRef.current?.contains(f)&&s.preventDefault(),s.detail.originalEvent.type==="focusin"&&o.current&&s.preventDefault()}})}),je=d.forwardRef((t,n)=>{const{__scopeDialog:a,trapFocus:r,onOpenAutoFocus:o,onCloseAutoFocus:s,...f}=t,c=N(P,a),u=d.useRef(null),l=B(n,u);return Xe(),e.jsxs(e.Fragment,{children:[e.jsx(et,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:o,onUnmountAutoFocus:s,children:e.jsx(Qe,{role:"dialog",id:c.contentId,"aria-describedby":c.descriptionId,"aria-labelledby":c.titleId,"data-state":M(c.open),...f,ref:l,onDismiss:()=>c.onOpenChange(!1)})}),e.jsxs(e.Fragment,{children:[e.jsx(gt,{titleId:c.titleId}),e.jsx(jt,{contentRef:u,descriptionId:c.descriptionId})]})]})}),K="DialogTitle",ve=d.forwardRef((t,n)=>{const{__scopeDialog:a,...r}=t,o=N(K,a);return e.jsx(L.h2,{id:o.titleId,...r,ref:n})});ve.displayName=K;var we="DialogDescription",ye=d.forwardRef((t,n)=>{const{__scopeDialog:a,...r}=t,o=N(we,a);return e.jsx(L.p,{id:o.descriptionId,...r,ref:n})});ye.displayName=we;var Ne="DialogClose",Ce=d.forwardRef((t,n)=>{const{__scopeDialog:a,...r}=t,o=N(Ne,a);return e.jsx(L.button,{type:"button",...r,ref:n,onClick:I(t.onClick,()=>o.onOpenChange(!1))})});Ce.displayName=Ne;function M(t){return t?"open":"closed"}var De="DialogTitleWarning",[Mt,Ee]=Je(De,{contentName:P,titleName:K,docsSlug:"dialog"}),gt=({titleId:t})=>{const n=Ee(De),a=`\`${n.contentName}\` requires a \`${n.titleName}\` for the component to be accessible for screen reader users.
1
+ import{r as d,w as He,c as z,O as Ue,L as h,e as se,N as D}from"./chunk-QMGIS6GS-Cnm5uIBY.js";import{j as e}from"./jsx-runtime-BcujL2Aj.js";import{c as m}from"./clsx-B-dksMZM.js";import{a as Ve}from"./pe-DBKBCHmz.js";import{c as p,I as y,b as k,e as E}from"./misc-CJXb1d0J.js";import"./_-v6PvHZ90.js";import{L as O}from"./product-CrOzBC_k.js";import{u as Ye}from"./revalidation-ws-SaBpRC7c.js";import{u as ze,d as Be,e as H,h as B,P as L,f as I,g as G,k as Ge,D as Qe,n as Je,S,T as Ke,a as X,b as ee,c as te}from"./tooltip-Dm5SBVY5.js";import{P as Me,h as qe,R as Ze,u as Xe,F as et}from"./index-DQHP10an.js";import{c as $,b as tt}from"./user-C6NChLGC.js";import{u as oe}from"./workshop-config-Cx9qZQEC.js";import{u as le}from"./online-CgtIvFKH.js";import{u as Q}from"./presence-CusrArdA.js";import{b as nt,s as ie,c as at,d as rt,e as ce,m as x,u as st,f as ot}from"./progress-B01tSSb6.js";import{T as de}from"./index-BSUgjf5i.js";import"./index-kpJjamgW.js";function lt(t){t.values.forEach(n=>n.stop())}function V(t,n){[...n].reverse().forEach(r=>{const o=t.getVariant(r);o&&ie(t,o),t.variantChildren&&t.variantChildren.forEach(s=>{V(s,n)})})}function it(t,n){if(Array.isArray(n))return V(t,n);if(typeof n=="string")return V(t,[n]);ie(t,n)}function ct(){const t=new Set,n={subscribe(a){return t.add(a),()=>void t.delete(a)},start(a,r){const o=[];return t.forEach(s=>{o.push(nt(s,a,{transitionOverride:r}))}),Promise.all(o)},set(a){return t.forEach(r=>{it(r,a)})},stop(){t.forEach(a=>{lt(a)})},mount(){return()=>{n.stop()}}};return n}function Y(){const t=at(ct);return rt(t.mount,[]),t}function dt(t,n){function a(){return window.matchMedia(t).matches}function r(o){const s=window.matchMedia(t);return s.addEventListener("change",o),()=>{s.removeEventListener("change",o)}}return function(){return d.useSyncExternalStore(r,a,()=>n)}}var F="Dialog",[fe,Kt]=Be(F),[ft,N]=fe(F),ue=t=>{const{__scopeDialog:n,children:a,open:r,defaultOpen:o,onOpenChange:s,modal:f=!0}=t,c=d.useRef(null),u=d.useRef(null),[l,b]=ze({prop:r,defaultProp:o??!1,onChange:s,caller:F});return e.jsx(ft,{scope:n,triggerRef:c,contentRef:u,contentId:H(),titleId:H(),descriptionId:H(),open:l,onOpenChange:b,onOpenToggle:d.useCallback(()=>b(w=>!w),[b]),modal:f,children:a})};ue.displayName=F;var he="DialogTrigger",pe=d.forwardRef((t,n)=>{const{__scopeDialog:a,...r}=t,o=N(he,a),s=B(n,o.triggerRef);return e.jsx(L.button,{type:"button","aria-haspopup":"dialog","aria-expanded":o.open,"aria-controls":o.contentId,"data-state":M(o.open),...r,ref:s,onClick:I(t.onClick,o.onOpenToggle)})});pe.displayName=he;var J="DialogPortal",[ut,me]=fe(J,{forceMount:void 0}),xe=t=>{const{__scopeDialog:n,forceMount:a,children:r,container:o}=t,s=N(J,n);return e.jsx(ut,{scope:n,forceMount:a,children:d.Children.map(r,f=>e.jsx(G,{present:a||s.open,children:e.jsx(Me,{asChild:!0,container:o,children:f})}))})};xe.displayName=J;var T="DialogOverlay",ge=d.forwardRef((t,n)=>{const a=me(T,t.__scopeDialog),{forceMount:r=a.forceMount,...o}=t,s=N(T,t.__scopeDialog);return s.modal?e.jsx(G,{present:r||s.open,children:e.jsx(pt,{...o,ref:n})}):null});ge.displayName=T;var ht=Ge("DialogOverlay.RemoveScroll"),pt=d.forwardRef((t,n)=>{const{__scopeDialog:a,...r}=t,o=N(T,a);return e.jsx(Ze,{as:ht,allowPinchZoom:!0,shards:[o.contentRef],children:e.jsx(L.div,{"data-state":M(o.open),...r,ref:n,style:{pointerEvents:"auto",...r.style}})})}),P="DialogContent",be=d.forwardRef((t,n)=>{const a=me(P,t.__scopeDialog),{forceMount:r=a.forceMount,...o}=t,s=N(P,t.__scopeDialog);return e.jsx(G,{present:r||s.open,children:s.modal?e.jsx(mt,{...o,ref:n}):e.jsx(xt,{...o,ref:n})})});be.displayName=P;var mt=d.forwardRef((t,n)=>{const a=N(P,t.__scopeDialog),r=d.useRef(null),o=B(n,a.contentRef,r);return d.useEffect(()=>{const s=r.current;if(s)return qe(s)},[]),e.jsx(je,{...t,ref:o,trapFocus:a.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:I(t.onCloseAutoFocus,s=>{s.preventDefault(),a.triggerRef.current?.focus()}),onPointerDownOutside:I(t.onPointerDownOutside,s=>{const f=s.detail.originalEvent,c=f.button===0&&f.ctrlKey===!0;(f.button===2||c)&&s.preventDefault()}),onFocusOutside:I(t.onFocusOutside,s=>s.preventDefault())})}),xt=d.forwardRef((t,n)=>{const a=N(P,t.__scopeDialog),r=d.useRef(!1),o=d.useRef(!1);return e.jsx(je,{...t,ref:n,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:s=>{t.onCloseAutoFocus?.(s),s.defaultPrevented||(r.current||a.triggerRef.current?.focus(),s.preventDefault()),r.current=!1,o.current=!1},onInteractOutside:s=>{t.onInteractOutside?.(s),s.defaultPrevented||(r.current=!0,s.detail.originalEvent.type==="pointerdown"&&(o.current=!0));const f=s.target;a.triggerRef.current?.contains(f)&&s.preventDefault(),s.detail.originalEvent.type==="focusin"&&o.current&&s.preventDefault()}})}),je=d.forwardRef((t,n)=>{const{__scopeDialog:a,trapFocus:r,onOpenAutoFocus:o,onCloseAutoFocus:s,...f}=t,c=N(P,a),u=d.useRef(null),l=B(n,u);return Xe(),e.jsxs(e.Fragment,{children:[e.jsx(et,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:o,onUnmountAutoFocus:s,children:e.jsx(Qe,{role:"dialog",id:c.contentId,"aria-describedby":c.descriptionId,"aria-labelledby":c.titleId,"data-state":M(c.open),...f,ref:l,onDismiss:()=>c.onOpenChange(!1)})}),e.jsxs(e.Fragment,{children:[e.jsx(gt,{titleId:c.titleId}),e.jsx(jt,{contentRef:u,descriptionId:c.descriptionId})]})]})}),K="DialogTitle",ve=d.forwardRef((t,n)=>{const{__scopeDialog:a,...r}=t,o=N(K,a);return e.jsx(L.h2,{id:o.titleId,...r,ref:n})});ve.displayName=K;var we="DialogDescription",ye=d.forwardRef((t,n)=>{const{__scopeDialog:a,...r}=t,o=N(we,a);return e.jsx(L.p,{id:o.descriptionId,...r,ref:n})});ye.displayName=we;var Ne="DialogClose",Ce=d.forwardRef((t,n)=>{const{__scopeDialog:a,...r}=t,o=N(Ne,a);return e.jsx(L.button,{type:"button",...r,ref:n,onClick:I(t.onClick,()=>o.onOpenChange(!1))})});Ce.displayName=Ne;function M(t){return t?"open":"closed"}var De="DialogTitleWarning",[Mt,Ee]=Je(De,{contentName:P,titleName:K,docsSlug:"dialog"}),gt=({titleId:t})=>{const n=Ee(De),a=`\`${n.contentName}\` requires a \`${n.titleName}\` for the component to be accessible for screen reader users.
2
2
 
3
3
  If you want to hide the \`${n.titleName}\`, you can wrap it with our VisuallyHidden component.
4
4
 
5
5
  For more information, see https://radix-ui.com/primitives/docs/components/${n.docsSlug}`;return d.useEffect(()=>{t&&(document.getElementById(t)||console.error(a))},[a,t]),null},bt="DialogDescriptionWarning",jt=({contentRef:t,descriptionId:n})=>{const r=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${Ee(bt).contentName}}.`;return d.useEffect(()=>{const o=t.current?.getAttribute("aria-describedby");n&&o&&(document.getElementById(n)||console.warn(r))},[r,t,n]),null},vt=ue,wt=pe,yt=xe,ke=ge,Pe=be,Nt=ve,_e=ye,Ct=Ce;const Dt=vt,Et=wt,kt=yt;function Se({className:t,ref:n,...a}){return e.jsx(ke,{ref:n,className:p("fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",t),...a})}Se.displayName=ke.displayName;function Re({className:t,children:n,ref:a,...r}){return e.jsxs(kt,{children:[e.jsx(Se,{}),e.jsxs(Pe,{ref:a,className:p("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full",t),...r,children:[n,e.jsxs(Ct,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity data-[state=open]:bg-accent data-[state=open]:text-muted-foreground hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none",children:[e.jsx(y,{name:"Close"}),e.jsx("span",{className:"sr-only",children:"Close"})]})]})]})}Re.displayName=Pe.displayName;function Ie({className:t,...n}){return e.jsx("div",{className:p("flex flex-col space-y-1.5 text-center sm:text-left",t),...n})}Ie.displayName="DialogHeader";Nt.displayName;function Le({className:t,ref:n,...a}){return e.jsx(_e,{ref:n,className:p("text-sm text-muted-foreground",t),...a})}Le.displayName=_e.displayName;const ne=["opacity-70","opacity-80","opacity-90","opacity-100"],ae=["shadow-[0_0_2px_0_rgba(0,0,0,0.3)]","shadow-[0_0_4px_0_rgba(0,0,0,0.3)]","shadow-[0_0_7px_0_rgba(0,0,0,0.3)]","shadow-[0_0_10px_0_rgba(0,0,0,0.3)]"];function re(t){const n=Math.round(t*ne.length-1),a=Math.round(t*ae.length-1);return p("shadow-purple-700 hover:opacity-100 focus:opacity-100 dark:shadow-purple-200",ne[n]??"opacity-60",ae[a]??"shadow-none",t===1?"animate-pulse hover:animate-none focus:animate-none":null)}function Ae({isMenuOpened:t}){const n=$(),{users:a}=Q(),{product:{displayNameShort:r}}=oe(),o=t?17:0,s=a.length-o,f=s>(t?1:0);if(!a.length)return null;const c=t&&a.length===1?e.jsx(h,{target:"_blank",rel:"noopener noreferrer",to:"https://www.youtube.com/watch?v=w6Q3mHyzn78",children:e.jsx("img",{alt:"Tiffany Tunes",className:p("h-8 w-8 rounded-full border object-cover",re(1)),src:"/img/tiffany.png"})}):null,u=`${s}${t?" more ":" "}${r} Dev${s===1?"":"s"} working now`;return e.jsx("div",{className:"flex flex-wrap items-center gap-2",children:e.jsxs(Ke,{children:[(f?a.slice(0,o):a).map(({user:l,score:b})=>{const w=re(b),g=Pt(l.location),i=l.imageUrlSmall||l.avatarUrl,j=l.hasAccess,_=l.location?.origin?.includes("localhost");let C;return j?C=_?"working":"referencing":C=_?"previewing":"reviewing",e.jsxs(X,{children:[e.jsx(ee,{asChild:!0,children:i?e.jsx("img",{tabIndex:0,alt:l.name||r,className:p("h-8 w-8 rounded-full border object-cover",w),src:i}):e.jsx("div",{tabIndex:0,"aria-label":l.name||`${r} Dev`,className:p("flex h-8 w-8 items-center justify-center rounded-full border",w),children:e.jsx(y,{name:"User"})})}),e.jsx(te,{children:e.jsxs("span",{className:"flex flex-col items-center justify-center gap-1",children:[e.jsxs("span",{children:[l.name||`${r} Dev`," ",g?` is ${C} ${b===1&&n?.id!==l.id?"with you":""} on`:null]}),g?.line1?e.jsx("span",{children:g.line1}):null,g?.line2?e.jsx("span",{children:g.line2}):null]})})]},l.id)}),c,f?e.jsxs(X,{children:[e.jsx(ee,{asChild:!0,children:e.jsx("div",{tabIndex:0,"aria-label":u,className:p("flex items-center justify-center rounded-full border bg-accent text-xs text-accent-foreground",t?"h-8 w-8":"h-6 w-6"),children:e.jsx("span",{className:p("pointer-events-none overflow-hidden text-ellipsis whitespace-nowrap text-center",t?"w-8":"w-6"),children:t?`+${s}`:s})})}),e.jsx(te,{children:u})]}):null]})})}const Te=dt("(min-width: 640px)",!0),qt=He(function(){const n=z(),a=$(),r=Te(),o=Ve(),[s,f]=d.useState(n.isMenuOpened);Ye({watchPaths:["./exercises/README.mdx"]});function c(u){f(u),document.cookie=`es_menu_open=${u.toString()}; path=/; SameSite=Lax;`}return e.jsxs("div",{className:"flex flex-col",children:[a?null:e.jsx(_t,{}),o&&r?null:e.jsx(St,{isMenuOpened:s,onMenuOpenChange:c}),e.jsxs("div",{className:p("flex flex-grow flex-col sm:flex-row",{"h-[calc(100vh-128px-env(safe-area-inset-top)-env(safe-area-inset-bottom))] sm:h-[calc(100vh-64px-env(safe-area-inset-top)-env(safe-area-inset-bottom))]":!a,"h-[calc(100vh-64px-env(safe-area-inset-top)-env(safe-area-inset-bottom))] sm:h-[calc(100vh-env(safe-area-inset-top)-env(safe-area-inset-bottom))]":a,"h-[unset]":!r&&s}),children:[r?e.jsx(Rt,{isMenuOpened:s,onMenuOpenChange:c}):null,e.jsx("div",{className:p("h-full w-full max-w-full sm:max-w-[calc(100%-56px)]",s?"hidden md:block":""),children:e.jsx(Ue,{})})]})]})});function Pt(t){if(!t)return null;const{exercise:n}=t,a=[n?[n.exerciseNumber,n.stepNumber].filter(Boolean).map(r=>r.toString().padStart(2,"0")).join("/"):null,n?.type].filter(Boolean).join(" - ");return{line1:t.workshopTitle,line2:a}}function _t(){const t=Te(),{product:{host:n,displayName:a}}=oe(),r=tt(),o=e.jsx("div",{children:ENV.EPICSHOP_DEPLOYED?e.jsxs("div",{children:["This is the deployed version. ",e.jsxs(e.Fragment,{children:[e.jsx(h,{className:"underline",target:"_blank",rel:"noopener noreferrer",to:ENV.EPICSHOP_GITHUB_REPO,children:"Run locally"})," for full experience."]})," "]}):r?e.jsxs("div",{children:[e.jsx(h,{to:"/login",className:"underline",children:"Login"})," ","or"," ",e.jsx("a",{href:`https://${n}/login`,className:"underline",children:"join for free"})," ","for the full experience."]}):null});return e.jsx("div",{className:"z-10 flex h-16 items-center justify-between border-b bg-gradient-to-tr from-blue-500 to-indigo-500 pl-4 text-white",children:t?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"hidden flex-1 flex-wrap items-center gap-4 sm:flex",children:[e.jsx(O,{size:"lg",style:"monochrome"}),e.jsxs("div",{className:"flex flex-1 flex-wrap items-center",children:[e.jsxs("p",{className:"mr-2",children:["Welcome to the"," ",e.jsx(h,{to:`https://${n}`,className:"underline",target:"_blank",children:a})," ","Workshop app!"]}),o]})]}),r?null:e.jsxs("div",{className:"hidden h-full flex-col items-center sm:flex md:flex-row",children:[e.jsxs(h,{to:`https://${n}`,target:"_blank",className:"flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold",children:[e.jsxs("span",{className:"drop-shadow-sm",children:["Join ",a]}),e.jsx("span",{children:"↗︎"})]}),e.jsxs(h,{to:ENV.EPICSHOP_DEPLOYED?`https://${n}/login`:"/login",className:"flex h-full items-center justify-center space-x-1.5 bg-white/20 px-5 text-sm font-semibold shadow-md transition hover:bg-white/30",children:[e.jsx(y,{name:"User",size:"lg"}),e.jsx("span",{className:"drop-shadow-sm",children:"Login"})]})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex flex-1 flex-wrap items-center gap-4 sm:hidden",children:[e.jsx("a",{href:`https://${n}`,children:e.jsx(O,{size:"lg",style:"monochrome"})}),e.jsxs(Dt,{children:[e.jsx(Et,{children:e.jsx(y,{name:"Question",size:"lg",className:"animate-pulse"})}),e.jsxs(Re,{children:[e.jsxs(Ie,{children:[e.jsx(O,{size:"lg",style:"monochrome"}),e.jsx("span",{className:"text-lg font-semibold",children:a})]}),e.jsxs(Le,{children:["Welcome to the"," ",e.jsx(h,{to:`https://${n}`,className:"underline",children:a})," ","Workshop app!"]}),o]})]})]}),r?null:e.jsxs("div",{className:"flex h-full items-center",children:[e.jsxs(h,{to:`https://${n}`,target:"_blank",className:"flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold",children:[e.jsx("span",{className:"drop-shadow-sm",children:"Join"}),e.jsx("span",{children:"↗︎"})]}),e.jsxs(h,{to:ENV.EPICSHOP_DEPLOYED?`https://${n}/login`:"/login",className:"flex h-full items-center justify-center space-x-1.5 bg-white/20 px-5 text-sm font-semibold shadow-md transition hover:bg-white/30",children:[e.jsx(y,{name:"User",size:"lg"}),e.jsx("span",{className:"drop-shadow-sm",children:"Login"})]})]})]})})}const $e={hidden:{opacity:0,x:-20},visible:{opacity:1,x:0}};function Fe({exerciseNumber:t,children:n}){const a=st(t);return e.jsx(x.li,{variants:$e,className:p("py-[6px] first:pt-3 last:pb-3",a?`${a} before:border-t`:null),children:e.jsx("span",{className:"inline-block pl-2",children:n})})}function R({children:t,...n}){const a=ot(n);return e.jsx(x.li,{variants:$e,className:p("py-[6px] first:pt-3 last:pb-3",a?`${a} before:border-t`:null),children:e.jsx("span",{className:"inline-block pl-2",children:t})})}function St({isMenuOpened:t,onMenuOpenChange:n}){const a=z(),r=$(),o=ce(),s=se(),f=le(),{users:c}=Q(),u={visible:{opacity:1,transition:{duration:.05,when:"beforeChildren",staggerChildren:.03}},hidden:{opacity:0}};return e.jsx("nav",{className:"flex w-full border-b sm:hidden",children:e.jsx("div",{className:"w-full",children:e.jsxs("div",{className:p("flex items-center",{"flex-col":t,"h-14":!t}),children:[e.jsx(We,{title:a.workshopTitle,isMenuOpened:t,setMenuOpened:n}),t&&e.jsxs(x.div,{className:"flex w-full flex-grow flex-col justify-between overflow-x-auto p-6 scrollbar-thin scrollbar-thumb-scrollbar",initial:{opacity:0},animate:{opacity:1},children:[e.jsxs(x.ul,{variants:u,initial:"hidden",animate:"visible",className:"flex flex-col",children:[e.jsx("span",{children:e.jsx(D,{prefetch:"intent",to:"/",className:({isActive:l})=>m("relative whitespace-nowrap px-2 py-0.5 pr-3 text-2xl font-bold outline-none hover:underline focus:underline",'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":l}),children:"Home"})}),a.exercises.map(({exerciseNumber:l,title:b,steps:w})=>{const g=Number(s.exerciseNumber)===l,i=!g&&a.playground.exerciseNumber===l;return e.jsxs(Fe,{exerciseNumber:l,children:[e.jsxs("span",{className:"flex items-center gap-1 text-2xl font-bold",children:[e.jsx(h,{prefetch:"intent",to:k(l),className:m("relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline",'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":g}),children:b}),i?e.jsx(h,{to:E(a.playground.exerciseNumber,a.playground.stepNumber,a.playground.type),prefetch:"intent",children:"🛝"}):null]}),g?e.jsxs(x.ul,{variants:u,initial:"hidden",animate:"visible",className:"ml-4 mt-2 flex flex-col",children:[e.jsx(R,{type:"instructions",exerciseNumber:l,children:e.jsx(h,{to:k(l),prefetch:"intent",className:m('relative whitespace-nowrap px-2 py-0.5 pr-3 text-xl font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":!s.stepNumber}),children:"Intro"})},l),w.filter(Boolean).map(({stepNumber:j,title:_,problem:C,solution:A})=>e.jsx(R,{type:"step",stepNumber:j,exerciseNumber:l,children:e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsxs(h,{to:E(l,j),prefetch:"intent",className:"font-semibold leading-tight",children:[j.toString().padStart(2,"0"),"."," ",_]}),e.jsxs("div",{className:"ml-3 mt-0.5 flex gap-1",children:[C&&e.jsxs(D,{to:E(l,j,"problem"),prefetch:"intent",className:({isActive:v})=>m("relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline",'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":v}),children:["Problem",C.name===a.playground.appName?" 🛝":""]}),A&&e.jsxs(D,{to:E(l,j,"solution"),prefetch:"intent",className:({isActive:v})=>m("relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline",'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":v}),children:["Solution",A.name===a.playground.appName?" 🛝":""]})]})]})},j)),e.jsx(R,{type:"finished",exerciseNumber:l,children:e.jsx(D,{to:k(l,"finished"),prefetch:"intent",className:({isActive:j})=>m('relative whitespace-nowrap px-2 py-0.5 pr-3 text-base font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":j}),children:"📝 Elaboration"})})]}):null]},l)})]}),e.jsx("div",{className:"mt-6",children:e.jsx(D,{to:"/finished",className:({isActive:l})=>m("relative whitespace-nowrap text-lg font-bold outline-none hover:underline focus:underline",{'bg-black text-white after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[""]':l}),children:"📝 Workshop Feedback"})})]}),e.jsx("div",{className:"flex-grow"}),f?null:e.jsx(S,{content:t?null:"You are offline",children:e.jsx("div",{className:p("flex h-14 animate-pulse items-center justify-start p-4",t?"w-full border-t":"border-l"),children:e.jsx(y,{name:"WifiNoConnection",className:"text-foreground-destructive",children:t?"You are offline":null})})}),e.jsx("div",{className:p("flex items-center justify-start p-4",t&&c.length>4?"min-h-14":"h-14",t?"w-full border-t":"border-l"),children:e.jsx(Ae,{isMenuOpened:t})}),ENV.EPICSHOP_DEPLOYED?null:r?e.jsx(S,{content:t?null:"Your account",children:e.jsxs(h,{className:p("flex h-14 flex-shrink-0 items-center justify-start space-x-3 px-4 py-4 text-center no-underline hover:underline",{"border-l":!t,"w-full border-t":t}),to:"/account",children:[r.imageUrlSmall?e.jsx("img",{alt:r.name??r.email,src:r.imageUrlSmall,className:"h-full rounded-full"}):e.jsx(y,{name:"User",className:"flex-shrink-0",size:"lg"}),t?e.jsx(x.div,{className:"flex items-center whitespace-nowrap",initial:{opacity:0},animate:{opacity:1},children:"Your Account"}):e.jsx("span",{className:"sr-only",children:"Your account"})]})}):null,ENV.EPICSHOP_DEPLOYED?null:r&&o?e.jsx(S,{content:t?null:"Continue to next lesson",children:e.jsxs(h,{to:o,prefetch:"intent",className:m("flex h-14 w-full items-center space-x-3 border-l px-4 py-4 pl-[18px] no-underline hover:underline"),state:{from:"continue next lesson button"},children:[e.jsx(y,{name:"FastForward",className:"flex-shrink-0",size:"md"}),t?e.jsx(x.div,{className:"flex items-center whitespace-nowrap",initial:{opacity:0},animate:{opacity:1},children:"Continue to next lesson"}):e.jsx("span",{className:"sr-only",children:"Continue to next lesson"})]})}):null,e.jsx("div",{className:p("flex h-14 w-14 items-center justify-center self-start p-4 sm:mb-4 sm:w-full",{"w-full border-t":t,"border-l":!t}),children:e.jsx(de,{})})]})})})}const U=400;function Rt({isMenuOpened:t,onMenuOpenChange:n}){const a=z(),r=$(),o=ce(),s=se(),f=le(),{users:c}=Q(),u=a.exercises.find(i=>i.exerciseNumber===Number(s.exerciseNumber)),l=s.type==="solution"?u?.solutions.find(i=>i.stepNumber===Number(s.stepNumber)):s.type==="problem"?u?.problems.find(i=>i.stepNumber===Number(s.stepNumber)):null,b=Y(),w={close:{width:56},open:{width:U}},g={visible:{opacity:1,transition:{duration:.05,when:"beforeChildren",staggerChildren:.03}},hidden:{opacity:0}};return e.jsx("nav",{className:"hidden border-r sm:flex",children:e.jsx(x.div,{initial:t?"open":"close",variants:w,animate:b,children:e.jsxs("div",{className:"flex h-full flex-col items-center justify-between",children:[e.jsx(We,{title:a.workshopTitle,menuControls:b,isMenuOpened:t,setMenuOpened:n}),t&&e.jsxs(x.div,{style:{width:U},className:"flex flex-grow flex-col justify-between overflow-y-auto p-6 scrollbar-thin scrollbar-thumb-scrollbar",initial:{opacity:0},animate:{opacity:1},children:[e.jsxs(x.ul,{variants:g,initial:"hidden",animate:"visible",className:"flex flex-col",children:[e.jsx("span",{children:e.jsx(D,{prefetch:"intent",to:"/",className:({isActive:i})=>m("relative whitespace-nowrap px-2 py-0.5 pr-3 text-2xl font-bold outline-none hover:underline focus:underline",'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":i}),children:"Home"})}),a.exercises.map(({exerciseNumber:i,title:j,steps:_})=>{const C=Number(s.exerciseNumber)===i,A=!C&&a.playground.exerciseNumber===i;return e.jsxs(Fe,{exerciseNumber:i,children:[e.jsxs("span",{className:"flex items-center gap-1 text-2xl font-bold",children:[e.jsx(h,{prefetch:"intent",to:k(i),className:m("relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline",'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":C}),children:j}),A?e.jsx(h,{to:E(a.playground.exerciseNumber,a.playground.stepNumber,a.playground.type),prefetch:"intent",children:"🛝"}):null]}),C?e.jsxs(x.ul,{variants:g,initial:"hidden",animate:"visible",className:"ml-4 mt-2 flex flex-col",children:[e.jsx(R,{type:"instructions",exerciseNumber:i,children:e.jsx(h,{to:k(i),prefetch:"intent",className:m('relative whitespace-nowrap px-2 py-0.5 pr-3 text-xl font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":!s.stepNumber}),children:"Intro"})},i),_.filter(Boolean).map(({stepNumber:v,title:Oe,problem:q,solution:Z})=>e.jsx(R,{type:"step",stepNumber:v,exerciseNumber:i,children:e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsxs(h,{to:E(i,v),prefetch:"intent",className:"font-semibold leading-tight",children:[v.toString().padStart(2,"0"),"."," ",Oe]}),e.jsxs("div",{className:"ml-3 mt-0.5 flex gap-1",children:[q&&e.jsxs(D,{to:E(i,v,"problem"),prefetch:"intent",className:({isActive:W})=>m("relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline",'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":W}),children:["Problem",q.name===a.playground.appName?" 🛝":""]}),Z&&e.jsxs(D,{to:E(i,v,"solution"),prefetch:"intent",className:({isActive:W})=>m("relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline",'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":W}),children:["Solution",Z.name===a.playground.appName?" 🛝":""]})]})]})},v)),e.jsx(R,{type:"finished",exerciseNumber:i,children:e.jsx(D,{to:k(i,"finished"),prefetch:"intent",className:({isActive:v})=>m('relative whitespace-nowrap px-2 py-0.5 pr-3 text-base font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[""] hover:underline focus:underline',{"bg-foreground text-background":v}),children:"📝 Elaboration"})})]}):null]},i)})]}),e.jsx("div",{className:"mt-6",children:e.jsx(D,{to:"/finished",className:({isActive:i})=>m("relative whitespace-nowrap text-lg font-bold outline-none hover:underline focus:underline",{'bg-black text-white after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[""]':i}),children:"📝 Workshop Feedback"})})]}),!t&&e.jsx("div",{className:"flex flex-grow flex-col justify-center",children:e.jsxs("div",{className:"orientation-sideways w-full font-mono text-sm font-medium uppercase leading-none",children:[u?.title?e.jsx(h,{to:k(Number(s.exerciseNumber)),children:u.title}):null,u?.title&&l?.title?" — ":null,l?.title?e.jsx(h,{to:E(Number(s.exerciseNumber),l.stepNumber),children:l.title}):null]})}),f?null:e.jsx(S,{content:t?null:"You are offline",children:e.jsx("div",{className:p("flex w-full animate-pulse items-center border-t p-4",t?"justify-start":"justify-center"),children:e.jsx(y,{name:"WifiNoConnection",className:"text-foreground-destructive",children:t?e.jsx("span",{className:"whitespace-nowrap",children:"You are offline"}):null})})}),e.jsx("div",{className:p("flex w-full items-center justify-start border-t p-4 transition-[height]",t&&c.length>4?"h-28":"h-14"),style:t?{width:U}:{},children:e.jsx(Ae,{isMenuOpened:t})}),ENV.EPICSHOP_DEPLOYED?null:r?e.jsx(S,{content:t?null:"Your account",children:e.jsxs(h,{className:"flex h-14 w-full flex-shrink-0 items-center justify-start space-x-3 border-t px-4 py-4 text-center no-underline hover:underline",to:"/account",children:[r.imageUrlSmall?e.jsx("img",{alt:r.name??r.email,src:r.imageUrlSmall,className:"h-full rounded-full"}):e.jsx(y,{name:"User",className:"flex-shrink-0",size:"lg"}),t?e.jsx(x.div,{className:"flex items-center whitespace-nowrap",initial:{opacity:0},animate:{opacity:1},children:"Your Account"}):e.jsx("span",{className:"sr-only",children:"Your account"})]})}):null,ENV.EPICSHOP_DEPLOYED?null:r&&o?e.jsx(S,{content:t?null:"Continue to next lesson",children:e.jsxs(h,{to:o,prefetch:"intent",className:m("flex h-14 w-full items-center space-x-3 border-t px-4 py-4 pl-[18px] no-underline hover:underline"),state:{from:"continue next lesson button"},children:[e.jsx(y,{name:"FastForward",className:"flex-shrink-0",size:"md"}),t?e.jsx(x.div,{className:"flex items-center whitespace-nowrap",initial:{opacity:0},animate:{opacity:1},children:"Continue to next lesson"}):e.jsx("span",{className:"sr-only",children:"Continue to next lesson"})]})}):null,e.jsx("div",{className:"mb-4 w-full self-start border-t pl-3 pt-[15px]",children:e.jsx(de,{})})]})})})}function We({title:t,isMenuOpened:n,setMenuOpened:a,menuControls:r}){const o=d.useRef(n),s=d.useRef(null),f={open:{d:"M3.06061 2.99999L21.0606 21"},closed:{d:"M0 9.5L24 9.5"}},c={open:{d:"M3.00006 21.0607L21 3.06064"},moving:{d:"M0 14.5L24 14.5"},closed:{d:"M0 14.5L15 14.5"}},u=Y(),l=Y();async function b(){r?.start(n?"close":"open"),a(!n),n?(u.start(f.closed),await l.start(c.moving),l.start(c.closed)):(await l.start(c.moving),u.start(f.open),l.start(c.open))}return d.useEffect(()=>{if(!n)return;function w(g){g.key==="Escape"&&s.current?.click()}return document.addEventListener("keyup",w),()=>document.removeEventListener("keyup",w)},[n]),e.jsxs("div",{className:p("relative inline-flex h-14 flex-shrink-0 items-center justify-between overflow-hidden border-r sm:w-full sm:border-b sm:border-r-0",{"w-full":n}),children:[e.jsx("button",{ref:s,className:"flex h-14 w-14 items-center justify-center","aria-label":"Open Navigation menu",onClick:b,children:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",children:[e.jsx(x.path,{...f[o.current?"open":"closed"],animate:u,transition:{duration:.2},stroke:"currentColor",strokeWidth:1.5}),e.jsx(x.path,{...c[o.current?"open":"closed"],animate:l,transition:{duration:.2},stroke:"currentColor",strokeWidth:1.5})]})}),n&&e.jsx(x.p,{transition:{delay:.2},initial:{opacity:0,y:5},animate:{opacity:1,y:0},className:"absolute right-5 whitespace-nowrap font-mono text-sm uppercase",children:e.jsx(h,{to:"/",children:t})})]})}export{qt as default};
6
- //# sourceMappingURL=_layout-vRDHFYoQ.js.map
6
+ //# sourceMappingURL=_layout-DRBfGSzn.js.map