@mhmo91/schmancy 0.10.42 → 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 (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 +4031 -3891
  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-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-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-DAtcPmCb.js} +173 -175
  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-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 +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 +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 +35 -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,114 @@ 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(): DateRangeDialogPreset[] {
32
+ return [
33
+ {
34
+ id: 'today',
35
+ label: 'Today',
36
+ start: dayjs().startOf('day').format('YYYY-MM-DD'),
37
+ end: dayjs().endOf('day').format('YYYY-MM-DD'),
38
+ },
39
+ {
40
+ id: 'yesterday',
41
+ label: 'Yesterday',
42
+ start: dayjs().subtract(1, 'day').startOf('day').format('YYYY-MM-DD'),
43
+ end: dayjs().subtract(1, 'day').endOf('day').format('YYYY-MM-DD'),
44
+ },
45
+ {
46
+ id: 'last7',
47
+ label: 'Last 7 days',
48
+ start: dayjs().subtract(6, 'day').startOf('day').format('YYYY-MM-DD'),
49
+ end: dayjs().endOf('day').format('YYYY-MM-DD'),
50
+ },
51
+ {
52
+ id: 'last30',
53
+ label: 'Last 30 days',
54
+ start: dayjs().subtract(29, 'day').startOf('day').format('YYYY-MM-DD'),
55
+ end: dayjs().endOf('day').format('YYYY-MM-DD'),
56
+ },
57
+ {
58
+ id: 'thisWeek',
59
+ label: 'This week',
60
+ start: dayjs().startOf('week').format('YYYY-MM-DD'),
61
+ end: dayjs().endOf('week').format('YYYY-MM-DD'),
62
+ },
63
+ {
64
+ id: 'thisMonth',
65
+ label: 'This month',
66
+ start: dayjs().startOf('month').format('YYYY-MM-DD'),
67
+ end: dayjs().endOf('month').format('YYYY-MM-DD'),
68
+ },
69
+ {
70
+ id: 'lastMonth',
71
+ label: 'Last month',
72
+ start: dayjs().subtract(1, 'month').startOf('month').format('YYYY-MM-DD'),
73
+ end: dayjs().subtract(1, 'month').endOf('month').format('YYYY-MM-DD'),
74
+ },
75
+ {
76
+ id: 'thisYear',
77
+ label: 'This year',
78
+ start: dayjs().startOf('year').format('YYYY-MM-DD'),
79
+ end: dayjs().endOf('year').format('YYYY-MM-DD'),
80
+ },
81
+ ]
21
82
  }
22
83
 
84
+ // ---------------------------------------------------------------------------
85
+ // Event types
86
+ // ---------------------------------------------------------------------------
87
+
88
+ export type SchmancyDateRangeInputEvent = CustomEvent<{
89
+ start: string | null
90
+ end: string | null
91
+ }>
92
+
23
93
  export type SchmancyDateRangeChangeEvent = CustomEvent<{
24
- dateFrom: string
25
- dateTo: string
94
+ start: string | null
95
+ end: string | null
96
+ preset: string | null
26
97
  }>
27
98
 
99
+ // ---------------------------------------------------------------------------
100
+ // Component
101
+ // ---------------------------------------------------------------------------
102
+
28
103
  /**
29
- * A date range selector that supports presets and manual date input.
104
+ * A date range selector composing `<schmancy-calendar mode="range">` with a
105
+ * sticky preset chip quick-rail and a secondary typed-entry path.
106
+ *
107
+ * Public API: flat ISO `start`/`end`, `preset` read-back, `presets` array.
108
+ * FormData: `${name}.start` / `${name}.end` (empty endpoint omitted).
30
109
  *
31
110
  * @element schmancy-date-range
32
- * @fires change - Fired when the date range changes with dateFrom and dateTo values
111
+ * @fires input - Provisional sweep preview { start, end }
112
+ * @fires change - Committed range change { start, end, preset }
33
113
  */
34
114
  @customElement('schmancy-date-range')
