@mhmo91/schmancy 0.10.32 → 0.10.34

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 (341) hide show
  1. package/custom-elements.json +7 -22
  2. package/dist/SchmancyElement-CA0Wqt8m.js +284 -0
  3. package/dist/{SchmancyElement-DuzT2AMa.js.map → SchmancyElement-CA0Wqt8m.js.map} +1 -1
  4. package/dist/SchmancyElement-CYIif26I.cjs +2 -0
  5. package/dist/{SchmancyElement-D8_z9JrW.cjs.map → SchmancyElement-CYIif26I.cjs.map} +1 -1
  6. package/dist/agent/schmancy.agent.js +1694 -1728
  7. package/dist/agent/schmancy.agent.js.map +1 -1
  8. package/dist/agent/schmancy.manifest.json +4 -10
  9. package/dist/{area-WGfTrwcJ.cjs → area-CTSTgjlx.cjs} +1 -1
  10. package/dist/{area-WGfTrwcJ.cjs.map → area-CTSTgjlx.cjs.map} +1 -1
  11. package/dist/{area-0l8V7HlF.js → area-DviXdbDx.js} +2 -2
  12. package/dist/{area-0l8V7HlF.js.map → area-DviXdbDx.js.map} +1 -1
  13. package/dist/area.cjs +1 -1
  14. package/dist/area.js +1 -1
  15. package/dist/{audio-x9oLVKBH.js → audio-DFYoaw0M.js} +1 -1
  16. package/dist/{audio-x9oLVKBH.js.map → audio-DFYoaw0M.js.map} +1 -1
  17. package/dist/{audio-9QLk4pU-.cjs → audio-Q9oB_cQR.cjs} +1 -1
  18. package/dist/{audio-9QLk4pU-.cjs.map → audio-Q9oB_cQR.cjs.map} +1 -1
  19. package/dist/audio.cjs +1 -1
  20. package/dist/audio.js +2 -2
  21. package/dist/{autocomplete-sjZovPcs.js → autocomplete-BDvuma6D.js} +3 -3
  22. package/dist/{autocomplete-sjZovPcs.js.map → autocomplete-BDvuma6D.js.map} +1 -1
  23. package/dist/{autocomplete-CjjfXbJC.cjs → autocomplete-DmLXJr7C.cjs} +1 -1
  24. package/dist/{autocomplete-CjjfXbJC.cjs.map → autocomplete-DmLXJr7C.cjs.map} +1 -1
  25. package/dist/autocomplete.cjs +1 -1
  26. package/dist/autocomplete.js +1 -1
  27. package/dist/avatar.cjs +1 -1
  28. package/dist/avatar.js +3 -3
  29. package/dist/badge.cjs +1 -1
  30. package/dist/badge.js +1 -1
  31. package/dist/boat-BgpWcLnV.cjs +38 -0
  32. package/dist/boat-BgpWcLnV.cjs.map +1 -0
  33. package/dist/boat-Y5UMiJCV.js +216 -0
  34. package/dist/boat-Y5UMiJCV.js.map +1 -0
  35. package/dist/boat.cjs +1 -1
  36. package/dist/boat.js +1 -1
  37. package/dist/breadcrumb.cjs +1 -1
  38. package/dist/breadcrumb.js +2 -2
  39. package/dist/{busy-DDKXlzDA.cjs → busy-CgzZbGfx.cjs} +1 -1
  40. package/dist/{busy-DDKXlzDA.cjs.map → busy-CgzZbGfx.cjs.map} +1 -1
  41. package/dist/{busy-DwD-XHqS.js → busy-DgQ4ux5N.js} +2 -2
  42. package/dist/{busy-DwD-XHqS.js.map → busy-DgQ4ux5N.js.map} +1 -1
  43. package/dist/busy.cjs +1 -1
  44. package/dist/busy.js +1 -1
  45. package/dist/{button-nDZQe1ES.cjs → button-DFvR1iXX.cjs} +1 -1
  46. package/dist/{button-nDZQe1ES.cjs.map → button-DFvR1iXX.cjs.map} +1 -1
  47. package/dist/{button-qARUurjf.js → button-qbN1muQ0.js} +2 -2
  48. package/dist/{button-qARUurjf.js.map → button-qbN1muQ0.js.map} +1 -1
  49. package/dist/button.cjs +1 -1
  50. package/dist/button.js +3 -3
  51. package/dist/{card-D3IxxBBP.js → card-DAbr-7Vy.js} +2 -2
  52. package/dist/{card-D3IxxBBP.js.map → card-DAbr-7Vy.js.map} +1 -1
  53. package/dist/{card-DWZhZ5Ds.cjs → card-D_GlwZ5q.cjs} +1 -1
  54. package/dist/{card-DWZhZ5Ds.cjs.map → card-D_GlwZ5q.cjs.map} +1 -1
  55. package/dist/card.cjs +1 -1
  56. package/dist/card.js +1 -1
  57. package/dist/{checkbox-t__wRS-9.js → checkbox-BNORaxMF.js} +2 -2
  58. package/dist/{checkbox-t__wRS-9.js.map → checkbox-BNORaxMF.js.map} +1 -1
  59. package/dist/{checkbox-BBttnA_a.cjs → checkbox-BUY_uc_r.cjs} +1 -1
  60. package/dist/{checkbox-BBttnA_a.cjs.map → checkbox-BUY_uc_r.cjs.map} +1 -1
  61. package/dist/checkbox.cjs +1 -1
  62. package/dist/checkbox.js +1 -1
  63. package/dist/{chips-DIZFWnDZ.cjs → chips-CXZ4dJCK.cjs} +1 -1
  64. package/dist/{chips-DIZFWnDZ.cjs.map → chips-CXZ4dJCK.cjs.map} +1 -1
  65. package/dist/{chips-xaoSmwBK.js → chips-Dg6Lk6BT.js} +4 -4
  66. package/dist/{chips-xaoSmwBK.js.map → chips-Dg6Lk6BT.js.map} +1 -1
  67. package/dist/chips.cjs +1 -1
  68. package/dist/chips.js +2 -2
  69. package/dist/connectivity.cjs +1 -1
  70. package/dist/connectivity.js +3 -3
  71. package/dist/content-drawer.cjs +1 -1
  72. package/dist/content-drawer.js +1 -1
  73. package/dist/{date-range-8OkCahnR.js → date-range-BU6WX7d5.js} +3 -3
  74. package/dist/{date-range-8OkCahnR.js.map → date-range-BU6WX7d5.js.map} +1 -1
  75. package/dist/{date-range-Bbzg9aym.cjs → date-range-C-_be3_E.cjs} +1 -1
  76. package/dist/{date-range-Bbzg9aym.cjs.map → date-range-C-_be3_E.cjs.map} +1 -1
  77. package/dist/{date-range-inline-BEP-oWJZ.js → date-range-inline-7o7xtVIu.js} +2 -2
  78. package/dist/{date-range-inline-BEP-oWJZ.js.map → date-range-inline-7o7xtVIu.js.map} +1 -1
  79. package/dist/{date-range-inline-lhkwHFxY.cjs → date-range-inline-DJtUmHKF.cjs} +1 -1
  80. package/dist/{date-range-inline-lhkwHFxY.cjs.map → date-range-inline-DJtUmHKF.cjs.map} +1 -1
  81. package/dist/date-range-inline.cjs +1 -1
  82. package/dist/date-range-inline.js +1 -1
  83. package/dist/date-range.cjs +1 -1
  84. package/dist/date-range.js +1 -1
  85. package/dist/delay.cjs +1 -1
  86. package/dist/delay.js +2 -2
  87. package/dist/{details-3X9YKpuP.cjs → details-Bs0MyyvF.cjs} +1 -1
  88. package/dist/{details-3X9YKpuP.cjs.map → details-Bs0MyyvF.cjs.map} +1 -1
  89. package/dist/{details-BO_3CCNn.js → details-EfbDPVEo.js} +2 -2
  90. package/dist/{details-BO_3CCNn.js.map → details-EfbDPVEo.js.map} +1 -1
  91. package/dist/details.cjs +1 -1
  92. package/dist/details.js +1 -1
  93. package/dist/{directives-CPFrvZVC.cjs → directives-fLwDj6b0.cjs} +11 -11
  94. package/dist/directives-fLwDj6b0.cjs.map +1 -0
  95. package/dist/{directives-ltIff8q0.js → directives-zi1Mm2er.js} +233 -160
  96. package/dist/directives-zi1Mm2er.js.map +1 -0
  97. package/dist/directives.cjs +1 -1
  98. package/dist/directives.js +2 -2
  99. package/dist/{divider-BHgrisGQ.js → divider-CEPfrIwe.js} +2 -2
  100. package/dist/{divider-BHgrisGQ.js.map → divider-CEPfrIwe.js.map} +1 -1
  101. package/dist/{divider-D21yKZNJ.cjs → divider-CdIsWZrM.cjs} +1 -1
  102. package/dist/{divider-D21yKZNJ.cjs.map → divider-CdIsWZrM.cjs.map} +1 -1
  103. package/dist/divider.cjs +1 -1
  104. package/dist/divider.js +1 -1
  105. package/dist/dropdown.cjs +1 -1
  106. package/dist/dropdown.js +2 -2
  107. package/dist/{expand-wRphbpW6.cjs → expand--at1k3qo.cjs} +1 -1
  108. package/dist/{expand-wRphbpW6.cjs.map → expand--at1k3qo.cjs.map} +1 -1
  109. package/dist/{expand-2TTbmm_z.js → expand-g1vqqUp1.js} +3 -3
  110. package/dist/{expand-2TTbmm_z.js.map → expand-g1vqqUp1.js.map} +1 -1
  111. package/dist/expand.cjs +1 -1
  112. package/dist/expand.js +1 -1
  113. package/dist/{float-dtDqRmcL.js → float-DxVzgI9o.js} +2 -2
  114. package/dist/{float-dtDqRmcL.js.map → float-DxVzgI9o.js.map} +1 -1
  115. package/dist/{float-B0L_CH4v.cjs → float-P9HukAm-.cjs} +1 -1
  116. package/dist/{float-B0L_CH4v.cjs.map → float-P9HukAm-.cjs.map} +1 -1
  117. package/dist/float.cjs +1 -1
  118. package/dist/float.js +1 -1
  119. package/dist/{form-DvqHReDF.cjs → form-ByYhXe1p.cjs} +1 -1
  120. package/dist/{form-DvqHReDF.cjs.map → form-ByYhXe1p.cjs.map} +1 -1
  121. package/dist/{form-BxY-9F6N.js → form-CqLaozHp.js} +3 -3
  122. package/dist/{form-BxY-9F6N.js.map → form-CqLaozHp.js.map} +1 -1
  123. package/dist/form.cjs +1 -1
  124. package/dist/form.js +10 -10
  125. package/dist/handover/agent-runtime-followups.md +1 -1
  126. package/dist/handover/agent-runtime-v1.md +3 -3
  127. package/dist/{icons-CO8UrTJQ.js → icons-CkphcMp6.js} +2 -2
  128. package/dist/{icons-CO8UrTJQ.js.map → icons-CkphcMp6.js.map} +1 -1
  129. package/dist/{icons-BbC4t44c.cjs → icons-DYtiRU5V.cjs} +1 -1
  130. package/dist/{icons-BbC4t44c.cjs.map → icons-DYtiRU5V.cjs.map} +1 -1
  131. package/dist/icons.cjs +1 -1
  132. package/dist/icons.js +1 -1
  133. package/dist/{iframe-BepoWz9Z.cjs → iframe-C3trkP8q.cjs} +1 -1
  134. package/dist/{iframe-BepoWz9Z.cjs.map → iframe-C3trkP8q.cjs.map} +1 -1
  135. package/dist/{iframe-t5zo89Fs.js → iframe-CjqJksl8.js} +2 -2
  136. package/dist/{iframe-t5zo89Fs.js.map → iframe-CjqJksl8.js.map} +1 -1
  137. package/dist/iframe.cjs +1 -1
  138. package/dist/iframe.js +1 -1
  139. package/dist/index.cjs +1 -1
  140. package/dist/index.js +37 -37
  141. package/dist/{input-2OR6wjfT.js → input-CG51zDVh.js} +2 -2
  142. package/dist/{input-2OR6wjfT.js.map → input-CG51zDVh.js.map} +1 -1
  143. package/dist/{input-B-wPPC5o.cjs → input-DuavpwNL.cjs} +1 -1
  144. package/dist/{input-B-wPPC5o.cjs.map → input-DuavpwNL.cjs.map} +1 -1
  145. package/dist/{input-chip-O5-pgek1.cjs → input-chip-57tgNXKT.cjs} +1 -1
  146. package/dist/{input-chip-O5-pgek1.cjs.map → input-chip-57tgNXKT.cjs.map} +1 -1
  147. package/dist/{input-chip-NBsnZkzu.js → input-chip-C6Lq1927.js} +2 -2
  148. package/dist/{input-chip-NBsnZkzu.js.map → input-chip-C6Lq1927.js.map} +1 -1
  149. package/dist/input.cjs +1 -1
  150. package/dist/input.js +1 -1
  151. package/dist/json.cjs +1 -1
  152. package/dist/json.js +3 -3
  153. package/dist/kbd.cjs +1 -1
  154. package/dist/kbd.js +2 -2
  155. package/dist/{layout-D7nKwpa5.cjs → layout-6ipbiWTl.cjs} +1 -1
  156. package/dist/{layout-D7nKwpa5.cjs.map → layout-6ipbiWTl.cjs.map} +1 -1
  157. package/dist/{layout-CJ01zE9V.js → layout-D4IOwx7p.js} +1 -1
  158. package/dist/{layout-CJ01zE9V.js.map → layout-D4IOwx7p.js.map} +1 -1
  159. package/dist/layout.cjs +1 -1
  160. package/dist/layout.js +2 -2
  161. package/dist/{lightbox-Droe9dYY.js → lightbox-CsyO2XSr.js} +2 -2
  162. package/dist/{lightbox-Droe9dYY.js.map → lightbox-CsyO2XSr.js.map} +1 -1
  163. package/dist/{lightbox-DVpvjsYb.cjs → lightbox-H8pVWGMX.cjs} +1 -1
  164. package/dist/{lightbox-DVpvjsYb.cjs.map → lightbox-H8pVWGMX.cjs.map} +1 -1
  165. package/dist/lightbox.cjs +1 -1
  166. package/dist/lightbox.js +1 -1
  167. package/dist/{list-DzAWv99q.js → list-BAwH0pQW.js} +2 -2
  168. package/dist/{list-DzAWv99q.js.map → list-BAwH0pQW.js.map} +1 -1
  169. package/dist/{list-JjUsFCP6.cjs → list-Bs9m8kw7.cjs} +1 -1
  170. package/dist/{list-JjUsFCP6.cjs.map → list-Bs9m8kw7.cjs.map} +1 -1
  171. package/dist/list.cjs +1 -1
  172. package/dist/list.js +1 -1
  173. package/dist/{menu-B5EKUeeD.cjs → menu-BMcGzj1h.cjs} +1 -1
  174. package/dist/{menu-B5EKUeeD.cjs.map → menu-BMcGzj1h.cjs.map} +1 -1
  175. package/dist/{menu-CgdXrzir.js → menu-tQVARVaC.js} +3 -3
  176. package/dist/{menu-CgdXrzir.js.map → menu-tQVARVaC.js.map} +1 -1
  177. package/dist/menu.cjs +1 -1
  178. package/dist/menu.js +1 -1
  179. package/dist/{mixins-Cevarn7V.js → mixins-Bp0wIHg2.js} +1 -1
  180. package/dist/{mixins-Cevarn7V.js.map → mixins-Bp0wIHg2.js.map} +1 -1
  181. package/dist/{mixins-JyO9GSGy.cjs → mixins-CGXSzZc7.cjs} +1 -1
  182. package/dist/{mixins-JyO9GSGy.cjs.map → mixins-CGXSzZc7.cjs.map} +1 -1
  183. package/dist/mixins.cjs +1 -1
  184. package/dist/mixins.js +2 -2
  185. package/dist/nav-drawer.cjs +1 -1
  186. package/dist/nav-drawer.js +1 -1
  187. package/dist/navigation-bar.cjs +1 -1
  188. package/dist/navigation-bar.js +1 -1
  189. package/dist/navigation-rail.cjs +1 -1
  190. package/dist/navigation-rail.js +2 -2
  191. package/dist/{notification-CaeRS5US.cjs → notification-Bz00zdpV.cjs} +1 -1
  192. package/dist/{notification-CaeRS5US.cjs.map → notification-Bz00zdpV.cjs.map} +1 -1
  193. package/dist/{notification-Dxwx0Zln.js → notification-D1tX2nx5.js} +4 -4
  194. package/dist/{notification-Dxwx0Zln.js.map → notification-D1tX2nx5.js.map} +1 -1
  195. package/dist/notification.cjs +1 -1
  196. package/dist/notification.js +1 -1
  197. package/dist/{option-C6wXFQOM.cjs → option-BnybLEDO.cjs} +1 -1
  198. package/dist/{option-C6wXFQOM.cjs.map → option-BnybLEDO.cjs.map} +1 -1
  199. package/dist/{option-BCnYutZz.js → option-BpGV8Apj.js} +2 -2
  200. package/dist/{option-BCnYutZz.js.map → option-BpGV8Apj.js.map} +1 -1
  201. package/dist/option.cjs +1 -1
  202. package/dist/option.js +1 -1
  203. package/dist/{overlay-BWcB2pRx.js → overlay-BpNhd74N.js} +24 -7
  204. package/dist/overlay-BpNhd74N.js.map +1 -0
  205. package/dist/{overlay-5PMZ75PO.cjs → overlay-UQR2Dy3u.cjs} +18 -3
  206. package/dist/overlay-UQR2Dy3u.cjs.map +1 -0
  207. package/dist/overlay.cjs +1 -1
  208. package/dist/{overlay.confirm-body-B7W0DOGS.js → overlay.confirm-body-BHcXu5Wk.js} +6 -6
  209. package/dist/{overlay.confirm-body-B7W0DOGS.js.map → overlay.confirm-body-BHcXu5Wk.js.map} +1 -1
  210. package/dist/{overlay.confirm-body-CsvwcBvG.cjs → overlay.confirm-body-CVDtVk5X.cjs} +1 -1
  211. package/dist/{overlay.confirm-body-CsvwcBvG.cjs.map → overlay.confirm-body-CVDtVk5X.cjs.map} +1 -1
  212. package/dist/overlay.js +3 -3
  213. package/dist/{overlay.service-CC4zckoV.cjs → overlay.service-C8RsQzgM.cjs} +1 -1
  214. package/dist/{overlay.service-CC4zckoV.cjs.map → overlay.service-C8RsQzgM.cjs.map} +1 -1
  215. package/dist/{overlay.service-zx465FI8.js → overlay.service-DTE6NwIM.js} +2 -2
  216. package/dist/{overlay.service-zx465FI8.js.map → overlay.service-DTE6NwIM.js.map} +1 -1
  217. package/dist/{progress-BoFm3r6h.js → progress-CAKsxp29.js} +2 -2
  218. package/dist/{progress-BoFm3r6h.js.map → progress-CAKsxp29.js.map} +1 -1
  219. package/dist/{progress-Bc_IBaNH.cjs → progress-gbIALDRs.cjs} +1 -1
  220. package/dist/{progress-Bc_IBaNH.cjs.map → progress-gbIALDRs.cjs.map} +1 -1
  221. package/dist/progress.cjs +1 -1
  222. package/dist/progress.js +1 -1
  223. package/dist/{radio-group-C34WDjrN.cjs → radio-group-CfJ5DtI4.cjs} +1 -1
  224. package/dist/{radio-group-C34WDjrN.cjs.map → radio-group-CfJ5DtI4.cjs.map} +1 -1
  225. package/dist/{radio-group-DnHhGrXp.js → radio-group-otyvZvUk.js} +2 -2
  226. package/dist/{radio-group-DnHhGrXp.js.map → radio-group-otyvZvUk.js.map} +1 -1
  227. package/dist/radio-group.cjs +1 -1
  228. package/dist/radio-group.js +1 -1
  229. package/dist/range.cjs +1 -1
  230. package/dist/range.js +2 -2
  231. package/dist/{select-ypXSw5IR.cjs → select-81jniVTs.cjs} +1 -1
  232. package/dist/{select-ypXSw5IR.cjs.map → select-81jniVTs.cjs.map} +1 -1
  233. package/dist/{select-oZGIVus4.js → select-9vXx1fhr.js} +3 -3
  234. package/dist/{select-oZGIVus4.js.map → select-9vXx1fhr.js.map} +1 -1
  235. package/dist/select.cjs +1 -1
  236. package/dist/select.js +1 -1
  237. package/dist/skeleton.cjs +1 -1
  238. package/dist/skeleton.js +2 -2
  239. package/dist/skills/boat.md +27 -18
  240. package/dist/skills/schmancy/boat.md +27 -18
  241. package/dist/slider.cjs +1 -1
  242. package/dist/slider.js +2 -2
  243. package/dist/{sound.service-Czs3gmRx.cjs → sound.service-CmIw63aM.cjs} +1 -1
  244. package/dist/{sound.service-Czs3gmRx.cjs.map → sound.service-CmIw63aM.cjs.map} +1 -1
  245. package/dist/{sound.service-Cuo4-X_-.js → sound.service-D3ZSq1Kj.js} +1 -1
  246. package/dist/{sound.service-Cuo4-X_-.js.map → sound.service-D3ZSq1Kj.js.map} +1 -1
  247. package/dist/{splash-screen-CbcYpkIx.js → splash-screen-BOjrmGLk.js} +2 -2
  248. package/dist/{splash-screen-CbcYpkIx.js.map → splash-screen-BOjrmGLk.js.map} +1 -1
  249. package/dist/{splash-screen-C0oeDPxV.cjs → splash-screen-C5KAWXvA.cjs} +1 -1
  250. package/dist/{splash-screen-C0oeDPxV.cjs.map → splash-screen-C5KAWXvA.cjs.map} +1 -1
  251. package/dist/splash-screen.cjs +1 -1
  252. package/dist/splash-screen.js +1 -1
  253. package/dist/{src-_OZKm1Am.cjs → src-Bm1vop0l.cjs} +1 -1
  254. package/dist/{src-_OZKm1Am.cjs.map → src-Bm1vop0l.cjs.map} +1 -1
  255. package/dist/{src-CDdxnUbF.js → src-DoOhMBtI.js} +35 -35
  256. package/dist/{src-CDdxnUbF.js.map → src-DoOhMBtI.js.map} +1 -1
  257. package/dist/{state-B-5H9i10.js → state-CWBRTSvE.js} +1 -1
  258. package/dist/{state-B-5H9i10.js.map → state-CWBRTSvE.js.map} +1 -1
  259. package/dist/{state-D85Se4Fx.cjs → state-Cex3rmx2.cjs} +1 -1
  260. package/dist/{state-D85Se4Fx.cjs.map → state-Cex3rmx2.cjs.map} +1 -1
  261. package/dist/state.cjs +1 -1
  262. package/dist/state.js +2 -2
  263. package/dist/steps.cjs +1 -1
  264. package/dist/steps.js +2 -2
  265. package/dist/{surface-gZpeCF6E.js → surface-9S5scTsD.js} +2 -2
  266. package/dist/{surface-gZpeCF6E.js.map → surface-9S5scTsD.js.map} +1 -1
  267. package/dist/{surface-DHPaLOTA.cjs → surface-PfiejLuw.cjs} +1 -1
  268. package/dist/{surface-DHPaLOTA.cjs.map → surface-PfiejLuw.cjs.map} +1 -1
  269. package/dist/surface.cjs +1 -1
  270. package/dist/surface.js +1 -1
  271. package/dist/switch.cjs +1 -1
  272. package/dist/switch.js +2 -2
  273. package/dist/table.cjs +1 -1
  274. package/dist/table.js +2 -2
  275. package/dist/{tabs-DJNdoE-x.js → tabs-BBOjAmgG.js} +2 -2
  276. package/dist/{tabs-DJNdoE-x.js.map → tabs-BBOjAmgG.js.map} +1 -1
  277. package/dist/{tabs-DgaVwuOo.cjs → tabs-uYvb1P06.cjs} +1 -1
  278. package/dist/{tabs-DgaVwuOo.cjs.map → tabs-uYvb1P06.cjs.map} +1 -1
  279. package/dist/tabs.cjs +1 -1
  280. package/dist/tabs.js +1 -1
  281. package/dist/teleport.cjs +1 -1
  282. package/dist/teleport.js +1 -1
  283. package/dist/{textarea-8x0prbgm.js → textarea-QzSj8Dkl.js} +2 -2
  284. package/dist/{textarea-8x0prbgm.js.map → textarea-QzSj8Dkl.js.map} +1 -1
  285. package/dist/{textarea-2QE5z6Ny.cjs → textarea-YPHX4g7Y.cjs} +1 -1
  286. package/dist/{textarea-2QE5z6Ny.cjs.map → textarea-YPHX4g7Y.cjs.map} +1 -1
  287. package/dist/textarea.cjs +1 -1
  288. package/dist/textarea.js +1 -1
  289. package/dist/{theme-DSD9Bs69.js → theme-C2Mp-VGt.js} +4 -4
  290. package/dist/{theme-DSD9Bs69.js.map → theme-C2Mp-VGt.js.map} +1 -1
  291. package/dist/{theme-button-Dpr6SGzB.cjs → theme-button-CJmhxfMe.cjs} +1 -1
  292. package/dist/{theme-button-Dpr6SGzB.cjs.map → theme-button-CJmhxfMe.cjs.map} +1 -1
  293. package/dist/{theme-button-nd6Z7plT.js → theme-button-DGWAXhzd.js} +2 -2
  294. package/dist/{theme-button-nd6Z7plT.js.map → theme-button-DGWAXhzd.js.map} +1 -1
  295. package/dist/theme-button.cjs +1 -1
  296. package/dist/theme-button.js +1 -1
  297. package/dist/{theme-D0yboni1.cjs → theme-iKUaS9JB.cjs} +1 -1
  298. package/dist/{theme-D0yboni1.cjs.map → theme-iKUaS9JB.cjs.map} +1 -1
  299. package/dist/theme.cjs +1 -1
  300. package/dist/theme.js +3 -3
  301. package/dist/{theme.service-mRlvWZVs.js → theme.service-hc4N-1Oz.js} +1 -1
  302. package/dist/{theme.service-mRlvWZVs.js.map → theme.service-hc4N-1Oz.js.map} +1 -1
  303. package/dist/{theme.service-LtQw04e6.cjs → theme.service-p61RsJBF.cjs} +1 -1
  304. package/dist/{theme.service-LtQw04e6.cjs.map → theme.service-p61RsJBF.cjs.map} +1 -1
  305. package/dist/tree.cjs +1 -1
  306. package/dist/tree.js +2 -2
  307. package/dist/{typography-CiZQpzE4.cjs → typography-Bdt8RlX2.cjs} +1 -1
  308. package/dist/{typography-CiZQpzE4.cjs.map → typography-Bdt8RlX2.cjs.map} +1 -1
  309. package/dist/{typography-DXyf-KdK.js → typography-DwV0sqht.js} +2 -2
  310. package/dist/{typography-DXyf-KdK.js.map → typography-DwV0sqht.js.map} +1 -1
  311. package/dist/typography.cjs +1 -1
  312. package/dist/typography.js +1 -1
  313. package/dist/visually-hidden.cjs +1 -1
  314. package/dist/visually-hidden.js +2 -2
  315. package/dist/{window-qKfP5c6M.cjs → window-D2WfvNng.cjs} +1 -1
  316. package/dist/{window-qKfP5c6M.cjs.map → window-D2WfvNng.cjs.map} +1 -1
  317. package/dist/{window-C_ATa3qM.js → window-n4jN60B_.js} +3 -3
  318. package/dist/{window-C_ATa3qM.js.map → window-n4jN60B_.js.map} +1 -1
  319. package/dist/window.cjs +1 -1
  320. package/dist/window.js +1 -1
  321. package/package.json +21 -21
  322. package/skills/schmancy/boat.md +27 -18
  323. package/src/boat/boat.ts +121 -365
  324. package/src/directives/art/art.directive.ts +4 -2
  325. package/src/directives/art/effects/starfield.ts +222 -77
  326. package/src/directives/art/types.ts +41 -6
  327. package/src/overlay/overlay.component.ts +28 -0
  328. package/types/src/boat/boat.d.ts +18 -25
  329. package/types/src/directives/art/effects/starfield.d.ts +11 -4
  330. package/types/src/directives/art/types.d.ts +41 -6
  331. package/types/src/overlay/overlay.component.d.ts +1 -0
  332. package/dist/SchmancyElement-D8_z9JrW.cjs +0 -2
  333. package/dist/SchmancyElement-DuzT2AMa.js +0 -284
  334. package/dist/boat-CEaQaCmG.js +0 -339
  335. package/dist/boat-CEaQaCmG.js.map +0 -1
  336. package/dist/boat-CI5rcGS5.cjs +0 -85
  337. package/dist/boat-CI5rcGS5.cjs.map +0 -1
  338. package/dist/directives-CPFrvZVC.cjs.map +0 -1
  339. package/dist/directives-ltIff8q0.js.map +0 -1
  340. package/dist/overlay-5PMZ75PO.cjs.map +0 -1
  341. package/dist/overlay-BWcB2pRx.js.map +0 -1
