@epic-web/workshop-app 5.28.0 → 5.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/build/client/assets/_-DTLUa7j2.js +2 -0
  2. package/build/client/assets/_-DTLUa7j2.js.map +1 -0
  3. package/build/client/assets/{_basePickBy-lB0X5x6U.js → _basePickBy-Bkju64MX.js} +2 -2
  4. package/build/client/assets/{_basePickBy-lB0X5x6U.js.map → _basePickBy-Bkju64MX.js.map} +1 -1
  5. package/build/client/assets/{_baseUniq-BOjGYEEK.js → _baseUniq-Cp1g4BpN.js} +2 -2
  6. package/build/client/assets/{_baseUniq-BOjGYEEK.js.map → _baseUniq-Cp1g4BpN.js.map} +1 -1
  7. package/build/client/assets/_exerciseNumber-Co7M7Ztw.js +2 -0
  8. package/build/client/assets/_exerciseNumber-Co7M7Ztw.js.map +1 -0
  9. package/build/client/assets/_exerciseNumber_._stepNumber-Don1A9mU.js +2 -0
  10. package/build/client/assets/_exerciseNumber_._stepNumber-Don1A9mU.js.map +1 -0
  11. package/build/client/assets/_exerciseNumber_.finished-BqsavTTe.js +2 -0
  12. package/build/client/assets/_exerciseNumber_.finished-BqsavTTe.js.map +1 -0
  13. package/build/client/assets/_layout-BFto7KzZ.js +2 -0
  14. package/build/client/assets/_layout-BFto7KzZ.js.map +1 -0
  15. package/build/client/assets/_layout-BvOre76Q.js +2 -0
  16. package/build/client/assets/_layout-BvOre76Q.js.map +1 -0
  17. package/build/client/assets/_layout-CSP6lWdg.js +2 -0
  18. package/build/client/assets/_layout-CSP6lWdg.js.map +1 -0
  19. package/build/client/assets/_layout-DDOZBbUH.js +6 -0
  20. package/build/client/assets/_layout-DDOZBbUH.js.map +1 -0
  21. package/build/client/assets/accordion-BNzI0wOK.js +2 -0
  22. package/build/client/assets/{accordion-CpiLc1m2.js.map → accordion-BNzI0wOK.js.map} +1 -1
  23. package/build/client/assets/account-2uOW4wHE.js +2 -0
  24. package/build/client/assets/account-2uOW4wHE.js.map +1 -0
  25. package/build/client/assets/app-DfAmumll.js +2 -0
  26. package/build/client/assets/app-DfAmumll.js.map +1 -0
  27. package/build/client/assets/{arc-DmQZ2TPB.js → arc-BgUWL_JM.js} +2 -2
  28. package/build/client/assets/{arc-DmQZ2TPB.js.map → arc-BgUWL_JM.js.map} +1 -1
  29. package/build/client/assets/architectureDiagram-IEHRJDOE-VEDL5YJR.js +37 -0
  30. package/build/client/assets/{architectureDiagram-IEHRJDOE-BqPvrjLh.js.map → architectureDiagram-IEHRJDOE-VEDL5YJR.js.map} +1 -1
  31. package/build/client/assets/{blockDiagram-JOT3LUYC-D8OFd78i.js → blockDiagram-JOT3LUYC-CJojWhFE.js} +3 -3
  32. package/build/client/assets/{blockDiagram-JOT3LUYC-D8OFd78i.js.map → blockDiagram-JOT3LUYC-CJojWhFE.js.map} +1 -1
  33. package/build/client/assets/button-DRpue1NG.js +2 -0
  34. package/build/client/assets/button-DRpue1NG.js.map +1 -0
  35. package/build/client/assets/{c4Diagram-VJAJSXHY-DjROjsr_.js → c4Diagram-VJAJSXHY-CDiBL4DZ.js} +3 -3
  36. package/build/client/assets/{c4Diagram-VJAJSXHY-DjROjsr_.js.map → c4Diagram-VJAJSXHY-CDiBL4DZ.js.map} +1 -1
  37. package/build/client/assets/channel-CAodiiwJ.js +2 -0
  38. package/build/client/assets/{channel-DnqeaSfB.js.map → channel-CAodiiwJ.js.map} +1 -1
  39. package/build/client/assets/{chunk-4BMEZGHF-CNL-bCj2.js → chunk-4BMEZGHF-Dn8dm6h4.js} +2 -2
  40. package/build/client/assets/{chunk-4BMEZGHF-CNL-bCj2.js.map → chunk-4BMEZGHF-Dn8dm6h4.js.map} +1 -1
  41. package/build/client/assets/{chunk-A2AXSNBT-PeSyIKDm.js → chunk-A2AXSNBT-4MnudWit.js} +2 -2
  42. package/build/client/assets/{chunk-A2AXSNBT-PeSyIKDm.js.map → chunk-A2AXSNBT-4MnudWit.js.map} +1 -1
  43. package/build/client/assets/{chunk-AEK57VVT-B1JqGB_s.js → chunk-AEK57VVT-CqDnkZ4u.js} +2 -2
  44. package/build/client/assets/{chunk-AEK57VVT-B1JqGB_s.js.map → chunk-AEK57VVT-CqDnkZ4u.js.map} +1 -1
  45. package/build/client/assets/{chunk-D6G4REZN-C1e0nCkL.js → chunk-D6G4REZN-Brt3as5d.js} +2 -2
  46. package/build/client/assets/{chunk-D6G4REZN-C1e0nCkL.js.map → chunk-D6G4REZN-Brt3as5d.js.map} +1 -1
  47. package/build/client/assets/chunk-QMGIS6GS-CTjj1G71.js +44 -0
  48. package/build/client/assets/chunk-QMGIS6GS-CTjj1G71.js.map +1 -0
  49. package/build/client/assets/{chunk-RZ5BOZE2-D5pIwNeA.js → chunk-RZ5BOZE2-DRDeFo9p.js} +2 -2
  50. package/build/client/assets/{chunk-RZ5BOZE2-D5pIwNeA.js.map → chunk-RZ5BOZE2-DRDeFo9p.js.map} +1 -1
  51. package/build/client/assets/{chunk-XZIHB7SX-FbrNggxP.js → chunk-XZIHB7SX-jEJwVQJf.js} +2 -2
  52. package/build/client/assets/{chunk-XZIHB7SX-FbrNggxP.js.map → chunk-XZIHB7SX-jEJwVQJf.js.map} +1 -1
  53. package/build/client/assets/classDiagram-GIVACNV2-H_7kh---.js +2 -0
  54. package/build/client/assets/{classDiagram-GIVACNV2-cXWx-aYi.js.map → classDiagram-GIVACNV2-H_7kh---.js.map} +1 -1
  55. package/build/client/assets/classDiagram-v2-COTLJTTW-H_7kh---.js +2 -0
  56. package/build/client/assets/{classDiagram-v2-COTLJTTW-cXWx-aYi.js.map → classDiagram-v2-COTLJTTW-H_7kh---.js.map} +1 -1
  57. package/build/client/assets/clone-DRQ0Dnbp.js +2 -0
  58. package/build/client/assets/{clone-Bj8ANPCv.js.map → clone-DRQ0Dnbp.js.map} +1 -1
  59. package/build/client/assets/dagre-OKDRZEBW-BPnUPPO5.js +5 -0
  60. package/build/client/assets/{dagre-OKDRZEBW-DT9ZQRxf.js.map → dagre-OKDRZEBW-BPnUPPO5.js.map} +1 -1
  61. package/build/client/assets/diagram-SSKATNLV-Bh_ZXdjr.js +44 -0
  62. package/build/client/assets/{diagram-SSKATNLV-CcKCni9R.js.map → diagram-SSKATNLV-Bh_ZXdjr.js.map} +1 -1
  63. package/build/client/assets/diagram-VNBRO52H-D5zqYvJa.js +25 -0
  64. package/build/client/assets/{diagram-VNBRO52H-DWoRAiqO.js.map → diagram-VNBRO52H-D5zqYvJa.js.map} +1 -1
  65. package/build/client/assets/diff-CQ7A0nZj.js +2 -0
  66. package/build/client/assets/diff-CQ7A0nZj.js.map +1 -0
  67. package/build/client/assets/{diff-D5_VwPLF.js → diff-CtGU9cxI.js} +2 -2
  68. package/build/client/assets/diff-CtGU9cxI.js.map +1 -0
  69. package/build/client/assets/discord-91JJKnJ5.js +2 -0
  70. package/build/client/assets/discord-91JJKnJ5.js.map +1 -0
  71. package/build/client/assets/discord-D4appJa-.js +2 -0
  72. package/build/client/assets/discord-D4appJa-.js.map +1 -0
  73. package/build/client/assets/entry.client-uKxtCCau.js +35 -0
  74. package/build/client/assets/entry.client-uKxtCCau.js.map +1 -0
  75. package/build/client/assets/{epic-video-CmlkW6Rw.js → epic-video-D_3otytp.js} +3 -3
  76. package/build/client/assets/{epic-video-CmlkW6Rw.js.map → epic-video-D_3otytp.js.map} +1 -1
  77. package/build/client/assets/{erDiagram-Q7BY3M3F-DXkEmvKk.js → erDiagram-Q7BY3M3F-BxueSNDf.js} +3 -3
  78. package/build/client/assets/{erDiagram-Q7BY3M3F-DXkEmvKk.js.map → erDiagram-Q7BY3M3F-BxueSNDf.js.map} +1 -1
  79. package/build/client/assets/error-boundary-BLyHIxcu.js +2 -0
  80. package/build/client/assets/error-boundary-BLyHIxcu.js.map +1 -0
  81. package/build/client/assets/finished-BiOz59BB.js +2 -0
  82. package/build/client/assets/finished-BiOz59BB.js.map +1 -0
  83. package/build/client/assets/{flowDiagram-4HSFHLVR-DCodZaNW.js → flowDiagram-4HSFHLVR-CfL3E-FD.js} +3 -3
  84. package/build/client/assets/{flowDiagram-4HSFHLVR-DCodZaNW.js.map → flowDiagram-4HSFHLVR-CfL3E-FD.js.map} +1 -1
  85. package/build/client/assets/ganttDiagram-APWFNJXF-DxEqrjXE.js +258 -0
  86. package/build/client/assets/{ganttDiagram-APWFNJXF-TfB6wYvN.js.map → ganttDiagram-APWFNJXF-DxEqrjXE.js.map} +1 -1
  87. package/build/client/assets/gitGraphDiagram-7IBYFJ6S-csni0XOM.js +66 -0
  88. package/build/client/assets/{gitGraphDiagram-7IBYFJ6S-D2NQnQv2.js.map → gitGraphDiagram-7IBYFJ6S-csni0XOM.js.map} +1 -1
  89. package/build/client/assets/{graph-eJUngNSH.js → graph-DiSezMy_.js} +2 -2
  90. package/build/client/assets/{graph-eJUngNSH.js.map → graph-DiSezMy_.js.map} +1 -1
  91. package/build/client/assets/index-AKpqKc27.js +2 -0
  92. package/build/client/assets/index-AKpqKc27.js.map +1 -0
  93. package/build/client/assets/index-BGtlU-cD.js +2 -0
  94. package/build/client/assets/index-BGtlU-cD.js.map +1 -0
  95. package/build/client/assets/index-BP1ceC2h.js +10 -0
  96. package/build/client/assets/index-BP1ceC2h.js.map +1 -0
  97. package/build/client/assets/index-BSJLLJJ3.js +2 -0
  98. package/build/client/assets/index-BSJLLJJ3.js.map +1 -0
  99. package/build/client/assets/index-C0Fh_zu0.js +36 -0
  100. package/build/client/assets/{index-DLC5u33j.js.map → index-C0Fh_zu0.js.map} +1 -1
  101. package/build/client/assets/index-Co8qgD4k.js +2 -0
  102. package/build/client/assets/{index-BmMpCvYx.js.map → index-Co8qgD4k.js.map} +1 -1
  103. package/build/client/assets/index-D0dQzJhy.js +2 -0
  104. package/build/client/assets/index-D0dQzJhy.js.map +1 -0
  105. package/build/client/assets/index-DJsDENYs.js +42 -0
  106. package/build/client/assets/{index-Do-KWT0a.js.map → index-DJsDENYs.js.map} +1 -1
  107. package/build/client/assets/index-DWV7tDz3.js +3 -0
  108. package/build/client/assets/{index-DvQyydjU.js.map → index-DWV7tDz3.js.map} +1 -1
  109. package/build/client/assets/infoDiagram-PH2N3AL5-Dr2v4fFk.js +3 -0
  110. package/build/client/assets/{infoDiagram-PH2N3AL5-D-nEozcT.js.map → infoDiagram-PH2N3AL5-Dr2v4fFk.js.map} +1 -1
  111. package/build/client/assets/{journeyDiagram-U35MCT3I-Dc8g8jIX.js → journeyDiagram-U35MCT3I-iX4x5HVK.js} +3 -3
  112. package/build/client/assets/{journeyDiagram-U35MCT3I-Dc8g8jIX.js.map → journeyDiagram-U35MCT3I-iX4x5HVK.js.map} +1 -1
  113. package/build/client/assets/jsx-runtime-BjG_zV1W.js +10 -0
  114. package/build/client/assets/jsx-runtime-BjG_zV1W.js.map +1 -0
  115. package/build/client/assets/{kanban-definition-NDS4AKOZ-BwwcaZU2.js → kanban-definition-NDS4AKOZ-BwP5uDj3.js} +3 -3
  116. package/build/client/assets/{kanban-definition-NDS4AKOZ-BwwcaZU2.js.map → kanban-definition-NDS4AKOZ-BwP5uDj3.js.map} +1 -1
  117. package/build/client/assets/l-CVlzRdDg.js +2 -0
  118. package/build/client/assets/l-CVlzRdDg.js.map +1 -0
  119. package/build/client/assets/{layout-BAeq0-Is.js → layout-X8Y3Cf_B.js} +2 -2
  120. package/build/client/assets/{layout-BAeq0-Is.js.map → layout-X8Y3Cf_B.js.map} +1 -1
  121. package/build/client/assets/{linear-LWRPSVMz.js → linear-1DrdUlCY.js} +2 -2
  122. package/build/client/assets/{linear-LWRPSVMz.js.map → linear-1DrdUlCY.js.map} +1 -1
  123. package/build/client/assets/loading-CXEQXwx8.js +2 -0
  124. package/build/client/assets/{loading-b1FV2pQh.js.map → loading-CXEQXwx8.js.map} +1 -1
  125. package/build/client/assets/login-CaIyI5Cd.js +2 -0
  126. package/build/client/assets/login-CaIyI5Cd.js.map +1 -0
  127. package/build/client/assets/manifest-953eedfa.js +1 -0
  128. package/build/client/assets/mdx-DD5XL3ew.js +3 -0
  129. package/build/client/assets/mdx-DD5XL3ew.js.map +1 -0
  130. package/build/client/assets/{mermaid.core-q9C-HfFu.js → mermaid.core-D4QVSd3D.js} +5 -5
  131. package/build/client/assets/{mermaid.core-q9C-HfFu.js.map → mermaid.core-D4QVSd3D.js.map} +1 -1
  132. package/build/client/assets/mindmap-definition-ALO5MXBD-tl5KlWaB.js +96 -0
  133. package/build/client/assets/{mindmap-definition-ALO5MXBD-BhzLy0Zl.js.map → mindmap-definition-ALO5MXBD-tl5KlWaB.js.map} +1 -1
  134. package/build/client/assets/misc-yfWFSwMN.js +2 -0
  135. package/build/client/assets/{misc-2sBiisF5.js.map → misc-yfWFSwMN.js.map} +1 -1
  136. package/build/client/assets/nav-chevrons-CokHxUSB.js +2 -0
  137. package/build/client/assets/nav-chevrons-CokHxUSB.js.map +1 -0
  138. package/build/client/assets/onboarding-DyrGJaVn.js +2 -0
  139. package/build/client/assets/onboarding-DyrGJaVn.js.map +1 -0
  140. package/build/client/assets/online-CFV79-RX.js +2 -0
  141. package/build/client/assets/{online-DZKJk3C2.js.map → online-CFV79-RX.js.map} +1 -1
  142. package/build/client/assets/pe-C53l4u-6.js +2 -0
  143. package/build/client/assets/{pe-BShc2dvc.js.map → pe-C53l4u-6.js.map} +1 -1
  144. package/build/client/assets/pieDiagram-IB7DONF6-y5DqPNpS.js +31 -0
  145. package/build/client/assets/{pieDiagram-IB7DONF6-CaTGj8RH.js.map → pieDiagram-IB7DONF6-y5DqPNpS.js.map} +1 -1
  146. package/build/client/assets/preferences-C2zlOkAS.js +2 -0
  147. package/build/client/assets/preferences-C2zlOkAS.js.map +1 -0
  148. package/build/client/assets/{presence-C9bUSihT.js → presence-BoFXYAd7.js} +3 -3
  149. package/build/client/assets/{presence-C9bUSihT.js.map → presence-BoFXYAd7.js.map} +1 -1
  150. package/build/client/assets/preview-CE_VqYU4.js +2 -0
  151. package/build/client/assets/preview-CE_VqYU4.js.map +1 -0
  152. package/build/client/assets/product-TKJyOyif.js +2 -0
  153. package/build/client/assets/{product-DJOWNuL-.js.map → product-TKJyOyif.js.map} +1 -1
  154. package/build/client/assets/progress-CtGAFS2P.js +2 -0
  155. package/build/client/assets/{progress-BJ4ADF-s.js.map → progress-CtGAFS2P.js.map} +1 -1
  156. package/build/client/assets/progress-bar-DTYORRrG.js +2 -0
  157. package/build/client/assets/progress-bar-DTYORRrG.js.map +1 -0
  158. package/build/client/assets/{quadrantDiagram-7GDLP6J5-B4Od6z6p.js → quadrantDiagram-7GDLP6J5-ymq7Ot51.js} +3 -3
  159. package/build/client/assets/{quadrantDiagram-7GDLP6J5-B4Od6z6p.js.map → quadrantDiagram-7GDLP6J5-ymq7Ot51.js.map} +1 -1
  160. package/build/client/assets/{radar-MK3ICKWK-CENXhI0E.js → radar-MK3ICKWK-B8xuvUo7.js} +2 -2
  161. package/build/client/assets/{radar-MK3ICKWK-CENXhI0E.js.map → radar-MK3ICKWK-B8xuvUo7.js.map} +1 -1
  162. package/build/client/assets/{requirementDiagram-KVF5MWMF-_w0WuUxy.js → requirementDiagram-KVF5MWMF-B4D4Pi12.js} +3 -3
  163. package/build/client/assets/{requirementDiagram-KVF5MWMF-_w0WuUxy.js.map → requirementDiagram-KVF5MWMF-B4D4Pi12.js.map} +1 -1
  164. package/build/client/assets/revalidation-ws-89FLt73b.js +2 -0
  165. package/build/client/assets/revalidation-ws-89FLt73b.js.map +1 -0
  166. package/build/client/assets/root-Dd9--OJ3.js +2 -0
  167. package/build/client/assets/root-Dd9--OJ3.js.map +1 -0
  168. package/build/client/assets/sankeyDiagram-QLVOVGJD-BAY-vMZj.js +11 -0
  169. package/build/client/assets/{sankeyDiagram-QLVOVGJD-Bt8556P1.js.map → sankeyDiagram-QLVOVGJD-BAY-vMZj.js.map} +1 -1
  170. package/build/client/assets/{sequenceDiagram-X6HHIX6F-y2-oW3Ob.js → sequenceDiagram-X6HHIX6F-CDjFTgBk.js} +3 -3
  171. package/build/client/assets/{sequenceDiagram-X6HHIX6F-y2-oW3Ob.js.map → sequenceDiagram-X6HHIX6F-CDjFTgBk.js.map} +1 -1
  172. package/build/client/assets/set-playground-DtZ5ki7i.js +2 -0
  173. package/build/client/assets/set-playground-DtZ5ki7i.js.map +1 -0
  174. package/build/client/assets/stateDiagram-DGXRK772-DFekjeUZ.js +2 -0
  175. package/build/client/assets/{stateDiagram-DGXRK772-B3BuD15b.js.map → stateDiagram-DGXRK772-DFekjeUZ.js.map} +1 -1
  176. package/build/client/assets/stateDiagram-v2-YXO3MK2T-CSkUdkOW.js +2 -0
  177. package/build/client/assets/{stateDiagram-v2-YXO3MK2T-BzFxWpqR.js.map → stateDiagram-v2-YXO3MK2T-CSkUdkOW.js.map} +1 -1
  178. package/build/client/assets/support-drzs9wuf.js +2 -0
  179. package/build/client/assets/support-drzs9wuf.js.map +1 -0
  180. package/build/client/assets/test-psaYrMGK.js +2 -0
  181. package/build/client/assets/test-psaYrMGK.js.map +1 -0
  182. package/build/client/assets/{tests-B1ak2CDI.js → tests-7juFXgcY.js} +3 -3
  183. package/build/client/assets/tests-7juFXgcY.js.map +1 -0
  184. package/build/client/assets/{timeline-definition-BDJGKUSR-DUa2yfAV.js → timeline-definition-BDJGKUSR-1WjIsnZH.js} +3 -3
  185. package/build/client/assets/{timeline-definition-BDJGKUSR-DUa2yfAV.js.map → timeline-definition-BDJGKUSR-1WjIsnZH.js.map} +1 -1
  186. package/build/client/assets/tooltip-C6xKzWST.js +2 -0
  187. package/build/client/assets/{tooltip-Bzd6O8vq.js.map → tooltip-C6xKzWST.js.map} +1 -1
  188. package/build/client/assets/use-event-source-B411g-uF.js +2 -0
  189. package/build/client/assets/{use-event-source-Dar8h_B8.js.map → use-event-source-B411g-uF.js.map} +1 -1
  190. package/build/client/assets/user-Dmcddqge.js +2 -0
  191. package/build/client/assets/user-Dmcddqge.js.map +1 -0
  192. package/build/client/assets/version-BAECczgY.js +2 -0
  193. package/build/client/assets/version-BAECczgY.js.map +1 -0
  194. package/build/client/assets/workshop-config-gFAnGhSV.js +2 -0
  195. package/build/client/assets/workshop-config-gFAnGhSV.js.map +1 -0
  196. package/build/client/assets/{xychartDiagram-VJFVF3MP-JztjcODi.js → xychartDiagram-VJFVF3MP-Cp8GqXc6.js} +3 -3
  197. package/build/client/assets/{xychartDiagram-VJFVF3MP-JztjcODi.js.map → xychartDiagram-VJFVF3MP-Cp8GqXc6.js.map} +1 -1
  198. package/build/server/index.js +4439 -4072
  199. package/build/server/index.js.map +1 -1
  200. package/dist/server/index.js +2 -2
  201. package/package.json +13 -13
  202. package/build/client/assets/_-BaHOmd8F.js +0 -2
  203. package/build/client/assets/_-BaHOmd8F.js.map +0 -1
  204. package/build/client/assets/_exerciseNumber-Dqi7TgL9.js +0 -2
  205. package/build/client/assets/_exerciseNumber-Dqi7TgL9.js.map +0 -1
  206. package/build/client/assets/_exerciseNumber_._stepNumber-DoOFEk-P.js +0 -2
  207. package/build/client/assets/_exerciseNumber_._stepNumber-DoOFEk-P.js.map +0 -1
  208. package/build/client/assets/_exerciseNumber_.finished-C5m6M0gM.js +0 -2
  209. package/build/client/assets/_exerciseNumber_.finished-C5m6M0gM.js.map +0 -1
  210. package/build/client/assets/_layout-B_BIIcpM.js +0 -2
  211. package/build/client/assets/_layout-B_BIIcpM.js.map +0 -1
  212. package/build/client/assets/_layout-B_NrRv0S.js +0 -6
  213. package/build/client/assets/_layout-B_NrRv0S.js.map +0 -1
  214. package/build/client/assets/_layout-D7_F6t3x.js +0 -2
  215. package/build/client/assets/_layout-D7_F6t3x.js.map +0 -1
  216. package/build/client/assets/_layout-QRe2q83m.js +0 -2
  217. package/build/client/assets/_layout-QRe2q83m.js.map +0 -1
  218. package/build/client/assets/accordion-CpiLc1m2.js +0 -2
  219. package/build/client/assets/account-CbFDiVNd.js +0 -2
  220. package/build/client/assets/account-CbFDiVNd.js.map +0 -1
  221. package/build/client/assets/app-BYSDu0vh.js +0 -2
  222. package/build/client/assets/app-BYSDu0vh.js.map +0 -1
  223. package/build/client/assets/architectureDiagram-IEHRJDOE-BqPvrjLh.js +0 -37
  224. package/build/client/assets/button-Dt4EcDfR.js +0 -2
  225. package/build/client/assets/button-Dt4EcDfR.js.map +0 -1
  226. package/build/client/assets/channel-DnqeaSfB.js +0 -2
  227. package/build/client/assets/classDiagram-GIVACNV2-cXWx-aYi.js +0 -2
  228. package/build/client/assets/classDiagram-v2-COTLJTTW-cXWx-aYi.js +0 -2
  229. package/build/client/assets/clone-Bj8ANPCv.js +0 -2
  230. package/build/client/assets/components-5arJTWsS.js +0 -158
  231. package/build/client/assets/components-5arJTWsS.js.map +0 -1
  232. package/build/client/assets/dagre-OKDRZEBW-DT9ZQRxf.js +0 -5
  233. package/build/client/assets/diagram-SSKATNLV-CcKCni9R.js +0 -44
  234. package/build/client/assets/diagram-VNBRO52H-DWoRAiqO.js +0 -25
  235. package/build/client/assets/diff-BKR4usVv.js +0 -2
  236. package/build/client/assets/diff-BKR4usVv.js.map +0 -1
  237. package/build/client/assets/diff-D5_VwPLF.js.map +0 -1
  238. package/build/client/assets/discord-BU7RzE6-.js +0 -2
  239. package/build/client/assets/discord-BU7RzE6-.js.map +0 -1
  240. package/build/client/assets/discord-ut4t-aMQ.js +0 -2
  241. package/build/client/assets/discord-ut4t-aMQ.js.map +0 -1
  242. package/build/client/assets/entry.client-BLUlgPHE.js +0 -44
  243. package/build/client/assets/entry.client-BLUlgPHE.js.map +0 -1
  244. package/build/client/assets/error-boundary-B07cWiEy.js +0 -2
  245. package/build/client/assets/error-boundary-B07cWiEy.js.map +0 -1
  246. package/build/client/assets/finished-MrsevkkK.js +0 -2
  247. package/build/client/assets/finished-MrsevkkK.js.map +0 -1
  248. package/build/client/assets/ganttDiagram-APWFNJXF-TfB6wYvN.js +0 -258
  249. package/build/client/assets/gitGraphDiagram-7IBYFJ6S-D2NQnQv2.js +0 -66
  250. package/build/client/assets/index-9euhNa27.js +0 -2
  251. package/build/client/assets/index-9euhNa27.js.map +0 -1
  252. package/build/client/assets/index-B8yUFowV.js +0 -2
  253. package/build/client/assets/index-B8yUFowV.js.map +0 -1
  254. package/build/client/assets/index-BmMpCvYx.js +0 -2
  255. package/build/client/assets/index-DLC5u33j.js +0 -36
  256. package/build/client/assets/index-DPHVg8Eh.js +0 -2
  257. package/build/client/assets/index-DPHVg8Eh.js.map +0 -1
  258. package/build/client/assets/index-Do-KWT0a.js +0 -42
  259. package/build/client/assets/index-Dsusf_Av.js +0 -38
  260. package/build/client/assets/index-Dsusf_Av.js.map +0 -1
  261. package/build/client/assets/index-DvQyydjU.js +0 -3
  262. package/build/client/assets/index-Fw2eA3AF.js +0 -2
  263. package/build/client/assets/index-Fw2eA3AF.js.map +0 -1
  264. package/build/client/assets/infoDiagram-PH2N3AL5-D-nEozcT.js +0 -3
  265. package/build/client/assets/l-ChG-6rmU.js +0 -2
  266. package/build/client/assets/l-ChG-6rmU.js.map +0 -1
  267. package/build/client/assets/loading-b1FV2pQh.js +0 -2
  268. package/build/client/assets/login-Ci7cdiuj.js +0 -2
  269. package/build/client/assets/login-Ci7cdiuj.js.map +0 -1
  270. package/build/client/assets/manifest-f9e2a790.js +0 -1
  271. package/build/client/assets/mdx-C7imFHZE.js +0 -3
  272. package/build/client/assets/mdx-C7imFHZE.js.map +0 -1
  273. package/build/client/assets/mindmap-definition-ALO5MXBD-BhzLy0Zl.js +0 -96
  274. package/build/client/assets/misc-2sBiisF5.js +0 -2
  275. package/build/client/assets/nav-chevrons-CV-dpXNR.js +0 -2
  276. package/build/client/assets/nav-chevrons-CV-dpXNR.js.map +0 -1
  277. package/build/client/assets/onboarding-c9ZuxLsm.js +0 -2
  278. package/build/client/assets/onboarding-c9ZuxLsm.js.map +0 -1
  279. package/build/client/assets/online-DZKJk3C2.js +0 -2
  280. package/build/client/assets/pe-BShc2dvc.js +0 -2
  281. package/build/client/assets/pieDiagram-IB7DONF6-CaTGj8RH.js +0 -31
  282. package/build/client/assets/preferences-BkWQyRCq.js +0 -2
  283. package/build/client/assets/preferences-BkWQyRCq.js.map +0 -1
  284. package/build/client/assets/preview-CqZGJtsE.js +0 -2
  285. package/build/client/assets/preview-CqZGJtsE.js.map +0 -1
  286. package/build/client/assets/product-DJOWNuL-.js +0 -2
  287. package/build/client/assets/progress-BJ4ADF-s.js +0 -2
  288. package/build/client/assets/progress-bar-DgnkQxQw.js +0 -2
  289. package/build/client/assets/progress-bar-DgnkQxQw.js.map +0 -1
  290. package/build/client/assets/revalidation-ws-B0skixgr.js +0 -2
  291. package/build/client/assets/revalidation-ws-B0skixgr.js.map +0 -1
  292. package/build/client/assets/root-C_WG23OF.js +0 -11
  293. package/build/client/assets/root-C_WG23OF.js.map +0 -1
  294. package/build/client/assets/sankeyDiagram-QLVOVGJD-Bt8556P1.js +0 -11
  295. package/build/client/assets/set-playground-DW2Ys-rV.js +0 -2
  296. package/build/client/assets/set-playground-DW2Ys-rV.js.map +0 -1
  297. package/build/client/assets/stateDiagram-DGXRK772-B3BuD15b.js +0 -2
  298. package/build/client/assets/stateDiagram-v2-YXO3MK2T-BzFxWpqR.js +0 -2
  299. package/build/client/assets/support-Bg0iSyle.js +0 -2
  300. package/build/client/assets/support-Bg0iSyle.js.map +0 -1
  301. package/build/client/assets/test-DdUNKtkF.js +0 -2
  302. package/build/client/assets/test-DdUNKtkF.js.map +0 -1
  303. package/build/client/assets/tests-B1ak2CDI.js.map +0 -1
  304. package/build/client/assets/tooltip-Bzd6O8vq.js +0 -2
  305. package/build/client/assets/use-event-source-Dar8h_B8.js +0 -2
  306. package/build/client/assets/user-DNSnhqGn.js +0 -2
  307. package/build/client/assets/user-DNSnhqGn.js.map +0 -1
  308. package/build/client/assets/version-DriSvNMy.js +0 -2
  309. package/build/client/assets/version-DriSvNMy.js.map +0 -1
  310. package/build/client/assets/workshop-config-DchzGYJM.js +0 -2
  311. package/build/client/assets/workshop-config-DchzGYJM.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"_layout-B_NrRv0S.js","sources":["../../../../../node_modules/framer-motion/dist/es/animation/hooks/animation-controls.mjs","../../../../../node_modules/framer-motion/dist/es/animation/hooks/use-animation.mjs","../../../app/components/media-query.ts","../../../../../node_modules/@radix-ui/react-dialog/dist/index.mjs","../../../app/components/ui/dialog.tsx","../../../app/routes/_app+/_layout.tsx"],"sourcesContent":["import { invariant } from 'motion-utils';\nimport { setTarget } from '../../render/utils/setters.mjs';\nimport { animateVisualElement } from '../interfaces/visual-element.mjs';\n\nfunction stopAnimation(visualElement) {\n visualElement.values.forEach((value) => value.stop());\n}\nfunction setVariants(visualElement, variantLabels) {\n const reversedLabels = [...variantLabels].reverse();\n reversedLabels.forEach((key) => {\n const variant = visualElement.getVariant(key);\n variant && setTarget(visualElement, variant);\n if (visualElement.variantChildren) {\n visualElement.variantChildren.forEach((child) => {\n setVariants(child, variantLabels);\n });\n }\n });\n}\nfunction setValues(visualElement, definition) {\n if (Array.isArray(definition)) {\n return setVariants(visualElement, definition);\n }\n else if (typeof definition === \"string\") {\n return setVariants(visualElement, [definition]);\n }\n else {\n setTarget(visualElement, definition);\n }\n}\n/**\n * @public\n */\nfunction animationControls() {\n /**\n * Track whether the host component has mounted.\n */\n let hasMounted = false;\n /**\n * A collection of linked component animation controls.\n */\n const subscribers = new Set();\n const controls = {\n subscribe(visualElement) {\n subscribers.add(visualElement);\n return () => void subscribers.delete(visualElement);\n },\n start(definition, transitionOverride) {\n invariant(hasMounted, \"controls.start() should only be called after a component has mounted. Consider calling within a useEffect hook.\");\n const animations = [];\n subscribers.forEach((visualElement) => {\n animations.push(animateVisualElement(visualElement, definition, {\n transitionOverride,\n }));\n });\n return Promise.all(animations);\n },\n set(definition) {\n invariant(hasMounted, \"controls.set() should only be called after a component has mounted. Consider calling within a useEffect hook.\");\n return subscribers.forEach((visualElement) => {\n setValues(visualElement, definition);\n });\n },\n stop() {\n subscribers.forEach((visualElement) => {\n stopAnimation(visualElement);\n });\n },\n mount() {\n hasMounted = true;\n return () => {\n hasMounted = false;\n controls.stop();\n };\n },\n };\n return controls;\n}\n\nexport { animationControls, setValues };\n","import { animationControls } from './animation-controls.mjs';\nimport { useConstant } from '../../utils/use-constant.mjs';\nimport { useIsomorphicLayoutEffect } from '../../utils/use-isomorphic-effect.mjs';\n\n/**\n * Creates `AnimationControls`, which can be used to manually start, stop\n * and sequence animations on one or more components.\n *\n * The returned `AnimationControls` should be passed to the `animate` property\n * of the components you want to animate.\n *\n * These components can then be animated with the `start` method.\n *\n * ```jsx\n * import * as React from 'react'\n * import { motion, useAnimation } from 'framer-motion'\n *\n * export function MyComponent(props) {\n * const controls = useAnimation()\n *\n * controls.start({\n * x: 100,\n * transition: { duration: 0.5 },\n * })\n *\n * return <motion.div animate={controls} />\n * }\n * ```\n *\n * @returns Animation controller with `start` and `stop` methods\n *\n * @public\n */\nfunction useAnimationControls() {\n const controls = useConstant(animationControls);\n useIsomorphicLayoutEffect(controls.mount, []);\n return controls;\n}\nconst useAnimation = useAnimationControls;\n\nexport { useAnimation, useAnimationControls };\n","import { useSyncExternalStore } from 'react'\n\nexport function makeMediaQueryStore(\n\tmediaQuery: string,\n\tserverSnapshot: boolean,\n) {\n\tfunction getSnapshot() {\n\t\treturn window.matchMedia(mediaQuery).matches\n\t}\n\n\tfunction subscribe(callback: () => void) {\n\t\tconst mediaQueryList = window.matchMedia(mediaQuery)\n\t\tmediaQueryList.addEventListener('change', callback)\n\t\treturn () => {\n\t\t\tmediaQueryList.removeEventListener('change', callback)\n\t\t}\n\t}\n\n\treturn function useMediaQuery() {\n\t\treturn useSyncExternalStore(subscribe, getSnapshot, () => serverSnapshot)\n\t}\n}\n","\"use client\";\n\n// src/dialog.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContext, createContextScope } from \"@radix-ui/react-context\";\nimport { useId } from \"@radix-ui/react-id\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { FocusScope } from \"@radix-ui/react-focus-scope\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useFocusGuards } from \"@radix-ui/react-focus-guards\";\nimport { RemoveScroll } from \"react-remove-scroll\";\nimport { hideOthers } from \"aria-hidden\";\nimport { createSlot } from \"@radix-ui/react-slot\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nvar DIALOG_NAME = \"Dialog\";\nvar [createDialogContext, createDialogScope] = createContextScope(DIALOG_NAME);\nvar [DialogProvider, useDialogContext] = createDialogContext(DIALOG_NAME);\nvar Dialog = (props) => {\n const {\n __scopeDialog,\n children,\n open: openProp,\n defaultOpen,\n onOpenChange,\n modal = true\n } = props;\n const triggerRef = React.useRef(null);\n const contentRef = React.useRef(null);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: DIALOG_NAME\n });\n return /* @__PURE__ */ jsx(\n DialogProvider,\n {\n scope: __scopeDialog,\n triggerRef,\n contentRef,\n contentId: useId(),\n titleId: useId(),\n descriptionId: useId(),\n open,\n onOpenChange: setOpen,\n onOpenToggle: React.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]),\n modal,\n children\n }\n );\n};\nDialog.displayName = DIALOG_NAME;\nvar TRIGGER_NAME = \"DialogTrigger\";\nvar DialogTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...triggerProps } = props;\n const context = useDialogContext(TRIGGER_NAME, __scopeDialog);\n const composedTriggerRef = useComposedRefs(forwardedRef, context.triggerRef);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": context.open,\n \"aria-controls\": context.contentId,\n \"data-state\": getState(context.open),\n ...triggerProps,\n ref: composedTriggerRef,\n onClick: composeEventHandlers(props.onClick, context.onOpenToggle)\n }\n );\n }\n);\nDialogTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"DialogPortal\";\nvar [PortalProvider, usePortalContext] = createDialogContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar DialogPortal = (props) => {\n const { __scopeDialog, forceMount, children, container } = props;\n const context = useDialogContext(PORTAL_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopeDialog, forceMount, children: React.Children.map(children, (child) => /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, container, children: child }) })) });\n};\nDialogPortal.displayName = PORTAL_NAME;\nvar OVERLAY_NAME = \"DialogOverlay\";\nvar DialogOverlay = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(OVERLAY_NAME, props.__scopeDialog);\n const { forceMount = portalContext.forceMount, ...overlayProps } = props;\n const context = useDialogContext(OVERLAY_NAME, props.__scopeDialog);\n return context.modal ? /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(DialogOverlayImpl, { ...overlayProps, ref: forwardedRef }) }) : null;\n }\n);\nDialogOverlay.displayName = OVERLAY_NAME;\nvar Slot = createSlot(\"DialogOverlay.RemoveScroll\");\nvar DialogOverlayImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...overlayProps } = props;\n const context = useDialogContext(OVERLAY_NAME, __scopeDialog);\n return (\n // Make sure `Content` is scrollable even when it doesn't live inside `RemoveScroll`\n // ie. when `Overlay` and `Content` are siblings\n /* @__PURE__ */ jsx(RemoveScroll, { as: Slot, allowPinchZoom: true, shards: [context.contentRef], children: /* @__PURE__ */ jsx(\n Primitive.div,\n {\n \"data-state\": getState(context.open),\n ...overlayProps,\n ref: forwardedRef,\n style: { pointerEvents: \"auto\", ...overlayProps.style }\n }\n ) })\n );\n }\n);\nvar CONTENT_NAME = \"DialogContent\";\nvar DialogContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeDialog);\n const { forceMount = portalContext.forceMount, ...contentProps } = props;\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: context.modal ? /* @__PURE__ */ jsx(DialogContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(DialogContentNonModal, { ...contentProps, ref: forwardedRef }) });\n }\n);\nDialogContent.displayName = CONTENT_NAME;\nvar DialogContentModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, context.contentRef, contentRef);\n React.useEffect(() => {\n const content = contentRef.current;\n if (content) return hideOthers(content);\n }, []);\n return /* @__PURE__ */ jsx(\n DialogContentImpl,\n {\n ...props,\n ref: composedRefs,\n trapFocus: context.open,\n disableOutsidePointerEvents: true,\n onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {\n event.preventDefault();\n context.triggerRef.current?.focus();\n }),\n onPointerDownOutside: composeEventHandlers(props.onPointerDownOutside, (event) => {\n const originalEvent = event.detail.originalEvent;\n const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;\n const isRightClick = originalEvent.button === 2 || ctrlLeftClick;\n if (isRightClick) event.preventDefault();\n }),\n onFocusOutside: composeEventHandlers(\n props.onFocusOutside,\n (event) => event.preventDefault()\n )\n }\n );\n }\n);\nvar DialogContentNonModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = useDialogContext(CONTENT_NAME, props.__scopeDialog);\n const hasInteractedOutsideRef = React.useRef(false);\n const hasPointerDownOutsideRef = React.useRef(false);\n return /* @__PURE__ */ jsx(\n DialogContentImpl,\n {\n ...props,\n ref: forwardedRef,\n trapFocus: false,\n disableOutsidePointerEvents: false,\n onCloseAutoFocus: (event) => {\n props.onCloseAutoFocus?.(event);\n if (!event.defaultPrevented) {\n if (!hasInteractedOutsideRef.current) context.triggerRef.current?.focus();\n event.preventDefault();\n }\n hasInteractedOutsideRef.current = false;\n hasPointerDownOutsideRef.current = false;\n },\n onInteractOutside: (event) => {\n props.onInteractOutside?.(event);\n if (!event.defaultPrevented) {\n hasInteractedOutsideRef.current = true;\n if (event.detail.originalEvent.type === \"pointerdown\") {\n hasPointerDownOutsideRef.current = true;\n }\n }\n const target = event.target;\n const targetIsTrigger = context.triggerRef.current?.contains(target);\n if (targetIsTrigger) event.preventDefault();\n if (event.detail.originalEvent.type === \"focusin\" && hasPointerDownOutsideRef.current) {\n event.preventDefault();\n }\n }\n }\n );\n }\n);\nvar DialogContentImpl = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, trapFocus, onOpenAutoFocus, onCloseAutoFocus, ...contentProps } = props;\n const context = useDialogContext(CONTENT_NAME, __scopeDialog);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, contentRef);\n useFocusGuards();\n return /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(\n FocusScope,\n {\n asChild: true,\n loop: true,\n trapped: trapFocus,\n onMountAutoFocus: onOpenAutoFocus,\n onUnmountAutoFocus: onCloseAutoFocus,\n children: /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n role: \"dialog\",\n id: context.contentId,\n \"aria-describedby\": context.descriptionId,\n \"aria-labelledby\": context.titleId,\n \"data-state\": getState(context.open),\n ...contentProps,\n ref: composedRefs,\n onDismiss: () => context.onOpenChange(false)\n }\n )\n }\n ),\n /* @__PURE__ */ jsxs(Fragment, { children: [\n /* @__PURE__ */ jsx(TitleWarning, { titleId: context.titleId }),\n /* @__PURE__ */ jsx(DescriptionWarning, { contentRef, descriptionId: context.descriptionId })\n ] })\n ] });\n }\n);\nvar TITLE_NAME = \"DialogTitle\";\nvar DialogTitle = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...titleProps } = props;\n const context = useDialogContext(TITLE_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(Primitive.h2, { id: context.titleId, ...titleProps, ref: forwardedRef });\n }\n);\nDialogTitle.displayName = TITLE_NAME;\nvar DESCRIPTION_NAME = \"DialogDescription\";\nvar DialogDescription = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...descriptionProps } = props;\n const context = useDialogContext(DESCRIPTION_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(Primitive.p, { id: context.descriptionId, ...descriptionProps, ref: forwardedRef });\n }\n);\nDialogDescription.displayName = DESCRIPTION_NAME;\nvar CLOSE_NAME = \"DialogClose\";\nvar DialogClose = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeDialog, ...closeProps } = props;\n const context = useDialogContext(CLOSE_NAME, __scopeDialog);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n ...closeProps,\n ref: forwardedRef,\n onClick: composeEventHandlers(props.onClick, () => context.onOpenChange(false))\n }\n );\n }\n);\nDialogClose.displayName = CLOSE_NAME;\nfunction getState(open) {\n return open ? \"open\" : \"closed\";\n}\nvar TITLE_WARNING_NAME = \"DialogTitleWarning\";\nvar [WarningProvider, useWarningContext] = createContext(TITLE_WARNING_NAME, {\n contentName: CONTENT_NAME,\n titleName: TITLE_NAME,\n docsSlug: \"dialog\"\n});\nvar TitleWarning = ({ titleId }) => {\n const titleWarningContext = useWarningContext(TITLE_WARNING_NAME);\n const MESSAGE = `\\`${titleWarningContext.contentName}\\` requires a \\`${titleWarningContext.titleName}\\` for the component to be accessible for screen reader users.\n\nIf you want to hide the \\`${titleWarningContext.titleName}\\`, you can wrap it with our VisuallyHidden component.\n\nFor more information, see https://radix-ui.com/primitives/docs/components/${titleWarningContext.docsSlug}`;\n React.useEffect(() => {\n if (titleId) {\n const hasTitle = document.getElementById(titleId);\n if (!hasTitle) console.error(MESSAGE);\n }\n }, [MESSAGE, titleId]);\n return null;\n};\nvar DESCRIPTION_WARNING_NAME = \"DialogDescriptionWarning\";\nvar DescriptionWarning = ({ contentRef, descriptionId }) => {\n const descriptionWarningContext = useWarningContext(DESCRIPTION_WARNING_NAME);\n const MESSAGE = `Warning: Missing \\`Description\\` or \\`aria-describedby={undefined}\\` for {${descriptionWarningContext.contentName}}.`;\n React.useEffect(() => {\n const describedById = contentRef.current?.getAttribute(\"aria-describedby\");\n if (descriptionId && describedById) {\n const hasDescription = document.getElementById(descriptionId);\n if (!hasDescription) console.warn(MESSAGE);\n }\n }, [MESSAGE, contentRef, descriptionId]);\n return null;\n};\nvar Root = Dialog;\nvar Trigger = DialogTrigger;\nvar Portal = DialogPortal;\nvar Overlay = DialogOverlay;\nvar Content = DialogContent;\nvar Title = DialogTitle;\nvar Description = DialogDescription;\nvar Close = DialogClose;\nexport {\n Close,\n Content,\n Description,\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n Overlay,\n Portal,\n Root,\n Title,\n Trigger,\n WarningProvider,\n createDialogScope\n};\n//# sourceMappingURL=index.mjs.map\n","import * as DialogPrimitive from '@radix-ui/react-dialog'\nimport * as React from 'react'\nimport { cn } from '#app/utils/misc.tsx'\nimport { Icon } from '../icons'\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nfunction DialogOverlay({\n\tclassName,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n\treturn (\n\t\t<DialogPrimitive.Overlay\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nfunction DialogContent({\n\tclassName,\n\tchildren,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Content>) {\n\treturn (\n\t\t<DialogPortal>\n\t\t\t<DialogOverlay />\n\t\t\t<DialogPrimitive.Content\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t<DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity data-[state=open]:bg-accent data-[state=open]:text-muted-foreground hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none\">\n\t\t\t\t\t<Icon name=\"Close\" />\n\t\t\t\t\t<span className=\"sr-only\">Close</span>\n\t\t\t\t</DialogPrimitive.Close>\n\t\t\t</DialogPrimitive.Content>\n\t\t</DialogPortal>\n\t)\n}\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nfunction DialogHeader({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'flex flex-col space-y-1.5 text-center sm:text-left',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogHeader.displayName = 'DialogHeader'\n\nfunction DialogFooter({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogFooter.displayName = 'DialogFooter'\n\nfunction DialogTitle({\n\tclassName,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n\treturn (\n\t\t<DialogPrimitive.Title\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'text-lg font-semibold leading-none tracking-tight',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nfunction DialogDescription({\n\tclassName,\n\tref,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n\treturn (\n\t\t<DialogPrimitive.Description\n\t\t\tref={ref}\n\t\t\tclassName={cn('text-sm text-muted-foreground', className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n\tDialog,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogOverlay,\n\tDialogPortal,\n\tDialogTitle,\n\tDialogTrigger,\n}\n","import {\n\textractNumbersAndTypeFromAppNameOrPath,\n\tgetExercises,\n\tgetPlaygroundAppName,\n} from '@epic-web/workshop-utils/apps.server'\nimport { getWorkshopConfig } from '@epic-web/workshop-utils/config.server'\nimport {\n\tcombineServerTimings,\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport {\n\tunstable_data as data,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n} from '@remix-run/node'\nimport {\n\tLink,\n\tNavLink,\n\tOutlet,\n\tuseLoaderData,\n\tuseParams,\n} from '@remix-run/react'\nimport { clsx } from 'clsx'\nimport {\n\tmotion,\n\tuseAnimationControls,\n\ttype AnimationControls,\n} from 'framer-motion'\nimport * as React from 'react'\nimport { useHydrated } from 'remix-utils/use-hydrated'\nimport { Icon } from '#app/components/icons.tsx'\nimport { makeMediaQueryStore } from '#app/components/media-query.ts'\nimport { Logo } from '#app/components/product.tsx'\nimport { useRevalidationWS } from '#app/components/revalidation-ws.js'\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogHeader,\n\tDialogTrigger,\n} from '#app/components/ui/dialog.js'\nimport {\n\tSimpleTooltip,\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from '#app/components/ui/tooltip.tsx'\nimport { useOptionalUser, useUserHasAccess } from '#app/components/user.tsx'\nimport { useWorkshopConfig } from '#app/components/workshop-config.js'\nimport { cn, getExercisePath, getExerciseStepPath } from '#app/utils/misc.tsx'\nimport { useIsOnline } from '#app/utils/online.ts'\nimport { usePresence, type User } from '#app/utils/presence.tsx'\nimport {\n\tuseExerciseProgressClassName,\n\tuseNextExerciseRoute,\n\tuseProgressItemClassName,\n\ttype ProgressItemSearch,\n} from '../progress.tsx'\nimport { ThemeSwitch } from '../theme/index.tsx'\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('appLayoutLoader')\n\tconst { title: workshopTitle } = getWorkshopConfig()\n\tconst [exercises, playgroundAppName] = await Promise.all([\n\t\tgetExercises({ request, timings }),\n\t\tgetPlaygroundAppName(),\n\t])\n\n\tconst playgroundNumbersAndType = extractNumbersAndTypeFromAppNameOrPath(\n\t\tplaygroundAppName ?? '',\n\t)\n\tconst playground = {\n\t\tappName: playgroundAppName,\n\t\texerciseNumber: Number(playgroundNumbersAndType?.exerciseNumber),\n\t\tstepNumber: Number(playgroundNumbersAndType?.stepNumber),\n\t\ttype: playgroundNumbersAndType?.type,\n\t}\n\n\tconst result = data(\n\t\t{\n\t\t\tworkshopTitle,\n\t\t\texercises: exercises.map((e) => ({\n\t\t\t\texerciseNumber: e.exerciseNumber,\n\t\t\t\ttitle: e.title,\n\t\t\t\tsolutions: e.solutions.map(({ stepNumber, title, name }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle,\n\t\t\t\t\tname,\n\t\t\t\t})),\n\t\t\t\tproblems: e.problems.map(({ stepNumber, title, name }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle,\n\t\t\t\t\tname,\n\t\t\t\t})),\n\t\t\t\tsteps: e.steps.map(({ stepNumber, problem, solution }) => ({\n\t\t\t\t\tstepNumber,\n\t\t\t\t\ttitle: problem?.title ?? solution?.title ?? 'Unknown',\n\t\t\t\t\tname: problem?.name ?? solution?.name ?? 'Unknown',\n\t\t\t\t\tproblem: problem\n\t\t\t\t\t\t? { name: problem.name, title: problem.title }\n\t\t\t\t\t\t: null,\n\t\t\t\t\tsolution: solution\n\t\t\t\t\t\t? { name: solution.name, title: solution.title }\n\t\t\t\t\t\t: null,\n\t\t\t\t})),\n\t\t\t})),\n\t\t\tplayground,\n\t\t\tisMenuOpened:\n\t\t\t\trequest.headers.get('cookie')?.includes('es_menu_open=true') ?? false,\n\t\t},\n\t\t{\n\t\t\theaders: {\n\t\t\t\tVary: 'Cookie',\n\t\t\t\t'Server-Timing': getServerTimeHeader(timings),\n\t\t\t},\n\t\t},\n\t)\n\treturn result\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders, parentHeaders }) => {\n\tconst headers = {\n\t\t'Cache-Control': loaderHeaders.get('Cache-Control') ?? '',\n\t\tVary: 'Cookie',\n\t\t'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nconst opacities = ['opacity-70', 'opacity-80', 'opacity-90', 'opacity-100']\nconst shadows = [\n\t'shadow-[0_0_2px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_4px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_7px_0_rgba(0,0,0,0.3)]',\n\t'shadow-[0_0_10px_0_rgba(0,0,0,0.3)]',\n]\nfunction getScoreClassNames(score: number) {\n\tconst opacityNumber = Math.round(score * opacities.length - 1)\n\tconst shadowNumber = Math.round(score * shadows.length - 1)\n\treturn cn(\n\t\t'shadow-purple-700 hover:opacity-100 focus:opacity-100 dark:shadow-purple-200',\n\t\topacities[opacityNumber] ?? 'opacity-60',\n\t\tshadows[shadowNumber] ?? 'shadow-none',\n\t\tscore === 1 ? 'animate-pulse hover:animate-none focus:animate-none' : null,\n\t)\n}\n\nfunction FacePile({ isMenuOpened }: { isMenuOpened: boolean }) {\n\tconst loggedInUser = useOptionalUser()\n\tconst { users } = usePresence()\n\tconst {\n\t\tproduct: { displayNameShort },\n\t} = useWorkshopConfig()\n\tconst limit = isMenuOpened ? 17 : 0\n\tconst numberOverLimit = users.length - limit\n\tconst shouldShowNumberOverLimit = numberOverLimit > (isMenuOpened ? 1 : 0)\n\n\tif (!users.length) return null\n\n\tconst tiffany =\n\t\tisMenuOpened && users.length === 1 ? (\n\t\t\t<Link\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\tto=\"https://www.youtube.com/watch?v=w6Q3mHyzn78\"\n\t\t\t>\n\t\t\t\t<img\n\t\t\t\t\talt=\"Tiffany Tunes\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'h-8 w-8 rounded-full border object-cover',\n\t\t\t\t\t\tgetScoreClassNames(1),\n\t\t\t\t\t)}\n\t\t\t\t\tsrc=\"/img/tiffany.png\"\n\t\t\t\t/>\n\t\t\t</Link>\n\t\t) : null\n\tconst overLimitLabel = `${numberOverLimit}${\n\t\tisMenuOpened ? ' more ' : ' '\n\t}${displayNameShort} Dev${numberOverLimit === 1 ? '' : 's'} working now`\n\treturn (\n\t\t<div className=\"flex flex-wrap items-center gap-2\">\n\t\t\t<TooltipProvider>\n\t\t\t\t{(shouldShowNumberOverLimit ? users.slice(0, limit) : users).map(\n\t\t\t\t\t({ user, score }) => {\n\t\t\t\t\t\tconst scoreClassNames = getScoreClassNames(score)\n\t\t\t\t\t\tconst locationLabel = getLocationLabel(user.location)\n\t\t\t\t\t\tconst imageUrl = user.imageUrlSmall || user.avatarUrl\n\t\t\t\t\t\tconst hasAccess = user.hasAccess\n\t\t\t\t\t\tconst local = user.location?.origin?.includes('localhost')\n\n\t\t\t\t\t\tlet doingLabel: string\n\t\t\t\t\t\tif (hasAccess) {\n\t\t\t\t\t\t\tdoingLabel = local ? 'working' : 'referencing'\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdoingLabel = local ? 'previewing' : 'reviewing'\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Tooltip key={user.id}>\n\t\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t\t{imageUrl ? (\n\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\t\t\t\talt={user.name || displayNameShort}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'h-8 w-8 rounded-full border object-cover',\n\t\t\t\t\t\t\t\t\t\t\t\tscoreClassNames,\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\tsrc={imageUrl}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\t\t\t\taria-label={user.name || `${displayNameShort} Dev`}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'flex h-8 w-8 items-center justify-center rounded-full border',\n\t\t\t\t\t\t\t\t\t\t\t\tscoreClassNames,\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Icon name=\"User\" />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t\t\t<span className=\"flex flex-col items-center justify-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t{user.name || `${displayNameShort} Dev`}{' '}\n\t\t\t\t\t\t\t\t\t\t\t{locationLabel\n\t\t\t\t\t\t\t\t\t\t\t\t? ` is ${doingLabel} ${\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tscore === 1 && loggedInUser?.id !== user.id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'with you'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t\t\t\t\t\t\t\t} on`\n\t\t\t\t\t\t\t\t\t\t\t\t: null}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t{locationLabel?.line1 ? (\n\t\t\t\t\t\t\t\t\t\t\t<span>{locationLabel.line1}</span>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t{locationLabel?.line2 ? (\n\t\t\t\t\t\t\t\t\t\t\t<span>{locationLabel.line2}</span>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t)}\n\t\t\t\t{tiffany}\n\t\t\t\t{shouldShowNumberOverLimit ? (\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\taria-label={overLimitLabel}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex items-center justify-center rounded-full border bg-accent text-xs text-accent-foreground',\n\t\t\t\t\t\t\t\t\tisMenuOpened ? 'h-8 w-8' : 'h-6 w-6',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'pointer-events-none overflow-hidden text-ellipsis whitespace-nowrap text-center',\n\t\t\t\t\t\t\t\t\t\tisMenuOpened ? 'w-8' : 'w-6',\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{isMenuOpened ? `+${numberOverLimit}` : numberOverLimit}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>{overLimitLabel}</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t) : null}\n\t\t\t</TooltipProvider>\n\t\t</div>\n\t)\n}\n\nconst useIsWide = makeMediaQueryStore('(min-width: 640px)', true)\n\nexport default function App() {\n\tconst data = useLoaderData<typeof loader>()\n\tconst user = useOptionalUser()\n\tconst isWide = useIsWide()\n\tconst isHydrated = useHydrated()\n\n\tconst [isMenuOpened, setMenuOpenedState] = React.useState(data.isMenuOpened)\n\tuseRevalidationWS({ watchPaths: ['./exercises/README.mdx'] })\n\n\tfunction setMenuOpened(value: boolean) {\n\t\tsetMenuOpenedState(value)\n\t\tdocument.cookie = `es_menu_open=${value.toString()}; path=/; SameSite=Lax;`\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col\">\n\t\t\t{user ? null : <NoUserBanner />}\n\t\t\t{/*\n\t\t\t\tthis isn't placed in a conditional with isWide because the server render\n\t\t\t\tdoesn't know whether it should be around or not so we just use CSS to hide it\n\t\t\t\tif it's not supposed to show up.\n\n\t\t\t\tWe don't just use media queries for the wider screen nav because we want\n\t\t\t\tto avoid running all the logic in there unnecessarily.\n\t\t\t*/}\n\t\t\t{isHydrated && isWide ? null : (\n\t\t\t\t<MobileNavigation\n\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\tonMenuOpenChange={setMenuOpened}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<div\n\t\t\t\t// this nonsense is here because we want the panels to be scrollable rather\n\t\t\t\t// than having the entire page be scrollable (at least on wider screens)\n\t\t\t\tclassName={cn('flex flex-grow flex-col sm:flex-row', {\n\t\t\t\t\t'h-[calc(100vh-128px-env(safe-area-inset-top)-env(safe-area-inset-bottom))] sm:h-[calc(100vh-64px-env(safe-area-inset-top)-env(safe-area-inset-bottom))]':\n\t\t\t\t\t\t!user,\n\t\t\t\t\t'h-[calc(100vh-64px-env(safe-area-inset-top)-env(safe-area-inset-bottom))] sm:h-[calc(100vh-env(safe-area-inset-top)-env(safe-area-inset-bottom))]':\n\t\t\t\t\t\tuser,\n\t\t\t\t\t'h-[unset]': !isWide && isMenuOpened,\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t{isWide ? (\n\t\t\t\t\t<Navigation\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tonMenuOpenChange={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'h-full w-full max-w-full sm:max-w-[calc(100%-56px)]',\n\t\t\t\t\t\tisMenuOpened ? 'hidden md:block' : '',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Outlet />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction getLocationLabel(location: User['location']) {\n\tif (!location) return null\n\n\tconst { exercise } = location\n\n\tconst exercisePortion = [\n\t\texercise\n\t\t\t? [exercise.exerciseNumber, exercise.stepNumber]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.map((s) => s.toString().padStart(2, '0'))\n\t\t\t\t\t.join('/')\n\t\t\t: null,\n\t\texercise?.type,\n\t]\n\t\t.filter(Boolean)\n\t\t.join(' - ')\n\treturn { line1: location.workshopTitle, line2: exercisePortion }\n}\n\nfunction NoUserBanner() {\n\tconst isWide = useIsWide()\n\tconst {\n\t\tproduct: { host, displayName },\n\t} = useWorkshopConfig()\n\tconst userHasAccess = useUserHasAccess()\n\tconst details = (\n\t\t<div>\n\t\t\t{ENV.EPICSHOP_DEPLOYED ? (\n\t\t\t\t<div>\n\t\t\t\t\t{`This is the deployed version. `}\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tto={ENV.EPICSHOP_GITHUB_REPO}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tRun locally\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t{` for full experience.`}\n\t\t\t\t\t</>{' '}\n\t\t\t\t</div>\n\t\t\t) : userHasAccess ? (\n\t\t\t\t<div>\n\t\t\t\t\t<Link to=\"/login\" className=\"underline\">\n\t\t\t\t\t\tLogin\n\t\t\t\t\t</Link>{' '}\n\t\t\t\t\tor{' '}\n\t\t\t\t\t<a href={`https://${host}/login`} className=\"underline\">\n\t\t\t\t\t\tjoin for free\n\t\t\t\t\t</a>{' '}\n\t\t\t\t\tfor the full experience.\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</div>\n\t)\n\treturn (\n\t\t<div className=\"z-10 flex h-16 items-center justify-between border-b bg-gradient-to-tr from-blue-500 to-indigo-500 pl-4 text-white\">\n\t\t\t{isWide ? (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"hidden flex-1 flex-wrap items-center gap-4 sm:flex\">\n\t\t\t\t\t\t<Logo size=\"lg\" style=\"monochrome\" />\n\t\t\t\t\t\t<div className=\"flex flex-1 flex-wrap items-center\">\n\t\t\t\t\t\t\t<p className=\"mr-2\">\n\t\t\t\t\t\t\t\tWelcome to the{' '}\n\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\tto={`https://${host}`}\n\t\t\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t</Link>{' '}\n\t\t\t\t\t\t\t\tWorkshop app!\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t{details}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t{userHasAccess ? null : (\n\t\t\t\t\t\t<div className=\"hidden h-full flex-col items-center sm:flex md:flex-row\">\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={`https://${host}`}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Join {displayName}</span>\n\t\t\t\t\t\t\t\t<span>↗︎</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={ENV.EPICSHOP_DEPLOYED ? `https://${host}/login` : '/login'}\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 bg-white/20 px-5 text-sm font-semibold shadow-md transition hover:bg-white/30\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"User\" size=\"lg\" />\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Login</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"flex flex-1 flex-wrap items-center gap-4 sm:hidden\">\n\t\t\t\t\t\t<a href={`https://${host}`}>\n\t\t\t\t\t\t\t<Logo size=\"lg\" style=\"monochrome\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<Dialog>\n\t\t\t\t\t\t\t<DialogTrigger>\n\t\t\t\t\t\t\t\t<Icon name=\"Question\" size=\"lg\" className=\"animate-pulse\" />\n\t\t\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t\t\t<DialogContent>\n\t\t\t\t\t\t\t\t<DialogHeader>\n\t\t\t\t\t\t\t\t\t<Logo size=\"lg\" style=\"monochrome\" />\n\t\t\t\t\t\t\t\t\t<span className=\"text-lg font-semibold\">{displayName}</span>\n\t\t\t\t\t\t\t\t</DialogHeader>\n\t\t\t\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\t\t\t\tWelcome to the{' '}\n\t\t\t\t\t\t\t\t\t<Link to={`https://${host}`} className=\"underline\">\n\t\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t\t</Link>{' '}\n\t\t\t\t\t\t\t\t\tWorkshop app!\n\t\t\t\t\t\t\t\t</DialogDescription>\n\t\t\t\t\t\t\t\t{details}\n\t\t\t\t\t\t\t</DialogContent>\n\t\t\t\t\t\t</Dialog>\n\t\t\t\t\t</div>\n\t\t\t\t\t{userHasAccess ? null : (\n\t\t\t\t\t\t<div className=\"flex h-full items-center\">\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={`https://${host}`}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 px-5 text-sm font-semibold\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Join</span>\n\t\t\t\t\t\t\t\t<span>↗︎</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={ENV.EPICSHOP_DEPLOYED ? `https://${host}/login` : '/login'}\n\t\t\t\t\t\t\t\tclassName=\"flex h-full items-center justify-center space-x-1.5 bg-white/20 px-5 text-sm font-semibold shadow-md transition hover:bg-white/30\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"User\" size=\"lg\" />\n\t\t\t\t\t\t\t\t<span className=\"drop-shadow-sm\">Login</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\nconst itemVariants = {\n\thidden: { opacity: 0, x: -20 },\n\tvisible: { opacity: 1, x: 0 },\n}\nfunction NavigationExerciseListItem({\n\texerciseNumber,\n\tchildren,\n}: {\n\texerciseNumber: number\n\tchildren: React.ReactNode\n}) {\n\tconst progressClassName = useExerciseProgressClassName(exerciseNumber)\n\treturn (\n\t\t<motion.li\n\t\t\tvariants={itemVariants}\n\t\t\tclassName={cn(\n\t\t\t\t// add gap of 3 to children, but using padding so the progress extends through the whole height\n\t\t\t\t'py-[6px] first:pt-3 last:pb-3',\n\t\t\t\tprogressClassName ? `${progressClassName} before:border-t` : null,\n\t\t\t)}\n\t\t>\n\t\t\t<span className=\"inline-block pl-2\">{children}</span>\n\t\t</motion.li>\n\t)\n}\n\nfunction NavigationExerciseStepListItem({\n\tchildren,\n\t...progressItemSearch\n}: {\n\tchildren: React.ReactNode\n} & ProgressItemSearch) {\n\tconst progressClassName = useProgressItemClassName(progressItemSearch)\n\treturn (\n\t\t<motion.li\n\t\t\tvariants={itemVariants}\n\t\t\tclassName={cn(\n\t\t\t\t// add gap of 3 to children, but using padding so the progress extends through the whole height\n\t\t\t\t'py-[6px] first:pt-3 last:pb-3',\n\t\t\t\tprogressClassName ? `${progressClassName} before:border-t` : null,\n\t\t\t)}\n\t\t>\n\t\t\t<span className=\"inline-block pl-2\">{children}</span>\n\t\t</motion.li>\n\t)\n}\n\nfunction MobileNavigation({\n\tisMenuOpened,\n\tonMenuOpenChange: setMenuOpened,\n}: {\n\tisMenuOpened: boolean\n\tonMenuOpenChange: (change: boolean) => void\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tconst user = useOptionalUser()\n\tconst nextExerciseRoute = useNextExerciseRoute()\n\tconst params = useParams()\n\tconst isOnline = useIsOnline()\n\tconst { users } = usePresence()\n\n\t// items\n\tconst listVariants = {\n\t\tvisible: {\n\t\t\topacity: 1,\n\t\t\ttransition: {\n\t\t\t\tduration: 0.05,\n\t\t\t\twhen: 'beforeChildren',\n\t\t\t\tstaggerChildren: 0.03,\n\t\t\t},\n\t\t},\n\t\thidden: {\n\t\t\topacity: 0,\n\t\t},\n\t}\n\n\treturn (\n\t\t<nav className=\"flex w-full border-b sm:hidden\">\n\t\t\t<div className=\"w-full\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn('flex items-center', {\n\t\t\t\t\t\t'flex-col': isMenuOpened,\n\t\t\t\t\t\t'h-14': !isMenuOpened,\n\t\t\t\t\t})}\n\t\t\t\t>\n\t\t\t\t\t<NavToggle\n\t\t\t\t\t\ttitle={data.workshopTitle}\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tsetMenuOpened={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t\t{isMenuOpened && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tclassName=\"flex w-full flex-grow flex-col justify-between overflow-x-auto p-6 scrollbar-thin scrollbar-thumb-scrollbar\"\n\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\tclassName=\"flex flex-col\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\tto=\"/\"\n\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-2xl font-bold outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tHome\n\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{data.exercises.map(({ exerciseNumber, title, steps }) => {\n\t\t\t\t\t\t\t\t\tconst isActive =\n\t\t\t\t\t\t\t\t\t\tNumber(params.exerciseNumber) === exerciseNumber\n\t\t\t\t\t\t\t\t\tconst showPlayground =\n\t\t\t\t\t\t\t\t\t\t!isActive &&\n\t\t\t\t\t\t\t\t\t\tdata.playground.exerciseNumber === exerciseNumber\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<NavigationExerciseListItem\n\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-1 text-2xl font-bold\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t{showPlayground ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.exerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.stepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.type,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t🛝\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t{isActive ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"ml-4 mt-2 flex flex-col\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"instructions\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-xl font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t!params.stepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tIntro\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{steps\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.map(({ stepNumber, title, problem, solution }) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"step\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col gap-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"font-semibold leading-tight\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{stepNumber.toString().padStart(2, '0')}.{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"ml-3 mt-0.5 flex gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'problem',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProblem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'solution',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSolution\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"finished\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber, 'finished')}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-base font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background': isActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t📝 Elaboration\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</NavigationExerciseListItem>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t<div className=\"mt-6\">\n\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\tto=\"/finished\"\n\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap text-lg font-bold outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'bg-black text-white after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"]':\n\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t📝 Workshop Feedback\n\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"flex-grow\" />\n\t\t\t\t\t{isOnline ? null : (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'You are offline'}>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex h-14 animate-pulse items-center justify-start p-4',\n\t\t\t\t\t\t\t\t\tisMenuOpened ? 'w-full border-t' : 'border-l',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\tname=\"WifiNoConnection\"\n\t\t\t\t\t\t\t\t\tclassName=\"text-foreground-destructive\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{isMenuOpened ? 'You are offline' : null}\n\t\t\t\t\t\t\t\t</Icon>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t)}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex items-center justify-start p-4',\n\t\t\t\t\t\t\tisMenuOpened && users.length > 4 ? 'min-h-14' : 'h-14',\n\t\t\t\t\t\t\tisMenuOpened ? 'w-full border-t' : 'border-l',\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<FacePile isMenuOpened={isMenuOpened} />\n\t\t\t\t\t</div>\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user ? (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'Your account'}>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex h-14 flex-shrink-0 items-center justify-start space-x-3 px-4 py-4 text-center no-underline hover:underline',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t'border-l': !isMenuOpened,\n\t\t\t\t\t\t\t\t\t\t'w-full border-t': isMenuOpened,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tto=\"/account\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{user.imageUrlSmall ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\talt={user.name ?? user.email}\n\t\t\t\t\t\t\t\t\t\tsrc={user.imageUrlSmall}\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-full rounded-full\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<Icon name=\"User\" className=\"flex-shrink-0\" size=\"lg\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tYour Account\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Your account</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user && nextExerciseRoute ? (\n\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\tcontent={isMenuOpened ? null : 'Continue to next lesson'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={nextExerciseRoute}\n\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'flex h-14 w-full items-center space-x-3 border-l px-4 py-4 pl-[18px] no-underline hover:underline',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstate={{ from: 'continue next lesson button' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"FastForward\" className=\"flex-shrink-0\" size=\"md\" />\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tContinue to next lesson\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Continue to next lesson</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex h-14 w-14 items-center justify-center self-start p-4 sm:mb-4 sm:w-full',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t'w-full border-t': isMenuOpened,\n\t\t\t\t\t\t\t\t'border-l': !isMenuOpened,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ThemeSwitch />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</nav>\n\t)\n}\n\nconst OPENED_MENU_WIDTH = 400\n\nfunction Navigation({\n\tisMenuOpened,\n\tonMenuOpenChange: setMenuOpened,\n}: {\n\tisMenuOpened: boolean\n\tonMenuOpenChange: (change: boolean) => void\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tconst user = useOptionalUser()\n\tconst nextExerciseRoute = useNextExerciseRoute()\n\tconst params = useParams()\n\tconst isOnline = useIsOnline()\n\tconst { users } = usePresence()\n\n\tconst exercise = data.exercises.find(\n\t\t(e) => e.exerciseNumber === Number(params.exerciseNumber),\n\t)\n\tconst app =\n\t\tparams.type === 'solution'\n\t\t\t? exercise?.solutions.find(\n\t\t\t\t\t(s) => s.stepNumber === Number(params.stepNumber),\n\t\t\t\t)\n\t\t\t: params.type === 'problem'\n\t\t\t\t? exercise?.problems.find(\n\t\t\t\t\t\t(p) => p.stepNumber === Number(params.stepNumber),\n\t\t\t\t\t)\n\t\t\t\t: null\n\n\t// container\n\tconst menuControls = useAnimationControls()\n\tconst menuVariants = {\n\t\tclose: { width: 56 },\n\t\topen: { width: OPENED_MENU_WIDTH },\n\t}\n\n\t// items\n\tconst listVariants = {\n\t\tvisible: {\n\t\t\topacity: 1,\n\t\t\ttransition: {\n\t\t\t\tduration: 0.05,\n\t\t\t\twhen: 'beforeChildren',\n\t\t\t\tstaggerChildren: 0.03,\n\t\t\t},\n\t\t},\n\t\thidden: {\n\t\t\topacity: 0,\n\t\t},\n\t}\n\n\treturn (\n\t\t<nav className=\"hidden border-r sm:flex\">\n\t\t\t<motion.div\n\t\t\t\tinitial={isMenuOpened ? 'open' : 'close'}\n\t\t\t\tvariants={menuVariants}\n\t\t\t\tanimate={menuControls}\n\t\t\t>\n\t\t\t\t<div className=\"flex h-full flex-col items-center justify-between\">\n\t\t\t\t\t<NavToggle\n\t\t\t\t\t\ttitle={data.workshopTitle}\n\t\t\t\t\t\tmenuControls={menuControls}\n\t\t\t\t\t\tisMenuOpened={isMenuOpened}\n\t\t\t\t\t\tsetMenuOpened={setMenuOpened}\n\t\t\t\t\t/>\n\t\t\t\t\t{isMenuOpened && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tstyle={{ width: OPENED_MENU_WIDTH }}\n\t\t\t\t\t\t\tclassName=\"flex flex-grow flex-col justify-between overflow-y-auto p-6 scrollbar-thin scrollbar-thumb-scrollbar\"\n\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\tclassName=\"flex flex-col\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\tto=\"/\"\n\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-2xl font-bold outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tHome\n\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{data.exercises.map(({ exerciseNumber, title, steps }) => {\n\t\t\t\t\t\t\t\t\tconst isActive =\n\t\t\t\t\t\t\t\t\t\tNumber(params.exerciseNumber) === exerciseNumber\n\t\t\t\t\t\t\t\t\tconst showPlayground =\n\t\t\t\t\t\t\t\t\t\t!isActive &&\n\t\t\t\t\t\t\t\t\t\tdata.playground.exerciseNumber === exerciseNumber\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<NavigationExerciseListItem\n\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-1 text-2xl font-bold\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ 'bg-foreground text-background': isActive },\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t{showPlayground ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.exerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.stepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.type,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t🛝\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t{isActive ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<motion.ul\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariants={listVariants}\n\t\t\t\t\t\t\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"ml-4 mt-2 flex flex-col\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"instructions\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-xl font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t!params.stepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tIntro\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{steps\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.map(({ stepNumber, title, problem, solution }) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"step\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber={stepNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col gap-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"font-semibold leading-tight\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{stepNumber.toString().padStart(2, '0')}.{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"ml-3 mt-0.5 flex gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'problem',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tProblem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{problem.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstepNumber,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'solution',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tSolution\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{solution.name ===\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.playground.appName\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ' 🛝'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<NavigationExerciseStepListItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"finished\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texerciseNumber={exerciseNumber}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tto={getExercisePath(exerciseNumber, 'finished')}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap px-2 py-0.5 pr-3 text-base font-medium outline-none after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"] hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'bg-foreground text-background': isActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t📝 Elaboration\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</NavigationExerciseStepListItem>\n\t\t\t\t\t\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</NavigationExerciseListItem>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</motion.ul>\n\t\t\t\t\t\t\t<div className=\"mt-6\">\n\t\t\t\t\t\t\t\t<NavLink\n\t\t\t\t\t\t\t\t\tto=\"/finished\"\n\t\t\t\t\t\t\t\t\tclassName={({ isActive }) =>\n\t\t\t\t\t\t\t\t\t\tclsx(\n\t\t\t\t\t\t\t\t\t\t\t'relative whitespace-nowrap text-lg font-bold outline-none hover:underline focus:underline',\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t'bg-black text-white after:absolute after:-bottom-2.5 after:-right-2.5 after:h-5 after:w-5 after:rotate-45 after:scale-75 after:bg-background after:content-[\"\"]':\n\t\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t📝 Workshop Feedback\n\t\t\t\t\t\t\t\t</NavLink>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t\t{!isMenuOpened && (\n\t\t\t\t\t\t<div className=\"flex flex-grow flex-col justify-center\">\n\t\t\t\t\t\t\t<div className=\"orientation-sideways w-full font-mono text-sm font-medium uppercase leading-none\">\n\t\t\t\t\t\t\t\t{exercise?.title ? (\n\t\t\t\t\t\t\t\t\t<Link to={getExercisePath(Number(params.exerciseNumber))}>\n\t\t\t\t\t\t\t\t\t\t{exercise.title}\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t{exercise?.title && app?.title ? ' — ' : null}\n\t\t\t\t\t\t\t\t{app?.title ? (\n\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\tto={getExerciseStepPath(\n\t\t\t\t\t\t\t\t\t\t\tNumber(params.exerciseNumber),\n\t\t\t\t\t\t\t\t\t\t\tapp.stepNumber,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{app.title}\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{isOnline ? null : (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'You are offline'}>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'flex w-full animate-pulse items-center border-t p-4',\n\t\t\t\t\t\t\t\t\tisMenuOpened ? 'justify-start' : 'justify-center',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\tname=\"WifiNoConnection\"\n\t\t\t\t\t\t\t\t\tclassName=\"text-foreground-destructive\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t\t<span className=\"whitespace-nowrap\">You are offline</span>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</Icon>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t)}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'flex w-full items-center justify-start border-t p-4 transition-[height]',\n\t\t\t\t\t\t\tisMenuOpened && users.length > 4 ? 'h-28' : 'h-14',\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={isMenuOpened ? { width: OPENED_MENU_WIDTH } : {}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<FacePile isMenuOpened={isMenuOpened} />\n\t\t\t\t\t</div>\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user ? (\n\t\t\t\t\t\t<SimpleTooltip content={isMenuOpened ? null : 'Your account'}>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tclassName=\"flex h-14 w-full flex-shrink-0 items-center justify-start space-x-3 border-t px-4 py-4 text-center no-underline hover:underline\"\n\t\t\t\t\t\t\t\tto=\"/account\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{user.imageUrlSmall ? (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\talt={user.name ?? user.email}\n\t\t\t\t\t\t\t\t\t\tsrc={user.imageUrlSmall}\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-full rounded-full\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<Icon name=\"User\" className=\"flex-shrink-0\" size=\"lg\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tYour Account\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Your account</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{ENV.EPICSHOP_DEPLOYED ? null : user && nextExerciseRoute ? (\n\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\tcontent={isMenuOpened ? null : 'Continue to next lesson'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={nextExerciseRoute}\n\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'flex h-14 w-full items-center space-x-3 border-t px-4 py-4 pl-[18px] no-underline hover:underline',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstate={{ from: 'continue next lesson button' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"FastForward\" className=\"flex-shrink-0\" size=\"md\" />\n\t\t\t\t\t\t\t\t{isMenuOpened ? (\n\t\t\t\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1 }}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tContinue to next lesson\n\t\t\t\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Continue to next lesson</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<div className=\"mb-4 w-full self-start border-t pl-3 pt-[15px]\">\n\t\t\t\t\t\t<ThemeSwitch />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</motion.div>\n\t\t</nav>\n\t)\n}\n\nfunction NavToggle({\n\ttitle,\n\tisMenuOpened,\n\tsetMenuOpened,\n\tmenuControls,\n}: {\n\ttitle: string\n\tisMenuOpened: boolean\n\tsetMenuOpened: (value: boolean) => void\n\tmenuControls?: AnimationControls\n}) {\n\tconst initialOpenRef = React.useRef(isMenuOpened)\n\tconst menuButtonRef = React.useRef<HTMLButtonElement>(null)\n\tconst path01Variants = {\n\t\topen: { d: 'M3.06061 2.99999L21.0606 21' },\n\t\tclosed: { d: 'M0 9.5L24 9.5' },\n\t}\n\tconst path02Variants = {\n\t\topen: { d: 'M3.00006 21.0607L21 3.06064' },\n\t\tmoving: { d: 'M0 14.5L24 14.5' },\n\t\tclosed: { d: 'M0 14.5L15 14.5' },\n\t}\n\tconst path01Controls = useAnimationControls()\n\tconst path02Controls = useAnimationControls()\n\n\tasync function toggleMenu() {\n\t\tvoid menuControls?.start(isMenuOpened ? 'close' : 'open')\n\t\tsetMenuOpened(!isMenuOpened)\n\t\tif (isMenuOpened) {\n\t\t\tvoid path01Controls.start(path01Variants.closed)\n\t\t\tawait path02Controls.start(path02Variants.moving)\n\t\t\tvoid path02Controls.start(path02Variants.closed)\n\t\t} else {\n\t\t\tawait path02Controls.start(path02Variants.moving)\n\t\t\tvoid path01Controls.start(path01Variants.open)\n\t\t\tvoid path02Controls.start(path02Variants.open)\n\t\t}\n\t}\n\n\tReact.useEffect(() => {\n\t\tif (!isMenuOpened) return\n\n\t\tfunction handleKeyUp(event: KeyboardEvent) {\n\t\t\tif (event.key === 'Escape') {\n\t\t\t\tmenuButtonRef.current?.click()\n\t\t\t}\n\t\t}\n\t\tdocument.addEventListener('keyup', handleKeyUp)\n\t\treturn () => document.removeEventListener('keyup', handleKeyUp)\n\t}, [isMenuOpened])\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'relative inline-flex h-14 flex-shrink-0 items-center justify-between overflow-hidden border-r sm:w-full sm:border-b sm:border-r-0',\n\t\t\t\t{\n\t\t\t\t\t'w-full': isMenuOpened,\n\t\t\t\t},\n\t\t\t)}\n\t\t>\n\t\t\t<button\n\t\t\t\tref={menuButtonRef}\n\t\t\t\tclassName=\"flex h-14 w-14 items-center justify-center\"\n\t\t\t\taria-label=\"Open Navigation menu\"\n\t\t\t\tonClick={toggleMenu}\n\t\t\t>\n\t\t\t\t<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<motion.path\n\t\t\t\t\t\t{...path01Variants[initialOpenRef.current ? 'open' : 'closed']}\n\t\t\t\t\t\tanimate={path01Controls}\n\t\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t/>\n\t\t\t\t\t<motion.path\n\t\t\t\t\t\t{...path02Variants[initialOpenRef.current ? 'open' : 'closed']}\n\t\t\t\t\t\tanimate={path02Controls}\n\t\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t</button>\n\t\t\t{isMenuOpened && (\n\t\t\t\t<motion.p\n\t\t\t\t\ttransition={{ delay: 0.2 }}\n\t\t\t\t\tinitial={{ opacity: 0, y: 5 }}\n\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\n\t\t\t\t\tclassName=\"absolute right-5 whitespace-nowrap font-mono text-sm uppercase\"\n\t\t\t\t>\n\t\t\t\t\t<Link to=\"/\">{title}</Link>\n\t\t\t\t</motion.p>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n"],"names":["stopAnimation","visualElement","value","setVariants","variantLabels","key","variant","setTarget","child","setValues","definition","animationControls","subscribers","controls","transitionOverride","animations","animateVisualElement","useAnimationControls","useConstant","useIsomorphicLayoutEffect","makeMediaQueryStore","mediaQuery","serverSnapshot","getSnapshot","subscribe","callback","mediaQueryList","useSyncExternalStore","DIALOG_NAME","createDialogContext","createDialogScope","createContextScope","DialogProvider","useDialogContext","Dialog","props","__scopeDialog","children","openProp","defaultOpen","onOpenChange","modal","triggerRef","React.useRef","contentRef","open","setOpen","useControllableState","jsx","useId","React.useCallback","prevOpen","TRIGGER_NAME","DialogTrigger","React.forwardRef","forwardedRef","triggerProps","context","composedTriggerRef","useComposedRefs","Primitive","getState","composeEventHandlers","PORTAL_NAME","PortalProvider","usePortalContext","DialogPortal","forceMount","container","React.Children","Presence","PortalPrimitive","OVERLAY_NAME","DialogOverlay","portalContext","overlayProps","DialogOverlayImpl","Slot","createSlot","RemoveScroll","CONTENT_NAME","DialogContent","contentProps","DialogContentModal","DialogContentNonModal","composedRefs","React.useEffect","content","hideOthers","DialogContentImpl","event","_a","originalEvent","ctrlLeftClick","hasInteractedOutsideRef","hasPointerDownOutsideRef","_b","target","trapFocus","onOpenAutoFocus","onCloseAutoFocus","useFocusGuards","jsxs","Fragment","FocusScope","DismissableLayer","TitleWarning","DescriptionWarning","TITLE_NAME","DialogTitle","titleProps","DESCRIPTION_NAME","DialogDescription","descriptionProps","CLOSE_NAME","DialogClose","closeProps","TITLE_WARNING_NAME","WarningProvider","useWarningContext","createContext","titleId","titleWarningContext","MESSAGE","DESCRIPTION_WARNING_NAME","descriptionId","describedById","Root","Trigger","Portal","Overlay","Content","Title","Description","Close","DialogPrimitive.Root","DialogPrimitive.Trigger","DialogPrimitive.Portal","className","ref","DialogPrimitive.Overlay","cn","DialogPrimitive.Content","DialogPrimitive.Close","Icon","DialogHeader","DialogPrimitive.Title","DialogPrimitive.Description","opacities","shadows","getScoreClassNames","score","opacityNumber","Math","round","length","shadowNumber","FacePile","isMenuOpened","loggedInUser","useOptionalUser","users","usePresence","product","displayNameShort","useWorkshopConfig","limit","numberOverLimit","shouldShowNumberOverLimit","tiffany","Link","rel","to","alt","src","overLimitLabel","TooltipProvider","slice","map","user","scoreClassNames","locationLabel","getLocationLabel","location","imageUrl","imageUrlSmall","avatarUrl","hasAccess","local","origin","includes","doingLabel","Tooltip","TooltipTrigger","asChild","tabIndex","name","TooltipContent","id","line1","line2","useIsWide","App","data","useLoaderData","isWide","isHydrated","useHydrated","setMenuOpenedState","React","useRevalidationWS","watchPaths","setMenuOpened","document","cookie","toString","NoUserBanner","MobileNavigation","onMenuOpenChange","Navigation","Outlet","exercise","exercisePortion","exerciseNumber","stepNumber","filter","Boolean","s","padStart","join","type","workshopTitle","host","displayName","userHasAccess","useUserHasAccess","details","ENV","EPICSHOP_DEPLOYED","EPICSHOP_GITHUB_REPO","href","Logo","size","style","itemVariants","hidden","opacity","x","visible","NavigationExerciseListItem","progressClassName","useExerciseProgressClassName","motion","li","variants","NavigationExerciseStepListItem","progressItemSearch","useProgressItemClassName","nextExerciseRoute","useNextExerciseRoute","params","useParams","isOnline","useIsOnline","listVariants","transition","duration","when","staggerChildren","NavToggle","title","div","initial","animate","ul","NavLink","prefetch","isActive","clsx","exercises","steps","Number","showPlayground","playground","getExercisePath","getExerciseStepPath","problem","solution","appName","SimpleTooltip","email","state","from","ThemeSwitch","OPENED_MENU_WIDTH","find","e","app","solutions","problems","p","menuControls","menuVariants","close","width","initialOpenRef","menuButtonRef","path01Variants","d","closed","path02Variants","moving","path01Controls","path02Controls","toggleMenu","start","handleKeyUp","current","click","addEventListener","removeEventListener","onClick","height","viewBox","path","stroke","strokeWidth","delay","y"],"mappings":"g2BAIA,SAASA,GAAcC,EAAe,CAClCA,EAAc,OAAO,QAASC,GAAUA,EAAM,MAAM,CACxD,CACA,SAASC,EAAYF,EAAeG,EAAe,CACxB,CAAC,GAAGA,CAAa,EAAE,QAAS,EACpC,QAASC,GAAQ,CAC5B,MAAMC,EAAUL,EAAc,WAAWI,CAAG,EAC5CC,GAAWC,GAAUN,EAAeK,CAAO,EACvCL,EAAc,iBACdA,EAAc,gBAAgB,QAASO,GAAU,CAC7CL,EAAYK,EAAOJ,CAAa,CAChD,CAAa,CAEb,CAAK,CACL,CACA,SAASK,GAAUR,EAAeS,EAAY,CAC1C,GAAI,MAAM,QAAQA,CAAU,EACxB,OAAOP,EAAYF,EAAeS,CAAU,EAE3C,GAAI,OAAOA,GAAe,SAC3B,OAAOP,EAAYF,EAAe,CAACS,CAAU,CAAC,EAG9CH,GAAUN,EAAeS,CAAU,CAE3C,CAIA,SAASC,IAAoB,CAQzB,MAAMC,EAAc,IAAI,IAClBC,EAAW,CACb,UAAUZ,EAAe,CACrB,OAAAW,EAAY,IAAIX,CAAa,EACtB,IAAM,KAAKW,EAAY,OAAOX,CAAa,CACrD,EACD,MAAMS,EAAYI,EAAoB,CAElC,MAAMC,EAAa,CAAE,EACrB,OAAAH,EAAY,QAASX,GAAkB,CACnCc,EAAW,KAAKC,GAAqBf,EAAeS,EAAY,CAC5D,mBAAAI,CACpB,CAAiB,CAAC,CAClB,CAAa,EACM,QAAQ,IAAIC,CAAU,CAChC,EACD,IAAIL,EAAY,CAEZ,OAAOE,EAAY,QAASX,GAAkB,CAC1CQ,GAAUR,EAAeS,CAAU,CACnD,CAAa,CACJ,EACD,MAAO,CACHE,EAAY,QAASX,GAAkB,CACnCD,GAAcC,CAAa,CAC3C,CAAa,CACJ,EACD,OAAQ,CAEJ,MAAO,IAAM,CAETY,EAAS,KAAM,CAClB,CACJ,CACJ,EACD,OAAOA,CACX,CC5CA,SAASI,GAAuB,CAC5B,MAAMJ,EAAWK,GAAYP,EAAiB,EAC9C,OAAAQ,GAA0BN,EAAS,MAAO,EAAE,EACrCA,CACX,CCnCgB,SAAAO,GACfC,EACAC,EACC,CACD,SAASC,GAAc,CACf,OAAA,OAAO,WAAWF,CAAU,EAAE,OAAA,CAGtC,SAASG,EAAUC,EAAsB,CAClC,MAAAC,EAAiB,OAAO,WAAWL,CAAU,EACpC,OAAAK,EAAA,iBAAiB,SAAUD,CAAQ,EAC3C,IAAM,CACGC,EAAA,oBAAoB,SAAUD,CAAQ,CACtD,CAAA,CAGD,OAAO,UAAyB,CAC/B,OAAOE,uBAAqBH,EAAWD,EAAa,IAAMD,CAAc,CACzE,CACD,CCFA,IAAIM,EAAc,SACd,CAACC,GAAqBC,EAAiB,EAAIC,GAAmBH,CAAW,EACzE,CAACI,GAAgBC,CAAgB,EAAIJ,GAAoBD,CAAW,EACpEM,GAAUC,GAAU,CACtB,KAAM,CACJ,cAAAC,EACA,SAAAC,EACA,KAAMC,EACN,YAAAC,EACA,aAAAC,EACA,MAAAC,EAAQ,EACZ,EAAMN,EACEO,EAAaC,EAAY,OAAC,IAAI,EAC9BC,EAAaD,EAAY,OAAC,IAAI,EAC9B,CAACE,EAAMC,CAAO,EAAIC,GAAqB,CAC3C,KAAMT,EACN,YAAaC,GAAe,GAC5B,SAAUC,EACV,OAAQZ,CACZ,CAAG,EACD,OAAuBoB,EAAG,IACxBhB,GACA,CACE,MAAOI,EACP,WAAAM,EACA,WAAAE,EACA,UAAWK,EAAO,EAClB,QAASA,EAAO,EAChB,cAAeA,EAAO,EACtB,KAAAJ,EACA,aAAcC,EACd,aAAcI,EAAAA,YAAkB,IAAMJ,EAASK,GAAa,CAACA,CAAQ,EAAG,CAACL,CAAO,CAAC,EACjF,MAAAL,EACA,SAAAJ,CACN,CACG,CACH,EACAH,GAAO,YAAcN,EACrB,IAAIwB,GAAe,gBACfC,GAAgBC,EAAgB,WAClC,CAACnB,EAAOoB,IAAiB,CACvB,KAAM,CAAE,cAAAnB,EAAe,GAAGoB,CAAY,EAAKrB,EACrCsB,EAAUxB,EAAiBmB,GAAchB,CAAa,EACtDsB,EAAqBC,EAAgBJ,EAAcE,EAAQ,UAAU,EAC3E,OAAuBT,EAAG,IACxBY,EAAU,OACV,CACE,KAAM,SACN,gBAAiB,SACjB,gBAAiBH,EAAQ,KACzB,gBAAiBA,EAAQ,UACzB,aAAcI,EAASJ,EAAQ,IAAI,EACnC,GAAGD,EACH,IAAKE,EACL,QAASI,EAAqB3B,EAAM,QAASsB,EAAQ,YAAY,CACzE,CACK,CACL,CACA,EACAJ,GAAc,YAAcD,GAC5B,IAAIW,EAAc,eACd,CAACC,GAAgBC,EAAgB,EAAIpC,GAAoBkC,EAAa,CACxE,WAAY,MACd,CAAC,EACGG,GAAgB/B,GAAU,CAC5B,KAAM,CAAE,cAAAC,EAAe,WAAA+B,EAAY,SAAA9B,EAAU,UAAA+B,CAAW,EAAGjC,EACrDsB,EAAUxB,EAAiB8B,EAAa3B,CAAa,EAC3D,OAAuBY,EAAG,IAACgB,GAAgB,CAAE,MAAO5B,EAAe,WAAA+B,EAAY,SAAUE,EAAAA,SAAe,IAAIhC,EAAW7B,GAA0BwC,EAAG,IAACsB,EAAU,CAAE,QAASH,GAAcV,EAAQ,KAAM,SAA0BT,EAAG,IAACuB,GAAiB,CAAE,QAAS,GAAM,UAAAH,EAAW,SAAU5D,CAAO,CAAA,CAAG,CAAA,CAAC,CAAC,CAAE,CAC3S,EACA0D,GAAa,YAAcH,EAC3B,IAAIS,EAAe,gBACfC,GAAgBnB,EAAgB,WAClC,CAACnB,EAAOoB,IAAiB,CACvB,MAAMmB,EAAgBT,GAAiBO,EAAcrC,EAAM,aAAa,EAClE,CAAE,WAAAgC,EAAaO,EAAc,WAAY,GAAGC,CAAc,EAAGxC,EAC7DsB,EAAUxB,EAAiBuC,EAAcrC,EAAM,aAAa,EAClE,OAAOsB,EAAQ,MAAwBT,MAAIsB,EAAU,CAAE,QAASH,GAAcV,EAAQ,KAAM,SAA0BT,MAAI4B,GAAmB,CAAE,GAAGD,EAAc,IAAKpB,CAAc,CAAA,CAAG,CAAA,EAAI,IAC9L,CACA,EACAkB,GAAc,YAAcD,EAC5B,IAAIK,GAAOC,GAAW,4BAA4B,EAC9CF,GAAoBtB,EAAgB,WACtC,CAACnB,EAAOoB,IAAiB,CACvB,KAAM,CAAE,cAAAnB,EAAe,GAAGuC,CAAY,EAAKxC,EACrCsB,EAAUxB,EAAiBuC,EAAcpC,CAAa,EAC5D,OAGkBY,EAAAA,IAAI+B,GAAc,CAAE,GAAIF,GAAM,eAAgB,GAAM,OAAQ,CAACpB,EAAQ,UAAU,EAAG,SAA0BT,EAAG,IAC7HY,EAAU,IACV,CACE,aAAcC,EAASJ,EAAQ,IAAI,EACnC,GAAGkB,EACH,IAAKpB,EACL,MAAO,CAAE,cAAe,OAAQ,GAAGoB,EAAa,KAAK,CAC/D,CACA,CAAS,CAAA,CAET,CACA,EACIK,EAAe,gBACfC,GAAgB3B,EAAgB,WAClC,CAACnB,EAAOoB,IAAiB,CACvB,MAAMmB,EAAgBT,GAAiBe,EAAc7C,EAAM,aAAa,EAClE,CAAE,WAAAgC,EAAaO,EAAc,WAAY,GAAGQ,CAAc,EAAG/C,EAC7DsB,EAAUxB,EAAiB+C,EAAc7C,EAAM,aAAa,EAClE,OAAuBa,MAAIsB,EAAU,CAAE,QAASH,GAAcV,EAAQ,KAAM,SAAUA,EAAQ,MAAwBT,EAAG,IAACmC,GAAoB,CAAE,GAAGD,EAAc,IAAK3B,CAAc,CAAA,EAAoBP,EAAAA,IAAIoC,GAAuB,CAAE,GAAGF,EAAc,IAAK3B,CAAY,CAAE,CAAC,CAAE,CAChR,CACA,EACA0B,GAAc,YAAcD,EAC5B,IAAIG,GAAqB7B,EAAgB,WACvC,CAACnB,EAAOoB,IAAiB,CACvB,MAAME,EAAUxB,EAAiB+C,EAAc7C,EAAM,aAAa,EAC5DS,EAAaD,EAAY,OAAC,IAAI,EAC9B0C,EAAe1B,EAAgBJ,EAAcE,EAAQ,WAAYb,CAAU,EACjF0C,OAAAA,EAAAA,UAAgB,IAAM,CACpB,MAAMC,EAAU3C,EAAW,QAC3B,GAAI2C,EAAS,OAAOC,GAAWD,CAAO,CACvC,EAAE,EAAE,EACkBvC,EAAG,IACxByC,GACA,CACE,GAAGtD,EACH,IAAKkD,EACL,UAAW5B,EAAQ,KACnB,4BAA6B,GAC7B,iBAAkBK,EAAqB3B,EAAM,iBAAmBuD,GAAU,OACxEA,EAAM,eAAgB,GACtBC,EAAAlC,EAAQ,WAAW,UAAnB,MAAAkC,EAA4B,OACtC,CAAS,EACD,qBAAsB7B,EAAqB3B,EAAM,qBAAuBuD,GAAU,CAChF,MAAME,EAAgBF,EAAM,OAAO,cAC7BG,EAAgBD,EAAc,SAAW,GAAKA,EAAc,UAAY,IACzDA,EAAc,SAAW,GAAKC,IACjCH,EAAM,eAAgB,CAClD,CAAS,EACD,eAAgB5B,EACd3B,EAAM,eACLuD,GAAUA,EAAM,eAAc,CACzC,CACA,CACK,CACL,CACA,EACIN,GAAwB9B,EAAgB,WAC1C,CAACnB,EAAOoB,IAAiB,CACvB,MAAME,EAAUxB,EAAiB+C,EAAc7C,EAAM,aAAa,EAC5D2D,EAA0BnD,EAAY,OAAC,EAAK,EAC5CoD,EAA2BpD,EAAY,OAAC,EAAK,EACnD,OAAuBK,EAAG,IACxByC,GACA,CACE,GAAGtD,EACH,IAAKoB,EACL,UAAW,GACX,4BAA6B,GAC7B,iBAAmBmC,GAAU,UAC3BC,EAAAxD,EAAM,mBAAN,MAAAwD,EAAA,KAAAxD,EAAyBuD,GACpBA,EAAM,mBACJI,EAAwB,UAASE,EAAAvC,EAAQ,WAAW,UAAnB,MAAAuC,EAA4B,QAClEN,EAAM,eAAgB,GAExBI,EAAwB,QAAU,GAClCC,EAAyB,QAAU,EACpC,EACD,kBAAoBL,GAAU,UAC5BC,EAAAxD,EAAM,oBAAN,MAAAwD,EAAA,KAAAxD,EAA0BuD,GACrBA,EAAM,mBACTI,EAAwB,QAAU,GAC9BJ,EAAM,OAAO,cAAc,OAAS,gBACtCK,EAAyB,QAAU,KAGvC,MAAME,EAASP,EAAM,SACGM,EAAAvC,EAAQ,WAAW,UAAnB,YAAAuC,EAA4B,SAASC,KACxCP,EAAM,eAAgB,EACvCA,EAAM,OAAO,cAAc,OAAS,WAAaK,EAAyB,SAC5EL,EAAM,eAAgB,CAElC,CACA,CACK,CACL,CACA,EACID,GAAoBnC,EAAgB,WACtC,CAACnB,EAAOoB,IAAiB,CACvB,KAAM,CAAE,cAAAnB,EAAe,UAAA8D,EAAW,gBAAAC,EAAiB,iBAAAC,EAAkB,GAAGlB,CAAY,EAAK/C,EACnFsB,EAAUxB,EAAiB+C,EAAc5C,CAAa,EACtDQ,EAAaD,EAAY,OAAC,IAAI,EAC9B0C,EAAe1B,EAAgBJ,EAAcX,CAAU,EAC7D,OAAAyD,GAAgB,EACOC,EAAI,KAACC,WAAU,CAAE,SAAU,CAChCvD,EAAG,IACjBwD,GACA,CACE,QAAS,GACT,KAAM,GACN,QAASN,EACT,iBAAkBC,EAClB,mBAAoBC,EACpB,SAA0BpD,EAAG,IAC3ByD,GACA,CACE,KAAM,SACN,GAAIhD,EAAQ,UACZ,mBAAoBA,EAAQ,cAC5B,kBAAmBA,EAAQ,QAC3B,aAAcI,EAASJ,EAAQ,IAAI,EACnC,GAAGyB,EACH,IAAKG,EACL,UAAW,IAAM5B,EAAQ,aAAa,EAAK,CACzD,CACA,CACA,CACO,EACe6C,OAAKC,EAAAA,SAAU,CAAE,SAAU,CACzBvD,EAAAA,IAAI0D,GAAc,CAAE,QAASjD,EAAQ,OAAO,CAAE,EAC9CT,EAAG,IAAC2D,GAAoB,CAAE,WAAA/D,EAAY,cAAea,EAAQ,aAAe,CAAA,CACpG,CAAS,CAAA,CACT,EAAO,CACP,CACA,EACImD,EAAa,cACbC,GAAcvD,EAAgB,WAChC,CAACnB,EAAOoB,IAAiB,CACvB,KAAM,CAAE,cAAAnB,EAAe,GAAG0E,CAAU,EAAK3E,EACnCsB,EAAUxB,EAAiB2E,EAAYxE,CAAa,EAC1D,OAAuBY,MAAIY,EAAU,GAAI,CAAE,GAAIH,EAAQ,QAAS,GAAGqD,EAAY,IAAKvD,CAAY,CAAE,CACtG,CACA,EACAsD,GAAY,YAAcD,EAC1B,IAAIG,GAAmB,oBACnBC,GAAoB1D,EAAgB,WACtC,CAACnB,EAAOoB,IAAiB,CACvB,KAAM,CAAE,cAAAnB,EAAe,GAAG6E,CAAgB,EAAK9E,EACzCsB,EAAUxB,EAAiB8E,GAAkB3E,CAAa,EAChE,OAAuBY,MAAIY,EAAU,EAAG,CAAE,GAAIH,EAAQ,cAAe,GAAGwD,EAAkB,IAAK1D,CAAY,CAAE,CACjH,CACA,EACAyD,GAAkB,YAAcD,GAChC,IAAIG,GAAa,cACbC,GAAc7D,EAAgB,WAChC,CAACnB,EAAOoB,IAAiB,CACvB,KAAM,CAAE,cAAAnB,EAAe,GAAGgF,CAAU,EAAKjF,EACnCsB,EAAUxB,EAAiBiF,GAAY9E,CAAa,EAC1D,OAAuBY,EAAG,IACxBY,EAAU,OACV,CACE,KAAM,SACN,GAAGwD,EACH,IAAK7D,EACL,QAASO,EAAqB3B,EAAM,QAAS,IAAMsB,EAAQ,aAAa,EAAK,CAAC,CACtF,CACK,CACL,CACA,EACA0D,GAAY,YAAcD,GAC1B,SAASrD,EAAShB,EAAM,CACtB,OAAOA,EAAO,OAAS,QACzB,CACA,IAAIwE,GAAqB,qBACrB,CAACC,GAAiBC,EAAiB,EAAIC,GAAcH,GAAoB,CAC3E,YAAarC,EACb,UAAW4B,EACX,SAAU,QACZ,CAAC,EACGF,GAAe,CAAC,CAAE,QAAAe,KAAc,CAClC,MAAMC,EAAsBH,GAAkBF,EAAkB,EAC1DM,EAAU,KAAKD,EAAoB,WAAW,mBAAmBA,EAAoB,SAAS;AAAA;AAAA,4BAE1EA,EAAoB,SAAS;AAAA;AAAA,4EAEmBA,EAAoB,QAAQ,GACtGpC,OAAAA,EAAAA,UAAgB,IAAM,CAChBmC,IACe,SAAS,eAAeA,CAAO,GACjC,QAAQ,MAAME,CAAO,EAE1C,EAAK,CAACA,EAASF,CAAO,CAAC,EACd,IACT,EACIG,GAA2B,2BAC3BjB,GAAqB,CAAC,CAAE,WAAA/D,EAAY,cAAAiF,KAAoB,CAE1D,MAAMF,EAAU,6EADkBJ,GAAkBK,EAAwB,EAC2C,WAAW,KAClItC,OAAAA,EAAAA,UAAgB,IAAM,OACpB,MAAMwC,GAAgBnC,EAAA/C,EAAW,UAAX,YAAA+C,EAAoB,aAAa,oBACnDkC,GAAiBC,IACI,SAAS,eAAeD,CAAa,GACvC,QAAQ,KAAKF,CAAO,EAE5C,EAAE,CAACA,EAAS/E,EAAYiF,CAAa,CAAC,EAChC,IACT,EACIE,GAAO7F,GACP8F,GAAU3E,GACV4E,GAAS/D,GACTgE,GAAUzD,GACV0D,GAAUlD,GACVmD,GAAQvB,GACRwB,GAAcrB,GACdsB,GAAQnB,GC3TZ,MAAMjF,GAASqG,GAETlF,GAAgBmF,GAEhBtE,GAAeuE,GAIrB,SAAShE,GAAc,CACtB,UAAAiE,EACA,IAAAC,EACA,GAAGxG,CACJ,EAAyD,CAEvD,OAAAa,EAAA,IAAC4F,GAAA,CACA,IAAAD,EACA,UAAWE,EACV,+KACAH,CACD,EACC,GAAGvG,CAAA,CACL,CAEF,CACAsC,GAAc,YAAcmE,GAAwB,YAEpD,SAAS3D,GAAc,CACtB,UAAAyD,EACA,SAAArG,EACA,IAAAsG,EACA,GAAGxG,CACJ,EAAyD,CACxD,cACE+B,GACA,CAAA,SAAA,CAAAlB,EAAA,IAACyB,GAAc,EAAA,EACf6B,EAAA,KAACwC,GAAA,CACA,IAAAH,EACA,UAAWE,EACV,wgBACAH,CACD,EACC,GAAGvG,EAEH,SAAA,CAAAE,EACAiE,EAAAA,KAAAyC,GAAA,CAAsB,UAAU,gRAChC,SAAA,CAAC/F,EAAAA,IAAAgG,EAAA,CAAK,KAAK,OAAQ,CAAA,EAClBhG,EAAA,IAAA,OAAA,CAAK,UAAU,UAAU,SAAK,OAAA,CAAA,CAAA,CAChC,CAAA,CAAA,CAAA,CAAA,CACD,EACD,CAEF,CACAiC,GAAc,YAAc6D,GAAwB,YAEpD,SAASG,GAAa,CACrB,UAAAP,EACA,GAAGvG,CACJ,EAAyC,CAEvC,OAAAa,EAAA,IAAC,MAAA,CACA,UAAW6F,EACV,qDACAH,CACD,EACC,GAAGvG,CAAA,CACL,CAEF,CACA8G,GAAa,YAAc,eAkCDC,GAAsB,YAEhD,SAASlC,GAAkB,CAC1B,UAAA0B,EACA,IAAAC,EACA,GAAGxG,CACJ,EAA6D,CAE3D,OAAAa,EAAA,IAACmG,GAAA,CACA,IAAAR,EACA,UAAWE,EAAG,gCAAiCH,CAAS,EACvD,GAAGvG,CAAA,CACL,CAEF,CACA6E,GAAkB,YAAcmC,GAA4B,YCS5D,MAAMC,GAAY,CAAC,aAAc,aAAc,aAAc,aAAa,EACpEC,GAAU,CACf,qCACA,qCACA,qCACA,qCAAA,EAED,SAASC,GAAmBC,EAAe,CAC1C,MAAMC,EAAgBC,KAAKC,MAAMH,EAAQH,GAAUO,OAAS,CAAC,EACvDC,EAAeH,KAAKC,MAAMH,EAAQF,GAAQM,OAAS,CAAC,EACnD,OAAAd,EACN,+EACAO,GAAUI,CAAa,GAAK,aAC5BH,GAAQO,CAAY,GAAK,cACzBL,IAAU,EAAI,sDAAwD,IACvE,CACD,CAEA,SAASM,GAAS,CAAEC,aAAAA,CAAa,EAA8B,CAC9D,MAAMC,EAAeC,EAAgB,EAC/B,CAAEC,MAAAA,CAAM,EAAIC,EAAY,EACxB,CACLC,QAAS,CAAEC,iBAAAA,CAAiB,GACzBC,GAAkB,EAChBC,EAAQR,EAAe,GAAK,EAC5BS,EAAkBN,EAAMN,OAASW,EACjCE,EAA4BD,GAAmBT,EAAe,EAAI,GAEpE,GAAA,CAACG,EAAMN,OAAe,OAAA,KAE1B,MAAMc,EACLX,GAAgBG,EAAMN,SAAW,EAChC3G,EAAA,IAAC0H,EAAA,CACAzE,OAAO,SACP0E,IAAI,sBACJC,GAAG,8CAEHvI,SAAAW,EAAA,IAAC,MAAA,CACA6H,IAAI,gBACJnC,UAAWG,EACV,2CACAS,GAAmB,CAAC,CACrB,EACAwB,IAAI,kBACL,CAAA,CACD,CAAA,EACG,KACCC,EAAiB,GAAGR,CAAe,GACxCT,EAAe,SAAW,GAC3B,GAAGM,CAAgB,OAAOG,IAAoB,EAAI,GAAK,GAAG,eAC1D,OACEvH,EAAAA,IAAA,MAAA,CAAI0F,UAAU,oCACdrG,gBAAC2I,GACE,CAAA3I,SAAA,EAAAmI,EAA4BP,EAAMgB,MAAM,EAAGX,CAAK,EAAIL,GAAOiB,IAC5D,CAAC,CAAEC,KAAAA,EAAM5B,MAAAA,CAAM,IAAM,SACd,MAAA6B,EAAkB9B,GAAmBC,CAAK,EAC1C8B,EAAgBC,GAAiBH,EAAKI,QAAQ,EAC9CC,EAAWL,EAAKM,eAAiBN,EAAKO,UACtCC,EAAYR,EAAKQ,UACjBC,GAAQT,GAAAA,EAAAA,EAAKI,WAALJ,YAAAA,EAAeU,SAAfV,YAAAA,EAAuBW,SAAS,aAE1C,IAAAC,EACJ,OAAIJ,EACHI,EAAaH,EAAQ,UAAY,cAEjCG,EAAaH,EAAQ,aAAe,mBAInCI,EACA,CAAA3J,SAAA,CAACW,EAAA,IAAAiJ,GAAA,CAAeC,QAAO,GACrB7J,SACAmJ,EAAAxI,EAAA,IAAC,MAAA,CACAmJ,SAAU,EACVtB,IAAKM,EAAKiB,MAAQhC,EAClB1B,UAAWG,EACV,2CACAuC,CACD,EACAN,IAAKU,CAAA,CACN,EAEAxI,EAAA,IAAC,MAAA,CACAmJ,SAAU,EACV,aAAYhB,EAAKiB,MAAQ,GAAGhC,CAAgB,OAC5C1B,UAAWG,EACV,+DACAuC,CACD,EAEA/I,SAAAW,EAAA,IAACgG,EAAK,CAAAoD,KAAK,MAAO,CAAA,CACnB,CAAA,CAEF,CAAA,EACCpJ,EAAA,IAAAqJ,GAAA,CACAhK,SAACiE,EAAA,KAAA,OAAA,CAAKoC,UAAU,kDACfrG,SAAA,CAAAiE,EAAA,KAAC,OACC,CAAAjE,SAAA,CAAK8I,EAAAiB,MAAQ,GAAGhC,CAAgB,OAAQ,IACxCiB,EACE,OAAOU,CAAU,IACjBxC,IAAU,IAAKQ,GAAAA,YAAAA,EAAcuC,MAAOnB,EAAKmB,GACtC,WACA,EACJ,MACC,IAAA,CACJ,CAAA,EACCjB,GAAAA,MAAAA,EAAekB,MACfvJ,EAAAA,IAAC,OAAM,CAAAX,SAAAgJ,EAAckB,KAAM,CAAA,EACxB,KACHlB,GAAAA,MAAAA,EAAemB,MACfxJ,EAAAA,IAAC,OAAM,CAAAX,SAAAgJ,EAAcmB,KAAM,CAAA,EACxB,IAAA,CACL,CAAA,CACD,CAAA,CAAA,CAAA,EA5CarB,EAAKmB,EA6CnB,CAGH,CAAA,EACC7B,EACAD,SACCwB,EACA,CAAA3J,SAAA,CAACW,EAAA,IAAAiJ,GAAA,CAAeC,QAAO,GACtB7J,SAAAW,EAAA,IAAC,MAAA,CACAmJ,SAAU,EACV,aAAYpB,EACZrC,UAAWG,EACV,gGACAiB,EAAe,UAAY,SAC5B,EAEAzH,SAAAW,EAAA,IAAC,OAAA,CACA0F,UAAWG,EACV,kFACAiB,EAAe,MAAQ,KACxB,EAECzH,SAAAyH,EAAe,IAAIS,CAAe,GAAKA,CACzC,CAAA,CACD,CAAA,CACD,CAAA,EACAvH,EAAA,IAACqJ,IAAgBhK,SAAe0I,CAAA,CAAA,CAAA,CACjC,CAAA,EACG,IAAA,CACL,CAAA,CACD,CAAA,CAEF,CAEA,MAAM0B,GAAYrL,GAAoB,qBAAsB,EAAI,EAEhE,SAAwBsL,IAAM,CAC7B,MAAMC,EAAOC,EAA6B,EACpCzB,EAAOnB,EAAgB,EACvB6C,EAASJ,GAAU,EACnBK,EAAaC,GAAY,EAEzB,CAACjD,EAAckD,CAAkB,EAAIC,EAAAA,SAAeN,EAAK7C,YAAY,EAC3EoD,GAAkB,CAAEC,WAAY,CAAC,wBAAwB,CAAE,CAAC,EAE5D,SAASC,EAAclN,EAAgB,CACtC8M,EAAmB9M,CAAK,EACxBmN,SAASC,OAAS,gBAAgBpN,EAAMqN,SAAU,CAAA,yBACnD,CAGC,OAAAjH,EAAAA,KAAC,MAAI,CAAAoC,UAAU,gBACbrG,SAAA,CAAO8I,EAAA,WAAQqC,GAAa,EAAA,EAS5BV,GAAcD,EAAS,KACvB7J,EAAAA,IAACyK,GAAA,CACA3D,aAAAA,EACA4D,iBAAkBN,CAAA,CACnB,EAED9G,EAAA,KAAC,MAAA,CAGAoC,UAAWG,EAAG,sCAAuC,CACpD,0JACC,CAACsC,EACF,oJACCA,EACD,YAAa,CAAC0B,GAAU/C,CACzB,CAAC,EAEAzH,SAAA,CACAwK,EAAA7J,EAAA,IAAC2K,GAAA,CACA7D,aAAAA,EACA4D,iBAAkBN,EACnB,EACG,KACJpK,EAAA,IAAC,MAAA,CACA0F,UAAWG,EACV,sDACAiB,EAAe,kBAAoB,EACpC,EAEAzH,eAACuL,GAAO,CAAA,CAAA,CAAA,CACT,CAAA,CAAA,CACD,CAAA,CACD,CAAA,CAEF,CAEA,SAAStC,GAAiBC,EAA4B,CACjD,GAAA,CAACA,EAAiB,OAAA,KAEhB,KAAA,CAAEsC,SAAAA,CAAS,EAAItC,EAEfuC,EAAkB,CACvBD,EACG,CAACA,EAASE,eAAgBF,EAASG,UAAU,EAC5CC,OAAOC,OAAO,EACdhD,IAAKiD,GAAMA,EAAEZ,SAAS,EAAEa,SAAS,EAAG,GAAG,CAAC,EACxCC,KAAK,GAAG,EACT,KACHR,GAAAA,YAAAA,EAAUS,IAAA,EAETL,OAAOC,OAAO,EACdG,KAAK,KAAK,EACZ,MAAO,CAAE9B,MAAOhB,EAASgD,cAAe/B,MAAOsB,CAAgB,CAChE,CAEA,SAASN,IAAe,CACvB,MAAMX,EAASJ,GAAU,EACnB,CACLtC,QAAS,CAAEqE,KAAAA,EAAMC,YAAAA,CAAY,GAC1BpE,GAAkB,EAChBqE,EAAgBC,GAAiB,EACjCC,EACJ5L,EAAA,IAAA,MAAA,CACCX,SAAIwM,IAAAC,yBACH,MACC,CAAAzM,SAAA,CAAA,iCAEAiE,EAAAA,KAAAC,EAAAA,SAAA,CAAAlE,SAAA,CAAAW,EAAA,IAAC0H,EAAA,CACAhC,UAAU,YACVzC,OAAO,SACP0E,IAAI,sBACJC,GAAIiE,IAAIE,qBACR1M,SAAA,cAED,EACC,uBAAA,CACF,CAAA,EAAI,GAAA,EACL,EACGqM,EACHpI,EAAA,KAAC,MACA,CAAAjE,SAAA,CAAAW,EAAA,IAAC0H,EAAK,CAAAE,GAAG,SAASlC,UAAU,YAAYrG,SAExC,OAAA,CAAA,EAAQ,IAAI,KACT,IACHW,EAAAA,IAAC,KAAEgM,KAAM,WAAWR,CAAI,SAAU9F,UAAU,YAAYrG,SAExD,eAAA,CAAA,EAAK,IAAI,0BAAA,CAAA,CAEV,EACG,IACL,CAAA,EAED,OACEW,EAAAA,IAAA,MAAA,CAAI0F,UAAU,qHACbrG,WAECiE,EAAA,KAAAC,WAAA,CAAAlE,SAAA,CAACiE,EAAA,KAAA,MAAA,CAAIoC,UAAU,qDACdrG,SAAA,CAAAW,EAAA,IAACiM,EAAK,CAAAC,KAAK,KAAKC,MAAM,YAAa,CAAA,EACnC7I,EAAA,KAAC,MAAI,CAAAoC,UAAU,qCACdrG,SAAA,CAACiE,EAAA,KAAA,IAAA,CAAEoC,UAAU,OAAOrG,SAAA,CAAA,iBACJ,IACfW,EAAAA,IAAC0H,EAAA,CACAE,GAAI,WAAW4D,CAAI,GACnB9F,UAAU,YACVzC,OAAO,SAEN5D,SAAAoM,CAAA,CACF,EAAQ,IAAI,eAAA,CAEb,CAAA,EACCG,CAAA,CACF,CAAA,CAAA,CACD,CAAA,EACCF,EAAgB,KACfpI,EAAAA,KAAA,MAAA,CAAIoC,UAAU,0DACdrG,SAAA,CAAAiE,EAAA,KAACoE,EAAA,CACAE,GAAI,WAAW4D,CAAI,GACnBvI,OAAO,SACPyC,UAAU,iFAEVrG,SAAA,CAACiE,EAAA,KAAA,OAAA,CAAKoC,UAAU,iBAAiBrG,SAAA,CAAA,QAAMoM,CAAA,CAAY,CAAA,EACnDzL,EAAA,IAAC,QAAKX,SAAE,IAAA,CAAA,CAAA,CAAA,CACT,EACAiE,EAAA,KAACoE,EAAA,CACAE,GAAIiE,IAAIC,kBAAoB,WAAWN,CAAI,SAAW,SACtD9F,UAAU,oIAEVrG,SAAA,CAAAW,EAAA,IAACgG,EAAK,CAAAoD,KAAK,OAAO8C,KAAK,IAAK,CAAA,EAC3BlM,EAAA,IAAA,OAAA,CAAK0F,UAAU,iBAAiBrG,SAAK,OAAA,CAAA,CAAA,CAAA,CACvC,CAAA,CACD,CAAA,CAAA,CAAA,CAEF,EAGCiE,EAAA,KAAAC,WAAA,CAAAlE,SAAA,CAACiE,EAAA,KAAA,MAAA,CAAIoC,UAAU,qDACdrG,SAAA,CAACW,EAAA,IAAA,IAAA,CAAEgM,KAAM,WAAWR,CAAI,GACvBnM,SAACW,EAAA,IAAAiM,EAAA,CAAKC,KAAK,KAAKC,MAAM,YAAa,CAAA,CACpC,CAAA,SACCjN,GACA,CAAAG,SAAA,CAACW,EAAA,IAAAK,GAAA,CACAhB,eAAC2G,EAAK,CAAAoD,KAAK,WAAW8C,KAAK,KAAKxG,UAAU,eAAgB,CAAA,CAC3D,CAAA,SACCzD,GACA,CAAA5C,SAAA,CAAAiE,EAAA,KAAC2C,GACA,CAAA5G,SAAA,CAAAW,EAAA,IAACiM,EAAK,CAAAC,KAAK,KAAKC,MAAM,YAAa,CAAA,EAClCnM,EAAA,IAAA,OAAA,CAAK0F,UAAU,wBAAyBrG,SAAYoM,CAAA,CAAA,CAAA,CACtD,CAAA,SACCzH,GAAkB,CAAA3E,SAAA,CAAA,iBACH,IACfW,EAAAA,IAAC0H,GAAKE,GAAI,WAAW4D,CAAI,GAAI9F,UAAU,YACrCrG,SACFoM,CAAA,CAAA,EAAQ,IAAI,eAAA,CAEb,CAAA,EACCG,CAAA,CACF,CAAA,CAAA,CACD,CAAA,CAAA,CACD,CAAA,EACCF,EAAgB,KACfpI,EAAAA,KAAA,MAAA,CAAIoC,UAAU,2BACdrG,SAAA,CAAAiE,EAAA,KAACoE,EAAA,CACAE,GAAI,WAAW4D,CAAI,GACnBvI,OAAO,SACPyC,UAAU,iFAEVrG,SAAA,CAACW,EAAA,IAAA,OAAA,CAAK0F,UAAU,iBAAiBrG,SAAI,MAAA,CAAA,EACrCW,EAAA,IAAC,QAAKX,SAAE,IAAA,CAAA,CAAA,CAAA,CACT,EACAiE,EAAA,KAACoE,EAAA,CACAE,GAAIiE,IAAIC,kBAAoB,WAAWN,CAAI,SAAW,SACtD9F,UAAU,oIAEVrG,SAAA,CAAAW,EAAA,IAACgG,EAAK,CAAAoD,KAAK,OAAO8C,KAAK,IAAK,CAAA,EAC3BlM,EAAA,IAAA,OAAA,CAAK0F,UAAU,iBAAiBrG,SAAK,OAAA,CAAA,CAAA,CAAA,CACvC,CAAA,CACD,CAAA,CAAA,CAEF,CAAA,CAEF,CAAA,CAEF,CAEA,MAAM+M,GAAe,CACpBC,OAAQ,CAAEC,QAAS,EAAGC,EAAG,GAAI,EAC7BC,QAAS,CAAEF,QAAS,EAAGC,EAAG,CAAE,CAC7B,EACA,SAASE,GAA2B,CACnC1B,eAAAA,EACA1L,SAAAA,CACD,EAGG,CACI,MAAAqN,EAAoBC,GAA6B5B,CAAc,EAEpE,OAAA/K,EAAA,IAAC4M,EAAOC,GAAP,CACAC,SAAUV,GACV1G,UAAWG,EAEV,gCACA6G,EAAoB,GAAGA,CAAiB,mBAAqB,IAC9D,EAEArN,SAACW,EAAA,IAAA,OAAA,CAAK0F,UAAU,oBAAqBrG,SAAAA,CAAS,CAAA,CAAA,CAC/C,CAEF,CAEA,SAAS0N,EAA+B,CACvC1N,SAAAA,EACA,GAAG2N,CACJ,EAEwB,CACjB,MAAAN,EAAoBO,GAAyBD,CAAkB,EAEpE,OAAAhN,EAAA,IAAC4M,EAAOC,GAAP,CACAC,SAAUV,GACV1G,UAAWG,EAEV,gCACA6G,EAAoB,GAAGA,CAAiB,mBAAqB,IAC9D,EAEArN,SAACW,EAAA,IAAA,OAAA,CAAK0F,UAAU,oBAAqBrG,SAAAA,CAAS,CAAA,CAAA,CAC/C,CAEF,CAEA,SAASoL,GAAiB,CACzB3D,aAAAA,EACA4D,iBAAkBN,CACnB,EAGG,CACF,MAAMT,EAAOC,EAA6B,EACpCzB,EAAOnB,EAAgB,EACvBkG,EAAoBC,GAAqB,EACzCC,EAASC,GAAU,EACnBC,EAAWC,GAAY,EACvB,CAAEtG,MAAAA,CAAM,EAAIC,EAAY,EAGxBsG,EAAe,CACpBhB,QAAS,CACRF,QAAS,EACTmB,WAAY,CACXC,SAAU,IACVC,KAAM,iBACNC,gBAAiB,GAClB,CACD,EACAvB,OAAQ,CACPC,QAAS,CACV,CACD,EAEA,aACE,MAAI,CAAA5G,UAAU,iCACdrG,SAACW,EAAA,IAAA,MAAA,CAAI0F,UAAU,SACdrG,SAAAiE,EAAA,KAAC,MAAA,CACAoC,UAAWG,EAAG,oBAAqB,CAClC,WAAYiB,EACZ,OAAQ,CAACA,CACV,CAAC,EAEDzH,SAAA,CAAAW,EAAA,IAAC6N,GAAA,CACAC,MAAOnE,EAAK4B,cACZzE,aAAAA,EACAsD,cAAAA,CACD,CAAA,EACCtD,GACAxD,OAACsJ,EAAOmB,IAAP,CACArI,UAAU,8GACVsI,QAAS,CAAE1B,QAAS,CAAE,EACtB2B,QAAS,CAAE3B,QAAS,CAAE,EAEtBjN,SAAA,CAAAiE,EAAAA,KAACsJ,EAAOsB,GAAP,CACApB,SAAUU,EACVQ,QAAQ,SACRC,QAAQ,UACRvI,UAAU,gBAEVrG,SAAA,CAAAW,EAAA,IAAC,OACA,CAAAX,SAAAW,EAAA,IAACmO,EAAA,CACAC,SAAS,SACTxG,GAAG,IACHlC,UAAWA,CAAC,CAAE2I,SAAAA,CAAS,IACtBC,EACC,8GACA,8KACA,CAAE,gCAAiCD,CAAS,CAC7C,EAEDhP,SAAA,MAED,CAAA,CACD,CAAA,EACCsK,EAAK4E,UAAUrG,IAAI,CAAC,CAAE6C,eAAAA,EAAgB+C,MAAAA,EAAOU,MAAAA,CAAM,IAAM,CACzD,MAAMH,EACLI,OAAOrB,EAAOrC,cAAc,IAAMA,EAC7B2D,EACL,CAACL,GACD1E,EAAKgF,WAAW5D,iBAAmBA,EAEnC,OAAAzH,EAAAA,KAACmJ,GAAA,CAEA1B,eAAAA,EAEA1L,SAAA,CAACiE,EAAA,KAAA,OAAA,CAAKoC,UAAU,6CACfrG,SAAA,CAAAW,EAAA,IAAC0H,EAAA,CACA0G,SAAS,SACTxG,GAAIgH,EAAgB7D,CAAc,EAClCrF,UAAW4I,EACV,2FACA,8KACA,CAAE,gCAAiCD,CAAS,CAC7C,EAEChP,SAAAyO,EACF,EACCY,EACA1O,EAAA,IAAC0H,EAAA,CACAE,GAAIiH,EACHlF,EAAKgF,WAAW5D,eAChBpB,EAAKgF,WAAW3D,WAChBrB,EAAKgF,WAAWrD,IACjB,EACA8C,SAAS,SACT/O,SAAA,IAED,CAAA,EACG,IAAA,CACL,CAAA,EACCgP,EACA/K,OAACsJ,EAAOsB,GAAP,CACApB,SAAUU,EACVQ,QAAQ,SACRC,QAAQ,UACRvI,UAAU,0BAEVrG,SAAA,CAAAW,EAAA,IAAC+M,EAAA,CAEAzB,KAAK,eACLP,eAAAA,EAEA1L,SAAAW,EAAA,IAAC0H,EAAA,CACAE,GAAIgH,EAAgB7D,CAAc,EAClCqD,SAAS,SACT1I,UAAW4I,EACV,2PACA,CACC,gCACC,CAAClB,EAAOpC,UACV,CACD,EACA3L,SAAA,OAED,CAAA,CAAA,EAhBK0L,CAiBN,EACCyD,EACCvD,OAAOC,OAAO,EACdhD,IAAI,CAAC,CAAE8C,WAAAA,EAAY8C,MAAAA,EAAOgB,QAAAA,EAASC,SAAAA,CAAS,IAE3C/O,EAAAA,IAAC+M,EAAA,CAEAzB,KAAK,OACLN,WAAAA,EACAD,eAAAA,EAEA1L,SAAAiE,EAAA,KAAC,MAAI,CAAAoC,UAAU,wBACdrG,SAAA,CAAAiE,EAAA,KAACoE,EAAA,CACAE,GAAIiH,EACH9D,EACAC,CACD,EACAoD,SAAS,SACT1I,UAAU,8BAETrG,SAAA,CAAA2L,EAAWT,WAAWa,SAAS,EAAG,GAAG,EAAE,IAAE,IACzC0C,CAAAA,CAAA,CACF,EACAxK,EAAA,KAAC,MAAI,CAAAoC,UAAU,yBACbrG,SAAA,CACAyP,GAAAxL,EAAA,KAAC6K,EAAA,CACAvG,GAAIiH,EACH9D,EACAC,EACA,SACD,EACAoD,SAAS,SACT1I,UAAWA,CAAC,CAAE2I,SAAAA,CAAS,IACtBC,EACC,2FACA,8KACA,CACC,gCACCD,CACF,CACD,EAEDhP,SAAA,CAAA,UAECyP,EAAQ1F,OACTO,EAAKgF,WAAWK,QACb,MACA,EAAA,EACJ,EAEAD,GACAzL,EAAA,KAAC6K,EAAA,CACAvG,GAAIiH,EACH9D,EACAC,EACA,UACD,EACAoD,SAAS,SACT1I,UAAWA,CAAC,CAAE2I,SAAAA,CAAS,IACtBC,EACC,2FACA,8KACA,CACC,gCACCD,CACF,CACD,EAEDhP,SAAA,CAAA,WAEC0P,EAAS3F,OACVO,EAAKgF,WAAWK,QACb,MACA,EAAA,CAAA,CACJ,CAAA,CAEF,CAAA,CAAA,CACD,CAAA,CAAA,EAvEKhE,CAwEN,CAED,EACFhL,EAAA,IAAC+M,EAAA,CACAzB,KAAK,WACLP,eAAAA,EAEA1L,SAAAW,EAAA,IAACmO,EAAA,CACAvG,GAAIgH,EAAgB7D,EAAgB,UAAU,EAC9CqD,SAAS,SACT1I,UAAWA,CAAC,CAAE2I,SAAAA,CAAS,IACtBC,EACC,6PACA,CACC,gCAAiCD,CAClC,CACD,EAEDhP,SAAA,gBAED,CAAA,CAAA,CACD,CAAA,CACD,CAAA,EACG,IAAA,CAAA,EA1JC0L,CA2JN,CAEF,CAAC,CAAA,CAAA,CACF,EACA/K,EAAA,IAAC,MAAI,CAAA0F,UAAU,OACdrG,SAAAW,EAAA,IAACmO,EAAA,CACAvG,GAAG,YACHlC,UAAWA,CAAC,CAAE2I,SAAAA,CAAS,IACtBC,EACC,4FACA,CACC,kKACCD,CACF,CACD,EAEDhP,SAAA,sBAED,CAAA,CACD,CAAA,CAAA,CAAA,CACD,EAEDW,EAAA,IAAC,MAAI,CAAA0F,UAAU,WAAY,CAAA,EAC1B4H,EAAW,KACXtN,EAAAA,IAACiP,GAAc1M,QAASuE,EAAe,KAAO,kBAC7CzH,SAAAW,EAAA,IAAC,MAAA,CACA0F,UAAWG,EACV,yDACAiB,EAAe,kBAAoB,UACpC,EAEAzH,SAAAW,EAAA,IAACgG,EAAA,CACAoD,KAAK,mBACL1D,UAAU,8BAETrG,WAAe,kBAAoB,IACrC,CAAA,CACD,CAAA,CACD,CAAA,EAEDW,EAAA,IAAC,MAAA,CACA0F,UAAWG,EACV,sCACAiB,GAAgBG,EAAMN,OAAS,EAAI,WAAa,OAChDG,EAAe,kBAAoB,UACpC,EAEAzH,SAAAW,EAAA,IAAC6G,IAASC,aAAAA,CAA4B,CAAA,CAAA,CACvC,EACC+E,IAAIC,kBAAoB,KAAO3D,QAC9B8G,EAAc,CAAA1M,QAASuE,EAAe,KAAO,eAC7CzH,SAAAiE,EAAA,KAACoE,EAAA,CACAhC,UAAWG,EACV,kHACA,CACC,WAAY,CAACiB,EACb,kBAAmBA,CACpB,CACD,EACAc,GAAG,WAEFvI,SAAA,CAAA8I,EAAKM,cACLzI,EAAAA,IAAC,MAAA,CACA6H,IAAKM,EAAKiB,MAAQjB,EAAK+G,MACvBpH,IAAKK,EAAKM,cACV/C,UAAU,qBAAA,CACX,QAECM,EAAK,CAAAoD,KAAK,OAAO1D,UAAU,gBAAgBwG,KAAK,IAAK,CAAA,EAEtDpF,EACA9G,MAAC4M,EAAOmB,IAAP,CACArI,UAAU,sCACVsI,QAAS,CAAE1B,QAAS,CAAE,EACtB2B,QAAS,CAAE3B,QAAS,CAAE,EACtBjN,SAAA,cAAA,CAED,EAEAW,EAAA,IAAC,OAAK,CAAA0F,UAAU,UAAUrG,SAAY,cAAA,CAAA,CAAA,CAExC,CAAA,EACD,EACG,KACHwM,IAAIC,kBAAoB,KAAO3D,GAAQ+E,EACvClN,EAAA,IAACiP,EAAA,CACA1M,QAASuE,EAAe,KAAO,0BAE/BzH,SAAAiE,EAAA,KAACoE,EAAA,CACAE,GAAIsF,EACJkB,SAAS,SACT1I,UAAW4I,EACV,mGACD,EACAa,MAAO,CAAEC,KAAM,6BAA8B,EAE7C/P,SAAA,CAAAW,EAAA,IAACgG,GAAKoD,KAAK,cAAc1D,UAAU,gBAAgBwG,KAAK,IAAK,CAAA,EAC5DpF,EACA9G,MAAC4M,EAAOmB,IAAP,CACArI,UAAU,sCACVsI,QAAS,CAAE1B,QAAS,CAAE,EACtB2B,QAAS,CAAE3B,QAAS,CAAE,EACtBjN,SAAA,yBAAA,CAED,EAEAW,EAAA,IAAC,OAAK,CAAA0F,UAAU,UAAUrG,SAAuB,yBAAA,CAAA,CAAA,CAEnD,CAAA,EACD,EACG,KACJW,EAAA,IAAC,MAAA,CACA0F,UAAWG,EACV,8EACA,CACC,kBAAmBiB,EACnB,WAAY,CAACA,CACd,CACD,EAEAzH,eAACgQ,GAAY,CAAA,CAAA,CAAA,CACd,CAAA,CACD,CAAA,CACD,CAAA,CACD,CAAA,CAEF,CAEA,MAAMC,EAAoB,IAE1B,SAAS3E,GAAW,CACnB7D,aAAAA,EACA4D,iBAAkBN,CACnB,EAGG,CACF,MAAMT,EAAOC,EAA6B,EACpCzB,EAAOnB,EAAgB,EACvBkG,EAAoBC,GAAqB,EACzCC,EAASC,GAAU,EACnBC,EAAWC,GAAY,EACvB,CAAEtG,MAAAA,CAAM,EAAIC,EAAY,EAExB2D,EAAWlB,EAAK4E,UAAUgB,KAC9BC,GAAMA,EAAEzE,iBAAmB0D,OAAOrB,EAAOrC,cAAc,CACzD,EACM0E,EACLrC,EAAO9B,OAAS,WACbT,GAAAA,YAAAA,EAAU6E,UAAUH,KACnBpE,GAAMA,EAAEH,aAAeyD,OAAOrB,EAAOpC,UAAU,GAEhDoC,EAAO9B,OAAS,UACfT,GAAAA,YAAAA,EAAU8E,SAASJ,KAClBK,GAAMA,EAAE5E,aAAeyD,OAAOrB,EAAOpC,UAAU,GAEhD,KAGC6E,EAAe5R,EAAqB,EACpC6R,EAAe,CACpBC,MAAO,CAAEC,MAAO,EAAG,EACnBnQ,KAAM,CAAEmQ,MAAOV,CAAkB,CAClC,EAGM9B,EAAe,CACpBhB,QAAS,CACRF,QAAS,EACTmB,WAAY,CACXC,SAAU,IACVC,KAAM,iBACNC,gBAAiB,GAClB,CACD,EACAvB,OAAQ,CACPC,QAAS,CACV,CACD,EAGC,OAAAtM,EAAAA,IAAC,MAAI,CAAA0F,UAAU,0BACdrG,SAAAW,EAAAA,IAAC4M,EAAOmB,IAAP,CACAC,QAASlH,EAAe,OAAS,QACjCgG,SAAUgD,EACV7B,QAAS4B,EAETxQ,SAAAiE,EAAA,KAAC,MAAI,CAAAoC,UAAU,oDACdrG,SAAA,CAAAW,EAAA,IAAC6N,GAAA,CACAC,MAAOnE,EAAK4B,cACZsE,aAAAA,EACA/I,aAAAA,EACAsD,cAAAA,CACD,CAAA,EACCtD,GACAxD,OAACsJ,EAAOmB,IAAP,CACA5B,MAAO,CAAE6D,MAAOV,CAAkB,EAClC5J,UAAU,uGACVsI,QAAS,CAAE1B,QAAS,CAAE,EACtB2B,QAAS,CAAE3B,QAAS,CAAE,EAEtBjN,SAAA,CAAAiE,EAAAA,KAACsJ,EAAOsB,GAAP,CACApB,SAAUU,EACVQ,QAAQ,SACRC,QAAQ,UACRvI,UAAU,gBAEVrG,SAAA,CAAAW,EAAA,IAAC,OACA,CAAAX,SAAAW,EAAA,IAACmO,EAAA,CACAC,SAAS,SACTxG,GAAG,IACHlC,UAAWA,CAAC,CAAE2I,SAAAA,CAAS,IACtBC,EACC,8GACA,8KACA,CAAE,gCAAiCD,CAAS,CAC7C,EAEDhP,SAAA,MAED,CAAA,CACD,CAAA,EACCsK,EAAK4E,UAAUrG,IAAI,CAAC,CAAE6C,eAAAA,EAAgB+C,MAAAA,EAAOU,MAAAA,CAAM,IAAM,CACzD,MAAMH,EACLI,OAAOrB,EAAOrC,cAAc,IAAMA,EAC7B2D,EACL,CAACL,GACD1E,EAAKgF,WAAW5D,iBAAmBA,EAEnC,OAAAzH,EAAAA,KAACmJ,GAAA,CAEA1B,eAAAA,EAEA1L,SAAA,CAACiE,EAAA,KAAA,OAAA,CAAKoC,UAAU,6CACfrG,SAAA,CAAAW,EAAA,IAAC0H,EAAA,CACA0G,SAAS,SACTxG,GAAIgH,EAAgB7D,CAAc,EAClCrF,UAAW4I,EACV,2FACA,8KACA,CAAE,gCAAiCD,CAAS,CAC7C,EAEChP,SAAAyO,EACF,EACCY,EACA1O,EAAA,IAAC0H,EAAA,CACAE,GAAIiH,EACHlF,EAAKgF,WAAW5D,eAChBpB,EAAKgF,WAAW3D,WAChBrB,EAAKgF,WAAWrD,IACjB,EACA8C,SAAS,SACT/O,SAAA,IAED,CAAA,EACG,IAAA,CACL,CAAA,EACCgP,EACA/K,OAACsJ,EAAOsB,GAAP,CACApB,SAAUU,EACVQ,QAAQ,SACRC,QAAQ,UACRvI,UAAU,0BAEVrG,SAAA,CAAAW,EAAA,IAAC+M,EAAA,CAEAzB,KAAK,eACLP,eAAAA,EAEA1L,SAAAW,EAAA,IAAC0H,EAAA,CACAE,GAAIgH,EAAgB7D,CAAc,EAClCqD,SAAS,SACT1I,UAAW4I,EACV,2PACA,CACC,gCACC,CAAClB,EAAOpC,UACV,CACD,EACA3L,SAAA,OAED,CAAA,CAAA,EAhBK0L,CAiBN,EACCyD,EACCvD,OAAOC,OAAO,EACdhD,IAAI,CAAC,CAAE8C,WAAAA,EAAY8C,MAAAA,GAAOgB,QAAAA,EAASC,SAAAA,CAAS,IAE3C/O,EAAAA,IAAC+M,EAAA,CAEAzB,KAAK,OACLN,WAAAA,EACAD,eAAAA,EAEA1L,SAAAiE,EAAA,KAAC,MAAI,CAAAoC,UAAU,wBACdrG,SAAA,CAAAiE,EAAA,KAACoE,EAAA,CACAE,GAAIiH,EACH9D,EACAC,CACD,EACAoD,SAAS,SACT1I,UAAU,8BAETrG,SAAA,CAAA2L,EAAWT,WAAWa,SAAS,EAAG,GAAG,EAAE,IAAE,IACzC0C,EAAAA,CAAA,CACF,EACAxK,EAAA,KAAC,MAAI,CAAAoC,UAAU,yBACbrG,SAAA,CACAyP,GAAAxL,EAAA,KAAC6K,EAAA,CACAvG,GAAIiH,EACH9D,EACAC,EACA,SACD,EACAoD,SAAS,SACT1I,UAAWA,CAAC,CAAE2I,SAAAA,CAAS,IACtBC,EACC,2FACA,8KACA,CACC,gCACCD,CACF,CACD,EAEDhP,SAAA,CAAA,UAECyP,EAAQ1F,OACTO,EAAKgF,WAAWK,QACb,MACA,EAAA,EACJ,EAEAD,GACAzL,EAAA,KAAC6K,EAAA,CACAvG,GAAIiH,EACH9D,EACAC,EACA,UACD,EACAoD,SAAS,SACT1I,UAAWA,CAAC,CAAE2I,SAAAA,CAAS,IACtBC,EACC,2FACA,8KACA,CACC,gCACCD,CACF,CACD,EAEDhP,SAAA,CAAA,WAEC0P,EAAS3F,OACVO,EAAKgF,WAAWK,QACb,MACA,EAAA,CAAA,CACJ,CAAA,CAEF,CAAA,CAAA,CACD,CAAA,CAAA,EAvEKhE,CAwEN,CAED,EACFhL,EAAA,IAAC+M,EAAA,CACAzB,KAAK,WACLP,eAAAA,EAEA1L,SAAAW,EAAA,IAACmO,EAAA,CACAvG,GAAIgH,EAAgB7D,EAAgB,UAAU,EAC9CqD,SAAS,SACT1I,UAAWA,CAAC,CAAE2I,SAAAA,CAAS,IACtBC,EACC,6PACA,CACC,gCAAiCD,CAClC,CACD,EAEDhP,SAAA,gBAED,CAAA,CAAA,CACD,CAAA,CACD,CAAA,EACG,IAAA,CAAA,EA1JC0L,CA2JN,CAEF,CAAC,CAAA,CAAA,CACF,EACA/K,EAAA,IAAC,MAAI,CAAA0F,UAAU,OACdrG,SAAAW,EAAA,IAACmO,EAAA,CACAvG,GAAG,YACHlC,UAAWA,CAAC,CAAE2I,SAAAA,CAAS,IACtBC,EACC,4FACA,CACC,kKACCD,CACF,CACD,EAEDhP,SAAA,sBAED,CAAA,CACD,CAAA,CAAA,CACD,CAAA,EAEA,CAACyH,GACA9G,EAAA,IAAA,MAAA,CAAI0F,UAAU,yCACdrG,SAAAiE,EAAA,KAAC,MAAI,CAAAoC,UAAU,mFACbrG,SAAA,CAAAwL,GAAAA,MAAAA,EAAUiD,MACV9N,EAAAA,IAAC0H,EAAK,CAAAE,GAAIgH,EAAgBH,OAAOrB,EAAOrC,cAAc,CAAC,EACrD1L,SAASwL,EAAAiD,KACX,CAAA,EACG,KACHjD,GAAAA,MAAAA,EAAUiD,QAAS2B,GAAAA,MAAAA,EAAK3B,OAAQ,MAAQ,KACxC2B,GAAAA,MAAAA,EAAK3B,MACL9N,EAAAA,IAAC0H,EAAA,CACAE,GAAIiH,EACHJ,OAAOrB,EAAOrC,cAAc,EAC5B0E,EAAIzE,UACL,EAEC3L,SAAIoQ,EAAA3B,KACN,CAAA,EACG,IAAA,CACL,CAAA,CACD,CAAA,EAEAR,EAAW,KACXtN,EAAAA,IAACiP,GAAc1M,QAASuE,EAAe,KAAO,kBAC7CzH,SAAAW,EAAA,IAAC,MAAA,CACA0F,UAAWG,EACV,sDACAiB,EAAe,gBAAkB,gBAClC,EAEAzH,SAAAW,EAAA,IAACgG,EAAA,CACAoD,KAAK,mBACL1D,UAAU,8BAETrG,WACCW,EAAA,IAAA,OAAA,CAAK0F,UAAU,oBAAoBrG,2BAAe,EAChD,IACL,CAAA,CACD,CAAA,CACD,CAAA,EAEDW,EAAA,IAAC,MAAA,CACA0F,UAAWG,EACV,0EACAiB,GAAgBG,EAAMN,OAAS,EAAI,OAAS,MAC7C,EACAwF,MAAOrF,EAAe,CAAEkJ,MAAOV,GAAsB,CAAC,EAEtDjQ,SAAAW,EAAA,IAAC6G,IAASC,aAAAA,CAA4B,CAAA,CAAA,CACvC,EACC+E,IAAIC,kBAAoB,KAAO3D,QAC9B8G,EAAc,CAAA1M,QAASuE,EAAe,KAAO,eAC7CzH,SAAAiE,EAAA,KAACoE,EAAA,CACAhC,UAAU,kIACVkC,GAAG,WAEFvI,SAAA,CAAA8I,EAAKM,cACLzI,EAAAA,IAAC,MAAA,CACA6H,IAAKM,EAAKiB,MAAQjB,EAAK+G,MACvBpH,IAAKK,EAAKM,cACV/C,UAAU,qBAAA,CACX,QAECM,EAAK,CAAAoD,KAAK,OAAO1D,UAAU,gBAAgBwG,KAAK,IAAK,CAAA,EAEtDpF,EACA9G,MAAC4M,EAAOmB,IAAP,CACArI,UAAU,sCACVsI,QAAS,CAAE1B,QAAS,CAAE,EACtB2B,QAAS,CAAE3B,QAAS,CAAE,EACtBjN,SAAA,cAAA,CAED,EAEAW,EAAA,IAAC,OAAK,CAAA0F,UAAU,UAAUrG,SAAY,cAAA,CAAA,CAAA,CAExC,CAAA,EACD,EACG,KACHwM,IAAIC,kBAAoB,KAAO3D,GAAQ+E,EACvClN,EAAA,IAACiP,EAAA,CACA1M,QAASuE,EAAe,KAAO,0BAE/BzH,SAAAiE,EAAA,KAACoE,EAAA,CACAE,GAAIsF,EACJkB,SAAS,SACT1I,UAAW4I,EACV,mGACD,EACAa,MAAO,CAAEC,KAAM,6BAA8B,EAE7C/P,SAAA,CAAAW,EAAA,IAACgG,GAAKoD,KAAK,cAAc1D,UAAU,gBAAgBwG,KAAK,IAAK,CAAA,EAC5DpF,EACA9G,MAAC4M,EAAOmB,IAAP,CACArI,UAAU,sCACVsI,QAAS,CAAE1B,QAAS,CAAE,EACtB2B,QAAS,CAAE3B,QAAS,CAAE,EACtBjN,SAAA,yBAAA,CAED,EAEAW,EAAA,IAAC,OAAK,CAAA0F,UAAU,UAAUrG,SAAuB,yBAAA,CAAA,CAAA,CAEnD,CAAA,EACD,EACG,WACH,MAAI,CAAAqG,UAAU,iDACdrG,SAAAW,EAAAA,IAACqP,IAAY,CAAA,CACd,CAAA,CAAA,CACD,CAAA,CACD,CAAA,CACD,CAAA,CAEF,CAEA,SAASxB,GAAU,CAClBC,MAAAA,EACAhH,aAAAA,EACAsD,cAAAA,EACAyF,aAAAA,CACD,EAKG,CACI,MAAAI,EAAiBhG,EAAM,OAAOnD,CAAY,EAC1CoJ,EAAgBjG,EAAM,OAA0B,IAAI,EACpDkG,EAAiB,CACtBtQ,KAAM,CAAEuQ,EAAG,6BAA8B,EACzCC,OAAQ,CAAED,EAAG,eAAgB,CAC9B,EACME,EAAiB,CACtBzQ,KAAM,CAAEuQ,EAAG,6BAA8B,EACzCG,OAAQ,CAAEH,EAAG,iBAAkB,EAC/BC,OAAQ,CAAED,EAAG,iBAAkB,CAChC,EACMI,EAAiBvS,EAAqB,EACtCwS,EAAiBxS,EAAqB,EAE5C,eAAeyS,GAAa,CACtBb,GAAAA,MAAAA,EAAcc,MAAM7J,EAAe,QAAU,QAClDsD,EAAc,CAACtD,CAAY,EACvBA,GACE0J,EAAeG,MAAMR,EAAeE,MAAM,EACzC,MAAAI,EAAeE,MAAML,EAAeC,MAAM,EAC3CE,EAAeE,MAAML,EAAeD,MAAM,IAEzC,MAAAI,EAAeE,MAAML,EAAeC,MAAM,EAC3CC,EAAeG,MAAMR,EAAetQ,IAAI,EACxC4Q,EAAeE,MAAML,EAAezQ,IAAI,EAE/C,CAEAoK,OAAAA,EAAAA,UAAgB,IAAM,CACrB,GAAI,CAACnD,EAAc,OAEnB,SAAS8J,EAAYlO,EAAsB,OACtCA,EAAMrF,MAAQ,YACjB6S,EAAAA,EAAcW,UAAdX,MAAAA,EAAuBY,QAEzB,CACSzG,gBAAA0G,iBAAiB,QAASH,CAAW,EACvC,IAAMvG,SAAS2G,oBAAoB,QAASJ,CAAW,CAC/D,EAAG,CAAC9J,CAAY,CAAC,EAGhBxD,EAAAA,KAAC,MAAA,CACAoC,UAAWG,EACV,oIACA,CACC,SAAUiB,CACX,CACD,EAEAzH,SAAA,CAAAW,EAAA,IAAC,SAAA,CACA2F,IAAKuK,EACLxK,UAAU,6CACV,aAAW,uBACXuL,QAASP,EAETrR,gBAAC,MAAI,CAAA2Q,MAAM,KAAKkB,OAAO,KAAKC,QAAQ,YACnC9R,SAAA,CAAAW,EAAAA,IAAC4M,EAAOwE,KAAP,CACC,GAAGjB,EAAeF,EAAeY,QAAU,OAAS,QAAQ,EAC7D5C,QAASuC,EACT/C,WAAY,CAAEC,SAAU,EAAI,EAC5B2D,OAAO,eACPC,YAAa,IACd,EACAtR,EAAAA,IAAC4M,EAAOwE,KAAP,CACC,GAAGd,EAAeL,EAAeY,QAAU,OAAS,QAAQ,EAC7D5C,QAASwC,EACThD,WAAY,CAAEC,SAAU,EAAI,EAC5B2D,OAAO,eACPC,YAAa,GAAA,CACd,CAAA,CACD,CAAA,CACD,CAAA,EACCxK,GACA9G,MAAC4M,EAAOgD,EAAP,CACAnC,WAAY,CAAE8D,MAAO,EAAI,EACzBvD,QAAS,CAAE1B,QAAS,EAAGkF,EAAG,CAAE,EAC5BvD,QAAS,CAAE3B,QAAS,EAAGkF,EAAG,CAAE,EAC5B9L,UAAU,iEAEVrG,SAACW,EAAA,IAAA0H,EAAA,CAAKE,GAAG,IAAKvI,SAAMyO,CAAA,CAAA,CAAA,CACrB,CAAA,CAAA,CAEF,CAEF","x_google_ignoreList":[0,1,3]}
