@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
package/src/form/form.test.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { afterEach, beforeEach, describe, expect, it } from 'vitest'
|
|
2
2
|
import './form'
|
|
3
|
-
import '
|
|
3
|
+
import './fields/input/input'
|
|
4
4
|
import '../button/button'
|
|
5
|
-
import '
|
|
5
|
+
import './fields/checkbox/checkbox'
|
|
6
|
+
import { expectNoA11yViolations } from '../test-utils/a11y'
|
|
7
|
+
import type SchmancyForm from './form'
|
|
8
|
+
import type { SchmancyFormSubmitDetail } from './form'
|
|
6
9
|
|
|
7
10
|
const nextUpdate = () => new Promise(r => requestAnimationFrame(() => r(null)))
|
|
8
11
|
|
|
@@ -18,42 +21,46 @@ describe('schmancy-form', () => {
|
|
|
18
21
|
host.remove()
|
|
19
22
|
})
|
|
20
23
|
|
|
21
|
-
it('
|
|
24
|
+
it('renders a shadow-DOM <form> wrapping a slot', async () => {
|
|
22
25
|
host.innerHTML = `
|
|
23
26
|
<schmancy-form>
|
|
24
27
|
<schmancy-checkbox name="agree"></schmancy-checkbox>
|
|
25
28
|
</schmancy-form>
|
|
26
29
|
`
|
|
27
|
-
const sf = host.querySelector('schmancy-form') as
|
|
30
|
+
const sf = host.querySelector('schmancy-form') as SchmancyForm
|
|
28
31
|
await nextUpdate()
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
expect(
|
|
32
|
+
await nextUpdate()
|
|
33
|
+
const innerForm = sf.shadowRoot?.querySelector('form')
|
|
34
|
+
expect(innerForm).toBeInstanceOf(HTMLFormElement)
|
|
35
|
+
// Field is in light DOM, slotted into the inner form's <slot>.
|
|
36
|
+
expect(host.querySelector('schmancy-checkbox')).toBeTruthy()
|
|
32
37
|
})
|
|
33
38
|
|
|
34
|
-
it('emits submit with
|
|
39
|
+
it('emits submit with { data, formData, until } on native submission', async () => {
|
|
35
40
|
host.innerHTML = `
|
|
36
41
|
<schmancy-form>
|
|
37
42
|
<schmancy-checkbox name="agree"></schmancy-checkbox>
|
|
38
43
|
<button id="go" type="submit">Go</button>
|
|
39
44
|
</schmancy-form>
|
|
40
45
|
`
|
|
41
|
-
const sf = host.querySelector('schmancy-form') as
|
|
46
|
+
const sf = host.querySelector('schmancy-form') as SchmancyForm
|
|
42
47
|
const cb = host.querySelector('schmancy-checkbox') as HTMLElement & { value: boolean }
|
|
43
48
|
cb.value = true
|
|
44
49
|
await nextUpdate()
|
|
45
50
|
await nextUpdate()
|
|
46
51
|
|
|
47
|
-
const submits:
|
|
52
|
+
const submits: SchmancyFormSubmitDetail[] = []
|
|
48
53
|
sf.addEventListener('submit', (e: Event) => {
|
|
49
|
-
submits.push((e as CustomEvent).detail
|
|
54
|
+
submits.push((e as CustomEvent<SchmancyFormSubmitDetail>).detail)
|
|
50
55
|
})
|
|
51
56
|
|
|
52
57
|
const btn = host.querySelector('#go') as HTMLButtonElement
|
|
53
58
|
btn.click()
|
|
59
|
+
await nextUpdate()
|
|
54
60
|
|
|
55
61
|
expect(submits).toHaveLength(1)
|
|
56
|
-
expect(submits[0].get('agree')).toBe('on')
|
|
62
|
+
expect(submits[0].formData.get('agree')).toBe('on')
|
|
63
|
+
expect(typeof submits[0].until).toBe('function')
|
|
57
64
|
})
|
|
58
65
|
|
|
59
66
|
it('blocks submit when a required field is empty', async () => {
|
|
@@ -63,7 +70,7 @@ describe('schmancy-form', () => {
|
|
|
63
70
|
<button id="go" type="submit">Go</button>
|
|
64
71
|
</schmancy-form>
|
|
65
72
|
`
|
|
66
|
-
const sf = host.querySelector('schmancy-form') as
|
|
73
|
+
const sf = host.querySelector('schmancy-form') as SchmancyForm
|
|
67
74
|
await nextUpdate()
|
|
68
75
|
await nextUpdate()
|
|
69
76
|
|
|
@@ -72,58 +79,68 @@ describe('schmancy-form', () => {
|
|
|
72
79
|
|
|
73
80
|
const btn = host.querySelector('#go') as HTMLButtonElement
|
|
74
81
|
btn.click()
|
|
82
|
+
await nextUpdate()
|
|
75
83
|
|
|
76
84
|
expect(submitCount).toBe(0)
|
|
77
85
|
})
|
|
78
86
|
|
|
79
|
-
it('
|
|
87
|
+
it('schmancy-button type=submit triggers form submission', async () => {
|
|
80
88
|
host.innerHTML = `
|
|
81
|
-
<schmancy-form
|
|
82
|
-
<schmancy-
|
|
83
|
-
<button id="
|
|
89
|
+
<schmancy-form>
|
|
90
|
+
<schmancy-input name="email" value="x@y.z" required></schmancy-input>
|
|
91
|
+
<schmancy-button id="sbtn" type="submit">Save</schmancy-button>
|
|
84
92
|
</schmancy-form>
|
|
85
93
|
`
|
|
86
|
-
const sf = host.querySelector('schmancy-form') as
|
|
94
|
+
const sf = host.querySelector('schmancy-form') as SchmancyForm
|
|
95
|
+
const btn = host.querySelector('#sbtn') as HTMLElement
|
|
87
96
|
await nextUpdate()
|
|
88
97
|
await nextUpdate()
|
|
89
98
|
|
|
90
|
-
let
|
|
91
|
-
sf.addEventListener('submit', () =>
|
|
99
|
+
let submitted = false
|
|
100
|
+
sf.addEventListener('submit', () => (submitted = true))
|
|
92
101
|
|
|
93
|
-
const btn = host.querySelector('#go') as HTMLButtonElement
|
|
94
102
|
btn.click()
|
|
103
|
+
await nextUpdate()
|
|
95
104
|
|
|
96
|
-
expect(
|
|
105
|
+
expect(submitted).toBe(true)
|
|
97
106
|
})
|
|
98
107
|
|
|
99
|
-
it('
|
|
108
|
+
it('has no axe-core a11y violations when idle', async () => {
|
|
100
109
|
host.innerHTML = `
|
|
101
110
|
<schmancy-form>
|
|
102
|
-
<schmancy-input name="email"
|
|
103
|
-
<schmancy-button
|
|
111
|
+
<schmancy-input name="email" label="Email" required></schmancy-input>
|
|
112
|
+
<schmancy-button type="submit">Send</schmancy-button>
|
|
104
113
|
</schmancy-form>
|
|
105
114
|
`
|
|
106
|
-
const sf = host.querySelector('schmancy-form') as HTMLElement
|
|
107
|
-
const btn = host.querySelector('#sbtn') as HTMLElement
|
|
108
115
|
await nextUpdate()
|
|
109
116
|
await nextUpdate()
|
|
117
|
+
await expectNoA11yViolations(host)
|
|
118
|
+
})
|
|
110
119
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
120
|
+
it('has no axe-core a11y violations after invalid submit (live region populated)', async () => {
|
|
121
|
+
host.innerHTML = `
|
|
122
|
+
<schmancy-form>
|
|
123
|
+
<schmancy-input name="email" label="Email" required></schmancy-input>
|
|
124
|
+
<schmancy-button type="submit">Send</schmancy-button>
|
|
125
|
+
</schmancy-form>
|
|
126
|
+
`
|
|
127
|
+
const sf = host.querySelector('schmancy-form') as SchmancyForm
|
|
115
128
|
await nextUpdate()
|
|
116
|
-
|
|
117
|
-
|
|
129
|
+
await nextUpdate()
|
|
130
|
+
sf.setFormError('Server says no')
|
|
131
|
+
await nextUpdate()
|
|
132
|
+
await nextUpdate()
|
|
133
|
+
await expectNoA11yViolations(host)
|
|
118
134
|
})
|
|
119
135
|
|
|
120
|
-
it('dispatches a single submit event (no double-fire
|
|
136
|
+
it('dispatches a single submit event (no double-fire)', async () => {
|
|
121
137
|
host.innerHTML = `
|
|
122
138
|
<schmancy-form>
|
|
123
139
|
<button id="go" type="submit">Go</button>
|
|
124
140
|
</schmancy-form>
|
|
125
141
|
`
|
|
126
|
-
const sf = host.querySelector('schmancy-form') as
|
|
142
|
+
const sf = host.querySelector('schmancy-form') as SchmancyForm
|
|
143
|
+
await nextUpdate()
|
|
127
144
|
await nextUpdate()
|
|
128
145
|
|
|
129
146
|
let count = 0
|
|
@@ -131,7 +148,173 @@ describe('schmancy-form', () => {
|
|
|
131
148
|
|
|
132
149
|
const btn = host.querySelector('#go') as HTMLButtonElement
|
|
133
150
|
btn.click()
|
|
151
|
+
await nextUpdate()
|
|
134
152
|
|
|
135
153
|
expect(count).toBe(1)
|
|
136
154
|
})
|
|
155
|
+
|
|
156
|
+
it('parses payload through `schema` when set', async () => {
|
|
157
|
+
host.innerHTML = `
|
|
158
|
+
<schmancy-form>
|
|
159
|
+
<schmancy-input name="email" value="x@y.z"></schmancy-input>
|
|
160
|
+
<button id="go" type="submit">Go</button>
|
|
161
|
+
</schmancy-form>
|
|
162
|
+
`
|
|
163
|
+
const sf = host.querySelector('schmancy-form') as SchmancyForm<{
|
|
164
|
+
parse(input: unknown): { email: string }
|
|
165
|
+
}>
|
|
166
|
+
// Trivial schema: returns { email: 'parsed' } regardless of input
|
|
167
|
+
sf.schema = {
|
|
168
|
+
parse: (_input: unknown) => ({ email: 'parsed' }),
|
|
169
|
+
}
|
|
170
|
+
await nextUpdate()
|
|
171
|
+
await nextUpdate()
|
|
172
|
+
|
|
173
|
+
let detail: SchmancyFormSubmitDetail<{ email: string }> | null = null
|
|
174
|
+
sf.addEventListener('submit', (e: Event) => {
|
|
175
|
+
detail = (e as CustomEvent<SchmancyFormSubmitDetail<{ email: string }>>).detail
|
|
176
|
+
})
|
|
177
|
+
|
|
178
|
+
const btn = host.querySelector('#go') as HTMLButtonElement
|
|
179
|
+
btn.click()
|
|
180
|
+
await nextUpdate()
|
|
181
|
+
|
|
182
|
+
expect(detail).toBeTruthy()
|
|
183
|
+
expect((detail as SchmancyFormSubmitDetail<{ email: string }>).data).toEqual({ email: 'parsed' })
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
it('announces server-side form error via assistive-tech live region', async () => {
|
|
187
|
+
host.innerHTML = `
|
|
188
|
+
<schmancy-form>
|
|
189
|
+
<schmancy-input name="x" value="ok"></schmancy-input>
|
|
190
|
+
</schmancy-form>
|
|
191
|
+
`
|
|
192
|
+
const sf = host.querySelector('schmancy-form') as SchmancyForm
|
|
193
|
+
await nextUpdate()
|
|
194
|
+
await nextUpdate()
|
|
195
|
+
|
|
196
|
+
const liveRegion = sf.shadowRoot!.querySelector('[role="status"]') as HTMLElement
|
|
197
|
+
expect(liveRegion).toBeTruthy()
|
|
198
|
+
expect(liveRegion.getAttribute('aria-live')).toBe('assertive')
|
|
199
|
+
// Idle: empty
|
|
200
|
+
expect(liveRegion.textContent?.trim()).toBe('')
|
|
201
|
+
|
|
202
|
+
sf.setFormError('Network error — please try again.')
|
|
203
|
+
await nextUpdate()
|
|
204
|
+
await nextUpdate()
|
|
205
|
+
expect(liveRegion.textContent?.trim()).toBe('Network error — please try again.')
|
|
206
|
+
})
|
|
207
|
+
|
|
208
|
+
it('clears the live region on form reset', async () => {
|
|
209
|
+
host.innerHTML = `
|
|
210
|
+
<schmancy-form>
|
|
211
|
+
<schmancy-input name="x" value="ok"></schmancy-input>
|
|
212
|
+
<button id="r" type="reset">Reset</button>
|
|
213
|
+
</schmancy-form>
|
|
214
|
+
`
|
|
215
|
+
const sf = host.querySelector('schmancy-form') as SchmancyForm
|
|
216
|
+
await nextUpdate()
|
|
217
|
+
await nextUpdate()
|
|
218
|
+
|
|
219
|
+
sf.setFormError('Boom')
|
|
220
|
+
await nextUpdate()
|
|
221
|
+
await nextUpdate()
|
|
222
|
+
const liveRegion = sf.shadowRoot!.querySelector('[role="status"]') as HTMLElement
|
|
223
|
+
expect(liveRegion.textContent?.trim()).toBe('Boom')
|
|
224
|
+
|
|
225
|
+
;(host.querySelector('#r') as HTMLButtonElement).click()
|
|
226
|
+
await nextUpdate()
|
|
227
|
+
await nextUpdate()
|
|
228
|
+
expect(liveRegion.textContent?.trim()).toBe('')
|
|
229
|
+
})
|
|
230
|
+
|
|
231
|
+
it('emits formstate event on every submit-state change', async () => {
|
|
232
|
+
host.innerHTML = `
|
|
233
|
+
<schmancy-form>
|
|
234
|
+
<schmancy-input name="x" value="ok"></schmancy-input>
|
|
235
|
+
<schmancy-button type="submit">Send</schmancy-button>
|
|
236
|
+
</schmancy-form>
|
|
237
|
+
`
|
|
238
|
+
const sf = host.querySelector('schmancy-form') as SchmancyForm
|
|
239
|
+
await nextUpdate()
|
|
240
|
+
await nextUpdate()
|
|
241
|
+
const events: Array<{ status: string; submitCount: number }> = []
|
|
242
|
+
sf.addEventListener('formstate', (e: Event) => {
|
|
243
|
+
const d = (e as CustomEvent<{ status: string; submitCount: number }>).detail
|
|
244
|
+
events.push({ status: d.status, submitCount: d.submitCount })
|
|
245
|
+
})
|
|
246
|
+
const btn = host.querySelector('schmancy-button[type=submit]') as HTMLElement
|
|
247
|
+
btn.click()
|
|
248
|
+
await nextUpdate()
|
|
249
|
+
await nextUpdate()
|
|
250
|
+
await nextUpdate()
|
|
251
|
+
const statuses = events.map(e => e.status)
|
|
252
|
+
// At minimum: submitting → success transitions for a successful submit.
|
|
253
|
+
expect(statuses).toContain('submitting')
|
|
254
|
+
expect(statuses).toContain('success')
|
|
255
|
+
})
|
|
256
|
+
|
|
257
|
+
it('clearSubmitted() resets the submitted flag without clearing values', async () => {
|
|
258
|
+
host.innerHTML = `
|
|
259
|
+
<schmancy-form>
|
|
260
|
+
<schmancy-input name="email" required></schmancy-input>
|
|
261
|
+
<schmancy-button type="submit">Send</schmancy-button>
|
|
262
|
+
</schmancy-form>
|
|
263
|
+
`
|
|
264
|
+
const sf = host.querySelector('schmancy-form') as SchmancyForm
|
|
265
|
+
const inp = host.querySelector('schmancy-input') as HTMLElement & {
|
|
266
|
+
value: string
|
|
267
|
+
submitted: boolean
|
|
268
|
+
error: boolean
|
|
269
|
+
updateComplete: Promise<boolean>
|
|
270
|
+
}
|
|
271
|
+
await inp.updateComplete
|
|
272
|
+
await nextUpdate()
|
|
273
|
+
|
|
274
|
+
// Fail submit so submitted flag flips and error is displayed.
|
|
275
|
+
const btn = host.querySelector('schmancy-button[type=submit]') as HTMLElement
|
|
276
|
+
btn.click()
|
|
277
|
+
await nextUpdate()
|
|
278
|
+
await nextUpdate()
|
|
279
|
+
expect(inp.submitted).toBe(true)
|
|
280
|
+
expect(inp.error).toBe(true)
|
|
281
|
+
|
|
282
|
+
// Type something so the field is dirty.
|
|
283
|
+
inp.value = 'me@example.com'
|
|
284
|
+
await nextUpdate()
|
|
285
|
+
await nextUpdate()
|
|
286
|
+
|
|
287
|
+
// Step "back" — clearSubmitted resets the submit-driven mode but
|
|
288
|
+
// leaves dirty/value/touched alone.
|
|
289
|
+
sf.clearSubmitted()
|
|
290
|
+
await nextUpdate()
|
|
291
|
+
await nextUpdate()
|
|
292
|
+
expect(inp.submitted).toBe(false)
|
|
293
|
+
expect(inp.value).toBe('me@example.com') // value preserved
|
|
294
|
+
expect(sf.matches(':state(idle)')).toBe(true)
|
|
295
|
+
})
|
|
296
|
+
|
|
297
|
+
it('setFieldError sets custom validity and forces error display', async () => {
|
|
298
|
+
host.innerHTML = `
|
|
299
|
+
<schmancy-form>
|
|
300
|
+
<schmancy-input name="email" value="x@y.z"></schmancy-input>
|
|
301
|
+
</schmancy-form>
|
|
302
|
+
`
|
|
303
|
+
const sf = host.querySelector('schmancy-form') as SchmancyForm
|
|
304
|
+
const inp = host.querySelector('schmancy-input') as HTMLElement & {
|
|
305
|
+
error: boolean
|
|
306
|
+
validationMessage: string
|
|
307
|
+
submitted: boolean
|
|
308
|
+
}
|
|
309
|
+
await nextUpdate()
|
|
310
|
+
await nextUpdate()
|
|
311
|
+
|
|
312
|
+
const ok = sf.setFieldError('email', 'Server says: email is taken')
|
|
313
|
+
await nextUpdate()
|
|
314
|
+
await nextUpdate()
|
|
315
|
+
|
|
316
|
+
expect(ok).toBe(true)
|
|
317
|
+
expect(inp.validationMessage).toBe('Server says: email is taken')
|
|
318
|
+
expect(inp.submitted).toBe(true)
|
|
319
|
+
})
|
|
137
320
|
})
|