unspaghettit 0.1.1 → 0.1.4

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 (462) hide show
  1. package/README.md +45 -4
  2. package/build/client/_app/immutable/assets/0.BLfpiAwD.css +2 -0
  3. package/build/client/_app/immutable/assets/0.BLfpiAwD.css.br +0 -0
  4. package/build/client/_app/immutable/assets/0.BLfpiAwD.css.gz +0 -0
  5. package/build/client/_app/immutable/chunks/7CWAShXO.js +5 -0
  6. package/build/client/_app/immutable/chunks/7CWAShXO.js.br +0 -0
  7. package/build/client/_app/immutable/chunks/7CWAShXO.js.gz +0 -0
  8. package/build/client/_app/immutable/chunks/Bh4L4TR3.js +1 -0
  9. package/build/client/_app/immutable/chunks/Bh4L4TR3.js.br +0 -0
  10. package/build/client/_app/immutable/chunks/Bh4L4TR3.js.gz +0 -0
  11. package/build/client/_app/immutable/chunks/Bhj2nPnh.js +2 -0
  12. package/build/client/_app/immutable/chunks/Bhj2nPnh.js.br +0 -0
  13. package/build/client/_app/immutable/chunks/Bhj2nPnh.js.gz +0 -0
  14. package/build/client/_app/immutable/chunks/CB9H0ifB.js +3 -0
  15. package/build/client/_app/immutable/chunks/CB9H0ifB.js.br +0 -0
  16. package/build/client/_app/immutable/chunks/CB9H0ifB.js.gz +0 -0
  17. package/build/client/_app/immutable/chunks/CRPPOQ_q.js +1 -0
  18. package/build/client/_app/immutable/chunks/CRPPOQ_q.js.br +0 -0
  19. package/build/client/_app/immutable/chunks/CRPPOQ_q.js.gz +0 -0
  20. package/build/client/_app/immutable/chunks/CYEqQWxZ.js +1 -0
  21. package/build/client/_app/immutable/chunks/CYEqQWxZ.js.br +0 -0
  22. package/build/client/_app/immutable/chunks/CYEqQWxZ.js.gz +0 -0
  23. package/build/client/_app/immutable/chunks/{DBv9bGAW.js → CcT88Qay.js} +1 -1
  24. package/build/client/_app/immutable/chunks/CcT88Qay.js.br +0 -0
  25. package/build/client/_app/immutable/chunks/CcT88Qay.js.gz +0 -0
  26. package/build/client/_app/immutable/chunks/ChWRqgym.js +1 -0
  27. package/build/client/_app/immutable/chunks/ChWRqgym.js.br +0 -0
  28. package/build/client/_app/immutable/chunks/ChWRqgym.js.gz +0 -0
  29. package/build/client/_app/immutable/chunks/{CguRSd-5.js → CmOXOYi7.js} +1 -1
  30. package/build/client/_app/immutable/chunks/CmOXOYi7.js.br +0 -0
  31. package/build/client/_app/immutable/chunks/CmOXOYi7.js.gz +0 -0
  32. package/build/client/_app/immutable/chunks/Cq9Rf810.js +1 -0
  33. package/build/client/_app/immutable/chunks/Cq9Rf810.js.br +2 -0
  34. package/build/client/_app/immutable/chunks/Cq9Rf810.js.gz +0 -0
  35. package/build/client/_app/immutable/chunks/DD8A-Gtg.js +6 -0
  36. package/build/client/_app/immutable/chunks/DD8A-Gtg.js.br +0 -0
  37. package/build/client/_app/immutable/chunks/DD8A-Gtg.js.gz +0 -0
  38. package/build/client/_app/immutable/chunks/DhaH6JO9.js +1 -0
  39. package/build/client/_app/immutable/chunks/DhaH6JO9.js.br +1 -0
  40. package/build/client/_app/immutable/chunks/DhaH6JO9.js.gz +0 -0
  41. package/build/client/_app/immutable/chunks/DmHqLDCF.js +1 -0
  42. package/build/client/_app/immutable/chunks/DmHqLDCF.js.br +0 -0
  43. package/build/client/_app/immutable/chunks/DmHqLDCF.js.gz +0 -0
  44. package/build/client/_app/immutable/chunks/Dw9eLPYi.js +1 -0
  45. package/build/client/_app/immutable/chunks/Dw9eLPYi.js.br +1 -0
  46. package/build/client/_app/immutable/chunks/Dw9eLPYi.js.gz +0 -0
  47. package/build/client/_app/immutable/chunks/Kkaknqg3.js +1 -0
  48. package/build/client/_app/immutable/chunks/Kkaknqg3.js.br +0 -0
  49. package/build/client/_app/immutable/chunks/Kkaknqg3.js.gz +0 -0
  50. package/build/client/_app/immutable/chunks/{DcwZSy0_.js → SUKfBDXm.js} +1 -1
  51. package/build/client/_app/immutable/chunks/SUKfBDXm.js.br +0 -0
  52. package/build/client/_app/immutable/chunks/SUKfBDXm.js.gz +0 -0
  53. package/build/client/_app/immutable/chunks/UiM2Znlq.js +4 -0
  54. package/build/client/_app/immutable/chunks/UiM2Znlq.js.br +0 -0
  55. package/build/client/_app/immutable/chunks/UiM2Znlq.js.gz +0 -0
  56. package/build/client/_app/immutable/entry/app.C6Stj5Nw.js +2 -0
  57. package/build/client/_app/immutable/entry/app.C6Stj5Nw.js.br +0 -0
  58. package/build/client/_app/immutable/entry/app.C6Stj5Nw.js.gz +0 -0
  59. package/build/client/_app/immutable/entry/start.cComHq1k.js +1 -0
  60. package/build/client/_app/immutable/entry/start.cComHq1k.js.br +0 -0
  61. package/build/client/_app/immutable/entry/start.cComHq1k.js.gz +0 -0
  62. package/build/client/_app/immutable/nodes/0.DV2oqy6g.js +3 -0
  63. package/build/client/_app/immutable/nodes/0.DV2oqy6g.js.br +0 -0
  64. package/build/client/_app/immutable/nodes/0.DV2oqy6g.js.gz +0 -0
  65. package/build/client/_app/immutable/nodes/1.CLgrLmv7.js +1 -0
  66. package/build/client/_app/immutable/nodes/1.CLgrLmv7.js.br +0 -0
  67. package/build/client/_app/immutable/nodes/1.CLgrLmv7.js.gz +0 -0
  68. package/build/client/_app/immutable/nodes/2.aQsjERO_.js +1 -0
  69. package/build/client/_app/immutable/nodes/2.aQsjERO_.js.br +1 -0
  70. package/build/client/_app/immutable/nodes/2.aQsjERO_.js.gz +0 -0
  71. package/build/client/_app/immutable/nodes/3.o37WwOCE.js +3 -0
  72. package/build/client/_app/immutable/nodes/3.o37WwOCE.js.br +0 -0
  73. package/build/client/_app/immutable/nodes/3.o37WwOCE.js.gz +0 -0
  74. package/build/client/_app/immutable/nodes/4.Dbrg6PzB.js +43 -0
  75. package/build/client/_app/immutable/nodes/4.Dbrg6PzB.js.br +0 -0
  76. package/build/client/_app/immutable/nodes/4.Dbrg6PzB.js.gz +0 -0
  77. package/build/client/_app/immutable/nodes/5.LnvpMBk8.js +5 -0
  78. package/build/client/_app/immutable/nodes/5.LnvpMBk8.js.br +0 -0
  79. package/build/client/_app/immutable/nodes/5.LnvpMBk8.js.gz +0 -0
  80. package/build/client/_app/immutable/nodes/6.CHriKwAY.js +1 -0
  81. package/build/client/_app/immutable/nodes/6.CHriKwAY.js.br +0 -0
  82. package/build/client/_app/immutable/nodes/6.CHriKwAY.js.gz +0 -0
  83. package/build/client/_app/immutable/nodes/7.FV_Mf4zC.js +5 -0
  84. package/build/client/_app/immutable/nodes/7.FV_Mf4zC.js.br +0 -0
  85. package/build/client/_app/immutable/nodes/7.FV_Mf4zC.js.gz +0 -0
  86. package/build/client/_app/immutable/nodes/{8.2rWOh-Qs.js → 8.BVPp-3Jw.js} +85 -44
  87. package/build/client/_app/immutable/nodes/8.BVPp-3Jw.js.br +0 -0
  88. package/build/client/_app/immutable/nodes/8.BVPp-3Jw.js.gz +0 -0
  89. package/build/client/_app/version.json +1 -1
  90. package/build/client/_app/version.json.br +0 -0
  91. package/build/client/_app/version.json.gz +0 -0
  92. package/build/server/chunks/0-ck_8S7ii.js +15 -0
  93. package/build/server/chunks/0-ck_8S7ii.js.map +1 -0
  94. package/build/server/chunks/1-EvCmJU93.js +9 -0
  95. package/build/server/chunks/{1-HfMv8lKr.js.map → 1-EvCmJU93.js.map} +1 -1
  96. package/build/server/chunks/2-ByiZzIjt.js +9 -0
  97. package/build/server/chunks/2-ByiZzIjt.js.map +1 -0
  98. package/build/server/chunks/3-BXfgH8iQ.js +16 -0
  99. package/build/server/chunks/3-BXfgH8iQ.js.map +1 -0
  100. package/build/server/chunks/4-CbSPlAwh.js +9 -0
  101. package/build/server/chunks/4-CbSPlAwh.js.map +1 -0
  102. package/build/server/chunks/5--noidTrC.js +9 -0
  103. package/build/server/chunks/5--noidTrC.js.map +1 -0
  104. package/build/server/chunks/6-DkH9D9Vr.js +9 -0
  105. package/build/server/chunks/6-DkH9D9Vr.js.map +1 -0
  106. package/build/server/chunks/7-DWURCz96.js +9 -0
  107. package/build/server/chunks/7-DWURCz96.js.map +1 -0
  108. package/build/server/chunks/8-ey7T3lwI.js +9 -0
  109. package/build/server/chunks/8-ey7T3lwI.js.map +1 -0
  110. package/build/server/chunks/{FeatureCard-CxMZdqJi.js → FeatureCard-qMrgIY4R.js} +24 -7
  111. package/build/server/chunks/FeatureCard-qMrgIY4R.js.map +1 -0
  112. package/build/server/chunks/{FeatureJson-BKVjQ24K.js → FeatureJson-XfuPndFY.js} +2 -2
  113. package/build/server/chunks/FeatureJson-XfuPndFY.js.map +1 -0
  114. package/build/server/chunks/{FeatureValidator-CaGQliNh.js → FeatureValidator-BpCry4ve.js} +2 -2
  115. package/build/server/chunks/FeatureValidator-BpCry4ve.js.map +1 -0
  116. package/build/server/chunks/ProgressBar-CCDGZh4y.js +70 -0
  117. package/build/server/chunks/ProgressBar-CCDGZh4y.js.map +1 -0
  118. package/build/server/chunks/{ProjectsIndex-CUZP9o0d.js → ProjectsIndex-De5pqV0u.js} +7 -6
  119. package/build/server/chunks/ProjectsIndex-De5pqV0u.js.map +1 -0
  120. package/build/server/chunks/{FeatureSharedStateNormalizer-EsT1Z4Ir.js → QueueItem-DNAI4oAZ.js} +19 -2
  121. package/build/server/chunks/QueueItem-DNAI4oAZ.js.map +1 -0
  122. package/build/server/chunks/{TransitionCatalog-CoZZTgtm.js → TransitionCatalog-6JXlrQGF.js} +19 -5
  123. package/build/server/chunks/TransitionCatalog-6JXlrQGF.js.map +1 -0
  124. package/build/server/chunks/_layout.svelte-CXqUGHsD.js +342 -0
  125. package/build/server/chunks/_layout.svelte-CXqUGHsD.js.map +1 -0
  126. package/build/server/chunks/{_page.svelte-B9wsRBQI.js → _page.svelte-B2Mykryr.js} +8 -7
  127. package/build/server/chunks/_page.svelte-B2Mykryr.js.map +1 -0
  128. package/build/server/chunks/{_page.svelte-B3pNkbHi.js → _page.svelte-BsUc_9eO.js} +9 -8
  129. package/build/server/chunks/{_page.svelte-B3pNkbHi.js.map → _page.svelte-BsUc_9eO.js.map} +1 -1
  130. package/build/server/chunks/{_page.svelte-CgJt00DJ.js → _page.svelte-CuDeJhwE.js} +150 -14
  131. package/build/server/chunks/_page.svelte-CuDeJhwE.js.map +1 -0
  132. package/build/server/chunks/{_page.svelte-B7Lx87jQ.js → _page.svelte-DSMXcsQF.js} +12 -11
  133. package/build/server/chunks/_page.svelte-DSMXcsQF.js.map +1 -0
  134. package/build/server/chunks/{_page.svelte-MkoticD5.js → _page.svelte-DvkBRiGs.js} +9 -8
  135. package/build/server/chunks/{_page.svelte-MkoticD5.js.map → _page.svelte-DvkBRiGs.js.map} +1 -1
  136. package/build/server/chunks/{_page.svelte-BJhHWJmc.js → _page.svelte-m6BeiHNT.js} +243 -20
  137. package/build/server/chunks/_page.svelte-m6BeiHNT.js.map +1 -0
  138. package/build/server/chunks/{_page.svelte-DCxXGHjK.js → _page.svelte-wtlCU8w2.js} +154 -30
  139. package/build/server/chunks/_page.svelte-wtlCU8w2.js.map +1 -0
  140. package/build/server/chunks/_server.ts-B-6UpQvl.js +58 -0
  141. package/build/server/chunks/_server.ts-B-6UpQvl.js.map +1 -0
  142. package/build/server/chunks/{_server.ts-ZhQrWUQW.js → _server.ts-BDuFGHAb.js} +6 -7
  143. package/build/server/chunks/{_server.ts-ZhQrWUQW.js.map → _server.ts-BDuFGHAb.js.map} +1 -1
  144. package/build/server/chunks/{_server.ts-DutpjHA8.js → _server.ts-C2P8H9yf.js} +9 -10
  145. package/build/server/chunks/{_server.ts-DutpjHA8.js.map → _server.ts-C2P8H9yf.js.map} +1 -1
  146. package/build/server/chunks/{_server.ts-CGJ42j3N.js → _server.ts-Cc4GZUdk.js} +10 -11
  147. package/build/server/chunks/{_server.ts-CGJ42j3N.js.map → _server.ts-Cc4GZUdk.js.map} +1 -1
  148. package/build/server/chunks/{_server.ts-Bl9noG-f.js → _server.ts-CnWmXWLQ.js} +3 -6
  149. package/build/server/chunks/_server.ts-CnWmXWLQ.js.map +1 -0
  150. package/build/server/chunks/_server.ts-D0MnsD_L.js +49 -0
  151. package/build/server/chunks/_server.ts-D0MnsD_L.js.map +1 -0
  152. package/build/server/chunks/{_server.ts-2gb8qDa8.js → _server.ts-D5JQS4ea.js} +6 -7
  153. package/build/server/chunks/_server.ts-D5JQS4ea.js.map +1 -0
  154. package/build/server/chunks/{_server.ts-BGB7Q8QL.js → _server.ts-DRgEE4a9.js} +6 -7
  155. package/build/server/chunks/{_server.ts-BGB7Q8QL.js.map → _server.ts-DRgEE4a9.js.map} +1 -1
  156. package/build/server/chunks/_server.ts-DpeB79Q0.js +105 -0
  157. package/build/server/chunks/_server.ts-DpeB79Q0.js.map +1 -0
  158. package/build/server/chunks/{_server.ts-Bs80mdDu.js → _server.ts-DuF3teJw.js} +6 -7
  159. package/build/server/chunks/{_server.ts-Bs80mdDu.js.map → _server.ts-DuF3teJw.js.map} +1 -1
  160. package/build/server/chunks/{_server.ts-FrTatnua.js → _server.ts-Dw2E3cRV.js} +6 -7
  161. package/build/server/chunks/{_server.ts-FrTatnua.js.map → _server.ts-Dw2E3cRV.js.map} +1 -1
  162. package/build/server/chunks/{client-BzsV9Fwm.js → client-2hNr7zGI.js} +2 -2
  163. package/build/server/chunks/{client-BzsV9Fwm.js.map → client-2hNr7zGI.js.map} +1 -1
  164. package/build/server/chunks/{error.svelte-CmPavwov.js → error.svelte-lP_oxAFO.js} +4 -4
  165. package/build/server/chunks/{error.svelte-CmPavwov.js.map → error.svelte-lP_oxAFO.js.map} +1 -1
  166. package/build/server/chunks/{eventBus-CyUH4XrO.js → eventBus-AsLh8hO0.js} +446 -24
  167. package/build/server/chunks/eventBus-AsLh8hO0.js.map +1 -0
  168. package/build/server/chunks/{featuresStore.svelte-CVXY1PM9.js → featuresStore.svelte-DIB5OTQr.js} +5 -5
  169. package/build/server/chunks/featuresStore.svelte-DIB5OTQr.js.map +1 -0
  170. package/build/server/chunks/hooks.server-Rv301GTB.js +149 -0
  171. package/build/server/chunks/hooks.server-Rv301GTB.js.map +1 -0
  172. package/build/server/chunks/identityStore.svelte-IIvW2_3b.js +59 -0
  173. package/build/server/chunks/identityStore.svelte-IIvW2_3b.js.map +1 -0
  174. package/build/server/chunks/ids-t7Gjdj0M.js +5 -0
  175. package/build/server/chunks/ids-t7Gjdj0M.js.map +1 -0
  176. package/build/server/chunks/{internal-pRy4ChhS.js → internal-C9UYPNts.js} +3 -2
  177. package/build/server/chunks/{internal-pRy4ChhS.js.map → internal-C9UYPNts.js.map} +1 -1
  178. package/build/server/chunks/{projectsStore.svelte-C48zsx8A.js → projectsStore.svelte-ynWZi-y3.js} +2 -2
  179. package/build/server/chunks/{projectsStore.svelte-C48zsx8A.js.map → projectsStore.svelte-ynWZi-y3.js.map} +1 -1
  180. package/build/server/chunks/{protocol-BQ2wRP2f.js → protocol-3LlFyPP_.js} +4 -2
  181. package/build/server/chunks/protocol-3LlFyPP_.js.map +1 -0
  182. package/build/server/chunks/{snapshotRepository-vwf9zjxI.js → snapshotRepository-CnlyFjuk.js} +354 -8
  183. package/build/server/chunks/snapshotRepository-CnlyFjuk.js.map +1 -0
  184. package/build/server/chunks/{state-BWsD5sNs.js → state-G0m1AxhO.js} +2 -2
  185. package/build/server/chunks/{state-BWsD5sNs.js.map → state-G0m1AxhO.js.map} +1 -1
  186. package/build/server/chunks/{sync-Bwmi4hjA.js → sync-CAWyh7MA.js} +416 -6
  187. package/build/server/chunks/sync-CAWyh7MA.js.map +1 -0
  188. package/build/server/chunks/syncBridge-LiFjnVDY.js +33 -0
  189. package/build/server/chunks/syncBridge-LiFjnVDY.js.map +1 -0
  190. package/build/server/index.js +1 -1
  191. package/build/server/index.js.map +1 -1
  192. package/build/server/manifest.js +33 -19
  193. package/build/server/manifest.js.map +1 -1
  194. package/cli/README.md +129 -25
  195. package/cli/clients/claude-code.ts +33 -5
  196. package/cli/clients/claude-desktop.ts +56 -0
  197. package/cli/clients/cursor.ts +4 -0
  198. package/cli/clients/gemini.ts +5 -1
  199. package/cli/clients/kiro.ts +4 -0
  200. package/cli/clients/registry.ts +3 -3
  201. package/cli/clients/types.ts +24 -1
  202. package/cli/clients/windsurf.ts +4 -0
  203. package/cli/commands/dashboard.ts +41 -13
  204. package/cli/commands/init.ts +195 -69
  205. package/cli/commands/serve.ts +7 -5
  206. package/cli/commands/uninstall.ts +87 -15
  207. package/cli/dashboard-server.mjs +28 -0
  208. package/cli/dashboard-server.ts +84 -0
  209. package/cli/unspa.ts +20 -5
  210. package/cli/util/context-files.ts +4 -2
  211. package/cli/util/skills.ts +4 -3
  212. package/mcp-server/bin.ts +27 -4
  213. package/mcp-server/server.ts +3 -1
  214. package/mcp-server/sync-aware-repos.ts +15 -4
  215. package/mcp-server/sync-notifier.ts +58 -11
  216. package/mcp-server/tools/queue.ts +362 -0
  217. package/package.json +10 -3
  218. package/src/features/behavior-model/infrastructure/persistence/HttpFeatureRepository.ts +5 -4
  219. package/src/features/behavior-model/presentation/components/ActionEditor.svelte +32 -0
  220. package/src/features/behavior-model/presentation/components/FeatureCard.svelte +32 -13
  221. package/src/features/behavior-model/presentation/components/FeatureHeader.svelte +0 -49
  222. package/src/features/behavior-model/presentation/components/HistoryPanel.svelte +44 -2
  223. package/src/features/behavior-model/presentation/components/SurfaceMetaEditor.svelte +44 -9
  224. package/src/features/behavior-model/presentation/stores/featureStore.svelte.ts +10 -0
  225. package/src/features/domains/infrastructure/persistence/HttpDomainRepository.ts +5 -4
  226. package/src/features/implementation-queue/application/use-cases/DequeueQueueItem.ts +32 -0
  227. package/src/features/implementation-queue/application/use-cases/EnqueueQueueItem.ts +157 -0
  228. package/src/features/implementation-queue/application/use-cases/GetNextQueued.ts +39 -0
  229. package/src/features/implementation-queue/application/use-cases/ListQueue.ts +110 -0
  230. package/src/features/implementation-queue/application/use-cases/MoveQueueItem.ts +43 -0
  231. package/src/features/implementation-queue/domain/entities/QueueItem.ts +63 -0
  232. package/src/features/implementation-queue/domain/services/QueueOperations.ts +83 -0
  233. package/src/features/implementation-queue/presentation/components/QueuePanel.svelte +204 -0
  234. package/src/features/implementation-queue/presentation/stores/queueStore.svelte.ts +143 -0
  235. package/src/features/implementation-status/presentation/stores/implementationStatusStore.svelte.ts +2 -1
  236. package/src/features/maturity/domain/MaturityScorer.ts +59 -18
  237. package/src/features/maturity/presentation/components/MaturityPanel.svelte +27 -13
  238. package/src/features/projects/domain/entities/Project.ts +19 -9
  239. package/src/features/projects/domain/entities/ProjectBundle.ts +52 -0
  240. package/src/features/projects/infrastructure/io/ProjectJson.ts +56 -2
  241. package/src/features/projects/infrastructure/io/bundleCrypto.ts +168 -0
  242. package/src/features/projects/infrastructure/persistence/HttpProjectRepository.ts +5 -4
  243. package/src/features/projects/presentation/components/ProjectEditor.svelte +70 -5
  244. package/src/features/projects/presentation/components/ProjectFeaturesPanel.svelte +38 -0
  245. package/src/features/projects/presentation/components/ProjectsIndex.svelte +88 -1
  246. package/src/features/projects/presentation/services/projectBundleClient.ts +152 -0
  247. package/src/features/projects/presentation/stores/projectContextStore.svelte.ts +109 -2
  248. package/src/features/projects/presentation/stores/projectFeaturesStore.svelte.ts +64 -1
  249. package/src/features/projects/presentation/stores/projectStore.svelte.ts +9 -9
  250. package/src/hooks.server.ts +39 -0
  251. package/src/lib/client/sync/YDocClient.ts +26 -1
  252. package/src/lib/client/sync/syncEvents.ts +36 -2
  253. package/src/lib/server/security/auth.ts +137 -0
  254. package/src/lib/server/sync/YDocManager.ts +82 -0
  255. package/src/lib/server/sync/changeDescriptor.ts +448 -0
  256. package/src/lib/server/sync/historyStore.ts +34 -2
  257. package/src/lib/server/sync/identityRegistry.ts +97 -0
  258. package/src/lib/server/sync/syncEventsHub.ts +52 -1
  259. package/src/lib/server/sync/wsServer.ts +83 -11
  260. package/src/lib/server/syncBridge.ts +19 -4
  261. package/src/lib/sync/protocol.ts +22 -2
  262. package/src/routes/+layout.svelte +258 -15
  263. package/src/routes/api/projects/[id]/bundle/+server.ts +48 -0
  264. package/src/routes/api/projects/import/+server.ts +68 -0
  265. package/src/routes/api/sync/events/+server.ts +8 -2
  266. package/src/routes/api/sync/reload/+server.ts +125 -12
  267. package/src/routes/features/+page.svelte +0 -40
  268. package/src/routes/projects/[id]/+page.svelte +19 -10
  269. package/src/routes/tutorial/+page.svelte +167 -24
  270. package/src/shared/identity/identityStore.svelte.ts +86 -0
  271. package/src/shared/infrastructure/container.ts +26 -0
  272. package/src/shared/infrastructure/persistence/snapshotLayout.ts +84 -14
  273. package/src/shared/presentation/components/ProgressBar.svelte +116 -0
  274. package/src/shared/presentation/dialogs/AppDialog.svelte +51 -2
  275. package/src/shared/presentation/dialogs/dialogStore.svelte.ts +37 -1
  276. package/src/shared/presentation/toast/SyncToast.svelte +161 -0
  277. package/src/shared/presentation/toast/syncToastStore.svelte.ts +137 -0
  278. package/src/shared/security/apiFetch.ts +75 -0
  279. package/src/shared/security/authStore.svelte.ts +48 -0
  280. package/vite.config.ts +15 -0
  281. package/build/client/_app/immutable/assets/0.DcqfmGD-.css +0 -2
  282. package/build/client/_app/immutable/assets/0.DcqfmGD-.css.br +0 -0
  283. package/build/client/_app/immutable/assets/0.DcqfmGD-.css.gz +0 -0
  284. package/build/client/_app/immutable/chunks/812UVEbN.js +0 -1
  285. package/build/client/_app/immutable/chunks/812UVEbN.js.br +0 -0
  286. package/build/client/_app/immutable/chunks/812UVEbN.js.gz +0 -0
  287. package/build/client/_app/immutable/chunks/B0pXxvJ_.js +0 -4
  288. package/build/client/_app/immutable/chunks/B0pXxvJ_.js.br +0 -0
  289. package/build/client/_app/immutable/chunks/B0pXxvJ_.js.gz +0 -0
  290. package/build/client/_app/immutable/chunks/B6PktD7d.js +0 -1
  291. package/build/client/_app/immutable/chunks/B6PktD7d.js.br +0 -0
  292. package/build/client/_app/immutable/chunks/B6PktD7d.js.gz +0 -0
  293. package/build/client/_app/immutable/chunks/BWyAKTdb.js +0 -1
  294. package/build/client/_app/immutable/chunks/BWyAKTdb.js.br +0 -0
  295. package/build/client/_app/immutable/chunks/BWyAKTdb.js.gz +0 -0
  296. package/build/client/_app/immutable/chunks/BXB1O8xT.js +0 -1
  297. package/build/client/_app/immutable/chunks/BXB1O8xT.js.br +0 -0
  298. package/build/client/_app/immutable/chunks/BXB1O8xT.js.gz +0 -0
  299. package/build/client/_app/immutable/chunks/BuPUsriW.js +0 -1
  300. package/build/client/_app/immutable/chunks/BuPUsriW.js.br +0 -0
  301. package/build/client/_app/immutable/chunks/BuPUsriW.js.gz +0 -0
  302. package/build/client/_app/immutable/chunks/C5-ob9_L.js +0 -4
  303. package/build/client/_app/immutable/chunks/C5-ob9_L.js.br +0 -2
  304. package/build/client/_app/immutable/chunks/C5-ob9_L.js.gz +0 -0
  305. package/build/client/_app/immutable/chunks/CddLtUUD.js +0 -1
  306. package/build/client/_app/immutable/chunks/CddLtUUD.js.br +0 -1
  307. package/build/client/_app/immutable/chunks/CddLtUUD.js.gz +0 -0
  308. package/build/client/_app/immutable/chunks/CguRSd-5.js.br +0 -0
  309. package/build/client/_app/immutable/chunks/CguRSd-5.js.gz +0 -0
  310. package/build/client/_app/immutable/chunks/Cm5UppHC.js +0 -1
  311. package/build/client/_app/immutable/chunks/Cm5UppHC.js.br +0 -0
  312. package/build/client/_app/immutable/chunks/Cm5UppHC.js.gz +0 -0
  313. package/build/client/_app/immutable/chunks/D1HLO01M.js +0 -1
  314. package/build/client/_app/immutable/chunks/D1HLO01M.js.br +0 -0
  315. package/build/client/_app/immutable/chunks/D1HLO01M.js.gz +0 -0
  316. package/build/client/_app/immutable/chunks/DBv9bGAW.js.br +0 -0
  317. package/build/client/_app/immutable/chunks/DBv9bGAW.js.gz +0 -0
  318. package/build/client/_app/immutable/chunks/DcwZSy0_.js.br +0 -0
  319. package/build/client/_app/immutable/chunks/DcwZSy0_.js.gz +0 -0
  320. package/build/client/_app/immutable/chunks/Gkn8_Gwp.js +0 -3
  321. package/build/client/_app/immutable/chunks/Gkn8_Gwp.js.br +0 -0
  322. package/build/client/_app/immutable/chunks/Gkn8_Gwp.js.gz +0 -0
  323. package/build/client/_app/immutable/chunks/HKdD3bye.js +0 -2
  324. package/build/client/_app/immutable/chunks/HKdD3bye.js.br +0 -0
  325. package/build/client/_app/immutable/chunks/HKdD3bye.js.gz +0 -0
  326. package/build/client/_app/immutable/chunks/NCHnxCls.js +0 -1
  327. package/build/client/_app/immutable/chunks/NCHnxCls.js.br +0 -0
  328. package/build/client/_app/immutable/chunks/NCHnxCls.js.gz +0 -0
  329. package/build/client/_app/immutable/chunks/xXptR8LW.js +0 -1
  330. package/build/client/_app/immutable/chunks/xXptR8LW.js.br +0 -2
  331. package/build/client/_app/immutable/chunks/xXptR8LW.js.gz +0 -0
  332. package/build/client/_app/immutable/entry/app.ByYY2fra.js +0 -2
  333. package/build/client/_app/immutable/entry/app.ByYY2fra.js.br +0 -0
  334. package/build/client/_app/immutable/entry/app.ByYY2fra.js.gz +0 -0
  335. package/build/client/_app/immutable/entry/start.De_6coOa.js +0 -1
  336. package/build/client/_app/immutable/entry/start.De_6coOa.js.br +0 -0
  337. package/build/client/_app/immutable/entry/start.De_6coOa.js.gz +0 -0
  338. package/build/client/_app/immutable/nodes/0.D0WPAGlz.js +0 -1
  339. package/build/client/_app/immutable/nodes/0.D0WPAGlz.js.br +0 -0
  340. package/build/client/_app/immutable/nodes/0.D0WPAGlz.js.gz +0 -0
  341. package/build/client/_app/immutable/nodes/1.D5WaXw6D.js +0 -1
  342. package/build/client/_app/immutable/nodes/1.D5WaXw6D.js.br +0 -1
  343. package/build/client/_app/immutable/nodes/1.D5WaXw6D.js.gz +0 -0
  344. package/build/client/_app/immutable/nodes/2.BFpBzITO.js +0 -1
  345. package/build/client/_app/immutable/nodes/2.BFpBzITO.js.br +0 -0
  346. package/build/client/_app/immutable/nodes/2.BFpBzITO.js.gz +0 -0
  347. package/build/client/_app/immutable/nodes/3.CxjWJwcN.js +0 -3
  348. package/build/client/_app/immutable/nodes/3.CxjWJwcN.js.br +0 -0
  349. package/build/client/_app/immutable/nodes/3.CxjWJwcN.js.gz +0 -0
  350. package/build/client/_app/immutable/nodes/4.CewrRsmy.js +0 -43
  351. package/build/client/_app/immutable/nodes/4.CewrRsmy.js.br +0 -0
  352. package/build/client/_app/immutable/nodes/4.CewrRsmy.js.gz +0 -0
  353. package/build/client/_app/immutable/nodes/5.sRbPcO4Q.js +0 -5
  354. package/build/client/_app/immutable/nodes/5.sRbPcO4Q.js.br +0 -0
  355. package/build/client/_app/immutable/nodes/5.sRbPcO4Q.js.gz +0 -0
  356. package/build/client/_app/immutable/nodes/6.CfR2Y2GG.js +0 -1
  357. package/build/client/_app/immutable/nodes/6.CfR2Y2GG.js.br +0 -0
  358. package/build/client/_app/immutable/nodes/6.CfR2Y2GG.js.gz +0 -0
  359. package/build/client/_app/immutable/nodes/7.BTXfUVeB.js +0 -1
  360. package/build/client/_app/immutable/nodes/7.BTXfUVeB.js.br +0 -0
  361. package/build/client/_app/immutable/nodes/7.BTXfUVeB.js.gz +0 -0
  362. package/build/client/_app/immutable/nodes/8.2rWOh-Qs.js.br +0 -0
  363. package/build/client/_app/immutable/nodes/8.2rWOh-Qs.js.gz +0 -0
  364. package/build/server/chunks/0-D5JsaU3E.js +0 -15
  365. package/build/server/chunks/0-D5JsaU3E.js.map +0 -1
  366. package/build/server/chunks/1-HfMv8lKr.js +0 -9
  367. package/build/server/chunks/2-DDsdfo9q.js +0 -9
  368. package/build/server/chunks/2-DDsdfo9q.js.map +0 -1
  369. package/build/server/chunks/3-C7w_wPmm.js +0 -16
  370. package/build/server/chunks/3-C7w_wPmm.js.map +0 -1
  371. package/build/server/chunks/4-DRJPKVow.js +0 -9
  372. package/build/server/chunks/4-DRJPKVow.js.map +0 -1
  373. package/build/server/chunks/5-B-Ymnm4j.js +0 -9
  374. package/build/server/chunks/5-B-Ymnm4j.js.map +0 -1
  375. package/build/server/chunks/6-DU93GcHy.js +0 -9
  376. package/build/server/chunks/6-DU93GcHy.js.map +0 -1
  377. package/build/server/chunks/7-Cm_ReRiH.js +0 -9
  378. package/build/server/chunks/7-Cm_ReRiH.js.map +0 -1
  379. package/build/server/chunks/8-CVXLl5A5.js +0 -9
  380. package/build/server/chunks/8-CVXLl5A5.js.map +0 -1
  381. package/build/server/chunks/FeatureCard-CxMZdqJi.js.map +0 -1
  382. package/build/server/chunks/FeatureJson-BKVjQ24K.js.map +0 -1
  383. package/build/server/chunks/FeatureSharedStateNormalizer-EsT1Z4Ir.js.map +0 -1
  384. package/build/server/chunks/FeatureValidator-CaGQliNh.js.map +0 -1
  385. package/build/server/chunks/ProjectsIndex-CUZP9o0d.js.map +0 -1
  386. package/build/server/chunks/TransitionCatalog-CoZZTgtm.js.map +0 -1
  387. package/build/server/chunks/_layout.svelte-D4HPV7Sg.js +0 -143
  388. package/build/server/chunks/_layout.svelte-D4HPV7Sg.js.map +0 -1
  389. package/build/server/chunks/_page.svelte-B7Lx87jQ.js.map +0 -1
  390. package/build/server/chunks/_page.svelte-B9wsRBQI.js.map +0 -1
  391. package/build/server/chunks/_page.svelte-BJhHWJmc.js.map +0 -1
  392. package/build/server/chunks/_page.svelte-CgJt00DJ.js.map +0 -1
  393. package/build/server/chunks/_page.svelte-DCxXGHjK.js.map +0 -1
  394. package/build/server/chunks/_server.ts-2gb8qDa8.js.map +0 -1
  395. package/build/server/chunks/_server.ts-Bl9noG-f.js.map +0 -1
  396. package/build/server/chunks/_server.ts-DRvbHDT7.js +0 -48
  397. package/build/server/chunks/_server.ts-DRvbHDT7.js.map +0 -1
  398. package/build/server/chunks/dialogStore.svelte-Ie5XP7SA.js +0 -63
  399. package/build/server/chunks/dialogStore.svelte-Ie5XP7SA.js.map +0 -1
  400. package/build/server/chunks/eventBus-CyUH4XrO.js.map +0 -1
  401. package/build/server/chunks/featuresStore.svelte-CVXY1PM9.js.map +0 -1
  402. package/build/server/chunks/protocol-BQ2wRP2f.js.map +0 -1
  403. package/build/server/chunks/snapshot-discovery-ClqjjpNj.js +0 -245
  404. package/build/server/chunks/snapshot-discovery-ClqjjpNj.js.map +0 -1
  405. package/build/server/chunks/snapshotRepository-vwf9zjxI.js.map +0 -1
  406. package/build/server/chunks/sync-Bwmi4hjA.js.map +0 -1
  407. package/build/server/chunks/syncBridge-CleGV_0k.js +0 -19
  408. package/build/server/chunks/syncBridge-CleGV_0k.js.map +0 -1
  409. package/cli/clients/lovable.ts +0 -25
  410. package/mcp-server/server.test.ts +0 -1432
  411. package/mcp-server/tools/_entity_builders.test.ts +0 -125
  412. package/mcp-server/tools/_shared.test.ts +0 -53
  413. package/mcp-server/tools/implementationStatus.test.ts +0 -118
  414. package/mcp-server/tools/short-ids.test.ts +0 -39
  415. package/src/features/behavior-model/application/use-cases/CreateFeature.test.ts +0 -31
  416. package/src/features/behavior-model/application/use-cases/MutateFeature.test.ts +0 -140
  417. package/src/features/behavior-model/domain/services/EffectApplier.test.ts +0 -127
  418. package/src/features/behavior-model/domain/services/EffectiveEntities.test.ts +0 -98
  419. package/src/features/behavior-model/domain/services/EntityDeducer.test.ts +0 -85
  420. package/src/features/behavior-model/domain/services/EventCatalog.test.ts +0 -124
  421. package/src/features/behavior-model/domain/services/FeatureEmittedEventsNormalizer.test.ts +0 -124
  422. package/src/features/behavior-model/domain/services/FeatureRuleCategoryNormalizer.test.ts +0 -92
  423. package/src/features/behavior-model/domain/services/FeatureSharedStateNormalizer.test.ts +0 -207
  424. package/src/features/behavior-model/domain/services/FeatureTransforms.test.ts +0 -566
  425. package/src/features/behavior-model/domain/services/FeatureValidator.test.ts +0 -560
  426. package/src/features/behavior-model/domain/services/InvariantChecker.test.ts +0 -39
  427. package/src/features/behavior-model/domain/services/ParameterBindings.test.ts +0 -41
  428. package/src/features/behavior-model/domain/services/ParameterValidator.test.ts +0 -196
  429. package/src/features/behavior-model/domain/services/PersonaApplier.test.ts +0 -69
  430. package/src/features/behavior-model/domain/services/ResourceUsage.test.ts +0 -89
  431. package/src/features/behavior-model/domain/services/RuleEvaluator.test.ts +0 -205
  432. package/src/features/behavior-model/domain/services/SharedStateDefinitions.test.ts +0 -61
  433. package/src/features/behavior-model/domain/services/StateValueCoercion.test.ts +0 -64
  434. package/src/features/behavior-model/domain/services/TransitionCatalog.test.ts +0 -109
  435. package/src/features/behavior-model/domain/value-objects/EventName.test.ts +0 -20
  436. package/src/features/behavior-model/domain/value-objects/Expression.test.ts +0 -428
  437. package/src/features/behavior-model/domain/value-objects/StatePath.test.ts +0 -76
  438. package/src/features/behavior-model/domain/value-objects/humanize.test.ts +0 -56
  439. package/src/features/behavior-model/domain/value-objects/slug.test.ts +0 -20
  440. package/src/features/behavior-model/infrastructure/io/FeatureJson.test.ts +0 -51
  441. package/src/features/behavior-model/infrastructure/persistence/JsonFolderFeatureRepository.test.ts +0 -200
  442. package/src/features/behavior-model/infrastructure/persistence/snapshot-discovery.test.ts +0 -67
  443. package/src/features/library/domain/services/BlueprintFilter.test.ts +0 -77
  444. package/src/features/library/infrastructure/blueprints/auth/auth.test.ts +0 -100
  445. package/src/features/library/infrastructure/library.test.ts +0 -28
  446. package/src/features/maturity/domain/MaturityScorer.test.ts +0 -384
  447. package/src/features/mcp-tools/application/tools/dryRunSimulate.test.ts +0 -44
  448. package/src/features/mcp-tools/application/tools/generateTypes.test.ts +0 -59
  449. package/src/features/mcp-tools/application/tools/getAction.test.ts +0 -40
  450. package/src/features/mcp-tools/application/tools/getFeatureIndex.test.ts +0 -37
  451. package/src/features/mcp-tools/application/tools/getNeighborhood.test.ts +0 -101
  452. package/src/features/mcp-tools/application/tools/getSurface.test.ts +0 -34
  453. package/src/features/mcp-tools/application/tools/listActions.test.ts +0 -25
  454. package/src/features/mcp-tools/application/tools/listFeatureIds.test.ts +0 -154
  455. package/src/features/mcp-tools/application/tools/scoreFeature.test.ts +0 -85
  456. package/src/features/simulator/application/use-cases/RunScenarios.test.ts +0 -457
  457. package/src/features/simulator/domain/SimulatorEngine.test.ts +0 -636
  458. package/src/shared/infrastructure/persistence/snapshotLayout.test.ts +0 -218
  459. package/tsconfig.json +0 -16
  460. /package/build/client/_app/immutable/chunks/{D1tqJ3ok.js → DRY_N2lk.js} +0 -0
  461. /package/build/client/_app/immutable/chunks/{D1tqJ3ok.js.br → DRY_N2lk.js.br} +0 -0
  462. /package/build/client/_app/immutable/chunks/{D1tqJ3ok.js.gz → DRY_N2lk.js.gz} +0 -0
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="static/unspaghettit_logo.png" alt="Unspaghettit" width="120" />
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>
@@ -51,13 +51,15 @@ Specs stop being documentation. They become a runtime contract you can break lou
51
51
  ## Core capabilities
