@mhmo91/schmancy 0.10.19 → 0.10.21

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 (371) hide show
  1. package/custom-elements.json +0 -62
  2. package/dist/agent/{overlay.confirm-body-D3jQyXgA.js → overlay.confirm-body-DXus8d-w.js} +1 -1
  3. package/dist/agent/{overlay.confirm-body-D3jQyXgA.js.map → overlay.confirm-body-DXus8d-w.js.map} +1 -1
  4. package/dist/agent/schmancy.agent.js +2043 -2083
  5. package/dist/agent/schmancy.agent.js.map +1 -1
  6. package/dist/agent/schmancy.manifest.json +1 -48
  7. package/dist/area-Cbkt0NX4.cjs +21 -0
  8. package/dist/area-Cbkt0NX4.cjs.map +1 -0
  9. package/dist/{area-BIipuSyO.js → area-Ddk7P5wD.js} +101 -131
  10. package/dist/area-Ddk7P5wD.js.map +1 -0
  11. package/dist/area.cjs +1 -1
  12. package/dist/area.js +1 -1
  13. package/dist/{autocomplete-B8CE5vGw.cjs → autocomplete-CfBFDSc3.cjs} +1 -1
  14. package/dist/{autocomplete-B8CE5vGw.cjs.map → autocomplete-CfBFDSc3.cjs.map} +1 -1
  15. package/dist/{autocomplete-Mrb3koUN.js → autocomplete-Ds3Q2cwR.js} +2 -2
  16. package/dist/{autocomplete-Mrb3koUN.js.map → autocomplete-Ds3Q2cwR.js.map} +1 -1
  17. package/dist/autocomplete.cjs +1 -1
  18. package/dist/autocomplete.js +1 -1
  19. package/dist/avatar.cjs +1 -1
  20. package/dist/avatar.js +1 -1
  21. package/dist/badge.cjs +1 -1
  22. package/dist/badge.js +1 -1
  23. package/dist/{boat-CNWIQPA1.js → boat-BF5P6p_f.js} +1 -1
  24. package/dist/{boat-CNWIQPA1.js.map → boat-BF5P6p_f.js.map} +1 -1
  25. package/dist/{boat-OatK_MGh.cjs → boat-BPN8HLzZ.cjs} +1 -1
  26. package/dist/{boat-OatK_MGh.cjs.map → boat-BPN8HLzZ.cjs.map} +1 -1
  27. package/dist/boat.cjs +1 -1
  28. package/dist/boat.js +1 -1
  29. package/dist/breadcrumb.cjs +1 -1
  30. package/dist/breadcrumb.js +1 -1
  31. package/dist/{busy-Cetzws-m.js → busy-BuACDJy6.js} +1 -1
  32. package/dist/{busy-Cetzws-m.js.map → busy-BuACDJy6.js.map} +1 -1
  33. package/dist/{busy-CMKX4oQf.cjs → busy-C7ejPa-Q.cjs} +1 -1
  34. package/dist/{busy-CMKX4oQf.cjs.map → busy-C7ejPa-Q.cjs.map} +1 -1
  35. package/dist/busy.cjs +1 -1
  36. package/dist/busy.js +1 -1
  37. package/dist/button.cjs +15 -9
  38. package/dist/button.cjs.map +1 -1
  39. package/dist/button.js +15 -9
  40. package/dist/button.js.map +1 -1
  41. package/dist/{card-8VXoo2C_.cjs → card-BIzaLuEg.cjs} +1 -1
  42. package/dist/{card-8VXoo2C_.cjs.map → card-BIzaLuEg.cjs.map} +1 -1
  43. package/dist/{card-D2k3dRL0.js → card-CgQwXO8L.js} +1 -1
  44. package/dist/{card-D2k3dRL0.js.map → card-CgQwXO8L.js.map} +1 -1
  45. package/dist/card.cjs +1 -1
  46. package/dist/card.js +1 -1
  47. package/dist/{checkbox-Cq5wzeaY.cjs → checkbox-BAqE3sTx.cjs} +1 -1
  48. package/dist/{checkbox-Cq5wzeaY.cjs.map → checkbox-BAqE3sTx.cjs.map} +1 -1
  49. package/dist/{checkbox-8hNsBejz.js → checkbox-BNdg57Om.js} +1 -1
  50. package/dist/{checkbox-8hNsBejz.js.map → checkbox-BNdg57Om.js.map} +1 -1
  51. package/dist/checkbox.cjs +1 -1
  52. package/dist/checkbox.js +1 -1
  53. package/dist/{chips-Dx_WvOGk.cjs → chips-DS3y4Lbn.cjs} +2 -4
  54. package/dist/chips-DS3y4Lbn.cjs.map +1 -0
  55. package/dist/{chips-D1kJrbzo.js → chips-DnqLaOb1.js} +3 -5
  56. package/dist/chips-DnqLaOb1.js.map +1 -0
  57. package/dist/chips.cjs +1 -1
  58. package/dist/chips.js +2 -2
  59. package/dist/connectivity.cjs +1 -1
  60. package/dist/connectivity.js +1 -1
  61. package/dist/content-drawer.cjs +1 -1
  62. package/dist/content-drawer.js +1 -1
  63. package/dist/{date-range-H903Vt_r.cjs → date-range-CsJfjbmi.cjs} +1 -1
  64. package/dist/{date-range-H903Vt_r.cjs.map → date-range-CsJfjbmi.cjs.map} +1 -1
  65. package/dist/{date-range-Dv-DM6mB.js → date-range-aPSmSBhk.js} +2 -2
  66. package/dist/{date-range-Dv-DM6mB.js.map → date-range-aPSmSBhk.js.map} +1 -1
  67. package/dist/{date-range-inline-Bvs2ZvEY.cjs → date-range-inline-CAa0_4EI.cjs} +1 -1
  68. package/dist/{date-range-inline-Bvs2ZvEY.cjs.map → date-range-inline-CAa0_4EI.cjs.map} +1 -1
  69. package/dist/{date-range-inline-TWWnTZlw.js → date-range-inline-PeRt1iIF.js} +1 -1
  70. package/dist/{date-range-inline-TWWnTZlw.js.map → date-range-inline-PeRt1iIF.js.map} +1 -1
  71. package/dist/date-range-inline.cjs +1 -1
  72. package/dist/date-range-inline.js +1 -1
  73. package/dist/date-range.cjs +1 -1
  74. package/dist/date-range.js +1 -1
  75. package/dist/delay.cjs +1 -1
  76. package/dist/delay.js +1 -1
  77. package/dist/{details-CwSDur6j.cjs → details-BnXbDpt7.cjs} +2 -2
  78. package/dist/details-BnXbDpt7.cjs.map +1 -0
  79. package/dist/{details-Cpg8sH2F.js → details-BpFjVclg.js} +2 -2
  80. package/dist/details-BpFjVclg.js.map +1 -0
  81. package/dist/details.cjs +1 -1
  82. package/dist/details.js +1 -1
  83. package/dist/directives.cjs +3 -3
  84. package/dist/directives.cjs.map +1 -1
  85. package/dist/directives.js +290 -203
  86. package/dist/directives.js.map +1 -1
  87. package/dist/{divider-BNdVLE0H.cjs → divider-B84lt1A3.cjs} +1 -1
  88. package/dist/{divider-BNdVLE0H.cjs.map → divider-B84lt1A3.cjs.map} +1 -1
  89. package/dist/{divider-Be833gGZ.js → divider-D8cBBkdG.js} +1 -1
  90. package/dist/{divider-Be833gGZ.js.map → divider-D8cBBkdG.js.map} +1 -1
  91. package/dist/divider.cjs +1 -1
  92. package/dist/divider.js +1 -1
  93. package/dist/dropdown.cjs +1 -1
  94. package/dist/dropdown.js +1 -1
  95. package/dist/{expand-CtoffNNj.js → expand-BJiKggfg.js} +2 -2
  96. package/dist/{expand-CtoffNNj.js.map → expand-BJiKggfg.js.map} +1 -1
  97. package/dist/{expand-BP6RLzHw.cjs → expand-DK-O37-j.cjs} +1 -1
  98. package/dist/{expand-BP6RLzHw.cjs.map → expand-DK-O37-j.cjs.map} +1 -1
  99. package/dist/expand.cjs +1 -1
  100. package/dist/expand.js +1 -1
  101. package/dist/{float-KmbhaQHA.js → float-B4FDN40h.js} +1 -1
  102. package/dist/{float-KmbhaQHA.js.map → float-B4FDN40h.js.map} +1 -1
  103. package/dist/{float-CfbQM_2v.cjs → float-RWR6Q1Hh.cjs} +1 -1
  104. package/dist/{float-CfbQM_2v.cjs.map → float-RWR6Q1Hh.cjs.map} +1 -1
  105. package/dist/float.cjs +1 -1
  106. package/dist/float.js +1 -1
  107. package/dist/{form-8IcmP8uV.js → form-Bz5WamuM.js} +8 -8
  108. package/dist/{form-8IcmP8uV.js.map → form-Bz5WamuM.js.map} +1 -1
  109. package/dist/{form-CuBIrKOA.cjs → form-PioZDvzA.cjs} +1 -1
  110. package/dist/{form-CuBIrKOA.cjs.map → form-PioZDvzA.cjs.map} +1 -1
  111. package/dist/form.cjs +1 -1
  112. package/dist/form.js +6 -6
  113. package/dist/handover/agent-runtime-followups.md +1 -1
  114. package/dist/handover/agent-runtime-v1.md +3 -3
  115. package/dist/{icons-D7df1ysG.js → icons-BgUbHwy8.js} +1 -1
  116. package/dist/{icons-D7df1ysG.js.map → icons-BgUbHwy8.js.map} +1 -1
  117. package/dist/{icons-BJld4JHp.cjs → icons-morK4hHz.cjs} +1 -1
  118. package/dist/{icons-BJld4JHp.cjs.map → icons-morK4hHz.cjs.map} +1 -1
  119. package/dist/icons.cjs +1 -1
  120. package/dist/icons.js +1 -1
  121. package/dist/{iframe-GT6D8l5Z.cjs → iframe-BXe1TPx1.cjs} +1 -1
  122. package/dist/{iframe-GT6D8l5Z.cjs.map → iframe-BXe1TPx1.cjs.map} +1 -1
  123. package/dist/{iframe-DAbgW9tT.js → iframe-CByrVlZy.js} +1 -1
  124. package/dist/{iframe-DAbgW9tT.js.map → iframe-CByrVlZy.js.map} +1 -1
  125. package/dist/iframe.cjs +1 -1
  126. package/dist/iframe.js +1 -1
  127. package/dist/index.cjs +1 -1
  128. package/dist/index.js +55 -56
  129. package/dist/{input-BE9wEEw4.cjs → input-BY9OCQWr.cjs} +1 -1
  130. package/dist/{input-BE9wEEw4.cjs.map → input-BY9OCQWr.cjs.map} +1 -1
  131. package/dist/{input-DC6ap_uN.js → input-Q0fm34Co.js} +2 -2
  132. package/dist/{input-DC6ap_uN.js.map → input-Q0fm34Co.js.map} +1 -1
  133. package/dist/{input-chip-MsiMu-b5.cjs → input-chip-BwNf3GD0.cjs} +1 -1
  134. package/dist/{input-chip-MsiMu-b5.cjs.map → input-chip-BwNf3GD0.cjs.map} +1 -1
  135. package/dist/{input-chip-c5n547tg.js → input-chip-CytUirVS.js} +1 -1
  136. package/dist/{input-chip-c5n547tg.js.map → input-chip-CytUirVS.js.map} +1 -1
  137. package/dist/input.cjs +1 -1
  138. package/dist/input.js +1 -1
  139. package/dist/json.cjs +1 -1
  140. package/dist/json.js +2 -2
  141. package/dist/kbd.cjs +1 -1
  142. package/dist/kbd.js +1 -1
  143. package/dist/layout.cjs +26 -1
  144. package/dist/layout.cjs.map +1 -0
  145. package/dist/layout.js +115 -2
  146. package/dist/layout.js.map +1 -0
  147. package/dist/{lightbox-CNX9Eg3U.js → lightbox-Ckvn5YNF.js} +1 -1
  148. package/dist/{lightbox-CNX9Eg3U.js.map → lightbox-Ckvn5YNF.js.map} +1 -1
  149. package/dist/{lightbox-HqJBBjAT.cjs → lightbox-p2E0oVR0.cjs} +1 -1
  150. package/dist/{lightbox-HqJBBjAT.cjs.map → lightbox-p2E0oVR0.cjs.map} +1 -1
  151. package/dist/lightbox.cjs +1 -1
  152. package/dist/lightbox.js +1 -1
  153. package/dist/{list-C76Pb-c1.js → list-CsrPVvmm.js} +1 -1
  154. package/dist/{list-C76Pb-c1.js.map → list-CsrPVvmm.js.map} +1 -1
  155. package/dist/{list-bhyuQSyO.cjs → list-r57UFHu3.cjs} +1 -1
  156. package/dist/{list-bhyuQSyO.cjs.map → list-r57UFHu3.cjs.map} +1 -1
  157. package/dist/list.cjs +1 -1
  158. package/dist/list.js +1 -1
  159. package/dist/{menu-BqKQ-s0C.cjs → menu-BOZ2iwed.cjs} +1 -1
  160. package/dist/{menu-BqKQ-s0C.cjs.map → menu-BOZ2iwed.cjs.map} +1 -1
  161. package/dist/{menu-C5ksITpG.js → menu-CxE16xur.js} +2 -2
  162. package/dist/{menu-C5ksITpG.js.map → menu-CxE16xur.js.map} +1 -1
  163. package/dist/menu.cjs +1 -1
  164. package/dist/menu.js +1 -1
  165. package/dist/mixins-DTCHPEd4.cjs +254 -0
  166. package/dist/{mixins-Du9HMrIG.cjs.map → mixins-DTCHPEd4.cjs.map} +1 -1
  167. package/dist/mixins-pU53qf6R.js +636 -0
  168. package/dist/{mixins-DCVXqL1Q.js.map → mixins-pU53qf6R.js.map} +1 -1
  169. package/dist/mixins.cjs +1 -1
  170. package/dist/mixins.js +1 -1
  171. package/dist/nav-drawer.cjs +1 -1
  172. package/dist/nav-drawer.js +1 -1
  173. package/dist/navigation-bar.cjs +1 -1
  174. package/dist/navigation-bar.js +1 -1
  175. package/dist/navigation-rail.cjs +1 -1
  176. package/dist/navigation-rail.js +1 -1
  177. package/dist/{notification-DR3gvWt8.cjs → notification-58tkVys8.cjs} +1 -1
  178. package/dist/{notification-DR3gvWt8.cjs.map → notification-58tkVys8.cjs.map} +1 -1
  179. package/dist/{notification-eZxtr3NN.js → notification-CgTBiAdf.js} +2 -2
  180. package/dist/{notification-eZxtr3NN.js.map → notification-CgTBiAdf.js.map} +1 -1
  181. package/dist/notification.cjs +1 -1
  182. package/dist/notification.js +1 -1
  183. package/dist/{option-BDOKUqTy.cjs → option-61YE3gub.cjs} +1 -1
  184. package/dist/{option-BDOKUqTy.cjs.map → option-61YE3gub.cjs.map} +1 -1
  185. package/dist/{option-CBEHYG4U.js → option-Bicf6xpI.js} +1 -1
  186. package/dist/{option-CBEHYG4U.js.map → option-Bicf6xpI.js.map} +1 -1
  187. package/dist/option.cjs +1 -1
  188. package/dist/option.js +1 -1
  189. package/dist/{overlay-DG6EeyKt.cjs → overlay-B3gKPWhu.cjs} +2 -2
  190. package/dist/overlay-B3gKPWhu.cjs.map +1 -0
  191. package/dist/{overlay-oxM9OLXP.js → overlay-D3mdWOLS.js} +12 -11
  192. package/dist/overlay-D3mdWOLS.js.map +1 -0
  193. package/dist/overlay.cjs +1 -1
  194. package/dist/{overlay.confirm-body-D_P2e7l6.js → overlay.confirm-body-Czi6cMZq.js} +1 -1
  195. package/dist/{overlay.confirm-body-D_P2e7l6.js.map → overlay.confirm-body-Czi6cMZq.js.map} +1 -1
  196. package/dist/{overlay.confirm-body-78e1WrN9.cjs → overlay.confirm-body-yr0HzS_d.cjs} +1 -1
  197. package/dist/{overlay.confirm-body-78e1WrN9.cjs.map → overlay.confirm-body-yr0HzS_d.cjs.map} +1 -1
  198. package/dist/overlay.js +3 -3
  199. package/dist/{overlay.service-C8NwO4Bx.js → overlay.service-BfZf3xoD.js} +2 -2
  200. package/dist/{overlay.service-C8NwO4Bx.js.map → overlay.service-BfZf3xoD.js.map} +1 -1
  201. package/dist/{overlay.service-DQkGPUY7.cjs → overlay.service-DNs3AWqp.cjs} +1 -1
  202. package/dist/{overlay.service-DQkGPUY7.cjs.map → overlay.service-DNs3AWqp.cjs.map} +1 -1
  203. package/dist/{progress-CMSst_2U.cjs → progress-D8XZJVl5.cjs} +1 -1
  204. package/dist/{progress-CMSst_2U.cjs.map → progress-D8XZJVl5.cjs.map} +1 -1
  205. package/dist/{progress-C4kDZfb7.js → progress-Zqx-S9NZ.js} +1 -1
  206. package/dist/{progress-C4kDZfb7.js.map → progress-Zqx-S9NZ.js.map} +1 -1
  207. package/dist/progress.cjs +1 -1
  208. package/dist/progress.js +1 -1
  209. package/dist/radio-group-D9MU1Mxz.js +71 -0
  210. package/dist/radio-group-D9MU1Mxz.js.map +1 -0
  211. package/dist/radio-group-bl8K4Gls.cjs +19 -0
  212. package/dist/radio-group-bl8K4Gls.cjs.map +1 -0
  213. package/dist/radio-group.cjs +1 -1
  214. package/dist/radio-group.js +1 -1
  215. package/dist/range.cjs +1 -1
  216. package/dist/range.js +1 -1
  217. package/dist/{rxjs-utils-Cs6XGwF6.js.map → rxjs-utils-BK8VMe3K.js.map} +1 -1
  218. package/dist/{rxjs-utils-Dsj75cJy.cjs.map → rxjs-utils-DhOKenkS.cjs.map} +1 -1
  219. package/dist/rxjs-utils.cjs +1 -1
  220. package/dist/rxjs-utils.js +1 -1
  221. package/dist/{select-UU2pB67h.js → select-CMwkl-D6.js} +3 -3
  222. package/dist/select-CMwkl-D6.js.map +1 -0
  223. package/dist/select-COIfVtZl.cjs +56 -0
  224. package/dist/select-COIfVtZl.cjs.map +1 -0
  225. package/dist/select.cjs +1 -1
  226. package/dist/select.js +1 -1
  227. package/dist/skeleton.cjs +1 -1
  228. package/dist/skeleton.js +1 -1
  229. package/dist/skills/SKILL.md +18 -2
  230. package/dist/skills/area.md +13 -0
  231. package/dist/skills/overlay.md +13 -0
  232. package/dist/skills/page.md +71 -29
  233. package/dist/skills/schmancy/SKILL.md +18 -2
  234. package/dist/skills/schmancy/area.md +13 -0
  235. package/dist/skills/schmancy/overlay.md +13 -0
  236. package/dist/skills/schmancy/page.md +71 -29
  237. package/dist/slider.cjs +1 -1
  238. package/dist/slider.js +1 -1
  239. package/dist/{splash-screen-BvaDkvJU.cjs → splash-screen-2hxq8Sft.cjs} +1 -1
  240. package/dist/{splash-screen-BvaDkvJU.cjs.map → splash-screen-2hxq8Sft.cjs.map} +1 -1
  241. package/dist/{splash-screen-ChMkAPLU.js → splash-screen-xrMNpzkm.js} +1 -1
  242. package/dist/{splash-screen-ChMkAPLU.js.map → splash-screen-xrMNpzkm.js.map} +1 -1
  243. package/dist/splash-screen.cjs +1 -1
  244. package/dist/splash-screen.js +1 -1
  245. package/dist/{src-DnunCC4X.js → src-CHd-U-w4.js} +34 -35
  246. package/dist/{src-DnunCC4X.js.map → src-CHd-U-w4.js.map} +1 -1
  247. package/dist/{src-BIlD63Cz.cjs → src-ggWtvpDr.cjs} +1 -1
  248. package/dist/{src-BIlD63Cz.cjs.map → src-ggWtvpDr.cjs.map} +1 -1
  249. package/dist/steps.cjs +1 -1
  250. package/dist/steps.js +1 -1
  251. package/dist/{surface-DCRy-EyT.js → surface-3nnvlxeE.js} +1 -1
  252. package/dist/{surface-DCRy-EyT.js.map → surface-3nnvlxeE.js.map} +1 -1
  253. package/dist/{surface-DWwQDX9r.cjs → surface-BkQ44Wuo.cjs} +1 -1
  254. package/dist/{surface-DWwQDX9r.cjs.map → surface-BkQ44Wuo.cjs.map} +1 -1
  255. package/dist/surface.cjs +1 -1
  256. package/dist/surface.js +1 -1
  257. package/dist/switch.cjs +1 -1
  258. package/dist/switch.js +1 -1
  259. package/dist/table.cjs +1 -1
  260. package/dist/table.js +1 -1
  261. package/dist/{tabs-CkDNLbiS.js → tabs-CnLIe8nE.js} +1 -1
  262. package/dist/{tabs-CkDNLbiS.js.map → tabs-CnLIe8nE.js.map} +1 -1
  263. package/dist/{tabs-lxQHWEb7.cjs → tabs-Dql0rcqZ.cjs} +1 -1
  264. package/dist/{tabs-lxQHWEb7.cjs.map → tabs-Dql0rcqZ.cjs.map} +1 -1
  265. package/dist/tabs.cjs +1 -1
  266. package/dist/tabs.js +1 -1
  267. package/dist/teleport.cjs +1 -1
  268. package/dist/teleport.js +1 -1
  269. package/dist/{textarea-DkfGmRSI.js → textarea-BAogS_Ff.js} +1 -1
  270. package/dist/{textarea-DkfGmRSI.js.map → textarea-BAogS_Ff.js.map} +1 -1
  271. package/dist/{textarea-CNa4dSvF.cjs → textarea-CGD6lAEe.cjs} +1 -1
  272. package/dist/{textarea-CNa4dSvF.cjs.map → textarea-CGD6lAEe.cjs.map} +1 -1
  273. package/dist/textarea.cjs +1 -1
  274. package/dist/textarea.js +1 -1
  275. package/dist/{theme-CNWRYdfn.js → theme-CUK0HrS3.js} +1 -1
  276. package/dist/{theme-CNWRYdfn.js.map → theme-CUK0HrS3.js.map} +1 -1
  277. package/dist/{theme-CMyXTDht.cjs → theme-DKrrQ-ic.cjs} +1 -1
  278. package/dist/{theme-CMyXTDht.cjs.map → theme-DKrrQ-ic.cjs.map} +1 -1
  279. package/dist/{theme-button-CixloLin.js → theme-button-Bb8qW2IH.js} +1 -1
  280. package/dist/{theme-button-CixloLin.js.map → theme-button-Bb8qW2IH.js.map} +1 -1
  281. package/dist/{theme-button-kMhsX5Oe.cjs → theme-button-CmTwFm3l.cjs} +1 -1
  282. package/dist/{theme-button-kMhsX5Oe.cjs.map → theme-button-CmTwFm3l.cjs.map} +1 -1
  283. package/dist/theme-button.cjs +1 -1
  284. package/dist/theme-button.js +1 -1
  285. package/dist/theme.cjs +1 -1
  286. package/dist/theme.js +2 -2
  287. package/dist/tree.cjs +1 -1
  288. package/dist/tree.js +1 -1
  289. package/dist/typography.cjs +1 -1
  290. package/dist/typography.js +1 -1
  291. package/dist/{utils-DXE5fBBd.js.map → utils-Cxg0Kfy5.js.map} +1 -1
  292. package/dist/{utils-C-Q8ePtG.cjs.map → utils-aCJYAGUr.cjs.map} +1 -1
  293. package/dist/utils.cjs +1 -1
  294. package/dist/utils.js +1 -1
  295. package/dist/visually-hidden.cjs +1 -1
  296. package/dist/visually-hidden.js +1 -1
  297. package/dist/{window-qaGFMn_4.cjs → window-BbWlaPZv.cjs} +1 -1
  298. package/dist/{window-qaGFMn_4.cjs.map → window-BbWlaPZv.cjs.map} +1 -1
  299. package/dist/{window-BcvDNi9D.js → window-DuDAQa6y.js} +1 -1
  300. package/dist/{window-BcvDNi9D.js.map → window-DuDAQa6y.js.map} +1 -1
  301. package/dist/window.cjs +1 -1
  302. package/dist/window.js +1 -1
  303. package/package.json +1 -1
  304. package/skills/schmancy/SKILL.md +18 -2
  305. package/skills/schmancy/area.md +13 -0
  306. package/skills/schmancy/overlay.md +13 -0
  307. package/skills/schmancy/page.md +71 -29
  308. package/src/CLAUDE.md +20 -0
  309. package/src/area/area.component.ts +168 -343
  310. package/src/button/button.ts +8 -5
  311. package/src/button/icon-button.ts +8 -5
  312. package/src/chips/filter-chip.ts +1 -3
  313. package/src/details/details.ts +1 -1
  314. package/src/directives/fill.ts +137 -0
  315. package/src/directives/index.ts +2 -0
  316. package/src/directives/overflow-within.ts +186 -0
  317. package/src/form/fields/radio-group/radio-button.ts +22 -44
  318. package/src/form/fields/radio-group/radio-group.ts +20 -75
  319. package/src/form/fields/select/select.ts +3 -2
  320. package/src/index.ts +0 -1
  321. package/src/overlay/index.ts +1 -0
  322. package/src/overlay/overlay.component.ts +38 -39
  323. package/src/overlay/overlay.positioning.ts +10 -2
  324. package/src/overlay/overlay.types.ts +10 -3
  325. package/src/state/schmancy-state.html +897 -0
  326. package/src/state/schmancy-state.md +981 -0
  327. package/types/src/area/area.component.d.ts +0 -15
  328. package/types/src/button/icon-button.d.ts +1 -1
  329. package/types/src/directives/fill.d.ts +46 -0
  330. package/types/src/directives/index.d.ts +2 -0
  331. package/types/src/directives/overflow-within.d.ts +77 -0
  332. package/types/src/form/fields/radio-group/radio-button.d.ts +2 -5
  333. package/types/src/form/fields/radio-group/radio-group.d.ts +2 -10
  334. package/types/src/index.d.ts +0 -1
  335. package/types/src/overlay/index.d.ts +1 -1
  336. package/types/src/overlay/overlay.positioning.d.ts +9 -1
  337. package/types/src/overlay/overlay.types.d.ts +9 -3
  338. package/dist/area-BIipuSyO.js.map +0 -1
  339. package/dist/area-C-EMiNEE.cjs +0 -12
  340. package/dist/area-C-EMiNEE.cjs.map +0 -1
  341. package/dist/chips-D1kJrbzo.js.map +0 -1
  342. package/dist/chips-Dx_WvOGk.cjs.map +0 -1
  343. package/dist/details-Cpg8sH2F.js.map +0 -1
  344. package/dist/details-CwSDur6j.cjs.map +0 -1
  345. package/dist/mixins-DCVXqL1Q.js +0 -636
  346. package/dist/mixins-Du9HMrIG.cjs +0 -254
  347. package/dist/overlay-DG6EeyKt.cjs.map +0 -1
  348. package/dist/overlay-oxM9OLXP.js.map +0 -1
  349. package/dist/page.cjs +0 -20
  350. package/dist/page.cjs.map +0 -1
  351. package/dist/page.js +0 -74
  352. package/dist/page.js.map +0 -1
  353. package/dist/radio-group-DB9D2ZkA.js +0 -108
  354. package/dist/radio-group-DB9D2ZkA.js.map +0 -1
  355. package/dist/radio-group-dVUvYFq7.cjs +0 -40
  356. package/dist/radio-group-dVUvYFq7.cjs.map +0 -1
  357. package/dist/scroll-C1klVgSQ.js +0 -115
  358. package/dist/scroll-C1klVgSQ.js.map +0 -1
  359. package/dist/scroll-S-bXF2u6.cjs +0 -26
  360. package/dist/scroll-S-bXF2u6.cjs.map +0 -1
  361. package/dist/select-UU2pB67h.js.map +0 -1
  362. package/dist/select-fu_-rZyn.cjs +0 -56
  363. package/dist/select-fu_-rZyn.cjs.map +0 -1
  364. package/src/page/index.ts +0 -1
  365. package/src/page/page.ts +0 -137
  366. package/types/src/page/index.d.ts +0 -1
  367. package/types/src/page/page.d.ts +0 -37
  368. /package/dist/{rxjs-utils-Cs6XGwF6.js → rxjs-utils-BK8VMe3K.js} +0 -0
  369. /package/dist/{rxjs-utils-Dsj75cJy.cjs → rxjs-utils-DhOKenkS.cjs} +0 -0
  370. /package/dist/{utils-DXE5fBBd.js → utils-Cxg0Kfy5.js} +0 -0
  371. /package/dist/{utils-C-Q8ePtG.cjs → utils-aCJYAGUr.cjs} +0 -0
