@mhmo91/schmancy 0.10.35 → 0.10.37

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 (430) hide show
  1. package/custom-elements.json +1165 -1109
  2. package/dist/SchmancyElement-BHfQg3Tj.cjs +2 -0
  3. package/dist/SchmancyElement-BHfQg3Tj.cjs.map +1 -0
  4. package/dist/SchmancyElement-CDT2q1lA.js +284 -0
  5. package/dist/SchmancyElement-CDT2q1lA.js.map +1 -0
  6. package/dist/agent/schmancy.agent.js +3488 -3290
  7. package/dist/agent/schmancy.agent.js.map +1 -1
  8. package/dist/agent/schmancy.manifest.json +335 -275
  9. package/dist/{area-DviXdbDx.js → area-KtULlxuA.js} +2 -2
  10. package/dist/{area-DviXdbDx.js.map → area-KtULlxuA.js.map} +1 -1
  11. package/dist/{area-CTSTgjlx.cjs → area-fdKhYB6T.cjs} +1 -1
  12. package/dist/{area-CTSTgjlx.cjs.map → area-fdKhYB6T.cjs.map} +1 -1
  13. package/dist/area.cjs +1 -1
  14. package/dist/area.js +1 -1
  15. package/dist/{audio-Q9oB_cQR.cjs → audio-CUMAv9D_.cjs} +1 -1
  16. package/dist/{audio-Q9oB_cQR.cjs.map → audio-CUMAv9D_.cjs.map} +1 -1
  17. package/dist/{audio-DFYoaw0M.js → audio-zIJVTo_V.js} +1 -1
  18. package/dist/{audio-DFYoaw0M.js.map → audio-zIJVTo_V.js.map} +1 -1
  19. package/dist/audio.cjs +1 -1
  20. package/dist/audio.js +2 -2
  21. package/dist/{autocomplete-DmLXJr7C.cjs → autocomplete-DEZk6wBD.cjs} +1 -1
  22. package/dist/{autocomplete-DmLXJr7C.cjs.map → autocomplete-DEZk6wBD.cjs.map} +1 -1
  23. package/dist/{autocomplete-BDvuma6D.js → autocomplete-DIScyo8Q.js} +3 -3
  24. package/dist/{autocomplete-BDvuma6D.js.map → autocomplete-DIScyo8Q.js.map} +1 -1
  25. package/dist/autocomplete.cjs +1 -1
  26. package/dist/autocomplete.js +1 -1
  27. package/dist/avatar.cjs +1 -1
  28. package/dist/avatar.js +3 -3
  29. package/dist/badge.cjs +1 -1
  30. package/dist/badge.js +1 -1
  31. package/dist/{boat-lr7MPZ7H.js → boat-BHPqSqJd.js} +67 -83
  32. package/dist/boat-BHPqSqJd.js.map +1 -0
  33. package/dist/boat-OBZ77exO.cjs +34 -0
  34. package/dist/boat-OBZ77exO.cjs.map +1 -0
  35. package/dist/boat.cjs +1 -1
  36. package/dist/boat.js +1 -1
  37. package/dist/breadcrumb.cjs +1 -1
  38. package/dist/breadcrumb.js +2 -2
  39. package/dist/{busy-CgzZbGfx.cjs → busy-BJNsKSCM.cjs} +1 -1
  40. package/dist/{busy-CgzZbGfx.cjs.map → busy-BJNsKSCM.cjs.map} +1 -1
  41. package/dist/{busy-DgQ4ux5N.js → busy-Dut78y4L.js} +2 -2
  42. package/dist/{busy-DgQ4ux5N.js.map → busy-Dut78y4L.js.map} +1 -1
  43. package/dist/busy.cjs +1 -1
  44. package/dist/busy.js +1 -1
  45. package/dist/{button-DFvR1iXX.cjs → button-DzlHLjWO.cjs} +1 -1
  46. package/dist/{button-DFvR1iXX.cjs.map → button-DzlHLjWO.cjs.map} +1 -1
  47. package/dist/{button-qbN1muQ0.js → button-kcpPQavY.js} +2 -2
  48. package/dist/{button-qbN1muQ0.js.map → button-kcpPQavY.js.map} +1 -1
  49. package/dist/button.cjs +4 -4
  50. package/dist/button.cjs.map +1 -1
  51. package/dist/button.js +16 -22
  52. package/dist/button.js.map +1 -1
  53. package/dist/{card-D_GlwZ5q.cjs → card-BLxPLqdQ.cjs} +1 -1
  54. package/dist/{card-D_GlwZ5q.cjs.map → card-BLxPLqdQ.cjs.map} +1 -1
  55. package/dist/{card-DAbr-7Vy.js → card-DxSKxCid.js} +2 -2
  56. package/dist/{card-DAbr-7Vy.js.map → card-DxSKxCid.js.map} +1 -1
  57. package/dist/card.cjs +1 -1
  58. package/dist/card.js +1 -1
  59. package/dist/{checkbox-BNORaxMF.js → checkbox-B1wiM3Dv.js} +2 -2
  60. package/dist/{checkbox-BNORaxMF.js.map → checkbox-B1wiM3Dv.js.map} +1 -1
  61. package/dist/{checkbox-BUY_uc_r.cjs → checkbox-BCLkhp5G.cjs} +1 -1
  62. package/dist/{checkbox-BUY_uc_r.cjs.map → checkbox-BCLkhp5G.cjs.map} +1 -1
  63. package/dist/checkbox.cjs +1 -1
  64. package/dist/checkbox.js +1 -1
  65. package/dist/{chips-CXZ4dJCK.cjs → chips-C9dS1WKn.cjs} +44 -33
  66. package/dist/chips-C9dS1WKn.cjs.map +1 -0
  67. package/dist/{chips-Dg6Lk6BT.js → chips-vWmwqQed.js} +145 -122
  68. package/dist/chips-vWmwqQed.js.map +1 -0
  69. package/dist/chips.cjs +1 -1
  70. package/dist/chips.js +2 -2
  71. package/dist/connectivity.cjs +1 -1
  72. package/dist/connectivity.js +3 -3
  73. package/dist/content-drawer.cjs +1 -1
  74. package/dist/content-drawer.js +1 -1
  75. package/dist/{date-range-C-_be3_E.cjs → date-range-BV6HuvLw.cjs} +25 -19
  76. package/dist/date-range-BV6HuvLw.cjs.map +1 -0
  77. package/dist/{date-range-BU6WX7d5.js → date-range-D3ge1b4c.js} +129 -137
  78. package/dist/date-range-D3ge1b4c.js.map +1 -0
  79. package/dist/{date-range-inline-DJtUmHKF.cjs → date-range-inline-DpYgdLRv.cjs} +1 -1
  80. package/dist/{date-range-inline-DJtUmHKF.cjs.map → date-range-inline-DpYgdLRv.cjs.map} +1 -1
  81. package/dist/{date-range-inline-7o7xtVIu.js → date-range-inline-DuWQaWps.js} +2 -2
  82. package/dist/{date-range-inline-7o7xtVIu.js.map → date-range-inline-DuWQaWps.js.map} +1 -1
  83. package/dist/date-range-inline.cjs +1 -1
  84. package/dist/date-range-inline.js +1 -1
  85. package/dist/date-range.cjs +1 -1
  86. package/dist/date-range.js +1 -1
  87. package/dist/delay.cjs +1 -1
  88. package/dist/delay.js +2 -2
  89. package/dist/{details-EfbDPVEo.js → details-C-GZaq3j.js} +2 -2
  90. package/dist/{details-EfbDPVEo.js.map → details-C-GZaq3j.js.map} +1 -1
  91. package/dist/{details-Bs0MyyvF.cjs → details-Dp5rLIWk.cjs} +1 -1
  92. package/dist/{details-Bs0MyyvF.cjs.map → details-Dp5rLIWk.cjs.map} +1 -1
  93. package/dist/details.cjs +1 -1
  94. package/dist/details.js +1 -1
  95. package/dist/{directives-fLwDj6b0.cjs → directives-D_l1E5H6.cjs} +3 -3
  96. package/dist/directives-D_l1E5H6.cjs.map +1 -0
  97. package/dist/{directives-zi1Mm2er.js → directives-DyS51FUh.js} +37 -21
  98. package/dist/directives-DyS51FUh.js.map +1 -0
  99. package/dist/directives.cjs +1 -1
  100. package/dist/directives.js +2 -2
  101. package/dist/{divider-CdIsWZrM.cjs → divider-CBnAmHMZ.cjs} +1 -1
  102. package/dist/{divider-CdIsWZrM.cjs.map → divider-CBnAmHMZ.cjs.map} +1 -1
  103. package/dist/{divider-CEPfrIwe.js → divider-nQffE0AD.js} +2 -2
  104. package/dist/{divider-CEPfrIwe.js.map → divider-nQffE0AD.js.map} +1 -1
  105. package/dist/divider.cjs +1 -1
  106. package/dist/divider.js +1 -1
  107. package/dist/dropdown.cjs +1 -1
  108. package/dist/dropdown.js +2 -2
  109. package/dist/{expand-g1vqqUp1.js → expand-DvTb-UPR.js} +3 -3
  110. package/dist/{expand-g1vqqUp1.js.map → expand-DvTb-UPR.js.map} +1 -1
  111. package/dist/{expand--at1k3qo.cjs → expand-mlP_3XWz.cjs} +1 -1
  112. package/dist/{expand--at1k3qo.cjs.map → expand-mlP_3XWz.cjs.map} +1 -1
  113. package/dist/expand.cjs +1 -1
  114. package/dist/expand.js +1 -1
  115. package/dist/fab.cjs +77 -0
  116. package/dist/fab.cjs.map +1 -0
  117. package/dist/fab.js +151 -0
  118. package/dist/fab.js.map +1 -0
  119. package/dist/{float-DxVzgI9o.js → float-C-Ko0Le3.js} +2 -2
  120. package/dist/{float-DxVzgI9o.js.map → float-C-Ko0Le3.js.map} +1 -1
  121. package/dist/{float-P9HukAm-.cjs → float-C17xgMT1.cjs} +1 -1
  122. package/dist/{float-P9HukAm-.cjs.map → float-C17xgMT1.cjs.map} +1 -1
  123. package/dist/float.cjs +1 -1
  124. package/dist/float.js +1 -1
  125. package/dist/{form-ByYhXe1p.cjs → form-CwPHcQYB.cjs} +1 -1
  126. package/dist/{form-ByYhXe1p.cjs.map → form-CwPHcQYB.cjs.map} +1 -1
  127. package/dist/{form-CqLaozHp.js → form-DA0hUu2h.js} +3 -3
  128. package/dist/{form-CqLaozHp.js.map → form-DA0hUu2h.js.map} +1 -1
  129. package/dist/form.cjs +6 -6
  130. package/dist/form.cjs.map +1 -1
  131. package/dist/form.js +25 -23
  132. package/dist/form.js.map +1 -1
  133. package/dist/handover/agent-runtime-followups.md +1 -1
  134. package/dist/handover/agent-runtime-v1.md +3 -3
  135. package/dist/{icons-CkphcMp6.js → icons-C6UfxmHZ.js} +2 -2
  136. package/dist/{icons-CkphcMp6.js.map → icons-C6UfxmHZ.js.map} +1 -1
  137. package/dist/{icons-DYtiRU5V.cjs → icons-CW3-oMSb.cjs} +1 -1
  138. package/dist/{icons-DYtiRU5V.cjs.map → icons-CW3-oMSb.cjs.map} +1 -1
  139. package/dist/icons.cjs +1 -1
  140. package/dist/icons.js +1 -1
  141. package/dist/{iframe-CjqJksl8.js → iframe-BTjZfYyh.js} +2 -2
  142. package/dist/{iframe-CjqJksl8.js.map → iframe-BTjZfYyh.js.map} +1 -1
  143. package/dist/{iframe-C3trkP8q.cjs → iframe-wuYT2xFz.cjs} +1 -1
  144. package/dist/{iframe-C3trkP8q.cjs.map → iframe-wuYT2xFz.cjs.map} +1 -1
  145. package/dist/iframe.cjs +1 -1
  146. package/dist/iframe.js +1 -1
  147. package/dist/index.cjs +1 -1
  148. package/dist/index.js +57 -56
  149. package/dist/{input-CG51zDVh.js → input-B_4g2ulO.js} +2 -2
  150. package/dist/{input-CG51zDVh.js.map → input-B_4g2ulO.js.map} +1 -1
  151. package/dist/{input-DuavpwNL.cjs → input-BrDiIT60.cjs} +1 -1
  152. package/dist/{input-DuavpwNL.cjs.map → input-BrDiIT60.cjs.map} +1 -1
  153. package/dist/{input-chip-57tgNXKT.cjs → input-chip-B-XWh4aE.cjs} +1 -1
  154. package/dist/input-chip-B-XWh4aE.cjs.map +1 -0
  155. package/dist/{input-chip-C6Lq1927.js → input-chip-BlWhOruv.js} +2 -2
  156. package/dist/input-chip-BlWhOruv.js.map +1 -0
  157. package/dist/input.cjs +1 -1
  158. package/dist/input.js +1 -1
  159. package/dist/json.cjs +1 -1
  160. package/dist/json.js +3 -3
  161. package/dist/kbd.cjs +1 -1
  162. package/dist/kbd.js +2 -2
  163. package/dist/{layout-6ipbiWTl.cjs → layout-BhyIcEVu.cjs} +1 -1
  164. package/dist/{layout-6ipbiWTl.cjs.map → layout-BhyIcEVu.cjs.map} +1 -1
  165. package/dist/{layout-D4IOwx7p.js → layout-Dxit9enO.js} +1 -1
  166. package/dist/{layout-D4IOwx7p.js.map → layout-Dxit9enO.js.map} +1 -1
  167. package/dist/layout.cjs +1 -1
  168. package/dist/layout.js +2 -2
  169. package/dist/{lightbox-H8pVWGMX.cjs → lightbox-CVBogswK.cjs} +1 -1
  170. package/dist/{lightbox-H8pVWGMX.cjs.map → lightbox-CVBogswK.cjs.map} +1 -1
  171. package/dist/{lightbox-CsyO2XSr.js → lightbox-D85XAAuC.js} +2 -2
  172. package/dist/{lightbox-CsyO2XSr.js.map → lightbox-D85XAAuC.js.map} +1 -1
  173. package/dist/lightbox.cjs +1 -1
  174. package/dist/lightbox.js +1 -1
  175. package/dist/{list-BAwH0pQW.js → list-DOF_yVn5.js} +2 -2
  176. package/dist/{list-BAwH0pQW.js.map → list-DOF_yVn5.js.map} +1 -1
  177. package/dist/{list-Bs9m8kw7.cjs → list-nVjLskgx.cjs} +1 -1
  178. package/dist/{list-Bs9m8kw7.cjs.map → list-nVjLskgx.cjs.map} +1 -1
  179. package/dist/list.cjs +1 -1
  180. package/dist/list.js +1 -1
  181. package/dist/{menu-BMcGzj1h.cjs → menu-DqmNjLgY.cjs} +1 -1
  182. package/dist/{menu-BMcGzj1h.cjs.map → menu-DqmNjLgY.cjs.map} +1 -1
  183. package/dist/{menu-tQVARVaC.js → menu-QrAK5Uu9.js} +3 -3
  184. package/dist/{menu-tQVARVaC.js.map → menu-QrAK5Uu9.js.map} +1 -1
  185. package/dist/menu.cjs +1 -1
  186. package/dist/menu.js +1 -1
  187. package/dist/{mixins-Bp0wIHg2.js → mixins-De1zjyhy.js} +1 -1
  188. package/dist/{mixins-Bp0wIHg2.js.map → mixins-De1zjyhy.js.map} +1 -1
  189. package/dist/{mixins-CGXSzZc7.cjs → mixins-DxHpyMHA.cjs} +1 -1
  190. package/dist/{mixins-CGXSzZc7.cjs.map → mixins-DxHpyMHA.cjs.map} +1 -1
  191. package/dist/mixins.cjs +1 -1
  192. package/dist/mixins.js +2 -2
  193. package/dist/nav-drawer.cjs +1 -1
  194. package/dist/nav-drawer.js +1 -1
  195. package/dist/navigation-bar.cjs +1 -1
  196. package/dist/navigation-bar.js +1 -1
  197. package/dist/navigation-rail.cjs +1 -1
  198. package/dist/navigation-rail.js +2 -2
  199. package/dist/{notification-D1tX2nx5.js → notification-BtAK7NK8.js} +4 -4
  200. package/dist/{notification-D1tX2nx5.js.map → notification-BtAK7NK8.js.map} +1 -1
  201. package/dist/{notification-Bz00zdpV.cjs → notification-DYzbUb5C.cjs} +1 -1
  202. package/dist/{notification-Bz00zdpV.cjs.map → notification-DYzbUb5C.cjs.map} +1 -1
  203. package/dist/notification.cjs +1 -1
  204. package/dist/notification.js +1 -1
  205. package/dist/{option-BpGV8Apj.js → option-DHwA0miA.js} +2 -2
  206. package/dist/{option-BpGV8Apj.js.map → option-DHwA0miA.js.map} +1 -1
  207. package/dist/{option-BnybLEDO.cjs → option-DnSPa8ro.cjs} +1 -1
  208. package/dist/{option-BnybLEDO.cjs.map → option-DnSPa8ro.cjs.map} +1 -1
  209. package/dist/option.cjs +1 -1
  210. package/dist/option.js +1 -1
  211. package/dist/{overlay-UQR2Dy3u.cjs → overlay-BVkqZmoS.cjs} +5 -5
  212. package/dist/overlay-BVkqZmoS.cjs.map +1 -0
  213. package/dist/{overlay-BpNhd74N.js → overlay-Del1sBEB.js} +108 -108
  214. package/dist/overlay-Del1sBEB.js.map +1 -0
  215. package/dist/overlay.cjs +1 -1
  216. package/dist/{overlay.confirm-body-CVDtVk5X.cjs → overlay.confirm-body-BV9umTAl.cjs} +1 -1
  217. package/dist/{overlay.confirm-body-CVDtVk5X.cjs.map → overlay.confirm-body-BV9umTAl.cjs.map} +1 -1
  218. package/dist/{overlay.confirm-body-BHcXu5Wk.js → overlay.confirm-body-DSONXUzl.js} +6 -6
  219. package/dist/{overlay.confirm-body-BHcXu5Wk.js.map → overlay.confirm-body-DSONXUzl.js.map} +1 -1
  220. package/dist/overlay.js +3 -3
  221. package/dist/{overlay.service-DTE6NwIM.js → overlay.service-BTp5Oq7f.js} +2 -2
  222. package/dist/{overlay.service-DTE6NwIM.js.map → overlay.service-BTp5Oq7f.js.map} +1 -1
  223. package/dist/{overlay.service-C8RsQzgM.cjs → overlay.service-XLlrsSdA.cjs} +1 -1
  224. package/dist/{overlay.service-C8RsQzgM.cjs.map → overlay.service-XLlrsSdA.cjs.map} +1 -1
  225. package/dist/{progress-gbIALDRs.cjs → progress-DUbTL9g9.cjs} +1 -1
  226. package/dist/{progress-gbIALDRs.cjs.map → progress-DUbTL9g9.cjs.map} +1 -1
  227. package/dist/{progress-CAKsxp29.js → progress-DYA83CFU.js} +2 -2
  228. package/dist/{progress-CAKsxp29.js.map → progress-DYA83CFU.js.map} +1 -1
  229. package/dist/progress.cjs +1 -1
  230. package/dist/progress.js +1 -1
  231. package/dist/{radio-group-CfJ5DtI4.cjs → radio-group-B-ORNtvR.cjs} +1 -1
  232. package/dist/{radio-group-CfJ5DtI4.cjs.map → radio-group-B-ORNtvR.cjs.map} +1 -1
  233. package/dist/{radio-group-otyvZvUk.js → radio-group-DxX0iJBo.js} +2 -2
  234. package/dist/{radio-group-otyvZvUk.js.map → radio-group-DxX0iJBo.js.map} +1 -1
  235. package/dist/radio-group.cjs +1 -1
  236. package/dist/radio-group.js +1 -1
  237. package/dist/range.cjs +1 -1
  238. package/dist/range.js +2 -2
  239. package/dist/{select-81jniVTs.cjs → select-B9uj_u-s.cjs} +1 -1
  240. package/dist/{select-81jniVTs.cjs.map → select-B9uj_u-s.cjs.map} +1 -1
  241. package/dist/{select-9vXx1fhr.js → select-C7gkA-ab.js} +3 -3
  242. package/dist/{select-9vXx1fhr.js.map → select-C7gkA-ab.js.map} +1 -1
  243. package/dist/select.cjs +1 -1
  244. package/dist/select.js +1 -1
  245. package/dist/skeleton.cjs +1 -1
  246. package/dist/skeleton.js +2 -2
  247. package/dist/skills/INDEX.md +1 -1
  248. package/dist/skills/SKILL.md +20 -18
  249. package/dist/skills/boat.md +21 -15
  250. package/dist/skills/fab.md +75 -0
  251. package/dist/skills/schmancy/INDEX.md +1 -1
  252. package/dist/skills/schmancy/SKILL.md +20 -18
  253. package/dist/skills/schmancy/boat.md +21 -15
  254. package/dist/skills/schmancy/fab.md +75 -0
  255. package/dist/skills/schmancy/steps.md +68 -34
  256. package/dist/skills/schmancy/theme.md +1 -1
  257. package/dist/skills/steps.md +68 -34
  258. package/dist/skills/theme.md +1 -1
  259. package/dist/slider.cjs +1 -1
  260. package/dist/slider.js +2 -2
  261. package/dist/{sound.service-CmIw63aM.cjs → sound.service-C7FDY_yD.cjs} +1 -1
  262. package/dist/{sound.service-CmIw63aM.cjs.map → sound.service-C7FDY_yD.cjs.map} +1 -1
  263. package/dist/{sound.service-D3ZSq1Kj.js → sound.service-O0232os6.js} +1 -1
  264. package/dist/{sound.service-D3ZSq1Kj.js.map → sound.service-O0232os6.js.map} +1 -1
  265. package/dist/{splash-screen-C5KAWXvA.cjs → splash-screen-DIS4odDr.cjs} +1 -1
  266. package/dist/{splash-screen-C5KAWXvA.cjs.map → splash-screen-DIS4odDr.cjs.map} +1 -1
  267. package/dist/{splash-screen-BOjrmGLk.js → splash-screen-jfE47xl0.js} +2 -2
  268. package/dist/{splash-screen-BOjrmGLk.js.map → splash-screen-jfE47xl0.js.map} +1 -1
  269. package/dist/splash-screen.cjs +1 -1
  270. package/dist/splash-screen.js +1 -1
  271. package/dist/{src-C5g3p1J5.js → src-BP3h-9d9.js} +36 -35
  272. package/dist/{src-C5g3p1J5.js.map → src-BP3h-9d9.js.map} +1 -1
  273. package/dist/{src-qzUpLbje.cjs → src-Um_pzb-U.cjs} +1 -1
  274. package/dist/{src-qzUpLbje.cjs.map → src-Um_pzb-U.cjs.map} +1 -1
  275. package/dist/{state-Cex3rmx2.cjs → state-Bj0M9a6T.cjs} +1 -1
  276. package/dist/{state-Cex3rmx2.cjs.map → state-Bj0M9a6T.cjs.map} +1 -1
  277. package/dist/{state-CWBRTSvE.js → state-DscWQpoM.js} +1 -1
  278. package/dist/{state-CWBRTSvE.js.map → state-DscWQpoM.js.map} +1 -1
  279. package/dist/state.cjs +1 -1
  280. package/dist/state.js +2 -2
  281. package/dist/steps.cjs +35 -19
  282. package/dist/steps.cjs.map +1 -1
  283. package/dist/steps.js +96 -73
  284. package/dist/steps.js.map +1 -1
  285. package/dist/{surface-9S5scTsD.js → surface-B4Wn4SOO.js} +2 -2
  286. package/dist/{surface-9S5scTsD.js.map → surface-B4Wn4SOO.js.map} +1 -1
  287. package/dist/{surface-PfiejLuw.cjs → surface-DRq6cVW6.cjs} +1 -1
  288. package/dist/{surface-PfiejLuw.cjs.map → surface-DRq6cVW6.cjs.map} +1 -1
  289. package/dist/surface.cjs +1 -1
  290. package/dist/surface.js +1 -1
  291. package/dist/switch.cjs +1 -1
  292. package/dist/switch.js +2 -2
  293. package/dist/table.cjs +1 -1
  294. package/dist/table.js +2 -2
  295. package/dist/{tabs-uYvb1P06.cjs → tabs-Ca_fbHPW.cjs} +1 -1
  296. package/dist/{tabs-uYvb1P06.cjs.map → tabs-Ca_fbHPW.cjs.map} +1 -1
  297. package/dist/{tabs-BBOjAmgG.js → tabs-CnQPo-XS.js} +2 -2
  298. package/dist/{tabs-BBOjAmgG.js.map → tabs-CnQPo-XS.js.map} +1 -1
  299. package/dist/tabs.cjs +1 -1
  300. package/dist/tabs.js +1 -1
  301. package/dist/teleport.cjs +1 -1
  302. package/dist/teleport.js +1 -1
  303. package/dist/{textarea-QzSj8Dkl.js → textarea-BvqENhTW.js} +2 -2
  304. package/dist/{textarea-QzSj8Dkl.js.map → textarea-BvqENhTW.js.map} +1 -1
  305. package/dist/{textarea-YPHX4g7Y.cjs → textarea-qr7oL8oU.cjs} +1 -1
  306. package/dist/{textarea-YPHX4g7Y.cjs.map → textarea-qr7oL8oU.cjs.map} +1 -1
  307. package/dist/textarea.cjs +1 -1
  308. package/dist/textarea.js +1 -1
  309. package/dist/theme-BSwJ2YZo.cjs +181 -0
  310. package/dist/{theme-iKUaS9JB.cjs.map → theme-BSwJ2YZo.cjs.map} +1 -1
  311. package/dist/{theme-C2Mp-VGt.js → theme-BV0EzHQ1.js} +6 -5
  312. package/dist/{theme-C2Mp-VGt.js.map → theme-BV0EzHQ1.js.map} +1 -1
  313. package/dist/{theme-button-CJmhxfMe.cjs → theme-button-C6fpUzPM.cjs} +1 -1
  314. package/dist/{theme-button-CJmhxfMe.cjs.map → theme-button-C6fpUzPM.cjs.map} +1 -1
  315. package/dist/{theme-button-DGWAXhzd.js → theme-button-O_xNCgI7.js} +2 -2
  316. package/dist/{theme-button-DGWAXhzd.js.map → theme-button-O_xNCgI7.js.map} +1 -1
  317. package/dist/theme-button.cjs +1 -1
  318. package/dist/theme-button.js +1 -1
  319. package/dist/theme.cjs +1 -1
  320. package/dist/theme.js +3 -3
  321. package/dist/{theme.service-hc4N-1Oz.js → theme.service-DwLhhOmP.js} +1 -1
  322. package/dist/{theme.service-hc4N-1Oz.js.map → theme.service-DwLhhOmP.js.map} +1 -1
  323. package/dist/{theme.service-p61RsJBF.cjs → theme.service-kn9MC025.cjs} +1 -1
  324. package/dist/{theme.service-p61RsJBF.cjs.map → theme.service-kn9MC025.cjs.map} +1 -1
  325. package/dist/tree.cjs +1 -1
  326. package/dist/tree.js +2 -2
  327. package/dist/{typography-DwV0sqht.js → typography-Dtdooaic.js} +2 -2
  328. package/dist/{typography-DwV0sqht.js.map → typography-Dtdooaic.js.map} +1 -1
  329. package/dist/{typography-Bdt8RlX2.cjs → typography-opFYuUYS.cjs} +1 -1
  330. package/dist/{typography-Bdt8RlX2.cjs.map → typography-opFYuUYS.cjs.map} +1 -1
  331. package/dist/typography.cjs +1 -1
  332. package/dist/typography.js +1 -1
  333. package/dist/visually-hidden.cjs +1 -1
  334. package/dist/visually-hidden.js +2 -2
  335. package/dist/{window-D2WfvNng.cjs → window-BSAemI9J.cjs} +1 -1
  336. package/dist/{window-D2WfvNng.cjs.map → window-BSAemI9J.cjs.map} +1 -1
  337. package/dist/{window-n4jN60B_.js → window-ConcHirJ.js} +3 -3
  338. package/dist/{window-n4jN60B_.js.map → window-ConcHirJ.js.map} +1 -1
  339. package/dist/window.cjs +1 -1
  340. package/dist/window.js +1 -1
  341. package/package.json +1 -1
  342. package/skills/schmancy/INDEX.md +1 -1
  343. package/skills/schmancy/SKILL.md +20 -18
  344. package/skills/schmancy/boat.md +21 -15
  345. package/skills/schmancy/fab.md +75 -0
  346. package/skills/schmancy/steps.md +68 -34
  347. package/skills/schmancy/theme.md +1 -1
  348. package/src/CLAUDE.md +22 -16
  349. package/src/boat/boat.test.ts +130 -0
  350. package/src/boat/boat.ts +144 -121
  351. package/src/button/icon-button.ts +18 -30
  352. package/src/chips/assist-chip.ts +2 -263
  353. package/src/chips/chips.ts +2 -259
  354. package/src/chips/filter-chip.ts +2 -255
  355. package/src/chips/index.ts +2 -5
  356. package/src/chips/input-chip.ts +2 -413
  357. package/src/chips/suggestion-chip.ts +2 -266
  358. package/src/directives/fill.ts +28 -5
  359. package/src/directives/reveal.ts +192 -118
  360. package/src/fab/fab.test.ts +101 -0
  361. package/src/fab/fab.ts +226 -0
  362. package/src/fab/index.ts +1 -0
  363. package/src/form/fields/chips/assist-chip.ts +263 -0
  364. package/src/form/fields/chips/chips.ts +234 -0
  365. package/src/form/fields/chips/filter-chip.ts +255 -0
  366. package/src/form/fields/chips/index.ts +5 -0
  367. package/src/form/fields/chips/input-chip.ts +413 -0
  368. package/src/form/fields/chips/suggestion-chip.ts +266 -0
  369. package/src/form/fields/date-range/date-range.test.ts +44 -0
  370. package/src/form/fields/date-range/date-range.ts +103 -97
  371. package/src/form/fields/index.ts +1 -0
  372. package/src/index.ts +2 -1
  373. package/src/overlay/overlay.animations.ts +2 -3
  374. package/src/overlay/overlay.component.ts +8 -4
  375. package/src/overlay/overlay.types.ts +14 -2
  376. package/src/steps/index.ts +1 -1
  377. package/src/steps/schmancy-step.ts +91 -65
  378. package/src/steps/{schmancy-steps-container.ts → schmancy-steps.ts} +18 -38
  379. package/src/steps/steps.context.ts +5 -4
  380. package/src/steps/steps.test.ts +120 -0
  381. package/src/theme/theme.component.ts +1 -0
  382. package/src/theme/theme.style.css +3 -0
  383. package/types/src/boat/boat.d.ts +27 -9
  384. package/types/src/boat/boat.test.d.ts +2 -0
  385. package/types/src/button/icon-button.d.ts +3 -2
  386. package/types/src/chips/assist-chip.d.ts +1 -47
  387. package/types/src/chips/chips.d.ts +1 -43
  388. package/types/src/chips/filter-chip.d.ts +1 -67
  389. package/types/src/chips/index.d.ts +1 -5
  390. package/types/src/chips/input-chip.d.ts +1 -82
  391. package/types/src/chips/suggestion-chip.d.ts +1 -52
  392. package/types/src/directives/reveal.d.ts +15 -5
  393. package/types/src/fab/fab.d.ts +80 -0
  394. package/types/src/fab/fab.test.d.ts +2 -0
  395. package/types/src/fab/index.d.ts +1 -0
  396. package/types/src/form/fields/chips/assist-chip.d.ts +47 -0
  397. package/types/src/form/fields/chips/chips.d.ts +35 -0
  398. package/types/src/form/fields/chips/filter-chip.d.ts +67 -0
  399. package/types/src/form/fields/chips/index.d.ts +5 -0
  400. package/types/src/form/fields/chips/input-chip.d.ts +82 -0
  401. package/types/src/form/fields/chips/suggestion-chip.d.ts +52 -0
  402. package/types/src/form/fields/date-range/date-range.d.ts +5 -10
  403. package/types/src/form/fields/index.d.ts +1 -0
  404. package/types/src/index.d.ts +2 -1
  405. package/types/src/overlay/overlay.component.d.ts +1 -0
  406. package/types/src/overlay/overlay.types.d.ts +12 -2
  407. package/types/src/steps/index.d.ts +1 -1
  408. package/types/src/steps/schmancy-step.d.ts +8 -23
  409. package/types/src/steps/{schmancy-steps-container.d.ts → schmancy-steps.d.ts} +8 -9
  410. package/types/src/steps/steps.context.d.ts +2 -1
  411. package/types/src/steps/steps.test.d.ts +2 -0
  412. package/types/src/theme/theme.component.d.ts +1 -0
  413. package/dist/SchmancyElement-CA0Wqt8m.js +0 -284
  414. package/dist/SchmancyElement-CA0Wqt8m.js.map +0 -1
  415. package/dist/SchmancyElement-CYIif26I.cjs +0 -2
  416. package/dist/SchmancyElement-CYIif26I.cjs.map +0 -1
  417. package/dist/boat-Vqjgo10B.cjs +0 -33
  418. package/dist/boat-Vqjgo10B.cjs.map +0 -1
  419. package/dist/boat-lr7MPZ7H.js.map +0 -1
  420. package/dist/chips-CXZ4dJCK.cjs.map +0 -1
  421. package/dist/chips-Dg6Lk6BT.js.map +0 -1
  422. package/dist/date-range-BU6WX7d5.js.map +0 -1
  423. package/dist/date-range-C-_be3_E.cjs.map +0 -1
  424. package/dist/directives-fLwDj6b0.cjs.map +0 -1
  425. package/dist/directives-zi1Mm2er.js.map +0 -1
  426. package/dist/input-chip-57tgNXKT.cjs.map +0 -1
  427. package/dist/input-chip-C6Lq1927.js.map +0 -1
  428. package/dist/overlay-BpNhd74N.js.map +0 -1
  429. package/dist/overlay-UQR2Dy3u.cjs.map +0 -1
  430. package/dist/theme-iKUaS9JB.cjs +0 -181
