@mhmo91/schmancy 0.10.42 → 0.10.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (759) hide show
  1. package/custom-elements.json +264 -79
  2. package/dist/SchmancyElement-CeKrBW2j.cjs +2 -0
  3. package/dist/SchmancyElement-CeKrBW2j.cjs.map +1 -0
  4. package/dist/SchmancyElement-Ob9yGkiG.js +286 -0
  5. package/dist/SchmancyElement-Ob9yGkiG.js.map +1 -0
  6. package/dist/agent/schmancy.agent.js +4032 -3886
  7. package/dist/agent/schmancy.agent.js.map +1 -1
  8. package/dist/agent/schmancy.manifest.json +215 -58
  9. package/dist/animation-CCOIW4wJ.cjs.map +1 -1
  10. package/dist/animation-DCznELuT.js.map +1 -1
  11. package/dist/area-CbajcnmJ.cjs +21 -0
  12. package/dist/area-CbajcnmJ.cjs.map +1 -0
  13. package/dist/{area-DtCNCb8w.js → area-MxLAyWgV.js} +22 -22
  14. package/dist/area-MxLAyWgV.js.map +1 -0
  15. package/dist/area.cjs +1 -1
  16. package/dist/area.js +1 -1
  17. package/dist/{audio-DdN76ikW.js → audio-B_0PGwYC.js} +1 -1
  18. package/dist/audio-B_0PGwYC.js.map +1 -0
  19. package/dist/{audio-B924fI5N.cjs → audio-CpwrIaw-.cjs} +1 -1
  20. package/dist/audio-CpwrIaw-.cjs.map +1 -0
  21. package/dist/audio.cjs +1 -1
  22. package/dist/audio.js +2 -2
  23. package/dist/autocomplete-CILzaDB7.cjs +115 -0
  24. package/dist/autocomplete-CILzaDB7.cjs.map +1 -0
  25. package/dist/{autocomplete-UNOknYUz.js → autocomplete-DV9RxCun.js} +113 -113
  26. package/dist/autocomplete-DV9RxCun.js.map +1 -0
  27. package/dist/autocomplete.cjs +1 -1
  28. package/dist/autocomplete.js +1 -1
  29. package/dist/avatar.cjs +1 -1
  30. package/dist/avatar.cjs.map +1 -1
  31. package/dist/avatar.js +4 -4
  32. package/dist/avatar.js.map +1 -1
  33. package/dist/badge.cjs +1 -1
  34. package/dist/badge.js +1 -1
  35. package/dist/{boat-BZah1Sf9.js → boat-DoZGgQ0P.js} +5 -5
  36. package/dist/{boat-BZah1Sf9.js.map → boat-DoZGgQ0P.js.map} +1 -1
  37. package/dist/{boat-D3bEjxf8.cjs → boat-sg0cWO8a.cjs} +2 -2
  38. package/dist/{boat-D3bEjxf8.cjs.map → boat-sg0cWO8a.cjs.map} +1 -1
  39. package/dist/boat.cjs +1 -1
  40. package/dist/boat.js +1 -1
  41. package/dist/breadcrumb.cjs +32 -31
  42. package/dist/breadcrumb.cjs.map +1 -1
  43. package/dist/breadcrumb.js +33 -32
  44. package/dist/breadcrumb.js.map +1 -1
  45. package/dist/busy-Brs-TDh9.cjs +133 -0
  46. package/dist/busy-Brs-TDh9.cjs.map +1 -0
  47. package/dist/busy-g4LoQmhB.js +172 -0
  48. package/dist/busy-g4LoQmhB.js.map +1 -0
  49. package/dist/busy.cjs +1 -1
  50. package/dist/busy.js +1 -1
  51. package/dist/{button-CTvS5YX4.cjs → button-Cml67Y_d.cjs} +41 -32
  52. package/dist/button-Cml67Y_d.cjs.map +1 -0
  53. package/dist/{button-DgoDfcJx.js → button-DWANpZfD.js} +43 -34
  54. package/dist/button-DWANpZfD.js.map +1 -0
  55. package/dist/button.cjs +40 -33
  56. package/dist/button.cjs.map +1 -1
  57. package/dist/button.js +42 -35
  58. package/dist/button.js.map +1 -1
  59. package/dist/calendar-2dJrw9pR.cjs +58 -0
  60. package/dist/calendar-2dJrw9pR.cjs.map +1 -0
  61. package/dist/calendar-kCe5LaBa.js +434 -0
  62. package/dist/calendar-kCe5LaBa.js.map +1 -0
  63. package/dist/calendar.cjs +1 -0
  64. package/dist/calendar.js +2 -0
  65. package/dist/{card-C6ijJZpF.js → card-CS_hYJbz.js} +136 -136
  66. package/dist/card-CS_hYJbz.js.map +1 -0
  67. package/dist/card-d0KhTnx5.cjs +177 -0
  68. package/dist/card-d0KhTnx5.cjs.map +1 -0
  69. package/dist/card.cjs +1 -1
  70. package/dist/card.js +1 -1
  71. package/dist/{checkbox-7vEPZuGC.js → checkbox-Bjp7kWuE.js} +2 -2
  72. package/dist/{checkbox-7vEPZuGC.js.map → checkbox-Bjp7kWuE.js.map} +1 -1
  73. package/dist/{checkbox-DXKdxkXE.cjs → checkbox-DZ2Wrz7Y.cjs} +1 -1
  74. package/dist/{checkbox-DXKdxkXE.cjs.map → checkbox-DZ2Wrz7Y.cjs.map} +1 -1
  75. package/dist/checkbox.cjs +1 -1
  76. package/dist/checkbox.js +1 -1
  77. package/dist/{chips-9eG-96_D.cjs → chips-BHBVkxsa.cjs} +142 -153
  78. package/dist/chips-BHBVkxsa.cjs.map +1 -0
  79. package/dist/{chips-DF7akwz7.js → chips-DACeW7YL.js} +127 -138
  80. package/dist/chips-DACeW7YL.js.map +1 -0
  81. package/dist/chips.cjs +1 -1
  82. package/dist/chips.js +2 -2
  83. package/dist/connectivity.cjs +53 -35
  84. package/dist/connectivity.cjs.map +1 -1
  85. package/dist/connectivity.js +55 -37
  86. package/dist/connectivity.js.map +1 -1
  87. package/dist/content-drawer.cjs +1 -1
  88. package/dist/content-drawer.js +1 -1
  89. package/dist/cursor-glow-Ah7VXSj7.js.map +1 -1
  90. package/dist/cursor-glow-Bulq-38P.cjs.map +1 -1
  91. package/dist/date-range-B2VN7cl_.cjs +138 -0
  92. package/dist/date-range-B2VN7cl_.cjs.map +1 -0
  93. package/dist/date-range-CDF_5ju_.js +439 -0
  94. package/dist/date-range-CDF_5ju_.js.map +1 -0
  95. package/dist/{date-range-inline-DV2c_gWM.cjs → date-range-inline-CGM0SPK9.cjs} +2 -4
  96. package/dist/date-range-inline-CGM0SPK9.cjs.map +1 -0
  97. package/dist/{date-range-inline-BnOD-ddB.js → date-range-inline-D6Ozerzw.js} +3 -5
  98. package/dist/date-range-inline-D6Ozerzw.js.map +1 -0
  99. package/dist/date-range-inline.cjs +1 -1
  100. package/dist/date-range-inline.js +1 -1
  101. package/dist/date-range.cjs +1 -1
  102. package/dist/date-range.js +2 -2
  103. package/dist/dayjs.min-CvRZTfam.cjs +1 -0
  104. package/dist/dayjs.min-CvRZTfam.cjs.map +1 -0
  105. package/dist/dayjs.min-DnELezPs.js +296 -0
  106. package/dist/dayjs.min-DnELezPs.js.map +1 -0
  107. package/dist/delay.cjs +1 -1
  108. package/dist/delay.js +3 -3
  109. package/dist/{details-ByF66CyY.js → details-Ct1_GwKr.js} +104 -93
  110. package/dist/details-Ct1_GwKr.js.map +1 -0
  111. package/dist/{details-B2-jECBh.cjs → details-D4fVOaj4.cjs} +109 -98
  112. package/dist/details-D4fVOaj4.cjs.map +1 -0
  113. package/dist/details.cjs +1 -1
  114. package/dist/details.js +1 -1
  115. package/dist/{directives-DCb_LA9R.cjs → directives-B2VxfwRL.cjs} +1 -1
  116. package/dist/directives-B2VxfwRL.cjs.map +1 -0
  117. package/dist/{directives-BL7mzVsA.js → directives-Dj8jlv-Q.js} +3 -3
  118. package/dist/directives-Dj8jlv-Q.js.map +1 -0
  119. package/dist/directives.cjs +1 -1
  120. package/dist/directives.js +2 -2
  121. package/dist/discovery.service-CIa3Eeuk.cjs.map +1 -1
  122. package/dist/discovery.service-DZFxtRwW.js.map +1 -1
  123. package/dist/divider-B3v33OnX.cjs +57 -0
  124. package/dist/divider-B3v33OnX.cjs.map +1 -0
  125. package/dist/divider-BJHW3q11.js +89 -0
  126. package/dist/divider-BJHW3q11.js.map +1 -0
  127. package/dist/divider.cjs +1 -1
  128. package/dist/divider.js +1 -1
  129. package/dist/dropdown.cjs +40 -40
  130. package/dist/dropdown.cjs.map +1 -1
  131. package/dist/dropdown.js +41 -41
  132. package/dist/dropdown.js.map +1 -1
  133. package/dist/{expand-cZ8rfCWP.js → expand-BT8mOu8Q.js} +103 -97
  134. package/dist/expand-BT8mOu8Q.js.map +1 -0
  135. package/dist/expand-D0YdR9nR.cjs +147 -0
  136. package/dist/expand-D0YdR9nR.cjs.map +1 -0
  137. package/dist/expand.cjs +1 -1
  138. package/dist/expand.js +1 -1
  139. package/dist/fab.cjs +1 -1
  140. package/dist/fab.cjs.map +1 -1
  141. package/dist/fab.js +2 -2
  142. package/dist/fab.js.map +1 -1
  143. package/dist/{float-DkGyWSWy.cjs → float-BPQlDyai.cjs} +1 -1
  144. package/dist/{float-DkGyWSWy.cjs.map → float-BPQlDyai.cjs.map} +1 -1
  145. package/dist/{float-zn3DgXBT.js → float-BQcxj3i_.js} +2 -2
  146. package/dist/{float-zn3DgXBT.js.map → float-BQcxj3i_.js.map} +1 -1
  147. package/dist/float.cjs +1 -1
  148. package/dist/float.js +1 -1
  149. package/dist/{form-DowzVsgI.cjs → form-CoWFnClb.cjs} +8 -13
  150. package/dist/form-CoWFnClb.cjs.map +1 -0
  151. package/dist/{form-tG7LwDm4.js → form-hC2LvCHX.js} +10 -15
  152. package/dist/form-hC2LvCHX.js.map +1 -0
  153. package/dist/form.cjs +12 -13
  154. package/dist/form.cjs.map +1 -1
  155. package/dist/form.js +23 -24
  156. package/dist/form.js.map +1 -1
  157. package/dist/gravity-6pL6CfIr.cjs.map +1 -1
  158. package/dist/gravity-sVK3zGBF.js.map +1 -1
  159. package/dist/handover/agent-runtime-followups.md +1 -1
  160. package/dist/handover/agent-runtime-v1.md +3 -3
  161. package/dist/{hashContent-iRZJJWtE.cjs.map → hashContent--s09Ed_g.cjs.map} +1 -1
  162. package/dist/{hashContent-BqU6v1Xr.js.map → hashContent-CAvrQ56N.js.map} +1 -1
  163. package/dist/icons-BeGKDZ-k.cjs +22 -0
  164. package/dist/icons-BeGKDZ-k.cjs.map +1 -0
  165. package/dist/{icons-Dup5skuk.js → icons-DEJnIxml.js} +20 -22
  166. package/dist/icons-DEJnIxml.js.map +1 -0
  167. package/dist/icons.cjs +1 -1
  168. package/dist/icons.js +1 -1
  169. package/dist/{iframe-CDJjnNmo.cjs → iframe-BkSukM9C.cjs} +9 -9
  170. package/dist/iframe-BkSukM9C.cjs.map +1 -0
  171. package/dist/{iframe-Xc3EPMZT.js → iframe-V3S-bwEY.js} +10 -10
  172. package/dist/iframe-V3S-bwEY.js.map +1 -0
  173. package/dist/iframe.cjs +1 -1
  174. package/dist/iframe.js +1 -1
  175. package/dist/index.cjs +1 -1
  176. package/dist/index.js +61 -60
  177. package/dist/{input-cTyDxW9L.js → input-CPFCSQld.js} +3 -10
  178. package/dist/input-CPFCSQld.js.map +1 -0
  179. package/dist/{input-DnmC6J1T.cjs → input-DSfwfhhj.cjs} +2 -9
  180. package/dist/input-DSfwfhhj.cjs.map +1 -0
  181. package/dist/input-chip-BUuFJUky.cjs +129 -0
  182. package/dist/input-chip-BUuFJUky.cjs.map +1 -0
  183. package/dist/{input-chip-CYI17YOq.js → input-chip-C3a1fwKB.js} +87 -104
  184. package/dist/input-chip-C3a1fwKB.js.map +1 -0
  185. package/dist/input.cjs +1 -1
  186. package/dist/input.js +1 -1
  187. package/dist/json.cjs +5 -1
  188. package/dist/json.cjs.map +1 -1
  189. package/dist/json.js +8 -4
  190. package/dist/json.js.map +1 -1
  191. package/dist/kbd.cjs +28 -28
  192. package/dist/kbd.cjs.map +1 -1
  193. package/dist/kbd.js +29 -29
  194. package/dist/kbd.js.map +1 -1
  195. package/dist/{layout-CNlZSJFU.cjs → layout-CdyHy_oX.cjs} +1 -1
  196. package/dist/layout-CdyHy_oX.cjs.map +1 -0
  197. package/dist/{layout-DDxw0EwL.js → layout-k6fOkpif.js} +1 -1
  198. package/dist/layout-k6fOkpif.js.map +1 -0
  199. package/dist/layout.cjs +26 -26
  200. package/dist/layout.cjs.map +1 -1
  201. package/dist/layout.js +27 -27
  202. package/dist/layout.js.map +1 -1
  203. package/dist/lazy-BaAiIUru.js.map +1 -1
  204. package/dist/lazy-C-7a4FAe.cjs.map +1 -1
  205. package/dist/{lightbox-CH-y3rYB.js → lightbox-DIG0VLOK.js} +8 -14
  206. package/dist/lightbox-DIG0VLOK.js.map +1 -0
  207. package/dist/{lightbox-CvtqoInF.cjs → lightbox-E5rgd-hu.cjs} +7 -13
  208. package/dist/lightbox-E5rgd-hu.cjs.map +1 -0
  209. package/dist/lightbox.cjs +1 -1
  210. package/dist/lightbox.js +1 -1
  211. package/dist/list-BRz0rDSH.cjs +47 -0
  212. package/dist/list-BRz0rDSH.cjs.map +1 -0
  213. package/dist/{list-DrsawQ5R.js → list-NrOYDPBo.js} +42 -35
  214. package/dist/list-NrOYDPBo.js.map +1 -0
  215. package/dist/list.cjs +1 -1
  216. package/dist/list.js +1 -1
  217. package/dist/magnetic-DKtc4umC.cjs.map +1 -1
  218. package/dist/magnetic-DaOOv5Dz.js.map +1 -1
  219. package/dist/{menu-CsY5lMqY.js → menu-B1Ei9SVj.js} +12 -12
  220. package/dist/menu-B1Ei9SVj.js.map +1 -0
  221. package/dist/{menu-BFRcTe3o.cjs → menu-Duvl66Nl.cjs} +10 -10
  222. package/dist/menu-Duvl66Nl.cjs.map +1 -0
  223. package/dist/menu.cjs +1 -1
  224. package/dist/menu.js +1 -1
  225. package/dist/{mixins-BoMURWag.cjs → mixins-Cjn20BQH.cjs} +42 -100
  226. package/dist/mixins-Cjn20BQH.cjs.map +1 -0
  227. package/dist/{mixins-bCEXbwJV.js → mixins-q4KAL8Xr.js} +42 -100
  228. package/dist/mixins-q4KAL8Xr.js.map +1 -0
  229. package/dist/mixins.cjs +1 -1
  230. package/dist/mixins.js +2 -2
  231. package/dist/nav-drawer.cjs +1 -1
  232. package/dist/nav-drawer.js +1 -1
  233. package/dist/navigation-bar.cjs +1 -1
  234. package/dist/navigation-bar.js +1 -1
  235. package/dist/navigation-rail.cjs +2 -4
  236. package/dist/navigation-rail.cjs.map +1 -1
  237. package/dist/navigation-rail.js +3 -5
  238. package/dist/navigation-rail.js.map +1 -1
  239. package/dist/{notification-DFKRMmSq.js → notification-COhUhUCr.js} +5 -7
  240. package/dist/notification-COhUhUCr.js.map +1 -0
  241. package/dist/{notification-FBf3Mb2e.cjs → notification-DsdA_MJe.cjs} +2 -4
  242. package/dist/notification-DsdA_MJe.cjs.map +1 -0
  243. package/dist/notification.cjs +1 -1
  244. package/dist/notification.js +1 -1
  245. package/dist/{option-Ct0lGdH3.js → option-BIzgTbXz.js} +20 -20
  246. package/dist/option-BIzgTbXz.js.map +1 -0
  247. package/dist/option-C5hhqR2z.cjs +43 -0
  248. package/dist/option-C5hhqR2z.cjs.map +1 -0
  249. package/dist/option.cjs +1 -1
  250. package/dist/option.js +1 -1
  251. package/dist/{overlay-sRXiMkjn.cjs → overlay-BzgF8P7i.cjs} +48 -41
  252. package/dist/overlay-BzgF8P7i.cjs.map +1 -0
  253. package/dist/{overlay-Bh8Q_R01.js → overlay-LoRRemny.js} +52 -45
  254. package/dist/overlay-LoRRemny.js.map +1 -0
  255. package/dist/overlay-stack-Bdr9lOqi.cjs.map +1 -1
  256. package/dist/overlay-stack-D2rgxQLh.js.map +1 -1
  257. package/dist/overlay.cjs +1 -1
  258. package/dist/{overlay.confirm-body-CQihsR20.js → overlay.confirm-body-D0b1MoCw.js} +30 -45
  259. package/dist/overlay.confirm-body-D0b1MoCw.js.map +1 -0
  260. package/dist/{overlay.confirm-body-Jc1EuMGs.cjs → overlay.confirm-body-DCneq73Z.cjs} +22 -37
  261. package/dist/overlay.confirm-body-DCneq73Z.cjs.map +1 -0
  262. package/dist/overlay.js +3 -3
  263. package/dist/{overlay.service-BXPgS7ay.js → overlay.service-BuUeti6X.js} +2 -2
  264. package/dist/overlay.service-BuUeti6X.js.map +1 -0
  265. package/dist/{overlay.service-9Dp3g7ot.cjs → overlay.service-MMTiW2T3.cjs} +1 -1
  266. package/dist/overlay.service-MMTiW2T3.cjs.map +1 -0
  267. package/dist/{progress-CYLshdo2.js → progress-D7n3SKAO.js} +50 -50
  268. package/dist/progress-D7n3SKAO.js.map +1 -0
  269. package/dist/progress-DsCnFsH5.cjs +51 -0
  270. package/dist/progress-DsCnFsH5.cjs.map +1 -0
  271. package/dist/progress.cjs +1 -1
  272. package/dist/progress.js +1 -1
  273. package/dist/{radio-group-6kCgOgBL.cjs → radio-group-CaAjg9UV.cjs} +1 -1
  274. package/dist/radio-group-CaAjg9UV.cjs.map +1 -0
  275. package/dist/{radio-group-bZtZHOj_.js → radio-group-Drpl6Pl8.js} +2 -2
  276. package/dist/radio-group-Drpl6Pl8.js.map +1 -0
  277. package/dist/radio-group.cjs +1 -1
  278. package/dist/radio-group.js +1 -1
  279. package/dist/range.cjs +4 -2
  280. package/dist/range.cjs.map +1 -1
  281. package/dist/range.js +5 -3
  282. package/dist/range.js.map +1 -1
  283. package/dist/reduced-motion-D-L12p7G.js.map +1 -1
  284. package/dist/reduced-motion-Ds-HjMzn.cjs.map +1 -1
  285. package/dist/{rxjs-utils-Csnks202.cjs.map → rxjs-utils-4P2v57ke.cjs.map} +1 -1
  286. package/dist/{rxjs-utils-d-ivVN84.js.map → rxjs-utils-JMFdgQSl.js.map} +1 -1
  287. package/dist/rxjs-utils.cjs +1 -1
  288. package/dist/rxjs-utils.js +1 -1
  289. package/dist/search-DPKoC-dT.cjs.map +1 -1
  290. package/dist/search-MvIBA93K.js.map +1 -1
  291. package/dist/{select-CU3X-PIa.js → select-CTXkrrVZ.js} +13 -13
  292. package/dist/select-CTXkrrVZ.js.map +1 -0
  293. package/dist/select-DcLcpPCh.cjs +56 -0
  294. package/dist/select-DcLcpPCh.cjs.map +1 -0
  295. package/dist/select.cjs +1 -1
  296. package/dist/select.js +1 -1
  297. package/dist/skeleton.cjs +37 -33
  298. package/dist/skeleton.cjs.map +1 -1
  299. package/dist/skeleton.js +38 -34
  300. package/dist/skeleton.js.map +1 -1
  301. package/dist/skills/schmancy/surface.md +38 -22
  302. package/dist/skills/surface.md +38 -22
  303. package/dist/slider.cjs +31 -31
  304. package/dist/slider.cjs.map +1 -1
  305. package/dist/slider.js +32 -32
  306. package/dist/slider.js.map +1 -1
  307. package/dist/{sound.service-B4ZmXpH9.js → sound.service-AJwuk3yr.js} +1 -1
  308. package/dist/sound.service-AJwuk3yr.js.map +1 -0
  309. package/dist/{sound.service-DjlMvicQ.cjs → sound.service-CVsxhQkX.cjs} +1 -1
  310. package/dist/sound.service-CVsxhQkX.cjs.map +1 -0
  311. package/dist/{splash-screen-emCLYoVl.js → splash-screen-DANfqvlo.js} +23 -26
  312. package/dist/splash-screen-DANfqvlo.js.map +1 -0
  313. package/dist/splash-screen-K74cgU6S.cjs +38 -0
  314. package/dist/splash-screen-K74cgU6S.cjs.map +1 -0
  315. package/dist/splash-screen.cjs +1 -1
  316. package/dist/splash-screen.js +1 -1
  317. package/dist/{src-DGDTkOvC.js → src-Bo-vvN6m.js} +173 -175
  318. package/dist/src-Bo-vvN6m.js.map +1 -0
  319. package/dist/src-MdpH1zth.cjs +237 -0
  320. package/dist/src-MdpH1zth.cjs.map +1 -0
  321. package/dist/{state-CumAEPQH.cjs → state-BWQiqN6I.cjs} +1 -1
  322. package/dist/state-BWQiqN6I.cjs.map +1 -0
  323. package/dist/{state-DMd_FUeA.js → state-DBA_gzJO.js} +1 -1
  324. package/dist/state-DBA_gzJO.js.map +1 -0
  325. package/dist/state.cjs +1 -1
  326. package/dist/state.js +2 -2
  327. package/dist/steps.cjs +20 -12
  328. package/dist/steps.cjs.map +1 -1
  329. package/dist/steps.js +21 -13
  330. package/dist/steps.js.map +1 -1
  331. package/dist/surface-COBvWWFb.cjs +7 -0
  332. package/dist/surface-COBvWWFb.cjs.map +1 -0
  333. package/dist/{surface-DNiYigsX.js → surface-DXk1X1tL.js} +9 -9
  334. package/dist/{surface-DNiYigsX.js.map → surface-DXk1X1tL.js.map} +1 -1
  335. package/dist/surface.cjs +1 -1
  336. package/dist/surface.js +1 -1
  337. package/dist/switch.cjs +13 -4
  338. package/dist/switch.cjs.map +1 -1
  339. package/dist/switch.js +14 -5
  340. package/dist/switch.js.map +1 -1
  341. package/dist/table.cjs +4 -10
  342. package/dist/table.cjs.map +1 -1
  343. package/dist/table.js +5 -11
  344. package/dist/table.js.map +1 -1
  345. package/dist/{tabs-4T_4kCf-.js → tabs-BYhFWnsx.js} +7 -7
  346. package/dist/tabs-BYhFWnsx.js.map +1 -0
  347. package/dist/{tabs-Byxxt-AH.cjs → tabs-CJwB0fr0.cjs} +6 -6
  348. package/dist/tabs-CJwB0fr0.cjs.map +1 -0
  349. package/dist/tabs.cjs +1 -1
  350. package/dist/tabs.js +1 -1
  351. package/dist/teleport.cjs +1 -1
  352. package/dist/teleport.js +1 -1
  353. package/dist/{textarea-kkYNk1ET.js → textarea-BjDx1w2g.js} +37 -41
  354. package/dist/textarea-BjDx1w2g.js.map +1 -0
  355. package/dist/{textarea-BwYwH9fu.cjs → textarea-CGgznhd6.cjs} +36 -40
  356. package/dist/textarea-CGgznhd6.cjs.map +1 -0
  357. package/dist/textarea.cjs +1 -1
  358. package/dist/textarea.js +1 -1
  359. package/dist/{theme-BG0EnzYP.cjs → theme-BVul7lHS.cjs} +6 -6
  360. package/dist/{theme-BG0EnzYP.cjs.map → theme-BVul7lHS.cjs.map} +1 -1
  361. package/dist/{theme-DwQBl6sr.js → theme-Dvm5J8nh.js} +11 -11
  362. package/dist/{theme-DwQBl6sr.js.map → theme-Dvm5J8nh.js.map} +1 -1
  363. package/dist/{theme-button-BD8anzsZ.js → theme-button-Bko5ohFP.js} +2 -2
  364. package/dist/{theme-button-BD8anzsZ.js.map → theme-button-Bko5ohFP.js.map} +1 -1
  365. package/dist/{theme-button-DlrNoCMA.cjs → theme-button-YLY7zR1c.cjs} +1 -1
  366. package/dist/{theme-button-DlrNoCMA.cjs.map → theme-button-YLY7zR1c.cjs.map} +1 -1
  367. package/dist/theme-button.cjs +1 -1
  368. package/dist/theme-button.js +1 -1
  369. package/dist/theme.cjs +1 -1
  370. package/dist/{theme.interface-CSt7JUBD.cjs.map → theme.interface-B-qxDsZQ.cjs.map} +1 -1
  371. package/dist/{theme.interface-odQEpZZH.js.map → theme.interface-B7caS5cg.js.map} +1 -1
  372. package/dist/theme.js +4 -4
  373. package/dist/{theme.service-Dv_55nfE.js → theme.service-D94nm7Bf.js} +1 -1
  374. package/dist/theme.service-D94nm7Bf.js.map +1 -0
  375. package/dist/{theme.service-pjkTM209.cjs → theme.service-h2fXQq7x.cjs} +1 -1
  376. package/dist/theme.service-h2fXQq7x.cjs.map +1 -0
  377. package/dist/tooltip.cjs.map +1 -1
  378. package/dist/tooltip.js.map +1 -1
  379. package/dist/tree.cjs +14 -14
  380. package/dist/tree.cjs.map +1 -1
  381. package/dist/tree.js +15 -15
  382. package/dist/tree.js.map +1 -1
  383. package/dist/types.cjs +1 -1
  384. package/dist/types.cjs.map +1 -1
  385. package/dist/types.js +19 -2
  386. package/dist/types.js.map +1 -1
  387. package/dist/typewriter.cjs.map +1 -1
  388. package/dist/typewriter.js.map +1 -1
  389. package/dist/typography-ByF2k5yW.js +358 -0
  390. package/dist/typography-ByF2k5yW.js.map +1 -0
  391. package/dist/typography-Cfav17it.cjs +282 -0
  392. package/dist/typography-Cfav17it.cjs.map +1 -0
  393. package/dist/typography.cjs +1 -1
  394. package/dist/typography.js +1 -1
  395. package/dist/utils-DIXndz6Q.cjs.map +1 -0
  396. package/dist/utils-dSPH7Oh9.js.map +1 -0
  397. package/dist/utils.cjs +1 -1
  398. package/dist/utils.js +1 -1
  399. package/dist/visually-hidden.cjs +13 -13
  400. package/dist/visually-hidden.cjs.map +1 -1
  401. package/dist/visually-hidden.js +14 -14
  402. package/dist/visually-hidden.js.map +1 -1
  403. package/dist/window-Br1OmpL-.cjs +67 -0
  404. package/dist/window-Br1OmpL-.cjs.map +1 -0
  405. package/dist/{window-C76zstbV.js → window-CCmN4but.js} +24 -15
  406. package/dist/window-CCmN4but.js.map +1 -0
  407. package/dist/window.cjs +1 -1
  408. package/dist/window.js +1 -1
  409. package/package.json +1 -1
  410. package/skills/schmancy/surface.md +38 -22
  411. package/src/area/area.component.ts +249 -163
  412. package/src/area/area.service.test.ts +994 -1006
  413. package/src/area/area.service.ts +76 -72
  414. package/src/area/index.ts +7 -7
  415. package/src/area/lazy.ts +39 -42
  416. package/src/area/route.component.ts +54 -52
  417. package/src/area/router.types.ts +7 -7
  418. package/src/audio/emotional-sounds.ts +880 -801
  419. package/src/audio/sound.service.ts +26 -5
  420. package/src/avatar/avatar.ts +4 -4
  421. package/src/badge/badge.ts +15 -12
  422. package/src/badge/index.ts +1 -1
  423. package/src/boat/boat.ts +1 -1
  424. package/src/breadcrumb/breadcrumb.ts +37 -32
  425. package/src/busy/busy.ts +15 -12
  426. package/src/busy/index.ts +2 -2
  427. package/src/busy/spinner.ts +132 -119
  428. package/src/button/button.test.ts +5 -1
  429. package/src/button/button.ts +113 -72
  430. package/src/button/icon-button.ts +64 -46
  431. package/src/button/index.ts +2 -2
  432. package/src/calendar/calendar.test.ts +504 -0
  433. package/src/calendar/calendar.ts +587 -0
  434. package/src/calendar/index.ts +2 -0
  435. package/src/card/actions.ts +11 -9
  436. package/src/card/card.ts +79 -77
  437. package/src/card/content.ts +8 -6
  438. package/src/card/index.ts +4 -4
  439. package/src/card/media.ts +50 -50
  440. package/src/chips/assist-chip.ts +1 -1
  441. package/src/chips/chips.ts +1 -1
  442. package/src/chips/filter-chip.ts +1 -1
  443. package/src/chips/index.ts +1 -1
  444. package/src/chips/input-chip.ts +1 -1
  445. package/src/chips/suggestion-chip.ts +1 -1
  446. package/src/connectivity/connectivity-status.ts +90 -62
  447. package/src/content-drawer/drawer.service.ts +47 -36
  448. package/src/content-drawer/drawer.ts +31 -18
  449. package/src/content-drawer/index.ts +5 -5
  450. package/src/content-drawer/main.ts +9 -7
  451. package/src/content-drawer/sheet.ts +8 -6
  452. package/src/date-range-inline/date-range-inline.ts +523 -522
  453. package/src/date-range-inline/index.ts +2 -2
  454. package/src/delay/index.ts +1 -1
  455. package/src/details/details.ts +119 -105
  456. package/src/details/index.ts +1 -1
  457. package/src/directives/ai-badge.ts +1 -5
  458. package/src/directives/animate-text.ts +43 -31
  459. package/src/directives/art/effects/howl.ts +1 -4
  460. package/src/directives/art/effects/samwa.ts +11 -5
  461. package/src/directives/art/effects/snow.ts +1 -2
  462. package/src/directives/battery.ts +21 -12
  463. package/src/directives/confirm-click.ts +9 -17
  464. package/src/directives/cursor-glow.ts +1 -1
  465. package/src/directives/cycle-text.ts +7 -21
  466. package/src/directives/drag.ts +50 -45
  467. package/src/directives/fyi.ts +1 -6
  468. package/src/directives/gravity.ts +10 -8
  469. package/src/directives/hummingbird.ts +256 -107
  470. package/src/directives/index.ts +29 -29
  471. package/src/directives/intersect.ts +11 -11
  472. package/src/directives/layout.ts +25 -36
  473. package/src/directives/liquid.ts +4 -10
  474. package/src/directives/living-border.ts +7 -5
  475. package/src/directives/long-press.ts +2 -1
  476. package/src/directives/magnetic.ts +7 -6
  477. package/src/directives/nebula.ts +34 -28
  478. package/src/directives/overflow-within.ts +18 -20
  479. package/src/directives/reduced-motion.ts +9 -9
  480. package/src/directives/reveal.ts +193 -195
  481. package/src/directives/ripple.ts +9 -7
  482. package/src/directives/urgent.ts +3 -1
  483. package/src/directives/working-snake.ts +1 -1
  484. package/src/discovery/discovery.service.ts +198 -210
  485. package/src/discovery/index.ts +1 -1
  486. package/src/divider/divider.ts +49 -47
  487. package/src/divider/index.ts +1 -1
  488. package/src/dropdown/dropdown-content.ts +42 -40
  489. package/src/dropdown/index.ts +2 -2
  490. package/src/expand/expand-root.component.ts +70 -61
  491. package/src/expand/expand.component.ts +48 -43
  492. package/src/fab/fab.test.ts +1 -2
  493. package/src/fab/fab.ts +2 -4
  494. package/src/form/fields/autocomplete/autocomplete.scss +6 -2
  495. package/src/form/fields/autocomplete/autocomplete.ts +712 -724
  496. package/src/form/fields/autocomplete/index.ts +1 -1
  497. package/src/form/fields/checkbox/checkbox.ts +1 -4
  498. package/src/form/fields/chips/assist-chip.ts +69 -72
  499. package/src/form/fields/chips/chips.ts +14 -15
  500. package/src/form/fields/chips/filter-chip.ts +36 -32
  501. package/src/form/fields/chips/index.ts +5 -5
  502. package/src/form/fields/chips/input-chip.ts +130 -142
  503. package/src/form/fields/chips/suggestion-chip.ts +69 -72
  504. package/src/form/fields/date-range/date-range-dialog.ts +154 -194
  505. package/src/form/fields/date-range/date-range-helpers.ts +63 -64
  506. package/src/form/fields/date-range/date-range.test.ts +575 -121
  507. package/src/form/fields/date-range/date-range.ts +343 -395
  508. package/src/form/fields/date-range/index.ts +2 -2
  509. package/src/form/fields/input/index.ts +8 -8
  510. package/src/form/fields/input/input.scss +30 -26
  511. package/src/form/fields/input/input.test.ts +4 -1
  512. package/src/form/fields/input/input.ts +4 -20
  513. package/src/form/fields/radio-group/index.ts +2 -2
  514. package/src/form/fields/radio-group/radio-button.ts +8 -8
  515. package/src/form/fields/radio-group/radio-group.ts +4 -1
  516. package/src/form/fields/range/range.ts +3 -1
  517. package/src/form/fields/select/index.ts +2 -2
  518. package/src/form/fields/select/select.ts +51 -45
  519. package/src/form/fields/switch/switch.ts +13 -7
  520. package/src/form/fields/textarea/index.ts +1 -1
  521. package/src/form/fields/textarea/textarea.ts +44 -49
  522. package/src/form/form-summary.ts +15 -14
  523. package/src/form/form.test.ts +0 -1
  524. package/src/form/form.ts +11 -23
  525. package/src/icons/icon.ts +25 -25
  526. package/src/icons/index.ts +1 -1
  527. package/src/iframe/iframe.ts +11 -9
  528. package/src/index.ts +1 -0
  529. package/src/json/json.ts +9 -2
  530. package/src/kbd/kbd.ts +30 -28
  531. package/src/layout/scroll/index.ts +1 -1
  532. package/src/layout/scroll/scroll.ts +54 -54
  533. package/src/lightbox/lightbox-service.ts +27 -18
  534. package/src/lightbox/lightbox.directive.ts +2 -1
  535. package/src/lightbox/lightbox.ts +21 -38
  536. package/src/list/index.ts +3 -3
  537. package/src/list/list-item.ts +32 -26
  538. package/src/list/list.ts +13 -8
  539. package/src/menu/index.ts +2 -2
  540. package/src/menu/menu-item.ts +7 -5
  541. package/src/menu/menu.ts +8 -6
  542. package/src/nav-drawer/appbar.ts +9 -7
  543. package/src/nav-drawer/content.ts +10 -8
  544. package/src/nav-drawer/drawer.ts +29 -25
  545. package/src/nav-drawer/index.ts +6 -6
  546. package/src/navigation-bar/index.ts +2 -2
  547. package/src/navigation-bar/navigation-bar-item.ts +127 -118
  548. package/src/navigation-bar/navigation-bar.ts +103 -91
  549. package/src/navigation-rail/index.ts +2 -2
  550. package/src/navigation-rail/navigation-rail.ts +21 -22
  551. package/src/notification/index.ts +6 -6
  552. package/src/notification/notification-service.ts +1 -2
  553. package/src/notification/notification.scss +5 -1
  554. package/src/notification/notification.ts +1 -3
  555. package/src/notification/notify.ts +204 -207
  556. package/src/option/index.ts +1 -1
  557. package/src/option/option.ts +26 -25
  558. package/src/overlay/overlay.animations.ts +4 -14
  559. package/src/overlay/overlay.component.ts +110 -131
  560. package/src/overlay/overlay.confirm-body.ts +26 -48
  561. package/src/overlay/overlay.gestures.ts +8 -10
  562. package/src/overlay/overlay.layout.ts +1 -4
  563. package/src/overlay/overlay.positioning.ts +4 -15
  564. package/src/overlay/overlay.service.ts +9 -24
  565. package/src/overlay/overlay.stack.test.ts +4 -1
  566. package/src/overlay/overlay.stack.ts +4 -4
  567. package/src/overlay/overlay.types.ts +11 -20
  568. package/src/progress/index.ts +1 -1
  569. package/src/progress/progress.ts +135 -133
  570. package/src/rxjs-utils/index.ts +6 -6
  571. package/src/rxjs-utils/waitForElement.ts +20 -20
  572. package/src/rxjs-utils/waitForElementAll.ts +21 -21
  573. package/src/rxjs-utils/waitForElements.ts +27 -27
  574. package/src/rxjs-utils/waitForElementsAll.ts +27 -29
  575. package/src/rxjs-utils/waitUntil.ts +7 -12
  576. package/src/skeleton/skeleton.ts +39 -33
  577. package/src/slider/index.ts +2 -2
  578. package/src/slider/slide.ts +14 -12
  579. package/src/slider/slider.ts +24 -22
  580. package/src/splash-screen/index.ts +1 -1
  581. package/src/splash-screen/splash-screen.ts +26 -27
  582. package/src/state/active-host.ts +4 -5
  583. package/src/state/index.ts +34 -53
  584. package/src/state/persist.ts +14 -11
  585. package/src/state/schmancy-context.ts +88 -88
  586. package/src/state/state.test-d.ts +3 -13
  587. package/src/state/state.test.ts +1 -4
  588. package/src/steps/index.ts +3 -3
  589. package/src/steps/schmancy-step.ts +41 -31
  590. package/src/steps/schmancy-steps.ts +7 -5
  591. package/src/surface/index.ts +1 -1
  592. package/src/surface/surface.styles.ts +53 -104
  593. package/src/surface/surface.ts +10 -8
  594. package/src/table/index.ts +2 -2
  595. package/src/table/row.ts +1 -4
  596. package/src/table/table.ts +2 -5
  597. package/src/tabs/index.ts +2 -2
  598. package/src/tabs/tabs-group.ts +8 -6
  599. package/src/teleport/index.ts +2 -2
  600. package/src/test-utils/a11y.ts +1 -3
  601. package/src/theme/index.ts +17 -17
  602. package/src/theme/theme-audio-player.ts +18 -16
  603. package/src/theme/theme-controller-boat.ts +1 -1
  604. package/src/theme/theme-controller.ts +36 -32
  605. package/src/theme/theme.component.ts +5 -9
  606. package/src/theme/theme.events.ts +1 -1
  607. package/src/theme/theme.format.ts +7 -7
  608. package/src/theme/theme.service.ts +453 -468
  609. package/src/theme/theme.style.css +78 -23
  610. package/src/theme-button/index.ts +1 -1
  611. package/src/tooltip/tooltip.directive.ts +1 -1
  612. package/src/tree/index.ts +1 -1
  613. package/src/tree/tree.ts +24 -16
  614. package/src/types/surface.ts +38 -44
  615. package/src/typewriter/typewriter.directive.ts +30 -39
  616. package/src/typography/typography.ts +289 -269
  617. package/src/utils/animation.ts +2 -8
  618. package/src/utils/index.ts +6 -6
  619. package/src/utils/number.ts +480 -517
  620. package/src/utils/overlay-stack.ts +1 -3
  621. package/src/utils/search.ts +5 -9
  622. package/src/visually-hidden/visually-hidden.ts +15 -13
  623. package/src/window/window-manager.ts +6 -1
  624. package/src/window/window-position.ts +7 -5
  625. package/src/window/window.ts +143 -108
  626. package/types/src/calendar/calendar.d.ts +108 -0
  627. package/types/src/calendar/calendar.test.d.ts +1 -0
  628. package/types/src/calendar/index.d.ts +2 -0
  629. package/types/src/directives/cursor-glow.d.ts +1 -1
  630. package/types/src/directives/hummingbird.d.ts +3 -3
  631. package/types/src/form/fields/date-range/date-range-dialog.d.ts +24 -28
  632. package/types/src/form/fields/date-range/date-range.d.ts +39 -66
  633. package/types/src/form/fields/date-range/date-range.test.d.ts +1 -0
  634. package/types/src/form/fields/date-range/index.d.ts +1 -1
  635. package/types/src/index.d.ts +1 -0
  636. package/types/src/surface/surface.styles.d.ts +13 -6
  637. package/types/src/types/surface.d.ts +17 -22
  638. package/types/src/utils/number.d.ts +1 -1
  639. package/dist/SchmancyElement-OG71FtNv.js +0 -286
  640. package/dist/SchmancyElement-OG71FtNv.js.map +0 -1
  641. package/dist/SchmancyElement-PS1u0j1B.cjs +0 -2
  642. package/dist/SchmancyElement-PS1u0j1B.cjs.map +0 -1
  643. package/dist/area-CaEI33G0.cjs +0 -21
  644. package/dist/area-CaEI33G0.cjs.map +0 -1
  645. package/dist/area-DtCNCb8w.js.map +0 -1
  646. package/dist/audio-B924fI5N.cjs.map +0 -1
  647. package/dist/audio-DdN76ikW.js.map +0 -1
  648. package/dist/autocomplete-Dq3BkitV.cjs +0 -115
  649. package/dist/autocomplete-Dq3BkitV.cjs.map +0 -1
  650. package/dist/autocomplete-UNOknYUz.js.map +0 -1
  651. package/dist/busy--WqiXKnl.cjs +0 -134
  652. package/dist/busy--WqiXKnl.cjs.map +0 -1
  653. package/dist/busy-DzXyO0z6.js +0 -173
  654. package/dist/busy-DzXyO0z6.js.map +0 -1
  655. package/dist/button-CTvS5YX4.cjs.map +0 -1
  656. package/dist/button-DgoDfcJx.js.map +0 -1
  657. package/dist/card-C6ijJZpF.js.map +0 -1
  658. package/dist/card-Ci3_9Dd4.cjs +0 -177
  659. package/dist/card-Ci3_9Dd4.cjs.map +0 -1
  660. package/dist/chips-9eG-96_D.cjs.map +0 -1
  661. package/dist/chips-DF7akwz7.js.map +0 -1
  662. package/dist/date-range-C13_R3OA.js +0 -966
  663. package/dist/date-range-C13_R3OA.js.map +0 -1
  664. package/dist/date-range-Q2xj5Syc.cjs +0 -142
  665. package/dist/date-range-Q2xj5Syc.cjs.map +0 -1
  666. package/dist/date-range-inline-BnOD-ddB.js.map +0 -1
  667. package/dist/date-range-inline-DV2c_gWM.cjs.map +0 -1
  668. package/dist/details-B2-jECBh.cjs.map +0 -1
  669. package/dist/details-ByF66CyY.js.map +0 -1
  670. package/dist/directives-BL7mzVsA.js.map +0 -1
  671. package/dist/directives-DCb_LA9R.cjs.map +0 -1
  672. package/dist/divider-Bv2QiOZL.cjs +0 -57
  673. package/dist/divider-Bv2QiOZL.cjs.map +0 -1
  674. package/dist/divider-gYuz0zDU.js +0 -89
  675. package/dist/divider-gYuz0zDU.js.map +0 -1
  676. package/dist/expand-B9IUGVtc.cjs +0 -141
  677. package/dist/expand-B9IUGVtc.cjs.map +0 -1
  678. package/dist/expand-cZ8rfCWP.js.map +0 -1
  679. package/dist/form-DowzVsgI.cjs.map +0 -1
  680. package/dist/form-tG7LwDm4.js.map +0 -1
  681. package/dist/icons-BZeCloP9.cjs +0 -24
  682. package/dist/icons-BZeCloP9.cjs.map +0 -1
  683. package/dist/icons-Dup5skuk.js.map +0 -1
  684. package/dist/iframe-CDJjnNmo.cjs.map +0 -1
  685. package/dist/iframe-Xc3EPMZT.js.map +0 -1
  686. package/dist/input-DnmC6J1T.cjs.map +0 -1
  687. package/dist/input-cTyDxW9L.js.map +0 -1
  688. package/dist/input-chip-CV91URyU.cjs +0 -146
  689. package/dist/input-chip-CV91URyU.cjs.map +0 -1
  690. package/dist/input-chip-CYI17YOq.js.map +0 -1
  691. package/dist/layout-CNlZSJFU.cjs.map +0 -1
  692. package/dist/layout-DDxw0EwL.js.map +0 -1
  693. package/dist/lightbox-CH-y3rYB.js.map +0 -1
  694. package/dist/lightbox-CvtqoInF.cjs.map +0 -1
  695. package/dist/list-Dl8KfxrF.cjs +0 -40
  696. package/dist/list-Dl8KfxrF.cjs.map +0 -1
  697. package/dist/list-DrsawQ5R.js.map +0 -1
  698. package/dist/menu-BFRcTe3o.cjs.map +0 -1
  699. package/dist/menu-CsY5lMqY.js.map +0 -1
  700. package/dist/mixins-BoMURWag.cjs.map +0 -1
  701. package/dist/mixins-bCEXbwJV.js.map +0 -1
  702. package/dist/notification-DFKRMmSq.js.map +0 -1
  703. package/dist/notification-FBf3Mb2e.cjs.map +0 -1
  704. package/dist/option-Ct0lGdH3.js.map +0 -1
  705. package/dist/option-Il1KpU8M.cjs +0 -43
  706. package/dist/option-Il1KpU8M.cjs.map +0 -1
  707. package/dist/overlay-Bh8Q_R01.js.map +0 -1
  708. package/dist/overlay-sRXiMkjn.cjs.map +0 -1
  709. package/dist/overlay.confirm-body-CQihsR20.js.map +0 -1
  710. package/dist/overlay.confirm-body-Jc1EuMGs.cjs.map +0 -1
  711. package/dist/overlay.service-9Dp3g7ot.cjs.map +0 -1
  712. package/dist/overlay.service-BXPgS7ay.js.map +0 -1
  713. package/dist/progress-CWC5XYZ_.cjs +0 -51
  714. package/dist/progress-CWC5XYZ_.cjs.map +0 -1
  715. package/dist/progress-CYLshdo2.js.map +0 -1
  716. package/dist/radio-group-6kCgOgBL.cjs.map +0 -1
  717. package/dist/radio-group-bZtZHOj_.js.map +0 -1
  718. package/dist/select-CU3X-PIa.js.map +0 -1
  719. package/dist/select-MXsF8KsU.cjs +0 -56
  720. package/dist/select-MXsF8KsU.cjs.map +0 -1
  721. package/dist/sound.service-B4ZmXpH9.js.map +0 -1
  722. package/dist/sound.service-DjlMvicQ.cjs.map +0 -1
  723. package/dist/splash-screen-CN9dZcqC.cjs +0 -41
  724. package/dist/splash-screen-CN9dZcqC.cjs.map +0 -1
  725. package/dist/splash-screen-emCLYoVl.js.map +0 -1
  726. package/dist/src-DGDTkOvC.js.map +0 -1
  727. package/dist/src-DK3111z_.cjs +0 -240
  728. package/dist/src-DK3111z_.cjs.map +0 -1
  729. package/dist/state-CumAEPQH.cjs.map +0 -1
  730. package/dist/state-DMd_FUeA.js.map +0 -1
  731. package/dist/surface-DGI-FBoi.cjs +0 -7
  732. package/dist/surface-DGI-FBoi.cjs.map +0 -1
  733. package/dist/tabs-4T_4kCf-.js.map +0 -1
  734. package/dist/tabs-Byxxt-AH.cjs.map +0 -1
  735. package/dist/textarea-BwYwH9fu.cjs.map +0 -1
  736. package/dist/textarea-kkYNk1ET.js.map +0 -1
  737. package/dist/theme.service-Dv_55nfE.js.map +0 -1
  738. package/dist/theme.service-pjkTM209.cjs.map +0 -1
  739. package/dist/typography-BVkU11_q.js +0 -358
  740. package/dist/typography-BVkU11_q.js.map +0 -1
  741. package/dist/typography-aaQaIcNc.cjs +0 -282
  742. package/dist/typography-aaQaIcNc.cjs.map +0 -1
  743. package/dist/utils-DTa3QHxk.cjs.map +0 -1
  744. package/dist/utils-H8wNknWC.js.map +0 -1
  745. package/dist/window-C76zstbV.js.map +0 -1
  746. package/dist/window-CmB9XZzT.cjs +0 -58
  747. package/dist/window-CmB9XZzT.cjs.map +0 -1
  748. package/src/form/fields/date-range/date-range-presets.ts +0 -220
  749. package/src/form/fields/date-range/date-utils.ts +0 -58
  750. package/types/src/form/fields/date-range/date-range-presets.d.ts +0 -18
  751. package/types/src/form/fields/date-range/date-utils.d.ts +0 -15
  752. /package/dist/{hashContent-iRZJJWtE.cjs → hashContent--s09Ed_g.cjs} +0 -0
  753. /package/dist/{hashContent-BqU6v1Xr.js → hashContent-CAvrQ56N.js} +0 -0
  754. /package/dist/{rxjs-utils-Csnks202.cjs → rxjs-utils-4P2v57ke.cjs} +0 -0
  755. /package/dist/{rxjs-utils-d-ivVN84.js → rxjs-utils-JMFdgQSl.js} +0 -0
  756. /package/dist/{theme.interface-CSt7JUBD.cjs → theme.interface-B-qxDsZQ.cjs} +0 -0
  757. /package/dist/{theme.interface-odQEpZZH.js → theme.interface-B7caS5cg.js} +0 -0
  758. /package/dist/{utils-DTa3QHxk.cjs → utils-DIXndz6Q.cjs} +0 -0
  759. /package/dist/{utils-H8wNknWC.js → utils-dSPH7Oh9.js} +0 -0
