@epic-web/workshop-app 5.23.0 → 5.24.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 (147) hide show
  1. package/bin/epicshop.js +203 -37
  2. package/build/client/assets/{_basePickBy-B3Ji82Lk.js → _basePickBy-lB0X5x6U.js} +2 -2
  3. package/build/client/assets/{_basePickBy-B3Ji82Lk.js.map → _basePickBy-lB0X5x6U.js.map} +1 -1
  4. package/build/client/assets/{_baseUniq-BoGoqSUm.js → _baseUniq-BOjGYEEK.js} +2 -2
  5. package/build/client/assets/{_baseUniq-BoGoqSUm.js.map → _baseUniq-BOjGYEEK.js.map} +1 -1
  6. package/build/client/assets/{_exerciseNumber-DtILU6SM.js → _exerciseNumber-Dqi7TgL9.js} +2 -2
  7. package/build/client/assets/{_exerciseNumber-DtILU6SM.js.map → _exerciseNumber-Dqi7TgL9.js.map} +1 -1
  8. package/build/client/assets/{_exerciseNumber_.finished-CEK9anWX.js → _exerciseNumber_.finished-C5m6M0gM.js} +2 -2
  9. package/build/client/assets/{_exerciseNumber_.finished-CEK9anWX.js.map → _exerciseNumber_.finished-C5m6M0gM.js.map} +1 -1
  10. package/build/client/assets/{_layout-D1r_62oj.js → _layout-B_NrRv0S.js} +2 -2
  11. package/build/client/assets/{_layout-D1r_62oj.js.map → _layout-B_NrRv0S.js.map} +1 -1
  12. package/build/client/assets/{_layout-DzlTTMQ0.js → _layout-QRe2q83m.js} +2 -2
  13. package/build/client/assets/{_layout-DzlTTMQ0.js.map → _layout-QRe2q83m.js.map} +1 -1
  14. package/build/client/assets/{app-CQvK51s0.js → app-BYSDu0vh.js} +2 -2
  15. package/build/client/assets/{app-CQvK51s0.js.map → app-BYSDu0vh.js.map} +1 -1
  16. package/build/client/assets/{arc-rF8TbXNV.js → arc-DmQZ2TPB.js} +2 -2
  17. package/build/client/assets/{arc-rF8TbXNV.js.map → arc-DmQZ2TPB.js.map} +1 -1
  18. package/build/client/assets/{architectureDiagram-IEHRJDOE-D7gCCmY9.js → architectureDiagram-IEHRJDOE-BqPvrjLh.js} +2 -2
  19. package/build/client/assets/{architectureDiagram-IEHRJDOE-D7gCCmY9.js.map → architectureDiagram-IEHRJDOE-BqPvrjLh.js.map} +1 -1
  20. package/build/client/assets/{blockDiagram-JOT3LUYC-yGQOzhkw.js → blockDiagram-JOT3LUYC-D8OFd78i.js} +2 -2
  21. package/build/client/assets/{blockDiagram-JOT3LUYC-yGQOzhkw.js.map → blockDiagram-JOT3LUYC-D8OFd78i.js.map} +1 -1
  22. package/build/client/assets/{c4Diagram-VJAJSXHY-CTFjYF37.js → c4Diagram-VJAJSXHY-DjROjsr_.js} +2 -2
  23. package/build/client/assets/{c4Diagram-VJAJSXHY-CTFjYF37.js.map → c4Diagram-VJAJSXHY-DjROjsr_.js.map} +1 -1
  24. package/build/client/assets/channel-DnqeaSfB.js +2 -0
  25. package/build/client/assets/{channel-5s71-OE9.js.map → channel-DnqeaSfB.js.map} +1 -1
  26. package/build/client/assets/{chunk-4BMEZGHF-BIe0IUDz.js → chunk-4BMEZGHF-CNL-bCj2.js} +2 -2
  27. package/build/client/assets/{chunk-4BMEZGHF-BIe0IUDz.js.map → chunk-4BMEZGHF-CNL-bCj2.js.map} +1 -1
  28. package/build/client/assets/{chunk-A2AXSNBT-B-nCbUBj.js → chunk-A2AXSNBT-PeSyIKDm.js} +2 -2
  29. package/build/client/assets/{chunk-A2AXSNBT-B-nCbUBj.js.map → chunk-A2AXSNBT-PeSyIKDm.js.map} +1 -1
  30. package/build/client/assets/{chunk-AEK57VVT-B-cCHPs2.js → chunk-AEK57VVT-B1JqGB_s.js} +2 -2
  31. package/build/client/assets/{chunk-AEK57VVT-B-cCHPs2.js.map → chunk-AEK57VVT-B1JqGB_s.js.map} +1 -1
  32. package/build/client/assets/{chunk-D6G4REZN-EQ3R8OZx.js → chunk-D6G4REZN-C1e0nCkL.js} +2 -2
  33. package/build/client/assets/{chunk-D6G4REZN-EQ3R8OZx.js.map → chunk-D6G4REZN-C1e0nCkL.js.map} +1 -1
  34. package/build/client/assets/{chunk-RZ5BOZE2-h6svq8Xk.js → chunk-RZ5BOZE2-D5pIwNeA.js} +2 -2
  35. package/build/client/assets/{chunk-RZ5BOZE2-h6svq8Xk.js.map → chunk-RZ5BOZE2-D5pIwNeA.js.map} +1 -1
  36. package/build/client/assets/{chunk-XZIHB7SX-74-HFRcU.js → chunk-XZIHB7SX-FbrNggxP.js} +2 -2
  37. package/build/client/assets/{chunk-XZIHB7SX-74-HFRcU.js.map → chunk-XZIHB7SX-FbrNggxP.js.map} +1 -1
  38. package/build/client/assets/classDiagram-GIVACNV2-cXWx-aYi.js +2 -0
  39. package/build/client/assets/{classDiagram-GIVACNV2-CWogZCzR.js.map → classDiagram-GIVACNV2-cXWx-aYi.js.map} +1 -1
  40. package/build/client/assets/classDiagram-v2-COTLJTTW-cXWx-aYi.js +2 -0
  41. package/build/client/assets/{classDiagram-v2-COTLJTTW-CWogZCzR.js.map → classDiagram-v2-COTLJTTW-cXWx-aYi.js.map} +1 -1
  42. package/build/client/assets/clone-Bj8ANPCv.js +2 -0
  43. package/build/client/assets/{clone-nHZ14b_E.js.map → clone-Bj8ANPCv.js.map} +1 -1
  44. package/build/client/assets/{dagre-OKDRZEBW-Bq-HgVN8.js → dagre-OKDRZEBW-DT9ZQRxf.js} +2 -2
  45. package/build/client/assets/{dagre-OKDRZEBW-Bq-HgVN8.js.map → dagre-OKDRZEBW-DT9ZQRxf.js.map} +1 -1
  46. package/build/client/assets/{diagram-SSKATNLV-Cls675Lh.js → diagram-SSKATNLV-CcKCni9R.js} +2 -2
  47. package/build/client/assets/{diagram-SSKATNLV-Cls675Lh.js.map → diagram-SSKATNLV-CcKCni9R.js.map} +1 -1
  48. package/build/client/assets/{diagram-VNBRO52H-CJDqBhLa.js → diagram-VNBRO52H-DWoRAiqO.js} +2 -2
  49. package/build/client/assets/{diagram-VNBRO52H-CJDqBhLa.js.map → diagram-VNBRO52H-DWoRAiqO.js.map} +1 -1
  50. package/build/client/assets/{diff-8N5KyD7o.js → diff-BKR4usVv.js} +2 -2
  51. package/build/client/assets/{diff-8N5KyD7o.js.map → diff-BKR4usVv.js.map} +1 -1
  52. package/build/client/assets/{diff-Bu4t2NGL.js → diff-D5_VwPLF.js} +2 -2
  53. package/build/client/assets/{diff-Bu4t2NGL.js.map → diff-D5_VwPLF.js.map} +1 -1
  54. package/build/client/assets/{epic-video-DN9DRRHf.js → epic-video-CmlkW6Rw.js} +2 -2
  55. package/build/client/assets/{epic-video-DN9DRRHf.js.map → epic-video-CmlkW6Rw.js.map} +1 -1
  56. package/build/client/assets/{erDiagram-Q7BY3M3F-DdKn4jVQ.js → erDiagram-Q7BY3M3F-DXkEmvKk.js} +2 -2
  57. package/build/client/assets/{erDiagram-Q7BY3M3F-DdKn4jVQ.js.map → erDiagram-Q7BY3M3F-DXkEmvKk.js.map} +1 -1
  58. package/build/client/assets/{finished-B3G1RUDO.js → finished-MrsevkkK.js} +2 -2
  59. package/build/client/assets/{finished-B3G1RUDO.js.map → finished-MrsevkkK.js.map} +1 -1
  60. package/build/client/assets/{flowDiagram-4HSFHLVR-5Mg796nh.js → flowDiagram-4HSFHLVR-DCodZaNW.js} +2 -2
  61. package/build/client/assets/{flowDiagram-4HSFHLVR-5Mg796nh.js.map → flowDiagram-4HSFHLVR-DCodZaNW.js.map} +1 -1
  62. package/build/client/assets/{ganttDiagram-APWFNJXF-YO2fxWzG.js → ganttDiagram-APWFNJXF-TfB6wYvN.js} +2 -2
  63. package/build/client/assets/{ganttDiagram-APWFNJXF-YO2fxWzG.js.map → ganttDiagram-APWFNJXF-TfB6wYvN.js.map} +1 -1
  64. package/build/client/assets/{gitGraphDiagram-7IBYFJ6S-DQCZvhP_.js → gitGraphDiagram-7IBYFJ6S-D2NQnQv2.js} +2 -2
  65. package/build/client/assets/{gitGraphDiagram-7IBYFJ6S-DQCZvhP_.js.map → gitGraphDiagram-7IBYFJ6S-D2NQnQv2.js.map} +1 -1
  66. package/build/client/assets/{graph-BFAO9Sgp.js → graph-eJUngNSH.js} +2 -2
  67. package/build/client/assets/{graph-BFAO9Sgp.js.map → graph-eJUngNSH.js.map} +1 -1
  68. package/build/client/assets/{index-BfCSiT_X.js → index-9euhNa27.js} +2 -2
  69. package/build/client/assets/{index-BfCSiT_X.js.map → index-9euhNa27.js.map} +1 -1
  70. package/build/client/assets/index-DLC5u33j.js +36 -0
  71. package/build/client/assets/index-DLC5u33j.js.map +1 -0
  72. package/build/client/assets/{index-Dkt2MSig.js → index-DPHVg8Eh.js} +2 -2
  73. package/build/client/assets/{index-Dkt2MSig.js.map → index-DPHVg8Eh.js.map} +1 -1
  74. package/build/client/assets/infoDiagram-PH2N3AL5-D-nEozcT.js +3 -0
  75. package/build/client/assets/{infoDiagram-PH2N3AL5-x87RxSs8.js.map → infoDiagram-PH2N3AL5-D-nEozcT.js.map} +1 -1
  76. package/build/client/assets/{journeyDiagram-U35MCT3I-D5yGbOLJ.js → journeyDiagram-U35MCT3I-Dc8g8jIX.js} +2 -2
  77. package/build/client/assets/{journeyDiagram-U35MCT3I-D5yGbOLJ.js.map → journeyDiagram-U35MCT3I-Dc8g8jIX.js.map} +1 -1
  78. package/build/client/assets/{kanban-definition-NDS4AKOZ-BM6KyRww.js → kanban-definition-NDS4AKOZ-BwwcaZU2.js} +2 -2
  79. package/build/client/assets/{kanban-definition-NDS4AKOZ-BM6KyRww.js.map → kanban-definition-NDS4AKOZ-BwwcaZU2.js.map} +1 -1
  80. package/build/client/assets/{layout-qCiM2Jgn.js → layout-BAeq0-Is.js} +2 -2
  81. package/build/client/assets/{layout-qCiM2Jgn.js.map → layout-BAeq0-Is.js.map} +1 -1
  82. package/build/client/assets/{linear-B3zp51yW.js → linear-LWRPSVMz.js} +2 -2
  83. package/build/client/assets/{linear-B3zp51yW.js.map → linear-LWRPSVMz.js.map} +1 -1
  84. package/build/client/assets/{loading-BPTYJOXN.js → loading-b1FV2pQh.js} +2 -2
  85. package/build/client/assets/{loading-BPTYJOXN.js.map → loading-b1FV2pQh.js.map} +1 -1
  86. package/build/client/assets/{login-CfyUfm-m.js → login-Ci7cdiuj.js} +2 -2
  87. package/build/client/assets/{login-CfyUfm-m.js.map → login-Ci7cdiuj.js.map} +1 -1
  88. package/build/client/assets/{manifest-fe4b7228.js → manifest-c68964f2.js} +1 -1
  89. package/build/client/assets/{mdx-Dfsh6Vjk.js → mdx-C7imFHZE.js} +3 -3
  90. package/build/client/assets/{mdx-Dfsh6Vjk.js.map → mdx-C7imFHZE.js.map} +1 -1
  91. package/build/client/assets/{mermaid.core-ZaxoMXOj.js → mermaid.core-q9C-HfFu.js} +5 -5
  92. package/build/client/assets/{mermaid.core-ZaxoMXOj.js.map → mermaid.core-q9C-HfFu.js.map} +1 -1
  93. package/build/client/assets/{mindmap-definition-ALO5MXBD-CF3siXp6.js → mindmap-definition-ALO5MXBD-BhzLy0Zl.js} +2 -2
  94. package/build/client/assets/{mindmap-definition-ALO5MXBD-CF3siXp6.js.map → mindmap-definition-ALO5MXBD-BhzLy0Zl.js.map} +1 -1
  95. package/build/client/assets/{onboarding-5LC4kIVW.js → onboarding-c9ZuxLsm.js} +2 -2
  96. package/build/client/assets/{onboarding-5LC4kIVW.js.map → onboarding-c9ZuxLsm.js.map} +1 -1
  97. package/build/client/assets/{online-IWqRB9zP.js → online-DZKJk3C2.js} +2 -2
  98. package/build/client/assets/{online-IWqRB9zP.js.map → online-DZKJk3C2.js.map} +1 -1
  99. package/build/client/assets/{pieDiagram-IB7DONF6-B-gWQIHI.js → pieDiagram-IB7DONF6-CaTGj8RH.js} +2 -2
  100. package/build/client/assets/{pieDiagram-IB7DONF6-B-gWQIHI.js.map → pieDiagram-IB7DONF6-CaTGj8RH.js.map} +1 -1
  101. package/build/client/assets/{presence-BAL3jDku.js → presence-C9bUSihT.js} +2 -2
  102. package/build/client/assets/{presence-BAL3jDku.js.map → presence-C9bUSihT.js.map} +1 -1
  103. package/build/client/assets/{preview-D4amucCL.js → preview-CqZGJtsE.js} +2 -2
  104. package/build/client/assets/{preview-D4amucCL.js.map → preview-CqZGJtsE.js.map} +1 -1
  105. package/build/client/assets/{product-Cyum2biy.js → product-DJOWNuL-.js} +2 -2
  106. package/build/client/assets/{product-Cyum2biy.js.map → product-DJOWNuL-.js.map} +1 -1
  107. package/build/client/assets/{quadrantDiagram-7GDLP6J5-BQzo7p61.js → quadrantDiagram-7GDLP6J5-B4Od6z6p.js} +2 -2
  108. package/build/client/assets/{quadrantDiagram-7GDLP6J5-BQzo7p61.js.map → quadrantDiagram-7GDLP6J5-B4Od6z6p.js.map} +1 -1
  109. package/build/client/assets/{radar-MK3ICKWK-CM-Iz9PA.js → radar-MK3ICKWK-CENXhI0E.js} +2 -2
  110. package/build/client/assets/{radar-MK3ICKWK-CM-Iz9PA.js.map → radar-MK3ICKWK-CENXhI0E.js.map} +1 -1
  111. package/build/client/assets/{requirementDiagram-KVF5MWMF-DzaHc66R.js → requirementDiagram-KVF5MWMF-_w0WuUxy.js} +2 -2
  112. package/build/client/assets/{requirementDiagram-KVF5MWMF-DzaHc66R.js.map → requirementDiagram-KVF5MWMF-_w0WuUxy.js.map} +1 -1
  113. package/build/client/assets/{revalidation-ws-ho-umDqd.js → revalidation-ws-B0skixgr.js} +2 -2
  114. package/build/client/assets/{revalidation-ws-ho-umDqd.js.map → revalidation-ws-B0skixgr.js.map} +1 -1
  115. package/build/client/assets/root-JfOw9N7j.js +11 -0
  116. package/build/client/assets/root-JfOw9N7j.js.map +1 -0
  117. package/build/client/assets/{sankeyDiagram-QLVOVGJD-DfAVeZCk.js → sankeyDiagram-QLVOVGJD-Bt8556P1.js} +2 -2
  118. package/build/client/assets/{sankeyDiagram-QLVOVGJD-DfAVeZCk.js.map → sankeyDiagram-QLVOVGJD-Bt8556P1.js.map} +1 -1
  119. package/build/client/assets/{sequenceDiagram-X6HHIX6F-CljZRLoS.js → sequenceDiagram-X6HHIX6F-y2-oW3Ob.js} +2 -2
  120. package/build/client/assets/{sequenceDiagram-X6HHIX6F-CljZRLoS.js.map → sequenceDiagram-X6HHIX6F-y2-oW3Ob.js.map} +1 -1
  121. package/build/client/assets/{stateDiagram-DGXRK772-BzVfGv3W.js → stateDiagram-DGXRK772-B3BuD15b.js} +2 -2
  122. package/build/client/assets/{stateDiagram-DGXRK772-BzVfGv3W.js.map → stateDiagram-DGXRK772-B3BuD15b.js.map} +1 -1
  123. package/build/client/assets/{stateDiagram-v2-YXO3MK2T-8oX001yq.js → stateDiagram-v2-YXO3MK2T-BzFxWpqR.js} +2 -2
  124. package/build/client/assets/{stateDiagram-v2-YXO3MK2T-8oX001yq.js.map → stateDiagram-v2-YXO3MK2T-BzFxWpqR.js.map} +1 -1
  125. package/build/client/assets/{test-C14D-N72.js → test-DdUNKtkF.js} +2 -2
  126. package/build/client/assets/{test-C14D-N72.js.map → test-DdUNKtkF.js.map} +1 -1
  127. package/build/client/assets/{tests-6__AtHpI.js → tests-B1ak2CDI.js} +2 -2
  128. package/build/client/assets/{tests-6__AtHpI.js.map → tests-B1ak2CDI.js.map} +1 -1
  129. package/build/client/assets/{timeline-definition-BDJGKUSR-2TO9MtLY.js → timeline-definition-BDJGKUSR-DUa2yfAV.js} +2 -2
  130. package/build/client/assets/{timeline-definition-BDJGKUSR-2TO9MtLY.js.map → timeline-definition-BDJGKUSR-DUa2yfAV.js.map} +1 -1
  131. package/build/client/assets/{xychartDiagram-VJFVF3MP-Dh4nsbBT.js → xychartDiagram-VJFVF3MP-JztjcODi.js} +2 -2
  132. package/build/client/assets/{xychartDiagram-VJFVF3MP-Dh4nsbBT.js.map → xychartDiagram-VJFVF3MP-JztjcODi.js.map} +1 -1
  133. package/build/server/index.js +138 -163
  134. package/build/server/index.js.map +1 -1
  135. package/dist/server/index.js +82 -80
  136. package/package.json +3 -3
  137. package/build/client/assets/channel-5s71-OE9.js +0 -2
  138. package/build/client/assets/classDiagram-GIVACNV2-CWogZCzR.js +0 -2
  139. package/build/client/assets/classDiagram-v2-COTLJTTW-CWogZCzR.js +0 -2
  140. package/build/client/assets/clone-nHZ14b_E.js +0 -2
  141. package/build/client/assets/index-CEP3Xxa0.js +0 -36
  142. package/build/client/assets/index-CEP3Xxa0.js.map +0 -1
  143. package/build/client/assets/infoDiagram-PH2N3AL5-x87RxSs8.js +0 -3
  144. package/build/client/assets/root-tJmOmO9T.js +0 -11
  145. package/build/client/assets/root-tJmOmO9T.js.map +0 -1
  146. package/build/client/assets/update-repo-l0sNRNKZ.js +0 -2
  147. package/build/client/assets/update-repo-l0sNRNKZ.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"preview-D4amucCL.js","sources":["../../../app/routes/start.tsx","../../../app/components/in-browser-browser.tsx","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/preview.tsx"],"sourcesContent":["import { invariant, invariantResponse } from '@epic-web/invariant'\nimport { getAppByName } from '@epic-web/workshop-utils/apps.server'\nimport {\n\tcloseProcess,\n\trunAppDev,\n\tstopPort,\n\twaitOnApp,\n} from '@epic-web/workshop-utils/process-manager.server'\nimport { unstable_data as data, type ActionFunctionArgs } from '@remix-run/node'\nimport { useFetcher } from '@remix-run/react'\nimport { Button } from '#app/components/button.tsx'\nimport { Loading } from '#app/components/loading.tsx'\nimport { showProgressBarField } from '#app/components/progress-bar.tsx'\nimport { ensureUndeployed, useAltDown } from '#app/utils/misc.tsx'\nimport { dataWithPE, usePERedirectInput } from '#app/utils/pe.js'\nimport { createToastHeaders } from '#app/utils/toast.server'\n\nexport async function action({ request }: ActionFunctionArgs) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst intent = formData.get('intent')\n\tinvariantResponse(typeof intent === 'string', 'intent is required')\n\n\tif (intent === 'start' || intent === 'stop' || intent === 'restart') {\n\t\tconst name = formData.get('name')\n\t\tinvariantResponse(typeof name === 'string', 'name is required')\n\t\tconst app = await getAppByName(name)\n\t\tif (!app) {\n\t\t\tthrow new Response('Not found', { status: 404 })\n\t\t}\n\t\tif (app.dev.type !== 'script') {\n\t\t\tthrow new Response(`App \"${name}\" does not have a server`, {\n\t\t\t\tstatus: 400,\n\t\t\t})\n\t\t}\n\n\t\tasync function startApp() {\n\t\t\tinvariant(app, 'app must be defined')\n\t\t\tconst result = await runAppDev(app)\n\t\t\tif (result.running) {\n\t\t\t\tconst appRunningResult = await waitOnApp(app)\n\t\t\t\tif (appRunningResult?.status === 'success') {\n\t\t\t\t\t// wait another 200ms just in case the build output for assets isn't finished\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 200))\n\t\t\t\t\treturn dataWithPE(formData, { status: 'app-started' } as const)\n\t\t\t\t} else if (app.dev.type === 'script') {\n\t\t\t\t\tconst errorMessage = appRunningResult\n\t\t\t\t\t\t? appRunningResult.error\n\t\t\t\t\t\t: 'Unknown error'\n\t\t\t\t\treturn data(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstatus: 'app-not-started',\n\t\t\t\t\t\t\terror: errorMessage,\n\t\t\t\t\t\t\tport: app.dev.portNumber,\n\t\t\t\t\t\t} as const,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstatus: 500,\n\t\t\t\t\t\t\tstatusText: 'App did not start',\n\t\t\t\t\t\t\theaders: await createToastHeaders({\n\t\t\t\t\t\t\t\tdescription: errorMessage,\n\t\t\t\t\t\t\t\ttitle: 'App did not start',\n\t\t\t\t\t\t\t\ttype: 'error',\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}\n\t\t\t} else if (result.portNumber) {\n\t\t\t\treturn dataWithPE(formData, {\n\t\t\t\t\tstatus: 'app-not-started',\n\t\t\t\t\terror: result.status,\n\t\t\t\t\tport: result.portNumber,\n\t\t\t\t} as const)\n\t\t\t} else {\n\t\t\t\tthrow new Response(\n\t\t\t\t\t'Tried starting a server for an app that does not have one',\n\t\t\t\t\t{ status: 400 },\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tasync function stopApp() {\n\t\t\tinvariant(app, 'app must be defined')\n\t\t\tawait closeProcess(app.name)\n\t\t\treturn dataWithPE(formData, { status: 'app-stopped' } as const)\n\t\t}\n\n\t\tswitch (intent) {\n\t\t\tcase 'start': {\n\t\t\t\treturn startApp()\n\t\t\t}\n\t\t\tcase 'stop': {\n\t\t\t\treturn stopApp()\n\t\t\t}\n\t\t\tcase 'restart': {\n\t\t\t\tawait stopApp()\n\t\t\t\treturn startApp()\n\t\t\t}\n\t\t}\n\t}\n\n\tif (intent === 'stop-port') {\n\t\tconst port = formData.get('port')\n\t\tinvariantResponse(typeof port === 'string', 'port is required')\n\t\tawait stopPort(port)\n\t\treturn dataWithPE(formData, { status: 'port-stopped' } as const)\n\t}\n\tthrow new Error(`Unknown intent: ${intent}`)\n}\n\nexport function AppStopper({ name }: { name: string }) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst peRedirectInput = usePERedirectInput()\n\tconst inFlightIntent = fetcher.formData?.get('intent')\n\tconst inFlightState =\n\t\tinFlightIntent === 'stop'\n\t\t\t? 'Stopping App'\n\t\t\t: inFlightIntent === 'restart'\n\t\t\t\t? 'Restarting App'\n\t\t\t\t: null\n\tconst altDown = useAltDown()\n\treturn (\n\t\t<fetcher.Form method=\"POST\" action=\"/start\">\n\t\t\t{peRedirectInput}\n\t\t\t{showProgressBarField}\n\t\t\t<input type=\"hidden\" name=\"name\" value={name} />\n\t\t\t<button\n\t\t\t\ttype=\"submit\"\n\t\t\t\tname=\"intent\"\n\t\t\t\tvalue={altDown ? 'restart' : 'stop'}\n\t\t\t\tclassName=\"h-full border-r px-3 py-4 font-mono text-xs uppercase leading-none\"\n\t\t\t>\n\t\t\t\t{inFlightState ? inFlightState : altDown ? 'Restart App' : 'Stop App'}\n\t\t\t</button>\n\t\t</fetcher.Form>\n\t)\n}\n\nexport function PortStopper({ port }: { port: number | string }) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst peRedirectInput = usePERedirectInput()\n\treturn (\n\t\t<fetcher.Form method=\"POST\" action=\"/start\">\n\t\t\t{peRedirectInput}\n\t\t\t{showProgressBarField}\n\t\t\t<input type=\"hidden\" name=\"port\" value={port} />\n\t\t\t<Button varient=\"mono\" type=\"submit\" name=\"intent\" value=\"stop-port\">\n\t\t\t\t{fetcher.state === 'idle' ? 'Stop Port' : 'Stopping Port'}\n\t\t\t</Button>\n\t\t</fetcher.Form>\n\t)\n}\n\nexport function AppStarter({ name }: { name: string }) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst peRedirectInput = usePERedirectInput()\n\tif (fetcher.data?.status === 'app-not-started') {\n\t\tif (fetcher.data.error === 'port-unavailable') {\n\t\t\treturn (\n\t\t\t\t<div>\n\t\t\t\t\tThe port is unavailable. Would you like to stop whatever is running on\n\t\t\t\t\tthat port and try again?\n\t\t\t\t\t<PortStopper port={fetcher.data.port} />\n\t\t\t\t</div>\n\t\t\t)\n\t\t} else {\n\t\t\treturn <div>An unknown error has happened.</div>\n\t\t}\n\t}\n\treturn (\n\t\t<fetcher.Form method=\"POST\" action=\"/start\">\n\t\t\t{peRedirectInput}\n\t\t\t{showProgressBarField}\n\t\t\t<input type=\"hidden\" name=\"name\" value={name} />\n\t\t\t{fetcher.state === 'idle' ? (\n\t\t\t\t<Button type=\"submit\" name=\"intent\" value=\"start\" varient=\"mono\">\n\t\t\t\t\tStart App\n\t\t\t\t</Button>\n\t\t\t) : (\n\t\t\t\t<div>\n\t\t\t\t\t<Loading>Starting App</Loading>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</fetcher.Form>\n\t)\n}\n","import { Form, useSearchParams, type NavigateFunction } from '@remix-run/react'\nimport { clsx } from 'clsx'\nimport {\n\tforwardRef,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseRef,\n\tuseState,\n\ttype ForwardedRef,\n} from 'react'\nimport { z } from 'zod'\nimport { Icon } from '#app/components/icons.tsx'\nimport { AppStarter, AppStopper, PortStopper } from '#app/routes/start.tsx'\nimport { useTheme } from '#app/routes/theme/index.tsx'\nimport { getBaseUrl } from '#app/utils/misc.tsx'\nimport { useRequestInfo } from '#app/utils/request-info.ts'\nimport { LinkButton } from './button.tsx'\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from './ui/tooltip.tsx'\n\nconst historyCallDataSchema = z.intersection(\n\tz.object({\n\t\ttype: z.literal('epicshop:history-call'),\n\t}),\n\tz.union([\n\t\tz.object({\n\t\t\tmethod: z.literal('pushState'),\n\t\t\targs: z.union([\n\t\t\t\tz.tuple([z.object({}).passthrough(), z.unknown()]),\n\t\t\t\tz.tuple([z.object({}).passthrough(), z.unknown(), z.string()]),\n\t\t\t]),\n\t\t}),\n\t\tz.object({\n\t\t\tmethod: z.literal('replaceState'),\n\t\t\targs: z.union([\n\t\t\t\tz.tuple([z.object({}).passthrough(), z.unknown()]),\n\t\t\t\tz.tuple([z.object({}).passthrough(), z.unknown(), z.string()]),\n\t\t\t]),\n\t\t}),\n\t\tz.object({\n\t\t\tmethod: z.literal('go'),\n\t\t\targs: z.tuple([z.number().optional()]),\n\t\t}),\n\t\tz.object({ method: z.literal('forward'), args: z.tuple([]) }),\n\t\tz.object({ method: z.literal('back'), args: z.tuple([]) }),\n\t\tz.object({\n\t\t\tmethod: z.literal('popstate'),\n\t\t\tpathname: z.string(),\n\t\t\tdelta: z.number(),\n\t\t}),\n\t]),\n)\n\nconst loadedSchema = z.object({\n\ttype: z.literal('epicshop:loaded'),\n\turl: z.string(),\n})\n\nconst messageSchema = z.union([historyCallDataSchema, loadedSchema])\n\nfunction getNewIndex(prevIndex: number, delta: number, max: number) {\n\t// keep the index bound between 0 and the history length\n\treturn Math.min(Math.max(prevIndex + delta, 0), max)\n}\n\ntype Props = {\n\tid: string\n\tname: string\n\tport: number\n\tportIsAvailable: boolean | null\n\tisRunning: boolean\n\tbaseUrl: string\n\tinitialRoute: string\n}\n\nexport type InBrowserBrowserRef = {\n\thandleExtrnalNavigation: (pathname?: string) => void\n}\n\nexport const InBrowserBrowser = forwardRef<InBrowserBrowserRef, Props>(\n\tInBrowserBrowserImpl,\n)\n\nfunction InBrowserBrowserImpl(\n\t{ name, port, portIsAvailable, isRunning, baseUrl, id, initialRoute }: Props,\n\tref: ForwardedRef<InBrowserBrowserRef>,\n) {\n\tconst requestInfo = useRequestInfo()\n\tconst [showUnmanaged, setShowUnmanaged] = useState(false)\n\tif (isRunning || showUnmanaged) {\n\t\treturn (\n\t\t\t<InBrowserBrowserForRealz\n\t\t\t\tbaseUrl={baseUrl}\n\t\t\t\tid={id}\n\t\t\t\tname={name}\n\t\t\t\tref={ref}\n\t\t\t\tinitialRoute={initialRoute}\n\t\t\t/>\n\t\t)\n\t} else if (portIsAvailable === false) {\n\t\treturn (\n\t\t\t<div className=\"flex flex-col items-center justify-center\">\n\t\t\t\t<p className=\"max-w-xs pb-5 text-center\" role=\"status\">\n\t\t\t\t\t{`The port for this app is unavailable. It could be that you're running it `}\n\t\t\t\t\t<a\n\t\t\t\t\t\thref={getBaseUrl({ domain: requestInfo.domain, port })}\n\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t>\n\t\t\t\t\t\telsewhere\n\t\t\t\t\t</a>\n\t\t\t\t\t{'. '}\n\t\t\t\t\t<LinkButton onClick={() => setShowUnmanaged(true)}>\n\t\t\t\t\t\tShow here anyway\n\t\t\t\t\t</LinkButton>\n\t\t\t\t</p>\n\t\t\t\t<PortStopper port={port} />\n\t\t\t</div>\n\t\t)\n\t} else {\n\t\treturn <AppStarter name={name} />\n\t}\n}\ntype RealBrowserProps = {\n\tbaseUrl: string\n\tid: string\n\tname: string\n\tinitialRoute: string\n}\n\nconst InBrowserBrowserForRealz = forwardRef<\n\tInBrowserBrowserRef,\n\tRealBrowserProps\n>(InBrowserBrowserForRealzImpl)\n\n// we're doing this to ensure all of this complex stuff doesn't happen unless\n// the iframe is actually rendered.\nfunction InBrowserBrowserForRealzImpl(\n\t{ baseUrl, id, name, initialRoute }: RealBrowserProps,\n\tref: ForwardedRef<InBrowserBrowserRef>,\n) {\n\tconst theme = useTheme()\n\tconst [searchParams, setSearchParams] = useSearchParams()\n\tconst searchParamsPathname = searchParams.get('pathname') ?? initialRoute\n\tconst [iframeKeyNumber, setIframeKeyNumber] = useState(0)\n\tconst iframeKey = id + iframeKeyNumber\n\tconst lastDirectionRef = useRef<'forward' | 'back' | 'new'>('new')\n\tconst lastDirectionTimeout = useRef<ReturnType<typeof setTimeout> | null>(\n\t\tnull,\n\t)\n\tconst [iframeContext, setIFrameContext] = useState({\n\t\thistory: [searchParamsPathname],\n\t\tindex: 0,\n\t})\n\tconst [pathnameInputValue, setPathnameInputValue] =\n\t\tuseState(searchParamsPathname)\n\tconst iframeRef = useRef<HTMLIFrameElement>(null)\n\n\tconst appUrl = new URL(searchParamsPathname, baseUrl)\n\tconst currentAppUrl = useRef(appUrl)\n\tuseEffect(() => {\n\t\tcurrentAppUrl.current = appUrl\n\t})\n\n\t/** changing the iframeSrcUrl will trigger a reload of the iframe */\n\tconst [iframeSrcUrl, setIframeSrcUrl] = useState(appUrl)\n\n\tconst currentId = useRef(id)\n\t// if the id changes, then we're going to reload the iframe, but we want to\n\t// make sure to preserve the pathname so we set the src to the current pathname\n\t// this is one of the few side-effects in render that are \"ok\"\n\tif (currentId.current !== id) {\n\t\tcurrentId.current = id\n\t\tsetIframeSrcUrl(currentAppUrl.current)\n\t}\n\tuseEffect(() => {\n\t\tcurrentId.current = id\n\t})\n\n\tuseEffect(() => {\n\t\tfunction handleMessage(messageEvent: MessageEvent) {\n\t\t\tif (messageEvent.source !== iframeRef.current?.contentWindow) return\n\n\t\t\tconst result = messageSchema.safeParse(messageEvent.data, {\n\t\t\t\tpath: ['messageEvent', 'data'],\n\t\t\t})\n\t\t\tif (!result.success) return\n\t\t\tconst { data } = result\n\n\t\t\tif (data.type === 'epicshop:loaded') {\n\t\t\t\tsetIFrameContext((prevContext) => {\n\t\t\t\t\tconst newIndex = (i: number) =>\n\t\t\t\t\t\tgetNewIndex(prevContext.index, i, prevContext.history.length - 1)\n\t\t\t\t\tif (lastDirectionRef.current === 'back') {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(-1) }\n\t\t\t\t\t} else if (lastDirectionRef.current === 'forward') {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(1) }\n\t\t\t\t\t} else if (lastDirectionRef.current === 'new') {\n\t\t\t\t\t\tconst currentFullPath = prevContext.history[prevContext.index]\n\t\t\t\t\t\tconst newUrl = new URL(data.url)\n\t\t\t\t\t\tconst newFullPath = newUrl.pathname + newUrl.search\n\n\t\t\t\t\t\tif (currentFullPath === newFullPath) return prevContext\n\n\t\t\t\t\t\tconst newHistory = [\n\t\t\t\t\t\t\t...prevContext.history.slice(0, prevContext.index + 1),\n\t\t\t\t\t\t\tnewFullPath,\n\t\t\t\t\t\t]\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\thistory: newHistory,\n\t\t\t\t\t\t\tindex: newHistory.length - 1,\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error('Unexpected lastDirectionRef value')\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst { method } = data\n\t\t\tsetIFrameContext((prevContext) => {\n\t\t\t\tconst newIndex = (i: number) =>\n\t\t\t\t\tgetNewIndex(prevContext.index, i, prevContext.history.length - 1)\n\t\t\t\tconst currentPathname = prevContext.history[prevContext.index]\n\t\t\t\tswitch (method) {\n\t\t\t\t\tcase 'popstate': {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(data.delta) }\n\t\t\t\t\t}\n\t\t\t\t\tcase 'forward': {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(1) }\n\t\t\t\t\t}\n\t\t\t\t\tcase 'back': {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(-1) }\n\t\t\t\t\t}\n\t\t\t\t\tcase 'pushState': {\n\t\t\t\t\t\tconst pathname = data.args[2] ?? currentPathname\n\t\t\t\t\t\tconst newHistory = [\n\t\t\t\t\t\t\t...prevContext.history.slice(0, prevContext.index + 1),\n\t\t\t\t\t\t\tpathname,\n\t\t\t\t\t\t].filter(Boolean)\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...prevContext,\n\t\t\t\t\t\t\thistory: newHistory,\n\t\t\t\t\t\t\tindex: newHistory.length - 1,\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcase 'replaceState': {\n\t\t\t\t\t\tconst pathname = data.args[2] ?? currentPathname\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...prevContext,\n\t\t\t\t\t\t\thistory: [\n\t\t\t\t\t\t\t\t...prevContext.history.slice(0, prevContext.index),\n\t\t\t\t\t\t\t\tpathname,\n\t\t\t\t\t\t\t\t...prevContext.history.slice(prevContext.index + 1),\n\t\t\t\t\t\t\t].filter(Boolean),\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcase 'go': {\n\t\t\t\t\t\tconst [delta = 0] = data.args\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(delta) }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\twindow.addEventListener('message', handleMessage)\n\t\treturn () => {\n\t\t\twindow.removeEventListener('message', handleMessage)\n\t\t}\n\t}, [])\n\n\t// setSearchParams is unstable\n\t// https://github.com/remix-run/react-router/issues/9991\n\tconst setSearchParamsLatestRef = useRef(setSearchParams)\n\tuseEffect(() => {\n\t\tsetSearchParamsLatestRef.current = setSearchParams\n\t}, [setSearchParams])\n\n\tconst iframePathname = iframeContext.history[iframeContext.index]\n\tuseEffect(() => {\n\t\tif (!iframePathname) return\n\n\t\tsetPathnameInputValue(iframePathname)\n\n\t\tconst newSearchParams = new URLSearchParams(window.location.search)\n\t\tif (iframePathname === '/') {\n\t\t\tnewSearchParams.delete('pathname')\n\t\t} else {\n\t\t\tnewSearchParams.set('pathname', iframePathname)\n\t\t}\n\t\tconst newSearch = newSearchParams.toString()\n\t\tif (`?${newSearch}` !== window.location.search) {\n\t\t\tsetSearchParamsLatestRef.current(newSearchParams, { replace: true })\n\t\t}\n\t}, [iframePathname])\n\n\tconst navigateChild: NavigateFunction = (...params) => {\n\t\tconst to = params[0]\n\t\tif (typeof to === 'number') {\n\t\t\t// this part feels very brittle to me...\n\t\t\tlastDirectionRef.current = to > 0 ? 'forward' : 'back'\n\t\t} else {\n\t\t\tlastDirectionRef.current = 'new'\n\t\t}\n\t\tif (lastDirectionTimeout.current) {\n\t\t\tclearTimeout(lastDirectionTimeout.current)\n\t\t}\n\t\tlastDirectionTimeout.current = setTimeout(() => {\n\t\t\tlastDirectionRef.current = 'new'\n\t\t}, 100)\n\t\tiframeRef.current?.contentWindow?.postMessage(\n\t\t\t{ type: 'epicshop:navigate-call', params },\n\t\t\t'*',\n\t\t)\n\t}\n\n\tfunction handleExtrnalNavigation(\n\t\tnewPathnameInputValue: string = pathnameInputValue,\n\t) {\n\t\tsetPathnameInputValue(newPathnameInputValue)\n\n\t\tconst currentPathname = iframeContext.history[iframeContext.index]\n\t\tnavigateChild(newPathnameInputValue, {\n\t\t\treplace: currentPathname === newPathnameInputValue,\n\t\t})\n\t}\n\n\tuseImperativeHandle(ref, () => ({ handleExtrnalNavigation }))\n\n\tconst atEndOfHistory =\n\t\tiframeContext.index === iframeContext.history.length - 1\n\tconst atStartOfHistory = iframeContext.index <= 0\n\tconst existingSearchParamHiddenInputs: Array<React.ReactElement> = []\n\tfor (const [key, value] of searchParams.entries()) {\n\t\tif (key === 'pathname') continue\n\n\t\texistingSearchParamHiddenInputs.push(\n\t\t\t<input key={key} type=\"hidden\" name={key} value={value} />,\n\t\t)\n\t}\n\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<div className=\"flex h-full flex-grow flex-col\">\n\t\t\t\t<div className=\"flex items-center justify-between border-b pl-1.5\">\n\t\t\t\t\t<div className=\"mr-2 flex items-center justify-center gap-2 px-1\">\n\t\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName=\"hidden aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40 sm:flex\"\n\t\t\t\t\t\t\t\t\tdisabled={atStartOfHistory}\n\t\t\t\t\t\t\t\t\tonClick={() => navigateChild(-1)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon name=\"ArrowLeft\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t<TooltipContent>Go back</TooltipContent>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName=\"hidden aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40 sm:flex\"\n\t\t\t\t\t\t\t\t\tdisabled={atEndOfHistory}\n\t\t\t\t\t\t\t\t\tonClick={() => navigateChild(1)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon name=\"ArrowRight\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t<TooltipContent>Go forward</TooltipContent>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName=\"flex aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40\"\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tsetIframeSrcUrl(appUrl)\n\t\t\t\t\t\t\t\t\t\tsetIframeKeyNumber(iframeKeyNumber + 1)\n\t\t\t\t\t\t\t\t\t\t// TODO: figure out how we can avoid having to do this...\n\t\t\t\t\t\t\t\t\t\t// I stayed up for hours one night trying and couldn't work out\n\t\t\t\t\t\t\t\t\t\t// why react router wouldn't update the UI when using back/forward\n\t\t\t\t\t\t\t\t\t\t// after a refresh.\n\t\t\t\t\t\t\t\t\t\tsetIFrameContext({\n\t\t\t\t\t\t\t\t\t\t\thistory: [appUrl.pathname],\n\t\t\t\t\t\t\t\t\t\t\tindex: 0,\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<Icon name=\"Refresh\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t<TooltipContent>Refresh</TooltipContent>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Form\n\t\t\t\t\t\tmethod=\"get\"\n\t\t\t\t\t\treplace\n\t\t\t\t\t\tclassName=\"flex flex-1 gap-2\"\n\t\t\t\t\t\tonSubmit={() => handleExtrnalNavigation()}\n\t\t\t\t\t>\n\t\t\t\t\t\t{existingSearchParamHiddenInputs}\n\t\t\t\t\t\t<div className=\"flex flex-1 items-center border-x bg-background p-3 leading-none text-foreground\">\n\t\t\t\t\t\t\t<a href={appUrl.toString()} target=\"_blank\" rel=\"noreferrer\">\n\t\t\t\t\t\t\t\t{iframeSrcUrl.host}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\taria-label=\"pathname\"\n\t\t\t\t\t\t\t\tclassName=\"w-full flex-1 bg-background focus-visible:outline-none\"\n\t\t\t\t\t\t\t\tvalue={pathnameInputValue}\n\t\t\t\t\t\t\t\tname=\"pathname\"\n\t\t\t\t\t\t\t\tonChange={(e) => setPathnameInputValue(e.currentTarget.value)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/* TODO: Reconsider if this is needed as browsers don't usually have a submit button in address bar */}\n\t\t\t\t\t\t{/* <button type=\"submit\">Go</button> */}\n\t\t\t\t\t</Form>\n\t\t\t\t\t<AppStopper name={name} />\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={appUrl.toString()}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'flex aspect-square items-center justify-center px-3.5',\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 name=\"ExternalLink\" />\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>Open in new tab</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex h-full w-full flex-grow dark:bg-white\">\n\t\t\t\t\t<iframe\n\t\t\t\t\t\ttitle={name}\n\t\t\t\t\t\tkey={iframeKey}\n\t\t\t\t\t\tref={iframeRef}\n\t\t\t\t\t\tsrc={iframeSrcUrl.toString()}\n\t\t\t\t\t\tclassName=\"h-full w-full flex-grow bg-white\"\n\t\t\t\t\t\tstyle={{ colorScheme: theme }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</TooltipProvider>\n\t)\n}\n","import { type BaseExerciseStepApp } from '@epic-web/workshop-utils/apps.server'\nimport { useState } from 'react'\nimport { Icon } from '#app/components/icons'\nimport {\n\tInBrowserBrowser,\n\ttype InBrowserBrowserRef,\n} from '#app/components/in-browser-browser'\nimport { Loading } from '#app/components/loading.js'\nimport { useTheme } from '#app/routes/theme/index.js'\nimport { cn, getBaseUrl } from '#app/utils/misc'\nimport { useRequestInfo } from '#app/utils/request-info'\n\nexport function Preview({\n\tid,\n\tappInfo,\n\tinBrowserBrowserRef,\n}: {\n\tid?: string\n\tappInfo: {\n\t\tisRunning: boolean\n\t\tappName?: string\n\t\tname: string\n\t\ttitle: string\n\t\tportIsAvailable: boolean | null\n\t\ttype: string\n\t\tfullPath: string\n\t\tdev: BaseExerciseStepApp['dev']\n\t\ttest: BaseExerciseStepApp['test']\n\t\tstackBlitzUrl: BaseExerciseStepApp['stackBlitzUrl']\n\t} | null\n\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n}) {\n\tconst requestInfo = useRequestInfo()\n\tconst theme = useTheme()\n\tif (!appInfo) return <p>No app here. Sorry.</p>\n\tconst { isRunning, dev, name, portIsAvailable, title } = appInfo\n\n\tif (ENV.EPICSHOP_DEPLOYED && appInfo.stackBlitzUrl) {\n\t\tconst url = new URL(appInfo.stackBlitzUrl)\n\t\turl.searchParams.set('embed', '1')\n\t\turl.searchParams.set('theme', theme)\n\n\t\treturn (\n\t\t\t<StackBlitzEmbed\n\t\t\t\ttitle={title}\n\t\t\t\turl={url.toString()}\n\t\t\t\tloadingContent={\n\t\t\t\t\t<Loading>\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\tLoading{' '}\n\t\t\t\t\t\t\t<a className=\"underline\" href={appInfo.stackBlitzUrl}>\n\t\t\t\t\t\t\t\t\"{title}\"\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</Loading>\n\t\t\t\t}\n\t\t\t/>\n\t\t)\n\t}\n\n\tif (dev.type === 'script') {\n\t\tconst baseUrl = getBaseUrl({\n\t\t\tdomain: requestInfo.domain,\n\t\t\tport: dev.portNumber,\n\t\t})\n\t\treturn (\n\t\t\t<InBrowserBrowser\n\t\t\t\tref={inBrowserBrowserRef}\n\t\t\t\tisRunning={isRunning}\n\t\t\t\tid={id ?? name}\n\t\t\t\tname={name}\n\t\t\t\tportIsAvailable={portIsAvailable}\n\t\t\t\tport={dev.portNumber}\n\t\t\t\tbaseUrl={baseUrl}\n\t\t\t\tinitialRoute={dev.initialRoute}\n\t\t\t/>\n\t\t)\n\t} else if (dev.type === 'browser') {\n\t\treturn (\n\t\t\t<div className=\"relative h-full flex-grow overflow-y-auto scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t<a\n\t\t\t\t\thref={dev.pathname}\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'absolute bottom-5 right-5 flex items-center justify-center rounded-full bg-gray-100 p-2.5 transition hover:bg-gray-200 dark:bg-gray-800 hover:dark:bg-gray-600',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Icon name=\"ExternalLink\" aria-hidden=\"true\" />\n\t\t\t\t\t<span className=\"sr-only\">Open in New Window</span>\n\t\t\t\t</a>\n\t\t\t\t<iframe\n\t\t\t\t\ttitle={title}\n\t\t\t\t\tsrc={dev.pathname}\n\t\t\t\t\tclassName=\"yo yo h-full w-full flex-grow bg-white\"\n\t\t\t\t\tstyle={{ colorScheme: theme }}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t)\n\t} else {\n\t\treturn (\n\t\t\t<div className=\"flex h-full items-center justify-center text-lg\">\n\t\t\t\t<p>\n\t\t\t\t\tPreview for dev type of <code>{dev.type}</code> not supported.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t)\n\t}\n}\n\nexport function StackBlitzEmbed({\n\turl,\n\ttitle,\n\tloadingContent,\n}: {\n\turl: string\n\ttitle?: string\n\tloadingContent: React.ReactNode\n}) {\n\tconst theme = useTheme()\n\tconst [iframeLoaded, setIframeLoaded] = useState(false)\n\n\treturn (\n\t\t<div className=\"h-full w-full flex-grow\">\n\t\t\t{iframeLoaded ? null : (\n\t\t\t\t<div className=\"absolute inset-0 z-10 flex items-center justify-center\">\n\t\t\t\t\t{loadingContent}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<iframe\n\t\t\t\tonLoad={() => setIframeLoaded(true)}\n\t\t\t\t// show what would have shown if there is an error\n\t\t\t\tonError={() => setIframeLoaded(true)}\n\t\t\t\tsrc={url}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'h-full w-full flex-grow transition-opacity duration-300',\n\t\t\t\t\tiframeLoaded ? 'opacity-100' : 'opacity-0',\n\t\t\t\t)}\n\t\t\t\ttitle={title}\n\t\t\t\tsandbox=\"allow-forms allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox\"\n\t\t\t\tstyle={{ colorScheme: theme }}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n"],"names":["AppStopper","name","fetcher","useFetcher","peRedirectInput","usePERedirectInput","inFlightIntent","formData","get","inFlightState","altDown","useAltDown","Form","method","action","children","showProgressBarField","type","value","jsx","className","PortStopper","port","Button","varient","state","AppStarter","data","status","error","Loading","historyCallDataSchema","z.intersection","z.object","z.literal","z.union","z.tuple","z.unknown","z.string","z.number","loadedSchema","messageSchema","getNewIndex","prevIndex","delta","max","InBrowserBrowser","forwardRef","InBrowserBrowserImpl","portIsAvailable","isRunning","baseUrl","id","initialRoute","ref","requestInfo","useRequestInfo","showUnmanaged","setShowUnmanaged","useState","InBrowserBrowserForRealz","jsxs","getBaseUrl","LinkButton","InBrowserBrowserForRealzImpl","theme","useTheme","searchParams","setSearchParams","useSearchParams","searchParamsPathname","iframeKeyNumber","setIframeKeyNumber","iframeKey","lastDirectionRef","useRef","lastDirectionTimeout","iframeContext","setIFrameContext","pathnameInputValue","setPathnameInputValue","iframeRef","appUrl","currentAppUrl","useEffect","iframeSrcUrl","setIframeSrcUrl","currentId","handleMessage","messageEvent","_a","result","prevContext","newIndex","i","currentFullPath","newUrl","newFullPath","newHistory","currentPathname","pathname","setSearchParamsLatestRef","iframePathname","newSearchParams","navigateChild","params","to","_b","handleExtrnalNavigation","newPathnameInputValue","useImperativeHandle","atEndOfHistory","atStartOfHistory","existingSearchParamHiddenInputs","key","TooltipProvider","Tooltip","TooltipTrigger","Icon","TooltipContent","e","clsx","Preview","appInfo","inBrowserBrowserRef","dev","title","url","StackBlitzEmbed","cn","loadingContent","iframeLoaded","setIframeLoaded"],"mappings":"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"}