52
52
 
53
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, Cursor, Gemini, Windsurf, Kiro, Codex, Lovable).
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
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.
56
56
  - **Maturity scoring**, `score_feature` returns a per-area score with critical/recommended issues; surfaces the worst surfaces and biggest gaps.
57
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.
58
58
  - **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
+ - **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.
59
60
  - **Local-first**, everything lives in your repo. No telemetry, no hosted servers, no cloud dependency. Snapshots are plain JSON.
60
- - **Multi-agent ready**, built-in Yjs WebSocket server lets multiple humans and/or LLMs edit the same runtime in real time.
61
+ - **Multi-agent ready**, built-in Yjs WebSocket server lets multiple humans and/or LLMs edit the same runtime in real time. History entries carry `AI · John` attribution so MCP-driven changes are distinguishable from direct human edits.
62
+ - **Encrypted backup / share**, the project page's **Export .unspa** button bundles project + features + status sidecars into a single AES-GCM-256 / PBKDF2-SHA256 file. Passphrase never leaves the browser; envelope carries no identifier of contents.
61
63
 
62
64
  ## Workflows
63
65
 
@@ -124,12 +126,12 @@ unspa dashboard # opens http://localhost:3000
124
126
  | Client | Project config | Global config |
125
127
  | ------------------------ | ------------------------------- | -------------------------------------- |
