@epic-web/workshop-app 0.0.0-semantically-released

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 (305) hide show
  1. package/README.md +10 -0
  2. package/bin/epicshop.js +321 -0
  3. package/build/client/app-default.css +39 -0
  4. package/build/client/assets/_-C_7mS1-0.js +2 -0
  5. package/build/client/assets/_-C_7mS1-0.js.map +1 -0
  6. package/build/client/assets/_-l0sNRNKZ.js +2 -0
  7. package/build/client/assets/_-l0sNRNKZ.js.map +1 -0
  8. package/build/client/assets/_basePickBy-DxgDhkrj.js +2 -0
  9. package/build/client/assets/_basePickBy-DxgDhkrj.js.map +1 -0
  10. package/build/client/assets/_baseUniq-Bh4NktJz.js +2 -0
  11. package/build/client/assets/_baseUniq-Bh4NktJz.js.map +1 -0
  12. package/build/client/assets/_exerciseNumber-D3lfJewu.js +2 -0
  13. package/build/client/assets/_exerciseNumber-D3lfJewu.js.map +1 -0
  14. package/build/client/assets/_exerciseNumber_._stepNumber-BNj079sn.js +2 -0
  15. package/build/client/assets/_exerciseNumber_._stepNumber-BNj079sn.js.map +1 -0
  16. package/build/client/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js +2 -0
  17. package/build/client/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js.map +1 -0
  18. package/build/client/assets/_exerciseNumber_.finished-a6jXslNA.js +2 -0
  19. package/build/client/assets/_exerciseNumber_.finished-a6jXslNA.js.map +1 -0
  20. package/build/client/assets/_layout-B3FchrR9.js +2 -0
  21. package/build/client/assets/_layout-B3FchrR9.js.map +1 -0
  22. package/build/client/assets/_layout-B6ARVFTz.js +2 -0
  23. package/build/client/assets/_layout-B6ARVFTz.js.map +1 -0
  24. package/build/client/assets/_layout-CtqVeNw0.js +6 -0
  25. package/build/client/assets/_layout-CtqVeNw0.js.map +1 -0
  26. package/build/client/assets/_layout-dHfVo9gJ.js +2 -0
  27. package/build/client/assets/_layout-dHfVo9gJ.js.map +1 -0
  28. package/build/client/assets/accordion-PSsenYUI.js +2 -0
  29. package/build/client/assets/accordion-PSsenYUI.js.map +1 -0
  30. package/build/client/assets/account-Jl0f1Zst.js +2 -0
  31. package/build/client/assets/account-Jl0f1Zst.js.map +1 -0
  32. package/build/client/assets/api._-l0sNRNKZ.js +2 -0
  33. package/build/client/assets/api._-l0sNRNKZ.js.map +1 -0
  34. package/build/client/assets/app-CpF0K1cW.css +1 -0
  35. package/build/client/assets/app-CzIg9kJh.js +2 -0
  36. package/build/client/assets/app-CzIg9kJh.js.map +1 -0
  37. package/build/client/assets/app.epic_ws_.js_-l0sNRNKZ.js +2 -0
  38. package/build/client/assets/app.epic_ws_.js_-l0sNRNKZ.js.map +1 -0
  39. package/build/client/assets/apps-DP2rzg_V.js +2 -0
  40. package/build/client/assets/apps-DP2rzg_V.js.map +1 -0
  41. package/build/client/assets/apps-l0sNRNKZ.js +2 -0
  42. package/build/client/assets/apps-l0sNRNKZ.js.map +1 -0
  43. package/build/client/assets/arc-B6tHINqs.js +2 -0
  44. package/build/client/assets/arc-B6tHINqs.js.map +1 -0
  45. package/build/client/assets/architectureDiagram-NQ2NVSRB-D_wGZ5nT.js +37 -0
  46. package/build/client/assets/architectureDiagram-NQ2NVSRB-D_wGZ5nT.js.map +1 -0
  47. package/build/client/assets/blockDiagram-PHRCVELO-h_TbDJvl.js +123 -0
  48. package/build/client/assets/blockDiagram-PHRCVELO-h_TbDJvl.js.map +1 -0
  49. package/build/client/assets/button-cFpvwtjC.js +2 -0
  50. package/build/client/assets/button-cFpvwtjC.js.map +1 -0
  51. package/build/client/assets/c4Diagram-6F6E4RAY-BfXjadL9.js +11 -0
  52. package/build/client/assets/c4Diagram-6F6E4RAY-BfXjadL9.js.map +1 -0
  53. package/build/client/assets/cache-l0sNRNKZ.js +2 -0
  54. package/build/client/assets/cache-l0sNRNKZ.js.map +1 -0
  55. package/build/client/assets/channel-ClIoK57K.js +2 -0
  56. package/build/client/assets/channel-ClIoK57K.js.map +1 -0
  57. package/build/client/assets/chunk-353BL4L5-CExuR7H8.js +2 -0
  58. package/build/client/assets/chunk-353BL4L5-CExuR7H8.js.map +1 -0
  59. package/build/client/assets/chunk-67H74DCK-BF9_AOuB.js +2 -0
  60. package/build/client/assets/chunk-67H74DCK-BF9_AOuB.js.map +1 -0
  61. package/build/client/assets/chunk-6OLS64BW-B_GeRv1G.js +221 -0
  62. package/build/client/assets/chunk-6OLS64BW-B_GeRv1G.js.map +1 -0
  63. package/build/client/assets/chunk-AACKK3MU-BcoQc9Ht.js +2 -0
  64. package/build/client/assets/chunk-AACKK3MU-BcoQc9Ht.js.map +1 -0
  65. package/build/client/assets/chunk-BFAMUDN2-DBCLoV1m.js +2 -0
  66. package/build/client/assets/chunk-BFAMUDN2-DBCLoV1m.js.map +1 -0
  67. package/build/client/assets/chunk-E2GYISFI-DvCzOl_M.js +16 -0
  68. package/build/client/assets/chunk-E2GYISFI-DvCzOl_M.js.map +1 -0
  69. package/build/client/assets/chunk-QEP2MXWD-BA02qRA0.js +166 -0
  70. package/build/client/assets/chunk-QEP2MXWD-BA02qRA0.js.map +1 -0
  71. package/build/client/assets/chunk-QMGIS6GS-CG5cA6CX.js +44 -0
  72. package/build/client/assets/chunk-QMGIS6GS-CG5cA6CX.js.map +1 -0
  73. package/build/client/assets/chunk-SKB7J2MH-BG1nHV0M.js +2 -0
  74. package/build/client/assets/chunk-SKB7J2MH-BG1nHV0M.js.map +1 -0
  75. package/build/client/assets/classDiagram-BGRH5UQR-BZY1Xh5a.js +2 -0
  76. package/build/client/assets/classDiagram-BGRH5UQR-BZY1Xh5a.js.map +1 -0
  77. package/build/client/assets/classDiagram-v2-O24JOBDK-BZY1Xh5a.js +2 -0
  78. package/build/client/assets/classDiagram-v2-O24JOBDK-BZY1Xh5a.js.map +1 -0
  79. package/build/client/assets/clone-RGlausHy.js +2 -0
  80. package/build/client/assets/clone-RGlausHy.js.map +1 -0
  81. package/build/client/assets/cytoscape.esm-BBIONMvf.js +332 -0
  82. package/build/client/assets/cytoscape.esm-BBIONMvf.js.map +1 -0
  83. package/build/client/assets/dagre-FFZHY6LT-CGbe3nXJ.js +5 -0
  84. package/build/client/assets/dagre-FFZHY6LT-CGbe3nXJ.js.map +1 -0
  85. package/build/client/assets/defaultLocale-C4B-KCzX.js +2 -0
  86. package/build/client/assets/defaultLocale-C4B-KCzX.js.map +1 -0
  87. package/build/client/assets/diagram-3EMPZRKU-8UM2S96z.js +25 -0
  88. package/build/client/assets/diagram-3EMPZRKU-8UM2S96z.js.map +1 -0
  89. package/build/client/assets/diagram-5UYTHUR4-Bq8b35J7.js +25 -0
  90. package/build/client/assets/diagram-5UYTHUR4-Bq8b35J7.js.map +1 -0
  91. package/build/client/assets/diagram-ZTM2IBQH-DZ0Q3vKL.js +44 -0
  92. package/build/client/assets/diagram-ZTM2IBQH-DZ0Q3vKL.js.map +1 -0
  93. package/build/client/assets/diff-DTFs5rVO.js +2 -0
  94. package/build/client/assets/diff-DTFs5rVO.js.map +1 -0
  95. package/build/client/assets/diff-DpX_9FU6.js +2 -0
  96. package/build/client/assets/diff-DpX_9FU6.js.map +1 -0
  97. package/build/client/assets/discord-C86FbV-j.js +2 -0
  98. package/build/client/assets/discord-C86FbV-j.js.map +1 -0
  99. package/build/client/assets/discord-DOEtvB6W.js +2 -0
  100. package/build/client/assets/discord-DOEtvB6W.js.map +1 -0
  101. package/build/client/assets/entry.client-anc4-dZY.js +35 -0
  102. package/build/client/assets/entry.client-anc4-dZY.js.map +1 -0
  103. package/build/client/assets/epic-video-CCv7QINN.js +3210 -0
  104. package/build/client/assets/epic-video-CCv7QINN.js.map +1 -0
  105. package/build/client/assets/epic-video-D2Xftn6t.css +1 -0
  106. package/build/client/assets/epic_ws_.js_-l0sNRNKZ.js +2 -0
  107. package/build/client/assets/epic_ws_.js_-l0sNRNKZ.js.map +1 -0
  108. package/build/client/assets/erDiagram-R3QVA2FD-Bu6B069U.js +61 -0
  109. package/build/client/assets/erDiagram-R3QVA2FD-Bu6B069U.js.map +1 -0
  110. package/build/client/assets/error-boundary-B8bEOgxp.js +2 -0
  111. package/build/client/assets/error-boundary-B8bEOgxp.js.map +1 -0
  112. package/build/client/assets/exercises-l0sNRNKZ.js +2 -0
  113. package/build/client/assets/exercises-l0sNRNKZ.js.map +1 -0
  114. package/build/client/assets/finished-RnlPhc3t.js +2 -0
  115. package/build/client/assets/finished-RnlPhc3t.js.map +1 -0
  116. package/build/client/assets/flowDiagram-PKI6S5ZS-ie1Nf5_c.js +163 -0
  117. package/build/client/assets/flowDiagram-PKI6S5ZS-ie1Nf5_c.js.map +1 -0
  118. package/build/client/assets/ganttDiagram-EK5VF46D-BjgRWg6k.js +268 -0
  119. package/build/client/assets/ganttDiagram-EK5VF46D-BjgRWg6k.js.map +1 -0
  120. package/build/client/assets/gitGraphDiagram-GW3U2K7C-BmD31KK0.js +66 -0
  121. package/build/client/assets/gitGraphDiagram-GW3U2K7C-BmD31KK0.js.map +1 -0
  122. package/build/client/assets/graph-BBuyk5Ru.js +2 -0
  123. package/build/client/assets/graph-BBuyk5Ru.js.map +1 -0
  124. package/build/client/assets/icons-BM6r7NHK.svg +570 -0
  125. package/build/client/assets/index-7Ba6ptu2.js +42 -0
  126. package/build/client/assets/index-7Ba6ptu2.js.map +1 -0
  127. package/build/client/assets/index-Bp_2FjuO.js +10 -0
  128. package/build/client/assets/index-Bp_2FjuO.js.map +1 -0
  129. package/build/client/assets/index-CNmh2cao.js +2 -0
  130. package/build/client/assets/index-CNmh2cao.js.map +1 -0
  131. package/build/client/assets/index-CZ8q0Nf8.js +2 -0
  132. package/build/client/assets/index-CZ8q0Nf8.js.map +1 -0
  133. package/build/client/assets/index-DP2rzg_V.js +2 -0
  134. package/build/client/assets/index-DP2rzg_V.js.map +1 -0
  135. package/build/client/assets/index-DSMFPAn8.js +2 -0
  136. package/build/client/assets/index-DSMFPAn8.js.map +1 -0
  137. package/build/client/assets/index-DxbpRM0V.js +2 -0
  138. package/build/client/assets/index-DxbpRM0V.js.map +1 -0
  139. package/build/client/assets/index-K6Dvbx-E.js +2 -0
  140. package/build/client/assets/index-K6Dvbx-E.js.map +1 -0
  141. package/build/client/assets/index-LNXI3Vlr.js +2 -0
  142. package/build/client/assets/index-LNXI3Vlr.js.map +1 -0
  143. package/build/client/assets/index-_jNKXw67.js +2 -0
  144. package/build/client/assets/index-_jNKXw67.js.map +1 -0
  145. package/build/client/assets/index-l0sNRNKZ.js +2 -0
  146. package/build/client/assets/index-l0sNRNKZ.js.map +1 -0
  147. package/build/client/assets/index-rknZKmMI.js +36 -0
  148. package/build/client/assets/index-rknZKmMI.js.map +1 -0
  149. package/build/client/assets/infoDiagram-RLU2ROGC-DVoDIRGH.js +3 -0
  150. package/build/client/assets/infoDiagram-RLU2ROGC-DVoDIRGH.js.map +1 -0
  151. package/build/client/assets/init-Gi6I4Gst.js +2 -0
  152. package/build/client/assets/init-Gi6I4Gst.js.map +1 -0
  153. package/build/client/assets/journeyDiagram-EWQZEKCU-C_Lb2L11.js +140 -0
  154. package/build/client/assets/journeyDiagram-EWQZEKCU-C_Lb2L11.js.map +1 -0
  155. package/build/client/assets/jsx-runtime-EKYJJIwR.js +10 -0
  156. package/build/client/assets/jsx-runtime-EKYJJIwR.js.map +1 -0
  157. package/build/client/assets/kanban-definition-ILFWEQ3N-KsekSC1N.js +90 -0
  158. package/build/client/assets/kanban-definition-ILFWEQ3N-KsekSC1N.js.map +1 -0
  159. package/build/client/assets/katex-DsmCZfJr.js +262 -0
  160. package/build/client/assets/katex-DsmCZfJr.js.map +1 -0
  161. package/build/client/assets/l-D9C1VDbZ.js +2 -0
  162. package/build/client/assets/l-D9C1VDbZ.js.map +1 -0
  163. package/build/client/assets/launch-editor-l0sNRNKZ.js +2 -0
  164. package/build/client/assets/launch-editor-l0sNRNKZ.js.map +1 -0
  165. package/build/client/assets/layout-BkH8Qi9T.js +2 -0
  166. package/build/client/assets/layout-BkH8Qi9T.js.map +1 -0
  167. package/build/client/assets/linear-tKBS5mAJ.js +2 -0
  168. package/build/client/assets/linear-tKBS5mAJ.js.map +1 -0
  169. package/build/client/assets/loading-CZYaLyAk.js +2 -0
  170. package/build/client/assets/loading-CZYaLyAk.js.map +1 -0
  171. package/build/client/assets/login-BHKNDLwl.js +2 -0
  172. package/build/client/assets/login-BHKNDLwl.js.map +1 -0
  173. package/build/client/assets/login-sse-l0sNRNKZ.js +2 -0
  174. package/build/client/assets/login-sse-l0sNRNKZ.js.map +1 -0
  175. package/build/client/assets/manifest-b97649b5.js +1 -0
  176. package/build/client/assets/mdx-BEhxx-X4.js +3 -0
  177. package/build/client/assets/mdx-BEhxx-X4.js.map +1 -0
  178. package/build/client/assets/mermaid.core-CqaUvNIK.js +214 -0
  179. package/build/client/assets/mermaid.core-CqaUvNIK.js.map +1 -0
  180. package/build/client/assets/mindmap-definition-CZNETY7S-BGn0gmpB.js +96 -0
  181. package/build/client/assets/mindmap-definition-CZNETY7S-BGn0gmpB.js.map +1 -0
  182. package/build/client/assets/misc-COGqV2fm.js +2 -0
  183. package/build/client/assets/misc-COGqV2fm.js.map +1 -0
  184. package/build/client/assets/nav-chevrons-Cxzx0j13.js +2 -0
  185. package/build/client/assets/nav-chevrons-Cxzx0j13.js.map +1 -0
  186. package/build/client/assets/notifications-l0sNRNKZ.js +2 -0
  187. package/build/client/assets/notifications-l0sNRNKZ.js.map +1 -0
  188. package/build/client/assets/og-l0sNRNKZ.js +2 -0
  189. package/build/client/assets/og-l0sNRNKZ.js.map +1 -0
  190. package/build/client/assets/onboarding-7Vho777l.js +2 -0
  191. package/build/client/assets/onboarding-7Vho777l.js.map +1 -0
  192. package/build/client/assets/online-CwZkKwTv.js +2 -0
  193. package/build/client/assets/online-CwZkKwTv.js.map +1 -0
  194. package/build/client/assets/ordinal-Cboi1Yqb.js +2 -0
  195. package/build/client/assets/ordinal-Cboi1Yqb.js.map +1 -0
  196. package/build/client/assets/pe-DoDyGTeN.js +2 -0
  197. package/build/client/assets/pe-DoDyGTeN.js.map +1 -0
  198. package/build/client/assets/pieDiagram-NIOCPIFQ-TwGmrzCW.js +31 -0
  199. package/build/client/assets/pieDiagram-NIOCPIFQ-TwGmrzCW.js.map +1 -0
  200. package/build/client/assets/preferences-Dx_EUPYj.js +2 -0
  201. package/build/client/assets/preferences-Dx_EUPYj.js.map +1 -0
  202. package/build/client/assets/presence-tDxUeb6L.js +28 -0
  203. package/build/client/assets/presence-tDxUeb6L.js.map +1 -0
  204. package/build/client/assets/preview-COuApZAb.js +2 -0
  205. package/build/client/assets/preview-COuApZAb.js.map +1 -0
  206. package/build/client/assets/processes-l0sNRNKZ.js +2 -0
  207. package/build/client/assets/processes-l0sNRNKZ.js.map +1 -0
  208. package/build/client/assets/product-DNKDVhI_.js +2 -0
  209. package/build/client/assets/product-DNKDVhI_.js.map +1 -0
  210. package/build/client/assets/progress-DKsShYpv.js +2 -0
  211. package/build/client/assets/progress-DKsShYpv.js.map +1 -0
  212. package/build/client/assets/progress-bar-Cww9t8Vn.js +2 -0
  213. package/build/client/assets/progress-bar-Cww9t8Vn.js.map +1 -0
  214. package/build/client/assets/progress-l0sNRNKZ.js +2 -0
  215. package/build/client/assets/progress-l0sNRNKZ.js.map +1 -0
  216. package/build/client/assets/quadrantDiagram-2OG54O6I-C2FaFW77.js +8 -0
  217. package/build/client/assets/quadrantDiagram-2OG54O6I-C2FaFW77.js.map +1 -0
  218. package/build/client/assets/requirementDiagram-SO3GGRV7-BENrmejn.js +65 -0
  219. package/build/client/assets/requirementDiagram-SO3GGRV7-BENrmejn.js.map +1 -0
  220. package/build/client/assets/revalidation-ws-DJwDeSaI.js +2 -0
  221. package/build/client/assets/revalidation-ws-DJwDeSaI.js.map +1 -0
  222. package/build/client/assets/robots_._txt-l0sNRNKZ.js +2 -0
  223. package/build/client/assets/robots_._txt-l0sNRNKZ.js.map +1 -0
  224. package/build/client/assets/root-30K5JoaI.js +2 -0
  225. package/build/client/assets/root-30K5JoaI.js.map +1 -0
  226. package/build/client/assets/sankeyDiagram-4UZDY2LN-DHcxz6y6.js +11 -0
  227. package/build/client/assets/sankeyDiagram-4UZDY2LN-DHcxz6y6.js.map +1 -0
  228. package/build/client/assets/seo-t5J-DRxw.js +2 -0
  229. package/build/client/assets/seo-t5J-DRxw.js.map +1 -0
  230. package/build/client/assets/sequenceDiagram-ZIKVLSP4-wsbYfOcv.js +123 -0
  231. package/build/client/assets/sequenceDiagram-ZIKVLSP4-wsbYfOcv.js.map +1 -0
  232. package/build/client/assets/set-playground-Bx0yIjpY.js +2 -0
  233. package/build/client/assets/set-playground-Bx0yIjpY.js.map +1 -0
  234. package/build/client/assets/set-playground-l0sNRNKZ.js +2 -0
  235. package/build/client/assets/set-playground-l0sNRNKZ.js.map +1 -0
  236. package/build/client/assets/sitemap_._xml-l0sNRNKZ.js +2 -0
  237. package/build/client/assets/sitemap_._xml-l0sNRNKZ.js.map +1 -0
  238. package/build/client/assets/start-l0sNRNKZ.js +2 -0
  239. package/build/client/assets/start-l0sNRNKZ.js.map +1 -0
  240. package/build/client/assets/stateDiagram-XX37X6EN-D8VCWzU7.js +2 -0
  241. package/build/client/assets/stateDiagram-XX37X6EN-D8VCWzU7.js.map +1 -0
  242. package/build/client/assets/stateDiagram-v2-GD6S3NHB-CWoWkzf7.js +2 -0
  243. package/build/client/assets/stateDiagram-v2-GD6S3NHB-CWoWkzf7.js.map +1 -0
  244. package/build/client/assets/support-BnsTkkCH.js +2 -0
  245. package/build/client/assets/support-BnsTkkCH.js.map +1 -0
  246. package/build/client/assets/tailwind-Dqccob1p.css +1 -0
  247. package/build/client/assets/test-B2dwsj84.js +2 -0
  248. package/build/client/assets/test-B2dwsj84.js.map +1 -0
  249. package/build/client/assets/test-l0sNRNKZ.js +2 -0
  250. package/build/client/assets/test-l0sNRNKZ.js.map +1 -0
  251. package/build/client/assets/test._testName-l0sNRNKZ.js +2 -0
  252. package/build/client/assets/test._testName-l0sNRNKZ.js.map +1 -0
  253. package/build/client/assets/test.epic_ws_.js_-l0sNRNKZ.js +2 -0
  254. package/build/client/assets/test.epic_ws_.js_-l0sNRNKZ.js.map +1 -0
  255. package/build/client/assets/tests-DvbNIXBP.js +4 -0
  256. package/build/client/assets/tests-DvbNIXBP.js.map +1 -0
  257. package/build/client/assets/timeline-definition-RI47OAVP-D44Hv-fs.js +62 -0
  258. package/build/client/assets/timeline-definition-RI47OAVP-D44Hv-fs.js.map +1 -0
  259. package/build/client/assets/tooltip-Cm7A1uIP.js +2 -0
  260. package/build/client/assets/tooltip-Cm7A1uIP.js.map +1 -0
  261. package/build/client/assets/treemap-FKARHQ26-COx8AcUM.js +129 -0
  262. package/build/client/assets/treemap-FKARHQ26-COx8AcUM.js.map +1 -0
  263. package/build/client/assets/use-event-source-DDlZtAwc.js +2 -0
  264. package/build/client/assets/use-event-source-DDlZtAwc.js.map +1 -0
  265. package/build/client/assets/user-BQ8D2Fty.js +2 -0
  266. package/build/client/assets/user-BQ8D2Fty.js.map +1 -0
  267. package/build/client/assets/version-CG_ZHfTC.js +2 -0
  268. package/build/client/assets/version-CG_ZHfTC.js.map +1 -0
  269. package/build/client/assets/workshop-config-5VcXxeyp.js +2 -0
  270. package/build/client/assets/workshop-config-5VcXxeyp.js.map +1 -0
  271. package/build/client/assets/xychartDiagram-H2YORKM3-rhbSyPlb.js +8 -0
  272. package/build/client/assets/xychartDiagram-H2YORKM3-rhbSyPlb.js.map +1 -0
  273. package/build/client/favicon.ico +0 -0
  274. package/build/client/favicon.png +0 -0
  275. package/build/client/favicon.svg +13 -0
  276. package/build/client/fonts/neogrotesk/0b8b755c-fee2-4661-9c8b-c5d1fbea901b.woff2 +0 -0
  277. package/build/client/fonts/neogrotesk/146d9d20-3e53-4e5d-beb2-1209bba5ac61.woff2 +0 -0
  278. package/build/client/fonts/neogrotesk/1798ef2b-5ee0-4f39-8b2c-ae3e36f07cd1.woff2 +0 -0
  279. package/build/client/fonts/neogrotesk/1eb2cb40-6822-4654-856c-8cbe652366b6.woff +0 -0
  280. package/build/client/fonts/neogrotesk/3b64793c-0bdb-4e4f-bf0e-cdf2e974d5f2.woff +0 -0
  281. package/build/client/fonts/neogrotesk/3bb44ed4-cf17-469c-8d0d-5946d10fdad1.woff +0 -0
  282. package/build/client/fonts/neogrotesk/4bd29470-1701-41fe-94b6-4a147512160c.woff +0 -0
  283. package/build/client/fonts/neogrotesk/5cdbf070-a094-44c8-b8f1-17a00a19c959.woff2 +0 -0
  284. package/build/client/fonts/neogrotesk/6d439be9-37df-4912-ac09-388ce938fa46.woff2 +0 -0
  285. package/build/client/fonts/neogrotesk/7fc2971f-a9c2-4e09-bd24-bfd4ee6e97b3.woff +0 -0
  286. package/build/client/fonts/neogrotesk/861b65ee-56bd-4057-9af4-3b2903af231e.woff +0 -0
  287. package/build/client/fonts/neogrotesk/8cf836d9-a49e-4387-bcbd-4800766e5d24.woff +0 -0
  288. package/build/client/fonts/neogrotesk/8d61128d-534c-4793-9668-b98bcc2e5969.woff2 +0 -0
  289. package/build/client/fonts/neogrotesk/98423f75-c341-4161-8b92-7cd5c05081e5.woff +0 -0
  290. package/build/client/fonts/neogrotesk/a1456726-ad0d-4f5e-9d8f-ce92e8ce375d.woff2 +0 -0
  291. package/build/client/fonts/neogrotesk/af81e7d2-0bb1-4aa0-bc76-adb78338c568.woff +0 -0
  292. package/build/client/fonts/neogrotesk/d1302ad5-ceee-47cb-a0fa-2da6bd0d4d54.woff2 +0 -0
  293. package/build/client/fonts/neogrotesk/e7e15c31-aad1-4384-abd3-0671ccd03251.woff +0 -0
  294. package/build/client/fonts/neogrotesk/ec6cb127-161b-469c-9816-69489032a234.woff2 +0 -0
  295. package/build/client/fonts/neogrotesk/f480430c-6c50-4ae3-9abb-e92c484f84d6.woff2 +0 -0
  296. package/build/client/img/tiffany.png +0 -0
  297. package/build/client/logo.svg +48 -0
  298. package/build/client/neogrotesk-font.css +100 -0
  299. package/build/client/og/background.png +0 -0
  300. package/build/client/og/logo.svg +1 -0
  301. package/build/server/index.js +11899 -0
  302. package/build/server/index.js.map +1 -0
  303. package/dist/server/index.js +247 -0
  304. package/package.json +1 -0
  305. package/start.js +50 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_layout-B6ARVFTz.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]}
