@mhmo91/schmancy 0.10.23 → 0.10.25

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 (438) hide show
  1. package/dist/agent/{overlay.confirm-body-xfOh5Q28.js → overlay.confirm-body-DozUyDYx.js} +242 -242
  2. package/dist/agent/{overlay.confirm-body-xfOh5Q28.js.map → overlay.confirm-body-DozUyDYx.js.map} +1 -1
  3. package/dist/agent/schmancy.agent.js +5670 -2939
  4. package/dist/agent/schmancy.agent.js.map +1 -1
  5. package/dist/{area-Ddk7P5wD.js → area-1EG1LrkX.js} +1 -1
  6. package/dist/{area-Ddk7P5wD.js.map → area-1EG1LrkX.js.map} +1 -1
  7. package/dist/{area-Cbkt0NX4.cjs → area-DrVE5pXW.cjs} +1 -1
  8. package/dist/{area-Cbkt0NX4.cjs.map → area-DrVE5pXW.cjs.map} +1 -1
  9. package/dist/area.cjs +1 -1
  10. package/dist/area.js +1 -1
  11. package/dist/{autocomplete-CfBFDSc3.cjs → autocomplete-6pdZxEab.cjs} +1 -1
  12. package/dist/{autocomplete-CfBFDSc3.cjs.map → autocomplete-6pdZxEab.cjs.map} +1 -1
  13. package/dist/{autocomplete-Ds3Q2cwR.js → autocomplete-nrIcCilw.js} +2 -2
  14. package/dist/{autocomplete-Ds3Q2cwR.js.map → autocomplete-nrIcCilw.js.map} +1 -1
  15. package/dist/autocomplete.cjs +1 -1
  16. package/dist/autocomplete.js +1 -1
  17. package/dist/avatar.cjs +2 -2
  18. package/dist/avatar.cjs.map +1 -1
  19. package/dist/avatar.js +3 -3
  20. package/dist/badge.cjs +1 -1
  21. package/dist/badge.js +1 -1
  22. package/dist/{boat-BF5P6p_f.js → boat--fLgbDAE.js} +3 -3
  23. package/dist/{boat-BF5P6p_f.js.map → boat--fLgbDAE.js.map} +1 -1
  24. package/dist/{boat-BPN8HLzZ.cjs → boat-BIB-gPqy.cjs} +1 -1
  25. package/dist/{boat-BPN8HLzZ.cjs.map → boat-BIB-gPqy.cjs.map} +1 -1
  26. package/dist/boat.cjs +1 -1
  27. package/dist/boat.js +1 -1
  28. package/dist/breadcrumb.cjs +1 -1
  29. package/dist/breadcrumb.js +1 -1
  30. package/dist/{busy-C7ejPa-Q.cjs → busy-DVCIxBVf.cjs} +1 -1
  31. package/dist/{busy-C7ejPa-Q.cjs.map → busy-DVCIxBVf.cjs.map} +1 -1
  32. package/dist/{busy-BuACDJy6.js → busy-DshZcVZ4.js} +1 -1
  33. package/dist/{busy-BuACDJy6.js.map → busy-DshZcVZ4.js.map} +1 -1
  34. package/dist/busy.cjs +1 -1
  35. package/dist/busy.js +1 -1
  36. package/dist/{button-C1IMGS6M.js → button-D9UJ7I6Z.js} +5 -5
  37. package/dist/{button-C1IMGS6M.js.map → button-D9UJ7I6Z.js.map} +1 -1
  38. package/dist/{button-CWNbPPq-.cjs → button-JrTMzwHY.cjs} +4 -4
  39. package/dist/{button-CWNbPPq-.cjs.map → button-JrTMzwHY.cjs.map} +1 -1
  40. package/dist/button.cjs +1 -1
  41. package/dist/button.js +1 -1
  42. package/dist/{card-CgQwXO8L.js → card-BvCFuX3J.js} +2 -2
  43. package/dist/{card-CgQwXO8L.js.map → card-BvCFuX3J.js.map} +1 -1
  44. package/dist/{card-BIzaLuEg.cjs → card-CTotavhH.cjs} +1 -1
  45. package/dist/{card-BIzaLuEg.cjs.map → card-CTotavhH.cjs.map} +1 -1
  46. package/dist/card.cjs +1 -1
  47. package/dist/card.js +1 -1
  48. package/dist/{checkbox-BAqE3sTx.cjs → checkbox-By4fFmjt.cjs} +1 -1
  49. package/dist/{checkbox-BAqE3sTx.cjs.map → checkbox-By4fFmjt.cjs.map} +1 -1
  50. package/dist/{checkbox-BNdg57Om.js → checkbox-GPsdCUbs.js} +1 -1
  51. package/dist/{checkbox-BNdg57Om.js.map → checkbox-GPsdCUbs.js.map} +1 -1
  52. package/dist/checkbox.cjs +1 -1
  53. package/dist/checkbox.js +1 -1
  54. package/dist/{chips-DnqLaOb1.js → chips-27umqnat.js} +4 -4
  55. package/dist/{chips-DnqLaOb1.js.map → chips-27umqnat.js.map} +1 -1
  56. package/dist/{chips-DS3y4Lbn.cjs → chips-BZf9sGA8.cjs} +1 -1
  57. package/dist/{chips-DS3y4Lbn.cjs.map → chips-BZf9sGA8.cjs.map} +1 -1
  58. package/dist/chips.cjs +1 -1
  59. package/dist/chips.js +2 -2
  60. package/dist/connectivity.cjs +1 -1
  61. package/dist/connectivity.js +1 -1
  62. package/dist/content-drawer.cjs +1 -1
  63. package/dist/content-drawer.js +1 -1
  64. package/dist/{cursor-glow-Cs2XLDB9.js → cursor-glow-Ah7VXSj7.js} +1 -1
  65. package/dist/{cursor-glow-Cs2XLDB9.js.map → cursor-glow-Ah7VXSj7.js.map} +1 -1
  66. package/dist/{cursor-glow-C8LgCxpI.cjs → cursor-glow-Bulq-38P.cjs} +1 -1
  67. package/dist/{cursor-glow-C8LgCxpI.cjs.map → cursor-glow-Bulq-38P.cjs.map} +1 -1
  68. package/dist/{date-range-VA1mi1N7.cjs → date-range-BJnLWCRF.cjs} +1 -1
  69. package/dist/{date-range-VA1mi1N7.cjs.map → date-range-BJnLWCRF.cjs.map} +1 -1
  70. package/dist/{date-range-inline-CAa0_4EI.cjs → date-range-inline-B6uKUliV.cjs} +1 -1
  71. package/dist/{date-range-inline-CAa0_4EI.cjs.map → date-range-inline-B6uKUliV.cjs.map} +1 -1
  72. package/dist/{date-range-inline-PeRt1iIF.js → date-range-inline-BNbbRfIA.js} +1 -1
  73. package/dist/{date-range-inline-PeRt1iIF.js.map → date-range-inline-BNbbRfIA.js.map} +1 -1
  74. package/dist/date-range-inline.cjs +1 -1
  75. package/dist/date-range-inline.js +1 -1
  76. package/dist/{date-range-CAqB-B0M.js → date-range-wDVHcr0u.js} +2 -2
  77. package/dist/{date-range-CAqB-B0M.js.map → date-range-wDVHcr0u.js.map} +1 -1
  78. package/dist/date-range.cjs +1 -1
  79. package/dist/date-range.js +1 -1
  80. package/dist/delay.cjs +1 -1
  81. package/dist/delay.js +2 -2
  82. package/dist/{details-BpFjVclg.js → details-Ckxpwacj.js} +4 -4
  83. package/dist/{details-BpFjVclg.js.map → details-Ckxpwacj.js.map} +1 -1
  84. package/dist/{details-BnXbDpt7.cjs → details-DNrWIes6.cjs} +1 -1
  85. package/dist/{details-BnXbDpt7.cjs.map → details-DNrWIes6.cjs.map} +1 -1
  86. package/dist/details.cjs +1 -1
  87. package/dist/details.js +1 -1
  88. package/dist/directives-BBMqe8x3.js +4082 -0
  89. package/dist/directives-BBMqe8x3.js.map +1 -0
  90. package/dist/directives-F15SJZUR.cjs +348 -0
  91. package/dist/directives-F15SJZUR.cjs.map +1 -0
  92. package/dist/directives.cjs +1 -99
  93. package/dist/directives.js +6 -1363
  94. package/dist/discovery.cjs +1 -1
  95. package/dist/discovery.js +2 -61
  96. package/dist/discovery.service-COmbHaoI.js +61 -0
  97. package/dist/discovery.service-COmbHaoI.js.map +1 -0
  98. package/dist/discovery.service-CVDXO9rH.cjs +1 -0
  99. package/dist/discovery.service-CVDXO9rH.cjs.map +1 -0
  100. package/dist/{divider-D8cBBkdG.js → divider-BzcZGo4S.js} +1 -1
  101. package/dist/{divider-D8cBBkdG.js.map → divider-BzcZGo4S.js.map} +1 -1
  102. package/dist/{divider-B84lt1A3.cjs → divider-Cde33ivs.cjs} +1 -1
  103. package/dist/{divider-B84lt1A3.cjs.map → divider-Cde33ivs.cjs.map} +1 -1
  104. package/dist/divider.cjs +1 -1
  105. package/dist/divider.js +1 -1
  106. package/dist/dropdown.cjs +1 -1
  107. package/dist/dropdown.js +1 -1
  108. package/dist/{expand-BJiKggfg.js → expand-DI144OzN.js} +3 -3
  109. package/dist/{expand-BJiKggfg.js.map → expand-DI144OzN.js.map} +1 -1
  110. package/dist/{expand-DK-O37-j.cjs → expand-Db4V0jj-.cjs} +1 -1
  111. package/dist/{expand-DK-O37-j.cjs.map → expand-Db4V0jj-.cjs.map} +1 -1
  112. package/dist/expand.cjs +1 -1
  113. package/dist/expand.js +1 -1
  114. package/dist/{float-RWR6Q1Hh.cjs → float--RScf9BZ.cjs} +1 -1
  115. package/dist/{float-RWR6Q1Hh.cjs.map → float--RScf9BZ.cjs.map} +1 -1
  116. package/dist/{float-B4FDN40h.js → float-DIyzy1c2.js} +1 -1
  117. package/dist/{float-B4FDN40h.js.map → float-DIyzy1c2.js.map} +1 -1
  118. package/dist/float.cjs +1 -1
  119. package/dist/float.js +1 -1
  120. package/dist/{form-ha3df3K7.cjs → form-DWNpOsIU.cjs} +1 -1
  121. package/dist/{form-ha3df3K7.cjs.map → form-DWNpOsIU.cjs.map} +1 -1
  122. package/dist/{form-B-Sm6u25.js → form-RtXH8UHQ.js} +8 -8
  123. package/dist/{form-B-Sm6u25.js.map → form-RtXH8UHQ.js.map} +1 -1
  124. package/dist/form.cjs +1 -1
  125. package/dist/form.js +6 -6
  126. package/dist/handover/agent-runtime-followups.md +1 -1
  127. package/dist/handover/agent-runtime-v1.md +3 -3
  128. package/dist/{hashContent-dJrI-9sc.js.map → hashContent-Dgmzc32o.js.map} +1 -1
  129. package/dist/{hashContent-Ck6laKlk.cjs.map → hashContent-Dh1VzIAb.cjs.map} +1 -1
  130. package/dist/icons-DXanGDZ_.js +52 -0
  131. package/dist/icons-DXanGDZ_.js.map +1 -0
  132. package/dist/icons-bNxlWLlk.cjs +24 -0
  133. package/dist/icons-bNxlWLlk.cjs.map +1 -0
  134. package/dist/icons.cjs +1 -1
  135. package/dist/icons.js +1 -1
  136. package/dist/{iframe-BXe1TPx1.cjs → iframe-B1XWRaLC.cjs} +1 -1
  137. package/dist/{iframe-BXe1TPx1.cjs.map → iframe-B1XWRaLC.cjs.map} +1 -1
  138. package/dist/{iframe-CByrVlZy.js → iframe-BlHK0cjy.js} +1 -1
  139. package/dist/{iframe-CByrVlZy.js.map → iframe-BlHK0cjy.js.map} +1 -1
  140. package/dist/iframe.cjs +1 -1
  141. package/dist/iframe.js +1 -1
  142. package/dist/index.cjs +1 -1
  143. package/dist/index.js +60 -60
  144. package/dist/{input-BY9OCQWr.cjs → input-C-_XU9AX.cjs} +1 -1
  145. package/dist/{input-BY9OCQWr.cjs.map → input-C-_XU9AX.cjs.map} +1 -1
  146. package/dist/{input-Q0fm34Co.js → input-CiGa8Dkl.js} +1 -1
  147. package/dist/{input-Q0fm34Co.js.map → input-CiGa8Dkl.js.map} +1 -1
  148. package/dist/{input-chip-BwNf3GD0.cjs → input-chip-5aYnuRZ_.cjs} +1 -1
  149. package/dist/{input-chip-BwNf3GD0.cjs.map → input-chip-5aYnuRZ_.cjs.map} +1 -1
  150. package/dist/{input-chip-CytUirVS.js → input-chip-l--zCMGR.js} +1 -1
  151. package/dist/{input-chip-CytUirVS.js.map → input-chip-l--zCMGR.js.map} +1 -1
  152. package/dist/input.cjs +1 -1
  153. package/dist/input.js +1 -1
  154. package/dist/json.cjs +2 -2
  155. package/dist/json.cjs.map +1 -1
  156. package/dist/json.js +3 -3
  157. package/dist/json.js.map +1 -1
  158. package/dist/kbd.cjs +1 -1
  159. package/dist/kbd.js +1 -1
  160. package/dist/{layout-Dq2oeOTS.js → layout-DSAjo92m.js} +1 -1
  161. package/dist/{layout-Dq2oeOTS.js.map → layout-DSAjo92m.js.map} +1 -1
  162. package/dist/{layout-BbCIfIgo.cjs → layout-eXb9wjDh.cjs} +1 -1
  163. package/dist/{layout-BbCIfIgo.cjs.map → layout-eXb9wjDh.cjs.map} +1 -1
  164. package/dist/layout.cjs +1 -1
  165. package/dist/layout.js +1 -1
  166. package/dist/{lightbox-p2E0oVR0.cjs → lightbox-CfRDkeeb.cjs} +2 -2
  167. package/dist/{lightbox-p2E0oVR0.cjs.map → lightbox-CfRDkeeb.cjs.map} +1 -1
  168. package/dist/{lightbox-Ckvn5YNF.js → lightbox-D9oiu1Nv.js} +2 -2
  169. package/dist/{lightbox-Ckvn5YNF.js.map → lightbox-D9oiu1Nv.js.map} +1 -1
  170. package/dist/lightbox.cjs +1 -1
  171. package/dist/lightbox.js +1 -1
  172. package/dist/{list-CsrPVvmm.js → list-BOlRka4v.js} +1 -1
  173. package/dist/{list-CsrPVvmm.js.map → list-BOlRka4v.js.map} +1 -1
  174. package/dist/{list-r57UFHu3.cjs → list-CDJi3_Ut.cjs} +1 -1
  175. package/dist/{list-r57UFHu3.cjs.map → list-CDJi3_Ut.cjs.map} +1 -1
  176. package/dist/list.cjs +1 -1
  177. package/dist/list.js +1 -1
  178. package/dist/{magnetic-Bgh7aHHI.cjs → magnetic-D-ph029G.cjs} +1 -1
  179. package/dist/{magnetic-Bgh7aHHI.cjs.map → magnetic-D-ph029G.cjs.map} +1 -1
  180. package/dist/{magnetic-DxvoEz8_.js → magnetic-mHXl54Z8.js} +1 -1
  181. package/dist/{magnetic-DxvoEz8_.js.map → magnetic-mHXl54Z8.js.map} +1 -1
  182. package/dist/{menu-DBuZiPyW.cjs → menu-CJaDL2cd.cjs} +1 -1
  183. package/dist/{menu-DBuZiPyW.cjs.map → menu-CJaDL2cd.cjs.map} +1 -1
  184. package/dist/{menu-Csm6Fg88.js → menu-XyrLmCi_.js} +2 -2
  185. package/dist/{menu-Csm6Fg88.js.map → menu-XyrLmCi_.js.map} +1 -1
  186. package/dist/menu.cjs +1 -1
  187. package/dist/menu.js +1 -1
  188. package/dist/mixins-CsYsIJOI.cjs +254 -0
  189. package/dist/mixins-CsYsIJOI.cjs.map +1 -0
  190. package/dist/mixins-DySzfmal.js +642 -0
  191. package/dist/mixins-DySzfmal.js.map +1 -0
  192. package/dist/mixins.cjs +1 -1
  193. package/dist/mixins.js +2 -2
  194. package/dist/nav-drawer.cjs +1 -1
  195. package/dist/nav-drawer.js +1 -1
  196. package/dist/navigation-bar.cjs +1 -1
  197. package/dist/navigation-bar.js +1 -1
  198. package/dist/navigation-rail.cjs +5 -9
  199. package/dist/navigation-rail.cjs.map +1 -1
  200. package/dist/navigation-rail.js +5 -11
  201. package/dist/navigation-rail.js.map +1 -1
  202. package/dist/{notification-CgTBiAdf.js → notification-CHrEY4u8.js} +2 -2
  203. package/dist/{notification-CgTBiAdf.js.map → notification-CHrEY4u8.js.map} +1 -1
  204. package/dist/{notification-58tkVys8.cjs → notification-DKp4tjaB.cjs} +1 -1
  205. package/dist/{notification-58tkVys8.cjs.map → notification-DKp4tjaB.cjs.map} +1 -1
  206. package/dist/notification.cjs +1 -1
  207. package/dist/notification.js +1 -1
  208. package/dist/{option-Bicf6xpI.js → option-Vpy4UQ-D.js} +1 -1
  209. package/dist/{option-Bicf6xpI.js.map → option-Vpy4UQ-D.js.map} +1 -1
  210. package/dist/{option-61YE3gub.cjs → option-nRk4MuXH.cjs} +1 -1
  211. package/dist/{option-61YE3gub.cjs.map → option-nRk4MuXH.cjs.map} +1 -1
  212. package/dist/option.cjs +1 -1
  213. package/dist/option.js +1 -1
  214. package/dist/{overlay-CpvmytrQ.cjs → overlay-HNrWZ4sB.cjs} +1 -1
  215. package/dist/{overlay-CpvmytrQ.cjs.map → overlay-HNrWZ4sB.cjs.map} +1 -1
  216. package/dist/{overlay-CAI2FAp7.js → overlay-jlkcrt8F.js} +5 -5
  217. package/dist/{overlay-CAI2FAp7.js.map → overlay-jlkcrt8F.js.map} +1 -1
  218. package/dist/{overlay-stack-Dk0xETTy.cjs.map → overlay-stack-Bdr9lOqi.cjs.map} +1 -1
  219. package/dist/{overlay-stack-BR4iYivO.js.map → overlay-stack-D2rgxQLh.js.map} +1 -1
  220. package/dist/overlay.cjs +1 -1
  221. package/dist/{overlay.confirm-body-QD-5cj3_.cjs → overlay.confirm-body-B8dFI3cj.cjs} +1 -1
  222. package/dist/{overlay.confirm-body-QD-5cj3_.cjs.map → overlay.confirm-body-B8dFI3cj.cjs.map} +1 -1
  223. package/dist/{overlay.confirm-body-Cq25CkTw.js → overlay.confirm-body-CYShkjI6.js} +1 -1
  224. package/dist/{overlay.confirm-body-Cq25CkTw.js.map → overlay.confirm-body-CYShkjI6.js.map} +1 -1
  225. package/dist/overlay.js +3 -3
  226. package/dist/{overlay.service-BG0bqPwJ.cjs → overlay.service-BTPn7Uv7.cjs} +1 -1
  227. package/dist/{overlay.service-BG0bqPwJ.cjs.map → overlay.service-BTPn7Uv7.cjs.map} +1 -1
  228. package/dist/{overlay.service-Bpjrhaxh.js → overlay.service-BqhhxVJp.js} +2 -2
  229. package/dist/{overlay.service-Bpjrhaxh.js.map → overlay.service-BqhhxVJp.js.map} +1 -1
  230. package/dist/{progress-Zqx-S9NZ.js → progress-8Bn88GK_.js} +1 -1
  231. package/dist/{progress-Zqx-S9NZ.js.map → progress-8Bn88GK_.js.map} +1 -1
  232. package/dist/{progress-D8XZJVl5.cjs → progress-CAp_4jtq.cjs} +1 -1
  233. package/dist/{progress-D8XZJVl5.cjs.map → progress-CAp_4jtq.cjs.map} +1 -1
  234. package/dist/progress.cjs +1 -1
  235. package/dist/progress.js +1 -1
  236. package/dist/{radio-group-bl8K4Gls.cjs → radio-group-CN44mAoc.cjs} +1 -1
  237. package/dist/{radio-group-bl8K4Gls.cjs.map → radio-group-CN44mAoc.cjs.map} +1 -1
  238. package/dist/{radio-group-D9MU1Mxz.js → radio-group-GNHA7qJR.js} +1 -1
  239. package/dist/{radio-group-D9MU1Mxz.js.map → radio-group-GNHA7qJR.js.map} +1 -1
  240. package/dist/radio-group.cjs +1 -1
  241. package/dist/radio-group.js +1 -1
  242. package/dist/range.cjs +1 -1
  243. package/dist/range.js +1 -1
  244. package/dist/{reduced-motion-D7LqTUMn.js.map → reduced-motion-D-L12p7G.js.map} +1 -1
  245. package/dist/{reduced-motion-Dzfp_w5x.cjs.map → reduced-motion-Ds-HjMzn.cjs.map} +1 -1
  246. package/dist/{rxjs-utils-BK8VMe3K.js.map → rxjs-utils-BXpvHN4-.js.map} +1 -1
  247. package/dist/{rxjs-utils-DhOKenkS.cjs.map → rxjs-utils-CaC-tdot.cjs.map} +1 -1
  248. package/dist/rxjs-utils.cjs +1 -1
  249. package/dist/rxjs-utils.js +1 -1
  250. package/dist/{select-CMwkl-D6.js → select-BnuXRHS4.js} +3 -3
  251. package/dist/{select-CMwkl-D6.js.map → select-BnuXRHS4.js.map} +1 -1
  252. package/dist/{select-COIfVtZl.cjs → select-DZNns5Pa.cjs} +2 -2
  253. package/dist/{select-COIfVtZl.cjs.map → select-DZNns5Pa.cjs.map} +1 -1
  254. package/dist/select.cjs +1 -1
  255. package/dist/select.js +1 -1
  256. package/dist/skeleton.cjs +1 -1
  257. package/dist/skeleton.js +1 -1
  258. package/dist/skills/INDEX.md +2 -1
  259. package/dist/skills/SKILL.md +33 -23
  260. package/dist/skills/area.md +5 -4
  261. package/dist/skills/connectivity.md +1 -3
  262. package/dist/skills/directives.md +36 -0
  263. package/dist/skills/icons.md +95 -31
  264. package/dist/skills/layout.md +36 -53
  265. package/dist/skills/mixins.md +26 -5
  266. package/dist/skills/schmancy/INDEX.md +2 -1
  267. package/dist/skills/schmancy/SKILL.md +33 -23
  268. package/dist/skills/schmancy/area.md +5 -4
  269. package/dist/skills/schmancy/connectivity.md +1 -3
  270. package/dist/skills/schmancy/directives.md +36 -0
  271. package/dist/skills/schmancy/icons.md +95 -31
  272. package/dist/skills/schmancy/layout.md +36 -53
  273. package/dist/skills/schmancy/mixins.md +26 -5
  274. package/dist/slider.cjs +1 -1
  275. package/dist/slider.js +1 -1
  276. package/dist/{splash-screen-xrMNpzkm.js → splash-screen-CUP_elaT.js} +1 -1
  277. package/dist/{splash-screen-xrMNpzkm.js.map → splash-screen-CUP_elaT.js.map} +1 -1
  278. package/dist/{splash-screen-2hxq8Sft.cjs → splash-screen-DeoPRrOu.cjs} +1 -1
  279. package/dist/{splash-screen-2hxq8Sft.cjs.map → splash-screen-DeoPRrOu.cjs.map} +1 -1
  280. package/dist/splash-screen.cjs +1 -1
  281. package/dist/splash-screen.js +1 -1
  282. package/dist/{src-B15R32Sp.js → src-B1VkLX3l.js} +159 -159
  283. package/dist/src-B1VkLX3l.js.map +1 -0
  284. package/dist/{src-BWQvtOOf.cjs → src-DQ4wr0qq.cjs} +13 -13
  285. package/dist/src-DQ4wr0qq.cjs.map +1 -0
  286. package/dist/steps.cjs +1 -1
  287. package/dist/steps.js +1 -1
  288. package/dist/{surface-BkQ44Wuo.cjs → surface-LkaZQXZn.cjs} +1 -1
  289. package/dist/{surface-BkQ44Wuo.cjs.map → surface-LkaZQXZn.cjs.map} +1 -1
  290. package/dist/{surface-3nnvlxeE.js → surface-hOvkrjGN.js} +1 -1
  291. package/dist/{surface-3nnvlxeE.js.map → surface-hOvkrjGN.js.map} +1 -1
  292. package/dist/surface.cjs +1 -1
  293. package/dist/surface.js +1 -1
  294. package/dist/switch.cjs +1 -1
  295. package/dist/switch.js +1 -1
  296. package/dist/table.cjs +2 -2
  297. package/dist/table.cjs.map +1 -1
  298. package/dist/table.js +2 -2
  299. package/dist/table.js.map +1 -1
  300. package/dist/{tabs-CnLIe8nE.js → tabs-CfwIHhHo.js} +1 -1
  301. package/dist/{tabs-CnLIe8nE.js.map → tabs-CfwIHhHo.js.map} +1 -1
  302. package/dist/{tabs-Dql0rcqZ.cjs → tabs-bplzstz6.cjs} +1 -1
  303. package/dist/{tabs-Dql0rcqZ.cjs.map → tabs-bplzstz6.cjs.map} +1 -1
  304. package/dist/tabs.cjs +1 -1
  305. package/dist/tabs.js +1 -1
  306. package/dist/teleport.cjs +1 -1
  307. package/dist/teleport.js +1 -1
  308. package/dist/{textarea-BAogS_Ff.js → textarea-C1A5xuw9.js} +1 -1
  309. package/dist/{textarea-BAogS_Ff.js.map → textarea-C1A5xuw9.js.map} +1 -1
  310. package/dist/{textarea-CGD6lAEe.cjs → textarea-hrDp5gQq.cjs} +1 -1
  311. package/dist/{textarea-CGD6lAEe.cjs.map → textarea-hrDp5gQq.cjs.map} +1 -1
  312. package/dist/textarea.cjs +1 -1
  313. package/dist/textarea.js +1 -1
  314. package/dist/{theme-CUK0HrS3.js → theme-BniFOMEo.js} +4 -4
  315. package/dist/{theme-CUK0HrS3.js.map → theme-BniFOMEo.js.map} +1 -1
  316. package/dist/{theme-DKrrQ-ic.cjs → theme-DmR6PKV8.cjs} +3 -3
  317. package/dist/{theme-DKrrQ-ic.cjs.map → theme-DmR6PKV8.cjs.map} +1 -1
  318. package/dist/{theme-button-Bb8qW2IH.js → theme-button--ruZIb0T.js} +1 -1
  319. package/dist/{theme-button-Bb8qW2IH.js.map → theme-button--ruZIb0T.js.map} +1 -1
  320. package/dist/{theme-button-CmTwFm3l.cjs → theme-button-a0LgZ7hQ.cjs} +1 -1
  321. package/dist/{theme-button-CmTwFm3l.cjs.map → theme-button-a0LgZ7hQ.cjs.map} +1 -1
  322. package/dist/theme-button.cjs +1 -1
  323. package/dist/theme-button.js +1 -1
  324. package/dist/theme.cjs +1 -1
  325. package/dist/{theme.interface-D4NeufQA.cjs.map → theme.interface-B5xjEk74.cjs.map} +1 -1
  326. package/dist/{theme.interface-C2XNgsLB.js.map → theme.interface-DVEw3s8m.js.map} +1 -1
  327. package/dist/theme.js +4 -4
  328. package/dist/{theme.service-CSzNkqBB.js.map → theme.service-Bh08uOSJ.js.map} +1 -1
  329. package/dist/{theme.service-CnFUmUpc.cjs.map → theme.service-Y-e8b331.cjs.map} +1 -1
  330. package/dist/tree.cjs +1 -1
  331. package/dist/tree.js +1 -1
  332. package/dist/typography.cjs +1 -1
  333. package/dist/typography.js +1 -1
  334. package/dist/{utils-Cxg0Kfy5.js → utils-578eFTx4.js} +1 -1
  335. package/dist/{utils-Cxg0Kfy5.js.map → utils-578eFTx4.js.map} +1 -1
  336. package/dist/{utils-aCJYAGUr.cjs → utils-CVWUrECT.cjs} +1 -1
  337. package/dist/{utils-aCJYAGUr.cjs.map → utils-CVWUrECT.cjs.map} +1 -1
  338. package/dist/utils.cjs +1 -1
  339. package/dist/utils.js +2 -2
  340. package/dist/visually-hidden.cjs +1 -1
  341. package/dist/visually-hidden.js +1 -1
  342. package/dist/{window-DuDAQa6y.js → window-BT9JecWy.js} +5 -5
  343. package/dist/{window-DuDAQa6y.js.map → window-BT9JecWy.js.map} +1 -1
  344. package/dist/{window-BbWlaPZv.cjs → window-Bp7zWZpu.cjs} +1 -1
  345. package/dist/{window-BbWlaPZv.cjs.map → window-Bp7zWZpu.cjs.map} +1 -1
  346. package/dist/window.cjs +1 -1
  347. package/dist/window.js +1 -1
  348. package/package.json +1 -1
  349. package/skills/schmancy/INDEX.md +2 -1
  350. package/skills/schmancy/SKILL.md +33 -23
  351. package/skills/schmancy/area.md +5 -4
  352. package/skills/schmancy/connectivity.md +1 -3
  353. package/skills/schmancy/directives.md +36 -0
  354. package/skills/schmancy/icons.md +95 -31
  355. package/skills/schmancy/layout.md +36 -53
  356. package/skills/schmancy/mixins.md +26 -5
  357. package/src/badge/badge.ts +7 -11
  358. package/src/button/icon-button.ts +3 -4
  359. package/src/directives/ai-badge.ts +95 -0
  360. package/src/directives/art/art.directive.ts +228 -0
  361. package/src/directives/art/effects/error.ts +192 -0
  362. package/src/directives/art/effects/funkhaus.ts +121 -0
  363. package/src/directives/art/effects/howl.ts +203 -0
  364. package/src/directives/art/effects/samwa.ts +228 -0
  365. package/src/directives/art/effects/snow.ts +207 -0
  366. package/src/directives/art/effects/starfield.ts +107 -0
  367. package/src/directives/art/index.ts +2 -0
  368. package/src/directives/art/particle-pool.ts +40 -0
  369. package/src/directives/art/types.ts +129 -0
  370. package/src/directives/art/utils.ts +35 -0
  371. package/src/directives/battery.ts +1014 -0
  372. package/src/directives/beta.ts +44 -0
  373. package/src/directives/fill.ts +32 -60
  374. package/src/directives/fyi.ts +551 -0
  375. package/src/directives/hummingbird.ts +1712 -0
  376. package/src/directives/index.ts +9 -0
  377. package/src/directives/missed-punch.ts +407 -0
  378. package/src/directives/urgent.ts +660 -0
  379. package/src/directives/working-snake.ts +294 -0
  380. package/src/icons/icon.ts +53 -30
  381. package/src/json/json.ts +1 -1
  382. package/src/navigation-rail/navigation-rail-item.ts +7 -12
  383. package/src/navigation-rail/navigation-rail.ts +0 -2
  384. package/src/table/table.ts +2 -2
  385. package/src/theme/theme-audio-player.ts +1 -1
  386. package/types/mixins/SchmancyElement.d.ts +31 -0
  387. package/types/src/badge/badge.d.ts +1 -1
  388. package/types/src/directives/ai-badge.d.ts +15 -0
  389. package/types/src/directives/art/art.directive.d.ts +19 -0
  390. package/types/src/directives/art/effects/error.d.ts +7 -0
  391. package/types/src/directives/art/effects/funkhaus.d.ts +7 -0
  392. package/types/src/directives/art/effects/howl.d.ts +7 -0
  393. package/types/src/directives/art/effects/samwa.d.ts +7 -0
  394. package/types/src/directives/art/effects/snow.d.ts +7 -0
  395. package/types/src/directives/art/effects/starfield.d.ts +10 -0
  396. package/types/src/directives/art/index.d.ts +2 -0
  397. package/types/src/directives/art/particle-pool.d.ts +16 -0
  398. package/types/src/directives/art/types.d.ts +126 -0
  399. package/types/src/directives/art/utils.d.ts +5 -0
  400. package/types/src/directives/battery.d.ts +96 -0
  401. package/types/src/directives/beta.d.ts +33 -0
  402. package/types/src/directives/fill.d.ts +4 -11
  403. package/types/src/directives/fyi.d.ts +76 -0
  404. package/types/src/directives/hummingbird.d.ts +180 -0
  405. package/types/src/directives/index.d.ts +9 -0
  406. package/types/src/directives/missed-punch.d.ts +28 -0
  407. package/types/src/directives/urgent.d.ts +88 -0
  408. package/types/src/directives/working-snake.d.ts +46 -0
  409. package/types/src/icons/icon.d.ts +22 -0
  410. package/dist/directives.cjs.map +0 -1
  411. package/dist/directives.js.map +0 -1
  412. package/dist/discovery.cjs.map +0 -1
  413. package/dist/discovery.js.map +0 -1
  414. package/dist/icons-DJuXwn8D.js +0 -48
  415. package/dist/icons-DJuXwn8D.js.map +0 -1
  416. package/dist/icons-oNRUCAEY.cjs +0 -33
  417. package/dist/icons-oNRUCAEY.cjs.map +0 -1
  418. package/dist/mixins-DTCHPEd4.cjs +0 -254
  419. package/dist/mixins-DTCHPEd4.cjs.map +0 -1
  420. package/dist/mixins-pU53qf6R.js +0 -636
  421. package/dist/mixins-pU53qf6R.js.map +0 -1
  422. package/dist/skills/page.md +0 -84
  423. package/dist/skills/schmancy/page.md +0 -84
  424. package/dist/src-B15R32Sp.js.map +0 -1
  425. package/dist/src-BWQvtOOf.cjs.map +0 -1
  426. package/skills/schmancy/page.md +0 -84
  427. /package/dist/{hashContent-dJrI-9sc.js → hashContent-Dgmzc32o.js} +0 -0
  428. /package/dist/{hashContent-Ck6laKlk.cjs → hashContent-Dh1VzIAb.cjs} +0 -0
  429. /package/dist/{overlay-stack-Dk0xETTy.cjs → overlay-stack-Bdr9lOqi.cjs} +0 -0
  430. /package/dist/{overlay-stack-BR4iYivO.js → overlay-stack-D2rgxQLh.js} +0 -0
  431. /package/dist/{reduced-motion-D7LqTUMn.js → reduced-motion-D-L12p7G.js} +0 -0
  432. /package/dist/{reduced-motion-Dzfp_w5x.cjs → reduced-motion-Ds-HjMzn.cjs} +0 -0
  433. /package/dist/{rxjs-utils-BK8VMe3K.js → rxjs-utils-BXpvHN4-.js} +0 -0
  434. /package/dist/{rxjs-utils-DhOKenkS.cjs → rxjs-utils-CaC-tdot.cjs} +0 -0
  435. /package/dist/{theme.interface-D4NeufQA.cjs → theme.interface-B5xjEk74.cjs} +0 -0
  436. /package/dist/{theme.interface-C2XNgsLB.js → theme.interface-DVEw3s8m.js} +0 -0
  437. /package/dist/{theme.service-CSzNkqBB.js → theme.service-Bh08uOSJ.js} +0 -0
  438. /package/dist/{theme.service-CnFUmUpc.cjs → theme.service-Y-e8b331.cjs} +0 -0
