@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.
Files changed (572) hide show
  1. package/custom-elements.json +2554 -3086
  2. package/dist/active-host-BP0zy_Y9.js +63 -0
  3. package/dist/{active-host-CvNYoprt.js.map → active-host-BP0zy_Y9.js.map} +1 -1
  4. package/dist/active-host-jH3iloCR.cjs +1 -0
  5. package/dist/{active-host-CcIa2tmW.cjs.map → active-host-jH3iloCR.cjs.map} +1 -1
  6. package/dist/agent/flow-CvG1fLW5.js.map +1 -1
  7. package/dist/agent/schmancy.agent.js +5694 -5500
  8. package/dist/agent/schmancy.agent.js.map +1 -1
  9. package/dist/agent/schmancy.manifest.json +971 -1189
  10. package/dist/agent/vendor-material-color-DcL7ZPxx.js.map +1 -1
  11. package/dist/{animation-CO_Csq84.cjs.map → animation-CCOIW4wJ.cjs.map} +1 -1
  12. package/dist/{animation-BK-8BwY8.js.map → animation-DCznELuT.js.map} +1 -1
  13. package/dist/{area-C_kgZZhN.js → area-ChxsDTu_.js} +2 -2
  14. package/dist/{area-C_kgZZhN.js.map → area-ChxsDTu_.js.map} +1 -1
  15. package/dist/{area-DFPtKzWy.cjs → area-Qt6yUnuA.cjs} +3 -3
  16. package/dist/{area-DFPtKzWy.cjs.map → area-Qt6yUnuA.cjs.map} +1 -1
  17. package/dist/area.cjs +1 -1
  18. package/dist/area.js +2 -2
  19. package/dist/{audio-CluX8Qpq.cjs → audio-D-TZzpXF.cjs} +1 -1
  20. package/dist/{audio-CluX8Qpq.cjs.map → audio-D-TZzpXF.cjs.map} +1 -1
  21. package/dist/{audio-DcXphulJ.js → audio-DS43uoRA.js} +1 -1
  22. package/dist/{audio-DcXphulJ.js.map → audio-DS43uoRA.js.map} +1 -1
  23. package/dist/audio.cjs +1 -1
  24. package/dist/audio.js +2 -2
  25. package/dist/{autocomplete-DWSuwSRS.js → autocomplete-CXvUjMD-.js} +46 -71
  26. package/dist/autocomplete-CXvUjMD-.js.map +1 -0
  27. package/dist/autocomplete-Ck2zbdF9.cjs +115 -0
  28. package/dist/autocomplete-Ck2zbdF9.cjs.map +1 -0
  29. package/dist/autocomplete.cjs +1 -1
  30. package/dist/autocomplete.js +1 -1
  31. package/dist/avatar.cjs +2 -2
  32. package/dist/avatar.cjs.map +1 -1
  33. package/dist/avatar.js +3 -3
  34. package/dist/avatar.js.map +1 -1
  35. package/dist/badge.cjs +1 -1
  36. package/dist/badge.js +1 -1
  37. package/dist/{boat-CZma2ojF.js → boat-Bj0wVcZi.js} +5 -5
  38. package/dist/{boat-CZma2ojF.js.map → boat-Bj0wVcZi.js.map} +1 -1
  39. package/dist/{boat-Dy6cc3hB.cjs → boat-DpFkILFF.cjs} +2 -2
  40. package/dist/{boat-Dy6cc3hB.cjs.map → boat-DpFkILFF.cjs.map} +1 -1
  41. package/dist/boat.cjs +1 -1
  42. package/dist/boat.js +1 -1
  43. package/dist/breadcrumb.cjs +3 -3
  44. package/dist/breadcrumb.cjs.map +1 -1
  45. package/dist/breadcrumb.js +2 -2
  46. package/dist/breadcrumb.js.map +1 -1
  47. package/dist/{busy-DCsqryvq.cjs → busy-CtcnclA3.cjs} +3 -3
  48. package/dist/{busy-DCsqryvq.cjs.map → busy-CtcnclA3.cjs.map} +1 -1
  49. package/dist/{busy-DeV2ByMw.js → busy-CyZSBnZP.js} +2 -2
  50. package/dist/{busy-DeV2ByMw.js.map → busy-CyZSBnZP.js.map} +1 -1
  51. package/dist/busy.cjs +1 -1
  52. package/dist/busy.js +1 -1
  53. package/dist/button.cjs +4 -4
  54. package/dist/button.cjs.map +1 -1
  55. package/dist/button.js +19 -4
  56. package/dist/button.js.map +1 -1
  57. package/dist/{card--GgSX4X5.cjs → card-Cl6jp1yX.cjs} +5 -5
  58. package/dist/{card--GgSX4X5.cjs.map → card-Cl6jp1yX.cjs.map} +1 -1
  59. package/dist/{card-BTTsHzJJ.js → card-nYZCKmOO.js} +3 -3
  60. package/dist/{card-BTTsHzJJ.js.map → card-nYZCKmOO.js.map} +1 -1
  61. package/dist/card.cjs +1 -1
  62. package/dist/card.js +1 -1
  63. package/dist/{checkbox-NNReP9s_.cjs → checkbox-BeNo0ZGt.cjs} +4 -4
  64. package/dist/{checkbox-Cj5j-ppk.js.map → checkbox-BeNo0ZGt.cjs.map} +1 -1
  65. package/dist/{checkbox-Cj5j-ppk.js → checkbox-DiUrZiyc.js} +17 -30
  66. package/dist/checkbox-DiUrZiyc.js.map +1 -0
  67. package/dist/checkbox.cjs +1 -1
  68. package/dist/checkbox.js +1 -1
  69. package/dist/{chips-CP-CbfoZ.js → chips-CfPFXv7Z.js} +5 -5
  70. package/dist/{chips-CP-CbfoZ.js.map → chips-CfPFXv7Z.js.map} +1 -1
  71. package/dist/{chips-iporOXxK.cjs → chips-DK6m-VCM.cjs} +5 -5
  72. package/dist/{chips-iporOXxK.cjs.map → chips-DK6m-VCM.cjs.map} +1 -1
  73. package/dist/chips.cjs +1 -1
  74. package/dist/chips.js +2 -2
  75. package/dist/connectivity.cjs +2 -2
  76. package/dist/connectivity.cjs.map +1 -1
  77. package/dist/connectivity.js +3 -3
  78. package/dist/connectivity.js.map +1 -1
  79. package/dist/content-drawer.cjs +1 -1
  80. package/dist/content-drawer.js +1 -1
  81. package/dist/{context-DJTJnSK4.js.map → context-6oXCZmZN.js.map} +1 -1
  82. package/dist/{context-BpCETidA.cjs.map → context-CRZeiCqq.cjs.map} +1 -1
  83. package/dist/{cursor-glow-Bulq-38P.cjs → cursor-glow-C8LgCxpI.cjs} +1 -1
  84. package/dist/{cursor-glow-Bulq-38P.cjs.map → cursor-glow-C8LgCxpI.cjs.map} +1 -1
  85. package/dist/{cursor-glow-Ah7VXSj7.js → cursor-glow-Cs2XLDB9.js} +1 -1
  86. package/dist/{cursor-glow-Ah7VXSj7.js.map → cursor-glow-Cs2XLDB9.js.map} +1 -1
  87. package/dist/date-range-DA6anfcF.cjs +131 -0
  88. package/dist/date-range-DA6anfcF.cjs.map +1 -0
  89. package/dist/{date-range-CgNujP8r.js → date-range-DjlF2u7o.js} +124 -89
  90. package/dist/date-range-DjlF2u7o.js.map +1 -0
  91. package/dist/date-range-inline-BfYK795W.cjs +43 -0
  92. package/dist/{date-range-inline-D4IjOOO0.cjs.map → date-range-inline-BfYK795W.cjs.map} +1 -1
  93. package/dist/{date-range-inline-C2PXX_GY.js → date-range-inline-n7y_H6PJ.js} +2 -2
  94. package/dist/{date-range-inline-C2PXX_GY.js.map → date-range-inline-n7y_H6PJ.js.map} +1 -1
  95. package/dist/date-range-inline.cjs +1 -1
  96. package/dist/date-range-inline.js +1 -1
  97. package/dist/date-range.cjs +1 -1
  98. package/dist/date-range.js +1 -1
  99. package/dist/delay.cjs +2 -2
  100. package/dist/delay.cjs.map +1 -1
  101. package/dist/delay.js +3 -3
  102. package/dist/delay.js.map +1 -1
  103. package/dist/{details-DT2b3xOn.cjs → details-BdAVsLl-.cjs} +2 -2
  104. package/dist/{details-DT2b3xOn.cjs.map → details-BdAVsLl-.cjs.map} +1 -1
  105. package/dist/{details-VjaNwtfd.js → details-CS_ToAOj.js} +6 -6
  106. package/dist/{details-VjaNwtfd.js.map → details-CS_ToAOj.js.map} +1 -1
  107. package/dist/details.cjs +1 -1
  108. package/dist/details.js +1 -1
  109. package/dist/directives.cjs +1 -1
  110. package/dist/directives.cjs.map +1 -1
  111. package/dist/directives.js +5 -5
  112. package/dist/directives.js.map +1 -1
  113. package/dist/discovery.js.map +1 -1
  114. package/dist/{divider-BMO8pzEO.js → divider-COLK0RbT.js} +2 -2
  115. package/dist/{divider-BMO8pzEO.js.map → divider-COLK0RbT.js.map} +1 -1
  116. package/dist/{divider-BW33TZ-X.cjs → divider-CvWAnvdO.cjs} +2 -2
  117. package/dist/{divider-BW33TZ-X.cjs.map → divider-CvWAnvdO.cjs.map} +1 -1
  118. package/dist/divider.cjs +1 -1
  119. package/dist/divider.js +1 -1
  120. package/dist/dropdown.cjs +3 -3
  121. package/dist/dropdown.cjs.map +1 -1
  122. package/dist/dropdown.js +2 -2
  123. package/dist/dropdown.js.map +1 -1
  124. package/dist/{expand-DbELKKOt.js → expand-D9LzmpoV.js} +5 -5
  125. package/dist/{expand-DbELKKOt.js.map → expand-D9LzmpoV.js.map} +1 -1
  126. package/dist/{expand-_f5EUKWB.cjs → expand-r2sATPUJ.cjs} +3 -3
  127. package/dist/{expand-_f5EUKWB.cjs.map → expand-r2sATPUJ.cjs.map} +1 -1
  128. package/dist/expand.cjs +1 -1
  129. package/dist/expand.js +1 -1
  130. package/dist/float-2nHYuBx-.cjs +1 -0
  131. package/dist/{float-CKmd-0-t.cjs.map → float-2nHYuBx-.cjs.map} +1 -1
  132. package/dist/{float-B6RBb2dN.js → float-BWy39CXr.js} +2 -2
  133. package/dist/{float-B6RBb2dN.js.map → float-BWy39CXr.js.map} +1 -1
  134. package/dist/float.cjs +1 -1
  135. package/dist/float.js +1 -1
  136. package/dist/form-D1iJOLVb.js +267 -0
  137. package/dist/form-D1iJOLVb.js.map +1 -0
  138. package/dist/form-D9K1GhlP.cjs +42 -0
  139. package/dist/form-D9K1GhlP.cjs.map +1 -0
  140. package/dist/form.cjs +1 -1
  141. package/dist/form.js +9 -2
  142. package/dist/handover/agent-runtime-followups.md +1 -1
  143. package/dist/handover/agent-runtime-v1.md +3 -3
  144. package/dist/{hashContent-Bobsobip.cjs.map → hashContent-Ck6laKlk.cjs.map} +1 -1
  145. package/dist/{hashContent-BU6jl5ih.js.map → hashContent-dJrI-9sc.js.map} +1 -1
  146. package/dist/{icons-r-S17M8U.cjs → icons-BXp4vbnW.cjs} +2 -2
  147. package/dist/{icons-r-S17M8U.cjs.map → icons-BXp4vbnW.cjs.map} +1 -1
  148. package/dist/{icons-CoDo95Cu.js → icons-COrlmBPB.js} +3 -3
  149. package/dist/{icons-CoDo95Cu.js.map → icons-COrlmBPB.js.map} +1 -1
  150. package/dist/icons.cjs +1 -1
  151. package/dist/icons.js +1 -1
  152. package/dist/{iframe-P9c_qg1-.cjs → iframe-BwXj6mLp.cjs} +2 -2
  153. package/dist/{iframe-P9c_qg1-.cjs.map → iframe-BwXj6mLp.cjs.map} +1 -1
  154. package/dist/{iframe-k4oI-TIj.js → iframe-CPNsIy7k.js} +2 -2
  155. package/dist/{iframe-k4oI-TIj.js.map → iframe-CPNsIy7k.js.map} +1 -1
  156. package/dist/iframe.cjs +1 -1
  157. package/dist/iframe.js +1 -1
  158. package/dist/index.cjs +1 -1
  159. package/dist/index.js +60 -60
  160. package/dist/input-BGrF2qVq.cjs +52 -0
  161. package/dist/input-BGrF2qVq.cjs.map +1 -0
  162. package/dist/{input-D95GjINh.js → input-C1SnMNuQ.js} +103 -104
  163. package/dist/input-C1SnMNuQ.js.map +1 -0
  164. package/dist/{input-chip-DpC_XEKN.js → input-chip-CtQ0pH5b.js} +2 -2
  165. package/dist/{input-chip-DpC_XEKN.js.map → input-chip-CtQ0pH5b.js.map} +1 -1
  166. package/dist/{input-chip-D0ZXqTt5.cjs → input-chip-DZktYohr.cjs} +2 -2
  167. package/dist/{input-chip-D0ZXqTt5.cjs.map → input-chip-DZktYohr.cjs.map} +1 -1
  168. package/dist/input.cjs +1 -1
  169. package/dist/input.js +1 -1
  170. package/dist/json.cjs +2 -2
  171. package/dist/json.cjs.map +1 -1
  172. package/dist/json.js +3 -3
  173. package/dist/json.js.map +1 -1
  174. package/dist/kbd.cjs +2 -2
  175. package/dist/kbd.cjs.map +1 -1
  176. package/dist/kbd.js +2 -2
  177. package/dist/kbd.js.map +1 -1
  178. package/dist/{layout-CXPNsUIo.js → layout-BH28sKGc.js} +1 -1
  179. package/dist/{layout-CXPNsUIo.js.map → layout-BH28sKGc.js.map} +1 -1
  180. package/dist/{layout-Zhe7wSZ_.cjs → layout-Delq-QvR.cjs} +1 -1
  181. package/dist/{layout-Zhe7wSZ_.cjs.map → layout-Delq-QvR.cjs.map} +1 -1
  182. package/dist/layout.cjs +1 -1
  183. package/dist/layout.js +1 -1
  184. package/dist/{lazy-Dq9mRRjT.cjs.map → lazy-CayEFyC3.cjs.map} +1 -1
  185. package/dist/{lazy-B0ia54tT.js.map → lazy-D-bO2r4m.js.map} +1 -1
  186. package/dist/{lightbox-CovQtmyn.js → lightbox-CLwpaiai.js} +9 -9
  187. package/dist/{lightbox-CovQtmyn.js.map → lightbox-CLwpaiai.js.map} +1 -1
  188. package/dist/{lightbox-C-yHeoK0.cjs → lightbox-Ck6BpN5u.cjs} +3 -3
  189. package/dist/{lightbox-C-yHeoK0.cjs.map → lightbox-Ck6BpN5u.cjs.map} +1 -1
  190. package/dist/lightbox.cjs +1 -1
  191. package/dist/lightbox.js +1 -1
  192. package/dist/{list-C1pR9vhu.js → list-Bmce1Rb8.js} +2 -2
  193. package/dist/{list-C1pR9vhu.js.map → list-Bmce1Rb8.js.map} +1 -1
  194. package/dist/{list-CAijuky4.cjs → list-EmRwSpTU.cjs} +3 -3
  195. package/dist/{list-CAijuky4.cjs.map → list-EmRwSpTU.cjs.map} +1 -1
  196. package/dist/list.cjs +1 -1
  197. package/dist/list.js +1 -1
  198. package/dist/{magnetic-BJgB1dVi.cjs → magnetic-Bgh7aHHI.cjs} +1 -1
  199. package/dist/{magnetic-BJgB1dVi.cjs.map → magnetic-Bgh7aHHI.cjs.map} +1 -1
  200. package/dist/{magnetic-YwCNvtbB.js → magnetic-DxvoEz8_.js} +2 -2
  201. package/dist/{magnetic-YwCNvtbB.js.map → magnetic-DxvoEz8_.js.map} +1 -1
  202. package/dist/{menu-B59vZv9n.js → menu-BA_B7QOG.js} +3 -3
  203. package/dist/{menu-B59vZv9n.js.map → menu-BA_B7QOG.js.map} +1 -1
  204. package/dist/{menu-BaHO3Cip.cjs → menu-BTU3wGP6.cjs} +3 -3
  205. package/dist/{menu-BaHO3Cip.cjs.map → menu-BTU3wGP6.cjs.map} +1 -1
  206. package/dist/menu.cjs +1 -1
  207. package/dist/menu.js +1 -1
  208. package/dist/mixins-BOOu6q2n.cjs +298 -0
  209. package/dist/mixins-BOOu6q2n.cjs.map +1 -0
  210. package/dist/mixins-BWb9_e1s.js +680 -0
  211. package/dist/mixins-BWb9_e1s.js.map +1 -0
  212. package/dist/mixins.cjs +1 -1
  213. package/dist/mixins.js +2 -2
  214. package/dist/nav-drawer.cjs +1 -1
  215. package/dist/nav-drawer.js +1 -1
  216. package/dist/navigation-bar.cjs +1 -1
  217. package/dist/navigation-bar.js +1 -1
  218. package/dist/navigation-rail.cjs +3 -3
  219. package/dist/navigation-rail.cjs.map +1 -1
  220. package/dist/navigation-rail.js +2 -2
  221. package/dist/navigation-rail.js.map +1 -1
  222. package/dist/notification-CliGbcfU.cjs +23 -0
  223. package/dist/{notification-BC9nG8Sr.cjs.map → notification-CliGbcfU.cjs.map} +1 -1
  224. package/dist/{notification-BeLoVa47.js → notification-R2_Mf1HR.js} +4 -4
  225. package/dist/{notification-BeLoVa47.js.map → notification-R2_Mf1HR.js.map} +1 -1
  226. package/dist/notification.cjs +1 -1
  227. package/dist/notification.js +1 -1
  228. package/dist/{option-UvlSAcC4.js → option-DU1X4SDu.js} +2 -2
  229. package/dist/{option-UvlSAcC4.js.map → option-DU1X4SDu.js.map} +1 -1
  230. package/dist/{option-BWF4GBp-.cjs → option-Db98Ndzv.cjs} +2 -2
  231. package/dist/{option-BWF4GBp-.cjs.map → option-Db98Ndzv.cjs.map} +1 -1
  232. package/dist/option.cjs +1 -1
  233. package/dist/option.js +1 -1
  234. package/dist/{overlay-stack-DCDS17uj.js.map → overlay-stack-BR4iYivO.js.map} +1 -1
  235. package/dist/{overlay-stack-DPIe_aYv.cjs.map → overlay-stack-Dk0xETTy.cjs.map} +1 -1
  236. package/dist/overlay.cjs +2 -2
  237. package/dist/overlay.cjs.map +1 -1
  238. package/dist/{overlay.confirm-body-URtE1gI3.cjs → overlay.confirm-body-BkhNvr0c.cjs} +2 -2
  239. package/dist/{overlay.confirm-body-URtE1gI3.cjs.map → overlay.confirm-body-BkhNvr0c.cjs.map} +1 -1
  240. package/dist/{overlay.confirm-body-9W0B5QGv.js → overlay.confirm-body-uFp-0Zfh.js} +2 -2
  241. package/dist/{overlay.confirm-body-9W0B5QGv.js.map → overlay.confirm-body-uFp-0Zfh.js.map} +1 -1
  242. package/dist/overlay.js +8 -8
  243. package/dist/overlay.js.map +1 -1
  244. package/dist/{overlay.service-DnZTcKyJ.cjs → overlay.service-1YWfUD2S.cjs} +1 -1
  245. package/dist/{overlay.service-DnZTcKyJ.cjs.map → overlay.service-1YWfUD2S.cjs.map} +1 -1
  246. package/dist/{overlay.service-CVqs2Gu1.js → overlay.service-BcF12kGb.js} +2 -2
  247. package/dist/{overlay.service-CVqs2Gu1.js.map → overlay.service-BcF12kGb.js.map} +1 -1
  248. package/dist/page.cjs +2 -2
  249. package/dist/page.cjs.map +1 -1
  250. package/dist/page.js +5 -5
  251. package/dist/page.js.map +1 -1
  252. package/dist/{progress-C29Uw-WJ.js → progress-C9Y2D5cm.js} +2 -2
  253. package/dist/{progress-C29Uw-WJ.js.map → progress-C9Y2D5cm.js.map} +1 -1
  254. package/dist/{progress-CwzwY8Oe.cjs → progress-DiVTGAXa.cjs} +2 -2
  255. package/dist/{progress-CwzwY8Oe.cjs.map → progress-DiVTGAXa.cjs.map} +1 -1
  256. package/dist/progress.cjs +1 -1
  257. package/dist/progress.js +1 -1
  258. package/dist/{radio-group-CW8airhZ.js → radio-group-CAzjBI2n.js} +4 -4
  259. package/dist/radio-group-CAzjBI2n.js.map +1 -0
  260. package/dist/radio-group-DIRJyYv6.cjs +40 -0
  261. package/dist/radio-group-DIRJyYv6.cjs.map +1 -0
  262. package/dist/radio-group.cjs +1 -1
  263. package/dist/radio-group.js +1 -1
  264. package/dist/range.cjs +6 -4
  265. package/dist/range.cjs.map +1 -1
  266. package/dist/range.js +19 -15
  267. package/dist/range.js.map +1 -1
  268. package/dist/{reduced-motion-D-L12p7G.js.map → reduced-motion-D7LqTUMn.js.map} +1 -1
  269. package/dist/{reduced-motion-Ds-HjMzn.cjs.map → reduced-motion-Dzfp_w5x.cjs.map} +1 -1
  270. package/dist/{rxjs-utils-DCUHg_Ml.cjs.map → rxjs-utils-BKB2UM_j.cjs.map} +1 -1
  271. package/dist/{rxjs-utils-CVeJQ9KG.js.map → rxjs-utils-Dv9T9IpA.js.map} +1 -1
  272. package/dist/rxjs-utils.cjs +1 -1
  273. package/dist/rxjs-utils.js +1 -1
  274. package/dist/{scroll-BotoGcMU.js → scroll-BFHUtZOa.js} +2 -2
  275. package/dist/{scroll-BotoGcMU.js.map → scroll-BFHUtZOa.js.map} +1 -1
  276. package/dist/{scroll-CmhmUebp.cjs → scroll-nIZyoEMt.cjs} +2 -2
  277. package/dist/{scroll-CmhmUebp.cjs.map → scroll-nIZyoEMt.cjs.map} +1 -1
  278. package/dist/{search-BLCRsxIC.cjs.map → search-DPKoC-dT.cjs.map} +1 -1
  279. package/dist/{search-BTz7-Rev.js.map → search-MvIBA93K.js.map} +1 -1
  280. package/dist/{select-Dbn-CImU.js → select-7WqaUWBU.js} +52 -73
  281. package/dist/select-7WqaUWBU.js.map +1 -0
  282. package/dist/select-DTuf6p6T.cjs +56 -0
  283. package/dist/select-DTuf6p6T.cjs.map +1 -0
  284. package/dist/select.cjs +1 -1
  285. package/dist/select.js +1 -1
  286. package/dist/skeleton.cjs +2 -2
  287. package/dist/skeleton.cjs.map +1 -1
  288. package/dist/skeleton.js +2 -2
  289. package/dist/skeleton.js.map +1 -1
  290. package/dist/skills/SKILL.md +3 -0
  291. package/dist/skills/autocomplete.md +16 -3
  292. package/dist/skills/button.md +19 -0
  293. package/dist/skills/checkbox.md +19 -0
  294. package/dist/skills/date-range.md +19 -0
  295. package/dist/skills/form-ux-rules.md +55 -0
  296. package/dist/skills/form.md +121 -25
  297. package/dist/skills/input.md +19 -4
  298. package/dist/skills/range.md +15 -1
  299. package/dist/skills/schmancy/SKILL.md +3 -0
  300. package/dist/skills/schmancy/autocomplete.md +16 -3
  301. package/dist/skills/schmancy/button.md +19 -0
  302. package/dist/skills/schmancy/checkbox.md +19 -0
  303. package/dist/skills/schmancy/date-range.md +19 -0
  304. package/dist/skills/schmancy/form-ux-rules.md +55 -0
  305. package/dist/skills/schmancy/form.md +121 -25
  306. package/dist/skills/schmancy/input.md +19 -4
  307. package/dist/skills/schmancy/range.md +15 -1
  308. package/dist/skills/schmancy/select.md +13 -1
  309. package/dist/skills/schmancy/switch.md +21 -2
  310. package/dist/skills/schmancy/textarea.md +13 -0
  311. package/dist/skills/select.md +13 -1
  312. package/dist/skills/switch.md +21 -2
  313. package/dist/skills/textarea.md +13 -0
  314. package/dist/slider.cjs +3 -3
  315. package/dist/slider.cjs.map +1 -1
  316. package/dist/slider.js +2 -2
  317. package/dist/slider.js.map +1 -1
  318. package/dist/{sound.service-kKfsN0m-.js → sound.service-BIN2W7Rv.js} +1 -1
  319. package/dist/{sound.service-kKfsN0m-.js.map → sound.service-BIN2W7Rv.js.map} +1 -1
  320. package/dist/{sound.service-BGs6m0Cm.cjs → sound.service-DyY78ukR.cjs} +1 -1
  321. package/dist/{sound.service-BGs6m0Cm.cjs.map → sound.service-DyY78ukR.cjs.map} +1 -1
  322. package/dist/{splash-screen-DtkjCJYo.js → splash-screen-BcjjJSlK.js} +2 -2
  323. package/dist/{splash-screen-DtkjCJYo.js.map → splash-screen-BcjjJSlK.js.map} +1 -1
  324. package/dist/{splash-screen-DlQUv-kV.cjs → splash-screen-Kr1sPtME.cjs} +2 -2
  325. package/dist/{splash-screen-DlQUv-kV.cjs.map → splash-screen-Kr1sPtME.cjs.map} +1 -1
  326. package/dist/splash-screen.cjs +1 -1
  327. package/dist/splash-screen.js +1 -1
  328. package/dist/{src-DEUjlTsX.cjs → src-BbMJeLk9.cjs} +11 -11
  329. package/dist/{src-DEUjlTsX.cjs.map → src-BbMJeLk9.cjs.map} +1 -1
  330. package/dist/{src-D6e0adHi.js → src-DCu_mEk4.js} +40 -40
  331. package/dist/{src-D6e0adHi.js.map → src-DCu_mEk4.js.map} +1 -1
  332. package/dist/state-avic94Ft.cjs +1 -0
  333. package/dist/{state-DNdCPITt.cjs.map → state-avic94Ft.cjs.map} +1 -1
  334. package/dist/{state-BusMG6sM.js → state-nm8yzMPp.js} +1 -2
  335. package/dist/{state-BusMG6sM.js.map → state-nm8yzMPp.js.map} +1 -1
  336. package/dist/state.cjs +1 -1
  337. package/dist/state.js +2 -2
  338. package/dist/steps.cjs +3 -3
  339. package/dist/steps.cjs.map +1 -1
  340. package/dist/steps.js +2 -2
  341. package/dist/steps.js.map +1 -1
  342. package/dist/{surface-A82O1kgu.js → surface-BtMMHKol.js} +2 -2
  343. package/dist/{surface-A82O1kgu.js.map → surface-BtMMHKol.js.map} +1 -1
  344. package/dist/surface-CgXeKdGL.cjs +7 -0
  345. package/dist/{surface-BpppoNXN.cjs.map → surface-CgXeKdGL.cjs.map} +1 -1
  346. package/dist/surface.cjs +1 -1
  347. package/dist/surface.js +1 -1
  348. package/dist/switch.cjs +3 -3
  349. package/dist/switch.cjs.map +1 -1
  350. package/dist/switch.js +27 -43
  351. package/dist/switch.js.map +1 -1
  352. package/dist/table.cjs +3 -3
  353. package/dist/table.cjs.map +1 -1
  354. package/dist/table.js +2 -2
  355. package/dist/table.js.map +1 -1
  356. package/dist/{tabs-cVHHd1dY.js → tabs-81ADWQqa.js} +2 -2
  357. package/dist/{tabs-cVHHd1dY.js.map → tabs-81ADWQqa.js.map} +1 -1
  358. package/dist/{tabs-TO3UiBsm.cjs → tabs-DnG3K0bu.cjs} +2 -2
  359. package/dist/{tabs-TO3UiBsm.cjs.map → tabs-DnG3K0bu.cjs.map} +1 -1
  360. package/dist/tabs.cjs +1 -1
  361. package/dist/tabs.js +1 -1
  362. package/dist/teleport.cjs +1 -1
  363. package/dist/teleport.js +1 -1
  364. package/dist/textarea-3mWewuAf.js +186 -0
  365. package/dist/textarea-3mWewuAf.js.map +1 -0
  366. package/dist/textarea-BenjiTXB.cjs +43 -0
  367. package/dist/textarea-BenjiTXB.cjs.map +1 -0
  368. package/dist/textarea.cjs +1 -1
  369. package/dist/textarea.js +1 -1
  370. package/dist/{theme-CT408FqH.js → theme-CFPJW933.js} +9 -9
  371. package/dist/{theme-CT408FqH.js.map → theme-CFPJW933.js.map} +1 -1
  372. package/dist/theme-DNymrucy.cjs +181 -0
  373. package/dist/{theme-CpuF3D3q.cjs.map → theme-DNymrucy.cjs.map} +1 -1
  374. package/dist/{theme-button-pTb5-Wxx.js → theme-button-DC_shZ_7.js} +2 -2
  375. package/dist/{theme-button-pTb5-Wxx.js.map → theme-button-DC_shZ_7.js.map} +1 -1
  376. package/dist/theme-button-ENKa3TPT.cjs +8 -0
  377. package/dist/{theme-button-B6Xf-EiH.cjs.map → theme-button-ENKa3TPT.cjs.map} +1 -1
  378. package/dist/theme-button.cjs +1 -1
  379. package/dist/theme-button.js +1 -1
  380. package/dist/theme.cjs +1 -1
  381. package/dist/{theme.interface-B9TjbSBF.js.map → theme.interface-C2XNgsLB.js.map} +1 -1
  382. package/dist/{theme.interface-BujperTo.cjs.map → theme.interface-D4NeufQA.cjs.map} +1 -1
  383. package/dist/theme.js +4 -4
  384. package/dist/{theme.service-DIUo1mBP.js → theme.service-BOWIT_5k.js} +1 -1
  385. package/dist/{theme.service-DIUo1mBP.js.map → theme.service-BOWIT_5k.js.map} +1 -1
  386. package/dist/{theme.service-Cfk88qHK.cjs → theme.service-DkdH1t60.cjs} +1 -1
  387. package/dist/{theme.service-Cfk88qHK.cjs.map → theme.service-DkdH1t60.cjs.map} +1 -1
  388. package/dist/tooltip.js.map +1 -1
  389. package/dist/tree.cjs +2 -2
  390. package/dist/tree.cjs.map +1 -1
  391. package/dist/tree.js +2 -2
  392. package/dist/tree.js.map +1 -1
  393. package/dist/types.js.map +1 -1
  394. package/dist/typewriter.cjs.map +1 -1
  395. package/dist/typewriter.js.map +1 -1
  396. package/dist/typography.cjs +2 -2
  397. package/dist/typography.cjs.map +1 -1
  398. package/dist/typography.js +2 -2
  399. package/dist/typography.js.map +1 -1
  400. package/dist/{utils-kND2Z9Xg.js → utils-Cj_nRRyx.js} +2 -2
  401. package/dist/{utils-kND2Z9Xg.js.map → utils-Cj_nRRyx.js.map} +1 -1
  402. package/dist/{utils-Dt5PpmaQ.cjs → utils-D2QUu4-g.cjs} +1 -1
  403. package/dist/{utils-Dt5PpmaQ.cjs.map → utils-D2QUu4-g.cjs.map} +1 -1
  404. package/dist/utils.cjs +1 -1
  405. package/dist/utils.js +4 -4
  406. package/dist/visually-hidden.cjs +2 -2
  407. package/dist/visually-hidden.cjs.map +1 -1
  408. package/dist/visually-hidden.js +2 -2
  409. package/dist/visually-hidden.js.map +1 -1
  410. package/dist/{window-CuBcOxbc.js → window-BTecgE_U.js} +7 -7
  411. package/dist/{window-CuBcOxbc.js.map → window-BTecgE_U.js.map} +1 -1
  412. package/dist/{window-CSKvv4Ts.cjs → window-DGydMS0g.cjs} +2 -2
  413. package/dist/{window-CSKvv4Ts.cjs.map → window-DGydMS0g.cjs.map} +1 -1
  414. package/dist/window.cjs +1 -1
  415. package/dist/window.js +1 -1
  416. package/package.json +1 -1
  417. package/skills/schmancy/SKILL.md +3 -0
  418. package/skills/schmancy/autocomplete.md +16 -3
  419. package/skills/schmancy/button.md +19 -0
  420. package/skills/schmancy/checkbox.md +19 -0
  421. package/skills/schmancy/date-range.md +19 -0
  422. package/skills/schmancy/form-ux-rules.md +55 -0
  423. package/skills/schmancy/form.md +121 -25
  424. package/skills/schmancy/input.md +19 -4
  425. package/skills/schmancy/range.md +15 -1
  426. package/skills/schmancy/select.md +13 -1
  427. package/skills/schmancy/switch.md +21 -2
  428. package/skills/schmancy/textarea.md +13 -0
  429. package/src/button/button.test.ts +122 -0
  430. package/src/button/button.ts +36 -0
  431. package/src/{autocomplete → form/fields/autocomplete}/autocomplete.ts +48 -75
  432. package/src/{checkbox → form/fields/checkbox}/checkbox.test.ts +1 -1
  433. package/src/form/fields/checkbox/checkbox.ts +126 -0
  434. package/src/form/fields/date-range/date-range.test.ts +102 -0
  435. package/src/{date-range → form/fields/date-range}/date-range.ts +90 -7
  436. package/src/form/fields/index.ts +9 -0
  437. package/src/form/fields/input/input.test.ts +201 -0
  438. package/src/{input → form/fields/input}/input.ts +153 -238
  439. package/src/{radio-group → form/fields/radio-group}/radio-button.ts +1 -1
  440. package/src/{radio-group → form/fields/radio-group}/radio-group.ts +1 -1
  441. package/src/form/fields/range/range.test.ts +90 -0
  442. package/src/{range → form/fields/range}/range.ts +34 -13
  443. package/src/{select → form/fields/select}/select.ts +77 -108
  444. package/src/{switch → form/fields/switch}/switch.test.ts +1 -1
  445. package/src/{switch → form/fields/switch}/switch.ts +71 -51
  446. package/src/form/fields/textarea/textarea.test.ts +54 -0
  447. package/src/{textarea → form/fields/textarea}/textarea.ts +33 -72
  448. package/src/form/form-state.ts +31 -0
  449. package/src/form/form-summary.test.ts +105 -0
  450. package/src/form/form-summary.ts +171 -0
  451. package/src/form/form.test.ts +218 -35
  452. package/src/form/form.ts +330 -99
  453. package/src/form/index.ts +3 -0
  454. package/src/index.ts +9 -9
  455. package/types/mixins/formField.mixin.d.ts +90 -0
  456. package/types/src/button/button.d.ts +9 -0
  457. package/types/src/button/button.test.d.ts +3 -0
  458. package/types/src/{autocomplete → form/fields/autocomplete}/autocomplete.d.ts +6 -15
  459. package/types/src/form/fields/checkbox/checkbox.d.ts +47 -0
  460. package/types/src/{date-range → form/fields/date-range}/date-range.d.ts +22 -4
  461. package/types/src/form/fields/date-range/date-range.test.d.ts +1 -0
  462. package/types/src/form/fields/index.d.ts +9 -0
  463. package/types/src/{input → form/fields/input}/input.d.ts +20 -45
  464. package/types/src/form/fields/input/input.test.d.ts +1 -0
  465. package/types/src/{radio-group → form/fields/radio-group}/radio-button.d.ts +1 -1
  466. package/types/src/{radio-group → form/fields/radio-group}/radio-group.d.ts +1 -1
  467. package/types/src/form/fields/range/range.d.ts +28 -0
  468. package/types/src/form/fields/range/range.test.d.ts +1 -0
  469. package/types/src/{select → form/fields/select}/select.d.ts +23 -24
  470. package/types/src/form/fields/switch/switch.d.ts +57 -0
  471. package/types/src/{textarea → form/fields/textarea}/textarea.d.ts +6 -39
  472. package/types/src/form/fields/textarea/textarea.test.d.ts +1 -0
  473. package/types/src/form/form-state.d.ts +22 -0
  474. package/types/src/form/form-summary.d.ts +42 -0
  475. package/types/src/form/form-summary.test.d.ts +4 -0
  476. package/types/src/form/form.d.ts +79 -34
  477. package/types/src/form/form.test.d.ts +2 -2
  478. package/types/src/form/index.d.ts +3 -0
  479. package/types/src/index.d.ts +9 -9
  480. package/dist/active-host-CcIa2tmW.cjs +0 -1
  481. package/dist/active-host-CvNYoprt.js +0 -57
  482. package/dist/autocomplete-DWSuwSRS.js.map +0 -1
  483. package/dist/autocomplete-iCJOia-q.cjs +0 -115
  484. package/dist/autocomplete-iCJOia-q.cjs.map +0 -1
  485. package/dist/checkbox-NNReP9s_.cjs.map +0 -1
  486. package/dist/date-range-CaOxwZDq.cjs +0 -131
  487. package/dist/date-range-CaOxwZDq.cjs.map +0 -1
  488. package/dist/date-range-CgNujP8r.js.map +0 -1
  489. package/dist/date-range-inline-D4IjOOO0.cjs +0 -43
  490. package/dist/decorate-23nYs4Le.js +0 -7
  491. package/dist/decorate-DpFmy0nm.cjs +0 -1
  492. package/dist/float-CKmd-0-t.cjs +0 -1
  493. package/dist/form-CFvwnfuJ.js +0 -68
  494. package/dist/form-CFvwnfuJ.js.map +0 -1
  495. package/dist/form-Ceijw1aA.cjs +0 -1
  496. package/dist/form-Ceijw1aA.cjs.map +0 -1
  497. package/dist/input-D95GjINh.js.map +0 -1
  498. package/dist/input-D9s4jDAb.cjs +0 -51
  499. package/dist/input-D9s4jDAb.cjs.map +0 -1
  500. package/dist/mixins-BV0w2yIE.js +0 -627
  501. package/dist/mixins-BV0w2yIE.js.map +0 -1
  502. package/dist/mixins-DvAYa-F7.cjs +0 -298
  503. package/dist/mixins-DvAYa-F7.cjs.map +0 -1
  504. package/dist/notification-BC9nG8Sr.cjs +0 -23
  505. package/dist/radio-group-ByMD6Lsj.cjs +0 -40
  506. package/dist/radio-group-ByMD6Lsj.cjs.map +0 -1
  507. package/dist/radio-group-CW8airhZ.js.map +0 -1
  508. package/dist/select-BdBThja4.cjs +0 -56
  509. package/dist/select-BdBThja4.cjs.map +0 -1
  510. package/dist/select-Dbn-CImU.js.map +0 -1
  511. package/dist/state-DNdCPITt.cjs +0 -1
  512. package/dist/surface-BpppoNXN.cjs +0 -7
  513. package/dist/textarea-B9dy-yec.js +0 -211
  514. package/dist/textarea-B9dy-yec.js.map +0 -1
  515. package/dist/textarea-DFY0Flgv.cjs +0 -39
  516. package/dist/textarea-DFY0Flgv.cjs.map +0 -1
  517. package/dist/theme-CpuF3D3q.cjs +0 -181
  518. package/dist/theme-button-B6Xf-EiH.cjs +0 -8
  519. package/src/checkbox/checkbox.ts +0 -162
  520. package/types/src/checkbox/checkbox.d.ts +0 -71
  521. package/types/src/range/range.d.ts +0 -25
  522. package/types/src/switch/switch.d.ts +0 -53
  523. /package/dist/{animation-CO_Csq84.cjs → animation-CCOIW4wJ.cjs} +0 -0
  524. /package/dist/{animation-BK-8BwY8.js → animation-DCznELuT.js} +0 -0
  525. /package/dist/{context-DJTJnSK4.js → context-6oXCZmZN.js} +0 -0
  526. /package/dist/{context-BpCETidA.cjs → context-CRZeiCqq.cjs} +0 -0
  527. /package/dist/{hashContent-Bobsobip.cjs → hashContent-Ck6laKlk.cjs} +0 -0
  528. /package/dist/{hashContent-BU6jl5ih.js → hashContent-dJrI-9sc.js} +0 -0
  529. /package/dist/{lazy-Dq9mRRjT.cjs → lazy-CayEFyC3.cjs} +0 -0
  530. /package/dist/{lazy-B0ia54tT.js → lazy-D-bO2r4m.js} +0 -0
  531. /package/dist/{overlay-stack-DCDS17uj.js → overlay-stack-BR4iYivO.js} +0 -0
  532. /package/dist/{overlay-stack-DPIe_aYv.cjs → overlay-stack-Dk0xETTy.cjs} +0 -0
  533. /package/dist/{reduced-motion-D-L12p7G.js → reduced-motion-D7LqTUMn.js} +0 -0
  534. /package/dist/{reduced-motion-Ds-HjMzn.cjs → reduced-motion-Dzfp_w5x.cjs} +0 -0
  535. /package/dist/{rxjs-utils-DCUHg_Ml.cjs → rxjs-utils-BKB2UM_j.cjs} +0 -0
  536. /package/dist/{rxjs-utils-CVeJQ9KG.js → rxjs-utils-Dv9T9IpA.js} +0 -0
  537. /package/dist/{search-BLCRsxIC.cjs → search-DPKoC-dT.cjs} +0 -0
  538. /package/dist/{search-BTz7-Rev.js → search-MvIBA93K.js} +0 -0
  539. /package/dist/{theme.interface-B9TjbSBF.js → theme.interface-C2XNgsLB.js} +0 -0
  540. /package/dist/{theme.interface-BujperTo.cjs → theme.interface-D4NeufQA.cjs} +0 -0
  541. /package/src/{autocomplete → form/fields/autocomplete}/autocomplete.scss +0 -0
  542. /package/src/{autocomplete → form/fields/autocomplete}/index.ts +0 -0
  543. /package/src/{checkbox → form/fields/checkbox}/index.ts +0 -0
  544. /package/src/{date-range → form/fields/date-range}/date-range-dialog.ts +0 -0
  545. /package/src/{date-range → form/fields/date-range}/date-range-helpers.ts +0 -0
  546. /package/src/{date-range → form/fields/date-range}/date-range-presets.ts +0 -0
  547. /package/src/{date-range → form/fields/date-range}/date-utils.ts +0 -0
  548. /package/src/{date-range → form/fields/date-range}/index.ts +0 -0
  549. /package/src/{input → form/fields/input}/index.ts +0 -0
  550. /package/src/{input → form/fields/input}/input.scss +0 -0
  551. /package/src/{radio-group → form/fields/radio-group}/index.ts +0 -0
  552. /package/src/{radio-group → form/fields/radio-group}/radio-group.scss +0 -0
  553. /package/src/{range → form/fields/range}/index.ts +0 -0
  554. /package/src/{select → form/fields/select}/index.ts +0 -0
  555. /package/src/{switch → form/fields/switch}/index.ts +0 -0
  556. /package/src/{textarea → form/fields/textarea}/index.ts +0 -0
  557. /package/src/{textarea → form/fields/textarea}/textarea.scss +0 -0
  558. /package/types/src/{autocomplete → form/fields/autocomplete}/index.d.ts +0 -0
  559. /package/types/src/{checkbox → form/fields/checkbox}/checkbox.test.d.ts +0 -0
  560. /package/types/src/{checkbox → form/fields/checkbox}/index.d.ts +0 -0
  561. /package/types/src/{date-range → form/fields/date-range}/date-range-dialog.d.ts +0 -0
  562. /package/types/src/{date-range → form/fields/date-range}/date-range-helpers.d.ts +0 -0
  563. /package/types/src/{date-range → form/fields/date-range}/date-range-presets.d.ts +0 -0
  564. /package/types/src/{date-range → form/fields/date-range}/date-utils.d.ts +0 -0
  565. /package/types/src/{date-range → form/fields/date-range}/index.d.ts +0 -0
  566. /package/types/src/{input → form/fields/input}/index.d.ts +0 -0
  567. /package/types/src/{radio-group → form/fields/radio-group}/index.d.ts +0 -0
  568. /package/types/src/{range → form/fields/range}/index.d.ts +0 -0
  569. /package/types/src/{select → form/fields/select}/index.d.ts +0 -0
  570. /package/types/src/{switch → form/fields/switch}/index.d.ts +0 -0
  571. /package/types/src/{switch → form/fields/switch}/switch.test.d.ts +0 -0
  572. /package/types/src/{textarea → form/fields/textarea}/index.d.ts +0 -0
