unspaghettit 0.1.4 → 0.1.5

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 (442) hide show
  1. package/README.md +144 -24
  2. package/build/client/_app/immutable/assets/0.BeTgpM2K.css +1 -0
  3. package/build/client/_app/immutable/assets/0.BeTgpM2K.css.br +0 -0
  4. package/build/client/_app/immutable/assets/0.BeTgpM2K.css.gz +0 -0
  5. package/build/client/_app/immutable/chunks/5r2i0zJk.js +2 -0
  6. package/build/client/_app/immutable/chunks/5r2i0zJk.js.br +0 -0
  7. package/build/client/_app/immutable/chunks/5r2i0zJk.js.gz +0 -0
  8. package/build/client/_app/immutable/chunks/{CmOXOYi7.js → BB9SUYam.js} +1 -1
  9. package/build/client/_app/immutable/chunks/BB9SUYam.js.br +0 -0
  10. package/build/client/_app/immutable/chunks/BB9SUYam.js.gz +0 -0
  11. package/build/client/_app/immutable/chunks/{DhaH6JO9.js → BMXh1Hqj.js} +1 -1
  12. package/build/client/_app/immutable/chunks/BMXh1Hqj.js.br +2 -0
  13. package/build/client/_app/immutable/chunks/BMXh1Hqj.js.gz +0 -0
  14. package/build/client/_app/immutable/chunks/BONlCYxb.js +1 -0
  15. package/build/client/_app/immutable/chunks/BONlCYxb.js.br +0 -0
  16. package/build/client/_app/immutable/chunks/BONlCYxb.js.gz +0 -0
  17. package/build/client/_app/immutable/chunks/{7CWAShXO.js → BQQLoxQo.js} +1 -1
  18. package/build/client/_app/immutable/chunks/BQQLoxQo.js.br +0 -0
  19. package/build/client/_app/immutable/chunks/BQQLoxQo.js.gz +0 -0
  20. package/build/client/_app/immutable/chunks/BS6nZEaw.js +1 -0
  21. package/build/client/_app/immutable/chunks/BS6nZEaw.js.br +0 -0
  22. package/build/client/_app/immutable/chunks/BS6nZEaw.js.gz +0 -0
  23. package/build/client/_app/immutable/chunks/BW2ZVtm0.js +1 -0
  24. package/build/client/_app/immutable/chunks/BW2ZVtm0.js.br +0 -0
  25. package/build/client/_app/immutable/chunks/BW2ZVtm0.js.gz +0 -0
  26. package/build/client/_app/immutable/chunks/Bs86lft6.js +1 -0
  27. package/build/client/_app/immutable/chunks/Bs86lft6.js.br +0 -0
  28. package/build/client/_app/immutable/chunks/Bs86lft6.js.gz +0 -0
  29. package/build/client/_app/immutable/chunks/BzLd0mTH.js +1 -0
  30. package/build/client/_app/immutable/chunks/BzLd0mTH.js.br +0 -0
  31. package/build/client/_app/immutable/chunks/BzLd0mTH.js.gz +0 -0
  32. package/build/client/_app/immutable/chunks/CKUA0lwj.js +1 -0
  33. package/build/client/_app/immutable/chunks/CKUA0lwj.js.br +0 -0
  34. package/build/client/_app/immutable/chunks/CKUA0lwj.js.gz +0 -0
  35. package/build/client/_app/immutable/chunks/CM5qK71w.js +6 -0
  36. package/build/client/_app/immutable/chunks/CM5qK71w.js.br +0 -0
  37. package/build/client/_app/immutable/chunks/CM5qK71w.js.gz +0 -0
  38. package/build/client/_app/immutable/chunks/CM7d6DM1.js +4 -0
  39. package/build/client/_app/immutable/chunks/CM7d6DM1.js.br +0 -0
  40. package/build/client/_app/immutable/chunks/CM7d6DM1.js.gz +0 -0
  41. package/build/client/_app/immutable/chunks/CQVC6ITH.js +1 -0
  42. package/build/client/_app/immutable/chunks/CQVC6ITH.js.br +0 -0
  43. package/build/client/_app/immutable/chunks/CQVC6ITH.js.gz +0 -0
  44. package/build/client/_app/immutable/chunks/{SUKfBDXm.js → CfijiFzI.js} +1 -1
  45. package/build/client/_app/immutable/chunks/CfijiFzI.js.br +0 -0
  46. package/build/client/_app/immutable/chunks/CfijiFzI.js.gz +0 -0
  47. package/build/client/_app/immutable/chunks/CseO-meD.js +1 -0
  48. package/build/client/_app/immutable/chunks/CseO-meD.js.br +2 -0
  49. package/build/client/_app/immutable/chunks/CseO-meD.js.gz +0 -0
  50. package/build/client/_app/immutable/chunks/Cv5BCAl2.js +1 -0
  51. package/build/client/_app/immutable/chunks/Cv5BCAl2.js.br +0 -0
  52. package/build/client/_app/immutable/chunks/Cv5BCAl2.js.gz +0 -0
  53. package/build/client/_app/immutable/chunks/D1amF_pm.js +1 -0
  54. package/build/client/_app/immutable/chunks/D1amF_pm.js.br +0 -0
  55. package/build/client/_app/immutable/chunks/D1amF_pm.js.gz +0 -0
  56. package/build/client/_app/immutable/chunks/{CB9H0ifB.js → DF6QYH3p.js} +1 -1
  57. package/build/client/_app/immutable/chunks/DF6QYH3p.js.br +0 -0
  58. package/build/client/_app/immutable/chunks/DF6QYH3p.js.gz +0 -0
  59. package/build/client/_app/immutable/chunks/DNg6uYXm.js +1 -0
  60. package/build/client/_app/immutable/chunks/DNg6uYXm.js.br +0 -0
  61. package/build/client/_app/immutable/chunks/DNg6uYXm.js.gz +0 -0
  62. package/build/client/_app/immutable/chunks/{CYEqQWxZ.js → DY44RRRX.js} +1 -1
  63. package/build/client/_app/immutable/chunks/DY44RRRX.js.br +0 -0
  64. package/build/client/_app/immutable/chunks/DY44RRRX.js.gz +0 -0
  65. package/build/client/_app/immutable/chunks/Dhqg7r_2.js +1 -0
  66. package/build/client/_app/immutable/chunks/Dhqg7r_2.js.br +0 -0
  67. package/build/client/_app/immutable/chunks/Dhqg7r_2.js.gz +0 -0
  68. package/build/client/_app/immutable/chunks/Dvd8XBNO.js +1 -0
  69. package/build/client/_app/immutable/chunks/Dvd8XBNO.js.br +1 -0
  70. package/build/client/_app/immutable/chunks/Dvd8XBNO.js.gz +0 -0
  71. package/build/client/_app/immutable/chunks/LlQFrnsz.js +2 -0
  72. package/build/client/_app/immutable/chunks/LlQFrnsz.js.br +0 -0
  73. package/build/client/_app/immutable/chunks/LlQFrnsz.js.gz +0 -0
  74. package/build/client/_app/immutable/entry/app.CEZZ2MSH.js +2 -0
  75. package/build/client/_app/immutable/entry/app.CEZZ2MSH.js.br +0 -0
  76. package/build/client/_app/immutable/entry/app.CEZZ2MSH.js.gz +0 -0
  77. package/build/client/_app/immutable/entry/start.CUWFtxDX.js +1 -0
  78. package/build/client/_app/immutable/entry/start.CUWFtxDX.js.br +0 -0
  79. package/build/client/_app/immutable/entry/start.CUWFtxDX.js.gz +0 -0
  80. package/build/client/_app/immutable/nodes/0.BhT9lEMv.js +3 -0
  81. package/build/client/_app/immutable/nodes/0.BhT9lEMv.js.br +0 -0
  82. package/build/client/_app/immutable/nodes/0.BhT9lEMv.js.gz +0 -0
  83. package/build/client/_app/immutable/nodes/{1.CLgrLmv7.js → 1.DP7GTTi2.js} +1 -1
  84. package/build/client/_app/immutable/nodes/1.DP7GTTi2.js.br +0 -0
  85. package/build/client/_app/immutable/nodes/1.DP7GTTi2.js.gz +0 -0
  86. package/build/client/_app/immutable/nodes/2.CxCmm-5_.js +1 -0
  87. package/build/client/_app/immutable/nodes/2.CxCmm-5_.js.br +3 -0
  88. package/build/client/_app/immutable/nodes/2.CxCmm-5_.js.gz +0 -0
  89. package/build/client/_app/immutable/nodes/3.DQyNehwu.js +3 -0
  90. package/build/client/_app/immutable/nodes/3.DQyNehwu.js.br +0 -0
  91. package/build/client/_app/immutable/nodes/3.DQyNehwu.js.gz +0 -0
  92. package/build/client/_app/immutable/nodes/4.BeM2x8qO.js +42 -0
  93. package/build/client/_app/immutable/nodes/4.BeM2x8qO.js.br +0 -0
  94. package/build/client/_app/immutable/nodes/4.BeM2x8qO.js.gz +0 -0
  95. package/build/client/_app/immutable/nodes/5.C88_pwN6.js +5 -0
  96. package/build/client/_app/immutable/nodes/5.C88_pwN6.js.br +0 -0
  97. package/build/client/_app/immutable/nodes/5.C88_pwN6.js.gz +0 -0
  98. package/build/client/_app/immutable/nodes/6.Ck_rb-Oe.js +1 -0
  99. package/build/client/_app/immutable/nodes/6.Ck_rb-Oe.js.br +2 -0
  100. package/build/client/_app/immutable/nodes/6.Ck_rb-Oe.js.gz +0 -0
  101. package/build/client/_app/immutable/nodes/7.CJuxiEMy.js +5 -0
  102. package/build/client/_app/immutable/nodes/7.CJuxiEMy.js.br +0 -0
  103. package/build/client/_app/immutable/nodes/7.CJuxiEMy.js.gz +0 -0
  104. package/build/client/_app/immutable/nodes/8.BTsOQKn5.js +398 -0
  105. package/build/client/_app/immutable/nodes/8.BTsOQKn5.js.br +0 -0
  106. package/build/client/_app/immutable/nodes/8.BTsOQKn5.js.gz +0 -0
  107. package/build/client/_app/version.json +1 -1
  108. package/build/client/_app/version.json.br +0 -0
  109. package/build/client/_app/version.json.gz +0 -0
  110. package/build/server/chunks/0-jMzSESsM.js +15 -0
  111. package/build/server/chunks/0-jMzSESsM.js.map +1 -0
  112. package/build/server/chunks/1-KI4E7zXP.js +9 -0
  113. package/build/server/chunks/{1-EvCmJU93.js.map → 1-KI4E7zXP.js.map} +1 -1
  114. package/build/server/chunks/2-D2un8yFr.js +9 -0
  115. package/build/server/chunks/2-D2un8yFr.js.map +1 -0
  116. package/build/server/chunks/3-BfFA_w3F.js +16 -0
  117. package/build/server/chunks/{3-BXfgH8iQ.js.map → 3-BfFA_w3F.js.map} +1 -1
  118. package/build/server/chunks/4-CpLvWM_z.js +9 -0
  119. package/build/server/chunks/4-CpLvWM_z.js.map +1 -0
  120. package/build/server/chunks/5-pU8K3jOv.js +9 -0
  121. package/build/server/chunks/{5--noidTrC.js.map → 5-pU8K3jOv.js.map} +1 -1
  122. package/build/server/chunks/6-BmtkjUSZ.js +9 -0
  123. package/build/server/chunks/6-BmtkjUSZ.js.map +1 -0
  124. package/build/server/chunks/7-D1_6EFMg.js +9 -0
  125. package/build/server/chunks/7-D1_6EFMg.js.map +1 -0
  126. package/build/server/chunks/8-Ddlfzq7T.js +9 -0
  127. package/build/server/chunks/8-Ddlfzq7T.js.map +1 -0
  128. package/build/server/chunks/{FeatureCard-qMrgIY4R.js → FeatureCard-aO14612h.js} +10 -6
  129. package/build/server/chunks/FeatureCard-aO14612h.js.map +1 -0
  130. package/build/server/chunks/{FeatureJson-XfuPndFY.js → FeatureJson-CY03wvJZ.js} +2 -2
  131. package/build/server/chunks/{FeatureJson-XfuPndFY.js.map → FeatureJson-CY03wvJZ.js.map} +1 -1
  132. package/build/server/chunks/{FeatureValidator-BpCry4ve.js → FeatureValidator-BY9NnUVe.js} +2 -2
  133. package/build/server/chunks/{FeatureValidator-BpCry4ve.js.map → FeatureValidator-BY9NnUVe.js.map} +1 -1
  134. package/build/server/chunks/{ProgressBar-CCDGZh4y.js → ProgressBar-CfhccQ83.js} +2 -2
  135. package/build/server/chunks/ProgressBar-CfhccQ83.js.map +1 -0
  136. package/build/server/chunks/{ProjectsIndex-De5pqV0u.js → ProjectsIndex-Cw3EzOqX.js} +8 -8
  137. package/build/server/chunks/ProjectsIndex-Cw3EzOqX.js.map +1 -0
  138. package/build/server/chunks/{QueueItem-DNAI4oAZ.js → QueueItem-C3CHlNUW.js} +13 -3
  139. package/build/server/chunks/QueueItem-C3CHlNUW.js.map +1 -0
  140. package/build/server/chunks/{TagList-mh_TaMdj.js → TagList-loVyO1zB.js} +3 -3
  141. package/build/server/chunks/TagList-loVyO1zB.js.map +1 -0
  142. package/build/server/chunks/{_layout.svelte-CXqUGHsD.js → _layout.svelte-Du7WxNQj.js} +222 -10
  143. package/build/server/chunks/_layout.svelte-Du7WxNQj.js.map +1 -0
  144. package/build/server/chunks/{_page.svelte-DSMXcsQF.js → _page.svelte-4TzA93g8.js} +12 -12
  145. package/build/server/chunks/_page.svelte-4TzA93g8.js.map +1 -0
  146. package/build/server/chunks/{_page.svelte-B2Mykryr.js → _page.svelte-9_yYHK2g.js} +7 -7
  147. package/build/server/chunks/_page.svelte-9_yYHK2g.js.map +1 -0
  148. package/build/server/chunks/{_page.svelte-m6BeiHNT.js → _page.svelte-BCxKCt1e.js} +282 -98
  149. package/build/server/chunks/_page.svelte-BCxKCt1e.js.map +1 -0
  150. package/build/server/chunks/{_page.svelte-DvkBRiGs.js → _page.svelte-BL93fFwo.js} +9 -9
  151. package/build/server/chunks/{_page.svelte-DvkBRiGs.js.map → _page.svelte-BL93fFwo.js.map} +1 -1
  152. package/build/server/chunks/{_page.svelte-BsUc_9eO.js → _page.svelte-C9nR9UoL.js} +9 -9
  153. package/build/server/chunks/{_page.svelte-BsUc_9eO.js.map → _page.svelte-C9nR9UoL.js.map} +1 -1
  154. package/build/server/chunks/{_page.svelte-CuDeJhwE.js → _page.svelte-DMq-N1Qi.js} +299 -695
  155. package/build/server/chunks/_page.svelte-DMq-N1Qi.js.map +1 -0
  156. package/build/server/chunks/{_page.svelte-wtlCU8w2.js → _page.svelte-VOkdrDhM.js} +122 -94
  157. package/build/server/chunks/_page.svelte-VOkdrDhM.js.map +1 -0
  158. package/build/server/chunks/{_server.ts-BDuFGHAb.js → _server.ts-AqYfvGLJ.js} +4 -4
  159. package/build/server/chunks/{_server.ts-BDuFGHAb.js.map → _server.ts-AqYfvGLJ.js.map} +1 -1
  160. package/build/server/chunks/{_server.ts-D5JQS4ea.js → _server.ts-BdmGUNJg.js} +4 -4
  161. package/build/server/chunks/{_server.ts-D5JQS4ea.js.map → _server.ts-BdmGUNJg.js.map} +1 -1
  162. package/build/server/chunks/{_server.ts-DpeB79Q0.js → _server.ts-BuLl8Yy1.js} +5 -5
  163. package/build/server/chunks/{_server.ts-DpeB79Q0.js.map → _server.ts-BuLl8Yy1.js.map} +1 -1
  164. package/build/server/chunks/{_server.ts-DuF3teJw.js → _server.ts-Byk51pok.js} +4 -4
  165. package/build/server/chunks/{_server.ts-DuF3teJw.js.map → _server.ts-Byk51pok.js.map} +1 -1
  166. package/build/server/chunks/{_server.ts-Dw2E3cRV.js → _server.ts-Caat3jHS.js} +4 -4
  167. package/build/server/chunks/{_server.ts-Dw2E3cRV.js.map → _server.ts-Caat3jHS.js.map} +1 -1
  168. package/build/server/chunks/{_server.ts-D0MnsD_L.js → _server.ts-Ci8WMEMx.js} +4 -4
  169. package/build/server/chunks/{_server.ts-D0MnsD_L.js.map → _server.ts-Ci8WMEMx.js.map} +1 -1
  170. package/build/server/chunks/{_server.ts-DRgEE4a9.js → _server.ts-D2b_trMN.js} +4 -4
  171. package/build/server/chunks/{_server.ts-DRgEE4a9.js.map → _server.ts-D2b_trMN.js.map} +1 -1
  172. package/build/server/chunks/{_server.ts-B-6UpQvl.js → _server.ts-D9zlgEsW.js} +6 -6
  173. package/build/server/chunks/{_server.ts-B-6UpQvl.js.map → _server.ts-D9zlgEsW.js.map} +1 -1
  174. package/build/server/chunks/{_server.ts-Cc4GZUdk.js → _server.ts-DWVE5bgk.js} +7 -7
  175. package/build/server/chunks/{_server.ts-Cc4GZUdk.js.map → _server.ts-DWVE5bgk.js.map} +1 -1
  176. package/build/server/chunks/{_server.ts-C2P8H9yf.js → _server.ts-NnlHb9o_.js} +6 -6
  177. package/build/server/chunks/{_server.ts-C2P8H9yf.js.map → _server.ts-NnlHb9o_.js.map} +1 -1
  178. package/build/server/chunks/{eventBus-AsLh8hO0.js → browserContainer-DMj606Xu.js} +310 -26
  179. package/build/server/chunks/browserContainer-DMj606Xu.js.map +1 -0
  180. package/build/server/chunks/{client-2hNr7zGI.js → client-BxsYGe_2.js} +5 -4
  181. package/build/server/chunks/client-BxsYGe_2.js.map +1 -0
  182. package/build/server/chunks/{error.svelte-lP_oxAFO.js → error.svelte-YAAzG1zx.js} +4 -4
  183. package/build/server/chunks/{error.svelte-lP_oxAFO.js.map → error.svelte-YAAzG1zx.js.map} +1 -1
  184. package/build/server/chunks/{featuresStore.svelte-DIB5OTQr.js → featuresStore.svelte-CSrFzsm7.js} +5 -5
  185. package/build/server/chunks/featuresStore.svelte-CSrFzsm7.js.map +1 -0
  186. package/build/server/chunks/index-server-7H0jzj0M.js.map +1 -1
  187. package/build/server/chunks/{internal-C9UYPNts.js → internal-DlYm9cJh.js} +3 -3
  188. package/build/server/chunks/{internal-C9UYPNts.js.map → internal-DlYm9cJh.js.map} +1 -1
  189. package/build/server/chunks/{projectsStore.svelte-ynWZi-y3.js → projectsStore.svelte-D9-ECSaV.js} +2 -2
  190. package/build/server/chunks/projectsStore.svelte-D9-ECSaV.js.map +1 -0
  191. package/build/server/chunks/{TransitionCatalog-6JXlrQGF.js → reconcile-Bo_xtg3_.js} +472 -472
  192. package/build/server/chunks/reconcile-Bo_xtg3_.js.map +1 -0
  193. package/build/server/chunks/{snapshotRepository-CnlyFjuk.js → snapshotRepository-Dg4EWZOD.js} +3 -3
  194. package/build/server/chunks/{snapshotRepository-CnlyFjuk.js.map → snapshotRepository-Dg4EWZOD.js.map} +1 -1
  195. package/build/server/chunks/{state-G0m1AxhO.js → state-BOhPaHQE.js} +2 -2
  196. package/build/server/chunks/{state-G0m1AxhO.js.map → state-BOhPaHQE.js.map} +1 -1
  197. package/build/server/chunks/{sync-CAWyh7MA.js → sync-iHgKKUA-.js} +8 -3
  198. package/build/server/chunks/sync-iHgKKUA-.js.map +1 -0
  199. package/build/server/chunks/{syncBridge-LiFjnVDY.js → syncBridge-BIDmEZnq.js} +2 -2
  200. package/build/server/chunks/{syncBridge-LiFjnVDY.js.map → syncBridge-BIDmEZnq.js.map} +1 -1
  201. package/build/server/chunks/tourStore.svelte-05YX34xW.js +107 -0
  202. package/build/server/chunks/tourStore.svelte-05YX34xW.js.map +1 -0
  203. package/build/server/index.js +59 -42
  204. package/build/server/index.js.map +1 -1
  205. package/build/server/manifest.js +20 -20
  206. package/build/server/manifest.js.map +1 -1
  207. package/cli/README.md +25 -15
  208. package/cli/clients/gemini.ts +1 -1
  209. package/cli/commands/init.ts +9 -8
  210. package/cli/commands/serve.ts +2 -2
  211. package/cli/commands/uninstall.ts +1 -1
  212. package/cli/skills/unspa-audit/SKILL.md +24 -7
  213. package/cli/skills/unspa-edit/SKILL.md +2 -2
  214. package/cli/skills/unspa-implement/SKILL.md +13 -9
  215. package/cli/unspa.ts +1 -1
  216. package/cli/util/context-files.ts +12 -6
  217. package/mcp-server/resources/guide.ts +15 -15
  218. package/mcp-server/resources/operations.ts +6 -6
  219. package/mcp-server/server.ts +22 -1
  220. package/mcp-server/tools/_entity_builders.ts +2 -2
  221. package/mcp-server/tools/batch.ts +1 -1
  222. package/mcp-server/tools/behavioralIndex.ts +50 -7
  223. package/mcp-server/tools/feature.ts +1 -1
  224. package/mcp-server/tools/implementationStatus.ts +122 -10
  225. package/mcp-server/tools/invariant.ts +7 -7
  226. package/mcp-server/tools/project.ts +1 -1
  227. package/mcp-server/tools/read.ts +1 -1
  228. package/mcp-server/tools/rule.ts +2 -2
  229. package/mcp-server/tools/specGaps.ts +1 -1
  230. package/package.json +7 -3
  231. package/src/app.css +31 -0
  232. package/src/app.html +3 -3
  233. package/src/features/behavior-model/application/use-cases/GetFeatureCard.ts +34 -20
  234. package/src/features/behavior-model/application/use-cases/ListFeaturesWithMaturity.ts +64 -36
  235. package/src/features/behavior-model/application/use-cases/MutateFeature.ts +1 -1
  236. package/src/features/behavior-model/domain/entities/Action.ts +1 -1
  237. package/src/features/behavior-model/domain/entities/Rule.ts +1 -1
  238. package/src/features/behavior-model/domain/services/FeatureEmittedEventsNormalizer.ts +1 -1
  239. package/src/features/behavior-model/domain/services/FeatureRuleCategoryNormalizer.ts +1 -1
  240. package/src/features/behavior-model/domain/services/FeatureSharedStateNormalizer.ts +1 -1
  241. package/src/features/behavior-model/domain/services/FeatureTransforms.ts +1 -1
  242. package/src/features/behavior-model/domain/services/FeatureValidator.ts +38 -12
  243. package/src/features/behavior-model/domain/services/RuleEvaluator.ts +1 -1
  244. package/src/features/behavior-model/domain/value-objects/Expression.ts +5 -2
  245. package/src/features/behavior-model/domain/value-objects/RuleCondition.ts +29 -2
  246. package/src/features/behavior-model/presentation/components/ActionEditor.svelte +4 -3
  247. package/src/features/behavior-model/presentation/components/ActionsEditor.svelte +13 -1
  248. package/src/features/behavior-model/presentation/components/ConditionRightEditor.svelte +1 -1
  249. package/src/features/behavior-model/presentation/components/EffectEditor.svelte +2 -2
  250. package/src/features/behavior-model/presentation/components/FeatureCard.svelte +46 -11
  251. package/src/features/behavior-model/presentation/components/FeatureHealthStrip.svelte +3 -0
  252. package/src/features/behavior-model/presentation/components/FeatureInvariantsEditor.svelte +1 -1
  253. package/src/features/behavior-model/presentation/components/InvariantEditor.svelte +2 -2
  254. package/src/features/behavior-model/presentation/components/ParametersEditor.svelte +10 -1
  255. package/src/features/behavior-model/presentation/components/RuleEditor.svelte +88 -7
  256. package/src/features/behavior-model/presentation/components/ScenariosEditor.svelte +1 -1
  257. package/src/features/behavior-model/presentation/components/SurfaceEntitiesView.svelte +1 -1
  258. package/src/features/behavior-model/presentation/components/SurfaceInvariantsEditor.svelte +1 -1
  259. package/src/features/behavior-model/presentation/components/SurfaceList.svelte +8 -1
  260. package/src/features/behavior-model/presentation/components/SurfacePersonasView.svelte +1 -1
  261. package/src/features/behavior-model/presentation/components/SurfaceResourcesView.svelte +1 -1
  262. package/src/features/behavior-model/presentation/view-models/factories.ts +4 -4
  263. package/src/features/domains/domain/entities/Domain.ts +1 -1
  264. package/src/features/implementation-status/application/use-cases/ReportImplementationStatus.ts +76 -16
  265. package/src/features/implementation-status/domain/ApplyCapturedToSpec.ts +1 -1
  266. package/src/features/implementation-status/domain/ImplementationStatus.ts +13 -0
  267. package/src/features/implementation-status/infrastructure/persistence/HttpImplementationStatusRepository.ts +26 -0
  268. package/src/features/library/presentation/components/LibraryDialog.svelte +489 -351
  269. package/src/features/maturity/domain/MaturityScorer.ts +7 -2
  270. package/src/features/mcp-tools/application/tools/getAction.ts +12 -4
  271. package/src/features/projects/presentation/components/NewProjectForm.svelte +16 -1
  272. package/src/features/projects/presentation/components/ProjectCard.svelte +1 -0
  273. package/src/features/projects/presentation/components/ProjectEditor.svelte +23 -13
  274. package/src/features/projects/presentation/components/ProjectEntitiesPanel.svelte +73 -92
  275. package/src/features/projects/presentation/components/ProjectEventsPanel.svelte +75 -101
  276. package/src/features/projects/presentation/components/ProjectFeaturesPanel.svelte +56 -2
  277. package/src/features/projects/presentation/components/ProjectHistoryPanel.svelte +90 -0
  278. package/src/features/projects/presentation/components/ProjectResourcesPanel.svelte +82 -105
  279. package/src/features/projects/presentation/components/ProjectTransitionsPanel.svelte +71 -101
  280. package/src/features/projects/presentation/components/ProjectsIndex.svelte +2 -1
  281. package/src/features/projects/presentation/services/crossFeatureGroups.ts +202 -0
  282. package/src/features/projects/presentation/stores/projectStore.svelte.ts +41 -1
  283. package/src/features/simulator/application/use-cases/RunScenarios.ts +2 -2
  284. package/src/features/simulator/application/use-cases/SimulateAction.ts +1 -1
  285. package/src/features/simulator/domain/SimulationResult.ts +1 -1
  286. package/src/features/simulator/domain/SimulatorEngine.ts +1 -1
  287. package/src/features/simulator/presentation/components/ParameterInputs.svelte +17 -1
  288. package/src/features/simulator/presentation/components/SimulatorPanel.svelte +5 -2
  289. package/src/features/tutorial/application/ports/SpecEventBus.ts +24 -0
  290. package/src/features/tutorial/domain/entities/TourDefinition.ts +20 -0
  291. package/src/features/tutorial/domain/entities/TourStep.ts +70 -0
  292. package/src/features/tutorial/domain/services/NameMatch.ts +19 -0
  293. package/src/features/tutorial/domain/services/SubmitGuard.ts +45 -0
  294. package/src/features/tutorial/domain/value-objects/TourFormId.ts +14 -0
  295. package/src/features/tutorial/domain/value-objects/TourPrefill.ts +14 -0
  296. package/src/features/tutorial/domain/value-objects/TourRequireExact.ts +15 -0
  297. package/src/features/tutorial/domain/value-objects/TourRoute.ts +10 -0
  298. package/src/features/tutorial/domain/value-objects/TourTrigger.ts +23 -0
  299. package/src/features/tutorial/infrastructure/adapters/SharedSpecEventBusAdapter.ts +24 -0
  300. package/src/features/tutorial/infrastructure/tours/firstFeatureTour.ts +317 -0
  301. package/src/features/tutorial/presentation/adapters/inputPrefill.ts +56 -0
  302. package/src/features/tutorial/presentation/adapters/topLayerStacker.ts +69 -0
  303. package/src/features/tutorial/presentation/adapters/useTargetTracker.svelte.ts +116 -0
  304. package/src/features/tutorial/presentation/components/TourOverlay.svelte +266 -0
  305. package/src/features/tutorial/presentation/components/TourPanel.svelte +167 -0
  306. package/src/features/tutorial/presentation/components/TourSpotlight.svelte +111 -0
  307. package/src/features/tutorial/presentation/stores/tourStore.svelte.ts +118 -0
  308. package/src/lib/client/sync/syncEvents.ts +1 -1
  309. package/src/lib/server/sync/changeDescriptor.ts +7 -2
  310. package/src/lib/server/sync/syncEventsHub.ts +8 -8
  311. package/src/lib/server/sync/wsServer.ts +1 -1
  312. package/src/routes/+layout.svelte +9 -4
  313. package/src/routes/tutorial/+page.svelte +215 -123
  314. package/src/shared/domain/IdGenerator.ts +1 -1
  315. package/src/shared/infrastructure/browserContainer.ts +6 -0
  316. package/src/shared/infrastructure/container.ts +7 -2
  317. package/src/shared/presentation/components/ProgressBar.svelte +1 -1
  318. package/src/shared/presentation/components/TagList.svelte +13 -3
  319. package/src/shared/presentation/easter-eggs/FlyingSpaghettiEasterEgg.svelte +291 -0
  320. package/src/shared/presentation/toast/SyncToast.svelte +2 -2
  321. package/vite.config.ts +6 -1
  322. package/build/client/_app/immutable/assets/0.BLfpiAwD.css +0 -2
  323. package/build/client/_app/immutable/assets/0.BLfpiAwD.css.br +0 -0
  324. package/build/client/_app/immutable/assets/0.BLfpiAwD.css.gz +0 -0
  325. package/build/client/_app/immutable/chunks/7CWAShXO.js.br +0 -0
  326. package/build/client/_app/immutable/chunks/7CWAShXO.js.gz +0 -0
  327. package/build/client/_app/immutable/chunks/Bh4L4TR3.js +0 -1
  328. package/build/client/_app/immutable/chunks/Bh4L4TR3.js.br +0 -0
  329. package/build/client/_app/immutable/chunks/Bh4L4TR3.js.gz +0 -0
  330. package/build/client/_app/immutable/chunks/Bhj2nPnh.js +0 -2
  331. package/build/client/_app/immutable/chunks/Bhj2nPnh.js.br +0 -0
  332. package/build/client/_app/immutable/chunks/Bhj2nPnh.js.gz +0 -0
  333. package/build/client/_app/immutable/chunks/CB9H0ifB.js.br +0 -0
  334. package/build/client/_app/immutable/chunks/CB9H0ifB.js.gz +0 -0
  335. package/build/client/_app/immutable/chunks/CRPPOQ_q.js +0 -1
  336. package/build/client/_app/immutable/chunks/CRPPOQ_q.js.br +0 -0
  337. package/build/client/_app/immutable/chunks/CRPPOQ_q.js.gz +0 -0
  338. package/build/client/_app/immutable/chunks/CYEqQWxZ.js.br +0 -0
  339. package/build/client/_app/immutable/chunks/CYEqQWxZ.js.gz +0 -0
  340. package/build/client/_app/immutable/chunks/CcT88Qay.js +0 -1
  341. package/build/client/_app/immutable/chunks/CcT88Qay.js.br +0 -0
  342. package/build/client/_app/immutable/chunks/CcT88Qay.js.gz +0 -0
  343. package/build/client/_app/immutable/chunks/ChWRqgym.js +0 -1
  344. package/build/client/_app/immutable/chunks/ChWRqgym.js.br +0 -0
  345. package/build/client/_app/immutable/chunks/ChWRqgym.js.gz +0 -0
  346. package/build/client/_app/immutable/chunks/CmOXOYi7.js.br +0 -0
  347. package/build/client/_app/immutable/chunks/CmOXOYi7.js.gz +0 -0
  348. package/build/client/_app/immutable/chunks/Cq9Rf810.js +0 -1
  349. package/build/client/_app/immutable/chunks/Cq9Rf810.js.br +0 -2
  350. package/build/client/_app/immutable/chunks/Cq9Rf810.js.gz +0 -0
  351. package/build/client/_app/immutable/chunks/DD8A-Gtg.js +0 -6
  352. package/build/client/_app/immutable/chunks/DD8A-Gtg.js.br +0 -0
  353. package/build/client/_app/immutable/chunks/DD8A-Gtg.js.gz +0 -0
  354. package/build/client/_app/immutable/chunks/DhaH6JO9.js.br +0 -1
  355. package/build/client/_app/immutable/chunks/DhaH6JO9.js.gz +0 -0
  356. package/build/client/_app/immutable/chunks/DmHqLDCF.js +0 -1
  357. package/build/client/_app/immutable/chunks/DmHqLDCF.js.br +0 -0
  358. package/build/client/_app/immutable/chunks/DmHqLDCF.js.gz +0 -0
  359. package/build/client/_app/immutable/chunks/Dw9eLPYi.js +0 -1
  360. package/build/client/_app/immutable/chunks/Dw9eLPYi.js.br +0 -1
  361. package/build/client/_app/immutable/chunks/Dw9eLPYi.js.gz +0 -0
  362. package/build/client/_app/immutable/chunks/Kkaknqg3.js +0 -1
  363. package/build/client/_app/immutable/chunks/Kkaknqg3.js.br +0 -0
  364. package/build/client/_app/immutable/chunks/Kkaknqg3.js.gz +0 -0
  365. package/build/client/_app/immutable/chunks/SUKfBDXm.js.br +0 -0
  366. package/build/client/_app/immutable/chunks/SUKfBDXm.js.gz +0 -0
  367. package/build/client/_app/immutable/chunks/UiM2Znlq.js +0 -4
  368. package/build/client/_app/immutable/chunks/UiM2Znlq.js.br +0 -0
  369. package/build/client/_app/immutable/chunks/UiM2Znlq.js.gz +0 -0
  370. package/build/client/_app/immutable/entry/app.C6Stj5Nw.js +0 -2
  371. package/build/client/_app/immutable/entry/app.C6Stj5Nw.js.br +0 -0
  372. package/build/client/_app/immutable/entry/app.C6Stj5Nw.js.gz +0 -0
  373. package/build/client/_app/immutable/entry/start.cComHq1k.js +0 -1
  374. package/build/client/_app/immutable/entry/start.cComHq1k.js.br +0 -0
  375. package/build/client/_app/immutable/entry/start.cComHq1k.js.gz +0 -0
  376. package/build/client/_app/immutable/nodes/0.DV2oqy6g.js +0 -3
  377. package/build/client/_app/immutable/nodes/0.DV2oqy6g.js.br +0 -0
  378. package/build/client/_app/immutable/nodes/0.DV2oqy6g.js.gz +0 -0
  379. package/build/client/_app/immutable/nodes/1.CLgrLmv7.js.br +0 -0
  380. package/build/client/_app/immutable/nodes/1.CLgrLmv7.js.gz +0 -0
  381. package/build/client/_app/immutable/nodes/2.aQsjERO_.js +0 -1
  382. package/build/client/_app/immutable/nodes/2.aQsjERO_.js.br +0 -1
  383. package/build/client/_app/immutable/nodes/2.aQsjERO_.js.gz +0 -0
  384. package/build/client/_app/immutable/nodes/3.o37WwOCE.js +0 -3
  385. package/build/client/_app/immutable/nodes/3.o37WwOCE.js.br +0 -0
  386. package/build/client/_app/immutable/nodes/3.o37WwOCE.js.gz +0 -0
  387. package/build/client/_app/immutable/nodes/4.Dbrg6PzB.js +0 -43
  388. package/build/client/_app/immutable/nodes/4.Dbrg6PzB.js.br +0 -0
  389. package/build/client/_app/immutable/nodes/4.Dbrg6PzB.js.gz +0 -0
  390. package/build/client/_app/immutable/nodes/5.LnvpMBk8.js +0 -5
  391. package/build/client/_app/immutable/nodes/5.LnvpMBk8.js.br +0 -0
  392. package/build/client/_app/immutable/nodes/5.LnvpMBk8.js.gz +0 -0
  393. package/build/client/_app/immutable/nodes/6.CHriKwAY.js +0 -1
  394. package/build/client/_app/immutable/nodes/6.CHriKwAY.js.br +0 -0
  395. package/build/client/_app/immutable/nodes/6.CHriKwAY.js.gz +0 -0
  396. package/build/client/_app/immutable/nodes/7.FV_Mf4zC.js +0 -5
  397. package/build/client/_app/immutable/nodes/7.FV_Mf4zC.js.br +0 -0
  398. package/build/client/_app/immutable/nodes/7.FV_Mf4zC.js.gz +0 -0
  399. package/build/client/_app/immutable/nodes/8.BVPp-3Jw.js +0 -364
  400. package/build/client/_app/immutable/nodes/8.BVPp-3Jw.js.br +0 -0
  401. package/build/client/_app/immutable/nodes/8.BVPp-3Jw.js.gz +0 -0
  402. package/build/server/chunks/0-ck_8S7ii.js +0 -15
  403. package/build/server/chunks/0-ck_8S7ii.js.map +0 -1
  404. package/build/server/chunks/1-EvCmJU93.js +0 -9
  405. package/build/server/chunks/2-ByiZzIjt.js +0 -9
  406. package/build/server/chunks/2-ByiZzIjt.js.map +0 -1
  407. package/build/server/chunks/3-BXfgH8iQ.js +0 -16
  408. package/build/server/chunks/4-CbSPlAwh.js +0 -9
  409. package/build/server/chunks/4-CbSPlAwh.js.map +0 -1
  410. package/build/server/chunks/5--noidTrC.js +0 -9
  411. package/build/server/chunks/6-DkH9D9Vr.js +0 -9
  412. package/build/server/chunks/6-DkH9D9Vr.js.map +0 -1
  413. package/build/server/chunks/7-DWURCz96.js +0 -9
  414. package/build/server/chunks/7-DWURCz96.js.map +0 -1
  415. package/build/server/chunks/8-ey7T3lwI.js +0 -9
  416. package/build/server/chunks/8-ey7T3lwI.js.map +0 -1
  417. package/build/server/chunks/FeatureCard-qMrgIY4R.js.map +0 -1
  418. package/build/server/chunks/ProgressBar-CCDGZh4y.js.map +0 -1
  419. package/build/server/chunks/ProjectsIndex-De5pqV0u.js.map +0 -1
  420. package/build/server/chunks/QueueItem-DNAI4oAZ.js.map +0 -1
  421. package/build/server/chunks/TagList-mh_TaMdj.js.map +0 -1
  422. package/build/server/chunks/TransitionCatalog-6JXlrQGF.js.map +0 -1
  423. package/build/server/chunks/_layout.svelte-CXqUGHsD.js.map +0 -1
  424. package/build/server/chunks/_page.svelte-B2Mykryr.js.map +0 -1
  425. package/build/server/chunks/_page.svelte-CuDeJhwE.js.map +0 -1
  426. package/build/server/chunks/_page.svelte-DSMXcsQF.js.map +0 -1
  427. package/build/server/chunks/_page.svelte-m6BeiHNT.js.map +0 -1
  428. package/build/server/chunks/_page.svelte-wtlCU8w2.js.map +0 -1
  429. package/build/server/chunks/client-2hNr7zGI.js.map +0 -1
  430. package/build/server/chunks/eventBus-AsLh8hO0.js.map +0 -1
  431. package/build/server/chunks/featuresStore.svelte-DIB5OTQr.js.map +0 -1
  432. package/build/server/chunks/projectsStore.svelte-ynWZi-y3.js.map +0 -1
  433. package/build/server/chunks/sync-CAWyh7MA.js.map +0 -1
  434. /package/build/client/_app/immutable/chunks/{DRY_N2lk.js → BQ9GodWX.js} +0 -0
  435. /package/build/client/_app/immutable/chunks/{DRY_N2lk.js.br → BQ9GodWX.js.br} +0 -0
  436. /package/build/client/_app/immutable/chunks/{DRY_N2lk.js.gz → BQ9GodWX.js.gz} +0 -0
  437. /package/build/client/_app/immutable/chunks/{DXb0ZbaM.js → kNaey6uv.js} +0 -0
  438. /package/build/client/_app/immutable/chunks/{DXb0ZbaM.js.br → kNaey6uv.js.br} +0 -0
  439. /package/build/client/_app/immutable/chunks/{DXb0ZbaM.js.gz → kNaey6uv.js.gz} +0 -0
  440. /package/build/client/_app/immutable/chunks/{CT0T0Gak.js → xihTtKlq.js} +0 -0
  441. /package/build/client/_app/immutable/chunks/{CT0T0Gak.js.br → xihTtKlq.js.br} +0 -0
  442. /package/build/client/_app/immutable/chunks/{CT0T0Gak.js.gz → xihTtKlq.js.gz} +0 -0