@@ -68,6 +68,50 @@ describe('schmancy-date-range', () => {
68
68
  expect(form.checkValidity()).toBe(true)
69
69
  })
70
70
 
71
+ it('paints both validity surfaces when required, empty, and submitted', async () => {
72
+ host.innerHTML = `<form><schmancy-date-range name="w" required></schmancy-date-range></form>`
73
+ const form = host.querySelector('form') as HTMLFormElement
74
+ const dr = host.querySelector('schmancy-date-range') as HTMLElement & {
75
+ dateFrom: { label: string; value: string }
76
+ dateTo: { label: string; value: string }
77
+ markSubmitted(): void
78
+ checkValidity(): boolean
79
+ }
80
+ await nextUpdate()
81
+ await nextUpdate()
82
+ dr.dateFrom = { label: 'From', value: '' }
83
+ dr.dateTo = { label: 'To', value: '' }
84
+ await nextUpdate()
85
+
86
+ // Platform surface: the form blocks submit.
87
+ expect(form.checkValidity()).toBe(false)
88
+
89
+ // Rendered surface is gated until submit (validateOn default 'dirty').
90
+ dr.markSubmitted()
91
+ dr.checkValidity()
92
+ await nextUpdate()
93
+ await nextUpdate()
94
+
95
+ const root = (dr as unknown as { shadowRoot: ShadowRoot }).shadowRoot
96
+ const alert = root.querySelector('[role="alert"]')
97
+ expect(alert, 'a role=alert message must render').not.toBeNull()
98
+ expect(alert?.textContent?.trim()).toBe('Please select a date range.')
99
+ // Control itself carries a visible invalid treatment.
100
+ expect(
101
+ root.querySelector('section.outline-error-default'),
102
+ 'the control must carry an invalid treatment',
103
+ ).not.toBeNull()
104
+
105
+ // Filling the range clears both surfaces.
106
+ dr.dateFrom = { label: 'From', value: '2026-01-01' }
107
+ dr.dateTo = { label: 'To', value: '2026-01-31' }
108
+ await nextUpdate()
109
+ await nextUpdate()
110
+ expect(form.checkValidity()).toBe(true)
111
+ expect(root.querySelector('[role="alert"]')).toBeNull()
112
+ expect(root.querySelector('section.outline-error-default')).toBeNull()
113
+ })
114
+
71
115
  it('has no axe-core a11y violations', async () => {
72
116
  host.innerHTML = `<schmancy-date-range name="window"></schmancy-date-range>`
73
117
  await nextUpdate()
@@ -1,8 +1,8 @@
1
1
  import dayjs from 'dayjs'
2
2
  import quarterOfYear from 'dayjs/plugin/quarterOfYear'
3
- import { html, PropertyValues } from 'lit'
3
+ import { html, nothing, PropertyValues } from 'lit'
4
4
  import { customElement, property, state } from 'lit/decorators.js'
5
- import { fromEvent, Subscription, takeUntil, timer } from 'rxjs'
5
+ import { concat, exhaustMap, finalize, fromEvent, map, merge, of, Subject, switchMap, takeUntil, tap, timer } from 'rxjs'
6
6
  import { SchmancyFormField } from '@mixins/index'
7
7
  import { show } from '../../../overlay/overlay.service'
8
8
  import { detectDateRangeType, formatDateRange } from './date-range-helpers'
@@ -55,6 +55,12 @@ export class SchmancyDateRange extends SchmancyFormField() {
55
55
  /** When true, collapses to just an icon button on mobile screens */
56
56
  @property({ type: Boolean }) collapse = false
57
57
 
58
+ // Session inputs — driven by handlers, consumed by the single pipeline
59
+ // in connectedCallback (rxjs ONE_PIPELINE_ONE_SUBSCRIBE / SESSIONS).
60
+ private readonly open$ = new Subject<MouseEvent | undefined>()
61
+ private readonly close$ = new Subject<void>()
62
+ private readonly announce$ = new Subject<string>()
63
+
58
64
  // Internal states
59
65
  @state() private isOpen = false
60
66
  @state() private selectedDateRange: string = ''
@@ -95,17 +101,71 @@ export class SchmancyDateRange extends SchmancyFormField() {
95
101
  this.updateSelectedDateRange()
96
102
  }
97
103
 
98
- // Set up global event handlers using RxJS
99
- this.setupEventHandlers()
100
- }
101
-
102
- private setupEventHandlers() {
103
- // Handle keyboard navigation
104
- fromEvent<KeyboardEvent>(document, 'keydown')
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).
108
+ 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.
113
+ this.open$.pipe(
114
+ tap(() => {
115
+ this.dispatchEvent(new CustomEvent('beforeopen', { bubbles: true, composed: true }))
116
+ this.isOpen = true
117
+ }),
118
+ exhaustMap(anchor =>
119
+ show(
120
+ html`
121
+ <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)
141
+ }
142
+ dispatchClose(ev.currentTarget)
143
+ }}"
144
+ @announce="${(ev: CustomEvent) => this.announce$.next(ev.detail.message)}"
145
+ ></schmancy-date-range-dialog>
146
+ `,
147
+ { anchor },
148
+ ).pipe(
149
+ takeUntil(this.close$),
150
+ finalize(() => {
151
+ this.isOpen = false
152
+ }),
153
+ ),
154
+ ),
155
+ ),
156
+ // Announcements (rxjs LIFT_EVERY_ASYNC_SOURCE): one Subject, one
157
+ // switchMap-cleared timer — not a fresh timer().subscribe() per call.
158
+ this.announce$.pipe(
159
+ switchMap(message => concat(of(message), timer(100).pipe(map(() => '')))),
160
+ tap(message => {
161
+ this.announceMessage = message
162
+ }),
163
+ ),
164
+ // Document keyboard navigation.
165
+ fromEvent<KeyboardEvent>(document, 'keydown').pipe(tap(event => this.handleKeyboardNavigation(event))),
166
+ )
105
167
  .pipe(takeUntil(this.disconnecting))
106
- .subscribe(event => {
107
- this.handleKeyboardNavigation(event)
108
- })
168
+ .subscribe()
109
169
  }
