@epic-web/workshop-app 4.6.6 → 4.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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-805aa13a.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 +840 -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
+ }, 500)
2556
2467
  )
2557
2468
  ]);
2558
2469
  if (response.statusText === "Timeout") {
@@ -2571,7 +2482,7 @@ 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;
2576
2487
  return [];
2577
2488
  }
@@ -2580,7 +2491,7 @@ async function getPresentUsers(user, { timings, request } = {}) {
2580
2491
  }
2581
2492
  function uniqueUsers(users) {
2582
2493
  const seen = /* @__PURE__ */ new Set();
2583
- return users.filter((user) => {
2494
+ return users.filter(Boolean).filter((user) => {
2584
2495
  if (seen.has(user.id)) {
2585
2496
  return false;
2586
2497
  }
@@ -2589,8 +2500,7 @@ function uniqueUsers(users) {
2589
2500
  });
2590
2501
  }
2591
2502
  function Confetti({ id }) {
2592
- if (!id)
2593
- return null;
2503
+ if (!id) return null;
2594
2504
  return /* @__PURE__ */ jsx(ClientOnly, { children: () => /* @__PURE__ */ jsx(
2595
2505
  Index$1,
2596
2506
  {
@@ -2902,8 +2812,7 @@ const Heading = React.forwardRef(function Heading2({ id, children, as: asProp, c
2902
2812
  );
2903
2813
  });
2904
2814
  function getErrorMessage(error) {
2905
- if (typeof error === "string")
2906
- return error;
2815
+ if (typeof error === "string") return error;
2907
2816
  if (error && typeof error === "object" && "message" in error && typeof error.message === "string") {
2908
2817
  return error.message;
2909
2818
  }
@@ -2957,8 +2866,7 @@ function getBaseUrl({
2957
2866
  function combineHeaders(...headers2) {
2958
2867
  const combined = new Headers();
2959
2868
  for (const header of headers2) {
2960
- if (!header)
2961
- continue;
2869
+ if (!header) continue;
2962
2870
  for (const [key, value] of new Headers(header).entries()) {
2963
2871
  combined.append(key, value);
2964
2872
  }
@@ -2968,8 +2876,7 @@ function combineHeaders(...headers2) {
2968
2876
  function debounce(fn, delay) {
2969
2877
  let timer = null;
2970
2878
  return (...args) => {
2971
- if (timer)
2972
- clearTimeout(timer);
2879
+ if (timer) clearTimeout(timer);
2973
2880
  timer = setTimeout(() => {
2974
2881
  fn(...args);
2975
2882
  }, delay);
@@ -3028,14 +2935,11 @@ function EpicProgress() {
3028
2935
  const isSubmitting = states.some((s) => s === "submitting");
3029
2936
  const isLoading = states.some((s) => s === "loading");
3030
2937
  useEffect(() => {
3031
- if (!ref.current)
3032
- return;
3033
- if (delayedPending)
3034
- setAnimationComplete(false);
2938
+ if (!ref.current) return;
2939
+ if (delayedPending) setAnimationComplete(false);
3035
2940
  const animationPromises = ref.current.getAnimations().map(({ finished }) => finished);
3036
2941
  void Promise.allSettled(animationPromises).then(() => {
3037
- if (!delayedPending)
3038
- setAnimationComplete(true);
2942
+ if (!delayedPending) setAnimationComplete(true);
3039
2943
  });
3040
2944
  }, [delayedPending]);
3041
2945
  return /* @__PURE__ */ jsx(
@@ -3078,25 +2982,31 @@ function ShowToast({ toast: toast$1 }) {
3078
2982
  const TooltipProvider = TooltipPrimitive.Provider;
3079
2983
  const Tooltip = TooltipPrimitive.Root;
3080
2984
  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
- ));
2985
+ function TooltipContent({
2986
+ className,
2987
+ sideOffset = 4,
2988
+ ref,
2989
+ ...props
2990
+ }) {
2991
+ return /* @__PURE__ */ jsx(
2992
+ TooltipPrimitive.Content,
2993
+ {
2994
+ ref,
2995
+ sideOffset,
2996
+ className: cn(
2997
+ "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",
2998
+ className
2999
+ ),
3000
+ ...props
3001
+ }
3002
+ );
3003
+ }
3093
3004
  TooltipContent.displayName = TooltipPrimitive.Content.displayName;
3094
3005
  function SimpleTooltip({
3095
3006
  content,
3096
3007
  children
3097
3008
  }) {
3098
- if (!content)
3099
- return children;
3009
+ if (!content) return children;
3100
3010
  return /* @__PURE__ */ jsxs(Tooltip, { children: [
3101
3011
  /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children }),
3102
3012
  /* @__PURE__ */ jsx(TooltipContent, { children: content })
@@ -3152,16 +3062,14 @@ function ErrorList({
3152
3062
  errors
3153
3063
  }) {
3154
3064
  const errorsToRender = errors == null ? void 0 : errors.filter(Boolean);
3155
- if (!(errorsToRender == null ? void 0 : errorsToRender.length))
3156
- return null;
3065
+ if (!(errorsToRender == null ? void 0 : errorsToRender.length)) return null;
3157
3066
  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
3067
  }
3159
3068
  const cookieName$1 = "EpicShop_theme";
3160
3069
  function getTheme(request) {
3161
3070
  const cookieHeader = request.headers.get("cookie");
3162
3071
  const parsed = cookieHeader ? cookie.parse(cookieHeader)[cookieName$1] : null;
3163
- if (parsed === "light" || parsed === "dark")
3164
- return parsed;
3072
+ if (parsed === "light" || parsed === "dark") return parsed;
3165
3073
  return null;
3166
3074
  }
3167
3075
  function setTheme(theme) {
@@ -3204,7 +3112,7 @@ function ThemeSwitch() {
3204
3112
  setIsHydrated(true);
3205
3113
  }, []);
3206
3114
  const [form] = useForm({
3207
- id: "onboarding",
3115
+ id: "theme-switcher",
3208
3116
  lastResult: fetcher.data,
3209
3117
  onValidate({ formData }) {
3210
3118
  return parseWithZod(formData, { schema: ThemeFormSchema });
@@ -3247,8 +3155,7 @@ function useTheme() {
3247
3155
  }
3248
3156
  );
3249
3157
  const optimisticTheme = (_a2 = fetcher == null ? void 0 : fetcher.formData) == null ? void 0 : _a2.get("theme");
3250
- if (optimisticTheme === "system")
3251
- return hints.theme;
3158
+ if (optimisticTheme === "system") return hints.theme;
3252
3159
  if (optimisticTheme === "light" || optimisticTheme === "dark") {
3253
3160
  return optimisticTheme;
3254
3161
  }
@@ -3261,7 +3168,7 @@ const route35 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
3261
3168
  useTheme
3262
3169
  }, Symbol.toStringTag, { value: "Module" }));
3263
3170
  const appStylesheetUrl = "/assets/app-BKC4z3M_.css";
3264
- const tailwindStylesheetUrl = "/assets/tailwind-Ck4g-nq0.css";
3171
+ const tailwindStylesheetUrl = "/assets/tailwind-D2vjZZFL.css";
3265
3172
  const cookieName = "EpicShop_confetti";
3266
3173
  function getConfetti(request) {
3267
3174
  const cookieHeader = request.headers.get("cookie");
@@ -3313,11 +3220,9 @@ const CachedEpicVideoInfoSchema = z$1.object({
3313
3220
  })
3314
3221
  ).or(z$1.null());
3315
3222
  async function getEpicVideoInfos(epicWebUrls, { request, timings } = {}) {
3316
- if (!epicWebUrls)
3317
- return {};
3223
+ if (!epicWebUrls) return {};
3318
3224
  const authInfo = await getAuthInfo();
3319
- if (ENV.EPICSHOP_DEPLOYED)
3320
- return {};
3225
+ if (ENV.EPICSHOP_DEPLOYED) return {};
3321
3226
  const epicVideoInfos = {};
3322
3227
  for (const epicVideoEmbed of epicWebUrls) {
3323
3228
  const epicVideoInfo = await getEpicVideoInfo({
@@ -3350,8 +3255,7 @@ async function getEpicVideoInfo({
3350
3255
  checkValue: CachedEpicVideoInfoSchema,
3351
3256
  async getFreshValue(context) {
3352
3257
  const epicWebUrl = new URL(epicVideoEmbed);
3353
- if (epicWebUrl.host !== "www.epicweb.dev")
3354
- return null;
3258
+ if (epicWebUrl.host !== "www.epicweb.dev") return null;
3355
3259
  const infoResponse = await fetch(
3356
3260
  `https://www.epicweb.dev/api${epicWebUrl.pathname}`,
3357
3261
  accessToken ? { headers: { authorization: `Bearer ${accessToken}` } } : void 0
@@ -3413,11 +3317,9 @@ async function getEpicProgress({
3413
3317
  request,
3414
3318
  forceFresh
3415
3319
  } = {}) {
3416
- if (ENV.EPICSHOP_DEPLOYED)
3417
- return [];
3320
+ if (ENV.EPICSHOP_DEPLOYED) return [];
3418
3321
  const authInfo = await getAuthInfo();
3419
- if (!authInfo)
3420
- return [];
3322
+ if (!authInfo) return [];
3421
3323
  const tokenPart = md5(authInfo.tokenSet.access_token);
3422
3324
  const EpicProgressSchema = z$1.array(
3423
3325
  z$1.object({
@@ -3456,14 +3358,11 @@ async function getProgress({
3456
3358
  timings,
3457
3359
  request
3458
3360
  } = {}) {
3459
- if (ENV.EPICSHOP_DEPLOYED)
3460
- return [];
3361
+ if (ENV.EPICSHOP_DEPLOYED) return [];
3461
3362
  const authInfo = await getAuthInfo();
3462
- if (!authInfo)
3463
- return [];
3363
+ if (!authInfo) return [];
3464
3364
  const epicWorkshopSlug = await getEpicWorkshopSlug();
3465
- if (!epicWorkshopSlug)
3466
- return [];
3365
+ if (!epicWorkshopSlug) return [];
3467
3366
  const [
3468
3367
  workshopData,
3469
3368
  epicProgress,
@@ -3595,11 +3494,9 @@ async function getWorkshopData(epicWorkshopSlug, {
3595
3494
  request,
3596
3495
  forceFresh
3597
3496
  } = {}) {
3598
- if (ENV.EPICSHOP_DEPLOYED)
3599
- return { sections: [] };
3497
+ if (ENV.EPICSHOP_DEPLOYED) return { sections: [] };
3600
3498
  const authInfo = await getAuthInfo();
3601
- if (!authInfo)
3602
- return { sections: [] };
3499
+ if (!authInfo) return { sections: [] };
3603
3500
  return cachified({
3604
3501
  key: `epic-workshop-data:${epicWorkshopSlug}`,
3605
3502
  cache: fsCache,
@@ -3646,13 +3543,10 @@ function usePresenceSocket(user) {
3646
3543
  const data = useRouteLoaderData("root");
3647
3544
  const [users, setUsers] = useState((data == null ? void 0 : data.presence.users) ?? []);
3648
3545
  const [clientId] = useState(() => {
3649
- if (typeof document === "undefined")
3650
- return null;
3651
- if (user)
3652
- return user.id;
3546
+ if (typeof document === "undefined") return null;
3547
+ if (user) return user.id;
3653
3548
  const clientId2 = sessionStorage.getItem("clientId");
3654
- if (clientId2)
3655
- return clientId2;
3549
+ if (clientId2) return clientId2;
3656
3550
  const newClientId = createId();
3657
3551
  sessionStorage.setItem("clientId", newClientId);
3658
3552
  return newClientId;
@@ -3664,8 +3558,7 @@ function usePresenceSocket(user) {
3664
3558
  const messageResult = MessageSchema.safeParse(
3665
3559
  JSON.parse(String(evt.data))
3666
3560
  );
3667
- if (!messageResult.success)
3668
- return;
3561
+ if (!messageResult.success) return;
3669
3562
  if (messageResult.data.type === "presence") {
3670
3563
  setUsers(messageResult.data.payload.users);
3671
3564
  }
@@ -3703,8 +3596,7 @@ function usePresenceSocket(user) {
3703
3596
  }
3704
3597
  const messageJson = message ? JSON.stringify(message) : null;
3705
3598
  useEffect(() => {
3706
- if (messageJson)
3707
- socket.send(messageJson);
3599
+ if (messageJson) socket.send(messageJson);
3708
3600
  }, [messageJson, socket]);
3709
3601
  const scoredUsers = scoreUsers(location, users);
3710
3602
  return { users: scoredUsers };
@@ -3729,8 +3621,7 @@ function scoreUsers(location, users) {
3729
3621
  return { user, score: Math.floor(score / available * 10) / 10 };
3730
3622
  });
3731
3623
  return scoredUsers.sort((a, b) => {
3732
- if (a.score === b.score)
3733
- return 0;
3624
+ if (a.score === b.score) return 0;
3734
3625
  return a.score > b.score ? -1 : 1;
3735
3626
  });
3736
3627
  }
@@ -3845,8 +3736,7 @@ const links = () => {
3845
3736
  ];
3846
3737
  };
3847
3738
  const meta$5 = ({ data }) => {
3848
- if (!data)
3849
- return [];
3739
+ if (!data) return [];
3850
3740
  return getSeoMetaTags({
3851
3741
  instructor: data.instructor,
3852
3742
  title: data.workshopTitle,
@@ -4104,6 +3994,103 @@ const route1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
4104
3994
  default: NotFound,
4105
3995
  loader: loader$r
4106
3996
  }, Symbol.toStringTag, { value: "Module" }));
3997
+ function makeMediaQueryStore(mediaQuery, serverSnapshot) {
3998
+ function getSnapshot() {
3999
+ return window.matchMedia(mediaQuery).matches;
4000
+ }
4001
+ function subscribe(callback) {
4002
+ const mediaQueryList = window.matchMedia(mediaQuery);
4003
+ mediaQueryList.addEventListener("change", callback);
4004
+ return () => {
4005
+ mediaQueryList.removeEventListener("change", callback);
4006
+ };
4007
+ }
4008
+ return function useMediaQuery() {
4009
+ return useSyncExternalStore(subscribe, getSnapshot, () => serverSnapshot);
4010
+ };
4011
+ }
4012
+ const Dialog = DialogPrimitive.Root;
4013
+ const DialogTrigger = DialogPrimitive.Trigger;
4014
+ const DialogPortal = DialogPrimitive.Portal;
4015
+ function DialogOverlay({
4016
+ className,
4017
+ ref,
4018
+ ...props
4019
+ }) {
4020
+ return /* @__PURE__ */ jsx(
4021
+ DialogPrimitive.Overlay,
4022
+ {
4023
+ ref,
4024
+ className: cn(
4025
+ "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",
4026
+ className
4027
+ ),
4028
+ ...props
4029
+ }
4030
+ );
4031
+ }
4032
+ DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
4033
+ function DialogContent({
4034
+ className,
4035
+ children,
4036
+ ref,
4037
+ ...props
4038
+ }) {
4039
+ return /* @__PURE__ */ jsxs(DialogPortal, { children: [
4040
+ /* @__PURE__ */ jsx(DialogOverlay, {}),
4041
+ /* @__PURE__ */ jsxs(
4042
+ DialogPrimitive.Content,
4043
+ {
4044
+ ref,
4045
+ className: cn(
4046
+ "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",
4047
+ className
4048
+ ),
4049
+ ...props,
4050
+ children: [
4051
+ children,
4052
+ /* @__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: [
4053
+ /* @__PURE__ */ jsx(Icon, { name: "Close" }),
4054
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
4055
+ ] })
4056
+ ]
4057
+ }
4058
+ )
4059
+ ] });
4060
+ }
4061
+ DialogContent.displayName = DialogPrimitive.Content.displayName;
4062
+ function DialogHeader({
4063
+ className,
4064
+ ...props
4065
+ }) {
4066
+ return /* @__PURE__ */ jsx(
4067
+ "div",
4068
+ {
4069
+ className: cn(
4070
+ "flex flex-col space-y-1.5 text-center sm:text-left",
4071
+ className
4072
+ ),
4073
+ ...props
4074
+ }
4075
+ );
4076
+ }
4077
+ DialogHeader.displayName = "DialogHeader";
4078
+ DialogPrimitive.Title.displayName;
4079
+ function DialogDescription({
4080
+ className,
4081
+ ref,
4082
+ ...props
4083
+ }) {
4084
+ return /* @__PURE__ */ jsx(
4085
+ DialogPrimitive.Description,
4086
+ {
4087
+ ref,
4088
+ className: cn("text-sm text-muted-foreground", className),
4089
+ ...props
4090
+ }
4091
+ );
4092
+ }
4093
+ DialogDescription.displayName = DialogPrimitive.Description.displayName;
4107
4094
  function useOptionalUser() {
4108
4095
  const data = useRouteLoaderData("root");
4109
4096
  return data == null ? void 0 : data.user;
@@ -4129,8 +4116,7 @@ function useEpicProgress() {
4129
4116
  return f.formAction === "/progress" && ((_a2 = f.formData) == null ? void 0 : _a2.has("complete"));
4130
4117
  }
4131
4118
  );
4132
- if (!progressFetcher || !(data == null ? void 0 : data.progress))
4133
- return (data == null ? void 0 : data.progress) ?? null;
4119
+ if (!progressFetcher || !(data == null ? void 0 : data.progress)) return (data == null ? void 0 : data.progress) ?? null;
4134
4120
  return data.progress.map((p) => {
4135
4121
  var _a2, _b2;
4136
4122
  const optimisticCompleted = ((_a2 = progressFetcher.formData) == null ? void 0 : _a2.get("complete")) === "true";
@@ -4147,49 +4133,34 @@ function useEpicProgress() {
4147
4133
  }
4148
4134
  function useRequireEpicProgress() {
4149
4135
  const progress = useEpicProgress();
4150
- if (!progress)
4151
- return [];
4136
+ if (!progress) return [];
4152
4137
  return progress;
4153
4138
  }
4154
4139
  function useNextExerciseRoute() {
4155
4140
  const progress = useEpicProgress();
4156
- if (!progress)
4157
- return null;
4141
+ if (!progress) return null;
4158
4142
  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;
4143
+ if (a.type === "workshop-instructions") return 0;
4144
+ if (a.type === "workshop-finished") return 1e4;
4145
+ if (a.type === "instructions") return a.exerciseNumber * 100;
4146
+ if (a.type === "step") return a.exerciseNumber * 100 + a.stepNumber;
4147
+ if (a.type === "finished") return a.exerciseNumber * 100 + 100;
4148
+ if (a.type === "unknown") return 1e5;
4171
4149
  return -1;
4172
4150
  };
4173
4151
  const sortedProgress = progress.sort((a, b) => {
4174
4152
  return scoreProgress(a) - scoreProgress(b);
4175
4153
  });
4176
4154
  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";
4155
+ if (!nextProgress) return null;
4156
+ if (nextProgress.type === "unknown") return null;
4157
+ if (nextProgress.type === "workshop-instructions") return "/";
4158
+ if (nextProgress.type === "workshop-finished") return "/finished";
4185
4159
  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`;
4160
+ if (nextProgress.type === "instructions") return `/${ex}`;
4161
+ if (nextProgress.type === "finished") return `/${ex}/finished`;
4190
4162
  const st = nextProgress.stepNumber.toString().padStart(2, "0");
4191
- if (nextProgress.type === "step")
4192
- return `/${ex}/${st}/problem`;
4163
+ if (nextProgress.type === "step") return `/${ex}/${st}/problem`;
4193
4164
  return null;
4194
4165
  }
4195
4166
  const percentageClassNames = {
@@ -4207,13 +4178,11 @@ const percentageClassNames = {
4207
4178
  };
4208
4179
  function useExerciseProgressClassName(exerciseNumber) {
4209
4180
  const progress = useEpicProgress();
4210
- if (!(progress == null ? void 0 : progress.length))
4211
- return null;
4181
+ if (!(progress == null ? void 0 : progress.length)) return null;
4212
4182
  const exerciseProgress = progress.filter(
4213
4183
  (p) => (p.type === "instructions" || p.type === "step" || p.type === "finished") && p.exerciseNumber === exerciseNumber
4214
4184
  );
4215
- if (!exerciseProgress.length)
4216
- return null;
4185
+ if (!exerciseProgress.length) return null;
4217
4186
  const percentComlete = exerciseProgress.reduce(
4218
4187
  (acc, p) => p.epicCompletedAt ? acc + 1 : acc,
4219
4188
  0
@@ -4225,8 +4194,7 @@ function useExerciseProgressClassName(exerciseNumber) {
4225
4194
  }
4226
4195
  function useProgressItemClassName(progressItemSearch) {
4227
4196
  const progressItem = useProgressItem(progressItemSearch);
4228
- if (!(progressItem == null ? void 0 : progressItem.epicCompletedAt))
4229
- return null;
4197
+ if (!(progressItem == null ? void 0 : progressItem.epicCompletedAt)) return null;
4230
4198
  return `relative before:h-[100%] before:bg-highlight before:absolute before:left-0 before:top-0 before:w-[4px]`;
4231
4199
  }
4232
4200
  function useProgressItem({
@@ -4235,8 +4203,7 @@ function useProgressItem({
4235
4203
  type
4236
4204
  }) {
4237
4205
  const progress = useEpicProgress();
4238
- if (!(progress == null ? void 0 : progress.length))
4239
- return null;
4206
+ if (!(progress == null ? void 0 : progress.length)) return null;
4240
4207
  if (type === "workshop-finished" || type === "workshop-instructions") {
4241
4208
  return progress.find((p) => p.type === type) ?? null;
4242
4209
  } else if (type === "instructions" || type === "finished") {
@@ -4270,15 +4237,12 @@ async function action$b({ request }) {
4270
4237
  (p) => p.epicLessonSlug === lessonSlug
4271
4238
  );
4272
4239
  function getCompletionAnnouncement() {
4273
- if (!complete)
4274
- return null;
4275
- if (!lessonProgress)
4276
- return null;
4240
+ if (!complete) return null;
4241
+ if (!lessonProgress) return null;
4277
4242
  const allOtherAreFinished = beforeProgress.every(
4278
4243
  (p) => p.epicCompletedAt || p.epicLessonSlug === lessonProgress.epicLessonSlug
4279
4244
  );
4280
- if (allOtherAreFinished)
4281
- return "You completed the workshop!";
4245
+ if (allOtherAreFinished) return "You completed the workshop!";
4282
4246
  if (lessonProgress.type === "workshop-instructions" || lessonProgress.type === "unknown" || lessonProgress.type === "workshop-finished") {
4283
4247
  return null;
4284
4248
  }
@@ -4334,17 +4298,14 @@ function ProgressToggle({
4334
4298
  navigationLocationStateFrom
4335
4299
  ]);
4336
4300
  React.useEffect(() => {
4337
- if (!animationRef.current)
4338
- return;
4339
- if (!startAnimation)
4340
- return;
4301
+ if (!animationRef.current) return;
4302
+ if (!startAnimation) return;
4341
4303
  const animationPromises = animationRef.current.getAnimations().map(({ finished }) => finished);
4342
4304
  void Promise.allSettled(animationPromises).then(() => {
4343
4305
  setStartAnimation(false);
4344
4306
  });
4345
4307
  }, [startAnimation]);
4346
- if (ENV.EPICSHOP_DEPLOYED || !progressItem)
4347
- return null;
4308
+ if (ENV.EPICSHOP_DEPLOYED || !progressItem) return null;
4348
4309
  return /* @__PURE__ */ jsxs(progressFetcher.Form, { method: "POST", action: "/progress", children: [
4349
4310
  /* @__PURE__ */ jsx(
4350
4311
  "input",
@@ -4502,8 +4463,7 @@ function FacePile({ isMenuOpened }) {
4502
4463
  const { users } = usePresence();
4503
4464
  const limit = isMenuOpened ? 17 : 0;
4504
4465
  const numberOverLimit = users.length - limit;
4505
- if (!users.length)
4506
- return null;
4466
+ if (!users.length) return null;
4507
4467
  const tiffany = isMenuOpened && users.length === 1 ? /* @__PURE__ */ jsx(
4508
4468
  Link,
4509
4469
  {
@@ -4591,32 +4551,41 @@ function FacePile({ isMenuOpened }) {
4591
4551
  ] }) : null
4592
4552
  ] }) });
4593
4553
  }
4554
+ const useIsWide = makeMediaQueryStore("(min-width: 640px)", true);
4594
4555
  function App() {
4595
4556
  const user = useOptionalUser();
4557
+ const isWide = useIsWide();
4596
4558
  const [isMenuOpened, setMenuOpened] = React.useState(false);
4597
4559
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
4598
4560
  user ? null : /* @__PURE__ */ jsx(EpicWebBanner, {}),
4561
+ /* @__PURE__ */ jsx(
4562
+ MobileNavigation,
4563
+ {
4564
+ isMenuOpened,
4565
+ onMenuOpenChange: setMenuOpened
4566
+ }
4567
+ ),
4599
4568
  /* @__PURE__ */ jsxs(
4600
4569
  "div",
4601
4570
  {
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
4571
+ className: cn("flex flex-grow flex-col sm:flex-row", {
4572
+ "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,
4573
+ "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,
4574
+ "h-[unset]": !isWide && isMenuOpened
4606
4575
  }),
4607
4576
  children: [
4608
- /* @__PURE__ */ jsx(
4577
+ isWide ? /* @__PURE__ */ jsx(
4609
4578
  Navigation,
4610
4579
  {
4611
4580
  isMenuOpened,
4612
4581
  onMenuOpenChange: setMenuOpened
4613
4582
  }
4614
- ),
4583
+ ) : null,
4615
4584
  /* @__PURE__ */ jsx(
4616
4585
  "div",
4617
4586
  {
4618
4587
  className: cn(
4619
- "h-full w-full max-w-[calc(100%-56px)]",
4588
+ "h-full w-full max-w-full sm:max-w-[calc(100%-56px)]",
4620
4589
  isMenuOpened ? "hidden md:block" : ""
4621
4590
  ),
4622
4591
  children: /* @__PURE__ */ jsx(Outlet, {})
@@ -4628,8 +4597,7 @@ function App() {
4628
4597
  ] });
4629
4598
  }
4630
4599
  function getLocationLabel(location) {
4631
- if (!location)
4632
- return null;
4600
+ if (!location) return null;
4633
4601
  const { exercise } = location;
4634
4602
  const exercisePortion = [
4635
4603
  exercise ? [exercise.exerciseNumber, exercise.stepNumber].filter(Boolean).map((s) => s.toString().padStart(2, "0")).join("/") : null,
@@ -4638,118 +4606,438 @@ function getLocationLabel(location) {
4638
4606
  return { line1: location.workshopTitle, line2: exercisePortion };
4639
4607
  }
4640
4608
  function EpicWebBanner() {
4641
- return /* @__PURE__ */ jsxs(
4642
- "div",
4609
+ const isWide = useIsWide();
4610
+ const details = /* @__PURE__ */ jsx("div", { children: ENV.EPICSHOP_DEPLOYED ? /* @__PURE__ */ jsxs("div", { children: [
4611
+ `This is the deployed version. `,
4612
+ ENV.EPICSHOP_GITHUB_ROOT ? /* @__PURE__ */ jsxs(Fragment, { children: [
4613
+ /* @__PURE__ */ jsx(
4614
+ Link,
4615
+ {
4616
+ className: "underline",
4617
+ target: "_blank",
4618
+ rel: "noopener noreferrer",
4619
+ to: ENV.EPICSHOP_GITHUB_ROOT,
4620
+ children: "Run locally"
4621
+ }
4622
+ ),
4623
+ ` for full experience.`
4624
+ ] }) : null,
4625
+ " "
4626
+ ] }) : /* @__PURE__ */ jsxs("div", { children: [
4627
+ /* @__PURE__ */ jsx(Link, { to: "/login", className: "underline", children: "Login" }),
4628
+ " ",
4629
+ "or",
4630
+ " ",
4631
+ /* @__PURE__ */ jsx("a", { href: "https://www.epicweb.dev/login", className: "underline", children: "join for free" }),
4632
+ " ",
4633
+ "for the full experience."
4634
+ ] }) });
4635
+ 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: [
4636
+ /* @__PURE__ */ jsxs("div", { className: "hidden flex-1 flex-wrap items-center gap-4 sm:flex", children: [
4637
+ /* @__PURE__ */ jsx(Icon, { name: "EpicWeb", size: "lg" }),
4638
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-wrap items-center", children: [
4639
+ /* @__PURE__ */ jsxs("p", { className: "mr-2", children: [
4640
+ "Welcome to the",
4641
+ " ",
4642
+ /* @__PURE__ */ jsx(
4643
+ Link,
4644
+ {
4645
+ to: "https://www.epicweb.dev",
4646
+ className: "underline",
4647
+ target: "_blank",
4648
+ children: "EpicWeb.dev"
4649
+ }
4650
+ ),
4651
+ " ",
4652
+ "Workshop app!"
4653
+ ] }),
4654
+ details
4655
+ ] })
4656
+ ] }),
4657
+ /* @__PURE__ */ jsxs("div", { className: "hidden h-full flex-col items-center sm:flex md:flex-row", children: [
4658
+ /* @__PURE__ */ jsxs(
4659
+ Link,
4660
+ {
4661
+ to: "https://www.epicweb.dev",
4662
+ target: "_blank",
4663
+ className: "flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold",
4664
+ children: [
4665
+ /* @__PURE__ */ jsx("span", { className: "drop-shadow-sm", children: "Join Epic Web" }),
4666
+ /* @__PURE__ */ jsx("span", { children: "↗︎" })
4667
+ ]
4668
+ }
4669
+ ),
4670
+ /* @__PURE__ */ jsxs(
4671
+ Link,
4672
+ {
4673
+ to: ENV.EPICSHOP_DEPLOYED ? "https://www.epicweb.dev/login" : "/login",
4674
+ 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",
4675
+ children: [
4676
+ /* @__PURE__ */ jsx(Icon, { name: "User", size: "lg" }),
4677
+ /* @__PURE__ */ jsx("span", { className: "drop-shadow-sm", children: "Login" })
4678
+ ]
4679
+ }
4680
+ )
4681
+ ] })
4682
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
4683
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-wrap items-center gap-4 sm:hidden", children: [
4684
+ /* @__PURE__ */ jsx("a", { href: "https://www.epicweb.dev", children: /* @__PURE__ */ jsx(Icon, { name: "EpicWeb", size: "lg" }) }),
4685
+ /* @__PURE__ */ jsxs(Dialog, { children: [
4686
+ /* @__PURE__ */ jsx(DialogTrigger, { children: /* @__PURE__ */ jsx(Icon, { name: "Question", size: "lg", className: "animate-pulse" }) }),
4687
+ /* @__PURE__ */ jsxs(DialogContent, { children: [
4688
+ /* @__PURE__ */ jsxs(DialogHeader, { children: [
4689
+ /* @__PURE__ */ jsx(Icon, { name: "EpicWeb", size: "lg" }),
4690
+ /* @__PURE__ */ jsx("span", { className: "text-lg font-semibold", children: "EpicWeb.dev" })
4691
+ ] }),
4692
+ /* @__PURE__ */ jsxs(DialogDescription, { children: [
4693
+ "Welcome to the",
4694
+ " ",
4695
+ /* @__PURE__ */ jsx(Link, { to: "https://www.epicweb.dev", className: "underline", children: "EpicWeb.dev" }),
4696
+ " ",
4697
+ "Workshop app!"
4698
+ ] }),
4699
+ details
4700
+ ] })
4701
+ ] })
4702
+ ] }),
4703
+ /* @__PURE__ */ jsxs("div", { className: "flex h-full items-center", children: [
4704
+ /* @__PURE__ */ jsxs(
4705
+ Link,
4706
+ {
4707
+ to: "https://www.epicweb.dev",
4708
+ target: "_blank",
4709
+ className: "flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold",
4710
+ children: [
4711
+ /* @__PURE__ */ jsx("span", { className: "drop-shadow-sm", children: "Join" }),
4712
+ /* @__PURE__ */ jsx("span", { children: "↗︎" })
4713
+ ]
4714
+ }
4715
+ ),
4716
+ /* @__PURE__ */ jsxs(
4717
+ Link,
4718
+ {
4719
+ to: ENV.EPICSHOP_DEPLOYED ? "https://www.epicweb.dev/login" : "/login",
4720
+ 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",
4721
+ children: [
4722
+ /* @__PURE__ */ jsx(Icon, { name: "User", size: "lg" }),
4723
+ /* @__PURE__ */ jsx("span", { className: "drop-shadow-sm", children: "Login" })
4724
+ ]
4725
+ }
4726
+ )
4727
+ ] })
4728
+ ] }) });
4729
+ }
4730
+ const itemVariants = {
4731
+ hidden: { opacity: 0, x: -20 },
4732
+ visible: { opacity: 1, x: 0 }
4733
+ };
4734
+ function NavigationExerciseListItem({
4735
+ exerciseNumber,
4736
+ children
4737
+ }) {
4738
+ const progressClassName = useExerciseProgressClassName(exerciseNumber);
4739
+ return /* @__PURE__ */ jsx(
4740
+ motion.li,
4643
4741
  {
4742
+ variants: itemVariants,
4644
4743
  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"
4744
+ // add gap of 3 to children, but using padding so the progress extends through the whole height
4745
+ "py-[6px] first:pt-3 last:pb-3",
4746
+ progressClassName ? `${progressClassName} before:border-t` : null
4647
4747
  ),
4748
+ children: /* @__PURE__ */ jsx("span", { className: "ml-2", children })
4749
+ }
4750
+ );
4751
+ }
4752
+ function NavigationExerciseStepListItem({
4753
+ children,
4754
+ ...progressItemSearch
4755
+ }) {
4756
+ const progressClassName = useProgressItemClassName(progressItemSearch);
4757
+ return /* @__PURE__ */ jsx(
4758
+ motion.li,
4759
+ {
4760
+ variants: itemVariants,
4761
+ className: cn(
4762
+ // add gap of 3 to children, but using padding so the progress extends through the whole height
4763
+ "py-[6px] first:pt-3 last:pb-3",
4764
+ progressClassName ? `${progressClassName} before:border-t` : null
4765
+ ),
4766
+ children: /* @__PURE__ */ jsx("span", { className: "ml-2", children })
4767
+ }
4768
+ );
4769
+ }
4770
+ function MobileNavigation({
4771
+ isMenuOpened,
4772
+ onMenuOpenChange: setMenuOpened
4773
+ }) {
4774
+ const data = useLoaderData();
4775
+ const user = useOptionalUser();
4776
+ const nextExerciseRoute = useNextExerciseRoute();
4777
+ const params = useParams();
4778
+ const { users } = usePresence();
4779
+ const listVariants = {
4780
+ visible: {
4781
+ opacity: 1,
4782
+ transition: {
4783
+ duration: 0.05,
4784
+ when: "beforeChildren",
4785
+ staggerChildren: 0.03
4786
+ }
4787
+ },
4788
+ hidden: {
4789
+ opacity: 0
4790
+ }
4791
+ };
4792
+ return /* @__PURE__ */ jsx("nav", { className: "flex w-full border-b sm:hidden", children: /* @__PURE__ */ jsx("div", { className: "w-full", children: /* @__PURE__ */ jsxs(
4793
+ "div",
4794
+ {
4795
+ className: cn("flex items-center", {
4796
+ "flex-col": isMenuOpened,
4797
+ "h-14": !isMenuOpened
4798
+ }),
4648
4799
  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
- " ",
4800
+ /* @__PURE__ */ jsx(
4801
+ NavToggle,
4802
+ {
4803
+ title: data.workshopTitle,
4804
+ isMenuOpened,
4805
+ setMenuOpened
4806
+ }
4807
+ ),
4808
+ isMenuOpened && /* @__PURE__ */ jsxs(
4809
+ motion.div,
4810
+ {
4811
+ className: "flex w-full flex-grow flex-col justify-between overflow-x-auto p-6 scrollbar-thin scrollbar-thumb-scrollbar",
4812
+ initial: { opacity: 0 },
4813
+ animate: { opacity: 1 },
4814
+ children: [
4655
4815
  /* @__PURE__ */ jsx(
4656
- Link,
4816
+ motion.ul,
4657
4817
  {
4658
- to: "https://www.epicweb.dev",
4659
- className: "underline",
4660
- target: "_blank",
4661
- children: "EpicWeb.dev"
4818
+ variants: listVariants,
4819
+ initial: "hidden",
4820
+ animate: "visible",
4821
+ className: "flex flex-col",
4822
+ children: data.exercises.map(({ exerciseNumber, title, steps }) => {
4823
+ const isActive = Number(params.exerciseNumber) === exerciseNumber;
4824
+ const showPlayground = !isActive && data.playground.exerciseNumber === exerciseNumber;
4825
+ const exerciseNum = exerciseNumber.toString().padStart(2, "0");
4826
+ return /* @__PURE__ */ jsxs(
4827
+ NavigationExerciseListItem,
4828
+ {
4829
+ exerciseNumber,
4830
+ children: [
4831
+ /* @__PURE__ */ jsxs(
4832
+ Link,
4833
+ {
4834
+ prefetch: "intent",
4835
+ to: `/${exerciseNum}`,
4836
+ className: clsx(
4837
+ "relative whitespace-nowrap px-2 py-0.5 pr-3 text-2xl font-bold outline-none hover:underline focus:underline",
4838
+ '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',
4839
+ { "bg-foreground text-background": isActive }
4840
+ ),
4841
+ children: [
4842
+ title,
4843
+ showPlayground ? " 🛝" : null
4844
+ ]
4845
+ }
4846
+ ),
4847
+ isActive ? /* @__PURE__ */ jsxs(
4848
+ motion.ul,
4849
+ {
4850
+ variants: listVariants,
4851
+ initial: "hidden",
4852
+ animate: "visible",
4853
+ className: "ml-4 mt-4 flex flex-col",
4854
+ children: [
4855
+ /* @__PURE__ */ jsx(
4856
+ NavigationExerciseStepListItem,
4857
+ {
4858
+ type: "instructions",
4859
+ exerciseNumber,
4860
+ children: /* @__PURE__ */ jsx(
4861
+ Link,
4862
+ {
4863
+ to: `/${exerciseNum}`,
4864
+ prefetch: "intent",
4865
+ className: clsx(
4866
+ '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',
4867
+ {
4868
+ "bg-foreground text-background": !params.stepNumber
4869
+ }
4870
+ ),
4871
+ children: "Intro"
4872
+ }
4873
+ )
4874
+ },
4875
+ exerciseNumber
4876
+ ),
4877
+ steps.filter(Boolean).map(({ name, stepNumber, title: title2 }) => {
4878
+ const isActive2 = Number(params.stepNumber) === stepNumber;
4879
+ const step = stepNumber.toString().padStart(2, "0");
4880
+ const isPlayground = name === data.playground.appName;
4881
+ return /* @__PURE__ */ jsx(
4882
+ NavigationExerciseStepListItem,
4883
+ {
4884
+ type: "step",
4885
+ stepNumber,
4886
+ exerciseNumber,
4887
+ children: /* @__PURE__ */ jsx(
4888
+ Link,
4889
+ {
4890
+ to: `/${exerciseNum}/${step}`,
4891
+ prefetch: "intent",
4892
+ className: clsx(
4893
+ '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',
4894
+ {
4895
+ "bg-foreground text-background": isActive2
4896
+ }
4897
+ ),
4898
+ children: isPlayground ? `${step}. ${title2} 🛝` : `${step}. ${title2}`
4899
+ }
4900
+ )
4901
+ },
4902
+ stepNumber
4903
+ );
4904
+ }),
4905
+ /* @__PURE__ */ jsx(
4906
+ NavigationExerciseStepListItem,
4907
+ {
4908
+ type: "finished",
4909
+ exerciseNumber,
4910
+ children: /* @__PURE__ */ jsx(
4911
+ NavLink,
4912
+ {
4913
+ to: `/${exerciseNum}/finished`,
4914
+ prefetch: "intent",
4915
+ className: ({ isActive: isActive2 }) => clsx(
4916
+ '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',
4917
+ {
4918
+ "bg-foreground text-background": isActive2
4919
+ }
4920
+ ),
4921
+ children: "📝 Elaboration"
4922
+ }
4923
+ )
4924
+ }
4925
+ )
4926
+ ]
4927
+ }
4928
+ ) : null
4929
+ ]
4930
+ },
4931
+ exerciseNumber
4932
+ );
4933
+ })
4662
4934
  }
4663
4935
  ),
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,
4936
+ /* @__PURE__ */ jsx("div", { className: "mt-6", children: /* @__PURE__ */ jsx(
4937
+ NavLink,
4672
4938
  {
4673
- className: "underline",
4674
- target: "_blank",
4675
- rel: "noopener noreferrer",
4676
- to: ENV.EPICSHOP_GITHUB_ROOT,
4677
- children: "Run locally"
4939
+ to: "/finished",
4940
+ className: ({ isActive }) => clsx(
4941
+ "relative whitespace-nowrap text-lg font-bold outline-none hover:underline focus:underline",
4942
+ {
4943
+ '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
4944
+ }
4945
+ ),
4946
+ children: "📝 Workshop Feedback"
4678
4947
  }
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
- ] })
4948
+ ) })
4949
+ ]
4950
+ }
4951
+ ),
4952
+ /* @__PURE__ */ jsx("div", { className: "flex-grow" }),
4953
+ /* @__PURE__ */ jsx(
4954
+ "div",
4955
+ {
4956
+ className: cn(
4957
+ "flex items-center justify-start p-4",
4958
+ isMenuOpened && users.length > 4 ? "min-h-14" : "h-14",
4959
+ {
4960
+ "w-full border-t": isMenuOpened,
4961
+ "border-l": !isMenuOpened
4962
+ }
4963
+ ),
4964
+ children: /* @__PURE__ */ jsx(FacePile, { isMenuOpened })
4965
+ }
4966
+ ),
4967
+ ENV.EPICSHOP_DEPLOYED ? null : user ? /* @__PURE__ */ jsx(SimpleTooltip, { content: isMenuOpened ? null : "Your account", children: /* @__PURE__ */ jsxs(
4968
+ Link,
4969
+ {
4970
+ className: cn(
4971
+ "flex h-14 items-center justify-start space-x-3 px-4 py-4 text-center no-underline hover:underline",
4972
+ {
4973
+ "border-l": !isMenuOpened,
4974
+ "w-full border-t": isMenuOpened
4975
+ }
4976
+ ),
4977
+ to: "/account",
4978
+ children: [
4979
+ user.avatarUrl ? /* @__PURE__ */ jsx(
4980
+ "img",
4981
+ {
4982
+ alt: user.name ?? user.email,
4983
+ src: user.avatarUrl,
4984
+ className: "h-full rounded-full"
4985
+ }
4986
+ ) : /* @__PURE__ */ jsx(Icon, { name: "User", className: "flex-shrink-0", size: "lg" }),
4987
+ isMenuOpened ? /* @__PURE__ */ jsx(
4988
+ motion.div,
4989
+ {
4990
+ className: "flex items-center whitespace-nowrap",
4991
+ initial: { opacity: 0 },
4992
+ animate: { opacity: 1 },
4993
+ children: "Your Account"
4994
+ }
4995
+ ) : /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Your account" })
4996
+ ]
4997
+ }
4998
+ ) }) : null,
4999
+ ENV.EPICSHOP_DEPLOYED ? null : user && nextExerciseRoute ? /* @__PURE__ */ jsx(
5000
+ SimpleTooltip,
5001
+ {
5002
+ content: isMenuOpened ? null : "Continue to next lesson",
5003
+ children: /* @__PURE__ */ jsxs(
5004
+ Link,
5005
+ {
5006
+ to: nextExerciseRoute,
5007
+ prefetch: "intent",
5008
+ className: clsx(
5009
+ "flex h-14 w-full items-center space-x-3 border-t px-4 py-4 pl-[18px] no-underline hover:underline"
5010
+ ),
5011
+ state: { from: "continue next lesson button" },
5012
+ children: [
5013
+ /* @__PURE__ */ jsx(Icon, { name: "FastForward", className: "flex-shrink-0", size: "md" }),
5014
+ isMenuOpened ? /* @__PURE__ */ jsx(
5015
+ motion.div,
5016
+ {
5017
+ className: "flex items-center whitespace-nowrap",
5018
+ initial: { opacity: 0 },
5019
+ animate: { opacity: 1 },
5020
+ children: "Continue to next lesson"
5021
+ }
5022
+ ) : /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Continue to next lesson" })
5023
+ ]
5024
+ }
5025
+ )
5026
+ }
5027
+ ) : null,
5028
+ /* @__PURE__ */ jsx(
5029
+ "div",
5030
+ {
5031
+ className: cn("h-14 self-start p-4 pt-[15px] sm:mb-4 sm:w-full", {
5032
+ "w-full border-t": isMenuOpened,
5033
+ "border-l": !isMenuOpened
5034
+ }),
5035
+ children: /* @__PURE__ */ jsx(ThemeSwitch, {})
5036
+ }
5037
+ )
4710
5038
  ]
4711
5039
  }
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
- );
5040
+ ) }) });
4753
5041
  }
4754
5042
  const OPENED_MENU_WIDTH = 400;
4755
5043
  function Navigation({
@@ -4788,7 +5076,7 @@ function Navigation({
4788
5076
  }
4789
5077
  };
4790
5078
  const exNum = Number(params.exerciseNumber).toString().padStart(2, "0");
4791
- return /* @__PURE__ */ jsx("nav", { className: "flex border-r", children: /* @__PURE__ */ jsx(
5079
+ return /* @__PURE__ */ jsx("nav", { className: "hidden border-r sm:flex", children: /* @__PURE__ */ jsx(
4792
5080
  motion.div,
4793
5081
  {
4794
5082
  initial: isMenuOpened ? "open" : "close",
@@ -5049,7 +5337,7 @@ function NavToggle({
5049
5337
  const path01Controls = useAnimationControls();
5050
5338
  const path02Controls = useAnimationControls();
5051
5339
  async function toggleMenu() {
5052
- void menuControls.start(isMenuOpened ? "close" : "open");
5340
+ void (menuControls == null ? void 0 : menuControls.start(isMenuOpened ? "close" : "open"));
5053
5341
  setMenuOpened(!isMenuOpened);
5054
5342
  if (isMenuOpened) {
5055
5343
  void path01Controls.start(path01Variants.closed);
@@ -5066,8 +5354,7 @@ function NavToggle({
5066
5354
  latestToggleMenu.current = toggleMenu;
5067
5355
  });
5068
5356
  React.useEffect(() => {
5069
- if (!isMenuOpened)
5070
- return;
5357
+ if (!isMenuOpened) return;
5071
5358
  function handleKeyUp(event) {
5072
5359
  if (event.key === "Escape") {
5073
5360
  void latestToggleMenu.current();
@@ -5076,48 +5363,59 @@ function NavToggle({
5076
5363
  document.addEventListener("keyup", handleKeyUp);
5077
5364
  return () => document.removeEventListener("keyup", handleKeyUp);
5078
5365
  }, [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
- ] });
5366
+ return /* @__PURE__ */ jsxs(
5367
+ "div",
5368
+ {
5369
+ className: cn(
5370
+ "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",
5371
+ {
5372
+ "w-full": isMenuOpened
5373
+ }
5374
+ ),
5375
+ children: [
5376
+ /* @__PURE__ */ jsx(
5377
+ "button",
5378
+ {
5379
+ className: "flex h-14 w-14 items-center justify-center",
5380
+ "aria-label": "Open Navigation menu",
5381
+ onClick: toggleMenu,
5382
+ children: /* @__PURE__ */ jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", children: [
5383
+ /* @__PURE__ */ jsx(
5384
+ motion.path,
5385
+ {
5386
+ ...path01Variants.closed,
5387
+ animate: path01Controls,
5388
+ transition: { duration: 0.2 },
5389
+ stroke: "currentColor",
5390
+ strokeWidth: 1.5
5391
+ }
5392
+ ),
5393
+ /* @__PURE__ */ jsx(
5394
+ motion.path,
5395
+ {
5396
+ ...path02Variants.closed,
5397
+ animate: path02Controls,
5398
+ transition: { duration: 0.2 },
5399
+ stroke: "currentColor",
5400
+ strokeWidth: 1.5
5401
+ }
5402
+ )
5403
+ ] })
5404
+ }
5405
+ ),
5406
+ isMenuOpened && /* @__PURE__ */ jsx(
5407
+ motion.p,
5408
+ {
5409
+ transition: { delay: 0.2 },
5410
+ initial: { opacity: 0, y: 5 },
5411
+ animate: { opacity: 1, y: 0 },
5412
+ className: "absolute right-5 whitespace-nowrap font-mono text-sm uppercase",
5413
+ children: /* @__PURE__ */ jsx(Link, { to: "/", children: title })
5414
+ }
5415
+ )
5416
+ ]
5417
+ }
5418
+ );
5121
5419
  }
5122
5420
  const route2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
5123
5421
  __proto__: null,
@@ -5180,15 +5478,12 @@ function MuxPlayer({
5180
5478
  const fetcherRef = useLatest(playerPreferencesFetcher);
5181
5479
  const playerPreferencesRef = useLatest(playerPreferences);
5182
5480
  React.useEffect(() => {
5183
- if (typeof document === "undefined")
5184
- return;
5481
+ if (typeof document === "undefined") return;
5185
5482
  const stored = sessionStorage.getItem(currentTimeSessionKey);
5186
- if (!stored)
5187
- return;
5483
+ if (!stored) return;
5188
5484
  try {
5189
5485
  const { time: time2, expiresAt } = PlaybackTimeSchema.parse(JSON.parse(stored));
5190
- if (expiresAt.getTime() < Date.now())
5191
- throw new Error("Time expired");
5486
+ if (expiresAt.getTime() < Date.now()) throw new Error("Time expired");
5192
5487
  setCurrentTime(time2);
5193
5488
  } catch {
5194
5489
  sessionStorage.removeItem(currentTimeSessionKey);
@@ -5196,8 +5491,7 @@ function MuxPlayer({
5196
5491
  }, [currentTimeSessionKey]);
5197
5492
  React.useEffect(() => {
5198
5493
  function handleUserKeyPress(e) {
5199
- if (!muxPlayerRef.current)
5200
- return;
5494
+ if (!muxPlayerRef.current) return;
5201
5495
  const activeElement = document.activeElement;
5202
5496
  const isContentEditable = activeElement instanceof HTMLElement ? activeElement.contentEditable === "true" : false;
5203
5497
  if (activeElement && !ignoredInputs.includes(activeElement.tagName.toLowerCase()) && !isContentEditable) {
@@ -5226,8 +5520,7 @@ function MuxPlayer({
5226
5520
  }, [muxPlayerRef]);
5227
5521
  const updatePreferences = useDebounce(() => {
5228
5522
  const player = muxPlayerRef.current;
5229
- if (!player)
5230
- return;
5523
+ if (!player) return;
5231
5524
  const subs = Array.from(player.textTracks ?? []).find(
5232
5525
  (t) => t.kind === "subtitles"
5233
5526
  );
@@ -5236,8 +5529,7 @@ function MuxPlayer({
5236
5529
  volumeRate: player.volume,
5237
5530
  subtitle: subs ? { id: subs.id, mode: subs.mode } : { id: null, mode: "disabled" }
5238
5531
  };
5239
- if (isDeepEqual(newPrefs, playerPreferencesRef.current))
5240
- return;
5532
+ if (isDeepEqual(newPrefs, playerPreferencesRef.current)) return;
5241
5533
  fetcherRef.current.submit(newPrefs, {
5242
5534
  method: "POST",
5243
5535
  action: "/video-player",
@@ -5246,11 +5538,9 @@ function MuxPlayer({
5246
5538
  }, 300);
5247
5539
  React.useEffect(() => {
5248
5540
  var _a2, _b2;
5249
- if (!metadataLoaded)
5250
- return;
5541
+ if (!metadataLoaded) return;
5251
5542
  const textTracks = (_a2 = muxPlayerRef.current) == null ? void 0 : _a2.textTracks;
5252
- if (!textTracks)
5253
- return;
5543
+ if (!textTracks) return;
5254
5544
  const subtitlePref = (_b2 = playerPreferencesRef.current) == null ? void 0 : _b2.subtitle;
5255
5545
  if (subtitlePref == null ? void 0 : subtitlePref.id) {
5256
5546
  const preferredTextTrack = textTracks.getTrackById(subtitlePref.id);
@@ -5308,32 +5598,23 @@ function MuxPlayer({
5308
5598
  ) });
5309
5599
  }
5310
5600
  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;
5601
+ if (obj1 === obj2) return true;
5602
+ if (typeof obj1 !== typeof obj2) return false;
5603
+ if (typeof obj1 !== "object" || typeof obj2 !== "object") return false;
5604
+ if (obj1 === null || obj2 === null) return false;
5605
+ if (Array.isArray(obj1) !== Array.isArray(obj2)) return false;
5321
5606
  if (Array.isArray(obj1) && Array.isArray(obj2)) {
5322
- if (obj1.length !== obj2.length)
5323
- return false;
5607
+ if (obj1.length !== obj2.length) return false;
5324
5608
  for (let i = 0; i < obj1.length; i++) {
5325
- if (!isDeepEqual(obj1[i], obj2[i]))
5326
- return false;
5609
+ if (!isDeepEqual(obj1[i], obj2[i])) return false;
5327
5610
  }
5328
5611
  return true;
5329
5612
  }
5330
5613
  const keys1 = Object.keys(obj1);
5331
5614
  const keys2 = Object.keys(obj2);
5332
- if (keys1.length !== keys2.length)
5333
- return false;
5615
+ if (keys1.length !== keys2.length) return false;
5334
5616
  for (const key of keys1) {
5335
- if (!isDeepEqual(obj1[key], obj2[key]))
5336
- return false;
5617
+ if (!isDeepEqual(obj1[key], obj2[key])) return false;
5337
5618
  }
5338
5619
  return true;
5339
5620
  }
@@ -5413,10 +5694,8 @@ function extractEpicTitle(urlString) {
5413
5694
  let titleSegment = urlSegments.pop();
5414
5695
  const nonTitles = ["problem", "solution", "embed", "exercise"];
5415
5696
  const isTitleSegment = (str) => str && !nonTitles.includes(str);
5416
- while (!isTitleSegment(titleSegment))
5417
- titleSegment = urlSegments.pop();
5418
- if (!titleSegment)
5419
- return "EpicWeb.dev Video";
5697
+ while (!isTitleSegment(titleSegment)) titleSegment = urlSegments.pop();
5698
+ if (!titleSegment) return "EpicWeb.dev Video";
5420
5699
  const titleWords = titleSegment.split("-");
5421
5700
  const lowerCaseWords = [
5422
5701
  "the",
@@ -5520,8 +5799,7 @@ function extractEpicTitle(urlString) {
5520
5799
  const literalWord = literalWords.find(
5521
5800
  (w) => w.toLowerCase() === lowerWord
5522
5801
  );
5523
- if (literalWord)
5524
- return literalWord;
5802
+ if (literalWord) return literalWord;
5525
5803
  if (lowerCaseWords.includes(lowerWord) && index > 0) {
5526
5804
  return lowerWord;
5527
5805
  }
@@ -5731,8 +6009,7 @@ function EpicVideo({
5731
6009
  let prevIndex = 0;
5732
6010
  while (match = timestampRegex.exec(transcript)) {
5733
6011
  const timestamp = match[1];
5734
- if (!timestampRegex.lastIndex || !timestamp)
5735
- break;
6012
+ if (!timestampRegex.lastIndex || !timestamp) break;
5736
6013
  const timestampIndexStart = match.index;
5737
6014
  const timestampIndexEnd = timestampRegex.lastIndex;
5738
6015
  const textBeforeTimestamp = transcript.slice(
@@ -6002,8 +6279,7 @@ function guessEditor() {
6002
6279
  const runningProcesses = output.split("\r\n");
6003
6280
  for (let i = 0; i < runningProcesses.length; i++) {
6004
6281
  const processPath = (_a2 = runningProcesses[i]) == null ? void 0 : _a2.trim();
6005
- if (!processPath)
6006
- continue;
6282
+ if (!processPath) continue;
6007
6283
  const processName = path.basename(processPath);
6008
6284
  if (COMMON_EDITORS_WIN.includes(processName)) {
6009
6285
  return [processPath];
@@ -6014,8 +6290,7 @@ function guessEditor() {
6014
6290
  const processNames = Object.keys(COMMON_EDITORS_LINUX);
6015
6291
  for (let i = 0; i < processNames.length; i++) {
6016
6292
  const processName = processNames[i];
6017
- if (!processName)
6018
- continue;
6293
+ if (!processName) continue;
6019
6294
  if (output.includes(processName)) {
6020
6295
  return [COMMON_EDITORS_LINUX[processName]];
6021
6296
  }
@@ -6240,8 +6515,7 @@ async function action$9({ request }) {
6240
6515
  const originFiles = await getFiles(form.syncTo);
6241
6516
  for (let index = 0; index < originFiles.length; index++) {
6242
6517
  const originFile = originFiles[index];
6243
- if (!originFile)
6244
- continue;
6518
+ if (!originFile) continue;
6245
6519
  const destFile = filesToOpen[index];
6246
6520
  if (!destFile) {
6247
6521
  throw new Response(
@@ -6384,8 +6658,7 @@ function EditFileOnGitHub({
6384
6658
  }) {
6385
6659
  const fetcher = useLaunchFetcher();
6386
6660
  const handleClick = (e) => {
6387
- if (!e.altKey || ENV.EPICSHOP_DEPLOYED)
6388
- return;
6661
+ if (!e.altKey || ENV.EPICSHOP_DEPLOYED) return;
6389
6662
  e.preventDefault();
6390
6663
  const formData = new FormData();
6391
6664
  const type = file ? "file" : "appFile";
@@ -6437,8 +6710,7 @@ function OpenInEditor({
6437
6710
  }) {
6438
6711
  var _a2;
6439
6712
  const data = useLoaderData();
6440
- if (type === "other" || !buttons || !filename || !fullPath)
6441
- return null;
6713
+ if (type === "other" || !buttons || !filename || !fullPath) return null;
6442
6714
  const currentAppFullPath = safePath(((_a2 = data[data.type]) == null ? void 0 : _a2.fullPath) ?? "");
6443
6715
  const isFileFromDifferentApp = !fullPath.startsWith(currentAppFullPath);
6444
6716
  const validButtons = ENV.EPICSHOP_DEPLOYED ? ["problem", "solution"] : ["problem", "solution", "playground"];
@@ -6607,8 +6879,7 @@ const meta$4 = ({
6607
6879
  var _a2;
6608
6880
  const number = data == null ? void 0 : data.exercise.exerciseNumber.toString().padStart(2, "0");
6609
6881
  const rootData = (_a2 = matches.find((m) => m.id === "root")) == null ? void 0 : _a2.data;
6610
- if (!data || !rootData)
6611
- return [{ title: "🦉 | Error" }];
6882
+ if (!data || !rootData) return [{ title: "🦉 | Error" }];
6612
6883
  return getSeoMetaTags({
6613
6884
  title: `📝 | ${number}. ${data.exercise.title} | ${rootData == null ? void 0 : rootData.workshopTitle}`,
6614
6885
  description: `Introduction for ${number}. ${data.exercise.title}`,
@@ -6962,8 +7233,7 @@ function Diff({
6962
7233
  });
6963
7234
  const hiddenInputs = [];
6964
7235
  for (const [key, value] of params.entries()) {
6965
- if (key === "app1" || key === "app2")
6966
- continue;
7236
+ if (key === "app1" || key === "app2") continue;
6967
7237
  hiddenInputs.push(
6968
7238
  /* @__PURE__ */ jsx("input", { type: "hidden", name: key, value }, key)
6969
7239
  );
@@ -7279,10 +7549,8 @@ function getFileCodeblocks(file, filePathApp1, filePathApp2, type) {
7279
7549
  for (const chunk of file.chunks) {
7280
7550
  let launchEditor2 = function(appNum, line) {
7281
7551
  if (isDeployed) {
7282
- if (type === "DeletedFile" && appNum === 2)
7283
- return "";
7284
- if (type === "AddedFile" && appNum === 1)
7285
- return "";
7552
+ if (type === "DeletedFile" && appNum === 2) return "";
7553
+ if (type === "AddedFile" && appNum === 1) return "";
7286
7554
  }
7287
7555
  const label = type === "AddedFile" && appNum === 1 || type === "DeletedFile" && appNum === 2 ? `CREATE in APP ${appNum}` : `OPEN in APP ${appNum}`;
7288
7556
  const file2 = JSON.stringify(appNum === 1 ? filePathApp1 : filePathApp2);
@@ -7306,8 +7574,7 @@ function getFileCodeblocks(file, filePathApp1, filePathApp2, type) {
7306
7574
  toStartLine = chunk.toFileRange.start;
7307
7575
  for (let lineNumber = 0; lineNumber < chunk.changes.length; lineNumber++) {
7308
7576
  const change = chunk.changes[lineNumber];
7309
- if (!change)
7310
- continue;
7577
+ if (!change) continue;
7311
7578
  lines.push(change.content);
7312
7579
  switch (change.type) {
7313
7580
  case "AddedLine": {
@@ -7382,8 +7649,7 @@ async function copyUnignoredFiles(srcDir, destDir, ignoreList) {
7382
7649
  await fsExtra.remove(destDir);
7383
7650
  await fsExtra.copy(srcDir, destDir, {
7384
7651
  filter: async (file) => {
7385
- if (file === srcDir)
7386
- return true;
7652
+ if (file === srcDir) return true;
7387
7653
  return !ig.ignores(path.relative(srcDir, file));
7388
7654
  }
7389
7655
  });
@@ -7447,8 +7713,7 @@ async function getDiffIgnore(filePath) {
7447
7713
  ) : [];
7448
7714
  }
7449
7715
  function getForceFreshForDiff(app1, app2, cacheEntry) {
7450
- if (!cacheEntry)
7451
- return true;
7716
+ if (!cacheEntry) return true;
7452
7717
  const app1Modified = modifiedTimes.get(app1.fullPath) ?? 0;
7453
7718
  const app2Modified = modifiedTimes.get(app2.fullPath) ?? 0;
7454
7719
  const cacheModified = cacheEntry.metadata.createdTime;
@@ -7568,13 +7833,11 @@ async function getDiffCodeImpl(app1, app2) {
7568
7833
  for (const file of parsed.files) {
7569
7834
  const pathToCopy = file.type === "RenamedFile" ? file.pathBefore : file.path;
7570
7835
  const relativePath = diffPathToRelative(pathToCopy);
7571
- if (app1TestFiles.includes(relativePath))
7572
- continue;
7836
+ if (app1TestFiles.includes(relativePath)) continue;
7573
7837
  const filePathApp1 = path.join(app1.fullPath, relativePath);
7574
7838
  const pathToApp2 = file.type === "RenamedFile" ? file.pathAfter : file.path;
7575
7839
  const relativePathApp2 = diffPathToRelative(pathToApp2);
7576
- if (app2TestFiles.includes(relativePathApp2))
7577
- continue;
7840
+ if (app2TestFiles.includes(relativePathApp2)) continue;
7578
7841
  const filePathApp2 = path.join(app2.fullPath, relativePathApp2);
7579
7842
  switch (file.type) {
7580
7843
  case "ChangedFile": {
@@ -7790,8 +8053,7 @@ function SelectItem({
7790
8053
  );
7791
8054
  }
7792
8055
  function SetAppToPlayground({ appName }) {
7793
- if (ENV.EPICSHOP_DEPLOYED)
7794
- return null;
8056
+ if (ENV.EPICSHOP_DEPLOYED) return null;
7795
8057
  return /* @__PURE__ */ jsx(
7796
8058
  SetPlayground,
7797
8059
  {
@@ -8508,13 +8770,11 @@ function InBrowserBrowserForRealzImpl({ baseUrl, id, name, initialRoute }, ref)
8508
8770
  useEffect(() => {
8509
8771
  function handleMessage(messageEvent) {
8510
8772
  var _a2;
8511
- if (messageEvent.source !== ((_a2 = iframeRef.current) == null ? void 0 : _a2.contentWindow))
8512
- return;
8773
+ if (messageEvent.source !== ((_a2 = iframeRef.current) == null ? void 0 : _a2.contentWindow)) return;
8513
8774
  const result = messageSchema.safeParse(messageEvent.data, {
8514
8775
  path: ["messageEvent", "data"]
8515
8776
  });
8516
- if (!result.success)
8517
- return;
8777
+ if (!result.success) return;
8518
8778
  const { data } = result;
8519
8779
  if (data.type === "epicshop:loaded") {
8520
8780
  setIFrameContext((prevContext) => {
@@ -8526,8 +8786,7 @@ function InBrowserBrowserForRealzImpl({ baseUrl, id, name, initialRoute }, ref)
8526
8786
  } else if (lastDirectionRef.current === "new") {
8527
8787
  const currentPathname = prevContext.history[prevContext.index];
8528
8788
  const newPathname = new URL(data.url).pathname;
8529
- if (currentPathname === newPathname)
8530
- return prevContext;
8789
+ if (currentPathname === newPathname) return prevContext;
8531
8790
  const newHistory = [
8532
8791
  ...prevContext.history.slice(0, prevContext.index + 1),
8533
8792
  newPathname
@@ -8597,8 +8856,7 @@ function InBrowserBrowserForRealzImpl({ baseUrl, id, name, initialRoute }, ref)
8597
8856
  }, [setSearchParams]);
8598
8857
  const iframePathname = iframeContext.history[iframeContext.index];
8599
8858
  useEffect(() => {
8600
- if (!iframePathname)
8601
- return;
8859
+ if (!iframePathname) return;
8602
8860
  setPathnameInputValue(iframePathname);
8603
8861
  const newSearchParams = new URLSearchParams(window.location.search);
8604
8862
  if (iframePathname === "/") {
@@ -8642,8 +8900,7 @@ function InBrowserBrowserForRealzImpl({ baseUrl, id, name, initialRoute }, ref)
8642
8900
  const atStartOfHistory = iframeContext.index <= 0;
8643
8901
  const existingSearchParamHiddenInputs = [];
8644
8902
  for (const [key, value] of searchParams.entries()) {
8645
- if (key === "pathname")
8646
- continue;
8903
+ if (key === "pathname") continue;
8647
8904
  existingSearchParamHiddenInputs.push(
8648
8905
  /* @__PURE__ */ jsx("input", { type: "hidden", name: key, value }, key)
8649
8906
  );
@@ -8656,7 +8913,7 @@ function InBrowserBrowserForRealzImpl({ baseUrl, id, name, initialRoute }, ref)
8656
8913
  "button",
8657
8914
  {
8658
8915
  type: "button",
8659
- className: "flex aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40",
8916
+ className: "hidden aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40 sm:flex",
8660
8917
  disabled: atStartOfHistory,
8661
8918
  onClick: () => navigateChild(-1),
8662
8919
  children: /* @__PURE__ */ jsx(Icon, { name: "ArrowLeft", "aria-hidden": "true" })
@@ -8669,7 +8926,7 @@ function InBrowserBrowserForRealzImpl({ baseUrl, id, name, initialRoute }, ref)
8669
8926
  "button",
8670
8927
  {
8671
8928
  type: "button",
8672
- className: "flex aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40",
8929
+ className: "hidden aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40 sm:flex",
8673
8930
  disabled: atEndOfHistory,
8674
8931
  onClick: () => navigateChild(1),
8675
8932
  children: /* @__PURE__ */ jsx(Icon, { name: "ArrowRight", "aria-hidden": "true" })
@@ -8712,7 +8969,7 @@ function InBrowserBrowserForRealzImpl({ baseUrl, id, name, initialRoute }, ref)
8712
8969
  "input",
8713
8970
  {
8714
8971
  "aria-label": "pathname",
8715
- className: "flex-1 bg-background focus-visible:outline-none",
8972
+ className: "w-full flex-1 bg-background focus-visible:outline-none",
8716
8973
  value: pathnameInputValue,
8717
8974
  name: "pathname",
8718
8975
  onChange: (e) => setPathnameInputValue(e.currentTarget.value)
@@ -8757,8 +9014,7 @@ function Preview({
8757
9014
  inBrowserBrowserRef
8758
9015
  }) {
8759
9016
  const requestInfo = useRequestInfo();
8760
- if (!appInfo)
8761
- return /* @__PURE__ */ jsx("p", { children: "No app here. Sorry." });
9017
+ if (!appInfo) return /* @__PURE__ */ jsx("p", { children: "No app here. Sorry." });
8762
9018
  const { isRunning, dev, name, portIsAvailable, title } = appInfo;
8763
9019
  if (dev.type === "script") {
8764
9020
  const baseUrl = getBaseUrl({
@@ -8966,8 +9222,7 @@ function StepMdx({
8966
9222
  inBrowserBrowserRef
8967
9223
  }) {
8968
9224
  const data = useLoaderData();
8969
- if (!data.exerciseStepApp.instructionsCode)
8970
- return null;
9225
+ if (!data.exerciseStepApp.instructionsCode) return null;
8971
9226
  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
9227
  Mdx,
8973
9228
  {
@@ -9019,8 +9274,7 @@ function DiffLink({
9019
9274
  const stepIndex = data.exerciseIndex + input;
9020
9275
  return (_a2 = data.allApps[stepIndex]) == null ? void 0 : _a2.name;
9021
9276
  }
9022
- if (!input)
9023
- return null;
9277
+ if (!input) return null;
9024
9278
  for (const { name, stepName } of data.allApps) {
9025
9279
  if (input === name || input === stepName) {
9026
9280
  return name;
@@ -9094,8 +9348,7 @@ function CodeFileNotification({
9094
9348
  const data = useLoaderData();
9095
9349
  const app = data[type];
9096
9350
  const handleClick = () => {
9097
- if (visibility !== "visible")
9098
- return;
9351
+ if (visibility !== "visible") return;
9099
9352
  setVisibility("collapse");
9100
9353
  setTimeout(() => {
9101
9354
  setVisibility("none");
@@ -9159,10 +9412,8 @@ function InlineFile({
9159
9412
  ) : /* @__PURE__ */ jsx(Fragment, { children: "children" });
9160
9413
  }
9161
9414
  function getPreviewType(preview) {
9162
- if (preview === "problem")
9163
- return "problem";
9164
- if (preview === "solution")
9165
- return "solution";
9415
+ if (preview === "problem") return "problem";
9416
+ if (preview === "solution") return "solution";
9166
9417
  return "playground";
9167
9418
  }
9168
9419
  function LinkToApp({
@@ -9199,8 +9450,7 @@ function LinkToApp({
9199
9450
  title: ENV.EPICSHOP_DEPLOYED ? "Cannot link to app in deployed version" : void 0,
9200
9451
  onClick: (event) => {
9201
9452
  var _a3, _b2;
9202
- if (ENV.EPICSHOP_DEPLOYED)
9203
- event.preventDefault();
9453
+ if (ENV.EPICSHOP_DEPLOYED) event.preventDefault();
9204
9454
  (_a3 = props.onClick) == null ? void 0 : _a3.call(props, event);
9205
9455
  (_b2 = inBrowserBrowserRef.current) == null ? void 0 : _b2.handleExtrnalNavigation(appTo.toString());
9206
9456
  },
@@ -9218,8 +9468,7 @@ function LinkToApp({
9218
9468
  }),
9219
9469
  title: ENV.EPICSHOP_DEPLOYED ? "Cannot link to app in deployed version" : "Open in new tab",
9220
9470
  onClick: (event) => {
9221
- if (ENV.EPICSHOP_DEPLOYED)
9222
- event.preventDefault();
9471
+ if (ENV.EPICSHOP_DEPLOYED) event.preventDefault();
9223
9472
  },
9224
9473
  children: /* @__PURE__ */ jsx(Icon, { name: "ExternalLink" })
9225
9474
  }
@@ -9257,10 +9506,8 @@ function InBrowserTestRunner({
9257
9506
  useEffect(() => {
9258
9507
  function handleMessage(messageEvent) {
9259
9508
  var _a2;
9260
- if (messageEvent.source !== ((_a2 = iframeRef.current) == null ? void 0 : _a2.contentWindow))
9261
- return;
9262
- if ("request" in messageEvent.data)
9263
- return;
9509
+ if (messageEvent.source !== ((_a2 = iframeRef.current) == null ? void 0 : _a2.contentWindow)) return;
9510
+ if ("request" in messageEvent.data) return;
9264
9511
  const result = testRunnerDataSchema.safeParse(messageEvent.data, {
9265
9512
  path: ["messageEvent", "data"]
9266
9513
  });
@@ -9537,8 +9784,7 @@ function TestOutput({ name }) {
9537
9784
  `/test?${new URLSearchParams({ name })}&v=${version}`
9538
9785
  );
9539
9786
  useEffect(() => {
9540
- if (!lastMessage)
9541
- return;
9787
+ if (!lastMessage) return;
9542
9788
  const parsed = JSON.parse(lastMessage);
9543
9789
  const result = testEventQueueSchema.safeParse(parsed);
9544
9790
  if (!result.success) {
@@ -9901,8 +10147,7 @@ const meta$3 = ({
9901
10147
  }) => {
9902
10148
  var _a2;
9903
10149
  const rootData = (_a2 = matches.find((m) => m.id === "root")) == null ? void 0 : _a2.data;
9904
- if (!data || !rootData)
9905
- return [{ title: "🦉 | Error" }];
10150
+ if (!data || !rootData) return [{ title: "🦉 | Error" }];
9906
10151
  const { emoji: emoji2, stepNumber, title, exerciseNumber, exerciseTitle } = pageTitle(data);
9907
10152
  return getSeoMetaTags({
9908
10153
  title: `${emoji2} | ${stepNumber}. ${title} | ${exerciseNumber}. ${exerciseTitle} | ${rootData.workshopTitle}`,
@@ -9977,12 +10222,9 @@ async function loader$k({ request, params }) {
9977
10222
  ...getStepNameAndId(a)
9978
10223
  }));
9979
10224
  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;
10225
+ if (a.stepId > 0 && b.stepId > 0) return a.stepId - b.stepId;
10226
+ if (a.stepId > 0) return -1;
10227
+ if (b.stepId > 0) return 1;
9986
10228
  return 0;
9987
10229
  });
9988
10230
  const exerciseId = getStepId(exerciseStepApp);
@@ -10120,14 +10362,12 @@ function ExercisePartRoute() {
10120
10362
  return ENV.EPICSHOP_DEPLOYED || !data.playground || data.playground.test.type === "none";
10121
10363
  }
10122
10364
  if (tab === "problem" || tab === "solution") {
10123
- if (((_a3 = data[tab]) == null ? void 0 : _a3.dev.type) === "none")
10124
- return true;
10365
+ if (((_a3 = data[tab]) == null ? void 0 : _a3.dev.type) === "none") return true;
10125
10366
  if (ENV.EPICSHOP_DEPLOYED) {
10126
10367
  return ((_b3 = data[tab]) == null ? void 0 : _b3.dev.type) !== "browser";
10127
10368
  }
10128
10369
  }
10129
- if (tab === "playground" && ENV.EPICSHOP_DEPLOYED)
10130
- return true;
10370
+ if (tab === "playground" && ENV.EPICSHOP_DEPLOYED) return true;
10131
10371
  return false;
10132
10372
  }
10133
10373
  const activeTab = isValidPreview(preview) ? preview : tabs.find((t) => !shouldHideTab(t));
@@ -10141,8 +10381,8 @@ function ExercisePartRoute() {
10141
10381
  navigate(altDiffUrl);
10142
10382
  }
10143
10383
  }
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: [
10384
+ 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: [
10385
+ /* @__PURE__ */ jsxs("div", { className: "relative flex flex-col sm:col-span-1 sm:row-span-1 sm:h-full lg:border-r", children: [
10146
10386
  /* @__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
10387
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-start gap-x-2 uppercase", children: [
10148
10388
  /* @__PURE__ */ jsxs(
@@ -10169,14 +10409,14 @@ function ExercisePartRoute() {
10169
10409
  ")"
10170
10410
  ] })
10171
10411
  ] }),
10172
- data.problem && ((_c = data.playground) == null ? void 0 : _c.appName) !== data.problem.name ? /* @__PURE__ */ jsx(SetAppToPlayground, { appName: data.problem.name }) : null
10412
+ 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
10413
  ] }) }),
10174
10414
  /* @__PURE__ */ jsx(
10175
10415
  "article",
10176
10416
  {
10177
10417
  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..." })
10418
+ 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",
10419
+ children: data.exerciseStepApp.instructionsCode ? /* @__PURE__ */ jsx(StepMdx, { inBrowserBrowserRef }) : /* @__PURE__ */ jsx("p", { children: "No instructions yet..." })
10180
10420
  },
10181
10421
  data.articleId
10182
10422
  ),
@@ -10223,7 +10463,7 @@ function ExercisePartRoute() {
10223
10463
  /* @__PURE__ */ jsxs(
10224
10464
  Tabs.Root,
10225
10465
  {
10226
- className: "relative col-span-1 row-span-1 flex flex-col overflow-y-auto",
10466
+ className: "relative flex flex-col overflow-y-auto sm:col-span-1 sm:row-span-1",
10227
10467
  value: activeTab,
10228
10468
  children: [
10229
10469
  /* @__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 +10488,12 @@ function ExercisePartRoute() {
10248
10488
  }
10249
10489
  ) }, tab);
10250
10490
  }) }),
10251
- /* @__PURE__ */ jsxs("div", { className: "relative z-10 flex flex-grow flex-col overflow-y-auto", children: [
10491
+ /* @__PURE__ */ jsxs("div", { className: "relative z-10 flex min-h-96 flex-grow flex-col overflow-y-auto", children: [
10252
10492
  /* @__PURE__ */ jsx(
10253
10493
  Tabs.Content,
10254
10494
  {
10255
10495
  value: "playground",
10256
- className: "flex flex-grow items-center justify-center radix-state-inactive:hidden",
10496
+ className: "flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden",
10257
10497
  children: /* @__PURE__ */ jsx(
10258
10498
  Playground,
10259
10499
  {
@@ -10270,7 +10510,7 @@ function ExercisePartRoute() {
10270
10510
  Tabs.Content,
10271
10511
  {
10272
10512
  value: "problem",
10273
- className: "flex flex-grow items-center justify-center radix-state-inactive:hidden",
10513
+ className: "flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden",
10274
10514
  children: /* @__PURE__ */ jsx(
10275
10515
  Preview,
10276
10516
  {
@@ -10284,7 +10524,7 @@ function ExercisePartRoute() {
10284
10524
  Tabs.Content,
10285
10525
  {
10286
10526
  value: "solution",
10287
- className: "flex flex-grow items-center justify-center radix-state-inactive:hidden",
10527
+ className: "flex w-full flex-grow items-center justify-center self-start radix-state-inactive:hidden",
10288
10528
  children: /* @__PURE__ */ jsx(
10289
10529
  Preview,
10290
10530
  {
@@ -10298,7 +10538,7 @@ function ExercisePartRoute() {
10298
10538
  Tabs.Content,
10299
10539
  {
10300
10540
  value: "tests",
10301
- className: "flex flex-grow items-start justify-center overflow-hidden radix-state-inactive:hidden",
10541
+ className: "flex w-full flex-grow items-start justify-center self-start overflow-hidden radix-state-inactive:hidden",
10302
10542
  children: /* @__PURE__ */ jsx(
10303
10543
  Tests,
10304
10544
  {
@@ -10314,7 +10554,7 @@ function ExercisePartRoute() {
10314
10554
  Tabs.Content,
10315
10555
  {
10316
10556
  value: "diff",
10317
- className: "flex h-full flex-grow items-start justify-center radix-state-inactive:hidden",
10557
+ className: "flex h-full w-full flex-grow items-start justify-center self-start radix-state-inactive:hidden",
10318
10558
  children: /* @__PURE__ */ jsx(Diff, { diff: data.diff, allApps: data.allApps })
10319
10559
  }
10320
10560
  ),
@@ -10322,7 +10562,7 @@ function ExercisePartRoute() {
10322
10562
  Tabs.Content,
10323
10563
  {
10324
10564
  value: "chat",
10325
- className: "flex h-full flex-grow items-start justify-center radix-state-inactive:hidden",
10565
+ className: "flex h-full w-full flex-grow items-start justify-center self-start radix-state-inactive:hidden",
10326
10566
  children: /* @__PURE__ */ jsx(DiscordChat, {})
10327
10567
  }
10328
10568
  )
@@ -10377,8 +10617,7 @@ const meta$2 = ({
10377
10617
  var _a2;
10378
10618
  const number = data == null ? void 0 : data.exercise.exerciseNumber.toString().padStart(2, "0");
10379
10619
  const rootData = (_a2 = matches.find((m) => m.id === "root")) == null ? void 0 : _a2.data;
10380
- if (!data || !rootData)
10381
- return [{ title: "🦉 | Error" }];
10620
+ if (!data || !rootData) return [{ title: "🦉 | Error" }];
10382
10621
  return getSeoMetaTags({
10383
10622
  title: `🦉 | ${number}. ${data.exercise.title} | ${rootData == null ? void 0 : rootData.workshopTitle}`,
10384
10623
  description: `Elaboration for ${number}. ${data.exercise.title}`,
@@ -10464,9 +10703,9 @@ const mdxComponents$2 = { h1: () => null };
10464
10703
  function ExerciseFinished$1() {
10465
10704
  const data = useLoaderData();
10466
10705
  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: [
10706
+ 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: [
10707
+ /* @__PURE__ */ jsxs("div", { className: "relative flex flex-col sm:col-span-1 sm:row-span-1 sm:h-full lg:border-r", children: [
10708
+ /* @__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
10709
  /* @__PURE__ */ jsx(Link, { to: `/${exerciseNumber}`, className: "hover:underline", children: `${exerciseNumber}. ${data.exercise.title}` }),
10471
10710
  /* @__PURE__ */ jsx("span", { children: "/" }),
10472
10711
  /* @__PURE__ */ jsx("span", { children: "Elaboration" })
@@ -10474,7 +10713,7 @@ function ExerciseFinished$1() {
10474
10713
  /* @__PURE__ */ jsx(
10475
10714
  "article",
10476
10715
  {
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",
10716
+ 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
10717
  id: data.articleId,
10479
10718
  children: data.exercise.finishedCode ? /* @__PURE__ */ jsx(
10480
10719
  EpicVideoInfoProvider,
@@ -10529,7 +10768,7 @@ function Survey$1({
10529
10768
  exerciseTitle
10530
10769
  }) {
10531
10770
  const [iframeLoaded, setIframeLoaded] = React.useState(false);
10532
- return /* @__PURE__ */ jsxs("div", { className: "relative flex-shrink-0", children: [
10771
+ return /* @__PURE__ */ jsxs("div", { className: "relative min-h-full sm:min-h-[unset] sm:flex-shrink-0", children: [
10533
10772
  !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
10773
  "Loading ",
10535
10774
  exerciseTitle,
@@ -10671,11 +10910,9 @@ const route9 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
10671
10910
  loader: loader$h
10672
10911
  }, Symbol.toStringTag, { value: "Module" }));
10673
10912
  async function getForceFresh(filePath, cacheEntry) {
10674
- if (!cacheEntry)
10675
- return true;
10913
+ if (!cacheEntry) return true;
10676
10914
  const app = await getAppFromFile(filePath);
10677
- if (!app)
10678
- return true;
10915
+ if (!app) return true;
10679
10916
  const appModified = modifiedTimes.get(app.fullPath) ?? 0;
10680
10917
  const cacheModified = cacheEntry.metadata.createdTime;
10681
10918
  return !cacheModified || appModified > cacheModified || void 0;
@@ -11204,8 +11441,7 @@ const meta$1 = ({
11204
11441
  }) => {
11205
11442
  var _a2;
11206
11443
  const rootData = (_a2 = matches.find((m) => m.id === "root")) == null ? void 0 : _a2.data;
11207
- if (!rootData)
11208
- return [];
11444
+ if (!rootData) return [];
11209
11445
  return getSeoMetaTags({
11210
11446
  title: `🎉 ${rootData == null ? void 0 : rootData.workshopTitle}`,
11211
11447
  description: `Elaboration for ${rootData == null ? void 0 : rootData.workshopTitle}`,
@@ -11280,7 +11516,7 @@ function ExerciseFinished() {
11280
11516
  /* @__PURE__ */ jsx(
11281
11517
  "article",
11282
11518
  {
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",
11519
+ 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
11520
  id: data.articleId,
11285
11521
  children: data.finishedCode ? /* @__PURE__ */ jsx(
11286
11522
  EpicVideoInfoProvider,
@@ -11589,8 +11825,7 @@ const route27 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
11589
11825
  async function loader$8() {
11590
11826
  ensureUndeployed();
11591
11827
  const isAuthenticated = Boolean(await getAuthInfo());
11592
- if (isAuthenticated)
11593
- throw redirect("/account");
11828
+ if (isAuthenticated) throw redirect("/account");
11594
11829
  return json({});
11595
11830
  }
11596
11831
  async function action$2() {
@@ -11608,8 +11843,7 @@ function Login() {
11608
11843
  const revalidator = useRevalidator();
11609
11844
  const lastMessage = useEventSource(`/login-sse`);
11610
11845
  useEffect(() => {
11611
- if (!lastMessage)
11612
- return;
11846
+ if (!lastMessage) return;
11613
11847
  const parsed = JSON.parse(lastMessage);
11614
11848
  const result = EventSchema.safeParse(parsed);
11615
11849
  if (!result.success) {
@@ -11773,8 +12007,7 @@ async function clearData() {
11773
12007
  await deleteDb();
11774
12008
  }
11775
12009
  async function clearCaches() {
11776
- if (ENV.EPICSHOP_DEPLOYED)
11777
- return;
12010
+ if (ENV.EPICSHOP_DEPLOYED) return;
11778
12011
  const workshopRoot2 = getWorkshopRoot();
11779
12012
  await fsExtra.remove(path$1.join(workshopRoot2, "node_modules", ".cache"));
11780
12013
  await deleteCache();
@@ -12481,11 +12714,11 @@ const route30 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
12481
12714
  __proto__: null,
12482
12715
  loader
12483
12716
  }, 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" };
12717
+ 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-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-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-K6Dvbx-E.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-805aa13a.js", "version": "805aa13a" };
12485
12718
  const mode = "production";
12486
12719
  const assetsBuildDirectory = "build/client";
12487
12720
  const basename = "/";
12488
- const future = { "v3_fetcherPersist": false, "v3_relativeSplatPath": false, "v3_throwAbortReason": false, "unstable_singleFetch": false };
12721
+ const future = { "v3_fetcherPersist": false, "v3_relativeSplatPath": false, "v3_throwAbortReason": false, "unstable_singleFetch": false, "unstable_fogOfWar": false };
12489
12722
  const isSpaMode = false;
12490
12723
  const publicPath = "/";
12491
12724
  const entry = { module: entryServer };