@@ -1,107 +1,252 @@
1
1
  /**
2
- * Starfield Effect — Night sky with twinkling stars.
2
+ * Starfield Effect — surreal deep-space drift with rare comets.
3
3
  *
4
- * 6 groups × 7 stars using CSS radial-gradient backgrounds.
5
- * Wave-by-wave fade-in (group 0 first, then 1, 2, …); gentle twinkle once visible.
6
- * Opacity driven by RAF instead of CSS @keyframes to avoid Shadow DOM scoping.
4
+ * A recessive page backdrop. One <canvas>; stars live in
5
+ * structure-of-arrays Float32Array tables (zero per-frame allocation) and
6
+ * render as pre-rendered glow sprites via drawImage no gradient is built
7
+ * inside the RAF loop. Three parallax depth layers drift on slow orbit paths;
8
+ * colour temperature runs blue-white → warm; entrance reveals far→near in
9
+ * waves behind a faint corner nebula; a pooled comet streaks by rarely.
10
+ * Sparse and dim by design — tune reach with the `density` ArtOption.
11
+ *
12
+ * Performance budget: ≤ MAX_STAR_COUNT drawImage calls + one nebula blit per
13
+ * frame, dpr capped at 2, the whole field idle under prefers-reduced-motion.
7
14
  */