@@ -1,63 +1,46 @@
1
- # Schmancy Layout
1
+ # Layout Directives
2
2
 
3
- > Layout primitives: `schmancy-grid`, `schmancy-flex`, `schmancy-scroll`, plus `sch-grid` / `sch-flex` v2 variants.
3
+ ```typescript
4
+ import { fill, overflowWithin } from '@mhmo91/schmancy/directives'
5
+ ```
4
6
 
5
- > **Prefer Tailwind classes directly** for layout in new code. These components exist for quick composition and design-token consistency (`gap="sm|md|lg"` maps to theme spacing).
7
+ ## `fill()` viewport-anchor an element
6
8
 
7
- ## schmancy-grid
8
- ```html
9
- <schmancy-grid cols="1fr 2fr 1fr" gap="md" align="center">
10
- <div>Left</div><div>Center</div><div>Right</div>
11
- </schmancy-grid>
12
- ```
9
+ Measures against `visualViewport` and writes exact `height`/`width` in px. Cascade-independent — works even when parent custom elements default to `display: inline`. Tracks iOS keyboard, orientation change, and `theme.bottomOffset$`.
13
10
 
14
- | Property | Type | Default | Description |
15
- |----------|------|---------|-------------|
16
- | `flow` | `'row' \| 'col' \| 'dense' \| 'row-dense' \| 'col-dense'` | `'row'` | Grid auto-flow |
17
- | `align` | `'start' \| 'center' \| 'end' \| 'stretch' \| 'baseline'` | `'stretch'` | Item alignment |
18
- | `justify` | `'start' \| 'center' \| 'end' \| 'stretch'` | `'stretch'` | Item justification |
19
- | `content` | `'start' \| 'center' \| 'end' \| 'stretch' \| 'around' \| 'evenly' \| 'between'` | — | Align-content |
20
- | `gap` | `'none' \| 'xs' \| 'sm' \| 'md' \| 'lg'` | `'none'` | Grid gap |
21
- | `cols` | string | — | grid-template-columns (e.g. `"1fr 2fr"`) |
22
- | `rows` | string | — | grid-template-rows |
23
- | `rcols` | object | — | Responsive cols: `{ sm: '1fr', md: '1fr 1fr', lg: '1fr 2fr 1fr' }` |
24
- | `wrap` | boolean | `false` | Grid auto-wrap |
25
-
26
- ## schmancy-flex
27
- ```html
28
- <schmancy-flex flow="row" justify="between" align="center" gap="md">
29
- <div>Logo</div><div>Nav</div>
30
- </schmancy-flex>
31
- ```
11
+ Sets: `height: Npx`, `width: Npx`, `overflow: hidden`, `min-h/w: 0`, `box-sizing: border-box`, `padding-bottom` (safe area).
12
+ Does **not** set `display` or `grid-template-*` — use Tailwind classes on the same element.
32
13
 