package/README.md CHANGED
@@ -1,11 +1,11 @@
1
- <p align="center">
1
+ <p align="center">
2
2
  <img src="https://cdn.jsdelivr.net/npm/unspaghettit/static/unspaghettit_logo.png" alt="Unspaghettit" width="120" />
3
3
  </p>
4
4
 
5
5
  <h1 align="center">Unspaghettit</h1>
6
6
 
7
7
  <p align="center">
8
- <em>Behavior-driven AI development without prompt spaghetti.</em>
8
+ <em>Executable specifications for AI-assisted software development.</em>
9
9
  </p>
10
10
 
11
11
  <p align="center">
@@ -36,9 +36,19 @@ AI coding workflows go sideways fast. Specs drift. Prompts pile up. Generated sy
36
36
 
37
37
  ## What it does
38
38
 
39
- Unspaghettit gives humans and LLMs a shared, **executable behavioral runtime** for the systems they build together.
39
+ Unspaghettit gives humans and LLMs a shared, **executable specification** for the systems they build together. If you think in terms of SDD, treat it as a local, machine-checkable software design document that agents can read and update through MCP.
40
+
41
+ Instead of keeping product intent in long prompts or markdown that slowly goes stale, you model the behavior as structured pieces: features, surfaces, actions, state, rules, effects, events, invariants, and scenarios. The MCP server exposes that specification to your AI coding tool, so the LLM can inspect, simulate, edit, and audit the model through typed tool calls instead of guessing from prose.
42
+
43
+ The specification becomes the source of truth; prompts become disposable again.
40
44
 
