@mhmo91/schmancy 0.10.32 → 0.10.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +7 -22
- package/dist/SchmancyElement-CA0Wqt8m.js +284 -0
- package/dist/{SchmancyElement-DuzT2AMa.js.map → SchmancyElement-CA0Wqt8m.js.map} +1 -1
- package/dist/SchmancyElement-CYIif26I.cjs +2 -0
- package/dist/{SchmancyElement-D8_z9JrW.cjs.map → SchmancyElement-CYIif26I.cjs.map} +1 -1
- package/dist/agent/schmancy.agent.js +1694 -1728
- package/dist/agent/schmancy.agent.js.map +1 -1
- package/dist/agent/schmancy.manifest.json +4 -10
- package/dist/{area-WGfTrwcJ.cjs → area-CTSTgjlx.cjs} +1 -1
- package/dist/{area-WGfTrwcJ.cjs.map → area-CTSTgjlx.cjs.map} +1 -1
- package/dist/{area-0l8V7HlF.js → area-DviXdbDx.js} +2 -2
- package/dist/{area-0l8V7HlF.js.map → area-DviXdbDx.js.map} +1 -1
- package/dist/area.cjs +1 -1
- package/dist/area.js +1 -1
- package/dist/{audio-x9oLVKBH.js → audio-DFYoaw0M.js} +1 -1
- package/dist/{audio-x9oLVKBH.js.map → audio-DFYoaw0M.js.map} +1 -1
- package/dist/{audio-9QLk4pU-.cjs → audio-Q9oB_cQR.cjs} +1 -1
- package/dist/{audio-9QLk4pU-.cjs.map → audio-Q9oB_cQR.cjs.map} +1 -1
- package/dist/audio.cjs +1 -1
- package/dist/audio.js +2 -2
- package/dist/{autocomplete-sjZovPcs.js → autocomplete-BDvuma6D.js} +3 -3
- package/dist/{autocomplete-sjZovPcs.js.map → autocomplete-BDvuma6D.js.map} +1 -1
- package/dist/{autocomplete-CjjfXbJC.cjs → autocomplete-DmLXJr7C.cjs} +1 -1
- package/dist/{autocomplete-CjjfXbJC.cjs.map → autocomplete-DmLXJr7C.cjs.map} +1 -1
- package/dist/autocomplete.cjs +1 -1
- package/dist/autocomplete.js +1 -1
- package/dist/avatar.cjs +1 -1
- package/dist/avatar.js +3 -3
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/boat-BgpWcLnV.cjs +38 -0
- package/dist/boat-BgpWcLnV.cjs.map +1 -0
- package/dist/boat-Y5UMiJCV.js +216 -0
- package/dist/boat-Y5UMiJCV.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 +2 -2
- package/dist/{busy-DDKXlzDA.cjs → busy-CgzZbGfx.cjs} +1 -1
- package/dist/{busy-DDKXlzDA.cjs.map → busy-CgzZbGfx.cjs.map} +1 -1
- package/dist/{busy-DwD-XHqS.js → busy-DgQ4ux5N.js} +2 -2
- package/dist/{busy-DwD-XHqS.js.map → busy-DgQ4ux5N.js.map} +1 -1
- package/dist/busy.cjs +1 -1
- package/dist/busy.js +1 -1
- package/dist/{button-nDZQe1ES.cjs → button-DFvR1iXX.cjs} +1 -1
- package/dist/{button-nDZQe1ES.cjs.map → button-DFvR1iXX.cjs.map} +1 -1
- package/dist/{button-qARUurjf.js → button-qbN1muQ0.js} +2 -2
- package/dist/{button-qARUurjf.js.map → button-qbN1muQ0.js.map} +1 -1
- package/dist/button.cjs +1 -1
- package/dist/button.js +3 -3
- package/dist/{card-D3IxxBBP.js → card-DAbr-7Vy.js} +2 -2
- package/dist/{card-D3IxxBBP.js.map → card-DAbr-7Vy.js.map} +1 -1
- package/dist/{card-DWZhZ5Ds.cjs → card-D_GlwZ5q.cjs} +1 -1
- package/dist/{card-DWZhZ5Ds.cjs.map → card-D_GlwZ5q.cjs.map} +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/{checkbox-t__wRS-9.js → checkbox-BNORaxMF.js} +2 -2
- package/dist/{checkbox-t__wRS-9.js.map → checkbox-BNORaxMF.js.map} +1 -1
- package/dist/{checkbox-BBttnA_a.cjs → checkbox-BUY_uc_r.cjs} +1 -1
- package/dist/{checkbox-BBttnA_a.cjs.map → checkbox-BUY_uc_r.cjs.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-DIZFWnDZ.cjs → chips-CXZ4dJCK.cjs} +1 -1
- package/dist/{chips-DIZFWnDZ.cjs.map → chips-CXZ4dJCK.cjs.map} +1 -1
- package/dist/{chips-xaoSmwBK.js → chips-Dg6Lk6BT.js} +4 -4
- package/dist/{chips-xaoSmwBK.js.map → chips-Dg6Lk6BT.js.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 +3 -3
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +1 -1
- package/dist/{date-range-8OkCahnR.js → date-range-BU6WX7d5.js} +3 -3
- package/dist/{date-range-8OkCahnR.js.map → date-range-BU6WX7d5.js.map} +1 -1
- package/dist/{date-range-Bbzg9aym.cjs → date-range-C-_be3_E.cjs} +1 -1
- package/dist/{date-range-Bbzg9aym.cjs.map → date-range-C-_be3_E.cjs.map} +1 -1
- package/dist/{date-range-inline-BEP-oWJZ.js → date-range-inline-7o7xtVIu.js} +2 -2
- package/dist/{date-range-inline-BEP-oWJZ.js.map → date-range-inline-7o7xtVIu.js.map} +1 -1
- package/dist/{date-range-inline-lhkwHFxY.cjs → date-range-inline-DJtUmHKF.cjs} +1 -1
- package/dist/{date-range-inline-lhkwHFxY.cjs.map → date-range-inline-DJtUmHKF.cjs.map} +1 -1
- package/dist/date-range-inline.cjs +1 -1
- package/dist/date-range-inline.js +1 -1
- package/dist/date-range.cjs +1 -1
- package/dist/date-range.js +1 -1
- package/dist/delay.cjs +1 -1
- package/dist/delay.js +2 -2
- package/dist/{details-3X9YKpuP.cjs → details-Bs0MyyvF.cjs} +1 -1
- package/dist/{details-3X9YKpuP.cjs.map → details-Bs0MyyvF.cjs.map} +1 -1
- package/dist/{details-BO_3CCNn.js → details-EfbDPVEo.js} +2 -2
- package/dist/{details-BO_3CCNn.js.map → details-EfbDPVEo.js.map} +1 -1
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/{directives-CPFrvZVC.cjs → directives-fLwDj6b0.cjs} +11 -11
- package/dist/directives-fLwDj6b0.cjs.map +1 -0
- package/dist/{directives-ltIff8q0.js → directives-zi1Mm2er.js} +233 -160
- package/dist/directives-zi1Mm2er.js.map +1 -0
- package/dist/directives.cjs +1 -1
- package/dist/directives.js +2 -2
- package/dist/{divider-BHgrisGQ.js → divider-CEPfrIwe.js} +2 -2
- package/dist/{divider-BHgrisGQ.js.map → divider-CEPfrIwe.js.map} +1 -1
- package/dist/{divider-D21yKZNJ.cjs → divider-CdIsWZrM.cjs} +1 -1
- package/dist/{divider-D21yKZNJ.cjs.map → divider-CdIsWZrM.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 +2 -2
- package/dist/{expand-wRphbpW6.cjs → expand--at1k3qo.cjs} +1 -1
- package/dist/{expand-wRphbpW6.cjs.map → expand--at1k3qo.cjs.map} +1 -1
- package/dist/{expand-2TTbmm_z.js → expand-g1vqqUp1.js} +3 -3
- package/dist/{expand-2TTbmm_z.js.map → expand-g1vqqUp1.js.map} +1 -1
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/{float-dtDqRmcL.js → float-DxVzgI9o.js} +2 -2
- package/dist/{float-dtDqRmcL.js.map → float-DxVzgI9o.js.map} +1 -1
- package/dist/{float-B0L_CH4v.cjs → float-P9HukAm-.cjs} +1 -1
- package/dist/{float-B0L_CH4v.cjs.map → float-P9HukAm-.cjs.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/{form-DvqHReDF.cjs → form-ByYhXe1p.cjs} +1 -1
- package/dist/{form-DvqHReDF.cjs.map → form-ByYhXe1p.cjs.map} +1 -1
- package/dist/{form-BxY-9F6N.js → form-CqLaozHp.js} +3 -3
- package/dist/{form-BxY-9F6N.js.map → form-CqLaozHp.js.map} +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.js +10 -10
- package/dist/handover/agent-runtime-followups.md +1 -1
- package/dist/handover/agent-runtime-v1.md +3 -3
- package/dist/{icons-CO8UrTJQ.js → icons-CkphcMp6.js} +2 -2
- package/dist/{icons-CO8UrTJQ.js.map → icons-CkphcMp6.js.map} +1 -1
- package/dist/{icons-BbC4t44c.cjs → icons-DYtiRU5V.cjs} +1 -1
- package/dist/{icons-BbC4t44c.cjs.map → icons-DYtiRU5V.cjs.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-BepoWz9Z.cjs → iframe-C3trkP8q.cjs} +1 -1
- package/dist/{iframe-BepoWz9Z.cjs.map → iframe-C3trkP8q.cjs.map} +1 -1
- package/dist/{iframe-t5zo89Fs.js → iframe-CjqJksl8.js} +2 -2
- package/dist/{iframe-t5zo89Fs.js.map → iframe-CjqJksl8.js.map} +1 -1
- package/dist/iframe.cjs +1 -1
- package/dist/iframe.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +37 -37
- package/dist/{input-2OR6wjfT.js → input-CG51zDVh.js} +2 -2
- package/dist/{input-2OR6wjfT.js.map → input-CG51zDVh.js.map} +1 -1
- package/dist/{input-B-wPPC5o.cjs → input-DuavpwNL.cjs} +1 -1
- package/dist/{input-B-wPPC5o.cjs.map → input-DuavpwNL.cjs.map} +1 -1
- package/dist/{input-chip-O5-pgek1.cjs → input-chip-57tgNXKT.cjs} +1 -1
- package/dist/{input-chip-O5-pgek1.cjs.map → input-chip-57tgNXKT.cjs.map} +1 -1
- package/dist/{input-chip-NBsnZkzu.js → input-chip-C6Lq1927.js} +2 -2
- package/dist/{input-chip-NBsnZkzu.js.map → input-chip-C6Lq1927.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 +3 -3
- package/dist/kbd.cjs +1 -1
- package/dist/kbd.js +2 -2
- package/dist/{layout-D7nKwpa5.cjs → layout-6ipbiWTl.cjs} +1 -1
- package/dist/{layout-D7nKwpa5.cjs.map → layout-6ipbiWTl.cjs.map} +1 -1
- package/dist/{layout-CJ01zE9V.js → layout-D4IOwx7p.js} +1 -1
- package/dist/{layout-CJ01zE9V.js.map → layout-D4IOwx7p.js.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +2 -2
- package/dist/{lightbox-Droe9dYY.js → lightbox-CsyO2XSr.js} +2 -2
- package/dist/{lightbox-Droe9dYY.js.map → lightbox-CsyO2XSr.js.map} +1 -1
- package/dist/{lightbox-DVpvjsYb.cjs → lightbox-H8pVWGMX.cjs} +1 -1
- package/dist/{lightbox-DVpvjsYb.cjs.map → lightbox-H8pVWGMX.cjs.map} +1 -1
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/{list-DzAWv99q.js → list-BAwH0pQW.js} +2 -2
- package/dist/{list-DzAWv99q.js.map → list-BAwH0pQW.js.map} +1 -1
- package/dist/{list-JjUsFCP6.cjs → list-Bs9m8kw7.cjs} +1 -1
- package/dist/{list-JjUsFCP6.cjs.map → list-Bs9m8kw7.cjs.map} +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/{menu-B5EKUeeD.cjs → menu-BMcGzj1h.cjs} +1 -1
- package/dist/{menu-B5EKUeeD.cjs.map → menu-BMcGzj1h.cjs.map} +1 -1
- package/dist/{menu-CgdXrzir.js → menu-tQVARVaC.js} +3 -3
- package/dist/{menu-CgdXrzir.js.map → menu-tQVARVaC.js.map} +1 -1
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/{mixins-Cevarn7V.js → mixins-Bp0wIHg2.js} +1 -1
- package/dist/{mixins-Cevarn7V.js.map → mixins-Bp0wIHg2.js.map} +1 -1
- package/dist/{mixins-JyO9GSGy.cjs → mixins-CGXSzZc7.cjs} +1 -1
- package/dist/{mixins-JyO9GSGy.cjs.map → mixins-CGXSzZc7.cjs.map} +1 -1
- 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 +1 -1
- package/dist/navigation-rail.js +2 -2
- package/dist/{notification-CaeRS5US.cjs → notification-Bz00zdpV.cjs} +1 -1
- package/dist/{notification-CaeRS5US.cjs.map → notification-Bz00zdpV.cjs.map} +1 -1
- package/dist/{notification-Dxwx0Zln.js → notification-D1tX2nx5.js} +4 -4
- package/dist/{notification-Dxwx0Zln.js.map → notification-D1tX2nx5.js.map} +1 -1
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/{option-C6wXFQOM.cjs → option-BnybLEDO.cjs} +1 -1
- package/dist/{option-C6wXFQOM.cjs.map → option-BnybLEDO.cjs.map} +1 -1
- package/dist/{option-BCnYutZz.js → option-BpGV8Apj.js} +2 -2
- package/dist/{option-BCnYutZz.js.map → option-BpGV8Apj.js.map} +1 -1
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/{overlay-BWcB2pRx.js → overlay-BpNhd74N.js} +24 -7
- package/dist/overlay-BpNhd74N.js.map +1 -0
- package/dist/{overlay-5PMZ75PO.cjs → overlay-UQR2Dy3u.cjs} +18 -3
- package/dist/overlay-UQR2Dy3u.cjs.map +1 -0
- package/dist/overlay.cjs +1 -1
- package/dist/{overlay.confirm-body-B7W0DOGS.js → overlay.confirm-body-BHcXu5Wk.js} +6 -6
- package/dist/{overlay.confirm-body-B7W0DOGS.js.map → overlay.confirm-body-BHcXu5Wk.js.map} +1 -1
- package/dist/{overlay.confirm-body-CsvwcBvG.cjs → overlay.confirm-body-CVDtVk5X.cjs} +1 -1
- package/dist/{overlay.confirm-body-CsvwcBvG.cjs.map → overlay.confirm-body-CVDtVk5X.cjs.map} +1 -1
- package/dist/overlay.js +3 -3
- package/dist/{overlay.service-CC4zckoV.cjs → overlay.service-C8RsQzgM.cjs} +1 -1
- package/dist/{overlay.service-CC4zckoV.cjs.map → overlay.service-C8RsQzgM.cjs.map} +1 -1
- package/dist/{overlay.service-zx465FI8.js → overlay.service-DTE6NwIM.js} +2 -2
- package/dist/{overlay.service-zx465FI8.js.map → overlay.service-DTE6NwIM.js.map} +1 -1
- package/dist/{progress-BoFm3r6h.js → progress-CAKsxp29.js} +2 -2
- package/dist/{progress-BoFm3r6h.js.map → progress-CAKsxp29.js.map} +1 -1
- package/dist/{progress-Bc_IBaNH.cjs → progress-gbIALDRs.cjs} +1 -1
- package/dist/{progress-Bc_IBaNH.cjs.map → progress-gbIALDRs.cjs.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/{radio-group-C34WDjrN.cjs → radio-group-CfJ5DtI4.cjs} +1 -1
- package/dist/{radio-group-C34WDjrN.cjs.map → radio-group-CfJ5DtI4.cjs.map} +1 -1
- package/dist/{radio-group-DnHhGrXp.js → radio-group-otyvZvUk.js} +2 -2
- package/dist/{radio-group-DnHhGrXp.js.map → radio-group-otyvZvUk.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 +2 -2
- package/dist/{select-ypXSw5IR.cjs → select-81jniVTs.cjs} +1 -1
- package/dist/{select-ypXSw5IR.cjs.map → select-81jniVTs.cjs.map} +1 -1
- package/dist/{select-oZGIVus4.js → select-9vXx1fhr.js} +3 -3
- package/dist/{select-oZGIVus4.js.map → select-9vXx1fhr.js.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 +2 -2
- package/dist/skills/boat.md +27 -18
- package/dist/skills/schmancy/boat.md +27 -18
- package/dist/slider.cjs +1 -1
- package/dist/slider.js +2 -2
- package/dist/{sound.service-Czs3gmRx.cjs → sound.service-CmIw63aM.cjs} +1 -1
- package/dist/{sound.service-Czs3gmRx.cjs.map → sound.service-CmIw63aM.cjs.map} +1 -1
- package/dist/{sound.service-Cuo4-X_-.js → sound.service-D3ZSq1Kj.js} +1 -1
- package/dist/{sound.service-Cuo4-X_-.js.map → sound.service-D3ZSq1Kj.js.map} +1 -1
- package/dist/{splash-screen-CbcYpkIx.js → splash-screen-BOjrmGLk.js} +2 -2
- package/dist/{splash-screen-CbcYpkIx.js.map → splash-screen-BOjrmGLk.js.map} +1 -1
- package/dist/{splash-screen-C0oeDPxV.cjs → splash-screen-C5KAWXvA.cjs} +1 -1
- package/dist/{splash-screen-C0oeDPxV.cjs.map → splash-screen-C5KAWXvA.cjs.map} +1 -1
- package/dist/splash-screen.cjs +1 -1
- package/dist/splash-screen.js +1 -1
- package/dist/{src-_OZKm1Am.cjs → src-Bm1vop0l.cjs} +1 -1
- package/dist/{src-_OZKm1Am.cjs.map → src-Bm1vop0l.cjs.map} +1 -1
- package/dist/{src-CDdxnUbF.js → src-DoOhMBtI.js} +35 -35
- package/dist/{src-CDdxnUbF.js.map → src-DoOhMBtI.js.map} +1 -1
- package/dist/{state-B-5H9i10.js → state-CWBRTSvE.js} +1 -1
- package/dist/{state-B-5H9i10.js.map → state-CWBRTSvE.js.map} +1 -1
- package/dist/{state-D85Se4Fx.cjs → state-Cex3rmx2.cjs} +1 -1
- package/dist/{state-D85Se4Fx.cjs.map → state-Cex3rmx2.cjs.map} +1 -1
- package/dist/state.cjs +1 -1
- package/dist/state.js +2 -2
- package/dist/steps.cjs +1 -1
- package/dist/steps.js +2 -2
- package/dist/{surface-gZpeCF6E.js → surface-9S5scTsD.js} +2 -2
- package/dist/{surface-gZpeCF6E.js.map → surface-9S5scTsD.js.map} +1 -1
- package/dist/{surface-DHPaLOTA.cjs → surface-PfiejLuw.cjs} +1 -1
- package/dist/{surface-DHPaLOTA.cjs.map → surface-PfiejLuw.cjs.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 +2 -2
- package/dist/table.cjs +1 -1
- package/dist/table.js +2 -2
- package/dist/{tabs-DJNdoE-x.js → tabs-BBOjAmgG.js} +2 -2
- package/dist/{tabs-DJNdoE-x.js.map → tabs-BBOjAmgG.js.map} +1 -1
- package/dist/{tabs-DgaVwuOo.cjs → tabs-uYvb1P06.cjs} +1 -1
- package/dist/{tabs-DgaVwuOo.cjs.map → tabs-uYvb1P06.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-8x0prbgm.js → textarea-QzSj8Dkl.js} +2 -2
- package/dist/{textarea-8x0prbgm.js.map → textarea-QzSj8Dkl.js.map} +1 -1
- package/dist/{textarea-2QE5z6Ny.cjs → textarea-YPHX4g7Y.cjs} +1 -1
- package/dist/{textarea-2QE5z6Ny.cjs.map → textarea-YPHX4g7Y.cjs.map} +1 -1
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-DSD9Bs69.js → theme-C2Mp-VGt.js} +4 -4
- package/dist/{theme-DSD9Bs69.js.map → theme-C2Mp-VGt.js.map} +1 -1
- package/dist/{theme-button-Dpr6SGzB.cjs → theme-button-CJmhxfMe.cjs} +1 -1
- package/dist/{theme-button-Dpr6SGzB.cjs.map → theme-button-CJmhxfMe.cjs.map} +1 -1
- package/dist/{theme-button-nd6Z7plT.js → theme-button-DGWAXhzd.js} +2 -2
- package/dist/{theme-button-nd6Z7plT.js.map → theme-button-DGWAXhzd.js.map} +1 -1
- package/dist/theme-button.cjs +1 -1
- package/dist/theme-button.js +1 -1
- package/dist/{theme-D0yboni1.cjs → theme-iKUaS9JB.cjs} +1 -1
- package/dist/{theme-D0yboni1.cjs.map → theme-iKUaS9JB.cjs.map} +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/theme.js +3 -3
- package/dist/{theme.service-mRlvWZVs.js → theme.service-hc4N-1Oz.js} +1 -1
- package/dist/{theme.service-mRlvWZVs.js.map → theme.service-hc4N-1Oz.js.map} +1 -1
- package/dist/{theme.service-LtQw04e6.cjs → theme.service-p61RsJBF.cjs} +1 -1
- package/dist/{theme.service-LtQw04e6.cjs.map → theme.service-p61RsJBF.cjs.map} +1 -1
- package/dist/tree.cjs +1 -1
- package/dist/tree.js +2 -2
- package/dist/{typography-CiZQpzE4.cjs → typography-Bdt8RlX2.cjs} +1 -1
- package/dist/{typography-CiZQpzE4.cjs.map → typography-Bdt8RlX2.cjs.map} +1 -1
- package/dist/{typography-DXyf-KdK.js → typography-DwV0sqht.js} +2 -2
- package/dist/{typography-DXyf-KdK.js.map → typography-DwV0sqht.js.map} +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +1 -1
- package/dist/visually-hidden.cjs +1 -1
- package/dist/visually-hidden.js +2 -2
- package/dist/{window-qKfP5c6M.cjs → window-D2WfvNng.cjs} +1 -1
- package/dist/{window-qKfP5c6M.cjs.map → window-D2WfvNng.cjs.map} +1 -1
- package/dist/{window-C_ATa3qM.js → window-n4jN60B_.js} +3 -3
- package/dist/{window-C_ATa3qM.js.map → window-n4jN60B_.js.map} +1 -1
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/package.json +21 -21
- package/skills/schmancy/boat.md +27 -18
- package/src/boat/boat.ts +121 -365
- package/src/directives/art/art.directive.ts +4 -2
- package/src/directives/art/effects/starfield.ts +222 -77
- package/src/directives/art/types.ts +41 -6
- package/src/overlay/overlay.component.ts +28 -0
- package/types/src/boat/boat.d.ts +18 -25
- package/types/src/directives/art/effects/starfield.d.ts +11 -4
- package/types/src/directives/art/types.d.ts +41 -6
- package/types/src/overlay/overlay.component.d.ts +1 -0
- package/dist/SchmancyElement-D8_z9JrW.cjs +0 -2
- package/dist/SchmancyElement-DuzT2AMa.js +0 -284
- package/dist/boat-CEaQaCmG.js +0 -339
- package/dist/boat-CEaQaCmG.js.map +0 -1
- package/dist/boat-CI5rcGS5.cjs +0 -85
- package/dist/boat-CI5rcGS5.cjs.map +0 -1
- package/dist/directives-CPFrvZVC.cjs.map +0 -1
- package/dist/directives-ltIff8q0.js.map +0 -1
- package/dist/overlay-5PMZ75PO.cjs.map +0 -1
- package/dist/overlay-BWcB2pRx.js.map +0 -1
|
@@ -1,107 +1,252 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Starfield Effect —
|
|
2
|
+
* Starfield Effect — surreal deep-space drift with rare comets.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* A recessive page backdrop. One <canvas>; stars live in
|
|
5
|
+
* structure-of-arrays Float32Array tables (zero per-frame allocation) and
|
|
6
|
+
* render as pre-rendered glow sprites via drawImage — no gradient is built
|
|
7
|
+
* inside the RAF loop. Three parallax depth layers drift on slow orbit paths;
|
|
8
|
+
* colour temperature runs blue-white → warm; entrance reveals far→near in
|
|
9
|
+
* waves behind a faint corner nebula; a pooled comet streaks by rarely.
|
|
10
|
+
* Sparse and dim by design — tune reach with the `density` ArtOption.
|
|
11
|
+
*
|
|
12
|
+
* Performance budget: ≤ MAX_STAR_COUNT drawImage calls + one nebula blit per
|
|
13
|
+
* frame, dpr capped at 2, the whole field idle under prefers-reduced-motion.
|
|
7
14
|
*/
|
|
8
15
|
|
|
9
16
|
import type { ArtState } from '../types'
|
|
10
17
|
import { createOverlayContainer } from '../utils'
|
|
11
18
|
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
const appearDelay = g * 0.6
|
|
28
|
-
return {
|
|
29
|
-
bg: stops.join(','),
|
|
30
|
-
appearDelay,
|
|
31
|
-
twinkleDuration: 5 + g * 0.7,
|
|
32
|
-
twinkleDelay: appearDelay + 2.5,
|
|
33
|
-
}
|
|
34
|
-
})
|
|
35
|
-
}
|
|
19
|
+
const BASE_STAR_COUNT = 90
|
|
20
|
+
// Hard ceiling: a wide monitor must never carpet, whatever the density prop asks.
|
|
21
|
+
const MAX_STAR_COUNT = 140
|
|
22
|
+
const COMET_POOL = 3
|
|
23
|
+
const APPEAR_DURATION = 2.5
|
|
24
|
+
const SPRITE_PX = 64
|
|
25
|
+
// Cool → warm. Index 0 is the dominant blue-white; the tail warms toward amber.
|
|
26
|
+
const TEMPERATURE_RGB = [
|
|
27
|
+
[205, 222, 255],
|
|
28
|
+
[224, 233, 255],
|
|
29
|
+
[255, 255, 255],
|
|
30
|
+
[255, 240, 214],
|
|
31
|
+
[255, 222, 184],
|
|
32
|
+
]
|
|
36
33
|
|
|
37
34
|
export function createStarfieldOverlay(state: ArtState): void {
|
|
38
35
|
const { element } = state
|
|
39
36
|
const overlay = createOverlayContainer('starfield-overlay')
|
|
40
37
|
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
overlay.appendChild(
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
38
|
+
const canvas = document.createElement('canvas')
|
|
39
|
+
canvas.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;'
|
|
40
|
+
overlay.appendChild(canvas)
|
|
41
|
+
element.appendChild(overlay)
|
|
42
|
+
|
|
43
|
+
const ctx = canvas.getContext('2d')
|
|
44
|
+
if (!ctx) return
|
|
45
|
+
|
|
46
|
+
const dpr = Math.min(window.devicePixelRatio || 1, 2)
|
|
47
|
+
const rect = element.getBoundingClientRect()
|
|
48
|
+
const deviceWidth = Math.max(1, Math.round(rect.width * dpr))
|
|
49
|
+
const deviceHeight = Math.max(1, Math.round(rect.height * dpr))
|
|
50
|
+
canvas.width = deviceWidth
|
|
51
|
+
canvas.height = deviceHeight
|
|
52
|
+
|
|
53
|
+
const sprites = TEMPERATURE_RGB.map(([r, g, b]) => {
|
|
54
|
+
const s = document.createElement('canvas')
|
|
55
|
+
s.width = SPRITE_PX
|
|
56
|
+
s.height = SPRITE_PX
|
|
57
|
+
const sc = s.getContext('2d')!
|
|
58
|
+
const grad = sc.createRadialGradient(SPRITE_PX / 2, SPRITE_PX / 2, 0, SPRITE_PX / 2, SPRITE_PX / 2, SPRITE_PX / 2)
|
|
59
|
+
grad.addColorStop(0, `rgba(${r},${g},${b},1)`)
|
|
60
|
+
grad.addColorStop(0.18, `rgba(${r},${g},${b},0.35)`)
|
|
61
|
+
grad.addColorStop(0.5, `rgba(${r},${g},${b},0)`)
|
|
62
|
+
sc.fillStyle = grad
|
|
63
|
+
sc.fillRect(0, 0, SPRITE_PX, SPRITE_PX)
|
|
64
|
+
return s
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
const nebula = document.createElement('canvas')
|
|
68
|
+
nebula.width = 512
|
|
69
|
+
nebula.height = 512
|
|
70
|
+
const nc = nebula.getContext('2d')!
|
|
71
|
+
const ng = nc.createRadialGradient(256, 256, 0, 256, 256, 256)
|
|
72
|
+
ng.addColorStop(0, 'rgba(150,170,255,0.16)')
|
|
73
|
+
ng.addColorStop(0.4, 'rgba(120,110,210,0.07)')
|
|
74
|
+
ng.addColorStop(1, 'rgba(0,0,0,0)')
|
|
75
|
+
nc.fillStyle = ng
|
|
76
|
+
nc.fillRect(0, 0, 512, 512)
|
|
77
|
+
|
|
78
|
+
const starCount = Math.min(
|
|
79
|
+
MAX_STAR_COUNT,
|
|
80
|
+
Math.round(BASE_STAR_COUNT * Math.min(1, Math.max(0.5, (rect.width * rect.height) / (1280 * 720))) * state.density),
|
|
81
|
+
)
|
|
82
|
+
const sx = new Float32Array(starCount)
|
|
83
|
+
const sy = new Float32Array(starCount)
|
|
84
|
+
const sr = new Float32Array(starCount)
|
|
85
|
+
const sphase = new Float32Array(starCount)
|
|
86
|
+
const stwinkle = new Float32Array(starCount)
|
|
87
|
+
const sdepth = new Float32Array(starCount)
|
|
88
|
+
const sbucket = new Uint8Array(starCount)
|
|
89
|
+
const sappear = new Float32Array(starCount)
|
|
90
|
+
|
|
91
|
+
for (let i = 0; i < starCount; i++) {
|
|
92
|
+
const depthBand = i % 3 // 0 far, 1 mid, 2 near — even split across layers
|
|
93
|
+
const depth = depthBand === 0 ? 0.18 : depthBand === 1 ? 0.5 : 1
|
|
94
|
+
sx[i] = Math.random()
|
|
95
|
+
sy[i] = Math.random()
|
|
96
|
+
sr[i] = (0.7 + Math.random() * 1.6) * (0.6 + 0.7 * depth)
|
|
97
|
+
sphase[i] = Math.random() * Math.PI * 2
|
|
98
|
+
stwinkle[i] = 0.6 + Math.random() * 1.8
|
|
99
|
+
sdepth[i] = depth
|
|
100
|
+
// Field skews blue-white; only a minority warms — that asymmetry reads as authored.
|
|
101
|
+
sbucket[i] = Math.random() < 0.7 ? (Math.random() < 0.5 ? 0 : 1) : 2 + Math.floor(Math.random() * 3)
|
|
102
|
+
// Far layer arrives first, near layer last → the depth reveals as waves.
|
|
103
|
+
sappear[i] = (1 - depth) * 1.6 + Math.random() * 0.8
|
|
58
104
|
}
|
|
59
105
|
|
|
60
|
-
element.appendChild(overlay)
|
|
61
106
|
state.overlayElement = overlay
|
|
62
|
-
state.starfield = {
|
|
107
|
+
state.starfield = {
|
|
108
|
+
canvas,
|
|
109
|
+
ctx,
|
|
110
|
+
sprites,
|
|
111
|
+
nebula,
|
|
112
|
+
starCount,
|
|
113
|
+
sx,
|
|
114
|
+
sy,
|
|
115
|
+
sr,
|
|
116
|
+
sphase,
|
|
117
|
+
stwinkle,
|
|
118
|
+
sdepth,
|
|
119
|
+
sbucket,
|
|
120
|
+
sappear,
|
|
121
|
+
cx: new Float32Array(COMET_POOL),
|
|
122
|
+
cy: new Float32Array(COMET_POOL),
|
|
123
|
+
cvx: new Float32Array(COMET_POOL),
|
|
124
|
+
cvy: new Float32Array(COMET_POOL),
|
|
125
|
+
clife: new Float32Array(COMET_POOL),
|
|
126
|
+
cometCount: COMET_POOL,
|
|
127
|
+
nextCometAt: performance.now() + 14000 + Math.random() * 16000,
|
|
128
|
+
dpr,
|
|
129
|
+
deviceWidth,
|
|
130
|
+
deviceHeight,
|
|
131
|
+
reducedMotion: window.matchMedia('(prefers-reduced-motion: reduce)').matches,
|
|
132
|
+
drawnStatic: false,
|
|
133
|
+
lastFrame: performance.now(),
|
|
134
|
+
startTime: performance.now(),
|
|
135
|
+
}
|
|
63
136
|
}
|
|
64
137
|
|
|
65
138
|
export function animateStarfield(state: ArtState, currentTime: number): void {
|
|
66
|
-
|
|
139
|
+
const sf = state.starfield
|
|
140
|
+
if (!sf) return
|
|
67
141
|
|
|
68
142
|
const { intensity = 1, speed = 1 } = state
|
|
69
|
-
const {
|
|
70
|
-
|
|
143
|
+
const { ctx, canvas } = sf
|
|
144
|
+
|
|
145
|
+
if (intensity <= 0) {
|
|
146
|
+
ctx.clearRect(0, 0, sf.deviceWidth, sf.deviceHeight)
|
|
147
|
+
return
|
|
148
|
+
}
|
|
71
149
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
150
|
+
// One layout read per frame; resize only when the backing store must change.
|
|
151
|
+
const cssW = canvas.clientWidth
|
|
152
|
+
const cssH = canvas.clientHeight
|
|
153
|
+
const wantW = Math.max(1, Math.round(cssW * sf.dpr))
|
|
154
|
+
const wantH = Math.max(1, Math.round(cssH * sf.dpr))
|
|
155
|
+
if (wantW !== sf.deviceWidth || wantH !== sf.deviceHeight) {
|
|
156
|
+
canvas.width = wantW
|
|
157
|
+
canvas.height = wantH
|
|
158
|
+
sf.deviceWidth = wantW
|
|
159
|
+
sf.deviceHeight = wantH
|
|
160
|
+
sf.drawnStatic = false
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const W = sf.deviceWidth
|
|
164
|
+
const H = sf.deviceHeight
|
|
165
|
+
|
|
166
|
+
if (sf.reducedMotion && sf.drawnStatic) return
|
|
167
|
+
|
|
168
|
+
const elapsed = ((currentTime - sf.startTime) / 1000) * speed
|
|
169
|
+
const dt = Math.min((currentTime - sf.lastFrame) / 1000, 0.05)
|
|
170
|
+
sf.lastFrame = currentTime
|
|
171
|
+
|
|
172
|
+
ctx.clearRect(0, 0, W, H)
|
|
173
|
+
|
|
174
|
+
// Entrance nebula: blooms in over the first ~4s, then holds at a faint floor.
|
|
175
|
+
const nebulaAlpha = (Math.min(1, elapsed / 4) * 0.7 + 0.3) * 0.14 * intensity
|
|
176
|
+
if (nebulaAlpha > 0.001) {
|
|
177
|
+
const nSize = Math.max(W, H) * 1.3
|
|
178
|
+
ctx.globalAlpha = nebulaAlpha
|
|
179
|
+
ctx.drawImage(sf.nebula, W * 0.78 - nSize / 2, H * 0.28 - nSize / 2, nSize, nSize)
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Normal compositing — additive blend is what turned overlap into a glowing carpet.
|
|
183
|
+
for (let i = 0; i < sf.starCount; i++) {
|
|
184
|
+
const appear = sf.sappear[i]
|
|
185
|
+
let reveal: number
|
|
186
|
+
if (sf.reducedMotion) {
|
|
187
|
+
reveal = 1
|
|
188
|
+
} else if (elapsed < appear) {
|
|
75
189
|
continue
|
|
190
|
+
} else if (elapsed < appear + APPEAR_DURATION) {
|
|
191
|
+
const t = (elapsed - appear) / APPEAR_DURATION
|
|
192
|
+
reveal = 1 - (1 - t) * (1 - t) * (1 - t)
|
|
193
|
+
} else {
|
|
194
|
+
reveal = 1
|
|
76
195
|
}
|
|
77
196
|
|
|
78
|
-
const
|
|
79
|
-
const
|
|
80
|
-
let opacity: number
|
|
197
|
+
const depth = sf.sdepth[i]
|
|
198
|
+
const twinkle = sf.reducedMotion ? 0.9 : 0.82 + 0.18 * Math.sin(elapsed * sf.stwinkle[i] + sf.sphase[i])
|
|
81
199
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
200
|
+
// Slow orbit drift, amplitude scaled by depth — the parallax is the surreality.
|
|
201
|
+
const driftAmp = sf.reducedMotion ? 0 : depth * 14 * sf.dpr
|
|
202
|
+
const px = sf.sx[i] * W + Math.sin(elapsed * 0.05 + sf.sphase[i]) * driftAmp
|
|
203
|
+
const py = sf.sy[i] * H + Math.cos(elapsed * 0.04 + sf.sphase[i]) * driftAmp * 0.6
|
|
204
|
+
|
|
205
|
+
const size = sf.sr[i] * sf.dpr * 2.3
|
|
206
|
+
ctx.globalAlpha = reveal * twinkle * (0.3 + 0.5 * depth) * intensity
|
|
207
|
+
ctx.drawImage(sf.sprites[sf.sbucket[i]], px - size, py - size, size * 2, size * 2)
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (!sf.reducedMotion) {
|
|
211
|
+
if (currentTime >= sf.nextCometAt) {
|
|
212
|
+
for (let c = 0; c < sf.cometCount; c++) {
|
|
213
|
+
if (sf.clife[c] > 0) continue
|
|
214
|
+
const fromLeft = Math.random() < 0.5
|
|
215
|
+
sf.cx[c] = (fromLeft ? -0.05 : 1.05) * W
|
|
216
|
+
sf.cy[c] = Math.random() * 0.45 * H
|
|
217
|
+
const sp = (520 + Math.random() * 420) * sf.dpr
|
|
218
|
+
sf.cvx[c] = (fromLeft ? 1 : -1) * sp
|
|
219
|
+
sf.cvy[c] = (0.35 + Math.random() * 0.35) * sp
|
|
220
|
+
sf.clife[c] = 1
|
|
221
|
+
break
|
|
102
222
|
}
|
|
223
|
+
sf.nextCometAt = currentTime + (20000 + Math.random() * 25000) / speed
|
|
103
224
|
}
|
|
104
225
|
|
|
105
|
-
|
|
226
|
+
for (let c = 0; c < sf.cometCount; c++) {
|
|
227
|
+
if (sf.clife[c] <= 0) continue
|
|
228
|
+
sf.cx[c] += sf.cvx[c] * dt * speed
|
|
229
|
+
sf.cy[c] += sf.cvy[c] * dt * speed
|
|
230
|
+
sf.clife[c] -= dt / 1.6
|
|
231
|
+
|
|
232
|
+
const tailX = sf.cx[c] - sf.cvx[c] * 0.16
|
|
233
|
+
const tailY = sf.cy[c] - sf.cvy[c] * 0.16
|
|
234
|
+
const grad = ctx.createLinearGradient(sf.cx[c], sf.cy[c], tailX, tailY)
|
|
235
|
+
const headA = Math.max(0, Math.min(1, sf.clife[c])) * 0.55 * intensity
|
|
236
|
+
grad.addColorStop(0, `rgba(255,255,255,${headA})`)
|
|
237
|
+
grad.addColorStop(0.4, `rgba(190,210,255,${headA * 0.4})`)
|
|
238
|
+
grad.addColorStop(1, 'rgba(190,210,255,0)')
|
|
239
|
+
ctx.globalAlpha = 1
|
|
240
|
+
ctx.strokeStyle = grad
|
|
241
|
+
ctx.lineWidth = 2 * sf.dpr
|
|
242
|
+
ctx.lineCap = 'round'
|
|
243
|
+
ctx.beginPath()
|
|
244
|
+
ctx.moveTo(sf.cx[c], sf.cy[c])
|
|
245
|
+
ctx.lineTo(tailX, tailY)
|
|
246
|
+
ctx.stroke()
|
|
247
|
+
}
|
|
106
248
|
}
|
|
249
|
+
|
|
250
|
+
ctx.globalAlpha = 1
|
|
251
|
+
sf.drawnStatic = true
|
|
107
252
|
}
|
|
@@ -15,6 +15,8 @@ export interface ArtOptions {
|
|
|
15
15
|
intensity?: number
|
|
16
16
|
/** Animation speed multiplier: 0.5 = half speed, 1 = normal, 2 = double (default: 1) */
|
|
17
17
|
speed?: number
|
|
18
|
+
/** Particle density multiplier: 0.5 = sparse, 1 = baseline, 2 = dense (default: 1; starfield only) */
|
|
19
|
+
density?: number
|
|
18
20
|
}
|
|
19
21
|
|
|
20
22
|
export interface Particle<T extends SVGElement = SVGElement> {
|
|
@@ -52,6 +54,7 @@ export interface ArtState {
|
|
|
52
54
|
color: string
|
|
53
55
|
intensity: number
|
|
54
56
|
speed: number
|
|
57
|
+
density: number
|
|
55
58
|
element: HTMLElement
|
|
56
59
|
overlayElement?: HTMLElement
|
|
57
60
|
animationId?: number
|
|
@@ -118,12 +121,44 @@ export interface ArtState {
|
|
|
118
121
|
}
|
|
119
122
|
|
|
120
123
|
starfield?: {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
124
|
+
canvas: HTMLCanvasElement
|
|
125
|
+
ctx: CanvasRenderingContext2D
|
|
126
|
+
/** Pre-rendered glow sprites, cool→warm. Drawn per star so no per-frame gradient is built. */
|
|
127
|
+
sprites: HTMLCanvasElement[]
|
|
128
|
+
/** Pre-rendered entrance nebula bloom, drawn once per frame at a computed alpha. */
|
|
129
|
+
nebula: HTMLCanvasElement
|
|
130
|
+
starCount: number
|
|
131
|
+
/** Structure-of-arrays star table — cache-friendly, zero allocation per frame. */
|
|
132
|
+
sx: Float32Array
|
|
133
|
+
sy: Float32Array
|
|
134
|
+
sr: Float32Array
|
|
135
|
+
sphase: Float32Array
|
|
136
|
+
stwinkle: Float32Array
|
|
137
|
+
/** 0 = far (drifts least, dimmest) → 1 = near (drifts most, brightest). */
|
|
138
|
+
sdepth: Float32Array
|
|
139
|
+
/** Index into `sprites` — fixes each star's colour temperature for its life. */
|
|
140
|
+
sbucket: Uint8Array
|
|
141
|
+
/** Per-star entrance delay (s) so the field reveals far→near in waves. */
|
|
142
|
+
sappear: Float32Array
|
|
143
|
+
/** Fixed comet pool. `life <= 0` marks a free slot; no array churn. */
|
|
144
|
+
cx: Float32Array
|
|
145
|
+
cy: Float32Array
|
|
146
|
+
cvx: Float32Array
|
|
147
|
+
cvy: Float32Array
|
|
148
|
+
clife: Float32Array
|
|
149
|
+
cometCount: number
|
|
150
|
+
/** ms timestamp of the next comet spawn — gates the rare streak. */
|
|
151
|
+
nextCometAt: number
|
|
152
|
+
/** Capped device-pixel-ratio; bounds backing-store fill cost on retina. */
|
|
153
|
+
dpr: number
|
|
154
|
+
/** Cached device-pixel canvas size; a change is the only resize trigger. */
|
|
155
|
+
deviceWidth: number
|
|
156
|
+
deviceHeight: number
|
|
157
|
+
/** Static-render once, then idle the RAF loop. */
|
|
158
|
+
reducedMotion: boolean
|
|
159
|
+
drawnStatic: boolean
|
|
160
|
+
/** Previous frame ms — frame-rate-independent comet motion + jump clamp. */
|
|
161
|
+
lastFrame: number
|
|
127
162
|
startTime: number
|
|
128
163
|
}
|
|
129
164
|
}
|
|
@@ -96,6 +96,21 @@ export class SchmancyOverlay extends SchmancyElement {
|
|
|
96
96
|
margin: 0;
|
|
97
97
|
border: 0;
|
|
98
98
|
}
|
|
99
|
+
/* Modal tier promotes the whole shell (scrim + surface) into the top
|
|
100
|
+
* layer so every overlay — anchored or modal — shares ONE stacking
|
|
101
|
+
* domain ordered strictly by show() time. Neutralize the UA popover
|
|
102
|
+
* box so the shell stays full-viewport. */
|
|
103
|
+
.shell:popover-open {
|
|
104
|
+
inset: 0;
|
|
105
|
+
margin: 0;
|
|
106
|
+
border: 0;
|
|
107
|
+
width: 100%;
|
|
108
|
+
height: 100%;
|
|
109
|
+
max-width: none;
|
|
110
|
+
max-height: none;
|
|
111
|
+
background: transparent;
|
|
112
|
+
overflow: visible;
|
|
113
|
+
}
|
|
99
114
|
`]
|
|
100
115
|
|
|
101
116
|
@property({ type: String, reflect: true }) layout: OverlayLayout = 'sheet'
|
|
@@ -107,6 +122,7 @@ export class SchmancyOverlay extends SchmancyElement {
|
|
|
107
122
|
|
|
108
123
|
@query('.backdrop') private _backdrop?: HTMLDivElement
|
|
109
124
|
@query('.surface') private _surface!: HTMLElement
|
|
125
|
+
@query('.shell') private _shell?: HTMLElement
|
|
110
126
|
|
|
111
127
|
/** Close trigger for the service; emits the reason + detail payload. */
|
|
112
128
|
private readonly _closed$ = new Subject<{ reason: CloseReason; result?: unknown }>()
|
|
@@ -203,6 +219,18 @@ export class SchmancyOverlay extends SchmancyElement {
|
|
|
203
219
|
.pipe(takeUntil(this.disconnecting))
|
|
204
220
|
.subscribe()
|
|
205
221
|
this._positionerTeardown = () => floatSub.unsubscribe()
|
|
222
|
+
} else if (this.tier === 'modal' && this._shell) {
|
|
223
|
+
// Promote the whole modal shell (scrim + surface) into the native
|
|
224
|
+
// top layer — the same domain anchored tiers already use. The top
|
|
225
|
+
// layer paints strictly in show() order, so a sheet opened from
|
|
226
|
+
// inside an earlier anchored overlay correctly stacks above it
|
|
227
|
+
// (and recedes behind anything opened after it). Degrade silently
|
|
228
|
+
// to the legacy z-index host on browsers without the Popover API.
|
|
229
|
+
try {
|
|
230
|
+
this._positionerTeardown = positionPopoverAPI(this._shell)
|
|
231
|
+
} catch {
|
|
232
|
+
// no Popover API support — keep the host z-index:10000 path.
|
|
233
|
+
}
|
|
206
234
|
}
|
|
207
235
|
|
|
208
236
|
// Set the anchor-origin CSS vars so the entrance animation blooms
|
package/types/src/boat/boat.d.ts
CHANGED
|
@@ -1,53 +1,46 @@
|
|
|
1
1
|
import { SchmancyElement } from '@mixins/index';
|
|
2
|
+
import { type PropertyValues } from 'lit';
|
|
2
3
|
type Corner = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
|
|
3
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Material-3 extended FAB that delegates its expanded panel to the `show()`
|
|
6
|
+
* overlay service. Collapsed: a draggable, corner-anchored pill (icon + label,
|
|
7
|
+
* circular when no label). Activated: the default-slot content blooms from the
|
|
8
|
+
* FAB as an overlay (backdrop / Esc / back-button / sheet-on-narrow handled by
|
|
9
|
+
* the overlay primitive).
|
|
10
|
+
*/
|
|
4
11
|
export default class SchmancyBoat extends SchmancyElement {
|
|
12
|
+
#private;
|
|
5
13
|
static styles: import("lit").CSSResult[];
|
|
6
14
|
id: string;
|
|
7
15
|
icon?: string;
|
|
8
16
|
label?: string;
|
|
9
|
-
/**
|
|
10
|
-
expandedWidth?: string;
|
|
11
|
-
/** When true, uses a lower elevation shadow in the minimized (FAB) state. */
|
|
17
|
+
/** When true, uses a lower elevation shadow on the FAB. */
|
|
12
18
|
lowered: boolean;
|
|
13
|
-
/** Corner the
|
|
19
|
+
/** Corner the FAB is anchored to. */
|
|
14
20
|
corner: Corner;
|
|
15
|
-
/**
|
|
21
|
+
/** Open state. Bind `?open=${…}` to drive the overlay; reflected to the attribute. */
|
|
16
22
|
open: boolean;
|
|
17
|
-
/**
|
|
18
|
-
* State property.
|
|
19
|
-
* Maps 'expanded' → open=true, 'collapsed' → open=false (FAB visible).
|
|
20
|
-
*/
|
|
21
|
-
get state(): BoatState;
|
|
22
|
-
set state(val: BoatState);
|
|
23
23
|
private isDragging;
|
|
24
|
-
private _position;
|
|
25
24
|
private _currentCorner;
|
|
25
|
+
private _slotted;
|
|
26
|
+
private _position;
|
|
26
27
|
private _containerRef;
|
|
27
|
-
private _contentRef;
|
|
28
28
|
private _headerRef;
|
|
29
29
|
private _currentAnimation?;
|
|
30
|
-
private get panelWidth();
|
|
31
|
-
private get isBottomCorner();
|
|
32
|
-
private get closedClipPath();
|
|
33
|
-
private get openClipPath();
|
|
34
|
-
private get elevation();
|
|
35
30
|
private _applyContainerPosition;
|
|
36
31
|
private _loadPosition;
|
|
37
32
|
private _savePosition;
|
|
38
33
|
private _validateBounds;
|
|
39
34
|
private _reorientToNearestCorner;
|
|
40
35
|
private _setupDrag;
|
|
36
|
+
private _openOverlay;
|
|
37
|
+
private _restoreSlotted;
|
|
41
38
|
connectedCallback(): void;
|
|
42
39
|
firstUpdated(): void;
|
|
40
|
+
protected willUpdate(changed: PropertyValues<this>): void;
|
|
43
41
|
disconnectedCallback(): void;
|
|
44
|
-
|
|
45
|
-
private _animateClose;
|
|
42
|
+
/** Flip open ↔ closed. */
|
|
46
43
|
toggle(): void;
|
|
47
|
-
expand(): void;
|
|
48
|
-
/** Alias for expand() — kept for backwards compatibility. */
|
|
49
|
-
show(): void;
|
|
50
|
-
close(): void;
|
|
51
44
|
protected render(): unknown;
|
|
52
45
|
}
|
|
53
46
|
declare global {
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Starfield Effect —
|
|
2
|
+
* Starfield Effect — surreal deep-space drift with rare comets.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* A recessive page backdrop. One <canvas>; stars live in
|
|
5
|
+
* structure-of-arrays Float32Array tables (zero per-frame allocation) and
|
|
6
|
+
* render as pre-rendered glow sprites via drawImage — no gradient is built
|
|
7
|
+
* inside the RAF loop. Three parallax depth layers drift on slow orbit paths;
|
|
8
|
+
* colour temperature runs blue-white → warm; entrance reveals far→near in
|
|
9
|
+
* waves behind a faint corner nebula; a pooled comet streaks by rarely.
|
|
10
|
+
* Sparse and dim by design — tune reach with the `density` ArtOption.
|
|
11
|
+
*
|
|
12
|
+
* Performance budget: ≤ MAX_STAR_COUNT drawImage calls + one nebula blit per
|
|
13
|
+
* frame, dpr capped at 2, the whole field idle under prefers-reduced-motion.
|
|
7
14
|
*/
|
|
8
15
|
import type { ArtState } from '../types';
|
|
9
16
|
export declare function createStarfieldOverlay(state: ArtState): void;
|
|
@@ -12,6 +12,8 @@ export interface ArtOptions {
|
|
|
12
12
|
intensity?: number;
|
|
13
13
|
/** Animation speed multiplier: 0.5 = half speed, 1 = normal, 2 = double (default: 1) */
|
|
14
14
|
speed?: number;
|
|
15
|
+
/** Particle density multiplier: 0.5 = sparse, 1 = baseline, 2 = dense (default: 1; starfield only) */
|
|
16
|
+
density?: number;
|
|
15
17
|
}
|
|
16
18
|
export interface Particle<T extends SVGElement = SVGElement> {
|
|
17
19
|
element: T;
|
|
@@ -46,6 +48,7 @@ export interface ArtState {
|
|
|
46
48
|
color: string;
|
|
47
49
|
intensity: number;
|
|
48
50
|
speed: number;
|
|
51
|
+
density: number;
|
|
49
52
|
element: HTMLElement;
|
|
50
53
|
overlayElement?: HTMLElement;
|
|
51
54
|
animationId?: number;
|
|
@@ -115,12 +118,44 @@ export interface ArtState {
|
|
|
115
118
|
startTime: number;
|
|
116
119
|
};
|
|
117
120
|
starfield?: {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
121
|
+
canvas: HTMLCanvasElement;
|
|
122
|
+
ctx: CanvasRenderingContext2D;
|
|
123
|
+
/** Pre-rendered glow sprites, cool→warm. Drawn per star so no per-frame gradient is built. */
|
|
124
|
+
sprites: HTMLCanvasElement[];
|
|
125
|
+
/** Pre-rendered entrance nebula bloom, drawn once per frame at a computed alpha. */
|
|
126
|
+
nebula: HTMLCanvasElement;
|
|
127
|
+
starCount: number;
|
|
128
|
+
/** Structure-of-arrays star table — cache-friendly, zero allocation per frame. */
|
|
129
|
+
sx: Float32Array;
|
|
130
|
+
sy: Float32Array;
|
|
131
|
+
sr: Float32Array;
|
|
132
|
+
sphase: Float32Array;
|
|
133
|
+
stwinkle: Float32Array;
|
|
134
|
+
/** 0 = far (drifts least, dimmest) → 1 = near (drifts most, brightest). */
|
|
135
|
+
sdepth: Float32Array;
|
|
136
|
+
/** Index into `sprites` — fixes each star's colour temperature for its life. */
|
|
137
|
+
sbucket: Uint8Array;
|
|
138
|
+
/** Per-star entrance delay (s) so the field reveals far→near in waves. */
|
|
139
|
+
sappear: Float32Array;
|
|
140
|
+
/** Fixed comet pool. `life <= 0` marks a free slot; no array churn. */
|
|
141
|
+
cx: Float32Array;
|
|
142
|
+
cy: Float32Array;
|
|
143
|
+
cvx: Float32Array;
|
|
144
|
+
cvy: Float32Array;
|
|
145
|
+
clife: Float32Array;
|
|
146
|
+
cometCount: number;
|
|
147
|
+
/** ms timestamp of the next comet spawn — gates the rare streak. */
|
|
148
|
+
nextCometAt: number;
|
|
149
|
+
/** Capped device-pixel-ratio; bounds backing-store fill cost on retina. */
|
|
150
|
+
dpr: number;
|
|
151
|
+
/** Cached device-pixel canvas size; a change is the only resize trigger. */
|
|
152
|
+
deviceWidth: number;
|
|
153
|
+
deviceHeight: number;
|
|
154
|
+
/** Static-render once, then idle the RAF loop. */
|
|
155
|
+
reducedMotion: boolean;
|
|
156
|
+
drawnStatic: boolean;
|
|
157
|
+
/** Previous frame ms — frame-rate-independent comet motion + jump clamp. */
|
|
158
|
+
lastFrame: number;
|
|
124
159
|
startTime: number;
|
|
125
160
|
};
|
|
126
161
|
}
|
|
@@ -30,6 +30,7 @@ export declare class SchmancyOverlay extends SchmancyElement {
|
|
|
30
30
|
private _active;
|
|
31
31
|
private _backdrop?;
|
|
32
32
|
private _surface;
|
|
33
|
+
private _shell?;
|
|
33
34
|
/** Close trigger for the service; emits the reason + detail payload. */
|
|
34
35
|
private readonly _closed$;
|
|
35
36
|
private _mounted;
|