@mhmo91/schmancy 0.10.41 → 0.10.43

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 (764) hide show
  1. package/custom-elements.json +291 -179
  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 +4057 -4082
  7. package/dist/agent/schmancy.agent.js.map +1 -1
  8. package/dist/agent/schmancy.manifest.json +225 -94
  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-BiM7V2ns.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-CxO_j__6.js → audio-B_0PGwYC.js} +1 -1
  18. package/dist/audio-B_0PGwYC.js.map +1 -0
  19. package/dist/{audio-xXFfMPCS.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-DUBY9RtH.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-ScvAima3.js → boat-DoZGgQ0P.js} +6 -8
  36. package/dist/{boat-ScvAima3.js.map → boat-DoZGgQ0P.js.map} +1 -1
  37. package/dist/{boat-BIYaPAHp.cjs → boat-sg0cWO8a.cjs} +3 -5
  38. package/dist/{boat-BIYaPAHp.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-BTpxQ1Kd.cjs → button-Cml67Y_d.cjs} +41 -32
  52. package/dist/button-Cml67Y_d.cjs.map +1 -0
  53. package/dist/{button-D7QHfYf4.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-DCdtJ5Dy.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-DVtyPk7l.js → checkbox-Bjp7kWuE.js} +2 -2
  72. package/dist/{checkbox-DVtyPk7l.js.map → checkbox-Bjp7kWuE.js.map} +1 -1
  73. package/dist/{checkbox-CYGOVPP-.cjs → checkbox-DZ2Wrz7Y.cjs} +1 -1
  74. package/dist/{checkbox-CYGOVPP-.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-DVes-BSz.cjs → chips-BHBVkxsa.cjs} +142 -153
  78. package/dist/chips-BHBVkxsa.cjs.map +1 -0
  79. package/dist/{chips-C5bpgWyf.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 +54 -38
  84. package/dist/connectivity.cjs.map +1 -1
  85. package/dist/connectivity.js +56 -40
  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-CVAWMdar.cjs +138 -0
  92. package/dist/date-range-CVAWMdar.cjs.map +1 -0
  93. package/dist/date-range-D2NZU5Yg.js +433 -0
  94. package/dist/date-range-D2NZU5Yg.js.map +1 -0
  95. package/dist/{date-range-inline-Dx4Reboo.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-DPqY9YYf.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-BnleHmYe.js → details-Ct1_GwKr.js} +104 -92
  110. package/dist/details-Ct1_GwKr.js.map +1 -0
  111. package/dist/{details-Bx2jSJxG.cjs → details-D4fVOaj4.cjs} +109 -97
  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-CYf2fAdA.cjs → directives-B2VxfwRL.cjs} +1 -1
  116. package/dist/directives-B2VxfwRL.cjs.map +1 -0
  117. package/dist/{directives-d1rEbW1A.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-DNrWuG_-.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-V7VQKTb8.cjs → float-BPQlDyai.cjs} +1 -1
  144. package/dist/{float-V7VQKTb8.cjs.map → float-BPQlDyai.cjs.map} +1 -1
  145. package/dist/{float-C_CMle0q.js → float-BQcxj3i_.js} +2 -2
  146. package/dist/{float-C_CMle0q.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-DaaAQd2A.cjs → form-CoWFnClb.cjs} +8 -13
  150. package/dist/form-CoWFnClb.cjs.map +1 -0
  151. package/dist/{form-CMgYSZ3y.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-mbpHO_73.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-88SN5JPu.cjs → iframe-BkSukM9C.cjs} +9 -9
  170. package/dist/iframe-BkSukM9C.cjs.map +1 -0
  171. package/dist/{iframe-U3P1DnQv.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-CPWvGjE4.js → input-CPFCSQld.js} +3 -10
  178. package/dist/input-CPFCSQld.js.map +1 -0
  179. package/dist/{input-BY4Korc5.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-CCZ3i3Sf.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-BhfC26Ks.cjs → layout-CdyHy_oX.cjs} +1 -1
  196. package/dist/layout-CdyHy_oX.cjs.map +1 -0
  197. package/dist/{layout-DC0Npqu7.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-BSwWvDQc.js → lightbox-DIG0VLOK.js} +8 -14
  206. package/dist/lightbox-DIG0VLOK.js.map +1 -0
  207. package/dist/{lightbox-KrZQH9w9.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-BwGtAAfi.js → list-NrOYDPBo.js} +48 -34
  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-DX8d96x-.js → menu-B1Ei9SVj.js} +12 -12
  220. package/dist/menu-B1Ei9SVj.js.map +1 -0
  221. package/dist/{menu-jT_yAk5V.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-XGVIOvKt.cjs → mixins-Cjn20BQH.cjs} +42 -170
  226. package/dist/mixins-Cjn20BQH.cjs.map +1 -0
  227. package/dist/{mixins-COeG4DiX.js → mixins-q4KAL8Xr.js} +43 -177
  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-CAJVpLne.js → notification-COhUhUCr.js} +5 -7
  240. package/dist/notification-COhUhUCr.js.map +1 -0
  241. package/dist/{notification-DO3VXceY.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-JISY0wZJ.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-B1jVf-ge.cjs → overlay-BzgF8P7i.cjs} +48 -41
  252. package/dist/overlay-BzgF8P7i.cjs.map +1 -0
  253. package/dist/{overlay-CT-tMHDX.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-Dn-Zgogx.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-mYDYoJL8.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-yqTOyLlr.js → overlay.service-BuUeti6X.js} +2 -2
  264. package/dist/overlay.service-BuUeti6X.js.map +1 -0
  265. package/dist/{overlay.service-BQmva9GY.cjs → overlay.service-MMTiW2T3.cjs} +1 -1
  266. package/dist/overlay.service-MMTiW2T3.cjs.map +1 -0
  267. package/dist/{progress-CGWozq_n.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-DoSX5D2V.cjs → radio-group-CaAjg9UV.cjs} +1 -1
  274. package/dist/radio-group-CaAjg9UV.cjs.map +1 -0
  275. package/dist/{radio-group-CXkq6qAF.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-CU90i50_.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 +79 -39
  302. package/dist/skills/surface.md +79 -39
  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-m8WjOhjn.js → sound.service-AJwuk3yr.js} +1 -1
  308. package/dist/sound.service-AJwuk3yr.js.map +1 -0
  309. package/dist/{sound.service-Qhr8nCeG.cjs → sound.service-CVsxhQkX.cjs} +1 -1
  310. package/dist/sound.service-CVsxhQkX.cjs.map +1 -0
  311. package/dist/{splash-screen-Cs3dbPN3.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-CCVbLLgC.js → src-DAtcPmCb.js} +295 -389
  318. package/dist/src-DAtcPmCb.js.map +1 -0
  319. package/dist/src-DuRvYagm.cjs +237 -0
  320. package/dist/src-DuRvYagm.cjs.map +1 -0
  321. package/dist/{state--x58-AuK.cjs → state-BWQiqN6I.cjs} +1 -1
  322. package/dist/state-BWQiqN6I.cjs.map +1 -0
  323. package/dist/{state-QSwQ61sA.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-cqMsHJHM.js → surface-DXk1X1tL.js} +9 -9
  334. package/dist/surface-DXk1X1tL.js.map +1 -0
  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-Ib0Mh__1.js → tabs-BYhFWnsx.js} +7 -7
  346. package/dist/tabs-BYhFWnsx.js.map +1 -0
  347. package/dist/{tabs-Dk9UDWpq.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-CcRsw08B.js → textarea-BjDx1w2g.js} +37 -41
  354. package/dist/textarea-BjDx1w2g.js.map +1 -0
  355. package/dist/{textarea-Cntd9tfV.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-wwFbvp5e.cjs → theme-BVul7lHS.cjs} +6 -6
  360. package/dist/{theme-wwFbvp5e.cjs.map → theme-BVul7lHS.cjs.map} +1 -1
  361. package/dist/{theme-CKYXG0le.js → theme-Dvm5J8nh.js} +11 -11
  362. package/dist/{theme-CKYXG0le.js.map → theme-Dvm5J8nh.js.map} +1 -1
  363. package/dist/{theme-button-iLqT56KA.js → theme-button-Bko5ohFP.js} +2 -2
  364. package/dist/{theme-button-iLqT56KA.js.map → theme-button-Bko5ohFP.js.map} +1 -1
  365. package/dist/{theme-button-DE9Lrl7m.cjs → theme-button-YLY7zR1c.cjs} +1 -1
  366. package/dist/{theme-button-DE9Lrl7m.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-5RjyR7Sy.js → theme.service-D94nm7Bf.js} +1 -1
  374. package/dist/theme.service-D94nm7Bf.js.map +1 -0
  375. package/dist/{theme.service-DA6KY52G.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-Db5ZYY6t.js → window-CCmN4but.js} +28 -20
  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 +79 -39
  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 +60 -209
  422. package/src/badge/index.ts +1 -1
  423. package/src/boat/boat.ts +2 -4
  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 +91 -65
  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 +141 -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 +359 -122
  507. package/src/form/fields/date-range/date-range.ts +319 -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 +55 -191
  593. package/src/surface/surface.ts +18 -16
  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 +146 -114
  626. package/types/mixins/surface.mixin.d.ts +8 -14
  627. package/types/src/badge/badge.d.ts +15 -48
  628. package/types/src/calendar/calendar.d.ts +108 -0
  629. package/types/src/calendar/calendar.test.d.ts +1 -0
  630. package/types/src/calendar/index.d.ts +2 -0
  631. package/types/src/directives/cursor-glow.d.ts +1 -1
  632. package/types/src/directives/hummingbird.d.ts +3 -3
  633. package/types/src/form/fields/date-range/date-range-dialog.d.ts +24 -28
  634. package/types/src/form/fields/date-range/date-range.d.ts +35 -66
  635. package/types/src/form/fields/date-range/date-range.test.d.ts +1 -0
  636. package/types/src/form/fields/date-range/index.d.ts +1 -1
  637. package/types/src/index.d.ts +1 -0
  638. package/types/src/surface/surface.d.ts +9 -7
  639. package/types/src/surface/surface.styles.d.ts +15 -20
  640. package/types/src/types/surface.d.ts +17 -22
  641. package/types/src/utils/number.d.ts +1 -1
  642. package/types/src/window/window.d.ts +0 -1
  643. package/dist/SchmancyElement-D9WA9FP9.cjs +0 -2
  644. package/dist/SchmancyElement-D9WA9FP9.cjs.map +0 -1
  645. package/dist/SchmancyElement-OWgz9ePG.js +0 -286
  646. package/dist/SchmancyElement-OWgz9ePG.js.map +0 -1
  647. package/dist/area-BiM7V2ns.js.map +0 -1
  648. package/dist/area-C7XjCoet.cjs +0 -21
  649. package/dist/area-C7XjCoet.cjs.map +0 -1
  650. package/dist/audio-CxO_j__6.js.map +0 -1
  651. package/dist/audio-xXFfMPCS.cjs.map +0 -1
  652. package/dist/autocomplete-DD7Hd59N.cjs +0 -115
  653. package/dist/autocomplete-DD7Hd59N.cjs.map +0 -1
  654. package/dist/autocomplete-DUBY9RtH.js.map +0 -1
  655. package/dist/busy-BjsO3y2A.js +0 -173
  656. package/dist/busy-BjsO3y2A.js.map +0 -1
  657. package/dist/busy-UbCGkTAi.cjs +0 -134
  658. package/dist/busy-UbCGkTAi.cjs.map +0 -1
  659. package/dist/button-BTpxQ1Kd.cjs.map +0 -1
  660. package/dist/button-D7QHfYf4.js.map +0 -1
  661. package/dist/card-DCdtJ5Dy.js.map +0 -1
  662. package/dist/card-rprhCYIC.cjs +0 -177
  663. package/dist/card-rprhCYIC.cjs.map +0 -1
  664. package/dist/chips-C5bpgWyf.js.map +0 -1
  665. package/dist/chips-DVes-BSz.cjs.map +0 -1
  666. package/dist/date-range-DDUuBlJ6.cjs +0 -142
  667. package/dist/date-range-DDUuBlJ6.cjs.map +0 -1
  668. package/dist/date-range-IPlbrhwW.js +0 -966
  669. package/dist/date-range-IPlbrhwW.js.map +0 -1
  670. package/dist/date-range-inline-DPqY9YYf.js.map +0 -1
  671. package/dist/date-range-inline-Dx4Reboo.cjs.map +0 -1
  672. package/dist/details-BnleHmYe.js.map +0 -1
  673. package/dist/details-Bx2jSJxG.cjs.map +0 -1
  674. package/dist/directives-CYf2fAdA.cjs.map +0 -1
  675. package/dist/directives-d1rEbW1A.js.map +0 -1
  676. package/dist/divider-CimQJVr3.cjs +0 -57
  677. package/dist/divider-CimQJVr3.cjs.map +0 -1
  678. package/dist/divider-Cr-rx3vA.js +0 -89
  679. package/dist/divider-Cr-rx3vA.js.map +0 -1
  680. package/dist/expand-DNrWuG_-.js.map +0 -1
  681. package/dist/expand-_cp8oBjp.cjs +0 -141
  682. package/dist/expand-_cp8oBjp.cjs.map +0 -1
  683. package/dist/form-CMgYSZ3y.js.map +0 -1
  684. package/dist/form-DaaAQd2A.cjs.map +0 -1
  685. package/dist/icons-C2RkSXjP.cjs +0 -24
  686. package/dist/icons-C2RkSXjP.cjs.map +0 -1
  687. package/dist/icons-mbpHO_73.js.map +0 -1
  688. package/dist/iframe-88SN5JPu.cjs.map +0 -1
  689. package/dist/iframe-U3P1DnQv.js.map +0 -1
  690. package/dist/input-BY4Korc5.cjs.map +0 -1
  691. package/dist/input-CPWvGjE4.js.map +0 -1
  692. package/dist/input-chip-CCZ3i3Sf.js.map +0 -1
  693. package/dist/input-chip-kytMdbaM.cjs +0 -146
  694. package/dist/input-chip-kytMdbaM.cjs.map +0 -1
  695. package/dist/layout-BhfC26Ks.cjs.map +0 -1
  696. package/dist/layout-DC0Npqu7.js.map +0 -1
  697. package/dist/lightbox-BSwWvDQc.js.map +0 -1
  698. package/dist/lightbox-KrZQH9w9.cjs.map +0 -1
  699. package/dist/list-BwGtAAfi.js.map +0 -1
  700. package/dist/list-DIs02A3d.cjs +0 -40
  701. package/dist/list-DIs02A3d.cjs.map +0 -1
  702. package/dist/menu-DX8d96x-.js.map +0 -1
  703. package/dist/menu-jT_yAk5V.cjs.map +0 -1
  704. package/dist/mixins-COeG4DiX.js.map +0 -1
  705. package/dist/mixins-XGVIOvKt.cjs.map +0 -1
  706. package/dist/notification-CAJVpLne.js.map +0 -1
  707. package/dist/notification-DO3VXceY.cjs.map +0 -1
  708. package/dist/option-BNo1Zs-l.cjs +0 -43
  709. package/dist/option-BNo1Zs-l.cjs.map +0 -1
  710. package/dist/option-JISY0wZJ.js.map +0 -1
  711. package/dist/overlay-B1jVf-ge.cjs.map +0 -1
  712. package/dist/overlay-CT-tMHDX.js.map +0 -1
  713. package/dist/overlay.confirm-body-Dn-Zgogx.js.map +0 -1
  714. package/dist/overlay.confirm-body-mYDYoJL8.cjs.map +0 -1
  715. package/dist/overlay.service-BQmva9GY.cjs.map +0 -1
  716. package/dist/overlay.service-yqTOyLlr.js.map +0 -1
  717. package/dist/progress-CGWozq_n.js.map +0 -1
  718. package/dist/progress-DOVJhsR0.cjs +0 -51
  719. package/dist/progress-DOVJhsR0.cjs.map +0 -1
  720. package/dist/radio-group-CXkq6qAF.js.map +0 -1
  721. package/dist/radio-group-DoSX5D2V.cjs.map +0 -1
  722. package/dist/select-CObZenqg.cjs +0 -56
  723. package/dist/select-CObZenqg.cjs.map +0 -1
  724. package/dist/select-CU90i50_.js.map +0 -1
  725. package/dist/sound.service-Qhr8nCeG.cjs.map +0 -1
  726. package/dist/sound.service-m8WjOhjn.js.map +0 -1
  727. package/dist/splash-screen-Ca6Ew8p6.cjs +0 -41
  728. package/dist/splash-screen-Ca6Ew8p6.cjs.map +0 -1
  729. package/dist/splash-screen-Cs3dbPN3.js.map +0 -1
  730. package/dist/src-CCVbLLgC.js.map +0 -1
  731. package/dist/src-CpftzdZV.cjs +0 -264
  732. package/dist/src-CpftzdZV.cjs.map +0 -1
  733. package/dist/state--x58-AuK.cjs.map +0 -1
  734. package/dist/state-QSwQ61sA.js.map +0 -1
  735. package/dist/surface-bTjOiq8n.cjs +0 -7
  736. package/dist/surface-bTjOiq8n.cjs.map +0 -1
  737. package/dist/surface-cqMsHJHM.js.map +0 -1
  738. package/dist/tabs-Dk9UDWpq.cjs.map +0 -1
  739. package/dist/tabs-Ib0Mh__1.js.map +0 -1
  740. package/dist/textarea-CcRsw08B.js.map +0 -1
  741. package/dist/textarea-Cntd9tfV.cjs.map +0 -1
  742. package/dist/theme.service-5RjyR7Sy.js.map +0 -1
  743. package/dist/theme.service-DA6KY52G.cjs.map +0 -1
  744. package/dist/typography-DeEYdMhW.js +0 -358
  745. package/dist/typography-DeEYdMhW.js.map +0 -1
  746. package/dist/typography-Tm7wSaB2.cjs +0 -282
  747. package/dist/typography-Tm7wSaB2.cjs.map +0 -1
  748. package/dist/utils-DTa3QHxk.cjs.map +0 -1
  749. package/dist/utils-H8wNknWC.js.map +0 -1
  750. package/dist/window-Db5ZYY6t.js.map +0 -1
  751. package/dist/window-oQqx5xqQ.cjs +0 -59
  752. package/dist/window-oQqx5xqQ.cjs.map +0 -1
  753. package/src/form/fields/date-range/date-range-presets.ts +0 -220
  754. package/src/form/fields/date-range/date-utils.ts +0 -58
  755. package/types/src/form/fields/date-range/date-range-presets.d.ts +0 -18
  756. package/types/src/form/fields/date-range/date-utils.d.ts +0 -15
  757. /package/dist/{hashContent-iRZJJWtE.cjs → hashContent--s09Ed_g.cjs} +0 -0
  758. /package/dist/{hashContent-BqU6v1Xr.js → hashContent-CAvrQ56N.js} +0 -0
  759. /package/dist/{rxjs-utils-Csnks202.cjs → rxjs-utils-4P2v57ke.cjs} +0 -0
  760. /package/dist/{rxjs-utils-d-ivVN84.js → rxjs-utils-JMFdgQSl.js} +0 -0
  761. /package/dist/{theme.interface-CSt7JUBD.cjs → theme.interface-B-qxDsZQ.cjs} +0 -0
  762. /package/dist/{theme.interface-odQEpZZH.js → theme.interface-B7caS5cg.js} +0 -0
  763. /package/dist/{utils-DTa3QHxk.cjs → utils-DIXndz6Q.cjs} +0 -0
  764. /package/dist/{utils-H8wNknWC.js → utils-dSPH7Oh9.js} +0 -0