41
- You describe behavior, surfaces, states, transitions, actions, events, rules, invariants, scenarios. An MCP server exposes the runtime as a structured tool surface your LLM uses instead of free-form prose. The runtime becomes the source of truth; prompts become disposable again.
45
+ ## Benefits
46
+
47
+ - **Less drift between intent and code**: scenarios, generated types, and implementation coverage all point back to the same spec.
48
+ - **AI agents get structured context**: the LLM reads focused entities and actions instead of a giant prompt blob.
49
+ - **Specs become testable**: every scenario can run through the simulator before implementation exists.
50
+ - **Implementation stays auditable**: `.unspa.json` records where each spec entity is implemented and reports gaps.
51
+ - **Teams keep local ownership**: snapshots are plain JSON in your repo or local hub, with no hosted service required.
42
52
 
43
53
  ## Scenarios as CI-grade spec tests
44
54
 
@@ -50,11 +60,11 @@ Specs stop being documentation. They become a runtime contract you can break lou
50
60
 
51
61
  ## Core capabilities
52
62
 
53
- - **Structured behavioral runtime**, features, surfaces, actions, states, rules, invariants, transitions, scenarios, personas, resources, entities, events.
54
- - **MCP-native**, every entity is created, read, edited, validated through MCP tool calls. Works with any MCP-compatible IDE (Claude Code, Claude Desktop, Cursor, Gemini, Windsurf, Kiro, Codex).
55
- - **Deterministic simulator**, `dry_run_simulate` runs an action against a snapshot. `run_all_scenarios` executes every scenario as a CI-grade spec test, with pass/fail per assertion.
63
+ - **Structured behavior specification**, features, surfaces, actions, states, rules, invariants, transitions, scenarios, personas, resources, entities, events.
64
+ - **MCP-native**, every entity is created, read, edited, and validated through MCP tool calls. Works with any MCP-compatible IDE (Claude Code, Claude Desktop, Cursor, Gemini, Windsurf, Kiro, Codex).
65
+ - **Deterministic simulator**, `dry_run_simulate` runs an action against a state snapshot. `run_all_scenarios` executes every scenario as a CI-grade spec test, with pass/fail per assertion.
56
66
  - **Maturity scoring**, `score_feature` returns a per-area score with critical/recommended issues; surfaces the worst surfaces and biggest gaps.
57
- - **Typed scaffolding**, `generate_types` emits TypeScript types (state shapes, event names, action parameter types) that your implementation imports. TS catches drift the moment the spec changes.
67
+ - **Generated TypeScript contracts**, `generate_types` writes types for state shapes, event names, and action parameters. Your implementation imports them, so TypeScript catches drift when the spec changes.
58
68
  - **Implementation audit**, record each implementation in a `.unspa.json` behavioral index (`{ file, line, signature }` per entity); the MCP reconciles it against the spec and reports coverage + gaps.
59
69
  - **Implementation queue**, per-project "implement next" list (Feature / Surface / Action items). Drag-and-drop reorder in the dashboard, `mcp__unspa__get_next_queued` so a dev says "implement the next thing" without naming it. Auto-prunes items the behavioral index marks done.
60
70
  - **Local-first**, everything lives in your repo. No telemetry, no hosted servers, no cloud dependency. Snapshots are plain JSON.
@@ -68,8 +78,8 @@ Specs stop being documentation. They become a runtime contract you can break lou
68
78
  1. Describe what you want to your LLM.
69
79
  2. The LLM builds the runtime via the MCP, `create_feature`, `apply_batch`, `add_action`, etc. Validation errors come back inline so the runtime converges.
70
80
  3. Author scenarios. `run_all_scenarios` makes them executable spec tests.
71
- 4. `generate_types` mints typed scaffolding.
72
- 5. The LLM writes implementation against the types and scenarios. The `.unspa.json` index pins each entity to a `{ file, line, signature }` so the dashboard can resolve coverage.
81
+ 4. `generate_types` writes TypeScript contracts from the spec.
82
+ 5. The LLM implements the feature using those types and the scenario results as checks. The `.unspa.json` index maps each spec entity to a `{ file, line, signature }` so the dashboard can resolve coverage.
73
83
  6. `score_feature` and `get_spec_gaps` catch shallow modelling before it ships.
74
84
 
75
85
  ### Code → spec
@@ -82,17 +92,124 @@ Specs stop being documentation. They become a runtime contract you can break lou
82
92
 
83
93
  The LLM does the reading/writing in both directions. Unspaghettit gives it a structured target and a maturity gate.
84
94
 
95
+ ## Working with the MCP in chat
96
+
97
+ Once `unspa init` has registered the MCP server and your AI client has restarted, you do not need to speak in Unspaghettit internals. Start with the product you want. Mention the Unspaghettit or Unspa MCP, the scope, and the level of completeness you want. For a first prompt, asking for 100% maturity usually gives a much better result because it pushes the agent to create complete scenarios, rules, and checks instead of a shallow outline.
98
+
99
+ ### Start with a product prompt
100
+
101
+ This is usually enough:
102
+
103
+ ```text
104
+ Using the Unspaghettit MCP, create a new project.
105
+ It is a mobile app that lets a user get one coupon each day for a shop near them.
106
+ Make each feature reach 100% maturity.
107
+ ```
108
+
109
+ If you want a smaller first pass:
110
+
111
+ ```text
112
+ Using the Unspa MCP, create a new project for a B2B invoicing app.
113
+ Start with three features only: customers, invoices, and payment follow-up.
114
+ Make it a solid first draft, not necessarily 100% maturity yet.
115
+ Ask me if a business rule is unclear.
116
+ ```
117
+
118
+ For one feature:
119
+
120
+ ```text
121
+ Using the Unspaghettit MCP, add a feature for approving refunds.
122
+ Keep it focused on the support agent workflow.
123
+ Make it implementation-ready and bring it to 100% maturity.
124
+ ```
125
+
126
+ ### Choose the maturity level
127
+
128
+ 100% maturity is the recommended default for a first serious prompt. It helps the agent produce a richer spec on the first pass. Lower the target only when you explicitly want brainstorming, discovery, or a partial draft.
129
+
130
+ ```text
131
+ Make this a rough product draft. Do not force 100% maturity yet.
132
+ I want enough structure to discuss the flow and discover missing business rules.
133
+ ```
134
+
135
+ ```text
136
+ Make this implementation-ready. Aim for 100% maturity.
137
+ If anything prevents 100%, explain the missing product decision instead of inventing it.
138
+ ```
139
+
140
+ ```text
141
+ Do not chase the score blindly. Prefer a clear product spec.
142
+ If a maturity check feels artificial for this feature, tell me why.
143
+ ```
144
+
145
+ ### Ask questions about the spec
146
+
147
+ The MCP is also useful as a query layer. Ask the agent to inspect the current model instead of relying on memory or screenshots.
148
+
149
+ ```text
150
+ Using the Unspaghettit MCP, explain the Cart & checkout feature.
151
+ Explain what the user can do, what can block them, and what happens after each important action.
152
+ ```
153
+
154
+ ```text
155
+ What can block Place order?
156
+ Explain each blocker in product language and tell me which cases are already covered by scenarios.
157
+ ```
158
+
159
+ ```text
160
+ Where is email verification used in this project?
161
+ Tell me what depends on it and what would change if we removed that requirement.
162
+ ```
163
+
164
+ ```text
165
+ Using the Unspaghettit MCP, make a report of the current implementation of the specs in this codebase.
166
+ Tell me what is implemented, what is missing, and what looks stale.
167
+ ```
168
+
169
+ ### Change or extend the spec
170
+
171
+ You can ask for changes in normal product language. Add constraints when they matter.
172
+
173
+ ```text
174
+ Using the Unspaghettit MCP, add a "Cancel subscription" flow.
175
+ Reuse the existing billing concepts when possible.
176
+ After the edit, tell me whether the maturity score changed and why.
177
+ ```
178
+
179
+ ```text
180
+ Before changing the spec, propose the change in plain English.
181
+ Once I approve, update the Unspaghettit project and run the relevant scenarios.
182
+ ```
183
+
184
+ ### Move from spec to implementation
185
+
186
+ If you want code, say so in the same prompt. Include design, stack, and implementation constraints if they matter.
187
+
188
+ ```text
189
+ Using the Unspaghettit MCP, implement the next queued feature.
190
+ Use the existing SvelteKit style and keep the UI quiet and mobile-friendly.
191
+ After implementation, update the implementation report for the spec.
192
+ ```
193
+
194
+ ```text
195
+ Using the Unspa MCP, implement the coupon discovery feature.
196
+ Use the current app stack. If the spec is missing something needed for implementation,
197
+ update the spec first, then write the code.
198
+ ```
199
+
200
+ Good first prompt pattern: mention the Unspaghettit MCP, describe the product, set the maturity level, and say whether you want spec only or spec plus implementation.
201
+
85
202
  ## What makes it different
86
203
 
87
- It is not:
204
+ Unspaghettit is a local, executable specification layer for AI-assisted development. It gives the LLM durable project memory that can be validated, simulated, scored, and mapped back to source code.
88
205
 
89
- - another markdown prompt workflow,
90
- - an autonomous agent framework,
91
- - a hosted AI wrapper,
92
- - a no-code platform,
93
- - a code generator (the LLM writes the code; `generate_types` only provides typed scaffolding).
206
+ That makes it different from:
94
207
 
95
- The runtime itself becomes the operational memory of the project. LLMs stop working from fragile prompts and start working from explicit, executable behavior.
208
+ - markdown prompt workflows, which are easy to write but cannot execute or report drift,
209
+ - autonomous agent frameworks, which decide how work gets done but usually do not model product behavior as a contract,
210
+ - hosted AI wrappers, which add a service boundary instead of keeping the source of truth in your repo,
211
+ - no-code platforms, which own the implementation path,
212
+ - code generators, because Unspaghettit generates contracts and audit data while your LLM or team writes the actual code.
96
213
 
97
214
  ## Philosophy
98
215
 
@@ -126,10 +243,10 @@ unspa dashboard # opens http://localhost:3000
126
243
  | Client | Project config | Global config |
127
244
  | ------------------------ | ------------------------------- | -------------------------------------- |
128
245
  | Claude Code (CLI + VSC) | `.mcp.json` | `~/.claude.json` |
129
- | Claude Desktop | (no project scope) | `%APPDATA%\Claude\claude_desktop_config.json` (Windows) / `~/Library/Application Support/Claude/...` (macOS) |
246
+ | Claude Desktop | n/a (no project scope) | `%APPDATA%\Claude\claude_desktop_config.json` (Windows) / `~/Library/Application Support/Claude/...` (macOS) |
130
247
  | Cursor | `.cursor/mcp.json` | `~/.cursor/mcp.json` |
131
248
  | Gemini Code Assist / CLI | `.gemini/settings.json` | `~/.gemini/settings.json` |
132
- | Windsurf | | `~/.codeium/windsurf/mcp_config.json` |
249
+ | Windsurf | n/a | `~/.codeium/windsurf/mcp_config.json` |
133
250
  | Kiro | `.kiro/settings/mcp.json` | `~/.kiro/settings/mcp.json` |
134
251
  | Codex (VS Code) | prints snippet to paste manually | same |
135
252
 
@@ -141,7 +258,7 @@ Restart your IDE. Your LLM now has the runtime's full tool surface.
141
258
 
142
259
  ### Shared snapshot hub
143
260
 
144
- By default `unspa init` scaffolds a per-repo `unspa/` folder. For workflows where you want **one source of truth across many repos** or where you want to attach **Claude Desktop** (which has no project scope and no useful launch cwd) use a shared hub:
261
+ By default `unspa init` scaffolds a per-repo `unspa/` folder. For workflows where you want **one source of truth across many repos**, or where you want to attach **Claude Desktop** (which has no project scope and no useful launch cwd), use a shared hub:
145
262
 
