@mhmo91/schmancy 0.9.28 → 0.10.2
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 +1005 -2215
- package/dist/active-host-CcIa2tmW.cjs +1 -0
- package/dist/active-host-CcIa2tmW.cjs.map +1 -0
- package/dist/active-host-CvNYoprt.js +57 -0
- package/dist/active-host-CvNYoprt.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 +12678 -7791
- package/dist/agent/schmancy.agent.js.map +1 -1
- package/dist/agent/schmancy.manifest.json +265 -1453
- 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-DHVANBbr.js} +20 -15
- package/dist/area-DHVANBbr.js.map +1 -0
- package/dist/area-ZupIezvU.cjs +12 -0
- package/dist/area-ZupIezvU.cjs.map +1 -0
- package/dist/area.cjs +1 -1
- package/dist/area.js +2 -2
- package/dist/{audio-Dvr-RBzE.cjs → audio-CluX8Qpq.cjs} +1 -1
- package/dist/{audio-Dvr-RBzE.cjs.map → audio-CluX8Qpq.cjs.map} +1 -1
- package/dist/{audio-ql6nvY0y.js → audio-DcXphulJ.js} +1 -1
- package/dist/{audio-ql6nvY0y.js.map → audio-DcXphulJ.js.map} +1 -1
- package/dist/audio.cjs +1 -1
- package/dist/audio.js +2 -2
- package/dist/autocomplete-Bn525CTp.cjs +115 -0
- package/dist/autocomplete-Bn525CTp.cjs.map +1 -0
- package/dist/{autocomplete-C2P0Soht.js → autocomplete-pHvsyfbH.js} +29 -26
- package/dist/autocomplete-pHvsyfbH.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-IyEtsNI4.cjs +80 -0
- package/dist/boat-IyEtsNI4.cjs.map +1 -0
- package/dist/{boat-DXZ0k7oa.js → boat-_Yv3M6YM.js} +43 -54
- package/dist/boat-_Yv3M6YM.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-DGYhpTnO.cjs → busy-CjM39APN.cjs} +4 -4
- package/dist/busy-CjM39APN.cjs.map +1 -0
- package/dist/{busy-iRjq6Nvd.js → busy-Ck2IXJ4r.js} +14 -9
- package/dist/busy-Ck2IXJ4r.js.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-DjYnCckw.cjs → card-DIxDuuth.cjs} +6 -6
- package/dist/card-DIxDuuth.cjs.map +1 -0
- package/dist/{card-wUTjx0EC.js → card-DUWZmMHc.js} +41 -30
- package/dist/card-DUWZmMHc.js.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-CGdFXuWQ.cjs +39 -0
- package/dist/checkbox-CGdFXuWQ.cjs.map +1 -0
- package/dist/{checkbox-VBSenxgb.js → checkbox-DPS1mWG-.js} +86 -82
- package/dist/checkbox-DPS1mWG-.js.map +1 -0
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-BDS9lkPa.js → chips-BnnXQSA-.js} +146 -136
- package/dist/chips-BnnXQSA-.js.map +1 -0
- package/dist/{chips-D6ptH5re.cjs → chips-UoFbwmlG.cjs} +19 -19
- package/dist/chips-UoFbwmlG.cjs.map +1 -0
- package/dist/chips.cjs +1 -1
- package/dist/chips.js +2 -2
- package/dist/{code-highlight-BzRmBZzz.cjs → code-highlight-CMilN0B8.cjs} +15 -15
- package/dist/code-highlight-CMilN0B8.cjs.map +1 -0
- package/dist/{code-highlight-Bi91XHJN.js → code-highlight-kFUJ1Eet.js} +37 -40
- package/dist/code-highlight-kFUJ1Eet.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-BIyrzTRZ.cjs +131 -0
- package/dist/date-range-BIyrzTRZ.cjs.map +1 -0
- package/dist/{date-range-ClTMg1AB.js → date-range-DOstCIg8.js} +16 -17
- package/dist/date-range-DOstCIg8.js.map +1 -0
- package/dist/date-range-inline-4P7zqeVe.cjs +43 -0
- package/dist/{date-range-inline-B9Dp2z6C.cjs.map → date-range-inline-4P7zqeVe.cjs.map} +1 -1
- package/dist/{date-range-inline-CpKG6qt2.js → date-range-inline-BVycTWLb.js} +5 -5
- package/dist/{date-range-inline-CpKG6qt2.js.map → date-range-inline-BVycTWLb.js.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-Cz9ok9si.cjs → details-BJBbZOO6.cjs} +9 -9
- package/dist/details-BJBbZOO6.cjs.map +1 -0
- package/dist/{details-CPjlqQD4.js → details-DPc5GxPa.js} +19 -18
- package/dist/details-DPc5GxPa.js.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-ghgyw5CU.js → divider-BvJsmSPH.js} +11 -9
- package/dist/divider-BvJsmSPH.js.map +1 -0
- package/dist/{divider-CILo3_vi.cjs → divider-DPT3XnG5.cjs} +3 -3
- package/dist/divider-DPT3XnG5.cjs.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-CbjBr_Ds.js → expand-BMzocdtj.js} +24 -20
- package/dist/expand-BMzocdtj.js.map +1 -0
- package/dist/expand-CTqBWVXo.cjs +141 -0
- package/dist/expand-CTqBWVXo.cjs.map +1 -0
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/{extra-DK9MQtPJ.js → extra-BeHlUhzv.js} +19 -14
- package/dist/extra-BeHlUhzv.js.map +1 -0
- package/dist/{extra-BZeZOMBI.cjs → extra-h_cuxRII.cjs} +6 -6
- package/dist/extra-h_cuxRII.cjs.map +1 -0
- package/dist/extra.cjs +1 -1
- package/dist/extra.js +1 -1
- package/dist/{float-BfCvGeY9.js → float-CTc1xxqH.js} +2 -2
- package/dist/{float-BfCvGeY9.js.map → float-CTc1xxqH.js.map} +1 -1
- package/dist/float-CwVBs11k.cjs +1 -0
- package/dist/{float-CuZ8LOgB.cjs.map → float-CwVBs11k.cjs.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-BbCVrcas.js} +27 -24
- package/dist/icons-BbCVrcas.js.map +1 -0
- package/dist/icons-qEQW4pjM.cjs +52 -0
- package/dist/icons-qEQW4pjM.cjs.map +1 -0
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-BmyHW8km.js → iframe-BJfDIEJf.js} +17 -11
- package/dist/iframe-BJfDIEJf.js.map +1 -0
- package/dist/iframe-D6HTruav.cjs +24 -0
- package/dist/iframe-D6HTruav.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-LTK3cctF.js} +34 -34
- package/dist/input-LTK3cctF.js.map +1 -0
- package/dist/input-U26axtcs.cjs +51 -0
- package/dist/input-U26axtcs.cjs.map +1 -0
- package/dist/{input-chip-DN-cwf11.cjs → input-chip-CADXt0X5.cjs} +2 -2
- package/dist/input-chip-CADXt0X5.cjs.map +1 -0
- package/dist/{input-chip-BQrjpjaQ.js → input-chip-Ch-aCs3c.js} +7 -4
- package/dist/input-chip-Ch-aCs3c.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-C4xmnU4n.js} +1 -1
- package/dist/{layout-fjM1DWlF.js.map → layout-C4xmnU4n.js.map} +1 -1
- package/dist/{layout-CTfRXQoz.cjs → layout-Dmh6fxh0.cjs} +1 -1
- package/dist/{layout-CTfRXQoz.cjs.map → layout-Dmh6fxh0.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-DbYUSfVl.cjs +202 -0
- package/dist/lightbox-DbYUSfVl.cjs.map +1 -0
- package/dist/{lightbox-CY52Z_ig.js → lightbox-DqG2z3Cn.js} +13 -12
- package/dist/lightbox-DqG2z3Cn.js.map +1 -0
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/list-CLX4sSAw.cjs +40 -0
- package/dist/list-CLX4sSAw.cjs.map +1 -0
- package/dist/{list-D7wUxu1C.js → list-D6-_E5ZD.js} +26 -21
- package/dist/list-D6-_E5ZD.js.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-Ct6iYe-4.cjs} +64 -66
- package/dist/mailbox-Ct6iYe-4.cjs.map +1 -0
- package/dist/{mailbox--EN-JhjV.js → mailbox-DsPII8HR.js} +137 -126
- package/dist/mailbox-DsPII8HR.js.map +1 -0
- package/dist/mailbox.cjs +1 -1
- package/dist/mailbox.js +1 -1
- package/dist/{map-B0S_q3ma.js → map-Dhy3ta9v.js} +11 -9
- package/dist/map-Dhy3ta9v.js.map +1 -0
- package/dist/map-WXeVkx2K.cjs +80 -0
- package/dist/map-WXeVkx2K.cjs.map +1 -0
- package/dist/map.cjs +1 -1
- package/dist/map.js +1 -1
- package/dist/{menu-COeFpb6n.js → menu-Bhd3EapX.js} +15 -10
- package/dist/menu-Bhd3EapX.js.map +1 -0
- package/dist/{menu-3edZGQ1x.cjs → menu-Cg2aaDjs.cjs} +5 -5
- package/dist/menu-Cg2aaDjs.cjs.map +1 -0
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/mixins-CcIWET41.js +627 -0
- package/dist/mixins-CcIWET41.js.map +1 -0
- package/dist/mixins-De3xfjrm.cjs +298 -0
- package/dist/mixins-De3xfjrm.cjs.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-CC-TFN5v.js → notification-CVLqQ8c_.js} +40 -38
- package/dist/notification-CVLqQ8c_.js.map +1 -0
- package/dist/notification-D_PQjBSf.cjs +23 -0
- package/dist/notification-D_PQjBSf.cjs.map +1 -0
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/option-DDU_goh1.cjs +43 -0
- package/dist/option-DDU_goh1.cjs.map +1 -0
- package/dist/{option-BwAF4nAw.js → option-rm4HebVs.js} +9 -7
- package/dist/option-rm4HebVs.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/{components-DZgJWHdZ.js → payment-card-form-C0dHYZIv.js} +21 -22
- package/dist/{components-DZgJWHdZ.js.map → payment-card-form-C0dHYZIv.js.map} +1 -1
- package/dist/payment-card-form-DNvmZxs4.cjs +73 -0
- package/dist/{components-DkmEgyAc.cjs.map → payment-card-form-DNvmZxs4.cjs.map} +1 -1
- package/dist/payment-card-form.cjs +1 -0
- package/dist/payment-card-form.js +2 -0
- package/dist/{progress-Bk_Q1Shy.js → progress-BRerM5Bn.js} +16 -13
- package/dist/progress-BRerM5Bn.js.map +1 -0
- package/dist/{progress-Yz6EMNSu.cjs → progress-U3LQkpM2.cjs} +3 -3
- package/dist/progress-U3LQkpM2.cjs.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-BcdcjLNC.js → radio-group-BZ2WoOXJ.js} +14 -12
- package/dist/radio-group-BZ2WoOXJ.js.map +1 -0
- package/dist/radio-group-D7mm-yvJ.cjs +40 -0
- package/dist/radio-group-D7mm-yvJ.cjs.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-DJTjNIT_.cjs +26 -0
- package/dist/scroll-DJTjNIT_.cjs.map +1 -0
- package/dist/{scroll-DXQv0ejL.js → scroll-qL-HkMdP.js} +9 -7
- package/dist/scroll-qL-HkMdP.js.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-BvA7v-gL.cjs} +6 -6
- package/dist/select-BvA7v-gL.cjs.map +1 -0
- package/dist/{select-DKyGWDsG.js → select-CnPXUeSf.js} +23 -20
- package/dist/select-CnPXUeSf.js.map +1 -0
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/{sheet-C3TLKItO.js → sheet-BRL07BB4.js} +22 -20
- package/dist/sheet-BRL07BB4.js.map +1 -0
- package/dist/sheet-BYQJAHQn.cjs +35 -0
- package/dist/sheet-BYQJAHQn.cjs.map +1 -0
- package/dist/sheet.cjs +1 -1
- package/dist/sheet.js +2 -2
- package/dist/sheet.service-B25bsrYG.cjs +1 -0
- package/dist/{sheet.service-RcDBwHmv.cjs.map → sheet.service-B25bsrYG.cjs.map} +1 -1
- package/dist/{sheet.service-Dlv20Zfc.js → sheet.service-SPQ8oLCi.js} +3 -3
- package/dist/{sheet.service-Dlv20Zfc.js.map → sheet.service-SPQ8oLCi.js.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-BGs6m0Cm.cjs +1 -0
- package/dist/sound.service-BGs6m0Cm.cjs.map +1 -0
- package/dist/{sound.service-DWZe6swU.js → sound.service-kKfsN0m-.js} +3 -3
- package/dist/sound.service-kKfsN0m-.js.map +1 -0
- package/dist/splash-screen-BDt4PInk.cjs +41 -0
- package/dist/splash-screen-BDt4PInk.cjs.map +1 -0
- package/dist/{splash-screen-DbI5RgBf.js → splash-screen-C8JCqX5L.js} +12 -9
- package/dist/splash-screen-C8JCqX5L.js.map +1 -0
- package/dist/splash-screen.cjs +1 -1
- package/dist/splash-screen.js +1 -1
- package/dist/src-CpRNClhg.cjs +263 -0
- package/dist/src-CpRNClhg.cjs.map +1 -0
- package/dist/{src-00DfxCJq.js → src-CqdnWGgr.js} +299 -351
- package/dist/src-CqdnWGgr.js.map +1 -0
- package/dist/state-BusMG6sM.js +868 -0
- package/dist/state-BusMG6sM.js.map +1 -0
- package/dist/state-DNdCPITt.cjs +1 -0
- package/dist/state-DNdCPITt.cjs.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-C8jQy8Ym.js +24 -0
- package/dist/surface-C8jQy8Ym.js.map +1 -0
- package/dist/surface-Du2Y4vXd.cjs +7 -0
- package/dist/surface-Du2Y4vXd.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-0RfeCa00.cjs +31 -0
- package/dist/tabs-0RfeCa00.cjs.map +1 -0
- package/dist/{tabs-Ce55RbwF.js → tabs-Cyahh9Q6.js} +22 -22
- package/dist/tabs-Cyahh9Q6.js.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-CXCcTVnf.js} +30 -28
- package/dist/textarea-CXCcTVnf.js.map +1 -0
- package/dist/textarea-jqRrLxmo.cjs +39 -0
- package/dist/textarea-jqRrLxmo.cjs.map +1 -0
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-pbxlt72h.js → theme-2KZW2Rfs.js} +45 -41
- package/dist/{theme-pbxlt72h.js.map → theme-2KZW2Rfs.js.map} +1 -1
- package/dist/theme-Hjz9sCN-.cjs +181 -0
- package/dist/{theme-B-IJ2r7Q.cjs.map → theme-Hjz9sCN-.cjs.map} +1 -1
- package/dist/{theme-button-CEMeAUOL.js → theme-button-9uF1eoHz.js} +3 -4
- package/dist/theme-button-9uF1eoHz.js.map +1 -0
- package/dist/theme-button-C7QIbke1.cjs +8 -0
- package/dist/theme-button-C7QIbke1.cjs.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-BrUbGoeQ.cjs +1 -0
- package/dist/theme.service-BrUbGoeQ.cjs.map +1 -0
- package/dist/{theme.service-cOfPrtfe.js → theme.service-CmbOGMA8.js} +4 -4
- package/dist/theme.service-CmbOGMA8.js.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-CrjZdf7Y.js → window-C7yY9yp5.js} +28 -30
- package/dist/window-C7yY9yp5.js.map +1 -0
- package/dist/window-DtUOWiAj.cjs +59 -0
- package/dist/window-DtUOWiAj.cjs.map +1 -0
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/package.json +15 -4
- 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 +71 -54
- package/src/agent/agent-entry.ts +5 -21
- package/src/agent/helpers.ts +159 -0
- package/src/agent/schmancy-skill.ts +71 -0
- 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/emotional-sounds.ts +0 -2
- package/src/audio/sound.service.ts +7 -13
- 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 +6 -13
- 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-service.ts +0 -2
- package/src/notification/notification.ts +6 -3
- package/src/option/option.ts +4 -3
- package/src/overlay/overlay.animations.ts +183 -37
- 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 -10
- 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 +190 -0
- package/src/state/index.ts +877 -0
- package/src/state/persist.ts +208 -0
- package/src/state/schmancy-context.ts +130 -0
- package/src/state/state.test-d.ts +227 -0
- package/src/state/state.test.ts +868 -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 +2 -19
- package/types/src/agent/helpers.d.ts +0 -27
- 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/audio/emotional-sounds.d.ts +0 -1
- package/types/src/audio/sound.service.d.ts +1 -1
- 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-service.d.ts +0 -1
- 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 -6
- 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.stack.d.ts +0 -2
- 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 +23 -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 +32 -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 +0 -51
- 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/agent/index.d.ts +0 -1
- 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,258 @@
|
|
|
1
|
+
# Migrating from `createContext` to `state()`
|
|
2
|
+
|
|
3
|
+
Cheatsheet for moving call sites off the v1 `createContext` /
|
|
4
|
+
`@select` / `createCompoundSelector` / `selectItem` family to
|
|
5
|
+
`@mhmo91/schmancy/state`.
|
|
6
|
+
|
|
7
|
+
The v1 surface has been deleted from `@mhmo91/schmancy`. There is no
|
|
8
|
+
parallel API; every consumer needs to switch.
|
|
9
|
+
|
|
10
|
+
## Imports
|
|
11
|
+
|
|
12
|
+
```ts
|
|
13
|
+
// Before
|
|
14
|
+
import { createContext, select, selectItem, createCompoundSelector } from '@mhmo91/schmancy'
|
|
15
|
+
|
|
16
|
+
// After
|
|
17
|
+
import { state, computed, observe, bindState, stateFromObservable } from '@mhmo91/schmancy/state'
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Defining a state
|
|
21
|
+
|
|
22
|
+
| v1 | v2 |
|
|
23
|
+
|---|---|
|
|
24
|
+
| `createContext<T>(initial, 'memory', 'foo')` | `state<T>('feature/foo').memory(initial)` |
|
|
25
|
+
| `createContext<T>(initial, 'session', 'foo')` | `state<T>('feature/foo').session(initial)` |
|
|
26
|
+
| `createContext<T>(initial, 'local', 'foo')` | `state<T>('feature/foo').local(initial)` |
|
|
27
|
+
| `createContext<T>(initial, 'indexeddb', 'foo')` | `state<T>('feature/foo').idb(initial)` |
|
|
28
|
+
|
|
29
|
+
The string namespace replaces the v1 third-argument storage key. It
|
|
30
|
+
must contain a `/` (compile-time enforced via the
|
|
31
|
+
`${string}/${string}` template literal). Storage is keyed off the
|
|
32
|
+
namespace string.
|
|
33
|
+
|
|
34
|
+
If your file already declares the initial value in a typed const, drop
|
|
35
|
+
the type arg:
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
const initial: CartState = { items: [], total: 0 }
|
|
39
|
+
const cart = state('hannah/cart').session(initial) // T inferred from `initial`
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Reading
|
|
43
|
+
|
|
44
|
+
| v1 | v2 |
|
|
45
|
+
|---|---|
|
|
46
|
+
| `cart.value` | `cart.value` (unchanged) |
|
|
47
|
+
| `cart.$.subscribe(...)` | `cart.$.subscribe(...)` (unchanged) |
|
|
48
|
+
| `cart.ready` (boolean) | `cart.loaded` (boolean) + `await cart.ready` (Promise<void>) |
|
|
49
|
+
|
|
50
|
+
`cart.ready` is now a Promise that resolves when initial load completes
|
|
51
|
+
(success or fallback). `cart.loaded` is the boolean runtime flag. Use
|
|
52
|
+
whichever fits the call site.
|
|
53
|
+
|
|
54
|
+
## Writing
|
|
55
|
+
|
|
56
|
+
| v1 | v2 |
|
|
57
|
+
|---|---|
|
|
58
|
+
| `cart.set({ total: 12 })` | `cart.set({ total: 12 })` (unchanged) |
|
|
59
|
+
| `cart.set({ items: [] }, false)` | `cart.set({ items: [] }, false)` (unchanged) |
|
|
60
|
+
| `cart.replace(next)` | `cart.replace(next)` (unchanged) |
|
|
61
|
+
| `cart.delete('total')` | `cart.delete('total')` (unchanged) |
|
|
62
|
+
| Manual `replace({ ...current, ...patch })` cascade | `cart.update(d => { … })` — immer recipe, single notification |
|
|
63
|
+
|
|
64
|
+
For `Map<K, V>` shapes:
|
|
65
|
+
|
|
66
|
+
| v1 | v2 |
|
|
67
|
+
|---|---|
|
|
68
|
+
| `docs.set('id', doc)` | `docs.set('id', doc)` (unchanged — MapAPI dispatch) |
|
|
69
|
+
|
|
70
|
+
For `Set<U>`:
|
|
71
|
+
|
|
72
|
+
| v1 | v2 |
|
|
73
|
+
|---|---|
|
|
74
|
+
| Manual `replace(new Set([...current, item]))` | `sel.add('item')` |
|
|
75
|
+
| Manual replace-without-item | `sel.delete('item')` (returns boolean) |
|
|
76
|
+
| | `sel.toggle('item')` (new) |
|
|
77
|
+
|
|
78
|
+
For arrays:
|
|
79
|
+
|
|
80
|
+
| v1 | v2 |
|
|
81
|
+
|---|---|
|
|
82
|
+
| `array.push(...items)` | `array.push(...items)` (unchanged) |
|
|
83
|
+
| Manual `replace(current.filter(...))` | `array.update(d => d.splice(...))` (immer) |
|
|
84
|
+
|
|
85
|
+
For nullable references and primitives:
|
|
86
|
+
|
|
87
|
+
| v1 | v2 |
|
|
88
|
+
|---|---|
|
|
89
|
+
| `editing.set({ id: 'x' })` then `editing.set(null)` | Same (ScalarAPI accepts the union directly) |
|
|
90
|
+
|
|
91
|
+
## Subscribing in a component
|
|
92
|
+
|
|
93
|
+
The v1 `@select` decorator is gone. Three options in v2, in order of
|
|
94
|
+
preference:
|
|
95
|
+
|
|
96
|
+
### (1) Default — direct read in render (zero ceremony)
|
|
97
|
+
|
|
98
|
+
`$LitElement()` composes `SignalWatcher`, so signal reads in `render()`
|
|
99
|
+
auto-track. Just import the state and use it inline:
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
@customElement('cart-view')
|
|
103
|
+
class CartView extends $LitElement() {
|
|
104
|
+
render() { return html`Items: ${cart.value.items.length}` }
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
No decorator, no field, no binding code. The imported `cart` singleton
|
|
109
|
+
IS the binding.
|
|
110
|
+
|
|
111
|
+
### (2) `@observe(source)` — when you need a class field
|
|
112
|
+
|
|
113
|
+
```ts
|
|
114
|
+
class CartView extends $LitElement() {
|
|
115
|
+
@observe(cart) cart!: CartState
|
|
116
|
+
|
|
117
|
+
onClick() {
|
|
118
|
+
console.log(this.cart) // event handler needs `this.cart`
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
render() {
|
|
122
|
+
return html`Items: ${this.cart.items.length}`
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Reads return the latest value. Caller writes are dropped with a dev
|
|
128
|
+
warning. Same decorator shape as `@property` — works under the existing
|
|
129
|
+
tsconfig.
|
|
130
|
+
|
|
131
|
+
### (3) `bindState(host, source)` — for hosts that aren't `$LitElement`
|
|
132
|
+
|
|
133
|
+
```ts
|
|
134
|
+
class CustomHost extends LitElement {
|
|
135
|
+
cart = bindState(this, cart)
|
|
136
|
+
render() { return html`Items: ${this.cart.value.items.length}` }
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Compound selectors → `computed`
|
|
141
|
+
|
|
142
|
+
```ts
|
|
143
|
+
// Before
|
|
144
|
+
const cartItemCount = createCompoundSelector(
|
|
145
|
+
[cartContext],
|
|
146
|
+
[cart => cart.items.length],
|
|
147
|
+
count => count,
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
// After
|
|
151
|
+
import { computed } from '@mhmo91/schmancy/state'
|
|
152
|
+
const cartItemCount = computed(() => cart.value.items.length)
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Cross-state composition just works:
|
|
156
|
+
|
|
157
|
+
```ts
|
|
158
|
+
const orderTotal = computed(() => cart.value.subtotal + tip.value.amount)
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Reading any `state.value` inside `computed(fn)` auto-tracks. No
|
|
162
|
+
explicit dependency array.
|
|
163
|
+
|
|
164
|
+
## Side effects → `effect`
|
|
165
|
+
|
|
166
|
+
```ts
|
|
167
|
+
import { effect } from '@mhmo91/schmancy/state'
|
|
168
|
+
|
|
169
|
+
const stop = effect(() => {
|
|
170
|
+
document.title = `${cart.value.items.length} items`
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
// later, when no longer needed:
|
|
174
|
+
stop[Symbol.dispose]()
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Eager run + microtask-coalesced re-runs. Returns a `Disposable`.
|
|
178
|
+
|
|
179
|
+
## Observable bridges
|
|
180
|
+
|
|
181
|
+
```ts
|
|
182
|
+
// Before
|
|
183
|
+
const userPresence$ = new BehaviorSubject({ online: false, since: 0 })
|
|
184
|
+
// (read with .value, subscribe with .$, no persistence story)
|
|
185
|
+
|
|
186
|
+
// After
|
|
187
|
+
import { stateFromObservable } from '@mhmo91/schmancy/state'
|
|
188
|
+
|
|
189
|
+
const userPresence = stateFromObservable(
|
|
190
|
+
presence$, // Observable<PresenceState>
|
|
191
|
+
'app/presence',
|
|
192
|
+
{ online: false, since: 0 },
|
|
193
|
+
)
|
|
194
|
+
// userPresence has .value, .$, all variant API methods, lifecycle.
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Lifecycle / disposal
|
|
198
|
+
|
|
199
|
+
```ts
|
|
200
|
+
// Module scope — same as v1
|
|
201
|
+
export const cart = state('hannah/cart').session(initial)
|
|
202
|
+
|
|
203
|
+
// Test scope — using
|
|
204
|
+
it('cart updates total on add', () => {
|
|
205
|
+
using cart = state('test/cart').memory(initial)
|
|
206
|
+
cart.update(d => { d.items.push(item) })
|
|
207
|
+
expect(cart.value.total).toBe(item.price)
|
|
208
|
+
}) // [Symbol.dispose] runs here, even on assertion failure
|
|
209
|
+
|
|
210
|
+
// IDB-backed in tests — await using flushes pending writes
|
|
211
|
+
it('persists across reloads', async () => {
|
|
212
|
+
await using cart = state('test/cart').idb(initial)
|
|
213
|
+
// ...
|
|
214
|
+
})
|
|
215
|
+
|
|
216
|
+
// Imperative cleanup (samwa back-compat alias)
|
|
217
|
+
cart.destroy()
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Things that went away
|
|
221
|
+
|
|
222
|
+
- **`createCompoundSelector`** — use `computed()`.
|
|
223
|
+
- **`@select` and `@selectItem` decorators** — use direct render reads
|
|
224
|
+
via `$LitElement` (default), `@observe` (field-level), or `bindState`
|
|
225
|
+
(non-Lit hosts).
|
|
226
|
+
- **`IStore` / `ICollectionStore` / `IArrayStore` interfaces** — no
|
|
227
|
+
longer needed. The variant write API dispatch is type-level.
|
|
228
|
+
- **`error$` per-store Subject** — errors flow through console + the
|
|
229
|
+
`StateStorageError` thrown from `save()` for IDB write failures.
|
|
230
|
+
- **Tree-scoped `<state-provider>`** — replaced by
|
|
231
|
+
`<schmancy-context provides={[…]}>`. Same intent (per-subtree
|
|
232
|
+
isolation of a state), different API: in v1 the provider was a
|
|
233
|
+
primitive; in v2 the state surface stays unchanged and the
|
|
234
|
+
`<schmancy-context>` element is what scopes a subtree. Consumer
|
|
235
|
+
code (`cart.value`, `cart.set(...)`) is identical inside and
|
|
236
|
+
outside the element. See `SCOPING.md` for the details.
|
|
237
|
+
|
|
238
|
+
## Footguns
|
|
239
|
+
|
|
240
|
+
- **Don't use `using` at module scope.** It disposes on module GC,
|
|
241
|
+
which is roughly never until the tab closes. Plain `const` for
|
|
242
|
+
module singletons, `using` for test/function scope only.
|
|
243
|
+
- **Namespaces always contain `/`.** `state('cart')` is a TypeError;
|
|
244
|
+
use `state('feature/cart')`.
|
|
245
|
+
- **Don't `state.signal.set(...)` directly.** Go through the variant
|
|
246
|
+
API so write-coalescing and persistence stay coherent.
|
|
247
|
+
- **Inline literals without a typed const narrow T.**
|
|
248
|
+
`state('app/x').memory({ items: [], total: 0 })` infers
|
|
249
|
+
`{ items: never[]; total: number }`. Either use a typed const first
|
|
250
|
+
or pass the type arg: `state<CartState>('app/x').memory({...})`.
|
|
251
|
+
|
|
252
|
+
## Pointers
|
|
253
|
+
|
|
254
|
+
- Skill / API reference: `packages/schmancy/skills/schmancy/state.md`
|
|
255
|
+
- Agent brief: `packages/schmancy/src/state/CLAUDE.md`
|
|
256
|
+
- Tree-scoping reference: `packages/schmancy/src/state/SCOPING.md`
|
|
257
|
+
- Original plan: `~/.claude/plans/indexed-twirling-stroustrup.md`
|
|
258
|
+
- Scoping plan: `~/.claude/plans/federated-petting-penguin.md`
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Scoping a state per subtree — `<schmancy-context provides>`
|
|
2
|
+
|
|
3
|
+
The `state()` factory returns a module-scoped singleton. `cart` is the
|
|
4
|
+
same instance everywhere it is imported. That is the right default —
|
|
5
|
+
"the cart" is a single thing.
|
|
6
|
+
|
|
7
|
+
When you need *more than one* of something at the same time — two
|
|
8
|
+
side-by-side checkout flows, a comparison view of two records, an
|
|
9
|
+
embedded preview that shouldn't trample the parent's draft —
|
|
10
|
+
`<schmancy-context>` scopes a state to a subtree.
|
|
11
|
+
|
|
12
|
+
```ts
|
|
13
|
+
import { state } from '@mhmo91/schmancy/state'
|
|
14
|
+
|
|
15
|
+
const cart = state<CartState>('hannah/cart').session({ items: [], total: 0 })
|
|
16
|
+
|
|
17
|
+
class App extends $LitElement() {
|
|
18
|
+
render() {
|
|
19
|
+
return html`
|
|
20
|
+
<schmancy-context .provides=${[cart]}>
|
|
21
|
+
<cart-view></cart-view> <!-- isolated copy of cart -->
|
|
22
|
+
</schmancy-context>
|
|
23
|
+
<cart-summary></cart-summary> <!-- module-scoped global cart -->
|
|
24
|
+
`
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Inside `<schmancy-context>`, every read and write of `cart` resolves to
|
|
30
|
+
a per-element isolated copy. Outside, it stays the global. **Consumer
|
|
31
|
+
code does not change.** `cart.value`, `cart.set(...)`,
|
|
32
|
+
`cart.update(d => …)` — same calls, tree-aware result.
|
|
33
|
+
|
|
34
|
+
## Resolution rules
|
|
35
|
+
|
|
36
|
+
- Inside `<schmancy-context provides={[cart]}>` → reads/writes go to
|
|
37
|
+
that element's isolated copy.
|
|
38
|
+
- Inside two nested `<schmancy-context provides={[cart]}>` → the
|
|
39
|
+
**closest** provider wins.
|
|
40
|
+
- Inside a `<schmancy-context>` whose `provides` does **not** include
|
|
41
|
+
`cart` → falls through to the module-scoped global.
|
|
42
|
+
- Outside any `<schmancy-context>` → module-scoped global.
|
|
43
|
+
|
|
44
|
+
## What's covered
|
|
45
|
+
|
|
46
|
+
The scoping primitive is supposed to "just work" for the call paths a
|
|
47
|
+
component naturally writes. It handles:
|
|
48
|
+
|
|
49
|
+
| Code path | Mechanism |
|
|
50
|
+
|---|---|
|
|
51
|
+
| `render()` | `SchmancyElement` prototype-wrap pushes the host onto the active-host stack for the duration of `render()`. |
|
|
52
|
+
| Lit lifecycle (`connectedCallback`, `update`, `updated`, `firstUpdated`, `willUpdate`) | Same prototype-wrap. |
|
|
53
|
+
| Class methods called from event handlers (sync) | Same prototype-wrap. |
|
|
54
|
+
| `await` continuations inside class methods | A `Promise.prototype.then` patch in `state/active-host.ts` propagates the host across each `.then` boundary. |
|
|
55
|
+
| `addEventListener(type, fn)` on the host | Wrapped at the `SchmancyElement` layer; `removeEventListener` re-finds the wrapped listener via a `WeakMap`. |
|
|
56
|
+
| Inline arrow handlers attached via Lit templates (`@click=${() => …}`) | Resolved through the `window.event.composedPath()` fallback in `resolveActiveHost()`. |
|
|
57
|
+
|
|
58
|
+
Pure async callbacks with no DOM origin — a websocket `onmessage`
|
|
59
|
+
unrelated to any user gesture, a `setInterval` body running on its own
|
|
60
|
+
schedule — fall through to the module-scoped global. That is the
|
|
61
|
+
correct semantic: those callbacks have no tree position to resolve to.
|
|
62
|
+
|
|
63
|
+
## Lifecycle
|
|
64
|
+
|
|
65
|
+
- The isolated copy is created when `<schmancy-context>` connects, and
|
|
66
|
+
is **seeded with the current global value** at that moment. The
|
|
67
|
+
subtree starts from "what the rest of the app sees right now," then
|
|
68
|
+
diverges.
|
|
69
|
+
- It is destroyed when `<schmancy-context>` disconnects. Pending
|
|
70
|
+
microtask-coalesced writes flush; the storage adapter's `close()`
|
|
71
|
+
runs.
|
|
72
|
+
- The isolated copy uses **memory** storage regardless of the global's
|
|
73
|
+
backend. It shares lifetime with the element, not with
|
|
74
|
+
`localStorage` / `sessionStorage` / IndexedDB. The global continues
|
|
75
|
+
to persist on whichever backend it was created with.
|
|
76
|
+
|
|
77
|
+
## Multiple states per element
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
<schmancy-context .provides=${[cart, menu, draft]}>
|
|
81
|
+
<wizard></wizard>
|
|
82
|
+
</schmancy-context>
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Each is isolated independently. States not listed in `provides`
|
|
86
|
+
fall through to the global from inside the element — useful when only
|
|
87
|
+
some namespaces need scoping in a particular subtree.
|
|
88
|
+
|
|
89
|
+
## Two pitfalls
|
|
90
|
+
|
|
91
|
+
### Don't cache `state.signal` or `state.$` across tree boundaries
|
|
92
|
+
|
|
93
|
+
Every read goes through context resolution. The signal (and Observable)
|
|
94
|
+
returned by the getter is the *currently resolved* instance. Stash a
|
|
95
|
+
reference to `cart.signal` and the host later moves into a different
|
|
96
|
+
`<schmancy-context>` subtree, and your reference lags.
|
|
97
|
+
|
|
98
|
+
```ts
|
|
99
|
+
// ✗ Don't
|
|
100
|
+
const sig = cart.signal
|
|
101
|
+
class Foo extends $LitElement() {
|
|
102
|
+
render() { return html`${sig.get().n}` } // never re-resolves
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// ✓ Do
|
|
106
|
+
class Foo extends $LitElement() {
|
|
107
|
+
render() { return html`${cart.value.n}` } // resolves fresh each render
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Don't expect persistence per subtree
|
|
112
|
+
|
|
113
|
+
Isolated copies are memory-backed. If your scoping use case requires
|
|
114
|
+
persisting per-subtree state across reloads, that is a different design
|
|
115
|
+
— derive a fresh `state()` per logical scope (with a unique namespace)
|
|
116
|
+
and use the persistent backend on that.
|
|
117
|
+
|
|
118
|
+
## Implementation primer (for contributors)
|
|
119
|
+
|
|
120
|
+
- `state/active-host.ts` — `_activeHost` Variable (stack) +
|
|
121
|
+
one-time `Promise.prototype.then` patch + 4-tier `resolveActiveHost`
|
|
122
|
+
fallback. ~120 lines. Hand-rolled because no official, supported
|
|
123
|
+
TC39 AsyncContext.Variable polyfill exists today; the patch
|
|
124
|
+
decommissions cleanly when one ships.
|
|
125
|
+
- `state/schmancy-context.ts` — the element. One `ContextProvider`
|
|
126
|
+
(`@lit/context`) per state in `provides`. Destroys on disconnect.
|
|
127
|
+
- `state/index.ts` — every read (`value` / `signal` / `$`) and every
|
|
128
|
+
write on a global instance routes through `resolveContextual`,
|
|
129
|
+
which dispatches a `context-request` event from the active host and
|
|
130
|
+
caches the result per-host-per-namespace in a `WeakMap`. Isolated
|
|
131
|
+
copies are direct-access (skip resolveContextual, no recursion).
|
|
132
|
+
- `mixins/SchmancyElement.ts` — prototype-chain wrap at first
|
|
133
|
+
construction (cached in a `WeakSet` of prototypes); `addEventListener`
|
|
134
|
+
/ `removeEventListener` overrides; wrapped listener cache.
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
// `_`-prefixed identifiers below are an intentional naming convention for
|
|
2
|
+
// module-private infrastructure. `_activeHost` is exported only so the
|
|
3
|
+
// $LitElement mixin can wrap render/lifecycle in `_activeHost.run`; the
|
|
4
|
+
// underscore signals "not part of the public state API."
|
|
5
|
+
/* oxlint-disable no-underscore-dangle */
|
|
6
|
+
|
|
7
|
+
// Active-host tracker for context-aware state resolution.
|
|
8
|
+
//
|
|
9
|
+
// Polyfills the TC39 `AsyncContext.Variable` propagation primitive using a
|
|
10
|
+
// stack + a one-time `Promise.prototype.then` patch. The stack value carries
|
|
11
|
+
// across `await`, `queueMicrotask`, RxJS subscription callbacks, and any
|
|
12
|
+
// other code path that ultimately routes through `Promise.then`. This is the
|
|
13
|
+
// same capture-and-restore technique zone.js, async-hooks, and the various
|
|
14
|
+
// AsyncContext userland polyfills use.
|
|
15
|
+
//
|
|
16
|
+
// Why we own this:
|
|
17
|
+
// - The TC39 proposal is at stage 2; no official polyfill ships from TC39.
|
|
18
|
+
// - The `async-context@1.0.0` package on npm is unrelated (a 2014 Node
|
|
19
|
+
// callback helper), and the available userland polyfills either depend
|
|
20
|
+
// on zone.js (~50 KB) or are Node-only / hobby quality.
|
|
21
|
+
// - The patch surface is ~30 lines, idempotent, preserves Promise
|
|
22
|
+
// semantics (delegates to the original `then`, so `Symbol.species` and
|
|
23
|
+
// subclassing work unchanged), and decommissions cleanly the day a real
|
|
24
|
+
// polyfill or native AsyncContext lands (drop the file, swap the
|
|
25
|
+
// `_activeHost` export for the standard primitive).
|
|
26
|
+
//
|
|
27
|
+
// Known limitation — native await on a native Promise: V8's await
|
|
28
|
+
// optimization (since 7.x) skips the spec-prescribed
|
|
29
|
+
// `Promise.resolve(x).then(continuation)` step, so userland `then`
|
|
30
|
+
// patches don't intercept the resumption. Class methods that mutate
|
|
31
|
+
// state across an `await` boundary will fall back to the
|
|
32
|
+
// module-scoped global, not the active-host's isolated copy. To
|
|
33
|
+
// preserve the host across awaits, either keep the mutation in the
|
|
34
|
+
// synchronous prelude before the first `await`, or explicitly chain
|
|
35
|
+
// with `.then()` (which still routes through the patched method).
|
|
36
|
+
// A real fix requires either a build-time async-function transform
|
|
37
|
+
// or native AsyncContext.Variable in the runtime.
|
|
38
|
+
//
|
|
39
|
+
// resolveActiveHost() fallback chain:
|
|
40
|
+
// 1. Stack value set by `_activeHost.run(host, fn)` — covers render(),
|
|
41
|
+
// Lit lifecycle methods, and class-method handlers (all wrapped by
|
|
42
|
+
// SchmancyElement's prototype-chain wrap).
|
|
43
|
+
// 2. The closest `<schmancy-context>` whose subtree currently has an
|
|
44
|
+
// in-flight DOM event. The element installs capture-phase listeners
|
|
45
|
+
// that publish itself as the event-host while the synchronous
|
|
46
|
+
// handler chain runs; the slot clears via microtask. Covers
|
|
47
|
+
// template-bound inline arrow handlers attached to descendants.
|
|
48
|
+
// 3. document.activeElement — keyboard handlers in focus.
|
|
49
|
+
// 4. undefined → caller falls back to the module-scoped global instance.
|
|
50
|
+
|
|
51
|
+
// Singleton across any number of schmancy module copies (source + dist, ESM
|
|
52
|
+
// + CJS, hoisted vs. nested node_modules) via the runtime-global symbol
|
|
53
|
+
// registry. The first copy to load creates the slot; later copies reuse it.
|
|
54
|
+
// Without this, two stacks → mixins push to one, state reads from the other,
|
|
55
|
+
// and active-host context is lost across the boundary.
|
|
56
|
+
const STACK_KEY = Symbol.for('schmancy.state.activeHost.stack')
|
|
57
|
+
type StackSlot = { stack: Array<HTMLElement | undefined> }
|
|
58
|
+
const _g = globalThis as { [STACK_KEY]?: StackSlot }
|
|
59
|
+
_g[STACK_KEY] ??= { stack: [undefined] }
|
|
60
|
+
const _stack = _g[STACK_KEY].stack
|
|
61
|
+
|
|
62
|
+
// One-time Promise.prototype.then patch at module init. Each .then() call
|
|
63
|
+
// captures the stack head at chain time; firing the callback restores that
|
|
64
|
+
// captured value for the duration of the callback. The guard property
|
|
65
|
+
// prevents double-patching across HMR / duplicate module loads.
|
|
66
|
+
declare global {
|
|
67
|
+
interface Promise<T> {
|
|
68
|
+
// Marker symbol so we can detect (and skip) re-patching.
|
|
69
|
+
readonly __schmancyActiveHostPatched?: true
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Patching Promise.prototype is the entire mechanism this module exists to
|
|
74
|
+
// provide — the lint rules below intentionally do not apply.
|
|
75
|
+
/* oxlint-disable no-extend-native, unicorn/no-thenable */
|
|
76
|
+
if (typeof Promise !== 'undefined' && !('__schmancyActiveHostPatched' in Promise.prototype)) {
|
|
77
|
+
Object.defineProperty(Promise.prototype, '__schmancyActiveHostPatched', {
|
|
78
|
+
value: true,
|
|
79
|
+
configurable: false,
|
|
80
|
+
enumerable: false,
|
|
81
|
+
writable: false,
|
|
82
|
+
})
|
|
83
|
+
const _origThen = Promise.prototype.then
|
|
84
|
+
// Replace with our wrapper. We delegate to the original `then` via
|
|
85
|
+
// `_origThen.call(this, …)` so Promise subclassing / Symbol.species behave
|
|
86
|
+
// exactly as before — the only added work is the stack push/pop around
|
|
87
|
+
// each user callback.
|
|
88
|
+
Promise.prototype.then = function schmancyThen<T, R1, R2>(
|
|
89
|
+
this: Promise<T>,
|
|
90
|
+
onfulfilled?: ((value: T) => R1 | PromiseLike<R1>) | null,
|
|
91
|
+
onrejected?: ((reason: unknown) => R2 | PromiseLike<R2>) | null,
|
|
92
|
+
): Promise<R1 | R2> {
|
|
93
|
+
const captured = _stack[_stack.length - 1]
|
|
94
|
+
const wrapFulfilled = onfulfilled
|
|
95
|
+
? (v: T): R1 | PromiseLike<R1> => {
|
|
96
|
+
_stack.push(captured)
|
|
97
|
+
try {
|
|
98
|
+
return onfulfilled(v)
|
|
99
|
+
} finally {
|
|
100
|
+
_stack.pop()
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
: onfulfilled
|
|
104
|
+
const wrapRejected = onrejected
|
|
105
|
+
? (r: unknown): R2 | PromiseLike<R2> => {
|
|
106
|
+
_stack.push(captured)
|
|
107
|
+
try {
|
|
108
|
+
return onrejected(r)
|
|
109
|
+
} finally {
|
|
110
|
+
_stack.pop()
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
: onrejected
|
|
114
|
+
return _origThen.call(this, wrapFulfilled, wrapRejected) as Promise<R1 | R2>
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/* oxlint-enable no-extend-native, unicorn/no-thenable */
|
|
118
|
+
|
|
119
|
+
export const _activeHost = {
|
|
120
|
+
/** Run `fn` with `host` as the active host for the duration of `fn` and
|
|
121
|
+
* any awaits / microtasks / Promise chains that descend from it. */
|
|
122
|
+
run<R>(host: HTMLElement | undefined, fn: () => R): R {
|
|
123
|
+
_stack.push(host)
|
|
124
|
+
try {
|
|
125
|
+
return fn()
|
|
126
|
+
} finally {
|
|
127
|
+
_stack.pop()
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
/** The current active host, or undefined if no `run()` is on the stack. */
|
|
131
|
+
get(): HTMLElement | undefined {
|
|
132
|
+
return _stack[_stack.length - 1]
|
|
133
|
+
},
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Tier 2 of the resolveActiveHost() fallback chain. A `<schmancy-context>`
|
|
137
|
+
// publishes itself here from a capture-phase event listener attached to
|
|
138
|
+
// itself; the slot clears in the next microtask, after the synchronous
|
|
139
|
+
// event-handler chain has run. `window.event` is unreliable across both
|
|
140
|
+
// engines and time (it can outlive its event — a stale `message` event
|
|
141
|
+
// from postMessage can leak BODY for arbitrary later resolution calls), so
|
|
142
|
+
// we own this slot rather than read the legacy global.
|
|
143
|
+
//
|
|
144
|
+
// Singleton across module copies for the same reason as `_stack` above.
|
|
145
|
+
const EVENT_HOST_KEY = Symbol.for('schmancy.state.activeHost.eventHost')
|
|
146
|
+
type EventHostSlot = { host: HTMLElement | undefined; scheduled: boolean }
|
|
147
|
+
const _eventHostSlot: EventHostSlot =
|
|
148
|
+
((globalThis as { [EVENT_HOST_KEY]?: EventHostSlot })[EVENT_HOST_KEY] ??= {
|
|
149
|
+
host: undefined,
|
|
150
|
+
scheduled: false,
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
/** Publish `host` as the active event-host. The slot self-clears at the
|
|
154
|
+
* end of the current microtask checkpoint — long enough for the entire
|
|
155
|
+
* synchronous event-handler chain to read it, short enough that no
|
|
156
|
+
* later, unrelated microtask sees a stale value. */
|
|
157
|
+
export function _publishEventHost(host: HTMLElement): void {
|
|
158
|
+
_eventHostSlot.host = host
|
|
159
|
+
if (_eventHostSlot.scheduled) return
|
|
160
|
+
_eventHostSlot.scheduled = true
|
|
161
|
+
queueMicrotask(() => {
|
|
162
|
+
_eventHostSlot.scheduled = false
|
|
163
|
+
_eventHostSlot.host = undefined
|
|
164
|
+
})
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export function resolveActiveHost(): HTMLElement | undefined {
|
|
168
|
+
// 1. Stack (set by _activeHost.run).
|
|
169
|
+
const fromStack = _activeHost.get()
|
|
170
|
+
if (fromStack !== undefined) return fromStack
|
|
171
|
+
|
|
172
|
+
// 2. Closest <schmancy-context> with an in-flight event in its subtree.
|
|
173
|
+
if (_eventHostSlot.host !== undefined) return _eventHostSlot.host
|
|
174
|
+
|
|
175
|
+
// 3. document.activeElement — keyboard / focus handlers.
|
|
176
|
+
if (typeof document !== 'undefined' && document.activeElement instanceof HTMLElement) {
|
|
177
|
+
return document.activeElement
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// 4. undefined — caller falls back to module-scoped.
|
|
181
|
+
return undefined
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** Stable context key for a state namespace. `Symbol.for(...)` so the same
|
|
185
|
+
* namespace string yields the same symbol across module boundaries — the
|
|
186
|
+
* ContextProvider on `<schmancy-context>` and the ContextRequestEvent
|
|
187
|
+
* dispatched by a state read must agree on identity. */
|
|
188
|
+
export function stateContextKey(namespace: string): symbol {
|
|
189
|
+
return Symbol.for(`schmancy.state:${namespace}`)
|
|
190
|
+
}
|