126
128
  | 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) |
127
130
  | Cursor | `.cursor/mcp.json` | `~/.cursor/mcp.json` |
128
131
  | Gemini Code Assist / CLI | `.gemini/settings.json` | `~/.gemini/settings.json` |
129
132
  | Windsurf | — | `~/.codeium/windsurf/mcp_config.json` |
130
133
  | Kiro | `.kiro/settings/mcp.json` | `~/.kiro/settings/mcp.json` |
131
134
  | Codex (VS Code) | prints snippet to paste manually | same |
132
- | Lovable | — (hosted UI only) | prints snippet to paste manually |
133
135
 
134
136
  For the manual entries, `unspa init` prints the MCP JSON snippet to copy into the client's MCP settings.
135
137
 
@@ -137,12 +139,51 @@ Re-running `unspa init` is safe, every step is idempotent. Existing entries are
137
139
 
138
140
  Restart your IDE. Your LLM now has the runtime's full tool surface.
139
141
 
142
+ ### Shared snapshot hub
143
+
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:
145
+
146
+ ```bash
147
+ unspa init --hub # default hub at ~/.unspa-hub/unspa
148
+ unspa init --hub /custom/path # override the location
149
+ ```
150
+
151
+ In hub mode:
152
+
153
+ - No local `unspa/` is created in the repo.
154
+ - 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
+ - One `unspa dashboard` run from the hub root serves the same data every client sees.
156
+
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.
158
+
140
159
  For the CLI details (commands, flags, troubleshooting), see [cli/README.md](cli/README.md).
141
160
 
142
161
  ## Example
143
162
 
144
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.
145
164
 