146
263
  ```bash
147
264
  unspa init --hub # default hub at ~/.unspa-hub/unspa
@@ -154,21 +271,24 @@ In hub mode:
154
271
  - Every selected client's MCP entry carries `UNSPA_SNAPSHOTS=<absolute hub path>`, so the MCP always reads/writes the hub regardless of where the client launches it.
155
272
  - One `unspa dashboard` run from the hub root serves the same data every client sees.
156
273
 
157
- End state: Claude Desktop for cross-project querying, per-repo Claude Code instances pointed at the same hub via the env var (and bound to one project each via `unspa link`), and one live dashboard reflecting every change. All loopback / single-machine the hub is not a network service.
274
+ End state: Claude Desktop for cross-project querying, per-repo Claude Code instances pointed at the same hub via the env var (and bound to one project each via `unspa link`), and one live dashboard reflecting every change. All loopback / single-machine; the hub is not a network service.
158
275
 
159
276
  For the CLI details (commands, flags, troubleshooting), see [cli/README.md](cli/README.md).
160
277
 
161
278
  ## Example
162
279
 
163
- Boot `unspa dashboard` and click **Load samples** to install the bundled **eShop** project: 4 LLM-sized features (Account & auth, Catalog & reviews, Cart & checkout, Order fulfillment) that exercise the full capability surface, composite + Expression conditions, feature invariants, event cascade, `bypassInvariants`, action invariants, scenarios, persona overrides, entity/resource mapping. Every feature scores 100% maturity. It's the fastest way to see how a real Unspaghettit project is shaped before you start your own.
280
+ Boot `unspa dashboard` and click **Load samples** to install the bundled **eShop** project: 4 LLM-sized features (Account & auth, Catalog & reviews, Cart & checkout, Order fulfillment) that exercise the full capability surface, composite + Expression conditions, feature invariants, event cascade, `bypassInvariants`, action invariants, scenarios, persona overrides, entity/resource mapping. Every feature scores 100% maturity so the sample works as a clean reference model. To see maturity gaps, create a tiny scratch feature with an empty surface or an action without effects/scenarios; the dashboard will show the missing pieces.
281
+
282
+ The dashboard also ships a **Tutorial** page (`/tutorial`) with a 14-section walkthrough and a **Run interactive tutorial** button that drives a guided spotlight tour from project → feature → surface → action → parameter → rule → simulator, prefilling fields and gating each step on the right thing being typed/clicked.
164
283
 
165
284
  ## Collaboration
166
285
 
167
286
  Multiple humans + AI agents can edit the same runtime live:
168
287
 
169
288
  - **Real-time sync**, every dashboard tab subscribes to a per-room Yjs WebSocket. Out-of-band changes (MCP writes, other tabs) flow in without a reload, with an activity toast for each change carrying a breadcrumb path (`Project › Feature › Surface › Action`) and a "View" button.
170
- - **Identity**, click the round avatar in the header to set your display name. Every history entry you create is tagged with it. Stored in browser localStorage never sent off-machine. First visit prompts once; the avatar dropdown is the explicit way to change or reset later.
289
+ - **Identity**, click the round avatar in the header to set your display name. Every history entry you create is tagged with it. Stored in browser localStorage, never sent off-machine. First visit prompts once; the avatar dropdown is the explicit way to change or reset later.
171
290
  - **Attribution**, MCP-driven changes carry an `AI · for John` label (the AI badge stays primary; the human name is the supporting attribution). Resolved server-side from whoever's currently at the dashboard.
291
+ - **Project history**, read-only timeline tab on the project page lists every change (rename, feature add/remove, queue mutation, …) with author + timestamp. The shared Y.Doc room feeds it, so MCP edits and human edits land in the same audit log.
172
292
  - **Implementation queue**, drag-and-drop "implement next" list per project. The LLM uses `mcp__unspa__get_next_queued` so you can say "implement the next thing" without naming it. Items auto-prune as `.unspa.json` flips them to `implemented`.
173
293
  - **Backup / share**, the project page's **Export .unspa** button produces an encrypted bundle (project + features + status). The matching **Import .unspa** on the projects index restores it. Passphrase is required on both ends; the file itself reveals nothing about its contents.
174
294
 
@@ -182,7 +302,7 @@ Unspaghettit is local-first by default. Three tiers, all opt-in beyond the defau
182
302
  | **LAN-share** | `UNSPA_AUTH_TOKEN=<secret>`, optionally `UNSPA_ALLOWED_ORIGIN=http://host:3000`, then `unspa dashboard --host 0.0.0.0` | Every REST + WebSocket request requires the token. Origin allowlist closes browser-side CSRF. Set the **same** `UNSPA_AUTH_TOKEN` on the MCP server's env so its notify calls authenticate. The dashboard prints the auth posture in its startup banner. |
183
303
  | **Backup / share** (orthogonal to live sharing) | Click **Export .unspa** on a project, enter a passphrase ≥ 8 chars | AES-GCM-256 + PBKDF2-SHA256 (600k iterations). Passphrase never leaves the browser. Envelope carries no project name or metadata. |
184
304
 
185
- Full threat model + mitigations in [SECURITY.md](SECURITY.md). For SSO / RBAC / audit trails / encryption at rest, the OSS install stops at the LAN-share tier those are a separate enterprise build (`hello@lyriks.io`).
305
+ Full threat model + mitigations in [SECURITY.md](SECURITY.md). For SSO / RBAC / audit trails / encryption at rest, the OSS install stops at the LAN-share tier. Those are a separate enterprise build (`hello@lyriks.io`).
186
306
 
187
307
  ## Architecture
188
308
 
