@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
|
@@ -3,9 +3,9 @@ import { customElement, property, query } 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 } from 'rxjs'
|
|
6
|
+
import { distinctUntilChanged, filter, fromEvent, map, takeUntil, timer } from 'rxjs'
|
|
7
7
|
import style from './textarea.scss?inline'
|
|
8
|
-
import {
|
|
8
|
+
import { SchmancyFormField } from '@mixins/index'
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Textarea component with auto-resize and form integration.
|
|
@@ -20,38 +20,21 @@ import { SchmancyElement } from '@mixins/index'
|
|
|
20
20
|
* @prop {number} maxlength - Maximum character length
|
|
21
21
|
*/
|
|
22
22
|
@customElement('schmancy-textarea')
|
|
23
|
-
export default class SchmancyTextarea extends
|
|
24
|
-
static styles = [unsafeCSS(style)];
|
|
23
|
+
export default class SchmancyTextarea extends SchmancyFormField(unsafeCSS(style)) {
|
|
25
24
|
|
|
26
25
|
protected static shadowRootOptions = {
|
|
27
26
|
...LitElement.shadowRootOptions,
|
|
28
27
|
delegatesFocus: true,
|
|
29
28
|
}
|
|
30
|
-
|
|
31
|
-
//
|
|
32
|
-
|
|
29
|
+
|
|
30
|
+
// `formAssociated`, `internals`, `name`, `label`, `required`, `disabled`,
|
|
31
|
+
// `error`, `validationMessage`, `hint`, `id`, `validateOn`, `touched`,
|
|
32
|
+
// `dirty`, `submitted`, `markTouched`, `markSubmitted`, `setCustomValidity`,
|
|
33
|
+
// `formResetCallback`, `formDisabledCallback` — all from the mixin.
|
|
33
34
|
textareaRef = createRef<HTMLTextAreaElement>()
|
|
34
35
|
|
|
35
36
|
private readonly _a11yId = `schmancy-textarea-${Math.random().toString(36).slice(2, 10)}`
|
|
36
37
|
|
|
37
|
-
/**
|
|
38
|
-
* The label of the control.
|
|
39
|
-
* @attr
|
|
40
|
-
* @type {string} label
|
|
41
|
-
* @default ''
|
|
42
|
-
* @public
|
|
43
|
-
*/
|
|
44
|
-
@property() label = ''
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* The name of the control.
|
|
48
|
-
* @attr name
|
|
49
|
-
* @type {string} name
|
|
50
|
-
* @default 'name_' + Date.now()
|
|
51
|
-
* @public
|
|
52
|
-
*/
|
|
53
|
-
@property() name = 'name_' + Date.now()
|
|
54
|
-
|
|
55
38
|
/**
|
|
56
39
|
* The placeholder of the control.
|
|
57
40
|
* @attr placeholder
|
|
@@ -62,13 +45,11 @@ export default class SchmancyTextarea extends SchmancyElement {
|
|
|
62
45
|
@property() placeholder = ''
|
|
63
46
|
|
|
64
47
|
/**
|
|
65
|
-
* The value of the control.
|
|
48
|
+
* The value of the control. Narrowed from the mixin's wide union to the
|
|
49
|
+
* textarea-specific `string` type.
|
|
66
50
|
* @attr {string} value - The value of the control.
|
|
67
|
-
* @type {string}
|
|
68
|
-
* @default ''
|
|
69
|
-
* @public
|
|
70
51
|
*/
|
|
71
|
-
@property({ type: String, reflect: true })
|
|
52
|
+
@property({ type: String, reflect: true }) override value: string = ''
|
|
72
53
|
|
|
73
54
|
/**
|
|
74
55
|
* The minlength attribute of the control.
|
|
@@ -148,19 +129,14 @@ export default class SchmancyTextarea extends SchmancyElement {
|
|
|
148
129
|
*/
|
|
149
130
|
@property({ type: String }) dirname: string | undefined
|
|
150
131
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
@property({ type: Boolean, reflect: true }) readonly = false
|
|
132
|
+
// `required`, `disabled`, `readonly`, `error`, `validationMessage`, `hint`
|
|
133
|
+
// come from the mixin. Textarea-specific extras only:
|
|
154
134
|
@property({ type: Boolean, reflect: true }) spellcheck = false
|
|
155
135
|
|
|
156
136
|
@property({ type: String, reflect: true }) align: 'left' | 'center' | 'right' = 'left'
|
|
157
137
|
|
|
158
138
|
/**
|
|
159
139
|
* The autofocus attribute of the control.
|
|
160
|
-
* @attr
|
|
161
|
-
* @type {boolean}
|
|
162
|
-
* @default false
|
|
163
|
-
* @public
|
|
164
140
|
*/
|
|
165
141
|
@property({ type: Boolean })
|
|
166
142
|
public override autofocus!: boolean
|
|
@@ -170,54 +146,33 @@ export default class SchmancyTextarea extends SchmancyElement {
|
|
|
170
146
|
|
|
171
147
|
@query('textarea') textareaElement!: HTMLTextAreaElement
|
|
172
148
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
super()
|
|
179
|
-
try {
|
|
180
|
-
this.internals = this.attachInternals()
|
|
181
|
-
} catch {
|
|
182
|
-
this.internals = undefined
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
protected willUpdate(changed: PropertyValues): void {
|
|
187
|
-
super.willUpdate?.(changed)
|
|
188
|
-
if (changed.has('value') || changed.has('name')) {
|
|
189
|
-
this.internals?.setFormValue(this.value ?? '')
|
|
190
|
-
}
|
|
149
|
+
// Mixin's willUpdate already calls internals.setFormValue() on value-change
|
|
150
|
+
// and runs the required-empty / customError validity machinery. Native
|
|
151
|
+
// `valueMissing` flag is set here for richer ValidityState introspection.
|
|
152
|
+
override willUpdate(changed: PropertyValues): void {
|
|
153
|
+
super.willUpdate(changed)
|
|
191
154
|
if (changed.has('required') || changed.has('value')) {
|
|
192
155
|
if (this.required && !this.value) {
|
|
193
156
|
this.internals?.setValidity({ valueMissing: true }, 'Please fill out this field.')
|
|
194
|
-
} else {
|
|
195
|
-
this.internals?.setValidity({})
|
|
196
157
|
}
|
|
197
158
|
}
|
|
198
159
|
}
|
|
199
160
|
|
|
200
|
-
formResetCallback(): void {
|
|
201
|
-
this.value = this.getAttribute('value') ?? ''
|
|
202
|
-
this.error = false
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
formDisabledCallback(disabled: boolean): void {
|
|
206
|
-
this.disabled = disabled
|
|
207
|
-
}
|
|
208
|
-
|
|
209
161
|
firstUpdated() {
|
|
210
162
|
if (this.autofocus) {
|
|
211
163
|
this.focus()
|
|
212
164
|
}
|
|
213
165
|
if (this.autoHeight) {
|
|
214
|
-
// Initial adjustment for pre-filled content
|
|
215
|
-
|
|
166
|
+
// Initial adjustment for pre-filled content (cancel-on-disconnect).
|
|
167
|
+
timer(0)
|
|
168
|
+
.pipe(takeUntil(this.disconnecting))
|
|
169
|
+
.subscribe(() => this.adjustHeight())
|
|
216
170
|
}
|
|
217
171
|
fromEvent(this.textareaElement, 'input')
|
|
218
172
|
.pipe(
|
|
219
173
|
map(event => (event.target as HTMLTextAreaElement).value),
|
|
220
174
|
distinctUntilChanged(),
|
|
175
|
+
takeUntil(this.disconnecting),
|
|
221
176
|
)
|
|
222
177
|
.subscribe(value => {
|
|
223
178
|
this.value = value
|
|
@@ -236,6 +191,7 @@ export default class SchmancyTextarea extends SchmancyElement {
|
|
|
236
191
|
.pipe(
|
|
237
192
|
map(event => (event.target as HTMLTextAreaElement).value),
|
|
238
193
|
distinctUntilChanged(),
|
|
194
|
+
takeUntil(this.disconnecting),
|
|
239
195
|
)
|
|
240
196
|
.subscribe(value => {
|
|
241
197
|
this.value = value
|
|
@@ -256,6 +212,7 @@ export default class SchmancyTextarea extends SchmancyElement {
|
|
|
256
212
|
filter(event => event.key === 'Enter'),
|
|
257
213
|
map(event => (event.target as HTMLTextAreaElement).value),
|
|
258
214
|
distinctUntilChanged(),
|
|
215
|
+
takeUntil(this.disconnecting),
|
|
259
216
|
)
|
|
260
217
|
.subscribe(value => {
|
|
261
218
|
this.value = value
|
|
@@ -434,15 +391,19 @@ export default class SchmancyTextarea extends SchmancyElement {
|
|
|
434
391
|
dirname=${ifDefined(this.dirname)}
|
|
435
392
|
aria-invalid=${this.error ? 'true' : 'false'}
|
|
436
393
|
aria-required=${this.required ? 'true' : 'false'}
|
|
437
|
-
aria-describedby=${this.hint ? hintId : nothing}
|
|
394
|
+
aria-describedby=${this.hint || (this.error && this.validationMessage) ? hintId : nothing}
|
|
438
395
|
aria-label=${!this.label && this.placeholder ? this.placeholder : nothing}
|
|
439
396
|
></textarea>
|
|
440
397
|
|
|
441
398
|
${when(
|
|
442
|
-
this.hint,
|
|
399
|
+
this.hint || (this.error && this.validationMessage),
|
|
443
400
|
() => html`
|
|
444
|
-
<div
|
|
445
|
-
|
|
401
|
+
<div
|
|
402
|
+
id=${hintId}
|
|
403
|
+
class="mt-1 text-sm ${this.error ? 'text-error-default' : 'text-surface-onVariant'}"
|
|
404
|
+
role=${ifDefined(this.error ? 'alert' : undefined)}
|
|
405
|
+
>
|
|
406
|
+
${this.error && this.validationMessage ? this.validationMessage : this.hint}
|
|
446
407
|
</div>
|
|
447
408
|
`,
|
|
448
409
|
)}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Form-level submit state — consumed by `<schmancy-form>` and any descendant
|
|
3
|
+
* (e.g. `<schmancy-button type="submit">` to drive its loading/aria-busy).
|
|
4
|
+
*
|
|
5
|
+
* `<schmancy-form>` wraps its render output in `<schmancy-context
|
|
6
|
+
* .provides=${[formSubmitState]}>` so each instance gets an isolated copy
|
|
7
|
+
* via the schmancy state library's resolveContextual mechanism. Reads of
|
|
8
|
+
* `formSubmitState.value` and writes via `formSubmitState.set(...)` inside
|
|
9
|
+
* the form's subtree resolve to the per-form copy automatically — no
|
|
10
|
+
* `@lit/context` plumbing in user code.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { state } from '../state'
|
|
14
|
+
|
|
15
|
+
export type FormError = {
|
|
16
|
+
message: string
|
|
17
|
+
code?: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export type FormSubmitState = {
|
|
21
|
+
status: 'idle' | 'submitting' | 'success' | 'error'
|
|
22
|
+
error: FormError | null
|
|
23
|
+
/** Increments on every submit attempt — RHF parity. */
|
|
24
|
+
submitCount: number
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const formSubmitState = state<FormSubmitState>('schmancy/form-submit').memory({
|
|
28
|
+
status: 'idle',
|
|
29
|
+
error: null,
|
|
30
|
+
submitCount: 0,
|
|
31
|
+
})
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest'
|
|
2
|
+
import './form'
|
|
3
|
+
import './form-summary'
|
|
4
|
+
import './fields/input/input'
|
|
5
|
+
import '../button/button'
|
|
6
|
+
import { expectNoA11yViolations } from '../test-utils/a11y'
|
|
7
|
+
import type SchmancyForm from './form'
|
|
8
|
+
|
|
9
|
+
const nextUpdate = () => new Promise(r => requestAnimationFrame(() => r(null)))
|
|
10
|
+
|
|
11
|
+
describe('schmancy-form-summary', () => {
|
|
12
|
+
let host: HTMLDivElement
|
|
13
|
+
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
host = document.createElement('div')
|
|
16
|
+
document.body.appendChild(host)
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
host.remove()
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
it('renders nothing when form is idle', async () => {
|
|
24
|
+
host.innerHTML = `
|
|
25
|
+
<schmancy-form>
|
|
26
|
+
<schmancy-form-summary></schmancy-form-summary>
|
|
27
|
+
<schmancy-input name="email" required></schmancy-input>
|
|
28
|
+
</schmancy-form>
|
|
29
|
+
`
|
|
30
|
+
await nextUpdate()
|
|
31
|
+
await nextUpdate()
|
|
32
|
+
const summary = host.querySelector('schmancy-form-summary') as HTMLElement
|
|
33
|
+
expect(summary.shadowRoot?.querySelector('[role="alert"]')).toBeNull()
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
it('renders banner with heading + form message after setFormError', async () => {
|
|
37
|
+
host.innerHTML = `
|
|
38
|
+
<schmancy-form>
|
|
39
|
+
<schmancy-form-summary></schmancy-form-summary>
|
|
40
|
+
<schmancy-input name="email" required></schmancy-input>
|
|
41
|
+
</schmancy-form>
|
|
42
|
+
`
|
|
43
|
+
const sf = host.querySelector('schmancy-form') as SchmancyForm
|
|
44
|
+
await nextUpdate()
|
|
45
|
+
await nextUpdate()
|
|
46
|
+
sf.setFormError('Network error — please try again.')
|
|
47
|
+
await nextUpdate()
|
|
48
|
+
await nextUpdate()
|
|
49
|
+
await nextUpdate()
|
|
50
|
+
const summary = host.querySelector('schmancy-form-summary') as HTMLElement
|
|
51
|
+
const banner = summary.shadowRoot?.querySelector('[role="alert"]') as HTMLElement
|
|
52
|
+
expect(banner).toBeTruthy()
|
|
53
|
+
expect(banner.textContent).toContain('Network error')
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
it('lists invalid field links after a failed submit', async () => {
|
|
57
|
+
host.innerHTML = `
|
|
58
|
+
<schmancy-form>
|
|
59
|
+
<schmancy-form-summary></schmancy-form-summary>
|
|
60
|
+
<schmancy-input name="email" label="Email" required></schmancy-input>
|
|
61
|
+
<schmancy-input name="city" label="City" required></schmancy-input>
|
|
62
|
+
<schmancy-button type="submit">Send</schmancy-button>
|
|
63
|
+
</schmancy-form>
|
|
64
|
+
`
|
|
65
|
+
const btn = host.querySelector('schmancy-button[type=submit]') as HTMLElement
|
|
66
|
+
await nextUpdate()
|
|
67
|
+
await nextUpdate()
|
|
68
|
+
btn.click()
|
|
69
|
+
// Wait long enough for: form submit chain → markSubmitted → field
|
|
70
|
+
// updates → live region populated → MutationObserver fired → form-summary
|
|
71
|
+
// re-render.
|
|
72
|
+
await new Promise(r => setTimeout(r, 200))
|
|
73
|
+
const summary = host.querySelector('schmancy-form-summary') as HTMLElement & {
|
|
74
|
+
updateComplete: Promise<boolean>
|
|
75
|
+
}
|
|
76
|
+
await summary.updateComplete
|
|
77
|
+
|
|
78
|
+
// Diagnostic: confirm fields actually report :state(invalid).
|
|
79
|
+
const fields = host.querySelectorAll('schmancy-input')
|
|
80
|
+
const invalidCount = Array.from(fields).filter(f => f.matches(':state(invalid)')).length
|
|
81
|
+
expect(invalidCount).toBe(2) // sanity — fields are flagged
|
|
82
|
+
|
|
83
|
+
const links = summary.shadowRoot?.querySelectorAll('a') ?? []
|
|
84
|
+
expect(links.length).toBe(2)
|
|
85
|
+
expect((links[0] as HTMLAnchorElement).textContent).toContain('Email')
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
it('has no axe-core a11y violations in error state', async () => {
|
|
89
|
+
host.innerHTML = `
|
|
90
|
+
<schmancy-form>
|
|
91
|
+
<schmancy-form-summary></schmancy-form-summary>
|
|
92
|
+
<schmancy-input name="email" label="Email" required></schmancy-input>
|
|
93
|
+
<schmancy-button type="submit">Send</schmancy-button>
|
|
94
|
+
</schmancy-form>
|
|
95
|
+
`
|
|
96
|
+
const sf = host.querySelector('schmancy-form') as SchmancyForm
|
|
97
|
+
await nextUpdate()
|
|
98
|
+
await nextUpdate()
|
|
99
|
+
sf.setFormError('Server is down')
|
|
100
|
+
await nextUpdate()
|
|
101
|
+
await nextUpdate()
|
|
102
|
+
await nextUpdate()
|
|
103
|
+
await expectNoA11yViolations(host)
|
|
104
|
+
})
|
|
105
|
+
})
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<schmancy-form-summary>` — top-of-form error summary with anchor links to
|
|
3
|
+
* each invalid field. Linear / GOV.UK / GitHub pattern.
|
|
4
|
+
*
|
|
5
|
+
* Drop one inside any `<schmancy-form>`; on submit-failure or when
|
|
6
|
+
* `<schmancy-form>.setFormError(...)` is called, the summary renders a
|
|
7
|
+
* `role="alert"` banner with the form-level error message and a list of
|
|
8
|
+
* links pointing at each invalid field's `id`.
|
|
9
|
+
*
|
|
10
|
+
* Hidden when the form is idle, submitting, or successful — only `error`
|
|
11
|
+
* populates it.
|
|
12
|
+
*
|
|
13
|
+
* @element schmancy-form-summary
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { html, nothing } from 'lit'
|
|
17
|
+
import { customElement, property, state } from 'lit/decorators.js'
|
|
18
|
+
import { SchmancyElement } from '../../mixins'
|
|
19
|
+
import type SchmancyForm from './form'
|
|
20
|
+
|
|
21
|
+
@customElement('schmancy-form-summary')
|
|
22
|
+
export class SchmancyFormSummary extends SchmancyElement {
|
|
23
|
+
/**
|
|
24
|
+
* Optional heading text. Defaults to a count-based summary
|
|
25
|
+
* ("1 problem with this form" / "3 problems with this form").
|
|
26
|
+
*/
|
|
27
|
+
@property({ type: String }) heading?: string
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Render bumper — incremented to force a re-render when the form's state
|
|
31
|
+
* changes (the actual content is computed from the DOM in render()).
|
|
32
|
+
*/
|
|
33
|
+
@state() private _bump: number = 0
|
|
34
|
+
|
|
35
|
+
private _form: SchmancyForm | null = null
|
|
36
|
+
private _formObserver?: MutationObserver
|
|
37
|
+
|
|
38
|
+
override connectedCallback(): void {
|
|
39
|
+
super.connectedCallback()
|
|
40
|
+
this._form = this.closest('schmancy-form') as SchmancyForm | null
|
|
41
|
+
if (!this._form) {
|
|
42
|
+
console.error('[schmancy-form-summary] must be a descendant of <schmancy-form>')
|
|
43
|
+
return
|
|
44
|
+
}
|
|
45
|
+
const bump = () => { this._bump++ }
|
|
46
|
+
this._formObserver = new MutationObserver(bump)
|
|
47
|
+
// Form host attribute changes (aria-busy, :state class reflections,
|
|
48
|
+
// descendant attribute changes for fields' aria-invalid). subtree:true
|
|
49
|
+
// catches attribute mutations on every descendant including light-DOM
|
|
50
|
+
// fields and the form's own host.
|
|
51
|
+
this._formObserver.observe(this._form, {
|
|
52
|
+
attributes: true,
|
|
53
|
+
subtree: true,
|
|
54
|
+
})
|
|
55
|
+
// Defer live-region observation until the form has rendered its
|
|
56
|
+
// shadow tree.
|
|
57
|
+
const attachLiveRegionObserver = async (): Promise<void> => {
|
|
58
|
+
await this._form?.updateComplete
|
|
59
|
+
const liveRegion = this._form?.shadowRoot?.querySelector('[role="status"]')
|
|
60
|
+
if (liveRegion) {
|
|
61
|
+
this._formObserver?.observe(liveRegion, {
|
|
62
|
+
childList: true,
|
|
63
|
+
characterData: true,
|
|
64
|
+
subtree: true,
|
|
65
|
+
})
|
|
66
|
+
}
|
|
67
|
+
// Force a render so the initial state is reflected.
|
|
68
|
+
this._bump++
|
|
69
|
+
}
|
|
70
|
+
void attachLiveRegionObserver()
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
override disconnectedCallback(): void {
|
|
74
|
+
this._formObserver?.disconnect()
|
|
75
|
+
this._formObserver = undefined
|
|
76
|
+
super.disconnectedCallback()
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
private _readFormStatus(): 'idle' | 'submitting' | 'success' | 'error' {
|
|
80
|
+
if (!this._form) return 'idle'
|
|
81
|
+
if (this._form.matches(':state(error)')) return 'error'
|
|
82
|
+
if (this._form.matches(':state(submitting)')) return 'submitting'
|
|
83
|
+
if (this._form.matches(':state(success)')) return 'success'
|
|
84
|
+
return 'idle'
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
private _readFormMessage(): string {
|
|
88
|
+
const liveRegion = this._form?.shadowRoot?.querySelector('[role="status"]')
|
|
89
|
+
return liveRegion?.textContent?.trim() ?? ''
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private _readInvalidFields(): Array<{ id: string; label: string; message: string }> {
|
|
93
|
+
if (!this._form) return []
|
|
94
|
+
const result: Array<{ id: string; label: string; message: string }> = []
|
|
95
|
+
for (const el of Array.from(this._form.querySelectorAll('*'))) {
|
|
96
|
+
if (!(el instanceof HTMLElement)) continue
|
|
97
|
+
let isInvalid = false
|
|
98
|
+
try {
|
|
99
|
+
isInvalid = el.matches(':state(invalid)')
|
|
100
|
+
} catch {
|
|
101
|
+
continue
|
|
102
|
+
}
|
|
103
|
+
if (!isInvalid) continue
|
|
104
|
+
const f = el as HTMLElement & {
|
|
105
|
+
label?: string
|
|
106
|
+
name?: string
|
|
107
|
+
validationMessage?: string
|
|
108
|
+
}
|
|
109
|
+
result.push({
|
|
110
|
+
id: f.id,
|
|
111
|
+
label: f.label || f.name || '(field)',
|
|
112
|
+
message: f.validationMessage || 'Invalid value',
|
|
113
|
+
})
|
|
114
|
+
}
|
|
115
|
+
return result
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
render() {
|
|
119
|
+
// Read everything fresh from the DOM each render — no @state cache, no
|
|
120
|
+
// re-render loops. The MutationObserver bumps `_bump` to trigger this
|
|
121
|
+
// render; `_bump` itself is never read here.
|
|
122
|
+
void this._bump
|
|
123
|
+
|
|
124
|
+
const status = this._readFormStatus()
|
|
125
|
+
if (status !== 'error') return nothing
|
|
126
|
+
|
|
127
|
+
const formMessage = this._readFormMessage()
|
|
128
|
+
const invalid = this._readInvalidFields()
|
|
129
|
+
const count = invalid.length
|
|
130
|
+
const heading =
|
|
131
|
+
this.heading ??
|
|
132
|
+
(count === 0
|
|
133
|
+
? 'There is a problem with this form'
|
|
134
|
+
: `There ${count === 1 ? 'is' : 'are'} ${count} problem${count === 1 ? '' : 's'} with this form`)
|
|
135
|
+
|
|
136
|
+
return html`
|
|
137
|
+
<div role="alert" aria-labelledby="schmancy-form-summary-heading">
|
|
138
|
+
<h2 id="schmancy-form-summary-heading">${heading}</h2>
|
|
139
|
+
${formMessage ? html`<p>${formMessage}</p>` : nothing}
|
|
140
|
+
${count > 0
|
|
141
|
+
? html`
|
|
142
|
+
<ul>
|
|
143
|
+
${invalid.map(
|
|
144
|
+
f => html`
|
|
145
|
+
<li>
|
|
146
|
+
<a
|
|
147
|
+
href="#${f.id}"
|
|
148
|
+
@click=${(e: MouseEvent) => this._jumpToField(e, f.id)}
|
|
149
|
+
>${f.label}: ${f.message}</a>
|
|
150
|
+
</li>
|
|
151
|
+
`,
|
|
152
|
+
)}
|
|
153
|
+
</ul>
|
|
154
|
+
`
|
|
155
|
+
: nothing}
|
|
156
|
+
</div>
|
|
157
|
+
`
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
private _jumpToField(e: MouseEvent, fieldId: string): void {
|
|
161
|
+
e.preventDefault()
|
|
162
|
+
const target = this._form?.querySelector(`#${CSS.escape(fieldId)}`) as HTMLElement | null
|
|
163
|
+
target?.focus()
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
declare global {
|
|
168
|
+
interface HTMLElementTagNameMap {
|
|
169
|
+
'schmancy-form-summary': SchmancyFormSummary
|
|
170
|
+
}
|
|
171
|
+
}
|