33
- | Property | Type | Default |
34
- |----------|------|---------|
35
- | `flow` | `'row' \| 'row-reverse' \| 'col' \| 'col-reverse'` | `'col'` |
36
- | `wrap` | `'wrap' \| 'nowrap' \| 'wrap-reverse'` | `'wrap'` |
37
- | `align` | `'start' \| 'center' \| 'end' \| 'stretch' \| 'baseline'` | `'start'` |
38
- | `justify` | `'start' \| 'center' \| 'end' \| 'stretch' \| 'between'` | `'start'` |
39
- | `gap` | `'none' \| 'sm' \| 'md' \| 'lg'` | `'none'` |
40
-
41
- ## schmancy-scroll
42
- ```html
43
- <schmancy-scroll hide direction="vertical" name="main">
44
- <!-- long content -->
45
- </schmancy-scroll>
46
- ```
14
+ ## `overflowWithin()` contained scroll region
47
15
 
48
- | Property | Type | Default | Description |
49
- |----------|------|---------|-------------|
50
- | `hide` | boolean | `false` | Hide scrollbar in supported browsers |
51
- | `direction` | `'vertical' \| 'horizontal' \| 'both'` | `'both'` | Scroll axes |
52
- | `name` | string | — | Identifier for global scroll events |
53
- | `debounce` | number | — | Debounce time in ms for scroll events |
16
+ Sets: `overflow: auto`, `overscroll-behavior: contain`, `scroll-behavior: smooth`, `min-h/w: 0`, `box-sizing: border-box`.
54
17
 
