@mhmo91/schmancy 0.10.24 → 0.10.25
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/dist/agent/{overlay.confirm-body-CvdVfCnN.js → overlay.confirm-body-DozUyDYx.js} +242 -242
- package/dist/agent/{overlay.confirm-body-CvdVfCnN.js.map → overlay.confirm-body-DozUyDYx.js.map} +1 -1
- package/dist/agent/schmancy.agent.js +5658 -2927
- package/dist/agent/schmancy.agent.js.map +1 -1
- package/dist/{area-A_oUP4P1.js → area-1EG1LrkX.js} +1 -1
- package/dist/{area-A_oUP4P1.js.map → area-1EG1LrkX.js.map} +1 -1
- package/dist/{area-BuqdaUpQ.cjs → area-DrVE5pXW.cjs} +1 -1
- package/dist/{area-BuqdaUpQ.cjs.map → area-DrVE5pXW.cjs.map} +1 -1
- package/dist/area.cjs +1 -1
- package/dist/area.js +1 -1
- package/dist/{autocomplete-Cy46gJxK.cjs → autocomplete-6pdZxEab.cjs} +1 -1
- package/dist/{autocomplete-Cy46gJxK.cjs.map → autocomplete-6pdZxEab.cjs.map} +1 -1
- package/dist/{autocomplete-BoCWO26L.js → autocomplete-nrIcCilw.js} +2 -2
- package/dist/{autocomplete-BoCWO26L.js.map → autocomplete-nrIcCilw.js.map} +1 -1
- package/dist/autocomplete.cjs +1 -1
- package/dist/autocomplete.js +1 -1
- package/dist/avatar.cjs +2 -2
- package/dist/avatar.cjs.map +1 -1
- package/dist/avatar.js +3 -3
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/{boat-B0h5fuAA.js → boat--fLgbDAE.js} +3 -3
- package/dist/{boat-B0h5fuAA.js.map → boat--fLgbDAE.js.map} +1 -1
- package/dist/{boat-RRtBhD3x.cjs → boat-BIB-gPqy.cjs} +1 -1
- package/dist/{boat-RRtBhD3x.cjs.map → boat-BIB-gPqy.cjs.map} +1 -1
- package/dist/boat.cjs +1 -1
- package/dist/boat.js +1 -1
- package/dist/breadcrumb.cjs +1 -1
- package/dist/breadcrumb.js +1 -1
- package/dist/{busy-Bn6Pioo8.cjs → busy-DVCIxBVf.cjs} +1 -1
- package/dist/{busy-Bn6Pioo8.cjs.map → busy-DVCIxBVf.cjs.map} +1 -1
- package/dist/{busy-DObY7lfu.js → busy-DshZcVZ4.js} +1 -1
- package/dist/{busy-DObY7lfu.js.map → busy-DshZcVZ4.js.map} +1 -1
- package/dist/busy.cjs +1 -1
- package/dist/busy.js +1 -1
- package/dist/{button-DEi3M2nV.js → button-D9UJ7I6Z.js} +2 -2
- package/dist/{button-DEi3M2nV.js.map → button-D9UJ7I6Z.js.map} +1 -1
- package/dist/{button-XfdPzfZQ.cjs → button-JrTMzwHY.cjs} +1 -1
- package/dist/{button-XfdPzfZQ.cjs.map → button-JrTMzwHY.cjs.map} +1 -1
- package/dist/button.cjs +1 -1
- package/dist/button.js +1 -1
- package/dist/{card-jzUQK0EQ.js → card-BvCFuX3J.js} +2 -2
- package/dist/{card-jzUQK0EQ.js.map → card-BvCFuX3J.js.map} +1 -1
- package/dist/{card-BjUgRzFh.cjs → card-CTotavhH.cjs} +1 -1
- package/dist/{card-BjUgRzFh.cjs.map → card-CTotavhH.cjs.map} +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/{checkbox-rskgUBxQ.cjs → checkbox-By4fFmjt.cjs} +1 -1
- package/dist/{checkbox-rskgUBxQ.cjs.map → checkbox-By4fFmjt.cjs.map} +1 -1
- package/dist/{checkbox-CfCm1vGN.js → checkbox-GPsdCUbs.js} +1 -1
- package/dist/{checkbox-CfCm1vGN.js.map → checkbox-GPsdCUbs.js.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-Dfim_tQv.js → chips-27umqnat.js} +4 -4
- package/dist/{chips-Dfim_tQv.js.map → chips-27umqnat.js.map} +1 -1
- package/dist/{chips-BiNZKu0J.cjs → chips-BZf9sGA8.cjs} +1 -1
- package/dist/{chips-BiNZKu0J.cjs.map → chips-BZf9sGA8.cjs.map} +1 -1
- package/dist/chips.cjs +1 -1
- package/dist/chips.js +2 -2
- package/dist/connectivity.cjs +1 -1
- package/dist/connectivity.js +1 -1
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +1 -1
- package/dist/{cursor-glow-Cs2XLDB9.js → cursor-glow-Ah7VXSj7.js} +1 -1
- package/dist/{cursor-glow-Cs2XLDB9.js.map → cursor-glow-Ah7VXSj7.js.map} +1 -1
- package/dist/{cursor-glow-C8LgCxpI.cjs → cursor-glow-Bulq-38P.cjs} +1 -1
- package/dist/{cursor-glow-C8LgCxpI.cjs.map → cursor-glow-Bulq-38P.cjs.map} +1 -1
- package/dist/{date-range-em7OwhlK.cjs → date-range-BJnLWCRF.cjs} +1 -1
- package/dist/{date-range-em7OwhlK.cjs.map → date-range-BJnLWCRF.cjs.map} +1 -1
- package/dist/{date-range-inline-DYeqoBIO.cjs → date-range-inline-B6uKUliV.cjs} +1 -1
- package/dist/{date-range-inline-DYeqoBIO.cjs.map → date-range-inline-B6uKUliV.cjs.map} +1 -1
- package/dist/{date-range-inline-BfUL8_vX.js → date-range-inline-BNbbRfIA.js} +1 -1
- package/dist/{date-range-inline-BfUL8_vX.js.map → date-range-inline-BNbbRfIA.js.map} +1 -1
- package/dist/date-range-inline.cjs +1 -1
- package/dist/date-range-inline.js +1 -1
- package/dist/{date-range-B8zoj6Cj.js → date-range-wDVHcr0u.js} +2 -2
- package/dist/{date-range-B8zoj6Cj.js.map → date-range-wDVHcr0u.js.map} +1 -1
- package/dist/date-range.cjs +1 -1
- package/dist/date-range.js +1 -1
- package/dist/delay.cjs +1 -1
- package/dist/delay.js +2 -2
- package/dist/{details-D246xN83.js → details-Ckxpwacj.js} +4 -4
- package/dist/{details-D246xN83.js.map → details-Ckxpwacj.js.map} +1 -1
- package/dist/{details-CNM1tuma.cjs → details-DNrWIes6.cjs} +1 -1
- package/dist/{details-CNM1tuma.cjs.map → details-DNrWIes6.cjs.map} +1 -1
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/directives-BBMqe8x3.js +4082 -0
- package/dist/directives-BBMqe8x3.js.map +1 -0
- package/dist/directives-F15SJZUR.cjs +348 -0
- package/dist/directives-F15SJZUR.cjs.map +1 -0
- package/dist/directives.cjs +1 -99
- package/dist/directives.js +6 -1363
- package/dist/discovery.cjs +1 -1
- package/dist/discovery.js +2 -61
- package/dist/discovery.service-COmbHaoI.js +61 -0
- package/dist/discovery.service-COmbHaoI.js.map +1 -0
- package/dist/discovery.service-CVDXO9rH.cjs +1 -0
- package/dist/discovery.service-CVDXO9rH.cjs.map +1 -0
- package/dist/{divider-CbIp1je9.js → divider-BzcZGo4S.js} +1 -1
- package/dist/{divider-CbIp1je9.js.map → divider-BzcZGo4S.js.map} +1 -1
- package/dist/{divider-DaKsGNW-.cjs → divider-Cde33ivs.cjs} +1 -1
- package/dist/{divider-DaKsGNW-.cjs.map → divider-Cde33ivs.cjs.map} +1 -1
- package/dist/divider.cjs +1 -1
- package/dist/divider.js +1 -1
- package/dist/dropdown.cjs +1 -1
- package/dist/dropdown.js +1 -1
- package/dist/{expand-DRkiO4vw.js → expand-DI144OzN.js} +3 -3
- package/dist/{expand-DRkiO4vw.js.map → expand-DI144OzN.js.map} +1 -1
- package/dist/{expand-CQDm3BF3.cjs → expand-Db4V0jj-.cjs} +1 -1
- package/dist/{expand-CQDm3BF3.cjs.map → expand-Db4V0jj-.cjs.map} +1 -1
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/{float-5O26zNRh.cjs → float--RScf9BZ.cjs} +1 -1
- package/dist/{float-5O26zNRh.cjs.map → float--RScf9BZ.cjs.map} +1 -1
- package/dist/{float-CZtu8FnO.js → float-DIyzy1c2.js} +1 -1
- package/dist/{float-CZtu8FnO.js.map → float-DIyzy1c2.js.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/{form-B90CMeqs.cjs → form-DWNpOsIU.cjs} +1 -1
- package/dist/{form-B90CMeqs.cjs.map → form-DWNpOsIU.cjs.map} +1 -1
- package/dist/{form-CE6Gwz4r.js → form-RtXH8UHQ.js} +8 -8
- package/dist/{form-CE6Gwz4r.js.map → form-RtXH8UHQ.js.map} +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.js +6 -6
- package/dist/handover/agent-runtime-followups.md +1 -1
- package/dist/handover/agent-runtime-v1.md +3 -3
- package/dist/{hashContent-dJrI-9sc.js.map → hashContent-Dgmzc32o.js.map} +1 -1
- package/dist/{hashContent-Ck6laKlk.cjs.map → hashContent-Dh1VzIAb.cjs.map} +1 -1
- package/dist/icons-DXanGDZ_.js +52 -0
- package/dist/icons-DXanGDZ_.js.map +1 -0
- package/dist/icons-bNxlWLlk.cjs +24 -0
- package/dist/icons-bNxlWLlk.cjs.map +1 -0
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-D98csbEo.cjs → iframe-B1XWRaLC.cjs} +1 -1
- package/dist/{iframe-D98csbEo.cjs.map → iframe-B1XWRaLC.cjs.map} +1 -1
- package/dist/{iframe-C3PMj1MD.js → iframe-BlHK0cjy.js} +1 -1
- package/dist/{iframe-C3PMj1MD.js.map → iframe-BlHK0cjy.js.map} +1 -1
- package/dist/iframe.cjs +1 -1
- package/dist/iframe.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +60 -60
- package/dist/{input-_y92Pzon.cjs → input-C-_XU9AX.cjs} +1 -1
- package/dist/{input-_y92Pzon.cjs.map → input-C-_XU9AX.cjs.map} +1 -1
- package/dist/{input-CCOkeeVM.js → input-CiGa8Dkl.js} +1 -1
- package/dist/{input-CCOkeeVM.js.map → input-CiGa8Dkl.js.map} +1 -1
- package/dist/{input-chip-CR66MWml.cjs → input-chip-5aYnuRZ_.cjs} +1 -1
- package/dist/{input-chip-CR66MWml.cjs.map → input-chip-5aYnuRZ_.cjs.map} +1 -1
- package/dist/{input-chip-Bzwr5-XL.js → input-chip-l--zCMGR.js} +1 -1
- package/dist/{input-chip-Bzwr5-XL.js.map → input-chip-l--zCMGR.js.map} +1 -1
- package/dist/input.cjs +1 -1
- package/dist/input.js +1 -1
- package/dist/json.cjs +1 -1
- package/dist/json.js +2 -2
- package/dist/kbd.cjs +1 -1
- package/dist/kbd.js +1 -1
- package/dist/{layout-Dq2oeOTS.js → layout-DSAjo92m.js} +1 -1
- package/dist/{layout-Dq2oeOTS.js.map → layout-DSAjo92m.js.map} +1 -1
- package/dist/{layout-BbCIfIgo.cjs → layout-eXb9wjDh.cjs} +1 -1
- package/dist/{layout-BbCIfIgo.cjs.map → layout-eXb9wjDh.cjs.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +1 -1
- package/dist/{lightbox-Bk3ovcVu.cjs → lightbox-CfRDkeeb.cjs} +2 -2
- package/dist/{lightbox-Bk3ovcVu.cjs.map → lightbox-CfRDkeeb.cjs.map} +1 -1
- package/dist/{lightbox-Dl--fEbP.js → lightbox-D9oiu1Nv.js} +2 -2
- package/dist/{lightbox-Dl--fEbP.js.map → lightbox-D9oiu1Nv.js.map} +1 -1
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/{list-B3WI_Nfs.js → list-BOlRka4v.js} +1 -1
- package/dist/{list-B3WI_Nfs.js.map → list-BOlRka4v.js.map} +1 -1
- package/dist/{list-DWngbP2X.cjs → list-CDJi3_Ut.cjs} +1 -1
- package/dist/{list-DWngbP2X.cjs.map → list-CDJi3_Ut.cjs.map} +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/{magnetic-Bgh7aHHI.cjs → magnetic-D-ph029G.cjs} +1 -1
- package/dist/{magnetic-Bgh7aHHI.cjs.map → magnetic-D-ph029G.cjs.map} +1 -1
- package/dist/{magnetic-DxvoEz8_.js → magnetic-mHXl54Z8.js} +1 -1
- package/dist/{magnetic-DxvoEz8_.js.map → magnetic-mHXl54Z8.js.map} +1 -1
- package/dist/{menu-CdYjxJqm.cjs → menu-CJaDL2cd.cjs} +1 -1
- package/dist/{menu-CdYjxJqm.cjs.map → menu-CJaDL2cd.cjs.map} +1 -1
- package/dist/{menu-IDhVp6zm.js → menu-XyrLmCi_.js} +2 -2
- package/dist/{menu-IDhVp6zm.js.map → menu-XyrLmCi_.js.map} +1 -1
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/mixins-CsYsIJOI.cjs +254 -0
- package/dist/mixins-CsYsIJOI.cjs.map +1 -0
- package/dist/mixins-DySzfmal.js +642 -0
- package/dist/mixins-DySzfmal.js.map +1 -0
- package/dist/mixins.cjs +1 -1
- package/dist/mixins.js +2 -2
- package/dist/nav-drawer.cjs +1 -1
- package/dist/nav-drawer.js +1 -1
- package/dist/navigation-bar.cjs +1 -1
- package/dist/navigation-bar.js +1 -1
- package/dist/navigation-rail.cjs +5 -9
- package/dist/navigation-rail.cjs.map +1 -1
- package/dist/navigation-rail.js +5 -11
- package/dist/navigation-rail.js.map +1 -1
- package/dist/{notification-CllYkvlR.js → notification-CHrEY4u8.js} +2 -2
- package/dist/{notification-CllYkvlR.js.map → notification-CHrEY4u8.js.map} +1 -1
- package/dist/{notification-B3wVUC8l.cjs → notification-DKp4tjaB.cjs} +1 -1
- package/dist/{notification-B3wVUC8l.cjs.map → notification-DKp4tjaB.cjs.map} +1 -1
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/{option-CPOL0nHL.js → option-Vpy4UQ-D.js} +1 -1
- package/dist/{option-CPOL0nHL.js.map → option-Vpy4UQ-D.js.map} +1 -1
- package/dist/{option-cRsdshy8.cjs → option-nRk4MuXH.cjs} +1 -1
- package/dist/{option-cRsdshy8.cjs.map → option-nRk4MuXH.cjs.map} +1 -1
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/{overlay-BnTvnNDc.cjs → overlay-HNrWZ4sB.cjs} +1 -1
- package/dist/{overlay-BnTvnNDc.cjs.map → overlay-HNrWZ4sB.cjs.map} +1 -1
- package/dist/{overlay-DJ-vlwtR.js → overlay-jlkcrt8F.js} +5 -5
- package/dist/{overlay-DJ-vlwtR.js.map → overlay-jlkcrt8F.js.map} +1 -1
- package/dist/{overlay-stack-Dk0xETTy.cjs.map → overlay-stack-Bdr9lOqi.cjs.map} +1 -1
- package/dist/{overlay-stack-BR4iYivO.js.map → overlay-stack-D2rgxQLh.js.map} +1 -1
- package/dist/overlay.cjs +1 -1
- package/dist/{overlay.confirm-body-CQ-FwySO.cjs → overlay.confirm-body-B8dFI3cj.cjs} +1 -1
- package/dist/{overlay.confirm-body-CQ-FwySO.cjs.map → overlay.confirm-body-B8dFI3cj.cjs.map} +1 -1
- package/dist/{overlay.confirm-body-DEb9xw5N.js → overlay.confirm-body-CYShkjI6.js} +1 -1
- package/dist/{overlay.confirm-body-DEb9xw5N.js.map → overlay.confirm-body-CYShkjI6.js.map} +1 -1
- package/dist/overlay.js +3 -3
- package/dist/{overlay.service-CKBCIP2f.cjs → overlay.service-BTPn7Uv7.cjs} +1 -1
- package/dist/{overlay.service-CKBCIP2f.cjs.map → overlay.service-BTPn7Uv7.cjs.map} +1 -1
- package/dist/{overlay.service-XM1YHkTk.js → overlay.service-BqhhxVJp.js} +2 -2
- package/dist/{overlay.service-XM1YHkTk.js.map → overlay.service-BqhhxVJp.js.map} +1 -1
- package/dist/{progress-CnMPp-9a.js → progress-8Bn88GK_.js} +1 -1
- package/dist/{progress-CnMPp-9a.js.map → progress-8Bn88GK_.js.map} +1 -1
- package/dist/{progress-CcfLfHOE.cjs → progress-CAp_4jtq.cjs} +1 -1
- package/dist/{progress-CcfLfHOE.cjs.map → progress-CAp_4jtq.cjs.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/{radio-group-D97hflrE.cjs → radio-group-CN44mAoc.cjs} +1 -1
- package/dist/{radio-group-D97hflrE.cjs.map → radio-group-CN44mAoc.cjs.map} +1 -1
- package/dist/{radio-group-BUJgfQFi.js → radio-group-GNHA7qJR.js} +1 -1
- package/dist/{radio-group-BUJgfQFi.js.map → radio-group-GNHA7qJR.js.map} +1 -1
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.js +1 -1
- package/dist/range.cjs +1 -1
- package/dist/range.js +1 -1
- package/dist/{reduced-motion-D7LqTUMn.js.map → reduced-motion-D-L12p7G.js.map} +1 -1
- package/dist/{reduced-motion-Dzfp_w5x.cjs.map → reduced-motion-Ds-HjMzn.cjs.map} +1 -1
- package/dist/{rxjs-utils-BK8VMe3K.js.map → rxjs-utils-BXpvHN4-.js.map} +1 -1
- package/dist/{rxjs-utils-DhOKenkS.cjs.map → rxjs-utils-CaC-tdot.cjs.map} +1 -1
- package/dist/rxjs-utils.cjs +1 -1
- package/dist/rxjs-utils.js +1 -1
- package/dist/{select-BWEh5nRM.js → select-BnuXRHS4.js} +3 -3
- package/dist/{select-BWEh5nRM.js.map → select-BnuXRHS4.js.map} +1 -1
- package/dist/{select-Cv5Oev6d.cjs → select-DZNns5Pa.cjs} +2 -2
- package/dist/{select-Cv5Oev6d.cjs.map → select-DZNns5Pa.cjs.map} +1 -1
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/skeleton.cjs +1 -1
- package/dist/skeleton.js +1 -1
- package/dist/skills/INDEX.md +2 -1
- package/dist/skills/SKILL.md +33 -23
- package/dist/skills/area.md +5 -4
- package/dist/skills/connectivity.md +1 -3
- package/dist/skills/directives.md +36 -0
- package/dist/skills/icons.md +95 -31
- package/dist/skills/layout.md +36 -53
- package/dist/skills/mixins.md +26 -5
- package/dist/skills/schmancy/INDEX.md +2 -1
- package/dist/skills/schmancy/SKILL.md +33 -23
- package/dist/skills/schmancy/area.md +5 -4
- package/dist/skills/schmancy/connectivity.md +1 -3
- package/dist/skills/schmancy/directives.md +36 -0
- package/dist/skills/schmancy/icons.md +95 -31
- package/dist/skills/schmancy/layout.md +36 -53
- package/dist/skills/schmancy/mixins.md +26 -5
- package/dist/slider.cjs +1 -1
- package/dist/slider.js +1 -1
- package/dist/{splash-screen-B6w7X2z9.js → splash-screen-CUP_elaT.js} +1 -1
- package/dist/{splash-screen-B6w7X2z9.js.map → splash-screen-CUP_elaT.js.map} +1 -1
- package/dist/{splash-screen-DFtxtO2D.cjs → splash-screen-DeoPRrOu.cjs} +1 -1
- package/dist/{splash-screen-DFtxtO2D.cjs.map → splash-screen-DeoPRrOu.cjs.map} +1 -1
- package/dist/splash-screen.cjs +1 -1
- package/dist/splash-screen.js +1 -1
- package/dist/{src-D_NK-vMA.js → src-B1VkLX3l.js} +153 -153
- package/dist/{src-D_NK-vMA.js.map → src-B1VkLX3l.js.map} +1 -1
- package/dist/{src-Asw6A018.cjs → src-DQ4wr0qq.cjs} +13 -13
- package/dist/{src-Asw6A018.cjs.map → src-DQ4wr0qq.cjs.map} +1 -1
- package/dist/steps.cjs +1 -1
- package/dist/steps.js +1 -1
- package/dist/{surface-B94ka2LY.cjs → surface-LkaZQXZn.cjs} +1 -1
- package/dist/{surface-B94ka2LY.cjs.map → surface-LkaZQXZn.cjs.map} +1 -1
- package/dist/{surface-ctBcRGSZ.js → surface-hOvkrjGN.js} +1 -1
- package/dist/{surface-ctBcRGSZ.js.map → surface-hOvkrjGN.js.map} +1 -1
- package/dist/surface.cjs +1 -1
- package/dist/surface.js +1 -1
- package/dist/switch.cjs +1 -1
- package/dist/switch.js +1 -1
- package/dist/table.cjs +1 -1
- package/dist/table.js +1 -1
- package/dist/{tabs-CrMx5z_y.js → tabs-CfwIHhHo.js} +1 -1
- package/dist/{tabs-CrMx5z_y.js.map → tabs-CfwIHhHo.js.map} +1 -1
- package/dist/{tabs-B7kaZIom.cjs → tabs-bplzstz6.cjs} +1 -1
- package/dist/{tabs-B7kaZIom.cjs.map → tabs-bplzstz6.cjs.map} +1 -1
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.js +1 -1
- package/dist/teleport.cjs +1 -1
- package/dist/teleport.js +1 -1
- package/dist/{textarea-DeHFl80i.js → textarea-C1A5xuw9.js} +1 -1
- package/dist/{textarea-DeHFl80i.js.map → textarea-C1A5xuw9.js.map} +1 -1
- package/dist/{textarea-D1crj8JD.cjs → textarea-hrDp5gQq.cjs} +1 -1
- package/dist/{textarea-D1crj8JD.cjs.map → textarea-hrDp5gQq.cjs.map} +1 -1
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-C7Yo33nh.js → theme-BniFOMEo.js} +3 -3
- package/dist/{theme-C7Yo33nh.js.map → theme-BniFOMEo.js.map} +1 -1
- package/dist/{theme-wE2N7Yu9.cjs → theme-DmR6PKV8.cjs} +2 -2
- package/dist/{theme-wE2N7Yu9.cjs.map → theme-DmR6PKV8.cjs.map} +1 -1
- package/dist/{theme-button-Cpc_hs2O.js → theme-button--ruZIb0T.js} +1 -1
- package/dist/{theme-button-Cpc_hs2O.js.map → theme-button--ruZIb0T.js.map} +1 -1
- package/dist/{theme-button-CXSM5We4.cjs → theme-button-a0LgZ7hQ.cjs} +1 -1
- package/dist/{theme-button-CXSM5We4.cjs.map → theme-button-a0LgZ7hQ.cjs.map} +1 -1
- package/dist/theme-button.cjs +1 -1
- package/dist/theme-button.js +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/{theme.interface-D4NeufQA.cjs.map → theme.interface-B5xjEk74.cjs.map} +1 -1
- package/dist/{theme.interface-C2XNgsLB.js.map → theme.interface-DVEw3s8m.js.map} +1 -1
- package/dist/theme.js +4 -4
- package/dist/{theme.service-CSzNkqBB.js.map → theme.service-Bh08uOSJ.js.map} +1 -1
- package/dist/{theme.service-CnFUmUpc.cjs.map → theme.service-Y-e8b331.cjs.map} +1 -1
- package/dist/tree.cjs +1 -1
- package/dist/tree.js +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +1 -1
- package/dist/{utils-Cxg0Kfy5.js → utils-578eFTx4.js} +1 -1
- package/dist/{utils-Cxg0Kfy5.js.map → utils-578eFTx4.js.map} +1 -1
- package/dist/{utils-aCJYAGUr.cjs → utils-CVWUrECT.cjs} +1 -1
- package/dist/{utils-aCJYAGUr.cjs.map → utils-CVWUrECT.cjs.map} +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.js +2 -2
- package/dist/visually-hidden.cjs +1 -1
- package/dist/visually-hidden.js +1 -1
- package/dist/{window-JtkeHoxS.js → window-BT9JecWy.js} +5 -5
- package/dist/{window-JtkeHoxS.js.map → window-BT9JecWy.js.map} +1 -1
- package/dist/{window-Ck_zS4bb.cjs → window-Bp7zWZpu.cjs} +1 -1
- package/dist/{window-Ck_zS4bb.cjs.map → window-Bp7zWZpu.cjs.map} +1 -1
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/package.json +1 -1
- package/skills/schmancy/INDEX.md +2 -1
- package/skills/schmancy/SKILL.md +33 -23
- package/skills/schmancy/area.md +5 -4
- package/skills/schmancy/connectivity.md +1 -3
- package/skills/schmancy/directives.md +36 -0
- package/skills/schmancy/icons.md +95 -31
- package/skills/schmancy/layout.md +36 -53
- package/skills/schmancy/mixins.md +26 -5
- package/src/directives/ai-badge.ts +95 -0
- package/src/directives/art/art.directive.ts +228 -0
- package/src/directives/art/effects/error.ts +192 -0
- package/src/directives/art/effects/funkhaus.ts +121 -0
- package/src/directives/art/effects/howl.ts +203 -0
- package/src/directives/art/effects/samwa.ts +228 -0
- package/src/directives/art/effects/snow.ts +207 -0
- package/src/directives/art/effects/starfield.ts +107 -0
- package/src/directives/art/index.ts +2 -0
- package/src/directives/art/particle-pool.ts +40 -0
- package/src/directives/art/types.ts +129 -0
- package/src/directives/art/utils.ts +35 -0
- package/src/directives/battery.ts +1014 -0
- package/src/directives/beta.ts +44 -0
- package/src/directives/fill.ts +32 -60
- package/src/directives/fyi.ts +551 -0
- package/src/directives/hummingbird.ts +1712 -0
- package/src/directives/index.ts +9 -0
- package/src/directives/missed-punch.ts +407 -0
- package/src/directives/urgent.ts +660 -0
- package/src/directives/working-snake.ts +294 -0
- package/src/icons/icon.ts +53 -30
- package/src/navigation-rail/navigation-rail-item.ts +7 -12
- package/src/navigation-rail/navigation-rail.ts +0 -2
- package/types/mixins/SchmancyElement.d.ts +31 -0
- package/types/src/directives/ai-badge.d.ts +15 -0
- package/types/src/directives/art/art.directive.d.ts +19 -0
- package/types/src/directives/art/effects/error.d.ts +7 -0
- package/types/src/directives/art/effects/funkhaus.d.ts +7 -0
- package/types/src/directives/art/effects/howl.d.ts +7 -0
- package/types/src/directives/art/effects/samwa.d.ts +7 -0
- package/types/src/directives/art/effects/snow.d.ts +7 -0
- package/types/src/directives/art/effects/starfield.d.ts +10 -0
- package/types/src/directives/art/index.d.ts +2 -0
- package/types/src/directives/art/particle-pool.d.ts +16 -0
- package/types/src/directives/art/types.d.ts +126 -0
- package/types/src/directives/art/utils.d.ts +5 -0
- package/types/src/directives/battery.d.ts +96 -0
- package/types/src/directives/beta.d.ts +33 -0
- package/types/src/directives/fill.d.ts +4 -11
- package/types/src/directives/fyi.d.ts +76 -0
- package/types/src/directives/hummingbird.d.ts +180 -0
- package/types/src/directives/index.d.ts +9 -0
- package/types/src/directives/missed-punch.d.ts +28 -0
- package/types/src/directives/urgent.d.ts +88 -0
- package/types/src/directives/working-snake.d.ts +46 -0
- package/types/src/icons/icon.d.ts +22 -0
- package/dist/directives.cjs.map +0 -1
- package/dist/directives.js.map +0 -1
- package/dist/discovery.cjs.map +0 -1
- package/dist/discovery.js.map +0 -1
- package/dist/icons-B7ppo07M.cjs +0 -33
- package/dist/icons-B7ppo07M.cjs.map +0 -1
- package/dist/icons-CGhozJ5v.js +0 -48
- package/dist/icons-CGhozJ5v.js.map +0 -1
- package/dist/mixins-BPUR4Kc4.cjs +0 -254
- package/dist/mixins-BPUR4Kc4.cjs.map +0 -1
- package/dist/mixins-C42OILRS.js +0 -636
- package/dist/mixins-C42OILRS.js.map +0 -1
- package/dist/skills/page.md +0 -84
- package/dist/skills/schmancy/page.md +0 -84
- package/skills/schmancy/page.md +0 -84
- /package/dist/{hashContent-dJrI-9sc.js → hashContent-Dgmzc32o.js} +0 -0
- /package/dist/{hashContent-Ck6laKlk.cjs → hashContent-Dh1VzIAb.cjs} +0 -0
- /package/dist/{overlay-stack-Dk0xETTy.cjs → overlay-stack-Bdr9lOqi.cjs} +0 -0
- /package/dist/{overlay-stack-BR4iYivO.js → overlay-stack-D2rgxQLh.js} +0 -0
- /package/dist/{reduced-motion-D7LqTUMn.js → reduced-motion-D-L12p7G.js} +0 -0
- /package/dist/{reduced-motion-Dzfp_w5x.cjs → reduced-motion-Ds-HjMzn.cjs} +0 -0
- /package/dist/{rxjs-utils-BK8VMe3K.js → rxjs-utils-BXpvHN4-.js} +0 -0
- /package/dist/{rxjs-utils-DhOKenkS.cjs → rxjs-utils-CaC-tdot.cjs} +0 -0
- /package/dist/{theme.interface-D4NeufQA.cjs → theme.interface-B5xjEk74.cjs} +0 -0
- /package/dist/{theme.interface-C2XNgsLB.js → theme.interface-DVEw3s8m.js} +0 -0
- /package/dist/{theme.service-CSzNkqBB.js → theme.service-Bh08uOSJ.js} +0 -0
- /package/dist/{theme.service-CnFUmUpc.cjs → theme.service-Y-e8b331.cjs} +0 -0
package/dist/directives.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"directives.js","names":[],"sources":["../src/directives/animate-text.ts","../src/directives/color.ts","../src/directives/confirm-click.ts","../src/directives/cycle-text.ts","../src/directives/depth-of-field.ts","../src/directives/drag.ts","../src/directives/fill.ts","../src/directives/gravity.ts","../src/directives/intersect.ts","../src/directives/liquid.ts","../src/directives/living-border.ts","../src/directives/long-press.ts","../src/directives/nebula.ts","../src/directives/reveal.ts","../src/directives/ripple.ts","../src/directives/overflow-within.ts"],"sourcesContent":["/**\n * animateText directive - Applies text animations to any element\n *\n * Usage:\n * <span ${animateText({ animation: 'blur-reveal', stagger: 60 })}>Hello world</span>\n * <span ${animateText({ animation: 'cyber-glitch', preset: 'snappy' })}>GLITCH</span>\n *\n * Supports: typewriter, fade-up, word-reveal, blur-reveal, cyber-glitch\n * Presets: 'smooth' (default), 'snappy', 'bouncy', 'gentle'\n * Waits for element visibility (opacity > 0.5) before starting animation.\n * Restores original textContent after animation completes.\n */\nimport { noChange } from 'lit'\nimport { AsyncDirective, directive } from 'lit/async-directive.js'\nimport type { ElementPart } from 'lit/directive.js'\nimport { Subject, interval, timer, fromEvent, combineLatest, from, defer, EMPTY, type Observable } from 'rxjs'\nimport { map, distinctUntilChanged, filter, startWith, take, delay, takeUntil, tap, takeWhile, switchMap, catchError, finalize } from 'rxjs/operators'\nimport {\n\tSPRING_SMOOTH,\n\tSPRING_SNAPPY,\n\tSPRING_BOUNCY,\n\tSPRING_GENTLE,\n\ttype AnimationPreset,\n} from '../utils/animation'\n\nexport type AnimationType = 'typewriter' | 'fade-up' | 'word-reveal' | 'blur-reveal' | 'cyber-glitch'\nexport type AnimationPresetName = 'smooth' | 'snappy' | 'bouncy' | 'gentle'\n\nconst PRESETS: Record<AnimationPresetName, AnimationPreset> = {\n\tsmooth: SPRING_SMOOTH,\n\tsnappy: SPRING_SNAPPY,\n\tbouncy: SPRING_BOUNCY,\n\tgentle: SPRING_GENTLE,\n}\n\nexport interface AnimateTextOptions {\n\tanimation: AnimationType\n\tdelay?: number // ms to wait after becoming visible (default: 0)\n\tduration?: number // animation duration in ms (overrides preset)\n\tstagger?: number // ms between characters/words (default: 50)\n\tpreset?: AnimationPresetName // spring physics preset (default: 'snappy')\n\t/**\n\t * Provide text explicitly instead of reading from element.textContent.\n\t * REQUIRED when the element contains Lit bindings (${...}), because\n\t * animateText replaces innerHTML which destroys Lit's ChildPart markers.\n\t */\n\ttext?: string\n\t/** Re-animate every time the element re-enters the viewport (default: false) */\n\trestart?: boolean\n}\n\nclass AnimateTextDirective extends AsyncDirective {\n\tprivate element: HTMLElement | null = null\n\tprivate originalContent: string = ''\n\tprivate animations: Animation[] = []\n\tprivate disconnecting$ = new Subject<void>()\n\tprivate initialized = false\n\n\trender(_options: AnimateTextOptions) {\n\t\treturn noChange\n\t}\n\n\toverride update(part: ElementPart, [options]: [AnimateTextOptions]) {\n\t\tthis.element = part.element as HTMLElement\n\n\t\t// Initialize only once\n\t\tif (!this.initialized) {\n\t\t\tthis.initialized = true\n\n\t\t\t// Recreate the Subject if it was completed by a previous cleanup()\n\t\t\tif (this.disconnecting$.closed) {\n\t\t\t\tthis.disconnecting$ = new Subject<void>()\n\t\t\t}\n\n\t\t\t// Use explicit text if provided (avoids Lit ChildPart conflicts),\n\t\t\t// otherwise read from the element's existing textContent.\n\t\t\tif (options.text !== undefined) {\n\t\t\t\tthis.originalContent = options.text\n\t\t\t\tthis.element.textContent = options.text\n\t\t\t} else {\n\t\t\t\tthis.originalContent = this.element.textContent || ''\n\t\t\t}\n\n\t\t\tthis.element.style.willChange = 'transform, opacity'\n\n\t\t\t// Start hidden for all animations except typewriter (which reveals char by char)\n\t\t\tif (options.animation === 'typewriter') {\n\t\t\t\tthis.element.textContent = ''\n\t\t\t} else {\n\t\t\t\tthis.element.style.opacity = '0'\n\t\t\t}\n\n\t\t\tthis.initialize(options)\n\t\t}\n\n\t\treturn noChange\n\t}\n\n\toverride disconnected(): void {\n\t\tthis.cleanup()\n\t}\n\n\toverride reconnected(): void {\n\t\t// Re-apply GPU hints if element reconnects\n\t\tif (this.element) {\n\t\t\tthis.element.style.willChange = 'transform, opacity'\n\t\t}\n\t}\n\n\tprivate initialize(options: AnimateTextOptions): void {\n\t\tconst { animation, delay: delayMs = 0, duration, stagger, preset = 'snappy', restart = false } = options\n\n\t\t// Get preset config for duration/easing defaults\n\t\tconst presetConfig = PRESETS[preset]\n\t\tconst actualDuration = duration ?? presetConfig.duration\n\t\tconst actualStagger = stagger ?? (animation === 'cyber-glitch' ? 30 : 50)\n\n\t\tconst visible$ = this.createVisibilityObservable$()\n\n\t\tconst pipeline$ = restart\n\t\t\t? visible$.pipe(\n\t\t\t\tswitchMap(visible =>\n\t\t\t\t\tvisible\n\t\t\t\t\t\t? timer(delayMs).pipe(\n\t\t\t\t\t\t\tswitchMap(() => this.runAnimation$(animation, actualDuration, actualStagger, presetConfig)),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t: defer(() => {\n\t\t\t\t\t\t\tthis.resetToInitial(animation)\n\t\t\t\t\t\t\treturn EMPTY\n\t\t\t\t\t\t})\n\t\t\t\t),\n\t\t\t)\n\t\t\t: visible$.pipe(\n\t\t\t\tfilter(v => v),\n\t\t\t\ttake(1),\n\t\t\t\tdelay(delayMs),\n\t\t\t\tswitchMap(() => this.runAnimation$(animation, actualDuration, actualStagger, presetConfig)),\n\t\t\t)\n\n\t\tpipeline$.pipe(takeUntil(this.disconnecting$)).subscribe()\n\t}\n\n\tprivate cleanup(): void {\n\t\t// Signal disconnection to RxJS pipelines\n\t\tthis.disconnecting$.next()\n\t\tthis.disconnecting$.complete()\n\n\t\t// Cancel all Web Animation API animations\n\t\tthis.cancelAnimations()\n\n\t\t// Restore original content and styles\n\t\tif (this.element) {\n\t\t\tthis.element.textContent = this.originalContent\n\t\t\tthis.element.style.opacity = ''\n\t\t\tthis.element.style.willChange = 'auto'\n\t\t\tthis.element.style.transform = ''\n\t\t\tthis.element.style.filter = ''\n\t\t}\n\n\t\tthis.element = null\n\t\tthis.initialized = false\n\t}\n\n\t/** Cancel all running Web Animation API animations. */\n\tprivate cancelAnimations(): void {\n\t\tthis.animations.forEach(a => a.cancel())\n\t\tthis.animations = []\n\t}\n\n\t/** Cancel running animations and reset element to pre-animation state. */\n\tprivate resetToInitial(animation: AnimationType): void {\n\t\tthis.cancelAnimations()\n\n\t\tif (!this.element) return\n\n\t\tif (animation === 'typewriter') {\n\t\t\tthis.element.textContent = ''\n\t\t} else {\n\t\t\tthis.element.textContent = this.originalContent\n\t\t\tthis.element.style.opacity = '0'\n\t\t}\n\t\tthis.element.style.transform = ''\n\t\tthis.element.style.filter = ''\n\t\tthis.element.style.willChange = 'transform, opacity'\n\t}\n\n\t/**\n\t * Calculate accumulated opacity by walking up DOM tree.\n\t * CSS opacity doesn't inherit as computed value - must multiply ancestors.\n\t * Also handles shadow DOM: when slotted, checks the slot's container opacity.\n\t * NOTE: Skips the element itself since we intentionally set its opacity to 0.\n\t */\n\tprivate getAccumulatedOpacity(): number {\n\t\tif (!this.element) return 0\n\n\t\tlet opacity = 1\n\t\t// Start from parent - skip self since we set element.style.opacity = '0'\n\t\tlet el: HTMLElement | null = this.element.parentElement\n\t\tlet depth = 0\n\n\t\twhile (el && el !== document.body && depth < 10) {\n\t\t\tconst style = window.getComputedStyle(el)\n\t\t\tif (style.visibility === 'hidden' || style.display === 'none') {\n\t\t\t\treturn 0\n\t\t\t}\n\t\t\tconst elOpacity = parseFloat(style.opacity) || 1\n\t\t\tif (elOpacity < 1) {\n\t\t\t\topacity *= elOpacity\n\t\t\t\tif (opacity <= 0.5) return opacity\n\t\t\t}\n\n\t\t\t// Shadow DOM: check slot ancestors (e.g., step-container's internal div)\n\t\t\tif (el.assignedSlot) {\n\t\t\t\tconst slotOpacity = this.getSlotAncestorOpacity(el.assignedSlot)\n\t\t\t\tif (slotOpacity === 0) return 0\n\t\t\t\topacity *= slotOpacity\n\t\t\t}\n\n\t\t\tel = el.parentElement\n\t\t\tdepth++\n\t\t}\n\n\t\treturn opacity\n\t}\n\n\t/**\n\t * Walk up from a slot element through its shadow DOM ancestors.\n\t * Stops when parentElement is null (shadow root boundary).\n\t */\n\tprivate getSlotAncestorOpacity(slot: HTMLSlotElement): number {\n\t\tlet opacity = 1\n\t\tlet el = slot.parentElement\n\n\t\twhile (el) {\n\t\t\tconst style = window.getComputedStyle(el)\n\t\t\tif (style.visibility === 'hidden' || style.display === 'none') {\n\t\t\t\treturn 0\n\t\t\t}\n\t\t\topacity *= parseFloat(style.opacity) || 1\n\t\t\tel = el.parentElement\n\t\t}\n\n\t\treturn opacity\n\t}\n\n\tprivate createVisibilityObservable$() {\n\t\t// Document visibility (tab focused)\n\t\tconst docVisible$ = fromEvent(document, 'visibilitychange').pipe(\n\t\t\tstartWith(null),\n\t\t\tmap(() => document.visibilityState === 'visible'),\n\t\t\tdistinctUntilChanged(),\n\t\t)\n\n\t\t// Direct polling: getBoundingClientRect + accumulated opacity.\n\t\t// More reliable than IntersectionObserver which misses elements inside\n\t\t// animated containers or scroll-snapped layouts (fires only on change,\n\t\t// so a brief out-of-viewport during page-entry transition leaves it stuck false).\n\t\t// For restart:false the subscription is torn down after take(1), so\n\t\t// the interval stops as soon as the animation fires.\n\t\tconst elementVisible$ = interval(200).pipe(\n\t\t\tstartWith(0),\n\t\t\tmap(() => {\n\t\t\t\tif (!this.element) return false\n\t\t\t\tconst rect = this.element.getBoundingClientRect()\n\t\t\t\tconst inViewport =\n\t\t\t\t\trect.width > 0 &&\n\t\t\t\t\trect.height > 0 &&\n\t\t\t\t\trect.top < window.innerHeight &&\n\t\t\t\t\trect.bottom > 0\n\t\t\t\treturn inViewport && this.getAccumulatedOpacity() > 0.5\n\t\t\t}),\n\t\t\tdistinctUntilChanged(),\n\t\t)\n\n\t\treturn combineLatest([elementVisible$, docVisible$]).pipe(\n\t\t\tmap(([el, doc]) => el && doc),\n\t\t\tdistinctUntilChanged(),\n\t\t)\n\t}\n\n\tprivate runAnimation$(animation: AnimationType, duration: number, stagger: number, preset: AnimationPreset): Observable<unknown> {\n\t\tif (!this.element) return EMPTY\n\n\t\tswitch (animation) {\n\t\t\tcase 'fade-up':\n\t\t\t\treturn this.animateFadeUp$(duration, preset)\n\t\t\tcase 'blur-reveal':\n\t\t\t\treturn this.animateBlurReveal$(duration, stagger, preset)\n\t\t\tcase 'word-reveal':\n\t\t\t\treturn this.animateWordReveal$(duration, stagger, preset)\n\t\t\tcase 'cyber-glitch':\n\t\t\t\treturn this.animateCyberGlitch$(duration, stagger, preset)\n\t\t\tcase 'typewriter':\n\t\t\t\treturn this.animateTypewriter$(duration)\n\t\t\tdefault:\n\t\t\t\treturn EMPTY\n\t\t}\n\t}\n\n\tprivate animateFadeUp$(duration: number, preset: AnimationPreset): Observable<unknown> {\n\t\tif (!this.element) return EMPTY\n\n\t\tconst anim = this.element.animate(\n\t\t\t[\n\t\t\t\t{ opacity: 0, transform: 'translateY(30px)' },\n\t\t\t\t{ opacity: 1, transform: 'translateY(0)' },\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration,\n\t\t\t\teasing: preset.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t)\n\n\t\tthis.animations.push(anim)\n\n\t\treturn from(anim.finished).pipe(\n\t\t\ttap(() => {\n\t\t\t\tif (this.element) {\n\t\t\t\t\tthis.element.style.opacity = ''\n\t\t\t\t\tthis.element.style.transform = ''\n\t\t\t\t\tthis.element.style.willChange = 'auto'\n\t\t\t\t}\n\t\t\t}),\n\t\t\tcatchError(() => EMPTY),\n\t\t)\n\t}\n\n\t/**\n\t * Walk childNodes: wrap text nodes as word-spans, preserve element children in place.\n\t * Returns the ordered list of HTMLElements to animate (one per word + one per child element).\n\t * Element children are MOVED (not cloned) to preserve Lit directive bindings.\n\t */\n\tprivate wrapTextNodes(container: HTMLElement): HTMLElement[] {\n\t\tconst targets: HTMLElement[] = []\n\t\tconst fragment = document.createDocumentFragment()\n\n\t\t// Snapshot childNodes since we'll be moving them\n\t\tconst nodes = Array.from(container.childNodes)\n\n\t\tfor (const node of nodes) {\n\t\t\tif (node.nodeType === Node.TEXT_NODE) {\n\t\t\t\tconst text = node.textContent || ''\n\t\t\t\tconst words = text.split(/(\\s+)/) // keep whitespace tokens\n\t\t\t\tfor (const part of words) {\n\t\t\t\t\tif (/^\\s+$/.test(part)) {\n\t\t\t\t\t\tfragment.appendChild(document.createTextNode(part))\n\t\t\t\t\t} else if (part.length > 0) {\n\t\t\t\t\t\tconst span = document.createElement('span')\n\t\t\t\t\t\tspan.textContent = part\n\t\t\t\t\t\tfragment.appendChild(span)\n\t\t\t\t\t\ttargets.push(span)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (node instanceof HTMLElement) {\n\t\t\t\t// Move the original element to preserve Lit directive bindings (cycleText etc.)\n\t\t\t\tfragment.appendChild(node)\n\t\t\t\ttargets.push(node)\n\t\t\t}\n\t\t}\n\n\t\tcontainer.textContent = ''\n\t\tcontainer.appendChild(fragment)\n\t\treturn targets\n\t}\n\n\tprivate animateBlurReveal$(duration: number, stagger: number, preset: AnimationPreset): Observable<unknown> {\n\t\tif (!this.element) return EMPTY\n\n\t\tconst animTargets = this.wrapTextNodes(this.element)\n\n\t\t// Remove outer element opacity so inner targets are visible when they animate\n\t\tthis.element.style.opacity = '1'\n\n\t\tanimTargets.forEach((target, i) => {\n\t\t\ttarget.style.opacity = '0'\n\t\t\ttarget.style.display = 'inline-block'\n\t\t\tconst anim = target.animate(\n\t\t\t\t[\n\t\t\t\t\t{ opacity: 0, filter: 'blur(8px)', transform: 'scale(0.9)' },\n\t\t\t\t\t{ opacity: 1, filter: 'blur(0)', transform: 'scale(1)' },\n\t\t\t\t] as Keyframe[],\n\t\t\t\t{\n\t\t\t\t\tduration,\n\t\t\t\t\teasing: preset.easingFallback,\n\t\t\t\t\tdelay: i * stagger,\n\t\t\t\t\tfill: 'forwards',\n\t\t\t\t},\n\t\t\t)\n\t\t\tthis.animations.push(anim)\n\t\t})\n\n\t\t// Clean up after last animation\n\t\tconst lastAnim = this.animations[this.animations.length - 1]\n\t\tif (!lastAnim) return EMPTY\n\n\t\treturn from(lastAnim.finished).pipe(\n\t\t\ttap(() => {\n\t\t\t\tif (this.element) {\n\t\t\t\t\tthis.element.style.willChange = 'auto'\n\t\t\t\t\tanimTargets.forEach(t => { t.style.willChange = 'auto' })\n\t\t\t\t}\n\t\t\t}),\n\t\t\tcatchError(() => EMPTY),\n\t\t)\n\t}\n\n\tprivate animateWordReveal$(duration: number, stagger: number, preset: AnimationPreset): Observable<unknown> {\n\t\tif (!this.element) return EMPTY\n\n\t\tconst animTargets = this.wrapTextNodes(this.element)\n\n\t\t// Remove outer element opacity so inner targets are visible when they animate\n\t\tthis.element.style.opacity = '1'\n\n\t\tanimTargets.forEach((target, i) => {\n\t\t\ttarget.style.opacity = '0'\n\t\t\ttarget.style.display = 'inline-block'\n\t\t\tconst anim = target.animate(\n\t\t\t\t[\n\t\t\t\t\t{ opacity: 0, transform: 'translateY(20px)' },\n\t\t\t\t\t{ opacity: 1, transform: 'translateY(0)' },\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\tduration,\n\t\t\t\t\teasing: preset.easingFallback,\n\t\t\t\t\tdelay: i * stagger,\n\t\t\t\t\tfill: 'forwards',\n\t\t\t\t},\n\t\t\t)\n\t\t\tthis.animations.push(anim)\n\t\t})\n\n\t\t// Clean up after last animation\n\t\tconst lastAnim = this.animations[this.animations.length - 1]\n\t\tif (!lastAnim) return EMPTY\n\n\t\treturn from(lastAnim.finished).pipe(\n\t\t\ttap(() => {\n\t\t\t\tif (this.element) {\n\t\t\t\t\tthis.element.style.willChange = 'auto'\n\t\t\t\t\tanimTargets.forEach(t => { t.style.willChange = 'auto' })\n\t\t\t\t}\n\t\t\t}),\n\t\t\tcatchError(() => EMPTY),\n\t\t)\n\t}\n\n\t/**\n\t * Cyber-glitch: Futuristic character-by-character reveal with scale + blur\n\t * Each character pops in with overshoot spring physics\n\t */\n\tprivate animateCyberGlitch$(duration: number, stagger: number, preset: AnimationPreset): Observable<unknown> {\n\t\tif (!this.element) return EMPTY\n\n\t\t// Split into individual characters (preserving spaces)\n\t\tconst chars = this.originalContent.split('')\n\t\tconst fragment = document.createDocumentFragment()\n\t\tconst charElements: HTMLElement[] = []\n\n\t\tfor (const char of chars) {\n\t\t\tconst span = document.createElement('span')\n\t\t\tspan.style.display = 'inline-block'\n\t\t\tspan.style.opacity = '0'\n\t\t\tspan.textContent = char === ' ' ? '\\u00A0' : char\n\t\t\tfragment.appendChild(span)\n\t\t\tcharElements.push(span)\n\t\t}\n\n\t\tthis.element.textContent = ''\n\t\tthis.element.appendChild(fragment)\n\n\t\t// Remove outer element opacity so inner spans are visible when they animate\n\t\tthis.element.style.opacity = '1'\n\n\t\tcharElements.forEach((span, i) => {\n\t\t\t// Skip animation for spaces but still include in timing\n\t\t\tif (chars[i] === ' ') {\n\t\t\t\tspan.style.opacity = '1'\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst anim = span.animate(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\topacity: 0,\n\t\t\t\t\t\ttransform: 'translateY(-8px) scale(1.4)',\n\t\t\t\t\t\tfilter: 'blur(4px)',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\ttransform: 'translateY(0) scale(1)',\n\t\t\t\t\t\tfilter: 'blur(0)',\n\t\t\t\t\t},\n\t\t\t\t] as Keyframe[],\n\t\t\t\t{\n\t\t\t\t\tduration,\n\t\t\t\t\teasing: preset.easingFallback,\n\t\t\t\t\tdelay: i * stagger,\n\t\t\t\t\tfill: 'forwards',\n\t\t\t\t},\n\t\t\t)\n\t\t\tthis.animations.push(anim)\n\t\t})\n\n\t\t// Clean up after last animation\n\t\tconst lastAnim = this.animations[this.animations.length - 1]\n\t\tif (!lastAnim) return EMPTY\n\n\t\treturn from(lastAnim.finished).pipe(\n\t\t\ttap(() => {\n\t\t\t\tif (this.element) {\n\t\t\t\t\tthis.element.style.willChange = 'auto'\n\t\t\t\t\tcharElements.forEach(span => {\n\t\t\t\t\t\tspan.style.willChange = 'auto'\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}),\n\t\t\tcatchError(() => EMPTY),\n\t\t)\n\t}\n\n\tprivate animateTypewriter$(duration: number): Observable<unknown> {\n\t\tif (!this.element) return EMPTY\n\n\t\tconst text = this.originalContent\n\t\tconst totalChars = text.length\n\t\tif (totalChars === 0) return EMPTY\n\n\t\tconst charDelay = duration / totalChars\n\t\tlet typed = 0\n\n\t\treturn interval(charDelay).pipe(\n\t\t\ttap(() => {\n\t\t\t\ttyped++\n\t\t\t\tif (this.element) {\n\t\t\t\t\tthis.element.textContent = text.slice(0, typed)\n\t\t\t\t}\n\t\t\t}),\n\t\t\ttakeWhile(() => typed < totalChars),\n\t\t\tfinalize(() => {\n\t\t\t\tif (this.element) {\n\t\t\t\t\tthis.element.textContent = this.originalContent\n\t\t\t\t\tthis.element.style.willChange = 'auto'\n\t\t\t\t}\n\t\t\t}),\n\t\t)\n\t}\n}\n\nexport const animateText = directive(AnimateTextDirective)\n","// color.ts\nimport { nothing } from 'lit'\nimport { Directive, ElementPart, PartInfo, PartType, directive } from 'lit/directive.js'\n\nexport type ColorConfig = {\n\tbgColor?: string\n\tcolor?: string\n}\n\nclass ColorDirective extends Directive {\n\tprivate config: ColorConfig\n\n\tconstructor(partInfo: PartInfo) {\n\t\tsuper(partInfo)\n\t\tthis.config = {}\n\t}\n\n\tupdate(part: ElementPart, [config]: [ColorConfig]) {\n\t\tif (part.type !== PartType.ELEMENT) {\n\t\t\tthrow new Error('The `classMap` directive must be used in the `class` attribute')\n\t\t}\n\t\tconst element = part.element as HTMLElement\n\t\tthis.config = config\n\t\tif (this.config.bgColor) {\n\t\t\telement.style.backgroundColor = this.config.bgColor\n\t\t}\n\n\t\tif (this.config.color) {\n\t\t\telement.style.color = this.config.color\n\t\t}\n\t}\n\n\trender(config: ColorConfig): unknown {\n\t\tthis.config = config\n\t\treturn nothing\n\t}\n}\n\nconst color = directive(ColorDirective)\n\nexport { color }\n","import { Directive, directive, ElementPart, PartInfo, PartType } from 'lit/directive.js'\nimport { animationFrameScheduler, fromEvent, interval, merge, of, Subject, Subscription, timer } from 'rxjs'\nimport { filter, map, observeOn, take, takeUntil, takeWhile, tap } from 'rxjs/operators'\n\nexport interface ConfirmClickOptions {\n\t/** Auto-reset timeout in ms (default: 3000) */\n\ttimeout?: number\n\t/** Override icon for confirmation state (default: inherits from host element) */\n\ticon?: string\n}\n\ninterface ConfirmClickState {\n\tsubscription: Subscription\n\tcallback: () => void\n\toptions: ConfirmClickOptions\n\toverlayElement: HTMLElement | null\n\tisConfirming: boolean\n\tcancel$: Subject<void>\n}\n\nconst confirmClickMap = new WeakMap<Element, ConfirmClickState>()\n\n/** Resolve a CSS variable value from the document root */\nfunction resolveCssColor(varExpr: string, fallback: string): string {\n\tconst match = varExpr.match(/var\\(([^,)]+)/)\n\tif (!match) return fallback\n\tconst value = getComputedStyle(document.documentElement).getPropertyValue(match[1]).trim()\n\treturn value || fallback\n}\n\nclass ConfirmClickDirective extends Directive {\n\tconstructor(partInfo: PartInfo) {\n\t\tsuper(partInfo)\n\t\tif (partInfo.type !== PartType.ELEMENT) {\n\t\t\tthrow new Error('confirmClick directive can only be used on elements')\n\t\t}\n\t}\n\n\trender(_callback: () => void, _options?: ConfirmClickOptions) {\n\t\treturn undefined\n\t}\n\n\tupdate(part: ElementPart, [callback, options = {}]: [() => void, ConfirmClickOptions?]) {\n\t\tconst element = part.element as HTMLElement\n\t\tconst existing = confirmClickMap.get(element)\n\n\t\tif (existing) {\n\t\t\t// Always update callback ref (arrow functions change identity every render)\n\t\t\texisting.callback = callback\n\n\t\t\t// Only re-subscribe if options changed\n\t\t\tif (this.optionsEqual(existing.options, options)) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\tthis.cleanup(element)\n\t\t}\n\n\t\tconst cancel$ = new Subject<void>()\n\t\tconst subscription = this.setupClickListener(element, options ?? {}, cancel$)\n\n\t\tconfirmClickMap.set(element, {\n\t\t\tsubscription,\n\t\t\tcallback,\n\t\t\toptions: options ?? {},\n\t\t\toverlayElement: null,\n\t\t\tisConfirming: false,\n\t\t\tcancel$,\n\t\t})\n\n\t\treturn undefined\n\t}\n\n\tprivate optionsEqual(a: ConfirmClickOptions, b: ConfirmClickOptions | undefined): boolean {\n\t\tif (!b) return Object.keys(a).length === 0\n\t\treturn a.timeout === b.timeout && a.icon === b.icon\n\t}\n\n\tprivate setupClickListener(\n\t\telement: HTMLElement,\n\t\toptions: ConfirmClickOptions,\n\t\tcancel$: Subject<void>,\n\t): Subscription {\n\t\treturn fromEvent<MouseEvent>(element, 'click')\n\t\t\t.pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\tconst state = confirmClickMap.get(element)\n\t\t\t\t\tif (!state || state.isConfirming) return\n\n\t\t\t\t\te.stopPropagation()\n\t\t\t\t\te.preventDefault()\n\n\t\t\t\t\tstate.isConfirming = true\n\t\t\t\t\tthis.showOverlay(element, state, options, cancel$)\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\tprivate showOverlay(\n\t\telement: HTMLElement,\n\t\tstate: ConfirmClickState,\n\t\toptions: ConfirmClickOptions,\n\t\tcancel$: Subject<void>,\n\t) {\n\t\tconst timeout = options.timeout ?? 3000\n\n\t\t// Read the host's icon — reuse it so the user sees the same action \"armed\"\n\t\tconst iconButton = element as HTMLElement & { icon?: string; _capturedIcon?: string }\n\t\tconst hostIcon =\n\t\t\toptions.icon ??\n\t\t\ticonButton.icon ??\n\t\t\ticonButton._capturedIcon ??\n\t\t\telement.textContent?.trim() ??\n\t\t\t'warning'\n\n\t\t// --- Resolve theme colors for canvas ---\n\t\tconst errorColor = resolveCssColor('var(--schmancy-sys-color-error-default)', '#dc2626')\n\t\tconst errorOnColor = resolveCssColor('var(--schmancy-sys-color-error-on)', '#ffffff')\n\t\tconst errorContainerColor = resolveCssColor('var(--schmancy-sys-color-error-container)', '#fecaca')\n\n\t\t// --- Build overlay container ---\n\t\tconst overlay = document.createElement('div')\n\t\toverlay.setAttribute('role', 'status')\n\t\toverlay.setAttribute('aria-label', 'Click again to confirm')\n\n\t\tconst rect = element.getBoundingClientRect()\n\t\tconst w = rect.width\n\t\tconst h = rect.height\n\t\tconst dpr = window.devicePixelRatio || 1\n\t\tconst computedStyle = getComputedStyle(element)\n\n\t\tObject.assign(overlay.style, {\n\t\t\tposition: 'fixed',\n\t\t\ttop: `${rect.top}px`,\n\t\t\tleft: `${rect.left}px`,\n\t\t\twidth: `${w}px`,\n\t\t\theight: `${h}px`,\n\t\t\tzIndex: '10000',\n\t\t\tborderRadius: computedStyle.borderRadius || '50%',\n\t\t\toverflow: 'hidden',\n\t\t\tcursor: 'pointer',\n\t\t\topacity: '0',\n\t\t\ttransform: 'scale(0.6)',\n\t\t\ttransition: 'opacity 250ms cubic-bezier(0.22, 1.25, 0.36, 1), transform 300ms cubic-bezier(0.22, 1.25, 0.36, 1)',\n\t\t})\n\n\t\t// --- Canvas for animated countdown ring ---\n\t\tconst canvas = document.createElement('canvas')\n\t\tcanvas.width = w * dpr\n\t\tcanvas.height = h * dpr\n\t\tcanvas.style.width = `${w}px`\n\t\tcanvas.style.height = `${h}px`\n\t\tcanvas.style.position = 'absolute'\n\t\tcanvas.style.top = '0'\n\t\tcanvas.style.left = '0'\n\t\toverlay.appendChild(canvas)\n\n\t\t// --- Icon element centered on top of canvas ---\n\t\tconst iconSize = Math.round(Math.min(w, h) * 0.5)\n\t\tconst iconEl = document.createElement('schmancy-icon')\n\t\ticonEl.textContent = hostIcon\n\t\ticonEl.setAttribute('size', `${iconSize}px`)\n\t\tObject.assign(iconEl.style, {\n\t\t\tposition: 'absolute',\n\t\t\ttop: '50%',\n\t\t\tleft: '50%',\n\t\t\ttransform: 'translate(-50%, -50%)',\n\t\t\tcolor: errorOnColor,\n\t\t\tpointerEvents: 'none',\n\t\t})\n\t\toverlay.appendChild(iconEl)\n\n\t\tdocument.body.appendChild(overlay)\n\t\tstate.overlayElement = overlay\n\n\t\t// --- Trigger entry animation ---\n\t\tof(null).pipe(observeOn(animationFrameScheduler)).subscribe(() => {\n\t\t\toverlay.style.opacity = '1'\n\t\t\toverlay.style.transform = 'scale(1)'\n\t\t})\n\n\t\t// --- Canvas drawing function ---\n\t\tconst ctx = canvas.getContext('2d')\n\t\tif (!ctx) return\n\t\tctx.scale(dpr, dpr)\n\n\t\tconst cx = w / 2\n\t\tconst cy = h / 2\n\t\tconst radius = Math.min(w, h) / 2 - 1\n\t\tconst ringWidth = 3\n\t\tconst innerRadius = radius - ringWidth\n\n\t\tconst drawFrame = (progress: number) => {\n\t\t\tctx.clearRect(0, 0, w, h)\n\n\t\t\t// Filled circle background\n\t\t\tctx.beginPath()\n\t\t\tctx.arc(cx, cy, innerRadius, 0, Math.PI * 2)\n\t\t\tctx.fillStyle = errorColor\n\t\t\tctx.fill()\n\n\t\t\t// Countdown ring — depletes clockwise from top\n\t\t\tconst remaining = 1 - progress\n\t\t\tif (remaining > 0) {\n\t\t\t\tconst startAngle = -Math.PI / 2\n\t\t\t\tconst endAngle = startAngle + Math.PI * 2 * remaining\n\t\t\t\tctx.beginPath()\n\t\t\t\tctx.arc(cx, cy, radius, startAngle, endAngle)\n\t\t\t\tctx.arc(cx, cy, innerRadius, endAngle, startAngle, true)\n\t\t\t\tctx.closePath()\n\t\t\t\tctx.fillStyle = errorContainerColor\n\t\t\t\tctx.fill()\n\t\t\t}\n\t\t}\n\n\t\t// Initial full ring\n\t\tdrawFrame(0)\n\n\t\t// --- Animate countdown with RxJS animationFrameScheduler ---\n\t\tconst startTime = performance.now()\n\t\tconst animSub = interval(0, animationFrameScheduler)\n\t\t\t.pipe(\n\t\t\t\tmap(() => (performance.now() - startTime) / timeout),\n\t\t\t\ttakeWhile(p => p <= 1),\n\t\t\t\ttakeUntil(cancel$),\n\t\t\t\ttap(progress => drawFrame(progress)),\n\t\t\t)\n\t\t\t.subscribe({\n\t\t\t\tcomplete: () => {\n\t\t\t\t\t// Auto-dismiss when countdown finishes\n\t\t\t\t\tconst s = confirmClickMap.get(element)\n\t\t\t\t\tif (s?.isConfirming) {\n\t\t\t\t\t\tthis.hideOverlay(element)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\n\t\tstate.subscription.add(animSub)\n\n\t\t// --- Second click on overlay → confirm ---\n\t\tconst overlayClick$ = fromEvent<MouseEvent>(overlay, 'click').pipe(\n\t\t\ttake(1),\n\t\t\ttap(() => {\n\t\t\t\tstate.callback()\n\t\t\t\tthis.hideOverlay(element)\n\t\t\t}),\n\t\t)\n\n\t\t// --- Outside click → cancel ---\n\t\tconst outsideClick$ = fromEvent<MouseEvent>(document, 'click', { capture: true }).pipe(\n\t\t\tfilter(e => !overlay.contains(e.target as Node) && !element.contains(e.target as Node)),\n\t\t\ttake(1),\n\t\t\ttap(() => this.hideOverlay(element)),\n\t\t)\n\n\t\t// --- Escape key → cancel ---\n\t\tconst escape$ = fromEvent<KeyboardEvent>(document, 'keydown').pipe(\n\t\t\tfilter(e => e.key === 'Escape'),\n\t\t\ttake(1),\n\t\t\ttap(() => this.hideOverlay(element)),\n\t\t)\n\n\t\tconst dismissSub = merge(overlayClick$, outsideClick$, escape$)\n\t\t\t.pipe(take(1), takeUntil(cancel$))\n\t\t\t.subscribe()\n\n\t\tstate.subscription.add(dismissSub)\n\t}\n\n\tprivate hideOverlay(element: Element) {\n\t\tconst state = confirmClickMap.get(element)\n\t\tif (!state) return\n\n\t\tstate.cancel$.next()\n\t\tstate.isConfirming = false\n\n\t\tif (state.overlayElement) {\n\t\t\tconst overlay = state.overlayElement\n\t\t\toverlay.style.opacity = '0'\n\t\t\toverlay.style.transform = 'scale(0.6)'\n\n\t\t\t// Remove after exit animation\n\t\t\ttimer(250)\n\t\t\t\t.pipe(\n\t\t\t\t\ttap(() => {\n\t\t\t\t\t\tif (document.body.contains(overlay)) {\n\t\t\t\t\t\t\tdocument.body.removeChild(overlay)\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.subscribe()\n\n\t\t\tstate.overlayElement = null\n\t\t}\n\t}\n\n\tprivate cleanup(element: Element) {\n\t\tconst state = confirmClickMap.get(element)\n\t\tif (state) {\n\t\t\tstate.cancel$.next()\n\t\t\tstate.cancel$.complete()\n\t\t\tstate.subscription.unsubscribe()\n\t\t\tif (state.overlayElement && document.body.contains(state.overlayElement)) {\n\t\t\t\tdocument.body.removeChild(state.overlayElement)\n\t\t\t}\n\t\t\tconfirmClickMap.delete(element)\n\t\t}\n\t}\n\n\tdisconnected(part: ElementPart) {\n\t\tthis.cleanup(part.element)\n\t}\n\n\treconnected(part: ElementPart) {\n\t\tconst element = part.element as HTMLElement\n\t\tconst data = confirmClickMap.get(element)\n\n\t\tif (data) {\n\t\t\tconst cancel$ = new Subject<void>()\n\t\t\tconst subscription = this.setupClickListener(element, data.options, cancel$)\n\t\t\tconfirmClickMap.set(element, {\n\t\t\t\tsubscription,\n\t\t\t\tcallback: data.callback,\n\t\t\t\toptions: data.options,\n\t\t\t\toverlayElement: null,\n\t\t\t\tisConfirming: false,\n\t\t\t\tcancel$,\n\t\t\t})\n\t\t}\n\t}\n}\n\n/**\n * Two-stage click confirmation directive with animated canvas countdown.\n *\n * First click shows an in-place overlay with a depleting ring that\n * visually communicates the confirmation window. Second click confirms.\n * Auto-resets when the ring empties, or on outside click / Escape.\n *\n * @param callback - Function to call on confirmed second click\n * @param options - Optional configuration\n * @param options.timeout - Countdown duration in ms (default: 3000)\n * @param options.icon - Override icon (default: inherits from host element)\n *\n * @example\n * ```typescript\n * html`<schmancy-icon-button ${confirmClick(() => this.deleteItem(item))}>delete</schmancy-icon-button>`\n * ```\n */\nexport const confirmClick = directive(ConfirmClickDirective)\n","/**\n * cycleText directive - Cycles through child elements with transitions.\n *\n * Composition-first: works as an inline span inside animateText or standalone.\n * Items are defined as HTML children, not JS arrays — content stays in templates.\n *\n * @example\n * ```ts\n * // Basic: cycles through child spans with fade transition\n * html`<span ${cycleText()}>\n * <span>Guests</span>\n * <span>Kitchen</span>\n * <span>Floor</span>\n * </span>`\n *\n * // With options\n * html`<span ${cycleText({ transition: 'slide', hold: 1500 })}>\n * <span>Fast</span>\n * <span>Snappy</span>\n * </span>`\n *\n * // Per-item timing via data attributes\n * html`<span ${cycleText()}>\n * <span data-hold=\"3000\">Lingers longer</span>\n * <span>Normal timing</span>\n * </span>`\n *\n * // Add mode: accumulates items, then clears and restarts\n * html`<span ${cycleText({ mode: 'add', transition: 'typewriter' })}>\n * <span>guests</span>\n * <span>kitchen</span>\n * <span>team</span>\n * </span>`\n * // Shows: \"guests\" → \"guests, kitchen\" → \"guests, kitchen, team\" → clears → repeat\n *\n * // Custom separator\n * html`<span ${cycleText({ mode: 'add', separator: ' · ' })}>\n * <span>A</span>\n * <span>B</span>\n * </span>`\n * ```\n */\nimport { noChange } from 'lit'\nimport { AsyncDirective, directive } from 'lit/async-directive.js'\nimport type { ElementPart } from 'lit/directive.js'\nimport { EMPTY, Observable, Subject, Subscription, concat, defer, from, interval, of, timer } from 'rxjs'\nimport { catchError, map, repeat, switchMap, take, takeUntil, takeWhile, tap } from 'rxjs/operators'\n\nexport type CycleTransition = 'fade' | 'slide' | 'typewriter'\n\nexport interface CycleTextOptions {\n\t/** Transition between items (default: 'fade') */\n\ttransition?: CycleTransition\n\t/** Default hold duration per item in ms (default: 2000). Overridden by child data-hold. */\n\thold?: number\n\t/** Transition duration in ms (default: 300) */\n\tduration?: number\n\t/** Initial delay before first cycle in ms (default: 0) */\n\tdelay?: number\n\t/** 'replace' cycles one at a time; 'add' accumulates items then resets (default: 'replace') */\n\tmode?: 'replace' | 'add'\n\t/** Separator between accumulated items in add mode (default: ', ') */\n\tseparator?: string\n}\n\nclass CycleTextDirective extends AsyncDirective {\n\tprivate element: HTMLElement | null = null\n\tprivate items: HTMLElement[] = []\n\tprivate subscription: Subscription | null = null\n\tprivate typewriterSub: Subscription | null = null\n\tprivate currentAnimation: Animation | null = null\n\tprivate addDisplayEl: HTMLElement | null = null\n\tprivate disconnecting$ = new Subject<void>()\n\tprivate initialized = false\n\n\trender(_options?: CycleTextOptions) {\n\t\treturn noChange\n\t}\n\n\toverride update(part: ElementPart, [options = {}]: [CycleTextOptions?]) {\n\t\tthis.element = part.element as HTMLElement\n\n\t\tif (!this.initialized && this.isConnected) {\n\t\t\tthis.initialized = true\n\n\t\t\tif (this.disconnecting$.closed) {\n\t\t\t\tthis.disconnecting$ = new Subject<void>()\n\t\t\t}\n\n\t\t\t// Collect child elements as cycle items\n\t\t\tthis.items = Array.from(this.element.children).filter(\n\t\t\t\t(el): el is HTMLElement => el instanceof HTMLElement,\n\t\t\t)\n\n\t\t\tif (this.items.length === 0) return noChange\n\n\t\t\t// Grid stacking: all items in same cell, grid sizes to widest — zero layout shift\n\t\t\tthis.element.style.display = 'inline-grid'\n\t\t\tthis.element.style.verticalAlign = 'bottom'\n\n\t\t\tthis.items.forEach((item, i) => {\n\t\t\t\titem.style.gridColumn = '1'\n\t\t\t\titem.style.gridRow = '1'\n\t\t\t\titem.style.visibility = i === 0 ? '' : 'hidden'\n\t\t\t})\n\n\t\t\tthis.startCycling(options)\n\t\t}\n\n\t\treturn noChange\n\t}\n\n\toverride disconnected(): void {\n\t\tthis.cleanup()\n\t}\n\n\toverride reconnected(): void {\n\t\t// nothing needed\n\t}\n\n\tprivate startCycling(options: CycleTextOptions): void {\n\t\tconst { mode = 'replace' } = options\n\n\t\tif (this.items.length < 2) return\n\n\t\tif (mode === 'add') {\n\t\t\tthis.startAddCycling(options)\n\t\t} else {\n\t\t\tthis.startReplaceCycling(options)\n\t\t}\n\t}\n\n\tprivate startReplaceCycling(options: CycleTextOptions): void {\n\t\tconst {\n\t\t\ttransition = 'fade',\n\t\t\thold: defaultHold = 2000,\n\t\t\tduration = 300,\n\t\t\tdelay: initialDelay = 0,\n\t\t} = options\n\n\t\t// Build one observable per item: show → hold → hide\n\t\tconst cycleItem = (index: number) =>\n\t\t\tdefer(() => {\n\t\t\t\treturn new Observable<void>(subscriber => {\n\t\t\t\t\tconst item = this.items[index]\n\t\t\t\t\tconst prevIndex = (index - 1 + this.items.length) % this.items.length\n\t\t\t\t\tconst prevItem = this.items[prevIndex]\n\t\t\t\t\tconst itemHold = parseInt(item.dataset.hold || '', 10) || defaultHold\n\n\t\t\t\t\t// Transition out previous, transition in current\n\t\t\t\t\tconst transitionDone$ = this.transitionItems(prevItem, item, transition, duration)\n\n\t\t\t\t\t// After transition + hold, signal complete\n\t\t\t\t\tconst holdSub = transitionDone$\n\t\t\t\t\t\t.pipe(\n\t\t\t\t\t\t\tswitchMap(() => timer(itemHold)),\n\t\t\t\t\t\t\ttake(1),\n\t\t\t\t\t\t\ttakeUntil(this.disconnecting$),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.subscribe({\n\t\t\t\t\t\t\tnext: () => {\n\t\t\t\t\t\t\t\tsubscriber.next()\n\t\t\t\t\t\t\t\tsubscriber.complete()\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\terror: err => subscriber.error(err),\n\t\t\t\t\t\t})\n\n\t\t\t\t\treturn () => holdSub.unsubscribe()\n\t\t\t\t})\n\t\t\t})\n\n\t\t// First item is already visible — just hold it, then cycle from index 1\n\t\tconst firstHold = parseInt(this.items[0].dataset.hold || '', 10) || defaultHold\n\t\tconst firstItem = defer(() => {\n\t\t\treturn new Observable<void>(subscriber => {\n\t\t\t\tconst holdSub = timer(firstHold)\n\t\t\t\t\t.pipe(takeUntil(this.disconnecting$))\n\t\t\t\t\t.subscribe({\n\t\t\t\t\t\tnext: () => {\n\t\t\t\t\t\t\tsubscriber.next()\n\t\t\t\t\t\t\tsubscriber.complete()\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\treturn () => holdSub.unsubscribe()\n\t\t\t})\n\t\t})\n\n\t\t// Build sequence: hold first → cycle 1,2,...,0,1,2,...\n\t\tconst indices = Array.from({ length: this.items.length }, (_, i) => i)\n\t\t// After first hold, cycle starting from item 1 through all items\n\t\tconst restIndices = [...indices.slice(1), 0]\n\t\tconst restSequence = concat(...restIndices.map(i => cycleItem(i)))\n\n\t\t// First hold + rest sequence, then repeat rest sequence forever\n\t\tconst fullSequence = concat(firstItem, restSequence.pipe(repeat()))\n\n\t\tthis.subscription = timer(initialDelay)\n\t\t\t.pipe(\n\t\t\t\tswitchMap(() => fullSequence),\n\t\t\t\ttakeUntil(this.disconnecting$),\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\tprivate startAddCycling(options: CycleTextOptions): void {\n\t\tconst {\n\t\t\ttransition = 'fade',\n\t\t\thold: defaultHold = 2000,\n\t\t\tduration = 300,\n\t\t\tdelay: initialDelay = 0,\n\t\t\tseparator = ', ',\n\t\t} = options\n\n\t\tconst texts = this.items.map(item => item.textContent || '')\n\n\t\t// Hide all children — we manage display via a single display span\n\t\tthis.items.forEach(item => {\n\t\t\titem.style.display = 'none'\n\t\t})\n\n\t\tconst displayEl = document.createElement('span')\n\t\tthis.element!.appendChild(displayEl)\n\t\tthis.addDisplayEl = displayEl\n\n\t\t// One cycle: type each item progressively, then clear and restart\n\t\tconst oneCycle = defer(() => {\n\t\t\tdisplayEl.textContent = ''\n\t\t\tlet accumulated = ''\n\n\t\t\t// Build sequence: type item 0 → hold → type sep+item 1 → hold → ... → hold longer → clear\n\t\t\tconst itemSteps = texts.map((text, i) => {\n\t\t\t\tconst itemHold = parseInt(this.items[i].dataset.hold || '', 10) || defaultHold\n\t\t\t\tconst prefix = i > 0 ? separator : ''\n\t\t\t\tconst textToType = prefix + text\n\n\t\t\t\treturn defer(() => {\n\t\t\t\t\tif (transition === 'typewriter') {\n\t\t\t\t\t\treturn this.typewriterAdd(displayEl, accumulated, textToType, duration).pipe(\n\t\t\t\t\t\t\ttap(() => {\n\t\t\t\t\t\t\t\taccumulated += textToType\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tswitchMap(() => timer(itemHold)),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\t// fade/slide: instant append with fade-in on new text\n\t\t\t\t\treturn defer(() => {\n\t\t\t\t\t\taccumulated += textToType\n\t\t\t\t\t\tdisplayEl.textContent = accumulated\n\t\t\t\t\t\treturn timer(itemHold)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t})\n\n\t\t\t// After all items shown, hold a bit longer then clear with fade-out\n\t\t\tconst clearPhase = defer(() => {\n\t\t\t\tconst fadeOut = displayEl.animate([{ opacity: 1 }, { opacity: 0 }], {\n\t\t\t\t\tduration: duration,\n\t\t\t\t\tfill: 'forwards',\n\t\t\t\t})\n\t\t\t\tthis.currentAnimation = fadeOut\n\t\t\t\treturn from(fadeOut.finished).pipe(\n\t\t\t\t\ttap(() => {\n\t\t\t\t\t\tfadeOut.cancel()\n\t\t\t\t\t\tdisplayEl.textContent = ''\n\t\t\t\t\t\tdisplayEl.style.opacity = ''\n\t\t\t\t\t\taccumulated = ''\n\t\t\t\t\t}),\n\t\t\t\t\tswitchMap(() => timer(300)),\n\t\t\t\t)\n\t\t\t})\n\n\t\t\treturn concat(...itemSteps, clearPhase)\n\t\t})\n\n\t\tthis.subscription = timer(initialDelay)\n\t\t\t.pipe(\n\t\t\t\tswitchMap(() => oneCycle.pipe(repeat())),\n\t\t\t\ttakeUntil(this.disconnecting$),\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\t/** Types text character by character, appending to existing content. Completes after all chars typed. */\n\tprivate typewriterAdd(\n\t\tdisplayEl: HTMLElement,\n\t\texisting: string,\n\t\tnewText: string,\n\t\tduration: number,\n\t): Observable<void> {\n\t\tif (newText.length === 0) return of(undefined as void)\n\t\tconst charDelay = duration / newText.length\n\n\t\treturn new Observable<void>(subscriber => {\n\t\t\tlet typed = 0\n\t\t\tconst sub = interval(charDelay)\n\t\t\t\t.pipe(\n\t\t\t\t\ttap(() => {\n\t\t\t\t\t\ttyped++\n\t\t\t\t\t\tdisplayEl.textContent = existing + newText.slice(0, typed)\n\t\t\t\t\t}),\n\t\t\t\t\ttakeWhile(() => typed < newText.length),\n\t\t\t\t\ttakeUntil(this.disconnecting$),\n\t\t\t\t)\n\t\t\t\t.subscribe({\n\t\t\t\t\tcomplete: () => {\n\t\t\t\t\t\tdisplayEl.textContent = existing + newText\n\t\t\t\t\t\tsubscriber.next()\n\t\t\t\t\t\tsubscriber.complete()\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\treturn () => sub.unsubscribe()\n\t\t})\n\t}\n\n\tprivate transitionItems(\n\t\toutItem: HTMLElement,\n\t\tinItem: HTMLElement,\n\t\ttransition: CycleTransition,\n\t\tduration: number,\n\t): Observable<void> {\n\t\t// Cancel any running transition\n\t\tthis.currentAnimation?.cancel()\n\t\tthis.currentAnimation = null\n\t\tthis.typewriterSub?.unsubscribe()\n\t\tthis.typewriterSub = null\n\n\t\tswitch (transition) {\n\t\t\tcase 'slide':\n\t\t\t\treturn this.slideTransition(outItem, inItem, duration)\n\t\t\tcase 'typewriter':\n\t\t\t\treturn this.typewriterTransition(outItem, inItem, duration)\n\t\t\tcase 'fade':\n\t\t\tdefault:\n\t\t\t\treturn this.fadeTransition(outItem, inItem, duration)\n\t\t}\n\t}\n\n\tprivate fadeTransition(outItem: HTMLElement, inItem: HTMLElement, duration: number): Observable<void> {\n\t\tconst fadeOut = outItem.animate([{ opacity: 1 }, { opacity: 0 }], {\n\t\t\tduration: duration / 2,\n\t\t\tfill: 'forwards',\n\t\t})\n\t\tthis.currentAnimation = fadeOut\n\n\t\treturn from(fadeOut.finished).pipe(\n\t\t\tswitchMap(() => {\n\t\t\t\tfadeOut.cancel()\n\t\t\t\toutItem.style.visibility = 'hidden'\n\n\t\t\t\tinItem.style.visibility = ''\n\t\t\t\tconst fadeIn = inItem.animate([{ opacity: 0 }, { opacity: 1 }], {\n\t\t\t\t\tduration: duration / 2,\n\t\t\t\t\tfill: 'forwards',\n\t\t\t\t})\n\t\t\t\tthis.currentAnimation = fadeIn\n\n\t\t\t\treturn from(fadeIn.finished).pipe(\n\t\t\t\t\ttap(() => { fadeIn.cancel() }),\n\t\t\t\t\tmap(() => {}),\n\t\t\t\t\tcatchError(() => EMPTY),\n\t\t\t\t)\n\t\t\t}),\n\t\t\tcatchError(() => EMPTY),\n\t\t)\n\t}\n\n\t/** Counter-style slide: both animate simultaneously in same grid cell */\n\tprivate slideTransition(outItem: HTMLElement, inItem: HTMLElement, duration: number): Observable<void> {\n\t\tconst soft = 'cubic-bezier(0.4, 0, 0.2, 1)'\n\n\t\tinItem.style.visibility = ''\n\n\t\tconst slideOut = outItem.animate(\n\t\t\t[\n\t\t\t\t{ transform: 'translateY(0)', opacity: 1 },\n\t\t\t\t{ transform: 'translateY(-100%)', opacity: 0 },\n\t\t\t],\n\t\t\t{ duration, fill: 'forwards', easing: soft },\n\t\t)\n\t\tconst slideIn = inItem.animate(\n\t\t\t[\n\t\t\t\t{ transform: 'translateY(100%)', opacity: 0 },\n\t\t\t\t{ transform: 'translateY(0)', opacity: 1 },\n\t\t\t],\n\t\t\t{ duration, fill: 'forwards', easing: soft },\n\t\t)\n\t\tthis.currentAnimation = slideIn\n\n\t\treturn from(slideIn.finished).pipe(\n\t\t\ttap(() => {\n\t\t\t\tslideOut.cancel()\n\t\t\t\tslideIn.cancel()\n\t\t\t\toutItem.style.visibility = 'hidden'\n\t\t\t}),\n\t\t\tmap(() => {}),\n\t\t\tcatchError(() => EMPTY),\n\t\t)\n\t}\n\n\tprivate typewriterTransition(\n\t\toutItem: HTMLElement,\n\t\tinItem: HTMLElement,\n\t\tduration: number,\n\t): Observable<void> {\n\t\tconst outText = outItem.textContent || ''\n\t\tconst inText = inItem.textContent || ''\n\t\tconst totalChars = outText.length + inText.length\n\t\tif (totalChars === 0) {\n\t\t\toutItem.style.visibility = 'hidden'\n\t\t\tinItem.style.visibility = ''\n\t\t\treturn of(undefined as void)\n\t\t}\n\n\t\tconst charDelay = duration / totalChars\n\n\t\treturn new Observable<void>(subscriber => {\n\t\t\t// Phase 1: delete outgoing text\n\t\t\tlet remaining = outText.length\n\n\t\t\tthis.typewriterSub = concat(\n\t\t\t\t// Delete phase\n\t\t\t\tinterval(charDelay).pipe(\n\t\t\t\t\ttap(() => {\n\t\t\t\t\t\tremaining--\n\t\t\t\t\t\toutItem.textContent = outText.slice(0, remaining)\n\t\t\t\t\t}),\n\t\t\t\t\ttakeWhile(() => remaining > 0),\n\t\t\t\t),\n\t\t\t\t// Switch items\n\t\t\t\tdefer(() => {\n\t\t\t\t\toutItem.style.visibility = 'hidden'\n\t\t\t\t\toutItem.textContent = outText // restore original\n\t\t\t\t\tinItem.style.visibility = ''\n\t\t\t\t\tinItem.textContent = ''\n\t\t\t\t\treturn of(null)\n\t\t\t\t}),\n\t\t\t\t// Type phase\n\t\t\t\tdefer(() => {\n\t\t\t\t\tlet typed = 0\n\t\t\t\t\treturn interval(charDelay).pipe(\n\t\t\t\t\t\ttap(() => {\n\t\t\t\t\t\t\ttyped++\n\t\t\t\t\t\t\tinItem.textContent = inText.slice(0, typed)\n\t\t\t\t\t\t}),\n\t\t\t\t\t\ttakeWhile(() => typed < inText.length),\n\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t)\n\t\t\t\t.pipe(takeUntil(this.disconnecting$))\n\t\t\t\t.subscribe({\n\t\t\t\t\tcomplete: () => {\n\t\t\t\t\t\tinItem.textContent = inText // ensure full text\n\t\t\t\t\t\tsubscriber.next()\n\t\t\t\t\t\tsubscriber.complete()\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\treturn () => {\n\t\t\t\tthis.typewriterSub?.unsubscribe()\n\t\t\t\tthis.typewriterSub = null\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate cleanup(): void {\n\t\tthis.disconnecting$.next()\n\t\tthis.disconnecting$.complete()\n\n\t\tthis.currentAnimation?.cancel()\n\t\tthis.currentAnimation = null\n\t\tthis.typewriterSub?.unsubscribe()\n\t\tthis.typewriterSub = null\n\t\tthis.subscription?.unsubscribe()\n\t\tthis.subscription = null\n\n\t\t// Remove add-mode display element\n\t\tif (this.addDisplayEl) {\n\t\t\tthis.addDisplayEl.remove()\n\t\t\tthis.addDisplayEl = null\n\t\t}\n\n\t\tthis.items.forEach((item, i) => {\n\t\t\titem.style.gridColumn = ''\n\t\t\titem.style.gridRow = ''\n\t\t\titem.style.visibility = i === 0 ? '' : 'hidden'\n\t\t\titem.style.opacity = ''\n\t\t\titem.style.transform = ''\n\t\t})\n\n\t\tthis.element = null\n\t\tthis.items = []\n\t\tthis.initialized = false\n\t}\n}\n\nexport const cycleText = directive(CycleTextDirective)\n","import { directive, type ElementPart, PartType } from 'lit/directive.js'\nimport { AsyncDirective } from 'lit/async-directive.js'\nimport { reducedMotion$ } from './reduced-motion'\n\nexport interface DepthOfFieldOptions {\n\t/** When true, blur is applied. When false, blur is removed. */\n\tactive: boolean\n\t/** Max blur radius in pixels (default: 8) */\n\tmaxBlur?: number\n\t/** Duration of blur transition in ms (default: 400) */\n\tduration?: number\n}\n\n/**\n * Depth-of-field directive — progressive blur on background content.\n *\n * Reactive: responds to `active` changing. Uses `style.scale` instead of\n * `style.transform` to avoid conflicts with other directives.\n *\n * @example\n * ```html\n * <main ${depthOfField({ active: this.dialogOpen, maxBlur: 8 })}>\n * page content\n * </main>\n * ```\n */\nclass DepthOfFieldDirective extends AsyncDirective {\n\tprivate element!: HTMLElement\n\tprivate maxBlur = 8\n\tprivate duration = 400\n\tprivate isBlurred = false\n\tprivate transitionSet = false\n\n\trender(_options: DepthOfFieldOptions) {\n\t\treturn undefined\n\t}\n\n\toverride update(part: ElementPart, [options]: [DepthOfFieldOptions]) {\n\t\tif (part.type !== PartType.ELEMENT) {\n\t\t\tthrow new Error('depthOfField directive must be used on an element')\n\t\t}\n\n\t\tthis.element = part.element as HTMLElement\n\t\tthis.maxBlur = options.maxBlur ?? 8\n\t\tthis.duration = options.duration ?? 400\n\n\t\t// Setup transition once (uses filter + scale, not transform)\n\t\tif (!this.transitionSet && !reducedMotion$.value) {\n\t\t\tthis.element.style.transition = `filter ${this.duration}ms cubic-bezier(0.34, 1.2, 0.64, 1), scale ${this.duration}ms cubic-bezier(0.34, 1.2, 0.64, 1)`\n\t\t\tthis.transitionSet = true\n\t\t}\n\n\t\tif (options.active && !this.isBlurred) {\n\t\t\tthis.applyBlur()\n\t\t} else if (!options.active && this.isBlurred) {\n\t\t\tthis.clearBlur()\n\t\t}\n\n\t\treturn undefined\n\t}\n\n\tprivate applyBlur() {\n\t\tthis.element.style.filter = `blur(${this.maxBlur}px) saturate(60%)`\n\t\tthis.element.style.scale = '1.01'\n\t\tthis.isBlurred = true\n\t}\n\n\tprivate clearBlur() {\n\t\tthis.element.style.filter = ''\n\t\tthis.element.style.scale = ''\n\t\tthis.isBlurred = false\n\t}\n\n\toverride disconnected() {\n\t\tif (this.isBlurred) this.clearBlur()\n\t}\n\n\toverride reconnected() {\n\t\t// Inline styles persist — no action needed\n\t}\n}\n\nexport const depthOfField = directive(DepthOfFieldDirective)\n","import { nothing } from 'lit'\nimport { Directive, directive, type ElementPart } from 'lit/directive.js'\nimport { animationFrameScheduler, BehaviorSubject, EMPTY, fromEvent, Subject, timer } from 'rxjs'\nimport { distinctUntilChanged, observeOn, skip, switchMap, take, takeUntil, tap } from 'rxjs/operators'\nimport { SPRING_SNAPPY } from '../utils/animation'\nimport { reducedMotion$ } from './reduced-motion'\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type SchmancyDropEvent = CustomEvent<{\n\tsource: string\n\tdestination: string\n\t/** Where the item was dropped relative to the destination: above or below its midpoint */\n\tposition?: 'before' | 'after'\n}>\n\n// =============================================================================\n// REACTIVE STATE\n// =============================================================================\n\n/** Current drag source ID — single source of truth for all drag/drop directives */\nconst dragSource$ = new BehaviorSubject<string | null>(null)\n\n/** Insertion line position — drives the singleton line element reactively */\nconst linePosition$ = new BehaviorSubject<{\n\ttarget: HTMLElement\n\tdestinationId: string\n\tposition: 'before' | 'after'\n} | null>(null)\n\n/** Registry of all drag-enabled elements by ID (for direction detection + FLIP) */\nconst dragRegistry = new Map<string, HTMLElement>()\n\n/** Pre-drop rect snapshots for FLIP animation (captured at dragstart) */\nconst preDropRects = new Map<string, DOMRect>()\n\n/** Debug log — accumulates drag/drop events, auto-copies to clipboard on dragend */\nconst debugLog: string[] = []\nfunction dlog(msg: string) {\n\tdebugLog.push(`[${new Date().toISOString().slice(11, 23)}] ${msg}`)\n}\nfunction flushDebugLog() {\n\tif (debugLog.length === 0) return\n\tdebugLog.length = 0\n}\n\n// =============================================================================\n// INSERTION LINE (lazy singleton)\n// =============================================================================\n\nlet insertionLine: HTMLElement | null = null\n\nfunction ensureInsertionLine(): HTMLElement {\n\tif (insertionLine) return insertionLine\n\n\tconst line = document.createElement('div')\n\tline.setAttribute('data-schmancy-drop-line', '')\n\tObject.assign(line.style, {\n\t\tposition: 'fixed',\n\t\theight: '2px',\n\t\tbackgroundColor: 'var(--schmancy-sys-color-tertiary-default, #6750A4)',\n\t\tborderRadius: '1px',\n\t\tpointerEvents: 'none',\n\t\tzIndex: '10000',\n\t\ttransition: 'top 100ms ease, left 100ms ease, width 100ms ease',\n\t\tboxShadow: '0 0 4px var(--schmancy-sys-color-tertiary-default, #6750A4)',\n\t\tdisplay: 'none',\n\t})\n\n\tfor (const side of ['left', 'right'] as const) {\n\t\tconst dot = document.createElement('div')\n\t\tObject.assign(dot.style, {\n\t\t\tposition: 'absolute',\n\t\t\twidth: '6px',\n\t\t\theight: '6px',\n\t\t\tborderRadius: '50%',\n\t\t\tbackgroundColor: 'var(--schmancy-sys-color-tertiary-default, #6750A4)',\n\t\t\ttop: '-2px',\n\t\t\t[side]: '-3px',\n\t\t})\n\t\tline.appendChild(dot)\n\t}\n\n\tdocument.body.appendChild(line)\n\tinsertionLine = line\n\treturn line\n}\n\n// Single global subscription — drives insertion line DOM from linePosition$\nlinePosition$\n\t.pipe(\n\t\tdistinctUntilChanged(\n\t\t\t(a, b) => a?.target === b?.target && a?.position === b?.position,\n\t\t),\n\t)\n\t.subscribe(state => {\n\t\tif (!state) {\n\t\t\tif (insertionLine) insertionLine.style.display = 'none'\n\t\t\treturn\n\t\t}\n\n\t\tif (reducedMotion$.value) return\n\n\t\tconst line = ensureInsertionLine()\n\t\tconst rect = state.target.getBoundingClientRect()\n\t\tconst y = state.position === 'before' ? rect.top - 1 : rect.bottom + 1\n\n\t\tObject.assign(line.style, {\n\t\t\ttop: `${y}px`,\n\t\t\tleft: `${rect.left}px`,\n\t\t\twidth: `${rect.width}px`,\n\t\t\tdisplay: 'block',\n\t\t})\n\t})\n\n// =============================================================================\n// DIRECTION-AWARE DROP POSITION\n// =============================================================================\n\nfunction getDropPosition(e: DragEvent, targetEl: HTMLElement, sourceId: string | null): 'before' | 'after' | null {\n\tconst tr = targetEl.getBoundingClientRect()\n\tconst sourceEl = sourceId ? dragRegistry.get(sourceId) : null\n\tif (!sourceEl) return e.clientY < tr.top + tr.height / 2 ? 'before' : 'after'\n\n\tconst sr = sourceEl.getBoundingClientRect()\n\tconst horizontal = Math.abs(sr.top - tr.top) < tr.height / 2\n\n\tif (horizontal) {\n\t\tconst midX = tr.left + tr.width / 2\n\t\treturn sr.left > tr.left ? (e.clientX < midX ? 'before' : null) : e.clientX >= midX ? 'after' : null\n\t}\n\n\tconst midY = tr.top + tr.height / 2\n\treturn sr.top > tr.top ? (e.clientY < midY ? 'before' : null) : e.clientY >= midY ? 'after' : null\n}\n\n// =============================================================================\n// DRAG DIRECTIVE\n// =============================================================================\n\nexport class DragDirective extends Directive {\n\tprivate element?: HTMLElement\n\tprivate id!: string\n\tprivate registeredId?: string\n\tprivate destroy$ = new Subject<void>()\n\n\tupdate(part: ElementPart, [id]: [string]) {\n\t\tthis.id = id\n\n\t\tif (!this.element) {\n\t\t\tconst el = part.element as HTMLElement\n\t\t\tthis.element = el\n\t\t\tel.draggable = true\n\t\t\tel.style.cursor = 'grab'\n\n\t\t\tfromEvent<DragEvent>(el, 'dragstart')\n\t\t\t\t.pipe(\n\t\t\t\t\ttap(e => {\n\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\te.dataTransfer?.setData('application/json', JSON.stringify({ id: this.id }))\n\t\t\t\t\t\tif (e.dataTransfer) e.dataTransfer.effectAllowed = 'move'\n\t\t\t\t\t\tel.style.cursor = 'grabbing'\n\t\t\t\t\t\tdebugLog.length = 0\n\t\t\t\t\t\tdlog(`DRAGSTART id=${this.id} tag=${el.tagName}`)\n\t\t\t\t\t\tdragSource$.next(this.id)\n\t\t\t\t\t\t// Inline FLIP capture\n\t\t\t\t\t\tpreDropRects.clear()\n\t\t\t\t\t\tconst parent = el.parentElement\n\t\t\t\t\t\tif (parent) {\n\t\t\t\t\t\t\tfor (const [regId, reg] of dragRegistry) {\n\t\t\t\t\t\t\t\tif (reg.parentElement === parent) preDropRects.set(regId, reg.getBoundingClientRect())\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t\t// Defer lift to next frame so browser captures ghost at normal state\n\t\t\t\t\tobserveOn(animationFrameScheduler),\n\t\t\t\t\ttap(() => {\n\t\t\t\t\t\tif (!reducedMotion$.value) {\n\t\t\t\t\t\t\tel.style.transition = 'transform 150ms ease, box-shadow 150ms ease, opacity 150ms ease'\n\t\t\t\t\t\t\tel.style.transform = 'scale(1.03)'\n\t\t\t\t\t\t\tel.style.boxShadow = '0 8px 25px rgba(0,0,0,0.15)'\n\t\t\t\t\t\t\tel.style.opacity = '0.6'\n\t\t\t\t\t\t\tel.style.zIndex = '1000'\n\t\t\t\t\t\t\tel.style.pointerEvents = 'none'\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t\t// dragend is a natural side effect of dragstart — one per session\n\t\t\t\t\tswitchMap(() =>\n\t\t\t\t\t\tfromEvent<DragEvent>(el, 'dragend').pipe(\n\t\t\t\t\t\t\ttake(1),\n\t\t\t\t\t\t\ttap(() => {\n\t\t\t\t\t\t\t\tconst pendingDrop = linePosition$.value\n\n\t\t\t\t\t\t\t\tel.style.removeProperty('transition')\n\t\t\t\t\t\t\t\tel.style.removeProperty('transform')\n\t\t\t\t\t\t\t\tel.style.removeProperty('box-shadow')\n\t\t\t\t\t\t\t\tel.style.removeProperty('opacity')\n\t\t\t\t\t\t\t\tel.style.removeProperty('z-index')\n\t\t\t\t\t\t\t\tel.style.removeProperty('pointer-events')\n\t\t\t\t\t\t\t\tel.style.cursor = 'grab'\n\n\t\t\t\t\t\t\t\tif (pendingDrop) {\n\t\t\t\t\t\t\t\t\tconst { target, destinationId, position } = pendingDrop\n\t\t\t\t\t\t\t\t\tdlog(`DROP source=${this.id} dest=${destinationId} pos=${position}`)\n\t\t\t\t\t\t\t\t\ttarget.dispatchEvent(\n\t\t\t\t\t\t\t\t\t\tnew CustomEvent('drop', {\n\t\t\t\t\t\t\t\t\t\t\tdetail: { source: this.id, destination: destinationId, position },\n\t\t\t\t\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t// FLIP: double rAF waits for Lit render + browser layout\n\t\t\t\t\t\t\t\t\ttimer(0, animationFrameScheduler).pipe(skip(1), take(1)).subscribe(() => {\n\t\t\t\t\t\t\t\t\t\tif (reducedMotion$.value || preDropRects.size === 0) return\n\t\t\t\t\t\t\t\t\t\tfor (const [flipId, oldRect] of preDropRects) {\n\t\t\t\t\t\t\t\t\t\t\tconst reg = dragRegistry.get(flipId)\n\t\t\t\t\t\t\t\t\t\t\tif (!reg) continue\n\t\t\t\t\t\t\t\t\t\t\tconst newRect = reg.getBoundingClientRect()\n\t\t\t\t\t\t\t\t\t\t\tconst dx = oldRect.left - newRect.left\n\t\t\t\t\t\t\t\t\t\t\tconst dy = oldRect.top - newRect.top\n\t\t\t\t\t\t\t\t\t\t\tif (Math.abs(dx) < 1 && Math.abs(dy) < 1) continue\n\t\t\t\t\t\t\t\t\t\t\treg.animate(\n\t\t\t\t\t\t\t\t\t\t\t\t[{ transform: `translate(${dx}px, ${dy}px)` }, { transform: 'translate(0,0)' }],\n\t\t\t\t\t\t\t\t\t\t\t\t{ duration: SPRING_SNAPPY.duration, easing: SPRING_SNAPPY.easingFallback, fill: 'none' },\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tpreDropRects.clear()\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tdragSource$.next(null)\n\t\t\t\t\t\t\t\tlinePosition$.next(null)\n\t\t\t\t\t\t\t\tdlog(`DRAGEND id=${this.id}`)\n\t\t\t\t\t\t\t\tflushDebugLog()\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\ttakeUntil(this.destroy$),\n\t\t\t\t)\n\t\t\t\t.subscribe()\n\t\t}\n\n\t\t// Keep registry in sync (element may be reused with different id)\n\t\tif (this.registeredId && this.registeredId !== id) {\n\t\t\tdragRegistry.delete(this.registeredId)\n\t\t}\n\t\tdragRegistry.set(id, this.element)\n\t\tthis.registeredId = id\n\n\t\treturn nothing\n\t}\n\n\tdisconnected() {\n\t\tthis.destroy$.next()\n\t\tthis.destroy$.complete()\n\t\tif (this.registeredId) dragRegistry.delete(this.registeredId)\n\t\tthis.element = undefined\n\t}\n\n\treconnected() {\n\t\tthis.destroy$ = new Subject<void>()\n\t\t// Clear element so that the next update() call re-attaches event listeners\n\t\tthis.element = undefined\n\t}\n\n\trender(_id: string) {\n\t\treturn nothing\n\t}\n}\n\nexport const drag = directive(DragDirective)\n\n// =============================================================================\n// DROP DIRECTIVE — dragover/drop are side effects of dragSource$\n// =============================================================================\n\nexport class DropDirective extends Directive {\n\tprivate element?: HTMLElement\n\tprivate destinationId!: string\n\tprivate destroy$ = new Subject<void>()\n\n\tupdate(part: ElementPart, [destinationId]: [string]) {\n\t\tthis.destinationId = destinationId\n\n\t\tif (!this.element) {\n\t\t\tconst el = part.element as HTMLElement\n\t\t\tthis.element = el\n\n\t\t\t// Native drag event logging via RxJS\n\t\t\tfromEvent<DragEvent>(el, 'dragenter').pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\tdlog(`NATIVE-DRAGENTER dest=${this.destinationId}`)\n\t\t\t\t\te.preventDefault()\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.destroy$),\n\t\t\t).subscribe()\n\n\t\t\tfromEvent<DragEvent>(el, 'dragover').pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\tdlog(`NATIVE-DRAGOVER dest=${this.destinationId}`)\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tif (e.dataTransfer) e.dataTransfer.dropEffect = 'move'\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.destroy$),\n\t\t\t).subscribe()\n\n\t\t\tfromEvent<DragEvent>(el, 'drop').pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tdlog(`NATIVE-DROP dest=${this.destinationId}`)\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.destroy$),\n\t\t\t).subscribe()\n\n\t\t\t// dragSource$ is the entry — dragover/drop only exist while a drag is active\n\t\t\tdragSource$\n\t\t\t\t.pipe(\n\t\t\t\t\tswitchMap(sourceId => {\n\t\t\t\t\t\tif (!sourceId || sourceId === this.destinationId) {\n\t\t\t\t\t\t\tlinePosition$.next(null)\n\t\t\t\t\t\t\treturn EMPTY\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdlog(`DROP-ACTIVE dest=${this.destinationId} src=${sourceId}`)\n\t\t\t\t\t\treturn fromEvent<DragEvent>(el, 'dragover').pipe(\n\t\t\t\t\t\t\ttap(e => {\n\t\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\t\tif (e.dataTransfer) e.dataTransfer.dropEffect = 'move'\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttap(e => {\n\t\t\t\t\t\t\t\tconst position = getDropPosition(e, el, sourceId)\n\t\t\t\t\t\t\t\tlinePosition$.next(position ? { target: el, destinationId: this.destinationId, position } : null)\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t}),\n\t\t\t\t\ttakeUntil(this.destroy$),\n\t\t\t\t)\n\t\t\t\t.subscribe()\n\t\t}\n\n\t\treturn nothing\n\t}\n\n\tdisconnected() {\n\t\tthis.destroy$.next()\n\t\tthis.destroy$.complete()\n\t\tthis.element = undefined\n\t}\n\n\treconnected() {\n\t\tthis.destroy$ = new Subject<void>()\n\t\t// Clear element so that the next update() call re-attaches event listeners\n\t\tthis.element = undefined\n\t}\n\n\trender(_destinationId: string) {\n\t\treturn nothing\n\t}\n}\n\nexport const drop = directive(DropDirective)\n","import { AsyncDirective, directive } from 'lit/async-directive.js'\nimport { ElementPart, PartType } from 'lit/directive.js'\nimport { EMPTY, Subject, combineLatest, fromEvent, merge, timer } from 'rxjs'\nimport { debounceTime, distinctUntilChanged, filter, map, startWith, switchMap, takeUntil, tap } from 'rxjs/operators'\nimport { theme } from '../theme/theme.service'\nimport { fromResizeObserver } from './layout'\n\n/**\n * fill directive — anchors an element to the viewport in both dimensions\n * and contains overflow within its viewport-anchored box.\n *\n * The element's `getBoundingClientRect()` top/left are subtracted from the\n * visual viewport size; the remaining pixels are applied as inline `height`\n * and `width`. `overflow: hidden` ensures children cannot visually escape\n * the box; inner scroll containers (apply `overflowWithin()` on the\n * appropriate cell) handle scrolling.\n *\n * Layout is the consumer's responsibility — apply Tailwind classes\n * (`grid grid-cols-[auto_1fr] grid-rows-[1fr]`, `flex`, etc.) on the same\n * element to express the layout. The directive provides the definite-pixel\n * box; the consumer decides how it's divided.\n *\n * Cascade-independent — measurement is taken in viewport coordinates\n * rather than computed from CSS, so the directive works regardless of\n * what the element's ancestors declare.\n *\n * Reactive sources: window/visualViewport resize + scroll, orientation\n * change, iOS keyboard focus-out, parent/element ResizeObserver, theme\n * fullscreen toggle, theme bottom offset (safe-area / nav-bar reservation).\n *\n * @example sidebar + main\n * <app-shell\n * ${fill()}\n * class=\"grid grid-cols-[auto_1fr] grid-rows-[1fr]\"\n * >\n * <app-rail></app-rail>\n * <app-content></app-content>\n * </app-shell>\n */\nclass Fill extends AsyncDirective {\n\tprivate element: HTMLElement | null = null\n\tprivate disconnecting$ = new Subject<void>()\n\n\tprivate apply(bottomOffset: number, isFullscreen: boolean) {\n\t\tif (!this.element) return\n\t\tconst vv = window.visualViewport\n\t\tconst vh = vv?.height ?? window.innerHeight\n\t\tconst vw = vv?.width ?? window.innerWidth\n\t\tconst rect = this.element.getBoundingClientRect()\n\t\tconst height = Math.max(0, vh - rect.top)\n\t\tconst width = Math.max(0, vw - rect.left)\n\t\tconst padding = isFullscreen ? 0 : bottomOffset\n\t\tconst s = this.element.style\n\t\ts.boxSizing = 'border-box'\n\t\ts.height = `${height}px`\n\t\ts.width = `${width}px`\n\t\ts.paddingBottom = `${padding}px`\n\t\ts.minHeight = '0'\n\t\ts.minWidth = '0'\n\t\ts.overflow = 'hidden'\n\t}\n\n\tprivate subscribe() {\n\t\tif (!this.element) return\n\n\t\tconst windowResize$ = fromEvent(window, 'resize', { passive: true })\n\t\tconst viewportEvents$ = window.visualViewport\n\t\t\t? merge(\n\t\t\t\t\tfromEvent(window.visualViewport, 'resize', { passive: true }),\n\t\t\t\t\tfromEvent(window.visualViewport, 'scroll', { passive: true }),\n\t\t\t\t)\n\t\t\t: windowResize$\n\t\tconst orientation$ = fromEvent(window, 'orientationchange')\n\t\tconst focusOut$ = fromEvent(document, 'focusout', { passive: true }).pipe(\n\t\t\tswitchMap(() => timer(100)),\n\t\t)\n\t\tconst elementResize$ = fromResizeObserver(this.element)\n\t\tconst parentResize$ = this.element.parentElement\n\t\t\t? fromResizeObserver(this.element.parentElement)\n\t\t\t: EMPTY\n\n\t\tcombineLatest([\n\t\t\tmerge(\n\t\t\t\twindowResize$,\n\t\t\t\tviewportEvents$,\n\t\t\t\torientation$,\n\t\t\t\tfocusOut$,\n\t\t\t\telementResize$,\n\t\t\t\tparentResize$,\n\t\t\t).pipe(debounceTime(16), startWith(null)),\n\t\t\ttheme.bottomOffset$,\n\t\t\ttheme.fullscreen$,\n\t\t])\n\t\t\t.pipe(\n\t\t\t\tfilter(() => {\n\t\t\t\t\tconst vv = window.visualViewport\n\t\t\t\t\treturn vv ? Math.abs(vv.scale - 1) <= 0.01 : true\n\t\t\t\t}),\n\t\t\t\tmap(([, bottomOffset, isFullscreen]) => ({ bottomOffset, isFullscreen })),\n\t\t\t\tdistinctUntilChanged(\n\t\t\t\t\t(a, b) => a.bottomOffset === b.bottomOffset && a.isFullscreen === b.isFullscreen,\n\t\t\t\t),\n\t\t\t\ttap(({ bottomOffset, isFullscreen }) => this.apply(bottomOffset, isFullscreen)),\n\t\t\t\ttakeUntil(this.disconnecting$),\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\trender() {\n\t\treturn\n\t}\n\n\toverride update(part: ElementPart) {\n\t\tif (part.type !== PartType.ELEMENT) {\n\t\t\tthrow new Error('fill directive can only be used on elements')\n\t\t}\n\t\tconst el = part.element as HTMLElement\n\t\tif (this.element !== el) {\n\t\t\tthis.element = el\n\t\t\tthis.subscribe()\n\t\t}\n\t}\n\n\tprotected override disconnected() {\n\t\tthis.disconnecting$.next()\n\t\tthis.element = null\n\t}\n\n\tprotected override reconnected() {\n\t\tif (this.element) {\n\t\t\tthis.disconnecting$ = new Subject<void>()\n\t\t\tthis.subscribe()\n\t\t}\n\t}\n}\n\nexport const fill = directive(Fill)\n","import { directive, type ElementPart, PartType } from 'lit/directive.js'\nimport { AsyncDirective } from 'lit/async-directive.js'\nimport { from, EMPTY } from 'rxjs'\nimport { take, catchError, tap } from 'rxjs/operators'\nimport { SPRING_SMOOTH, SPRING_BOUNCY } from '../utils/animation'\nimport { reducedMotion$ } from './reduced-motion'\n\nexport interface GravityOptions {\n\t/** Mass: 0.5 (light/bouncy) to 2.0 (heavy/damped). Default: 1.0 */\n\tmass?: number\n\t/** Fall distance in pixels (default: 30) */\n\tdistance?: number\n\t/** Delay before falling in ms (default: 0) */\n\tdelay?: number\n\t/** Stagger delay per item for lists — multiply by index (default: 0) */\n\tstagger?: number\n}\n\n/**\n * Gravity directive — elements fall into place and settle with mass-based bounce.\n *\n * Only animates ONCE on first render. Re-renders do not re-trigger.\n * Disconnecting and reconnecting re-triggers the animation.\n *\n * @example\n * ```html\n * <schmancy-card ${gravity()}>content</schmancy-card>\n *\n * ${repeat(items, item => item.id, (item, i) => html`\n * <div ${gravity({ stagger: 50 * i, mass: 0.8 })}>...</div>\n * `)}\n * ```\n */\nclass GravityDirective extends AsyncDirective {\n\tprivate element!: HTMLElement\n\tprivate animation?: Animation\n\tprivate hasAnimated = false\n\tprivate options?: GravityOptions\n\n\trender(_options?: GravityOptions) {\n\t\treturn undefined\n\t}\n\n\toverride update(part: ElementPart, [options]: [GravityOptions?]) {\n\t\tif (part.type !== PartType.ELEMENT) {\n\t\t\tthrow new Error('gravity directive must be used on an element')\n\t\t}\n\n\t\tthis.element = part.element as HTMLElement\n\t\tthis.options = options\n\n\t\tif (this.hasAnimated) return undefined\n\t\tif (reducedMotion$.value) {\n\t\t\tthis.hasAnimated = true\n\t\t\treturn undefined\n\t\t}\n\n\t\tconst mass = Math.max(0.3, Math.min(3.0, options?.mass ?? 1.0))\n\t\tconst distance = options?.distance ?? 30\n\t\tconst delay = (options?.delay ?? 0) + (options?.stagger ?? 0)\n\n\t\tthis.animate(mass, distance, delay)\n\t\tthis.hasAnimated = true\n\n\t\treturn undefined\n\t}\n\n\toverride reconnected() {\n\t\tthis.hasAnimated = false\n\t\tif (this.options && !reducedMotion$.value) {\n\t\t\tconst mass = Math.max(0.3, Math.min(3.0, this.options.mass ?? 1.0))\n\t\t\tconst distance = this.options.distance ?? 30\n\t\t\tconst delay = (this.options.delay ?? 0) + (this.options.stagger ?? 0)\n\t\t\tthis.animate(mass, distance, delay)\n\t\t\tthis.hasAnimated = true\n\t\t}\n\t}\n\n\tprivate animate(mass: number, distance: number, delay: number) {\n\t\tconst preset = mass < 0.7 ? SPRING_BOUNCY : SPRING_SMOOTH\n\t\tconst duration = preset.duration * (1 / Math.sqrt(mass))\n\t\tconst fallDistance = distance * (1 / mass)\n\n\t\tthis.animation?.cancel()\n\n\t\tthis.element.style.willChange = 'transform, opacity'\n\t\tthis.animation = this.element.animate(\n\t\t\t[\n\t\t\t\t{ opacity: 0, transform: `translateY(-${fallDistance}px)` },\n\t\t\t\t{ opacity: 1, transform: 'translateY(0)' },\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration,\n\t\t\t\tdelay,\n\t\t\t\teasing: preset.easingFallback,\n\t\t\t\tfill: 'backwards',\n\t\t\t},\n\t\t)\n\n\t\t// RxJS cleanup instead of raw .then()\n\t\tfrom(this.animation.finished).pipe(\n\t\t\ttake(1),\n\t\t\ttap(() => {\n\t\t\t\tthis.element.style.willChange = ''\n\t\t\t\tthis.animation = undefined\n\t\t\t}),\n\t\t\tcatchError(() => EMPTY), // Animation cancelled — no cleanup needed\n\t\t).subscribe()\n\t}\n\n\toverride disconnected() {\n\t\tthis.animation?.cancel()\n\t\tthis.animation = undefined\n\t}\n}\n\nexport const gravity = directive(GravityDirective)\n","/**\n * Intersect Directive - Simplified IntersectionObserver for Lit\n *\n * Automatically handles observer setup and cleanup. Replaces manual\n * IntersectionObserver management across the codebase.\n *\n * @example\n * ```ts\n * // Basic - callback when visible\n * html`<div ${intersect(() => this.loadData())}>Lazy content</div>`\n *\n * // Once mode - fires only once then disconnects\n * html`<img ${intersect(() => this.loadImage(), { once: true })} />`\n *\n * // With options\n * html`<div ${intersect(\n * (isVisible) => isVisible && this.playAnimation(),\n * { threshold: 0.5, rootMargin: '100px' }\n * )}>Animated content</div>`\n *\n * // Enter/exit callbacks\n * html`<video ${intersect({\n * onEnter: () => this.play(),\n * onExit: () => this.pause()\n * })}>Video</video>`\n * ```\n */\n\nimport { noChange } from 'lit'\nimport { AsyncDirective, directive } from 'lit/async-directive.js'\nimport type { ElementPart } from 'lit'\nimport { Subscription, timer } from 'rxjs'\nimport { take, tap } from 'rxjs/operators'\n\nexport interface IntersectOptions {\n\t/** Fire callback only once then disconnect (default: false) */\n\tonce?: boolean\n\t/** IntersectionObserver threshold (default: 0) */\n\tthreshold?: number | number[]\n\t/** IntersectionObserver rootMargin (default: '0px') */\n\trootMargin?: string\n\t/** Delay in ms before triggering callback (default: 0) */\n\tdelay?: number\n}\n\nexport interface IntersectCallbacks {\n\t/** Called when element enters viewport */\n\tonEnter?: () => void\n\t/** Called when element exits viewport */\n\tonExit?: () => void\n\t/** IntersectionObserver options */\n\toptions?: IntersectOptions\n}\n\ntype IntersectCallback = (isVisible: boolean, entry: IntersectionObserverEntry) => void\n\ninterface IntersectState {\n\telement: HTMLElement\n\tobserver: IntersectionObserver\n\tcallback: IntersectCallback\n\tonEnter?: () => void\n\tonExit?: () => void\n\tonce: boolean\n\tdelay: number\n\tdelayTimerSub?: Subscription\n\thasFired: boolean\n}\n\nclass IntersectDirective extends AsyncDirective {\n\tprivate state: IntersectState | null = null\n\n\trender(\n\t\t_callbackOrOptions: IntersectCallback | IntersectCallbacks,\n\t\t_options?: IntersectOptions,\n\t) {\n\t\treturn noChange\n\t}\n\n\toverride update(\n\t\tpart: ElementPart,\n\t\t[callbackOrOptions, options]: [IntersectCallback | IntersectCallbacks, IntersectOptions?],\n\t) {\n\t\tconst element = part.element as HTMLElement\n\n\t\t// Parse arguments\n\t\tlet callback: IntersectCallback | undefined\n\t\tlet onEnter: (() => void) | undefined\n\t\tlet onExit: (() => void) | undefined\n\t\tlet finalOptions: IntersectOptions = {}\n\n\t\tif (typeof callbackOrOptions === 'function') {\n\t\t\tcallback = callbackOrOptions\n\t\t\tfinalOptions = options || {}\n\t\t} else {\n\t\t\tonEnter = callbackOrOptions.onEnter\n\t\t\tonExit = callbackOrOptions.onExit\n\t\t\tfinalOptions = callbackOrOptions.options || {}\n\t\t\t// Create a unified callback from enter/exit\n\t\t\tcallback = (isVisible) => {\n\t\t\t\tif (isVisible && onEnter) onEnter()\n\t\t\t\tif (!isVisible && onExit) onExit()\n\t\t\t}\n\t\t}\n\n\t\t// Skip if already set up for this element\n\t\tif (this.state?.element === element) {\n\t\t\treturn noChange\n\t\t}\n\n\t\t// Cleanup previous state\n\t\tthis.cleanup()\n\n\t\tconst { once = false, threshold = 0, rootMargin = '0px', delay = 0 } = finalOptions\n\n\t\t// Create observer\n\t\tconst observer = new IntersectionObserver(\n\t\t\t(entries) => {\n\t\t\t\tif (!this.state) return\n\t\t\t\tconst entry = entries[0]\n\t\t\t\tconst isVisible = entry.isIntersecting\n\n\t\t\t\t// Handle delay\n\t\t\t\tif (delay > 0 && isVisible) {\n\t\t\t\t\tif (this.state.delayTimerSub) {\n\t\t\t\t\t\tthis.state.delayTimerSub.unsubscribe()\n\t\t\t\t\t}\n\t\t\t\t\tthis.state.delayTimerSub = timer(delay).pipe(\n\t\t\t\t\t\ttake(1),\n\t\t\t\t\t\ttap(() => this.triggerCallback(isVisible, entry)),\n\t\t\t\t\t).subscribe()\n\t\t\t\t} else {\n\t\t\t\t\t// Clear any pending delayed callback if element exits\n\t\t\t\t\tif (!isVisible && this.state.delayTimerSub) {\n\t\t\t\t\t\tthis.state.delayTimerSub.unsubscribe()\n\t\t\t\t\t\tthis.state.delayTimerSub = undefined\n\t\t\t\t\t}\n\t\t\t\t\tthis.triggerCallback(isVisible, entry)\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ threshold, rootMargin },\n\t\t)\n\n\t\tthis.state = {\n\t\t\telement,\n\t\t\tobserver,\n\t\t\tcallback: callback!,\n\t\t\tonEnter,\n\t\t\tonExit,\n\t\t\tonce,\n\t\t\tdelay,\n\t\t\thasFired: false,\n\t\t}\n\n\t\t// Start observing\n\t\tobserver.observe(element)\n\n\t\treturn noChange\n\t}\n\n\tprivate triggerCallback(isVisible: boolean, entry: IntersectionObserverEntry): void {\n\t\tif (!this.state) return\n\n\t\t// For once mode, only fire on enter and only once\n\t\tif (this.state.once) {\n\t\t\tif (isVisible && !this.state.hasFired) {\n\t\t\t\tthis.state.hasFired = true\n\t\t\t\tthis.state.callback(isVisible, entry)\n\t\t\t\t// Disconnect after firing\n\t\t\t\tthis.cleanup()\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\t// Normal mode - fire on every change\n\t\tthis.state.callback(isVisible, entry)\n\t}\n\n\tprivate cleanup(): void {\n\t\tif (!this.state) return\n\n\t\tthis.state.delayTimerSub?.unsubscribe()\n\t\tthis.state.delayTimerSub = undefined\n\t\tthis.state.observer.disconnect()\n\t\tthis.state = null\n\t}\n\n\tprivate pause(): void {\n\t\tif (!this.state) return\n\t\tthis.state.delayTimerSub?.unsubscribe()\n\t\tthis.state.observer.disconnect()\n\t}\n\n\toverride disconnected(): void {\n\t\tthis.pause()\n\t}\n\n\toverride reconnected(): void {\n\t\tif (this.state) {\n\t\t\tthis.state.observer.observe(this.state.element)\n\t\t}\n\t}\n}\n\nexport const intersect = directive(IntersectDirective)\n","/**\n * Liquid Glass Directive — Apple WWDC 2025 Liquid Glass\n *\n * Pure CSS, zero DOM mutation. Applies only inline styles to the host element:\n * - backdrop-filter: blur + saturate + brightness (glass material)\n * - background: semi-transparent tint (glass visibility layer)\n * - box-shadow: Fresnel edge glow (inset) + depth shadow (outer)\n * - border: thin luminous edge\n *\n * Does NOT insert any child elements, so it's safe on flex/grid containers.\n *\n * Usage:\n * ```ts\n * html`<div ${liquid()}>Content</div>`\n * html`<div ${liquid({ intensity: 'strong' })}>Thick glass</div>`\n * html`<div ${liquid({ active: false })}>No glass</div>`\n * ```\n */\n\nimport { noChange } from 'lit'\nimport { AsyncDirective, directive } from 'lit/async-directive.js'\nimport type { ElementPart } from 'lit'\n\nexport interface LiquidOptions {\n\t/** Whether the effect is active. Default: true */\n\tactive?: boolean\n\t/** Glass thickness. Default: 'medium' */\n\tintensity?: 'light' | 'medium' | 'strong'\n}\n\nconst DEFAULTS: Required<LiquidOptions> = {\n\tactive: true,\n\tintensity: 'medium',\n}\n\ninterface Params {\n\tblur: number\n\tsat: number\n\tbright: number\n\ttint: number\n\tborder: number\n\tshadow: number\n}\n\nconst INTENSITY: Record<string, Params> = {\n\tlight: { blur: 12, sat: 1.3, bright: 1.05, tint: 0.45, border: 0.20, shadow: 0.06 },\n\tmedium: { blur: 16, sat: 1.4, bright: 1.08, tint: 0.55, border: 0.28, shadow: 0.08 },\n\tstrong: { blur: 24, sat: 1.5, bright: 1.12, tint: 0.65, border: 0.35, shadow: 0.10 },\n}\n\n// Style keys we modify — saved and restored on cleanup\nconst STYLE_KEYS = [\n\t'backdropFilter',\n\t'background',\n\t'boxShadow',\n\t'borderTop',\n\t'borderBottom',\n] as const\ntype StyleKey = typeof STYLE_KEYS[number]\n\ninterface State {\n\telement: HTMLElement\n\torigStyles: Record<StyleKey, string>\n}\n\nclass LiquidDirective extends AsyncDirective {\n\tprivate state: State | null = null\n\n\trender(_options?: LiquidOptions) {\n\t\treturn noChange\n\t}\n\n\toverride update(part: ElementPart, [options = {}]: [LiquidOptions?]) {\n\t\tconst el = part.element as HTMLElement\n\t\tconst opts = { ...DEFAULTS, ...options }\n\n\t\tif (opts.active) {\n\t\t\tthis.activate(el, opts)\n\t\t} else {\n\t\t\tthis.cleanup()\n\t\t}\n\t\treturn noChange\n\t}\n\n\tprivate activate(el: HTMLElement, opts: Required<LiquidOptions>): void {\n\t\tif (!this.isConnected) return\n\t\tconst p = INTENSITY[opts.intensity]\n\n\t\tif (!this.state) {\n\t\t\t// Save original styles\n\t\t\tconst origStyles = {} as Record<StyleKey, string>\n\t\t\tfor (const key of STYLE_KEYS) {\n\t\t\t\torigStyles[key] = el.style[key]\n\t\t\t}\n\t\t\tthis.state = { element: el, origStyles }\n\t\t}\n\n\t\tthis.applyStyles(el, p)\n\t}\n\n\tprivate applyStyles(el: HTMLElement, p: Params): void {\n\t\t// Glass material\n\t\tconst bdFilter = `blur(${p.blur}px) saturate(${p.sat}) brightness(${p.bright})`\n\t\tel.style.backdropFilter = bdFilter\n\t\tel.style.setProperty('-webkit-backdrop-filter', bdFilter)\n\n\t\t// Glass tint (uses theme surface color, adapts to light/dark)\n\t\tel.style.background = `rgba(var(--md-sys-color-surface-container, 255 255 255) / ${p.tint})`\n\n\t\t// Fresnel edge glow (inset) + depth shadow (outer)\n\t\tconst b = p.border\n\t\tel.style.boxShadow = [\n\t\t\t// Top Fresnel rim — bright edge (directional light from above)\n\t\t\t`inset 0 1px 0 0 rgba(255,255,255, ${b * 1.5})`,\n\t\t\t`inset 0 2px 6px rgba(255,255,255, ${b * 0.6})`,\n\t\t\t// Bottom subtle rim\n\t\t\t`inset 0 -1px 0 0 rgba(255,255,255, ${b * 0.25})`,\n\t\t\t// Depth shadows\n\t\t\t`0 1px 3px rgba(0,0,0, ${p.shadow})`,\n\t\t\t`0 6px 20px rgba(0,0,0, ${p.shadow * 0.5})`,\n\t\t].join(', ')\n\n\t\t// Luminous border edges\n\t\tel.style.borderTop = `0.5px solid rgba(255,255,255, ${b * 0.9})`\n\t\tel.style.borderBottom = `0.5px solid rgba(0,0,0, 0.05)`\n\t}\n\n\tprivate cleanup(): void {\n\t\tif (!this.state) return\n\t\tconst { element, origStyles } = this.state\n\n\t\t// Restore all original styles\n\t\tfor (const key of STYLE_KEYS) {\n\t\t\telement.style[key] = origStyles[key]\n\t\t}\n\t\telement.style.removeProperty('-webkit-backdrop-filter')\n\n\t\tthis.state = null\n\t}\n\n\toverride disconnected(): void {\n\t\tthis.cleanup()\n\t}\n\n\toverride reconnected(): void {\n\t\t// Will re-activate on next update()\n\t}\n}\n\nexport const liquid = directive(LiquidDirective)\n","import { directive, type ElementPart, PartType } from 'lit/directive.js'\nimport { AsyncDirective } from 'lit/async-directive.js'\nimport { fromEvent, merge, Subject } from 'rxjs'\nimport { map, takeUntil } from 'rxjs/operators'\nimport { reducedMotion$ } from './reduced-motion'\n\nexport interface LivingBorderOptions {\n\t/** Animation duration in ms (default: 3000) */\n\tduration?: number\n\t/** Border width in pixels (default: 1) */\n\twidth?: number\n\t/** Glow color (default: primary) */\n\tcolor?: string\n\t/** Glow spread in pixels (default: 6) */\n\tspread?: number\n\t/** Only animate on hover (default: false) */\n\tonHover?: boolean\n}\n\n// Shared style for ALL instances — single @property + @keyframes\nconst SHARED_ANIM_NAME = 'schmancy-lb-rotate'\nlet sharedStyleInjected = false\n\nfunction ensureSharedStyle() {\n\tif (sharedStyleInjected) return\n\tconst style = document.createElement('style')\n\tstyle.id = 'schmancy-living-border-shared'\n\tstyle.textContent = `\n\t\t@property --${SHARED_ANIM_NAME}-angle {\n\t\t\tsyntax: '<angle>';\n\t\t\tinitial-value: 0deg;\n\t\t\tinherits: false;\n\t\t}\n\t\t@keyframes ${SHARED_ANIM_NAME} {\n\t\t\tto { --${SHARED_ANIM_NAME}-angle: 360deg; }\n\t\t}\n\t`\n\tdocument.head.appendChild(style)\n\tsharedStyleInjected = true\n}\n\n/**\n * Living border directive — a gradient light traces the element's edges.\n *\n * @example\n * ```html\n * <schmancy-card ${livingBorder()}>content</schmancy-card>\n * <div ${livingBorder({ duration: 4000, onHover: true })}>panel</div>\n * ```\n */\nclass LivingBorderDirective extends AsyncDirective {\n\tprivate element!: HTMLElement\n\tprivate borderEl?: HTMLElement\n\tprivate readonly teardown$ = new Subject<void>()\n\tprivate prevKey?: string\n\tprivate didSetPosition = false\n\tprivate lastOptions?: LivingBorderOptions\n\n\trender(_options?: LivingBorderOptions) {\n\t\treturn undefined\n\t}\n\n\toverride update(part: ElementPart, [options]: [LivingBorderOptions?]) {\n\t\tif (part.type !== PartType.ELEMENT) {\n\t\t\tthrow new Error('livingBorder directive must be used on an element')\n\t\t}\n\n\t\tconst key = JSON.stringify(options ?? {})\n\t\tif (this.element && key === this.prevKey) return undefined\n\t\tthis.prevKey = key\n\n\t\tthis.element = part.element as HTMLElement\n\t\tthis.lastOptions = options\n\t\tif (reducedMotion$.value) return undefined\n\n\t\tthis.teardown$.next()\n\t\tthis.cleanup()\n\t\tensureSharedStyle()\n\t\tthis.createBorderOverlay(options)\n\n\t\treturn undefined\n\t}\n\n\toverride reconnected() {\n\t\t// Re-create border directly — don't rely on update()\n\t\tif (this.lastOptions && !reducedMotion$.value) {\n\t\t\tensureSharedStyle()\n\t\t\tthis.createBorderOverlay(this.lastOptions)\n\t\t}\n\t}\n\n\tprivate createBorderOverlay(options?: LivingBorderOptions) {\n\t\tconst width = options?.width ?? 1\n\t\tconst color = options?.color ?? 'var(--schmancy-sys-color-primary-default)'\n\t\tconst spread = options?.spread ?? 6\n\t\tconst duration = options?.duration ?? 3000\n\t\tconst onHover = options?.onHover ?? false\n\n\t\tconst pos = getComputedStyle(this.element).position\n\t\tif (pos === 'static') {\n\t\t\tthis.element.style.position = 'relative'\n\t\t\tthis.didSetPosition = true\n\t\t}\n\n\t\tthis.borderEl = document.createElement('div')\n\t\tthis.borderEl.setAttribute('aria-hidden', 'true')\n\n\t\tconst inset = `-${width}px`\n\t\tObject.assign(this.borderEl.style, {\n\t\t\tposition: 'absolute',\n\t\t\ttop: inset,\n\t\t\tleft: inset,\n\t\t\tright: inset,\n\t\t\tbottom: inset,\n\t\t\tborderRadius: 'inherit',\n\t\t\tpointerEvents: 'none',\n\t\t\tzIndex: '0',\n\t\t\tbackground: `conic-gradient(\n\t\t\t\tfrom var(--${SHARED_ANIM_NAME}-angle),\n\t\t\t\ttransparent 0%, transparent 30%,\n\t\t\t\tcolor-mix(in srgb, ${color} 50%, transparent) 45%,\n\t\t\t\t${color} 50%,\n\t\t\t\tcolor-mix(in srgb, ${color} 50%, transparent) 55%,\n\t\t\t\ttransparent 70%, transparent 100%\n\t\t\t)`,\n\t\t\tmask: `linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)`,\n\t\t\tmaskComposite: 'exclude',\n\t\t\tWebkitMaskComposite: 'xor',\n\t\t\tpadding: `${width}px`,\n\t\t\tanimation: `${SHARED_ANIM_NAME} ${duration}ms linear infinite`,\n\t\t\tfilter: `blur(${spread * 0.3}px) drop-shadow(0 0 ${spread}px color-mix(in srgb, ${color} 40%, transparent))`,\n\t\t\topacity: onHover ? '0' : '0.5',\n\t\t\ttransition: 'opacity 300ms ease',\n\t\t})\n\n\t\tthis.element.prepend(this.borderEl)\n\n\t\t// RxJS hover listeners with takeUntil cleanup\n\t\tconst enter$ = fromEvent(this.element, 'mouseenter').pipe(\n\t\t\tmap(() => { if (this.borderEl) this.borderEl.style.opacity = onHover ? '0.7' : '0.8' }),\n\t\t)\n\t\tconst leave$ = fromEvent(this.element, 'mouseleave').pipe(\n\t\t\tmap(() => { if (this.borderEl) this.borderEl.style.opacity = onHover ? '0' : '0.5' }),\n\t\t)\n\n\t\tmerge(enter$, leave$)\n\t\t\t.pipe(takeUntil(this.teardown$))\n\t\t\t.subscribe()\n\t}\n\n\tprivate cleanup() {\n\t\tthis.borderEl?.remove()\n\t\tthis.borderEl = undefined\n\t}\n\n\toverride disconnected() {\n\t\tthis.teardown$.next()\n\t\tthis.cleanup()\n\t\tif (this.didSetPosition && this.element) {\n\t\t\tthis.element.style.position = ''\n\t\t\tthis.didSetPosition = false\n\t\t}\n\t}\n}\n\nexport const livingBorder = directive(LivingBorderDirective)\n","import { Directive, directive, ElementPart, PartInfo, PartType } from 'lit/directive.js'\nimport { fromEvent, timer, merge, Subscription } from 'rxjs'\nimport { switchMap, takeUntil, tap, filter, first } from 'rxjs/operators'\n\nexport interface LongPressOptions {\n\t/** Duration in milliseconds before long-press triggers (default: 500) */\n\tduration?: number\n\t/** Movement threshold in pixels that cancels the long-press (default: 10) */\n\tmovementThreshold?: number\n}\n\n// Store subscription data for elements using WeakMap for proper cleanup\nconst longPressMap = new WeakMap<\n\tElement,\n\t{\n\t\tsubscription: Subscription\n\t\tcallback: () => void\n\t\toptions: LongPressOptions\n\t}\n>()\n\nclass LongPressDirective extends Directive {\n\tconstructor(partInfo: PartInfo) {\n\t\tsuper(partInfo)\n\t\tif (partInfo.type !== PartType.ELEMENT) {\n\t\t\tthrow new Error('longPress directive can only be used on elements')\n\t\t}\n\t}\n\n\trender(_callback: () => void, _options?: LongPressOptions) {\n\t\t// Directives that set up event listeners don't render content\n\t\treturn undefined\n\t}\n\n\tupdate(part: ElementPart, [callback, options = {}]: [() => void, LongPressOptions?]) {\n\t\tconst element = part.element\n\n\t\t// Check if we already have data for this element\n\t\tconst existingData = longPressMap.get(element)\n\n\t\t// If callback or options changed, we need to re-setup\n\t\tif (existingData) {\n\t\t\t// Only re-setup if callback or options actually changed\n\t\t\tif (existingData.callback === callback && this.optionsEqual(existingData.options, options)) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\t// Clean up old subscription\n\t\t\texistingData.subscription.unsubscribe()\n\t\t}\n\n\t\t// Setup the long-press detection\n\t\tconst subscription = this.setupLongPress(element, callback, options)\n\n\t\t// Store for cleanup\n\t\tlongPressMap.set(element, {\n\t\t\tsubscription,\n\t\t\tcallback,\n\t\t\toptions: options || {},\n\t\t})\n\n\t\treturn undefined\n\t}\n\n\tprivate optionsEqual(a: LongPressOptions, b: LongPressOptions | undefined): boolean {\n\t\tif (!b) return Object.keys(a).length === 0\n\t\treturn a.duration === b.duration && a.movementThreshold === b.movementThreshold\n\t}\n\n\tprivate setupLongPress(element: Element, callback: () => void, options: LongPressOptions = {}): Subscription {\n\t\tconst duration = options.duration ?? 500\n\t\tconst threshold = options.movementThreshold ?? 10\n\n\t\tconst pointerDown$ = fromEvent<PointerEvent>(element, 'pointerdown')\n\t\tconst pointerUp$ = fromEvent<PointerEvent>(window, 'pointerup')\n\t\tconst pointerMove$ = fromEvent<PointerEvent>(window, 'pointermove')\n\t\tconst pointerCancel$ = fromEvent<PointerEvent>(window, 'pointercancel')\n\n\t\treturn pointerDown$\n\t\t\t.pipe(\n\t\t\t\tswitchMap(startEvent => {\n\t\t\t\t\tconst startX = startEvent.clientX\n\t\t\t\t\tconst startY = startEvent.clientY\n\n\t\t\t\t\t// Cancel if pointer is released, cancelled, or moved too far\n\t\t\t\t\tconst cancel$ = merge(\n\t\t\t\t\t\tpointerUp$,\n\t\t\t\t\t\tpointerCancel$,\n\t\t\t\t\t\tpointerMove$.pipe(\n\t\t\t\t\t\t\tfilter(e => {\n\t\t\t\t\t\t\t\tconst dx = e.clientX - startX\n\t\t\t\t\t\t\t\tconst dy = e.clientY - startY\n\t\t\t\t\t\t\t\treturn Math.sqrt(dx * dx + dy * dy) > threshold\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t).pipe(first())\n\n\t\t\t\t\t// Wait for duration, cancel if cancel$ emits first\n\t\t\t\t\treturn timer(duration).pipe(\n\t\t\t\t\t\ttakeUntil(cancel$),\n\t\t\t\t\t\ttap(() => callback()),\n\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\tdisconnected(part: ElementPart) {\n\t\tconst element = part.element\n\t\tconst data = longPressMap.get(element)\n\n\t\tif (data) {\n\t\t\tdata.subscription.unsubscribe()\n\t\t\tlongPressMap.delete(element)\n\t\t}\n\t}\n\n\treconnected(part: ElementPart) {\n\t\t// On reconnect, check if we need to re-setup (data should still be in WeakMap)\n\t\tconst element = part.element\n\t\tconst data = longPressMap.get(element)\n\n\t\tif (data) {\n\t\t\t// Re-setup with stored callback and options\n\t\t\tconst subscription = this.setupLongPress(element, data.callback, data.options)\n\t\t\tdata.subscription = subscription\n\t\t}\n\t}\n}\n\n/**\n * Long-press gesture directive for Lit components.\n *\n * Detects long-press (press-and-hold) gestures with movement cancellation.\n * Works with both touch and mouse events via PointerEvents API.\n *\n * @param callback - Function to call when long-press is detected\n * @param options - Optional configuration\n * @param options.duration - Time in ms before trigger (default: 500)\n * @param options.movementThreshold - Max movement in px before cancel (default: 10)\n *\n * @example\n * ```typescript\n * // Basic usage\n * html`<div ${longPress(() => this.showDialog())}></div>`\n *\n * // With custom options\n * html`<div ${longPress(() => this.showMenu(), { duration: 800, movementThreshold: 15 })}></div>`\n * ```\n */\nexport const longPress = directive(LongPressDirective)\n","/**\n * Nebula Directive v3 - Surreal Dimensional Rift\n *\n * A surreal, otherworldly cosmic loading effect inspired by deep-space imagery\n * but rendered as a dimensional rift — chromatic aberration channels, iridescent\n * hue-cycling core, event horizon pulse, bioluminescent tendrils, and quantum\n * particles — all implemented with CSS @keyframes for GPU-composited performance.\n *\n * ## Performance (v3 architecture):\n * - 6 DOM layers with CSS @keyframes (no JS in hot path)\n * - Shared NebulaCoordinator singleton (1 IntersectionObserver for all instances)\n * - Visibility gating via CSS class toggle (`paused`/`running`)\n * - `contain: strict` + `translateZ(0)` for compositor promotion\n * - `animation-play-state` pauses when off-screen or tab hidden\n *\n * ## Visual layers (back to front):\n * 1. Cosmic Dust + Void — static dark filaments, vignette, void pockets (multiply, zero animation cost)\n * 2. Chromatic Red — aberration channel shifted right (screen blend)\n * 3. Chromatic Blue — aberration channel shifted left (screen blend)\n * 4. Iridescent Core + Event Horizon — hue-rotate cycling center (screen blend)\n * 5. Bioluminescent Tendrils — organic breathing gas wisps (screen blend)\n * 6. Quantum Particles — scattered hue-shifting dots (screen blend)\n *\n * Uses spring physics from Blackbird animation system for organic motion.\n * Respects prefers-reduced-motion for accessibility.\n *\n * Usage:\n * ```ts\n * html`<div ${nebula()}>Content</div>`\n * html`<div ${nebula({ active: this.loading })}>Content</div>`\n * html`<div ${nebula({ active: true, temperature: -0.5 })}>Content</div>`\n * ```\n */\n\nimport { noChange } from 'lit'\nimport { AsyncDirective, directive } from 'lit/async-directive.js'\nimport type { ElementPart } from 'lit'\nimport { SPRING_SMOOTH, SPRING_GENTLE, getEasing } from '../utils/animation'\nimport { reducedMotion$ } from './reduced-motion'\nimport { Subscription, timer, fromEvent, from, EMPTY } from 'rxjs'\nimport { take, tap, catchError } from 'rxjs/operators'\n\nexport interface NebulaOptions {\n\t/** Whether the nebula is active/visible. Default: true (auto-shows, auto-hides after autoHideDuration) */\n\tactive?: boolean\n\n\t/** Auto-hide after this duration (ms). Set to 0 to disable. Default: 3000 */\n\tautoHideDuration?: number\n\n\t/** Render behind content instead of on top. Default: true */\n\tbackground?: boolean\n\n\t/** Overall brightness/intensity (0-1). Default: 1 */\n\tintensity?: number\n\n\t/** Blur amount multiplier. Default: 1 */\n\tblur?: number\n\n\t/** Animation speed multiplier (0.5 = half speed, 2 = double speed). Default: 1 */\n\tspeed?: number\n\n\t/** Fade-in duration (ms). Default: 1000 */\n\tfadeInDuration?: number\n\n\t/** Fade-out duration (ms). Default: 8000 */\n\tfadeOutDuration?: number\n\n\t/** Opacity when idle/dimmed (0-1). Set to 0 to fully hide. Default: 0.6 */\n\tidleOpacity?: number\n\n\t/** Whether idle state continues breathing. Default: true */\n\tidleBreathe?: boolean\n\n\t/** Color temperature shift (-1 = cool/blue, 0 = neutral, 1 = warm/pink). Default: 0 */\n\ttemperature?: number\n\n\t/** Chromatic aberration intensity (0-1). Default: 1 */\n\tchromaticAberration?: number\n\n\t/** Number of quantum particles. Default: 8 */\n\tparticleCount?: number\n}\n\nconst DEFAULTS: Required<NebulaOptions> = {\n\tactive: true,\n\tautoHideDuration: 3000,\n\tbackground: true,\n\tintensity: 1,\n\tblur: 1,\n\tspeed: 1,\n\tfadeInDuration: 1000,\n\tfadeOutDuration: 8000,\n\tidleOpacity: 0.6,\n\tidleBreathe: true,\n\ttemperature: 0,\n\tchromaticAberration: 1,\n\tparticleCount: 30,\n}\n\n// =============================================================================\n// EASING CONSTANTS (cached, no function calls in hot path)\n// =============================================================================\n\nconst BREATHING_EASING = 'cubic-bezier(0.37, 0, 0.63, 1)'\nconst DRIFT_EASING = 'cubic-bezier(0.25, 0.1, 0.25, 1)'\n\n// =============================================================================\n// CSS KEYFRAMES (injected once per document)\n// =============================================================================\n\nlet stylesInjected = false\n\nfunction injectGlobalStyles(): void {\n\tif (stylesInjected || typeof document === 'undefined') return\n\tstylesInjected = true\n\n\tconst style = document.createElement('style')\n\tstyle.id = 'nebula-directive-styles'\n\tstyle.textContent = `\n/* =============================================================================\n NEBULA v3 - SURREAL DIMENSIONAL RIFT - GPU-COMPOSITED CSS ANIMATIONS\n Chromatic aberration, iridescent hue-cycling, event horizon, tendrils.\n Performance: translate3d + opacity for most layers, hue-rotate for core only.\n ============================================================================= */\n\n/* Chromatic red channel - rightward aberration drift */\n@keyframes nebula-chromatic-red {\n\t0%, 100% { transform: translate3d(var(--nebula-aberration, 3px), 0, 0); }\n\t25% { transform: translate3d(calc(var(--nebula-aberration, 3px) * 1.8), -1%, 0); }\n\t50% { transform: translate3d(var(--nebula-aberration, 3px), 1%, 0); }\n\t75% { transform: translate3d(calc(var(--nebula-aberration, 3px) * 0.5), 0, 0); }\n}\n\n/* Chromatic blue channel - leftward counter-drift */\n@keyframes nebula-chromatic-blue {\n\t0%, 100% { transform: translate3d(calc(var(--nebula-aberration, 3px) * -1), 0, 0); }\n\t25% { transform: translate3d(calc(var(--nebula-aberration, 3px) * -0.5), 1%, 0); }\n\t50% { transform: translate3d(calc(var(--nebula-aberration, 3px) * -1), -1%, 0); }\n\t75% { transform: translate3d(calc(var(--nebula-aberration, 3px) * -1.8), 0, 0); }\n}\n\n/* Iridescent core - continuous 360-degree hue rotation (the ONE filter animation) */\n@keyframes nebula-iridescent {\n\t0% { filter: hue-rotate(0deg) blur(var(--nebula-blur-core, 12px)) saturate(1.6); }\n\t100% { filter: hue-rotate(360deg) blur(var(--nebula-blur-core, 12px)) saturate(1.6); }\n}\n\n/* Bioluminescent tendrils - organic breathing */\n@keyframes nebula-tendrils-breathe {\n\t0%, 100% { opacity: 0.6; transform: translate3d(0, 0, 0); }\n\t30% { opacity: 0.9; transform: translate3d(1%, -1.5%, 0); }\n\t60% { opacity: 0.5; transform: translate3d(-1%, 1.5%, 0); }\n}\n\n/* Quantum particle twinkle - opacity only (cheapest) */\n@keyframes nebula-particle-twinkle {\n\t0%, 100% { opacity: 0.7; }\n\t15% { opacity: 1; }\n\t40% { opacity: 0.5; }\n\t65% { opacity: 0.85; }\n\t85% { opacity: 0.6; }\n}\n\n/* Idle breathing - gentle pulse when dimmed */\n@keyframes nebula-idle-breathe {\n\t0%, 100% {\n\t\topacity: var(--nebula-idle-opacity, 0.08);\n\t\tfilter: blur(calc(var(--nebula-blur-base, 10px) * 8));\n\t\ttransform: scale(1);\n\t}\n\t50% {\n\t\topacity: calc(var(--nebula-idle-opacity, 0.08) * 1.4);\n\t\tfilter: blur(calc(var(--nebula-blur-base, 10px) * 10));\n\t\ttransform: scale(1.005);\n\t}\n}\n\n/* =============================================================================\n STATE CLASSES - Control via CSS class toggle (no JS animation calls)\n ============================================================================= */\n\n.nebula-overlay {\n\tcontain: strict;\n\tpointer-events: none;\n\tisolation: isolate;\n}\n\n.nebula-overlay.paused .nebula-layer {\n\tanimation-play-state: paused !important;\n}\n\n.nebula-overlay.running .nebula-layer {\n\tanimation-play-state: running !important;\n}\n\n/* Reduced motion - respect user preferences */\n@media (prefers-reduced-motion: reduce) {\n\t.nebula-layer {\n\t\tanimation: none !important;\n\t\ttransition: opacity 0s !important;\n\t}\n}\n`\n\tdocument.head.appendChild(style)\n}\n\n// =============================================================================\n// STATE INTERFACE (simplified)\n// =============================================================================\n\ninterface State {\n\telement: HTMLElement\n\toverlay: HTMLElement | null\n\toriginalPosition: string\n\toriginalOverflow: string\n\toriginalContain: string\n\tisDimmed: boolean\n\tautoHideSub: Subscription | null\n\toptions: Required<NebulaOptions>\n\treducedMotion: boolean\n\tisVisible: boolean\n}\n\n// =============================================================================\n// SINGLETON COORDINATOR (optimized)\n// =============================================================================\n\nclass NebulaCoordinator {\n\tprivate static _instance: NebulaCoordinator | null = null\n\tprivate elementToDirective = new WeakMap<HTMLElement, NebulaDirective>()\n\tprivate instances = new Set<NebulaDirective>()\n\tprivate observer: IntersectionObserver | null = null\n\tprivate visibilitySub: Subscription | null = null\n\tprivate tabVisible = true\n\n\tstatic get instance(): NebulaCoordinator {\n\t\tif (!NebulaCoordinator._instance) {\n\t\t\tNebulaCoordinator._instance = new NebulaCoordinator()\n\t\t}\n\t\treturn NebulaCoordinator._instance\n\t}\n\n\tregister(dir: NebulaDirective, element: HTMLElement): void {\n\t\tconst wasEmpty = this.instances.size === 0\n\t\tthis.instances.add(dir)\n\t\tthis.elementToDirective.set(element, dir)\n\n\t\tif (wasEmpty) {\n\t\t\tthis.setup()\n\t\t}\n\n\t\tthis.observer?.observe(element)\n\t}\n\n\tunregister(dir: NebulaDirective, element: HTMLElement): void {\n\t\tthis.observer?.unobserve(element)\n\t\tthis.elementToDirective.delete(element)\n\t\tthis.instances.delete(dir)\n\n\t\tif (this.instances.size === 0) {\n\t\t\tthis.teardown()\n\t\t}\n\t}\n\n\tprivate setup(): void {\n\t\t// IntersectionObserver for element visibility\n\t\tthis.observer = new IntersectionObserver(\n\t\t\tentries => {\n\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\tconst dir = this.elementToDirective.get(entry.target as HTMLElement)\n\t\t\t\t\tif (dir) {\n\t\t\t\t\t\tdir.onVisibilityChange(entry.isIntersecting && this.tabVisible)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ threshold: 0 },\n\t\t)\n\n\t\t// Tab visibility - batch update via CSS class\n\t\tthis.visibilitySub = fromEvent(document, 'visibilitychange').pipe(\n\t\t\ttap(() => {\n\t\t\t\tthis.tabVisible = document.visibilityState === 'visible'\n\t\t\t\tfor (const dir of this.instances) {\n\t\t\t\t\tdir.onVisibilityChange(this.tabVisible)\n\t\t\t\t}\n\t\t\t}),\n\t\t).subscribe()\n\t}\n\n\tprivate teardown(): void {\n\t\tif (this.observer) {\n\t\t\tthis.observer.disconnect()\n\t\t\tthis.observer = null\n\t\t}\n\t\tif (this.visibilitySub) {\n\t\t\tthis.visibilitySub.unsubscribe()\n\t\t\tthis.visibilitySub = null\n\t\t}\n\t}\n}\n\n// =============================================================================\n// DIRECTIVE IMPLEMENTATION (optimized)\n// =============================================================================\n\nclass NebulaDirective extends AsyncDirective {\n\tprivate state: State | null = null\n\tprivate coordinator = NebulaCoordinator.instance\n\n\trender(_options?: NebulaOptions) {\n\t\treturn noChange\n\t}\n\n\toverride update(part: ElementPart, [options = {}]: [NebulaOptions?]) {\n\t\tconst element = part.element as HTMLElement\n\t\tconst opts = { ...DEFAULTS, ...options }\n\n\t\tif (opts.active) {\n\t\t\tthis.show(element, opts)\n\t\t} else {\n\t\t\tthis.hide(opts)\n\t\t}\n\n\t\treturn noChange\n\t}\n\n\t// Called by coordinator - toggles CSS class (no JS animation API calls)\n\tonVisibilityChange(isVisible: boolean): void {\n\t\tif (!this.state?.overlay) return\n\n\t\tconst wasVisible = this.state.isVisible\n\t\tthis.state.isVisible = isVisible\n\n\t\tif (wasVisible !== isVisible) {\n\t\t\tthis.state.overlay.classList.toggle('paused', !isVisible)\n\t\t\tthis.state.overlay.classList.toggle('running', isVisible)\n\t\t}\n\t}\n\n\tprivate show(element: HTMLElement, opts: Required<NebulaOptions>): void {\n\t\tinjectGlobalStyles()\n\n\t\t// Clear any pending auto-hide\n\t\tif (this.state?.autoHideSub) {\n\t\t\tthis.state.autoHideSub.unsubscribe()\n\t\t\tthis.state.autoHideSub = null\n\t\t}\n\n\t\tconst reducedMotion = reducedMotion$.value\n\n\t\t// If already showing but dimmed, reawaken\n\t\tif (this.state?.overlay && this.state.isDimmed) {\n\t\t\tthis.state.isDimmed = false\n\t\t\tthis.state.options = opts\n\t\t\tthis.awakenOverlay(opts, reducedMotion)\n\t\t\tthis.scheduleAutoHide(opts)\n\t\t\treturn\n\t\t}\n\n\t\t// Already showing and active\n\t\tif (this.state?.overlay) {\n\t\t\tthis.scheduleAutoHide(opts)\n\t\t\treturn\n\t\t}\n\n\t\t// Create new overlay\n\t\tthis.createOverlay(element, opts, reducedMotion)\n\t\tthis.scheduleAutoHide(opts)\n\t}\n\n\tprivate awakenOverlay(opts: Required<NebulaOptions>, reducedMotion: boolean): void {\n\t\tif (!this.state?.overlay) return\n\n\t\tconst overlay = this.state.overlay\n\t\tconst awakenDuration = reducedMotion ? 0 : opts.fadeInDuration * 0.6\n\t\tconst easing = reducedMotion ? 'linear' : getEasing(SPRING_SMOOTH)\n\n\t\t// Update CSS custom properties\n\t\toverlay.style.setProperty('--nebula-intensity', String(opts.intensity))\n\n\t\toverlay.animate(\n\t\t\t[\n\t\t\t\t{ opacity: opts.idleOpacity, transform: 'scale(0.98)', filter: `blur(${4 * opts.blur}px)` },\n\t\t\t\t{ opacity: opts.intensity * 0.7, transform: 'scale(1.01)', filter: `blur(${1 * opts.blur}px)` },\n\t\t\t\t{ opacity: opts.intensity, transform: 'scale(1)', filter: 'blur(0px)' },\n\t\t\t] as Keyframe[],\n\t\t\t{\n\t\t\t\tduration: awakenDuration,\n\t\t\t\teasing,\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t)\n\n\t\t// Resume CSS animations\n\t\toverlay.classList.remove('paused')\n\t\toverlay.classList.add('running')\n\t}\n\n\tprivate createOverlay(element: HTMLElement, opts: Required<NebulaOptions>, reducedMotion: boolean): void {\n\t\tconst computedStyle = window.getComputedStyle(element)\n\t\tconst computedPosition = computedStyle.position\n\n\t\tconst originalPosition = element.style.position\n\t\tconst originalOverflow = element.style.overflow\n\t\tconst originalContain = element.style.contain\n\n\t\tif (computedPosition === 'static') {\n\t\t\telement.style.position = 'relative'\n\t\t}\n\t\telement.style.overflow = 'hidden'\n\t\telement.style.contain = 'paint'\n\n\t\t// =====================================================================\n\t\t// SURREAL DIMENSIONAL RIFT - Color Palette\n\t\t// Temperature shifts the balance between warm (pink/magenta) and cool (blue/cyan)\n\t\t// Opacities kept subdued for dark, moody aesthetic\n\t\t// =====================================================================\n\t\tconst temp = opts.temperature\n\t\tconst warmShift = Math.max(0, temp)\n\t\tconst coolShift = Math.max(0, -temp)\n\t\tconst I = opts.intensity // shorthand\n\t\tconst aberrationPx = Math.round(3 + opts.chromaticAberration * 5)\n\n\t\t// Surreal palette\n\t\tconst red = { r: 255, g: Math.round(20 + coolShift * 60), b: Math.round(80 + coolShift * 80) }\n\t\tconst blue = { r: Math.round(20 + warmShift * 80), g: 100, b: Math.round(255 - warmShift * 55) }\n\t\tconst pink = { r: 255, g: Math.round(100 + coolShift * 100), b: 200 }\n\t\tconst cyan = { r: Math.round(warmShift * 100), g: Math.round(255 - warmShift * 55), b: 200 }\n\t\tconst magenta = { r: 255, g: Math.round(100 + coolShift * 55), b: Math.round(255 - coolShift * 55) }\n\n\t\t// === CONTAINER ===\n\t\tconst overlay = document.createElement('div')\n\t\toverlay.className = 'nebula-overlay running'\n\t\tObject.assign(overlay.style, {\n\t\t\tposition: 'absolute',\n\t\t\tinset: '-20%',\n\t\t\tzIndex: opts.background ? '-1' : '9999',\n\t\t\topacity: '0',\n\t\t\t'--nebula-intensity': String(I),\n\t\t\t'--nebula-blur-base': `${opts.blur * 10}px`,\n\t\t\t'--nebula-idle-opacity': String(opts.idleOpacity),\n\t\t\t'--nebula-aberration': `${aberrationPx}px`,\n\t\t\t'--nebula-blur-core': `${12 * opts.blur}px`,\n\t\t})\n\n\t\tif (reducedMotion) {\n\t\t\t// Static surreal rift - no animation, same palette\n\t\t\tconst simpleLayer = document.createElement('div')\n\t\t\tObject.assign(simpleLayer.style, {\n\t\t\t\tposition: 'absolute',\n\t\t\t\tinset: '0',\n\t\t\t\tbackground: `\n\t\t\t\t\tradial-gradient(ellipse 45% 40% at 50% 50%,\n\t\t\t\t\t\trgba(${magenta.r},${magenta.g},${magenta.b},${0.12 * I}) 0%,\n\t\t\t\t\t\trgba(${blue.r},${blue.g},${blue.b},${0.06 * I}) 40%,\n\t\t\t\t\t\ttransparent 70%),\n\t\t\t\t\tradial-gradient(circle 8% at 50% 50%,\n\t\t\t\t\t\trgba(255,255,255,${0.15 * I}) 0%,\n\t\t\t\t\t\ttransparent 100%)`,\n\t\t\t\tfilter: `blur(${10 * opts.blur}px)`,\n\t\t\t\topacity: String(I),\n\t\t\t})\n\t\t\toverlay.appendChild(simpleLayer)\n\t\t} else {\n\t\t\t// === LAYER 1: Cosmic Dust + Void (STATIC — zero animation cost) ===\n\t\t\t// Dark filaments, vignette, and void pockets merged into one multiply layer\n\t\t\tconst dustLayer = document.createElement('div')\n\t\t\tdustLayer.className = 'nebula-layer'\n\t\t\tObject.assign(dustLayer.style, {\n\t\t\t\tposition: 'absolute',\n\t\t\t\tinset: '-5%',\n\t\t\t\tbackground: `\n\t\t\t\t\tlinear-gradient(155deg,\n\t\t\t\t\t\ttransparent 0%, transparent 38%,\n\t\t\t\t\t\trgba(8,2,18,${0.35 * I}) 44%,\n\t\t\t\t\t\trgba(0,0,0,${0.4 * I}) 49%,\n\t\t\t\t\t\trgba(8,2,18,${0.35 * I}) 54%,\n\t\t\t\t\t\ttransparent 60%, transparent 100%),\n\t\t\t\t\tlinear-gradient(225deg,\n\t\t\t\t\t\ttransparent 0%, transparent 42%,\n\t\t\t\t\t\trgba(5,0,12,${0.28 * I}) 47%,\n\t\t\t\t\t\trgba(0,0,0,${0.32 * I}) 50%,\n\t\t\t\t\t\trgba(5,0,12,${0.28 * I}) 53%,\n\t\t\t\t\t\ttransparent 58%, transparent 100%),\n\t\t\t\t\tradial-gradient(ellipse 110% 110% at 50% 50%,\n\t\t\t\t\t\ttransparent 35%,\n\t\t\t\t\t\trgba(3,0,8,${0.2 * I}) 60%,\n\t\t\t\t\t\trgba(0,0,0,${0.35 * I}) 85%),\n\t\t\t\t\tradial-gradient(ellipse 50% 45% at 30% 35%,\n\t\t\t\t\t\trgba(0,0,0,${0.3 * I}) 0%,\n\t\t\t\t\t\ttransparent 65%),\n\t\t\t\t\tradial-gradient(ellipse 40% 55% at 70% 65%,\n\t\t\t\t\t\trgba(0,0,0,${0.25 * I}) 0%,\n\t\t\t\t\t\ttransparent 60%)`,\n\t\t\t\tfilter: `blur(${4 * opts.blur}px)`,\n\t\t\t\tmixBlendMode: 'multiply',\n\t\t\t\ttransform: 'translateZ(0)',\n\t\t\t\t// NO animation — static structure for zero ongoing cost\n\t\t\t})\n\t\t\toverlay.appendChild(dustLayer)\n\n\t\t\t// === LAYER 2: Chromatic Red channel — aberration shifted right ===\n\t\t\tconst chromaticRed = document.createElement('div')\n\t\t\tchromaticRed.className = 'nebula-layer'\n\t\t\tObject.assign(chromaticRed.style, {\n\t\t\t\tposition: 'absolute',\n\t\t\t\tinset: '-15%',\n\t\t\t\tbackground: `\n\t\t\t\t\tradial-gradient(ellipse 55% 50% at 48% 50%,\n\t\t\t\t\t\trgba(${red.r},${red.g},${red.b},${0.14 * I}) 0%,\n\t\t\t\t\t\trgba(${red.r},${red.g},${red.b},${0.06 * I}) 35%,\n\t\t\t\t\t\ttransparent 65%),\n\t\t\t\t\tradial-gradient(ellipse 30% 35% at 30% 35%,\n\t\t\t\t\t\trgba(${pink.r},${pink.g},${pink.b},${0.1 * I}) 0%,\n\t\t\t\t\t\trgba(${pink.r},${pink.g},${pink.b},${0.03 * I}) 50%,\n\t\t\t\t\t\ttransparent 70%),\n\t\t\t\t\tradial-gradient(ellipse 25% 30% at 65% 70%,\n\t\t\t\t\t\trgba(${red.r},${Math.min(255, red.g + 30)},${red.b},${0.08 * I}) 0%,\n\t\t\t\t\t\ttransparent 60%)`,\n\t\t\t\tfilter: `blur(${18 * opts.blur}px) saturate(1.4)`,\n\t\t\t\tmixBlendMode: 'screen',\n\t\t\t\ttransform: 'translateZ(0)',\n\t\t\t\tanimation: `nebula-chromatic-red ${35000 / opts.speed}ms ${DRIFT_EASING} infinite`,\n\t\t\t})\n\t\t\toverlay.appendChild(chromaticRed)\n\n\t\t\t// === LAYER 3: Chromatic Blue channel — aberration shifted left ===\n\t\t\tconst chromaticBlue = document.createElement('div')\n\t\t\tchromaticBlue.className = 'nebula-layer'\n\t\t\tObject.assign(chromaticBlue.style, {\n\t\t\t\tposition: 'absolute',\n\t\t\t\tinset: '-15%',\n\t\t\t\tbackground: `\n\t\t\t\t\tradial-gradient(ellipse 50% 55% at 52% 50%,\n\t\t\t\t\t\trgba(${blue.r},${blue.g},${blue.b},${0.12 * I}) 0%,\n\t\t\t\t\t\trgba(${blue.r},${blue.g},${blue.b},${0.05 * I}) 35%,\n\t\t\t\t\t\ttransparent 60%),\n\t\t\t\t\tradial-gradient(ellipse 35% 30% at 68% 40%,\n\t\t\t\t\t\trgba(${cyan.r},${cyan.g},${cyan.b},${0.09 * I}) 0%,\n\t\t\t\t\t\trgba(${cyan.r},${cyan.g},${cyan.b},${0.03 * I}) 45%,\n\t\t\t\t\t\ttransparent 65%),\n\t\t\t\t\tradial-gradient(ellipse 28% 25% at 35% 65%,\n\t\t\t\t\t\trgba(${blue.r},${blue.g},${Math.min(255, blue.b + 20)},${0.07 * I}) 0%,\n\t\t\t\t\t\ttransparent 55%)`,\n\t\t\t\tfilter: `blur(${18 * opts.blur}px) saturate(1.4)`,\n\t\t\t\tmixBlendMode: 'screen',\n\t\t\t\ttransform: 'translateZ(0)',\n\t\t\t\tanimation: `nebula-chromatic-blue ${35000 / opts.speed}ms ${DRIFT_EASING} infinite`,\n\t\t\t})\n\t\t\toverlay.appendChild(chromaticBlue)\n\n\t\t\t// === LAYER 4: Iridescent Core + Event Horizon ===\n\t\t\t// The ONE layer with filter animation (hue-rotate) — essential for iridescence\n\t\t\tconst iridescentLayer = document.createElement('div')\n\t\t\tiridescentLayer.className = 'nebula-layer'\n\t\t\tObject.assign(iridescentLayer.style, {\n\t\t\t\tposition: 'absolute',\n\t\t\t\tinset: '0',\n\t\t\t\tbackground: `\n\t\t\t\t\tradial-gradient(ellipse 20% 22% at 50% 50%,\n\t\t\t\t\t\trgba(${magenta.r},${magenta.g},${magenta.b},${0.18 * I}) 0%,\n\t\t\t\t\t\trgba(${pink.r},${pink.g},${pink.b},${0.08 * I}) 40%,\n\t\t\t\t\t\trgba(${blue.r},${blue.g},${blue.b},${0.03 * I}) 65%,\n\t\t\t\t\t\ttransparent 80%),\n\t\t\t\t\tradial-gradient(circle 6% at 50% 50%,\n\t\t\t\t\t\trgba(255,255,255,${0.25 * I}) 0%,\n\t\t\t\t\t\trgba(255,240,245,${0.1 * I}) 50%,\n\t\t\t\t\t\ttransparent 100%)`,\n\t\t\t\tmixBlendMode: 'screen',\n\t\t\t\ttransform: 'translateZ(0)',\n\t\t\t\t// hue-rotate is the core visual — continuous 360deg cycle\n\t\t\t\tanimation: `nebula-iridescent ${28000 / opts.speed}ms linear infinite`,\n\t\t\t})\n\t\t\toverlay.appendChild(iridescentLayer)\n\n\t\t\t// === LAYER 5: Bioluminescent Tendrils — organic breathing gas wisps ===\n\t\t\tconst tendrilLayer = document.createElement('div')\n\t\t\ttendrilLayer.className = 'nebula-layer'\n\t\t\tObject.assign(tendrilLayer.style, {\n\t\t\t\tposition: 'absolute',\n\t\t\t\tinset: '-12%',\n\t\t\t\tbackground: `\n\t\t\t\t\tradial-gradient(ellipse 60% 12% at 50% 48%,\n\t\t\t\t\t\trgba(${pink.r},${pink.g},${pink.b},${0.1 * I}) 0%,\n\t\t\t\t\t\ttransparent 70%),\n\t\t\t\t\tradial-gradient(ellipse 12% 55% at 48% 50%,\n\t\t\t\t\t\trgba(${cyan.r},${cyan.g},${cyan.b},${0.08 * I}) 0%,\n\t\t\t\t\t\ttransparent 65%),\n\t\t\t\t\tradial-gradient(ellipse 45% 10% at 45% 35%,\n\t\t\t\t\t\trgba(${magenta.r},${magenta.g},${magenta.b},${0.07 * I}) 0%,\n\t\t\t\t\t\ttransparent 60%),\n\t\t\t\t\tradial-gradient(ellipse 10% 40% at 60% 60%,\n\t\t\t\t\t\trgba(${blue.r},${blue.g},${blue.b},${0.06 * I}) 0%,\n\t\t\t\t\t\ttransparent 55%)`,\n\t\t\t\tfilter: `blur(${14 * opts.blur}px)`,\n\t\t\t\tmixBlendMode: 'screen',\n\t\t\t\ttransform: 'translateZ(0)',\n\t\t\t\tanimation: `nebula-tendrils-breathe ${22000 / opts.speed}ms ${BREATHING_EASING} infinite`,\n\t\t\t})\n\t\t\toverlay.appendChild(tendrilLayer)\n\n\t\t\t// === LAYER 6: Quantum Particles — scattered hue-shifting dots ===\n\t\t\tif (opts.particleCount > 0) {\n\t\t\t\tconst particleLayer = document.createElement('div')\n\t\t\t\tparticleLayer.className = 'nebula-layer'\n\n\t\t\t\tconst particleGradients: string[] = []\n\t\t\t\tfor (let i = 0; i < opts.particleCount; i++) {\n\t\t\t\t\tconst x = 5 + Math.random() * 90\n\t\t\t\t\tconst y = 5 + Math.random() * 90\n\t\t\t\t\tconst size = 0.5 + Math.random() * 2\n\t\t\t\t\tconst hue = Math.round(Math.random() * 360)\n\t\t\t\t\tconst alpha = (0.3 + Math.random() * 0.5) * I\n\n\t\t\t\t\tparticleGradients.push(\n\t\t\t\t\t\t`radial-gradient(circle ${size}px at ${x}% ${y}%, hsla(${hue},80%,70%,${alpha}) 0%, transparent 100%)`,\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tObject.assign(particleLayer.style, {\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\tinset: '0',\n\t\t\t\t\tbackground: particleGradients.join(','),\n\t\t\t\t\tmixBlendMode: 'screen',\n\t\t\t\t\ttransform: 'translateZ(0)',\n\t\t\t\t\tanimation: `nebula-particle-twinkle ${5000 / opts.speed}ms ${BREATHING_EASING} infinite`,\n\t\t\t\t})\n\t\t\t\toverlay.appendChild(particleLayer)\n\t\t\t}\n\t\t}\n\n\t\telement.appendChild(overlay)\n\n\t\t// Entrance animation with spring physics\n\t\tconst fadeInDuration = reducedMotion ? 0 : opts.fadeInDuration\n\t\tconst entranceEasing = reducedMotion ? 'linear' : getEasing(SPRING_SMOOTH)\n\n\t\toverlay.animate(\n\t\t\t[\n\t\t\t\t{ opacity: 0, transform: 'scale(0.85)', filter: `blur(${25 * opts.blur}px) saturate(0.5)` },\n\t\t\t\t{ opacity: opts.intensity * 0.3, transform: 'scale(0.95)', filter: `blur(${12 * opts.blur}px) saturate(0.8)` },\n\t\t\t\t{ opacity: opts.intensity * 0.6, transform: 'scale(1.02)', filter: `blur(${4 * opts.blur}px) saturate(1.1)` },\n\t\t\t\t{ opacity: opts.intensity * 0.85, transform: 'scale(1.005)', filter: `blur(${1 * opts.blur}px) saturate(1.05)` },\n\t\t\t\t{ opacity: opts.intensity, transform: 'scale(1)', filter: 'blur(0px) saturate(1)' },\n\t\t\t] as Keyframe[],\n\t\t\t{\n\t\t\t\tduration: fadeInDuration,\n\t\t\t\teasing: entranceEasing,\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t)\n\n\t\tthis.state = {\n\t\t\telement,\n\t\t\toverlay,\n\t\t\toriginalPosition,\n\t\t\toriginalOverflow,\n\t\t\toriginalContain,\n\t\t\tisDimmed: false,\n\t\t\tautoHideSub: null,\n\t\t\toptions: opts,\n\t\t\treducedMotion,\n\t\t\tisVisible: document.visibilityState === 'visible',\n\t\t}\n\n\t\tthis.coordinator.register(this, element)\n\t}\n\n\tprivate scheduleAutoHide(opts: Required<NebulaOptions>): void {\n\t\tif (!this.state || opts.autoHideDuration <= 0) return\n\n\t\tthis.state.autoHideSub = timer(opts.autoHideDuration).pipe(\n\t\t\ttake(1),\n\t\t\ttap(() => {\n\t\t\t\tif (this.state) {\n\t\t\t\t\tthis.state.autoHideSub = null\n\t\t\t\t\tthis.hide(this.state.options)\n\t\t\t\t}\n\t\t\t}),\n\t\t).subscribe()\n\t}\n\n\tprivate hide(opts: Required<NebulaOptions>): void {\n\t\tif (!this.state?.overlay) return\n\n\t\t// Clear any pending auto-hide\n\t\tif (this.state.autoHideSub) {\n\t\t\tthis.state.autoHideSub.unsubscribe()\n\t\t\tthis.state.autoHideSub = null\n\t\t}\n\n\t\tif (this.state.isDimmed) return\n\n\t\tthis.state.isDimmed = true\n\t\tconst overlay = this.state.overlay\n\t\tconst currentOpts = this.state.options\n\t\tconst reducedMotion = this.state.reducedMotion\n\n\t\tconst fadeOutDuration = reducedMotion ? 0 : opts.fadeOutDuration\n\t\tconst exitEasing = reducedMotion ? 'linear' : getEasing(SPRING_GENTLE)\n\n\t\t// Full hide (idleOpacity = 0)\n\t\tif (opts.idleOpacity <= 0) {\n\t\t\toverlay.animate(\n\t\t\t\t[\n\t\t\t\t\t{ opacity: currentOpts.intensity, transform: 'scale(1)', filter: 'blur(0px) saturate(1)' },\n\t\t\t\t\t{ opacity: currentOpts.intensity * 0.4, transform: 'scale(0.95)', filter: `blur(${8 * currentOpts.blur}px) saturate(0.7)` },\n\t\t\t\t\t{ opacity: 0, transform: 'scale(0.9)', filter: `blur(${15 * currentOpts.blur}px) saturate(0.3)` },\n\t\t\t\t] as Keyframe[],\n\t\t\t\t{\n\t\t\t\t\tduration: fadeOutDuration,\n\t\t\t\t\teasing: exitEasing,\n\t\t\t\t\tfill: 'forwards',\n\t\t\t\t},\n\t\t\t)\n\t\t\treturn\n\t\t}\n\n\t\t// Fade to idle with CSS animation for breathing\n\t\tconst fadeDown = overlay.animate(\n\t\t\t[\n\t\t\t\t{ opacity: currentOpts.intensity, transform: 'scale(1)', filter: 'blur(0px) saturate(1)' },\n\t\t\t\t{ opacity: currentOpts.intensity * 0.5, transform: 'scale(0.99)', filter: `blur(${3 * currentOpts.blur}px) saturate(0.75)` },\n\t\t\t\t{ opacity: opts.idleOpacity, transform: 'scale(1)', filter: `blur(${8 * currentOpts.blur}px) saturate(0.4)` },\n\t\t\t] as Keyframe[],\n\t\t\t{\n\t\t\t\tduration: fadeOutDuration,\n\t\t\t\teasing: exitEasing,\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t)\n\n\t\t// Switch to CSS animation for idle breathing (more efficient)\n\t\tif (opts.idleBreathe && !reducedMotion) {\n\t\t\tfrom(fadeDown.finished).pipe(\n\t\t\t\ttake(1),\n\t\t\t\tcatchError(() => EMPTY),\n\t\t\t).subscribe(() => {\n\t\t\t\tif (this.state?.overlay) {\n\t\t\t\t\t// Use pure CSS animation for idle - no JS overhead\n\t\t\t\t\tthis.state.overlay.style.animation = `nebula-idle-breathe ${12000 / currentOpts.speed}ms ${BREATHING_EASING} infinite`\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate cleanup(): void {\n\t\tif (!this.state) return\n\n\t\tthis.coordinator.unregister(this, this.state.element)\n\n\t\tthis.state.autoHideSub?.unsubscribe()\n\n\t\tthis.state.overlay?.remove()\n\t\tthis.state.element.style.position = this.state.originalPosition\n\t\tthis.state.element.style.overflow = this.state.originalOverflow\n\t\tthis.state.element.style.contain = this.state.originalContain\n\t\tthis.state = null\n\t}\n\n\toverride disconnected(): void {\n\t\tthis.cleanup()\n\t}\n\n\toverride reconnected(): void {\n\t\t// Re-register with coordinator if state exists\n\t\tif (this.state) {\n\t\t\tthis.coordinator.register(this, this.state.element)\n\t\t}\n\t}\n}\n\nexport const nebula = directive(NebulaDirective)\n","/**\n * Reveal Directive - Animated show/hide with zero layout shift\n *\n * Uses Blackbird spring physics for natural, organic motion.\n * Element stays in DOM to prevent layout shift.\n *\n * Usage:\n * ```ts\n * // Basic - uses 'smooth' preset\n * html`<div ${reveal(this.isVisible)}>Content</div>`\n *\n * // With preset - 'snappy' for quick interactions\n * html`<div ${reveal(this.isVisible, { preset: 'snappy' })}>Content</div>`\n *\n * // With custom max height\n * html`<div ${reveal(this.items.length > 1, { maxHeight: '200px' })}>Content</div>`\n *\n * // Bouncy for playful UI\n * html`<div ${reveal(this.showCelebration, { preset: 'bouncy' })}>🎉 Congrats!</div>`\n * ```\n *\n * Presets:\n * - 'smooth' (default): Apple-style, subtle overshoot - 500ms\n * - 'snappy': Quick with minimal overshoot - 300ms\n * - 'bouncy': Playful with noticeable overshoot - 600ms\n * - 'gentle': Slow, smooth, no overshoot - 700ms\n *\n * @see packages/schmancy/src/utils/animation.ts for Blackbird system\n */\n\nimport { noChange } from 'lit'\nimport { AsyncDirective, directive } from 'lit/async-directive.js'\nimport type { ElementPart, PartInfo } from 'lit/directive.js'\nimport { PartType } from 'lit/directive.js'\nimport {\n\tSPRING_SMOOTH,\n\tSPRING_SNAPPY,\n\tSPRING_BOUNCY,\n\tSPRING_GENTLE,\n\tgetEasing,\n\ttype AnimationPreset,\n} from '../utils/animation'\nimport { reducedMotion$ } from './reduced-motion'\n\nexport type RevealPreset = 'smooth' | 'snappy' | 'bouncy' | 'gentle'\n\nexport interface RevealOptions {\n\t/** Animation preset (default: 'smooth') */\n\tpreset?: RevealPreset\n\t/** Max height when revealed (default: '10rem') */\n\tmaxHeight?: string\n\t/** Custom duration override in ms (uses preset duration if not specified) */\n\tduration?: number\n\t/** Custom easing override (uses preset easing if not specified) */\n\teasing?: string\n}\n\nconst PRESETS: Record<RevealPreset, AnimationPreset> = {\n\tsmooth: SPRING_SMOOTH,\n\tsnappy: SPRING_SNAPPY,\n\tbouncy: SPRING_BOUNCY,\n\tgentle: SPRING_GENTLE,\n}\n\nclass RevealDirective extends AsyncDirective {\n\tprivate initialized = false\n\tprivate element: HTMLElement | null = null\n\n\tconstructor(partInfo: PartInfo) {\n\t\tsuper(partInfo)\n\t\tif (partInfo.type !== PartType.ELEMENT) {\n\t\t\tthrow new Error('reveal() can only be used on elements')\n\t\t}\n\t}\n\n\trender(_show?: boolean, _options?: RevealOptions) {\n\t\treturn noChange\n\t}\n\n\toverride update(part: ElementPart, [show = false, options = {}]: [boolean | undefined, RevealOptions?]) {\n\t\tconst element = part.element as HTMLElement\n\t\tthis.element = element\n\n\t\tconst { preset = 'smooth', maxHeight = '10rem', duration, easing } = options\n\n\t\t// Get the preset configuration\n\t\tconst presetConfig = PRESETS[preset]\n\n\t\t// Determine actual duration and easing\n\t\tconst actualDuration = duration ?? presetConfig.duration\n\t\tconst actualEasing = easing ?? getEasing(presetConfig)\n\n\t\tconst reducedMotion = reducedMotion$.value\n\n\t\t// Set up transitions on first run or when preset changes\n\t\tif (!this.initialized) {\n\t\t\tthis.setupElement(element, actualDuration, actualEasing, reducedMotion)\n\t\t\tthis.initialized = true\n\t\t}\n\n\t\t// Apply show/hide styles with spring physics\n\t\tif (show) {\n\t\t\telement.style.maxHeight = maxHeight\n\t\t\telement.style.opacity = '1'\n\t\t\telement.style.transform = 'translateY(0) scale(1)'\n\t\t\telement.style.pointerEvents = ''\n\t\t\telement.style.paddingTop = ''\n\t\t\telement.style.paddingBottom = ''\n\t\t\telement.style.marginTop = ''\n\t\t\telement.style.marginBottom = ''\n\t\t\telement.removeAttribute('aria-hidden')\n\t\t\telement.removeAttribute('inert')\n\t\t} else {\n\t\t\telement.style.maxHeight = '0'\n\t\t\telement.style.opacity = '0'\n\t\t\telement.style.transform = 'translateY(-8px) scale(0.98)'\n\t\t\telement.style.pointerEvents = 'none'\n\t\t\telement.style.paddingTop = '0'\n\t\t\telement.style.paddingBottom = '0'\n\t\t\telement.style.marginTop = '0'\n\t\t\telement.style.marginBottom = '0'\n\t\t\telement.setAttribute('aria-hidden', 'true')\n\t\t\telement.setAttribute('inert', '')\n\t\t}\n\n\t\treturn noChange\n\t}\n\n\tprivate setupElement(element: HTMLElement, duration: number, easing: string, reducedMotion: boolean): void {\n\t\telement.style.overflow = 'hidden'\n\n\t\tif (reducedMotion) {\n\t\t\t// Instant transitions for reduced motion\n\t\t\telement.style.transition = 'none'\n\t\t} else {\n\t\t\t// Spring physics transitions — include padding/margin so hidden elements take zero space\n\t\t\telement.style.transition = [\n\t\t\t\t`max-height ${duration}ms ${easing}`,\n\t\t\t\t`opacity ${duration}ms ${easing}`,\n\t\t\t\t`transform ${duration}ms ${easing}`,\n\t\t\t\t`padding ${duration}ms ${easing}`,\n\t\t\t\t`margin ${duration}ms ${easing}`,\n\t\t\t].join(', ')\n\t\t}\n\t}\n\n\toverride disconnected(): void {\n\t\tif (this.element) {\n\t\t\tthis.element.style.willChange = ''\n\t\t}\n\t}\n\n\toverride reconnected(): void {\n\t\t// State preserved in inline styles — no action needed\n\t}\n}\n\nexport const reveal = directive(RevealDirective)\n","import { directive, type ElementPart, PartType } from 'lit/directive.js'\nimport { AsyncDirective } from 'lit/async-directive.js'\nimport { fromEvent, Subject } from 'rxjs'\nimport { take, takeUntil } from 'rxjs/operators'\n\n// Shared style — single injection for all ripple instances\nlet rippleStyleInjected = false\nfunction ensureRippleStyle() {\n\tif (rippleStyleInjected) return\n\tconst style = document.createElement('style')\n\tstyle.id = 'schmancy-ripple-shared'\n\tstyle.textContent = `\n\t\t.schmancy-ripple-effect {\n\t\t\tposition: absolute;\n\t\t\tborder-radius: 50%;\n\t\t\tbackground: var(--schmancy-sys-color-surface-on);\n\t\t\topacity: 0.12;\n\t\t\ttransform: scale(0);\n\t\t\tanimation: schmancy-ripple-expand 600ms linear forwards;\n\t\t\tpointer-events: none;\n\t\t\taria-hidden: true;\n\t\t}\n\t\t@keyframes schmancy-ripple-expand {\n\t\t\tto { transform: scale(4); opacity: 0; }\n\t\t}\n\t`\n\tdocument.head.appendChild(style)\n\trippleStyleInjected = true\n}\n\n/**\n * Ripple directive — Material-style ink ripple on click.\n *\n * @example\n * ```html\n * <div ${ripple()}>Click me</div>\n * ```\n */\nclass RippleDirective extends AsyncDirective {\n\tprivate element!: HTMLElement\n\tprivate readonly teardown$ = new Subject<void>()\n\n\trender() {\n\t\treturn undefined\n\t}\n\n\toverride update(part: ElementPart) {\n\t\tif (part.type !== PartType.ELEMENT) {\n\t\t\tthrow new Error('ripple directive must be used on an element')\n\t\t}\n\n\t\tthis.element = part.element as HTMLElement\n\t\tensureRippleStyle()\n\n\t\t// Ensure positioning context\n\t\tconst pos = getComputedStyle(this.element).position\n\t\tif (pos === 'static') {\n\t\t\tthis.element.style.position = 'relative'\n\t\t}\n\t\tthis.element.style.overflow = 'hidden'\n\n\t\tthis.teardown$.next()\n\n\t\tfromEvent<MouseEvent>(this.element, 'click').pipe(\n\t\t\ttakeUntil(this.teardown$),\n\t\t).subscribe(e => this.addRipple(e))\n\n\t\treturn undefined\n\t}\n\n\toverride reconnected() {\n\t\tthis.teardown$.next()\n\t\tfromEvent<MouseEvent>(this.element, 'click').pipe(\n\t\t\ttakeUntil(this.teardown$),\n\t\t).subscribe(e => this.addRipple(e))\n\t}\n\n\tprivate addRipple(event: MouseEvent) {\n\t\tconst rect = this.element.getBoundingClientRect()\n\t\tconst diameter = Math.max(rect.width, rect.height)\n\t\tconst radius = diameter / 2\n\n\t\tconst circle = document.createElement('span')\n\t\tcircle.className = 'schmancy-ripple-effect'\n\t\tcircle.setAttribute('aria-hidden', 'true')\n\t\tcircle.style.width = `${diameter}px`\n\t\tcircle.style.height = `${diameter}px`\n\t\tcircle.style.left = `${event.clientX - rect.left - radius}px`\n\t\tcircle.style.top = `${event.clientY - rect.top - radius}px`\n\n\t\tthis.element.appendChild(circle)\n\n\t\t// Remove after animation completes\n\t\tfromEvent(circle, 'animationend').pipe(take(1)).subscribe(() => circle.remove())\n\t}\n\n\toverride disconnected() {\n\t\tthis.teardown$.next()\n\t}\n}\n\nexport const ripple = directive(RippleDirective)\n","import { noChange } from 'lit'\nimport { AsyncDirective, directive } from 'lit/async-directive.js'\nimport { ElementPart, PartType } from 'lit/directive.js'\nimport { Subject, debounceTime, filter, fromEvent, takeUntil } from 'rxjs'\n\n/**\n * Detail payload for the directive's enriched `scroll` event.\n */\nexport interface OverflowWithinEvent\n\textends CustomEvent<{\n\t\tscrollTop: number\n\t\tscrollHeight: number\n\t\tclientHeight: number\n\t\tscrollLeft: number\n\t\tscrollWidth: number\n\t\tclientWidth: number\n\t\te: Event\n\t}> {}\n\n/**\n * Detail payload for the global `@schmancy:scrollTo` command.\n */\nexport interface OverflowWithinCommandEvent\n\textends CustomEvent<{\n\t\tname: string\n\t\taction: 'scrollTo'\n\t\ttop: number\n\t\tleft?: number\n\t}> {}\n\nexport interface OverflowWithinOptions {\n\t/** Hide native scrollbars while keeping scroll behavior intact. */\n\thide?: boolean\n\t/** Which axis can scroll. Default `'both'`. */\n\tdirection?: 'vertical' | 'horizontal' | 'both'\n\t/**\n\t * Optional name for cross-component control via the global\n\t * `@schmancy:scrollTo` event.\n\t */\n\tname?: string\n\t/** Debounce in ms for the dispatched `scroll` event. Default `10`. */\n\tdebounce?: number\n}\n\nconst SCROLLBAR_HIDE_CLASS = 'schmancy-overflow-within-hidden'\nlet stylesheetInstalled = false\n\nfunction installHideStylesheet() {\n\tif (stylesheetInstalled) return\n\tstylesheetInstalled = true\n\tconst sheet = new CSSStyleSheet()\n\tsheet.replaceSync(\n\t\t`.${SCROLLBAR_HIDE_CLASS} { scrollbar-width: none; -ms-overflow-style: none; }\n\t\t .${SCROLLBAR_HIDE_CLASS}::-webkit-scrollbar { display: none; }`,\n\t)\n\tdocument.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet]\n}\n\n/**\n * overflowWithin directive — turns any element into a contained overflow\n * boundary. Content stays *within* the element; what overflows scrolls\n * inside, can't escape (overscroll contained, rubber-band suppressed).\n *\n * - Overflow per `direction` axis\n * - Smooth scroll-behavior\n * - Overscroll containment (no rubber-band escape)\n * - Optional hidden scrollbar via a document-level stylesheet\n * - Debounced enriched `scroll` event\n * - Global `@schmancy:scrollTo` command listener (when `name` is set)\n * - min-height / min-width 0 so the container can clip inside grid/flex cells\n *\n * Apply at the element where overflow should be contained; the consumer's\n * layout grid/flex container can itself be the overflow boundary — no\n * wrapper element needed.\n *\n * @example\n * render() {\n * return html`\n * <div class=\"grid grid-rows-[auto_1fr]\" ${overflowWithin({ hide: true })}>\n * <header>...</header>\n * <section>...scrollable content...</section>\n * </div>\n * `\n * }\n */\nclass OverflowWithinDirective extends AsyncDirective {\n\tprivate element: HTMLElement | null = null\n\tprivate disconnecting$ = new Subject<void>()\n\tprivate currentName?: string\n\n\trender(_options?: OverflowWithinOptions) {\n\t\treturn noChange\n\t}\n\n\toverride update(part: ElementPart, [options = {}]: [OverflowWithinOptions?]) {\n\t\tif (part.type !== PartType.ELEMENT) {\n\t\t\tthrow new Error('overflowWithin directive can only be used on elements')\n\t\t}\n\t\tconst el = part.element as HTMLElement\n\t\tconst { hide = false, direction = 'both', name, debounce = 10 } = options\n\n\t\tconst s = el.style\n\t\ts.minHeight = '0'\n\t\ts.minWidth = '0'\n\t\ts.boxSizing = 'border-box'\n\t\ts.overflowY = direction === 'horizontal' ? 'hidden' : 'auto'\n\t\ts.overflowX = direction === 'vertical' ? 'hidden' : 'auto'\n\t\ts.scrollBehavior = 'smooth'\n\t\ts.overscrollBehavior = 'contain'\n\n\t\tif (hide) {\n\t\t\tinstallHideStylesheet()\n\t\t\tel.classList.add(SCROLLBAR_HIDE_CLASS)\n\t\t} else {\n\t\t\tel.classList.remove(SCROLLBAR_HIDE_CLASS)\n\t\t}\n\n\t\tconst isNewElement = this.element !== el\n\t\tconst isNameChange = this.currentName !== name\n\n\t\tif (isNewElement) {\n\t\t\tthis.element = el\n\t\t\tthis.subscribe(debounce, name)\n\t\t} else if (isNameChange) {\n\t\t\t// resubscribe with new name binding\n\t\t\tthis.disconnecting$.next()\n\t\t\tthis.disconnecting$ = new Subject<void>()\n\t\t\tthis.subscribe(debounce, name)\n\t\t}\n\t\tthis.currentName = name\n\n\t\treturn noChange\n\t}\n\n\tprivate subscribe(debounce: number, name: string | undefined) {\n\t\tif (!this.element) return\n\t\tconst el = this.element\n\n\t\tfromEvent(el, 'scroll', { passive: true })\n\t\t\t.pipe(debounceTime(debounce), takeUntil(this.disconnecting$))\n\t\t\t.subscribe((e) => {\n\t\t\t\tel.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('scroll', {\n\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\tscrollTop: el.scrollTop,\n\t\t\t\t\t\t\tscrollHeight: el.scrollHeight,\n\t\t\t\t\t\t\tclientHeight: el.clientHeight,\n\t\t\t\t\t\t\tscrollLeft: el.scrollLeft,\n\t\t\t\t\t\t\tscrollWidth: el.scrollWidth,\n\t\t\t\t\t\t\tclientWidth: el.clientWidth,\n\t\t\t\t\t\t\te,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t}) as OverflowWithinEvent,\n\t\t\t\t)\n\t\t\t})\n\n\t\tif (name !== undefined) {\n\t\t\tfromEvent<OverflowWithinCommandEvent>(window, '@schmancy:scrollTo')\n\t\t\t\t.pipe(\n\t\t\t\t\tfilter((evt) => evt.detail.name === name && evt.detail.action === 'scrollTo'),\n\t\t\t\t\ttakeUntil(this.disconnecting$),\n\t\t\t\t)\n\t\t\t\t.subscribe((evt) => {\n\t\t\t\t\tconst options: ScrollToOptions = { behavior: 'smooth', top: evt.detail.top }\n\t\t\t\t\tif (typeof evt.detail.left === 'number') options.left = evt.detail.left\n\t\t\t\t\tel.scrollTo(options)\n\t\t\t\t})\n\t\t}\n\t}\n\n\tprotected override disconnected() {\n\t\tthis.disconnecting$.next()\n\t\tthis.element = null\n\t}\n\n\tprotected override reconnected() {\n\t\tif (this.element) {\n\t\t\tthis.disconnecting$ = new Subject<void>()\n\t\t\tthis.subscribe(10, this.currentName)\n\t\t}\n\t}\n}\n\nexport const overflowWithin = directive(OverflowWithinDirective)\n"],"mappings":"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"}
|
package/dist/discovery.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.cjs","names":[],"sources":["../src/discovery/discovery.service.ts"],"sourcesContent":["import { fromEvent, timer, race, Observable } from 'rxjs'\r\nimport { takeUntil, map, defaultIfEmpty, take } from 'rxjs/operators'\r\n\r\n/**\r\n * Global discovery event names\r\n */\r\nconst DISCOVER_EVENT = 'schmancy-discover'\r\nconst DISCOVER_RESPONSE_EVENT = 'schmancy-discover-response'\r\n\r\n/**\r\n * Discovery request detail\r\n */\r\ninterface DiscoverRequest {\r\n\tselector: string\r\n\trequestId: string\r\n}\r\n\r\n/**\r\n * Discovery response detail\r\n */\r\ninterface DiscoverResponse {\r\n\trequestId: string\r\n\telement: HTMLElement\r\n}\r\n\r\n/**\r\n * Discover a component in the DOM using the WhereAreYou/HereIAm pattern.\r\n *\r\n * @param componentTag - The tag name of the component to discover (e.g., 'schmancy-navigation-rail')\r\n * @param timeout - How long to wait for a response in milliseconds (default: 100)\r\n * @returns Observable that emits the discovered component or null if not found\r\n */\r\nexport function discoverComponent<T extends HTMLElement>(\r\n\tcomponentTag: string,\r\n\ttimeout = 100,\r\n): Observable<T | null> {\r\n\tconst whereAreYouEvent = `${componentTag}-where-are-you`\r\n\tconst hereIAmEvent = `${componentTag}-here-i-am`\r\n\r\n\treturn new Observable(subscriber => {\r\n\t\tconst subscription = fromEvent<CustomEvent>(window, hereIAmEvent)\r\n\t\t\t.pipe(\r\n\t\t\t\ttakeUntil(timer(timeout)),\r\n\t\t\t\tmap(e => e.detail.component as T),\r\n\t\t\t\tdefaultIfEmpty(null),\r\n\t\t\t)\r\n\t\t\t.subscribe(component => {\r\n\t\t\t\tsubscriber.next(component)\r\n\t\t\t\tsubscriber.complete()\r\n\t\t\t})\r\n\r\n\t\twindow.dispatchEvent(\r\n\t\t\tnew CustomEvent(whereAreYouEvent, {\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\r\n\t\treturn () => subscription.unsubscribe()\r\n\t})\r\n}\r\n\r\n/**\r\n * Discover any of multiple components using race.\r\n * Returns the first component that responds.\r\n *\r\n * @param componentTags - Array of component tag names to discover\r\n * @returns Observable that emits the first discovered component or null if none found\r\n */\r\nexport function discoverAnyComponent<T extends HTMLElement>(...componentTags: string[]): Observable<T | null> {\r\n\tif (componentTags.length === 0) {\r\n\t\treturn new Observable(subscriber => {\r\n\t\t\tsubscriber.next(null)\r\n\t\t\tsubscriber.complete()\r\n\t\t})\r\n\t}\r\n\r\n\treturn race(...componentTags.map(tag => discoverComponent<T>(tag)))\r\n}\r\n\r\n/**\r\n * Universal element discovery - finds ANY element by CSS selector across shadow DOM boundaries.\r\n * Uses event-based discovery pattern - no DOM traversal needed.\r\n *\r\n * How it works:\r\n * 1. Broadcasts a discovery request event on window\r\n * 2. All $LitElement components receive this event and check their shadow DOM\r\n * 3. If a match is found, they respond with the element\r\n *\r\n * @param selector - CSS selector (e.g., '#my-id', '.my-class', '[data-attr]')\r\n * @param timeout - How long to wait for a response in milliseconds (default: 150)\r\n * @returns Observable that emits the discovered element or null if not found\r\n *\r\n * @example\r\n * ```typescript\r\n * // Find element by ID across shadow boundaries\r\n * discoverElement('#app-card').subscribe(el => {\r\n * if (el) console.log('Found:', el)\r\n * })\r\n *\r\n * // Find element by class\r\n * discoverElement('.special-button').subscribe(el => {...})\r\n * ```\r\n */\r\nexport function discoverElement<T extends HTMLElement>(\r\n\tselector: string,\r\n\ttimeout = 150,\r\n): Observable<T | null> {\r\n\tconst requestId = `discover-${Date.now()}-${Math.random().toString(36).slice(2)}`\r\n\r\n\treturn new Observable(subscriber => {\r\n\t\tconst subscription = fromEvent<CustomEvent<DiscoverResponse>>(window, DISCOVER_RESPONSE_EVENT)\r\n\t\t\t.pipe(\r\n\t\t\t\ttakeUntil(timer(timeout)),\r\n\t\t\t\tmap(e => e.detail),\r\n\t\t\t\tmap(detail => (detail.requestId === requestId ? (detail.element as T) : null)),\r\n\t\t\t\ttake(1),\r\n\t\t\t\tdefaultIfEmpty(null),\r\n\t\t\t)\r\n\t\t\t.subscribe(element => {\r\n\t\t\t\tsubscriber.next(element)\r\n\t\t\t\tsubscriber.complete()\r\n\t\t\t})\r\n\r\n\t\twindow.dispatchEvent(\r\n\t\t\tnew CustomEvent<DiscoverRequest>(DISCOVER_EVENT, {\r\n\t\t\t\tdetail: { selector, requestId },\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\r\n\t\treturn () => subscription.unsubscribe()\r\n\t})\r\n}\r\n\r\n/**\r\n * Discover multiple elements matching a selector.\r\n * Collects all responses within the timeout period.\r\n *\r\n * @param selector - CSS selector\r\n * @param timeout - How long to collect responses (default: 150ms)\r\n * @returns Observable that emits array of discovered elements\r\n */\r\nexport function discoverAllElements<T extends HTMLElement>(\r\n\tselector: string,\r\n\ttimeout = 150,\r\n): Observable<T[]> {\r\n\tconst requestId = `discover-all-${Date.now()}-${Math.random().toString(36).slice(2)}`\r\n\tconst elements: T[] = []\r\n\r\n\treturn new Observable(subscriber => {\r\n\t\tconst subscription = fromEvent<CustomEvent<DiscoverResponse>>(window, DISCOVER_RESPONSE_EVENT)\r\n\t\t\t.pipe(takeUntil(timer(timeout)))\r\n\t\t\t.subscribe({\r\n\t\t\t\tnext: e => {\r\n\t\t\t\t\tif (e.detail.requestId === requestId) {\r\n\t\t\t\t\t\telements.push(e.detail.element as T)\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tcomplete: () => {\r\n\t\t\t\t\tsubscriber.next(elements)\r\n\t\t\t\t\tsubscriber.complete()\r\n\t\t\t\t},\r\n\t\t\t})\r\n\r\n\t\twindow.dispatchEvent(\r\n\t\t\tnew CustomEvent<DiscoverRequest>(DISCOVER_EVENT, {\r\n\t\t\t\tdetail: { selector, requestId },\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\r\n\t\treturn () => subscription.unsubscribe()\r\n\t})\r\n}\r\n\r\n/**\r\n * Smart discovery - automatically detects if input is a CSS selector or component tag.\r\n *\r\n * @param query - CSS selector (starts with #, ., [) OR component tag name\r\n * @param timeout - How long to wait (default: 150ms)\r\n * @returns Observable that emits the discovered element or null\r\n *\r\n * @example\r\n * ```typescript\r\n * // CSS selector - uses discoverElement\r\n * discover('#my-element').subscribe(...)\r\n *\r\n * // Component tag - uses discoverComponent\r\n * discover('schmancy-fancy').subscribe(...)\r\n * ```\r\n */\r\nexport function discover<T extends HTMLElement>(\r\n\tquery: string,\r\n\ttimeout = 150,\r\n): Observable<T | null> {\r\n\tconst isCssSelector = /^[#.[]/.test(query)\r\n\r\n\tif (isCssSelector) {\r\n\t\treturn discoverElement<T>(query, timeout)\r\n\t}\r\n\r\n\treturn discoverComponent<T>(query, timeout)\r\n}\r\n\r\n// Export event names for use in baseElement\r\nexport { DISCOVER_EVENT, DISCOVER_RESPONSE_EVENT }\r\nexport type { DiscoverRequest, DiscoverResponse }\r\n"],"mappings":"qJAMA,IAAM,EAAiB,oBACjB,EAA0B,6BAyBhC,SAAgB,EACf,EACA,EAAU,IAAA,CAEV,IAAM,EAAmB,GAAG,EAAA,gBACtB,EAAe,GAAG,EAAA,YAExB,OAAO,IAAI,EAAA,WAAW,GAAA,CACrB,IAAM,GAAA,EAAA,EAAA,WAAsC,OAAQ,EAAA,CAClD,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,OACgB,EAAA,CAAA,EAAS,EAAA,EAAA,KACrB,GAAK,EAAE,OAAO,UAAA,EAAe,EAAA,EAAA,gBAClB,KAAA,CAAA,CAEf,UAAU,GAAA,CACV,EAAW,KAAK,EAAA,CAChB,EAAW,UAAA,EAAA,CAUb,OAPA,OAAO,cACN,IAAI,YAAY,EAAkB,CACjC,QAAA,CAAS,EACT,SAAA,CAAU,EAAA,CAAA,CAAA,KAIC,EAAa,aAAA,EAAA,CA8C5B,SAAgB,EACf,EACA,EAAU,IAAA,CAEV,IAAM,EAAY,YAAY,KAAK,KAAA,CAAA,GAAS,KAAK,QAAA,CAAS,SAAS,GAAA,CAAI,MAAM,EAAA,GAE7E,OAAO,IAAI,EAAA,WAAW,GAAA,CACrB,IAAM,GAAA,EAAA,EAAA,WAAwD,OAAQ,EAAA,CACpE,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,OACgB,EAAA,CAAA,EAAS,EAAA,EAAA,KACrB,GAAK,EAAE,OAAA,EAAO,EAAA,EAAA,KACd,GAAW,EAAO,YAAc,EAAa,EAAO,QAAgB,KAAA,EAAM,EAAA,EAAA,MACzE,EAAA,EAAE,EAAA,EAAA,gBACQ,KAAA,CAAA,CAEf,UAAU,GAAA,CACV,EAAW,KAAK,EAAA,CAChB,EAAW,UAAA,EAAA,CAWb,OARA,OAAO,cACN,IAAI,YAA6B,EAAgB,CAChD,OAAQ,CAAE,SAAA,EAAU,UAAA,EAAA,CACpB,QAAA,CAAS,EACT,SAAA,CAAU,EAAA,CAAA,CAAA,KAIC,EAAa,aAAA,EAAA,CAAA,QAAA,eAAA,EAAA,QAAA,wBAAA,EAAA,QAAA,SA8D5B,SACC,EACA,EAAU,IAAA,CAIV,MAFsB,SAAS,KAAK,EAAA,CAG5B,EAAmB,EAAO,EAAA,CAG3B,EAAqB,EAAO,EAAA,EAAA,QAAA,oBA5DpC,SACC,EACA,EAAU,IAAA,CAEV,IAAM,EAAY,gBAAgB,KAAK,KAAA,CAAA,GAAS,KAAK,QAAA,CAAS,SAAS,GAAA,CAAI,MAAM,EAAA,GAC3E,EAAgB,EAAA,CAEtB,OAAO,IAAI,EAAA,WAAW,GAAA,CACrB,IAAM,GAAA,EAAA,EAAA,WAAwD,OAAQ,EAAA,CACpE,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,OAAqB,EAAA,CAAA,CAAA,CACrB,UAAU,CACV,KAAM,GAAA,CACD,EAAE,OAAO,YAAc,GAC1B,EAAS,KAAK,EAAE,OAAO,QAAA,EAGzB,aAAA,CACC,EAAW,KAAK,EAAA,CAChB,EAAW,UAAA,EAAA,CAAA,CAYd,OARA,OAAO,cACN,IAAI,YAA6B,EAAgB,CAChD,OAAQ,CAAE,SAAA,EAAU,UAAA,EAAA,CACpB,QAAA,CAAS,EACT,SAAA,CAAU,EAAA,CAAA,CAAA,KAIC,EAAa,aAAA,EAAA,EAAA,QAAA,qBAzG5B,SAAA,GAA+D,EAAA,CAC9D,OAAI,EAAc,SAAW,EACrB,IAAI,EAAA,WAAW,GAAA,CACrB,EAAW,KAAK,KAAA,CAChB,EAAW,UAAA,EAAA,EAIb,EAAA,EAAA,MAAA,GAAe,EAAc,IAAI,GAAO,EAAqB,EAAA,CAAA,CAAA,EAAA,QAAA,kBAAA,EAAA,QAAA,gBAAA"}
|
package/dist/discovery.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.js","names":[],"sources":["../src/discovery/discovery.service.ts"],"sourcesContent":["import { fromEvent, timer, race, Observable } from 'rxjs'\r\nimport { takeUntil, map, defaultIfEmpty, take } from 'rxjs/operators'\r\n\r\n/**\r\n * Global discovery event names\r\n */\r\nconst DISCOVER_EVENT = 'schmancy-discover'\r\nconst DISCOVER_RESPONSE_EVENT = 'schmancy-discover-response'\r\n\r\n/**\r\n * Discovery request detail\r\n */\r\ninterface DiscoverRequest {\r\n\tselector: string\r\n\trequestId: string\r\n}\r\n\r\n/**\r\n * Discovery response detail\r\n */\r\ninterface DiscoverResponse {\r\n\trequestId: string\r\n\telement: HTMLElement\r\n}\r\n\r\n/**\r\n * Discover a component in the DOM using the WhereAreYou/HereIAm pattern.\r\n *\r\n * @param componentTag - The tag name of the component to discover (e.g., 'schmancy-navigation-rail')\r\n * @param timeout - How long to wait for a response in milliseconds (default: 100)\r\n * @returns Observable that emits the discovered component or null if not found\r\n */\r\nexport function discoverComponent<T extends HTMLElement>(\r\n\tcomponentTag: string,\r\n\ttimeout = 100,\r\n): Observable<T | null> {\r\n\tconst whereAreYouEvent = `${componentTag}-where-are-you`\r\n\tconst hereIAmEvent = `${componentTag}-here-i-am`\r\n\r\n\treturn new Observable(subscriber => {\r\n\t\tconst subscription = fromEvent<CustomEvent>(window, hereIAmEvent)\r\n\t\t\t.pipe(\r\n\t\t\t\ttakeUntil(timer(timeout)),\r\n\t\t\t\tmap(e => e.detail.component as T),\r\n\t\t\t\tdefaultIfEmpty(null),\r\n\t\t\t)\r\n\t\t\t.subscribe(component => {\r\n\t\t\t\tsubscriber.next(component)\r\n\t\t\t\tsubscriber.complete()\r\n\t\t\t})\r\n\r\n\t\twindow.dispatchEvent(\r\n\t\t\tnew CustomEvent(whereAreYouEvent, {\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\r\n\t\treturn () => subscription.unsubscribe()\r\n\t})\r\n}\r\n\r\n/**\r\n * Discover any of multiple components using race.\r\n * Returns the first component that responds.\r\n *\r\n * @param componentTags - Array of component tag names to discover\r\n * @returns Observable that emits the first discovered component or null if none found\r\n */\r\nexport function discoverAnyComponent<T extends HTMLElement>(...componentTags: string[]): Observable<T | null> {\r\n\tif (componentTags.length === 0) {\r\n\t\treturn new Observable(subscriber => {\r\n\t\t\tsubscriber.next(null)\r\n\t\t\tsubscriber.complete()\r\n\t\t})\r\n\t}\r\n\r\n\treturn race(...componentTags.map(tag => discoverComponent<T>(tag)))\r\n}\r\n\r\n/**\r\n * Universal element discovery - finds ANY element by CSS selector across shadow DOM boundaries.\r\n * Uses event-based discovery pattern - no DOM traversal needed.\r\n *\r\n * How it works:\r\n * 1. Broadcasts a discovery request event on window\r\n * 2. All $LitElement components receive this event and check their shadow DOM\r\n * 3. If a match is found, they respond with the element\r\n *\r\n * @param selector - CSS selector (e.g., '#my-id', '.my-class', '[data-attr]')\r\n * @param timeout - How long to wait for a response in milliseconds (default: 150)\r\n * @returns Observable that emits the discovered element or null if not found\r\n *\r\n * @example\r\n * ```typescript\r\n * // Find element by ID across shadow boundaries\r\n * discoverElement('#app-card').subscribe(el => {\r\n * if (el) console.log('Found:', el)\r\n * })\r\n *\r\n * // Find element by class\r\n * discoverElement('.special-button').subscribe(el => {...})\r\n * ```\r\n */\r\nexport function discoverElement<T extends HTMLElement>(\r\n\tselector: string,\r\n\ttimeout = 150,\r\n): Observable<T | null> {\r\n\tconst requestId = `discover-${Date.now()}-${Math.random().toString(36).slice(2)}`\r\n\r\n\treturn new Observable(subscriber => {\r\n\t\tconst subscription = fromEvent<CustomEvent<DiscoverResponse>>(window, DISCOVER_RESPONSE_EVENT)\r\n\t\t\t.pipe(\r\n\t\t\t\ttakeUntil(timer(timeout)),\r\n\t\t\t\tmap(e => e.detail),\r\n\t\t\t\tmap(detail => (detail.requestId === requestId ? (detail.element as T) : null)),\r\n\t\t\t\ttake(1),\r\n\t\t\t\tdefaultIfEmpty(null),\r\n\t\t\t)\r\n\t\t\t.subscribe(element => {\r\n\t\t\t\tsubscriber.next(element)\r\n\t\t\t\tsubscriber.complete()\r\n\t\t\t})\r\n\r\n\t\twindow.dispatchEvent(\r\n\t\t\tnew CustomEvent<DiscoverRequest>(DISCOVER_EVENT, {\r\n\t\t\t\tdetail: { selector, requestId },\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\r\n\t\treturn () => subscription.unsubscribe()\r\n\t})\r\n}\r\n\r\n/**\r\n * Discover multiple elements matching a selector.\r\n * Collects all responses within the timeout period.\r\n *\r\n * @param selector - CSS selector\r\n * @param timeout - How long to collect responses (default: 150ms)\r\n * @returns Observable that emits array of discovered elements\r\n */\r\nexport function discoverAllElements<T extends HTMLElement>(\r\n\tselector: string,\r\n\ttimeout = 150,\r\n): Observable<T[]> {\r\n\tconst requestId = `discover-all-${Date.now()}-${Math.random().toString(36).slice(2)}`\r\n\tconst elements: T[] = []\r\n\r\n\treturn new Observable(subscriber => {\r\n\t\tconst subscription = fromEvent<CustomEvent<DiscoverResponse>>(window, DISCOVER_RESPONSE_EVENT)\r\n\t\t\t.pipe(takeUntil(timer(timeout)))\r\n\t\t\t.subscribe({\r\n\t\t\t\tnext: e => {\r\n\t\t\t\t\tif (e.detail.requestId === requestId) {\r\n\t\t\t\t\t\telements.push(e.detail.element as T)\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tcomplete: () => {\r\n\t\t\t\t\tsubscriber.next(elements)\r\n\t\t\t\t\tsubscriber.complete()\r\n\t\t\t\t},\r\n\t\t\t})\r\n\r\n\t\twindow.dispatchEvent(\r\n\t\t\tnew CustomEvent<DiscoverRequest>(DISCOVER_EVENT, {\r\n\t\t\t\tdetail: { selector, requestId },\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\r\n\t\treturn () => subscription.unsubscribe()\r\n\t})\r\n}\r\n\r\n/**\r\n * Smart discovery - automatically detects if input is a CSS selector or component tag.\r\n *\r\n * @param query - CSS selector (starts with #, ., [) OR component tag name\r\n * @param timeout - How long to wait (default: 150ms)\r\n * @returns Observable that emits the discovered element or null\r\n *\r\n * @example\r\n * ```typescript\r\n * // CSS selector - uses discoverElement\r\n * discover('#my-element').subscribe(...)\r\n *\r\n * // Component tag - uses discoverComponent\r\n * discover('schmancy-fancy').subscribe(...)\r\n * ```\r\n */\r\nexport function discover<T extends HTMLElement>(\r\n\tquery: string,\r\n\ttimeout = 150,\r\n): Observable<T | null> {\r\n\tconst isCssSelector = /^[#.[]/.test(query)\r\n\r\n\tif (isCssSelector) {\r\n\t\treturn discoverElement<T>(query, timeout)\r\n\t}\r\n\r\n\treturn discoverComponent<T>(query, timeout)\r\n}\r\n\r\n// Export event names for use in baseElement\r\nexport { DISCOVER_EVENT, DISCOVER_RESPONSE_EVENT }\r\nexport type { DiscoverRequest, DiscoverResponse }\r\n"],"mappings":";;AAMA,IAAM,IAAiB,qBACjB,IAA0B;AAyBhC,SAAgB,EACf,GACA,IAAU,KAAA;CAEV,IAAM,IAAmB,GAAG,EAAA,iBACtB,IAAe,GAAG,EAAA;CAExB,OAAO,IAAI,GAAW,MAAA;EACrB,IAAM,IAAe,EAAuB,QAAQ,EAAA,CAClD,KACA,EAAU,EAAM,EAAA,CAAA,EAChB,GAAI,MAAK,EAAE,OAAO,UAAA,EAClB,EAAe,KAAA,CAAA,CAEf,WAAU,MAAA;GACV,EAAW,KAAK,EAAA,EAChB,EAAW,UAAA;IAAA;EAUb,OAPA,OAAO,cACN,IAAI,YAAY,GAAkB;GACjC,SAAA,CAAS;GACT,UAAA,CAAU;GAAA,CAAA,CAAA,QAIC,EAAa,aAAA;GAAA;;AAW5B,SAAgB,EAAA,GAA+C,GAAA;CAC9D,OAAI,EAAc,WAAW,IACrB,IAAI,GAAW,MAAA;EACrB,EAAW,KAAK,KAAA,EAChB,EAAW,UAAA;GAAA,GAIN,EAAA,GAAQ,EAAc,KAAI,MAAO,EAAqB,EAAA,CAAA,CAAA;;AA2B9D,SAAgB,EACf,GACA,IAAU,KAAA;CAEV,IAAM,IAAY,YAAY,KAAK,KAAA,CAAA,GAAS,KAAK,QAAA,CAAS,SAAS,GAAA,CAAI,MAAM,EAAA;CAE7E,OAAO,IAAI,GAAW,MAAA;EACrB,IAAM,IAAe,EAAyC,QAAQ,EAAA,CACpE,KACA,EAAU,EAAM,EAAA,CAAA,EAChB,GAAI,MAAK,EAAE,OAAA,EACX,GAAI,MAAW,EAAO,cAAc,IAAa,EAAO,UAAgB,KAAA,EACxE,EAAK,EAAA,EACL,EAAe,KAAA,CAAA,CAEf,WAAU,MAAA;GACV,EAAW,KAAK,EAAA,EAChB,EAAW,UAAA;IAAA;EAWb,OARA,OAAO,cACN,IAAI,YAA6B,GAAgB;GAChD,QAAQ;IAAE,UAAA;IAAU,WAAA;IAAA;GACpB,SAAA,CAAS;GACT,UAAA,CAAU;GAAA,CAAA,CAAA,QAIC,EAAa,aAAA;GAAA;;AAY5B,SAAgB,EACf,GACA,IAAU,KAAA;CAEV,IAAM,IAAY,gBAAgB,KAAK,KAAA,CAAA,GAAS,KAAK,QAAA,CAAS,SAAS,GAAA,CAAI,MAAM,EAAA,IAC3E,IAAgB,EAAA;CAEtB,OAAO,IAAI,GAAW,MAAA;EACrB,IAAM,IAAe,EAAyC,QAAQ,EAAA,CACpE,KAAK,EAAU,EAAM,EAAA,CAAA,CAAA,CACrB,UAAU;GACV,OAAM,MAAA;IACD,EAAE,OAAO,cAAc,KAC1B,EAAS,KAAK,EAAE,OAAO,QAAA;;GAGzB,gBAAA;IACC,EAAW,KAAK,EAAA,EAChB,EAAW,UAAA;;GAAA,CAAA;EAYd,OARA,OAAO,cACN,IAAI,YAA6B,GAAgB;GAChD,QAAQ;IAAE,UAAA;IAAU,WAAA;IAAA;GACpB,SAAA,CAAS;GACT,UAAA,CAAU;GAAA,CAAA,CAAA,QAIC,EAAa,aAAA;GAAA;;AAoB5B,SAAgB,EACf,GACA,IAAU,KAAA;CAIV,OAFsB,SAAS,KAAK,EAAA,GAG5B,EAAmB,GAAO,EAAA,GAG3B,EAAqB,GAAO,EAAA;;AAAA,SAAA,KAAA,gBAAA,KAAA,yBAAA,KAAA,UAAA,KAAA,qBAAA,KAAA,sBAAA,KAAA,mBAAA,KAAA"}
|
package/dist/icons-B7ppo07M.cjs
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
require(`./chunk-CncqDLb2.cjs`);const e=require(`./mixins-BPUR4Kc4.cjs`),t=require(`./active-host-jH3iloCR.cjs`);let n=require(`lit/decorators.js`),r=require(`lit`);var i=class extends e.c{static{this.styles=[r.css`
|
|
2
|
-
:host {
|
|
3
|
-
font-family: 'Material Symbols Outlined';
|
|
4
|
-
font-size: 24px;
|
|
5
|
-
width: 1em;
|
|
6
|
-
height: 1em;
|
|
7
|
-
color: inherit;
|
|
8
|
-
font-variation-settings: inherit;
|
|
9
|
-
font-weight: 400;
|
|
10
|
-
display: inline-flex;
|
|
11
|
-
font-style: normal;
|
|
12
|
-
place-items: center;
|
|
13
|
-
place-content: center;
|
|
14
|
-
line-height: 1;
|
|
15
|
-
overflow: hidden;
|
|
16
|
-
letter-spacing: normal;
|
|
17
|
-
text-transform: none;
|
|
18
|
-
user-select: none;
|
|
19
|
-
white-space: nowrap;
|
|
20
|
-
flex-shrink: 0;
|
|
21
|
-
-webkit-font-smoothing: antialiased;
|
|
22
|
-
text-rendering: optimizeLegibility;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
::slotted(svg) {
|
|
26
|
-
fill: currentColor;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
::slotted(*) {
|
|
30
|
-
height: 100%;
|
|
31
|
-
width: 100%;
|
|
32
|
-
}
|
|
33
|
-
`]}connectedCallback(){super.connectedCallback(),this.getAttribute(`aria-hidden`)===`false`?this.removeAttribute(`aria-hidden`):(this.setAttribute(`aria-hidden`,`true`),this.setAttribute(`translate`,`no`))}render(){return r.html`<slot></slot>`}};i=t.a([(0,n.customElement)(`schmancy-icon`)],i);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"icons-B7ppo07M.cjs","names":[],"sources":["../src/icons/icon.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement } from 'lit/decorators.js'\n\n@customElement('schmancy-icon')\nexport default class SchmancyIcon extends SchmancyElement {\n\tstatic styles = [css`\n\t\t:host {\n\t\t\tfont-family: 'Material Symbols Outlined';\n\t\t\tfont-size: 24px;\n\t\t\twidth: 1em;\n\t\t\theight: 1em;\n\t\t\tcolor: inherit;\n\t\t\tfont-variation-settings: inherit;\n\t\t\tfont-weight: 400;\n\t\t\tdisplay: inline-flex;\n\t\t\tfont-style: normal;\n\t\t\tplace-items: center;\n\t\t\tplace-content: center;\n\t\t\tline-height: 1;\n\t\t\toverflow: hidden;\n\t\t\tletter-spacing: normal;\n\t\t\ttext-transform: none;\n\t\t\tuser-select: none;\n\t\t\twhite-space: nowrap;\n\t\t\tflex-shrink: 0;\n\t\t\t-webkit-font-smoothing: antialiased;\n\t\t\ttext-rendering: optimizeLegibility;\n\t\t}\n\n\t\t::slotted(svg) {\n\t\t\tfill: currentColor;\n\t\t}\n\n\t\t::slotted(*) {\n\t\t\theight: 100%;\n\t\t\twidth: 100%;\n\t\t}\n\t`]\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback()\n\t\tconst ariaHidden = this.getAttribute('aria-hidden')\n\t\tif (ariaHidden === 'false') {\n\t\t\tthis.removeAttribute('aria-hidden')\n\t\t\treturn\n\t\t}\n\t\tthis.setAttribute('aria-hidden', 'true')\n\t\tthis.setAttribute('translate', 'no')\n\t}\n\n\tprotected override render(): unknown {\n\t\treturn html`<slot></slot>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-icon': SchmancyIcon\n\t}\n}\n"],"mappings":"qKAKe,IAAA,EAAA,cAA2B,EAAA,CAAA,CAAA,OAAA,KAAA,OACzB,CAAC,EAAA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkCpB,mBAAA,CACC,MAAM,mBAAA,CACa,KAAK,aAAa,cAAA,GAClB,QAClB,KAAK,gBAAgB,cAAA,EAGtB,KAAK,aAAa,cAAe,OAAA,CACjC,KAAK,aAAa,YAAa,KAAA,EAGhC,QAAA,CACC,MAAO,GAAA,IAAI,kBAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAhDE,gBAAA,CAAA,CAAgB,EAAA"}
|
package/dist/icons-CGhozJ5v.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { c as e } from "./mixins-C42OILRS.js";
|
|
2
|
-
import { a as t } from "./active-host-BP0zy_Y9.js";
|
|
3
|
-
import { customElement as n } from "lit/decorators.js";
|
|
4
|
-
import { css as r, html as i } from "lit";
|
|
5
|
-
var a = class extends e {
|
|
6
|
-
static {
|
|
7
|
-
this.styles = [r`
|
|
8
|
-
:host {
|
|
9
|
-
font-family: 'Material Symbols Outlined';
|
|
10
|
-
font-size: 24px;
|
|
11
|
-
width: 1em;
|
|
12
|
-
height: 1em;
|
|
13
|
-
color: inherit;
|
|
14
|
-
font-variation-settings: inherit;
|
|
15
|
-
font-weight: 400;
|
|
16
|
-
display: inline-flex;
|
|
17
|
-
font-style: normal;
|
|
18
|
-
place-items: center;
|
|
19
|
-
place-content: center;
|
|
20
|
-
line-height: 1;
|
|
21
|
-
overflow: hidden;
|
|
22
|
-
letter-spacing: normal;
|
|
23
|
-
text-transform: none;
|
|
24
|
-
user-select: none;
|
|
25
|
-
white-space: nowrap;
|
|
26
|
-
flex-shrink: 0;
|
|
27
|
-
-webkit-font-smoothing: antialiased;
|
|
28
|
-
text-rendering: optimizeLegibility;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
::slotted(svg) {
|
|
32
|
-
fill: currentColor;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
::slotted(*) {
|
|
36
|
-
height: 100%;
|
|
37
|
-
width: 100%;
|
|
38
|
-
}
|
|
39
|
-
`];
|
|
40
|
-
}
|
|
41
|
-
connectedCallback() {
|
|
42
|
-
super.connectedCallback(), this.getAttribute("aria-hidden") === "false" ? this.removeAttribute("aria-hidden") : (this.setAttribute("aria-hidden", "true"), this.setAttribute("translate", "no"));
|
|
43
|
-
}
|
|
44
|
-
render() {
|
|
45
|
-
return i`<slot></slot>`;
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
a = t([n("schmancy-icon")], a);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"icons-CGhozJ5v.js","names":[],"sources":["../src/icons/icon.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement } from 'lit/decorators.js'\n\n@customElement('schmancy-icon')\nexport default class SchmancyIcon extends SchmancyElement {\n\tstatic styles = [css`\n\t\t:host {\n\t\t\tfont-family: 'Material Symbols Outlined';\n\t\t\tfont-size: 24px;\n\t\t\twidth: 1em;\n\t\t\theight: 1em;\n\t\t\tcolor: inherit;\n\t\t\tfont-variation-settings: inherit;\n\t\t\tfont-weight: 400;\n\t\t\tdisplay: inline-flex;\n\t\t\tfont-style: normal;\n\t\t\tplace-items: center;\n\t\t\tplace-content: center;\n\t\t\tline-height: 1;\n\t\t\toverflow: hidden;\n\t\t\tletter-spacing: normal;\n\t\t\ttext-transform: none;\n\t\t\tuser-select: none;\n\t\t\twhite-space: nowrap;\n\t\t\tflex-shrink: 0;\n\t\t\t-webkit-font-smoothing: antialiased;\n\t\t\ttext-rendering: optimizeLegibility;\n\t\t}\n\n\t\t::slotted(svg) {\n\t\t\tfill: currentColor;\n\t\t}\n\n\t\t::slotted(*) {\n\t\t\theight: 100%;\n\t\t\twidth: 100%;\n\t\t}\n\t`]\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback()\n\t\tconst ariaHidden = this.getAttribute('aria-hidden')\n\t\tif (ariaHidden === 'false') {\n\t\t\tthis.removeAttribute('aria-hidden')\n\t\t\treturn\n\t\t}\n\t\tthis.setAttribute('aria-hidden', 'true')\n\t\tthis.setAttribute('translate', 'no')\n\t}\n\n\tprotected override render(): unknown {\n\t\treturn html`<slot></slot>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-icon': SchmancyIcon\n\t}\n}\n"],"mappings":";;;;AAKe,IAAA,IAAA,cAA2B,EAAA;CAAA;EAAA,KAAA,SACzB,CAAC,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCpB,oBAAA;EACC,MAAM,mBAAA,EACa,KAAK,aAAa,cAAA,KAClB,UAClB,KAAK,gBAAgB,cAAA,IAGtB,KAAK,aAAa,eAAe,OAAA,EACjC,KAAK,aAAa,aAAa,KAAA;;CAGhC,SAAA;EACC,OAAO,CAAI;;;AAAA,IAAA,EAAA,CAhDZ,EAAc,gBAAA,CAAA,EAAgB,EAAA"}
|