@mhmo91/schmancy 0.10.42 → 0.10.44
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 +264 -79
- package/dist/SchmancyElement-CeKrBW2j.cjs +2 -0
- package/dist/SchmancyElement-CeKrBW2j.cjs.map +1 -0
- package/dist/SchmancyElement-Ob9yGkiG.js +286 -0
- package/dist/SchmancyElement-Ob9yGkiG.js.map +1 -0
- package/dist/agent/schmancy.agent.js +4032 -3886
- package/dist/agent/schmancy.agent.js.map +1 -1
- package/dist/agent/schmancy.manifest.json +215 -58
- package/dist/animation-CCOIW4wJ.cjs.map +1 -1
- package/dist/animation-DCznELuT.js.map +1 -1
- package/dist/area-CbajcnmJ.cjs +21 -0
- package/dist/area-CbajcnmJ.cjs.map +1 -0
- package/dist/{area-DtCNCb8w.js → area-MxLAyWgV.js} +22 -22
- package/dist/area-MxLAyWgV.js.map +1 -0
- package/dist/area.cjs +1 -1
- package/dist/area.js +1 -1
- package/dist/{audio-DdN76ikW.js → audio-B_0PGwYC.js} +1 -1
- package/dist/audio-B_0PGwYC.js.map +1 -0
- package/dist/{audio-B924fI5N.cjs → audio-CpwrIaw-.cjs} +1 -1
- package/dist/audio-CpwrIaw-.cjs.map +1 -0
- package/dist/audio.cjs +1 -1
- package/dist/audio.js +2 -2
- package/dist/autocomplete-CILzaDB7.cjs +115 -0
- package/dist/autocomplete-CILzaDB7.cjs.map +1 -0
- package/dist/{autocomplete-UNOknYUz.js → autocomplete-DV9RxCun.js} +113 -113
- package/dist/autocomplete-DV9RxCun.js.map +1 -0
- package/dist/autocomplete.cjs +1 -1
- package/dist/autocomplete.js +1 -1
- package/dist/avatar.cjs +1 -1
- package/dist/avatar.cjs.map +1 -1
- package/dist/avatar.js +4 -4
- package/dist/avatar.js.map +1 -1
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/{boat-BZah1Sf9.js → boat-DoZGgQ0P.js} +5 -5
- package/dist/{boat-BZah1Sf9.js.map → boat-DoZGgQ0P.js.map} +1 -1
- package/dist/{boat-D3bEjxf8.cjs → boat-sg0cWO8a.cjs} +2 -2
- package/dist/{boat-D3bEjxf8.cjs.map → boat-sg0cWO8a.cjs.map} +1 -1
- package/dist/boat.cjs +1 -1
- package/dist/boat.js +1 -1
- package/dist/breadcrumb.cjs +32 -31
- package/dist/breadcrumb.cjs.map +1 -1
- package/dist/breadcrumb.js +33 -32
- package/dist/breadcrumb.js.map +1 -1
- package/dist/busy-Brs-TDh9.cjs +133 -0
- package/dist/busy-Brs-TDh9.cjs.map +1 -0
- package/dist/busy-g4LoQmhB.js +172 -0
- package/dist/busy-g4LoQmhB.js.map +1 -0
- package/dist/busy.cjs +1 -1
- package/dist/busy.js +1 -1
- package/dist/{button-CTvS5YX4.cjs → button-Cml67Y_d.cjs} +41 -32
- package/dist/button-Cml67Y_d.cjs.map +1 -0
- package/dist/{button-DgoDfcJx.js → button-DWANpZfD.js} +43 -34
- package/dist/button-DWANpZfD.js.map +1 -0
- package/dist/button.cjs +40 -33
- package/dist/button.cjs.map +1 -1
- package/dist/button.js +42 -35
- package/dist/button.js.map +1 -1
- package/dist/calendar-2dJrw9pR.cjs +58 -0
- package/dist/calendar-2dJrw9pR.cjs.map +1 -0
- package/dist/calendar-kCe5LaBa.js +434 -0
- package/dist/calendar-kCe5LaBa.js.map +1 -0
- package/dist/calendar.cjs +1 -0
- package/dist/calendar.js +2 -0
- package/dist/{card-C6ijJZpF.js → card-CS_hYJbz.js} +136 -136
- package/dist/card-CS_hYJbz.js.map +1 -0
- package/dist/card-d0KhTnx5.cjs +177 -0
- package/dist/card-d0KhTnx5.cjs.map +1 -0
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/{checkbox-7vEPZuGC.js → checkbox-Bjp7kWuE.js} +2 -2
- package/dist/{checkbox-7vEPZuGC.js.map → checkbox-Bjp7kWuE.js.map} +1 -1
- package/dist/{checkbox-DXKdxkXE.cjs → checkbox-DZ2Wrz7Y.cjs} +1 -1
- package/dist/{checkbox-DXKdxkXE.cjs.map → checkbox-DZ2Wrz7Y.cjs.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-9eG-96_D.cjs → chips-BHBVkxsa.cjs} +142 -153
- package/dist/chips-BHBVkxsa.cjs.map +1 -0
- package/dist/{chips-DF7akwz7.js → chips-DACeW7YL.js} +127 -138
- package/dist/chips-DACeW7YL.js.map +1 -0
- package/dist/chips.cjs +1 -1
- package/dist/chips.js +2 -2
- package/dist/connectivity.cjs +53 -35
- package/dist/connectivity.cjs.map +1 -1
- package/dist/connectivity.js +55 -37
- package/dist/connectivity.js.map +1 -1
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +1 -1
- package/dist/cursor-glow-Ah7VXSj7.js.map +1 -1
- package/dist/cursor-glow-Bulq-38P.cjs.map +1 -1
- package/dist/date-range-B2VN7cl_.cjs +138 -0
- package/dist/date-range-B2VN7cl_.cjs.map +1 -0
- package/dist/date-range-CDF_5ju_.js +439 -0
- package/dist/date-range-CDF_5ju_.js.map +1 -0
- package/dist/{date-range-inline-DV2c_gWM.cjs → date-range-inline-CGM0SPK9.cjs} +2 -4
- package/dist/date-range-inline-CGM0SPK9.cjs.map +1 -0
- package/dist/{date-range-inline-BnOD-ddB.js → date-range-inline-D6Ozerzw.js} +3 -5
- package/dist/date-range-inline-D6Ozerzw.js.map +1 -0
- 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 +2 -2
- package/dist/dayjs.min-CvRZTfam.cjs +1 -0
- package/dist/dayjs.min-CvRZTfam.cjs.map +1 -0
- package/dist/dayjs.min-DnELezPs.js +296 -0
- package/dist/dayjs.min-DnELezPs.js.map +1 -0
- package/dist/delay.cjs +1 -1
- package/dist/delay.js +3 -3
- package/dist/{details-ByF66CyY.js → details-Ct1_GwKr.js} +104 -93
- package/dist/details-Ct1_GwKr.js.map +1 -0
- package/dist/{details-B2-jECBh.cjs → details-D4fVOaj4.cjs} +109 -98
- package/dist/details-D4fVOaj4.cjs.map +1 -0
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/{directives-DCb_LA9R.cjs → directives-B2VxfwRL.cjs} +1 -1
- package/dist/directives-B2VxfwRL.cjs.map +1 -0
- package/dist/{directives-BL7mzVsA.js → directives-Dj8jlv-Q.js} +3 -3
- package/dist/directives-Dj8jlv-Q.js.map +1 -0
- package/dist/directives.cjs +1 -1
- package/dist/directives.js +2 -2
- package/dist/discovery.service-CIa3Eeuk.cjs.map +1 -1
- package/dist/discovery.service-DZFxtRwW.js.map +1 -1
- package/dist/divider-B3v33OnX.cjs +57 -0
- package/dist/divider-B3v33OnX.cjs.map +1 -0
- package/dist/divider-BJHW3q11.js +89 -0
- package/dist/divider-BJHW3q11.js.map +1 -0
- package/dist/divider.cjs +1 -1
- package/dist/divider.js +1 -1
- package/dist/dropdown.cjs +40 -40
- package/dist/dropdown.cjs.map +1 -1
- package/dist/dropdown.js +41 -41
- package/dist/dropdown.js.map +1 -1
- package/dist/{expand-cZ8rfCWP.js → expand-BT8mOu8Q.js} +103 -97
- package/dist/expand-BT8mOu8Q.js.map +1 -0
- package/dist/expand-D0YdR9nR.cjs +147 -0
- package/dist/expand-D0YdR9nR.cjs.map +1 -0
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/fab.cjs +1 -1
- package/dist/fab.cjs.map +1 -1
- package/dist/fab.js +2 -2
- package/dist/fab.js.map +1 -1
- package/dist/{float-DkGyWSWy.cjs → float-BPQlDyai.cjs} +1 -1
- package/dist/{float-DkGyWSWy.cjs.map → float-BPQlDyai.cjs.map} +1 -1
- package/dist/{float-zn3DgXBT.js → float-BQcxj3i_.js} +2 -2
- package/dist/{float-zn3DgXBT.js.map → float-BQcxj3i_.js.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/{form-DowzVsgI.cjs → form-CoWFnClb.cjs} +8 -13
- package/dist/form-CoWFnClb.cjs.map +1 -0
- package/dist/{form-tG7LwDm4.js → form-hC2LvCHX.js} +10 -15
- package/dist/form-hC2LvCHX.js.map +1 -0
- package/dist/form.cjs +12 -13
- package/dist/form.cjs.map +1 -1
- package/dist/form.js +23 -24
- package/dist/form.js.map +1 -1
- package/dist/gravity-6pL6CfIr.cjs.map +1 -1
- package/dist/gravity-sVK3zGBF.js.map +1 -1
- package/dist/handover/agent-runtime-followups.md +1 -1
- package/dist/handover/agent-runtime-v1.md +3 -3
- package/dist/{hashContent-iRZJJWtE.cjs.map → hashContent--s09Ed_g.cjs.map} +1 -1
- package/dist/{hashContent-BqU6v1Xr.js.map → hashContent-CAvrQ56N.js.map} +1 -1
- package/dist/icons-BeGKDZ-k.cjs +22 -0
- package/dist/icons-BeGKDZ-k.cjs.map +1 -0
- package/dist/{icons-Dup5skuk.js → icons-DEJnIxml.js} +20 -22
- package/dist/icons-DEJnIxml.js.map +1 -0
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-CDJjnNmo.cjs → iframe-BkSukM9C.cjs} +9 -9
- package/dist/iframe-BkSukM9C.cjs.map +1 -0
- package/dist/{iframe-Xc3EPMZT.js → iframe-V3S-bwEY.js} +10 -10
- package/dist/iframe-V3S-bwEY.js.map +1 -0
- package/dist/iframe.cjs +1 -1
- package/dist/iframe.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +61 -60
- package/dist/{input-cTyDxW9L.js → input-CPFCSQld.js} +3 -10
- package/dist/input-CPFCSQld.js.map +1 -0
- package/dist/{input-DnmC6J1T.cjs → input-DSfwfhhj.cjs} +2 -9
- package/dist/input-DSfwfhhj.cjs.map +1 -0
- package/dist/input-chip-BUuFJUky.cjs +129 -0
- package/dist/input-chip-BUuFJUky.cjs.map +1 -0
- package/dist/{input-chip-CYI17YOq.js → input-chip-C3a1fwKB.js} +87 -104
- package/dist/input-chip-C3a1fwKB.js.map +1 -0
- package/dist/input.cjs +1 -1
- package/dist/input.js +1 -1
- package/dist/json.cjs +5 -1
- package/dist/json.cjs.map +1 -1
- package/dist/json.js +8 -4
- package/dist/json.js.map +1 -1
- package/dist/kbd.cjs +28 -28
- package/dist/kbd.cjs.map +1 -1
- package/dist/kbd.js +29 -29
- package/dist/kbd.js.map +1 -1
- package/dist/{layout-CNlZSJFU.cjs → layout-CdyHy_oX.cjs} +1 -1
- package/dist/layout-CdyHy_oX.cjs.map +1 -0
- package/dist/{layout-DDxw0EwL.js → layout-k6fOkpif.js} +1 -1
- package/dist/layout-k6fOkpif.js.map +1 -0
- package/dist/layout.cjs +26 -26
- package/dist/layout.cjs.map +1 -1
- package/dist/layout.js +27 -27
- package/dist/layout.js.map +1 -1
- package/dist/lazy-BaAiIUru.js.map +1 -1
- package/dist/lazy-C-7a4FAe.cjs.map +1 -1
- package/dist/{lightbox-CH-y3rYB.js → lightbox-DIG0VLOK.js} +8 -14
- package/dist/lightbox-DIG0VLOK.js.map +1 -0
- package/dist/{lightbox-CvtqoInF.cjs → lightbox-E5rgd-hu.cjs} +7 -13
- package/dist/lightbox-E5rgd-hu.cjs.map +1 -0
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/list-BRz0rDSH.cjs +47 -0
- package/dist/list-BRz0rDSH.cjs.map +1 -0
- package/dist/{list-DrsawQ5R.js → list-NrOYDPBo.js} +42 -35
- package/dist/list-NrOYDPBo.js.map +1 -0
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/magnetic-DKtc4umC.cjs.map +1 -1
- package/dist/magnetic-DaOOv5Dz.js.map +1 -1
- package/dist/{menu-CsY5lMqY.js → menu-B1Ei9SVj.js} +12 -12
- package/dist/menu-B1Ei9SVj.js.map +1 -0
- package/dist/{menu-BFRcTe3o.cjs → menu-Duvl66Nl.cjs} +10 -10
- package/dist/menu-Duvl66Nl.cjs.map +1 -0
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/{mixins-BoMURWag.cjs → mixins-Cjn20BQH.cjs} +42 -100
- package/dist/mixins-Cjn20BQH.cjs.map +1 -0
- package/dist/{mixins-bCEXbwJV.js → mixins-q4KAL8Xr.js} +42 -100
- package/dist/mixins-q4KAL8Xr.js.map +1 -0
- package/dist/mixins.cjs +1 -1
- package/dist/mixins.js +2 -2
- package/dist/nav-drawer.cjs +1 -1
- package/dist/nav-drawer.js +1 -1
- package/dist/navigation-bar.cjs +1 -1
- package/dist/navigation-bar.js +1 -1
- package/dist/navigation-rail.cjs +2 -4
- package/dist/navigation-rail.cjs.map +1 -1
- package/dist/navigation-rail.js +3 -5
- package/dist/navigation-rail.js.map +1 -1
- package/dist/{notification-DFKRMmSq.js → notification-COhUhUCr.js} +5 -7
- package/dist/notification-COhUhUCr.js.map +1 -0
- package/dist/{notification-FBf3Mb2e.cjs → notification-DsdA_MJe.cjs} +2 -4
- package/dist/notification-DsdA_MJe.cjs.map +1 -0
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/{option-Ct0lGdH3.js → option-BIzgTbXz.js} +20 -20
- package/dist/option-BIzgTbXz.js.map +1 -0
- package/dist/option-C5hhqR2z.cjs +43 -0
- package/dist/option-C5hhqR2z.cjs.map +1 -0
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/{overlay-sRXiMkjn.cjs → overlay-BzgF8P7i.cjs} +48 -41
- package/dist/overlay-BzgF8P7i.cjs.map +1 -0
- package/dist/{overlay-Bh8Q_R01.js → overlay-LoRRemny.js} +52 -45
- package/dist/overlay-LoRRemny.js.map +1 -0
- package/dist/overlay-stack-Bdr9lOqi.cjs.map +1 -1
- package/dist/overlay-stack-D2rgxQLh.js.map +1 -1
- package/dist/overlay.cjs +1 -1
- package/dist/{overlay.confirm-body-CQihsR20.js → overlay.confirm-body-D0b1MoCw.js} +30 -45
- package/dist/overlay.confirm-body-D0b1MoCw.js.map +1 -0
- package/dist/{overlay.confirm-body-Jc1EuMGs.cjs → overlay.confirm-body-DCneq73Z.cjs} +22 -37
- package/dist/overlay.confirm-body-DCneq73Z.cjs.map +1 -0
- package/dist/overlay.js +3 -3
- package/dist/{overlay.service-BXPgS7ay.js → overlay.service-BuUeti6X.js} +2 -2
- package/dist/overlay.service-BuUeti6X.js.map +1 -0
- package/dist/{overlay.service-9Dp3g7ot.cjs → overlay.service-MMTiW2T3.cjs} +1 -1
- package/dist/overlay.service-MMTiW2T3.cjs.map +1 -0
- package/dist/{progress-CYLshdo2.js → progress-D7n3SKAO.js} +50 -50
- package/dist/progress-D7n3SKAO.js.map +1 -0
- package/dist/progress-DsCnFsH5.cjs +51 -0
- package/dist/progress-DsCnFsH5.cjs.map +1 -0
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/{radio-group-6kCgOgBL.cjs → radio-group-CaAjg9UV.cjs} +1 -1
- package/dist/radio-group-CaAjg9UV.cjs.map +1 -0
- package/dist/{radio-group-bZtZHOj_.js → radio-group-Drpl6Pl8.js} +2 -2
- package/dist/radio-group-Drpl6Pl8.js.map +1 -0
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.js +1 -1
- package/dist/range.cjs +4 -2
- package/dist/range.cjs.map +1 -1
- package/dist/range.js +5 -3
- package/dist/range.js.map +1 -1
- package/dist/reduced-motion-D-L12p7G.js.map +1 -1
- package/dist/reduced-motion-Ds-HjMzn.cjs.map +1 -1
- package/dist/{rxjs-utils-Csnks202.cjs.map → rxjs-utils-4P2v57ke.cjs.map} +1 -1
- package/dist/{rxjs-utils-d-ivVN84.js.map → rxjs-utils-JMFdgQSl.js.map} +1 -1
- package/dist/rxjs-utils.cjs +1 -1
- package/dist/rxjs-utils.js +1 -1
- package/dist/search-DPKoC-dT.cjs.map +1 -1
- package/dist/search-MvIBA93K.js.map +1 -1
- package/dist/{select-CU3X-PIa.js → select-CTXkrrVZ.js} +13 -13
- package/dist/select-CTXkrrVZ.js.map +1 -0
- package/dist/select-DcLcpPCh.cjs +56 -0
- package/dist/select-DcLcpPCh.cjs.map +1 -0
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/skeleton.cjs +37 -33
- package/dist/skeleton.cjs.map +1 -1
- package/dist/skeleton.js +38 -34
- package/dist/skeleton.js.map +1 -1
- package/dist/skills/schmancy/surface.md +38 -22
- package/dist/skills/surface.md +38 -22
- package/dist/slider.cjs +31 -31
- package/dist/slider.cjs.map +1 -1
- package/dist/slider.js +32 -32
- package/dist/slider.js.map +1 -1
- package/dist/{sound.service-B4ZmXpH9.js → sound.service-AJwuk3yr.js} +1 -1
- package/dist/sound.service-AJwuk3yr.js.map +1 -0
- package/dist/{sound.service-DjlMvicQ.cjs → sound.service-CVsxhQkX.cjs} +1 -1
- package/dist/sound.service-CVsxhQkX.cjs.map +1 -0
- package/dist/{splash-screen-emCLYoVl.js → splash-screen-DANfqvlo.js} +23 -26
- package/dist/splash-screen-DANfqvlo.js.map +1 -0
- package/dist/splash-screen-K74cgU6S.cjs +38 -0
- package/dist/splash-screen-K74cgU6S.cjs.map +1 -0
- package/dist/splash-screen.cjs +1 -1
- package/dist/splash-screen.js +1 -1
- package/dist/{src-DGDTkOvC.js → src-Bo-vvN6m.js} +173 -175
- package/dist/src-Bo-vvN6m.js.map +1 -0
- package/dist/src-MdpH1zth.cjs +237 -0
- package/dist/src-MdpH1zth.cjs.map +1 -0
- package/dist/{state-CumAEPQH.cjs → state-BWQiqN6I.cjs} +1 -1
- package/dist/state-BWQiqN6I.cjs.map +1 -0
- package/dist/{state-DMd_FUeA.js → state-DBA_gzJO.js} +1 -1
- package/dist/state-DBA_gzJO.js.map +1 -0
- package/dist/state.cjs +1 -1
- package/dist/state.js +2 -2
- package/dist/steps.cjs +20 -12
- package/dist/steps.cjs.map +1 -1
- package/dist/steps.js +21 -13
- package/dist/steps.js.map +1 -1
- package/dist/surface-COBvWWFb.cjs +7 -0
- package/dist/surface-COBvWWFb.cjs.map +1 -0
- package/dist/{surface-DNiYigsX.js → surface-DXk1X1tL.js} +9 -9
- package/dist/{surface-DNiYigsX.js.map → surface-DXk1X1tL.js.map} +1 -1
- package/dist/surface.cjs +1 -1
- package/dist/surface.js +1 -1
- package/dist/switch.cjs +13 -4
- package/dist/switch.cjs.map +1 -1
- package/dist/switch.js +14 -5
- package/dist/switch.js.map +1 -1
- package/dist/table.cjs +4 -10
- package/dist/table.cjs.map +1 -1
- package/dist/table.js +5 -11
- package/dist/table.js.map +1 -1
- package/dist/{tabs-4T_4kCf-.js → tabs-BYhFWnsx.js} +7 -7
- package/dist/tabs-BYhFWnsx.js.map +1 -0
- package/dist/{tabs-Byxxt-AH.cjs → tabs-CJwB0fr0.cjs} +6 -6
- package/dist/tabs-CJwB0fr0.cjs.map +1 -0
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.js +1 -1
- package/dist/teleport.cjs +1 -1
- package/dist/teleport.js +1 -1
- package/dist/{textarea-kkYNk1ET.js → textarea-BjDx1w2g.js} +37 -41
- package/dist/textarea-BjDx1w2g.js.map +1 -0
- package/dist/{textarea-BwYwH9fu.cjs → textarea-CGgznhd6.cjs} +36 -40
- package/dist/textarea-CGgznhd6.cjs.map +1 -0
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-BG0EnzYP.cjs → theme-BVul7lHS.cjs} +6 -6
- package/dist/{theme-BG0EnzYP.cjs.map → theme-BVul7lHS.cjs.map} +1 -1
- package/dist/{theme-DwQBl6sr.js → theme-Dvm5J8nh.js} +11 -11
- package/dist/{theme-DwQBl6sr.js.map → theme-Dvm5J8nh.js.map} +1 -1
- package/dist/{theme-button-BD8anzsZ.js → theme-button-Bko5ohFP.js} +2 -2
- package/dist/{theme-button-BD8anzsZ.js.map → theme-button-Bko5ohFP.js.map} +1 -1
- package/dist/{theme-button-DlrNoCMA.cjs → theme-button-YLY7zR1c.cjs} +1 -1
- package/dist/{theme-button-DlrNoCMA.cjs.map → theme-button-YLY7zR1c.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-CSt7JUBD.cjs.map → theme.interface-B-qxDsZQ.cjs.map} +1 -1
- package/dist/{theme.interface-odQEpZZH.js.map → theme.interface-B7caS5cg.js.map} +1 -1
- package/dist/theme.js +4 -4
- package/dist/{theme.service-Dv_55nfE.js → theme.service-D94nm7Bf.js} +1 -1
- package/dist/theme.service-D94nm7Bf.js.map +1 -0
- package/dist/{theme.service-pjkTM209.cjs → theme.service-h2fXQq7x.cjs} +1 -1
- package/dist/theme.service-h2fXQq7x.cjs.map +1 -0
- package/dist/tooltip.cjs.map +1 -1
- package/dist/tooltip.js.map +1 -1
- package/dist/tree.cjs +14 -14
- package/dist/tree.cjs.map +1 -1
- package/dist/tree.js +15 -15
- package/dist/tree.js.map +1 -1
- package/dist/types.cjs +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.js +19 -2
- package/dist/types.js.map +1 -1
- package/dist/typewriter.cjs.map +1 -1
- package/dist/typewriter.js.map +1 -1
- package/dist/typography-ByF2k5yW.js +358 -0
- package/dist/typography-ByF2k5yW.js.map +1 -0
- package/dist/typography-Cfav17it.cjs +282 -0
- package/dist/typography-Cfav17it.cjs.map +1 -0
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +1 -1
- package/dist/utils-DIXndz6Q.cjs.map +1 -0
- package/dist/utils-dSPH7Oh9.js.map +1 -0
- package/dist/utils.cjs +1 -1
- package/dist/utils.js +1 -1
- package/dist/visually-hidden.cjs +13 -13
- package/dist/visually-hidden.cjs.map +1 -1
- package/dist/visually-hidden.js +14 -14
- package/dist/visually-hidden.js.map +1 -1
- package/dist/window-Br1OmpL-.cjs +67 -0
- package/dist/window-Br1OmpL-.cjs.map +1 -0
- package/dist/{window-C76zstbV.js → window-CCmN4but.js} +24 -15
- package/dist/window-CCmN4but.js.map +1 -0
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/package.json +1 -1
- package/skills/schmancy/surface.md +38 -22
- package/src/area/area.component.ts +249 -163
- package/src/area/area.service.test.ts +994 -1006
- package/src/area/area.service.ts +76 -72
- package/src/area/index.ts +7 -7
- package/src/area/lazy.ts +39 -42
- package/src/area/route.component.ts +54 -52
- package/src/area/router.types.ts +7 -7
- package/src/audio/emotional-sounds.ts +880 -801
- package/src/audio/sound.service.ts +26 -5
- package/src/avatar/avatar.ts +4 -4
- package/src/badge/badge.ts +15 -12
- package/src/badge/index.ts +1 -1
- package/src/boat/boat.ts +1 -1
- package/src/breadcrumb/breadcrumb.ts +37 -32
- package/src/busy/busy.ts +15 -12
- package/src/busy/index.ts +2 -2
- package/src/busy/spinner.ts +132 -119
- package/src/button/button.test.ts +5 -1
- package/src/button/button.ts +113 -72
- package/src/button/icon-button.ts +64 -46
- package/src/button/index.ts +2 -2
- package/src/calendar/calendar.test.ts +504 -0
- package/src/calendar/calendar.ts +587 -0
- package/src/calendar/index.ts +2 -0
- package/src/card/actions.ts +11 -9
- package/src/card/card.ts +79 -77
- package/src/card/content.ts +8 -6
- package/src/card/index.ts +4 -4
- package/src/card/media.ts +50 -50
- package/src/chips/assist-chip.ts +1 -1
- package/src/chips/chips.ts +1 -1
- package/src/chips/filter-chip.ts +1 -1
- package/src/chips/index.ts +1 -1
- package/src/chips/input-chip.ts +1 -1
- package/src/chips/suggestion-chip.ts +1 -1
- package/src/connectivity/connectivity-status.ts +90 -62
- package/src/content-drawer/drawer.service.ts +47 -36
- package/src/content-drawer/drawer.ts +31 -18
- package/src/content-drawer/index.ts +5 -5
- package/src/content-drawer/main.ts +9 -7
- package/src/content-drawer/sheet.ts +8 -6
- package/src/date-range-inline/date-range-inline.ts +523 -522
- package/src/date-range-inline/index.ts +2 -2
- package/src/delay/index.ts +1 -1
- package/src/details/details.ts +119 -105
- package/src/details/index.ts +1 -1
- package/src/directives/ai-badge.ts +1 -5
- package/src/directives/animate-text.ts +43 -31
- package/src/directives/art/effects/howl.ts +1 -4
- package/src/directives/art/effects/samwa.ts +11 -5
- package/src/directives/art/effects/snow.ts +1 -2
- package/src/directives/battery.ts +21 -12
- package/src/directives/confirm-click.ts +9 -17
- package/src/directives/cursor-glow.ts +1 -1
- package/src/directives/cycle-text.ts +7 -21
- package/src/directives/drag.ts +50 -45
- package/src/directives/fyi.ts +1 -6
- package/src/directives/gravity.ts +10 -8
- package/src/directives/hummingbird.ts +256 -107
- package/src/directives/index.ts +29 -29
- package/src/directives/intersect.ts +11 -11
- package/src/directives/layout.ts +25 -36
- package/src/directives/liquid.ts +4 -10
- package/src/directives/living-border.ts +7 -5
- package/src/directives/long-press.ts +2 -1
- package/src/directives/magnetic.ts +7 -6
- package/src/directives/nebula.ts +34 -28
- package/src/directives/overflow-within.ts +18 -20
- package/src/directives/reduced-motion.ts +9 -9
- package/src/directives/reveal.ts +193 -195
- package/src/directives/ripple.ts +9 -7
- package/src/directives/urgent.ts +3 -1
- package/src/directives/working-snake.ts +1 -1
- package/src/discovery/discovery.service.ts +198 -210
- package/src/discovery/index.ts +1 -1
- package/src/divider/divider.ts +49 -47
- package/src/divider/index.ts +1 -1
- package/src/dropdown/dropdown-content.ts +42 -40
- package/src/dropdown/index.ts +2 -2
- package/src/expand/expand-root.component.ts +70 -61
- package/src/expand/expand.component.ts +48 -43
- package/src/fab/fab.test.ts +1 -2
- package/src/fab/fab.ts +2 -4
- package/src/form/fields/autocomplete/autocomplete.scss +6 -2
- package/src/form/fields/autocomplete/autocomplete.ts +712 -724
- package/src/form/fields/autocomplete/index.ts +1 -1
- package/src/form/fields/checkbox/checkbox.ts +1 -4
- package/src/form/fields/chips/assist-chip.ts +69 -72
- package/src/form/fields/chips/chips.ts +14 -15
- package/src/form/fields/chips/filter-chip.ts +36 -32
- package/src/form/fields/chips/index.ts +5 -5
- package/src/form/fields/chips/input-chip.ts +130 -142
- package/src/form/fields/chips/suggestion-chip.ts +69 -72
- package/src/form/fields/date-range/date-range-dialog.ts +154 -194
- package/src/form/fields/date-range/date-range-helpers.ts +63 -64
- package/src/form/fields/date-range/date-range.test.ts +575 -121
- package/src/form/fields/date-range/date-range.ts +343 -395
- package/src/form/fields/date-range/index.ts +2 -2
- package/src/form/fields/input/index.ts +8 -8
- package/src/form/fields/input/input.scss +30 -26
- package/src/form/fields/input/input.test.ts +4 -1
- package/src/form/fields/input/input.ts +4 -20
- package/src/form/fields/radio-group/index.ts +2 -2
- package/src/form/fields/radio-group/radio-button.ts +8 -8
- package/src/form/fields/radio-group/radio-group.ts +4 -1
- package/src/form/fields/range/range.ts +3 -1
- package/src/form/fields/select/index.ts +2 -2
- package/src/form/fields/select/select.ts +51 -45
- package/src/form/fields/switch/switch.ts +13 -7
- package/src/form/fields/textarea/index.ts +1 -1
- package/src/form/fields/textarea/textarea.ts +44 -49
- package/src/form/form-summary.ts +15 -14
- package/src/form/form.test.ts +0 -1
- package/src/form/form.ts +11 -23
- package/src/icons/icon.ts +25 -25
- package/src/icons/index.ts +1 -1
- package/src/iframe/iframe.ts +11 -9
- package/src/index.ts +1 -0
- package/src/json/json.ts +9 -2
- package/src/kbd/kbd.ts +30 -28
- package/src/layout/scroll/index.ts +1 -1
- package/src/layout/scroll/scroll.ts +54 -54
- package/src/lightbox/lightbox-service.ts +27 -18
- package/src/lightbox/lightbox.directive.ts +2 -1
- package/src/lightbox/lightbox.ts +21 -38
- package/src/list/index.ts +3 -3
- package/src/list/list-item.ts +32 -26
- package/src/list/list.ts +13 -8
- package/src/menu/index.ts +2 -2
- package/src/menu/menu-item.ts +7 -5
- package/src/menu/menu.ts +8 -6
- package/src/nav-drawer/appbar.ts +9 -7
- package/src/nav-drawer/content.ts +10 -8
- package/src/nav-drawer/drawer.ts +29 -25
- package/src/nav-drawer/index.ts +6 -6
- package/src/navigation-bar/index.ts +2 -2
- package/src/navigation-bar/navigation-bar-item.ts +127 -118
- package/src/navigation-bar/navigation-bar.ts +103 -91
- package/src/navigation-rail/index.ts +2 -2
- package/src/navigation-rail/navigation-rail.ts +21 -22
- package/src/notification/index.ts +6 -6
- package/src/notification/notification-service.ts +1 -2
- package/src/notification/notification.scss +5 -1
- package/src/notification/notification.ts +1 -3
- package/src/notification/notify.ts +204 -207
- package/src/option/index.ts +1 -1
- package/src/option/option.ts +26 -25
- package/src/overlay/overlay.animations.ts +4 -14
- package/src/overlay/overlay.component.ts +110 -131
- package/src/overlay/overlay.confirm-body.ts +26 -48
- package/src/overlay/overlay.gestures.ts +8 -10
- package/src/overlay/overlay.layout.ts +1 -4
- package/src/overlay/overlay.positioning.ts +4 -15
- package/src/overlay/overlay.service.ts +9 -24
- package/src/overlay/overlay.stack.test.ts +4 -1
- package/src/overlay/overlay.stack.ts +4 -4
- package/src/overlay/overlay.types.ts +11 -20
- package/src/progress/index.ts +1 -1
- package/src/progress/progress.ts +135 -133
- package/src/rxjs-utils/index.ts +6 -6
- package/src/rxjs-utils/waitForElement.ts +20 -20
- package/src/rxjs-utils/waitForElementAll.ts +21 -21
- package/src/rxjs-utils/waitForElements.ts +27 -27
- package/src/rxjs-utils/waitForElementsAll.ts +27 -29
- package/src/rxjs-utils/waitUntil.ts +7 -12
- package/src/skeleton/skeleton.ts +39 -33
- package/src/slider/index.ts +2 -2
- package/src/slider/slide.ts +14 -12
- package/src/slider/slider.ts +24 -22
- package/src/splash-screen/index.ts +1 -1
- package/src/splash-screen/splash-screen.ts +26 -27
- package/src/state/active-host.ts +4 -5
- package/src/state/index.ts +34 -53
- package/src/state/persist.ts +14 -11
- package/src/state/schmancy-context.ts +88 -88
- package/src/state/state.test-d.ts +3 -13
- package/src/state/state.test.ts +1 -4
- package/src/steps/index.ts +3 -3
- package/src/steps/schmancy-step.ts +41 -31
- package/src/steps/schmancy-steps.ts +7 -5
- package/src/surface/index.ts +1 -1
- package/src/surface/surface.styles.ts +53 -104
- package/src/surface/surface.ts +10 -8
- package/src/table/index.ts +2 -2
- package/src/table/row.ts +1 -4
- package/src/table/table.ts +2 -5
- package/src/tabs/index.ts +2 -2
- package/src/tabs/tabs-group.ts +8 -6
- package/src/teleport/index.ts +2 -2
- package/src/test-utils/a11y.ts +1 -3
- package/src/theme/index.ts +17 -17
- package/src/theme/theme-audio-player.ts +18 -16
- package/src/theme/theme-controller-boat.ts +1 -1
- package/src/theme/theme-controller.ts +36 -32
- package/src/theme/theme.component.ts +5 -9
- package/src/theme/theme.events.ts +1 -1
- package/src/theme/theme.format.ts +7 -7
- package/src/theme/theme.service.ts +453 -468
- package/src/theme/theme.style.css +78 -23
- package/src/theme-button/index.ts +1 -1
- package/src/tooltip/tooltip.directive.ts +1 -1
- package/src/tree/index.ts +1 -1
- package/src/tree/tree.ts +24 -16
- package/src/types/surface.ts +38 -44
- package/src/typewriter/typewriter.directive.ts +30 -39
- package/src/typography/typography.ts +289 -269
- package/src/utils/animation.ts +2 -8
- package/src/utils/index.ts +6 -6
- package/src/utils/number.ts +480 -517
- package/src/utils/overlay-stack.ts +1 -3
- package/src/utils/search.ts +5 -9
- package/src/visually-hidden/visually-hidden.ts +15 -13
- package/src/window/window-manager.ts +6 -1
- package/src/window/window-position.ts +7 -5
- package/src/window/window.ts +143 -108
- package/types/src/calendar/calendar.d.ts +108 -0
- package/types/src/calendar/calendar.test.d.ts +1 -0
- package/types/src/calendar/index.d.ts +2 -0
- package/types/src/directives/cursor-glow.d.ts +1 -1
- package/types/src/directives/hummingbird.d.ts +3 -3
- package/types/src/form/fields/date-range/date-range-dialog.d.ts +24 -28
- package/types/src/form/fields/date-range/date-range.d.ts +39 -66
- package/types/src/form/fields/date-range/date-range.test.d.ts +1 -0
- package/types/src/form/fields/date-range/index.d.ts +1 -1
- package/types/src/index.d.ts +1 -0
- package/types/src/surface/surface.styles.d.ts +13 -6
- package/types/src/types/surface.d.ts +17 -22
- package/types/src/utils/number.d.ts +1 -1
- package/dist/SchmancyElement-OG71FtNv.js +0 -286
- package/dist/SchmancyElement-OG71FtNv.js.map +0 -1
- package/dist/SchmancyElement-PS1u0j1B.cjs +0 -2
- package/dist/SchmancyElement-PS1u0j1B.cjs.map +0 -1
- package/dist/area-CaEI33G0.cjs +0 -21
- package/dist/area-CaEI33G0.cjs.map +0 -1
- package/dist/area-DtCNCb8w.js.map +0 -1
- package/dist/audio-B924fI5N.cjs.map +0 -1
- package/dist/audio-DdN76ikW.js.map +0 -1
- package/dist/autocomplete-Dq3BkitV.cjs +0 -115
- package/dist/autocomplete-Dq3BkitV.cjs.map +0 -1
- package/dist/autocomplete-UNOknYUz.js.map +0 -1
- package/dist/busy--WqiXKnl.cjs +0 -134
- package/dist/busy--WqiXKnl.cjs.map +0 -1
- package/dist/busy-DzXyO0z6.js +0 -173
- package/dist/busy-DzXyO0z6.js.map +0 -1
- package/dist/button-CTvS5YX4.cjs.map +0 -1
- package/dist/button-DgoDfcJx.js.map +0 -1
- package/dist/card-C6ijJZpF.js.map +0 -1
- package/dist/card-Ci3_9Dd4.cjs +0 -177
- package/dist/card-Ci3_9Dd4.cjs.map +0 -1
- package/dist/chips-9eG-96_D.cjs.map +0 -1
- package/dist/chips-DF7akwz7.js.map +0 -1
- package/dist/date-range-C13_R3OA.js +0 -966
- package/dist/date-range-C13_R3OA.js.map +0 -1
- package/dist/date-range-Q2xj5Syc.cjs +0 -142
- package/dist/date-range-Q2xj5Syc.cjs.map +0 -1
- package/dist/date-range-inline-BnOD-ddB.js.map +0 -1
- package/dist/date-range-inline-DV2c_gWM.cjs.map +0 -1
- package/dist/details-B2-jECBh.cjs.map +0 -1
- package/dist/details-ByF66CyY.js.map +0 -1
- package/dist/directives-BL7mzVsA.js.map +0 -1
- package/dist/directives-DCb_LA9R.cjs.map +0 -1
- package/dist/divider-Bv2QiOZL.cjs +0 -57
- package/dist/divider-Bv2QiOZL.cjs.map +0 -1
- package/dist/divider-gYuz0zDU.js +0 -89
- package/dist/divider-gYuz0zDU.js.map +0 -1
- package/dist/expand-B9IUGVtc.cjs +0 -141
- package/dist/expand-B9IUGVtc.cjs.map +0 -1
- package/dist/expand-cZ8rfCWP.js.map +0 -1
- package/dist/form-DowzVsgI.cjs.map +0 -1
- package/dist/form-tG7LwDm4.js.map +0 -1
- package/dist/icons-BZeCloP9.cjs +0 -24
- package/dist/icons-BZeCloP9.cjs.map +0 -1
- package/dist/icons-Dup5skuk.js.map +0 -1
- package/dist/iframe-CDJjnNmo.cjs.map +0 -1
- package/dist/iframe-Xc3EPMZT.js.map +0 -1
- package/dist/input-DnmC6J1T.cjs.map +0 -1
- package/dist/input-cTyDxW9L.js.map +0 -1
- package/dist/input-chip-CV91URyU.cjs +0 -146
- package/dist/input-chip-CV91URyU.cjs.map +0 -1
- package/dist/input-chip-CYI17YOq.js.map +0 -1
- package/dist/layout-CNlZSJFU.cjs.map +0 -1
- package/dist/layout-DDxw0EwL.js.map +0 -1
- package/dist/lightbox-CH-y3rYB.js.map +0 -1
- package/dist/lightbox-CvtqoInF.cjs.map +0 -1
- package/dist/list-Dl8KfxrF.cjs +0 -40
- package/dist/list-Dl8KfxrF.cjs.map +0 -1
- package/dist/list-DrsawQ5R.js.map +0 -1
- package/dist/menu-BFRcTe3o.cjs.map +0 -1
- package/dist/menu-CsY5lMqY.js.map +0 -1
- package/dist/mixins-BoMURWag.cjs.map +0 -1
- package/dist/mixins-bCEXbwJV.js.map +0 -1
- package/dist/notification-DFKRMmSq.js.map +0 -1
- package/dist/notification-FBf3Mb2e.cjs.map +0 -1
- package/dist/option-Ct0lGdH3.js.map +0 -1
- package/dist/option-Il1KpU8M.cjs +0 -43
- package/dist/option-Il1KpU8M.cjs.map +0 -1
- package/dist/overlay-Bh8Q_R01.js.map +0 -1
- package/dist/overlay-sRXiMkjn.cjs.map +0 -1
- package/dist/overlay.confirm-body-CQihsR20.js.map +0 -1
- package/dist/overlay.confirm-body-Jc1EuMGs.cjs.map +0 -1
- package/dist/overlay.service-9Dp3g7ot.cjs.map +0 -1
- package/dist/overlay.service-BXPgS7ay.js.map +0 -1
- package/dist/progress-CWC5XYZ_.cjs +0 -51
- package/dist/progress-CWC5XYZ_.cjs.map +0 -1
- package/dist/progress-CYLshdo2.js.map +0 -1
- package/dist/radio-group-6kCgOgBL.cjs.map +0 -1
- package/dist/radio-group-bZtZHOj_.js.map +0 -1
- package/dist/select-CU3X-PIa.js.map +0 -1
- package/dist/select-MXsF8KsU.cjs +0 -56
- package/dist/select-MXsF8KsU.cjs.map +0 -1
- package/dist/sound.service-B4ZmXpH9.js.map +0 -1
- package/dist/sound.service-DjlMvicQ.cjs.map +0 -1
- package/dist/splash-screen-CN9dZcqC.cjs +0 -41
- package/dist/splash-screen-CN9dZcqC.cjs.map +0 -1
- package/dist/splash-screen-emCLYoVl.js.map +0 -1
- package/dist/src-DGDTkOvC.js.map +0 -1
- package/dist/src-DK3111z_.cjs +0 -240
- package/dist/src-DK3111z_.cjs.map +0 -1
- package/dist/state-CumAEPQH.cjs.map +0 -1
- package/dist/state-DMd_FUeA.js.map +0 -1
- package/dist/surface-DGI-FBoi.cjs +0 -7
- package/dist/surface-DGI-FBoi.cjs.map +0 -1
- package/dist/tabs-4T_4kCf-.js.map +0 -1
- package/dist/tabs-Byxxt-AH.cjs.map +0 -1
- package/dist/textarea-BwYwH9fu.cjs.map +0 -1
- package/dist/textarea-kkYNk1ET.js.map +0 -1
- package/dist/theme.service-Dv_55nfE.js.map +0 -1
- package/dist/theme.service-pjkTM209.cjs.map +0 -1
- package/dist/typography-BVkU11_q.js +0 -358
- package/dist/typography-BVkU11_q.js.map +0 -1
- package/dist/typography-aaQaIcNc.cjs +0 -282
- package/dist/typography-aaQaIcNc.cjs.map +0 -1
- package/dist/utils-DTa3QHxk.cjs.map +0 -1
- package/dist/utils-H8wNknWC.js.map +0 -1
- package/dist/window-C76zstbV.js.map +0 -1
- package/dist/window-CmB9XZzT.cjs +0 -58
- package/dist/window-CmB9XZzT.cjs.map +0 -1
- package/src/form/fields/date-range/date-range-presets.ts +0 -220
- package/src/form/fields/date-range/date-utils.ts +0 -58
- package/types/src/form/fields/date-range/date-range-presets.d.ts +0 -18
- package/types/src/form/fields/date-range/date-utils.d.ts +0 -15
- /package/dist/{hashContent-iRZJJWtE.cjs → hashContent--s09Ed_g.cjs} +0 -0
- /package/dist/{hashContent-BqU6v1Xr.js → hashContent-CAvrQ56N.js} +0 -0
- /package/dist/{rxjs-utils-Csnks202.cjs → rxjs-utils-4P2v57ke.cjs} +0 -0
- /package/dist/{rxjs-utils-d-ivVN84.js → rxjs-utils-JMFdgQSl.js} +0 -0
- /package/dist/{theme.interface-CSt7JUBD.cjs → theme.interface-B-qxDsZQ.cjs} +0 -0
- /package/dist/{theme.interface-odQEpZZH.js → theme.interface-B7caS5cg.js} +0 -0
- /package/dist/{utils-DTa3QHxk.cjs → utils-DIXndz6Q.cjs} +0 -0
- /package/dist/{utils-H8wNknWC.js → utils-dSPH7Oh9.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boat-BZah1Sf9.js","names":["#sub","#wrapper","#captured","#ready"],"sources":["../src/boat/boat.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { html, type PropertyValues } from 'lit'\nimport { customElement, property, queryAssignedElements, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport { exhaustMap, filter, finalize, fromEvent, merge, type Subscription, takeUntil, tap } from 'rxjs'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport { show } from '../overlay/overlay.service'\nimport { theme } from '../theme/theme.service.js'\nimport { SPRING_SMOOTH } from '../utils/animation.js'\n\nconst DRAG_THRESHOLD = 5\nconst POSITION_STORAGE_KEY_PREFIX = 'schmancy-boat-'\n\ntype Corner = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\ninterface Position {\n\tx: number\n\ty: number\n}\n\n/**\n * Corner-anchored launcher that delegates its expanded panel to the `show()`\n * overlay service.\n *\n * Three slots, three non-overlapping intents — no element-type sniffing,\n * ever:\n *\n * - `trigger` — pure consumer content. A native click anywhere on it\n * opens the panel; interactive children (buttons, FABs, inputs) work\n * with zero special-casing because the boat never calls\n * `preventDefault` / `stopPropagation` / `setPointerCapture` here.\n * - `drag-handle` — opt-in. Pointer-drag is wired ONLY to this slot's\n * boat-owned wrapper. Slot it to make the boat draggable; omit it and\n * the boat is static at its corner. (A no-move tap on the handle also\n * opens, so the grip doubles as a launcher.)\n * - _(default)_ — the panel body; parked hidden while collapsed,\n * relocated into the `show()` overlay on open.\n *\n * The boat owns drag, corner-snapping, position persistence and the glass\n * surface — never the collapsed shape.\n */\n@customElement('schmancy-boat')\nexport default class SchmancyBoat extends SchmancyElement {\n\n\n\t/** Identity for localStorage drag-position persistence. */\n\t@property({ type: String }) id: string = 'default'\n\t/** Corner the launcher is anchored to. */\n\t@property({ type: String }) corner: Corner = 'bottom-right'\n\t/** Open state. Bind `?open=${…}` to drive the overlay; reflected to the attribute. */\n\t@property({ type: Boolean, reflect: true }) open: boolean = false\n\n\t@state() private isDragging = false\n\t@state() private currentCorner: Corner = 'bottom-right'\n\t@state() private hasHandle = false\n\n\t/** Default-slot nodes — the overlay body. */\n\t@queryAssignedElements() private slotted!: Element[]\n\t/** Slotted drag-handle nodes — presence toggles draggability. */\n\t@queryAssignedElements({ slot: 'drag-handle' }) private handleNodes!: Element[]\n\n\tprivate position: Position = { x: 16, y: 16 }\n\tprivate containerRef = createRef<HTMLElement>()\n\tprivate triggerRef = createRef<HTMLElement>()\n\tprivate handleRef = createRef<HTMLElement>()\n\tprivate currentAnimation?: Animation\n\n\t#ready = false\n\t#sub?: Subscription\n\t#captured: Element[] = []\n\t#wrapper?: HTMLElement\n\n\t// ============================================\n\t// POSITION MANAGEMENT\n\t// ============================================\n\n\tprivate applyContainerPosition() {\n\t\tconst container = this.containerRef.value\n\t\tif (!container) return\n\t\tcontainer.style.removeProperty('left')\n\t\tcontainer.style.removeProperty('right')\n\t\tcontainer.style.removeProperty('top')\n\t\tcontainer.style.removeProperty('bottom')\n\t\tconst { x, y } = this.position\n\t\tif (this.currentCorner.includes('right')) {\n\t\t\tcontainer.style.right = `${x}px`\n\t\t} else {\n\t\t\tcontainer.style.left = `${x}px`\n\t\t}\n\t\tif (this.currentCorner.includes('bottom')) {\n\t\t\tcontainer.style.bottom = `${y + theme.bottomOffset}px`\n\t\t} else {\n\t\t\tcontainer.style.top = `${y}px`\n\t\t}\n\t}\n\n\tprivate loadPosition() {\n\t\ttry {\n\t\t\tconst saved = localStorage.getItem(POSITION_STORAGE_KEY_PREFIX + this.id)\n\t\t\tif (saved) {\n\t\t\t\tconst parsed = JSON.parse(saved) as { x: number; y: number; anchor: Corner }\n\t\t\t\tthis.position = { x: parsed.x, y: parsed.y }\n\t\t\t\tthis.currentCorner = parsed.anchor\n\t\t\t}\n\t\t} catch {\n\t\t\t// ignore localStorage errors\n\t\t}\n\t}\n\n\tprivate savePosition() {\n\t\ttry {\n\t\t\tlocalStorage.setItem(\n\t\t\t\tPOSITION_STORAGE_KEY_PREFIX + this.id,\n\t\t\t\tJSON.stringify({ ...this.position, anchor: this.currentCorner }),\n\t\t\t)\n\t\t} catch {\n\t\t\t// ignore localStorage errors\n\t\t}\n\t}\n\n\tprivate validateBounds() {\n\t\tconst container = this.containerRef.value\n\t\tif (!container) return\n\t\tconst rect = container.getBoundingClientRect()\n\t\tif (rect.width === 0) return\n\t\tconst vw = window.innerWidth\n\t\tconst vh = window.innerHeight\n\t\tconst isRight = this.currentCorner.includes('right')\n\t\tconst isBottom = this.currentCorner.includes('bottom')\n\t\tconst actualLeft = isRight ? vw - this.position.x - rect.width : this.position.x\n\t\tconst actualTop = isBottom ? vh - this.position.y - rect.height : this.position.y\n\t\tconst newLeft = Math.max(0, Math.min(actualLeft, vw - rect.width))\n\t\tconst newTop = Math.max(0, Math.min(actualTop, vh - rect.height))\n\t\tthis.position = {\n\t\t\tx: isRight ? vw - newLeft - rect.width : newLeft,\n\t\t\ty: isBottom ? vh - newTop - rect.height : newTop,\n\t\t}\n\t\tthis.applyContainerPosition()\n\t}\n\n\t// ============================================\n\t// CORNER SNAPPING (FLIP)\n\t// ============================================\n\n\tprivate reorientToNearestCorner(): void {\n\t\tconst container = this.containerRef.value\n\t\tif (!container) return\n\n\t\tconst rect = container.getBoundingClientRect()\n\t\tconst fabCenterX = rect.left + rect.width / 2\n\t\tconst fabCenterY = rect.top + rect.height / 2\n\t\tconst side = fabCenterX > window.innerWidth / 2 ? 'right' : 'left'\n\t\tconst vert = fabCenterY > window.innerHeight / 2 ? 'bottom' : 'top'\n\t\tthis.currentCorner = `${vert}-${side}` as Corner\n\t\tthis.position = { x: 16, y: 16 }\n\t\tthis.applyContainerPosition()\n\n\t\tif (reducedMotion$.value) {\n\t\t\tthis.savePosition()\n\t\t\treturn\n\t\t}\n\n\t\tconst newRect = container.getBoundingClientRect()\n\t\tconst dx = rect.left - newRect.left\n\t\tconst dy = rect.top - newRect.top\n\t\tcontainer.style.transform = `translate(${dx}px, ${dy}px)`\n\n\t\tthis.currentAnimation?.cancel()\n\t\tconst anim = container.animate(\n\t\t\t[{ transform: container.style.transform }, { transform: 'translate(0,0)' }],\n\t\t\t{\n\t\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t)\n\t\tthis.currentAnimation = anim\n\t\tanim.finished.then(() => {\n\t\t\tif (container.isConnected) container.style.transform = ''\n\t\t\treturn\n\t\t})\n\n\t\tthis.savePosition()\n\t}\n\n\t// ============================================\n\t// OVERLAY DELEGATION\n\t// ============================================\n\n\tprivate openOverlay() {\n\t\tif (this.#sub) return\n\t\tconst anchor = this.containerRef.value\n\t\tthis.#wrapper = document.createElement('div')\n\t\tthis.#wrapper.className = 'flex flex-col'\n\t\tthis.#captured = [...this.slotted]\n\t\tthis.#captured.forEach(node => this.#wrapper!.appendChild(node))\n\n\t\tthis.#sub = show(this.#wrapper, {\n\t\t\tanchor: anchor ?? undefined,\n\t\t\tdismissable: true,\n\t\t\thistoryStrategy: 'silent',\n\t\t})\n\t\t\t.pipe(\n\t\t\t\tfinalize(() => this.restoreSlotted()),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\n\t\tthis.dispatchScopedEvent('toggle', 'open')\n\t}\n\n\tprivate restoreSlotted() {\n\t\tthis.#captured.forEach(node => this.appendChild(node))\n\t\tthis.#captured = []\n\t\tthis.#wrapper = undefined\n\t\tthis.#sub = undefined\n\t\tif (this.open) this.open = false\n\t\tthis.dispatchScopedEvent('toggle', 'closed')\n\t}\n\n\t// ============================================\n\t// LIFECYCLE\n\t// ============================================\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// One concern: keep the container in place when the environment\n\t\t// shifts. Viewport resize re-validates bounds; a theme bottom-offset\n\t\t// change (e.g. a snackbar pushing the safe area) re-applies position.\n\t\tmerge(\n\t\t\tfromEvent(window, 'resize').pipe(tap(() => this.validateBounds())),\n\t\t\ttheme.bottomOffset$.pipe(tap(() => this.applyContainerPosition())),\n\t\t)\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe()\n\t}\n\n\tfirstUpdated() {\n\t\tthis.currentCorner = this.corner\n\t\tthis.hasHandle = this.handleNodes.length > 0\n\t\tthis.loadPosition()\n\t\tconst container = this.containerRef.value\n\t\tconst trigger = this.triggerRef.value\n\t\tconst handle = this.handleRef.value\n\t\tif (!container || !trigger || !handle) return\n\t\tthis.applyContainerPosition()\n\n\t\t// Three intents, three sources, one pipeline, one subscribe.\n\t\t//\n\t\t// open$ — a plain click/Enter/Space on the trigger region. No\n\t\t// preventDefault/stopPropagation: a slotted button's own\n\t\t// click still fires; it merely also bubbles to \"open\".\n\t\t// drag$ — pointerdown on the boat-owned drag-handle wrapper. A\n\t\t// dedicated region, so every pointerdown there is a drag\n\t\t// intent — no element-type sniffing. A session ends on\n\t\t// pointerup/cancel; settle = move past threshold ? snap to\n\t\t// the nearest corner : treat as a tap and open.\n\t\tmerge(\n\t\t\tfromEvent<MouseEvent>(trigger, 'click').pipe(tap(() => this.toggle())),\n\t\t\tfromEvent<KeyboardEvent>(trigger, 'keydown').pipe(\n\t\t\t\tfilter(e => e.key === 'Enter' || e.key === ' '),\n\t\t\t\ttap(e => {\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tthis.toggle()\n\t\t\t\t}),\n\t\t\t),\n\t\t\tfromEvent<PointerEvent>(handle, 'pointerdown').pipe(\n\t\t\t\tfilter(e => e.button === 0),\n\t\t\t\ttap(e => {\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\t// Capture can throw InvalidStateError if the pointer is\n\t\t\t\t\t// already released (fast tap) — drag still works without it.\n\t\t\t\t\ttry {\n\t\t\t\t\t\thandle.setPointerCapture(e.pointerId)\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// no active pointer to capture; ignore\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\texhaustMap(down => {\n\t\t\t\t\tconst rect = container.getBoundingClientRect()\n\t\t\t\t\tconst offsetX = down.clientX - rect.left\n\t\t\t\t\tconst offsetY = down.clientY - rect.top\n\t\t\t\t\tlet moved = false\n\t\t\t\t\tconst sameId = (e: PointerEvent) => e.pointerId === down.pointerId\n\t\t\t\t\tconst end$ = merge(\n\t\t\t\t\t\tfromEvent<PointerEvent>(window, 'pointerup'),\n\t\t\t\t\t\tfromEvent<PointerEvent>(window, 'pointercancel'),\n\t\t\t\t\t).pipe(filter(sameId))\n\n\t\t\t\t\treturn fromEvent<PointerEvent>(window, 'pointermove').pipe(\n\t\t\t\t\t\tfilter(sameId),\n\t\t\t\t\t\ttap(e => {\n\t\t\t\t\t\t\tconst dx = e.clientX - down.clientX\n\t\t\t\t\t\t\tconst dy = e.clientY - down.clientY\n\t\t\t\t\t\t\tif (!moved && Math.sqrt(dx * dx + dy * dy) > DRAG_THRESHOLD) {\n\t\t\t\t\t\t\t\tmoved = true\n\t\t\t\t\t\t\t\tthis.isDragging = true\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!moved) return\n\t\t\t\t\t\t\tconst vw = window.innerWidth\n\t\t\t\t\t\t\tconst vh = window.innerHeight\n\t\t\t\t\t\t\tconst left = Math.max(0, Math.min(e.clientX - offsetX, vw - rect.width))\n\t\t\t\t\t\t\tconst top = Math.max(0, Math.min(e.clientY - offsetY, vh - rect.height))\n\t\t\t\t\t\t\tthis.position = {\n\t\t\t\t\t\t\t\tx: this.currentCorner.includes('right') ? vw - left - rect.width : left,\n\t\t\t\t\t\t\t\ty: this.currentCorner.includes('bottom') ? vh - top - rect.height : top,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.applyContainerPosition()\n\t\t\t\t\t\t}),\n\t\t\t\t\t\ttakeUntil(end$),\n\t\t\t\t\t\tfinalize(() => {\n\t\t\t\t\t\t\tif (moved) this.reorientToNearestCorner()\n\t\t\t\t\t\t\telse this.toggle()\n\t\t\t\t\t\t\tthis.isDragging = false\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe()\n\n\t\tthis.#ready = true\n\t\tif (this.open) this.openOverlay()\n\t}\n\n\tprotected willUpdate(changed: PropertyValues<this>) {\n\t\tif (!this.#ready || !changed.has('open')) return\n\t\tif (this.open && !this.#sub) this.openOverlay()\n\t\telse if (!this.open && this.#sub) this.#sub.unsubscribe()\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tthis.currentAnimation?.cancel()\n\t\tthis.#sub?.unsubscribe()\n\t}\n\n\t// ============================================\n\t// PUBLIC API\n\t// ============================================\n\n\t/** Flip open ↔ closed. */\n\ttoggle() {\n\t\tthis.open = !this.open\n\t}\n\n\t// ============================================\n\t// RENDER\n\t// ============================================\n\n\tprivate onHandleSlotChange = () => {\n\t\tthis.hasHandle = this.handleNodes.length > 0\n\t}\n\n\t// When Lit re-renders the parent and re-asserts default-slot children back\n\t// into this element, slotchange fires. If the overlay is live, re-relocate\n\t// any reassigned nodes into the overlay wrapper to stop the DOM ping-pong.\n\tprivate onDefaultSlotChange = () => {\n\t\tif (!this.#sub || !this.#wrapper) return\n\t\tthis.slotted.forEach(node => {\n\t\t\tif (node.parentElement !== this.#wrapper) {\n\t\t\t\tthis.#captured.push(node)\n\t\t\t\tthis.#wrapper!.appendChild(node)\n\t\t\t}\n\t\t})\n\t}\n\n\tprotected render(): unknown {\n\t\tconst containerClasses = classMap({\n\t\t\t'inline-flex': true,\n\t\t\t'transition-opacity': true,\n\t\t\t'duration-200': true,\n\t\t\t'opacity-85': this.isDragging,\n\t\t\t'scale-95': this.isDragging,\n\t\t})\n\n\t\tconst containerStyles = styleMap({\n\t\t\tposition: 'fixed',\n\t\t\t'pointer-events': 'auto',\n\t\t})\n\n\t\t// Boat-owned drag region — wraps ONLY the drag-handle slot, so every\n\t\t// pointerdown inside it is unambiguously a drag intent. Hidden (and\n\t\t// out of layout) when the consumer slots no handle: the boat is then\n\t\t// simply not draggable.\n\t\tconst handleClasses = classMap({\n\t\t\tflex: true,\n\t\t\t'items-center': true,\n\t\t\t'touch-none': true,\n\t\t\t'select-none': true,\n\t\t\thidden: !this.hasHandle,\n\t\t\t'cursor-grabbing': this.isDragging,\n\t\t\t'cursor-grab': !this.isDragging,\n\t\t})\n\n\t\treturn html`\n\t\t\t<schmancy-surface\n\t\t\t\t${ref(this.containerRef)}\n\t\t\t\ttype=\"glass\"\n\t\t\t\tclass=\"${containerClasses} overflow-hidden rounded-2xl shadow-md\"\n\t\t\t\tstyle=${containerStyles}\n\t\t\t\taria-expanded=${this.open}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\t${ref(this.handleRef)}\n\t\t\t\t\tclass=${handleClasses}\n\t\t\t\t\taria-label=\"Drag to move\"\n\t\t\t\t>\n\t\t\t\t\t<slot name=\"drag-handle\" @slotchange=${this.onHandleSlotChange}></slot>\n\t\t\t\t</div>\n\n\t\t\t\t<div\n\t\t\t\t\t${ref(this.triggerRef)}\n\t\t\t\t\tclass=\"flex items-center cursor-pointer\"\n\t\t\t\t\trole=\"button\"\n\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\taria-label=\"Open panel\"\n\t\t\t\t\ttitle=\"Click to open\"\n\t\t\t\t>\n\t\t\t\t\t<slot name=\"trigger\"></slot>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Default-slot content parks here (hidden) while collapsed;\n\t\t\t\t relocated into the show() overlay on open. -->\n\t\t\t\t<div hidden><slot @slotchange=${this.onDefaultSlotChange}></slot></div>\n\t\t\t</schmancy-surface>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-boat': SchmancyBoat\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"boat-DoZGgQ0P.js","names":["#sub","#wrapper","#captured","#ready"],"sources":["../src/boat/boat.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { html, type PropertyValues } from 'lit'\nimport { customElement, property, queryAssignedElements, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport { exhaustMap, filter, finalize, fromEvent, merge, type Subscription, takeUntil, tap } from 'rxjs'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport { show } from '../overlay/overlay.service'\nimport { theme } from '../theme/theme.service.js'\nimport { SPRING_SMOOTH } from '../utils/animation.js'\n\nconst DRAG_THRESHOLD = 5\nconst POSITION_STORAGE_KEY_PREFIX = 'schmancy-boat-'\n\ntype Corner = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\ninterface Position {\n\tx: number\n\ty: number\n}\n\n/**\n * Corner-anchored launcher that delegates its expanded panel to the `show()`\n * overlay service.\n *\n * Three slots, three non-overlapping intents — no element-type sniffing,\n * ever:\n *\n * - `trigger` — pure consumer content. A native click anywhere on it\n * opens the panel; interactive children (buttons, FABs, inputs) work\n * with zero special-casing because the boat never calls\n * `preventDefault` / `stopPropagation` / `setPointerCapture` here.\n * - `drag-handle` — opt-in. Pointer-drag is wired ONLY to this slot's\n * boat-owned wrapper. Slot it to make the boat draggable; omit it and\n * the boat is static at its corner. (A no-move tap on the handle also\n * opens, so the grip doubles as a launcher.)\n * - _(default)_ — the panel body; parked hidden while collapsed,\n * relocated into the `show()` overlay on open.\n *\n * The boat owns drag, corner-snapping, position persistence and the glass\n * surface — never the collapsed shape.\n */\n@customElement('schmancy-boat')\nexport default class SchmancyBoat extends SchmancyElement {\n\n\n\t/** Identity for localStorage drag-position persistence. */\n\t@property({ type: String }) id: string = 'default'\n\t/** Corner the launcher is anchored to. */\n\t@property({ type: String }) corner: Corner = 'bottom-right'\n\t/** Open state. Bind `?open=${…}` to drive the overlay; reflected to the attribute. */\n\t@property({ type: Boolean, reflect: true }) open: boolean = false\n\n\t@state() private isDragging = false\n\t@state() private currentCorner: Corner = 'bottom-right'\n\t@state() private hasHandle = false\n\n\t/** Default-slot nodes — the overlay body. */\n\t@queryAssignedElements() private slotted!: Element[]\n\t/** Slotted drag-handle nodes — presence toggles draggability. */\n\t@queryAssignedElements({ slot: 'drag-handle' }) private handleNodes!: Element[]\n\n\tprivate position: Position = { x: 16, y: 16 }\n\tprivate containerRef = createRef<HTMLElement>()\n\tprivate triggerRef = createRef<HTMLElement>()\n\tprivate handleRef = createRef<HTMLElement>()\n\tprivate currentAnimation?: Animation\n\n\t#ready = false\n\t#sub?: Subscription\n\t#captured: Element[] = []\n\t#wrapper?: HTMLElement\n\n\t// ============================================\n\t// POSITION MANAGEMENT\n\t// ============================================\n\n\tprivate applyContainerPosition() {\n\t\tconst container = this.containerRef.value\n\t\tif (!container) return\n\t\tcontainer.style.removeProperty('left')\n\t\tcontainer.style.removeProperty('right')\n\t\tcontainer.style.removeProperty('top')\n\t\tcontainer.style.removeProperty('bottom')\n\t\tconst { x, y } = this.position\n\t\tif (this.currentCorner.includes('right')) {\n\t\t\tcontainer.style.right = `${x}px`\n\t\t} else {\n\t\t\tcontainer.style.left = `${x}px`\n\t\t}\n\t\tif (this.currentCorner.includes('bottom')) {\n\t\t\tcontainer.style.bottom = `${y + theme.bottomOffset}px`\n\t\t} else {\n\t\t\tcontainer.style.top = `${y}px`\n\t\t}\n\t}\n\n\tprivate loadPosition() {\n\t\ttry {\n\t\t\tconst saved = localStorage.getItem(POSITION_STORAGE_KEY_PREFIX + this.id)\n\t\t\tif (saved) {\n\t\t\t\tconst parsed = JSON.parse(saved) as { x: number; y: number; anchor: Corner }\n\t\t\t\tthis.position = { x: parsed.x, y: parsed.y }\n\t\t\t\tthis.currentCorner = parsed.anchor\n\t\t\t}\n\t\t} catch {\n\t\t\t// ignore localStorage errors\n\t\t}\n\t}\n\n\tprivate savePosition() {\n\t\ttry {\n\t\t\tlocalStorage.setItem(\n\t\t\t\tPOSITION_STORAGE_KEY_PREFIX + this.id,\n\t\t\t\tJSON.stringify({ ...this.position, anchor: this.currentCorner }),\n\t\t\t)\n\t\t} catch {\n\t\t\t// ignore localStorage errors\n\t\t}\n\t}\n\n\tprivate validateBounds() {\n\t\tconst container = this.containerRef.value\n\t\tif (!container) return\n\t\tconst rect = container.getBoundingClientRect()\n\t\tif (rect.width === 0) return\n\t\tconst vw = window.innerWidth\n\t\tconst vh = window.innerHeight\n\t\tconst isRight = this.currentCorner.includes('right')\n\t\tconst isBottom = this.currentCorner.includes('bottom')\n\t\tconst actualLeft = isRight ? vw - this.position.x - rect.width : this.position.x\n\t\tconst actualTop = isBottom ? vh - this.position.y - rect.height : this.position.y\n\t\tconst newLeft = Math.max(0, Math.min(actualLeft, vw - rect.width))\n\t\tconst newTop = Math.max(0, Math.min(actualTop, vh - rect.height))\n\t\tthis.position = {\n\t\t\tx: isRight ? vw - newLeft - rect.width : newLeft,\n\t\t\ty: isBottom ? vh - newTop - rect.height : newTop,\n\t\t}\n\t\tthis.applyContainerPosition()\n\t}\n\n\t// ============================================\n\t// CORNER SNAPPING (FLIP)\n\t// ============================================\n\n\tprivate reorientToNearestCorner(): void {\n\t\tconst container = this.containerRef.value\n\t\tif (!container) return\n\n\t\tconst rect = container.getBoundingClientRect()\n\t\tconst fabCenterX = rect.left + rect.width / 2\n\t\tconst fabCenterY = rect.top + rect.height / 2\n\t\tconst side = fabCenterX > window.innerWidth / 2 ? 'right' : 'left'\n\t\tconst vert = fabCenterY > window.innerHeight / 2 ? 'bottom' : 'top'\n\t\tthis.currentCorner = `${vert}-${side}` as Corner\n\t\tthis.position = { x: 16, y: 16 }\n\t\tthis.applyContainerPosition()\n\n\t\tif (reducedMotion$.value) {\n\t\t\tthis.savePosition()\n\t\t\treturn\n\t\t}\n\n\t\tconst newRect = container.getBoundingClientRect()\n\t\tconst dx = rect.left - newRect.left\n\t\tconst dy = rect.top - newRect.top\n\t\tcontainer.style.transform = `translate(${dx}px, ${dy}px)`\n\n\t\tthis.currentAnimation?.cancel()\n\t\tconst anim = container.animate(\n\t\t\t[{ transform: container.style.transform }, { transform: 'translate(0,0)' }],\n\t\t\t{\n\t\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t)\n\t\tthis.currentAnimation = anim\n\t\tanim.finished.then(() => {\n\t\t\tif (container.isConnected) container.style.transform = ''\n\t\t\treturn\n\t\t})\n\n\t\tthis.savePosition()\n\t}\n\n\t// ============================================\n\t// OVERLAY DELEGATION\n\t// ============================================\n\n\tprivate openOverlay() {\n\t\tif (this.#sub) return\n\t\tconst anchor = this.containerRef.value\n\t\tthis.#wrapper = document.createElement('div')\n\t\tthis.#wrapper.className = 'flex flex-col'\n\t\tthis.#captured = [...this.slotted]\n\t\tthis.#captured.forEach(node => this.#wrapper!.appendChild(node))\n\n\t\tthis.#sub = show(this.#wrapper, {\n\t\t\tanchor: anchor ?? undefined,\n\t\t\tdismissable: true,\n\t\t\thistoryStrategy: 'silent',\n\t\t})\n\t\t\t.pipe(\n\t\t\t\tfinalize(() => this.restoreSlotted()),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\n\t\tthis.dispatchScopedEvent('toggle', 'open')\n\t}\n\n\tprivate restoreSlotted() {\n\t\tthis.#captured.forEach(node => this.appendChild(node))\n\t\tthis.#captured = []\n\t\tthis.#wrapper = undefined\n\t\tthis.#sub = undefined\n\t\tif (this.open) this.open = false\n\t\tthis.dispatchScopedEvent('toggle', 'closed')\n\t}\n\n\t// ============================================\n\t// LIFECYCLE\n\t// ============================================\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// One concern: keep the container in place when the environment\n\t\t// shifts. Viewport resize re-validates bounds; a theme bottom-offset\n\t\t// change (e.g. a snackbar pushing the safe area) re-applies position.\n\t\tmerge(\n\t\t\tfromEvent(window, 'resize').pipe(tap(() => this.validateBounds())),\n\t\t\ttheme.bottomOffset$.pipe(tap(() => this.applyContainerPosition())),\n\t\t)\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe()\n\t}\n\n\tfirstUpdated() {\n\t\tthis.currentCorner = this.corner\n\t\tthis.hasHandle = this.handleNodes.length > 0\n\t\tthis.loadPosition()\n\t\tconst container = this.containerRef.value\n\t\tconst trigger = this.triggerRef.value\n\t\tconst handle = this.handleRef.value\n\t\tif (!container || !trigger || !handle) return\n\t\tthis.applyContainerPosition()\n\n\t\t// Three intents, three sources, one pipeline, one subscribe.\n\t\t//\n\t\t// open$ — a plain click/Enter/Space on the trigger region. No\n\t\t// preventDefault/stopPropagation: a slotted button's own\n\t\t// click still fires; it merely also bubbles to \"open\".\n\t\t// drag$ — pointerdown on the boat-owned drag-handle wrapper. A\n\t\t// dedicated region, so every pointerdown there is a drag\n\t\t// intent — no element-type sniffing. A session ends on\n\t\t// pointerup/cancel; settle = move past threshold ? snap to\n\t\t// the nearest corner : treat as a tap and open.\n\t\tmerge(\n\t\t\tfromEvent<MouseEvent>(trigger, 'click').pipe(tap(() => this.toggle())),\n\t\t\tfromEvent<KeyboardEvent>(trigger, 'keydown').pipe(\n\t\t\t\tfilter(e => e.key === 'Enter' || e.key === ' '),\n\t\t\t\ttap(e => {\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tthis.toggle()\n\t\t\t\t}),\n\t\t\t),\n\t\t\tfromEvent<PointerEvent>(handle, 'pointerdown').pipe(\n\t\t\t\tfilter(e => e.button === 0),\n\t\t\t\ttap(e => {\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\t// Capture can throw InvalidStateError if the pointer is\n\t\t\t\t\t// already released (fast tap) — drag still works without it.\n\t\t\t\t\ttry {\n\t\t\t\t\t\thandle.setPointerCapture(e.pointerId)\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// no active pointer to capture; ignore\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\texhaustMap(down => {\n\t\t\t\t\tconst rect = container.getBoundingClientRect()\n\t\t\t\t\tconst offsetX = down.clientX - rect.left\n\t\t\t\t\tconst offsetY = down.clientY - rect.top\n\t\t\t\t\tlet moved = false\n\t\t\t\t\tconst sameId = (e: PointerEvent) => e.pointerId === down.pointerId\n\t\t\t\t\tconst end$ = merge(\n\t\t\t\t\t\tfromEvent<PointerEvent>(window, 'pointerup'),\n\t\t\t\t\t\tfromEvent<PointerEvent>(window, 'pointercancel'),\n\t\t\t\t\t).pipe(filter(sameId))\n\n\t\t\t\t\treturn fromEvent<PointerEvent>(window, 'pointermove').pipe(\n\t\t\t\t\t\tfilter(sameId),\n\t\t\t\t\t\ttap(e => {\n\t\t\t\t\t\t\tconst dx = e.clientX - down.clientX\n\t\t\t\t\t\t\tconst dy = e.clientY - down.clientY\n\t\t\t\t\t\t\tif (!moved && Math.sqrt(dx * dx + dy * dy) > DRAG_THRESHOLD) {\n\t\t\t\t\t\t\t\tmoved = true\n\t\t\t\t\t\t\t\tthis.isDragging = true\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!moved) return\n\t\t\t\t\t\t\tconst vw = window.innerWidth\n\t\t\t\t\t\t\tconst vh = window.innerHeight\n\t\t\t\t\t\t\tconst left = Math.max(0, Math.min(e.clientX - offsetX, vw - rect.width))\n\t\t\t\t\t\t\tconst top = Math.max(0, Math.min(e.clientY - offsetY, vh - rect.height))\n\t\t\t\t\t\t\tthis.position = {\n\t\t\t\t\t\t\t\tx: this.currentCorner.includes('right') ? vw - left - rect.width : left,\n\t\t\t\t\t\t\t\ty: this.currentCorner.includes('bottom') ? vh - top - rect.height : top,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.applyContainerPosition()\n\t\t\t\t\t\t}),\n\t\t\t\t\t\ttakeUntil(end$),\n\t\t\t\t\t\tfinalize(() => {\n\t\t\t\t\t\t\tif (moved) this.reorientToNearestCorner()\n\t\t\t\t\t\t\telse this.toggle()\n\t\t\t\t\t\t\tthis.isDragging = false\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe()\n\n\t\tthis.#ready = true\n\t\tif (this.open) this.openOverlay()\n\t}\n\n\tprotected willUpdate(changed: PropertyValues<this>) {\n\t\tif (!this.#ready || !changed.has('open')) return\n\t\tif (this.open && !this.#sub) this.openOverlay()\n\t\telse if (!this.open && this.#sub) this.#sub.unsubscribe()\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tthis.currentAnimation?.cancel()\n\t\tthis.#sub?.unsubscribe()\n\t}\n\n\t// ============================================\n\t// PUBLIC API\n\t// ============================================\n\n\t/** Flip open ↔ closed. */\n\ttoggle() {\n\t\tthis.open = !this.open\n\t}\n\n\t// ============================================\n\t// RENDER\n\t// ============================================\n\n\tprivate onHandleSlotChange = () => {\n\t\tthis.hasHandle = this.handleNodes.length > 0\n\t}\n\n\t// When Lit re-renders the parent and re-asserts default-slot children back\n\t// into this element, slotchange fires. If the overlay is live, re-relocate\n\t// any reassigned nodes into the overlay wrapper to stop the DOM ping-pong.\n\tprivate onDefaultSlotChange = () => {\n\t\tif (!this.#sub || !this.#wrapper) return\n\t\tthis.slotted.forEach(node => {\n\t\t\tif (node.parentElement !== this.#wrapper) {\n\t\t\t\tthis.#captured.push(node)\n\t\t\t\tthis.#wrapper!.appendChild(node)\n\t\t\t}\n\t\t})\n\t}\n\n\tprotected render(): unknown {\n\t\tconst containerClasses = classMap({\n\t\t\t'inline-flex': true,\n\t\t\t'transition-opacity': true,\n\t\t\t'duration-200': true,\n\t\t\t'opacity-85': this.isDragging,\n\t\t\t'scale-95': this.isDragging,\n\t\t})\n\n\t\tconst containerStyles = styleMap({\n\t\t\tposition: 'fixed',\n\t\t\t'pointer-events': 'auto',\n\t\t})\n\n\t\t// Boat-owned drag region — wraps ONLY the drag-handle slot, so every\n\t\t// pointerdown inside it is unambiguously a drag intent. Hidden (and\n\t\t// out of layout) when the consumer slots no handle: the boat is then\n\t\t// simply not draggable.\n\t\tconst handleClasses = classMap({\n\t\t\tflex: true,\n\t\t\t'items-center': true,\n\t\t\t'touch-none': true,\n\t\t\t'select-none': true,\n\t\t\thidden: !this.hasHandle,\n\t\t\t'cursor-grabbing': this.isDragging,\n\t\t\t'cursor-grab': !this.isDragging,\n\t\t})\n\n\t\treturn html`\n\t\t\t<schmancy-surface\n\t\t\t\t${ref(this.containerRef)}\n\t\t\t\ttype=\"container\"\n\t\t\t\tclass=\"${containerClasses} overflow-hidden rounded-2xl shadow-md\"\n\t\t\t\tstyle=${containerStyles}\n\t\t\t\taria-expanded=${this.open}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\t${ref(this.handleRef)}\n\t\t\t\t\tclass=${handleClasses}\n\t\t\t\t\taria-label=\"Drag to move\"\n\t\t\t\t>\n\t\t\t\t\t<slot name=\"drag-handle\" @slotchange=${this.onHandleSlotChange}></slot>\n\t\t\t\t</div>\n\n\t\t\t\t<div\n\t\t\t\t\t${ref(this.triggerRef)}\n\t\t\t\t\tclass=\"flex items-center cursor-pointer\"\n\t\t\t\t\trole=\"button\"\n\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\taria-label=\"Open panel\"\n\t\t\t\t\ttitle=\"Click to open\"\n\t\t\t\t>\n\t\t\t\t\t<slot name=\"trigger\"></slot>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Default-slot content parks here (hidden) while collapsed;\n\t\t\t\t relocated into the show() overlay on open. -->\n\t\t\t\t<div hidden><slot @slotchange=${this.onDefaultSlotChange}></slot></div>\n\t\t\t</schmancy-surface>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-boat': SchmancyBoat\n\t}\n}\n"],"mappings":";;;;;;;;;;;;AAYA,IACM,IAA8B,kBA8BrB,IAAA,cAA2B,EAAA;CAAA,YAAA,GAAA,GAAA;EAAA,MAAA,GAAA,CAAA,GAAA,KAAA,KAIA,WAAA,KAAA,SAEI,gBAAA,KAAA,OAAA,CAEe,GAAA,KAAA,aAAA,CAE9B,GAAA,KAAA,gBACW,gBAAA,KAAA,YAAA,CACZ,GAAA,KAAA,WAOA;GAAE,GAAG;GAAI,GAAG;EAAA,GAAA,KAAA,eAClB,EAAA,GAAA,KAAA,aACF,EAAA,GAAA,KAAA,YACD,EAAA,GAAA,KAAA,KAAA,CAGX,GAAA,KAAA,KAEc,CAAA,GAAA,KAAA,2BAAA;GA4RtB,KAAK,YAAY,KAAK,YAAY,SAAS;EAAA,GAAA,KAAA,4BAAA;GAOtC,KAAA,MAAc,KAAA,MACnB,KAAK,QAAQ,SAAQ,MAAA;IAChB,EAAK,kBAAkB,KAAA,OAC1B,KAAA,GAAe,KAAK,CAAA,GACpB,KAAA,GAAe,YAAY,CAAA;GAAA,CAAA;EAAA;CAAA;CAzS9B;CACA;CACA;CACA;CAMA,yBAAA;EACC,IAAM,IAAY,KAAK,aAAa;EACpC,IAAA,CAAK,GAAW;EAChB,EAAU,MAAM,eAAe,MAAA,GAC/B,EAAU,MAAM,eAAe,OAAA,GAC/B,EAAU,MAAM,eAAe,KAAA,GAC/B,EAAU,MAAM,eAAe,QAAA;EAC/B,IAAA,EAAM,GAAE,GAAA,GAAG,MAAM,KAAK;EAClB,KAAK,cAAc,SAAS,OAAA,IAC/B,EAAU,MAAM,QAAQ,GAAG,EAAA,MAE3B,EAAU,MAAM,OAAO,GAAG,EAAA,KAEvB,KAAK,cAAc,SAAS,QAAA,IAC/B,EAAU,MAAM,SAAS,GAAG,IAAI,EAAM,aAAA,MAEtC,EAAU,MAAM,MAAM,GAAG,EAAA;CAE3B;CAEA,eAAA;EACC,IAAA;GACC,IAAM,IAAQ,aAAa,QAAQ,IAA8B,KAAK,EAAA;GACtE,IAAI,GAAO;IACV,IAAM,IAAS,KAAK,MAAM,CAAA;IAC1B,KAAK,WAAW;KAAE,GAAG,EAAO;KAAG,GAAG,EAAO;IAAA,GACzC,KAAK,gBAAgB,EAAO;GAC7B;EACD,QAAA,CAEA;CACD;CAEA,eAAA;EACC,IAAA;GACC,aAAa,QACZ,IAA8B,KAAK,IACnC,KAAK,UAAU;IAAA,GAAK,KAAK;IAAU,QAAQ,KAAK;GAAA,CAAA,CAAA;EAElD,QAAA,CAEA;CACD;CAEA,iBAAA;EACC,IAAM,IAAY,KAAK,aAAa;EACpC,IAAA,CAAK,GAAW;EAChB,IAAM,IAAO,EAAU,sBAAA;EACvB,IAAI,EAAK,UAAU,GAAG;EACtB,IAAM,IAAK,OAAO,YACZ,IAAK,OAAO,aACZ,IAAU,KAAK,cAAc,SAAS,OAAA,GACtC,IAAW,KAAK,cAAc,SAAS,QAAA,GACvC,IAAa,IAAU,IAAK,KAAK,SAAS,IAAI,EAAK,QAAQ,KAAK,SAAS,GACzE,IAAY,IAAW,IAAK,KAAK,SAAS,IAAI,EAAK,SAAS,KAAK,SAAS,GAC1E,IAAU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAY,IAAK,EAAK,KAAA,CAAA,GACrD,IAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAW,IAAK,EAAK,MAAA,CAAA;EACzD,KAAK,WAAW;GACf,GAAG,IAAU,IAAK,IAAU,EAAK,QAAQ;GACzC,GAAG,IAAW,IAAK,IAAS,EAAK,SAAS;EAAA,GAE3C,KAAK,uBAAA;CACN;CAMA,0BAAA;EACC,IAAM,IAAY,KAAK,aAAa;EACpC,IAAA,CAAK,GAAW;EAEhB,IAAM,IAAO,EAAU,sBAAA,GACjB,IAAa,EAAK,OAAO,EAAK,QAAQ,GACtC,IAAa,EAAK,MAAM,EAAK,SAAS,GACtC,IAAO,IAAa,OAAO,aAAa,IAAI,UAAU,QACtD,IAAO,IAAa,OAAO,cAAc,IAAI,WAAW;EAK9D,IAJA,KAAK,gBAAgB,GAAG,EAAA,GAAQ,KAChC,KAAK,WAAW;GAAE,GAAG;GAAI,GAAG;EAAA,GAC5B,KAAK,uBAAA,GAED,EAAe,OAElB,OAAA,KADA,KAAK,aAAA;EAIN,IAAM,IAAU,EAAU,sBAAA,GACpB,IAAK,EAAK,OAAO,EAAQ,MACzB,IAAK,EAAK,MAAM,EAAQ;EAC9B,EAAU,MAAM,YAAY,aAAa,EAAA,MAAS,EAAA,MAElD,KAAK,kBAAkB,OAAA;EACvB,IAAM,IAAO,EAAU,QACtB,CAAC,EAAE,WAAW,EAAU,MAAM,UAAA,GAAa,EAAE,WAAW,iBAAA,CAAA,GACxD;GACC,UAAU,EAAc;GACxB,QAAQ,EAAc;GACtB,MAAM;EAAA,CAAA;EAGR,KAAK,mBAAmB,GACxB,EAAK,SAAS,WAAA;GACT,EAAU,gBAAa,EAAU,MAAM,YAAY;EAAA,CAAA,GAIxD,KAAK,aAAA;CACN;CAMA,cAAA;EACC,IAAI,KAAA,IAAW;EACf,IAAM,IAAS,KAAK,aAAa;EACjC,KAAA,KAAgB,SAAS,cAAc,KAAA,GACvC,KAAA,GAAc,YAAY,iBAC1B,KAAA,KAAiB,CAAA,GAAI,KAAK,OAAA,GAC1B,KAAA,GAAe,SAAQ,MAAQ,KAAA,GAAe,YAAY,CAAA,CAAA,GAE1D,KAAA,KAAY,EAAK,KAAA,IAAe;GAC/B,QAAQ,KAAA,KAAU;GAClB,aAAA,CAAa;GACb,iBAAiB;EAAA,CAAA,EAEhB,KACA,QAAe,KAAK,eAAA,CAAA,GACpB,EAAU,KAAK,aAAA,CAAA,EAEf,UAAA,GAEF,KAAK,oBAAoB,UAAU,MAAA;CACpC;CAEA,iBAAA;EACC,KAAA,GAAe,SAAQ,MAAQ,KAAK,YAAY,CAAA,CAAA,GAChD,KAAA,KAAiB,CAAA,GACjB,KAAA,KAAKC,KAAW,GAChB,KAAA,KAAKD,KAAO,GACR,AAAW,KAAK,SAAA,CAAO,GAC3B,KAAK,oBAAoB,UAAU,QAAA;CACpC;CAMA,oBAAA;EACC,MAAM,kBAAA,GAKN,EACC,EAAU,QAAQ,QAAA,EAAU,KAAK,QAAU,KAAK,eAAA,CAAA,CAAA,GAChD,EAAM,cAAc,KAAK,QAAU,KAAK,uBAAA,CAAA,CAAA,CAAA,EAEvC,KAAK,EAAU,KAAK,aAAA,CAAA,EACpB,UAAA;CACH;CAEA,eAAA;EACC,KAAK,gBAAgB,KAAK,QAC1B,KAAK,YAAY,KAAK,YAAY,SAAS,GAC3C,KAAK,aAAA;EACL,IAAM,IAAY,KAAK,aAAa,OAC9B,IAAU,KAAK,WAAW,OAC1B,IAAS,KAAK,UAAU;EACzB,KAAc,KAAY,MAC/B,KAAK,uBAAA,GAYL,EACC,EAAsB,GAAS,OAAA,EAAS,KAAK,QAAU,KAAK,OAAA,CAAA,CAAA,GAC5D,EAAyB,GAAS,SAAA,EAAW,KAC5C,GAAO,MAAK,EAAE,QAAQ,WAAW,EAAE,QAAQ,GAAR,GACnC,GAAI,MAAA;GACH,EAAE,eAAA,GACF,KAAK,OAAA;EAAA,CAAA,CAAA,GAGP,EAAwB,GAAQ,aAAA,EAAe,KAC9C,GAAO,MAAK,EAAE,WAAW,CAAX,GACd,GAAI,MAAA;GACH,EAAE,eAAA;GAGF,IAAA;IACC,EAAO,kBAAkB,EAAE,SAAA;GAC5B,QAAA,CAEA;EAAA,CAAA,GAED,GAAW,MAAA;GACV,IAAM,IAAO,EAAU,sBAAA,GACjB,IAAU,EAAK,UAAU,EAAK,MAC9B,IAAU,EAAK,UAAU,EAAK,KAChC,IAAA,CAAQ,GACN,KAAU,MAAoB,EAAE,cAAc,EAAK,WACnD,IAAO,EACZ,EAAwB,QAAQ,WAAA,GAChC,EAAwB,QAAQ,eAAA,CAAA,EAC/B,KAAK,EAAO,CAAA,CAAA;GAEd,OAAO,EAAwB,QAAQ,aAAA,EAAe,KACrD,EAAO,CAAA,GACP,GAAI,MAAA;IACH,IAAM,IAAK,EAAE,UAAU,EAAK,SACtB,IAAK,EAAE,UAAU,EAAK;IAK5B,IAAA,CAJK,KAAS,KAAK,KAAK,IAAK,IAAK,IAAK,CAAA,IA5RvB,MA6Rf,IAAA,CAAQ,GACR,KAAK,aAAA,CAAa,IAAA,CAEd,GAAO;IACZ,IAAM,IAAK,OAAO,YACZ,IAAK,OAAO,aACZ,IAAO,KAAK,IAAI,GAAG,KAAK,IAAI,EAAE,UAAU,GAAS,IAAK,EAAK,KAAA,CAAA,GAC3D,IAAM,KAAK,IAAI,GAAG,KAAK,IAAI,EAAE,UAAU,GAAS,IAAK,EAAK,MAAA,CAAA;IAChE,KAAK,WAAW;KACf,GAAG,KAAK,cAAc,SAAS,OAAA,IAAW,IAAK,IAAO,EAAK,QAAQ;KACnE,GAAG,KAAK,cAAc,SAAS,QAAA,IAAY,IAAK,IAAM,EAAK,SAAS;IAAA,GAErE,KAAK,uBAAA;GAAA,CAAA,GAEN,EAAU,CAAA,GACV,QAAA;IACK,IAAO,KAAK,wBAAA,IACX,KAAK,OAAA,GACV,KAAK,aAAA,CAAa;GAAA,CAAA,CAAA;EAAA,CAAA,CAAA,CAAA,EAMrB,KAAK,EAAU,KAAK,aAAA,CAAA,EACpB,UAAA,GAEF,KAAA,KAAKG,CAAS,GACV,KAAK,QAAM,KAAK,YAAA;CACrB;CAEA,WAAqB,GAAA;EACf,KAAA,MAAgB,EAAQ,IAAI,MAAA,MAC7B,KAAK,QAAA,CAAS,KAAA,KAAW,KAAK,YAAA,IAAA,CACxB,KAAK,QAAQ,KAAA,MAAW,KAAA,GAAU,YAAA;CAC7C;CAEA,uBAAA;EACC,MAAM,qBAAA,GACN,KAAK,kBAAkB,OAAA,GACvB,KAAA,IAAW,YAAA;CACZ;CAOA,SAAA;EACC,KAAK,OAAA,CAAQ,KAAK;CACnB;CAuBA,SAAA;EACC,IAAM,IAAmB,EAAS;GACjC,eAAA,CAAe;GACf,sBAAA,CAAsB;GACtB,gBAAA,CAAgB;GAChB,cAAc,KAAK;GACnB,YAAY,KAAK;EAAA,CAAA,GAGZ,IAAkB,EAAS;GAChC,UAAU;GACV,kBAAkB;EAAA,CAAA,GAOb,IAAgB,EAAS;GAC9B,MAAA,CAAM;GACN,gBAAA,CAAgB;GAChB,cAAA,CAAc;GACd,eAAA,CAAe;GACf,QAAA,CAAS,KAAK;GACd,mBAAmB,KAAK;GACxB,eAAA,CAAgB,KAAK;EAAA,CAAA;EAGtB,OAAO,CAAI;;MAEP,EAAI,KAAK,YAAA,EAAA;;aAEF,EAAA;YACD,EAAA;oBACQ,KAAK,KAAA;;;OAGlB,EAAI,KAAK,SAAA,EAAA;aACH,EAAA;;;4CAG+B,KAAK,mBAAA;;;;OAI1C,EAAI,KAAK,UAAA,EAAA;;;;;;;;;;;;oCAYoB,KAAK,oBAAA;;;CAGxC;AAAA;AAAA,EAAA,CA/XC,EAAS,EAAE,MAAM,OAAA,CAAA,CAAA,GAAQ,EAAA,WAAA,MAAA,KAAA,CAAA,GAAA,EAAA,CAEzB,EAAS,EAAE,MAAM,OAAA,CAAA,CAAA,GAAQ,EAAA,WAAA,UAAA,KAAA,CAAA,GAAA,EAAA,CAEzB,EAAS;CAAE,MAAM;CAAS,SAAA,CAAS;AAAA,CAAA,CAAA,GAAM,EAAA,WAAA,QAAA,KAAA,CAAA,GAAA,EAAA,CAEzC,EAAA,CAAA,GAAM,EAAA,WAAA,cAAA,KAAA,CAAA,GAAA,EAAA,CACN,EAAA,CAAA,GAAM,EAAA,WAAA,iBAAA,KAAA,CAAA,GAAA,EAAA,CACN,EAAA,CAAA,GAAM,EAAA,WAAA,aAAA,KAAA,CAAA,GAAA,EAAA,CAGN,EAAA,CAAA,GAAsB,EAAA,WAAA,WAAA,KAAA,CAAA,GAAA,EAAA,CAEtB,EAAsB,EAAE,MAAM,cAAA,CAAA,CAAA,GAAe,EAAA,WAAA,eAAA,KAAA,CAAA;AAAA,IAAA,IAAA,IAAA,EAAA,CAlB9C,EAAc,eAAA,CAAA,GAAe,CAAA;AAAA,SAAA,KAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-
|
|
1
|
+
require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-CeKrBW2j.cjs`);require(`./mixins-Cjn20BQH.cjs`);const t=require(`./animation-CCOIW4wJ.cjs`),n=require(`./reduced-motion-Ds-HjMzn.cjs`),r=require(`./theme.service-h2fXQq7x.cjs`),i=require(`./overlay.service-MMTiW2T3.cjs`);let a=require(`rxjs`),o=require(`lit/directives/class-map.js`),s=require(`lit/directives/style-map.js`),c=require(`lit/decorators.js`),l=require(`lit`),u=require(`lit/directives/ref.js`);var d=`schmancy-boat-`,f=class extends e.t{constructor(...e){super(...e),this.id=`default`,this.corner=`bottom-right`,this.open=!1,this.isDragging=!1,this.currentCorner=`bottom-right`,this.hasHandle=!1,this.position={x:16,y:16},this.containerRef=(0,u.createRef)(),this.triggerRef=(0,u.createRef)(),this.handleRef=(0,u.createRef)(),this.#e=!1,this.#n=[],this.onHandleSlotChange=()=>{this.hasHandle=this.handleNodes.length>0},this.onDefaultSlotChange=()=>{this.#t&&this.#r&&this.slotted.forEach(e=>{e.parentElement!==this.#r&&(this.#n.push(e),this.#r.appendChild(e))})}}#e;#t;#n;#r;applyContainerPosition(){let e=this.containerRef.value;if(!e)return;e.style.removeProperty(`left`),e.style.removeProperty(`right`),e.style.removeProperty(`top`),e.style.removeProperty(`bottom`);let{x:t,y:n}=this.position;this.currentCorner.includes(`right`)?e.style.right=`${t}px`:e.style.left=`${t}px`,this.currentCorner.includes(`bottom`)?e.style.bottom=`${n+r.n.bottomOffset}px`:e.style.top=`${n}px`}loadPosition(){try{let e=localStorage.getItem(d+this.id);if(e){let t=JSON.parse(e);this.position={x:t.x,y:t.y},this.currentCorner=t.anchor}}catch{}}savePosition(){try{localStorage.setItem(d+this.id,JSON.stringify({...this.position,anchor:this.currentCorner}))}catch{}}validateBounds(){let e=this.containerRef.value;if(!e)return;let t=e.getBoundingClientRect();if(t.width===0)return;let n=window.innerWidth,r=window.innerHeight,i=this.currentCorner.includes(`right`),a=this.currentCorner.includes(`bottom`),o=i?n-this.position.x-t.width:this.position.x,s=a?r-this.position.y-t.height:this.position.y,c=Math.max(0,Math.min(o,n-t.width)),l=Math.max(0,Math.min(s,r-t.height));this.position={x:i?n-c-t.width:c,y:a?r-l-t.height:l},this.applyContainerPosition()}reorientToNearestCorner(){let e=this.containerRef.value;if(!e)return;let r=e.getBoundingClientRect(),i=r.left+r.width/2,a=r.top+r.height/2,o=i>window.innerWidth/2?`right`:`left`,s=a>window.innerHeight/2?`bottom`:`top`;if(this.currentCorner=`${s}-${o}`,this.position={x:16,y:16},this.applyContainerPosition(),n.t.value)return void this.savePosition();let c=e.getBoundingClientRect(),l=r.left-c.left,u=r.top-c.top;e.style.transform=`translate(${l}px, ${u}px)`,this.currentAnimation?.cancel();let d=e.animate([{transform:e.style.transform},{transform:`translate(0,0)`}],{duration:t.d.duration,easing:t.d.easingFallback,fill:`forwards`});this.currentAnimation=d,d.finished.then(()=>{e.isConnected&&(e.style.transform=``)}),this.savePosition()}openOverlay(){if(this.#t)return;let e=this.containerRef.value;this.#r=document.createElement(`div`),this.#r.className=`flex flex-col`,this.#n=[...this.slotted],this.#n.forEach(e=>this.#r.appendChild(e)),this.#t=i.o(this.#r,{anchor:e??void 0,dismissable:!0,historyStrategy:`silent`}).pipe((0,a.finalize)(()=>this.restoreSlotted()),(0,a.takeUntil)(this.disconnecting)).subscribe(),this.dispatchScopedEvent(`toggle`,`open`)}restoreSlotted(){this.#n.forEach(e=>this.appendChild(e)),this.#n=[],this.#r=void 0,this.#t=void 0,this.open&&=!1,this.dispatchScopedEvent(`toggle`,`closed`)}connectedCallback(){super.connectedCallback(),(0,a.merge)((0,a.fromEvent)(window,`resize`).pipe((0,a.tap)(()=>this.validateBounds())),r.n.bottomOffset$.pipe((0,a.tap)(()=>this.applyContainerPosition()))).pipe((0,a.takeUntil)(this.disconnecting)).subscribe()}firstUpdated(){this.currentCorner=this.corner,this.hasHandle=this.handleNodes.length>0,this.loadPosition();let e=this.containerRef.value,t=this.triggerRef.value,n=this.handleRef.value;e&&t&&n&&(this.applyContainerPosition(),(0,a.merge)((0,a.fromEvent)(t,`click`).pipe((0,a.tap)(()=>this.toggle())),(0,a.fromEvent)(t,`keydown`).pipe((0,a.filter)(e=>e.key===`Enter`||e.key===` `),(0,a.tap)(e=>{e.preventDefault(),this.toggle()})),(0,a.fromEvent)(n,`pointerdown`).pipe((0,a.filter)(e=>e.button===0),(0,a.tap)(e=>{e.preventDefault();try{n.setPointerCapture(e.pointerId)}catch{}}),(0,a.exhaustMap)(t=>{let n=e.getBoundingClientRect(),r=t.clientX-n.left,i=t.clientY-n.top,o=!1,s=e=>e.pointerId===t.pointerId,c=(0,a.merge)((0,a.fromEvent)(window,`pointerup`),(0,a.fromEvent)(window,`pointercancel`)).pipe((0,a.filter)(s));return(0,a.fromEvent)(window,`pointermove`).pipe((0,a.filter)(s),(0,a.tap)(e=>{let a=e.clientX-t.clientX,s=e.clientY-t.clientY;if(!o&&Math.sqrt(a*a+s*s)>5&&(o=!0,this.isDragging=!0),!o)return;let c=window.innerWidth,l=window.innerHeight,u=Math.max(0,Math.min(e.clientX-r,c-n.width)),d=Math.max(0,Math.min(e.clientY-i,l-n.height));this.position={x:this.currentCorner.includes(`right`)?c-u-n.width:u,y:this.currentCorner.includes(`bottom`)?l-d-n.height:d},this.applyContainerPosition()}),(0,a.takeUntil)(c),(0,a.finalize)(()=>{o?this.reorientToNearestCorner():this.toggle(),this.isDragging=!1}))}))).pipe((0,a.takeUntil)(this.disconnecting)).subscribe(),this.#e=!0,this.open&&this.openOverlay())}willUpdate(e){this.#e&&e.has(`open`)&&(this.open&&!this.#t?this.openOverlay():!this.open&&this.#t&&this.#t.unsubscribe())}disconnectedCallback(){super.disconnectedCallback(),this.currentAnimation?.cancel(),this.#t?.unsubscribe()}toggle(){this.open=!this.open}render(){let e=(0,o.classMap)({"inline-flex":!0,"transition-opacity":!0,"duration-200":!0,"opacity-85":this.isDragging,"scale-95":this.isDragging}),t=(0,s.styleMap)({position:`fixed`,"pointer-events":`auto`}),n=(0,o.classMap)({flex:!0,"items-center":!0,"touch-none":!0,"select-none":!0,hidden:!this.hasHandle,"cursor-grabbing":this.isDragging,"cursor-grab":!this.isDragging});return l.html`
|
|
2
2
|
<schmancy-surface
|
|
3
3
|
${(0,u.ref)(this.containerRef)}
|
|
4
|
-
type="
|
|
4
|
+
type="container"
|
|
5
5
|
class="${e} overflow-hidden rounded-2xl shadow-md"
|
|
6
6
|
style=${t}
|
|
7
7
|
aria-expanded=${this.open}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boat-D3bEjxf8.cjs","names":["#sub","#wrapper","#captured","#ready"],"sources":["../src/boat/boat.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { html, type PropertyValues } from 'lit'\nimport { customElement, property, queryAssignedElements, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport { exhaustMap, filter, finalize, fromEvent, merge, type Subscription, takeUntil, tap } from 'rxjs'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport { show } from '../overlay/overlay.service'\nimport { theme } from '../theme/theme.service.js'\nimport { SPRING_SMOOTH } from '../utils/animation.js'\n\nconst DRAG_THRESHOLD = 5\nconst POSITION_STORAGE_KEY_PREFIX = 'schmancy-boat-'\n\ntype Corner = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\ninterface Position {\n\tx: number\n\ty: number\n}\n\n/**\n * Corner-anchored launcher that delegates its expanded panel to the `show()`\n * overlay service.\n *\n * Three slots, three non-overlapping intents — no element-type sniffing,\n * ever:\n *\n * - `trigger` — pure consumer content. A native click anywhere on it\n * opens the panel; interactive children (buttons, FABs, inputs) work\n * with zero special-casing because the boat never calls\n * `preventDefault` / `stopPropagation` / `setPointerCapture` here.\n * - `drag-handle` — opt-in. Pointer-drag is wired ONLY to this slot's\n * boat-owned wrapper. Slot it to make the boat draggable; omit it and\n * the boat is static at its corner. (A no-move tap on the handle also\n * opens, so the grip doubles as a launcher.)\n * - _(default)_ — the panel body; parked hidden while collapsed,\n * relocated into the `show()` overlay on open.\n *\n * The boat owns drag, corner-snapping, position persistence and the glass\n * surface — never the collapsed shape.\n */\n@customElement('schmancy-boat')\nexport default class SchmancyBoat extends SchmancyElement {\n\n\n\t/** Identity for localStorage drag-position persistence. */\n\t@property({ type: String }) id: string = 'default'\n\t/** Corner the launcher is anchored to. */\n\t@property({ type: String }) corner: Corner = 'bottom-right'\n\t/** Open state. Bind `?open=${…}` to drive the overlay; reflected to the attribute. */\n\t@property({ type: Boolean, reflect: true }) open: boolean = false\n\n\t@state() private isDragging = false\n\t@state() private currentCorner: Corner = 'bottom-right'\n\t@state() private hasHandle = false\n\n\t/** Default-slot nodes — the overlay body. */\n\t@queryAssignedElements() private slotted!: Element[]\n\t/** Slotted drag-handle nodes — presence toggles draggability. */\n\t@queryAssignedElements({ slot: 'drag-handle' }) private handleNodes!: Element[]\n\n\tprivate position: Position = { x: 16, y: 16 }\n\tprivate containerRef = createRef<HTMLElement>()\n\tprivate triggerRef = createRef<HTMLElement>()\n\tprivate handleRef = createRef<HTMLElement>()\n\tprivate currentAnimation?: Animation\n\n\t#ready = false\n\t#sub?: Subscription\n\t#captured: Element[] = []\n\t#wrapper?: HTMLElement\n\n\t// ============================================\n\t// POSITION MANAGEMENT\n\t// ============================================\n\n\tprivate applyContainerPosition() {\n\t\tconst container = this.containerRef.value\n\t\tif (!container) return\n\t\tcontainer.style.removeProperty('left')\n\t\tcontainer.style.removeProperty('right')\n\t\tcontainer.style.removeProperty('top')\n\t\tcontainer.style.removeProperty('bottom')\n\t\tconst { x, y } = this.position\n\t\tif (this.currentCorner.includes('right')) {\n\t\t\tcontainer.style.right = `${x}px`\n\t\t} else {\n\t\t\tcontainer.style.left = `${x}px`\n\t\t}\n\t\tif (this.currentCorner.includes('bottom')) {\n\t\t\tcontainer.style.bottom = `${y + theme.bottomOffset}px`\n\t\t} else {\n\t\t\tcontainer.style.top = `${y}px`\n\t\t}\n\t}\n\n\tprivate loadPosition() {\n\t\ttry {\n\t\t\tconst saved = localStorage.getItem(POSITION_STORAGE_KEY_PREFIX + this.id)\n\t\t\tif (saved) {\n\t\t\t\tconst parsed = JSON.parse(saved) as { x: number; y: number; anchor: Corner }\n\t\t\t\tthis.position = { x: parsed.x, y: parsed.y }\n\t\t\t\tthis.currentCorner = parsed.anchor\n\t\t\t}\n\t\t} catch {\n\t\t\t// ignore localStorage errors\n\t\t}\n\t}\n\n\tprivate savePosition() {\n\t\ttry {\n\t\t\tlocalStorage.setItem(\n\t\t\t\tPOSITION_STORAGE_KEY_PREFIX + this.id,\n\t\t\t\tJSON.stringify({ ...this.position, anchor: this.currentCorner }),\n\t\t\t)\n\t\t} catch {\n\t\t\t// ignore localStorage errors\n\t\t}\n\t}\n\n\tprivate validateBounds() {\n\t\tconst container = this.containerRef.value\n\t\tif (!container) return\n\t\tconst rect = container.getBoundingClientRect()\n\t\tif (rect.width === 0) return\n\t\tconst vw = window.innerWidth\n\t\tconst vh = window.innerHeight\n\t\tconst isRight = this.currentCorner.includes('right')\n\t\tconst isBottom = this.currentCorner.includes('bottom')\n\t\tconst actualLeft = isRight ? vw - this.position.x - rect.width : this.position.x\n\t\tconst actualTop = isBottom ? vh - this.position.y - rect.height : this.position.y\n\t\tconst newLeft = Math.max(0, Math.min(actualLeft, vw - rect.width))\n\t\tconst newTop = Math.max(0, Math.min(actualTop, vh - rect.height))\n\t\tthis.position = {\n\t\t\tx: isRight ? vw - newLeft - rect.width : newLeft,\n\t\t\ty: isBottom ? vh - newTop - rect.height : newTop,\n\t\t}\n\t\tthis.applyContainerPosition()\n\t}\n\n\t// ============================================\n\t// CORNER SNAPPING (FLIP)\n\t// ============================================\n\n\tprivate reorientToNearestCorner(): void {\n\t\tconst container = this.containerRef.value\n\t\tif (!container) return\n\n\t\tconst rect = container.getBoundingClientRect()\n\t\tconst fabCenterX = rect.left + rect.width / 2\n\t\tconst fabCenterY = rect.top + rect.height / 2\n\t\tconst side = fabCenterX > window.innerWidth / 2 ? 'right' : 'left'\n\t\tconst vert = fabCenterY > window.innerHeight / 2 ? 'bottom' : 'top'\n\t\tthis.currentCorner = `${vert}-${side}` as Corner\n\t\tthis.position = { x: 16, y: 16 }\n\t\tthis.applyContainerPosition()\n\n\t\tif (reducedMotion$.value) {\n\t\t\tthis.savePosition()\n\t\t\treturn\n\t\t}\n\n\t\tconst newRect = container.getBoundingClientRect()\n\t\tconst dx = rect.left - newRect.left\n\t\tconst dy = rect.top - newRect.top\n\t\tcontainer.style.transform = `translate(${dx}px, ${dy}px)`\n\n\t\tthis.currentAnimation?.cancel()\n\t\tconst anim = container.animate(\n\t\t\t[{ transform: container.style.transform }, { transform: 'translate(0,0)' }],\n\t\t\t{\n\t\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t)\n\t\tthis.currentAnimation = anim\n\t\tanim.finished.then(() => {\n\t\t\tif (container.isConnected) container.style.transform = ''\n\t\t\treturn\n\t\t})\n\n\t\tthis.savePosition()\n\t}\n\n\t// ============================================\n\t// OVERLAY DELEGATION\n\t// ============================================\n\n\tprivate openOverlay() {\n\t\tif (this.#sub) return\n\t\tconst anchor = this.containerRef.value\n\t\tthis.#wrapper = document.createElement('div')\n\t\tthis.#wrapper.className = 'flex flex-col'\n\t\tthis.#captured = [...this.slotted]\n\t\tthis.#captured.forEach(node => this.#wrapper!.appendChild(node))\n\n\t\tthis.#sub = show(this.#wrapper, {\n\t\t\tanchor: anchor ?? undefined,\n\t\t\tdismissable: true,\n\t\t\thistoryStrategy: 'silent',\n\t\t})\n\t\t\t.pipe(\n\t\t\t\tfinalize(() => this.restoreSlotted()),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\n\t\tthis.dispatchScopedEvent('toggle', 'open')\n\t}\n\n\tprivate restoreSlotted() {\n\t\tthis.#captured.forEach(node => this.appendChild(node))\n\t\tthis.#captured = []\n\t\tthis.#wrapper = undefined\n\t\tthis.#sub = undefined\n\t\tif (this.open) this.open = false\n\t\tthis.dispatchScopedEvent('toggle', 'closed')\n\t}\n\n\t// ============================================\n\t// LIFECYCLE\n\t// ============================================\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// One concern: keep the container in place when the environment\n\t\t// shifts. Viewport resize re-validates bounds; a theme bottom-offset\n\t\t// change (e.g. a snackbar pushing the safe area) re-applies position.\n\t\tmerge(\n\t\t\tfromEvent(window, 'resize').pipe(tap(() => this.validateBounds())),\n\t\t\ttheme.bottomOffset$.pipe(tap(() => this.applyContainerPosition())),\n\t\t)\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe()\n\t}\n\n\tfirstUpdated() {\n\t\tthis.currentCorner = this.corner\n\t\tthis.hasHandle = this.handleNodes.length > 0\n\t\tthis.loadPosition()\n\t\tconst container = this.containerRef.value\n\t\tconst trigger = this.triggerRef.value\n\t\tconst handle = this.handleRef.value\n\t\tif (!container || !trigger || !handle) return\n\t\tthis.applyContainerPosition()\n\n\t\t// Three intents, three sources, one pipeline, one subscribe.\n\t\t//\n\t\t// open$ — a plain click/Enter/Space on the trigger region. No\n\t\t// preventDefault/stopPropagation: a slotted button's own\n\t\t// click still fires; it merely also bubbles to \"open\".\n\t\t// drag$ — pointerdown on the boat-owned drag-handle wrapper. A\n\t\t// dedicated region, so every pointerdown there is a drag\n\t\t// intent — no element-type sniffing. A session ends on\n\t\t// pointerup/cancel; settle = move past threshold ? snap to\n\t\t// the nearest corner : treat as a tap and open.\n\t\tmerge(\n\t\t\tfromEvent<MouseEvent>(trigger, 'click').pipe(tap(() => this.toggle())),\n\t\t\tfromEvent<KeyboardEvent>(trigger, 'keydown').pipe(\n\t\t\t\tfilter(e => e.key === 'Enter' || e.key === ' '),\n\t\t\t\ttap(e => {\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tthis.toggle()\n\t\t\t\t}),\n\t\t\t),\n\t\t\tfromEvent<PointerEvent>(handle, 'pointerdown').pipe(\n\t\t\t\tfilter(e => e.button === 0),\n\t\t\t\ttap(e => {\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\t// Capture can throw InvalidStateError if the pointer is\n\t\t\t\t\t// already released (fast tap) — drag still works without it.\n\t\t\t\t\ttry {\n\t\t\t\t\t\thandle.setPointerCapture(e.pointerId)\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// no active pointer to capture; ignore\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\texhaustMap(down => {\n\t\t\t\t\tconst rect = container.getBoundingClientRect()\n\t\t\t\t\tconst offsetX = down.clientX - rect.left\n\t\t\t\t\tconst offsetY = down.clientY - rect.top\n\t\t\t\t\tlet moved = false\n\t\t\t\t\tconst sameId = (e: PointerEvent) => e.pointerId === down.pointerId\n\t\t\t\t\tconst end$ = merge(\n\t\t\t\t\t\tfromEvent<PointerEvent>(window, 'pointerup'),\n\t\t\t\t\t\tfromEvent<PointerEvent>(window, 'pointercancel'),\n\t\t\t\t\t).pipe(filter(sameId))\n\n\t\t\t\t\treturn fromEvent<PointerEvent>(window, 'pointermove').pipe(\n\t\t\t\t\t\tfilter(sameId),\n\t\t\t\t\t\ttap(e => {\n\t\t\t\t\t\t\tconst dx = e.clientX - down.clientX\n\t\t\t\t\t\t\tconst dy = e.clientY - down.clientY\n\t\t\t\t\t\t\tif (!moved && Math.sqrt(dx * dx + dy * dy) > DRAG_THRESHOLD) {\n\t\t\t\t\t\t\t\tmoved = true\n\t\t\t\t\t\t\t\tthis.isDragging = true\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!moved) return\n\t\t\t\t\t\t\tconst vw = window.innerWidth\n\t\t\t\t\t\t\tconst vh = window.innerHeight\n\t\t\t\t\t\t\tconst left = Math.max(0, Math.min(e.clientX - offsetX, vw - rect.width))\n\t\t\t\t\t\t\tconst top = Math.max(0, Math.min(e.clientY - offsetY, vh - rect.height))\n\t\t\t\t\t\t\tthis.position = {\n\t\t\t\t\t\t\t\tx: this.currentCorner.includes('right') ? vw - left - rect.width : left,\n\t\t\t\t\t\t\t\ty: this.currentCorner.includes('bottom') ? vh - top - rect.height : top,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.applyContainerPosition()\n\t\t\t\t\t\t}),\n\t\t\t\t\t\ttakeUntil(end$),\n\t\t\t\t\t\tfinalize(() => {\n\t\t\t\t\t\t\tif (moved) this.reorientToNearestCorner()\n\t\t\t\t\t\t\telse this.toggle()\n\t\t\t\t\t\t\tthis.isDragging = false\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe()\n\n\t\tthis.#ready = true\n\t\tif (this.open) this.openOverlay()\n\t}\n\n\tprotected willUpdate(changed: PropertyValues<this>) {\n\t\tif (!this.#ready || !changed.has('open')) return\n\t\tif (this.open && !this.#sub) this.openOverlay()\n\t\telse if (!this.open && this.#sub) this.#sub.unsubscribe()\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tthis.currentAnimation?.cancel()\n\t\tthis.#sub?.unsubscribe()\n\t}\n\n\t// ============================================\n\t// PUBLIC API\n\t// ============================================\n\n\t/** Flip open ↔ closed. */\n\ttoggle() {\n\t\tthis.open = !this.open\n\t}\n\n\t// ============================================\n\t// RENDER\n\t// ============================================\n\n\tprivate onHandleSlotChange = () => {\n\t\tthis.hasHandle = this.handleNodes.length > 0\n\t}\n\n\t// When Lit re-renders the parent and re-asserts default-slot children back\n\t// into this element, slotchange fires. If the overlay is live, re-relocate\n\t// any reassigned nodes into the overlay wrapper to stop the DOM ping-pong.\n\tprivate onDefaultSlotChange = () => {\n\t\tif (!this.#sub || !this.#wrapper) return\n\t\tthis.slotted.forEach(node => {\n\t\t\tif (node.parentElement !== this.#wrapper) {\n\t\t\t\tthis.#captured.push(node)\n\t\t\t\tthis.#wrapper!.appendChild(node)\n\t\t\t}\n\t\t})\n\t}\n\n\tprotected render(): unknown {\n\t\tconst containerClasses = classMap({\n\t\t\t'inline-flex': true,\n\t\t\t'transition-opacity': true,\n\t\t\t'duration-200': true,\n\t\t\t'opacity-85': this.isDragging,\n\t\t\t'scale-95': this.isDragging,\n\t\t})\n\n\t\tconst containerStyles = styleMap({\n\t\t\tposition: 'fixed',\n\t\t\t'pointer-events': 'auto',\n\t\t})\n\n\t\t// Boat-owned drag region — wraps ONLY the drag-handle slot, so every\n\t\t// pointerdown inside it is unambiguously a drag intent. Hidden (and\n\t\t// out of layout) when the consumer slots no handle: the boat is then\n\t\t// simply not draggable.\n\t\tconst handleClasses = classMap({\n\t\t\tflex: true,\n\t\t\t'items-center': true,\n\t\t\t'touch-none': true,\n\t\t\t'select-none': true,\n\t\t\thidden: !this.hasHandle,\n\t\t\t'cursor-grabbing': this.isDragging,\n\t\t\t'cursor-grab': !this.isDragging,\n\t\t})\n\n\t\treturn html`\n\t\t\t<schmancy-surface\n\t\t\t\t${ref(this.containerRef)}\n\t\t\t\ttype=\"glass\"\n\t\t\t\tclass=\"${containerClasses} overflow-hidden rounded-2xl shadow-md\"\n\t\t\t\tstyle=${containerStyles}\n\t\t\t\taria-expanded=${this.open}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\t${ref(this.handleRef)}\n\t\t\t\t\tclass=${handleClasses}\n\t\t\t\t\taria-label=\"Drag to move\"\n\t\t\t\t>\n\t\t\t\t\t<slot name=\"drag-handle\" @slotchange=${this.onHandleSlotChange}></slot>\n\t\t\t\t</div>\n\n\t\t\t\t<div\n\t\t\t\t\t${ref(this.triggerRef)}\n\t\t\t\t\tclass=\"flex items-center cursor-pointer\"\n\t\t\t\t\trole=\"button\"\n\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\taria-label=\"Open panel\"\n\t\t\t\t\ttitle=\"Click to open\"\n\t\t\t\t>\n\t\t\t\t\t<slot name=\"trigger\"></slot>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Default-slot content parks here (hidden) while collapsed;\n\t\t\t\t relocated into the show() overlay on open. -->\n\t\t\t\t<div hidden><slot @slotchange=${this.onDefaultSlotChange}></slot></div>\n\t\t\t</schmancy-surface>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-boat': SchmancyBoat\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"boat-sg0cWO8a.cjs","names":["#sub","#wrapper","#captured","#ready"],"sources":["../src/boat/boat.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { html, type PropertyValues } from 'lit'\nimport { customElement, property, queryAssignedElements, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport { exhaustMap, filter, finalize, fromEvent, merge, type Subscription, takeUntil, tap } from 'rxjs'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport { show } from '../overlay/overlay.service'\nimport { theme } from '../theme/theme.service.js'\nimport { SPRING_SMOOTH } from '../utils/animation.js'\n\nconst DRAG_THRESHOLD = 5\nconst POSITION_STORAGE_KEY_PREFIX = 'schmancy-boat-'\n\ntype Corner = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\ninterface Position {\n\tx: number\n\ty: number\n}\n\n/**\n * Corner-anchored launcher that delegates its expanded panel to the `show()`\n * overlay service.\n *\n * Three slots, three non-overlapping intents — no element-type sniffing,\n * ever:\n *\n * - `trigger` — pure consumer content. A native click anywhere on it\n * opens the panel; interactive children (buttons, FABs, inputs) work\n * with zero special-casing because the boat never calls\n * `preventDefault` / `stopPropagation` / `setPointerCapture` here.\n * - `drag-handle` — opt-in. Pointer-drag is wired ONLY to this slot's\n * boat-owned wrapper. Slot it to make the boat draggable; omit it and\n * the boat is static at its corner. (A no-move tap on the handle also\n * opens, so the grip doubles as a launcher.)\n * - _(default)_ — the panel body; parked hidden while collapsed,\n * relocated into the `show()` overlay on open.\n *\n * The boat owns drag, corner-snapping, position persistence and the glass\n * surface — never the collapsed shape.\n */\n@customElement('schmancy-boat')\nexport default class SchmancyBoat extends SchmancyElement {\n\n\n\t/** Identity for localStorage drag-position persistence. */\n\t@property({ type: String }) id: string = 'default'\n\t/** Corner the launcher is anchored to. */\n\t@property({ type: String }) corner: Corner = 'bottom-right'\n\t/** Open state. Bind `?open=${…}` to drive the overlay; reflected to the attribute. */\n\t@property({ type: Boolean, reflect: true }) open: boolean = false\n\n\t@state() private isDragging = false\n\t@state() private currentCorner: Corner = 'bottom-right'\n\t@state() private hasHandle = false\n\n\t/** Default-slot nodes — the overlay body. */\n\t@queryAssignedElements() private slotted!: Element[]\n\t/** Slotted drag-handle nodes — presence toggles draggability. */\n\t@queryAssignedElements({ slot: 'drag-handle' }) private handleNodes!: Element[]\n\n\tprivate position: Position = { x: 16, y: 16 }\n\tprivate containerRef = createRef<HTMLElement>()\n\tprivate triggerRef = createRef<HTMLElement>()\n\tprivate handleRef = createRef<HTMLElement>()\n\tprivate currentAnimation?: Animation\n\n\t#ready = false\n\t#sub?: Subscription\n\t#captured: Element[] = []\n\t#wrapper?: HTMLElement\n\n\t// ============================================\n\t// POSITION MANAGEMENT\n\t// ============================================\n\n\tprivate applyContainerPosition() {\n\t\tconst container = this.containerRef.value\n\t\tif (!container) return\n\t\tcontainer.style.removeProperty('left')\n\t\tcontainer.style.removeProperty('right')\n\t\tcontainer.style.removeProperty('top')\n\t\tcontainer.style.removeProperty('bottom')\n\t\tconst { x, y } = this.position\n\t\tif (this.currentCorner.includes('right')) {\n\t\t\tcontainer.style.right = `${x}px`\n\t\t} else {\n\t\t\tcontainer.style.left = `${x}px`\n\t\t}\n\t\tif (this.currentCorner.includes('bottom')) {\n\t\t\tcontainer.style.bottom = `${y + theme.bottomOffset}px`\n\t\t} else {\n\t\t\tcontainer.style.top = `${y}px`\n\t\t}\n\t}\n\n\tprivate loadPosition() {\n\t\ttry {\n\t\t\tconst saved = localStorage.getItem(POSITION_STORAGE_KEY_PREFIX + this.id)\n\t\t\tif (saved) {\n\t\t\t\tconst parsed = JSON.parse(saved) as { x: number; y: number; anchor: Corner }\n\t\t\t\tthis.position = { x: parsed.x, y: parsed.y }\n\t\t\t\tthis.currentCorner = parsed.anchor\n\t\t\t}\n\t\t} catch {\n\t\t\t// ignore localStorage errors\n\t\t}\n\t}\n\n\tprivate savePosition() {\n\t\ttry {\n\t\t\tlocalStorage.setItem(\n\t\t\t\tPOSITION_STORAGE_KEY_PREFIX + this.id,\n\t\t\t\tJSON.stringify({ ...this.position, anchor: this.currentCorner }),\n\t\t\t)\n\t\t} catch {\n\t\t\t// ignore localStorage errors\n\t\t}\n\t}\n\n\tprivate validateBounds() {\n\t\tconst container = this.containerRef.value\n\t\tif (!container) return\n\t\tconst rect = container.getBoundingClientRect()\n\t\tif (rect.width === 0) return\n\t\tconst vw = window.innerWidth\n\t\tconst vh = window.innerHeight\n\t\tconst isRight = this.currentCorner.includes('right')\n\t\tconst isBottom = this.currentCorner.includes('bottom')\n\t\tconst actualLeft = isRight ? vw - this.position.x - rect.width : this.position.x\n\t\tconst actualTop = isBottom ? vh - this.position.y - rect.height : this.position.y\n\t\tconst newLeft = Math.max(0, Math.min(actualLeft, vw - rect.width))\n\t\tconst newTop = Math.max(0, Math.min(actualTop, vh - rect.height))\n\t\tthis.position = {\n\t\t\tx: isRight ? vw - newLeft - rect.width : newLeft,\n\t\t\ty: isBottom ? vh - newTop - rect.height : newTop,\n\t\t}\n\t\tthis.applyContainerPosition()\n\t}\n\n\t// ============================================\n\t// CORNER SNAPPING (FLIP)\n\t// ============================================\n\n\tprivate reorientToNearestCorner(): void {\n\t\tconst container = this.containerRef.value\n\t\tif (!container) return\n\n\t\tconst rect = container.getBoundingClientRect()\n\t\tconst fabCenterX = rect.left + rect.width / 2\n\t\tconst fabCenterY = rect.top + rect.height / 2\n\t\tconst side = fabCenterX > window.innerWidth / 2 ? 'right' : 'left'\n\t\tconst vert = fabCenterY > window.innerHeight / 2 ? 'bottom' : 'top'\n\t\tthis.currentCorner = `${vert}-${side}` as Corner\n\t\tthis.position = { x: 16, y: 16 }\n\t\tthis.applyContainerPosition()\n\n\t\tif (reducedMotion$.value) {\n\t\t\tthis.savePosition()\n\t\t\treturn\n\t\t}\n\n\t\tconst newRect = container.getBoundingClientRect()\n\t\tconst dx = rect.left - newRect.left\n\t\tconst dy = rect.top - newRect.top\n\t\tcontainer.style.transform = `translate(${dx}px, ${dy}px)`\n\n\t\tthis.currentAnimation?.cancel()\n\t\tconst anim = container.animate(\n\t\t\t[{ transform: container.style.transform }, { transform: 'translate(0,0)' }],\n\t\t\t{\n\t\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t)\n\t\tthis.currentAnimation = anim\n\t\tanim.finished.then(() => {\n\t\t\tif (container.isConnected) container.style.transform = ''\n\t\t\treturn\n\t\t})\n\n\t\tthis.savePosition()\n\t}\n\n\t// ============================================\n\t// OVERLAY DELEGATION\n\t// ============================================\n\n\tprivate openOverlay() {\n\t\tif (this.#sub) return\n\t\tconst anchor = this.containerRef.value\n\t\tthis.#wrapper = document.createElement('div')\n\t\tthis.#wrapper.className = 'flex flex-col'\n\t\tthis.#captured = [...this.slotted]\n\t\tthis.#captured.forEach(node => this.#wrapper!.appendChild(node))\n\n\t\tthis.#sub = show(this.#wrapper, {\n\t\t\tanchor: anchor ?? undefined,\n\t\t\tdismissable: true,\n\t\t\thistoryStrategy: 'silent',\n\t\t})\n\t\t\t.pipe(\n\t\t\t\tfinalize(() => this.restoreSlotted()),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\n\t\tthis.dispatchScopedEvent('toggle', 'open')\n\t}\n\n\tprivate restoreSlotted() {\n\t\tthis.#captured.forEach(node => this.appendChild(node))\n\t\tthis.#captured = []\n\t\tthis.#wrapper = undefined\n\t\tthis.#sub = undefined\n\t\tif (this.open) this.open = false\n\t\tthis.dispatchScopedEvent('toggle', 'closed')\n\t}\n\n\t// ============================================\n\t// LIFECYCLE\n\t// ============================================\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// One concern: keep the container in place when the environment\n\t\t// shifts. Viewport resize re-validates bounds; a theme bottom-offset\n\t\t// change (e.g. a snackbar pushing the safe area) re-applies position.\n\t\tmerge(\n\t\t\tfromEvent(window, 'resize').pipe(tap(() => this.validateBounds())),\n\t\t\ttheme.bottomOffset$.pipe(tap(() => this.applyContainerPosition())),\n\t\t)\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe()\n\t}\n\n\tfirstUpdated() {\n\t\tthis.currentCorner = this.corner\n\t\tthis.hasHandle = this.handleNodes.length > 0\n\t\tthis.loadPosition()\n\t\tconst container = this.containerRef.value\n\t\tconst trigger = this.triggerRef.value\n\t\tconst handle = this.handleRef.value\n\t\tif (!container || !trigger || !handle) return\n\t\tthis.applyContainerPosition()\n\n\t\t// Three intents, three sources, one pipeline, one subscribe.\n\t\t//\n\t\t// open$ — a plain click/Enter/Space on the trigger region. No\n\t\t// preventDefault/stopPropagation: a slotted button's own\n\t\t// click still fires; it merely also bubbles to \"open\".\n\t\t// drag$ — pointerdown on the boat-owned drag-handle wrapper. A\n\t\t// dedicated region, so every pointerdown there is a drag\n\t\t// intent — no element-type sniffing. A session ends on\n\t\t// pointerup/cancel; settle = move past threshold ? snap to\n\t\t// the nearest corner : treat as a tap and open.\n\t\tmerge(\n\t\t\tfromEvent<MouseEvent>(trigger, 'click').pipe(tap(() => this.toggle())),\n\t\t\tfromEvent<KeyboardEvent>(trigger, 'keydown').pipe(\n\t\t\t\tfilter(e => e.key === 'Enter' || e.key === ' '),\n\t\t\t\ttap(e => {\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tthis.toggle()\n\t\t\t\t}),\n\t\t\t),\n\t\t\tfromEvent<PointerEvent>(handle, 'pointerdown').pipe(\n\t\t\t\tfilter(e => e.button === 0),\n\t\t\t\ttap(e => {\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\t// Capture can throw InvalidStateError if the pointer is\n\t\t\t\t\t// already released (fast tap) — drag still works without it.\n\t\t\t\t\ttry {\n\t\t\t\t\t\thandle.setPointerCapture(e.pointerId)\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// no active pointer to capture; ignore\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\texhaustMap(down => {\n\t\t\t\t\tconst rect = container.getBoundingClientRect()\n\t\t\t\t\tconst offsetX = down.clientX - rect.left\n\t\t\t\t\tconst offsetY = down.clientY - rect.top\n\t\t\t\t\tlet moved = false\n\t\t\t\t\tconst sameId = (e: PointerEvent) => e.pointerId === down.pointerId\n\t\t\t\t\tconst end$ = merge(\n\t\t\t\t\t\tfromEvent<PointerEvent>(window, 'pointerup'),\n\t\t\t\t\t\tfromEvent<PointerEvent>(window, 'pointercancel'),\n\t\t\t\t\t).pipe(filter(sameId))\n\n\t\t\t\t\treturn fromEvent<PointerEvent>(window, 'pointermove').pipe(\n\t\t\t\t\t\tfilter(sameId),\n\t\t\t\t\t\ttap(e => {\n\t\t\t\t\t\t\tconst dx = e.clientX - down.clientX\n\t\t\t\t\t\t\tconst dy = e.clientY - down.clientY\n\t\t\t\t\t\t\tif (!moved && Math.sqrt(dx * dx + dy * dy) > DRAG_THRESHOLD) {\n\t\t\t\t\t\t\t\tmoved = true\n\t\t\t\t\t\t\t\tthis.isDragging = true\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!moved) return\n\t\t\t\t\t\t\tconst vw = window.innerWidth\n\t\t\t\t\t\t\tconst vh = window.innerHeight\n\t\t\t\t\t\t\tconst left = Math.max(0, Math.min(e.clientX - offsetX, vw - rect.width))\n\t\t\t\t\t\t\tconst top = Math.max(0, Math.min(e.clientY - offsetY, vh - rect.height))\n\t\t\t\t\t\t\tthis.position = {\n\t\t\t\t\t\t\t\tx: this.currentCorner.includes('right') ? vw - left - rect.width : left,\n\t\t\t\t\t\t\t\ty: this.currentCorner.includes('bottom') ? vh - top - rect.height : top,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.applyContainerPosition()\n\t\t\t\t\t\t}),\n\t\t\t\t\t\ttakeUntil(end$),\n\t\t\t\t\t\tfinalize(() => {\n\t\t\t\t\t\t\tif (moved) this.reorientToNearestCorner()\n\t\t\t\t\t\t\telse this.toggle()\n\t\t\t\t\t\t\tthis.isDragging = false\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe()\n\n\t\tthis.#ready = true\n\t\tif (this.open) this.openOverlay()\n\t}\n\n\tprotected willUpdate(changed: PropertyValues<this>) {\n\t\tif (!this.#ready || !changed.has('open')) return\n\t\tif (this.open && !this.#sub) this.openOverlay()\n\t\telse if (!this.open && this.#sub) this.#sub.unsubscribe()\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tthis.currentAnimation?.cancel()\n\t\tthis.#sub?.unsubscribe()\n\t}\n\n\t// ============================================\n\t// PUBLIC API\n\t// ============================================\n\n\t/** Flip open ↔ closed. */\n\ttoggle() {\n\t\tthis.open = !this.open\n\t}\n\n\t// ============================================\n\t// RENDER\n\t// ============================================\n\n\tprivate onHandleSlotChange = () => {\n\t\tthis.hasHandle = this.handleNodes.length > 0\n\t}\n\n\t// When Lit re-renders the parent and re-asserts default-slot children back\n\t// into this element, slotchange fires. If the overlay is live, re-relocate\n\t// any reassigned nodes into the overlay wrapper to stop the DOM ping-pong.\n\tprivate onDefaultSlotChange = () => {\n\t\tif (!this.#sub || !this.#wrapper) return\n\t\tthis.slotted.forEach(node => {\n\t\t\tif (node.parentElement !== this.#wrapper) {\n\t\t\t\tthis.#captured.push(node)\n\t\t\t\tthis.#wrapper!.appendChild(node)\n\t\t\t}\n\t\t})\n\t}\n\n\tprotected render(): unknown {\n\t\tconst containerClasses = classMap({\n\t\t\t'inline-flex': true,\n\t\t\t'transition-opacity': true,\n\t\t\t'duration-200': true,\n\t\t\t'opacity-85': this.isDragging,\n\t\t\t'scale-95': this.isDragging,\n\t\t})\n\n\t\tconst containerStyles = styleMap({\n\t\t\tposition: 'fixed',\n\t\t\t'pointer-events': 'auto',\n\t\t})\n\n\t\t// Boat-owned drag region — wraps ONLY the drag-handle slot, so every\n\t\t// pointerdown inside it is unambiguously a drag intent. Hidden (and\n\t\t// out of layout) when the consumer slots no handle: the boat is then\n\t\t// simply not draggable.\n\t\tconst handleClasses = classMap({\n\t\t\tflex: true,\n\t\t\t'items-center': true,\n\t\t\t'touch-none': true,\n\t\t\t'select-none': true,\n\t\t\thidden: !this.hasHandle,\n\t\t\t'cursor-grabbing': this.isDragging,\n\t\t\t'cursor-grab': !this.isDragging,\n\t\t})\n\n\t\treturn html`\n\t\t\t<schmancy-surface\n\t\t\t\t${ref(this.containerRef)}\n\t\t\t\ttype=\"container\"\n\t\t\t\tclass=\"${containerClasses} overflow-hidden rounded-2xl shadow-md\"\n\t\t\t\tstyle=${containerStyles}\n\t\t\t\taria-expanded=${this.open}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\t${ref(this.handleRef)}\n\t\t\t\t\tclass=${handleClasses}\n\t\t\t\t\taria-label=\"Drag to move\"\n\t\t\t\t>\n\t\t\t\t\t<slot name=\"drag-handle\" @slotchange=${this.onHandleSlotChange}></slot>\n\t\t\t\t</div>\n\n\t\t\t\t<div\n\t\t\t\t\t${ref(this.triggerRef)}\n\t\t\t\t\tclass=\"flex items-center cursor-pointer\"\n\t\t\t\t\trole=\"button\"\n\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\taria-label=\"Open panel\"\n\t\t\t\t\ttitle=\"Click to open\"\n\t\t\t\t>\n\t\t\t\t\t<slot name=\"trigger\"></slot>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Default-slot content parks here (hidden) while collapsed;\n\t\t\t\t relocated into the show() overlay on open. -->\n\t\t\t\t<div hidden><slot @slotchange=${this.onDefaultSlotChange}></slot></div>\n\t\t\t</schmancy-surface>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-boat': SchmancyBoat\n\t}\n}\n"],"mappings":"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"}
|
package/dist/boat.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./boat-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./boat-sg0cWO8a.cjs`);exports.SchmancyBoat=e.t;
|
package/dist/boat.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as e } from "./boat-
|
|
1
|
+
import { t as e } from "./boat-DoZGgQ0P.js";
|
|
2
2
|
export { e as SchmancyBoat };
|
package/dist/breadcrumb.cjs
CHANGED
|
@@ -1,35 +1,36 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
`]}connectedCallback(){super.connectedCallback(),this.hasAttribute(`aria-label`)||this.setAttribute(`aria-label`,`Breadcrumb`)}render(){return n.html`
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-CeKrBW2j.cjs`);require(`./mixins-Cjn20BQH.cjs`);let t=require(`lit/decorators.js`),n=require(`lit`);var r=class extends e.t{constructor(...e){super(...e),this.separator=`/`}static{this.styles=[n.css`
|
|
2
|
+
:host {
|
|
3
|
+
display: block;
|
|
4
|
+
}
|
|
5
|
+
nav {
|
|
6
|
+
display: flex;
|
|
7
|
+
flex-wrap: wrap;
|
|
8
|
+
align-items: center;
|
|
9
|
+
gap: 0.25rem;
|
|
10
|
+
}
|
|
11
|
+
.sep {
|
|
12
|
+
color: var(--schmancy-sys-color-surface-onVariant, #79747e);
|
|
13
|
+
user-select: none;
|
|
14
|
+
padding: 0 0.25rem;
|
|
15
|
+
}
|
|
16
|
+
::slotted(schmancy-breadcrumb-item:last-of-type) {
|
|
17
|
+
font-weight: 500;
|
|
18
|
+
}
|
|
19
|
+
`]}connectedCallback(){super.connectedCallback(),this.hasAttribute(`aria-label`)||this.setAttribute(`aria-label`,`Breadcrumb`)}render(){return n.html`
|
|
20
20
|
<nav role="navigation">
|
|
21
21
|
<slot @slotchange=${()=>this.insertSeparators()}></slot>
|
|
22
22
|
</nav>
|
|
23
23
|
`}insertSeparators(){let e=this.shadowRoot?.querySelector(`slot`);if(!e)return;let t=e.assignedElements({flatten:!0});this.querySelectorAll(`[data-schmancy-sep]`).forEach(e=>e.remove()),t.forEach((e,n)=>{if(n===t.length-1)return;let r=document.createElement(`span`);r.setAttribute(`data-schmancy-sep`,``),r.setAttribute(`aria-hidden`,`true`),r.setAttribute(`part`,`separator`),r.className=`sep`,r.textContent=this.separator,e.insertAdjacentElement(`afterend`,r)})}};e.u([(0,t.property)({type:String})],r.prototype,`separator`,void 0),r=e.u([(0,t.customElement)(`schmancy-breadcrumb`)],r);var i=class extends e.t{constructor(...e){super(...e),this.href=``,this.current=!1}static{this.styles=[n.css`
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
24
|
+
:host {
|
|
25
|
+
display: inline-block;
|
|
26
|
+
width: fit-content;
|
|
27
|
+
}
|
|
28
|
+
a,
|
|
29
|
+
span {
|
|
30
|
+
color: inherit;
|
|
31
|
+
text-decoration: none;
|
|
32
|
+
}
|
|
33
|
+
a:hover {
|
|
34
|
+
text-decoration: underline;
|
|
35
|
+
}
|
|
36
|
+
`]}render(){return this.href&&!this.current?n.html`<a href=${this.href}><slot></slot></a>`:n.html`<span aria-current=${this.current?`page`:`false`}><slot></slot></span>`}};e.u([(0,t.property)({type:String})],i.prototype,`href`,void 0),e.u([(0,t.property)({type:Boolean,reflect:!0})],i.prototype,`current`,void 0),i=e.u([(0,t.customElement)(`schmancy-breadcrumb-item`)],i),Object.defineProperty(exports,`SchmancyBreadcrumb`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`SchmancyBreadcrumbItem`,{enumerable:!0,get:function(){return i}});
|
package/dist/breadcrumb.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"breadcrumb.cjs","names":[],"sources":["../src/breadcrumb/breadcrumb.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\n/**\n * Breadcrumb navigation container. Wraps a list of `schmancy-breadcrumb-item`\n * elements with the correct ARIA landmark and semantics.\n *\n * @element schmancy-breadcrumb\n * @slot - Default slot for `<schmancy-breadcrumb-item>` children.\n * @attr separator - Character or string rendered between items. Default `/`.\n * @csspart separator - The separator element.\n */\n@customElement('schmancy-breadcrumb')\nexport class SchmancyBreadcrumb extends SchmancyElement {\n\tstatic styles = [
|
|
1
|
+
{"version":3,"file":"breadcrumb.cjs","names":[],"sources":["../src/breadcrumb/breadcrumb.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\n/**\n * Breadcrumb navigation container. Wraps a list of `schmancy-breadcrumb-item`\n * elements with the correct ARIA landmark and semantics.\n *\n * @element schmancy-breadcrumb\n * @slot - Default slot for `<schmancy-breadcrumb-item>` children.\n * @attr separator - Character or string rendered between items. Default `/`.\n * @csspart separator - The separator element.\n */\n@customElement('schmancy-breadcrumb')\nexport class SchmancyBreadcrumb extends SchmancyElement {\n\tstatic styles = [\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t\tnav {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 0.25rem;\n\t\t\t}\n\t\t\t.sep {\n\t\t\t\tcolor: var(--schmancy-sys-color-surface-onVariant, #79747e);\n\t\t\t\tuser-select: none;\n\t\t\t\tpadding: 0 0.25rem;\n\t\t\t}\n\t\t\t::slotted(schmancy-breadcrumb-item:last-of-type) {\n\t\t\t\tfont-weight: 500;\n\t\t\t}\n\t\t`,\n\t]\n\t@property({ type: String }) separator = '/'\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback()\n\t\tif (!this.hasAttribute('aria-label')) this.setAttribute('aria-label', 'Breadcrumb')\n\t}\n\n\trender() {\n\t\t// Render separators between slotted items by manipulating after render.\n\t\t// The simpler approach uses the CSS adjacent-sibling pattern so the\n\t\t// separator is visually present without affecting the accessible name.\n\t\treturn html`\n\t\t\t<nav role=\"navigation\">\n\t\t\t\t<slot @slotchange=${() => this.insertSeparators()}></slot>\n\t\t\t</nav>\n\t\t`\n\t}\n\n\tprivate insertSeparators() {\n\t\tconst slot = this.shadowRoot?.querySelector('slot') as HTMLSlotElement | null\n\t\tif (!slot) return\n\t\tconst items = slot.assignedElements({ flatten: true })\n\t\t// Remove any previously-inserted separators.\n\t\tthis.querySelectorAll('[data-schmancy-sep]').forEach(el => el.remove())\n\t\titems.forEach((el, idx) => {\n\t\t\tif (idx === items.length - 1) return\n\t\t\tconst sep = document.createElement('span')\n\t\t\tsep.setAttribute('data-schmancy-sep', '')\n\t\t\tsep.setAttribute('aria-hidden', 'true')\n\t\t\tsep.setAttribute('part', 'separator')\n\t\t\tsep.className = 'sep'\n\t\t\tsep.textContent = this.separator\n\t\t\tel.insertAdjacentElement('afterend', sep)\n\t\t})\n\t}\n}\n\n/**\n * Individual breadcrumb item. Renders as a link when `href` is provided,\n * otherwise as a plain span (represents the current page).\n *\n * @element schmancy-breadcrumb-item\n * @slot - Label content.\n * @attr href - If set, renders as an anchor.\n * @attr current - Marks as `aria-current=\"page\"`.\n */\n@customElement('schmancy-breadcrumb-item')\nexport class SchmancyBreadcrumbItem extends SchmancyElement {\n\tstatic styles = [\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\twidth: fit-content;\n\t\t\t}\n\t\t\ta,\n\t\t\tspan {\n\t\t\t\tcolor: inherit;\n\t\t\t\ttext-decoration: none;\n\t\t\t}\n\t\t\ta:hover {\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t`,\n\t]\n\t@property({ type: String }) href = ''\n\t@property({ type: Boolean, reflect: true }) current = false\n\n\trender() {\n\t\tif (this.href && !this.current) {\n\t\t\treturn html`<a href=${this.href}><slot></slot></a>`\n\t\t}\n\t\treturn html`<span aria-current=${this.current ? 'page' : 'false'}><slot></slot></span>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-breadcrumb': SchmancyBreadcrumb\n\t\t'schmancy-breadcrumb-item': SchmancyBreadcrumbItem\n\t}\n}\n"],"mappings":"0OAcO,IAAA,EAAA,cAAiC,EAAA,CAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,CAAA,EAAA,KAAA,UAsBC,GAAA,CAAA,OAAA,KAAA,OArBxB,CACf,EAAA,GAAG;;;;;;;;;;;;;;;;;;KAsBJ,mBAAA,CACC,MAAM,kBAAA,EACD,KAAK,aAAa,YAAA,GAAe,KAAK,aAAa,aAAc,YAAA,CACvE,CAEA,QAAA,CAIC,MAAO,GAAA,IAAI;;4BAEiB,KAAK,iBAAA,EAAA;;GAGlC,CAEA,kBAAA,CACC,IAAM,EAAO,KAAK,YAAY,cAAc,MAAA,EAC5C,GAAA,CAAK,EAAM,OACX,IAAM,EAAQ,EAAK,iBAAiB,CAAE,QAAA,CAAS,CAAA,CAAA,EAE/C,KAAK,iBAAiB,qBAAA,EAAuB,QAAQ,GAAM,EAAG,OAAA,CAAA,EAC9D,EAAM,SAAS,EAAI,IAAA,CAClB,GAAI,IAAQ,EAAM,OAAS,EAAG,OAC9B,IAAM,EAAM,SAAS,cAAc,MAAA,EACnC,EAAI,aAAa,oBAAqB,EAAA,EACtC,EAAI,aAAa,cAAe,MAAA,EAChC,EAAI,aAAa,OAAQ,WAAA,EACzB,EAAI,UAAY,MAChB,EAAI,YAAc,KAAK,UACvB,EAAG,sBAAsB,WAAY,CAAA,CAAA,CAAA,CAEvC,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAlCU,CAAE,KAAM,MAAA,CAAA,CAAA,EAAQ,EAAA,UAAA,YAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAvBZ,qBAAA,CAAA,EAAqB,CAAA,EAsE7B,IAAA,EAAA,cAAqC,EAAA,CAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,CAAA,EAAA,KAAA,KAiBR,GAAA,KAAA,QAAA,CACmB,CAAA,CAAA,OAAA,KAAA,OAjBtC,CACf,EAAA,GAAG;;;;;;;;;;;;;KAkBJ,QAAA,CACC,OAAI,KAAK,MAAA,CAAS,KAAK,QACf,EAAA,IAAI,WAAW,KAAK,KAAA,oBAErB,EAAA,IAAI,sBAAsB,KAAK,QAAU,OAAS,QAAA,sBAC1D,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UARU,CAAE,KAAM,MAAA,CAAA,CAAA,EAAQ,EAAA,UAAA,OAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAChB,CAAE,KAAM,QAAS,QAAA,CAAS,CAAA,CAAA,CAAA,EAAM,EAAA,UAAA,UAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAnB5B,0BAAA,CAAA,EAA0B,CAAA,EAAA,OAAA,eAAA,QAAA,qBAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,CAAA,CAAA,CAAA,EAAA,OAAA,eAAA,QAAA,yBAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,CAAA,CAAA,CAAA"}
|
package/dist/breadcrumb.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as e, u as t } from "./SchmancyElement-
|
|
2
|
-
import "./mixins-
|
|
1
|
+
import { t as e, u as t } from "./SchmancyElement-Ob9yGkiG.js";
|
|
2
|
+
import "./mixins-q4KAL8Xr.js";
|
|
3
3
|
import { customElement as n, property as r } from "lit/decorators.js";
|
|
4
4
|
import { css as i, html as a } from "lit";
|
|
5
5
|
var o = class extends e {
|
|
@@ -8,24 +8,24 @@ var o = class extends e {
|
|
|
8
8
|
}
|
|
9
9
|
static {
|
|
10
10
|
this.styles = [i`
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
`];
|
|
11
|
+
:host {
|
|
12
|
+
display: block;
|
|
13
|
+
}
|
|
14
|
+
nav {
|
|
15
|
+
display: flex;
|
|
16
|
+
flex-wrap: wrap;
|
|
17
|
+
align-items: center;
|
|
18
|
+
gap: 0.25rem;
|
|
19
|
+
}
|
|
20
|
+
.sep {
|
|
21
|
+
color: var(--schmancy-sys-color-surface-onVariant, #79747e);
|
|
22
|
+
user-select: none;
|
|
23
|
+
padding: 0 0.25rem;
|
|
24
|
+
}
|
|
25
|
+
::slotted(schmancy-breadcrumb-item:last-of-type) {
|
|
26
|
+
font-weight: 500;
|
|
27
|
+
}
|
|
28
|
+
`];
|
|
29
29
|
}
|
|
30
30
|
connectedCallback() {
|
|
31
31
|
super.connectedCallback(), this.hasAttribute("aria-label") || this.setAttribute("aria-label", "Breadcrumb");
|
|
@@ -55,18 +55,19 @@ var s = class extends e {
|
|
|
55
55
|
}
|
|
56
56
|
static {
|
|
57
57
|
this.styles = [i`
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
58
|
+
:host {
|
|
59
|
+
display: inline-block;
|
|
60
|
+
width: fit-content;
|
|
61
|
+
}
|
|
62
|
+
a,
|
|
63
|
+
span {
|
|
64
|
+
color: inherit;
|
|
65
|
+
text-decoration: none;
|
|
66
|
+
}
|
|
67
|
+
a:hover {
|
|
68
|
+
text-decoration: underline;
|
|
69
|
+
}
|
|
70
|
+
`];
|
|
70
71
|
}
|
|
71
72
|
render() {
|
|
72
73
|
return this.href && !this.current ? a`<a href=${this.href}><slot></slot></a>` : a`<span aria-current=${this.current ? "page" : "false"}><slot></slot></span>`;
|
package/dist/breadcrumb.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"breadcrumb.js","names":[],"sources":["../src/breadcrumb/breadcrumb.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\n/**\n * Breadcrumb navigation container. Wraps a list of `schmancy-breadcrumb-item`\n * elements with the correct ARIA landmark and semantics.\n *\n * @element schmancy-breadcrumb\n * @slot - Default slot for `<schmancy-breadcrumb-item>` children.\n * @attr separator - Character or string rendered between items. Default `/`.\n * @csspart separator - The separator element.\n */\n@customElement('schmancy-breadcrumb')\nexport class SchmancyBreadcrumb extends SchmancyElement {\n\tstatic styles = [
|
|
1
|
+
{"version":3,"file":"breadcrumb.js","names":[],"sources":["../src/breadcrumb/breadcrumb.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\n/**\n * Breadcrumb navigation container. Wraps a list of `schmancy-breadcrumb-item`\n * elements with the correct ARIA landmark and semantics.\n *\n * @element schmancy-breadcrumb\n * @slot - Default slot for `<schmancy-breadcrumb-item>` children.\n * @attr separator - Character or string rendered between items. Default `/`.\n * @csspart separator - The separator element.\n */\n@customElement('schmancy-breadcrumb')\nexport class SchmancyBreadcrumb extends SchmancyElement {\n\tstatic styles = [\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t\tnav {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 0.25rem;\n\t\t\t}\n\t\t\t.sep {\n\t\t\t\tcolor: var(--schmancy-sys-color-surface-onVariant, #79747e);\n\t\t\t\tuser-select: none;\n\t\t\t\tpadding: 0 0.25rem;\n\t\t\t}\n\t\t\t::slotted(schmancy-breadcrumb-item:last-of-type) {\n\t\t\t\tfont-weight: 500;\n\t\t\t}\n\t\t`,\n\t]\n\t@property({ type: String }) separator = '/'\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback()\n\t\tif (!this.hasAttribute('aria-label')) this.setAttribute('aria-label', 'Breadcrumb')\n\t}\n\n\trender() {\n\t\t// Render separators between slotted items by manipulating after render.\n\t\t// The simpler approach uses the CSS adjacent-sibling pattern so the\n\t\t// separator is visually present without affecting the accessible name.\n\t\treturn html`\n\t\t\t<nav role=\"navigation\">\n\t\t\t\t<slot @slotchange=${() => this.insertSeparators()}></slot>\n\t\t\t</nav>\n\t\t`\n\t}\n\n\tprivate insertSeparators() {\n\t\tconst slot = this.shadowRoot?.querySelector('slot') as HTMLSlotElement | null\n\t\tif (!slot) return\n\t\tconst items = slot.assignedElements({ flatten: true })\n\t\t// Remove any previously-inserted separators.\n\t\tthis.querySelectorAll('[data-schmancy-sep]').forEach(el => el.remove())\n\t\titems.forEach((el, idx) => {\n\t\t\tif (idx === items.length - 1) return\n\t\t\tconst sep = document.createElement('span')\n\t\t\tsep.setAttribute('data-schmancy-sep', '')\n\t\t\tsep.setAttribute('aria-hidden', 'true')\n\t\t\tsep.setAttribute('part', 'separator')\n\t\t\tsep.className = 'sep'\n\t\t\tsep.textContent = this.separator\n\t\t\tel.insertAdjacentElement('afterend', sep)\n\t\t})\n\t}\n}\n\n/**\n * Individual breadcrumb item. Renders as a link when `href` is provided,\n * otherwise as a plain span (represents the current page).\n *\n * @element schmancy-breadcrumb-item\n * @slot - Label content.\n * @attr href - If set, renders as an anchor.\n * @attr current - Marks as `aria-current=\"page\"`.\n */\n@customElement('schmancy-breadcrumb-item')\nexport class SchmancyBreadcrumbItem extends SchmancyElement {\n\tstatic styles = [\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\twidth: fit-content;\n\t\t\t}\n\t\t\ta,\n\t\t\tspan {\n\t\t\t\tcolor: inherit;\n\t\t\t\ttext-decoration: none;\n\t\t\t}\n\t\t\ta:hover {\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t`,\n\t]\n\t@property({ type: String }) href = ''\n\t@property({ type: Boolean, reflect: true }) current = false\n\n\trender() {\n\t\tif (this.href && !this.current) {\n\t\t\treturn html`<a href=${this.href}><slot></slot></a>`\n\t\t}\n\t\treturn html`<span aria-current=${this.current ? 'page' : 'false'}><slot></slot></span>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-breadcrumb': SchmancyBreadcrumb\n\t\t'schmancy-breadcrumb-item': SchmancyBreadcrumbItem\n\t}\n}\n"],"mappings":";;;;AAcO,IAAA,IAAA,cAAiC,EAAA;CAAA,YAAA,GAAA,GAAA;EAAA,MAAA,GAAA,CAAA,GAAA,KAAA,YAsBC;CAAA;CAAA;EAAA,KAAA,SArBxB,CACf,CAAG;;;;;;;;;;;;;;;;;;;;CAsBJ,oBAAA;EACC,MAAM,kBAAA,GACD,KAAK,aAAa,YAAA,KAAe,KAAK,aAAa,cAAc,YAAA;CACvE;CAEA,SAAA;EAIC,OAAO,CAAI;;8BAEiB,KAAK,iBAAA,EAAA;;;CAGlC;CAEA,mBAAA;EACC,IAAM,IAAO,KAAK,YAAY,cAAc,MAAA;EAC5C,IAAA,CAAK,GAAM;EACX,IAAM,IAAQ,EAAK,iBAAiB,EAAE,SAAA,CAAS,EAAA,CAAA;EAE/C,KAAK,iBAAiB,qBAAA,EAAuB,SAAQ,MAAM,EAAG,OAAA,CAAA,GAC9D,EAAM,SAAS,GAAI,MAAA;GAClB,IAAI,MAAQ,EAAM,SAAS,GAAG;GAC9B,IAAM,IAAM,SAAS,cAAc,MAAA;GACnC,EAAI,aAAa,qBAAqB,EAAA,GACtC,EAAI,aAAa,eAAe,MAAA,GAChC,EAAI,aAAa,QAAQ,WAAA,GACzB,EAAI,YAAY,OAChB,EAAI,cAAc,KAAK,WACvB,EAAG,sBAAsB,YAAY,CAAA;EAAA,CAAA;CAEvC;AAAA;AAAA,EAAA,CAlCC,EAAS,EAAE,MAAM,OAAA,CAAA,CAAA,GAAQ,EAAA,WAAA,aAAA,KAAA,CAAA,GAAA,IAAA,EAAA,CAvB1B,EAAc,qBAAA,CAAA,GAAqB,CAAA;AAsE7B,IAAA,IAAA,cAAqC,EAAA;CAAA,YAAA,GAAA,GAAA;EAAA,MAAA,GAAA,CAAA,GAAA,KAAA,OAiBR,IAAA,KAAA,UAAA,CACmB;CAAA;CAAA;EAAA,KAAA,SAjBtC,CACf,CAAG;;;;;;;;;;;;;;;CAkBJ,SAAA;EACC,OAAI,KAAK,QAAA,CAAS,KAAK,UACf,CAAI,WAAW,KAAK,KAAA,sBAErB,CAAI,sBAAsB,KAAK,UAAU,SAAS,QAAA;CAC1D;AAAA;AAAA,EAAA,CARC,EAAS,EAAE,MAAM,OAAA,CAAA,CAAA,GAAQ,EAAA,WAAA,QAAA,KAAA,CAAA,GAAA,EAAA,CACzB,EAAS;CAAE,MAAM;CAAS,SAAA,CAAS;AAAA,CAAA,CAAA,GAAM,EAAA,WAAA,WAAA,KAAA,CAAA,GAAA,IAAA,EAAA,CAnB1C,EAAc,0BAAA,CAAA,GAA0B,CAAA;AAAA,SAAA,KAAA,oBAAA,KAAA"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-CeKrBW2j.cjs`);require(`./mixins-Cjn20BQH.cjs`);let t=require(`lit/decorators.js`),n=require(`lit`);var r=class extends e.t{static{this.styles=[n.css`
|
|
2
|
+
:host {
|
|
3
|
+
display: inline;
|
|
4
|
+
position: absolute;
|
|
5
|
+
inset: 0;
|
|
6
|
+
pointer-events: all;
|
|
7
|
+
z-index: 50;
|
|
8
|
+
}
|
|
9
|
+
`]}render(){return n.html`
|
|
10
|
+
<!-- Clean overlay with subtle backdrop -->
|
|
11
|
+
<div
|
|
12
|
+
class="absolute inset-0 flex items-center justify-center bg-surface-container/10 backdrop-blur-xs rounded-[inherit]"
|
|
13
|
+
>
|
|
14
|
+
<!-- Content container with clean surface -->
|
|
15
|
+
<div class="relative flex items-center justify-center p-4">
|
|
16
|
+
<!-- Content slot -->
|
|
17
|
+
<div class="relative z-10">
|
|
18
|
+
<slot>
|
|
19
|
+
<!-- Default spinner if no content provided -->
|
|
20
|
+
<schmancy-spinner></schmancy-spinner>
|
|
21
|
+
</slot>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
`}};r=e.u([(0,t.customElement)(`schmancy-busy`)],r);var i=class extends e.t{constructor(...e){super(...e),this.size=`md`,this.glass=!1}static{this.styles=[n.css`
|
|
26
|
+
:host {
|
|
27
|
+
display: inline-block;
|
|
28
|
+
color: inherit; /* Inherit from parent by default */
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* Explicit color options when needed */
|
|
32
|
+
:host([color='primary']) {
|
|
33
|
+
color: var(--schmancy-sys-color-primary-default);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
:host([color='on-primary']) {
|
|
37
|
+
color: var(--schmancy-sys-color-primary-on);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
:host([color='secondary']) {
|
|
41
|
+
color: var(--schmancy-sys-color-secondary-default);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
:host([color='on-secondary']) {
|
|
45
|
+
color: var(--schmancy-sys-color-secondary-on);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
:host([color='tertiary']) {
|
|
49
|
+
color: var(--schmancy-sys-color-tertiary-default);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
:host([color='on-tertiary']) {
|
|
53
|
+
color: var(--schmancy-sys-color-tertiary-on);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
:host([color='error']) {
|
|
57
|
+
color: var(--schmancy-sys-color-error-default);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
:host([color='on-error']) {
|
|
61
|
+
color: var(--schmancy-sys-color-error-on);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
:host([color='success']) {
|
|
65
|
+
color: var(--schmancy-sys-color-success-default);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
:host([color='on-success']) {
|
|
69
|
+
color: var(--schmancy-sys-color-success-on);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
:host([color='surface']) {
|
|
73
|
+
color: var(--schmancy-sys-color-surface-default);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
:host([color='on-surface']) {
|
|
77
|
+
color: var(--schmancy-sys-color-surface-on);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
:host([color='surface-variant']) {
|
|
81
|
+
color: var(--schmancy-sys-color-surface-variant-default);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
:host([color='on-surface-variant']) {
|
|
85
|
+
color: var(--schmancy-sys-color-surface-onVariant);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.spinner {
|
|
89
|
+
animation: spin 1s linear infinite;
|
|
90
|
+
animation-direction: reverse;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@keyframes spin {
|
|
94
|
+
from {
|
|
95
|
+
transform: rotate(0deg);
|
|
96
|
+
}
|
|
97
|
+
to {
|
|
98
|
+
transform: rotate(360deg);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
`]}render(){let e={xxs:12,xs:16,sm:20,md:24,lg:32},t;t=typeof this.size==`string`&&this.size in e?e[this.size]:typeof this.size!=`number`||isNaN(this.size)?24:4*this.size;let r={width:`${t}px`,height:`${t}px`};return this.glass?n.html`
|
|
102
|
+
<div class="spinner relative" style=${this.styleMap(r)}>
|
|
103
|
+
<!-- Glass container with Apple-style effect -->
|
|
104
|
+
<div
|
|
105
|
+
class="absolute inset-0 rounded-full backdrop-blur-xl backdrop-saturate-150
|
|
106
|
+
bg-surface-container/20
|
|
107
|
+
shadow-[inset_0_1px_1px_0_rgba(255,255,255,0.2)]
|
|
108
|
+
border border-outline-variant/30"
|
|
109
|
+
></div>
|
|
110
|
+
|
|
111
|
+
<!-- Spinner SVG -->
|
|
112
|
+
<svg
|
|
113
|
+
fill="none"
|
|
114
|
+
viewBox="0 0 16 16"
|
|
115
|
+
aria-hidden="true"
|
|
116
|
+
role="img"
|
|
117
|
+
style="width: 100%; height: 100%;"
|
|
118
|
+
class="relative z-10"
|
|
119
|
+
>
|
|
120
|
+
<path opacity=".7" d="M8 15A7 7 0 108 1a7 7 0 000 14v0z" stroke="currentColor" stroke-width="2"></path>
|
|
121
|
+
<path d="M15 8a7 7 0 01-7 7" stroke="currentColor" stroke-width="2"></path>
|
|
122
|
+
<path d="M8 12a4 4 0 100-8 4 4 0 000 8z" fill="currentColor" opacity="0.8"></path>
|
|
123
|
+
</svg>
|
|
124
|
+
</div>
|
|
125
|
+
`:n.html`
|
|
126
|
+
<div class="spinner" style=${this.styleMap(r)}>
|
|
127
|
+
<svg fill="none" viewBox="0 0 16 16" aria-hidden="true" role="img" style="width: 100%; height: 100%;">
|
|
128
|
+
<path opacity=".5" d="M8 15A7 7 0 108 1a7 7 0 000 14v0z" stroke="currentColor" stroke-width="2"></path>
|
|
129
|
+
<path d="M15 8a7 7 0 01-7 7" stroke="currentColor" stroke-width="2"></path>
|
|
130
|
+
<path d="M8 12a4 4 0 100-8 4 4 0 000 8z" fill="currentColor"></path>
|
|
131
|
+
</svg>
|
|
132
|
+
</div>
|
|
133
|
+
`}};e.u([(0,t.property)({type:String,reflect:!0})],i.prototype,`color`,void 0),e.u([(0,t.property)()],i.prototype,`size`,void 0),e.u([(0,t.property)({type:Boolean})],i.prototype,`glass`,void 0),i=e.u([(0,t.customElement)(`schmancy-spinner`)],i);
|