55
- Smooth scroll-behavior, overscroll containment, and support for flex-shrink sizing.
18
+ ## Canonical shell
56
19
 
57
- ## sch-grid / sch-flex (v2)
20
+ ```typescript
21
+ // app-shell.view.ts
22
+ html`<schmancy-area ${fill()} name="root" .default=${...}>...</schmancy-area>`
23
+
24
+ // app-home.view.ts
25
+ html`
26
+ <my-shell class="grid grid-cols-[auto_1fr]" ${fill()}>
27
+ <app-rail></app-rail>
28
+ <div ${overflowWithin()} class="grid grid-rows-[auto_1fr] min-h-0">
29
+ <tree-picker></tree-picker>
30
+ <schmancy-area name="app" .default=${...}>...</schmancy-area>
31
+ </div>
32
+ </my-shell>
33
+ `
34
+ ```
35
+
36
+ ```css
37
+ /* styles.css */
38
+ html, body { margin: 0; padding: 0; overflow: hidden; }
39
+ ```
58
40
 
59
- Reflected-attribute variants optimized for styling via CSS selectors. Same prop model as the classic components with a `sch-` prefix. Use when you need to target the layout from parent CSS without Tailwind.
41
+ ## Rules
60
42
 
61
- ## Notes
62
- - All layout components extend the base `Layout` class which exposes pass-through CSS properties (padding, margin, width, position, border, etc.).
63
- - Prefer Tailwind (`class="flex items-center gap-2"`) for new code these components remain for consistent theme-driven gaps and rapid prototyping.
43
+ - One `fill()` per shell level. Inner levels get `min-h-0` grid cells.
44
+ - `overflowWithin()` goes on the element that should scroll, not on `:host`.
45
+ - Do not write `h-full`, `w-full`, or `:host { height: 100% }` anywhere. `schmancy-area`'s `::slotted` rule sizes mounted views.
46
+ - `<schmancy-page>` is removed — `fill()` replaces it.
@@ -8,11 +8,10 @@ factory — composing `LitElement` + Tailwind injection + `BaseElement`
8
8
  ## Usage