165
+ ## Collaboration
166
+
167
+ Multiple humans + AI agents can edit the same runtime live:
168
+
169
+ - **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.
171
+ - **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.
172
+ - **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
+ - **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
+
175
+ ## Security tiers
176
+
177
+ Unspaghettit is local-first by default. Three tiers, all opt-in beyond the default:
178
+
179
+ | Tier | Setup | What it covers |
180
+ |---|---|---|
181
+ | **Default** | `unspa dashboard` | Loopback bind (`127.0.0.1:3000`). No auth, no telemetry, no callhome. Single-machine trust boundary. |
182
+ | **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
+ | **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
+
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`).
186
+
146
187
  ## Architecture
147
188
 
148
189
  ```
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */
2
+ @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}}@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)}.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}.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}}.-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-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\(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-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-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-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-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-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)}.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)}}.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-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)}.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-\[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-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-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-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-4:is(:where(.group\/chip):hover *){width:calc(var(--spacing) * 4)}.group-hover\/chip\:pr-1:is(:where(.group\/chip):hover *){padding-right:calc(var(--spacing) * 1)}.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-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-600:hover{background-color:var(--color-brand-600)}.hover\:bg-brand-700:hover{background-color:var(--color-brand-700)}.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-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-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\:grid-cols-\[1fr_160px_auto\]{grid-template-columns:1fr 160px auto}.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,5 @@
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,`
2
+ width: ${i(w)??``}%;
3
+ background-color: ${i(E)??``};
4
+ background-image: linear-gradient(180deg, rgba(255,255,255,0.18) 0%, rgba(0,0,0,0.06) 100%);
5
+ `)}),f(d,O)}export{b as t};
@@ -0,0 +1 @@
1
+ import{$ as e,D as t,F as n,H as r,I as i,J as a,L as o,N as s,O as c,P as l,Q as u,U as d,X as f,Y as p,a as m,c as h,ft as g,j as _,k as v,l as y,m as b,n as x,ot as S,p as C,q as w,r as T,s as E,st as D,tt as O,u as k,v as A,w as j,z as M}from"./CB9H0ifB.js";import{t as N}from"./Kkaknqg3.js";import"./CT0T0Gak.js";import{$ as P,Q as F,Y as ee,Z as te,at as ne,n as I,nt as re,rt as ie,st as ae}from"./ChWRqgym.js";import{t as oe}from"./DhaH6JO9.js";import{t as L}from"./CcT88Qay.js";import"./Cq9Rf810.js";import{t as se}from"./DmHqLDCF.js";import{t as ce}from"./CRPPOQ_q.js";import{a as le,i as ue,r as de,s as fe}from"./CYEqQWxZ.js";var R=_(`<a class="block"><p class="line-clamp-3 text-sm leading-6 text-slate-600"> </p></a>`),z=_(`<p class="text-sm leading-6 text-slate-500">No description yet. Add a note so collaborators know what belongs here.</p>`),pe=_(`<article class="group relative flex h-full min-h-52 flex-col justify-between overflow-hidden rounded-xl border border-cyan-100 bg-white p-5 shadow-sm shadow-cyan-950/5 transition duration-150 hover:-translate-y-0.5 hover:border-cyan-200 hover:bg-cyan-50/20 hover:shadow-md hover:shadow-cyan-950/10 focus-within:border-cyan-300"><div class="absolute inset-x-0 top-0 h-1 bg-gradient-to-r from-brand-500 via-brand-mint to-violet-400"></div> <div class="space-y-3"><div class="flex items-start justify-between gap-3"><a class="block min-w-0 flex-1"><h3 class="truncate text-base font-semibold text-slate-950 group-hover:text-brand-800"> </h3></a> <span class="shrink-0 rounded-md border border-cyan-100 bg-cyan-50 px-2 py-0.5 text-xs font-medium text-brand-800" title="Features in project"> </span></div> <!></div> <div class="mt-5 flex items-end justify-between gap-3 border-t border-hairline pt-3 text-xs text-slate-500"><div class="min-w-0 flex-1 space-y-2"><!> <span class="block truncate"> </span></div> <div class="flex shrink-0 items-center gap-1"><a class="rounded px-2 py-1 font-medium text-brand-800 hover:bg-cyan-50 hover:text-brand-900">Open project</a> <button type="button" class="rounded px-2 py-1 text-slate-400 opacity-0 transition group-hover:opacity-100 group-focus-within:opacity-100 hover:bg-red-50 hover:text-red-600"> </button></div></div></article>`);function me(e,i){D(i,!0);let o=m(i,`tagTypeOptions`,19,()=>[]),s=m(i,`deleteLabel`,3,`Delete`);function l(){L.openProject(String(i.summary.id))}var u=pe(),d=f(a(u),2),p=a(d),h=a(p),_=a(h),y=a(_,!0);g(_),g(h);var b=f(h,2),x=a(b);g(b),g(p);var C=f(p,2),w=e=>{var t=R(),o=a(t),s=a(o,!0);g(o),g(t),r(()=>{k(t,`href`,`/projects/${i.summary.id}`),c(s,i.summary.description)}),n(`click`,t,l),v(e,t)},T=e=>{v(e,z())};t(C,e=>{i.summary.description?e(w):e(T,-1)}),g(d);var E=f(d,2),O=a(E),A=a(O);ce(A,{get tags(){return i.summary.tags},get onAddTag(){return i.onAddTag},get onRemoveTag(){return i.onRemoveTag},get typeOptions(){return o()}});var j=f(A,2),M=a(j);g(j),g(O);var N=f(O,2),P=a(N),F=f(P,2),ee=a(F,!0);g(F),g(N),g(E),g(u),r(e=>{k(h,`href`,`/projects/${i.summary.id}`),c(y,i.summary.name),c(x,`${i.summary.featureCount??``} feature${i.summary.featureCount===1?``:`s`}`),c(M,`Updated ${e??``}`),k(P,`href`,`/projects/${i.summary.id}`),c(ee,s())},[()=>new Date(i.summary.updatedAt).toLocaleDateString()]),n(`click`,h,l),n(`click`,P,l),n(`click`,F,function(...e){i.onDelete?.apply(this,e)}),v(e,u),S()}l([`click`]);var he=_(`<form class="grid gap-3 rounded-xl border border-cyan-100 bg-cyan-50/40 p-4 md:grid-cols-[1fr_1.6fr_auto] md:items-end"><div><label for="proj-name" class="mb-1.5 block text-xs font-medium text-slate-700">Project name</label> <input id="proj-name" type="text" placeholder="e.g. Acme Platform" class="h-10 w-full rounded-md border border-cyan-100 bg-white px-3 text-sm outline-none focus:border-brand-700 focus:ring-2 focus:ring-brand-100" required=""/></div> <div><label for="proj-desc" class="mb-1.5 block text-xs font-medium text-slate-700">Description</label> <input id="proj-desc" type="text" placeholder="What product or initiative does this group?" class="h-10 w-full rounded-md border border-cyan-100 bg-white px-3 text-sm outline-none focus:border-brand-700 focus:ring-2 focus:ring-brand-100" required=""/></div> <button type="submit" class="h-10 rounded-md bg-brand-800 px-4 text-sm font-medium text-white hover:bg-brand-900 disabled:cursor-not-allowed disabled:opacity-50"> </button></form>`);function ge(t,n){D(n,!0);let s=e(``),l=e(``),p=e(!1),m=e(null);d(()=>{o(m)&&M().then(()=>o(m)?.focus())});async function _(e){if(e.preventDefault(),!o(p)&&o(s).trim().length!==0&&o(l).trim().length!==0){u(p,!0);try{await n.onSubmit(o(s).trim(),o(l).trim()),u(s,``),u(l,``)}finally{u(p,!1)}}}var b=he(),x=a(b),C=f(a(x),2);y(C),E(C,e=>u(m,e),()=>o(m)),g(x);var w=f(x,2),T=f(a(w),2);y(T),g(w);var O=f(w,2),k=a(O,!0);g(O),g(b),r(e=>{O.disabled=e,c(k,o(p)?`Creating...`:`New project`)},[()=>o(p)||o(s).trim().length===0||o(l).trim().length===0]),i(`submit`,b,_),h(C,()=>o(s),e=>u(s,e)),h(T,()=>o(l),e=>u(l,e)),v(t,b),S()}var _e=_(`<button type="button" class="h-8 rounded-md px-2 text-xs font-medium text-slate-500 hover:bg-slate-50 hover:text-slate-900">Clear</button>`),ve=_(`<button type="button"><span class="text-[10px] uppercase tracking-wider opacity-70"> </span> <span> </span></button>`),ye=_(`<div class="mb-4 flex flex-wrap gap-2"><button type="button">All</button> <button type="button">Untagged</button> <!></div>`),be=_(`<div class="rounded-lg border border-dashed border-hairline bg-white p-8 text-center text-sm text-slate-500">Loading projects...</div>`),xe=_(`<div class="rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700"> </div>`),Se=_(`<div class="space-y-3"><p>No projects yet.</p> <button type="button" class="rounded-md bg-slate-900 px-4 py-2 text-sm font-medium text-white">Create first project</button></div>`),Ce=_(`<div class="rounded-lg border border-dashed border-hairline bg-white p-8 text-center text-sm text-slate-500"><!></div>`),we=_(`<li><!></li>`),Te=_(`<ul class="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3"></ul>`),Ee=_(`<div class="fixed inset-0 z-40 flex items-start justify-center bg-slate-950/30 px-4 py-24 backdrop-blur-sm" role="presentation"><div class="w-full max-w-3xl rounded-xl border border-hairline bg-white shadow-xl" role="dialog" aria-modal="true" aria-labelledby="new-project-title"><header class="flex items-start justify-between gap-4 border-b border-hairline px-5 py-4"><div><h2 id="new-project-title" class="text-base font-semibold text-slate-950">New project</h2> <p class="mt-1 text-sm text-slate-500">Create a project for related behavior models.</p></div> <button type="button" class="rounded-md px-2 py-1 text-sm text-slate-500 hover:bg-slate-100 hover:text-slate-900" aria-label="Close">x</button></header> <div class="p-5"><!></div></div></div>`),De=_(`<div class="mx-auto max-w-7xl px-4 py-8 sm:px-6"><header class="mb-6 border-b border-slate-200 pb-6"><div class="max-w-3xl"><p class="text-xs font-semibold uppercase tracking-wide text-brand-700">Home</p> <h1 class="mt-2 text-4xl font-semibold tracking-tight text-slate-950">Projects</h1> <p class="mt-2 max-w-2xl text-sm leading-6 text-slate-600">Group related behavior models and inspect their resources, data, events, and transitions together.</p></div> <div class="mt-6 flex flex-col gap-3 rounded-xl border border-slate-200 bg-white p-3 shadow-sm shadow-slate-950/5 lg:flex-row lg:items-center lg:justify-between"><div class="flex min-w-0 items-center rounded-lg border border-hairline bg-white p-1 lg:flex-1"><label for="project-search" class="sr-only">Search projects</label> <input id="project-search" type="search" placeholder="Search projects..." class="h-9 w-full min-w-0 rounded-md border-0 bg-transparent px-3 text-sm outline-none placeholder:text-slate-400"/> <!></div> <div class="flex flex-col gap-2 sm:flex-row sm:items-center"><label class="flex h-10 items-center gap-2 rounded-lg border border-hairline bg-white px-3 text-sm text-slate-600"><span class="text-xs font-medium">Sort</span> <select class="bg-transparent text-sm font-medium text-slate-800 outline-none"><option>Updated</option><option>Name</option><option>Features</option></select></label> <button type="button" class="inline-flex h-10 items-center justify-center gap-2 rounded-md border border-slate-300 bg-white px-4 text-sm font-medium text-slate-700 hover:border-brand-300 hover:bg-cyan-50 hover:text-brand-800 disabled:opacity-50" title="Restore a project from a .unspa file"><span aria-hidden="true">⬆</span> </button> <input type="file" accept=".unspa,application/octet-stream,application/json" class="hidden"/> <button type="button" class="inline-flex h-10 items-center justify-center gap-2 rounded-md bg-slate-900 px-4 text-sm font-medium text-white hover:bg-slate-800"><span class="text-base leading-none" aria-hidden="true">+</span> New project</button></div></div></header> <section aria-labelledby="projects-list-title"><div class="mb-3 flex flex-col gap-1 sm:flex-row sm:items-end sm:justify-between"><div><h2 id="projects-list-title" class="text-base font-semibold text-slate-950">Your projects</h2> <p class="text-sm text-slate-500">Open a project to inspect the features it groups.</p></div> <p class="text-xs text-slate-500"> </p></div> <!> <!></section></div> <!>`,1);function Oe(l,d){D(d,!0);let m=null,h=e(`all`),_=e(!1),k=e(`updated`);T(()=>{L.refresh(),m=oe(e=>{(e.kind===`project`||e.kind===`feature`)&&L.refreshSilent()})}),x(()=>{m?.(),m=null});function M(e){let t=[...e.tags??[]];return e.customTag?.trim()&&t.push({type:e.customTagType?.trim()||`Tag`,value:e.customTag.trim()}),t}async function ce(e,t){await N(`/projects/${await L.create(e,t)}`)}let R=e(!1),z=e(null);function pe(){o(R)||o(z)?.click()}async function he(e){let t=e.target,n=t.files?.[0];if(t.value=``,n){u(R,!0);try{let e=await ue(n),t=await ae({title:`Import .unspa file`,message:`Enter the passphrase used when "${n.name}" was exported. A wrong passphrase will not corrupt anything — the file just stays encrypted.`,inputLabel:`Passphrase`,password:!0,confirmLabel:`Import`,tone:`info`});if(t===null)return;let r=await de(e,t);await L.refreshSilent(),await re({title:`Import complete`,message:`Restored project with ${r.featuresImported} feature(s) and ${r.statusesImported} implementation-status sidecar(s).`,tone:`success`}),await N(`/projects/${r.projectId}`)}catch(e){await re({title:`Import failed`,message:e instanceof le?`That file is not a valid .unspa bundle: ${e.message}`:e instanceof fe?e.message:`Import failed: ${e.message}`,tone:`danger`})}finally{u(R,!1)}}}async function Oe(e){L.stagePendingDelete(e);let t=L.summaries.find(t=>String(t.id)===String(e))?.name??`this project`,n=await I(),r=((await n.useCases.getProject(e))?.featureIds??[]).map(String),i=[];if(r.length===0){if(!await ne({title:`Delete "${t}"?`,message:`This project has no linked features. Removing it cannot be undone.`,confirmLabel:`Delete project`,tone:`danger`})){L.clearPendingDelete();return}}else{let e=await Promise.all(r.map(async e=>({id:e,label:(await n.useCases.getFeatureCard(e))?.name??e,defaultChecked:!0}))),a=await ie({title:`Delete "${t}"?`,message:`This project links to ${r.length} feature${r.length===1?``:`s`}. Tick the ones you want to delete in the same batch. Anything left unchecked stays available as an unassigned feature.`,items:e,confirmLabel:`Delete project + selected`,cancelLabel:`Cancel`,tone:`danger`});if(!a.confirmed){L.clearPendingDelete();return}i=a.selectedIds}for(let e of i)await n.useCases.deleteFeature(e);await L.remove(e),i.length>0&&await se.refreshSilent()}function ke(e){e.key===`Escape`&&u(_,!1)}let B=O(()=>(L.search.trim().length===0?[...L.summaries]:L.summaries.filter(e=>{let t=L.search.toLowerCase();return e.name.toLowerCase().includes(t)||(e.description??``).toLowerCase().includes(t)})).filter(e=>o(h)===`all`?!0:o(h)===`untagged`?M(e).length===0:M(e).some(e=>F(e)===o(h))).sort((e,t)=>o(k)===`name`?e.name.localeCompare(t.name):o(k)===`count`?t.featureCount-e.featureCount:new Date(t.updatedAt).getTime()-new Date(e.updatedAt).getTime())),V=O(()=>{let e=new Map;for(let t of L.summaries)for(let n of M(t)){let t=F(n);e.set(t,{...n,key:t,label:P(n)})}return[...e.values()].sort((e,t)=>e.label.localeCompare(t.label))}),Ae=O(()=>[...new Set(o(V).map(e=>e.type))].sort((e,t)=>e.localeCompare(t)));async function je(e,t,n){let r=await I(),i=await r.useCases.getProject(e);i&&(await r.useCases.saveProject({...i,tags:ee(M(i),{type:t,value:n})}),await L.refreshSilent())}async function Me(e,t,n){let r=await I(),i=await r.useCases.getProject(e);if(!i)return;let a=te(M(i),{type:t,value:n});await r.useCases.saveProject({...i,tags:a,customTagType:void 0,customTag:void 0}),o(h)===F({type:t,value:n})&&u(h,`all`),await L.refreshSilent()}var Ne=De();i(`keydown`,w,ke);var H=p(Ne),U=a(H),Pe=f(a(U),2),W=a(Pe),G=f(a(W),2);y(G);var Fe=f(G,2),Ie=e=>{var t=_e();n(`click`,t,()=>L.setSearch(``)),v(e,t)},Le=O(()=>L.search.trim().length>0);t(Fe,e=>{o(Le)&&e(Ie)}),g(W);var Re=f(W,2),K=a(Re),q=f(a(K),2),J=a(q);J.value=J.__value=`updated`;var Y=f(J);Y.value=Y.__value=`name`;var ze=f(Y);ze.value=ze.__value=`count`,g(q),g(K);var X=f(K,2),Be=f(a(X));g(X);var Z=f(X,2);E(Z,e=>u(z,e),()=>o(z));var Ve=f(Z,2);g(Re),g(Pe),g(U);var He=f(U,2),Q=a(He),Ue=f(a(Q),2),We=a(Ue);g(Ue),g(Q);var $=f(Q,2),Ge=e=>{var t=ye(),i=a(t),s=f(i,2);j(f(s,2),17,()=>o(V),e=>e.key,(e,t)=>{var i=ve(),s=a(i),l=a(s,!0);g(s);var d=f(s,2),p=a(d,!0);g(d),g(i),r(()=>{A(i,1,`inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs font-medium ${o(h)===o(t).key?`border-slate-900 bg-slate-900 text-white`:`border-emerald-100 bg-emerald-50 text-emerald-700 hover:border-emerald-200`}`),c(l,o(t).type),c(p,o(t).value)}),n(`click`,i,()=>u(h,o(t).key,!0)),v(e,i)}),g(t),r(()=>{A(i,1,`rounded-full border px-3 py-1 text-xs font-medium ${o(h)===`all`?`border-slate-900 bg-slate-900 text-white`:`border-slate-200 bg-white text-slate-600 hover:border-slate-300`}`),A(s,1,`rounded-full border px-3 py-1 text-xs font-medium ${o(h)===`untagged`?`border-slate-900 bg-slate-900 text-white`:`border-slate-200 bg-white text-slate-500 hover:border-slate-300`}`)}),n(`click`,i,()=>u(h,`all`)),n(`click`,s,()=>u(h,`untagged`)),v(e,t)};t($,e=>{o(V).length>0&&e(Ge)});var Ke=f($,2),qe=e=>{v(e,be())},Je=e=>{var t=xe(),n=a(t,!0);g(t),r(()=>c(n,L.error)),v(e,t)},Ye=e=>{var r=Ce(),i=a(r),o=e=>{var t=Se(),r=f(a(t),2);g(t),n(`click`,r,()=>u(_,!0)),v(e,t)},c=e=>{v(e,s(`No projects match your search.`))};t(i,e=>{L.summaries.length===0?e(o):e(c,-1)}),g(r),v(e,r)},Xe=e=>{var t=Te();j(t,21,()=>o(B),e=>e.id,(e,t)=>{var n=we();me(a(n),{get summary(){return o(t)},get tagTypeOptions(){return o(Ae)},onAddTag:(e,n)=>je(o(t).id,e,n),onRemoveTag:(e,n)=>Me(o(t).id,e,n),onDelete:()=>Oe(o(t).id)}),g(n),v(e,n)}),g(t),v(e,t)};t(Ke,e=>{L.loading?e(qe):L.error?e(Je,1):o(B).length===0?e(Ye,2):e(Xe,-1)}),g(He),g(H);var Ze=f(H,2),Qe=e=>{var t=Ee(),r=a(t),i=a(r),o=f(a(i),2);g(i);var s=f(i,2);ge(a(s),{onSubmit:ce}),g(s),g(r),g(t),n(`click`,t,e=>{e.currentTarget===e.target&&u(_,!1)}),n(`click`,o,()=>u(_,!1)),v(e,t)};t(Ze,e=>{o(_)&&e(Qe)}),r(()=>{C(G,L.search),X.disabled=o(R),c(Be,` ${o(R)?`Importing...`:`Import .unspa`}`),c(We,`${o(B).length??``} shown`)}),n(`input`,G,e=>L.setSearch(e.target.value)),b(q,()=>o(k),e=>u(k,e)),n(`click`,X,pe),n(`change`,Z,he),n(`click`,Ve,()=>u(_,!0)),v(l,Ne),S()}l([`input`,`click`,`change`]);export{Oe as t};
@@ -0,0 +1,2 @@
1
+ import{D as e,F as t,H as n,J as r,L as i,O as a,P as o,X as s,Y as c,a as l,ft as u,j as d,k as f,ot as p,st as m,tt as h,u as g,v as _}from"./CB9H0ifB.js";import"./CT0T0Gak.js";import{t as v}from"./CRPPOQ_q.js";import{t as y}from"./7CWAShXO.js";var ee=d(`<a class="block"><p class="line-clamp-3 text-sm leading-6 text-slate-600"> </p></a>`),te=d(`<p class="text-sm leading-6 text-slate-500">No description yet. Open this feature to shape its behavior model.</p>`),ne=d(`<span class="px-1">/</span>`),re=d(`<span class="text-red-600"> </span> <!>`,1),b=d(`<span class="text-amber-700"> </span>`),x=d(`<span class="text-emerald-700">All checks pass</span>`),S=d(`<button type="button"> </button>`),ie=d(`<article class="group relative flex h-full min-h-52 flex-col justify-between overflow-hidden rounded-xl border border-cyan-100 bg-white p-5 shadow-sm shadow-cyan-950/5 transition duration-150 hover:-translate-y-0.5 hover:border-cyan-200 hover:bg-cyan-50/20 hover:shadow-md hover:shadow-cyan-950/10 focus-within:border-cyan-300"><div></div> <div class="space-y-4"><div class="flex items-start justify-between gap-3"><a class="block min-w-0 flex-1"><h3 class="truncate text-base font-semibold text-slate-950 group-hover:text-brand-800"> </h3></a> <span title="Maturity score"> </span></div> <!> <!> <div class="space-y-2"><!> <div class="text-xs text-slate-500"><!> <!> <!></div></div></div> <div class="mt-5 flex items-center justify-between gap-3 border-t border-hairline pt-3 text-xs text-slate-500"><span class="min-w-0 flex-1 truncate"> </span> <div class="flex shrink-0 items-center gap-1"><!> <a class="rounded px-2 py-1 font-medium text-brand-800 hover:bg-cyan-50 hover:text-brand-900"> </a> <button type="button" class="rounded px-2 py-1 text-slate-400 opacity-0 transition group-hover:opacity-100 group-focus-within:opacity-100 hover:bg-red-50 hover:text-red-600"> </button></div></div></article>`);function C(o,d){m(d,!0);let C=l(d,`tagTypeOptions`,19,()=>[]),w=l(d,`deleteLabel`,3,`Delete`),T=l(d,`openLabel`,3,`Open feature`),E=l(d,`queued`,3,!1),D=h(()=>d.summary.maturityPercentage>=80?`bg-emerald-50 text-emerald-700 border-emerald-200`:d.summary.maturityPercentage>=50?`bg-amber-50 text-amber-800 border-amber-200`:`bg-red-50 text-red-700 border-red-200`),O=h(()=>d.summary.maturityPercentage>=80?`from-emerald-400 via-brand-mint to-brand-500`:d.summary.maturityPercentage>=50?`from-amber-400 via-brand-ochre to-brand-peach`:`from-red-400 via-brand-coral to-brand-pink`);var k=ie(),A=r(k),j=s(A,2),M=r(j),N=r(M),P=r(N),ae=r(P,!0);u(P),u(N);var F=s(N,2),I=r(F);u(F),u(M);var L=s(M,2),R=e=>{var t=ee(),i=r(t),o=r(i,!0);u(i),u(t),n(()=>{g(t,`href`,`/features/${d.summary.id}`),a(o,d.summary.description)}),f(e,t)},z=e=>{f(e,te())};e(L,e=>{d.summary.description?e(R):e(z,-1)});var B=s(L,2);v(B,{get tags(){return d.summary.tags},get onAddTag(){return d.onAddTag},get onRemoveTag(){return d.onRemoveTag},get typeOptions(){return C()}});var V=s(B,2),H=r(V);y(H,{get percentage(){return d.summary.maturityPercentage},size:`sm`,get ariaLabel(){return`Maturity ${d.summary.maturityPercentage??``}%`}});var U=s(H,2),W=r(U),G=t=>{var i=re(),o=c(i),l=r(o);u(o);var p=s(o,2),m=e=>{f(e,ne())};e(p,e=>{d.summary.recommendedIssueCount>0&&e(m)}),n(()=>a(l,`${d.summary.criticalIssueCount??``} critical`)),f(t,i)};e(W,e=>{d.summary.criticalIssueCount>0&&e(G)});var K=s(W,2),q=e=>{var t=b(),i=r(t);u(t),n(()=>a(i,`${d.summary.recommendedIssueCount??``} recommended`)),f(e,t)};e(K,e=>{d.summary.recommendedIssueCount>0&&e(q)});var oe=s(K,2),se=e=>{f(e,x())};e(oe,e=>{d.summary.criticalIssueCount===0&&d.summary.recommendedIssueCount===0&&e(se)}),u(U),u(V),u(j);var J=s(j,2),Y=r(J),ce=r(Y);u(Y);var X=s(Y,2),Z=r(X),le=e=>{var i=S(),o=r(i,!0);u(i),n(()=>{_(i,1,`rounded px-2 py-1 transition ${E()?`font-medium text-brand-700 opacity-100 hover:bg-cyan-50 hover:text-brand-900`:`text-slate-400 opacity-0 hover:bg-cyan-50 hover:text-brand-800 group-hover:opacity-100 group-focus-within:opacity-100`}`),g(i,`title`,E()?`In implementation queue (click to remove)`:`Add to implementation queue`),a(o,E()?`✓ queued`:`+ queue`)}),t(`click`,i,function(...e){(E()?d.onRemoveFromQueue:d.onAddToQueue)?.apply(this,e)}),f(e,i)};e(Z,e=>{(d.onAddToQueue||d.onRemoveFromQueue)&&e(le)});var Q=s(Z,2),ue=r(Q,!0);u(Q);var $=s(Q,2),de=r($,!0);u($),u(X),u(J),u(k),n(e=>{_(A,1,`absolute inset-x-0 top-0 h-1 bg-linear-to-r ${i(O)??``}`),g(N,`href`,`/features/${d.summary.id}`),a(ae,d.summary.name),_(F,1,`shrink-0 rounded-md border px-2 py-0.5 text-xs font-medium ${i(D)??``}`),a(I,`${d.summary.maturityPercentage??``}%`),a(ce,`${d.summary.surfaceCount??``} surface${d.summary.surfaceCount===1?``:`s`} / ${d.summary.actionCount??``}
2
+ capabilit${d.summary.actionCount===1?`y`:`ies`} / Updated ${e??``}`),g(Q,`href`,`/features/${d.summary.id}`),a(ue,T()),a(de,w())},[()=>new Date(d.summary.updatedAt).toLocaleDateString()]),t(`click`,$,function(...e){d.onDelete?.apply(this,e)}),f(o,k),p()}o([`click`]);export{C as t};
@@ -0,0 +1,3 @@
1
+ var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r},n=Array.isArray,r=Array.prototype.indexOf,i=Array.prototype.includes,a=Array.from,o=Object.defineProperty,s=Object.getOwnPropertyDescriptor,c=Object.getOwnPropertyDescriptors,l=Object.prototype,u=Array.prototype,d=Object.getPrototypeOf,f=Object.isExtensible;function p(e){return typeof e==`function`}var m=()=>{};function h(e){return e()}function g(e){for(var t=0;t<e.length;t++)e[t]()}function _(){var e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}}var v=1024,y=2048,b=4096,x=8192,S=16384,ee=32768,te=1<<25,ne=65536,re=1<<18,ie=1<<19,ae=1<<20,oe=1<<25,se=65536,ce=1<<21,le=1<<22,ue=1<<23,de=Symbol(`$state`),fe=Symbol(`legacy props`),pe=Symbol(``),me=Symbol(`attributes`),he=Symbol(`class`),ge=Symbol(`style`),_e=Symbol(`text`),ve=Symbol(`form reset`),ye=new class extends Error{name=`StaleReactionError`;message="The reaction that called `getAbortSignal()` was re-run or destroyed"},be=!!globalThis.document?.contentType&&globalThis.document.contentType.includes(`xml`);function xe(e){throw Error(`https://svelte.dev/e/experimental_async_required`)}function Se(e){throw Error(`https://svelte.dev/e/lifecycle_outside_component`)}function Ce(){throw Error(`https://svelte.dev/e/missing_context`)}function we(){throw Error(`https://svelte.dev/e/async_derived_orphan`)}function Te(e,t,n){throw Error(`https://svelte.dev/e/each_key_duplicate`)}function Ee(e){throw Error(`https://svelte.dev/e/effect_in_teardown`)}function De(){throw Error(`https://svelte.dev/e/effect_in_unowned_derived`)}function Oe(e){throw Error(`https://svelte.dev/e/effect_orphan`)}function ke(){throw Error(`https://svelte.dev/e/effect_update_depth_exceeded`)}function Ae(){throw Error(`https://svelte.dev/e/fork_discarded`)}function je(){throw Error(`https://svelte.dev/e/fork_timing`)}function Me(){throw Error(`https://svelte.dev/e/get_abort_signal_outside_reaction`)}function Ne(){throw Error(`https://svelte.dev/e/hydration_failed`)}function Pe(e){throw Error(`https://svelte.dev/e/lifecycle_legacy_only`)}function Fe(e){throw Error(`https://svelte.dev/e/props_invalid_value`)}function Ie(){throw Error(`https://svelte.dev/e/set_context_after_init`)}function Le(){throw Error(`https://svelte.dev/e/state_descriptors_fixed`)}function Re(){throw Error(`https://svelte.dev/e/state_prototype_fixed`)}function ze(){throw Error(`https://svelte.dev/e/state_unsafe_mutation`)}function Be(){throw Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`)}var Ve={},C=Symbol(`uninitialized`),He=`http://www.w3.org/1999/xhtml`;function Ue(){console.warn(`https://svelte.dev/e/derived_inert`)}function We(e){console.warn(`https://svelte.dev/e/hydratable_missing_but_expected`)}function Ge(e){console.warn(`https://svelte.dev/e/hydration_mismatch`)}function Ke(){console.warn(`https://svelte.dev/e/select_multiple_invalid_value`)}function qe(){console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`)}var w=!1;function T(e){w=e}var E;function D(e){if(e===null)throw Ge(),Ve;return E=e}function Je(){return D(R(E))}function Ye(e){if(w){if(R(E)!==null)throw Ge(),Ve;E=e}}function Xe(e=1){if(w){for(var t=e,n=E;t--;)n=R(n);E=n}}function Ze(e=!0){for(var t=0,n=E;;){if(n.nodeType===8){var r=n.data;if(r===`]`){if(t===0)return n;--t}else (r===`[`||r===`[!`||r[0]===`[`&&!isNaN(Number(r.slice(1))))&&(t+=1)}var i=R(n);e&&n.remove(),n=i}}function Qe(e){if(!e||e.nodeType!==8)throw Ge(),Ve;return e.data}function $e(e){return e===this.v}function et(e,t){return e==e?e!==t||typeof e==`object`&&!!e||typeof e==`function`:t==t}function tt(e){return!et(e,this.v)}var O=!1,nt=!1;function rt(){nt=!0}var it=[];function at(e,t=!1,n=!1){return ot(e,new Map,``,it,null,n)}function ot(e,t,r,i,a=null,o=!1){if(typeof e==`object`&&e){var s=t.get(e);if(s!==void 0)return s;if(e instanceof Map)return new Map(e);if(e instanceof Set)return new Set(e);if(n(e)){var c=Array(e.length);t.set(e,c),a!==null&&t.set(a,c);for(var u=0;u<e.length;u+=1){var f=e[u];u in e&&(c[u]=ot(f,t,r,i,null,o))}return c}if(d(e)===l){c={},t.set(e,c),a!==null&&t.set(a,c);for(var p of Object.keys(e))c[p]=ot(e[p],t,r,i,null,o);return c}if(e instanceof Date)return structuredClone(e);if(typeof e.toJSON==`function`&&!o)return ot(e.toJSON(),t,r,i,e)}if(e instanceof EventTarget)return e;try{return structuredClone(e)}catch{return e}}var k=null;function st(e){k=e}function ct(){let e={};return[()=>(dt(e)||Ce(),lt(e)),t=>ut(e,t)]}function lt(e){return gt(`getContext`).get(e)}function ut(e,t){let n=gt(`setContext`);if(O){var r=G.f;!H&&r&32&&!k.i||Ie()}return n.set(e,t),t}function dt(e){return gt(`hasContext`).has(e)}function ft(){return gt(`getAllContexts`)}function pt(e,t=!1,n){k={p:k,i:!1,c:null,e:null,s:e,x:null,r:G,l:nt&&!t?{s:null,u:null,$:[]}:null}}function mt(e){var t=k,n=t.e;if(n!==null){t.e=null;for(var r of n)or(r)}return e!==void 0&&(t.x=e),t.i=!0,k=t.p,e??{}}function ht(){return!nt||k!==null&&k.l===null}function gt(e){return k===null&&Se(e),k.c??=new Map(_t(k)||void 0)}function _t(e){let t=e.p;for(;t!==null;){let e=t.c;if(e!==null)return e;t=t.p}return null}var vt=[];function yt(){var e=vt;vt=[],g(e)}function A(e){if(vt.length===0&&!Vt){var t=vt;queueMicrotask(()=>{t===vt&&yt()})}vt.push(e)}function bt(){for(;vt.length>0;)yt()}function xt(e){var t=G;if(t===null)return H.f|=ue,e;if(!(t.f&32768)&&!(t.f&4))throw e;St(e,t)}function St(e,t){for(;t!==null;){if(t.f&128){if(!(t.f&32768))throw e;try{t.b.error(e);return}catch(t){e=t}}t=t.parent}throw e}var Ct=~(y|b|v);function j(e,t){e.f=e.f&Ct|t}function wt(e){e.f&512||e.deps===null?j(e,v):j(e,b)}function Tt(e){if(e!==null)for(let t of e)!(t.f&2)||!(t.f&65536)||(t.f^=se,Tt(t.deps))}function Et(e,t,n){e.f&2048?t.add(e):e.f&4096&&n.add(e),Tt(e.deps),j(e,v)}function Dt(e,t,n){if(e==null)return t(void 0),n&&n(void 0),m;let r=Q(()=>e.subscribe(t,n));return r.unsubscribe?()=>r.unsubscribe():r}var Ot=[];function kt(e,t=m){let n=null,r=new Set;function i(t){if(et(e,t)&&(e=t,n)){let t=!Ot.length;for(let t of r)t[1](),Ot.push(t,e);if(t){for(let e=0;e<Ot.length;e+=2)Ot[e][0](Ot[e+1]);Ot.length=0}}}function a(t){i(t(e))}function o(o,s=m){let c=[o,s];return r.add(c),r.size===1&&(n=t(i,a)||m),o(e),()=>{r.delete(c),r.size===0&&n&&(n(),n=null)}}return{set:i,update:a,subscribe:o}}function At(e){let t;return Dt(e,e=>t=e)(),t}var jt=!1,Mt=!1,Nt=Symbol(`unmounted`);function Pt(e,t,n){let r=n[t]??={store:null,source:kn(void 0),unsubscribe:m};if(r.store!==e&&!(Nt in n))if(r.unsubscribe(),r.store=e??null,e==null)r.source.v=void 0,r.unsubscribe=m;else{var i=!0;r.unsubscribe=Dt(e,e=>{i?r.source.v=e:F(r.source,e)}),i=!1}return e&&Nt in n?At(e):Z(r.source)}function Ft(){let e={};function t(){ir(()=>{for(var t in e)e[t].unsubscribe();o(e,Nt,{enumerable:!1,value:!0})})}return[e,t]}function It(e){var t=Mt;try{return Mt=!1,[e(),Mt]}finally{Mt=t}}var Lt=null,Rt=null,M=null,zt=null,N=null,Bt=null,Vt=!1,Ht=!1,Ut=null,Wt=null,Gt=0,Kt=1,qt=class e{id=Kt++;#e=!1;linked=!0;#t=null;#n=null;async_deriveds=new Map;current=new Map;previous=new Map;unblocked=new Set;#r=new Set;#i=new Set;#a=new Set;#o=0;#s=new Map;#c=null;#l=[];#u=[];#d=new Set;#f=new Set;#p=new Map;#m=new Set;is_fork=!1;#h=!1;#g(){if(this.is_fork)return!0;for(let n of this.#s.keys()){for(var e=n,t=!1;e.parent!==null;){if(this.#p.has(e)){t=!0;break}e=e.parent}if(!t)return!0}return!1}skip_effect(e){this.#p.has(e)||this.#p.set(e,{d:[],m:[]}),this.#m.delete(e)}unskip_effect(e,t=e=>this.schedule(e)){var n=this.#p.get(e);if(n){this.#p.delete(e);for(var r of n.d)j(r,y),t(r);for(r of n.m)j(r,b),t(r)}this.#m.add(e)}#_(){if(this.#e=!0,Gt++>1e3&&(this.#w(),Yt()),!this.#g()){for(let e of this.#d)this.#f.delete(e),j(e,y),this.schedule(e);for(let e of this.#f)j(e,b),this.schedule(e)}let t=this.#l;this.#l=[],this.apply();var n=Ut=[],r=[],i=Wt=[];for(let e of t)try{this.#v(e,n,r)}catch(t){throw nn(e),t}if(M=null,i.length>0){var a=e.ensure();for(let e of i)a.schedule(e)}if(Ut=null,Wt=null,this.#g()){this.#x(r),this.#x(n);for(let[e,t]of this.#p)tn(e,t);i.length>0&&M.#_();return}let o=this.#y();if(o){o.#b(this);return}this.#d.clear(),this.#f.clear();for(let e of this.#r)e(this);this.#r.clear(),zt=this,Xt(r),Xt(n),zt=null,this.#c?.resolve();var s=M;if(this.linked&&this.#o===0&&this.#w(),O&&!this.linked&&(this.#S(),M=s),this.#l.length>0){s===null&&(s=this,this.#C());let e=s;e.#l.push(...this.#l.filter(t=>!e.#l.includes(t)))}s!==null&&s.#_()}#v(e,t,n){e.f^=v;for(var r=e.first;r!==null;){var i=r.f,a=(i&96)!=0;if(!(a&&i&1024||i&8192||this.#p.has(r))&&r.fn!==null){a?r.f^=v:i&4?t.push(r):O&&i&16777224?n.push(r):Fr(r)&&(i&16&&this.#f.add(r),Br(r));var o=r.first;if(o!==null){r=o;continue}}for(;r!==null;){var s=r.next;if(s!==null){r=s;break}r=r.parent}}}#y(){for(var e=this.#t;e!==null;){if(!e.is_fork){for(let[t,[,n]]of this.current)if(e.current.has(t)&&!n)return e}e=e.#t}return null}#b(e){for(let[t,n]of e.current)!this.previous.has(t)&&e.previous.has(t)&&this.previous.set(t,e.previous.get(t)),this.current.set(t,n);for(let[t,n]of e.async_deriveds){let e=this.async_deriveds.get(t);e&&n.promise.then(e.resolve)}let t=e=>{var n=e.reactions;if(n!==null)for(let e of n){var r=e.f;if(r&2)t(e);else{var i=e;r&4194320&&!this.async_deriveds.has(i)&&(this.#f.delete(i),j(i,y),this.schedule(i))}}};for(let e of this.current.keys())t(e);this.oncommit(()=>e.discard()),e.#w(),M=this,this.#_()}#x(e){for(var t=0;t<e.length;t+=1)Et(e[t],this.#d,this.#f)}capture(e,t,n=!1){e.v!==C&&!this.previous.has(e)&&this.previous.set(e,e.v),e.f&8388608||(this.current.set(e,[t,n]),N?.set(e,t)),this.is_fork||(e.v=t)}activate(){M=this}deactivate(){M=null,N=null}flush(){try{Ht=!0,M=this,this.#_()}finally{Gt=0,Bt=null,Ut=null,Wt=null,Ht=!1,M=null,N=null,wn.clear()}}discard(){for(let e of this.#i)e(this);this.#i.clear(),this.#a.clear(),this.#w()}register_created_effect(e){this.#u.push(e)}#S(){this.#w();for(let l=Lt;l!==null;l=l.#n){var e=l.id<this.id,t=[];for(let[r,[i,a]]of this.current){if(l.current.has(r)){var n=l.current.get(r)[0];if(e&&i!==n)l.current.set(r,[i,a]);else continue}t.push(r)}if(e)for(let[e,t]of this.async_deriveds){let n=l.async_deriveds.get(e);n&&t.promise.then(n.resolve)}if(l.#e){var r=[...l.current.keys()].filter(e=>!this.current.has(e));if(r.length===0)e&&l.discard();else if(t.length>0){if(e)for(let e of this.#m)l.unskip_effect(e,e=>{e.f&4194320?l.schedule(e):l.#x([e])});l.activate();var i=new Set,a=new Map;for(var o of t)Zt(o,r,i,a);a=new Map;var s=[...l.current.keys()].filter(e=>this.current.has(e)?this.current.get(e)[0]!==e.v:!0);if(s.length>0)for(let e of this.#u)!(e.f&155648)&&$t(e,s,a)&&(e.f&4194320?(j(e,y),l.schedule(e)):l.#d.add(e));if(l.#l.length>0&&!l.#h){l.apply();for(var c of l.#l)l.#v(c,[],[]);l.#l=[]}l.deactivate()}}}}increment(e,t){if(this.#o+=1,e){let e=this.#s.get(t)??0;this.#s.set(t,e+1)}}decrement(e,t){if(--this.#o,e){let e=this.#s.get(t)??0;e===1?this.#s.delete(t):this.#s.set(t,e-1)}this.#h||(this.#h=!0,A(()=>{this.#h=!1,this.linked&&this.flush()}))}transfer_effects(e,t){for(let t of e)this.#d.add(t);for(let e of t)this.#f.add(e);e.clear(),t.clear()}oncommit(e){this.#r.add(e)}ondiscard(e){this.#i.add(e)}on_fork_commit(e){this.#a.add(e)}run_fork_commit_callbacks(){for(let e of this.#a)e(this);this.#a.clear()}settled(){return(this.#c??=_()).promise}static ensure(){if(M===null){let t=M=new e;t.#C(),!Ht&&!Vt&&A(()=>{t.#e||t.flush()})}return M}apply(){if(!O||!this.is_fork&&this.#t===null&&this.#n===null){N=null;return}N=new Map;for(let[e,[t]]of this.current)N.set(e,t);for(let t=Lt;t!==null;t=t.#n)if(!(t===this||t.is_fork)){var e=!1;if(t.id<this.id){for(let[n,[,r]]of t.current)if(!r&&this.current.has(n)){e=!0;break}}if(!e)for(let[e,n]of t.previous)N.has(e)||N.set(e,n)}}schedule(e){if(Bt=e,e.b?.is_pending&&e.f&16777228&&!(e.f&32768)){e.b.defer_effect(e);return}for(var t=e;t.parent!==null;){t=t.parent;var n=t.f;if(Ut!==null&&t===G&&(O||(H===null||!(H.f&2))&&!jt))return;if(n&96){if(!(n&1024))return;t.f^=v}}this.#l.push(t)}#C(){Rt===null?Lt=Rt=this:(Rt.#n=this,this.#t=Rt),Rt=this}#w(){var e=this.#t,t=this.#n;e===null?Lt=t:e.#n=t,t===null?Rt=e:t.#t=e,this.linked=!1}};function Jt(e){var t=Vt;Vt=!0;try{var n;for(e&&(M!==null&&!M.is_fork&&M.flush(),n=e());;){if(bt(),M===null)return n;M.flush()}}finally{Vt=t}}function Yt(){try{ke()}catch(e){St(e,Bt)}}var P=null;function Xt(e){var t=e.length;if(t!==0){for(var n=0;n<t;){var r=e[n++];if(!(r.f&24576)&&Fr(r)&&(P=new Set,Br(r),r.deps===null&&r.first===null&&r.nodes===null&&r.teardown===null&&r.ac===null&&vr(r),P?.size>0)){wn.clear();for(let e of P){if(e.f&24576)continue;let t=[e],n=e.parent;for(;n!==null;)P.has(n)&&(P.delete(n),t.push(n)),n=n.parent;for(let e=t.length-1;e>=0;e--){let n=t[e];n.f&24576||Br(n)}}P.clear()}}P=null}}function Zt(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(let i of e.reactions){let e=i.f;e&2?Zt(i,t,n,r):e&4194320&&!(e&2048)&&$t(i,t,r)&&(j(i,y),en(i))}}function Qt(e,t){if(e.reactions!==null)for(let n of e.reactions){let e=n.f;e&2?Qt(n,t):e&131072&&(j(n,y),t.add(n))}}function $t(e,t,n){let r=n.get(e);if(r!==void 0)return r;if(e.deps!==null)for(let r of e.deps){if(i.call(t,r))return!0;if(r.f&2&&$t(r,t,n))return n.set(r,!0),!0}return n.set(e,!1),!1}function en(e){M.schedule(e)}function tn(e,t){if(!(e.f&32&&e.f&1024)){e.f&2048?t.d.push(e):e.f&4096&&t.m.push(e),j(e,v);for(var n=e.first;n!==null;)tn(n,t),n=n.next}}function nn(e){j(e,v);for(var t=e.first;t!==null;)nn(t),t=t.next}function rn(e){O||xe(`fork`),M!==null&&je();var t=qt.ensure();t.is_fork=!0,N=new Map;var n=!1,r=t.settled();return Jt(e),{commit:async()=>{if(n){await r;return}t.linked||Ae(),n=!0,t.is_fork=!1;for(var[e,[i]]of t.current)e.v=i,e.wv=Pr();t.activate(),t.run_fork_commit_callbacks(),t.deactivate(),Jt(()=>{var e=new Set;for(var n of t.current.keys())Qt(n,e);Tn(e),jn()}),t.flush(),await r},discard:()=>{for(var e of t.current.keys())e.wv=Pr();!n&&t.linked&&t.discard()}}}function an(e){let t=0,n=Dn(0),r;return()=>{rr()&&(Z(n),dr(()=>(t===0&&(r=Q(()=>e(()=>Mn(n)))),t+=1,()=>{A(()=>{--t,t===0&&(r?.(),r=void 0,Mn(n))})})))}}var on=ne|ie;function sn(e,t,n,r){new cn(e,t,n,r)}var cn=class{parent;is_pending=!1;transform_error;#e;#t=w?E:null;#n;#r;#i;#a=null;#o=null;#s=null;#c=null;#l=0;#u=0;#d=!1;#f=new Set;#p=new Set;#m=null;#h=an(()=>(this.#m=Dn(this.#l),()=>{this.#m=null}));constructor(e,t,n,r){this.#e=e,this.#n=t,this.#r=e=>{var t=G;t.b=this,t.f|=128,n(e)},this.parent=G.b,this.transform_error=r??this.parent?.transform_error??(e=>e),this.#i=pr(()=>{if(w){let e=this.#t;Je();let t=e.data===`[!`;if(e.data.startsWith(`[?`)){let t=JSON.parse(e.data.slice(2));this.#_(t)}else t?this.#v():this.#g()}else this.#y()},on),w&&(this.#e=E)}#g(){try{this.#a=B(()=>this.#r(this.#e))}catch(e){this.error(e)}}#_(e){let t=this.#n.failed;t&&(this.#s=B(()=>{t(this.#e,()=>e,()=>()=>{})}))}#v(){let e=this.#n.pending;e&&(this.is_pending=!0,this.#o=B(()=>e(this.#e)),A(()=>{var e=this.#c=document.createDocumentFragment(),t=I();e.append(t),this.#a=this.#x(()=>B(()=>this.#r(t))),this.#u===0&&(this.#e.before(e),this.#c=null,yr(this.#o,()=>{this.#o=null}),this.#b(M))}))}#y(){try{if(this.is_pending=this.has_pending_snippet(),this.#u=0,this.#l=0,this.#a=B(()=>{this.#r(this.#e)}),this.#u>0){var e=this.#c=document.createDocumentFragment();Cr(this.#a,e);let t=this.#n.pending;this.#o=B(()=>t(this.#e))}else this.#b(M)}catch(e){this.error(e)}}#b(e){this.is_pending=!1,e.transfer_effects(this.#f,this.#p)}defer_effect(e){Et(e,this.#f,this.#p)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#n.pending}#x(e){var t=G,n=H,r=k;K(this.#i),W(this.#i),st(this.#i.ctx);try{return qt.ensure(),e()}catch(e){return xt(e),null}finally{K(t),W(n),st(r)}}#S(e,t){if(!this.has_pending_snippet()){this.parent&&this.parent.#S(e,t);return}this.#u+=e,this.#u===0&&(this.#b(t),this.#o&&yr(this.#o,()=>{this.#o=null}),this.#c&&=(this.#e.before(this.#c),null))}update_pending_count(e,t){this.#S(e,t),this.#l+=e,!(!this.#m||this.#d)&&(this.#d=!0,A(()=>{this.#d=!1,this.#m&&An(this.#m,this.#l)}))}get_effect_pending(){return this.#h(),Z(this.#m)}error(e){if(!this.#n.onerror&&!this.#n.failed)throw e;M?.is_fork?(this.#a&&M.skip_effect(this.#a),this.#o&&M.skip_effect(this.#o),this.#s&&M.skip_effect(this.#s),M.on_fork_commit(()=>{this.#C(e)})):this.#C(e)}#C(e){this.#a&&=(V(this.#a),null),this.#o&&=(V(this.#o),null),this.#s&&=(V(this.#s),null),w&&(D(this.#t),Xe(),D(Ze()));var t=this.#n.onerror;let n=this.#n.failed;var r=!1,i=!1;let a=()=>{if(r){qe();return}r=!0,i&&Be(),this.#s!==null&&yr(this.#s,()=>{this.#s=null}),this.#x(()=>{this.#y()})},o=e=>{try{i=!0,t?.(e,a),i=!1}catch(e){St(e,this.#i&&this.#i.parent)}n&&(this.#s=this.#x(()=>{try{return B(()=>{var t=G;t.b=this,t.f|=128,n(this.#e,()=>e,()=>a)})}catch(e){return St(e,this.#i.parent),null}}))};A(()=>{var t;try{t=this.transform_error(e)}catch(e){St(e,this.#i&&this.#i.parent);return}typeof t==`object`&&t&&typeof t.then==`function`?t.then(o,e=>St(e,this.#i&&this.#i.parent)):o(t)})}};function ln(e,t,n,r){let i=ht()?pn:_n;var a=e.filter(e=>!e.settled);if(n.length===0&&a.length===0){r(t.map(i));return}var o=G,s=un(),c=a.length===1?a[0].promise:a.length>1?Promise.all(a.map(e=>e.promise)):null;function l(e){if(!(o.f&16384)){s();try{r(e)}catch(e){St(e,o)}dn()}}var u=fn();if(n.length===0){c.then(()=>l(t.map(i))).finally(u);return}function d(){Promise.all(n.map(e=>hn(e))).then(e=>l([...t.map(i),...e])).catch(e=>St(e,o)).finally(u)}c?c.then(()=>{s(),d(),dn()}):d()}function un(){var e=G,t=H,n=k,r=M;return function(i=!0){K(e),W(t),st(n),i&&!(e.f&16384)&&(r?.activate(),r?.apply())}}function dn(e=!0){K(null),W(null),st(null),e&&M?.deactivate()}function fn(){var e=G,t=e.b,n=M,r=t.is_rendered();return t.update_pending_count(1,n),n.increment(r,e),()=>{t.update_pending_count(-1,n),n.decrement(r,e)}}function pn(e){var t=2|y;return G!==null&&(G.f|=ie),{ctx:k,deps:null,effects:null,equals:$e,f:t,fn:e,reactions:null,rv:0,v:C,wv:0,parent:G,ac:null}}var mn=Symbol(`obsolete`);function hn(e,t,n){let r=G;r===null&&we();var i=void 0,a=Dn(C),o=!H,s=new Set;return ur(()=>{var t=G,n=_();i=n.promise;try{Promise.resolve(e()).then(n.resolve,e=>{e!==ye&&n.reject(e)}).finally(dn)}catch(e){n.reject(e),dn()}var c=M;if(o){if(t.f&32768)var l=fn();if(r.b.is_rendered())c.async_deriveds.get(t)?.reject(mn);else for(let e of s.values())e.reject(mn);s.add(n),c.async_deriveds.set(t,n)}let u=(e,t=void 0)=>{l?.(),s.delete(n),t!==mn&&(c.activate(),t?(a.f|=ue,An(a,t)):(a.f&8388608&&(a.f^=ue),An(a,e)),c.deactivate())};n.promise.then(u,e=>u(null,e||`unknown`))}),ir(()=>{for(let e of s)e.reject(mn)}),new Promise(e=>{function t(n){function r(){n===i?e(a):t(i)}n.then(r,r)}t(i)})}function gn(e){let t=pn(e);return O||Or(t),t}function _n(e){let t=pn(e);return t.equals=tt,t}function vn(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n<t.length;n+=1)V(t[n])}}function yn(e){var t,n=G,r=e.parent;if(!Er&&r!==null&&e.v!==C&&r.f&24576)return Ue(),e.v;K(r);try{e.f&=~se,vn(e),t=Lr(e)}finally{K(n)}return t}function bn(e){var t=yn(e);if(!e.equals(t)&&(e.wv=Pr(),(!M?.is_fork||e.deps===null)&&(M===null?e.v=t:(M.capture(e,t,!0),zt?.capture(e,t,!0)),e.deps===null))){j(e,v);return}Er||(N===null?wt(e):(rr()||M?.is_fork)&&N.set(e,t))}function xn(e){if(e.effects!==null)for(let t of e.effects)(t.teardown||t.ac)&&(t.teardown?.(),t.ac?.abort(ye),t.fn!==null&&(t.teardown=m),t.ac=null,zr(t,0),hr(t))}function Sn(e){if(e.effects!==null)for(let t of e.effects)t.teardown&&t.fn!==null&&Br(t)}var Cn=new Set,wn=new Map;function Tn(e){Cn=e}var En=!1;function Dn(e,t){return{f:0,v:e,reactions:null,equals:$e,rv:0,wv:0}}function On(e,t){let n=Dn(e,t);return Or(n),n}function kn(e,t=!1,n=!0){let r=Dn(e);return t||(r.equals=tt),nt&&n&&k!==null&&k.l!==null&&(k.l.s??=[]).push(r),r}function F(e,t,n=!1){return H!==null&&(!U||H.f&131072)&&ht()&&H.f&4325394&&(q===null||!i.call(q,e))&&ze(),An(e,n?Pn(t):t,Wt)}function An(e,t,n=null){if(!e.equals(t)){wn.set(e,Er?t:e.v);var r=qt.ensure();if(r.capture(e,t),e.f&2){let t=e;e.f&2048&&yn(t),N===null&&wt(t)}e.wv=Pr(),Nn(e,y,n),ht()&&G!==null&&G.f&1024&&!(G.f&96)&&(X===null?kr([e]):X.push(e)),!r.is_fork&&Cn.size>0&&!En&&jn()}return t}function jn(){En=!1;for(let e of Cn){e.f&1024&&j(e,b);let t;try{t=Fr(e)}catch{t=!0}t&&Br(e)}Cn.clear()}function Mn(e){F(e,e.v+1)}function Nn(e,t,n){var r=e.reactions;if(r!==null)for(var i=ht(),a=r.length,o=0;o<a;o++){var s=r[o],c=s.f;if(!(!i&&s===G)){var l=(c&y)===0;if(l&&j(s,t),c&131072)Cn.add(s);else if(c&2){var u=s;N?.delete(u),c&65536||(c&512&&(G===null||!(G.f&2097152))&&(s.f|=se),Nn(u,b,n))}else if(l){var d=s;c&16&&P!==null&&P.add(d),n===null?en(d):n.push(d)}}}}function Pn(e){if(typeof e!=`object`||!e||de in e)return e;let t=d(e);if(t!==l&&t!==u)return e;var r=new Map,i=n(e),a=On(0),o=null,c=Mr,f=e=>{if(Mr===c)return e();var t=H,n=Mr;W(null),Nr(c);var r=e();return W(t),Nr(n),r};return i&&r.set(`length`,On(e.length,o)),new Proxy(e,{defineProperty(e,t,n){(!(`value`in n)||n.configurable===!1||n.enumerable===!1||n.writable===!1)&&Le();var i=r.get(t);return i===void 0?f(()=>{var e=On(n.value,o);return r.set(t,e),e}):F(i,n.value,!0),!0},deleteProperty(e,t){var n=r.get(t);if(n===void 0){if(t in e){let e=f(()=>On(C,o));r.set(t,e),Mn(a)}}else F(n,C),Mn(a);return!0},get(t,n,i){if(n===de)return e;var a=r.get(n),c=n in t;if(a===void 0&&(!c||s(t,n)?.writable)&&(a=f(()=>On(Pn(c?t[n]:C),o)),r.set(n,a)),a!==void 0){var l=Z(a);return l===C?void 0:l}return Reflect.get(t,n,i)},getOwnPropertyDescriptor(e,t){var n=Reflect.getOwnPropertyDescriptor(e,t);if(n&&`value`in n){var i=r.get(t);i&&(n.value=Z(i))}else if(n===void 0){var a=r.get(t),o=a?.v;if(a!==void 0&&o!==C)return{enumerable:!0,configurable:!0,value:o,writable:!0}}return n},has(e,t){if(t===de)return!0;var n=r.get(t),i=n!==void 0&&n.v!==C||Reflect.has(e,t);return(n!==void 0||G!==null&&(!i||s(e,t)?.writable))&&(n===void 0&&(n=f(()=>On(i?Pn(e[t]):C,o)),r.set(t,n)),Z(n)===C)?!1:i},set(e,t,n,c){var l=r.get(t),u=t in e;if(i&&t===`length`)for(var d=n;d<l.v;d+=1){var p=r.get(d+``);p===void 0?d in e&&(p=f(()=>On(C,o)),r.set(d+``,p)):F(p,C)}if(l===void 0)(!u||s(e,t)?.writable)&&(l=f(()=>On(void 0,o)),F(l,Pn(n)),r.set(t,l));else{u=l.v!==C;var m=f(()=>Pn(n));F(l,m)}var h=Reflect.getOwnPropertyDescriptor(e,t);if(h?.set&&h.set.call(c,n),!u){if(i&&typeof t==`string`){var g=r.get(`length`),_=Number(t);Number.isInteger(_)&&_>=g.v&&F(g,_+1)}Mn(a)}return!0},ownKeys(e){Z(a);var t=Reflect.ownKeys(e).filter(e=>{var t=r.get(e);return t===void 0||t.v!==C});for(var[n,i]of r)i.v!==C&&!(n in e)&&t.push(n);return t},setPrototypeOf(){Re()}})}function Fn(e){try{if(typeof e==`object`&&e&&de in e)return e[de]}catch{}return e}function In(e,t){return Object.is(Fn(e),Fn(t))}var Ln,Rn,zn,Bn,Vn;function Hn(){if(Ln===void 0){Ln=window,Rn=document,zn=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;Bn=s(t,`firstChild`).get,Vn=s(t,`nextSibling`).get,f(e)&&(e[he]=void 0,e[me]=null,e[ge]=void 0,e.__e=void 0),f(n)&&(n[_e]=void 0)}}function I(e=``){return document.createTextNode(e)}function L(e){return Bn.call(e)}function R(e){return Vn.call(e)}function Un(e,t){if(!w)return L(e);var n=L(E);if(n===null)n=E.appendChild(I());else if(t&&n.nodeType!==3){var r=I();return n?.before(r),D(r),r}return t&&Yn(n),D(n),n}function Wn(e,t=!1){if(!w){var n=L(e);return n instanceof Comment&&n.data===``?R(n):n}if(t){if(E?.nodeType!==3){var r=I();return E?.before(r),D(r),r}Yn(E)}return E}function Gn(e,t=1,n=!1){let r=w?E:e;for(var i;t--;)i=r,r=R(r);if(!w)return r;if(n){if(r?.nodeType!==3){var a=I();return r===null?i?.after(a):r.before(a),D(a),a}Yn(r)}return D(r),r}function Kn(e){e.textContent=``}function qn(){return!O||P!==null?!1:(G.f&ee)!==0}function Jn(e,t,n){let r=n?{is:n}:void 0;return document.createElementNS(t??`http://www.w3.org/1999/xhtml`,e,r)}function Yn(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===3;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function Xn(e){w&&L(e)!==null&&Kn(e)}var Zn=!1;function Qn(){Zn||(Zn=!0,document.addEventListener(`reset`,e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(let t of e.target.elements)t[ve]?.()})},{capture:!0}))}function $n(e){var t=H,n=G;W(null),K(null);try{return e()}finally{W(t),K(n)}}function er(e,t,n,r=n){e.addEventListener(t,()=>$n(n));let i=e[ve];i?e[ve]=()=>{i(),r(!0)}:e[ve]=()=>r(!0),Qn()}function tr(e){G===null&&(H===null&&Oe(e),De()),Er&&Ee(e)}function nr(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function z(e,t){var n=G;n!==null&&n.f&8192&&(e|=x);var r={ctx:k,deps:null,nodes:null,f:e|y|512,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};M?.register_created_effect(r);var i=r;if(e&4)Ut===null?qt.ensure().schedule(r):Ut.push(r);else if(t!==null){try{Br(r)}catch(e){throw V(r),e}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&!(i.f&524288)&&(i=i.first,e&16&&e&65536&&i!==null&&(i.f|=ne))}if(i!==null&&(i.parent=n,n!==null&&nr(i,n),H!==null&&H.f&2&&!(e&64))){var a=H;(a.effects??=[]).push(i)}return r}function rr(){return H!==null&&!U}function ir(e){let t=z(8,null);return j(t,v),t.teardown=e,t}function ar(e){tr(`$effect`);var t=G.f;if(!H&&t&32&&!(t&32768)){var n=k;(n.e??=[]).push(e)}else return or(e)}function or(e){return z(4|ae,e)}function sr(e){return tr(`$effect.pre`),z(8|ae,e)}function cr(e){qt.ensure();let t=z(64|ie,e);return(e={})=>new Promise(n=>{e.outro?yr(t,()=>{V(t),n(void 0)}):(V(t),n(void 0))})}function lr(e){return z(4,e)}function ur(e){return z(le|ie,e)}function dr(e,t=0){return z(8|t,e)}function fr(e,t=[],n=[],r=[]){ln(r,t,n,t=>{z(8,()=>e(...t.map(Z)))})}function pr(e,t=0){return z(16|t,e)}function B(e){return z(32|ie,e)}function mr(e){var t=e.teardown;if(t!==null){let e=Er,n=H;Dr(!0),W(null);try{t.call(null)}finally{Dr(e),W(n)}}}function hr(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){let e=n.ac;e!==null&&$n(()=>{e.abort(ye)});var r=n.next;n.f&64?n.parent=null:V(n,t),n=r}}function gr(e){for(var t=e.first;t!==null;){var n=t.next;t.f&32||V(t),t=n}}function V(e,t=!0){var n=!1;(t||e.f&262144)&&e.nodes!==null&&e.nodes.end!==null&&(_r(e.nodes.start,e.nodes.end),n=!0),j(e,te),hr(e,t&&!n),zr(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)e.stop();mr(e),e.f^=te,e.f|=S;var i=e.parent;i!==null&&i.first!==null&&vr(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function _r(e,t){for(;e!==null;){var n=e===t?null:R(e);e.remove(),e=n}}function vr(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function yr(e,t,n=!0){var r=[];br(e,r,!0);var i=()=>{n&&V(e),t&&t()},a=r.length;if(a>0){var o=()=>--a||i();for(var s of r)s.out(o)}else i()}function br(e,t,n){if(!(e.f&8192)){e.f^=x;var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)(e.is_global||n)&&t.push(e);for(var i=e.first;i!==null;){var a=i.next;if(!(i.f&64)){var o=(i.f&65536)!=0||(i.f&32)!=0&&(e.f&16)!=0;br(i,t,o?n:!1)}i=a}}}function xr(e){Sr(e,!0)}function Sr(e,t){if(e.f&8192){e.f^=x,e.f&1024||(j(e,y),qt.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,i=(n.f&65536)!=0||(n.f&32)!=0;Sr(n,i?t:!1),n=r}var a=e.nodes&&e.nodes.t;if(a!==null)for(let e of a)(e.is_global||t)&&e.in()}}function Cr(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var i=n===r?null:R(n);t.append(n),n=i}}var wr=null,Tr=!1,Er=!1;function Dr(e){Er=e}var H=null,U=!1;function W(e){H=e}var G=null;function K(e){G=e}var q=null;function Or(e){H!==null&&(!O||H.f&2)&&(q===null?q=[e]:q.push(e))}var J=null,Y=0,X=null;function kr(e){X=e}var Ar=1,jr=0,Mr=jr;function Nr(e){Mr=e}function Pr(){return++Ar}function Fr(e){var t=e.f;if(t&2048)return!0;if(t&2&&(e.f&=~se),t&4096){for(var n=e.deps,r=n.length,i=0;i<r;i++){var a=n[i];if(Fr(a)&&bn(a),a.wv>e.wv)return!0}t&512&&N===null&&j(e,v)}return!1}function Ir(e,t,n=!0){var r=e.reactions;if(r!==null&&!(!O&&q!==null&&i.call(q,e)))for(var a=0;a<r.length;a++){var o=r[a];o.f&2?Ir(o,t,!1):t===o&&(n?j(o,y):o.f&1024&&j(o,b),en(o))}}function Lr(e){var t=J,n=Y,r=X,i=H,a=q,o=k,s=U,c=Mr,l=e.f;J=null,Y=0,X=null,H=l&96?null:e,q=null,st(e.ctx),U=!1,Mr=++jr,e.ac!==null&&($n(()=>{e.ac.abort(ye)}),e.ac=null);try{e.f|=ce;var u=e.fn,d=u();e.f|=ee;var f=e.deps,p=M?.is_fork;if(J!==null){var m;if(p||zr(e,Y),f!==null&&Y>0)for(f.length=Y+J.length,m=0;m<J.length;m++)f[Y+m]=J[m];else e.deps=f=J;if(rr()&&e.f&512)for(m=Y;m<f.length;m++)(f[m].reactions??=[]).push(e)}else !p&&f!==null&&Y<f.length&&(zr(e,Y),f.length=Y);if(ht()&&X!==null&&!U&&f!==null&&!(e.f&6146))for(m=0;m<X.length;m++)Ir(X[m],e);if(i!==null&&i!==e){if(jr++,i.deps!==null)for(let e=0;e<n;e+=1)i.deps[e].rv=jr;if(t!==null)for(let e of t)e.rv=jr;X!==null&&(r===null?r=X:r.push(...X))}return e.f&8388608&&(e.f^=ue),d}catch(e){return xt(e)}finally{e.f^=ce,J=t,Y=n,X=r,H=i,q=a,st(o),U=s,Mr=c}}function Rr(e,t){let n=t.reactions;if(n!==null){var a=r.call(n,e);if(a!==-1){var o=n.length-1;o===0?n=t.reactions=null:(n[a]=n[o],n.pop())}}if(n===null&&t.f&2&&(J===null||!i.call(J,t))){var s=t;s.f&512&&(s.f^=512,s.f&=~se),s.v!==C&&wt(s),xn(s),zr(s,0)}}function zr(e,t){var n=e.deps;if(n!==null)for(var r=t;r<n.length;r++)Rr(e,n[r])}function Br(e){var t=e.f;if(!(t&16384)){j(e,v);var n=G,r=Tr;G=e,Tr=!0;try{t&16777232?gr(e):hr(e),mr(e);var i=Lr(e);e.teardown=typeof i==`function`?i:null,e.wv=Ar}finally{Tr=r,G=n}}}async function Vr(){if(O)return new Promise(e=>{requestAnimationFrame(()=>e()),setTimeout(()=>e())});await Promise.resolve(),Jt()}function Hr(){return qt.ensure().settled()}function Z(e){var t=(e.f&2)!=0;if(wr?.add(e),H!==null&&!U&&!(G!==null&&G.f&16384)&&(q===null||!i.call(q,e))){var n=H.deps;if(H.f&2097152)e.rv<jr&&(e.rv=jr,J===null&&n!==null&&n[Y]===e?Y++:J===null?J=[e]:J.push(e));else{H.deps??=[],i.call(H.deps,e)||H.deps.push(e);var r=e.reactions;r===null?e.reactions=[H]:i.call(r,H)||r.push(H)}}if(Er&&wn.has(e))return wn.get(e);if(t){var a=e;if(Er){var o=a.v;return(!(a.f&1024)&&a.reactions!==null||Wr(a))&&(o=yn(a)),wn.set(a,o),o}var s=(a.f&512)==0&&!U&&H!==null&&(Tr||(H.f&512)!=0),c=(a.f&ee)===0;Fr(a)&&(s&&(a.f|=512),bn(a)),s&&!c&&(Sn(a),Ur(a))}if(N?.has(e))return N.get(e);if(e.f&8388608)throw e.v;return e.v}function Ur(e){if(e.f|=512,e.deps!==null)for(let t of e.deps)(t.reactions??=[]).push(e),t.f&2&&!(t.f&512)&&(Sn(t),Ur(t))}function Wr(e){if(e.v===C)return!0;if(e.deps===null)return!1;for(let t of e.deps)if(wn.has(t)||t.f&2&&Wr(t))return!0;return!1}function Q(e){var t=U;try{return U=!0,e()}finally{U=t}}function Gr(e){if(!(typeof e!=`object`||!e||e instanceof EventTarget)){if(de in e)Kr(e);else if(!Array.isArray(e))for(let t in e){let n=e[t];typeof n==`object`&&n&&de in n&&Kr(n)}}}function Kr(e,t=new Set){if(typeof e==`object`&&e&&!(e instanceof EventTarget)&&!t.has(e)){t.add(e),e instanceof Date&&e.getTime();for(let n in e)try{Kr(e[n],t)}catch{}let n=d(e);if(n!==Object.prototype&&n!==Array.prototype&&n!==Map.prototype&&n!==Set.prototype&&n!==Date.prototype){let t=c(n);for(let n in t){let r=t[n].get;if(r)try{r.call(e)}catch{}}}}}[...`allowfullscreen.async.autofocus.autoplay.checked.controls.default.disabled.formnovalidate.indeterminate.inert.ismap.loop.multiple.muted.nomodule.novalidate.open.playsinline.readonly.required.reversed.seamless.selected.webkitdirectory.defer.disablepictureinpicture.disableremoteplayback`.split(`.`)];var qr=[`touchstart`,`touchmove`];function Jr(e){return qr.includes(e)}var Yr=Symbol(`events`),Xr=new Set,Zr=new Set;function Qr(e,t,n,r={}){function i(e){if(r.capture||ri.call(t,e),!e.cancelBubble)return $n(()=>n?.call(this,e))}return e.startsWith(`pointer`)||e.startsWith(`touch`)||e===`wheel`?A(()=>{t.addEventListener(e,i,r)}):t.addEventListener(e,i,r),i}function $r(e,t,n,r,i){var a={capture:r,passive:i},o=Qr(e,t,n,a);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&ir(()=>{t.removeEventListener(e,o,a)})}function ei(e,t,n){(t[Yr]??={})[e]=n}function ti(e){for(var t=0;t<e.length;t++)Xr.add(e[t]);for(var n of Zr)n(e)}var ni=null;function ri(e){var t=this,n=t.ownerDocument,r=e.type,i=e.composedPath?.()||[],a=i[0]||e.target;ni=e;var s=0,c=ni===e&&e[Yr];if(c){var l=i.indexOf(c);if(l!==-1&&(t===document||t===window)){e[Yr]=t;return}var u=i.indexOf(t);if(u===-1)return;l<=u&&(s=l)}if(a=i[s]||e.target,a!==t){o(e,`currentTarget`,{configurable:!0,get(){return a||n}});var d=H,f=G;W(null),K(null);try{for(var p,m=[];a!==null;){var h=a.assignedSlot||a.parentNode||a.host||null;try{var g=a[Yr]?.[r];g!=null&&(!a.disabled||e.target===a)&&g.call(a,e)}catch(e){p?m.push(e):p=e}if(e.cancelBubble||h===t||h===null)break;a=h}if(p){for(let e of m)queueMicrotask(()=>{throw e});throw p}}finally{e[Yr]=t,delete e.currentTarget,W(d),K(f)}}}var ii=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy(`svelte-trusted-html`,{createHTML:e=>e});function ai(e){return ii?.createHTML(e)??e}function oi(e){var t=Jn(`template`);return t.innerHTML=ai(e.replaceAll(`<!>`,`<!---->`)),t.content}function $(e,t){var n=G;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function si(e,t){var n=(t&1)!=0,r=(t&2)!=0,i,a=!e.startsWith(`<!>`);return()=>{if(w)return $(E,null),E;i===void 0&&(i=oi(a?e:`<!>`+e),n||(i=L(i)));var t=r||zn?document.importNode(i,!0):i.cloneNode(!0);if(n){var o=L(t),s=t.lastChild;$(o,s)}else $(t,t);return t}}function ci(e,t,n=`svg`){var r=!e.startsWith(`<!>`),i=(t&1)!=0,a=`<${n}>${r?e:`<!>`+e}</${n}>`,o;return()=>{if(w)return $(E,null),E;if(!o){var e=L(oi(a));if(i)for(o=document.createDocumentFragment();L(e);)o.appendChild(L(e));else o=L(e)}var t=o.cloneNode(!0);if(i){var n=L(t),r=t.lastChild;$(n,r)}else $(t,t);return t}}function li(e,t){return ci(e,t,`svg`)}function ui(e=``){if(!w){var t=I(e+``);return $(t,t),t}var n=E;return n.nodeType===3?Yn(n):(n.before(n=I()),D(n)),$(n,n),n}function di(){if(w)return $(E,null),E;var e=document.createDocumentFragment(),t=document.createComment(``),n=I();return e.append(t,n),$(t,n),e}function fi(e,t){if(w){var n=G;(!(n.f&32768)||n.nodes.end===null)&&(n.nodes.end=E),Je();return}e!==null&&e.before(t)}var pi=!0;function mi(e,t){var n=t==null?``:typeof t==`object`?`${t}`:t;n!==(e[_e]??=e.nodeValue)&&(e[_e]=n,e.nodeValue=`${n}`)}function hi(e,t){return vi(e,t)}function gi(e,t){Hn(),t.intro=t.intro??!1;let n=t.target,r=w,i=E;try{for(var a=L(n);a&&(a.nodeType!==8||a.data!==`[`);)a=R(a);if(!a)throw Ve;T(!0),D(a);let r=vi(e,{...t,anchor:a});return T(!1),r}catch(r){if(r instanceof Error&&r.message.split(`
2
+ `).some(e=>e.startsWith(`https://svelte.dev/e/`)))throw r;return r!==Ve&&console.warn(`Failed to hydrate: `,r),t.recover===!1&&Ne(),Hn(),Kn(n),T(!1),hi(e,t)}finally{T(r),D(i)}}var _i=new Map;function vi(e,{target:t,anchor:n,props:r={},events:i,context:o,intro:s=!0,transformError:c}){Hn();var l=void 0,u=cr(()=>{var u=n??t.appendChild(I());sn(u,{pending:()=>{}},t=>{pt({});var n=k;if(o&&(n.c=o),i&&(r.$$events=i),w&&$(t,null),pi=s,l=e(t,r)||{},pi=!0,w&&(G.nodes.end=E,E===null||E.nodeType!==8||E.data!==`]`))throw Ge(),Ve;mt()},c);var d=new Set,f=e=>{for(var n=0;n<e.length;n++){var r=e[n];if(!d.has(r)){d.add(r);var i=Jr(r);for(let e of[t,document]){var a=_i.get(e);a===void 0&&(a=new Map,_i.set(e,a));var o=a.get(r);o===void 0?(e.addEventListener(r,ri,{passive:i}),a.set(r,1)):a.set(r,o+1)}}}};return f(a(Xr)),Zr.add(f),()=>{for(var e of d)for(let n of[t,document]){var r=_i.get(n),i=r.get(e);--i==0?(n.removeEventListener(e,ri),r.delete(e),r.size===0&&_i.delete(n)):r.set(e,i)}Zr.delete(f),u!==n&&u.parentNode?.removeChild(u)}});return yi.set(l,u),l}var yi=new WeakMap;function bi(e,t){let n=yi.get(e);return n?(yi.delete(e),n(t)):Promise.resolve()}var xi=class{anchor;#e=new Map;#t=new Map;#n=new Map;#r=new Set;#i=!0;constructor(e,t=!0){this.anchor=e,this.#i=t}#a=e=>{if(this.#e.has(e)){var t=this.#e.get(e),n=this.#t.get(t);if(n)xr(n),this.#r.delete(t);else{var r=this.#n.get(t);r&&(this.#t.set(t,r.effect),this.#n.delete(t),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),n=r.effect)}for(let[t,n]of this.#e){if(this.#e.delete(t),t===e)break;let r=this.#n.get(n);r&&(V(r.effect),this.#n.delete(n))}for(let[e,r]of this.#t){if(e===t||this.#r.has(e))continue;let i=()=>{if(Array.from(this.#e.values()).includes(e)){var t=document.createDocumentFragment();Cr(r,t),t.append(I()),this.#n.set(e,{effect:r,fragment:t})}else V(r);this.#r.delete(e),this.#t.delete(e)};this.#i||!n?(this.#r.add(e),yr(r,i,!1)):i()}}};#o=e=>{this.#e.delete(e);let t=Array.from(this.#e.values());for(let[e,n]of this.#n)t.includes(e)||(V(n.effect),this.#n.delete(e))};ensure(e,t){var n=M,r=qn();if(t&&!this.#t.has(e)&&!this.#n.has(e))if(r){var i=document.createDocumentFragment(),a=I();i.append(a),this.#n.set(e,{effect:B(()=>t(a)),fragment:i})}else this.#t.set(e,B(()=>t(this.anchor)));if(this.#e.set(n,e),r){for(let[t,r]of this.#t)t===e?n.unskip_effect(r):n.skip_effect(r);for(let[t,r]of this.#n)t===e?n.unskip_effect(r.effect):n.skip_effect(r.effect);n.oncommit(this.#a),n.ondiscard(this.#o)}else w&&(this.anchor=E),this.#a(n)}};function Si(e,t,n=!1){var r;w&&(r=E,Je());var i=new xi(e),a=n?ne:0;function o(e,t){if(w){var n=Qe(r);if(e!==parseInt(n.substring(1))){var a=Ze();D(a),i.anchor=a,T(!1),i.ensure(e,t),T(!0);return}}i.ensure(e,t)}pr(()=>{var e=!1;t((t,n=0)=>{e=!0,o(n,t)}),e||o(-1,null)},a)}var Ci=Symbol(`NaN`);function wi(e,t,n){w&&Je();var r=new xi(e),i=!ht();pr(()=>{var e=t();e!==e&&(e=Ci),i&&typeof e==`object`&&e&&(e={}),r.ensure(e,n)})}function Ti(e,t){return t}function Ei(e,t,n){for(var r=[],i=t.length,o,s=t.length,c=0;c<i;c++){let n=t[c];yr(n,()=>{if(o){if(o.pending.delete(n),o.done.add(n),o.pending.size===0){var t=e.outrogroups;Di(e,a(o.done)),t.delete(o),t.size===0&&(e.outrogroups=null)}}else --s},!1)}if(s===0){var l=r.length===0&&n!==null;if(l){var u=n,d=u.parentNode;Kn(d),d.append(u),e.items.clear()}Di(e,t,!l)}else o={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(o)}function Di(e,t,n=!0){var r;if(e.pending.size>0){r=new Set;for(let t of e.pending.values())for(let n of t)r.add(e.items.get(n).e)}for(var i=0;i<t.length;i++){var a=t[i];r?.has(a)?(a.f|=oe,Cr(a,document.createDocumentFragment())):V(t[i],n)}}var Oi;function ki(e,t,r,i,o,s=null){var c=e,l=new Map;if(t&4){var u=e;c=w?D(L(u)):u.appendChild(I())}w&&Je();var d=null,f=_n(()=>{var e=r();return n(e)?e:e==null?[]:a(e)}),p,m=new Map,h=!0;function g(e){v.effect.f&16384||(v.pending.delete(e),v.fallback=d,ji(v,p,c,t,i),d!==null&&(p.length===0?d.f&33554432?(d.f^=oe,Ni(d,null,c)):xr(d):yr(d,()=>{d=null})))}function _(e){v.pending.delete(e)}var v={effect:pr(()=>{p=Z(f);var e=p.length;let n=!1;w&&Qe(c)===`[!`!=(e===0)&&(c=Ze(),D(c),T(!1),n=!0);for(var a=new Set,u=M,v=qn(),y=0;y<e;y+=1){w&&E.nodeType===8&&E.data===`]`&&(c=E,n=!0,T(!1));var b=p[y],x=i(b,y),S=h?null:l.get(x);S?(S.v&&An(S.v,b),S.i&&An(S.i,y),v&&u.unskip_effect(S.e)):(S=Mi(l,h?c:Oi??=I(),b,x,y,o,t,r),h||(S.e.f|=oe),l.set(x,S)),a.add(x)}if(e===0&&s&&!d&&(h?d=B(()=>s(c)):(d=B(()=>s(Oi??=I())),d.f|=oe)),e>a.size&&Te(``,``,``),w&&e>0&&D(Ze()),!h)if(m.set(u,a),v){for(let[e,t]of l)a.has(e)||u.skip_effect(t.e);u.oncommit(g),u.ondiscard(_)}else g(u);n&&T(!0),Z(f)}),flags:t,items:l,pending:m,outrogroups:null,fallback:d};h=!1,w&&(c=E)}function Ai(e){for(;e!==null&&!(e.f&32);)e=e.next;return e}function ji(e,t,n,r,i){var o=(r&8)!=0,s=t.length,c=e.items,l=Ai(e.effect.first),u,d=null,f,p=[],m=[],h,g,_,v;if(o)for(v=0;v<s;v+=1)h=t[v],g=i(h,v),_=c.get(g).e,_.f&33554432||(_.nodes?.a?.measure(),(f??=new Set).add(_));for(v=0;v<s;v+=1){if(h=t[v],g=i(h,v),_=c.get(g).e,e.outrogroups!==null)for(let t of e.outrogroups)t.pending.delete(_),t.done.delete(_);if(_.f&8192&&(xr(_),o&&(_.nodes?.a?.unfix(),(f??=new Set).delete(_))),_.f&33554432)if(_.f^=oe,_===l)Ni(_,null,n);else{var y=d?d.next:l;_===e.effect.last&&(e.effect.last=_.prev),_.prev&&(_.prev.next=_.next),_.next&&(_.next.prev=_.prev),Pi(e,d,_),Pi(e,_,y),Ni(_,y,n),d=_,p=[],m=[],l=Ai(d.next);continue}if(_!==l){if(u!==void 0&&u.has(_)){if(p.length<m.length){var b=m[0],x;d=b.prev;var S=p[0],ee=p[p.length-1];for(x=0;x<p.length;x+=1)Ni(p[x],b,n);for(x=0;x<m.length;x+=1)u.delete(m[x]);Pi(e,S.prev,ee.next),Pi(e,d,S),Pi(e,ee,b),l=b,d=ee,--v,p=[],m=[]}else u.delete(_),Ni(_,l,n),Pi(e,_.prev,_.next),Pi(e,_,d===null?e.effect.first:d.next),Pi(e,d,_),d=_;continue}for(p=[],m=[];l!==null&&l!==_;)(u??=new Set).add(l),m.push(l),l=Ai(l.next);if(l===null)continue}_.f&33554432||p.push(_),d=_,l=Ai(_.next)}if(e.outrogroups!==null){for(let t of e.outrogroups)t.pending.size===0&&(Di(e,a(t.done)),e.outrogroups?.delete(t));e.outrogroups.size===0&&(e.outrogroups=null)}if(l!==null||u!==void 0){var te=[];if(u!==void 0)for(_ of u)_.f&8192||te.push(_);for(;l!==null;)!(l.f&8192)&&l!==e.fallback&&te.push(l),l=Ai(l.next);var ne=te.length;if(ne>0){var re=r&4&&s===0?n:null;if(o){for(v=0;v<ne;v+=1)te[v].nodes?.a?.measure();for(v=0;v<ne;v+=1)te[v].nodes?.a?.fix()}Ei(e,te,re)}}o&&A(()=>{if(f!==void 0)for(_ of f)_.nodes?.a?.apply()})}function Mi(e,t,n,r,i,a,o,s){var c=o&1?o&16?Dn(n):kn(n,!1,!1):null,l=o&2?Dn(i):null;return{v:c,i:l,e:B(()=>(a(t,c??n,l??i,s),()=>{e.delete(r)}))}}function Ni(e,t,n){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,a=t&&!(t.f&33554432)?t.nodes.start:n;r!==null;){var o=R(r);if(a.before(r),r===i)return;r=o}}function Pi(e,t,n){t===null?e.effect.first=n:t.next=n,n===null?e.effect.last=t:n.prev=t}function Fi(e,t,...n){var r=new xi(e);pr(()=>{let e=t()??null;r.ensure(e,e&&(t=>e(t,...n)))},ne)}function Ii(e){return(t,...n)=>{var r=e(...n),i;w?(i=E,Je()):(i=L(oi(r.render().trim())),t.before(i));let a=r.setup?.(i);$(i,i),typeof a==`function`&&ir(a)}}function Li(e,t,n){var r;w&&(r=E,Je());var i=new xi(e);pr(()=>{var e=t()??null;if(w&&Qe(r)===`[`!=(e!==null)){var a=Ze();D(a),i.anchor=a,T(!1),i.ensure(e,e&&(t=>n(t,e))),T(!0);return}i.ensure(e,e&&(t=>n(t,e)))},ne)}var Ri=()=>performance.now(),zi={tick:e=>requestAnimationFrame(e),now:()=>Ri(),tasks:new Set};function Bi(){let e=zi.now();zi.tasks.forEach(t=>{t.c(e)||(zi.tasks.delete(t),t.f())}),zi.tasks.size!==0&&zi.tick(Bi)}function Vi(e){let t;return zi.tasks.size===0&&zi.tick(Bi),{promise:new Promise(n=>{zi.tasks.add(t={c:e,f:n})}),abort(){zi.tasks.delete(t)}}}function Hi(e,t){$n(()=>{e.dispatchEvent(new CustomEvent(t))})}function Ui(e){if(e===`float`)return`cssFloat`;if(e===`offset`)return`cssOffset`;if(e.startsWith(`--`))return e;let t=e.split(`-`);return t.length===1?t[0]:t[0]+t.slice(1).map(e=>e[0].toUpperCase()+e.slice(1)).join(``)}function Wi(e){let t={},n=e.split(`;`);for(let e of n){let[n,r]=e.split(`:`);if(!n||r===void 0)break;let i=Ui(n.trim());t[i]=r.trim()}return t}var Gi=e=>e;function Ki(e,t,n,r){var i=(e&1)!=0,a=(e&2)!=0,o=i&&a,s=(e&4)!=0,c=o?`both`:i?`in`:`out`,l,u=t.inert,d=t.style.overflow,f,p;function m(){return $n(()=>l??=n()(t,r?.()??{},{direction:c}))}var h={is_global:s,in(){if(t.inert=u,!i){p?.abort(),p?.reset?.();return}a||f?.abort(),f=qi(t,m(),p,1,()=>{Hi(t,`introstart`)},()=>{Hi(t,`introend`),f?.abort(),f=l=void 0,t.style.overflow=d})},out(e){if(!a){e?.(),l=void 0;return}t.inert=!0,p=qi(t,m(),f,0,()=>{Hi(t,`outrostart`)},()=>{Hi(t,`outroend`),e?.()})},stop:()=>{f?.abort(),p?.abort()}},g=G;if((g.nodes.t??=[]).push(h),i&&pi){var _=s;if(!_){for(var v=g.parent;v&&v.f&65536;)for(;(v=v.parent)&&!(v.f&16););_=!v||(v.f&32768)!=0}_&&lr(()=>{Q(()=>h.in())})}}function qi(e,t,n,r,i,a){var o=r===1;if(p(t)){var s,c=!1;return A(()=>{c||(s=qi(e,t({direction:o?`in`:`out`}),n,r,i,a))}),{abort:()=>{c=!0,s?.abort()},deactivate:()=>s.deactivate(),reset:()=>s.reset(),t:()=>s.t()}}if(n?.deactivate(),!t?.duration&&!t?.delay)return i(),a(),{abort:m,deactivate:m,reset:m,t:()=>r};let{delay:l=0,css:u,tick:d,easing:f=Gi}=t;var h=[];if(o&&n===void 0&&(d&&d(0,1),u)){var g=Wi(u(0,1));h.push(g,g)}var _=()=>1-r,v=e.animate(h,{duration:l,fill:`forwards`});return v.onfinish=()=>{v.cancel(),i();var o=n?.t()??1-r;n?.abort();var s=r-o,c=t.duration*Math.abs(s),l=[];if(c>0){var p=!1;if(u)for(var m=Math.ceil(c/(1e3/60)),h=0;h<=m;h+=1){var g=o+s*f(h/m),y=Wi(u(g,1-g));l.push(y),p||=y.overflow===`hidden`}p&&(e.style.overflow=`hidden`),_=()=>{var e=v.currentTime;return o+s*f(e/c)},d&&Vi(()=>{if(v.playState!==`running`)return!1;var e=_();return d(e,1-e),!0})}v=e.animate(l,{duration:c,fill:`forwards`}),v.onfinish=()=>{_=()=>r,d?.(r,1-r),a()}},{abort:()=>{v&&(v.cancel(),v.effect=null,v.onfinish=m)},deactivate:()=>{a=m},reset:()=>{r===0&&d?.(1,0)},t:()=>_()}}function Ji(e,t){let n=null,r=w;var i;if(w){n=E;for(var a=L(document.head);a!==null&&(a.nodeType!==8||a.data!==e);)a=R(a);if(a===null)T(!1);else{var o=R(a);a.remove(),D(o)}}w||(i=document.head.appendChild(I()));try{pr(()=>{var e=B(()=>t(i));e.f|=re})}finally{r&&(T(!0),D(n))}}function Yi(e){var t,n,r=``;if(typeof e==`string`||typeof e==`number`)r+=e;else if(typeof e==`object`)if(Array.isArray(e)){var i=e.length;for(t=0;t<i;t++)e[t]&&(n=Yi(e[t]))&&(r&&(r+=` `),r+=n)}else for(n in e)e[n]&&(r&&(r+=` `),r+=n);return r}function Xi(){for(var e,t,n=0,r=``,i=arguments.length;n<i;n++)(e=arguments[n])&&(t=Yi(e))&&(r&&(r+=` `),r+=t);return r}function Zi(e){return typeof e==`object`?Xi(e):e??``}var Qi=[...`
3
+ \r\f\xA0\v`];function $i(e,t,n){var r=e==null?``:``+e;if(t&&(r=r?r+` `+t:t),n){for(var i of Object.keys(n))if(n[i])r=r?r+` `+i:i;else if(r.length)for(var a=i.length,o=0;(o=r.indexOf(i,o))>=0;){var s=o+a;(o===0||Qi.includes(r[o-1]))&&(s===r.length||Qi.includes(r[s]))?r=(o===0?``:r.substring(0,o))+r.substring(s+1):o=s}}return r===``?null:r}function ea(e,t=!1){var n=t?` !important;`:`;`,r=``;for(var i of Object.keys(e)){var a=e[i];a!=null&&a!==``&&(r+=` `+i+`: `+a+n)}return r}function ta(e){return e[0]!==`-`||e[1]!==`-`?e.toLowerCase():e}function na(e,t){if(t){var n=``,r,i;if(Array.isArray(t)?(r=t[0],i=t[1]):r=t,e){e=String(e).replaceAll(/\s*\/\*.*?\*\/\s*/g,``).trim();var a=!1,o=0,s=!1,c=[];r&&c.push(...Object.keys(r).map(ta)),i&&c.push(...Object.keys(i).map(ta));var l=0,u=-1;let t=e.length;for(var d=0;d<t;d++){var f=e[d];if(s?f===`/`&&e[d-1]===`*`&&(s=!1):a?a===f&&(a=!1):f===`/`&&e[d+1]===`*`?s=!0:f===`"`||f===`'`?a=f:f===`(`?o++:f===`)`&&o--,!s&&a===!1&&o===0){if(f===`:`&&u===-1)u=d;else if(f===`;`||d===t-1){if(u!==-1){var p=ta(e.substring(l,u).trim());if(!c.includes(p)){f!==`;`&&d++;var m=e.substring(l,d).trim();n+=` `+m+`;`}}l=d+1,u=-1}}}}return r&&(n+=ea(r)),i&&(n+=ea(i,!0)),n=n.trim(),n===``?null:n}return e==null?null:String(e)}function ra(e,t,n,r,i,a){var o=e[he];if(w||o!==n||o===void 0){var s=$i(n,r,a);(!w||s!==e.getAttribute(`class`))&&(s==null?e.removeAttribute(`class`):t?e.className=s:e.setAttribute(`class`,s)),e[he]=n}else if(a&&i!==a)for(var c in a){var l=!!a[c];(i==null||l!==!!i[c])&&e.classList.toggle(c,l)}return a}function ia(e,t={},n,r){for(var i in n){var a=n[i];t[i]!==a&&(n[i]==null?e.style.removeProperty(i):e.style.setProperty(i,a,r))}}function aa(e,t,n,r){var i=e[ge];if(w||i!==t){var a=na(t,r);(!w||a!==e.getAttribute(`style`))&&(a==null?e.removeAttribute(`style`):e.style.cssText=a),e[ge]=t}else r&&(Array.isArray(r)?(ia(e,n?.[0],r[0]),ia(e,n?.[1],r[1],`important`)):ia(e,n,r));return r}function oa(e,t,r=!1){if(e.multiple){if(t==null)return;if(!n(t))return Ke();for(var i of e.options)i.selected=t.includes(la(i));return}for(i of e.options)if(In(la(i),t)){i.selected=!0;return}(!r||t!==void 0)&&(e.selectedIndex=-1)}function sa(e){var t=new MutationObserver(()=>{oa(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`value`]}),ir(()=>{t.disconnect()})}function ca(e,t,n=t){var r=new WeakSet,i=!0;er(e,`change`,t=>{var i=t?`[selected]`:`:checked`,a;if(e.multiple)a=[].map.call(e.querySelectorAll(i),la);else{var o=e.querySelector(i)??e.querySelector(`option:not([disabled])`);a=o&&la(o)}n(a),e.__value=a,M!==null&&r.add(M)}),lr(()=>{var a=t();if(e===document.activeElement){var o=O?zt:M;if(r.has(o))return}if(oa(e,a,i),i&&a===void 0){var s=e.querySelector(`:checked`);s!==null&&(a=la(s),n(a))}e.__value=a,i=!1}),sa(e)}function la(e){return`__value`in e?e.__value:e.value}var ua=Symbol(`is custom element`),da=Symbol(`is html`),fa=be?`link`:`LINK`,pa=be?`progress`:`PROGRESS`;function ma(e){if(w){var t=!1,n=()=>{if(!t){if(t=!0,e.hasAttribute(`value`)){var n=e.value;va(e,`value`,null),e.value=n}if(e.hasAttribute(`checked`)){var r=e.checked;va(e,`checked`,null),e.checked=r}}};e[ve]=n,A(n),Qn()}}function ha(e,t){var n=ya(e);n.value===(n.value=t??void 0)||e.value===t&&(t!==0||e.nodeName!==pa)||(e.value=t??``)}function ga(e,t){var n=ya(e);n.checked!==(n.checked=t??void 0)&&(e.checked=t)}function _a(e,t){t?e.hasAttribute(`selected`)||e.setAttribute(`selected`,``):e.removeAttribute(`selected`)}function va(e,t,n,r){var i=ya(e);w&&(i[t]=e.getAttribute(t),t===`src`||t===`srcset`||t===`href`&&e.nodeName===fa)||i[t]!==(i[t]=n)&&(t===`loading`&&(e[pe]=n),n==null?e.removeAttribute(t):typeof n!=`string`&&xa(e).includes(t)?e[t]=n:e.setAttribute(t,n))}function ya(e){return e[me]??={[ua]:e.nodeName.includes(`-`),[da]:e.namespaceURI===He}}var ba=new Map;function xa(e){var t=e.getAttribute(`is`)||e.nodeName,n=ba.get(t);if(n)return n;ba.set(t,n=[]);for(var r,i=e,a=Element.prototype;a!==i;){for(var o in r=c(i),r)r[o].set&&o!==`innerHTML`&&o!==`textContent`&&o!==`innerText`&&n.push(o);i=d(i)}return n}function Sa(e,t,n=t){var r=new WeakSet;er(e,`input`,async i=>{var a=i?e.defaultValue:e.value;if(a=Ca(e)?wa(a):a,n(a),M!==null&&r.add(M),await Vr(),a!==(a=t())){var o=e.selectionStart,s=e.selectionEnd,c=e.value.length;if(e.value=a??``,s!==null){var l=e.value.length;o===s&&s===c&&l>c?(e.selectionStart=l,e.selectionEnd=l):(e.selectionStart=o,e.selectionEnd=Math.min(s,l))}}}),(w&&e.defaultValue!==e.value||Q(t)==null&&e.value)&&(n(Ca(e)?wa(e.value):e.value),M!==null&&r.add(M)),dr(()=>{var n=t();if(e===document.activeElement){var i=O?zt:M;if(r.has(i))return}Ca(e)&&n===wa(e.value)||e.type===`date`&&!n&&!e.value||n!==e.value&&(e.value=n??``)})}function Ca(e){var t=e.type;return t===`number`||t===`range`}function wa(e){return e===``?null:+e}function Ta(e,t){return e===t||e?.[de]===t}function Ea(e={},t,n,r){var i=k.r,a=G;return lr(()=>{var o,s;return dr(()=>{o=s,s=r?.()||[],Q(()=>{Ta(n(...s),e)||(t(e,...s),o&&Ta(n(...o),e)&&t(null,...o))})}),()=>{let r=a;for(;r!==i&&r.parent!==null&&r.parent.f&33554432;)r=r.parent;let o=()=>{s&&Ta(n(...s),e)&&t(null,...s)},c=r.teardown;r.teardown=()=>{o(),c?.()}}}),e}function Da(e=!1){let t=k,n=t.l.u;if(!n)return;let r=()=>Gr(t.s);if(e){let e=0,n={},i=pn(()=>{let r=!1,i=t.s;for(let e in i)i[e]!==n[e]&&(n[e]=i[e],r=!0);return r&&e++,e});r=()=>Z(i)}n.b.length&&sr(()=>{Oa(t,r),g(n.b)}),ar(()=>{let e=Q(()=>n.m.map(h));return()=>{for(let t of e)typeof t==`function`&&t()}}),n.a.length&&ar(()=>{Oa(t,r),g(n.a)})}function Oa(e,t){if(e.l.s)for(let t of e.l.s)Z(t);t()}function ka(e,t,n,r){var i=!nt||(n&2)!=0,a=(n&8)!=0,o=(n&16)!=0,c=r,l=!0,u=void 0,d=()=>o&&i?(u??=pn(r),Z(u)):(l&&(l=!1,c=o?Q(r):r),c);let f;if(a){var p=de in e||fe in e;f=s(e,t)?.set??(p&&t in e?n=>e[t]=n:void 0)}var m,h=!1;a?[m,h]=It(()=>e[t]):m=e[t],m===void 0&&r!==void 0&&(m=d(),f&&(i&&Fe(t),f(m)));var g=i?()=>{var n=e[t];return n===void 0?d():(l=!0,n)}:()=>{var n=e[t];return n!==void 0&&(c=void 0),n===void 0?c:n};if(i&&!(n&4))return g;if(f){var _=e.$$legacy;return(function(e,t){return arguments.length>0?((!i||!t||_||h)&&f(t?g():e),e):g()})}var v=!1,y=(n&1?pn:_n)(()=>(v=!1,g()));a&&Z(y);var b=G;return(function(e,t){if(arguments.length>0){let n=t?Z(y):i&&a?Pn(e):e;return F(y,n),v=!0,c!==void 0&&(c=n),e}return Er&&v||b.f&16384?y.v:Z(y)})}function Aa(e){return class extends ja{constructor(t){super({component:e,...t})}}}var ja=class{#e;#t;constructor(e){var t=new Map,n=(e,n)=>{var r=kn(n,!1,!1);return t.set(e,r),r};let r=new Proxy({...e.props||{},$$events:{}},{get(e,r){return Z(t.get(r)??n(r,Reflect.get(e,r)))},has(e,r){return r===fe?!0:(Z(t.get(r)??n(r,Reflect.get(e,r))),Reflect.has(e,r))},set(e,r,i){return F(t.get(r)??n(r,i),i),Reflect.set(e,r,i)}});this.#t=(e.hydrate?gi:hi)(e.component,{target:e.target,anchor:e.anchor,props:r,context:e.context,intro:e.intro??!1,recover:e.recover,transformError:e.transformError}),!O&&(!e?.props?.$$host||e.sync===!1)&&Jt(),this.#e=r.$$events;for(let e of Object.keys(this.#t))e===`$set`||e===`$destroy`||e===`$on`||o(this,e,{get(){return this.#t[e]},set(t){this.#t[e]=t},enumerable:!0});this.#t.$set=e=>{Object.assign(r,e)},this.#t.$destroy=()=>{bi(this.#t)}}$set(e){this.#t.$set(e)}$on(e,t){this.#e[e]=this.#e[e]||[];let n=(...e)=>t.call(this,...e);return this.#e[e].push(n),()=>{this.#e[e]=this.#e[e].filter(e=>e!==n)}}$destroy(){this.#t.$destroy()}};function Ma(e,t){if(O||xe(`hydratable`),w){let t=window.__svelte?.h;if(t?.has(e))return t.get(e);We(e)}return t()}var Na=t({afterUpdate:()=>Ba,beforeUpdate:()=>za,createContext:()=>ct,createEventDispatcher:()=>Ra,createRawSnippet:()=>Ii,flushSync:()=>Jt,fork:()=>rn,getAbortSignal:()=>Pa,getAllContexts:()=>ft,getContext:()=>lt,hasContext:()=>dt,hydratable:()=>Ma,hydrate:()=>gi,mount:()=>hi,onDestroy:()=>Ia,onMount:()=>Fa,setContext:()=>ut,settled:()=>Hr,tick:()=>Vr,unmount:()=>bi,untrack:()=>Q});function Pa(){return H===null&&Me(),(H.ac??=new AbortController).signal}function Fa(e){k===null&&Se(`onMount`),nt&&k.l!==null?Va(k).m.push(e):ar(()=>{let t=Q(e);if(typeof t==`function`)return t})}function Ia(e){k===null&&Se(`onDestroy`),Fa(()=>()=>Q(e))}function La(e,t,{bubbles:n=!1,cancelable:r=!1}={}){return new CustomEvent(e,{detail:t,bubbles:n,cancelable:r})}function Ra(){let e=k;return e===null&&Se(`createEventDispatcher`),(t,r,i)=>{let a=e.s.$$events?.[t];if(a){let o=n(a)?a.slice():[a],s=La(t,r,i);for(let t of o)t.call(e.x,s);return!s.defaultPrevented}return!0}}function za(e){k===null&&Se(`beforeUpdate`),k.l===null&&Pe(`beforeUpdate`),Va(k).b.push(e)}function Ba(e){k===null&&Se(`afterUpdate`),k.l===null&&Pe(`afterUpdate`),Va(k).a.push(e)}function Va(e){var t=e.l;return t.u??={a:[],b:[],m:[]}}export{On as $,di as A,Q as B,Fi as C,Si as D,wi as E,ei as F,Xn as G,fr as H,$r as I,Un as J,Rn as K,Z as L,li as M,ui as N,mi as O,ti as P,F as Q,Hr as R,Li as S,Ti as T,ar as U,lr as V,sr as W,Gn as X,Wn as Y,Pn as Z,aa as _,ka as a,lt as at,Ji as b,Sa as c,ut as ct,ga as d,Xe as dt,_n as et,_a as f,Ye as ft,oa as g,sa as h,Aa as i,kt as it,si as j,fi as k,ma as l,at as lt,ca as m,Ia as n,Ft as nt,Da as o,mt as ot,ha as p,t as pt,Ln as q,Fa as r,Pt as rt,Ea as s,pt as st,Na as t,gn as tt,va as u,rt as ut,ra as v,ki as w,Ki as x,Zi as y,Vr as z};
@@ -0,0 +1 @@
1
+ import{$ as e,A as t,D as n,F as r,H as i,I as a,J as o,L as s,O as c,P as l,Q as u,T as d,X as f,Y as p,a as m,c as h,ft as g,j as _,k as v,l as y,ot as b,s as x,st as S,tt as C,u as w,v as T,w as E,z as D}from"./CB9H0ifB.js";import"./CT0T0Gak.js";var O=0,k=_(`<button type="button" class="flex w-0 items-center justify-center overflow-hidden bg-emerald-50 leading-none text-emerald-700 opacity-0 transition-all duration-150 group-hover/chip:w-4 group-hover/chip:pr-1 group-hover/chip:opacity-100 hover:bg-red-100! hover:text-red-700!" title="Remove tag">×</button>`),A=_(`<span class="group/chip inline-flex h-5 max-w-full items-stretch overflow-hidden rounded-md text-[11px] font-medium ring-1 ring-inset ring-emerald-200/70"><span class="flex items-center bg-emerald-100/80 px-1.5 text-[9px] uppercase leading-none tracking-wider text-emerald-700"> </span> <span class="flex items-center bg-emerald-50 px-1.5 leading-none text-emerald-800"><span class="truncate"> </span></span> <!></span>`),j=_(`<button type="button" aria-label="Add tag"> </button>`),M=_(`<option></option>`),N=_(`<datalist></datalist>`),P=_(`<form class="inline-flex items-center gap-1"><input type="text" placeholder="Type" class="h-5.5 w-20 rounded border border-slate-300 px-1.5 text-[11px] outline-none focus:border-brand-700"/> <!> <input type="text" placeholder="Value" class="h-5.5 w-24 rounded border border-slate-300 px-1.5 text-[11px] outline-none focus:border-brand-700"/> <button type="submit" class="h-5.5 rounded bg-slate-900 px-2 text-[11px] font-medium text-white disabled:opacity-40">Add</button> <button type="button" class="h-5.5 rounded px-1 text-[11px] text-slate-500 hover:text-slate-800">Cancel</button></form>`),F=_(`<div class="flex flex-wrap items-center gap-1"><!> <!></div>`);function I(l,_){S(_,!0);let I=m(_,`typeOptions`,19,()=>[]),L=m(_,`addLabel`,3,`+ Tag`),R=e(!1),z=e(``),B=e(``),V=e(null),H=`taglist-types-${++O}`;async function U(){u(R,!0),await D(),s(V)?.focus()}function W(){u(R,!1),u(z,``),u(B,``)}async function G(e){e.preventDefault();let t=s(z).trim(),n=s(B).trim();!t||!n||(await _.onAddTag?.(t,n),W())}function K(e){e.key===`Escape`&&W()}let q=C(()=>!!(_.tags&&_.tags.length>0));var J=t(),Y=p(J),X=e=>{var l=F(),m=o(l),b=e=>{var a=t();E(p(a),17,()=>_.tags,d,(e,t)=>{var a=A(),l=o(a),u=o(l,!0);g(l);var d=f(l,2),p=o(d),m=o(p,!0);g(p),g(d);var h=f(d,2),y=e=>{var n=k();i(()=>w(n,`aria-label`,`Remove tag ${s(t).type}: ${s(t).value}`)),r(`click`,n,()=>_.onRemoveTag?.(s(t).type,s(t).value)),v(e,n)};n(h,e=>{_.onRemoveTag&&e(y)}),g(a),i(()=>{w(a,`title`,`${s(t).type} — ${s(t).value}`),c(u,s(t).type),c(m,s(t).value)}),v(e,a)}),v(e,a)};n(m,e=>{_.tags&&e(b)});var S=f(m,2),C=e=>{var l=t(),d=p(l),m=e=>{var t=j();let n;var a=o(t,!0);g(t),i(()=>{n=T(t,1,`inline-flex h-5 items-center rounded-md border border-dashed border-slate-300 px-1.5 text-[11px] font-medium text-slate-500 opacity-0 transition group-hover:opacity-100 group-focus-within:opacity-100 hover:border-slate-400 hover:bg-slate-50 hover:text-slate-700`,null,n,{"opacity-100":!s(q)}),c(a,L())}),r(`click`,t,U),v(e,t)},_=e=>{var t=P(),c=o(t);y(c),x(c,e=>u(V,e),()=>s(V));var l=f(c,2),d=e=>{var t=N();E(t,20,I,e=>e,(e,t)=>{var n=M(),r={};i(()=>{r!==(r=t)&&(n.value=(n.__value=t)??``)}),v(e,n)}),g(t),i(()=>w(t,`id`,H)),v(e,t)};n(l,e=>{I().length>0&&e(d)});var p=f(l,2);y(p);var m=f(p,2),_=f(m,2);g(t),i(e=>{w(c,`list`,I().length>0?H:void 0),m.disabled=e},[()=>s(z).trim().length===0||s(B).trim().length===0]),a(`submit`,t,G),r(`keydown`,c,K),h(c,()=>s(z),e=>u(z,e)),r(`keydown`,p,K),h(p,()=>s(B),e=>u(B,e)),r(`click`,_,W),v(e,t)};n(d,e=>{s(R)?e(_,-1):e(m)}),v(e,l)};n(S,e=>{_.onAddTag&&e(C)}),g(l),v(e,l)};n(Y,e=>{(s(q)||_.onAddTag)&&e(X)}),v(l,J),b()}l([`click`,`keydown`]);export{I as t};
@@ -0,0 +1 @@
1
+ import{et as e}from"./ChWRqgym.js";var t=6e5,n=16,r=12,i=()=>{if(typeof crypto>`u`||!crypto.subtle)throw Error(`WebCrypto not available. Use a modern browser served over https or localhost.`);return crypto.subtle},a=e=>{let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t)},o=e=>{let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e+=1)n[e]=t.charCodeAt(e);return n},s=async(e,n)=>{let r=new TextEncoder,a=await i().importKey(`raw`,r.encode(e),{name:`PBKDF2`},!1,[`deriveKey`]);return i().deriveKey({name:`PBKDF2`,hash:`SHA-256`,salt:n,iterations:t},a,{name:`AES-GCM`,length:256},!1,[`encrypt`,`decrypt`])},c=class extends Error{constructor(){super(`Passphrase must be at least 8 characters.`),this.name=`WeakPassphraseError`}},l=class extends Error{constructor(){super(`Wrong passphrase, or the .unspa file is corrupted.`),this.name=`WrongPassphraseError`}},u=class extends Error{constructor(e){super(`Not a valid Unspaghettit bundle: ${e}`),this.name=`MalformedEnvelopeError`}},d=async(e,o)=>{if(o.length<8)throw new c;let l=crypto.getRandomValues(new Uint8Array(n)),u=crypto.getRandomValues(new Uint8Array(r)),d=await s(o,l),f=await i().encrypt({name:`AES-GCM`,iv:u},d,new TextEncoder().encode(e));return{format:`unspaghettit-encrypted-bundle`,version:1,algorithm:`AES-GCM`,kdf:`PBKDF2-SHA256`,iterations:t,salt:a(l),iv:a(u),ciphertext:a(new Uint8Array(f))}},f=e=>{if(!e||typeof e!=`object`)throw new u(`not an object`);let t=e;if(t.format!==`unspaghettit-encrypted-bundle`)throw new u(`wrong format tag`);if(t.version!==1)throw new u(`unsupported version ${t.version}`);if(t.algorithm!==`AES-GCM`)throw new u(`unsupported algorithm ${t.algorithm}`);if(t.kdf!==`PBKDF2-SHA256`)throw new u(`unsupported kdf ${t.kdf}`);if(typeof t.iterations!=`number`||t.iterations<1e5)throw new u(`iterations missing or too low`);if(typeof t.salt!=`string`||typeof t.iv!=`string`||typeof t.ciphertext!=`string`)throw new u(`salt / iv / ciphertext must be base64 strings`);return t},p=async(e,t)=>{let n=f(e),r=o(n.salt),a=o(n.iv),c=o(n.ciphertext),u=await s(t,r);try{let e=await i().decrypt({name:`AES-GCM`,iv:a},u,c);return new TextDecoder().decode(e)}catch{throw new l}},m=e=>{let t=e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,64);return t.length>0?t:`project`},h=async(t,n)=>{let r=await e(`/api/projects/${encodeURIComponent(String(t))}/bundle`);if(!r.ok)throw Error(`Bundle fetch failed (${r.status}): ${await r.text().catch(()=>``)}`);let i=await r.json();return{envelope:await d(JSON.stringify(i),n),projectName:i.project.name}},g=(e,t)=>{let n=new Date().toISOString().slice(0,10).replace(/-/g,``),r=`${m(t)}-${n}.unspa`,i=new Blob([JSON.stringify(e,null,2)],{type:`application/octet-stream`}),a=URL.createObjectURL(i),o=document.createElement(`a`);o.href=a,o.download=r,document.body.appendChild(o),o.click(),document.body.removeChild(o),setTimeout(()=>URL.revokeObjectURL(a),1e3)},_=async e=>{let t;try{t=await e.text()}catch{throw new u(`could not read ${e.name}`)}let n;try{n=JSON.parse(t)}catch{throw new u(`file is not valid JSON`)}if(!n||typeof n!=`object`)throw new u(`file is not a JSON object`);return n},v=async(t,n)=>{let r=await p(t,n),i;try{i=JSON.parse(r)}catch{throw new u(`decrypted payload is not valid JSON`)}let a=await e(`/api/projects/import`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(i)});if(!a.ok)throw Error(`Import failed (${a.status}): ${await a.text().catch(()=>``)}`);return await a.json()};export{u as a,_ as i,h as n,c as o,v as r,l as s,g as t};
@@ -1 +1 @@
1
- import{I as e,Q as t,X as n,Z as r}from"./Gkn8_Gwp.js";import{n as i,t as a}from"./B6PktD7d.js";var o=`Unknown`,s=new class{#e=t(!0);get loading(){return e(this.#e)}set loading(e){r(this.#e,e,!0)}#t=t(n([]));get summaries(){return e(this.#t)}set summaries(e){r(this.#t,e,!0)}#n=t(``);get search(){return e(this.#n)}set search(e){r(this.#n,e,!0)}#r=t(null);get pendingDeleteId(){return e(this.#r)}set pendingDeleteId(e){r(this.#r,e,!0)}#i=t(``);get selectedProjectId(){return e(this.#i)}set selectedProjectId(e){r(this.#i,e,!0)}#a=t(null);get error(){return e(this.#a)}set error(e){r(this.#a,e,!0)}async refresh(){try{this.loading=!0,this.error=null;let e=await i();this.summaries=[...await e.useCases.listProjects()]}catch(e){this.error=e.message}finally{this.loading=!1}}async refreshSilent(){try{let e=await i();this.summaries=[...await e.useCases.listProjects()],this.error=null}catch(e){this.error=e.message}}setSearch(e){this.search=e,a(`project.search_updated`,{query:e})}setSelectedProject(e){this.selectedProjectId=e,e&&a(`project.opened`,{id:e})}openProject(e){return this.setSelectedProject(e),`/projects/${e}`}stagePendingDelete(e){this.pendingDeleteId=e,a(`project.delete_requested`,{id:e})}clearPendingDelete(){this.pendingDeleteId=null}async create(e,t){let n=await(await i()).useCases.createProject({name:e,description:t});return await this.refreshSilent(),a(`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 i()).useCases.deleteProject(e),a(`project.deleted`,{id:String(e)})}async reconcileOrphanFeatures(){let e=await i(),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 a=t.filter(e=>!r.has(String(e.id)));if(a.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 a)await e.useCases.addFeatureToProject(s.id,t.id);await this.refreshSilent()}};export{s as t};
1
+ import{$ as e,L as t,Q as n,Z as r}from"./CB9H0ifB.js";import{n as i,t as a}from"./ChWRqgym.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 i();this.summaries=[...await e.useCases.listProjects()]}catch(e){this.error=e.message}finally{this.loading=!1}}async refreshSilent(){try{let e=await i();this.summaries=[...await e.useCases.listProjects()],this.error=null}catch(e){this.error=e.message}}setSearch(e){this.search=e,a(`project.search_updated`,{query:e})}setSelectedProject(e){this.selectedProjectId=e,e&&a(`project.opened`,{id:e})}openProject(e){return this.setSelectedProject(e),`/projects/${e}`}stagePendingDelete(e){this.pendingDeleteId=e,a(`project.delete_requested`,{id:e})}clearPendingDelete(){this.pendingDeleteId=null}async create(e,t){let n=await(await i()).useCases.createProject({name:e,description:t});return await this.refreshSilent(),a(`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 i()).useCases.deleteProject(e),a(`project.deleted`,{id:String(e)})}async reconcileOrphanFeatures(){let e=await i(),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 a=t.filter(e=>!r.has(String(e.id)));if(a.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 a)await e.useCases.addFeatureToProject(s.id,t.id);await this.refreshSilent()}};export{s as t};