35
115
  export class SchmancyDateRange extends SchmancyFormField() {
@@ -37,111 +117,86 @@ export class SchmancyDateRange extends SchmancyFormField() {
37
117
  // `validateOn`, `touched`, `submitted`, `markTouched`, `markSubmitted`,
38
118
  // FACE wiring, FIELD_CONNECT_EVENT dispatch — all from the mixin.
39
119
 
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'
120
+ @property() type: 'date' | 'datetime-local' = 'date'
121
+ @property() start: string | null = null
122
+ @property() end: string | null = null
123
+
124
+ @property({ type: Array }) presets: DateRangeDialogPreset[] = buildDefaultPresets()
125
+
126
+ /** Selected preset id; null = custom range. Reflects to attribute. */
127
+ @property({ reflect: true }) preset: string | null = null
128
+
129
+ @property() min?: string
130
+ @property() max?: string
131
+ @property() placeholder = 'Select date range'
53
132
  @property({ type: Boolean }) clearable = true
54
133
  @property() step?: 'day' | 'week' | 'month' | 'year' | number
55
- /** When true, collapses to just an icon button on mobile screens */
134
+ /** Collapses to an icon-only button on narrow viewports. */
56
135
  @property({ type: Boolean }) collapse = false
57
136
 
58
- // Session inputsdriven by handlers, consumed by the single pipeline
59
- // in connectedCallback (rxjs ONE_PIPELINE_ONE_SUBSCRIBE / SESSIONS).
137
+ // Session subjectsONE_PIPELINE_ONE_SUBSCRIBE in connectedCallback.
60
138
  private readonly open$ = new Subject<MouseEvent | undefined>()
61
139
  private readonly close$ = new Subject<void>()
62
140
  private readonly announce$ = new Subject<string>()
63
141
 
64
- // Internal states
65
142
  @state() private isOpen = false
66
- @state() private selectedDateRange: string = ''
67
- @state() private activePreset: string | null = null
68
- @state() private announceMessage: string = ''
143
+ @state() private announceMessage = ''
69
144
 
70
- // Default presets
71
- private presetRanges: DateRangePreset[] = []
145
+ // Default-capture for formResetCallback
146
+ private startDefault: string | null = null
147
+ private endDefault: string | null = null
148
+ private presetDefault: string | null = null
72
149
 
73
- // Categorized presets
74
- private presetCategories: PresetCategory[] = []
75
-
76
- // Memoization cache
77
- private memoizedPresets = new Map<string, PresetCategory[]>()
78
-
79
- disconnectedCallback(): void {
150
+ override disconnectedCallback(): void {
80
151
  super.disconnectedCallback()
81
- // Reset open state when element is moved/removed to prevent stale state
82
152
  this.isOpen = false
83
153
  }
84
154
 
85
- connectedCallback(): void {
155
+ override connectedCallback(): void {
86
156
  super.connectedCallback()
87
- this.initPresetRanges()
88
157
 
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
-
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).
158
+ // One pipeline (rxjs ONE_PIPELINE_ONE_SUBSCRIBE).
108
159
  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.
160
+ // Overlay session (rxjs SESSIONS_USE_HIGHER_ORDER_OBSERVABLES).
113
161
  this.open$.pipe(
114
162
  tap(() => {
115
- this.dispatchEvent(new CustomEvent('beforeopen', { bubbles: true, composed: true }))
116
163
  this.isOpen = true
117
164
  }),
118
165
  exhaustMap(anchor =>
119
166
  show(
120
- html`
167
+ // Reactive factory — closed-over props read fresh on each mount.
168
+ () => html`
121
169
  <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)
170
+ .type=${this.type}
171
+ .start=${this.start}
172
+ .end=${this.end}
173
+ .min=${this.min}
174
+ .max=${this.max}
175
+ .preset=${this.preset}
176
+ .presets=${this.presets}
177
+ @calendar-input=${(ev: CustomEvent<{ start: string | null; end: string | null }>) => {
178
+ ev.stopPropagation()
179
+ this.dispatchEvent(
180
+ new CustomEvent('input', {
181
+ detail: { start: ev.detail.start, end: ev.detail.end },
182
+ bubbles: true,
183
+ composed: true,
184
+ }),
185
+ )
186
+ }}
187
+ @calendar-change=${(ev: CustomEvent<{ start: string | null; end: string | null }>) => {
188
+ ev.stopPropagation()
189
+ this.commitRange(ev.detail.start, ev.detail.end, null)
190
+ // Two endpoints set → close overlay
191
+ if (ev.detail.start && ev.detail.end) {
192
+ ev.target?.dispatchEvent(new CustomEvent('close', { bubbles: true, composed: true }))
141
193
  }
142
- dispatchClose(ev.currentTarget)
143
- }}"
144
- @announce="${(ev: CustomEvent) => this.announce$.next(ev.detail.message)}"
194
+ }}
195
+ @preset-select=${(ev: CustomEvent<DateRangeDialogPreset>) => {
196
+ ev.stopPropagation()
197
+ this.commitRange(ev.detail.start, ev.detail.end, ev.detail.id)
198
+ ev.target?.dispatchEvent(new CustomEvent('close', { bubbles: true, composed: true }))
199
+ }}
145
200
  ></schmancy-date-range-dialog>
146
201
  `,
147
202
  { anchor },
@@ -153,211 +208,128 @@ export class SchmancyDateRange extends SchmancyFormField() {
153
208
  ),
154
209
  ),
155
210
  ),
156
- // Announcements (rxjs LIFT_EVERY_ASYNC_SOURCE): one Subject, one
157
- // switchMap-cleared timer — not a fresh timer().subscribe() per call.
211
+
212
+ // Screen-reader announcements.
158
213
  this.announce$.pipe(
159
- switchMap(message => concat(of(message), timer(100).pipe(map(() => '')))),
214
+ switchMap(message => concat(of(message), timer(1500).pipe(map(() => '')))),
160
215
  tap(message => {
161
216
  this.announceMessage = message
162
217
  }),
163
218
  ),
219
+
164
220
  // Document keyboard navigation.
165
- fromEvent<KeyboardEvent>(document, 'keydown').pipe(tap(event => this.handleKeyboardNavigation(event))),
221
+ fromEvent<KeyboardEvent>(document, 'keydown').pipe(tap(ev => this.handleKeyDown(ev))),
166
222
  )
167
223
  .pipe(takeUntil(this.disconnecting))
168
224
  .subscribe()
169
225
  }
170
226
 
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
- }
227
+ // -------------------------------------------------------------------------
228
+ // Mixin overrides — FormData, validity, dirty, reset
229
+ // -------------------------------------------------------------------------
181
230
 
182
231
  override willUpdate(changed: PropertyValues): void {
183
232
  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.
233
+ if (changed.has('start') || changed.has('end') || changed.has('name') || changed.has('disabled')) {
189
234
  if (this.name && !this.disabled) {
190
235
  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)
236
+ if (this.start) fd.append(`${this.name}.start`, this.start)
237
+ if (this.end) fd.append(`${this.name}.end`, this.end)
238
+ this.internals?.setFormValue(fd.has(`${this.name}.start`) || fd.has(`${this.name}.end`) ? fd : null)
194
239
  } else {
195
240
  this.internals?.setFormValue(null)
196
241
  }
197
242
  this.checkValidity()
198
243
  }
199
- if (changed.has('required') || changed.has('disabled')) {
244
+ if (changed.has('required')) {
200
245
  this.checkValidity()
201
246
  }
202
247
  }
203
248
 
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
249
  override checkValidity(): boolean {
210
250
  if (this.disabled) {
211
251
  this.internals?.setValidity({})
212
252
  return true
213
253
  }
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
-
254
+ if (this.required && (!this.start || !this.end)) {
255
+ const msg = 'Please select a complete date range.'
256
+ this.internals?.setValidity({ valueMissing: true }, msg)
257
+ if (this.shouldShowError()) {
258
+ this.error = true
259
+ this.validationMessage = msg
260
+ }
261
+ return false
262
+ }
263
+ if (this.start && this.end && this.end < this.start) {
264
+ const msg = 'End date must be on or after start date.'
265
+ this.internals?.setValidity({ customError: true }, msg)
266
+ if (this.shouldShowError()) {
267
+ this.error = true
268
+ this.validationMessage = msg
269
+ }
270
+ return false
271
+ }
272
+ this.internals?.setValidity({})
224
273
  if (this.shouldShowError()) {
225
- this.error = !isValid
226
- this.validationMessage = message
274
+ this.error = false
275
+ this.validationMessage = ''
227
276
  }
228
- return isValid
277
+ return true
229
278
  }
230
279
 
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
280
  override toFormEntries(): Array<[string, FormDataEntryValue]> {
237
281
  if (!this.name || this.disabled) return []
238
282
  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])
283
+ if (this.start) entries.push([`${this.name}.start`, this.start])
284
+ if (this.end) entries.push([`${this.name}.end`, this.end])
241
285
  return entries
242
286
  }
243
287
 
244
- /** `dirty` tracks the underlying date strings, not the wide-union value. */
245
- private dateFromDefault: string = ''
246
- private dateToDefault: string = ''
288
+ override get dirty(): boolean {
289
+ return this.start !== this.startDefault || this.end !== this.endDefault
290
+ }
291
+
247
292
  override firstUpdated(changed: PropertyValues): void {
248
293
  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
- )
294
+ this.startDefault = this.start
295
+ this.endDefault = this.end
296
+ this.presetDefault = this.preset
257
297
  }
258
298
 
259
299
  override resetForm(): void {
260
- this.dateFrom = { ...this.dateFrom, value: this.dateFromDefault }
261
- this.dateTo = { ...this.dateTo, value: this.dateToDefault }
262
- super.resetForm()
300
+ this.start = this.startDefault
301
+ this.end = this.endDefault
302
+ this.preset = this.presetDefault
303
+ this.error = false
304
+ this.validationMessage = ''
305
+ this.touched = false
306
+ this.submitted = false
307
+ this.internals?.setValidity({})
263
308
  }
264
309
 
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
- }
310
+ // -------------------------------------------------------------------------
311
+ // Internal helpers
312
+ // -------------------------------------------------------------------------
310
313
 
311
- private getDateFormat(): string {
312
- return this.format || (this.type === 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DDTHH:mm')
314
+ private commitRange(start: string | null, end: string | null, presetId: string | null): void {
315
+ this.start = start
316
+ this.end = end
317
+ this.preset = presetId
318
+ this.announce$.next(`Date range: ${this.displayLabel()}`)
319
+ this.emitChange({ start, end, preset: presetId })
313
320
  }
314
321
 
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
322
+ private displayLabel(): string {
323
+ if (this.preset) {
324
+ const p = this.presets.find(x => x.id === this.preset)
325
+ if (p) return p.label
329
326
  }
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
- )
327
+ return formatDateRange(this.start ?? '', this.end ?? '', this.type, this.placeholder)
354
328
  }
355
329
 
356
330
  private toggleDropdown(e: MouseEvent) {
357
331
  e.stopPropagation()
358
332
  if (this.disabled || this.step !== undefined) return
359
- // Drive the session pipeline (connectedCallback) — no imperative
360
- // open/close, no manual subscription field.
361
333
  if (this.isOpen) {
362
334
  this.close$.next()
363
335
  } else {
@@ -365,24 +337,18 @@ export class SchmancyDateRange extends SchmancyFormField() {
365
337
  }
366
338
  }
367
339
 
368
- /**
369
- * Shifts the date range based on the step property
370
- */
371
340
  private shiftDateRange(direction: number, e: Event) {
372
341
  e.stopPropagation()
342
+ if (!this.start || !this.end) return
373
343
 
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
-
344
+ const fromDate = dayjs(this.start)
345
+ const toDate = dayjs(this.end)
379
346
  if (!fromDate.isValid() || !toDate.isValid()) return
380
347
 
381
- const format = this.getDateFormat()
348
+ const dateFormat = this.type === 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DDTHH:mm'
382
349
  const dir = direction > 0 ? 1 : -1
383
350
  const daysDiff = toDate.diff(fromDate, 'day') + 1
384
351
 
385
- // Determine shift amount and unit
386
352
  let amount: number
387
353
  let unit: dayjs.ManipulateType
388
354
 
@@ -398,7 +364,6 @@ export class SchmancyDateRange extends SchmancyFormField() {
398
364
  unit = this.step
399
365
  }
400
366
  } else {
401
- // Auto-detect based on date range
402
367
  const rangeType = detectDateRangeType(fromDate, toDate)
403
368
  if (rangeType.isFullYear) {
404
369
  amount = dir
@@ -415,182 +380,135 @@ export class SchmancyDateRange extends SchmancyFormField() {
415
380
  }
416
381
  }
417
382
 
418
- const newFromDate = fromDate.add(amount, unit)
419
- const newToDate = toDate.add(amount, unit)
383
+ const newFrom = fromDate.add(amount, unit)
384
+ const newTo = toDate.add(amount, unit)
420
385
 
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
386
+ if (this.min && newFrom.isBefore(dayjs(this.min))) return
387
+ if (this.max && newTo.isAfter(dayjs(this.max))) return
424
388
 
425
- // Update the date range
426
- this.setDateRange(newFromDate.format(format), newToDate.format(format))
427
- this.checkAndUpdateActivePreset(newFromDate.format(format), newToDate.format(format))
389
+ this.commitRange(newFrom.format(dateFormat), newTo.format(dateFormat), null)
428
390
  }
429
391
 
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
- }
392
+ private handleKeyDown(ev: KeyboardEvent) {
393
+ if (!this.start || !this.end || this.disabled) return
394
+ const target = ev.target as Node | null
395
+ if (target !== this && !this.contains(target)) return
396
+
397
+ switch (ev.key) {
398
+ case 'PageUp':
399
+ this.shiftDateRange(-1, ev)
400
+ ev.preventDefault()
401
+ break
402
+ case 'PageDown':
403
+ this.shiftDateRange(1, ev)
404
+ ev.preventDefault()
405
+ break
406
+ case 'Home':
407
+ if (ev.ctrlKey) {
408
+ const fmt = this.type === 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DDTHH:mm'
409
+ const from = dayjs(this.start)
410
+ const to = dayjs(this.end)
411
+ const monthStart = from.startOf('month')
412
+ this.commitRange(
413
+ monthStart.format(fmt),
414
+ monthStart.add(to.diff(from, 'day'), 'day').format(fmt),
415
+ null,
416
+ )
417
+ ev.preventDefault()
418
+ }
419
+ break
420
+ case 'End':
421
+ if (ev.ctrlKey) {
422
+ const fmt = this.type === 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DDTHH:mm'
423
+ const from = dayjs(this.start)
424
+ const to = dayjs(this.end)
425
+ const monthEnd = to.endOf('month')
426
+ this.commitRange(
427
+ monthEnd.subtract(to.diff(from, 'day'), 'day').format(fmt),
428
+ monthEnd.format(fmt),
429
+ null,
430
+ )
431
+ ev.preventDefault()
432
+ }
433
+ break
482
434
  }
483
435
  }
484
436
 
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
499
- }
500
- }
501
-
502
- /**
503
- * Check if we can navigate backward
504
- */
505
437
  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)
438
+ if (!this.start || !this.min) return true
439
+ return dayjs(this.start).isAfter(dayjs(this.min))
513
440
  }
514
441
 
515
- /**
516
- * Check if we can navigate forward
517
- */
518
442
  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)
443
+ if (!this.end || !this.max) return true
444
+ return dayjs(this.end).isBefore(dayjs(this.max))
526
445
  }
527
446
 
447
+ // -------------------------------------------------------------------------
448
+ // Render
449
+ // -------------------------------------------------------------------------
528
450
 
529
451
  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
452
  const showError = this.error && !!this.validationMessage
535
453
  const errorRing = showError ? ' rounded outline outline-2 outline-error-default' : ''
454
+ const label = this.displayLabel()
536
455
 
537
456
  return html`
538
457
  <div class="relative ${this.disabled ? 'opacity-60 pointer-events-none' : ''}">
539
458
  <!-- Screen reader announcements -->
540
- <div class="sr-only" role="status" aria-live="polite" aria-atomic="true">
541
- ${this.announceMessage}
542
- </div>
459
+ <div class="sr-only" role="status" aria-live="polite" aria-atomic="true">${this.announceMessage}</div>
543
460
 
544
- <!-- Collapsed: icon-only on mobile when collapse=true -->
461
+ <!-- Collapsed: icon-only on narrow viewports when collapse=true -->
545
462
  <schmancy-icon-button
546
463
  class="${this.collapse ? 'lg:hidden' : 'hidden'}${errorRing}"
547
464
  variant="outlined"
548
465
  type="button"
549
466
  aria-invalid=${showError ? 'true' : 'false'}
550
- aria-label="Select date range. Current: ${this.selectedDateRange || 'No date selected'}"
467
+ aria-label="Select date range. Current: ${label}"
551
468
  @click=${(e: MouseEvent) => this.toggleDropdown(e)}
552
469
  ?disabled=${this.disabled}
553
470
  >
554
- date_range
471
+ date_range
555
472
  </schmancy-icon-button>
556
473
 
557
- <!-- Full UI: always visible when collapse=false, or lg+ when collapse=true -->
474
+ <!-- Full trigger row: [← | range label | →] -->
558
475
  <section
559
- @click=${(event: Event) => event.stopPropagation()}
476
+ @click=${(ev: Event) => ev.stopPropagation()}
560
477
  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>
478
+ class="${this.collapse ? 'hidden lg:flex' : 'flex'}${errorRing}"
479
+ >
480
+ <schmancy-icon-button
481
+ type="button"
482
+ aria-label="Previous ${this.preset ?? 'date range'}"
483
+ @click=${(e: Event) => this.shiftDateRange(-1, e)}
484
+ ?disabled=${this.disabled || !this.start || !this.end || !this.canNavigateBackward()}
485
+ >
486
+ arrow_left
487
+ </schmancy-icon-button>
488
+
489
+ <schmancy-button
490
+ class="w-max"
491
+ variant="outlined"
492
+ type="button"
493
+ aria-haspopup="dialog"
494
+ aria-expanded=${this.isOpen}
495
+ aria-label="Select date range. Current: ${label}"
496
+ aria-readonly="${this.step !== undefined}"
497
+ @click=${(e: MouseEvent) => this.toggleDropdown(e)}
498
+ ?disabled=${this.disabled}
499
+ style="${this.step !== undefined ? 'cursor:default;' : ''}"
500
+ >
501
+ ${label}
502
+ </schmancy-button>
503
+
504
+ <schmancy-icon-button
505
+ type="button"
506
+ aria-label="Next ${this.preset ?? 'date range'}"
507
+ @click=${(e: Event) => this.shiftDateRange(1, e)}
508
+ ?disabled=${this.disabled || !this.start || !this.end || !this.canNavigateForward()}
509
+ >
510
+ arrow_right
511
+ </schmancy-icon-button>
594
512
  </section>
595
513
 
596
514
  ${showError
@@ -599,4 +517,10 @@ export class SchmancyDateRange extends SchmancyFormField() {
599
517
  </div>
600
518
  `
601
519
  }
602
- }
520
+ }
521
+
522
+ declare global {
523
+ interface HTMLElementTagNameMap {
524
+ 'schmancy-date-range': SchmancyDateRange
525
+ }
526
+ }