@@ -6,13 +6,12 @@ import {
6
6
  catchError,
7
7
  distinctUntilChanged,
8
8
  filter,
9
+ from,
9
10
  fromEvent,
10
11
  map,
11
12
  merge,
12
13
  of,
13
- shareReplay,
14
14
  switchMap,
15
- take,
16
15
  takeUntil,
17
16
  tap,
18
17
  } from 'rxjs'
@@ -26,412 +25,238 @@ export class SchmancyArea extends SchmancyElement {
26
25
  :host {
27
26
  position: relative;
28
27
  display: block;
29
- inset: 0;
28
+ height: 100%;
29
+ width: 100%;
30
+ min-height: 0;
31
+ min-width: 0;
30
32
  contain: layout style;
31
33
  }
34
+ ::slotted(:not(schmancy-route)) {
35
+ display: block;
36
+ box-sizing: border-box;
37
+ min-height: 100%;
38
+ width: 100%;
39
+ }
32
40
  `]
33
41
 
34
- /**
35
- * The name of the router outlet
36
- * @attr
37
- * @type {string}
38
- * @public
39
- * @required
40
- */
41
42
  @property() name!: string
42
43
 
43
44
  @property() default!: RouteComponent
44
45
 
45
- /**
46
- * Query for assigned route elements in the slot
47
- * This will automatically update when slot content changes
48
- */
49
46
  @queryAssignedElements({ selector: 'schmancy-route', flatten: true })
50
47
  private routes!: SchmancyRoute[]
51
48
 
52
49
  protected firstUpdated(): void {
53
50
  if (!this.name) throw new Error('Area name is required')
54
51
 
55
- // Single unified routing pipeline with all logic inline
56
52
  merge(
57
- // Source 1: Programmatic navigation from area.request
53
+ // Programmatic navigation
58
54
  area.request.pipe(
59
55
  filter(({ area }) => area === this.name),
60
56
  ),
61
57
 
62
- // Source 2: Initial page load - parse route from URL
58
+ // Initial URL parse
63
59
  of(null).pipe(
64
- take(1),
65
60
  map(() => {
66
- // Parse route from URL on initial load
67
61
  const path = location.pathname
68
62
  const lastSegment = path.split('/').pop() || ''
69
-
70
- // Check for JSON encoded route in URL
71
63
  if (lastSegment && (lastSegment.includes('{') || lastSegment.includes('%7B'))) {
72
64
  try {
73
- const parsed = JSON.parse(decodeURIComponent(lastSegment)) as Record<string, ActiveRoute>
74
- if (parsed[this.name]) {
75
- return {
76
- area: this.name,
77
- component: parsed[this.name].component,
78
- state: parsed[this.name].state || {},
79
- params: parsed[this.name].params || {},
80
- props: parsed[this.name].props || {},
81
- historyStrategy: HISTORY_STRATEGY.replace,
82
- } as RouteAction
65
+ const parsed = JSON.parse(decodeURIComponent(lastSegment))
66
+ if (typeof parsed === 'object' && parsed !== null && parsed[this.name]) {
67
+ const r = parsed[this.name]
68
+ return { area: this.name, component: r.component, state: r.state || {}, params: r.params || {}, props: r.props || {}, historyStrategy: HISTORY_STRATEGY.replace } as RouteAction
83
69
  }
84
70
  } catch {}
85
71
  }
86
-
87
- // Segment-based routing
88
- const segments = path.split('/').filter(Boolean)
89
- const matchingSegment = segments.find(seg =>
90
- this.routes?.some(r => r.when === seg)
91
- )
92
-
72
+ const matchingSegment = path.split('/').filter(Boolean).find(seg => this.routes?.some(r => r.when === seg))
93
73
  if (matchingSegment) {
94
- return {
95
- area: this.name,
96
- component: matchingSegment,
97
- state: {},
98
- params: {},
99
- historyStrategy: HISTORY_STRATEGY.silent,
100
- } as RouteAction
74
+ return { area: this.name, component: matchingSegment, state: {}, params: {}, historyStrategy: HISTORY_STRATEGY.silent } as RouteAction
101
75
  }
102
-
103
- // Use default route if available
104
76
  return this.default
105
- ? {
106
- area: this.name,
107
- component: this.default,
108
- state: {},
109
- params: {},
110
- historyStrategy: HISTORY_STRATEGY.silent,
111
- } as RouteAction
77
+ ? { area: this.name, component: this.default, state: {}, params: {}, historyStrategy: HISTORY_STRATEGY.silent } as RouteAction
112
78
  : null
113
- })
79
+ }),
114
80
  ),
115
81
 
116
- // Source 3: Browser navigation (back/forward) - parse from browser state
82
+ // Browser back/forward
117
83
  fromEvent<PopStateEvent>(window, 'popstate').pipe(
118
84
  map(() => {
119
- // Parse route from browser state during popstate
120
- // First check history state
121
85
  if (history.state?.schmancyAreas?.[this.name]) {
122
- const stateData = history.state.schmancyAreas[this.name]
123
- return {
124
- area: this.name,
125
- component: stateData.component,
126
- state: stateData.state || {},
127
- params: stateData.params || {},
128
- props: stateData.props || {},
129
- historyStrategy: HISTORY_STRATEGY.pop,
130
- } as RouteAction
86
+ const s = history.state.schmancyAreas[this.name]
87
+ return { area: this.name, component: s.component, state: s.state || {}, params: s.params || {}, props: s.props || {}, historyStrategy: HISTORY_STRATEGY.pop } as RouteAction
131
88
  }
132
-
133
- // Fallback to URL parsing if no state (e.g., navigating to root)
134
89
  const path = location.pathname
135
90
  const lastSegment = path.split('/').pop() || ''
136
-
137
- // Check for JSON encoded route in URL
138
91
  if (lastSegment && (lastSegment.includes('{') || lastSegment.includes('%7B'))) {
139
92
  try {
140
- const parsed = JSON.parse(decodeURIComponent(lastSegment)) as Record<string, ActiveRoute>
141
- if (parsed[this.name]) {
142
- return {
143
- area: this.name,
144
- component: parsed[this.name].component,
145
- state: parsed[this.name].state || {},
146
- params: parsed[this.name].params || {},
147
- props: parsed[this.name].props || {},
148
- historyStrategy: HISTORY_STRATEGY.replace,
149
- } as RouteAction
93
+ const parsed = JSON.parse(decodeURIComponent(lastSegment))
94
+ if (typeof parsed === 'object' && parsed !== null && parsed[this.name]) {
95
+ const r = parsed[this.name]
96
+ return { area: this.name, component: r.component, state: r.state || {}, params: r.params || {}, props: r.props || {}, historyStrategy: HISTORY_STRATEGY.replace } as RouteAction
150
97
  }
151
98
  } catch {}
152
99
  }
153
-
154
- // Segment-based routing
155
- const segments = path.split('/').filter(Boolean)
156
- const matchingSegment = segments.find(seg =>
157
- this.routes?.some(r => r.when === seg)
158
- )
159
-
100
+ const matchingSegment = path.split('/').filter(Boolean).find(seg => this.routes?.some(r => r.when === seg))
160
101
  if (matchingSegment) {
161
- return {
162
- area: this.name,
163
- component: matchingSegment,
164
- state: {},
165
- params: {},
166
- historyStrategy: HISTORY_STRATEGY.silent,
167
- } as RouteAction
102
+ return { area: this.name, component: matchingSegment, state: {}, params: {}, historyStrategy: HISTORY_STRATEGY.silent } as RouteAction
168
103
  }
169
-
170
- // Use default route if available
171
104
  return this.default
172
- ? {
173
- area: this.name,
174
- component: this.default,
175
- state: {},
176
- params: {},
177
- historyStrategy: HISTORY_STRATEGY.silent,
178
- } as RouteAction
105
+ ? { area: this.name, component: this.default, state: {}, params: {}, historyStrategy: HISTORY_STRATEGY.silent } as RouteAction
179
106
  : null
180
- })
181
- )
107
+ }),
108
+ ),
182
109
  ).pipe(
183
- // Filter out null routes
184
- filter((route): route is RouteAction => route !== null),
185
-
186
- // Performance: mark navigation start
187
- tap(() => performance.mark(`area-${this.name}-nav-start`)),
188
-
189
- // Step 1: Find matching route (resolve lazy only if needed for route matching)
190
- switchMap(async action => {
191
- let component: RouteComponent | null = action.component
192
- let matchedRoute: SchmancyRoute | undefined
193
-
194
- // If component is a string, find the matching route
195
- if (typeof component === 'string' && this.routes) {
196
- matchedRoute = this.routes.find(r => r.when === component)
197
- if (matchedRoute) {
198
- component = matchedRoute.component
110
+ filter((r): r is RouteAction => r !== null),
111
+
112
+ // Per-navigation error isolation — one bad nav skips, outer stream keeps flowing
113
+ switchMap(action => of(action).pipe(
114
+ // Step 1: resolve component + find matched route
115
+ switchMap(action => {
116
+ let component: RouteComponent | null = action.component
117
+ let matchedRoute: SchmancyRoute | undefined
118
+
119
+ if (typeof component === 'string' && this.routes) {
120
+ matchedRoute = this.routes.find(r => r.when === component)
121
+ if (matchedRoute) component = matchedRoute.component
199
122
  }
200
- }
201
-
202
- // If component is a lazy function and we don't have a matched route yet,
203
- // resolve it to find the route by tag name
204
- if (
205
- !matchedRoute &&
206
- typeof component === 'function' &&
207
- ('preload' in component || '_promise' in component || '_module' in component)
208
- ) {
209
- try {
210
- const module = await (component as unknown as () => Promise<{ default: CustomElementConstructor }>)()
211
- component = module.default
212
- // Now find route by tag name
213
- const tagName = customElements.getName(component as CustomElementConstructor)
214
- if (tagName && this.routes) {
215
- matchedRoute = this.routes.find(r => r.when === tagName)
216
- }
217
- } catch (e) {
218
- console.error(`[${this.name}] Lazy load failed:`, e)
219
- return { ...action, component: null, matchedRoute: undefined }
123
+ if (!matchedRoute && component instanceof HTMLElement && this.routes) {
124
+ matchedRoute = this.routes.find(r => r.when === component.tagName.toLowerCase())
220
125
  }
221
- }
222
-
223
- // If component is HTMLElement, find by tag name
224
- if (!matchedRoute && component instanceof HTMLElement && this.routes) {
225
- const tagName = component.tagName.toLowerCase()
226
- matchedRoute = this.routes.find(r => r.when === tagName)
227
- }
228
-
229
- return { ...action, component, matchedRoute }
230
- }),
231
-
232
- // Step 2: Check route guards
233
- switchMap(route => {
234
- if (!route.matchedRoute?.guard) {
235
- return of(route)
236
- }
237
-
238
- return route.matchedRoute.guard.pipe(
239
- switchMap(guardResult => {
240
- if (guardResult === true) {
241
- return of(route)
242
- }
243
-
244
- // Guard failed, dispatch redirect event
245
- const redirectEvent = new CustomEvent('redirect', {
246
- detail: {
247
- blockedRoute: route.matchedRoute?.when || 'unknown',
248
- area: this.name,
249
- params: route.params || {},
250
- state: route.state || {},
251
- redirectTarget: typeof guardResult === 'object' ? guardResult : undefined,
252
- },
253
- bubbles: true,
254
- composed: true,
255
- })
256
- route.matchedRoute.dispatchEvent(redirectEvent)
257
-
258
- return EMPTY
259
- })
260
- )
261
- }),
262
-
263
- // Step 3: Load lazy components (after guard check for performance)
264
- switchMap(async route => {
265
- let component = route.component
266
-
267
- if (
268
- typeof component === 'function' &&
269
- ('preload' in component || '_promise' in component || '_module' in component)
270
- ) {
271
- try {
272
- const module = await (component as unknown as () => Promise<{ default: CustomElementConstructor }>)()
273
- component = module.default
274
- } catch (e) {
275
- console.error(`[${this.name}] Lazy load failed:`, e)
276
- return { ...route, component: null }
126
+ if (!matchedRoute && typeof component === 'function' && 'preload' in component) {
127
+ return from(
128
+ (component as () => Promise<{ default: CustomElementConstructor }>)().then(m => ({
129
+ ...action,
130
+ component: m.default as RouteComponent,
131
+ matchedRoute: this.routes?.find(r => r.when === (customElements.getName(m.default) ?? '')) ?? undefined,
132
+ }))
133
+ )
277
134
  }
278
- }
279
-
280
- return { ...route, component }
281
- }),
282
-
283
- // Step 4: Create unique key for deduplication
284
- map(route => {
285
- let identifier = ''
286
- const component = route.component
287
-
288
- if (!component || component === '') {
289
- identifier = 'null'
290
- } else if (typeof component === 'string') {
291
- identifier = component
292
- } else if (component instanceof HTMLElement) {
293
- identifier = component.tagName.toLowerCase()
294
- } else if (typeof component === 'function') {
295
- identifier = component.name || 'CustomElement'
296
- }
297
-
298
- const key = `${identifier}${JSON.stringify(route.params)}${JSON.stringify(route.state)}${JSON.stringify(route.props)}`
299
-
300
- return { ...route, key, tagName: identifier }
301
- }),
135
+ return of({ ...action, component, matchedRoute })
136
+ }),
137
+
138
+ // Step 2: guard check
139
+ switchMap(carry => {
140
+ if (!carry.matchedRoute?.guard) return of(carry)
141
+ return carry.matchedRoute.guard.pipe(
142
+ switchMap(allowed => {
143
+ if (allowed) return of(carry)
144
+ carry.matchedRoute?.dispatchEvent(new CustomEvent('redirect', {
145
+ detail: { blockedRoute: carry.matchedRoute?.when ?? 'unknown', area: this.name, params: carry.params || {}, state: carry.state || {} },
146
+ bubbles: true,
147
+ composed: true,
148
+ }))
149
+ return EMPTY
150
+ }),
151
+ )
152
+ }),
153
+
154
+ // Step 3: load lazy component (after guard, for perf)
155
+ switchMap(carry => {
156
+ if (!(typeof carry.component === 'function' && 'preload' in carry.component)) return of(carry)
157
+ return from(
158
+ (carry.component as () => Promise<{ default: CustomElementConstructor }>)()
159
+ .then(m => ({ ...carry, component: m.default as RouteComponent }))
160
+ )
161
+ }),
162
+
163
+ // Step 4: dedup key
164
+ map(carry => {
165
+ const c = carry.component
166
+ const id =
167
+ !c || c === '' ? 'null'
168
+ : typeof c === 'string' ? c
169
+ : c instanceof HTMLElement ? c.tagName.toLowerCase()
170
+ : typeof c === 'function' ? c.name || 'CustomElement'
171
+ : 'null'
172
+ return { ...carry, key: `${id}${JSON.stringify(carry.params)}${JSON.stringify(carry.state)}${JSON.stringify(carry.props)}` }
173
+ }),
174
+
175
+ catchError(err => {
176
+ console.error(`[${this.name}] Navigation error:`, err)
177
+ return EMPTY
178
+ }),
179
+ )),
302
180
 
303
- // Step 5: Deduplicate navigation requests
304
181
  distinctUntilChanged((a, b) => a.key === b.key),
305
182
 
306
- // Step 6: Create DOM element from component
307
- map(route => {
183
+ // Step 5: instantiate element
184
+ map(carry => {
185
+ const c = carry.component
308
186
  let element: HTMLElement | null = null
309
- const component = route.component
310
-
311
- if (!component || component === '') {
312
- element = null
313
- } else if (typeof component === 'string') {
314
- try {
315
- element = document.createElement(component)
316
- } catch {
317
- console.error(`[${this.name}] Failed to create element:`, component)
318
- }
319
- } else if (component instanceof HTMLElement) {
320
- element = component
321
- } else if (typeof component === 'function') {
322
- try {
323
- element = new (component as CustomElementConstructor)()
324
- } catch (e) {
325
- console.error(`[${this.name}] Failed to instantiate:`, e)
326
- }
187
+ if (typeof c === 'string' && c !== '') {
188
+ try { element = document.createElement(c) } catch { console.error(`[${this.name}] Failed to create element:`, c) }
189
+ } else if (c instanceof HTMLElement) {
190
+ element = c
191
+ } else if (typeof c === 'function') {
192
+ try { element = new (c as CustomElementConstructor)() } catch (e) { console.error(`[${this.name}] Failed to instantiate:`, e) }
327
193
  }
328
-
329
- // Apply properties
330
194
  if (element) {
331
- if (route.params) Object.assign(element, route.params)
332
- if (route.props) Object.assign(element, route.props)
333
- if (route.state) Object.assign(element, { state: route.state })
195
+ if (carry.params) Object.assign(element, carry.params)
196
+ if (carry.props) Object.assign(element, carry.props)
197
+ if (carry.state) Object.assign(element, { state: carry.state })
334
198
  }
335
-
336
- return { element, route }
337
- }),
338
-
339
- shareReplay(1),
340
-
341
- // Step 7: Swap components in DOM and update history
342
- tap(({ element, route }) => this.swapComponents(element, route)),
343
-
344
- // Performance: measure navigation duration
345
- tap(() => {
346
- performance.mark(`area-${this.name}-nav-end`)
347
- performance.measure(`area-${this.name}-navigation`, `area-${this.name}-nav-start`, `area-${this.name}-nav-end`)
199
+ return { ...carry, element }
348
200
  }),
349
201
 
350
- catchError(error => {
351
- console.error(`[${this.name}] Navigation error:`, error)
352
- return EMPTY
353
- }),
354
-
355
- takeUntil(this.disconnecting)
356
- )
357
- .subscribe()
358
- }
359
-
360
-
361
- /**
362
- * Swap components with animation
363
- */
364
- private swapComponents(newComponent: HTMLElement | null, routeAction: RouteAction) {
365
- // Find current routed component (not route definitions)
366
- const oldComponent = Array.from(this.children).find(
367
- child => !(child instanceof SchmancyRoute)
368
- ) as HTMLElement | undefined
369
-
370
- // Clear if no new component
371
- if (!newComponent) {
372
- oldComponent?.remove()
373
- return
374
- }
375
-
376
- // Get animation duration (0 = instant, default = 150ms)
377
- const duration = routeAction.animationDuration ?? 150
378
-
379
- // Animate transition (or instant swap if duration is 0)
380
- if (duration === 0) {
381
- // Instant swap - no animation
382
- oldComponent?.remove()
383
- this.appendChild(newComponent)
384
- } else if (oldComponent) {
385
- // GPU optimization: promote layers before animation
386
- oldComponent.style.willChange = 'opacity'
387
- newComponent.style.willChange = 'opacity'
388
- // Skip paint for outgoing component
389
- oldComponent.style.contentVisibility = 'hidden'
390
-
391
- // Animated swap - fade out old, then fade in new
392
- const fadeOut = oldComponent.animate([{ opacity: 1 }, { opacity: 0 }], { duration, easing: 'ease-out' })
393
- fadeOut.onfinish = () => {
394
- oldComponent.remove()
395
- this.appendChild(newComponent)
396
- const fadeIn = newComponent.animate([{ opacity: 0 }, { opacity: 1 }], { duration, easing: 'ease-in' })
397
- fadeIn.onfinish = () => {
398
- // Clean up GPU layer promotion
399
- newComponent.style.willChange = 'auto'
202
+ // Step 6: swap DOM, write area state, update history
203
+ tap(carry => {
204
+ const old = Array.from(this.children).find(c => !(c instanceof SchmancyRoute)) as HTMLElement | undefined
205
+ const { element } = carry
206
+
207
+ if (!element) { old?.remove(); return }
208
+
209
+ const duration = carry.animationDuration ?? 150
210
+
211
+ if (duration === 0) {
212
+ old?.remove()
213
+ this.appendChild(element)
214
+ this.scrollTop = 0
215
+ } else if (old) {
216
+ old.style.willChange = 'opacity'
217
+ element.style.willChange = 'opacity'
218
+ old.style.contentVisibility = 'hidden'
219
+ old.animate([{ opacity: 1 }, { opacity: 0 }], { duration, easing: 'ease-out' }).finished
220
+ .then(() => {
221
+ if (!this.isConnected) return
222
+ old.remove()
223
+ this.appendChild(element)
224
+ this.scrollTop = 0
225
+ return element.animate([{ opacity: 0 }, { opacity: 1 }], { duration, easing: 'ease-in' }).finished
226
+ })
227
+ .then(() => (element.style.willChange = 'auto'))
228
+ } else {
229
+ this.appendChild(element)
230
+ this.scrollTop = 0
231
+ element.animate([{ opacity: 0 }, { opacity: 1 }], {
232
+ duration: duration > 100 ? Math.max(100, duration * 0.66) : duration,
233
+ easing: 'ease-in',
234
+ }).finished.then(() => (element.style.willChange = 'auto'))
400
235
  }
401
- }
402
- } else {
403
- // No old component - just fade in new
404
- newComponent.style.willChange = 'opacity'
405
- this.appendChild(newComponent)
406
- const fadeInDuration = duration > 100 ? Math.max(100, duration * 0.66) : duration
407
- const fadeIn = newComponent.animate([{ opacity: 0 }, { opacity: 1 }], { duration: fadeInDuration, easing: 'ease-in' })
408
- fadeIn.onfinish = () => {
409
- newComponent.style.willChange = 'auto'
410
- }
411
- }
412
-
413
- // Update area state
414
- const activeRoute: ActiveRoute = {
415
- component: newComponent.tagName.toLowerCase(),
416
- state: routeAction.state || {},
417
- area: this.name,
418
- params: routeAction.params || {},
419
- props: routeAction.props || {},
420
- }
421
236
 
422
- area.current.set(this.name, activeRoute)
423
- area.$current.next(area.current)
237
+ const activeRoute: ActiveRoute = {
238
+ component: element.tagName.toLowerCase(),
239
+ state: carry.state || {},
240
+ area: this.name,
241
+ params: carry.params || {},
242
+ props: carry.props || {},
243
+ }
244
+ area.current.set(this.name, activeRoute)
245
+ area.$current.next(area.current)
246
+
247
+ if (area.enableHistoryMode) {
248
+ area._updateBrowserHistory(
249
+ this.name,
250
+ activeRoute,
251
+ carry.historyStrategy ?? HISTORY_STRATEGY.push,
252
+ carry.clearQueryParams,
253
+ carry.path,
254
+ )
255
+ }
256
+ }),
424
257
 
425
- // Update browser history
426
- if (area.enableHistoryMode) {
427
- area._updateBrowserHistory(
428
- this.name,
429
- activeRoute,
430
- routeAction.historyStrategy || HISTORY_STRATEGY.push,
431
- routeAction.clearQueryParams,
432
- routeAction.path
433
- )
434
- }
258
+ takeUntil(this.disconnecting),
259
+ ).subscribe()
435
260
  }
436
261
 
437
262
  disconnectedCallback() {
@@ -1,5 +1,5 @@
1
- import { SchmancyElement } from '@mixins/index'
2
1
  import { provide } from '@lit/context'
2
+ import { SchmancyElement } from '@mixins/index'
3
3
  import { css, html, LitElement } from 'lit'
4
4
  import { customElement, property, query, queryAssignedElements } from 'lit/decorators.js'
5
5
  import { ifDefined } from 'lit/directives/if-defined.js'
@@ -26,8 +26,7 @@ export type ButtonColor = 'primary' | 'secondary' | 'success' | 'error' | 'warni
26
26
  @customElement('schmancy-button')
27
27
  export class SchmancyButton extends SchmancyElement {
28
28
  static styles = [css`:host{
29
- display: inline-block;
30
- min-width: fit-content;
29
+ display: inline-flex;
31
30
  overflow: hidden;
32
31
  position: relative;
33
32
  touch-action: manipulation;
@@ -36,6 +35,10 @@ export class SchmancyButton extends SchmancyElement {
36
35
  box-shadow 300ms cubic-bezier(0.34, 1.56, 0.64, 1),
37
36
  transform 200ms cubic-bezier(0.34, 1.56, 0.64, 1);
38
37
  }
38
+ :host([width="full"]) {
39
+ display: flex;
40
+ width: 100%;
41
+ }
39
42
  :host(:hover:not([disabled])) {
40
43
  box-shadow: 0 4px 16px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 20%, transparent);
41
44
  }
@@ -165,7 +168,7 @@ export class SchmancyButton extends SchmancyElement {
165
168
  * @default 'auto'
166
169
  * @public
167
170
  */
168
- @property()
171
+ @property({ reflect: true })
169
172
  public width: 'full' | 'auto' = 'auto'
170
173
 
171
174
  /**
@@ -301,7 +304,7 @@ export class SchmancyButton extends SchmancyElement {
301
304
 
302
305
  // Compute classes for the interactive element.
303
306
  const classes = {
304
- 'z-0 transition-all duration-200 relative rounded-2xl flex justify-center items-center outline-secondary-default focus-visible:outline-solid focus-visible:outline-2 focus-visible:outline-offset-2 outline-hidden w-full overflow-hidden':
307
+ 'z-0 transition-all duration-200 relative rounded-2xl flex justify-center items-center outline-secondary-default focus-visible:outline-solid focus-visible:outline-2 focus-visible:outline-offset-2 outline-hidden flex-1 overflow-hidden':
305
308
  true,
306
309
  // Height - M3 spec: 24dp (xxs) → 32dp (dense) → 40dp (default) → 48dp (large) → 56dp (XL)
307
310
  'h-6': this.size === 'xxs', // 24px - Ultra-compact