110
170
 
111
171
  updated(changedProps: PropertyValues) {
@@ -182,23 +242,23 @@ export class SchmancyDateRange extends SchmancyFormField() {
182
242
  }
183
243
 
184
244
  /** `dirty` tracks the underlying date strings, not the wide-union value. */
185
- private _dateFromDefault: string = ''
186
- private _dateToDefault: string = ''
245
+ private dateFromDefault: string = ''
246
+ private dateToDefault: string = ''
187
247
  override firstUpdated(changed: PropertyValues): void {
188
248
  super.firstUpdated(changed)
189
- this._dateFromDefault = this.dateFrom?.value ?? ''
190
- this._dateToDefault = this.dateTo?.value ?? ''
249
+ this.dateFromDefault = this.dateFrom?.value ?? ''
250
+ this.dateToDefault = this.dateTo?.value ?? ''
191
251
  }
192
252
  override get dirty(): boolean {
193
253
  return (
194
- (this.dateFrom?.value ?? '') !== this._dateFromDefault ||
195
- (this.dateTo?.value ?? '') !== this._dateToDefault
254
+ (this.dateFrom?.value ?? '') !== this.dateFromDefault ||
255
+ (this.dateTo?.value ?? '') !== this.dateToDefault
196
256
  )
197
257
  }
198
258
 
199
259
  override resetForm(): void {
200
- this.dateFrom = { ...this.dateFrom, value: this._dateFromDefault }
201
- this.dateTo = { ...this.dateTo, value: this._dateToDefault }
260
+ this.dateFrom = { ...this.dateFrom, value: this.dateFromDefault }
261
+ this.dateTo = { ...this.dateTo, value: this.dateToDefault }
202
262
  super.resetForm()
203
263
  }
204
264
 
@@ -282,7 +342,7 @@ export class SchmancyDateRange extends SchmancyFormField() {
282
342
  this.updateSelectedDateRange()
283
343
 
284
344
  // Announce change to screen readers
285
- this.announceToScreenReader(`Date range updated: ${this.selectedDateRange}`)
345
+ this.announce$.next(`Date range updated: ${this.selectedDateRange}`)
286
346
 
287
347
  this.dispatchEvent(
288
348
  new CustomEvent<{ dateFrom: string; dateTo: string }>('change', {
@@ -296,72 +356,15 @@ export class SchmancyDateRange extends SchmancyFormField() {
296
356
  private toggleDropdown(e: MouseEvent) {
297
357
  e.stopPropagation()
298
358
  if (this.disabled || this.step !== undefined) return
299
-
359
+ // Drive the session pipeline (connectedCallback) — no imperative
360
+ // open/close, no manual subscription field.
300
361
  if (this.isOpen) {
301
- this.closeDropdown()
362
+ this.close$.next()
302
363
  } else {
303
- this.openDropdown(e)
364
+ this.open$.next(e)
304
365
  }
305
366
  }
306
367
 
307
- private _overlaySubscription: Subscription | null = null
308
-
309
- private openDropdown(e?: MouseEvent) {
310
- if (this.disabled || this.step !== undefined) return
311
-
312
- this.dispatchEvent(new CustomEvent('beforeopen', { bubbles: true, composed: true }))
313
- this.isOpen = true
314
-
315
- // Inline-template overlay. Inner handlers dispatch a 'close' event
316
- // from the dialog itself (via the module-scoped `dispatchClose`),
317
- // which `show()` translates into observable completion + an emission.
318
- // Layout (centered vs sheet) is chosen by the overlay system based on
319
- // viewport / anchor presence.
320
- const dialogContent = html`
321
- <schmancy-date-range-dialog
322
- .type="${this.type}"
323
- .dateFrom="${this.dateFrom}"
324
- .dateTo="${this.dateTo}"
325
- .minDate="${this.minDate}"
326
- .maxDate="${this.maxDate}"
327
- .activePreset="${this.activePreset}"
328
- .presetCategories="${this.presetCategories}"
329
- @preset-select="${(ev: CustomEvent) => {
330
- this.activePreset = ev.detail.preset.label
331
- this.setDateRange(ev.detail.preset.range.dateFrom, ev.detail.preset.range.dateTo)
332
- dispatchClose(ev.currentTarget)
333
- }}"
334
- @date-change="${() => this.updateSelectedDateRange()}"
335
- @apply-dates="${(ev: CustomEvent) => {
336
- const { dateFrom, dateTo, swapIfNeeded } = ev.detail
337
- if (swapIfNeeded) {
338
- this.setDateRange(dateTo, dateFrom)
339
- } else {
340
- this.setDateRange(dateFrom, dateTo)
341
- }
342
- dispatchClose(ev.currentTarget)
343
- }}"
344
- @announce="${(ev: CustomEvent) => this.announceToScreenReader(ev.detail.message)}"
345
- ></schmancy-date-range-dialog>
346
- `
347
-
348
- this._overlaySubscription?.unsubscribe()
349
- this._overlaySubscription = show(dialogContent, { anchor: e })
350
- .pipe(takeUntil(this.disconnecting))
351
- .subscribe({
352
- complete: () => {
353
- this.isOpen = false
354
- this._overlaySubscription = null
355
- },
356
- })
357
- }
358
-
359
- private closeDropdown() {
360
- this._overlaySubscription?.unsubscribe()
361
- this._overlaySubscription = null
362
- this.isOpen = false
363
- }
364
-
365
368
  /**
366
369
  * Shifts the date range based on the step property
367
370
  */
@@ -522,20 +525,15 @@ export class SchmancyDateRange extends SchmancyFormField() {
522
525
  return toDate.isBefore(maxDate)
523
526
  }
524
527
 
525
- /**
526
- * Announce messages to screen readers
527
- */
528
- private announceToScreenReader(message: string) {
529
- this.announceMessage = message
530
- // Clear the message after announcement
531
- timer(100)
532
- .pipe(takeUntil(this.disconnecting))
533
- .subscribe(() => {
534
- this.announceMessage = ''
535
- })
536
- }
537
528
 
538
529
  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
+ const showError = this.error && !!this.validationMessage
535
+ const errorRing = showError ? ' rounded outline outline-2 outline-error-default' : ''
536
+
539
537
  return html`
540
538
  <div class="relative ${this.disabled ? 'opacity-60 pointer-events-none' : ''}">
541
539
  <!-- Screen reader announcements -->
@@ -545,18 +543,22 @@ export class SchmancyDateRange extends SchmancyFormField() {
545
543
 
546
544
  <!-- Collapsed: icon-only on mobile when collapse=true -->
547
545
  <schmancy-icon-button
548
- class="${this.collapse ? 'lg:hidden' : 'hidden'}"
546
+ class="${this.collapse ? 'lg:hidden' : 'hidden'}${errorRing}"
549
547
  variant="outlined"
550
548
  type="button"
549
+ aria-invalid=${showError ? 'true' : 'false'}
551
550
  aria-label="Select date range. Current: ${this.selectedDateRange || 'No date selected'}"
552
551
  @click=${(e: MouseEvent) => this.toggleDropdown(e)}
553
552
  ?disabled=${this.disabled}
554
553
  >
555
- date_range
554
+ date_range
556
555
  </schmancy-icon-button>
557
556
 
558
557
  <!-- Full UI: always visible when collapse=false, or lg+ when collapse=true -->
559
- <section @click=${(event: Event) => event.stopPropagation()} class="${this.collapse ? 'hidden lg:flex' : 'flex'}">
558
+ <section
559
+ @click=${(event: Event) => event.stopPropagation()}
560
+ aria-invalid=${showError ? 'true' : 'false'}
561
+ class="${this.collapse ? 'hidden lg:flex' : 'flex'}${errorRing}">
560
562
  <schmancy-icon-button
561
563
  type="button"
562
564
  aria-label="Previous ${this.activePreset ? this.activePreset.toLowerCase() : 'date range'}"
@@ -590,6 +592,10 @@ export class SchmancyDateRange extends SchmancyFormField() {
590
592
  arrow_right
591
593
  </schmancy-icon-button>
592
594
  </section>
595
+
596
+ ${showError
597
+ ? html`<div role="alert" class="text-error-default text-sm mt-1">${this.validationMessage}</div>`
598
+ : nothing}
593
599
  </div>
594
600
  `
595
601
  }
@@ -1,5 +1,6 @@
1
1
  export * from './autocomplete'
2
2
  export * from './checkbox'
3
+ export * from './chips'
3
4
  export * from './date-range'
4
5
  export * from './input'
5
6
  export * from './radio-group'
package/src/index.ts CHANGED
@@ -7,7 +7,7 @@ export * from './busy';
7
7
  export * from './button';
8
8
  export * from './card';
9
9
  export * from './form/fields/checkbox';
10
- export * from './chips';
10
+ export * from './form/fields/chips';
11
11
  export * from './connectivity';
12
12
  export * from './content-drawer';
13
13
  export * from './form/fields/date-range';
@@ -19,6 +19,7 @@ export * from './discovery';
19
19
  export * from './divider';
20
20
  export * from './dropdown';
21
21
  export * from './expand';
22
+ export * from './fab';
22
23
  export * from './float';
23
24
  export * from './window';
24
25
  export * from './form';
@@ -1,7 +1,6 @@
1
1
  import {
2
2
  DURATION_EXIT,
3
3
  getEasing,
4
- SPRING_GENTLE,
5
4
  SPRING_SMOOTH,
6
5
  SPRING_SNAPPY,
7
6
  } from '../utils/animation'
@@ -162,8 +161,8 @@ export function surfaceAnimation(layout: OverlayLayout, direction: 'in' | 'out')
162
161
  { opacity: 1, transform: 'translateY(0)' },
163
162
  ],
164
163
  options: {
165
- duration: SPRING_GENTLE.duration,
166
- easing: getEasing(SPRING_GENTLE),
164
+ duration: SPRING_SNAPPY.duration,
165
+ easing: getEasing(SPRING_SNAPPY),
167
166
  fill: 'forwards',
168
167
  },
169
168
  }
@@ -119,6 +119,7 @@ export class SchmancyOverlay extends SchmancyElement {
119
119
  @property({ type: String, reflect: true }) tier: OverlayTier = 'modal'
120
120
 
121
121
  @state() private _active = false
122
+ @state() private _full = false
122
123
 
123
124
  @query('.backdrop') private _backdrop?: HTMLDivElement
124
125
  @query('.surface') private _surface!: HTMLElement
@@ -152,6 +153,7 @@ export class SchmancyOverlay extends SchmancyElement {
152
153
  this._mounted = true
153
154
 
154
155
  this.dismissable = options.dismissable !== false
156
+ this._full = options.full ?? false
155
157
  this._rawAnchor = options.anchor
156
158
  this._anchorOriginAnchor = options.anchor
157
159
  this._resolvedAnchor = resolveAnchorRef(options.anchor)
@@ -278,13 +280,15 @@ export class SchmancyOverlay extends SchmancyElement {
278
280
  protected render(): TemplateResult {
279
281
  if (!this._active) return html``
280
282
  const baseClasses =
281
- 'surface fixed pointer-events-auto overflow-auto ' +
283
+ 'surface fixed pointer-events-auto ' +
282
284
  'bg-surface-container/85 text-surface-on backdrop-blur-md ' +
283
285
  'border border-surface-on/8'
284
286
  const layoutClasses =
285
287
  this.layout === 'sheet'
286
- ? 'left-0 right-0 bottom-0 w-full max-h-[90dvh] rounded-t-[28px] shadow-overlay'
287
- : 'max-w-[min(480px,calc(100vw-2rem))] max-h-[90dvh] rounded-3xl shadow-overlay-anchored'
288
+ ? this._full
289
+ ? 'left-0 right-0 bottom-0 w-full h-[90dvh] rounded-t-[28px] shadow-overlay flex flex-col overflow-hidden'
290
+ : 'left-0 right-0 bottom-0 w-full max-h-[90dvh] rounded-t-[28px] shadow-overlay overflow-auto'
291
+ : 'max-w-[min(480px,calc(100vw-2rem))] max-h-[90dvh] rounded-3xl shadow-overlay-anchored overflow-auto'
288
292
  return html`
289
293
  <div class="shell fixed inset-0 pointer-events-none" part="shell">
290
294
  ${when(
@@ -300,7 +304,7 @@ export class SchmancyOverlay extends SchmancyElement {
300
304
  aria-modal=${this.modal ? 'true' : 'false'}
301
305
  tabindex="-1"
302
306
  >
303
- <div id=${MOUNT_POINT_ID}></div>
307
+ <div id=${MOUNT_POINT_ID} class=${this.layout === 'sheet' && this._full ? 'flex-1 min-h-0 overflow-hidden' : ''}></div>
304
308
  </section>
305
309
  </div>
306
310
  `
@@ -1,7 +1,6 @@
1
1
  import type { TemplateResult } from 'lit'
2
2
  import type { Observable } from 'rxjs'
3
- import type { ComponentType } from '../area/router.types'
4
- import type { THistoryStrategy } from '../area/router.types'
3
+ import type { ComponentType, THistoryStrategy } from '../area/router.types'
5
4
 
6
5
  /**
7
6
  * Sync factory that returns a TemplateResult. Called at mount time so closed-over
@@ -103,6 +102,19 @@ export interface ShowOptions {
103
102
  * takeover view that doesn't have an anchor. */
104
103
  as?: OverlayLayout
105
104
 
105
+ /** When `true` and layout resolves to `'sheet'`, the surface takes the
106
+ * full available height (`h-[90dvh]`) instead of sizing to content.
107
+ * The mount point becomes `flex-1 min-h-0 overflow-hidden` so the
108
+ * mounted component can fill it via `height: 100%`. Default `false`. */
109
+ full?: boolean
110
+
111
+ /** When `true` and layout is `'sheet'`, the surface takes the full
112
+ * available height (`h-[90dvh]`) rather than sizing to content. The
113
+ * mount point becomes `flex-1` so the mounted component can fill it
114
+ * via `height: 100%`. Use for immersive full-height panels (e.g. a
115
+ * document review). Default `false`. */
116
+ fillHeight?: boolean
117
+
106
118
  /** Default `'push'`. Same vocabulary as `area.push()`.
107
119
  * - `'push'` — new history entry; back dismisses, forward re-opens.
108
120
  * - `'replace'` — replace current entry; back skips the overlay.
@@ -1,3 +1,3 @@
1
1
  export * from './schmancy-step';
2
- export * from './schmancy-steps-container';
2
+ export * from './schmancy-steps';
3
3
  export * from './steps.context';