@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
|
@@ -2,34 +2,115 @@ import dayjs from 'dayjs'
|
|
|
2
2
|
import quarterOfYear from 'dayjs/plugin/quarterOfYear'
|
|
3
3
|
import { html, nothing, PropertyValues } from 'lit'
|
|
4
4
|
import { customElement, property, state } from 'lit/decorators.js'
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
concat,
|
|
7
|
+
exhaustMap,
|
|
8
|
+
finalize,
|
|
9
|
+
fromEvent,
|
|
10
|
+
map,
|
|
11
|
+
merge,
|
|
12
|
+
of,
|
|
13
|
+
Subject,
|
|
14
|
+
switchMap,
|
|
15
|
+
takeUntil,
|
|
16
|
+
tap,
|
|
17
|
+
timer,
|
|
18
|
+
} from 'rxjs'
|
|
6
19
|
import { SchmancyFormField } from '@mixins/index'
|
|
7
20
|
import { show } from '../../../overlay/overlay.service'
|
|
8
21
|
import { detectDateRangeType, formatDateRange } from './date-range-helpers'
|
|
9
|
-
import { DateRangePreset, generatePresetCategories, PresetCategory } from './date-range-presets'
|
|
10
|
-
import { validateInitialDateRange } from './date-utils'
|
|
11
22
|
import './date-range-dialog'
|
|
23
|
+
import type { DateRangeDialogPreset } from './date-range-dialog'
|
|
12
24
|
|
|
13
|
-
// Add quarter plugin to dayjs
|
|
14
25
|
dayjs.extend(quarterOfYear)
|
|
15
26
|
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
|
|
20
|
-
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Default built-in presets
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
|
|
31
|
+
function buildDefaultPresets(type: 'date' | 'datetime-local' = 'date'): DateRangeDialogPreset[] {
|
|
32
|
+
const fmt = type === 'datetime-local' ? 'YYYY-MM-DDTHH:mm' : 'YYYY-MM-DD'
|
|
33
|
+
return [
|
|
34
|
+
{
|
|
35
|
+
id: 'today',
|
|
36
|
+
label: 'Today',
|
|
37
|
+
start: dayjs().startOf('day').format(fmt),
|
|
38
|
+
end: dayjs().endOf('day').format(fmt),
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
id: 'yesterday',
|
|
42
|
+
label: 'Yesterday',
|
|
43
|
+
start: dayjs().subtract(1, 'day').startOf('day').format(fmt),
|
|
44
|
+
end: dayjs().subtract(1, 'day').endOf('day').format(fmt),
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: 'last7',
|
|
48
|
+
label: 'Last 7 days',
|
|
49
|
+
start: dayjs().subtract(6, 'day').startOf('day').format(fmt),
|
|
50
|
+
end: dayjs().endOf('day').format(fmt),
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: 'last30',
|
|
54
|
+
label: 'Last 30 days',
|
|
55
|
+
start: dayjs().subtract(29, 'day').startOf('day').format(fmt),
|
|
56
|
+
end: dayjs().endOf('day').format(fmt),
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: 'thisWeek',
|
|
60
|
+
label: 'This week',
|
|
61
|
+
start: dayjs().startOf('week').format(fmt),
|
|
62
|
+
end: dayjs().endOf('week').format(fmt),
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: 'thisMonth',
|
|
66
|
+
label: 'This month',
|
|
67
|
+
start: dayjs().startOf('month').format(fmt),
|
|
68
|
+
end: dayjs().endOf('month').format(fmt),
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: 'lastMonth',
|
|
72
|
+
label: 'Last month',
|
|
73
|
+
start: dayjs().subtract(1, 'month').startOf('month').format(fmt),
|
|
74
|
+
end: dayjs().subtract(1, 'month').endOf('month').format(fmt),
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: 'thisYear',
|
|
78
|
+
label: 'This year',
|
|
79
|
+
start: dayjs().startOf('year').format(fmt),
|
|
80
|
+
end: dayjs().endOf('year').format(fmt),
|
|
81
|
+
},
|
|
82
|
+
]
|
|
21
83
|
}
|
|
22
84
|
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
// Event types
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
|
|
89
|
+
export type SchmancyDateRangeInputEvent = CustomEvent<{
|
|
90
|
+
start: string | null
|
|
91
|
+
end: string | null
|
|
92
|
+
}>
|
|
93
|
+
|
|
23
94
|
export type SchmancyDateRangeChangeEvent = CustomEvent<{
|
|
24
|
-
|
|
25
|
-
|
|
95
|
+
start: string | null
|
|
96
|
+
end: string | null
|
|
97
|
+
preset: string | null
|
|
26
98
|
}>
|
|
27
99
|
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
// Component
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
|
|
28
104
|
/**
|
|
29
|
-
* A date range selector
|
|
105
|
+
* A date range selector composing `<schmancy-calendar mode="range">` with a
|
|
106
|
+
* sticky preset chip quick-rail and a secondary typed-entry path.
|
|
107
|
+
*
|
|
108
|
+
* Public API: flat ISO `start`/`end`, `preset` read-back, `presets` array.
|
|
109
|
+
* FormData: `${name}.start` / `${name}.end` (empty endpoint omitted).
|
|
30
110
|
*
|
|
31
111
|
* @element schmancy-date-range
|
|
32
|
-
* @fires
|
|
112
|
+
* @fires input - Provisional sweep preview { start, end }
|
|
113
|
+
* @fires change - Committed range change { start, end, preset }
|
|
33
114
|
*/
|
|
34
115
|
@customElement('schmancy-date-range')
|
|
35
116
|
export class SchmancyDateRange extends SchmancyFormField() {
|
|
@@ -37,111 +118,92 @@ export class SchmancyDateRange extends SchmancyFormField() {
|
|
|
37
118
|
// `validateOn`, `touched`, `submitted`, `markTouched`, `markSubmitted`,
|
|
38
119
|
// FACE wiring, FIELD_CONNECT_EVENT dispatch — all from the mixin.
|
|
39
120
|
|
|
40
|
-
@property(
|
|
41
|
-
@property(
|
|
42
|
-
@property(
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
121
|
+
@property() type: 'date' | 'datetime-local' = 'date'
|
|
122
|
+
@property() start: string | null = null
|
|
123
|
+
@property() end: string | null = null
|
|
124
|
+
|
|
125
|
+
/** Reference to the last array produced by buildDefaultPresets; used to detect consumer ownership. */
|
|
126
|
+
private defaultPresetsRef: DateRangeDialogPreset[] = buildDefaultPresets()
|
|
127
|
+
|
|
128
|
+
@property({ type: Array }) presets: DateRangeDialogPreset[] = this.defaultPresetsRef
|
|
129
|
+
|
|
130
|
+
/** True while the component holds the built-in default preset list (not user-supplied). */
|
|
131
|
+
private usingDefaultPresets = true
|
|
132
|
+
|
|
133
|
+
/** Selected preset id; null = custom range. Reflects to attribute. */
|
|
134
|
+
@property({ reflect: true }) preset: string | null = null
|
|
135
|
+
|
|
136
|
+
@property() min?: string
|
|
137
|
+
@property() max?: string
|
|
138
|
+
@property() placeholder = 'Select date range'
|
|
53
139
|
@property({ type: Boolean }) clearable = true
|
|
54
140
|
@property() step?: 'day' | 'week' | 'month' | 'year' | number
|
|
55
|
-
/**
|
|
141
|
+
/** Collapses to an icon-only button on narrow viewports. */
|
|
56
142
|
@property({ type: Boolean }) collapse = false
|
|
57
143
|
|
|
58
|
-
// Session
|
|
59
|
-
// in connectedCallback (rxjs ONE_PIPELINE_ONE_SUBSCRIBE / SESSIONS).
|
|
144
|
+
// Session subjects — ONE_PIPELINE_ONE_SUBSCRIBE in connectedCallback.
|
|
60
145
|
private readonly open$ = new Subject<MouseEvent | undefined>()
|
|
61
146
|
private readonly close$ = new Subject<void>()
|
|
62
147
|
private readonly announce$ = new Subject<string>()
|
|
63
148
|
|
|
64
|
-
// Internal states
|
|
65
149
|
@state() private isOpen = false
|
|
66
|
-
@state() private
|
|
67
|
-
@state() private activePreset: string | null = null
|
|
68
|
-
@state() private announceMessage: string = ''
|
|
69
|
-
|
|
70
|
-
// Default presets
|
|
71
|
-
private presetRanges: DateRangePreset[] = []
|
|
72
|
-
|
|
73
|
-
// Categorized presets
|
|
74
|
-
private presetCategories: PresetCategory[] = []
|
|
150
|
+
@state() private announceMessage = ''
|
|
75
151
|
|
|
76
|
-
//
|
|
77
|
-
private
|
|
152
|
+
// Default-capture for formResetCallback
|
|
153
|
+
private startDefault: string | null = null
|
|
154
|
+
private endDefault: string | null = null
|
|
155
|
+
private presetDefault: string | null = null
|
|
78
156
|
|
|
79
|
-
disconnectedCallback(): void {
|
|
157
|
+
override disconnectedCallback(): void {
|
|
80
158
|
super.disconnectedCallback()
|
|
81
|
-
// Reset open state when element is moved/removed to prevent stale state
|
|
82
159
|
this.isOpen = false
|
|
83
160
|
}
|
|
84
161
|
|
|
85
|
-
connectedCallback(): void {
|
|
162
|
+
override connectedCallback(): void {
|
|
86
163
|
super.connectedCallback()
|
|
87
|
-
this.initPresetRanges()
|
|
88
|
-
|
|
89
|
-
// Validate initial date range
|
|
90
|
-
const dateFormat = this.getDateFormat() as 'YYYY-MM-DD' | 'YYYY-MM-DDTHH:mm'
|
|
91
|
-
const validatedRange = validateInitialDateRange(this.dateFrom.value, this.dateTo.value, dateFormat)
|
|
92
|
-
|
|
93
|
-
if (validatedRange.isValid) {
|
|
94
|
-
this.dateFrom.value = validatedRange.dateFrom!
|
|
95
|
-
this.dateTo.value = validatedRange.dateTo!
|
|
96
|
-
this.updateSelectedDateRange()
|
|
97
|
-
} else {
|
|
98
|
-
const now = dayjs().format(dateFormat)
|
|
99
|
-
this.dateFrom.value = now
|
|
100
|
-
this.dateTo.value = now
|
|
101
|
-
this.updateSelectedDateRange()
|
|
102
|
-
}
|
|
103
164
|
|
|
104
|
-
// One pipeline
|
|
105
|
-
// dropdown open/close session, screen-reader announcements, and
|
|
106
|
-
// document keyboard navigation merge into a single chain torn down by
|
|
107
|
-
// takeUntil(this.disconnecting).
|
|
165
|
+
// One pipeline (rxjs ONE_PIPELINE_ONE_SUBSCRIBE).
|
|
108
166
|
merge(
|
|
109
|
-
//
|
|
110
|
-
// open$ opens the overlay; show() completes when an inner handler
|
|
111
|
-
// dispatches `close`, close$ dismisses it externally; finalize
|
|
112
|
-
// resets isOpen on either teardown path.
|
|
167
|
+
// Overlay session (rxjs SESSIONS_USE_HIGHER_ORDER_OBSERVABLES).
|
|
113
168
|
this.open$.pipe(
|
|
114
169
|
tap(() => {
|
|
115
|
-
this.dispatchEvent(new CustomEvent('beforeopen', { bubbles: true, composed: true }))
|
|
116
170
|
this.isOpen = true
|
|
117
171
|
}),
|
|
118
172
|
exhaustMap(anchor =>
|
|
119
173
|
show(
|
|
120
|
-
|
|
174
|
+
// Reactive factory — closed-over props read fresh on each mount.
|
|
175
|
+
() => html`
|
|
121
176
|
<schmancy-date-range-dialog
|
|
122
|
-
.type
|
|
123
|
-
.
|
|
124
|
-
.
|
|
125
|
-
.
|
|
126
|
-
.
|
|
127
|
-
.
|
|
128
|
-
.
|
|
129
|
-
@
|
|
130
|
-
|
|
131
|
-
this.
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
177
|
+
.type=${this.type}
|
|
178
|
+
.start=${this.start}
|
|
179
|
+
.end=${this.end}
|
|
180
|
+
.min=${this.min}
|
|
181
|
+
.max=${this.max}
|
|
182
|
+
.preset=${this.preset}
|
|
183
|
+
.presets=${this.presets}
|
|
184
|
+
@calendar-input=${(ev: CustomEvent<{ start: string | null; end: string | null }>) => {
|
|
185
|
+
ev.stopPropagation()
|
|
186
|
+
this.dispatchEvent(
|
|
187
|
+
new CustomEvent('input', {
|
|
188
|
+
detail: { start: ev.detail.start, end: ev.detail.end },
|
|
189
|
+
bubbles: true,
|
|
190
|
+
composed: true,
|
|
191
|
+
}),
|
|
192
|
+
)
|
|
193
|
+
}}
|
|
194
|
+
@calendar-change=${(ev: CustomEvent<{ start: string | null; end: string | null }>) => {
|
|
195
|
+
ev.stopPropagation()
|
|
196
|
+
this.commitRange(ev.detail.start, ev.detail.end, null)
|
|
197
|
+
// Two endpoints set → close overlay
|
|
198
|
+
if (ev.detail.start && ev.detail.end) {
|
|
199
|
+
ev.target?.dispatchEvent(new CustomEvent('close', { bubbles: true, composed: true }))
|
|
141
200
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
201
|
+
}}
|
|
202
|
+
@preset-select=${(ev: CustomEvent<DateRangeDialogPreset>) => {
|
|
203
|
+
ev.stopPropagation()
|
|
204
|
+
this.commitRange(ev.detail.start, ev.detail.end, ev.detail.id)
|
|
205
|
+
ev.target?.dispatchEvent(new CustomEvent('close', { bubbles: true, composed: true }))
|
|
206
|
+
}}
|
|
145
207
|
></schmancy-date-range-dialog>
|
|
146
208
|
`,
|
|
147
209
|
{ anchor },
|
|
@@ -153,211 +215,145 @@ export class SchmancyDateRange extends SchmancyFormField() {
|
|
|
153
215
|
),
|
|
154
216
|
),
|
|
155
217
|
),
|
|
156
|
-
|
|
157
|
-
//
|
|
218
|
+
|
|
219
|
+
// Screen-reader announcements.
|
|
158
220
|
this.announce$.pipe(
|
|
159
|
-
switchMap(message => concat(of(message), timer(
|
|
221
|
+
switchMap(message => concat(of(message), timer(1500).pipe(map(() => '')))),
|
|
160
222
|
tap(message => {
|
|
161
223
|
this.announceMessage = message
|
|
162
224
|
}),
|
|
163
225
|
),
|
|
226
|
+
|
|
164
227
|
// Document keyboard navigation.
|
|
165
|
-
fromEvent<KeyboardEvent>(document, 'keydown').pipe(tap(
|
|
228
|
+
fromEvent<KeyboardEvent>(document, 'keydown').pipe(tap(ev => this.handleKeyDown(ev))),
|
|
166
229
|
)
|
|
167
230
|
.pipe(takeUntil(this.disconnecting))
|
|
168
231
|
.subscribe()
|
|
169
232
|
}
|
|
170
233
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
if (
|
|
175
|
-
(changedProps.has('dateFrom') || changedProps.has('dateTo')) &&
|
|
176
|
-
(this.dateFrom?.value !== undefined || this.dateTo?.value !== undefined)
|
|
177
|
-
) {
|
|
178
|
-
this.updateSelectedDateRange()
|
|
179
|
-
}
|
|
180
|
-
}
|
|
234
|
+
// -------------------------------------------------------------------------
|
|
235
|
+
// Mixin overrides — FormData, validity, dirty, reset
|
|
236
|
+
// -------------------------------------------------------------------------
|
|
181
237
|
|
|
182
238
|
override willUpdate(changed: PropertyValues): void {
|
|
183
239
|
super.willUpdate(changed)
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
240
|
+
// Consumer ownership detection must run before the type-change rebuild so that
|
|
241
|
+
// when both `type` and `presets` arrive in the same willUpdate cycle (e.g. simultaneous
|
|
242
|
+
// attribute/property initialisation), the consumer's presets are not overwritten.
|
|
243
|
+
//
|
|
244
|
+
// A `presets` change signals consumer ownership when the incoming value is not the
|
|
245
|
+
// array reference produced by the internal default-builder (defaultPresetsRef).
|
|
246
|
+
// Since buildDefaultPresets always allocates a new array, defaultPresetsRef is the
|
|
247
|
+
// only reference that could match; any other reference came from the consumer.
|
|
248
|
+
if (changed.has('presets') && this.presets !== this.defaultPresetsRef) {
|
|
249
|
+
this.usingDefaultPresets = false
|
|
250
|
+
}
|
|
251
|
+
// Rebuild built-in presets when type changes, but only while the consumer has never
|
|
252
|
+
// supplied their own presets array.
|
|
253
|
+
if (changed.has('type') && this.usingDefaultPresets) {
|
|
254
|
+
this.defaultPresetsRef = buildDefaultPresets(this.type)
|
|
255
|
+
this.presets = this.defaultPresetsRef
|
|
256
|
+
}
|
|
257
|
+
if (changed.has('start') || changed.has('end') || changed.has('name') || changed.has('disabled')) {
|
|
189
258
|
if (this.name && !this.disabled) {
|
|
190
259
|
const fd = new FormData()
|
|
191
|
-
if (this.
|
|
192
|
-
if (this.
|
|
193
|
-
this.internals?.setFormValue(fd)
|
|
260
|
+
if (this.start) fd.append(`${this.name}.start`, this.start)
|
|
261
|
+
if (this.end) fd.append(`${this.name}.end`, this.end)
|
|
262
|
+
this.internals?.setFormValue(fd.has(`${this.name}.start`) || fd.has(`${this.name}.end`) ? fd : null)
|
|
194
263
|
} else {
|
|
195
264
|
this.internals?.setFormValue(null)
|
|
196
265
|
}
|
|
197
266
|
this.checkValidity()
|
|
198
267
|
}
|
|
199
|
-
if (changed.has('required')
|
|
268
|
+
if (changed.has('required')) {
|
|
200
269
|
this.checkValidity()
|
|
201
270
|
}
|
|
202
271
|
}
|
|
203
272
|
|
|
204
|
-
/**
|
|
205
|
-
* Date-range validity is `both dates non-empty` when required.
|
|
206
|
-
* (Order/range constraints are out of scope here — they belong to a
|
|
207
|
-
* domain-specific schema layer.)
|
|
208
|
-
*/
|
|
209
273
|
override checkValidity(): boolean {
|
|
210
274
|
if (this.disabled) {
|
|
211
275
|
this.internals?.setValidity({})
|
|
212
276
|
return true
|
|
213
277
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
278
|
+
if (this.required && (!this.start || !this.end)) {
|
|
279
|
+
const msg = 'Please select a complete date range.'
|
|
280
|
+
this.internals?.setValidity({ valueMissing: true }, msg)
|
|
281
|
+
if (this.shouldShowError()) {
|
|
282
|
+
this.error = true
|
|
283
|
+
this.validationMessage = msg
|
|
284
|
+
}
|
|
285
|
+
return false
|
|
286
|
+
}
|
|
287
|
+
if (this.start && this.end && this.end < this.start) {
|
|
288
|
+
const msg = 'End date must be on or after start date.'
|
|
289
|
+
this.internals?.setValidity({ customError: true }, msg)
|
|
290
|
+
if (this.shouldShowError()) {
|
|
291
|
+
this.error = true
|
|
292
|
+
this.validationMessage = msg
|
|
293
|
+
}
|
|
294
|
+
return false
|
|
295
|
+
}
|
|
296
|
+
this.internals?.setValidity({})
|
|
224
297
|
if (this.shouldShowError()) {
|
|
225
|
-
this.error =
|
|
226
|
-
this.validationMessage =
|
|
298
|
+
this.error = false
|
|
299
|
+
this.validationMessage = ''
|
|
227
300
|
}
|
|
228
|
-
return
|
|
301
|
+
return true
|
|
229
302
|
}
|
|
230
303
|
|
|
231
|
-
/**
|
|
232
|
-
* Override — emit `${name}From` and `${name}To` flat-suffix entries (the
|
|
233
|
-
* plan's chosen multi-entry encoding; native to JS consumers without
|
|
234
|
-
* server-side bracket parsing).
|
|
235
|
-
*/
|
|
236
304
|
override toFormEntries(): Array<[string, FormDataEntryValue]> {
|
|
237
305
|
if (!this.name || this.disabled) return []
|
|
238
306
|
const entries: Array<[string, FormDataEntryValue]> = []
|
|
239
|
-
if (this.
|
|
240
|
-
if (this.
|
|
307
|
+
if (this.start) entries.push([`${this.name}.start`, this.start])
|
|
308
|
+
if (this.end) entries.push([`${this.name}.end`, this.end])
|
|
241
309
|
return entries
|
|
242
310
|
}
|
|
243
311
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
312
|
+
override get dirty(): boolean {
|
|
313
|
+
return this.start !== this.startDefault || this.end !== this.endDefault
|
|
314
|
+
}
|
|
315
|
+
|
|
247
316
|
override firstUpdated(changed: PropertyValues): void {
|
|
248
317
|
super.firstUpdated(changed)
|
|
249
|
-
this.
|
|
250
|
-
this.
|
|
251
|
-
|
|
252
|
-
override get dirty(): boolean {
|
|
253
|
-
return (
|
|
254
|
-
(this.dateFrom?.value ?? '') !== this.dateFromDefault ||
|
|
255
|
-
(this.dateTo?.value ?? '') !== this.dateToDefault
|
|
256
|
-
)
|
|
318
|
+
this.startDefault = this.start
|
|
319
|
+
this.endDefault = this.end
|
|
320
|
+
this.presetDefault = this.preset
|
|
257
321
|
}
|
|
258
322
|
|
|
259
323
|
override resetForm(): void {
|
|
260
|
-
this.
|
|
261
|
-
this.
|
|
262
|
-
|
|
324
|
+
this.start = this.startDefault
|
|
325
|
+
this.end = this.endDefault
|
|
326
|
+
this.preset = this.presetDefault
|
|
327
|
+
this.error = false
|
|
328
|
+
this.validationMessage = ''
|
|
329
|
+
this.touched = false
|
|
330
|
+
this.submitted = false
|
|
331
|
+
this.internals?.setValidity({})
|
|
263
332
|
}
|
|
264
333
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
// Check memoization cache
|
|
270
|
-
if (this.memoizedPresets.has(cacheKey)) {
|
|
271
|
-
const cached = this.memoizedPresets.get(cacheKey)!
|
|
272
|
-
this.presetCategories = cached
|
|
273
|
-
this.presetRanges = []
|
|
274
|
-
cached.forEach(category => {
|
|
275
|
-
this.presetRanges.push(...category.presets)
|
|
276
|
-
})
|
|
277
|
-
return
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
// Generate preset categories
|
|
281
|
-
this.presetCategories = generatePresetCategories(format, this.type === 'datetime-local')
|
|
282
|
-
|
|
283
|
-
// Flatten presets for other methods that expect a flat list
|
|
284
|
-
this.presetRanges = []
|
|
285
|
-
this.presetCategories.forEach(category => {
|
|
286
|
-
this.presetRanges.push(...category.presets)
|
|
287
|
-
})
|
|
288
|
-
|
|
289
|
-
// Add custom presets if provided
|
|
290
|
-
if (this.customPresets && this.customPresets.length > 0) {
|
|
291
|
-
const customCategory: PresetCategory = {
|
|
292
|
-
name: 'Custom',
|
|
293
|
-
presets: this.customPresets.map(preset => ({
|
|
294
|
-
label: preset.label,
|
|
295
|
-
range: {
|
|
296
|
-
dateFrom: preset.dateFrom,
|
|
297
|
-
dateTo: preset.dateTo,
|
|
298
|
-
},
|
|
299
|
-
step: 'day' as const,
|
|
300
|
-
})),
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
this.presetCategories.push(customCategory)
|
|
304
|
-
this.presetRanges.push(...customCategory.presets)
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
// Cache the result
|
|
308
|
-
this.memoizedPresets.set(cacheKey, [...this.presetCategories])
|
|
309
|
-
}
|
|
334
|
+
// -------------------------------------------------------------------------
|
|
335
|
+
// Internal helpers
|
|
336
|
+
// -------------------------------------------------------------------------
|
|
310
337
|
|
|
311
|
-
private
|
|
312
|
-
|
|
338
|
+
private commitRange(start: string | null, end: string | null, presetId: string | null): void {
|
|
339
|
+
this.start = start
|
|
340
|
+
this.end = end
|
|
341
|
+
this.preset = presetId
|
|
342
|
+
this.announce$.next(`Date range: ${this.displayLabel()}`)
|
|
343
|
+
this.emitChange({ start, end, preset: presetId })
|
|
313
344
|
}
|
|
314
345
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
// Find matching preset
|
|
320
|
-
const preset = this.presetRanges.find(
|
|
321
|
-
p => p.range.dateFrom === this.dateFrom.value && p.range.dateTo === this.dateTo.value,
|
|
322
|
-
)
|
|
323
|
-
|
|
324
|
-
if (preset) {
|
|
325
|
-
// If matches a preset, just use the preset name
|
|
326
|
-
this.selectedDateRange = preset.label
|
|
327
|
-
this.activePreset = preset.label
|
|
328
|
-
return
|
|
346
|
+
private displayLabel(): string {
|
|
347
|
+
if (this.preset) {
|
|
348
|
+
const p = this.presets.find(x => x.id === this.preset)
|
|
349
|
+
if (p) return p.label
|
|
329
350
|
}
|
|
330
|
-
|
|
331
|
-
// If we didn't find a preset match, check if we should update the active preset
|
|
332
|
-
this.checkAndUpdateActivePreset(this.dateFrom.value, this.dateTo.value)
|
|
333
|
-
|
|
334
|
-
// Custom date range - create concise format
|
|
335
|
-
this.activePreset = null
|
|
336
|
-
this.selectedDateRange = formatDateRange(this.dateFrom.value, this.dateTo.value, this.type, this.placeholder)
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
private setDateRange(dateFrom: string, dateTo: string) {
|
|
340
|
-
this.dateFrom.value = dateFrom
|
|
341
|
-
this.dateTo.value = dateTo
|
|
342
|
-
this.updateSelectedDateRange()
|
|
343
|
-
|
|
344
|
-
// Announce change to screen readers
|
|
345
|
-
this.announce$.next(`Date range updated: ${this.selectedDateRange}`)
|
|
346
|
-
|
|
347
|
-
this.dispatchEvent(
|
|
348
|
-
new CustomEvent<{ dateFrom: string; dateTo: string }>('change', {
|
|
349
|
-
detail: { dateFrom, dateTo },
|
|
350
|
-
bubbles: true,
|
|
351
|
-
composed: true,
|
|
352
|
-
}),
|
|
353
|
-
)
|
|
351
|
+
return formatDateRange(this.start ?? '', this.end ?? '', this.type, this.placeholder)
|
|
354
352
|
}
|
|
355
353
|
|
|
356
354
|
private toggleDropdown(e: MouseEvent) {
|
|
357
355
|
e.stopPropagation()
|
|
358
356
|
if (this.disabled || this.step !== undefined) return
|
|
359
|
-
// Drive the session pipeline (connectedCallback) — no imperative
|
|
360
|
-
// open/close, no manual subscription field.
|
|
361
357
|
if (this.isOpen) {
|
|
362
358
|
this.close$.next()
|
|
363
359
|
} else {
|
|
@@ -365,24 +361,18 @@ export class SchmancyDateRange extends SchmancyFormField() {
|
|
|
365
361
|
}
|
|
366
362
|
}
|
|
367
363
|
|
|
368
|
-
/**
|
|
369
|
-
* Shifts the date range based on the step property
|
|
370
|
-
*/
|
|
371
364
|
private shiftDateRange(direction: number, e: Event) {
|
|
372
365
|
e.stopPropagation()
|
|
366
|
+
if (!this.start || !this.end) return
|
|
373
367
|
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
const fromDate = dayjs(this.dateFrom.value)
|
|
377
|
-
const toDate = dayjs(this.dateTo.value)
|
|
378
|
-
|
|
368
|
+
const fromDate = dayjs(this.start)
|
|
369
|
+
const toDate = dayjs(this.end)
|
|
379
370
|
if (!fromDate.isValid() || !toDate.isValid()) return
|
|
380
371
|
|
|
381
|
-
const
|
|
372
|
+
const dateFormat = this.type === 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DDTHH:mm'
|
|
382
373
|
const dir = direction > 0 ? 1 : -1
|
|
383
374
|
const daysDiff = toDate.diff(fromDate, 'day') + 1
|
|
384
375
|
|
|
385
|
-
// Determine shift amount and unit
|
|
386
376
|
let amount: number
|
|
387
377
|
let unit: dayjs.ManipulateType
|
|
388
378
|
|
|
@@ -398,7 +388,6 @@ export class SchmancyDateRange extends SchmancyFormField() {
|
|
|
398
388
|
unit = this.step
|
|
399
389
|
}
|
|
400
390
|
} else {
|
|
401
|
-
// Auto-detect based on date range
|
|
402
391
|
const rangeType = detectDateRangeType(fromDate, toDate)
|
|
403
392
|
if (rangeType.isFullYear) {
|
|
404
393
|
amount = dir
|
|
@@ -415,182 +404,135 @@ export class SchmancyDateRange extends SchmancyFormField() {
|
|
|
415
404
|
}
|
|
416
405
|
}
|
|
417
406
|
|
|
418
|
-
const
|
|
419
|
-
const
|
|
407
|
+
const newFrom = fromDate.add(amount, unit)
|
|
408
|
+
const newTo = toDate.add(amount, unit)
|
|
420
409
|
|
|
421
|
-
|
|
422
|
-
if (this.
|
|
423
|
-
if (this.maxDate && newToDate.isAfter(dayjs(this.maxDate))) return
|
|
410
|
+
if (this.min && newFrom.isBefore(dayjs(this.min))) return
|
|
411
|
+
if (this.max && newTo.isAfter(dayjs(this.max))) return
|
|
424
412
|
|
|
425
|
-
|
|
426
|
-
this.setDateRange(newFromDate.format(format), newToDate.format(format))
|
|
427
|
-
this.checkAndUpdateActivePreset(newFromDate.format(format), newToDate.format(format))
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
/**
|
|
431
|
-
* Handle keyboard navigation for accessibility
|
|
432
|
-
*/
|
|
433
|
-
private handleKeyboardNavigation(event: KeyboardEvent) {
|
|
434
|
-
const key = event.key
|
|
435
|
-
|
|
436
|
-
// Handle date navigation keys
|
|
437
|
-
if (this.dateFrom.value && this.dateTo.value && !this.disabled) {
|
|
438
|
-
switch (key) {
|
|
439
|
-
case 'PageUp':
|
|
440
|
-
if (event.target === this || this.contains(event.target as Node)) {
|
|
441
|
-
this.shiftDateRange(-1, event)
|
|
442
|
-
event.preventDefault()
|
|
443
|
-
}
|
|
444
|
-
break
|
|
445
|
-
case 'PageDown':
|
|
446
|
-
if (event.target === this || this.contains(event.target as Node)) {
|
|
447
|
-
this.shiftDateRange(1, event)
|
|
448
|
-
event.preventDefault()
|
|
449
|
-
}
|
|
450
|
-
break
|
|
451
|
-
case 'Home':
|
|
452
|
-
if (event.ctrlKey && (event.target === this || this.contains(event.target as Node))) {
|
|
453
|
-
// Ctrl+Home: Jump to start of current month
|
|
454
|
-
const currentFrom = dayjs(this.dateFrom.value)
|
|
455
|
-
const currentTo = dayjs(this.dateTo.value)
|
|
456
|
-
const monthStart = currentFrom.startOf('month')
|
|
457
|
-
const daysDiff = currentTo.diff(currentFrom, 'day')
|
|
458
|
-
|
|
459
|
-
this.setDateRange(
|
|
460
|
-
monthStart.format(this.getDateFormat()),
|
|
461
|
-
monthStart.add(daysDiff, 'day').format(this.getDateFormat())
|
|
462
|
-
)
|
|
463
|
-
event.preventDefault()
|
|
464
|
-
}
|
|
465
|
-
break
|
|
466
|
-
case 'End':
|
|
467
|
-
if (event.ctrlKey && (event.target === this || this.contains(event.target as Node))) {
|
|
468
|
-
// Ctrl+End: Jump to end of current month
|
|
469
|
-
const currentFrom = dayjs(this.dateFrom.value)
|
|
470
|
-
const currentTo = dayjs(this.dateTo.value)
|
|
471
|
-
const daysDiff = currentTo.diff(currentFrom, 'day')
|
|
472
|
-
const monthEnd = currentTo.endOf('month')
|
|
473
|
-
|
|
474
|
-
this.setDateRange(
|
|
475
|
-
monthEnd.subtract(daysDiff, 'day').format(this.getDateFormat()),
|
|
476
|
-
monthEnd.format(this.getDateFormat())
|
|
477
|
-
)
|
|
478
|
-
event.preventDefault()
|
|
479
|
-
}
|
|
480
|
-
break
|
|
481
|
-
}
|
|
482
|
-
}
|
|
413
|
+
this.commitRange(newFrom.format(dateFormat), newTo.format(dateFormat), null)
|
|
483
414
|
}
|
|
484
415
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
416
|
+
private handleKeyDown(ev: KeyboardEvent) {
|
|
417
|
+
if (!this.start || !this.end || this.disabled) return
|
|
418
|
+
const target = ev.target as Node | null
|
|
419
|
+
if (target !== this && !this.contains(target)) return
|
|
420
|
+
|
|
421
|
+
switch (ev.key) {
|
|
422
|
+
case 'PageUp':
|
|
423
|
+
this.shiftDateRange(-1, ev)
|
|
424
|
+
ev.preventDefault()
|
|
425
|
+
break
|
|
426
|
+
case 'PageDown':
|
|
427
|
+
this.shiftDateRange(1, ev)
|
|
428
|
+
ev.preventDefault()
|
|
429
|
+
break
|
|
430
|
+
case 'Home':
|
|
431
|
+
if (ev.ctrlKey) {
|
|
432
|
+
const fmt = this.type === 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DDTHH:mm'
|
|
433
|
+
const from = dayjs(this.start)
|
|
434
|
+
const to = dayjs(this.end)
|
|
435
|
+
const monthStart = from.startOf('month')
|
|
436
|
+
this.commitRange(
|
|
437
|
+
monthStart.format(fmt),
|
|
438
|
+
monthStart.add(to.diff(from, 'day'), 'day').format(fmt),
|
|
439
|
+
null,
|
|
440
|
+
)
|
|
441
|
+
ev.preventDefault()
|
|
442
|
+
}
|
|
443
|
+
break
|
|
444
|
+
case 'End':
|
|
445
|
+
if (ev.ctrlKey) {
|
|
446
|
+
const fmt = this.type === 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DDTHH:mm'
|
|
447
|
+
const from = dayjs(this.start)
|
|
448
|
+
const to = dayjs(this.end)
|
|
449
|
+
const monthEnd = to.endOf('month')
|
|
450
|
+
this.commitRange(
|
|
451
|
+
monthEnd.subtract(to.diff(from, 'day'), 'day').format(fmt),
|
|
452
|
+
monthEnd.format(fmt),
|
|
453
|
+
null,
|
|
454
|
+
)
|
|
455
|
+
ev.preventDefault()
|
|
456
|
+
}
|
|
457
|
+
break
|
|
499
458
|
}
|
|
500
459
|
}
|
|
501
460
|
|
|
502
|
-
/**
|
|
503
|
-
* Check if we can navigate backward
|
|
504
|
-
*/
|
|
505
461
|
private canNavigateBackward(): boolean {
|
|
506
|
-
if (!this.
|
|
507
|
-
|
|
508
|
-
const fromDate = dayjs(this.dateFrom.value)
|
|
509
|
-
const minDate = dayjs(this.minDate)
|
|
510
|
-
|
|
511
|
-
// If current start date is already at or before min date, can't go back
|
|
512
|
-
return fromDate.isAfter(minDate)
|
|
462
|
+
if (!this.start || !this.min) return true
|
|
463
|
+
return dayjs(this.start).isAfter(dayjs(this.min))
|
|
513
464
|
}
|
|
514
465
|
|
|
515
|
-
/**
|
|
516
|
-
* Check if we can navigate forward
|
|
517
|
-
*/
|
|
518
466
|
private canNavigateForward(): boolean {
|
|
519
|
-
if (!this.
|
|
520
|
-
|
|
521
|
-
const toDate = dayjs(this.dateTo.value)
|
|
522
|
-
const maxDate = dayjs(this.maxDate)
|
|
523
|
-
|
|
524
|
-
// If current end date is already at or after max date, can't go forward
|
|
525
|
-
return toDate.isBefore(maxDate)
|
|
467
|
+
if (!this.end || !this.max) return true
|
|
468
|
+
return dayjs(this.end).isBefore(dayjs(this.max))
|
|
526
469
|
}
|
|
527
470
|
|
|
471
|
+
// -------------------------------------------------------------------------
|
|
472
|
+
// Render
|
|
473
|
+
// -------------------------------------------------------------------------
|
|
528
474
|
|
|
529
475
|
render() {
|
|
530
|
-
// Step 6 — validity is two surfaces: when checkValidity() has flipped
|
|
531
|
-
// `error` (gated by `shouldShowError`), the control must visibly carry
|
|
532
|
-
// the invalid treatment AND render the message. Platform validity is
|
|
533
|
-
// set in checkValidity(); this paints the user-facing half.
|
|
534
476
|
const showError = this.error && !!this.validationMessage
|
|
535
477
|
const errorRing = showError ? ' rounded outline outline-2 outline-error-default' : ''
|
|
478
|
+
const label = this.displayLabel()
|
|
536
479
|
|
|
537
480
|
return html`
|
|
538
481
|
<div class="relative ${this.disabled ? 'opacity-60 pointer-events-none' : ''}">
|
|
539
482
|
<!-- Screen reader announcements -->
|
|
540
|
-
<div class="sr-only" role="status" aria-live="polite" aria-atomic="true">
|
|
541
|
-
${this.announceMessage}
|
|
542
|
-
</div>
|
|
483
|
+
<div class="sr-only" role="status" aria-live="polite" aria-atomic="true">${this.announceMessage}</div>
|
|
543
484
|
|
|
544
|
-
<!-- Collapsed: icon-only on
|
|
485
|
+
<!-- Collapsed: icon-only on narrow viewports when collapse=true -->
|
|
545
486
|
<schmancy-icon-button
|
|
546
487
|
class="${this.collapse ? 'lg:hidden' : 'hidden'}${errorRing}"
|
|
547
488
|
variant="outlined"
|
|
548
489
|
type="button"
|
|
549
490
|
aria-invalid=${showError ? 'true' : 'false'}
|
|
550
|
-
aria-label="Select date range. Current: ${
|
|
491
|
+
aria-label="Select date range. Current: ${label}"
|
|
551
492
|
@click=${(e: MouseEvent) => this.toggleDropdown(e)}
|
|
552
493
|
?disabled=${this.disabled}
|
|
553
494
|
>
|
|
554
|
-
|
|
495
|
+
date_range
|
|
555
496
|
</schmancy-icon-button>
|
|
556
497
|
|
|
557
|
-
<!-- Full
|
|
498
|
+
<!-- Full trigger row: [← | range label | →] -->
|
|
558
499
|
<section
|
|
559
|
-
@click=${(
|
|
500
|
+
@click=${(ev: Event) => ev.stopPropagation()}
|
|
560
501
|
aria-invalid=${showError ? 'true' : 'false'}
|
|
561
|
-
class="${this.collapse ? 'hidden lg:flex' : 'flex'}${errorRing}"
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
502
|
+
class="${this.collapse ? 'hidden lg:flex' : 'flex'}${errorRing}"
|
|
503
|
+
>
|
|
504
|
+
<schmancy-icon-button
|
|
505
|
+
type="button"
|
|
506
|
+
aria-label="Previous ${this.preset ?? 'date range'}"
|
|
507
|
+
@click=${(e: Event) => this.shiftDateRange(-1, e)}
|
|
508
|
+
?disabled=${this.disabled || !this.start || !this.end || !this.canNavigateBackward()}
|
|
509
|
+
>
|
|
510
|
+
arrow_left
|
|
511
|
+
</schmancy-icon-button>
|
|
512
|
+
|
|
513
|
+
<schmancy-button
|
|
514
|
+
class="w-max"
|
|
515
|
+
variant="outlined"
|
|
516
|
+
type="button"
|
|
517
|
+
aria-haspopup="dialog"
|
|
518
|
+
aria-expanded=${this.isOpen}
|
|
519
|
+
aria-label="Select date range. Current: ${label}"
|
|
520
|
+
aria-readonly="${this.step !== undefined}"
|
|
521
|
+
@click=${(e: MouseEvent) => this.toggleDropdown(e)}
|
|
522
|
+
?disabled=${this.disabled}
|
|
523
|
+
style="${this.step !== undefined ? 'cursor:default;' : ''}"
|
|
524
|
+
>
|
|
525
|
+
${label}
|
|
526
|
+
</schmancy-button>
|
|
527
|
+
|
|
528
|
+
<schmancy-icon-button
|
|
529
|
+
type="button"
|
|
530
|
+
aria-label="Next ${this.preset ?? 'date range'}"
|
|
531
|
+
@click=${(e: Event) => this.shiftDateRange(1, e)}
|
|
532
|
+
?disabled=${this.disabled || !this.start || !this.end || !this.canNavigateForward()}
|
|
533
|
+
>
|
|
534
|
+
arrow_right
|
|
535
|
+
</schmancy-icon-button>
|
|
594
536
|
</section>
|
|
595
537
|
|
|
596
538
|
${showError
|
|
@@ -599,4 +541,10 @@ export class SchmancyDateRange extends SchmancyFormField() {
|
|
|
599
541
|
</div>
|
|
600
542
|
`
|
|
601
543
|
}
|
|
602
|
-
}
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
declare global {
|
|
547
|
+
interface HTMLElementTagNameMap {
|
|
548
|
+
'schmancy-date-range': SchmancyDateRange
|
|
549
|
+
}
|
|
550
|
+
}
|