@mhmo91/schmancy 0.9.27 → 0.10.1
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/custom-elements.json +987 -2259
- package/dist/active-host-0of-L858.cjs +1 -0
- package/dist/active-host-0of-L858.cjs.map +1 -0
- package/dist/active-host-D-a1X-nq.js +57 -0
- package/dist/active-host-D-a1X-nq.js.map +1 -0
- package/dist/agent/{flow-CvG1fLW5.js.map → flow-CaPi2G8y.js.map} +1 -1
- package/dist/agent/{rolldown-runtime-BIIoCavz.js → rolldown-runtime-DsMetpgY.js} +2 -9
- package/dist/agent/schmancy.agent.js +6465 -7794
- package/dist/agent/schmancy.agent.js.map +1 -1
- package/dist/agent/schmancy.manifest.json +262 -1462
- package/dist/agent/{vendor-highlight-Dow87ZL_.js → vendor-highlight-CHJZQQB7.js} +85 -90
- package/dist/agent/{vendor-highlight-Dow87ZL_.js.map → vendor-highlight-CHJZQQB7.js.map} +1 -1
- package/dist/agent/{vendor-jsqr-Bl4iAtKC.js → vendor-jsqr-r7GNh4P3.js} +1 -1
- package/dist/agent/{vendor-jsqr-Bl4iAtKC.js.map → vendor-jsqr-r7GNh4P3.js.map} +1 -1
- package/dist/agent/{vendor-material-color-DcL7ZPxx.js.map → vendor-material-color-Be96dpGE.js.map} +1 -1
- package/dist/{animation-hXFClrIn.js.map → animation-BK-8BwY8.js.map} +1 -1
- package/dist/{animation-CQRdLgzX.cjs.map → animation-CO_Csq84.cjs.map} +1 -1
- package/dist/{area-BGBCMC79.js → area-C_J4qxKO.js} +20 -15
- package/dist/area-C_J4qxKO.js.map +1 -0
- package/dist/area-ISC8Mdkh.cjs +12 -0
- package/dist/area-ISC8Mdkh.cjs.map +1 -0
- package/dist/area.cjs +1 -1
- package/dist/area.js +2 -2
- package/dist/{audio-Dvr-RBzE.cjs → audio-DZN8HsSS.cjs} +1 -1
- package/dist/{audio-Dvr-RBzE.cjs.map → audio-DZN8HsSS.cjs.map} +1 -1
- package/dist/{audio-ql6nvY0y.js → audio-Tmre4WyL.js} +1 -1
- package/dist/{audio-ql6nvY0y.js.map → audio-Tmre4WyL.js.map} +1 -1
- package/dist/audio.cjs +1 -1
- package/dist/audio.js +2 -2
- package/dist/autocomplete-BDF85W0J.cjs +115 -0
- package/dist/autocomplete-BDF85W0J.cjs.map +1 -0
- package/dist/{autocomplete-C2P0Soht.js → autocomplete-CM8VqW9S.js} +29 -26
- package/dist/autocomplete-CM8VqW9S.js.map +1 -0
- package/dist/autocomplete.cjs +1 -1
- package/dist/autocomplete.js +1 -1
- package/dist/avatar.cjs +7 -0
- package/dist/avatar.cjs.map +1 -0
- package/dist/avatar.js +87 -0
- package/dist/avatar.js.map +1 -0
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/boat-CpXe-Qto.cjs +80 -0
- package/dist/boat-CpXe-Qto.cjs.map +1 -0
- package/dist/{boat-DXZ0k7oa.js → boat-DxYNK4xT.js} +43 -54
- package/dist/boat-DxYNK4xT.js.map +1 -0
- package/dist/boat.cjs +1 -1
- package/dist/boat.js +1 -1
- package/dist/breadcrumb.cjs +4 -4
- package/dist/breadcrumb.cjs.map +1 -1
- package/dist/breadcrumb.js +16 -11
- package/dist/breadcrumb.js.map +1 -1
- package/dist/{busy-iRjq6Nvd.js → busy-CP-gRfAP.js} +14 -9
- package/dist/busy-CP-gRfAP.js.map +1 -0
- package/dist/{busy-DGYhpTnO.cjs → busy-Dma4gtnz.cjs} +4 -4
- package/dist/busy-Dma4gtnz.cjs.map +1 -0
- package/dist/busy.cjs +1 -1
- package/dist/busy.js +1 -1
- package/dist/button.cjs +24 -24
- package/dist/button.cjs.map +1 -1
- package/dist/button.js +42 -37
- package/dist/button.js.map +1 -1
- package/dist/{card-wUTjx0EC.js → card-Bv--HeGO.js} +41 -30
- package/dist/card-Bv--HeGO.js.map +1 -0
- package/dist/{card-DjYnCckw.cjs → card-ClroODSK.cjs} +6 -6
- package/dist/card-ClroODSK.cjs.map +1 -0
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/charts.cjs +5 -5
- package/dist/charts.cjs.map +1 -1
- package/dist/charts.js +21 -16
- package/dist/charts.js.map +1 -1
- package/dist/{checkbox-VBSenxgb.js → checkbox-1gQOOcja.js} +86 -82
- package/dist/checkbox-1gQOOcja.js.map +1 -0
- package/dist/checkbox-DvTZXN1Y.cjs +39 -0
- package/dist/checkbox-DvTZXN1Y.cjs.map +1 -0
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-D6ptH5re.cjs → chips-Bw7FNDpX.cjs} +19 -19
- package/dist/chips-Bw7FNDpX.cjs.map +1 -0
- package/dist/{chips-BDS9lkPa.js → chips-wkfKzf_e.js} +146 -136
- package/dist/chips-wkfKzf_e.js.map +1 -0
- package/dist/chips.cjs +1 -1
- package/dist/chips.js +2 -2
- package/dist/{code-highlight-BzRmBZzz.cjs → code-highlight-CJzuds4c.cjs} +15 -15
- package/dist/code-highlight-CJzuds4c.cjs.map +1 -0
- package/dist/{code-highlight-Bi91XHJN.js → code-highlight-CcdCFMrn.js} +37 -40
- package/dist/code-highlight-CcdCFMrn.js.map +1 -0
- package/dist/code-highlight.cjs +1 -1
- package/dist/code-highlight.js +1 -1
- package/dist/connectivity.cjs +2 -2
- package/dist/connectivity.cjs.map +1 -1
- package/dist/connectivity.js +10 -7
- package/dist/connectivity.js.map +1 -1
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +2 -2
- package/dist/context-Bdu1xt0W.js +3 -0
- package/dist/{context-BerzpUhI.js.map → context-Bdu1xt0W.js.map} +1 -1
- package/dist/context-daN5G6HS.cjs +1 -0
- package/dist/{context-C6dHUHhi.cjs.map → context-daN5G6HS.cjs.map} +1 -1
- package/dist/{cursor-glow-BydlDInj.js → cursor-glow-Ah7VXSj7.js} +1 -1
- package/dist/{cursor-glow-BydlDInj.js.map → cursor-glow-Ah7VXSj7.js.map} +1 -1
- package/dist/{cursor-glow-Duw9jHmh.cjs → cursor-glow-Bulq-38P.cjs} +1 -1
- package/dist/{cursor-glow-Duw9jHmh.cjs.map → cursor-glow-Bulq-38P.cjs.map} +1 -1
- package/dist/{date-range-ClTMg1AB.js → date-range-BDHz_Olm.js} +16 -17
- package/dist/date-range-BDHz_Olm.js.map +1 -0
- package/dist/date-range-BsPW60vp.cjs +131 -0
- package/dist/date-range-BsPW60vp.cjs.map +1 -0
- package/dist/{date-range-inline-CpKG6qt2.js → date-range-inline-1NmZE_Xr.js} +5 -5
- package/dist/{date-range-inline-CpKG6qt2.js.map → date-range-inline-1NmZE_Xr.js.map} +1 -1
- package/dist/date-range-inline-BsjNNGFR.cjs +43 -0
- package/dist/{date-range-inline-B9Dp2z6C.cjs.map → date-range-inline-BsjNNGFR.cjs.map} +1 -1
- package/dist/date-range-inline.cjs +1 -1
- package/dist/date-range-inline.js +1 -1
- package/dist/date-range.cjs +1 -1
- package/dist/date-range.js +1 -1
- package/dist/delay.cjs +9 -1
- package/dist/delay.cjs.map +1 -0
- package/dist/delay.js +77 -2
- package/dist/delay.js.map +1 -0
- package/dist/{details-CPjlqQD4.js → details-BEp2s2ca.js} +19 -18
- package/dist/details-BEp2s2ca.js.map +1 -0
- package/dist/{details-Cz9ok9si.cjs → details-BtUNqzn8.cjs} +9 -9
- package/dist/details-BtUNqzn8.cjs.map +1 -0
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/{dialog-service-DH-tjPuE.js → dialog-service-DI9PPy4H.js} +2 -2
- package/dist/dialog-service-DI9PPy4H.js.map +1 -0
- package/dist/{dialog-service-CzDO08Gy.cjs → dialog-service-DJd5L0f5.cjs} +1 -1
- package/dist/dialog-service-DJd5L0f5.cjs.map +1 -0
- package/dist/dialog.cjs +2 -2
- package/dist/dialog.cjs.map +1 -1
- package/dist/dialog.js +13 -14
- package/dist/dialog.js.map +1 -1
- package/dist/directives.cjs +2 -11
- package/dist/directives.cjs.map +1 -1
- package/dist/directives.js +141 -227
- package/dist/directives.js.map +1 -1
- package/dist/discovery.cjs +1 -1
- package/dist/discovery.cjs.map +1 -1
- package/dist/discovery.js +1 -1
- package/dist/discovery.js.map +1 -1
- package/dist/{divider-CILo3_vi.cjs → divider-CpNT11Iy.cjs} +3 -3
- package/dist/divider-CpNT11Iy.cjs.map +1 -0
- package/dist/{divider-ghgyw5CU.js → divider-VxpjZ8hk.js} +11 -9
- package/dist/divider-VxpjZ8hk.js.map +1 -0
- package/dist/divider.cjs +1 -1
- package/dist/divider.js +1 -1
- package/dist/dropdown.cjs +4 -4
- package/dist/dropdown.cjs.map +1 -1
- package/dist/dropdown.js +29 -28
- package/dist/dropdown.js.map +1 -1
- package/dist/expand-05azMpho.cjs +141 -0
- package/dist/expand-05azMpho.cjs.map +1 -0
- package/dist/{expand-CbjBr_Ds.js → expand-CRUl3-mN.js} +24 -20
- package/dist/expand-CRUl3-mN.js.map +1 -0
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/{extra-BZeZOMBI.cjs → extra-CyERULfm.cjs} +6 -6
- package/dist/extra-CyERULfm.cjs.map +1 -0
- package/dist/{extra-DK9MQtPJ.js → extra-aNV1fO6W.js} +19 -14
- package/dist/extra-aNV1fO6W.js.map +1 -0
- package/dist/extra.cjs +1 -1
- package/dist/extra.js +1 -1
- package/dist/float-DRET9mVZ.cjs +1 -0
- package/dist/{float-CuZ8LOgB.cjs.map → float-DRET9mVZ.cjs.map} +1 -1
- package/dist/{float-BfCvGeY9.js → float-N3qhNET_.js} +2 -2
- package/dist/{float-BfCvGeY9.js.map → float-N3qhNET_.js.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/{form-rCZqoAoK.js → form-BtwOBMZ9.js} +1 -1
- package/dist/form-BtwOBMZ9.js.map +1 -0
- package/dist/{form-wI58M85H.cjs → form-CSJp687X.cjs} +1 -1
- package/dist/form-CSJp687X.cjs.map +1 -0
- package/dist/form.cjs +1 -1
- package/dist/form.js +1 -1
- package/dist/handover/agent-runtime-followups.md +1 -1
- package/dist/handover/agent-runtime-v1.md +3 -3
- package/dist/handover/claude-design-brief.md +19 -54
- package/dist/handover/claude-design-setup.md +57 -0
- package/dist/{hashContent-B2IntJQf.js.map → hashContent-1ARKIsx9.js.map} +1 -1
- package/dist/{hashContent-CahnEuut.cjs.map → hashContent-Bp5S6T4U.cjs.map} +1 -1
- package/dist/{icons-Drq4kKy2.js → icons-BBJqwT_B.js} +27 -24
- package/dist/icons-BBJqwT_B.js.map +1 -0
- package/dist/icons-CNixJ6kL.cjs +52 -0
- package/dist/icons-CNixJ6kL.cjs.map +1 -0
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-BmyHW8km.js → iframe-DoN_toqE.js} +17 -11
- package/dist/iframe-DoN_toqE.js.map +1 -0
- package/dist/iframe-g-4DjAD7.cjs +24 -0
- package/dist/iframe-g-4DjAD7.cjs.map +1 -0
- package/dist/iframe.cjs +1 -1
- package/dist/iframe.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +77 -77
- package/dist/{input-Bc3bVISm.js → input-ClnkMJgh.js} +30 -30
- package/dist/input-ClnkMJgh.js.map +1 -0
- package/dist/{input-BGNZlfL8.cjs → input-CwFslLcF.cjs} +14 -14
- package/dist/input-CwFslLcF.cjs.map +1 -0
- package/dist/{input-chip-DN-cwf11.cjs → input-chip-DMXRT7bK.cjs} +2 -2
- package/dist/input-chip-DMXRT7bK.cjs.map +1 -0
- package/dist/{input-chip-BQrjpjaQ.js → input-chip-DwSyFv1x.js} +7 -4
- package/dist/input-chip-DwSyFv1x.js.map +1 -0
- package/dist/input.cjs +1 -1
- package/dist/input.js +1 -1
- package/dist/json.cjs +1 -1
- package/dist/json.cjs.map +1 -1
- package/dist/json.js +7 -5
- package/dist/json.js.map +1 -1
- package/dist/kbd.cjs +2 -2
- package/dist/kbd.cjs.map +1 -1
- package/dist/kbd.js +9 -7
- package/dist/kbd.js.map +1 -1
- package/dist/{layout-fjM1DWlF.js → layout-BghHmee6.js} +1 -1
- package/dist/{layout-fjM1DWlF.js.map → layout-BghHmee6.js.map} +1 -1
- package/dist/{layout-CTfRXQoz.cjs → layout-VmxXuGGp.cjs} +1 -1
- package/dist/{layout-CTfRXQoz.cjs.map → layout-VmxXuGGp.cjs.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +2 -3
- package/dist/{lazy-D6R5N5v4.js.map → lazy-B0ia54tT.js.map} +1 -1
- package/dist/{lazy-BDNnH_r7.cjs.map → lazy-Dq9mRRjT.cjs.map} +1 -1
- package/dist/{lightbox-CY52Z_ig.js → lightbox-IleIcq19.js} +13 -12
- package/dist/lightbox-IleIcq19.js.map +1 -0
- package/dist/lightbox-m5FLmYlv.cjs +202 -0
- package/dist/lightbox-m5FLmYlv.cjs.map +1 -0
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/{list-D7wUxu1C.js → list-BlXJlm16.js} +26 -21
- package/dist/list-BlXJlm16.js.map +1 -0
- package/dist/list-C-b9p1yi.cjs +40 -0
- package/dist/list-C-b9p1yi.cjs.map +1 -0
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/{magnetic-CVXEkYTA.cjs → magnetic-BH0TsofV.cjs} +1 -1
- package/dist/{magnetic-CVXEkYTA.cjs.map → magnetic-BH0TsofV.cjs.map} +1 -1
- package/dist/{magnetic-BhXebqF3.js → magnetic-BZGFxAWG.js} +2 -2
- package/dist/{magnetic-BhXebqF3.js.map → magnetic-BZGFxAWG.js.map} +1 -1
- package/dist/{mailbox-DLiBGJhY.cjs → mailbox-B0hZLpF1.cjs} +64 -66
- package/dist/mailbox-B0hZLpF1.cjs.map +1 -0
- package/dist/{mailbox--EN-JhjV.js → mailbox-DAmejcKa.js} +137 -126
- package/dist/mailbox-DAmejcKa.js.map +1 -0
- package/dist/mailbox.cjs +1 -1
- package/dist/mailbox.js +1 -1
- package/dist/{map-B0S_q3ma.js → map-BoIu47qU.js} +11 -9
- package/dist/map-BoIu47qU.js.map +1 -0
- package/dist/map-CZ0816EI.cjs +80 -0
- package/dist/map-CZ0816EI.cjs.map +1 -0
- package/dist/map.cjs +1 -1
- package/dist/map.js +1 -1
- package/dist/{menu-3edZGQ1x.cjs → menu-BFHBnp5M.cjs} +5 -5
- package/dist/menu-BFHBnp5M.cjs.map +1 -0
- package/dist/{menu-COeFpb6n.js → menu-BV9_8ys8.js} +15 -10
- package/dist/menu-BV9_8ys8.js.map +1 -0
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/mixins-BIXF7xkF.cjs +298 -0
- package/dist/mixins-BIXF7xkF.cjs.map +1 -0
- package/dist/mixins-CL1krSOE.js +627 -0
- package/dist/mixins-CL1krSOE.js.map +1 -0
- package/dist/mixins.cjs +1 -1
- package/dist/mixins.js +2 -87
- package/dist/nav-drawer.cjs +1 -1
- package/dist/nav-drawer.js +2 -2
- package/dist/navigation-bar.cjs +1 -1
- package/dist/navigation-bar.js +1 -1
- package/dist/navigation-rail.cjs +3 -3
- package/dist/navigation-rail.cjs.map +1 -1
- package/dist/navigation-rail.js +15 -16
- package/dist/navigation-rail.js.map +1 -1
- package/dist/notification-CigTy3ia.cjs +23 -0
- package/dist/notification-CigTy3ia.cjs.map +1 -0
- package/dist/{notification-CC-TFN5v.js → notification-Dzm6zWxX.js} +40 -38
- package/dist/notification-Dzm6zWxX.js.map +1 -0
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/option-BfvzzkzM.cjs +43 -0
- package/dist/option-BfvzzkzM.cjs.map +1 -0
- package/dist/{option-BwAF4nAw.js → option-Dyb0Q45u.js} +9 -7
- package/dist/option-Dyb0Q45u.js.map +1 -0
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/{overlay-stack-7bs4ZNnh.cjs → overlay-stack-BprhAE9a.cjs} +1 -1
- package/dist/{overlay-stack-7bs4ZNnh.cjs.map → overlay-stack-BprhAE9a.cjs.map} +1 -1
- package/dist/{overlay-stack-DXPYHPhk.js → overlay-stack-CAQno0CK.js} +1 -1
- package/dist/{overlay-stack-DXPYHPhk.js.map → overlay-stack-CAQno0CK.js.map} +1 -1
- package/dist/overlay.cjs +43 -45
- package/dist/overlay.cjs.map +1 -1
- package/dist/overlay.js +684 -268
- package/dist/overlay.js.map +1 -1
- package/dist/page.cjs +3 -3
- package/dist/page.cjs.map +1 -1
- package/dist/page.js +15 -13
- package/dist/page.js.map +1 -1
- package/dist/payment-card-form-CQ6sLlrh.cjs +73 -0
- package/dist/{components-DkmEgyAc.cjs.map → payment-card-form-CQ6sLlrh.cjs.map} +1 -1
- package/dist/{components-DZgJWHdZ.js → payment-card-form-D9N2Q0wM.js} +21 -22
- package/dist/{components-DZgJWHdZ.js.map → payment-card-form-D9N2Q0wM.js.map} +1 -1
- package/dist/payment-card-form.cjs +1 -0
- package/dist/payment-card-form.js +2 -0
- package/dist/{progress-Yz6EMNSu.cjs → progress-Dyri7dc2.cjs} +3 -3
- package/dist/progress-Dyri7dc2.cjs.map +1 -0
- package/dist/{progress-Bk_Q1Shy.js → progress-LPwPfzBi.js} +16 -13
- package/dist/progress-LPwPfzBi.js.map +1 -0
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/qr-scanner.cjs +5 -5
- package/dist/qr-scanner.cjs.map +1 -1
- package/dist/qr-scanner.js +14 -15
- package/dist/qr-scanner.js.map +1 -1
- package/dist/radio-group-DK-T6jGy.cjs +40 -0
- package/dist/radio-group-DK-T6jGy.cjs.map +1 -0
- package/dist/{radio-group-BcdcjLNC.js → radio-group-DqP886F-.js} +14 -12
- package/dist/radio-group-DqP886F-.js.map +1 -0
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.js +1 -1
- package/dist/range.cjs +2 -2
- package/dist/range.cjs.map +1 -1
- package/dist/range.js +9 -7
- package/dist/range.js.map +1 -1
- package/dist/{reduced-motion-BZTLqAyl.js.map → reduced-motion-D-L12p7G.js.map} +1 -1
- package/dist/{reduced-motion-9RjNnhIg.cjs.map → reduced-motion-Ds-HjMzn.cjs.map} +1 -1
- package/dist/{rxjs-utils-DJbZRjp3.cjs.map → rxjs-utils-Csnks202.cjs.map} +1 -1
- package/dist/{rxjs-utils-CKTnEKUH.js.map → rxjs-utils-d-ivVN84.js.map} +1 -1
- package/dist/rxjs-utils.cjs +1 -1
- package/dist/rxjs-utils.js +1 -1
- package/dist/{scroll-DXQv0ejL.js → scroll-BD82ANjm.js} +9 -7
- package/dist/scroll-BD82ANjm.js.map +1 -0
- package/dist/scroll-yfNU0zNO.cjs +26 -0
- package/dist/scroll-yfNU0zNO.cjs.map +1 -0
- package/dist/search-BLCRsxIC.cjs +1 -0
- package/dist/{search-CwMav5QB.cjs.map → search-BLCRsxIC.cjs.map} +1 -1
- package/dist/{search-CvUZRLF1.js → search-BTz7-Rev.js} +1 -1
- package/dist/{search-CvUZRLF1.js.map → search-BTz7-Rev.js.map} +1 -1
- package/dist/{select-BV4lK2zy.cjs → select-BR3r3SZe.cjs} +6 -6
- package/dist/select-BR3r3SZe.cjs.map +1 -0
- package/dist/{select-DKyGWDsG.js → select-GONAphZI.js} +23 -20
- package/dist/select-GONAphZI.js.map +1 -0
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/{sheet-C3TLKItO.js → sheet-C4sAGqTf.js} +22 -20
- package/dist/sheet-C4sAGqTf.js.map +1 -0
- package/dist/sheet-D9pZMrzs.cjs +35 -0
- package/dist/sheet-D9pZMrzs.cjs.map +1 -0
- package/dist/sheet.cjs +1 -1
- package/dist/sheet.js +2 -2
- package/dist/{sheet.service-Dlv20Zfc.js → sheet.service-B7h_-e-q.js} +3 -3
- package/dist/{sheet.service-Dlv20Zfc.js.map → sheet.service-B7h_-e-q.js.map} +1 -1
- package/dist/sheet.service-C1J0-i4d.cjs +1 -0
- package/dist/{sheet.service-RcDBwHmv.cjs.map → sheet.service-C1J0-i4d.cjs.map} +1 -1
- package/dist/skeleton.cjs +2 -2
- package/dist/skeleton.cjs.map +1 -1
- package/dist/skeleton.js +9 -7
- package/dist/skeleton.js.map +1 -1
- package/dist/skills/INDEX.md +1 -1
- package/dist/skills/SKILL.md +17 -5
- package/dist/skills/mixins.md +78 -20
- package/dist/skills/schmancy/INDEX.md +1 -1
- package/dist/skills/schmancy/SKILL.md +17 -5
- package/dist/skills/schmancy/mixins.md +78 -20
- package/dist/skills/schmancy/state.md +501 -0
- package/dist/skills/schmancy/theme.md +15 -0
- package/dist/skills/schmancy/timeline-tile.md +95 -0
- package/dist/skills/state.md +501 -0
- package/dist/skills/theme.md +15 -0
- package/dist/skills/timeline-tile.md +95 -0
- package/dist/slider.cjs +5 -5
- package/dist/slider.cjs.map +1 -1
- package/dist/slider.js +18 -13
- package/dist/slider.js.map +1 -1
- package/dist/{sound.service-DWZe6swU.js → sound.service-Ba_HNBLD.js} +3 -3
- package/dist/sound.service-Ba_HNBLD.js.map +1 -0
- package/dist/sound.service-CvdB2yUJ.cjs +1 -0
- package/dist/sound.service-CvdB2yUJ.cjs.map +1 -0
- package/dist/{splash-screen-DbI5RgBf.js → splash-screen-BGMZmQRT.js} +12 -9
- package/dist/splash-screen-BGMZmQRT.js.map +1 -0
- package/dist/splash-screen-DqULOTZ0.cjs +41 -0
- package/dist/splash-screen-DqULOTZ0.cjs.map +1 -0
- package/dist/splash-screen.cjs +1 -1
- package/dist/splash-screen.js +1 -1
- package/dist/{src-00DfxCJq.js → src-CHM4hrEr.js} +299 -351
- package/dist/src-CHM4hrEr.js.map +1 -0
- package/dist/src-DzFcGdcn.cjs +263 -0
- package/dist/src-DzFcGdcn.cjs.map +1 -0
- package/dist/state-BAW3C11I.cjs +1 -0
- package/dist/state-BAW3C11I.cjs.map +1 -0
- package/dist/state-ClRXrqDA.js +846 -0
- package/dist/state-ClRXrqDA.js.map +1 -0
- package/dist/state.cjs +1 -0
- package/dist/state.js +3 -0
- package/dist/steps.cjs +10 -10
- package/dist/steps.cjs.map +1 -1
- package/dist/steps.js +29 -24
- package/dist/steps.js.map +1 -1
- package/dist/surface-BHJgIDz9.js +24 -0
- package/dist/surface-BHJgIDz9.js.map +1 -0
- package/dist/surface-DW78bc8W.cjs +7 -0
- package/dist/surface-DW78bc8W.cjs.map +1 -0
- package/dist/surface.cjs +1 -1
- package/dist/surface.js +1 -1
- package/dist/switch.cjs +2 -2
- package/dist/switch.cjs.map +1 -1
- package/dist/switch.js +7 -5
- package/dist/switch.js.map +1 -1
- package/dist/table.cjs +72 -1
- package/dist/table.cjs.map +1 -0
- package/dist/table.js +174 -2
- package/dist/table.js.map +1 -0
- package/dist/{tabs-Ce55RbwF.js → tabs-BCRVyQU1.js} +22 -22
- package/dist/tabs-BCRVyQU1.js.map +1 -0
- package/dist/tabs-EIEhkEUb.cjs +31 -0
- package/dist/tabs-EIEhkEUb.cjs.map +1 -0
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.js +1 -1
- package/dist/teleport.cjs +1 -1
- package/dist/teleport.js +2 -2
- package/dist/{textarea-DjN1D9u0.js → textarea-DApOhSAL.js} +30 -28
- package/dist/textarea-DApOhSAL.js.map +1 -0
- package/dist/textarea-zxNlRLVm.cjs +39 -0
- package/dist/textarea-zxNlRLVm.cjs.map +1 -0
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-pbxlt72h.js → theme-BCUjQH6-.js} +45 -41
- package/dist/{theme-pbxlt72h.js.map → theme-BCUjQH6-.js.map} +1 -1
- package/dist/theme-Z43TLE61.cjs +181 -0
- package/dist/{theme-B-IJ2r7Q.cjs.map → theme-Z43TLE61.cjs.map} +1 -1
- package/dist/theme-button-Czsdp3o1.cjs +8 -0
- package/dist/theme-button-Czsdp3o1.cjs.map +1 -0
- package/dist/{theme-button-CEMeAUOL.js → theme-button-DdSbcivT.js} +3 -4
- package/dist/theme-button-DdSbcivT.js.map +1 -0
- package/dist/theme-button.cjs +1 -1
- package/dist/theme-button.js +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/{theme.events-NuihzD_p.js.map → theme.events-Cv7N4Toe.js.map} +1 -1
- package/dist/{theme.events-DakXxZeP.cjs.map → theme.events-DM4H5F2d.cjs.map} +1 -1
- package/dist/{theme.interface-DTwkuAKJ.cjs.map → theme.interface-D9l33b-M.cjs.map} +1 -1
- package/dist/{theme.interface-Buged9Cg.js.map → theme.interface-DnVNre4O.js.map} +1 -1
- package/dist/theme.js +5 -5
- package/dist/{theme.service-cOfPrtfe.js → theme.service-9clsqyee.js} +4 -4
- package/dist/theme.service-9clsqyee.js.map +1 -0
- package/dist/theme.service-CP71ojp6.cjs +1 -0
- package/dist/theme.service-CP71ojp6.cjs.map +1 -0
- package/dist/timeline.cjs +277 -0
- package/dist/timeline.cjs.map +1 -0
- package/dist/timeline.js +326 -0
- package/dist/timeline.js.map +1 -0
- package/dist/tree.cjs +2 -2
- package/dist/tree.cjs.map +1 -1
- package/dist/tree.js +15 -13
- package/dist/tree.js.map +1 -1
- package/dist/typewriter.cjs +10 -123
- package/dist/typewriter.cjs.map +1 -1
- package/dist/typewriter.js +90 -212
- package/dist/typewriter.js.map +1 -1
- package/dist/typography.cjs +3 -3
- package/dist/typography.cjs.map +1 -1
- package/dist/typography.js +18 -112
- package/dist/typography.js.map +1 -1
- package/dist/utils-Cr-YO4Np.cjs +1 -0
- package/dist/utils-Cr-YO4Np.cjs.map +1 -0
- package/dist/{utils-Bp2jhyZc.js → utils-hp-DnFf5.js} +16 -6
- package/dist/utils-hp-DnFf5.js.map +1 -0
- package/dist/utils.cjs +1 -1
- package/dist/utils.js +4 -5
- package/dist/visually-hidden.cjs +2 -2
- package/dist/visually-hidden.cjs.map +1 -1
- package/dist/visually-hidden.js +7 -5
- package/dist/visually-hidden.js.map +1 -1
- package/dist/window-DTgKAQgz.cjs +59 -0
- package/dist/window-DTgKAQgz.cjs.map +1 -0
- package/dist/{window-CrjZdf7Y.js → window-moDKyGLZ.js} +28 -30
- package/dist/window-moDKyGLZ.js.map +1 -0
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/package.json +14 -2
- package/plugins/vite-plugin-schmancy-auto-import.ts +143 -0
- package/plugins/vite-plugin-schmancy-manifest.ts +438 -0
- package/skills/schmancy/INDEX.md +1 -1
- package/skills/schmancy/SKILL.md +17 -5
- package/skills/schmancy/mixins.md +78 -20
- package/skills/schmancy/state.md +501 -0
- package/skills/schmancy/theme.md +15 -0
- package/skills/schmancy/timeline-tile.md +95 -0
- package/src/agent/agent-bundle.test.ts +0 -49
- package/src/agent/agent-entry.ts +4 -3
- package/src/agent/helpers.ts +1 -95
- package/src/agent/schmancy-skill.ts +2 -5
- package/src/agent/virtual-manifest.d.ts +1 -12
- package/src/area/area.component.ts +7 -19
- package/src/area/area.service.test.ts +4 -5
- package/src/area/area.service.ts +4 -3
- package/src/area/route.component.ts +17 -4
- package/src/area/utils.ts +3 -2
- package/src/audio/sound.service.ts +7 -11
- package/src/autocomplete/autocomplete.ts +18 -21
- package/src/{avatar.ts → avatar/avatar.ts} +2 -2
- package/src/avatar/index.ts +1 -0
- package/src/badge/badge.ts +4 -3
- package/src/boat/boat.ts +28 -36
- package/src/breadcrumb/breadcrumb.ts +11 -19
- package/src/busy/busy.ts +4 -3
- package/src/busy/spinner.ts +4 -3
- package/src/button/button.ts +6 -11
- package/src/button/icon-button.ts +8 -12
- package/src/card/actions.ts +4 -12
- package/src/card/card.ts +5 -23
- package/src/card/content.ts +4 -12
- package/src/card/media.ts +4 -9
- package/src/charts/area-chart.ts +7 -4
- package/src/charts/pills.ts +6 -4
- package/src/checkbox/checkbox.test.ts +2 -2
- package/src/checkbox/checkbox.ts +3 -9
- package/src/chips/assist-chip.ts +6 -14
- package/src/chips/chips.ts +7 -21
- package/src/chips/filter-chip.ts +4 -3
- package/src/chips/input-chip.ts +10 -9
- package/src/chips/suggestion-chip.ts +10 -12
- package/src/code-highlight/code-highlight.ts +28 -59
- package/src/code-highlight/code-preview.ts +11 -9
- package/src/connectivity/connectivity-status.ts +4 -3
- package/src/content-drawer/drawer.ts +5 -3
- package/src/content-drawer/main.ts +5 -3
- package/src/content-drawer/sheet.ts +6 -4
- package/src/date-range/date-range-dialog.ts +2 -2
- package/src/date-range/date-range.ts +3 -2
- package/src/delay/delay.ts +2 -2
- package/src/details/details.ts +4 -17
- package/src/dialog/dialog-service.ts +2 -0
- package/src/dialog/dialog.component.ts +9 -9
- package/src/directives/drag.ts +1 -9
- package/src/directives/index.ts +0 -1
- package/src/discovery/discovery.service.ts +1 -1
- package/src/divider/divider.ts +5 -14
- package/src/dropdown/dropdown-component.ts +5 -16
- package/src/dropdown/dropdown-content.ts +7 -14
- package/src/expand/expand-root.component.ts +5 -15
- package/src/expand/expand.component.ts +4 -17
- package/src/extra/countries/countries.ts +5 -13
- package/src/extra/timezone/timezone.ts +7 -12
- package/src/form/form.test.ts +2 -2
- package/src/form/form.ts +2 -9
- package/src/icons/icon.ts +4 -3
- package/src/iframe/iframe.ts +13 -4
- package/src/index.ts +3 -3
- package/src/input/input.ts +4 -11
- package/src/json/json.ts +4 -3
- package/src/kbd/kbd.ts +4 -3
- package/src/layout/index.ts +1 -5
- package/src/layout/scroll/scroll.ts +5 -8
- package/src/lightbox/flip-directive.ts +1 -1
- package/src/lightbox/lightbox.ts +5 -14
- package/src/list/list-item.ts +4 -13
- package/src/list/list.ts +12 -10
- package/src/mailbox/email-editor.ts +17 -11
- package/src/mailbox/email-layout-selector.ts +2 -2
- package/src/mailbox/email-recipients.ts +13 -8
- package/src/mailbox/email-template-picker.ts +6 -5
- package/src/mailbox/email-viewer.ts +5 -3
- package/src/mailbox/mailbox.ts +6 -5
- package/src/map/map.ts +8 -6
- package/src/menu/menu-item.ts +5 -16
- package/src/menu/menu.ts +27 -13
- package/src/nav-drawer/appbar.ts +4 -14
- package/src/nav-drawer/content.ts +5 -14
- package/src/nav-drawer/drawer.ts +5 -18
- package/src/nav-drawer/navbar.ts +3 -17
- package/src/navigation-bar/navigation-bar-item.ts +8 -6
- package/src/navigation-bar/navigation-bar.ts +19 -19
- package/src/navigation-rail/navigation-rail-item.ts +9 -5
- package/src/navigation-rail/navigation-rail.ts +10 -14
- package/src/notification/notification.ts +6 -3
- package/src/option/option.ts +4 -3
- package/src/overlay/overlay.animations.ts +196 -25
- package/src/overlay/overlay.component.ts +397 -190
- package/src/overlay/overlay.confirm-body.ts +21 -7
- package/src/overlay/overlay.gestures.ts +72 -36
- package/src/overlay/overlay.layout.ts +103 -1
- package/src/overlay/overlay.positioning.ts +301 -0
- package/src/overlay/overlay.service.ts +81 -3
- package/src/overlay/overlay.stack.ts +8 -4
- package/src/overlay/overlay.types.ts +83 -5
- package/src/page/page.ts +16 -11
- package/src/payment-card-form/index.ts +1 -0
- package/src/{components/form-elements → payment-card-form}/payment-card-form.ts +23 -23
- package/src/progress/progress.ts +5 -3
- package/src/qr-scanner/qr-scanner.ts +7 -30
- package/src/radio-group/radio-button.ts +3 -13
- package/src/radio-group/radio-group.ts +5 -22
- package/src/range/range.ts +4 -3
- package/src/rxjs-utils/waitForElements.ts +1 -1
- package/src/rxjs-utils/waitForElementsAll.ts +1 -1
- package/src/select/select.ts +10 -18
- package/src/sheet/hook.ts +1 -1
- package/src/sheet/sheet.ts +5 -20
- package/src/skeleton/skeleton.ts +4 -3
- package/src/slider/slide.ts +5 -3
- package/src/slider/slider.ts +5 -3
- package/src/splash-screen/splash-screen.ts +5 -3
- package/src/state/CLAUDE.md +161 -0
- package/src/state/MIGRATION.md +258 -0
- package/src/state/SCOPING.md +134 -0
- package/src/state/active-host.ts +156 -0
- package/src/state/index.ts +877 -0
- package/src/state/persist.ts +208 -0
- package/src/state/schmancy-context.ts +84 -0
- package/src/state/state.test-d.ts +227 -0
- package/src/state/state.test.ts +820 -0
- package/src/steps/schmancy-step.ts +5 -3
- package/src/steps/schmancy-steps-container.ts +5 -3
- package/src/surface/surface.ts +14 -9
- package/src/switch/switch.test.ts +2 -2
- package/src/switch/switch.ts +8 -10
- package/src/table/row.ts +7 -4
- package/src/table/table.ts +17 -14
- package/src/tabs/index.ts +0 -2
- package/src/tabs/tab.ts +2 -2
- package/src/tabs/tabs-group.ts +7 -4
- package/src/teleport/teleport.component.ts +5 -3
- package/src/textarea/textarea.ts +6 -12
- package/src/theme/theme-audio-player.ts +7 -5
- package/src/theme/theme-controller.ts +2 -2
- package/src/theme/theme.component.ts +22 -15
- package/src/theme/theme.service.ts +6 -7
- package/src/theme/theme.style.css +1 -0
- package/src/theme-button/theme-button.ts +2 -2
- package/src/timeline/index.ts +1 -0
- package/src/timeline/timeline-tile.ts +431 -0
- package/src/tree/tree.ts +4 -16
- package/src/typewriter/index.ts +1 -1
- package/src/typography/typography.ts +5 -98
- package/src/utils/intersection.ts +5 -1
- package/src/utils/overlay-stack.ts +1 -1
- package/src/utils/search.ts +2 -2
- package/src/visually-hidden/visually-hidden.ts +4 -3
- package/src/window/window-position.ts +3 -6
- package/src/window/window.ts +9 -7
- package/types/mixins/SchmancyElement.d.ts +49 -0
- package/types/mixins/formField.mixin.d.ts +4 -2
- package/types/mixins/index.d.ts +1 -0
- package/types/mixins/litElement.mixin.d.ts +11 -0
- package/types/src/agent/agent-entry.d.ts +1 -1
- package/types/src/agent/helpers.d.ts +0 -26
- package/types/src/agent/schmancy-skill.d.ts +3 -5
- package/types/src/area/area.component.d.ts +3 -17
- package/types/src/area/route.component.d.ts +14 -4
- package/types/src/autocomplete/autocomplete.d.ts +4 -15
- package/types/src/{avatar.d.ts → avatar/avatar.d.ts} +2 -3
- package/types/src/avatar/index.d.ts +1 -0
- package/types/src/badge/badge.d.ts +3 -3
- package/types/src/boat/boat.d.ts +3 -2
- package/types/src/breadcrumb/breadcrumb.d.ts +9 -19
- package/types/src/busy/busy.d.ts +3 -3
- package/types/src/busy/spinner.d.ts +3 -3
- package/types/src/button/button.d.ts +4 -10
- package/types/src/button/icon-button.d.ts +5 -11
- package/types/src/card/actions.d.ts +3 -12
- package/types/src/card/card.d.ts +4 -24
- package/types/src/card/content.d.ts +3 -12
- package/types/src/card/media.d.ts +3 -9
- package/types/src/charts/area-chart.d.ts +3 -3
- package/types/src/charts/pills.d.ts +3 -3
- package/types/src/checkbox/checkbox.d.ts +3 -10
- package/types/src/chips/assist-chip.d.ts +5 -15
- package/types/src/chips/chips.d.ts +3 -17
- package/types/src/chips/filter-chip.d.ts +3 -3
- package/types/src/chips/input-chip.d.ts +9 -10
- package/types/src/chips/suggestion-chip.d.ts +9 -13
- package/types/src/code-highlight/code-highlight.d.ts +4 -11
- package/types/src/code-highlight/code-preview.d.ts +3 -3
- package/types/src/connectivity/connectivity-status.d.ts +3 -3
- package/types/src/content-drawer/drawer.d.ts +4 -4
- package/types/src/content-drawer/main.d.ts +3 -3
- package/types/src/content-drawer/sheet.d.ts +4 -4
- package/types/src/date-range/date-range-dialog.d.ts +2 -3
- package/types/src/date-range/date-range.d.ts +2 -3
- package/types/src/delay/delay.d.ts +2 -3
- package/types/src/details/details.d.ts +3 -14
- package/types/src/dialog/dialog.component.d.ts +9 -9
- package/types/src/directives/drag.d.ts +1 -3
- package/types/src/directives/index.d.ts +0 -1
- package/types/src/divider/divider.d.ts +3 -14
- package/types/src/dropdown/dropdown-component.d.ts +4 -17
- package/types/src/dropdown/dropdown-content.d.ts +6 -14
- package/types/src/expand/expand-root.component.d.ts +4 -14
- package/types/src/expand/expand.component.d.ts +3 -17
- package/types/src/extra/countries/countries.d.ts +3 -13
- package/types/src/extra/timezone/timezone.d.ts +4 -11
- package/types/src/form/form.d.ts +2 -9
- package/types/src/icons/icon.d.ts +3 -3
- package/types/src/iframe/iframe.d.ts +5 -3
- package/types/src/index.d.ts +3 -3
- package/types/src/input/input.d.ts +4 -11
- package/types/src/json/json.d.ts +3 -3
- package/types/src/kbd/kbd.d.ts +3 -3
- package/types/src/layout/index.d.ts +0 -4
- package/types/src/layout/scroll/scroll.d.ts +4 -8
- package/types/src/lightbox/lightbox.d.ts +3 -14
- package/types/src/list/list-item.d.ts +3 -13
- package/types/src/list/list.d.ts +11 -10
- package/types/src/mailbox/email-editor.d.ts +3 -3
- package/types/src/mailbox/email-layout-selector.d.ts +2 -3
- package/types/src/mailbox/email-recipients.d.ts +7 -3
- package/types/src/mailbox/email-template-picker.d.ts +4 -4
- package/types/src/mailbox/email-viewer.d.ts +3 -3
- package/types/src/mailbox/mailbox.d.ts +4 -4
- package/types/src/map/map.d.ts +4 -3
- package/types/src/menu/menu-item.d.ts +3 -16
- package/types/src/menu/menu.d.ts +25 -13
- package/types/src/nav-drawer/appbar.d.ts +3 -14
- package/types/src/nav-drawer/content.d.ts +3 -14
- package/types/src/nav-drawer/drawer.d.ts +3 -18
- package/types/src/nav-drawer/navbar.d.ts +3 -18
- package/types/src/navigation-bar/navigation-bar-item.d.ts +7 -6
- package/types/src/navigation-bar/navigation-bar.d.ts +13 -7
- package/types/src/navigation-rail/navigation-rail-item.d.ts +9 -6
- package/types/src/navigation-rail/navigation-rail.d.ts +10 -15
- package/types/src/notification/notification.d.ts +3 -3
- package/types/src/option/option.d.ts +3 -3
- package/types/src/overlay/overlay.animations.d.ts +54 -5
- package/types/src/overlay/overlay.component.d.ts +39 -15
- package/types/src/overlay/overlay.confirm-body.d.ts +4 -4
- package/types/src/overlay/overlay.gestures.d.ts +26 -17
- package/types/src/overlay/overlay.layout.d.ts +27 -1
- package/types/src/overlay/overlay.positioning.d.ts +87 -0
- package/types/src/overlay/overlay.types.d.ts +59 -5
- package/types/src/page/page.d.ts +14 -11
- package/types/src/{components/form-elements → payment-card-form}/payment-card-form.d.ts +2 -3
- package/types/src/progress/progress.d.ts +3 -3
- package/types/src/qr-scanner/qr-scanner.d.ts +3 -3
- package/types/src/radio-group/radio-button.d.ts +3 -12
- package/types/src/radio-group/radio-group.d.ts +4 -20
- package/types/src/range/range.d.ts +3 -3
- package/types/src/rxjs-utils/waitForElements.d.ts +1 -1
- package/types/src/rxjs-utils/waitForElementsAll.d.ts +1 -1
- package/types/src/select/select.d.ts +4 -15
- package/types/src/sheet/sheet.d.ts +3 -20
- package/types/src/skeleton/skeleton.d.ts +3 -3
- package/types/src/slider/slide.d.ts +3 -2
- package/types/src/slider/slider.d.ts +3 -3
- package/types/src/splash-screen/splash-screen.d.ts +3 -3
- package/types/src/state/active-host.d.ts +18 -0
- package/types/src/state/index.d.ts +145 -0
- package/types/src/state/persist.d.ts +14 -0
- package/types/src/state/schmancy-context.d.ts +31 -0
- package/types/src/state/state.test-d.d.ts +131 -0
- package/types/src/state/state.test.d.ts +1 -0
- package/types/src/steps/schmancy-step.d.ts +3 -3
- package/types/src/steps/schmancy-steps-container.d.ts +3 -3
- package/types/src/surface/surface.d.ts +13 -5
- package/types/src/switch/switch.d.ts +7 -11
- package/types/src/table/row.d.ts +2 -3
- package/types/src/table/table.d.ts +4 -11
- package/types/src/tabs/index.d.ts +0 -2
- package/types/src/tabs/tab.d.ts +2 -3
- package/types/src/tabs/tabs-group.d.ts +3 -3
- package/types/src/teleport/teleport.component.d.ts +3 -3
- package/types/src/textarea/textarea.d.ts +5 -12
- package/types/src/theme/theme-audio-player.d.ts +3 -3
- package/types/src/theme/theme-controller.d.ts +2 -2
- package/types/src/theme/theme.component.d.ts +18 -13
- package/types/src/theme-button/theme-button.d.ts +2 -3
- package/types/src/timeline/index.d.ts +1 -0
- package/types/src/timeline/timeline-tile.d.ts +44 -0
- package/types/src/tree/tree.d.ts +3 -16
- package/types/src/typewriter/index.d.ts +1 -1
- package/types/src/typography/typography.d.ts +3 -36
- package/types/src/visually-hidden/visually-hidden.d.ts +3 -3
- package/types/src/window/window.d.ts +3 -3
- package/dist/agent/index.es-Dymj8REP.js +0 -489
- package/dist/agent/index.es-Dymj8REP.js.map +0 -1
- package/dist/area-BGBCMC79.js.map +0 -1
- package/dist/area-D7l9KR2N.cjs +0 -12
- package/dist/area-D7l9KR2N.cjs.map +0 -1
- package/dist/autocomplete-BPD5uraA.cjs +0 -115
- package/dist/autocomplete-BPD5uraA.cjs.map +0 -1
- package/dist/autocomplete-C2P0Soht.js.map +0 -1
- package/dist/boat-BkIO-0No.cjs +0 -80
- package/dist/boat-BkIO-0No.cjs.map +0 -1
- package/dist/boat-DXZ0k7oa.js.map +0 -1
- package/dist/busy-DGYhpTnO.cjs.map +0 -1
- package/dist/busy-iRjq6Nvd.js.map +0 -1
- package/dist/card-DjYnCckw.cjs.map +0 -1
- package/dist/card-wUTjx0EC.js.map +0 -1
- package/dist/checkbox-CiYEtw9F.cjs +0 -39
- package/dist/checkbox-CiYEtw9F.cjs.map +0 -1
- package/dist/checkbox-VBSenxgb.js.map +0 -1
- package/dist/chips-BDS9lkPa.js.map +0 -1
- package/dist/chips-D6ptH5re.cjs.map +0 -1
- package/dist/code-highlight-Bi91XHJN.js.map +0 -1
- package/dist/code-highlight-BzRmBZzz.cjs.map +0 -1
- package/dist/components-DkmEgyAc.cjs +0 -73
- package/dist/components.cjs +0 -1
- package/dist/components.js +0 -2
- package/dist/context-BerzpUhI.js +0 -3
- package/dist/context-C6dHUHhi.cjs +0 -1
- package/dist/date-range-BmFxTXiU.cjs +0 -131
- package/dist/date-range-BmFxTXiU.cjs.map +0 -1
- package/dist/date-range-ClTMg1AB.js.map +0 -1
- package/dist/date-range-inline-B9Dp2z6C.cjs +0 -43
- package/dist/delay-BHODnTg-.cjs +0 -9
- package/dist/delay-BHODnTg-.cjs.map +0 -1
- package/dist/delay-Dlk0A3he.js +0 -347
- package/dist/delay-Dlk0A3he.js.map +0 -1
- package/dist/details-CPjlqQD4.js.map +0 -1
- package/dist/details-Cz9ok9si.cjs.map +0 -1
- package/dist/dialog-service-CzDO08Gy.cjs.map +0 -1
- package/dist/dialog-service-DH-tjPuE.js.map +0 -1
- package/dist/divider-CILo3_vi.cjs.map +0 -1
- package/dist/divider-ghgyw5CU.js.map +0 -1
- package/dist/expand-CbjBr_Ds.js.map +0 -1
- package/dist/expand-r3OrSoDk.cjs +0 -141
- package/dist/expand-r3OrSoDk.cjs.map +0 -1
- package/dist/extra-BZeZOMBI.cjs.map +0 -1
- package/dist/extra-DK9MQtPJ.js.map +0 -1
- package/dist/float-CuZ8LOgB.cjs +0 -1
- package/dist/flow-BPDtbhLe.js +0 -386
- package/dist/flow-BPDtbhLe.js.map +0 -1
- package/dist/flow-Dn9AZktE.cjs +0 -1
- package/dist/flow-Dn9AZktE.cjs.map +0 -1
- package/dist/form-rCZqoAoK.js.map +0 -1
- package/dist/form-wI58M85H.cjs.map +0 -1
- package/dist/handover/agent-runtime-v2-loopback.md +0 -71
- package/dist/handover/claude-design-v2-paste.md +0 -42
- package/dist/icons-Drq4kKy2.js.map +0 -1
- package/dist/icons-DtdhaZdc.cjs +0 -52
- package/dist/icons-DtdhaZdc.cjs.map +0 -1
- package/dist/iframe-BkwwWIbQ.cjs +0 -24
- package/dist/iframe-BkwwWIbQ.cjs.map +0 -1
- package/dist/iframe-BmyHW8km.js.map +0 -1
- package/dist/index.es-BgmFX1JM.cjs +0 -1
- package/dist/index.es-BgmFX1JM.cjs.map +0 -1
- package/dist/index.es-CLyb_o3Y.js +0 -489
- package/dist/index.es-CLyb_o3Y.js.map +0 -1
- package/dist/input-BGNZlfL8.cjs.map +0 -1
- package/dist/input-Bc3bVISm.js.map +0 -1
- package/dist/input-chip-BQrjpjaQ.js.map +0 -1
- package/dist/input-chip-DN-cwf11.cjs.map +0 -1
- package/dist/intersection-BrXp4YTO.js +0 -12
- package/dist/intersection-BrXp4YTO.js.map +0 -1
- package/dist/intersection-DqBqnpgh.cjs +0 -1
- package/dist/intersection-DqBqnpgh.cjs.map +0 -1
- package/dist/layout-7eyMBmZk.cjs +0 -17
- package/dist/layout-7eyMBmZk.cjs.map +0 -1
- package/dist/layout-Ox6nJkzC.js +0 -268
- package/dist/layout-Ox6nJkzC.js.map +0 -1
- package/dist/lightbox-CY52Z_ig.js.map +0 -1
- package/dist/lightbox-H8Uq3AXy.cjs +0 -202
- package/dist/lightbox-H8Uq3AXy.cjs.map +0 -1
- package/dist/list-BGjVo6zb.cjs +0 -40
- package/dist/list-BGjVo6zb.cjs.map +0 -1
- package/dist/list-D7wUxu1C.js.map +0 -1
- package/dist/litElement.mixin-CszkJuNl.js +0 -12
- package/dist/litElement.mixin-CszkJuNl.js.map +0 -1
- package/dist/litElement.mixin-qh5-IIUq.cjs +0 -1
- package/dist/litElement.mixin-qh5-IIUq.cjs.map +0 -1
- package/dist/mailbox--EN-JhjV.js.map +0 -1
- package/dist/mailbox-DLiBGJhY.cjs.map +0 -1
- package/dist/map-B0S_q3ma.js.map +0 -1
- package/dist/map-EDQN0I6e.cjs +0 -80
- package/dist/map-EDQN0I6e.cjs.map +0 -1
- package/dist/menu-3edZGQ1x.cjs.map +0 -1
- package/dist/menu-COeFpb6n.js.map +0 -1
- package/dist/metric.cjs +0 -69
- package/dist/metric.cjs.map +0 -1
- package/dist/metric.js +0 -93
- package/dist/metric.js.map +0 -1
- package/dist/mixins.cjs.map +0 -1
- package/dist/mixins.js.map +0 -1
- package/dist/notification-CC-TFN5v.js.map +0 -1
- package/dist/notification-P4c-kFdH.cjs +0 -23
- package/dist/notification-P4c-kFdH.cjs.map +0 -1
- package/dist/option-BwAF4nAw.js.map +0 -1
- package/dist/option-Cu0ertuF.cjs +0 -43
- package/dist/option-Cu0ertuF.cjs.map +0 -1
- package/dist/progress-Bk_Q1Shy.js.map +0 -1
- package/dist/progress-Yz6EMNSu.cjs.map +0 -1
- package/dist/provide-CYgj58u_.cjs +0 -1
- package/dist/provide-CYgj58u_.cjs.map +0 -1
- package/dist/provide-ydIskwf2.js +0 -107
- package/dist/provide-ydIskwf2.js.map +0 -1
- package/dist/radio-group-BcdcjLNC.js.map +0 -1
- package/dist/radio-group-BpBz5tRA.cjs +0 -40
- package/dist/radio-group-BpBz5tRA.cjs.map +0 -1
- package/dist/scroll-DXQv0ejL.js.map +0 -1
- package/dist/scroll-DbZMTv0K.cjs +0 -26
- package/dist/scroll-DbZMTv0K.cjs.map +0 -1
- package/dist/search-CwMav5QB.cjs +0 -1
- package/dist/select-BV4lK2zy.cjs.map +0 -1
- package/dist/select-DKyGWDsG.js.map +0 -1
- package/dist/sheet-BAI_jH1t.cjs +0 -35
- package/dist/sheet-BAI_jH1t.cjs.map +0 -1
- package/dist/sheet-C3TLKItO.js.map +0 -1
- package/dist/sheet.service-RcDBwHmv.cjs +0 -1
- package/dist/skills/schmancy/store.md +0 -126
- package/dist/skills/store.md +0 -126
- package/dist/sound.service-BEN6Xjy_.cjs +0 -1
- package/dist/sound.service-BEN6Xjy_.cjs.map +0 -1
- package/dist/sound.service-DWZe6swU.js.map +0 -1
- package/dist/splash-screen-DbI5RgBf.js.map +0 -1
- package/dist/splash-screen-DoHRTHi8.cjs +0 -41
- package/dist/splash-screen-DoHRTHi8.cjs.map +0 -1
- package/dist/src-00DfxCJq.js.map +0 -1
- package/dist/src-C_JjQovE.cjs +0 -269
- package/dist/src-C_JjQovE.cjs.map +0 -1
- package/dist/store-CjFHCSDb.cjs +0 -1
- package/dist/store-CjFHCSDb.cjs.map +0 -1
- package/dist/store-CjzZDQt8.js +0 -1654
- package/dist/store-CjzZDQt8.js.map +0 -1
- package/dist/store.cjs +0 -1
- package/dist/store.js +0 -2
- package/dist/surface-D-GWBcsh.cjs +0 -7
- package/dist/surface-D-GWBcsh.cjs.map +0 -1
- package/dist/surface-D23JtxYP.js +0 -22
- package/dist/surface-D23JtxYP.js.map +0 -1
- package/dist/surface.mixin-DqMwoddO.js +0 -320
- package/dist/surface.mixin-DqMwoddO.js.map +0 -1
- package/dist/surface.mixin-DxOi-xo0.cjs +0 -297
- package/dist/surface.mixin-DxOi-xo0.cjs.map +0 -1
- package/dist/table-C7b73kdg.cjs +0 -63
- package/dist/table-C7b73kdg.cjs.map +0 -1
- package/dist/table-CTrhV9-k.js +0 -631
- package/dist/table-CTrhV9-k.js.map +0 -1
- package/dist/tabs-Ce55RbwF.js.map +0 -1
- package/dist/tabs-DAzB8O7w.cjs +0 -31
- package/dist/tabs-DAzB8O7w.cjs.map +0 -1
- package/dist/tailwind.mixin-DRI1oTYQ.cjs +0 -2
- package/dist/tailwind.mixin-DRI1oTYQ.cjs.map +0 -1
- package/dist/tailwind.mixin-mdQR3BEO.js +0 -219
- package/dist/tailwind.mixin-mdQR3BEO.js.map +0 -1
- package/dist/textarea-DjN1D9u0.js.map +0 -1
- package/dist/textarea-PuHxBvJA.cjs +0 -39
- package/dist/textarea-PuHxBvJA.cjs.map +0 -1
- package/dist/theme-B-IJ2r7Q.cjs +0 -181
- package/dist/theme-button-BSbYmS4p.cjs +0 -8
- package/dist/theme-button-BSbYmS4p.cjs.map +0 -1
- package/dist/theme-button-CEMeAUOL.js.map +0 -1
- package/dist/theme.service-DxJPUGlu.cjs +0 -1
- package/dist/theme.service-DxJPUGlu.cjs.map +0 -1
- package/dist/theme.service-cOfPrtfe.js.map +0 -1
- package/dist/tslib.es6-Cnt75pb6.cjs +0 -1
- package/dist/tslib.es6-Cnt75pb6.cjs.map +0 -1
- package/dist/tslib.es6-DMzzJKHV.js +0 -7
- package/dist/tslib.es6-DMzzJKHV.js.map +0 -1
- package/dist/utils-Bp2jhyZc.js.map +0 -1
- package/dist/utils-CBPQvxNW.cjs +0 -1
- package/dist/utils-CBPQvxNW.cjs.map +0 -1
- package/dist/window-CrjZdf7Y.js.map +0 -1
- package/dist/window-DTUARSrU.cjs +0 -59
- package/dist/window-DTUARSrU.cjs.map +0 -1
- package/skills/schmancy/store.md +0 -126
- package/src/components/form-elements/index.ts +0 -1
- package/src/components/index.ts +0 -1
- package/src/layout/flex/flex.scss +0 -4
- package/src/layout/flex/flex.ts +0 -74
- package/src/layout/flex/index.ts +0 -1
- package/src/layout/grid/.readme +0 -79
- package/src/layout/grid/grid.scss +0 -5
- package/src/layout/grid/grid.ts +0 -121
- package/src/layout/grid/index.ts +0 -1
- package/src/layout/layout.ts +0 -122
- package/src/layout/v2/flex.ts +0 -243
- package/src/layout/v2/index.ts +0 -1
- package/src/metric/index.ts +0 -1
- package/src/metric/metric.ts +0 -127
- package/src/store/context-array.ts +0 -358
- package/src/store/context-collection.ts +0 -218
- package/src/store/context-create.ts +0 -284
- package/src/store/context-object.ts +0 -298
- package/src/store/filter-directive.ts +0 -614
- package/src/store/index.ts +0 -10
- package/src/store/selector-hook.ts +0 -259
- package/src/store/selectors.ts +0 -289
- package/src/store/storage-manager.ts +0 -269
- package/src/store/store.class.ts +0 -239
- package/src/store/types.ts +0 -327
- package/src/tabs/tabs-compatibility.ts +0 -20
- package/src/typewriter/typewriter.ts +0 -410
- package/types/src/area/route.test.d.ts +0 -20
- package/types/src/button/button.test.d.ts +0 -1
- package/types/src/chips/chip.d.ts +0 -3
- package/types/src/components/index.d.ts +0 -1
- package/types/src/content-drawer/$sheet.d.ts +0 -14
- package/types/src/dialog/dailog.d.ts +0 -116
- package/types/src/dialog/dialog-content.d.ts +0 -17
- package/types/src/directives/guard.d.ts +0 -1
- package/types/src/directives/visibility.d.ts +0 -11
- package/types/src/form/form-v2.d.ts +0 -22
- package/types/src/input/input-v2.d.ts +0 -250
- package/types/src/layout/flex/flex.d.ts +0 -26
- package/types/src/layout/flex/index.d.ts +0 -1
- package/types/src/layout/grid/grid.d.ts +0 -39
- package/types/src/layout/grid/index.d.ts +0 -1
- package/types/src/layout/layout.d.ts +0 -59
- package/types/src/layout/v2/flex.d.ts +0 -65
- package/types/src/layout/v2/grid.d.ts +0 -51
- package/types/src/layout/v2/index.d.ts +0 -1
- package/types/src/lightbox/flip.directive.d.ts +0 -22
- package/types/src/metric/index.d.ts +0 -1
- package/types/src/metric/metric.d.ts +0 -39
- package/types/src/notification/outlet.d.ts +0 -10
- package/types/src/sheet/header.d.ts +0 -10
- package/types/src/store/context-array.d.ts +0 -83
- package/types/src/store/context-collection.d.ts +0 -74
- package/types/src/store/context-create.d.ts +0 -43
- package/types/src/store/context-object.d.ts +0 -46
- package/types/src/store/filter-directive.d.ts +0 -116
- package/types/src/store/immer-integration.d.ts +0 -54
- package/types/src/store/index.d.ts +0 -10
- package/types/src/store/selector-hook.d.ts +0 -46
- package/types/src/store/selectors.d.ts +0 -90
- package/types/src/store/storage-manager.d.ts +0 -48
- package/types/src/store/store.class.d.ts +0 -73
- package/types/src/store/types.d.ts +0 -241
- package/types/src/tabs/tabs-compatibility.d.ts +0 -13
- package/types/src/theme/theme.elevation.d.ts +0 -131
- package/types/src/theme/theme.motion.d.ts +0 -198
- package/types/src/theme/theme.shape.d.ts +0 -144
- package/types/src/theme/theme.state.d.ts +0 -546
- package/types/src/theme/theme.typography.d.ts +0 -74
- package/types/src/tooltip/tooltip.d.ts +0 -33
- package/types/src/typewriter/typewriter.d.ts +0 -94
- /package/dist/agent/{flow-CvG1fLW5.js → flow-CaPi2G8y.js} +0 -0
- /package/dist/agent/{vendor-material-color-DcL7ZPxx.js → vendor-material-color-Be96dpGE.js} +0 -0
- /package/dist/{animation-hXFClrIn.js → animation-BK-8BwY8.js} +0 -0
- /package/dist/{animation-CQRdLgzX.cjs → animation-CO_Csq84.cjs} +0 -0
- /package/dist/{decorate-D_utPUsC.js → decorate-23nYs4Le.js} +0 -0
- /package/dist/{decorate-F9CuyeHg.cjs → decorate-DpFmy0nm.cjs} +0 -0
- /package/dist/{hashContent-B2IntJQf.js → hashContent-1ARKIsx9.js} +0 -0
- /package/dist/{hashContent-CahnEuut.cjs → hashContent-Bp5S6T4U.cjs} +0 -0
- /package/dist/{lazy-D6R5N5v4.js → lazy-B0ia54tT.js} +0 -0
- /package/dist/{lazy-BDNnH_r7.cjs → lazy-Dq9mRRjT.cjs} +0 -0
- /package/dist/{reduced-motion-BZTLqAyl.js → reduced-motion-D-L12p7G.js} +0 -0
- /package/dist/{reduced-motion-9RjNnhIg.cjs → reduced-motion-Ds-HjMzn.cjs} +0 -0
- /package/dist/{rxjs-utils-DJbZRjp3.cjs → rxjs-utils-Csnks202.cjs} +0 -0
- /package/dist/{rxjs-utils-CKTnEKUH.js → rxjs-utils-d-ivVN84.js} +0 -0
- /package/dist/{theme.events-NuihzD_p.js → theme.events-Cv7N4Toe.js} +0 -0
- /package/dist/{theme.events-DakXxZeP.cjs → theme.events-DM4H5F2d.cjs} +0 -0
- /package/dist/{theme.interface-DTwkuAKJ.cjs → theme.interface-D9l33b-M.cjs} +0 -0
- /package/dist/{theme.interface-Buged9Cg.js → theme.interface-DnVNre4O.js} +0 -0
- /package/src/{directives/typewriter.ts → typewriter/typewriter.directive.ts} +0 -0
- /package/types/src/{components/form-elements → payment-card-form}/index.d.ts +0 -0
- /package/types/src/{directives/typewriter.d.ts → typewriter/typewriter.directive.d.ts} +0 -0
|
@@ -0,0 +1,877 @@
|
|
|
1
|
+
// @mhmo91/schmancy/state — reactive state primitive.
|
|
2
|
+
//
|
|
3
|
+
// Module-scoped singletons keyed by namespace. Each state exposes:
|
|
4
|
+
// - `value: T` current snapshot (defaultValue while loading)
|
|
5
|
+
// - `signal: Signal.State<T>` raw TC39 signal (use with computed())
|
|
6
|
+
// - `$: Observable<T>` RxJS surface (auto-emits on change, microtask-coalesced)
|
|
7
|
+
// - `ready: Promise<void>` resolves once initial load attempt completes
|
|
8
|
+
// - `loaded: boolean` runtime flag — `value` reflects stored data
|
|
9
|
+
//
|
|
10
|
+
// Three call shapes:
|
|
11
|
+
// const cart = state<CartState>('hannah/cart').session({ items: [], total: 0 })
|
|
12
|
+
// const cart = state('hannah/cart').session(initialCart) // typed-const
|
|
13
|
+
// declare module '@mhmo91/schmancy/state' { // registry
|
|
14
|
+
// interface SchmancyStateRegistry { 'hannah/cart': CartState }
|
|
15
|
+
// }
|
|
16
|
+
// const cart = state('hannah/cart').session({ items: [], total: 0 })
|
|
17
|
+
|
|
18
|
+
import { Signal } from '@lit-labs/signals'
|
|
19
|
+
// `@lit/context` re-exports `ContextRequestEvent` as `ContextEvent` from
|
|
20
|
+
// its public entry. Same class, just a shorter public name.
|
|
21
|
+
import { ContextEvent as ContextRequestEvent, createContext } from '@lit/context'
|
|
22
|
+
import { Observable } from 'rxjs'
|
|
23
|
+
import { produce, type Draft } from 'immer'
|
|
24
|
+
|
|
25
|
+
import { createAdapter, type StorageAdapter, type StorageBackend } from './persist'
|
|
26
|
+
import { resolveActiveHost, stateContextKey } from './active-host'
|
|
27
|
+
// Side-effect import: registers the `<schmancy-context>` element so users
|
|
28
|
+
// only need to import from `@mhmo91/schmancy/state` to get both the factory
|
|
29
|
+
// and the scoping primitive.
|
|
30
|
+
import './schmancy-context'
|
|
31
|
+
|
|
32
|
+
export type { StorageBackend } from './persist'
|
|
33
|
+
export { Signal } from '@lit-labs/signals'
|
|
34
|
+
export { _activeHost } from './active-host'
|
|
35
|
+
export { SchmancyContext } from './schmancy-context'
|
|
36
|
+
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Public type surface
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
|
|
41
|
+
const stateBrand: unique symbol = Symbol('schmancy.state')
|
|
42
|
+
const namespaceBrand: unique symbol = Symbol('schmancy.state.namespace')
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Open registry — augment via `declare module '@mhmo91/schmancy/state'` to
|
|
46
|
+
* bind a TypeScript type to a namespace string. Augmenting flips that
|
|
47
|
+
* namespace to overload (A) of the factory: zero ceremony at the call
|
|
48
|
+
* site, T comes from the registry.
|
|
49
|
+
*/
|
|
50
|
+
export interface SchmancyStateRegistry {}
|
|
51
|
+
|
|
52
|
+
export type RegisteredNamespace = keyof SchmancyStateRegistry & string
|
|
53
|
+
|
|
54
|
+
/** Feature-prefix convention enforced at compile time. */
|
|
55
|
+
export type FeatureNamespace = `${string}/${string}`
|
|
56
|
+
|
|
57
|
+
export type AssertNovel<NS extends string> = NS extends RegisteredNamespace
|
|
58
|
+
? never & { readonly __error: `Namespace "${NS}" already registered` }
|
|
59
|
+
: NS
|
|
60
|
+
|
|
61
|
+
export type SyncStorage = Exclude<StorageBackend, 'indexeddb'>
|
|
62
|
+
export type AsyncStorage = Extract<StorageBackend, 'indexeddb'>
|
|
63
|
+
export type IsAsync<S extends StorageBackend> = S extends AsyncStorage ? true : false
|
|
64
|
+
|
|
65
|
+
// Detect explicit null/undefined in T's union — works in BOTH strict and
|
|
66
|
+
// non-strict tsconfigs. The relaxed `null extends T` form fires for every
|
|
67
|
+
// T when strictNullChecks is off, which classifies every shape as
|
|
68
|
+
// 'nullable'. Distributing `T extends null/undefined` is a structural
|
|
69
|
+
// subtype check that doesn't depend on strict mode.
|
|
70
|
+
type _Has<T, U> = T extends U ? true : never
|
|
71
|
+
type _IsNullable<T> = [_Has<T, null> | _Has<T, undefined>] extends [never] ? false : true
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Shape classifier — drives the variant write API per T. Order: structural
|
|
75
|
+
* shapes first (Map / Set / Array), primitives, then nullable-union check,
|
|
76
|
+
* then plain object.
|
|
77
|
+
*/
|
|
78
|
+
export type Kind<T> = [T] extends [Map<unknown, unknown>]
|
|
79
|
+
? 'map'
|
|
80
|
+
: [T] extends [Set<unknown>]
|
|
81
|
+
? 'set'
|
|
82
|
+
: [T] extends [readonly unknown[]]
|
|
83
|
+
? 'array'
|
|
84
|
+
: [T] extends [string | number | boolean | bigint | symbol]
|
|
85
|
+
? 'primitive'
|
|
86
|
+
: _IsNullable<T> extends true
|
|
87
|
+
? 'nullable'
|
|
88
|
+
: [T] extends [object]
|
|
89
|
+
? 'object'
|
|
90
|
+
: 'unknown'
|
|
91
|
+
|
|
92
|
+
export interface ObjectAPI<T> {
|
|
93
|
+
set(patch: Partial<T>, merge?: boolean): void
|
|
94
|
+
replace(next: T): void
|
|
95
|
+
update(recipe: (draft: Draft<T>) => void): void
|
|
96
|
+
delete<K extends keyof T>(key: K): void
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface MapAPI<T> {
|
|
100
|
+
set: T extends Map<infer K, infer V> ? (key: K, value: V) => void : never
|
|
101
|
+
replace(next: T): void
|
|
102
|
+
delete: T extends Map<infer K, unknown> ? (key: K) => void : never
|
|
103
|
+
clear(): void
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface SetAPI<T> {
|
|
107
|
+
add: T extends Set<infer U> ? (value: U) => void : never
|
|
108
|
+
delete: T extends Set<infer U> ? (value: U) => boolean : never
|
|
109
|
+
toggle: T extends Set<infer U> ? (value: U) => void : never
|
|
110
|
+
replace(next: T): void
|
|
111
|
+
clear(): void
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export interface ArrayAPI<T> {
|
|
115
|
+
push: T extends readonly (infer U)[] ? (...items: U[]) => void : never
|
|
116
|
+
replace(next: T): void
|
|
117
|
+
update(recipe: (draft: Draft<T>) => void): void
|
|
118
|
+
clear(): void
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export interface ScalarAPI<T> {
|
|
122
|
+
set(next: T): void
|
|
123
|
+
replace(next: T): void
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export type WriteAPI<T> = Kind<T> extends 'map'
|
|
127
|
+
? MapAPI<T>
|
|
128
|
+
: Kind<T> extends 'set'
|
|
129
|
+
? SetAPI<T>
|
|
130
|
+
: Kind<T> extends 'array'
|
|
131
|
+
? ArrayAPI<T>
|
|
132
|
+
: Kind<T> extends 'object'
|
|
133
|
+
? ObjectAPI<T>
|
|
134
|
+
: ScalarAPI<T>
|
|
135
|
+
|
|
136
|
+
export interface BaseAPI<NS extends string, T, S extends StorageBackend> {
|
|
137
|
+
readonly [stateBrand]: true
|
|
138
|
+
readonly namespace: NS & { readonly [namespaceBrand]: NS }
|
|
139
|
+
readonly storage: S
|
|
140
|
+
/**
|
|
141
|
+
* Current value. For sync backends (memory/local/session) the load is
|
|
142
|
+
* synchronous, so the type narrows to `T`. For `idb` the load is genuinely
|
|
143
|
+
* async — `value` is `T | undefined` until `ready` resolves. Read with
|
|
144
|
+
* `state.value ?? state.defaultValue` if you don't care about the
|
|
145
|
+
* pre-load distinction; await `state.ready` if you do.
|
|
146
|
+
*/
|
|
147
|
+
readonly value: IsAsync<S> extends true ? T | undefined : T
|
|
148
|
+
readonly defaultValue: T
|
|
149
|
+
readonly ready: Promise<void>
|
|
150
|
+
readonly loaded: boolean
|
|
151
|
+
readonly signal: Signal.State<T>
|
|
152
|
+
readonly $: Observable<T>
|
|
153
|
+
destroy(): void
|
|
154
|
+
/** Internal: build a fresh per-`<schmancy-context>` copy seeded with the
|
|
155
|
+
* current value. Exposed on the type so a state can be passed to
|
|
156
|
+
* `<schmancy-context provides={[…]}>` without casts. Not for end-user
|
|
157
|
+
* code — the leading underscore signals "internal API". */
|
|
158
|
+
_isolatedInstance(): { destroy(): void } & Record<string | symbol, unknown>
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export interface SyncState<NS extends string, T, S extends SyncStorage>
|
|
162
|
+
extends BaseAPI<NS, T, S>,
|
|
163
|
+
Disposable {
|
|
164
|
+
[Symbol.dispose](): void
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export interface AsyncState<NS extends string, T>
|
|
168
|
+
extends BaseAPI<NS, T, 'indexeddb'>,
|
|
169
|
+
Disposable,
|
|
170
|
+
AsyncDisposable {
|
|
171
|
+
[Symbol.dispose](): void
|
|
172
|
+
[Symbol.asyncDispose](): Promise<void>
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export type State<NS extends string, T, S extends StorageBackend> = S extends AsyncStorage
|
|
176
|
+
? AsyncState<NS, T> & WriteAPI<T>
|
|
177
|
+
: SyncState<NS, T, S extends SyncStorage ? S : never> & WriteAPI<T>
|
|
178
|
+
|
|
179
|
+
export interface NamespaceHandlePinned<NS extends string, T> {
|
|
180
|
+
memory(initial: T): State<NS, T, 'memory'>
|
|
181
|
+
local(initial: T): State<NS, T, 'local'>
|
|
182
|
+
session(initial: T): State<NS, T, 'session'>
|
|
183
|
+
idb(initial: T): State<NS, T, 'indexeddb'>
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export interface NamespaceHandleInferred<NS extends string> {
|
|
187
|
+
memory<U>(initial: U): State<NS, U, 'memory'>
|
|
188
|
+
local<U>(initial: U): State<NS, U, 'local'>
|
|
189
|
+
session<U>(initial: U): State<NS, U, 'session'>
|
|
190
|
+
idb<U>(initial: U): State<NS, U, 'indexeddb'>
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// ---------------------------------------------------------------------------
|
|
194
|
+
// Runtime — variant detection + state instance construction
|
|
195
|
+
// ---------------------------------------------------------------------------
|
|
196
|
+
|
|
197
|
+
type RuntimeKind = 'map' | 'set' | 'array' | 'object' | 'scalar'
|
|
198
|
+
|
|
199
|
+
function detectKind(value: unknown): RuntimeKind {
|
|
200
|
+
if (value instanceof Map) return 'map'
|
|
201
|
+
if (value instanceof Set) return 'set'
|
|
202
|
+
if (Array.isArray(value)) return 'array'
|
|
203
|
+
if (value === null || value === undefined) return 'scalar'
|
|
204
|
+
if (typeof value !== 'object') return 'scalar'
|
|
205
|
+
return 'object'
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Globalize the namespace-claim set so any number of schmancy module copies
|
|
209
|
+
// share a single registry. Without this, source-state and dist-state would
|
|
210
|
+
// each maintain their own `claimed` set and could both register the same
|
|
211
|
+
// namespace, producing two singletons with the same name.
|
|
212
|
+
const CLAIMED_KEY = Symbol.for('schmancy.state.claimed')
|
|
213
|
+
const __claimedSlot = (globalThis as { [CLAIMED_KEY]?: Set<string> })
|
|
214
|
+
__claimedSlot[CLAIMED_KEY] ??= new Set<string>()
|
|
215
|
+
const claimed = __claimedSlot[CLAIMED_KEY]!
|
|
216
|
+
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
// Context resolution.
|
|
219
|
+
//
|
|
220
|
+
// Every read (`value`, `signal`, `$`) and write (`set`, `replace`, `update`,
|
|
221
|
+
// `delete`, `push`, `add`, `toggle`, `clear`) on a state instance routes
|
|
222
|
+
// through `resolveContextual`. It asks "is this call happening inside a
|
|
223
|
+
// `<schmancy-context provides={[...]}>` subtree?" by dispatching a
|
|
224
|
+
// `context-request` event from the active host (resolved via the layered
|
|
225
|
+
// fallback in `active-host.ts`). If a provider responds, the call routes to
|
|
226
|
+
// the per-context isolated instance; otherwise it falls through to the
|
|
227
|
+
// module-scoped global. The decision is cached per-host-per-namespace in a
|
|
228
|
+
// WeakMap so repeat reads stay O(1).
|
|
229
|
+
// ---------------------------------------------------------------------------
|
|
230
|
+
|
|
231
|
+
// Globalize the per-host resolver cache so that a write through one schmancy
|
|
232
|
+
// copy and a read through another resolve to the same target object — the
|
|
233
|
+
// cache keys are DOM elements (process-global), but the cache itself must
|
|
234
|
+
// also be shared.
|
|
235
|
+
const CACHE_KEY = Symbol.for('schmancy.state.hostResolverCache')
|
|
236
|
+
const __cacheSlot = (globalThis as {
|
|
237
|
+
[CACHE_KEY]?: WeakMap<HTMLElement, Map<string, unknown>>
|
|
238
|
+
})
|
|
239
|
+
__cacheSlot[CACHE_KEY] ??= new WeakMap<HTMLElement, Map<string, unknown>>()
|
|
240
|
+
const hostResolverCache = __cacheSlot[CACHE_KEY]!
|
|
241
|
+
|
|
242
|
+
function resolveContextual(namespace: string, fallback: unknown): unknown {
|
|
243
|
+
const host = resolveActiveHost()
|
|
244
|
+
if (host === undefined) return fallback
|
|
245
|
+
|
|
246
|
+
const cached = hostResolverCache.get(host)?.get(namespace)
|
|
247
|
+
if (cached !== undefined) return cached
|
|
248
|
+
|
|
249
|
+
let resolved: unknown = undefined
|
|
250
|
+
const ctx = createContext<unknown>(stateContextKey(namespace))
|
|
251
|
+
host.dispatchEvent(
|
|
252
|
+
new ContextRequestEvent(ctx, host, value => {
|
|
253
|
+
resolved = value
|
|
254
|
+
}),
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
const result = resolved !== undefined ? resolved : fallback
|
|
258
|
+
let perHost = hostResolverCache.get(host)
|
|
259
|
+
if (!perHost) {
|
|
260
|
+
perHost = new Map<string, unknown>()
|
|
261
|
+
hostResolverCache.set(host, perHost)
|
|
262
|
+
}
|
|
263
|
+
perHost.set(namespace, result)
|
|
264
|
+
return result
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
interface InternalState {
|
|
268
|
+
signal: Signal.State<unknown>
|
|
269
|
+
storage: StorageBackend
|
|
270
|
+
adapter: StorageAdapter<unknown>
|
|
271
|
+
pendingWrite: Promise<void> | null
|
|
272
|
+
scheduledWrite: boolean
|
|
273
|
+
disposed: boolean
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
function scheduleWrite(internal: InternalState): void {
|
|
277
|
+
if (internal.scheduledWrite || internal.disposed) return
|
|
278
|
+
internal.scheduledWrite = true
|
|
279
|
+
queueMicrotask(() => {
|
|
280
|
+
internal.scheduledWrite = false
|
|
281
|
+
if (internal.disposed) return
|
|
282
|
+
internal.pendingWrite = internal.adapter.save(internal.signal.get()).catch(err => {
|
|
283
|
+
console.error('[state] save failed:', err)
|
|
284
|
+
})
|
|
285
|
+
})
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
function signalToObservable<T>(signal: Signal.State<T>): Observable<T> {
|
|
289
|
+
return new Observable<T>(subscriber => {
|
|
290
|
+
subscriber.next(signal.get())
|
|
291
|
+
let scheduled = false
|
|
292
|
+
const watcher = new Signal.subtle.Watcher(() => {
|
|
293
|
+
if (scheduled) return
|
|
294
|
+
scheduled = true
|
|
295
|
+
queueMicrotask(() => {
|
|
296
|
+
scheduled = false
|
|
297
|
+
if (subscriber.closed) return
|
|
298
|
+
subscriber.next(signal.get())
|
|
299
|
+
watcher.watch(signal)
|
|
300
|
+
})
|
|
301
|
+
})
|
|
302
|
+
watcher.watch(signal)
|
|
303
|
+
return () => watcher.unwatch(signal)
|
|
304
|
+
})
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
function buildWriteApi(internal: InternalState, kind: RuntimeKind): Record<string, unknown> {
|
|
308
|
+
const commit = (next: unknown): void => {
|
|
309
|
+
if (internal.disposed) return
|
|
310
|
+
internal.signal.set(next)
|
|
311
|
+
scheduleWrite(internal)
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
const common = {
|
|
315
|
+
replace: (next: unknown) => commit(next),
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
switch (kind) {
|
|
319
|
+
case 'object':
|
|
320
|
+
return {
|
|
321
|
+
...common,
|
|
322
|
+
set(patch: Record<string, unknown>, merge = true) {
|
|
323
|
+
const current = internal.signal.get() as Record<string, unknown>
|
|
324
|
+
commit(merge ? { ...current, ...patch } : patch)
|
|
325
|
+
},
|
|
326
|
+
update(recipe: (draft: unknown) => void) {
|
|
327
|
+
commit(produce(internal.signal.get(), recipe))
|
|
328
|
+
},
|
|
329
|
+
delete(key: string) {
|
|
330
|
+
const current = internal.signal.get() as Record<string, unknown>
|
|
331
|
+
const next = { ...current }
|
|
332
|
+
delete next[key]
|
|
333
|
+
commit(next)
|
|
334
|
+
},
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
case 'map':
|
|
338
|
+
return {
|
|
339
|
+
...common,
|
|
340
|
+
set(key: unknown, value: unknown) {
|
|
341
|
+
const current = internal.signal.get() as Map<unknown, unknown>
|
|
342
|
+
const next = new Map(current)
|
|
343
|
+
next.set(key, value)
|
|
344
|
+
commit(next)
|
|
345
|
+
},
|
|
346
|
+
delete(key: unknown) {
|
|
347
|
+
const current = internal.signal.get() as Map<unknown, unknown>
|
|
348
|
+
const next = new Map(current)
|
|
349
|
+
next.delete(key)
|
|
350
|
+
commit(next)
|
|
351
|
+
},
|
|
352
|
+
clear() {
|
|
353
|
+
commit(new Map())
|
|
354
|
+
},
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
case 'set':
|
|
358
|
+
return {
|
|
359
|
+
...common,
|
|
360
|
+
add(value: unknown) {
|
|
361
|
+
const current = internal.signal.get() as Set<unknown>
|
|
362
|
+
if (current.has(value)) return
|
|
363
|
+
const next = new Set(current)
|
|
364
|
+
next.add(value)
|
|
365
|
+
commit(next)
|
|
366
|
+
},
|
|
367
|
+
delete(value: unknown): boolean {
|
|
368
|
+
const current = internal.signal.get() as Set<unknown>
|
|
369
|
+
if (!current.has(value)) return false
|
|
370
|
+
const next = new Set(current)
|
|
371
|
+
next.delete(value)
|
|
372
|
+
commit(next)
|
|
373
|
+
return true
|
|
374
|
+
},
|
|
375
|
+
toggle(value: unknown) {
|
|
376
|
+
const current = internal.signal.get() as Set<unknown>
|
|
377
|
+
const next = new Set(current)
|
|
378
|
+
if (next.has(value)) {
|
|
379
|
+
next.delete(value)
|
|
380
|
+
} else {
|
|
381
|
+
next.add(value)
|
|
382
|
+
}
|
|
383
|
+
commit(next)
|
|
384
|
+
},
|
|
385
|
+
clear() {
|
|
386
|
+
commit(new Set())
|
|
387
|
+
},
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
case 'array':
|
|
391
|
+
return {
|
|
392
|
+
...common,
|
|
393
|
+
push(...items: unknown[]) {
|
|
394
|
+
const current = internal.signal.get() as unknown[]
|
|
395
|
+
commit([...current, ...items])
|
|
396
|
+
},
|
|
397
|
+
update(recipe: (draft: unknown) => void) {
|
|
398
|
+
commit(produce(internal.signal.get(), recipe))
|
|
399
|
+
},
|
|
400
|
+
clear() {
|
|
401
|
+
commit([])
|
|
402
|
+
},
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
case 'scalar':
|
|
406
|
+
default:
|
|
407
|
+
return {
|
|
408
|
+
...common,
|
|
409
|
+
set(next: unknown) {
|
|
410
|
+
commit(next)
|
|
411
|
+
},
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
interface CreateInstanceArgs {
|
|
417
|
+
namespace: string
|
|
418
|
+
initial: unknown
|
|
419
|
+
storage: StorageBackend
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
interface CreateInstanceOptions {
|
|
423
|
+
/** When true, the returned instance is a per-`<schmancy-context>` copy:
|
|
424
|
+
* it does NOT claim the namespace in `claimed`, it does NOT route reads
|
|
425
|
+
* or writes through `resolveContextual` (so it can serve as the
|
|
426
|
+
* resolution target without recursion), and it does NOT expose
|
|
427
|
+
* `_isolatedInstance` (you only isolate the global). */
|
|
428
|
+
isolated?: boolean
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
function reportLoadError(err: unknown): void {
|
|
432
|
+
console.error('[state] load failed:', err)
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
function createInstance(args: CreateInstanceArgs, options: CreateInstanceOptions = {}): unknown {
|
|
436
|
+
const { namespace, initial, storage } = args
|
|
437
|
+
const isolated = options.isolated === true
|
|
438
|
+
const adapter = createAdapter<unknown>(storage, namespace)
|
|
439
|
+
const signal = new Signal.State<unknown>(initial)
|
|
440
|
+
const internal: InternalState = {
|
|
441
|
+
signal,
|
|
442
|
+
storage,
|
|
443
|
+
adapter,
|
|
444
|
+
pendingWrite: null,
|
|
445
|
+
scheduledWrite: false,
|
|
446
|
+
disposed: false,
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
let loaded = false
|
|
450
|
+
const applyLoaded = (stored: unknown): void => {
|
|
451
|
+
if (internal.disposed) return
|
|
452
|
+
if (stored !== null && stored !== undefined) {
|
|
453
|
+
internal.signal.set(stored)
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
const markLoaded = (): boolean => (loaded = true)
|
|
457
|
+
const ready = adapter
|
|
458
|
+
.load()
|
|
459
|
+
.then(applyLoaded, reportLoadError)
|
|
460
|
+
.then(markLoaded)
|
|
461
|
+
.then(() => undefined)
|
|
462
|
+
|
|
463
|
+
const observable = signalToObservable(signal)
|
|
464
|
+
const writeApi = buildWriteApi(internal, detectKind(initial))
|
|
465
|
+
|
|
466
|
+
async function flushAndClose(): Promise<void> {
|
|
467
|
+
// Wait for any in-flight write, then any scheduled microtask write.
|
|
468
|
+
if (internal.pendingWrite) await internal.pendingWrite
|
|
469
|
+
// Drain a possibly-still-scheduled microtask:
|
|
470
|
+
await new Promise<void>(resolve => queueMicrotask(resolve))
|
|
471
|
+
if (internal.pendingWrite) await internal.pendingWrite
|
|
472
|
+
if (adapter.close) await adapter.close()
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
const dispose = (): void => {
|
|
476
|
+
if (internal.disposed) return
|
|
477
|
+
internal.disposed = true
|
|
478
|
+
// Fire-and-forget close for sync backends; AsyncDisposable variant
|
|
479
|
+
// has its own awaited path via Symbol.asyncDispose.
|
|
480
|
+
void flushAndClose()
|
|
481
|
+
claimed.delete(namespace)
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
const asyncDispose = async (): Promise<void> => {
|
|
485
|
+
if (internal.disposed) return
|
|
486
|
+
internal.disposed = true
|
|
487
|
+
await flushAndClose()
|
|
488
|
+
claimed.delete(namespace)
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
// Build the instance with explicit property definitions so the `value`
|
|
492
|
+
// and `loaded` getters stay live. (A `{ ...base }` spread invokes the
|
|
493
|
+
// getter once at spread time and freezes the result — that snapshot
|
|
494
|
+
// then disagrees with the signal on every subsequent write.)
|
|
495
|
+
const instance: Record<string | symbol, unknown> = Object.assign(Object.create(null) as object, {
|
|
496
|
+
[stateBrand]: true,
|
|
497
|
+
namespace,
|
|
498
|
+
storage,
|
|
499
|
+
defaultValue: initial,
|
|
500
|
+
ready,
|
|
501
|
+
destroy: dispose,
|
|
502
|
+
[Symbol.dispose]: dispose,
|
|
503
|
+
})
|
|
504
|
+
|
|
505
|
+
Object.defineProperty(instance, 'loaded', {
|
|
506
|
+
get: () => loaded,
|
|
507
|
+
enumerable: true,
|
|
508
|
+
})
|
|
509
|
+
|
|
510
|
+
if (storage === 'indexeddb') {
|
|
511
|
+
instance[Symbol.asyncDispose] = asyncDispose
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
if (isolated) {
|
|
515
|
+
// Per-context copy. Reads and writes go straight to its own signal —
|
|
516
|
+
// no resolveContextual call, so it serves as a recursion-free
|
|
517
|
+
// resolution target.
|
|
518
|
+
Object.defineProperty(instance, 'value', {
|
|
519
|
+
get: () => signal.get(),
|
|
520
|
+
enumerable: true,
|
|
521
|
+
})
|
|
522
|
+
instance.signal = signal
|
|
523
|
+
instance.$ = observable
|
|
524
|
+
Object.assign(instance, writeApi)
|
|
525
|
+
return instance
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
// Global instance. Every public read/write resolves through the active
|
|
529
|
+
// host: inside a `<schmancy-context provides={[…]}>` it routes to the
|
|
530
|
+
// per-context copy; outside, it falls back to this same instance and
|
|
531
|
+
// reads/writes its own signal directly. The cache in `resolveContextual`
|
|
532
|
+
// keeps the lookup O(1) past the first hit.
|
|
533
|
+
const isolatedTarget: Record<string | symbol, unknown> = Object.assign(Object.create(null), {
|
|
534
|
+
signal,
|
|
535
|
+
$: observable,
|
|
536
|
+
...writeApi,
|
|
537
|
+
})
|
|
538
|
+
Object.defineProperty(isolatedTarget, 'value', {
|
|
539
|
+
get: () => signal.get(),
|
|
540
|
+
enumerable: true,
|
|
541
|
+
})
|
|
542
|
+
|
|
543
|
+
Object.defineProperty(instance, 'value', {
|
|
544
|
+
get: () => (resolveContextual(namespace, isolatedTarget) as { value: unknown }).value,
|
|
545
|
+
enumerable: true,
|
|
546
|
+
})
|
|
547
|
+
Object.defineProperty(instance, 'signal', {
|
|
548
|
+
get: () =>
|
|
549
|
+
(resolveContextual(namespace, isolatedTarget) as { signal: Signal.State<unknown> }).signal,
|
|
550
|
+
enumerable: true,
|
|
551
|
+
})
|
|
552
|
+
Object.defineProperty(instance, '$', {
|
|
553
|
+
get: () =>
|
|
554
|
+
(resolveContextual(namespace, isolatedTarget) as { $: Observable<unknown> }).$,
|
|
555
|
+
enumerable: true,
|
|
556
|
+
})
|
|
557
|
+
for (const key of Object.keys(writeApi)) {
|
|
558
|
+
instance[key] = (...args: unknown[]): unknown => {
|
|
559
|
+
const target = resolveContextual(namespace, isolatedTarget) as Record<
|
|
560
|
+
string,
|
|
561
|
+
(...a: unknown[]) => unknown
|
|
562
|
+
>
|
|
563
|
+
return target[key](...args)
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
// Hook used by `<schmancy-context>` to mint a per-context copy seeded
|
|
568
|
+
// with the current value. Internal: not part of the public State<> type.
|
|
569
|
+
instance._isolatedInstance = (): unknown =>
|
|
570
|
+
createInstance(
|
|
571
|
+
{ namespace, initial: signal.get(), storage: 'memory' },
|
|
572
|
+
{ isolated: true },
|
|
573
|
+
)
|
|
574
|
+
|
|
575
|
+
return instance
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
function makeHandle(namespace: string): Record<string, (initial: unknown) => unknown> {
|
|
579
|
+
if (claimed.has(namespace)) {
|
|
580
|
+
throw new Error(
|
|
581
|
+
`[state] namespace "${namespace}" already registered. Each namespace must be unique.`,
|
|
582
|
+
)
|
|
583
|
+
}
|
|
584
|
+
claimed.add(namespace)
|
|
585
|
+
return {
|
|
586
|
+
memory: initial => createInstance({ namespace, initial, storage: 'memory' }),
|
|
587
|
+
local: initial => createInstance({ namespace, initial, storage: 'local' }),
|
|
588
|
+
session: initial => createInstance({ namespace, initial, storage: 'session' }),
|
|
589
|
+
idb: initial => createInstance({ namespace, initial, storage: 'indexeddb' }),
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
// ---------------------------------------------------------------------------
|
|
594
|
+
// Three-overload factory.
|
|
595
|
+
// (A) registered → pinned T from registry
|
|
596
|
+
// (C) unregistered, no type arg → inferred T (typed-const flow)
|
|
597
|
+
// (B) unregistered, explicit type arg → pinned T
|
|
598
|
+
// Order matters for resolution; do not reorder.
|
|
599
|
+
// ---------------------------------------------------------------------------
|
|
600
|
+
|
|
601
|
+
export function state<NS extends RegisteredNamespace>(
|
|
602
|
+
namespace: NS,
|
|
603
|
+
): NamespaceHandlePinned<NS, SchmancyStateRegistry[NS]>
|
|
604
|
+
|
|
605
|
+
export function state<const NS extends FeatureNamespace>(
|
|
606
|
+
namespace: NS extends RegisteredNamespace ? never : AssertNovel<NS>,
|
|
607
|
+
): NamespaceHandleInferred<NS>
|
|
608
|
+
|
|
609
|
+
export function state<T, const NS extends FeatureNamespace = FeatureNamespace>(
|
|
610
|
+
namespace: NS extends RegisteredNamespace ? never : AssertNovel<NS>,
|
|
611
|
+
): NamespaceHandlePinned<NS, T>
|
|
612
|
+
|
|
613
|
+
export function state(namespace: unknown): unknown {
|
|
614
|
+
if (typeof namespace !== 'string') {
|
|
615
|
+
throw new TypeError('[state] namespace must be a string')
|
|
616
|
+
}
|
|
617
|
+
if (!namespace.includes('/')) {
|
|
618
|
+
throw new TypeError(
|
|
619
|
+
`[state] namespace "${namespace}" must follow the "feature/name" convention.`,
|
|
620
|
+
)
|
|
621
|
+
}
|
|
622
|
+
return makeHandle(namespace)
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
// ---------------------------------------------------------------------------
|
|
626
|
+
// Derived state — re-export the upstream computed primitive directly.
|
|
627
|
+
// Reading state.value (which calls signal.get() under the hood) inside a
|
|
628
|
+
// computed callback auto-tracks the dependency.
|
|
629
|
+
// ---------------------------------------------------------------------------
|
|
630
|
+
|
|
631
|
+
export { computed } from '@lit-labs/signals'
|
|
632
|
+
|
|
633
|
+
// ---------------------------------------------------------------------------
|
|
634
|
+
// effect(fn) — run a side-effect function whenever any signal it reads
|
|
635
|
+
// changes. Returns a Disposable so the effect can be cleaned up.
|
|
636
|
+
//
|
|
637
|
+
// const stop = effect(() => {
|
|
638
|
+
// document.title = `${cart.value.items.length} items`
|
|
639
|
+
// })
|
|
640
|
+
// ...later...
|
|
641
|
+
// stop[Symbol.dispose]()
|
|
642
|
+
//
|
|
643
|
+
// The effect runs once eagerly to register dependencies, then re-runs
|
|
644
|
+
// (microtask-coalesced) whenever any read signal changes.
|
|
645
|
+
// ---------------------------------------------------------------------------
|
|
646
|
+
|
|
647
|
+
export interface EffectHandle extends Disposable {
|
|
648
|
+
[Symbol.dispose](): void
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
export function effect(fn: () => void): EffectHandle {
|
|
652
|
+
let scheduled = false
|
|
653
|
+
let disposed = false
|
|
654
|
+
let watcher: Signal.subtle.Watcher | undefined
|
|
655
|
+
|
|
656
|
+
const run = (): void => {
|
|
657
|
+
if (disposed) return
|
|
658
|
+
// Wrap fn in a Computed so signal reads are tracked. The computed's
|
|
659
|
+
// value is unused — we only care about the dependency graph it builds.
|
|
660
|
+
const computation = new Signal.Computed(() => {
|
|
661
|
+
fn()
|
|
662
|
+
return undefined
|
|
663
|
+
})
|
|
664
|
+
// Reading the computed registers our Watcher as a sink for every
|
|
665
|
+
// signal the fn touches.
|
|
666
|
+
watcher?.unwatch()
|
|
667
|
+
watcher = new Signal.subtle.Watcher(() => {
|
|
668
|
+
if (scheduled || disposed) return
|
|
669
|
+
scheduled = true
|
|
670
|
+
queueMicrotask(() => {
|
|
671
|
+
scheduled = false
|
|
672
|
+
if (disposed) return
|
|
673
|
+
run()
|
|
674
|
+
})
|
|
675
|
+
})
|
|
676
|
+
watcher.watch(computation)
|
|
677
|
+
computation.get()
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
run()
|
|
681
|
+
|
|
682
|
+
return {
|
|
683
|
+
[Symbol.dispose](): void {
|
|
684
|
+
if (disposed) return
|
|
685
|
+
disposed = true
|
|
686
|
+
watcher?.unwatch()
|
|
687
|
+
watcher = undefined
|
|
688
|
+
},
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
// ---------------------------------------------------------------------------
|
|
693
|
+
// Observable → state bridge.
|
|
694
|
+
// ---------------------------------------------------------------------------
|
|
695
|
+
|
|
696
|
+
export interface FromObservableOptions {
|
|
697
|
+
storage?: StorageBackend
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
/**
|
|
701
|
+
* Lift an Observable into a state(). The state is initialized with
|
|
702
|
+
* `initial`, then updates on every Observable emission. Cleanup on
|
|
703
|
+
* dispose unsubscribes the source.
|
|
704
|
+
*/
|
|
705
|
+
export function stateFromObservable<T, NS extends FeatureNamespace>(
|
|
706
|
+
observable: Observable<T>,
|
|
707
|
+
namespace: NS,
|
|
708
|
+
initial: T,
|
|
709
|
+
options: FromObservableOptions = {},
|
|
710
|
+
): State<NS, T, 'memory'> {
|
|
711
|
+
const storage = options.storage ?? 'memory'
|
|
712
|
+
const handle = makeHandle(namespace)
|
|
713
|
+
const inst = handle[storage](initial) as State<NS, T, 'memory'> & {
|
|
714
|
+
readonly signal: Signal.State<T>
|
|
715
|
+
[Symbol.dispose](): void
|
|
716
|
+
}
|
|
717
|
+
const subscription = observable.subscribe({
|
|
718
|
+
next: value => inst.signal.set(value),
|
|
719
|
+
error: err => console.error(`[state] from(${namespace}) source errored:`, err),
|
|
720
|
+
})
|
|
721
|
+
const originalDispose = inst[Symbol.dispose].bind(inst)
|
|
722
|
+
;(inst as { [Symbol.dispose]: () => void })[Symbol.dispose] = () => {
|
|
723
|
+
subscription.unsubscribe()
|
|
724
|
+
originalDispose()
|
|
725
|
+
}
|
|
726
|
+
return inst
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
// ---------------------------------------------------------------------------
|
|
730
|
+
// bindState(host, source) — Lit ReactiveController helper for one-way binding.
|
|
731
|
+
//
|
|
732
|
+
// Subscribes in hostConnected, unsubscribes in hostDisconnected, calls
|
|
733
|
+
// host.requestUpdate() on every emission. Returned object exposes the same
|
|
734
|
+
// `value` and `$` surface as the source so render code reads naturally:
|
|
735
|
+
//
|
|
736
|
+
// class CartView extends LitElement {
|
|
737
|
+
// cart = bindState(this, cartState)
|
|
738
|
+
// render() { return html`Items: ${this.cart.value.items.length}` }
|
|
739
|
+
// }
|
|
740
|
+
//
|
|
741
|
+
// Decorator (`@observe`) form is deliberately deferred — schmancy's
|
|
742
|
+
// tsconfig still uses experimentalDecorators=true and flipping to
|
|
743
|
+
// TC39 native produces ~9k errors across the codebase. The helper
|
|
744
|
+
// gives the same lifecycle guarantees with zero tsconfig churn.
|
|
745
|
+
// ---------------------------------------------------------------------------
|
|
746
|
+
|
|
747
|
+
import type { ReactiveController, ReactiveControllerHost } from 'lit'
|
|
748
|
+
|
|
749
|
+
/** Permissive duck-typed contract — v1 IStore<T>, v2 State<>, and
|
|
750
|
+
* computed() outputs (`Signal.Computed<T>` wrapped in a thin shim) all
|
|
751
|
+
* satisfy it once you supply a `value` getter and an Observable `$`. */
|
|
752
|
+
export interface ObservableState<T> {
|
|
753
|
+
readonly value: T
|
|
754
|
+
readonly $: Observable<T>
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
export interface BoundState<T> {
|
|
758
|
+
readonly value: T
|
|
759
|
+
readonly $: Observable<T>
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
class BindStateController<T> implements ReactiveController {
|
|
763
|
+
private subscription: import('rxjs').Subscription | undefined
|
|
764
|
+
private latest: T
|
|
765
|
+
constructor(
|
|
766
|
+
private readonly host: ReactiveControllerHost,
|
|
767
|
+
private readonly source: ObservableState<T>,
|
|
768
|
+
) {
|
|
769
|
+
this.latest = source.value
|
|
770
|
+
host.addController(this)
|
|
771
|
+
}
|
|
772
|
+
get value(): T {
|
|
773
|
+
return this.latest
|
|
774
|
+
}
|
|
775
|
+
get $(): Observable<T> {
|
|
776
|
+
return this.source.$
|
|
777
|
+
}
|
|
778
|
+
hostConnected(): void {
|
|
779
|
+
this.subscription = this.source.$.subscribe(v => {
|
|
780
|
+
this.latest = v
|
|
781
|
+
this.host.requestUpdate()
|
|
782
|
+
})
|
|
783
|
+
}
|
|
784
|
+
hostDisconnected(): void {
|
|
785
|
+
this.subscription?.unsubscribe()
|
|
786
|
+
this.subscription = undefined
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
export function bindState<T>(
|
|
791
|
+
host: ReactiveControllerHost,
|
|
792
|
+
source: ObservableState<T>,
|
|
793
|
+
): BoundState<T> {
|
|
794
|
+
return new BindStateController(host, source)
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
// ---------------------------------------------------------------------------
|
|
798
|
+
// @observe(source) — legacy property decorator for one-way binding.
|
|
799
|
+
//
|
|
800
|
+
// Usage:
|
|
801
|
+
// class CartView extends LitElement {
|
|
802
|
+
// @observe(cart) cart!: CartState
|
|
803
|
+
// render() { return html`Items: ${this.cart.items.length}` }
|
|
804
|
+
// }
|
|
805
|
+
//
|
|
806
|
+
// Reads return the latest value emitted by the source (falling back to
|
|
807
|
+
// `source.value` before the first emission). Caller writes are dropped
|
|
808
|
+
// with a dev-mode warning — the source is the single source of truth.
|
|
809
|
+
//
|
|
810
|
+
// Per-instance subscription is wired via Lit's static `addInitializer`,
|
|
811
|
+
// which runs at instance construction and gives the decorator access to
|
|
812
|
+
// the host. A `ReactiveController` handles the lifecycle: subscribe in
|
|
813
|
+
// `hostConnected`, unsubscribe in `hostDisconnected`. Multiple `@observe`
|
|
814
|
+
// decorators on the same class register independent controllers — no
|
|
815
|
+
// init-order bookkeeping, no prototype-walking.
|
|
816
|
+
//
|
|
817
|
+
// Legacy decorator (matches the rest of schmancy's @property / @state /
|
|
818
|
+
// @query family). Works under the existing `experimentalDecorators: true`
|
|
819
|
+
// tsconfig — no migration required.
|
|
820
|
+
// ---------------------------------------------------------------------------
|
|
821
|
+
|
|
822
|
+
interface ObserveHost extends ReactiveControllerHost {
|
|
823
|
+
addController(controller: ReactiveController): void
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
interface LitElementCtor {
|
|
827
|
+
addInitializer(initializer: (host: ObserveHost) => void): void
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
export function observe<T>(source: ObservableState<T>) {
|
|
831
|
+
return function (proto: object, propertyKey: string | symbol): void {
|
|
832
|
+
const storageKey = Symbol(`__observe_${String(propertyKey)}`)
|
|
833
|
+
|
|
834
|
+
// Per-prototype accessor — reads return the latest cached value,
|
|
835
|
+
// falling back to `source.value` before the first emission lands.
|
|
836
|
+
// Writes from callers are dropped with a dev warning.
|
|
837
|
+
Object.defineProperty(proto, propertyKey, {
|
|
838
|
+
get(this: Record<symbol, T>): T {
|
|
839
|
+
const cached = this[storageKey]
|
|
840
|
+
return cached !== undefined ? cached : source.value
|
|
841
|
+
},
|
|
842
|
+
set(_value: T): void {
|
|
843
|
+
console.warn(
|
|
844
|
+
`@observe: field "${String(propertyKey)}" is read-only — write ignored. ` +
|
|
845
|
+
`Update the source state directly.`,
|
|
846
|
+
)
|
|
847
|
+
},
|
|
848
|
+
configurable: true,
|
|
849
|
+
enumerable: true,
|
|
850
|
+
})
|
|
851
|
+
|
|
852
|
+
// Per-instance subscription via Lit's addInitializer hook.
|
|
853
|
+
const ctor = proto.constructor as unknown as LitElementCtor
|
|
854
|
+
if (typeof ctor.addInitializer !== 'function') {
|
|
855
|
+
throw new TypeError(
|
|
856
|
+
`@observe requires a Lit ReactiveElement subclass — ${proto.constructor.name} ` +
|
|
857
|
+
`does not provide static addInitializer.`,
|
|
858
|
+
)
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
ctor.addInitializer((host: ObserveHost) => {
|
|
862
|
+
let subscription: import('rxjs').Subscription | undefined
|
|
863
|
+
host.addController({
|
|
864
|
+
hostConnected(): void {
|
|
865
|
+
subscription = source.$.subscribe(value => {
|
|
866
|
+
;(host as unknown as Record<symbol, T>)[storageKey] = value
|
|
867
|
+
host.requestUpdate()
|
|
868
|
+
})
|
|
869
|
+
},
|
|
870
|
+
hostDisconnected(): void {
|
|
871
|
+
subscription?.unsubscribe()
|
|
872
|
+
subscription = undefined
|
|
873
|
+
},
|
|
874
|
+
})
|
|
875
|
+
})
|
|
876
|
+
}
|
|
877
|
+
}
|