@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,146 +1,600 @@
|
|
|
1
|
-
import { afterEach,
|
|
2
|
-
import './date-range'
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
3
2
|
import { expectNoA11yViolations } from '../../../test-utils/a11y'
|
|
3
|
+
import type { SchmancyDateRange } from './date-range'
|
|
4
|
+
import './date-range'
|
|
5
|
+
// Ensure schmancy-overlay is registered in this page's customElements registry
|
|
6
|
+
// (the decorator in overlay.component runs on import, which is required before
|
|
7
|
+
// show() can create a functional overlay element in browser tests).
|
|
8
|
+
import '../../../overlay/overlay.component'
|
|
9
|
+
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Helpers
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
4
13
|
|
|
5
14
|
const nextUpdate = () => new Promise(r => requestAnimationFrame(() => r(null)))
|
|
6
15
|
|
|
16
|
+
/** Mount a <schmancy-date-range> in a host div appended to body. */
|
|
17
|
+
async function mountEl(innerHTML: string): Promise<HTMLDivElement> {
|
|
18
|
+
const host = document.createElement('div')
|
|
19
|
+
host.innerHTML = innerHTML
|
|
20
|
+
document.body.appendChild(host)
|
|
21
|
+
const el = host.querySelector('schmancy-date-range') as SchmancyDateRange
|
|
22
|
+
await nextUpdate()
|
|
23
|
+
await nextUpdate()
|
|
24
|
+
if (el && 'updateComplete' in el) await (el as unknown as { updateComplete: Promise<unknown> }).updateComplete
|
|
25
|
+
return host
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const dr = (root: HTMLElement): SchmancyDateRange =>
|
|
29
|
+
root.querySelector('schmancy-date-range') as SchmancyDateRange
|
|
30
|
+
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// Suites
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
|
|
7
35
|
describe('schmancy-date-range', () => {
|
|
8
|
-
|
|
36
|
+
const hosts: HTMLDivElement[] = []
|
|
9
37
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
38
|
+
afterEach(async () => {
|
|
39
|
+
for (const h of hosts) h.remove()
|
|
40
|
+
hosts.length = 0
|
|
41
|
+
// Flush microtasks so overlay.finalize's queueMicrotask(() => el.remove()) runs,
|
|
42
|
+
// then remove any stray overlay elements left in the DOM.
|
|
43
|
+
await nextUpdate()
|
|
44
|
+
document.querySelectorAll('schmancy-overlay').forEach(o => o.remove())
|
|
13
45
|
})
|
|
14
46
|
|
|
15
|
-
|
|
16
|
-
host
|
|
47
|
+
async function mount(innerHTML: string): Promise<HTMLDivElement> {
|
|
48
|
+
const host = await mountEl(innerHTML)
|
|
49
|
+
hosts.push(host)
|
|
50
|
+
return host
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// -------------------------------------------------------------------------
|
|
54
|
+
describe('FormData contract', () => {
|
|
55
|
+
it('contributes ${name}.start and ${name}.end when both set', async () => {
|
|
56
|
+
const host = await mount('<form><schmancy-date-range name="window"></schmancy-date-range></form>')
|
|
57
|
+
const form = host.querySelector('form') as HTMLFormElement
|
|
58
|
+
const el = dr(host)
|
|
59
|
+
el.start = '2026-01-01'
|
|
60
|
+
el.end = '2026-01-31'
|
|
61
|
+
await el.updateComplete
|
|
62
|
+
const fd = new FormData(form)
|
|
63
|
+
expect(fd.get('window.start')).toBe('2026-01-01')
|
|
64
|
+
expect(fd.get('window.end')).toBe('2026-01-31')
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
it('omits empty endpoint from FormData', async () => {
|
|
68
|
+
const host = await mount('<form><schmancy-date-range name="window"></schmancy-date-range></form>')
|
|
69
|
+
const form = host.querySelector('form') as HTMLFormElement
|
|
70
|
+
const el = dr(host)
|
|
71
|
+
el.start = '2026-01-01'
|
|
72
|
+
el.end = null
|
|
73
|
+
await el.updateComplete
|
|
74
|
+
const fd = new FormData(form)
|
|
75
|
+
expect(fd.get('window.start')).toBe('2026-01-01')
|
|
76
|
+
expect(fd.get('window.end')).toBeNull()
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
it('submits nothing when name is unset', async () => {
|
|
80
|
+
const host = await mount('<form><schmancy-date-range></schmancy-date-range></form>')
|
|
81
|
+
const form = host.querySelector('form') as HTMLFormElement
|
|
82
|
+
const el = dr(host)
|
|
83
|
+
el.start = '2026-01-01'
|
|
84
|
+
el.end = '2026-01-31'
|
|
85
|
+
await el.updateComplete
|
|
86
|
+
expect([...new FormData(form).keys()]).toEqual([])
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
it('submits nothing when disabled', async () => {
|
|
90
|
+
const host = await mount('<form><schmancy-date-range name="window" disabled></schmancy-date-range></form>')
|
|
91
|
+
const form = host.querySelector('form') as HTMLFormElement
|
|
92
|
+
const el = dr(host)
|
|
93
|
+
el.start = '2026-01-01'
|
|
94
|
+
el.end = '2026-01-31'
|
|
95
|
+
await el.updateComplete
|
|
96
|
+
expect([...new FormData(form).keys()]).toEqual([])
|
|
97
|
+
})
|
|
17
98
|
})
|
|
18
99
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
100
|
+
// -------------------------------------------------------------------------
|
|
101
|
+
describe('validity', () => {
|
|
102
|
+
it('is invalid when required and both endpoints empty', async () => {
|
|
103
|
+
const host = await mount('<form><schmancy-date-range name="w" required></schmancy-date-range></form>')
|
|
104
|
+
const form = host.querySelector('form') as HTMLFormElement
|
|
105
|
+
const el = dr(host)
|
|
106
|
+
await el.updateComplete
|
|
107
|
+
expect(el.checkValidity()).toBe(false)
|
|
108
|
+
expect(form.checkValidity()).toBe(false)
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
it('becomes valid once both endpoints are set', async () => {
|
|
112
|
+
const host = await mount('<form><schmancy-date-range name="w" required></schmancy-date-range></form>')
|
|
113
|
+
const form = host.querySelector('form') as HTMLFormElement
|
|
114
|
+
const el = dr(host)
|
|
115
|
+
el.start = '2026-01-01'
|
|
116
|
+
el.end = '2026-01-02'
|
|
117
|
+
await el.updateComplete
|
|
118
|
+
expect(el.checkValidity()).toBe(true)
|
|
119
|
+
expect(form.checkValidity()).toBe(true)
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
it('renders invalid surface with the ACTUAL message after markSubmitted', async () => {
|
|
123
|
+
const host = await mount('<form><schmancy-date-range name="w" required></schmancy-date-range></form>')
|
|
124
|
+
const form = host.querySelector('form') as HTMLFormElement
|
|
125
|
+
const el = dr(host)
|
|
126
|
+
await el.updateComplete
|
|
127
|
+
|
|
128
|
+
// Platform surface blocks submit
|
|
129
|
+
expect(form.checkValidity()).toBe(false)
|
|
130
|
+
|
|
131
|
+
// Rendered surface gates on submit (validateOn default)
|
|
132
|
+
el.markSubmitted()
|
|
133
|
+
el.checkValidity()
|
|
134
|
+
await el.updateComplete
|
|
135
|
+
await nextUpdate()
|
|
136
|
+
|
|
137
|
+
const root = el.shadowRoot!
|
|
138
|
+
const alert = root.querySelector('[role="alert"]')
|
|
139
|
+
expect(alert, 'role=alert must render').not.toBeNull()
|
|
140
|
+
expect(alert?.textContent?.trim()).toBe('Please select a complete date range.')
|
|
141
|
+
expect(
|
|
142
|
+
root.querySelector('section.outline-error-default'),
|
|
143
|
+
'control must carry invalid treatment',
|
|
144
|
+
).not.toBeNull()
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
it('clears both validity surfaces once both endpoints set', async () => {
|
|
148
|
+
const host = await mount('<form><schmancy-date-range name="w" required></schmancy-date-range></form>')
|
|
149
|
+
const form = host.querySelector('form') as HTMLFormElement
|
|
150
|
+
const el = dr(host)
|
|
151
|
+
await el.updateComplete
|
|
152
|
+
el.markSubmitted()
|
|
153
|
+
el.checkValidity()
|
|
154
|
+
await el.updateComplete
|
|
155
|
+
|
|
156
|
+
el.start = '2026-01-01'
|
|
157
|
+
el.end = '2026-01-31'
|
|
158
|
+
await el.updateComplete
|
|
159
|
+
await nextUpdate()
|
|
160
|
+
|
|
161
|
+
expect(form.checkValidity()).toBe(true)
|
|
162
|
+
expect(el.shadowRoot!.querySelector('[role="alert"]')).toBeNull()
|
|
163
|
+
expect(el.shadowRoot!.querySelector('section.outline-error-default')).toBeNull()
|
|
164
|
+
})
|
|
39
165
|
})
|
|
40
166
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
167
|
+
// -------------------------------------------------------------------------
|
|
168
|
+
describe('events', () => {
|
|
169
|
+
it('change event detail carries {start, end, preset}', async () => {
|
|
170
|
+
const host = await mount('<schmancy-date-range name="window"></schmancy-date-range>')
|
|
171
|
+
const el = dr(host)
|
|
172
|
+
el.start = '2026-01-01'
|
|
173
|
+
el.end = '2026-01-07'
|
|
174
|
+
await el.updateComplete
|
|
175
|
+
|
|
176
|
+
const received: CustomEvent[] = []
|
|
177
|
+
el.addEventListener('change', (e) => received.push(e as CustomEvent))
|
|
178
|
+
|
|
179
|
+
// PageDown keyboard shortcut triggers shiftDateRange → commitRange → change event
|
|
180
|
+
el.dispatchEvent(
|
|
181
|
+
new KeyboardEvent('keydown', { key: 'PageDown', bubbles: true, cancelable: true }),
|
|
182
|
+
)
|
|
183
|
+
await el.updateComplete
|
|
184
|
+
|
|
185
|
+
expect(received.length).toBeGreaterThan(0)
|
|
186
|
+
const detail = received[received.length - 1].detail as {
|
|
187
|
+
start: string | null
|
|
188
|
+
end: string | null
|
|
189
|
+
preset: string | null
|
|
190
|
+
}
|
|
191
|
+
expect(detail).toHaveProperty('start')
|
|
192
|
+
expect(detail).toHaveProperty('end')
|
|
193
|
+
expect(detail).toHaveProperty('preset')
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
it('change event is composed (crosses shadow boundary)', async () => {
|
|
197
|
+
const host = await mount('<form><schmancy-date-range name="window"></schmancy-date-range></form>')
|
|
198
|
+
const form = host.querySelector('form') as HTMLFormElement
|
|
199
|
+
const el = dr(host)
|
|
200
|
+
el.start = '2026-01-01'
|
|
201
|
+
el.end = '2026-01-07'
|
|
202
|
+
await el.updateComplete
|
|
203
|
+
|
|
204
|
+
const received: CustomEvent[] = []
|
|
205
|
+
form.addEventListener('change', (e) => received.push(e as CustomEvent))
|
|
206
|
+
|
|
207
|
+
el.dispatchEvent(
|
|
208
|
+
new KeyboardEvent('keydown', { key: 'PageDown', bubbles: true, cancelable: true }),
|
|
209
|
+
)
|
|
210
|
+
await el.updateComplete
|
|
211
|
+
|
|
212
|
+
expect(received.length).toBeGreaterThan(0)
|
|
213
|
+
expect(received[received.length - 1].composed).toBe(true)
|
|
214
|
+
expect(received[received.length - 1].detail).toHaveProperty('start')
|
|
215
|
+
expect(received[received.length - 1].detail).toHaveProperty('end')
|
|
216
|
+
expect(received[received.length - 1].detail).toHaveProperty('preset')
|
|
217
|
+
})
|
|
218
|
+
|
|
219
|
+
// -----------------------------------------------------------------------
|
|
220
|
+
// input event — provisional sweep-preview contract
|
|
221
|
+
// -----------------------------------------------------------------------
|
|
222
|
+
|
|
223
|
+
it('input event detail carries exactly {start, end} — no preset field', async () => {
|
|
224
|
+
const host = await mount('<schmancy-date-range name="window"></schmancy-date-range>')
|
|
225
|
+
const el = dr(host)
|
|
226
|
+
await el.updateComplete
|
|
227
|
+
|
|
228
|
+
// Open the picker. Fire a pointerdown on the document first so the
|
|
229
|
+
// ambient-anchor capture in overlay.service records a MouseEvent with
|
|
230
|
+
// clientX/clientY, then use schmancy-button's overridden click() so the
|
|
231
|
+
// composed Event reaches toggleDropdown the same way the CTA wiring test
|
|
232
|
+
// does (btn.click() calls SchmancyButton.click() → dispatchEvent).
|
|
233
|
+
const btn = el.shadowRoot!.querySelector('schmancy-button') as HTMLElement
|
|
234
|
+
document.dispatchEvent(new MouseEvent('pointerdown', { bubbles: true, composed: true, clientX: 10, clientY: 10 }))
|
|
235
|
+
btn.click()
|
|
236
|
+
await el.updateComplete
|
|
237
|
+
await nextUpdate()
|
|
238
|
+
|
|
239
|
+
const inputReceived: CustomEvent[] = []
|
|
240
|
+
const changeReceived: CustomEvent[] = []
|
|
241
|
+
el.addEventListener('input', (e) => inputReceived.push(e as CustomEvent))
|
|
242
|
+
el.addEventListener('change', (e) => changeReceived.push(e as CustomEvent))
|
|
243
|
+
|
|
244
|
+
// The overlay appends to document.body (or schmancy-theme). Wait for the
|
|
245
|
+
// dialog to appear inside the overlay's shadow root.
|
|
246
|
+
const dialog = await vi.waitFor(
|
|
247
|
+
() => {
|
|
248
|
+
for (const o of document.querySelectorAll('schmancy-overlay')) {
|
|
249
|
+
const d = o.shadowRoot?.querySelector('schmancy-date-range-dialog')
|
|
250
|
+
if (d) return d
|
|
251
|
+
}
|
|
252
|
+
throw new Error('dialog not mounted yet')
|
|
253
|
+
},
|
|
254
|
+
{ timeout: 2000 },
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
// Drive the bridge seam: dispatch the `calendar-input` event that
|
|
258
|
+
// schmancy-date-range-dialog re-emits from schmancy-calendar's `input`.
|
|
259
|
+
// The date-range @calendar-input handler re-emits as `input {start, end}`.
|
|
260
|
+
dialog.dispatchEvent(
|
|
261
|
+
new CustomEvent('calendar-input', {
|
|
262
|
+
detail: { start: '2026-06-01', end: '2026-06-15' },
|
|
263
|
+
bubbles: true,
|
|
264
|
+
composed: true,
|
|
265
|
+
}),
|
|
266
|
+
)
|
|
267
|
+
await el.updateComplete
|
|
268
|
+
|
|
269
|
+
// Must have fired at least one input event.
|
|
270
|
+
expect(inputReceived.length, 'input event must fire for sweep preview').toBeGreaterThan(0)
|
|
271
|
+
|
|
272
|
+
const detail = inputReceived[inputReceived.length - 1].detail as Record<string, unknown>
|
|
273
|
+
// Exact shape: {start, end} — no preset field.
|
|
274
|
+
expect(detail.start).toBe('2026-06-01')
|
|
275
|
+
expect(detail.end).toBe('2026-06-15')
|
|
276
|
+
expect(Object.keys(detail).toSorted()).toEqual(['end', 'start'])
|
|
277
|
+
|
|
278
|
+
// change must NOT have fired — provisional sweep is not a commit.
|
|
279
|
+
expect(changeReceived.length, 'change must not fire for provisional sweep').toBe(0)
|
|
280
|
+
})
|
|
281
|
+
|
|
282
|
+
it('input event is composed: true so it crosses the shadow boundary a <schmancy-form> listens across', async () => {
|
|
283
|
+
const host = await mount('<form><schmancy-date-range name="window"></schmancy-date-range></form>')
|
|
284
|
+
const form = host.querySelector('form') as HTMLFormElement
|
|
285
|
+
const el = dr(host)
|
|
286
|
+
await el.updateComplete
|
|
287
|
+
|
|
288
|
+
// Open the picker — same pointerdown + btn.click() pattern as the first test.
|
|
289
|
+
const btn2 = el.shadowRoot!.querySelector('schmancy-button') as HTMLElement
|
|
290
|
+
document.dispatchEvent(new MouseEvent('pointerdown', { bubbles: true, composed: true, clientX: 10, clientY: 10 }))
|
|
291
|
+
btn2.click()
|
|
292
|
+
await el.updateComplete
|
|
293
|
+
await nextUpdate()
|
|
294
|
+
|
|
295
|
+
const dialog = await vi.waitFor(
|
|
296
|
+
() => {
|
|
297
|
+
for (const o of document.querySelectorAll('schmancy-overlay')) {
|
|
298
|
+
const d = o.shadowRoot?.querySelector('schmancy-date-range-dialog')
|
|
299
|
+
if (d) return d
|
|
300
|
+
}
|
|
301
|
+
throw new Error('dialog not mounted yet')
|
|
302
|
+
},
|
|
303
|
+
{ timeout: 2000 },
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
// Listen at the form boundary — outside the component's shadow root.
|
|
307
|
+
const formReceived: Event[] = []
|
|
308
|
+
form.addEventListener('input', (e) => formReceived.push(e))
|
|
309
|
+
|
|
310
|
+
dialog.dispatchEvent(
|
|
311
|
+
new CustomEvent('calendar-input', {
|
|
312
|
+
detail: { start: '2026-07-01', end: '2026-07-10' },
|
|
313
|
+
bubbles: true,
|
|
314
|
+
composed: true,
|
|
315
|
+
}),
|
|
316
|
+
)
|
|
317
|
+
await el.updateComplete
|
|
318
|
+
|
|
319
|
+
const last = formReceived[formReceived.length - 1] as CustomEvent<{ start: string; end: string }>
|
|
320
|
+
expect(formReceived.length, 'input must cross shadow boundary (composed: true)').toBeGreaterThan(0)
|
|
321
|
+
expect(last.composed).toBe(true)
|
|
322
|
+
expect(last.detail.start).toBe('2026-07-01')
|
|
323
|
+
expect(last.detail.end).toBe('2026-07-10')
|
|
324
|
+
})
|
|
46
325
|
})
|
|
47
326
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
expect(dr.checkValidity()).toBe(true)
|
|
68
|
-
expect(form.checkValidity()).toBe(true)
|
|
327
|
+
// -------------------------------------------------------------------------
|
|
328
|
+
describe('CTA wiring', () => {
|
|
329
|
+
it('clicking the label button sets aria-expanded=true', async () => {
|
|
330
|
+
const host = await mount('<schmancy-date-range name="window"></schmancy-date-range>')
|
|
331
|
+
const el = dr(host)
|
|
332
|
+
await el.updateComplete
|
|
333
|
+
|
|
334
|
+
const btn = el.shadowRoot!.querySelector('schmancy-button') as HTMLElement
|
|
335
|
+
expect(btn).not.toBeNull()
|
|
336
|
+
|
|
337
|
+
btn.click()
|
|
338
|
+
await el.updateComplete
|
|
339
|
+
await nextUpdate()
|
|
340
|
+
|
|
341
|
+
expect(
|
|
342
|
+
el.shadowRoot!.querySelector('[aria-expanded="true"]'),
|
|
343
|
+
'aria-expanded must be true after CTA click',
|
|
344
|
+
).not.toBeNull()
|
|
345
|
+
})
|
|
69
346
|
})
|
|
70
347
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
await nextUpdate()
|
|
81
|
-
await nextUpdate()
|
|
82
|
-
dr.dateFrom = { label: 'From', value: '' }
|
|
83
|
-
dr.dateTo = { label: 'To', value: '' }
|
|
84
|
-
await nextUpdate()
|
|
348
|
+
// -------------------------------------------------------------------------
|
|
349
|
+
describe('teardown', () => {
|
|
350
|
+
it('stops responding to document keydown after disconnect', async () => {
|
|
351
|
+
const host = await mount('<schmancy-date-range name="window"></schmancy-date-range>')
|
|
352
|
+
const el = dr(host)
|
|
353
|
+
el.start = '2026-01-01'
|
|
354
|
+
el.end = '2026-01-07'
|
|
355
|
+
await el.updateComplete
|
|
85
356
|
|
|
86
|
-
|
|
87
|
-
|
|
357
|
+
const received: Event[] = []
|
|
358
|
+
el.addEventListener('change', (e) => received.push(e))
|
|
88
359
|
|
|
89
|
-
|
|
90
|
-
dr.markSubmitted()
|
|
91
|
-
dr.checkValidity()
|
|
92
|
-
await nextUpdate()
|
|
93
|
-
await nextUpdate()
|
|
360
|
+
el.remove()
|
|
94
361
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
'the control must carry an invalid treatment',
|
|
103
|
-
).not.toBeNull()
|
|
104
|
-
|
|
105
|
-
// Filling the range clears both surfaces.
|
|
106
|
-
dr.dateFrom = { label: 'From', value: '2026-01-01' }
|
|
107
|
-
dr.dateTo = { label: 'To', value: '2026-01-31' }
|
|
108
|
-
await nextUpdate()
|
|
109
|
-
await nextUpdate()
|
|
110
|
-
expect(form.checkValidity()).toBe(true)
|
|
111
|
-
expect(root.querySelector('[role="alert"]')).toBeNull()
|
|
112
|
-
expect(root.querySelector('section.outline-error-default')).toBeNull()
|
|
362
|
+
document.dispatchEvent(
|
|
363
|
+
new KeyboardEvent('keydown', { key: 'PageDown', bubbles: true, cancelable: true }),
|
|
364
|
+
)
|
|
365
|
+
await nextUpdate()
|
|
366
|
+
|
|
367
|
+
expect(received).toHaveLength(0)
|
|
368
|
+
})
|
|
113
369
|
})
|
|
114
370
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
await nextUpdate()
|
|
127
|
-
await nextUpdate()
|
|
128
|
-
await expectNoA11yViolations(host)
|
|
371
|
+
// -------------------------------------------------------------------------
|
|
372
|
+
describe('axe-core accessibility', () => {
|
|
373
|
+
it('has no a11y violations', async () => {
|
|
374
|
+
const host = await mount('<schmancy-date-range name="window"></schmancy-date-range>')
|
|
375
|
+
const el = dr(host)
|
|
376
|
+
el.start = '2026-01-01'
|
|
377
|
+
el.end = '2026-01-31'
|
|
378
|
+
await el.updateComplete
|
|
379
|
+
await nextUpdate()
|
|
380
|
+
await expectNoA11yViolations(host)
|
|
381
|
+
})
|
|
129
382
|
})
|
|
130
383
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
384
|
+
// -------------------------------------------------------------------------
|
|
385
|
+
describe('datetime-local', () => {
|
|
386
|
+
// Calendar pick → commits start-of-day / end-of-day YYYY-MM-DDTHH:mm
|
|
387
|
+
it('calendar pick commits start-of-day T00:00 and end-of-day T23:59', async () => {
|
|
388
|
+
const host = await mount('<schmancy-date-range name="dtw" type="datetime-local"></schmancy-date-range>')
|
|
389
|
+
const el = dr(host)
|
|
390
|
+
await el.updateComplete
|
|
391
|
+
|
|
392
|
+
// Open the picker.
|
|
393
|
+
const btn = el.shadowRoot!.querySelector('schmancy-button') as HTMLElement
|
|
394
|
+
document.dispatchEvent(new MouseEvent('pointerdown', { bubbles: true, composed: true, clientX: 10, clientY: 10 }))
|
|
395
|
+
btn.click()
|
|
396
|
+
await el.updateComplete
|
|
397
|
+
await nextUpdate()
|
|
398
|
+
|
|
399
|
+
const dialog = await vi.waitFor(
|
|
400
|
+
() => {
|
|
401
|
+
for (const o of document.querySelectorAll('schmancy-overlay')) {
|
|
402
|
+
const d = o.shadowRoot?.querySelector('schmancy-date-range-dialog')
|
|
403
|
+
if (d) return d
|
|
404
|
+
}
|
|
405
|
+
throw new Error('dialog not mounted yet')
|
|
406
|
+
},
|
|
407
|
+
{ timeout: 2000 },
|
|
408
|
+
)
|
|
409
|
+
|
|
410
|
+
// Dispatch the calendar `change` event on the schmancy-calendar element inside
|
|
411
|
+
// the dialog's shadow root so it routes through handleCalendarChange, which is
|
|
412
|
+
// responsible for converting YYYY-MM-DD → YYYY-MM-DDTHH:mm when type="datetime-local".
|
|
413
|
+
const calendar = dialog.shadowRoot?.querySelector('schmancy-calendar')
|
|
414
|
+
expect(calendar, 'schmancy-calendar must be in the dialog shadow root').not.toBeNull()
|
|
415
|
+
|
|
416
|
+
const changeReceived: CustomEvent[] = []
|
|
417
|
+
el.addEventListener('change', (e) => changeReceived.push(e as CustomEvent))
|
|
418
|
+
|
|
419
|
+
calendar!.dispatchEvent(
|
|
420
|
+
new CustomEvent('change', {
|
|
421
|
+
detail: { value: null, start: '2026-06-10', end: '2026-06-20' },
|
|
422
|
+
bubbles: true,
|
|
423
|
+
composed: true,
|
|
424
|
+
}),
|
|
425
|
+
)
|
|
426
|
+
await el.updateComplete
|
|
427
|
+
|
|
428
|
+
expect(changeReceived.length, 'change must fire after calendar pick').toBeGreaterThan(0)
|
|
429
|
+
const detail = changeReceived[changeReceived.length - 1].detail as {
|
|
430
|
+
start: string | null
|
|
431
|
+
end: string | null
|
|
432
|
+
preset: string | null
|
|
433
|
+
}
|
|
434
|
+
expect(detail.start).toBe('2026-06-10T00:00')
|
|
435
|
+
expect(detail.end).toBe('2026-06-20T23:59')
|
|
436
|
+
expect(detail.preset).toBeNull()
|
|
437
|
+
})
|
|
438
|
+
|
|
439
|
+
// Typed path edits time without moving the date.
|
|
440
|
+
it('typed datetime-local input replaces time component without moving the date', async () => {
|
|
441
|
+
const host = await mount('<schmancy-date-range name="dtw" type="datetime-local"></schmancy-date-range>')
|
|
442
|
+
const el = dr(host)
|
|
443
|
+
el.start = '2026-06-10T00:00'
|
|
444
|
+
el.end = '2026-06-20T23:59'
|
|
445
|
+
await el.updateComplete
|
|
446
|
+
|
|
447
|
+
// Open the picker.
|
|
448
|
+
const btn = el.shadowRoot!.querySelector('schmancy-button') as HTMLElement
|
|
449
|
+
document.dispatchEvent(new MouseEvent('pointerdown', { bubbles: true, composed: true, clientX: 10, clientY: 10 }))
|
|
450
|
+
btn.click()
|
|
451
|
+
await el.updateComplete
|
|
452
|
+
await nextUpdate()
|
|
453
|
+
|
|
454
|
+
const dialog = await vi.waitFor(
|
|
455
|
+
() => {
|
|
456
|
+
for (const o of document.querySelectorAll('schmancy-overlay')) {
|
|
457
|
+
const d = o.shadowRoot?.querySelector('schmancy-date-range-dialog')
|
|
458
|
+
if (d) return d
|
|
459
|
+
}
|
|
460
|
+
throw new Error('dialog not mounted yet')
|
|
461
|
+
},
|
|
462
|
+
{ timeout: 2000 },
|
|
463
|
+
)
|
|
464
|
+
|
|
465
|
+
// Simulate the typed From input changing the time (same date, different time).
|
|
466
|
+
// handleFromChange dispatches `calendar-change` directly with the full datetime
|
|
467
|
+
// value from the input, preserving the date part and replacing the time.
|
|
468
|
+
// We dispatch `calendar-change` at the dialog bridge seam (same approach used
|
|
469
|
+
// in the existing `input event` tests) to verify the contract end-to-end.
|
|
470
|
+
const changeReceived: CustomEvent[] = []
|
|
471
|
+
el.addEventListener('change', (e) => changeReceived.push(e as CustomEvent))
|
|
472
|
+
|
|
473
|
+
dialog.dispatchEvent(
|
|
474
|
+
new CustomEvent('calendar-change', {
|
|
475
|
+
// The typed input produces a full YYYY-MM-DDTHH:mm value; the dialog
|
|
476
|
+
// passes this through unchanged (no T-injection since it already has T).
|
|
477
|
+
detail: { start: '2026-06-10T09:30', end: '2026-06-20T23:59' },
|
|
478
|
+
bubbles: true,
|
|
479
|
+
composed: true,
|
|
480
|
+
}),
|
|
481
|
+
)
|
|
482
|
+
await el.updateComplete
|
|
483
|
+
|
|
484
|
+
expect(changeReceived.length).toBeGreaterThan(0)
|
|
485
|
+
const detail = changeReceived[changeReceived.length - 1].detail as {
|
|
486
|
+
start: string | null
|
|
487
|
+
end: string | null
|
|
488
|
+
}
|
|
489
|
+
// Date part preserved; time replaced.
|
|
490
|
+
expect(detail.start).toBe('2026-06-10T09:30')
|
|
491
|
+
expect(detail.end).toBe('2026-06-20T23:59')
|
|
492
|
+
})
|
|
493
|
+
|
|
494
|
+
// FormData carries YYYY-MM-DDTHH:mm ISO entries.
|
|
495
|
+
it('FormData ${name}.start and ${name}.end carry datetime ISO strings', async () => {
|
|
496
|
+
const host = await mount(
|
|
497
|
+
'<form><schmancy-date-range name="dtw" type="datetime-local"></schmancy-date-range></form>',
|
|
498
|
+
)
|
|
499
|
+
const form = host.querySelector('form') as HTMLFormElement
|
|
500
|
+
const el = dr(host)
|
|
501
|
+
el.start = '2026-06-10T09:30'
|
|
502
|
+
el.end = '2026-06-20T18:00'
|
|
503
|
+
await el.updateComplete
|
|
504
|
+
const fd = new FormData(form)
|
|
505
|
+
expect(fd.get('dtw.start')).toBe('2026-06-10T09:30')
|
|
506
|
+
expect(fd.get('dtw.end')).toBe('2026-06-20T18:00')
|
|
507
|
+
})
|
|
508
|
+
|
|
509
|
+
// Default presets are rebuilt with datetime format when type changes.
|
|
510
|
+
it('default presets use YYYY-MM-DDTHH:mm format when type="datetime-local"', async () => {
|
|
511
|
+
const host = await mount('<schmancy-date-range name="dtw"></schmancy-date-range>')
|
|
512
|
+
const el = dr(host)
|
|
513
|
+
// Initially type=date; presets are YYYY-MM-DD.
|
|
514
|
+
expect(el.presets[0].start).toMatch(/^\d{4}-\d{2}-\d{2}$/)
|
|
515
|
+
|
|
516
|
+
// Switch to datetime-local; presets should rebuild.
|
|
517
|
+
el.type = 'datetime-local'
|
|
518
|
+
await el.updateComplete
|
|
519
|
+
|
|
520
|
+
expect(el.presets[0].start).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/)
|
|
521
|
+
expect(el.presets[0].end).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/)
|
|
522
|
+
})
|
|
523
|
+
|
|
524
|
+
// usingDefaultPresets race: setting type + presets in the same willUpdate cycle
|
|
525
|
+
// must leave the consumer's presets intact (not overwritten by rebuilt defaults).
|
|
526
|
+
it('consumer presets survive when type and presets are set together', async () => {
|
|
527
|
+
const host = await mount('<schmancy-date-range name="dtw"></schmancy-date-range>')
|
|
528
|
+
const el = dr(host)
|
|
529
|
+
await el.updateComplete
|
|
530
|
+
|
|
531
|
+
const customPresets = [
|
|
532
|
+
{ id: 'q1', label: 'Q1 2026', start: '2026-01-01', end: '2026-03-31' },
|
|
533
|
+
{ id: 'q2', label: 'Q2 2026', start: '2026-04-01', end: '2026-06-30' },
|
|
534
|
+
]
|
|
535
|
+
|
|
536
|
+
// Set both type and presets in the same microtask so they arrive in one willUpdate.
|
|
537
|
+
el.type = 'datetime-local'
|
|
538
|
+
el.presets = customPresets
|
|
539
|
+
await el.updateComplete
|
|
540
|
+
|
|
541
|
+
// Consumer's presets must survive — not replaced by datetime-formatted defaults.
|
|
542
|
+
expect(el.presets).toHaveLength(2)
|
|
543
|
+
expect(el.presets[0].id).toBe('q1')
|
|
544
|
+
expect(el.presets[0].start).toBe('2026-01-01')
|
|
545
|
+
expect(el.presets[1].id).toBe('q2')
|
|
546
|
+
})
|
|
547
|
+
|
|
548
|
+
// Calendar pick in datetime mode — no double T insertion if already includes T.
|
|
549
|
+
it('dialog passes through already-formatted datetime values unchanged', async () => {
|
|
550
|
+
const host = await mount('<schmancy-date-range name="dtw" type="datetime-local"></schmancy-date-range>')
|
|
551
|
+
const el = dr(host)
|
|
552
|
+
el.start = '2026-06-10T00:00'
|
|
553
|
+
el.end = '2026-06-20T23:59'
|
|
554
|
+
await el.updateComplete
|
|
555
|
+
|
|
556
|
+
const btn = el.shadowRoot!.querySelector('schmancy-button') as HTMLElement
|
|
557
|
+
document.dispatchEvent(new MouseEvent('pointerdown', { bubbles: true, composed: true, clientX: 10, clientY: 10 }))
|
|
558
|
+
btn.click()
|
|
559
|
+
await el.updateComplete
|
|
560
|
+
await nextUpdate()
|
|
561
|
+
|
|
562
|
+
const dialog = await vi.waitFor(
|
|
563
|
+
() => {
|
|
564
|
+
for (const o of document.querySelectorAll('schmancy-overlay')) {
|
|
565
|
+
const d = o.shadowRoot?.querySelector('schmancy-date-range-dialog')
|
|
566
|
+
if (d) return d
|
|
567
|
+
}
|
|
568
|
+
throw new Error('dialog not mounted yet')
|
|
569
|
+
},
|
|
570
|
+
{ timeout: 2000 },
|
|
571
|
+
)
|
|
572
|
+
|
|
573
|
+
const calendar = dialog.shadowRoot?.querySelector('schmancy-calendar')
|
|
574
|
+
expect(calendar, 'schmancy-calendar must be in the dialog shadow root').not.toBeNull()
|
|
575
|
+
|
|
576
|
+
const changeReceived: CustomEvent[] = []
|
|
577
|
+
el.addEventListener('change', (e) => changeReceived.push(e as CustomEvent))
|
|
578
|
+
|
|
579
|
+
// Dispatch calendar change with a value that already contains T — must NOT
|
|
580
|
+
// become 2026-06-10T00:00T00:00. The dialog's handleCalendarChange guards with
|
|
581
|
+
// `!start.includes('T')` so already-formatted values pass through unchanged.
|
|
582
|
+
calendar!.dispatchEvent(
|
|
583
|
+
new CustomEvent('change', {
|
|
584
|
+
detail: { value: null, start: '2026-06-10T00:00', end: '2026-06-20T23:59' },
|
|
585
|
+
bubbles: true,
|
|
586
|
+
composed: true,
|
|
587
|
+
}),
|
|
588
|
+
)
|
|
589
|
+
await el.updateComplete
|
|
590
|
+
|
|
591
|
+
expect(changeReceived.length).toBeGreaterThan(0)
|
|
592
|
+
const detail = changeReceived[changeReceived.length - 1].detail as {
|
|
593
|
+
start: string | null
|
|
594
|
+
end: string | null
|
|
595
|
+
}
|
|
596
|
+
expect(detail.start).toBe('2026-06-10T00:00')
|
|
597
|
+
expect(detail.end).toBe('2026-06-20T23:59')
|
|
598
|
+
})
|
|
145
599
|
})
|
|
146
600
|
})
|