@epic-web/workshop-app 4.6.6 → 4.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (809) hide show
  1. package/build/client/assets/{_-COWH0sBh.js → _-Bd2gNcck.js} +2 -2
  2. package/build/client/assets/{_-COWH0sBh.js.map → _-Bd2gNcck.js.map} +1 -1
  3. package/build/client/assets/{_exerciseNumber-wyz3vbhs.js → _exerciseNumber-CFOo2dQj.js} +2 -2
  4. package/build/client/assets/{_exerciseNumber-wyz3vbhs.js.map → _exerciseNumber-CFOo2dQj.js.map} +1 -1
  5. package/build/client/assets/{_exerciseNumber_._stepNumber-C37pli7_.js → _exerciseNumber_._stepNumber-DCbWNWpZ.js} +2 -2
  6. package/build/client/assets/{_exerciseNumber_._stepNumber-C37pli7_.js.map → _exerciseNumber_._stepNumber-DCbWNWpZ.js.map} +1 -1
  7. package/build/client/assets/_exerciseNumber_.finished-P7xMAtl1.js +2 -0
  8. package/build/client/assets/_exerciseNumber_.finished-P7xMAtl1.js.map +1 -0
  9. package/build/client/assets/_layout-Bdd3mpVx.js +2 -0
  10. package/build/client/assets/_layout-Bdd3mpVx.js.map +1 -0
  11. package/build/client/assets/_layout-DHBLG7Ti.js +6 -0
  12. package/build/client/assets/_layout-DHBLG7Ti.js.map +1 -0
  13. package/build/client/assets/_layout-DaZNLfOL.js +2 -0
  14. package/build/client/assets/{_layout-BR-Qyofe.js.map → _layout-DaZNLfOL.js.map} +1 -1
  15. package/build/client/assets/{_layout-D0zbQZjf.js → _layout-rEQoj43V.js} +2 -2
  16. package/build/client/assets/{_layout-D0zbQZjf.js.map → _layout-rEQoj43V.js.map} +1 -1
  17. package/build/client/assets/{account-DesvwOeg.js → account-CnLkZd_O.js} +2 -2
  18. package/build/client/assets/{account-DesvwOeg.js.map → account-CnLkZd_O.js.map} +1 -1
  19. package/build/client/assets/{button-BfWwrI9B.js → button-CyZl24U2.js} +2 -2
  20. package/build/client/assets/{button-BfWwrI9B.js.map → button-CyZl24U2.js.map} +1 -1
  21. package/build/client/assets/{client-hints-BKxdo5Js.js → client-hints-BE5mB4r0.js} +2 -2
  22. package/build/client/assets/{client-hints-BKxdo5Js.js.map → client-hints-BE5mB4r0.js.map} +1 -1
  23. package/build/client/assets/components-BMzmvxYw.js +166 -0
  24. package/build/client/assets/components-BMzmvxYw.js.map +1 -0
  25. package/build/client/assets/diff-P5f7-8E4.js +2 -0
  26. package/build/client/assets/diff-P5f7-8E4.js.map +1 -0
  27. package/build/client/assets/diff-PfwTHr6-.js +2 -0
  28. package/build/client/assets/{diff-KDzcgGYL.js.map → diff-PfwTHr6-.js.map} +1 -1
  29. package/build/client/assets/{discord-0kv66Q6F.js → discord-COPE8EOZ.js} +2 -2
  30. package/build/client/assets/{discord-0kv66Q6F.js.map → discord-COPE8EOZ.js.map} +1 -1
  31. package/build/client/assets/discord-DIog7bBO.js +2 -0
  32. package/build/client/assets/discord-DIog7bBO.js.map +1 -0
  33. package/build/client/assets/entry.client-B0vV2fsa.js +43 -0
  34. package/build/client/assets/entry.client-B0vV2fsa.js.map +1 -0
  35. package/build/client/assets/{epic-video-BwtXsHGU.js → epic-video-CYnG2ziQ.js} +128 -128
  36. package/build/client/assets/epic-video-CYnG2ziQ.js.map +1 -0
  37. package/build/client/assets/{error-boundary-Bcric_4t.js → error-boundary-DxfVshQ5.js} +2 -2
  38. package/build/client/assets/{error-boundary-Bcric_4t.js.map → error-boundary-DxfVshQ5.js.map} +1 -1
  39. package/build/client/assets/finished-DP5ynR5u.js +2 -0
  40. package/build/client/assets/finished-DP5ynR5u.js.map +1 -0
  41. package/build/client/assets/index-4E9_Sx3m.js +42 -0
  42. package/build/client/assets/index-4E9_Sx3m.js.map +1 -0
  43. package/build/client/assets/{index-Bg9MMnnf.js → index-90bzTYUX.js} +2 -2
  44. package/build/client/assets/index-90bzTYUX.js.map +1 -0
  45. package/build/client/assets/{index-BQRtqn3g.js → index-BXefr1BB.js} +2 -2
  46. package/build/client/assets/{index-BQRtqn3g.js.map → index-BXefr1BB.js.map} +1 -1
  47. package/build/client/assets/index-Czg1ruVn.js +37 -0
  48. package/build/client/assets/index-Czg1ruVn.js.map +1 -0
  49. package/build/client/assets/{index-9nNr0Zqr.js → index-D6ukHE4T.js} +2 -2
  50. package/build/client/assets/{index-9nNr0Zqr.js.map → index-D6ukHE4T.js.map} +1 -1
  51. package/build/client/assets/index-Doi37489.js +3 -0
  52. package/build/client/assets/index-Doi37489.js.map +1 -0
  53. package/build/client/assets/{loading-C9f_vBoM.js → loading-CNWJVymJ.js} +2 -2
  54. package/build/client/assets/{loading-C9f_vBoM.js.map → loading-CNWJVymJ.js.map} +1 -1
  55. package/build/client/assets/{login-D8zyjBAb.js → login-DxG854vQ.js} +2 -2
  56. package/build/client/assets/{login-D8zyjBAb.js.map → login-DxG854vQ.js.map} +1 -1
  57. package/build/client/assets/manifest-a1fde59b.js +1 -0
  58. package/build/client/assets/mdx-CR7Me1v_.js +2 -0
  59. package/build/client/assets/{mdx-BYvGbvEr.js.map → mdx-CR7Me1v_.js.map} +1 -1
  60. package/build/client/assets/misc-CypjEQkt.js +2 -0
  61. package/build/client/assets/misc-CypjEQkt.js.map +1 -0
  62. package/build/client/assets/{nav-chevrons-DOYtx9XE.js → nav-chevrons-BYKwyIgG.js} +2 -2
  63. package/build/client/assets/{nav-chevrons-DOYtx9XE.js.map → nav-chevrons-BYKwyIgG.js.map} +1 -1
  64. package/build/client/assets/{onboarding-euWyXpCL.js → onboarding-b9lcdh4n.js} +2 -2
  65. package/build/client/assets/{onboarding-euWyXpCL.js.map → onboarding-b9lcdh4n.js.map} +1 -1
  66. package/build/client/assets/{presence-BJPzwbUy.js → presence-DXXVJbaH.js} +2 -2
  67. package/build/client/assets/{presence-BJPzwbUy.js.map → presence-DXXVJbaH.js.map} +1 -1
  68. package/build/client/assets/progress-B_mReZVE.js +2 -0
  69. package/build/client/assets/progress-B_mReZVE.js.map +1 -0
  70. package/build/client/assets/{progress-bar-7LK87ZMh.js → progress-bar-DCrt7X4t.js} +2 -2
  71. package/build/client/assets/{progress-bar-7LK87ZMh.js.map → progress-bar-DCrt7X4t.js.map} +1 -1
  72. package/build/client/assets/{request-info-Dyls4H67.js → request-info-CUT0ULYN.js} +2 -2
  73. package/build/client/assets/{request-info-Dyls4H67.js.map → request-info-CUT0ULYN.js.map} +1 -1
  74. package/build/client/assets/{root-BQ7V6fP4.js → root-bgHbi7rA.js} +4 -4
  75. package/build/client/assets/root-bgHbi7rA.js.map +1 -0
  76. package/build/client/assets/{support-DUAHYT3r.js → support-DrY-qRGh.js} +2 -2
  77. package/build/client/assets/{support-DUAHYT3r.js.map → support-DrY-qRGh.js.map} +1 -1
  78. package/build/client/assets/tailwind-D2vjZZFL.css +1 -0
  79. package/build/client/assets/tooltip-CfmIzAYi.js +2 -0
  80. package/build/client/assets/tooltip-CfmIzAYi.js.map +1 -0
  81. package/build/client/assets/{use-event-source-aW6X9lN1.js → use-event-source-ySol3hbz.js} +2 -2
  82. package/build/client/assets/{use-event-source-aW6X9lN1.js.map → use-event-source-ySol3hbz.js.map} +1 -1
  83. package/build/client/assets/{user-73ocDYRe.js → user-C4QTtQw5.js} +2 -2
  84. package/build/client/assets/{user-73ocDYRe.js.map → user-C4QTtQw5.js.map} +1 -1
  85. package/build/server/index.js +841 -607
  86. package/build/server/index.js.map +1 -1
  87. package/node_modules/@babel/runtime/helpers/esm/wrapAsyncGenerator.js +65 -3
  88. package/node_modules/@babel/runtime/helpers/wrapAsyncGenerator.js +65 -3
  89. package/node_modules/@babel/runtime/package.json +1 -28
  90. package/node_modules/@conform-to/dom/dom.d.ts +17 -5
  91. package/node_modules/@conform-to/dom/form.d.ts +221 -122
  92. package/node_modules/@conform-to/dom/index.d.ts +24 -2
  93. package/node_modules/@conform-to/dom/intent.d.ts +92 -60
  94. package/node_modules/@conform-to/dom/package.json +1 -1
  95. package/node_modules/@conform-to/dom/parse.d.ts +47 -27
  96. package/node_modules/@conform-to/dom/types.d.ts +17 -14
  97. package/node_modules/@conform-to/dom/util.d.ts +4 -1
  98. package/node_modules/@conform-to/react/context.d.ts +187 -59
  99. package/node_modules/@conform-to/react/context.js +3 -5
  100. package/node_modules/@conform-to/react/context.mjs +4 -6
  101. package/node_modules/@conform-to/react/experimental.d.ts +0 -0
  102. package/node_modules/@conform-to/react/hooks.d.ts +53 -24
  103. package/node_modules/@conform-to/react/index.d.ts +28 -4
  104. package/node_modules/@conform-to/react/integrations.js +14 -1
  105. package/node_modules/@conform-to/react/integrations.mjs +14 -1
  106. package/node_modules/@conform-to/react/package.json +2 -2
  107. package/node_modules/@conform-to/zod/coercion.d.ts +14 -4
  108. package/node_modules/@conform-to/zod/constraint.d.ts +3 -1
  109. package/node_modules/@conform-to/zod/package.json +2 -2
  110. package/node_modules/@conform-to/zod/parse.d.ts +43 -25
  111. package/node_modules/@floating-ui/core/dist/floating-ui.core.browser.min.mjs +1 -1
  112. package/node_modules/@floating-ui/core/dist/floating-ui.core.browser.mjs +14 -3
  113. package/node_modules/@floating-ui/core/dist/floating-ui.core.d.mts +51 -51
  114. package/node_modules/@floating-ui/core/dist/floating-ui.core.d.ts +51 -51
  115. package/node_modules/@floating-ui/core/dist/floating-ui.core.esm.js +14 -3
  116. package/node_modules/@floating-ui/core/dist/floating-ui.core.mjs +14 -3
  117. package/node_modules/@floating-ui/core/dist/floating-ui.core.umd.js +14 -3
  118. package/node_modules/@floating-ui/core/dist/floating-ui.core.umd.min.js +1 -1
  119. package/node_modules/@floating-ui/core/package.json +2 -2
  120. package/node_modules/@floating-ui/dom/dist/floating-ui.dom.browser.min.mjs +1 -1
  121. package/node_modules/@floating-ui/dom/dist/floating-ui.dom.browser.mjs +12 -11
  122. package/node_modules/@floating-ui/dom/dist/floating-ui.dom.d.mts +11 -8
  123. package/node_modules/@floating-ui/dom/dist/floating-ui.dom.d.ts +11 -8
  124. package/node_modules/@floating-ui/dom/dist/floating-ui.dom.esm.js +1 -12
  125. package/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs +1 -12
  126. package/node_modules/@floating-ui/dom/dist/floating-ui.dom.umd.js +12 -11
  127. package/node_modules/@floating-ui/dom/dist/floating-ui.dom.umd.min.js +1 -1
  128. package/node_modules/@floating-ui/dom/package.json +2 -2
  129. package/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.d.mts +12 -4
  130. package/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.d.ts +12 -4
  131. package/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.esm.js +1 -0
  132. package/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.mjs +1 -0
  133. package/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.umd.js +1 -0
  134. package/node_modules/@floating-ui/react-dom/package.json +1 -1
  135. package/node_modules/@floating-ui/utils/dist/floating-ui.utils.d.mts +11 -6
  136. package/node_modules/@floating-ui/utils/dist/floating-ui.utils.d.ts +11 -6
  137. package/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.d.mts +2 -0
  138. package/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.d.ts +2 -0
  139. package/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.esm.js +13 -1
  140. package/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs +13 -1
  141. package/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.umd.js +13 -0
  142. package/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.umd.min.js +1 -1
  143. package/node_modules/@floating-ui/utils/dom/floating-ui.utils.dom.d.ts +2 -0
  144. package/node_modules/@floating-ui/utils/dom/floating-ui.utils.dom.esm.js +13 -1
  145. package/node_modules/@floating-ui/utils/dom/floating-ui.utils.dom.umd.js +13 -0
  146. package/node_modules/@floating-ui/utils/package.json +1 -1
  147. package/node_modules/@radix-ui/number/dist/index.d.mts +2 -2
  148. package/node_modules/@radix-ui/number/dist/index.d.ts +2 -2
  149. package/node_modules/@radix-ui/number/dist/index.js +28 -10
  150. package/node_modules/@radix-ui/number/dist/index.js.map +7 -1
  151. package/node_modules/@radix-ui/number/dist/index.mjs +6 -7
  152. package/node_modules/@radix-ui/number/dist/index.mjs.map +7 -1
  153. package/node_modules/@radix-ui/number/package.json +1 -4
  154. package/node_modules/@radix-ui/primitive/dist/index.d.mts +2 -2
  155. package/node_modules/@radix-ui/primitive/dist/index.d.ts +2 -2
  156. package/node_modules/@radix-ui/primitive/dist/index.js +33 -13
  157. package/node_modules/@radix-ui/primitive/dist/index.js.map +7 -1
  158. package/node_modules/@radix-ui/primitive/dist/index.mjs +11 -10
  159. package/node_modules/@radix-ui/primitive/dist/index.mjs.map +7 -1
  160. package/node_modules/@radix-ui/primitive/package.json +1 -4
  161. package/node_modules/@radix-ui/react-accordion/dist/index.d.mts +40 -28
  162. package/node_modules/@radix-ui/react-accordion/dist/index.d.ts +40 -28
  163. package/node_modules/@radix-ui/react-accordion/dist/index.js +324 -316
  164. package/node_modules/@radix-ui/react-accordion/dist/index.js.map +7 -1
  165. package/node_modules/@radix-ui/react-accordion/dist/index.mjs +293 -300
  166. package/node_modules/@radix-ui/react-accordion/dist/index.mjs.map +7 -1
  167. package/node_modules/@radix-ui/react-accordion/package.json +12 -13
  168. package/node_modules/@radix-ui/react-arrow/dist/index.d.mts +8 -8
  169. package/node_modules/@radix-ui/react-arrow/dist/index.d.ts +8 -8
  170. package/node_modules/@radix-ui/react-arrow/dist/index.js +57 -37
  171. package/node_modules/@radix-ui/react-arrow/dist/index.js.map +7 -1
  172. package/node_modules/@radix-ui/react-arrow/dist/index.mjs +25 -30
  173. package/node_modules/@radix-ui/react-arrow/dist/index.mjs.map +7 -1
  174. package/node_modules/@radix-ui/react-arrow/package.json +4 -5
  175. package/node_modules/@radix-ui/react-collapsible/dist/index.d.mts +27 -16
  176. package/node_modules/@radix-ui/react-collapsible/dist/index.d.ts +27 -16
  177. package/node_modules/@radix-ui/react-collapsible/dist/index.js +176 -167
  178. package/node_modules/@radix-ui/react-collapsible/dist/index.js.map +7 -1
  179. package/node_modules/@radix-ui/react-collapsible/dist/index.mjs +143 -153
  180. package/node_modules/@radix-ui/react-collapsible/dist/index.mjs.map +7 -1
  181. package/node_modules/@radix-ui/react-collapsible/package.json +11 -12
  182. package/node_modules/@radix-ui/react-collection/dist/index.d.mts +27 -15
  183. package/node_modules/@radix-ui/react-collection/dist/index.d.ts +27 -15
  184. package/node_modules/@radix-ui/react-collection/dist/index.js +99 -112
  185. package/node_modules/@radix-ui/react-collection/dist/index.js.map +7 -1
  186. package/node_modules/@radix-ui/react-collection/dist/index.mjs +68 -106
  187. package/node_modules/@radix-ui/react-collection/dist/index.mjs.map +7 -1
  188. package/node_modules/@radix-ui/react-collection/package.json +7 -8
  189. package/node_modules/@radix-ui/react-compose-refs/dist/index.d.mts +5 -4
  190. package/node_modules/@radix-ui/react-compose-refs/dist/index.d.ts +5 -4
  191. package/node_modules/@radix-ui/react-compose-refs/dist/index.js +47 -30
  192. package/node_modules/@radix-ui/react-compose-refs/dist/index.js.map +7 -1
  193. package/node_modules/@radix-ui/react-compose-refs/dist/index.mjs +16 -27
  194. package/node_modules/@radix-ui/react-compose-refs/dist/index.mjs.map +7 -1
  195. package/node_modules/@radix-ui/react-compose-refs/package.json +2 -5
  196. package/node_modules/@radix-ui/react-context/dist/index.d.mts +10 -8
  197. package/node_modules/@radix-ui/react-context/dist/index.d.ts +10 -8
  198. package/node_modules/@radix-ui/react-context/dist/index.js +104 -123
  199. package/node_modules/@radix-ui/react-context/dist/index.js.map +7 -1
  200. package/node_modules/@radix-ui/react-context/dist/index.mjs +73 -120
  201. package/node_modules/@radix-ui/react-context/dist/index.mjs.map +7 -1
  202. package/node_modules/@radix-ui/react-context/package.json +2 -5
  203. package/node_modules/@radix-ui/react-direction/dist/index.d.mts +6 -5
  204. package/node_modules/@radix-ui/react-direction/dist/index.d.ts +6 -5
  205. package/node_modules/@radix-ui/react-direction/dist/index.js +47 -24
  206. package/node_modules/@radix-ui/react-direction/dist/index.js.map +7 -1
  207. package/node_modules/@radix-ui/react-direction/dist/index.mjs +16 -20
  208. package/node_modules/@radix-ui/react-direction/dist/index.mjs.map +7 -1
  209. package/node_modules/@radix-ui/react-direction/package.json +2 -5
  210. package/node_modules/@radix-ui/react-dismissable-layer/dist/index.d.mts +10 -10
  211. package/node_modules/@radix-ui/react-dismissable-layer/dist/index.d.ts +10 -10
  212. package/node_modules/@radix-ui/react-dismissable-layer/dist/index.js +230 -270
  213. package/node_modules/@radix-ui/react-dismissable-layer/dist/index.js.map +7 -1
  214. package/node_modules/@radix-ui/react-dismissable-layer/dist/index.mjs +199 -261
  215. package/node_modules/@radix-ui/react-dismissable-layer/dist/index.mjs.map +7 -1
  216. package/node_modules/@radix-ui/react-dismissable-layer/package.json +9 -10
  217. package/node_modules/@radix-ui/react-focus-guards/dist/index.d.mts +4 -4
  218. package/node_modules/@radix-ui/react-focus-guards/dist/index.d.ts +4 -4
  219. package/node_modules/@radix-ui/react-focus-guards/dist/index.js +63 -39
  220. package/node_modules/@radix-ui/react-focus-guards/dist/index.js.map +7 -1
  221. package/node_modules/@radix-ui/react-focus-guards/dist/index.mjs +32 -34
  222. package/node_modules/@radix-ui/react-focus-guards/dist/index.mjs.map +7 -1
  223. package/node_modules/@radix-ui/react-focus-guards/package.json +2 -5
  224. package/node_modules/@radix-ui/react-focus-scope/dist/index.d.mts +8 -8
  225. package/node_modules/@radix-ui/react-focus-scope/dist/index.d.ts +8 -8
  226. package/node_modules/@radix-ui/react-focus-scope/dist/index.js +228 -282
  227. package/node_modules/@radix-ui/react-focus-scope/dist/index.js.map +7 -1
  228. package/node_modules/@radix-ui/react-focus-scope/dist/index.mjs +197 -275
  229. package/node_modules/@radix-ui/react-focus-scope/dist/index.mjs.map +7 -1
  230. package/node_modules/@radix-ui/react-focus-scope/package.json +6 -7
  231. package/node_modules/@radix-ui/react-id/dist/index.d.mts +2 -2
  232. package/node_modules/@radix-ui/react-id/dist/index.d.ts +2 -2
  233. package/node_modules/@radix-ui/react-id/dist/index.js +47 -26
  234. package/node_modules/@radix-ui/react-id/dist/index.js.map +7 -1
  235. package/node_modules/@radix-ui/react-id/dist/index.mjs +14 -22
  236. package/node_modules/@radix-ui/react-id/dist/index.mjs.map +7 -1
  237. package/node_modules/@radix-ui/react-id/package.json +3 -4
  238. package/node_modules/@radix-ui/react-popover/dist/index.d.mts +48 -37
  239. package/node_modules/@radix-ui/react-popover/dist/index.d.ts +48 -37
  240. package/node_modules/@radix-ui/react-popover/dist/index.js +319 -311
  241. package/node_modules/@radix-ui/react-popover/dist/index.js.map +7 -1
  242. package/node_modules/@radix-ui/react-popover/dist/index.mjs +288 -291
  243. package/node_modules/@radix-ui/react-popover/dist/index.mjs.map +7 -1
  244. package/node_modules/@radix-ui/react-popover/package.json +17 -18
  245. package/node_modules/@radix-ui/react-popper/dist/index.d.mts +36 -25
  246. package/node_modules/@radix-ui/react-popper/dist/index.d.ts +36 -25
  247. package/node_modules/@radix-ui/react-popper/dist/index.js +305 -321
  248. package/node_modules/@radix-ui/react-popper/dist/index.js.map +7 -1
  249. package/node_modules/@radix-ui/react-popper/dist/index.mjs +284 -305
  250. package/node_modules/@radix-ui/react-popper/dist/index.mjs.map +7 -1
  251. package/node_modules/@radix-ui/react-popper/package.json +12 -13
  252. package/node_modules/@radix-ui/react-portal/dist/index.d.mts +9 -9
  253. package/node_modules/@radix-ui/react-portal/dist/index.d.ts +9 -9
  254. package/node_modules/@radix-ui/react-portal/dist/index.js +52 -34
  255. package/node_modules/@radix-ui/react-portal/dist/index.js.map +7 -1
  256. package/node_modules/@radix-ui/react-portal/dist/index.mjs +21 -27
  257. package/node_modules/@radix-ui/react-portal/dist/index.mjs.map +7 -1
  258. package/node_modules/@radix-ui/react-portal/package.json +5 -5
  259. package/node_modules/@radix-ui/react-presence/dist/index.d.mts +5 -4
  260. package/node_modules/@radix-ui/react-presence/dist/index.d.ts +5 -4
  261. package/node_modules/@radix-ui/react-presence/dist/index.js +147 -132
  262. package/node_modules/@radix-ui/react-presence/dist/index.js.map +7 -1
  263. package/node_modules/@radix-ui/react-presence/dist/index.mjs +116 -129
  264. package/node_modules/@radix-ui/react-presence/dist/index.mjs.map +7 -1
  265. package/node_modules/@radix-ui/react-presence/package.json +5 -6
  266. package/node_modules/@radix-ui/react-primitive/dist/index.d.mts +8 -9
  267. package/node_modules/@radix-ui/react-primitive/dist/index.d.ts +8 -9
  268. package/node_modules/@radix-ui/react-primitive/dist/index.js +73 -100
  269. package/node_modules/@radix-ui/react-primitive/dist/index.js.map +7 -1
  270. package/node_modules/@radix-ui/react-primitive/dist/index.mjs +42 -93
  271. package/node_modules/@radix-ui/react-primitive/dist/index.mjs.map +7 -1
  272. package/node_modules/@radix-ui/react-primitive/package.json +4 -5
  273. package/node_modules/@radix-ui/react-roving-focus/dist/index.d.mts +25 -13
  274. package/node_modules/@radix-ui/react-roving-focus/dist/index.d.ts +25 -13
  275. package/node_modules/@radix-ui/react-roving-focus/dist/index.js +239 -247
  276. package/node_modules/@radix-ui/react-roving-focus/dist/index.js.map +7 -1
  277. package/node_modules/@radix-ui/react-roving-focus/dist/index.mjs +209 -238
  278. package/node_modules/@radix-ui/react-roving-focus/dist/index.mjs.map +7 -1
  279. package/node_modules/@radix-ui/react-roving-focus/package.json +12 -13
  280. package/node_modules/@radix-ui/react-select/dist/index.d.mts +77 -65
  281. package/node_modules/@radix-ui/react-select/dist/index.d.ts +77 -65
  282. package/node_modules/@radix-ui/react-select/dist/index.js +1107 -1235
  283. package/node_modules/@radix-ui/react-select/dist/index.js.map +7 -1
  284. package/node_modules/@radix-ui/react-select/dist/index.mjs +1076 -1197
  285. package/node_modules/@radix-ui/react-select/dist/index.mjs.map +7 -1
  286. package/node_modules/@radix-ui/react-select/package.json +23 -24
  287. package/node_modules/@radix-ui/react-slot/dist/index.d.mts +9 -7
  288. package/node_modules/@radix-ui/react-slot/dist/index.d.ts +9 -7
  289. package/node_modules/@radix-ui/react-slot/dist/index.js +107 -87
  290. package/node_modules/@radix-ui/react-slot/dist/index.js.map +7 -1
  291. package/node_modules/@radix-ui/react-slot/dist/index.mjs +76 -80
  292. package/node_modules/@radix-ui/react-slot/dist/index.mjs.map +7 -1
  293. package/node_modules/@radix-ui/react-slot/package.json +3 -4
  294. package/node_modules/@radix-ui/react-tabs/dist/index.d.mts +32 -21
  295. package/node_modules/@radix-ui/react-tabs/dist/index.d.ts +32 -21
  296. package/node_modules/@radix-ui/react-tabs/dist/index.js +217 -184
  297. package/node_modules/@radix-ui/react-tabs/dist/index.js.map +7 -1
  298. package/node_modules/@radix-ui/react-tabs/dist/index.mjs +185 -169
  299. package/node_modules/@radix-ui/react-tabs/dist/index.mjs.map +7 -1
  300. package/node_modules/@radix-ui/react-tabs/package.json +11 -12
  301. package/node_modules/@radix-ui/react-toast/dist/index.d.mts +43 -32
  302. package/node_modules/@radix-ui/react-toast/dist/index.d.ts +43 -32
  303. package/node_modules/@radix-ui/react-toast/dist/index.js +645 -715
  304. package/node_modules/@radix-ui/react-toast/dist/index.js.map +7 -1
  305. package/node_modules/@radix-ui/react-toast/dist/index.mjs +614 -695
  306. package/node_modules/@radix-ui/react-toast/dist/index.mjs.map +7 -1
  307. package/node_modules/@radix-ui/react-toast/package.json +15 -16
  308. package/node_modules/@radix-ui/react-use-callback-ref/dist/index.d.mts +2 -2
  309. package/node_modules/@radix-ui/react-use-callback-ref/dist/index.d.ts +2 -2
  310. package/node_modules/@radix-ui/react-use-callback-ref/dist/index.js +42 -23
  311. package/node_modules/@radix-ui/react-use-callback-ref/dist/index.js.map +7 -1
  312. package/node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs +11 -21
  313. package/node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs.map +7 -1
  314. package/node_modules/@radix-ui/react-use-callback-ref/package.json +2 -5
  315. package/node_modules/@radix-ui/react-use-controllable-state/dist/index.d.mts +4 -3
  316. package/node_modules/@radix-ui/react-use-controllable-state/dist/index.d.ts +4 -3
  317. package/node_modules/@radix-ui/react-use-controllable-state/dist/index.js +75 -52
  318. package/node_modules/@radix-ui/react-use-controllable-state/dist/index.js.map +7 -1
  319. package/node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs +44 -50
  320. package/node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs.map +7 -1
  321. package/node_modules/@radix-ui/react-use-controllable-state/package.json +3 -4
  322. package/node_modules/@radix-ui/react-use-escape-keydown/dist/index.d.mts +2 -2
  323. package/node_modules/@radix-ui/react-use-escape-keydown/dist/index.d.ts +2 -2
  324. package/node_modules/@radix-ui/react-use-escape-keydown/dist/index.js +50 -29
  325. package/node_modules/@radix-ui/react-use-escape-keydown/dist/index.js.map +7 -1
  326. package/node_modules/@radix-ui/react-use-escape-keydown/dist/index.mjs +17 -25
  327. package/node_modules/@radix-ui/react-use-escape-keydown/dist/index.mjs.map +7 -1
  328. package/node_modules/@radix-ui/react-use-escape-keydown/package.json +3 -4
  329. package/node_modules/@radix-ui/react-use-layout-effect/dist/index.d.mts +4 -3
  330. package/node_modules/@radix-ui/react-use-layout-effect/dist/index.d.ts +4 -3
  331. package/node_modules/@radix-ui/react-use-layout-effect/dist/index.js +38 -17
  332. package/node_modules/@radix-ui/react-use-layout-effect/dist/index.js.map +7 -1
  333. package/node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs +7 -15
  334. package/node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs.map +7 -1
  335. package/node_modules/@radix-ui/react-use-layout-effect/package.json +2 -5
  336. package/node_modules/@radix-ui/react-use-previous/dist/index.d.mts +2 -2
  337. package/node_modules/@radix-ui/react-use-previous/dist/index.d.ts +2 -2
  338. package/node_modules/@radix-ui/react-use-previous/dist/index.js +45 -26
  339. package/node_modules/@radix-ui/react-use-previous/dist/index.js.map +7 -1
  340. package/node_modules/@radix-ui/react-use-previous/dist/index.mjs +14 -24
  341. package/node_modules/@radix-ui/react-use-previous/dist/index.mjs.map +7 -1
  342. package/node_modules/@radix-ui/react-use-previous/package.json +2 -5
  343. package/node_modules/@radix-ui/react-use-rect/dist/index.d.mts +4 -3
  344. package/node_modules/@radix-ui/react-use-rect/dist/index.d.ts +4 -3
  345. package/node_modules/@radix-ui/react-use-rect/dist/index.js +52 -32
  346. package/node_modules/@radix-ui/react-use-rect/dist/index.js.map +7 -1
  347. package/node_modules/@radix-ui/react-use-rect/dist/index.mjs +19 -28
  348. package/node_modules/@radix-ui/react-use-rect/dist/index.mjs.map +7 -1
  349. package/node_modules/@radix-ui/react-use-rect/package.json +3 -4
  350. package/node_modules/@radix-ui/react-use-size/dist/index.d.mts +2 -2
  351. package/node_modules/@radix-ui/react-use-size/dist/index.d.ts +2 -2
  352. package/node_modules/@radix-ui/react-use-size/dist/index.js +70 -57
  353. package/node_modules/@radix-ui/react-use-size/dist/index.js.map +7 -1
  354. package/node_modules/@radix-ui/react-use-size/dist/index.mjs +39 -55
  355. package/node_modules/@radix-ui/react-use-size/dist/index.mjs.map +7 -1
  356. package/node_modules/@radix-ui/react-use-size/package.json +3 -4
  357. package/node_modules/@radix-ui/react-visually-hidden/dist/index.d.mts +8 -8
  358. package/node_modules/@radix-ui/react-visually-hidden/dist/index.d.ts +8 -8
  359. package/node_modules/@radix-ui/react-visually-hidden/dist/index.js +64 -41
  360. package/node_modules/@radix-ui/react-visually-hidden/dist/index.js.map +7 -1
  361. package/node_modules/@radix-ui/react-visually-hidden/dist/index.mjs +33 -35
  362. package/node_modules/@radix-ui/react-visually-hidden/dist/index.mjs.map +7 -1
  363. package/node_modules/@radix-ui/react-visually-hidden/package.json +4 -5
  364. package/node_modules/@radix-ui/rect/dist/index.d.mts +3 -3
  365. package/node_modules/@radix-ui/rect/dist/index.d.ts +3 -3
  366. package/node_modules/@radix-ui/rect/dist/index.js +69 -66
  367. package/node_modules/@radix-ui/rect/dist/index.js.map +7 -1
  368. package/node_modules/@radix-ui/rect/dist/index.mjs +47 -63
  369. package/node_modules/@radix-ui/rect/dist/index.mjs.map +7 -1
  370. package/node_modules/@radix-ui/rect/package.json +1 -4
  371. package/node_modules/@remix-run/react/CHANGELOG.md +18 -0
  372. package/node_modules/@remix-run/react/dist/_virtual/_rollupPluginBabelHelpers.js +1 -1
  373. package/node_modules/@remix-run/react/dist/browser.js +14 -3
  374. package/node_modules/@remix-run/react/dist/components.d.ts +9 -0
  375. package/node_modules/@remix-run/react/dist/components.js +23 -19
  376. package/node_modules/@remix-run/react/dist/data.js +1 -1
  377. package/node_modules/@remix-run/react/dist/entry.d.ts +1 -0
  378. package/node_modules/@remix-run/react/dist/errorBoundaries.d.ts +5 -2
  379. package/node_modules/@remix-run/react/dist/errorBoundaries.js +26 -5
  380. package/node_modules/@remix-run/react/dist/errors.js +1 -1
  381. package/node_modules/@remix-run/react/dist/esm/_virtual/_rollupPluginBabelHelpers.js +1 -1
  382. package/node_modules/@remix-run/react/dist/esm/browser.js +14 -3
  383. package/node_modules/@remix-run/react/dist/esm/components.js +24 -20
  384. package/node_modules/@remix-run/react/dist/esm/data.js +1 -1
  385. package/node_modules/@remix-run/react/dist/esm/errorBoundaries.js +26 -5
  386. package/node_modules/@remix-run/react/dist/esm/errors.js +1 -1
  387. package/node_modules/@remix-run/react/dist/esm/fallback.js +1 -1
  388. package/node_modules/@remix-run/react/dist/esm/fog-of-war.js +226 -0
  389. package/node_modules/@remix-run/react/dist/esm/index.js +1 -1
  390. package/node_modules/@remix-run/react/dist/esm/invariant.js +1 -1
  391. package/node_modules/@remix-run/react/dist/esm/links.js +2 -2
  392. package/node_modules/@remix-run/react/dist/esm/markup.js +1 -1
  393. package/node_modules/@remix-run/react/dist/esm/routeModules.js +1 -1
  394. package/node_modules/@remix-run/react/dist/esm/routes.js +1 -1
  395. package/node_modules/@remix-run/react/dist/esm/scroll-restoration.js +1 -1
  396. package/node_modules/@remix-run/react/dist/esm/server.js +1 -1
  397. package/node_modules/@remix-run/react/dist/esm/single-fetch.js +1 -1
  398. package/node_modules/@remix-run/react/dist/fallback.js +1 -1
  399. package/node_modules/@remix-run/react/dist/fog-of-war.d.ts +37 -0
  400. package/node_modules/@remix-run/react/dist/fog-of-war.js +254 -0
  401. package/node_modules/@remix-run/react/dist/index.js +1 -1
  402. package/node_modules/@remix-run/react/dist/invariant.js +1 -1
  403. package/node_modules/@remix-run/react/dist/links.js +2 -2
  404. package/node_modules/@remix-run/react/dist/markup.js +1 -1
  405. package/node_modules/@remix-run/react/dist/routeModules.js +1 -1
  406. package/node_modules/@remix-run/react/dist/routes.d.ts +1 -1
  407. package/node_modules/@remix-run/react/dist/routes.js +1 -1
  408. package/node_modules/@remix-run/react/dist/scroll-restoration.js +1 -1
  409. package/node_modules/@remix-run/react/dist/server.js +1 -1
  410. package/node_modules/@remix-run/react/dist/single-fetch.js +1 -1
  411. package/node_modules/@remix-run/react/package.json +8 -8
  412. package/node_modules/@remix-run/router/CHANGELOG.md +9 -0
  413. package/node_modules/@remix-run/router/dist/index.d.ts +1 -1
  414. package/node_modules/@remix-run/router/dist/router.cjs.js +467 -80
  415. package/node_modules/@remix-run/router/dist/router.cjs.js.map +1 -1
  416. package/node_modules/@remix-run/router/dist/router.d.ts +11 -1
  417. package/node_modules/@remix-run/router/dist/router.js +457 -76
  418. package/node_modules/@remix-run/router/dist/router.js.map +1 -1
  419. package/node_modules/@remix-run/router/dist/router.umd.js +467 -80
  420. package/node_modules/@remix-run/router/dist/router.umd.js.map +1 -1
  421. package/node_modules/@remix-run/router/dist/router.umd.min.js +2 -2
  422. package/node_modules/@remix-run/router/dist/router.umd.min.js.map +1 -1
  423. package/node_modules/@remix-run/router/dist/utils.d.ts +9 -1
  424. package/node_modules/@remix-run/router/index.ts +1 -0
  425. package/node_modules/@remix-run/router/package.json +1 -1
  426. package/node_modules/@remix-run/router/router.ts +586 -73
  427. package/node_modules/@remix-run/router/utils.ts +51 -8
  428. package/node_modules/@remix-run/server-runtime/CHANGELOG.md +17 -0
  429. package/node_modules/@remix-run/server-runtime/dist/cookies.js +1 -1
  430. package/node_modules/@remix-run/server-runtime/dist/data.js +1 -1
  431. package/node_modules/@remix-run/server-runtime/dist/deprecations.js +1 -1
  432. package/node_modules/@remix-run/server-runtime/dist/dev.js +1 -1
  433. package/node_modules/@remix-run/server-runtime/dist/entry.d.ts +1 -0
  434. package/node_modules/@remix-run/server-runtime/dist/entry.js +1 -1
  435. package/node_modules/@remix-run/server-runtime/dist/errors.js +1 -1
  436. package/node_modules/@remix-run/server-runtime/dist/esm/cookies.js +1 -1
  437. package/node_modules/@remix-run/server-runtime/dist/esm/data.js +1 -1
  438. package/node_modules/@remix-run/server-runtime/dist/esm/deprecations.js +1 -1
  439. package/node_modules/@remix-run/server-runtime/dist/esm/dev.js +1 -1
  440. package/node_modules/@remix-run/server-runtime/dist/esm/entry.js +1 -1
  441. package/node_modules/@remix-run/server-runtime/dist/esm/errors.js +1 -1
  442. package/node_modules/@remix-run/server-runtime/dist/esm/formData.js +1 -1
  443. package/node_modules/@remix-run/server-runtime/dist/esm/headers.js +1 -1
  444. package/node_modules/@remix-run/server-runtime/dist/esm/index.js +1 -1
  445. package/node_modules/@remix-run/server-runtime/dist/esm/invariant.js +1 -1
  446. package/node_modules/@remix-run/server-runtime/dist/esm/markup.js +1 -1
  447. package/node_modules/@remix-run/server-runtime/dist/esm/mode.js +1 -1
  448. package/node_modules/@remix-run/server-runtime/dist/esm/responses.js +1 -1
  449. package/node_modules/@remix-run/server-runtime/dist/esm/routeMatching.js +1 -1
  450. package/node_modules/@remix-run/server-runtime/dist/esm/routes.js +1 -1
  451. package/node_modules/@remix-run/server-runtime/dist/esm/server.js +76 -11
  452. package/node_modules/@remix-run/server-runtime/dist/esm/serverHandoff.js +1 -1
  453. package/node_modules/@remix-run/server-runtime/dist/esm/sessions/cookieStorage.js +1 -1
  454. package/node_modules/@remix-run/server-runtime/dist/esm/sessions/memoryStorage.js +1 -1
  455. package/node_modules/@remix-run/server-runtime/dist/esm/sessions.js +1 -1
  456. package/node_modules/@remix-run/server-runtime/dist/esm/single-fetch.js +17 -8
  457. package/node_modules/@remix-run/server-runtime/dist/esm/upload/errors.js +1 -1
  458. package/node_modules/@remix-run/server-runtime/dist/esm/upload/memoryUploadHandler.js +1 -1
  459. package/node_modules/@remix-run/server-runtime/dist/esm/warnings.js +1 -1
  460. package/node_modules/@remix-run/server-runtime/dist/formData.js +1 -1
  461. package/node_modules/@remix-run/server-runtime/dist/headers.js +1 -1
  462. package/node_modules/@remix-run/server-runtime/dist/index.js +1 -1
  463. package/node_modules/@remix-run/server-runtime/dist/invariant.js +1 -1
  464. package/node_modules/@remix-run/server-runtime/dist/markup.js +1 -1
  465. package/node_modules/@remix-run/server-runtime/dist/mode.js +1 -1
  466. package/node_modules/@remix-run/server-runtime/dist/responses.js +1 -1
  467. package/node_modules/@remix-run/server-runtime/dist/routeMatching.js +1 -1
  468. package/node_modules/@remix-run/server-runtime/dist/routes.js +1 -1
  469. package/node_modules/@remix-run/server-runtime/dist/server.js +70 -5
  470. package/node_modules/@remix-run/server-runtime/dist/serverHandoff.js +1 -1
  471. package/node_modules/@remix-run/server-runtime/dist/sessions/cookieStorage.js +1 -1
  472. package/node_modules/@remix-run/server-runtime/dist/sessions/memoryStorage.js +1 -1
  473. package/node_modules/@remix-run/server-runtime/dist/sessions.js +1 -1
  474. package/node_modules/@remix-run/server-runtime/dist/single-fetch.d.ts +3 -0
  475. package/node_modules/@remix-run/server-runtime/dist/single-fetch.js +18 -7
  476. package/node_modules/@remix-run/server-runtime/dist/upload/errors.js +1 -1
  477. package/node_modules/@remix-run/server-runtime/dist/upload/memoryUploadHandler.js +1 -1
  478. package/node_modules/@remix-run/server-runtime/dist/warnings.js +1 -1
  479. package/node_modules/@remix-run/server-runtime/package.json +3 -3
  480. package/node_modules/deep-eql/index.js +10 -5
  481. package/node_modules/deep-eql/package.json +1 -1
  482. package/node_modules/framer-motion/dist/cjs/{dom-entry-DSxBucW4.js → dom-entry-GDJJhIpT.js} +59 -106
  483. package/node_modules/framer-motion/dist/cjs/dom-entry.js +1 -1
  484. package/node_modules/framer-motion/dist/cjs/index.js +123 -36
  485. package/node_modules/framer-motion/dist/dom.js +1 -1
  486. package/node_modules/framer-motion/dist/es/gestures/drag/VisualElementDragControls.mjs +3 -3
  487. package/node_modules/framer-motion/dist/es/motion/features/animation/index.mjs +6 -3
  488. package/node_modules/framer-motion/dist/es/motion/index.mjs +33 -13
  489. package/node_modules/framer-motion/dist/es/motion/utils/use-motion-ref.mjs +6 -3
  490. package/node_modules/framer-motion/dist/es/motion/utils/use-visual-element.mjs +54 -3
  491. package/node_modules/framer-motion/dist/es/projection/node/create-projection-node.mjs +5 -2
  492. package/node_modules/framer-motion/dist/es/projection-entry.mjs +11 -0
  493. package/node_modules/framer-motion/dist/es/render/VisualElement.mjs +30 -78
  494. package/node_modules/framer-motion/dist/es/render/utils/animation-state.mjs +5 -1
  495. package/node_modules/framer-motion/dist/es/render/utils/motion-values.mjs +1 -1
  496. package/node_modules/framer-motion/dist/es/utils/mix/color.mjs +8 -2
  497. package/node_modules/framer-motion/dist/es/utils/mix/complex.mjs +1 -3
  498. package/node_modules/framer-motion/dist/es/utils/mix/immediate.mjs +5 -0
  499. package/node_modules/framer-motion/dist/es/value/index.mjs +1 -1
  500. package/node_modules/framer-motion/dist/es/value/types/color/rgba.mjs +1 -1
  501. package/node_modules/framer-motion/dist/framer-motion.dev.js +175 -134
  502. package/node_modules/framer-motion/dist/framer-motion.js +1 -1
  503. package/node_modules/framer-motion/dist/index.d.ts +78 -78
  504. package/node_modules/framer-motion/dist/three-entry.d.ts +59 -72
  505. package/node_modules/framer-motion/package.json +14 -28
  506. package/node_modules/react-remove-scroll/dist/es2015/SideEffect.js +15 -4
  507. package/node_modules/react-remove-scroll/dist/es2015/UI.js +2 -2
  508. package/node_modules/react-remove-scroll/dist/es2015/handleScroll.js +12 -4
  509. package/node_modules/react-remove-scroll/dist/es2015/types.d.ts +10 -2
  510. package/node_modules/react-remove-scroll/dist/es2019/SideEffect.js +15 -4
  511. package/node_modules/react-remove-scroll/dist/es2019/UI.js +2 -2
  512. package/node_modules/react-remove-scroll/dist/es2019/handleScroll.js +12 -4
  513. package/node_modules/react-remove-scroll/dist/es2019/types.d.ts +10 -2
  514. package/node_modules/react-remove-scroll/dist/es5/SideEffect.js +15 -4
  515. package/node_modules/react-remove-scroll/dist/es5/UI.js +2 -2
  516. package/node_modules/react-remove-scroll/dist/es5/handleScroll.js +12 -4
  517. package/node_modules/react-remove-scroll/dist/es5/types.d.ts +10 -2
  518. package/node_modules/react-remove-scroll/dist/index.js +93 -0
  519. package/node_modules/react-remove-scroll/package.json +4 -3
  520. package/node_modules/react-router/CHANGELOG.md +14 -0
  521. package/node_modules/react-router/dist/index.d.ts +4 -1
  522. package/node_modules/react-router/dist/index.js +3 -2
  523. package/node_modules/react-router/dist/index.js.map +1 -1
  524. package/node_modules/react-router/dist/main.js +1 -1
  525. package/node_modules/react-router/dist/react-router.development.js +3 -2
  526. package/node_modules/react-router/dist/react-router.development.js.map +1 -1
  527. package/node_modules/react-router/dist/react-router.production.min.js +2 -2
  528. package/node_modules/react-router/dist/react-router.production.min.js.map +1 -1
  529. package/node_modules/react-router/dist/umd/react-router.development.js +3 -2
  530. package/node_modules/react-router/dist/umd/react-router.development.js.map +1 -1
  531. package/node_modules/react-router/dist/umd/react-router.production.min.js +2 -2
  532. package/node_modules/react-router/dist/umd/react-router.production.min.js.map +1 -1
  533. package/node_modules/react-router/package.json +3 -3
  534. package/node_modules/react-router-dom/CHANGELOG.md +17 -0
  535. package/node_modules/react-router-dom/dist/dom.d.ts +29 -16
  536. package/node_modules/react-router-dom/dist/index.d.ts +18 -6
  537. package/node_modules/react-router-dom/dist/index.js +3 -1
  538. package/node_modules/react-router-dom/dist/index.js.map +1 -1
  539. package/node_modules/react-router-dom/dist/main.js +1 -1
  540. package/node_modules/react-router-dom/dist/react-router-dom.development.js +29 -1
  541. package/node_modules/react-router-dom/dist/react-router-dom.development.js.map +1 -1
  542. package/node_modules/react-router-dom/dist/react-router-dom.production.min.js +2 -2
  543. package/node_modules/react-router-dom/dist/react-router-dom.production.min.js.map +1 -1
  544. package/node_modules/react-router-dom/dist/server.js +4 -1
  545. package/node_modules/react-router-dom/dist/server.mjs +4 -1
  546. package/node_modules/react-router-dom/dist/umd/react-router-dom.development.js +29 -1
  547. package/node_modules/react-router-dom/dist/umd/react-router-dom.development.js.map +1 -1
  548. package/node_modules/react-router-dom/dist/umd/react-router-dom.production.min.js +2 -2
  549. package/node_modules/react-router-dom/dist/umd/react-router-dom.production.min.js.map +1 -1
  550. package/node_modules/react-router-dom/package.json +3 -3
  551. package/node_modules/react-router-dom/server.js +4 -1
  552. package/node_modules/react-router-dom/server.mjs +4 -1
  553. package/node_modules/{@remix-run/server-runtime/node_modules/source-map → source-map}/README.md +32 -112
  554. package/node_modules/source-map/dist/source-map.debug.js +3234 -0
  555. package/node_modules/source-map/dist/source-map.js +3233 -0
  556. package/node_modules/source-map/dist/source-map.min.js +2 -0
  557. package/node_modules/source-map/dist/source-map.min.js.map +1 -0
  558. package/node_modules/source-map/lib/array-set.js +121 -0
  559. package/node_modules/{@remix-run/server-runtime/node_modules/source-map → source-map}/lib/base64-vlq.js +40 -11
  560. package/node_modules/source-map/lib/base64.js +67 -0
  561. package/node_modules/{@remix-run/server-runtime/node_modules/source-map → source-map}/lib/binary-search.js +19 -15
  562. package/node_modules/source-map/lib/mapping-list.js +79 -0
  563. package/node_modules/source-map/lib/quick-sort.js +114 -0
  564. package/node_modules/source-map/lib/source-map-consumer.js +1145 -0
  565. package/node_modules/{@remix-run/server-runtime/node_modules/source-map → source-map}/lib/source-map-generator.js +169 -157
  566. package/node_modules/source-map/lib/source-node.js +413 -0
  567. package/node_modules/{@remix-run/server-runtime/node_modules/source-map → source-map}/lib/util.js +51 -109
  568. package/node_modules/{@remix-run/server-runtime/node_modules/source-map → source-map}/package.json +9 -27
  569. package/node_modules/source-map/source-map.d.ts +98 -0
  570. package/node_modules/source-map/source-map.js +8 -0
  571. package/node_modules/turbo-stream/dist/flatten.d.ts +1 -1
  572. package/node_modules/turbo-stream/dist/flatten.js +44 -9
  573. package/node_modules/turbo-stream/dist/turbo-stream.js +11 -2
  574. package/node_modules/turbo-stream/dist/turbo-stream.mjs +58 -7
  575. package/node_modules/turbo-stream/dist/unflatten.js +2 -0
  576. package/node_modules/turbo-stream/dist/utils.d.ts +1 -0
  577. package/node_modules/turbo-stream/dist/utils.js +2 -1
  578. package/node_modules/turbo-stream/package.json +1 -1
  579. package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/index.d.ts +1 -0
  580. package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/package.json +2 -1
  581. package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/readme.md +1 -0
  582. package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/is-literal.d.ts +6 -4
  583. package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/merge-deep.d.ts +8 -9
  584. package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/omit-deep.d.ts +3 -3
  585. package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/paths.d.ts +14 -8
  586. package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/schema.d.ts +12 -12
  587. package/node_modules/type-fest/source/simplify-deep.d.ts +115 -0
  588. package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/simplify.d.ts +1 -1
  589. package/package.json +4 -4
  590. package/build/client/assets/_exerciseNumber_.finished-DNtyBHjg.js +0 -2
  591. package/build/client/assets/_exerciseNumber_.finished-DNtyBHjg.js.map +0 -1
  592. package/build/client/assets/_layout-BR-Qyofe.js +0 -2
  593. package/build/client/assets/_layout-CNgYirUN.js +0 -2
  594. package/build/client/assets/_layout-CNgYirUN.js.map +0 -1
  595. package/build/client/assets/_layout-xu6a9He_.js +0 -2
  596. package/build/client/assets/_layout-xu6a9He_.js.map +0 -1
  597. package/build/client/assets/components-C5xBZAiL.js +0 -119
  598. package/build/client/assets/components-C5xBZAiL.js.map +0 -1
  599. package/build/client/assets/diff-BKsbFB6w.js +0 -42
  600. package/build/client/assets/diff-BKsbFB6w.js.map +0 -1
  601. package/build/client/assets/diff-KDzcgGYL.js +0 -2
  602. package/build/client/assets/discord-Xp0X4-Fl.js +0 -2
  603. package/build/client/assets/discord-Xp0X4-Fl.js.map +0 -1
  604. package/build/client/assets/entry.client-0j1eoieD.js +0 -80
  605. package/build/client/assets/entry.client-0j1eoieD.js.map +0 -1
  606. package/build/client/assets/epic-video-BwtXsHGU.js.map +0 -1
  607. package/build/client/assets/finished-Cu9PZd5Q.js +0 -2
  608. package/build/client/assets/finished-Cu9PZd5Q.js.map +0 -1
  609. package/build/client/assets/index-Bg9MMnnf.js.map +0 -1
  610. package/build/client/assets/index-D6ygCrVn.js +0 -37
  611. package/build/client/assets/index-D6ygCrVn.js.map +0 -1
  612. package/build/client/assets/index-r90CY6Wk.js +0 -8
  613. package/build/client/assets/index-r90CY6Wk.js.map +0 -1
  614. package/build/client/assets/manifest-b31ba37c.js +0 -1
  615. package/build/client/assets/mdx-BYvGbvEr.js +0 -2
  616. package/build/client/assets/misc-DNgC2Frq.js +0 -2
  617. package/build/client/assets/misc-DNgC2Frq.js.map +0 -1
  618. package/build/client/assets/progress-CF9Xwfxf.js +0 -2
  619. package/build/client/assets/progress-CF9Xwfxf.js.map +0 -1
  620. package/build/client/assets/root-BQ7V6fP4.js.map +0 -1
  621. package/build/client/assets/tailwind-Ck4g-nq0.css +0 -1
  622. package/build/client/assets/tooltip-Kw0lYWBI.js +0 -2
  623. package/build/client/assets/tooltip-Kw0lYWBI.js.map +0 -1
  624. package/node_modules/@babel/runtime/helpers/AsyncGenerator.js +0 -64
  625. package/node_modules/@babel/runtime/helpers/esm/AsyncGenerator.js +0 -64
  626. package/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimitLoose.js +0 -10
  627. package/node_modules/@babel/runtime/helpers/esm/slicedToArrayLoose.js +0 -8
  628. package/node_modules/@babel/runtime/helpers/iterableToArrayLimitLoose.js +0 -10
  629. package/node_modules/@babel/runtime/helpers/slicedToArrayLoose.js +0 -8
  630. package/node_modules/@conform-to/dom/rollup.config.js +0 -100
  631. package/node_modules/@conform-to/react/rollup.config.js +0 -102
  632. package/node_modules/@conform-to/zod/rollup.config.js +0 -100
  633. package/node_modules/@radix-ui/number/dist/index.d.ts.map +0 -1
  634. package/node_modules/@radix-ui/primitive/dist/index.d.ts.map +0 -1
  635. package/node_modules/@radix-ui/react-accordion/dist/index.d.ts.map +0 -1
  636. package/node_modules/@radix-ui/react-arrow/dist/index.d.ts.map +0 -1
  637. package/node_modules/@radix-ui/react-collapsible/dist/index.d.ts.map +0 -1
  638. package/node_modules/@radix-ui/react-collection/dist/index.d.ts.map +0 -1
  639. package/node_modules/@radix-ui/react-compose-refs/dist/index.d.ts.map +0 -1
  640. package/node_modules/@radix-ui/react-context/dist/index.d.ts.map +0 -1
  641. package/node_modules/@radix-ui/react-direction/dist/index.d.ts.map +0 -1
  642. package/node_modules/@radix-ui/react-dismissable-layer/dist/index.d.ts.map +0 -1
  643. package/node_modules/@radix-ui/react-focus-guards/dist/index.d.ts.map +0 -1
  644. package/node_modules/@radix-ui/react-focus-scope/dist/index.d.ts.map +0 -1
  645. package/node_modules/@radix-ui/react-id/dist/index.d.ts.map +0 -1
  646. package/node_modules/@radix-ui/react-popover/dist/index.d.ts.map +0 -1
  647. package/node_modules/@radix-ui/react-popper/dist/index.d.ts.map +0 -1
  648. package/node_modules/@radix-ui/react-portal/dist/index.d.ts.map +0 -1
  649. package/node_modules/@radix-ui/react-presence/dist/index.d.ts.map +0 -1
  650. package/node_modules/@radix-ui/react-primitive/dist/index.d.ts.map +0 -1
  651. package/node_modules/@radix-ui/react-roving-focus/dist/index.d.ts.map +0 -1
  652. package/node_modules/@radix-ui/react-select/dist/index.d.ts.map +0 -1
  653. package/node_modules/@radix-ui/react-slot/dist/index.d.ts.map +0 -1
  654. package/node_modules/@radix-ui/react-tabs/dist/index.d.ts.map +0 -1
  655. package/node_modules/@radix-ui/react-toast/dist/index.d.ts.map +0 -1
  656. package/node_modules/@radix-ui/react-use-callback-ref/dist/index.d.ts.map +0 -1
  657. package/node_modules/@radix-ui/react-use-controllable-state/dist/index.d.ts.map +0 -1
  658. package/node_modules/@radix-ui/react-use-escape-keydown/dist/index.d.ts.map +0 -1
  659. package/node_modules/@radix-ui/react-use-layout-effect/dist/index.d.ts.map +0 -1
  660. package/node_modules/@radix-ui/react-use-previous/dist/index.d.ts.map +0 -1
  661. package/node_modules/@radix-ui/react-use-rect/dist/index.d.ts.map +0 -1
  662. package/node_modules/@radix-ui/react-use-size/dist/index.d.ts.map +0 -1
  663. package/node_modules/@radix-ui/react-visually-hidden/dist/index.d.ts.map +0 -1
  664. package/node_modules/@radix-ui/rect/dist/index.d.ts.map +0 -1
  665. package/node_modules/@remix-run/server-runtime/node_modules/source-map/dist/source-map.js +0 -1
  666. package/node_modules/@remix-run/server-runtime/node_modules/source-map/lib/array-set.js +0 -100
  667. package/node_modules/@remix-run/server-runtime/node_modules/source-map/lib/base64.js +0 -18
  668. package/node_modules/@remix-run/server-runtime/node_modules/source-map/lib/mapping-list.js +0 -80
  669. package/node_modules/@remix-run/server-runtime/node_modules/source-map/lib/source-map-consumer.js +0 -1237
  670. package/node_modules/@remix-run/server-runtime/node_modules/source-map/lib/source-node.js +0 -404
  671. package/node_modules/@remix-run/server-runtime/node_modules/source-map/source-map.d.ts +0 -369
  672. package/node_modules/@remix-run/server-runtime/node_modules/source-map/source-map.js +0 -8
  673. package/node_modules/framer-motion/dist/projection.dev.js +0 -6659
  674. /package/node_modules/{@remix-run/server-runtime/node_modules/source-map → source-map}/LICENSE +0 -0
  675. /package/node_modules/{@remix-run/server-runtime/node_modules/source-map → source-map}/lib/mappings.wasm +0 -0
  676. /package/node_modules/{@remix-run/server-runtime/node_modules/source-map → source-map}/lib/read-wasm.js +0 -0
  677. /package/node_modules/{@remix-run/server-runtime/node_modules/source-map → source-map}/lib/wasm.js +0 -0
  678. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/and.d.ts +0 -0
  679. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/array-indices.d.ts +0 -0
  680. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/array-slice.d.ts +0 -0
  681. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/array-splice.d.ts +0 -0
  682. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/array-values.d.ts +0 -0
  683. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/async-return-type.d.ts +0 -0
  684. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/asyncify.d.ts +0 -0
  685. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/basic.d.ts +0 -0
  686. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/camel-case.d.ts +0 -0
  687. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/camel-cased-properties-deep.d.ts +0 -0
  688. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/camel-cased-properties.d.ts +0 -0
  689. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/conditional-except.d.ts +0 -0
  690. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/conditional-keys.d.ts +0 -0
  691. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/conditional-pick-deep.d.ts +0 -0
  692. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/conditional-pick.d.ts +0 -0
  693. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/conditional-simplify.d.ts +0 -0
  694. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/delimiter-case.d.ts +0 -0
  695. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/delimiter-cased-properties-deep.d.ts +0 -0
  696. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/delimiter-cased-properties.d.ts +0 -0
  697. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/distributed-omit.d.ts +0 -0
  698. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/distributed-pick.d.ts +0 -0
  699. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/empty-object.d.ts +0 -0
  700. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/enforce-optional.d.ts +0 -0
  701. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/entries.d.ts +0 -0
  702. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/entry.d.ts +0 -0
  703. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/exact.d.ts +0 -0
  704. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/except.d.ts +0 -0
  705. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/fixed-length-array.d.ts +0 -0
  706. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/get.d.ts +0 -0
  707. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/global-this.d.ts +0 -0
  708. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/greater-than-or-equal.d.ts +0 -0
  709. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/greater-than.d.ts +0 -0
  710. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/has-optional-keys.d.ts +0 -0
  711. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/has-readonly-keys.d.ts +0 -0
  712. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/has-required-keys.d.ts +0 -0
  713. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/has-writable-keys.d.ts +0 -0
  714. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/if-any.d.ts +0 -0
  715. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/if-empty-object.d.ts +0 -0
  716. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/if-never.d.ts +0 -0
  717. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/if-null.d.ts +0 -0
  718. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/if-unknown.d.ts +0 -0
  719. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/includes.d.ts +0 -0
  720. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/int-range.d.ts +0 -0
  721. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/internal.d.ts +0 -0
  722. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/invariant-of.d.ts +0 -0
  723. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/is-any.d.ts +0 -0
  724. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/is-equal.d.ts +0 -0
  725. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/is-float.d.ts +0 -0
  726. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/is-integer.d.ts +0 -0
  727. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/is-never.d.ts +0 -0
  728. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/is-null.d.ts +0 -0
  729. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/is-unknown.d.ts +0 -0
  730. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/iterable-element.d.ts +0 -0
  731. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/join.d.ts +0 -0
  732. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/jsonifiable.d.ts +0 -0
  733. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/jsonify.d.ts +0 -0
  734. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/kebab-case.d.ts +0 -0
  735. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/kebab-cased-properties-deep.d.ts +0 -0
  736. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/kebab-cased-properties.d.ts +0 -0
  737. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/keys-of-union.d.ts +0 -0
  738. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/last-array-element.d.ts +0 -0
  739. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/less-than-or-equal.d.ts +0 -0
  740. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/less-than.d.ts +0 -0
  741. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/literal-to-primitive-deep.d.ts +0 -0
  742. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/literal-to-primitive.d.ts +0 -0
  743. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/literal-union.d.ts +0 -0
  744. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/merge-exclusive.d.ts +0 -0
  745. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/merge.d.ts +0 -0
  746. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/multidimensional-array.d.ts +0 -0
  747. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/multidimensional-readonly-array.d.ts +0 -0
  748. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/non-empty-object.d.ts +0 -0
  749. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/numeric.d.ts +0 -0
  750. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/observable-like.d.ts +0 -0
  751. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/omit-index-signature.d.ts +0 -0
  752. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/opaque.d.ts +0 -0
  753. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/optional-keys-of.d.ts +0 -0
  754. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/or.d.ts +0 -0
  755. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/override-properties.d.ts +0 -0
  756. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/package-json.d.ts +0 -0
  757. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/partial-deep.d.ts +0 -0
  758. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/partial-on-undefined-deep.d.ts +0 -0
  759. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/pascal-case.d.ts +0 -0
  760. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/pascal-cased-properties-deep.d.ts +0 -0
  761. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/pascal-cased-properties.d.ts +0 -0
  762. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/pick-deep.d.ts +0 -0
  763. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/pick-index-signature.d.ts +0 -0
  764. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/primitive.d.ts +0 -0
  765. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/promisable.d.ts +0 -0
  766. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/readonly-deep.d.ts +0 -0
  767. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/readonly-keys-of.d.ts +0 -0
  768. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/readonly-tuple.d.ts +0 -0
  769. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/replace.d.ts +0 -0
  770. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/require-all-or-none.d.ts +0 -0
  771. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/require-at-least-one.d.ts +0 -0
  772. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/require-exactly-one.d.ts +0 -0
  773. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/require-one-or-none.d.ts +0 -0
  774. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/required-deep.d.ts +0 -0
  775. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/required-keys-of.d.ts +0 -0
  776. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/screaming-snake-case.d.ts +0 -0
  777. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/set-field-type.d.ts +0 -0
  778. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/set-non-nullable.d.ts +0 -0
  779. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/set-optional.d.ts +0 -0
  780. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/set-parameter-type.d.ts +0 -0
  781. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/set-readonly.d.ts +0 -0
  782. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/set-required.d.ts +0 -0
  783. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/set-return-type.d.ts +0 -0
  784. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/shared-union-fields-deep.d.ts +0 -0
  785. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/single-key-object.d.ts +0 -0
  786. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/snake-case.d.ts +0 -0
  787. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/snake-cased-properties-deep.d.ts +0 -0
  788. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/snake-cased-properties.d.ts +0 -0
  789. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/split-words.d.ts +0 -0
  790. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/split.d.ts +0 -0
  791. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/spread.d.ts +0 -0
  792. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/string-key-of.d.ts +0 -0
  793. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/string-slice.d.ts +0 -0
  794. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/stringified.d.ts +0 -0
  795. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/subtract.d.ts +0 -0
  796. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/sum.d.ts +0 -0
  797. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/tagged-union.d.ts +0 -0
  798. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/trim.d.ts +0 -0
  799. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/tsconfig-json.d.ts +0 -0
  800. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/tuple-to-union.d.ts +0 -0
  801. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/typed-array.d.ts +0 -0
  802. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/undefined-on-partial-deep.d.ts +0 -0
  803. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/union-to-intersection.d.ts +0 -0
  804. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/unknown-array.d.ts +0 -0
  805. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/unknown-record.d.ts +0 -0
  806. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/value-of.d.ts +0 -0
  807. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/writable-deep.d.ts +0 -0
  808. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/writable-keys-of.d.ts +0 -0
  809. /package/node_modules/{remix-utils/node_modules/type-fest → type-fest}/source/writable.d.ts +0 -0