@@ -1,146 +1,600 @@
1
- import { afterEach, beforeEach, describe, expect, it } from 'vitest'
2
- import './date-range'
1
+ import { afterEach, describe, expect, it, vi } from 'vitest'
3
2
  import { expectNoA11yViolations } from '../../../test-utils/a11y'
3
+ import type { SchmancyDateRange } from './date-range'
4
+ import './date-range'
5
+ // Ensure schmancy-overlay is registered in this page's customElements registry
6
+ // (the decorator in overlay.component runs on import, which is required before
7
+ // show() can create a functional overlay element in browser tests).
8
+ import '../../../overlay/overlay.component'
9
+
10
+ // ---------------------------------------------------------------------------
11
+ // Helpers
12
+ // ---------------------------------------------------------------------------
4
13
 
5
14
  const nextUpdate = () => new Promise(r => requestAnimationFrame(() => r(null)))
6
15
 
16
+ /** Mount a <schmancy-date-range> in a host div appended to body. */
17
+ async function mountEl(innerHTML: string): Promise<HTMLDivElement> {
18
+ const host = document.createElement('div')
19
+ host.innerHTML = innerHTML
20
+ document.body.appendChild(host)
21
+ const el = host.querySelector('schmancy-date-range') as SchmancyDateRange
22
+ await nextUpdate()
23
+ await nextUpdate()
24
+ if (el && 'updateComplete' in el) await (el as unknown as { updateComplete: Promise<unknown> }).updateComplete
25
+ return host
26
+ }
27
+
28
+ const dr = (root: HTMLElement): SchmancyDateRange =>
29
+ root.querySelector('schmancy-date-range') as SchmancyDateRange
30
+
31
+ // ---------------------------------------------------------------------------
32
+ // Suites
33
+ // ---------------------------------------------------------------------------
34
+
7
35
  describe('schmancy-date-range', () => {
8
- let host: HTMLDivElement
36
+ const hosts: HTMLDivElement[] = []
9
37
 
10
- beforeEach(() => {
11
- host = document.createElement('div')
12
- document.body.appendChild(host)
38
+ afterEach(async () => {
39
+ for (const h of hosts) h.remove()
40
+ hosts.length = 0
41
+ // Flush microtasks so overlay.finalize's queueMicrotask(() => el.remove()) runs,
42
+ // then remove any stray overlay elements left in the DOM.
43
+ await nextUpdate()
44
+ document.querySelectorAll('schmancy-overlay').forEach(o => o.remove())
13
45
  })
14
46
 
15
- afterEach(() => {
16
- host.remove()
47
+ async function mount(innerHTML: string): Promise<HTMLDivElement> {
48
+ const host = await mountEl(innerHTML)
49
+ hosts.push(host)
50
+ return host
51
+ }
52
+
53
+ // -------------------------------------------------------------------------
54
+ describe('FormData contract', () => {
55
+ it('contributes ${name}.start and ${name}.end when both set', async () => {
56
+ const host = await mount('<form><schmancy-date-range name="window"></schmancy-date-range></form>')
57
+ const form = host.querySelector('form') as HTMLFormElement
58
+ const el = dr(host)
59
+ el.start = '2026-01-01'
60
+ el.end = '2026-01-31'
61
+ await el.updateComplete
62
+ const fd = new FormData(form)
63
+ expect(fd.get('window.start')).toBe('2026-01-01')
64
+ expect(fd.get('window.end')).toBe('2026-01-31')
65
+ })
66
+
67
+ it('omits empty endpoint from FormData', async () => {
68
+ const host = await mount('<form><schmancy-date-range name="window"></schmancy-date-range></form>')
69
+ const form = host.querySelector('form') as HTMLFormElement
70
+ const el = dr(host)
71
+ el.start = '2026-01-01'
72
+ el.end = null
73
+ await el.updateComplete
74
+ const fd = new FormData(form)
75
+ expect(fd.get('window.start')).toBe('2026-01-01')
76
+ expect(fd.get('window.end')).toBeNull()
77
+ })
78
+
79
+ it('submits nothing when name is unset', async () => {
80
+ const host = await mount('<form><schmancy-date-range></schmancy-date-range></form>')
81
+ const form = host.querySelector('form') as HTMLFormElement
82
+ const el = dr(host)
83
+ el.start = '2026-01-01'
84
+ el.end = '2026-01-31'
85
+ await el.updateComplete
86
+ expect([...new FormData(form).keys()]).toEqual([])
87
+ })
88
+
89
+ it('submits nothing when disabled', async () => {
90
+ const host = await mount('<form><schmancy-date-range name="window" disabled></schmancy-date-range></form>')
91
+ const form = host.querySelector('form') as HTMLFormElement
92
+ const el = dr(host)
93
+ el.start = '2026-01-01'
94
+ el.end = '2026-01-31'
95
+ await el.updateComplete
96
+ expect([...new FormData(form).keys()]).toEqual([])
97
+ })
17
98
  })
18
99
 
19
- 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')
100
+ // -------------------------------------------------------------------------
101
+ describe('validity', () => {
102
+ it('is invalid when required and both endpoints empty', async () => {
103
+ const host = await mount('<form><schmancy-date-range name="w" required></schmancy-date-range></form>')
104
+ const form = host.querySelector('form') as HTMLFormElement
105
+ const el = dr(host)
106
+ await el.updateComplete
107
+ expect(el.checkValidity()).toBe(false)
108
+ expect(form.checkValidity()).toBe(false)
109
+ })
110
+
111
+ it('becomes valid once both endpoints are set', async () => {
112
+ const host = await mount('<form><schmancy-date-range name="w" required></schmancy-date-range></form>')
113
+ const form = host.querySelector('form') as HTMLFormElement
114
+ const el = dr(host)
115
+ el.start = '2026-01-01'
116
+ el.end = '2026-01-02'
117
+ await el.updateComplete
118
+ expect(el.checkValidity()).toBe(true)
119
+ expect(form.checkValidity()).toBe(true)
120
+ })
121
+
122
+ it('renders invalid surface with the ACTUAL message after markSubmitted', async () => {
123
+ const host = await mount('<form><schmancy-date-range name="w" required></schmancy-date-range></form>')
124
+ const form = host.querySelector('form') as HTMLFormElement
125
+ const el = dr(host)
126
+ await el.updateComplete
127
+
128
+ // Platform surface blocks submit
129
+ expect(form.checkValidity()).toBe(false)
130
+
131
+ // Rendered surface gates on submit (validateOn default)
132
+ el.markSubmitted()
133
+ el.checkValidity()
134
+ await el.updateComplete
135
+ await nextUpdate()
136
+
137
+ const root = el.shadowRoot!
138
+ const alert = root.querySelector('[role="alert"]')
139
+ expect(alert, 'role=alert must render').not.toBeNull()
140
+ expect(alert?.textContent?.trim()).toBe('Please select a complete date range.')
141
+ expect(
142
+ root.querySelector('section.outline-error-default'),
143
+ 'control must carry invalid treatment',
144
+ ).not.toBeNull()
145
+ })
146
+
147
+ it('clears both validity surfaces once both endpoints set', async () => {
148
+ const host = await mount('<form><schmancy-date-range name="w" required></schmancy-date-range></form>')
149
+ const form = host.querySelector('form') as HTMLFormElement
150
+ const el = dr(host)
151
+ await el.updateComplete
152
+ el.markSubmitted()
153
+ el.checkValidity()
154
+ await el.updateComplete
155
+
156
+ el.start = '2026-01-01'
157
+ el.end = '2026-01-31'
158
+ await el.updateComplete
159
+ await nextUpdate()
160
+
161
+ expect(form.checkValidity()).toBe(true)
162
+ expect(el.shadowRoot!.querySelector('[role="alert"]')).toBeNull()
163
+ expect(el.shadowRoot!.querySelector('section.outline-error-default')).toBeNull()
164
+ })
39
165
  })
40
166
 
41
- 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([])
167
+ // -------------------------------------------------------------------------
168
+ describe('events', () => {
169
+ it('change event detail carries {start, end, preset}', async () => {
170
+ const host = await mount('<schmancy-date-range name="window"></schmancy-date-range>')
171
+ const el = dr(host)
172
+ el.start = '2026-01-01'
173
+ el.end = '2026-01-07'
174
+ await el.updateComplete
175
+
176
+ const received: CustomEvent[] = []
177
+ el.addEventListener('change', (e) => received.push(e as CustomEvent))
178
+
179
+ // PageDown keyboard shortcut triggers shiftDateRange → commitRange → change event
180
+ el.dispatchEvent(
181
+ new KeyboardEvent('keydown', { key: 'PageDown', bubbles: true, cancelable: true }),
182
+ )
183
+ await el.updateComplete
184
+
185
+ expect(received.length).toBeGreaterThan(0)
186
+ const detail = received[received.length - 1].detail as {
187
+ start: string | null
188
+ end: string | null
189
+ preset: string | null
190
+ }
191
+ expect(detail).toHaveProperty('start')
192
+ expect(detail).toHaveProperty('end')
193
+ expect(detail).toHaveProperty('preset')
194
+ })
195
+
196
+ it('change event is composed (crosses shadow boundary)', async () => {
197
+ const host = await mount('<form><schmancy-date-range name="window"></schmancy-date-range></form>')
198
+ const form = host.querySelector('form') as HTMLFormElement
199
+ const el = dr(host)
200
+ el.start = '2026-01-01'
201
+ el.end = '2026-01-07'
202
+ await el.updateComplete
203
+
204
+ const received: CustomEvent[] = []
205
+ form.addEventListener('change', (e) => received.push(e as CustomEvent))
206
+
207
+ el.dispatchEvent(
208
+ new KeyboardEvent('keydown', { key: 'PageDown', bubbles: true, cancelable: true }),
209
+ )
210
+ await el.updateComplete
211
+
212
+ expect(received.length).toBeGreaterThan(0)
213
+ expect(received[received.length - 1].composed).toBe(true)
214
+ expect(received[received.length - 1].detail).toHaveProperty('start')
215
+ expect(received[received.length - 1].detail).toHaveProperty('end')
216
+ expect(received[received.length - 1].detail).toHaveProperty('preset')
217
+ })
218
+
219
+ // -----------------------------------------------------------------------
220
+ // input event — provisional sweep-preview contract
221
+ // -----------------------------------------------------------------------
222
+
223
+ it('input event detail carries exactly {start, end} — no preset field', async () => {
224
+ const host = await mount('<schmancy-date-range name="window"></schmancy-date-range>')
225
+ const el = dr(host)
226
+ await el.updateComplete
227
+
228
+ // Open the picker. Fire a pointerdown on the document first so the
229
+ // ambient-anchor capture in overlay.service records a MouseEvent with
230
+ // clientX/clientY, then use schmancy-button's overridden click() so the
231
+ // composed Event reaches toggleDropdown the same way the CTA wiring test
232
+ // does (btn.click() calls SchmancyButton.click() → dispatchEvent).
233
+ const btn = el.shadowRoot!.querySelector('schmancy-button') as HTMLElement
234
+ document.dispatchEvent(new MouseEvent('pointerdown', { bubbles: true, composed: true, clientX: 10, clientY: 10 }))
235
+ btn.click()
236
+ await el.updateComplete
237
+ await nextUpdate()
238
+
239
+ const inputReceived: CustomEvent[] = []
240
+ const changeReceived: CustomEvent[] = []
241
+ el.addEventListener('input', (e) => inputReceived.push(e as CustomEvent))
242
+ el.addEventListener('change', (e) => changeReceived.push(e as CustomEvent))
243
+
244
+ // The overlay appends to document.body (or schmancy-theme). Wait for the
245
+ // dialog to appear inside the overlay's shadow root.
246
+ const dialog = await vi.waitFor(
247
+ () => {
248
+ for (const o of document.querySelectorAll('schmancy-overlay')) {
249
+ const d = o.shadowRoot?.querySelector('schmancy-date-range-dialog')
250
+ if (d) return d
251
+ }
252
+ throw new Error('dialog not mounted yet')
253
+ },
254
+ { timeout: 2000 },
255
+ )
256
+
257
+ // Drive the bridge seam: dispatch the `calendar-input` event that
258
+ // schmancy-date-range-dialog re-emits from schmancy-calendar's `input`.
259
+ // The date-range @calendar-input handler re-emits as `input {start, end}`.
260
+ dialog.dispatchEvent(
261
+ new CustomEvent('calendar-input', {
262
+ detail: { start: '2026-06-01', end: '2026-06-15' },
263
+ bubbles: true,
264
+ composed: true,
265
+ }),
266
+ )
267
+ await el.updateComplete
268
+
269
+ // Must have fired at least one input event.
270
+ expect(inputReceived.length, 'input event must fire for sweep preview').toBeGreaterThan(0)
271
+
272
+ const detail = inputReceived[inputReceived.length - 1].detail as Record<string, unknown>
273
+ // Exact shape: {start, end} — no preset field.
274
+ expect(detail.start).toBe('2026-06-01')
275
+ expect(detail.end).toBe('2026-06-15')
276
+ expect(Object.keys(detail).toSorted()).toEqual(['end', 'start'])
277
+
278
+ // change must NOT have fired — provisional sweep is not a commit.
279
+ expect(changeReceived.length, 'change must not fire for provisional sweep').toBe(0)
280
+ })
281
+
282
+ it('input event is composed: true so it crosses the shadow boundary a <schmancy-form> listens across', async () => {
283
+ const host = await mount('<form><schmancy-date-range name="window"></schmancy-date-range></form>')
284
+ const form = host.querySelector('form') as HTMLFormElement
285
+ const el = dr(host)
286
+ await el.updateComplete
287
+
288
+ // Open the picker — same pointerdown + btn.click() pattern as the first test.
289
+ const btn2 = el.shadowRoot!.querySelector('schmancy-button') as HTMLElement
290
+ document.dispatchEvent(new MouseEvent('pointerdown', { bubbles: true, composed: true, clientX: 10, clientY: 10 }))
291
+ btn2.click()
292
+ await el.updateComplete
293
+ await nextUpdate()
294
+
295
+ const dialog = await vi.waitFor(
296
+ () => {
297
+ for (const o of document.querySelectorAll('schmancy-overlay')) {
298
+ const d = o.shadowRoot?.querySelector('schmancy-date-range-dialog')
299
+ if (d) return d
300
+ }
301
+ throw new Error('dialog not mounted yet')
302
+ },
303
+ { timeout: 2000 },
304
+ )
305
+
306
+ // Listen at the form boundary — outside the component's shadow root.
307
+ const formReceived: Event[] = []
308
+ form.addEventListener('input', (e) => formReceived.push(e))
309
+
310
+ dialog.dispatchEvent(
311
+ new CustomEvent('calendar-input', {
312
+ detail: { start: '2026-07-01', end: '2026-07-10' },
313
+ bubbles: true,
314
+ composed: true,
315
+ }),
316
+ )
317
+ await el.updateComplete
318
+
319
+ const last = formReceived[formReceived.length - 1] as CustomEvent<{ start: string; end: string }>
320
+ expect(formReceived.length, 'input must cross shadow boundary (composed: true)').toBeGreaterThan(0)
321
+ expect(last.composed).toBe(true)
322
+ expect(last.detail.start).toBe('2026-07-01')
323
+ expect(last.detail.end).toBe('2026-07-10')
324
+ })
46
325
  })
47
326
 
48
- 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)
327
+ // -------------------------------------------------------------------------
328
+ describe('CTA wiring', () => {
329
+ it('clicking the label button sets aria-expanded=true', async () => {
330
+ const host = await mount('<schmancy-date-range name="window"></schmancy-date-range>')
331
+ const el = dr(host)
332
+ await el.updateComplete
333
+
334
+ const btn = el.shadowRoot!.querySelector('schmancy-button') as HTMLElement
335
+ expect(btn).not.toBeNull()
336
+
337
+ btn.click()
338
+ await el.updateComplete
339
+ await nextUpdate()
340
+
341
+ expect(
342
+ el.shadowRoot!.querySelector('[aria-expanded="true"]'),
343
+ 'aria-expanded must be true after CTA click',
344
+ ).not.toBeNull()
345
+ })
69
346
  })
70
347
 
71
- it('paints both validity surfaces when required, empty, and submitted', async () => {
72
- host.innerHTML = `<form><schmancy-date-range name="w" required></schmancy-date-range></form>`
73
- const form = host.querySelector('form') as HTMLFormElement
74
- const dr = host.querySelector('schmancy-date-range') as HTMLElement & {
75
- dateFrom: { label: string; value: string }
76
- dateTo: { label: string; value: string }
77
- markSubmitted(): void
78
- checkValidity(): boolean
79
- }
80
- await nextUpdate()
81
- await nextUpdate()
82
- dr.dateFrom = { label: 'From', value: '' }
83
- dr.dateTo = { label: 'To', value: '' }
84
- await nextUpdate()
348
+ // -------------------------------------------------------------------------
349
+ describe('teardown', () => {
350
+ it('stops responding to document keydown after disconnect', async () => {
351
+ const host = await mount('<schmancy-date-range name="window"></schmancy-date-range>')
352
+ const el = dr(host)
353
+ el.start = '2026-01-01'
354
+ el.end = '2026-01-07'
355
+ await el.updateComplete
85
356
 
86
- // Platform surface: the form blocks submit.
87
- expect(form.checkValidity()).toBe(false)
357
+ const received: Event[] = []
358
+ el.addEventListener('change', (e) => received.push(e))
88
359
 
89
- // Rendered surface is gated until submit (validateOn default 'dirty').
90
- dr.markSubmitted()
91
- dr.checkValidity()
92
- await nextUpdate()
93
- await nextUpdate()
360
+ el.remove()
94
361
 
95
- const root = (dr as unknown as { shadowRoot: ShadowRoot }).shadowRoot
96
- const alert = root.querySelector('[role="alert"]')
97
- expect(alert, 'a role=alert message must render').not.toBeNull()
98
- expect(alert?.textContent?.trim()).toBe('Please select a date range.')
99
- // Control itself carries a visible invalid treatment.
100
- expect(
101
- root.querySelector('section.outline-error-default'),
102
- 'the control must carry an invalid treatment',
103
- ).not.toBeNull()
104
-
105
- // Filling the range clears both surfaces.
106
- dr.dateFrom = { label: 'From', value: '2026-01-01' }
107
- dr.dateTo = { label: 'To', value: '2026-01-31' }
108
- await nextUpdate()
109
- await nextUpdate()
110
- expect(form.checkValidity()).toBe(true)
111
- expect(root.querySelector('[role="alert"]')).toBeNull()
112
- expect(root.querySelector('section.outline-error-default')).toBeNull()
362
+ document.dispatchEvent(
363
+ new KeyboardEvent('keydown', { key: 'PageDown', bubbles: true, cancelable: true }),
364
+ )
365
+ await nextUpdate()
366
+
367
+ expect(received).toHaveLength(0)
368
+ })
113
369
  })
114
370
 
115
- it('has no axe-core a11y violations', async () => {
116
- host.innerHTML = `<schmancy-date-range name="window"></schmancy-date-range>`
117
- await nextUpdate()
118
- await nextUpdate()
119
- // Trigger button-group rendering with values populated.
120
- const dr = host.querySelector('schmancy-date-range') as HTMLElement & {
121
- dateFrom: { label: string; value: string }
122
- dateTo: { label: string; value: string }
123
- }
124
- dr.dateFrom = { label: 'From', value: '2026-01-01' }
125
- dr.dateTo = { label: 'To', value: '2026-01-31' }
126
- await nextUpdate()
127
- await nextUpdate()
128
- await expectNoA11yViolations(host)
371
+ // -------------------------------------------------------------------------
372
+ describe('axe-core accessibility', () => {
373
+ it('has no a11y violations', async () => {
374
+ const host = await mount('<schmancy-date-range name="window"></schmancy-date-range>')
375
+ const el = dr(host)
376
+ el.start = '2026-01-01'
377
+ el.end = '2026-01-31'
378
+ await el.updateComplete
379
+ await nextUpdate()
380
+ await expectNoA11yViolations(host)
381
+ })
129
382
  })
130
383
 
131
- it('omits empty dates from FormData', async () => {
132
- host.innerHTML = `<form><schmancy-date-range name="w"></schmancy-date-range></form>`
133
- const form = host.querySelector('form') as HTMLFormElement
134
- const dr = host.querySelector('schmancy-date-range') as HTMLElement & {
135
- dateFrom: { label: string; value: string }
136
- dateTo: { label: string; value: string }
137
- }
138
- await nextUpdate()
139
- dr.dateFrom = { label: 'From', value: '' }
140
- dr.dateTo = { label: 'To', value: '' }
141
- await nextUpdate()
142
- const fd = new FormData(form)
143
- expect(fd.get('wFrom')).toBeNull()
144
- expect(fd.get('wTo')).toBeNull()
384
+ // -------------------------------------------------------------------------
385
+ describe('datetime-local', () => {
386
+ // Calendar pick commits start-of-day / end-of-day YYYY-MM-DDTHH:mm
387
+ it('calendar pick commits start-of-day T00:00 and end-of-day T23:59', async () => {
388
+ const host = await mount('<schmancy-date-range name="dtw" type="datetime-local"></schmancy-date-range>')
389
+ const el = dr(host)
390
+ await el.updateComplete
391
+
392
+ // Open the picker.
393
+ const btn = el.shadowRoot!.querySelector('schmancy-button') as HTMLElement
394
+ document.dispatchEvent(new MouseEvent('pointerdown', { bubbles: true, composed: true, clientX: 10, clientY: 10 }))
395
+ btn.click()
396
+ await el.updateComplete
397
+ await nextUpdate()
398
+
399
+ const dialog = await vi.waitFor(
400
+ () => {
401
+ for (const o of document.querySelectorAll('schmancy-overlay')) {
402
+ const d = o.shadowRoot?.querySelector('schmancy-date-range-dialog')
403
+ if (d) return d
404
+ }
405
+ throw new Error('dialog not mounted yet')
406
+ },
407
+ { timeout: 2000 },
408
+ )
409
+
410
+ // Dispatch the calendar `change` event on the schmancy-calendar element inside
411
+ // the dialog's shadow root so it routes through handleCalendarChange, which is
412
+ // responsible for converting YYYY-MM-DD → YYYY-MM-DDTHH:mm when type="datetime-local".
413
+ const calendar = dialog.shadowRoot?.querySelector('schmancy-calendar')
414
+ expect(calendar, 'schmancy-calendar must be in the dialog shadow root').not.toBeNull()
415
+
416
+ const changeReceived: CustomEvent[] = []
417
+ el.addEventListener('change', (e) => changeReceived.push(e as CustomEvent))
418
+
419
+ calendar!.dispatchEvent(
420
+ new CustomEvent('change', {
421
+ detail: { value: null, start: '2026-06-10', end: '2026-06-20' },
422
+ bubbles: true,
423
+ composed: true,
424
+ }),
425
+ )
426
+ await el.updateComplete
427
+
428
+ expect(changeReceived.length, 'change must fire after calendar pick').toBeGreaterThan(0)
429
+ const detail = changeReceived[changeReceived.length - 1].detail as {
430
+ start: string | null
431
+ end: string | null
432
+ preset: string | null
433
+ }
434
+ expect(detail.start).toBe('2026-06-10T00:00')
435
+ expect(detail.end).toBe('2026-06-20T23:59')
436
+ expect(detail.preset).toBeNull()
437
+ })
438
+
439
+ // Typed path edits time without moving the date.
440
+ it('typed datetime-local input replaces time component without moving the date', async () => {
441
+ const host = await mount('<schmancy-date-range name="dtw" type="datetime-local"></schmancy-date-range>')
442
+ const el = dr(host)
443
+ el.start = '2026-06-10T00:00'
444
+ el.end = '2026-06-20T23:59'
445
+ await el.updateComplete
446
+
447
+ // Open the picker.
448
+ const btn = el.shadowRoot!.querySelector('schmancy-button') as HTMLElement
449
+ document.dispatchEvent(new MouseEvent('pointerdown', { bubbles: true, composed: true, clientX: 10, clientY: 10 }))
450
+ btn.click()
451
+ await el.updateComplete
452
+ await nextUpdate()
453
+
454
+ const dialog = await vi.waitFor(
455
+ () => {
456
+ for (const o of document.querySelectorAll('schmancy-overlay')) {
457
+ const d = o.shadowRoot?.querySelector('schmancy-date-range-dialog')
458
+ if (d) return d
459
+ }
460
+ throw new Error('dialog not mounted yet')
461
+ },
462
+ { timeout: 2000 },
463
+ )
464
+
465
+ // Simulate the typed From input changing the time (same date, different time).
466
+ // handleFromChange dispatches `calendar-change` directly with the full datetime
467
+ // value from the input, preserving the date part and replacing the time.
468
+ // We dispatch `calendar-change` at the dialog bridge seam (same approach used
469
+ // in the existing `input event` tests) to verify the contract end-to-end.
470
+ const changeReceived: CustomEvent[] = []
471
+ el.addEventListener('change', (e) => changeReceived.push(e as CustomEvent))
472
+
473
+ dialog.dispatchEvent(
474
+ new CustomEvent('calendar-change', {
475
+ // The typed input produces a full YYYY-MM-DDTHH:mm value; the dialog
476
+ // passes this through unchanged (no T-injection since it already has T).
477
+ detail: { start: '2026-06-10T09:30', end: '2026-06-20T23:59' },
478
+ bubbles: true,
479
+ composed: true,
480
+ }),
481
+ )
482
+ await el.updateComplete
483
+
484
+ expect(changeReceived.length).toBeGreaterThan(0)
485
+ const detail = changeReceived[changeReceived.length - 1].detail as {
486
+ start: string | null
487
+ end: string | null
488
+ }
489
+ // Date part preserved; time replaced.
490
+ expect(detail.start).toBe('2026-06-10T09:30')
491
+ expect(detail.end).toBe('2026-06-20T23:59')
492
+ })
493
+
494
+ // FormData carries YYYY-MM-DDTHH:mm ISO entries.
495
+ it('FormData ${name}.start and ${name}.end carry datetime ISO strings', async () => {
496
+ const host = await mount(
497
+ '<form><schmancy-date-range name="dtw" type="datetime-local"></schmancy-date-range></form>',
498
+ )
499
+ const form = host.querySelector('form') as HTMLFormElement
500
+ const el = dr(host)
501
+ el.start = '2026-06-10T09:30'
502
+ el.end = '2026-06-20T18:00'
503
+ await el.updateComplete
504
+ const fd = new FormData(form)
505
+ expect(fd.get('dtw.start')).toBe('2026-06-10T09:30')
506
+ expect(fd.get('dtw.end')).toBe('2026-06-20T18:00')
507
+ })
508
+
509
+ // Default presets are rebuilt with datetime format when type changes.
510
+ it('default presets use YYYY-MM-DDTHH:mm format when type="datetime-local"', async () => {
511
+ const host = await mount('<schmancy-date-range name="dtw"></schmancy-date-range>')
512
+ const el = dr(host)
513
+ // Initially type=date; presets are YYYY-MM-DD.
514
+ expect(el.presets[0].start).toMatch(/^\d{4}-\d{2}-\d{2}$/)
515
+
516
+ // Switch to datetime-local; presets should rebuild.
517
+ el.type = 'datetime-local'
518
+ await el.updateComplete
519
+
520
+ expect(el.presets[0].start).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/)
521
+ expect(el.presets[0].end).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/)
522
+ })
523
+
524
+ // usingDefaultPresets race: setting type + presets in the same willUpdate cycle
525
+ // must leave the consumer's presets intact (not overwritten by rebuilt defaults).
526
+ it('consumer presets survive when type and presets are set together', async () => {
527
+ const host = await mount('<schmancy-date-range name="dtw"></schmancy-date-range>')
528
+ const el = dr(host)
529
+ await el.updateComplete
530
+
531
+ const customPresets = [
532
+ { id: 'q1', label: 'Q1 2026', start: '2026-01-01', end: '2026-03-31' },
533
+ { id: 'q2', label: 'Q2 2026', start: '2026-04-01', end: '2026-06-30' },
534
+ ]
535
+
536
+ // Set both type and presets in the same microtask so they arrive in one willUpdate.
537
+ el.type = 'datetime-local'
538
+ el.presets = customPresets
539
+ await el.updateComplete
540
+
541
+ // Consumer's presets must survive — not replaced by datetime-formatted defaults.
542
+ expect(el.presets).toHaveLength(2)
543
+ expect(el.presets[0].id).toBe('q1')
544
+ expect(el.presets[0].start).toBe('2026-01-01')
545
+ expect(el.presets[1].id).toBe('q2')
546
+ })
547
+
548
+ // Calendar pick in datetime mode — no double T insertion if already includes T.
549
+ it('dialog passes through already-formatted datetime values unchanged', async () => {
550
+ const host = await mount('<schmancy-date-range name="dtw" type="datetime-local"></schmancy-date-range>')
551
+ const el = dr(host)
552
+ el.start = '2026-06-10T00:00'
553
+ el.end = '2026-06-20T23:59'
554
+ await el.updateComplete
555
+
556
+ const btn = el.shadowRoot!.querySelector('schmancy-button') as HTMLElement
557
+ document.dispatchEvent(new MouseEvent('pointerdown', { bubbles: true, composed: true, clientX: 10, clientY: 10 }))
558
+ btn.click()
559
+ await el.updateComplete
560
+ await nextUpdate()
561
+
562
+ const dialog = await vi.waitFor(
563
+ () => {
564
+ for (const o of document.querySelectorAll('schmancy-overlay')) {
565
+ const d = o.shadowRoot?.querySelector('schmancy-date-range-dialog')
566
+ if (d) return d
567
+ }
568
+ throw new Error('dialog not mounted yet')
569
+ },
570
+ { timeout: 2000 },
571
+ )
572
+
573
+ const calendar = dialog.shadowRoot?.querySelector('schmancy-calendar')
574
+ expect(calendar, 'schmancy-calendar must be in the dialog shadow root').not.toBeNull()
575
+
576
+ const changeReceived: CustomEvent[] = []
577
+ el.addEventListener('change', (e) => changeReceived.push(e as CustomEvent))
578
+
579
+ // Dispatch calendar change with a value that already contains T — must NOT
580
+ // become 2026-06-10T00:00T00:00. The dialog's handleCalendarChange guards with
581
+ // `!start.includes('T')` so already-formatted values pass through unchanged.
582
+ calendar!.dispatchEvent(
583
+ new CustomEvent('change', {
584
+ detail: { value: null, start: '2026-06-10T00:00', end: '2026-06-20T23:59' },
585
+ bubbles: true,
586
+ composed: true,
587
+ }),
588
+ )
589
+ await el.updateComplete
590
+
591
+ expect(changeReceived.length).toBeGreaterThan(0)
592
+ const detail = changeReceived[changeReceived.length - 1].detail as {
593
+ start: string | null
594
+ end: string | null
595
+ }
596
+ expect(detail.start).toBe('2026-06-10T00:00')
597
+ expect(detail.end).toBe('2026-06-20T23:59')
598
+ })
145
599
  })
146
600
  })