@mhmo91/schmancy 0.10.24 → 0.10.26

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 (432) hide show
  1. package/dist/agent/{overlay.confirm-body-CvdVfCnN.js → overlay.confirm-body-DJrL6tio.js} +242 -242
  2. package/dist/agent/{overlay.confirm-body-CvdVfCnN.js.map → overlay.confirm-body-DJrL6tio.js.map} +1 -1
  3. package/dist/agent/schmancy.agent.js +5586 -2868
  4. package/dist/agent/schmancy.agent.js.map +1 -1
  5. package/dist/{area-BuqdaUpQ.cjs → area-DkvO_oiO.cjs} +1 -1
  6. package/dist/{area-BuqdaUpQ.cjs.map → area-DkvO_oiO.cjs.map} +1 -1
  7. package/dist/{area-A_oUP4P1.js → area-fC1_kvAW.js} +1 -1
  8. package/dist/{area-A_oUP4P1.js.map → area-fC1_kvAW.js.map} +1 -1
  9. package/dist/area.cjs +1 -1
  10. package/dist/area.js +1 -1
  11. package/dist/{autocomplete-Cy46gJxK.cjs → autocomplete-Aa2IstyX.cjs} +1 -1
  12. package/dist/{autocomplete-Cy46gJxK.cjs.map → autocomplete-Aa2IstyX.cjs.map} +1 -1
  13. package/dist/{autocomplete-BoCWO26L.js → autocomplete-Hb-C11a3.js} +2 -2
  14. package/dist/{autocomplete-BoCWO26L.js.map → autocomplete-Hb-C11a3.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-BEq-AHmL.cjs +85 -0
  23. package/dist/boat-BEq-AHmL.cjs.map +1 -0
  24. package/dist/{boat-B0h5fuAA.js → boat-BW6aRcdY.js} +29 -23
  25. package/dist/boat-BW6aRcdY.js.map +1 -0
  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-CKpIblIO.cjs} +1 -1
  31. package/dist/{busy-Bn6Pioo8.cjs.map → busy-CKpIblIO.cjs.map} +1 -1
  32. package/dist/{busy-DObY7lfu.js → busy-D-ucQFSB.js} +1 -1
  33. package/dist/{busy-DObY7lfu.js.map → busy-D-ucQFSB.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-BU-X0a0S.js} +2 -2
  37. package/dist/{button-DEi3M2nV.js.map → button-BU-X0a0S.js.map} +1 -1
  38. package/dist/{button-XfdPzfZQ.cjs → button-HzLpB3NP.cjs} +1 -1
  39. package/dist/{button-XfdPzfZQ.cjs.map → button-HzLpB3NP.cjs.map} +1 -1
  40. package/dist/button.cjs +1 -1
  41. package/dist/button.js +1 -1
  42. package/dist/{card-BjUgRzFh.cjs → card-CcrUlgd3.cjs} +1 -1
  43. package/dist/{card-BjUgRzFh.cjs.map → card-CcrUlgd3.cjs.map} +1 -1
  44. package/dist/{card-jzUQK0EQ.js → card-ueXBeJ6q.js} +2 -2
  45. package/dist/{card-jzUQK0EQ.js.map → card-ueXBeJ6q.js.map} +1 -1
  46. package/dist/card.cjs +1 -1
  47. package/dist/card.js +1 -1
  48. package/dist/{checkbox-CfCm1vGN.js → checkbox-CW1kk4Tu.js} +1 -1
  49. package/dist/{checkbox-CfCm1vGN.js.map → checkbox-CW1kk4Tu.js.map} +1 -1
  50. package/dist/{checkbox-rskgUBxQ.cjs → checkbox-qsp-I5C6.cjs} +1 -1
  51. package/dist/{checkbox-rskgUBxQ.cjs.map → checkbox-qsp-I5C6.cjs.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-C_F6-gfe.js} +4 -4
  55. package/dist/{chips-Dfim_tQv.js.map → chips-C_F6-gfe.js.map} +1 -1
  56. package/dist/{chips-BiNZKu0J.cjs → chips-Dluk6RV4.cjs} +1 -1
  57. package/dist/{chips-BiNZKu0J.cjs.map → chips-Dluk6RV4.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-B8zoj6Cj.js → date-range-ASZ8h_Il.js} +2 -2
  69. package/dist/{date-range-B8zoj6Cj.js.map → date-range-ASZ8h_Il.js.map} +1 -1
  70. package/dist/{date-range-em7OwhlK.cjs → date-range-BFOqXAI2.cjs} +1 -1
  71. package/dist/{date-range-em7OwhlK.cjs.map → date-range-BFOqXAI2.cjs.map} +1 -1
  72. package/dist/{date-range-inline-DYeqoBIO.cjs → date-range-inline-BNmNOpL0.cjs} +1 -1
  73. package/dist/{date-range-inline-DYeqoBIO.cjs.map → date-range-inline-BNmNOpL0.cjs.map} +1 -1
  74. package/dist/{date-range-inline-BfUL8_vX.js → date-range-inline-DHrgolLn.js} +1 -1
  75. package/dist/{date-range-inline-BfUL8_vX.js.map → date-range-inline-DHrgolLn.js.map} +1 -1
  76. package/dist/date-range-inline.cjs +1 -1
  77. package/dist/date-range-inline.js +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-B9RgRw6c.js} +4 -4
  83. package/dist/{details-D246xN83.js.map → details-B9RgRw6c.js.map} +1 -1
  84. package/dist/{details-CNM1tuma.cjs → details-Bx9c4XQR.cjs} +1 -1
  85. package/dist/{details-CNM1tuma.cjs.map → details-Bx9c4XQR.cjs.map} +1 -1
  86. package/dist/details.cjs +1 -1
  87. package/dist/details.js +1 -1
  88. package/dist/directives-Dq0zi2KR.cjs +350 -0
  89. package/dist/directives-Dq0zi2KR.cjs.map +1 -0
  90. package/dist/directives-sWKTEJDb.js +4063 -0
  91. package/dist/directives-sWKTEJDb.js.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-C7BtzDcK.js} +1 -1
  101. package/dist/{divider-CbIp1je9.js.map → divider-C7BtzDcK.js.map} +1 -1
  102. package/dist/{divider-DaKsGNW-.cjs → divider-DH0BvTOv.cjs} +1 -1
  103. package/dist/{divider-DaKsGNW-.cjs.map → divider-DH0BvTOv.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-CQDm3BF3.cjs → expand-CPMF44eL.cjs} +1 -1
  109. package/dist/{expand-CQDm3BF3.cjs.map → expand-CPMF44eL.cjs.map} +1 -1
  110. package/dist/{expand-DRkiO4vw.js → expand-DcMx9dHY.js} +3 -3
  111. package/dist/{expand-DRkiO4vw.js.map → expand-DcMx9dHY.js.map} +1 -1
  112. package/dist/expand.cjs +1 -1
  113. package/dist/expand.js +1 -1
  114. package/dist/{float-5O26zNRh.cjs → float-CgBN4H3g.cjs} +1 -1
  115. package/dist/{float-5O26zNRh.cjs.map → float-CgBN4H3g.cjs.map} +1 -1
  116. package/dist/{float-CZtu8FnO.js → float-DkUw5TN4.js} +1 -1
  117. package/dist/{float-CZtu8FnO.js.map → float-DkUw5TN4.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-DxApnyVx.cjs} +1 -1
  121. package/dist/{form-B90CMeqs.cjs.map → form-DxApnyVx.cjs.map} +1 -1
  122. package/dist/{form-CE6Gwz4r.js → form-kSgJf_h4.js} +8 -8
  123. package/dist/{form-CE6Gwz4r.js.map → form-kSgJf_h4.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-3F1nQAn_.cjs +24 -0
  131. package/dist/icons-3F1nQAn_.cjs.map +1 -0
  132. package/dist/icons-DsfpmrVO.js +52 -0
  133. package/dist/icons-DsfpmrVO.js.map +1 -0
  134. package/dist/icons.cjs +1 -1
  135. package/dist/icons.js +1 -1
  136. package/dist/{iframe-C3PMj1MD.js → iframe-KrV4Cak-.js} +1 -1
  137. package/dist/{iframe-C3PMj1MD.js.map → iframe-KrV4Cak-.js.map} +1 -1
  138. package/dist/{iframe-D98csbEo.cjs → iframe-sTXBw6zB.cjs} +1 -1
  139. package/dist/{iframe-D98csbEo.cjs.map → iframe-sTXBw6zB.cjs.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-DMoggdSN.cjs} +1 -1
  145. package/dist/{input-_y92Pzon.cjs.map → input-DMoggdSN.cjs.map} +1 -1
  146. package/dist/{input-chip-CR66MWml.cjs → input-chip-B1iNQW2m.cjs} +1 -1
  147. package/dist/{input-chip-CR66MWml.cjs.map → input-chip-B1iNQW2m.cjs.map} +1 -1
  148. package/dist/{input-chip-Bzwr5-XL.js → input-chip-DHbfUatc.js} +1 -1
  149. package/dist/{input-chip-Bzwr5-XL.js.map → input-chip-DHbfUatc.js.map} +1 -1
  150. package/dist/{input-CCOkeeVM.js → input-zj3eaZM_.js} +1 -1
  151. package/dist/{input-CCOkeeVM.js.map → input-zj3eaZM_.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-86F2RgXy.cjs} +2 -2
  165. package/dist/{lightbox-Bk3ovcVu.cjs.map → lightbox-86F2RgXy.cjs.map} +1 -1
  166. package/dist/{lightbox-Dl--fEbP.js → lightbox-CAcXlJlv.js} +2 -2
  167. package/dist/{lightbox-Dl--fEbP.js.map → lightbox-CAcXlJlv.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-BIjJ6T1c.js} +1 -1
  171. package/dist/{list-B3WI_Nfs.js.map → list-BIjJ6T1c.js.map} +1 -1
  172. package/dist/{list-DWngbP2X.cjs → list-CUbI0RM6.cjs} +1 -1
  173. package/dist/{list-DWngbP2X.cjs.map → list-CUbI0RM6.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-IDhVp6zm.js → menu-CtFcvxgU.js} +2 -2
  181. package/dist/{menu-IDhVp6zm.js.map → menu-CtFcvxgU.js.map} +1 -1
  182. package/dist/{menu-CdYjxJqm.cjs → menu-DGMrjR_a.cjs} +1 -1
  183. package/dist/{menu-CdYjxJqm.cjs.map → menu-DGMrjR_a.cjs.map} +1 -1
  184. package/dist/menu.cjs +1 -1
  185. package/dist/menu.js +1 -1
  186. package/dist/mixins-CKbQ6BJo.js +642 -0
  187. package/dist/mixins-CKbQ6BJo.js.map +1 -0
  188. package/dist/mixins-DSy-enUd.cjs +254 -0
  189. package/dist/mixins-DSy-enUd.cjs.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-BqyMYtP7.js} +2 -2
  201. package/dist/{notification-CllYkvlR.js.map → notification-BqyMYtP7.js.map} +1 -1
  202. package/dist/{notification-B3wVUC8l.cjs → notification-D5eOdsMT.cjs} +1 -1
  203. package/dist/{notification-B3wVUC8l.cjs.map → notification-D5eOdsMT.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-C3UyYQi_.js} +1 -1
  207. package/dist/{option-CPOL0nHL.js.map → option-C3UyYQi_.js.map} +1 -1
  208. package/dist/{option-cRsdshy8.cjs → option-DJ3R-2Wn.cjs} +1 -1
  209. package/dist/{option-cRsdshy8.cjs.map → option-DJ3R-2Wn.cjs.map} +1 -1
  210. package/dist/option.cjs +1 -1
  211. package/dist/option.js +1 -1
  212. package/dist/{overlay-DJ-vlwtR.js → overlay-D1hFkcFA.js} +5 -5
  213. package/dist/{overlay-DJ-vlwtR.js.map → overlay-D1hFkcFA.js.map} +1 -1
  214. package/dist/{overlay-BnTvnNDc.cjs → overlay-D7nQaT5U.cjs} +1 -1
  215. package/dist/{overlay-BnTvnNDc.cjs.map → overlay-D7nQaT5U.cjs.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-DEb9xw5N.js → overlay.confirm-body-B4eCDLmU.js} +1 -1
  220. package/dist/{overlay.confirm-body-DEb9xw5N.js.map → overlay.confirm-body-B4eCDLmU.js.map} +1 -1
  221. package/dist/{overlay.confirm-body-CQ-FwySO.cjs → overlay.confirm-body-P18SmJL2.cjs} +1 -1
  222. package/dist/{overlay.confirm-body-CQ-FwySO.cjs.map → overlay.confirm-body-P18SmJL2.cjs.map} +1 -1
  223. package/dist/overlay.js +3 -3
  224. package/dist/{overlay.service-XM1YHkTk.js → overlay.service-02ZLZ8Ib.js} +2 -2
  225. package/dist/{overlay.service-XM1YHkTk.js.map → overlay.service-02ZLZ8Ib.js.map} +1 -1
  226. package/dist/{overlay.service-CKBCIP2f.cjs → overlay.service-m-8omCA-.cjs} +1 -1
  227. package/dist/{overlay.service-CKBCIP2f.cjs.map → overlay.service-m-8omCA-.cjs.map} +1 -1
  228. package/dist/{progress-CcfLfHOE.cjs → progress-CY-UbvOB.cjs} +1 -1
  229. package/dist/{progress-CcfLfHOE.cjs.map → progress-CY-UbvOB.cjs.map} +1 -1
  230. package/dist/{progress-CnMPp-9a.js → progress-YjdEWDI5.js} +1 -1
  231. package/dist/{progress-CnMPp-9a.js.map → progress-YjdEWDI5.js.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--UamzqAm.cjs} +1 -1
  235. package/dist/{radio-group-D97hflrE.cjs.map → radio-group--UamzqAm.cjs.map} +1 -1
  236. package/dist/{radio-group-BUJgfQFi.js → radio-group-aKXKHqUp.js} +1 -1
  237. package/dist/{radio-group-BUJgfQFi.js.map → radio-group-aKXKHqUp.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-B0Qk4PfT.js} +3 -3
  249. package/dist/{select-BWEh5nRM.js.map → select-B0Qk4PfT.js.map} +1 -1
  250. package/dist/{select-Cv5Oev6d.cjs → select-CIquL8LY.cjs} +2 -2
  251. package/dist/{select-Cv5Oev6d.cjs.map → select-CIquL8LY.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-CP_Idse2.js} +1 -1
  275. package/dist/{splash-screen-B6w7X2z9.js.map → splash-screen-CP_Idse2.js.map} +1 -1
  276. package/dist/{splash-screen-DFtxtO2D.cjs → splash-screen-rg56AXCf.cjs} +1 -1
  277. package/dist/{splash-screen-DFtxtO2D.cjs.map → splash-screen-rg56AXCf.cjs.map} +1 -1
  278. package/dist/splash-screen.cjs +1 -1
  279. package/dist/splash-screen.js +1 -1
  280. package/dist/{src-Asw6A018.cjs → src-BAaNnqwc.cjs} +13 -13
  281. package/dist/{src-Asw6A018.cjs.map → src-BAaNnqwc.cjs.map} +1 -1
  282. package/dist/{src-D_NK-vMA.js → src-Do0IGupa.js} +153 -153
  283. package/dist/{src-D_NK-vMA.js.map → src-Do0IGupa.js.map} +1 -1
  284. package/dist/steps.cjs +1 -1
  285. package/dist/steps.js +1 -1
  286. package/dist/{surface-B94ka2LY.cjs → surface-B7a2O5-9.cjs} +1 -1
  287. package/dist/{surface-B94ka2LY.cjs.map → surface-B7a2O5-9.cjs.map} +1 -1
  288. package/dist/{surface-ctBcRGSZ.js → surface-DGewe6IV.js} +1 -1
  289. package/dist/{surface-ctBcRGSZ.js.map → surface-DGewe6IV.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-g2aM43TH.js} +1 -1
  297. package/dist/{tabs-CrMx5z_y.js.map → tabs-g2aM43TH.js.map} +1 -1
  298. package/dist/{tabs-B7kaZIom.cjs → tabs-n4dO5fo1.cjs} +1 -1
  299. package/dist/{tabs-B7kaZIom.cjs.map → tabs-n4dO5fo1.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-D5hw4jsP.js} +1 -1
  305. package/dist/{textarea-DeHFl80i.js.map → textarea-D5hw4jsP.js.map} +1 -1
  306. package/dist/{textarea-D1crj8JD.cjs → textarea-DDx_7AfQ.cjs} +1 -1
  307. package/dist/{textarea-D1crj8JD.cjs.map → textarea-DDx_7AfQ.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-BMYkheaA.js} +3 -3
  311. package/dist/{theme-C7Yo33nh.js.map → theme-BMYkheaA.js.map} +1 -1
  312. package/dist/{theme-wE2N7Yu9.cjs → theme-BdZAj0CO.cjs} +2 -2
  313. package/dist/{theme-wE2N7Yu9.cjs.map → theme-BdZAj0CO.cjs.map} +1 -1
  314. package/dist/{theme-button-Cpc_hs2O.js → theme-button-DdI6kxY3.js} +1 -1
  315. package/dist/{theme-button-Cpc_hs2O.js.map → theme-button-DdI6kxY3.js.map} +1 -1
  316. package/dist/{theme-button-CXSM5We4.cjs → theme-button-R2f_kLEl.cjs} +1 -1
  317. package/dist/{theme-button-CXSM5We4.cjs.map → theme-button-R2f_kLEl.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-Ck_zS4bb.cjs → window-LOGPpN8K.cjs} +1 -1
  339. package/dist/{window-Ck_zS4bb.cjs.map → window-LOGPpN8K.cjs.map} +1 -1
  340. package/dist/{window-JtkeHoxS.js → window-MQxhTodp.js} +5 -5
  341. package/dist/{window-JtkeHoxS.js.map → window-MQxhTodp.js.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/boat/boat.ts +33 -23
  354. package/src/directives/ai-badge.ts +95 -0
  355. package/src/directives/art/art.directive.ts +228 -0
  356. package/src/directives/art/effects/error.ts +192 -0
  357. package/src/directives/art/effects/funkhaus.ts +121 -0
  358. package/src/directives/art/effects/howl.ts +203 -0
  359. package/src/directives/art/effects/samwa.ts +228 -0
  360. package/src/directives/art/effects/snow.ts +207 -0
  361. package/src/directives/art/effects/starfield.ts +107 -0
  362. package/src/directives/art/index.ts +2 -0
  363. package/src/directives/art/particle-pool.ts +40 -0
  364. package/src/directives/art/types.ts +129 -0
  365. package/src/directives/art/utils.ts +35 -0
  366. package/src/directives/battery.ts +1014 -0
  367. package/src/directives/beta.ts +44 -0
  368. package/src/directives/fill.ts +32 -60
  369. package/src/directives/fyi.ts +551 -0
  370. package/src/directives/hummingbird.ts +1712 -0
  371. package/src/directives/index.ts +9 -0
  372. package/src/directives/missed-punch.ts +407 -0
  373. package/src/directives/nebula.ts +64 -61
  374. package/src/directives/urgent.ts +660 -0
  375. package/src/directives/working-snake.ts +294 -0
  376. package/src/icons/icon.ts +53 -30
  377. package/src/navigation-rail/navigation-rail-item.ts +7 -12
  378. package/src/navigation-rail/navigation-rail.ts +0 -2
  379. package/types/mixins/SchmancyElement.d.ts +31 -0
  380. package/types/src/directives/ai-badge.d.ts +15 -0
  381. package/types/src/directives/art/art.directive.d.ts +19 -0
  382. package/types/src/directives/art/effects/error.d.ts +7 -0
  383. package/types/src/directives/art/effects/funkhaus.d.ts +7 -0
  384. package/types/src/directives/art/effects/howl.d.ts +7 -0
  385. package/types/src/directives/art/effects/samwa.d.ts +7 -0
  386. package/types/src/directives/art/effects/snow.d.ts +7 -0
  387. package/types/src/directives/art/effects/starfield.d.ts +10 -0
  388. package/types/src/directives/art/index.d.ts +2 -0
  389. package/types/src/directives/art/particle-pool.d.ts +16 -0
  390. package/types/src/directives/art/types.d.ts +126 -0
  391. package/types/src/directives/art/utils.d.ts +5 -0
  392. package/types/src/directives/battery.d.ts +96 -0
  393. package/types/src/directives/beta.d.ts +33 -0
  394. package/types/src/directives/fill.d.ts +4 -11
  395. package/types/src/directives/fyi.d.ts +76 -0
  396. package/types/src/directives/hummingbird.d.ts +180 -0
  397. package/types/src/directives/index.d.ts +9 -0
  398. package/types/src/directives/missed-punch.d.ts +28 -0
  399. package/types/src/directives/nebula.d.ts +1 -1
  400. package/types/src/directives/urgent.d.ts +88 -0
  401. package/types/src/directives/working-snake.d.ts +46 -0
  402. package/types/src/icons/icon.d.ts +22 -0
  403. package/dist/boat-B0h5fuAA.js.map +0 -1
  404. package/dist/boat-RRtBhD3x.cjs +0 -80
  405. package/dist/boat-RRtBhD3x.cjs.map +0 -1
  406. package/dist/directives.cjs.map +0 -1
  407. package/dist/directives.js.map +0 -1
  408. package/dist/discovery.cjs.map +0 -1
  409. package/dist/discovery.js.map +0 -1
  410. package/dist/icons-B7ppo07M.cjs +0 -33
  411. package/dist/icons-B7ppo07M.cjs.map +0 -1
  412. package/dist/icons-CGhozJ5v.js +0 -48
  413. package/dist/icons-CGhozJ5v.js.map +0 -1
  414. package/dist/mixins-BPUR4Kc4.cjs +0 -254
  415. package/dist/mixins-BPUR4Kc4.cjs.map +0 -1
  416. package/dist/mixins-C42OILRS.js +0 -636
  417. package/dist/mixins-C42OILRS.js.map +0 -1
  418. package/dist/skills/page.md +0 -84
  419. package/dist/skills/schmancy/page.md +0 -84
  420. package/skills/schmancy/page.md +0 -84
  421. /package/dist/{hashContent-dJrI-9sc.js → hashContent-Dgmzc32o.js} +0 -0
  422. /package/dist/{hashContent-Ck6laKlk.cjs → hashContent-Dh1VzIAb.cjs} +0 -0
  423. /package/dist/{overlay-stack-Dk0xETTy.cjs → overlay-stack-Bdr9lOqi.cjs} +0 -0
  424. /package/dist/{overlay-stack-BR4iYivO.js → overlay-stack-D2rgxQLh.js} +0 -0
  425. /package/dist/{reduced-motion-D7LqTUMn.js → reduced-motion-D-L12p7G.js} +0 -0
  426. /package/dist/{reduced-motion-Dzfp_w5x.cjs → reduced-motion-Ds-HjMzn.cjs} +0 -0
  427. /package/dist/{rxjs-utils-BK8VMe3K.js → rxjs-utils-BXpvHN4-.js} +0 -0
  428. /package/dist/{rxjs-utils-DhOKenkS.cjs → rxjs-utils-CaC-tdot.cjs} +0 -0
  429. /package/dist/{theme.interface-D4NeufQA.cjs → theme.interface-B5xjEk74.cjs} +0 -0
  430. /package/dist/{theme.interface-C2XNgsLB.js → theme.interface-DVEw3s8m.js} +0 -0
  431. /package/dist/{theme.service-CSzNkqBB.js → theme.service-Bh08uOSJ.js} +0 -0
  432. /package/dist/{theme.service-CnFUmUpc.cjs → theme.service-Y-e8b331.cjs} +0 -0
@@ -1,4 +1,8 @@
1
1
  export * from './animate-text';
2
+ export * from './ai-badge';
3
+ export * from './art';
4
+ export * from './battery';
5
+ export * from './beta';
2
6
  export * from './color';
3
7
  export * from './confirm-click';
4
8
  export * from './cursor-glow';
@@ -6,15 +10,20 @@ export * from './cycle-text';
6
10
  export * from './depth-of-field';
7
11
  export * from './drag';
8
12
  export * from './fill';
13
+ export * from './fyi';
9
14
  export * from './gravity';
15
+ export * from './hummingbird';
10
16
  export * from './intersect';
11
17
  export * from './layout';
12
18
  export * from './liquid';
13
19
  export * from './living-border';
14
20
  export * from './long-press';
15
21
  export * from './magnetic';
22
+ export * from './missed-punch';
16
23
  export * from './nebula';
17
24
  export * from './reduced-motion';
18
25
  export * from './reveal';
19
26
  export * from './ripple';
20
27
  export * from './overflow-within';
28
+ export * from './urgent';
29
+ export * from './working-snake';
@@ -0,0 +1,407 @@
1
+ /**
2
+ * Missed Punch directive — shattering glass effect for incomplete attendance.
3
+ *
4
+ * Renders an animated shattering/fragmenting overlay when an employee has only
5
+ * one punch on a past date, indicating they forgot to punch out.
6
+ *
7
+ * Visual: glass shards/fragments flying outward with a crack pattern.
8
+ */
9
+
10
+ import type { ElementPart } from 'lit'
11
+ import { noChange } from 'lit'
12
+ import { AsyncDirective, directive } from 'lit/async-directive.js'
13
+
14
+ export interface MissedPunchOptions {
15
+ active: boolean
16
+ color?: string
17
+ width?: number
18
+ }
19
+
20
+ interface Shard {
21
+ element: SVGPolygonElement
22
+ x: number
23
+ y: number
24
+ vx: number
25
+ vy: number
26
+ rotation: number
27
+ rotationSpeed: number
28
+ scale: number
29
+ opacity: number
30
+ }
31
+
32
+ interface MissedPunchState {
33
+ active: boolean
34
+ color: string
35
+ width: number
36
+ element: HTMLElement
37
+ overlayElement?: HTMLDivElement
38
+ svg?: SVGSVGElement
39
+ shards: Shard[]
40
+ cracks: SVGPathElement[]
41
+ animationId?: number
42
+ isVisible: boolean
43
+ observer?: IntersectionObserver
44
+ startTime: number
45
+ }
46
+
47
+ const SHARD_COUNT = 8
48
+
49
+ class MissedPunchDirective extends AsyncDirective {
50
+ private state: MissedPunchState | null = null
51
+
52
+ render(_options: MissedPunchOptions) {
53
+ return noChange
54
+ }
55
+
56
+ override update(part: ElementPart, [options]: [MissedPunchOptions]) {
57
+ const element = part.element as HTMLElement
58
+ const { active, color = 'var(--md-sys-color-error, #ef4444)', width = 150 } = options
59
+
60
+ if (!active && this.state) {
61
+ this.cleanup()
62
+ return noChange
63
+ }
64
+
65
+ if (!active) {
66
+ return noChange
67
+ }
68
+
69
+ if (this.state && (this.state.color !== color || this.state.width !== width)) {
70
+ this.cleanup()
71
+ }
72
+
73
+ if (!this.state) {
74
+ this.state = {
75
+ active: true,
76
+ color,
77
+ width,
78
+ element,
79
+ shards: [],
80
+ cracks: [],
81
+ isVisible: true,
82
+ startTime: performance.now(),
83
+ }
84
+
85
+ const computedStyle = getComputedStyle(element)
86
+ if (computedStyle.position === 'static') {
87
+ element.style.position = 'relative'
88
+ }
89
+
90
+ this.createOverlay()
91
+ this.setupVisibilityObserver()
92
+ this.startAnimation()
93
+ }
94
+
95
+ return noChange
96
+ }
97
+
98
+ private createOverlay() {
99
+ if (!this.state) return
100
+
101
+ const { element, color, width } = this.state
102
+
103
+ const overlay = document.createElement('div')
104
+ overlay.className = 'missed-punch-overlay'
105
+ Object.assign(overlay.style, {
106
+ position: 'absolute',
107
+ top: '50%',
108
+ left: '0',
109
+ width: `${width}px`,
110
+ height: '40px',
111
+ transform: 'translateY(-50%)',
112
+ pointerEvents: 'none',
113
+ overflow: 'visible',
114
+ zIndex: '4',
115
+ })
116
+
117
+ const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')
118
+ svg.setAttribute('width', '100%')
119
+ svg.setAttribute('height', '100%')
120
+ svg.setAttribute('viewBox', `0 0 ${width} 40`)
121
+ svg.setAttribute('preserveAspectRatio', 'xMinYMid meet')
122
+ Object.assign(svg.style, {
123
+ position: 'absolute',
124
+ top: '0',
125
+ left: '0',
126
+ width: '100%',
127
+ height: '100%',
128
+ overflow: 'visible',
129
+ })
130
+
131
+ // Crack lines emanating from origin
132
+ const cracks: SVGPathElement[] = []
133
+ const crackAngles = [-15, 0, 15, -30, 30, -8, 8]
134
+
135
+ for (const angle of crackAngles) {
136
+ const crack = document.createElementNS('http://www.w3.org/2000/svg', 'path')
137
+ const rad = (angle * Math.PI) / 180
138
+ const length = 30 + Math.random() * 40
139
+
140
+ let d = 'M 0,20'
141
+ let x = 0
142
+ let y = 20
143
+ const segments = 4 + Math.floor(Math.random() * 3)
144
+
145
+ for (let i = 0; i < segments; i++) {
146
+ const segLen = length / segments
147
+ x += Math.cos(rad) * segLen + (Math.random() - 0.5) * 4
148
+ y += Math.sin(rad) * segLen + (Math.random() - 0.5) * 3
149
+ d += ` L ${x.toFixed(1)},${y.toFixed(1)}`
150
+ }
151
+
152
+ crack.setAttribute('d', d)
153
+ crack.setAttribute('stroke', color)
154
+ crack.setAttribute('stroke-width', '1.5')
155
+ crack.setAttribute('fill', 'none')
156
+ crack.setAttribute('opacity', '0')
157
+ crack.style.willChange = 'opacity, stroke-dashoffset'
158
+
159
+ const pathLength = length * 1.2
160
+ crack.setAttribute('stroke-dasharray', pathLength.toString())
161
+ crack.setAttribute('stroke-dashoffset', pathLength.toString())
162
+
163
+ cracks.push(crack)
164
+ svg.appendChild(crack)
165
+ }
166
+
167
+ // Glass shards with gradient for light reflection
168
+ const shards: Shard[] = []
169
+ const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs')
170
+
171
+ for (let i = 0; i < SHARD_COUNT; i++) {
172
+ const gradientId = `shard-gradient-${i}`
173
+ const gradient = document.createElementNS('http://www.w3.org/2000/svg', 'linearGradient')
174
+ gradient.setAttribute('id', gradientId)
175
+ gradient.setAttribute('x1', '0%')
176
+ gradient.setAttribute('y1', '0%')
177
+ gradient.setAttribute('x2', '100%')
178
+ gradient.setAttribute('y2', '100%')
179
+
180
+ const stop1 = document.createElementNS('http://www.w3.org/2000/svg', 'stop')
181
+ stop1.setAttribute('offset', '0%')
182
+ stop1.setAttribute('stop-color', 'white')
183
+ stop1.setAttribute('stop-opacity', '0.9')
184
+
185
+ const stop2 = document.createElementNS('http://www.w3.org/2000/svg', 'stop')
186
+ stop2.setAttribute('offset', '40%')
187
+ stop2.setAttribute('stop-color', color)
188
+ stop2.setAttribute('stop-opacity', '0.8')
189
+
190
+ const stop3 = document.createElementNS('http://www.w3.org/2000/svg', 'stop')
191
+ stop3.setAttribute('offset', '100%')
192
+ stop3.setAttribute('stop-color', color)
193
+ stop3.setAttribute('stop-opacity', '0.4')
194
+
195
+ gradient.appendChild(stop1)
196
+ gradient.appendChild(stop2)
197
+ gradient.appendChild(stop3)
198
+ defs.appendChild(gradient)
199
+
200
+ const shard = document.createElementNS('http://www.w3.org/2000/svg', 'polygon')
201
+
202
+ const size = 5 + Math.random() * 7
203
+ const points = this.generateShardPoints(size)
204
+ shard.setAttribute('points', points)
205
+ shard.setAttribute('fill', `url(#${gradientId})`)
206
+ shard.setAttribute('stroke', 'white')
207
+ shard.setAttribute('stroke-width', '0.5')
208
+ shard.setAttribute('stroke-opacity', '0.6')
209
+ shard.setAttribute('opacity', '0')
210
+ shard.style.willChange = 'transform, opacity'
211
+ shard.style.filter = 'drop-shadow(0 0 2px rgba(255,255,255,0.5))'
212
+
213
+ const angle = (Math.random() - 0.3) * Math.PI * 0.6 // Mostly rightward
214
+ const speed = 1.0 + Math.random() * 1.5
215
+
216
+ shards.push({
217
+ element: shard,
218
+ x: 0,
219
+ y: 20,
220
+ vx: Math.cos(angle) * speed,
221
+ vy: Math.sin(angle) * speed,
222
+ rotation: 0,
223
+ rotationSpeed: (Math.random() - 0.5) * 10,
224
+ scale: 0.6 + Math.random() * 0.6,
225
+ opacity: 0,
226
+ })
227
+
228
+ svg.appendChild(shard)
229
+ }
230
+
231
+ svg.insertBefore(defs, svg.firstChild)
232
+
233
+ // Sparkle/glint particles
234
+ for (let i = 0; i < 6; i++) {
235
+ const sparkle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')
236
+ sparkle.setAttribute('r', '1.5')
237
+ sparkle.setAttribute('fill', 'white')
238
+ sparkle.setAttribute('opacity', '0')
239
+ sparkle.setAttribute('data-sparkle', i.toString())
240
+ sparkle.style.willChange = 'transform, opacity'
241
+ svg.appendChild(sparkle)
242
+ }
243
+
244
+ // "!" warning symbol
245
+ const warning = document.createElementNS('http://www.w3.org/2000/svg', 'text')
246
+ warning.setAttribute('x', (width - 15).toString())
247
+ warning.setAttribute('y', '25')
248
+ warning.setAttribute('fill', color)
249
+ warning.setAttribute('font-size', '16')
250
+ warning.setAttribute('font-weight', 'bold')
251
+ warning.setAttribute('opacity', '0.6')
252
+ warning.textContent = '!'
253
+ warning.style.animation = 'missed-pulse 1.5s ease-in-out infinite'
254
+ svg.appendChild(warning)
255
+
256
+ // Pulsing keyframe (shared, lazy-injected once per document)
257
+ if (!document.getElementById('missed-punch-styles')) {
258
+ const style = document.createElement('style')
259
+ style.id = 'missed-punch-styles'
260
+ style.textContent = `
261
+ @keyframes missed-pulse {
262
+ 0%, 100% { opacity: 0.4; transform: scale(1); }
263
+ 50% { opacity: 0.8; transform: scale(1.1); }
264
+ }
265
+ `
266
+ document.head.appendChild(style)
267
+ }
268
+
269
+ overlay.appendChild(svg)
270
+ element.appendChild(overlay)
271
+
272
+ this.state.overlayElement = overlay
273
+ this.state.svg = svg
274
+ this.state.shards = shards
275
+ this.state.cracks = cracks
276
+ }
277
+
278
+ private generateShardPoints(size: number): string {
279
+ const numPoints = 3 + Math.floor(Math.random() * 2) // 3-4 points
280
+ const points: string[] = []
281
+
282
+ for (let i = 0; i < numPoints; i++) {
283
+ const angle = (i / numPoints) * Math.PI * 2 + Math.random() * 0.5
284
+ const r = size * (0.5 + Math.random() * 0.5)
285
+ const x = Math.cos(angle) * r
286
+ const y = Math.sin(angle) * r
287
+ points.push(`${x.toFixed(1)},${y.toFixed(1)}`)
288
+ }
289
+
290
+ return points.join(' ')
291
+ }
292
+
293
+ private setupVisibilityObserver() {
294
+ if (!this.state || typeof IntersectionObserver === 'undefined') return
295
+
296
+ this.state.observer = new IntersectionObserver(
297
+ entries => {
298
+ if (!this.state) return
299
+ const isVisible = entries[0].isIntersecting
300
+
301
+ if (isVisible && !this.state.isVisible) {
302
+ this.state.isVisible = true
303
+ this.startAnimation()
304
+ } else if (!isVisible && this.state.isVisible) {
305
+ this.state.isVisible = false
306
+ if (this.state.animationId) {
307
+ cancelAnimationFrame(this.state.animationId)
308
+ this.state.animationId = undefined
309
+ }
310
+ }
311
+ },
312
+ { threshold: 0 },
313
+ )
314
+
315
+ this.state.observer.observe(this.state.element)
316
+ }
317
+
318
+ private startAnimation() {
319
+ if (!this.state || !this.state.isVisible) return
320
+
321
+ const { cracks } = this.state
322
+ for (let i = 0; i < cracks.length; i++) {
323
+ const crack = cracks[i]
324
+ crack.setAttribute('stroke-dashoffset', '0')
325
+ crack.setAttribute('opacity', '0.5')
326
+ }
327
+
328
+ const animate = (currentTime: number) => {
329
+ if (!this.state || !this.state.isVisible) return
330
+
331
+ const elapsed = currentTime - this.state.startTime
332
+ const { shards, width } = this.state
333
+
334
+ // Continuous shard animation — each shard has its own cycle
335
+ for (let i = 0; i < shards.length; i++) {
336
+ const shard = shards[i]
337
+ const shardCycleDuration = 2500 + i * 200 // Stagger cycle durations
338
+ const shardProgress = ((elapsed + i * 300) % shardCycleDuration) / shardCycleDuration
339
+
340
+ shard.x = shardProgress * shard.vx * width * 0.5
341
+ shard.y = 20 + shardProgress * shard.vy * 25 + shardProgress * shardProgress * 20
342
+ shard.rotation += shard.rotationSpeed * 0.3
343
+
344
+ let opacity = 0.85
345
+ if (shardProgress < 0.1) {
346
+ opacity = shardProgress * 8.5
347
+ } else if (shardProgress > 0.8) {
348
+ opacity = (1 - shardProgress) * 4.25
349
+ }
350
+
351
+ shard.element.style.transform = `translate(${shard.x.toFixed(1)}px, ${shard.y.toFixed(1)}px) rotate(${shard.rotation.toFixed(0)}deg) scale(${shard.scale})`
352
+ shard.element.setAttribute('opacity', opacity.toFixed(2))
353
+ }
354
+
355
+ // Continuous sparkles
356
+ const sparkles = this.state.svg?.querySelectorAll('[data-sparkle]')
357
+ if (sparkles) {
358
+ sparkles.forEach((sparkle, i) => {
359
+ const sparkleCycle = 1500 + i * 150
360
+ const sparkleProgress = ((elapsed + i * 200) % sparkleCycle) / sparkleCycle
361
+
362
+ const sparkleX = 5 + sparkleProgress * width * 0.6
363
+ const sparkleY = 18 + Math.sin(sparkleProgress * Math.PI * 4) * 10
364
+ const sparkleOpacity = Math.sin(sparkleProgress * Math.PI) * 0.8
365
+
366
+ sparkle.setAttribute('cx', sparkleX.toFixed(1))
367
+ sparkle.setAttribute('cy', sparkleY.toFixed(1))
368
+ sparkle.setAttribute('opacity', Math.max(0, sparkleOpacity).toFixed(2))
369
+ })
370
+ }
371
+
372
+ // Pulse the cracks subtly
373
+ const crackPulse = Math.sin(elapsed / 800) * 0.15 + 0.45
374
+ for (const crack of cracks) {
375
+ crack.setAttribute('opacity', crackPulse.toFixed(2))
376
+ }
377
+
378
+ this.state.animationId = requestAnimationFrame(animate)
379
+ }
380
+
381
+ this.state.animationId = requestAnimationFrame(animate)
382
+ }
383
+
384
+ private cleanup() {
385
+ if (!this.state) return
386
+
387
+ if (this.state.animationId) {
388
+ cancelAnimationFrame(this.state.animationId)
389
+ }
390
+
391
+ if (this.state.observer) {
392
+ this.state.observer.disconnect()
393
+ }
394
+
395
+ if (this.state.overlayElement) {
396
+ this.state.overlayElement.remove()
397
+ }
398
+
399
+ this.state = null
400
+ }
401
+
402
+ override disconnected() {
403
+ this.cleanup()
404
+ }
405
+ }
406
+
407
+ export const missedPunch = directive(MissedPunchDirective)
@@ -32,13 +32,13 @@
32
32
  * ```
33
33
  */
34
34
 
35
+ import type { ElementPart } from 'lit'
35
36
  import { noChange } from 'lit'
36
37
  import { AsyncDirective, directive } from 'lit/async-directive.js'
37
- import type { ElementPart } from 'lit'
38
- import { SPRING_SMOOTH, SPRING_GENTLE, getEasing } from '../utils/animation'
38
+ import { EMPTY, type Subscription, from, fromEvent, timer } from 'rxjs'
39
+ import { catchError, take, tap } from 'rxjs/operators'
40
+ import { SPRING_GENTLE, SPRING_SMOOTH, getEasing } from '../utils/animation'
39
41
  import { reducedMotion$ } from './reduced-motion'
40
- import { Subscription, timer, fromEvent, from, EMPTY } from 'rxjs'
41
- import { take, tap, catchError } from 'rxjs/operators'
42
42
 
43
43
  export interface NebulaOptions {
44
44
  /** Whether the nebula is active/visible. Default: true (auto-shows, auto-hides after autoHideDuration) */
@@ -94,7 +94,7 @@ const DEFAULTS: Required<NebulaOptions> = {
94
94
  idleBreathe: true,
95
95
  temperature: 0,
96
96
  chromaticAberration: 1,
97
- particleCount: 30,
97
+ particleCount: 8,
98
98
  }
99
99
 
100
100
  // =============================================================================
@@ -139,10 +139,11 @@ function injectGlobalStyles(): void {
139
139
  75% { transform: translate3d(calc(var(--nebula-aberration, 3px) * -1.8), 0, 0); }
140
140
  }
141
141
 
142
- /* Iridescent core - continuous 360-degree hue rotation (the ONE filter animation) */
142
+ /* Iridescent core - compositor-only rotation. filter is static (baked inline) to avoid
143
+ per-frame raster cost of animated blur/hue-rotate under mix-blend-mode: screen. */
143
144
  @keyframes nebula-iridescent {
144
- 0% { filter: hue-rotate(0deg) blur(var(--nebula-blur-core, 12px)) saturate(1.6); }
145
- 100% { filter: hue-rotate(360deg) blur(var(--nebula-blur-core, 12px)) saturate(1.6); }
145
+ 0% { transform: translateZ(0) rotate(0deg); }
146
+ 100% { transform: translateZ(0) rotate(360deg); }
146
147
  }
147
148
 
148
149
  /* Bioluminescent tendrils - organic breathing */
@@ -161,17 +162,17 @@ function injectGlobalStyles(): void {
161
162
  85% { opacity: 0.6; }
162
163
  }
163
164
 
164
- /* Idle breathing - gentle pulse when dimmed */
165
+ /* Idle breathing - compositor-only pulse when dimmed.
166
+ filter: blur is intentionally static (baked on layers) — animating it here
167
+ would keep re-rasterizing the dimmed overlay forever for no visual gain. */
165
168
  @keyframes nebula-idle-breathe {
166
169
  0%, 100% {
167
170
  opacity: var(--nebula-idle-opacity, 0.08);
168
- filter: blur(calc(var(--nebula-blur-base, 10px) * 8));
169
- transform: scale(1);
171
+ transform: scale(1) translateZ(0);
170
172
  }
171
173
  50% {
172
174
  opacity: calc(var(--nebula-idle-opacity, 0.08) * 1.4);
173
- filter: blur(calc(var(--nebula-blur-base, 10px) * 10));
174
- transform: scale(1.005);
175
+ transform: scale(1.005) translateZ(0);
175
176
  }
176
177
  }
177
178
 
@@ -185,7 +186,8 @@ function injectGlobalStyles(): void {
185
186
  isolation: isolate;
186
187
  }
187
188
 
188
- .nebula-overlay.paused .nebula-layer {
189
+ .nebula-overlay.paused .nebula-layer,
190
+ .nebula-overlay.dimmed .nebula-layer {
189
191
  animation-play-state: paused !important;
190
192
  }
191
193
 
@@ -216,6 +218,7 @@ interface State {
216
218
  originalContain: string
217
219
  isDimmed: boolean
218
220
  autoHideSub: Subscription | null
221
+ fadeFinishedSub: Subscription | null
219
222
  options: Required<NebulaOptions>
220
223
  reducedMotion: boolean
221
224
  isVisible: boolean
@@ -352,6 +355,8 @@ class NebulaDirective extends AsyncDirective {
352
355
  if (this.state?.overlay && this.state.isDimmed) {
353
356
  this.state.isDimmed = false
354
357
  this.state.options = opts
358
+ this.state.fadeFinishedSub?.unsubscribe()
359
+ this.state.fadeFinishedSub = null
355
360
  this.awakenOverlay(opts, reducedMotion)
356
361
  this.scheduleAutoHide(opts)
357
362
  return
@@ -372,28 +377,26 @@ class NebulaDirective extends AsyncDirective {
372
377
  if (!this.state?.overlay) return
373
378
 
374
379
  const overlay = this.state.overlay
375
- const awakenDuration = reducedMotion ? 0 : opts.fadeInDuration * 0.6
376
- const easing = reducedMotion ? 'linear' : getEasing(SPRING_SMOOTH)
377
-
378
- // Update CSS custom properties
379
380
  overlay.style.setProperty('--nebula-intensity', String(opts.intensity))
380
381
 
381
382
  overlay.animate(
382
383
  [
383
- { opacity: opts.idleOpacity, transform: 'scale(0.98)', filter: `blur(${4 * opts.blur}px)` },
384
- { opacity: opts.intensity * 0.7, transform: 'scale(1.01)', filter: `blur(${1 * opts.blur}px)` },
385
- { opacity: opts.intensity, transform: 'scale(1)', filter: 'blur(0px)' },
384
+ { opacity: opts.idleOpacity, transform: 'scale(0.98) translateZ(0)' },
385
+ { opacity: opts.intensity * 0.7, transform: 'scale(1.01) translateZ(0)' },
386
+ { opacity: opts.intensity, transform: 'scale(1) translateZ(0)' },
386
387
  ] as Keyframe[],
387
388
  {
388
- duration: awakenDuration,
389
- easing,
389
+ duration: reducedMotion ? 0 : opts.fadeInDuration * 0.6,
390
+ easing: reducedMotion ? 'linear' : getEasing(SPRING_SMOOTH),
390
391
  fill: 'forwards',
391
392
  },
392
393
  )
393
394
 
394
- // Resume CSS animations
395
- overlay.classList.remove('paused')
395
+ // Clear the dimmed gate + any container-level idle-breathe animation hide() installed,
396
+ // then resume the per-layer CSS animations.
397
+ overlay.classList.remove('paused', 'dimmed')
396
398
  overlay.classList.add('running')
399
+ overlay.style.animation = ''
397
400
  }
398
401
 
399
402
  private createOverlay(element: HTMLElement, opts: Required<NebulaOptions>, reducedMotion: boolean): void {
@@ -568,7 +571,11 @@ class NebulaDirective extends AsyncDirective {
568
571
  transparent 100%)`,
569
572
  mixBlendMode: 'screen',
570
573
  transform: 'translateZ(0)',
571
- // hue-rotate is the core visual — continuous 360deg cycle
574
+ transformOrigin: '50% 50%',
575
+ // Static filter — animating hue-rotate + blur every frame is a GPU pig
576
+ // under mix-blend-mode: screen. Compositor-only rotation gets the iridescent
577
+ // shimmer "for free" by sliding the gradient across the blend stack.
578
+ filter: `blur(${12 * opts.blur}px) saturate(1.6)`,
572
579
  animation: `nebula-iridescent ${28000 / opts.speed}ms linear infinite`,
573
580
  })
