@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
@@ -2,34 +2,115 @@ import dayjs from 'dayjs'
2
2
  import quarterOfYear from 'dayjs/plugin/quarterOfYear'
3
3
  import { html, nothing, PropertyValues } from 'lit'
4
4
  import { customElement, property, state } from 'lit/decorators.js'
5
- import { concat, exhaustMap, finalize, fromEvent, map, merge, of, Subject, switchMap, takeUntil, tap, timer } from 'rxjs'
5
+ import {
6
+ concat,
7
+ exhaustMap,
8
+ finalize,
9
+ fromEvent,
10
+ map,
11
+ merge,
12
+ of,
13
+ Subject,
14
+ switchMap,
15
+ takeUntil,
16
+ tap,
17
+ timer,
18
+ } from 'rxjs'
6
19
  import { SchmancyFormField } from '@mixins/index'
7
20
  import { show } from '../../../overlay/overlay.service'
8
21
  import { detectDateRangeType, formatDateRange } from './date-range-helpers'
9
- import { DateRangePreset, generatePresetCategories, PresetCategory } from './date-range-presets'
10
- import { validateInitialDateRange } from './date-utils'
11
22
  import './date-range-dialog'
23
+ import type { DateRangeDialogPreset } from './date-range-dialog'
12
24
 
13
- // Add quarter plugin to dayjs
14
25
  dayjs.extend(quarterOfYear)
15
26
 
