@mhmo91/schmancy 0.10.15 → 0.10.17
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 +2554 -3086
- package/dist/active-host-BP0zy_Y9.js +63 -0
- package/dist/{active-host-CvNYoprt.js.map → active-host-BP0zy_Y9.js.map} +1 -1
- package/dist/active-host-jH3iloCR.cjs +1 -0
- package/dist/{active-host-CcIa2tmW.cjs.map → active-host-jH3iloCR.cjs.map} +1 -1
- package/dist/agent/flow-CvG1fLW5.js.map +1 -1
- package/dist/agent/schmancy.agent.js +5694 -5500
- package/dist/agent/schmancy.agent.js.map +1 -1
- package/dist/agent/schmancy.manifest.json +971 -1189
- package/dist/agent/vendor-material-color-DcL7ZPxx.js.map +1 -1
- package/dist/{animation-CO_Csq84.cjs.map → animation-CCOIW4wJ.cjs.map} +1 -1
- package/dist/{animation-BK-8BwY8.js.map → animation-DCznELuT.js.map} +1 -1
- package/dist/{area-C_kgZZhN.js → area-ChxsDTu_.js} +2 -2
- package/dist/{area-C_kgZZhN.js.map → area-ChxsDTu_.js.map} +1 -1
- package/dist/{area-DFPtKzWy.cjs → area-Qt6yUnuA.cjs} +3 -3
- package/dist/{area-DFPtKzWy.cjs.map → area-Qt6yUnuA.cjs.map} +1 -1
- package/dist/area.cjs +1 -1
- package/dist/area.js +2 -2
- package/dist/{audio-CluX8Qpq.cjs → audio-D-TZzpXF.cjs} +1 -1
- package/dist/{audio-CluX8Qpq.cjs.map → audio-D-TZzpXF.cjs.map} +1 -1
- package/dist/{audio-DcXphulJ.js → audio-DS43uoRA.js} +1 -1
- package/dist/{audio-DcXphulJ.js.map → audio-DS43uoRA.js.map} +1 -1
- package/dist/audio.cjs +1 -1
- package/dist/audio.js +2 -2
- package/dist/{autocomplete-DWSuwSRS.js → autocomplete-CXvUjMD-.js} +46 -71
- package/dist/autocomplete-CXvUjMD-.js.map +1 -0
- package/dist/autocomplete-Ck2zbdF9.cjs +115 -0
- package/dist/autocomplete-Ck2zbdF9.cjs.map +1 -0
- package/dist/autocomplete.cjs +1 -1
- package/dist/autocomplete.js +1 -1
- package/dist/avatar.cjs +2 -2
- package/dist/avatar.cjs.map +1 -1
- package/dist/avatar.js +3 -3
- package/dist/avatar.js.map +1 -1
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/{boat-CZma2ojF.js → boat-Bj0wVcZi.js} +5 -5
- package/dist/{boat-CZma2ojF.js.map → boat-Bj0wVcZi.js.map} +1 -1
- package/dist/{boat-Dy6cc3hB.cjs → boat-DpFkILFF.cjs} +2 -2
- package/dist/{boat-Dy6cc3hB.cjs.map → boat-DpFkILFF.cjs.map} +1 -1
- package/dist/boat.cjs +1 -1
- package/dist/boat.js +1 -1
- package/dist/breadcrumb.cjs +3 -3
- package/dist/breadcrumb.cjs.map +1 -1
- package/dist/breadcrumb.js +2 -2
- package/dist/breadcrumb.js.map +1 -1
- package/dist/{busy-DCsqryvq.cjs → busy-CtcnclA3.cjs} +3 -3
- package/dist/{busy-DCsqryvq.cjs.map → busy-CtcnclA3.cjs.map} +1 -1
- package/dist/{busy-DeV2ByMw.js → busy-CyZSBnZP.js} +2 -2
- package/dist/{busy-DeV2ByMw.js.map → busy-CyZSBnZP.js.map} +1 -1
- package/dist/busy.cjs +1 -1
- package/dist/busy.js +1 -1
- package/dist/button.cjs +4 -4
- package/dist/button.cjs.map +1 -1
- package/dist/button.js +19 -4
- package/dist/button.js.map +1 -1
- package/dist/{card--GgSX4X5.cjs → card-Cl6jp1yX.cjs} +5 -5
- package/dist/{card--GgSX4X5.cjs.map → card-Cl6jp1yX.cjs.map} +1 -1
- package/dist/{card-BTTsHzJJ.js → card-nYZCKmOO.js} +3 -3
- package/dist/{card-BTTsHzJJ.js.map → card-nYZCKmOO.js.map} +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/{checkbox-NNReP9s_.cjs → checkbox-BeNo0ZGt.cjs} +4 -4
- package/dist/{checkbox-Cj5j-ppk.js.map → checkbox-BeNo0ZGt.cjs.map} +1 -1
- package/dist/{checkbox-Cj5j-ppk.js → checkbox-DiUrZiyc.js} +17 -30
- package/dist/checkbox-DiUrZiyc.js.map +1 -0
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-CP-CbfoZ.js → chips-CfPFXv7Z.js} +5 -5
- package/dist/{chips-CP-CbfoZ.js.map → chips-CfPFXv7Z.js.map} +1 -1
- package/dist/{chips-iporOXxK.cjs → chips-DK6m-VCM.cjs} +5 -5
- package/dist/{chips-iporOXxK.cjs.map → chips-DK6m-VCM.cjs.map} +1 -1
- package/dist/chips.cjs +1 -1
- package/dist/chips.js +2 -2
- package/dist/connectivity.cjs +2 -2
- package/dist/connectivity.cjs.map +1 -1
- package/dist/connectivity.js +3 -3
- package/dist/connectivity.js.map +1 -1
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +1 -1
- package/dist/{context-DJTJnSK4.js.map → context-6oXCZmZN.js.map} +1 -1
- package/dist/{context-BpCETidA.cjs.map → context-CRZeiCqq.cjs.map} +1 -1
- package/dist/{cursor-glow-Bulq-38P.cjs → cursor-glow-C8LgCxpI.cjs} +1 -1
- package/dist/{cursor-glow-Bulq-38P.cjs.map → cursor-glow-C8LgCxpI.cjs.map} +1 -1
- package/dist/{cursor-glow-Ah7VXSj7.js → cursor-glow-Cs2XLDB9.js} +1 -1
- package/dist/{cursor-glow-Ah7VXSj7.js.map → cursor-glow-Cs2XLDB9.js.map} +1 -1
- package/dist/date-range-DA6anfcF.cjs +131 -0
- package/dist/date-range-DA6anfcF.cjs.map +1 -0
- package/dist/{date-range-CgNujP8r.js → date-range-DjlF2u7o.js} +124 -89
- package/dist/date-range-DjlF2u7o.js.map +1 -0
- package/dist/date-range-inline-BfYK795W.cjs +43 -0
- package/dist/{date-range-inline-D4IjOOO0.cjs.map → date-range-inline-BfYK795W.cjs.map} +1 -1
- package/dist/{date-range-inline-C2PXX_GY.js → date-range-inline-n7y_H6PJ.js} +2 -2
- package/dist/{date-range-inline-C2PXX_GY.js.map → date-range-inline-n7y_H6PJ.js.map} +1 -1
- package/dist/date-range-inline.cjs +1 -1
- package/dist/date-range-inline.js +1 -1
- package/dist/date-range.cjs +1 -1
- package/dist/date-range.js +1 -1
- package/dist/delay.cjs +2 -2
- package/dist/delay.cjs.map +1 -1
- package/dist/delay.js +3 -3
- package/dist/delay.js.map +1 -1
- package/dist/{details-DT2b3xOn.cjs → details-BdAVsLl-.cjs} +2 -2
- package/dist/{details-DT2b3xOn.cjs.map → details-BdAVsLl-.cjs.map} +1 -1
- package/dist/{details-VjaNwtfd.js → details-CS_ToAOj.js} +6 -6
- package/dist/{details-VjaNwtfd.js.map → details-CS_ToAOj.js.map} +1 -1
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/directives.cjs +1 -1
- package/dist/directives.cjs.map +1 -1
- package/dist/directives.js +5 -5
- package/dist/directives.js.map +1 -1
- package/dist/discovery.js.map +1 -1
- package/dist/{divider-BMO8pzEO.js → divider-COLK0RbT.js} +2 -2
- package/dist/{divider-BMO8pzEO.js.map → divider-COLK0RbT.js.map} +1 -1
- package/dist/{divider-BW33TZ-X.cjs → divider-CvWAnvdO.cjs} +2 -2
- package/dist/{divider-BW33TZ-X.cjs.map → divider-CvWAnvdO.cjs.map} +1 -1
- package/dist/divider.cjs +1 -1
- package/dist/divider.js +1 -1
- package/dist/dropdown.cjs +3 -3
- package/dist/dropdown.cjs.map +1 -1
- package/dist/dropdown.js +2 -2
- package/dist/dropdown.js.map +1 -1
- package/dist/{expand-DbELKKOt.js → expand-D9LzmpoV.js} +5 -5
- package/dist/{expand-DbELKKOt.js.map → expand-D9LzmpoV.js.map} +1 -1
- package/dist/{expand-_f5EUKWB.cjs → expand-r2sATPUJ.cjs} +3 -3
- package/dist/{expand-_f5EUKWB.cjs.map → expand-r2sATPUJ.cjs.map} +1 -1
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/float-2nHYuBx-.cjs +1 -0
- package/dist/{float-CKmd-0-t.cjs.map → float-2nHYuBx-.cjs.map} +1 -1
- package/dist/{float-B6RBb2dN.js → float-BWy39CXr.js} +2 -2
- package/dist/{float-B6RBb2dN.js.map → float-BWy39CXr.js.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/form-D1iJOLVb.js +267 -0
- package/dist/form-D1iJOLVb.js.map +1 -0
- package/dist/form-D9K1GhlP.cjs +42 -0
- package/dist/form-D9K1GhlP.cjs.map +1 -0
- package/dist/form.cjs +1 -1
- package/dist/form.js +9 -2
- package/dist/handover/agent-runtime-followups.md +1 -1
- package/dist/handover/agent-runtime-v1.md +3 -3
- package/dist/{hashContent-Bobsobip.cjs.map → hashContent-Ck6laKlk.cjs.map} +1 -1
- package/dist/{hashContent-BU6jl5ih.js.map → hashContent-dJrI-9sc.js.map} +1 -1
- package/dist/{icons-r-S17M8U.cjs → icons-BXp4vbnW.cjs} +2 -2
- package/dist/{icons-r-S17M8U.cjs.map → icons-BXp4vbnW.cjs.map} +1 -1
- package/dist/{icons-CoDo95Cu.js → icons-COrlmBPB.js} +3 -3
- package/dist/{icons-CoDo95Cu.js.map → icons-COrlmBPB.js.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-P9c_qg1-.cjs → iframe-BwXj6mLp.cjs} +2 -2
- package/dist/{iframe-P9c_qg1-.cjs.map → iframe-BwXj6mLp.cjs.map} +1 -1
- package/dist/{iframe-k4oI-TIj.js → iframe-CPNsIy7k.js} +2 -2
- package/dist/{iframe-k4oI-TIj.js.map → iframe-CPNsIy7k.js.map} +1 -1
- package/dist/iframe.cjs +1 -1
- package/dist/iframe.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +60 -60
- package/dist/input-BGrF2qVq.cjs +52 -0
- package/dist/input-BGrF2qVq.cjs.map +1 -0
- package/dist/{input-D95GjINh.js → input-C1SnMNuQ.js} +103 -104
- package/dist/input-C1SnMNuQ.js.map +1 -0
- package/dist/{input-chip-DpC_XEKN.js → input-chip-CtQ0pH5b.js} +2 -2
- package/dist/{input-chip-DpC_XEKN.js.map → input-chip-CtQ0pH5b.js.map} +1 -1
- package/dist/{input-chip-D0ZXqTt5.cjs → input-chip-DZktYohr.cjs} +2 -2
- package/dist/{input-chip-D0ZXqTt5.cjs.map → input-chip-DZktYohr.cjs.map} +1 -1
- package/dist/input.cjs +1 -1
- package/dist/input.js +1 -1
- package/dist/json.cjs +2 -2
- package/dist/json.cjs.map +1 -1
- package/dist/json.js +3 -3
- package/dist/json.js.map +1 -1
- package/dist/kbd.cjs +2 -2
- package/dist/kbd.cjs.map +1 -1
- package/dist/kbd.js +2 -2
- package/dist/kbd.js.map +1 -1
- package/dist/{layout-CXPNsUIo.js → layout-BH28sKGc.js} +1 -1
- package/dist/{layout-CXPNsUIo.js.map → layout-BH28sKGc.js.map} +1 -1
- package/dist/{layout-Zhe7wSZ_.cjs → layout-Delq-QvR.cjs} +1 -1
- package/dist/{layout-Zhe7wSZ_.cjs.map → layout-Delq-QvR.cjs.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +1 -1
- package/dist/{lazy-Dq9mRRjT.cjs.map → lazy-CayEFyC3.cjs.map} +1 -1
- package/dist/{lazy-B0ia54tT.js.map → lazy-D-bO2r4m.js.map} +1 -1
- package/dist/{lightbox-CovQtmyn.js → lightbox-CLwpaiai.js} +9 -9
- package/dist/{lightbox-CovQtmyn.js.map → lightbox-CLwpaiai.js.map} +1 -1
- package/dist/{lightbox-C-yHeoK0.cjs → lightbox-Ck6BpN5u.cjs} +3 -3
- package/dist/{lightbox-C-yHeoK0.cjs.map → lightbox-Ck6BpN5u.cjs.map} +1 -1
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/{list-C1pR9vhu.js → list-Bmce1Rb8.js} +2 -2
- package/dist/{list-C1pR9vhu.js.map → list-Bmce1Rb8.js.map} +1 -1
- package/dist/{list-CAijuky4.cjs → list-EmRwSpTU.cjs} +3 -3
- package/dist/{list-CAijuky4.cjs.map → list-EmRwSpTU.cjs.map} +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/{magnetic-BJgB1dVi.cjs → magnetic-Bgh7aHHI.cjs} +1 -1
- package/dist/{magnetic-BJgB1dVi.cjs.map → magnetic-Bgh7aHHI.cjs.map} +1 -1
- package/dist/{magnetic-YwCNvtbB.js → magnetic-DxvoEz8_.js} +2 -2
- package/dist/{magnetic-YwCNvtbB.js.map → magnetic-DxvoEz8_.js.map} +1 -1
- package/dist/{menu-B59vZv9n.js → menu-BA_B7QOG.js} +3 -3
- package/dist/{menu-B59vZv9n.js.map → menu-BA_B7QOG.js.map} +1 -1
- package/dist/{menu-BaHO3Cip.cjs → menu-BTU3wGP6.cjs} +3 -3
- package/dist/{menu-BaHO3Cip.cjs.map → menu-BTU3wGP6.cjs.map} +1 -1
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/mixins-BOOu6q2n.cjs +298 -0
- package/dist/mixins-BOOu6q2n.cjs.map +1 -0
- package/dist/mixins-BWb9_e1s.js +680 -0
- package/dist/mixins-BWb9_e1s.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 +3 -3
- package/dist/navigation-rail.cjs.map +1 -1
- package/dist/navigation-rail.js +2 -2
- package/dist/navigation-rail.js.map +1 -1
- package/dist/notification-CliGbcfU.cjs +23 -0
- package/dist/{notification-BC9nG8Sr.cjs.map → notification-CliGbcfU.cjs.map} +1 -1
- package/dist/{notification-BeLoVa47.js → notification-R2_Mf1HR.js} +4 -4
- package/dist/{notification-BeLoVa47.js.map → notification-R2_Mf1HR.js.map} +1 -1
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/{option-UvlSAcC4.js → option-DU1X4SDu.js} +2 -2
- package/dist/{option-UvlSAcC4.js.map → option-DU1X4SDu.js.map} +1 -1
- package/dist/{option-BWF4GBp-.cjs → option-Db98Ndzv.cjs} +2 -2
- package/dist/{option-BWF4GBp-.cjs.map → option-Db98Ndzv.cjs.map} +1 -1
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/{overlay-stack-DCDS17uj.js.map → overlay-stack-BR4iYivO.js.map} +1 -1
- package/dist/{overlay-stack-DPIe_aYv.cjs.map → overlay-stack-Dk0xETTy.cjs.map} +1 -1
- package/dist/overlay.cjs +2 -2
- package/dist/overlay.cjs.map +1 -1
- package/dist/{overlay.confirm-body-URtE1gI3.cjs → overlay.confirm-body-BkhNvr0c.cjs} +2 -2
- package/dist/{overlay.confirm-body-URtE1gI3.cjs.map → overlay.confirm-body-BkhNvr0c.cjs.map} +1 -1
- package/dist/{overlay.confirm-body-9W0B5QGv.js → overlay.confirm-body-uFp-0Zfh.js} +2 -2
- package/dist/{overlay.confirm-body-9W0B5QGv.js.map → overlay.confirm-body-uFp-0Zfh.js.map} +1 -1
- package/dist/overlay.js +8 -8
- package/dist/overlay.js.map +1 -1
- package/dist/{overlay.service-DnZTcKyJ.cjs → overlay.service-1YWfUD2S.cjs} +1 -1
- package/dist/{overlay.service-DnZTcKyJ.cjs.map → overlay.service-1YWfUD2S.cjs.map} +1 -1
- package/dist/{overlay.service-CVqs2Gu1.js → overlay.service-BcF12kGb.js} +2 -2
- package/dist/{overlay.service-CVqs2Gu1.js.map → overlay.service-BcF12kGb.js.map} +1 -1
- package/dist/page.cjs +2 -2
- package/dist/page.cjs.map +1 -1
- package/dist/page.js +5 -5
- package/dist/page.js.map +1 -1
- package/dist/{progress-C29Uw-WJ.js → progress-C9Y2D5cm.js} +2 -2
- package/dist/{progress-C29Uw-WJ.js.map → progress-C9Y2D5cm.js.map} +1 -1
- package/dist/{progress-CwzwY8Oe.cjs → progress-DiVTGAXa.cjs} +2 -2
- package/dist/{progress-CwzwY8Oe.cjs.map → progress-DiVTGAXa.cjs.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/{radio-group-CW8airhZ.js → radio-group-CAzjBI2n.js} +4 -4
- package/dist/radio-group-CAzjBI2n.js.map +1 -0
- package/dist/radio-group-DIRJyYv6.cjs +40 -0
- package/dist/radio-group-DIRJyYv6.cjs.map +1 -0
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.js +1 -1
- package/dist/range.cjs +6 -4
- package/dist/range.cjs.map +1 -1
- package/dist/range.js +19 -15
- package/dist/range.js.map +1 -1
- package/dist/{reduced-motion-D-L12p7G.js.map → reduced-motion-D7LqTUMn.js.map} +1 -1
- package/dist/{reduced-motion-Ds-HjMzn.cjs.map → reduced-motion-Dzfp_w5x.cjs.map} +1 -1
- package/dist/{rxjs-utils-DCUHg_Ml.cjs.map → rxjs-utils-BKB2UM_j.cjs.map} +1 -1
- package/dist/{rxjs-utils-CVeJQ9KG.js.map → rxjs-utils-Dv9T9IpA.js.map} +1 -1
- package/dist/rxjs-utils.cjs +1 -1
- package/dist/rxjs-utils.js +1 -1
- package/dist/{scroll-BotoGcMU.js → scroll-BFHUtZOa.js} +2 -2
- package/dist/{scroll-BotoGcMU.js.map → scroll-BFHUtZOa.js.map} +1 -1
- package/dist/{scroll-CmhmUebp.cjs → scroll-nIZyoEMt.cjs} +2 -2
- package/dist/{scroll-CmhmUebp.cjs.map → scroll-nIZyoEMt.cjs.map} +1 -1
- package/dist/{search-BLCRsxIC.cjs.map → search-DPKoC-dT.cjs.map} +1 -1
- package/dist/{search-BTz7-Rev.js.map → search-MvIBA93K.js.map} +1 -1
- package/dist/{select-Dbn-CImU.js → select-7WqaUWBU.js} +52 -73
- package/dist/select-7WqaUWBU.js.map +1 -0
- package/dist/select-DTuf6p6T.cjs +56 -0
- package/dist/select-DTuf6p6T.cjs.map +1 -0
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/skeleton.cjs +2 -2
- package/dist/skeleton.cjs.map +1 -1
- package/dist/skeleton.js +2 -2
- package/dist/skeleton.js.map +1 -1
- package/dist/skills/SKILL.md +3 -0
- package/dist/skills/autocomplete.md +16 -3
- package/dist/skills/button.md +19 -0
- package/dist/skills/checkbox.md +19 -0
- package/dist/skills/date-range.md +19 -0
- package/dist/skills/form-ux-rules.md +55 -0
- package/dist/skills/form.md +121 -25
- package/dist/skills/input.md +19 -4
- package/dist/skills/range.md +15 -1
- package/dist/skills/schmancy/SKILL.md +3 -0
- package/dist/skills/schmancy/autocomplete.md +16 -3
- package/dist/skills/schmancy/button.md +19 -0
- package/dist/skills/schmancy/checkbox.md +19 -0
- package/dist/skills/schmancy/date-range.md +19 -0
- package/dist/skills/schmancy/form-ux-rules.md +55 -0
- package/dist/skills/schmancy/form.md +121 -25
- package/dist/skills/schmancy/input.md +19 -4
- package/dist/skills/schmancy/range.md +15 -1
- package/dist/skills/schmancy/select.md +13 -1
- package/dist/skills/schmancy/switch.md +21 -2
- package/dist/skills/schmancy/textarea.md +13 -0
- package/dist/skills/select.md +13 -1
- package/dist/skills/switch.md +21 -2
- package/dist/skills/textarea.md +13 -0
- package/dist/slider.cjs +3 -3
- package/dist/slider.cjs.map +1 -1
- package/dist/slider.js +2 -2
- package/dist/slider.js.map +1 -1
- package/dist/{sound.service-kKfsN0m-.js → sound.service-BIN2W7Rv.js} +1 -1
- package/dist/{sound.service-kKfsN0m-.js.map → sound.service-BIN2W7Rv.js.map} +1 -1
- package/dist/{sound.service-BGs6m0Cm.cjs → sound.service-DyY78ukR.cjs} +1 -1
- package/dist/{sound.service-BGs6m0Cm.cjs.map → sound.service-DyY78ukR.cjs.map} +1 -1
- package/dist/{splash-screen-DtkjCJYo.js → splash-screen-BcjjJSlK.js} +2 -2
- package/dist/{splash-screen-DtkjCJYo.js.map → splash-screen-BcjjJSlK.js.map} +1 -1
- package/dist/{splash-screen-DlQUv-kV.cjs → splash-screen-Kr1sPtME.cjs} +2 -2
- package/dist/{splash-screen-DlQUv-kV.cjs.map → splash-screen-Kr1sPtME.cjs.map} +1 -1
- package/dist/splash-screen.cjs +1 -1
- package/dist/splash-screen.js +1 -1
- package/dist/{src-DEUjlTsX.cjs → src-BbMJeLk9.cjs} +11 -11
- package/dist/{src-DEUjlTsX.cjs.map → src-BbMJeLk9.cjs.map} +1 -1
- package/dist/{src-D6e0adHi.js → src-DCu_mEk4.js} +40 -40
- package/dist/{src-D6e0adHi.js.map → src-DCu_mEk4.js.map} +1 -1
- package/dist/state-avic94Ft.cjs +1 -0
- package/dist/{state-DNdCPITt.cjs.map → state-avic94Ft.cjs.map} +1 -1
- package/dist/{state-BusMG6sM.js → state-nm8yzMPp.js} +1 -2
- package/dist/{state-BusMG6sM.js.map → state-nm8yzMPp.js.map} +1 -1
- package/dist/state.cjs +1 -1
- package/dist/state.js +2 -2
- package/dist/steps.cjs +3 -3
- package/dist/steps.cjs.map +1 -1
- package/dist/steps.js +2 -2
- package/dist/steps.js.map +1 -1
- package/dist/{surface-A82O1kgu.js → surface-BtMMHKol.js} +2 -2
- package/dist/{surface-A82O1kgu.js.map → surface-BtMMHKol.js.map} +1 -1
- package/dist/surface-CgXeKdGL.cjs +7 -0
- package/dist/{surface-BpppoNXN.cjs.map → surface-CgXeKdGL.cjs.map} +1 -1
- package/dist/surface.cjs +1 -1
- package/dist/surface.js +1 -1
- package/dist/switch.cjs +3 -3
- package/dist/switch.cjs.map +1 -1
- package/dist/switch.js +27 -43
- package/dist/switch.js.map +1 -1
- package/dist/table.cjs +3 -3
- package/dist/table.cjs.map +1 -1
- package/dist/table.js +2 -2
- package/dist/table.js.map +1 -1
- package/dist/{tabs-cVHHd1dY.js → tabs-81ADWQqa.js} +2 -2
- package/dist/{tabs-cVHHd1dY.js.map → tabs-81ADWQqa.js.map} +1 -1
- package/dist/{tabs-TO3UiBsm.cjs → tabs-DnG3K0bu.cjs} +2 -2
- package/dist/{tabs-TO3UiBsm.cjs.map → tabs-DnG3K0bu.cjs.map} +1 -1
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.js +1 -1
- package/dist/teleport.cjs +1 -1
- package/dist/teleport.js +1 -1
- package/dist/textarea-3mWewuAf.js +186 -0
- package/dist/textarea-3mWewuAf.js.map +1 -0
- package/dist/textarea-BenjiTXB.cjs +43 -0
- package/dist/textarea-BenjiTXB.cjs.map +1 -0
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-CT408FqH.js → theme-CFPJW933.js} +9 -9
- package/dist/{theme-CT408FqH.js.map → theme-CFPJW933.js.map} +1 -1
- package/dist/theme-DNymrucy.cjs +181 -0
- package/dist/{theme-CpuF3D3q.cjs.map → theme-DNymrucy.cjs.map} +1 -1
- package/dist/{theme-button-pTb5-Wxx.js → theme-button-DC_shZ_7.js} +2 -2
- package/dist/{theme-button-pTb5-Wxx.js.map → theme-button-DC_shZ_7.js.map} +1 -1
- package/dist/theme-button-ENKa3TPT.cjs +8 -0
- package/dist/{theme-button-B6Xf-EiH.cjs.map → theme-button-ENKa3TPT.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-B9TjbSBF.js.map → theme.interface-C2XNgsLB.js.map} +1 -1
- package/dist/{theme.interface-BujperTo.cjs.map → theme.interface-D4NeufQA.cjs.map} +1 -1
- package/dist/theme.js +4 -4
- package/dist/{theme.service-DIUo1mBP.js → theme.service-BOWIT_5k.js} +1 -1
- package/dist/{theme.service-DIUo1mBP.js.map → theme.service-BOWIT_5k.js.map} +1 -1
- package/dist/{theme.service-Cfk88qHK.cjs → theme.service-DkdH1t60.cjs} +1 -1
- package/dist/{theme.service-Cfk88qHK.cjs.map → theme.service-DkdH1t60.cjs.map} +1 -1
- package/dist/tooltip.js.map +1 -1
- package/dist/tree.cjs +2 -2
- package/dist/tree.cjs.map +1 -1
- package/dist/tree.js +2 -2
- package/dist/tree.js.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/typewriter.cjs.map +1 -1
- package/dist/typewriter.js.map +1 -1
- package/dist/typography.cjs +2 -2
- package/dist/typography.cjs.map +1 -1
- package/dist/typography.js +2 -2
- package/dist/typography.js.map +1 -1
- package/dist/{utils-kND2Z9Xg.js → utils-Cj_nRRyx.js} +2 -2
- package/dist/{utils-kND2Z9Xg.js.map → utils-Cj_nRRyx.js.map} +1 -1
- package/dist/{utils-Dt5PpmaQ.cjs → utils-D2QUu4-g.cjs} +1 -1
- package/dist/{utils-Dt5PpmaQ.cjs.map → utils-D2QUu4-g.cjs.map} +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.js +4 -4
- package/dist/visually-hidden.cjs +2 -2
- package/dist/visually-hidden.cjs.map +1 -1
- package/dist/visually-hidden.js +2 -2
- package/dist/visually-hidden.js.map +1 -1
- package/dist/{window-CuBcOxbc.js → window-BTecgE_U.js} +7 -7
- package/dist/{window-CuBcOxbc.js.map → window-BTecgE_U.js.map} +1 -1
- package/dist/{window-CSKvv4Ts.cjs → window-DGydMS0g.cjs} +2 -2
- package/dist/{window-CSKvv4Ts.cjs.map → window-DGydMS0g.cjs.map} +1 -1
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/package.json +1 -1
- package/skills/schmancy/SKILL.md +3 -0
- package/skills/schmancy/autocomplete.md +16 -3
- package/skills/schmancy/button.md +19 -0
- package/skills/schmancy/checkbox.md +19 -0
- package/skills/schmancy/date-range.md +19 -0
- package/skills/schmancy/form-ux-rules.md +55 -0
- package/skills/schmancy/form.md +121 -25
- package/skills/schmancy/input.md +19 -4
- package/skills/schmancy/range.md +15 -1
- package/skills/schmancy/select.md +13 -1
- package/skills/schmancy/switch.md +21 -2
- package/skills/schmancy/textarea.md +13 -0
- package/src/button/button.test.ts +122 -0
- package/src/button/button.ts +36 -0
- package/src/{autocomplete → form/fields/autocomplete}/autocomplete.ts +48 -75
- package/src/{checkbox → form/fields/checkbox}/checkbox.test.ts +1 -1
- package/src/form/fields/checkbox/checkbox.ts +126 -0
- package/src/form/fields/date-range/date-range.test.ts +102 -0
- package/src/{date-range → form/fields/date-range}/date-range.ts +90 -7
- package/src/form/fields/index.ts +9 -0
- package/src/form/fields/input/input.test.ts +201 -0
- package/src/{input → form/fields/input}/input.ts +153 -238
- package/src/{radio-group → form/fields/radio-group}/radio-button.ts +1 -1
- package/src/{radio-group → form/fields/radio-group}/radio-group.ts +1 -1
- package/src/form/fields/range/range.test.ts +90 -0
- package/src/{range → form/fields/range}/range.ts +34 -13
- package/src/{select → form/fields/select}/select.ts +77 -108
- package/src/{switch → form/fields/switch}/switch.test.ts +1 -1
- package/src/{switch → form/fields/switch}/switch.ts +71 -51
- package/src/form/fields/textarea/textarea.test.ts +54 -0
- package/src/{textarea → form/fields/textarea}/textarea.ts +33 -72
- package/src/form/form-state.ts +31 -0
- package/src/form/form-summary.test.ts +105 -0
- package/src/form/form-summary.ts +171 -0
- package/src/form/form.test.ts +218 -35
- package/src/form/form.ts +330 -99
- package/src/form/index.ts +3 -0
- package/src/index.ts +9 -9
- package/types/mixins/formField.mixin.d.ts +90 -0
- package/types/src/button/button.d.ts +9 -0
- package/types/src/button/button.test.d.ts +3 -0
- package/types/src/{autocomplete → form/fields/autocomplete}/autocomplete.d.ts +6 -15
- package/types/src/form/fields/checkbox/checkbox.d.ts +47 -0
- package/types/src/{date-range → form/fields/date-range}/date-range.d.ts +22 -4
- package/types/src/form/fields/date-range/date-range.test.d.ts +1 -0
- package/types/src/form/fields/index.d.ts +9 -0
- package/types/src/{input → form/fields/input}/input.d.ts +20 -45
- package/types/src/form/fields/input/input.test.d.ts +1 -0
- package/types/src/{radio-group → form/fields/radio-group}/radio-button.d.ts +1 -1
- package/types/src/{radio-group → form/fields/radio-group}/radio-group.d.ts +1 -1
- package/types/src/form/fields/range/range.d.ts +28 -0
- package/types/src/form/fields/range/range.test.d.ts +1 -0
- package/types/src/{select → form/fields/select}/select.d.ts +23 -24
- package/types/src/form/fields/switch/switch.d.ts +57 -0
- package/types/src/{textarea → form/fields/textarea}/textarea.d.ts +6 -39
- package/types/src/form/fields/textarea/textarea.test.d.ts +1 -0
- package/types/src/form/form-state.d.ts +22 -0
- package/types/src/form/form-summary.d.ts +42 -0
- package/types/src/form/form-summary.test.d.ts +4 -0
- package/types/src/form/form.d.ts +79 -34
- package/types/src/form/form.test.d.ts +2 -2
- package/types/src/form/index.d.ts +3 -0
- package/types/src/index.d.ts +9 -9
- package/dist/active-host-CcIa2tmW.cjs +0 -1
- package/dist/active-host-CvNYoprt.js +0 -57
- package/dist/autocomplete-DWSuwSRS.js.map +0 -1
- package/dist/autocomplete-iCJOia-q.cjs +0 -115
- package/dist/autocomplete-iCJOia-q.cjs.map +0 -1
- package/dist/checkbox-NNReP9s_.cjs.map +0 -1
- package/dist/date-range-CaOxwZDq.cjs +0 -131
- package/dist/date-range-CaOxwZDq.cjs.map +0 -1
- package/dist/date-range-CgNujP8r.js.map +0 -1
- package/dist/date-range-inline-D4IjOOO0.cjs +0 -43
- package/dist/decorate-23nYs4Le.js +0 -7
- package/dist/decorate-DpFmy0nm.cjs +0 -1
- package/dist/float-CKmd-0-t.cjs +0 -1
- package/dist/form-CFvwnfuJ.js +0 -68
- package/dist/form-CFvwnfuJ.js.map +0 -1
- package/dist/form-Ceijw1aA.cjs +0 -1
- package/dist/form-Ceijw1aA.cjs.map +0 -1
- package/dist/input-D95GjINh.js.map +0 -1
- package/dist/input-D9s4jDAb.cjs +0 -51
- package/dist/input-D9s4jDAb.cjs.map +0 -1
- package/dist/mixins-BV0w2yIE.js +0 -627
- package/dist/mixins-BV0w2yIE.js.map +0 -1
- package/dist/mixins-DvAYa-F7.cjs +0 -298
- package/dist/mixins-DvAYa-F7.cjs.map +0 -1
- package/dist/notification-BC9nG8Sr.cjs +0 -23
- package/dist/radio-group-ByMD6Lsj.cjs +0 -40
- package/dist/radio-group-ByMD6Lsj.cjs.map +0 -1
- package/dist/radio-group-CW8airhZ.js.map +0 -1
- package/dist/select-BdBThja4.cjs +0 -56
- package/dist/select-BdBThja4.cjs.map +0 -1
- package/dist/select-Dbn-CImU.js.map +0 -1
- package/dist/state-DNdCPITt.cjs +0 -1
- package/dist/surface-BpppoNXN.cjs +0 -7
- package/dist/textarea-B9dy-yec.js +0 -211
- package/dist/textarea-B9dy-yec.js.map +0 -1
- package/dist/textarea-DFY0Flgv.cjs +0 -39
- package/dist/textarea-DFY0Flgv.cjs.map +0 -1
- package/dist/theme-CpuF3D3q.cjs +0 -181
- package/dist/theme-button-B6Xf-EiH.cjs +0 -8
- package/src/checkbox/checkbox.ts +0 -162
- package/types/src/checkbox/checkbox.d.ts +0 -71
- package/types/src/range/range.d.ts +0 -25
- package/types/src/switch/switch.d.ts +0 -53
- /package/dist/{animation-CO_Csq84.cjs → animation-CCOIW4wJ.cjs} +0 -0
- /package/dist/{animation-BK-8BwY8.js → animation-DCznELuT.js} +0 -0
- /package/dist/{context-DJTJnSK4.js → context-6oXCZmZN.js} +0 -0
- /package/dist/{context-BpCETidA.cjs → context-CRZeiCqq.cjs} +0 -0
- /package/dist/{hashContent-Bobsobip.cjs → hashContent-Ck6laKlk.cjs} +0 -0
- /package/dist/{hashContent-BU6jl5ih.js → hashContent-dJrI-9sc.js} +0 -0
- /package/dist/{lazy-Dq9mRRjT.cjs → lazy-CayEFyC3.cjs} +0 -0
- /package/dist/{lazy-B0ia54tT.js → lazy-D-bO2r4m.js} +0 -0
- /package/dist/{overlay-stack-DCDS17uj.js → overlay-stack-BR4iYivO.js} +0 -0
- /package/dist/{overlay-stack-DPIe_aYv.cjs → overlay-stack-Dk0xETTy.cjs} +0 -0
- /package/dist/{reduced-motion-D-L12p7G.js → reduced-motion-D7LqTUMn.js} +0 -0
- /package/dist/{reduced-motion-Ds-HjMzn.cjs → reduced-motion-Dzfp_w5x.cjs} +0 -0
- /package/dist/{rxjs-utils-DCUHg_Ml.cjs → rxjs-utils-BKB2UM_j.cjs} +0 -0
- /package/dist/{rxjs-utils-CVeJQ9KG.js → rxjs-utils-Dv9T9IpA.js} +0 -0
- /package/dist/{search-BLCRsxIC.cjs → search-DPKoC-dT.cjs} +0 -0
- /package/dist/{search-BTz7-Rev.js → search-MvIBA93K.js} +0 -0
- /package/dist/{theme.interface-B9TjbSBF.js → theme.interface-C2XNgsLB.js} +0 -0
- /package/dist/{theme.interface-BujperTo.cjs → theme.interface-D4NeufQA.cjs} +0 -0
- /package/src/{autocomplete → form/fields/autocomplete}/autocomplete.scss +0 -0
- /package/src/{autocomplete → form/fields/autocomplete}/index.ts +0 -0
- /package/src/{checkbox → form/fields/checkbox}/index.ts +0 -0
- /package/src/{date-range → form/fields/date-range}/date-range-dialog.ts +0 -0
- /package/src/{date-range → form/fields/date-range}/date-range-helpers.ts +0 -0
- /package/src/{date-range → form/fields/date-range}/date-range-presets.ts +0 -0
- /package/src/{date-range → form/fields/date-range}/date-utils.ts +0 -0
- /package/src/{date-range → form/fields/date-range}/index.ts +0 -0
- /package/src/{input → form/fields/input}/index.ts +0 -0
- /package/src/{input → form/fields/input}/input.scss +0 -0
- /package/src/{radio-group → form/fields/radio-group}/index.ts +0 -0
- /package/src/{radio-group → form/fields/radio-group}/radio-group.scss +0 -0
- /package/src/{range → form/fields/range}/index.ts +0 -0
- /package/src/{select → form/fields/select}/index.ts +0 -0
- /package/src/{switch → form/fields/switch}/index.ts +0 -0
- /package/src/{textarea → form/fields/textarea}/index.ts +0 -0
- /package/src/{textarea → form/fields/textarea}/textarea.scss +0 -0
- /package/types/src/{autocomplete → form/fields/autocomplete}/index.d.ts +0 -0
- /package/types/src/{checkbox → form/fields/checkbox}/checkbox.test.d.ts +0 -0
- /package/types/src/{checkbox → form/fields/checkbox}/index.d.ts +0 -0
- /package/types/src/{date-range → form/fields/date-range}/date-range-dialog.d.ts +0 -0
- /package/types/src/{date-range → form/fields/date-range}/date-range-helpers.d.ts +0 -0
- /package/types/src/{date-range → form/fields/date-range}/date-range-presets.d.ts +0 -0
- /package/types/src/{date-range → form/fields/date-range}/date-utils.d.ts +0 -0
- /package/types/src/{date-range → form/fields/date-range}/index.d.ts +0 -0
- /package/types/src/{input → form/fields/input}/index.d.ts +0 -0
- /package/types/src/{radio-group → form/fields/radio-group}/index.d.ts +0 -0
- /package/types/src/{range → form/fields/range}/index.d.ts +0 -0
- /package/types/src/{select → form/fields/select}/index.d.ts +0 -0
- /package/types/src/{switch → form/fields/switch}/index.d.ts +0 -0
- /package/types/src/{switch → form/fields/switch}/switch.test.d.ts +0 -0
- /package/types/src/{textarea → form/fields/textarea}/index.d.ts +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { html, LitElement, nothing,
|
|
1
|
+
import { html, LitElement, nothing, unsafeCSS } from 'lit'
|
|
2
2
|
import { customElement, property, query, state } from 'lit/decorators.js'
|
|
3
3
|
import { ifDefined } from 'lit/directives/if-defined.js'
|
|
4
4
|
import { createRef, ref } from 'lit/directives/ref.js'
|
|
5
5
|
import { when } from 'lit/directives/when.js'
|
|
6
|
-
import { distinctUntilChanged, filter, fromEvent, map, takeUntil } from 'rxjs'
|
|
6
|
+
import { distinctUntilChanged, filter, fromEvent, map, takeUntil, timer } from 'rxjs'
|
|
7
7
|
|
|
8
8
|
import { SchmancyFormField } from '@mixins/index'
|
|
9
9
|
|
|
@@ -147,16 +147,6 @@ export default class SchmancyInput extends SchmancyFormField(unsafeCSS(style)) {
|
|
|
147
147
|
@property({ type: String, reflect: true })
|
|
148
148
|
public size: InputSize = 'md'
|
|
149
149
|
|
|
150
|
-
/**
|
|
151
|
-
* Controls when validation should show.
|
|
152
|
-
* - 'always' - Always show validation
|
|
153
|
-
* - 'touched' - Only show after field has been focused and then blurred
|
|
154
|
-
* - 'dirty' - Only show after value has changed
|
|
155
|
-
* - 'submitted' - Only show after form submission
|
|
156
|
-
*/
|
|
157
|
-
@property({ type: String })
|
|
158
|
-
public validateOn: 'always' | 'touched' | 'dirty' | 'submitted' = 'touched'
|
|
159
|
-
|
|
160
150
|
/**
|
|
161
151
|
* For datalist support
|
|
162
152
|
*/
|
|
@@ -180,23 +170,8 @@ export default class SchmancyInput extends SchmancyFormField(unsafeCSS(style)) {
|
|
|
180
170
|
@state()
|
|
181
171
|
private isAutofilled = false
|
|
182
172
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
*/
|
|
186
|
-
@state()
|
|
187
|
-
private touched = false
|
|
188
|
-
|
|
189
|
-
@state()
|
|
190
|
-
private dirty = false
|
|
191
|
-
|
|
192
|
-
@state()
|
|
193
|
-
private submitted = false
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* Store the default value for reset behavior
|
|
197
|
-
*/
|
|
198
|
-
@state()
|
|
199
|
-
private defaultValue = ''
|
|
173
|
+
// `touched`, `dirty`, `submitted`, and `validateOn` come from FormFieldMixin.
|
|
174
|
+
// `_defaultValue` (mixin) replaces the old `defaultValue` field.
|
|
200
175
|
|
|
201
176
|
// ----------------------------
|
|
202
177
|
// D) Form-associated logic
|
|
@@ -206,95 +181,34 @@ export default class SchmancyInput extends SchmancyFormField(unsafeCSS(style)) {
|
|
|
206
181
|
delegatesFocus: true, // so focus() goes to <input>
|
|
207
182
|
}
|
|
208
183
|
|
|
209
|
-
private formResetObserver?: MutationObserver
|
|
210
|
-
|
|
211
184
|
/**
|
|
212
185
|
* If user did not provide an ID, auto-generate one so <label for="...">
|
|
213
186
|
* and various aria-* attributes can reference it.
|
|
214
187
|
*/
|
|
215
|
-
protected override willUpdate(changedProps:
|
|
188
|
+
protected override willUpdate(changedProps: Map<PropertyKey, unknown>) {
|
|
216
189
|
if (!this.id) {
|
|
217
190
|
this.id = `sch-input-${SchmancyInput._idCounter++}`
|
|
218
191
|
}
|
|
219
|
-
super.willUpdate(changedProps)
|
|
192
|
+
super.willUpdate(changedProps as never)
|
|
220
193
|
}
|
|
221
194
|
|
|
222
195
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
if (this.value !== this.defaultValue) {
|
|
230
|
-
this.dirty = true
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
// Update validation state when value changes
|
|
234
|
-
this.validateInput()
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// Store default value if this is the first update
|
|
238
|
-
if (!this.hasUpdated && changedProps.has('value')) {
|
|
239
|
-
this.defaultValue = this.value
|
|
240
|
-
}
|
|
241
|
-
}
|
|
196
|
+
// `updated()` removed — FormFieldMixin's `willUpdate` recomputes `dirty`,
|
|
197
|
+
// triggers `checkValidity()` when `_shouldShowError()` is true, and updates
|
|
198
|
+
// `:state(dirty)` automatically.
|
|
199
|
+
//
|
|
200
|
+
// Default value capture is also handled by the mixin (`firstUpdated` sets
|
|
201
|
+
// `_defaultValue` from `value`).
|
|
242
202
|
|
|
243
|
-
/**
|
|
244
|
-
* Connect to the closest form element and set up form integration
|
|
245
|
-
*/
|
|
246
203
|
connectedCallback() {
|
|
247
204
|
super.connectedCallback()
|
|
248
205
|
|
|
249
|
-
//
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
// Set up form integration
|
|
253
|
-
this.setupFormIntegration()
|
|
254
|
-
|
|
255
|
-
// Setup for external label association
|
|
206
|
+
// Form reset and submit are now handled by the mixin via FACE callbacks
|
|
207
|
+
// (`formResetCallback`) and by `<schmancy-form>`'s submit sweep
|
|
208
|
+
// (`markSubmitted()`). No manual form listeners needed.
|
|
256
209
|
this.setupExternalLabelAssociation()
|
|
257
210
|
}
|
|
258
211
|
|
|
259
|
-
/**
|
|
260
|
-
* Set up form integration with ElementInternals
|
|
261
|
-
*/
|
|
262
|
-
private setupFormIntegration() {
|
|
263
|
-
if (this.form) {
|
|
264
|
-
// Listen for form reset events
|
|
265
|
-
this.formResetObserver = new MutationObserver(mutations => {
|
|
266
|
-
for (const mutation of mutations) {
|
|
267
|
-
if (mutation.type === 'attributes' && mutation.attributeName === 'reset') {
|
|
268
|
-
this.resetToDefault()
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
})
|
|
272
|
-
|
|
273
|
-
// Observe the form for reset events
|
|
274
|
-
this.formResetObserver.observe(this.form, {
|
|
275
|
-
attributes: true,
|
|
276
|
-
childList: false,
|
|
277
|
-
subtree: false,
|
|
278
|
-
})
|
|
279
|
-
|
|
280
|
-
// Use RxJS for form reset events
|
|
281
|
-
fromEvent(this.form, 'reset')
|
|
282
|
-
.pipe(takeUntil(this.disconnecting))
|
|
283
|
-
.subscribe(() => {
|
|
284
|
-
this.resetToDefault()
|
|
285
|
-
})
|
|
286
|
-
|
|
287
|
-
// Use RxJS for form submit events to mark field as submitted
|
|
288
|
-
fromEvent(this.form, 'submit')
|
|
289
|
-
.pipe(takeUntil(this.disconnecting))
|
|
290
|
-
.subscribe(() => {
|
|
291
|
-
this.submitted = true
|
|
292
|
-
// Validate on form submission
|
|
293
|
-
this.validateInput(true)
|
|
294
|
-
})
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
|
|
298
212
|
/**
|
|
299
213
|
* Set up external label association for native HTML label support
|
|
300
214
|
*/
|
|
@@ -324,149 +238,160 @@ export default class SchmancyInput extends SchmancyFormField(unsafeCSS(style)) {
|
|
|
324
238
|
}
|
|
325
239
|
}
|
|
326
240
|
|
|
327
|
-
disconnectedCallback
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
if (this.formResetObserver) {
|
|
332
|
-
this.formResetObserver.disconnect()
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
// Note: RxJS subscriptions are automatically cleaned up via takeUntil(this.disconnecting)
|
|
336
|
-
// No manual removeEventListener calls needed for RxJS-managed events
|
|
337
|
-
}
|
|
241
|
+
// `disconnectedCallback`, `resetToDefault`, `shouldShowValidation`, and
|
|
242
|
+
// `validateInput` are gone — the mixin's `willUpdate` runs `checkValidity()`
|
|
243
|
+
// at the right moments (Phase 2/3/4 of the validation contract) and
|
|
244
|
+
// `formResetCallback` → `resetForm()` handles reset.
|
|
338
245
|
|
|
339
246
|
/**
|
|
340
|
-
*
|
|
247
|
+
* Check validity. Folds in the inner native input's structured
|
|
248
|
+
* `ValidityState` flags (`typeMismatch`, `patternMismatch`, `tooShort`,
|
|
249
|
+
* `tooLong`, `rangeUnderflow`, `rangeOverflow`, `stepMismatch`, `badInput`)
|
|
250
|
+
* via `internals.setValidity` so consumers can target specific flags via
|
|
251
|
+
* `field.validity.<flag>` and `:state(value-missing|type-mismatch|…)`.
|
|
252
|
+
*
|
|
253
|
+
* The visual `error` flag is still gated by the mixin's `_shouldShowError()`.
|
|
341
254
|
*/
|
|
342
|
-
private resetToDefault() {
|
|
343
|
-
this.value = this.defaultValue
|
|
344
|
-
this.touched = false
|
|
345
|
-
this.dirty = false
|
|
346
|
-
this.submitted = false
|
|
347
|
-
this.error = false
|
|
348
|
-
this.validationMessage = ''
|
|
349
|
-
this.dispatchEvent(new CustomEvent('reset', { bubbles: true }))
|
|
350
|
-
}
|
|
351
|
-
|
|
352
255
|
/**
|
|
353
|
-
*
|
|
354
|
-
*
|
|
256
|
+
* Re-run checkValidity AFTER render so the native inner input's `.value`
|
|
257
|
+
* binding has propagated. The mixin's willUpdate fires checkValidity too
|
|
258
|
+
* early — at that point native.validity still reflects the previous value.
|
|
355
259
|
*/
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
return this.touched
|
|
260
|
+
protected override updated(changedProps: Map<PropertyKey, unknown>) {
|
|
261
|
+
super.updated?.(changedProps)
|
|
262
|
+
if (
|
|
263
|
+
changedProps.has('value') ||
|
|
264
|
+
changedProps.has('required') ||
|
|
265
|
+
changedProps.has('type') ||
|
|
266
|
+
changedProps.has('pattern') ||
|
|
267
|
+
changedProps.has('min') ||
|
|
268
|
+
changedProps.has('max') ||
|
|
269
|
+
changedProps.has('minlength') ||
|
|
270
|
+
changedProps.has('maxlength')
|
|
271
|
+
) {
|
|
272
|
+
this.checkValidity()
|
|
370
273
|
}
|
|
371
274
|
}
|
|
372
275
|
|
|
373
|
-
|
|
374
276
|
/**
|
|
375
|
-
*
|
|
376
|
-
*
|
|
277
|
+
* Pick the first matching `errorMessages` override for the failing flags.
|
|
278
|
+
* Order matches the natural priority of validity flags (valueMissing
|
|
279
|
+
* before more specific ones — empty trumps malformed).
|
|
377
280
|
*/
|
|
378
|
-
private
|
|
379
|
-
|
|
380
|
-
if (
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
rangeUnderflow: false,
|
|
392
|
-
stepMismatch: false,
|
|
393
|
-
tooLong: false,
|
|
394
|
-
tooShort: false,
|
|
395
|
-
typeMismatch: false,
|
|
396
|
-
valid: true,
|
|
397
|
-
valueMissing: false,
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
// Check if the input has an actual validation error (not a custom error)
|
|
401
|
-
const hasError = !validity.valid && !validity.customError
|
|
402
|
-
|
|
403
|
-
if (shouldValidate && hasError) {
|
|
404
|
-
// There's an error and we should show it
|
|
405
|
-
this.error = true
|
|
406
|
-
this.validationMessage = this.inputElement?.validationMessage || ''
|
|
407
|
-
} else if (validity.valid) {
|
|
408
|
-
// Input is valid, so clear the error state
|
|
409
|
-
this.error = false
|
|
410
|
-
|
|
411
|
-
// Only clear validation message if there's no custom error
|
|
412
|
-
if (!validity.customError) {
|
|
413
|
-
this.validationMessage = ''
|
|
414
|
-
}
|
|
415
|
-
} else if (!shouldValidate) {
|
|
416
|
-
// We shouldn't show validation yet, so clear visual error state
|
|
417
|
-
this.error = false
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
// The mixin will handle updating internals based on error state
|
|
281
|
+
private _firstMatchingErrorMessage(v: ValidityState): string | undefined {
|
|
282
|
+
const m = this.errorMessages
|
|
283
|
+
if (!m) return undefined
|
|
284
|
+
if (v.valueMissing && m.valueMissing) return m.valueMissing
|
|
285
|
+
if (v.typeMismatch && m.typeMismatch) return m.typeMismatch
|
|
286
|
+
if (v.patternMismatch && m.patternMismatch) return m.patternMismatch
|
|
287
|
+
if (v.tooShort && m.tooShort) return m.tooShort
|
|
288
|
+
if (v.tooLong && m.tooLong) return m.tooLong
|
|
289
|
+
if (v.rangeUnderflow && m.rangeUnderflow) return m.rangeUnderflow
|
|
290
|
+
if (v.rangeOverflow && m.rangeOverflow) return m.rangeOverflow
|
|
291
|
+
if (v.stepMismatch && m.stepMismatch) return m.stepMismatch
|
|
292
|
+
if (v.badInput && m.badInput) return m.badInput
|
|
293
|
+
return undefined
|
|
421
294
|
}
|
|
422
295
|
|
|
423
|
-
/**
|
|
424
|
-
* Check validity without showing validation UI
|
|
425
|
-
*/
|
|
426
296
|
public override checkValidity() {
|
|
427
|
-
//
|
|
428
|
-
const
|
|
297
|
+
// Prefer @query (always live) over @ref (may lag during initial paint).
|
|
298
|
+
const native = this.inputElement ?? this.inputRef.value
|
|
299
|
+
const v = native?.validity
|
|
300
|
+
if (v && !v.valid) {
|
|
301
|
+
// Surface the native flags. valueMissing also surfaces here when
|
|
302
|
+
// `required` + empty — overrides the mixin's coarse check.
|
|
303
|
+
const flags: ValidityStateFlags = {
|
|
304
|
+
valueMissing: v.valueMissing || undefined,
|
|
305
|
+
typeMismatch: v.typeMismatch || undefined,
|
|
306
|
+
patternMismatch: v.patternMismatch || undefined,
|
|
307
|
+
tooShort: v.tooShort || undefined,
|
|
308
|
+
tooLong: v.tooLong || undefined,
|
|
309
|
+
rangeUnderflow: v.rangeUnderflow || undefined,
|
|
310
|
+
rangeOverflow: v.rangeOverflow || undefined,
|
|
311
|
+
stepMismatch: v.stepMismatch || undefined,
|
|
312
|
+
badInput: v.badInput || undefined,
|
|
313
|
+
customError: v.customError || undefined,
|
|
314
|
+
}
|
|
315
|
+
// errorMessages override: pick the first matching flag and use the
|
|
316
|
+
// consumer-provided copy. Falls back to the native browser message.
|
|
317
|
+
const overrideMessage = this._firstMatchingErrorMessage(v)
|
|
318
|
+
this.internals?.setValidity(
|
|
319
|
+
flags,
|
|
320
|
+
overrideMessage || native.validationMessage || this.validationMessage || 'Invalid value',
|
|
321
|
+
)
|
|
322
|
+
if (this._shouldShowError()) {
|
|
323
|
+
this.error = true
|
|
324
|
+
// Always reflect the current flag's message — previous
|
|
325
|
+
// validationMessage may be stale (different flag).
|
|
326
|
+
const newMessage = overrideMessage || native.validationMessage
|
|
327
|
+
if (newMessage) this.validationMessage = newMessage
|
|
328
|
+
// Mirror flags into :state() so CSS can target specifics.
|
|
329
|
+
for (const flag of [
|
|
330
|
+
'value-missing',
|
|
331
|
+
'type-mismatch',
|
|
332
|
+
'pattern-mismatch',
|
|
333
|
+
'too-short',
|
|
334
|
+
'too-long',
|
|
335
|
+
'range-underflow',
|
|
336
|
+
'range-overflow',
|
|
337
|
+
'step-mismatch',
|
|
338
|
+
'bad-input',
|
|
339
|
+
]) {
|
|
340
|
+
this.internals?.states.delete(flag)
|
|
341
|
+
}
|
|
342
|
+
if (v.valueMissing) this.internals?.states.add('value-missing')
|
|
343
|
+
if (v.typeMismatch) this.internals?.states.add('type-mismatch')
|
|
344
|
+
if (v.patternMismatch) this.internals?.states.add('pattern-mismatch')
|
|
345
|
+
if (v.tooShort) this.internals?.states.add('too-short')
|
|
346
|
+
if (v.tooLong) this.internals?.states.add('too-long')
|
|
347
|
+
if (v.rangeUnderflow) this.internals?.states.add('range-underflow')
|
|
348
|
+
if (v.rangeOverflow) this.internals?.states.add('range-overflow')
|
|
349
|
+
if (v.stepMismatch) this.internals?.states.add('step-mismatch')
|
|
350
|
+
if (v.badInput) this.internals?.states.add('bad-input')
|
|
351
|
+
}
|
|
352
|
+
return false
|
|
353
|
+
}
|
|
429
354
|
|
|
430
|
-
//
|
|
355
|
+
// Native says valid — but the mixin's `required` check might still
|
|
356
|
+
// fire (mixin checks `value === ''` directly, native may treat empty
|
|
357
|
+
// differently for type=email/url with no value).
|
|
431
358
|
const parentValid = super.checkValidity()
|
|
432
|
-
|
|
433
|
-
|
|
359
|
+
if (parentValid) {
|
|
360
|
+
// Clear specific-flag :state() entries.
|
|
361
|
+
for (const flag of [
|
|
362
|
+
'value-missing',
|
|
363
|
+
'type-mismatch',
|
|
364
|
+
'pattern-mismatch',
|
|
365
|
+
'too-short',
|
|
366
|
+
'too-long',
|
|
367
|
+
'range-underflow',
|
|
368
|
+
'range-overflow',
|
|
369
|
+
'step-mismatch',
|
|
370
|
+
'bad-input',
|
|
371
|
+
]) {
|
|
372
|
+
this.internals?.states.delete(flag)
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return parentValid
|
|
434
376
|
}
|
|
435
377
|
|
|
436
378
|
/**
|
|
437
|
-
* Show validation UI and check validity
|
|
379
|
+
* Show validation UI and check validity.
|
|
380
|
+
* Marks the field as submitted so the mixin's gate flips to "always show."
|
|
438
381
|
*/
|
|
439
382
|
public override reportValidity() {
|
|
440
|
-
|
|
441
|
-
this.touched = true
|
|
442
|
-
this.submitted = true
|
|
443
|
-
|
|
444
|
-
// First check using native input
|
|
383
|
+
this.markSubmitted()
|
|
445
384
|
const inputValid = this.inputRef.value?.reportValidity() ?? true
|
|
446
|
-
|
|
447
|
-
// Update our component's validation state with force=true
|
|
448
|
-
this.validateInput(true)
|
|
449
|
-
|
|
450
|
-
// Call parent implementation
|
|
451
385
|
const parentValid = super.reportValidity()
|
|
452
|
-
|
|
453
386
|
return inputValid && parentValid
|
|
454
387
|
}
|
|
455
388
|
|
|
456
|
-
/**
|
|
457
|
-
* Set a custom validation error message
|
|
458
|
-
*/
|
|
389
|
+
/** Set a custom validation error on both the inner input and the mixin. */
|
|
459
390
|
public override setCustomValidity(message: string) {
|
|
460
|
-
// Set on the native input
|
|
461
391
|
if (this.inputRef.value) {
|
|
462
392
|
this.inputRef.value.setCustomValidity(message)
|
|
463
393
|
}
|
|
464
|
-
|
|
465
|
-
// Call parent implementation
|
|
466
394
|
super.setCustomValidity(message)
|
|
467
|
-
|
|
468
|
-
// Update error state based on validation strategy
|
|
469
|
-
this.error = message !== '' && this.shouldShowValidation()
|
|
470
395
|
}
|
|
471
396
|
|
|
472
397
|
// ----------------------------
|
|
@@ -475,10 +400,10 @@ export default class SchmancyInput extends SchmancyFormField(unsafeCSS(style)) {
|
|
|
475
400
|
firstUpdated() {
|
|
476
401
|
// Autofocus if desired
|
|
477
402
|
if (this.autofocus) {
|
|
478
|
-
//
|
|
479
|
-
|
|
480
|
-
this.
|
|
481
|
-
|
|
403
|
+
// Schedule focus after initial render — RxJS timer for cancel-on-disconnect.
|
|
404
|
+
timer(0)
|
|
405
|
+
.pipe(takeUntil(this.disconnecting))
|
|
406
|
+
.subscribe(() => this.focus())
|
|
482
407
|
}
|
|
483
408
|
|
|
484
409
|
// Subscribe to input events
|
|
@@ -515,8 +440,7 @@ export default class SchmancyInput extends SchmancyFormField(unsafeCSS(style)) {
|
|
|
515
440
|
// Update component value
|
|
516
441
|
this.value = eventData.value
|
|
517
442
|
|
|
518
|
-
//
|
|
519
|
-
this.dirty = this.value !== this.defaultValue
|
|
443
|
+
// `dirty` is a getter on the mixin (value vs _defaultValue) — no manual set.
|
|
520
444
|
|
|
521
445
|
// Fire custom 'input' event with extended details
|
|
522
446
|
const customEvent = new CustomEvent<EventDetails>('input', {
|
|
@@ -534,8 +458,8 @@ export default class SchmancyInput extends SchmancyFormField(unsafeCSS(style)) {
|
|
|
534
458
|
|
|
535
459
|
this.dispatchEvent(customEvent)
|
|
536
460
|
|
|
537
|
-
//
|
|
538
|
-
|
|
461
|
+
// Mixin's willUpdate runs checkValidity() on value-change when
|
|
462
|
+
// _shouldShowError() is true — no manual validateInput() call.
|
|
539
463
|
})
|
|
540
464
|
|
|
541
465
|
// Subscribe to native change events (usually on blur)
|
|
@@ -551,13 +475,8 @@ export default class SchmancyInput extends SchmancyFormField(unsafeCSS(style)) {
|
|
|
551
475
|
)
|
|
552
476
|
.subscribe(value => {
|
|
553
477
|
this.value = value
|
|
554
|
-
this.dirty = this.value !== this.defaultValue
|
|
555
|
-
|
|
556
|
-
// Fire regular change event using mixin helper
|
|
557
478
|
this.emitChange({ value })
|
|
558
|
-
|
|
559
|
-
// Run validation on change like native inputs
|
|
560
|
-
this.validateInput()
|
|
479
|
+
// Validation runs automatically via mixin's willUpdate.
|
|
561
480
|
})
|
|
562
481
|
}
|
|
563
482
|
|
|
@@ -586,13 +505,9 @@ export default class SchmancyInput extends SchmancyFormField(unsafeCSS(style)) {
|
|
|
586
505
|
fromEvent<FocusEvent>(this.inputElement, 'blur')
|
|
587
506
|
.pipe(takeUntil(this.disconnecting))
|
|
588
507
|
.subscribe(ev => {
|
|
589
|
-
// Mark as touched
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
// Run validation on blur like native inputs, respecting validation strategy
|
|
593
|
-
if (!this.disabled) {
|
|
594
|
-
this.validateInput()
|
|
595
|
-
}
|
|
508
|
+
// Mark as touched on blur — mixin's willUpdate handles the rest
|
|
509
|
+
// (validates if dirty, broadcasts :state(touched), etc.).
|
|
510
|
+
this.markTouched()
|
|
596
511
|
|
|
597
512
|
// Create a custom blur event that includes standard props
|
|
598
513
|
const blurEvent = new CustomEvent('blur', {
|
|
@@ -624,7 +539,7 @@ export default class SchmancyInput extends SchmancyFormField(unsafeCSS(style)) {
|
|
|
624
539
|
const { value } = ev.target as HTMLInputElement
|
|
625
540
|
this.value = value
|
|
626
541
|
this.isAutofilled = true
|
|
627
|
-
|
|
542
|
+
// `dirty` is a getter on the mixin — recomputes from value vs _defaultValue.
|
|
628
543
|
|
|
629
544
|
// Dispatch autofill event for integration with autofill systems
|
|
630
545
|
this.dispatchEvent(
|
|
@@ -663,10 +578,9 @@ export default class SchmancyInput extends SchmancyFormField(unsafeCSS(style)) {
|
|
|
663
578
|
.subscribe(ev => {
|
|
664
579
|
const { value } = ev.target as HTMLInputElement
|
|
665
580
|
|
|
666
|
-
// Update value if changed
|
|
581
|
+
// Update value if changed (mixin recomputes dirty automatically)
|
|
667
582
|
if (this.value !== value) {
|
|
668
583
|
this.value = value
|
|
669
|
-
this.dirty = this.value !== this.defaultValue
|
|
670
584
|
}
|
|
671
585
|
|
|
672
586
|
// Blur the input to trigger change event naturally
|
|
@@ -927,6 +841,7 @@ export default class SchmancyInput extends SchmancyFormField(unsafeCSS(style)) {
|
|
|
927
841
|
<div
|
|
928
842
|
id="hint-${this.id}"
|
|
929
843
|
class="mt-1 text-sm ${this.error ? 'text-error-default' : 'text-surface-onVariant'}"
|
|
844
|
+
role=${ifDefined(this.error ? 'alert' : undefined)}
|
|
930
845
|
>
|
|
931
846
|
${this.error && this.validationMessage ? this.validationMessage : this.hint}
|
|
932
847
|
</div>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SchmancyElement } from '@mixins/index'
|
|
2
2
|
import { html } from 'lit'
|
|
3
3
|
import { customElement, property } from 'lit/decorators.js'
|
|
4
|
-
import { FormFieldMixin } from '
|
|
4
|
+
import { FormFieldMixin } from '@mixins/formField.mixin'
|
|
5
5
|
import { fromEvent, takeUntil } from 'rxjs'
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -4,7 +4,7 @@ import { Subject, fromEvent, takeUntil } from 'rxjs'
|
|
|
4
4
|
import style from './radio-group.scss?inline'
|
|
5
5
|
import { SchmancyElement } from '@mixins/index'
|
|
6
6
|
import { when } from 'lit/directives/when.js'
|
|
7
|
-
import { FormFieldMixin } from '
|
|
7
|
+
import { FormFieldMixin } from '@mixins/formField.mixin'
|
|
8
8
|
|
|
9
9
|
export type SchmancyRadioGroupOption = {
|
|
10
10
|
label: string
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest'
|
|
2
|
+
import './range'
|
|
3
|
+
import { expectNoA11yViolations } from '../../../test-utils/a11y'
|
|
4
|
+
|
|
5
|
+
const nextUpdate = () => new Promise(r => requestAnimationFrame(() => r(null)))
|
|
6
|
+
|
|
7
|
+
describe('schmancy-range', () => {
|
|
8
|
+
let host: HTMLDivElement
|
|
9
|
+
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
host = document.createElement('div')
|
|
12
|
+
document.body.appendChild(host)
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
host.remove()
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
it('is form-associated and contributes its value to FormData', async () => {
|
|
20
|
+
host.innerHTML = `
|
|
21
|
+
<form>
|
|
22
|
+
<schmancy-range name="volume" min="0" max="100" value="42"></schmancy-range>
|
|
23
|
+
</form>
|
|
24
|
+
`
|
|
25
|
+
const form = host.querySelector('form') as HTMLFormElement
|
|
26
|
+
await nextUpdate()
|
|
27
|
+
await nextUpdate()
|
|
28
|
+
expect(new FormData(form).get('volume')).toBe('42')
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
it('reports value as number on the property', async () => {
|
|
32
|
+
host.innerHTML = `<schmancy-range value="0.5" min="0" max="1" step="0.01"></schmancy-range>`
|
|
33
|
+
const r = host.querySelector('schmancy-range') as HTMLElement & { value: number }
|
|
34
|
+
await nextUpdate()
|
|
35
|
+
expect(r.value).toBe(0.5)
|
|
36
|
+
expect(typeof r.value).toBe('number')
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
it('fires change with numeric detail on input', async () => {
|
|
40
|
+
host.innerHTML = `<schmancy-range min="0" max="10" step="1" value="3"></schmancy-range>`
|
|
41
|
+
const r = host.querySelector('schmancy-range') as HTMLElement & {
|
|
42
|
+
updateComplete: Promise<boolean>
|
|
43
|
+
}
|
|
44
|
+
await r.updateComplete
|
|
45
|
+
let detail: { value: number } | undefined
|
|
46
|
+
r.addEventListener('change', (e: Event) => {
|
|
47
|
+
detail = (e as CustomEvent).detail
|
|
48
|
+
})
|
|
49
|
+
const input = r.shadowRoot!.querySelector('input[type=range]') as HTMLInputElement
|
|
50
|
+
input.value = '7'
|
|
51
|
+
input.dispatchEvent(new Event('input', { bubbles: true }))
|
|
52
|
+
await nextUpdate()
|
|
53
|
+
expect(detail).toEqual({ value: 7 })
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
it('respects disabled attribute on inner input', async () => {
|
|
57
|
+
host.innerHTML = `<schmancy-range disabled value="5"></schmancy-range>`
|
|
58
|
+
const r = host.querySelector('schmancy-range') as HTMLElement & {
|
|
59
|
+
updateComplete: Promise<boolean>
|
|
60
|
+
}
|
|
61
|
+
await r.updateComplete
|
|
62
|
+
const input = r.shadowRoot!.querySelector('input[type=range]') as HTMLInputElement
|
|
63
|
+
expect(input.disabled).toBe(true)
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
it('has no axe-core a11y violations', async () => {
|
|
67
|
+
host.innerHTML = `<schmancy-range label="Volume" min="0" max="100" value="42"></schmancy-range>`
|
|
68
|
+
const r = host.querySelector('schmancy-range') as HTMLElement & { updateComplete: Promise<boolean> }
|
|
69
|
+
await r.updateComplete
|
|
70
|
+
await expectNoA11yViolations(host)
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
it('resets to default value on form reset', async () => {
|
|
74
|
+
host.innerHTML = `
|
|
75
|
+
<form>
|
|
76
|
+
<schmancy-range name="x" value="5" min="0" max="10"></schmancy-range>
|
|
77
|
+
</form>
|
|
78
|
+
`
|
|
79
|
+
const form = host.querySelector('form') as HTMLFormElement
|
|
80
|
+
const r = host.querySelector('schmancy-range') as HTMLElement & { value: number }
|
|
81
|
+
await nextUpdate()
|
|
82
|
+
await nextUpdate()
|
|
83
|
+
r.value = 8
|
|
84
|
+
await nextUpdate()
|
|
85
|
+
form.reset()
|
|
86
|
+
await nextUpdate()
|
|
87
|
+
await nextUpdate()
|
|
88
|
+
expect(r.value).toBe(5)
|
|
89
|
+
})
|
|
90
|
+
})
|