@@ -33,14 +33,13 @@ import child_process, { spawn } from "child_process";
33
33
  import net from "node:net";
34
34
  import chalk from "chalk";
35
35
  import fkill from "fkill";
36
- import { promises } from "node:dns";
37
36
  import { createReadableStreamFromReadable, redirect, json, createCookieSessionStorage, defer } from "@remix-run/node";
38
37
  import { RemixServer, Link, useRouteError, useParams, isRouteErrorResponse, useNavigation, useFetchers, useRouteLoaderData, useRevalidator, useFetcher, useLoaderData, Outlet, Meta, Links, ScrollRestoration, Scripts, useLocation, NavLink, Await, useSubmit, useSearchParams, Form, useNavigate } from "@remix-run/react";
39
38
  import { isbot } from "isbot";
40
39
  import { renderToPipeableStream, renderToStaticMarkup } from "react-dom/server";
41
40
  import { cssBundleHref } from "@remix-run/css-bundle";
42
41
  import * as React from "react";
43
- import React__default, { useRef, useEffect, useMemo, useState, createContext, useContext, Suspense, forwardRef, useImperativeHandle, useReducer } from "react";
42
+ import React__default, { useRef, useEffect, useMemo, useState, createContext, useContext, useSyncExternalStore, Suspense, forwardRef, useImperativeHandle, useReducer } from "react";
44
43
  import { useSpinDelay } from "spin-delay";