@@ -14,33 +14,42 @@ import { ButtonVariant } from './button'
14
14
  */
15
15
  @customElement('schmancy-icon-button')
16
16
  export class SchmnacyIconButton extends SchmancyElement {
17
- static styles = [css`
18
- :host {
19
- display: inline-flex;
20
- flex-shrink: 0;
21
- border-radius: 9999px;
22
- transition:
23
- box-shadow 300ms cubic-bezier(0.34, 1.56, 0.64, 1),
24
- transform 200ms cubic-bezier(0.34, 1.56, 0.64, 1);
25
- }
26
- :host([width="full"]) {
27
- display: flex;
28
- width: 100%;
29
- }
30
- :host(:hover:not([disabled])) {
31
- box-shadow: 0 2px 12px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 18%, transparent);
32
- }
33
- :host(:active:not([disabled])) {
34
- transform: scale(0.92);
35
- box-shadow: none;
36
- transition-duration: 100ms;
37
- }
38
- @media (prefers-reduced-motion: reduce) {
39
- :host { transition: none; }
40
- :host(:hover:not([disabled])) { box-shadow: none; }
41
- :host(:active:not([disabled])) { transform: none; box-shadow: none; }
42
- }
43
- `]
17
+ static styles = [
18
+ css`
19
+ :host {
20
+ display: inline-flex;
21
+ flex-shrink: 0;
22
+ border-radius: 9999px;
23
+ transition:
24
+ box-shadow 300ms cubic-bezier(0.34, 1.56, 0.64, 1),
25
+ transform 200ms cubic-bezier(0.34, 1.56, 0.64, 1);
26
+ }
27
+ :host([width='full']) {
28
+ display: flex;
29
+ width: 100%;
30
+ }
31
+ :host(:hover:not([disabled])) {
32
+ box-shadow: 0 2px 12px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 18%, transparent);
33
+ }
34
+ :host(:active:not([disabled])) {
35
+ transform: scale(0.92);
36
+ box-shadow: none;
37
+ transition-duration: 100ms;
38
+ }
39
+ @media (prefers-reduced-motion: reduce) {
40
+ :host {
41
+ transition: none;
42
+ }
43
+ :host(:hover:not([disabled])) {
44
+ box-shadow: none;
45
+ }
46
+ :host(:active:not([disabled])) {
47
+ transform: none;
48
+ box-shadow: none;
49
+ }
50
+ }
51
+ `,
52
+ ]
44
53
 
45
54
  protected static shadowRootOptions = {
46
55
  ...LitElement.shadowRootOptions,
@@ -187,12 +196,11 @@ export class SchmnacyIconButton extends SchmancyElement {
187
196
 
188
197
  render() {
189
198
  // Map 'tonal' variant to 'filled tonal' for backwards compatibility
190
- const effectiveVariant = this.variant === 'tonal' ? 'filled tonal' : this.variant;
199
+ const effectiveVariant = this.variant === 'tonal' ? 'filled tonal' : this.variant
191
200
 
192
201
  // Compute classes for the interactive element.
193
202
  const classes = {
194
- 'z-0 h-full transition-all duration-200 relative rounded-full inline-flex justify-center items-center gap-[8px] outline-secondary-default focus-visible:outline-solid focus-visible:outline-2 focus-visible:outline-offset-2 outline-hidden':
195
- true,
203
+ 'z-0 h-full transition-all duration-200 relative rounded-full inline-flex justify-center items-center gap-[8px] outline-secondary-default focus-visible:outline-solid focus-visible:outline-2 focus-visible:outline-offset-2 outline-hidden': true,
196
204
  'opacity-[0.38]': this.disabled,
197
205
  'cursor-pointer': !this.disabled,
198
206
  'hover:shadow-xs':
@@ -209,22 +217,34 @@ export class SchmnacyIconButton extends SchmancyElement {
209
217
  'bg-secondary-container text-secondary-onContainer': effectiveVariant === 'filled tonal',
210
218
  'text-primary-default': effectiveVariant === 'text',
211
219
  // M3 spec: 24dp (xxs) → 32dp (dense) → 40dp (default) → 48dp (standard) → 56dp (large)
212
- 'p-1.5': this.size === 'xxs', // 6px padding = 24px total (12px icon) - Ultra-compact
213
- 'p-2': this.size === 'xs', // 8px padding = 32px total (16px icon) - M3 dense
214
- 'p-2.5': this.size === 'sm', // 10px padding = 40px total (20px icon) - M3 default
215
- 'p-3': this.size === 'md', // 12px padding = 48px total (24px icon) - M3 standard
216
- 'p-4': this.size === 'lg', // 16px padding = 56px total (24px icon) - M3 large
217
- 'p-5': this.size === 'xl', // 20px padding = 80px total (40px icon) - custom XL
220
+ 'p-1.5': this.size === 'xxs', // 6px padding = 24px total (12px icon) - Ultra-compact
221
+ 'p-2': this.size === 'xs', // 8px padding = 32px total (16px icon) - M3 dense
222
+ 'p-2.5': this.size === 'sm', // 10px padding = 40px total (20px icon) - M3 default
223
+ 'p-3': this.size === 'md', // 12px padding = 48px total (24px icon) - M3 standard
224
+ 'p-4': this.size === 'lg', // 16px padding = 56px total (24px icon) - M3 large
225
+ 'p-5': this.size === 'xl', // 20px padding = 80px total (40px icon) - custom XL
218
226
  }
219
227
 
220
228
  const stateLayerClasses = {
221
229
  'hover:opacity-[0.08] rounded-full z-0': true,
222
230
  'hover:bg-primary-on': effectiveVariant === 'filled',
223
- 'hover:bg-primary-default': effectiveVariant === 'outlined' || effectiveVariant === 'elevated' || effectiveVariant === 'text',
231
+ 'hover:bg-primary-default':
232
+ effectiveVariant === 'outlined' || effectiveVariant === 'elevated' || effectiveVariant === 'text',
224
233
  'hover:bg-secondary-container': effectiveVariant === 'filled tonal',
225
234
  }
226
235
 
227
- const iconSizeClass = this.size === 'xxs' ? 'text-xs' : this.size === 'xs' ? 'text-base' : this.size === 'sm' ? 'text-xl' : this.size === 'md' ? 'text-2xl' : this.size === 'lg' ? 'text-2xl' : 'text-4xl';
236
+ const iconSizeClass =
237
+ this.size === 'xxs'
238
+ ? 'text-xs'
239
+ : this.size === 'xs'
240
+ ? 'text-base'
241
+ : this.size === 'sm'
242
+ ? 'text-xl'
243
+ : this.size === 'md'
244
+ ? 'text-2xl'
245
+ : this.size === 'lg'
246
+ ? 'text-2xl'
247
+ : 'text-4xl'
228
248
 
229
249
  // If href is provided, render an anchor element.
230
250
  if (this.href) {
@@ -243,10 +263,9 @@ export class SchmnacyIconButton extends SchmancyElement {
243
263
  ${this.text
244
264
  ? html`<slot></slot>`
245
265
  : html`
246
- <slot style="display:none"></slot>
247
- <schmancy-icon class=${iconSizeClass}>${this.icon || this.capturedIcon}</schmancy-icon>
248
- `
249
- }
266
+ <slot style="display:none"></slot>
267
+ <schmancy-icon class=${iconSizeClass}>${this.icon || this.capturedIcon}</schmancy-icon>
268
+ `}
250
269
  </a>
251
270
  `
252
271
  }
@@ -266,10 +285,9 @@ export class SchmnacyIconButton extends SchmancyElement {
266
285
  ${this.text
267
286
  ? html`<slot></slot>`
268
287
  : html`
269
- <slot style="display:none"></slot>
270
- <schmancy-icon class=${iconSizeClass}>${this.icon || this.capturedIcon}</schmancy-icon>
271
- `
272
- }
288
+ <slot style="display:none"></slot>
289
+ <schmancy-icon class=${iconSizeClass}>${this.icon || this.capturedIcon}</schmancy-icon>
290
+ `}
273
291
  </button>
274
292
  `
275
293
  }
@@ -1,2 +1,2 @@
1
- export * from './button'
2
- export * from './icon-button'
1
+ export * from './button'
2
+ export * from './icon-button'
@@ -0,0 +1,504 @@
1
+ import { afterEach, describe, expect, it } from 'vitest'
2
+ import { expectNoA11yViolations } from '../test-utils/a11y'
3
+ import type { SchmancyCalendar } from './calendar'
4
+ import './calendar'
5
+
6
+ const nextUpdate = () => new Promise(r => requestAnimationFrame(() => r(null)))
7
+
8
+ const mount = async (attrs = ''): Promise<SchmancyCalendar> => {
9
+ const host = document.createElement('div')
10
+ host.innerHTML = `<schmancy-calendar ${attrs}></schmancy-calendar>`
11
+ document.body.appendChild(host)
12
+ const el = host.querySelector('schmancy-calendar') as SchmancyCalendar
13
+ await nextUpdate()
14
+ await nextUpdate()
15
+ return el
16
+ }
17
+
18
+ const cleanup = () => {
19
+ document.querySelectorAll('div[data-calendar-test]').forEach(el => el.remove())
20
+ // Remove all test hosts appended to body
21
+ document.body.querySelectorAll(':scope > div:not([id])').forEach(el => el.remove())
22
+ }
23
+
24
+ // Helper: click a specific day cell by ISO date string
25
+ async function clickDay(el: SchmancyCalendar, iso: string) {
26
+ const cell = el.shadowRoot!.querySelector<HTMLElement>(`[aria-label="${iso}"]`)
27
+ expect(cell, `day cell for ${iso} not found`).toBeTruthy()
28
+ cell!.click()
29
+ await nextUpdate()
30
+ await nextUpdate()
31
+ }
32
+
33
+ // Helper: hover a specific day cell
34
+ async function hoverDay(el: SchmancyCalendar, iso: string) {
35
+ const cell = el.shadowRoot!.querySelector<HTMLElement>(`[aria-label="${iso}"]`)
36
+ expect(cell, `day cell for ${iso} not found`).toBeTruthy()
37
+ cell!.dispatchEvent(new MouseEvent('mouseenter', { bubbles: true, composed: true }))
38
+ await nextUpdate()
39
+ }
40
+
41
+ // ---------------------------------------------------------------------------
42
+ // Collect events off the element
43
+ // ---------------------------------------------------------------------------
44
+
45
+ function captureEvent<T = unknown>(el: EventTarget, eventName: string): { events: CustomEvent<T>[]; stop: () => void } {
46
+ const events: CustomEvent<T>[] = []
47
+ const handler = (e: Event) => events.push(e as CustomEvent<T>)
48
+ el.addEventListener(eventName, handler)
49
+ return {
50
+ events,
51
+ stop: () => el.removeEventListener(eventName, handler),
52
+ }
53
+ }
54
+
55
+ // ---------------------------------------------------------------------------
56
+ // Tests
57
+ // ---------------------------------------------------------------------------
58
+
59
+ describe('schmancy-calendar', () => {
60
+ afterEach(() => cleanup())
61
+
62
+ // -----------------------------------------------------------------------
63
+ // Phase rendering (props-in)
64
+ // -----------------------------------------------------------------------
65
+ describe('phase rendering', () => {
66
+ it('renders the current month by default', async () => {
67
+ const el = await mount()
68
+ const shadow = el.shadowRoot!
69
+ const monthLabel = shadow.querySelector('[part="month-label"]')
70
+ expect(monthLabel).toBeTruthy()
71
+ // Should show at least one month label
72
+ expect(shadow.querySelectorAll('[data-month]').length).toBeGreaterThan(0)
73
+ })
74
+
75
+ it('renders multiple months in the scroll window', async () => {
76
+ const el = await mount()
77
+ const months = el.shadowRoot!.querySelectorAll('[data-month]')
78
+ // Default window is 3 months before + anchor + 9 months after = 13+
79
+ expect(months.length).toBeGreaterThanOrEqual(10)
80
+ })
81
+
82
+ it('renders weekday headers', async () => {
83
+ const el = await mount()
84
+ const weekdays = el.shadowRoot!.querySelectorAll('[part="weekday"]')
85
+ expect(weekdays.length).toBeGreaterThan(0)
86
+ })
87
+
88
+ it('marks today with day-today part', async () => {
89
+ const el = await mount()
90
+ await nextUpdate()
91
+ const today = el.shadowRoot!.querySelector('[part~="day-today"]')
92
+ expect(today).toBeTruthy()
93
+ })
94
+
95
+ it('single mode: marks the value date as selected', async () => {
96
+ const el = await mount()
97
+ el.mode = 'single'
98
+ el.value = '2026-05-15'
99
+ await nextUpdate()
100
+ await nextUpdate()
101
+ const selected = el.shadowRoot!.querySelector('[part~="day-selected"]')
102
+ expect(selected).toBeTruthy()
103
+ expect(selected!.getAttribute('aria-label')).toBe('2026-05-15')
104
+ })
105
+
106
+ it('range mode: marks start/end dates and in-range days', async () => {
107
+ const el = await mount()
108
+ el.mode = 'range'
109
+ el.start = '2026-05-10'
110
+ el.end = '2026-05-15'
111
+ await nextUpdate()
112
+ await nextUpdate()
113
+ const rangeStart = el.shadowRoot!.querySelector('[part~="day-range-start"]')
114
+ const rangeEnd = el.shadowRoot!.querySelector('[part~="day-range-end"]')
115
+ const inRange = el.shadowRoot!.querySelectorAll('[part~="day-in-range"]')
116
+ expect(rangeStart).toBeTruthy()
117
+ expect(rangeEnd).toBeTruthy()
118
+ // 2026-05-11 through 2026-05-14 = 4 days in-range
119
+ expect(inRange.length).toBe(4)
120
+ })
121
+
122
+ it('marks disabled days when min/max are set', async () => {
123
+ const el = await mount()
124
+ el.min = '2026-05-10'
125
+ el.max = '2026-05-20'
126
+ await nextUpdate()
127
+ await nextUpdate()
128
+ const disabled = el.shadowRoot!.querySelectorAll('[part~="day-disabled"]')
129
+ expect(disabled.length).toBeGreaterThan(0)
130
+ })
131
+ })
132
+
133
+ // -----------------------------------------------------------------------
134
+ // CTA wiring (event system works)
135
+ // -----------------------------------------------------------------------
136
+ describe('CTA wiring', () => {
137
+ it('a day cell is focusable and has a gridcell role', async () => {
138
+ const el = await mount()
139
+ const cell = el.shadowRoot!.querySelector('[role="gridcell"]')
140
+ expect(cell).toBeTruthy()
141
+ expect(cell!.getAttribute('tabindex')).toBe('0')
142
+ })
143
+
144
+ it('clicking an enabled day dispatches events', async () => {
145
+ const el = await mount()
146
+ el.mode = 'single'
147
+ await nextUpdate()
148
+ const { events, stop } = captureEvent<{ value: string | null; start: string | null; end: string | null }>(
149
+ el,
150
+ 'change',
151
+ )
152
+ // Click any non-disabled day
153
+ const cell = el.shadowRoot!.querySelector<HTMLElement>('[role="gridcell"]:not([aria-disabled="true"])')
154
+ expect(cell).toBeTruthy()
155
+ cell!.click()
156
+ await nextUpdate()
157
+ expect(events.length).toBe(1)
158
+ stop()
159
+ })
160
+
161
+ it('disabled days do not dispatch events', async () => {
162
+ const el = await mount()
163
+ el.disabled = true
164
+ await nextUpdate()
165
+ const { events, stop } = captureEvent(el, 'change')
166
+ const cell = el.shadowRoot!.querySelector<HTMLElement>('[role="gridcell"]')
167
+ if (cell) cell.click()
168
+ await nextUpdate()
169
+ expect(events.length).toBe(0)
170
+ stop()
171
+ })
172
+ })
173
+
174
+ // -----------------------------------------------------------------------
175
+ // Single mode: input → change state machine
176
+ // -----------------------------------------------------------------------
177
+ describe('emits change (single mode)', () => {
178
+ it('click commits the date via change event', async () => {
179
+ const el = await mount()
180
+ el.mode = 'single'
181
+ await nextUpdate()
182
+ await nextUpdate()
183
+
184
+ const { events: changeEvents, stop: stopChange } = captureEvent<{
185
+ value: string | null
186
+ start: string | null
187
+ end: string | null
188
+ }>(el, 'change')
189
+
190
+ await clickDay(el, '2026-05-19')
191
+ expect(changeEvents.length).toBe(1)
192
+ expect(changeEvents[0].detail.value).toBe('2026-05-19')
193
+ expect(changeEvents[0].detail.start).toBeNull()
194
+ expect(changeEvents[0].detail.end).toBeNull()
195
+ stopChange()
196
+ })
197
+
198
+ it('change event bubbles and is composed', async () => {
199
+ const el = await mount()
200
+ el.mode = 'single'
201
+ await nextUpdate()
202
+ await nextUpdate()
203
+
204
+ let bubbled = false
205
+ document.body.addEventListener(
206
+ 'change',
207
+ () => {
208
+ bubbled = true
209
+ },
210
+ { once: true },
211
+ )
212
+ await clickDay(el, '2026-05-19')
213
+ expect(bubbled).toBe(true)
214
+ })
215
+ })
216
+
217
+ // -----------------------------------------------------------------------
218
+ // Range mode: input → change state machine
219
+ // -----------------------------------------------------------------------
220
+ describe('range state machine (input → change)', () => {
221
+ it('first click emits input with start set and end null', async () => {
222
+ const el = await mount()
223
+ el.mode = 'range'
224
+ await nextUpdate()
225
+ await nextUpdate()
226
+
227
+ const { events: inputEvents, stop } = captureEvent<{
228
+ value: string | null
229
+ start: string | null
230
+ end: string | null
231
+ }>(el, 'input')
232
+
233
+ await clickDay(el, '2026-05-10')
234
+ expect(inputEvents.length).toBeGreaterThanOrEqual(1)
235
+ const first = inputEvents[0]
236
+ expect(first.detail.start).toBe('2026-05-10')
237
+ expect(first.detail.end).toBeNull()
238
+ stop()
239
+ })
240
+
241
+ it('second click emits change with both start and end', async () => {
242
+ const el = await mount()
243
+ el.mode = 'range'
244
+ await nextUpdate()
245
+ await nextUpdate()
246
+
247
+ const { events: changeEvents, stop } = captureEvent<{
248
+ value: string | null
249
+ start: string | null
250
+ end: string | null
251
+ }>(el, 'change')
252
+
253
+ await clickDay(el, '2026-05-10')
254
+ await clickDay(el, '2026-05-15')
255
+
256
+ expect(changeEvents.length).toBe(1)
257
+ expect(changeEvents[0].detail.start).toBe('2026-05-10')
258
+ expect(changeEvents[0].detail.end).toBe('2026-05-15')
259
+ stop()
260
+ })
261
+
262
+ it('second click before first emits correctly ordered range', async () => {
263
+ const el = await mount()
264
+ el.mode = 'range'
265
+ await nextUpdate()
266
+ await nextUpdate()
267
+
268
+ const { events: changeEvents, stop } = captureEvent<{
269
+ value: string | null
270
+ start: string | null
271
+ end: string | null
272
+ }>(el, 'change')
273
+
274
+ // Click end before start — should swap
275
+ await clickDay(el, '2026-05-20')
276
+ await clickDay(el, '2026-05-10')
277
+
278
+ expect(changeEvents.length).toBe(1)
279
+ // Regardless of click order, start < end
280
+ expect(changeEvents[0].detail.start).toBe('2026-05-10')
281
+ expect(changeEvents[0].detail.end).toBe('2026-05-20')
282
+ stop()
283
+ })
284
+
285
+ it('hover between first click and second click emits input for preview', async () => {
286
+ const el = await mount()
287
+ el.mode = 'range'
288
+ await nextUpdate()
289
+ await nextUpdate()
290
+
291
+ await clickDay(el, '2026-05-10')
292
+
293
+ const { events: inputEvents, stop } = captureEvent<{
294
+ value: string | null
295
+ start: string | null
296
+ end: string | null
297
+ }>(el, 'input')
298
+
299
+ await hoverDay(el, '2026-05-15')
300
+ expect(inputEvents.length).toBeGreaterThanOrEqual(1)
301
+ // The latest input event should cover the preview span
302
+ const last = inputEvents[inputEvents.length - 1]
303
+ expect(last.detail.start).toBe('2026-05-10')
304
+ expect(last.detail.end).toBe('2026-05-15')
305
+ stop()
306
+ })
307
+ })
308
+
309
+ // -----------------------------------------------------------------------
310
+ // Range across a month boundary (the continuous-scroll case)
311
+ // -----------------------------------------------------------------------
312
+ describe('range across a month boundary', () => {
313
+ it('emits a correctly ordered change spanning two months', async () => {
314
+ const el = await mount()
315
+ el.mode = 'range'
316
+ await nextUpdate()
317
+ await nextUpdate()
318
+
319
+ const { events: changeEvents, stop } = captureEvent<{
320
+ value: string | null
321
+ start: string | null
322
+ end: string | null
323
+ }>(el, 'change')
324
+
325
+ // Click on the last day of April then the first day of June
326
+ await clickDay(el, '2026-04-30')
327
+ await clickDay(el, '2026-06-01')
328
+
329
+ expect(changeEvents.length).toBe(1)
330
+ expect(changeEvents[0].detail.start).toBe('2026-04-30')
331
+ expect(changeEvents[0].detail.end).toBe('2026-06-01')
332
+ stop()
333
+ })
334
+
335
+ it('in-range part spans across month boundaries after props are set', async () => {
336
+ const el = await mount()
337
+ el.mode = 'range'
338
+ el.start = '2026-04-28'
339
+ el.end = '2026-05-03'
340
+ await nextUpdate()
341
+ await nextUpdate()
342
+
343
+ const inRangeDays = el.shadowRoot!.querySelectorAll('[part~="day-in-range"]')
344
+ // 2026-04-29, 2026-04-30, 2026-05-01, 2026-05-02 = 4 days
345
+ expect(inRangeDays.length).toBe(4)
346
+ })
347
+ })
348
+
349
+ // -----------------------------------------------------------------------
350
+ // Scroll-driven `navigate` event
351
+ // -----------------------------------------------------------------------
352
+ describe('scroll-driven navigate', () => {
353
+ it('exposes a scroll container with part="scroll"', async () => {
354
+ const el = await mount()
355
+ const scroller = el.shadowRoot!.querySelector('[part="scroll"]')
356
+ expect(scroller).toBeTruthy()
357
+ })
358
+
359
+ it('navigate event fires when the scroller dispatches a scroll event', async () => {
360
+ const el = await mount()
361
+ await nextUpdate()
362
+ await nextUpdate()
363
+
364
+ const navigateEvents: Array<CustomEvent<{ month: string }>> = []
365
+ el.addEventListener('navigate', e => navigateEvents.push(e as CustomEvent<{ month: string }>))
366
+
367
+ // Dispatch a real scroll event on the public scroller element.
368
+ // This exercises the fromEvent(scroller, 'scroll') → dominantMonth → navigate path.
369
+ const scroller = el.shadowRoot!.querySelector<HTMLElement>('[part="scroll"]')
370
+ expect(scroller, 'scroller element must be present').toBeTruthy()
371
+
372
+ scroller!.dispatchEvent(new Event('scroll', { bubbles: false }))
373
+
374
+ // Wait for the debounce (50 ms) + animation frame + microtask
375
+ await new Promise<void>(r => setTimeout(r, 100))
376
+
377
+ // The navigate event must have fired with a valid YYYY-MM month string.
378
+ expect(navigateEvents.length).toBeGreaterThanOrEqual(1)
379
+ expect(navigateEvents[0].detail.month).toMatch(/^\d{4}-\d{2}$/)
380
+ })
381
+ })
382
+
383
+ // -----------------------------------------------------------------------
384
+ // Keyboard month traversal
385
+ // -----------------------------------------------------------------------
386
+ describe('keyboard month traversal', () => {
387
+ it('Enter on a day cell triggers the same action as a click (single mode)', async () => {
388
+ const el = await mount()
389
+ el.mode = 'single'
390
+ await nextUpdate()
391
+ await nextUpdate()
392
+
393
+ const { events: changeEvents, stop } = captureEvent<{
394
+ value: string | null
395
+ start: string | null
396
+ end: string | null
397
+ }>(el, 'change')
398
+
399
+ const cell = el.shadowRoot!.querySelector<HTMLElement>(`[aria-label="2026-05-19"]:not([aria-disabled="true"])`)
400
+ if (cell) {
401
+ cell.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true, composed: true }))
402
+ await nextUpdate()
403
+ await nextUpdate()
404
+ expect(changeEvents.length).toBe(1)
405
+ expect(changeEvents[0].detail.value).toBe('2026-05-19')
406
+ }
407
+ stop()
408
+ })
409
+
410
+ it('Space on a day cell triggers click (single mode)', async () => {
411
+ const el = await mount()
412
+ el.mode = 'single'
413
+ await nextUpdate()
414
+ await nextUpdate()
415
+
416
+ const { events: changeEvents, stop } = captureEvent<{
417
+ value: string | null
418
+ start: string | null
419
+ end: string | null
420
+ }>(el, 'change')
421
+
422
+ const cell = el.shadowRoot!.querySelector<HTMLElement>(`[aria-label="2026-05-19"]:not([aria-disabled="true"])`)
423
+ if (cell) {
424
+ cell.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true, composed: true }))
425
+ await nextUpdate()
426
+ await nextUpdate()
427
+ expect(changeEvents.length).toBe(1)
428
+ }
429
+ stop()
430
+ })
431
+ })
432
+
433
+ // -----------------------------------------------------------------------
434
+ // Teardown
435
+ // -----------------------------------------------------------------------
436
+ describe('teardown', () => {
437
+ it('disconnecting completes the pipeline (no errors thrown on remove)', async () => {
438
+ const el = await mount()
439
+ await nextUpdate()
440
+ expect(() => el.parentElement?.removeChild(el)).not.toThrow()
441
+ })
442
+ })
443
+
444
+ // -----------------------------------------------------------------------
445
+ // Failure / edge cases
446
+ // -----------------------------------------------------------------------
447
+ describe('failure and edge cases', () => {
448
+ it('disabled=true disables all day cells', async () => {
449
+ const el = await mount()
450
+ el.disabled = true
451
+ await nextUpdate()
452
+ await nextUpdate()
453
+ const enabled = el.shadowRoot!.querySelectorAll('[role="gridcell"][tabindex="0"]')
454
+ expect(enabled.length).toBe(0)
455
+ })
456
+
457
+ it('readonly=true prevents click events from firing change', async () => {
458
+ const el = await mount()
459
+ el.mode = 'single'
460
+ el.readonly = true
461
+ await nextUpdate()
462
+ await nextUpdate()
463
+ const { events, stop } = captureEvent(el, 'change')
464
+ const cell = el.shadowRoot!.querySelector<HTMLElement>('[role="gridcell"]')
465
+ if (cell) cell.click()
466
+ await nextUpdate()
467
+ expect(events.length).toBe(0)
468
+ stop()
469
+ })
470
+
471
+ it('scroll container renders when min and max bound the window', async () => {
472
+ const el = await mount()
473
+ el.min = '2026-05-01'
474
+ el.max = '2026-05-31'
475
+ await nextUpdate()
476
+ await nextUpdate()
477
+ const months = el.shadowRoot!.querySelectorAll('[data-month]')
478
+ // Only one month in window
479
+ expect(months.length).toBe(1)
480
+ })
481
+ })
482
+
483
+ // -----------------------------------------------------------------------
484
+ // Accessibility
485
+ // -----------------------------------------------------------------------
486
+ describe('accessibility', () => {
487
+ it('has no axe-core violations in single mode (idle)', async () => {
488
+ const el = await mount()
489
+ await nextUpdate()
490
+ await nextUpdate()
491
+ await expectNoA11yViolations(el.parentElement!)
492
+ })
493
+
494
+ it('has no axe-core violations in range mode with a selection', async () => {
495
+ const el = await mount()
496
+ el.mode = 'range'
497
+ el.start = '2026-05-10'
498
+ el.end = '2026-05-15'
499
+ await nextUpdate()
500
+ await nextUpdate()
501
+ await expectNoA11yViolations(el.parentElement!)
502
+ })
503
+ })
504
+ })