@mhmo91/schmancy 0.10.24 → 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 (426) hide show
  1. package/dist/agent/{overlay.confirm-body-CvdVfCnN.js → overlay.confirm-body-DozUyDYx.js} +242 -242
  2. package/dist/agent/{overlay.confirm-body-CvdVfCnN.js.map → overlay.confirm-body-DozUyDYx.js.map} +1 -1
  3. package/dist/agent/schmancy.agent.js +5658 -2927
  4. package/dist/agent/schmancy.agent.js.map +1 -1
  5. package/dist/{area-A_oUP4P1.js → area-1EG1LrkX.js} +1 -1
  6. package/dist/{area-A_oUP4P1.js.map → area-1EG1LrkX.js.map} +1 -1
  7. package/dist/{area-BuqdaUpQ.cjs → area-DrVE5pXW.cjs} +1 -1
  8. package/dist/{area-BuqdaUpQ.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-Cy46gJxK.cjs → autocomplete-6pdZxEab.cjs} +1 -1
  12. package/dist/{autocomplete-Cy46gJxK.cjs.map → autocomplete-6pdZxEab.cjs.map} +1 -1
  13. package/dist/{autocomplete-BoCWO26L.js → autocomplete-nrIcCilw.js} +2 -2
  14. package/dist/{autocomplete-BoCWO26L.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-B0h5fuAA.js → boat--fLgbDAE.js} +3 -3
  23. package/dist/{boat-B0h5fuAA.js.map → boat--fLgbDAE.js.map} +1 -1
  24. package/dist/{boat-RRtBhD3x.cjs → boat-BIB-gPqy.cjs} +1 -1
  25. package/dist/{boat-RRtBhD3x.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-Bn6Pioo8.cjs → busy-DVCIxBVf.cjs} +1 -1
  31. package/dist/{busy-Bn6Pioo8.cjs.map → busy-DVCIxBVf.cjs.map} +1 -1
  32. package/dist/{busy-DObY7lfu.js → busy-DshZcVZ4.js} +1 -1
  33. package/dist/{busy-DObY7lfu.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-DEi3M2nV.js → button-D9UJ7I6Z.js} +2 -2
  37. package/dist/{button-DEi3M2nV.js.map → button-D9UJ7I6Z.js.map} +1 -1
  38. package/dist/{button-XfdPzfZQ.cjs → button-JrTMzwHY.cjs} +1 -1
  39. package/dist/{button-XfdPzfZQ.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-jzUQK0EQ.js → card-BvCFuX3J.js} +2 -2
  43. package/dist/{card-jzUQK0EQ.js.map → card-BvCFuX3J.js.map} +1 -1
  44. package/dist/{card-BjUgRzFh.cjs → card-CTotavhH.cjs} +1 -1
  45. package/dist/{card-BjUgRzFh.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-rskgUBxQ.cjs → checkbox-By4fFmjt.cjs} +1 -1
  49. package/dist/{checkbox-rskgUBxQ.cjs.map → checkbox-By4fFmjt.cjs.map} +1 -1
  50. package/dist/{checkbox-CfCm1vGN.js → checkbox-GPsdCUbs.js} +1 -1
  51. package/dist/{checkbox-CfCm1vGN.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-Dfim_tQv.js → chips-27umqnat.js} +4 -4
  55. package/dist/{chips-Dfim_tQv.js.map → chips-27umqnat.js.map} +1 -1
  56. package/dist/{chips-BiNZKu0J.cjs → chips-BZf9sGA8.cjs} +1 -1
  57. package/dist/{chips-BiNZKu0J.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-em7OwhlK.cjs → date-range-BJnLWCRF.cjs} +1 -1
  69. package/dist/{date-range-em7OwhlK.cjs.map → date-range-BJnLWCRF.cjs.map} +1 -1
  70. package/dist/{date-range-inline-DYeqoBIO.cjs → date-range-inline-B6uKUliV.cjs} +1 -1
  71. package/dist/{date-range-inline-DYeqoBIO.cjs.map → date-range-inline-B6uKUliV.cjs.map} +1 -1
  72. package/dist/{date-range-inline-BfUL8_vX.js → date-range-inline-BNbbRfIA.js} +1 -1
  73. package/dist/{date-range-inline-BfUL8_vX.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-B8zoj6Cj.js → date-range-wDVHcr0u.js} +2 -2
  77. package/dist/{date-range-B8zoj6Cj.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-D246xN83.js → details-Ckxpwacj.js} +4 -4
  83. package/dist/{details-D246xN83.js.map → details-Ckxpwacj.js.map} +1 -1
  84. package/dist/{details-CNM1tuma.cjs → details-DNrWIes6.cjs} +1 -1
  85. package/dist/{details-CNM1tuma.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-CbIp1je9.js → divider-BzcZGo4S.js} +1 -1
  101. package/dist/{divider-CbIp1je9.js.map → divider-BzcZGo4S.js.map} +1 -1
  102. package/dist/{divider-DaKsGNW-.cjs → divider-Cde33ivs.cjs} +1 -1
  103. package/dist/{divider-DaKsGNW-.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-DRkiO4vw.js → expand-DI144OzN.js} +3 -3
  109. package/dist/{expand-DRkiO4vw.js.map → expand-DI144OzN.js.map} +1 -1
  110. package/dist/{expand-CQDm3BF3.cjs → expand-Db4V0jj-.cjs} +1 -1
  111. package/dist/{expand-CQDm3BF3.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-5O26zNRh.cjs → float--RScf9BZ.cjs} +1 -1
  115. package/dist/{float-5O26zNRh.cjs.map → float--RScf9BZ.cjs.map} +1 -1
  116. package/dist/{float-CZtu8FnO.js → float-DIyzy1c2.js} +1 -1
  117. package/dist/{float-CZtu8FnO.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-B90CMeqs.cjs → form-DWNpOsIU.cjs} +1 -1
  121. package/dist/{form-B90CMeqs.cjs.map → form-DWNpOsIU.cjs.map} +1 -1
  122. package/dist/{form-CE6Gwz4r.js → form-RtXH8UHQ.js} +8 -8
  123. package/dist/{form-CE6Gwz4r.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-D98csbEo.cjs → iframe-B1XWRaLC.cjs} +1 -1
  137. package/dist/{iframe-D98csbEo.cjs.map → iframe-B1XWRaLC.cjs.map} +1 -1
  138. package/dist/{iframe-C3PMj1MD.js → iframe-BlHK0cjy.js} +1 -1
  139. package/dist/{iframe-C3PMj1MD.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-_y92Pzon.cjs → input-C-_XU9AX.cjs} +1 -1
  145. package/dist/{input-_y92Pzon.cjs.map → input-C-_XU9AX.cjs.map} +1 -1
  146. package/dist/{input-CCOkeeVM.js → input-CiGa8Dkl.js} +1 -1
  147. package/dist/{input-CCOkeeVM.js.map → input-CiGa8Dkl.js.map} +1 -1
  148. package/dist/{input-chip-CR66MWml.cjs → input-chip-5aYnuRZ_.cjs} +1 -1
  149. package/dist/{input-chip-CR66MWml.cjs.map → input-chip-5aYnuRZ_.cjs.map} +1 -1
  150. package/dist/{input-chip-Bzwr5-XL.js → input-chip-l--zCMGR.js} +1 -1
  151. package/dist/{input-chip-Bzwr5-XL.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 +1 -1
  155. package/dist/json.js +2 -2
  156. package/dist/kbd.cjs +1 -1
  157. package/dist/kbd.js +1 -1
  158. package/dist/{layout-Dq2oeOTS.js → layout-DSAjo92m.js} +1 -1
  159. package/dist/{layout-Dq2oeOTS.js.map → layout-DSAjo92m.js.map} +1 -1
  160. package/dist/{layout-BbCIfIgo.cjs → layout-eXb9wjDh.cjs} +1 -1
  161. package/dist/{layout-BbCIfIgo.cjs.map → layout-eXb9wjDh.cjs.map} +1 -1
  162. package/dist/layout.cjs +1 -1
  163. package/dist/layout.js +1 -1
  164. package/dist/{lightbox-Bk3ovcVu.cjs → lightbox-CfRDkeeb.cjs} +2 -2
  165. package/dist/{lightbox-Bk3ovcVu.cjs.map → lightbox-CfRDkeeb.cjs.map} +1 -1
  166. package/dist/{lightbox-Dl--fEbP.js → lightbox-D9oiu1Nv.js} +2 -2
  167. package/dist/{lightbox-Dl--fEbP.js.map → lightbox-D9oiu1Nv.js.map} +1 -1
  168. package/dist/lightbox.cjs +1 -1
  169. package/dist/lightbox.js +1 -1
  170. package/dist/{list-B3WI_Nfs.js → list-BOlRka4v.js} +1 -1
  171. package/dist/{list-B3WI_Nfs.js.map → list-BOlRka4v.js.map} +1 -1
  172. package/dist/{list-DWngbP2X.cjs → list-CDJi3_Ut.cjs} +1 -1
  173. package/dist/{list-DWngbP2X.cjs.map → list-CDJi3_Ut.cjs.map} +1 -1
  174. package/dist/list.cjs +1 -1
  175. package/dist/list.js +1 -1
  176. package/dist/{magnetic-Bgh7aHHI.cjs → magnetic-D-ph029G.cjs} +1 -1
  177. package/dist/{magnetic-Bgh7aHHI.cjs.map → magnetic-D-ph029G.cjs.map} +1 -1
  178. package/dist/{magnetic-DxvoEz8_.js → magnetic-mHXl54Z8.js} +1 -1
  179. package/dist/{magnetic-DxvoEz8_.js.map → magnetic-mHXl54Z8.js.map} +1 -1
  180. package/dist/{menu-CdYjxJqm.cjs → menu-CJaDL2cd.cjs} +1 -1
  181. package/dist/{menu-CdYjxJqm.cjs.map → menu-CJaDL2cd.cjs.map} +1 -1
  182. package/dist/{menu-IDhVp6zm.js → menu-XyrLmCi_.js} +2 -2
  183. package/dist/{menu-IDhVp6zm.js.map → menu-XyrLmCi_.js.map} +1 -1
  184. package/dist/menu.cjs +1 -1
  185. package/dist/menu.js +1 -1
  186. package/dist/mixins-CsYsIJOI.cjs +254 -0
  187. package/dist/mixins-CsYsIJOI.cjs.map +1 -0
  188. package/dist/mixins-DySzfmal.js +642 -0
  189. package/dist/mixins-DySzfmal.js.map +1 -0
  190. package/dist/mixins.cjs +1 -1
  191. package/dist/mixins.js +2 -2
  192. package/dist/nav-drawer.cjs +1 -1
  193. package/dist/nav-drawer.js +1 -1
  194. package/dist/navigation-bar.cjs +1 -1
  195. package/dist/navigation-bar.js +1 -1
  196. package/dist/navigation-rail.cjs +5 -9
  197. package/dist/navigation-rail.cjs.map +1 -1
  198. package/dist/navigation-rail.js +5 -11
  199. package/dist/navigation-rail.js.map +1 -1
  200. package/dist/{notification-CllYkvlR.js → notification-CHrEY4u8.js} +2 -2
  201. package/dist/{notification-CllYkvlR.js.map → notification-CHrEY4u8.js.map} +1 -1
  202. package/dist/{notification-B3wVUC8l.cjs → notification-DKp4tjaB.cjs} +1 -1
  203. package/dist/{notification-B3wVUC8l.cjs.map → notification-DKp4tjaB.cjs.map} +1 -1
  204. package/dist/notification.cjs +1 -1
  205. package/dist/notification.js +1 -1
  206. package/dist/{option-CPOL0nHL.js → option-Vpy4UQ-D.js} +1 -1
  207. package/dist/{option-CPOL0nHL.js.map → option-Vpy4UQ-D.js.map} +1 -1
  208. package/dist/{option-cRsdshy8.cjs → option-nRk4MuXH.cjs} +1 -1
  209. package/dist/{option-cRsdshy8.cjs.map → option-nRk4MuXH.cjs.map} +1 -1
  210. package/dist/option.cjs +1 -1
  211. package/dist/option.js +1 -1
  212. package/dist/{overlay-BnTvnNDc.cjs → overlay-HNrWZ4sB.cjs} +1 -1
  213. package/dist/{overlay-BnTvnNDc.cjs.map → overlay-HNrWZ4sB.cjs.map} +1 -1
  214. package/dist/{overlay-DJ-vlwtR.js → overlay-jlkcrt8F.js} +5 -5
  215. package/dist/{overlay-DJ-vlwtR.js.map → overlay-jlkcrt8F.js.map} +1 -1
  216. package/dist/{overlay-stack-Dk0xETTy.cjs.map → overlay-stack-Bdr9lOqi.cjs.map} +1 -1
  217. package/dist/{overlay-stack-BR4iYivO.js.map → overlay-stack-D2rgxQLh.js.map} +1 -1
  218. package/dist/overlay.cjs +1 -1
  219. package/dist/{overlay.confirm-body-CQ-FwySO.cjs → overlay.confirm-body-B8dFI3cj.cjs} +1 -1
  220. package/dist/{overlay.confirm-body-CQ-FwySO.cjs.map → overlay.confirm-body-B8dFI3cj.cjs.map} +1 -1
  221. package/dist/{overlay.confirm-body-DEb9xw5N.js → overlay.confirm-body-CYShkjI6.js} +1 -1
  222. package/dist/{overlay.confirm-body-DEb9xw5N.js.map → overlay.confirm-body-CYShkjI6.js.map} +1 -1
  223. package/dist/overlay.js +3 -3
  224. package/dist/{overlay.service-CKBCIP2f.cjs → overlay.service-BTPn7Uv7.cjs} +1 -1
  225. package/dist/{overlay.service-CKBCIP2f.cjs.map → overlay.service-BTPn7Uv7.cjs.map} +1 -1
  226. package/dist/{overlay.service-XM1YHkTk.js → overlay.service-BqhhxVJp.js} +2 -2
  227. package/dist/{overlay.service-XM1YHkTk.js.map → overlay.service-BqhhxVJp.js.map} +1 -1
  228. package/dist/{progress-CnMPp-9a.js → progress-8Bn88GK_.js} +1 -1
  229. package/dist/{progress-CnMPp-9a.js.map → progress-8Bn88GK_.js.map} +1 -1
  230. package/dist/{progress-CcfLfHOE.cjs → progress-CAp_4jtq.cjs} +1 -1
  231. package/dist/{progress-CcfLfHOE.cjs.map → progress-CAp_4jtq.cjs.map} +1 -1
  232. package/dist/progress.cjs +1 -1
  233. package/dist/progress.js +1 -1
  234. package/dist/{radio-group-D97hflrE.cjs → radio-group-CN44mAoc.cjs} +1 -1
  235. package/dist/{radio-group-D97hflrE.cjs.map → radio-group-CN44mAoc.cjs.map} +1 -1
  236. package/dist/{radio-group-BUJgfQFi.js → radio-group-GNHA7qJR.js} +1 -1
  237. package/dist/{radio-group-BUJgfQFi.js.map → radio-group-GNHA7qJR.js.map} +1 -1
  238. package/dist/radio-group.cjs +1 -1
  239. package/dist/radio-group.js +1 -1
  240. package/dist/range.cjs +1 -1
  241. package/dist/range.js +1 -1
  242. package/dist/{reduced-motion-D7LqTUMn.js.map → reduced-motion-D-L12p7G.js.map} +1 -1
  243. package/dist/{reduced-motion-Dzfp_w5x.cjs.map → reduced-motion-Ds-HjMzn.cjs.map} +1 -1
  244. package/dist/{rxjs-utils-BK8VMe3K.js.map → rxjs-utils-BXpvHN4-.js.map} +1 -1
  245. package/dist/{rxjs-utils-DhOKenkS.cjs.map → rxjs-utils-CaC-tdot.cjs.map} +1 -1
  246. package/dist/rxjs-utils.cjs +1 -1
  247. package/dist/rxjs-utils.js +1 -1
  248. package/dist/{select-BWEh5nRM.js → select-BnuXRHS4.js} +3 -3
  249. package/dist/{select-BWEh5nRM.js.map → select-BnuXRHS4.js.map} +1 -1
  250. package/dist/{select-Cv5Oev6d.cjs → select-DZNns5Pa.cjs} +2 -2
  251. package/dist/{select-Cv5Oev6d.cjs.map → select-DZNns5Pa.cjs.map} +1 -1
  252. package/dist/select.cjs +1 -1
  253. package/dist/select.js +1 -1
  254. package/dist/skeleton.cjs +1 -1
  255. package/dist/skeleton.js +1 -1
  256. package/dist/skills/INDEX.md +2 -1
  257. package/dist/skills/SKILL.md +33 -23
  258. package/dist/skills/area.md +5 -4
  259. package/dist/skills/connectivity.md +1 -3
  260. package/dist/skills/directives.md +36 -0
  261. package/dist/skills/icons.md +95 -31
  262. package/dist/skills/layout.md +36 -53
  263. package/dist/skills/mixins.md +26 -5
  264. package/dist/skills/schmancy/INDEX.md +2 -1
  265. package/dist/skills/schmancy/SKILL.md +33 -23
  266. package/dist/skills/schmancy/area.md +5 -4
  267. package/dist/skills/schmancy/connectivity.md +1 -3
  268. package/dist/skills/schmancy/directives.md +36 -0
  269. package/dist/skills/schmancy/icons.md +95 -31
  270. package/dist/skills/schmancy/layout.md +36 -53
  271. package/dist/skills/schmancy/mixins.md +26 -5
  272. package/dist/slider.cjs +1 -1
  273. package/dist/slider.js +1 -1
  274. package/dist/{splash-screen-B6w7X2z9.js → splash-screen-CUP_elaT.js} +1 -1
  275. package/dist/{splash-screen-B6w7X2z9.js.map → splash-screen-CUP_elaT.js.map} +1 -1
  276. package/dist/{splash-screen-DFtxtO2D.cjs → splash-screen-DeoPRrOu.cjs} +1 -1
  277. package/dist/{splash-screen-DFtxtO2D.cjs.map → splash-screen-DeoPRrOu.cjs.map} +1 -1
  278. package/dist/splash-screen.cjs +1 -1
  279. package/dist/splash-screen.js +1 -1
  280. package/dist/{src-D_NK-vMA.js → src-B1VkLX3l.js} +153 -153
  281. package/dist/{src-D_NK-vMA.js.map → src-B1VkLX3l.js.map} +1 -1
  282. package/dist/{src-Asw6A018.cjs → src-DQ4wr0qq.cjs} +13 -13
  283. package/dist/{src-Asw6A018.cjs.map → src-DQ4wr0qq.cjs.map} +1 -1
  284. package/dist/steps.cjs +1 -1
  285. package/dist/steps.js +1 -1
  286. package/dist/{surface-B94ka2LY.cjs → surface-LkaZQXZn.cjs} +1 -1
  287. package/dist/{surface-B94ka2LY.cjs.map → surface-LkaZQXZn.cjs.map} +1 -1
  288. package/dist/{surface-ctBcRGSZ.js → surface-hOvkrjGN.js} +1 -1
  289. package/dist/{surface-ctBcRGSZ.js.map → surface-hOvkrjGN.js.map} +1 -1
  290. package/dist/surface.cjs +1 -1
  291. package/dist/surface.js +1 -1
  292. package/dist/switch.cjs +1 -1
  293. package/dist/switch.js +1 -1
  294. package/dist/table.cjs +1 -1
  295. package/dist/table.js +1 -1
  296. package/dist/{tabs-CrMx5z_y.js → tabs-CfwIHhHo.js} +1 -1
  297. package/dist/{tabs-CrMx5z_y.js.map → tabs-CfwIHhHo.js.map} +1 -1
  298. package/dist/{tabs-B7kaZIom.cjs → tabs-bplzstz6.cjs} +1 -1
  299. package/dist/{tabs-B7kaZIom.cjs.map → tabs-bplzstz6.cjs.map} +1 -1
  300. package/dist/tabs.cjs +1 -1
  301. package/dist/tabs.js +1 -1
  302. package/dist/teleport.cjs +1 -1
  303. package/dist/teleport.js +1 -1
  304. package/dist/{textarea-DeHFl80i.js → textarea-C1A5xuw9.js} +1 -1
  305. package/dist/{textarea-DeHFl80i.js.map → textarea-C1A5xuw9.js.map} +1 -1
  306. package/dist/{textarea-D1crj8JD.cjs → textarea-hrDp5gQq.cjs} +1 -1
  307. package/dist/{textarea-D1crj8JD.cjs.map → textarea-hrDp5gQq.cjs.map} +1 -1
  308. package/dist/textarea.cjs +1 -1
  309. package/dist/textarea.js +1 -1
  310. package/dist/{theme-C7Yo33nh.js → theme-BniFOMEo.js} +3 -3
  311. package/dist/{theme-C7Yo33nh.js.map → theme-BniFOMEo.js.map} +1 -1
  312. package/dist/{theme-wE2N7Yu9.cjs → theme-DmR6PKV8.cjs} +2 -2
  313. package/dist/{theme-wE2N7Yu9.cjs.map → theme-DmR6PKV8.cjs.map} +1 -1
  314. package/dist/{theme-button-Cpc_hs2O.js → theme-button--ruZIb0T.js} +1 -1
  315. package/dist/{theme-button-Cpc_hs2O.js.map → theme-button--ruZIb0T.js.map} +1 -1
  316. package/dist/{theme-button-CXSM5We4.cjs → theme-button-a0LgZ7hQ.cjs} +1 -1
  317. package/dist/{theme-button-CXSM5We4.cjs.map → theme-button-a0LgZ7hQ.cjs.map} +1 -1
  318. package/dist/theme-button.cjs +1 -1
  319. package/dist/theme-button.js +1 -1
  320. package/dist/theme.cjs +1 -1
  321. package/dist/{theme.interface-D4NeufQA.cjs.map → theme.interface-B5xjEk74.cjs.map} +1 -1
  322. package/dist/{theme.interface-C2XNgsLB.js.map → theme.interface-DVEw3s8m.js.map} +1 -1
  323. package/dist/theme.js +4 -4
  324. package/dist/{theme.service-CSzNkqBB.js.map → theme.service-Bh08uOSJ.js.map} +1 -1
  325. package/dist/{theme.service-CnFUmUpc.cjs.map → theme.service-Y-e8b331.cjs.map} +1 -1
  326. package/dist/tree.cjs +1 -1
  327. package/dist/tree.js +1 -1
  328. package/dist/typography.cjs +1 -1
  329. package/dist/typography.js +1 -1
  330. package/dist/{utils-Cxg0Kfy5.js → utils-578eFTx4.js} +1 -1
  331. package/dist/{utils-Cxg0Kfy5.js.map → utils-578eFTx4.js.map} +1 -1
  332. package/dist/{utils-aCJYAGUr.cjs → utils-CVWUrECT.cjs} +1 -1
  333. package/dist/{utils-aCJYAGUr.cjs.map → utils-CVWUrECT.cjs.map} +1 -1
  334. package/dist/utils.cjs +1 -1
  335. package/dist/utils.js +2 -2
  336. package/dist/visually-hidden.cjs +1 -1
  337. package/dist/visually-hidden.js +1 -1
  338. package/dist/{window-JtkeHoxS.js → window-BT9JecWy.js} +5 -5
  339. package/dist/{window-JtkeHoxS.js.map → window-BT9JecWy.js.map} +1 -1
  340. package/dist/{window-Ck_zS4bb.cjs → window-Bp7zWZpu.cjs} +1 -1
  341. package/dist/{window-Ck_zS4bb.cjs.map → window-Bp7zWZpu.cjs.map} +1 -1
  342. package/dist/window.cjs +1 -1
  343. package/dist/window.js +1 -1
  344. package/package.json +1 -1
  345. package/skills/schmancy/INDEX.md +2 -1
  346. package/skills/schmancy/SKILL.md +33 -23
  347. package/skills/schmancy/area.md +5 -4
  348. package/skills/schmancy/connectivity.md +1 -3
  349. package/skills/schmancy/directives.md +36 -0
  350. package/skills/schmancy/icons.md +95 -31
  351. package/skills/schmancy/layout.md +36 -53
  352. package/skills/schmancy/mixins.md +26 -5
  353. package/src/directives/ai-badge.ts +95 -0
  354. package/src/directives/art/art.directive.ts +228 -0
  355. package/src/directives/art/effects/error.ts +192 -0
  356. package/src/directives/art/effects/funkhaus.ts +121 -0
  357. package/src/directives/art/effects/howl.ts +203 -0
  358. package/src/directives/art/effects/samwa.ts +228 -0
  359. package/src/directives/art/effects/snow.ts +207 -0
  360. package/src/directives/art/effects/starfield.ts +107 -0
  361. package/src/directives/art/index.ts +2 -0
  362. package/src/directives/art/particle-pool.ts +40 -0
  363. package/src/directives/art/types.ts +129 -0
  364. package/src/directives/art/utils.ts +35 -0
  365. package/src/directives/battery.ts +1014 -0
  366. package/src/directives/beta.ts +44 -0
  367. package/src/directives/fill.ts +32 -60
  368. package/src/directives/fyi.ts +551 -0
  369. package/src/directives/hummingbird.ts +1712 -0
  370. package/src/directives/index.ts +9 -0
  371. package/src/directives/missed-punch.ts +407 -0
  372. package/src/directives/urgent.ts +660 -0
  373. package/src/directives/working-snake.ts +294 -0
  374. package/src/icons/icon.ts +53 -30
  375. package/src/navigation-rail/navigation-rail-item.ts +7 -12
  376. package/src/navigation-rail/navigation-rail.ts +0 -2
  377. package/types/mixins/SchmancyElement.d.ts +31 -0
  378. package/types/src/directives/ai-badge.d.ts +15 -0
  379. package/types/src/directives/art/art.directive.d.ts +19 -0
  380. package/types/src/directives/art/effects/error.d.ts +7 -0
  381. package/types/src/directives/art/effects/funkhaus.d.ts +7 -0
  382. package/types/src/directives/art/effects/howl.d.ts +7 -0
  383. package/types/src/directives/art/effects/samwa.d.ts +7 -0
  384. package/types/src/directives/art/effects/snow.d.ts +7 -0
  385. package/types/src/directives/art/effects/starfield.d.ts +10 -0
  386. package/types/src/directives/art/index.d.ts +2 -0
  387. package/types/src/directives/art/particle-pool.d.ts +16 -0
  388. package/types/src/directives/art/types.d.ts +126 -0
  389. package/types/src/directives/art/utils.d.ts +5 -0
  390. package/types/src/directives/battery.d.ts +96 -0
  391. package/types/src/directives/beta.d.ts +33 -0
  392. package/types/src/directives/fill.d.ts +4 -11
  393. package/types/src/directives/fyi.d.ts +76 -0
  394. package/types/src/directives/hummingbird.d.ts +180 -0
  395. package/types/src/directives/index.d.ts +9 -0
  396. package/types/src/directives/missed-punch.d.ts +28 -0
  397. package/types/src/directives/urgent.d.ts +88 -0
  398. package/types/src/directives/working-snake.d.ts +46 -0
  399. package/types/src/icons/icon.d.ts +22 -0
  400. package/dist/directives.cjs.map +0 -1
  401. package/dist/directives.js.map +0 -1
  402. package/dist/discovery.cjs.map +0 -1
  403. package/dist/discovery.js.map +0 -1
  404. package/dist/icons-B7ppo07M.cjs +0 -33
  405. package/dist/icons-B7ppo07M.cjs.map +0 -1
  406. package/dist/icons-CGhozJ5v.js +0 -48
  407. package/dist/icons-CGhozJ5v.js.map +0 -1
  408. package/dist/mixins-BPUR4Kc4.cjs +0 -254
  409. package/dist/mixins-BPUR4Kc4.cjs.map +0 -1
  410. package/dist/mixins-C42OILRS.js +0 -636
  411. package/dist/mixins-C42OILRS.js.map +0 -1
  412. package/dist/skills/page.md +0 -84
  413. package/dist/skills/schmancy/page.md +0 -84
  414. package/skills/schmancy/page.md +0 -84
  415. /package/dist/{hashContent-dJrI-9sc.js → hashContent-Dgmzc32o.js} +0 -0
  416. /package/dist/{hashContent-Ck6laKlk.cjs → hashContent-Dh1VzIAb.cjs} +0 -0
  417. /package/dist/{overlay-stack-Dk0xETTy.cjs → overlay-stack-Bdr9lOqi.cjs} +0 -0
  418. /package/dist/{overlay-stack-BR4iYivO.js → overlay-stack-D2rgxQLh.js} +0 -0
  419. /package/dist/{reduced-motion-D7LqTUMn.js → reduced-motion-D-L12p7G.js} +0 -0
  420. /package/dist/{reduced-motion-Dzfp_w5x.cjs → reduced-motion-Ds-HjMzn.cjs} +0 -0
  421. /package/dist/{rxjs-utils-BK8VMe3K.js → rxjs-utils-BXpvHN4-.js} +0 -0
  422. /package/dist/{rxjs-utils-DhOKenkS.cjs → rxjs-utils-CaC-tdot.cjs} +0 -0
  423. /package/dist/{theme.interface-D4NeufQA.cjs → theme.interface-B5xjEk74.cjs} +0 -0
  424. /package/dist/{theme.interface-C2XNgsLB.js → theme.interface-DVEw3s8m.js} +0 -0
  425. /package/dist/{theme.service-CSzNkqBB.js → theme.service-Bh08uOSJ.js} +0 -0
  426. /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
 
@@ -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)
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Error Effect — Electrical/warning glow on edges with static particles and lightning bolts.
3
+ * 2.5-second main pulse cycle.
4
+ */
5
+
6
+ import type { ArtState } from '../types'
7
+ import { ParticlePool } from '../particle-pool'
8
+ import { createOverlayContainer, createSVG } from '../utils'
9
+
10
+ export function createErrorOverlay(state: ArtState): void {
11
+ const { element, color } = state
12
+ const overlay = createOverlayContainer('error-overlay')
13
+ const svg = createSVG()
14
+
15
+ const edgeGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g')
16
+ const edges = [
17
+ { x: 0, y: 0, width: 100, height: 0.5 },
18
+ { x: 0, y: 99.5, width: 100, height: 0.5 },
19
+ { x: 0, y: 0, width: 0.5, height: 100 },
20
+ { x: 99.5, y: 0, width: 0.5, height: 100 },
21
+ ]
22
+
23
+ const edgeElements = edges.map(edge => {
24
+ const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')
25
+ rect.setAttribute('x', edge.x.toString())
26
+ rect.setAttribute('y', edge.y.toString())
27
+ rect.setAttribute('width', edge.width.toString())
28
+ rect.setAttribute('height', edge.height.toString())
29
+ rect.setAttribute('fill', color)
30
+ rect.style.mixBlendMode = 'screen'
31
+ rect.style.willChange = 'opacity'
32
+ edgeGroup.appendChild(rect)
33
+ return rect
34
+ })
35
+
36
+ const staticGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g')
37
+ const staticParticles: NonNullable<ArtState['error']>['staticParticles'] = []
38
+
39
+ for (let i = 0; i < 4; i++) {
40
+ const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')
41
+ circle.setAttribute('r', '0.3')
42
+ circle.setAttribute('fill', color)
43
+ circle.style.mixBlendMode = 'screen'
44
+ circle.style.willChange = 'opacity'
45
+ staticGroup.appendChild(circle)
46
+ staticParticles.push({ element: circle, edge: i % 4 })
47
+ }
48
+
49
+ svg.appendChild(edgeGroup)
50
+ svg.appendChild(staticGroup)
51
+ overlay.appendChild(svg)
52
+ element.appendChild(overlay)
53
+
54
+ const boltFactory = () => {
55
+ const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')
56
+ path.setAttribute('stroke', color)
57
+ path.setAttribute('stroke-width', '0.5')
58
+ path.setAttribute('fill', 'none')
59
+ path.style.mixBlendMode = 'screen'
60
+ path.style.willChange = 'opacity'
61
+ svg.appendChild(path)
62
+ return path
63
+ }
64
+
65
+ state.overlayElement = overlay
66
+ state.error = {
67
+ edges: edgeElements,
68
+ staticParticles,
69
+ boltPool: new ParticlePool(boltFactory, 5),
70
+ lightningBolts: [],
71
+ lastLightningSpawn: performance.now(),
72
+ startTime: performance.now(),
73
+ }
74
+ }
75
+
76
+ export function animateError(state: ArtState, currentTime: number): void {
77
+ if (!state.error) return
78
+
79
+ const { edges, staticParticles, boltPool, lightningBolts, startTime } = state.error
80
+ const elapsed = currentTime - startTime
81
+ const cycleProgress = (elapsed % 2500) / 2500
82
+
83
+ const edgePulse = Math.sin(cycleProgress * Math.PI * 4) * 0.5 + 0.5
84
+ const edgeOpacity = 0.08 + edgePulse * 0.17
85
+ edges.forEach(edge => edge.setAttribute('opacity', edgeOpacity.toFixed(3)))
86
+
87
+ staticParticles.forEach((particle, index) => {
88
+ const particlePhase = (cycleProgress + index * 0.125) % 1.0
89
+ let x = 0,
90
+ y = 0
91
+
92
+ switch (particle.edge) {
93
+ case 0:
94
+ x = Math.random() * 100
95
+ y = Math.random() * 5
96
+ break
97
+ case 1:
98
+ x = 95 + Math.random() * 5
99
+ y = Math.random() * 100
100
+ break
101
+ case 2:
102
+ x = Math.random() * 100
103
+ y = 95 + Math.random() * 5
104
+ break
105
+ case 3:
106
+ x = Math.random() * 5
107
+ y = Math.random() * 100
108
+ break
109
+ }
110
+
111
+ particle.element.setAttribute('cx', x.toString())
112
+ particle.element.setAttribute('cy', y.toString())
113
+
114
+ const flicker = Math.sin(particlePhase * Math.PI * 2) * 0.5 + 0.5
115
+ particle.element.setAttribute('opacity', (flicker * 0.35).toFixed(3))
116
+ })
117
+
118
+ if (currentTime - state.error.lastLightningSpawn > 1500 && boltPool.activeCount < 3) {
119
+ const bolt = boltPool.acquire()
120
+ const edge = Math.floor(Math.random() * 4)
121
+ let startX = 0,
122
+ startY = 0,
123
+ endX = 0,
124
+ endY = 0
125
+
126
+ switch (edge) {
127
+ case 0:
128
+ startX = Math.random() * 100
129
+ startY = 0
130
+ endX = Math.random() * 100
131
+ endY = 50
132
+ break
133
+ case 1:
134
+ startX = 100
135
+ startY = Math.random() * 100
136
+ endX = 70
137
+ endY = Math.random() * 100
138
+ break
139
+ case 2:
140
+ startX = Math.random() * 100
141
+ startY = 100
142
+ endX = Math.random() * 100
143
+ endY = 50
144
+ break
145
+ case 3:
146
+ startX = 0
147
+ startY = Math.random() * 100
148
+ endX = 30
149
+ endY = Math.random() * 100
150
+ break
151
+ }
152
+
153
+ bolt.setAttribute('d', createLightningPath(startX, startY, endX, endY))
154
+ lightningBolts.push({ element: bolt, x: 0, y: 0, vx: 0, vy: 0, life: 1 })
155
+ state.error.lastLightningSpawn = currentTime
156
+ }
157
+
158
+ for (let i = lightningBolts.length - 1; i >= 0; i--) {
159
+ const bolt = lightningBolts[i]
160
+ bolt.life -= 0.05
161
+ const opacity = bolt.life > 0.8 ? 0.7 : bolt.life * 0.875
162
+ bolt.element.setAttribute('opacity', Math.max(0, opacity).toFixed(3))
163
+
164
+ if (bolt.life <= 0) {
165
+ boltPool.release(bolt.element)
166
+ lightningBolts.splice(i, 1)
167
+ }
168
+ }
169
+ }
170
+
171
+ function createLightningPath(startX: number, startY: number, endX: number, endY: number): string {
172
+ const segments = 4
173
+ let path = `M ${startX.toFixed(1)},${startY.toFixed(1)}`
174
+
175
+ const deltaX = (endX - startX) / segments
176
+ const deltaY = (endY - startY) / segments
177
+
178
+ let currentX = startX
179
+ let currentY = startY
180
+
181
+ for (let i = 1; i < segments; i++) {
182
+ const jag = 3 + Math.random() * 5
183
+ const perpX = -deltaY * jag * (Math.random() - 0.5)
184
+ const perpY = deltaX * jag * (Math.random() - 0.5)
185
+
186
+ currentX += deltaX + perpX
187
+ currentY += deltaY + perpY
188
+ path += ` L ${currentX.toFixed(1)},${currentY.toFixed(1)}`
189
+ }
190
+
191
+ return path + ` L ${endX.toFixed(1)},${endY.toFixed(1)}`
192
+ }