1
+ {"version":3,"file":"preview-CqZGJtsE.js","sources":["../../../app/routes/start.tsx","../../../app/components/in-browser-browser.tsx","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/preview.tsx"],"sourcesContent":["import { invariant, invariantResponse } from '@epic-web/invariant'\nimport { getAppByName } from '@epic-web/workshop-utils/apps.server'\nimport {\n\tcloseProcess,\n\trunAppDev,\n\tstopPort,\n\twaitOnApp,\n} from '@epic-web/workshop-utils/process-manager.server'\nimport { unstable_data as data, type ActionFunctionArgs } from '@remix-run/node'\nimport { useFetcher } from '@remix-run/react'\nimport { Button } from '#app/components/button.tsx'\nimport { Loading } from '#app/components/loading.tsx'\nimport { showProgressBarField } from '#app/components/progress-bar.tsx'\nimport { ensureUndeployed, useAltDown } from '#app/utils/misc.tsx'\nimport { dataWithPE, usePERedirectInput } from '#app/utils/pe.js'\nimport { createToastHeaders } from '#app/utils/toast.server'\n\nexport async function action({ request }: ActionFunctionArgs) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst intent = formData.get('intent')\n\tinvariantResponse(typeof intent === 'string', 'intent is required')\n\n\tif (intent === 'start' || intent === 'stop' || intent === 'restart') {\n\t\tconst name = formData.get('name')\n\t\tinvariantResponse(typeof name === 'string', 'name is required')\n\t\tconst app = await getAppByName(name)\n\t\tif (!app) {\n\t\t\tthrow new Response('Not found', { status: 404 })\n\t\t}\n\t\tif (app.dev.type !== 'script') {\n\t\t\tthrow new Response(`App \"${name}\" does not have a server`, {\n\t\t\t\tstatus: 400,\n\t\t\t})\n\t\t}\n\n\t\tasync function startApp() {\n\t\t\tinvariant(app, 'app must be defined')\n\t\t\tconst result = await runAppDev(app)\n\t\t\tif (result.running) {\n\t\t\t\tconst appRunningResult = await waitOnApp(app)\n\t\t\t\tif (appRunningResult?.status === 'success') {\n\t\t\t\t\t// wait another 200ms just in case the build output for assets isn't finished\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 200))\n\t\t\t\t\treturn dataWithPE(formData, { status: 'app-started' } as const)\n\t\t\t\t} else if (app.dev.type === 'script') {\n\t\t\t\t\tconst errorMessage = appRunningResult\n\t\t\t\t\t\t? appRunningResult.error\n\t\t\t\t\t\t: 'Unknown error'\n\t\t\t\t\treturn data(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstatus: 'app-not-started',\n\t\t\t\t\t\t\terror: errorMessage,\n\t\t\t\t\t\t\tport: app.dev.portNumber,\n\t\t\t\t\t\t} as const,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstatus: 500,\n\t\t\t\t\t\t\tstatusText: 'App did not start',\n\t\t\t\t\t\t\theaders: await createToastHeaders({\n\t\t\t\t\t\t\t\tdescription: errorMessage,\n\t\t\t\t\t\t\t\ttitle: 'App did not start',\n\t\t\t\t\t\t\t\ttype: 'error',\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}\n\t\t\t} else if (result.portNumber) {\n\t\t\t\treturn dataWithPE(formData, {\n\t\t\t\t\tstatus: 'app-not-started',\n\t\t\t\t\terror: result.status,\n\t\t\t\t\tport: result.portNumber,\n\t\t\t\t} as const)\n\t\t\t} else {\n\t\t\t\tthrow new Response(\n\t\t\t\t\t'Tried starting a server for an app that does not have one',\n\t\t\t\t\t{ status: 400 },\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tasync function stopApp() {\n\t\t\tinvariant(app, 'app must be defined')\n\t\t\tawait closeProcess(app.name)\n\t\t\treturn dataWithPE(formData, { status: 'app-stopped' } as const)\n\t\t}\n\n\t\tswitch (intent) {\n\t\t\tcase 'start': {\n\t\t\t\treturn startApp()\n\t\t\t}\n\t\t\tcase 'stop': {\n\t\t\t\treturn stopApp()\n\t\t\t}\n\t\t\tcase 'restart': {\n\t\t\t\tawait stopApp()\n\t\t\t\treturn startApp()\n\t\t\t}\n\t\t}\n\t}\n\n\tif (intent === 'stop-port') {\n\t\tconst port = formData.get('port')\n\t\tinvariantResponse(typeof port === 'string', 'port is required')\n\t\tawait stopPort(port)\n\t\treturn dataWithPE(formData, { status: 'port-stopped' } as const)\n\t}\n\tthrow new Error(`Unknown intent: ${intent}`)\n}\n\nexport function AppStopper({ name }: { name: string }) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst peRedirectInput = usePERedirectInput()\n\tconst inFlightIntent = fetcher.formData?.get('intent')\n\tconst inFlightState =\n\t\tinFlightIntent === 'stop'\n\t\t\t? 'Stopping App'\n\t\t\t: inFlightIntent === 'restart'\n\t\t\t\t? 'Restarting App'\n\t\t\t\t: null\n\tconst altDown = useAltDown()\n\treturn (\n\t\t<fetcher.Form method=\"POST\" action=\"/start\">\n\t\t\t{peRedirectInput}\n\t\t\t{showProgressBarField}\n\t\t\t<input type=\"hidden\" name=\"name\" value={name} />\n\t\t\t<button\n\t\t\t\ttype=\"submit\"\n\t\t\t\tname=\"intent\"\n\t\t\t\tvalue={altDown ? 'restart' : 'stop'}\n\t\t\t\tclassName=\"h-full border-r px-3 py-4 font-mono text-xs uppercase leading-none\"\n\t\t\t>\n\t\t\t\t{inFlightState ? inFlightState : altDown ? 'Restart App' : 'Stop App'}\n\t\t\t</button>\n\t\t</fetcher.Form>\n\t)\n}\n\nexport function PortStopper({ port }: { port: number | string }) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst peRedirectInput = usePERedirectInput()\n\treturn (\n\t\t<fetcher.Form method=\"POST\" action=\"/start\">\n\t\t\t{peRedirectInput}\n\t\t\t{showProgressBarField}\n\t\t\t<input type=\"hidden\" name=\"port\" value={port} />\n\t\t\t<Button varient=\"mono\" type=\"submit\" name=\"intent\" value=\"stop-port\">\n\t\t\t\t{fetcher.state === 'idle' ? 'Stop Port' : 'Stopping Port'}\n\t\t\t</Button>\n\t\t</fetcher.Form>\n\t)\n}\n\nexport function AppStarter({ name }: { name: string }) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst peRedirectInput = usePERedirectInput()\n\tif (fetcher.data?.status === 'app-not-started') {\n\t\tif (fetcher.data.error === 'port-unavailable') {\n\t\t\treturn (\n\t\t\t\t<div>\n\t\t\t\t\tThe port is unavailable. Would you like to stop whatever is running on\n\t\t\t\t\tthat port and try again?\n\t\t\t\t\t<PortStopper port={fetcher.data.port} />\n\t\t\t\t</div>\n\t\t\t)\n\t\t} else {\n\t\t\treturn <div>An unknown error has happened.</div>\n\t\t}\n\t}\n\treturn (\n\t\t<fetcher.Form method=\"POST\" action=\"/start\">\n\t\t\t{peRedirectInput}\n\t\t\t{showProgressBarField}\n\t\t\t<input type=\"hidden\" name=\"name\" value={name} />\n\t\t\t{fetcher.state === 'idle' ? (\n\t\t\t\t<Button type=\"submit\" name=\"intent\" value=\"start\" varient=\"mono\">\n\t\t\t\t\tStart App\n\t\t\t\t</Button>\n\t\t\t) : (\n\t\t\t\t<div>\n\t\t\t\t\t<Loading>Starting App</Loading>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</fetcher.Form>\n\t)\n}\n","import { Form, useSearchParams, type NavigateFunction } from '@remix-run/react'\nimport { clsx } from 'clsx'\nimport {\n\tforwardRef,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseRef,\n\tuseState,\n\ttype ForwardedRef,\n} from 'react'\nimport { z } from 'zod'\nimport { Icon } from '#app/components/icons.tsx'\nimport { AppStarter, AppStopper, PortStopper } from '#app/routes/start.tsx'\nimport { useTheme } from '#app/routes/theme/index.tsx'\nimport { getBaseUrl } from '#app/utils/misc.tsx'\nimport { useRequestInfo } from '#app/utils/request-info.ts'\nimport { LinkButton } from './button.tsx'\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from './ui/tooltip.tsx'\n\nconst historyCallDataSchema = z.intersection(\n\tz.object({\n\t\ttype: z.literal('epicshop:history-call'),\n\t}),\n\tz.union([\n\t\tz.object({\n\t\t\tmethod: z.literal('pushState'),\n\t\t\targs: z.union([\n\t\t\t\tz.tuple([z.object({}).passthrough(), z.unknown()]),\n\t\t\t\tz.tuple([z.object({}).passthrough(), z.unknown(), z.string()]),\n\t\t\t]),\n\t\t}),\n\t\tz.object({\n\t\t\tmethod: z.literal('replaceState'),\n\t\t\targs: z.union([\n\t\t\t\tz.tuple([z.object({}).passthrough(), z.unknown()]),\n\t\t\t\tz.tuple([z.object({}).passthrough(), z.unknown(), z.string()]),\n\t\t\t]),\n\t\t}),\n\t\tz.object({\n\t\t\tmethod: z.literal('go'),\n\t\t\targs: z.tuple([z.number().optional()]),\n\t\t}),\n\t\tz.object({ method: z.literal('forward'), args: z.tuple([]) }),\n\t\tz.object({ method: z.literal('back'), args: z.tuple([]) }),\n\t\tz.object({\n\t\t\tmethod: z.literal('popstate'),\n\t\t\tpathname: z.string(),\n\t\t\tdelta: z.number(),\n\t\t}),\n\t]),\n)\n\nconst loadedSchema = z.object({\n\ttype: z.literal('epicshop:loaded'),\n\turl: z.string(),\n})\n\nconst messageSchema = z.union([historyCallDataSchema, loadedSchema])\n\nfunction getNewIndex(prevIndex: number, delta: number, max: number) {\n\t// keep the index bound between 0 and the history length\n\treturn Math.min(Math.max(prevIndex + delta, 0), max)\n}\n\ntype Props = {\n\tid: string\n\tname: string\n\tport: number\n\tportIsAvailable: boolean | null\n\tisRunning: boolean\n\tbaseUrl: string\n\tinitialRoute: string\n}\n\nexport type InBrowserBrowserRef = {\n\thandleExtrnalNavigation: (pathname?: string) => void\n}\n\nexport const InBrowserBrowser = forwardRef<InBrowserBrowserRef, Props>(\n\tInBrowserBrowserImpl,\n)\n\nfunction InBrowserBrowserImpl(\n\t{ name, port, portIsAvailable, isRunning, baseUrl, id, initialRoute }: Props,\n\tref: ForwardedRef<InBrowserBrowserRef>,\n) {\n\tconst requestInfo = useRequestInfo()\n\tconst [showUnmanaged, setShowUnmanaged] = useState(false)\n\tif (isRunning || showUnmanaged) {\n\t\treturn (\n\t\t\t<InBrowserBrowserForRealz\n\t\t\t\tbaseUrl={baseUrl}\n\t\t\t\tid={id}\n\t\t\t\tname={name}\n\t\t\t\tref={ref}\n\t\t\t\tinitialRoute={initialRoute}\n\t\t\t/>\n\t\t)\n\t} else if (portIsAvailable === false) {\n\t\treturn (\n\t\t\t<div className=\"flex flex-col items-center justify-center\">\n\t\t\t\t<p className=\"max-w-xs pb-5 text-center\" role=\"status\">\n\t\t\t\t\t{`The port for this app is unavailable. It could be that you're running it `}\n\t\t\t\t\t<a\n\t\t\t\t\t\thref={getBaseUrl({ domain: requestInfo.domain, port })}\n\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t>\n\t\t\t\t\t\telsewhere\n\t\t\t\t\t</a>\n\t\t\t\t\t{'. '}\n\t\t\t\t\t<LinkButton onClick={() => setShowUnmanaged(true)}>\n\t\t\t\t\t\tShow here anyway\n\t\t\t\t\t</LinkButton>\n\t\t\t\t</p>\n\t\t\t\t<PortStopper port={port} />\n\t\t\t</div>\n\t\t)\n\t} else {\n\t\treturn <AppStarter name={name} />\n\t}\n}\ntype RealBrowserProps = {\n\tbaseUrl: string\n\tid: string\n\tname: string\n\tinitialRoute: string\n}\n\nconst InBrowserBrowserForRealz = forwardRef<\n\tInBrowserBrowserRef,\n\tRealBrowserProps\n>(InBrowserBrowserForRealzImpl)\n\n// we're doing this to ensure all of this complex stuff doesn't happen unless\n// the iframe is actually rendered.\nfunction InBrowserBrowserForRealzImpl(\n\t{ baseUrl, id, name, initialRoute }: RealBrowserProps,\n\tref: ForwardedRef<InBrowserBrowserRef>,\n) {\n\tconst theme = useTheme()\n\tconst [searchParams, setSearchParams] = useSearchParams()\n\tconst searchParamsPathname = searchParams.get('pathname') ?? initialRoute\n\tconst [iframeKeyNumber, setIframeKeyNumber] = useState(0)\n\tconst iframeKey = id + iframeKeyNumber\n\tconst lastDirectionRef = useRef<'forward' | 'back' | 'new'>('new')\n\tconst lastDirectionTimeout = useRef<ReturnType<typeof setTimeout> | null>(\n\t\tnull,\n\t)\n\tconst [iframeContext, setIFrameContext] = useState({\n\t\thistory: [searchParamsPathname],\n\t\tindex: 0,\n\t})\n\tconst [pathnameInputValue, setPathnameInputValue] =\n\t\tuseState(searchParamsPathname)\n\tconst iframeRef = useRef<HTMLIFrameElement>(null)\n\n\tconst appUrl = new URL(searchParamsPathname, baseUrl)\n\tconst currentAppUrl = useRef(appUrl)\n\tuseEffect(() => {\n\t\tcurrentAppUrl.current = appUrl\n\t})\n\n\t/** changing the iframeSrcUrl will trigger a reload of the iframe */\n\tconst [iframeSrcUrl, setIframeSrcUrl] = useState(appUrl)\n\n\tconst currentId = useRef(id)\n\t// if the id changes, then we're going to reload the iframe, but we want to\n\t// make sure to preserve the pathname so we set the src to the current pathname\n\t// this is one of the few side-effects in render that are \"ok\"\n\tif (currentId.current !== id) {\n\t\tcurrentId.current = id\n\t\tsetIframeSrcUrl(currentAppUrl.current)\n\t}\n\tuseEffect(() => {\n\t\tcurrentId.current = id\n\t})\n\n\tuseEffect(() => {\n\t\tfunction handleMessage(messageEvent: MessageEvent) {\n\t\t\tif (messageEvent.source !== iframeRef.current?.contentWindow) return\n\n\t\t\tconst result = messageSchema.safeParse(messageEvent.data, {\n\t\t\t\tpath: ['messageEvent', 'data'],\n\t\t\t})\n\t\t\tif (!result.success) return\n\t\t\tconst { data } = result\n\n\t\t\tif (data.type === 'epicshop:loaded') {\n\t\t\t\tsetIFrameContext((prevContext) => {\n\t\t\t\t\tconst newIndex = (i: number) =>\n\t\t\t\t\t\tgetNewIndex(prevContext.index, i, prevContext.history.length - 1)\n\t\t\t\t\tif (lastDirectionRef.current === 'back') {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(-1) }\n\t\t\t\t\t} else if (lastDirectionRef.current === 'forward') {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(1) }\n\t\t\t\t\t} else if (lastDirectionRef.current === 'new') {\n\t\t\t\t\t\tconst currentFullPath = prevContext.history[prevContext.index]\n\t\t\t\t\t\tconst newUrl = new URL(data.url)\n\t\t\t\t\t\tconst newFullPath = newUrl.pathname + newUrl.search\n\n\t\t\t\t\t\tif (currentFullPath === newFullPath) return prevContext\n\n\t\t\t\t\t\tconst newHistory = [\n\t\t\t\t\t\t\t...prevContext.history.slice(0, prevContext.index + 1),\n\t\t\t\t\t\t\tnewFullPath,\n\t\t\t\t\t\t]\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\thistory: newHistory,\n\t\t\t\t\t\t\tindex: newHistory.length - 1,\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error('Unexpected lastDirectionRef value')\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst { method } = data\n\t\t\tsetIFrameContext((prevContext) => {\n\t\t\t\tconst newIndex = (i: number) =>\n\t\t\t\t\tgetNewIndex(prevContext.index, i, prevContext.history.length - 1)\n\t\t\t\tconst currentPathname = prevContext.history[prevContext.index]\n\t\t\t\tswitch (method) {\n\t\t\t\t\tcase 'popstate': {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(data.delta) }\n\t\t\t\t\t}\n\t\t\t\t\tcase 'forward': {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(1) }\n\t\t\t\t\t}\n\t\t\t\t\tcase 'back': {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(-1) }\n\t\t\t\t\t}\n\t\t\t\t\tcase 'pushState': {\n\t\t\t\t\t\tconst pathname = data.args[2] ?? currentPathname\n\t\t\t\t\t\tconst newHistory = [\n\t\t\t\t\t\t\t...prevContext.history.slice(0, prevContext.index + 1),\n\t\t\t\t\t\t\tpathname,\n\t\t\t\t\t\t].filter(Boolean)\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...prevContext,\n\t\t\t\t\t\t\thistory: newHistory,\n\t\t\t\t\t\t\tindex: newHistory.length - 1,\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcase 'replaceState': {\n\t\t\t\t\t\tconst pathname = data.args[2] ?? currentPathname\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...prevContext,\n\t\t\t\t\t\t\thistory: [\n\t\t\t\t\t\t\t\t...prevContext.history.slice(0, prevContext.index),\n\t\t\t\t\t\t\t\tpathname,\n\t\t\t\t\t\t\t\t...prevContext.history.slice(prevContext.index + 1),\n\t\t\t\t\t\t\t].filter(Boolean),\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcase 'go': {\n\t\t\t\t\t\tconst [delta = 0] = data.args\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(delta) }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\twindow.addEventListener('message', handleMessage)\n\t\treturn () => {\n\t\t\twindow.removeEventListener('message', handleMessage)\n\t\t}\n\t}, [])\n\n\t// setSearchParams is unstable\n\t// https://github.com/remix-run/react-router/issues/9991\n\tconst setSearchParamsLatestRef = useRef(setSearchParams)\n\tuseEffect(() => {\n\t\tsetSearchParamsLatestRef.current = setSearchParams\n\t}, [setSearchParams])\n\n\tconst iframePathname = iframeContext.history[iframeContext.index]\n\tuseEffect(() => {\n\t\tif (!iframePathname) return\n\n\t\tsetPathnameInputValue(iframePathname)\n\n\t\tconst newSearchParams = new URLSearchParams(window.location.search)\n\t\tif (iframePathname === '/') {\n\t\t\tnewSearchParams.delete('pathname')\n\t\t} else {\n\t\t\tnewSearchParams.set('pathname', iframePathname)\n\t\t}\n\t\tconst newSearch = newSearchParams.toString()\n\t\tif (`?${newSearch}` !== window.location.search) {\n\t\t\tsetSearchParamsLatestRef.current(newSearchParams, { replace: true })\n\t\t}\n\t}, [iframePathname])\n\n\tconst navigateChild: NavigateFunction = (...params) => {\n\t\tconst to = params[0]\n\t\tif (typeof to === 'number') {\n\t\t\t// this part feels very brittle to me...\n\t\t\tlastDirectionRef.current = to > 0 ? 'forward' : 'back'\n\t\t} else {\n\t\t\tlastDirectionRef.current = 'new'\n\t\t}\n\t\tif (lastDirectionTimeout.current) {\n\t\t\tclearTimeout(lastDirectionTimeout.current)\n\t\t}\n\t\tlastDirectionTimeout.current = setTimeout(() => {\n\t\t\tlastDirectionRef.current = 'new'\n\t\t}, 100)\n\t\tiframeRef.current?.contentWindow?.postMessage(\n\t\t\t{ type: 'epicshop:navigate-call', params },\n\t\t\t'*',\n\t\t)\n\t}\n\n\tfunction handleExtrnalNavigation(\n\t\tnewPathnameInputValue: string = pathnameInputValue,\n\t) {\n\t\tsetPathnameInputValue(newPathnameInputValue)\n\n\t\tconst currentPathname = iframeContext.history[iframeContext.index]\n\t\tnavigateChild(newPathnameInputValue, {\n\t\t\treplace: currentPathname === newPathnameInputValue,\n\t\t})\n\t}\n\n\tuseImperativeHandle(ref, () => ({ handleExtrnalNavigation }))\n\n\tconst atEndOfHistory =\n\t\tiframeContext.index === iframeContext.history.length - 1\n\tconst atStartOfHistory = iframeContext.index <= 0\n\tconst existingSearchParamHiddenInputs: Array<React.ReactElement> = []\n\tfor (const [key, value] of searchParams.entries()) {\n\t\tif (key === 'pathname') continue\n\n\t\texistingSearchParamHiddenInputs.push(\n\t\t\t<input key={key} type=\"hidden\" name={key} value={value} />,\n\t\t)\n\t}\n\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<div className=\"flex h-full flex-grow flex-col\">\n\t\t\t\t<div className=\"flex items-center justify-between border-b pl-1.5\">\n\t\t\t\t\t<div className=\"mr-2 flex items-center justify-center gap-2 px-1\">\n\t\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName=\"hidden aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40 sm:flex\"\n\t\t\t\t\t\t\t\t\tdisabled={atStartOfHistory}\n\t\t\t\t\t\t\t\t\tonClick={() => navigateChild(-1)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon name=\"ArrowLeft\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t<TooltipContent>Go back</TooltipContent>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName=\"hidden aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40 sm:flex\"\n\t\t\t\t\t\t\t\t\tdisabled={atEndOfHistory}\n\t\t\t\t\t\t\t\t\tonClick={() => navigateChild(1)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon name=\"ArrowRight\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t<TooltipContent>Go forward</TooltipContent>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName=\"flex aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40\"\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tsetIframeSrcUrl(appUrl)\n\t\t\t\t\t\t\t\t\t\tsetIframeKeyNumber(iframeKeyNumber + 1)\n\t\t\t\t\t\t\t\t\t\t// TODO: figure out how we can avoid having to do this...\n\t\t\t\t\t\t\t\t\t\t// I stayed up for hours one night trying and couldn't work out\n\t\t\t\t\t\t\t\t\t\t// why react router wouldn't update the UI when using back/forward\n\t\t\t\t\t\t\t\t\t\t// after a refresh.\n\t\t\t\t\t\t\t\t\t\tsetIFrameContext({\n\t\t\t\t\t\t\t\t\t\t\thistory: [appUrl.pathname],\n\t\t\t\t\t\t\t\t\t\t\tindex: 0,\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<Icon name=\"Refresh\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t<TooltipContent>Refresh</TooltipContent>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Form\n\t\t\t\t\t\tmethod=\"get\"\n\t\t\t\t\t\treplace\n\t\t\t\t\t\tclassName=\"flex flex-1 gap-2\"\n\t\t\t\t\t\tonSubmit={() => handleExtrnalNavigation()}\n\t\t\t\t\t>\n\t\t\t\t\t\t{existingSearchParamHiddenInputs}\n\t\t\t\t\t\t<div className=\"flex flex-1 items-center border-x bg-background p-3 leading-none text-foreground\">\n\t\t\t\t\t\t\t<a href={appUrl.toString()} target=\"_blank\" rel=\"noreferrer\">\n\t\t\t\t\t\t\t\t{iframeSrcUrl.host}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\taria-label=\"pathname\"\n\t\t\t\t\t\t\t\tclassName=\"w-full flex-1 bg-background focus-visible:outline-none\"\n\t\t\t\t\t\t\t\tvalue={pathnameInputValue}\n\t\t\t\t\t\t\t\tname=\"pathname\"\n\t\t\t\t\t\t\t\tonChange={(e) => setPathnameInputValue(e.currentTarget.value)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/* TODO: Reconsider if this is needed as browsers don't usually have a submit button in address bar */}\n\t\t\t\t\t\t{/* <button type=\"submit\">Go</button> */}\n\t\t\t\t\t</Form>\n\t\t\t\t\t<AppStopper name={name} />\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={appUrl.toString()}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'flex aspect-square items-center justify-center px-3.5',\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 name=\"ExternalLink\" />\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>Open in new tab</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex h-full w-full flex-grow dark:bg-white\">\n\t\t\t\t\t<iframe\n\t\t\t\t\t\ttitle={name}\n\t\t\t\t\t\tkey={iframeKey}\n\t\t\t\t\t\tref={iframeRef}\n\t\t\t\t\t\tsrc={iframeSrcUrl.toString()}\n\t\t\t\t\t\tclassName=\"h-full w-full flex-grow bg-white\"\n\t\t\t\t\t\tstyle={{ colorScheme: theme }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</TooltipProvider>\n\t)\n}\n","import { type BaseExerciseStepApp } from '@epic-web/workshop-utils/apps.server'\nimport { useState } from 'react'\nimport { Icon } from '#app/components/icons'\nimport {\n\tInBrowserBrowser,\n\ttype InBrowserBrowserRef,\n} from '#app/components/in-browser-browser'\nimport { Loading } from '#app/components/loading.js'\nimport { useTheme } from '#app/routes/theme/index.js'\nimport { cn, getBaseUrl } from '#app/utils/misc'\nimport { useRequestInfo } from '#app/utils/request-info'\n\nexport function Preview({\n\tid,\n\tappInfo,\n\tinBrowserBrowserRef,\n}: {\n\tid?: string\n\tappInfo: {\n\t\tisRunning: boolean\n\t\tappName?: string\n\t\tname: string\n\t\ttitle: string\n\t\tportIsAvailable: boolean | null\n\t\ttype: string\n\t\tfullPath: string\n\t\tdev: BaseExerciseStepApp['dev']\n\t\ttest: BaseExerciseStepApp['test']\n\t\tstackBlitzUrl: BaseExerciseStepApp['stackBlitzUrl']\n\t} | null\n\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n}) {\n\tconst requestInfo = useRequestInfo()\n\tconst theme = useTheme()\n\tif (!appInfo) return <p>No app here. Sorry.</p>\n\tconst { isRunning, dev, name, portIsAvailable, title } = appInfo\n\n\tif (ENV.EPICSHOP_DEPLOYED && appInfo.stackBlitzUrl) {\n\t\tconst url = new URL(appInfo.stackBlitzUrl)\n\t\turl.searchParams.set('embed', '1')\n\t\turl.searchParams.set('theme', theme)\n\n\t\treturn (\n\t\t\t<StackBlitzEmbed\n\t\t\t\ttitle={title}\n\t\t\t\turl={url.toString()}\n\t\t\t\tloadingContent={\n\t\t\t\t\t<Loading>\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\tLoading{' '}\n\t\t\t\t\t\t\t<a className=\"underline\" href={appInfo.stackBlitzUrl}>\n\t\t\t\t\t\t\t\t\"{title}\"\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</Loading>\n\t\t\t\t}\n\t\t\t/>\n\t\t)\n\t}\n\n\tif (dev.type === 'script') {\n\t\tconst baseUrl = getBaseUrl({\n\t\t\tdomain: requestInfo.domain,\n\t\t\tport: dev.portNumber,\n\t\t})\n\t\treturn (\n\t\t\t<InBrowserBrowser\n\t\t\t\tref={inBrowserBrowserRef}\n\t\t\t\tisRunning={isRunning}\n\t\t\t\tid={id ?? name}\n\t\t\t\tname={name}\n\t\t\t\tportIsAvailable={portIsAvailable}\n\t\t\t\tport={dev.portNumber}\n\t\t\t\tbaseUrl={baseUrl}\n\t\t\t\tinitialRoute={dev.initialRoute}\n\t\t\t/>\n\t\t)\n\t} else if (dev.type === 'browser') {\n\t\treturn (\n\t\t\t<div className=\"relative h-full flex-grow overflow-y-auto scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t<a\n\t\t\t\t\thref={dev.pathname}\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'absolute bottom-5 right-5 flex items-center justify-center rounded-full bg-gray-100 p-2.5 transition hover:bg-gray-200 dark:bg-gray-800 hover:dark:bg-gray-600',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Icon name=\"ExternalLink\" aria-hidden=\"true\" />\n\t\t\t\t\t<span className=\"sr-only\">Open in New Window</span>\n\t\t\t\t</a>\n\t\t\t\t<iframe\n\t\t\t\t\ttitle={title}\n\t\t\t\t\tsrc={dev.pathname}\n\t\t\t\t\tclassName=\"yo yo h-full w-full flex-grow bg-white\"\n\t\t\t\t\tstyle={{ colorScheme: theme }}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t)\n\t} else {\n\t\treturn (\n\t\t\t<div className=\"flex h-full items-center justify-center text-lg\">\n\t\t\t\t<p>\n\t\t\t\t\tPreview for dev type of <code>{dev.type}</code> not supported.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t)\n\t}\n}\n\nexport function StackBlitzEmbed({\n\turl,\n\ttitle,\n\tloadingContent,\n}: {\n\turl: string\n\ttitle?: string\n\tloadingContent: React.ReactNode\n}) {\n\tconst theme = useTheme()\n\tconst [iframeLoaded, setIframeLoaded] = useState(false)\n\n\treturn (\n\t\t<div className=\"h-full w-full flex-grow\">\n\t\t\t{iframeLoaded ? null : (\n\t\t\t\t<div className=\"absolute inset-0 z-10 flex items-center justify-center\">\n\t\t\t\t\t{loadingContent}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<iframe\n\t\t\t\tonLoad={() => setIframeLoaded(true)}\n\t\t\t\t// show what would have shown if there is an error\n\t\t\t\tonError={() => setIframeLoaded(true)}\n\t\t\t\tsrc={url}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'h-full w-full flex-grow transition-opacity duration-300',\n\t\t\t\t\tiframeLoaded ? 'opacity-100' : 'opacity-0',\n\t\t\t\t)}\n\t\t\t\ttitle={title}\n\t\t\t\tsandbox=\"allow-forms allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox\"\n\t\t\t\tstyle={{ colorScheme: theme }}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n"],"names":["AppStopper","name","fetcher","useFetcher","peRedirectInput","usePERedirectInput","inFlightIntent","formData","get","inFlightState","altDown","useAltDown","Form","method","action","children","showProgressBarField","type","value","jsx","className","PortStopper","port","Button","varient","state","AppStarter","data","status","error","Loading","historyCallDataSchema","z.intersection","z.object","z.literal","z.union","z.tuple","z.unknown","z.string","z.number","loadedSchema","messageSchema","getNewIndex","prevIndex","delta","max","InBrowserBrowser","forwardRef","InBrowserBrowserImpl","portIsAvailable","isRunning","baseUrl","id","initialRoute","ref","requestInfo","useRequestInfo","showUnmanaged","setShowUnmanaged","useState","InBrowserBrowserForRealz","jsxs","getBaseUrl","LinkButton","InBrowserBrowserForRealzImpl","theme","useTheme","searchParams","setSearchParams","useSearchParams","searchParamsPathname","iframeKeyNumber","setIframeKeyNumber","iframeKey","lastDirectionRef","useRef","lastDirectionTimeout","iframeContext","setIFrameContext","pathnameInputValue","setPathnameInputValue","iframeRef","appUrl","currentAppUrl","useEffect","iframeSrcUrl","setIframeSrcUrl","currentId","handleMessage","messageEvent","_a","result","prevContext","newIndex","i","currentFullPath","newUrl","newFullPath","newHistory","currentPathname","pathname","setSearchParamsLatestRef","iframePathname","newSearchParams","navigateChild","params","to","_b","handleExtrnalNavigation","newPathnameInputValue","useImperativeHandle","atEndOfHistory","atStartOfHistory","existingSearchParamHiddenInputs","key","TooltipProvider","Tooltip","TooltipTrigger","Icon","TooltipContent","e","clsx","Preview","appInfo","inBrowserBrowserRef","dev","title","url","StackBlitzEmbed","cn","loadingContent","iframeLoaded","setIframeLoaded"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./index-Dsusf_Av.js";import{u as g}from"./index-CEP3Xxa0.js";import{a as r}from"./misc-2sBiisF5.js";import{u as p}from"./workshop-config-DchzGYJM.js";const i={font:"w-[1em] h-[1em]",xs:"w-3 h-3",sm:"w-4 h-4",md:"w-5 h-5",lg:"w-6 h-6",xl:"w-7 h-7","2xl":"w-8 h-8"},x={font:"gap-1.5",xs:"gap-1.5",sm:"gap-1.5",md:"gap-2",lg:"gap-2",xl:"gap-3","2xl":"gap-4"};function w({size:s="font",style:c="themed",className:o,children:t,...m}){const{product:{logo:n,displayName:l}}=p(),h=g(),a=n.includes(".svg")?e.jsxs("svg",{...m,className:r(i[s],"inline self-center",o),children:[e.jsx("title",{children:l}),e.jsx("use",{href:`${n}#${c==="themed"?h:"monochrome"}`})]}):e.jsx("img",{src:n,alt:l,...m,className:r(i[s],"inline self-center",o)});return t?e.jsxs("span",{className:`inline-flex items-center ${x[s]}`,children:[a,t]}):a}export{w as L};
2
- //# sourceMappingURL=product-Cyum2biy.js.map
1
+ import{j as e}from"./index-Dsusf_Av.js";import{u as g}from"./index-DLC5u33j.js";import{a as r}from"./misc-2sBiisF5.js";import{u as p}from"./workshop-config-DchzGYJM.js";const i={font:"w-[1em] h-[1em]",xs:"w-3 h-3",sm:"w-4 h-4",md:"w-5 h-5",lg:"w-6 h-6",xl:"w-7 h-7","2xl":"w-8 h-8"},x={font:"gap-1.5",xs:"gap-1.5",sm:"gap-1.5",md:"gap-2",lg:"gap-2",xl:"gap-3","2xl":"gap-4"};function w({size:s="font",style:c="themed",className:o,children:t,...m}){const{product:{logo:n,displayName:l}}=p(),h=g(),a=n.includes(".svg")?e.jsxs("svg",{...m,className:r(i[s],"inline self-center",o),children:[e.jsx("title",{children:l}),e.jsx("use",{href:`${n}#${c==="themed"?h:"monochrome"}`})]}):e.jsx("img",{src:n,alt:l,...m,className:r(i[s],"inline self-center",o)});return t?e.jsxs("span",{className:`inline-flex items-center ${x[s]}`,children:[a,t]}):a}export{w as L};
2
+ //# sourceMappingURL=product-DJOWNuL-.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"product-Cyum2biy.js","sources":["../../../app/components/product.tsx"],"sourcesContent":["import { useTheme } from '#app/routes/theme/index.js'\nimport { cn } from '#app/utils/misc.tsx'\nimport { useWorkshopConfig } from './workshop-config.tsx'\n\ntype Sizes = 'font' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n\nconst sizeClassName = {\n\tfont: 'w-[1em] h-[1em]',\n\txs: 'w-3 h-3',\n\tsm: 'w-4 h-4',\n\tmd: 'w-5 h-5',\n\tlg: 'w-6 h-6',\n\txl: 'w-7 h-7',\n\t'2xl': 'w-8 h-8',\n} as const\n\nconst childrenSizeClassName = {\n\tfont: 'gap-1.5',\n\txs: 'gap-1.5',\n\tsm: 'gap-1.5',\n\tmd: 'gap-2',\n\tlg: 'gap-2',\n\txl: 'gap-3',\n\t'2xl': 'gap-4',\n} satisfies Record<Sizes, string>\n\nexport function ProductName(props: React.HTMLAttributes<HTMLSpanElement>) {\n\tconst {\n\t\tproduct: { displayName },\n\t} = useWorkshopConfig()\n\treturn <span {...props}>{displayName}</span>\n}\n\nexport function Logo({\n\tsize = 'font',\n\tstyle = 'themed',\n\tclassName,\n\tchildren,\n\t...props\n}: React.SVGProps<SVGSVGElement> & {\n\tsize?: Sizes\n\tstyle?: 'themed' | 'monochrome'\n\tclassName?: string\n\tchildren?: React.ReactNode\n}) {\n\tconst {\n\t\tproduct: { logo, displayName },\n\t} = useWorkshopConfig()\n\tconst theme = useTheme()\n\n\tconst logoElement = logo.includes('.svg') ? (\n\t\t<svg\n\t\t\t{...props}\n\t\t\tclassName={cn(sizeClassName[size], 'inline self-center', className)}\n\t\t>\n\t\t\t<title>{displayName}</title>\n\t\t\t<use href={`${logo}#${style === 'themed' ? theme : 'monochrome'}`} />\n\t\t</svg>\n\t) : (\n\t\t// @ts-expect-error - svg props can't all be applied to img... meh, probably won't ever be a real issue...\n\t\t<img\n\t\t\tsrc={logo}\n\t\t\talt={displayName}\n\t\t\t{...props}\n\t\t\tclassName={cn(sizeClassName[size], 'inline self-center', className)}\n\t\t/>\n\t)\n\n\tif (children) {\n\t\treturn (\n\t\t\t<span\n\t\t\t\tclassName={`inline-flex items-center ${childrenSizeClassName[size]}`}\n\t\t\t>\n\t\t\t\t{logoElement}\n\t\t\t\t{children}\n\t\t\t</span>\n\t\t)\n\t}\n\n\treturn logoElement\n}\n"],"names":["sizeClassName","childrenSizeClassName","Logo","size","style","className","children","props","logo","displayName","useWorkshopConfig","theme","useTheme","logoElement","jsxs","cn","jsx"],"mappings":"yKAMA,MAAMA,EAAgB,CACrB,KAAM,kBACN,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,MAAO,SACR,EAEMC,EAAwB,CAC7B,KAAM,UACN,GAAI,UACJ,GAAI,UACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,MAAO,OACR,EASO,SAASC,EAAK,CACpB,KAAAC,EAAO,OACP,MAAAC,EAAQ,SACR,UAAAC,EACA,SAAAC,EACA,GAAGC,CACJ,EAKG,CACI,KAAA,CACL,QAAS,CAAE,KAAAC,EAAM,YAAAC,CAAY,GAC1BC,EAAkB,EAChBC,EAAQC,EAAS,EAEjBC,EAAcL,EAAK,SAAS,MAAM,EACvCM,EAAA,KAAC,MAAA,CACC,GAAGP,EACJ,UAAWQ,EAAGf,EAAcG,CAAI,EAAG,qBAAsBE,CAAS,EAElE,SAAA,CAAAW,EAAAA,IAAC,SAAO,SAAYP,CAAA,CAAA,EACpBO,EAAAA,IAAC,MAAI,CAAA,KAAM,GAAGR,CAAI,IAAIJ,IAAU,SAAWO,EAAQ,YAAY,EAAI,CAAA,CAAA,CAAA,CACpE,EAGAK,EAAA,IAAC,MAAA,CACA,IAAKR,EACL,IAAKC,EACJ,GAAGF,EACJ,UAAWQ,EAAGf,EAAcG,CAAI,EAAG,qBAAsBE,CAAS,CAAA,CAAA,EAIpE,OAAIC,EAEFQ,EAAA,KAAC,OAAA,CACA,UAAW,4BAA4Bb,EAAsBE,CAAI,CAAC,GAEjE,SAAA,CAAAU,EACAP,CAAA,CAAA,CACF,EAIKO,CACR"}
1
+ {"version":3,"file":"product-DJOWNuL-.js","sources":["../../../app/components/product.tsx"],"sourcesContent":["import { useTheme } from '#app/routes/theme/index.js'\nimport { cn } from '#app/utils/misc.tsx'\nimport { useWorkshopConfig } from './workshop-config.tsx'\n\ntype Sizes = 'font' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n\nconst sizeClassName = {\n\tfont: 'w-[1em] h-[1em]',\n\txs: 'w-3 h-3',\n\tsm: 'w-4 h-4',\n\tmd: 'w-5 h-5',\n\tlg: 'w-6 h-6',\n\txl: 'w-7 h-7',\n\t'2xl': 'w-8 h-8',\n} as const\n\nconst childrenSizeClassName = {\n\tfont: 'gap-1.5',\n\txs: 'gap-1.5',\n\tsm: 'gap-1.5',\n\tmd: 'gap-2',\n\tlg: 'gap-2',\n\txl: 'gap-3',\n\t'2xl': 'gap-4',\n} satisfies Record<Sizes, string>\n\nexport function ProductName(props: React.HTMLAttributes<HTMLSpanElement>) {\n\tconst {\n\t\tproduct: { displayName },\n\t} = useWorkshopConfig()\n\treturn <span {...props}>{displayName}</span>\n}\n\nexport function Logo({\n\tsize = 'font',\n\tstyle = 'themed',\n\tclassName,\n\tchildren,\n\t...props\n}: React.SVGProps<SVGSVGElement> & {\n\tsize?: Sizes\n\tstyle?: 'themed' | 'monochrome'\n\tclassName?: string\n\tchildren?: React.ReactNode\n}) {\n\tconst {\n\t\tproduct: { logo, displayName },\n\t} = useWorkshopConfig()\n\tconst theme = useTheme()\n\n\tconst logoElement = logo.includes('.svg') ? (\n\t\t<svg\n\t\t\t{...props}\n\t\t\tclassName={cn(sizeClassName[size], 'inline self-center', className)}\n\t\t>\n\t\t\t<title>{displayName}</title>\n\t\t\t<use href={`${logo}#${style === 'themed' ? theme : 'monochrome'}`} />\n\t\t</svg>\n\t) : (\n\t\t// @ts-expect-error - svg props can't all be applied to img... meh, probably won't ever be a real issue...\n\t\t<img\n\t\t\tsrc={logo}\n\t\t\talt={displayName}\n\t\t\t{...props}\n\t\t\tclassName={cn(sizeClassName[size], 'inline self-center', className)}\n\t\t/>\n\t)\n\n\tif (children) {\n\t\treturn (\n\t\t\t<span\n\t\t\t\tclassName={`inline-flex items-center ${childrenSizeClassName[size]}`}\n\t\t\t>\n\t\t\t\t{logoElement}\n\t\t\t\t{children}\n\t\t\t</span>\n\t\t)\n\t}\n\n\treturn logoElement\n}\n"],"names":["sizeClassName","childrenSizeClassName","Logo","size","style","className","children","props","logo","displayName","useWorkshopConfig","theme","useTheme","logoElement","jsxs","cn","jsx"],"mappings":"yKAMA,MAAMA,EAAgB,CACrB,KAAM,kBACN,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,GAAI,UACJ,MAAO,SACR,EAEMC,EAAwB,CAC7B,KAAM,UACN,GAAI,UACJ,GAAI,UACJ,GAAI,QACJ,GAAI,QACJ,GAAI,QACJ,MAAO,OACR,EASO,SAASC,EAAK,CACpB,KAAAC,EAAO,OACP,MAAAC,EAAQ,SACR,UAAAC,EACA,SAAAC,EACA,GAAGC,CACJ,EAKG,CACI,KAAA,CACL,QAAS,CAAE,KAAAC,EAAM,YAAAC,CAAY,GAC1BC,EAAkB,EAChBC,EAAQC,EAAS,EAEjBC,EAAcL,EAAK,SAAS,MAAM,EACvCM,EAAA,KAAC,MAAA,CACC,GAAGP,EACJ,UAAWQ,EAAGf,EAAcG,CAAI,EAAG,qBAAsBE,CAAS,EAElE,SAAA,CAAAW,EAAAA,IAAC,SAAO,SAAYP,CAAA,CAAA,EACpBO,EAAAA,IAAC,MAAI,CAAA,KAAM,GAAGR,CAAI,IAAIJ,IAAU,SAAWO,EAAQ,YAAY,EAAI,CAAA,CAAA,CAAA,CACpE,EAGAK,EAAA,IAAC,MAAA,CACA,IAAKR,EACL,IAAKC,EACJ,GAAGF,EACJ,UAAWQ,EAAGf,EAAcG,CAAI,EAAG,qBAAsBE,CAAS,CAAA,CAAA,EAIpE,OAAIC,EAEFQ,EAAA,KAAC,OAAA,CACA,UAAW,4BAA4Bb,EAAsBE,CAAI,CAAC,GAEjE,SAAA,CAAAU,EACAP,CAAA,CAAA,CACF,EAIKO,CACR"}
@@ -1,8 +1,8 @@
1
- import{_ as o,s as _e,g as Ae,t as ie,q as ke,a as Fe,b as Pe,c as wt,l as At,d as zt,e as ve,z as Ce,H as D,a1 as Le,i as Ee}from"./mermaid.core-ZaxoMXOj.js";import{l as ee}from"./linear-B3zp51yW.js";import"./mdx-Dfsh6Vjk.js";import"./index-Dsusf_Av.js";import"./misc-2sBiisF5.js";import"./components-5arJTWsS.js";import"./epic-video-DN9DRRHf.js";import"./index-CEP3Xxa0.js";import"./tooltip-Bzd6O8vq.js";import"./pe-BShc2dvc.js";import"./online-IWqRB9zP.js";import"./loading-BPTYJOXN.js";import"./user-DNSnhqGn.js";import"./workshop-config-DchzGYJM.js";import"./progress-bar-DgnkQxQw.js";import"./init-Gi6I4Gst.js";var Vt=function(){var t=o(function(j,r,l,g){for(l=l||{},g=j.length;g--;l[j[g]]=r);return l},"o"),n=[1,3],u=[1,4],c=[1,5],h=[1,6],p=[1,7],y=[1,4,5,10,12,13,14,18,25,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],S=[1,4,5,10,12,13,14,18,25,28,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],a=[55,56,57],A=[2,36],d=[1,37],T=[1,36],m=[1,38],q=[1,35],b=[1,43],x=[1,41],O=[1,14],Y=[1,23],G=[1,18],yt=[1,19],Tt=[1,20],dt=[1,21],Ft=[1,22],ut=[1,24],xt=[1,25],ft=[1,26],gt=[1,27],i=[1,28],Bt=[1,29],W=[1,32],U=[1,33],k=[1,34],F=[1,39],P=[1,40],v=[1,42],C=[1,44],H=[1,62],X=[1,61],L=[4,5,8,10,12,13,14,18,44,47,49,55,56,57,63,64,65,66,67],Rt=[1,65],Nt=[1,66],Wt=[1,67],Ut=[1,68],Qt=[1,69],Ot=[1,70],Ht=[1,71],Xt=[1,72],Mt=[1,73],Yt=[1,74],jt=[1,75],Gt=[1,76],I=[4,5,6,7,8,9,10,11,12,13,14,15,18],J=[1,90],$=[1,91],tt=[1,92],et=[1,99],it=[1,93],at=[1,96],nt=[1,94],st=[1,95],rt=[1,97],ot=[1,98],Pt=[1,102],Kt=[10,55,56,57],R=[4,5,6,8,10,11,13,17,18,19,20,55,56,57],vt={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,idStringToken:3,ALPHA:4,NUM:5,NODE_STRING:6,DOWN:7,MINUS:8,DEFAULT:9,COMMA:10,COLON:11,AMP:12,BRKT:13,MULT:14,UNICODE_TEXT:15,styleComponent:16,UNIT:17,SPACE:18,STYLE:19,PCT:20,idString:21,style:22,stylesOpt:23,classDefStatement:24,CLASSDEF:25,start:26,eol:27,QUADRANT:28,document:29,line:30,statement:31,axisDetails:32,quadrantDetails:33,points:34,title:35,title_value:36,acc_title:37,acc_title_value:38,acc_descr:39,acc_descr_value:40,acc_descr_multiline_value:41,section:42,text:43,point_start:44,point_x:45,point_y:46,class_name:47,"X-AXIS":48,"AXIS-TEXT-DELIMITER":49,"Y-AXIS":50,QUADRANT_1:51,QUADRANT_2:52,QUADRANT_3:53,QUADRANT_4:54,NEWLINE:55,SEMI:56,EOF:57,alphaNumToken:58,textNoTagsToken:59,STR:60,MD_STR:61,alphaNum:62,PUNCTUATION:63,PLUS:64,EQUALS:65,DOT:66,UNDERSCORE:67,$accept:0,$end:1},terminals_:{2:"error",4:"ALPHA",5:"NUM",6:"NODE_STRING",7:"DOWN",8:"MINUS",9:"DEFAULT",10:"COMMA",11:"COLON",12:"AMP",13:"BRKT",14:"MULT",15:"UNICODE_TEXT",17:"UNIT",18:"SPACE",19:"STYLE",20:"PCT",25:"CLASSDEF",28:"QUADRANT",35:"title",36:"title_value",37:"acc_title",38:"acc_title_value",39:"acc_descr",40:"acc_descr_value",41:"acc_descr_multiline_value",42:"section",44:"point_start",45:"point_x",46:"point_y",47:"class_name",48:"X-AXIS",49:"AXIS-TEXT-DELIMITER",50:"Y-AXIS",51:"QUADRANT_1",52:"QUADRANT_2",53:"QUADRANT_3",54:"QUADRANT_4",55:"NEWLINE",56:"SEMI",57:"EOF",60:"STR",61:"MD_STR",63:"PUNCTUATION",64:"PLUS",65:"EQUALS",66:"DOT",67:"UNDERSCORE"},productions_:[0,[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[21,1],[21,2],[22,1],[22,2],[23,1],[23,3],[24,5],[26,2],[26,2],[26,2],[29,0],[29,2],[30,2],[31,0],[31,1],[31,2],[31,1],[31,1],[31,1],[31,2],[31,2],[31,2],[31,1],[31,1],[34,4],[34,5],[34,5],[34,6],[32,4],[32,3],[32,2],[32,4],[32,3],[32,2],[33,2],[33,2],[33,2],[33,2],[27,1],[27,1],[27,1],[43,1],[43,2],[43,1],[43,1],[62,1],[62,2],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[59,1],[59,1],[59,1]],performAction:o(function(r,l,g,f,_,e,pt){var s=e.length-1;switch(_){case 23:this.$=e[s];break;case 24:this.$=e[s-1]+""+e[s];break;case 26:this.$=e[s-1]+e[s];break;case 27:this.$=[e[s].trim()];break;case 28:e[s-2].push(e[s].trim()),this.$=e[s-2];break;case 29:this.$=e[s-4],f.addClass(e[s-2],e[s]);break;case 37:this.$=[];break;case 42:this.$=e[s].trim(),f.setDiagramTitle(this.$);break;case 43:this.$=e[s].trim(),f.setAccTitle(this.$);break;case 44:case 45:this.$=e[s].trim(),f.setAccDescription(this.$);break;case 46:f.addSection(e[s].substr(8)),this.$=e[s].substr(8);break;case 47:f.addPoint(e[s-3],"",e[s-1],e[s],[]);break;case 48:f.addPoint(e[s-4],e[s-3],e[s-1],e[s],[]);break;case 49:f.addPoint(e[s-4],"",e[s-2],e[s-1],e[s]);break;case 50:f.addPoint(e[s-5],e[s-4],e[s-2],e[s-1],e[s]);break;case 51:f.setXAxisLeftText(e[s-2]),f.setXAxisRightText(e[s]);break;case 52:e[s-1].text+=" ⟶ ",f.setXAxisLeftText(e[s-1]);break;case 53:f.setXAxisLeftText(e[s]);break;case 54:f.setYAxisBottomText(e[s-2]),f.setYAxisTopText(e[s]);break;case 55:e[s-1].text+=" ⟶ ",f.setYAxisBottomText(e[s-1]);break;case 56:f.setYAxisBottomText(e[s]);break;case 57:f.setQuadrant1Text(e[s]);break;case 58:f.setQuadrant2Text(e[s]);break;case 59:f.setQuadrant3Text(e[s]);break;case 60:f.setQuadrant4Text(e[s]);break;case 64:this.$={text:e[s],type:"text"};break;case 65:this.$={text:e[s-1].text+""+e[s],type:e[s-1].type};break;case 66:this.$={text:e[s],type:"text"};break;case 67:this.$={text:e[s],type:"markdown"};break;case 68:this.$=e[s];break;case 69:this.$=e[s-1]+""+e[s];break}},"anonymous"),table:[{18:n,26:1,27:2,28:u,55:c,56:h,57:p},{1:[3]},{18:n,26:8,27:2,28:u,55:c,56:h,57:p},{18:n,26:9,27:2,28:u,55:c,56:h,57:p},t(y,[2,33],{29:10}),t(S,[2,61]),t(S,[2,62]),t(S,[2,63]),{1:[2,30]},{1:[2,31]},t(a,A,{30:11,31:12,24:13,32:15,33:16,34:17,43:30,58:31,1:[2,32],4:d,5:T,10:m,12:q,13:b,14:x,18:O,25:Y,35:G,37:yt,39:Tt,41:dt,42:Ft,48:ut,50:xt,51:ft,52:gt,53:i,54:Bt,60:W,61:U,63:k,64:F,65:P,66:v,67:C}),t(y,[2,34]),{27:45,55:c,56:h,57:p},t(a,[2,37]),t(a,A,{24:13,32:15,33:16,34:17,43:30,58:31,31:46,4:d,5:T,10:m,12:q,13:b,14:x,18:O,25:Y,35:G,37:yt,39:Tt,41:dt,42:Ft,48:ut,50:xt,51:ft,52:gt,53:i,54:Bt,60:W,61:U,63:k,64:F,65:P,66:v,67:C}),t(a,[2,39]),t(a,[2,40]),t(a,[2,41]),{36:[1,47]},{38:[1,48]},{40:[1,49]},t(a,[2,45]),t(a,[2,46]),{18:[1,50]},{4:d,5:T,10:m,12:q,13:b,14:x,43:51,58:31,60:W,61:U,63:k,64:F,65:P,66:v,67:C},{4:d,5:T,10:m,12:q,13:b,14:x,43:52,58:31,60:W,61:U,63:k,64:F,65:P,66:v,67:C},{4:d,5:T,10:m,12:q,13:b,14:x,43:53,58:31,60:W,61:U,63:k,64:F,65:P,66:v,67:C},{4:d,5:T,10:m,12:q,13:b,14:x,43:54,58:31,60:W,61:U,63:k,64:F,65:P,66:v,67:C},{4:d,5:T,10:m,12:q,13:b,14:x,43:55,58:31,60:W,61:U,63:k,64:F,65:P,66:v,67:C},{4:d,5:T,10:m,12:q,13:b,14:x,43:56,58:31,60:W,61:U,63:k,64:F,65:P,66:v,67:C},{4:d,5:T,8:H,10:m,12:q,13:b,14:x,18:X,44:[1,57],47:[1,58],58:60,59:59,63:k,64:F,65:P,66:v,67:C},t(L,[2,64]),t(L,[2,66]),t(L,[2,67]),t(L,[2,70]),t(L,[2,71]),t(L,[2,72]),t(L,[2,73]),t(L,[2,74]),t(L,[2,75]),t(L,[2,76]),t(L,[2,77]),t(L,[2,78]),t(L,[2,79]),t(L,[2,80]),t(y,[2,35]),t(a,[2,38]),t(a,[2,42]),t(a,[2,43]),t(a,[2,44]),{3:64,4:Rt,5:Nt,6:Wt,7:Ut,8:Qt,9:Ot,10:Ht,11:Xt,12:Mt,13:Yt,14:jt,15:Gt,21:63},t(a,[2,53],{59:59,58:60,4:d,5:T,8:H,10:m,12:q,13:b,14:x,18:X,49:[1,77],63:k,64:F,65:P,66:v,67:C}),t(a,[2,56],{59:59,58:60,4:d,5:T,8:H,10:m,12:q,13:b,14:x,18:X,49:[1,78],63:k,64:F,65:P,66:v,67:C}),t(a,[2,57],{59:59,58:60,4:d,5:T,8:H,10:m,12:q,13:b,14:x,18:X,63:k,64:F,65:P,66:v,67:C}),t(a,[2,58],{59:59,58:60,4:d,5:T,8:H,10:m,12:q,13:b,14:x,18:X,63:k,64:F,65:P,66:v,67:C}),t(a,[2,59],{59:59,58:60,4:d,5:T,8:H,10:m,12:q,13:b,14:x,18:X,63:k,64:F,65:P,66:v,67:C}),t(a,[2,60],{59:59,58:60,4:d,5:T,8:H,10:m,12:q,13:b,14:x,18:X,63:k,64:F,65:P,66:v,67:C}),{45:[1,79]},{44:[1,80]},t(L,[2,65]),t(L,[2,81]),t(L,[2,82]),t(L,[2,83]),{3:82,4:Rt,5:Nt,6:Wt,7:Ut,8:Qt,9:Ot,10:Ht,11:Xt,12:Mt,13:Yt,14:jt,15:Gt,18:[1,81]},t(I,[2,23]),t(I,[2,1]),t(I,[2,2]),t(I,[2,3]),t(I,[2,4]),t(I,[2,5]),t(I,[2,6]),t(I,[2,7]),t(I,[2,8]),t(I,[2,9]),t(I,[2,10]),t(I,[2,11]),t(I,[2,12]),t(a,[2,52],{58:31,43:83,4:d,5:T,10:m,12:q,13:b,14:x,60:W,61:U,63:k,64:F,65:P,66:v,67:C}),t(a,[2,55],{58:31,43:84,4:d,5:T,10:m,12:q,13:b,14:x,60:W,61:U,63:k,64:F,65:P,66:v,67:C}),{46:[1,85]},{45:[1,86]},{4:J,5:$,6:tt,8:et,11:it,13:at,16:89,17:nt,18:st,19:rt,20:ot,22:88,23:87},t(I,[2,24]),t(a,[2,51],{59:59,58:60,4:d,5:T,8:H,10:m,12:q,13:b,14:x,18:X,63:k,64:F,65:P,66:v,67:C}),t(a,[2,54],{59:59,58:60,4:d,5:T,8:H,10:m,12:q,13:b,14:x,18:X,63:k,64:F,65:P,66:v,67:C}),t(a,[2,47],{22:88,16:89,23:100,4:J,5:$,6:tt,8:et,11:it,13:at,17:nt,18:st,19:rt,20:ot}),{46:[1,101]},t(a,[2,29],{10:Pt}),t(Kt,[2,27],{16:103,4:J,5:$,6:tt,8:et,11:it,13:at,17:nt,18:st,19:rt,20:ot}),t(R,[2,25]),t(R,[2,13]),t(R,[2,14]),t(R,[2,15]),t(R,[2,16]),t(R,[2,17]),t(R,[2,18]),t(R,[2,19]),t(R,[2,20]),t(R,[2,21]),t(R,[2,22]),t(a,[2,49],{10:Pt}),t(a,[2,48],{22:88,16:89,23:104,4:J,5:$,6:tt,8:et,11:it,13:at,17:nt,18:st,19:rt,20:ot}),{4:J,5:$,6:tt,8:et,11:it,13:at,16:89,17:nt,18:st,19:rt,20:ot,22:105},t(R,[2,26]),t(a,[2,50],{10:Pt}),t(Kt,[2,28],{16:103,4:J,5:$,6:tt,8:et,11:it,13:at,17:nt,18:st,19:rt,20:ot})],defaultActions:{8:[2,30],9:[2,31]},parseError:o(function(r,l){if(l.recoverable)this.trace(r);else{var g=new Error(r);throw g.hash=l,g}},"parseError"),parse:o(function(r){var l=this,g=[0],f=[],_=[null],e=[],pt=this.table,s="",qt=0,Zt=0,me=2,Jt=1,qe=e.slice.call(arguments,1),E=Object.create(this.lexer),K={yy:{}};for(var Ct in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Ct)&&(K.yy[Ct]=this.yy[Ct]);E.setInput(r,K.yy),K.yy.lexer=E,K.yy.parser=this,typeof E.yylloc>"u"&&(E.yylloc={});var Lt=E.yylloc;e.push(Lt);var be=E.options&&E.options.ranges;typeof K.yy.parseError=="function"?this.parseError=K.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Se(B){g.length=g.length-2*B,_.length=_.length-B,e.length=e.length-B}o(Se,"popStack");function $t(){var B;return B=f.pop()||E.lex()||Jt,typeof B!="number"&&(B instanceof Array&&(f=B,B=f.pop()),B=l.symbols_[B]||B),B}o($t,"lex");for(var w,Z,N,Et,lt={},bt,M,te,St;;){if(Z=g[g.length-1],this.defaultActions[Z]?N=this.defaultActions[Z]:((w===null||typeof w>"u")&&(w=$t()),N=pt[Z]&&pt[Z][w]),typeof N>"u"||!N.length||!N[0]){var Dt="";St=[];for(bt in pt[Z])this.terminals_[bt]&&bt>me&&St.push("'"+this.terminals_[bt]+"'");E.showPosition?Dt="Parse error on line "+(qt+1)+`:
1
+ import{_ as o,s as _e,g as Ae,t as ie,q as ke,a as Fe,b as Pe,c as wt,l as At,d as zt,e as ve,z as Ce,H as D,a1 as Le,i as Ee}from"./mermaid.core-q9C-HfFu.js";import{l as ee}from"./linear-LWRPSVMz.js";import"./mdx-C7imFHZE.js";import"./index-Dsusf_Av.js";import"./misc-2sBiisF5.js";import"./components-5arJTWsS.js";import"./epic-video-CmlkW6Rw.js";import"./index-DLC5u33j.js";import"./tooltip-Bzd6O8vq.js";import"./pe-BShc2dvc.js";import"./online-DZKJk3C2.js";import"./loading-b1FV2pQh.js";import"./user-DNSnhqGn.js";import"./workshop-config-DchzGYJM.js";import"./progress-bar-DgnkQxQw.js";import"./init-Gi6I4Gst.js";var Vt=function(){var t=o(function(j,r,l,g){for(l=l||{},g=j.length;g--;l[j[g]]=r);return l},"o"),n=[1,3],u=[1,4],c=[1,5],h=[1,6],p=[1,7],y=[1,4,5,10,12,13,14,18,25,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],S=[1,4,5,10,12,13,14,18,25,28,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],a=[55,56,57],A=[2,36],d=[1,37],T=[1,36],m=[1,38],q=[1,35],b=[1,43],x=[1,41],O=[1,14],Y=[1,23],G=[1,18],yt=[1,19],Tt=[1,20],dt=[1,21],Ft=[1,22],ut=[1,24],xt=[1,25],ft=[1,26],gt=[1,27],i=[1,28],Bt=[1,29],W=[1,32],U=[1,33],k=[1,34],F=[1,39],P=[1,40],v=[1,42],C=[1,44],H=[1,62],X=[1,61],L=[4,5,8,10,12,13,14,18,44,47,49,55,56,57,63,64,65,66,67],Rt=[1,65],Nt=[1,66],Wt=[1,67],Ut=[1,68],Qt=[1,69],Ot=[1,70],Ht=[1,71],Xt=[1,72],Mt=[1,73],Yt=[1,74],jt=[1,75],Gt=[1,76],I=[4,5,6,7,8,9,10,11,12,13,14,15,18],J=[1,90],$=[1,91],tt=[1,92],et=[1,99],it=[1,93],at=[1,96],nt=[1,94],st=[1,95],rt=[1,97],ot=[1,98],Pt=[1,102],Kt=[10,55,56,57],R=[4,5,6,8,10,11,13,17,18,19,20,55,56,57],vt={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,idStringToken:3,ALPHA:4,NUM:5,NODE_STRING:6,DOWN:7,MINUS:8,DEFAULT:9,COMMA:10,COLON:11,AMP:12,BRKT:13,MULT:14,UNICODE_TEXT:15,styleComponent:16,UNIT:17,SPACE:18,STYLE:19,PCT:20,idString:21,style:22,stylesOpt:23,classDefStatement:24,CLASSDEF:25,start:26,eol:27,QUADRANT:28,document:29,line:30,statement:31,axisDetails:32,quadrantDetails:33,points:34,title:35,title_value:36,acc_title:37,acc_title_value:38,acc_descr:39,acc_descr_value:40,acc_descr_multiline_value:41,section:42,text:43,point_start:44,point_x:45,point_y:46,class_name:47,"X-AXIS":48,"AXIS-TEXT-DELIMITER":49,"Y-AXIS":50,QUADRANT_1:51,QUADRANT_2:52,QUADRANT_3:53,QUADRANT_4:54,NEWLINE:55,SEMI:56,EOF:57,alphaNumToken:58,textNoTagsToken:59,STR:60,MD_STR:61,alphaNum:62,PUNCTUATION:63,PLUS:64,EQUALS:65,DOT:66,UNDERSCORE:67,$accept:0,$end:1},terminals_:{2:"error",4:"ALPHA",5:"NUM",6:"NODE_STRING",7:"DOWN",8:"MINUS",9:"DEFAULT",10:"COMMA",11:"COLON",12:"AMP",13:"BRKT",14:"MULT",15:"UNICODE_TEXT",17:"UNIT",18:"SPACE",19:"STYLE",20:"PCT",25:"CLASSDEF",28:"QUADRANT",35:"title",36:"title_value",37:"acc_title",38:"acc_title_value",39:"acc_descr",40:"acc_descr_value",41:"acc_descr_multiline_value",42:"section",44:"point_start",45:"point_x",46:"point_y",47:"class_name",48:"X-AXIS",49:"AXIS-TEXT-DELIMITER",50:"Y-AXIS",51:"QUADRANT_1",52:"QUADRANT_2",53:"QUADRANT_3",54:"QUADRANT_4",55:"NEWLINE",56:"SEMI",57:"EOF",60:"STR",61:"MD_STR",63:"PUNCTUATION",64:"PLUS",65:"EQUALS",66:"DOT",67:"UNDERSCORE"},productions_:[0,[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[21,1],[21,2],[22,1],[22,2],[23,1],[23,3],[24,5],[26,2],[26,2],[26,2],[29,0],[29,2],[30,2],[31,0],[31,1],[31,2],[31,1],[31,1],[31,1],[31,2],[31,2],[31,2],[31,1],[31,1],[34,4],[34,5],[34,5],[34,6],[32,4],[32,3],[32,2],[32,4],[32,3],[32,2],[33,2],[33,2],[33,2],[33,2],[27,1],[27,1],[27,1],[43,1],[43,2],[43,1],[43,1],[62,1],[62,2],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[59,1],[59,1],[59,1]],performAction:o(function(r,l,g,f,_,e,pt){var s=e.length-1;switch(_){case 23:this.$=e[s];break;case 24:this.$=e[s-1]+""+e[s];break;case 26:this.$=e[s-1]+e[s];break;case 27:this.$=[e[s].trim()];break;case 28:e[s-2].push(e[s].trim()),this.$=e[s-2];break;case 29:this.$=e[s-4],f.addClass(e[s-2],e[s]);break;case 37:this.$=[];break;case 42:this.$=e[s].trim(),f.setDiagramTitle(this.$);break;case 43:this.$=e[s].trim(),f.setAccTitle(this.$);break;case 44:case 45:this.$=e[s].trim(),f.setAccDescription(this.$);break;case 46:f.addSection(e[s].substr(8)),this.$=e[s].substr(8);break;case 47:f.addPoint(e[s-3],"",e[s-1],e[s],[]);break;case 48:f.addPoint(e[s-4],e[s-3],e[s-1],e[s],[]);break;case 49:f.addPoint(e[s-4],"",e[s-2],e[s-1],e[s]);break;case 50:f.addPoint(e[s-5],e[s-4],e[s-2],e[s-1],e[s]);break;case 51:f.setXAxisLeftText(e[s-2]),f.setXAxisRightText(e[s]);break;case 52:e[s-1].text+=" ⟶ ",f.setXAxisLeftText(e[s-1]);break;case 53:f.setXAxisLeftText(e[s]);break;case 54:f.setYAxisBottomText(e[s-2]),f.setYAxisTopText(e[s]);break;case 55:e[s-1].text+=" ⟶ ",f.setYAxisBottomText(e[s-1]);break;case 56:f.setYAxisBottomText(e[s]);break;case 57:f.setQuadrant1Text(e[s]);break;case 58:f.setQuadrant2Text(e[s]);break;case 59:f.setQuadrant3Text(e[s]);break;case 60:f.setQuadrant4Text(e[s]);break;case 64:this.$={text:e[s],type:"text"};break;case 65:this.$={text:e[s-1].text+""+e[s],type:e[s-1].type};break;case 66:this.$={text:e[s],type:"text"};break;case 67:this.$={text:e[s],type:"markdown"};break;case 68:this.$=e[s];break;case 69:this.$=e[s-1]+""+e[s];break}},"anonymous"),table:[{18:n,26:1,27:2,28:u,55:c,56:h,57:p},{1:[3]},{18:n,26:8,27:2,28:u,55:c,56:h,57:p},{18:n,26:9,27:2,28:u,55:c,56:h,57:p},t(y,[2,33],{29:10}),t(S,[2,61]),t(S,[2,62]),t(S,[2,63]),{1:[2,30]},{1:[2,31]},t(a,A,{30:11,31:12,24:13,32:15,33:16,34:17,43:30,58:31,1:[2,32],4:d,5:T,10:m,12:q,13:b,14:x,18:O,25:Y,35:G,37:yt,39:Tt,41:dt,42:Ft,48:ut,50:xt,51:ft,52:gt,53:i,54:Bt,60:W,61:U,63:k,64:F,65:P,66:v,67:C}),t(y,[2,34]),{27:45,55:c,56:h,57:p},t(a,[2,37]),t(a,A,{24:13,32:15,33:16,34:17,43:30,58:31,31:46,4:d,5:T,10:m,12:q,13:b,14:x,18:O,25:Y,35:G,37:yt,39:Tt,41:dt,42:Ft,48:ut,50:xt,51:ft,52:gt,53:i,54:Bt,60:W,61:U,63:k,64:F,65:P,66:v,67:C}),t(a,[2,39]),t(a,[2,40]),t(a,[2,41]),{36:[1,47]},{38:[1,48]},{40:[1,49]},t(a,[2,45]),t(a,[2,46]),{18:[1,50]},{4:d,5:T,10:m,12:q,13:b,14:x,43:51,58:31,60:W,61:U,63:k,64:F,65:P,66:v,67:C},{4:d,5:T,10:m,12:q,13:b,14:x,43:52,58:31,60:W,61:U,63:k,64:F,65:P,66:v,67:C},{4:d,5:T,10:m,12:q,13:b,14:x,43:53,58:31,60:W,61:U,63:k,64:F,65:P,66:v,67:C},{4:d,5:T,10:m,12:q,13:b,14:x,43:54,58:31,60:W,61:U,63:k,64:F,65:P,66:v,67:C},{4:d,5:T,10:m,12:q,13:b,14:x,43:55,58:31,60:W,61:U,63:k,64:F,65:P,66:v,67:C},{4:d,5:T,10:m,12:q,13:b,14:x,43:56,58:31,60:W,61:U,63:k,64:F,65:P,66:v,67:C},{4:d,5:T,8:H,10:m,12:q,13:b,14:x,18:X,44:[1,57],47:[1,58],58:60,59:59,63:k,64:F,65:P,66:v,67:C},t(L,[2,64]),t(L,[2,66]),t(L,[2,67]),t(L,[2,70]),t(L,[2,71]),t(L,[2,72]),t(L,[2,73]),t(L,[2,74]),t(L,[2,75]),t(L,[2,76]),t(L,[2,77]),t(L,[2,78]),t(L,[2,79]),t(L,[2,80]),t(y,[2,35]),t(a,[2,38]),t(a,[2,42]),t(a,[2,43]),t(a,[2,44]),{3:64,4:Rt,5:Nt,6:Wt,7:Ut,8:Qt,9:Ot,10:Ht,11:Xt,12:Mt,13:Yt,14:jt,15:Gt,21:63},t(a,[2,53],{59:59,58:60,4:d,5:T,8:H,10:m,12:q,13:b,14:x,18:X,49:[1,77],63:k,64:F,65:P,66:v,67:C}),t(a,[2,56],{59:59,58:60,4:d,5:T,8:H,10:m,12:q,13:b,14:x,18:X,49:[1,78],63:k,64:F,65:P,66:v,67:C}),t(a,[2,57],{59:59,58:60,4:d,5:T,8:H,10:m,12:q,13:b,14:x,18:X,63:k,64:F,65:P,66:v,67:C}),t(a,[2,58],{59:59,58:60,4:d,5:T,8:H,10:m,12:q,13:b,14:x,18:X,63:k,64:F,65:P,66:v,67:C}),t(a,[2,59],{59:59,58:60,4:d,5:T,8:H,10:m,12:q,13:b,14:x,18:X,63:k,64:F,65:P,66:v,67:C}),t(a,[2,60],{59:59,58:60,4:d,5:T,8:H,10:m,12:q,13:b,14:x,18:X,63:k,64:F,65:P,66:v,67:C}),{45:[1,79]},{44:[1,80]},t(L,[2,65]),t(L,[2,81]),t(L,[2,82]),t(L,[2,83]),{3:82,4:Rt,5:Nt,6:Wt,7:Ut,8:Qt,9:Ot,10:Ht,11:Xt,12:Mt,13:Yt,14:jt,15:Gt,18:[1,81]},t(I,[2,23]),t(I,[2,1]),t(I,[2,2]),t(I,[2,3]),t(I,[2,4]),t(I,[2,5]),t(I,[2,6]),t(I,[2,7]),t(I,[2,8]),t(I,[2,9]),t(I,[2,10]),t(I,[2,11]),t(I,[2,12]),t(a,[2,52],{58:31,43:83,4:d,5:T,10:m,12:q,13:b,14:x,60:W,61:U,63:k,64:F,65:P,66:v,67:C}),t(a,[2,55],{58:31,43:84,4:d,5:T,10:m,12:q,13:b,14:x,60:W,61:U,63:k,64:F,65:P,66:v,67:C}),{46:[1,85]},{45:[1,86]},{4:J,5:$,6:tt,8:et,11:it,13:at,16:89,17:nt,18:st,19:rt,20:ot,22:88,23:87},t(I,[2,24]),t(a,[2,51],{59:59,58:60,4:d,5:T,8:H,10:m,12:q,13:b,14:x,18:X,63:k,64:F,65:P,66:v,67:C}),t(a,[2,54],{59:59,58:60,4:d,5:T,8:H,10:m,12:q,13:b,14:x,18:X,63:k,64:F,65:P,66:v,67:C}),t(a,[2,47],{22:88,16:89,23:100,4:J,5:$,6:tt,8:et,11:it,13:at,17:nt,18:st,19:rt,20:ot}),{46:[1,101]},t(a,[2,29],{10:Pt}),t(Kt,[2,27],{16:103,4:J,5:$,6:tt,8:et,11:it,13:at,17:nt,18:st,19:rt,20:ot}),t(R,[2,25]),t(R,[2,13]),t(R,[2,14]),t(R,[2,15]),t(R,[2,16]),t(R,[2,17]),t(R,[2,18]),t(R,[2,19]),t(R,[2,20]),t(R,[2,21]),t(R,[2,22]),t(a,[2,49],{10:Pt}),t(a,[2,48],{22:88,16:89,23:104,4:J,5:$,6:tt,8:et,11:it,13:at,17:nt,18:st,19:rt,20:ot}),{4:J,5:$,6:tt,8:et,11:it,13:at,16:89,17:nt,18:st,19:rt,20:ot,22:105},t(R,[2,26]),t(a,[2,50],{10:Pt}),t(Kt,[2,28],{16:103,4:J,5:$,6:tt,8:et,11:it,13:at,17:nt,18:st,19:rt,20:ot})],defaultActions:{8:[2,30],9:[2,31]},parseError:o(function(r,l){if(l.recoverable)this.trace(r);else{var g=new Error(r);throw g.hash=l,g}},"parseError"),parse:o(function(r){var l=this,g=[0],f=[],_=[null],e=[],pt=this.table,s="",qt=0,Zt=0,me=2,Jt=1,qe=e.slice.call(arguments,1),E=Object.create(this.lexer),K={yy:{}};for(var Ct in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Ct)&&(K.yy[Ct]=this.yy[Ct]);E.setInput(r,K.yy),K.yy.lexer=E,K.yy.parser=this,typeof E.yylloc>"u"&&(E.yylloc={});var Lt=E.yylloc;e.push(Lt);var be=E.options&&E.options.ranges;typeof K.yy.parseError=="function"?this.parseError=K.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Se(B){g.length=g.length-2*B,_.length=_.length-B,e.length=e.length-B}o(Se,"popStack");function $t(){var B;return B=f.pop()||E.lex()||Jt,typeof B!="number"&&(B instanceof Array&&(f=B,B=f.pop()),B=l.symbols_[B]||B),B}o($t,"lex");for(var w,Z,N,Et,lt={},bt,M,te,St;;){if(Z=g[g.length-1],this.defaultActions[Z]?N=this.defaultActions[Z]:((w===null||typeof w>"u")&&(w=$t()),N=pt[Z]&&pt[Z][w]),typeof N>"u"||!N.length||!N[0]){var Dt="";St=[];for(bt in pt[Z])this.terminals_[bt]&&bt>me&&St.push("'"+this.terminals_[bt]+"'");E.showPosition?Dt="Parse error on line "+(qt+1)+`:
2
2
  `+E.showPosition()+`
3
3
  Expecting `+St.join(", ")+", got '"+(this.terminals_[w]||w)+"'":Dt="Parse error on line "+(qt+1)+": Unexpected "+(w==Jt?"end of input":"'"+(this.terminals_[w]||w)+"'"),this.parseError(Dt,{text:E.match,token:this.terminals_[w]||w,line:E.yylineno,loc:Lt,expected:St})}if(N[0]instanceof Array&&N.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Z+", token: "+w);switch(N[0]){case 1:g.push(w),_.push(E.yytext),e.push(E.yylloc),g.push(N[1]),w=null,Zt=E.yyleng,s=E.yytext,qt=E.yylineno,Lt=E.yylloc;break;case 2:if(M=this.productions_[N[1]][1],lt.$=_[_.length-M],lt._$={first_line:e[e.length-(M||1)].first_line,last_line:e[e.length-1].last_line,first_column:e[e.length-(M||1)].first_column,last_column:e[e.length-1].last_column},be&&(lt._$.range=[e[e.length-(M||1)].range[0],e[e.length-1].range[1]]),Et=this.performAction.apply(lt,[s,Zt,qt,K.yy,N[1],_,e].concat(qe)),typeof Et<"u")return Et;M&&(g=g.slice(0,-1*M*2),_=_.slice(0,-1*M),e=e.slice(0,-1*M)),g.push(this.productions_[N[1]][0]),_.push(lt.$),e.push(lt._$),te=pt[g[g.length-2]][g[g.length-1]],g.push(te);break;case 3:return!0}}return!0},"parse")},Te=function(){var j={EOF:1,parseError:o(function(l,g){if(this.yy.parser)this.yy.parser.parseError(l,g);else throw new Error(l)},"parseError"),setInput:o(function(r,l){return this.yy=l||this.yy||{},this._input=r,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var r=this._input[0];this.yytext+=r,this.yyleng++,this.offset++,this.match+=r,this.matched+=r;var l=r.match(/(?:\r\n?|\n).*/g);return l?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),r},"input"),unput:o(function(r){var l=r.length,g=r.split(/(?:\r\n?|\n)/g);this._input=r+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-l),this.offset-=l;var f=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),g.length-1&&(this.yylineno-=g.length-1);var _=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:g?(g.length===f.length?this.yylloc.first_column:0)+f[f.length-g.length].length-g[0].length:this.yylloc.first_column-l},this.options.ranges&&(this.yylloc.range=[_[0],_[0]+this.yyleng-l]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).
4
4
  `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(r){this.unput(this.match.slice(r))},"less"),pastInput:o(function(){var r=this.matched.substr(0,this.matched.length-this.match.length);return(r.length>20?"...":"")+r.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var r=this.match;return r.length<20&&(r+=this._input.substr(0,20-r.length)),(r.substr(0,20)+(r.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var r=this.pastInput(),l=new Array(r.length+1).join("-");return r+this.upcomingInput()+`
5
5
  `+l+"^"},"showPosition"),test_match:o(function(r,l){var g,f,_;if(this.options.backtrack_lexer&&(_={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(_.yylloc.range=this.yylloc.range.slice(0))),f=r[0].match(/(?:\r\n?|\n).*/g),f&&(this.yylineno+=f.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:f?f[f.length-1].length-f[f.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+r[0].length},this.yytext+=r[0],this.match+=r[0],this.matches=r,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(r[0].length),this.matched+=r[0],g=this.performAction.call(this,this.yy,this,l,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),g)return g;if(this._backtrack){for(var e in _)this[e]=_[e];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var r,l,g,f;this._more||(this.yytext="",this.match="");for(var _=this._currentRules(),e=0;e<_.length;e++)if(g=this._input.match(this.rules[_[e]]),g&&(!l||g[0].length>l[0].length)){if(l=g,f=e,this.options.backtrack_lexer){if(r=this.test_match(g,_[e]),r!==!1)return r;if(this._backtrack){l=!1;continue}else return!1}else if(!this.options.flex)break}return l?(r=this.test_match(l,_[f]),r!==!1?r:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text.
6
6
  `+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var l=this.next();return l||this.lex()},"lex"),begin:o(function(l){this.conditionStack.push(l)},"begin"),popState:o(function(){var l=this.conditionStack.length-1;return l>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(l){return l=this.conditionStack.length-1-Math.abs(l||0),l>=0?this.conditionStack[l]:"INITIAL"},"topState"),pushState:o(function(l){this.begin(l)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(l,g,f,_){switch(f){case 0:break;case 1:break;case 2:return 55;case 3:break;case 4:return this.begin("title"),35;case 5:return this.popState(),"title_value";case 6:return this.begin("acc_title"),37;case 7:return this.popState(),"acc_title_value";case 8:return this.begin("acc_descr"),39;case 9:return this.popState(),"acc_descr_value";case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 48;case 14:return 50;case 15:return 49;case 16:return 51;case 17:return 52;case 18:return 53;case 19:return 54;case 20:return 25;case 21:this.begin("md_string");break;case 22:return"MD_STR";case 23:this.popState();break;case 24:this.begin("string");break;case 25:this.popState();break;case 26:return"STR";case 27:this.begin("class_name");break;case 28:return this.popState(),47;case 29:return this.begin("point_start"),44;case 30:return this.begin("point_x"),45;case 31:this.popState();break;case 32:this.popState(),this.begin("point_y");break;case 33:return this.popState(),46;case 34:return 28;case 35:return 4;case 36:return 11;case 37:return 64;case 38:return 10;case 39:return 65;case 40:return 65;case 41:return 14;case 42:return 13;case 43:return 67;case 44:return 66;case 45:return 12;case 46:return 8;case 47:return 5;case 48:return 18;case 49:return 56;case 50:return 63;case 51:return 57}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?: *x-axis *)/i,/^(?: *y-axis *)/i,/^(?: *--+> *)/i,/^(?: *quadrant-1 *)/i,/^(?: *quadrant-2 *)/i,/^(?: *quadrant-3 *)/i,/^(?: *quadrant-4 *)/i,/^(?:classDef\b)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?::::)/i,/^(?:^\w+)/i,/^(?:\s*:\s*\[\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?:\s*\] *)/i,/^(?:\s*,\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?: *quadrantChart *)/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s)/i,/^(?:;)/i,/^(?:[!"#$%&'*+,-.`?\\_/])/i,/^(?:$)/i],conditions:{class_name:{rules:[28],inclusive:!1},point_y:{rules:[33],inclusive:!1},point_x:{rules:[32],inclusive:!1},point_start:{rules:[30,31],inclusive:!1},acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},title:{rules:[5],inclusive:!1},md_string:{rules:[22,23],inclusive:!1},string:{rules:[25,26],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,6,8,10,13,14,15,16,17,18,19,20,21,24,27,29,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],inclusive:!0}}};return j}();vt.lexer=Te;function mt(){this.yy={}}return o(mt,"Parser"),mt.prototype=vt,vt.Parser=mt,new mt}();Vt.parser=Vt;var De=Vt,V=Le(),ht,ze=(ht=class{constructor(){this.classes=new Map,this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData()}getDefaultData(){return{titleText:"",quadrant1Text:"",quadrant2Text:"",quadrant3Text:"",quadrant4Text:"",xAxisLeftText:"",xAxisRightText:"",yAxisBottomText:"",yAxisTopText:"",points:[]}}getDefaultConfig(){var n,u,c,h,p,y,S,a,A,d,T,m,q,b,x,O,Y,G;return{showXAxis:!0,showYAxis:!0,showTitle:!0,chartHeight:((n=D.quadrantChart)==null?void 0:n.chartWidth)||500,chartWidth:((u=D.quadrantChart)==null?void 0:u.chartHeight)||500,titlePadding:((c=D.quadrantChart)==null?void 0:c.titlePadding)||10,titleFontSize:((h=D.quadrantChart)==null?void 0:h.titleFontSize)||20,quadrantPadding:((p=D.quadrantChart)==null?void 0:p.quadrantPadding)||5,xAxisLabelPadding:((y=D.quadrantChart)==null?void 0:y.xAxisLabelPadding)||5,yAxisLabelPadding:((S=D.quadrantChart)==null?void 0:S.yAxisLabelPadding)||5,xAxisLabelFontSize:((a=D.quadrantChart)==null?void 0:a.xAxisLabelFontSize)||16,yAxisLabelFontSize:((A=D.quadrantChart)==null?void 0:A.yAxisLabelFontSize)||16,quadrantLabelFontSize:((d=D.quadrantChart)==null?void 0:d.quadrantLabelFontSize)||16,quadrantTextTopPadding:((T=D.quadrantChart)==null?void 0:T.quadrantTextTopPadding)||5,pointTextPadding:((m=D.quadrantChart)==null?void 0:m.pointTextPadding)||5,pointLabelFontSize:((q=D.quadrantChart)==null?void 0:q.pointLabelFontSize)||12,pointRadius:((b=D.quadrantChart)==null?void 0:b.pointRadius)||5,xAxisPosition:((x=D.quadrantChart)==null?void 0:x.xAxisPosition)||"top",yAxisPosition:((O=D.quadrantChart)==null?void 0:O.yAxisPosition)||"left",quadrantInternalBorderStrokeWidth:((Y=D.quadrantChart)==null?void 0:Y.quadrantInternalBorderStrokeWidth)||1,quadrantExternalBorderStrokeWidth:((G=D.quadrantChart)==null?void 0:G.quadrantExternalBorderStrokeWidth)||2}}getDefaultThemeConfig(){return{quadrant1Fill:V.quadrant1Fill,quadrant2Fill:V.quadrant2Fill,quadrant3Fill:V.quadrant3Fill,quadrant4Fill:V.quadrant4Fill,quadrant1TextFill:V.quadrant1TextFill,quadrant2TextFill:V.quadrant2TextFill,quadrant3TextFill:V.quadrant3TextFill,quadrant4TextFill:V.quadrant4TextFill,quadrantPointFill:V.quadrantPointFill,quadrantPointTextFill:V.quadrantPointTextFill,quadrantXAxisTextFill:V.quadrantXAxisTextFill,quadrantYAxisTextFill:V.quadrantYAxisTextFill,quadrantTitleFill:V.quadrantTitleFill,quadrantInternalBorderStrokeFill:V.quadrantInternalBorderStrokeFill,quadrantExternalBorderStrokeFill:V.quadrantExternalBorderStrokeFill}}clear(){this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData(),this.classes=new Map,At.info("clear called")}setData(n){this.data={...this.data,...n}}addPoints(n){this.data.points=[...n,...this.data.points]}addClass(n,u){this.classes.set(n,u)}setConfig(n){At.trace("setConfig called with: ",n),this.config={...this.config,...n}}setThemeConfig(n){At.trace("setThemeConfig called with: ",n),this.themeConfig={...this.themeConfig,...n}}calculateSpace(n,u,c,h){const p=this.config.xAxisLabelPadding*2+this.config.xAxisLabelFontSize,y={top:n==="top"&&u?p:0,bottom:n==="bottom"&&u?p:0},S=this.config.yAxisLabelPadding*2+this.config.yAxisLabelFontSize,a={left:this.config.yAxisPosition==="left"&&c?S:0,right:this.config.yAxisPosition==="right"&&c?S:0},A=this.config.titleFontSize+this.config.titlePadding*2,d={top:h?A:0},T=this.config.quadrantPadding+a.left,m=this.config.quadrantPadding+y.top+d.top,q=this.config.chartWidth-this.config.quadrantPadding*2-a.left-a.right,b=this.config.chartHeight-this.config.quadrantPadding*2-y.top-y.bottom-d.top,x=q/2,O=b/2;return{xAxisSpace:y,yAxisSpace:a,titleSpace:d,quadrantSpace:{quadrantLeft:T,quadrantTop:m,quadrantWidth:q,quadrantHalfWidth:x,quadrantHeight:b,quadrantHalfHeight:O}}}getAxisLabels(n,u,c,h){const{quadrantSpace:p,titleSpace:y}=h,{quadrantHalfHeight:S,quadrantHeight:a,quadrantLeft:A,quadrantHalfWidth:d,quadrantTop:T,quadrantWidth:m}=p,q=!!this.data.xAxisRightText,b=!!this.data.yAxisTopText,x=[];return this.data.xAxisLeftText&&u&&x.push({text:this.data.xAxisLeftText,fill:this.themeConfig.quadrantXAxisTextFill,x:A+(q?d/2:0),y:n==="top"?this.config.xAxisLabelPadding+y.top:this.config.xAxisLabelPadding+T+a+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:q?"center":"left",horizontalPos:"top",rotation:0}),this.data.xAxisRightText&&u&&x.push({text:this.data.xAxisRightText,fill:this.themeConfig.quadrantXAxisTextFill,x:A+d+(q?d/2:0),y:n==="top"?this.config.xAxisLabelPadding+y.top:this.config.xAxisLabelPadding+T+a+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:q?"center":"left",horizontalPos:"top",rotation:0}),this.data.yAxisBottomText&&c&&x.push({text:this.data.yAxisBottomText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+A+m+this.config.quadrantPadding,y:T+a-(b?S/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:b?"center":"left",horizontalPos:"top",rotation:-90}),this.data.yAxisTopText&&c&&x.push({text:this.data.yAxisTopText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+A+m+this.config.quadrantPadding,y:T+S-(b?S/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:b?"center":"left",horizontalPos:"top",rotation:-90}),x}getQuadrants(n){const{quadrantSpace:u}=n,{quadrantHalfHeight:c,quadrantLeft:h,quadrantHalfWidth:p,quadrantTop:y}=u,S=[{text:{text:this.data.quadrant1Text,fill:this.themeConfig.quadrant1TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:h+p,y,width:p,height:c,fill:this.themeConfig.quadrant1Fill},{text:{text:this.data.quadrant2Text,fill:this.themeConfig.quadrant2TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:h,y,width:p,height:c,fill:this.themeConfig.quadrant2Fill},{text:{text:this.data.quadrant3Text,fill:this.themeConfig.quadrant3TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:h,y:y+c,width:p,height:c,fill:this.themeConfig.quadrant3Fill},{text:{text:this.data.quadrant4Text,fill:this.themeConfig.quadrant4TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:h+p,y:y+c,width:p,height:c,fill:this.themeConfig.quadrant4Fill}];for(const a of S)a.text.x=a.x+a.width/2,this.data.points.length===0?(a.text.y=a.y+a.height/2,a.text.horizontalPos="middle"):(a.text.y=a.y+this.config.quadrantTextTopPadding,a.text.horizontalPos="top");return S}getQuadrantPoints(n){const{quadrantSpace:u}=n,{quadrantHeight:c,quadrantLeft:h,quadrantTop:p,quadrantWidth:y}=u,S=ee().domain([0,1]).range([h,y+h]),a=ee().domain([0,1]).range([c+p,p]);return this.data.points.map(d=>{const T=this.classes.get(d.className);return T&&(d={...T,...d}),{x:S(d.x),y:a(d.y),fill:d.color??this.themeConfig.quadrantPointFill,radius:d.radius??this.config.pointRadius,text:{text:d.text,fill:this.themeConfig.quadrantPointTextFill,x:S(d.x),y:a(d.y)+this.config.pointTextPadding,verticalPos:"center",horizontalPos:"top",fontSize:this.config.pointLabelFontSize,rotation:0},strokeColor:d.strokeColor??this.themeConfig.quadrantPointFill,strokeWidth:d.strokeWidth??"0px"}})}getBorders(n){const u=this.config.quadrantExternalBorderStrokeWidth/2,{quadrantSpace:c}=n,{quadrantHalfHeight:h,quadrantHeight:p,quadrantLeft:y,quadrantHalfWidth:S,quadrantTop:a,quadrantWidth:A}=c;return[{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:y-u,y1:a,x2:y+A+u,y2:a},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:y+A,y1:a+u,x2:y+A,y2:a+p-u},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:y-u,y1:a+p,x2:y+A+u,y2:a+p},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:y,y1:a+u,x2:y,y2:a+p-u},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:y+S,y1:a+u,x2:y+S,y2:a+p-u},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:y+u,y1:a+h,x2:y+A-u,y2:a+h}]}getTitle(n){if(n)return{text:this.data.titleText,fill:this.themeConfig.quadrantTitleFill,fontSize:this.config.titleFontSize,horizontalPos:"top",verticalPos:"center",rotation:0,y:this.config.titlePadding,x:this.config.chartWidth/2}}build(){const n=this.config.showXAxis&&!!(this.data.xAxisLeftText||this.data.xAxisRightText),u=this.config.showYAxis&&!!(this.data.yAxisTopText||this.data.yAxisBottomText),c=this.config.showTitle&&!!this.data.titleText,h=this.data.points.length>0?"bottom":this.config.xAxisPosition,p=this.calculateSpace(h,n,u,c);return{points:this.getQuadrantPoints(p),quadrants:this.getQuadrants(p),axisLabels:this.getAxisLabels(h,n,u,p),borderLines:this.getBorders(p),title:this.getTitle(c)}}},o(ht,"QuadrantBuilder"),ht),ct,_t=(ct=class extends Error{constructor(n,u,c){super(`value for ${n} ${u} is invalid, please use a valid ${c}`),this.name="InvalidStyleError"}},o(ct,"InvalidStyleError"),ct);function It(t){return!/^#?([\dA-Fa-f]{6}|[\dA-Fa-f]{3})$/.test(t)}o(It,"validateHexCode");function ae(t){return!/^\d+$/.test(t)}o(ae,"validateNumber");function ne(t){return!/^\d+px$/.test(t)}o(ne,"validateSizeInPixels");var Ve=wt();function Q(t){return Ee(t.trim(),Ve)}o(Q,"textSanitizer");var z=new ze;function se(t){z.setData({quadrant1Text:Q(t.text)})}o(se,"setQuadrant1Text");function re(t){z.setData({quadrant2Text:Q(t.text)})}o(re,"setQuadrant2Text");function oe(t){z.setData({quadrant3Text:Q(t.text)})}o(oe,"setQuadrant3Text");function le(t){z.setData({quadrant4Text:Q(t.text)})}o(le,"setQuadrant4Text");function he(t){z.setData({xAxisLeftText:Q(t.text)})}o(he,"setXAxisLeftText");function ce(t){z.setData({xAxisRightText:Q(t.text)})}o(ce,"setXAxisRightText");function de(t){z.setData({yAxisTopText:Q(t.text)})}o(de,"setYAxisTopText");function ue(t){z.setData({yAxisBottomText:Q(t.text)})}o(ue,"setYAxisBottomText");function kt(t){const n={};for(const u of t){const[c,h]=u.trim().split(/\s*:\s*/);if(c==="radius"){if(ae(h))throw new _t(c,h,"number");n.radius=parseInt(h)}else if(c==="color"){if(It(h))throw new _t(c,h,"hex code");n.color=h}else if(c==="stroke-color"){if(It(h))throw new _t(c,h,"hex code");n.strokeColor=h}else if(c==="stroke-width"){if(ne(h))throw new _t(c,h,"number of pixels (eg. 10px)");n.strokeWidth=h}else throw new Error(`style named ${c} is not supported.`)}return n}o(kt,"parseStyles");function xe(t,n,u,c,h){const p=kt(h);z.addPoints([{x:u,y:c,text:Q(t.text),className:n,...p}])}o(xe,"addPoint");function fe(t,n){z.addClass(t,kt(n))}o(fe,"addClass");function ge(t){z.setConfig({chartWidth:t})}o(ge,"setWidth");function pe(t){z.setConfig({chartHeight:t})}o(pe,"setHeight");function ye(){const t=wt(),{themeVariables:n,quadrantChart:u}=t;return u&&z.setConfig(u),z.setThemeConfig({quadrant1Fill:n.quadrant1Fill,quadrant2Fill:n.quadrant2Fill,quadrant3Fill:n.quadrant3Fill,quadrant4Fill:n.quadrant4Fill,quadrant1TextFill:n.quadrant1TextFill,quadrant2TextFill:n.quadrant2TextFill,quadrant3TextFill:n.quadrant3TextFill,quadrant4TextFill:n.quadrant4TextFill,quadrantPointFill:n.quadrantPointFill,quadrantPointTextFill:n.quadrantPointTextFill,quadrantXAxisTextFill:n.quadrantXAxisTextFill,quadrantYAxisTextFill:n.quadrantYAxisTextFill,quadrantExternalBorderStrokeFill:n.quadrantExternalBorderStrokeFill,quadrantInternalBorderStrokeFill:n.quadrantInternalBorderStrokeFill,quadrantTitleFill:n.quadrantTitleFill}),z.setData({titleText:ie()}),z.build()}o(ye,"getQuadrantData");var Ie=o(function(){z.clear(),Ce()},"clear"),we={setWidth:ge,setHeight:pe,setQuadrant1Text:se,setQuadrant2Text:re,setQuadrant3Text:oe,setQuadrant4Text:le,setXAxisLeftText:he,setXAxisRightText:ce,setYAxisTopText:de,setYAxisBottomText:ue,parseStyles:kt,addPoint:xe,addClass:fe,getQuadrantData:ye,clear:Ie,setAccTitle:Pe,getAccTitle:Fe,setDiagramTitle:ke,getDiagramTitle:ie,getAccDescription:Ae,setAccDescription:_e},Be=o((t,n,u,c)=>{var xt,ft,gt;function h(i){return i==="top"?"hanging":"middle"}o(h,"getDominantBaseLine");function p(i){return i==="left"?"start":"middle"}o(p,"getTextAnchor");function y(i){return`translate(${i.x}, ${i.y}) rotate(${i.rotation||0})`}o(y,"getTransformation");const S=wt();At.debug(`Rendering quadrant chart
7
7
  `+t);const a=S.securityLevel;let A;a==="sandbox"&&(A=zt("#i"+n));const T=(a==="sandbox"?zt(A.nodes()[0].contentDocument.body):zt("body")).select(`[id="${n}"]`),m=T.append("g").attr("class","main"),q=((xt=S.quadrantChart)==null?void 0:xt.chartWidth)??500,b=((ft=S.quadrantChart)==null?void 0:ft.chartHeight)??500;ve(T,b,q,((gt=S.quadrantChart)==null?void 0:gt.useMaxWidth)??!0),T.attr("viewBox","0 0 "+q+" "+b),c.db.setHeight(b),c.db.setWidth(q);const x=c.db.getQuadrantData(),O=m.append("g").attr("class","quadrants"),Y=m.append("g").attr("class","border"),G=m.append("g").attr("class","data-points"),yt=m.append("g").attr("class","labels"),Tt=m.append("g").attr("class","title");x.title&&Tt.append("text").attr("x",0).attr("y",0).attr("fill",x.title.fill).attr("font-size",x.title.fontSize).attr("dominant-baseline",h(x.title.horizontalPos)).attr("text-anchor",p(x.title.verticalPos)).attr("transform",y(x.title)).text(x.title.text),x.borderLines&&Y.selectAll("line").data(x.borderLines).enter().append("line").attr("x1",i=>i.x1).attr("y1",i=>i.y1).attr("x2",i=>i.x2).attr("y2",i=>i.y2).style("stroke",i=>i.strokeFill).style("stroke-width",i=>i.strokeWidth);const dt=O.selectAll("g.quadrant").data(x.quadrants).enter().append("g").attr("class","quadrant");dt.append("rect").attr("x",i=>i.x).attr("y",i=>i.y).attr("width",i=>i.width).attr("height",i=>i.height).attr("fill",i=>i.fill),dt.append("text").attr("x",0).attr("y",0).attr("fill",i=>i.text.fill).attr("font-size",i=>i.text.fontSize).attr("dominant-baseline",i=>h(i.text.horizontalPos)).attr("text-anchor",i=>p(i.text.verticalPos)).attr("transform",i=>y(i.text)).text(i=>i.text.text),yt.selectAll("g.label").data(x.axisLabels).enter().append("g").attr("class","label").append("text").attr("x",0).attr("y",0).text(i=>i.text).attr("fill",i=>i.fill).attr("font-size",i=>i.fontSize).attr("dominant-baseline",i=>h(i.horizontalPos)).attr("text-anchor",i=>p(i.verticalPos)).attr("transform",i=>y(i));const ut=G.selectAll("g.data-point").data(x.points).enter().append("g").attr("class","data-point");ut.append("circle").attr("cx",i=>i.x).attr("cy",i=>i.y).attr("r",i=>i.radius).attr("fill",i=>i.fill).attr("stroke",i=>i.strokeColor).attr("stroke-width",i=>i.strokeWidth),ut.append("text").attr("x",0).attr("y",0).text(i=>i.text.text).attr("fill",i=>i.text.fill).attr("font-size",i=>i.text.fontSize).attr("dominant-baseline",i=>h(i.text.horizontalPos)).attr("text-anchor",i=>p(i.text.verticalPos)).attr("transform",i=>y(i.text))},"draw"),Re={draw:Be},ei={parser:De,db:we,renderer:Re,styles:o(()=>"","styles")};export{ei as diagram};
8
- //# sourceMappingURL=quadrantDiagram-7GDLP6J5-BQzo7p61.js.map
8
+ //# sourceMappingURL=quadrantDiagram-7GDLP6J5-B4Od6z6p.js.map