9
9
 
10
10
  ```typescript
11
- import { SchmancyElement } from '@mhmo91/schmancy/mixins'
12
- import { customElement } from 'lit/decorators.js'
11
+ import { SchmancyElement, schmancyElement } from '@mhmo91/schmancy/mixins'
13
12
  import { css, html } from 'lit'
14
13
 
15
- @customElement('my-component')
14
+ @schmancyElement('my-component')
16
15
  class MyComponent extends SchmancyElement {
17
16
  static styles = [css`
18
17
  :host { display: block }
@@ -33,12 +32,34 @@ declare global {
33
32
  No styles? Just drop `static styles`:
34
33
 
35
34
  ```typescript
36
- @customElement('my-component')
35
+ @schmancyElement('my-component')
37
36
  class MyComponent extends SchmancyElement {
38
37
  render() { return html`<slot></slot>` }
39
38
  }
40
39
  ```
41
40
 
41
+ ### Why `@schmancyElement` instead of Lit's `@customElement`
42
+
43
+ `@schmancyElement` wraps the class's prototype methods with the active-host
44
+ tracker BEFORE calling `customElements.define`. Lit's `@customElement` only
45
+ calls `define` — the wrap then runs inside the `SchmancyElement` constructor,
46
+ which is too late: per the HTML spec, the browser captures lifecycle callback
47
+ references off the prototype at `define` time and invokes those cached
48
+ references for every connect / disconnect.
49
+
50
+ If you use plain `@customElement` and read state inside `connectedCallback`,
51
+ the active-host stack is empty, the read falls through to `document.activeElement`,
52
+ misses the enclosing `<schmancy-context>`, and silently resolves to the
53
+ module-scoped global instead of the isolated copy. The constructor-time wrap
54
+ still catches `render`, class methods, and inherited lifecycle methods on
55
+ ancestor prototypes (the browser's cached reference for those is the
56
+ ancestor's, which gets wrapped by an earlier sibling). But your subclass's
57
+ own `connectedCallback` / `disconnectedCallback` overrides fall through.
58
+ The symptom is silent: writes go to the wrong slot, reads return the wrong
59
+ value, and the form looks broken for no obvious reason.
60
+
61
+ `@schmancyElement` makes this impossible. Use it as the default.
62
+
42
63
  Tailwind is injected automatically — your `static styles` only declares
43
64
  component-local CSS.
44
65
 
@@ -99,7 +120,7 @@ Every SchmancyElement responds to `{its-tag}-where-are-you` events with
99
120
  ## Component skeleton
100
121
 
101
122
  ```typescript
102
- @customElement('my-component')
123
+ @schmancyElement('my-component')
103
124
  export class MyComponent extends SchmancyElement {
104
125
  static styles = [css`:host { display: block }`]
105
126
 
@@ -132,17 +132,13 @@ export class SchmancyBadgeV2 extends SchmancyElement {
132
132
  * Get icon size based on badge size with harmonious proportions
133
133
  * Using golden ratio-inspired proportions relative to text size
134
134
  */
135
- private getIconSize(): string {
135
+ private getIconSizeClass(): string {
136
136
  switch (this.size) {
137
- case 'xs':
138
- return '11px' // Approximately 0.9 × text size (12px × 0.9)
139
- case 'sm':
140
- return '13px' // Approximately 1.1 × text size (12px × 1.1)
141
- case 'lg':
142
- return '18px' // Approximately 1.1 × text size (16px × 1.1)
137
+ case 'xs': return 'text-xs'
138
+ case 'sm': return 'text-sm'
139
+ case 'lg': return 'text-lg'
143
140
  case 'md':
144
- default:
145
- return '15px' // Approximately 1.1 × text size (14px × 1.1)
141
+ default: return 'text-sm'
146
142
  }
147
143
  }
148
144
 
@@ -219,7 +215,7 @@ export class SchmancyBadgeV2 extends SchmancyElement {
219
215
  const sizeClasses = this.getSizeClasses()
220
216
  const shapeClasses = this.getShapeClasses()
221
217
  const colorStyles = this.getColorStyles()
222
- const iconSize = this.getIconSize()
218
+ const iconSizeClass = this.getIconSizeClass()
223
219
  const exoticStyles = this.getExoticStyles()
224
220
 
225
221
  const badgeClasses = {
@@ -259,7 +255,7 @@ export class SchmancyBadgeV2 extends SchmancyElement {
259
255
  ${this.icon
260
256
  ? html`
261
257
  <div part="icon" class="shrink-0 flex items-center justify-center leading-none">
262
- <schmancy-icon .size=${iconSize} class="flex items-center justify-center">${this.icon}</schmancy-icon>
258
+ <schmancy-icon class="${iconSizeClass} flex items-center justify-center">${this.icon}</schmancy-icon>
263
259
  </div>
264
260
  `
265
261
  : ''}
@@ -235,8 +235,7 @@ export class SchmnacyIconButton extends SchmancyElement {
235
235
  'hover:bg-secondary-container': effectiveVariant === 'filled tonal',
236
236
  }
237
237
 
238
- // Icon size mapping - M3 spec: 24dp standard, scaled for density
239
- const iconSize = this.size === 'xxs' ? '12px' : this.size === 'xs' ? '16px' : this.size === 'sm' ? '20px' : this.size === 'md' ? '24px' : this.size === 'lg' ? '24px' : '40px';
238
+ const iconSizeClass = this.size === 'xxs' ? 'text-xs' : this.size === 'xs' ? 'text-base' : this.size === 'sm' ? 'text-xl' : this.size === 'md' ? 'text-2xl' : this.size === 'lg' ? 'text-2xl' : 'text-4xl';
240
239
 
241
240
  // If href is provided, render an anchor element.
242
241
  if (this.href) {
@@ -256,7 +255,7 @@ export class SchmnacyIconButton extends SchmancyElement {
256
255
  ? html`<slot></slot>`
257
256
  : html`
258
257
  <slot style="display:none" @slotchange=${this._handleSlotChange}></slot>
259
- <schmancy-icon size=${iconSize} icon=${ifDefined(this.icon || this._capturedIcon)}></schmancy-icon>
258
+ <schmancy-icon class=${iconSizeClass}>${this.icon || this._capturedIcon}</schmancy-icon>
260
259
  `
261
260
  }
262
261
  </a>
@@ -279,7 +278,7 @@ export class SchmnacyIconButton extends SchmancyElement {
279
278
  ? html`<slot></slot>`
280
279
  : html`
281
280
  <slot style="display:none" @slotchange=${this._handleSlotChange}></slot>
282
- <schmancy-icon size=${iconSize} icon=${ifDefined(this.icon || this._capturedIcon)}></schmancy-icon>
281
+ <schmancy-icon class=${iconSizeClass}>${this.icon || this._capturedIcon}</schmancy-icon>
283
282
  `
284
283
  }
285
284
  </button>
@@ -0,0 +1,95 @@
1
+ /**
2
+ * AI Badge Directive — Indicator for AI-generated content.
3
+ * Pulses gently on the host element; color routed through theme tokens.
4
+ */
5
+
6
+ import { noChange } from 'lit'
7
+ import { AsyncDirective, directive } from 'lit/async-directive.js'
8
+ import type { ElementPart } from 'lit'
9
+
10
+ interface State {
11
+ message: string
12
+ element: HTMLElement
13
+ badge: HTMLElement | null
14
+ animation: Animation | null
15
+ }
16
+
17
+ class AIBadgeDirective extends AsyncDirective {
18
+ private state: State | null = null
19
+
20
+ render(_message?: string) {
21
+ return noChange
22
+ }
23
+
24
+ override update(part: ElementPart, [message = '']: [string?]) {
25
+ const element = part.element as HTMLElement
26
+
27
+ if (!message) {
28
+ this.cleanup()
29
+ return noChange
30
+ }
31
+
32
+ if (this.state) return noChange
33
+
34
+ this.state = {
35
+ message,
36
+ element,
37
+ badge: null,
38
+ animation: null,
39
+ }
40
+
41
+ if (getComputedStyle(element).position === 'static') {
42
+ element.style.position = 'relative'
43
+ }
44
+
45
+ const badge = document.createElement('div')
46
+ badge.style.cssText = `
47
+ display: block;
48
+ position: absolute;
49
+ bottom: -8px;
50
+ left: 8px;
51
+ z-index: 10;
52
+ padding: 3px 10px;
53
+ border-radius: 12px;
54
+ font-size: 0.65rem;
55
+ font-weight: 600;
56
+ background: linear-gradient(
57
+ 135deg,
58
+ var(--md-sys-color-primary, #7c5cff),
59
+ var(--md-sys-color-primary-container, #6750a4)
60
+ );
61
+ color: var(--md-sys-color-on-primary, #fff);
62
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
63
+ white-space: nowrap;
64
+ `
65
+ badge.textContent = `✦ ${message}`
66
+ badge.title = message
67
+
68
+ element.appendChild(badge)
69
+ this.state.badge = badge
70
+
71
+ this.state.animation = badge.animate(
72
+ [
73
+ { transform: 'scale(1)' },
74
+ { transform: 'scale(1.03)' },
75
+ { transform: 'scale(1)' },
76
+ ],
77
+ { duration: 2000, easing: 'ease-in-out', iterations: Infinity },
78
+ )
79
+
80
+ return noChange
81
+ }
82
+
83
+ private cleanup(): void {
84
+ if (!this.state) return
85
+ this.state.animation?.cancel()
86
+ this.state.badge?.remove()
87
+ this.state = null
88
+ }
89
+
90
+ override disconnected(): void {
91
+ this.cleanup()
92
+ }
93
+ }
94
+
95
+ export const aiBadge = directive(AIBadgeDirective)
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Art Directive — GPU-accelerated decorative overlays.
3
+ * Lazy-initialised, IntersectionObserver-paused, RAF-driven, particle-pooled.
4
+ */
5
+
6
+ import type { ElementPart } from 'lit'
7
+ import { noChange } from 'lit'
8
+ import { AsyncDirective, directive } from 'lit/async-directive.js'
9
+
10
+ import type { ArtOptions, ArtState } from './types'
11
+ import { createFunkhausOverlay, animateFunkhaus } from './effects/funkhaus'
12
+ import { createSamwaOverlay, animateSamwa } from './effects/samwa'
13
+ import { createHowlOverlay, animateHowl } from './effects/howl'
14
+ import { createErrorOverlay, animateError } from './effects/error'
15
+ import { createSnowOverlay, animateSnow } from './effects/snow'
16
+ import { createStarfieldOverlay, animateStarfield } from './effects/starfield'
17
+
18
+ interface ExtendedArtState extends ArtState {
19
+ initialized: boolean
20
+ originalPosition: string
21
+ }
22
+
23
+ class ArtDirective extends AsyncDirective {
24
+ private state: ExtendedArtState | null = null
25
+
26
+ render(_options: ArtOptions) {
27
+ return noChange
28
+ }
29
+
30
+ override update(part: ElementPart, [options]: [ArtOptions]) {
31
+ const element = part.element as HTMLElement
32
+ const { name, color, intensity = 1, speed = 1 } = options
33
+
34
+ if (
35
+ this.state &&
36
+ (this.state.effect !== name ||
37
+ this.state.color !== color ||
38
+ this.state.intensity !== intensity ||
39
+ this.state.speed !== speed)
40
+ ) {
41
+ this.cleanup()
42
+ }
43
+
44
+ if (!this.state) {
45
+ const originalPosition = element.style.position
46
+
47
+ this.state = {
48
+ effect: name,
49
+ color,
50
+ intensity,
51
+ speed,
52
+ element,
53
+ isVisible: true,
54
+ initialized: false,
55
+ originalPosition,
56
+ }
57
+
58
+ requestAnimationFrame(() => {
59
+ if (!this.state) return
60
+
61
+ const rect = element.getBoundingClientRect()
62
+ const isVisible =
63
+ rect.top < window.innerHeight && rect.bottom > 0 && rect.left < window.innerWidth && rect.right > 0
64
+
65
+ if (!isVisible) {
66
+ this.state.isVisible = false
67
+ this.setupVisibilityObserver()
68
+ return
69
+ }
70
+
71
+ this.initializeResources()
72
+ this.startAnimation()
73
+ this.setupVisibilityObserver()
74
+ })
75
+ }
76
+
77
+ return noChange
78
+ }
79
+
80
+ private initializeResources(): void {
81
+ if (!this.state || this.state.initialized) return
82
+
83
+ const { element, effect: name } = this.state
84
+
85
+ const computedStyle = getComputedStyle(element)
86
+ if (computedStyle.position === 'static') {
87
+ element.style.position = 'relative'
88
+ }
89
+
90
+ switch (name) {
91
+ case 'funkhaus':
92
+ createFunkhausOverlay(this.state)
93
+ break
94
+ case 'samwa':
95
+ createSamwaOverlay(this.state)
96
+ break
97
+ case 'howl':
98
+ createHowlOverlay(this.state)
99
+ break
100
+ case 'error':
101
+ createErrorOverlay(this.state)
102
+ break
103
+ case 'snow':
104
+ createSnowOverlay(this.state)
105
+ break
106
+ case 'starfield':
107
+ createStarfieldOverlay(this.state)
108
+ break
109
+ }
110
+
111
+ this.state.initialized = true
112
+ }
113
+
114
+ private setupVisibilityObserver(): void {
115
+ if (!this.state || typeof IntersectionObserver === 'undefined') return
116
+
117
+ this.state.observer = new IntersectionObserver(
118
+ entries => {
119
+ if (!this.state) return
120
+ const isVisible = entries[0].isIntersecting
121
+
122
+ if (isVisible && !this.state.isVisible) {
123
+ this.state.isVisible = true
124
+
125
+ if (!this.state.initialized) {
126
+ this.initializeResources()
127
+ }
128
+
129
+ this.startAnimation()
130
+ } else if (!isVisible && this.state.isVisible) {
131
+ this.state.isVisible = false
132
+ if (this.state.animationId) {
133
+ cancelAnimationFrame(this.state.animationId)
134
+ this.state.animationId = undefined
135
+ }
136
+ }
137
+ },
138
+ { threshold: 0 },
139
+ )
140
+
141
+ this.state.observer.observe(this.state.element)
142
+ }
143
+
144
+ private startAnimation(): void {
145
+ if (!this.state || !this.state.isVisible) return
146
+ if (this.state.animationId) return
147
+
148
+ if (!this.state.initialized) {
149
+ this.initializeResources()
150
+ }
151
+
152
+ const animate = (currentTime: number) => {
153
+ if (!this.state || !this.state.isVisible) {
154
+ if (this.state) this.state.animationId = undefined
155
+ return
156
+ }
157
+
158
+ switch (this.state.effect) {
159
+ case 'funkhaus':
160
+ animateFunkhaus(this.state, currentTime)
161
+ break
162
+ case 'samwa':
163
+ animateSamwa(this.state, currentTime)
164
+ break
165
+ case 'howl':
166
+ animateHowl(this.state, currentTime)
167
+ break
168
+ case 'error':
169
+ animateError(this.state, currentTime)
170
+ break
171
+ case 'snow':
172
+ animateSnow(this.state, currentTime)
173
+ break
174
+ case 'starfield':
175
+ animateStarfield(this.state, currentTime)
176
+ break
177
+ }
178
+
179
+ this.state.animationId = requestAnimationFrame(animate)
180
+ }
181
+
182
+ this.state.animationId = requestAnimationFrame(animate)
183
+ }
184
+
185
+ private cleanup(): void {
186
+ if (!this.state) return
187
+
188
+ if (this.state.animationId) {
189
+ cancelAnimationFrame(this.state.animationId)
190
+ }
191
+
192
+ if (this.state.observer) {
193
+ this.state.observer.disconnect()
194
+ }
195
+
196
+ if (this.state.samwa) {
197
+ this.state.samwa.leafPool.clear()
198
+ }
199
+
200
+ if (this.state.howl) {
201
+ this.state.howl.steamPool.clear()
202
+ }
203
+
204
+ if (this.state.error) {
205
+ this.state.error.boltPool.clear()
206
+ }
207
+
208
+ if (this.state.snow) {
209
+ this.state.snow.snowflakePool.clear()
210
+ }
211
+
212
+ if (this.state.overlayElement) {
213
+ this.state.overlayElement.remove()
214
+ }
215
+
216
+ if (this.state.originalPosition !== undefined) {
217
+ this.state.element.style.position = this.state.originalPosition
218
+ }
219
+
220
+ this.state = null
221
+ }
222
+
223
+ override disconnected(): void {
224
+ this.cleanup()
225
+ }
226
+ }
227
+
228
+ export const art = directive(ArtDirective)