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