45
44
  import { Index as Index$1 } from "confetti-react";
46
45
  import { ClientOnly } from "remix-utils/client-only";
@@ -60,6 +59,7 @@ import * as cookie from "cookie";
60
59
  import { createId } from "@paralleldrive/cuid2";
61
60
  import { usePartySocket } from "partysocket/react";
62
61
  import { motion, useAnimationControls } from "framer-motion";
62
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
63
63
  import { invariantResponse, invariant } from "@epic-web/invariant";
64
64
  import { ElementScrollRestoration } from "@epic-web/restore-scroll";
65
65
  import RealMuxPlayer from "@mux/mux-player-react";
@@ -118,15 +118,13 @@ async function time(fn, {
118
118
  }) {
119
119
  const timer = createTimer(type, desc);
120
120
  const promise = typeof fn === "function" ? fn() : fn;
121
- if (!timings)
122
- return promise;
121
+ if (!timings) return promise;
123
122
  const result = await promise;
124
123
  timer.end(timings);
125
124
  return result;
126
125
  }
127
126
  function getServerTimeHeader(timings) {
128
- if (!timings)
129
- return "";
127
+ if (!timings) return "";
130
128
  return Object.entries(timings).map(([key, timingInfos]) => {
131
129
  const dur = timingInfos.reduce((acc, timingInfo) => {
132
130
  const time2 = timingInfo.time ?? performance.now() - timingInfo.start;
@@ -146,8 +144,7 @@ function combineServerTimings(headers1, headers2) {
146
144
  return newHeaders.get("Server-Timing") ?? "";
147
145
  }
148
146
  function cachifiedTimingReporter(timings) {
149
- if (!timings)
150
- return;
147
+ if (!timings) return;
151
148
  return ({ key }) => {
152
149
  const cacheRetrievalTimer = createTimer(
153
150
  `cache:${key}`,
@@ -210,8 +207,7 @@ const fsCache = {
210
207
  }
211
208
  };
212
209
  async function deleteCache() {
213
- if (process.env.EPICSHOP_DEPLOYED)
214
- return null;
210
+ if (process.env.EPICSHOP_DEPLOYED) return null;
215
211
  try {
216
212
  if (await fsExtra.exists(cacheDir$1)) {
217
213
  await fsExtra.remove(cacheDir$1);
@@ -271,20 +267,15 @@ async function shouldForceFresh({
271
267
  request,
272
268
  key
273
269
  }) {
274
- if (typeof forceFresh === "boolean")
275
- return forceFresh;
270
+ if (typeof forceFresh === "boolean") return forceFresh;
276
271
  if (typeof forceFresh === "string" && key) {
277
272
  return forceFresh.split(",").includes(key);
278
273
  }
279
- if (!request)
280
- return false;
274
+ if (!request) return false;
281
275
  const fresh = new URL(request.url).searchParams.get("fresh");
282
- if (typeof fresh !== "string")
283
- return false;
284
- if (fresh === "")
285
- return true;
286
- if (!key)
287
- return false;
276
+ if (typeof fresh !== "string") return false;
277
+ if (fresh === "") return true;
278
+ if (!key) return false;
288
279
  return fresh.split(",").includes(key);
289
280
  }
290
281
  let watcher = global.__change_tracker_watcher__;
@@ -292,8 +283,7 @@ function getWatcher() {
292
283
  if (process.env.EPICSHOP_DEPLOYED ?? process.env.EPICSHOP_DISABLE_WATCHER === "true") {
293
284
  return null;
294
285
  }
295
- if (watcher)
296
- return watcher;
286
+ if (watcher) return watcher;
297
287
  const workshopRoot2 = process.env.EPICSHOP_CONTEXT_CWD ?? process.cwd();
298
288
  watcher = chokidar.watch(workshopRoot2, {
299
289
  ignoreInitial: true,
@@ -326,8 +316,7 @@ const transformRange = (value) => value == null ? void 0 : value.split(",").map(
326
316
  return [start, end ?? start];
327
317
  });
328
318
  const isRangeBounded = (range, ctx, lines) => {
329
- if (!lines || !Array.isArray(range))
330
- return;
319
+ if (!lines || !Array.isArray(range)) return;
331
320
  if (range.flat().some((r) => r < 1 || r > lines)) {
332
321
  ctx.addIssue({
333
322
  code: z.ZodIssueCode.custom,
@@ -337,8 +326,7 @@ const isRangeBounded = (range, ctx, lines) => {
337
326
  };
338
327
  const isRangeInOrder = (range) => Array.isArray(range) ? range.every(([a, b]) => !isNaN(Number(a)) && !isNaN(Number(b)) && b >= a) : true;
339
328
  const isRangesNonOverlapping = (range) => {
340
- if (!Array.isArray(range))
341
- return true;
329
+ if (!Array.isArray(range)) return true;
342
330
  return range.every(([a], i) => {
343
331
  var _a2;
344
332
  return i === 0 || (((_a2 = range[i - 1]) == null ? void 0 : _a2[1]) ?? 0) < a;
@@ -593,8 +581,7 @@ function trimCodeBlocks() {
593
581
  return;
594
582
  }
595
583
  const [codeStringNode] = codeNode.children;
596
- if (!codeStringNode)
597
- return;
584
+ if (!codeStringNode) return;
598
585
  if (codeStringNode.type !== "text") {
599
586
  console.warn(
600
587
  `trimCodeBlocks: Unexpected: codeStringNode type is not "text": ${codeStringNode.type}`
@@ -611,12 +598,9 @@ function removePreContainerDivs() {
611
598
  tree,
612
599
  { type: "element", tagName: "pre" },
613
600
  function visitor(node, index, parent) {
614
- if ((parent == null ? void 0 : parent.type) !== "element")
615
- return;
616
- if (parent.tagName !== "div")
617
- return;
618
- if (parent.children.length !== 1 && index === 0)
619
- return;
601
+ if ((parent == null ? void 0 : parent.type) !== "element") return;
602
+ if (parent.tagName !== "div") return;
603
+ if (parent.children.length !== 1 && index === 0) return;
620
604
  Object.assign(parent, node);
621
605
  }
622
606
  );
@@ -636,8 +620,7 @@ function checkFileExists$1(file) {
636
620
  const verboseLog = process.env.EPICSHOP_VERBOSE_LOG === "true" ? console.log : () => {
637
621
  };
638
622
  function validateEmbeddedFiles(embeddedFiles, lastCompiledTime) {
639
- if (process.env.NODE_ENV !== "development")
640
- return Promise.resolve(true);
623
+ if (process.env.NODE_ENV !== "development") return Promise.resolve(true);
641
624
  return Promise.all(
642
625
  Array.from(embeddedFiles).map(async ({ file }) => {
643
626
  const stat = await fs$1.promises.stat(file).catch(() => ({ mtimeMs: 0 }));
@@ -703,8 +686,7 @@ async function compileMdx(file, { request, forceFresh } = {}) {
703
686
  gfm,
704
687
  () => (tree) => {
705
688
  visit(tree, "heading", (node) => {
706
- if (title)
707
- return;
689
+ if (title) return;
708
690
  if (node.depth === 1) {
709
691
  visit(node, "text", (textNode) => {
710
692
  title = textNode.value.trim();
@@ -715,18 +697,14 @@ async function compileMdx(file, { request, forceFresh } = {}) {
715
697
  },
716
698
  () => (tree) => {
717
699
  visit(tree, "mdxJsxFlowElement", (jsxEl) => {
718
- if (jsxEl.name !== "EpicVideo")
719
- return;
700
+ if (jsxEl.name !== "EpicVideo") return;
720
701
  const urlAttr = jsxEl.attributes.find(
721
702
  (a) => a.type === "mdxJsxAttribute" && a.name === "url"
722
703
  );
723
- if (!urlAttr)
724
- return;
704
+ if (!urlAttr) return;
725
705
  let url = urlAttr.value;
726
- if (typeof url !== "string")
727
- return;
728
- if (url.endsWith("/"))
729
- url = url.slice(0, -1);
706
+ if (typeof url !== "string") return;
707
+ if (url.endsWith("/")) url = url.slice(0, -1);
730
708
  epicVideoEmbeds.push(url);
731
709
  });
732
710
  },
@@ -743,8 +721,7 @@ async function compileMdx(file, { request, forceFresh } = {}) {
743
721
  return options;
744
722
  }
745
723
  });
746
- if (!bundleResult)
747
- throw new Error(`Timeout for file: ${file}`);
724
+ if (!bundleResult) throw new Error(`Timeout for file: ${file}`);
748
725
  const result = { code: bundleResult.code, title, epicVideoEmbeds };
749
726
  await fsExtra.ensureDir(cacheDir);
750
727
  await fs$1.promises.writeFile(
@@ -794,8 +771,7 @@ async function compileMarkdownString(markdownString) {
794
771
  return options;
795
772
  }
796
773
  });
797
- if (!result)
798
- throw new Error(`Timed out compiling markdown string`);
774
+ if (!result) throw new Error(`Timed out compiling markdown string`);
799
775
  return result.code;
800
776
  } catch (error) {
801
777
  console.error(`Compilation error for code: `, markdownString, error);
@@ -816,8 +792,7 @@ async function updateEmbeddedFilesCache({
816
792
  embeddedFiles
817
793
  }) {
818
794
  var _a2;
819
- if (mdxFile.includes("playground"))
820
- return;
795
+ if (mdxFile.includes("playground")) return;
821
796
  let cachedList = await getEmbeddedFilesCache();
822
797
  const hash = cachedList ? md5(JSON.stringify(cachedList)) : null;
823
798
  if (cachedList) {
@@ -852,11 +827,9 @@ async function updateEmbeddedFilesCache({
852
827
  async function getEmbeddedFilesCache() {
853
828
  const key = EMBEDDED_FILES_CACHE_KEY;
854
829
  function getForceFresh2(cacheEntry) {
855
- if (!cacheEntry)
856
- return true;
830
+ if (!cacheEntry) return true;
857
831
  const latestModifiedTime = modifiedEmbeddedFilesTime.get(key);
858
- if (!latestModifiedTime)
859
- return void 0;
832
+ if (!latestModifiedTime) return void 0;
860
833
  return latestModifiedTime > cacheEntry.metadata.createdTime ? true : void 0;
861
834
  }
862
835
  return cachified$1({
@@ -881,8 +854,7 @@ async function getEmbeddedFilesCache() {
881
854
  }
882
855
  let _queue = null;
883
856
  async function getQueue() {
884
- if (_queue)
885
- return _queue;
857
+ if (_queue) return _queue;
886
858
  _queue = new PQueue({
887
859
  concurrency: 1,
888
860
  throwOnTimeout: true,
@@ -896,8 +868,7 @@ async function queuedBundleMDX(...args) {
896
868
  return result;
897
869
  }
898
870
  function getErrorMessage$1(error) {
899
- if (typeof error === "string")
900
- return error;
871
+ if (typeof error === "string") return error;
901
872
  if (error && typeof error === "object" && "message" in error && typeof error.message === "string") {
902
873
  return error.message;
903
874
  }
@@ -946,8 +917,7 @@ const colors = [
946
917
  "magentaBright"
947
918
  ];
948
919
  async function runAppDev(app) {
949
- if (isDeployed$1)
950
- throw new Error("cannot run apps in deployed mode");
920
+ if (isDeployed$1) throw new Error("cannot run apps in deployed mode");
951
921
  const key = app.name;
952
922
  if (devProcesses.has(key)) {
953
923
  return { status: "process-running", running: true };
@@ -1004,8 +974,7 @@ async function runAppDev(app) {
1004
974
  }
1005
975
  async function runAppTests(app) {
1006
976
  var _a2, _b2;
1007
- if (isDeployed$1)
1008
- throw new Error("cannot run tests in deployed mode");
977
+ if (isDeployed$1) throw new Error("cannot run tests in deployed mode");
1009
978
  const key = app.name;
1010
979
  if (app.test.type !== "script") {
1011
980
  return { status: "error", error: "no-test" };
@@ -1090,8 +1059,7 @@ function isPortAvailable(port2) {
1090
1059
  function isAppRunning(app) {
1091
1060
  try {
1092
1061
  const devProcess = devProcesses.get(app.name);
1093
- if (!devProcess)
1094
- return false;
1062
+ if (!devProcess) return false;
1095
1063
  devProcess.process.kill(0);
1096
1064
  return true;
1097
1065
  } catch {
@@ -1101,10 +1069,8 @@ function isAppRunning(app) {
1101
1069
  function isTestRunning(app) {
1102
1070
  try {
1103
1071
  const testProcess = testProcesses.get(app.name);
1104
- if (!testProcess)
1105
- return false;
1106
- if (testProcess.process === null)
1107
- return false;
1072
+ if (!testProcess) return false;
1073
+ if (testProcess.process === null) return false;
1108
1074
  testProcess.process.kill(0);
1109
1075
  return true;
1110
1076
  } catch {
@@ -1121,8 +1087,7 @@ function getProcesses() {
1121
1087
  return { devProcesses, testProcesses };
1122
1088
  }
1123
1089
  async function closeProcess(key) {
1124
- if (isDeployed$1)
1125
- throw new Error("cannot close processes in deployed mode");
1090
+ if (isDeployed$1) throw new Error("cannot close processes in deployed mode");
1126
1091
  const proc = devProcesses.get(key);
1127
1092
  if (proc) {
1128
1093
  const exitedPromise = new Promise(
@@ -1144,8 +1109,7 @@ async function closeProcess(key) {
1144
1109
  }
1145
1110
  const sleep = (t) => new Promise((resolve) => setTimeout(resolve, t));
1146
1111
  async function stopPort(port2) {
1147
- if (isDeployed$1)
1148
- throw new Error("cannot stop ports in deployed mode");
1112
+ if (isDeployed$1) throw new Error("cannot stop ports in deployed mode");
1149
1113
  await fkill(`:${port2}`, { force: true, silent: true });
1150
1114
  await waitForPortToBeAvailable(port2);
1151
1115
  }
@@ -1160,12 +1124,6 @@ async function waitForPortToBeAvailable(port2) {
1160
1124
  console.error("Timed out waiting for the port to become available");
1161
1125
  }
1162
1126
  }
1163
- async function checkConnection() {
1164
- return promises.resolve("example.com").then(
1165
- () => true,
1166
- () => false
1167
- );
1168
- }
1169
1127
  const PkgSchema = z$1.object({}).passthrough();
1170
1128
  async function getPkgProp(fullPath, prop, defaultValue) {
1171
1129
  let pkg;
@@ -1184,8 +1142,7 @@ async function getPkgProp(fullPath, prop, defaultValue) {
1184
1142
  let value = pkg;
1185
1143
  for (const p of propPath) {
1186
1144
  value = value[p];
1187
- if (value === void 0)
1188
- break;
1145
+ if (value === void 0) break;
1189
1146
  }
1190
1147
  if (value === void 0 && defaultValue === void 0) {
1191
1148
  throw new Error(
@@ -1340,11 +1297,9 @@ function init() {
1340
1297
  (_a2 = getWatcher()) == null ? void 0 : _a2.on("all", handleFileChanges);
1341
1298
  }
1342
1299
  function getForceFresh$1(cacheEntry) {
1343
- if (!cacheEntry)
1344
- return true;
1300
+ if (!cacheEntry) return true;
1345
1301
  const latestModifiedTime = Math.max(...Array.from(modifiedTimes.values()));
1346
- if (!latestModifiedTime)
1347
- return void 0;
1302
+ if (!latestModifiedTime) return void 0;
1348
1303
  return latestModifiedTime > cacheEntry.metadata.createdTime ? true : void 0;
1349
1304
  }
1350
1305
  function setModifiedTimesForDir(dir) {
@@ -1354,11 +1309,9 @@ function getForceFreshForDir(dir, cacheEntry) {
1354
1309
  if (!path$1.isAbsolute(dir)) {
1355
1310
  throw new Error(`Trying to get force fresh for non-absolute path: ${dir}`);
1356
1311
  }
1357
- if (!cacheEntry)
1358
- return true;
1312
+ if (!cacheEntry) return true;
1359
1313
  const modifiedTime = modifiedTimes.get(dir);
1360
- if (!modifiedTime)
1361
- return void 0;
1314
+ if (!modifiedTime) return void 0;
1362
1315
  return modifiedTime > cacheEntry.metadata.createdTime ? true : void 0;
1363
1316
  }
1364
1317
  async function readDir(dir) {
@@ -1416,8 +1369,7 @@ async function getExercises({
1416
1369
  const exercises = [];
1417
1370
  for (const dirName of exerciseDirs) {
1418
1371
  const exerciseNumber = extractExerciseNumber(dirName);
1419
- if (!exerciseNumber)
1420
- continue;
1372
+ if (!exerciseNumber) continue;
1421
1373
  const compiledReadme = await compileMdxIfExists(
1422
1374
  path$1.join(workshopRoot, "exercises", dirName, "README.mdx"),
1423
1375
  { request }
@@ -1479,21 +1431,15 @@ async function getApps({
1479
1431
  ...exampleApps
1480
1432
  ].filter(Boolean).sort((a, b) => {
1481
1433
  if (isPlaygroundApp(a)) {
1482
- if (isPlaygroundApp(b))
1483
- return a.name.localeCompare(b.name);
1484
- else
1485
- return 1;
1434
+ if (isPlaygroundApp(b)) return a.name.localeCompare(b.name);
1435
+ else return 1;
1486
1436
  }
1487
- if (isPlaygroundApp(b))
1488
- return 1;
1437
+ if (isPlaygroundApp(b)) return 1;
1489
1438
  if (isExampleApp(a)) {
1490
- if (isExampleApp(b))
1491
- return a.name.localeCompare(b.name);
1492
- else
1493
- return 1;
1439
+ if (isExampleApp(b)) return a.name.localeCompare(b.name);
1440
+ else return 1;
1494
1441
  }
1495
- if (isExampleApp(b))
1496
- return -1;
1442
+ if (isExampleApp(b)) return -1;
1497
1443
  if (a.type === b.type) {
1498
1444
  if (a.exerciseNumber === b.exerciseNumber) {
1499
1445
  return a.stepNumber - b.stepNumber;
@@ -1537,8 +1483,7 @@ function extractNumbersAndTypeFromAppNameOrPath(fullPathOrAppName) {
1537
1483
  ""
1538
1484
  );
1539
1485
  const [exerciseNumberPart, stepNumberPart] = relativePath.split(path$1.sep);
1540
- if (!exerciseNumberPart || !stepNumberPart)
1541
- return null;
1486
+ if (!exerciseNumberPart || !stepNumberPart) return null;
1542
1487
  const exerciseNumber = exerciseNumberPart.split(".")[0];
1543
1488
  const stepNumber = stepNumberPart.split(".")[0];
1544
1489
  const type = (_a2 = stepNumberPart.split(".")[1]) == null ? void 0 : _a2.split(".")[0];
@@ -1552,8 +1497,7 @@ function extractNumbersAndTypeFromAppNameOrPath(fullPathOrAppName) {
1552
1497
  info.type = type;
1553
1498
  }
1554
1499
  const result = AppIdInfoSchema.safeParse(info);
1555
- if (result.success)
1556
- return result.data;
1500
+ if (result.success) return result.data;
1557
1501
  return null;
1558
1502
  }
1559
1503
  async function getProblemDirs() {
@@ -1577,8 +1521,7 @@ function getPathname(fullPath) {
1577
1521
  return `/app/${appName}/`;
1578
1522
  }
1579
1523
  function getAppName(fullPath) {
1580
- if (/playground\/?$/.test(fullPath))
1581
- return "playground";
1524
+ if (/playground\/?$/.test(fullPath)) return "playground";
1582
1525
  if (/examples\/.+\/?$/.test(fullPath)) {
1583
1526
  const restOfPath = fullPath.replace(
1584
1527
  `${getWorkshopRoot()}${path$1.sep}examples${path$1.sep}`,
@@ -1596,8 +1539,7 @@ function getAppName(fullPath) {
1596
1539
  }
1597
1540
  }
1598
1541
  async function getFullPathFromAppName(appName) {
1599
- if (appName === "playground")
1600
- return path$1.join(workshopRoot, "playground");
1542
+ if (appName === "playground") return path$1.join(workshopRoot, "playground");
1601
1543
  if (appName.startsWith(".example")) {
1602
1544
  const relativePath = appName.replace(".example", "").split("__sep__").join(path$1.sep);
1603
1545
  return path$1.join(workshopRoot, "examples", relativePath);
@@ -1610,8 +1552,7 @@ async function getFullPathFromAppName(appName) {
1610
1552
  const appDirs = type === "problem" ? await getProblemDirs() : type === "solution" ? await getSolutionDirs() : [];
1611
1553
  const dir = appDirs.find((dir2) => {
1612
1554
  const info = extractNumbersAndTypeFromAppNameOrPath(dir2);
1613
- if (!info)
1614
- return false;
1555
+ if (!info) return false;
1615
1556
  return info.exerciseNumber === exerciseNumber && info.stepNumber === stepNumber;
1616
1557
  });
1617
1558
  return dir ?? appName;
@@ -1622,8 +1563,7 @@ async function findSolutionDir({
1622
1563
  const dirName = path$1.basename(fullPath);
1623
1564
  if (dirName.includes(".problem")) {
1624
1565
  const info = getAppDirInfo(dirName);
1625
- if (!info)
1626
- return null;
1566
+ if (!info) return null;
1627
1567
  const { stepNumber } = info;
1628
1568
  const paddedStepNumber = stepNumber.toString().padStart(2, "0");
1629
1569
  const parentDir = path$1.dirname(fullPath);
@@ -1650,8 +1590,7 @@ async function findProblemDir({
1650
1590
  const dirName = path$1.basename(fullPath);
1651
1591
  if (dirName.includes(".solution")) {
1652
1592
  const info = getAppDirInfo(dirName);
1653
- if (!info)
1654
- return null;
1593
+ if (!info) return null;
1655
1594
  const { stepNumber } = info;
1656
1595
  const paddedStepNumber = stepNumber.toString().padStart(2, "0");
1657
1596
  const parentDir = path$1.dirname(fullPath);
@@ -1729,10 +1668,8 @@ async function getPlaygroundApp({
1729
1668
  request,
1730
1669
  forceFresh: forceFreshPlaygroundDir || forceFreshBaseApp,
1731
1670
  getFreshValue: async () => {
1732
- if (!await exists(playgroundDir))
1733
- return null;
1734
- if (!baseAppName)
1735
- return null;
1671
+ if (!await exists(playgroundDir)) return null;
1672
+ if (!baseAppName) return null;
1736
1673
  const dirName = path$1.basename(playgroundDir);
1737
1674
  const name = getAppName(playgroundDir);
1738
1675
  const portNumber = 4e3;
@@ -1812,8 +1749,7 @@ async function getExampleApps({
1812
1749
  return null;
1813
1750
  })
1814
1751
  });
1815
- if (exampleApp)
1816
- exampleApps.push(exampleApp);
1752
+ if (exampleApp) exampleApps.push(exampleApp);
1817
1753
  }
1818
1754
  return exampleApps;
1819
1755
  }
@@ -1821,12 +1757,10 @@ async function getSolutionAppFromPath(fullPath, request) {
1821
1757
  const dirName = path$1.basename(fullPath);
1822
1758
  const parentDirName = path$1.basename(path$1.dirname(fullPath));
1823
1759
  const exerciseNumber = extractExerciseNumber(parentDirName);
1824
- if (!exerciseNumber)
1825
- return null;
1760
+ if (!exerciseNumber) return null;
1826
1761
  const name = getAppName(fullPath);
1827
1762
  const info = getAppDirInfo(dirName);
1828
- if (!info)
1829
- return null;
1763
+ if (!info) return null;
1830
1764
  const { stepNumber } = info;
1831
1765
  const portNumber = 7e3 + (exerciseNumber - 1) * 10 + stepNumber;
1832
1766
  const compiledReadme = await compileMdxIfExists(
@@ -1881,8 +1815,7 @@ async function getSolutionApps({
1881
1815
  return null;
1882
1816
  })
1883
1817
  });
1884
- if (solutionApp)
1885
- solutionApps.push(solutionApp);
1818
+ if (solutionApp) solutionApps.push(solutionApp);
1886
1819
  }
1887
1820
  return solutionApps;
1888
1821
  }
@@ -1890,12 +1823,10 @@ async function getProblemAppFromPath(fullPath, request) {
1890
1823
  const dirName = path$1.basename(fullPath);
1891
1824
  const parentDirName = path$1.basename(path$1.dirname(fullPath));
1892
1825
  const exerciseNumber = extractExerciseNumber(parentDirName);
1893
- if (!exerciseNumber)
1894
- return null;
1826
+ if (!exerciseNumber) return null;
1895
1827
  const name = getAppName(fullPath);
1896
1828
  const info = getAppDirInfo(dirName);
1897
- if (!info)
1898
- return null;
1829
+ if (!info) return null;
1899
1830
  const { stepNumber } = info;
1900
1831
  const portNumber = 6e3 + (exerciseNumber - 1) * 10 + stepNumber;
1901
1832
  const compiledReadme = await compileMdxIfExists(
@@ -1950,8 +1881,7 @@ async function getProblemApps({
1950
1881
  return null;
1951
1882
  })
1952
1883
  });
1953
- if (problemApp)
1954
- problemApps.push(problemApp);
1884
+ if (problemApp) problemApps.push(problemApp);
1955
1885
  }
1956
1886
  return problemApps;
1957
1887
  }
@@ -1989,8 +1919,7 @@ async function getExerciseApp(params, { request, timings } = {}) {
1989
1919
  const { type, exerciseNumber, stepNumber } = result.data;
1990
1920
  const apps = (await getApps({ request, timings })).filter(isExerciseStepApp);
1991
1921
  const exerciseApp = apps.find((app) => {
1992
- if (isExampleApp(app))
1993
- return false;
1922
+ if (isExampleApp(app)) return false;
1994
1923
  return app.exerciseNumber === exerciseNumber && app.stepNumber === stepNumber && app.type === type;
1995
1924
  });
1996
1925
  if (!exerciseApp) {
@@ -2066,25 +1995,18 @@ async function setPlayground(srcDir, { reset } = {}) {
2066
1995
  if (srcFile.includes(`${basename2}${path$1.sep}build`) || srcFile.includes(`${basename2}${path$1.sep}public${path$1.sep}build`)) {
2067
1996
  return false;
2068
1997
  }
2069
- if (srcFile === srcDir)
2070
- return true;
2071
- if (srcFile.includes("node_modules"))
2072
- return true;
2073
- if (srcFile.endsWith(".env"))
2074
- return true;
2075
- if (isIgnored(srcFile))
2076
- return false;
1998
+ if (srcFile === srcDir) return true;
1999
+ if (srcFile.includes("node_modules")) return true;
2000
+ if (srcFile.endsWith(".env")) return true;
2001
+ if (isIgnored(srcFile)) return false;
2077
2002
  try {
2078
2003
  const isDir = (await fsExtra.stat(srcFile)).isDirectory();
2079
- if (isDir)
2080
- return true;
2004
+ if (isDir) return true;
2081
2005
  const destIsDir = (await fsExtra.stat(destFile)).isDirectory();
2082
- if (destIsDir)
2083
- return true;
2006
+ if (destIsDir) return true;
2084
2007
  const currentContents = await fsExtra.readFile(destFile);
2085
2008
  const newContents = await fsExtra.readFile(srcFile);
2086
- if (currentContents.equals(newContents))
2087
- return false;
2009
+ if (currentContents.equals(newContents)) return false;
2088
2010
  return true;
2089
2011
  } catch {
2090
2012
  return true;
@@ -2147,8 +2069,7 @@ async function getPlaygroundAppName() {
2147
2069
  "utf8"
2148
2070
  );
2149
2071
  const { appName } = JSON.parse(jsonString);
2150
- if (typeof appName !== "string")
2151
- return null;
2072
+ if (typeof appName !== "string") return null;
2152
2073
  return appName;
2153
2074
  } catch {
2154
2075
  return null;
@@ -2159,8 +2080,7 @@ async function getDirModifiedTime(dir) {
2159
2080
  const files = await fs.promises.readdir(dir, { withFileTypes: true });
2160
2081
  const modifiedTimes2 = await Promise.all(
2161
2082
  files.map(async (file) => {
2162
- if (isIgnored(file.name))
2163
- return 0;
2083
+ if (isIgnored(file.name)) return 0;
2164
2084
  const filePath = path$1.join(dir, file.name);
2165
2085
  if (file.isDirectory()) {
2166
2086
  return getDirModifiedTime(filePath);
@@ -2366,8 +2286,7 @@ const DataSchema = z$1.object({
2366
2286
  const appDir = path.join(os.homedir(), ".epicshop");
2367
2287
  const dbPath = path.join(appDir, "data.json");
2368
2288
  async function deleteDb() {
2369
- if (process.env.EPICSHOP_DEPLOYED)
2370
- return null;
2289
+ if (process.env.EPICSHOP_DEPLOYED) return null;
2371
2290
  try {
2372
2291
  if (await fsExtra.exists(dbPath)) {
2373
2292
  await fsExtra.remove(dbPath);
@@ -2377,8 +2296,7 @@ async function deleteDb() {
2377
2296
  }
2378
2297
  }
2379
2298
  async function readDb() {
2380
- if (process.env.EPICSHOP_DEPLOYED)
2381
- return null;
2299
+ if (process.env.EPICSHOP_DEPLOYED) return null;
2382
2300
  try {
2383
2301
  if (await fsExtra.exists(dbPath)) {
2384
2302
  const db = DataSchema.parse(await fsExtra.readJSON(dbPath));
@@ -2401,8 +2319,7 @@ async function getAuthInfo() {
2401
2319
  async function getUserInfo() {
2402
2320
  var _a2, _b2;
2403
2321
  const db = await readDb();
2404
- if (!(db == null ? void 0 : db.authInfo))
2405
- return null;
2322
+ if (!(db == null ? void 0 : db.authInfo)) return null;
2406
2323
  return {
2407
2324
  id: db.authInfo.id,
2408
2325
  name: ((_a2 = db.discordMember) == null ? void 0 : _a2.displayName) ?? db.authInfo.name ?? null,
@@ -2542,17 +2459,11 @@ async function getPresentUsers(user, { timings, request } = {}) {
2542
2459
  async getFreshValue(context) {
2543
2460
  try {
2544
2461
  const response = await Promise.race([
2545
- (async () => {
2546
- const connected = await checkConnection();
2547
- if (!connected)
2548
- throw new Error(`No internet connection`);
2549
- return fetch(`${partykitBaseUrl}/presence`);
2550
- })(),
2462
+ fetch(`${partykitBaseUrl}/presence`),
2551
2463
  new Promise(
2552
- (resolve) => setTimeout(
2553
- () => resolve(new Response("Timeout", { status: 500 })),
2554
- 200
2555
- )
2464
+ (resolve) => setTimeout(() => {
2465
+ resolve(new Response("Timeout", { status: 500 }));
2466
+ }, 350)
2556
2467
  )
2557
2468
  ]);
2558
2469
  if (response.statusText === "Timeout") {
@@ -2571,8 +2482,9 @@ async function getPresentUsers(user, { timings, request } = {}) {
2571
2482
  } else {
2572
2483
  return uniqueUsers([...users, user]);
2573
2484
  }
2574
- } catch {
2485
+ } catch (error) {
2575
2486
  context.metadata.ttl = 300;
2487
+ console.log("aaaaaaaaaaaaaaaaa", error);
2576
2488
  return [];
2577
2489
  }
2578
2490
  }
@@ -2580,7 +2492,7 @@ async function getPresentUsers(user, { timings, request } = {}) {
2580
2492
  }
2581
2493
  function uniqueUsers(users) {
2582
2494
  const seen = /* @__PURE__ */ new Set();
2583
- return users.filter((user) => {
2495
+ return users.filter(Boolean).filter((user) => {
2584
2496
  if (seen.has(user.id)) {
2585
2497
  return false;
2586
2498
  }
@@ -2589,8 +2501,7 @@ function uniqueUsers(users) {
2589
2501
  });
2590
2502
  }
2591
2503
  function Confetti({ id }) {
2592
- if (!id)
2593
- return null;
2504
+ if (!id) return null;
2594
2505
  return /* @__PURE__ */ jsx(ClientOnly, { children: () => /* @__PURE__ */ jsx(
2595
2506
  Index$1,
2596
2507
  {
@@ -2902,8 +2813,7 @@ const Heading = React.forwardRef(function Heading2({ id, children, as: asProp, c
2902
2813
  );
2903
2814
  });
2904
2815
  function getErrorMessage(error) {
2905
- if (typeof error === "string")
2906
- return error;
2816
+ if (typeof error === "string") return error;
2907
2817
  if (error && typeof error === "object" && "message" in error && typeof error.message === "string") {
2908
2818
  return error.message;
2909
2819
  }
@@ -2957,8 +2867,7 @@ function getBaseUrl({
2957
2867
  function combineHeaders(...headers2) {
2958
2868
  const combined = new Headers();
2959
2869
  for (const header of headers2) {
2960
- if (!header)
2961
- continue;
2870
+ if (!header) continue;
2962
2871
  for (const [key, value] of new Headers(header).entries()) {
2963
2872
  combined.append(key, value);
2964
2873
  }
@@ -2968,8 +2877,7 @@ function combineHeaders(...headers2) {
2968
2877
  function debounce(fn, delay) {
2969
2878
  let timer = null;
2970
2879
  return (...args) => {
2971
- if (timer)
2972
- clearTimeout(timer);
2880
+ if (timer) clearTimeout(timer);
2973
2881
  timer = setTimeout(() => {
2974
2882
  fn(...args);
2975
2883
  }, delay);
@@ -3028,14 +2936,11 @@ function EpicProgress() {
3028
2936
  const isSubmitting = states.some((s) => s === "submitting");
3029
2937
  const isLoading = states.some((s) => s === "loading");
3030
2938
  useEffect(() => {
3031
- if (!ref.current)
3032
- return;
3033
- if (delayedPending)
3034
- setAnimationComplete(false);
2939
+ if (!ref.current) return;
2940
+ if (delayedPending) setAnimationComplete(false);
3035
2941
  const animationPromises = ref.current.getAnimations().map(({ finished }) => finished);
3036
2942
  void Promise.allSettled(animationPromises).then(() => {
3037
- if (!delayedPending)
3038
- setAnimationComplete(true);
2943
+ if (!delayedPending) setAnimationComplete(true);
3039
2944
  });
3040
2945
  }, [delayedPending]);
3041
2946
  return /* @__PURE__ */ jsx(
@@ -3078,25 +2983,31 @@ function ShowToast({ toast: toast$1 }) {
3078
2983
  const TooltipProvider = TooltipPrimitive.Provider;
3079
2984
  const Tooltip = TooltipPrimitive.Root;
3080
2985
  const TooltipTrigger = TooltipPrimitive.Trigger;
3081
- const TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(
3082
- TooltipPrimitive.Content,
3083
- {
3084
- ref,
3085
- sideOffset,
3086
- className: cn(
3087
- "z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
3088
- className
3089
- ),
3090
- ...props
3091
- }
3092
- ));
2986
+ function TooltipContent({
2987
+ className,
2988
+ sideOffset = 4,
2989
+ ref,
2990
+ ...props
2991
+ }) {
2992
+ return /* @__PURE__ */ jsx(
2993
+ TooltipPrimitive.Content,
2994
+ {
2995
+ ref,
2996
+ sideOffset,
2997
+ className: cn(
2998
+ "z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
2999
+ className
3000
+ ),
3001
+ ...props
3002
+ }
3003
+ );
3004
+ }
3093
3005
  TooltipContent.displayName = TooltipPrimitive.Content.displayName;
3094
3006
  function SimpleTooltip({
3095
3007
  content,
3096
3008
  children
3097
3009
  }) {
3098
- if (!content)
3099
- return children;
3010
+ if (!content) return children;
3100
3011
  return /* @__PURE__ */ jsxs(Tooltip, { children: [
3101
3012
  /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children }),
3102
3013
  /* @__PURE__ */ jsx(TooltipContent, { children: content })
@@ -3152,16 +3063,14 @@ function ErrorList({
3152
3063
  errors
3153
3064
  }) {
3154
3065
  const errorsToRender = errors == null ? void 0 : errors.filter(Boolean);
3155
- if (!(errorsToRender == null ? void 0 : errorsToRender.length))
3156
- return null;
3066
+ if (!(errorsToRender == null ? void 0 : errorsToRender.length)) return null;
3157
3067
  return /* @__PURE__ */ jsx("ul", { id, className: "space-y-1", children: errorsToRender.map((e) => /* @__PURE__ */ jsx("li", { className: "text-danger text-[10px]", children: e }, e)) });
3158
3068
  }
3159
3069
  const cookieName$1 = "EpicShop_theme";
3160
3070
  function getTheme(request) {
3161
3071
  const cookieHeader = request.headers.get("cookie");
3162
3072
  const parsed = cookieHeader ? cookie.parse(cookieHeader)[cookieName$1] : null;
3163
- if (parsed === "light" || parsed === "dark")
3164
- return parsed;
3073
+ if (parsed === "light" || parsed === "dark") return parsed;
3165
3074
  return null;
3166
3075
  }
3167
3076
  function setTheme(theme) {
@@ -3204,7 +3113,7 @@ function ThemeSwitch() {
3204
3113
  setIsHydrated(true);
3205
3114
  }, []);
3206
3115
  const [form] = useForm({
3207
- id: "onboarding",
3116
+ id: "theme-switcher",
3208
3117
  lastResult: fetcher.data,
3209
3118
  onValidate({ formData }) {
3210
3119
  return parseWithZod(formData, { schema: ThemeFormSchema });
@@ -3247,8 +3156,7 @@ function useTheme() {
3247
3156
  }
3248
3157
  );
3249
3158
  const optimisticTheme = (_a2 = fetcher == null ? void 0 : fetcher.formData) == null ? void 0 : _a2.get("theme");
3250
- if (optimisticTheme === "system")
3251
- return hints.theme;
3159
+ if (optimisticTheme === "system") return hints.theme;
3252
3160
  if (optimisticTheme === "light" || optimisticTheme === "dark") {
3253
3161
  return optimisticTheme;
3254
3162
  }
@@ -3261,7 +3169,7 @@ const route35 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
3261
3169
  useTheme
3262
3170
  }, Symbol.toStringTag, { value: "Module" }));
3263
3171
  const appStylesheetUrl = "/assets/app-BKC4z3M_.css";
3264
- const tailwindStylesheetUrl = "/assets/tailwind-Ck4g-nq0.css";
3172
+ const tailwindStylesheetUrl = "/assets/tailwind-D2vjZZFL.css";
3265
3173
  const cookieName = "EpicShop_confetti";
3266
3174
  function getConfetti(request) {
3267
3175
  const cookieHeader = request.headers.get("cookie");
@@ -3313,11 +3221,9 @@ const CachedEpicVideoInfoSchema = z$1.object({
3313
3221
  })
3314
3222
  ).or(z$1.null());
3315
3223
  async function getEpicVideoInfos(epicWebUrls, { request, timings } = {}) {
3316
- if (!epicWebUrls)
3317
- return {};
3224
+ if (!epicWebUrls) return {};
3318
3225
  const authInfo = await getAuthInfo();
3319
- if (ENV.EPICSHOP_DEPLOYED)
3320
- return {};
3226
+ if (ENV.EPICSHOP_DEPLOYED) return {};
3321
3227
  const epicVideoInfos = {};
3322
3228
  for (const epicVideoEmbed of epicWebUrls) {
3323
3229
  const epicVideoInfo = await getEpicVideoInfo({
@@ -3350,8 +3256,7 @@ async function getEpicVideoInfo({
3350
3256
  checkValue: CachedEpicVideoInfoSchema,
3351
3257
  async getFreshValue(context) {
3352
3258
  const epicWebUrl = new URL(epicVideoEmbed);
3353
- if (epicWebUrl.host !== "www.epicweb.dev")
3354
- return null;
3259
+ if (epicWebUrl.host !== "www.epicweb.dev") return null;
3355
3260
  const infoResponse = await fetch(
3356
3261
  `https://www.epicweb.dev/api${epicWebUrl.pathname}`,
3357
3262
  accessToken ? { headers: { authorization: `Bearer ${accessToken}` } } : void 0
@@ -3413,11 +3318,9 @@ async function getEpicProgress({
3413
3318
  request,
3414
3319
  forceFresh
3415
3320
  } = {}) {
3416
- if (ENV.EPICSHOP_DEPLOYED)
3417
- return [];
3321
+ if (ENV.EPICSHOP_DEPLOYED) return [];
3418
3322
  const authInfo = await getAuthInfo();
3419
- if (!authInfo)
3420
- return [];
3323
+ if (!authInfo) return [];
3421
3324
  const tokenPart = md5(authInfo.tokenSet.access_token);
3422
3325
  const EpicProgressSchema = z$1.array(
3423
3326
  z$1.object({
@@ -3456,14 +3359,11 @@ async function getProgress({
3456
3359
  timings,
3457
3360
  request
3458
3361
  } = {}) {
3459
- if (ENV.EPICSHOP_DEPLOYED)
3460
- return [];
3362
+ if (ENV.EPICSHOP_DEPLOYED) return [];
3461
3363
  const authInfo = await getAuthInfo();
3462
- if (!authInfo)
3463
- return [];
3364
+ if (!authInfo) return [];
3464
3365
  const epicWorkshopSlug = await getEpicWorkshopSlug();
3465
- if (!epicWorkshopSlug)
3466
- return [];
3366
+ if (!epicWorkshopSlug) return [];
3467
3367
  const [
3468
3368
  workshopData,
3469
3369
  epicProgress,
@@ -3595,11 +3495,9 @@ async function getWorkshopData(epicWorkshopSlug, {
3595
3495
  request,
3596
3496
  forceFresh
3597
3497
  } = {}) {
3598
- if (ENV.EPICSHOP_DEPLOYED)
3599
- return { sections: [] };
3498
+ if (ENV.EPICSHOP_DEPLOYED) return { sections: [] };
3600
3499
  const authInfo = await getAuthInfo();
3601
- if (!authInfo)
3602
- return { sections: [] };
3500
+ if (!authInfo) return { sections: [] };
3603
3501
  return cachified({
3604
3502
  key: `epic-workshop-data:${epicWorkshopSlug}`,
3605
3503
  cache: fsCache,
@@ -3646,13 +3544,10 @@ function usePresenceSocket(user) {
3646
3544
  const data = useRouteLoaderData("root");
3647
3545
  const [users, setUsers] = useState((data == null ? void 0 : data.presence.users) ?? []);
3648
3546
  const [clientId] = useState(() => {
3649
- if (typeof document === "undefined")
3650
- return null;
3651
- if (user)
3652
- return user.id;
3547
+ if (typeof document === "undefined") return null;
3548
+ if (user) return user.id;
3653
3549
  const clientId2 = sessionStorage.getItem("clientId");
3654
- if (clientId2)
3655
- return clientId2;
3550
+ if (clientId2) return clientId2;
3656
3551
  const newClientId = createId();
3657
3552
  sessionStorage.setItem("clientId", newClientId);
3658
3553
  return newClientId;
@@ -3664,8 +3559,7 @@ function usePresenceSocket(user) {
3664
3559
  const messageResult = MessageSchema.safeParse(
3665
3560
  JSON.parse(String(evt.data))
3666
3561
  );
3667
- if (!messageResult.success)
3668
- return;
3562
+ if (!messageResult.success) return;
3669
3563
  if (messageResult.data.type === "presence") {
3670
3564
  setUsers(messageResult.data.payload.users);
3671
3565
  }
@@ -3703,8 +3597,7 @@ function usePresenceSocket(user) {
3703
3597
  }
3704
3598
  const messageJson = message ? JSON.stringify(message) : null;
3705
3599
  useEffect(() => {
3706
- if (messageJson)
3707
- socket.send(messageJson);
3600
+ if (messageJson) socket.send(messageJson);
3708
3601
  }, [messageJson, socket]);
3709
3602
  const scoredUsers = scoreUsers(location, users);
3710
3603
  return { users: scoredUsers };
@@ -3729,8 +3622,7 @@ function scoreUsers(location, users) {
3729
3622
  return { user, score: Math.floor(score / available * 10) / 10 };
3730
3623
  });
3731
3624
  return scoredUsers.sort((a, b) => {
3732
- if (a.score === b.score)
3733
- return 0;
3625
+ if (a.score === b.score) return 0;
3734
3626
  return a.score > b.score ? -1 : 1;
3735
3627
  });
3736
3628
  }
@@ -3845,8 +3737,7 @@ const links = () => {
3845
3737
  ];
3846
3738
  };
3847
3739
  const meta$5 = ({ data }) => {
3848
- if (!data)
3849
- return [];
3740
+ if (!data) return [];
3850
3741
  return getSeoMetaTags({
3851
3742
  instructor: data.instructor,
3852
3743
  title: data.workshopTitle,
@@ -4104,6 +3995,103 @@ const route1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
4104
3995
  default: NotFound,
4105
3996
  loader: loader$r
4106
3997
  }, Symbol.toStringTag, { value: "Module" }));
3998
+ function makeMediaQueryStore(mediaQuery, serverSnapshot) {
3999
+ function getSnapshot() {
4000
+ return window.matchMedia(mediaQuery).matches;
4001
+ }
4002
+ function subscribe(callback) {
4003
+ const mediaQueryList = window.matchMedia(mediaQuery);
4004
+ mediaQueryList.addEventListener("change", callback);
4005
+ return () => {
4006
+ mediaQueryList.removeEventListener("change", callback);
4007
+ };
4008
+ }
4009
+ return function useMediaQuery() {
4010
+ return useSyncExternalStore(subscribe, getSnapshot, () => serverSnapshot);
4011
+ };
4012
+ }
4013
+ const Dialog = DialogPrimitive.Root;
4014
+ const DialogTrigger = DialogPrimitive.Trigger;
4015
+ const DialogPortal = DialogPrimitive.Portal;
4016
+ function DialogOverlay({
4017
+ className,
4018
+ ref,
4019
+ ...props
4020
+ }) {
4021
+ return /* @__PURE__ */ jsx(
4022
+ DialogPrimitive.Overlay,
4023
+ {
4024
+ ref,
4025
+ className: cn(
4026
+ "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",
4027
+ className
4028
+ ),
4029
+ ...props
4030
+ }
4031
+ );
4032
+ }
4033
+ DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
4034
+ function DialogContent({
4035
+ className,
4036
+ children,
4037
+ ref,
4038
+ ...props
4039
+ }) {
4040
+ return /* @__PURE__ */ jsxs(DialogPortal, { children: [
4041
+ /* @__PURE__ */ jsx(DialogOverlay, {}),
4042
+ /* @__PURE__ */ jsxs(
4043
+ DialogPrimitive.Content,
4044
+ {
4045
+ ref,
4046
+ className: cn(
4047
+ "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",
4048
+ className
4049
+ ),
4050
+ ...props,
4051
+ children: [
4052
+ children,
4053
+ /* @__PURE__ */ jsxs(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", children: [
4054
+ /* @__PURE__ */ jsx(Icon, { name: "Close" }),
4055
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
4056
+ ] })
4057
+ ]
4058
+ }
4059
+ )
4060
+ ] });
4061
+ }
4062
+ DialogContent.displayName = DialogPrimitive.Content.displayName;
4063
+ function DialogHeader({
4064
+ className,
4065
+ ...props
4066
+ }) {
4067
+ return /* @__PURE__ */ jsx(
4068
+ "div",
4069
+ {
4070
+ className: cn(
4071
+ "flex flex-col space-y-1.5 text-center sm:text-left",
4072
+ className
4073
+ ),
4074
+ ...props
4075
+ }
4076
+ );
4077
+ }
4078
+ DialogHeader.displayName = "DialogHeader";
4079
+ DialogPrimitive.Title.displayName;
4080
+ function DialogDescription({
4081
+ className,
4082
+ ref,
4083
+ ...props
4084
+ }) {
4085
+ return /* @__PURE__ */ jsx(
4086
+ DialogPrimitive.Description,
4087
+ {
4088
+ ref,
4089
+ className: cn("text-sm text-muted-foreground", className),
4090
+ ...props
4091
+ }
4092
+ );
4093
+ }
4094
+ DialogDescription.displayName = DialogPrimitive.Description.displayName;
4107
4095
  function useOptionalUser() {
4108
4096
  const data = useRouteLoaderData("root");
4109
4097
  return data == null ? void 0 : data.user;
@@ -4129,8 +4117,7 @@ function useEpicProgress() {
4129
4117
  return f.formAction === "/progress" && ((_a2 = f.formData) == null ? void 0 : _a2.has("complete"));
4130
4118
  }
4131
4119
  );
4132
- if (!progressFetcher || !(data == null ? void 0 : data.progress))
4133
- return (data == null ? void 0 : data.progress) ?? null;
4120
+ if (!progressFetcher || !(data == null ? void 0 : data.progress)) return (data == null ? void 0 : data.progress) ?? null;
4134
4121
  return data.progress.map((p) => {
4135
4122
  var _a2, _b2;
4136
4123
  const optimisticCompleted = ((_a2 = progressFetcher.formData) == null ? void 0 : _a2.get("complete")) === "true";
@@ -4147,49 +4134,34 @@ function useEpicProgress() {
4147
4134
  }
4148
4135
  function useRequireEpicProgress() {
4149
4136
  const progress = useEpicProgress();
4150
- if (!progress)
4151
- return [];
4137
+ if (!progress) return [];
4152
4138
  return progress;
4153
4139
  }
4154
4140
  function useNextExerciseRoute() {
4155
4141
  const progress = useEpicProgress();
4156
- if (!progress)
4157
- return null;
4142
+ if (!progress) return null;
4158
4143
  const scoreProgress = (a) => {
4159
- if (a.type === "workshop-instructions")
4160
- return 0;
4161
- if (a.type === "workshop-finished")
4162
- return 1e4;
4163
- if (a.type === "instructions")
4164
- return a.exerciseNumber * 100;
4165
- if (a.type === "step")
4166
- return a.exerciseNumber * 100 + a.stepNumber;
4167
- if (a.type === "finished")
4168
- return a.exerciseNumber * 100 + 100;
4169
- if (a.type === "unknown")
4170
- return 1e5;
4144
+ if (a.type === "workshop-instructions") return 0;
4145
+ if (a.type === "workshop-finished") return 1e4;
4146
+ if (a.type === "instructions") return a.exerciseNumber * 100;
4147
+ if (a.type === "step") return a.exerciseNumber * 100 + a.stepNumber;
4148
+ if (a.type === "finished") return a.exerciseNumber * 100 + 100;
4149
+ if (a.type === "unknown") return 1e5;
4171
4150
  return -1;
4172
4151
  };
4173
4152
  const sortedProgress = progress.sort((a, b) => {
4174
4153
  return scoreProgress(a) - scoreProgress(b);
4175
4154
  });
4176
4155
  const nextProgress = sortedProgress.find((p) => !p.epicCompletedAt);
4177
- if (!nextProgress)
4178
- return null;
4179
- if (nextProgress.type === "unknown")
4180
- return null;
4181
- if (nextProgress.type === "workshop-instructions")
4182
- return "/";
4183
- if (nextProgress.type === "workshop-finished")
4184
- return "/finished";
4156
+ if (!nextProgress) return null;
4157
+ if (nextProgress.type === "unknown") return null;
4158
+ if (nextProgress.type === "workshop-instructions") return "/";
4159
+ if (nextProgress.type === "workshop-finished") return "/finished";
4185
4160
  const ex = nextProgress.exerciseNumber.toString().padStart(2, "0");
4186
- if (nextProgress.type === "instructions")
4187
- return `/${ex}`;
4188
- if (nextProgress.type === "finished")
4189
- return `/${ex}/finished`;
4161
+ if (nextProgress.type === "instructions") return `/${ex}`;
4162
+ if (nextProgress.type === "finished") return `/${ex}/finished`;
4190
4163
  const st = nextProgress.stepNumber.toString().padStart(2, "0");
4191
- if (nextProgress.type === "step")
4192
- return `/${ex}/${st}/problem`;
4164
+ if (nextProgress.type === "step") return `/${ex}/${st}/problem`;
4193
4165
  return null;
4194
4166
  }
4195
4167
  const percentageClassNames = {
@@ -4207,13 +4179,11 @@ const percentageClassNames = {
4207
4179
  };
4208
4180
  function useExerciseProgressClassName(exerciseNumber) {
4209
4181
  const progress = useEpicProgress();
4210
- if (!(progress == null ? void 0 : progress.length))
4211
- return null;
4182
+ if (!(progress == null ? void 0 : progress.length)) return null;
4212
4183
  const exerciseProgress = progress.filter(
4213
4184
  (p) => (p.type === "instructions" || p.type === "step" || p.type === "finished") && p.exerciseNumber === exerciseNumber
4214
4185
  );
4215
- if (!exerciseProgress.length)
4216
- return null;
4186
+ if (!exerciseProgress.length) return null;
4217
4187
  const percentComlete = exerciseProgress.reduce(
4218
4188
  (acc, p) => p.epicCompletedAt ? acc + 1 : acc,
4219
4189
  0
@@ -4225,8 +4195,7 @@ function useExerciseProgressClassName(exerciseNumber) {
4225
4195
  }
4226
4196
  function useProgressItemClassName(progressItemSearch) {
4227
4197
  const progressItem = useProgressItem(progressItemSearch);
4228
- if (!(progressItem == null ? void 0 : progressItem.epicCompletedAt))
4229
- return null;
4198
+ if (!(progressItem == null ? void 0 : progressItem.epicCompletedAt)) return null;
4230
4199
  return `relative before:h-[100%] before:bg-highlight before:absolute before:left-0 before:top-0 before:w-[4px]`;
4231
4200
  }
4232
4201
  function useProgressItem({
@@ -4235,8 +4204,7 @@ function useProgressItem({
4235
4204
  type
4236
4205
  }) {
4237
4206
  const progress = useEpicProgress();
4238
- if (!(progress == null ? void 0 : progress.length))
4239
- return null;
4207
+ if (!(progress == null ? void 0 : progress.length)) return null;
4240
4208
  if (type === "workshop-finished" || type === "workshop-instructions") {
4241
4209
  return progress.find((p) => p.type === type) ?? null;
4242
4210
  } else if (type === "instructions" || type === "finished") {
@@ -4270,15 +4238,12 @@ async function action$b({ request }) {
4270
4238
  (p) => p.epicLessonSlug === lessonSlug
4271
4239
  );
4272
4240
  function getCompletionAnnouncement() {
4273
- if (!complete)
4274
- return null;
4275
- if (!lessonProgress)
4276
- return null;
4241
+ if (!complete) return null;
4242
+ if (!lessonProgress) return null;
4277
4243
  const allOtherAreFinished = beforeProgress.every(
4278
4244
  (p) => p.epicCompletedAt || p.epicLessonSlug === lessonProgress.epicLessonSlug
4279
4245
  );
4280
- if (allOtherAreFinished)
4281
- return "You completed the workshop!";
4246
+ if (allOtherAreFinished) return "You completed the workshop!";
4282
4247
  if (lessonProgress.type === "workshop-instructions" || lessonProgress.type === "unknown" || lessonProgress.type === "workshop-finished") {
4283
4248
  return null;
4284
4249
  }
@@ -4334,17 +4299,14 @@ function ProgressToggle({
4334
4299
  navigationLocationStateFrom
4335
4300
  ]);
4336
4301
  React.useEffect(() => {
4337
- if (!animationRef.current)
4338
- return;
4339
- if (!startAnimation)
4340
- return;
4302
+ if (!animationRef.current) return;
4303
+ if (!startAnimation) return;
4341
4304
  const animationPromises = animationRef.current.getAnimations().map(({ finished }) => finished);
4342
4305
  void Promise.allSettled(animationPromises).then(() => {
4343
4306
  setStartAnimation(false);
4344
4307
  });
4345
4308
  }, [startAnimation]);
4346
- if (ENV.EPICSHOP_DEPLOYED || !progressItem)
4347
- return null;
4309
+ if (ENV.EPICSHOP_DEPLOYED || !progressItem) return null;
4348
4310
  return /* @__PURE__ */ jsxs(progressFetcher.Form, { method: "POST", action: "/progress", children: [
4349
4311
  /* @__PURE__ */ jsx(
4350
4312
  "input",
@@ -4502,8 +4464,7 @@ function FacePile({ isMenuOpened }) {
4502
4464
  const { users } = usePresence();
4503
4465
  const limit = isMenuOpened ? 17 : 0;
4504
4466
  const numberOverLimit = users.length - limit;
4505
- if (!users.length)
4506
- return null;
4467
+ if (!users.length) return null;
4507
4468
  const tiffany = isMenuOpened && users.length === 1 ? /* @__PURE__ */ jsx(
4508
4469
  Link,
4509
4470
  {
@@ -4591,32 +4552,41 @@ function FacePile({ isMenuOpened }) {
4591
4552
  ] }) : null
4592
4553
  ] }) });
4593
4554
  }
4555
+ const useIsWide = makeMediaQueryStore("(min-width: 640px)", true);
4594
4556
  function App() {
4595
4557
  const user = useOptionalUser();
4558
+ const isWide = useIsWide();
4596
4559
  const [isMenuOpened, setMenuOpened] = React.useState(false);
4597
4560
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
4598
4561
  user ? null : /* @__PURE__ */ jsx(EpicWebBanner, {}),
4562
+ /* @__PURE__ */ jsx(
4563
+ MobileNavigation,
4564
+ {
4565
+ isMenuOpened,
4566
+ onMenuOpenChange: setMenuOpened
4567
+ }
4568
+ ),
4599
4569
  /* @__PURE__ */ jsxs(
4600
4570
  "div",
4601
4571
  {
4602
- className: cn("flex flex-grow", {
4603
- "h-[calc(100vh-64px-env(safe-area-inset-top)-env(safe-area-inset-bottom))]": !user,
4604
- "h-[calc(100vh-112px-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))]": ENV.EPICSHOP_DEPLOYED,
4605
- "h-[calc(100vh-env(safe-area-inset-top)-env(safe-area-inset-bottom))]": user
4572
+ className: cn("flex flex-grow flex-col sm:flex-row", {
4573
+ "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))]": !user,
4574
+ "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))]": user,
4575
+ "h-[unset]": !isWide && isMenuOpened
4606
4576
  }),
4607
4577
  children: [
4608
- /* @__PURE__ */ jsx(
4578
+ isWide ? /* @__PURE__ */ jsx(
4609
4579
  Navigation,
4610
4580
  {
4611
4581
  isMenuOpened,
4612
4582
  onMenuOpenChange: setMenuOpened
4613
4583
  }
4614
- ),
4584
+ ) : null,
4615
4585
  /* @__PURE__ */ jsx(
4616
4586
  "div",
4617
4587
  {
4618
4588
  className: cn(
4619
- "h-full w-full max-w-[calc(100%-56px)]",
4589
+ "h-full w-full max-w-full sm:max-w-[calc(100%-56px)]",
4620
4590
  isMenuOpened ? "hidden md:block" : ""
4621
4591
  ),
4622
4592
  children: /* @__PURE__ */ jsx(Outlet, {})
@@ -4628,8 +4598,7 @@ function App() {
4628
4598
  ] });
4629
4599
  }
4630
4600
  function getLocationLabel(location) {
4631
- if (!location)
4632
- return null;
4601
+ if (!location) return null;
4633
4602
  const { exercise } = location;
4634
4603
  const exercisePortion = [
4635
4604
  exercise ? [exercise.exerciseNumber, exercise.stepNumber].filter(Boolean).map((s) => s.toString().padStart(2, "0")).join("/") : null,
@@ -4638,118 +4607,438 @@ function getLocationLabel(location) {
4638
4607
  return { line1: location.workshopTitle, line2: exercisePortion };
4639
4608
  }
4640
4609
  function EpicWebBanner() {
4641
- return /* @__PURE__ */ jsxs(
4642
- "div",
4610
+ const isWide = useIsWide();
4611
+ const details = /* @__PURE__ */ jsx("div", { children: ENV.EPICSHOP_DEPLOYED ? /* @__PURE__ */ jsxs("div", { children: [
4612
+ `This is the deployed version. `,
4613
+ ENV.EPICSHOP_GITHUB_ROOT ? /* @__PURE__ */ jsxs(Fragment, { children: [
4614
+ /* @__PURE__ */ jsx(
4615
+ Link,
4616
+ {
4617
+ className: "underline",
4618
+ target: "_blank",
4619
+ rel: "noopener noreferrer",
4620
+ to: ENV.EPICSHOP_GITHUB_ROOT,
4621
+ children: "Run locally"
4622
+ }
4623
+ ),
4624
+ ` for full experience.`
4625
+ ] }) : null,
4626
+ " "
4627
+ ] }) : /* @__PURE__ */ jsxs("div", { children: [
4628
+ /* @__PURE__ */ jsx(Link, { to: "/login", className: "underline", children: "Login" }),
4629
+ " ",
4630
+ "or",
4631
+ " ",
4632
+ /* @__PURE__ */ jsx("a", { href: "https://www.epicweb.dev/login", className: "underline", children: "join for free" }),
4633
+ " ",
4634
+ "for the full experience."
4635
+ ] }) });
4636
+ return /* @__PURE__ */ 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: isWide ? /* @__PURE__ */ jsxs(Fragment, { children: [
4637
+ /* @__PURE__ */ jsxs("div", { className: "hidden flex-1 flex-wrap items-center gap-4 sm:flex", children: [
4638
+ /* @__PURE__ */ jsx(Icon, { name: "EpicWeb", size: "lg" }),
4639
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-wrap items-center", children: [
4640
+ /* @__PURE__ */ jsxs("p", { className: "mr-2", children: [
4641
+ "Welcome to the",
4642
+ " ",
4643
+ /* @__PURE__ */ jsx(
4644
+ Link,
4645
+ {
4646
+ to: "https://www.epicweb.dev",
4647
+ className: "underline",
4648
+ target: "_blank",
4649
+ children: "EpicWeb.dev"
4650
+ }
4651
+ ),
4652
+ " ",
4653
+ "Workshop app!"
4654
+ ] }),
4655
+ details
4656
+ ] })
4657
+ ] }),
4658
+ /* @__PURE__ */ jsxs("div", { className: "hidden h-full flex-col items-center sm:flex md:flex-row", children: [
4659
+ /* @__PURE__ */ jsxs(
4660
+ Link,
4661
+ {
4662
+ to: "https://www.epicweb.dev",
4663
+ target: "_blank",
4664
+ className: "flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold",
4665
+ children: [
4666
+ /* @__PURE__ */ jsx("span", { className: "drop-shadow-sm", children: "Join Epic Web" }),
4667
+ /* @__PURE__ */ jsx("span", { children: "↗︎" })
4668
+ ]
4669
+ }
4670
+ ),
4671
+ /* @__PURE__ */ jsxs(
4672
+ Link,
4673
+ {
4674
+ to: ENV.EPICSHOP_DEPLOYED ? "https://www.epicweb.dev/login" : "/login",
4675
+ 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",
4676
+ children: [
4677
+ /* @__PURE__ */ jsx(Icon, { name: "User", size: "lg" }),
4678
+ /* @__PURE__ */ jsx("span", { className: "drop-shadow-sm", children: "Login" })
4679
+ ]
4680
+ }
4681
+ )
4682
+ ] })
4683
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
4684
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-wrap items-center gap-4 sm:hidden", children: [
4685
+ /* @__PURE__ */ jsx("a", { href: "https://www.epicweb.dev", children: /* @__PURE__ */ jsx(Icon, { name: "EpicWeb", size: "lg" }) }),
4686
+ /* @__PURE__ */ jsxs(Dialog, { children: [
4687
+ /* @__PURE__ */ jsx(DialogTrigger, { children: /* @__PURE__ */ jsx(Icon, { name: "Question", size: "lg", className: "animate-pulse" }) }),
4688
+ /* @__PURE__ */ jsxs(DialogContent, { children: [
4689
+ /* @__PURE__ */ jsxs(DialogHeader, { children: [
4690
+ /* @__PURE__ */ jsx(Icon, { name: "EpicWeb", size: "lg" }),
4691
+ /* @__PURE__ */ jsx("span", { className: "text-lg font-semibold", children: "EpicWeb.dev" })
4692
+ ] }),
4693
+ /* @__PURE__ */ jsxs(DialogDescription, { children: [
4694
+ "Welcome to the",
4695
+ " ",
4696
+ /* @__PURE__ */ jsx(Link, { to: "https://www.epicweb.dev", className: "underline", children: "EpicWeb.dev" }),
4697
+ " ",
4698
+ "Workshop app!"
4699
+ ] }),
4700
+ details
4701
+ ] })
4702
+ ] })
4703
+ ] }),
4704
+ /* @__PURE__ */ jsxs("div", { className: "flex h-full items-center", children: [
4705
+ /* @__PURE__ */ jsxs(
4706
+ Link,
4707
+ {
4708
+ to: "https://www.epicweb.dev",
4709
+ target: "_blank",
4710
+ className: "flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold",
4711
+ children: [
4712
+ /* @__PURE__ */ jsx("span", { className: "drop-shadow-sm", children: "Join" }),
4713
+ /* @__PURE__ */ jsx("span", { children: "↗︎" })
4714
+ ]
4715
+ }
4716
+ ),
4717
+ /* @__PURE__ */ jsxs(
4718
+ Link,
4719
+ {
4720
+ to: ENV.EPICSHOP_DEPLOYED ? "https://www.epicweb.dev/login" : "/login",
4721
+ 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",
4722
+ children: [
4723
+ /* @__PURE__ */ jsx(Icon, { name: "User", size: "lg" }),
4724
+ /* @__PURE__ */ jsx("span", { className: "drop-shadow-sm", children: "Login" })
4725
+ ]
4726
+ }
4727
+ )
4728
+ ] })
4729
+ ] }) });
4730
+ }
4731
+ const itemVariants = {
4732
+ hidden: { opacity: 0, x: -20 },
4733
+ visible: { opacity: 1, x: 0 }
4734
+ };
4735
+ function NavigationExerciseListItem({
4736
+ exerciseNumber,
4737
+ children
4738
+ }) {
4739
+ const progressClassName = useExerciseProgressClassName(exerciseNumber);
4740
+ return /* @__PURE__ */ jsx(
4741
+ motion.li,
4643
4742
  {
4743
+ variants: itemVariants,
4644
4744
  className: cn(
4645
- "z-10 flex items-center justify-between border-b bg-gradient-to-tr from-blue-500 to-indigo-500 pl-4 text-white",
4646
- ENV.EPICSHOP_DEPLOYED ? "h-[112px] md:h-[64px]" : "h-16"
4745
+ // add gap of 3 to children, but using padding so the progress extends through the whole height
4746
+ "py-[6px] first:pt-3 last:pb-3",
4747
+ progressClassName ? `${progressClassName} before:border-t` : null
4647
4748
  ),
4749
+ children: /* @__PURE__ */ jsx("span", { className: "ml-2", children })
4750
+ }
4751
+ );
4752
+ }
4753
+ function NavigationExerciseStepListItem({
4754
+ children,
4755
+ ...progressItemSearch
4756
+ }) {
4757
+ const progressClassName = useProgressItemClassName(progressItemSearch);
4758
+ return /* @__PURE__ */ jsx(
4759
+ motion.li,
4760
+ {
4761
+ variants: itemVariants,
4762
+ className: cn(
4763
+ // add gap of 3 to children, but using padding so the progress extends through the whole height
4764
+ "py-[6px] first:pt-3 last:pb-3",
4765
+ progressClassName ? `${progressClassName} before:border-t` : null
4766
+ ),
4767
+ children: /* @__PURE__ */ jsx("span", { className: "ml-2", children })
4768
+ }
4769
+ );
4770
+ }
4771
+ function MobileNavigation({
4772
+ isMenuOpened,
4773
+ onMenuOpenChange: setMenuOpened
4774
+ }) {
4775
+ const data = useLoaderData();
4776
+ const user = useOptionalUser();
4777
+ const nextExerciseRoute = useNextExerciseRoute();
4778
+ const params = useParams();
4779
+ const { users } = usePresence();
4780
+ const listVariants = {
4781
+ visible: {
4782
+ opacity: 1,
4783
+ transition: {
4784
+ duration: 0.05,
4785
+ when: "beforeChildren",
4786
+ staggerChildren: 0.03
4787
+ }
4788
+ },
4789
+ hidden: {
4790
+ opacity: 0
4791
+ }
4792
+ };
4793
+ return /* @__PURE__ */ jsx("nav", { className: "flex w-full border-b sm:hidden", children: /* @__PURE__ */ jsx("div", { className: "w-full", children: /* @__PURE__ */ jsxs(
4794
+ "div",
4795
+ {
4796
+ className: cn("flex items-center", {
4797
+ "flex-col": isMenuOpened,
4798
+ "h-14": !isMenuOpened
4799
+ }),
4648
4800
  children: [
4649
- /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-wrap items-center gap-4", children: [
4650
- /* @__PURE__ */ jsx(Icon, { name: "EpicWeb", size: "lg" }),
4651
- /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-wrap items-center", children: [
4652
- /* @__PURE__ */ jsxs("p", { className: "mr-2", children: [
4653
- "Welcome to the",
4654
- " ",
4801
+ /* @__PURE__ */ jsx(
4802
+ NavToggle,
4803
+ {
4804
+ title: data.workshopTitle,
4805
+ isMenuOpened,
4806
+ setMenuOpened
4807
+ }
4808
+ ),
4809
+ isMenuOpened && /* @__PURE__ */ jsxs(
4810
+ motion.div,
4811
+ {
4812
+ className: "flex w-full flex-grow flex-col justify-between overflow-x-auto p-6 scrollbar-thin scrollbar-thumb-scrollbar",
4813
+ initial: { opacity: 0 },
4814
+ animate: { opacity: 1 },
4815
+ children: [
4655
4816
  /* @__PURE__ */ jsx(
4656
- Link,
4817
+ motion.ul,
4657
4818
  {
4658
- to: "https://www.epicweb.dev",
4659
- className: "underline",
4660
- target: "_blank",
4661
- children: "EpicWeb.dev"
4819
+ variants: listVariants,
4820
+ initial: "hidden",
4821
+ animate: "visible",
4822
+ className: "flex flex-col",
4823
+ children: data.exercises.map(({ exerciseNumber, title, steps }) => {
4824
+ const isActive = Number(params.exerciseNumber) === exerciseNumber;
4825
+ const showPlayground = !isActive && data.playground.exerciseNumber === exerciseNumber;
4826
+ const exerciseNum = exerciseNumber.toString().padStart(2, "0");
4827
+ return /* @__PURE__ */ jsxs(
4828
+ NavigationExerciseListItem,
4829
+ {
4830
+ exerciseNumber,
4831
+ children: [
4832
+ /* @__PURE__ */ jsxs(
4833
+ Link,
4834
+ {
4835
+ prefetch: "intent",
4836
+ to: `/${exerciseNum}`,
4837
+ className: clsx(
4838
+ "relative whitespace-nowrap px-2 py-0.5 pr-3 text-2xl font-bold outline-none hover:underline focus:underline",
4839
+ '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',
4840
+ { "bg-foreground text-background": isActive }
4841
+ ),
4842
+ children: [
4843
+ title,
4844
+ showPlayground ? " 🛝" : null
4845
+ ]
4846
+ }
4847
+ ),
4848
+ isActive ? /* @__PURE__ */ jsxs(
4849
+ motion.ul,
4850
+ {
4851
+ variants: listVariants,
4852
+ initial: "hidden",
4853
+ animate: "visible",
4854
+ className: "ml-4 mt-4 flex flex-col",
4855
+ children: [
4856
+ /* @__PURE__ */ jsx(
4857
+ NavigationExerciseStepListItem,
4858
+ {
4859
+ type: "instructions",
4860
+ exerciseNumber,
4861
+ children: /* @__PURE__ */ jsx(
4862
+ Link,
4863
+ {
4864
+ to: `/${exerciseNum}`,
4865
+ prefetch: "intent",
4866
+ className: clsx(
4867
+ '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',
4868
+ {
4869
+ "bg-foreground text-background": !params.stepNumber
4870
+ }
4871
+ ),
4872
+ children: "Intro"
4873
+ }
4874
+ )
4875
+ },
4876
+ exerciseNumber
4877
+ ),
4878
+ steps.filter(Boolean).map(({ name, stepNumber, title: title2 }) => {
4879
+ const isActive2 = Number(params.stepNumber) === stepNumber;
4880
+ const step = stepNumber.toString().padStart(2, "0");
4881
+ const isPlayground = name === data.playground.appName;
4882
+ return /* @__PURE__ */ jsx(
4883
+ NavigationExerciseStepListItem,
4884
+ {
4885
+ type: "step",
4886
+ stepNumber,
4887
+ exerciseNumber,
4888
+ children: /* @__PURE__ */ jsx(
4889
+ Link,
4890
+ {
4891
+ to: `/${exerciseNum}/${step}`,
4892
+ prefetch: "intent",
4893
+ className: clsx(
4894
+ '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',
4895
+ {
4896
+ "bg-foreground text-background": isActive2
4897
+ }
4898
+ ),
4899
+ children: isPlayground ? `${step}. ${title2} 🛝` : `${step}. ${title2}`
4900
+ }
4901
+ )
4902
+ },
4903
+ stepNumber
4904
+ );
4905
+ }),
4906
+ /* @__PURE__ */ jsx(
4907
+ NavigationExerciseStepListItem,
4908
+ {
4909
+ type: "finished",
4910
+ exerciseNumber,
4911
+ children: /* @__PURE__ */ jsx(
4912
+ NavLink,
4913
+ {
4914
+ to: `/${exerciseNum}/finished`,
4915
+ prefetch: "intent",
4916
+ className: ({ isActive: isActive2 }) => clsx(
4917
+ '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',
4918
+ {
4919
+ "bg-foreground text-background": isActive2
4920
+ }
4921
+ ),
4922
+ children: "📝 Elaboration"
4923
+ }
4924
+ )
4925
+ }
4926
+ )
4927
+ ]
4928
+ }
4929
+ ) : null
4930
+ ]
4931
+ },
4932
+ exerciseNumber
4933
+ );
4934
+ })
4662
4935
  }
4663
4936
  ),
4664
- " ",
4665
- "Workshop app!"
4666
- ] }),
4667
- ENV.EPICSHOP_DEPLOYED ? /* @__PURE__ */ jsxs("small", { className: "text-sm", children: [
4668
- "This is the deployed version.",
4669
- " ",
4670
- ENV.EPICSHOP_GITHUB_ROOT ? /* @__PURE__ */ jsx(
4671
- Link,
4937
+ /* @__PURE__ */ jsx("div", { className: "mt-6", children: /* @__PURE__ */ jsx(
4938
+ NavLink,
4672
4939
  {
4673
- className: "underline",
4674
- target: "_blank",
4675
- rel: "noopener noreferrer",
4676
- to: ENV.EPICSHOP_GITHUB_ROOT,
4677
- children: "Run locally"
4940
+ to: "/finished",
4941
+ className: ({ isActive }) => clsx(
4942
+ "relative whitespace-nowrap text-lg font-bold outline-none hover:underline focus:underline",
4943
+ {
4944
+ '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-[""]': isActive
4945
+ }
4946
+ ),
4947
+ children: "📝 Workshop Feedback"
4678
4948
  }
4679
- ) : null,
4680
- " ",
4681
- "for full experience."
4682
- ] }) : null
4683
- ] })
4684
- ] }),
4685
- /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col items-center md:flex-row", children: [
4686
- /* @__PURE__ */ jsxs(
4687
- Link,
4688
- {
4689
- to: "https://www.epicweb.dev",
4690
- target: "_blank",
4691
- className: "flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold",
4692
- children: [
4693
- /* @__PURE__ */ jsx("span", { className: "drop-shadow-sm", children: "Join Epic Web 🆓" }),
4694
- /* @__PURE__ */ jsx("span", { children: "↗︎" })
4695
- ]
4696
- }
4697
- ),
4698
- /* @__PURE__ */ jsxs(
4699
- Link,
4700
- {
4701
- to: ENV.EPICSHOP_DEPLOYED ? "https://www.epicweb.dev/login" : "/login",
4702
- 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",
4703
- children: [
4704
- /* @__PURE__ */ jsx(Icon, { name: "User", size: "lg" }),
4705
- /* @__PURE__ */ jsx("span", { className: "drop-shadow-sm", children: "Login" })
4706
- ]
4707
- }
4708
- )
4709
- ] })
4949
+ ) })
4950
+ ]
4951
+ }
4952
+ ),
4953
+ /* @__PURE__ */ jsx("div", { className: "flex-grow" }),
4954
+ /* @__PURE__ */ jsx(
4955
+ "div",
4956
+ {
4957
+ className: cn(
4958
+ "flex items-center justify-start p-4",
4959
+ isMenuOpened && users.length > 4 ? "min-h-14" : "h-14",
4960
+ {
4961
+ "w-full border-t": isMenuOpened,
4962
+ "border-l": !isMenuOpened
4963
+ }
4964
+ ),
4965
+ children: /* @__PURE__ */ jsx(FacePile, { isMenuOpened })
4966
+ }
4967
+ ),
4968
+ ENV.EPICSHOP_DEPLOYED ? null : user ? /* @__PURE__ */ jsx(SimpleTooltip, { content: isMenuOpened ? null : "Your account", children: /* @__PURE__ */ jsxs(
4969
+ Link,
4970
+ {
4971
+ className: cn(
4972
+ "flex h-14 items-center justify-start space-x-3 px-4 py-4 text-center no-underline hover:underline",
4973
+ {
4974
+ "border-l": !isMenuOpened,
4975
+ "w-full border-t": isMenuOpened
4976
+ }
4977
+ ),
4978
+ to: "/account",
4979
+ children: [
4980
+ user.avatarUrl ? /* @__PURE__ */ jsx(
4981
+ "img",
4982
+ {
4983
+ alt: user.name ?? user.email,
4984
+ src: user.avatarUrl,
4985
+ className: "h-full rounded-full"
4986
+ }
4987
+ ) : /* @__PURE__ */ jsx(Icon, { name: "User", className: "flex-shrink-0", size: "lg" }),
4988
+ isMenuOpened ? /* @__PURE__ */ jsx(
4989
+ motion.div,
4990
+ {
4991
+ className: "flex items-center whitespace-nowrap",
4992
+ initial: { opacity: 0 },
4993
+ animate: { opacity: 1 },
4994
+ children: "Your Account"
4995
+ }
4996
+ ) : /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Your account" })
4997
+ ]
4998
+ }
4999
+ ) }) : null,
5000
+ ENV.EPICSHOP_DEPLOYED ? null : user && nextExerciseRoute ? /* @__PURE__ */ jsx(
5001
+ SimpleTooltip,
5002
+ {
5003
+ content: isMenuOpened ? null : "Continue to next lesson",
5004
+ children: /* @__PURE__ */ jsxs(
5005
+ Link,
5006
+ {
5007
+ to: nextExerciseRoute,
5008
+ prefetch: "intent",
5009
+ className: clsx(
5010
+ "flex h-14 w-full items-center space-x-3 border-t px-4 py-4 pl-[18px] no-underline hover:underline"
5011
+ ),
5012
+ state: { from: "continue next lesson button" },
5013
+ children: [
5014
+ /* @__PURE__ */ jsx(Icon, { name: "FastForward", className: "flex-shrink-0", size: "md" }),
5015
+ isMenuOpened ? /* @__PURE__ */ jsx(
5016
+ motion.div,
5017
+ {
5018
+ className: "flex items-center whitespace-nowrap",
5019
+ initial: { opacity: 0 },
5020
+ animate: { opacity: 1 },
5021
+ children: "Continue to next lesson"
5022
+ }
5023
+ ) : /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Continue to next lesson" })
5024
+ ]
5025
+ }
5026
+ )
5027
+ }
5028
+ ) : null,
5029
+ /* @__PURE__ */ jsx(
5030
+ "div",
5031
+ {
5032
+ className: cn("h-14 self-start p-4 pt-[15px] sm:mb-4 sm:w-full", {
5033
+ "w-full border-t": isMenuOpened,
5034
+ "border-l": !isMenuOpened
5035
+ }),
5036
+ children: /* @__PURE__ */ jsx(ThemeSwitch, {})
5037
+ }
5038
+ )
4710
5039
  ]
4711
5040
  }
4712
- );
4713
- }
4714
- const itemVariants = {
4715
- hidden: { opacity: 0, x: -20 },
4716
- visible: { opacity: 1, x: 0 }
4717
- };
4718
- function NavigationExerciseListItem({
4719
- exerciseNumber,
4720
- children
4721
- }) {
4722
- const progressClassName = useExerciseProgressClassName(exerciseNumber);
4723
- return /* @__PURE__ */ jsx(
4724
- motion.li,
4725
- {
4726
- variants: itemVariants,
4727
- className: cn(
4728
- // add gap of 3 to children, but using padding so the progress extends through the whole height
4729
- "py-[6px] first:pt-3 last:pb-3",
4730
- progressClassName ? `${progressClassName} before:border-t` : null
4731
- ),
4732
- children: /* @__PURE__ */ jsx("span", { className: "ml-2", children })
4733
- }
4734
- );
4735
- }
4736
- function NavigationExerciseStepListItem({
4737
- children,
4738
- ...progressItemSearch
4739
- }) {
4740
- const progressClassName = useProgressItemClassName(progressItemSearch);
4741
- return /* @__PURE__ */ jsx(
4742
- motion.li,
4743
- {
4744
- variants: itemVariants,
4745
- className: cn(
4746
- // add gap of 3 to children, but using padding so the progress extends through the whole height
4747
- "py-[6px] first:pt-3 last:pb-3",
4748
- progressClassName ? `${progressClassName} before:border-t` : null
4749
- ),
4750
- children: /* @__PURE__ */ jsx("span", { className: "ml-2", children })
4751
- }
4752
- );
5041
+ ) }) });
4753
5042
  }
4754
5043
  const OPENED_MENU_WIDTH = 400;
4755
5044
  function Navigation({
@@ -4788,7 +5077,7 @@ function Navigation({
4788
5077
  }
4789
5078
  };
4790
5079
  const exNum = Number(params.exerciseNumber).toString().padStart(2, "0");
4791
- return /* @__PURE__ */ jsx("nav", { className: "flex border-r", children: /* @__PURE__ */ jsx(
5080
+ return /* @__PURE__ */ jsx("nav", { className: "hidden border-r sm:flex", children: /* @__PURE__ */ jsx(
4792
5081
  motion.div,
4793
5082
  {
4794
5083
  initial: isMenuOpened ? "open" : "close",
@@ -5049,7 +5338,7 @@ function NavToggle({
5049
5338
  const path01Controls = useAnimationControls();
5050
5339
  const path02Controls = useAnimationControls();
5051
5340
  async function toggleMenu() {
5052
- void menuControls.start(isMenuOpened ? "close" : "open");
5341
+ void (menuControls == null ? void 0 : menuControls.start(isMenuOpened ? "close" : "open"));
5053
5342
  setMenuOpened(!isMenuOpened);
5054
5343
  if (isMenuOpened) {
5055
5344
  void path01Controls.start(path01Variants.closed);
@@ -5066,8 +5355,7 @@ function NavToggle({
5066
5355
  latestToggleMenu.current = toggleMenu;
5067
5356
  });
5068
5357
  React.useEffect(() => {
5069
- if (!isMenuOpened)
5070
- return;
5358
+ if (!isMenuOpened) return;
5071
5359
  function handleKeyUp(event) {
5072
5360
  if (event.key === "Escape") {
5073
5361
  void latestToggleMenu.current();
@@ -5076,48 +5364,59 @@ function NavToggle({
5076
5364
  document.addEventListener("keyup", handleKeyUp);
5077
5365
  return () => document.removeEventListener("keyup", handleKeyUp);
5078
5366
  }, [isMenuOpened]);
5079
- return /* @__PURE__ */ jsxs("div", { className: "relative inline-flex h-14 w-full items-center justify-between overflow-hidden border-b", children: [
5080
- /* @__PURE__ */ jsx(
5081
- "button",
5082
- {
5083
- className: "flex h-14 w-14 items-center justify-center",
5084
- "aria-label": "Open Navigation menu",
5085
- onClick: toggleMenu,
5086
- children: /* @__PURE__ */ jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", children: [
5087
- /* @__PURE__ */ jsx(
5088
- motion.path,
5089
- {
5090
- ...path01Variants.closed,
5091
- animate: path01Controls,
5092
- transition: { duration: 0.2 },
5093
- stroke: "currentColor",
5094
- strokeWidth: 1.5
5095
- }
5096
- ),
5097
- /* @__PURE__ */ jsx(
5098
- motion.path,
5099
- {
5100
- ...path02Variants.closed,
5101
- animate: path02Controls,
5102
- transition: { duration: 0.2 },
5103
- stroke: "currentColor",
5104
- strokeWidth: 1.5
5105
- }
5106
- )
5107
- ] })
5108
- }
5109
- ),
5110
- isMenuOpened && /* @__PURE__ */ jsx(
5111
- motion.p,
5112
- {
5113
- transition: { delay: 0.2 },
5114
- initial: { opacity: 0, y: 5 },
5115
- animate: { opacity: 1, y: 0 },
5116
- className: "absolute right-5 whitespace-nowrap font-mono text-sm uppercase",
5117
- children: /* @__PURE__ */ jsx(Link, { to: "/", children: title })
5118
- }
5119
- )
5120
- ] });
5367
+ return /* @__PURE__ */ jsxs(
5368
+ "div",
5369
+ {
5370
+ className: cn(
5371
+ "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",
5372
+ {
5373
+ "w-full": isMenuOpened
5374
+ }
5375
+ ),
5376
+ children: [
5377
+ /* @__PURE__ */ jsx(
5378
+ "button",
5379
+ {
5380
+ className: "flex h-14 w-14 items-center justify-center",
5381
+ "aria-label": "Open Navigation menu",
5382
+ onClick: toggleMenu,
5383
+ children: /* @__PURE__ */ jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", children: [
5384
+ /* @__PURE__ */ jsx(
5385
+ motion.path,
5386
+ {
5387
+ ...path01Variants.closed,
5388
+ animate: path01Controls,
5389
+ transition: { duration: 0.2 },
5390
+ stroke: "currentColor",
5391
+ strokeWidth: 1.5
5392
+ }
5393
+ ),
5394
+ /* @__PURE__ */ jsx(
5395
+ motion.path,
5396
+ {
5397
+ ...path02Variants.closed,
5398
+ animate: path02Controls,
5399
+ transition: { duration: 0.2 },
5400
+ stroke: "currentColor",
5401
+ strokeWidth: 1.5
5402
+ }
5403
+ )
5404
+ ] })
5405
+ }
5406
+ ),
5407
+ isMenuOpened && /* @__PURE__ */ jsx(
5408
+ motion.p,
5409
+ {
5410
+ transition: { delay: 0.2 },
5411
+ initial: { opacity: 0, y: 5 },
5412
+ animate: { opacity: 1, y: 0 },
5413
+ className: "absolute right-5 whitespace-nowrap font-mono text-sm uppercase",
5414
+ children: /* @__PURE__ */ jsx(Link, { to: "/", children: title })
5415
+ }
5416
+ )
5417
+ ]
5418
+ }
5419
+ );
5121
5420
  }
5122
5421
  const route2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
5123
5422
  __proto__: null,
@@ -5180,15 +5479,12 @@ function MuxPlayer({
5180
5479
  const fetcherRef = useLatest(playerPreferencesFetcher);
5181
5480
  const playerPreferencesRef = useLatest(playerPreferences);
5182
5481
  React.useEffect(() => {
5183
- if (typeof document === "undefined")
5184
- return;
5482
+ if (typeof document === "undefined") return;
5185
5483
  const stored = sessionStorage.getItem(currentTimeSessionKey);
5186
- if (!stored)
5187
- return;
5484
+ if (!stored) return;
5188
5485
  try {
5189
5486
  const { time: time2, expiresAt } = PlaybackTimeSchema.parse(JSON.parse(stored));
5190
- if (expiresAt.getTime() < Date.now())
5191
- throw new Error("Time expired");
5487
+ if (expiresAt.getTime() < Date.now()) throw new Error("Time expired");
5192
5488
  setCurrentTime(time2);
5193
5489
  } catch {
5194
5490
  sessionStorage.removeItem(currentTimeSessionKey);
@@ -5196,8 +5492,7 @@ function MuxPlayer({
5196
5492
  }, [currentTimeSessionKey]);
5197
5493
  React.useEffect(() => {
5198
5494
  function handleUserKeyPress(e) {
5199
- if (!muxPlayerRef.current)
5200
- return;
5495
+ if (!muxPlayerRef.current) return;
5201
5496
  const activeElement = document.activeElement;
5202
5497
  const isContentEditable = activeElement instanceof HTMLElement ? activeElement.contentEditable === "true" : false;
5203
5498
  if (activeElement && !ignoredInputs.includes(activeElement.tagName.toLowerCase()) && !isContentEditable) {
@@ -5226,8 +5521,7 @@ function MuxPlayer({
5226
5521
  }, [muxPlayerRef]);
5227
5522
  const updatePreferences = useDebounce(() => {
5228
5523
  const player = muxPlayerRef.current;
5229
- if (!player)
5230
- return;
5524
+ if (!player) return;
5231
5525
  const subs = Array.from(player.textTracks ?? []).find(
5232
5526
  (t) => t.kind === "subtitles"
5233
5527
  );
@@ -5236,8 +5530,7 @@ function MuxPlayer({
5236
5530
  volumeRate: player.volume,
5237
5531
  subtitle: subs ? { id: subs.id, mode: subs.mode } : { id: null, mode: "disabled" }
5238
5532
  };
5239
- if (isDeepEqual(newPrefs, playerPreferencesRef.current))
5240
- return;
5533
+ if (isDeepEqual(newPrefs, playerPreferencesRef.current)) return;
5241
5534
  fetcherRef.current.submit(newPrefs, {
5242
5535
  method: "POST",
5243
5536
  action: "/video-player",
@@ -5246,11 +5539,9 @@ function MuxPlayer({
5246
5539
  }, 300);
5247
5540
  React.useEffect(() => {
5248
5541
  var _a2, _b2;
5249
- if (!metadataLoaded)
5250
- return;
5542
+ if (!metadataLoaded) return;
5251
5543
  const textTracks = (_a2 = muxPlayerRef.current) == null ? void 0 : _a2.textTracks;
5252
- if (!textTracks)
5253
- return;
5544
+ if (!textTracks) return;
5254
5545
  const subtitlePref = (_b2 = playerPreferencesRef.current) == null ? void 0 : _b2.subtitle;
5255
5546
  if (subtitlePref == null ? void 0 : subtitlePref.id) {
5256
5547
  const preferredTextTrack = textTracks.getTrackById(subtitlePref.id);
@@ -5308,32 +5599,23 @@ function MuxPlayer({
5308
5599
  ) });
5309
5600
  }
5310
5601
  function isDeepEqual(obj1, obj2) {
5311
- if (obj1 === obj2)
5312
- return true;
5313
- if (typeof obj1 !== typeof obj2)
5314
- return false;
5315
- if (typeof obj1 !== "object" || typeof obj2 !== "object")
5316
- return false;
5317
- if (obj1 === null || obj2 === null)
5318
- return false;
5319
- if (Array.isArray(obj1) !== Array.isArray(obj2))
5320
- return false;
5602
+ if (obj1 === obj2) return true;
5603
+ if (typeof obj1 !== typeof obj2) return false;
5604
+ if (typeof obj1 !== "object" || typeof obj2 !== "object") return false;
5605
+ if (obj1 === null || obj2 === null) return false;
5606
+ if (Array.isArray(obj1) !== Array.isArray(obj2)) return false;
5321
5607
  if (Array.isArray(obj1) && Array.isArray(obj2)) {
5322
- if (obj1.length !== obj2.length)
5323
- return false;
5608
+ if (obj1.length !== obj2.length) return false;
5324
5609
  for (let i = 0; i < obj1.length; i++) {
5325
- if (!isDeepEqual(obj1[i], obj2[i]))
5326
- return false;
5610
+ if (!isDeepEqual(obj1[i], obj2[i])) return false;
5327
5611
  }
5328
5612
  return true;
5329
5613
  }
5330
5614
  const keys1 = Object.keys(obj1);
5331
5615
  const keys2 = Object.keys(obj2);
5332
- if (keys1.length !== keys2.length)
5333
- return false;
5616
+ if (keys1.length !== keys2.length) return false;
5334
5617
  for (const key of keys1) {
5335
- if (!isDeepEqual(obj1[key], obj2[key]))
5336
- return false;
5618
+ if (!isDeepEqual(obj1[key], obj2[key])) return false;
5337
5619
  }
5338
5620
  return true;
5339
5621
  }
@@ -5413,10 +5695,8 @@ function extractEpicTitle(urlString) {
5413
5695
  let titleSegment = urlSegments.pop();
5414
5696
  const nonTitles = ["problem", "solution", "embed", "exercise"];
5415
5697
  const isTitleSegment = (str) => str && !nonTitles.includes(str);
5416
- while (!isTitleSegment(titleSegment))
5417
- titleSegment = urlSegments.pop();
5418
- if (!titleSegment)
5419
- return "EpicWeb.dev Video";
5698
+ while (!isTitleSegment(titleSegment)) titleSegment = urlSegments.pop();
5699
+ if (!titleSegment) return "EpicWeb.dev Video";
5420
5700
  const titleWords = titleSegment.split("-");
5421
5701
  const lowerCaseWords = [
5422
5702
  "the",
@@ -5520,8 +5800,7 @@ function extractEpicTitle(urlString) {
5520
5800
  const literalWord = literalWords.find(
5521
5801
  (w) => w.toLowerCase() === lowerWord
5522
5802
  );
5523
- if (literalWord)
5524
- return literalWord;
5803
+ if (literalWord) return literalWord;
5525
5804
  if (lowerCaseWords.includes(lowerWord) && index > 0) {
5526
5805
  return lowerWord;
5527
5806
  }
@@ -5731,8 +6010,7 @@ function EpicVideo({
5731
6010
  let prevIndex = 0;
5732
6011
  while (match = timestampRegex.exec(transcript)) {
5733
6012
  const timestamp = match[1];
5734
- if (!timestampRegex.lastIndex || !timestamp)
5735
- break;
6013
+ if (!timestampRegex.lastIndex || !timestamp) break;
5736
6014
  const timestampIndexStart = match.index;
5737
6015
  const timestampIndexEnd = timestampRegex.lastIndex;
5738
6016
  const textBeforeTimestamp = transcript.slice(
@@ -6002,8 +6280,7 @@ function guessEditor() {
6002
6280
  const runningProcesses = output.split("\r\n");
6003
6281
  for (let i = 0; i < runningProcesses.length; i++) {
6004
6282
  const processPath = (_a2 = runningProcesses[i]) == null ? void 0 : _a2.trim();
6005
- if (!processPath)
6006
- continue;
6283
+ if (!processPath) continue;
6007
6284
  const processName = path.basename(processPath);
6008
6285
  if (COMMON_EDITORS_WIN.includes(processName)) {
6009
6286
  return [processPath];
@@ -6014,8 +6291,7 @@ function guessEditor() {
6014
6291
  const processNames = Object.keys(COMMON_EDITORS_LINUX);
6015
6292
  for (let i = 0; i < processNames.length; i++) {
6016
6293
  const processName = processNames[i];
6017
- if (!processName)
6018
- continue;
6294
+ if (!processName) continue;
6019
6295
  if (output.includes(processName)) {
6020
6296
  return [COMMON_EDITORS_LINUX[processName]];
6021
6297
  }
@@ -6240,8 +6516,7 @@ async function action$9({ request }) {
6240
6516
  const originFiles = await getFiles(form.syncTo);
6241
6517
  for (let index = 0; index < originFiles.length; index++) {
6242
6518
  const originFile = originFiles[index];
6243
- if (!originFile)
6244
- continue;
6519
+ if (!originFile) continue;
6245
6520
  const destFile = filesToOpen[index];
6246
6521
  if (!destFile) {
6247
6522
  throw new Response(
@@ -6384,8 +6659,7 @@ function EditFileOnGitHub({
6384
6659
  }) {
6385
6660
  const fetcher = useLaunchFetcher();
6386
6661
  const handleClick = (e) => {
6387
- if (!e.altKey || ENV.EPICSHOP_DEPLOYED)
6388
- return;
6662
+ if (!e.altKey || ENV.EPICSHOP_DEPLOYED) return;
6389
6663
  e.preventDefault();
6390
6664
  const formData = new FormData();
6391
6665
  const type = file ? "file" : "appFile";
@@ -6437,8 +6711,7 @@ function OpenInEditor({
6437
6711
  }) {
6438
6712
  var _a2;
6439
6713
  const data = useLoaderData();
6440
- if (type === "other" || !buttons || !filename || !fullPath)
6441
- return null;
6714
+ if (type === "other" || !buttons || !filename || !fullPath) return null;
6442
6715
  const currentAppFullPath = safePath(((_a2 = data[data.type]) == null ? void 0 : _a2.fullPath) ?? "");
6443
6716
  const isFileFromDifferentApp = !fullPath.startsWith(currentAppFullPath);
6444
6717
  const validButtons = ENV.EPICSHOP_DEPLOYED ? ["problem", "solution"] : ["problem", "solution", "playground"];
@@ -6607,8 +6880,7 @@ const meta$4 = ({
6607
6880
  var _a2;
6608
6881
  const number = data == null ? void 0 : data.exercise.exerciseNumber.toString().padStart(2, "0");
6609
6882
  const rootData = (_a2 = matches.find((m) => m.id === "root")) == null ? void 0 : _a2.data;
6610
- if (!data || !rootData)
6611
- return [{ title: "🦉 | Error" }];
6883
+ if (!data || !rootData) return [{ title: "🦉 | Error" }];
6612
6884
  return getSeoMetaTags({
6613
6885
  title: `📝 | ${number}. ${data.exercise.title} | ${rootData == null ? void 0 : rootData.workshopTitle}`,
6614
6886
  description: `Introduction for ${number}. ${data.exercise.title}`,
@@ -6962,8 +7234,7 @@ function Diff({
6962
7234
  });
6963
7235
  const hiddenInputs = [];
6964
7236
  for (const [key, value] of params.entries()) {
6965
- if (key === "app1" || key === "app2")
6966
- continue;
7237
+ if (key === "app1" || key === "app2") continue;
6967
7238
  hiddenInputs.push(
6968
7239
  /* @__PURE__ */ jsx("input", { type: "hidden", name: key, value }, key)
6969
7240
  );
@@ -7279,10 +7550,8 @@ function getFileCodeblocks(file, filePathApp1, filePathApp2, type) {
7279
7550
  for (const chunk of file.chunks) {
7280
7551
  let launchEditor2 = function(appNum, line) {
7281
7552
  if (isDeployed) {
7282
- if (type === "DeletedFile" && appNum === 2)
7283
- return "";
7284
- if (type === "AddedFile" && appNum === 1)
7285
- return "";
7553
+ if (type === "DeletedFile" && appNum === 2) return "";
7554
+ if (type === "AddedFile" && appNum === 1) return "";
7286
7555
  }
7287
7556
  const label = type === "AddedFile" && appNum === 1 || type === "DeletedFile" && appNum === 2 ? `CREATE in APP ${appNum}` : `OPEN in APP ${appNum}`;
7288
7557
  const file2 = JSON.stringify(appNum === 1 ? filePathApp1 : filePathApp2);
@@ -7306,8 +7575,7 @@ function getFileCodeblocks(file, filePathApp1, filePathApp2, type) {
7306
7575
  toStartLine = chunk.toFileRange.start;
7307
7576
  for (let lineNumber = 0; lineNumber < chunk.changes.length; lineNumber++) {
7308
7577
  const change = chunk.changes[lineNumber];
7309
- if (!change)
7310
- continue;
7578
+ if (!change) continue;
7311
7579
  lines.push(change.content);
7312
7580
  switch (change.type) {
7313
7581
  case "AddedLine": {
@@ -7382,8 +7650,7 @@ async function copyUnignoredFiles(srcDir, destDir, ignoreList) {
7382
7650
  await fsExtra.remove(destDir);
7383
7651
  await fsExtra.copy(srcDir, destDir, {
7384
7652
  filter: async (file) => {
7385
- if (file === srcDir)
7386
- return true;
7653
+ if (file === srcDir) return true;
7387
7654
  return !ig.ignores(path.relative(srcDir, file));
7388
7655
  }
7389
7656
  });
@@ -7447,8 +7714,7 @@ async function getDiffIgnore(filePath) {
7447
7714
  ) : [];
7448
7715
  }
7449
7716
  function getForceFreshForDiff(app1, app2, cacheEntry) {
7450
- if (!cacheEntry)
7451
- return true;
7717
+ if (!cacheEntry) return true;
7452
7718
  const app1Modified = modifiedTimes.get(app1.fullPath) ?? 0;
7453
7719
  const app2Modified = modifiedTimes.get(app2.fullPath) ?? 0;
7454
7720
  const cacheModified = cacheEntry.metadata.createdTime;
@@ -7568,13 +7834,11 @@ async function getDiffCodeImpl(app1, app2) {
7568
7834
  for (const file of parsed.files) {
7569
7835
  const pathToCopy = file.type === "RenamedFile" ? file.pathBefore : file.path;
7570
7836
  const relativePath = diffPathToRelative(pathToCopy);
7571
- if (app1TestFiles.includes(relativePath))
7572
- continue;
7837
+ if (app1TestFiles.includes(relativePath)) continue;
7573
7838
  const filePathApp1 = path.join(app1.fullPath, relativePath);
7574
7839
  const pathToApp2 = file.type === "RenamedFile" ? file.pathAfter : file.path;
7575
7840
  const relativePathApp2 = diffPathToRelative(pathToApp2);
7576
- if (app2TestFiles.includes(relativePathApp2))
7577
- continue;
7841
+ if (app2TestFiles.includes(relativePathApp2)) continue;
7578
7842
  const filePathApp2 = path.join(app2.fullPath, relativePathApp2);
7579
7843
  switch (file.type) {
7580
7844
  case "ChangedFile": {
@@ -7790,8 +8054,7 @@ function SelectItem({
7790
8054
  );
7791
8055
  }
7792
8056
  function SetAppToPlayground({ appName }) {
7793
- if (ENV.EPICSHOP_DEPLOYED)
7794
- return null;
8057
+ if (ENV.EPICSHOP_DEPLOYED) return null;
7795
8058
  return /* @__PURE__ */ jsx(
7796
8059
  SetPlayground,
7797
8060
  {
@@ -8508,13 +8771,11 @@ function InBrowserBrowserForRealzImpl({ baseUrl, id, name, initialRoute }, ref)
8508
8771
  useEffect(() => {
8509
8772
  function handleMessage(messageEvent) {
8510
8773
  var _a2;
8511
- if (messageEvent.source !== ((_a2 = iframeRef.current) == null ? void 0 : _a2.contentWindow))
8512
- return;
8774
+ if (messageEvent.source !== ((_a2 = iframeRef.current) == null ? void 0 : _a2.contentWindow)) return;
8513
8775
  const result = messageSchema.safeParse(messageEvent.data, {
8514
8776
  path: ["messageEvent", "data"]
8515
8777
  });
8516
- if (!result.success)
8517
- return;
8778
+ if (!result.success) return;
8518
8779
  const { data } = result;
8519
8780
  if (data.type === "epicshop:loaded") {
8520
8781
  setIFrameContext((prevContext) => {
@@ -8526,8 +8787,7 @@ function InBrowserBrowserForRealzImpl({ baseUrl, id, name, initialRoute }, ref)
8526
8787
  } else if (lastDirectionRef.current === "new") {
8527
8788
  const currentPathname = prevContext.history[prevContext.index];
8528
8789
  const newPathname = new URL(data.url).pathname;
8529
- if (currentPathname === newPathname)
8530
- return prevContext;
8790
+ if (currentPathname === newPathname) return prevContext;
8531
8791
  const newHistory = [
8532
8792
  ...prevContext.history.slice(0, prevContext.index + 1),
8533
8793
  newPathname
@@ -8597,8 +8857,7 @@ function InBrowserBrowserForRealzImpl({ baseUrl, id, name, initialRoute }, ref)
8597
8857
  }, [setSearchParams]);
8598
8858
  const iframePathname = iframeContext.history[iframeContext.index];
8599
8859
  useEffect(() => {
8600
- if (!iframePathname)
8601
- return;
8860
+ if (!iframePathname) return;
8602
8861
  setPathnameInputValue(iframePathname);
8603
8862
  const newSearchParams = new URLSearchParams(window.location.search);
8604
8863
  if (iframePathname === "/") {
@@ -8642,8 +8901,7 @@ function InBrowserBrowserForRealzImpl({ baseUrl, id, name, initialRoute }, ref)
8642
8901
  const atStartOfHistory = iframeContext.index <= 0;
8643
8902
  const existingSearchParamHiddenInputs = [];
8644
8903
  for (const [key, value] of searchParams.entries()) {
8645
- if (key === "pathname")
8646
- continue;
8904
+ if (key === "pathname") continue;
8647
8905
  existingSearchParamHiddenInputs.push(
8648
8906
  /* @__PURE__ */ jsx("input", { type: "hidden", name: key, value }, key)
8649
8907
  );
@@ -8656,7 +8914,7 @@ function InBrowserBrowserForRealzImpl({ baseUrl, id, name, initialRoute }, ref)
8656
8914
  "button",
8657
8915
  {
8658
8916
  type: "button",
8659
- className: "flex aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40",
8917
+ className: "hidden aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40 sm:flex",
8660
8918
  disabled: atStartOfHistory,
8661
8919
  onClick: () => navigateChild(-1),
8662
8920
  children: /* @__PURE__ */ jsx(Icon, { name: "ArrowLeft", "aria-hidden": "true" })
@@ -8669,7 +8927,7 @@ function InBrowserBrowserForRealzImpl({ baseUrl, id, name, initialRoute }, ref)
8669
8927
  "button",
8670
8928
  {
8671
8929
  type: "button",
8672
- className: "flex aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40",
8930
+ className: "hidden aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40 sm:flex",
8673
8931
  disabled: atEndOfHistory,
8674
8932
  onClick: () => navigateChild(1),
8675
8933
  children: /* @__PURE__ */ jsx(Icon, { name: "ArrowRight", "aria-hidden": "true" })
@@ -8712,7 +8970,7 @@ function InBrowserBrowserForRealzImpl({ baseUrl, id, name, initialRoute }, ref)
8712
8970
  "input",
8713
8971
  {
8714
8972
  "aria-label": "pathname",
8715
- className: "flex-1 bg-background focus-visible:outline-none",
8973
+ className: "w-full flex-1 bg-background focus-visible:outline-none",
8716
8974
  value: pathnameInputValue,
8717
8975
  name: "pathname",
8718
8976
  onChange: (e) => setPathnameInputValue(e.currentTarget.value)
@@ -8757,8 +9015,7 @@ function Preview({
8757
9015
  inBrowserBrowserRef
8758
9016
  }) {
8759
9017
  const requestInfo = useRequestInfo();
8760
- if (!appInfo)
8761
- return /* @__PURE__ */ jsx("p", { children: "No app here. Sorry." });
9018
+ if (!appInfo) return /* @__PURE__ */ jsx("p", { children: "No app here. Sorry." });
8762
9019
  const { isRunning, dev, name, portIsAvailable, title } = appInfo;
8763
9020
  if (dev.type === "script") {
8764
9021
  const baseUrl = getBaseUrl({
@@ -8966,8 +9223,7 @@ function StepMdx({
8966
9223
  inBrowserBrowserRef
8967
9224
  }) {
8968
9225
  const data = useLoaderData();
8969
- if (!data.exerciseStepApp.instructionsCode)
8970
- return null;
9226
+ if (!data.exerciseStepApp.instructionsCode) return null;
8971
9227
  return /* @__PURE__ */ jsx(StepContextProvider, { inBrowserBrowserRef, children: /* @__PURE__ */ jsx(EpicVideoInfoProvider, { epicVideoInfosPromise: data.epicVideoInfosPromise, children: /* @__PURE__ */ jsx("div", { className: "prose dark:prose-invert sm:prose-lg", children: /* @__PURE__ */ jsx(
8972
9228
  Mdx,
8973
9229
  {
@@ -9019,8 +9275,7 @@ function DiffLink({
9019
9275
  const stepIndex = data.exerciseIndex + input;
9020
9276
  return (_a2 = data.allApps[stepIndex]) == null ? void 0 : _a2.name;
9021
9277
  }
9022
- if (!input)
9023
- return null;
9278
+ if (!input) return null;
9024
9279
  for (const { name, stepName } of data.allApps) {
9025
9280
  if (input === name || input === stepName) {
9026
9281
  return name;
@@ -9094,8 +9349,7 @@ function CodeFileNotification({
9094
9349
  const data = useLoaderData();
9095
9350
  const app = data[type];
9096
9351
  const handleClick = () => {
9097
- if (visibility !== "visible")
9098
- return;
9352
+ if (visibility !== "visible") return;
9099
9353
  setVisibility("collapse");
9100
9354
  setTimeout(() => {
9101
9355
  setVisibility("none");
@@ -9159,10 +9413,8 @@ function InlineFile({
9159
9413
  ) : /* @__PURE__ */ jsx(Fragment, { children: "children" });
9160
9414
  }
9161
9415
  function getPreviewType(preview) {
9162
- if (preview === "problem")
9163
- return "problem";
9164
- if (preview === "solution")
9165
- return "solution";
9416
+ if (preview === "problem") return "problem";
9417
+ if (preview === "solution") return "solution";
9166
9418
  return "playground";
9167
9419
  }
9168
9420
  function LinkToApp({
@@ -9199,8 +9451,7 @@ function LinkToApp({
9199
9451
  title: ENV.EPICSHOP_DEPLOYED ? "Cannot link to app in deployed version" : void 0,
9200
9452
  onClick: (event) => {
9201
9453
  var _a3, _b2;
9202
- if (ENV.EPICSHOP_DEPLOYED)
9203
- event.preventDefault();
9454
+ if (ENV.EPICSHOP_DEPLOYED) event.preventDefault();
9204
9455
  (_a3 = props.onClick) == null ? void 0 : _a3.call(props, event);
9205
9456
  (_b2 = inBrowserBrowserRef.current) == null ? void 0 : _b2.handleExtrnalNavigation(appTo.toString());
9206
9457
  },
@@ -9218,8 +9469,7 @@ function LinkToApp({
9218
9469
  }),
9219
9470
  title: ENV.EPICSHOP_DEPLOYED ? "Cannot link to app in deployed version" : "Open in new tab",
9220
9471
  onClick: (event) => {
9221
- if (ENV.EPICSHOP_DEPLOYED)
9222
- event.preventDefault();
9472
+ if (ENV.EPICSHOP_DEPLOYED) event.preventDefault();
9223
9473
  },
9224
9474
  children: /* @__PURE__ */ jsx(Icon, { name: "ExternalLink" })
9225
9475
  }
@@ -9257,10 +9507,8 @@ function InBrowserTestRunner({
9257
9507
  useEffect(() => {
9258
9508
  function handleMessage(messageEvent) {
9259
9509
  var _a2;
9260
- if (messageEvent.source !== ((_a2 = iframeRef.current) == null ? void 0 : _a2.contentWindow))
9261
- return;
9262
- if ("request" in messageEvent.data)
9263
- return;
9510
+ if (messageEvent.source !== ((_a2 = iframeRef.current) == null ? void 0 : _a2.contentWindow)) return;
9511
+ if ("request" in messageEvent.data) return;
9264
9512
  const result = testRunnerDataSchema.safeParse(messageEvent.data, {
9265
9513
  path: ["messageEvent", "data"]
9266
9514
  });
@@ -9537,8 +9785,7 @@ function TestOutput({ name }) {
9537
9785
  `/test?${new URLSearchParams({ name })}&v=${version}`
9538
9786
  );
9539
9787
  useEffect(() => {
9540
- if (!lastMessage)
9541
- return;
9788
+ if (!lastMessage) return;
9542
9789
  const parsed = JSON.parse(lastMessage);
9543
9790
  const result = testEventQueueSchema.safeParse(parsed);
9544
9791
  if (!result.success) {
@@ -9901,8 +10148,7 @@ const meta$3 = ({
9901
10148
  }) => {
9902
10149
  var _a2;
9903
10150
  const rootData = (_a2 = matches.find((m) => m.id === "root")) == null ? void 0 : _a2.data;
9904
- if (!data || !rootData)
9905
- return [{ title: "🦉 | Error" }];
10151
+ if (!data || !rootData) return [{ title: "🦉 | Error" }];
9906
10152
  const { emoji: emoji2, stepNumber, title, exerciseNumber, exerciseTitle } = pageTitle(data);
9907
10153
  return getSeoMetaTags({
9908
10154
  title: `${emoji2} | ${stepNumber}. ${title} | ${exerciseNumber}. ${exerciseTitle} | ${rootData.workshopTitle}`,
@@ -9977,12 +10223,9 @@ async function loader$k({ request, params }) {
9977
10223
  ...getStepNameAndId(a)
9978
10224
  }));
9979
10225
  allApps.sort((a, b) => {
9980
- if (a.stepId > 0 && b.stepId > 0)
9981
- return a.stepId - b.stepId;
9982
- if (a.stepId > 0)
9983
- return -1;
9984
- if (b.stepId > 0)
9985
- return 1;
10226
+ if (a.stepId > 0 && b.stepId > 0) return a.stepId - b.stepId;
10227
+ if (a.stepId > 0) return -1;
10228
+ if (b.stepId > 0) return 1;
9986
10229
  return 0;
9987
10230
  });
9988
10231
  const exerciseId = getStepId(exerciseStepApp);
@@ -10120,14 +10363,12 @@ function ExercisePartRoute() {
10120
10363
  return ENV.EPICSHOP_DEPLOYED || !data.playground || data.playground.test.type === "none";
10121
10364
  }
10122
10365
  if (tab === "problem" || tab === "solution") {
10123
- if (((_a3 = data[tab]) == null ? void 0 : _a3.dev.type) === "none")
10124
- return true;
10366
+ if (((_a3 = data[tab]) == null ? void 0 : _a3.dev.type) === "none") return true;
10125
10367
  if (ENV.EPICSHOP_DEPLOYED) {
10126
10368
  return ((_b3 = data[tab]) == null ? void 0 : _b3.dev.type) !== "browser";
10127
10369
  }
10128
10370
  }
10129
- if (tab === "playground" && ENV.EPICSHOP_DEPLOYED)
10130
- return true;
10371
+ if (tab === "playground" && ENV.EPICSHOP_DEPLOYED) return true;
10131
10372
  return false;
10132
10373
  }
10133
10374
  const activeTab = isValidPreview(preview) ? preview : tabs.find((t) => !shouldHideTab(t));
@@ -10141,8 +10382,8 @@ function ExercisePartRoute() {
10141
10382
  navigate(altDiffUrl);
10142
10383
  }
10143
10384
  }
10144
- return /* @__PURE__ */ jsx("div", { className: "flex flex-grow flex-col", children: /* @__PURE__ */ jsxs("main", { className: "grid h-full flex-grow grid-cols-1 grid-rows-2 lg:grid-cols-2 lg:grid-rows-1", children: [
10145
- /* @__PURE__ */ jsxs("div", { className: "relative col-span-1 row-span-1 flex h-full flex-col lg:border-r", children: [
10385
+ return /* @__PURE__ */ jsx("div", { className: "flex max-w-full flex-grow flex-col", children: /* @__PURE__ */ jsxs("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", children: [
10386
+ /* @__PURE__ */ jsxs("div", { className: "relative flex flex-col sm:col-span-1 sm:row-span-1 sm:h-full lg:border-r", children: [
10146
10387
  /* @__PURE__ */ jsx("h1", { className: "h-14 border-b pl-10 pr-5 text-sm font-medium leading-tight", children: /* @__PURE__ */ jsxs("div", { className: "flex h-14 flex-wrap items-center justify-between gap-x-2 py-2", children: [
10147
10388
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-start gap-x-2 uppercase", children: [
10148
10389
  /* @__PURE__ */ jsxs(
@@ -10169,14 +10410,14 @@ function ExercisePartRoute() {
10169
10410
  ")"
10170
10411
  ] })
10171
10412
  ] }),
10172
- data.problem && ((_c = data.playground) == null ? void 0 : _c.appName) !== data.problem.name ? /* @__PURE__ */ jsx(SetAppToPlayground, { appName: data.problem.name }) : null
10413
+ data.problem && ((_c = data.playground) == null ? void 0 : _c.appName) !== data.problem.name ? /* @__PURE__ */ jsx("div", { className: "hidden md:block", children: /* @__PURE__ */ jsx(SetAppToPlayground, { appName: data.problem.name }) }) : null
10173
10414
  ] }) }),
10174
10415
  /* @__PURE__ */ jsx(
10175
10416
  "article",
10176
10417
  {
10177
10418
  id: data.articleId,
10178
- className: "shadow-on-scrollbox h-full w-full max-w-none flex-1 scroll-pt-6 space-y-6 overflow-y-auto p-10 pt-8 scrollbar-thin scrollbar-thumb-scrollbar",
10179
- children: data.exerciseStepApp.instructionsCode ? /* @__PURE__ */ jsx("div", { className: "prose dark:prose-invert sm:prose-lg", children: /* @__PURE__ */ jsx(StepMdx, { inBrowserBrowserRef }) }) : /* @__PURE__ */ jsx("p", { children: "No instructions yet..." })
10419
+ className: "shadow-on-scrollbox h-full w-full max-w-none flex-1 scroll-pt-6 space-y-6 overflow-y-auto p-2 scrollbar-thin scrollbar-thumb-scrollbar sm:p-10 sm:pt-8",
10420
+ children: data.exerciseStepApp.instructionsCode ? /* @__PURE__ */ jsx(StepMdx, { inBrowserBrowserRef }) : /* @__PURE__ */ jsx("p", { children: "No instructions yet..." })
10180
10421
  },
10181
10422
  data.articleId
10182
10423
  ),
@@ -10223,7 +10464,7 @@ function ExercisePartRoute() {
10223
10464
  /* @__PURE__ */ jsxs(
10224
10465
  Tabs.Root,
10225
10466
  {
10226
- className: "relative col-span-1 row-span-1 flex flex-col overflow-y-auto",
10467
+ className: "relative flex flex-col overflow-y-auto sm:col-span-1 sm:row-span-1",
10227
10468
  value: activeTab,
10228
10469
  children: [
10229
10470
  /* @__PURE__ */ jsx(Tabs.List, { className: "h-14 min-h-14 overflow-x-hidden border-b scrollbar-thin scrollbar-thumb-scrollbar", children: tabs.map((tab) => {
@@ -10248,12 +10489,12 @@ function ExercisePartRoute() {
10248
10489
  }
10249
10490
  ) }, tab);
10250
10491
  }) }),
10251
- /* @__PURE__ */ jsxs("div", { className: "relative z-10 flex flex-grow flex-col overflow-y-auto", children: [
10492
+ /* @__PURE__ */ jsxs("div", { className: "relative z-10 flex min-h-96 flex-grow flex-col overflow-y-auto", children: [
10252
10493
  /* @__PURE__ */ jsx(
10253
10494
  Tabs.Content,
10254
10495
  {
10255
10496
  value: "playground",
10256
- className: "flex flex-grow items-center justify-center radix-state-inactive:hidden",
10497
+ className: "flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden",
10257
10498
  children: /* @__PURE__ */ jsx(
10258
10499
  Playground,
10259
10500
  {
@@ -10270,7 +10511,7 @@ function ExercisePartRoute() {
10270
10511
  Tabs.Content,
10271
10512
  {
10272
10513
  value: "problem",
10273
- className: "flex flex-grow items-center justify-center radix-state-inactive:hidden",
10514
+ className: "flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden",
10274
10515
  children: /* @__PURE__ */ jsx(
10275
10516
  Preview,
10276
10517
  {
@@ -10284,7 +10525,7 @@ function ExercisePartRoute() {
10284
10525
  Tabs.Content,
10285
10526
  {
10286
10527
  value: "solution",
10287
- className: "flex flex-grow items-center justify-center radix-state-inactive:hidden",
10528
+ className: "flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden",
10288
10529
  children: /* @__PURE__ */ jsx(
10289
10530
  Preview,
10290
10531
  {
@@ -10298,7 +10539,7 @@ function ExercisePartRoute() {
10298
10539
  Tabs.Content,
10299
10540
  {
10300
10541
  value: "tests",
10301
- className: "flex flex-grow items-start justify-center overflow-hidden radix-state-inactive:hidden",
10542
+ className: "flex w-full flex-grow items-start justify-center self-start overflow-hidden radix-state-inactive:hidden",
10302
10543
  children: /* @__PURE__ */ jsx(
10303
10544
  Tests,
10304
10545
  {
@@ -10314,7 +10555,7 @@ function ExercisePartRoute() {
10314
10555
  Tabs.Content,
10315
10556
  {
10316
10557
  value: "diff",
10317
- className: "flex h-full flex-grow items-start justify-center radix-state-inactive:hidden",
10558
+ className: "flex h-full w-full flex-grow items-start justify-center self-start radix-state-inactive:hidden",
10318
10559
  children: /* @__PURE__ */ jsx(Diff, { diff: data.diff, allApps: data.allApps })
10319
10560
  }
10320
10561
  ),
@@ -10322,7 +10563,7 @@ function ExercisePartRoute() {
10322
10563
  Tabs.Content,
10323
10564
  {
10324
10565
  value: "chat",
10325
- className: "flex h-full flex-grow items-start justify-center radix-state-inactive:hidden",
10566
+ className: "flex h-full w-full flex-grow items-start justify-center self-start radix-state-inactive:hidden",
10326
10567
  children: /* @__PURE__ */ jsx(DiscordChat, {})
10327
10568
  }
10328
10569
  )
@@ -10377,8 +10618,7 @@ const meta$2 = ({
10377
10618
  var _a2;
10378
10619
  const number = data == null ? void 0 : data.exercise.exerciseNumber.toString().padStart(2, "0");
10379
10620
  const rootData = (_a2 = matches.find((m) => m.id === "root")) == null ? void 0 : _a2.data;
10380
- if (!data || !rootData)
10381
- return [{ title: "🦉 | Error" }];
10621
+ if (!data || !rootData) return [{ title: "🦉 | Error" }];
10382
10622
  return getSeoMetaTags({
10383
10623
  title: `🦉 | ${number}. ${data.exercise.title} | ${rootData == null ? void 0 : rootData.workshopTitle}`,
10384
10624
  description: `Elaboration for ${number}. ${data.exercise.title}`,
@@ -10464,9 +10704,9 @@ const mdxComponents$2 = { h1: () => null };
10464
10704
  function ExerciseFinished$1() {
10465
10705
  const data = useLoaderData();
10466
10706
  const exerciseNumber = data.exercise.exerciseNumber.toString().padStart(2, "0");
10467
- return /* @__PURE__ */ jsx("div", { className: "flex flex-grow flex-col", children: /* @__PURE__ */ jsxs("main", { className: "grid h-full flex-grow grid-cols-1 grid-rows-2 lg:grid-cols-2 lg:grid-rows-1", children: [
10468
- /* @__PURE__ */ jsxs("div", { className: "relative col-span-1 row-span-1 flex h-full flex-col lg:border-r", children: [
10469
- /* @__PURE__ */ jsx("h1", { className: "h-14 border-b pl-10 pr-5 text-sm font-medium uppercase leading-none", children: /* @__PURE__ */ jsx("div", { className: "flex h-14 flex-wrap items-center justify-between gap-x-2 py-2", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-start gap-x-2", children: [
10707
+ return /* @__PURE__ */ jsx("div", { className: "flex max-w-full flex-grow flex-col", children: /* @__PURE__ */ jsxs("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", children: [
10708
+ /* @__PURE__ */ jsxs("div", { className: "relative flex flex-col sm:col-span-1 sm:row-span-1 sm:h-full lg:border-r", children: [
10709
+ /* @__PURE__ */ jsx("h1", { className: "h-14 border-b pl-10 pr-5 text-sm font-medium leading-tight", children: /* @__PURE__ */ jsx("div", { className: "flex h-14 flex-wrap items-center justify-between gap-x-2 py-2", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-start gap-x-2", children: [
10470
10710
  /* @__PURE__ */ jsx(Link, { to: `/${exerciseNumber}`, className: "hover:underline", children: `${exerciseNumber}. ${data.exercise.title}` }),
10471
10711
  /* @__PURE__ */ jsx("span", { children: "/" }),
10472
10712
  /* @__PURE__ */ jsx("span", { children: "Elaboration" })
@@ -10474,7 +10714,7 @@ function ExerciseFinished$1() {
10474
10714
  /* @__PURE__ */ jsx(
10475
10715
  "article",
10476
10716
  {
10477
- className: "shadow-on-scrollbox h-full w-full max-w-none flex-1 scroll-pt-6 space-y-6 overflow-y-auto p-10 pt-8 scrollbar-thin scrollbar-thumb-scrollbar",
10717
+ className: "shadow-on-scrollbox h-full w-full max-w-none flex-1 scroll-pt-6 space-y-6 overflow-y-auto p-2 scrollbar-thin scrollbar-thumb-scrollbar sm:p-10 sm:pt-8",
10478
10718
  id: data.articleId,
10479
10719
  children: data.exercise.finishedCode ? /* @__PURE__ */ jsx(
10480
10720
  EpicVideoInfoProvider,
@@ -10529,7 +10769,7 @@ function Survey$1({
10529
10769
  exerciseTitle
10530
10770
  }) {
10531
10771
  const [iframeLoaded, setIframeLoaded] = React.useState(false);
10532
- return /* @__PURE__ */ jsxs("div", { className: "relative flex-shrink-0", children: [
10772
+ return /* @__PURE__ */ jsxs("div", { className: "relative min-h-full sm:min-h-[unset] sm:flex-shrink-0", children: [
10533
10773
  !iframeLoaded ? /* @__PURE__ */ jsx("div", { className: "absolute inset-0 z-10 flex items-center justify-center", children: /* @__PURE__ */ jsx(Loading, { children: /* @__PURE__ */ jsxs("span", { children: [
10534
10774
  "Loading ",
10535
10775
  exerciseTitle,
@@ -10671,11 +10911,9 @@ const route9 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
10671
10911
  loader: loader$h
10672
10912
  }, Symbol.toStringTag, { value: "Module" }));
10673
10913
  async function getForceFresh(filePath, cacheEntry) {
10674
- if (!cacheEntry)
10675
- return true;
10914
+ if (!cacheEntry) return true;
10676
10915
  const app = await getAppFromFile(filePath);
10677
- if (!app)
10678
- return true;
10916
+ if (!app) return true;
10679
10917
  const appModified = modifiedTimes.get(app.fullPath) ?? 0;
10680
10918
  const cacheModified = cacheEntry.metadata.createdTime;
10681
10919
  return !cacheModified || appModified > cacheModified || void 0;
@@ -11204,8 +11442,7 @@ const meta$1 = ({
11204
11442
  }) => {
11205
11443
  var _a2;
11206
11444
  const rootData = (_a2 = matches.find((m) => m.id === "root")) == null ? void 0 : _a2.data;
11207
- if (!rootData)
11208
- return [];
11445
+ if (!rootData) return [];
11209
11446
  return getSeoMetaTags({
11210
11447
  title: `🎉 ${rootData == null ? void 0 : rootData.workshopTitle}`,
11211
11448
  description: `Elaboration for ${rootData == null ? void 0 : rootData.workshopTitle}`,
@@ -11280,7 +11517,7 @@ function ExerciseFinished() {
11280
11517
  /* @__PURE__ */ jsx(
11281
11518
  "article",
11282
11519
  {
11283
- className: "shadow-on-scrollbox h-full w-full max-w-none flex-1 scroll-pt-6 space-y-6 overflow-y-auto p-10 pt-8 scrollbar-thin scrollbar-thumb-scrollbar",
11520
+ className: "shadow-on-scrollbox h-full w-full max-w-none flex-1 scroll-pt-6 space-y-6 overflow-y-auto p-2 scrollbar-thin scrollbar-thumb-scrollbar sm:p-10 sm:pt-8",
11284
11521
  id: data.articleId,
11285
11522
  children: data.finishedCode ? /* @__PURE__ */ jsx(
11286
11523
  EpicVideoInfoProvider,
@@ -11589,8 +11826,7 @@ const route27 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
11589
11826
  async function loader$8() {
11590
11827
  ensureUndeployed();
11591
11828
  const isAuthenticated = Boolean(await getAuthInfo());
11592
- if (isAuthenticated)
11593
- throw redirect("/account");
11829
+ if (isAuthenticated) throw redirect("/account");
11594
11830
  return json({});
11595
11831
  }
11596
11832
  async function action$2() {
@@ -11608,8 +11844,7 @@ function Login() {
11608
11844
  const revalidator = useRevalidator();
11609
11845
  const lastMessage = useEventSource(`/login-sse`);
11610
11846
  useEffect(() => {
11611
- if (!lastMessage)
11612
- return;
11847
+ if (!lastMessage) return;
11613
11848
  const parsed = JSON.parse(lastMessage);
11614
11849
  const result = EventSchema.safeParse(parsed);
11615
11850
  if (!result.success) {
@@ -11773,8 +12008,7 @@ async function clearData() {
11773
12008
  await deleteDb();
11774
12009
  }
11775
12010
  async function clearCaches() {
11776
- if (ENV.EPICSHOP_DEPLOYED)
11777
- return;
12011
+ if (ENV.EPICSHOP_DEPLOYED) return;
11778
12012
  const workshopRoot2 = getWorkshopRoot();
11779
12013
  await fsExtra.remove(path$1.join(workshopRoot2, "node_modules", ".cache"));
11780
12014
  await deleteCache();
@@ -12481,11 +12715,11 @@ const route30 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
12481
12715
  __proto__: null,
12482
12716
  loader
12483
12717
  }, Symbol.toStringTag, { value: "Module" }));
12484
- const serverManifest = { "entry": { "module": "/assets/entry.client-0j1eoieD.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/components-C5xBZAiL.js"], "css": [] }, "routes": { "root": { "id": "root", "parentId": void 0, "path": "", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/root-BQ7V6fP4.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/components-C5xBZAiL.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-DNgC2Frq.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/client-hints-BKxdo5Js.js", "/assets/error-boundary-Bcric_4t.js", "/assets/progress-bar-7LK87ZMh.js", "/assets/index-r90CY6Wk.js", "/assets/index-Bg9MMnnf.js", "/assets/presence-BJPzwbUy.js", "/assets/seo-Bu3_n5my.js"], "css": [] }, "routes/$": { "id": "routes/$", "parentId": "root", "path": "*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_-COWH0sBh.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DNgC2Frq.js", "/assets/error-boundary-Bcric_4t.js"], "css": [] }, "routes/_app+/_layout": { "id": "routes/_app+/_layout", "parentId": "root", "path": void 0, "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-CNgYirUN.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DNgC2Frq.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/client-hints-BKxdo5Js.js", "/assets/user-73ocDYRe.js", "/assets/presence-BJPzwbUy.js", "/assets/progress-CF9Xwfxf.js", "/assets/index-Bg9MMnnf.js"], "css": [] }, "routes/_app+/_exercises+/_layout": { "id": "routes/_app+/_exercises+/_layout", "parentId": "routes/_app+/_layout", "path": void 0, "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BR-Qyofe.js", "imports": ["/assets/index-D6ygCrVn.js"], "css": [] }, "routes/_app+/_exercises+/$exerciseNumber": { "id": "routes/_app+/_exercises+/$exerciseNumber", "parentId": "routes/_app+/_exercises+/_layout", "path": ":exerciseNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber-wyz3vbhs.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/components-C5xBZAiL.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-DNgC2Frq.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/client-hints-BKxdo5Js.js", "/assets/index-Bg9MMnnf.js", "/assets/loading-C9f_vBoM.js", "/assets/epic-video-BwtXsHGU.js", "/assets/progress-bar-7LK87ZMh.js", "/assets/index-9nNr0Zqr.js", "/assets/mdx-BYvGbvEr.js", "/assets/progress-CF9Xwfxf.js", "/assets/seo-Bu3_n5my.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber": { "id": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber", "parentId": "routes/_app+/_exercises+/_layout", "path": ":exerciseNumber/:stepNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber_._stepNumber-C37pli7_.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DNgC2Frq.js"], "css": [] }, "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/_layout": { "id": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/_layout", "parentId": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber", "path": ":type", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_layout-xu6a9He_.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DNgC2Frq.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/client-hints-BKxdo5Js.js", "/assets/index-Bg9MMnnf.js", "/assets/loading-C9f_vBoM.js", "/assets/epic-video-BwtXsHGU.js", "/assets/progress-bar-7LK87ZMh.js", "/assets/mdx-BYvGbvEr.js", "/assets/user-73ocDYRe.js", "/assets/index-9nNr0Zqr.js", "/assets/diff-BKsbFB6w.js", "/assets/error-boundary-Bcric_4t.js", "/assets/nav-chevrons-DOYtx9XE.js", "/assets/progress-CF9Xwfxf.js", "/assets/seo-Bu3_n5my.js", "/assets/discord-0kv66Q6F.js", "/assets/index-r90CY6Wk.js", "/assets/button-BfWwrI9B.js", "/assets/use-event-source-aW6X9lN1.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.index": { "id": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.index", "parentId": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/_exercises+/$exerciseNumber_.finished": { "id": "routes/_app+/_exercises+/$exerciseNumber_.finished", "parentId": "routes/_app+/_exercises+/_layout", "path": ":exerciseNumber/finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_.finished-DNtyBHjg.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/components-C5xBZAiL.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-DNgC2Frq.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/client-hints-BKxdo5Js.js", "/assets/index-Bg9MMnnf.js", "/assets/loading-C9f_vBoM.js", "/assets/epic-video-BwtXsHGU.js", "/assets/progress-bar-7LK87ZMh.js", "/assets/index-9nNr0Zqr.js", "/assets/nav-chevrons-DOYtx9XE.js", "/assets/mdx-BYvGbvEr.js", "/assets/progress-CF9Xwfxf.js", "/assets/seo-Bu3_n5my.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/account": { "id": "routes/_app+/account", "parentId": "routes/_app+/_layout", "path": "account", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/account-DesvwOeg.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/request-info-Dyls4H67.js", "/assets/button-BfWwrI9B.js", "/assets/misc-DNgC2Frq.js", "/assets/user-73ocDYRe.js", "/assets/presence-BJPzwbUy.js"], "css": [] }, "routes/_app+/app.$appName+/$": { "id": "routes/_app+/app.$appName+/$", "parentId": "routes/_app+/_layout", "path": "app/:appName/*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/api.$": { "id": "routes/_app+/app.$appName+/api.$", "parentId": "routes/_app+/_layout", "path": "app/:appName/api/*", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/api._-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/epic_ws[.js]": { "id": "routes/_app+/app.$appName+/epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/index": { "id": "routes/_app+/app.$appName+/index", "parentId": "routes/_app+/_layout", "path": "app/:appName/", "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.$testName": { "id": "routes/_app+/app.$appName+/test.$testName", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/:testName", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test._testName-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/discord": { "id": "routes/_app+/discord", "parentId": "routes/_app+/_layout", "path": "discord", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord-Xp0X4-Fl.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DNgC2Frq.js", "/assets/user-73ocDYRe.js", "/assets/discord-0kv66Q6F.js"], "css": [] }, "routes/_app+/finished": { "id": "routes/_app+/finished", "parentId": "routes/_app+/_layout", "path": "finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/finished-Cu9PZd5Q.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/components-C5xBZAiL.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-DNgC2Frq.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/client-hints-BKxdo5Js.js", "/assets/index-Bg9MMnnf.js", "/assets/loading-C9f_vBoM.js", "/assets/epic-video-BwtXsHGU.js", "/assets/progress-bar-7LK87ZMh.js", "/assets/index-9nNr0Zqr.js", "/assets/nav-chevrons-DOYtx9XE.js", "/assets/mdx-BYvGbvEr.js", "/assets/seo-Bu3_n5my.js", "/assets/progress-CF9Xwfxf.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/index": { "id": "routes/_app+/index", "parentId": "routes/_app+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-BQRtqn3g.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/components-C5xBZAiL.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-DNgC2Frq.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/client-hints-BKxdo5Js.js", "/assets/index-Bg9MMnnf.js", "/assets/loading-C9f_vBoM.js", "/assets/epic-video-BwtXsHGU.js", "/assets/progress-bar-7LK87ZMh.js", "/assets/index-9nNr0Zqr.js", "/assets/error-boundary-Bcric_4t.js", "/assets/mdx-BYvGbvEr.js", "/assets/progress-CF9Xwfxf.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/login": { "id": "routes/_app+/login", "parentId": "routes/_app+/_layout", "path": "login", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-D8zyjBAb.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/request-info-Dyls4H67.js", "/assets/client-hints-BKxdo5Js.js", "/assets/use-event-source-aW6X9lN1.js", "/assets/button-BfWwrI9B.js", "/assets/loading-C9f_vBoM.js"], "css": [] }, "routes/_app+/support": { "id": "routes/_app+/support", "parentId": "routes/_app+/_layout", "path": "support", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/support-DUAHYT3r.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/components-C5xBZAiL.js"], "css": [] }, "routes/admin+/_layout": { "id": "routes/admin+/_layout", "parentId": "root", "path": "admin", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-D0zbQZjf.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DNgC2Frq.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/progress-CF9Xwfxf.js"], "css": [] }, "routes/admin+/apps": { "id": "routes/admin+/apps", "parentId": "routes/admin+/_layout", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/apps": { "id": "routes/apps", "parentId": "root", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-DP2rzg_V.js", "imports": [], "css": [] }, "routes/diff": { "id": "routes/diff", "parentId": "root", "path": "diff", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/diff-KDzcgGYL.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DNgC2Frq.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/client-hints-BKxdo5Js.js", "/assets/index-Bg9MMnnf.js", "/assets/loading-C9f_vBoM.js", "/assets/epic-video-BwtXsHGU.js", "/assets/progress-bar-7LK87ZMh.js", "/assets/mdx-BYvGbvEr.js", "/assets/diff-BKsbFB6w.js", "/assets/nav-chevrons-DOYtx9XE.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/discord.callback": { "id": "routes/discord.callback", "parentId": "root", "path": "discord/callback", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord.callback-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/exercises": { "id": "routes/exercises", "parentId": "root", "path": "exercises", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/exercises-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/launch-editor": { "id": "routes/launch-editor", "parentId": "root", "path": "launch-editor", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/launch-editor-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/login-sse": { "id": "routes/login-sse", "parentId": "root", "path": "login-sse", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-sse-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/og": { "id": "routes/og", "parentId": "root", "path": "og", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/og-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/onboarding": { "id": "routes/onboarding", "parentId": "root", "path": "onboarding", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/onboarding-euWyXpCL.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DNgC2Frq.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/client-hints-BKxdo5Js.js", "/assets/index-Bg9MMnnf.js", "/assets/loading-C9f_vBoM.js", "/assets/button-BfWwrI9B.js", "/assets/epic-video-BwtXsHGU.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/processes": { "id": "routes/processes", "parentId": "root", "path": "processes", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/processes-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/progress": { "id": "routes/progress", "parentId": "root", "path": "progress", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/progress-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/set-playground": { "id": "routes/set-playground", "parentId": "root", "path": "set-playground", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/set-playground-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/start": { "id": "routes/start", "parentId": "root", "path": "start", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/start-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/test": { "id": "routes/test", "parentId": "root", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/theme/index": { "id": "routes/theme/index", "parentId": "root", "path": "theme", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-DP2rzg_V.js", "imports": [], "css": [] }, "routes/update-mdx-cache": { "id": "routes/update-mdx-cache", "parentId": "root", "path": "update-mdx-cache", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/update-mdx-cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/video-player/index": { "id": "routes/video-player/index", "parentId": "root", "path": "video-player", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-K6Dvbx-E.js", "imports": [], "css": [] } }, "url": "/assets/manifest-b31ba37c.js", "version": "b31ba37c" };
12718
+ const serverManifest = { "entry": { "module": "/assets/entry.client-B0vV2fsa.js", "imports": ["/assets/index-Czg1ruVn.js", "/assets/components-BMzmvxYw.js"], "css": [] }, "routes": { "root": { "id": "root", "parentId": void 0, "path": "", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/root-bgHbi7rA.js", "imports": ["/assets/index-Czg1ruVn.js", "/assets/components-BMzmvxYw.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-CypjEQkt.js", "/assets/request-info-CUT0ULYN.js", "/assets/tooltip-CfmIzAYi.js", "/assets/client-hints-BE5mB4r0.js", "/assets/error-boundary-DxfVshQ5.js", "/assets/progress-bar-DCrt7X4t.js", "/assets/index-Doi37489.js", "/assets/index-90bzTYUX.js", "/assets/presence-DXXVJbaH.js", "/assets/seo-Bu3_n5my.js"], "css": [] }, "routes/$": { "id": "routes/$", "parentId": "root", "path": "*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_-Bd2gNcck.js", "imports": ["/assets/index-Czg1ruVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-BMzmvxYw.js", "/assets/misc-CypjEQkt.js", "/assets/error-boundary-DxfVshQ5.js"], "css": [] }, "routes/_app+/_layout": { "id": "routes/_app+/_layout", "parentId": "root", "path": void 0, "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-DHBLG7Ti.js", "imports": ["/assets/index-Czg1ruVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-BMzmvxYw.js", "/assets/misc-CypjEQkt.js", "/assets/tooltip-CfmIzAYi.js", "/assets/request-info-CUT0ULYN.js", "/assets/client-hints-BE5mB4r0.js", "/assets/index-4E9_Sx3m.js", "/assets/user-C4QTtQw5.js", "/assets/presence-DXXVJbaH.js", "/assets/progress-B_mReZVE.js", "/assets/index-90bzTYUX.js"], "css": [] }, "routes/_app+/_exercises+/_layout": { "id": "routes/_app+/_exercises+/_layout", "parentId": "routes/_app+/_layout", "path": void 0, "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-DaZNLfOL.js", "imports": ["/assets/index-Czg1ruVn.js"], "css": [] }, "routes/_app+/_exercises+/$exerciseNumber": { "id": "routes/_app+/_exercises+/$exerciseNumber", "parentId": "routes/_app+/_exercises+/_layout", "path": ":exerciseNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber-CFOo2dQj.js", "imports": ["/assets/index-Czg1ruVn.js", "/assets/components-BMzmvxYw.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-CypjEQkt.js", "/assets/request-info-CUT0ULYN.js", "/assets/tooltip-CfmIzAYi.js", "/assets/client-hints-BE5mB4r0.js", "/assets/index-90bzTYUX.js", "/assets/loading-CNWJVymJ.js", "/assets/epic-video-CYnG2ziQ.js", "/assets/progress-bar-DCrt7X4t.js", "/assets/index-D6ukHE4T.js", "/assets/mdx-CR7Me1v_.js", "/assets/progress-B_mReZVE.js", "/assets/seo-Bu3_n5my.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber": { "id": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber", "parentId": "routes/_app+/_exercises+/_layout", "path": ":exerciseNumber/:stepNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber_._stepNumber-DCbWNWpZ.js", "imports": ["/assets/index-Czg1ruVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-BMzmvxYw.js", "/assets/misc-CypjEQkt.js"], "css": [] }, "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/_layout": { "id": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/_layout", "parentId": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber", "path": ":type", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_layout-Bdd3mpVx.js", "imports": ["/assets/index-Czg1ruVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-BMzmvxYw.js", "/assets/misc-CypjEQkt.js", "/assets/tooltip-CfmIzAYi.js", "/assets/request-info-CUT0ULYN.js", "/assets/client-hints-BE5mB4r0.js", "/assets/index-90bzTYUX.js", "/assets/loading-CNWJVymJ.js", "/assets/epic-video-CYnG2ziQ.js", "/assets/progress-bar-DCrt7X4t.js", "/assets/index-4E9_Sx3m.js", "/assets/mdx-CR7Me1v_.js", "/assets/user-C4QTtQw5.js", "/assets/index-D6ukHE4T.js", "/assets/diff-P5f7-8E4.js", "/assets/error-boundary-DxfVshQ5.js", "/assets/nav-chevrons-BYKwyIgG.js", "/assets/progress-B_mReZVE.js", "/assets/seo-Bu3_n5my.js", "/assets/discord-COPE8EOZ.js", "/assets/index-Doi37489.js", "/assets/button-CyZl24U2.js", "/assets/use-event-source-ySol3hbz.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.index": { "id": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.index", "parentId": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/_exercises+/$exerciseNumber_.finished": { "id": "routes/_app+/_exercises+/$exerciseNumber_.finished", "parentId": "routes/_app+/_exercises+/_layout", "path": ":exerciseNumber/finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_.finished-P7xMAtl1.js", "imports": ["/assets/index-Czg1ruVn.js", "/assets/components-BMzmvxYw.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-CypjEQkt.js", "/assets/request-info-CUT0ULYN.js", "/assets/tooltip-CfmIzAYi.js", "/assets/client-hints-BE5mB4r0.js", "/assets/index-90bzTYUX.js", "/assets/loading-CNWJVymJ.js", "/assets/epic-video-CYnG2ziQ.js", "/assets/progress-bar-DCrt7X4t.js", "/assets/index-D6ukHE4T.js", "/assets/nav-chevrons-BYKwyIgG.js", "/assets/mdx-CR7Me1v_.js", "/assets/progress-B_mReZVE.js", "/assets/seo-Bu3_n5my.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/account": { "id": "routes/_app+/account", "parentId": "routes/_app+/_layout", "path": "account", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/account-CnLkZd_O.js", "imports": ["/assets/index-Czg1ruVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-BMzmvxYw.js", "/assets/request-info-CUT0ULYN.js", "/assets/button-CyZl24U2.js", "/assets/misc-CypjEQkt.js", "/assets/user-C4QTtQw5.js", "/assets/presence-DXXVJbaH.js"], "css": [] }, "routes/_app+/app.$appName+/$": { "id": "routes/_app+/app.$appName+/$", "parentId": "routes/_app+/_layout", "path": "app/:appName/*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/api.$": { "id": "routes/_app+/app.$appName+/api.$", "parentId": "routes/_app+/_layout", "path": "app/:appName/api/*", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/api._-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/epic_ws[.js]": { "id": "routes/_app+/app.$appName+/epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/index": { "id": "routes/_app+/app.$appName+/index", "parentId": "routes/_app+/_layout", "path": "app/:appName/", "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-K6Dvbx-E.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.$testName": { "id": "routes/_app+/app.$appName+/test.$testName", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/:testName", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test._testName-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/discord": { "id": "routes/_app+/discord", "parentId": "routes/_app+/_layout", "path": "discord", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord-DIog7bBO.js", "imports": ["/assets/index-Czg1ruVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-BMzmvxYw.js", "/assets/misc-CypjEQkt.js", "/assets/user-C4QTtQw5.js", "/assets/discord-COPE8EOZ.js"], "css": [] }, "routes/_app+/finished": { "id": "routes/_app+/finished", "parentId": "routes/_app+/_layout", "path": "finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/finished-DP5ynR5u.js", "imports": ["/assets/index-Czg1ruVn.js", "/assets/components-BMzmvxYw.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-CypjEQkt.js", "/assets/request-info-CUT0ULYN.js", "/assets/tooltip-CfmIzAYi.js", "/assets/client-hints-BE5mB4r0.js", "/assets/index-90bzTYUX.js", "/assets/loading-CNWJVymJ.js", "/assets/epic-video-CYnG2ziQ.js", "/assets/progress-bar-DCrt7X4t.js", "/assets/index-D6ukHE4T.js", "/assets/nav-chevrons-BYKwyIgG.js", "/assets/mdx-CR7Me1v_.js", "/assets/seo-Bu3_n5my.js", "/assets/progress-B_mReZVE.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/index": { "id": "routes/_app+/index", "parentId": "routes/_app+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-BXefr1BB.js", "imports": ["/assets/index-Czg1ruVn.js", "/assets/components-BMzmvxYw.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-CypjEQkt.js", "/assets/request-info-CUT0ULYN.js", "/assets/tooltip-CfmIzAYi.js", "/assets/client-hints-BE5mB4r0.js", "/assets/index-90bzTYUX.js", "/assets/loading-CNWJVymJ.js", "/assets/epic-video-CYnG2ziQ.js", "/assets/progress-bar-DCrt7X4t.js", "/assets/index-D6ukHE4T.js", "/assets/error-boundary-DxfVshQ5.js", "/assets/mdx-CR7Me1v_.js", "/assets/progress-B_mReZVE.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/login": { "id": "routes/_app+/login", "parentId": "routes/_app+/_layout", "path": "login", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-DxG854vQ.js", "imports": ["/assets/index-Czg1ruVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-BMzmvxYw.js", "/assets/request-info-CUT0ULYN.js", "/assets/client-hints-BE5mB4r0.js", "/assets/use-event-source-ySol3hbz.js", "/assets/button-CyZl24U2.js", "/assets/loading-CNWJVymJ.js"], "css": [] }, "routes/_app+/support": { "id": "routes/_app+/support", "parentId": "routes/_app+/_layout", "path": "support", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/support-DrY-qRGh.js", "imports": ["/assets/index-Czg1ruVn.js", "/assets/components-BMzmvxYw.js"], "css": [] }, "routes/admin+/_layout": { "id": "routes/admin+/_layout", "parentId": "root", "path": "admin", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-rEQoj43V.js", "imports": ["/assets/index-Czg1ruVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-BMzmvxYw.js", "/assets/misc-CypjEQkt.js", "/assets/tooltip-CfmIzAYi.js", "/assets/progress-B_mReZVE.js"], "css": [] }, "routes/admin+/apps": { "id": "routes/admin+/apps", "parentId": "routes/admin+/_layout", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/apps": { "id": "routes/apps", "parentId": "root", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-DP2rzg_V.js", "imports": [], "css": [] }, "routes/diff": { "id": "routes/diff", "parentId": "root", "path": "diff", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/diff-PfwTHr6-.js", "imports": ["/assets/index-Czg1ruVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-BMzmvxYw.js", "/assets/misc-CypjEQkt.js", "/assets/tooltip-CfmIzAYi.js", "/assets/request-info-CUT0ULYN.js", "/assets/client-hints-BE5mB4r0.js", "/assets/index-90bzTYUX.js", "/assets/loading-CNWJVymJ.js", "/assets/epic-video-CYnG2ziQ.js", "/assets/progress-bar-DCrt7X4t.js", "/assets/index-4E9_Sx3m.js", "/assets/mdx-CR7Me1v_.js", "/assets/diff-P5f7-8E4.js", "/assets/nav-chevrons-BYKwyIgG.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/discord.callback": { "id": "routes/discord.callback", "parentId": "root", "path": "discord/callback", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord.callback-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/exercises": { "id": "routes/exercises", "parentId": "root", "path": "exercises", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/exercises-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/launch-editor": { "id": "routes/launch-editor", "parentId": "root", "path": "launch-editor", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/launch-editor-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/login-sse": { "id": "routes/login-sse", "parentId": "root", "path": "login-sse", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-sse-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/og": { "id": "routes/og", "parentId": "root", "path": "og", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/og-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/onboarding": { "id": "routes/onboarding", "parentId": "root", "path": "onboarding", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/onboarding-b9lcdh4n.js", "imports": ["/assets/index-Czg1ruVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-BMzmvxYw.js", "/assets/misc-CypjEQkt.js", "/assets/request-info-CUT0ULYN.js", "/assets/tooltip-CfmIzAYi.js", "/assets/client-hints-BE5mB4r0.js", "/assets/index-90bzTYUX.js", "/assets/loading-CNWJVymJ.js", "/assets/button-CyZl24U2.js", "/assets/epic-video-CYnG2ziQ.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/processes": { "id": "routes/processes", "parentId": "root", "path": "processes", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/processes-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/progress": { "id": "routes/progress", "parentId": "root", "path": "progress", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/progress-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/set-playground": { "id": "routes/set-playground", "parentId": "root", "path": "set-playground", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/set-playground-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/start": { "id": "routes/start", "parentId": "root", "path": "start", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/start-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/test": { "id": "routes/test", "parentId": "root", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/theme/index": { "id": "routes/theme/index", "parentId": "root", "path": "theme", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/update-mdx-cache": { "id": "routes/update-mdx-cache", "parentId": "root", "path": "update-mdx-cache", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/update-mdx-cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/video-player/index": { "id": "routes/video-player/index", "parentId": "root", "path": "video-player", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-DP2rzg_V.js", "imports": [], "css": [] } }, "url": "/assets/manifest-a1fde59b.js", "version": "a1fde59b" };
12485
12719
  const mode = "production";
12486
12720
  const assetsBuildDirectory = "build/client";
12487
12721
  const basename = "/";
12488
- const future = { "v3_fetcherPersist": false, "v3_relativeSplatPath": false, "v3_throwAbortReason": false, "unstable_singleFetch": false };
12722
+ const future = { "v3_fetcherPersist": false, "v3_relativeSplatPath": false, "v3_throwAbortReason": false, "unstable_singleFetch": false, "unstable_fogOfWar": false };
12489
12723
  const isSpaMode = false;
12490
12724
  const publicPath = "/";
12491
12725
  const entry = { module: entryServer };