16
- // Bridge the inner-content events used inside the overlay template down to a
17
- // `close` event on the same element. `show()` translates a bubbling 'close'
18
- // event into observable completion + an emission of `event.detail`.
19
- const dispatchClose = (target: EventTarget | null): void => {
20
- target?.dispatchEvent(new CustomEvent('close', { bubbles: true, composed: true }))
27
+ // ---------------------------------------------------------------------------
28
+ // Default built-in presets
29
+ // ---------------------------------------------------------------------------
30
+
31
+ function buildDefaultPresets(type: 'date' | 'datetime-local' = 'date'): DateRangeDialogPreset[] {
32
+ const fmt = type === 'datetime-local' ? 'YYYY-MM-DDTHH:mm' : 'YYYY-MM-DD'
33
+ return [
34
+ {
35
+ id: 'today',
36
+ label: 'Today',
37
+ start: dayjs().startOf('day').format(fmt),
38
+ end: dayjs().endOf('day').format(fmt),
39
+ },
40
+ {
41
+ id: 'yesterday',
42
+ label: 'Yesterday',
43
+ start: dayjs().subtract(1, 'day').startOf('day').format(fmt),
44
+ end: dayjs().subtract(1, 'day').endOf('day').format(fmt),
45
+ },
46
+ {
47
+ id: 'last7',
48
+ label: 'Last 7 days',
49
+ start: dayjs().subtract(6, 'day').startOf('day').format(fmt),
50
+ end: dayjs().endOf('day').format(fmt),
51
+ },
52
+ {
53
+ id: 'last30',
54
+ label: 'Last 30 days',
55
+ start: dayjs().subtract(29, 'day').startOf('day').format(fmt),
56
+ end: dayjs().endOf('day').format(fmt),
57
+ },
58
+ {
59
+ id: 'thisWeek',
60
+ label: 'This week',
61
+ start: dayjs().startOf('week').format(fmt),
62
+ end: dayjs().endOf('week').format(fmt),
63
+ },
64
+ {
65
+ id: 'thisMonth',
66
+ label: 'This month',
67
+ start: dayjs().startOf('month').format(fmt),
68
+ end: dayjs().endOf('month').format(fmt),
69
+ },
70
+ {
71
+ id: 'lastMonth',
72
+ label: 'Last month',
73
+ start: dayjs().subtract(1, 'month').startOf('month').format(fmt),
74
+ end: dayjs().subtract(1, 'month').endOf('month').format(fmt),
75
+ },
76
+ {
77
+ id: 'thisYear',
78
+ label: 'This year',
79
+ start: dayjs().startOf('year').format(fmt),
80
+ end: dayjs().endOf('year').format(fmt),
81
+ },
82
+ ]
21
83
  }
22
84
 
85
+ // ---------------------------------------------------------------------------
86
+ // Event types
87
+ // ---------------------------------------------------------------------------
88
+
89
+ export type SchmancyDateRangeInputEvent = CustomEvent<{
90
+ start: string | null
91
+ end: string | null
92
+ }>
93
+
23
94
  export type SchmancyDateRangeChangeEvent = CustomEvent<{
24
- dateFrom: string
25
- dateTo: string
95
+ start: string | null
96
+ end: string | null
97
+ preset: string | null
26
98
  }>
27
99
 
100
+ // ---------------------------------------------------------------------------
101
+ // Component
102
+ // ---------------------------------------------------------------------------
103
+
28
104
  /**
29
- * A date range selector that supports presets and manual date input.
105
+ * A date range selector composing `<schmancy-calendar mode="range">` with a
106
+ * sticky preset chip quick-rail and a secondary typed-entry path.
107
+ *
108
+ * Public API: flat ISO `start`/`end`, `preset` read-back, `presets` array.
109
+ * FormData: `${name}.start` / `${name}.end` (empty endpoint omitted).
30
110
  *
31
111
  * @element schmancy-date-range
32
- * @fires change - Fired when the date range changes with dateFrom and dateTo values
112
+ * @fires input - Provisional sweep preview { start, end }
113
+ * @fires change - Committed range change { start, end, preset }
33
114
  */
34
115
  @customElement('schmancy-date-range')
35
116
  export class SchmancyDateRange extends SchmancyFormField() {
@@ -37,111 +118,92 @@ export class SchmancyDateRange extends SchmancyFormField() {
37
118
  // `validateOn`, `touched`, `submitted`, `markTouched`, `markSubmitted`,
38
119
  // FACE wiring, FIELD_CONNECT_EVENT dispatch — all from the mixin.
39
120
 
40
- @property({ type: String }) type: 'date' | 'datetime-local' = 'date'
41
- @property({ type: Object }) dateFrom: { label: string; value: string } = { label: 'From', value: '' }
42
- @property({ type: Object }) dateTo: { label: string; value: string } = { label: 'To', value: '' }
43
- @property({ type: String }) minDate?: string
44
- @property({ type: String }) maxDate?: string
45
-
46
- @property({ type: Array }) customPresets: Array<{
47
- label: string
48
- dateFrom: string
49
- dateTo: string
50
- }> = []
51
- @property({ type: String }) format?: string
52
- @property({ type: String }) placeholder = 'Select date range'
121
+ @property() type: 'date' | 'datetime-local' = 'date'
122
+ @property() start: string | null = null
123
+ @property() end: string | null = null
124
+
125
+ /** Reference to the last array produced by buildDefaultPresets; used to detect consumer ownership. */
126
+ private defaultPresetsRef: DateRangeDialogPreset[] = buildDefaultPresets()
127
+
128
+ @property({ type: Array }) presets: DateRangeDialogPreset[] = this.defaultPresetsRef
129
+
130
+ /** True while the component holds the built-in default preset list (not user-supplied). */
131
+ private usingDefaultPresets = true
132
+
133
+ /** Selected preset id; null = custom range. Reflects to attribute. */
134
+ @property({ reflect: true }) preset: string | null = null
135
+
136
+ @property() min?: string
137
+ @property() max?: string
138
+ @property() placeholder = 'Select date range'
53
139
  @property({ type: Boolean }) clearable = true
54
140
  @property() step?: 'day' | 'week' | 'month' | 'year' | number
55
- /** When true, collapses to just an icon button on mobile screens */
141
+ /** Collapses to an icon-only button on narrow viewports. */
56
142
  @property({ type: Boolean }) collapse = false
57
143
 
58
- // Session inputsdriven by handlers, consumed by the single pipeline
59
- // in connectedCallback (rxjs ONE_PIPELINE_ONE_SUBSCRIBE / SESSIONS).
144
+ // Session subjectsONE_PIPELINE_ONE_SUBSCRIBE in connectedCallback.
60
145
  private readonly open$ = new Subject<MouseEvent | undefined>()
61
146
  private readonly close$ = new Subject<void>()
62
147
  private readonly announce$ = new Subject<string>()
63
148
 
64
- // Internal states
65
149
  @state() private isOpen = false
66
- @state() private selectedDateRange: string = ''
67
- @state() private activePreset: string | null = null
68
- @state() private announceMessage: string = ''
69
-
70
- // Default presets
71
- private presetRanges: DateRangePreset[] = []
72
-
73
- // Categorized presets
74
- private presetCategories: PresetCategory[] = []
150
+ @state() private announceMessage = ''
75
151
 
76
- // Memoization cache
77
- private memoizedPresets = new Map<string, PresetCategory[]>()
152
+ // Default-capture for formResetCallback
153
+ private startDefault: string | null = null
154
+ private endDefault: string | null = null
155
+ private presetDefault: string | null = null
78
156
 
79
- disconnectedCallback(): void {
157
+ override disconnectedCallback(): void {
80
158
  super.disconnectedCallback()
81
- // Reset open state when element is moved/removed to prevent stale state
82
159
  this.isOpen = false
83
160
  }
84
161
 
85
- connectedCallback(): void {
162
+ override connectedCallback(): void {
86
163
  super.connectedCallback()
87
- this.initPresetRanges()
88
-
89
- // Validate initial date range
90
- const dateFormat = this.getDateFormat() as 'YYYY-MM-DD' | 'YYYY-MM-DDTHH:mm'
91
- const validatedRange = validateInitialDateRange(this.dateFrom.value, this.dateTo.value, dateFormat)
92
-
93
- if (validatedRange.isValid) {
94
- this.dateFrom.value = validatedRange.dateFrom!
95
- this.dateTo.value = validatedRange.dateTo!
96
- this.updateSelectedDateRange()
97
- } else {
98
- const now = dayjs().format(dateFormat)
99
- this.dateFrom.value = now
100
- this.dateTo.value = now
101
- this.updateSelectedDateRange()
102
- }
103
164
 
104
- // One pipeline, one subscribe (rxjs ONE_PIPELINE_ONE_SUBSCRIBE): the
105
- // dropdown open/close session, screen-reader announcements, and
106
- // document keyboard navigation merge into a single chain torn down by
107
- // takeUntil(this.disconnecting).
165
+ // One pipeline (rxjs ONE_PIPELINE_ONE_SUBSCRIBE).
108
166
  merge(
109
- // Dropdown is a session (rxjs SESSIONS_USE_HIGHER_ORDER_OBSERVABLES):
110
- // open$ opens the overlay; show() completes when an inner handler
111
- // dispatches `close`, close$ dismisses it externally; finalize
112
- // resets isOpen on either teardown path.
167
+ // Overlay session (rxjs SESSIONS_USE_HIGHER_ORDER_OBSERVABLES).
113
168
  this.open$.pipe(
114
169
  tap(() => {
115
- this.dispatchEvent(new CustomEvent('beforeopen', { bubbles: true, composed: true }))
116
170
  this.isOpen = true
117
171
  }),
118
172
  exhaustMap(anchor =>
119
173
  show(
120
- html`
174
+ // Reactive factory — closed-over props read fresh on each mount.
175
+ () => html`
121
176
  <schmancy-date-range-dialog
122
- .type="${this.type}"
123
- .dateFrom="${this.dateFrom}"
124
- .dateTo="${this.dateTo}"
125
- .minDate="${this.minDate}"
126
- .maxDate="${this.maxDate}"
127
- .activePreset="${this.activePreset}"
128
- .presetCategories="${this.presetCategories}"
129
- @preset-select="${(ev: CustomEvent) => {
130
- this.activePreset = ev.detail.preset.label
131
- this.setDateRange(ev.detail.preset.range.dateFrom, ev.detail.preset.range.dateTo)
132
- dispatchClose(ev.currentTarget)
133
- }}"
134
- @date-change="${() => this.updateSelectedDateRange()}"
135
- @apply-dates="${(ev: CustomEvent) => {
136
- const { dateFrom, dateTo, swapIfNeeded } = ev.detail
137
- if (swapIfNeeded) {
138
- this.setDateRange(dateTo, dateFrom)
139
- } else {
140
- this.setDateRange(dateFrom, dateTo)
177
+ .type=${this.type}
178
+ .start=${this.start}
179
+ .end=${this.end}
180
+ .min=${this.min}
181
+ .max=${this.max}
182
+ .preset=${this.preset}
183
+ .presets=${this.presets}
184
+ @calendar-input=${(ev: CustomEvent<{ start: string | null; end: string | null }>) => {
185
+ ev.stopPropagation()
186
+ this.dispatchEvent(
187
+ new CustomEvent('input', {
188
+ detail: { start: ev.detail.start, end: ev.detail.end },
189
+ bubbles: true,
190
+ composed: true,
191
+ }),
192
+ )
193
+ }}
194
+ @calendar-change=${(ev: CustomEvent<{ start: string | null; end: string | null }>) => {
195
+ ev.stopPropagation()
196
+ this.commitRange(ev.detail.start, ev.detail.end, null)
197
+ // Two endpoints set → close overlay
198
+ if (ev.detail.start && ev.detail.end) {
199
+ ev.target?.dispatchEvent(new CustomEvent('close', { bubbles: true, composed: true }))
141
200
  }
142
- dispatchClose(ev.currentTarget)
143
- }}"
144
- @announce="${(ev: CustomEvent) => this.announce$.next(ev.detail.message)}"
201
+ }}
202
+ @preset-select=${(ev: CustomEvent<DateRangeDialogPreset>) => {
203
+ ev.stopPropagation()
204
+ this.commitRange(ev.detail.start, ev.detail.end, ev.detail.id)
205
+ ev.target?.dispatchEvent(new CustomEvent('close', { bubbles: true, composed: true }))
206
+ }}
145
207
  ></schmancy-date-range-dialog>
146
208
  `,
147
209
  { anchor },
@@ -153,211 +215,145 @@ export class SchmancyDateRange extends SchmancyFormField() {
153
215
  ),
154
216
  ),
155
217
  ),
156
- // Announcements (rxjs LIFT_EVERY_ASYNC_SOURCE): one Subject, one
157
- // switchMap-cleared timer — not a fresh timer().subscribe() per call.
218
+
219
+ // Screen-reader announcements.
158
220
  this.announce$.pipe(
159
- switchMap(message => concat(of(message), timer(100).pipe(map(() => '')))),
221
+ switchMap(message => concat(of(message), timer(1500).pipe(map(() => '')))),
160
222
  tap(message => {
161
223
  this.announceMessage = message
162
224
  }),
163
225
  ),
226
+
164
227
  // Document keyboard navigation.
165
- fromEvent<KeyboardEvent>(document, 'keydown').pipe(tap(event => this.handleKeyboardNavigation(event))),
228
+ fromEvent<KeyboardEvent>(document, 'keydown').pipe(tap(ev => this.handleKeyDown(ev))),
166
229
  )
167
230
  .pipe(takeUntil(this.disconnecting))
168
231
  .subscribe()
169
232
  }
170
233
 
171
- updated(changedProps: PropertyValues) {
172
- super.updated(changedProps)
173
-
174
- if (
175
- (changedProps.has('dateFrom') || changedProps.has('dateTo')) &&
176
- (this.dateFrom?.value !== undefined || this.dateTo?.value !== undefined)
177
- ) {
178
- this.updateSelectedDateRange()
179
- }
180
- }
234
+ // -------------------------------------------------------------------------
235
+ // Mixin overrides — FormData, validity, dirty, reset
236
+ // -------------------------------------------------------------------------
181
237
 
182
238
  override willUpdate(changed: PropertyValues): void {
183
239
  super.willUpdate(changed)
184
- if (changed.has('dateFrom') || changed.has('dateTo') || changed.has('name')) {
185
- // Multi-entry FACE submission: setFormValue accepts a FormData
186
- // object whose entries are appended to the owning form's FormData.
187
- // native `new FormData(form)` then sees both `${name}From` and
188
- // `${name}To` without any consumer-side parsing.
240
+ // Consumer ownership detection must run before the type-change rebuild so that
241
+ // when both `type` and `presets` arrive in the same willUpdate cycle (e.g. simultaneous
242
+ // attribute/property initialisation), the consumer's presets are not overwritten.
243
+ //
244
+ // A `presets` change signals consumer ownership when the incoming value is not the
245
+ // array reference produced by the internal default-builder (defaultPresetsRef).
246
+ // Since buildDefaultPresets always allocates a new array, defaultPresetsRef is the
247
+ // only reference that could match; any other reference came from the consumer.
248
+ if (changed.has('presets') && this.presets !== this.defaultPresetsRef) {
249
+ this.usingDefaultPresets = false
250
+ }
251
+ // Rebuild built-in presets when type changes, but only while the consumer has never
252
+ // supplied their own presets array.
253
+ if (changed.has('type') && this.usingDefaultPresets) {
254
+ this.defaultPresetsRef = buildDefaultPresets(this.type)
255
+ this.presets = this.defaultPresetsRef
256
+ }
257
+ if (changed.has('start') || changed.has('end') || changed.has('name') || changed.has('disabled')) {
189
258
  if (this.name && !this.disabled) {
190
259
  const fd = new FormData()
191
- if (this.dateFrom?.value) fd.append(`${this.name}From`, this.dateFrom.value)
192
- if (this.dateTo?.value) fd.append(`${this.name}To`, this.dateTo.value)
193
- this.internals?.setFormValue(fd)
260
+ if (this.start) fd.append(`${this.name}.start`, this.start)
261
+ if (this.end) fd.append(`${this.name}.end`, this.end)
262
+ this.internals?.setFormValue(fd.has(`${this.name}.start`) || fd.has(`${this.name}.end`) ? fd : null)
194
263
  } else {
195
264
  this.internals?.setFormValue(null)
196
265
  }
197
266
  this.checkValidity()
198
267
  }
199
- if (changed.has('required') || changed.has('disabled')) {
268
+ if (changed.has('required')) {
200
269
  this.checkValidity()
201
270
  }
202
271
  }
203
272
 
204
- /**
205
- * Date-range validity is `both dates non-empty` when required.
206
- * (Order/range constraints are out of scope here — they belong to a
207
- * domain-specific schema layer.)
208
- */
209
273
  override checkValidity(): boolean {
210
274
  if (this.disabled) {
211
275
  this.internals?.setValidity({})
212
276
  return true
213
277
  }
214
- const fromEmpty = !this.dateFrom?.value
215
- const toEmpty = !this.dateTo?.value
216
- const isValid = !this.required || (!fromEmpty && !toEmpty)
217
- const message = isValid ? '' : 'Please select a date range.'
218
-
219
- this.internals?.setValidity(
220
- isValid ? {} : { valueMissing: true },
221
- isValid ? undefined : message,
222
- )
223
-
278
+ if (this.required && (!this.start || !this.end)) {
279
+ const msg = 'Please select a complete date range.'
280
+ this.internals?.setValidity({ valueMissing: true }, msg)
281
+ if (this.shouldShowError()) {
282
+ this.error = true
283
+ this.validationMessage = msg
284
+ }
285
+ return false
286
+ }
287
+ if (this.start && this.end && this.end < this.start) {
288
+ const msg = 'End date must be on or after start date.'
289
+ this.internals?.setValidity({ customError: true }, msg)
290
+ if (this.shouldShowError()) {
291
+ this.error = true
292
+ this.validationMessage = msg
293
+ }
294
+ return false
295
+ }
296
+ this.internals?.setValidity({})
224
297
  if (this.shouldShowError()) {
225
- this.error = !isValid
226
- this.validationMessage = message
298
+ this.error = false
299
+ this.validationMessage = ''
227
300
  }
228
- return isValid
301
+ return true
229
302
  }
230
303
 
231
- /**
232
- * Override — emit `${name}From` and `${name}To` flat-suffix entries (the
233
- * plan's chosen multi-entry encoding; native to JS consumers without
234
- * server-side bracket parsing).
235
- */
236
304
  override toFormEntries(): Array<[string, FormDataEntryValue]> {
237
305
  if (!this.name || this.disabled) return []
238
306
  const entries: Array<[string, FormDataEntryValue]> = []
239
- if (this.dateFrom?.value) entries.push([`${this.name}From`, this.dateFrom.value])
240
- if (this.dateTo?.value) entries.push([`${this.name}To`, this.dateTo.value])
307
+ if (this.start) entries.push([`${this.name}.start`, this.start])
308
+ if (this.end) entries.push([`${this.name}.end`, this.end])
241
309
  return entries
242
310
  }
243
311
 
244
- /** `dirty` tracks the underlying date strings, not the wide-union value. */
245
- private dateFromDefault: string = ''
246
- private dateToDefault: string = ''
312
+ override get dirty(): boolean {
313
+ return this.start !== this.startDefault || this.end !== this.endDefault
314
+ }
315
+
247
316
  override firstUpdated(changed: PropertyValues): void {
248
317
  super.firstUpdated(changed)
249
- this.dateFromDefault = this.dateFrom?.value ?? ''
250
- this.dateToDefault = this.dateTo?.value ?? ''
251
- }
252
- override get dirty(): boolean {
253
- return (
254
- (this.dateFrom?.value ?? '') !== this.dateFromDefault ||
255
- (this.dateTo?.value ?? '') !== this.dateToDefault
256
- )
318
+ this.startDefault = this.start
319
+ this.endDefault = this.end
320
+ this.presetDefault = this.preset
257
321
  }
258
322
 
259
323
  override resetForm(): void {
260
- this.dateFrom = { ...this.dateFrom, value: this.dateFromDefault }
261
- this.dateTo = { ...this.dateTo, value: this.dateToDefault }
262
- super.resetForm()
324
+ this.start = this.startDefault
325
+ this.end = this.endDefault
326
+ this.preset = this.presetDefault
327
+ this.error = false
328
+ this.validationMessage = ''
329
+ this.touched = false
330
+ this.submitted = false
331
+ this.internals?.setValidity({})
263
332
  }
264
333
 
265
- private initPresetRanges() {
266
- const format = this.getDateFormat()
267
- const cacheKey = `${this.type}-${format}-${JSON.stringify(this.customPresets)}`
268
-
269
- // Check memoization cache
270
- if (this.memoizedPresets.has(cacheKey)) {
271
- const cached = this.memoizedPresets.get(cacheKey)!
272
- this.presetCategories = cached
273
- this.presetRanges = []
274
- cached.forEach(category => {
275
- this.presetRanges.push(...category.presets)
276
- })
277
- return
278
- }
279
-
280
- // Generate preset categories
281
- this.presetCategories = generatePresetCategories(format, this.type === 'datetime-local')
282
-
283
- // Flatten presets for other methods that expect a flat list
284
- this.presetRanges = []
285
- this.presetCategories.forEach(category => {
286
- this.presetRanges.push(...category.presets)
287
- })
288
-
289
- // Add custom presets if provided
290
- if (this.customPresets && this.customPresets.length > 0) {
291
- const customCategory: PresetCategory = {
292
- name: 'Custom',
293
- presets: this.customPresets.map(preset => ({
294
- label: preset.label,
295
- range: {
296
- dateFrom: preset.dateFrom,
297
- dateTo: preset.dateTo,
298
- },
299
- step: 'day' as const,
300
- })),
301
- }
302
-
303
- this.presetCategories.push(customCategory)
304
- this.presetRanges.push(...customCategory.presets)
305
- }
306
-
307
- // Cache the result
308
- this.memoizedPresets.set(cacheKey, [...this.presetCategories])
309
- }
334
+ // -------------------------------------------------------------------------
335
+ // Internal helpers
336
+ // -------------------------------------------------------------------------
310
337
 
311
- private getDateFormat(): string {
312
- return this.format || (this.type === 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DDTHH:mm')
338
+ private commitRange(start: string | null, end: string | null, presetId: string | null): void {
339
+ this.start = start
340
+ this.end = end
341
+ this.preset = presetId
342
+ this.announce$.next(`Date range: ${this.displayLabel()}`)
343
+ this.emitChange({ start, end, preset: presetId })
313
344
  }
314
345
 
315
- /**
316
- * Creates a concise display format for the selected date range
317
- */
318
- private updateSelectedDateRange() {
319
- // Find matching preset
320
- const preset = this.presetRanges.find(
321
- p => p.range.dateFrom === this.dateFrom.value && p.range.dateTo === this.dateTo.value,
322
- )
323
-
324
- if (preset) {
325
- // If matches a preset, just use the preset name
326
- this.selectedDateRange = preset.label
327
- this.activePreset = preset.label
328
- return
346
+ private displayLabel(): string {
347
+ if (this.preset) {
348
+ const p = this.presets.find(x => x.id === this.preset)
349
+ if (p) return p.label
329
350
  }
330
-
331
- // If we didn't find a preset match, check if we should update the active preset
332
- this.checkAndUpdateActivePreset(this.dateFrom.value, this.dateTo.value)
333
-
334
- // Custom date range - create concise format
335
- this.activePreset = null
336
- this.selectedDateRange = formatDateRange(this.dateFrom.value, this.dateTo.value, this.type, this.placeholder)
337
- }
338
-
339
- private setDateRange(dateFrom: string, dateTo: string) {
340
- this.dateFrom.value = dateFrom
341
- this.dateTo.value = dateTo
342
- this.updateSelectedDateRange()
343
-
344
- // Announce change to screen readers
345
- this.announce$.next(`Date range updated: ${this.selectedDateRange}`)
346
-
347
- this.dispatchEvent(
348
- new CustomEvent<{ dateFrom: string; dateTo: string }>('change', {
349
- detail: { dateFrom, dateTo },
350
- bubbles: true,
351
- composed: true,
352
- }),
353
- )
351
+ return formatDateRange(this.start ?? '', this.end ?? '', this.type, this.placeholder)
354
352
  }
355
353
 
356
354
  private toggleDropdown(e: MouseEvent) {
357
355
  e.stopPropagation()
358
356
  if (this.disabled || this.step !== undefined) return
359
- // Drive the session pipeline (connectedCallback) — no imperative
360
- // open/close, no manual subscription field.
361
357
  if (this.isOpen) {
362
358
  this.close$.next()
363
359
  } else {
@@ -365,24 +361,18 @@ export class SchmancyDateRange extends SchmancyFormField() {
365
361
  }
366
362
  }
367
363
 
368
- /**
369
- * Shifts the date range based on the step property
370
- */
371
364
  private shiftDateRange(direction: number, e: Event) {
372
365
  e.stopPropagation()
366
+ if (!this.start || !this.end) return
373
367
 
374
- if (!this.dateFrom.value || !this.dateTo.value) return
375
-
376
- const fromDate = dayjs(this.dateFrom.value)
377
- const toDate = dayjs(this.dateTo.value)
378
-
368
+ const fromDate = dayjs(this.start)
369
+ const toDate = dayjs(this.end)
379
370
  if (!fromDate.isValid() || !toDate.isValid()) return
380
371
 
381
- const format = this.getDateFormat()
372
+ const dateFormat = this.type === 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DDTHH:mm'
382
373
  const dir = direction > 0 ? 1 : -1
383
374
  const daysDiff = toDate.diff(fromDate, 'day') + 1
384
375
 
385
- // Determine shift amount and unit
386
376
  let amount: number
387
377
  let unit: dayjs.ManipulateType
388
378
 
@@ -398,7 +388,6 @@ export class SchmancyDateRange extends SchmancyFormField() {
398
388
  unit = this.step
399
389
  }
400
390
  } else {
401
- // Auto-detect based on date range
402
391
  const rangeType = detectDateRangeType(fromDate, toDate)
403
392
  if (rangeType.isFullYear) {
404
393
  amount = dir
@@ -415,182 +404,135 @@ export class SchmancyDateRange extends SchmancyFormField() {
415
404
  }
416
405
  }
417
406
 
418
- const newFromDate = fromDate.add(amount, unit)
419
- const newToDate = toDate.add(amount, unit)
407
+ const newFrom = fromDate.add(amount, unit)
408
+ const newTo = toDate.add(amount, unit)
420
409
 
421
- // Validate against min/max dates
422
- if (this.minDate && newFromDate.isBefore(dayjs(this.minDate))) return
423
- if (this.maxDate && newToDate.isAfter(dayjs(this.maxDate))) return
410
+ if (this.min && newFrom.isBefore(dayjs(this.min))) return
411
+ if (this.max && newTo.isAfter(dayjs(this.max))) return
424
412
 
425
- // Update the date range
426
- this.setDateRange(newFromDate.format(format), newToDate.format(format))
427
- this.checkAndUpdateActivePreset(newFromDate.format(format), newToDate.format(format))
428
- }
429
-
430
- /**
431
- * Handle keyboard navigation for accessibility
432
- */
433
- private handleKeyboardNavigation(event: KeyboardEvent) {
434
- const key = event.key
435
-
436
- // Handle date navigation keys
437
- if (this.dateFrom.value && this.dateTo.value && !this.disabled) {
438
- switch (key) {
439
- case 'PageUp':
440
- if (event.target === this || this.contains(event.target as Node)) {
441
- this.shiftDateRange(-1, event)
442
- event.preventDefault()
443
- }
444
- break
445
- case 'PageDown':
446
- if (event.target === this || this.contains(event.target as Node)) {
447
- this.shiftDateRange(1, event)
448
- event.preventDefault()
449
- }
450
- break
451
- case 'Home':
452
- if (event.ctrlKey && (event.target === this || this.contains(event.target as Node))) {
453
- // Ctrl+Home: Jump to start of current month
454
- const currentFrom = dayjs(this.dateFrom.value)
455
- const currentTo = dayjs(this.dateTo.value)
456
- const monthStart = currentFrom.startOf('month')
457
- const daysDiff = currentTo.diff(currentFrom, 'day')
458
-
459
- this.setDateRange(
460
- monthStart.format(this.getDateFormat()),
461
- monthStart.add(daysDiff, 'day').format(this.getDateFormat())
462
- )
463
- event.preventDefault()
464
- }
465
- break
466
- case 'End':
467
- if (event.ctrlKey && (event.target === this || this.contains(event.target as Node))) {
468
- // Ctrl+End: Jump to end of current month
469
- const currentFrom = dayjs(this.dateFrom.value)
470
- const currentTo = dayjs(this.dateTo.value)
471
- const daysDiff = currentTo.diff(currentFrom, 'day')
472
- const monthEnd = currentTo.endOf('month')
473
-
474
- this.setDateRange(
475
- monthEnd.subtract(daysDiff, 'day').format(this.getDateFormat()),
476
- monthEnd.format(this.getDateFormat())
477
- )
478
- event.preventDefault()
479
- }
480
- break
481
- }
482
- }
413
+ this.commitRange(newFrom.format(dateFormat), newTo.format(dateFormat), null)
483
414
  }
484
415
 
485
- /**
486
- * Checks if the current date range matches any predefined preset,
487
- * and updates the activePreset accordingly
488
- */
489
- private checkAndUpdateActivePreset(fromDate: string, toDate: string) {
490
- // Find a preset that matches the current date range
491
- const matchingPreset = this.presetRanges.find(
492
- preset => preset.range.dateFrom === fromDate && preset.range.dateTo === toDate,
493
- )
494
-
495
- if (matchingPreset) {
496
- this.activePreset = matchingPreset.label
497
- } else {
498
- this.activePreset = null
416
+ private handleKeyDown(ev: KeyboardEvent) {
417
+ if (!this.start || !this.end || this.disabled) return
418
+ const target = ev.target as Node | null
419
+ if (target !== this && !this.contains(target)) return
420
+
421
+ switch (ev.key) {
422
+ case 'PageUp':
423
+ this.shiftDateRange(-1, ev)
424
+ ev.preventDefault()
425
+ break
426
+ case 'PageDown':
427
+ this.shiftDateRange(1, ev)
428
+ ev.preventDefault()
429
+ break
430
+ case 'Home':
431
+ if (ev.ctrlKey) {
432
+ const fmt = this.type === 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DDTHH:mm'
433
+ const from = dayjs(this.start)
434
+ const to = dayjs(this.end)
435
+ const monthStart = from.startOf('month')
436
+ this.commitRange(
437
+ monthStart.format(fmt),
438
+ monthStart.add(to.diff(from, 'day'), 'day').format(fmt),
439
+ null,
440
+ )
441
+ ev.preventDefault()
442
+ }
443
+ break
444
+ case 'End':
445
+ if (ev.ctrlKey) {
446
+ const fmt = this.type === 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DDTHH:mm'
447
+ const from = dayjs(this.start)
448
+ const to = dayjs(this.end)
449
+ const monthEnd = to.endOf('month')
450
+ this.commitRange(
451
+ monthEnd.subtract(to.diff(from, 'day'), 'day').format(fmt),
452
+ monthEnd.format(fmt),
453
+ null,
454
+ )
455
+ ev.preventDefault()
456
+ }
457
+ break
499
458
  }
500
459
  }
501
460
 
502
- /**
503
- * Check if we can navigate backward
504
- */
505
461
  private canNavigateBackward(): boolean {
506
- if (!this.dateFrom.value || !this.minDate) return true
507
-
508
- const fromDate = dayjs(this.dateFrom.value)
509
- const minDate = dayjs(this.minDate)
510
-
511
- // If current start date is already at or before min date, can't go back
512
- return fromDate.isAfter(minDate)
462
+ if (!this.start || !this.min) return true
463
+ return dayjs(this.start).isAfter(dayjs(this.min))
513
464
  }
514
465
 
515
- /**
516
- * Check if we can navigate forward
517
- */
518
466
  private canNavigateForward(): boolean {
519
- if (!this.dateTo.value || !this.maxDate) return true
520
-
521
- const toDate = dayjs(this.dateTo.value)
522
- const maxDate = dayjs(this.maxDate)
523
-
524
- // If current end date is already at or after max date, can't go forward
525
- return toDate.isBefore(maxDate)
467
+ if (!this.end || !this.max) return true
468
+ return dayjs(this.end).isBefore(dayjs(this.max))
526
469
  }
527
470
 
471
+ // -------------------------------------------------------------------------
472
+ // Render
473
+ // -------------------------------------------------------------------------
528
474
 
529
475
  render() {
530
- // Step 6 — validity is two surfaces: when checkValidity() has flipped
531
- // `error` (gated by `shouldShowError`), the control must visibly carry
532
- // the invalid treatment AND render the message. Platform validity is
533
- // set in checkValidity(); this paints the user-facing half.
534
476
  const showError = this.error && !!this.validationMessage
535
477
  const errorRing = showError ? ' rounded outline outline-2 outline-error-default' : ''
478
+ const label = this.displayLabel()
536
479
 
537
480
  return html`
538
481
  <div class="relative ${this.disabled ? 'opacity-60 pointer-events-none' : ''}">
539
482
  <!-- Screen reader announcements -->
540
- <div class="sr-only" role="status" aria-live="polite" aria-atomic="true">
541
- ${this.announceMessage}
542
- </div>
483
+ <div class="sr-only" role="status" aria-live="polite" aria-atomic="true">${this.announceMessage}</div>
543
484
 
544
- <!-- Collapsed: icon-only on mobile when collapse=true -->
485
+ <!-- Collapsed: icon-only on narrow viewports when collapse=true -->
545
486
  <schmancy-icon-button
546
487
  class="${this.collapse ? 'lg:hidden' : 'hidden'}${errorRing}"
547
488
  variant="outlined"
548
489
  type="button"
549
490
  aria-invalid=${showError ? 'true' : 'false'}
550
- aria-label="Select date range. Current: ${this.selectedDateRange || 'No date selected'}"
491
+ aria-label="Select date range. Current: ${label}"
551
492
  @click=${(e: MouseEvent) => this.toggleDropdown(e)}
552
493
  ?disabled=${this.disabled}
553
494
  >
554
- date_range
495
+ date_range
555
496
  </schmancy-icon-button>
556
497
 
557
- <!-- Full UI: always visible when collapse=false, or lg+ when collapse=true -->
498
+ <!-- Full trigger row: [← | range label | →] -->
558
499
  <section
559
- @click=${(event: Event) => event.stopPropagation()}
500
+ @click=${(ev: Event) => ev.stopPropagation()}
560
501
  aria-invalid=${showError ? 'true' : 'false'}
561
- class="${this.collapse ? 'hidden lg:flex' : 'flex'}${errorRing}">
562
- <schmancy-icon-button
563
- type="button"
564
- aria-label="Previous ${this.activePreset ? this.activePreset.toLowerCase() : 'date range'}"
565
- @click=${(e: Event) => this.shiftDateRange(-1, e)}
566
- ?disabled=${this.disabled || !this.dateFrom.value || !this.dateTo.value || !this.canNavigateBackward()}
567
- >
568
- arrow_left
569
- </schmancy-icon-button>
570
-
571
- <schmancy-button
572
- class="w-max"
573
- variant="outlined"
574
- type="button"
575
- aria-haspopup="menu"
576
- aria-expanded=${this.isOpen}
577
- aria-label="Select date range. Current: ${this.selectedDateRange || 'No date selected'}"
578
- aria-readonly="${this.step !== undefined}"
579
- @click=${(e: MouseEvent) => this.toggleDropdown(e)}
580
- ?disabled=${this.disabled}
581
- style="${this.step !== undefined ? 'cursor: default;' : ''}"
582
- >
583
- ${this.selectedDateRange || this.placeholder}
584
- </schmancy-button>
585
-
586
- <schmancy-icon-button
587
- type="button"
588
- aria-label="Next ${this.activePreset ? this.activePreset.toLowerCase() : 'date range'}"
589
- @click=${(e: Event) => this.shiftDateRange(1, e)}
590
- ?disabled=${this.disabled || !this.dateFrom.value || !this.dateTo.value || !this.canNavigateForward()}
591
- >
592
- arrow_right
593
- </schmancy-icon-button>
502
+ class="${this.collapse ? 'hidden lg:flex' : 'flex'}${errorRing}"
503
+ >
504
+ <schmancy-icon-button
505
+ type="button"
506
+ aria-label="Previous ${this.preset ?? 'date range'}"
507
+ @click=${(e: Event) => this.shiftDateRange(-1, e)}
508
+ ?disabled=${this.disabled || !this.start || !this.end || !this.canNavigateBackward()}
509
+ >
510
+ arrow_left
511
+ </schmancy-icon-button>
512
+
513
+ <schmancy-button
514
+ class="w-max"
515
+ variant="outlined"
516
+ type="button"
517
+ aria-haspopup="dialog"
518
+ aria-expanded=${this.isOpen}
519
+ aria-label="Select date range. Current: ${label}"
520
+ aria-readonly="${this.step !== undefined}"
521
+ @click=${(e: MouseEvent) => this.toggleDropdown(e)}
522
+ ?disabled=${this.disabled}
523
+ style="${this.step !== undefined ? 'cursor:default;' : ''}"
524
+ >
525
+ ${label}
526
+ </schmancy-button>
527
+
528
+ <schmancy-icon-button
529
+ type="button"
530
+ aria-label="Next ${this.preset ?? 'date range'}"
531
+ @click=${(e: Event) => this.shiftDateRange(1, e)}
532
+ ?disabled=${this.disabled || !this.start || !this.end || !this.canNavigateForward()}
533
+ >
534
+ arrow_right
535
+ </schmancy-icon-button>
594
536
  </section>
595
537
 
596
538
  ${showError
@@ -599,4 +541,10 @@ export class SchmancyDateRange extends SchmancyFormField() {
599
541
  </div>
600
542
  `
601
543
  }
602
- }
544
+ }
545
+
546
+ declare global {
547
+ interface HTMLElementTagNameMap {
548
+ 'schmancy-date-range': SchmancyDateRange
549
+ }
550
+ }