8
15
 
9
16
  import type { ArtState } from '../types'
10
17
  import { createOverlayContainer } from '../utils'
11
18
 
12
- const GROUP_COUNT = 6
13
- const STARS_PER_GROUP = 7
14
-
15
- function generateStarGroups() {
16
- return Array.from({ length: GROUP_COUNT }, (_, g) => {
17
- const stops: string[] = []
18
- for (let i = 0; i < STARS_PER_GROUP; i++) {
19
- const x = Math.random() * 96 + 2
20
- const y = Math.random() * 94 + 3
21
- const size = 0.8 + Math.random() * 1.5
22
- const alpha = 0.3 + Math.random() * 0.7
23
- stops.push(
24
- `radial-gradient(circle ${size}px at ${x}% ${y}%, rgba(255,255,255,${alpha}) 0%, transparent 100%)`,
25
- )
26
- }
27
- const appearDelay = g * 0.6
28
- return {
29
- bg: stops.join(','),
30
- appearDelay,
31
- twinkleDuration: 5 + g * 0.7,
32
- twinkleDelay: appearDelay + 2.5,
33
- }
34
- })
35
- }
19
+ const BASE_STAR_COUNT = 90
20
+ // Hard ceiling: a wide monitor must never carpet, whatever the density prop asks.
21
+ const MAX_STAR_COUNT = 140
22
+ const COMET_POOL = 3
23
+ const APPEAR_DURATION = 2.5
24
+ const SPRITE_PX = 64
25
+ // Cool warm. Index 0 is the dominant blue-white; the tail warms toward amber.
26
+ const TEMPERATURE_RGB = [
27
+ [205, 222, 255],
28
+ [224, 233, 255],
29
+ [255, 255, 255],
30
+ [255, 240, 214],
31
+ [255, 222, 184],
32
+ ]
36
33
 