@@ -1,2 +0,0 @@
1
- import{j as e,O as t}from"./index-Dsusf_Av.js";const n={getSitemapEntries:void 0};function r(){return e.jsx("div",{className:"flex h-full flex-grow",children:e.jsx(t,{})})}export{r as default,n as handle};
2
- //# sourceMappingURL=_layout-D7_F6t3x.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_layout-D7_F6t3x.js","sources":["../../../app/routes/_app+/exercise+/_layout.tsx"],"sourcesContent":["import { getExercises } from '@epic-web/workshop-utils/apps.server'\nimport { type SEOHandle } from '@nasa-gcn/remix-seo'\nimport { Outlet } from '@remix-run/react'\nimport { serverOnly$ } from 'vite-env-only/macros'\n\nexport const handle: SEOHandle = {\n\tgetSitemapEntries: serverOnly$(async (request) => {\n\t\tconst exercises = await getExercises({ request })\n\t\treturn exercises.flatMap((e) => [\n\t\t\t{ route: `/exercise/${e.exerciseNumber.toString().padStart(2, '0')}` },\n\t\t\t...e.steps.flatMap((s) =>\n\t\t\t\t['problem', 'solution'].map((type) => ({\n\t\t\t\t\troute: `/exercise/${e.exerciseNumber.toString().padStart(2, '0')}/${s.stepNumber.toString().padStart(2, '0')}/${type}`,\n\t\t\t\t})),\n\t\t\t),\n\t\t\t{\n\t\t\t\troute: `/exercise/${e.exerciseNumber.toString().padStart(2, '0')}/finished`,\n\t\t\t},\n\t\t])\n\t}),\n}\n\nexport default function ExercisesLayout() {\n\treturn (\n\t\t<div className=\"flex h-full flex-grow\">\n\t\t\t<Outlet />\n\t\t</div>\n\t)\n}\n"],"names":["handle","getSitemapEntries","undefined","ExercisesLayout","className","children","jsx","Outlet"],"mappings":"+CAKO,MAAMA,EAAoB,CAChCC,kBAAAC,MAcD,EAEA,SAAwBC,GAAkB,CACzC,aACE,MAAI,CAAAC,UAAU,wBACdC,SAAAC,EAAAA,IAACC,GAAO,CAAA,CACT,CAAA,CAEF"}
@@ -1,2 +0,0 @@
1
- import{j as r,r as p,O as Q}from"./index-Dsusf_Av.js";import{E as Z}from"./index-B8yUFowV.js";import{G as J}from"./error-boundary-B07cWiEy.js";import{N as X}from"./nav-chevrons-CV-dpXNR.js";import{u as ee}from"./revalidation-ws-B0skixgr.js";import{M as re,L as b,E as te}from"./mdx-C7imFHZE.js";import{P as oe}from"./progress-BJ4ADF-s.js";import{S as D}from"./set-playground-DW2Ys-rV.js";import{b as ne,a as A,I as C,i as se,e as ie}from"./misc-2sBiisF5.js";import{g as ae}from"./seo-pBpFCWsy.js";import{E as le}from"./epic-video-CmlkW6Rw.js";import{S as E,j as k,u as ce,R as pe,d as ue,e as de,h as _,P as I,f as j,A as L,g as F,k as fe,D as me,C as xe,l as he}from"./tooltip-Bzd6O8vq.js";import{a as ve}from"./index-DLC5u33j.js";import{u as P,e as ge,L as v,A as Pe}from"./components-5arJTWsS.js";import{P as je,h as Ne,R as be,u as Se,F as Ce}from"./index-Do-KWT0a.js";import"./progress-bar-DgnkQxQw.js";import"./pe-BShc2dvc.js";import"./index-BmMpCvYx.js";import"./online-DZKJk3C2.js";import"./loading-b1FV2pQh.js";import"./user-DNSnhqGn.js";import"./workshop-config-DchzGYJM.js";const $=p.createContext(null);function Ee(){const e=p.useContext($);if(!e)throw new Error("useStepContext must be used within a StepContext.Provider");return e}function we({children:e,inBrowserBrowserRef:t}){return r.jsx($.Provider,{value:{inBrowserBrowserRef:t},children:e})}const ye={DiffLink:w,PrevDiffLink:Ae,NextDiffLink:Re,InlineFile:De,LinkToApp:_e};function Oe({inBrowserBrowserRef:e}){const t=P();return t.exerciseStepApp.instructionsCode?r.jsx(we,{inBrowserBrowserRef:e,children:r.jsx(le,{epicVideoInfosPromise:t.epicVideoInfosPromise,children:r.jsx("div",{className:"prose dark:prose-invert sm:prose-lg",children:r.jsx(re,{code:t.exerciseStepApp.instructionsCode,components:ye})})})}):null}function T(e,t,o){const n=new URLSearchParams(e);return o===null?n.delete(t):n.set(t,o),n}function Re({app:e=0,fullPage:t=!1,children:o}){return r.jsx(w,{app1:e,app2:e+1,fullPage:t,children:o})}function Ae({app:e=-1,fullPage:t=!1,children:o}){return r.jsx(w,{app1:e,app2:e+1,fullPage:t,children:o})}function w({app1:e=0,app2:t=1,children:o,fullPage:n=!1,to:i}){const s=P();if(!i&&!e&&!t)return r.jsx("callout-danger",{className:"notification",children:r.jsx("div",{className:"title",children:"DiffLink Error: invalid input"})});function a(d){var f;if(typeof d=="number"){const m=s.exerciseIndex+d;return(f=s.allApps[m])==null?void 0:f.name}if(!d)return null;for(const{name:m,stepName:x}of s.allApps)if(d===m||d===x)return m;return null}if(i){const d=new URLSearchParams(i);e=d.get("app1"),t=d.get("app2")}const l=a(e),c=a(t);if(!l||!c)return r.jsxs("callout-danger",{className:"notification",children:[r.jsx("div",{className:"title",children:"DiffLink Error: invalid input"}),!l&&r.jsxs("div",{children:['app1: "',e,'" is not a valid app name']}),!c&&r.jsxs("div",{children:['app2: "',t,'" is not a valid app name']})]});i||(i=`app1=${l}&app2=${c}`);const u=n?`/diff?${i}`:`?${decodeURIComponent(T(new URLSearchParams,"preview",`diff&${i}`).toString())}`;return o||(o=r.jsxs("span",{children:["Go to Diff ",n?"":"Preview"," from: ",r.jsx("code",{children:l})," to:"," ",r.jsx("code",{children:c})]})),r.jsx(v,{to:u,children:o})}function De({file:e,type:t="playground",children:o=r.jsx("code",{children:e}),...n}){const i=P(),s=i[t]||i[i.type],a=r.jsxs("div",{className:"launch-editor-button-wrapper flex underline underline-offset-4",children:[o," ",r.jsx("svg",{height:24,width:24,children:r.jsx("use",{href:`${se}#Keyboard`})})]});return ENV.EPICSHOP_DEPLOYED&&s?r.jsx("div",{className:"inline-block grow",children:r.jsx(b,{appFile:e,appName:s.name,...n,children:a})}):s?r.jsx("div",{className:"inline-block grow",children:r.jsx(b,{appFile:e,appName:s.name,...n,children:a})}):t==="playground"?r.jsx(E,{content:"You must 'Set to Playground' before opening a file",children:r.jsx("div",{className:"inline-block grow cursor-not-allowed",children:a})}):r.jsx(r.Fragment,{children:"children"})}function ke(e){return e==="problem"?"problem":e==="solution"?"solution":"playground"}function _e({to:e,children:t=r.jsx("code",{children:e.toString()}),...o}){var m;const[n]=ge(),i=`?${T(n,"pathname",e.toString()).toString()}`,s=P(),a=ke(n.get("preview")),l=ve(),c=s[a],u=(c==null?void 0:c.dev.type)==="script"?ne({domain:l.domain,port:c.dev.portNumber}):((m=s.playground)==null?void 0:m.dev.type)==="browser"?s.playground.dev.pathname:null,{inBrowserBrowserRef:d}=Ee(),f=u?u.slice(0,-1)+e.toString():null;return r.jsxs("div",{className:"inline-flex items-center justify-between gap-1",children:[r.jsx(v,{to:i,...o,className:A(o.className,{"cursor-not-allowed":ENV.EPICSHOP_DEPLOYED}),title:ENV.EPICSHOP_DEPLOYED?"Cannot link to app in deployed version":void 0,onClick:x=>{var O,R;ENV.EPICSHOP_DEPLOYED&&x.preventDefault(),(O=o.onClick)==null||O.call(o,x),(R=d.current)==null||R.handleExtrnalNavigation(e.toString())},children:t}),f?r.jsx(E,{content:"Open in new tab",children:r.jsx("a",{href:f,target:"_blank",rel:"noreferrer",className:A("flex aspect-square items-center justify-center",{"cursor-not-allowed":ENV.EPICSHOP_DEPLOYED}),title:ENV.EPICSHOP_DEPLOYED?"Cannot link to app in deployed version":"Open in new tab",onClick:x=>{ENV.EPICSHOP_DEPLOYED&&x.preventDefault()},children:r.jsx(C,{name:"ExternalLink"})})}):null]})}var S="Popover",[M,vr]=ue(S,[k]),N=k(),[Ie,h]=M(S),H=e=>{const{__scopePopover:t,children:o,open:n,defaultOpen:i,onOpenChange:s,modal:a=!1}=e,l=N(t),c=p.useRef(null),[u,d]=p.useState(!1),[f,m]=ce({prop:n,defaultProp:i??!1,onChange:s,caller:S});return r.jsx(pe,{...l,children:r.jsx(Ie,{scope:t,contentId:de(),triggerRef:c,open:f,onOpenChange:m,onOpenToggle:p.useCallback(()=>m(x=>!x),[m]),hasCustomAnchor:u,onCustomAnchorAdd:p.useCallback(()=>d(!0),[]),onCustomAnchorRemove:p.useCallback(()=>d(!1),[]),modal:a,children:o})})};H.displayName=S;var U="PopoverAnchor",Le=p.forwardRef((e,t)=>{const{__scopePopover:o,...n}=e,i=h(U,o),s=N(o),{onCustomAnchorAdd:a,onCustomAnchorRemove:l}=i;return p.useEffect(()=>(a(),()=>l()),[a,l]),r.jsx(L,{...s,...n,ref:t})});Le.displayName=U;var V="PopoverTrigger",Y=p.forwardRef((e,t)=>{const{__scopePopover:o,...n}=e,i=h(V,o),s=N(o),a=_(t,i.triggerRef),l=r.jsx(I.button,{type:"button","aria-haspopup":"dialog","aria-expanded":i.open,"aria-controls":i.contentId,"data-state":W(i.open),...n,ref:a,onClick:j(e.onClick,i.onOpenToggle)});return i.hasCustomAnchor?l:r.jsx(L,{asChild:!0,...s,children:l})});Y.displayName=V;var y="PopoverPortal",[Fe,$e]=M(y,{forceMount:void 0}),B=e=>{const{__scopePopover:t,forceMount:o,children:n,container:i}=e,s=h(y,t);return r.jsx(Fe,{scope:t,forceMount:o,children:r.jsx(F,{present:o||s.open,children:r.jsx(je,{asChild:!0,container:i,children:n})})})};B.displayName=y;var g="PopoverContent",G=p.forwardRef((e,t)=>{const o=$e(g,e.__scopePopover),{forceMount:n=o.forceMount,...i}=e,s=h(g,e.__scopePopover);return r.jsx(F,{present:n||s.open,children:s.modal?r.jsx(Me,{...i,ref:t}):r.jsx(He,{...i,ref:t})})});G.displayName=g;var Te=fe("PopoverContent.RemoveScroll"),Me=p.forwardRef((e,t)=>{const o=h(g,e.__scopePopover),n=p.useRef(null),i=_(t,n),s=p.useRef(!1);return p.useEffect(()=>{const a=n.current;if(a)return Ne(a)},[]),r.jsx(be,{as:Te,allowPinchZoom:!0,children:r.jsx(q,{...e,ref:i,trapFocus:o.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:j(e.onCloseAutoFocus,a=>{var l;a.preventDefault(),s.current||(l=o.triggerRef.current)==null||l.focus()}),onPointerDownOutside:j(e.onPointerDownOutside,a=>{const l=a.detail.originalEvent,c=l.button===0&&l.ctrlKey===!0,u=l.button===2||c;s.current=u},{checkForDefaultPrevented:!1}),onFocusOutside:j(e.onFocusOutside,a=>a.preventDefault(),{checkForDefaultPrevented:!1})})})}),He=p.forwardRef((e,t)=>{const o=h(g,e.__scopePopover),n=p.useRef(!1),i=p.useRef(!1);return r.jsx(q,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:s=>{var a,l;(a=e.onCloseAutoFocus)==null||a.call(e,s),s.defaultPrevented||(n.current||(l=o.triggerRef.current)==null||l.focus(),s.preventDefault()),n.current=!1,i.current=!1},onInteractOutside:s=>{var c,u;(c=e.onInteractOutside)==null||c.call(e,s),s.defaultPrevented||(n.current=!0,s.detail.originalEvent.type==="pointerdown"&&(i.current=!0));const a=s.target;((u=o.triggerRef.current)==null?void 0:u.contains(a))&&s.preventDefault(),s.detail.originalEvent.type==="focusin"&&i.current&&s.preventDefault()}})}),q=p.forwardRef((e,t)=>{const{__scopePopover:o,trapFocus:n,onOpenAutoFocus:i,onCloseAutoFocus:s,disableOutsidePointerEvents:a,onEscapeKeyDown:l,onPointerDownOutside:c,onFocusOutside:u,onInteractOutside:d,...f}=e,m=h(g,o),x=N(o);return Se(),r.jsx(Ce,{asChild:!0,loop:!0,trapped:n,onMountAutoFocus:i,onUnmountAutoFocus:s,children:r.jsx(me,{asChild:!0,disableOutsidePointerEvents:a,onInteractOutside:d,onEscapeKeyDown:l,onPointerDownOutside:c,onFocusOutside:u,onDismiss:()=>m.onOpenChange(!1),children:r.jsx(xe,{"data-state":W(m.open),role:"dialog",id:m.contentId,...x,...f,ref:t,style:{...f.style,"--radix-popover-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-popover-content-available-width":"var(--radix-popper-available-width)","--radix-popover-content-available-height":"var(--radix-popper-available-height)","--radix-popover-trigger-width":"var(--radix-popper-anchor-width)","--radix-popover-trigger-height":"var(--radix-popper-anchor-height)"}})})})}),K="PopoverClose",Ue=p.forwardRef((e,t)=>{const{__scopePopover:o,...n}=e,i=h(K,o);return r.jsx(I.button,{type:"button",...n,ref:t,onClick:j(e.onClick,()=>i.onOpenChange(!1))})});Ue.displayName=K;var Ve="PopoverArrow",Ye=p.forwardRef((e,t)=>{const{__scopePopover:o,...n}=e,i=N(o);return r.jsx(he,{...i,...n,ref:t})});Ye.displayName=Ve;function W(e){return e?"open":"closed"}var Be=H,Ge=Y,qe=B,Ke=G;function We({diffFilesPromise:e}){var l,c;const t=P(),[o,n]=p.useState(!1),i=p.useRef(null);function s(){n(!1)}const a=(l=t.playground)==null?void 0:l.appName;return r.jsx(r.Fragment,{children:r.jsxs(Be,{open:o,onOpenChange:n,children:[r.jsx(Ge,{asChild:!0,children:r.jsxs("button",{className:"flex h-full items-center gap-1 border-r px-6 py-3 font-mono text-sm uppercase","aria-label":"Relevant Files",children:[r.jsx(C,{name:"Files"}),"Files"]})}),r.jsx(qe,{children:r.jsx(Ke,{ref:i,className:"slideRightContent lg:slideUpContent invert-theme z-10 select-none rounded bg-background px-9 py-8 text-foreground",align:"start",sideOffset:5,children:r.jsxs("div",{className:"launch-editor-wrapper",children:[r.jsx("strong",{className:"inline-block px-2 pb-4 font-semibold uppercase",children:"Relevant Files"}),t.problem&&((c=t.playground)==null?void 0:c.appName)!==t.problem.name?r.jsx("div",{className:"mb-2 rounded p-1 font-mono font-medium",children:r.jsx(D,{appName:t.problem.name})}):null,r.jsx("div",{id:"files",children:r.jsx(p.Suspense,{fallback:r.jsx(E,{content:"Loading diff",children:r.jsx("div",{className:"flex justify-center",children:r.jsx(C,{name:"Refresh",className:"h-8 w-8 animate-spin"})})}),children:r.jsx(Pe,{resolve:e,errorElement:r.jsx("div",{className:"text-foreground-destructive",children:"Something went wrong."}),children:u=>{if(!u)return r.jsx("p",{className:"text-foreground-destructive",children:"Unable to determine diff"});if(typeof u=="string")return r.jsx("p",{className:"text-foreground-destructive",children:u});if(!u.length)return r.jsx("p",{children:"No files changed"});const d=a||ENV.EPICSHOP_GITHUB_ROOT?{}:{title:"You must 'Set to Playground' before opening a file",className:"not-allowed"};return r.jsxs("ul",{...d,children:[u.length>1&&!ENV.EPICSHOP_DEPLOYED?r.jsx("div",{className:"mb-2 border-b border-b-gray-50 border-opacity-50 pb-2 font-sans",children:r.jsx(b,{appFile:u.map(f=>`${f.path},${f.line},1`),appName:"playground",onUpdate:s,children:r.jsx("p",{children:"Open All Files"})})}):null,u.map(f=>{var m;return r.jsx("li",{"data-state":f.status,children:r.jsx(b,{appFile:`${f.path},${f.line},1`,appName:ENV.EPICSHOP_DEPLOYED?((m=t.problem)==null?void 0:m.name)??"playground":"playground",onUpdate:s,children:r.jsx("code",{children:f.path})})},f.path)})]})}})})})]})})})]})})}function z(e,t){var a;const o=(e==null?void 0:e.exerciseStepApp.exerciseNumber.toString().padStart(2,"0"))??"00",n=(e==null?void 0:e.exerciseStepApp.stepNumber.toString().padStart(2,"0"))??"00",i={problem:"💪",solution:"🏁"}[(e==null?void 0:e.type)??"problem"],s=((a=e==null?void 0:e[e.type])==null?void 0:a.title)??"N/A";return{emoji:i,stepNumber:n,title:s,exerciseNumber:o,exerciseTitle:(e==null?void 0:e.exerciseTitle)??"Unknown exercise",workshopTitle:t,type:(e==null?void 0:e.type)??"problem"}}const gr=({data:e,matches:t,params:o})=>{var u;const n=(u=t.find(d=>d.id==="root"))==null?void 0:u.data;if(!e||!n)return[{title:"🦉 | Error"}];const{emoji:i,stepNumber:s,title:a,exerciseNumber:l,exerciseTitle:c}=z(e);return ae({title:`${i} | ${s}. ${a} | ${l}. ${c} | ${n.workshopTitle}`,description:`${o.type} step for exercise ${l}. ${c}`,ogTitle:a,ogDescription:`${c} step ${Number(s)} ${o.type}`,instructor:n.instructor,requestInfo:n.requestInfo})};function Pr(){var n;const e=P(),t=p.useRef(null),o=z(e);return ee({watchPaths:[`${e.exerciseStepApp.relativePath}/README.mdx`]}),r.jsx("div",{className:"flex max-w-full flex-grow flex-col",children:r.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:[r.jsxs("div",{className:"relative flex flex-col sm:col-span-1 sm:row-span-1 sm:h-full lg:border-r",children:[r.jsx("h1",{className:"h-14 border-b pl-10 pr-5 text-sm font-medium leading-tight",children:r.jsxs("div",{className:"flex h-14 flex-wrap items-center justify-between gap-x-2 py-2",children:[r.jsxs("div",{className:"flex items-center justify-start gap-x-2 uppercase",children:[r.jsxs(v,{to:ie(e.exerciseStepApp.exerciseNumber),className:"hover:underline",children:[o.exerciseNumber,". ",o.exerciseTitle]}),"/",r.jsxs(v,{to:".",className:"hover:underline",children:[o.stepNumber,". ",o.title," (",o.emoji," ",o.type,")"]})]}),e.problem&&((n=e.playground)==null?void 0:n.appName)!==e.problem.name?r.jsx("div",{className:"hidden md:block",children:r.jsx(D,{appName:e.problem.name})}):null]})}),r.jsxs("article",{id:e.articleId,className:"shadow-on-scrollbox flex h-full w-full max-w-none flex-1 scroll-pt-6 flex-col justify-between space-y-6 overflow-y-auto p-2 scrollbar-thin scrollbar-thumb-scrollbar sm:p-10 sm:pt-8",children:[e.exerciseStepApp.instructionsCode?r.jsx(Oe,{inBrowserBrowserRef:t}):r.jsx("div",{className:"flex h-full items-center justify-center text-lg",children:r.jsx("p",{children:"No instructions yet..."})}),r.jsxs("div",{className:"mt-auto flex justify-between",children:[e.prevStepLink?r.jsx(v,{to:e.prevStepLink.to,"aria-label":"Previous Step",prefetch:"intent",children:"← Previous"}):r.jsx("span",{}),e.nextStepLink?r.jsx(v,{to:e.nextStepLink.to,"aria-label":"Next Step",prefetch:"intent",children:"Next →"}):r.jsx("span",{})]})]},e.articleId),r.jsx(Z,{elementQuery:`#${e.articleId}`},`scroll-${e.articleId}`),e.type==="solution"?r.jsx(oe,{type:"step",exerciseNumber:e.exerciseStepApp.exerciseNumber,stepNumber:e.exerciseStepApp.stepNumber,className:"h-14 border-t px-6"}):null,r.jsxs("div",{className:"flex h-16 justify-between border-b-4 border-t lg:border-b-0",children:[r.jsx("div",{children:r.jsx("div",{className:"h-full",children:r.jsx(We,{diffFilesPromise:e.diffFiles})})}),r.jsx(te,{appName:e.exerciseStepApp.name,relativePath:e.exerciseStepApp.relativePath}),r.jsx(X,{prev:e.prevStepLink?{to:e.prevStepLink.to,"aria-label":"Previous Step"}:null,next:e.nextStepLink?{to:e.nextStepLink.to,"aria-label":"Next Step"}:null})]})]}),r.jsx(Q,{})]})})}function jr(){return r.jsx(J,{statusHandlers:{404:()=>r.jsx("p",{children:"Sorry, we couldn't find an app here."})}})}export{jr as ErrorBoundary,Pr as default,gr as meta};
2
- //# sourceMappingURL=_layout-QRe2q83m.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_layout-QRe2q83m.js","sources":["../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/step-mdx.tsx","../../../../../node_modules/@radix-ui/react-popover/dist/index.mjs","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/touched-files.tsx","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout.tsx"],"sourcesContent":["import {\n\tLink,\n\tuseLoaderData,\n\tuseSearchParams,\n\ttype LinkProps,\n} from '@remix-run/react'\nimport * as React from 'react'\nimport { type PropsWithChildren } from 'react'\nimport iconsSvg from '#app/assets/icons.svg'\nimport { EpicVideoInfoProvider } from '#app/components/epic-video.tsx'\nimport { Icon } from '#app/components/icons.tsx'\nimport { type InBrowserBrowserRef } from '#app/components/in-browser-browser.tsx'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.tsx'\nimport { LaunchEditor } from '#app/routes/launch-editor.tsx'\nimport { Mdx } from '#app/utils/mdx.tsx'\nimport { cn, getBaseUrl } from '#app/utils/misc.tsx'\nimport { useRequestInfo } from '#app/utils/request-info.ts'\nimport { type loader } from '../_layout.tsx'\n\ntype StepContextType = {\n\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n}\nconst StepContext = React.createContext<StepContextType | null>(null)\n\nfunction useStepContext() {\n\tconst context = React.useContext(StepContext)\n\tif (!context) {\n\t\tthrow new Error('useStepContext must be used within a StepContext.Provider')\n\t}\n\treturn context\n}\n\nfunction StepContextProvider({\n\tchildren,\n\tinBrowserBrowserRef,\n}: {\n\tchildren: React.ReactNode\n\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n}) {\n\treturn (\n\t\t<StepContext.Provider value={{ inBrowserBrowserRef }}>\n\t\t\t{children}\n\t\t</StepContext.Provider>\n\t)\n}\n\nconst stepMdxComponents = {\n\tDiffLink,\n\tPrevDiffLink,\n\tNextDiffLink,\n\tInlineFile,\n\tLinkToApp,\n}\n\nexport function StepMdx({\n\tinBrowserBrowserRef,\n}: {\n\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tif (!data.exerciseStepApp.instructionsCode) return null\n\treturn (\n\t\t<StepContextProvider inBrowserBrowserRef={inBrowserBrowserRef}>\n\t\t\t<EpicVideoInfoProvider epicVideoInfosPromise={data.epicVideoInfosPromise}>\n\t\t\t\t<div className=\"prose dark:prose-invert sm:prose-lg\">\n\t\t\t\t\t<Mdx\n\t\t\t\t\t\tcode={data.exerciseStepApp.instructionsCode}\n\t\t\t\t\t\tcomponents={stepMdxComponents}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</EpicVideoInfoProvider>\n\t\t</StepContextProvider>\n\t)\n}\n\nfunction withParam(\n\tsearchParams: URLSearchParams,\n\tkey: string,\n\tvalue: string | null,\n) {\n\tconst newSearchParams = new URLSearchParams(searchParams)\n\tif (value === null) {\n\t\tnewSearchParams.delete(key)\n\t} else {\n\t\tnewSearchParams.set(key, value)\n\t}\n\treturn newSearchParams\n}\n\nfunction NextDiffLink({\n\tapp = 0,\n\tfullPage = false,\n\tchildren,\n}: {\n\tapp: number\n\tfullPage?: boolean\n\tchildren?: React.ReactNode\n}) {\n\treturn (\n\t\t<DiffLink app1={app} app2={app + 1} fullPage={fullPage}>\n\t\t\t{children}\n\t\t</DiffLink>\n\t)\n}\n\nfunction PrevDiffLink({\n\tapp = -1,\n\tfullPage = false,\n\tchildren,\n}: {\n\tapp: number\n\tfullPage?: boolean\n\tchildren?: React.ReactNode\n}) {\n\treturn (\n\t\t<DiffLink app1={app} app2={app + 1} fullPage={fullPage}>\n\t\t\t{children}\n\t\t</DiffLink>\n\t)\n}\n\nfunction DiffLink({\n\tapp1 = 0,\n\tapp2 = 1,\n\tchildren,\n\tfullPage = false,\n\tto,\n}: {\n\tapp1?: string | number | null\n\tapp2?: string | number | null\n\tto?: string\n\tfullPage?: boolean\n\tchildren?: React.ReactNode\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tif (!to && !app1 && !app2) {\n\t\treturn (\n\t\t\t// @ts-expect-error 🤷‍♂️\n\t\t\t<callout-danger className=\"notification\">\n\t\t\t\t<div className=\"title\">DiffLink Error: invalid input</div>\n\t\t\t\t{/* @ts-expect-error 🤷‍♂️ */}\n\t\t\t</callout-danger>\n\t\t)\n\t}\n\n\tfunction getAppName(input: typeof app1) {\n\t\tif (typeof input === 'number') {\n\t\t\tconst stepIndex = data.exerciseIndex + input\n\t\t\treturn data.allApps[stepIndex]?.name\n\t\t}\n\t\tif (!input) return null\n\t\tfor (const { name, stepName } of data.allApps) {\n\t\t\tif (input === name || input === stepName) {\n\t\t\t\treturn name\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\tif (to) {\n\t\tconst params = new URLSearchParams(to)\n\t\tapp1 = params.get('app1')\n\t\tapp2 = params.get('app2')\n\t}\n\tconst app1Name = getAppName(app1)\n\tconst app2Name = getAppName(app2)\n\tif (!app1Name || !app2Name) {\n\t\treturn (\n\t\t\t// @ts-expect-error 🤷‍♂️\n\t\t\t<callout-danger className=\"notification\">\n\t\t\t\t<div className=\"title\">DiffLink Error: invalid input</div>\n\t\t\t\t{!app1Name && <div>app1: \"{app1}\" is not a valid app name</div>}\n\t\t\t\t{!app2Name && <div>app2: \"{app2}\" is not a valid app name</div>}\n\t\t\t\t{/* @ts-expect-error 🤷‍♂️ */}\n\t\t\t</callout-danger>\n\t\t)\n\t}\n\n\tif (!to) {\n\t\tto = `app1=${app1Name}&app2=${app2Name}`\n\t}\n\tconst pathToDiff = fullPage\n\t\t? `/diff?${to}`\n\t\t: `?${decodeURIComponent(\n\t\t\t\twithParam(new URLSearchParams(), 'preview', `diff&${to}`).toString(),\n\t\t\t)}`\n\n\tif (!children) {\n\t\tchildren = (\n\t\t\t<span>\n\t\t\t\tGo to Diff {fullPage ? '' : 'Preview'} from: <code>{app1Name}</code> to:{' '}\n\t\t\t\t<code>{app2Name}</code>\n\t\t\t</span>\n\t\t)\n\t}\n\n\treturn <Link to={pathToDiff}>{children}</Link>\n}\n\nfunction InlineFile({\n\tfile,\n\ttype = 'playground',\n\tchildren = <code>{file}</code>,\n\t...props\n}: Omit<PropsWithChildren<typeof LaunchEditor>, 'appName'> & {\n\tfile: string\n\ttype?: 'playground' | 'solution' | 'problem'\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\tconst app = data[type] || data[data.type]\n\n\tconst info = (\n\t\t<div className=\"launch-editor-button-wrapper flex underline underline-offset-4\">\n\t\t\t{children}{' '}\n\t\t\t<svg height={24} width={24}>\n\t\t\t\t<use href={`${iconsSvg}#Keyboard`} />\n\t\t\t</svg>\n\t\t</div>\n\t)\n\n\treturn ENV.EPICSHOP_DEPLOYED && app ? (\n\t\t<div className=\"inline-block grow\">\n\t\t\t<LaunchEditor appFile={file} appName={app.name} {...props}>\n\t\t\t\t{info}\n\t\t\t</LaunchEditor>\n\t\t</div>\n\t) : app ? (\n\t\t<div className=\"inline-block grow\">\n\t\t\t<LaunchEditor appFile={file} appName={app.name} {...props}>\n\t\t\t\t{info}\n\t\t\t</LaunchEditor>\n\t\t</div>\n\t) : type === 'playground' ? (\n\t\t// playground does not exist yet\n\t\t<SimpleTooltip content=\"You must 'Set to Playground' before opening a file\">\n\t\t\t<div className=\"inline-block grow cursor-not-allowed\">{info}</div>\n\t\t</SimpleTooltip>\n\t) : (\n\t\t<>children</>\n\t)\n}\n\nfunction getPreviewType(\n\tpreview: string | null,\n): 'playground' | 'problem' | 'solution' {\n\tif (preview === 'problem') return 'problem'\n\tif (preview === 'solution') return 'solution'\n\treturn 'playground'\n}\n\nfunction LinkToApp({\n\tto: appTo,\n\tchildren = <code>{appTo.toString()}</code>,\n\t...props\n}: LinkProps) {\n\tconst [searchParams] = useSearchParams()\n\tconst to = `?${withParam(\n\t\tsearchParams,\n\t\t'pathname',\n\t\tappTo.toString(),\n\t).toString()}`\n\tconst data = useLoaderData<typeof loader>()\n\tconst type = getPreviewType(searchParams.get('preview'))\n\tconst requestInfo = useRequestInfo()\n\tconst app = data[type]\n\tconst previewAppUrl =\n\t\tapp?.dev.type === 'script'\n\t\t\t? getBaseUrl({\n\t\t\t\t\tdomain: requestInfo.domain,\n\t\t\t\t\tport: app.dev.portNumber,\n\t\t\t\t})\n\t\t\t: data.playground?.dev.type === 'browser'\n\t\t\t\t? data.playground.dev.pathname\n\t\t\t\t: null\n\tconst { inBrowserBrowserRef } = useStepContext()\n\tconst href = previewAppUrl\n\t\t? previewAppUrl.slice(0, -1) + appTo.toString()\n\t\t: null\n\treturn (\n\t\t<div className=\"inline-flex items-center justify-between gap-1\">\n\t\t\t<Link\n\t\t\t\tto={to}\n\t\t\t\t{...props}\n\t\t\t\tclassName={cn(props.className, {\n\t\t\t\t\t'cursor-not-allowed': ENV.EPICSHOP_DEPLOYED,\n\t\t\t\t})}\n\t\t\t\ttitle={\n\t\t\t\t\tENV.EPICSHOP_DEPLOYED\n\t\t\t\t\t\t? 'Cannot link to app in deployed version'\n\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t\tonClick={(event) => {\n\t\t\t\t\tif (ENV.EPICSHOP_DEPLOYED) event.preventDefault()\n\n\t\t\t\t\tprops.onClick?.(event)\n\t\t\t\t\tinBrowserBrowserRef.current?.handleExtrnalNavigation(appTo.toString())\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</Link>\n\t\t\t{href ? (\n\t\t\t\t<SimpleTooltip content=\"Open in new tab\">\n\t\t\t\t\t<a\n\t\t\t\t\t\thref={href}\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t\tclassName={cn('flex aspect-square items-center justify-center', {\n\t\t\t\t\t\t\t'cursor-not-allowed': ENV.EPICSHOP_DEPLOYED,\n\t\t\t\t\t\t})}\n\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\tENV.EPICSHOP_DEPLOYED\n\t\t\t\t\t\t\t\t? 'Cannot link to app in deployed version'\n\t\t\t\t\t\t\t\t: 'Open in new tab'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\tif (ENV.EPICSHOP_DEPLOYED) event.preventDefault()\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"ExternalLink\" />\n\t\t\t\t\t</a>\n\t\t\t\t</SimpleTooltip>\n\t\t\t) : null}\n\t\t</div>\n\t)\n}\n","\"use client\";\n\n// src/popover.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { DismissableLayer } from \"@radix-ui/react-dismissable-layer\";\nimport { useFocusGuards } from \"@radix-ui/react-focus-guards\";\nimport { FocusScope } from \"@radix-ui/react-focus-scope\";\nimport { useId } from \"@radix-ui/react-id\";\nimport * as PopperPrimitive from \"@radix-ui/react-popper\";\nimport { createPopperScope } from \"@radix-ui/react-popper\";\nimport { Portal as PortalPrimitive } from \"@radix-ui/react-portal\";\nimport { Presence } from \"@radix-ui/react-presence\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { createSlot } from \"@radix-ui/react-slot\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { hideOthers } from \"aria-hidden\";\nimport { RemoveScroll } from \"react-remove-scroll\";\nimport { jsx } from \"react/jsx-runtime\";\nvar POPOVER_NAME = \"Popover\";\nvar [createPopoverContext, createPopoverScope] = createContextScope(POPOVER_NAME, [\n createPopperScope\n]);\nvar usePopperScope = createPopperScope();\nvar [PopoverProvider, usePopoverContext] = createPopoverContext(POPOVER_NAME);\nvar Popover = (props) => {\n const {\n __scopePopover,\n children,\n open: openProp,\n defaultOpen,\n onOpenChange,\n modal = false\n } = props;\n const popperScope = usePopperScope(__scopePopover);\n const triggerRef = React.useRef(null);\n const [hasCustomAnchor, setHasCustomAnchor] = React.useState(false);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: POPOVER_NAME\n });\n return /* @__PURE__ */ jsx(PopperPrimitive.Root, { ...popperScope, children: /* @__PURE__ */ jsx(\n PopoverProvider,\n {\n scope: __scopePopover,\n contentId: useId(),\n triggerRef,\n open,\n onOpenChange: setOpen,\n onOpenToggle: React.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]),\n hasCustomAnchor,\n onCustomAnchorAdd: React.useCallback(() => setHasCustomAnchor(true), []),\n onCustomAnchorRemove: React.useCallback(() => setHasCustomAnchor(false), []),\n modal,\n children\n }\n ) });\n};\nPopover.displayName = POPOVER_NAME;\nvar ANCHOR_NAME = \"PopoverAnchor\";\nvar PopoverAnchor = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...anchorProps } = props;\n const context = usePopoverContext(ANCHOR_NAME, __scopePopover);\n const popperScope = usePopperScope(__scopePopover);\n const { onCustomAnchorAdd, onCustomAnchorRemove } = context;\n React.useEffect(() => {\n onCustomAnchorAdd();\n return () => onCustomAnchorRemove();\n }, [onCustomAnchorAdd, onCustomAnchorRemove]);\n return /* @__PURE__ */ jsx(PopperPrimitive.Anchor, { ...popperScope, ...anchorProps, ref: forwardedRef });\n }\n);\nPopoverAnchor.displayName = ANCHOR_NAME;\nvar TRIGGER_NAME = \"PopoverTrigger\";\nvar PopoverTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...triggerProps } = props;\n const context = usePopoverContext(TRIGGER_NAME, __scopePopover);\n const popperScope = usePopperScope(__scopePopover);\n const composedTriggerRef = useComposedRefs(forwardedRef, context.triggerRef);\n const trigger = /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": context.open,\n \"aria-controls\": context.contentId,\n \"data-state\": getState(context.open),\n ...triggerProps,\n ref: composedTriggerRef,\n onClick: composeEventHandlers(props.onClick, context.onOpenToggle)\n }\n );\n return context.hasCustomAnchor ? trigger : /* @__PURE__ */ jsx(PopperPrimitive.Anchor, { asChild: true, ...popperScope, children: trigger });\n }\n);\nPopoverTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"PopoverPortal\";\nvar [PortalProvider, usePortalContext] = createPopoverContext(PORTAL_NAME, {\n forceMount: void 0\n});\nvar PopoverPortal = (props) => {\n const { __scopePopover, forceMount, children, container } = props;\n const context = usePopoverContext(PORTAL_NAME, __scopePopover);\n return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopePopover, forceMount, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(PortalPrimitive, { asChild: true, container, children }) }) });\n};\nPopoverPortal.displayName = PORTAL_NAME;\nvar CONTENT_NAME = \"PopoverContent\";\nvar PopoverContent = React.forwardRef(\n (props, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopePopover);\n const { forceMount = portalContext.forceMount, ...contentProps } = props;\n const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);\n return /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: context.modal ? /* @__PURE__ */ jsx(PopoverContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(PopoverContentNonModal, { ...contentProps, ref: forwardedRef }) });\n }\n);\nPopoverContent.displayName = CONTENT_NAME;\nvar Slot = createSlot(\"PopoverContent.RemoveScroll\");\nvar PopoverContentModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);\n const contentRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, contentRef);\n const isRightClickOutsideRef = React.useRef(false);\n React.useEffect(() => {\n const content = contentRef.current;\n if (content) return hideOthers(content);\n }, []);\n return /* @__PURE__ */ jsx(RemoveScroll, { as: Slot, allowPinchZoom: true, children: /* @__PURE__ */ jsx(\n PopoverContentImpl,\n {\n ...props,\n ref: composedRefs,\n trapFocus: context.open,\n disableOutsidePointerEvents: true,\n onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {\n event.preventDefault();\n if (!isRightClickOutsideRef.current) context.triggerRef.current?.focus();\n }),\n onPointerDownOutside: composeEventHandlers(\n props.onPointerDownOutside,\n (event) => {\n const originalEvent = event.detail.originalEvent;\n const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;\n const isRightClick = originalEvent.button === 2 || ctrlLeftClick;\n isRightClickOutsideRef.current = isRightClick;\n },\n { checkForDefaultPrevented: false }\n ),\n onFocusOutside: composeEventHandlers(\n props.onFocusOutside,\n (event) => event.preventDefault(),\n { checkForDefaultPrevented: false }\n )\n }\n ) });\n }\n);\nvar PopoverContentNonModal = React.forwardRef(\n (props, forwardedRef) => {\n const context = usePopoverContext(CONTENT_NAME, props.__scopePopover);\n const hasInteractedOutsideRef = React.useRef(false);\n const hasPointerDownOutsideRef = React.useRef(false);\n return /* @__PURE__ */ jsx(\n PopoverContentImpl,\n {\n ...props,\n ref: forwardedRef,\n trapFocus: false,\n disableOutsidePointerEvents: false,\n onCloseAutoFocus: (event) => {\n props.onCloseAutoFocus?.(event);\n if (!event.defaultPrevented) {\n if (!hasInteractedOutsideRef.current) context.triggerRef.current?.focus();\n event.preventDefault();\n }\n hasInteractedOutsideRef.current = false;\n hasPointerDownOutsideRef.current = false;\n },\n onInteractOutside: (event) => {\n props.onInteractOutside?.(event);\n if (!event.defaultPrevented) {\n hasInteractedOutsideRef.current = true;\n if (event.detail.originalEvent.type === \"pointerdown\") {\n hasPointerDownOutsideRef.current = true;\n }\n }\n const target = event.target;\n const targetIsTrigger = context.triggerRef.current?.contains(target);\n if (targetIsTrigger) event.preventDefault();\n if (event.detail.originalEvent.type === \"focusin\" && hasPointerDownOutsideRef.current) {\n event.preventDefault();\n }\n }\n }\n );\n }\n);\nvar PopoverContentImpl = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopePopover,\n trapFocus,\n onOpenAutoFocus,\n onCloseAutoFocus,\n disableOutsidePointerEvents,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onInteractOutside,\n ...contentProps\n } = props;\n const context = usePopoverContext(CONTENT_NAME, __scopePopover);\n const popperScope = usePopperScope(__scopePopover);\n useFocusGuards();\n return /* @__PURE__ */ jsx(\n FocusScope,\n {\n asChild: true,\n loop: true,\n trapped: trapFocus,\n onMountAutoFocus: onOpenAutoFocus,\n onUnmountAutoFocus: onCloseAutoFocus,\n children: /* @__PURE__ */ jsx(\n DismissableLayer,\n {\n asChild: true,\n disableOutsidePointerEvents,\n onInteractOutside,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onDismiss: () => context.onOpenChange(false),\n children: /* @__PURE__ */ jsx(\n PopperPrimitive.Content,\n {\n \"data-state\": getState(context.open),\n role: \"dialog\",\n id: context.contentId,\n ...popperScope,\n ...contentProps,\n ref: forwardedRef,\n style: {\n ...contentProps.style,\n // re-namespace exposed content custom properties\n ...{\n \"--radix-popover-content-transform-origin\": \"var(--radix-popper-transform-origin)\",\n \"--radix-popover-content-available-width\": \"var(--radix-popper-available-width)\",\n \"--radix-popover-content-available-height\": \"var(--radix-popper-available-height)\",\n \"--radix-popover-trigger-width\": \"var(--radix-popper-anchor-width)\",\n \"--radix-popover-trigger-height\": \"var(--radix-popper-anchor-height)\"\n }\n }\n }\n )\n }\n )\n }\n );\n }\n);\nvar CLOSE_NAME = \"PopoverClose\";\nvar PopoverClose = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...closeProps } = props;\n const context = usePopoverContext(CLOSE_NAME, __scopePopover);\n return /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n ...closeProps,\n ref: forwardedRef,\n onClick: composeEventHandlers(props.onClick, () => context.onOpenChange(false))\n }\n );\n }\n);\nPopoverClose.displayName = CLOSE_NAME;\nvar ARROW_NAME = \"PopoverArrow\";\nvar PopoverArrow = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopePopover, ...arrowProps } = props;\n const popperScope = usePopperScope(__scopePopover);\n return /* @__PURE__ */ jsx(PopperPrimitive.Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef });\n }\n);\nPopoverArrow.displayName = ARROW_NAME;\nfunction getState(open) {\n return open ? \"open\" : \"closed\";\n}\nvar Root2 = Popover;\nvar Anchor2 = PopoverAnchor;\nvar Trigger = PopoverTrigger;\nvar Portal = PopoverPortal;\nvar Content2 = PopoverContent;\nvar Close = PopoverClose;\nvar Arrow2 = PopoverArrow;\nexport {\n Anchor2 as Anchor,\n Arrow2 as Arrow,\n Close,\n Content2 as Content,\n Popover,\n PopoverAnchor,\n PopoverArrow,\n PopoverClose,\n PopoverContent,\n PopoverPortal,\n PopoverTrigger,\n Portal,\n Root2 as Root,\n Trigger,\n createPopoverScope\n};\n//# sourceMappingURL=index.mjs.map\n","import * as Popover from '@radix-ui/react-popover'\nimport { type SerializeFrom } from '@remix-run/node'\nimport { Await, useLoaderData } from '@remix-run/react'\nimport * as React from 'react'\nimport { Icon } from '#app/components/icons.tsx'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.tsx'\nimport { LaunchEditor } from '#app/routes/launch-editor.tsx'\nimport { SetAppToPlayground } from '#app/routes/set-playground.tsx'\nimport { type loader } from '../_layout.tsx'\n\nfunction TouchedFiles({\n\tdiffFilesPromise,\n}: {\n\tdiffFilesPromise: SerializeFrom<typeof loader>['diffFiles']\n}) {\n\tconst data = useLoaderData<typeof loader>()\n\n\tconst [open, setOpen] = React.useState(false)\n\tconst contentRef = React.useRef<HTMLDivElement>(null)\n\n\tfunction handleLaunchUpdate() {\n\t\tsetOpen(false)\n\t}\n\n\tconst appName = data.playground?.appName\n\n\treturn (\n\t\t<>\n\t\t\t<Popover.Root open={open} onOpenChange={setOpen}>\n\t\t\t\t<Popover.Trigger asChild>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclassName=\"flex h-full items-center gap-1 border-r px-6 py-3 font-mono text-sm uppercase\"\n\t\t\t\t\t\taria-label=\"Relevant Files\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"Files\" />\n\t\t\t\t\t\tFiles\n\t\t\t\t\t</button>\n\t\t\t\t</Popover.Trigger>\n\t\t\t\t<Popover.Portal>\n\t\t\t\t\t<Popover.Content\n\t\t\t\t\t\tref={contentRef}\n\t\t\t\t\t\tclassName=\"slideRightContent lg:slideUpContent invert-theme z-10 select-none rounded bg-background px-9 py-8 text-foreground\"\n\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\tsideOffset={5}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"launch-editor-wrapper\">\n\t\t\t\t\t\t\t<strong className=\"inline-block px-2 pb-4 font-semibold uppercase\">\n\t\t\t\t\t\t\t\tRelevant Files\n\t\t\t\t\t\t\t</strong>\n\t\t\t\t\t\t\t{data.problem &&\n\t\t\t\t\t\t\tdata.playground?.appName !== data.problem.name ? (\n\t\t\t\t\t\t\t\t<div className=\"mb-2 rounded p-1 font-mono font-medium\">\n\t\t\t\t\t\t\t\t\t<SetAppToPlayground appName={data.problem.name} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t<div id=\"files\">\n\t\t\t\t\t\t\t\t<React.Suspense\n\t\t\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t\t\t<SimpleTooltip content=\"Loading diff\">\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex justify-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Icon name=\"Refresh\" className=\"h-8 w-8 animate-spin\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Await\n\t\t\t\t\t\t\t\t\t\tresolve={diffFilesPromise}\n\t\t\t\t\t\t\t\t\t\terrorElement={\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-foreground-destructive\">\n\t\t\t\t\t\t\t\t\t\t\t\tSomething went wrong.\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{(diffFiles) => {\n\t\t\t\t\t\t\t\t\t\t\tif (!diffFiles) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-foreground-destructive\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tUnable to determine diff\n\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif (typeof diffFiles === 'string') {\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-foreground-destructive\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{diffFiles}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif (!diffFiles.length) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn <p>No files changed</p>\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tconst props =\n\t\t\t\t\t\t\t\t\t\t\t\tappName || ENV.EPICSHOP_GITHUB_ROOT\n\t\t\t\t\t\t\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"You must 'Set to Playground' before opening a file\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName: 'not-allowed',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<ul {...props}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{diffFiles.length > 1 && !ENV.EPICSHOP_DEPLOYED ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"mb-2 border-b border-b-gray-50 border-opacity-50 pb-2 font-sans\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<LaunchEditor\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tappFile={diffFiles.map(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(file) => `${file.path},${file.line},1`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tappName=\"playground\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonUpdate={handleLaunchUpdate}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p>Open All Files</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</LaunchEditor>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{diffFiles.map((file) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<li key={file.path} data-state={file.status}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<LaunchEditor\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tappFile={`${file.path},${file.line},1`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tappName={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tENV.EPICSHOP_DEPLOYED\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? (data.problem?.name ?? 'playground')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'playground'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonUpdate={handleLaunchUpdate}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<code>{file.path}</code>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</LaunchEditor>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t</Await>\n\t\t\t\t\t\t\t\t</React.Suspense>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Popover.Content>\n\t\t\t\t</Popover.Portal>\n\t\t\t</Popover.Root>\n\t\t</>\n\t)\n}\n\nexport default TouchedFiles\n","import { ElementScrollRestoration } from '@epic-web/restore-scroll'\nimport {\n\tgetAppDisplayName,\n\tgetAppPageRoute,\n\tgetApps,\n\tgetExerciseApp,\n\tgetNextExerciseApp,\n\tgetPrevExerciseApp,\n\tisExerciseStepApp,\n\tisPlaygroundApp,\n\trequireExercise,\n\trequireExerciseApp,\n\ttype App,\n\ttype ExerciseStepApp,\n} from '@epic-web/workshop-utils/apps.server'\nimport { getWorkshopConfig } from '@epic-web/workshop-utils/config.server'\nimport { getDiffFiles } from '@epic-web/workshop-utils/diff.server'\nimport { getEpicVideoInfos } from '@epic-web/workshop-utils/epic-api.server'\nimport {\n\tcombineServerTimings,\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport {\n\tunstable_data as data,\n\tredirect,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n\ttype MetaFunction,\n\ttype SerializeFrom,\n} from '@remix-run/node'\nimport { Link, Outlet, useLoaderData } from '@remix-run/react'\nimport slugify from '@sindresorhus/slugify'\nimport { useRef } from 'react'\nimport { GeneralErrorBoundary } from '#app/components/error-boundary.tsx'\nimport { type InBrowserBrowserRef } from '#app/components/in-browser-browser.tsx'\nimport { NavChevrons } from '#app/components/nav-chevrons.tsx'\nimport { useRevalidationWS } from '#app/components/revalidation-ws.js'\nimport { type loader as rootLoader } from '#app/root.tsx'\nimport { EditFileOnGitHub } from '#app/routes/launch-editor.tsx'\nimport { ProgressToggle } from '#app/routes/progress.tsx'\nimport { SetAppToPlayground } from '#app/routes/set-playground.tsx'\nimport { getExercisePath } from '#app/utils/misc.tsx'\nimport { getSeoMetaTags } from '#app/utils/seo.js'\nimport { StepMdx } from './__shared/step-mdx.tsx'\nimport TouchedFiles from './__shared/touched-files.tsx'\n\nfunction pageTitle(\n\tdata: SerializeFrom<typeof loader> | undefined,\n\tworkshopTitle?: string,\n) {\n\tconst exerciseNumber =\n\t\tdata?.exerciseStepApp.exerciseNumber.toString().padStart(2, '0') ?? '00'\n\tconst stepNumber =\n\t\tdata?.exerciseStepApp.stepNumber.toString().padStart(2, '0') ?? '00'\n\tconst emoji = (\n\t\t{\n\t\t\tproblem: '💪',\n\t\t\tsolution: '🏁',\n\t\t} as const\n\t)[data?.type ?? 'problem']\n\tconst title = data?.[data.type]?.title ?? 'N/A'\n\treturn {\n\t\temoji,\n\t\tstepNumber,\n\t\ttitle,\n\t\texerciseNumber,\n\t\texerciseTitle: data?.exerciseTitle ?? 'Unknown exercise',\n\t\tworkshopTitle,\n\t\ttype: data?.type ?? 'problem',\n\t}\n}\n\nexport const meta: MetaFunction<typeof loader, { root: typeof rootLoader }> = ({\n\tdata,\n\tmatches,\n\tparams,\n}) => {\n\tconst rootData = matches.find((m) => m.id === 'root')?.data\n\tif (!data || !rootData) return [{ title: '🦉 | Error' }]\n\tconst { emoji, stepNumber, title, exerciseNumber, exerciseTitle } =\n\t\tpageTitle(data)\n\n\treturn getSeoMetaTags({\n\t\ttitle: `${emoji} | ${stepNumber}. ${title} | ${exerciseNumber}. ${exerciseTitle} | ${rootData.workshopTitle}`,\n\t\tdescription: `${params.type} step for exercise ${exerciseNumber}. ${exerciseTitle}`,\n\t\togTitle: title,\n\t\togDescription: `${exerciseTitle} step ${Number(stepNumber)} ${params.type}`,\n\t\tinstructor: rootData.instructor,\n\t\trequestInfo: rootData.requestInfo,\n\t})\n}\n\nexport async function loader({ request, params }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('exerciseStepTypeLayoutLoader')\n\tconst url = new URL(request.url)\n\tconst { title: workshopTitle } = getWorkshopConfig()\n\tconst cacheOptions = { request, timings }\n\tconst exerciseStepApp = await requireExerciseApp(params, cacheOptions)\n\tconst exercise = await requireExercise(\n\t\texerciseStepApp.exerciseNumber,\n\t\tcacheOptions,\n\t)\n\tconst reqUrl = new URL(request.url)\n\n\tconst pathnameParam = reqUrl.searchParams.get('pathname')\n\tif (pathnameParam === '' || pathnameParam === '/') {\n\t\treqUrl.searchParams.delete('pathname')\n\t\tthrow redirect(reqUrl.toString())\n\t}\n\n\tconst problemApp = await getExerciseApp(\n\t\t{ ...params, type: 'problem' },\n\t\tcacheOptions,\n\t)\n\tconst solutionApp = await getExerciseApp(\n\t\t{ ...params, type: 'solution' },\n\t\tcacheOptions,\n\t)\n\n\tif (!problemApp && !solutionApp) {\n\t\tthrow new Response('Not found', { status: 404 })\n\t}\n\n\tconst allAppsFull = await getApps(cacheOptions)\n\tconst playgroundApp = allAppsFull.find(isPlaygroundApp)\n\n\tfunction getStepId(a: ExerciseStepApp) {\n\t\treturn (\n\t\t\ta.exerciseNumber * 1000 +\n\t\t\ta.stepNumber * 10 +\n\t\t\t(a.type === 'problem' ? 0 : 1)\n\t\t)\n\t}\n\n\tfunction getStepNameAndId(a: App) {\n\t\tif (isExerciseStepApp(a)) {\n\t\t\tconst exerciseNumberStr = String(a.exerciseNumber).padStart(2, '0')\n\t\t\tconst stepNumberStr = String(a.stepNumber).padStart(2, '0')\n\n\t\t\treturn {\n\t\t\t\tstepName: `${exerciseNumberStr}/${stepNumberStr}.${a.type}`,\n\t\t\t\tstepId: getStepId(a),\n\t\t\t}\n\t\t}\n\t\treturn { stepName: '', stepId: -1 }\n\t}\n\n\tconst allApps = allAppsFull\n\t\t.filter((a, i, ar) => ar.findIndex((b) => a.name === b.name) === i)\n\t\t.map((a) => ({\n\t\t\tdisplayName: getAppDisplayName(a, allAppsFull),\n\t\t\tname: a.name,\n\t\t\ttitle: a.title,\n\t\t\ttype: a.type,\n\t\t\t...getStepNameAndId(a),\n\t\t}))\n\n\tallApps.sort((a, b) => {\n\t\t// order them by their stepId\n\t\tif (a.stepId > 0 && b.stepId > 0) return a.stepId - b.stepId\n\n\t\t// non-step apps should come after step apps\n\t\tif (a.stepId > 0) return -1\n\t\tif (b.stepId > 0) return 1\n\n\t\treturn 0\n\t})\n\tconst exerciseId = getStepId(exerciseStepApp)\n\tconst exerciseIndex = allApps.findIndex((step) => step.stepId === exerciseId)\n\n\tconst exerciseApps = allAppsFull\n\t\t.filter(isExerciseStepApp)\n\t\t.filter((app) => app.exerciseNumber === exerciseStepApp.exerciseNumber)\n\tconst isLastStep =\n\t\texerciseApps[exerciseApps.length - 1]?.name === exerciseStepApp.name\n\tconst isFirstStep = exerciseApps[0]?.name === exerciseStepApp.name\n\n\tconst nextApp = await getNextExerciseApp(exerciseStepApp, cacheOptions)\n\tconst prevApp = await getPrevExerciseApp(exerciseStepApp, cacheOptions)\n\n\tconst articleId = `workshop-${slugify(workshopTitle)}-${\n\t\texercise.exerciseNumber\n\t}-${exerciseStepApp.stepNumber}-${exerciseStepApp.type}`\n\n\tconst subroute = url.pathname.split(\n\t\t`/exercise/${params.exerciseNumber}/${params.stepNumber}/${params.type}/`,\n\t)[1]\n\treturn data(\n\t\t{\n\t\t\tarticleId,\n\t\t\ttype: params.type as 'problem' | 'solution',\n\t\t\texerciseStepApp,\n\t\t\texerciseTitle: exercise.title,\n\t\t\tepicVideoInfosPromise: getEpicVideoInfos(exerciseStepApp.epicVideoEmbeds),\n\t\t\texerciseIndex,\n\t\t\tallApps,\n\t\t\tprevStepLink: isFirstStep\n\t\t\t\t? {\n\t\t\t\t\t\tto: `/exercise/${exerciseStepApp.exerciseNumber\n\t\t\t\t\t\t\t.toString()\n\t\t\t\t\t\t\t.padStart(2, '0')}`,\n\t\t\t\t\t}\n\t\t\t\t: prevApp\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tto: getAppPageRoute(prevApp, {\n\t\t\t\t\t\t\t\tsubroute,\n\t\t\t\t\t\t\t\tsearchParams: url.searchParams,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t}\n\t\t\t\t\t: null,\n\t\t\tnextStepLink: isLastStep\n\t\t\t\t? {\n\t\t\t\t\t\tto: `/exercise/${exerciseStepApp.exerciseNumber\n\t\t\t\t\t\t\t.toString()\n\t\t\t\t\t\t\t.padStart(2, '0')}/finished`,\n\t\t\t\t\t}\n\t\t\t\t: nextApp\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tto: getAppPageRoute(nextApp, {\n\t\t\t\t\t\t\t\tsubroute,\n\t\t\t\t\t\t\t\tsearchParams: url.searchParams,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t}\n\t\t\t\t\t: null,\n\t\t\tplayground: playgroundApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'playground',\n\t\t\t\t\t\tappName: playgroundApp.appName,\n\t\t\t\t\t\tname: playgroundApp.name,\n\t\t\t\t\t\tfullPath: playgroundApp.fullPath,\n\t\t\t\t\t\tdev: playgroundApp.dev,\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tproblem: problemApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'problem',\n\t\t\t\t\t\ttitle: problemApp.title,\n\t\t\t\t\t\tname: problemApp.name,\n\t\t\t\t\t\tfullPath: problemApp.fullPath,\n\t\t\t\t\t\tdev: problemApp.dev,\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tsolution: solutionApp\n\t\t\t\t? ({\n\t\t\t\t\t\ttype: 'solution',\n\t\t\t\t\t\ttitle: solutionApp.title,\n\t\t\t\t\t\tname: solutionApp.name,\n\t\t\t\t\t\tfullPath: solutionApp.fullPath,\n\t\t\t\t\t\tdev: solutionApp.dev,\n\t\t\t\t\t} as const)\n\t\t\t\t: null,\n\t\t\tdiffFiles:\n\t\t\t\tproblemApp && solutionApp\n\t\t\t\t\t? getDiffFiles(problemApp, solutionApp, {\n\t\t\t\t\t\t\t...cacheOptions,\n\t\t\t\t\t\t\tforceFresh: url.searchParams.get('forceFresh') === 'diff',\n\t\t\t\t\t\t}).catch((e) => {\n\t\t\t\t\t\t\tconsole.error(e)\n\t\t\t\t\t\t\treturn 'There was a problem generating the diff (check the terminal output)'\n\t\t\t\t\t\t})\n\t\t\t\t\t: 'No diff available',\n\t\t} as const,\n\t\t{\n\t\t\theaders: {\n\t\t\t\t'Server-Timing': getServerTimeHeader(timings),\n\t\t\t},\n\t\t},\n\t)\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders, parentHeaders }) => {\n\tconst headers = {\n\t\t'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nexport default function ExercisePartRoute() {\n\tconst data = useLoaderData<typeof loader>()\n\n\tconst inBrowserBrowserRef = useRef<InBrowserBrowserRef>(null)\n\n\tconst titleBits = pageTitle(data)\n\n\tuseRevalidationWS({\n\t\twatchPaths: [`${data.exerciseStepApp.relativePath}/README.mdx`],\n\t})\n\n\treturn (\n\t\t<div className=\"flex max-w-full flex-grow flex-col\">\n\t\t\t<main className=\"flex flex-grow flex-col sm:grid sm:h-full sm:min-h-[800px] sm:grid-cols-1 sm:grid-rows-2 md:min-h-[unset] lg:grid-cols-2 lg:grid-rows-1\">\n\t\t\t\t<div className=\"relative flex flex-col sm:col-span-1 sm:row-span-1 sm:h-full lg:border-r\">\n\t\t\t\t\t<h1 className=\"h-14 border-b pl-10 pr-5 text-sm font-medium leading-tight\">\n\t\t\t\t\t\t<div className=\"flex h-14 flex-wrap items-center justify-between gap-x-2 py-2\">\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-start gap-x-2 uppercase\">\n\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\tto={getExercisePath(data.exerciseStepApp.exerciseNumber)}\n\t\t\t\t\t\t\t\t\tclassName=\"hover:underline\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{titleBits.exerciseNumber}. {titleBits.exerciseTitle}\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t{'/'}\n\t\t\t\t\t\t\t\t<Link to=\".\" className=\"hover:underline\">\n\t\t\t\t\t\t\t\t\t{titleBits.stepNumber}. {titleBits.title}\n\t\t\t\t\t\t\t\t\t{' ('}\n\t\t\t\t\t\t\t\t\t{titleBits.emoji} {titleBits.type}\n\t\t\t\t\t\t\t\t\t{')'}\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{data.problem &&\n\t\t\t\t\t\t\tdata.playground?.appName !== data.problem.name ? (\n\t\t\t\t\t\t\t\t<div className=\"hidden md:block\">\n\t\t\t\t\t\t\t\t\t<SetAppToPlayground appName={data.problem.name} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</h1>\n\t\t\t\t\t<article\n\t\t\t\t\t\tid={data.articleId}\n\t\t\t\t\t\tkey={data.articleId}\n\t\t\t\t\t\tclassName=\"shadow-on-scrollbox flex h-full w-full max-w-none flex-1 scroll-pt-6 flex-col justify-between space-y-6 overflow-y-auto p-2 scrollbar-thin scrollbar-thumb-scrollbar sm:p-10 sm:pt-8\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{data.exerciseStepApp.instructionsCode ? (\n\t\t\t\t\t\t\t<StepMdx inBrowserBrowserRef={inBrowserBrowserRef} />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div className=\"flex h-full items-center justify-center text-lg\">\n\t\t\t\t\t\t\t\t<p>No instructions yet...</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<div className=\"mt-auto flex justify-between\">\n\t\t\t\t\t\t\t{data.prevStepLink ? (\n\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\tto={data.prevStepLink.to}\n\t\t\t\t\t\t\t\t\taria-label=\"Previous Step\"\n\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t← Previous\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<span />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{data.nextStepLink ? (\n\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\tto={data.nextStepLink.to}\n\t\t\t\t\t\t\t\t\taria-label=\"Next Step\"\n\t\t\t\t\t\t\t\t\tprefetch=\"intent\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tNext →\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<span />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</article>\n\t\t\t\t\t<ElementScrollRestoration\n\t\t\t\t\t\telementQuery={`#${data.articleId}`}\n\t\t\t\t\t\tkey={`scroll-${data.articleId}`}\n\t\t\t\t\t/>\n\t\t\t\t\t{data.type === 'solution' ? (\n\t\t\t\t\t\t<ProgressToggle\n\t\t\t\t\t\t\ttype=\"step\"\n\t\t\t\t\t\t\texerciseNumber={data.exerciseStepApp.exerciseNumber}\n\t\t\t\t\t\t\tstepNumber={data.exerciseStepApp.stepNumber}\n\t\t\t\t\t\t\tclassName=\"h-14 border-t px-6\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<div className=\"flex h-16 justify-between border-b-4 border-t lg:border-b-0\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<div className=\"h-full\">\n\t\t\t\t\t\t\t\t<TouchedFiles diffFilesPromise={data.diffFiles} />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<EditFileOnGitHub\n\t\t\t\t\t\t\tappName={data.exerciseStepApp.name}\n\t\t\t\t\t\t\trelativePath={data.exerciseStepApp.relativePath}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<NavChevrons\n\t\t\t\t\t\t\tprev={\n\t\t\t\t\t\t\t\tdata.prevStepLink\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\tto: data.prevStepLink.to,\n\t\t\t\t\t\t\t\t\t\t\t'aria-label': 'Previous Step',\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnext={\n\t\t\t\t\t\t\t\tdata.nextStepLink\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\tto: data.nextStepLink.to,\n\t\t\t\t\t\t\t\t\t\t\t'aria-label': 'Next Step',\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<Outlet />\n\t\t\t</main>\n\t\t</div>\n\t)\n}\n\nexport function ErrorBoundary() {\n\treturn (\n\t\t<GeneralErrorBoundary\n\t\t\tstatusHandlers={{\n\t\t\t\t404: () => <p>Sorry, we couldn't find an app here.</p>,\n\t\t\t}}\n\t\t/>\n\t)\n}\n"],"names":["StepContext","React.createContext","useStepContext","context","React.useContext","StepContextProvider","children","inBrowserBrowserRef","jsx","stepMdxComponents","DiffLink","PrevDiffLink","NextDiffLink","InlineFile","LinkToApp","StepMdx","data","useLoaderData","EpicVideoInfoProvider","Mdx","withParam","searchParams","key","value","newSearchParams","app","fullPage","app1","app2","to","getAppName","input","stepIndex","_a","name","stepName","params","app1Name","app2Name","jsxs","pathToDiff","Link","file","type","props","info","iconsSvg","LaunchEditor","SimpleTooltip","getPreviewType","preview","appTo","useSearchParams","requestInfo","useRequestInfo","previewAppUrl","getBaseUrl","href","cn","event","_b","Icon","POPOVER_NAME","createPopoverContext","createPopoverScope","createContextScope","createPopperScope","usePopperScope","PopoverProvider","usePopoverContext","Popover","__scopePopover","openProp","defaultOpen","onOpenChange","modal","popperScope","triggerRef","React.useRef","hasCustomAnchor","setHasCustomAnchor","React.useState","open","setOpen","useControllableState","PopperPrimitive.Root","useId","React.useCallback","prevOpen","ANCHOR_NAME","PopoverAnchor","React.forwardRef","forwardedRef","anchorProps","onCustomAnchorAdd","onCustomAnchorRemove","React.useEffect","PopperPrimitive.Anchor","TRIGGER_NAME","PopoverTrigger","triggerProps","composedTriggerRef","useComposedRefs","trigger","Primitive","getState","composeEventHandlers","PORTAL_NAME","PortalProvider","usePortalContext","PopoverPortal","forceMount","container","Presence","PortalPrimitive","CONTENT_NAME","PopoverContent","portalContext","contentProps","PopoverContentModal","PopoverContentNonModal","Slot","createSlot","contentRef","composedRefs","isRightClickOutsideRef","content","hideOthers","RemoveScroll","PopoverContentImpl","originalEvent","ctrlLeftClick","isRightClick","hasInteractedOutsideRef","hasPointerDownOutsideRef","target","trapFocus","onOpenAutoFocus","onCloseAutoFocus","disableOutsidePointerEvents","onEscapeKeyDown","onPointerDownOutside","onFocusOutside","onInteractOutside","useFocusGuards","FocusScope","DismissableLayer","PopperPrimitive.Content","CLOSE_NAME","PopoverClose","closeProps","ARROW_NAME","PopoverArrow","arrowProps","PopperPrimitive.Arrow","Root2","Trigger","Portal","Content2","TouchedFiles","diffFilesPromise","handleLaunchUpdate","appName","Popover.Root","Popover.Trigger","Popover.Portal","Popover.Content","SetAppToPlayground","React.Suspense","Await","diffFiles","pageTitle","workshopTitle","exerciseNumber","exerciseStepApp","toString","padStart","stepNumber","emoji","problem","solution","title","exerciseTitle","meta","matches","rootData","find","m","id","getSeoMetaTags","description","ogTitle","ogDescription","Number","instructor","ExercisePartRoute","useRef","titleBits","useRevalidationWS","watchPaths","relativePath","className","getExercisePath","playground","articleId","instructionsCode","prevStepLink","prefetch","nextStepLink","ElementScrollRestoration","elementQuery","ProgressToggle","EditFileOnGitHub","NavChevrons","prev","next","Outlet","ErrorBoundary","GeneralErrorBoundary","statusHandlers"],"mappings":"6jCAsBA,MAAMA,EAAcC,EAAM,cAAsC,IAAI,EAEpE,SAASC,IAAiB,CACnB,MAAAC,EAAUC,EAAM,WAAWJ,CAAW,EAC5C,GAAI,CAACG,EACE,MAAA,IAAI,MAAM,2DAA2D,EAErE,OAAAA,CACR,CAEA,SAASE,GAAoB,CAC5B,SAAAC,EACA,oBAAAC,CACD,EAGG,CAED,OAAAC,EAAA,IAACR,EAAY,SAAZ,CAAqB,MAAO,CAAE,oBAAAO,CAAA,EAC7B,SAAAD,EACF,CAEF,CAEA,MAAMG,GAAoB,CACzB,SAAAC,EACA,aAAAC,GACA,aAAAC,GACA,WAAAC,GACA,UAAAC,EACD,EAEO,SAASC,GAAQ,CACvB,oBAAAR,CACD,EAEG,CACF,MAAMS,EAAOC,EAA6B,EAC1C,OAAKD,EAAK,gBAAgB,iBAEzBR,EAAAA,IAACH,GAAoB,CAAA,oBAAAE,EACpB,SAACC,EAAA,IAAAU,GAAA,CAAsB,sBAAuBF,EAAK,sBAClD,SAAAR,MAAC,MAAI,CAAA,UAAU,sCACd,SAAAA,EAAA,IAACW,GAAA,CACA,KAAMH,EAAK,gBAAgB,iBAC3B,WAAYP,EAAA,CAAA,CAEd,CAAA,CACD,CAAA,EACD,EAXkD,IAapD,CAEA,SAASW,EACRC,EACAC,EACAC,EACC,CACK,MAAAC,EAAkB,IAAI,gBAAgBH,CAAY,EACxD,OAAIE,IAAU,KACbC,EAAgB,OAAOF,CAAG,EAEVE,EAAA,IAAIF,EAAKC,CAAK,EAExBC,CACR,CAEA,SAASZ,GAAa,CACrB,IAAAa,EAAM,EACN,SAAAC,EAAW,GACX,SAAApB,CACD,EAIG,CAED,OAAAE,MAACE,GAAS,KAAMe,EAAK,KAAMA,EAAM,EAAG,SAAAC,EAClC,SAAApB,EACF,CAEF,CAEA,SAASK,GAAa,CACrB,IAAAc,EAAM,GACN,SAAAC,EAAW,GACX,SAAApB,CACD,EAIG,CAED,OAAAE,MAACE,GAAS,KAAMe,EAAK,KAAMA,EAAM,EAAG,SAAAC,EAClC,SAAApB,EACF,CAEF,CAEA,SAASI,EAAS,CACjB,KAAAiB,EAAO,EACP,KAAAC,EAAO,EACP,SAAAtB,EACA,SAAAoB,EAAW,GACX,GAAAG,CACD,EAMG,CACF,MAAMb,EAAOC,EAA6B,EAC1C,GAAI,CAACY,GAAM,CAACF,GAAQ,CAACC,EACpB,OAECpB,EAAAA,IAAC,kBAAe,UAAU,eACzB,eAAC,MAAI,CAAA,UAAU,QAAQ,SAAA,+BAA6B,CAAA,CAErD,CAAA,EAIF,SAASsB,EAAWC,EAAoB,OACnC,GAAA,OAAOA,GAAU,SAAU,CACxB,MAAAC,EAAYhB,EAAK,cAAgBe,EAChC,OAAAE,EAAAjB,EAAK,QAAQgB,CAAS,IAAtB,YAAAC,EAAyB,IAAA,CAE7B,GAAA,CAACF,EAAc,OAAA,KACnB,SAAW,CAAE,KAAAG,EAAM,SAAAC,CAAS,IAAKnB,EAAK,QACjC,GAAAe,IAAUG,GAAQH,IAAUI,EACxB,OAAAD,EAGF,OAAA,IAAA,CAGR,GAAIL,EAAI,CACD,MAAAO,EAAS,IAAI,gBAAgBP,CAAE,EAC9BF,EAAAS,EAAO,IAAI,MAAM,EACjBR,EAAAQ,EAAO,IAAI,MAAM,CAAA,CAEnB,MAAAC,EAAWP,EAAWH,CAAI,EAC1BW,EAAWR,EAAWF,CAAI,EAC5B,GAAA,CAACS,GAAY,CAACC,EACjB,OAECC,EAAAA,KAAC,iBAAe,CAAA,UAAU,eACzB,SAAA,CAAC/B,EAAA,IAAA,MAAA,CAAI,UAAU,QAAQ,SAA6B,gCAAA,EACnD,CAAC6B,GAAYE,EAAAA,KAAC,MAAI,CAAA,SAAA,CAAA,UAAQZ,EAAK,2BAAA,EAAyB,EACxD,CAACW,GAAYC,EAAAA,KAAC,MAAI,CAAA,SAAA,CAAA,UAAQX,EAAK,2BAAA,CAAyB,CAAA,CAAA,CAE1D,CAAA,EAIGC,IACCA,EAAA,QAAQQ,CAAQ,SAASC,CAAQ,IAEvC,MAAME,EAAad,EAChB,SAASG,CAAE,GACX,IAAI,mBACJT,EAAU,IAAI,gBAAmB,UAAW,QAAQS,CAAE,EAAE,EAAE,SAAS,CAAA,CACnE,GAEH,OAAKvB,IACJA,SACE,OAAK,CAAA,SAAA,CAAA,cACOoB,EAAW,GAAK,UAAU,UAAOlB,EAAAA,IAAC,QAAM,SAAS6B,CAAA,CAAA,EAAO,OAAK,IACzE7B,EAAAA,IAAC,QAAM,SAAS8B,CAAA,CAAA,CAAA,EACjB,GAIM9B,EAAAA,IAAAiC,EAAA,CAAK,GAAID,EAAa,SAAAlC,CAAS,CAAA,CACxC,CAEA,SAASO,GAAW,CACnB,KAAA6B,EACA,KAAAC,EAAO,aACP,SAAArC,EAAYE,EAAAA,IAAA,OAAA,CAAM,SAAKkC,CAAA,CAAA,EACvB,GAAGE,CACJ,EAGG,CACF,MAAM5B,EAAOC,EAA6B,EACpCQ,EAAMT,EAAK2B,CAAI,GAAK3B,EAAKA,EAAK,IAAI,EAElC6B,EACLN,EAAAA,KAAC,MAAI,CAAA,UAAU,iEACb,SAAA,CAAAjC,EAAU,IACVE,EAAA,IAAA,MAAA,CAAI,OAAQ,GAAI,MAAO,GACvB,SAACA,EAAA,IAAA,MAAA,CAAI,KAAM,GAAGsC,EAAQ,WAAA,CAAa,CACpC,CAAA,CAAA,EACD,EAGD,OAAO,IAAI,mBAAqBrB,EAC9BjB,EAAA,IAAA,MAAA,CAAI,UAAU,oBACd,SAAAA,EAAA,IAACuC,EAAa,CAAA,QAASL,EAAM,QAASjB,EAAI,KAAO,GAAGmB,EAClD,SACFC,EAAA,CAAA,CACD,EACGpB,QACF,MAAI,CAAA,UAAU,oBACd,SAAAjB,EAAAA,IAACuC,GAAa,QAASL,EAAM,QAASjB,EAAI,KAAO,GAAGmB,EAClD,SACFC,EAAA,CAAA,CACD,EACGF,IAAS,aAEZnC,EAAAA,IAACwC,GAAc,QAAQ,qDACtB,eAAC,MAAI,CAAA,UAAU,uCAAwC,SAAAH,CAAK,CAAA,CAC7D,CAAA,oBAEE,SAAQ,UAAA,CAAA,CAEZ,CAEA,SAASI,GACRC,EACwC,CACpC,OAAAA,IAAY,UAAkB,UAC9BA,IAAY,WAAmB,WAC5B,YACR,CAEA,SAASpC,GAAU,CAClB,GAAIqC,EACJ,SAAA7C,EAAWE,EAAA,IAAC,OAAM,CAAA,SAAA2C,EAAM,WAAW,EACnC,GAAGP,CACJ,EAAc,OACP,KAAA,CAACvB,CAAY,EAAI+B,GAAgB,EACjCvB,EAAK,IAAIT,EACdC,EACA,WACA8B,EAAM,SAAS,CAAA,EACd,SAAU,CAAA,GACNnC,EAAOC,EAA6B,EACpC0B,EAAOM,GAAe5B,EAAa,IAAI,SAAS,CAAC,EACjDgC,EAAcC,GAAe,EAC7B7B,EAAMT,EAAK2B,CAAI,EACfY,GACL9B,GAAA,YAAAA,EAAK,IAAI,QAAS,SACf+B,GAAW,CACX,OAAQH,EAAY,OACpB,KAAM5B,EAAI,IAAI,UACd,CAAA,IACAQ,EAAAjB,EAAK,aAAL,YAAAiB,EAAiB,IAAI,QAAS,UAC7BjB,EAAK,WAAW,IAAI,SACpB,KACC,CAAE,oBAAAT,CAAoB,EAAIL,GAAe,EACzCuD,EAAOF,EACVA,EAAc,MAAM,EAAG,EAAE,EAAIJ,EAAM,SAAA,EACnC,KAEF,OAAAZ,EAAA,KAAC,MAAI,CAAA,UAAU,iDACd,SAAA,CAAA/B,EAAA,IAACiC,EAAA,CACA,GAAAZ,EACC,GAAGe,EACJ,UAAWc,EAAGd,EAAM,UAAW,CAC9B,qBAAsB,IAAI,iBAAA,CAC1B,EACD,MACC,IAAI,kBACD,yCACA,OAEJ,QAAUe,GAAU,SACf,IAAI,mBAAmBA,EAAM,eAAe,GAEhD1B,EAAAW,EAAM,UAAN,MAAAX,EAAA,KAAAW,EAAgBe,IAChBC,EAAArD,EAAoB,UAApB,MAAAqD,EAA6B,wBAAwBT,EAAM,SAAA,EAC5D,EAEC,SAAA7C,CAAA,CACF,EACCmD,EACAjD,EAAA,IAACwC,EAAc,CAAA,QAAQ,kBACtB,SAAAxC,EAAA,IAAC,IAAA,CACA,KAAAiD,EACA,OAAO,SACP,IAAI,aACJ,UAAWC,EAAG,iDAAkD,CAC/D,qBAAsB,IAAI,iBAAA,CAC1B,EACD,MACC,IAAI,kBACD,yCACA,kBAEJ,QAAUC,GAAU,CACf,IAAI,mBAAmBA,EAAM,eAAe,CACjD,EAEA,SAAAnD,EAAAA,IAACqD,EAAK,CAAA,KAAK,cAAe,CAAA,CAAA,GAE5B,EACG,IAAA,EACL,CAEF,CC/SA,IAAIC,EAAe,UACf,CAACC,EAAsBC,EAAkB,EAAIC,GAAmBH,EAAc,CAChFI,CACF,CAAC,EACGC,EAAiBD,EAAmB,EACpC,CAACE,GAAiBC,CAAiB,EAAIN,EAAqBD,CAAY,EACxEQ,EAAW1B,GAAU,CACvB,KAAM,CACJ,eAAA2B,EACA,SAAAjE,EACA,KAAMkE,EACN,YAAAC,EACA,aAAAC,EACA,MAAAC,EAAQ,EACZ,EAAM/B,EACEgC,EAAcT,EAAeI,CAAc,EAC3CM,EAAaC,EAAY,OAAC,IAAI,EAC9B,CAACC,EAAiBC,CAAkB,EAAIC,EAAAA,SAAe,EAAK,EAC5D,CAACC,EAAMC,CAAO,EAAIC,GAAqB,CAC3C,KAAMZ,EACN,YAAaC,GAAe,GAC5B,SAAUC,EACV,OAAQZ,CACZ,CAAG,EACD,OAAuBtD,EAAG,IAAC6E,GAAsB,CAAE,GAAGT,EAAa,SAA0BpE,EAAG,IAC9F4D,GACA,CACE,MAAOG,EACP,UAAWe,GAAO,EAClB,WAAAT,EACA,KAAAK,EACA,aAAcC,EACd,aAAcI,EAAAA,YAAkB,IAAMJ,EAASK,GAAa,CAACA,CAAQ,EAAG,CAACL,CAAO,CAAC,EACjF,gBAAAJ,EACA,kBAAmBQ,EAAAA,YAAkB,IAAMP,EAAmB,EAAI,EAAG,CAAA,CAAE,EACvE,qBAAsBO,EAAAA,YAAkB,IAAMP,EAAmB,EAAK,EAAG,CAAA,CAAE,EAC3E,MAAAL,EACA,SAAArE,CACN,CACA,EAAK,CACL,EACAgE,EAAQ,YAAcR,EACtB,IAAI2B,EAAc,gBACdC,GAAgBC,EAAgB,WAClC,CAAC/C,EAAOgD,IAAiB,CACvB,KAAM,CAAE,eAAArB,EAAgB,GAAGsB,CAAW,EAAKjD,EACrCzC,EAAUkE,EAAkBoB,EAAalB,CAAc,EACvDK,EAAcT,EAAeI,CAAc,EAC3C,CAAE,kBAAAuB,EAAmB,qBAAAC,CAAoB,EAAK5F,EACpD6F,OAAAA,EAAAA,UAAgB,KACdF,EAAmB,EACZ,IAAMC,EAAsB,GAClC,CAACD,EAAmBC,CAAoB,CAAC,EACrBvF,EAAG,IAACyF,EAAwB,CAAE,GAAGrB,EAAa,GAAGiB,EAAa,IAAKD,EAAc,CAC5G,CACA,EACAF,GAAc,YAAcD,EAC5B,IAAIS,EAAe,iBACfC,EAAiBR,EAAgB,WACnC,CAAC/C,EAAOgD,IAAiB,CACvB,KAAM,CAAE,eAAArB,EAAgB,GAAG6B,CAAY,EAAKxD,EACtCzC,EAAUkE,EAAkB6B,EAAc3B,CAAc,EACxDK,EAAcT,EAAeI,CAAc,EAC3C8B,EAAqBC,EAAgBV,EAAczF,EAAQ,UAAU,EACrEoG,EAA0B/F,EAAG,IACjCgG,EAAU,OACV,CACE,KAAM,SACN,gBAAiB,SACjB,gBAAiBrG,EAAQ,KACzB,gBAAiBA,EAAQ,UACzB,aAAcsG,EAAStG,EAAQ,IAAI,EACnC,GAAGiG,EACH,IAAKC,EACL,QAASK,EAAqB9D,EAAM,QAASzC,EAAQ,YAAY,CACzE,CACK,EACD,OAAOA,EAAQ,gBAAkBoG,EAA0B/F,EAAG,IAACyF,EAAwB,CAAE,QAAS,GAAM,GAAGrB,EAAa,SAAU2B,CAAO,CAAE,CAC/I,CACA,EACAJ,EAAe,YAAcD,EAC7B,IAAIS,EAAc,gBACd,CAACC,GAAgBC,EAAgB,EAAI9C,EAAqB4C,EAAa,CACzE,WAAY,MACd,CAAC,EACGG,EAAiBlE,GAAU,CAC7B,KAAM,CAAE,eAAA2B,EAAgB,WAAAwC,EAAY,SAAAzG,EAAU,UAAA0G,CAAW,EAAGpE,EACtDzC,EAAUkE,EAAkBsC,EAAapC,CAAc,EAC7D,OAAuB/D,MAAIoG,GAAgB,CAAE,MAAOrC,EAAgB,WAAAwC,EAAY,SAA0BvG,EAAG,IAACyG,EAAU,CAAE,QAASF,GAAc5G,EAAQ,KAAM,SAA0BK,MAAI0G,GAAiB,CAAE,QAAS,GAAM,UAAAF,EAAW,SAAA1G,EAAU,CAAC,CAAE,CAAC,CAAE,CAC5P,EACAwG,EAAc,YAAcH,EAC5B,IAAIQ,EAAe,iBACfC,EAAiBzB,EAAgB,WACnC,CAAC/C,EAAOgD,IAAiB,CACvB,MAAMyB,EAAgBR,GAAiBM,EAAcvE,EAAM,cAAc,EACnE,CAAE,WAAAmE,EAAaM,EAAc,WAAY,GAAGC,CAAc,EAAG1E,EAC7DzC,EAAUkE,EAAkB8C,EAAcvE,EAAM,cAAc,EACpE,OAAuBpC,MAAIyG,EAAU,CAAE,QAASF,GAAc5G,EAAQ,KAAM,SAAUA,EAAQ,MAAwBK,EAAG,IAAC+G,GAAqB,CAAE,GAAGD,EAAc,IAAK1B,CAAc,CAAA,EAAoBpF,EAAAA,IAAIgH,GAAwB,CAAE,GAAGF,EAAc,IAAK1B,CAAY,CAAE,CAAC,CAAE,CAClR,CACA,EACAwB,EAAe,YAAcD,EAC7B,IAAIM,GAAOC,GAAW,6BAA6B,EAC/CH,GAAsB5B,EAAgB,WACxC,CAAC/C,EAAOgD,IAAiB,CACvB,MAAMzF,EAAUkE,EAAkB8C,EAAcvE,EAAM,cAAc,EAC9D+E,EAAa7C,EAAY,OAAC,IAAI,EAC9B8C,EAAetB,EAAgBV,EAAc+B,CAAU,EACvDE,EAAyB/C,EAAY,OAAC,EAAK,EACjDkB,OAAAA,EAAAA,UAAgB,IAAM,CACpB,MAAM8B,EAAUH,EAAW,QAC3B,GAAIG,EAAS,OAAOC,GAAWD,CAAO,CACvC,EAAE,EAAE,EACkBtH,EAAG,IAACwH,GAAc,CAAE,GAAIP,GAAM,eAAgB,GAAM,SAA0BjH,EAAG,IACtGyH,EACA,CACE,GAAGrF,EACH,IAAKgF,EACL,UAAWzH,EAAQ,KACnB,4BAA6B,GAC7B,iBAAkBuG,EAAqB9D,EAAM,iBAAmBe,GAAU,OACxEA,EAAM,eAAgB,EACjBkE,EAAuB,UAAS5F,EAAA9B,EAAQ,WAAW,UAAnB,MAAA8B,EAA4B,OAC3E,CAAS,EACD,qBAAsByE,EACpB9D,EAAM,qBACLe,GAAU,CACT,MAAMuE,EAAgBvE,EAAM,OAAO,cAC7BwE,EAAgBD,EAAc,SAAW,GAAKA,EAAc,UAAY,GACxEE,EAAeF,EAAc,SAAW,GAAKC,EACnDN,EAAuB,QAAUO,CAClC,EACD,CAAE,yBAA0B,EAAK,CAClC,EACD,eAAgB1B,EACd9D,EAAM,eACLe,GAAUA,EAAM,eAAgB,EACjC,CAAE,yBAA0B,EAAK,CAC3C,CACA,CACA,EAAO,CACP,CACA,EACI6D,GAAyB7B,EAAgB,WAC3C,CAAC/C,EAAOgD,IAAiB,CACvB,MAAMzF,EAAUkE,EAAkB8C,EAAcvE,EAAM,cAAc,EAC9DyF,EAA0BvD,EAAY,OAAC,EAAK,EAC5CwD,EAA2BxD,EAAY,OAAC,EAAK,EACnD,OAAuBtE,EAAG,IACxByH,EACA,CACE,GAAGrF,EACH,IAAKgD,EACL,UAAW,GACX,4BAA6B,GAC7B,iBAAmBjC,GAAU,UAC3B1B,EAAAW,EAAM,mBAAN,MAAAX,EAAA,KAAAW,EAAyBe,GACpBA,EAAM,mBACJ0E,EAAwB,UAASzE,EAAAzD,EAAQ,WAAW,UAAnB,MAAAyD,EAA4B,QAClED,EAAM,eAAgB,GAExB0E,EAAwB,QAAU,GAClCC,EAAyB,QAAU,EACpC,EACD,kBAAoB3E,GAAU,UAC5B1B,EAAAW,EAAM,oBAAN,MAAAX,EAAA,KAAAW,EAA0Be,GACrBA,EAAM,mBACT0E,EAAwB,QAAU,GAC9B1E,EAAM,OAAO,cAAc,OAAS,gBACtC2E,EAAyB,QAAU,KAGvC,MAAMC,EAAS5E,EAAM,SACGC,EAAAzD,EAAQ,WAAW,UAAnB,YAAAyD,EAA4B,SAAS2E,KACxC5E,EAAM,eAAgB,EACvCA,EAAM,OAAO,cAAc,OAAS,WAAa2E,EAAyB,SAC5E3E,EAAM,eAAgB,CAElC,CACA,CACK,CACL,CACA,EACIsE,EAAqBtC,EAAgB,WACvC,CAAC/C,EAAOgD,IAAiB,CACvB,KAAM,CACJ,eAAArB,EACA,UAAAiE,EACA,gBAAAC,EACA,iBAAAC,EACA,4BAAAC,EACA,gBAAAC,EACA,qBAAAC,EACA,eAAAC,EACA,kBAAAC,EACA,GAAGzB,CACT,EAAQ1E,EACEzC,EAAUkE,EAAkB8C,EAAc5C,CAAc,EACxDK,EAAcT,EAAeI,CAAc,EACjD,OAAAyE,GAAgB,EACOxI,EAAG,IACxByI,GACA,CACE,QAAS,GACT,KAAM,GACN,QAAST,EACT,iBAAkBC,EAClB,mBAAoBC,EACpB,SAA0BlI,EAAG,IAC3B0I,GACA,CACE,QAAS,GACT,4BAAAP,EACA,kBAAAI,EACA,gBAAAH,EACA,qBAAAC,EACA,eAAAC,EACA,UAAW,IAAM3I,EAAQ,aAAa,EAAK,EAC3C,SAA0BK,EAAG,IAC3B2I,GACA,CACE,aAAc1C,EAAStG,EAAQ,IAAI,EACnC,KAAM,SACN,GAAIA,EAAQ,UACZ,GAAGyE,EACH,GAAG0C,EACH,IAAK1B,EACL,MAAO,CACL,GAAG0B,EAAa,MAGd,2CAA4C,uCAC5C,0CAA2C,sCAC3C,2CAA4C,uCAC5C,gCAAiC,mCACjC,iCAAkC,mCAEtD,CACA,CACA,CACA,CACA,CACA,CACK,CACL,CACA,EACI8B,EAAa,eACbC,GAAe1D,EAAgB,WACjC,CAAC/C,EAAOgD,IAAiB,CACvB,KAAM,CAAE,eAAArB,EAAgB,GAAG+E,CAAU,EAAK1G,EACpCzC,EAAUkE,EAAkB+E,EAAY7E,CAAc,EAC5D,OAAuB/D,EAAG,IACxBgG,EAAU,OACV,CACE,KAAM,SACN,GAAG8C,EACH,IAAK1D,EACL,QAASc,EAAqB9D,EAAM,QAAS,IAAMzC,EAAQ,aAAa,EAAK,CAAC,CACtF,CACK,CACL,CACA,EACAkJ,GAAa,YAAcD,EAC3B,IAAIG,GAAa,eACbC,GAAe7D,EAAgB,WACjC,CAAC/C,EAAOgD,IAAiB,CACvB,KAAM,CAAE,eAAArB,EAAgB,GAAGkF,CAAU,EAAK7G,EACpCgC,EAAcT,EAAeI,CAAc,EACjD,OAAuB/D,EAAG,IAACkJ,GAAuB,CAAE,GAAG9E,EAAa,GAAG6E,EAAY,IAAK7D,EAAc,CAC1G,CACA,EACA4D,GAAa,YAAcD,GAC3B,SAAS9C,EAASvB,EAAM,CACtB,OAAOA,EAAO,OAAS,QACzB,CACA,IAAIyE,GAAQrF,EAERsF,GAAUzD,EACV0D,GAAS/C,EACTgD,GAAW1C,ECjSf,SAAS2C,GAAa,CACrB,iBAAAC,CACD,EAEG,SACF,MAAMhJ,EAAOC,EAA6B,EAEpC,CAACiE,EAAMC,CAAO,EAAIF,EAAAA,SAAe,EAAK,EACtC0C,EAAa7C,EAAM,OAAuB,IAAI,EAEpD,SAASmF,GAAqB,CAC7B9E,EAAQ,EAAK,CAAA,CAGR,MAAA+E,GAAUjI,EAAAjB,EAAK,aAAL,YAAAiB,EAAiB,QAEjC,yBAEE,SAACM,EAAA,KAAA4H,GAAA,CAAa,KAAAjF,EAAY,aAAcC,EACvC,SAAA,CAAA3E,EAAAA,IAAC4J,GAAA,CAAgB,QAAO,GACvB,SAAA7H,EAAA,KAAC,SAAA,CACA,UAAU,gFACV,aAAW,iBAEX,SAAA,CAAC/B,EAAAA,IAAAqD,EAAA,CAAK,KAAK,OAAQ,CAAA,EAAE,OAAA,CAAA,CAAA,EAGvB,EACArD,MAAC6J,GAAA,CACA,SAAA7J,EAAA,IAAC8J,GAAA,CACA,IAAK3C,EACL,UAAU,oHACV,MAAM,QACN,WAAY,EAEZ,SAAApF,EAAA,KAAC,MAAI,CAAA,UAAU,wBACd,SAAA,CAAC/B,EAAA,IAAA,SAAA,CAAO,UAAU,iDAAiD,SAEnE,iBAAA,EACCQ,EAAK,WACN4C,EAAA5C,EAAK,aAAL,YAAA4C,EAAiB,WAAY5C,EAAK,QAAQ,KACzCR,MAAC,OAAI,UAAU,yCACd,eAAC+J,EAAmB,CAAA,QAASvJ,EAAK,QAAQ,IAAA,CAAM,CACjD,CAAA,EACG,KACJR,EAAAA,IAAC,MAAI,CAAA,GAAG,QACP,SAAAA,EAAA,IAACgK,EAAM,SAAN,CACA,SACEhK,EAAAA,IAAAwC,EAAA,CAAc,QAAQ,eACtB,eAAC,MAAI,CAAA,UAAU,sBACd,SAAAxC,EAAAA,IAACqD,GAAK,KAAK,UAAU,UAAU,sBAAA,CAAuB,CACvD,CAAA,EACD,EAGD,SAAArD,EAAA,IAACiK,GAAA,CACA,QAAST,EACT,aACCxJ,EAAA,IAAC,MAAI,CAAA,UAAU,8BAA8B,SAE7C,wBAAA,EAGA,SAACkK,GAAc,CACf,GAAI,CAACA,EACJ,OACElK,EAAAA,IAAA,IAAA,CAAE,UAAU,8BAA8B,SAE3C,2BAAA,EAGE,GAAA,OAAOkK,GAAc,SACxB,OACElK,EAAAA,IAAA,IAAA,CAAE,UAAU,8BACX,SACFkK,EAAA,EAGE,GAAA,CAACA,EAAU,OACP,OAAAlK,EAAA,IAAC,KAAE,SAAgB,kBAAA,CAAA,EAG3B,MAAMoC,EACLsH,GAAW,IAAI,qBACZ,CAAA,EACA,CACA,MACC,qDACD,UAAW,aACZ,EAEF,OAAA3H,EAAA,KAAC,KAAI,CAAA,GAAGK,EACN,SAAA,CAAU8H,EAAA,OAAS,GAAK,CAAC,IAAI,kBAC5BlK,MAAA,MAAA,CAAI,UAAU,kEACd,SAAAA,EAAA,IAACuC,EAAA,CACA,QAAS2H,EAAU,IACjBhI,GAAS,GAAGA,EAAK,IAAI,IAAIA,EAAK,IAAI,IACpC,EACA,QAAQ,aACR,SAAUuH,EAEV,SAAAzJ,EAAAA,IAAC,KAAE,SAAc,gBAAA,CAAA,CAAA,GAEnB,EACG,KACHkK,EAAU,IAAKhI,GAAA,oBACd,KAAmB,CAAA,aAAYA,EAAK,OACpC,SAAAlC,EAAA,IAACuC,EAAA,CACA,QAAS,GAAGL,EAAK,IAAI,IAAIA,EAAK,IAAI,KAClC,QACC,IAAI,oBACAT,EAAAjB,EAAK,UAAL,YAAAiB,EAAc,OAAQ,aACvB,aAEJ,SAAUgI,EAEV,SAAAzJ,EAAA,IAAC,OAAM,CAAA,SAAAkC,EAAK,IAAK,CAAA,CAAA,CAAA,CAClB,EAXQA,EAAK,IAYd,EACA,CAAA,EACF,CAAA,CAEF,CAAA,CACD,CAAA,CAEF,CAAA,CAAA,CACD,CAAA,CAAA,CAAA,CAEF,CAAA,CAAA,CAAA,CACD,CACD,CAAA,CAEF,CC/FA,SAASiI,EACR3J,EACA4J,EACC,OACK,MAAAC,GACL7J,GAAAA,YAAAA,EAAM8J,gBAAgBD,eAAeE,WAAWC,SAAS,EAAG,OAAQ,KAC/DC,GACLjK,GAAAA,YAAAA,EAAM8J,gBAAgBG,WAAWF,WAAWC,SAAS,EAAG,OAAQ,KAC3DE,EACL,CACCC,QAAS,KACTC,SAAU,IACX,GACCpK,GAAAA,YAAAA,EAAM2B,OAAQ,SAAS,EACnB0I,IAAQrK,EAAAA,GAAAA,YAAAA,EAAOA,EAAK2B,QAAZ3B,YAAAA,EAAmBqK,QAAS,MACnC,MAAA,CACNH,MAAAA,EACAD,WAAAA,EACAI,MAAAA,EACAR,eAAAA,EACAS,eAAetK,GAAAA,YAAAA,EAAMsK,gBAAiB,mBACtCV,cAAAA,EACAjI,MAAM3B,GAAAA,YAAAA,EAAM2B,OAAQ,SACrB,CACD,CAEO,MAAM4I,GAAiEA,CAAC,CAC9EvK,KAAAA,EACAwK,QAAAA,EACApJ,OAAAA,CACD,IAAM,OACC,MAAAqJ,GAAWD,EAAAA,EAAQE,KAAMC,GAAMA,EAAEC,KAAO,MAAM,IAAnCJ,YAAAA,EAAsCxK,KACnD,GAAA,CAACA,GAAQ,CAACyK,QAAiB,CAAC,CAAEJ,MAAO,YAAa,CAAC,EACjD,KAAA,CAAEH,MAAAA,EAAOD,WAAAA,EAAYI,MAAAA,EAAOR,eAAAA,EAAgBS,cAAAA,CAAc,EAC/DX,EAAU3J,CAAI,EAEf,OAAO6K,GAAe,CACrBR,MAAO,GAAGH,CAAK,MAAMD,CAAU,KAAKI,CAAK,MAAMR,CAAc,KAAKS,CAAa,MAAMG,EAASb,aAAa,GAC3GkB,YAAa,GAAG1J,EAAOO,IAAI,sBAAsBkI,CAAc,KAAKS,CAAa,GACjFS,QAASV,EACTW,cAAe,GAAGV,CAAa,SAASW,OAAOhB,CAAU,CAAC,IAAI7I,EAAOO,IAAI,GACzEuJ,WAAYT,EAASS,WACrB7I,YAAaoI,EAASpI,WACvB,CAAC,CACF,EA2LA,SAAwB8I,IAAoB,OAC3C,MAAMnL,EAAOC,EAA6B,EAEpCV,EAAsB6L,SAA4B,IAAI,EAEtDC,EAAY1B,EAAU3J,CAAI,EAEdsL,OAAAA,GAAA,CACjBC,WAAY,CAAC,GAAGvL,EAAK8J,gBAAgB0B,YAAY,aAAa,CAC/D,CAAC,QAGC,MAAI,CAAAC,UAAU,qCACdnM,SAACiC,EAAA,KAAA,OAAA,CAAKkK,UAAU,0IACfnM,SAAA,CAACiC,EAAA,KAAA,MAAA,CAAIkK,UAAU,2EACdnM,SAAA,CAAAE,EAAA,IAAC,MAAGiM,UAAU,6DACbnM,SAACiC,EAAA,KAAA,MAAA,CAAIkK,UAAU,gEACdnM,SAAA,CAACiC,EAAA,KAAA,MAAA,CAAIkK,UAAU,oDACdnM,SAAA,CAAAiC,EAAA,KAACE,EAAA,CACAZ,GAAI6K,GAAgB1L,EAAK8J,gBAAgBD,cAAc,EACvD4B,UAAU,kBAETnM,SAAA,CAAU+L,EAAAxB,eAAe,KAAGwB,EAAUf,aAAA,EACxC,EACC,IACA/I,EAAA,KAAAE,EAAA,CAAKZ,GAAG,IAAI4K,UAAU,kBACrBnM,SAAA,CAAU+L,EAAApB,WAAW,KAAGoB,EAAUhB,MAClC,KACAgB,EAAUnB,MAAM,IAAEmB,EAAU1J,KAC5B,GAAA,CACF,CAAA,CAAA,CACD,CAAA,EACC3B,EAAKmK,WACNnK,EAAAA,EAAK2L,aAAL3L,YAAAA,EAAiBkJ,WAAYlJ,EAAKmK,QAAQjJ,KACzC1B,EAAAA,IAAC,OAAIiM,UAAU,kBACdnM,eAACiK,EAAmB,CAAAL,QAASlJ,EAAKmK,QAAQjJ,IAAM,CAAA,CACjD,CAAA,EACG,IAAA,CACL,CAAA,CACD,CAAA,EACAK,EAAA,KAAC,UAAA,CACAqJ,GAAI5K,EAAK4L,UAETH,UAAU,uLAETnM,SAAA,CAAAU,EAAK8J,gBAAgB+B,iBACrBrM,EAAAA,IAACO,IAAQR,oBAAAA,CAA0C,CAAA,EAElDC,EAAA,IAAA,MAAA,CAAIiM,UAAU,kDACdnM,SAACE,EAAA,IAAA,IAAA,CAAEF,iCAAsB,CAAA,CAC1B,CAAA,EAEDiC,EAAA,KAAC,MAAI,CAAAkK,UAAU,+BACbnM,SAAA,CAAAU,EAAK8L,aACLtM,EAAAA,IAACiC,EAAA,CACAZ,GAAIb,EAAK8L,aAAajL,GACtB,aAAW,gBACXkL,SAAS,SACTzM,SAAA,YAAA,CAED,QAEC,OAAK,CAAA,CAAA,EAENU,EAAKgM,aACLxM,EAAA,IAACiC,EAAA,CACAZ,GAAIb,EAAKgM,aAAanL,GACtB,aAAW,YACXkL,SAAS,SACTzM,SAAA,SAED,QAEC,OAAK,EAAA,CAAA,CAER,CAAA,CAAA,CAAA,EAjCKU,EAAK4L,SAkCX,EACApM,EAAAA,IAACyM,EAAA,CACAC,aAAc,IAAIlM,EAAK4L,SAAS,EAAA,EAC3B,UAAU5L,EAAK4L,SAAS,EAC9B,EACC5L,EAAK2B,OAAS,WACdnC,EAAA,IAAC2M,GAAA,CACAxK,KAAK,OACLkI,eAAgB7J,EAAK8J,gBAAgBD,eACrCI,WAAYjK,EAAK8J,gBAAgBG,WACjCwB,UAAU,qBACX,EACG,KACJlK,EAAA,KAAC,MAAI,CAAAkK,UAAU,8DACdnM,SAAA,CAACE,EAAA,IAAA,MAAA,CACAF,SAACE,EAAA,IAAA,MAAA,CAAIiM,UAAU,SACdnM,SAACE,EAAA,IAAAuJ,GAAA,CAAaC,iBAAkBhJ,EAAK0J,SAAW,CAAA,CACjD,CAAA,CACD,CAAA,EACAlK,EAAA,IAAC4M,GAAA,CACAlD,QAASlJ,EAAK8J,gBAAgB5I,KAC9BsK,aAAcxL,EAAK8J,gBAAgB0B,YAAA,CACpC,EACAhM,EAAA,IAAC6M,EAAA,CACAC,KACCtM,EAAK8L,aACF,CACAjL,GAAIb,EAAK8L,aAAajL,GACtB,aAAc,eACf,EACC,KAEJ0L,KACCvM,EAAKgM,aACF,CACAnL,GAAIb,EAAKgM,aAAanL,GACtB,aAAc,WACf,EACC,IAAA,CAEL,CAAA,CACD,CAAA,CAAA,EACD,QACC2L,EAAO,EAAA,CAAA,CACT,CAAA,CACD,CAAA,CAEF,CAEO,SAASC,IAAgB,CAE9B,OAAAjN,EAAAA,IAACkN,EAAA,CACAC,eAAgB,CACf,IAAK,IAAOnN,EAAA,IAAA,IAAA,CAAEF,SAAoC,sCAAA,CAAA,CACnD,CAAA,CACD,CAEF","x_google_ignoreList":[1]}
@@ -1,2 +0,0 @@
1
- import{r as p,j as t,R as f}from"./index-Dsusf_Av.js";import{d as B,u as M,e as U,P as j,f as q,g as ue,h as Y,i as fe}from"./tooltip-Bzd6O8vq.js";import{f as me,u as xe}from"./index-BmMpCvYx.js";import{c as k,I}from"./misc-2sBiisF5.js";var _="Collapsible",[ve,J]=B(_),[Ce,V]=ve(_),Q=p.forwardRef((e,s)=>{const{__scopeCollapsible:o,open:n,defaultOpen:r,disabled:a,onOpenChange:c,...i}=e,[d,u]=M({prop:n,defaultProp:r??!1,onChange:c,caller:_});return t.jsx(Ce,{scope:o,disabled:a,contentId:U(),open:d,onOpenToggle:p.useCallback(()=>u(m=>!m),[u]),children:t.jsx(j.div,{"data-state":H(d),"data-disabled":a?"":void 0,...i,ref:s})})});Q.displayName=_;var W="CollapsibleTrigger",X=p.forwardRef((e,s)=>{const{__scopeCollapsible:o,...n}=e,r=V(W,o);return t.jsx(j.button,{type:"button","aria-controls":r.contentId,"aria-expanded":r.open||!1,"data-state":H(r.open),"data-disabled":r.disabled?"":void 0,disabled:r.disabled,...n,ref:s,onClick:q(e.onClick,r.onOpenToggle)})});X.displayName=W;var L="CollapsibleContent",Z=p.forwardRef((e,s)=>{const{forceMount:o,...n}=e,r=V(L,e.__scopeCollapsible);return t.jsx(ue,{present:o||r.open,children:({present:a})=>t.jsx(be,{...n,ref:s,present:a})})});Z.displayName=L;var be=p.forwardRef((e,s)=>{const{__scopeCollapsible:o,present:n,children:r,...a}=e,c=V(L,o),[i,d]=p.useState(n),u=p.useRef(null),m=Y(s,u),x=p.useRef(0),A=x.current,C=p.useRef(0),w=C.current,b=c.open||i,g=p.useRef(b),h=p.useRef(void 0);return p.useEffect(()=>{const l=requestAnimationFrame(()=>g.current=!1);return()=>cancelAnimationFrame(l)},[]),fe(()=>{const l=u.current;if(l){h.current=h.current||{transitionDuration:l.style.transitionDuration,animationName:l.style.animationName},l.style.transitionDuration="0s",l.style.animationName="none";const R=l.getBoundingClientRect();x.current=R.height,C.current=R.width,g.current||(l.style.transitionDuration=h.current.transitionDuration,l.style.animationName=h.current.animationName),d(n)}},[c.open,n]),t.jsx(j.div,{"data-state":H(c.open),"data-disabled":c.disabled?"":void 0,id:c.contentId,hidden:!b,...a,ref:m,style:{"--radix-collapsible-content-height":A?`${A}px`:void 0,"--radix-collapsible-content-width":w?`${w}px`:void 0,...e.style},children:b&&r})});function H(e){return e?"open":"closed"}var ge=Q,he=X,Ae=Z,v="Accordion",Re=["Home","End","ArrowDown","ArrowUp","ArrowLeft","ArrowRight"],[$,Ie,je]=me(v),[P,Ge]=B(v,[je,J]),G=J(),ee=f.forwardRef((e,s)=>{const{type:o,...n}=e,r=n,a=n;return t.jsx($.Provider,{scope:e.__scopeAccordion,children:o==="multiple"?t.jsx(Pe,{...a,ref:s}):t.jsx(_e,{...r,ref:s})})});ee.displayName=v;var[oe,we]=P(v),[te,Ne]=P(v,{collapsible:!1}),_e=f.forwardRef((e,s)=>{const{value:o,defaultValue:n,onValueChange:r=()=>{},collapsible:a=!1,...c}=e,[i,d]=M({prop:o,defaultProp:n??"",onChange:r,caller:v});return t.jsx(oe,{scope:e.__scopeAccordion,value:f.useMemo(()=>i?[i]:[],[i]),onItemOpen:d,onItemClose:f.useCallback(()=>a&&d(""),[a,d]),children:t.jsx(te,{scope:e.__scopeAccordion,collapsible:a,children:t.jsx(ne,{...c,ref:s})})})}),Pe=f.forwardRef((e,s)=>{const{value:o,defaultValue:n,onValueChange:r=()=>{},...a}=e,[c,i]=M({prop:o,defaultProp:n??[],onChange:r,caller:v}),d=f.useCallback(m=>i((x=[])=>[...x,m]),[i]),u=f.useCallback(m=>i((x=[])=>x.filter(A=>A!==m)),[i]);return t.jsx(oe,{scope:e.__scopeAccordion,value:c,onItemOpen:d,onItemClose:u,children:t.jsx(te,{scope:e.__scopeAccordion,collapsible:!0,children:t.jsx(ne,{...a,ref:s})})})}),[ye,y]=P(v),ne=f.forwardRef((e,s)=>{const{__scopeAccordion:o,disabled:n,dir:r,orientation:a="vertical",...c}=e,i=f.useRef(null),d=Y(i,s),u=Ie(o),x=xe(r)==="ltr",A=q(e.onKeyDown,C=>{var F;if(!Re.includes(C.key))return;const w=C.target,b=u().filter(T=>{var z;return!((z=T.ref.current)!=null&&z.disabled)}),g=b.findIndex(T=>T.ref.current===w),h=b.length;if(g===-1)return;C.preventDefault();let l=g;const R=0,E=h-1,S=()=>{l=g+1,l>E&&(l=R)},D=()=>{l=g-1,l<R&&(l=E)};switch(C.key){case"Home":l=R;break;case"End":l=E;break;case"ArrowRight":a==="horizontal"&&(x?S():D());break;case"ArrowDown":a==="vertical"&&S();break;case"ArrowLeft":a==="horizontal"&&(x?D():S());break;case"ArrowUp":a==="vertical"&&D();break}const pe=l%h;(F=b[pe].ref.current)==null||F.focus()});return t.jsx(ye,{scope:o,disabled:n,direction:r,orientation:a,children:t.jsx($.Slot,{scope:o,children:t.jsx(j.div,{...c,"data-orientation":a,ref:d,onKeyDown:n?void 0:A})})})}),N="AccordionItem",[Ee,K]=P(N),re=f.forwardRef((e,s)=>{const{__scopeAccordion:o,value:n,...r}=e,a=y(N,o),c=we(N,o),i=G(o),d=U(),u=n&&c.value.includes(n)||!1,m=a.disabled||e.disabled;return t.jsx(Ee,{scope:o,open:u,disabled:m,triggerId:d,children:t.jsx(ge,{"data-orientation":a.orientation,"data-state":de(u),...i,...r,ref:s,disabled:m,open:u,onOpenChange:x=>{x?c.onItemOpen(n):c.onItemClose(n)}})})});re.displayName=N;var ae="AccordionHeader",se=f.forwardRef((e,s)=>{const{__scopeAccordion:o,...n}=e,r=y(v,o),a=K(ae,o);return t.jsx(j.h3,{"data-orientation":r.orientation,"data-state":de(a.open),"data-disabled":a.disabled?"":void 0,...n,ref:s})});se.displayName=ae;var O="AccordionTrigger",ce=f.forwardRef((e,s)=>{const{__scopeAccordion:o,...n}=e,r=y(v,o),a=K(O,o),c=Ne(O,o),i=G(o);return t.jsx($.ItemSlot,{scope:o,children:t.jsx(he,{"aria-disabled":a.open&&!c.collapsible||void 0,"data-orientation":r.orientation,id:a.triggerId,...i,...n,ref:s})})});ce.displayName=O;var ie="AccordionContent",le=f.forwardRef((e,s)=>{const{__scopeAccordion:o,...n}=e,r=y(v,o),a=K(ie,o),c=G(o);return t.jsx(Ae,{role:"region","aria-labelledby":a.triggerId,"data-orientation":r.orientation,...c,...n,ref:s,style:{"--radix-accordion-content-height":"var(--radix-collapsible-content-height)","--radix-accordion-content-width":"var(--radix-collapsible-content-width)",...e.style}})});le.displayName=ie;function de(e){return e?"open":"closed"}var Ke=ee,Se=re,De=se,Te=ce,Oe=le;const Fe=({title:e,children:s,variant:o,icon:n,forceMount:r=!1})=>{const a=()=>{switch(o){case"changed":return t.jsx(I,{name:"Modified","aria-label":"Modified",className:"text-[#fb923c]"});case"renamed":return t.jsx(I,{name:"Renamed","aria-label":"Renamed",className:"text-[#fb923c]"});case"added":return t.jsx(I,{name:"Added","aria-label":"Added",className:"text-[#10b981]"});case"deleted":return t.jsx(I,{name:"Deleted","aria-label":"Deleted",className:"text-[#ef4444]"});default:return t.jsx(I,{name:"Modified","aria-label":"Modified",className:"text-[#fb923c]"})}},c=()=>{switch(o){case"changed":return"modified";default:return o}},i=e.replace(/\\\\/g,"\\");return t.jsxs(Se,{value:e,children:[t.jsxs(Me,{variant:c(),children:[n||a()," ",i]}),t.jsx(ke,{forceMount:r,className:k("prose max-w-none whitespace-pre-wrap dark:prose-invert prose-pre:m-0 prose-pre:mb-1 prose-pre:rounded-none",{"radix-state-closed:hidden":r}),children:s})]})},Me=p.forwardRef(({children:e,className:s,variant:o,...n},r)=>t.jsx(De,{className:"flex",asChild:!0,children:t.jsxs(Te,{className:k("group flex w-full items-center justify-between border-b p-4 pr-3 font-mono text-sm font-medium leading-none hover:bg-foreground/20",s),...n,ref:r,children:[t.jsx("div",{className:"flex items-center gap-1.5",children:e}),t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:"font-mono text-xs font-normal uppercase text-muted-foreground",children:o}),t.jsx(I,{name:"TriangleDownSmall",className:"transition group-radix-state-open:rotate-180","aria-hidden":!0})]})]})})),ke=p.forwardRef(({children:e,className:s,...o},n)=>t.jsx(Oe,{className:k("",s),...o,ref:n,children:t.jsx("div",{children:e})}));export{Fe as A,Ke as R};
2
- //# sourceMappingURL=accordion-CpiLc1m2.js.map
@@ -1,2 +0,0 @@
1
- import{j as e}from"./index-Dsusf_Av.js";import{B as c}from"./button-Dt4EcDfR.js";import{I as i}from"./misc-2sBiisF5.js";import{S as t}from"./tooltip-Bzd6O8vq.js";import{u as d,a as m}from"./user-DNSnhqGn.js";import{u as l}from"./workshop-config-DchzGYJM.js";import{L as r,F as x}from"./components-5arJTWsS.js";const v={getSitemapEntries:()=>null};function u(){const{product:{host:s}}=l();return`https://${s}/discord`}function w(){const s=d(),a=l(),n=m(),o=u();return e.jsxs("main",{className:"container flex h-full w-full max-w-3xl flex-grow flex-col items-center justify-center gap-4",children:[s.imageUrlLarge?e.jsx("img",{className:"h-36 w-36 rounded-full",alt:(n==null?void 0:n.displayName)??s.name??s.email,src:s.imageUrlLarge}):e.jsx(i,{name:"User",className:"flex-shrink-0",size:"lg"}),e.jsx("h1",{className:"mb-1 text-2xl",children:"Your Account"}),e.jsx("p",{className:"text-center text-gray-700 dark:text-gray-300",children:s.name?`Hi ${(n==null?void 0:n.displayName)??s.name}, your device is logged in with ${s.email}.`:`Your device is logged in with ${s.email}.`}),n?e.jsx(e.Fragment,{children:e.jsxs("p",{className:"text-center text-gray-700 dark:text-gray-300",children:["And you are connected to discord as"," ",e.jsx("a",{href:`https://discord.com/users/${n.id}`,target:"_blank",rel:"noopener noreferrer",className:"underline",children:n.displayName}),"."]})}):e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(r,{to:o,className:"inline-flex items-center gap-2 underline",children:[e.jsx(i,{name:"Discord",size:"lg"}),"Connect Discord"]}),e.jsx(t,{content:"This will give you access to the exclusive Discord channels for Epic Web",children:e.jsx(i,{name:"Question",tabIndex:0})})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(x,{method:"post",children:e.jsx(c,{varient:"mono",name:"intent",value:"logout",children:"Log device out"})}),e.jsx(t,{content:e.jsxs("div",{children:["Note: it is your ",e.jsx("i",{className:"italic",children:"device"})," that's logged in, not your browser.",e.jsx("br",{}),"So all browsers on this device will be logged in with the same account on this device."]}),children:e.jsx(i,{name:"Question",tabIndex:0})})]}),e.jsx("hr",{className:"w-full"}),e.jsxs("ul",{className:"flex list-inside list-disc flex-col gap-2 self-start",children:[e.jsx("li",{children:e.jsxs(r,{to:`https://${a.product.host}/profile`,className:"inline-flex gap-1 underline",children:[e.jsx("span",{children:"Manage your account"}),e.jsx(i,{name:"ExternalLink"})]})}),e.jsx("li",{children:e.jsx(r,{to:"/preferences",className:"underline",children:"Manage your preferences"})}),e.jsx("li",{children:e.jsx(r,{to:"/onboarding",className:"underline",children:"Review onboarding"})}),e.jsx("li",{children:e.jsx(r,{to:"/support",className:"underline",children:"Get support"})})]})]})}export{w as default,v as handle};
2
- //# sourceMappingURL=account-CbFDiVNd.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"account-CbFDiVNd.js","sources":["../../../app/routes/_app+/account.tsx"],"sourcesContent":["import { deleteCache } from '@epic-web/workshop-utils/cache.server'\nimport {\n\tlogout,\n\trequireAuthInfo,\n\tsetPreferences,\n} from '@epic-web/workshop-utils/db.server'\nimport { type SEOHandle } from '@nasa-gcn/remix-seo'\nimport { redirect, type LoaderFunctionArgs } from '@remix-run/node'\nimport { Form, Link } from '@remix-run/react'\nimport { Button } from '#app/components/button.tsx'\nimport { Icon } from '#app/components/icons.tsx'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.js'\nimport { useOptionalDiscordMember, useUser } from '#app/components/user.tsx'\nimport { useWorkshopConfig } from '#app/components/workshop-config.tsx'\nimport { ensureUndeployed } from '#app/utils/misc.tsx'\nimport { redirectWithToast } from '#app/utils/toast.server.ts'\n\nexport const handle: SEOHandle = {\n\tgetSitemapEntries: () => null,\n}\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tensureUndeployed()\n\tawait requireAuthInfo({ request })\n\treturn {}\n}\n\nexport async function action({ request }: { request: Request }) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst intent = formData.get('intent')\n\tif (intent === 'logout') {\n\t\tawait logout()\n\t\tawait deleteCache()\n\t\treturn redirectWithToast('/login', {\n\t\t\ttype: 'success',\n\t\t\ttitle: 'Logged out',\n\t\t\tdescription: 'Goodbye! Come back soon!',\n\t\t})\n\t} else if (intent === 'presence-opt-out') {\n\t\tconst optOut = formData.get('optOut') === 'true'\n\t\tawait setPreferences({ presence: { optOut } })\n\t\treturn redirectWithToast('/account', {\n\t\t\ttitle: optOut ? 'Opted out' : 'Opted in',\n\t\t\tdescription: `You are now ${optOut ? 'invisible' : 'visible'}.`,\n\t\t\ttype: 'success',\n\t\t})\n\t}\n\n\treturn redirect('/account')\n}\n\nfunction useConnectDiscordURL() {\n\tconst {\n\t\tproduct: { host },\n\t} = useWorkshopConfig()\n\treturn `https://${host}/discord`\n}\n\nexport default function Account() {\n\tconst user = useUser()\n\tconst config = useWorkshopConfig()\n\tconst discordMember = useOptionalDiscordMember()\n\tconst connectDiscordURL = useConnectDiscordURL()\n\n\treturn (\n\t\t<main className=\"container flex h-full w-full max-w-3xl flex-grow flex-col items-center justify-center gap-4\">\n\t\t\t{user.imageUrlLarge ? (\n\t\t\t\t<img\n\t\t\t\t\tclassName=\"h-36 w-36 rounded-full\"\n\t\t\t\t\talt={discordMember?.displayName ?? user.name ?? user.email}\n\t\t\t\t\tsrc={user.imageUrlLarge}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<Icon name=\"User\" className=\"flex-shrink-0\" size=\"lg\" />\n\t\t\t)}\n\t\t\t<h1 className=\"mb-1 text-2xl\">Your Account</h1>\n\t\t\t<p className=\"text-center text-gray-700 dark:text-gray-300\">\n\t\t\t\t{user.name\n\t\t\t\t\t? `Hi ${\n\t\t\t\t\t\t\tdiscordMember?.displayName ?? user.name\n\t\t\t\t\t\t}, your device is logged in with ${user.email}.`\n\t\t\t\t\t: `Your device is logged in with ${user.email}.`}\n\t\t\t</p>\n\t\t\t{discordMember ? (\n\t\t\t\t<>\n\t\t\t\t\t<p className=\"text-center text-gray-700 dark:text-gray-300\">\n\t\t\t\t\t\tAnd you are connected to discord as{' '}\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref={`https://discord.com/users/${discordMember.id}`}\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{discordMember.displayName}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t.\n\t\t\t\t\t</p>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Link\n\t\t\t\t\t\tto={connectDiscordURL}\n\t\t\t\t\t\tclassName=\"inline-flex items-center gap-2 underline\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"Discord\" size=\"lg\" />\n\t\t\t\t\t\tConnect Discord\n\t\t\t\t\t</Link>\n\t\t\t\t\t<SimpleTooltip content=\"This will give you access to the exclusive Discord channels for Epic Web\">\n\t\t\t\t\t\t<Icon name=\"Question\" tabIndex={0} />\n\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<Form method=\"post\">\n\t\t\t\t\t<Button varient=\"mono\" name=\"intent\" value=\"logout\">\n\t\t\t\t\t\tLog device out\n\t\t\t\t\t</Button>\n\t\t\t\t</Form>\n\t\t\t\t<SimpleTooltip\n\t\t\t\t\tcontent={\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\tNote: it is your <i className=\"italic\">device</i> that's logged\n\t\t\t\t\t\t\tin, not your browser.\n\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\tSo all browsers on this device will be logged in with the same\n\t\t\t\t\t\t\taccount on this device.\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t<Icon name=\"Question\" tabIndex={0} />\n\t\t\t\t</SimpleTooltip>\n\t\t\t</div>\n\t\t\t<hr className=\"w-full\" />\n\t\t\t<ul className=\"flex list-inside list-disc flex-col gap-2 self-start\">\n\t\t\t\t<li>\n\t\t\t\t\t<Link\n\t\t\t\t\t\tto={`https://${config.product.host}/profile`}\n\t\t\t\t\t\tclassName=\"inline-flex gap-1 underline\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>Manage your account</span>\n\t\t\t\t\t\t<Icon name=\"ExternalLink\" />\n\t\t\t\t\t</Link>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<Link to=\"/preferences\" className=\"underline\">\n\t\t\t\t\t\tManage your preferences\n\t\t\t\t\t</Link>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<Link to=\"/onboarding\" className=\"underline\">\n\t\t\t\t\t\tReview onboarding\n\t\t\t\t\t</Link>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<Link to=\"/support\" className=\"underline\">\n\t\t\t\t\t\tGet support\n\t\t\t\t\t</Link>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t</main>\n\t)\n}\n"],"names":["handle","getSitemapEntries","useConnectDiscordURL","product","host","useWorkshopConfig","Account","user","useUser","config","discordMember","useOptionalDiscordMember","connectDiscordURL","jsxs","className","children","imageUrlLarge","jsx","alt","displayName","name","email","src","Icon","size","Fragment","href","id","target","rel","Link","to","SimpleTooltip","content","tabIndex","Form","method","Button","varient","value"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{r as t,j as s}from"./index-Dsusf_Av.js";import{P as e}from"./preview-CqZGJtsE.js";import{u as i}from"./components-5arJTWsS.js";import"./misc-2sBiisF5.js";import"./button-Dt4EcDfR.js";import"./loading-b1FV2pQh.js";import"./index-DLC5u33j.js";import"./tooltip-Bzd6O8vq.js";import"./pe-BShc2dvc.js";import"./progress-bar-DgnkQxQw.js";function w(){const{appInfo:r}=i(),o=t.useRef(null);return s.jsx(e,{appInfo:r,inBrowserBrowserRef:o})}export{w as default};
2
- //# sourceMappingURL=app-BYSDu0vh.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-BYSDu0vh.js","sources":["../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app.tsx"],"sourcesContent":["import { requireExerciseApp } from '@epic-web/workshop-utils/apps.server'\nimport {\n\tcombineServerTimings,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport {\n\tunstable_data as data,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n} from '@remix-run/node'\nimport { useLoaderData } from '@remix-run/react'\nimport { useRef } from 'react'\nimport { type InBrowserBrowserRef } from '#app/components/in-browser-browser.js'\nimport { Preview } from './__shared/preview.tsx'\nimport { getAppRunningState } from './__shared/utils.tsx'\n\nexport async function loader({ request, params }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('exercise-step-test')\n\tconst exerciseStepApp = await requireExerciseApp(params, { request, timings })\n\tconst { isRunning, portIsAvailable } =\n\t\tawait getAppRunningState(exerciseStepApp)\n\n\treturn data(\n\t\t{\n\t\t\tappInfo: {\n\t\t\t\tisRunning,\n\t\t\t\tname: exerciseStepApp.name,\n\t\t\t\ttitle: exerciseStepApp.title,\n\t\t\t\tportIsAvailable,\n\t\t\t\ttype: exerciseStepApp.type,\n\t\t\t\tfullPath: exerciseStepApp.fullPath,\n\t\t\t\tdev: exerciseStepApp.dev,\n\t\t\t\ttest: exerciseStepApp.test,\n\t\t\t\tstackBlitzUrl: exerciseStepApp.stackBlitzUrl,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\theaders: {\n\t\t\t\t'Server-Timing': timings.toString(),\n\t\t\t},\n\t\t},\n\t)\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders, parentHeaders }) => {\n\tconst headers = {\n\t\t'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nexport default function TestsList() {\n\tconst { appInfo } = useLoaderData<typeof loader>()\n\tconst ref = useRef<InBrowserBrowserRef>(null)\n\n\treturn <Preview appInfo={appInfo} inBrowserBrowserRef={ref} />\n}\n"],"names":["TestsList","appInfo","useLoaderData","ref","useRef","jsx","Preview","inBrowserBrowserRef"],"mappings":"kVAmDA,SAAwBA,GAAY,CAC7B,KAAA,CAAEC,QAAAA,CAAQ,EAAIC,EAA6B,EAC3CC,EAAMC,SAA4B,IAAI,EAE5C,OAAQC,EAAAA,IAAAC,EAAA,CAAQL,QAAAA,EAAkBM,oBAAqBJ,CAAK,CAAA,CAC7D"}