@mhmo91/schmancy 0.10.24 → 0.10.26
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-DJrL6tio.js} +242 -242
- package/dist/agent/{overlay.confirm-body-CvdVfCnN.js.map → overlay.confirm-body-DJrL6tio.js.map} +1 -1
- package/dist/agent/schmancy.agent.js +5586 -2868
- package/dist/agent/schmancy.agent.js.map +1 -1
- package/dist/{area-BuqdaUpQ.cjs → area-DkvO_oiO.cjs} +1 -1
- package/dist/{area-BuqdaUpQ.cjs.map → area-DkvO_oiO.cjs.map} +1 -1
- package/dist/{area-A_oUP4P1.js → area-fC1_kvAW.js} +1 -1
- package/dist/{area-A_oUP4P1.js.map → area-fC1_kvAW.js.map} +1 -1
- package/dist/area.cjs +1 -1
- package/dist/area.js +1 -1
- package/dist/{autocomplete-Cy46gJxK.cjs → autocomplete-Aa2IstyX.cjs} +1 -1
- package/dist/{autocomplete-Cy46gJxK.cjs.map → autocomplete-Aa2IstyX.cjs.map} +1 -1
- package/dist/{autocomplete-BoCWO26L.js → autocomplete-Hb-C11a3.js} +2 -2
- package/dist/{autocomplete-BoCWO26L.js.map → autocomplete-Hb-C11a3.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-BEq-AHmL.cjs +85 -0
- package/dist/boat-BEq-AHmL.cjs.map +1 -0
- package/dist/{boat-B0h5fuAA.js → boat-BW6aRcdY.js} +29 -23
- package/dist/boat-BW6aRcdY.js.map +1 -0
- 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-CKpIblIO.cjs} +1 -1
- package/dist/{busy-Bn6Pioo8.cjs.map → busy-CKpIblIO.cjs.map} +1 -1
- package/dist/{busy-DObY7lfu.js → busy-D-ucQFSB.js} +1 -1
- package/dist/{busy-DObY7lfu.js.map → busy-D-ucQFSB.js.map} +1 -1
- package/dist/busy.cjs +1 -1
- package/dist/busy.js +1 -1
- package/dist/{button-DEi3M2nV.js → button-BU-X0a0S.js} +2 -2
- package/dist/{button-DEi3M2nV.js.map → button-BU-X0a0S.js.map} +1 -1
- package/dist/{button-XfdPzfZQ.cjs → button-HzLpB3NP.cjs} +1 -1
- package/dist/{button-XfdPzfZQ.cjs.map → button-HzLpB3NP.cjs.map} +1 -1
- package/dist/button.cjs +1 -1
- package/dist/button.js +1 -1
- package/dist/{card-BjUgRzFh.cjs → card-CcrUlgd3.cjs} +1 -1
- package/dist/{card-BjUgRzFh.cjs.map → card-CcrUlgd3.cjs.map} +1 -1
- package/dist/{card-jzUQK0EQ.js → card-ueXBeJ6q.js} +2 -2
- package/dist/{card-jzUQK0EQ.js.map → card-ueXBeJ6q.js.map} +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/{checkbox-CfCm1vGN.js → checkbox-CW1kk4Tu.js} +1 -1
- package/dist/{checkbox-CfCm1vGN.js.map → checkbox-CW1kk4Tu.js.map} +1 -1
- package/dist/{checkbox-rskgUBxQ.cjs → checkbox-qsp-I5C6.cjs} +1 -1
- package/dist/{checkbox-rskgUBxQ.cjs.map → checkbox-qsp-I5C6.cjs.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-Dfim_tQv.js → chips-C_F6-gfe.js} +4 -4
- package/dist/{chips-Dfim_tQv.js.map → chips-C_F6-gfe.js.map} +1 -1
- package/dist/{chips-BiNZKu0J.cjs → chips-Dluk6RV4.cjs} +1 -1
- package/dist/{chips-BiNZKu0J.cjs.map → chips-Dluk6RV4.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-B8zoj6Cj.js → date-range-ASZ8h_Il.js} +2 -2
- package/dist/{date-range-B8zoj6Cj.js.map → date-range-ASZ8h_Il.js.map} +1 -1
- package/dist/{date-range-em7OwhlK.cjs → date-range-BFOqXAI2.cjs} +1 -1
- package/dist/{date-range-em7OwhlK.cjs.map → date-range-BFOqXAI2.cjs.map} +1 -1
- package/dist/{date-range-inline-DYeqoBIO.cjs → date-range-inline-BNmNOpL0.cjs} +1 -1
- package/dist/{date-range-inline-DYeqoBIO.cjs.map → date-range-inline-BNmNOpL0.cjs.map} +1 -1
- package/dist/{date-range-inline-BfUL8_vX.js → date-range-inline-DHrgolLn.js} +1 -1
- package/dist/{date-range-inline-BfUL8_vX.js.map → date-range-inline-DHrgolLn.js.map} +1 -1
- package/dist/date-range-inline.cjs +1 -1
- package/dist/date-range-inline.js +1 -1
- package/dist/date-range.cjs +1 -1
- package/dist/date-range.js +1 -1
- package/dist/delay.cjs +1 -1
- package/dist/delay.js +2 -2
- package/dist/{details-D246xN83.js → details-B9RgRw6c.js} +4 -4
- package/dist/{details-D246xN83.js.map → details-B9RgRw6c.js.map} +1 -1
- package/dist/{details-CNM1tuma.cjs → details-Bx9c4XQR.cjs} +1 -1
- package/dist/{details-CNM1tuma.cjs.map → details-Bx9c4XQR.cjs.map} +1 -1
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/directives-Dq0zi2KR.cjs +350 -0
- package/dist/directives-Dq0zi2KR.cjs.map +1 -0
- package/dist/directives-sWKTEJDb.js +4063 -0
- package/dist/directives-sWKTEJDb.js.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-C7BtzDcK.js} +1 -1
- package/dist/{divider-CbIp1je9.js.map → divider-C7BtzDcK.js.map} +1 -1
- package/dist/{divider-DaKsGNW-.cjs → divider-DH0BvTOv.cjs} +1 -1
- package/dist/{divider-DaKsGNW-.cjs.map → divider-DH0BvTOv.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-CQDm3BF3.cjs → expand-CPMF44eL.cjs} +1 -1
- package/dist/{expand-CQDm3BF3.cjs.map → expand-CPMF44eL.cjs.map} +1 -1
- package/dist/{expand-DRkiO4vw.js → expand-DcMx9dHY.js} +3 -3
- package/dist/{expand-DRkiO4vw.js.map → expand-DcMx9dHY.js.map} +1 -1
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/{float-5O26zNRh.cjs → float-CgBN4H3g.cjs} +1 -1
- package/dist/{float-5O26zNRh.cjs.map → float-CgBN4H3g.cjs.map} +1 -1
- package/dist/{float-CZtu8FnO.js → float-DkUw5TN4.js} +1 -1
- package/dist/{float-CZtu8FnO.js.map → float-DkUw5TN4.js.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/{form-B90CMeqs.cjs → form-DxApnyVx.cjs} +1 -1
- package/dist/{form-B90CMeqs.cjs.map → form-DxApnyVx.cjs.map} +1 -1
- package/dist/{form-CE6Gwz4r.js → form-kSgJf_h4.js} +8 -8
- package/dist/{form-CE6Gwz4r.js.map → form-kSgJf_h4.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-3F1nQAn_.cjs +24 -0
- package/dist/icons-3F1nQAn_.cjs.map +1 -0
- package/dist/icons-DsfpmrVO.js +52 -0
- package/dist/icons-DsfpmrVO.js.map +1 -0
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-C3PMj1MD.js → iframe-KrV4Cak-.js} +1 -1
- package/dist/{iframe-C3PMj1MD.js.map → iframe-KrV4Cak-.js.map} +1 -1
- package/dist/{iframe-D98csbEo.cjs → iframe-sTXBw6zB.cjs} +1 -1
- package/dist/{iframe-D98csbEo.cjs.map → iframe-sTXBw6zB.cjs.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-DMoggdSN.cjs} +1 -1
- package/dist/{input-_y92Pzon.cjs.map → input-DMoggdSN.cjs.map} +1 -1
- package/dist/{input-chip-CR66MWml.cjs → input-chip-B1iNQW2m.cjs} +1 -1
- package/dist/{input-chip-CR66MWml.cjs.map → input-chip-B1iNQW2m.cjs.map} +1 -1
- package/dist/{input-chip-Bzwr5-XL.js → input-chip-DHbfUatc.js} +1 -1
- package/dist/{input-chip-Bzwr5-XL.js.map → input-chip-DHbfUatc.js.map} +1 -1
- package/dist/{input-CCOkeeVM.js → input-zj3eaZM_.js} +1 -1
- package/dist/{input-CCOkeeVM.js.map → input-zj3eaZM_.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-86F2RgXy.cjs} +2 -2
- package/dist/{lightbox-Bk3ovcVu.cjs.map → lightbox-86F2RgXy.cjs.map} +1 -1
- package/dist/{lightbox-Dl--fEbP.js → lightbox-CAcXlJlv.js} +2 -2
- package/dist/{lightbox-Dl--fEbP.js.map → lightbox-CAcXlJlv.js.map} +1 -1
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/{list-B3WI_Nfs.js → list-BIjJ6T1c.js} +1 -1
- package/dist/{list-B3WI_Nfs.js.map → list-BIjJ6T1c.js.map} +1 -1
- package/dist/{list-DWngbP2X.cjs → list-CUbI0RM6.cjs} +1 -1
- package/dist/{list-DWngbP2X.cjs.map → list-CUbI0RM6.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-IDhVp6zm.js → menu-CtFcvxgU.js} +2 -2
- package/dist/{menu-IDhVp6zm.js.map → menu-CtFcvxgU.js.map} +1 -1
- package/dist/{menu-CdYjxJqm.cjs → menu-DGMrjR_a.cjs} +1 -1
- package/dist/{menu-CdYjxJqm.cjs.map → menu-DGMrjR_a.cjs.map} +1 -1
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/mixins-CKbQ6BJo.js +642 -0
- package/dist/mixins-CKbQ6BJo.js.map +1 -0
- package/dist/mixins-DSy-enUd.cjs +254 -0
- package/dist/mixins-DSy-enUd.cjs.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-BqyMYtP7.js} +2 -2
- package/dist/{notification-CllYkvlR.js.map → notification-BqyMYtP7.js.map} +1 -1
- package/dist/{notification-B3wVUC8l.cjs → notification-D5eOdsMT.cjs} +1 -1
- package/dist/{notification-B3wVUC8l.cjs.map → notification-D5eOdsMT.cjs.map} +1 -1
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/{option-CPOL0nHL.js → option-C3UyYQi_.js} +1 -1
- package/dist/{option-CPOL0nHL.js.map → option-C3UyYQi_.js.map} +1 -1
- package/dist/{option-cRsdshy8.cjs → option-DJ3R-2Wn.cjs} +1 -1
- package/dist/{option-cRsdshy8.cjs.map → option-DJ3R-2Wn.cjs.map} +1 -1
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/{overlay-DJ-vlwtR.js → overlay-D1hFkcFA.js} +5 -5
- package/dist/{overlay-DJ-vlwtR.js.map → overlay-D1hFkcFA.js.map} +1 -1
- package/dist/{overlay-BnTvnNDc.cjs → overlay-D7nQaT5U.cjs} +1 -1
- package/dist/{overlay-BnTvnNDc.cjs.map → overlay-D7nQaT5U.cjs.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-DEb9xw5N.js → overlay.confirm-body-B4eCDLmU.js} +1 -1
- package/dist/{overlay.confirm-body-DEb9xw5N.js.map → overlay.confirm-body-B4eCDLmU.js.map} +1 -1
- package/dist/{overlay.confirm-body-CQ-FwySO.cjs → overlay.confirm-body-P18SmJL2.cjs} +1 -1
- package/dist/{overlay.confirm-body-CQ-FwySO.cjs.map → overlay.confirm-body-P18SmJL2.cjs.map} +1 -1
- package/dist/overlay.js +3 -3
- package/dist/{overlay.service-XM1YHkTk.js → overlay.service-02ZLZ8Ib.js} +2 -2
- package/dist/{overlay.service-XM1YHkTk.js.map → overlay.service-02ZLZ8Ib.js.map} +1 -1
- package/dist/{overlay.service-CKBCIP2f.cjs → overlay.service-m-8omCA-.cjs} +1 -1
- package/dist/{overlay.service-CKBCIP2f.cjs.map → overlay.service-m-8omCA-.cjs.map} +1 -1
- package/dist/{progress-CcfLfHOE.cjs → progress-CY-UbvOB.cjs} +1 -1
- package/dist/{progress-CcfLfHOE.cjs.map → progress-CY-UbvOB.cjs.map} +1 -1
- package/dist/{progress-CnMPp-9a.js → progress-YjdEWDI5.js} +1 -1
- package/dist/{progress-CnMPp-9a.js.map → progress-YjdEWDI5.js.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/{radio-group-D97hflrE.cjs → radio-group--UamzqAm.cjs} +1 -1
- package/dist/{radio-group-D97hflrE.cjs.map → radio-group--UamzqAm.cjs.map} +1 -1
- package/dist/{radio-group-BUJgfQFi.js → radio-group-aKXKHqUp.js} +1 -1
- package/dist/{radio-group-BUJgfQFi.js.map → radio-group-aKXKHqUp.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-B0Qk4PfT.js} +3 -3
- package/dist/{select-BWEh5nRM.js.map → select-B0Qk4PfT.js.map} +1 -1
- package/dist/{select-Cv5Oev6d.cjs → select-CIquL8LY.cjs} +2 -2
- package/dist/{select-Cv5Oev6d.cjs.map → select-CIquL8LY.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-CP_Idse2.js} +1 -1
- package/dist/{splash-screen-B6w7X2z9.js.map → splash-screen-CP_Idse2.js.map} +1 -1
- package/dist/{splash-screen-DFtxtO2D.cjs → splash-screen-rg56AXCf.cjs} +1 -1
- package/dist/{splash-screen-DFtxtO2D.cjs.map → splash-screen-rg56AXCf.cjs.map} +1 -1
- package/dist/splash-screen.cjs +1 -1
- package/dist/splash-screen.js +1 -1
- package/dist/{src-Asw6A018.cjs → src-BAaNnqwc.cjs} +13 -13
- package/dist/{src-Asw6A018.cjs.map → src-BAaNnqwc.cjs.map} +1 -1
- package/dist/{src-D_NK-vMA.js → src-Do0IGupa.js} +153 -153
- package/dist/{src-D_NK-vMA.js.map → src-Do0IGupa.js.map} +1 -1
- package/dist/steps.cjs +1 -1
- package/dist/steps.js +1 -1
- package/dist/{surface-B94ka2LY.cjs → surface-B7a2O5-9.cjs} +1 -1
- package/dist/{surface-B94ka2LY.cjs.map → surface-B7a2O5-9.cjs.map} +1 -1
- package/dist/{surface-ctBcRGSZ.js → surface-DGewe6IV.js} +1 -1
- package/dist/{surface-ctBcRGSZ.js.map → surface-DGewe6IV.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-g2aM43TH.js} +1 -1
- package/dist/{tabs-CrMx5z_y.js.map → tabs-g2aM43TH.js.map} +1 -1
- package/dist/{tabs-B7kaZIom.cjs → tabs-n4dO5fo1.cjs} +1 -1
- package/dist/{tabs-B7kaZIom.cjs.map → tabs-n4dO5fo1.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-D5hw4jsP.js} +1 -1
- package/dist/{textarea-DeHFl80i.js.map → textarea-D5hw4jsP.js.map} +1 -1
- package/dist/{textarea-D1crj8JD.cjs → textarea-DDx_7AfQ.cjs} +1 -1
- package/dist/{textarea-D1crj8JD.cjs.map → textarea-DDx_7AfQ.cjs.map} +1 -1
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-C7Yo33nh.js → theme-BMYkheaA.js} +3 -3
- package/dist/{theme-C7Yo33nh.js.map → theme-BMYkheaA.js.map} +1 -1
- package/dist/{theme-wE2N7Yu9.cjs → theme-BdZAj0CO.cjs} +2 -2
- package/dist/{theme-wE2N7Yu9.cjs.map → theme-BdZAj0CO.cjs.map} +1 -1
- package/dist/{theme-button-Cpc_hs2O.js → theme-button-DdI6kxY3.js} +1 -1
- package/dist/{theme-button-Cpc_hs2O.js.map → theme-button-DdI6kxY3.js.map} +1 -1
- package/dist/{theme-button-CXSM5We4.cjs → theme-button-R2f_kLEl.cjs} +1 -1
- package/dist/{theme-button-CXSM5We4.cjs.map → theme-button-R2f_kLEl.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-Ck_zS4bb.cjs → window-LOGPpN8K.cjs} +1 -1
- package/dist/{window-Ck_zS4bb.cjs.map → window-LOGPpN8K.cjs.map} +1 -1
- package/dist/{window-JtkeHoxS.js → window-MQxhTodp.js} +5 -5
- package/dist/{window-JtkeHoxS.js.map → window-MQxhTodp.js.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/boat/boat.ts +33 -23
- 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/nebula.ts +64 -61
- 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/nebula.d.ts +1 -1
- 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/boat-B0h5fuAA.js.map +0 -1
- package/dist/boat-RRtBhD3x.cjs +0 -80
- package/dist/boat-RRtBhD3x.cjs.map +0 -1
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directives-Dq0zi2KR.cjs","names":[],"sources":["../src/directives/animate-text.ts","../src/directives/ai-badge.ts","../src/directives/art/utils.ts","../src/directives/art/effects/funkhaus.ts","../src/directives/art/particle-pool.ts","../src/directives/art/effects/samwa.ts","../src/directives/art/effects/howl.ts","../src/directives/art/effects/error.ts","../src/directives/art/effects/snow.ts","../src/directives/art/effects/starfield.ts","../src/directives/art/art.directive.ts","../src/directives/battery.ts","../src/directives/beta.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/fyi.ts","../src/directives/gravity.ts","../src/directives/hummingbird.ts","../src/directives/intersect.ts","../src/directives/liquid.ts","../src/directives/living-border.ts","../src/directives/long-press.ts","../src/directives/missed-punch.ts","../src/directives/nebula.ts","../src/directives/reveal.ts","../src/directives/ripple.ts","../src/directives/overflow-within.ts","../src/directives/urgent.ts","../src/directives/working-snake.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","/**\n * AI Badge Directive — Indicator for AI-generated content.\n * Pulses gently on the host element; color routed through theme tokens.\n */\n\nimport { noChange } from 'lit'\nimport { AsyncDirective, directive } from 'lit/async-directive.js'\nimport type { ElementPart } from 'lit'\n\ninterface State {\n\tmessage: string\n\telement: HTMLElement\n\tbadge: HTMLElement | null\n\tanimation: Animation | null\n}\n\nclass AIBadgeDirective extends AsyncDirective {\n\tprivate state: State | null = null\n\n\trender(_message?: string) {\n\t\treturn noChange\n\t}\n\n\toverride update(part: ElementPart, [message = '']: [string?]) {\n\t\tconst element = part.element as HTMLElement\n\n\t\tif (!message) {\n\t\t\tthis.cleanup()\n\t\t\treturn noChange\n\t\t}\n\n\t\tif (this.state) return noChange\n\n\t\tthis.state = {\n\t\t\tmessage,\n\t\t\telement,\n\t\t\tbadge: null,\n\t\t\tanimation: null,\n\t\t}\n\n\t\tif (getComputedStyle(element).position === 'static') {\n\t\t\telement.style.position = 'relative'\n\t\t}\n\n\t\tconst badge = document.createElement('div')\n\t\tbadge.style.cssText = `\n\t\t\tdisplay: block;\n\t\t\tposition: absolute;\n\t\t\tbottom: -8px;\n\t\t\tleft: 8px;\n\t\t\tz-index: 10;\n\t\t\tpadding: 3px 10px;\n\t\t\tborder-radius: 12px;\n\t\t\tfont-size: 0.65rem;\n\t\t\tfont-weight: 600;\n\t\t\tbackground: linear-gradient(\n\t\t\t\t135deg,\n\t\t\t\tvar(--md-sys-color-primary, #7c5cff),\n\t\t\t\tvar(--md-sys-color-primary-container, #6750a4)\n\t\t\t);\n\t\t\tcolor: var(--md-sys-color-on-primary, #fff);\n\t\t\tbox-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n\t\t\twhite-space: nowrap;\n\t\t`\n\t\tbadge.textContent = `✦ ${message}`\n\t\tbadge.title = message\n\n\t\telement.appendChild(badge)\n\t\tthis.state.badge = badge\n\n\t\tthis.state.animation = badge.animate(\n\t\t\t[\n\t\t\t\t{ transform: 'scale(1)' },\n\t\t\t\t{ transform: 'scale(1.03)' },\n\t\t\t\t{ transform: 'scale(1)' },\n\t\t\t],\n\t\t\t{ duration: 2000, easing: 'ease-in-out', iterations: Infinity },\n\t\t)\n\n\t\treturn noChange\n\t}\n\n\tprivate cleanup(): void {\n\t\tif (!this.state) return\n\t\tthis.state.animation?.cancel()\n\t\tthis.state.badge?.remove()\n\t\tthis.state = null\n\t}\n\n\toverride disconnected(): void {\n\t\tthis.cleanup()\n\t}\n}\n\nexport const aiBadge = directive(AIBadgeDirective)\n","/**\n * Shared DOM/SVG creation utilities for art effects.\n */\n\nexport function createOverlayContainer(className: string): HTMLDivElement {\n\tconst overlay = document.createElement('div')\n\toverlay.className = `art-overlay ${className}`\n\toverlay.style.cssText = `\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tpointer-events: none;\n\t\tz-index: 1000;\n\t\toverflow: hidden;\n\t`\n\treturn overlay\n}\n\nexport function createSVG(): SVGSVGElement {\n\tconst svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n\tsvg.setAttribute('width', '100%')\n\tsvg.setAttribute('height', '100%')\n\tsvg.setAttribute('viewBox', '0 0 100 100')\n\tsvg.setAttribute('preserveAspectRatio', 'none')\n\tsvg.style.cssText = `\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t`\n\treturn svg\n}\n","/**\n * Funkhaus Effect — Grid wave animation with window panes glowing diagonally.\n * 7-second cycle, exponential intensity curve.\n */\n\nimport type { ArtState } from '../types'\nimport { createOverlayContainer, createSVG } from '../utils'\n\nexport function createFunkhausOverlay(state: ArtState): void {\n\tconst { element, color } = state\n\tconst overlay = createOverlayContainer('funkhaus-overlay')\n\tconst svg = createSVG()\n\n\tconst cols = 5\n\tconst rows = 4\n\tconst windowWidth = 100 / cols\n\tconst windowHeight = 100 / rows\n\n\tconst framePath = createGridPath(cols, rows, windowWidth, windowHeight)\n\tconst frameElement = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\tframeElement.setAttribute('d', framePath)\n\tframeElement.setAttribute('stroke', color)\n\tframeElement.setAttribute('stroke-width', '0.15')\n\tframeElement.setAttribute('opacity', '0.2')\n\tframeElement.setAttribute('fill', 'none')\n\n\tconst windowGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\twindowGroup.id = 'window-panes'\n\twindowGroup.style.mixBlendMode = 'screen'\n\n\tconst panes: Array<{ element: SVGRectElement; diagonalIndex: number }> = []\n\n\tfor (let row = 0; row < rows; row++) {\n\t\tfor (let col = 0; col < cols; col++) {\n\t\t\tconst rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n\t\t\trect.setAttribute('x', (col * windowWidth).toString())\n\t\t\trect.setAttribute('y', (row * windowHeight).toString())\n\t\t\trect.setAttribute('width', windowWidth.toString())\n\t\t\trect.setAttribute('height', windowHeight.toString())\n\t\t\trect.setAttribute('fill', color)\n\t\t\trect.setAttribute('opacity', '0')\n\t\t\trect.style.willChange = 'opacity'\n\n\t\t\tpanes.push({ element: rect, diagonalIndex: row + col })\n\t\t\twindowGroup.appendChild(rect)\n\t\t}\n\t}\n\n\tsvg.appendChild(windowGroup)\n\tsvg.appendChild(frameElement)\n\toverlay.appendChild(svg)\n\telement.appendChild(overlay)\n\n\tstate.overlayElement = overlay\n\tstate.funkhaus = {\n\t\tpanes,\n\t\tmaxDiagonal: rows + cols - 2,\n\t\tstartTime: performance.now(),\n\t}\n}\n\nexport function animateFunkhaus(state: ArtState, currentTime: number): void {\n\tif (!state.funkhaus) return\n\n\tconst { panes, maxDiagonal, startTime } = state.funkhaus\n\tconst { intensity: effectIntensity = 1, speed = 1 } = state\n\n\tif (effectIntensity <= 0) {\n\t\tfor (const pane of panes) {\n\t\t\tif (pane.element.getAttribute('opacity') !== '0') {\n\t\t\t\tpane.element.setAttribute('opacity', '0')\n\t\t\t}\n\t\t}\n\t\treturn\n\t}\n\n\tconst elapsed = currentTime - startTime\n\tconst cycleDuration = 7000 / speed\n\tconst cycleProgress = (elapsed % cycleDuration) / cycleDuration\n\tconst waveProgress = cycleProgress * 1.555\n\n\tconst spread = 0.18\n\tconst maxOpacity = 0.18 * effectIntensity\n\tconst spreadFactor = 1 / (2 * spread * spread)\n\n\tfor (let i = 0; i < panes.length; i++) {\n\t\tconst pane = panes[i]\n\t\tconst normalizedPosition = pane.diagonalIndex / maxDiagonal\n\t\tconst distance = Math.abs(normalizedPosition - waveProgress)\n\n\t\tif (distance > 0.5) {\n\t\t\tif (pane.element.getAttribute('opacity') !== '0') {\n\t\t\t\tpane.element.setAttribute('opacity', '0')\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tlet localIntensity = Math.exp(-distance * distance * spreadFactor)\n\n\t\tlocalIntensity =\n\t\t\tlocalIntensity < 0.5\n\t\t\t\t? 4 * localIntensity * localIntensity * localIntensity\n\t\t\t\t: 1 - Math.pow(-2 * localIntensity + 2, 3) / 2\n\n\t\tconst opacity = localIntensity * maxOpacity\n\t\tpane.element.setAttribute('opacity', opacity.toFixed(3))\n\t}\n}\n\nfunction createGridPath(cols: number, rows: number, width: number, height: number): string {\n\tlet path = ''\n\tfor (let row = 0; row <= rows; row++) {\n\t\tconst y = row * height\n\t\tpath += `M 0,${y} L 100,${y} `\n\t}\n\tfor (let col = 0; col <= cols; col++) {\n\t\tconst x = col * width\n\t\tpath += `M ${x},0 L ${x},100 `\n\t}\n\treturn path\n}\n","/**\n * Particle Pool\n *\n * Reusable object pool for SVG particles to avoid constant creation/destruction.\n * Used by samwa (leaves), howl (steam), error (lightning), snow (flakes) effects.\n */\n\nexport class ParticlePool<T extends SVGElement> {\n\tprivate pool: T[] = []\n\tprivate active = new Set<T>()\n\tprivate factory: () => T\n\n\tconstructor(factory: () => T, initialSize: number = 10) {\n\t\tthis.factory = factory\n\t\tfor (let i = 0; i < initialSize; i++) {\n\t\t\tthis.pool.push(factory())\n\t\t}\n\t}\n\n\tacquire(): T {\n\t\tlet particle = this.pool.pop()\n\t\tif (!particle) particle = this.factory()\n\t\tthis.active.add(particle)\n\t\treturn particle\n\t}\n\n\trelease(particle: T) {\n\t\tthis.active.delete(particle)\n\t\tparticle.setAttribute('opacity', '0')\n\t\tthis.pool.push(particle)\n\t}\n\n\tclear() {\n\t\tthis.active.forEach(p => this.release(p))\n\t}\n\n\tget activeCount() {\n\t\treturn this.active.size\n\t}\n}\n","/**\n * Samwa Effect — Ambient geometric particles with gentle physics.\n * Color-responsive palette derived from the passed `color` prop; organic wind system.\n */\n\nimport type { ArtState, FallingParticle } from '../types'\nimport { ParticlePool } from '../particle-pool'\nimport { createOverlayContainer, createSVG } from '../utils'\n\nfunction hexToRgb(hex: string): [number, number, number] {\n\tconst h = hex.replace('#', '')\n\tconst n = parseInt(h.length === 3 ? h.split('').map(c => c + c).join('') : h, 16)\n\treturn [(n >> 16) & 255, (n >> 8) & 255, n & 255]\n}\n\nfunction lighten(r: number, g: number, b: number, amount: number): string {\n\tconst lr = Math.round(r + (255 - r) * amount)\n\tconst lg = Math.round(g + (255 - g) * amount)\n\tconst lb = Math.round(b + (255 - b) * amount)\n\treturn `#${((1 << 24) | (lr << 16) | (lg << 8) | lb).toString(16).slice(1)}`\n}\n\nfunction generatePalette(baseColor: string): string[] {\n\tconst [r, g, b] = hexToRgb(baseColor)\n\treturn [\n\t\tlighten(r, g, b, 0.92),\n\t\tlighten(r, g, b, 0.8),\n\t\tlighten(r, g, b, 0.65),\n\t\tlighten(r, g, b, 0.5),\n\t\tlighten(r, g, b, 0.35),\n\t\tlighten(r, g, b, 0.18),\n\t\tbaseColor,\n\t]\n}\n\nconst SHAPES = [\n\t'M 2,0.4 A 1.6,1.6 0 1,1 2,3.6 A 1.6,1.6 0 1,1 2,0.4 Z',\n\t'M 2,0.2 L 3.8,2 L 2,3.8 L 0.2,2 Z',\n\t'M 2,0.3 L 3.5,1.15 L 3.5,2.85 L 2,3.7 L 0.5,2.85 L 0.5,1.15 Z',\n\t'M 2,0.3 L 3.7,3.4 L 0.3,3.4 Z',\n\t'M 1.4,0.4 L 2.6,0.4 L 2.6,1.4 L 3.6,1.4 L 3.6,2.6 L 2.6,2.6 L 2.6,3.6 L 1.4,3.6 L 1.4,2.6 L 0.4,2.6 L 0.4,1.4 L 1.4,1.4 Z',\n\t'M 2,0 A 2,2 0 1,1 2,4 A 2,2 0 1,1 2,0 Z M 2,0.8 A 1.2,1.2 0 1,0 2,3.2 A 1.2,1.2 0 1,0 2,0.8 Z',\n\t'M 0.4,1.6 L 3.6,1.6 L 3.6,2.4 L 0.4,2.4 Z',\n]\n\nconst PARTICLE_SIZES = [\n\t{ scale: 0.8, fallSpeed: 0.12, windSensitivity: 2.2, tumbleSpeed: 0.6 },\n\t{ scale: 1.2, fallSpeed: 0.18, windSensitivity: 1.6, tumbleSpeed: 0.5 },\n\t{ scale: 1.6, fallSpeed: 0.25, windSensitivity: 1.2, tumbleSpeed: 0.35 },\n]\n\nconst DEPTH_LAYERS = [\n\t{ opacity: 0.12, blur: 0.8 },\n\t{ opacity: 0.2, blur: 0.3 },\n\t{ opacity: 0.3, blur: 0 },\n]\n\nconst SPAWN_ZONES = [\n\t{ x: 0, xRange: 15, vx: 0.3 },\n\t{ x: 15, xRange: 25, vx: 0.1 },\n\t{ x: 40, xRange: 20, vx: 0 },\n\t{ x: 60, xRange: 25, vx: -0.1 },\n\t{ x: 85, xRange: 15, vx: -0.3 },\n]\n\nexport function createSamwaOverlay(state: ArtState): void {\n\tconst { element, color } = state\n\tconst overlay = createOverlayContainer('samwa-overlay')\n\tconst svg = createSVG()\n\n\toverlay.appendChild(svg)\n\telement.appendChild(overlay)\n\n\tconst palette = generatePalette(color)\n\n\tlet shapeIndex = 0\n\tconst particleFactory = () => {\n\t\tconst particle = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\t\tconst idx = shapeIndex % SHAPES.length\n\t\tparticle.setAttribute('d', SHAPES[idx])\n\t\tparticle.setAttribute('fill', palette[idx])\n\t\tparticle.setAttribute('opacity', '0')\n\t\tif (idx === 5) particle.setAttribute('fill-rule', 'evenodd')\n\t\tparticle.style.mixBlendMode = 'soft-light'\n\t\tparticle.style.willChange = 'transform, opacity'\n\t\tparticle.style.transform = 'translate(-100px, -100px)'\n\t\tsvg.appendChild(particle)\n\t\tshapeIndex++\n\t\treturn particle\n\t}\n\n\tstate.overlayElement = overlay\n\tstate.samwa = {\n\t\tleafPool: new ParticlePool(particleFactory, 18),\n\t\tfallingLeaves: [],\n\t\twindStrength: 0,\n\t\twindDirection: 1,\n\t\tlastWindTime: performance.now(),\n\t\tlastLeafSpawn: performance.now(),\n\t\tstartTime: performance.now(),\n\t}\n}\n\nexport function animateSamwa(state: ArtState, currentTime: number): void {\n\tif (!state.samwa) return\n\n\tconst { intensity: effectIntensity = 1, speed = 1 } = state\n\tconst { leafPool, fallingLeaves } = state.samwa\n\n\tif (effectIntensity <= 0) {\n\t\tfor (const leaf of fallingLeaves) {\n\t\t\tleaf.element.setAttribute('opacity', '0')\n\t\t}\n\t\treturn\n\t}\n\n\tconst timeSinceWind = currentTime - state.samwa.lastWindTime\n\n\tconst gustInterval = (4000 + Math.random() * 4000) / speed\n\tif (timeSinceWind > gustInterval) {\n\t\tconst isStrongGust = Math.random() < 0.3\n\t\tstate.samwa.windStrength = isStrongGust ? 1.5 : 0.8 + Math.random() * 0.4\n\t\tstate.samwa.windDirection = Math.random() > 0.5 ? 1 : -1\n\t\tstate.samwa.lastWindTime = currentTime\n\t}\n\n\tconst windOscillation = Math.sin(currentTime * 0.001) * 0.1\n\tstate.samwa.windStrength = Math.max(0, state.samwa.windStrength - 0.008 + windOscillation * 0.002)\n\n\tconst spawnInterval = (800 + Math.random() * 1200) / speed\n\tconst maxLeaves = Math.max(1, Math.round(12 * effectIntensity))\n\tif (currentTime - state.samwa.lastLeafSpawn > spawnInterval && leafPool.activeCount < maxLeaves) {\n\t\tconst leaf = leafPool.acquire()\n\n\t\tconst zoneWeights = [0.25, 0.15, 0.2, 0.15, 0.25]\n\t\tlet zoneRoll = Math.random()\n\t\tlet zoneIndex = 0\n\t\tfor (let i = 0; i < zoneWeights.length; i++) {\n\t\t\tzoneRoll -= zoneWeights[i]\n\t\t\tif (zoneRoll <= 0) {\n\t\t\t\tzoneIndex = i\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tconst zone = SPAWN_ZONES[zoneIndex]\n\n\t\tconst sizeIndex = Math.floor(Math.random() * PARTICLE_SIZES.length)\n\t\tconst depthIndex = Math.floor(Math.random() * DEPTH_LAYERS.length)\n\t\tconst sizeProps = PARTICLE_SIZES[sizeIndex]\n\n\t\tconst newLeaf: FallingParticle = {\n\t\t\telement: leaf,\n\t\t\tx: zone.x + Math.random() * zone.xRange,\n\t\t\ty: -5 - Math.random() * 15,\n\t\t\tvx: zone.vx * 0.5 + (Math.random() - 0.5) * 0.1,\n\t\t\tvy: sizeProps.fallSpeed * (0.85 + Math.random() * 0.3),\n\t\t\tlife: 1,\n\t\t\trotation: Math.random() * 360,\n\t\t\tphase: Math.random() * Math.PI * 2,\n\t\t\tsizeIndex,\n\t\t\tdepthIndex,\n\t\t\ttumbleDirection: Math.random() > 0.5 ? 1 : -1,\n\t\t\tflutterAmplitude: 0.15 + Math.random() * 0.25,\n\t\t\tflutterFrequency: 0.012 + Math.random() * 0.008,\n\t\t\tspawnTime: currentTime,\n\t\t}\n\n\t\tfallingLeaves.push(newLeaf)\n\t\tstate.samwa.lastLeafSpawn = currentTime\n\t}\n\n\tconst windStrength = state.samwa.windStrength\n\tconst windDirection = state.samwa.windDirection\n\n\tfor (let i = fallingLeaves.length - 1; i >= 0; i--) {\n\t\tconst p = fallingLeaves[i]\n\t\tconst sizeProps = PARTICLE_SIZES[p.sizeIndex]\n\t\tconst depthProps = DEPTH_LAYERS[p.depthIndex]\n\n\t\tconst windEffect = windStrength * windDirection * sizeProps.windSensitivity * 0.6\n\n\t\tconst flutterOffset = Math.sin(p.y * p.flutterFrequency + p.phase) * p.flutterAmplitude\n\t\tconst secondaryWave =\n\t\t\tMath.sin(p.y * p.flutterFrequency * 0.5 + p.phase * 1.3) * p.flutterAmplitude * 0.4\n\t\tconst tertiaryWave =\n\t\t\tMath.sin(p.y * p.flutterFrequency * 0.25 + p.phase * 0.7) * p.flutterAmplitude * 0.2\n\n\t\tp.vx += windEffect * 0.01\n\t\tp.vx += (flutterOffset + secondaryWave + tertiaryWave) * 0.025\n\t\tp.vx *= 0.97\n\n\t\tconst verticalWind = Math.sin(currentTime * 0.0003 * speed + p.phase) * 0.03\n\t\tp.vy = (sizeProps.fallSpeed + verticalWind) * speed\n\n\t\tp.x += p.vx\n\t\tp.y += p.vy\n\n\t\tconst baseRotationSpeed = sizeProps.tumbleSpeed * p.tumbleDirection * 0.7\n\t\tconst windRotation = windStrength * windDirection * 0.8\n\t\tp.rotation += baseRotationSpeed + windRotation + flutterOffset\n\n\t\tconst age = currentTime - p.spawnTime\n\t\tconst fadeInDuration = 600\n\t\tconst fadeOutStart = 80\n\n\t\tlet opacity = depthProps.opacity * effectIntensity\n\n\t\tif (age < fadeInDuration) {\n\t\t\topacity *= age / fadeInDuration\n\t\t}\n\n\t\tif (p.y > fadeOutStart) {\n\t\t\tconst fadeProgress = (p.y - fadeOutStart) / (110 - fadeOutStart)\n\t\t\topacity *= 1 - fadeProgress\n\t\t}\n\n\t\tconst scale = sizeProps.scale * (0.8 + depthProps.opacity)\n\n\t\tp.element.style.transform = `translate(${p.x.toFixed(1)}px, ${p.y.toFixed(1)}px) rotate(${p.rotation.toFixed(0)}deg) scale(${scale.toFixed(2)})`\n\t\tp.element.style.filter = depthProps.blur > 0 ? `blur(${depthProps.blur}px)` : ''\n\t\tp.element.setAttribute('opacity', Math.max(0, opacity).toFixed(3))\n\n\t\tif (p.y > 110 || p.x < -10 || p.x > 110) {\n\t\t\tleafPool.release(p.element)\n\t\t\tfallingLeaves.splice(i, 1)\n\t\t}\n\t}\n}\n","/**\n * Howl Effect — Steampunk gears, sparkles, crystals, rising steam.\n * 17-second cycle, layered animations.\n */\n\nimport type { ArtState } from '../types'\nimport { ParticlePool } from '../particle-pool'\nimport { createOverlayContainer, createSVG } from '../utils'\n\nexport function createHowlOverlay(state: ArtState): void {\n\tconst { element, color } = state\n\tconst overlay = createOverlayContainer('howl-overlay')\n\tconst svg = createSVG()\n\n\tconst gearsGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\tconst gearConfigs = [\n\t\t{ cx: 15, cy: 20, r: 8, teeth: 12, speed: 0.5 },\n\t\t{ cx: 85, cy: 25, r: 6, teeth: 10, speed: -0.7 },\n\t\t{ cx: 30, cy: 80, r: 10, teeth: 16, speed: 0.4 },\n\t\t{ cx: 75, cy: 75, r: 7, teeth: 12, speed: -0.6 },\n\t]\n\n\tconst gears = gearConfigs.map(config => {\n\t\tconst g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\t\tg.style.transformOrigin = `${config.cx}% ${config.cy}%`\n\t\tg.style.willChange = 'transform'\n\n\t\tconst path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\t\tpath.setAttribute('d', createGearPath(config.cx, config.cy, config.r, config.teeth))\n\t\tpath.setAttribute('fill', color)\n\t\tpath.setAttribute('opacity', '0.3')\n\t\tpath.style.mixBlendMode = 'screen'\n\n\t\tg.appendChild(path)\n\t\tgearsGroup.appendChild(g)\n\t\treturn { element: g, speed: config.speed }\n\t})\n\n\tconst sparklesGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\tconst sparkles: NonNullable<ArtState['howl']>['sparkles'] = []\n\n\tfor (let i = 0; i < 6; i++) {\n\t\tconst path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\t\tconst x = 10 + Math.random() * 80\n\t\tconst y = 10 + Math.random() * 80\n\t\tconst size = 0.3 + Math.random() * 0.5\n\n\t\tconst sparklePath = `M ${x},${y - size} L ${x + size * 0.3},${y} L ${x},${y + size} L ${x - size * 0.3},${y} Z`\n\t\tpath.setAttribute('d', sparklePath)\n\t\tpath.setAttribute('fill', color)\n\t\tpath.style.mixBlendMode = 'screen'\n\t\tpath.style.willChange = 'opacity, transform'\n\n\t\tsparklesGroup.appendChild(path)\n\t\tsparkles.push({\n\t\t\telement: path,\n\t\t\tbaseX: x,\n\t\t\tbaseY: y,\n\t\t\tphase: Math.random() * Math.PI * 2,\n\t\t\tspeed: 0.5 + Math.random() * 1.5,\n\t\t})\n\t}\n\n\tconst crystalsGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\tconst crystals: NonNullable<ArtState['howl']>['crystals'] = []\n\n\tfor (let i = 0; i < 4; i++) {\n\t\tconst polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polygon')\n\t\tconst x = 20 + Math.random() * 60\n\t\tconst y = 20 + Math.random() * 60\n\t\tconst size = 0.8 + Math.random() * 1.2\n\n\t\tpolygon.setAttribute(\n\t\t\t'points',\n\t\t\t`${x},${y - size} ${x + size * 0.6},${y} ${x},${y + size} ${x - size * 0.6},${y}`,\n\t\t)\n\t\tpolygon.setAttribute('fill', color)\n\t\tpolygon.style.mixBlendMode = 'screen'\n\t\tpolygon.style.willChange = 'transform, opacity'\n\n\t\tcrystalsGroup.appendChild(polygon)\n\t\tcrystals.push({\n\t\t\telement: polygon,\n\t\t\tbaseX: x,\n\t\t\tbaseY: y,\n\t\t\tphase: Math.random() * Math.PI * 2,\n\t\t\trotSpeed: 0.5 + Math.random(),\n\t\t})\n\t}\n\n\tsvg.appendChild(gearsGroup)\n\tsvg.appendChild(sparklesGroup)\n\tsvg.appendChild(crystalsGroup)\n\toverlay.appendChild(svg)\n\telement.appendChild(overlay)\n\n\tconst steamFactory = () => {\n\t\tconst circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n\t\tcircle.setAttribute('fill', color)\n\t\tcircle.style.mixBlendMode = 'screen'\n\t\tcircle.style.willChange = 'transform, opacity'\n\t\tsvg.appendChild(circle)\n\t\treturn circle\n\t}\n\n\tstate.overlayElement = overlay\n\tstate.howl = {\n\t\tgears,\n\t\tsparkles,\n\t\tsteamPool: new ParticlePool(steamFactory, 12),\n\t\tsteamParticles: [],\n\t\twisps: [],\n\t\tcrystals,\n\t\tlastSteamSpawn: performance.now(),\n\t\tstartTime: performance.now(),\n\t}\n}\n\nexport function animateHowl(state: ArtState, currentTime: number): void {\n\tif (!state.howl) return\n\n\tconst { gears, sparkles, crystals, steamPool, steamParticles, startTime } = state.howl\n\tconst elapsed = currentTime - startTime\n\tconst cycleProgress = (elapsed % 17000) / 17000\n\n\tgears.forEach(gear => {\n\t\tconst rotation = (elapsed / 80) * gear.speed\n\t\tgear.element.style.transform = `rotate(${rotation.toFixed(1)}deg)`\n\t})\n\n\tsparkles.forEach(sparkle => {\n\t\tconst twinkle = Math.sin((cycleProgress * sparkle.speed + sparkle.phase) * Math.PI * 2)\n\t\tconst opacity = 0.15 + twinkle * 0.25\n\n\t\tconst floatX = Math.sin((elapsed / 2000) * sparkle.speed + sparkle.phase) * 0.3\n\t\tconst floatY = Math.cos((elapsed / 2000) * sparkle.speed + sparkle.phase) * 0.2\n\n\t\tsparkle.element.setAttribute('opacity', opacity.toFixed(3))\n\t\tsparkle.element.style.transform = `translate(${floatX.toFixed(2)}px, ${floatY.toFixed(2)}px)`\n\t})\n\n\tcrystals.forEach(crystal => {\n\t\tconst floatX = Math.sin((elapsed / 3500) * crystal.rotSpeed + crystal.phase) * 1.5\n\t\tconst floatY = Math.cos((elapsed / 4000) * crystal.rotSpeed + crystal.phase) * 1.2\n\t\tconst rotation = (elapsed / 120) * crystal.rotSpeed\n\n\t\tconst pulse = Math.sin((cycleProgress + crystal.phase / (Math.PI * 2)) * Math.PI * 2)\n\t\tconst opacity = 0.12 + pulse * 0.18\n\n\t\tcrystal.element.style.transform = `translate(${floatX.toFixed(1)}px, ${floatY.toFixed(1)}px) rotate(${rotation.toFixed(1)}deg)`\n\t\tcrystal.element.setAttribute('opacity', opacity.toFixed(3))\n\t})\n\n\tif (currentTime - state.howl.lastSteamSpawn > 600 && steamPool.activeCount < 12) {\n\t\tconst steam = steamPool.acquire()\n\t\tsteamParticles.push({\n\t\t\telement: steam,\n\t\t\tx: 10 + Math.random() * 80,\n\t\t\ty: 105,\n\t\t\tvx: (Math.random() - 0.5) * 0.15,\n\t\t\tvy: -0.25 - Math.random() * 0.25,\n\t\t\tlife: 1,\n\t\t\tscale: 0.5 + Math.random(),\n\t\t})\n\t\tstate.howl.lastSteamSpawn = currentTime\n\t}\n\n\tfor (let i = steamParticles.length - 1; i >= 0; i--) {\n\t\tconst p = steamParticles[i]\n\n\t\tp.x += p.vx\n\t\tp.y += p.vy\n\t\tp.life -= 0.008\n\t\tp.scale! += 0.02\n\n\t\tp.element.style.transform = `translate(${p.x.toFixed(1)}px, ${p.y.toFixed(1)}px)`\n\t\tp.element.setAttribute('r', p.scale!.toFixed(2))\n\t\tp.element.setAttribute('opacity', (p.life * 0.18).toFixed(3))\n\n\t\tif (p.life <= 0 || p.y < -10) {\n\t\t\tsteamPool.release(p.element)\n\t\t\tsteamParticles.splice(i, 1)\n\t\t}\n\t}\n}\n\nfunction createGearPath(cx: number, cy: number, r: number, teeth: number): string {\n\tconst toothHeight = r * 0.2\n\tconst innerR = r - toothHeight\n\tlet path = ''\n\n\tfor (let i = 0; i < teeth; i++) {\n\t\tconst a1 = (i / teeth) * Math.PI * 2\n\t\tconst a2 = ((i + 0.4) / teeth) * Math.PI * 2\n\t\tconst a3 = ((i + 0.6) / teeth) * Math.PI * 2\n\t\tconst a4 = ((i + 1) / teeth) * Math.PI * 2\n\n\t\tif (i === 0) path += `M ${cx + innerR * Math.cos(a1)},${cy + innerR * Math.sin(a1)} `\n\t\tpath += `L ${cx + r * Math.cos(a2)},${cy + r * Math.sin(a2)} L ${cx + r * Math.cos(a3)},${cy + r * Math.sin(a3)} L ${cx + innerR * Math.cos(a4)},${cy + innerR * Math.sin(a4)} `\n\t}\n\n\treturn path + 'Z'\n}\n","/**\n * Error Effect — Electrical/warning glow on edges with static particles and lightning bolts.\n * 2.5-second main pulse cycle.\n */\n\nimport type { ArtState } from '../types'\nimport { ParticlePool } from '../particle-pool'\nimport { createOverlayContainer, createSVG } from '../utils'\n\nexport function createErrorOverlay(state: ArtState): void {\n\tconst { element, color } = state\n\tconst overlay = createOverlayContainer('error-overlay')\n\tconst svg = createSVG()\n\n\tconst edgeGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\tconst edges = [\n\t\t{ x: 0, y: 0, width: 100, height: 0.5 },\n\t\t{ x: 0, y: 99.5, width: 100, height: 0.5 },\n\t\t{ x: 0, y: 0, width: 0.5, height: 100 },\n\t\t{ x: 99.5, y: 0, width: 0.5, height: 100 },\n\t]\n\n\tconst edgeElements = edges.map(edge => {\n\t\tconst rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n\t\trect.setAttribute('x', edge.x.toString())\n\t\trect.setAttribute('y', edge.y.toString())\n\t\trect.setAttribute('width', edge.width.toString())\n\t\trect.setAttribute('height', edge.height.toString())\n\t\trect.setAttribute('fill', color)\n\t\trect.style.mixBlendMode = 'screen'\n\t\trect.style.willChange = 'opacity'\n\t\tedgeGroup.appendChild(rect)\n\t\treturn rect\n\t})\n\n\tconst staticGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\tconst staticParticles: NonNullable<ArtState['error']>['staticParticles'] = []\n\n\tfor (let i = 0; i < 4; i++) {\n\t\tconst circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n\t\tcircle.setAttribute('r', '0.3')\n\t\tcircle.setAttribute('fill', color)\n\t\tcircle.style.mixBlendMode = 'screen'\n\t\tcircle.style.willChange = 'opacity'\n\t\tstaticGroup.appendChild(circle)\n\t\tstaticParticles.push({ element: circle, edge: i % 4 })\n\t}\n\n\tsvg.appendChild(edgeGroup)\n\tsvg.appendChild(staticGroup)\n\toverlay.appendChild(svg)\n\telement.appendChild(overlay)\n\n\tconst boltFactory = () => {\n\t\tconst path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\t\tpath.setAttribute('stroke', color)\n\t\tpath.setAttribute('stroke-width', '0.5')\n\t\tpath.setAttribute('fill', 'none')\n\t\tpath.style.mixBlendMode = 'screen'\n\t\tpath.style.willChange = 'opacity'\n\t\tsvg.appendChild(path)\n\t\treturn path\n\t}\n\n\tstate.overlayElement = overlay\n\tstate.error = {\n\t\tedges: edgeElements,\n\t\tstaticParticles,\n\t\tboltPool: new ParticlePool(boltFactory, 5),\n\t\tlightningBolts: [],\n\t\tlastLightningSpawn: performance.now(),\n\t\tstartTime: performance.now(),\n\t}\n}\n\nexport function animateError(state: ArtState, currentTime: number): void {\n\tif (!state.error) return\n\n\tconst { edges, staticParticles, boltPool, lightningBolts, startTime } = state.error\n\tconst elapsed = currentTime - startTime\n\tconst cycleProgress = (elapsed % 2500) / 2500\n\n\tconst edgePulse = Math.sin(cycleProgress * Math.PI * 4) * 0.5 + 0.5\n\tconst edgeOpacity = 0.08 + edgePulse * 0.17\n\tedges.forEach(edge => edge.setAttribute('opacity', edgeOpacity.toFixed(3)))\n\n\tstaticParticles.forEach((particle, index) => {\n\t\tconst particlePhase = (cycleProgress + index * 0.125) % 1.0\n\t\tlet x = 0,\n\t\t\ty = 0\n\n\t\tswitch (particle.edge) {\n\t\t\tcase 0:\n\t\t\t\tx = Math.random() * 100\n\t\t\t\ty = Math.random() * 5\n\t\t\t\tbreak\n\t\t\tcase 1:\n\t\t\t\tx = 95 + Math.random() * 5\n\t\t\t\ty = Math.random() * 100\n\t\t\t\tbreak\n\t\t\tcase 2:\n\t\t\t\tx = Math.random() * 100\n\t\t\t\ty = 95 + Math.random() * 5\n\t\t\t\tbreak\n\t\t\tcase 3:\n\t\t\t\tx = Math.random() * 5\n\t\t\t\ty = Math.random() * 100\n\t\t\t\tbreak\n\t\t}\n\n\t\tparticle.element.setAttribute('cx', x.toString())\n\t\tparticle.element.setAttribute('cy', y.toString())\n\n\t\tconst flicker = Math.sin(particlePhase * Math.PI * 2) * 0.5 + 0.5\n\t\tparticle.element.setAttribute('opacity', (flicker * 0.35).toFixed(3))\n\t})\n\n\tif (currentTime - state.error.lastLightningSpawn > 1500 && boltPool.activeCount < 3) {\n\t\tconst bolt = boltPool.acquire()\n\t\tconst edge = Math.floor(Math.random() * 4)\n\t\tlet startX = 0,\n\t\t\tstartY = 0,\n\t\t\tendX = 0,\n\t\t\tendY = 0\n\n\t\tswitch (edge) {\n\t\t\tcase 0:\n\t\t\t\tstartX = Math.random() * 100\n\t\t\t\tstartY = 0\n\t\t\t\tendX = Math.random() * 100\n\t\t\t\tendY = 50\n\t\t\t\tbreak\n\t\t\tcase 1:\n\t\t\t\tstartX = 100\n\t\t\t\tstartY = Math.random() * 100\n\t\t\t\tendX = 70\n\t\t\t\tendY = Math.random() * 100\n\t\t\t\tbreak\n\t\t\tcase 2:\n\t\t\t\tstartX = Math.random() * 100\n\t\t\t\tstartY = 100\n\t\t\t\tendX = Math.random() * 100\n\t\t\t\tendY = 50\n\t\t\t\tbreak\n\t\t\tcase 3:\n\t\t\t\tstartX = 0\n\t\t\t\tstartY = Math.random() * 100\n\t\t\t\tendX = 30\n\t\t\t\tendY = Math.random() * 100\n\t\t\t\tbreak\n\t\t}\n\n\t\tbolt.setAttribute('d', createLightningPath(startX, startY, endX, endY))\n\t\tlightningBolts.push({ element: bolt, x: 0, y: 0, vx: 0, vy: 0, life: 1 })\n\t\tstate.error.lastLightningSpawn = currentTime\n\t}\n\n\tfor (let i = lightningBolts.length - 1; i >= 0; i--) {\n\t\tconst bolt = lightningBolts[i]\n\t\tbolt.life -= 0.05\n\t\tconst opacity = bolt.life > 0.8 ? 0.7 : bolt.life * 0.875\n\t\tbolt.element.setAttribute('opacity', Math.max(0, opacity).toFixed(3))\n\n\t\tif (bolt.life <= 0) {\n\t\t\tboltPool.release(bolt.element)\n\t\t\tlightningBolts.splice(i, 1)\n\t\t}\n\t}\n}\n\nfunction createLightningPath(startX: number, startY: number, endX: number, endY: number): string {\n\tconst segments = 4\n\tlet path = `M ${startX.toFixed(1)},${startY.toFixed(1)}`\n\n\tconst deltaX = (endX - startX) / segments\n\tconst deltaY = (endY - startY) / segments\n\n\tlet currentX = startX\n\tlet currentY = startY\n\n\tfor (let i = 1; i < segments; i++) {\n\t\tconst jag = 3 + Math.random() * 5\n\t\tconst perpX = -deltaY * jag * (Math.random() - 0.5)\n\t\tconst perpY = deltaX * jag * (Math.random() - 0.5)\n\n\t\tcurrentX += deltaX + perpX\n\t\tcurrentY += deltaY + perpY\n\t\tpath += ` L ${currentX.toFixed(1)},${currentY.toFixed(1)}`\n\t}\n\n\treturn path + ` L ${endX.toFixed(1)},${endY.toFixed(1)}`\n}\n","/**\n * Snow Effect — Peaceful winter snowfall with snow/leaf shapes.\n * Same physics pattern as samwa effect but tuned for slower, floatier fall.\n */\n\nimport type { ArtState, FallingParticle } from '../types'\nimport { ParticlePool } from '../particle-pool'\nimport { createOverlayContainer, createSVG } from '../utils'\n\nconst SNOW_COLORS = [\n\t'#FFFFFF',\n\t'#F8FCFF',\n\t'#E8F4FF',\n\t'#F0F8FF',\n\t'#FAFEFF',\n\t'#E0F0FF',\n\t'#D4A574',\n\t'#C19A6B',\n\t'#8B4513',\n\t'#CD853F',\n]\n\nconst SNOWFLAKE_SHAPES = [\n\t'M 2,0 L 2.15,1.7 L 3.7,0.8 L 2.3,2 L 3.7,3.2 L 2.15,2.3 L 2,4 L 1.85,2.3 L 0.3,3.2 L 1.7,2 L 0.3,0.8 L 1.85,1.7 Z',\n\t'M 2,0.2 L 2.2,1.6 L 3.4,0.6 L 2.4,1.8 L 3.8,2 L 2.4,2.2 L 3.4,3.4 L 2.2,2.4 L 2,3.8 L 1.8,2.4 L 0.6,3.4 L 1.6,2.2 L 0.2,2 L 1.6,1.8 L 0.6,0.6 L 1.8,1.6 Z',\n\t'M 2,0.3 L 2.3,1.2 L 3.2,0.8 L 2.6,1.6 L 3.6,1.8 L 2.7,2.1 L 3.3,2.8 L 2.4,2.5 L 2,3.7 L 1.6,2.5 L 0.7,2.8 L 1.3,2.1 L 0.4,1.8 L 1.4,1.6 L 0.8,0.8 L 1.7,1.2 Z',\n\t'M 2,0.4 L 2.12,1.8 L 3.6,2 L 2.12,2.2 L 2,3.6 L 1.88,2.2 L 0.4,2 L 1.88,1.8 Z',\n\t'M 2,0.5 C 2.8,0.8 3.2,1.4 3.4,2 C 3.2,2.6 2.8,3.2 2,3.5 C 1.2,3.2 0.8,2.6 0.6,2 C 0.8,1.4 1.2,0.8 2,0.5 Z',\n\t'M 2,0.2 L 2.1,1.5 L 2.8,0.5 L 2.25,1.6 L 3.5,1.2 L 2.35,1.85 L 3.8,2 L 2.35,2.15 L 3.5,2.8 L 2.25,2.4 L 2.8,3.5 L 2.1,2.5 L 2,3.8 L 1.9,2.5 L 1.2,3.5 L 1.75,2.4 L 0.5,2.8 L 1.65,2.15 L 0.2,2 L 1.65,1.85 L 0.5,1.2 L 1.75,1.6 L 1.2,0.5 L 1.9,1.5 Z',\n\t'M 2,0.4 C 2.6,1 3,1.6 3.1,2.2 C 3,2.8 2.6,3.2 2,3.6 C 1.4,3.2 1,2.8 0.9,2.2 C 1,1.6 1.4,1 2,0.4 Z',\n\t'M 2,0.8 L 2.15,1.7 L 3.2,2 L 2.15,2.3 L 2,3.2 L 1.85,2.3 L 0.8,2 L 1.85,1.7 Z',\n]\n\nconst PARTICLE_SIZES = [\n\t{ scale: 0.7, fallSpeed: 0.03, windSensitivity: 2.8, tumbleSpeed: 0.15 },\n\t{ scale: 1.0, fallSpeed: 0.05, windSensitivity: 2.2, tumbleSpeed: 0.2 },\n\t{ scale: 1.4, fallSpeed: 0.07, windSensitivity: 1.6, tumbleSpeed: 0.15 },\n]\n\nconst DEPTH_LAYERS = [\n\t{ opacity: 0.2, blur: 0.8 },\n\t{ opacity: 0.35, blur: 0.3 },\n\t{ opacity: 0.55, blur: 0 },\n]\n\nconst SPAWN_ZONES = [\n\t{ x: 0, xRange: 20, vx: 0.2 },\n\t{ x: 20, xRange: 20, vx: 0.1 },\n\t{ x: 40, xRange: 20, vx: 0 },\n\t{ x: 60, xRange: 20, vx: -0.1 },\n\t{ x: 80, xRange: 20, vx: -0.2 },\n]\n\nexport function createSnowOverlay(state: ArtState): void {\n\tconst { element } = state\n\tconst overlay = createOverlayContainer('snow-overlay')\n\tconst svg = createSVG()\n\n\toverlay.appendChild(svg)\n\telement.appendChild(overlay)\n\n\tlet shapeIndex = 0\n\tconst particleFactory = () => {\n\t\tconst particle = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\t\tconst idx = shapeIndex % SNOWFLAKE_SHAPES.length\n\t\tconst colorIdx = Math.floor(Math.random() * SNOW_COLORS.length)\n\n\t\tparticle.setAttribute('d', SNOWFLAKE_SHAPES[idx])\n\t\tparticle.setAttribute('fill', SNOW_COLORS[colorIdx])\n\t\tparticle.setAttribute('opacity', '0')\n\t\tparticle.style.mixBlendMode = 'soft-light'\n\t\tparticle.style.willChange = 'transform, opacity'\n\t\tparticle.style.transform = 'translate(-100px, -100px)'\n\n\t\tsvg.appendChild(particle)\n\t\tshapeIndex++\n\t\treturn particle\n\t}\n\n\tstate.overlayElement = overlay\n\tstate.snow = {\n\t\tsnowflakePool: new ParticlePool(particleFactory, 20),\n\t\tfallingSnowflakes: [],\n\t\twindStrength: 0,\n\t\twindDirection: 1,\n\t\twindPhase: Math.random() * Math.PI * 2,\n\t\tlastWindGust: performance.now(),\n\t\tlastSpawn: performance.now(),\n\t\tstartTime: performance.now(),\n\t}\n}\n\nexport function animateSnow(state: ArtState, currentTime: number): void {\n\tif (!state.snow) return\n\n\tconst { intensity = 1, speed = 1 } = state\n\tconst { snowflakePool, fallingSnowflakes } = state.snow\n\n\tif (intensity <= 0) {\n\t\tfor (const flake of fallingSnowflakes) {\n\t\t\tflake.element.setAttribute('opacity', '0')\n\t\t}\n\t\treturn\n\t}\n\n\tconst timeSinceWind = currentTime - state.snow.lastWindGust\n\tconst gustInterval = (8000 + Math.random() * 8000) / speed\n\n\tif (timeSinceWind > gustInterval) {\n\t\tconst isStrongGust = Math.random() < 0.15\n\t\tstate.snow.windStrength = isStrongGust ? 0.8 : 0.3 + Math.random() * 0.3\n\t\tstate.snow.windDirection = Math.random() > 0.5 ? 1 : -1\n\t\tstate.snow.lastWindGust = currentTime\n\t}\n\n\tconst windOscillation = Math.sin(currentTime * 0.0005) * 0.08\n\tstate.snow.windStrength = Math.max(0, state.snow.windStrength - 0.003 + windOscillation * 0.001)\n\n\tconst spawnInterval = (1200 + Math.random() * 1500) / speed\n\tconst maxFlakes = Math.max(2, Math.round(12 * intensity))\n\n\tif (currentTime - state.snow.lastSpawn > spawnInterval && snowflakePool.activeCount < maxFlakes) {\n\t\tconst flake = snowflakePool.acquire()\n\n\t\tconst zoneIndex = Math.floor(Math.random() * SPAWN_ZONES.length)\n\t\tconst zone = SPAWN_ZONES[zoneIndex]\n\n\t\tconst sizeIndex = Math.floor(Math.random() * PARTICLE_SIZES.length)\n\t\tconst depthIndex = Math.floor(Math.random() * DEPTH_LAYERS.length)\n\t\tconst sizeProps = PARTICLE_SIZES[sizeIndex]\n\n\t\tconst newFlake: FallingParticle = {\n\t\t\telement: flake,\n\t\t\tx: zone.x + Math.random() * zone.xRange,\n\t\t\ty: -5 - Math.random() * 15,\n\t\t\tvx: zone.vx * 0.5 + (Math.random() - 0.5) * 0.1,\n\t\t\tvy: sizeProps.fallSpeed * (0.85 + Math.random() * 0.3),\n\t\t\tlife: 1,\n\t\t\trotation: Math.random() * 360,\n\t\t\tphase: Math.random() * Math.PI * 2,\n\t\t\tsizeIndex,\n\t\t\tdepthIndex,\n\t\t\ttumbleDirection: Math.random() > 0.5 ? 1 : -1,\n\t\t\tflutterAmplitude: 0.06 + Math.random() * 0.1,\n\t\t\tflutterFrequency: 0.008 + Math.random() * 0.005,\n\t\t\tspawnTime: currentTime,\n\t\t}\n\n\t\tfallingSnowflakes.push(newFlake)\n\t\tstate.snow.lastSpawn = currentTime\n\t}\n\n\tconst windStrength = state.snow.windStrength\n\tconst windDirection = state.snow.windDirection\n\n\tfor (let i = fallingSnowflakes.length - 1; i >= 0; i--) {\n\t\tconst p = fallingSnowflakes[i]\n\t\tconst sizeProps = PARTICLE_SIZES[p.sizeIndex]\n\t\tconst depthProps = DEPTH_LAYERS[p.depthIndex]\n\n\t\tconst windEffect = windStrength * windDirection * sizeProps.windSensitivity * 0.4\n\n\t\tconst flutterOffset = Math.sin(p.y * p.flutterFrequency + p.phase) * p.flutterAmplitude\n\t\tconst secondaryWave =\n\t\t\tMath.sin(p.y * p.flutterFrequency * 0.5 + p.phase * 1.3) * p.flutterAmplitude * 0.3\n\n\t\tp.vx += windEffect * 0.006\n\t\tp.vx += (flutterOffset + secondaryWave) * 0.015\n\t\tp.vx *= 0.985\n\n\t\tconst verticalWind = Math.sin(currentTime * 0.0002 * speed + p.phase) * 0.015\n\t\tp.vy = (sizeProps.fallSpeed + verticalWind) * speed\n\n\t\tp.x += p.vx\n\t\tp.y += p.vy\n\n\t\tconst baseRotationSpeed = sizeProps.tumbleSpeed * p.tumbleDirection * 0.4\n\t\tconst windRotation = windStrength * windDirection * 0.3\n\t\tp.rotation += baseRotationSpeed + windRotation + flutterOffset * 0.5\n\n\t\tconst age = currentTime - p.spawnTime\n\t\tconst fadeInDuration = 1000\n\t\tconst fadeOutStart = 75\n\n\t\tlet opacity = depthProps.opacity * intensity\n\n\t\tif (age < fadeInDuration) {\n\t\t\topacity *= age / fadeInDuration\n\t\t}\n\n\t\tif (p.y > fadeOutStart) {\n\t\t\tconst fadeProgress = (p.y - fadeOutStart) / (110 - fadeOutStart)\n\t\t\topacity *= 1 - fadeProgress\n\t\t}\n\n\t\tconst scale = sizeProps.scale * (0.8 + depthProps.opacity)\n\n\t\tp.element.style.transform = `translate(${p.x.toFixed(1)}px, ${p.y.toFixed(1)}px) rotate(${p.rotation.toFixed(0)}deg) scale(${scale.toFixed(2)})`\n\t\tp.element.style.filter = depthProps.blur > 0 ? `blur(${depthProps.blur}px)` : ''\n\t\tp.element.setAttribute('opacity', Math.max(0, opacity).toFixed(3))\n\n\t\tif (p.y > 110 || p.x < -10 || p.x > 110) {\n\t\t\tsnowflakePool.release(p.element)\n\t\t\tfallingSnowflakes.splice(i, 1)\n\t\t}\n\t}\n}\n","/**\n * Starfield Effect — Night sky with twinkling stars.\n *\n * 6 groups × 7 stars using CSS radial-gradient backgrounds.\n * Wave-by-wave fade-in (group 0 first, then 1, 2, …); gentle twinkle once visible.\n * Opacity driven by RAF instead of CSS @keyframes to avoid Shadow DOM scoping.\n */\n\nimport type { ArtState } from '../types'\nimport { createOverlayContainer } from '../utils'\n\nconst GROUP_COUNT = 6\nconst STARS_PER_GROUP = 7\n\nfunction generateStarGroups() {\n\treturn Array.from({ length: GROUP_COUNT }, (_, g) => {\n\t\tconst stops: string[] = []\n\t\tfor (let i = 0; i < STARS_PER_GROUP; i++) {\n\t\t\tconst x = Math.random() * 96 + 2\n\t\t\tconst y = Math.random() * 94 + 3\n\t\t\tconst size = 0.8 + Math.random() * 1.5\n\t\t\tconst alpha = 0.3 + Math.random() * 0.7\n\t\t\tstops.push(\n\t\t\t\t`radial-gradient(circle ${size}px at ${x}% ${y}%, rgba(255,255,255,${alpha}) 0%, transparent 100%)`,\n\t\t\t)\n\t\t}\n\t\tconst appearDelay = g * 0.6\n\t\treturn {\n\t\t\tbg: stops.join(','),\n\t\t\tappearDelay,\n\t\t\ttwinkleDuration: 5 + g * 0.7,\n\t\t\ttwinkleDelay: appearDelay + 2.5,\n\t\t}\n\t})\n}\n\nexport function createStarfieldOverlay(state: ArtState): void {\n\tconst { element } = state\n\tconst overlay = createOverlayContainer('starfield-overlay')\n\n\tconst starArea = document.createElement('div')\n\tstarArea.style.cssText = 'position:absolute;bottom:0;right:0;width:66vw;height:66vw;'\n\toverlay.appendChild(starArea)\n\n\tconst generated = generateStarGroups()\n\tconst groups: NonNullable<ArtState['starfield']>['groups'] = []\n\n\tfor (const g of generated) {\n\t\tconst div = document.createElement('div')\n\t\tdiv.style.cssText = `position:absolute;inset:0;opacity:0;will-change:opacity;background:${g.bg};`\n\t\tstarArea.appendChild(div)\n\t\tgroups.push({\n\t\t\telement: div,\n\t\t\tappearDelay: g.appearDelay,\n\t\t\ttwinkleDuration: g.twinkleDuration,\n\t\t\ttwinkleDelay: g.twinkleDelay,\n\t\t})\n\t}\n\n\telement.appendChild(overlay)\n\tstate.overlayElement = overlay\n\tstate.starfield = { groups, startTime: performance.now() }\n}\n\nexport function animateStarfield(state: ArtState, currentTime: number): void {\n\tif (!state.starfield) return\n\n\tconst { intensity = 1, speed = 1 } = state\n\tconst { groups, startTime } = state.starfield\n\tconst elapsed = ((currentTime - startTime) / 1000) * speed\n\n\tfor (const g of groups) {\n\t\tif (intensity <= 0) {\n\t\t\tg.element.style.opacity = '0'\n\t\t\tcontinue\n\t\t}\n\n\t\tconst appearStart = g.appearDelay\n\t\tconst appearEnd = appearStart + 2.5\n\t\tlet opacity: number\n\n\t\tif (elapsed < appearStart) {\n\t\t\topacity = 0\n\t\t} else if (elapsed < appearEnd) {\n\t\t\tconst t = (elapsed - appearStart) / 2.5\n\t\t\topacity = 1 - Math.pow(1 - t, 3)\n\t\t} else {\n\t\t\tconst twinkleElapsed = elapsed - g.twinkleDelay\n\t\t\tif (twinkleElapsed < 0) {\n\t\t\t\topacity = 1\n\t\t\t} else {\n\t\t\t\tconst cycle = (twinkleElapsed % g.twinkleDuration) / g.twinkleDuration\n\t\t\t\tif (cycle < 0.25) {\n\t\t\t\t\topacity = 1 - (cycle / 0.25) * 0.4\n\t\t\t\t} else if (cycle < 0.5) {\n\t\t\t\t\topacity = 0.6 + ((cycle - 0.25) / 0.25) * 0.25\n\t\t\t\t} else if (cycle < 0.75) {\n\t\t\t\t\topacity = 0.85 - ((cycle - 0.5) / 0.25) * 0.3\n\t\t\t\t} else {\n\t\t\t\t\topacity = 0.55 + ((cycle - 0.75) / 0.25) * 0.45\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tg.element.style.opacity = (opacity * intensity).toFixed(3)\n\t}\n}\n","/**\n * Art Directive — GPU-accelerated decorative overlays.\n * Lazy-initialised, IntersectionObserver-paused, RAF-driven, particle-pooled.\n */\n\nimport type { ElementPart } from 'lit'\nimport { noChange } from 'lit'\nimport { AsyncDirective, directive } from 'lit/async-directive.js'\n\nimport type { ArtOptions, ArtState } from './types'\nimport { createFunkhausOverlay, animateFunkhaus } from './effects/funkhaus'\nimport { createSamwaOverlay, animateSamwa } from './effects/samwa'\nimport { createHowlOverlay, animateHowl } from './effects/howl'\nimport { createErrorOverlay, animateError } from './effects/error'\nimport { createSnowOverlay, animateSnow } from './effects/snow'\nimport { createStarfieldOverlay, animateStarfield } from './effects/starfield'\n\ninterface ExtendedArtState extends ArtState {\n\tinitialized: boolean\n\toriginalPosition: string\n}\n\nclass ArtDirective extends AsyncDirective {\n\tprivate state: ExtendedArtState | null = null\n\n\trender(_options: ArtOptions) {\n\t\treturn noChange\n\t}\n\n\toverride update(part: ElementPart, [options]: [ArtOptions]) {\n\t\tconst element = part.element as HTMLElement\n\t\tconst { name, color, intensity = 1, speed = 1 } = options\n\n\t\tif (\n\t\t\tthis.state &&\n\t\t\t(this.state.effect !== name ||\n\t\t\t\tthis.state.color !== color ||\n\t\t\t\tthis.state.intensity !== intensity ||\n\t\t\t\tthis.state.speed !== speed)\n\t\t) {\n\t\t\tthis.cleanup()\n\t\t}\n\n\t\tif (!this.state) {\n\t\t\tconst originalPosition = element.style.position\n\n\t\t\tthis.state = {\n\t\t\t\teffect: name,\n\t\t\t\tcolor,\n\t\t\t\tintensity,\n\t\t\t\tspeed,\n\t\t\t\telement,\n\t\t\t\tisVisible: true,\n\t\t\t\tinitialized: false,\n\t\t\t\toriginalPosition,\n\t\t\t}\n\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tif (!this.state) return\n\n\t\t\t\tconst rect = element.getBoundingClientRect()\n\t\t\t\tconst isVisible =\n\t\t\t\t\trect.top < window.innerHeight && rect.bottom > 0 && rect.left < window.innerWidth && rect.right > 0\n\n\t\t\t\tif (!isVisible) {\n\t\t\t\t\tthis.state.isVisible = false\n\t\t\t\t\tthis.setupVisibilityObserver()\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tthis.initializeResources()\n\t\t\t\tthis.startAnimation()\n\t\t\t\tthis.setupVisibilityObserver()\n\t\t\t})\n\t\t}\n\n\t\treturn noChange\n\t}\n\n\tprivate initializeResources(): void {\n\t\tif (!this.state || this.state.initialized) return\n\n\t\tconst { element, effect: name } = this.state\n\n\t\tconst computedStyle = getComputedStyle(element)\n\t\tif (computedStyle.position === 'static') {\n\t\t\telement.style.position = 'relative'\n\t\t}\n\n\t\tswitch (name) {\n\t\t\tcase 'funkhaus':\n\t\t\t\tcreateFunkhausOverlay(this.state)\n\t\t\t\tbreak\n\t\t\tcase 'samwa':\n\t\t\t\tcreateSamwaOverlay(this.state)\n\t\t\t\tbreak\n\t\t\tcase 'howl':\n\t\t\t\tcreateHowlOverlay(this.state)\n\t\t\t\tbreak\n\t\t\tcase 'error':\n\t\t\t\tcreateErrorOverlay(this.state)\n\t\t\t\tbreak\n\t\t\tcase 'snow':\n\t\t\t\tcreateSnowOverlay(this.state)\n\t\t\t\tbreak\n\t\t\tcase 'starfield':\n\t\t\t\tcreateStarfieldOverlay(this.state)\n\t\t\t\tbreak\n\t\t}\n\n\t\tthis.state.initialized = true\n\t}\n\n\tprivate setupVisibilityObserver(): void {\n\t\tif (!this.state || typeof IntersectionObserver === 'undefined') return\n\n\t\tthis.state.observer = new IntersectionObserver(\n\t\t\tentries => {\n\t\t\t\tif (!this.state) return\n\t\t\t\tconst isVisible = entries[0].isIntersecting\n\n\t\t\t\tif (isVisible && !this.state.isVisible) {\n\t\t\t\t\tthis.state.isVisible = true\n\n\t\t\t\t\tif (!this.state.initialized) {\n\t\t\t\t\t\tthis.initializeResources()\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.startAnimation()\n\t\t\t\t} else if (!isVisible && this.state.isVisible) {\n\t\t\t\t\tthis.state.isVisible = false\n\t\t\t\t\tif (this.state.animationId) {\n\t\t\t\t\t\tcancelAnimationFrame(this.state.animationId)\n\t\t\t\t\t\tthis.state.animationId = undefined\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\tthis.state.observer.observe(this.state.element)\n\t}\n\n\tprivate startAnimation(): void {\n\t\tif (!this.state || !this.state.isVisible) return\n\t\tif (this.state.animationId) return\n\n\t\tif (!this.state.initialized) {\n\t\t\tthis.initializeResources()\n\t\t}\n\n\t\tconst animate = (currentTime: number) => {\n\t\t\tif (!this.state || !this.state.isVisible) {\n\t\t\t\tif (this.state) this.state.animationId = undefined\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tswitch (this.state.effect) {\n\t\t\t\tcase 'funkhaus':\n\t\t\t\t\tanimateFunkhaus(this.state, currentTime)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'samwa':\n\t\t\t\t\tanimateSamwa(this.state, currentTime)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'howl':\n\t\t\t\t\tanimateHowl(this.state, currentTime)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'error':\n\t\t\t\t\tanimateError(this.state, currentTime)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'snow':\n\t\t\t\t\tanimateSnow(this.state, currentTime)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'starfield':\n\t\t\t\t\tanimateStarfield(this.state, currentTime)\n\t\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tthis.state.animationId = requestAnimationFrame(animate)\n\t\t}\n\n\t\tthis.state.animationId = requestAnimationFrame(animate)\n\t}\n\n\tprivate cleanup(): void {\n\t\tif (!this.state) return\n\n\t\tif (this.state.animationId) {\n\t\t\tcancelAnimationFrame(this.state.animationId)\n\t\t}\n\n\t\tif (this.state.observer) {\n\t\t\tthis.state.observer.disconnect()\n\t\t}\n\n\t\tif (this.state.samwa) {\n\t\t\tthis.state.samwa.leafPool.clear()\n\t\t}\n\n\t\tif (this.state.howl) {\n\t\t\tthis.state.howl.steamPool.clear()\n\t\t}\n\n\t\tif (this.state.error) {\n\t\t\tthis.state.error.boltPool.clear()\n\t\t}\n\n\t\tif (this.state.snow) {\n\t\t\tthis.state.snow.snowflakePool.clear()\n\t\t}\n\n\t\tif (this.state.overlayElement) {\n\t\t\tthis.state.overlayElement.remove()\n\t\t}\n\n\t\tif (this.state.originalPosition !== undefined) {\n\t\t\tthis.state.element.style.position = this.state.originalPosition\n\t\t}\n\n\t\tthis.state = null\n\t}\n\n\toverride disconnected(): void {\n\t\tthis.cleanup()\n\t}\n}\n\nexport const art = directive(ArtDirective)\n","/**\n * Futuristic Battery Fill Directive\n *\n * A next-gen energy indicator with holographic effects, scan lines, and sci-fi aesthetics.\n *\n * @example\n * ```ts\n * html`<div ${futureCell({ percent: 75, variant: 'cyber' })}>POWER CORE</div>`\n * html`<div ${futureCell({ percent: 50, variant: 'hologram' })}>ENERGY CELL</div>`\n * ```\n */\n\nimport { noChange } from 'lit'\nimport { AsyncDirective, directive } from 'lit/async-directive.js'\nimport type { ElementPart } from 'lit'\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport type FutureCellVariant = 'cyber' | 'hologram' | 'plasma' | 'quantum' | 'matrix' | 'neon' | 'success' | 'warning' | 'danger'\n\nexport interface FutureCellOptions {\n\t/** Fill percentage (0-100+) */\n\tpercent: number\n\t/** Visual variant */\n\tvariant?: FutureCellVariant\n\t/** Auto-select variant based on inventory status (≥80% = success/green, 50-79% = warning/yellow, <50% = danger/red) */\n\tautoVariant?: boolean\n\t/** Custom accent color */\n\taccentColor?: string\n\t/** Show digital readout */\n\tshowReadout?: boolean\n\t/** Show scan lines */\n\tshowScanLines?: boolean\n\t/** Show particles */\n\tshowParticles?: boolean\n\t/** Show hexagonal grid */\n\tshowGrid?: boolean\n\t/** Show glitch effects */\n\tshowGlitch?: boolean\n\t/** Intensity of effects (0-1) */\n\tintensity?: number\n\t/** Animation speed multiplier */\n\tspeed?: number\n\t/** Enable critical state animations (when low or overfill) */\n\tcriticalEffects?: boolean\n\t/** Glass container effect */\n\tglassEffect?: boolean\n\t/** Animation duration for fill transitions (ms) */\n\tduration?: number\n}\n\ninterface VariantConfig {\n\tprimary: string\n\tsecondary: string\n\tglow: string\n\tparticle: string\n\tscanLine: string\n\tgridColor: string\n}\n\ninterface Particle {\n\tx: number\n\ty: number\n\tvx: number\n\tvy: number\n\tsize: number\n\topacity: number\n\thue: number\n\tlife: number\n}\n\n// ============================================================================\n// VARIANT CONFIGURATIONS\n// ============================================================================\n\nconst VARIANTS: Record<FutureCellVariant, VariantConfig> = {\n\tcyber: {\n\t\tprimary: '#00f0ff',\n\t\tsecondary: '#0099ff',\n\t\tglow: '#00f0ff',\n\t\tparticle: '#00f0ff',\n\t\tscanLine: '#00f0ff',\n\t\tgridColor: '#00f0ff',\n\t},\n\thologram: {\n\t\tprimary: '#00ff88',\n\t\tsecondary: '#00cc66',\n\t\tglow: '#00ff88',\n\t\tparticle: '#00ff88',\n\t\tscanLine: '#00ff88',\n\t\tgridColor: '#00ff88',\n\t},\n\tplasma: {\n\t\tprimary: '#ff00ff',\n\t\tsecondary: '#cc00ff',\n\t\tglow: '#ff00ff',\n\t\tparticle: '#ff00ff',\n\t\tscanLine: '#ff00ff',\n\t\tgridColor: '#ff00ff',\n\t},\n\tquantum: {\n\t\tprimary: '#8800ff',\n\t\tsecondary: '#6600cc',\n\t\tglow: '#8800ff',\n\t\tparticle: '#8800ff',\n\t\tscanLine: '#8800ff',\n\t\tgridColor: '#8800ff',\n\t},\n\tmatrix: {\n\t\tprimary: '#00ff00',\n\t\tsecondary: '#00cc00',\n\t\tglow: '#00ff00',\n\t\tparticle: '#00ff00',\n\t\tscanLine: '#00ff00',\n\t\tgridColor: '#00ff00',\n\t},\n\tneon: {\n\t\tprimary: '#ff0080',\n\t\tsecondary: '#cc0066',\n\t\tglow: '#ff0080',\n\t\tparticle: '#ff0080',\n\t\tscanLine: '#ff0080',\n\t\tgridColor: '#ff0080',\n\t},\n\tsuccess: {\n\t\tprimary: '#00ff88',\n\t\tsecondary: '#00cc66',\n\t\tglow: '#00ff88',\n\t\tparticle: '#00ff88',\n\t\tscanLine: '#00ff88',\n\t\tgridColor: '#00ff88',\n\t},\n\twarning: {\n\t\tprimary: '#ffaa00',\n\t\tsecondary: '#ff8800',\n\t\tglow: '#ffaa00',\n\t\tparticle: '#ffaa00',\n\t\tscanLine: '#ffaa00',\n\t\tgridColor: '#ffaa00',\n\t},\n\tdanger: {\n\t\tprimary: '#ff3366',\n\t\tsecondary: '#ff0044',\n\t\tglow: '#ff3366',\n\t\tparticle: '#ff3366',\n\t\tscanLine: '#ff3366',\n\t\tgridColor: '#ff3366',\n\t},\n}\n\n// ============================================================================\n// ANIMATIONS & STYLES\n// ============================================================================\n\nconst KEYFRAMES = `\n@keyframes future-fill-pulse {\n\t0%, 100% { opacity: 0.85; }\n\t50% { opacity: 1; }\n}\n\n@keyframes future-glow-pulse {\n\t0%, 100% {\n\t\tfilter: drop-shadow(0 0 4px var(--glow-color))\n\t\t drop-shadow(0 0 8px var(--glow-color));\n\t}\n\t50% {\n\t\tfilter: drop-shadow(0 0 8px var(--glow-color))\n\t\t drop-shadow(0 0 16px var(--glow-color));\n\t}\n}\n\n@keyframes scan-line-move {\n\t0% { transform: translateY(-100%); }\n\t100% { transform: translateY(200%); }\n}\n\n@keyframes energy-wave {\n\t0% { \n\t\ttransform: translateY(0) scaleX(1);\n\t\topacity: 0.6;\n\t}\n\t50% { \n\t\ttransform: translateY(-10px) scaleX(1.1);\n\t\topacity: 1;\n\t}\n\t100% { \n\t\ttransform: translateY(0) scaleX(1);\n\t\topacity: 0.6;\n\t}\n}\n\n@keyframes data-stream {\n\t0% { \n\t\ttransform: translateY(100%);\n\t\topacity: 0;\n\t}\n\t10% {\n\t\topacity: 1;\n\t}\n\t90% {\n\t\topacity: 1;\n\t}\n\t100% { \n\t\ttransform: translateY(-100%);\n\t\topacity: 0;\n\t}\n}\n\n@keyframes hologram-flicker {\n\t0%, 100% { opacity: 1; }\n\t2% { opacity: 0.8; }\n\t4% { opacity: 1; }\n\t8% { opacity: 0.9; }\n\t10% { opacity: 1; }\n\t50% { opacity: 0.95; }\n\t51% { opacity: 1; }\n}\n\n@keyframes glitch-shift {\n\t0%, 100% { \n\t\ttransform: translate(0, 0);\n\t\tfilter: hue-rotate(0deg);\n\t}\n\t20% { \n\t\ttransform: translate(-2px, 1px);\n\t\tfilter: hue-rotate(90deg);\n\t}\n\t40% { \n\t\ttransform: translate(2px, -1px);\n\t\tfilter: hue-rotate(180deg);\n\t}\n\t60% { \n\t\ttransform: translate(-1px, -2px);\n\t\tfilter: hue-rotate(270deg);\n\t}\n\t80% { \n\t\ttransform: translate(1px, 2px);\n\t\tfilter: hue-rotate(360deg);\n\t}\n}\n\n@keyframes hex-grid-pulse {\n\t0%, 100% { opacity: 0.15; }\n\t50% { opacity: 0.35; }\n}\n\n@keyframes chromatic-aberration {\n\t0%, 100% {\n\t\ttext-shadow:\n\t\t\t-0.5px 0 0 rgba(255, 0, 0, 0.3),\n\t\t\t0.5px 0 0 rgba(0, 255, 255, 0.3);\n\t}\n\t50% {\n\t\ttext-shadow:\n\t\t\t-1px 0 0 rgba(255, 0, 0, 0.5),\n\t\t\t1px 0 0 rgba(0, 255, 255, 0.5);\n\t}\n}\n\n@keyframes critical-flash {\n\t0%, 100% { opacity: 1; }\n\t50% { opacity: 0.5; }\n}\n\n@keyframes overfill-surge {\n\t0%, 100% {\n\t\ttransform: scale(1);\n\t\tfilter: brightness(1);\n\t}\n\t50% {\n\t\ttransform: scale(1.01);\n\t\tfilter: brightness(1.15);\n\t}\n}\n\n`\n\n// ============================================================================\n// DIRECTIVE\n// ============================================================================\n\nclass FutureCellDirective extends AsyncDirective {\n\tprivate element: HTMLElement | null = null\n\tprivate container: HTMLElement | null = null\n\tprivate fillElement: HTMLElement | null = null\n\tprivate energyWave: HTMLElement | null = null\n\tprivate scanLine: HTMLElement | null = null\n\tprivate particlesCanvas: HTMLCanvasElement | null = null\n\tprivate particlesCtx: CanvasRenderingContext2D | null = null\n\tprivate hexGrid: HTMLElement | null = null\n\tprivate readout: HTMLElement | null = null\n\tprivate dataStreams: HTMLElement | null = null\n\tprivate glitchLayer: HTMLElement | null = null\n\tprivate styleElement: HTMLStyleElement | null = null\n\t\n\tprivate options: FutureCellOptions = { percent: 0 }\n\tprivate variant: VariantConfig = VARIANTS.cyber\n\tprivate currentVariantName: FutureCellVariant = 'cyber'\n\tprivate particles: Particle[] = []\n\tprivate animationFrame: number | null = null\n\tprivate lastTime = 0\n\tprivate currentPercent = 0\n\n\t// Original styles backup\n\tprivate originalStyles: Record<string, string> = {}\n\n\t// ResizeObserver for canvas updates\n\tprivate resizeObserver: ResizeObserver | null = null\n\n\t/** Effective speed scales with fill %: low fill = calm, high fill = vivid */\n\tprivate getEffectiveSpeed(): number {\n\t\tconst base = this.options.speed ?? 1\n\t\tconst pct = Math.min(Math.max(this.currentPercent, 0), 100) / 100\n\t\t// Range: 0.15 at 0% → 1.0 at 100%\n\t\treturn base * (0.15 + pct * 0.85)\n\t}\n\n\trender(_options: FutureCellOptions) {\n\t\treturn noChange\n\t}\n\n\toverride update(part: ElementPart, [options]: [FutureCellOptions]) {\n\t\tconst element = part.element as HTMLElement\n\n\t\tif (!this.element) {\n\t\t\tthis.element = element\n\t\t\tthis.options = {\n\t\t\t\tvariant: 'cyber',\n\t\t\t\tautoVariant: false,\n\t\t\t\tshowReadout: true,\n\t\t\t\tshowScanLines: true,\n\t\t\t\tshowParticles: true,\n\t\t\t\tshowGrid: true,\n\t\t\t\tshowGlitch: false,\n\t\t\t\tintensity: 1,\n\t\t\t\tspeed: 1,\n\t\t\t\tcriticalEffects: true,\n\t\t\t\tglassEffect: true,\n\t\t\t\tduration: 600,\n\t\t\t\t...options\n\t\t\t}\n\t\t\tthis.variant = VARIANTS[this.options.variant!]\n\t\t\tthis.currentVariantName = this.options.variant!\n\t\t\tthis.storeOriginalStyles()\n\t\t\tthis.setupElement()\n\t\t\tthis.createStructure()\n\t\t\tthis.setupResizeObserver()\n\t\t\tthis.startAnimation()\n\t\t}\n\n\t\t// Auto-select variant based on inventory status (gastronomy industry standards)\n\t\tlet newVariantName: FutureCellVariant\n\t\tif (options.autoVariant) {\n\t\t\tconst percent = options.percent\n\t\t\tif (percent >= 80) {\n\t\t\t\tnewVariantName = 'success' // GREEN - Well stocked, optimal\n\t\t\t} else if (percent >= 50) {\n\t\t\t\tnewVariantName = 'warning' // YELLOW - Getting low, plan reorder\n\t\t\t} else {\n\t\t\t\tnewVariantName = 'danger' // RED - Critical, reorder immediately\n\t\t\t}\n\t\t} else {\n\t\t\tnewVariantName = options.variant ?? 'cyber'\n\t\t}\n\n\t\t// Detect variant change and update colors\n\t\tif (newVariantName !== this.currentVariantName) {\n\t\t\tthis.currentVariantName = newVariantName\n\t\t\tthis.variant = VARIANTS[newVariantName]\n\t\t\tthis.updateColors()\n\t\t}\n\n\t\tthis.options = { ...this.options, ...options }\n\t\tthis.variant = VARIANTS[newVariantName]\n\t\tthis.updateFill()\n\n\t\treturn noChange\n\t}\n\n\t// ========================================================================\n\t// INITIALIZATION\n\t// ========================================================================\n\n\tprivate storeOriginalStyles(): void {\n\t\tif (!this.element) return\n\t\tconst style = this.element.style\n\t\tthis.originalStyles = {\n\t\t\tposition: style.position,\n\t\t\toverflow: style.overflow,\n\t\t\tborder: style.border,\n\t\t\tbackground: style.background,\n\t\t\tboxShadow: style.boxShadow,\n\t\t\tbackdropFilter: style.backdropFilter,\n\t\t\tborderRadius: style.borderRadius,\n\t\t}\n\t}\n\n\tprivate setupElement(): void {\n\t\tif (!this.element) return\n\n\t\t// Only set position if it's static\n\t\tconst currentPosition = getComputedStyle(this.element).position\n\t\tif (currentPosition === 'static') {\n\t\t\tthis.element.style.position = 'relative'\n\t\t}\n\t\tthis.element.style.overflow = 'hidden'\n\n\t\t// Glass effect with vivid border for contrast\n\t\tif (this.options.glassEffect !== false) {\n\t\t\tObject.assign(this.element.style, {\n\t\t\t\tbackground: 'rgba(10, 10, 20, 0.9)',\n\t\t\t\tbackdropFilter: 'blur(16px) saturate(130%)',\n\t\t\t\tborder: `1.5px solid ${this.variant.primary}30`,\n\t\t\t\tboxShadow: `\n\t\t\t\t\t0 2px 8px rgba(0, 0, 0, 0.4),\n\t\t\t\t\t0 8px 32px rgba(0, 0, 0, 0.25),\n\t\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.06),\n\t\t\t\t\t0 0 0 1px rgba(0, 0, 0, 0.3)\n\t\t\t\t`,\n\t\t\t\tborderRadius: '12px',\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate createStructure(): void {\n\t\tif (!this.element) return\n\n\t\t// Inject keyframes\n\t\tthis.styleElement = document.createElement('style')\n\t\tthis.styleElement.textContent = KEYFRAMES\n\t\tthis.element.appendChild(this.styleElement)\n\n\t\t// Main container\n\t\tthis.container = document.createElement('div')\n\t\tObject.assign(this.container.style, {\n\t\t\tposition: 'absolute',\n\t\t\tinset: '0',\n\t\t\tpointerEvents: 'none',\n\t\t\tzIndex: '0',\n\t\t\toverflow: 'hidden',\n\t\t\tborderRadius: 'inherit',\n\t\t\tbackground: 'rgba(0, 0, 0, 0.3)',\n\t\t})\n\t\tthis.element.insertBefore(this.container, this.element.firstChild)\n\n\t\t// Create fill first, then add effects inside it\n\t\tthis.createFill()\n\t\tthis.createHexGrid() // Inside fill\n\t\tthis.createEnergyWave() // Inside fill\n\t\tthis.createScanLines() // Inside fill\n\t\tthis.createDataStreams() // Inside fill\n\t\tthis.createGlitchLayer() // Inside fill\n\t\tthis.createParticles() // Inside fill\n\t\tthis.createReadout()\n\t}\n\n\t// ========================================================================\n\t// ELEMENT CREATION\n\t// ========================================================================\n\n\tprivate createFill(): void {\n\t\tif (!this.container) return\n\n\t\tconst duration = this.options.duration ?? 600\n\t\tconst speed = this.getEffectiveSpeed()\n\t\tconst pulseDur = 4 / speed // slow pulse at low %, fast at high %\n\n\t\tthis.fillElement = document.createElement('div')\n\t\tObject.assign(this.fillElement.style, {\n\t\t\tposition: 'absolute',\n\t\t\tleft: '0',\n\t\t\tright: '0',\n\t\t\tbottom: '0',\n\t\t\theight: '0%',\n\t\t\tbackground: `linear-gradient(180deg,\n\t\t\t\t${this.variant.primary}00 0%,\n\t\t\t\t${this.variant.primary}25 20%,\n\t\t\t\t${this.variant.primary}50 60%,\n\t\t\t\t${this.variant.secondary}cc 100%\n\t\t\t)`,\n\t\t\ttransition: `height ${duration}ms cubic-bezier(0.4, 0, 0.2, 1)`,\n\t\t\tboxShadow: `\n\t\t\t\tinset 0 0 30px ${this.variant.glow}30,\n\t\t\t\tinset 0 -10px 20px ${this.variant.glow}20,\n\t\t\t\t0 0 15px ${this.variant.glow}25\n\t\t\t`,\n\t\t\toverflow: 'hidden',\n\t\t\t'--glow-color': this.variant.glow,\n\t\t\tanimation: `future-fill-pulse ${pulseDur}s ease-in-out infinite`,\n\t\t})\n\t\tthis.container.appendChild(this.fillElement)\n\t}\n\n\tprivate createEnergyWave(): void {\n\t\tif (!this.fillElement) return\n\n\t\tconst speed = this.getEffectiveSpeed()\n\t\tthis.energyWave = document.createElement('div')\n\t\tObject.assign(this.energyWave.style, {\n\t\t\tposition: 'absolute',\n\t\t\tleft: '-10%',\n\t\t\ttop: '-12px',\n\t\t\twidth: '120%',\n\t\t\theight: '24px',\n\t\t\tbackground: `radial-gradient(ellipse at center,\n\t\t\t\t${this.variant.primary}90 0%,\n\t\t\t\t${this.variant.primary}40 30%,\n\t\t\t\ttransparent 70%\n\t\t\t)`,\n\t\t\tfilter: `blur(6px) drop-shadow(0 0 6px ${this.variant.glow}80)`,\n\t\t\tanimation: `energy-wave ${3 / speed}s ease-in-out infinite`,\n\t\t})\n\t\tthis.fillElement.appendChild(this.energyWave)\n\t}\n\n\tprivate createHexGrid(): void {\n\t\tif (!this.fillElement || !this.options.showGrid) return\n\n\t\tconst speed = this.getEffectiveSpeed()\n\t\tthis.hexGrid = document.createElement('div')\n\t\tObject.assign(this.hexGrid.style, {\n\t\t\tposition: 'absolute',\n\t\t\tinset: '0',\n\t\t\tbackground: this.createHexPattern(),\n\t\t\topacity: '0.08',\n\t\t\tanimation: `hex-grid-pulse ${5 / speed}s ease-in-out infinite`,\n\t\t\tmixBlendMode: 'screen',\n\t\t})\n\t\tthis.fillElement.appendChild(this.hexGrid)\n\t}\n\n\tprivate createHexPattern(): string {\n\t\tconst size = 40\n\t\tconst color = this.variant.gridColor\n\t\treturn `\n\t\t\trepeating-linear-gradient(\n\t\t\t\t0deg,\n\t\t\t\t${color}00 0px,\n\t\t\t\t${color}40 1px,\n\t\t\t\t${color}00 2px,\n\t\t\t\t${color}00 ${size}px\n\t\t\t),\n\t\t\trepeating-linear-gradient(\n\t\t\t\t60deg,\n\t\t\t\t${color}00 0px,\n\t\t\t\t${color}40 1px,\n\t\t\t\t${color}00 2px,\n\t\t\t\t${color}00 ${size}px\n\t\t\t),\n\t\t\trepeating-linear-gradient(\n\t\t\t\t120deg,\n\t\t\t\t${color}00 0px,\n\t\t\t\t${color}40 1px,\n\t\t\t\t${color}00 2px,\n\t\t\t\t${color}00 ${size}px\n\t\t\t)\n\t\t`\n\t}\n\n\tprivate createScanLines(): void {\n\t\tif (!this.fillElement || !this.options.showScanLines) return\n\n\t\tconst speed = this.getEffectiveSpeed()\n\n\t\t// Horizontal scan lines overlay (very subtle)\n\t\tconst scanLinesOverlay = document.createElement('div')\n\t\tObject.assign(scanLinesOverlay.style, {\n\t\t\tposition: 'absolute',\n\t\t\tinset: '0',\n\t\t\tbackground: `repeating-linear-gradient(\n\t\t\t\t0deg,\n\t\t\t\ttransparent 0px,\n\t\t\t\t${this.variant.scanLine}08 1px,\n\t\t\t\ttransparent 2px,\n\t\t\t\ttransparent 4px\n\t\t\t)`,\n\t\t\topacity: '0.15',\n\t\t\tpointerEvents: 'none',\n\t\t})\n\t\tthis.fillElement.appendChild(scanLinesOverlay)\n\n\t\t// Moving scan line\n\t\tthis.scanLine = document.createElement('div')\n\t\tObject.assign(this.scanLine.style, {\n\t\t\tposition: 'absolute',\n\t\t\tleft: '0',\n\t\t\tright: '0',\n\t\t\ttop: '-1px',\n\t\t\theight: '1px',\n\t\t\tbackground: `linear-gradient(90deg,\n\t\t\t\ttransparent 0%,\n\t\t\t\t${this.variant.scanLine}cc 50%,\n\t\t\t\ttransparent 100%\n\t\t\t)`,\n\t\t\tboxShadow: `0 0 8px ${this.variant.glow}60`,\n\t\t\tanimation: `scan-line-move ${6 / speed}s linear infinite`,\n\t\t\topacity: '0.35',\n\t\t})\n\t\tthis.fillElement.appendChild(this.scanLine)\n\t}\n\n\tprivate createParticles(): void {\n\t\tif (!this.fillElement || !this.options.showParticles) return\n\n\t\tthis.particlesCanvas = document.createElement('canvas')\n\t\tObject.assign(this.particlesCanvas.style, {\n\t\t\tposition: 'absolute',\n\t\t\tleft: '0',\n\t\t\tbottom: '0',\n\t\t\twidth: '100%',\n\t\t\theight: '100%',\n\t\t\tpointerEvents: 'none',\n\t\t\tzIndex: '5',\n\t\t})\n\t\tthis.fillElement.appendChild(this.particlesCanvas)\n\t\tthis.particlesCtx = this.particlesCanvas.getContext('2d')\n\n\t\tthis.resizeCanvas()\n\t\tthis.initParticles()\n\t}\n\n\tprivate resizeCanvas(): void {\n\t\tif (!this.particlesCanvas || !this.fillElement) return\n\t\tconst rect = this.fillElement.getBoundingClientRect()\n\t\tthis.particlesCanvas.width = rect.width\n\t\tthis.particlesCanvas.height = rect.height\n\t}\n\n\tprivate setupResizeObserver(): void {\n\t\tif (!this.element || typeof ResizeObserver === 'undefined') return\n\t\t\n\t\tthis.resizeObserver = new ResizeObserver(() => {\n\t\t\tthis.resizeCanvas()\n\t\t})\n\t\t\n\t\tthis.resizeObserver.observe(this.element)\n\t}\n\n\tprivate initParticles(): void {\n\t\tconst count = Math.floor(12 * (this.options.intensity ?? 1))\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tthis.spawnParticle()\n\t\t}\n\t}\n\n\tprivate spawnParticle(): void {\n\t\tif (!this.particlesCanvas) return\n\n\t\tconst w = this.particlesCanvas.width\n\t\tconst h = this.particlesCanvas.height\n\t\tconst speed = this.getEffectiveSpeed()\n\n\t\tthis.particles.push({\n\t\t\tx: Math.random() * w,\n\t\t\ty: h + Math.random() * 30,\n\t\t\tvx: (Math.random() - 0.5) * 0.5,\n\t\t\tvy: (-0.4 - Math.random() * 1.2) * speed,\n\t\t\tsize: 0.8 + Math.random() * 1.2,\n\t\t\topacity: 0.2 + Math.random() * 0.4,\n\t\t\thue: Math.random() * 60 - 30,\n\t\t\tlife: 0,\n\t\t})\n\t}\n\n\tprivate createDataStreams(): void {\n\t\tif (!this.fillElement) return\n\n\t\tconst speed = this.getEffectiveSpeed()\n\n\t\tthis.dataStreams = document.createElement('div')\n\t\tObject.assign(this.dataStreams.style, {\n\t\t\tposition: 'absolute',\n\t\t\tinset: '0',\n\t\t\toverflow: 'hidden',\n\t\t\topacity: '0.18',\n\t\t\tzIndex: '3',\n\t\t})\n\t\tthis.fillElement.appendChild(this.dataStreams)\n\n\t\t// Fewer, subtler data streams\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tconst stream = document.createElement('div')\n\t\t\tconst leftPos = 15 + i * 30\n\t\t\tconst delay = Math.random() * 4\n\t\t\tconst duration = 3 + Math.random() * 2\n\n\t\t\tObject.assign(stream.style, {\n\t\t\t\tposition: 'absolute',\n\t\t\t\tleft: `${leftPos}%`,\n\t\t\t\ttop: '0',\n\t\t\t\twidth: '1px',\n\t\t\t\theight: '100%',\n\t\t\t\tbackground: `linear-gradient(180deg,\n\t\t\t\t\ttransparent 0%,\n\t\t\t\t\t${this.variant.primary}cc 50%,\n\t\t\t\t\ttransparent 100%\n\t\t\t\t)`,\n\t\t\t\tanimation: `data-stream ${duration / speed}s linear infinite`,\n\t\t\t\tanimationDelay: `${delay}s`,\n\t\t\t\tboxShadow: `0 0 4px ${this.variant.glow}40`,\n\t\t\t})\n\n\t\t\tthis.dataStreams.appendChild(stream)\n\t\t}\n\t}\n\n\tprivate createGlitchLayer(): void {\n\t\tif (!this.fillElement || !this.options.showGlitch) return\n\n\t\tthis.glitchLayer = document.createElement('div')\n\t\tObject.assign(this.glitchLayer.style, {\n\t\t\tposition: 'absolute',\n\t\t\tinset: '0',\n\t\t\tbackground: `linear-gradient(90deg,\n\t\t\t\t${this.variant.primary}20 0%,\n\t\t\t\ttransparent 50%,\n\t\t\t\t${this.variant.secondary}20 100%\n\t\t\t)`,\n\t\t\topacity: '0.3',\n\t\t\tanimation: 'glitch-shift 0.3s steps(1) infinite',\n\t\t\tmixBlendMode: 'overlay',\n\t\t})\n\t\tthis.fillElement.appendChild(this.glitchLayer)\n\t}\n\n\tprivate createReadout(): void {\n\t\tif (!this.element || !this.options.showReadout) return\n\n\t\tconst speed = this.getEffectiveSpeed()\n\t\tthis.readout = document.createElement('div')\n\t\tObject.assign(this.readout.style, {\n\t\t\tposition: 'absolute',\n\t\t\ttop: '10px',\n\t\t\tright: '10px',\n\t\t\tfontFamily: 'monospace',\n\t\t\tfontSize: '1rem',\n\t\t\tfontWeight: '600',\n\t\t\tcolor: this.variant.primary,\n\t\t\ttextShadow: `\n\t\t\t\t0 0 6px ${this.variant.glow}80,\n\t\t\t\t0 2px 4px rgba(0, 0, 0, 0.8)\n\t\t\t`,\n\t\t\tzIndex: '10',\n\t\t\tpointerEvents: 'none',\n\t\t\tletterSpacing: '0.08em',\n\t\t\tanimation: `hologram-flicker ${8 / speed}s ease-in-out infinite`,\n\t\t})\n\t\tthis.element.appendChild(this.readout)\n\n\t\t// Add units label\n\t\tconst units = document.createElement('span')\n\t\tunits.textContent = ' PWR'\n\t\tunits.style.opacity = '0.6'\n\t\tunits.style.fontSize = '0.7em'\n\t\tthis.readout.appendChild(units)\n\t}\n\n\t// ========================================================================\n\t// COLOR UPDATES\n\t// ========================================================================\n\n\tprivate updateColors(): void {\n\t\t// Update fill (subtle glow)\n\t\tif (this.fillElement) {\n\t\t\tthis.fillElement.style.background = `linear-gradient(180deg,\n\t\t\t\t${this.variant.primary}00 0%,\n\t\t\t\t${this.variant.primary}25 20%,\n\t\t\t\t${this.variant.primary}50 60%,\n\t\t\t\t${this.variant.secondary}cc 100%\n\t\t\t)`\n\t\t\tthis.fillElement.style.boxShadow = `\n\t\t\t\tinset 0 0 30px ${this.variant.glow}30,\n\t\t\t\tinset 0 -10px 20px ${this.variant.glow}20,\n\t\t\t\t0 0 15px ${this.variant.glow}25\n\t\t\t`\n\t\t\tthis.fillElement.style.setProperty('--glow-color', this.variant.glow)\n\t\t}\n\n\t\t// Update energy wave\n\t\tif (this.energyWave) {\n\t\t\tthis.energyWave.style.background = `radial-gradient(ellipse at center,\n\t\t\t\t${this.variant.primary}90 0%,\n\t\t\t\t${this.variant.primary}40 30%,\n\t\t\t\ttransparent 70%\n\t\t\t)`\n\t\t\tthis.energyWave.style.filter = `blur(6px) drop-shadow(0 0 6px ${this.variant.glow}80)`\n\t\t}\n\n\t\t// Update hex grid\n\t\tif (this.hexGrid) {\n\t\t\tthis.hexGrid.style.background = this.createHexPattern()\n\t\t}\n\n\t\t// Update data streams\n\t\tif (this.dataStreams) {\n\t\t\tconst streams = this.dataStreams.querySelectorAll('div')\n\t\t\tstreams.forEach(stream => {\n\t\t\t\tconst el = stream as HTMLElement\n\t\t\t\tel.style.background = `linear-gradient(180deg,\n\t\t\t\t\ttransparent 0%,\n\t\t\t\t\t${this.variant.primary}cc 50%,\n\t\t\t\t\ttransparent 100%\n\t\t\t\t)`\n\t\t\t\tel.style.boxShadow = `0 0 4px ${this.variant.glow}40`\n\t\t\t})\n\t\t}\n\n\t\t// Update glitch layer\n\t\tif (this.glitchLayer) {\n\t\t\tthis.glitchLayer.style.background = `linear-gradient(90deg,\n\t\t\t\t${this.variant.primary}20 0%,\n\t\t\t\ttransparent 50%,\n\t\t\t\t${this.variant.secondary}20 100%\n\t\t\t)`\n\t\t}\n\n\t\t// Update readout\n\t\tif (this.readout) {\n\t\t\tthis.readout.style.color = this.variant.primary\n\t\t\tthis.readout.style.textShadow = `\n\t\t\t\t0 0 6px ${this.variant.glow}80,\n\t\t\t\t0 2px 4px rgba(0, 0, 0, 0.8)\n\t\t\t`\n\t\t}\n\n\t\t// Update container border color\n\t\tif (this.element && this.options.glassEffect !== false) {\n\t\t\tthis.element.style.border = `1.5px solid ${this.variant.primary}30`\n\t\t}\n\t}\n\n\t// ========================================================================\n\t// ANIMATION\n\t// ========================================================================\n\n\tprivate startAnimation(): void {\n\t\tthis.lastTime = performance.now()\n\t\tthis.animate(this.lastTime)\n\t}\n\n\tprivate animate = (currentTime: number): void => {\n\t\tconst deltaTime = (currentTime - this.lastTime) / 1000\n\t\tthis.lastTime = currentTime\n\n\t\tthis.updateParticles(deltaTime)\n\n\t\tthis.animationFrame = requestAnimationFrame(this.animate)\n\t}\n\n\tprivate updateParticles(deltaTime: number): void {\n\t\tif (!this.particlesCanvas || !this.particlesCtx || !this.options.showParticles) return\n\n\t\tconst ctx = this.particlesCtx\n\t\tconst w = this.particlesCanvas.width\n\t\tconst h = this.particlesCanvas.height\n\n\t\tctx.clearRect(0, 0, w, h)\n\n\t\t// Update and draw particles (all within fill area now)\n\t\tfor (let i = this.particles.length - 1; i >= 0; i--) {\n\t\t\tconst p = this.particles[i]\n\n\t\t\t// Update position (speed scales with fill %)\n\t\t\tconst speed = this.getEffectiveSpeed()\n\t\t\tp.x += p.vx * deltaTime * 60 * speed\n\t\t\tp.y += p.vy * deltaTime * 60 * speed\n\t\t\tp.life += deltaTime\n\n\t\t\t// Fade out over time\n\t\t\tif (p.life > 2) {\n\t\t\t\tp.opacity *= 0.95\n\t\t\t}\n\n\t\t\t// Remove dead particles\n\t\t\tif (p.opacity < 0.01 || p.y < -50) {\n\t\t\t\tthis.particles.splice(i, 1)\n\t\t\t\tthis.spawnParticle()\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Draw particle with soft glow\n\t\t\tconst gradient = ctx.createRadialGradient(p.x, p.y, 0, p.x, p.y, p.size * 2.5)\n\t\t\tgradient.addColorStop(0, this.hexToRGBA(this.variant.particle, p.opacity * 0.8))\n\t\t\tgradient.addColorStop(0.5, this.hexToRGBA(this.variant.particle, p.opacity * 0.15))\n\t\t\tgradient.addColorStop(1, this.hexToRGBA(this.variant.particle, 0))\n\n\t\t\tctx.fillStyle = gradient\n\t\t\tctx.beginPath()\n\t\t\tctx.arc(p.x, p.y, p.size * 2.5, 0, Math.PI * 2)\n\t\t\tctx.fill()\n\n\t\t\t// Core\n\t\t\tctx.fillStyle = this.hexToRGBA(this.variant.particle, p.opacity * 0.7)\n\t\t\tctx.beginPath()\n\t\t\tctx.arc(p.x, p.y, p.size * 0.8, 0, Math.PI * 2)\n\t\t\tctx.fill()\n\t\t}\n\t}\n\n\tprivate hexToRGBA(hex: string, alpha: number): string {\n\t\tconst r = parseInt(hex.slice(1, 3), 16)\n\t\tconst g = parseInt(hex.slice(3, 5), 16)\n\t\tconst b = parseInt(hex.slice(5, 7), 16)\n\t\treturn `rgba(${r}, ${g}, ${b}, ${alpha})`\n\t}\n\n\t// ========================================================================\n\t// UPDATE\n\t// ========================================================================\n\n\tprivate updateFill(): void {\n\t\tconst percent = Math.max(0, this.options.percent)\n\t\tconst displayPercent = Math.min(percent, 100)\n\t\tconst isCriticalLow = percent < 20\n\t\tconst isOverfill = percent > 100\n\n\t\t// Update tracked percent (drives effective speed)\n\t\tthis.currentPercent = displayPercent\n\t\tconst speed = this.getEffectiveSpeed()\n\n\t\t// Update fill height\n\t\tif (this.fillElement) {\n\t\t\tthis.fillElement.style.height = `${displayPercent}%`\n\n\t\t\t// Update transition duration\n\t\t\tconst duration = this.options.duration ?? 600\n\t\t\tthis.fillElement.style.transition = `height ${duration}ms cubic-bezier(0.4, 0, 0.2, 1)`\n\t\t}\n\n\t\t// Update readout\n\t\tif (this.readout) {\n\t\t\tconst value = Math.round(percent)\n\t\t\tthis.readout.firstChild!.textContent = value.toString().padStart(3, '0')\n\n\t\t\tif (this.options.criticalEffects) {\n\t\t\t\tif (isCriticalLow) {\n\t\t\t\t\tthis.readout.style.animation = 'critical-flash 1s ease-in-out infinite'\n\t\t\t\t} else if (isOverfill) {\n\t\t\t\t\tthis.readout.style.animation = 'overfill-surge 1.5s ease-in-out infinite'\n\t\t\t\t} else {\n\t\t\t\t\tthis.readout.style.animation = `hologram-flicker ${8 / speed}s ease-in-out infinite`\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Speed-aware animations on fill\n\t\tif (this.fillElement) {\n\t\t\tconst pulseDur = 4 / speed\n\t\t\tif (this.options.criticalEffects && isCriticalLow) {\n\t\t\t\tthis.fillElement.style.animation = `future-fill-pulse 1s ease-in-out infinite, critical-flash 1.5s ease-in-out infinite`\n\t\t\t} else if (this.options.criticalEffects && isOverfill) {\n\t\t\t\tthis.fillElement.style.animation = `future-fill-pulse 1.2s ease-in-out infinite, overfill-surge 1.5s ease-in-out infinite`\n\t\t\t} else {\n\t\t\t\tthis.fillElement.style.animation = `future-fill-pulse ${pulseDur}s ease-in-out infinite`\n\t\t\t}\n\t\t}\n\n\t\t// Update speed-dependent child animations\n\t\tif (this.energyWave) {\n\t\t\tthis.energyWave.style.animation = `energy-wave ${3 / speed}s ease-in-out infinite`\n\t\t}\n\t\tif (this.scanLine) {\n\t\t\tthis.scanLine.style.animation = `scan-line-move ${6 / speed}s linear infinite`\n\t\t}\n\t\tif (this.hexGrid) {\n\t\t\tthis.hexGrid.style.animation = `hex-grid-pulse ${5 / speed}s ease-in-out infinite`\n\t\t}\n\t}\n\n\t// ========================================================================\n\t// CLEANUP\n\t// ========================================================================\n\n\toverride disconnected(): void {\n\t\tif (this.animationFrame) {\n\t\t\tcancelAnimationFrame(this.animationFrame)\n\t\t}\n\n\t\tif (this.resizeObserver) {\n\t\t\tthis.resizeObserver.disconnect()\n\t\t}\n\n\t\tthis.styleElement?.remove()\n\t\tthis.container?.remove()\n\t\tthis.readout?.remove()\n\n\t\t// Restore original styles\n\t\tif (this.element) {\n\t\t\tObject.assign(this.element.style, this.originalStyles)\n\t\t}\n\n\t\tthis.element = null\n\t\tthis.container = null\n\t\tthis.fillElement = null\n\t\tthis.energyWave = null\n\t\tthis.scanLine = null\n\t\tthis.particlesCanvas = null\n\t\tthis.particlesCtx = null\n\t\tthis.hexGrid = null\n\t\tthis.readout = null\n\t\tthis.dataStreams = null\n\t\tthis.glitchLayer = null\n\t\tthis.particles = []\n\t\tthis.resizeObserver = null\n\t}\n}\n\n// ============================================================================\n// EXPORT\n// ============================================================================\n\nexport const futureCell = directive(FutureCellDirective)","/**\n * Beta directive — gates content behind a configurable predicate.\n *\n * The consumer app registers a predicate (e.g. \"user belongs to internal org\")\n * via `setBetaPredicate(...)`. Until then, `isBeta()` returns `false` and the\n * directive renders the fallback.\n *\n * Usage:\n * ```typescript\n * import { beta, setBetaPredicate } from '@mhmo91/schmancy'\n *\n * // App boot — wire the predicate\n * setBetaPredicate(() => currentUser.email.endsWith('@example.com'))\n *\n * // Templates — renders nothing for non-beta users\n * ${beta(html`<my-beta-feature></my-beta-feature>`)}\n *\n * // With fallback\n * ${beta(html`<beta-ui></beta-ui>`, html`<coming-soon></coming-soon>`)}\n *\n * // Imperative check\n * if (isBeta()) { ... }\n * ```\n */\nimport { nothing, type TemplateResult } from 'lit'\n\ntype Content = TemplateResult | typeof nothing | string | unknown\n\nlet predicate: () => boolean = () => false\n\n/** Register a predicate that decides whether the current user has beta access. */\nexport function setBetaPredicate(fn: () => boolean): void {\n\tpredicate = fn\n}\n\n/** Returns true if the current user has beta access. */\nexport function isBeta(): boolean {\n\treturn predicate()\n}\n\n/** Render content only for beta users, otherwise render fallback (default: nothing). */\nexport function beta(content: Content, fallback: Content = nothing): Content {\n\treturn isBeta() ? content : fallback\n}\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, animationFrameScheduler, combineLatest, fromEvent, merge, timer } from 'rxjs'\nimport { auditTime, filter, 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 * Reactive sources: window/visualViewport resize + scroll, orientation\n * change, iOS keyboard focus-out, parent/element ResizeObserver, theme\n * fullscreen toggle, theme bottom offset. Updates are frame-aligned via\n * `auditTime(0, animationFrameScheduler)` — the latest emission of any\n * source applies once per paint, so the box tracks continuous resize\n * drags without missing the final state.\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 subscribe() {\n\t\tconst el = this.element\n\t\tif (!el) return\n\n\t\tcombineLatest([\n\t\t\tmerge(\n\t\t\t\tfromEvent(window, 'resize', { passive: true }),\n\t\t\t\twindow.visualViewport\n\t\t\t\t\t? merge(\n\t\t\t\t\t\t\tfromEvent(window.visualViewport, 'resize', { passive: true }),\n\t\t\t\t\t\t\tfromEvent(window.visualViewport, 'scroll', { passive: true }),\n\t\t\t\t\t\t)\n\t\t\t\t\t: EMPTY,\n\t\t\t\tfromEvent(window, 'orientationchange'),\n\t\t\t\tfromEvent(document, 'focusout', { passive: true }).pipe(switchMap(() => timer(100))),\n\t\t\t\tfromResizeObserver(el),\n\t\t\t\tel.parentElement ? fromResizeObserver(el.parentElement) : EMPTY,\n\t\t\t).pipe(auditTime(0, animationFrameScheduler), 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\ttap(([, bottomOffset, isFullscreen]) => {\n\t\t\t\t\tconst vv = window.visualViewport\n\t\t\t\t\tconst rect = el.getBoundingClientRect()\n\t\t\t\t\tconst s = el.style\n\t\t\t\t\ts.boxSizing = 'border-box'\n\t\t\t\t\ts.height = `${Math.max(0, (vv?.height ?? window.innerHeight) - rect.top)}px`\n\t\t\t\t\ts.width = `${Math.max(0, (vv?.width ?? window.innerWidth) - rect.left)}px`\n\t\t\t\t\ts.paddingBottom = `${isFullscreen ? 0 : bottomOffset}px`\n\t\t\t\t\ts.minHeight = '0'\n\t\t\t\t\ts.minWidth = '0'\n\t\t\t\t\ts.overflow = 'hidden'\n\t\t\t\t}),\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","/**\n * FYI Directive — cute animated emoji indicators.\n *\n * Shows adorable emoji indicators with timing control, position options, and\n * animation styles. Perfect for subtle hints, onboarding nudges, or playful UI\n * feedback.\n *\n * **Overlay-aware**: Waits for sheets/dialogs to close before showing.\n * **Requires emoji**: Without an emoji, this directive has no visible effect.\n * For shimmer effects, use `nebula()` (header) or `<schmancy-fancy>` (cards).\n *\n * ## Cleanup pattern (Lit AsyncDirective)\n *\n * - `disconnected()`: releases all resources when the directive leaves use.\n * - `reconnected()`: restores working state when the directive returns to use.\n * - `isConnected`: checked before subscribing to prevent memory leaks.\n *\n * @see https://lit.dev/docs/templates/custom-directives/#async-directives\n *\n * @example\n * ```ts\n * // Basic emoji hint\n * html`<button ${fyi('☝️')}>Select folder</button>`\n *\n * // Emoji with position\n * html`<button ${fyi({ emoji: '☝️', position: 'bottom' })}>Select folder</button>`\n *\n * // Full options\n * html`<button ${fyi({\n * emoji: '🎉',\n * position: 'bottom',\n * showAfter: 500,\n * hideAfter: 3000,\n * animation: 'bounce',\n * })}>Celebrate!</button>`\n * ```\n */\n\nimport { noChange } from 'lit'\nimport { AsyncDirective, directive } from 'lit/async-directive.js'\nimport type { ElementPart } from 'lit'\nimport { EMPTY, Subject, Subscription, fromEvent, timer } from 'rxjs'\nimport { filter, switchMap, take, takeUntil } from 'rxjs/operators'\nimport { overlayStack } from '../utils/overlay-stack'\n\nexport type FyiPosition = 'auto' | 'top' | 'bottom' | 'left' | 'right'\nexport type FyiAnimation = 'point' | 'bounce' | 'pulse' | 'none'\n\nexport interface FyiOptions {\n\t/** The emoji to display (omit for shimmer-only mode) */\n\temoji?: string\n\t/** Where to position the indicator (default: 'auto') */\n\tposition?: FyiPosition\n\t/** Delay in ms before showing (default: 0) */\n\tshowAfter?: number\n\t/** Duration in ms before auto-hiding (omit to stay visible) */\n\thideAfter?: number\n\t/** Animation type (default: 'point') */\n\tanimation?: FyiAnimation\n\t/** Duration of one shimmer cycle in ms (default: 3000) */\n\tshimmerDuration?: number\n}\n\ninterface FyiState {\n\temoji: string\n\tposition: FyiPosition\n\tshowAfter: number\n\thideAfter?: number\n\tanimation: FyiAnimation\n\tshimmerDuration: number\n\telement?: HTMLElement\n\tindicator?: HTMLElement\n\tshimmerOverlay?: HTMLElement\n\twebAnimation?: Animation\n\telementAnimation?: Animation\n\toriginalOverflow?: string\n\toriginalPosition?: string\n\tactiveAnimations: Set<Animation>\n}\n\nclass FyiDirective extends AsyncDirective {\n\tprivate state: FyiState | null = null\n\tprivate destroy$ = new Subject<void>()\n\tprivate subscriptions = new Subscription()\n\n\trender(_options?: FyiOptions) {\n\t\treturn noChange\n\t}\n\n\toverride update(part: ElementPart, [options = {}]: [FyiOptions?]) {\n\t\tconst element = part.element as HTMLElement\n\n\t\tconst {\n\t\t\temoji = '',\n\t\t\tposition = 'auto',\n\t\t\tshowAfter = 0,\n\t\t\thideAfter,\n\t\t\tanimation = 'point',\n\t\t\tshimmerDuration = 3000,\n\t\t} = options\n\n\t\tif (\n\t\t\tthis.state &&\n\t\t\t(this.state.emoji !== emoji ||\n\t\t\t\tthis.state.position !== position ||\n\t\t\t\tthis.state.showAfter !== showAfter ||\n\t\t\t\tthis.state.hideAfter !== hideAfter ||\n\t\t\t\tthis.state.animation !== animation ||\n\t\t\t\tthis.state.shimmerDuration !== shimmerDuration)\n\t\t) {\n\t\t\tthis.cleanup()\n\t\t}\n\n\t\tif (!this.state && this.isConnected) {\n\t\t\tthis.state = {\n\t\t\t\temoji,\n\t\t\t\tposition,\n\t\t\t\tshowAfter,\n\t\t\t\thideAfter,\n\t\t\t\tanimation,\n\t\t\t\tshimmerDuration,\n\t\t\t\telement,\n\t\t\t\tactiveAnimations: new Set(),\n\t\t\t}\n\n\t\t\tthis.destroy$ = new Subject<void>()\n\t\t\tthis.subscriptions = new Subscription()\n\n\t\t\tthis.scheduleShow()\n\t\t}\n\n\t\treturn noChange\n\t}\n\n\tprivate scheduleShow() {\n\t\tif (!this.state || !this.isConnected) return\n\n\t\tconst showDelay = this.state.showAfter\n\n\t\tconst showSubscription = timer(showDelay)\n\t\t\t.pipe(\n\t\t\t\ttakeUntil(this.destroy$),\n\t\t\t\tfilter(() => this.isConnected && this.state !== null),\n\t\t\t\tswitchMap(() => {\n\t\t\t\t\tif (overlayStack.activeCount > 0) {\n\t\t\t\t\t\treturn timer(500).pipe(\n\t\t\t\t\t\t\ttakeUntil(this.destroy$),\n\t\t\t\t\t\t\tswitchMap(() => this.waitForOverlaysClear()),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\treturn timer(0)\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.subscribe({\n\t\t\t\tnext: () => {\n\t\t\t\t\tif (this.isConnected && this.state) {\n\t\t\t\t\t\tthis.show()\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\terror: () => {\n\t\t\t\t\t// Graceful degradation — overlay scheduling is best-effort.\n\t\t\t\t},\n\t\t\t})\n\n\t\tthis.subscriptions.add(showSubscription)\n\t}\n\n\tprivate waitForOverlaysClear() {\n\t\treturn timer(500).pipe(\n\t\t\ttakeUntil(this.destroy$),\n\t\t\tswitchMap(() => {\n\t\t\t\tif (!this.isConnected) return EMPTY\n\t\t\t\tif (overlayStack.activeCount > 0) {\n\t\t\t\t\treturn this.waitForOverlaysClear()\n\t\t\t\t}\n\t\t\t\treturn timer(0)\n\t\t\t}),\n\t\t)\n\t}\n\n\tprivate show() {\n\t\tif (!this.state || !this.state.element || !this.isConnected) return\n\n\t\tconst hostElement = this.state.element\n\t\tconst computedStyle = window.getComputedStyle(hostElement)\n\t\tconst computedPosition = computedStyle.position\n\n\t\tthis.state.originalOverflow = hostElement.style.overflow\n\t\tthis.state.originalPosition = hostElement.style.position\n\n\t\tif (computedPosition === 'static') {\n\t\t\thostElement.style.position = 'relative'\n\t\t}\n\n\t\thostElement.style.overflow = 'hidden'\n\n\t\tconst shimmerOverlay = document.createElement('div')\n\t\tshimmerOverlay.className = 'fyi-shimmer-overlay'\n\n\t\tconst borderRadius = computedStyle.borderRadius\n\n\t\tObject.assign(shimmerOverlay.style, {\n\t\t\tposition: 'absolute',\n\t\t\tinset: '0',\n\t\t\tpointerEvents: 'none',\n\t\t\tzIndex: '9999',\n\t\t\tborderRadius: borderRadius,\n\t\t\tbackground: `\n\t\t\t\tlinear-gradient(\n\t\t\t\t\t108deg,\n\t\t\t\t\ttransparent 0%,\n\t\t\t\t\ttransparent 40%,\n\t\t\t\t\trgba(255, 255, 255, 0.02) 44%,\n\t\t\t\t\trgba(255, 255, 255, 0.06) 48%,\n\t\t\t\t\trgba(255, 255, 255, 0.08) 50%,\n\t\t\t\t\trgba(255, 255, 255, 0.06) 52%,\n\t\t\t\t\trgba(255, 255, 255, 0.02) 56%,\n\t\t\t\t\ttransparent 60%,\n\t\t\t\t\ttransparent 100%\n\t\t\t\t)\n\t\t\t`,\n\t\t\tbackgroundSize: '400% 100%',\n\t\t\tbackgroundRepeat: 'no-repeat',\n\t\t})\n\n\t\thostElement.appendChild(shimmerOverlay)\n\t\tthis.state.shimmerOverlay = shimmerOverlay\n\n\t\tthis.state.elementAnimation = shimmerOverlay.animate(\n\t\t\t[{ backgroundPosition: '100% 0' }, { backgroundPosition: '0% 0' }],\n\t\t\t{\n\t\t\t\tduration: this.state.shimmerDuration,\n\t\t\t\teasing: 'linear',\n\t\t\t\titerations: Infinity,\n\t\t\t},\n\t\t)\n\t\tthis.state.activeAnimations.add(this.state.elementAnimation)\n\n\t\tif (!this.state.emoji) {\n\t\t\tthis.scheduleHide()\n\t\t\treturn\n\t\t}\n\n\t\tconst indicator = document.createElement('div')\n\t\tindicator.className = 'fyi-indicator'\n\t\tindicator.textContent = this.state.emoji\n\n\t\tconst positionTransform = this.getPositionTransform(this.state.position)\n\n\t\tObject.assign(indicator.style, {\n\t\t\tfontSize: '1.5rem',\n\t\t\tpointerEvents: 'none',\n\t\t\tzIndex: '10001',\n\t\t})\n\n\t\tindicator.style.transform = positionTransform\n\n\t\tconst rect = this.state.element.getBoundingClientRect()\n\t\tindicator.style.position = 'fixed'\n\n\t\tswitch (this.state.position) {\n\t\t\tcase 'bottom':\n\t\t\t\tindicator.style.top = `${rect.bottom + 2}px`\n\t\t\t\tindicator.style.left = `${rect.left + rect.width / 2}px`\n\t\t\t\tbreak\n\t\t\tcase 'top':\n\t\t\t\tindicator.style.bottom = `${window.innerHeight - rect.top}px`\n\t\t\t\tindicator.style.left = `${rect.left + rect.width / 2}px`\n\t\t\t\tbreak\n\t\t\tcase 'left':\n\t\t\t\tindicator.style.right = `${window.innerWidth - rect.left}px`\n\t\t\t\tindicator.style.top = `${rect.top + rect.height / 2}px`\n\t\t\t\tbreak\n\t\t\tcase 'right':\n\t\t\t\tindicator.style.left = `${rect.right + 12}px`\n\t\t\t\tindicator.style.top = `${rect.top + rect.height / 2}px`\n\t\t\t\tbreak\n\t\t\tcase 'auto':\n\t\t\tdefault:\n\t\t\t\tindicator.style.top = `${rect.top}px`\n\t\t\t\tindicator.style.right = `${window.innerWidth - rect.right}px`\n\t\t\t\tbreak\n\t\t}\n\n\t\tdocument.body.appendChild(indicator)\n\t\tthis.state.indicator = indicator\n\n\t\tconst fadeIn = indicator.animate(\n\t\t\t[\n\t\t\t\t{ opacity: 0, transform: `${positionTransform} scale(0.5)` },\n\t\t\t\t{ opacity: 1, transform: `${positionTransform} scale(1)` },\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration: 400,\n\t\t\t\teasing: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t)\n\t\tthis.state.activeAnimations.add(fadeIn)\n\n\t\tthis.applyAnimation(fadeIn, indicator, positionTransform)\n\n\t\tthis.scheduleHide()\n\t}\n\n\tprivate applyAnimation(fadeIn: Animation, indicator: HTMLElement, positionTransform: string) {\n\t\tif (!this.state) return\n\n\t\tconst animation = this.state.animation\n\t\tconst position = this.state.position\n\n\t\tswitch (animation) {\n\t\t\tcase 'point': {\n\t\t\t\tconst pointingKeyframes = this.getPointingKeyframes(position, positionTransform)\n\n\t\t\t\tconst animationFinish$ = fromEvent(fadeIn, 'finish').pipe(take(1), takeUntil(this.destroy$))\n\n\t\t\t\tconst subscription = animationFinish$.subscribe(() => {\n\t\t\t\t\tif (!this.state || !this.isConnected) return\n\n\t\t\t\t\tconst anim = indicator.animate(pointingKeyframes, {\n\t\t\t\t\t\tduration: 1800,\n\t\t\t\t\t\teasing: 'ease-in-out',\n\t\t\t\t\t\titerations: Infinity,\n\t\t\t\t\t})\n\t\t\t\t\tthis.state.webAnimation = anim\n\t\t\t\t\tthis.state.activeAnimations.add(anim)\n\t\t\t\t})\n\n\t\t\t\tthis.subscriptions.add(subscription)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tcase 'bounce': {\n\t\t\t\tconst anim = indicator.animate(\n\t\t\t\t\t[\n\t\t\t\t\t\t{ opacity: 0, transform: `${positionTransform} scale(0.3)`, offset: 0 },\n\t\t\t\t\t\t{ transform: `${positionTransform} scale(1.1)`, offset: 0.5 },\n\t\t\t\t\t\t{ transform: `${positionTransform} scale(0.95)`, offset: 0.7 },\n\t\t\t\t\t\t{ opacity: 1, transform: `${positionTransform} scale(1)`, offset: 1 },\n\t\t\t\t\t],\n\t\t\t\t\t{\n\t\t\t\t\t\tduration: 600,\n\t\t\t\t\t\teasing: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',\n\t\t\t\t\t\tfill: 'forwards',\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tthis.state.webAnimation = anim\n\t\t\t\tthis.state.activeAnimations.add(anim)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tcase 'pulse': {\n\t\t\t\tconst animationFinish$ = fromEvent(fadeIn, 'finish').pipe(take(1), takeUntil(this.destroy$))\n\n\t\t\t\tconst subscription = animationFinish$.subscribe(() => {\n\t\t\t\t\tif (!this.state || !this.isConnected) return\n\n\t\t\t\t\tconst anim = indicator.animate(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{ transform: `${positionTransform} scale(1)` },\n\t\t\t\t\t\t\t{ transform: `${positionTransform} scale(1.15)` },\n\t\t\t\t\t\t\t{ transform: `${positionTransform} scale(1)` },\n\t\t\t\t\t\t],\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tduration: 1500,\n\t\t\t\t\t\t\teasing: 'ease-in-out',\n\t\t\t\t\t\t\titerations: Infinity,\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t\tthis.state.webAnimation = anim\n\t\t\t\t\tthis.state.activeAnimations.add(anim)\n\t\t\t\t})\n\n\t\t\t\tthis.subscriptions.add(subscription)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tcase 'none': {\n\t\t\t\tconst anim = indicator.animate([{ opacity: 0 }, { opacity: 1 }], {\n\t\t\t\t\tduration: 300,\n\t\t\t\t\teasing: 'ease-in',\n\t\t\t\t\tfill: 'forwards',\n\t\t\t\t})\n\t\t\t\tthis.state.webAnimation = anim\n\t\t\t\tthis.state.activeAnimations.add(anim)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate getPointingKeyframes(position: FyiPosition, positionTransform: string): Keyframe[] {\n\t\tswitch (position) {\n\t\t\tcase 'top':\n\t\t\t\treturn [\n\t\t\t\t\t{ transform: `${positionTransform} scale(1) translateY(0px)` },\n\t\t\t\t\t{ transform: `${positionTransform} scale(1) translateY(8px)` },\n\t\t\t\t\t{ transform: `${positionTransform} scale(1) translateY(0px)` },\n\t\t\t\t]\n\t\t\tcase 'bottom':\n\t\t\t\treturn [\n\t\t\t\t\t{ transform: `${positionTransform} scale(1) translateY(0px)` },\n\t\t\t\t\t{ transform: `${positionTransform} scale(1) translateY(-8px)` },\n\t\t\t\t\t{ transform: `${positionTransform} scale(1) translateY(0px)` },\n\t\t\t\t]\n\t\t\tcase 'left':\n\t\t\t\treturn [\n\t\t\t\t\t{ transform: `${positionTransform} scale(1) translateX(0px)` },\n\t\t\t\t\t{ transform: `${positionTransform} scale(1) translateX(8px)` },\n\t\t\t\t\t{ transform: `${positionTransform} scale(1) translateX(0px)` },\n\t\t\t\t]\n\t\t\tcase 'right':\n\t\t\t\treturn [\n\t\t\t\t\t{ transform: `${positionTransform} scale(1) translateX(0px)` },\n\t\t\t\t\t{ transform: `${positionTransform} scale(1) translateX(-8px)` },\n\t\t\t\t\t{ transform: `${positionTransform} scale(1) translateX(0px)` },\n\t\t\t\t]\n\t\t\tcase 'auto':\n\t\t\tdefault:\n\t\t\t\treturn [\n\t\t\t\t\t{ transform: `${positionTransform} scale(1) translate(0px, 0px)` },\n\t\t\t\t\t{ transform: `${positionTransform} scale(1) translate(-6px, 6px)` },\n\t\t\t\t\t{ transform: `${positionTransform} scale(1) translate(0px, 0px)` },\n\t\t\t\t]\n\t\t}\n\t}\n\n\tprivate scheduleHide() {\n\t\tif (!this.state?.hideAfter || !this.isConnected) return\n\n\t\tconst hideSubscription = timer(this.state.hideAfter)\n\t\t\t.pipe(takeUntil(this.destroy$))\n\t\t\t.subscribe(() => {\n\t\t\t\tif (this.isConnected) {\n\t\t\t\t\tthis.hide()\n\t\t\t\t}\n\t\t\t})\n\n\t\tthis.subscriptions.add(hideSubscription)\n\t}\n\n\tprivate hide() {\n\t\tif (!this.state) return\n\n\t\tconst state = this.state\n\t\tconst exitPromises: Promise<void>[] = []\n\n\t\tif (state.indicator) {\n\t\t\tconst indicatorExit = state.indicator.animate([{ opacity: 1 }, { opacity: 0 }], {\n\t\t\t\tduration: 600,\n\t\t\t\teasing: 'cubic-bezier(0.4, 0, 0.2, 1)',\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t\tstate.activeAnimations.add(indicatorExit)\n\n\t\t\tconst cleanupIndicator = () => {\n\t\t\t\tstate.webAnimation?.cancel()\n\t\t\t\tstate.indicator?.remove()\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\texitPromises.push(indicatorExit.finished.then(cleanupIndicator).catch(cleanupIndicator))\n\t\t}\n\n\t\tif (state.shimmerOverlay) {\n\t\t\tconst shimmerExit = state.shimmerOverlay.animate(\n\t\t\t\t[\n\t\t\t\t\t{ opacity: 1 },\n\t\t\t\t\t{ opacity: 0.7, offset: 0.3 },\n\t\t\t\t\t{ opacity: 0.3, offset: 0.7 },\n\t\t\t\t\t{ opacity: 0 },\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\tduration: 3000,\n\t\t\t\t\teasing: 'ease-out',\n\t\t\t\t\tfill: 'forwards',\n\t\t\t\t},\n\t\t\t)\n\t\t\tstate.activeAnimations.add(shimmerExit)\n\n\t\t\tconst cleanupShimmer = () => {\n\t\t\t\tstate.elementAnimation?.cancel()\n\t\t\t\tstate.shimmerOverlay?.remove()\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\texitPromises.push(shimmerExit.finished.then(cleanupShimmer).catch(cleanupShimmer))\n\t\t}\n\n\t\tPromise.all(exitPromises).then(() => {\n\t\t\tif (this.state !== state) return undefined\n\n\t\t\tthis.restoreStyles(state)\n\t\t\tthis.state = null\n\t\t\treturn undefined\n\t\t})\n\t}\n\n\tprivate restoreStyles(state: FyiState) {\n\t\tif (state.element) {\n\t\t\tif (state.originalOverflow !== undefined) {\n\t\t\t\tstate.element.style.overflow = state.originalOverflow\n\t\t\t}\n\t\t\tif (state.originalPosition !== undefined) {\n\t\t\t\tstate.element.style.position = state.originalPosition\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate getPositionTransform(position: FyiPosition): string {\n\t\tswitch (position) {\n\t\t\tcase 'top':\n\t\t\tcase 'bottom':\n\t\t\t\treturn 'translateX(-50%)'\n\t\t\tcase 'left':\n\t\t\tcase 'right':\n\t\t\t\treturn 'translateY(-50%)'\n\t\t\tcase 'auto':\n\t\t\tdefault:\n\t\t\t\treturn ''\n\t\t}\n\t}\n\n\tprivate cleanup() {\n\t\tthis.destroy$.next()\n\t\tthis.destroy$.complete()\n\n\t\tthis.subscriptions.unsubscribe()\n\n\t\tif (!this.state) return\n\n\t\tthis.state.activeAnimations.forEach(anim => anim.cancel())\n\t\tthis.state.activeAnimations.clear()\n\n\t\tthis.restoreStyles(this.state)\n\n\t\tthis.state.shimmerOverlay?.remove()\n\t\tthis.state.indicator?.remove()\n\n\t\tthis.state = null\n\t}\n\n\toverride disconnected() {\n\t\tthis.cleanup()\n\t}\n\n\toverride reconnected() {\n\t\tthis.destroy$ = new Subject<void>()\n\t\tthis.subscriptions = new Subscription()\n\t}\n}\n\nexport const fyi = directive(FyiDirective)\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 * Hummingbird Directive - Realistic hummingbird flight animation\n *\n * PERFORMANCE OPTIMIZATIONS:\n * 1. Use CSS transforms only (GPU-accelerated, no layout/paint)\n * 2. will-change hints for compositor optimization\n * 3. Single RAF loop, no nested animations\n * 4. Minimize DOM operations\n * 5. Pre-calculate values where possible\n * 6. Use CSS animations for constant motion (wing blur)\n *\n * Based on scientific research:\n * - Wing beat ~43Hz (PMC3311889)\n * - Forward speed 13 m/s / 30mph (Britannica)\n * - Figure-8 hover pattern (Royal Society)\n *\n * ANIMATION STATES (State Machine):\n * - idle: waiting for delay\n * - flying: moving between waypoints\n * - hovering: figure-8 pattern at waypoint\n * - spiraling: approaching black hole\n * - absorbed: being sucked into black hole\n * - done: cleanup complete\n */\n\nimport { noChange } from 'lit'\nimport { AsyncDirective, directive } from 'lit/async-directive.js'\nimport type { ElementPart } from 'lit'\nimport { BehaviorSubject, EMPTY, Observable, forkJoin, timer, fromEvent, combineLatest } from 'rxjs'\nimport { distinctUntilChanged, filter, map, switchMap, takeUntil, tap, take, debounceTime, startWith } from 'rxjs/operators'\nimport { discover } from '../discovery/discovery.service'\nimport { ThemeWhereAreYou, ThemeHereIAm } from '../theme/theme.events'\n\n// Physics constants\nconst FORWARD_SPEED_PX_S = 200 // Pixels per second\nconst PAUSE_DURATION_MS = 600 // Brief pause at each waypoint\n\n// Animation states\ntype AnimationState = 'idle' | 'flying' | 'hovering' | 'spiraling' | 'absorbed' | 'done'\n\n/**\n * Element reference for waypoints/target:\n * - CSS selector (e.g., '#app-card-melanie', '.my-class') - event-based discovery\n * - Component tag name (e.g., 'schmancy-fancy') - event-based discovery\n * - HTMLElement reference directly\n */\ntype ElementRef = string | HTMLElement\n\n/** Waypoint with optional duration control */\ninterface Waypoint {\n\tref: ElementRef\n\tduration?: number // How long to pause at this waypoint (ms)\n}\n\ninterface HummingbirdOptions {\n\t/** Waypoints the bird visits in sequence */\n\twaypoints?: (ElementRef | Waypoint)[]\n\t/** Where the bird returns home (triggers black hole effect). If omitted, bird fades out after last waypoint. */\n\thome?: ElementRef\n\t/** Delay before starting flight (ms) */\n\tdelay?: number\n\t/** Whether the hummingbird should be playing. When false, cleans up and pauses. Defaults to true. */\n\tplaying?: boolean\n\t/** Show animated connection lines between visited waypoints. Defaults to false. */\n\tshowConnections?: boolean\n}\n\ninterface Destination {\n\tx: number\n\ty: number\n\telement?: HTMLElement // The actual element for theme discovery\n\tduration: number // How long to pause here\n}\n\ninterface AnimationContext {\n\t// State machine\n\tstate: AnimationState\n\t// Position tracking\n\tcx: number\n\tcy: number\n\t// Flight parameters\n\tflightStartX: number\n\tflightStartY: number\n\tphaseStart: number\n\tdestIdx: number\n\t// Destinations\n\tdestinations: Destination[]\n\t// Black hole position\n\tbx: number\n\tby: number\n}\n\n// Shared keyframes - inject once\nlet keyframesInjected = false\nfunction injectKeyframes(): void {\n\tif (keyframesInjected) return\n\tkeyframesInjected = true\n\n\tconst style = document.createElement('style')\n\tstyle.id = 'hb-keyframes'\n\tstyle.textContent = `\n\t\t@keyframes hb-wing {\n\t\t\t0% { transform: scaleY(0.85); opacity: 0.4; }\n\t\t\t100% { transform: scaleY(1.15); opacity: 0.6; }\n\t\t}\n\t\t@keyframes hb-disk-inner {\n\t\t\tto { transform: translate(-50%, -50%) rotateX(75deg) rotate(360deg); }\n\t\t}\n\t\t@keyframes hb-disk-outer {\n\t\t\tto { transform: translate(-50%, -50%) rotateX(70deg) rotate(-360deg); }\n\t\t}\n\t\t@keyframes hb-disk-mid {\n\t\t\tto { transform: translate(-50%, -50%) rotateX(72deg) rotate(180deg); }\n\t\t}\n\t\t@keyframes hb-bh-in {\n\t\t\t0% { transform: translate(-50%, -50%) scale(0); }\n\t\t\t60% { transform: translate(-50%, -50%) scale(1.1); }\n\t\t\t100% { transform: translate(-50%, -50%) scale(1); }\n\t\t}\n\t\t@keyframes hb-horizon-pulse {\n\t\t\t0%, 100% { box-shadow: 0 0 20px 6px var(--hb-color), 0 0 40px 12px var(--hb-color-dim); }\n\t\t\t50% { box-shadow: 0 0 30px 10px var(--hb-color), 0 0 60px 20px var(--hb-color-dim); }\n\t\t}\n\t\t@keyframes hb-lensing {\n\t\t\t0% { transform: translate(-50%, -50%) rotateX(85deg) scale(1); opacity: 0.6; }\n\t\t\t50% { transform: translate(-50%, -50%) rotateX(85deg) scale(1.05); opacity: 0.8; }\n\t\t\t100% { transform: translate(-50%, -50%) rotateX(85deg) scale(1); opacity: 0.6; }\n\t\t}\n\t\t@keyframes hb-particle-orbit {\n\t\t\t0% { transform: rotate(0deg) translateX(var(--orbit-radius)) rotate(0deg) scale(1); opacity: 0.9; }\n\t\t\t100% { transform: rotate(720deg) translateX(0px) rotate(-720deg) scale(0); opacity: 0; }\n\t\t}\n\t\t@keyframes hb-ripple {\n\t\t\t0% { transform: translate(-50%, -50%) scale(0.5); opacity: 0.8; }\n\t\t\t100% { transform: translate(-50%, -50%) scale(3); opacity: 0; }\n\t\t}\n\t`\n\tdocument.head.appendChild(style)\n}\n\n/**\n * Cosmic nebula color palette - based on real emission spectra\n * H-alpha (656nm) - Crimson ionized hydrogen\n * OIII (501nm) - Teal ionized oxygen\n * SII (672nm) - Deep burgundy sulfur\n * Reflection blue - scattered starlight\n */\nconst COSMIC_COLORS = {\n\t// H-alpha crimson\n\thAlpha: 'rgba(200, 50, 100, 0.85)',\n\thAlphaDim: 'rgba(150, 30, 80, 0.5)',\n\t// OIII teal\n\toiii: 'rgba(40, 180, 180, 0.7)',\n\toiiiDim: 'rgba(30, 140, 150, 0.35)',\n\t// Reflection/stellar\n\tstellar: 'rgba(255, 230, 240, 0.9)',\n\tstellarDim: 'rgba(255, 180, 200, 0.4)',\n\t// Deep space\n\tdeepPurple: 'rgba(80, 40, 120, 0.6)',\n\tdeepBlue: 'rgba(20, 40, 100, 0.5)',\n\t// Event horizon\n\tvoidBlack: 'rgba(0, 0, 0, 1)',\n\tsingularity: 'rgba(10, 5, 20, 1)',\n}\n\n/**\n * Glowing spark - simple, elegant light guide\n */\nconst createBirdSVG = (color: string) => `<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" style=\"overflow:visible\">\n\t<defs>\n\t\t<radialGradient id=\"glow\">\n\t\t\t<stop offset=\"0%\" stop-color=\"${color}\" stop-opacity=\"1\"/>\n\t\t\t<stop offset=\"50%\" stop-color=\"${color}\" stop-opacity=\"0.4\"/>\n\t\t\t<stop offset=\"100%\" stop-color=\"${color}\" stop-opacity=\"0\"/>\n\t\t</radialGradient>\n\t</defs>\n\n\t<!-- Outer glow -->\n\t<circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"url(#glow)\"/>\n\n\t<!-- Core -->\n\t<circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"${color}\"/>\n\n\t<!-- Bright center -->\n\t<circle cx=\"12\" cy=\"12\" r=\"2\" fill=\"white\" opacity=\"0.9\"/>\n</svg>`\n\n/**\n * Convert hex color to rgba with alpha\n */\nfunction hexToRgba(hex: string, alpha: number): string {\n\tconst r = parseInt(hex.slice(1, 3), 16)\n\tconst g = parseInt(hex.slice(3, 5), 16)\n\tconst b = parseInt(hex.slice(5, 7), 16)\n\treturn `rgba(${r}, ${g}, ${b}, ${alpha})`\n}\n\nclass HummingbirdDirective extends AsyncDirective {\n\tprivate state$ = new BehaviorSubject<AnimationState>('idle')\n\tprivate destroyed$ = new BehaviorSubject<boolean>(false)\n\tprivate visible$ = new BehaviorSubject<boolean>(true)\n\tprivate bird: HTMLElement | null = null\n\tprivate blackHole: HTMLElement | null = null\n\tprivate particles: HTMLElement[] = []\n\tprivate trailCanvas: HTMLCanvasElement | null = null\n\tprivate trailCtx: CanvasRenderingContext2D | null = null\n\tprivate lastTrailPos: { x: number; y: number } | null = null\n\tprivate rafId = 0\n\tprivate context: AnimationContext | null = null\n\tprivate element: HTMLElement | null = null\n\tprivate options: HummingbirdOptions = {}\n\tprivate hasHome = false\n\n\t/**\n\t * Convert viewport coordinates to host-relative coordinates.\n\t * getBoundingClientRect() returns viewport coords; we subtract the host's rect.\n\t */\n\tprivate toHostRelative(viewportX: number, viewportY: number): { x: number; y: number } {\n\t\tif (!this.element) return { x: viewportX, y: viewportY }\n\t\tconst hostRect = this.element.getBoundingClientRect()\n\t\treturn {\n\t\t\tx: viewportX - hostRect.left + this.element.scrollLeft,\n\t\t\ty: viewportY - hostRect.top + this.element.scrollTop,\n\t\t}\n\t}\n\n\trender(_options?: boolean | HummingbirdOptions) {\n\t\treturn noChange\n\t}\n\n\toverride update(part: ElementPart, [options = true]: [boolean | HummingbirdOptions | undefined]) {\n\t\tconst element = part.element as HTMLElement\n\t\tconst opts: HummingbirdOptions = typeof options === 'object' ? options : {}\n\t\t// Check both: boolean false OR options.playing === false\n\t\tconst shouldPlay = typeof options === 'boolean' ? options : (opts.playing !== false)\n\n\t\tif (!shouldPlay) {\n\t\t\tthis.fadeOutAndCleanup()\n\t\t\treturn noChange\n\t\t}\n\n\t\tif (this.bird) return noChange // Already running\n\n\t\t// Reset destroyed state so subscriptions can work again\n\t\tif (this.destroyed$.value) {\n\t\t\tthis.destroyed$.next(false)\n\t\t\tthis.state$.next('idle')\n\t\t}\n\n\t\tthis.element = element\n\t\tthis.options = opts\n\n\t\t// Ensure host element can contain absolutely-positioned children\n\t\tconst computedPos = window.getComputedStyle(element).position\n\t\tif (computedPos === 'static') {\n\t\t\telement.style.position = 'relative'\n\t\t}\n\t\telement.style.overflow = 'visible'\n\n\t\tinjectKeyframes()\n\t\tthis.initStateMachine()\n\n\t\treturn noChange\n\t}\n\n\tprivate initStateMachine(): void {\n\t\t// State machine subscription\n\t\tthis.state$\n\t\t\t.pipe(\n\t\t\t\tdistinctUntilChanged(),\n\t\t\t\tfilter(() => !this.destroyed$.value),\n\t\t\t\tswitchMap(state => this.handleStateTransition(state)),\n\t\t\t\ttakeUntil(this.destroyed$.pipe(filter(v => v)))\n\t\t\t)\n\t\t\t.subscribe()\n\n\t\t// Combine IntersectionObserver + Page Visibility + Parent Playing State - all must be true\n\t\tcombineLatest([\n\t\t\t// IntersectionObserver\n\t\t\tnew Observable<boolean>(subscriber => {\n\t\t\t\tif (!this.element || typeof IntersectionObserver === 'undefined') {\n\t\t\t\t\tsubscriber.next(true)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst observer = new IntersectionObserver(\n\t\t\t\t\tentries => subscriber.next(entries[0].isIntersecting),\n\t\t\t\t\t{ threshold: 0 }\n\t\t\t\t)\n\t\t\t\tobserver.observe(this.element)\n\t\t\t\treturn () => observer.disconnect()\n\t\t\t}),\n\t\t\t// Page Visibility\n\t\t\tfromEvent(document, 'visibilitychange').pipe(\n\t\t\t\tmap(() => document.visibilityState === 'visible'),\n\t\t\t\tstartWith(document.visibilityState === 'visible')\n\t\t\t),\n\t\t\t// Parent playing state - find ancestor with 'playing' property and observe changes\n\t\t\tnew Observable<boolean>(subscriber => {\n\t\t\t\tif (!this.element) {\n\t\t\t\t\tsubscriber.next(true)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// Find ancestor with 'playing' property (scene components)\n\t\t\t\tlet ancestor: HTMLElement | null = this.element\n\t\t\t\tlet playingHost: HTMLElement | null = null\n\t\t\t\twhile (ancestor) {\n\t\t\t\t\tif ('playing' in ancestor) {\n\t\t\t\t\t\tplayingHost = ancestor\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tancestor = ancestor.parentElement\n\t\t\t\t}\n\t\t\t\tif (!playingHost) {\n\t\t\t\t\tsubscriber.next(true)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// Emit current value\n\t\t\t\tsubscriber.next((playingHost as HTMLElement & { playing: boolean }).playing)\n\t\t\t\t// Observe attribute changes on the host\n\t\t\t\tconst observer = new MutationObserver(() => {\n\t\t\t\t\tsubscriber.next((playingHost as HTMLElement & { playing: boolean }).playing)\n\t\t\t\t})\n\t\t\t\tobserver.observe(playingHost, { attributes: true, attributeFilter: ['playing'] })\n\t\t\t\treturn () => observer.disconnect()\n\t\t\t}),\n\t\t])\n\t\t\t.pipe(\n\t\t\t\tmap(([inView, tabActive, playing]) => inView && tabActive && playing),\n\t\t\t\tdistinctUntilChanged(),\n\t\t\t\ttap(visible => this.visible$.next(visible)),\n\t\t\t\tfilter(() => !this.destroyed$.value && !!this.context),\n\t\t\t\ttakeUntil(this.destroyed$.pipe(filter(v => v)))\n\t\t\t)\n\t\t\t.subscribe(visible => {\n\t\t\t\tif (visible && !this.rafId) {\n\t\t\t\t\tthis.startAnimationLoop()\n\t\t\t\t} else if (!visible && this.rafId) {\n\t\t\t\t\tcancelAnimationFrame(this.rafId)\n\t\t\t\t\tthis.rafId = 0\n\t\t\t\t}\n\t\t\t})\n\n\t\t// React to window resize - update destination positions\n\t\t// Scroll listener removed: bird is position:absolute inside host, moves naturally with scroll\n\t\tfromEvent(window, 'resize')\n\t\t\t.pipe(\n\t\t\t\tdebounceTime(100),\n\t\t\t\tfilter(() => !this.destroyed$.value && !!this.context),\n\t\t\t\ttakeUntil(this.destroyed$.pipe(filter(v => v)))\n\t\t\t)\n\t\t\t.subscribe(() => this.updateDestinationPositions())\n\n\t\t// Wait for delay + host visibility, then discover elements and create bird\n\t\tconst delay = this.options.delay ?? 500\n\t\ttimer(delay)\n\t\t\t.pipe(\n\t\t\t\tfilter(() => !this.destroyed$.value && !this.bird),\n\t\t\t\t// Wait for host element to be visible (opacity > 0.5)\n\t\t\t\tswitchMap(() => new Observable<void>(subscriber => {\n\t\t\t\t\tif (!this.element) {\n\t\t\t\t\t\tsubscriber.next()\n\t\t\t\t\t\tsubscriber.complete()\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst checkVisibility = () => {\n\t\t\t\t\t\tif (this.isElementVisible(this.element!)) {\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} else {\n\t\t\t\t\t\t\ttimer(50)\n\t\t\t\t\t\t\t\t.pipe(takeUntil(this.destroyed$.pipe(filter(v => v))))\n\t\t\t\t\t\t\t\t.subscribe(checkVisibility)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcheckVisibility()\n\t\t\t\t})),\n\t\t\t\tswitchMap(() => this.createBird()),\n\t\t\t\ttap(() => {\n\t\t\t\t\tif (!this.destroyed$.value) {\n\t\t\t\t\t\tthis.state$.next('flying')\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.destroyed$.pipe(filter(v => v)))\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\tprivate handleStateTransition(state: AnimationState) {\n\t\tswitch (state) {\n\t\t\tcase 'idle':\n\t\t\t\treturn EMPTY\n\t\t\tcase 'flying':\n\t\t\tcase 'hovering':\n\t\t\tcase 'spiraling':\n\t\t\tcase 'absorbed':\n\t\t\t\tthis.startAnimationLoop()\n\t\t\t\treturn EMPTY\n\t\t\tcase 'done':\n\t\t\t\tthis.cleanup()\n\t\t\t\t// Emit completion event so parent can react\n\t\t\t\tthis.element?.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('hummingbird-complete', { bubbles: true, composed: true })\n\t\t\t\t)\n\t\t\t\treturn EMPTY\n\t\t\tdefault:\n\t\t\t\treturn EMPTY\n\t\t}\n\t}\n\n\tprivate async createBird(): Promise<void> {\n\t\tif (!this.element) return\n\n\t\t// Create bird with default color first\n\t\tconst bird = document.createElement('div')\n\t\tbird.innerHTML = createBirdSVG(this.currentColor)\n\t\tbird.className = 'pointer-events-none'\n\t\tbird.style.cssText = `\n\t\t\tposition: absolute;\n\t\t\tleft: 0;\n\t\t\ttop: 0;\n\t\t\twidth: 24px;\n\t\t\theight: 24px;\n\t\t\tz-index: 99999;\n\t\t\twill-change: transform, opacity;\n\t\t\ttransform-origin: center center;\n\t\t\ttransition: opacity 400ms ease-out;\n\t\t`\n\t\tthis.element.appendChild(bird)\n\t\tthis.bird = bird\n\n\t\t// Discover initial theme color asynchronously\n\t\tthis.discoverInitialColor()\n\n\t\tconst rect = this.element.getBoundingClientRect()\n\t\tconst hostRel = this.toHostRelative(rect.left, rect.top)\n\t\tconst waypoints = await this.discoverWaypoints(this.options.waypoints || [])\n\t\tconst home = this.options.home ? await this.getPosition(this.options.home) : null\n\n\t\tconst destinations = [...waypoints]\n\t\tthis.hasHome = !!home\n\t\tif (home) destinations.push(home)\n\n\t\t// If no destinations, create simple fly-through\n\t\tif (destinations.length === 0) {\n\t\t\tdestinations.push({\n\t\t\t\tx: hostRel.x + rect.width + 60,\n\t\t\t\ty: hostRel.y + rect.height * 0.5,\n\t\t\t\tduration: PAUSE_DURATION_MS,\n\t\t\t})\n\t\t}\n\n\t\t// Start position (host-relative)\n\t\tconst startX = hostRel.x - 60\n\t\tconst startY = hostRel.y + rect.height / 2\n\n\t\tthis.context = {\n\t\t\tstate: 'flying',\n\t\t\tcx: startX,\n\t\t\tcy: startY,\n\t\t\tflightStartX: startX,\n\t\t\tflightStartY: startY,\n\t\t\tphaseStart: performance.now(),\n\t\t\tdestIdx: 0,\n\t\t\tdestinations,\n\t\t\tbx: 0,\n\t\t\tby: 0,\n\t\t}\n\n\t\t// Offset by half element size (-12px) so spark centers at the position\n\t\tthis.bird.style.transform = `translate(${startX - 12}px, ${startY - 12}px)`\n\t}\n\n\t/** Current bird color — empty until `discoverInitialColor()` resolves a theme color. */\n\tprivate currentColor = ''\n\n\t/**\n\t * Discover initial theme color from nearest schmancy-theme.\n\t * Dispatches event FROM the host element so it bubbles up to nearest theme.\n\t */\n\tprivate discoverInitialColor(): void {\n\t\tif (!this.element) return\n\n\t\t// Listen for theme response first\n\t\tfromEvent<CustomEvent<{ theme: HTMLElement & { color?: string } }>>(window, ThemeHereIAm)\n\t\t\t.pipe(\n\t\t\t\ttake(1),\n\t\t\t\ttakeUntil(timer(150)),\n\t\t\t\tmap(e => e.detail.theme?.color),\n\t\t\t\tfilter((color): color is string => !!color && color !== this.currentColor),\n\t\t\t\ttakeUntil(this.destroyed$.pipe(filter(v => v)))\n\t\t\t)\n\t\t\t.subscribe(color => {\n\t\t\t\tif (!this.bird) return\n\t\t\t\tthis.currentColor = color\n\t\t\t\tthis.bird.innerHTML = createBirdSVG(color)\n\t\t\t})\n\n\t\t// Dispatch FROM the host element (bubbles up to nearest theme)\n\t\tthis.element.dispatchEvent(\n\t\t\tnew CustomEvent(ThemeWhereAreYou, { bubbles: true, composed: true })\n\t\t)\n\t}\n\n\t/**\n\t * Discover and update bird color based on current destination's theme.\n\t * Dispatches event FROM the destination element so it bubbles to its nearest theme.\n\t */\n\tprivate updateBirdColor(): void {\n\t\tif (!this.bird || !this.context || this.destroyed$.value) return\n\n\t\t// Get the current destination element\n\t\tconst dest = this.context.destinations[this.context.destIdx]\n\t\tif (!dest?.element) return\n\n\t\t// Listen for theme response\n\t\tfromEvent<CustomEvent<{ theme: HTMLElement & { color?: string } }>>(window, ThemeHereIAm)\n\t\t\t.pipe(\n\t\t\t\ttake(1),\n\t\t\t\ttakeUntil(timer(100)),\n\t\t\t\tmap(e => e.detail.theme?.color),\n\t\t\t\tfilter((color): color is string => !!color && color !== this.currentColor),\n\t\t\t\ttakeUntil(this.destroyed$.pipe(filter(v => v)))\n\t\t\t)\n\t\t\t.subscribe(color => {\n\t\t\t\tif (!this.bird) return\n\t\t\t\tthis.currentColor = color\n\t\t\t\tthis.bird.innerHTML = createBirdSVG(color)\n\t\t\t})\n\n\t\t// Dispatch FROM the destination element (bubbles up to its nearest theme)\n\t\tdest.element.dispatchEvent(\n\t\t\tnew CustomEvent(ThemeWhereAreYou, { bubbles: true, composed: true })\n\t\t)\n\t}\n\n\t/**\n\t * Discover all waypoint elements and return their positions with element references.\n\t * Supports both simple ElementRef and Waypoint objects with duration.\n\t * Uses RxJS forkJoin for parallel discovery.\n\t */\n\tprivate discoverWaypoints(waypoints: (ElementRef | Waypoint)[]): Promise<Destination[]> {\n\t\tif (waypoints.length === 0) return Promise.resolve([])\n\n\t\t// Normalize waypoints to { ref, duration } format\n\t\tconst normalized = waypoints.map(wp => {\n\t\t\tif (typeof wp === 'string' || wp instanceof HTMLElement) {\n\t\t\t\treturn { ref: wp, duration: PAUSE_DURATION_MS }\n\t\t\t}\n\t\t\treturn { ref: wp.ref, duration: wp.duration ?? PAUSE_DURATION_MS }\n\t\t})\n\n\t\tconst discoveries$ = normalized.map(wp => this.discoverElement(wp.ref))\n\n\t\treturn new Promise(resolve => {\n\t\t\tforkJoin(discoveries$)\n\t\t\t\t.pipe(\n\t\t\t\t\tmap(elements =>\n\t\t\t\t\t\telements\n\t\t\t\t\t\t\t.map((el, i): Destination | null => {\n\t\t\t\t\t\t\t\tif (!el) return null\n\t\t\t\t\t\t\t\tconst r = el.getBoundingClientRect()\n\t\t\t\t\t\t\t\tconst center = this.toHostRelative(r.left + r.width / 2, r.top + r.height / 2)\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tx: center.x,\n\t\t\t\t\t\t\t\t\ty: center.y,\n\t\t\t\t\t\t\t\t\telement: el,\n\t\t\t\t\t\t\t\t\tduration: normalized[i].duration,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.filter((d): d is Destination => d !== null)\n\t\t\t\t\t),\n\t\t\t\t\ttakeUntil(this.destroyed$.pipe(filter(v => v)))\n\t\t\t\t)\n\t\t\t\t.subscribe({\n\t\t\t\t\tnext: positions => resolve(positions),\n\t\t\t\t\terror: () => resolve([]),\n\t\t\t\t})\n\t\t})\n\t}\n\n\t/**\n\t * Discover a single element by reference using event-based discovery.\n\t * - HTMLElement: return directly\n\t * - String (CSS selector or component tag): use discover() service\n\t */\n\tprivate discoverElement(ref: ElementRef): Promise<HTMLElement | null> {\n\t\tif (ref instanceof HTMLElement) {\n\t\t\treturn Promise.resolve(ref)\n\t\t}\n\n\t\treturn new Promise(resolve => {\n\t\t\tdiscover<HTMLElement>(ref, 300)\n\t\t\t\t.pipe(takeUntil(this.destroyed$.pipe(filter(v => v))))\n\t\t\t\t.subscribe({\n\t\t\t\t\tnext: el => resolve(el),\n\t\t\t\t\terror: () => resolve(null),\n\t\t\t\t})\n\t\t})\n\t}\n\n\t/**\n\t * Get position from an element reference (includes element for theme discovery).\n\t * Target uses center position (for black hole effect).\n\t */\n\tprivate async getPosition(ref: ElementRef): Promise<Destination | null> {\n\t\tconst el = await this.discoverElement(ref)\n\t\tif (!el) return null\n\t\tconst r = el.getBoundingClientRect()\n\t\tconst center = this.toHostRelative(r.left + r.width / 2, r.top + r.height / 2)\n\t\treturn { x: center.x, y: center.y, element: el, duration: PAUSE_DURATION_MS }\n\t}\n\n\t/**\n\t * Update all destination positions from their stored element references.\n\t * Called on window resize/scroll to keep positions accurate.\n\t */\n\tprivate updateDestinationPositions(): void {\n\t\tif (!this.context) return\n\n\t\tfor (const dest of this.context.destinations) {\n\t\t\tif (dest.element) {\n\t\t\t\tconst r = dest.element.getBoundingClientRect()\n\t\t\t\tconst center = this.toHostRelative(r.left + r.width / 2, r.top + r.height / 2)\n\t\t\t\tdest.x = center.x\n\t\t\t\tdest.y = center.y\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate startAnimationLoop(): void {\n\t\tif (this.rafId) return\n\n\t\tconst tick = (now: number) => {\n\t\t\tif (!this.bird || !this.context || this.destroyed$.value || !this.visible$.value) {\n\t\t\t\tthis.rafId = 0\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tswitch (this.state$.value) {\n\t\t\t\tcase 'flying':\n\t\t\t\t\tthis.tickFlying(now)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'hovering':\n\t\t\t\t\tthis.tickHovering(now)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'spiraling':\n\t\t\t\t\tthis.tickSpiraling(now)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'absorbed':\n\t\t\t\t\tthis.tickAbsorbed(now)\n\t\t\t\t\treturn // Don't schedule next frame - absorption handles completion\n\t\t\t}\n\n\t\t\tthis.rafId = requestAnimationFrame(tick)\n\t\t}\n\n\t\tthis.rafId = requestAnimationFrame(tick)\n\t}\n\n\tprivate tickFlying(now: number): void {\n\t\tif (!this.context || !this.bird) return\n\n\t\tconst ctx = this.context\n\t\tconst elapsed = now - ctx.phaseStart\n\t\tconst dest = ctx.destinations[ctx.destIdx]\n\n\t\tconst dx = dest.x - ctx.flightStartX\n\t\tconst dy = dest.y - ctx.flightStartY\n\t\tconst dist = Math.hypot(dx, dy)\n\t\tconst duration = (dist / FORWARD_SPEED_PX_S) * 1000\n\t\tconst t = Math.min(1, elapsed / duration)\n\n\t\t// Cubic ease-in-out\n\t\tconst e = t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2\n\n\t\tctx.cx = ctx.flightStartX + dx * e\n\t\tctx.cy = ctx.flightStartY + dy * e\n\n\t\t// Simple smooth movement - no rotation or bouncing\n\t\tthis.bird.style.transform = `translate(${ctx.cx - 12}px, ${ctx.cy - 12}px)`\n\n\t\t// Draw trail in real-time as bird flies (airplane vapor trail effect)\n\t\tif (this.options.showConnections) {\n\t\t\tthis.drawTrail(ctx.cx, ctx.cy)\n\t\t\tthis.fadeTrail() // Continuously fade for vapor effect\n\t\t}\n\n\t\t// Update color based on section the bird is flying over\n\t\tif (Math.floor(elapsed / 200) !== Math.floor((elapsed - 16) / 200)) {\n\t\t\tthis.updateBirdColor()\n\t\t}\n\n\t\tif (t >= 1) {\n\t\t\tconst isLastDestination = ctx.destIdx >= ctx.destinations.length - 1\n\n\t\t\tif (isLastDestination && this.hasHome) {\n\t\t\t\t// Has home: transition to spiraling into black hole\n\t\t\t\tctx.bx = dest.x\n\t\t\t\tctx.by = dest.y\n\t\t\t\tctx.phaseStart = now\n\t\t\t\tthis.createBlackHole(ctx.bx, ctx.by)\n\t\t\t\tthis.state$.next('spiraling')\n\t\t\t} else {\n\t\t\t\t// Transition to hovering (including last waypoint when no home)\n\t\t\t\tctx.phaseStart = now\n\t\t\t\tthis.state$.next('hovering')\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Active shimmer overlay for current waypoint */\n\tprivate shimmerOverlay: HTMLDivElement | null = null\n\tprivate shimmerAnimation: Animation | null = null\n\t/** Active pulse rings for current waypoint */\n\tprivate pulseRings: HTMLDivElement[] = []\n\n\tprivate tickHovering(now: number): void {\n\t\tif (!this.context || !this.bird) return\n\n\t\tconst ctx = this.context\n\t\tconst elapsed = now - ctx.phaseStart\n\t\tconst dest = ctx.destinations[ctx.destIdx]\n\n\t\t// Show shimmer, pulse rings, and fade spark on first frame of hover\n\t\tif (elapsed < 20 && dest.element && !this.shimmerOverlay) {\n\t\t\tthis.showShimmer(dest.element)\n\t\t\tthis.showPulseRings(dest.x, dest.y)\n\t\t\t// Fade spark to invisible while hovering\n\t\t\tthis.bird.style.opacity = '0'\n\t\t}\n\n\t\t// Stay in place with subtle breathing pulse (no movement)\n\t\tctx.cx = dest.x\n\t\tctx.cy = dest.y\n\t\tconst pulse = 1 + Math.sin(elapsed * 0.006) * 0.08 // Very subtle 8% scale pulse\n\t\tthis.bird.style.transform = `translate(${dest.x - 12}px, ${dest.y - 12}px) scale(${pulse})`\n\n\t\t// Use per-waypoint duration - but also wait for next element to be visible\n\t\tif (elapsed > dest.duration) {\n\t\t\tconst nextDest = ctx.destinations[ctx.destIdx + 1]\n\t\t\tconst isLastWaypoint = !nextDest\n\n\t\t\t// Last waypoint (no home): fade out after hovering\n\t\t\tif (isLastWaypoint && !this.hasHome) {\n\t\t\t\tthis.hideShimmer()\n\t\t\t\tthis.fadeOutBird()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Check if next waypoint element is visible (not opacity-0)\n\t\t\tif (nextDest?.element && !this.isElementVisible(nextDest.element)) {\n\t\t\t\t// Next element not visible yet, keep waiting\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// Scroll next waypoint into view if off-screen\n\t\t\tif (nextDest?.element && !this.isInViewport(nextDest.element)) {\n\t\t\t\tnextDest.element.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' })\n\t\t\t}\n\t\t\t// Refresh next destination position (element may have animated to new position)\n\t\t\tif (nextDest?.element) {\n\t\t\t\tconst r = nextDest.element.getBoundingClientRect()\n\t\t\t\tconst center = this.toHostRelative(r.left + r.width / 2, r.top + r.height / 2)\n\t\t\t\tnextDest.x = center.x\n\t\t\t\tnextDest.y = center.y\n\t\t\t}\n\t\t\t// Restore spark opacity before moving\n\t\t\tthis.bird.style.opacity = '1'\n\t\t\t// Hide shimmer before moving\n\t\t\tthis.hideShimmer()\n\t\t\t// Reset trail for new flight segment\n\t\t\tthis.resetTrail()\n\t\t\t// Move to next destination\n\t\t\tctx.destIdx++\n\t\t\tctx.flightStartX = dest.x\n\t\t\tctx.flightStartY = dest.y\n\t\t\tctx.phaseStart = now\n\t\t\tthis.state$.next('flying')\n\t\t}\n\t}\n\n\t\t/**\n\t * Check if an element is sufficiently visible (opacity > 0.5 and not hidden)\n\t * Uses 0.5 threshold to wait for CSS transitions to be halfway done\n\t */\n\tprivate isElementVisible(element: HTMLElement): boolean {\n\t\tconst style = window.getComputedStyle(element)\n\t\tconst opacity = parseFloat(style.opacity)\n\t\treturn opacity > 0.5 && style.visibility !== 'hidden' && style.display !== 'none'\n\t}\n\n\t/** Check if element is within the viewport bounds (with padding so bird doesn't fly to edges) */\n\tprivate isInViewport(element: HTMLElement): boolean {\n\t\tconst r = element.getBoundingClientRect()\n\t\tconst pad = 80\n\t\treturn r.bottom > pad && r.top < window.innerHeight - pad && r.right > pad && r.left < window.innerWidth - pad\n\t}\n\n\n\n\n\n\t/**\n\t * Show shimmer effect on an element (similar to fyi directive)\n\t */\n\tprivate showShimmer(element: HTMLElement): void {\n\t\t// Store and modify element position if needed\n\t\tconst computedStyle = window.getComputedStyle(element)\n\t\tif (computedStyle.position === 'static') {\n\t\t\telement.style.position = 'relative'\n\t\t}\n\n\t\t// Create shimmer overlay\n\t\tconst shimmer = document.createElement('div')\n\t\tshimmer.style.cssText = `\n\t\t\tposition: absolute;\n\t\t\tinset: 0;\n\t\t\tpointer-events: none;\n\t\t\tz-index: 9999;\n\t\t\tborder-radius: ${computedStyle.borderRadius};\n\t\t\tbackground: linear-gradient(\n\t\t\t\t108deg,\n\t\t\t\ttransparent 0%,\n\t\t\t\ttransparent 30%,\n\t\t\t\trgba(255, 255, 255, 0.02) 38%,\n\t\t\t\trgba(255, 255, 255, 0.06) 45%,\n\t\t\t\trgba(255, 255, 255, 0.08) 50%,\n\t\t\t\trgba(255, 255, 255, 0.06) 55%,\n\t\t\t\trgba(255, 255, 255, 0.02) 62%,\n\t\t\t\ttransparent 70%,\n\t\t\t\ttransparent 100%\n\t\t\t);\n\t\t\tbackground-size: 300% 100%;\n\t\t`\n\n\t\telement.appendChild(shimmer)\n\t\tthis.shimmerOverlay = shimmer\n\n\t\t// Animate shimmer - slow and elegant like fyi directive (10 seconds)\n\t\tthis.shimmerAnimation = shimmer.animate(\n\t\t\t[{ backgroundPosition: '300% 0' }, { backgroundPosition: '-100% 0' }],\n\t\t\t{ duration: 10000, easing: 'cubic-bezier(0.25, 0.1, 0.25, 1)', iterations: Infinity }\n\t\t)\n\t}\n\n\t/**\n\t * Hide and cleanup shimmer effect\n\t */\n\tprivate hideShimmer(): void {\n\t\tif (this.shimmerAnimation) {\n\t\t\tthis.shimmerAnimation.cancel()\n\t\t\tthis.shimmerAnimation = null\n\t\t}\n\t\tif (this.shimmerOverlay) {\n\t\t\t// Fade out then remove\n\t\t\tconst fadeOut = this.shimmerOverlay.animate([{ opacity: 1 }, { opacity: 0 }], {\n\t\t\t\tduration: 300,\n\t\t\t\teasing: 'ease-out',\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t\tconst overlay = this.shimmerOverlay\n\t\t\tfadeOut.onfinish = () => overlay.remove()\n\t\t\tthis.shimmerOverlay = null\n\t\t}\n\t}\n\n\t/**\n\t * Fade out bird gracefully (when no home defined)\n\t */\n\tprivate fadeOutBird(): void {\n\t\tif (!this.bird) return\n\n\t\t// Set state to idle to prevent tickHovering from being called again\n\t\tthis.state$.next('idle')\n\n\t\t// Restore opacity before fading (may be 0 from hovering)\n\t\tthis.bird.style.opacity = '1'\n\n\t\tthis.bird.animate(\n\t\t\t[{ opacity: 1, transform: this.bird.style.transform }, { opacity: 0, transform: this.bird.style.transform }],\n\t\t\t{ duration: 400, easing: 'ease-out', fill: 'forwards' }\n\t\t).onfinish = () => {\n\t\t\tthis.state$.next('done')\n\t\t}\n\t}\n\n\t/**\n\t * Fade out bird and all visual elements gracefully before cleanup (when playing becomes false)\n\t */\n\tprivate fadeOutAndCleanup(): void {\n\t\t// If no bird exists yet, just cleanup\n\t\tif (!this.bird) {\n\t\t\tthis.cleanup()\n\t\t\treturn\n\t\t}\n\n\t\t// Cancel animation loop to prevent further updates\n\t\tif (this.rafId) {\n\t\t\tcancelAnimationFrame(this.rafId)\n\t\t\tthis.rafId = 0\n\t\t}\n\n\t\t// Restore opacity before fading (may be 0 from hovering)\n\t\tthis.bird.style.opacity = '1'\n\n\t\t// Very slow, gradual fade - barely noticeable at first, then gently disappears\n\t\tconst birdAnim = this.bird.animate(\n\t\t\t[\n\t\t\t\t{ opacity: 1 },\n\t\t\t\t{ opacity: 0.8, offset: 0.3 },\n\t\t\t\t{ opacity: 0.5, offset: 0.6 },\n\t\t\t\t{ opacity: 0.2, offset: 0.85 },\n\t\t\t\t{ opacity: 0 },\n\t\t\t],\n\t\t\t{ duration: 3000, easing: 'linear', fill: 'forwards' }\n\t\t)\n\n\t\t// Fade out trail canvas even more slowly if exists\n\t\tif (this.trailCanvas) {\n\t\t\tthis.trailCanvas.animate(\n\t\t\t\t[{ opacity: 1 }, { opacity: 0 }],\n\t\t\t\t{ duration: 3500, easing: 'ease-out', fill: 'forwards' }\n\t\t\t)\n\t\t}\n\n\t\t// Fade out shimmer\n\t\tthis.hideShimmer()\n\n\t\t// Cleanup after fade completes\n\t\tbirdAnim.onfinish = () => {\n\t\t\tthis.cleanup()\n\t\t}\n\t}\n\n\t/**\n\t * Show expanding pulse rings at position (like ripple/wave effect)\n\t */\n\tprivate showPulseRings(x: number, y: number): void {\n\t\tconst color = this.currentColor\n\n\t\t// Create 3 staggered pulse rings\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tconst ring = document.createElement('div')\n\t\t\tring.className = 'pointer-events-none'\n\t\t\tring.style.cssText = `\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: ${x}px;\n\t\t\t\ttop: ${y}px;\n\t\t\t\twidth: 40px;\n\t\t\t\theight: 40px;\n\t\t\t\tborder-radius: 9999px;\n\t\t\t\tborder: 2px solid ${hexToRgba(color, 0.5)};\n\t\t\t\ttransform: translate(-50%, -50%) scale(1);\n\t\t\t\tz-index: 9998;\n\t\t\t\twill-change: transform, opacity;\n\t\t\t`\n\t\t\tthis.element?.appendChild(ring)\n\t\t\tthis.pulseRings.push(ring)\n\n\t\t\t// Animate: expand and fade out\n\t\t\tring.animate(\n\t\t\t\t[\n\t\t\t\t\t{ transform: 'translate(-50%, -50%) scale(1)', opacity: 0.6 },\n\t\t\t\t\t{ transform: 'translate(-50%, -50%) scale(4)', opacity: 0 },\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\tduration: 1200,\n\t\t\t\t\tdelay: i * 300,\n\t\t\t\t\teasing: 'ease-out',\n\t\t\t\t\tfill: 'forwards',\n\t\t\t\t}\n\t\t\t).onfinish = () => ring.remove()\n\t\t}\n\n\t\t// Clear refs after animation completes (last ring)\n\t\ttimer(1200 + 600)\n\t\t\t.pipe(takeUntil(this.destroyed$.pipe(filter(v => v))))\n\t\t\t.subscribe(() => {\n\t\t\t\tthis.pulseRings = []\n\t\t\t})\n\t}\n\n\tprivate tickSpiraling(now: number): void {\n\t\tif (!this.context || !this.bird) return\n\n\t\tconst ctx = this.context\n\t\tconst elapsed = now - ctx.phaseStart\n\t\tconst dx = ctx.bx - ctx.cx\n\t\tconst dy = ctx.by - ctx.cy\n\t\tconst d = Math.hypot(dx, dy)\n\n\t\tif (d > 8) {\n\t\t\t// Smoother acceleration as it gets closer (gravitational pull)\n\t\t\tconst gravitationalPull = Math.pow(1 - d / 150, 2) * 180 + 40\n\t\t\tconst speed = Math.min(gravitationalPull, d * 0.15)\n\t\t\tconst angle = Math.atan2(dy, dx)\n\n\t\t\t// Elegant spiral motion - tighter as it gets closer\n\t\t\tconst spiralIntensity = Math.min(1, d / 60) * 0.015\n\t\t\tconst spiralAngle = elapsed * 0.012\n\t\t\tconst spiral = Math.sin(spiralAngle) * d * spiralIntensity\n\n\t\t\tctx.cx += Math.cos(angle) * speed * 0.016 + Math.cos(angle + Math.PI / 2) * spiral\n\t\t\tctx.cy += Math.sin(angle) * speed * 0.016 + Math.sin(angle + Math.PI / 2) * spiral\n\n\t\t\t// Smooth scale reduction with slight rotation\n\t\t\tconst scale = Math.max(0.2, d / 120)\n\t\t\tconst rotation = elapsed * 0.3\n\t\t\tthis.bird.style.transform = `translate(${ctx.cx - 12}px, ${ctx.cy - 12}px) rotate(${rotation}deg) scale(${scale})`\n\n\t\t\t// Add subtle glow intensification as it approaches\n\t\t\tconst glowIntensity = 1 - d / 100\n\t\t\tif (glowIntensity > 0.3) {\n\t\t\t\tthis.bird.style.filter = `brightness(${1 + glowIntensity * 0.5}) drop-shadow(0 0 ${glowIntensity * 8}px ${this.currentColor})`\n\t\t\t}\n\t\t} else {\n\t\t\t// Transition to absorbed\n\t\t\tctx.phaseStart = now\n\t\t\tthis.startHostDistortion()\n\t\t\tthis.state$.next('absorbed')\n\t\t}\n\t}\n\n\t/** Store home element for distortion effect */\n\tprivate homeElement: HTMLElement | null = null\n\n\t/**\n\t * Start gravitational shake/wobble effect on the home element during absorption\n\t */\n\tprivate startHostDistortion(): void {\n\t\tif (!this.context) return\n\n\t\t// Find the home element from destinations\n\t\tconst homeDest = this.context.destinations[this.context.destinations.length - 1]\n\t\tif (!homeDest?.element) return\n\n\t\tthis.homeElement = homeDest.element\n\t\tconst el = this.homeElement\n\t\tconst color = this.currentColor\n\n\t\t// Store original transform\n\t\tconst originalTransform = el.style.transform || ''\n\n\t\t// Violent shake/wobble - gravitational tremor as energy is being absorbed\n\t\t// Rapid oscillations that build in intensity\n\t\tel.animate(\n\t\t\t[\n\t\t\t\t{ transform: `${originalTransform} translate(0, 0) scale(1) rotate(0deg)`, filter: 'brightness(1)' },\n\t\t\t\t{ transform: `${originalTransform} translate(-2px, 1px) scale(0.992) rotate(-0.3deg)`, filter: 'brightness(1.05)', offset: 0.05 },\n\t\t\t\t{ transform: `${originalTransform} translate(3px, -1px) scale(1.005) rotate(0.4deg)`, filter: 'brightness(1.1)', offset: 0.1 },\n\t\t\t\t{ transform: `${originalTransform} translate(-1px, 2px) scale(0.995) rotate(-0.2deg)`, filter: `brightness(1.15) drop-shadow(0 0 5px ${color})`, offset: 0.15 },\n\t\t\t\t{ transform: `${originalTransform} translate(2px, 0px) scale(1.008) rotate(0.5deg)`, filter: 'brightness(1.2)', offset: 0.2 },\n\t\t\t\t{ transform: `${originalTransform} translate(-3px, -2px) scale(0.988) rotate(-0.6deg)`, filter: `brightness(1.25) drop-shadow(0 0 8px ${color})`, offset: 0.25 },\n\t\t\t\t{ transform: `${originalTransform} translate(1px, 3px) scale(1.01) rotate(0.3deg)`, filter: 'brightness(1.3)', offset: 0.3 },\n\t\t\t\t{ transform: `${originalTransform} translate(-2px, -1px) scale(0.985) rotate(-0.4deg)`, filter: `brightness(1.35) drop-shadow(0 0 12px ${color})`, offset: 0.35 },\n\t\t\t\t{ transform: `${originalTransform} translate(4px, 1px) scale(1.015) rotate(0.7deg)`, filter: 'brightness(1.4)', offset: 0.4 },\n\t\t\t\t{ transform: `${originalTransform} translate(-1px, 2px) scale(0.99) rotate(-0.5deg)`, filter: `brightness(1.35) drop-shadow(0 0 15px ${color})`, offset: 0.45 },\n\t\t\t\t{ transform: `${originalTransform} translate(2px, -2px) scale(1.012) rotate(0.4deg)`, filter: 'brightness(1.3)', offset: 0.5 },\n\t\t\t\t{ transform: `${originalTransform} translate(-3px, 1px) scale(0.993) rotate(-0.3deg)`, filter: `brightness(1.25) drop-shadow(0 0 10px ${color})`, offset: 0.55 },\n\t\t\t\t{ transform: `${originalTransform} translate(1px, -1px) scale(1.006) rotate(0.2deg)`, filter: 'brightness(1.2)', offset: 0.6 },\n\t\t\t\t{ transform: `${originalTransform} translate(-1px, 1px) scale(0.997) rotate(-0.15deg)`, filter: 'brightness(1.15)', offset: 0.7 },\n\t\t\t\t{ transform: `${originalTransform} translate(1px, 0px) scale(1.003) rotate(0.1deg)`, filter: 'brightness(1.1)', offset: 0.8 },\n\t\t\t\t{ transform: `${originalTransform} translate(0px, -1px) scale(0.999) rotate(-0.05deg)`, filter: 'brightness(1.05)', offset: 0.9 },\n\t\t\t\t{ transform: `${originalTransform} translate(0, 0) scale(1) rotate(0deg)`, filter: 'brightness(1)' },\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration: 500,\n\t\t\t\teasing: 'linear',\n\t\t\t}\n\t\t)\n\t}\n\n\tprivate tickAbsorbed(now: number): void {\n\t\tif (!this.context || !this.bird) return\n\n\t\tconst ctx = this.context\n\t\tconst elapsed = now - ctx.phaseStart\n\t\tconst duration = 500\n\t\tconst t = Math.min(1, elapsed / duration)\n\n\t\t// Exponential ease-in for dramatic acceleration into the singularity\n\t\tconst e = t * t * t\n\n\t\t// Spaghettification effect - stretch vertically while shrinking horizontally\n\t\tconst scaleX = 0.2 * (1 - e * 0.9)\n\t\tconst scaleY = 0.2 * (1 - e) * (1 + e * 2) // Elongates before disappearing\n\n\t\t// Rapid rotation acceleration\n\t\tconst rotation = t * t * 1080 // Accelerating spin\n\n\t\tthis.bird.style.transform = `translate(${ctx.bx - 12}px, ${ctx.by - 12}px) rotate(${rotation}deg) scale(${scaleX}, ${scaleY})`\n\t\tthis.bird.style.opacity = String(Math.max(0, 1 - e * 1.2))\n\t\tthis.bird.style.filter = `brightness(${1 + e * 3}) blur(${e * 2}px)`\n\n\t\tif (t >= 1) {\n\t\t\tthis.collapseBlackHole()\n\t\t} else {\n\t\t\tthis.rafId = requestAnimationFrame(now => this.tickAbsorbed(now))\n\t\t}\n\t}\n\n\t/** Additional visual elements for enhanced blackhole */\n\tprivate accretionDisks: HTMLElement[] = []\n\tprivate lensingRing: HTMLElement | null = null\n\tprivate eventHorizon: HTMLElement | null = null\n\n\tprivate createBlackHole(x: number, y: number): void {\n\t\tconst color = this.currentColor\n\n\t\t// 1. Outer gravitational lensing ring - cosmic teal/purple glow\n\t\tconst lensing = document.createElement('div')\n\t\tlensing.className = 'pointer-events-none'\n\t\tlensing.style.cssText = `\n\t\t\tposition: absolute;\n\t\t\tleft: ${x}px;\n\t\t\ttop: ${y}px;\n\t\t\twidth: 100px;\n\t\t\theight: 100px;\n\t\t\tborder-radius: 9999px;\n\t\t\tborder: 1px solid ${COSMIC_COLORS.oiiiDim};\n\t\t\tbackground: radial-gradient(circle, transparent 40%, ${COSMIC_COLORS.deepPurple} 70%, transparent 100%);\n\t\t\tbox-shadow:\n\t\t\t\tinset 0 0 25px ${COSMIC_COLORS.oiiiDim},\n\t\t\t\t0 0 40px ${COSMIC_COLORS.deepPurple},\n\t\t\t\t0 0 60px ${hexToRgba(color, 0.15)};\n\t\t\ttransform: translate(-50%, -50%) rotateX(85deg) scale(0);\n\t\t\tz-index: 9994;\n\t\t\twill-change: transform, opacity;\n\t\t\tanimation: hb-lensing 2s ease-in-out infinite;\n\t\t`\n\t\tlensing.animate(\n\t\t\t[\n\t\t\t\t{ transform: 'translate(-50%, -50%) rotateX(85deg) scale(0)' },\n\t\t\t\t{ transform: 'translate(-50%, -50%) rotateX(85deg) scale(1)' },\n\t\t\t],\n\t\t\t{ duration: 600, easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)', fill: 'forwards' }\n\t\t)\n\t\tthis.element?.appendChild(lensing)\n\t\tthis.lensingRing = lensing\n\n\t\t// 2. Layered accretion disks - cosmic nebula colors (H-alpha crimson, OIII teal, stellar pink)\n\t\tconst diskConfigs = [\n\t\t\t{ size: 85, speed: 4, color1: COSMIC_COLORS.oiii, color2: COSMIC_COLORS.deepBlue, rotateX: 68, reverse: true },\n\t\t\t{ size: 68, speed: 2.5, color1: COSMIC_COLORS.hAlpha, color2: COSMIC_COLORS.hAlphaDim, rotateX: 72, reverse: false },\n\t\t\t{ size: 52, speed: 1.8, color1: COSMIC_COLORS.stellar, color2: COSMIC_COLORS.stellarDim, rotateX: 76, reverse: true },\n\t\t]\n\n\t\tdiskConfigs.forEach((config, i) => {\n\t\t\tconst disk = document.createElement('div')\n\t\t\tdisk.className = 'pointer-events-none'\n\t\t\tconst direction = config.reverse ? '-' : ''\n\t\t\tdisk.style.cssText = `\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: ${x}px;\n\t\t\t\ttop: ${y}px;\n\t\t\t\twidth: ${config.size}px;\n\t\t\t\theight: ${config.size}px;\n\t\t\t\tborder-radius: 9999px;\n\t\t\t\tbackground: conic-gradient(\n\t\t\t\t\tfrom ${i * 45}deg,\n\t\t\t\t\ttransparent 0%,\n\t\t\t\t\t${config.color1} 15%,\n\t\t\t\t\t${config.color2} 35%,\n\t\t\t\t\ttransparent 50%,\n\t\t\t\t\t${config.color1} 65%,\n\t\t\t\t\t${config.color2} 85%,\n\t\t\t\t\ttransparent 100%\n\t\t\t\t);\n\t\t\t\ttransform: translate(-50%, -50%) rotateX(${config.rotateX}deg) scale(0);\n\t\t\t\tz-index: ${9995 + i};\n\t\t\t\twill-change: transform;\n\t\t\t\tfilter: blur(${i * 0.3}px);\n\t\t\t\tmix-blend-mode: screen;\n\t\t\t`\n\t\t\t// Entrance animation then continuous rotation\n\t\t\tdisk.animate(\n\t\t\t\t[\n\t\t\t\t\t{ transform: `translate(-50%, -50%) rotateX(${config.rotateX}deg) scale(0) rotate(0deg)` },\n\t\t\t\t\t{ transform: `translate(-50%, -50%) rotateX(${config.rotateX}deg) scale(1) rotate(0deg)` },\n\t\t\t\t],\n\t\t\t\t{ duration: 400 + i * 100, easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)', fill: 'forwards' }\n\t\t\t).onfinish = () => {\n\t\t\t\tdisk.style.transform = `translate(-50%, -50%) rotateX(${config.rotateX}deg) scale(1)`\n\t\t\t\tdisk.animate(\n\t\t\t\t\t[\n\t\t\t\t\t\t{ transform: `translate(-50%, -50%) rotateX(${config.rotateX}deg) scale(1) rotate(0deg)` },\n\t\t\t\t\t\t{ transform: `translate(-50%, -50%) rotateX(${config.rotateX}deg) scale(1) rotate(${direction}360deg)` },\n\t\t\t\t\t],\n\t\t\t\t\t{ duration: config.speed * 1000, easing: 'linear', iterations: Infinity }\n\t\t\t\t)\n\t\t\t}\n\t\t\tthis.element?.appendChild(disk)\n\t\t\tthis.accretionDisks.push(disk)\n\t\t})\n\n\t\t// 3. Event horizon - deep void with cosmic glow corona\n\t\tconst horizon = document.createElement('div')\n\t\thorizon.className = 'pointer-events-none'\n\t\thorizon.style.cssText = `\n\t\t\t--hb-color: ${COSMIC_COLORS.hAlpha};\n\t\t\t--hb-color-dim: ${COSMIC_COLORS.oiiiDim};\n\t\t\tposition: absolute;\n\t\t\tleft: ${x}px;\n\t\t\ttop: ${y}px;\n\t\t\twidth: 36px;\n\t\t\theight: 36px;\n\t\t\tborder-radius: 9999px;\n\t\t\tbackground: radial-gradient(circle,\n\t\t\t\t${COSMIC_COLORS.singularity} 0%,\n\t\t\t\t${COSMIC_COLORS.voidBlack} 40%,\n\t\t\t\t${COSMIC_COLORS.deepPurple} 60%,\n\t\t\t\t${COSMIC_COLORS.hAlphaDim} 75%,\n\t\t\t\ttransparent 100%\n\t\t\t);\n\t\t\tbox-shadow:\n\t\t\t\t0 0 15px 4px ${COSMIC_COLORS.hAlpha},\n\t\t\t\t0 0 30px 8px ${COSMIC_COLORS.oiiiDim},\n\t\t\t\t0 0 50px 15px ${COSMIC_COLORS.deepPurple},\n\t\t\t\tinset 0 0 15px ${COSMIC_COLORS.voidBlack};\n\t\t\ttransform: translate(-50%, -50%) scale(0);\n\t\t\tz-index: 9999;\n\t\t\twill-change: transform, box-shadow;\n\t\t\tanimation: hb-horizon-pulse 1.5s ease-in-out infinite;\n\t\t`\n\t\thorizon.animate(\n\t\t\t[\n\t\t\t\t{ transform: 'translate(-50%, -50%) scale(0)' },\n\t\t\t\t{ transform: 'translate(-50%, -50%) scale(1.15)', offset: 0.6 },\n\t\t\t\t{ transform: 'translate(-50%, -50%) scale(1)' },\n\t\t\t],\n\t\t\t{ duration: 500, easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)', fill: 'forwards' }\n\t\t)\n\t\tthis.element?.appendChild(horizon)\n\t\tthis.eventHorizon = horizon\n\t\tthis.blackHole = horizon // Keep reference for backward compatibility\n\n\t\t// 4. Enhanced orbital particles with cosmic colors\n\t\tthis.addParticles(x, y)\n\t}\n\n\tprivate addParticles(cx: number, cy: number): void {\n\t\t// Cosmic particle colors - alternating between nebula emission colors\n\t\tconst cosmicParticleColors = [\n\t\t\t{ bg: COSMIC_COLORS.hAlpha, glow: COSMIC_COLORS.hAlphaDim },\n\t\t\t{ bg: COSMIC_COLORS.oiii, glow: COSMIC_COLORS.oiiiDim },\n\t\t\t{ bg: COSMIC_COLORS.stellar, glow: COSMIC_COLORS.stellarDim },\n\t\t\t{ bg: 'rgba(255, 255, 255, 0.9)', glow: COSMIC_COLORS.stellarDim },\n\t\t]\n\n\t\t// Create orbital particles that spiral inward elegantly\n\t\tconst particleCount = 10\n\t\tfor (let i = 0; i < particleCount; i++) {\n\t\t\tconst p = document.createElement('div')\n\t\t\tconst startAngle = (i / particleCount) * Math.PI * 2\n\t\t\tconst orbitRadius = 45 + (i % 3) * 18\n\t\t\tconst size = 2 + (i % 3)\n\t\t\tconst duration = 1400 + (i % 3) * 400\n\t\t\tconst delay = i * 70\n\t\t\tconst colorSet = cosmicParticleColors[i % cosmicParticleColors.length]\n\n\t\t\tp.className = 'pointer-events-none'\n\t\t\tp.style.cssText = `\n\t\t\t\t--orbit-radius: ${orbitRadius}px;\n\t\t\t\tposition: absolute;\n\t\t\t\twidth: ${size}px;\n\t\t\t\theight: ${size}px;\n\t\t\t\tborder-radius: 9999px;\n\t\t\t\tbackground: ${colorSet.bg};\n\t\t\t\tbox-shadow: 0 0 ${size * 4}px ${colorSet.bg}, 0 0 ${size * 8}px ${colorSet.glow};\n\t\t\t\tleft: ${cx}px;\n\t\t\t\ttop: ${cy}px;\n\t\t\t\tz-index: 9997;\n\t\t\t\twill-change: transform, opacity;\n\t\t\t\ttransform-origin: center center;\n\t\t\t\ttransform: rotate(${startAngle}rad) translateX(${orbitRadius}px);\n\t\t\t\topacity: 0;\n\t\t\t`\n\n\t\t\tthis.element?.appendChild(p)\n\t\t\tthis.particles.push(p)\n\n\t\t\t// Smooth orbital spiral animation\n\t\t\tp.animate(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttransform: `rotate(${startAngle}rad) translateX(${orbitRadius}px) scale(1)`,\n\t\t\t\t\t\topacity: 0,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttransform: `rotate(${startAngle}rad) translateX(${orbitRadius}px) scale(1)`,\n\t\t\t\t\t\topacity: 0.9,\n\t\t\t\t\t\toffset: 0.1,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttransform: `rotate(${startAngle + Math.PI}rad) translateX(${orbitRadius * 0.5}px) scale(0.8)`,\n\t\t\t\t\t\topacity: 0.7,\n\t\t\t\t\t\toffset: 0.5,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttransform: `rotate(${startAngle + Math.PI * 2}rad) translateX(0px) scale(0)`,\n\t\t\t\t\t\topacity: 0,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\tduration,\n\t\t\t\t\tdelay,\n\t\t\t\t\teasing: 'cubic-bezier(0.4, 0, 0.2, 1)',\n\t\t\t\t\tfill: 'forwards',\n\t\t\t\t}\n\t\t\t).onfinish = () => p.remove()\n\t\t}\n\n\t\t// Cosmic light streaks being pulled in - alternating H-alpha and OIII\n\t\tconst streakColors = [COSMIC_COLORS.hAlpha, COSMIC_COLORS.oiii, COSMIC_COLORS.stellar, COSMIC_COLORS.oiii]\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst streak = document.createElement('div')\n\t\t\tconst angle = (i / 5) * Math.PI * 2 + Math.PI / 10\n\t\t\tconst startDist = 65 + Math.random() * 25\n\t\t\tconst streakColor = streakColors[i % streakColors.length]\n\n\t\t\tstreak.className = 'pointer-events-none'\n\t\t\tstreak.style.cssText = `\n\t\t\t\tposition: absolute;\n\t\t\t\twidth: 2px;\n\t\t\t\theight: 14px;\n\t\t\t\tborder-radius: 1px;\n\t\t\t\tbackground: linear-gradient(to bottom, transparent, ${streakColor}, rgba(255,255,255,0.3));\n\t\t\t\tleft: ${cx + Math.cos(angle) * startDist}px;\n\t\t\t\ttop: ${cy + Math.sin(angle) * startDist}px;\n\t\t\t\tz-index: 9996;\n\t\t\t\twill-change: transform, opacity;\n\t\t\t\ttransform: rotate(${angle + Math.PI / 2}rad) scale(0);\n\t\t\t\topacity: 0;\n\t\t\t\tmix-blend-mode: screen;\n\t\t\t`\n\n\t\t\tthis.element?.appendChild(streak)\n\t\t\tthis.particles.push(streak)\n\n\t\t\tstreak.animate(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttransform: `rotate(${angle + Math.PI / 2}rad) scale(0)`,\n\t\t\t\t\t\topacity: 0,\n\t\t\t\t\t\tleft: `${cx + Math.cos(angle) * startDist}px`,\n\t\t\t\t\t\ttop: `${cy + Math.sin(angle) * startDist}px`,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttransform: `rotate(${angle + Math.PI / 2}rad) scale(1.5)`,\n\t\t\t\t\t\topacity: 0.85,\n\t\t\t\t\t\tleft: `${cx + Math.cos(angle) * startDist * 0.5}px`,\n\t\t\t\t\t\ttop: `${cy + Math.sin(angle) * startDist * 0.5}px`,\n\t\t\t\t\t\toffset: 0.3,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttransform: `rotate(${angle + Math.PI / 2}rad) scale(0.5)`,\n\t\t\t\t\t\topacity: 0,\n\t\t\t\t\t\tleft: `${cx}px`,\n\t\t\t\t\t\ttop: `${cy}px`,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\tduration: 900,\n\t\t\t\t\tdelay: 150 + i * 120,\n\t\t\t\t\teasing: 'cubic-bezier(0.55, 0, 1, 0.45)',\n\t\t\t\t\tfill: 'forwards',\n\t\t\t\t}\n\t\t\t).onfinish = () => streak.remove()\n\t\t}\n\t}\n\n\tprivate collapseBlackHole(): void {\n\t\tthis.bird?.remove()\n\t\tthis.particles.forEach(p => p.remove())\n\n\t\tif (!this.context) {\n\t\t\tthis.state$.next('done')\n\t\t\treturn\n\t\t}\n\n\t\tconst { bx, by } = this.context\n\t\tconst color = this.currentColor\n\n\t\t// 1. Collapse accretion disks inward rapidly\n\t\tthis.accretionDisks.forEach((disk, i) => {\n\t\t\tdisk.animate(\n\t\t\t\t[\n\t\t\t\t\t{ transform: disk.style.transform, opacity: 1 },\n\t\t\t\t\t{ transform: 'translate(-50%, -50%) rotateX(90deg) scale(0)', opacity: 0 },\n\t\t\t\t],\n\t\t\t\t{ duration: 200 + i * 50, easing: 'ease-in', fill: 'forwards' }\n\t\t\t).onfinish = () => disk.remove()\n\t\t})\n\t\tthis.accretionDisks = []\n\n\t\t// 2. Lensing ring collapses\n\t\tif (this.lensingRing) {\n\t\t\tthis.lensingRing.animate(\n\t\t\t\t[\n\t\t\t\t\t{ transform: 'translate(-50%, -50%) rotateX(85deg) scale(1)', opacity: 0.6 },\n\t\t\t\t\t{ transform: 'translate(-50%, -50%) rotateX(85deg) scale(0)', opacity: 0 },\n\t\t\t\t],\n\t\t\t\t{ duration: 250, easing: 'ease-in', fill: 'forwards' }\n\t\t\t).onfinish = () => this.lensingRing?.remove()\n\t\t}\n\n\t\t// 3. Event horizon/blackhole - brief bright flash then collapse\n\t\tconst bh = this.blackHole\n\t\tif (bh) {\n\t\t\tbh.animate(\n\t\t\t\t[\n\t\t\t\t\t{ transform: 'translate(-50%, -50%) scale(1)', filter: 'brightness(1)' },\n\t\t\t\t\t{ transform: 'translate(-50%, -50%) scale(1.3)', filter: 'brightness(3)', offset: 0.2 },\n\t\t\t\t\t{ transform: 'translate(-50%, -50%) scale(0)', filter: 'brightness(5)', opacity: 0 },\n\t\t\t\t],\n\t\t\t\t{ duration: 350, easing: 'cubic-bezier(0.55, 0, 1, 0.45)', fill: 'forwards' }\n\t\t\t).onfinish = () => bh.remove()\n\t\t}\n\n\t\t// 4. COSMIC BIG BANG - Multiple expanding shockwave rings with nebula colors\n\t\tconst cosmicRingColors = [\n\t\t\t{ border: COSMIC_COLORS.stellar, glow: COSMIC_COLORS.stellarDim },\n\t\t\t{ border: COSMIC_COLORS.hAlpha, glow: COSMIC_COLORS.hAlphaDim },\n\t\t\t{ border: COSMIC_COLORS.oiii, glow: COSMIC_COLORS.oiiiDim },\n\t\t\t{ border: COSMIC_COLORS.deepPurple, glow: COSMIC_COLORS.deepBlue },\n\t\t]\n\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tconst ring = document.createElement('div')\n\t\t\tconst ringColor = cosmicRingColors[i]\n\t\t\tring.className = 'pointer-events-none'\n\t\t\tring.style.cssText = `\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: ${bx}px;\n\t\t\t\ttop: ${by}px;\n\t\t\t\twidth: 20px;\n\t\t\t\theight: 20px;\n\t\t\t\tborder-radius: 9999px;\n\t\t\t\tborder: ${2.5 - i * 0.4}px solid ${ringColor.border};\n\t\t\t\tbox-shadow:\n\t\t\t\t\t0 0 ${18 - i * 3}px ${ringColor.border},\n\t\t\t\t\t0 0 ${30 - i * 5}px ${ringColor.glow},\n\t\t\t\t\tinset 0 0 ${12 - i * 2}px ${ringColor.glow};\n\t\t\t\ttransform: translate(-50%, -50%) scale(0.5);\n\t\t\t\tz-index: ${9990 - i};\n\t\t\t\twill-change: transform, opacity;\n\t\t\t\tmix-blend-mode: screen;\n\t\t\t`\n\t\t\tthis.element?.appendChild(ring)\n\n\t\t\tring.animate(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttransform: 'translate(-50%, -50%) scale(0.5)',\n\t\t\t\t\t\topacity: 0.95,\n\t\t\t\t\t\tborderWidth: `${2.5 - i * 0.4}px`,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttransform: 'translate(-50%, -50%) scale(2.5)',\n\t\t\t\t\t\topacity: 0.6,\n\t\t\t\t\t\tborderWidth: `${1.8 - i * 0.3}px`,\n\t\t\t\t\t\toffset: 0.35,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttransform: 'translate(-50%, -50%) scale(6)',\n\t\t\t\t\t\topacity: 0,\n\t\t\t\t\t\tborderWidth: '0.5px',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\tduration: 800 + i * 120,\n\t\t\t\t\tdelay: i * 60,\n\t\t\t\t\teasing: 'cubic-bezier(0, 0.55, 0.45, 1)',\n\t\t\t\t\tfill: 'forwards',\n\t\t\t\t}\n\t\t\t).onfinish = () => ring.remove()\n\t\t}\n\n\t\t// 5. Central cosmic flash burst - white core with H-alpha corona\n\t\tconst flash = document.createElement('div')\n\t\tflash.className = 'pointer-events-none'\n\t\tflash.style.cssText = `\n\t\t\tposition: absolute;\n\t\t\tleft: ${bx}px;\n\t\t\ttop: ${by}px;\n\t\t\twidth: 10px;\n\t\t\theight: 10px;\n\t\t\tborder-radius: 9999px;\n\t\t\tbackground: radial-gradient(circle,\n\t\t\t\twhite 0%,\n\t\t\t\t${COSMIC_COLORS.stellar} 20%,\n\t\t\t\t${COSMIC_COLORS.hAlpha} 50%,\n\t\t\t\t${COSMIC_COLORS.oiiiDim} 70%,\n\t\t\t\ttransparent 100%\n\t\t\t);\n\t\t\ttransform: translate(-50%, -50%) scale(0);\n\t\t\tz-index: 10000;\n\t\t\twill-change: transform, opacity;\n\t\t`\n\t\tthis.element?.appendChild(flash)\n\n\t\tflash.animate(\n\t\t\t[\n\t\t\t\t{ transform: 'translate(-50%, -50%) scale(0)', opacity: 1 },\n\t\t\t\t{ transform: 'translate(-50%, -50%) scale(5)', opacity: 1, offset: 0.12 },\n\t\t\t\t{ transform: 'translate(-50%, -50%) scale(8)', opacity: 0 },\n\t\t\t],\n\t\t\t{ duration: 450, easing: 'ease-out', fill: 'forwards' }\n\t\t).onfinish = () => flash.remove()\n\n\t\t// 6. Cosmic afterglow nebula - layered emission colors\n\t\tconst afterglow = document.createElement('div')\n\t\tafterglow.className = 'pointer-events-none'\n\t\tafterglow.style.cssText = `\n\t\t\tposition: absolute;\n\t\t\tleft: ${bx}px;\n\t\t\ttop: ${by}px;\n\t\t\twidth: 50px;\n\t\t\theight: 50px;\n\t\t\tborder-radius: 9999px;\n\t\t\tbackground: radial-gradient(circle,\n\t\t\t\t${COSMIC_COLORS.stellarDim} 0%,\n\t\t\t\t${COSMIC_COLORS.hAlphaDim} 30%,\n\t\t\t\t${COSMIC_COLORS.oiiiDim} 50%,\n\t\t\t\t${COSMIC_COLORS.deepPurple} 70%,\n\t\t\t\ttransparent 100%\n\t\t\t);\n\t\t\ttransform: translate(-50%, -50%);\n\t\t\tz-index: 9989;\n\t\t\twill-change: opacity;\n\t\t\tmix-blend-mode: screen;\n\t\t`\n\t\tthis.element?.appendChild(afterglow)\n\n\t\tafterglow.animate(\n\t\t\t[\n\t\t\t\t{ opacity: 1, transform: 'translate(-50%, -50%) scale(1)' },\n\t\t\t\t{ opacity: 0.6, transform: 'translate(-50%, -50%) scale(1.8)', offset: 0.4 },\n\t\t\t\t{ opacity: 0, transform: 'translate(-50%, -50%) scale(2.5)' },\n\t\t\t],\n\t\t\t{ duration: 900, easing: 'ease-out', fill: 'forwards' }\n\t\t).onfinish = () => {\n\t\t\tafterglow.remove()\n\t\t\tthis.state$.next('done')\n\t\t}\n\n\t\t// 7. BIG BANG SHOCKWAVE on host element - violent impact then settle\n\t\tif (this.homeElement) {\n\t\t\tconst el = this.homeElement\n\t\t\tconst originalTransform = el.style.transform || ''\n\n\t\t\t// Phase 1: Violent shockwave impact with shake\n\t\t\tel.animate(\n\t\t\t\t[\n\t\t\t\t\t// Initial impact - sudden expansion with bright flash\n\t\t\t\t\t{ transform: `${originalTransform} translate(0, 0) scale(1) rotate(0deg)`, filter: 'brightness(1)' },\n\t\t\t\t\t{ transform: `${originalTransform} translate(0, 0) scale(1.04) rotate(0deg)`, filter: `brightness(2) drop-shadow(0 0 30px ${color})`, offset: 0.05 },\n\t\t\t\t\t// Violent shake sequence\n\t\t\t\t\t{ transform: `${originalTransform} translate(-4px, 2px) scale(1.025) rotate(-0.8deg)`, filter: `brightness(1.6) drop-shadow(0 0 25px ${color})`, offset: 0.1 },\n\t\t\t\t\t{ transform: `${originalTransform} translate(5px, -3px) scale(0.98) rotate(1deg)`, filter: `brightness(1.4) drop-shadow(0 0 20px ${color})`, offset: 0.15 },\n\t\t\t\t\t{ transform: `${originalTransform} translate(-3px, -2px) scale(1.02) rotate(-0.6deg)`, filter: `brightness(1.3) drop-shadow(0 0 18px ${color})`, offset: 0.2 },\n\t\t\t\t\t{ transform: `${originalTransform} translate(4px, 3px) scale(0.985) rotate(0.8deg)`, filter: `brightness(1.25) drop-shadow(0 0 15px ${color})`, offset: 0.25 },\n\t\t\t\t\t{ transform: `${originalTransform} translate(-2px, 1px) scale(1.015) rotate(-0.5deg)`, filter: `brightness(1.2) drop-shadow(0 0 12px ${color})`, offset: 0.3 },\n\t\t\t\t\t{ transform: `${originalTransform} translate(3px, -2px) scale(0.99) rotate(0.6deg)`, filter: `brightness(1.18) drop-shadow(0 0 10px ${color})`, offset: 0.35 },\n\t\t\t\t\t{ transform: `${originalTransform} translate(-2px, 2px) scale(1.01) rotate(-0.4deg)`, filter: `brightness(1.15) drop-shadow(0 0 8px ${color})`, offset: 0.4 },\n\t\t\t\t\t{ transform: `${originalTransform} translate(2px, -1px) scale(0.995) rotate(0.4deg)`, filter: 'brightness(1.12)', offset: 0.45 },\n\t\t\t\t\t{ transform: `${originalTransform} translate(-1px, 1px) scale(1.008) rotate(-0.3deg)`, filter: 'brightness(1.1)', offset: 0.5 },\n\t\t\t\t\t{ transform: `${originalTransform} translate(1px, -1px) scale(0.997) rotate(0.25deg)`, filter: 'brightness(1.08)', offset: 0.55 },\n\t\t\t\t\t{ transform: `${originalTransform} translate(-1px, 0px) scale(1.005) rotate(-0.2deg)`, filter: 'brightness(1.06)', offset: 0.6 },\n\t\t\t\t\t{ transform: `${originalTransform} translate(1px, 1px) scale(0.998) rotate(0.15deg)`, filter: 'brightness(1.05)', offset: 0.65 },\n\t\t\t\t\t{ transform: `${originalTransform} translate(0px, -1px) scale(1.003) rotate(-0.1deg)`, filter: 'brightness(1.04)', offset: 0.7 },\n\t\t\t\t\t{ transform: `${originalTransform} translate(-1px, 0px) scale(0.999) rotate(0.08deg)`, filter: 'brightness(1.03)', offset: 0.75 },\n\t\t\t\t\t{ transform: `${originalTransform} translate(0px, 1px) scale(1.002) rotate(-0.05deg)`, filter: 'brightness(1.02)', offset: 0.8 },\n\t\t\t\t\t{ transform: `${originalTransform} translate(0px, 0px) scale(1.001) rotate(0.03deg)`, filter: 'brightness(1.01)', offset: 0.9 },\n\t\t\t\t\t{ transform: `${originalTransform} translate(0, 0) scale(1) rotate(0deg)`, filter: 'brightness(1)' },\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\tduration: 800,\n\t\t\t\t\teasing: 'linear',\n\t\t\t\t}\n\t\t\t)\n\t\t}\n\t}\n\n\t/**\n\t * Create the canvas for real-time trail rendering\n\t */\n\tprivate ensureTrailCanvas(): void {\n\t\tif (this.trailCanvas || !this.element) return\n\n\t\tconst hostW = this.element.scrollWidth\n\t\tconst hostH = this.element.scrollHeight\n\t\tconst canvas = document.createElement('canvas')\n\t\tcanvas.width = hostW * window.devicePixelRatio\n\t\tcanvas.height = hostH * window.devicePixelRatio\n\t\tcanvas.style.cssText = `\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\twidth: ${hostW}px;\n\t\t\theight: ${hostH}px;\n\t\t\tpointer-events: none;\n\t\t\tz-index: 9990;\n\t\t`\n\t\tthis.element.appendChild(canvas)\n\t\tthis.trailCanvas = canvas\n\t\tthis.trailCtx = canvas.getContext('2d')\n\t\tif (this.trailCtx) {\n\t\t\tthis.trailCtx.scale(window.devicePixelRatio, window.devicePixelRatio)\n\t\t}\n\t}\n\n\t/**\n\t * Draw trail segment from last position to current position\n\t */\n\tprivate drawTrail(x: number, y: number): void {\n\t\tif (!this.options.showConnections) return\n\t\tthis.ensureTrailCanvas()\n\t\tif (!this.trailCtx || !this.lastTrailPos) {\n\t\t\tthis.lastTrailPos = { x, y }\n\t\t\treturn\n\t\t}\n\n\t\tconst ctx = this.trailCtx\n\t\tconst color = this.currentColor\n\n\t\t// Draw line segment from last position to current\n\t\tctx.beginPath()\n\t\tctx.moveTo(this.lastTrailPos.x, this.lastTrailPos.y)\n\t\tctx.lineTo(x, y)\n\t\tctx.strokeStyle = color\n\t\tctx.lineWidth = 3\n\t\tctx.lineCap = 'round'\n\t\tctx.globalAlpha = 0.6\n\t\tctx.shadowColor = color\n\t\tctx.shadowBlur = 8\n\t\tctx.stroke()\n\t\tctx.globalAlpha = 1\n\t\tctx.shadowBlur = 0\n\n\t\tthis.lastTrailPos = { x, y }\n\t}\n\n\t/**\n\t * Reset trail position (called when starting new flight segment)\n\t */\n\tprivate resetTrail(): void {\n\t\tthis.lastTrailPos = null\n\t}\n\n\t/**\n\t * Fade out the entire trail canvas\n\t */\n\tprivate fadeTrail(): void {\n\t\tif (!this.trailCtx || !this.element) return\n\t\tconst hostW = this.element.scrollWidth\n\t\tconst hostH = this.element.scrollHeight\n\t\t// Gradually fade existing content\n\t\tthis.trailCtx.globalCompositeOperation = 'destination-out'\n\t\tthis.trailCtx.fillStyle = 'rgba(0, 0, 0, 0.02)'\n\t\tthis.trailCtx.fillRect(0, 0, hostW, hostH)\n\t\tthis.trailCtx.globalCompositeOperation = 'source-over'\n\t}\n\n\tprivate cleanup(): void {\n\t\tthis.destroyed$.next(true)\n\n\t\tif (this.rafId) {\n\t\t\tcancelAnimationFrame(this.rafId)\n\t\t\tthis.rafId = 0\n\t\t}\n\n\t\t// Cleanup shimmer\n\t\tthis.shimmerAnimation?.cancel()\n\t\tthis.shimmerOverlay?.remove()\n\t\tthis.shimmerAnimation = null\n\t\tthis.shimmerOverlay = null\n\n\t\t// Cleanup pulse rings\n\t\tthis.pulseRings.forEach(r => r.remove())\n\t\tthis.pulseRings = []\n\n\t\t// Cleanup trail canvas\n\t\tthis.trailCanvas?.remove()\n\t\tthis.trailCanvas = null\n\t\tthis.trailCtx = null\n\t\tthis.lastTrailPos = null\n\n\t\t// Cleanup enhanced blackhole elements\n\t\tthis.accretionDisks.forEach(d => d.remove())\n\t\tthis.accretionDisks = []\n\t\tthis.lensingRing?.remove()\n\t\tthis.lensingRing = null\n\t\tthis.eventHorizon?.remove()\n\t\tthis.eventHorizon = null\n\t\tthis.homeElement = null\n\n\t\tthis.bird?.remove()\n\t\tthis.blackHole?.remove()\n\t\tthis.particles.forEach(p => p.remove())\n\n\t\tthis.bird = null\n\t\tthis.blackHole = null\n\t\tthis.particles = []\n\t\tthis.context = null\n\t}\n\n\toverride disconnected(): void {\n\t\tthis.cleanup()\n\t}\n}\n\nexport const hummingbird = directive(HummingbirdDirective)\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 * Missed Punch directive — shattering glass effect for incomplete attendance.\n *\n * Renders an animated shattering/fragmenting overlay when an employee has only\n * one punch on a past date, indicating they forgot to punch out.\n *\n * Visual: glass shards/fragments flying outward with a crack pattern.\n */\n\nimport type { ElementPart } from 'lit'\nimport { noChange } from 'lit'\nimport { AsyncDirective, directive } from 'lit/async-directive.js'\n\nexport interface MissedPunchOptions {\n\tactive: boolean\n\tcolor?: string\n\twidth?: number\n}\n\ninterface Shard {\n\telement: SVGPolygonElement\n\tx: number\n\ty: number\n\tvx: number\n\tvy: number\n\trotation: number\n\trotationSpeed: number\n\tscale: number\n\topacity: number\n}\n\ninterface MissedPunchState {\n\tactive: boolean\n\tcolor: string\n\twidth: number\n\telement: HTMLElement\n\toverlayElement?: HTMLDivElement\n\tsvg?: SVGSVGElement\n\tshards: Shard[]\n\tcracks: SVGPathElement[]\n\tanimationId?: number\n\tisVisible: boolean\n\tobserver?: IntersectionObserver\n\tstartTime: number\n}\n\nconst SHARD_COUNT = 8\n\nclass MissedPunchDirective extends AsyncDirective {\n\tprivate state: MissedPunchState | null = null\n\n\trender(_options: MissedPunchOptions) {\n\t\treturn noChange\n\t}\n\n\toverride update(part: ElementPart, [options]: [MissedPunchOptions]) {\n\t\tconst element = part.element as HTMLElement\n\t\tconst { active, color = 'var(--md-sys-color-error, #ef4444)', width = 150 } = options\n\n\t\tif (!active && this.state) {\n\t\t\tthis.cleanup()\n\t\t\treturn noChange\n\t\t}\n\n\t\tif (!active) {\n\t\t\treturn noChange\n\t\t}\n\n\t\tif (this.state && (this.state.color !== color || this.state.width !== width)) {\n\t\t\tthis.cleanup()\n\t\t}\n\n\t\tif (!this.state) {\n\t\t\tthis.state = {\n\t\t\t\tactive: true,\n\t\t\t\tcolor,\n\t\t\t\twidth,\n\t\t\t\telement,\n\t\t\t\tshards: [],\n\t\t\t\tcracks: [],\n\t\t\t\tisVisible: true,\n\t\t\t\tstartTime: performance.now(),\n\t\t\t}\n\n\t\t\tconst computedStyle = getComputedStyle(element)\n\t\t\tif (computedStyle.position === 'static') {\n\t\t\t\telement.style.position = 'relative'\n\t\t\t}\n\n\t\t\tthis.createOverlay()\n\t\t\tthis.setupVisibilityObserver()\n\t\t\tthis.startAnimation()\n\t\t}\n\n\t\treturn noChange\n\t}\n\n\tprivate createOverlay() {\n\t\tif (!this.state) return\n\n\t\tconst { element, color, width } = this.state\n\n\t\tconst overlay = document.createElement('div')\n\t\toverlay.className = 'missed-punch-overlay'\n\t\tObject.assign(overlay.style, {\n\t\t\tposition: 'absolute',\n\t\t\ttop: '50%',\n\t\t\tleft: '0',\n\t\t\twidth: `${width}px`,\n\t\t\theight: '40px',\n\t\t\ttransform: 'translateY(-50%)',\n\t\t\tpointerEvents: 'none',\n\t\t\toverflow: 'visible',\n\t\t\tzIndex: '4',\n\t\t})\n\n\t\tconst svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n\t\tsvg.setAttribute('width', '100%')\n\t\tsvg.setAttribute('height', '100%')\n\t\tsvg.setAttribute('viewBox', `0 0 ${width} 40`)\n\t\tsvg.setAttribute('preserveAspectRatio', 'xMinYMid meet')\n\t\tObject.assign(svg.style, {\n\t\t\tposition: 'absolute',\n\t\t\ttop: '0',\n\t\t\tleft: '0',\n\t\t\twidth: '100%',\n\t\t\theight: '100%',\n\t\t\toverflow: 'visible',\n\t\t})\n\n\t\t// Crack lines emanating from origin\n\t\tconst cracks: SVGPathElement[] = []\n\t\tconst crackAngles = [-15, 0, 15, -30, 30, -8, 8]\n\n\t\tfor (const angle of crackAngles) {\n\t\t\tconst crack = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n\t\t\tconst rad = (angle * Math.PI) / 180\n\t\t\tconst length = 30 + Math.random() * 40\n\n\t\t\tlet d = 'M 0,20'\n\t\t\tlet x = 0\n\t\t\tlet y = 20\n\t\t\tconst segments = 4 + Math.floor(Math.random() * 3)\n\n\t\t\tfor (let i = 0; i < segments; i++) {\n\t\t\t\tconst segLen = length / segments\n\t\t\t\tx += Math.cos(rad) * segLen + (Math.random() - 0.5) * 4\n\t\t\t\ty += Math.sin(rad) * segLen + (Math.random() - 0.5) * 3\n\t\t\t\td += ` L ${x.toFixed(1)},${y.toFixed(1)}`\n\t\t\t}\n\n\t\t\tcrack.setAttribute('d', d)\n\t\t\tcrack.setAttribute('stroke', color)\n\t\t\tcrack.setAttribute('stroke-width', '1.5')\n\t\t\tcrack.setAttribute('fill', 'none')\n\t\t\tcrack.setAttribute('opacity', '0')\n\t\t\tcrack.style.willChange = 'opacity, stroke-dashoffset'\n\n\t\t\tconst pathLength = length * 1.2\n\t\t\tcrack.setAttribute('stroke-dasharray', pathLength.toString())\n\t\t\tcrack.setAttribute('stroke-dashoffset', pathLength.toString())\n\n\t\t\tcracks.push(crack)\n\t\t\tsvg.appendChild(crack)\n\t\t}\n\n\t\t// Glass shards with gradient for light reflection\n\t\tconst shards: Shard[] = []\n\t\tconst defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n\n\t\tfor (let i = 0; i < SHARD_COUNT; i++) {\n\t\t\tconst gradientId = `shard-gradient-${i}`\n\t\t\tconst gradient = document.createElementNS('http://www.w3.org/2000/svg', 'linearGradient')\n\t\t\tgradient.setAttribute('id', gradientId)\n\t\t\tgradient.setAttribute('x1', '0%')\n\t\t\tgradient.setAttribute('y1', '0%')\n\t\t\tgradient.setAttribute('x2', '100%')\n\t\t\tgradient.setAttribute('y2', '100%')\n\n\t\t\tconst stop1 = document.createElementNS('http://www.w3.org/2000/svg', 'stop')\n\t\t\tstop1.setAttribute('offset', '0%')\n\t\t\tstop1.setAttribute('stop-color', 'white')\n\t\t\tstop1.setAttribute('stop-opacity', '0.9')\n\n\t\t\tconst stop2 = document.createElementNS('http://www.w3.org/2000/svg', 'stop')\n\t\t\tstop2.setAttribute('offset', '40%')\n\t\t\tstop2.setAttribute('stop-color', color)\n\t\t\tstop2.setAttribute('stop-opacity', '0.8')\n\n\t\t\tconst stop3 = document.createElementNS('http://www.w3.org/2000/svg', 'stop')\n\t\t\tstop3.setAttribute('offset', '100%')\n\t\t\tstop3.setAttribute('stop-color', color)\n\t\t\tstop3.setAttribute('stop-opacity', '0.4')\n\n\t\t\tgradient.appendChild(stop1)\n\t\t\tgradient.appendChild(stop2)\n\t\t\tgradient.appendChild(stop3)\n\t\t\tdefs.appendChild(gradient)\n\n\t\t\tconst shard = document.createElementNS('http://www.w3.org/2000/svg', 'polygon')\n\n\t\t\tconst size = 5 + Math.random() * 7\n\t\t\tconst points = this.generateShardPoints(size)\n\t\t\tshard.setAttribute('points', points)\n\t\t\tshard.setAttribute('fill', `url(#${gradientId})`)\n\t\t\tshard.setAttribute('stroke', 'white')\n\t\t\tshard.setAttribute('stroke-width', '0.5')\n\t\t\tshard.setAttribute('stroke-opacity', '0.6')\n\t\t\tshard.setAttribute('opacity', '0')\n\t\t\tshard.style.willChange = 'transform, opacity'\n\t\t\tshard.style.filter = 'drop-shadow(0 0 2px rgba(255,255,255,0.5))'\n\n\t\t\tconst angle = (Math.random() - 0.3) * Math.PI * 0.6 // Mostly rightward\n\t\t\tconst speed = 1.0 + Math.random() * 1.5\n\n\t\t\tshards.push({\n\t\t\t\telement: shard,\n\t\t\t\tx: 0,\n\t\t\t\ty: 20,\n\t\t\t\tvx: Math.cos(angle) * speed,\n\t\t\t\tvy: Math.sin(angle) * speed,\n\t\t\t\trotation: 0,\n\t\t\t\trotationSpeed: (Math.random() - 0.5) * 10,\n\t\t\t\tscale: 0.6 + Math.random() * 0.6,\n\t\t\t\topacity: 0,\n\t\t\t})\n\n\t\t\tsvg.appendChild(shard)\n\t\t}\n\n\t\tsvg.insertBefore(defs, svg.firstChild)\n\n\t\t// Sparkle/glint particles\n\t\tfor (let i = 0; i < 6; i++) {\n\t\t\tconst sparkle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n\t\t\tsparkle.setAttribute('r', '1.5')\n\t\t\tsparkle.setAttribute('fill', 'white')\n\t\t\tsparkle.setAttribute('opacity', '0')\n\t\t\tsparkle.setAttribute('data-sparkle', i.toString())\n\t\t\tsparkle.style.willChange = 'transform, opacity'\n\t\t\tsvg.appendChild(sparkle)\n\t\t}\n\n\t\t// \"!\" warning symbol\n\t\tconst warning = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n\t\twarning.setAttribute('x', (width - 15).toString())\n\t\twarning.setAttribute('y', '25')\n\t\twarning.setAttribute('fill', color)\n\t\twarning.setAttribute('font-size', '16')\n\t\twarning.setAttribute('font-weight', 'bold')\n\t\twarning.setAttribute('opacity', '0.6')\n\t\twarning.textContent = '!'\n\t\twarning.style.animation = 'missed-pulse 1.5s ease-in-out infinite'\n\t\tsvg.appendChild(warning)\n\n\t\t// Pulsing keyframe (shared, lazy-injected once per document)\n\t\tif (!document.getElementById('missed-punch-styles')) {\n\t\t\tconst style = document.createElement('style')\n\t\t\tstyle.id = 'missed-punch-styles'\n\t\t\tstyle.textContent = `\n\t\t\t\t@keyframes missed-pulse {\n\t\t\t\t\t0%, 100% { opacity: 0.4; transform: scale(1); }\n\t\t\t\t\t50% { opacity: 0.8; transform: scale(1.1); }\n\t\t\t\t}\n\t\t\t`\n\t\t\tdocument.head.appendChild(style)\n\t\t}\n\n\t\toverlay.appendChild(svg)\n\t\telement.appendChild(overlay)\n\n\t\tthis.state.overlayElement = overlay\n\t\tthis.state.svg = svg\n\t\tthis.state.shards = shards\n\t\tthis.state.cracks = cracks\n\t}\n\n\tprivate generateShardPoints(size: number): string {\n\t\tconst numPoints = 3 + Math.floor(Math.random() * 2) // 3-4 points\n\t\tconst points: string[] = []\n\n\t\tfor (let i = 0; i < numPoints; i++) {\n\t\t\tconst angle = (i / numPoints) * Math.PI * 2 + Math.random() * 0.5\n\t\t\tconst r = size * (0.5 + Math.random() * 0.5)\n\t\t\tconst x = Math.cos(angle) * r\n\t\t\tconst y = Math.sin(angle) * r\n\t\t\tpoints.push(`${x.toFixed(1)},${y.toFixed(1)}`)\n\t\t}\n\n\t\treturn points.join(' ')\n\t}\n\n\tprivate setupVisibilityObserver() {\n\t\tif (!this.state || typeof IntersectionObserver === 'undefined') return\n\n\t\tthis.state.observer = new IntersectionObserver(\n\t\t\tentries => {\n\t\t\t\tif (!this.state) return\n\t\t\t\tconst isVisible = entries[0].isIntersecting\n\n\t\t\t\tif (isVisible && !this.state.isVisible) {\n\t\t\t\t\tthis.state.isVisible = true\n\t\t\t\t\tthis.startAnimation()\n\t\t\t\t} else if (!isVisible && this.state.isVisible) {\n\t\t\t\t\tthis.state.isVisible = false\n\t\t\t\t\tif (this.state.animationId) {\n\t\t\t\t\t\tcancelAnimationFrame(this.state.animationId)\n\t\t\t\t\t\tthis.state.animationId = undefined\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\tthis.state.observer.observe(this.state.element)\n\t}\n\n\tprivate startAnimation() {\n\t\tif (!this.state || !this.state.isVisible) return\n\n\t\tconst { cracks } = this.state\n\t\tfor (let i = 0; i < cracks.length; i++) {\n\t\t\tconst crack = cracks[i]\n\t\t\tcrack.setAttribute('stroke-dashoffset', '0')\n\t\t\tcrack.setAttribute('opacity', '0.5')\n\t\t}\n\n\t\tconst animate = (currentTime: number) => {\n\t\t\tif (!this.state || !this.state.isVisible) return\n\n\t\t\tconst elapsed = currentTime - this.state.startTime\n\t\t\tconst { shards, width } = this.state\n\n\t\t\t// Continuous shard animation — each shard has its own cycle\n\t\t\tfor (let i = 0; i < shards.length; i++) {\n\t\t\t\tconst shard = shards[i]\n\t\t\t\tconst shardCycleDuration = 2500 + i * 200 // Stagger cycle durations\n\t\t\t\tconst shardProgress = ((elapsed + i * 300) % shardCycleDuration) / shardCycleDuration\n\n\t\t\t\tshard.x = shardProgress * shard.vx * width * 0.5\n\t\t\t\tshard.y = 20 + shardProgress * shard.vy * 25 + shardProgress * shardProgress * 20\n\t\t\t\tshard.rotation += shard.rotationSpeed * 0.3\n\n\t\t\t\tlet opacity = 0.85\n\t\t\t\tif (shardProgress < 0.1) {\n\t\t\t\t\topacity = shardProgress * 8.5\n\t\t\t\t} else if (shardProgress > 0.8) {\n\t\t\t\t\topacity = (1 - shardProgress) * 4.25\n\t\t\t\t}\n\n\t\t\t\tshard.element.style.transform = `translate(${shard.x.toFixed(1)}px, ${shard.y.toFixed(1)}px) rotate(${shard.rotation.toFixed(0)}deg) scale(${shard.scale})`\n\t\t\t\tshard.element.setAttribute('opacity', opacity.toFixed(2))\n\t\t\t}\n\n\t\t\t// Continuous sparkles\n\t\t\tconst sparkles = this.state.svg?.querySelectorAll('[data-sparkle]')\n\t\t\tif (sparkles) {\n\t\t\t\tsparkles.forEach((sparkle, i) => {\n\t\t\t\t\tconst sparkleCycle = 1500 + i * 150\n\t\t\t\t\tconst sparkleProgress = ((elapsed + i * 200) % sparkleCycle) / sparkleCycle\n\n\t\t\t\t\tconst sparkleX = 5 + sparkleProgress * width * 0.6\n\t\t\t\t\tconst sparkleY = 18 + Math.sin(sparkleProgress * Math.PI * 4) * 10\n\t\t\t\t\tconst sparkleOpacity = Math.sin(sparkleProgress * Math.PI) * 0.8\n\n\t\t\t\t\tsparkle.setAttribute('cx', sparkleX.toFixed(1))\n\t\t\t\t\tsparkle.setAttribute('cy', sparkleY.toFixed(1))\n\t\t\t\t\tsparkle.setAttribute('opacity', Math.max(0, sparkleOpacity).toFixed(2))\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Pulse the cracks subtly\n\t\t\tconst crackPulse = Math.sin(elapsed / 800) * 0.15 + 0.45\n\t\t\tfor (const crack of cracks) {\n\t\t\t\tcrack.setAttribute('opacity', crackPulse.toFixed(2))\n\t\t\t}\n\n\t\t\tthis.state.animationId = requestAnimationFrame(animate)\n\t\t}\n\n\t\tthis.state.animationId = requestAnimationFrame(animate)\n\t}\n\n\tprivate cleanup() {\n\t\tif (!this.state) return\n\n\t\tif (this.state.animationId) {\n\t\t\tcancelAnimationFrame(this.state.animationId)\n\t\t}\n\n\t\tif (this.state.observer) {\n\t\t\tthis.state.observer.disconnect()\n\t\t}\n\n\t\tif (this.state.overlayElement) {\n\t\t\tthis.state.overlayElement.remove()\n\t\t}\n\n\t\tthis.state = null\n\t}\n\n\toverride disconnected() {\n\t\tthis.cleanup()\n\t}\n}\n\nexport const missedPunch = directive(MissedPunchDirective)\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 type { ElementPart } from 'lit'\nimport { noChange } from 'lit'\nimport { AsyncDirective, directive } from 'lit/async-directive.js'\nimport { EMPTY, type Subscription, from, fromEvent, timer } from 'rxjs'\nimport { catchError, take, tap } from 'rxjs/operators'\nimport { SPRING_GENTLE, SPRING_SMOOTH, getEasing } from '../utils/animation'\nimport { reducedMotion$ } from './reduced-motion'\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: 8,\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 - compositor-only rotation. filter is static (baked inline) to avoid\n per-frame raster cost of animated blur/hue-rotate under mix-blend-mode: screen. */\n@keyframes nebula-iridescent {\n\t0% { transform: translateZ(0) rotate(0deg); }\n\t100% { transform: translateZ(0) rotate(360deg); }\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 - compositor-only pulse when dimmed.\n filter: blur is intentionally static (baked on layers) — animating it here\n would keep re-rasterizing the dimmed overlay forever for no visual gain. */\n@keyframes nebula-idle-breathe {\n\t0%, 100% {\n\t\topacity: var(--nebula-idle-opacity, 0.08);\n\t\ttransform: scale(1) translateZ(0);\n\t}\n\t50% {\n\t\topacity: calc(var(--nebula-idle-opacity, 0.08) * 1.4);\n\t\ttransform: scale(1.005) translateZ(0);\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.nebula-overlay.dimmed .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\tfadeFinishedSub: 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.state.fadeFinishedSub?.unsubscribe()\n\t\t\tthis.state.fadeFinishedSub = null\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\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) translateZ(0)' },\n\t\t\t\t{ opacity: opts.intensity * 0.7, transform: 'scale(1.01) translateZ(0)' },\n\t\t\t\t{ opacity: opts.intensity, transform: 'scale(1) translateZ(0)' },\n\t\t\t] as Keyframe[],\n\t\t\t{\n\t\t\t\tduration: reducedMotion ? 0 : opts.fadeInDuration * 0.6,\n\t\t\t\teasing: reducedMotion ? 'linear' : getEasing(SPRING_SMOOTH),\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t)\n\n\t\t// Clear the dimmed gate + any container-level idle-breathe animation hide() installed,\n\t\t// then resume the per-layer CSS animations.\n\t\toverlay.classList.remove('paused', 'dimmed')\n\t\toverlay.classList.add('running')\n\t\toverlay.style.animation = ''\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\ttransformOrigin: '50% 50%',\n\t\t\t\t// Static filter — animating hue-rotate + blur every frame is a GPU pig\n\t\t\t\t// under mix-blend-mode: screen. Compositor-only rotation gets the iridescent\n\t\t\t\t// shimmer \"for free\" by sliding the gradient across the blend stack.\n\t\t\t\tfilter: `blur(${12 * opts.blur}px) saturate(1.6)`,\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\t// Compositor-only entrance — opacity + transform reach the same \"rising into focus\"\n\t\t// feel without animating `filter: blur`, which re-rasterizes the full filtered\n\t\t// region every frame under mix-blend-mode: screen.\n\t\toverlay.animate(\n\t\t\t[\n\t\t\t\t{ opacity: 0, transform: 'scale(0.85) translateZ(0)' },\n\t\t\t\t{ opacity: opts.intensity * 0.4, transform: 'scale(0.97) translateZ(0)' },\n\t\t\t\t{ opacity: opts.intensity, transform: 'scale(1) translateZ(0)' },\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\tfadeFinishedSub: 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\t\tconst duration = reducedMotion ? 0 : opts.fadeOutDuration\n\t\tconst easing = 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) translateZ(0)' },\n\t\t\t\t\t{ opacity: currentOpts.intensity * 0.4, transform: 'scale(0.95) translateZ(0)' },\n\t\t\t\t\t{ opacity: 0, transform: 'scale(0.9) translateZ(0)' },\n\t\t\t\t] as Keyframe[],\n\t\t\t\t{ duration, easing, fill: 'forwards' },\n\t\t\t)\n\t\t\treturn\n\t\t}\n\n\t\tconst fadeDown = overlay.animate(\n\t\t\t[\n\t\t\t\t{ opacity: currentOpts.intensity, transform: 'scale(1) translateZ(0)' },\n\t\t\t\t{ opacity: currentOpts.intensity * 0.5, transform: 'scale(0.99) translateZ(0)' },\n\t\t\t\t{ opacity: opts.idleOpacity, transform: 'scale(1) translateZ(0)' },\n\t\t\t] as Keyframe[],\n\t\t\t{ duration, easing, fill: 'forwards' },\n\t\t)\n\n\t\t// After fade-down, gate per-layer animations off via the `dimmed` class — without\n\t\t// this, chromatic/iridescent/tendril/particle keyframes keep burning GPU under\n\t\t// mix-blend-mode: screen forever even though the stack is visually idle.\n\t\tthis.state.fadeFinishedSub?.unsubscribe()\n\t\tthis.state.fadeFinishedSub = from(fadeDown.finished).pipe(\n\t\t\ttake(1),\n\t\t\ttap(() => {\n\t\t\t\tif (!this.state?.overlay) return\n\t\t\t\tthis.state.overlay.classList.add('dimmed')\n\t\t\t\tif (opts.idleBreathe && !reducedMotion) {\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\tcatchError(() => EMPTY),\n\t\t).subscribe()\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\t\tthis.state.fadeFinishedSub?.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","/**\n * Urgent directive — shattering glass attention effect.\n *\n * Creates a dramatic shattering glass effect with particles exploding from the\n * center. Uses GPU-accelerated CSS transforms and requestAnimationFrame for\n * smooth 60fps animation.\n *\n * Designed for 100+ concurrent instances on a page:\n * - Shared global container: single DOM container for all instances.\n * - Shared animation loop: one rAF loop coordinates all shard updates.\n * - Shared visibility observer: single IntersectionObserver for all elements.\n * - Shared tab visibility: single document listener shared across instances.\n * - Shared shard pool: global pool reduces memory allocation.\n * - Throttled sound: prevents audio system saturation.\n * - Staggered bursts: prevents all instances bursting simultaneously.\n *\n * @example\n * ```ts\n * // Basic usage — shattering glass when condition is true (auto mode)\n * html`<button ${urgent(isOverdue)}>Confirm Delivery</button>`\n *\n * // With custom color (defaults to error color)\n * html`<div ${urgent(needsAttention, 'warning')}>Action needed</div>`\n *\n * // Without shake\n * html`<button ${urgent(isCritical, 'error', false)}>Critical</button>`\n *\n * // Using options object (default interval is 4000ms)\n * html`<div ${urgent({ active: true, color: 'warning', interval: 5000 })}>Alert</div>`\n *\n * // Manual mode with controller\n * const controller = urgent.getController(element)\n * controller.play() // Single burst\n * controller.start(1500) // Start interval at 1.5s\n * controller.stop() // Stop interval\n * ```\n */\n\nimport { noChange } from 'lit'\nimport { AsyncDirective, directive } from 'lit/async-directive.js'\nimport type { ElementPart } from 'lit'\nimport { $sounds } from '../audio'\n\nexport type UrgentColor = 'error' | 'warning' | 'primary'\nexport type UrgentMode = 'auto' | 'manual'\n\nexport interface UrgentController {\n\t/** Trigger a single burst of shards */\n\tplay(): void\n\t/** Start the burst interval (auto mode behavior) */\n\tstart(intervalMs?: number): void\n\t/** Stop the burst interval */\n\tstop(): void\n\t/** Whether the burst interval is currently running */\n\treadonly isRunning: boolean\n}\n\nexport interface UrgentOptions {\n\t/** Whether the urgent effect should be active */\n\tactive?: boolean\n\t/** Color scheme: 'error' (default) | 'warning' | 'primary' */\n\tcolor?: UrgentColor\n\t/** Whether to add shake animation (default: true) */\n\tshake?: boolean\n\t/** Mode: 'auto' creates bursts on interval, 'manual' requires controller (default: 'auto') */\n\tmode?: UrgentMode\n\t/** Interval between bursts in ms (default: 4000) */\n\tinterval?: number\n}\n\ninterface ShardData {\n\tx: number\n\ty: number\n\tvx: number\n\tvy: number\n\trotation: number\n\trotationSpeed: number\n\tinitialScale: number\n\tlife: number\n\tmaxLife: number\n\telement: HTMLElement\n\tcolorIndex: number\n}\n\n// Intentional effect-variant palettes — these are the visual identity of each\n// urgent scheme, not theming tokens. Kept as hex on purpose.\nconst COLORS: Record<UrgentColor, readonly string[]> = {\n\terror: ['#ef4444', '#dc2626', '#b91c1c', '#fca5a5', '#fee2e2'],\n\twarning: ['#f59e0b', '#d97706', '#b45309', '#fcd34d', '#fef3c7'],\n\tprimary: ['#3b82f6', '#2563eb', '#1d4ed8', '#93c5fd', '#dbeafe'],\n}\n\nconst COLOR_INDEX: Record<UrgentColor, number> = { error: 0, warning: 1, primary: 2 }\n\n// ============================================================================\n// SHARED GLOBAL RESOURCES (singleton)\n// ============================================================================\n\nclass UrgentCoordinator {\n\tprivate static instance: UrgentCoordinator | null = null\n\n\tprivate container: HTMLElement | null = null\n\tprivate stylesInjected = false\n\n\tprivate shardPools: Map<number, HTMLElement[]> = new Map([\n\t\t[0, []],\n\t\t[1, []],\n\t\t[2, []],\n\t])\n\tprivate activeShards: ShardData[] = []\n\n\tprivate animationId: number | null = null\n\tprivate instances = new Set<UrgentDirective>()\n\n\tprivate tabVisible = true\n\tprivate visibilityObserver: IntersectionObserver | null = null\n\tprivate elementVisibility = new WeakMap<HTMLElement, boolean>()\n\tprivate observedElements = new WeakSet<HTMLElement>()\n\n\tprivate lastSoundTime = 0\n\tprivate readonly SOUND_THROTTLE_MS = 150\n\n\tprivate constructor() {\n\t\tdocument.addEventListener('visibilitychange', () => {\n\t\t\tthis.tabVisible = document.visibilityState === 'visible'\n\t\t\tif (this.tabVisible) {\n\t\t\t\tthis.resumeAllAnimations()\n\t\t\t\tthis.startAnimationLoop()\n\t\t\t} else {\n\t\t\t\tthis.pauseAllAnimations()\n\t\t\t\tthis.stopAnimationLoop()\n\t\t\t\tthis.clearAllShards()\n\t\t\t}\n\t\t})\n\t}\n\n\tstatic getInstance(): UrgentCoordinator {\n\t\tif (!UrgentCoordinator.instance) {\n\t\t\tUrgentCoordinator.instance = new UrgentCoordinator()\n\t\t}\n\t\treturn UrgentCoordinator.instance\n\t}\n\n\tensureInitialized(): void {\n\t\tthis.ensureStyles()\n\t\tthis.ensureContainer()\n\t\tthis.ensureObserver()\n\t}\n\n\tprivate ensureStyles(): void {\n\t\tif (this.stylesInjected) return\n\t\tconst style = document.createElement('style')\n\t\tstyle.id = 'urgent-shard-styles'\n\t\tstyle.textContent = `\n\t\t\t.urgent-shard {\n\t\t\t\tposition: absolute;\n\t\t\t\ttransform-origin: center;\n\t\t\t\twill-change: transform, opacity;\n\t\t\t\tpointer-events: none;\n\t\t\t\tcontain: layout style;\n\t\t\t}\n\t\t\t.urgent-container {\n\t\t\t\tposition: fixed;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t\twidth: 100vw;\n\t\t\t\theight: 100vh;\n\t\t\t\tpointer-events: none;\n\t\t\t\toverflow: visible;\n\t\t\t\tz-index: 9999;\n\t\t\t\tcontain: strict;\n\t\t\t}\n\t\t`\n\t\tdocument.head.appendChild(style)\n\t\tthis.stylesInjected = true\n\t}\n\n\tprivate ensureContainer(): void {\n\t\tif (this.container && this.container.isConnected) return\n\t\tthis.container = document.createElement('div')\n\t\tthis.container.className = 'urgent-container'\n\t\tdocument.body.appendChild(this.container)\n\t}\n\n\tprivate ensureObserver(): void {\n\t\tif (this.visibilityObserver) return\n\t\tthis.visibilityObserver = new IntersectionObserver(\n\t\t\tentries => {\n\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\tthis.elementVisibility.set(entry.target as HTMLElement, entry.isIntersecting)\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ threshold: 0 },\n\t\t)\n\t}\n\n\tregister(instance: UrgentDirective): void {\n\t\tthis.ensureInitialized()\n\t\tthis.instances.add(instance)\n\t\tthis.startAnimationLoop()\n\t}\n\n\tunregister(instance: UrgentDirective): void {\n\t\tthis.instances.delete(instance)\n\t\tif (this.instances.size === 0) {\n\t\t\tthis.stopAnimationLoop()\n\t\t}\n\t}\n\n\tobserveElement(element: HTMLElement): void {\n\t\tif (this.observedElements.has(element)) return\n\t\tthis.ensureObserver()\n\t\tthis.visibilityObserver!.observe(element)\n\t\tthis.observedElements.add(element)\n\t\tthis.elementVisibility.set(element, true)\n\t}\n\n\tunobserveElement(element: HTMLElement): void {\n\t\tthis.visibilityObserver?.unobserve(element)\n\t\tthis.observedElements.delete(element)\n\t}\n\n\tisElementVisible(element: HTMLElement): boolean {\n\t\treturn this.elementVisibility.get(element) ?? true\n\t}\n\n\tisTabVisible(): boolean {\n\t\treturn this.tabVisible\n\t}\n\n\tacquireShard(colorIndex: number, colors: readonly string[]): HTMLElement {\n\t\tconst pool = this.shardPools.get(colorIndex)!\n\t\tlet shard = pool.pop()\n\n\t\tif (!shard) {\n\t\t\tshard = document.createElement('div')\n\t\t\tshard.className = 'urgent-shard'\n\t\t\tthis.container!.appendChild(shard)\n\t\t}\n\n\t\tconst width = 4 + Math.random() * 12\n\t\tconst height = 4 + Math.random() * 12\n\t\tconst color = colors[Math.floor(Math.random() * colors.length)]\n\n\t\tObject.assign(shard.style, {\n\t\t\twidth: `${width}px`,\n\t\t\theight: `${height}px`,\n\t\t\tbackground: `linear-gradient(${Math.random() * 360}deg,${color},transparent)`,\n\t\t\tclipPath: `polygon(${Math.random() * 30}% ${Math.random() * 30}%,${70 + Math.random() * 30}% ${Math.random() * 40}%,${60 + Math.random() * 40}% ${60 + Math.random() * 40}%,${Math.random() * 40}% ${70 + Math.random() * 30}%)`,\n\t\t\tboxShadow: `0 0 ${2 + Math.random() * 4}px ${colors[0]}88`,\n\t\t\topacity: '1',\n\t\t})\n\n\t\treturn shard\n\t}\n\n\treleaseShard(shard: HTMLElement, colorIndex: number): void {\n\t\tObject.assign(shard.style, { opacity: '0', transform: 'translate(-9999px,-9999px)' })\n\t\tthis.shardPools.get(colorIndex)!.push(shard)\n\t}\n\n\taddShards(shards: ShardData[]): void {\n\t\tthis.activeShards.push(...shards)\n\t}\n\n\tprivate clearAllShards(): void {\n\t\tfor (const shard of this.activeShards) {\n\t\t\tthis.releaseShard(shard.element, shard.colorIndex)\n\t\t}\n\t\tthis.activeShards = []\n\t}\n\n\tprivate startAnimationLoop(): void {\n\t\tif (this.animationId !== null || !this.tabVisible) return\n\n\t\tconst tick = () => {\n\t\t\tthis.updateShards()\n\t\t\tthis.updateInstanceTimers()\n\n\t\t\tif (this.instances.size > 0 && this.tabVisible) {\n\t\t\t\tthis.animationId = requestAnimationFrame(tick)\n\t\t\t} else {\n\t\t\t\tthis.animationId = null\n\t\t\t}\n\t\t}\n\n\t\tthis.animationId = requestAnimationFrame(tick)\n\t}\n\n\tprivate stopAnimationLoop(): void {\n\t\tif (this.animationId !== null) {\n\t\t\tcancelAnimationFrame(this.animationId)\n\t\t\tthis.animationId = null\n\t\t}\n\t}\n\n\tprivate updateShards(): void {\n\t\tconst shards = this.activeShards\n\n\t\tfor (let i = shards.length - 1; i >= 0; i--) {\n\t\t\tconst data = shards[i]\n\t\t\tdata.life++\n\n\t\t\tdata.x += data.vx\n\t\t\tdata.y += data.vy\n\t\t\tdata.vy += 0.15 // Gravity\n\t\t\tdata.vx *= 0.98 // Air resistance\n\t\t\tdata.rotation += data.rotationSpeed\n\n\t\t\tconst progress = data.life / data.maxLife\n\t\t\tconst opacity = Math.max(0, 1 - progress * progress)\n\t\t\tconst scale = data.initialScale * (1 - progress * 0.5)\n\n\t\t\tdata.element.style.transform = `translate3d(${data.x}px,${data.y}px,0) rotate(${data.rotation}deg) scale(${scale})`\n\t\t\tdata.element.style.opacity = String(opacity)\n\n\t\t\tif (data.life >= data.maxLife) {\n\t\t\t\tthis.releaseShard(data.element, data.colorIndex)\n\t\t\t\tshards.splice(i, 1)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate updateInstanceTimers(): void {\n\t\tconst now = performance.now()\n\t\tfor (const instance of this.instances) {\n\t\t\tinstance.checkBurstTimer(now)\n\t\t}\n\t}\n\n\tprivate pauseAllAnimations(): void {\n\t\tfor (const instance of this.instances) {\n\t\t\tinstance.pauseAnimations()\n\t\t}\n\t}\n\n\tprivate resumeAllAnimations(): void {\n\t\tfor (const instance of this.instances) {\n\t\t\tinstance.resumeAnimations()\n\t\t}\n\t}\n\n\tplaySound(color: UrgentColor): void {\n\t\tconst now = performance.now()\n\t\tif (now - this.lastSoundTime < this.SOUND_THROTTLE_MS) return\n\t\tthis.lastSoundTime = now\n\n\t\tconst feeling = color === 'error' ? 'anxious' : color === 'warning' ? 'worried' : 'curious'\n\t\t$sounds.play(feeling as Parameters<typeof $sounds.play>[0])\n\t}\n\n\tdestroy(): void {\n\t\tthis.stopAnimationLoop()\n\t\tthis.visibilityObserver?.disconnect()\n\t\tthis.container?.remove()\n\t\tthis.shardPools.forEach(pool => pool.forEach(el => el.remove()))\n\t\tthis.shardPools.clear()\n\t\tthis.activeShards = []\n\t\tUrgentCoordinator.instance = null\n\t}\n}\n\n// ============================================================================\n// DIRECTIVE\n// ============================================================================\n\ninterface DirectiveState {\n\tactive: boolean\n\tcolor: UrgentColor\n\tshake: boolean\n\tmode: UrgentMode\n\tinterval: number\n\telement: HTMLElement\n\toriginalPosition: string\n\toriginalOverflow: string\n\tshakeAnimation: Animation | null\n\tpulseAnimation: Animation | null\n\tisRunning: boolean\n\tlastBurstTime: number\n\tinitialized: boolean\n}\n\nconst controllerMap = new WeakMap<HTMLElement, UrgentController>()\n\nclass UrgentDirective extends AsyncDirective {\n\tprivate state: DirectiveState | null = null\n\tprivate coordinator = UrgentCoordinator.getInstance()\n\n\trender(_activeOrOptions?: boolean | UrgentOptions, _color?: UrgentColor, _shake?: boolean) {\n\t\treturn noChange\n\t}\n\n\toverride update(part: ElementPart, args: [boolean | UrgentOptions | undefined, UrgentColor?, boolean?]) {\n\t\tconst element = part.element as HTMLElement\n\n\t\tlet active: boolean\n\t\tlet color: UrgentColor\n\t\tlet shake: boolean\n\t\tlet mode: UrgentMode\n\t\tlet interval: number\n\n\t\tconst first = args[0]\n\t\tif (typeof first === 'object' && first !== null) {\n\t\t\tactive = first.active ?? false\n\t\t\tcolor = first.color ?? 'error'\n\t\t\tshake = first.shake ?? true\n\t\t\tmode = first.mode ?? 'auto'\n\t\t\tinterval = first.interval ?? 4000\n\t\t} else {\n\t\t\tactive = typeof first === 'boolean' ? first : false\n\t\t\tcolor = args[1] ?? 'error'\n\t\t\tshake = args[2] ?? true\n\t\t\tmode = 'auto'\n\t\t\tinterval = 4000\n\t\t}\n\n\t\tif (!active && this.state?.active) {\n\t\t\tthis.cleanup()\n\t\t\treturn noChange\n\t\t}\n\n\t\tif (\n\t\t\tthis.state &&\n\t\t\tthis.state.active === active &&\n\t\t\tthis.state.color === color &&\n\t\t\tthis.state.shake === shake &&\n\t\t\tthis.state.mode === mode &&\n\t\t\tthis.state.interval === interval\n\t\t) {\n\t\t\treturn noChange\n\t\t}\n\n\t\tif (\n\t\t\tthis.state &&\n\t\t\t(this.state.color !== color ||\n\t\t\t\tthis.state.shake !== shake ||\n\t\t\t\tthis.state.mode !== mode ||\n\t\t\t\tthis.state.interval !== interval)\n\t\t) {\n\t\t\tthis.cleanup()\n\t\t}\n\n\t\tif (active && !this.state) {\n\t\t\tconst originalPosition = element.style.position\n\t\t\tconst originalOverflow = element.style.overflow\n\n\t\t\tthis.state = {\n\t\t\t\tactive,\n\t\t\t\tcolor,\n\t\t\t\tshake,\n\t\t\t\tmode,\n\t\t\t\tinterval,\n\t\t\t\telement,\n\t\t\t\toriginalPosition,\n\t\t\t\toriginalOverflow,\n\t\t\t\tshakeAnimation: null,\n\t\t\t\tpulseAnimation: null,\n\t\t\t\tisRunning: false,\n\t\t\t\tlastBurstTime: performance.now() + Math.random() * interval,\n\t\t\t\tinitialized: false,\n\t\t\t}\n\n\t\t\tcontrollerMap.set(element, this.createController())\n\n\t\t\tthis.coordinator.register(this)\n\t\t\tthis.coordinator.observeElement(element)\n\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tif (!this.state) return\n\t\t\t\tthis.initializeElement()\n\n\t\t\t\tif (mode === 'auto') {\n\t\t\t\t\tthis.startBurstInterval()\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\treturn noChange\n\t}\n\n\tprivate initializeElement(): void {\n\t\tif (!this.state || this.state.initialized) return\n\n\t\tconst { element, color, shake } = this.state\n\t\tconst colors = COLORS[color]\n\n\t\tconst computedPosition = getComputedStyle(element).position\n\t\tif (computedPosition === 'static') {\n\t\t\telement.style.position = 'relative'\n\t\t}\n\t\telement.style.overflow = 'visible'\n\n\t\tif (shake) {\n\t\t\tthis.state.shakeAnimation = element.animate(\n\t\t\t\t[\n\t\t\t\t\t{ transform: 'rotate(0deg) scale(1)' },\n\t\t\t\t\t{ transform: 'rotate(-2deg) scale(1.02)' },\n\t\t\t\t\t{ transform: 'rotate(2deg) scale(1.02)' },\n\t\t\t\t\t{ transform: 'rotate(-1deg) scale(1.01)' },\n\t\t\t\t\t{ transform: 'rotate(1deg) scale(1.01)' },\n\t\t\t\t\t{ transform: 'rotate(0deg) scale(1)' },\n\t\t\t\t],\n\t\t\t\t{ duration: 400, easing: 'ease-in-out', iterations: Infinity },\n\t\t\t)\n\t\t}\n\n\t\tthis.state.pulseAnimation = element.animate(\n\t\t\t[\n\t\t\t\t{ boxShadow: `0 0 0 0 ${colors[0]}66` },\n\t\t\t\t{ boxShadow: `0 0 20px 5px ${colors[0]}33` },\n\t\t\t\t{ boxShadow: `0 0 0 0 ${colors[0]}66` },\n\t\t\t] as Keyframe[],\n\t\t\t{ duration: 1500, easing: 'ease-in-out', iterations: Infinity },\n\t\t)\n\n\t\tthis.coordinator.playSound(color)\n\n\t\tthis.state.initialized = true\n\t}\n\n\tcheckBurstTimer(now: number): void {\n\t\tif (!this.state || !this.state.isRunning) return\n\t\tif (!this.coordinator.isTabVisible()) return\n\t\tif (!this.coordinator.isElementVisible(this.state.element)) return\n\n\t\tif (now - this.state.lastBurstTime >= this.state.interval) {\n\t\t\tthis.state.lastBurstTime = now\n\t\t\tthis.createBurst()\n\t\t}\n\t}\n\n\tprivate createBurst(): void {\n\t\tif (!this.state) return\n\n\t\tconst { element, color } = this.state\n\t\tconst colors = COLORS[color]\n\t\tconst colorIndex = COLOR_INDEX[color]\n\n\t\tconst rect = element.getBoundingClientRect()\n\t\tconst centerX = rect.left + rect.width / 2\n\t\tconst centerY = rect.top + rect.height / 2\n\n\t\tconst count = 8 + Math.floor(Math.random() * 5)\n\t\tconst shards: ShardData[] = []\n\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tconst shardElement = this.coordinator.acquireShard(colorIndex, colors)\n\n\t\t\tconst angle = Math.random() * Math.PI * 2\n\t\t\tconst speed = 2 + Math.random() * 4\n\n\t\t\tshards.push({\n\t\t\t\telement: shardElement,\n\t\t\t\tcolorIndex,\n\t\t\t\tx: centerX,\n\t\t\t\ty: centerY,\n\t\t\t\tvx: Math.cos(angle) * speed,\n\t\t\t\tvy: Math.sin(angle) * speed,\n\t\t\t\trotation: Math.random() * 360,\n\t\t\t\trotationSpeed: -15 + Math.random() * 30,\n\t\t\t\tinitialScale: 0.5 + Math.random() * 0.5,\n\t\t\t\tlife: 0,\n\t\t\t\tmaxLife: 40 + Math.random() * 30,\n\t\t\t})\n\t\t}\n\n\t\tthis.coordinator.addShards(shards)\n\t\tthis.coordinator.playSound(color)\n\t}\n\n\tpauseAnimations(): void {\n\t\tthis.state?.shakeAnimation?.pause()\n\t\tthis.state?.pulseAnimation?.pause()\n\t}\n\n\tresumeAnimations(): void {\n\t\tthis.state?.shakeAnimation?.play()\n\t\tthis.state?.pulseAnimation?.play()\n\t}\n\n\tprivate createController(): UrgentController {\n\t\t// eslint-disable-next-line @typescript-eslint/no-this-alias\n\t\tconst self = this\n\t\treturn {\n\t\t\tplay: () => self.playOnce(),\n\t\t\tstart: (intervalMs?: number) => {\n\t\t\t\tif (self.state && intervalMs !== undefined) {\n\t\t\t\t\tself.state.interval = intervalMs\n\t\t\t\t}\n\t\t\t\tself.startBurstInterval()\n\t\t\t},\n\t\t\tstop: () => self.stopBurstInterval(),\n\t\t\tget isRunning() {\n\t\t\t\treturn self.state?.isRunning ?? false\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate playOnce(): void {\n\t\tif (!this.state) return\n\t\tif (!this.state.initialized) {\n\t\t\tthis.initializeElement()\n\t\t}\n\t\tthis.createBurst()\n\t}\n\n\tprivate startBurstInterval(): void {\n\t\tif (!this.state) return\n\t\tthis.state.isRunning = true\n\t\tthis.state.lastBurstTime = performance.now()\n\t}\n\n\tprivate stopBurstInterval(): void {\n\t\tif (!this.state) return\n\t\tthis.state.isRunning = false\n\t}\n\n\tprivate cleanup(): void {\n\t\tif (!this.state) return\n\n\t\tthis.coordinator.unregister(this)\n\t\tthis.coordinator.unobserveElement(this.state.element)\n\n\t\tthis.state.shakeAnimation?.cancel()\n\t\tthis.state.pulseAnimation?.cancel()\n\n\t\tcontrollerMap.delete(this.state.element)\n\n\t\tif (this.state.originalPosition !== undefined) {\n\t\t\tthis.state.element.style.position = this.state.originalPosition\n\t\t}\n\t\tif (this.state.originalOverflow !== undefined) {\n\t\t\tthis.state.element.style.overflow = this.state.originalOverflow\n\t\t}\n\n\t\tthis.state = null\n\t}\n\n\toverride disconnected(): void {\n\t\tthis.cleanup()\n\t}\n}\n\nconst urgentDirective = directive(UrgentDirective)\n\ntype UrgentFn = {\n\t(active?: boolean, color?: UrgentColor, shake?: boolean): ReturnType<typeof urgentDirective>\n\t(options: UrgentOptions): ReturnType<typeof urgentDirective>\n\tgetController(element: HTMLElement): UrgentController | undefined\n}\n\nexport const urgent: UrgentFn = Object.assign(\n\t(activeOrOptions?: boolean | UrgentOptions, color?: UrgentColor, shake?: boolean) =>\n\t\turgentDirective(activeOrOptions, color, shake),\n\t{\n\t\tgetController(element: HTMLElement): UrgentController | undefined {\n\t\t\treturn controllerMap.get(element)\n\t\t},\n\t},\n)\n","/**\n * Working Snake Directive - Animated trail indicating active work\n *\n * Creates a visual \"snake\" effect emanating from a punch point when\n * an employee is currently working (single check-in, no check-out yet).\n *\n * The animation creates a visual illusion of forward motion - dots flow\n * rightward with a subtle sine wave oscillation, representing time passing.\n *\n * Follows patterns from art.ts:\n * - RequestAnimationFrame for smooth 60fps\n * - Intersection Observer to pause when off-screen\n * - GPU-accelerated CSS transforms\n * - Object pooling for performance\n *\n * @example\n * ```ts\n * html`\n * <div ${workingSnake({ active: true, color: 'var(--md-sys-color-primary)' })}>\n * <div class=\"punch-dot\"></div>\n * </div>\n * `\n * ```\n */\n\nimport type { ElementPart } from 'lit'\nimport { noChange } from 'lit'\nimport { AsyncDirective, directive } from 'lit/async-directive.js'\n\nexport interface WorkingSnakeOptions {\n\t/** Whether the snake animation is active */\n\tactive: boolean\n\t/** CSS color value for the snake segments */\n\tcolor?: string\n\t/** Width in pixels the snake should travel */\n\ttravelWidth?: number\n}\n\ninterface Segment {\n\telement: SVGCircleElement\n\tprogress: number // 0 to 1 - position along the path\n\tphase: number // offset for sine wave\n}\n\ninterface SnakeState {\n\tactive: boolean\n\tcolor: string\n\ttravelWidth: number\n\telement: HTMLElement\n\toverlayElement?: HTMLDivElement\n\tsvg?: SVGSVGElement\n\tsegments: Segment[]\n\tanimationId?: number\n\tisVisible: boolean\n\tobserver?: IntersectionObserver\n\tstartTime: number\n}\n\nconst SEGMENT_COUNT = 10\nconst CYCLE_DURATION = 3000 // 3 seconds for full cycle\nconst SINE_AMPLITUDE = 3 // vertical oscillation in pixels\nconst HEAD_RADIUS = 4\nconst TAIL_RADIUS = 1.5\n\nclass WorkingSnakeDirective extends AsyncDirective {\n\tprivate state: SnakeState | null = null\n\n\trender(_options: WorkingSnakeOptions) {\n\t\treturn noChange\n\t}\n\n\toverride update(part: ElementPart, [options]: [WorkingSnakeOptions]) {\n\t\tconst element = part.element as HTMLElement\n\t\t// Auto-calculate travelWidth to use 100% of container if not specified\n\t\tconst calculatedWidth = element.offsetWidth || element.clientWidth\n\t\tconst { active, color = 'var(--md-sys-color-primary)', travelWidth = calculatedWidth } = options\n\n\t\t// If becoming inactive, cleanup\n\t\tif (!active && this.state) {\n\t\t\tthis.cleanup()\n\t\t\treturn noChange\n\t\t}\n\n\t\t// If not active and no state, nothing to do\n\t\tif (!active) {\n\t\t\treturn noChange\n\t\t}\n\n\t\t// If options changed, recreate\n\t\tif (this.state && (this.state.color !== color || this.state.travelWidth !== travelWidth)) {\n\t\t\tthis.cleanup()\n\t\t}\n\n\t\t// Initialize if needed\n\t\tif (!this.state) {\n\t\t\tthis.state = {\n\t\t\t\tactive: true,\n\t\t\t\tcolor,\n\t\t\t\ttravelWidth,\n\t\t\t\telement,\n\t\t\t\tsegments: [],\n\t\t\t\tisVisible: true,\n\t\t\t\tstartTime: performance.now(),\n\t\t\t}\n\n\t\t\t// Ensure element has relative positioning for absolute overlay\n\t\t\tconst computedStyle = getComputedStyle(element)\n\t\t\tif (computedStyle.position === 'static') {\n\t\t\t\telement.style.position = 'relative'\n\t\t\t}\n\n\t\t\tthis.createOverlay()\n\t\t\tthis.setupVisibilityObserver()\n\t\t\tthis.startAnimation()\n\t\t}\n\n\t\treturn noChange\n\t}\n\n\tprivate createOverlay() {\n\t\tif (!this.state) return\n\n\t\tconst { element, color, travelWidth } = this.state\n\n\t\t// Create overlay container - starts from the punch point\n\t\tconst overlay = document.createElement('div')\n\t\toverlay.className = 'working-snake-overlay'\n\t\toverlay.style.cssText = `\n\t\t\tposition: absolute;\n\t\t\ttop: 50%;\n\t\t\tleft: 0;\n\t\t\twidth: ${travelWidth}px;\n\t\t\theight: 20px;\n\t\t\ttransform: translateY(-50%);\n\t\t\tpointer-events: none;\n\t\t\toverflow: visible;\n\t\t\tz-index: 5;\n\t\t`\n\n\t\t// Create SVG\n\t\tconst svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n\t\tsvg.setAttribute('width', '100%')\n\t\tsvg.setAttribute('height', '100%')\n\t\tsvg.setAttribute('viewBox', `0 0 ${travelWidth} 20`)\n\t\tsvg.setAttribute('preserveAspectRatio', 'none')\n\t\tsvg.style.cssText = `\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\toverflow: visible;\n\t\t`\n\n\t\t// Create segments (circles)\n\t\tconst segments: Segment[] = []\n\t\tfor (let i = 0; i < SEGMENT_COUNT; i++) {\n\t\t\tconst circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n\n\t\t\t// Calculate radius - head is bigger, tail is smaller\n\t\t\tconst normalizedIndex = i / (SEGMENT_COUNT - 1)\n\t\t\tconst radius = HEAD_RADIUS - normalizedIndex * (HEAD_RADIUS - TAIL_RADIUS)\n\n\t\t\tcircle.setAttribute('r', radius.toString())\n\t\t\tcircle.setAttribute('fill', color)\n\t\t\tcircle.setAttribute('cy', '10') // Center vertically in 20px height\n\t\t\tcircle.style.willChange = 'transform, opacity'\n\n\t\t\t// Stagger initial progress and phase for organic movement\n\t\t\tconst progress = (i / SEGMENT_COUNT) * 0.5 // Start staggered\n\t\t\tconst phase = (i / SEGMENT_COUNT) * Math.PI * 2\n\n\t\t\tsegments.push({ element: circle, progress, phase })\n\t\t\tsvg.appendChild(circle)\n\t\t}\n\n\t\toverlay.appendChild(svg)\n\t\telement.appendChild(overlay)\n\n\t\tthis.state.overlayElement = overlay\n\t\tthis.state.svg = svg\n\t\tthis.state.segments = segments\n\t}\n\n\tprivate setupVisibilityObserver() {\n\t\tif (!this.state || typeof IntersectionObserver === 'undefined') return\n\n\t\tthis.state.observer = new IntersectionObserver(\n\t\t\tentries => {\n\t\t\t\tif (!this.state) return\n\t\t\t\tconst isVisible = entries[0].isIntersecting\n\n\t\t\t\tif (isVisible && !this.state.isVisible) {\n\t\t\t\t\tthis.state.isVisible = true\n\t\t\t\t\tthis.startAnimation()\n\t\t\t\t} else if (!isVisible && this.state.isVisible) {\n\t\t\t\t\tthis.state.isVisible = false\n\t\t\t\t\tif (this.state.animationId) {\n\t\t\t\t\t\tcancelAnimationFrame(this.state.animationId)\n\t\t\t\t\t\tthis.state.animationId = undefined\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\tthis.state.observer.observe(this.state.element)\n\t}\n\n\tprivate startAnimation() {\n\t\tif (!this.state || !this.state.isVisible) return\n\n\t\tconst animate = (currentTime: number) => {\n\t\t\tif (!this.state || !this.state.isVisible) return\n\n\t\t\tconst elapsed = currentTime - this.state.startTime\n\t\t\tconst cycleProgress = (elapsed % CYCLE_DURATION) / CYCLE_DURATION\n\n\t\t\tconst { segments, travelWidth } = this.state\n\n\t\t\t// Animate each segment\n\t\t\tfor (let i = 0; i < segments.length; i++) {\n\t\t\t\tconst segment = segments[i]\n\n\t\t\t\t// Each segment is offset in the cycle\n\t\t\t\tconst segmentOffset = i / SEGMENT_COUNT\n\t\t\t\tlet progress = (cycleProgress + segmentOffset) % 1\n\n\t\t\t\t// Ease the progress for more organic feel (ease-out)\n\t\t\t\tconst easedProgress = 1 - Math.pow(1 - progress, 2)\n\n\t\t\t\t// Calculate x position\n\t\t\t\tconst x = easedProgress * travelWidth\n\n\t\t\t\t// Calculate y position with sine wave\n\t\t\t\tconst sineWave = Math.sin(progress * Math.PI * 4 + segment.phase) * SINE_AMPLITUDE\n\t\t\t\tconst y = 10 + sineWave\n\n\t\t\t\t// Calculate opacity - fade out as it travels\n\t\t\t\tconst baseOpacity = i === 0 ? 0.9 : 0.7 - (i / SEGMENT_COUNT) * 0.55\n\t\t\t\tconst fadeOut = 1 - easedProgress * 0.7\n\t\t\t\tconst opacity = baseOpacity * fadeOut\n\n\t\t\t\t// Head has subtle pulse\n\t\t\t\tlet scale = 1\n\t\t\t\tif (i === 0) {\n\t\t\t\t\tconst pulse = Math.sin(currentTime / 200) * 0.1 + 1\n\t\t\t\t\tscale = pulse\n\t\t\t\t}\n\n\t\t\t\t// Apply transforms\n\t\t\t\tsegment.element.setAttribute('cx', x.toFixed(1))\n\t\t\t\tsegment.element.setAttribute('cy', y.toFixed(1))\n\t\t\t\tsegment.element.setAttribute('opacity', Math.max(0.1, opacity).toFixed(2))\n\n\t\t\t\tif (scale !== 1) {\n\t\t\t\t\tsegment.element.style.transform = `scale(${scale.toFixed(2)})`\n\t\t\t\t\tsegment.element.style.transformOrigin = `${x}px ${y}px`\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.state.animationId = requestAnimationFrame(animate)\n\t\t}\n\n\t\tthis.state.animationId = requestAnimationFrame(animate)\n\t}\n\n\tprivate cleanup() {\n\t\tif (!this.state) return\n\n\t\t// Cancel animation\n\t\tif (this.state.animationId) {\n\t\t\tcancelAnimationFrame(this.state.animationId)\n\t\t}\n\n\t\t// Disconnect observer\n\t\tif (this.state.observer) {\n\t\t\tthis.state.observer.disconnect()\n\t\t}\n\n\t\t// Remove overlay\n\t\tif (this.state.overlayElement) {\n\t\t\tthis.state.overlayElement.remove()\n\t\t}\n\n\t\tthis.state = null\n\t}\n\n\toverride disconnected() {\n\t\tthis.cleanup()\n\t}\n}\n\nexport const workingSnake = directive(WorkingSnakeDirective)\n"],"mappings":"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AAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,IAAA,CAAA"}
|