37
34
  export function createStarfieldOverlay(state: ArtState): void {
38
35
  const { element } = state
39
36
  const overlay = createOverlayContainer('starfield-overlay')
40
37
 
41
- const starArea = document.createElement('div')
42
- starArea.style.cssText = 'position:absolute;bottom:0;right:0;width:66vw;height:66vw;'
43
- overlay.appendChild(starArea)
44
-
45
- const generated = generateStarGroups()
46
- const groups: NonNullable<ArtState['starfield']>['groups'] = []
47
-
48
- for (const g of generated) {
49
- const div = document.createElement('div')
50
- div.style.cssText = `position:absolute;inset:0;opacity:0;will-change:opacity;background:${g.bg};`
51
- starArea.appendChild(div)
52
- groups.push({
53
- element: div,
54
- appearDelay: g.appearDelay,
55
- twinkleDuration: g.twinkleDuration,
56
- twinkleDelay: g.twinkleDelay,
57
- })
38
+ const canvas = document.createElement('canvas')
39
+ canvas.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;'
40
+ overlay.appendChild(canvas)
41
+ element.appendChild(overlay)
42
+
43
+ const ctx = canvas.getContext('2d')
44
+ if (!ctx) return
45
+
46
+ const dpr = Math.min(window.devicePixelRatio || 1, 2)
47
+ const rect = element.getBoundingClientRect()
48
+ const deviceWidth = Math.max(1, Math.round(rect.width * dpr))
49
+ const deviceHeight = Math.max(1, Math.round(rect.height * dpr))
50
+ canvas.width = deviceWidth
51
+ canvas.height = deviceHeight
52
+
53
+ const sprites = TEMPERATURE_RGB.map(([r, g, b]) => {
54
+ const s = document.createElement('canvas')
55
+ s.width = SPRITE_PX
56
+ s.height = SPRITE_PX
57
+ const sc = s.getContext('2d')!
58
+ const grad = sc.createRadialGradient(SPRITE_PX / 2, SPRITE_PX / 2, 0, SPRITE_PX / 2, SPRITE_PX / 2, SPRITE_PX / 2)
59
+ grad.addColorStop(0, `rgba(${r},${g},${b},1)`)
60
+ grad.addColorStop(0.18, `rgba(${r},${g},${b},0.35)`)
61
+ grad.addColorStop(0.5, `rgba(${r},${g},${b},0)`)
62
+ sc.fillStyle = grad
63
+ sc.fillRect(0, 0, SPRITE_PX, SPRITE_PX)
64
+ return s
65
+ })
66
+
67
+ const nebula = document.createElement('canvas')
68
+ nebula.width = 512
69
+ nebula.height = 512
70
+ const nc = nebula.getContext('2d')!
71
+ const ng = nc.createRadialGradient(256, 256, 0, 256, 256, 256)
72
+ ng.addColorStop(0, 'rgba(150,170,255,0.16)')
73
+ ng.addColorStop(0.4, 'rgba(120,110,210,0.07)')
74
+ ng.addColorStop(1, 'rgba(0,0,0,0)')
75
+ nc.fillStyle = ng
76
+ nc.fillRect(0, 0, 512, 512)
77
+
78
+ const starCount = Math.min(
79
+ MAX_STAR_COUNT,
80
+ Math.round(BASE_STAR_COUNT * Math.min(1, Math.max(0.5, (rect.width * rect.height) / (1280 * 720))) * state.density),
81
+ )
82
+ const sx = new Float32Array(starCount)
83
+ const sy = new Float32Array(starCount)
84
+ const sr = new Float32Array(starCount)
85
+ const sphase = new Float32Array(starCount)
86
+ const stwinkle = new Float32Array(starCount)
87
+ const sdepth = new Float32Array(starCount)
88
+ const sbucket = new Uint8Array(starCount)
89
+ const sappear = new Float32Array(starCount)
90
+
91
+ for (let i = 0; i < starCount; i++) {
92
+ const depthBand = i % 3 // 0 far, 1 mid, 2 near — even split across layers
93
+ const depth = depthBand === 0 ? 0.18 : depthBand === 1 ? 0.5 : 1
94
+ sx[i] = Math.random()
95
+ sy[i] = Math.random()
96
+ sr[i] = (0.7 + Math.random() * 1.6) * (0.6 + 0.7 * depth)
97
+ sphase[i] = Math.random() * Math.PI * 2
98
+ stwinkle[i] = 0.6 + Math.random() * 1.8
99
+ sdepth[i] = depth
100
+ // Field skews blue-white; only a minority warms — that asymmetry reads as authored.
101
+ sbucket[i] = Math.random() < 0.7 ? (Math.random() < 0.5 ? 0 : 1) : 2 + Math.floor(Math.random() * 3)
102
+ // Far layer arrives first, near layer last → the depth reveals as waves.
103
+ sappear[i] = (1 - depth) * 1.6 + Math.random() * 0.8
58
104
  }
59
105
 
60
- element.appendChild(overlay)
61
106
  state.overlayElement = overlay
62
- state.starfield = { groups, startTime: performance.now() }
107
+ state.starfield = {
108
+ canvas,
109
+ ctx,
110
+ sprites,
111
+ nebula,
112
+ starCount,
113
+ sx,
114
+ sy,
115
+ sr,
116
+ sphase,
117
+ stwinkle,
118
+ sdepth,
119
+ sbucket,
120
+ sappear,
121
+ cx: new Float32Array(COMET_POOL),
122
+ cy: new Float32Array(COMET_POOL),
123
+ cvx: new Float32Array(COMET_POOL),
124
+ cvy: new Float32Array(COMET_POOL),
125
+ clife: new Float32Array(COMET_POOL),
126
+ cometCount: COMET_POOL,
127
+ nextCometAt: performance.now() + 14000 + Math.random() * 16000,
128
+ dpr,
129
+ deviceWidth,
130
+ deviceHeight,
131
+ reducedMotion: window.matchMedia('(prefers-reduced-motion: reduce)').matches,
132
+ drawnStatic: false,
133
+ lastFrame: performance.now(),
134
+ startTime: performance.now(),
135
+ }
63
136
  }
64
137
 
65
138
  export function animateStarfield(state: ArtState, currentTime: number): void {
66
- if (!state.starfield) return
139
+ const sf = state.starfield
140
+ if (!sf) return
67
141
 
68
142
  const { intensity = 1, speed = 1 } = state
69
- const { groups, startTime } = state.starfield
70
- const elapsed = ((currentTime - startTime) / 1000) * speed
143
+ const { ctx, canvas } = sf
144
+
145
+ if (intensity <= 0) {
146
+ ctx.clearRect(0, 0, sf.deviceWidth, sf.deviceHeight)
147
+ return
148
+ }
71
149
 
72
- for (const g of groups) {
73
- if (intensity <= 0) {
74
- g.element.style.opacity = '0'
150
+ // One layout read per frame; resize only when the backing store must change.
151
+ const cssW = canvas.clientWidth
152
+ const cssH = canvas.clientHeight
153
+ const wantW = Math.max(1, Math.round(cssW * sf.dpr))
154
+ const wantH = Math.max(1, Math.round(cssH * sf.dpr))
155
+ if (wantW !== sf.deviceWidth || wantH !== sf.deviceHeight) {
156
+ canvas.width = wantW
157
+ canvas.height = wantH
158
+ sf.deviceWidth = wantW
159
+ sf.deviceHeight = wantH
160
+ sf.drawnStatic = false
161
+ }
162
+
163
+ const W = sf.deviceWidth
164
+ const H = sf.deviceHeight
165
+
166
+ if (sf.reducedMotion && sf.drawnStatic) return
167
+
168
+ const elapsed = ((currentTime - sf.startTime) / 1000) * speed
169
+ const dt = Math.min((currentTime - sf.lastFrame) / 1000, 0.05)
170
+ sf.lastFrame = currentTime
171
+
172
+ ctx.clearRect(0, 0, W, H)
173
+
174
+ // Entrance nebula: blooms in over the first ~4s, then holds at a faint floor.
175
+ const nebulaAlpha = (Math.min(1, elapsed / 4) * 0.7 + 0.3) * 0.14 * intensity
176
+ if (nebulaAlpha > 0.001) {
177
+ const nSize = Math.max(W, H) * 1.3
178
+ ctx.globalAlpha = nebulaAlpha
179
+ ctx.drawImage(sf.nebula, W * 0.78 - nSize / 2, H * 0.28 - nSize / 2, nSize, nSize)
180
+ }
181
+
182
+ // Normal compositing — additive blend is what turned overlap into a glowing carpet.
183
+ for (let i = 0; i < sf.starCount; i++) {
184
+ const appear = sf.sappear[i]
185
+ let reveal: number
186
+ if (sf.reducedMotion) {
187
+ reveal = 1
188
+ } else if (elapsed < appear) {
75
189
  continue
190
+ } else if (elapsed < appear + APPEAR_DURATION) {
191
+ const t = (elapsed - appear) / APPEAR_DURATION
192
+ reveal = 1 - (1 - t) * (1 - t) * (1 - t)
193
+ } else {
194
+ reveal = 1
76
195
  }
77
196
 
78
- const appearStart = g.appearDelay
79
- const appearEnd = appearStart + 2.5
80
- let opacity: number
197
+ const depth = sf.sdepth[i]
198
+ const twinkle = sf.reducedMotion ? 0.9 : 0.82 + 0.18 * Math.sin(elapsed * sf.stwinkle[i] + sf.sphase[i])
81
199
 
82
- if (elapsed < appearStart) {
83
- opacity = 0
84
- } else if (elapsed < appearEnd) {
85
- const t = (elapsed - appearStart) / 2.5
86
- opacity = 1 - Math.pow(1 - t, 3)
87
- } else {
88
- const twinkleElapsed = elapsed - g.twinkleDelay
89
- if (twinkleElapsed < 0) {
90
- opacity = 1
91
- } else {
92
- const cycle = (twinkleElapsed % g.twinkleDuration) / g.twinkleDuration
93
- if (cycle < 0.25) {
94
- opacity = 1 - (cycle / 0.25) * 0.4
95
- } else if (cycle < 0.5) {
96
- opacity = 0.6 + ((cycle - 0.25) / 0.25) * 0.25
97
- } else if (cycle < 0.75) {
98
- opacity = 0.85 - ((cycle - 0.5) / 0.25) * 0.3
99
- } else {
100
- opacity = 0.55 + ((cycle - 0.75) / 0.25) * 0.45
101
- }
200
+ // Slow orbit drift, amplitude scaled by depth — the parallax is the surreality.
201
+ const driftAmp = sf.reducedMotion ? 0 : depth * 14 * sf.dpr
202
+ const px = sf.sx[i] * W + Math.sin(elapsed * 0.05 + sf.sphase[i]) * driftAmp
203
+ const py = sf.sy[i] * H + Math.cos(elapsed * 0.04 + sf.sphase[i]) * driftAmp * 0.6
204
+
205
+ const size = sf.sr[i] * sf.dpr * 2.3
206
+ ctx.globalAlpha = reveal * twinkle * (0.3 + 0.5 * depth) * intensity
207
+ ctx.drawImage(sf.sprites[sf.sbucket[i]], px - size, py - size, size * 2, size * 2)
208
+ }
209
+
210
+ if (!sf.reducedMotion) {
211
+ if (currentTime >= sf.nextCometAt) {
212
+ for (let c = 0; c < sf.cometCount; c++) {
213
+ if (sf.clife[c] > 0) continue
214
+ const fromLeft = Math.random() < 0.5
215
+ sf.cx[c] = (fromLeft ? -0.05 : 1.05) * W
216
+ sf.cy[c] = Math.random() * 0.45 * H
217
+ const sp = (520 + Math.random() * 420) * sf.dpr
218
+ sf.cvx[c] = (fromLeft ? 1 : -1) * sp
219
+ sf.cvy[c] = (0.35 + Math.random() * 0.35) * sp
220
+ sf.clife[c] = 1
221
+ break
102
222
  }
223
+ sf.nextCometAt = currentTime + (20000 + Math.random() * 25000) / speed
103
224
  }
104
225
 
105
- g.element.style.opacity = (opacity * intensity).toFixed(3)
226
+ for (let c = 0; c < sf.cometCount; c++) {
227
+ if (sf.clife[c] <= 0) continue
228
+ sf.cx[c] += sf.cvx[c] * dt * speed
229
+ sf.cy[c] += sf.cvy[c] * dt * speed
230
+ sf.clife[c] -= dt / 1.6
231
+
232
+ const tailX = sf.cx[c] - sf.cvx[c] * 0.16
233
+ const tailY = sf.cy[c] - sf.cvy[c] * 0.16
234
+ const grad = ctx.createLinearGradient(sf.cx[c], sf.cy[c], tailX, tailY)
235
+ const headA = Math.max(0, Math.min(1, sf.clife[c])) * 0.55 * intensity
236
+ grad.addColorStop(0, `rgba(255,255,255,${headA})`)
237
+ grad.addColorStop(0.4, `rgba(190,210,255,${headA * 0.4})`)
238
+ grad.addColorStop(1, 'rgba(190,210,255,0)')
239
+ ctx.globalAlpha = 1
240
+ ctx.strokeStyle = grad
241
+ ctx.lineWidth = 2 * sf.dpr
242
+ ctx.lineCap = 'round'
243
+ ctx.beginPath()
244
+ ctx.moveTo(sf.cx[c], sf.cy[c])
245
+ ctx.lineTo(tailX, tailY)
246
+ ctx.stroke()
247
+ }
106
248
  }
249
+
250
+ ctx.globalAlpha = 1
251
+ sf.drawnStatic = true
107
252
  }
@@ -15,6 +15,8 @@ export interface ArtOptions {
15
15
  intensity?: number
16
16
  /** Animation speed multiplier: 0.5 = half speed, 1 = normal, 2 = double (default: 1) */
17
17
  speed?: number
18
+ /** Particle density multiplier: 0.5 = sparse, 1 = baseline, 2 = dense (default: 1; starfield only) */
19
+ density?: number
18
20
  }
19
21
 
20
22
  export interface Particle<T extends SVGElement = SVGElement> {
@@ -52,6 +54,7 @@ export interface ArtState {
52
54
  color: string
53
55
  intensity: number
54
56
  speed: number
57
+ density: number
55
58
  element: HTMLElement
56
59
  overlayElement?: HTMLElement
57
60
  animationId?: number
@@ -118,12 +121,44 @@ export interface ArtState {
118
121
  }
119
122
 
120
123
  starfield?: {
121
- groups: Array<{
122
- element: HTMLDivElement
123
- appearDelay: number
124
- twinkleDuration: number
125
- twinkleDelay: number
126
- }>
124
+ canvas: HTMLCanvasElement
125
+ ctx: CanvasRenderingContext2D
126
+ /** Pre-rendered glow sprites, cool→warm. Drawn per star so no per-frame gradient is built. */
127
+ sprites: HTMLCanvasElement[]
128
+ /** Pre-rendered entrance nebula bloom, drawn once per frame at a computed alpha. */
129
+ nebula: HTMLCanvasElement
130
+ starCount: number
131
+ /** Structure-of-arrays star table — cache-friendly, zero allocation per frame. */
132
+ sx: Float32Array
133
+ sy: Float32Array
134
+ sr: Float32Array
135
+ sphase: Float32Array
136
+ stwinkle: Float32Array
137
+ /** 0 = far (drifts least, dimmest) → 1 = near (drifts most, brightest). */
138
+ sdepth: Float32Array
139
+ /** Index into `sprites` — fixes each star's colour temperature for its life. */
140
+ sbucket: Uint8Array
141
+ /** Per-star entrance delay (s) so the field reveals far→near in waves. */
142
+ sappear: Float32Array
143
+ /** Fixed comet pool. `life <= 0` marks a free slot; no array churn. */
144
+ cx: Float32Array
145
+ cy: Float32Array
146
+ cvx: Float32Array
147
+ cvy: Float32Array
148
+ clife: Float32Array
149
+ cometCount: number
150
+ /** ms timestamp of the next comet spawn — gates the rare streak. */
151
+ nextCometAt: number
152
+ /** Capped device-pixel-ratio; bounds backing-store fill cost on retina. */
153
+ dpr: number
154
+ /** Cached device-pixel canvas size; a change is the only resize trigger. */
155
+ deviceWidth: number
156
+ deviceHeight: number
157
+ /** Static-render once, then idle the RAF loop. */
158
+ reducedMotion: boolean
159
+ drawnStatic: boolean
160
+ /** Previous frame ms — frame-rate-independent comet motion + jump clamp. */
161
+ lastFrame: number
127
162
  startTime: number
128
163
  }
129
164
  }
@@ -96,6 +96,21 @@ export class SchmancyOverlay extends SchmancyElement {
96
96
  margin: 0;
97
97
  border: 0;
98
98
  }
99
+ /* Modal tier promotes the whole shell (scrim + surface) into the top
100
+ * layer so every overlay — anchored or modal — shares ONE stacking
101
+ * domain ordered strictly by show() time. Neutralize the UA popover
102
+ * box so the shell stays full-viewport. */
103
+ .shell:popover-open {
104
+ inset: 0;
105
+ margin: 0;
106
+ border: 0;
107
+ width: 100%;
108
+ height: 100%;
109
+ max-width: none;
110
+ max-height: none;
111
+ background: transparent;
112
+ overflow: visible;
113
+ }
99
114
  `]
100
115
 
101
116
  @property({ type: String, reflect: true }) layout: OverlayLayout = 'sheet'
@@ -107,6 +122,7 @@ export class SchmancyOverlay extends SchmancyElement {
107
122
 
108
123
  @query('.backdrop') private _backdrop?: HTMLDivElement
109
124
  @query('.surface') private _surface!: HTMLElement
125
+ @query('.shell') private _shell?: HTMLElement
110
126
 
111
127
  /** Close trigger for the service; emits the reason + detail payload. */
112
128
  private readonly _closed$ = new Subject<{ reason: CloseReason; result?: unknown }>()
@@ -203,6 +219,18 @@ export class SchmancyOverlay extends SchmancyElement {
203
219
  .pipe(takeUntil(this.disconnecting))
204
220
  .subscribe()
205
221
  this._positionerTeardown = () => floatSub.unsubscribe()
222
+ } else if (this.tier === 'modal' && this._shell) {
223
+ // Promote the whole modal shell (scrim + surface) into the native
224
+ // top layer — the same domain anchored tiers already use. The top
225
+ // layer paints strictly in show() order, so a sheet opened from
226
+ // inside an earlier anchored overlay correctly stacks above it
227
+ // (and recedes behind anything opened after it). Degrade silently
228
+ // to the legacy z-index host on browsers without the Popover API.
229
+ try {
230
+ this._positionerTeardown = positionPopoverAPI(this._shell)
231
+ } catch {
232
+ // no Popover API support — keep the host z-index:10000 path.
233
+ }
206
234
  }
207
235
 
208
236
  // Set the anchor-origin CSS vars so the entrance animation blooms
@@ -1,53 +1,46 @@
1
1
  import { SchmancyElement } from '@mixins/index';
2
+ import { type PropertyValues } from 'lit';
2
3
  type Corner = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
3
- type BoatState = 'collapsed' | 'expanded';
4
+ /**
5
+ * Material-3 extended FAB that delegates its expanded panel to the `show()`
6
+ * overlay service. Collapsed: a draggable, corner-anchored pill (icon + label,
7
+ * circular when no label). Activated: the default-slot content blooms from the
8
+ * FAB as an overlay (backdrop / Esc / back-button / sheet-on-narrow handled by
9
+ * the overlay primitive).
10
+ */
4
11
  export default class SchmancyBoat extends SchmancyElement {
12
+ #private;
5
13
  static styles: import("lit").CSSResult[];
6
14
  id: string;
7
15
  icon?: string;
8
16
  label?: string;
9
- /** Override the expanded panel width (e.g. '320px', '24rem'). Defaults to responsive sizing. */
10
- expandedWidth?: string;
11
- /** When true, uses a lower elevation shadow in the minimized (FAB) state. */
17
+ /** When true, uses a lower elevation shadow on the FAB. */
12
18
  lowered: boolean;
13
- /** Corner the boat is anchored to. */
19
+ /** Corner the FAB is anchored to. */
14
20
  corner: Corner;
15
- /** Whether the panel is open. */
21
+ /** Open state. Bind `?open=${…}` to drive the overlay; reflected to the attribute. */
16
22
  open: boolean;
17
- /**
18
- * State property.
19
- * Maps 'expanded' → open=true, 'collapsed' → open=false (FAB visible).
20
- */
21
- get state(): BoatState;
22
- set state(val: BoatState);
23
23
  private isDragging;
24
- private _position;
25
24
  private _currentCorner;
25
+ private _slotted;
26
+ private _position;
26
27
  private _containerRef;
27
- private _contentRef;
28
28
  private _headerRef;
29
29
  private _currentAnimation?;
30
- private get panelWidth();
31
- private get isBottomCorner();
32
- private get closedClipPath();
33
- private get openClipPath();
34
- private get elevation();
35
30
  private _applyContainerPosition;
36
31
  private _loadPosition;
37
32
  private _savePosition;
38
33
  private _validateBounds;
39
34
  private _reorientToNearestCorner;
40
35
  private _setupDrag;
36
+ private _openOverlay;
37
+ private _restoreSlotted;
41
38
  connectedCallback(): void;
42
39
  firstUpdated(): void;
40
+ protected willUpdate(changed: PropertyValues<this>): void;
43
41
  disconnectedCallback(): void;
44
- private _animateOpen;
45
- private _animateClose;
42
+ /** Flip open ↔ closed. */
46
43
  toggle(): void;
47
- expand(): void;
48
- /** Alias for expand() — kept for backwards compatibility. */
49
- show(): void;
50
- close(): void;
51
44
  protected render(): unknown;
52
45
  }
53
46
  declare global {
@@ -1,9 +1,16 @@
1
1
  /**
2
- * Starfield Effect — Night sky with twinkling stars.
2
+ * Starfield Effect — surreal deep-space drift with rare comets.
3
3
  *
4
- * 6 groups × 7 stars using CSS radial-gradient backgrounds.
5
- * Wave-by-wave fade-in (group 0 first, then 1, 2, …); gentle twinkle once visible.
6
- * Opacity driven by RAF instead of CSS @keyframes to avoid Shadow DOM scoping.
4
+ * A recessive page backdrop. One <canvas>; stars live in
5
+ * structure-of-arrays Float32Array tables (zero per-frame allocation) and
6
+ * render as pre-rendered glow sprites via drawImage no gradient is built
7
+ * inside the RAF loop. Three parallax depth layers drift on slow orbit paths;
8
+ * colour temperature runs blue-white → warm; entrance reveals far→near in
9
+ * waves behind a faint corner nebula; a pooled comet streaks by rarely.
10
+ * Sparse and dim by design — tune reach with the `density` ArtOption.
11
+ *
12
+ * Performance budget: ≤ MAX_STAR_COUNT drawImage calls + one nebula blit per
13
+ * frame, dpr capped at 2, the whole field idle under prefers-reduced-motion.
7
14
  */
8
15
  import type { ArtState } from '../types';
9
16
  export declare function createStarfieldOverlay(state: ArtState): void;
@@ -12,6 +12,8 @@ export interface ArtOptions {
12
12
  intensity?: number;
13
13
  /** Animation speed multiplier: 0.5 = half speed, 1 = normal, 2 = double (default: 1) */
14
14
  speed?: number;
15
+ /** Particle density multiplier: 0.5 = sparse, 1 = baseline, 2 = dense (default: 1; starfield only) */
16
+ density?: number;
15
17
  }
16
18
  export interface Particle<T extends SVGElement = SVGElement> {
17
19
  element: T;
@@ -46,6 +48,7 @@ export interface ArtState {
46
48
  color: string;
47
49
  intensity: number;
48
50
  speed: number;
51
+ density: number;
49
52
  element: HTMLElement;
50
53
  overlayElement?: HTMLElement;
51
54
  animationId?: number;
@@ -115,12 +118,44 @@ export interface ArtState {
115
118
  startTime: number;
116
119
  };
117
120
  starfield?: {
118
- groups: Array<{
119
- element: HTMLDivElement;
120
- appearDelay: number;
121
- twinkleDuration: number;
122
- twinkleDelay: number;
123
- }>;
121
+ canvas: HTMLCanvasElement;
122
+ ctx: CanvasRenderingContext2D;
123
+ /** Pre-rendered glow sprites, cool→warm. Drawn per star so no per-frame gradient is built. */
124
+ sprites: HTMLCanvasElement[];
125
+ /** Pre-rendered entrance nebula bloom, drawn once per frame at a computed alpha. */
126
+ nebula: HTMLCanvasElement;
127
+ starCount: number;
128
+ /** Structure-of-arrays star table — cache-friendly, zero allocation per frame. */
129
+ sx: Float32Array;
130
+ sy: Float32Array;
131
+ sr: Float32Array;
132
+ sphase: Float32Array;
133
+ stwinkle: Float32Array;
134
+ /** 0 = far (drifts least, dimmest) → 1 = near (drifts most, brightest). */
135
+ sdepth: Float32Array;
136
+ /** Index into `sprites` — fixes each star's colour temperature for its life. */
137
+ sbucket: Uint8Array;
138
+ /** Per-star entrance delay (s) so the field reveals far→near in waves. */
139
+ sappear: Float32Array;
140
+ /** Fixed comet pool. `life <= 0` marks a free slot; no array churn. */
141
+ cx: Float32Array;
142
+ cy: Float32Array;
143
+ cvx: Float32Array;
144
+ cvy: Float32Array;
145
+ clife: Float32Array;
146
+ cometCount: number;
147
+ /** ms timestamp of the next comet spawn — gates the rare streak. */
148
+ nextCometAt: number;
149
+ /** Capped device-pixel-ratio; bounds backing-store fill cost on retina. */
150
+ dpr: number;
151
+ /** Cached device-pixel canvas size; a change is the only resize trigger. */
152
+ deviceWidth: number;
153
+ deviceHeight: number;
154
+ /** Static-render once, then idle the RAF loop. */
155
+ reducedMotion: boolean;
156
+ drawnStatic: boolean;
157
+ /** Previous frame ms — frame-rate-independent comet motion + jump clamp. */
158
+ lastFrame: number;
124
159
  startTime: number;
125
160
  };
126
161
  }
@@ -30,6 +30,7 @@ export declare class SchmancyOverlay extends SchmancyElement {
30
30
  private _active;
31
31
  private _backdrop?;
32
32
  private _surface;
33
+ private _shell?;
33
34
  /** Close trigger for the service; emits the reason + detail payload. */
34
35
  private readonly _closed$;
35
36
  private _mounted;