@@ -0,0 +1,6 @@
1
+ import{r as d,w as He,c as z,O as Ue,L as h,e as re,N as D}from"./chunk-QMGIS6GS-CG5cA6CX.js";import{j as e}from"./jsx-runtime-EKYJJIwR.js";import{a as p,I as y,c as m,e as k,f as E}from"./misc-COGqV2fm.js";import{a as Ve}from"./pe-DoDyGTeN.js";import{L as O}from"./product-DNKDVhI_.js";import{u as Ye}from"./revalidation-ws-DJwDeSaI.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-Cm7A1uIP.js";import{P as Me,h as qe,R as Ze,u as Xe,F as et}from"./index-7Ba6ptu2.js";import{c as $,b as tt}from"./user-BQ8D2Fty.js";import{u as oe}from"./workshop-config-5VcXxeyp.js";import{u as le}from"./online-CwZkKwTv.js";import{u as Q}from"./presence-tDxUeb6L.js";import{b as nt,s as ie,c as at,d as st,e as ce,m as x,u as rt,f as ot}from"./progress-DKsShYpv.js";import{T as de}from"./index-rknZKmMI.js";import"./index-Bp_2FjuO.js";function lt(t){t.values.forEach(n=>n.stop())}function V(t,n){[...n].reverse().forEach(s=>{const o=t.getVariant(s);o&&ie(t,o),t.variantChildren&&t.variantChildren.forEach(r=>{V(r,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,s){const o=[];return t.forEach(r=>{o.push(nt(r,a,{transitionOverride:s}))}),Promise.all(o)},set(a){return t.forEach(s=>{it(s,a)})},stop(){t.forEach(a=>{lt(a)})},mount(){return()=>{n.stop()}}};return n}function Y(){const t=at(ct);return st(t.mount,[]),t}function dt(t,n){function a(){return window.matchMedia(t).matches}function s(o){const r=window.matchMedia(t);return r.addEventListener("change",o),()=>{r.removeEventListener("change",o)}}return function(){return d.useSyncExternalStore(s,a,()=>n)}}var F="Dialog",[fe,Qt]=Be(F),[ft,N]=fe(F),ue=t=>{const{__scopeDialog:n,children:a,open:s,defaultOpen:o,onOpenChange:r,modal:f=!0}=t,c=d.useRef(null),u=d.useRef(null),[l,b]=ze({prop:s,defaultProp:o??!1,onChange:r,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,...s}=t,o=N(he,a),r=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),...s,ref:r,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:s,container:o}=t,r=N(J,n);return e.jsx(ut,{scope:n,forceMount:a,children:d.Children.map(s,f=>e.jsx(G,{present:a||r.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:s=a.forceMount,...o}=t,r=N(T,t.__scopeDialog);return r.modal?e.jsx(G,{present:s||r.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,...s}=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),...s,ref:n,style:{pointerEvents:"auto",...s.style}})})}),P="DialogContent",be=d.forwardRef((t,n)=>{const a=me(P,t.__scopeDialog),{forceMount:s=a.forceMount,...o}=t,r=N(P,t.__scopeDialog);return e.jsx(G,{present:s||r.open,children:r.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),s=d.useRef(null),o=B(n,a.contentRef,s);return d.useEffect(()=>{const r=s.current;if(r)return qe(r)},[]),e.jsx(je,{...t,ref:o,trapFocus:a.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:I(t.onCloseAutoFocus,r=>{r.preventDefault(),a.triggerRef.current?.focus()}),onPointerDownOutside:I(t.onPointerDownOutside,r=>{const f=r.detail.originalEvent,c=f.button===0&&f.ctrlKey===!0;(f.button===2||c)&&r.preventDefault()}),onFocusOutside:I(t.onFocusOutside,r=>r.preventDefault())})}),xt=d.forwardRef((t,n)=>{const a=N(P,t.__scopeDialog),s=d.useRef(!1),o=d.useRef(!1);return e.jsx(je,{...t,ref:n,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:r=>{t.onCloseAutoFocus?.(r),r.defaultPrevented||(s.current||a.triggerRef.current?.focus(),r.preventDefault()),s.current=!1,o.current=!1},onInteractOutside:r=>{t.onInteractOutside?.(r),r.defaultPrevented||(s.current=!0,r.detail.originalEvent.type==="pointerdown"&&(o.current=!0));const f=r.target;a.triggerRef.current?.contains(f)&&r.preventDefault(),r.detail.originalEvent.type==="focusin"&&o.current&&r.preventDefault()}})}),je=d.forwardRef((t,n)=>{const{__scopeDialog:a,trapFocus:s,onOpenAutoFocus:o,onCloseAutoFocus:r,...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:s,onMountAutoFocus:o,onUnmountAutoFocus:r,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,...s}=t,o=N(K,a);return e.jsx(L.h2,{id:o.titleId,...s,ref:n})});ve.displayName=K;var we="DialogDescription",ye=d.forwardRef((t,n)=>{const{__scopeDialog:a,...s}=t,o=N(we,a);return e.jsx(L.p,{id:o.descriptionId,...s,ref:n})});ye.displayName=we;var Ne="DialogClose",Ce=d.forwardRef((t,n)=>{const{__scopeDialog:a,...s}=t,o=N(Ne,a);return e.jsx(L.button,{type:"button",...s,ref:n,onClick:I(t.onClick,()=>o.onOpenChange(!1))})});Ce.displayName=Ne;function M(t){return t?"open":"closed"}var De="DialogTitleWarning",[Jt,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
+
3
+ If you want to hide the \`${n.titleName}\`, you can wrap it with our VisuallyHidden component.
4
+
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 s=`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(s))},[s,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,...s}){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),...s,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 se(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:s}}=oe(),o=t?17:0,r=a.length-o,f=r>(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",se(1)),src:"/img/tiffany.png"})}):null,u=`${r}${t?" more ":" "}${s} Dev${r===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=se(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||s,className:p("h-8 w-8 rounded-full border object-cover",w),src:i}):e.jsx("div",{tabIndex:0,"aria-label":l.name||`${s} 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||`${s} 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?`+${r}`:r})})}),e.jsx(te,{children:u})]}):null]})})}const Te=dt("(min-width: 640px)",!0),Kt=He(function(){const n=z(),a=$(),s=Te(),o=Ve(),[r,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&&s?null:e.jsx(St,{isMenuOpened:r,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]":!s&&r}),children:[s?e.jsx(Rt,{isMenuOpened:r,onMenuOpenChange:c}):null,e.jsx("div",{className:p("h-full w-full max-w-full sm:max-w-[calc(100%-56px)]",r?"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(s=>s.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(),s=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."]})," "]}):s?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]})]}),s?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]})]})]}),s?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=rt(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(),s=$(),o=ce(),r=re(),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(r.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":!r.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:s?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:[s.imageUrlSmall?e.jsx("img",{alt:s.name??s.email,src:s.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:s&&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(),s=$(),o=ce(),r=re(),f=le(),{users:c}=Q(),u=a.exercises.find(i=>i.exerciseNumber===Number(r.exerciseNumber)),l=r.type==="solution"?u?.solutions.find(i=>i.stepNumber===Number(r.stepNumber)):r.type==="problem"?u?.problems.find(i=>i.stepNumber===Number(r.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(r.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":!r.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(r.exerciseNumber)),children:u.title}):null,u?.title&&l?.title?" — ":null,l?.title?e.jsx(h,{to:E(Number(r.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:s?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:[s.imageUrlSmall?e.jsx("img",{alt:s.name??s.email,src:s.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:s&&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:s}){const o=d.useRef(n),r=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(){s?.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"&&r.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:r,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{Kt as default};
6
+ //# sourceMappingURL=_layout-CtqVeNw0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_layout-CtqVeNw0.js","sources":["../../../../../node_modules/framer-motion/dist/es/animation/hooks/animation-controls.mjs","../../../../../node_modules/framer-motion/dist/es/animation/hooks/use-animation.mjs","../../../app/components/media-query.ts","../../../../../node_modules/@radix-ui/react-dialog/dist/index.mjs","../../../app/components/ui/dialog.tsx","../../../app/routes/_app+/_layout.tsx"],"sourcesContent":["import { invariant } from 'motion-utils';\nimport { setTarget } from '../../render/utils/setters.mjs';\nimport { animateVisualElement } from '../interfaces/visual-element.mjs';\n\nfunction stopAnimation(visualElement) {\n visualElement.values.forEach((value) => value.stop());\n}\nfunction setVariants(visualElement, variantLabels) {\n const reversedLabels = [...variantLabels].reverse();\n reversedLabels.forEach((key) => {\n const variant = visualElement.getVariant(key);\n variant && setTarget(visualElement, variant);\n if (visualElement.variantChildren) {\n visualElement.variantChildren.forEach((child) => {\n setVariants(child, variantLabels);\n });\n }\n });\n}\nfunction setValues(visualElement, definition) {\n if (Array.isArray(definition)) {\n return setVariants(visualElement, definition);\n }\n else if (typeof definition === \"string\") {\n return setVariants(visualElement, [definition]);\n }\n else {\n setTarget(visualElement, definition);\n }\n}\n/**\n * @public\n */\nfunction animationControls() {\n /**\n * Track whether the host component has mounted.\n */\n let hasMounted = false;\n /**\n * A collection of linked component animation controls.\n */\n const subscribers = new Set();\n const controls = {\n subscribe(visualElement) {\n subscribers.add(visualElement);\n return () => void subscribers.delete(visualElement);\n },\n start(definition, transitionOverride) {\n invariant(hasMounted, \"controls.start() should only be called after a component has mounted. Consider calling within a useEffect hook.\");\n const animations = [];\n subscribers.forEach((visualElement) => {\n animations.push(animateVisualElement(visualElement, definition, {\n transitionOverride,\n }));\n });\n return Promise.all(animations);\n },\n set(definition) {\n invariant(hasMounted, \"controls.set() should only be called after a component has mounted. Consider calling within a useEffect hook.\");\n return subscribers.forEach((visualElement) => {\n setValues(visualElement, definition);\n });\n },\n stop() {\n subscribers.forEach((visualElement) => {\n stopAnimation(visualElement);\n });\n },\n mount() {\n hasMounted = true;\n return () => {\n hasMounted = false;\n controls.stop();\n };\n },\n };\n return controls;\n}\n\nexport { animationControls, setValues };\n","import { useConstant } from '../../utils/use-constant.mjs';\nimport { useIsomorphicLayoutEffect } from '../../utils/use-isomorphic-effect.mjs';\nimport { animationControls } from './animation-controls.mjs';\n\n/**\n * Creates `LegacyAnimationControls`, which can be used to manually start, stop\n * and sequence animations on one or more components.\n *\n * The returned `LegacyAnimationControls` should be passed to the `animate` property\n * of the components you want to animate.\n *\n * These components can then be animated with the `start` method.\n *\n * ```jsx\n * import * as React from 'react'\n * import { motion, useAnimation } from 'framer-motion'\n *\n * export function MyComponent(props) {\n * const controls = useAnimation()\n *\n * controls.start({\n * x: 100,\n * transition: { duration: 0.5 },\n * })\n *\n * return <motion.div animate={controls} />\n * }\n * ```\n *\n * @returns Animation controller with `start` and `stop` methods\n *\n * @public\n */\nfunction useAnimationControls() {\n const controls = useConstant(animationControls);\n useIsomorphicLayoutEffect(controls.mount, []);\n return controls;\n}\nconst useAnimation = useAnimationControls;\n\nexport { useAnimation, useAnimationControls };\n","import { useSyncExternalStore } from 'react'\n\nexport function makeMediaQueryStore(\n\tmediaQuery: string,\n\tserverSnapshot: boolean,\n) {\n\tfunction getSnapshot() {\n\t\treturn window.matchMedia(mediaQuery).matches\n\t}\n\n\tfunction subscribe(callback: () => void) {\n\t\tconst mediaQueryList = window.matchMedia(mediaQuery)\n\t\tmediaQueryList.addEventListener('change', callback)\n\t\treturn () => {\n\t\t\tmediaQueryList.removeEventListener('change', callback)\n\t\t}\n\t}\n\n\treturn function useMediaQuery() {\n\t\treturn useSyncExternalStore(subscribe, getSnapshot, () => serverSnapshot)\n\t}\n}\n","\"use client\";\n\n// src/dialog.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContext, createContextScope } from \"@radix-ui/react-context\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { FocusScope } from \"@radix-ui/react-focus-scope\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useFocusGuards } from \"@radix-ui/react-focus-guards\";\nimport { RemoveScroll } from \"react-remove-scroll\";\nimport { hideOthers } from \"aria-hidden\";\nimport { createSlot } from \"@radix-ui/react-slot\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nvar DIALOG_NAME = \"Dialog\";\nvar [createDialogContext, createDialogScope] = createContextScope(DIALOG_NAME);\nvar [DialogProvider, useDialogContext] = createDialogContext(DIALOG_NAME);\nvar Dialog = (props) => {\n const {\n __scopeDialog,\n children,\n open: openProp,\n defaultOpen,\n onOpenChange,\n modal = true\n } = props;\n const triggerRef = React.useRef(null);\n const contentRef = React.useRef(null);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: DIALOG_NAME\n });\n return /* @__PURE__ */ jsx(\n DialogProvider,\n {\n scope: __scopeDialog,\n triggerRef,\n contentRef,\n contentId: useId(),\n titleId: useId(),\n descriptionId: useId(),\n open,\n onOpenChange: setOpen,\n onOpenToggle: React.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]),\n modal,\n children\n }\n );\n};\nDialog.displayName = DIALOG_NAME;\nvar TRIGGER_NAME = \"DialogTrigger\";\nvar DialogTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...triggerProps } = props;\n const context = useDialogContext(TRIGGER_NAME, __scopeDialog);\n const composedTriggerRef = useComposedRefs(forwardedRef, context.triggerRef);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": context.open,\n \"aria-controls\": context.contentId,\n \"data-state\": getState(context.open),\n ...triggerProps,\n ref: composedTriggerRef,\n onClick: composeEventHandlers(props.onClick, context.onOpenToggle)\n }\n );\n }\n);\nDialogTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"DialogPortal\";\nvar [PortalProvider, usePortalContext] = createDialogContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar DialogPortal = (props) => {\n const { __scopeDialog, forceMount, children, container } = props;\n const context = useDialogContext(PORTAL_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopeDialog, forceMount, children: React.Children.map(children, (child) => /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, container, children: child }) })) });\n};\nDialogPortal.displayName = PORTAL_NAME;\nvar OVERLAY_NAME = \"DialogOverlay\";\nvar DialogOverlay = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(OVERLAY_NAME, props.__scopeDialog);\n const { forceMount = portalContext.forceMount, ...overlayProps } = props;\n const context = useDialogContext(OVERLAY_NAME, props.__scopeDialog);\n return context.modal ? /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(DialogOverlayImpl, { ...overlayProps, ref: forwardedRef }) }) : null;\n }\n);\nDialogOverlay.displayName = OVERLAY_NAME;\nvar Slot = createSlot(\"DialogOverlay.RemoveScroll\");\nvar DialogOverlayImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...overlayProps } = props;\n const context = useDialogContext(OVERLAY_NAME, __scopeDialog);\n return (\n // Make sure `Content` is scrollable even when it doesn't live inside `RemoveScroll`\n // ie. when `Overlay` and `Content` are siblings\n /* @__PURE__ */ jsx(RemoveScroll, { as: Slot, allowPinchZoom: true, shards: [context.contentRef], children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": getState(context.open),\n ...overlayProps,\n ref: forwardedRef,\n style: { pointerEvents: \"auto\", ...overlayProps.style }\n }\n ) })\n );\n }\n);\nvar CONTENT_NAME = \"DialogContent\";\nvar DialogContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeDialog);\n const { forceMount = portalContext.forceMount, ...contentProps } = props;\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: context.modal ? /* @__PURE__ */ jsx(DialogContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(DialogContentNonModal, { ...contentProps, ref: forwardedRef }) });\n }\n);\nDialogContent.displayName = CONTENT_NAME;\nvar DialogContentModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, context.contentRef, contentRef);\n React.useEffect(() => {\n const content = contentRef.current;\n if (content) return hideOthers(content);\n }, []);\n return /* @__PURE__ */ jsx(\n DialogContentImpl,\n {\n ...props,\n ref: composedRefs,\n trapFocus: context.open,\n disableOutsidePointerEvents: true,\n onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {\n event.preventDefault();\n context.triggerRef.current?.focus();\n }),\n onPointerDownOutside: composeEventHandlers(props.onPointerDownOutside, (event) => {\n const originalEvent = event.detail.originalEvent;\n const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;\n const isRightClick = originalEvent.button === 2 || ctrlLeftClick;\n if (isRightClick) event.preventDefault();\n }),\n onFocusOutside: composeEventHandlers(\n props.onFocusOutside,\n (event) => event.preventDefault()\n )\n }\n );\n }\n);\nvar DialogContentNonModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n const hasInteractedOutsideRef = React.useRef(false);\n const hasPointerDownOutsideRef = React.useRef(false);\n return /* @__PURE__ */ jsx(\n DialogContentImpl,\n {\n ...props,\n ref: forwardedRef,\n trapFocus: false,\n disableOutsidePointerEvents: false,\n onCloseAutoFocus: (event) => {\n props.onCloseAutoFocus?.(event);\n if (!event.defaultPrevented) {\n if (!hasInteractedOutsideRef.current) context.triggerRef.current?.focus();\n event.preventDefault();\n }\n hasInteractedOutsideRef.current = false;\n hasPointerDownOutsideRef.current = false;\n },\n onInteractOutside: (event) => {\n props.onInteractOutside?.(event);\n if (!event.defaultPrevented) {\n hasInteractedOutsideRef.current = true;\n if (event.detail.originalEvent.type === \"pointerdown\") {\n hasPointerDownOutsideRef.current = true;\n }\n }\n const target = event.target;\n const targetIsTrigger = context.triggerRef.current?.contains(target);\n if (targetIsTrigger) event.preventDefault();\n if (event.detail.originalEvent.type === \"focusin\" && hasPointerDownOutsideRef.current) {\n event.preventDefault();\n }\n }\n }\n );\n }\n);\nvar DialogContentImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, trapFocus, onOpenAutoFocus, onCloseAutoFocus, ...contentProps } = props;\n const context = useDialogContext(CONTENT_NAME, __scopeDialog);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, contentRef);\n useFocusGuards();\n return /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n FocusScope,\n {\n asChild: true,\n loop: true,\n trapped: trapFocus,\n onMountAutoFocus: onOpenAutoFocus,\n onUnmountAutoFocus: onCloseAutoFocus,\n children: /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n role: \"dialog\",\n id: context.contentId,\n \"aria-describedby\": context.descriptionId,\n \"aria-labelledby\": context.titleId,\n \"data-state\": getState(context.open),\n ...contentProps,\n ref: composedRefs,\n onDismiss: () => context.onOpenChange(false)\n }\n )\n }\n ),\n /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(TitleWarning, { titleId: context.titleId }),\n /* @__PURE__ */ jsx(DescriptionWarning, { contentRef, descriptionId: context.descriptionId })\n ] })\n ] });\n }\n);\nvar TITLE_NAME = \"DialogTitle\";\nvar DialogTitle = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...titleProps } = props;\n const context = useDialogContext(TITLE_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(Primitive.h2, { id: context.titleId, ...titleProps, ref: forwardedRef });\n }\n);\nDialogTitle.displayName = TITLE_NAME;\nvar DESCRIPTION_NAME = \"DialogDescription\";\nvar DialogDescription = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...descriptionProps } = props;\n const context = useDialogContext(DESCRIPTION_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(Primitive.p, { id: context.descriptionId, ...descriptionProps, ref: forwardedRef });\n }\n);\nDialogDescription.displayName = DESCRIPTION_NAME;\nvar CLOSE_NAME = \"DialogClose\";\nvar DialogClose = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...closeProps } = props;\n const context = useDialogContext(CLOSE_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n ...closeProps,\n ref: forwardedRef,\n onClick: composeEventHandlers(props.onClick, () => context.onOpenChange(false))\n }\n );\n }\n);\nDialogClose.displayName = CLOSE_NAME;\nfunction getState(open) {\n return open ? \"open\" : \"closed\";\n}\nvar TITLE_WARNING_NAME = \"DialogTitleWarning\";\nvar [WarningProvider, useWarningContext] = createContext(TITLE_WARNING_NAME, {\n contentName: CONTENT_NAME,\n titleName: TITLE_NAME,\n docsSlug: \"dialog\"\n});\nvar TitleWarning = ({ titleId }) => {\n const titleWarningContext = useWarningContext(TITLE_WARNING_NAME);\n const MESSAGE = `\\`${titleWarningContext.contentName}\\` requires a \\`${titleWarningContext.titleName}\\` for the component to be accessible for screen reader users.\n\nIf you want to hide the \\`${titleWarningContext.titleName}\\`, you can wrap it with our VisuallyHidden component.\n\nFor more information, see https://radix-ui.com/primitives/docs/components/${titleWarningContext.docsSlug}`;\n React.useEffect(() => {\n if (titleId) {\n const hasTitle = document.getElementById(titleId);\n if (!hasTitle) console.error(MESSAGE);\n }\n }, [MESSAGE, titleId]);\n return null;\n};\nvar DESCRIPTION_WARNING_NAME = \"DialogDescriptionWarning\";\nvar DescriptionWarning = ({ contentRef, descriptionId }) => {\n const descriptionWarningContext = useWarningContext(DESCRIPTION_WARNING_NAME);\n const MESSAGE = `Warning: Missing \\`Description\\` or \\`aria-describedby={undefined}\\` for {${descriptionWarningContext.contentName}}.`;\n React.useEffect(() => {\n const describedById = contentRef.current?.getAttribute(\"aria-describedby\");\n if (descriptionId && describedById) {\n const hasDescription = document.getElementById(descriptionId);\n if (!hasDescription) console.warn(MESSAGE);\n }\n }, [MESSAGE, contentRef, descriptionId]);\n return null;\n};\nvar Root = Dialog;\nvar Trigger = DialogTrigger;\nvar Portal = DialogPortal;\nvar Overlay = DialogOverlay;\nvar Content = DialogContent;\nvar Title = DialogTitle;\nvar Description = DialogDescription;\nvar Close = DialogClose;\nexport {\n Close,\n Content,\n Description,\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n Overlay,\n Portal,\n Root,\n Title,\n Trigger,\n WarningProvider,\n createDialogScope\n};\n//# sourceMappingURL=index.mjs.map\n","import * as DialogPrimitive from '@radix-ui/react-dialog'\nimport * as React from 'react'\nimport { cn } from '#app/utils/misc.tsx'\nimport { Icon } from '../icons'\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nfunction DialogOverlay({\n\tclassName,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n\treturn (\n\t\t<DialogPrimitive.Overlay\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nfunction DialogContent({\n\tclassName,\n\tchildren,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Content>) {\n\treturn (\n\t\t<DialogPortal>\n\t\t\t<DialogOverlay />\n\t\t\t<DialogPrimitive.Content\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t<DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity data-[state=open]:bg-accent data-[state=open]:text-muted-foreground hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none\">\n\t\t\t\t\t<Icon name=\"Close\" />\n\t\t\t\t\t<span className=\"sr-only\">Close</span>\n\t\t\t\t</DialogPrimitive.Close>\n\t\t\t</DialogPrimitive.Content>\n\t\t</DialogPortal>\n\t)\n}\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nfunction DialogHeader({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'flex flex-col space-y-1.5 text-center sm:text-left',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogHeader.displayName = 'DialogHeader'\n\nfunction DialogFooter({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogFooter.displayName = 'DialogFooter'\n\nfunction DialogTitle({\n\tclassName,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n\treturn (\n\t\t<DialogPrimitive.Title\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'text-lg font-semibold leading-none tracking-tight',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nfunction DialogDescription({\n\tclassName,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n\treturn (\n\t\t<DialogPrimitive.Description\n\t\t\tref={ref}\n\t\t\tclassName={cn('text-sm text-muted-foreground', className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n\tDialog,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogOverlay,\n\tDialogPortal,\n\tDialogTitle,\n\tDialogTrigger,\n}\n","import {\n\textractNumbersAndTypeFromAppNameOrPath,\n\tgetExercises,\n\tgetPlaygroundAppName,\n} from '@epic-web/workshop-utils/apps.server'\nimport { getWorkshopConfig } from '@epic-web/workshop-utils/config.server'\nimport {\n\tcombineServerTimings,\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport { clsx } from 'clsx'\nimport { motion, useAnimationControls } from 'framer-motion'\nimport * as React from 'react'\nimport {\n\tLink,\n\tNavLink,\n\tOutlet,\n\tuseLoaderData,\n\tuseParams,\n\tdata,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n} from 'react-router'\nimport { useHydrated } from 'remix-utils/use-hydrated'\nimport { Icon } from '#app/components/icons.tsx'\nimport { makeMediaQueryStore } from '#app/components/media-query.ts'\nimport { Logo } from '#app/components/product.tsx'\nimport { useRevalidationWS } from '#app/components/revalidation-ws.js'\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogHeader,\n\tDialogTrigger,\n} from '#app/components/ui/dialog.js'\nimport {\n\tSimpleTooltip,\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from '#app/components/ui/tooltip.tsx'\nimport { useOptionalUser, useUserHasAccess } from '#app/components/user.tsx'\nimport { useWorkshopConfig } from '#app/components/workshop-config.js'\nimport { cn, getExercisePath, getExerciseStepPath } from '#app/utils/misc.tsx'\nimport { useIsOnline } from '#app/utils/online.ts'\nimport { usePresence, type User } from '#app/utils/presence.tsx'\nimport {\n\tuseExerciseProgressClassName,\n\tuseNextExerciseRoute,\n\tuseProgressItemClassName,\n\ttype ProgressItemSearch,\n} from '../progress.tsx'\nimport { ThemeSwitch } from '../theme/index.tsx'\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('appLayoutLoader')\n\tconst { title: workshopTitle } = getWorkshopConfig()\n\tconst [exercises, playgroundAppName] = await Promise.all([\n\t\tgetExercises({ request, timings }),\n\t\tgetPlaygroundAppName(),\n\t])\n\n\tconst playgroundNumbersAndType = extractNumbersAndTypeFromAppNameOrPath(\n\t\tplaygroundAppName ?? '',\n\t)\n\tconst playground = {\n\t\tappName: playgroundAppName,\n\t\texerciseNumber: Number(playgroundNumbersAndType?.exerciseNumber),\n\t\tstepNumber: Number(playgroundNumbersAndType?.stepNumber),\n\t\ttype: playgroundNumbersAndType?.type,\n\t}\n\n\tconst result = data(\n\t\t{\n\t\t\tworkshopTitle,\n\t\t\texercises: exercises.map((e) => ({\n\t\t\t\texerciseNumber: e.exerciseNumber,\n\t\t\t\ttitle: e.title,\n\t\t\t\tsolutions: e.solutions.map(({ stepNumber, title, name }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle,\n\t\t\t\t\tname,\n\t\t\t\t})),\n\t\t\t\tproblems: e.problems.map(({ stepNumber, title, name }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle,\n\t\t\t\t\tname,\n\t\t\t\t})),\n\t\t\t\tsteps: e.steps.map(({ stepNumber, problem, solution }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle: problem?.title ?? solution?.title ?? 'Unknown',\n\t\t\t\t\tname: problem?.name ?? solution?.name ?? 'Unknown',\n\t\t\t\t\tproblem: problem\n\t\t\t\t\t\t? { name: problem.name, title: problem.title }\n\t\t\t\t\t\t: null,\n\t\t\t\t\tsolution: solution\n\t\t\t\t\t\t? { name: solution.name, title: solution.title }\n\t\t\t\t\t\t: null,\n\t\t\t\t})),\n\t\t\t})),\n\t\t\tplayground,\n\t\t\tisMenuOpened:\n\t\t\t\trequest.headers.get('cookie')?.includes('es_menu_open=true') ?? false,\n\t\t},\n\t\t{\n\t\t\theaders: {\n\t\t\t\tVary: 'Cookie',\n\t\t\t\t'Server-Timing': getServerTimeHeader(timings),\n\t\t\t},\n\t\t},\n\t)\n\treturn result\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders, parentHeaders }) => {\n\tconst headers = {\n\t\t'Cache-Control': loaderHeaders.get('Cache-Control') ?? '',\n\t\tVary: 'Cookie',\n\t\t'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nconst opacities = ['opacity-70', 'opacity-80', 'opacity-90', 'opacity-100']\nconst shadows = [\n\t'shadow-[0_0_2px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_4px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_7px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_10px_0_rgba(0,0,0,0.3)]',\n]\nfunction getScoreClassNames(score: number) {\n\tconst opacityNumber = Math.round(score * opacities.length - 1)\n\tconst shadowNumber = Math.round(score * shadows.length - 1)\n\treturn cn(\n\t\t'shadow-purple-700 hover:opacity-100 focus:opacity-100 dark:shadow-purple-200',\n\t\topacities[opacityNumber] ?? 'opacity-60',\n\t\tshadows[shadowNumber] ?? 'shadow-none',\n\t\tscore === 1 ? 'animate-pulse hover:animate-none focus:animate-none' : null,\n\t)\n}\n\nfunction FacePile({ isMenuOpened }: { isMenuOpened: boolean }) {\n\tconst loggedInUser = useOptionalUser()\n\tconst { users } = usePresence()\n\tconst {\n\t\tproduct: { displayNameShort },\n\t} = useWorkshopConfig()\n\tconst limit = isMenuOpened ? 17 : 0\n\tconst numberOverLimit = users.length - limit\n\tconst shouldShowNumberOverLimit = numberOverLimit > (isMenuOpened ? 1 : 0)\n\n\tif (!users.length) return null\n\n\tconst tiffany =\n\t\tisMenuOpened && users.length === 1 ? (\n\t\t\t<Link\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\tto=\"https://www.youtube.com/watch?v=w6Q3mHyzn78\"\n\t\t\t>\n\t\t\t\t<img\n\t\t\t\t\talt=\"Tiffany Tunes\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'h-8 w-8 rounded-full border object-cover',\n\t\t\t\t\t\tgetScoreClassNames(1),\n\t\t\t\t\t)}\n\t\t\t\t\tsrc=\"/img/tiffany.png\"\n\t\t\t\t/>\n\t\t\t</Link>\n\t\t) : null\n\tconst overLimitLabel = `${numberOverLimit}${\n\t\tisMenuOpened ? ' more ' : ' '\n\t}${displayNameShort} Dev${numberOverLimit === 1 ? '' : 's'} working now`\n\treturn (\n\t\t<div className=\"flex flex-wrap items-center gap-2\">\n\t\t\t<TooltipProvider>\n\t\t\t\t{(shouldShowNumberOverLimit ? users.slice(0, limit) : users).map(\n\t\t\t\t\t({ user, score }) => {\n\t\t\t\t\t\tconst scoreClassNames = getScoreClassNames(score)\n\t\t\t\t\t\tconst locationLabel = getLocationLabel(user.location)\n\t\t\t\t\t\tconst imageUrl = user.imageUrlSmall || user.avatarUrl\n\t\t\t\t\t\tconst hasAccess = user.hasAccess\n\t\t\t\t\t\tconst local = user.location?.origin?.includes('localhost')\n\n\t\t\t\t\t\tlet doingLabel: string\n\t\t\t\t\t\tif (hasAccess) {\n\t\t\t\t\t\t\tdoingLabel = local ? 'working' : 'referencing'\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdoingLabel = local ? 'previewing' : 'reviewing'\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Tooltip key={user.id}>\n\t\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t\t{imageUrl ? (\n\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\t\t\t\talt={user.name || displayNameShort}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'h-8 w-8 rounded-full border object-cover',\n\t\t\t\t\t\t\t\t\t\t\t\tscoreClassNames,\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\tsrc={imageUrl}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\t\t\t\taria-label={user.name || `${displayNameShort} Dev`}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'flex h-8 w-8 items-center justify-center rounded-full border',\n\t\t\t\t\t\t\t\t\t\t\t\tscoreClassNames,\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Icon name=\"User\" />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t\t\t<span className=\"flex flex-col items-center justify-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t{user.name || `${displayNameShort} Dev`}{' '}\n\t\t\t\t\t\t\t\t\t\t\t{locationLabel\n\t\t\t\t\t\t\t\t\t\t\t\t? ` is ${doingLabel} ${\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tscore === 1 && loggedInUser?.id !== user.id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'with you'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t\t\t\t\t\t\t\t} on`\n\t\t\t\t\t\t\t\t\t\t\t\t: null}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t{locationLabel?.line1 ? (\n\t\t\t\t\t\t\t\t\t\t\t<span>{locationLabel.line1}</span>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t{locationLabel?.line2 ? (\n\t\t\t\t\t\t\t\t\t\t\t<span>{locationLabel.line2}</span>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t)}\n\t\t\t\t{tiffany}\n\t\t\t\t{shouldShowNumberOverLimit ? (\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\taria-label={overLimitLabel}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex items-center justify-center rounded-full border bg-accent text-xs text-accent-foreground',\n\t\t\t\t\t\t\t\t\tisMenuOpened ? 'h-8 w-8' : 'h-6 w-6',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'pointer-events-none overflow-hidden text-ellipsis whitespace-nowrap text-center',\n\t\t\t\t\t\t\t\t\t\tisMenuOpened ? 'w-8' : 'w-6',\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{isMenuOpened ? `+${numberOverLimit}` : numberOverLimit}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>{overLimitLabel}</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t) : null}\n\t\t\t</TooltipProvider>\n\t\t</div>\n\t)\n}\n\nconst useIsWide = makeMediaQueryStore('(min-width: 640px)', true)\n\nexport default function App() {\n\tconst data = useLoaderData<typeof loader>()\n\tconst user = useOptionalUser()\n\tconst isWide = useIsWide()\n\tconst isHydrated = useHydrated()\n\n\tconst [isMenuOpened, setMenuOpenedState] = React.useState(data.isMenuOpened)\n\tuseRevalidationWS({ watchPaths: ['./exercises/README.mdx'] })\n\n\tfunction setMenuOpened(value: boolean) {\n\t\tsetMenuOpenedState(value)\n\t\tdocument.cookie = `es_menu_open=${value.toString()}; path=/; SameSite=Lax;`\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col\">\n\t\t\t{user ? null : <NoUserBanner />}\n\t\t\t{/*\n\t\t\t\tthis isn't placed in a conditional with isWide because the server render\n\t\t\t\tdoesn't know whether it should be around or not so we just use CSS to hide it\n\t\t\t\tif it's not supposed to show up.\n\n\t\t\t\tWe don't just use media queries for the wider screen nav because we want\n\t\t\t\tto avoid running all the logic in there unnecessarily.\n\t\t\t*/}\n\t\t\t{isHydrated && isWide ? null : (\n\t\t\t\t<MobileNavigation\n\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\tonMenuOpenChange={setMenuOpened}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<div\n\t\t\t\t// this nonsense is here because we want the panels to be scrollable rather\n\t\t\t\t// than having the entire page be scrollable (at least on wider screens)\n\t\t\t\tclassName={cn('flex flex-grow flex-col sm:flex-row', {\n\t\t\t\t\t'h-[calc(100vh-128px-env(safe-area-inset-top)-env(safe-area-inset-bottom))] sm:h-[calc(100vh-64px-env(safe-area-inset-top)-env(safe-area-inset-bottom))]':\n\t\t\t\t\t\t!user,\n\t\t\t\t\t'h-[calc(100vh-64px-env(safe-area-inset-top)-env(safe-area-inset-bottom))] sm:h-[calc(100vh-env(safe-area-inset-top)-env(safe-area-inset-bottom))]':\n\t\t\t\t\t\tuser,\n\t\t\t\t\t'h-[unset]': !isWide && isMenuOpened,\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t{isWide ? (\n\t\t\t\t\t<Navigation\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tonMenuOpenChange={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'h-full w-full max-w-full sm:max-w-[calc(100%-56px)]',\n\t\t\t\t\t\tisMenuOpened ? 'hidden md:block' : '',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Outlet />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction getLocationLabel(location: User['location']) {\n\tif (!location) return null\n\n\tconst { exercise } = location\n\n\tconst exercisePortion = [\n\t\texercise\n\t\t\t? [exercise.exerciseNumber, exercise.stepNumber]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.map((s) => s.toString().padStart(2, '0'))\n\t\t\t\t\t.join('/')\n\t\t\t: null,\n\t\texercise?.type,\n\t]\n\t\t.filter(Boolean)\n\t\t.join(' - ')\n\treturn { line1: location.workshopTitle, line2: exercisePortion }\n}\n\nfunction NoUserBanner() {\n\tconst isWide = useIsWide()\n\tconst {\n\t\tproduct: { host, displayName },\n\t} = useWorkshopConfig()\n\tconst userHasAccess = useUserHasAccess()\n\tconst details = (\n\t\t<div>\n\t\t\t{ENV.EPICSHOP_DEPLOYED ? (\n\t\t\t\t<div>\n\t\t\t\t\t{`This is the deployed version. `}\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tto={ENV.EPICSHOP_GITHUB_REPO}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tRun locally\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t{` for full experience.`}\n\t\t\t\t\t</>{' '}\n\t\t\t\t</div>\n\t\t\t) : userHasAccess ? (\n\t\t\t\t<div>\n\t\t\t\t\t<Link to=\"/login\" className=\"underline\">\n\t\t\t\t\t\tLogin\n\t\t\t\t\t</Link>{' '}\n\t\t\t\t\tor{' '}\n\t\t\t\t\t<a href={`https://${host}/login`} className=\"underline\">\n\t\t\t\t\t\tjoin for free\n\t\t\t\t\t</a>{' '}\n\t\t\t\t\tfor the full experience.\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</div>\n\t)\n\treturn (\n\t\t<div className=\"z-10 flex h-16 items-center justify-between border-b bg-gradient-to-tr from-blue-500 to-indigo-500 pl-4 text-white\">\n\t\t\t{isWide ? (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"hidden flex-1 flex-wrap items-center gap-4 sm:flex\">\n\t\t\t\t\t\t<Logo size=\"lg\" style=\"monochrome\" />\n\t\t\t\t\t\t<div className=\"flex flex-1 flex-wrap items-center\">\n\t\t\t\t\t\t\t<p className=\"mr-2\">\n\t\t\t\t\t\t\t\tWelcome to the{' '}\n\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\tto={`https://${host}`}\n\t\t\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t</Link>{' '}\n\t\t\t\t\t\t\t\tWorkshop app!\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t{details}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t{userHasAccess ? null : (\n\t\t\t\t\t\t<div className=\"hidden h-full flex-col items-center sm:flex md:flex-row\">\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={`https://${host}`}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Join {displayName}</span>\n\t\t\t\t\t\t\t\t<span>ā†—ļøŽ</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={ENV.EPICSHOP_DEPLOYED ? `https://${host}/login` : '/login'}\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 bg-white/20 px-5 text-sm font-semibold shadow-md transition hover:bg-white/30\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"User\" size=\"lg\" />\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Login</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"flex flex-1 flex-wrap items-center gap-4 sm:hidden\">\n\t\t\t\t\t\t<a href={`https://${host}`}>\n\t\t\t\t\t\t\t<Logo size=\"lg\" style=\"monochrome\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<Dialog>\n\t\t\t\t\t\t\t<DialogTrigger>\n\t\t\t\t\t\t\t\t<Icon name=\"Question\" size=\"lg\" className=\"animate-pulse\" />\n\t\t\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t\t\t<DialogContent>\n\t\t\t\t\t\t\t\t<DialogHeader>\n\t\t\t\t\t\t\t\t\t<Logo size=\"lg\" style=\"monochrome\" />\n\t\t\t\t\t\t\t\t\t<span className=\"text-lg font-semibold\">{displayName}</span>\n\t\t\t\t\t\t\t\t</DialogHeader>\n\t\t\t\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\t\t\t\tWelcome to the{' '}\n\t\t\t\t\t\t\t\t\t<Link to={`https://${host}`} className=\"underline\">\n\t\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t\t</Link>{' '}\n\t\t\t\t\t\t\t\t\tWorkshop app!\n\t\t\t\t\t\t\t\t</DialogDescription>\n\t\t\t\t\t\t\t\t{details}\n\t\t\t\t\t\t\t</DialogContent>\n\t\t\t\t\t\t</Dialog>\n\t\t\t\t\t</div>\n\t\t\t\t\t{userHasAccess ? null : (\n\t\t\t\t\t\t<div className=\"flex h-full items-center\">\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={`https://${host}`}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Join</span>\n\t\t\t\t\t\t\t\t<span>ā†—ļøŽ</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={ENV.EPICSHOP_DEPLOYED ? `https://${host}/login` : '/login'}\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 bg-white/20 px-5 text-sm font-semibold shadow-md transition hover:bg-white/30\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"User\" size=\"lg\" />\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Login</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\nconst itemVariants = {\n\thidden: { opacity: 0, x: -20 },\n\tvisible: { opacity: 1, x: 0 },\n}\nfunction NavigationExerciseListItem({\n\texerciseNumber,\n\tchildren,\n}: {\n\texerciseNumber: number\n\tchildren: React.ReactNode\n}) {\n\tconst progressClassName = useExerciseProgressClassName(exerciseNumber)\n\treturn (\n\t\t<motion.li\n\t\t\tvariants={itemVariants}\n\t\t\tclassName={cn(\n\t\t\t\t// add gap of 3 to children, but using padding so the progress extends through the whole height\n\t\t\t\t'py-[6px] first:pt-3 last:pb-3',\n\t\t\t\tprogressClassName ? `${progressClassName} before:border-t` : null,\n\t\t\t)}\n\t\t>\n\t\t\t<span className=\"inline-block pl-2\">{children}</span>\n\t\t</motion.li>\n\t)\n}\n\nfunction NavigationExerciseStepListItem({\n\tchildren,\n\t...progressItemSearch\n}: {\n\tchildren: React.ReactNode\n} & ProgressItemSearch) {\n\tconst progressClassName = useProgressItemClassName(progressItemSearch)\n\treturn (\n\t\t<motion.li\n\t\t\tvariants={itemVariants}\n\t\t\tclassName={cn(\n\t\t\t\t// add gap of 3 to children, but using padding so the progress extends through the whole height\n\t\t\t\t'py-[6px] first:pt-3 last:pb-3',\n\t\t\t\tprogressClassName ? `${progressClassName} before:border-t` : null,\n\t\t\t)}\n\t\t>\n\t\t\t<span className=\"inline-block pl-2\">{children}</span>\n\t\t</motion.li>\n\t)\n}\n\nfunction MobileNavigation({\n\tisMenuOpened,\n\tonMenuOpenChange: setMenuOpened,\n}: {\n\tisMenuOpened: boolean\n\tonMenuOpenChange: (change: boolean) => void\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tconst user = useOptionalUser()\n\tconst nextExerciseRoute = useNextExerciseRoute()\n\tconst params = useParams()\n\tconst isOnline = useIsOnline()\n\tconst { users } = usePresence()\n\n\t// items\n\tconst listVariants = {\n\t\tvisible: {\n\t\t\topacity: 1,\n\t\t\ttransition: {\n\t\t\t\tduration: 0.05,\n\t\t\t\twhen: 'beforeChildren',\n\t\t\t\tstaggerChildren: 0.03,\n\t\t\t},\n\t\t},\n\t\thidden: {\n\t\t\topacity: 0,\n\t\t},\n\t}\n\n\treturn (\n\t\t<nav className=\"flex w-full border-b sm:hidden\">\n\t\t\t<div className=\"w-full\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn('flex items-center', {\n\t\t\t\t\t\t'flex-col': isMenuOpened,\n\t\t\t\t\t\t'h-14': !isMenuOpened,\n\t\t\t\t\t})}\n\t\t\t\t>\n\t\t\t\t\t<NavToggle\n\t\t\t\t\t\ttitle={data.workshopTitle}\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tsetMenuOpened={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t\t{isMenuOpened && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tclassName=\"flex w-full flex-grow flex-col justify-between overflow-x-auto p-6 scrollbar-thin scrollbar-thumb-scrollbar\"\n\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\tclassName=\"flex flex-col\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\tto=\"/\"\n\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-2xl font-bold outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tHome\n\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{data.exercises.map(({ exerciseNumber, title, steps }) => {\n\t\t\t\t\t\t\t\t\tconst isActive =\n\t\t\t\t\t\t\t\t\t\tNumber(params.exerciseNumber) === exerciseNumber\n\t\t\t\t\t\t\t\t\tconst showPlayground =\n\t\t\t\t\t\t\t\t\t\t!isActive &&\n\t\t\t\t\t\t\t\t\t\tdata.playground.exerciseNumber === exerciseNumber\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<NavigationExerciseListItem\n\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-1 text-2xl font-bold\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t{showPlayground ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.exerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.stepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.type,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tšŸ›\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t{isActive ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"ml-4 mt-2 flex flex-col\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"instructions\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-xl font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t!params.stepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tIntro\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{steps\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.map(({ stepNumber, title, problem, solution }) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"step\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col gap-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"font-semibold leading-tight\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{stepNumber.toString().padStart(2, '0')}.{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"ml-3 mt-0.5 flex gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'problem',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProblem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' šŸ›'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'solution',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSolution\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' šŸ›'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"finished\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber, 'finished')}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-base font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background': isActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tšŸ“ Elaboration\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</NavigationExerciseListItem>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t<div className=\"mt-6\">\n\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\tto=\"/finished\"\n\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap text-lg font-bold outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'bg-black text-white after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"]':\n\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tšŸ“ Workshop Feedback\n\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"flex-grow\" />\n\t\t\t\t\t{isOnline ? null : (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'You are offline'}>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex h-14 animate-pulse items-center justify-start p-4',\n\t\t\t\t\t\t\t\t\tisMenuOpened ? 'w-full border-t' : 'border-l',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\tname=\"WifiNoConnection\"\n\t\t\t\t\t\t\t\t\tclassName=\"text-foreground-destructive\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{isMenuOpened ? 'You are offline' : null}\n\t\t\t\t\t\t\t\t</Icon>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t)}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex items-center justify-start p-4',\n\t\t\t\t\t\t\tisMenuOpened && users.length > 4 ? 'min-h-14' : 'h-14',\n\t\t\t\t\t\t\tisMenuOpened ? 'w-full border-t' : 'border-l',\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<FacePile isMenuOpened={isMenuOpened} />\n\t\t\t\t\t</div>\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user ? (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'Your account'}>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex h-14 flex-shrink-0 items-center justify-start space-x-3 px-4 py-4 text-center no-underline hover:underline',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t'border-l': !isMenuOpened,\n\t\t\t\t\t\t\t\t\t\t'w-full border-t': isMenuOpened,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tto=\"/account\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{user.imageUrlSmall ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\talt={user.name ?? user.email}\n\t\t\t\t\t\t\t\t\t\tsrc={user.imageUrlSmall}\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-full rounded-full\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<Icon name=\"User\" className=\"flex-shrink-0\" size=\"lg\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tYour Account\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Your account</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user && nextExerciseRoute ? (\n\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\tcontent={isMenuOpened ? null : 'Continue to next lesson'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={nextExerciseRoute}\n\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'flex h-14 w-full items-center space-x-3 border-l px-4 py-4 pl-[18px] no-underline hover:underline',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstate={{ from: 'continue next lesson button' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"FastForward\" className=\"flex-shrink-0\" size=\"md\" />\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tContinue to next lesson\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Continue to next lesson</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex h-14 w-14 items-center justify-center self-start p-4 sm:mb-4 sm:w-full',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t'w-full border-t': isMenuOpened,\n\t\t\t\t\t\t\t\t'border-l': !isMenuOpened,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ThemeSwitch />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</nav>\n\t)\n}\n\nconst OPENED_MENU_WIDTH = 400\n\nfunction Navigation({\n\tisMenuOpened,\n\tonMenuOpenChange: setMenuOpened,\n}: {\n\tisMenuOpened: boolean\n\tonMenuOpenChange: (change: boolean) => void\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tconst user = useOptionalUser()\n\tconst nextExerciseRoute = useNextExerciseRoute()\n\tconst params = useParams()\n\tconst isOnline = useIsOnline()\n\tconst { users } = usePresence()\n\n\tconst exercise = data.exercises.find(\n\t\t(e) => e.exerciseNumber === Number(params.exerciseNumber),\n\t)\n\tconst app =\n\t\tparams.type === 'solution'\n\t\t\t? exercise?.solutions.find(\n\t\t\t\t\t(s) => s.stepNumber === Number(params.stepNumber),\n\t\t\t\t)\n\t\t\t: params.type === 'problem'\n\t\t\t\t? exercise?.problems.find(\n\t\t\t\t\t\t(p) => p.stepNumber === Number(params.stepNumber),\n\t\t\t\t\t)\n\t\t\t\t: null\n\n\t// container\n\tconst menuControls = useAnimationControls()\n\tconst menuVariants = {\n\t\tclose: { width: 56 },\n\t\topen: { width: OPENED_MENU_WIDTH },\n\t}\n\n\t// items\n\tconst listVariants = {\n\t\tvisible: {\n\t\t\topacity: 1,\n\t\t\ttransition: {\n\t\t\t\tduration: 0.05,\n\t\t\t\twhen: 'beforeChildren',\n\t\t\t\tstaggerChildren: 0.03,\n\t\t\t},\n\t\t},\n\t\thidden: {\n\t\t\topacity: 0,\n\t\t},\n\t}\n\n\treturn (\n\t\t<nav className=\"hidden border-r sm:flex\">\n\t\t\t<motion.div\n\t\t\t\tinitial={isMenuOpened ? 'open' : 'close'}\n\t\t\t\tvariants={menuVariants}\n\t\t\t\tanimate={menuControls}\n\t\t\t>\n\t\t\t\t<div className=\"flex h-full flex-col items-center justify-between\">\n\t\t\t\t\t<NavToggle\n\t\t\t\t\t\ttitle={data.workshopTitle}\n\t\t\t\t\t\tmenuControls={menuControls}\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tsetMenuOpened={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t\t{isMenuOpened && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tstyle={{ width: OPENED_MENU_WIDTH }}\n\t\t\t\t\t\t\tclassName=\"flex flex-grow flex-col justify-between overflow-y-auto p-6 scrollbar-thin scrollbar-thumb-scrollbar\"\n\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\tclassName=\"flex flex-col\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\tto=\"/\"\n\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-2xl font-bold outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tHome\n\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{data.exercises.map(({ exerciseNumber, title, steps }) => {\n\t\t\t\t\t\t\t\t\tconst isActive =\n\t\t\t\t\t\t\t\t\t\tNumber(params.exerciseNumber) === exerciseNumber\n\t\t\t\t\t\t\t\t\tconst showPlayground =\n\t\t\t\t\t\t\t\t\t\t!isActive &&\n\t\t\t\t\t\t\t\t\t\tdata.playground.exerciseNumber === exerciseNumber\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<NavigationExerciseListItem\n\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-1 text-2xl font-bold\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t{showPlayground ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.exerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.stepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.type,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tšŸ›\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t{isActive ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"ml-4 mt-2 flex flex-col\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"instructions\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-xl font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t!params.stepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tIntro\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{steps\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.map(({ stepNumber, title, problem, solution }) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"step\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col gap-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"font-semibold leading-tight\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{stepNumber.toString().padStart(2, '0')}.{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"ml-3 mt-0.5 flex gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'problem',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProblem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' šŸ›'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'solution',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSolution\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' šŸ›'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"finished\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber, 'finished')}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-base font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background': isActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tšŸ“ Elaboration\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</NavigationExerciseListItem>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t<div className=\"mt-6\">\n\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\tto=\"/finished\"\n\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap text-lg font-bold outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'bg-black text-white after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"]':\n\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tšŸ“ Workshop Feedback\n\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t\t{!isMenuOpened && (\n\t\t\t\t\t\t<div className=\"flex flex-grow flex-col justify-center\">\n\t\t\t\t\t\t\t<div className=\"orientation-sideways w-full font-mono text-sm font-medium uppercase leading-none\">\n\t\t\t\t\t\t\t\t{exercise?.title ? (\n\t\t\t\t\t\t\t\t\t<Link to={getExercisePath(Number(params.exerciseNumber))}>\n\t\t\t\t\t\t\t\t\t\t{exercise.title}\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t{exercise?.title && app?.title ? ' — ' : null}\n\t\t\t\t\t\t\t\t{app?.title ? (\n\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\tNumber(params.exerciseNumber),\n\t\t\t\t\t\t\t\t\t\t\tapp.stepNumber,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{app.title}\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{isOnline ? null : (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'You are offline'}>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex w-full animate-pulse items-center border-t p-4',\n\t\t\t\t\t\t\t\t\tisMenuOpened ? 'justify-start' : 'justify-center',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\tname=\"WifiNoConnection\"\n\t\t\t\t\t\t\t\t\tclassName=\"text-foreground-destructive\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t\t<span className=\"whitespace-nowrap\">You are offline</span>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</Icon>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t)}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex w-full items-center justify-start border-t p-4 transition-[height]',\n\t\t\t\t\t\t\tisMenuOpened && users.length > 4 ? 'h-28' : 'h-14',\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={isMenuOpened ? { width: OPENED_MENU_WIDTH } : {}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<FacePile isMenuOpened={isMenuOpened} />\n\t\t\t\t\t</div>\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user ? (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'Your account'}>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tclassName=\"flex h-14 w-full flex-shrink-0 items-center justify-start space-x-3 border-t px-4 py-4 text-center no-underline hover:underline\"\n\t\t\t\t\t\t\t\tto=\"/account\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{user.imageUrlSmall ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\talt={user.name ?? user.email}\n\t\t\t\t\t\t\t\t\t\tsrc={user.imageUrlSmall}\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-full rounded-full\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<Icon name=\"User\" className=\"flex-shrink-0\" size=\"lg\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tYour Account\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Your account</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user && nextExerciseRoute ? (\n\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\tcontent={isMenuOpened ? null : 'Continue to next lesson'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={nextExerciseRoute}\n\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'flex h-14 w-full items-center space-x-3 border-t px-4 py-4 pl-[18px] no-underline hover:underline',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstate={{ from: 'continue next lesson button' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"FastForward\" className=\"flex-shrink-0\" size=\"md\" />\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tContinue to next lesson\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Continue to next lesson</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<div className=\"mb-4 w-full self-start border-t pl-3 pt-[15px]\">\n\t\t\t\t\t\t<ThemeSwitch />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</motion.div>\n\t\t</nav>\n\t)\n}\n\nfunction NavToggle({\n\ttitle,\n\tisMenuOpened,\n\tsetMenuOpened,\n\tmenuControls,\n}: {\n\ttitle: string\n\tisMenuOpened: boolean\n\tsetMenuOpened: (value: boolean) => void\n\tmenuControls?: ReturnType<typeof useAnimationControls>\n}) {\n\tconst initialOpenRef = React.useRef(isMenuOpened)\n\tconst menuButtonRef = React.useRef<HTMLButtonElement>(null)\n\tconst path01Variants = {\n\t\topen: { d: 'M3.06061 2.99999L21.0606 21' },\n\t\tclosed: { d: 'M0 9.5L24 9.5' },\n\t}\n\tconst path02Variants = {\n\t\topen: { d: 'M3.00006 21.0607L21 3.06064' },\n\t\tmoving: { d: 'M0 14.5L24 14.5' },\n\t\tclosed: { d: 'M0 14.5L15 14.5' },\n\t}\n\tconst path01Controls = useAnimationControls()\n\tconst path02Controls = useAnimationControls()\n\n\tasync function toggleMenu() {\n\t\tvoid menuControls?.start(isMenuOpened ? 'close' : 'open')\n\t\tsetMenuOpened(!isMenuOpened)\n\t\tif (isMenuOpened) {\n\t\t\tvoid path01Controls.start(path01Variants.closed)\n\t\t\tawait path02Controls.start(path02Variants.moving)\n\t\t\tvoid path02Controls.start(path02Variants.closed)\n\t\t} else {\n\t\t\tawait path02Controls.start(path02Variants.moving)\n\t\t\tvoid path01Controls.start(path01Variants.open)\n\t\t\tvoid path02Controls.start(path02Variants.open)\n\t\t}\n\t}\n\n\tReact.useEffect(() => {\n\t\tif (!isMenuOpened) return\n\n\t\tfunction handleKeyUp(event: KeyboardEvent) {\n\t\t\tif (event.key === 'Escape') {\n\t\t\t\tmenuButtonRef.current?.click()\n\t\t\t}\n\t\t}\n\t\tdocument.addEventListener('keyup', handleKeyUp)\n\t\treturn () => document.removeEventListener('keyup', handleKeyUp)\n\t}, [isMenuOpened])\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'relative inline-flex h-14 flex-shrink-0 items-center justify-between overflow-hidden border-r sm:w-full sm:border-b sm:border-r-0',\n\t\t\t\t{\n\t\t\t\t\t'w-full': isMenuOpened,\n\t\t\t\t},\n\t\t\t)}\n\t\t>\n\t\t\t<button\n\t\t\t\tref={menuButtonRef}\n\t\t\t\tclassName=\"flex h-14 w-14 items-center justify-center\"\n\t\t\t\taria-label=\"Open Navigation menu\"\n\t\t\t\tonClick={toggleMenu}\n\t\t\t>\n\t\t\t\t<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<motion.path\n\t\t\t\t\t\t{...path01Variants[initialOpenRef.current ? 'open' : 'closed']}\n\t\t\t\t\t\tanimate={path01Controls}\n\t\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t/>\n\t\t\t\t\t<motion.path\n\t\t\t\t\t\t{...path02Variants[initialOpenRef.current ? 'open' : 'closed']}\n\t\t\t\t\t\tanimate={path02Controls}\n\t\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t</button>\n\t\t\t{isMenuOpened && (\n\t\t\t\t<motion.p\n\t\t\t\t\ttransition={{ delay: 0.2 }}\n\t\t\t\t\tinitial={{ opacity: 0, y: 5 }}\n\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\tclassName=\"absolute right-5 whitespace-nowrap font-mono text-sm uppercase\"\n\t\t\t\t>\n\t\t\t\t\t<Link to=\"/\">{title}</Link>\n\t\t\t\t</motion.p>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n"],"names":["stopAnimation","visualElement","value","setVariants","variantLabels","key","variant","setTarget","child","setValues","definition","animationControls","subscribers","controls","transitionOverride","animations","animateVisualElement","useAnimationControls","useConstant","useIsomorphicLayoutEffect","makeMediaQueryStore","mediaQuery","serverSnapshot","getSnapshot","subscribe","callback","mediaQueryList","useSyncExternalStore","DIALOG_NAME","createDialogContext","createDialogScope","createContextScope","DialogProvider","useDialogContext","Dialog","props","__scopeDialog","children","openProp","defaultOpen","onOpenChange","modal","triggerRef","React.useRef","contentRef","open","setOpen","useControllableState","jsx","useId","React.useCallback","prevOpen","TRIGGER_NAME","DialogTrigger","React.forwardRef","forwardedRef","triggerProps","context","composedTriggerRef","useComposedRefs","Primitive","getState","composeEventHandlers","PORTAL_NAME","PortalProvider","usePortalContext","DialogPortal","forceMount","container","React.Children","Presence","PortalPrimitive","OVERLAY_NAME","DialogOverlay","portalContext","overlayProps","DialogOverlayImpl","Slot","createSlot","RemoveScroll","CONTENT_NAME","DialogContent","contentProps","DialogContentModal","DialogContentNonModal","composedRefs","React.useEffect","content","hideOthers","DialogContentImpl","event","originalEvent","ctrlLeftClick","hasInteractedOutsideRef","hasPointerDownOutsideRef","target","trapFocus","onOpenAutoFocus","onCloseAutoFocus","useFocusGuards","jsxs","Fragment","FocusScope","DismissableLayer","TitleWarning","DescriptionWarning","TITLE_NAME","DialogTitle","titleProps","DESCRIPTION_NAME","DialogDescription","descriptionProps","CLOSE_NAME","DialogClose","closeProps","TITLE_WARNING_NAME","WarningProvider","useWarningContext","createContext","titleId","titleWarningContext","MESSAGE","DESCRIPTION_WARNING_NAME","descriptionId","describedById","Root","Trigger","Portal","Overlay","Content","Title","Description","Close","DialogPrimitive.Root","DialogPrimitive.Trigger","DialogPrimitive.Portal","className","ref","DialogPrimitive.Overlay","cn","DialogPrimitive.Content","DialogPrimitive.Close","Icon","DialogHeader","DialogPrimitive.Title","DialogPrimitive.Description","opacities","shadows","getScoreClassNames","score","opacityNumber","Math","round","length","shadowNumber","FacePile","isMenuOpened","loggedInUser","useOptionalUser","users","usePresence","product","displayNameShort","useWorkshopConfig","limit","numberOverLimit","shouldShowNumberOverLimit","tiffany","Link","rel","to","alt","src","overLimitLabel","TooltipProvider","slice","map","user","scoreClassNames","locationLabel","getLocationLabel","location","imageUrl","imageUrlSmall","avatarUrl","hasAccess","local","origin","includes","doingLabel","Tooltip","TooltipTrigger","asChild","tabIndex","name","TooltipContent","id","line1","line2","useIsWide","_layout","_UNSAFE_withComponentProps","data","useLoaderData","isWide","isHydrated","useHydrated","setMenuOpenedState","React","useRevalidationWS","watchPaths","setMenuOpened","document","cookie","toString","NoUserBanner","MobileNavigation","onMenuOpenChange","Navigation","Outlet","exercise","exercisePortion","exerciseNumber","stepNumber","filter","Boolean","s","padStart","join","type","workshopTitle","host","displayName","userHasAccess","useUserHasAccess","details","ENV","EPICSHOP_DEPLOYED","EPICSHOP_GITHUB_REPO","href","Logo","size","style","itemVariants","hidden","opacity","x","visible","NavigationExerciseListItem","progressClassName","useExerciseProgressClassName","motion","li","variants","NavigationExerciseStepListItem","progressItemSearch","useProgressItemClassName","nextExerciseRoute","useNextExerciseRoute","params","useParams","isOnline","useIsOnline","listVariants","transition","duration","when","staggerChildren","NavToggle","title","div","initial","animate","ul","NavLink","prefetch","isActive","clsx","exercises","steps","Number","showPlayground","playground","getExercisePath","getExerciseStepPath","problem","solution","appName","SimpleTooltip","email","state","from","ThemeSwitch","OPENED_MENU_WIDTH","find","e","app","solutions","problems","p","menuControls","menuVariants","close","width","initialOpenRef","menuButtonRef","path01Variants","d","closed","path02Variants","moving","path01Controls","path02Controls","toggleMenu","start","handleKeyUp","current","click","addEventListener","removeEventListener","onClick","height","viewBox","path","stroke","strokeWidth","delay","y"],"mappings":"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","x_google_ignoreList":[0,1,3]}
@@ -0,0 +1,2 @@
1
+ import{w as e,O as s}from"./chunk-QMGIS6GS-CG5cA6CX.js";import{j as t}from"./jsx-runtime-EKYJJIwR.js";const a={getSitemapEntries:void 0},i=e(function(){return t.jsx("div",{className:"flex h-full flex-grow",children:t.jsx(s,{})})});export{i as default,a as handle};
2
+ //# sourceMappingURL=_layout-dHfVo9gJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_layout-dHfVo9gJ.js","sources":["../../../app/routes/_app+/exercise+/_layout.tsx"],"sourcesContent":["import { getExercises } from '@epic-web/workshop-utils/apps.server'\nimport { type SEOHandle } from '@nasa-gcn/remix-seo'\nimport { Outlet } from 'react-router'\nimport { serverOnly$ } from 'vite-env-only/macros'\n\nexport const handle: SEOHandle = {\n\tgetSitemapEntries: serverOnly$(async (request) => {\n\t\tconst exercises = await getExercises({ request })\n\t\treturn exercises.flatMap((e) => [\n\t\t\t{ route: `/exercise/${e.exerciseNumber.toString().padStart(2, '0')}` },\n\t\t\t...e.steps.flatMap((s) =>\n\t\t\t\t['problem', 'solution'].map((type) => ({\n\t\t\t\t\troute: `/exercise/${e.exerciseNumber.toString().padStart(2, '0')}/${s.stepNumber.toString().padStart(2, '0')}/${type}`,\n\t\t\t\t})),\n\t\t\t),\n\t\t\t{\n\t\t\t\troute: `/exercise/${e.exerciseNumber.toString().padStart(2, '0')}/finished`,\n\t\t\t},\n\t\t])\n\t}),\n}\n\nexport default function ExercisesLayout() {\n\treturn (\n\t\t<div className=\"flex h-full flex-grow\">\n\t\t\t<Outlet />\n\t\t</div>\n\t)\n}\n"],"names":["handle","getSitemapEntries","undefined","_layout","_UNSAFE_withComponentProps","className","children","jsx","Outlet"],"mappings":"sGAKO,MAAMA,EAAoB,CAChCC,kBAAAC,MAcD,EAEAC,EAAAC,EAAA,UAA0C,CACzC,aACE,MAAA,CAAIC,UAAU,wBACdC,SAAAC,EAAAA,IAACC,IAAO,CAAA,CACT,CAEF,CAAA"}
@@ -0,0 +1,2 @@
1
+ import{j as t}from"./jsx-runtime-EKYJJIwR.js";import{r as f,R as u}from"./chunk-QMGIS6GS-CG5cA6CX.js";import{d as F,u as M,e as z,P as j,f as B,g as de,h as U,i as pe}from"./tooltip-Cm7A1uIP.js";import{f as ue,u as fe}from"./index-CZ8q0Nf8.js";import{c as k,I as R}from"./misc-COGqV2fm.js";var _="Collapsible",[me,q]=F(_),[xe,V]=me(_),Y=f.forwardRef((e,s)=>{const{__scopeCollapsible:o,open:n,defaultOpen:r,disabled:a,onOpenChange:c,...i}=e,[d,p]=M({prop:n,defaultProp:r??!1,onChange:c,caller:_});return t.jsx(xe,{scope:o,disabled:a,contentId:z(),open:d,onOpenToggle:f.useCallback(()=>p(m=>!m),[p]),children:t.jsx(j.div,{"data-state":H(d),"data-disabled":a?"":void 0,...i,ref:s})})});Y.displayName=_;var J="CollapsibleTrigger",Q=f.forwardRef((e,s)=>{const{__scopeCollapsible:o,...n}=e,r=V(J,o);return t.jsx(j.button,{type:"button","aria-controls":r.contentId,"aria-expanded":r.open||!1,"data-state":H(r.open),"data-disabled":r.disabled?"":void 0,disabled:r.disabled,...n,ref:s,onClick:B(e.onClick,r.onOpenToggle)})});Q.displayName=J;var L="CollapsibleContent",W=f.forwardRef((e,s)=>{const{forceMount:o,...n}=e,r=V(L,e.__scopeCollapsible);return t.jsx(de,{present:o||r.open,children:({present:a})=>t.jsx(ve,{...n,ref:s,present:a})})});W.displayName=L;var ve=f.forwardRef((e,s)=>{const{__scopeCollapsible:o,present:n,children:r,...a}=e,c=V(L,o),[i,d]=f.useState(n),p=f.useRef(null),m=U(s,p),x=f.useRef(0),A=x.current,C=f.useRef(0),N=C.current,b=c.open||i,g=f.useRef(b),h=f.useRef(void 0);return f.useEffect(()=>{const l=requestAnimationFrame(()=>g.current=!1);return()=>cancelAnimationFrame(l)},[]),pe(()=>{const l=p.current;if(l){h.current=h.current||{transitionDuration:l.style.transitionDuration,animationName:l.style.animationName},l.style.transitionDuration="0s",l.style.animationName="none";const I=l.getBoundingClientRect();x.current=I.height,C.current=I.width,g.current||(l.style.transitionDuration=h.current.transitionDuration,l.style.animationName=h.current.animationName),d(n)}},[c.open,n]),t.jsx(j.div,{"data-state":H(c.open),"data-disabled":c.disabled?"":void 0,id:c.contentId,hidden:!b,...a,ref:m,style:{"--radix-collapsible-content-height":A?`${A}px`:void 0,"--radix-collapsible-content-width":N?`${N}px`:void 0,...e.style},children:b&&r})});function H(e){return e?"open":"closed"}var Ce=Y,be=Q,ge=W,v="Accordion",he=["Home","End","ArrowDown","ArrowUp","ArrowLeft","ArrowRight"],[$,Ae,Ie]=ue(v),[P,$e]=F(v,[Ie,q]),G=q(),X=u.forwardRef((e,s)=>{const{type:o,...n}=e,r=n,a=n;return t.jsx($.Provider,{scope:e.__scopeAccordion,children:o==="multiple"?t.jsx(we,{...a,ref:s}):t.jsx(Ne,{...r,ref:s})})});X.displayName=v;var[Z,Re]=P(v),[ee,je]=P(v,{collapsible:!1}),Ne=u.forwardRef((e,s)=>{const{value:o,defaultValue:n,onValueChange:r=()=>{},collapsible:a=!1,...c}=e,[i,d]=M({prop:o,defaultProp:n??"",onChange:r,caller:v});return t.jsx(Z,{scope:e.__scopeAccordion,value:u.useMemo(()=>i?[i]:[],[i]),onItemOpen:d,onItemClose:u.useCallback(()=>a&&d(""),[a,d]),children:t.jsx(ee,{scope:e.__scopeAccordion,collapsible:a,children:t.jsx(oe,{...c,ref:s})})})}),we=u.forwardRef((e,s)=>{const{value:o,defaultValue:n,onValueChange:r=()=>{},...a}=e,[c,i]=M({prop:o,defaultProp:n??[],onChange:r,caller:v}),d=u.useCallback(m=>i((x=[])=>[...x,m]),[i]),p=u.useCallback(m=>i((x=[])=>x.filter(A=>A!==m)),[i]);return t.jsx(Z,{scope:e.__scopeAccordion,value:c,onItemOpen:d,onItemClose:p,children:t.jsx(ee,{scope:e.__scopeAccordion,collapsible:!0,children:t.jsx(oe,{...a,ref:s})})})}),[_e,y]=P(v),oe=u.forwardRef((e,s)=>{const{__scopeAccordion:o,disabled:n,dir:r,orientation:a="vertical",...c}=e,i=u.useRef(null),d=U(i,s),p=Ae(o),x=fe(r)==="ltr",A=B(e.onKeyDown,C=>{if(!he.includes(C.key))return;const N=C.target,b=p().filter(T=>!T.ref.current?.disabled),g=b.findIndex(T=>T.ref.current===N),h=b.length;if(g===-1)return;C.preventDefault();let l=g;const I=0,E=h-1,S=()=>{l=g+1,l>E&&(l=I)},D=()=>{l=g-1,l<I&&(l=E)};switch(C.key){case"Home":l=I;break;case"End":l=E;break;case"ArrowRight":a==="horizontal"&&(x?S():D());break;case"ArrowDown":a==="vertical"&&S();break;case"ArrowLeft":a==="horizontal"&&(x?D():S());break;case"ArrowUp":a==="vertical"&&D();break}const le=l%h;b[le].ref.current?.focus()});return t.jsx(_e,{scope:o,disabled:n,direction:r,orientation:a,children:t.jsx($.Slot,{scope:o,children:t.jsx(j.div,{...c,"data-orientation":a,ref:d,onKeyDown:n?void 0:A})})})}),w="AccordionItem",[Pe,K]=P(w),te=u.forwardRef((e,s)=>{const{__scopeAccordion:o,value:n,...r}=e,a=y(w,o),c=Re(w,o),i=G(o),d=z(),p=n&&c.value.includes(n)||!1,m=a.disabled||e.disabled;return t.jsx(Pe,{scope:o,open:p,disabled:m,triggerId:d,children:t.jsx(Ce,{"data-orientation":a.orientation,"data-state":ie(p),...i,...r,ref:s,disabled:m,open:p,onOpenChange:x=>{x?c.onItemOpen(n):c.onItemClose(n)}})})});te.displayName=w;var ne="AccordionHeader",re=u.forwardRef((e,s)=>{const{__scopeAccordion:o,...n}=e,r=y(v,o),a=K(ne,o);return t.jsx(j.h3,{"data-orientation":r.orientation,"data-state":ie(a.open),"data-disabled":a.disabled?"":void 0,...n,ref:s})});re.displayName=ne;var O="AccordionTrigger",ae=u.forwardRef((e,s)=>{const{__scopeAccordion:o,...n}=e,r=y(v,o),a=K(O,o),c=je(O,o),i=G(o);return t.jsx($.ItemSlot,{scope:o,children:t.jsx(be,{"aria-disabled":a.open&&!c.collapsible||void 0,"data-orientation":r.orientation,id:a.triggerId,...i,...n,ref:s})})});ae.displayName=O;var se="AccordionContent",ce=u.forwardRef((e,s)=>{const{__scopeAccordion:o,...n}=e,r=y(v,o),a=K(se,o),c=G(o);return t.jsx(ge,{role:"region","aria-labelledby":a.triggerId,"data-orientation":r.orientation,...c,...n,ref:s,style:{"--radix-accordion-content-height":"var(--radix-collapsible-content-height)","--radix-accordion-content-width":"var(--radix-collapsible-content-width)",...e.style}})});ce.displayName=se;function ie(e){return e?"open":"closed"}var Ge=X,ye=te,Ee=re,Se=ae,De=ce;const Ke=({title:e,children:s,variant:o,icon:n,forceMount:r=!1})=>{const a=()=>{switch(o){case"changed":return t.jsx(R,{name:"Modified","aria-label":"Modified",className:"text-[#fb923c]"});case"renamed":return t.jsx(R,{name:"Renamed","aria-label":"Renamed",className:"text-[#fb923c]"});case"added":return t.jsx(R,{name:"Added","aria-label":"Added",className:"text-[#10b981]"});case"deleted":return t.jsx(R,{name:"Deleted","aria-label":"Deleted",className:"text-[#ef4444]"});default:return t.jsx(R,{name:"Modified","aria-label":"Modified",className:"text-[#fb923c]"})}},c=()=>{switch(o){case"changed":return"modified";default:return o}},i=e.replace(/\\\\/g,"\\");return t.jsxs(ye,{value:e,children:[t.jsxs(Te,{variant:c(),children:[n||a()," ",i]}),t.jsx(Oe,{forceMount:r,className:k("prose max-w-none whitespace-pre-wrap dark:prose-invert prose-pre:m-0 prose-pre:mb-1 prose-pre:rounded-none",{"radix-state-closed:hidden":r}),children:s})]})},Te=({ref:e,children:s,className:o,variant:n,...r})=>t.jsx(Ee,{className:"flex",asChild:!0,children:t.jsxs(Se,{className:k("group flex w-full items-center justify-between border-b p-4 pr-3 font-mono text-sm font-medium leading-none hover:bg-foreground/20",o),...r,ref:e,children:[t.jsx("div",{className:"flex items-center gap-1.5",children:s}),t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:"font-mono text-xs font-normal uppercase text-muted-foreground",children:n}),t.jsx(R,{name:"TriangleDownSmall",className:"transition group-radix-state-open:rotate-180","aria-hidden":!0})]})]})}),Oe=({ref:e,children:s,className:o,...n})=>t.jsx(De,{className:k("",o),...n,ref:e,children:t.jsx("div",{children:s})});export{Ke as A,Ge as R};
2
+ //# sourceMappingURL=accordion-PSsenYUI.js.map