574
581
  overlay.appendChild(iridescentLayer)
@@ -635,13 +642,14 @@ class NebulaDirective extends AsyncDirective {
635
642
  const fadeInDuration = reducedMotion ? 0 : opts.fadeInDuration
636
643
  const entranceEasing = reducedMotion ? 'linear' : getEasing(SPRING_SMOOTH)
637
644
 
645
+ // Compositor-only entrance — opacity + transform reach the same "rising into focus"
646
+ // feel without animating `filter: blur`, which re-rasterizes the full filtered
647
+ // region every frame under mix-blend-mode: screen.
638
648
  overlay.animate(
639
649
  [
640
- { opacity: 0, transform: 'scale(0.85)', filter: `blur(${25 * opts.blur}px) saturate(0.5)` },
641
- { opacity: opts.intensity * 0.3, transform: 'scale(0.95)', filter: `blur(${12 * opts.blur}px) saturate(0.8)` },
642
- { opacity: opts.intensity * 0.6, transform: 'scale(1.02)', filter: `blur(${4 * opts.blur}px) saturate(1.1)` },
643
- { opacity: opts.intensity * 0.85, transform: 'scale(1.005)', filter: `blur(${1 * opts.blur}px) saturate(1.05)` },
644
- { opacity: opts.intensity, transform: 'scale(1)', filter: 'blur(0px) saturate(1)' },
650
+ { opacity: 0, transform: 'scale(0.85) translateZ(0)' },
651
+ { opacity: opts.intensity * 0.4, transform: 'scale(0.97) translateZ(0)' },
652
+ { opacity: opts.intensity, transform: 'scale(1) translateZ(0)' },
645
653
  ] as Keyframe[],
646
654
  {
647
655
  duration: fadeInDuration,
@@ -658,6 +666,7 @@ class NebulaDirective extends AsyncDirective {
658
666
  originalContain,
659
667
  isDimmed: false,
660
668
  autoHideSub: null,
669
+ fadeFinishedSub: null,
661
670
  options: opts,
662
671
  reducedMotion,
663
672
  isVisible: document.visibilityState === 'visible',
@@ -695,53 +704,46 @@ class NebulaDirective extends AsyncDirective {
695
704
  const overlay = this.state.overlay
696
705
  const currentOpts = this.state.options
697
706
  const reducedMotion = this.state.reducedMotion
698
-
699
- const fadeOutDuration = reducedMotion ? 0 : opts.fadeOutDuration
700
- const exitEasing = reducedMotion ? 'linear' : getEasing(SPRING_GENTLE)
707
+ const duration = reducedMotion ? 0 : opts.fadeOutDuration
708
+ const easing = reducedMotion ? 'linear' : getEasing(SPRING_GENTLE)
701
709
 
702
710
  // Full hide (idleOpacity = 0)
703
711
  if (opts.idleOpacity <= 0) {
704
712
  overlay.animate(
705
713
  [
706
- { opacity: currentOpts.intensity, transform: 'scale(1)', filter: 'blur(0px) saturate(1)' },
707
- { opacity: currentOpts.intensity * 0.4, transform: 'scale(0.95)', filter: `blur(${8 * currentOpts.blur}px) saturate(0.7)` },
708
- { opacity: 0, transform: 'scale(0.9)', filter: `blur(${15 * currentOpts.blur}px) saturate(0.3)` },
714
+ { opacity: currentOpts.intensity, transform: 'scale(1) translateZ(0)' },
715
+ { opacity: currentOpts.intensity * 0.4, transform: 'scale(0.95) translateZ(0)' },
716
+ { opacity: 0, transform: 'scale(0.9) translateZ(0)' },
709
717
  ] as Keyframe[],
710
- {
711
- duration: fadeOutDuration,
712
- easing: exitEasing,
713
- fill: 'forwards',
714
- },
718
+ { duration, easing, fill: 'forwards' },
715
719
  )
716
720
  return
717
721
  }
718
722
 
719
- // Fade to idle with CSS animation for breathing
720
723
  const fadeDown = overlay.animate(
721
724
  [
722
- { opacity: currentOpts.intensity, transform: 'scale(1)', filter: 'blur(0px) saturate(1)' },
723
- { opacity: currentOpts.intensity * 0.5, transform: 'scale(0.99)', filter: `blur(${3 * currentOpts.blur}px) saturate(0.75)` },
724
- { opacity: opts.idleOpacity, transform: 'scale(1)', filter: `blur(${8 * currentOpts.blur}px) saturate(0.4)` },
725
+ { opacity: currentOpts.intensity, transform: 'scale(1) translateZ(0)' },
726
+ { opacity: currentOpts.intensity * 0.5, transform: 'scale(0.99) translateZ(0)' },
727
+ { opacity: opts.idleOpacity, transform: 'scale(1) translateZ(0)' },
725
728
  ] as Keyframe[],
726
- {
727
- duration: fadeOutDuration,
728
- easing: exitEasing,
729
- fill: 'forwards',
730
- },
729
+ { duration, easing, fill: 'forwards' },
731
730
  )
732
731
 
733
- // Switch to CSS animation for idle breathing (more efficient)
734
- if (opts.idleBreathe && !reducedMotion) {
735
- from(fadeDown.finished).pipe(
736
- take(1),
737
- catchError(() => EMPTY),
738
- ).subscribe(() => {
739
- if (this.state?.overlay) {
740
- // Use pure CSS animation for idle - no JS overhead
732
+ // After fade-down, gate per-layer animations off via the `dimmed` class — without
733
+ // this, chromatic/iridescent/tendril/particle keyframes keep burning GPU under
734
+ // mix-blend-mode: screen forever even though the stack is visually idle.
735
+ this.state.fadeFinishedSub?.unsubscribe()
736
+ this.state.fadeFinishedSub = from(fadeDown.finished).pipe(
737
+ take(1),
738
+ tap(() => {
739
+ if (!this.state?.overlay) return
740
+ this.state.overlay.classList.add('dimmed')
741
+ if (opts.idleBreathe && !reducedMotion) {
741
742
  this.state.overlay.style.animation = `nebula-idle-breathe ${12000 / currentOpts.speed}ms ${BREATHING_EASING} infinite`
742
743
  }
743
- })
744
- }
744
+ }),
745
+ catchError(() => EMPTY),
746
+ ).subscribe()
745
747
  }
746
748
 
747
749
  private cleanup(): void {
@@ -750,6 +752,7 @@ class NebulaDirective extends AsyncDirective {
750
752
  this.coordinator.unregister(this, this.state.element)
751
753
 
752
754
  this.state.autoHideSub?.unsubscribe()
755
+ this.state.fadeFinishedSub?.unsubscribe()
753
756
 
754
757
  this.state.overlay?.remove()
755
758
  this.state.element.style.position = this.state.originalPosition