@@ -1,4 +1,4 @@
1
- import { SchmancyElement } from '@mixins/index'
1
+ import { SchmancyFormField } from '@mixins/index'
2
2
  import { InputSize, SchmancyInput } from '@schmancy/input'
3
3
  import SchmancyOption from '@schmancy/option/option'
4
4
  import { html, nothing, unsafeCSS } from 'lit'
@@ -10,21 +10,22 @@ import { repeat } from 'lit/directives/repeat.js'
10
10
  import { when } from 'lit/directives/when.js'
11
11
  import {
12
12
  BehaviorSubject,
13
- combineLatest
13
+ combineLatest,
14
+ fromEvent,
15
+ timer
14
16
  } from 'rxjs'
15
17
  import {
16
18
  debounceTime,
17
19
  distinctUntilChanged,
18
- take,
19
20
  takeUntil,
20
21
  tap
21
22
  } from 'rxjs/operators'
22
23
  import style from './autocomplete.scss?inline'
23
24
 
24
25
  // Import the similarity function (or include it inline)
25
- import { similarity } from '../utils/search'
26
+ import { similarity } from '../../../utils/search'
26
27
  // Import chip component for multi-select display
27
- import '../chips/input-chip'
28
+ import '../../../chips/input-chip'
28
29
 
29
30
  export type SchmancyAutocompleteChangeEvent = CustomEvent<{
30
31
  value: string | string[]
@@ -48,26 +49,16 @@ interface FilteredOption {
48
49
  * @prop {string[]} values - Selected values (multi-select mode)
49
50
  */
50
51
  @customElement('schmancy-autocomplete')
51
- export default class SchmancyAutocomplete extends SchmancyElement {
52
- static styles = [unsafeCSS(style)];
53
-
54
- static formAssociated = true
55
- internals: ElementInternals | undefined
56
-
57
- constructor() {
58
- super()
59
- try {
60
- this.internals = this.attachInternals()
61
- } catch {
62
- this.internals = undefined
63
- }
64
- }
52
+ export default class SchmancyAutocomplete extends SchmancyFormField(unsafeCSS(style)) {
65
53
 
66
- get form(): HTMLFormElement | null {
67
- return this.internals?.form ?? null
68
- }
54
+ // `formAssociated`, `internals`, `attachInternals`, `name`, `label`,
55
+ // `required`, `disabled`, `error`, `validationMessage`, `hint`, `id`,
56
+ // `validateOn`, `touched/dirty/submitted`, `markTouched/markSubmitted`,
57
+ // `setCustomValidity`, `formDisabledCallback`, FIELD_CONNECT_EVENT dispatch
58
+ // — all from the mixin.
69
59
 
70
- formResetCallback(): void {
60
+ /** Override mixin's resetForm with autocomplete-specific subject reset. */
61
+ override resetForm(): void {
71
62
  if (this.multi) {
72
63
  this._selectedValues$.next([])
73
64
  } else {
@@ -75,25 +66,16 @@ export default class SchmancyAutocomplete extends SchmancyElement {
75
66
  }
76
67
  this._inputValue = ''
77
68
  this._inputValue$.next('')
78
- this.error = false
79
- this.validationMessage = ''
80
- }
81
-
82
- formDisabledCallback(disabled: boolean): void {
83
- // The component does not expose a disabled prop directly; propagate via attribute.
84
- if (disabled) this.setAttribute('disabled', '')
85
- else this.removeAttribute('disabled')
69
+ super.resetForm()
86
70
  }
87
71
 
88
72
  // Track whether value/values have been explicitly set
89
73
  _valueSet: boolean = false
90
74
  _valuesSet: boolean = false
91
75
 
92
- // Public API properties
93
- @property({ type: Boolean }) required = false
76
+ // Autocomplete-specific properties only — `name`, `label`, `required`,
77
+ // `error`, `validationMessage` come from the mixin.
94
78
  @property({ type: String }) placeholder = ''
95
- @property({ type: String, reflect: true }) label = ''
96
- @property({ type: String }) name = ''
97
79
  @property({ type: String }) maxHeight = '300px'
98
80
  @property({ type: Boolean }) multi = false
99
81
  @property({ type: String }) description = ''
@@ -101,8 +83,6 @@ export default class SchmancyAutocomplete extends SchmancyElement {
101
83
  @property({ type: String }) autocomplete = 'off'
102
84
  @property({ type: Number }) debounceMs = 200
103
85
  @property({ type: Number }) similarityThreshold = 0.3 // Minimum similarity score to show option
104
- @property({ type: Boolean }) error = false
105
- @property({ type: String }) validationMessage = ''
106
86
 
107
87
  private readonly _a11yId = `schmancy-autocomplete-${Math.random().toString(36).slice(2, 10)}`
108
88
 
@@ -116,14 +96,14 @@ export default class SchmancyAutocomplete extends SchmancyElement {
116
96
  this._selectedValues$.next(Array.isArray(vals) ? [...vals] : [])
117
97
  }
118
98
 
119
- // Value property
99
+ // Value property — narrowed override of the mixin's wide value union.
120
100
  @property({ type: String, reflect: true })
121
- get value() {
122
- return this.multi
101
+ override get value(): string {
102
+ return this.multi
123
103
  ? this._selectedValues$.value.join(',')
124
104
  : this._selectedValue$.value
125
105
  }
126
- set value(val: string) {
106
+ override set value(val: string) {
127
107
  this._valueSet = true
128
108
  if (this.multi) {
129
109
  const newValues = val ? val.split(',').map(v => v.trim()).filter(Boolean) : []
@@ -159,13 +139,9 @@ export default class SchmancyAutocomplete extends SchmancyElement {
159
139
  private _selectedValues$ = new BehaviorSubject<string[]>([])
160
140
  private _inputValue$ = new BehaviorSubject<string>('')
161
141
 
162
- connectedCallback() {
142
+ override connectedCallback() {
143
+ // FIELD_CONNECT_EVENT is dispatched by the mixin's connectedCallback.
163
144
  super.connectedCallback()
164
-
165
- if (!this.id) {
166
- this.id = `sch-autocomplete-${Math.random().toString(36).slice(2, 9)}`
167
- }
168
-
169
145
  this._setupAutocompleteLogic()
170
146
  this._setupDocumentClickHandler()
171
147
  }
@@ -218,15 +194,17 @@ export default class SchmancyAutocomplete extends SchmancyElement {
218
194
  option.dataset.schmancyAutocompleteHandlers = 'attached'
219
195
 
220
196
  // Prevent blur handler from interfering with option selection
221
- option.addEventListener('mousedown', (e: MouseEvent) => {
222
- e.preventDefault() // Prevent focus loss
223
- })
197
+ fromEvent<MouseEvent>(option, 'mousedown')
198
+ .pipe(takeUntil(this.disconnecting))
199
+ .subscribe(e => e.preventDefault())
224
200
 
225
201
  // Handle the actual selection
226
- option.addEventListener('click', (e: MouseEvent) => {
227
- e.stopPropagation()
228
- this._selectOption(option)
229
- })
202
+ fromEvent<MouseEvent>(option, 'click')
203
+ .pipe(takeUntil(this.disconnecting))
204
+ .subscribe(e => {
205
+ e.stopPropagation()
206
+ this._selectOption(option)
207
+ })
230
208
  })
231
209
  }
232
210
 
@@ -331,23 +309,16 @@ export default class SchmancyAutocomplete extends SchmancyElement {
331
309
  }
332
310
 
333
311
  private _setupDocumentClickHandler() {
334
- // Simple document click handler
335
- const handleDocumentClick = (e: MouseEvent) => {
336
- if (!this._open) return
337
-
338
- const path = e.composedPath()
339
- if (!path.includes(this) && !this._options.some(opt => path.includes(opt))) {
340
- this._open = false
341
- this._updateInputDisplay()
342
- }
343
- }
344
-
345
- document.addEventListener('click', handleDocumentClick)
346
-
347
- // Cleanup on disconnect
348
- this.disconnecting.pipe(take(1)).subscribe(() => {
349
- document.removeEventListener('click', handleDocumentClick)
350
- })
312
+ fromEvent<MouseEvent>(document, 'click')
313
+ .pipe(takeUntil(this.disconnecting))
314
+ .subscribe(e => {
315
+ if (!this._open) return
316
+ const path = e.composedPath()
317
+ if (!path.includes(this) && !this._options.some(opt => path.includes(opt))) {
318
+ this._open = false
319
+ this._updateInputDisplay()
320
+ }
321
+ })
351
322
  }
352
323
 
353
324
 
@@ -721,10 +692,12 @@ export default class SchmancyAutocomplete extends SchmancyElement {
721
692
  event.preventDefault()
722
693
  this._openDropdown()
723
694
 
724
- setTimeout(() => {
725
- const firstVisible = this._options.find(opt => !opt.hidden)
726
- firstVisible?.focus()
727
- }, 10)
695
+ timer(10)
696
+ .pipe(takeUntil(this.disconnecting))
697
+ .subscribe(() => {
698
+ const firstVisible = this._options.find(opt => !opt.hidden)
699
+ firstVisible?.focus()
700
+ })
728
701
  return
729
702
  }
730
703
 
@@ -1,5 +1,5 @@
1
1
  import { afterEach, beforeEach, describe, expect, it } from 'vitest'
2
- import { expectNoA11yViolations } from '../test-utils/a11y'
2
+ import { expectNoA11yViolations } from '../../../test-utils/a11y'
3
3
  import './checkbox'
4
4
 
5
5
  const nextUpdate = () => new Promise(r => requestAnimationFrame(() => r(null)))
@@ -0,0 +1,126 @@
1
+ import '@material/web/checkbox/checkbox.js'
2
+ import { html, LitElement, type PropertyValues } from 'lit'
3
+ import { customElement, property } from 'lit/decorators.js'
4
+ import { when } from 'lit/directives/when.js'
5
+ import { SchmancyFormField } from '@mixins/index'
6
+
7
+ export type schmancyCheckBoxChangeEvent = CustomEvent<{
8
+ value: boolean
9
+ }>
10
+
11
+ /**
12
+ * @element schmancy-checkbox
13
+ * @slot - The label for the checkbox.
14
+ * @fires change - Event fired when the checkbox value changes.
15
+ */
16
+ @customElement('schmancy-checkbox')
17
+ class SchmancyCheckboxElement extends SchmancyFormField() {
18
+ // Inner <md-checkbox> is the focusable surface; route host focus to it.
19
+ protected static shadowRootOptions = {
20
+ ...LitElement.shadowRootOptions,
21
+ delegatesFocus: true,
22
+ }
23
+
24
+ // FACE wiring (formAssociated, internals, attachInternals), `name`,
25
+ // `disabled`, `required`, `id`, `label`, `error`, `validationMessage`,
26
+ // `validateOn`, touched/dirty/submitted, markTouched/markSubmitted,
27
+ // FIELD_CONNECT_EVENT dispatch — all from the mixin.
28
+
29
+ /**
30
+ * Boolean checked state. Test contract: `cb.value = true` flips the state.
31
+ * The FormData *string* is read from `true-value` attribute (or `'on'`
32
+ * default) — kept separate from `value` to keep the boolean-state ergonomic.
33
+ */
34
+ @property({ type: Boolean, reflect: true })
35
+ override value: boolean = false
36
+
37
+ /** Alias for `value` for read-side ergonomics. */
38
+ @property({ type: Boolean })
39
+ get checked(): boolean {
40
+ return this.value
41
+ }
42
+ set checked(val: boolean) {
43
+ this.value = val
44
+ }
45
+
46
+ /**
47
+ * M3-aligned sizes: 24dp (xxs) → 32dp (xs) → 40dp (sm) → 48dp (md) → 56dp (lg).
48
+ */
49
+ @property({ type: String })
50
+ size: 'xxs' | 'xs' | 'sm' | 'md' | 'lg' = 'md'
51
+
52
+ private get _trueValue(): string {
53
+ return this.getAttribute('true-value') ?? 'on'
54
+ }
55
+
56
+ override willUpdate(changed: PropertyValues): void {
57
+ super.willUpdate(changed)
58
+ if (changed.has('value') || changed.has('name')) {
59
+ this.internals?.setFormValue(this.value ? this._trueValue : null)
60
+ if (this.value) this.internals?.states.add('checked')
61
+ else this.internals?.states.delete('checked')
62
+ this.checkValidity()
63
+ }
64
+ if (changed.has('required') || changed.has('disabled')) {
65
+ this.checkValidity()
66
+ }
67
+ }
68
+
69
+ /** Checkbox validity is `checked === true` when required. */
70
+ override checkValidity(): boolean {
71
+ if (this.disabled) {
72
+ this.internals?.setValidity({})
73
+ return true
74
+ }
75
+ const isValid = !this.required || this.value === true
76
+ const message = isValid ? '' : 'Please check this box if you want to proceed.'
77
+
78
+ this.internals?.setValidity(
79
+ isValid ? {} : { valueMissing: true },
80
+ isValid ? undefined : message,
81
+ )
82
+
83
+ if (this._shouldShowError()) {
84
+ this.error = !isValid
85
+ this.validationMessage = message
86
+ }
87
+ return isValid
88
+ }
89
+
90
+ /** Emit only when checked. */
91
+ override toFormEntries(): Array<[string, FormDataEntryValue]> {
92
+ if (!this.name || this.disabled || !this.value) return []
93
+ return [[this.name, this._trueValue]]
94
+ }
95
+
96
+ render() {
97
+ return html`
98
+ <label class="grid grid-flow-col items-center space-x-2 w-fit">
99
+ <md-checkbox
100
+ .required=${this.required}
101
+ .disabled=${this.disabled}
102
+ ?checked=${this.value === true}
103
+ @change=${(e: Event) => {
104
+ this.value = (e.target as HTMLInputElement).checked
105
+ this.markTouched()
106
+ this.emitChange({ value: this.value })
107
+ }}
108
+ >
109
+ </md-checkbox>
110
+ ${when(
111
+ this.label,
112
+ () => html`<span>${this.label}</span>`,
113
+ () => html`<slot></slot>`,
114
+ )}
115
+ </label>
116
+ `
117
+ }
118
+ }
119
+
120
+ export { SchmancyCheckboxElement as SchmancyCheckbox }
121
+
122
+ declare global {
123
+ interface HTMLElementTagNameMap {
124
+ 'schmancy-checkbox': SchmancyCheckboxElement
125
+ }
126
+ }
@@ -0,0 +1,102 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest'
2
+ import './date-range'
3
+ import { expectNoA11yViolations } from '../../../test-utils/a11y'
4
+
5
+ const nextUpdate = () => new Promise(r => requestAnimationFrame(() => r(null)))
6
+
7
+ describe('schmancy-date-range', () => {
8
+ let host: HTMLDivElement
9
+
10
+ beforeEach(() => {
11
+ host = document.createElement('div')
12
+ document.body.appendChild(host)
13
+ })
14
+
15
+ afterEach(() => {
16
+ host.remove()
17
+ })
18
+
19
+ it('contributes flat-suffix dateFrom/dateTo entries to FormData', async () => {
20
+ host.innerHTML = `
21
+ <form>
22
+ <schmancy-date-range name="window"></schmancy-date-range>
23
+ </form>
24
+ `
25
+ const form = host.querySelector('form') as HTMLFormElement
26
+ const dr = host.querySelector('schmancy-date-range') as HTMLElement & {
27
+ dateFrom: { label: string; value: string }
28
+ dateTo: { label: string; value: string }
29
+ }
30
+ await nextUpdate()
31
+ await nextUpdate()
32
+ dr.dateFrom = { label: 'From', value: '2026-01-01' }
33
+ dr.dateTo = { label: 'To', value: '2026-01-31' }
34
+ await nextUpdate()
35
+ await nextUpdate()
36
+ const fd = new FormData(form)
37
+ expect(fd.get('windowFrom')).toBe('2026-01-01')
38
+ expect(fd.get('windowTo')).toBe('2026-01-31')
39
+ })
40
+
41
+ it('omits from FormData when name is not set', async () => {
42
+ host.innerHTML = `<form><schmancy-date-range></schmancy-date-range></form>`
43
+ const form = host.querySelector('form') as HTMLFormElement
44
+ await nextUpdate()
45
+ expect([...new FormData(form).keys()]).toEqual([])
46
+ })
47
+
48
+ it('reports invalid when required and both dates empty', async () => {
49
+ host.innerHTML = `<form><schmancy-date-range name="w" required></schmancy-date-range></form>`
50
+ const form = host.querySelector('form') as HTMLFormElement
51
+ const dr = host.querySelector('schmancy-date-range') as HTMLElement & {
52
+ dateFrom: { label: string; value: string }
53
+ dateTo: { label: string; value: string }
54
+ checkValidity(): boolean
55
+ }
56
+ await nextUpdate()
57
+ await nextUpdate()
58
+ dr.dateFrom = { label: 'From', value: '' }
59
+ dr.dateTo = { label: 'To', value: '' }
60
+ await nextUpdate()
61
+ expect(dr.checkValidity()).toBe(false)
62
+ expect(form.checkValidity()).toBe(false)
63
+ dr.dateFrom = { label: 'From', value: '2026-01-01' }
64
+ dr.dateTo = { label: 'To', value: '2026-01-02' }
65
+ await nextUpdate()
66
+ await nextUpdate()
67
+ expect(dr.checkValidity()).toBe(true)
68
+ expect(form.checkValidity()).toBe(true)
69
+ })
70
+
71
+ it('has no axe-core a11y violations', async () => {
72
+ host.innerHTML = `<schmancy-date-range name="window"></schmancy-date-range>`
73
+ await nextUpdate()
74
+ await nextUpdate()
75
+ // Trigger button-group rendering with values populated.
76
+ const dr = host.querySelector('schmancy-date-range') as HTMLElement & {
77
+ dateFrom: { label: string; value: string }
78
+ dateTo: { label: string; value: string }
79
+ }
80
+ dr.dateFrom = { label: 'From', value: '2026-01-01' }
81
+ dr.dateTo = { label: 'To', value: '2026-01-31' }
82
+ await nextUpdate()
83
+ await nextUpdate()
84
+ await expectNoA11yViolations(host)
85
+ })
86
+
87
+ it('omits empty dates from FormData', async () => {
88
+ host.innerHTML = `<form><schmancy-date-range name="w"></schmancy-date-range></form>`
89
+ const form = host.querySelector('form') as HTMLFormElement
90
+ const dr = host.querySelector('schmancy-date-range') as HTMLElement & {
91
+ dateFrom: { label: string; value: string }
92
+ dateTo: { label: string; value: string }
93
+ }
94
+ await nextUpdate()
95
+ dr.dateFrom = { label: 'From', value: '' }
96
+ dr.dateTo = { label: 'To', value: '' }
97
+ await nextUpdate()
98
+ const fd = new FormData(form)
99
+ expect(fd.get('wFrom')).toBeNull()
100
+ expect(fd.get('wTo')).toBeNull()
101
+ })
102
+ })
@@ -1,10 +1,10 @@
1
- import { SchmancyElement } from '@mixins/index'
2
1
  import dayjs from 'dayjs'
3
2
  import quarterOfYear from 'dayjs/plugin/quarterOfYear'
4
3
  import { html, PropertyValues } from 'lit'
5
4
  import { customElement, property, state } from 'lit/decorators.js'
6
5
  import { fromEvent, Subscription, takeUntil, timer } from 'rxjs'
7
- import { show } from '../overlay/overlay.service'
6
+ import { SchmancyFormField } from '@mixins/index'
7
+ import { show } from '../../../overlay/overlay.service'
8
8
  import { detectDateRangeType, formatDateRange } from './date-range-helpers'
9
9
  import { DateRangePreset, generatePresetCategories, PresetCategory } from './date-range-presets'
10
10
  import { validateInitialDateRange } from './date-utils'
@@ -32,23 +32,23 @@ export type SchmancyDateRangeChangeEvent = CustomEvent<{
32
32
  * @fires change - Fired when the date range changes with dateFrom and dateTo values
33
33
  */
34
34
  @customElement('schmancy-date-range')
35
- export class SchmancyDateRange extends SchmancyElement {
36
- // Core properties
35
+ export class SchmancyDateRange extends SchmancyFormField() {
36
+ // `name`, `disabled`, `required`, `error`, `validationMessage`, `id`,
37
+ // `validateOn`, `touched`, `submitted`, `markTouched`, `markSubmitted`,
38
+ // FACE wiring, FIELD_CONNECT_EVENT dispatch — all from the mixin.
39
+
37
40
  @property({ type: String }) type: 'date' | 'datetime-local' = 'date'
38
41
  @property({ type: Object }) dateFrom: { label: string; value: string } = { label: 'From', value: '' }
39
42
  @property({ type: Object }) dateTo: { label: string; value: string } = { label: 'To', value: '' }
40
43
  @property({ type: String }) minDate?: string
41
44
  @property({ type: String }) maxDate?: string
42
45
 
43
- // Enhanced functionality
44
46
  @property({ type: Array }) customPresets: Array<{
45
47
  label: string
46
48
  dateFrom: string
47
49
  dateTo: string
48
50
  }> = []
49
51
  @property({ type: String }) format?: string
50
- @property({ type: Boolean }) disabled = false
51
- @property({ type: Boolean }) required = false
52
52
  @property({ type: String }) placeholder = 'Select date range'
53
53
  @property({ type: Boolean }) clearable = true
54
54
  @property() step?: 'day' | 'week' | 'month' | 'year' | number
@@ -119,6 +119,89 @@ export class SchmancyDateRange extends SchmancyElement {
119
119
  }
120
120
  }
121
121
 
122
+ override willUpdate(changed: PropertyValues): void {
123
+ super.willUpdate(changed)
124
+ if (changed.has('dateFrom') || changed.has('dateTo') || changed.has('name')) {
125
+ // Multi-entry FACE submission: setFormValue accepts a FormData
126
+ // object whose entries are appended to the owning form's FormData.
127
+ // native `new FormData(form)` then sees both `${name}From` and
128
+ // `${name}To` without any consumer-side parsing.
129
+ if (this.name && !this.disabled) {
130
+ const fd = new FormData()
131
+ if (this.dateFrom?.value) fd.append(`${this.name}From`, this.dateFrom.value)
132
+ if (this.dateTo?.value) fd.append(`${this.name}To`, this.dateTo.value)
133
+ this.internals?.setFormValue(fd)
134
+ } else {
135
+ this.internals?.setFormValue(null)
136
+ }
137
+ this.checkValidity()
138
+ }
139
+ if (changed.has('required') || changed.has('disabled')) {
140
+ this.checkValidity()
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Date-range validity is `both dates non-empty` when required.
146
+ * (Order/range constraints are out of scope here — they belong to a
147
+ * domain-specific schema layer.)
148
+ */
149
+ override checkValidity(): boolean {
150
+ if (this.disabled) {
151
+ this.internals?.setValidity({})
152
+ return true
153
+ }
154
+ const fromEmpty = !this.dateFrom?.value
155
+ const toEmpty = !this.dateTo?.value
156
+ const isValid = !this.required || (!fromEmpty && !toEmpty)
157
+ const message = isValid ? '' : 'Please select a date range.'
158
+
159
+ this.internals?.setValidity(
160
+ isValid ? {} : { valueMissing: true },
161
+ isValid ? undefined : message,
162
+ )
163
+
164
+ if (this._shouldShowError()) {
165
+ this.error = !isValid
166
+ this.validationMessage = message
167
+ }
168
+ return isValid
169
+ }
170
+
171
+ /**
172
+ * Override — emit `${name}From` and `${name}To` flat-suffix entries (the
173
+ * plan's chosen multi-entry encoding; native to JS consumers without
174
+ * server-side bracket parsing).
175
+ */
176
+ override toFormEntries(): Array<[string, FormDataEntryValue]> {
177
+ if (!this.name || this.disabled) return []
178
+ const entries: Array<[string, FormDataEntryValue]> = []
179
+ if (this.dateFrom?.value) entries.push([`${this.name}From`, this.dateFrom.value])
180
+ if (this.dateTo?.value) entries.push([`${this.name}To`, this.dateTo.value])
181
+ return entries
182
+ }
183
+
184
+ /** `dirty` tracks the underlying date strings, not the wide-union value. */
185
+ private _dateFromDefault: string = ''
186
+ private _dateToDefault: string = ''
187
+ override firstUpdated(changed: PropertyValues): void {
188
+ super.firstUpdated(changed)
189
+ this._dateFromDefault = this.dateFrom?.value ?? ''
190
+ this._dateToDefault = this.dateTo?.value ?? ''
191
+ }
192
+ override get dirty(): boolean {
193
+ return (
194
+ (this.dateFrom?.value ?? '') !== this._dateFromDefault ||
195
+ (this.dateTo?.value ?? '') !== this._dateToDefault
196
+ )
197
+ }
198
+
199
+ override resetForm(): void {
200
+ this.dateFrom = { ...this.dateFrom, value: this._dateFromDefault }
201
+ this.dateTo = { ...this.dateTo, value: this._dateToDefault }
202
+ super.resetForm()
203
+ }
204
+
122
205
  private initPresetRanges() {
123
206
  const format = this.getDateFormat()
124
207
  const cacheKey = `${this.type}-${format}-${JSON.stringify(this.customPresets)}`
@@ -0,0 +1,9 @@
1
+ export * from './autocomplete'
2
+ export * from './checkbox'
3
+ export * from './date-range'
4
+ export * from './input'
5
+ export * from './radio-group'
6
+ export * from './range'
7
+ export * from './select'
8
+ export * from './switch'
9
+ export * from './textarea'