@@ -0,0 +1 @@
1
+ .spaghetti-sky.svelte-dds6m1{z-index:100;pointer-events:none;position:fixed;inset:0;overflow:hidden}.spaghetti.svelte-dds6m1{filter:drop-shadow(0 18px 18px #0f172a2e);width:190px;height:145px;animation:5s cubic-bezier(.3,0,.2,1) forwards svelte-dds6m1-spaghetti-flight;position:absolute;top:22vh;left:-230px}svg.svelte-dds6m1{width:100%;height:auto;overflow:visible}.bowl-shadow.svelte-dds6m1{fill:#0f172a1f}.bowl.svelte-dds6m1{fill:#f8fafc;stroke:#94a3b8;stroke-width:3px}.bowl-lip.svelte-dds6m1{fill:#fff7ed;stroke:#94a3b8;stroke-width:3px}.noodles.svelte-dds6m1{fill:none;stroke:#facc15;stroke-width:7px;stroke-linecap:round;stroke-linejoin:round;animation:.76s ease-in-out infinite alternate svelte-dds6m1-noodle-wiggle}.sauce.svelte-dds6m1{fill:#ef4444;stroke:#991b1b;stroke-width:2px}.face.svelte-dds6m1{fill:#0f172a;stroke:#78350f;stroke-width:3px;stroke-linecap:round}.face.svelte-dds6m1 circle:where(.svelte-dds6m1){stroke:none}.fork.svelte-dds6m1{fill:none;stroke:#64748b;stroke-width:5px;stroke-linecap:round;stroke-linejoin:round}.wing.svelte-dds6m1{fill:#f8fafc;stroke:#14b8a6;stroke-width:4px;stroke-linecap:round;stroke-linejoin:round;transform-box:fill-box;transform-origin:50%;animation:.36s ease-in-out infinite alternate svelte-dds6m1-wing-flap}.wing-right.svelte-dds6m1{animation-delay:.11s}.label.svelte-dds6m1{color:#fff;letter-spacing:.04em;text-transform:uppercase;white-space:nowrap;background:#0f172aeb;border-radius:999px;padding:3px 8px;font-size:10px;font-weight:700;position:absolute;top:114px;left:44px}@keyframes svelte-dds6m1-spaghetti-flight{0%{opacity:0;transform:translateY(48px)rotate(-12deg)scale(.9)}10%{opacity:1}45%{transform:translate(48vw,-8vh)rotate(8deg)scale(1)}75%{opacity:1;transform:translate(76vw,18vh)rotate(-6deg)scale(.98)}to{opacity:0;transform:translate(calc(100vw + 220px),-4vh)rotate(18deg)scale(.92)}}@keyframes svelte-dds6m1-noodle-wiggle{0%{transform:translate(-1px)}to{transform:translate(2px)}}@keyframes svelte-dds6m1-wing-flap{0%{transform:rotate(-4deg)}to{transform:rotate(8deg)}}@media (prefers-reduced-motion:reduce){.spaghetti.svelte-dds6m1{animation:2.5s ease-out forwards svelte-dds6m1-spaghetti-peek}.noodles.svelte-dds6m1,.wing.svelte-dds6m1{animation:none}}@keyframes svelte-dds6m1-spaghetti-peek{0%{opacity:0;transform:translate(40vw,24px)scale(.96)}15%,85%{opacity:1;transform:translate(40vw)scale(.96)}to{opacity:0;transform:translate(40vw,-12px)scale(.96)}}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:"Inter", ui-sans-serif, system-ui, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-orange-100:oklch(95.4% .038 75.164);--color-orange-800:oklch(47% .157 37.304);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-900:oklch(37.8% .077 168.94);--color-teal-100:oklch(95.3% .051 180.801);--color-teal-200:oklch(91% .096 180.426);--color-teal-800:oklch(43.7% .078 188.216);--color-teal-900:oklch(38.6% .063 188.416);--color-cyan-50:oklch(98.4% .019 200.873);--color-cyan-100:oklch(95.6% .045 203.388);--color-cyan-200:oklch(91.7% .08 205.041);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-800:oklch(45% .085 224.283);--color-cyan-950:oklch(30.2% .056 229.695);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-600:oklch(58.8% .158 241.966);--color-sky-700:oklch(50% .134 242.749);--color-sky-800:oklch(44.3% .11 240.79);--color-sky-900:oklch(39.1% .09 240.876);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-800:oklch(39.8% .195 277.366);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-100:oklch(94.3% .029 294.588);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-600:oklch(54.1% .281 293.009);--color-violet-700:oklch(49.1% .27 292.581);--color-violet-800:oklch(43.2% .232 292.759);--color-violet-900:oklch(38% .189 293.745);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-800:oklch(43.8% .218 303.724);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-neutral-50:oklch(98.5% 0 0);--color-neutral-100:oklch(97% 0 0);--color-neutral-200:oklch(92.2% 0 0);--color-neutral-300:oklch(87% 0 0);--color-neutral-400:oklch(70.8% 0 0);--color-neutral-500:oklch(55.6% 0 0);--color-neutral-600:oklch(43.9% 0 0);--color-neutral-700:oklch(37.1% 0 0);--color-neutral-800:oklch(26.9% 0 0);--color-neutral-900:oklch(20.5% 0 0);--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-3xl:48rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-brand-50:#ecfeff;--color-brand-100:#cffafe;--color-brand-200:#a5f3fc;--color-brand-300:#67e8f9;--color-brand-400:#22d3ee;--color-brand-500:#06b6d4;--color-brand-600:#0891b2;--color-brand-700:#0e7490;--color-brand-800:#155e75;--color-brand-900:#164e63;--color-canvas:#f8fafc;--color-brand-pink:#db2777;--color-brand-peach:#ea580c;--color-brand-ochre:#ca8a04;--color-brand-mint:#14b8a6;--color-brand-coral:#dc2626;--color-ink:#0f172a;--color-hairline:#e2e8f0;--font-brand:"Dancing Script", ui-serif, cursive;--font-grotesk:"Space Grotesk", ui-sans-serif, system-ui, sans-serif}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}button:not(:disabled),[role=button]:not(:disabled),[role=tab]:not(:disabled),[role=menuitem]:not(:disabled),[role=option]:not(:disabled),summary,select:not(:disabled),input[type=checkbox]:not(:disabled),input[type=radio]:not(:disabled),input[type=file]:not(:disabled),input[type=submit]:not(:disabled),input[type=reset]:not(:disabled),input[type=button]:not(:disabled){cursor:pointer}label:has(input[type=checkbox]:not(:disabled)){cursor:pointer}label:has(input[type=radio]:not(:disabled)){cursor:pointer}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.-top-0\.5{top:calc(var(--spacing) * -.5)}.top-0{top:calc(var(--spacing) * 0)}.top-1\/2{top:50%}.top-12{top:calc(var(--spacing) * 12)}.top-16{top:calc(var(--spacing) * 16)}.top-20{top:calc(var(--spacing) * 20)}.top-24{top:calc(var(--spacing) * 24)}.-right-0\.5{right:calc(var(--spacing) * -.5)}.right-0{right:calc(var(--spacing) * 0)}.right-4{right:calc(var(--spacing) * 4)}.-bottom-0\.5{bottom:calc(var(--spacing) * -.5)}.-bottom-2{bottom:calc(var(--spacing) * -2)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-24{bottom:calc(var(--spacing) * 24)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-100{z-index:100}.z-1010{z-index:1010}.z-1015{z-index:1015}.col-span-12{grid-column:span 12/span 12}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing) * 0)}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-0\.5{margin-inline:calc(var(--spacing) * .5)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing) * 1)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.-mb-px{margin-bottom:-1px}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-0{margin-left:calc(var(--spacing) * 0)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-5{margin-left:calc(var(--spacing) * 5)}.ml-auto{margin-left:auto}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1{height:calc(var(--spacing) * 1)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-5\.5{height:calc(var(--spacing) * 5.5)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-\[60vh\]{max-height:60vh}.max-h-\[85vh\]{max-height:85vh}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-20{min-height:calc(var(--spacing) * 20)}.min-h-32{min-height:calc(var(--spacing) * 32)}.min-h-52{min-height:calc(var(--spacing) * 52)}.min-h-full{min-height:100%}.w-0{width:calc(var(--spacing) * 0)}.w-1\/2{width:50%}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-52{width:calc(var(--spacing) * 52)}.w-56{width:calc(var(--spacing) * 56)}.w-60{width:calc(var(--spacing) * 60)}.w-72{width:calc(var(--spacing) * 72)}.w-80{width:calc(var(--spacing) * 80)}.w-\[min\(560px\,95vw\)\]{width:min(560px,95vw)}.w-\[min\(960px\,95vw\)\]{width:min(960px,95vw)}.w-auto{width:auto}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-400{max-width:calc(var(--spacing) * 400)}.max-w-\[calc\(100vw-3rem\)\]{max-width:calc(100vw - 3rem)}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-26{min-width:calc(var(--spacing) * 26)}.min-w-32{min-width:calc(var(--spacing) * 32)}.min-w-40{min-width:calc(var(--spacing) * 40)}.min-w-44{min-width:calc(var(--spacing) * 44)}.min-w-48{min-width:calc(var(--spacing) * 48)}.min-w-55{min-width:calc(var(--spacing) * 55)}.min-w-64{min-width:calc(var(--spacing) * 64)}.min-w-\[10rem\]{min-width:10rem}.flex-1{flex:1}.flex-\[2\]{flex:2}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-grab{cursor:grab}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.scroll-mt-24{scroll-margin-top:calc(var(--spacing) * 24)}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-12>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 12) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 12) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-1{column-gap:calc(var(--spacing) * 1)}.gap-x-1\.5{column-gap:calc(var(--spacing) * 1.5)}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:calc(var(--spacing) * 1)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-emerald-100>:not(:last-child)){border-color:var(--color-emerald-100)}:where(.divide-neutral-100>:not(:last-child)){border-color:var(--color-neutral-100)}:where(.divide-neutral-200>:not(:last-child)){border-color:var(--color-neutral-200)}:where(.divide-slate-100>:not(:last-child)){border-color:var(--color-slate-100)}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-300{border-color:var(--color-amber-300)}.border-amber-400{border-color:var(--color-amber-400)}.border-brand-200{border-color:var(--color-brand-200)}.border-brand-300{border-color:var(--color-brand-300)}.border-brand-400{border-color:var(--color-brand-400)}.border-brand-500{border-color:var(--color-brand-500)}.border-brand-600{border-color:var(--color-brand-600)}.border-brand-700{border-color:var(--color-brand-700)}.border-cyan-100{border-color:var(--color-cyan-100)}.border-cyan-200{border-color:var(--color-cyan-200)}.border-emerald-100{border-color:var(--color-emerald-100)}.border-emerald-200{border-color:var(--color-emerald-200)}.border-hairline{border-color:var(--color-hairline)}.border-neutral-100{border-color:var(--color-neutral-100)}.border-neutral-200{border-color:var(--color-neutral-200)}.border-neutral-300{border-color:var(--color-neutral-300)}.border-red-200{border-color:var(--color-red-200)}.border-red-300{border-color:var(--color-red-300)}.border-sky-200{border-color:var(--color-sky-200)}.border-sky-300{border-color:var(--color-sky-300)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-300{border-color:var(--color-slate-300)}.border-slate-800{border-color:var(--color-slate-800)}.border-slate-900{border-color:var(--color-slate-900)}.border-transparent{border-color:#0000}.border-violet-200{border-color:var(--color-violet-200)}.border-white{border-color:var(--color-white)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-50\/40{background-color:#fffbeb66}@supports (color:color-mix(in lab, red, red)){.bg-amber-50\/40{background-color:color-mix(in oklab, var(--color-amber-50) 40%, transparent)}}.bg-amber-50\/50{background-color:#fffbeb80}@supports (color:color-mix(in lab, red, red)){.bg-amber-50\/50{background-color:color-mix(in oklab, var(--color-amber-50) 50%, transparent)}}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-600{background-color:var(--color-amber-600)}.bg-brand-50{background-color:var(--color-brand-50)}.bg-brand-50\/40{background-color:#ecfeff66}@supports (color:color-mix(in lab, red, red)){.bg-brand-50\/40{background-color:color-mix(in oklab, var(--color-brand-50) 40%, transparent)}}.bg-brand-50\/60{background-color:#ecfeff99}@supports (color:color-mix(in lab, red, red)){.bg-brand-50\/60{background-color:color-mix(in oklab, var(--color-brand-50) 60%, transparent)}}.bg-brand-100{background-color:var(--color-brand-100)}.bg-brand-600{background-color:var(--color-brand-600)}.bg-brand-700{background-color:var(--color-brand-700)}.bg-brand-800{background-color:var(--color-brand-800)}.bg-canvas\/95{background-color:#f8fafcf2}@supports (color:color-mix(in lab, red, red)){.bg-canvas\/95{background-color:color-mix(in oklab, var(--color-canvas) 95%, transparent)}}.bg-cyan-50{background-color:var(--color-cyan-50)}.bg-cyan-50\/40{background-color:#ecfeff66}@supports (color:color-mix(in lab, red, red)){.bg-cyan-50\/40{background-color:color-mix(in oklab, var(--color-cyan-50) 40%, transparent)}}.bg-cyan-50\/60{background-color:#ecfeff99}@supports (color:color-mix(in lab, red, red)){.bg-cyan-50\/60{background-color:color-mix(in oklab, var(--color-cyan-50) 60%, transparent)}}.bg-cyan-100{background-color:var(--color-cyan-100)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-50\/30{background-color:#ecfdf54d}@supports (color:color-mix(in lab, red, red)){.bg-emerald-50\/30{background-color:color-mix(in oklab, var(--color-emerald-50) 30%, transparent)}}.bg-emerald-50\/50{background-color:#ecfdf580}@supports (color:color-mix(in lab, red, red)){.bg-emerald-50\/50{background-color:color-mix(in oklab, var(--color-emerald-50) 50%, transparent)}}.bg-emerald-50\/70{background-color:#ecfdf5b3}@supports (color:color-mix(in lab, red, red)){.bg-emerald-50\/70{background-color:color-mix(in oklab, var(--color-emerald-50) 70%, transparent)}}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-emerald-100\/80{background-color:#d0fae5cc}@supports (color:color-mix(in lab, red, red)){.bg-emerald-100\/80{background-color:color-mix(in oklab, var(--color-emerald-100) 80%, transparent)}}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-600{background-color:var(--color-emerald-600)}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-neutral-50{background-color:var(--color-neutral-50)}.bg-neutral-50\/40{background-color:#fafafa66}@supports (color:color-mix(in lab, red, red)){.bg-neutral-50\/40{background-color:color-mix(in oklab, var(--color-neutral-50) 40%, transparent)}}.bg-neutral-50\/50{background-color:#fafafa80}@supports (color:color-mix(in lab, red, red)){.bg-neutral-50\/50{background-color:color-mix(in oklab, var(--color-neutral-50) 50%, transparent)}}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-neutral-200{background-color:var(--color-neutral-200)}.bg-neutral-900{background-color:var(--color-neutral-900)}.bg-orange-100{background-color:var(--color-orange-100)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-600{background-color:var(--color-rose-600)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-sky-100{background-color:var(--color-sky-100)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-50\/30{background-color:#f8fafc4d}@supports (color:color-mix(in lab, red, red)){.bg-slate-50\/30{background-color:color-mix(in oklab, var(--color-slate-50) 30%, transparent)}}.bg-slate-50\/40{background-color:#f8fafc66}@supports (color:color-mix(in lab, red, red)){.bg-slate-50\/40{background-color:color-mix(in oklab, var(--color-slate-50) 40%, transparent)}}.bg-slate-50\/50{background-color:#f8fafc80}@supports (color:color-mix(in lab, red, red)){.bg-slate-50\/50{background-color:color-mix(in oklab, var(--color-slate-50) 50%, transparent)}}.bg-slate-50\/60{background-color:#f8fafc99}@supports (color:color-mix(in lab, red, red)){.bg-slate-50\/60{background-color:color-mix(in oklab, var(--color-slate-50) 60%, transparent)}}.bg-slate-50\/70{background-color:#f8fafcb3}@supports (color:color-mix(in lab, red, red)){.bg-slate-50\/70{background-color:color-mix(in oklab, var(--color-slate-50) 70%, transparent)}}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-200{background-color:var(--color-slate-200)}.bg-slate-200\/80{background-color:#e2e8f0cc}@supports (color:color-mix(in lab, red, red)){.bg-slate-200\/80{background-color:color-mix(in oklab, var(--color-slate-200) 80%, transparent)}}.bg-slate-300\/70{background-color:#cad5e2b3}@supports (color:color-mix(in lab, red, red)){.bg-slate-300\/70{background-color:color-mix(in oklab, var(--color-slate-300) 70%, transparent)}}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-950{background-color:var(--color-slate-950)}.bg-slate-950\/30{background-color:#0206184d}@supports (color:color-mix(in lab, red, red)){.bg-slate-950\/30{background-color:color-mix(in oklab, var(--color-slate-950) 30%, transparent)}}.bg-slate-950\/40{background-color:#02061866}@supports (color:color-mix(in lab, red, red)){.bg-slate-950\/40{background-color:color-mix(in oklab, var(--color-slate-950) 40%, transparent)}}.bg-slate-950\/55{background-color:#0206188c}@supports (color:color-mix(in lab, red, red)){.bg-slate-950\/55{background-color:color-mix(in oklab, var(--color-slate-950) 55%, transparent)}}.bg-teal-100{background-color:var(--color-teal-100)}.bg-teal-200{background-color:var(--color-teal-200)}.bg-transparent{background-color:#0000}.bg-violet-50{background-color:var(--color-violet-50)}.bg-violet-50\/50{background-color:#f5f3ff80}@supports (color:color-mix(in lab, red, red)){.bg-violet-50\/50{background-color:color-mix(in oklab, var(--color-violet-50) 50%, transparent)}}.bg-violet-100{background-color:var(--color-violet-100)}.bg-violet-100\/70{background-color:#ede9feb3}@supports (color:color-mix(in lab, red, red)){.bg-violet-100\/70{background-color:color-mix(in oklab, var(--color-violet-100) 70%, transparent)}}.bg-white{background-color:var(--color-white)}.bg-white\/70{background-color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.bg-white\/70{background-color:color-mix(in oklab, var(--color-white) 70%, transparent)}}.bg-white\/80{background-color:#fffc}@supports (color:color-mix(in lab, red, red)){.bg-white\/80{background-color:color-mix(in oklab, var(--color-white) 80%, transparent)}}.bg-white\/95{background-color:#fffffff2}@supports (color:color-mix(in lab, red, red)){.bg-white\/95{background-color:color-mix(in oklab, var(--color-white) 95%, transparent)}}.bg-linear-to-br{--tw-gradient-position:to bottom right}@supports (background-image:linear-gradient(in lab, red, red)){.bg-linear-to-br{--tw-gradient-position:to bottom right in oklab}}.bg-linear-to-br{background-image:linear-gradient(var(--tw-gradient-stops))}.bg-linear-to-r{--tw-gradient-position:to right}@supports (background-image:linear-gradient(in lab, red, red)){.bg-linear-to-r{--tw-gradient-position:to right in oklab}}.bg-linear-to-r{background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-\[linear-gradient\(180deg\,\#f0fdfa_0\%\,\#f8fafc_220px\,\#f8fafc_100\%\)\]{background-image:linear-gradient(#f0fdfa 0%,#f8fafc 220px 100%)}.from-amber-400{--tw-gradient-from:var(--color-amber-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-brand-500{--tw-gradient-from:var(--color-brand-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-brand-600{--tw-gradient-from:var(--color-brand-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-emerald-400{--tw-gradient-from:var(--color-emerald-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-red-400{--tw-gradient-from:var(--color-red-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.via-brand-coral{--tw-gradient-via:var(--color-brand-coral);--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-brand-mint{--tw-gradient-via:var(--color-brand-mint);--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-brand-ochre{--tw-gradient-via:var(--color-brand-ochre);--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-brand-500{--tw-gradient-to:var(--color-brand-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-brand-800{--tw-gradient-to:var(--color-brand-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-brand-peach{--tw-gradient-to:var(--color-brand-peach);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-brand-pink{--tw-gradient-to:var(--color-brand-pink);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-violet-400{--tw-gradient-to:var(--color-violet-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-0{padding:calc(var(--spacing) * 0)}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-7{padding-inline:calc(var(--spacing) * 7)}.py-0{padding-block:calc(var(--spacing) * 0)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-24{padding-block:calc(var(--spacing) * 24)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pt-7{padding-top:calc(var(--spacing) * 7)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pl-1{padding-left:calc(var(--spacing) * 1)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-5{padding-left:calc(var(--spacing) * 5)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-brand{font-family:var(--font-brand)}.font-grotesk{font-family:var(--font-grotesk)}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-brand-700{color:var(--color-brand-700)}.text-brand-800{color:var(--color-brand-800)}.text-brand-900{color:var(--color-brand-900)}.text-cyan-800{color:var(--color-cyan-800)}.text-emerald-500{color:var(--color-emerald-500)}.text-emerald-600{color:var(--color-emerald-600)}.text-emerald-700{color:var(--color-emerald-700)}.text-emerald-800{color:var(--color-emerald-800)}.text-emerald-900{color:var(--color-emerald-900)}.text-indigo-800{color:var(--color-indigo-800)}.text-ink{color:var(--color-ink)}.text-neutral-100{color:var(--color-neutral-100)}.text-neutral-400{color:var(--color-neutral-400)}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-600{color:var(--color-neutral-600)}.text-neutral-700{color:var(--color-neutral-700)}.text-neutral-800{color:var(--color-neutral-800)}.text-neutral-900{color:var(--color-neutral-900)}.text-orange-800{color:var(--color-orange-800)}.text-purple-700{color:var(--color-purple-700)}.text-purple-800{color:var(--color-purple-800)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-red-900{color:var(--color-red-900)}.text-rose-500{color:var(--color-rose-500)}.text-rose-600{color:var(--color-rose-600)}.text-rose-600\/80{color:#e70044cc}@supports (color:color-mix(in lab, red, red)){.text-rose-600\/80{color:color-mix(in oklab, var(--color-rose-600) 80%, transparent)}}.text-rose-700{color:var(--color-rose-700)}.text-sky-600{color:var(--color-sky-600)}.text-sky-700{color:var(--color-sky-700)}.text-sky-800{color:var(--color-sky-800)}.text-sky-900{color:var(--color-sky-900)}.text-slate-100{color:var(--color-slate-100)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-slate-950{color:var(--color-slate-950)}.text-teal-800{color:var(--color-teal-800)}.text-teal-900{color:var(--color-teal-900)}.text-violet-600{color:var(--color-violet-600)}.text-violet-700{color:var(--color-violet-700)}.text-violet-800{color:var(--color-violet-800)}.text-violet-900{color:var(--color-violet-900)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.accent-amber-600{accent-color:var(--color-amber-600)}.accent-brand-700{accent-color:var(--color-brand-700)}.accent-emerald-600{accent-color:var(--color-emerald-600)}.accent-rose-600{accent-color:var(--color-rose-600)}.accent-slate-700{accent-color:var(--color-slate-700)}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_4px_8px_-2px_rgba\(15\,23\,42\,0\.08\)\]{--tw-shadow:0 4px 8px -2px var(--tw-shadow-color,#0f172a14);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-4{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-cyan-950\/5{--tw-shadow-color:#0533450d}@supports (color:color-mix(in lab, red, red)){.shadow-cyan-950\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-cyan-950) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-slate-950\/5{--tw-shadow-color:#0206180d}@supports (color:color-mix(in lab, red, red)){.shadow-slate-950\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-slate-950) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-slate-950\/10{--tw-shadow-color:#0206181a}@supports (color:color-mix(in lab, red, red)){.shadow-slate-950\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-slate-950) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-slate-950\/20{--tw-shadow-color:#02061833}@supports (color:color-mix(in lab, red, red)){.shadow-slate-950\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-slate-950) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-slate-950\/30{--tw-shadow-color:#0206184d}@supports (color:color-mix(in lab, red, red)){.shadow-slate-950\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-slate-950) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-brand-100{--tw-ring-color:var(--color-brand-100)}.ring-brand-200{--tw-ring-color:var(--color-brand-200)}.ring-brand-300{--tw-ring-color:var(--color-brand-300)}.ring-brand-400{--tw-ring-color:var(--color-brand-400)}.ring-emerald-200\/70{--tw-ring-color:#a4f4cfb3}@supports (color:color-mix(in lab, red, red)){.ring-emerald-200\/70{--tw-ring-color:color-mix(in oklab, var(--color-emerald-200) 70%, transparent)}}.ring-hairline{--tw-ring-color:var(--color-hairline)}.ring-slate-200{--tw-ring-color:var(--color-slate-200)}.ring-transparent{--tw-ring-color:transparent}.ring-white{--tw-ring-color:var(--color-white)}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.ring-offset-transparent{--tw-ring-offset-color:transparent}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[top\,left\,bottom\,right\]{transition-property:top,left,bottom,right;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,background-color\]{transition-property:width,background-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.ring-inset{--tw-ring-inset:inset}.group-focus-within\:opacity-100:is(:where(.group):focus-within *){opacity:1}@media (hover:hover){.group-hover\:translate-x-1:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:bg-brand-100:is(:where(.group):hover *){background-color:var(--color-brand-100)}.group-hover\:bg-emerald-100:is(:where(.group):hover *){background-color:var(--color-emerald-100)}.group-hover\:bg-slate-300\/80:is(:where(.group):hover *){background-color:#cad5e2cc}@supports (color:color-mix(in lab, red, red)){.group-hover\:bg-slate-300\/80:is(:where(.group):hover *){background-color:color-mix(in oklab, var(--color-slate-300) 80%, transparent)}}.group-hover\:text-brand-800:is(:where(.group):hover *){color:var(--color-brand-800)}.group-hover\:text-brand-900:is(:where(.group):hover *){color:var(--color-brand-900)}.group-hover\:text-emerald-800:is(:where(.group):hover *){color:var(--color-emerald-800)}.group-hover\:text-slate-500:is(:where(.group):hover *){color:var(--color-slate-500)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\/chip\:w-5:is(:where(.group\/chip):hover *){width:calc(var(--spacing) * 5)}.group-hover\/chip\:opacity-100:is(:where(.group\/chip):hover *){opacity:1}}.placeholder\:text-slate-400::placeholder{color:var(--color-slate-400)}.backdrop\:bg-slate-950\/40::backdrop{background-color:#02061866}@supports (color:color-mix(in lab, red, red)){.backdrop\:bg-slate-950\/40::backdrop{background-color:color-mix(in oklab, var(--color-slate-950) 40%, transparent)}}.backdrop\:backdrop-blur-sm::backdrop{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.last\:mb-0:last-child{margin-bottom:calc(var(--spacing) * 0)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.focus-within\:border-cyan-300:focus-within{border-color:var(--color-cyan-300)}@media (hover:hover){.hover\:-translate-y-0\.5:hover{--tw-translate-y:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:border-brand-300:hover{border-color:var(--color-brand-300)}.hover\:border-brand-400:hover{border-color:var(--color-brand-400)}.hover\:border-brand-500:hover{border-color:var(--color-brand-500)}.hover\:border-cyan-200:hover{border-color:var(--color-cyan-200)}.hover\:border-emerald-200:hover{border-color:var(--color-emerald-200)}.hover\:border-hairline:hover{border-color:var(--color-hairline)}.hover\:border-slate-300:hover{border-color:var(--color-slate-300)}.hover\:border-slate-400:hover{border-color:var(--color-slate-400)}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-amber-500:hover{background-color:var(--color-amber-500)}.hover\:bg-brand-50:hover{background-color:var(--color-brand-50)}.hover\:bg-brand-100:hover{background-color:var(--color-brand-100)}.hover\:bg-brand-600:hover{background-color:var(--color-brand-600)}.hover\:bg-brand-700:hover{background-color:var(--color-brand-700)}.hover\:bg-brand-800:hover{background-color:var(--color-brand-800)}.hover\:bg-brand-900:hover{background-color:var(--color-brand-900)}.hover\:bg-cyan-50:hover{background-color:var(--color-cyan-50)}.hover\:bg-cyan-50\/20:hover{background-color:#ecfeff33}@supports (color:color-mix(in lab, red, red)){.hover\:bg-cyan-50\/20:hover{background-color:color-mix(in oklab, var(--color-cyan-50) 20%, transparent)}}.hover\:bg-cyan-50\/40:hover{background-color:#ecfeff66}@supports (color:color-mix(in lab, red, red)){.hover\:bg-cyan-50\/40:hover{background-color:color-mix(in oklab, var(--color-cyan-50) 40%, transparent)}}.hover\:bg-emerald-500:hover{background-color:var(--color-emerald-500)}.hover\:bg-neutral-50:hover{background-color:var(--color-neutral-50)}.hover\:bg-neutral-100:hover{background-color:var(--color-neutral-100)}.hover\:bg-neutral-200:hover{background-color:var(--color-neutral-200)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-100:hover{background-color:var(--color-red-100)}.hover\:bg-red-100\!:hover{background-color:var(--color-red-100)!important}.hover\:bg-rose-50:hover{background-color:var(--color-rose-50)}.hover\:bg-rose-500:hover{background-color:var(--color-rose-500)}.hover\:bg-sky-50:hover{background-color:var(--color-sky-50)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-200\/60:hover{background-color:#e2e8f099}@supports (color:color-mix(in lab, red, red)){.hover\:bg-slate-200\/60:hover{background-color:color-mix(in oklab, var(--color-slate-200) 60%, transparent)}}.hover\:bg-slate-800:hover{background-color:var(--color-slate-800)}.hover\:bg-violet-50:hover{background-color:var(--color-violet-50)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-white\/70:hover{background-color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/70:hover{background-color:color-mix(in oklab, var(--color-white) 70%, transparent)}}.hover\:from-brand-500:hover{--tw-gradient-from:var(--color-brand-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.hover\:to-brand-700:hover{--tw-gradient-to:var(--color-brand-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.hover\:text-brand-700:hover{color:var(--color-brand-700)}.hover\:text-brand-800:hover{color:var(--color-brand-800)}.hover\:text-brand-900:hover{color:var(--color-brand-900)}.hover\:text-neutral-700:hover{color:var(--color-neutral-700)}.hover\:text-neutral-900:hover{color:var(--color-neutral-900)}.hover\:text-red-600:hover{color:var(--color-red-600)}.hover\:text-red-700:hover{color:var(--color-red-700)}.hover\:text-red-700\!:hover{color:var(--color-red-700)!important}.hover\:text-rose-800:hover{color:var(--color-rose-800)}.hover\:text-slate-700:hover{color:var(--color-slate-700)}.hover\:text-slate-800:hover{color:var(--color-slate-800)}.hover\:text-slate-900:hover{color:var(--color-slate-900)}.hover\:text-slate-950:hover{color:var(--color-slate-950)}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.hover\:shadow-cyan-950\/10:hover{--tw-shadow-color:#0533451a}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-cyan-950\/10:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-cyan-950) 10%, transparent) var(--tw-shadow-alpha), transparent)}}}.focus\:border-brand-500:focus{border-color:var(--color-brand-500)}.focus\:border-brand-700:focus{border-color:var(--color-brand-700)}.focus\:border-slate-900:focus{border-color:var(--color-slate-900)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-amber-300:focus{--tw-ring-color:var(--color-amber-300)}.focus\:ring-brand-100:focus{--tw-ring-color:var(--color-brand-100)}.focus\:ring-brand-300:focus{--tw-ring-color:var(--color-brand-300)}.focus\:ring-brand-400:focus{--tw-ring-color:var(--color-brand-400)}.focus\:ring-slate-900:focus{--tw-ring-color:var(--color-slate-900)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-brand-300:focus-visible{--tw-ring-color:var(--color-brand-300)}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:cursor-wait:disabled{cursor:wait}.disabled\:bg-slate-300:disabled{background-color:var(--color-slate-300)}.disabled\:opacity-0:disabled{opacity:0}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-70:disabled{opacity:.7}@media (hover:hover){.group-hover\:disabled\:opacity-30:is(:where(.group):hover *):disabled{opacity:.3}.disabled\:hover\:bg-transparent:disabled:hover{background-color:#0000}.disabled\:hover\:text-neutral-600:disabled:hover{color:var(--color-neutral-600)}}@media (prefers-reduced-motion:reduce){.motion-reduce\:animate-none\!{animation:none!important}.motion-reduce\:opacity-100\!{opacity:1!important}}@media (width>=40rem){.sm\:inline-block{display:inline-block}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:justify-between{justify-content:space-between}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}}@media (width>=48rem){.md\:grid-cols-\[1fr_1\.4fr_auto\]{grid-template-columns:1fr 1.4fr auto}.md\:grid-cols-\[1fr_1\.6fr_auto\]{grid-template-columns:1fr 1.6fr auto}.md\:items-end{align-items:flex-end}}@media (width>=64rem){.lg\:sticky{position:sticky}.lg\:top-32{top:calc(var(--spacing) * 32)}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:col-span-9{grid-column:span 9/span 9}.lg\:max-h-\[calc\(100vh-8rem\)\]{max-height:calc(100vh - 8rem)}.lg\:w-12{width:calc(var(--spacing) * 12)}.lg\:w-80{width:calc(var(--spacing) * 80)}.lg\:w-88{width:calc(var(--spacing) * 88)}.lg\:w-\[16rem\]{width:16rem}.lg\:w-\[34rem\]{width:34rem}.lg\:w-\[42rem\]{width:42rem}.lg\:flex-1{flex:1}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:items-end{align-items:flex-end}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:overflow-y-auto{overflow-y:auto}}@media (width>=80rem){.xl\:w-104{width:calc(var(--spacing) * 104)}.xl\:w-\[18rem\]{width:18rem}}}html,body{font-family:var(--font-sans);color:#0f172a;background:#f8fafc}.mono{font-family:var(--font-mono)}@keyframes focus-flash{0%{background-color:#cffafe8c;box-shadow:0 0 #0891b280}60%{background-color:#cffafe40;box-shadow:0 0 0 8px #0891b200}to{background-color:#0000;box-shadow:0 0 #7c3aed00}}.focus-flash{border-radius:.5rem;animation:1.6s ease-out focus-flash}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
@@ -0,0 +1,2 @@
1
+ import{$ as e,L as t,Q as n,Z as r,lt as i,tt as a}from"./DF6QYH3p.js";import{f as o,nt as s,t as c}from"./Bs86lft6.js";import{n as l,r as u,t as d}from"./CM7d6DM1.js";var f=new class{#e=e(!0);get loading(){return t(this.#e)}set loading(e){n(this.#e,e,!0)}#t=e(null);get feature(){return t(this.#t)}set feature(e){n(this.#t,e,!0)}#n=e(null);get error(){return t(this.#n)}set error(e){n(this.#n,e,!0)}#r=e(null);get saveError(){return t(this.#r)}set saveError(e){n(this.#r,e,!0)}#i=e(!1);get saving(){return t(this.#i)}set saving(e){n(this.#i,e,!0)}#a=e(r([]));get historyEntries(){return t(this.#a)}set historyEntries(e){n(this.#a,e,!0)}#o=e(-1);get historyCursor(){return t(this.#o)}set historyCursor(e){n(this.#o,e,!0)}#s=a(()=>this.historyCursor>0);get canUndo(){return t(this.#s)}set canUndo(e){n(this.#s,e)}#c=a(()=>this.historyCursor>=0&&this.historyCursor<this.historyEntries.length-1);get canRedo(){return t(this.#c)}set canRedo(e){n(this.#c,e)}currentId=null;client=null;clientUnsubscribe=null;historyUnsubscribe=null;async load(e){try{this.loading=!0,this.error=null,this.currentId=e;let t=await(await c()).useCases.getFeature(e);this.feature=t,this.subscribeRoom(e)}catch(e){this.error=e.message}finally{this.loading=!1}}async mutate(e){if(!this.feature||!this.currentId)return;let t=i(this.feature),n=e(t),r=n===t?t:d(n);if(this.applyNext(r),this.client){this.saving=!0,this.saveError=null;try{this.client.setSnapshot(r),s(`feature.saved`,{id:String(r.id),name:r.name})}catch(e){e instanceof o&&e.errors.length>0?this.saveError=`${e.message}\n• ${e.errors.join(`
2
+ • `)}`:this.saveError=e.message}finally{this.saving=!1}}}dismissSaveError(){this.saveError=null}reset(){this.clientUnsubscribe&&=(this.clientUnsubscribe(),null),this.historyUnsubscribe&&=(this.historyUnsubscribe(),null),this.client=null,this.currentId=null,this.feature=null,this.error=null,this.saveError=null,this.loading=!0,this.saving=!1,this.historyEntries=[],this.historyCursor=-1}undo(){this.client?.undo()}redo(){this.client?.redo()}jumpToHistory(e){this.client?.jumpTo(e)}clearHistory(){this.client?.clearHistory()}subscribeRoom(e){this.clientUnsubscribe&&=(this.clientUnsubscribe(),null),this.historyUnsubscribe&&=(this.historyUnsubscribe(),null);let t=u(`feature`,e);this.client=t,this.clientUnsubscribe=t.observe((t,n)=>{n!==`local`&&t&&this.currentId===e&&this.applyNext(t)}),this.historyEntries=t.history.entries,this.historyCursor=t.history.cursor,this.historyUnsubscribe=t.observeHistory(t=>{this.currentId===e&&(this.historyEntries=t.entries,this.historyCursor=t.cursor)})}applyNext(e){if(!this.feature){this.feature=e;return}l(this.feature,e)}};export{f as t};
@@ -1 +1 @@
1
- import{D as e,E as t,M as n}from"./ChWRqgym.js";var r=(e,t)=>{let r=t;for(let t of e.stateOverrides)r=n(r,t.path,t.value);return r},i=(e,t,n)=>{let r={},i=new Set(t.parameters.map(e=>e.name));for(let t of e.parameterOverrides)i.has(t.parameterName)&&(r[t.parameterName]=t.value);return{...r,...n}},a=(e,t)=>{let r=t;for(let t of e.stateOverrides)r=n(r,t.path,t.value);return r},o=(e,t,n)=>{let r={},i=new Set(t.parameters.map(e=>e.name));for(let t of e.parameterOverrides)i.has(t.parameterName)&&(r[t.parameterName]=t.value);return{...r,...n}},s=e=>({path:e,stateDefinitions:0,parameterBindings:0,parameterResources:0,actionRequiredStates:0,ruleConditions:0,setStateEffects:0,invariantConditions:0,personaStateOverrides:0,otherDataFields:0}),c=(e,t)=>e===t,l=(n,r)=>{if(!t(n))return 0;let i=n;switch(i.kind){case`literal`:return 0;case`param`:return 0;case`state`:return+(String(i.path)===r);case`neg`:case`not`:case`sum`:case`count`:case`sum_pluck`:return l(i.operand,r);case`count_where`:return l(i.operand,r)+l(i.equals,r);case`switch`:{let t=0;for(let n of i.cases){for(let i of e(n.when))c(String(i.left),r)&&(t+=1),t+=l(i.right,r);t+=l(n.then,r)}return t+=l(i.default,r),t}case`add`:case`sub`:case`mul`:case`div`:case`mod`:case`min`:case`max`:return l(i.left,r)+l(i.right,r)}},u=(t,n)=>{let r=0;for(let i of e(t))c(String(i.left),n)&&(r+=1),r+=l(i.right,n);return r},d=(e,t)=>{let n=String(t),r={...s(t)};for(let t of e.surfaces){for(let e of t.stateDefinitions)c(String(e.path),n)&&(r.stateDefinitions+=1);for(let e of t.actions){for(let t of e.requiredStates)c(String(t),n)&&(r.actionRequiredStates+=1);for(let t of e.parameters)c(t.bindToStatePath?String(t.bindToStatePath):void 0,n)&&(r.parameterBindings+=1);for(let t of e.rules)r.ruleConditions+=u(t.condition,n),t.effect.type===`set_state`&&(c(String(t.effect.path),n)&&(r.setStateEffects+=1),r.setStateEffects+=l(t.effect.value,n));for(let t of e.effects)t.type===`set_state`&&(c(String(t.path),n)&&(r.setStateEffects+=1),r.setStateEffects+=l(t.value,n));for(let t of e.invariants)r.invariantConditions+=u(t.condition,n)}for(let e of t.rules)r.ruleConditions+=u(e.condition,n),e.effect.type===`set_state`&&(c(String(e.effect.path),n)&&(r.setStateEffects+=1),r.setStateEffects+=l(e.effect.value,n));for(let e of t.invariants)r.invariantConditions+=u(e.condition,n)}for(let t of e.personas)for(let e of t.stateOverrides)c(String(e.path),n)&&(r.personaStateOverrides+=1);for(let t of e.entities)for(let e of t.fields)c(e.path?String(e.path):void 0,n)&&(r.otherDataFields+=1);return r},f=e=>e.stateDefinitions+e.parameterBindings+e.parameterResources+e.actionRequiredStates+e.ruleConditions+e.setStateEffects+e.invariantConditions+e.personaStateOverrides+e.otherDataFields,p=e=>{let t=[],n=(e,n)=>{e>0&&t.push(`${e} ${n}`)};return n(e.stateDefinitions,e.stateDefinitions===1?`state definition`:`state definitions`),n(e.ruleConditions,e.ruleConditions===1?`rule condition`:`rule conditions`),n(e.setStateEffects,e.setStateEffects===1?`set_state effect`:`set_state effects`),n(e.parameterBindings,e.parameterBindings===1?`parameter binding`:`parameter bindings`),n(e.actionRequiredStates,e.actionRequiredStates===1?`action requirement`:`action requirements`),n(e.invariantConditions,e.invariantConditions===1?`invariant`:`invariants`),n(e.personaStateOverrides,e.personaStateOverrides===1?`persona override`:`persona overrides`),n(e.otherDataFields,e.otherDataFields===1?`data field`:`data fields`),t.join(`, `)};export{a,o as i,p as n,i as o,f as r,r as s,d as t};
1
+ import{D as e,E as t,N as n}from"./Bs86lft6.js";var r=(e,t)=>{let r=t;for(let t of e.stateOverrides)r=n(r,t.path,t.value);return r},i=(e,t,n)=>{let r={},i=new Set(t.parameters.map(e=>e.name));for(let t of e.parameterOverrides)i.has(t.parameterName)&&(r[t.parameterName]=t.value);return{...r,...n}},a=(e,t)=>{let r=t;for(let t of e.stateOverrides)r=n(r,t.path,t.value);return r},o=(e,t,n)=>{let r={},i=new Set(t.parameters.map(e=>e.name));for(let t of e.parameterOverrides)i.has(t.parameterName)&&(r[t.parameterName]=t.value);return{...r,...n}},s=e=>({path:e,stateDefinitions:0,parameterBindings:0,parameterResources:0,actionRequiredStates:0,ruleConditions:0,setStateEffects:0,invariantConditions:0,personaStateOverrides:0,otherDataFields:0}),c=(e,t)=>e===t,l=(n,r)=>{if(!t(n))return 0;let i=n;switch(i.kind){case`literal`:return 0;case`param`:return 0;case`state`:return+(String(i.path)===r);case`neg`:case`not`:case`sum`:case`count`:case`sum_pluck`:return l(i.operand,r);case`count_where`:return l(i.operand,r)+l(i.equals,r);case`switch`:{let t=0;for(let n of i.cases){for(let i of e(n.when))c(String(i.left),r)&&(t+=1),t+=l(i.right,r);t+=l(n.then,r)}return t+=l(i.default,r),t}case`add`:case`sub`:case`mul`:case`div`:case`mod`:case`min`:case`max`:return l(i.left,r)+l(i.right,r)}},u=(t,n)=>{let r=0;for(let i of e(t))c(String(i.left),n)&&(r+=1),r+=l(i.right,n);return r},d=(e,t)=>{let n=String(t),r={...s(t)};for(let t of e.surfaces){for(let e of t.stateDefinitions)c(String(e.path),n)&&(r.stateDefinitions+=1);for(let e of t.actions){for(let t of e.requiredStates)c(String(t),n)&&(r.actionRequiredStates+=1);for(let t of e.parameters)c(t.bindToStatePath?String(t.bindToStatePath):void 0,n)&&(r.parameterBindings+=1);for(let t of e.rules)r.ruleConditions+=u(t.condition,n),t.effect.type===`set_state`&&(c(String(t.effect.path),n)&&(r.setStateEffects+=1),r.setStateEffects+=l(t.effect.value,n));for(let t of e.effects)t.type===`set_state`&&(c(String(t.path),n)&&(r.setStateEffects+=1),r.setStateEffects+=l(t.value,n));for(let t of e.invariants)r.invariantConditions+=u(t.condition,n)}for(let e of t.rules)r.ruleConditions+=u(e.condition,n),e.effect.type===`set_state`&&(c(String(e.effect.path),n)&&(r.setStateEffects+=1),r.setStateEffects+=l(e.effect.value,n));for(let e of t.invariants)r.invariantConditions+=u(e.condition,n)}for(let t of e.personas)for(let e of t.stateOverrides)c(String(e.path),n)&&(r.personaStateOverrides+=1);for(let t of e.entities)for(let e of t.fields)c(e.path?String(e.path):void 0,n)&&(r.otherDataFields+=1);return r},f=e=>e.stateDefinitions+e.parameterBindings+e.parameterResources+e.actionRequiredStates+e.ruleConditions+e.setStateEffects+e.invariantConditions+e.personaStateOverrides+e.otherDataFields,p=e=>{let t=[],n=(e,n)=>{e>0&&t.push(`${e} ${n}`)};return n(e.stateDefinitions,e.stateDefinitions===1?`state definition`:`state definitions`),n(e.ruleConditions,e.ruleConditions===1?`rule condition`:`rule conditions`),n(e.setStateEffects,e.setStateEffects===1?`set_state effect`:`set_state effects`),n(e.parameterBindings,e.parameterBindings===1?`parameter binding`:`parameter bindings`),n(e.actionRequiredStates,e.actionRequiredStates===1?`action requirement`:`action requirements`),n(e.invariantConditions,e.invariantConditions===1?`invariant`:`invariants`),n(e.personaStateOverrides,e.personaStateOverrides===1?`persona override`:`persona overrides`),n(e.otherDataFields,e.otherDataFields===1?`data field`:`data fields`),t.join(`, `)};export{a,o as i,p as n,i as o,f as r,r as s,d as t};
@@ -1 +1 @@
1
- import{tt as e}from"./ChWRqgym.js";var t=null,n=new Set,r=()=>{if(t)return;let r=e.token,i=r.length>0?`/api/sync/events?token=${encodeURIComponent(r)}`:`/api/sync/events`;t=new EventSource(i),t.addEventListener(`sync`,e=>{let t;try{t=JSON.parse(e.data)}catch{return}for(let e of n)try{e(t)}catch{}})},i=e=>(r(),n.add(e),()=>{n.delete(e)});export{i as t};
1
+ import{it as e}from"./Bs86lft6.js";var t=null,n=new Set,r=()=>{if(t)return;let r=e.token,i=r.length>0?`/api/sync/events?token=${encodeURIComponent(r)}`:`/api/sync/events`;t=new EventSource(i),t.addEventListener(`sync`,e=>{let t;try{t=JSON.parse(e.data)}catch{return}for(let e of n)try{e(t)}catch{}})},i=e=>(r(),n.add(e),()=>{n.delete(e)});export{i as t};
@@ -0,0 +1,2 @@
1
+ a dQ��-��/<C���eb@�Z�������{lK*��
2
+ 8�'��97ag�3q�ΈXC��DŃbǞ��6��W� *��gO=�ԅ��H��Ap�o-��Ğ9өHﭏ08D~|���ӧ>q>��h�+��h�-�F;�N`O}�Б�"�9L�*#;џ�POѣw�=M?��"4�UCˢX]s��h ��Ʃ�)
@@ -0,0 +1 @@
1
+ import{$ as e,L as t,Q as n}from"./DF6QYH3p.js";import{rt as r}from"./Bs86lft6.js";var i=new class{events;#e=e(null);get tour(){return t(this.#e)}set tour(e){n(this.#e,e,!0)}#t=e(0);get stepIndex(){return t(this.#t)}set stepIndex(e){n(this.#t,e,!0)}eventUnsubscribe=null;constructor(e){this.events=e}get currentStep(){return this.tour?this.tour.steps[this.stepIndex]??null:null}get isActive(){return this.tour!==null}get totalSteps(){return this.tour?.steps.length??0}start(e){this.tour=e,this.stepIndex=0,this.rewireEventTrigger()}next(){if(!this.tour)return;let e=this.tour.steps.length-1;if(this.stepIndex>=e){this.complete();return}this.stepIndex+=1,this.rewireEventTrigger()}previous(){!this.tour||this.stepIndex<=0||(--this.stepIndex,this.rewireEventTrigger())}cancel(){this.teardown()}complete(){this.teardown()}teardown(){this.eventUnsubscribe?.(),this.eventUnsubscribe=null,this.tour=null,this.stepIndex=0}rewireEventTrigger(){this.eventUnsubscribe?.(),this.eventUnsubscribe=null;let e=this.currentStep;if(!e||e.advance.kind!==`event`)return;let t=e.advance.event,n=e.advance.match;this.eventUnsubscribe=this.events.subscribe(e=>{e.name===t&&(n&&!n(e.payload)||this.next())})}}(new class{subscribe(e){return r(t=>{e(t.payload?{name:t.name,payload:t.payload}:{name:t.name})})}});export{i as t};
@@ -1,4 +1,4 @@
1
- import{A as e,D as t,H as n,J as r,L as i,O as a,X as o,Y as s,_ as c,a as l,ft as u,j as d,k as f,tt as p,u as m,v as h,w as g}from"./CB9H0ifB.js";import"./CT0T0Gak.js";var _=d(`<span class="pointer-events-none absolute top-0 bottom-0 w-px bg-slate-300/70" aria-hidden="true"></span>`),v=d(`<span class="shrink-0 text-[10px] font-semibold tabular-nums text-slate-600" style="min-width: 2.25rem; text-align: right;"> </span>`),y=d(`<div class="flex w-full items-center gap-2"><div style="box-shadow: inset 0 1px 1px rgba(15, 23, 42, 0.06);" role="progressbar"><div class="h-full rounded-full transition-[width,background-color] duration-300 ease-out"></div> <!></div> <!></div>`);function b(d,b){let x=l(b,`size`,3,`sm`),S=l(b,`showLabel`,3,!1),C=l(b,`ticks`,19,()=>[50,80]),w=p(()=>Math.max(0,Math.min(100,Math.round(b.percentage)))),T=p(()=>i(w)>=80?`#10b981`:i(w)>=50?`#f59e0b`:`#ef4444`),E=p(()=>b.color??i(T)),D=p(()=>x()===`md`?`h-2.5`:x()===`sm`?`h-1.5`:`h-1`);var O=y(),k=r(O);m(k,`aria-valuemin`,0),m(k,`aria-valuemax`,100);var A=r(k);g(o(A,2),16,C,e=>e,(r,i)=>{var a=e(),o=s(a),l=e=>{var t=_();n(()=>c(t,`left: ${i??``}%;`)),f(e,t)};t(o,e=>{i>0&&i<100&&e(l)}),f(r,a)}),u(k);var j=o(k,2),M=e=>{var t=v(),o=r(t);u(t),n(()=>a(o,`${i(w)??``}%`)),f(e,t)};t(j,e=>{S()&&e(M)}),u(O),n(()=>{h(k,1,`relative w-full overflow-hidden rounded-full bg-slate-100 ${i(D)??``}`),m(k,`aria-valuenow`,i(w)),m(k,`aria-label`,b.ariaLabel),c(A,`
1
+ import{A as e,D as t,H as n,J as r,L as i,O as a,X as o,Y as s,_ as c,a as l,ft as u,j as d,k as f,tt as p,u as m,v as h,w as g}from"./DF6QYH3p.js";import"./xihTtKlq.js";var _=d(`<span class="pointer-events-none absolute top-0 bottom-0 w-px bg-slate-300/70" aria-hidden="true"></span>`),v=d(`<span class="shrink-0 text-[10px] font-semibold tabular-nums text-slate-600" style="min-width: 2.25rem; text-align: right;"> </span>`),y=d(`<div class="flex w-full items-center gap-2"><div style="box-shadow: inset 0 1px 1px rgba(15, 23, 42, 0.06);" role="progressbar"><div class="h-full rounded-full transition-[width,background-color] duration-300 ease-out"></div> <!></div> <!></div>`);function b(d,b){let x=l(b,`size`,3,`sm`),S=l(b,`showLabel`,3,!1),C=l(b,`ticks`,19,()=>[50,80]),w=p(()=>Math.max(0,Math.min(100,Math.round(b.percentage)))),T=p(()=>i(w)>=80?`#10b981`:i(w)>=50?`#f59e0b`:`#ef4444`),E=p(()=>b.color??i(T)),D=p(()=>x()===`md`?`h-2.5`:x()===`sm`?`h-1.5`:`h-1`);var O=y(),k=r(O);m(k,`aria-valuemin`,0),m(k,`aria-valuemax`,100);var A=r(k);g(o(A,2),16,C,e=>e,(r,i)=>{var a=e(),o=s(a),l=e=>{var t=_();n(()=>c(t,`left: ${i??``}%;`)),f(e,t)};t(o,e=>{i>0&&i<100&&e(l)}),f(r,a)}),u(k);var j=o(k,2),M=e=>{var t=v(),o=r(t);u(t),n(()=>a(o,`${i(w)??``}%`)),f(e,t)};t(j,e=>{S()&&e(M)}),u(O),n(()=>{h(k,1,`relative w-full overflow-hidden rounded-full bg-slate-100 ${i(D)??``}`),m(k,`aria-valuenow`,i(w)),m(k,`aria-label`,b.ariaLabel),c(A,`
2
2
  width: ${i(w)??``}%;
3
3
  background-color: ${i(E)??``};
4
4
  background-image: linear-gradient(180deg, rgba(255,255,255,0.18) 0%, rgba(0,0,0,0.06) 100%);
@@ -0,0 +1 @@
1
+ import{$ as e,L as t,Q as n,R as r,it as i,r as a,t as o,z as s}from"./DF6QYH3p.js";var c=class{constructor(e,t){this.status=e,typeof t==`string`?this.body={message:t}:t?this.body=t:this.body={message:`Error: ${e}`}}toString(){return JSON.stringify(this.body)}},l=class{constructor(e,t){try{new Headers({location:t})}catch{throw Error(`Invalid redirect location ${JSON.stringify(t)}: this string contains characters that cannot be used in HTTP headers`)}this.status=e,this.location=t}},u=class extends Error{constructor(e,t,n){super(n),this.status=e,this.text=t}};new URL(`sveltekit-internal://`);function d(e,t){return e===`/`||t===`ignore`?e:t===`never`?e.endsWith(`/`)?e.slice(0,-1):e:t===`always`&&!e.endsWith(`/`)?e+`/`:e}function f(e){return e.split(`%25`).map(decodeURI).join(`%25`)}function p(e){for(let t in e)e[t]=decodeURIComponent(e[t]);return e}function m({href:e}){return e.split(`#`)[0]}function h(e,t,n,r=!1){let i=new URL(e);Object.defineProperty(i,"searchParams",{value:new Proxy(i.searchParams,{get(e,r){if(r===`get`||r===`getAll`||r===`has`)return(t,...i)=>(n(t),e[r](t,...i));t();let i=Reflect.get(e,r);return typeof i==`function`?i.bind(e):i}}),enumerable:!0,configurable:!0});let a=[`href`,`pathname`,`search`,`toString`,`toJSON`];r&&a.push(`hash`);for(let n of a)Object.defineProperty(i,n,{get(){return t(),e[n]},enumerable:!0,configurable:!0});return i}function g(){}function _(...e){let t=5381;for(let n of e)if(typeof n==`string`){let e=n.length;for(;e;)t=t*33^n.charCodeAt(--e)}else if(ArrayBuffer.isView(n)){let e=new Uint8Array(n.buffer,n.byteOffset,n.byteLength),r=e.length;for(;r;)t=t*33^e[--r]}else throw TypeError(`value must be a string or TypedArray`);return(t>>>0).toString(36)}new TextEncoder;function v(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}var ee=window.fetch;window.fetch=(e,t)=>((e instanceof Request?e.method:t?.method||`GET`)!==`GET`&&y.delete(S(e)),ee(e,t));var y=new Map;function b(e,t){let n=S(e,t),r=document.querySelector(n);if(r?.textContent){r.remove();let{body:e,...t}=JSON.parse(r.textContent),i=r.getAttribute(`data-ttl`);return i&&y.set(n,{body:e,init:t,ttl:1e3*Number(i)}),r.getAttribute(`data-b64`)!==null&&(e=v(e)),Promise.resolve(new Response(e,t))}return window.fetch(e,t)}function x(e,t,n){if(y.size>0){let t=S(e,n),r=y.get(t);if(r){if(performance.now()<r.ttl&&[`default`,`force-cache`,`only-if-cached`,void 0].includes(n?.cache))return new Response(r.body,r.init);y.delete(t)}}return window.fetch(t,n)}function S(e,t){let n=`script[data-sveltekit-fetched][data-url=${JSON.stringify(e instanceof Request?e.url:e)}]`;if(t?.headers||t?.body){let e=[];t.headers&&e.push([...new Headers(t.headers)].join(`,`)),t.body&&(typeof t.body==`string`||ArrayBuffer.isView(t.body))&&e.push(t.body),n+=`[data-hash="${_(...e)}"]`}return n}var te=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/,C=/^\/\((?:.+)\)$/;function ne(e){let t=[];return{pattern:e===`/`||C.test(e)?/^\/$/:RegExp(`^${ie(e).map(e=>{let n=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(e);if(n)return t.push({name:n[1],matcher:n[2],optional:!1,rest:!0,chained:!0}),`(?:/([^]*))?`;let r=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(e);if(r)return t.push({name:r[1],matcher:r[2],optional:!0,rest:!1,chained:!0}),`(?:/([^/]+))?`;if(!e)return;let i=e.split(/\[(.+?)\](?!\])/);return`/`+i.map((e,n)=>{if(n%2){if(e.startsWith(`x+`))return oe(String.fromCharCode(parseInt(e.slice(2),16)));if(e.startsWith(`u+`))return oe(String.fromCharCode(...e.slice(2).split(`-`).map(e=>parseInt(e,16))));let[,r,a,o,s]=te.exec(e);return t.push({name:o,matcher:s,optional:!!r,rest:!!a,chained:a?n===1&&i[0]===``:!1}),a?`([^]*?)`:r?`([^/]*)?`:`([^/]+?)`}return oe(e)}).join(``)}).join(``)}/?$`),params:t}}function re(e){return e!==``&&!/^\([^)]+\)$/.test(e)}function ie(e){return e.slice(1).split(`/`).filter(re)}function ae(e,t,n){let r={},i=e.slice(1),a=i.filter(e=>e!==void 0),o=0;for(let e=0;e<t.length;e+=1){let s=t[e],c=i[e-o];if(s.chained&&s.rest&&o&&(c=i.slice(e-o,e+1).filter(e=>e).join(`/`),o=0),c===void 0)if(s.rest)c=``;else continue;if(!s.matcher||n[s.matcher](c)){r[s.name]=c;let n=t[e+1],l=i[e+1];n&&!n.rest&&n.optional&&l&&s.chained&&(o=0),!n&&!l&&Object.keys(r).length===a.length&&(o=0);continue}if(s.optional&&s.chained){o++;continue}return}if(!o)return r}function oe(e){return e.normalize().replace(/[[\]]/g,`\\$&`).replace(/%/g,`%25`).replace(/\//g,`%2[Ff]`).replace(/\?/g,`%3[Ff]`).replace(/#/g,`%23`).replace(/[.*+?^${}()|\\]/g,`\\$&`)}function se({nodes:e,server_loads:t,dictionary:n,matchers:r}){let i=new Set(t);return Object.entries(n).map(([t,[n,i,s]])=>{let{pattern:c,params:l}=ne(t),u={id:t,exec:e=>{let t=c.exec(e);if(t)return ae(t,l,r)},errors:[1,...s||[]].map(t=>e[t]),layouts:[0,...i||[]].map(o),leaf:a(n)};return u.errors.length=u.layouts.length=Math.max(u.errors.length,u.layouts.length),u});function a(t){let n=t<0;return n&&(t=~t),[n,e[t]]}function o(t){return t===void 0?t:[i.has(t),e[t]]}}function ce(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function le(e,t,n=JSON.stringify){let r=n(t);try{sessionStorage[e]=r}catch{}}var w=globalThis.__sveltekit_3gir7d?.base??``,ue=globalThis.__sveltekit_3gir7d?.assets??w??``,de=`1779730947749`,fe=`sveltekit:snapshot`,pe=`sveltekit:scroll`,me=`sveltekit:states`,T=`sveltekit:history`,E=`sveltekit:navigation`,D={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},O=location.origin;function he(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){let e=document.getElementsByTagName(`base`);t=e.length?e[0].href:document.URL}return new URL(e,t)}function k(){return{x:pageXOffset,y:pageYOffset}}function A(e,t){return e.getAttribute(`data-sveltekit-${t}`)}var ge={...D,"":D.hover};function _e(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function ve(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()===`A`&&e.hasAttribute(`href`))return e;e=_e(e)}}function ye(e,t,n){let r;try{if(r=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&r.hash.match(/^#[^/]/)){let e=location.hash.split(`#`)[1]||`/`;r.hash=`#${e}${r.hash}`}}catch{}let i=e instanceof SVGAElement?e.target.baseVal:e.target,a=!r||!!i||Ce(r,t,n)||(e.getAttribute(`rel`)||``).split(/\s+/).includes(`external`),o=r?.origin===O&&e.hasAttribute(`download`);return{url:r,external:a,target:i,download:o}}function j(e){let t=null,n=null,r=null,i=null,a=null,o=null,s=e;for(;s&&s!==document.documentElement;)r===null&&(r=A(s,`preload-code`)),i===null&&(i=A(s,`preload-data`)),t===null&&(t=A(s,`keepfocus`)),n===null&&(n=A(s,`noscroll`)),a===null&&(a=A(s,`reload`)),o===null&&(o=A(s,`replacestate`)),s=_e(s);function c(e){switch(e){case``:case`true`:return!0;case`off`:case`false`:return!1;default:return}}return{preload_code:ge[r??`off`],preload_data:ge[i??`off`],keepfocus:c(t),noscroll:c(n),reload:c(a),replace_state:c(o)}}function be(e){let t=i(e),n=!0;function r(){n=!0,t.update(e=>e)}function a(e){n=!1,t.set(e)}function o(e){let r;return t.subscribe(t=>{(r===void 0||n&&t!==r)&&e(r=t)})}return{notify:r,set:a,subscribe:o}}var xe={v:g};function Se(){let{set:e,subscribe:t}=i(!1);async function n(){clearTimeout(void 0);try{let t=await fetch(`${ue}/_app/version.json`,{headers:{pragma:`no-cache`,"cache-control":`no-cache`}});if(!t.ok)return!1;let n=(await t.json()).version!==de;return n&&(e(!0),xe.v(),clearTimeout(void 0)),n}catch{return!1}}return{subscribe:t,check:n}}function Ce(e,t,n){return e.origin!==O||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function we(e){}var Te=new Set([`load`,`prerender`,`csr`,`ssr`,`trailingSlash`,`config`]);new Set([...Te,`entries`]);var Ee=new Set([...Te]);new Set([...Ee,`actions`,`entries`]),new Set([`GET`,`POST`,`PATCH`,`PUT`,`DELETE`,`OPTIONS`,`HEAD`,`fallback`,`prerender`,`trailingSlash`,`config`,`entries`]);function De(e){return e.filter(e=>e!=null)}function Oe(e,t){return e+`/`+t}function ke(e){return e instanceof c||e instanceof u?e.status:500}function Ae(e){return e instanceof u?e.text:`Internal Error`}var M,N,je,Me=a.toString().includes(`$$`)||/function \w+\(\) \{\}/.test(a.toString()),Ne=`a:`;Me?(M={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(Ne)},N={current:null},je={current:!1}):(M=new class{#e=e({});get data(){return t(this.#e)}set data(e){n(this.#e,e)}#t=e(null);get form(){return t(this.#t)}set form(e){n(this.#t,e)}#n=e(null);get error(){return t(this.#n)}set error(e){n(this.#n,e)}#r=e({});get params(){return t(this.#r)}set params(e){n(this.#r,e)}#i=e({id:null});get route(){return t(this.#i)}set route(e){n(this.#i,e)}#a=e({});get state(){return t(this.#a)}set state(e){n(this.#a,e)}#o=e(-1);get status(){return t(this.#o)}set status(e){n(this.#o,e)}#s=e(new URL(Ne));get url(){return t(this.#s)}set url(e){n(this.#s,e)}},N=new class{#e=e(null);get current(){return t(this.#e)}set current(e){n(this.#e,e)}},je=new class{#e=e(!1);get current(){return t(this.#e)}set current(e){n(this.#e,e)}},xe.v=()=>je.current=!0);function Pe(e){Object.assign(M,e)}var Fe={spanContext(){return Ie},setAttribute(){return this},setAttributes(){return this},addEvent(){return this},setStatus(){return this},updateName(){return this},end(){return this},isRecording(){return!1},recordException(){return this},addLink(){return this},addLinks(){return this}},Ie={traceId:``,spanId:``,traceFlags:0},{onMount:Le,tick:Re}=o,ze=new Set([`icon`,`shortcut icon`,`apple-touch-icon`]),P=null,F=ce(`sveltekit:scroll`)??{},I=ce(`sveltekit:snapshot`)??{},L={url:be({}),page:be({}),navigating:i(null),updated:Se()};function Be(e){F[e]=k()}function Ve(e,t){let n=e+1;for(;F[n];)delete F[n],n+=1;for(n=t+1;I[n];)delete I[n],n+=1}function R(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(g)}async function He(){if(`serviceWorker`in navigator){let e=await navigator.serviceWorker.getRegistration(w||`/`);e&&await e.update()}}var Ue,We,z,B,Ge,V,H=[],U=[],W=null;function Ke(){W?.fork?.then(e=>e?.discard()),W=null}var qe=new Map,Je=new Set,Ye=new Set,G=new Set,K={branch:[],error:null,url:null,nav:null},Xe=!1,Ze=!1,Qe=!0,q=!1,J=!1,$e=!1,et=!1,tt,Y,X,Z,nt=new Set,rt=new Map,it=new Map;async function at(e,t,n){globalThis.__sveltekit_3gir7d&&(globalThis.__sveltekit_3gir7d.query,globalThis.__sveltekit_3gir7d.prerender),document.URL!==location.href&&(location.href=location.href),V=e,await e.hooks.init?.(),Ue=se(e),B=document.documentElement,Ge=t,We=e.nodes[0],z=e.nodes[1],We(),z(),Y=history.state?.[T],X=history.state?.[E],Y||(Y=X=Date.now(),history.replaceState({...history.state,[T]:Y,[E]:X},``));let r=F[Y];function i(){r&&(history.scrollRestoration=`manual`,scrollTo(r.x,r.y))}n?(i(),await Pt(Ge,n)):(await Q({type:`enter`,url:he(V.hash?Bt(new URL(location.href)):location.href),replace_state:!0}),i()),Nt()}function ot(){H.length=0,et=!1}function st(e){U.some(e=>e?.snapshot)&&(I[e]=U.map(e=>e?.snapshot?.capture()))}function ct(e){I[e]?.forEach((e,t)=>{U[t]?.snapshot?.restore(e)})}function lt(){Be(Y),le(pe,F),st(X),le(fe,I)}async function ut(e,t,n,r){let i,a;t.invalidateAll&&Ke(),await Q({type:`goto`,url:he(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:r,accept:()=>{if(t.invalidateAll){et=!0,i=new Set;for(let[e,t]of rt)for(let n of t.keys())i.add(Oe(e,n));a=new Set;for(let[e,t]of it)for(let n of t.keys())a.add(Oe(e,n))}t.invalidate&&t.invalidate.forEach(Mt)}}),t.invalidateAll&&s().then(s).then(()=>{for(let[e,t]of rt)for(let[n,{resource:r}]of t)i?.has(Oe(e,n))&&r.refresh();for(let[e,t]of it)for(let[n,{resource:r}]of t)a?.has(Oe(e,n))&&r.reconnect()})}async function dt(e){if(e.id!==W?.id){Ke();let t={};nt.add(t),W={id:e.id,token:t,promise:xt({...e,preload:t}).then(e=>(nt.delete(t),e.type===`loaded`&&e.state.error&&Ke(),e)),fork:null}}return W.promise}async function ft(e){let t=(await Tt(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(e=>e[1]()))}async function pt(e,t,n){let r={params:K.params,route:{id:K.route?.id??null},url:new URL(location.href)};if(K={...e.state,nav:r},Pe(e.props.page),tt=new V.root({target:t,props:{...e.props,stores:L,components:U},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),ct(X),n){let e={from:null,to:{...r,scroll:F[Y]??k()},willUnload:!1,type:`enter`,complete:Promise.resolve()};G.forEach(t=>t(e))}Ze=!0}async function mt({url:e,params:t,branch:n,errors:r,status:i,error:a,route:o,form:s}){let c=`never`;if(w&&(e.pathname===w||e.pathname===w+`/`))c=`always`;else for(let e of n)e?.slash!==void 0&&(c=e.slash);e.pathname=d(e.pathname,c),e.search=e.search;let l={type:`loaded`,state:{url:e,params:t,branch:n,error:a,route:o},props:{constructors:De(n).map(e=>e.node.component),page:zt(M)}};s!==void 0&&(l.props.form=s);let u={},f=!M,p=0;for(let e=0;e<Math.max(n.length,K.branch.length);e+=1){let t=n[e],r=K.branch[e];t?.data!==r?.data&&(f=!0),t&&(u={...u,...t.data},f&&(l.props[`data_${p}`]=u),p+=1)}return(!K.url||e.href!==K.url.href||K.error!==a||s!==void 0&&s!==M.form||f)&&(l.props.page={error:a,params:t,route:{id:o?.id??null},state:{},status:i,url:new URL(e),form:s??null,data:f?u:M.data}),l}async function ht({loader:e,parent:t,url:n,params:r,route:i,server_data_node:a}){let o=null,s=!0,c={dependencies:new Set,params:new Set,parent:!1,route:!1,url:!1,search_params:new Set},l=await e();if(l.universal?.load){function e(...e){for(let t of e){let{href:e}=new URL(t,n);c.dependencies.add(e)}}let u={tracing:{enabled:!1,root:Fe,current:Fe},route:new Proxy(i,{get:(e,t)=>(s&&(c.route=!0),e[t])}),params:new Proxy(r,{get:(e,t)=>(s&&c.params.add(t),e[t])}),data:a?.data??null,url:h(n,()=>{s&&(c.url=!0)},e=>{s&&c.search_params.add(e)},V.hash),async fetch(t,r){t instanceof Request&&(r={body:t.method===`GET`||t.method===`HEAD`?void 0:await t.blob(),cache:t.cache,credentials:t.credentials,headers:[...t.headers].length>0?t?.headers:void 0,integrity:t.integrity,keepalive:t.keepalive,method:t.method,mode:t.mode,redirect:t.redirect,referrer:t.referrer,referrerPolicy:t.referrerPolicy,signal:t.signal,...r});let{resolved:i,promise:a}=gt(t,r,n);return s&&e(i.href),a},setHeaders:g,depends:e,parent(){return s&&(c.parent=!0),t()},untrack(e){s=!1;try{return e()}finally{s=!0}}};o=await l.universal.load.call(null,u)??null}return{node:l,loader:e,server:a,universal:l.universal?.load?{type:`data`,data:o,uses:c}:null,data:o??a?.data??null,slash:l.universal?.trailingSlash??a?.slash}}function gt(e,t,n){let r=e instanceof Request?e.url:e,i=new URL(r,n);return i.origin===n.origin&&(r=i.href.slice(n.origin.length)),{resolved:i,promise:Ze?x(r,i.href,t):b(r,t)}}function _t(e,t,n,r,i,a){if(et)return!0;if(!i)return!1;if(i.parent&&e||i.route&&t||i.url&&n)return!0;for(let e of i.search_params)if(r.has(e))return!0;for(let e of i.params)if(a[e]!==K.params[e])return!0;for(let e of i.dependencies)if(H.some(t=>t(new URL(e))))return!0;return!1}function vt(e,t){return e?.type===`data`?e:e?.type===`skip`?t??null:null}function yt(e,t){if(!e)return new Set(t.searchParams.keys());let n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(let r of n){let i=e.searchParams.getAll(r),a=t.searchParams.getAll(r);i.every(e=>a.includes(e))&&a.every(e=>i.includes(e))&&n.delete(r)}return n}function bt({error:e,url:t,route:n,params:r}){return{type:`loaded`,state:{error:e,url:t,route:n,params:r,branch:[]},props:{page:zt(M),constructors:[]}}}async function xt({id:e,invalidating:t,url:n,params:r,route:i,preload:a}){if(W?.id===e)return nt.delete(W.token),W.promise;let{errors:o,layouts:s,leaf:u}=i,d=[...s,u];o.forEach(e=>e?.().catch(g)),d.forEach(e=>e?.[1]().catch(g));let f=K.url?e!==Dt(K.url):!1,p=K.route?i.id!==K.route.id:!1,m=yt(K.url,n),h=!1,_=d.map(async(e,t)=>{if(!e)return;let a=K.branch[t];return e[1]===a?.loader&&!_t(h,p,f,m,a.universal?.uses,r)?a:(h=!0,ht({loader:e[1],url:n,params:r,route:i,parent:async()=>{let e={};for(let n=0;n<t;n+=1)Object.assign(e,(await _[n])?.data);return e},server_data_node:vt(e[0]?{type:`skip`}:null,e[0]?a?.server:void 0)}))});for(let e of _)e.catch(g);let v=[];for(let e=0;e<d.length;e+=1)if(d[e])try{v.push(await _[e])}catch(t){if(t instanceof l)return{type:`redirect`,location:t.location};if(nt.has(a))return bt({error:await $(t,{params:r,url:n,route:{id:i.id}}),url:n,params:r,route:i});let s=ke(t),u;if(t instanceof c)u=t.body;else{if(await L.updated.check())return await He(),await R(n);u=await $(t,{params:r,url:n,route:{id:i.id}})}let d=await St(e,v,o);return d?mt({url:n,params:r,branch:v.slice(0,d.idx).concat(d.node),errors:o,status:s,error:u,route:i}):await kt(n,{id:i.id},u,s)}else v.push(void 0);return mt({url:n,params:r,branch:v,errors:o,status:200,error:null,route:i,form:t?void 0:null})}async function St(e,t,n){for(;e--;)if(n[e]){let r=e;for(;!t[r];)--r;try{return{idx:r+1,node:{node:await n[e](),loader:n[e],data:{},server:null,universal:null}}}catch{continue}}}async function Ct({status:e,error:t,url:n,route:r}){let i={};try{return mt({url:n,params:i,branch:[await ht({loader:We,url:n,params:i,route:r,parent:()=>Promise.resolve({}),server_data_node:vt(null)}),{node:await z(),loader:z,universal:null,server:null,data:null}],status:e,error:t,errors:[],route:null})}catch(e){if(e instanceof l)return ut(new URL(e.location,location.href),{},0);throw e}}async function wt(e){let t=e.href;if(qe.has(t))return qe.get(t);let n;try{let r=(async()=>{let t=await V.hooks.reroute({url:new URL(e),fetch:async(t,n)=>gt(t,n,e).promise})??e;if(typeof t==`string`){let n=new URL(e);V.hash?n.hash=t:n.pathname=t,t=n}return t})();qe.set(t,r),n=await r}catch{qe.delete(t);return}return n}async function Tt(e,t){if(e&&!Ce(e,w,V.hash)){let n=await wt(e);if(!n)return;let r=Et(n);for(let n of Ue){let i=n.exec(r);if(i)return{id:Dt(e),invalidating:t,route:n,params:p(i),url:e}}}}function Et(e){return f(V.hash?e.hash.replace(/^#/,``).replace(/[?#].+/,``):e.pathname.slice(w.length))||`/`}function Dt(e){return(V.hash?e.hash.replace(/^#/,``):e.pathname)+e.search}function Ot({url:e,type:t,intent:n,delta:r,event:i,scroll:a}){let o=!1,s=Rt(K,n,e,t,a??null);r!==void 0&&(s.navigation.delta=r),i!==void 0&&(s.navigation.event=i);let c={...s.navigation,cancel:()=>{o=!0,s.reject(Error(`navigation cancelled`))}};return q||Je.forEach(e=>e(c)),o?null:s}async function Q({type:e,url:t,popped:n,keepfocus:i,noscroll:a,replace_state:o,state:c={},redirect_count:l=0,nav_token:d={},accept:f=g,block:p=g,event:m}){let h=Z;Z=d;let _=await Tt(t,!1),v=e===`enter`?Rt(K,_,t,e):Ot({url:t,type:e,delta:n?.delta,intent:_,scroll:n?.scroll,event:m});if(!v){p(),Z===d&&(Z=h);return}let ee=Y,y=X;f(),q=!0,Ze&&v.navigation.type!==`enter`&&L.navigating.set(N.current=v.navigation);let b=_&&await xt(_);if(!b){if(Ce(t,w,V.hash))return await R(t,o);b=await kt(t,{id:null},await $(new u(404,`Not Found`,`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,o)}if(t=_?.url||t,Z!==d)return v.reject(Error(`navigation aborted`)),!1;if(b.type===`redirect`){if(l<20){await Q({type:e,url:new URL(b.location,t),popped:n,keepfocus:i,noscroll:a,replace_state:o,state:c,redirect_count:l+1,nav_token:d}),v.fulfil(void 0);return}b=await Ct({status:500,error:await $(Error(`Redirect loop`),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}})}else b.props.page.status>=400&&await L.updated.check()&&(await He(),await R(t,o));if(ot(),Be(ee),st(y),b.props.page.url.pathname!==t.pathname&&(t.pathname=b.props.page.url.pathname),c=n?n.state:c,!n){let e=+!o,n={[T]:Y+=e,[E]:X+=e,[me]:c};(o?history.replaceState:history.pushState).call(history,n,``,t),o||Ve(Y,X)}let x=_&&W?.id===_.id?W.fork:null;W?.fork&&!x&&Ke(),W=null,b.props.page.state=c;let S;if(Ze){let e=(await Promise.all(Array.from(Ye,e=>e(v.navigation)))).filter(e=>typeof e==`function`);if(e.length>0){function t(){e.forEach(e=>{G.delete(e)})}e.push(t),e.forEach(e=>{G.add(e)})}let n=v.navigation.to;K={...b.state,nav:{params:n.params,route:n.route,url:n.url}},b.props.page&&(b.props.page.url=t);let i=x&&await x;i?S=i.commit():(P=null,tt.$set(b.props),P&&Object.assign(b.props.page,P),Pe(b.props.page),S=r?.()),$e=!0}else await pt(b,Ge,!1);let{activeElement:te}=document;if(await S,await s(),await s(),Z!==d)return v.reject(Error(`navigation aborted`)),!1;b.props.page&&P&&Object.assign(b.props.page,P);let C=null;if(Qe){let e=n?n.scroll:a?k():null;e?scrollTo(e.x,e.y):(C=t.hash&&document.getElementById(Vt(t)))?C.scrollIntoView():scrollTo(0,0)}let ne=document.activeElement!==te&&document.activeElement!==document.body;!i&&!ne&&Lt(t,!C),Qe=!0,q=!1,e===`popstate`&&ct(X),v.fulfil(void 0),v.navigation.to&&(v.navigation.to.scroll=k()),G.forEach(e=>e(v.navigation)),L.navigating.set(N.current=null)}async function kt(e,t,n,r,i){return e.origin===O&&e.pathname===location.pathname&&!Xe?await Ct({status:r,error:n,url:e,route:t}):await R(e,i)}function At(){let e,t={element:void 0,href:void 0},n;B.addEventListener(`mousemove`,t=>{let n=t.target;clearTimeout(e),e=setTimeout(()=>{a(n,D.hover)},20)});function r(e){e.defaultPrevented||a(e.composedPath()[0],D.tap)}B.addEventListener(`mousedown`,r),B.addEventListener(`touchstart`,r,{passive:!0});let i=new IntersectionObserver(e=>{for(let t of e)t.isIntersecting&&(ft(new URL(t.target.href)),i.unobserve(t.target))},{threshold:0});async function a(e,r){let i=ve(e,B),a=i===t.element&&i?.href===t.href&&r>=n;if(!i||a)return;let{url:o,external:s,download:c}=ye(i,w,V.hash);if(s||c)return;let l=j(i),u=o&&Dt(K.url)===Dt(o);if(!(l.reload||u))if(r<=l.preload_data){t={element:i,href:i.href},n=D.tap;let e=await Tt(o,!1);if(!e)return;dt(e)}else r<=l.preload_code&&(t={element:i,href:i.href},n=r,ft(o))}function o(){i.disconnect();for(let e of B.querySelectorAll(`a`)){let{url:t,external:n,download:r}=ye(e,w,V.hash);if(n||r)continue;let a=j(e);a.reload||(a.preload_code===D.viewport&&i.observe(e),a.preload_code===D.eager&&ft(t))}}G.add(o),o()}function $(e,t){if(e instanceof c)return e.body;let n=ke(e),r=Ae(e);return V.hooks.handleError({error:e,event:t,status:n,message:r})??{message:r}}function jt(e,t={}){return e=new URL(he(e)),e.origin===O?ut(e,t,0):Promise.reject(Error(`goto: invalid URL`))}function Mt(e){if(typeof e==`function`)H.push(e);else{let{href:t}=new URL(e,location.href);H.push(e=>e.href===t)}}function Nt(){history.scrollRestoration=`manual`,addEventListener(`beforeunload`,e=>{let t=!1;if(lt(),!q){let e=Rt(K,void 0,null,`leave`),n={...e.navigation,cancel:()=>{t=!0,e.reject(Error(`navigation cancelled`))}};Je.forEach(e=>e(n))}t?(e.preventDefault(),e.returnValue=``):history.scrollRestoration=`auto`}),addEventListener(`visibilitychange`,()=>{document.visibilityState===`hidden`&&lt()}),!navigator.connection?.saveData&&!/2g/.test(navigator.connection?.effectiveType)&&At(),B.addEventListener(`click`,async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;let n=ve(t.composedPath()[0],B);if(!n)return;let{url:r,external:i,target:a,download:o}=ye(n,w,V.hash);if(!r)return;if(a===`_parent`||a===`_top`){if(window.parent!==window)return}else if(a&&a!==`_self`)return;let s=j(n);if(!(n instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol===`https:`||r.protocol===`http:`)||o)return;let[c,l]=(V.hash?r.hash.replace(/^#/,``):r.href).split(`#`),u=c===m(location);if(i||s.reload&&(!u||!l)){Ot({url:r,type:`link`,event:t})?q=!0:t.preventDefault();return}if(l!==void 0&&u){let[,i]=K.url.href.split(`#`);if(i===l){if(t.preventDefault(),l===``||l===`top`&&n.ownerDocument.getElementById(`top`)===null)scrollTo({top:0});else{let e=n.ownerDocument.getElementById(decodeURIComponent(l));e&&(e.scrollIntoView(),e.focus())}return}if(J=!0,Be(Y),e(r),!s.replace_state)return;J=!1}t.preventDefault(),await new Promise(e=>{requestAnimationFrame(()=>{setTimeout(e,0)}),setTimeout(e,100)}),await Q({type:`link`,url:r,keepfocus:s.keepfocus,noscroll:s.noscroll,replace_state:s.replace_state??r.href===location.href,event:t})}),B.addEventListener(`submit`,e=>{if(e.defaultPrevented)return;let t=HTMLFormElement.prototype.cloneNode.call(e.target),n=e.submitter;if((n?.formTarget||t.target)===`_blank`||(n?.formMethod||t.method)!==`get`)return;let r=new URL(n?.hasAttribute(`formaction`)&&n?.formAction||t.action);if(Ce(r,w,!1))return;let i=e.target,a=j(i);if(a.reload)return;e.preventDefault(),e.stopPropagation();let o=new FormData(i,n);r.search=new URLSearchParams(o).toString(),Q({type:`form`,url:r,keepfocus:a.keepfocus,noscroll:a.noscroll,replace_state:a.replace_state??r.href===location.href,event:e})}),addEventListener(`popstate`,async t=>{if(!It)if(t.state?.[`sveltekit:history`]){let n=t.state[T];if(Z={},n===Y)return;let r=F[n],i=t.state[`sveltekit:states`]??{},a=new URL(t.state[`sveltekit:pageurl`]??location.href),o=t.state[E],s=K.url?m(location)===m(K.url):!1;if(o===X&&($e||s)){i!==M.state&&(M.state=i),e(a),F[Y]=k(),r&&scrollTo(r.x,r.y),Y=n;return}let c=n-Y;await Q({type:`popstate`,url:a,popped:{state:i,scroll:r,delta:c},accept:()=>{Y=n,X=o},block:()=>{history.go(-c)},nav_token:Z,event:t})}else J||(e(new URL(location.href)),V.hash&&location.reload())}),addEventListener(`hashchange`,()=>{J&&(J=!1,history.replaceState({...history.state,[T]:++Y,[E]:X},``,location.href))});for(let e of document.querySelectorAll(`link`))ze.has(e.rel)&&(e.href=e.href);addEventListener(`pageshow`,e=>{e.persisted&&L.navigating.set(N.current=null)});function e(e){K.url=M.url=e,L.page.set(zt(M)),L.page.notify()}}async function Pt(e,{status:t=200,error:n,node_ids:r,params:i,route:a,server_route:o,data:s,form:c}){Xe=!0;let u=new URL(location.href),d;({params:i={},route:a={id:null}}=await Tt(u,!1)||{}),d=Ue.find(({id:e})=>e===a.id);let f,p=!0;try{let e=r.map(async(t,n)=>{let r=s[n];return r?.uses&&(r.uses=Ft(r.uses)),ht({loader:V.nodes[t],url:u,params:i,route:a,parent:async()=>{let t={};for(let r=0;r<n;r+=1)Object.assign(t,(await e[r]).data);return t},server_data_node:vt(r)})}),o=await Promise.all(e);if(d){let e=d.layouts;for(let t=0;t<e.length;t++)e[t]||o.splice(t,0,void 0)}f=await mt({url:u,params:i,branch:o,status:t,error:n,errors:d?.errors,form:c,route:d??null})}catch(t){if(t instanceof l){await R(new URL(t.location,location.href));return}f=await Ct({status:ke(t),error:await $(t,{url:u,params:i,route:a}),url:u,route:a}),e.textContent=``,p=!1}f.props.page&&(f.props.page.state={}),await pt(f,e,p)}function Ft(e){return{dependencies:new Set(e?.dependencies??[]),params:new Set(e?.params??[]),parent:!!e?.parent,route:!!e?.route,url:!!e?.url,search_params:new Set(e?.search_params??[])}}var It=!1;function Lt(e,t=!0){let n=document.querySelector(`[autofocus]`);if(n)n.focus();else{let n=Vt(e);if(n&&document.getElementById(n)){let{x:r,y:i}=k();setTimeout(()=>{let a=history.state;It=!0,location.replace(new URL(`#${n}`,location.href)),history.replaceState(a,``,e),t&&scrollTo(r,i),It=!1})}else{let e=document.body,t=e.getAttribute(`tabindex`);e.tabIndex=-1,e.focus({preventScroll:!0,focusVisible:!1}),t===null?e.removeAttribute(`tabindex`):e.setAttribute(`tabindex`,t)}let r=getSelection();if(r&&r.type!==`None`){let e=[];for(let t=0;t<r.rangeCount;t+=1)e.push(r.getRangeAt(t));setTimeout(()=>{if(r.rangeCount===e.length){for(let t=0;t<r.rangeCount;t+=1){let n=e[t],i=r.getRangeAt(t);if(n.commonAncestorContainer!==i.commonAncestorContainer||n.startContainer!==i.startContainer||n.endContainer!==i.endContainer||n.startOffset!==i.startOffset||n.endOffset!==i.endOffset)return}r.removeAllRanges()}})}}}function Rt(e,t,n,r,i=null){let a,o,s=new Promise((e,t)=>{a=e,o=t});return s.catch(g),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url,scroll:k()},to:n&&{params:t?.params??null,route:{id:t?.route?.id??null},url:n,scroll:i},willUnload:!t,type:r,complete:s},fulfil:a,reject:o}}function zt(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function Bt(e){let t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function Vt(e){let t;if(V.hash){let[,,n]=e.hash.split(`#`,3);t=n??``}else t=e.hash.slice(1);return decodeURIComponent(t)}export{M as a,l as c,N as i,at as n,je as o,L as r,we as s,jt as t};
@@ -0,0 +1 @@
1
+ import{$ as e,L as t,Q as n,Z as r}from"./DF6QYH3p.js";import{nt as i,t as a}from"./Bs86lft6.js";var o=`Unknown`,s=new class{#e=e(!0);get loading(){return t(this.#e)}set loading(e){n(this.#e,e,!0)}#t=e(r([]));get summaries(){return t(this.#t)}set summaries(e){n(this.#t,e,!0)}#n=e(``);get search(){return t(this.#n)}set search(e){n(this.#n,e,!0)}#r=e(null);get pendingDeleteId(){return t(this.#r)}set pendingDeleteId(e){n(this.#r,e,!0)}#i=e(``);get selectedProjectId(){return t(this.#i)}set selectedProjectId(e){n(this.#i,e,!0)}#a=e(null);get error(){return t(this.#a)}set error(e){n(this.#a,e,!0)}async refresh(){try{this.loading=!0,this.error=null;let e=await a();this.summaries=[...await e.useCases.listProjects()]}catch(e){this.error=e.message}finally{this.loading=!1}}async refreshSilent(){try{let e=await a();this.summaries=[...await e.useCases.listProjects()],this.error=null}catch(e){this.error=e.message}}setSearch(e){this.search=e,i(`project.search_updated`,{query:e})}setSelectedProject(e){this.selectedProjectId=e,e&&i(`project.opened`,{id:e})}openProject(e){return this.setSelectedProject(e),`/projects/${e}`}stagePendingDelete(e){this.pendingDeleteId=e,i(`project.delete_requested`,{id:e})}clearPendingDelete(){this.pendingDeleteId=null}async create(e,t){let n=await(await a()).useCases.createProject({name:e,description:t});return await this.refreshSilent(),i(`project.created`,{id:String(n.id),name:n.name}),n.id}async remove(e){this.summaries=this.summaries.filter(t=>String(t.id)!==String(e)),this.clearPendingDelete(),await(await a()).useCases.deleteProject(e),i(`project.deleted`,{id:String(e)})}async reconcileOrphanFeatures(){let e=await a(),t=await e.useCases.listFeatures();if(t.length===0)return;let n=await e.useCases.listProjects(),r=new Set;for(let t of n){let n=await e.useCases.getProject(t.id);if(n)for(let e of n.featureIds)r.add(String(e))}let i=t.filter(e=>!r.has(String(e.id)));if(i.length===0)return;let s=n.find(e=>e.name===o);if(!s){let t=await e.useCases.createProject({name:o,description:`Auto-created bucket. Holds features that are not assigned to any other project. Rename or reassign to clean it up.`});s={id:t.id,name:t.name,description:t.description,featureCount:0,createdAt:t.createdAt,updatedAt:t.updatedAt}}for(let t of i)await e.useCases.addFeatureToProject(s.id,t.id);await this.refreshSilent()}};export{s as t};