@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
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { css, html,
|
|
1
|
+
import { SchmancyElement } from '@mixins/index'
|
|
2
|
+
import { css, html, type TemplateResult } from 'lit'
|
|
3
3
|
import { customElement, property, query } from 'lit/decorators.js'
|
|
4
4
|
import { when } from 'lit/directives/when.js'
|
|
5
5
|
import { choose } from 'lit/directives/choose.js'
|
|
6
|
+
import { ifDefined } from 'lit/directives/if-defined.js'
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* Internal body component used by the `confirm()` / `prompt()` sugar.
|
|
@@ -16,7 +17,8 @@ import { choose } from 'lit/directives/choose.js'
|
|
|
16
17
|
* callers pass their own component to `show()`.
|
|
17
18
|
*/
|
|
18
19
|
@customElement('schmancy-overlay-prompt-body')
|
|
19
|
-
export class SchmancyOverlayPromptBody extends
|
|
20
|
+
export class SchmancyOverlayPromptBody extends SchmancyElement {
|
|
21
|
+
static styles = [css`
|
|
20
22
|
:host {
|
|
21
23
|
display: block;
|
|
22
24
|
padding: 20px 24px;
|
|
@@ -31,7 +33,8 @@ export class SchmancyOverlayPromptBody extends $LitElement(css`
|
|
|
31
33
|
background: var(--schmancy-sys-color-error, #b3261e);
|
|
32
34
|
color: var(--schmancy-sys-color-on-error, #ffffff);
|
|
33
35
|
}
|
|
34
|
-
`
|
|
36
|
+
`]
|
|
37
|
+
|
|
35
38
|
@property({ type: String }) heading?: string
|
|
36
39
|
@property({ type: String }) subtitle?: string
|
|
37
40
|
@property({ type: String }) message?: string
|
|
@@ -44,7 +47,18 @@ export class SchmancyOverlayPromptBody extends $LitElement(css`
|
|
|
44
47
|
@property({ type: String }) label?: string
|
|
45
48
|
@property({ type: String, attribute: 'default-value' }) defaultValue = ''
|
|
46
49
|
@property({ type: String }) placeholder?: string
|
|
47
|
-
@property({ type: String, attribute: 'input-type' })
|
|
50
|
+
@property({ type: String, attribute: 'input-type' })
|
|
51
|
+
inputType:
|
|
52
|
+
| 'text'
|
|
53
|
+
| 'email'
|
|
54
|
+
| 'password'
|
|
55
|
+
| 'tel'
|
|
56
|
+
| 'url'
|
|
57
|
+
| 'number'
|
|
58
|
+
| 'search'
|
|
59
|
+
| 'date'
|
|
60
|
+
| 'time'
|
|
61
|
+
| 'datetime-local' = 'text'
|
|
48
62
|
@property({ type: String }) pattern?: string
|
|
49
63
|
@property({ type: Boolean }) required = false
|
|
50
64
|
|
|
@@ -107,8 +121,8 @@ export class SchmancyOverlayPromptBody extends $LitElement(css`
|
|
|
107
121
|
<input
|
|
108
122
|
type=${this.inputType}
|
|
109
123
|
.value=${this.defaultValue}
|
|
110
|
-
placeholder=${this.placeholder
|
|
111
|
-
pattern=${this.pattern
|
|
124
|
+
placeholder=${ifDefined(this.placeholder)}
|
|
125
|
+
pattern=${ifDefined(this.pattern)}
|
|
112
126
|
?required=${this.required}
|
|
113
127
|
class="w-full px-3 py-2 rounded-md border border-outline-variant text-base mb-2"
|
|
114
128
|
/>
|
|
@@ -3,24 +3,40 @@ import { filter, fromEvent, merge, Observable, Subject, take, takeUntil, tap } f
|
|
|
3
3
|
/**
|
|
4
4
|
* Swipe-to-dismiss gesture for sheet-layout overlays.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* Pointer-event based — a single pipeline covers touch, mouse, pen, and
|
|
7
|
+
* any future pointer source. Without a visible drag handle, the gesture
|
|
8
|
+
* only starts within the top DRAG_START_TOP_PX band of the surface (a
|
|
9
|
+
* standard pull-to-dismiss convention). Escape + backdrop click cover
|
|
10
|
+
* the non-pointer dismiss paths via the component's modal-tier listeners.
|
|
9
11
|
*
|
|
12
|
+
* RxJS-native (rxjs skill principle 3: every async source is an Observable).
|
|
10
13
|
* Thresholds are policy constants, not magic numbers.
|
|
11
14
|
*/
|
|
12
15
|
|
|
13
|
-
/** Distance
|
|
16
|
+
/** Distance (px) past which the gesture dismisses. */
|
|
14
17
|
export const DISMISS_DISTANCE_PX = 80
|
|
15
|
-
/** Distance
|
|
16
|
-
export const DISMISS_DISTANCE_FRACTION = 0.
|
|
17
|
-
/** Velocity
|
|
18
|
-
export const DISMISS_VELOCITY_PX_PER_MS = 0.
|
|
19
|
-
/** Drag only starts if
|
|
18
|
+
/** Distance as fraction of sheet height past which the gesture dismisses. */
|
|
19
|
+
export const DISMISS_DISTANCE_FRACTION = 0.25 // Vaul's value — feels right.
|
|
20
|
+
/** Velocity (px/ms) past which the gesture dismisses even short of distance. */
|
|
21
|
+
export const DISMISS_VELOCITY_PX_PER_MS = 0.4 // Vaul's value.
|
|
22
|
+
/** Drag only starts if pointerdown is within this top band (unless a drag handle is used). */
|
|
20
23
|
export const DRAG_START_TOP_PX = 40
|
|
21
|
-
/** Snap-back
|
|
24
|
+
/** Snap-back animation duration when gesture doesn't pass threshold. */
|
|
22
25
|
export const SNAP_BACK_MS = 300
|
|
23
26
|
|
|
27
|
+
/**
|
|
28
|
+
* Logarithmic rubber-band damping for upward (negative) drag past the
|
|
29
|
+
* top detent. Pulled from Vaul — `8 * (log(v + 1) - 2)` — diminishing
|
|
30
|
+
* returns that feel physical, unlike the linear × 0.2 this replaces.
|
|
31
|
+
*
|
|
32
|
+
* Applied only to upward motion; downward drag tracks 1:1.
|
|
33
|
+
*/
|
|
34
|
+
export function logDamp(delta: number): number {
|
|
35
|
+
if (delta >= 0) return delta
|
|
36
|
+
const abs = -delta
|
|
37
|
+
return -Math.max(0, 8 * (Math.log(abs + 1) - 2))
|
|
38
|
+
}
|
|
39
|
+
|
|
24
40
|
export interface SwipeInputs {
|
|
25
41
|
/** The surface element to track gestures on. */
|
|
26
42
|
surface: HTMLElement
|
|
@@ -32,13 +48,11 @@ export interface SwipeInputs {
|
|
|
32
48
|
}
|
|
33
49
|
|
|
34
50
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* directly for 1:1 tracking. On release-but-not-dismissed, the surface
|
|
41
|
-
* snaps back via a CSS transition.
|
|
51
|
+
* Emits exactly once when the user commits to dismissing the sheet
|
|
52
|
+
* (distance OR velocity threshold passed). Works for touch, mouse, and
|
|
53
|
+
* pen via the Pointer Events API. During an in-progress drag the
|
|
54
|
+
* surface's `transform` is updated directly for 1:1 tracking. On
|
|
55
|
+
* release-but-not-dismissed, the surface snaps back via a CSS transition.
|
|
42
56
|
*/
|
|
43
57
|
export function swipeToDismiss$(inputs: SwipeInputs): Observable<'dismiss'> {
|
|
44
58
|
const { surface, dragHandle, until$ } = inputs
|
|
@@ -48,62 +62,83 @@ export function swipeToDismiss$(inputs: SwipeInputs): Observable<'dismiss'> {
|
|
|
48
62
|
const stopCurrent$ = new Subject<void>()
|
|
49
63
|
|
|
50
64
|
let dragging = false
|
|
65
|
+
let activePointerId: number | null = null
|
|
51
66
|
let startY = 0
|
|
52
67
|
let startTime = 0
|
|
53
68
|
let currentDelta = 0
|
|
54
69
|
|
|
55
|
-
const
|
|
56
|
-
//
|
|
57
|
-
|
|
58
|
-
|
|
70
|
+
const pointerDown$ = fromEvent<PointerEvent>(dragTarget, 'pointerdown').pipe(
|
|
71
|
+
// Primary button / primary finger only. For touch, isPrimary also
|
|
72
|
+
// covers the pinch-zoom guard (only one finger has isPrimary=true).
|
|
73
|
+
filter((e) => e.isPrimary && (e.pointerType !== 'mouse' || e.button === 0)),
|
|
74
|
+
// Without a dedicated drag handle, require start in the top band.
|
|
59
75
|
filter((e) => {
|
|
60
76
|
if (dragHandle) return true
|
|
61
|
-
const touch = e.touches[0]
|
|
62
77
|
const rect = surface.getBoundingClientRect()
|
|
63
|
-
return
|
|
78
|
+
return e.clientY - rect.top <= DRAG_START_TOP_PX
|
|
64
79
|
}),
|
|
65
80
|
tap((e) => {
|
|
66
81
|
dragging = true
|
|
67
|
-
|
|
82
|
+
activePointerId = e.pointerId
|
|
83
|
+
startY = e.clientY
|
|
68
84
|
startTime = performance.now()
|
|
69
85
|
currentDelta = 0
|
|
70
86
|
surface.style.transition = 'none'
|
|
71
87
|
surface.style.willChange = 'transform'
|
|
88
|
+
// Capture so pointermove fires even if the pointer leaves the element
|
|
89
|
+
// (covers the "drag from handle, move past surface edge" case).
|
|
90
|
+
try {
|
|
91
|
+
;(dragTarget as Element).setPointerCapture?.(e.pointerId)
|
|
92
|
+
} catch {
|
|
93
|
+
// setPointerCapture can throw on detached elements; safe to ignore.
|
|
94
|
+
}
|
|
72
95
|
}),
|
|
73
96
|
)
|
|
74
97
|
|
|
75
|
-
const
|
|
98
|
+
const pointerMove$ = fromEvent<PointerEvent>(dragTarget, 'pointermove').pipe(
|
|
76
99
|
filter(() => dragging),
|
|
77
|
-
filter((e) => e.
|
|
100
|
+
filter((e) => e.pointerId === activePointerId),
|
|
78
101
|
tap((e) => {
|
|
79
|
-
const deltaY = e.
|
|
80
|
-
|
|
81
|
-
currentDelta = deltaY < 0 ? deltaY * 0.2 : deltaY
|
|
102
|
+
const deltaY = e.clientY - startY
|
|
103
|
+
currentDelta = logDamp(deltaY)
|
|
82
104
|
surface.style.transform = `translateY(${currentDelta}px)`
|
|
83
|
-
|
|
105
|
+
// preventDefault is a no-op on default Pointer Events but avoids
|
|
106
|
+
// accidental text selection / page scroll during the drag.
|
|
107
|
+
if (e.cancelable) e.preventDefault()
|
|
84
108
|
}),
|
|
85
109
|
)
|
|
86
110
|
|
|
87
|
-
const
|
|
88
|
-
fromEvent<
|
|
89
|
-
fromEvent<
|
|
111
|
+
const pointerEnd$ = merge(
|
|
112
|
+
fromEvent<PointerEvent>(dragTarget, 'pointerup'),
|
|
113
|
+
fromEvent<PointerEvent>(dragTarget, 'pointercancel'),
|
|
114
|
+
fromEvent<PointerEvent>(dragTarget, 'lostpointercapture'),
|
|
90
115
|
).pipe(
|
|
91
116
|
filter(() => dragging),
|
|
117
|
+
filter((e) => e.pointerId === activePointerId),
|
|
92
118
|
tap(() => {
|
|
93
119
|
dragging = false
|
|
120
|
+
const pointerId = activePointerId
|
|
121
|
+
activePointerId = null
|
|
122
|
+
try {
|
|
123
|
+
if (pointerId !== null) (dragTarget as Element).releasePointerCapture?.(pointerId)
|
|
124
|
+
} catch {
|
|
125
|
+
// same reason as setPointerCapture — ignore.
|
|
126
|
+
}
|
|
127
|
+
|
|
94
128
|
const elapsed = Math.max(1, performance.now() - startTime)
|
|
95
129
|
const velocity = currentDelta / elapsed
|
|
96
130
|
const surfaceHeight = surface.getBoundingClientRect().height
|
|
97
131
|
const distanceThreshold = Math.min(DISMISS_DISTANCE_PX, surfaceHeight * DISMISS_DISTANCE_FRACTION)
|
|
98
132
|
|
|
99
133
|
const shouldDismiss =
|
|
100
|
-
currentDelta > distanceThreshold ||
|
|
134
|
+
currentDelta > distanceThreshold ||
|
|
135
|
+
(currentDelta > 20 && velocity > DISMISS_VELOCITY_PX_PER_MS)
|
|
101
136
|
|
|
102
137
|
surface.style.willChange = ''
|
|
103
138
|
|
|
104
139
|
if (shouldDismiss) {
|
|
105
140
|
// Finish translate off-screen for visual continuity with the dismiss
|
|
106
|
-
// animation; the caller's teardown will
|
|
141
|
+
// animation; the caller's teardown will unmount.
|
|
107
142
|
surface.style.transition = `transform ${SNAP_BACK_MS}ms cubic-bezier(0.16, 1, 0.3, 1)`
|
|
108
143
|
surface.style.transform = 'translateY(100%)'
|
|
109
144
|
subscriber.next('dismiss')
|
|
@@ -116,7 +151,7 @@ export function swipeToDismiss$(inputs: SwipeInputs): Observable<'dismiss'> {
|
|
|
116
151
|
}),
|
|
117
152
|
)
|
|
118
153
|
|
|
119
|
-
merge(
|
|
154
|
+
merge(pointerDown$, pointerMove$, pointerEnd$)
|
|
120
155
|
.pipe(takeUntil(merge(stopCurrent$, until$)))
|
|
121
156
|
.subscribe()
|
|
122
157
|
|
|
@@ -129,3 +164,4 @@ export function swipeToDismiss$(inputs: SwipeInputs): Observable<'dismiss'> {
|
|
|
129
164
|
}
|
|
130
165
|
}).pipe(take(1))
|
|
131
166
|
}
|
|
167
|
+
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Anchor, OverlayLayout } from './overlay.types'
|
|
1
|
+
import type { Anchor, OverlayLayout, VirtualAnchor } from './overlay.types'
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Layout dispatch engine — pure function of (anchor, content, viewport).
|
|
@@ -74,3 +74,105 @@ export function readViewport(): LayoutInputs['viewport'] {
|
|
|
74
74
|
isCoarsePointer: window.matchMedia('(pointer: coarse)').matches,
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Resolved reference the positioning strategies consume.
|
|
80
|
+
*
|
|
81
|
+
* `el` is populated when the anchor is an HTMLElement — the Popover API
|
|
82
|
+
* tier uses it directly via the `anchor=<id>` attribute, and Tier 1 / CSS
|
|
83
|
+
* Anchor Positioning sets `element.style.anchorName` on it.
|
|
84
|
+
*
|
|
85
|
+
* `virtual` is populated for point/rect/TouchEvent anchors — Floating UI
|
|
86
|
+
* accepts any object exposing `getBoundingClientRect()` as a virtual
|
|
87
|
+
* reference. The Popover API path cannot use virtual references, so a
|
|
88
|
+
* caller passing a point / DOMRect / event forces Tier 3 (or Tier 2 with
|
|
89
|
+
* Floating UI, not CSS Anchor Positioning).
|
|
90
|
+
*/
|
|
91
|
+
export interface ResolvedAnchor {
|
|
92
|
+
el?: HTMLElement
|
|
93
|
+
virtual?: VirtualAnchor
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Normalise an `Anchor` input into the shape the positioning strategies
|
|
98
|
+
* accept. One function, one decision: element wins if present; otherwise
|
|
99
|
+
* synthesize a zero-size virtual reference at the anchor's point.
|
|
100
|
+
*
|
|
101
|
+
* Called by the overlay element during `open()` before dispatching to
|
|
102
|
+
* `pickPositioner(resolved)`.
|
|
103
|
+
*/
|
|
104
|
+
export function resolveAnchorRef(anchor: Anchor | undefined): ResolvedAnchor | undefined {
|
|
105
|
+
if (!anchor) return undefined
|
|
106
|
+
|
|
107
|
+
// HTMLElement — native element reference.
|
|
108
|
+
if (typeof HTMLElement !== 'undefined' && anchor instanceof HTMLElement) {
|
|
109
|
+
return { el: anchor }
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Any other object with getBoundingClientRect — treat as virtual.
|
|
113
|
+
if (typeof (anchor as { getBoundingClientRect?: unknown }).getBoundingClientRect === 'function') {
|
|
114
|
+
return {
|
|
115
|
+
virtual: {
|
|
116
|
+
getBoundingClientRect: () => (anchor as { getBoundingClientRect(): DOMRect }).getBoundingClientRect(),
|
|
117
|
+
},
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// DOMRect — fixed rect; synthesize a virtual that returns it verbatim.
|
|
122
|
+
if (
|
|
123
|
+
typeof (anchor as DOMRect).width === 'number' &&
|
|
124
|
+
typeof (anchor as DOMRect).height === 'number' &&
|
|
125
|
+
typeof (anchor as DOMRect).left === 'number' &&
|
|
126
|
+
typeof (anchor as DOMRect).top === 'number'
|
|
127
|
+
) {
|
|
128
|
+
const rect = anchor as DOMRect
|
|
129
|
+
return {
|
|
130
|
+
virtual: {
|
|
131
|
+
getBoundingClientRect: () => rect,
|
|
132
|
+
},
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// MouseEvent / PointerEvent — zero-size rect at click point.
|
|
137
|
+
if (typeof (anchor as MouseEvent).clientX === 'number' && typeof (anchor as MouseEvent).clientY === 'number') {
|
|
138
|
+
const e = anchor as MouseEvent
|
|
139
|
+
const rect = makePointRect(e.clientX, e.clientY)
|
|
140
|
+
return { virtual: { getBoundingClientRect: () => rect } }
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// TouchEvent — zero-size rect at first touch point.
|
|
144
|
+
if (
|
|
145
|
+
typeof (anchor as TouchEvent).touches !== 'undefined' &&
|
|
146
|
+
(anchor as TouchEvent).touches.length > 0
|
|
147
|
+
) {
|
|
148
|
+
const t = (anchor as TouchEvent).touches[0]
|
|
149
|
+
const rect = makePointRect(t.clientX, t.clientY)
|
|
150
|
+
return { virtual: { getBoundingClientRect: () => rect } }
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// { x, y } point — zero-size rect at coords.
|
|
154
|
+
const pt = anchor as { x: number; y: number }
|
|
155
|
+
const rect = makePointRect(pt.x, pt.y)
|
|
156
|
+
return { virtual: { getBoundingClientRect: () => rect } }
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Construct a DOMRect-compatible object for a zero-width / zero-height
|
|
161
|
+
* point. Avoids `new DOMRect(...)` which isn't constructable across all
|
|
162
|
+
* lib.dom.d.ts vintages.
|
|
163
|
+
*/
|
|
164
|
+
function makePointRect(x: number, y: number): DOMRect {
|
|
165
|
+
return {
|
|
166
|
+
x,
|
|
167
|
+
y,
|
|
168
|
+
width: 0,
|
|
169
|
+
height: 0,
|
|
170
|
+
left: x,
|
|
171
|
+
right: x,
|
|
172
|
+
top: y,
|
|
173
|
+
bottom: y,
|
|
174
|
+
toJSON() {
|
|
175
|
+
return { x, y, width: 0, height: 0, left: x, right: x, top: y, bottom: y }
|
|
176
|
+
},
|
|
177
|
+
}
|
|
178
|
+
}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import {
|
|
2
|
+
autoUpdate,
|
|
3
|
+
computePosition,
|
|
4
|
+
flip,
|
|
5
|
+
offset,
|
|
6
|
+
shift,
|
|
7
|
+
size,
|
|
8
|
+
type Placement,
|
|
9
|
+
} from '@floating-ui/dom'
|
|
10
|
+
import { Observable } from 'rxjs'
|
|
11
|
+
import { ANCHOR_FIT_PADDING_PX, type ResolvedAnchor } from './overlay.layout'
|
|
12
|
+
import type { OverlayPlacement, OverlayTier } from './overlay.types'
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Three-tier positioning ladder for anchored overlays. Public API of the
|
|
16
|
+
* overlay doesn't change based on the tier — the strategy is picked
|
|
17
|
+
* internally by feature-detection.
|
|
18
|
+
*
|
|
19
|
+
* Tier 1 — CSS Anchor Positioning (Popover + `anchor-name` / `position-anchor`)
|
|
20
|
+
* Zero-JS position tracking. Chromium-only today.
|
|
21
|
+
*
|
|
22
|
+
* Tier 2 — Popover API + Floating UI
|
|
23
|
+
* Native top-layer + light-dismiss + Esc from `popover="auto"`, Floating
|
|
24
|
+
* UI middleware for the position math. Safari 17+, Chrome 114+, Firefox 125+.
|
|
25
|
+
*
|
|
26
|
+
* Tier 3 — Floating UI only
|
|
27
|
+
* Fallback for browsers without the Popover API. Caller provides manual
|
|
28
|
+
* backdrop + click-outside + Esc wiring.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Feature-detection snapshot captured at module load. Frozen so consumers
|
|
33
|
+
* can safely destructure and compare.
|
|
34
|
+
*/
|
|
35
|
+
export const CAPS = Object.freeze({
|
|
36
|
+
popover:
|
|
37
|
+
typeof HTMLElement !== 'undefined' &&
|
|
38
|
+
'popover' in HTMLElement.prototype &&
|
|
39
|
+
typeof (HTMLElement.prototype as unknown as { showPopover?: () => void }).showPopover === 'function',
|
|
40
|
+
cssAnchor:
|
|
41
|
+
typeof CSS !== 'undefined' &&
|
|
42
|
+
typeof CSS.supports === 'function' &&
|
|
43
|
+
CSS.supports('anchor-name: --x'),
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Pick the positioning tier for an anchor.
|
|
48
|
+
*
|
|
49
|
+
* CSS Anchor Positioning (Tier 1) requires a real element anchor — you
|
|
50
|
+
* can't point `anchor-name` at a DOMRect or a coord. A point/rect anchor
|
|
51
|
+
* forces Tier 2 (or Tier 3 if popover isn't supported).
|
|
52
|
+
*/
|
|
53
|
+
export function pickPositioner(anchor: ResolvedAnchor): OverlayTier {
|
|
54
|
+
if (CAPS.popover && CAPS.cssAnchor && anchor.el) return 'css-anchor'
|
|
55
|
+
if (CAPS.popover) return 'popover-fui'
|
|
56
|
+
return 'fui-only'
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* ======================================================================= *
|
|
60
|
+
* Tier 1 — Popover API + CSS Anchor *
|
|
61
|
+
* ======================================================================= */
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Set up CSS Anchor Positioning. Assigns a unique `anchor-name` to the
|
|
65
|
+
* anchor element and injects a stylesheet into the shadow root that
|
|
66
|
+
* positions the surface relative to it. No JS running per frame.
|
|
67
|
+
*
|
|
68
|
+
* Returns a cleanup function that removes the injected styles and the
|
|
69
|
+
* anchor-name from the anchor element.
|
|
70
|
+
*/
|
|
71
|
+
export function positionCSSAnchor(
|
|
72
|
+
surface: HTMLElement,
|
|
73
|
+
anchor: ResolvedAnchor,
|
|
74
|
+
shadowRoot: ShadowRoot,
|
|
75
|
+
opts: { id: string; placement?: OverlayPlacement } = { id: '' },
|
|
76
|
+
): () => void {
|
|
77
|
+
if (!anchor.el) {
|
|
78
|
+
throw new Error('positionCSSAnchor requires an element anchor')
|
|
79
|
+
}
|
|
80
|
+
const anchorEl = anchor.el
|
|
81
|
+
const anchorName = `--ov-${opts.id || Math.random().toString(36).slice(2, 10)}`
|
|
82
|
+
const placement = opts.placement ?? 'bottom-start'
|
|
83
|
+
|
|
84
|
+
// Save any prior anchor-name so we can restore it on cleanup.
|
|
85
|
+
const priorAnchorName = anchorEl.style.getPropertyValue('anchor-name')
|
|
86
|
+
anchorEl.style.setProperty('anchor-name', anchorName)
|
|
87
|
+
|
|
88
|
+
const sheet = new CSSStyleSheet()
|
|
89
|
+
sheet.replaceSync(`
|
|
90
|
+
${surface.localName}[data-overlay-ref="${opts.id}"] {
|
|
91
|
+
position-anchor: ${anchorName};
|
|
92
|
+
${cssForPlacement(placement)}
|
|
93
|
+
margin: 8px;
|
|
94
|
+
position-try-fallbacks:
|
|
95
|
+
flip-block,
|
|
96
|
+
flip-inline,
|
|
97
|
+
flip-block flip-inline;
|
|
98
|
+
}
|
|
99
|
+
`)
|
|
100
|
+
surface.dataset.overlayRef = opts.id
|
|
101
|
+
const existing = shadowRoot.adoptedStyleSheets
|
|
102
|
+
shadowRoot.adoptedStyleSheets = [...existing, sheet]
|
|
103
|
+
|
|
104
|
+
return () => {
|
|
105
|
+
if (priorAnchorName) {
|
|
106
|
+
anchorEl.style.setProperty('anchor-name', priorAnchorName)
|
|
107
|
+
} else {
|
|
108
|
+
anchorEl.style.removeProperty('anchor-name')
|
|
109
|
+
}
|
|
110
|
+
shadowRoot.adoptedStyleSheets = shadowRoot.adoptedStyleSheets.filter((s) => s !== sheet)
|
|
111
|
+
delete surface.dataset.overlayRef
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function cssForPlacement(p: OverlayPlacement): string {
|
|
116
|
+
// Minimal mapping for the Tier 1 stylesheet. The browser's
|
|
117
|
+
// `position-try-fallbacks` flips when the preferred side doesn't fit,
|
|
118
|
+
// so only the starting side needs to be encoded here.
|
|
119
|
+
switch (p) {
|
|
120
|
+
case 'top':
|
|
121
|
+
case 'top-start':
|
|
122
|
+
return 'bottom: anchor(top); left: anchor(start);'
|
|
123
|
+
case 'top-end':
|
|
124
|
+
return 'bottom: anchor(top); right: anchor(end);'
|
|
125
|
+
case 'bottom':
|
|
126
|
+
case 'bottom-start':
|
|
127
|
+
return 'top: anchor(bottom); left: anchor(start);'
|
|
128
|
+
case 'bottom-end':
|
|
129
|
+
return 'top: anchor(bottom); right: anchor(end);'
|
|
130
|
+
case 'left':
|
|
131
|
+
case 'left-start':
|
|
132
|
+
return 'right: anchor(left); top: anchor(start);'
|
|
133
|
+
case 'left-end':
|
|
134
|
+
return 'right: anchor(left); bottom: anchor(end);'
|
|
135
|
+
case 'right':
|
|
136
|
+
case 'right-start':
|
|
137
|
+
return 'left: anchor(right); top: anchor(start);'
|
|
138
|
+
case 'right-end':
|
|
139
|
+
return 'left: anchor(right); bottom: anchor(end);'
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* ======================================================================= *
|
|
144
|
+
* Tier 2 — Popover API (top-layer only) *
|
|
145
|
+
* ======================================================================= */
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Wire the Popover API lifecycle — the surface gets `popover="auto"` and
|
|
149
|
+
* `showPopover()` is called to promote it into the native top layer. No
|
|
150
|
+
* position math here; the caller pairs this with `positionFloatingUI` for
|
|
151
|
+
* the geometry, since Tier 2 is Popover-for-stacking + Floating UI-for-math.
|
|
152
|
+
*
|
|
153
|
+
* Returns a cleanup function that hides the popover and strips the attr.
|
|
154
|
+
*/
|
|
155
|
+
export function positionPopoverAPI(surface: HTMLElement): () => void {
|
|
156
|
+
if (!CAPS.popover) {
|
|
157
|
+
throw new Error('positionPopoverAPI requires Popover API support')
|
|
158
|
+
}
|
|
159
|
+
surface.setAttribute('popover', 'auto')
|
|
160
|
+
try {
|
|
161
|
+
;(surface as unknown as { showPopover(): void }).showPopover()
|
|
162
|
+
} catch {
|
|
163
|
+
// showPopover can throw if already shown or detached; the component
|
|
164
|
+
// is responsible for calling this on an already-mounted, not-yet-shown
|
|
165
|
+
// surface. Silently swallowing a double-open is fine.
|
|
166
|
+
}
|
|
167
|
+
return () => {
|
|
168
|
+
try {
|
|
169
|
+
;(surface as unknown as { hidePopover?: () => void }).hidePopover?.()
|
|
170
|
+
} catch {
|
|
171
|
+
// already hidden / disconnected — fine.
|
|
172
|
+
}
|
|
173
|
+
surface.removeAttribute('popover')
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* ======================================================================= *
|
|
178
|
+
* Tier 2 / 3 — Floating UI position math *
|
|
179
|
+
* ======================================================================= */
|
|
180
|
+
|
|
181
|
+
export interface FloatingUIOptions {
|
|
182
|
+
/** Preferred placement; Floating UI's `flip` middleware handles falls. */
|
|
183
|
+
placement?: OverlayPlacement
|
|
184
|
+
/** Padding used by `shift` + `size` middleware. Defaults to
|
|
185
|
+
* `ANCHOR_FIT_PADDING_PX` from overlay.layout. */
|
|
186
|
+
padding?: number
|
|
187
|
+
/** Gap between anchor and surface. Default 8px. */
|
|
188
|
+
offsetPx?: number
|
|
189
|
+
/** Whether `autoUpdate` should track element resizes. Default true. */
|
|
190
|
+
track?: boolean
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Floating UI-driven positioning. Returns a cold Observable — subscribe to
|
|
195
|
+
* start positioning, unsubscribe to stop tracking (teardown cancels the
|
|
196
|
+
* `autoUpdate` loop). The caller composes with `takeUntil(this.disconnecting)`:
|
|
197
|
+
*
|
|
198
|
+
* positionFloatingUI(surface, anchor, opts)
|
|
199
|
+
* .pipe(takeUntil(this.disconnecting))
|
|
200
|
+
* .subscribe()
|
|
201
|
+
*
|
|
202
|
+
* Middleware (stack, in order):
|
|
203
|
+
* offset(opts.offsetPx)
|
|
204
|
+
* → flip({ fallbackPlacements: [...] })
|
|
205
|
+
* → shift({ padding: opts.padding })
|
|
206
|
+
* → size({ apply: clamp maxWidth AND maxHeight from availableWidth/Height })
|
|
207
|
+
*
|
|
208
|
+
* `flip` is chosen over `autoPlacement` because element-anchored overlays
|
|
209
|
+
* should respect the trigger's spatial context (menus shouldn't jump
|
|
210
|
+
* sides). Dialog uses `autoPlacement` because it's point-anchored.
|
|
211
|
+
*/
|
|
212
|
+
export function positionFloatingUI(
|
|
213
|
+
surface: HTMLElement,
|
|
214
|
+
anchor: ResolvedAnchor,
|
|
215
|
+
opts: FloatingUIOptions = {},
|
|
216
|
+
): Observable<void> {
|
|
217
|
+
return new Observable<void>((subscriber) => {
|
|
218
|
+
const reference = anchor.el ?? anchor.virtual
|
|
219
|
+
if (!reference) {
|
|
220
|
+
subscriber.error(new Error('positionFloatingUI requires an element or virtual anchor'))
|
|
221
|
+
return
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const placement: Placement = (opts.placement ?? 'bottom-start') as Placement
|
|
225
|
+
const padding = opts.padding ?? ANCHOR_FIT_PADDING_PX
|
|
226
|
+
const offsetPx = opts.offsetPx ?? 8
|
|
227
|
+
|
|
228
|
+
const update = async (): Promise<void> => {
|
|
229
|
+
try {
|
|
230
|
+
const { x, y } = await computePosition(reference, surface, {
|
|
231
|
+
strategy: 'fixed',
|
|
232
|
+
placement,
|
|
233
|
+
middleware: [
|
|
234
|
+
offset(offsetPx),
|
|
235
|
+
flip({ padding, fallbackPlacements: defaultFallbacks(placement) }),
|
|
236
|
+
shift({ padding }),
|
|
237
|
+
size({
|
|
238
|
+
padding,
|
|
239
|
+
apply({ availableWidth, availableHeight, elements }) {
|
|
240
|
+
elements.floating.style.maxWidth = `${Math.max(0, availableWidth)}px`
|
|
241
|
+
elements.floating.style.maxHeight = `${Math.max(0, availableHeight)}px`
|
|
242
|
+
},
|
|
243
|
+
}),
|
|
244
|
+
],
|
|
245
|
+
})
|
|
246
|
+
Object.assign(surface.style, {
|
|
247
|
+
position: 'fixed',
|
|
248
|
+
left: `${Math.round(x)}px`,
|
|
249
|
+
top: `${Math.round(y)}px`,
|
|
250
|
+
transform: 'none',
|
|
251
|
+
})
|
|
252
|
+
subscriber.next()
|
|
253
|
+
} catch (err) {
|
|
254
|
+
subscriber.error(err)
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const cleanup = autoUpdate(reference, surface, update, {
|
|
259
|
+
ancestorScroll: true,
|
|
260
|
+
ancestorResize: true,
|
|
261
|
+
elementResize: opts.track !== false,
|
|
262
|
+
})
|
|
263
|
+
|
|
264
|
+
return () => {
|
|
265
|
+
cleanup()
|
|
266
|
+
}
|
|
267
|
+
})
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function defaultFallbacks(preferred: Placement): Placement[] {
|
|
271
|
+
// Flip to the opposite side first, then try the perpendicular ends.
|
|
272
|
+
// Small, deterministic list — not exhaustive.
|
|
273
|
+
switch (preferred) {
|
|
274
|
+
case 'bottom-start':
|
|
275
|
+
return ['top-start', 'bottom-end', 'top-end']
|
|
276
|
+
case 'bottom-end':
|
|
277
|
+
return ['top-end', 'bottom-start', 'top-start']
|
|
278
|
+
case 'top-start':
|
|
279
|
+
return ['bottom-start', 'top-end', 'bottom-end']
|
|
280
|
+
case 'top-end':
|
|
281
|
+
return ['bottom-end', 'top-start', 'bottom-start']
|
|
282
|
+
case 'left-start':
|
|
283
|
+
return ['right-start', 'left-end', 'right-end']
|
|
284
|
+
case 'left-end':
|
|
285
|
+
return ['right-end', 'left-start', 'right-start']
|
|
286
|
+
case 'right-start':
|
|
287
|
+
return ['left-start', 'right-end', 'left-end']
|
|
288
|
+
case 'right-end':
|
|
289
|
+
return ['left-end', 'right-start', 'left-start']
|
|
290
|
+
case 'top':
|
|
291
|
+
return ['bottom', 'left', 'right']
|
|
292
|
+
case 'bottom':
|
|
293
|
+
return ['top', 'left', 'right']
|
|
294
|
+
case 'left':
|
|
295
|
+
return ['right', 'top', 'bottom']
|
|
296
|
+
case 'right':
|
|
297
|
+
return ['left', 'top', 'bottom']
|
|
298
|
+
default:
|
|
299
|
+
return ['top-start', 'bottom-end']
|
|
300
|
+
}
|
|
301
|
+
}
|