@mhmo91/schmancy 0.9.28 → 0.10.2

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 (1049) hide show
  1. package/custom-elements.json +1005 -2215
  2. package/dist/active-host-CcIa2tmW.cjs +1 -0
  3. package/dist/active-host-CcIa2tmW.cjs.map +1 -0
  4. package/dist/active-host-CvNYoprt.js +57 -0
  5. package/dist/active-host-CvNYoprt.js.map +1 -0
  6. package/dist/agent/{flow-CvG1fLW5.js.map → flow-CaPi2G8y.js.map} +1 -1
  7. package/dist/agent/{rolldown-runtime-BIIoCavz.js → rolldown-runtime-DsMetpgY.js} +2 -9
  8. package/dist/agent/schmancy.agent.js +12678 -7791
  9. package/dist/agent/schmancy.agent.js.map +1 -1
  10. package/dist/agent/schmancy.manifest.json +265 -1453
  11. package/dist/agent/{vendor-highlight-Dow87ZL_.js → vendor-highlight-CHJZQQB7.js} +85 -90
  12. package/dist/agent/{vendor-highlight-Dow87ZL_.js.map → vendor-highlight-CHJZQQB7.js.map} +1 -1
  13. package/dist/agent/{vendor-jsqr-Bl4iAtKC.js → vendor-jsqr-r7GNh4P3.js} +1 -1
  14. package/dist/agent/{vendor-jsqr-Bl4iAtKC.js.map → vendor-jsqr-r7GNh4P3.js.map} +1 -1
  15. package/dist/agent/{vendor-material-color-DcL7ZPxx.js.map → vendor-material-color-Be96dpGE.js.map} +1 -1
  16. package/dist/{animation-hXFClrIn.js.map → animation-BK-8BwY8.js.map} +1 -1
  17. package/dist/{animation-CQRdLgzX.cjs.map → animation-CO_Csq84.cjs.map} +1 -1
  18. package/dist/{area-BGBCMC79.js → area-DHVANBbr.js} +20 -15
  19. package/dist/area-DHVANBbr.js.map +1 -0
  20. package/dist/area-ZupIezvU.cjs +12 -0
  21. package/dist/area-ZupIezvU.cjs.map +1 -0
  22. package/dist/area.cjs +1 -1
  23. package/dist/area.js +2 -2
  24. package/dist/{audio-Dvr-RBzE.cjs → audio-CluX8Qpq.cjs} +1 -1
  25. package/dist/{audio-Dvr-RBzE.cjs.map → audio-CluX8Qpq.cjs.map} +1 -1
  26. package/dist/{audio-ql6nvY0y.js → audio-DcXphulJ.js} +1 -1
  27. package/dist/{audio-ql6nvY0y.js.map → audio-DcXphulJ.js.map} +1 -1
  28. package/dist/audio.cjs +1 -1
  29. package/dist/audio.js +2 -2
  30. package/dist/autocomplete-Bn525CTp.cjs +115 -0
  31. package/dist/autocomplete-Bn525CTp.cjs.map +1 -0
  32. package/dist/{autocomplete-C2P0Soht.js → autocomplete-pHvsyfbH.js} +29 -26
  33. package/dist/autocomplete-pHvsyfbH.js.map +1 -0
  34. package/dist/autocomplete.cjs +1 -1
  35. package/dist/autocomplete.js +1 -1
  36. package/dist/avatar.cjs +7 -0
  37. package/dist/avatar.cjs.map +1 -0
  38. package/dist/avatar.js +87 -0
  39. package/dist/avatar.js.map +1 -0
  40. package/dist/badge.cjs +1 -1
  41. package/dist/badge.js +1 -1
  42. package/dist/boat-IyEtsNI4.cjs +80 -0
  43. package/dist/boat-IyEtsNI4.cjs.map +1 -0
  44. package/dist/{boat-DXZ0k7oa.js → boat-_Yv3M6YM.js} +43 -54
  45. package/dist/boat-_Yv3M6YM.js.map +1 -0
  46. package/dist/boat.cjs +1 -1
  47. package/dist/boat.js +1 -1
  48. package/dist/breadcrumb.cjs +4 -4
  49. package/dist/breadcrumb.cjs.map +1 -1
  50. package/dist/breadcrumb.js +16 -11
  51. package/dist/breadcrumb.js.map +1 -1
  52. package/dist/{busy-DGYhpTnO.cjs → busy-CjM39APN.cjs} +4 -4
  53. package/dist/busy-CjM39APN.cjs.map +1 -0
  54. package/dist/{busy-iRjq6Nvd.js → busy-Ck2IXJ4r.js} +14 -9
  55. package/dist/busy-Ck2IXJ4r.js.map +1 -0
  56. package/dist/busy.cjs +1 -1
  57. package/dist/busy.js +1 -1
  58. package/dist/button.cjs +24 -24
  59. package/dist/button.cjs.map +1 -1
  60. package/dist/button.js +42 -37
  61. package/dist/button.js.map +1 -1
  62. package/dist/{card-DjYnCckw.cjs → card-DIxDuuth.cjs} +6 -6
  63. package/dist/card-DIxDuuth.cjs.map +1 -0
  64. package/dist/{card-wUTjx0EC.js → card-DUWZmMHc.js} +41 -30
  65. package/dist/card-DUWZmMHc.js.map +1 -0
  66. package/dist/card.cjs +1 -1
  67. package/dist/card.js +1 -1
  68. package/dist/charts.cjs +5 -5
  69. package/dist/charts.cjs.map +1 -1
  70. package/dist/charts.js +21 -16
  71. package/dist/charts.js.map +1 -1
  72. package/dist/checkbox-CGdFXuWQ.cjs +39 -0
  73. package/dist/checkbox-CGdFXuWQ.cjs.map +1 -0
  74. package/dist/{checkbox-VBSenxgb.js → checkbox-DPS1mWG-.js} +86 -82
  75. package/dist/checkbox-DPS1mWG-.js.map +1 -0
  76. package/dist/checkbox.cjs +1 -1
  77. package/dist/checkbox.js +1 -1
  78. package/dist/{chips-BDS9lkPa.js → chips-BnnXQSA-.js} +146 -136
  79. package/dist/chips-BnnXQSA-.js.map +1 -0
  80. package/dist/{chips-D6ptH5re.cjs → chips-UoFbwmlG.cjs} +19 -19
  81. package/dist/chips-UoFbwmlG.cjs.map +1 -0
  82. package/dist/chips.cjs +1 -1
  83. package/dist/chips.js +2 -2
  84. package/dist/{code-highlight-BzRmBZzz.cjs → code-highlight-CMilN0B8.cjs} +15 -15
  85. package/dist/code-highlight-CMilN0B8.cjs.map +1 -0
  86. package/dist/{code-highlight-Bi91XHJN.js → code-highlight-kFUJ1Eet.js} +37 -40
  87. package/dist/code-highlight-kFUJ1Eet.js.map +1 -0
  88. package/dist/code-highlight.cjs +1 -1
  89. package/dist/code-highlight.js +1 -1
  90. package/dist/connectivity.cjs +2 -2
  91. package/dist/connectivity.cjs.map +1 -1
  92. package/dist/connectivity.js +10 -7
  93. package/dist/connectivity.js.map +1 -1
  94. package/dist/content-drawer.cjs +1 -1
  95. package/dist/content-drawer.js +2 -2
  96. package/dist/context-Bdu1xt0W.js +3 -0
  97. package/dist/{context-BerzpUhI.js.map → context-Bdu1xt0W.js.map} +1 -1
  98. package/dist/context-daN5G6HS.cjs +1 -0
  99. package/dist/{context-C6dHUHhi.cjs.map → context-daN5G6HS.cjs.map} +1 -1
  100. package/dist/{cursor-glow-BydlDInj.js → cursor-glow-Ah7VXSj7.js} +1 -1
  101. package/dist/{cursor-glow-BydlDInj.js.map → cursor-glow-Ah7VXSj7.js.map} +1 -1
  102. package/dist/{cursor-glow-Duw9jHmh.cjs → cursor-glow-Bulq-38P.cjs} +1 -1
  103. package/dist/{cursor-glow-Duw9jHmh.cjs.map → cursor-glow-Bulq-38P.cjs.map} +1 -1
  104. package/dist/date-range-BIyrzTRZ.cjs +131 -0
  105. package/dist/date-range-BIyrzTRZ.cjs.map +1 -0
  106. package/dist/{date-range-ClTMg1AB.js → date-range-DOstCIg8.js} +16 -17
  107. package/dist/date-range-DOstCIg8.js.map +1 -0
  108. package/dist/date-range-inline-4P7zqeVe.cjs +43 -0
  109. package/dist/{date-range-inline-B9Dp2z6C.cjs.map → date-range-inline-4P7zqeVe.cjs.map} +1 -1
  110. package/dist/{date-range-inline-CpKG6qt2.js → date-range-inline-BVycTWLb.js} +5 -5
  111. package/dist/{date-range-inline-CpKG6qt2.js.map → date-range-inline-BVycTWLb.js.map} +1 -1
  112. package/dist/date-range-inline.cjs +1 -1
  113. package/dist/date-range-inline.js +1 -1
  114. package/dist/date-range.cjs +1 -1
  115. package/dist/date-range.js +1 -1
  116. package/dist/delay.cjs +9 -1
  117. package/dist/delay.cjs.map +1 -0
  118. package/dist/delay.js +77 -2
  119. package/dist/delay.js.map +1 -0
  120. package/dist/{details-Cz9ok9si.cjs → details-BJBbZOO6.cjs} +9 -9
  121. package/dist/details-BJBbZOO6.cjs.map +1 -0
  122. package/dist/{details-CPjlqQD4.js → details-DPc5GxPa.js} +19 -18
  123. package/dist/details-DPc5GxPa.js.map +1 -0
  124. package/dist/details.cjs +1 -1
  125. package/dist/details.js +1 -1
  126. package/dist/{dialog-service-DH-tjPuE.js → dialog-service-DI9PPy4H.js} +2 -2
  127. package/dist/dialog-service-DI9PPy4H.js.map +1 -0
  128. package/dist/{dialog-service-CzDO08Gy.cjs → dialog-service-DJd5L0f5.cjs} +1 -1
  129. package/dist/dialog-service-DJd5L0f5.cjs.map +1 -0
  130. package/dist/dialog.cjs +2 -2
  131. package/dist/dialog.cjs.map +1 -1
  132. package/dist/dialog.js +13 -14
  133. package/dist/dialog.js.map +1 -1
  134. package/dist/directives.cjs +2 -11
  135. package/dist/directives.cjs.map +1 -1
  136. package/dist/directives.js +141 -227
  137. package/dist/directives.js.map +1 -1
  138. package/dist/discovery.cjs +1 -1
  139. package/dist/discovery.cjs.map +1 -1
  140. package/dist/discovery.js +1 -1
  141. package/dist/discovery.js.map +1 -1
  142. package/dist/{divider-ghgyw5CU.js → divider-BvJsmSPH.js} +11 -9
  143. package/dist/divider-BvJsmSPH.js.map +1 -0
  144. package/dist/{divider-CILo3_vi.cjs → divider-DPT3XnG5.cjs} +3 -3
  145. package/dist/divider-DPT3XnG5.cjs.map +1 -0
  146. package/dist/divider.cjs +1 -1
  147. package/dist/divider.js +1 -1
  148. package/dist/dropdown.cjs +4 -4
  149. package/dist/dropdown.cjs.map +1 -1
  150. package/dist/dropdown.js +29 -28
  151. package/dist/dropdown.js.map +1 -1
  152. package/dist/{expand-CbjBr_Ds.js → expand-BMzocdtj.js} +24 -20
  153. package/dist/expand-BMzocdtj.js.map +1 -0
  154. package/dist/expand-CTqBWVXo.cjs +141 -0
  155. package/dist/expand-CTqBWVXo.cjs.map +1 -0
  156. package/dist/expand.cjs +1 -1
  157. package/dist/expand.js +1 -1
  158. package/dist/{extra-DK9MQtPJ.js → extra-BeHlUhzv.js} +19 -14
  159. package/dist/extra-BeHlUhzv.js.map +1 -0
  160. package/dist/{extra-BZeZOMBI.cjs → extra-h_cuxRII.cjs} +6 -6
  161. package/dist/extra-h_cuxRII.cjs.map +1 -0
  162. package/dist/extra.cjs +1 -1
  163. package/dist/extra.js +1 -1
  164. package/dist/{float-BfCvGeY9.js → float-CTc1xxqH.js} +2 -2
  165. package/dist/{float-BfCvGeY9.js.map → float-CTc1xxqH.js.map} +1 -1
  166. package/dist/float-CwVBs11k.cjs +1 -0
  167. package/dist/{float-CuZ8LOgB.cjs.map → float-CwVBs11k.cjs.map} +1 -1
  168. package/dist/float.cjs +1 -1
  169. package/dist/float.js +1 -1
  170. package/dist/{form-rCZqoAoK.js → form-BtwOBMZ9.js} +1 -1
  171. package/dist/form-BtwOBMZ9.js.map +1 -0
  172. package/dist/{form-wI58M85H.cjs → form-CSJp687X.cjs} +1 -1
  173. package/dist/form-CSJp687X.cjs.map +1 -0
  174. package/dist/form.cjs +1 -1
  175. package/dist/form.js +1 -1
  176. package/dist/handover/agent-runtime-followups.md +1 -1
  177. package/dist/handover/agent-runtime-v1.md +3 -3
  178. package/dist/handover/claude-design-brief.md +19 -54
  179. package/dist/handover/claude-design-setup.md +57 -0
  180. package/dist/{hashContent-B2IntJQf.js.map → hashContent-1ARKIsx9.js.map} +1 -1
  181. package/dist/{hashContent-CahnEuut.cjs.map → hashContent-Bp5S6T4U.cjs.map} +1 -1
  182. package/dist/{icons-Drq4kKy2.js → icons-BbCVrcas.js} +27 -24
  183. package/dist/icons-BbCVrcas.js.map +1 -0
  184. package/dist/icons-qEQW4pjM.cjs +52 -0
  185. package/dist/icons-qEQW4pjM.cjs.map +1 -0
  186. package/dist/icons.cjs +1 -1
  187. package/dist/icons.js +1 -1
  188. package/dist/{iframe-BmyHW8km.js → iframe-BJfDIEJf.js} +17 -11
  189. package/dist/iframe-BJfDIEJf.js.map +1 -0
  190. package/dist/iframe-D6HTruav.cjs +24 -0
  191. package/dist/iframe-D6HTruav.cjs.map +1 -0
  192. package/dist/iframe.cjs +1 -1
  193. package/dist/iframe.js +1 -1
  194. package/dist/index.cjs +1 -1
  195. package/dist/index.js +77 -77
  196. package/dist/{input-Bc3bVISm.js → input-LTK3cctF.js} +34 -34
  197. package/dist/input-LTK3cctF.js.map +1 -0
  198. package/dist/input-U26axtcs.cjs +51 -0
  199. package/dist/input-U26axtcs.cjs.map +1 -0
  200. package/dist/{input-chip-DN-cwf11.cjs → input-chip-CADXt0X5.cjs} +2 -2
  201. package/dist/input-chip-CADXt0X5.cjs.map +1 -0
  202. package/dist/{input-chip-BQrjpjaQ.js → input-chip-Ch-aCs3c.js} +7 -4
  203. package/dist/input-chip-Ch-aCs3c.js.map +1 -0
  204. package/dist/input.cjs +1 -1
  205. package/dist/input.js +1 -1
  206. package/dist/json.cjs +1 -1
  207. package/dist/json.cjs.map +1 -1
  208. package/dist/json.js +7 -5
  209. package/dist/json.js.map +1 -1
  210. package/dist/kbd.cjs +2 -2
  211. package/dist/kbd.cjs.map +1 -1
  212. package/dist/kbd.js +9 -7
  213. package/dist/kbd.js.map +1 -1
  214. package/dist/{layout-fjM1DWlF.js → layout-C4xmnU4n.js} +1 -1
  215. package/dist/{layout-fjM1DWlF.js.map → layout-C4xmnU4n.js.map} +1 -1
  216. package/dist/{layout-CTfRXQoz.cjs → layout-Dmh6fxh0.cjs} +1 -1
  217. package/dist/{layout-CTfRXQoz.cjs.map → layout-Dmh6fxh0.cjs.map} +1 -1
  218. package/dist/layout.cjs +1 -1
  219. package/dist/layout.js +2 -3
  220. package/dist/{lazy-D6R5N5v4.js.map → lazy-B0ia54tT.js.map} +1 -1
  221. package/dist/{lazy-BDNnH_r7.cjs.map → lazy-Dq9mRRjT.cjs.map} +1 -1
  222. package/dist/lightbox-DbYUSfVl.cjs +202 -0
  223. package/dist/lightbox-DbYUSfVl.cjs.map +1 -0
  224. package/dist/{lightbox-CY52Z_ig.js → lightbox-DqG2z3Cn.js} +13 -12
  225. package/dist/lightbox-DqG2z3Cn.js.map +1 -0
  226. package/dist/lightbox.cjs +1 -1
  227. package/dist/lightbox.js +1 -1
  228. package/dist/list-CLX4sSAw.cjs +40 -0
  229. package/dist/list-CLX4sSAw.cjs.map +1 -0
  230. package/dist/{list-D7wUxu1C.js → list-D6-_E5ZD.js} +26 -21
  231. package/dist/list-D6-_E5ZD.js.map +1 -0
  232. package/dist/list.cjs +1 -1
  233. package/dist/list.js +1 -1
  234. package/dist/{magnetic-CVXEkYTA.cjs → magnetic-BH0TsofV.cjs} +1 -1
  235. package/dist/{magnetic-CVXEkYTA.cjs.map → magnetic-BH0TsofV.cjs.map} +1 -1
  236. package/dist/{magnetic-BhXebqF3.js → magnetic-BZGFxAWG.js} +2 -2
  237. package/dist/{magnetic-BhXebqF3.js.map → magnetic-BZGFxAWG.js.map} +1 -1
  238. package/dist/{mailbox-DLiBGJhY.cjs → mailbox-Ct6iYe-4.cjs} +64 -66
  239. package/dist/mailbox-Ct6iYe-4.cjs.map +1 -0
  240. package/dist/{mailbox--EN-JhjV.js → mailbox-DsPII8HR.js} +137 -126
  241. package/dist/mailbox-DsPII8HR.js.map +1 -0
  242. package/dist/mailbox.cjs +1 -1
  243. package/dist/mailbox.js +1 -1
  244. package/dist/{map-B0S_q3ma.js → map-Dhy3ta9v.js} +11 -9
  245. package/dist/map-Dhy3ta9v.js.map +1 -0
  246. package/dist/map-WXeVkx2K.cjs +80 -0
  247. package/dist/map-WXeVkx2K.cjs.map +1 -0
  248. package/dist/map.cjs +1 -1
  249. package/dist/map.js +1 -1
  250. package/dist/{menu-COeFpb6n.js → menu-Bhd3EapX.js} +15 -10
  251. package/dist/menu-Bhd3EapX.js.map +1 -0
  252. package/dist/{menu-3edZGQ1x.cjs → menu-Cg2aaDjs.cjs} +5 -5
  253. package/dist/menu-Cg2aaDjs.cjs.map +1 -0
  254. package/dist/menu.cjs +1 -1
  255. package/dist/menu.js +1 -1
  256. package/dist/mixins-CcIWET41.js +627 -0
  257. package/dist/mixins-CcIWET41.js.map +1 -0
  258. package/dist/mixins-De3xfjrm.cjs +298 -0
  259. package/dist/mixins-De3xfjrm.cjs.map +1 -0
  260. package/dist/mixins.cjs +1 -1
  261. package/dist/mixins.js +2 -87
  262. package/dist/nav-drawer.cjs +1 -1
  263. package/dist/nav-drawer.js +2 -2
  264. package/dist/navigation-bar.cjs +1 -1
  265. package/dist/navigation-bar.js +1 -1
  266. package/dist/navigation-rail.cjs +3 -3
  267. package/dist/navigation-rail.cjs.map +1 -1
  268. package/dist/navigation-rail.js +15 -16
  269. package/dist/navigation-rail.js.map +1 -1
  270. package/dist/{notification-CC-TFN5v.js → notification-CVLqQ8c_.js} +40 -38
  271. package/dist/notification-CVLqQ8c_.js.map +1 -0
  272. package/dist/notification-D_PQjBSf.cjs +23 -0
  273. package/dist/notification-D_PQjBSf.cjs.map +1 -0
  274. package/dist/notification.cjs +1 -1
  275. package/dist/notification.js +1 -1
  276. package/dist/option-DDU_goh1.cjs +43 -0
  277. package/dist/option-DDU_goh1.cjs.map +1 -0
  278. package/dist/{option-BwAF4nAw.js → option-rm4HebVs.js} +9 -7
  279. package/dist/option-rm4HebVs.js.map +1 -0
  280. package/dist/option.cjs +1 -1
  281. package/dist/option.js +1 -1
  282. package/dist/{overlay-stack-7bs4ZNnh.cjs → overlay-stack-BprhAE9a.cjs} +1 -1
  283. package/dist/{overlay-stack-7bs4ZNnh.cjs.map → overlay-stack-BprhAE9a.cjs.map} +1 -1
  284. package/dist/{overlay-stack-DXPYHPhk.js → overlay-stack-CAQno0CK.js} +1 -1
  285. package/dist/{overlay-stack-DXPYHPhk.js.map → overlay-stack-CAQno0CK.js.map} +1 -1
  286. package/dist/overlay.cjs +43 -45
  287. package/dist/overlay.cjs.map +1 -1
  288. package/dist/overlay.js +684 -268
  289. package/dist/overlay.js.map +1 -1
  290. package/dist/page.cjs +3 -3
  291. package/dist/page.cjs.map +1 -1
  292. package/dist/page.js +15 -13
  293. package/dist/page.js.map +1 -1
  294. package/dist/{components-DZgJWHdZ.js → payment-card-form-C0dHYZIv.js} +21 -22
  295. package/dist/{components-DZgJWHdZ.js.map → payment-card-form-C0dHYZIv.js.map} +1 -1
  296. package/dist/payment-card-form-DNvmZxs4.cjs +73 -0
  297. package/dist/{components-DkmEgyAc.cjs.map → payment-card-form-DNvmZxs4.cjs.map} +1 -1
  298. package/dist/payment-card-form.cjs +1 -0
  299. package/dist/payment-card-form.js +2 -0
  300. package/dist/{progress-Bk_Q1Shy.js → progress-BRerM5Bn.js} +16 -13
  301. package/dist/progress-BRerM5Bn.js.map +1 -0
  302. package/dist/{progress-Yz6EMNSu.cjs → progress-U3LQkpM2.cjs} +3 -3
  303. package/dist/progress-U3LQkpM2.cjs.map +1 -0
  304. package/dist/progress.cjs +1 -1
  305. package/dist/progress.js +1 -1
  306. package/dist/qr-scanner.cjs +5 -5
  307. package/dist/qr-scanner.cjs.map +1 -1
  308. package/dist/qr-scanner.js +14 -15
  309. package/dist/qr-scanner.js.map +1 -1
  310. package/dist/{radio-group-BcdcjLNC.js → radio-group-BZ2WoOXJ.js} +14 -12
  311. package/dist/radio-group-BZ2WoOXJ.js.map +1 -0
  312. package/dist/radio-group-D7mm-yvJ.cjs +40 -0
  313. package/dist/radio-group-D7mm-yvJ.cjs.map +1 -0
  314. package/dist/radio-group.cjs +1 -1
  315. package/dist/radio-group.js +1 -1
  316. package/dist/range.cjs +2 -2
  317. package/dist/range.cjs.map +1 -1
  318. package/dist/range.js +9 -7
  319. package/dist/range.js.map +1 -1
  320. package/dist/{reduced-motion-BZTLqAyl.js.map → reduced-motion-D-L12p7G.js.map} +1 -1
  321. package/dist/{reduced-motion-9RjNnhIg.cjs.map → reduced-motion-Ds-HjMzn.cjs.map} +1 -1
  322. package/dist/{rxjs-utils-DJbZRjp3.cjs.map → rxjs-utils-Csnks202.cjs.map} +1 -1
  323. package/dist/{rxjs-utils-CKTnEKUH.js.map → rxjs-utils-d-ivVN84.js.map} +1 -1
  324. package/dist/rxjs-utils.cjs +1 -1
  325. package/dist/rxjs-utils.js +1 -1
  326. package/dist/scroll-DJTjNIT_.cjs +26 -0
  327. package/dist/scroll-DJTjNIT_.cjs.map +1 -0
  328. package/dist/{scroll-DXQv0ejL.js → scroll-qL-HkMdP.js} +9 -7
  329. package/dist/scroll-qL-HkMdP.js.map +1 -0
  330. package/dist/search-BLCRsxIC.cjs +1 -0
  331. package/dist/{search-CwMav5QB.cjs.map → search-BLCRsxIC.cjs.map} +1 -1
  332. package/dist/{search-CvUZRLF1.js → search-BTz7-Rev.js} +1 -1
  333. package/dist/{search-CvUZRLF1.js.map → search-BTz7-Rev.js.map} +1 -1
  334. package/dist/{select-BV4lK2zy.cjs → select-BvA7v-gL.cjs} +6 -6
  335. package/dist/select-BvA7v-gL.cjs.map +1 -0
  336. package/dist/{select-DKyGWDsG.js → select-CnPXUeSf.js} +23 -20
  337. package/dist/select-CnPXUeSf.js.map +1 -0
  338. package/dist/select.cjs +1 -1
  339. package/dist/select.js +1 -1
  340. package/dist/{sheet-C3TLKItO.js → sheet-BRL07BB4.js} +22 -20
  341. package/dist/sheet-BRL07BB4.js.map +1 -0
  342. package/dist/sheet-BYQJAHQn.cjs +35 -0
  343. package/dist/sheet-BYQJAHQn.cjs.map +1 -0
  344. package/dist/sheet.cjs +1 -1
  345. package/dist/sheet.js +2 -2
  346. package/dist/sheet.service-B25bsrYG.cjs +1 -0
  347. package/dist/{sheet.service-RcDBwHmv.cjs.map → sheet.service-B25bsrYG.cjs.map} +1 -1
  348. package/dist/{sheet.service-Dlv20Zfc.js → sheet.service-SPQ8oLCi.js} +3 -3
  349. package/dist/{sheet.service-Dlv20Zfc.js.map → sheet.service-SPQ8oLCi.js.map} +1 -1
  350. package/dist/skeleton.cjs +2 -2
  351. package/dist/skeleton.cjs.map +1 -1
  352. package/dist/skeleton.js +9 -7
  353. package/dist/skeleton.js.map +1 -1
  354. package/dist/skills/INDEX.md +1 -1
  355. package/dist/skills/SKILL.md +17 -5
  356. package/dist/skills/mixins.md +78 -20
  357. package/dist/skills/schmancy/INDEX.md +1 -1
  358. package/dist/skills/schmancy/SKILL.md +17 -5
  359. package/dist/skills/schmancy/mixins.md +78 -20
  360. package/dist/skills/schmancy/state.md +501 -0
  361. package/dist/skills/schmancy/theme.md +15 -0
  362. package/dist/skills/schmancy/timeline-tile.md +95 -0
  363. package/dist/skills/state.md +501 -0
  364. package/dist/skills/theme.md +15 -0
  365. package/dist/skills/timeline-tile.md +95 -0
  366. package/dist/slider.cjs +5 -5
  367. package/dist/slider.cjs.map +1 -1
  368. package/dist/slider.js +18 -13
  369. package/dist/slider.js.map +1 -1
  370. package/dist/sound.service-BGs6m0Cm.cjs +1 -0
  371. package/dist/sound.service-BGs6m0Cm.cjs.map +1 -0
  372. package/dist/{sound.service-DWZe6swU.js → sound.service-kKfsN0m-.js} +3 -3
  373. package/dist/sound.service-kKfsN0m-.js.map +1 -0
  374. package/dist/splash-screen-BDt4PInk.cjs +41 -0
  375. package/dist/splash-screen-BDt4PInk.cjs.map +1 -0
  376. package/dist/{splash-screen-DbI5RgBf.js → splash-screen-C8JCqX5L.js} +12 -9
  377. package/dist/splash-screen-C8JCqX5L.js.map +1 -0
  378. package/dist/splash-screen.cjs +1 -1
  379. package/dist/splash-screen.js +1 -1
  380. package/dist/src-CpRNClhg.cjs +263 -0
  381. package/dist/src-CpRNClhg.cjs.map +1 -0
  382. package/dist/{src-00DfxCJq.js → src-CqdnWGgr.js} +299 -351
  383. package/dist/src-CqdnWGgr.js.map +1 -0
  384. package/dist/state-BusMG6sM.js +868 -0
  385. package/dist/state-BusMG6sM.js.map +1 -0
  386. package/dist/state-DNdCPITt.cjs +1 -0
  387. package/dist/state-DNdCPITt.cjs.map +1 -0
  388. package/dist/state.cjs +1 -0
  389. package/dist/state.js +3 -0
  390. package/dist/steps.cjs +10 -10
  391. package/dist/steps.cjs.map +1 -1
  392. package/dist/steps.js +29 -24
  393. package/dist/steps.js.map +1 -1
  394. package/dist/surface-C8jQy8Ym.js +24 -0
  395. package/dist/surface-C8jQy8Ym.js.map +1 -0
  396. package/dist/surface-Du2Y4vXd.cjs +7 -0
  397. package/dist/surface-Du2Y4vXd.cjs.map +1 -0
  398. package/dist/surface.cjs +1 -1
  399. package/dist/surface.js +1 -1
  400. package/dist/switch.cjs +2 -2
  401. package/dist/switch.cjs.map +1 -1
  402. package/dist/switch.js +7 -5
  403. package/dist/switch.js.map +1 -1
  404. package/dist/table.cjs +72 -1
  405. package/dist/table.cjs.map +1 -0
  406. package/dist/table.js +174 -2
  407. package/dist/table.js.map +1 -0
  408. package/dist/tabs-0RfeCa00.cjs +31 -0
  409. package/dist/tabs-0RfeCa00.cjs.map +1 -0
  410. package/dist/{tabs-Ce55RbwF.js → tabs-Cyahh9Q6.js} +22 -22
  411. package/dist/tabs-Cyahh9Q6.js.map +1 -0
  412. package/dist/tabs.cjs +1 -1
  413. package/dist/tabs.js +1 -1
  414. package/dist/teleport.cjs +1 -1
  415. package/dist/teleport.js +2 -2
  416. package/dist/{textarea-DjN1D9u0.js → textarea-CXCcTVnf.js} +30 -28
  417. package/dist/textarea-CXCcTVnf.js.map +1 -0
  418. package/dist/textarea-jqRrLxmo.cjs +39 -0
  419. package/dist/textarea-jqRrLxmo.cjs.map +1 -0
  420. package/dist/textarea.cjs +1 -1
  421. package/dist/textarea.js +1 -1
  422. package/dist/{theme-pbxlt72h.js → theme-2KZW2Rfs.js} +45 -41
  423. package/dist/{theme-pbxlt72h.js.map → theme-2KZW2Rfs.js.map} +1 -1
  424. package/dist/theme-Hjz9sCN-.cjs +181 -0
  425. package/dist/{theme-B-IJ2r7Q.cjs.map → theme-Hjz9sCN-.cjs.map} +1 -1
  426. package/dist/{theme-button-CEMeAUOL.js → theme-button-9uF1eoHz.js} +3 -4
  427. package/dist/theme-button-9uF1eoHz.js.map +1 -0
  428. package/dist/theme-button-C7QIbke1.cjs +8 -0
  429. package/dist/theme-button-C7QIbke1.cjs.map +1 -0
  430. package/dist/theme-button.cjs +1 -1
  431. package/dist/theme-button.js +1 -1
  432. package/dist/theme.cjs +1 -1
  433. package/dist/{theme.events-NuihzD_p.js.map → theme.events-Cv7N4Toe.js.map} +1 -1
  434. package/dist/{theme.events-DakXxZeP.cjs.map → theme.events-DM4H5F2d.cjs.map} +1 -1
  435. package/dist/{theme.interface-DTwkuAKJ.cjs.map → theme.interface-D9l33b-M.cjs.map} +1 -1
  436. package/dist/{theme.interface-Buged9Cg.js.map → theme.interface-DnVNre4O.js.map} +1 -1
  437. package/dist/theme.js +5 -5
  438. package/dist/theme.service-BrUbGoeQ.cjs +1 -0
  439. package/dist/theme.service-BrUbGoeQ.cjs.map +1 -0
  440. package/dist/{theme.service-cOfPrtfe.js → theme.service-CmbOGMA8.js} +4 -4
  441. package/dist/theme.service-CmbOGMA8.js.map +1 -0
  442. package/dist/timeline.cjs +277 -0
  443. package/dist/timeline.cjs.map +1 -0
  444. package/dist/timeline.js +326 -0
  445. package/dist/timeline.js.map +1 -0
  446. package/dist/tree.cjs +2 -2
  447. package/dist/tree.cjs.map +1 -1
  448. package/dist/tree.js +15 -13
  449. package/dist/tree.js.map +1 -1
  450. package/dist/typewriter.cjs +10 -123
  451. package/dist/typewriter.cjs.map +1 -1
  452. package/dist/typewriter.js +90 -212
  453. package/dist/typewriter.js.map +1 -1
  454. package/dist/typography.cjs +3 -3
  455. package/dist/typography.cjs.map +1 -1
  456. package/dist/typography.js +18 -112
  457. package/dist/typography.js.map +1 -1
  458. package/dist/utils-Cr-YO4Np.cjs +1 -0
  459. package/dist/utils-Cr-YO4Np.cjs.map +1 -0
  460. package/dist/{utils-Bp2jhyZc.js → utils-hp-DnFf5.js} +16 -6
  461. package/dist/utils-hp-DnFf5.js.map +1 -0
  462. package/dist/utils.cjs +1 -1
  463. package/dist/utils.js +4 -5
  464. package/dist/visually-hidden.cjs +2 -2
  465. package/dist/visually-hidden.cjs.map +1 -1
  466. package/dist/visually-hidden.js +7 -5
  467. package/dist/visually-hidden.js.map +1 -1
  468. package/dist/{window-CrjZdf7Y.js → window-C7yY9yp5.js} +28 -30
  469. package/dist/window-C7yY9yp5.js.map +1 -0
  470. package/dist/window-DtUOWiAj.cjs +59 -0
  471. package/dist/window-DtUOWiAj.cjs.map +1 -0
  472. package/dist/window.cjs +1 -1
  473. package/dist/window.js +1 -1
  474. package/package.json +15 -4
  475. package/plugins/vite-plugin-schmancy-auto-import.ts +143 -0
  476. package/plugins/vite-plugin-schmancy-manifest.ts +438 -0
  477. package/skills/schmancy/INDEX.md +1 -1
  478. package/skills/schmancy/SKILL.md +17 -5
  479. package/skills/schmancy/mixins.md +78 -20
  480. package/skills/schmancy/state.md +501 -0
  481. package/skills/schmancy/theme.md +15 -0
  482. package/skills/schmancy/timeline-tile.md +95 -0
  483. package/src/agent/agent-bundle.test.ts +71 -54
  484. package/src/agent/agent-entry.ts +5 -21
  485. package/src/agent/helpers.ts +159 -0
  486. package/src/agent/schmancy-skill.ts +71 -0
  487. package/src/agent/virtual-manifest.d.ts +1 -12
  488. package/src/area/area.component.ts +7 -19
  489. package/src/area/area.service.test.ts +4 -5
  490. package/src/area/area.service.ts +4 -3
  491. package/src/area/route.component.ts +17 -4
  492. package/src/area/utils.ts +3 -2
  493. package/src/audio/emotional-sounds.ts +0 -2
  494. package/src/audio/sound.service.ts +7 -13
  495. package/src/autocomplete/autocomplete.ts +18 -21
  496. package/src/{avatar.ts → avatar/avatar.ts} +2 -2
  497. package/src/avatar/index.ts +1 -0
  498. package/src/badge/badge.ts +4 -3
  499. package/src/boat/boat.ts +28 -36
  500. package/src/breadcrumb/breadcrumb.ts +11 -19
  501. package/src/busy/busy.ts +4 -3
  502. package/src/busy/spinner.ts +4 -3
  503. package/src/button/button.ts +6 -11
  504. package/src/button/icon-button.ts +8 -12
  505. package/src/card/actions.ts +4 -12
  506. package/src/card/card.ts +5 -23
  507. package/src/card/content.ts +4 -12
  508. package/src/card/media.ts +4 -9
  509. package/src/charts/area-chart.ts +7 -4
  510. package/src/charts/pills.ts +6 -4
  511. package/src/checkbox/checkbox.test.ts +2 -2
  512. package/src/checkbox/checkbox.ts +3 -9
  513. package/src/chips/assist-chip.ts +6 -14
  514. package/src/chips/chips.ts +7 -21
  515. package/src/chips/filter-chip.ts +4 -3
  516. package/src/chips/input-chip.ts +10 -9
  517. package/src/chips/suggestion-chip.ts +10 -12
  518. package/src/code-highlight/code-highlight.ts +28 -59
  519. package/src/code-highlight/code-preview.ts +11 -9
  520. package/src/connectivity/connectivity-status.ts +4 -3
  521. package/src/content-drawer/drawer.ts +5 -3
  522. package/src/content-drawer/main.ts +5 -3
  523. package/src/content-drawer/sheet.ts +6 -4
  524. package/src/date-range/date-range-dialog.ts +2 -2
  525. package/src/date-range/date-range.ts +3 -2
  526. package/src/delay/delay.ts +2 -2
  527. package/src/details/details.ts +4 -17
  528. package/src/dialog/dialog-service.ts +2 -0
  529. package/src/dialog/dialog.component.ts +9 -9
  530. package/src/directives/drag.ts +1 -9
  531. package/src/directives/index.ts +0 -1
  532. package/src/discovery/discovery.service.ts +1 -1
  533. package/src/divider/divider.ts +5 -14
  534. package/src/dropdown/dropdown-component.ts +5 -16
  535. package/src/dropdown/dropdown-content.ts +7 -14
  536. package/src/expand/expand-root.component.ts +5 -15
  537. package/src/expand/expand.component.ts +4 -17
  538. package/src/extra/countries/countries.ts +5 -13
  539. package/src/extra/timezone/timezone.ts +7 -12
  540. package/src/form/form.test.ts +2 -2
  541. package/src/form/form.ts +2 -9
  542. package/src/icons/icon.ts +4 -3
  543. package/src/iframe/iframe.ts +13 -4
  544. package/src/index.ts +3 -3
  545. package/src/input/input.ts +6 -13
  546. package/src/json/json.ts +4 -3
  547. package/src/kbd/kbd.ts +4 -3
  548. package/src/layout/index.ts +1 -5
  549. package/src/layout/scroll/scroll.ts +5 -8
  550. package/src/lightbox/flip-directive.ts +1 -1
  551. package/src/lightbox/lightbox.ts +5 -14
  552. package/src/list/list-item.ts +4 -13
  553. package/src/list/list.ts +12 -10
  554. package/src/mailbox/email-editor.ts +17 -11
  555. package/src/mailbox/email-layout-selector.ts +2 -2
  556. package/src/mailbox/email-recipients.ts +13 -8
  557. package/src/mailbox/email-template-picker.ts +6 -5
  558. package/src/mailbox/email-viewer.ts +5 -3
  559. package/src/mailbox/mailbox.ts +6 -5
  560. package/src/map/map.ts +8 -6
  561. package/src/menu/menu-item.ts +5 -16
  562. package/src/menu/menu.ts +27 -13
  563. package/src/nav-drawer/appbar.ts +4 -14
  564. package/src/nav-drawer/content.ts +5 -14
  565. package/src/nav-drawer/drawer.ts +5 -18
  566. package/src/nav-drawer/navbar.ts +3 -17
  567. package/src/navigation-bar/navigation-bar-item.ts +8 -6
  568. package/src/navigation-bar/navigation-bar.ts +19 -19
  569. package/src/navigation-rail/navigation-rail-item.ts +9 -5
  570. package/src/navigation-rail/navigation-rail.ts +10 -14
  571. package/src/notification/notification-service.ts +0 -2
  572. package/src/notification/notification.ts +6 -3
  573. package/src/option/option.ts +4 -3
  574. package/src/overlay/overlay.animations.ts +183 -37
  575. package/src/overlay/overlay.component.ts +397 -190
  576. package/src/overlay/overlay.confirm-body.ts +21 -7
  577. package/src/overlay/overlay.gestures.ts +72 -36
  578. package/src/overlay/overlay.layout.ts +103 -1
  579. package/src/overlay/overlay.positioning.ts +301 -0
  580. package/src/overlay/overlay.service.ts +81 -3
  581. package/src/overlay/overlay.stack.ts +8 -10
  582. package/src/overlay/overlay.types.ts +83 -5
  583. package/src/page/page.ts +16 -11
  584. package/src/payment-card-form/index.ts +1 -0
  585. package/src/{components/form-elements → payment-card-form}/payment-card-form.ts +23 -23
  586. package/src/progress/progress.ts +5 -3
  587. package/src/qr-scanner/qr-scanner.ts +7 -30
  588. package/src/radio-group/radio-button.ts +3 -13
  589. package/src/radio-group/radio-group.ts +5 -22
  590. package/src/range/range.ts +4 -3
  591. package/src/rxjs-utils/waitForElements.ts +1 -1
  592. package/src/rxjs-utils/waitForElementsAll.ts +1 -1
  593. package/src/select/select.ts +10 -18
  594. package/src/sheet/hook.ts +1 -1
  595. package/src/sheet/sheet.ts +5 -20
  596. package/src/skeleton/skeleton.ts +4 -3
  597. package/src/slider/slide.ts +5 -3
  598. package/src/slider/slider.ts +5 -3
  599. package/src/splash-screen/splash-screen.ts +5 -3
  600. package/src/state/CLAUDE.md +161 -0
  601. package/src/state/MIGRATION.md +258 -0
  602. package/src/state/SCOPING.md +134 -0
  603. package/src/state/active-host.ts +190 -0
  604. package/src/state/index.ts +877 -0
  605. package/src/state/persist.ts +208 -0
  606. package/src/state/schmancy-context.ts +130 -0
  607. package/src/state/state.test-d.ts +227 -0
  608. package/src/state/state.test.ts +868 -0
  609. package/src/steps/schmancy-step.ts +5 -3
  610. package/src/steps/schmancy-steps-container.ts +5 -3
  611. package/src/surface/surface.ts +14 -9
  612. package/src/switch/switch.test.ts +2 -2
  613. package/src/switch/switch.ts +8 -10
  614. package/src/table/row.ts +7 -4
  615. package/src/table/table.ts +17 -14
  616. package/src/tabs/index.ts +0 -2
  617. package/src/tabs/tab.ts +2 -2
  618. package/src/tabs/tabs-group.ts +7 -4
  619. package/src/teleport/teleport.component.ts +5 -3
  620. package/src/textarea/textarea.ts +6 -12
  621. package/src/theme/theme-audio-player.ts +7 -5
  622. package/src/theme/theme-controller.ts +2 -2
  623. package/src/theme/theme.component.ts +22 -15
  624. package/src/theme/theme.service.ts +6 -7
  625. package/src/theme/theme.style.css +1 -0
  626. package/src/theme-button/theme-button.ts +2 -2
  627. package/src/timeline/index.ts +1 -0
  628. package/src/timeline/timeline-tile.ts +431 -0
  629. package/src/tree/tree.ts +4 -16
  630. package/src/typewriter/index.ts +1 -1
  631. package/src/typography/typography.ts +5 -98
  632. package/src/utils/intersection.ts +5 -1
  633. package/src/utils/overlay-stack.ts +1 -1
  634. package/src/utils/search.ts +2 -2
  635. package/src/visually-hidden/visually-hidden.ts +4 -3
  636. package/src/window/window-position.ts +3 -6
  637. package/src/window/window.ts +9 -7
  638. package/types/mixins/SchmancyElement.d.ts +49 -0
  639. package/types/mixins/formField.mixin.d.ts +4 -2
  640. package/types/mixins/index.d.ts +1 -0
  641. package/types/mixins/litElement.mixin.d.ts +11 -0
  642. package/types/src/agent/agent-entry.d.ts +2 -19
  643. package/types/src/agent/helpers.d.ts +0 -27
  644. package/types/src/agent/schmancy-skill.d.ts +3 -5
  645. package/types/src/area/area.component.d.ts +3 -17
  646. package/types/src/area/route.component.d.ts +14 -4
  647. package/types/src/audio/emotional-sounds.d.ts +0 -1
  648. package/types/src/audio/sound.service.d.ts +1 -1
  649. package/types/src/autocomplete/autocomplete.d.ts +4 -15
  650. package/types/src/{avatar.d.ts → avatar/avatar.d.ts} +2 -3
  651. package/types/src/avatar/index.d.ts +1 -0
  652. package/types/src/badge/badge.d.ts +3 -3
  653. package/types/src/boat/boat.d.ts +3 -2
  654. package/types/src/breadcrumb/breadcrumb.d.ts +9 -19
  655. package/types/src/busy/busy.d.ts +3 -3
  656. package/types/src/busy/spinner.d.ts +3 -3
  657. package/types/src/button/button.d.ts +4 -10
  658. package/types/src/button/icon-button.d.ts +5 -11
  659. package/types/src/card/actions.d.ts +3 -12
  660. package/types/src/card/card.d.ts +4 -24
  661. package/types/src/card/content.d.ts +3 -12
  662. package/types/src/card/media.d.ts +3 -9
  663. package/types/src/charts/area-chart.d.ts +3 -3
  664. package/types/src/charts/pills.d.ts +3 -3
  665. package/types/src/checkbox/checkbox.d.ts +3 -10
  666. package/types/src/chips/assist-chip.d.ts +5 -15
  667. package/types/src/chips/chips.d.ts +3 -17
  668. package/types/src/chips/filter-chip.d.ts +3 -3
  669. package/types/src/chips/input-chip.d.ts +9 -10
  670. package/types/src/chips/suggestion-chip.d.ts +9 -13
  671. package/types/src/code-highlight/code-highlight.d.ts +4 -11
  672. package/types/src/code-highlight/code-preview.d.ts +3 -3
  673. package/types/src/connectivity/connectivity-status.d.ts +3 -3
  674. package/types/src/content-drawer/drawer.d.ts +4 -4
  675. package/types/src/content-drawer/main.d.ts +3 -3
  676. package/types/src/content-drawer/sheet.d.ts +4 -4
  677. package/types/src/date-range/date-range-dialog.d.ts +2 -3
  678. package/types/src/date-range/date-range.d.ts +2 -3
  679. package/types/src/delay/delay.d.ts +2 -3
  680. package/types/src/details/details.d.ts +3 -14
  681. package/types/src/dialog/dialog.component.d.ts +9 -9
  682. package/types/src/directives/drag.d.ts +1 -3
  683. package/types/src/directives/index.d.ts +0 -1
  684. package/types/src/divider/divider.d.ts +3 -14
  685. package/types/src/dropdown/dropdown-component.d.ts +4 -17
  686. package/types/src/dropdown/dropdown-content.d.ts +6 -14
  687. package/types/src/expand/expand-root.component.d.ts +4 -14
  688. package/types/src/expand/expand.component.d.ts +3 -17
  689. package/types/src/extra/countries/countries.d.ts +3 -13
  690. package/types/src/extra/timezone/timezone.d.ts +4 -11
  691. package/types/src/form/form.d.ts +2 -9
  692. package/types/src/icons/icon.d.ts +3 -3
  693. package/types/src/iframe/iframe.d.ts +5 -3
  694. package/types/src/index.d.ts +3 -3
  695. package/types/src/input/input.d.ts +4 -11
  696. package/types/src/json/json.d.ts +3 -3
  697. package/types/src/kbd/kbd.d.ts +3 -3
  698. package/types/src/layout/index.d.ts +0 -4
  699. package/types/src/layout/scroll/scroll.d.ts +4 -8
  700. package/types/src/lightbox/lightbox.d.ts +3 -14
  701. package/types/src/list/list-item.d.ts +3 -13
  702. package/types/src/list/list.d.ts +11 -10
  703. package/types/src/mailbox/email-editor.d.ts +3 -3
  704. package/types/src/mailbox/email-layout-selector.d.ts +2 -3
  705. package/types/src/mailbox/email-recipients.d.ts +7 -3
  706. package/types/src/mailbox/email-template-picker.d.ts +4 -4
  707. package/types/src/mailbox/email-viewer.d.ts +3 -3
  708. package/types/src/mailbox/mailbox.d.ts +4 -4
  709. package/types/src/map/map.d.ts +4 -3
  710. package/types/src/menu/menu-item.d.ts +3 -16
  711. package/types/src/menu/menu.d.ts +25 -13
  712. package/types/src/nav-drawer/appbar.d.ts +3 -14
  713. package/types/src/nav-drawer/content.d.ts +3 -14
  714. package/types/src/nav-drawer/drawer.d.ts +3 -18
  715. package/types/src/nav-drawer/navbar.d.ts +3 -18
  716. package/types/src/navigation-bar/navigation-bar-item.d.ts +7 -6
  717. package/types/src/navigation-bar/navigation-bar.d.ts +13 -7
  718. package/types/src/navigation-rail/navigation-rail-item.d.ts +9 -6
  719. package/types/src/navigation-rail/navigation-rail.d.ts +10 -15
  720. package/types/src/notification/notification-service.d.ts +0 -1
  721. package/types/src/notification/notification.d.ts +3 -3
  722. package/types/src/option/option.d.ts +3 -3
  723. package/types/src/overlay/overlay.animations.d.ts +54 -6
  724. package/types/src/overlay/overlay.component.d.ts +39 -15
  725. package/types/src/overlay/overlay.confirm-body.d.ts +4 -4
  726. package/types/src/overlay/overlay.gestures.d.ts +26 -17
  727. package/types/src/overlay/overlay.layout.d.ts +27 -1
  728. package/types/src/overlay/overlay.positioning.d.ts +87 -0
  729. package/types/src/overlay/overlay.stack.d.ts +0 -2
  730. package/types/src/overlay/overlay.types.d.ts +59 -5
  731. package/types/src/page/page.d.ts +14 -11
  732. package/types/src/{components/form-elements → payment-card-form}/payment-card-form.d.ts +2 -3
  733. package/types/src/progress/progress.d.ts +3 -3
  734. package/types/src/qr-scanner/qr-scanner.d.ts +3 -3
  735. package/types/src/radio-group/radio-button.d.ts +3 -12
  736. package/types/src/radio-group/radio-group.d.ts +4 -20
  737. package/types/src/range/range.d.ts +3 -3
  738. package/types/src/rxjs-utils/waitForElements.d.ts +1 -1
  739. package/types/src/rxjs-utils/waitForElementsAll.d.ts +1 -1
  740. package/types/src/select/select.d.ts +4 -15
  741. package/types/src/sheet/sheet.d.ts +3 -20
  742. package/types/src/skeleton/skeleton.d.ts +3 -3
  743. package/types/src/slider/slide.d.ts +3 -2
  744. package/types/src/slider/slider.d.ts +3 -3
  745. package/types/src/splash-screen/splash-screen.d.ts +3 -3
  746. package/types/src/state/active-host.d.ts +23 -0
  747. package/types/src/state/index.d.ts +145 -0
  748. package/types/src/state/persist.d.ts +14 -0
  749. package/types/src/state/schmancy-context.d.ts +32 -0
  750. package/types/src/state/state.test-d.d.ts +131 -0
  751. package/types/src/state/state.test.d.ts +1 -0
  752. package/types/src/steps/schmancy-step.d.ts +3 -3
  753. package/types/src/steps/schmancy-steps-container.d.ts +3 -3
  754. package/types/src/surface/surface.d.ts +13 -5
  755. package/types/src/switch/switch.d.ts +7 -11
  756. package/types/src/table/row.d.ts +2 -3
  757. package/types/src/table/table.d.ts +4 -11
  758. package/types/src/tabs/index.d.ts +0 -2
  759. package/types/src/tabs/tab.d.ts +2 -3
  760. package/types/src/tabs/tabs-group.d.ts +3 -3
  761. package/types/src/teleport/teleport.component.d.ts +3 -3
  762. package/types/src/textarea/textarea.d.ts +5 -12
  763. package/types/src/theme/theme-audio-player.d.ts +3 -3
  764. package/types/src/theme/theme-controller.d.ts +2 -2
  765. package/types/src/theme/theme.component.d.ts +18 -13
  766. package/types/src/theme-button/theme-button.d.ts +2 -3
  767. package/types/src/timeline/index.d.ts +1 -0
  768. package/types/src/timeline/timeline-tile.d.ts +44 -0
  769. package/types/src/tree/tree.d.ts +3 -16
  770. package/types/src/typewriter/index.d.ts +1 -1
  771. package/types/src/typography/typography.d.ts +3 -36
  772. package/types/src/visually-hidden/visually-hidden.d.ts +3 -3
  773. package/types/src/window/window.d.ts +3 -3
  774. package/dist/agent/index.es-Dymj8REP.js +0 -489
  775. package/dist/agent/index.es-Dymj8REP.js.map +0 -1
  776. package/dist/area-BGBCMC79.js.map +0 -1
  777. package/dist/area-D7l9KR2N.cjs +0 -12
  778. package/dist/area-D7l9KR2N.cjs.map +0 -1
  779. package/dist/autocomplete-BPD5uraA.cjs +0 -115
  780. package/dist/autocomplete-BPD5uraA.cjs.map +0 -1
  781. package/dist/autocomplete-C2P0Soht.js.map +0 -1
  782. package/dist/boat-BkIO-0No.cjs +0 -80
  783. package/dist/boat-BkIO-0No.cjs.map +0 -1
  784. package/dist/boat-DXZ0k7oa.js.map +0 -1
  785. package/dist/busy-DGYhpTnO.cjs.map +0 -1
  786. package/dist/busy-iRjq6Nvd.js.map +0 -1
  787. package/dist/card-DjYnCckw.cjs.map +0 -1
  788. package/dist/card-wUTjx0EC.js.map +0 -1
  789. package/dist/checkbox-CiYEtw9F.cjs +0 -39
  790. package/dist/checkbox-CiYEtw9F.cjs.map +0 -1
  791. package/dist/checkbox-VBSenxgb.js.map +0 -1
  792. package/dist/chips-BDS9lkPa.js.map +0 -1
  793. package/dist/chips-D6ptH5re.cjs.map +0 -1
  794. package/dist/code-highlight-Bi91XHJN.js.map +0 -1
  795. package/dist/code-highlight-BzRmBZzz.cjs.map +0 -1
  796. package/dist/components-DkmEgyAc.cjs +0 -73
  797. package/dist/components.cjs +0 -1
  798. package/dist/components.js +0 -2
  799. package/dist/context-BerzpUhI.js +0 -3
  800. package/dist/context-C6dHUHhi.cjs +0 -1
  801. package/dist/date-range-BmFxTXiU.cjs +0 -131
  802. package/dist/date-range-BmFxTXiU.cjs.map +0 -1
  803. package/dist/date-range-ClTMg1AB.js.map +0 -1
  804. package/dist/date-range-inline-B9Dp2z6C.cjs +0 -43
  805. package/dist/delay-BHODnTg-.cjs +0 -9
  806. package/dist/delay-BHODnTg-.cjs.map +0 -1
  807. package/dist/delay-Dlk0A3he.js +0 -347
  808. package/dist/delay-Dlk0A3he.js.map +0 -1
  809. package/dist/details-CPjlqQD4.js.map +0 -1
  810. package/dist/details-Cz9ok9si.cjs.map +0 -1
  811. package/dist/dialog-service-CzDO08Gy.cjs.map +0 -1
  812. package/dist/dialog-service-DH-tjPuE.js.map +0 -1
  813. package/dist/divider-CILo3_vi.cjs.map +0 -1
  814. package/dist/divider-ghgyw5CU.js.map +0 -1
  815. package/dist/expand-CbjBr_Ds.js.map +0 -1
  816. package/dist/expand-r3OrSoDk.cjs +0 -141
  817. package/dist/expand-r3OrSoDk.cjs.map +0 -1
  818. package/dist/extra-BZeZOMBI.cjs.map +0 -1
  819. package/dist/extra-DK9MQtPJ.js.map +0 -1
  820. package/dist/float-CuZ8LOgB.cjs +0 -1
  821. package/dist/flow-BPDtbhLe.js +0 -386
  822. package/dist/flow-BPDtbhLe.js.map +0 -1
  823. package/dist/flow-Dn9AZktE.cjs +0 -1
  824. package/dist/flow-Dn9AZktE.cjs.map +0 -1
  825. package/dist/form-rCZqoAoK.js.map +0 -1
  826. package/dist/form-wI58M85H.cjs.map +0 -1
  827. package/dist/handover/agent-runtime-v2-loopback.md +0 -71
  828. package/dist/handover/claude-design-v2-paste.md +0 -42
  829. package/dist/icons-Drq4kKy2.js.map +0 -1
  830. package/dist/icons-DtdhaZdc.cjs +0 -52
  831. package/dist/icons-DtdhaZdc.cjs.map +0 -1
  832. package/dist/iframe-BkwwWIbQ.cjs +0 -24
  833. package/dist/iframe-BkwwWIbQ.cjs.map +0 -1
  834. package/dist/iframe-BmyHW8km.js.map +0 -1
  835. package/dist/index.es-BgmFX1JM.cjs +0 -1
  836. package/dist/index.es-BgmFX1JM.cjs.map +0 -1
  837. package/dist/index.es-CLyb_o3Y.js +0 -489
  838. package/dist/index.es-CLyb_o3Y.js.map +0 -1
  839. package/dist/input-BGNZlfL8.cjs +0 -51
  840. package/dist/input-BGNZlfL8.cjs.map +0 -1
  841. package/dist/input-Bc3bVISm.js.map +0 -1
  842. package/dist/input-chip-BQrjpjaQ.js.map +0 -1
  843. package/dist/input-chip-DN-cwf11.cjs.map +0 -1
  844. package/dist/intersection-BrXp4YTO.js +0 -12
  845. package/dist/intersection-BrXp4YTO.js.map +0 -1
  846. package/dist/intersection-DqBqnpgh.cjs +0 -1
  847. package/dist/intersection-DqBqnpgh.cjs.map +0 -1
  848. package/dist/layout-7eyMBmZk.cjs +0 -17
  849. package/dist/layout-7eyMBmZk.cjs.map +0 -1
  850. package/dist/layout-Ox6nJkzC.js +0 -268
  851. package/dist/layout-Ox6nJkzC.js.map +0 -1
  852. package/dist/lightbox-CY52Z_ig.js.map +0 -1
  853. package/dist/lightbox-H8Uq3AXy.cjs +0 -202
  854. package/dist/lightbox-H8Uq3AXy.cjs.map +0 -1
  855. package/dist/list-BGjVo6zb.cjs +0 -40
  856. package/dist/list-BGjVo6zb.cjs.map +0 -1
  857. package/dist/list-D7wUxu1C.js.map +0 -1
  858. package/dist/litElement.mixin-CszkJuNl.js +0 -12
  859. package/dist/litElement.mixin-CszkJuNl.js.map +0 -1
  860. package/dist/litElement.mixin-qh5-IIUq.cjs +0 -1
  861. package/dist/litElement.mixin-qh5-IIUq.cjs.map +0 -1
  862. package/dist/mailbox--EN-JhjV.js.map +0 -1
  863. package/dist/mailbox-DLiBGJhY.cjs.map +0 -1
  864. package/dist/map-B0S_q3ma.js.map +0 -1
  865. package/dist/map-EDQN0I6e.cjs +0 -80
  866. package/dist/map-EDQN0I6e.cjs.map +0 -1
  867. package/dist/menu-3edZGQ1x.cjs.map +0 -1
  868. package/dist/menu-COeFpb6n.js.map +0 -1
  869. package/dist/metric.cjs +0 -69
  870. package/dist/metric.cjs.map +0 -1
  871. package/dist/metric.js +0 -93
  872. package/dist/metric.js.map +0 -1
  873. package/dist/mixins.cjs.map +0 -1
  874. package/dist/mixins.js.map +0 -1
  875. package/dist/notification-CC-TFN5v.js.map +0 -1
  876. package/dist/notification-P4c-kFdH.cjs +0 -23
  877. package/dist/notification-P4c-kFdH.cjs.map +0 -1
  878. package/dist/option-BwAF4nAw.js.map +0 -1
  879. package/dist/option-Cu0ertuF.cjs +0 -43
  880. package/dist/option-Cu0ertuF.cjs.map +0 -1
  881. package/dist/progress-Bk_Q1Shy.js.map +0 -1
  882. package/dist/progress-Yz6EMNSu.cjs.map +0 -1
  883. package/dist/provide-CYgj58u_.cjs +0 -1
  884. package/dist/provide-CYgj58u_.cjs.map +0 -1
  885. package/dist/provide-ydIskwf2.js +0 -107
  886. package/dist/provide-ydIskwf2.js.map +0 -1
  887. package/dist/radio-group-BcdcjLNC.js.map +0 -1
  888. package/dist/radio-group-BpBz5tRA.cjs +0 -40
  889. package/dist/radio-group-BpBz5tRA.cjs.map +0 -1
  890. package/dist/scroll-DXQv0ejL.js.map +0 -1
  891. package/dist/scroll-DbZMTv0K.cjs +0 -26
  892. package/dist/scroll-DbZMTv0K.cjs.map +0 -1
  893. package/dist/search-CwMav5QB.cjs +0 -1
  894. package/dist/select-BV4lK2zy.cjs.map +0 -1
  895. package/dist/select-DKyGWDsG.js.map +0 -1
  896. package/dist/sheet-BAI_jH1t.cjs +0 -35
  897. package/dist/sheet-BAI_jH1t.cjs.map +0 -1
  898. package/dist/sheet-C3TLKItO.js.map +0 -1
  899. package/dist/sheet.service-RcDBwHmv.cjs +0 -1
  900. package/dist/skills/schmancy/store.md +0 -126
  901. package/dist/skills/store.md +0 -126
  902. package/dist/sound.service-BEN6Xjy_.cjs +0 -1
  903. package/dist/sound.service-BEN6Xjy_.cjs.map +0 -1
  904. package/dist/sound.service-DWZe6swU.js.map +0 -1
  905. package/dist/splash-screen-DbI5RgBf.js.map +0 -1
  906. package/dist/splash-screen-DoHRTHi8.cjs +0 -41
  907. package/dist/splash-screen-DoHRTHi8.cjs.map +0 -1
  908. package/dist/src-00DfxCJq.js.map +0 -1
  909. package/dist/src-C_JjQovE.cjs +0 -269
  910. package/dist/src-C_JjQovE.cjs.map +0 -1
  911. package/dist/store-CjFHCSDb.cjs +0 -1
  912. package/dist/store-CjFHCSDb.cjs.map +0 -1
  913. package/dist/store-CjzZDQt8.js +0 -1654
  914. package/dist/store-CjzZDQt8.js.map +0 -1
  915. package/dist/store.cjs +0 -1
  916. package/dist/store.js +0 -2
  917. package/dist/surface-D-GWBcsh.cjs +0 -7
  918. package/dist/surface-D-GWBcsh.cjs.map +0 -1
  919. package/dist/surface-D23JtxYP.js +0 -22
  920. package/dist/surface-D23JtxYP.js.map +0 -1
  921. package/dist/surface.mixin-DqMwoddO.js +0 -320
  922. package/dist/surface.mixin-DqMwoddO.js.map +0 -1
  923. package/dist/surface.mixin-DxOi-xo0.cjs +0 -297
  924. package/dist/surface.mixin-DxOi-xo0.cjs.map +0 -1
  925. package/dist/table-C7b73kdg.cjs +0 -63
  926. package/dist/table-C7b73kdg.cjs.map +0 -1
  927. package/dist/table-CTrhV9-k.js +0 -631
  928. package/dist/table-CTrhV9-k.js.map +0 -1
  929. package/dist/tabs-Ce55RbwF.js.map +0 -1
  930. package/dist/tabs-DAzB8O7w.cjs +0 -31
  931. package/dist/tabs-DAzB8O7w.cjs.map +0 -1
  932. package/dist/tailwind.mixin-DRI1oTYQ.cjs +0 -2
  933. package/dist/tailwind.mixin-DRI1oTYQ.cjs.map +0 -1
  934. package/dist/tailwind.mixin-mdQR3BEO.js +0 -219
  935. package/dist/tailwind.mixin-mdQR3BEO.js.map +0 -1
  936. package/dist/textarea-DjN1D9u0.js.map +0 -1
  937. package/dist/textarea-PuHxBvJA.cjs +0 -39
  938. package/dist/textarea-PuHxBvJA.cjs.map +0 -1
  939. package/dist/theme-B-IJ2r7Q.cjs +0 -181
  940. package/dist/theme-button-BSbYmS4p.cjs +0 -8
  941. package/dist/theme-button-BSbYmS4p.cjs.map +0 -1
  942. package/dist/theme-button-CEMeAUOL.js.map +0 -1
  943. package/dist/theme.service-DxJPUGlu.cjs +0 -1
  944. package/dist/theme.service-DxJPUGlu.cjs.map +0 -1
  945. package/dist/theme.service-cOfPrtfe.js.map +0 -1
  946. package/dist/tslib.es6-Cnt75pb6.cjs +0 -1
  947. package/dist/tslib.es6-Cnt75pb6.cjs.map +0 -1
  948. package/dist/tslib.es6-DMzzJKHV.js +0 -7
  949. package/dist/tslib.es6-DMzzJKHV.js.map +0 -1
  950. package/dist/utils-Bp2jhyZc.js.map +0 -1
  951. package/dist/utils-CBPQvxNW.cjs +0 -1
  952. package/dist/utils-CBPQvxNW.cjs.map +0 -1
  953. package/dist/window-CrjZdf7Y.js.map +0 -1
  954. package/dist/window-DTUARSrU.cjs +0 -59
  955. package/dist/window-DTUARSrU.cjs.map +0 -1
  956. package/skills/schmancy/store.md +0 -126
  957. package/src/components/form-elements/index.ts +0 -1
  958. package/src/components/index.ts +0 -1
  959. package/src/layout/flex/flex.scss +0 -4
  960. package/src/layout/flex/flex.ts +0 -74
  961. package/src/layout/flex/index.ts +0 -1
  962. package/src/layout/grid/.readme +0 -79
  963. package/src/layout/grid/grid.scss +0 -5
  964. package/src/layout/grid/grid.ts +0 -121
  965. package/src/layout/grid/index.ts +0 -1
  966. package/src/layout/layout.ts +0 -122
  967. package/src/layout/v2/flex.ts +0 -243
  968. package/src/layout/v2/index.ts +0 -1
  969. package/src/metric/index.ts +0 -1
  970. package/src/metric/metric.ts +0 -127
  971. package/src/store/context-array.ts +0 -358
  972. package/src/store/context-collection.ts +0 -218
  973. package/src/store/context-create.ts +0 -284
  974. package/src/store/context-object.ts +0 -298
  975. package/src/store/filter-directive.ts +0 -614
  976. package/src/store/index.ts +0 -10
  977. package/src/store/selector-hook.ts +0 -259
  978. package/src/store/selectors.ts +0 -289
  979. package/src/store/storage-manager.ts +0 -269
  980. package/src/store/store.class.ts +0 -239
  981. package/src/store/types.ts +0 -327
  982. package/src/tabs/tabs-compatibility.ts +0 -20
  983. package/src/typewriter/typewriter.ts +0 -410
  984. package/types/src/agent/index.d.ts +0 -1
  985. package/types/src/area/route.test.d.ts +0 -20
  986. package/types/src/button/button.test.d.ts +0 -1
  987. package/types/src/chips/chip.d.ts +0 -3
  988. package/types/src/components/index.d.ts +0 -1
  989. package/types/src/content-drawer/$sheet.d.ts +0 -14
  990. package/types/src/dialog/dailog.d.ts +0 -116
  991. package/types/src/dialog/dialog-content.d.ts +0 -17
  992. package/types/src/directives/guard.d.ts +0 -1
  993. package/types/src/directives/visibility.d.ts +0 -11
  994. package/types/src/form/form-v2.d.ts +0 -22
  995. package/types/src/input/input-v2.d.ts +0 -250
  996. package/types/src/layout/flex/flex.d.ts +0 -26
  997. package/types/src/layout/flex/index.d.ts +0 -1
  998. package/types/src/layout/grid/grid.d.ts +0 -39
  999. package/types/src/layout/grid/index.d.ts +0 -1
  1000. package/types/src/layout/layout.d.ts +0 -59
  1001. package/types/src/layout/v2/flex.d.ts +0 -65
  1002. package/types/src/layout/v2/grid.d.ts +0 -51
  1003. package/types/src/layout/v2/index.d.ts +0 -1
  1004. package/types/src/lightbox/flip.directive.d.ts +0 -22
  1005. package/types/src/metric/index.d.ts +0 -1
  1006. package/types/src/metric/metric.d.ts +0 -39
  1007. package/types/src/notification/outlet.d.ts +0 -10
  1008. package/types/src/sheet/header.d.ts +0 -10
  1009. package/types/src/store/context-array.d.ts +0 -83
  1010. package/types/src/store/context-collection.d.ts +0 -74
  1011. package/types/src/store/context-create.d.ts +0 -43
  1012. package/types/src/store/context-object.d.ts +0 -46
  1013. package/types/src/store/filter-directive.d.ts +0 -116
  1014. package/types/src/store/immer-integration.d.ts +0 -54
  1015. package/types/src/store/index.d.ts +0 -10
  1016. package/types/src/store/selector-hook.d.ts +0 -46
  1017. package/types/src/store/selectors.d.ts +0 -90
  1018. package/types/src/store/storage-manager.d.ts +0 -48
  1019. package/types/src/store/store.class.d.ts +0 -73
  1020. package/types/src/store/types.d.ts +0 -241
  1021. package/types/src/tabs/tabs-compatibility.d.ts +0 -13
  1022. package/types/src/theme/theme.elevation.d.ts +0 -131
  1023. package/types/src/theme/theme.motion.d.ts +0 -198
  1024. package/types/src/theme/theme.shape.d.ts +0 -144
  1025. package/types/src/theme/theme.state.d.ts +0 -546
  1026. package/types/src/theme/theme.typography.d.ts +0 -74
  1027. package/types/src/tooltip/tooltip.d.ts +0 -33
  1028. package/types/src/typewriter/typewriter.d.ts +0 -94
  1029. /package/dist/agent/{flow-CvG1fLW5.js → flow-CaPi2G8y.js} +0 -0
  1030. /package/dist/agent/{vendor-material-color-DcL7ZPxx.js → vendor-material-color-Be96dpGE.js} +0 -0
  1031. /package/dist/{animation-hXFClrIn.js → animation-BK-8BwY8.js} +0 -0
  1032. /package/dist/{animation-CQRdLgzX.cjs → animation-CO_Csq84.cjs} +0 -0
  1033. /package/dist/{decorate-D_utPUsC.js → decorate-23nYs4Le.js} +0 -0
  1034. /package/dist/{decorate-F9CuyeHg.cjs → decorate-DpFmy0nm.cjs} +0 -0
  1035. /package/dist/{hashContent-B2IntJQf.js → hashContent-1ARKIsx9.js} +0 -0
  1036. /package/dist/{hashContent-CahnEuut.cjs → hashContent-Bp5S6T4U.cjs} +0 -0
  1037. /package/dist/{lazy-D6R5N5v4.js → lazy-B0ia54tT.js} +0 -0
  1038. /package/dist/{lazy-BDNnH_r7.cjs → lazy-Dq9mRRjT.cjs} +0 -0
  1039. /package/dist/{reduced-motion-BZTLqAyl.js → reduced-motion-D-L12p7G.js} +0 -0
  1040. /package/dist/{reduced-motion-9RjNnhIg.cjs → reduced-motion-Ds-HjMzn.cjs} +0 -0
  1041. /package/dist/{rxjs-utils-DJbZRjp3.cjs → rxjs-utils-Csnks202.cjs} +0 -0
  1042. /package/dist/{rxjs-utils-CKTnEKUH.js → rxjs-utils-d-ivVN84.js} +0 -0
  1043. /package/dist/{theme.events-NuihzD_p.js → theme.events-Cv7N4Toe.js} +0 -0
  1044. /package/dist/{theme.events-DakXxZeP.cjs → theme.events-DM4H5F2d.cjs} +0 -0
  1045. /package/dist/{theme.interface-DTwkuAKJ.cjs → theme.interface-D9l33b-M.cjs} +0 -0
  1046. /package/dist/{theme.interface-Buged9Cg.js → theme.interface-DnVNre4O.js} +0 -0
  1047. /package/src/{directives/typewriter.ts → typewriter/typewriter.directive.ts} +0 -0
  1048. /package/types/src/{components/form-elements → payment-card-form}/index.d.ts +0 -0
  1049. /package/types/src/{directives/typewriter.d.ts → typewriter/typewriter.directive.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"window-C7yY9yp5.js","names":[],"sources":["../src/window/window-manager.ts","../src/window/window-position.ts","../src/window/window.ts"],"sourcesContent":["/**\n * Window Manager — singleton service for multi-window coordination.\n *\n * Tracks all schmancy-window instances: positions, z-indices, focus, visual states.\n * Components register on connectedCallback, unregister on disconnectedCallback.\n * Focus changes, position updates, and overlap queries all flow through here.\n *\n * Follows the ThemeService singleton pattern (theme/theme.service.ts).\n *\n * Example:\n * windowManager.register('chat-1', bounds, 'bottom-right')\n * windowManager.focus('chat-1') // bumps z-index, updates focusedId\n * const overlaps = windowManager.findOverlaps(projectedBounds, 'chat-1')\n */\n\nimport { BehaviorSubject, Observable, distinctUntilChanged, map } from 'rxjs'\nimport { overlayStack } from '../utils/overlay-stack.js'\nimport type { WindowBounds, WindowRecord, WindowRegistryState, SnapTarget } from './window-registry.js'\n\nconst STORAGE_PREFIX = 'schmancy-window-'\nconst LEGACY_STORAGE_PREFIX = 'schmancy-float-'\n\nclass WindowManagerService {\n\tprivate static instance: WindowManagerService\n\n\tprivate readonly _state$ = new BehaviorSubject<WindowRegistryState>({\n\t\twindows: new Map(),\n\t\tfocusedId: null,\n\t\tstackOrder: [],\n\t})\n\n\treadonly state$ = this._state$.asObservable()\n\n\tprivate constructor() {}\n\n\tstatic getInstance(): WindowManagerService {\n\t\tif (!WindowManagerService.instance) {\n\t\t\tWindowManagerService.instance = new WindowManagerService()\n\t\t}\n\t\treturn WindowManagerService.instance\n\t}\n\n\t// ── Synchronous accessors ──────────────────────────────────────────\n\n\tget windows(): Map<string, WindowRecord> {\n\t\treturn this._state$.value.windows\n\t}\n\n\tget focusedId(): string | null {\n\t\treturn this._state$.value.focusedId\n\t}\n\n\t// ── Registration ───────────────────────────────────────────────────\n\n\tregister(id: string, initialBounds: WindowBounds, snapTarget: SnapTarget): void {\n\t\tconst state = this._state$.value\n\t\tif (state.windows.has(id)) return\n\n\t\tconst zIndex = overlayStack.assignZIndex(id)\n\t\tconst record: WindowRecord = {\n\t\t\tid,\n\t\t\tbounds: initialBounds,\n\t\t\tvisualState: 'normal',\n\t\t\tzIndex,\n\t\t\topen: false,\n\t\t\tsnapTarget,\n\t\t}\n\n\t\tconst windows = new Map(state.windows)\n\t\twindows.set(id, record)\n\t\tconst stackOrder = overlayStack.getStackOrder()\n\n\t\tthis._state$.next({ ...state, windows, stackOrder })\n\t}\n\n\tunregister(id: string): void {\n\t\tconst state = this._state$.value\n\t\tif (!state.windows.has(id)) return\n\n\t\toverlayStack.releaseId(id)\n\t\tconst windows = new Map(state.windows)\n\t\twindows.delete(id)\n\t\tconst stackOrder = overlayStack.getStackOrder()\n\t\tconst focusedId = state.focusedId === id ? null : state.focusedId\n\n\t\tthis._state$.next({ ...state, windows, stackOrder, focusedId })\n\t}\n\n\t// ── State mutations ────────────────────────────────────────────────\n\n\tupdateBounds(id: string, bounds: WindowBounds): void {\n\t\tthis._updateRecord(id, { bounds })\n\t}\n\n\tupdateVisualState(id: string, visualState: WindowRecord['visualState']): void {\n\t\tthis._updateRecord(id, { visualState })\n\t}\n\n\tupdateOpen(id: string, open: boolean): void {\n\t\tthis._updateRecord(id, { open })\n\t}\n\n\tfocus(id: string): void {\n\t\tconst state = this._state$.value\n\t\tif (!state.windows.has(id)) return\n\t\tif (state.focusedId === id) return\n\n\t\tconst zIndex = overlayStack.bringToFront(id)\n\t\tconst windows = new Map(state.windows)\n\t\tconst record = windows.get(id)\n\t\tif (record) {\n\t\t\twindows.set(id, { ...record, zIndex })\n\t\t}\n\t\tconst stackOrder = overlayStack.getStackOrder()\n\n\t\tthis._state$.next({ ...state, windows, stackOrder, focusedId: id })\n\t}\n\n\t// ── Queries ────────────────────────────────────────────────────────\n\n\tfindOverlaps(bounds: WindowBounds, excludeId: string): WindowRecord[] {\n\t\tconst result: WindowRecord[] = []\n\t\tfor (const [id, record] of this._state$.value.windows) {\n\t\t\tif (id === excludeId) continue\n\t\t\tif (rectsOverlap(bounds, record.bounds)) {\n\t\t\t\tresult.push(record)\n\t\t\t}\n\t\t}\n\t\treturn result\n\t}\n\n\tgetNeighbors(id: string): WindowRecord[] {\n\t\tconst result: WindowRecord[] = []\n\t\tfor (const [otherId, record] of this._state$.value.windows) {\n\t\t\tif (otherId !== id) result.push(record)\n\t\t}\n\t\treturn result\n\t}\n\n\t// ── Selectors ──────────────────────────────────────────────────────\n\n\tselectWindow(id: string): Observable<WindowRecord | undefined> {\n\t\treturn this._state$.pipe(\n\t\t\tmap(state => state.windows.get(id)),\n\t\t\tdistinctUntilChanged(),\n\t\t)\n\t}\n\n\tselectFocused(): Observable<string | null> {\n\t\treturn this._state$.pipe(\n\t\t\tmap(state => state.focusedId),\n\t\t\tdistinctUntilChanged(),\n\t\t)\n\t}\n\n\t// ── Persistence ────────────────────────────────────────────────────\n\n\tloadPosition(id: string): { x: number; y: number; anchor: string } | null {\n\t\ttry {\n\t\t\t// Try new key first, fall back to legacy\n\t\t\tconst raw = localStorage.getItem(STORAGE_PREFIX + id) ?? localStorage.getItem(LEGACY_STORAGE_PREFIX + id)\n\t\t\tif (!raw) return null\n\t\t\treturn JSON.parse(raw) as { x: number; y: number; anchor: string }\n\t\t} catch {\n\t\t\treturn null\n\t\t}\n\t}\n\n\tsavePosition(id: string, data: { x: number; y: number; anchor: string }): void {\n\t\ttry {\n\t\t\tlocalStorage.setItem(STORAGE_PREFIX + id, JSON.stringify(data))\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\tclearPosition(id: string): void {\n\t\ttry {\n\t\t\tlocalStorage.removeItem(STORAGE_PREFIX + id)\n\t\t\tlocalStorage.removeItem(LEGACY_STORAGE_PREFIX + id)\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\t// ── Internal ───────────────────────────────────────────────────────\n\n\tprivate _updateRecord(id: string, updates: Partial<WindowRecord>): void {\n\t\tconst state = this._state$.value\n\t\tconst record = state.windows.get(id)\n\t\tif (!record) return\n\n\t\tconst windows = new Map(state.windows)\n\t\twindows.set(id, { ...record, ...updates })\n\t\tthis._state$.next({ ...state, windows })\n\t}\n}\n\n/** Simple rect overlap check (inline — no circular import with window-position) */\nfunction rectsOverlap(a: WindowBounds, b: WindowBounds): boolean {\n\treturn !(a.left >= b.left + b.width || a.left + a.width <= b.left || a.top >= b.top + b.height || a.top + a.height <= b.top)\n}\n\nexport const windowManager = WindowManagerService.getInstance()\n","/**\n * Window Position — pure functions for overlap resolution, cascade, and snapping.\n *\n * All functions are stateless: they take window bounds and viewport dimensions,\n * return new bounds. No side effects, no DOM access, no subscriptions.\n *\n * Example:\n * const projected = { left: 100, top: 400, width: 360, height: 500 }\n * const neighbors = windowManager.findOverlaps(projected, 'my-id')\n * const resolved = resolveOverlap(projected, neighbors, { width: 1440, height: 900 })\n * // → { left: 144, top: 444, width: 360, height: 500 } (cascaded away from conflict)\n */\n\nimport type { WindowBounds, WindowRecord } from './window-registry.js'\n\nconst HEAD_HEIGHT = 44\nconst CASCADE_OFFSET = HEAD_HEIGHT\nconst MAX_CASCADE_ATTEMPTS = 10\n\n/** Check if two rectangles overlap (edges touching does NOT count as overlap) */\nexport function rectsOverlap(a: WindowBounds, b: WindowBounds): boolean {\n\treturn !(a.left >= b.left + b.width || a.left + a.width <= b.left || a.top >= b.top + b.height || a.top + a.height <= b.top)\n}\n\n/**\n * Resolve overlap by cascading diagonally until no conflict.\n * Shifts by (HEAD_HEIGHT, HEAD_HEIGHT) per attempt, clamped to viewport.\n */\nexport function resolveOverlap(\n\tcandidate: WindowBounds,\n\texisting: WindowRecord[],\n\tviewport: { width: number; height: number },\n): WindowBounds {\n\tconst bounds = { ...candidate }\n\n\tfor (let attempt = 0; attempt < MAX_CASCADE_ATTEMPTS; attempt++) {\n\t\tconst hasOverlap = existing.some(w => rectsOverlap(bounds, w.bounds))\n\t\tif (!hasOverlap) break\n\n\t\tbounds.left += CASCADE_OFFSET\n\t\tbounds.top += CASCADE_OFFSET\n\t}\n\n\treturn clampToViewport(bounds, viewport)\n}\n\n/**\n * Clamp bounds so the window stays fully within the viewport.\n */\nexport function clampToViewport(\n\tbounds: WindowBounds,\n\tviewport: { width: number; height: number },\n): WindowBounds {\n\treturn {\n\t\twidth: bounds.width,\n\t\theight: bounds.height,\n\t\tleft: Math.max(0, Math.min(bounds.left, viewport.width - bounds.width)),\n\t\ttop: Math.max(0, Math.min(bounds.top, viewport.height - bounds.height)),\n\t}\n}\n","import { SchmancyElement } from '@mixins/index'\nimport { css, html, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport {\n\tanimationFrameScheduler,\n\tauditTime,\n\tcatchError,\n\tEMPTY,\n\tfilter,\n\tfinalize,\n\tfrom,\n\tfromEvent,\n\tmap,\n\tmerge,\n\tObservable,\n\tswitchMap,\n\ttake,\n\ttakeUntil,\n\ttap,\n} from 'rxjs'\nimport { SPRING_SMOOTH, SPRING_SNAPPY } from '../utils/animation.js'\nimport { cursorGlow } from '../directives/cursor-glow'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport { theme } from '../theme/theme.service.js'\nimport type { SnapCorner, WindowBounds, WindowVisualState } from './window-registry.js'\nimport { windowManager } from './window-manager.js'\nimport { resolveOverlap } from './window-position.js'\n\nconst HEAD_HEIGHT = 48\nconst DRAG_THRESHOLD = 5\n\ninterface Position {\n\tx: number\n\ty: number\n}\n\n@customElement('schmancy-window')\nexport default class SchmancyWindow extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: contents;\n\t\tposition: relative;\n\t\tz-index: 1000;\n\t}\n\t:host([hidden]) {\n\t\tdisplay: none !important;\n\t}\n`]\n\n\t@property({ type: String }) id: string = 'default'\n\t/** Override the expanded panel width (e.g. '320px', '24rem'). Defaults to responsive sizing. */\n\t@property({ type: String }) expandedWidth?: string\n\t/** Override the expanded panel height (e.g. '400px', '50vh'). */\n\t@property({ type: String }) expandedHeight?: string\n\t/** When true, uses a lower elevation shadow in the collapsed state. */\n\t@property({ type: Boolean, reflect: true }) lowered: boolean = false\n\t/** Corner the window is anchored to. */\n\t@property({ type: String }) corner: SnapCorner = 'bottom-right'\n\t/** When true, window can be resized by the user. */\n\t@property({ type: Boolean }) resizable = false\n\t/** When true, window stays at its dragged position instead of snapping to a corner. */\n\t@property({ type: Boolean }) freePosition = false\n\t/** Visual state of the window (minimized, normal, maximized). */\n\t@property({ type: String, reflect: true }) visualState: WindowVisualState = 'normal'\n\t/** Minimum width in pixels. */\n\t@property({ type: Number }) minWidth = 280\n\t/** Minimum height in pixels. */\n\t@property({ type: Number }) minHeight = 200\n\n\t/** Whether the body is expanded. */\n\t@property({ type: Boolean, reflect: true }) open = false\n\n\tprivate _currentAnimation?: Animation\n\n\t/** Lazy rendering: body content not in DOM until first expand. */\n\t@state() private _hasOpened = false\n\t/** Whether this window is the focused window in the manager — drives visual ring */\n\t@state() private _focused = false\n\n\t// Internal position -- plain fields, updated directly during drag\n\tprivate _position: Position = { x: 16, y: 16 }\n\t@state() private _currentCorner: SnapCorner = 'bottom-right'\n\n\t// Track applied corner to avoid unnecessary style.removeProperty calls during drag\n\tprivate _appliedCorner: string = ''\n\n\t// Refs\n\tprivate _containerRef = createRef<HTMLElement>()\n\tprivate _bodyRef = createRef<HTMLElement>()\n\tprivate _headRef = createRef<HTMLElement>()\n\n\t// ============================================\n\t// COMPUTED\n\t// ============================================\n\n\tprivate get panelWidth(): string {\n\t\treturn this.expandedWidth ?? 'min(360px, calc(100vw - 32px))'\n\t}\n\n\tprivate get isBottomCorner(): boolean {\n\t\treturn this._currentCorner.startsWith('bottom')\n\t}\n\n\tprivate get closedClipPath(): string {\n\t\treturn this.isBottomCorner\n\t\t\t? `inset(calc(100% - ${HEAD_HEIGHT}px) 0px 0px 0px round 22px)`\n\t\t\t: `inset(0px 0px calc(100% - ${HEAD_HEIGHT}px) 0px round 22px)`\n\t}\n\n\tprivate get openClipPath(): string {\n\t\treturn 'inset(0px 0px 0px 0px round 12px)'\n\t}\n\n\tprivate get elevation(): 0 | 1 | 2 | 3 | 4 | 5 {\n\t\tif (this.open) return 4\n\t\treturn this.lowered ? 1 : 3\n\t}\n\n\t// ============================================\n\t// POSITION MANAGEMENT\n\t// ============================================\n\n\tprivate _applyContainerPosition() {\n\t\tconst container = this._containerRef.value\n\t\tif (!container) return\n\t\t// Only clear position properties when corner changes (avoids 4 style invalidations per drag frame)\n\t\tif (this._appliedCorner !== this._currentCorner) {\n\t\t\tcontainer.style.removeProperty('left')\n\t\t\tcontainer.style.removeProperty('right')\n\t\t\tcontainer.style.removeProperty('top')\n\t\t\tcontainer.style.removeProperty('bottom')\n\t\t\tthis._appliedCorner = this._currentCorner\n\t\t}\n\t\tconst { x, y } = this._position\n\t\tif (this._currentCorner.includes('right')) {\n\t\t\tcontainer.style.right = `${x}px`\n\t\t} else {\n\t\t\tcontainer.style.left = `${x}px`\n\t\t}\n\t\tif (this._currentCorner.includes('bottom')) {\n\t\t\tcontainer.style.bottom = `${y + theme.bottomOffset}px`\n\t\t} else {\n\t\t\tcontainer.style.top = `${y}px`\n\t\t}\n\t}\n\n\tprivate static readonly VALID_CORNERS = new Set<string>(['top-left', 'top-right', 'bottom-left', 'bottom-right'])\n\n\tprivate _loadPosition() {\n\t\tconst saved = windowManager.loadPosition(this.id)\n\t\tif (saved) {\n\t\t\tthis._position = { x: saved.x, y: saved.y }\n\t\t\tif (SchmancyWindow.VALID_CORNERS.has(saved.anchor)) {\n\t\t\t\tthis._currentCorner = saved.anchor as SnapCorner\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _savePosition() {\n\t\twindowManager.savePosition(this.id, { ...this._position, anchor: this._currentCorner })\n\t}\n\n\tprivate _validateBounds() {\n\t\tconst container = this._containerRef.value\n\t\tif (!container) return\n\t\tconst rect = container.getBoundingClientRect()\n\t\tif (rect.width === 0) return\n\t\tconst vw = window.innerWidth\n\t\tconst vh = window.innerHeight\n\t\tconst isRight = this._currentCorner.includes('right')\n\t\tconst isBottom = this._currentCorner.includes('bottom')\n\t\tconst actualLeft = isRight ? vw - this._position.x - rect.width : this._position.x\n\t\tconst actualTop = isBottom ? vh - this._position.y - rect.height : this._position.y\n\t\tconst newLeft = Math.max(0, Math.min(actualLeft, vw - rect.width))\n\t\tconst newTop = Math.max(0, Math.min(actualTop, vh - rect.height))\n\t\tthis._position = {\n\t\t\tx: isRight ? vw - newLeft - rect.width : newLeft,\n\t\t\ty: isBottom ? vh - newTop - rect.height : newTop,\n\t\t}\n\t\tthis._applyContainerPosition()\n\t}\n\n\t// ============================================\n\t// CORNER SNAPPING\n\t// ============================================\n\n\tprivate _reorientToNearestCorner(skipAnimation = false): void {\n\t\t// Free position mode: skip corner snapping\n\t\tif (this.freePosition) {\n\t\t\tthis._savePosition()\n\t\t\tconst rect = this._containerRef.value?.getBoundingClientRect()\n\t\t\tif (rect) {\n\t\t\t\twindowManager.updateBounds(this.id, { left: rect.left, top: rect.top, width: rect.width, height: rect.height })\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst container = this._containerRef.value\n\t\tif (!container) return\n\n\t\t// F -- record current screen position before DOM mutation\n\t\tconst rect = container.getBoundingClientRect()\n\n\t\t// L -- calculate nearest corner using head visual center\n\t\tconst currentIsBottom = this._currentCorner.includes('bottom')\n\t\tconst headCenterX = rect.left + rect.width / 2\n\t\tconst headCenterY = currentIsBottom\n\t\t\t? rect.bottom - HEAD_HEIGHT / 2\n\t\t\t: rect.top + HEAD_HEIGHT / 2\n\t\tconst side = headCenterX > window.innerWidth / 2 ? 'right' : 'left'\n\t\tconst vert = headCenterY > window.innerHeight / 2 ? 'bottom' : 'top'\n\t\tconst newCorner: SnapCorner = `${vert}-${side}` as SnapCorner\n\n\t\t// Snap corner and reset offset to standard edge gap\n\t\tthis._currentCorner = newCorner\n\t\tthis._position = { x: 16, y: 16 }\n\t\tthis._applyContainerPosition()\n\t\t// Sync clip-path to new corner\n\t\tif (!this.open) {\n\t\t\tcontainer.style.clipPath = this.closedClipPath\n\t\t}\n\n\t\tif (skipAnimation || reducedMotion$.value) {\n\t\t\tthis._savePosition()\n\t\t\tconst snapRect = container.getBoundingClientRect()\n\t\t\twindowManager.updateBounds(this.id, { left: snapRect.left, top: snapRect.top, width: snapRect.width, height: snapRect.height })\n\t\t\treturn\n\t\t}\n\n\t\t// I -- invert: shift element back to its original visual position\n\t\tconst newRect = container.getBoundingClientRect()\n\t\tconst dx = rect.left - newRect.left\n\t\tconst dy = rect.top - newRect.top\n\t\tcontainer.style.translate = `${dx}px ${dy}px`\n\n\t\t// P -- play: animate from the inverse offset to natural resting position\n\t\tconst flipKeyframes: Keyframe[] = [{ translate: `${dx}px ${dy}px` }, { translate: '0px 0px' }]\n\t\tconst anim = container.animate(\n\t\t\tflipKeyframes,\n\t\t\t{\n\t\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t)\n\t\tfrom(anim.finished).pipe(\n\t\t\ttake(1),\n\t\t\ttap(() => {\n\t\t\t\tif (container.isConnected) container.style.translate = ''\n\t\t\t\t// Report final resting bounds after animation completes\n\t\t\t\tconst finalRect = container.getBoundingClientRect()\n\t\t\t\twindowManager.updateBounds(this.id, { left: finalRect.left, top: finalRect.top, width: finalRect.width, height: finalRect.height })\n\t\t\t}),\n\t\t\tcatchError(() => EMPTY),\n\t\t\ttakeUntil(this.disconnecting),\n\t\t).subscribe()\n\n\t\tthis._savePosition()\n\t}\n\n\t// ============================================\n\t// DRAG PIPELINE\n\t// ============================================\n\n\tprivate _drag$(): Observable<never> {\n\t\treturn new Observable(() => {\n\t\t\tconst head = this._headRef.value\n\t\t\tconst container = this._containerRef.value\n\t\t\tif (!head || !container) return\n\n\t\t\tlet didDrag = false\n\n\t\t\tconst sub = fromEvent<PointerEvent>(head, 'pointerdown').pipe(\n\t\t\t\tfilter(e => e.button === 0),\n\t\t\t\tfilter(e => {\n\t\t\t\t\tconst tag = (e.target as HTMLElement).tagName?.toLowerCase()\n\t\t\t\t\treturn !['input', 'textarea', 'select', 'button'].includes(tag)\n\t\t\t\t\t\t&& !(e.target as HTMLElement).closest('schmancy-input, schmancy-icon-button, button, a')\n\t\t\t\t}),\n\t\t\t\ttap(e => {\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\te.stopPropagation()\n\t\t\t\t}),\n\t\t\t)\n\t\t\t\t.pipe(\n\t\t\t\t\tmap(e => {\n\t\t\t\t\t\tconst rect = container.getBoundingClientRect()\n\t\t\t\t\t\tconst isBottom = this._currentCorner.includes('bottom')\n\t\t\t\t\t\tconst wasOpen = this.open\n\t\t\t\t\t\tdidDrag = false\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstartX: e.clientX,\n\t\t\t\t\t\t\tstartY: e.clientY,\n\t\t\t\t\t\t\toffsetX: e.clientX - rect.left,\n\t\t\t\t\t\t\toffsetY: e.clientY - rect.top,\n\t\t\t\t\t\t\trect,\n\t\t\t\t\t\t\tvw: window.innerWidth,\n\t\t\t\t\t\t\tvh: window.innerHeight,\n\t\t\t\t\t\t\tisBottom,\n\t\t\t\t\t\t\twasOpen,\n\t\t\t\t\t\t\tpointerId: e.pointerId,\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t\tswitchMap(({ startX, startY, offsetX, offsetY, rect, vw, vh, isBottom, wasOpen, pointerId }) => {\n\t\t\t\t\t\tconst move$ = fromEvent<PointerEvent>(window, 'pointermove').pipe(\n\t\t\t\t\t\t\tfilter(e => e.pointerId === pointerId),\n\t\t\t\t\t\t\tauditTime(0, animationFrameScheduler),\n\t\t\t\t\t\t\tmap(e => ({ clientX: e.clientX, clientY: e.clientY })),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst end$ = fromEvent<PointerEvent>(window, 'pointerup').pipe(\n\t\t\t\t\t\t\tfilter(e => e.pointerId === pointerId),\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\treturn move$.pipe(\n\t\t\t\t\t\t\ttap(({ clientX, clientY }) => {\n\t\t\t\t\t\t\t\tconst dx = clientX - startX\n\t\t\t\t\t\t\t\tconst dy = clientY - startY\n\t\t\t\t\t\t\t\tif (Math.sqrt(dx * dx + dy * dy) > DRAG_THRESHOLD && !didDrag) {\n\t\t\t\t\t\t\t\t\tdidDrag = true\n\t\t\t\t\t\t\t\t\tthis._applyDragVisuals(true)\n\t\t\t\t\t\t\t\t\t// Collapse on first confirmed drag move\n\t\t\t\t\t\t\t\t\tif (wasOpen) {\n\t\t\t\t\t\t\t\t\t\tthis.open = false\n\t\t\t\t\t\t\t\t\t\tcontainer.style.clipPath = this.closedClipPath\n\t\t\t\t\t\t\t\t\t\tcontainer.style.overflow = 'hidden'\n\t\t\t\t\t\t\t\t\t\tconst body = this._bodyRef.value\n\t\t\t\t\t\t\t\t\t\tif (body) {\n\t\t\t\t\t\t\t\t\t\t\tbody.inert = true\n\t\t\t\t\t\t\t\t\t\t\tbody.style.visibility = 'hidden'\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!didDrag) return\n\n\t\t\t\t\t\t\t\tconst left = Math.max(0, Math.min(clientX - offsetX, vw - rect.width))\n\t\t\t\t\t\t\t\tconst minTop = isBottom ? HEAD_HEIGHT - rect.height : 0\n\t\t\t\t\t\t\t\tconst maxTop = isBottom ? vh - rect.height : vh - HEAD_HEIGHT\n\t\t\t\t\t\t\t\tconst top = Math.max(minTop, Math.min(clientY - offsetY, maxTop))\n\n\t\t\t\t\t\t\t\tthis._position = {\n\t\t\t\t\t\t\t\t\tx: this._currentCorner.includes('right') ? vw - left - rect.width : left,\n\t\t\t\t\t\t\t\t\ty: isBottom ? vh - top - rect.height : top,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis._applyContainerPosition()\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(end$),\n\t\t\t\t\t\t\tfinalize(() => {\n\t\t\t\t\t\t\t\tif (didDrag) {\n\t\t\t\t\t\t\t\t\tthis._reorientToNearestCorner()\n\t\t\t\t\t\t\t\t\tthis._applyDragVisuals(false)\n\t\t\t\t\t\t\t\t\tdidDrag = false\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tdidDrag = false\n\t\t\t\t\t\t\t\t\tthis.toggle()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.subscribe()\n\n\t\t\treturn () => sub.unsubscribe()\n\t\t})\n\t}\n\n\t// ============================================\n\t// LIFECYCLE\n\t// ============================================\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Pipeline 1: DOM setup + manager registration + drag + z-index sync\n\t\tfrom(this.updateComplete).pipe(\n\t\t\ttake(1),\n\t\t\ttap(() => {\n\t\t\t\tthis._currentCorner = this.corner\n\t\t\t\tthis._loadPosition()\n\t\t\t\tthis._applyContainerPosition()\n\t\t\t\tthis._initDOMState()\n\t\t\t\t// Register with window manager\n\t\t\t\tconst container = this._containerRef.value\n\t\t\t\tif (container) {\n\t\t\t\t\tconst rect = container.getBoundingClientRect()\n\t\t\t\t\tconst bounds: WindowBounds = { left: rect.left, top: rect.top, width: rect.width, height: rect.height }\n\t\t\t\t\twindowManager.register(this.id, bounds, this.freePosition ? 'free' : this._currentCorner)\n\t\t\t\t}\n\t\t\t}),\n\t\t\tswitchMap(() => merge(\n\t\t\t\tthis._drag$(),\n\t\t\t\twindowManager.selectWindow(this.id).pipe(\n\t\t\t\t\ttap(record => {\n\t\t\t\t\t\tif (!record) return\n\t\t\t\t\t\tconst container = this._containerRef.value\n\t\t\t\t\t\tif (container) container.style.zIndex = String(record.zIndex)\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\twindowManager.selectFocused().pipe(\n\t\t\t\t\ttap(focusedId => {\n\t\t\t\t\t\tthis._focused = focusedId === this.id\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t)),\n\t\t\ttakeUntil(this.disconnecting),\n\t\t).subscribe()\n\n\n\t\t// Pipeline 3: Environment -- one subscription\n\t\tmerge(\n\t\t\tfromEvent(window, 'resize').pipe(\n\t\t\t\tauditTime(0, animationFrameScheduler),\n\t\t\t\ttap(() => this._validateBounds()),\n\t\t\t),\n\t\t\ttheme.bottomOffset$.pipe(\n\t\t\t\ttap(() => this._applyContainerPosition()),\n\t\t\t),\n\t\t).pipe(takeUntil(this.disconnecting)).subscribe()\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\twindowManager.unregister(this.id)\n\t}\n\n\tprivate _initDOMState() {\n\t\tconst container = this._containerRef.value\n\t\tconst body = this._bodyRef.value\n\t\tif (!container) return\n\n\t\tthis._applyContainerPosition()\n\n\t\tif (this.open) {\n\t\t\tthis._hasOpened = true\n\t\t\tcontainer.style.overflow = ''\n\t\t\tif (body) {\n\t\t\t\tbody.inert = false\n\t\t\t\tbody.style.visibility = 'visible'\n\t\t\t}\n\t\t} else {\n\t\t\tcontainer.style.clipPath = this.closedClipPath\n\t\t\tcontainer.style.overflow = 'hidden'\n\t\t\tif (body) {\n\t\t\t\tbody.inert = true\n\t\t\t\tbody.style.visibility = 'hidden'\n\t\t\t}\n\t\t}\n\t}\n\n\t// ============================================\n\t// ANIMATION\n\t// ============================================\n\n\tprivate _animateOpen() {\n\t\tconst container = this._containerRef.value\n\t\tconst body = this._bodyRef.value\n\t\tif (!container) return\n\n\t\tthis._hasOpened = true\n\t\tthis.open = true\n\n\t\t// Overlap avoidance\n\t\tconst rect = container.getBoundingClientRect()\n\t\tconst projectedBounds: WindowBounds = {\n\t\t\tleft: rect.left,\n\t\t\ttop: this.isBottomCorner ? rect.top - 400 : rect.top,\n\t\t\twidth: rect.width,\n\t\t\theight: 400 + HEAD_HEIGHT,\n\t\t}\n\t\tconst overlaps = windowManager.findOverlaps(projectedBounds, this.id)\n\t\tif (overlaps.length > 0) {\n\t\t\tconst resolved = resolveOverlap(projectedBounds, overlaps, { width: window.innerWidth, height: window.innerHeight })\n\t\t\tif (Math.abs(resolved.left - projectedBounds.left) > 10 || Math.abs(resolved.top - projectedBounds.top) > 10) {\n\t\t\t\tconst isRight = this._currentCorner.includes('right')\n\t\t\t\tconst isBottom = this._currentCorner.includes('bottom')\n\t\t\t\tthis._position = {\n\t\t\t\t\tx: isRight ? window.innerWidth - resolved.left - resolved.width : resolved.left,\n\t\t\t\t\ty: isBottom ? window.innerHeight - resolved.top - resolved.height : resolved.top,\n\t\t\t\t}\n\t\t\t\tthis._applyContainerPosition()\n\t\t\t}\n\t\t}\n\n\t\tif (body) {\n\t\t\tbody.style.visibility = 'visible'\n\t\t\tbody.inert = false\n\t\t}\n\n\t\tif (reducedMotion$.value) {\n\t\t\tcontainer.style.clipPath = ''\n\t\t\tcontainer.style.overflow = ''\n\t\t\tthis.dispatchScopedEvent('window-toggle', { state: 'expanded' })\n\t\t\treturn\n\t\t}\n\n\t\tthis._currentAnimation?.cancel()\n\t\tcontainer.style.overflow = 'hidden'\n\t\tcontainer.style.willChange = 'opacity'\n\t\tconst openKeyframes: Keyframe[] = [\n\t\t\t{ clipPath: this.closedClipPath, opacity: 0.95 },\n\t\t\t{ clipPath: this.openClipPath, opacity: 1 },\n\t\t]\n\t\tconst anim = container.animate(openKeyframes, {\n\t\t\tduration: SPRING_SNAPPY.duration,\n\t\t\teasing: SPRING_SNAPPY.easingFallback,\n\t\t\tfill: 'forwards',\n\t\t})\n\t\tthis._currentAnimation = anim\n\n\t\tfrom(anim.finished).pipe(\n\t\t\ttake(1),\n\t\t\ttap(() => {\n\t\t\t\tif (container.isConnected) {\n\t\t\t\t\tcontainer.style.clipPath = ''\n\t\t\t\t\tcontainer.style.overflow = ''\n\t\t\t\t\tcontainer.style.willChange = ''\n\t\t\t\t}\n\t\t\t}),\n\t\t\tcatchError(() => EMPTY),\n\t\t\ttakeUntil(this.disconnecting),\n\t\t).subscribe()\n\n\t\tthis.dispatchScopedEvent('window-toggle', { state: 'expanded' })\n\t}\n\n\tprivate _animateClose() {\n\t\tconst container = this._containerRef.value\n\t\tif (!container) return\n\n\t\tif (reducedMotion$.value) {\n\t\t\tcontainer.style.clipPath = this.closedClipPath\n\t\t\tcontainer.style.overflow = 'hidden'\n\t\t\tthis.open = false\n\t\t\tconst body = this._bodyRef.value\n\t\t\tif (body) { body.inert = true; body.style.visibility = 'hidden' }\n\t\t\tthis.dispatchScopedEvent('window-toggle', { state: 'collapsed' })\n\t\t\treturn\n\t\t}\n\n\t\tthis._currentAnimation?.cancel()\n\t\tcontainer.style.overflow = 'hidden'\n\t\tcontainer.style.willChange = 'opacity'\n\t\tconst closeKeyframes: Keyframe[] = [\n\t\t\t{ clipPath: this.openClipPath, opacity: 1 },\n\t\t\t{ clipPath: this.closedClipPath, opacity: 0.95 },\n\t\t]\n\t\tconst anim = container.animate(closeKeyframes, {\n\t\t\tduration: Math.round(SPRING_SNAPPY.duration * 0.7),\n\t\t\teasing: 'cubic-bezier(0.4, 0, 0.8, 0.15)',\n\t\t\tfill: 'forwards',\n\t\t})\n\t\tthis._currentAnimation = anim\n\n\t\tfrom(anim.finished).pipe(\n\t\t\ttake(1),\n\t\t\ttap(() => {\n\t\t\t\tthis.open = false\n\t\t\t\tcontainer.style.willChange = ''\n\t\t\t\tconst body = this._bodyRef.value\n\t\t\t\tif (body) { body.inert = true; body.style.visibility = 'hidden' }\n\t\t\t}),\n\t\t\tcatchError(() => EMPTY),\n\t\t\ttakeUntil(this.disconnecting),\n\t\t).subscribe()\n\n\t\tthis.dispatchScopedEvent('window-toggle', { state: 'collapsed' })\n\t}\n\n\t// ============================================\n\t// VISUAL STATE HELPERS\n\t// ============================================\n\n\t/** Apply drag visuals directly on DOM refs — avoids full Lit re-render for cursor + opacity */\n\tprivate _applyDragVisuals(dragging: boolean) {\n\t\tconst head = this._headRef.value\n\t\tconst container = this._containerRef.value\n\t\tif (head) {\n\t\t\thead.classList.toggle('cursor-grabbing', dragging)\n\t\t\thead.classList.toggle('cursor-move', !dragging)\n\t\t}\n\t\tif (container) {\n\t\t\tcontainer.style.opacity = dragging ? '0.95' : ''\n\t\t}\n\t}\n\n\tprivate _handleFocus = () => windowManager.focus(this.id)\n\n\tprivate _handleHeadKeydown = (e: KeyboardEvent) => {\n\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\te.preventDefault()\n\t\t\tthis.toggle()\n\t\t\treturn\n\t\t}\n\t\tif (e.key === 'ArrowUp' || e.key === 'ArrowDown' || e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n\t\t\te.preventDefault()\n\t\t\tconst step = e.shiftKey ? 20 : 5\n\t\t\tconst dx = e.key === 'ArrowRight' ? step : e.key === 'ArrowLeft' ? -step : 0\n\t\t\tconst dy = e.key === 'ArrowDown' ? step : e.key === 'ArrowUp' ? -step : 0\n\t\t\tthis._position = { x: this._position.x + dx, y: this._position.y + dy }\n\t\t\tthis._applyContainerPosition()\n\t\t\tthis._savePosition()\n\t\t}\n\t}\n\n\t// ============================================\n\t// PUBLIC API\n\t// ============================================\n\n\ttoggle() {\n\t\tif (this.open) this._animateClose()\n\t\telse this._animateOpen()\n\t}\n\n\texpand() {\n\t\tif (this.open) return\n\t\tthis._animateOpen()\n\t}\n\n\tclose() {\n\t\tif (!this.open) return\n\t\tthis._animateClose()\n\t}\n\n\t// ============================================\n\t// RENDER\n\t// ============================================\n\n\tprotected render(): unknown {\n\t\tconst isBottom = this._currentCorner.startsWith('bottom')\n\n\t\tconst containerClasses = classMap({\n\t\t\tfixed: true,\n\t\t\tflex: true,\n\t\t\t'flex-col': isBottom,\n\t\t\t'flex-col-reverse': !isBottom,\n\t\t\t'z-1000': true,\n\t\t\t'ring-1': !this._focused,\n\t\t\t'ring-2': this._focused,\n\t\t\t'ring-primary-default/30': this._focused,\n\t\t\t'ring-primary-default/15': this.open && !this._focused,\n\t\t\t'rounded-2xl': this.open,\n\t\t\t'ring-outline-variant/40': !this.open && !this._focused,\n\t\t\t'rounded-[22px]': !this.open,\n\t\t\t'overflow-hidden': true,\n\t\t})\n\n\t\tconst containerStyles = styleMap({\n\t\t\twidth: this.panelWidth,\n\t\t\t'max-height': 'calc(100vh - 32px)',\n\t\t\t'pointer-events': 'none',\n\t\t})\n\n\t\tconst bodyStyles = styleMap({\n\t\t\t'pointer-events': this.open ? 'auto' : 'none',\n\t\t})\n\n\t\tconst headClasses = classMap({\n\t\t\t'h-full': true,\n\t\t\t'px-3': true,\n\t\t\tflex: true,\n\t\t\t'items-center': true,\n\t\t\t'gap-2': true,\n\t\t\t'select-none': true,\n\t\t\t'cursor-move': true,\n\t\t})\n\n\t\treturn html`\n\t\t\t<schmancy-surface\n\t\t\t\t${ref(this._containerRef)}\n\t\t\t\ttype=\"glass\"\n\t\t\t\t.elevation=${this.elevation}\n\t\t\t\tclass=${containerClasses}\n\t\t\t\tstyle=${containerStyles}\n\t\t\t\taria-expanded=${this.open}\n\t\t\t\t@pointerdown=${this._handleFocus}\n\t\t\t>\n\t\t\t\t<!-- Details section (visually above summary for bottom corners) -->\n\t\t\t\t<section\n\t\t\t\t\t${ref(this._bodyRef)}\n\t\t\t\t\tclass=\"flex-1 min-h-0 overflow-hidden flex flex-col\"\n\t\t\t\t\tstyle=${bodyStyles}\n\t\t\t\t\trole=\"region\"\n\t\t\t\t\taria-label=\"Expandable content\"\n\t\t\t\t>\n\t\t\t\t\t${this._hasOpened ? html`<slot name=\"details\"></slot>` : nothing}\n\t\t\t\t</section>\n\n\t\t\t\t<!-- Summary section -- always interactive, always visible -->\n\t\t\t\t<section\n\t\t\t\t\tclass=\"shrink-0 bg-surface-lowest\"\n\t\t\t\t\tstyle=${styleMap({ 'pointer-events': 'auto', height: `${HEAD_HEIGHT}px` })}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\t${ref(this._headRef)}\n\t\t\t\t\t\t${cursorGlow({ radius: 200, intensity: 0.10 })}\n\t\t\t\t\t\tclass=${headClasses}\n\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\ttitle=\"Drag to move, click to expand\"\n\t\t\t\t\t\taria-label=\"${this.open ? 'Collapse window' : 'Expand window'}\"\n\t\t\t\t\t\t@keydown=${this._handleHeadKeydown}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div class=\"flex-1 min-w-0\">\n\t\t\t\t\t\t\t<slot></slot>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n\t\t\t\t\t\t\tclass=\"shrink-0 text-surface-on/40 transition-transform duration-200 ${this.open ? 'rotate-180' : ''}\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<path d=\"M6 9L12 15L18 9\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t</section>\n\t\t\t</schmancy-surface>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-window': SchmancyWindow\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ require(`./chunk-CncqDLb2.cjs`);const e=require(`./mixins-De3xfjrm.cjs`),t=require(`./decorate-DpFmy0nm.cjs`),n=require(`./animation-CO_Csq84.cjs`),r=require(`./reduced-motion-Ds-HjMzn.cjs`),i=require(`./cursor-glow-Bulq-38P.cjs`),a=require(`./theme.service-BrUbGoeQ.cjs`),o=require(`./overlay-stack-BprhAE9a.cjs`);let s=require(`rxjs`),c=require(`lit/directives/class-map.js`),l=require(`lit/directives/style-map.js`),u=require(`lit/decorators.js`),d=require(`lit`),f=require(`lit/directives/ref.js`);var p=`schmancy-window-`,m=`schmancy-float-`;function h(e,t){return!(e.left>=t.left+t.width||e.left+e.width<=t.left||e.top>=t.top+t.height||e.top+e.height<=t.top)}var g,_=class e{constructor(){this._state$=new s.BehaviorSubject({windows:new Map,focusedId:null,stackOrder:[]}),this.state$=this._state$.asObservable()}static getInstance(){return e.instance||=new e,e.instance}get windows(){return this._state$.value.windows}get focusedId(){return this._state$.value.focusedId}register(e,t,n){let r=this._state$.value;if(r.windows.has(e))return;let i={id:e,bounds:t,visualState:`normal`,zIndex:o.t.assignZIndex(e),open:!1,snapTarget:n},a=new Map(r.windows);a.set(e,i);let s=o.t.getStackOrder();this._state$.next({...r,windows:a,stackOrder:s})}unregister(e){let t=this._state$.value;if(!t.windows.has(e))return;o.t.releaseId(e);let n=new Map(t.windows);n.delete(e);let r=o.t.getStackOrder(),i=t.focusedId===e?null:t.focusedId;this._state$.next({...t,windows:n,stackOrder:r,focusedId:i})}updateBounds(e,t){this._updateRecord(e,{bounds:t})}updateVisualState(e,t){this._updateRecord(e,{visualState:t})}updateOpen(e,t){this._updateRecord(e,{open:t})}focus(e){let t=this._state$.value;if(!t.windows.has(e)||t.focusedId===e)return;let n=o.t.bringToFront(e),r=new Map(t.windows),i=r.get(e);i&&r.set(e,{...i,zIndex:n});let a=o.t.getStackOrder();this._state$.next({...t,windows:r,stackOrder:a,focusedId:e})}findOverlaps(e,t){let n=[];for(let[r,i]of this._state$.value.windows)r!==t&&h(e,i.bounds)&&n.push(i);return n}getNeighbors(e){let t=[];for(let[n,r]of this._state$.value.windows)n!==e&&t.push(r);return t}selectWindow(e){return this._state$.pipe((0,s.map)(t=>t.windows.get(e)),(0,s.distinctUntilChanged)())}selectFocused(){return this._state$.pipe((0,s.map)(e=>e.focusedId),(0,s.distinctUntilChanged)())}loadPosition(e){try{let t=localStorage.getItem(p+e)??localStorage.getItem(m+e);return t?JSON.parse(t):null}catch{return null}}savePosition(e,t){try{localStorage.setItem(p+e,JSON.stringify(t))}catch{}}clearPosition(e){try{localStorage.removeItem(p+e),localStorage.removeItem(m+e)}catch{}}_updateRecord(e,t){let n=this._state$.value,r=n.windows.get(e);if(!r)return;let i=new Map(n.windows);i.set(e,{...r,...t}),this._state$.next({...n,windows:i})}}.getInstance();function v(e,t,n){let r={...e};for(let e=0;e<10&&t.some(e=>{return t=r,n=e.bounds,!(t.left>=n.left+n.width||t.left+t.width<=n.left||t.top>=n.top+n.height||t.top+t.height<=n.top);var t,n});e++)r.left+=44,r.top+=44;return function(e,t){return{width:e.width,height:e.height,left:Math.max(0,Math.min(e.left,t.width-e.width)),top:Math.max(0,Math.min(e.top,t.height-e.height))}}(r,n)}var y=48,b=class extends e.s{static{g=this}constructor(...e){super(...e),this.id=`default`,this.lowered=!1,this.corner=`bottom-right`,this.resizable=!1,this.freePosition=!1,this.visualState=`normal`,this.minWidth=280,this.minHeight=200,this.open=!1,this._hasOpened=!1,this._focused=!1,this._position={x:16,y:16},this._currentCorner=`bottom-right`,this._appliedCorner=``,this._containerRef=(0,f.createRef)(),this._bodyRef=(0,f.createRef)(),this._headRef=(0,f.createRef)(),this._handleFocus=()=>_.focus(this.id),this._handleHeadKeydown=e=>{if(e.key===`Enter`||e.key===` `)return e.preventDefault(),void this.toggle();if(e.key===`ArrowUp`||e.key===`ArrowDown`||e.key===`ArrowLeft`||e.key===`ArrowRight`){e.preventDefault();let t=e.shiftKey?20:5,n=e.key===`ArrowRight`?t:e.key===`ArrowLeft`?-t:0,r=e.key===`ArrowDown`?t:e.key===`ArrowUp`?-t:0;this._position={x:this._position.x+n,y:this._position.y+r},this._applyContainerPosition(),this._savePosition()}}}static{this.styles=[d.css`
2
+ :host {
3
+ display: contents;
4
+ position: relative;
5
+ z-index: 1000;
6
+ }
7
+ :host([hidden]) {
8
+ display: none !important;
9
+ }
10
+ `]}get panelWidth(){return this.expandedWidth??`min(360px, calc(100vw - 32px))`}get isBottomCorner(){return this._currentCorner.startsWith(`bottom`)}get closedClipPath(){return this.isBottomCorner?`inset(calc(100% - 48px) 0px 0px 0px round 22px)`:`inset(0px 0px calc(100% - 48px) 0px round 22px)`}get openClipPath(){return`inset(0px 0px 0px 0px round 12px)`}get elevation(){return this.open?4:this.lowered?1:3}_applyContainerPosition(){let e=this._containerRef.value;if(!e)return;this._appliedCorner!==this._currentCorner&&(e.style.removeProperty(`left`),e.style.removeProperty(`right`),e.style.removeProperty(`top`),e.style.removeProperty(`bottom`),this._appliedCorner=this._currentCorner);let{x:t,y:n}=this._position;this._currentCorner.includes(`right`)?e.style.right=`${t}px`:e.style.left=`${t}px`,this._currentCorner.includes(`bottom`)?e.style.bottom=`${n+a.n.bottomOffset}px`:e.style.top=`${n}px`}static{this.VALID_CORNERS=new Set([`top-left`,`top-right`,`bottom-left`,`bottom-right`])}_loadPosition(){let e=_.loadPosition(this.id);e&&(this._position={x:e.x,y:e.y},g.VALID_CORNERS.has(e.anchor)&&(this._currentCorner=e.anchor))}_savePosition(){_.savePosition(this.id,{...this._position,anchor:this._currentCorner})}_validateBounds(){let e=this._containerRef.value;if(!e)return;let t=e.getBoundingClientRect();if(t.width===0)return;let n=window.innerWidth,r=window.innerHeight,i=this._currentCorner.includes(`right`),a=this._currentCorner.includes(`bottom`),o=i?n-this._position.x-t.width:this._position.x,s=a?r-this._position.y-t.height:this._position.y,c=Math.max(0,Math.min(o,n-t.width)),l=Math.max(0,Math.min(s,r-t.height));this._position={x:i?n-c-t.width:c,y:a?r-l-t.height:l},this._applyContainerPosition()}_reorientToNearestCorner(e=!1){if(this.freePosition){this._savePosition();let e=this._containerRef.value?.getBoundingClientRect();e&&_.updateBounds(this.id,{left:e.left,top:e.top,width:e.width,height:e.height});return}let t=this._containerRef.value;if(!t)return;let i=t.getBoundingClientRect(),a=this._currentCorner.includes(`bottom`),o=i.left+i.width/2,c=a?i.bottom-24:i.top+24,l=o>window.innerWidth/2?`right`:`left`,u=`${c>window.innerHeight/2?`bottom`:`top`}-${l}`;if(this._currentCorner=u,this._position={x:16,y:16},this._applyContainerPosition(),this.open||(t.style.clipPath=this.closedClipPath),e||r.t.value){this._savePosition();let e=t.getBoundingClientRect();_.updateBounds(this.id,{left:e.left,top:e.top,width:e.width,height:e.height});return}let d=t.getBoundingClientRect(),f=i.left-d.left,p=i.top-d.top;t.style.translate=`${f}px ${p}px`;let m=[{translate:`${f}px ${p}px`},{translate:`0px 0px`}];(0,s.from)(t.animate(m,{duration:n.d.duration,easing:n.d.easingFallback,fill:`forwards`}).finished).pipe((0,s.take)(1),(0,s.tap)(()=>{t.isConnected&&(t.style.translate=``);let e=t.getBoundingClientRect();_.updateBounds(this.id,{left:e.left,top:e.top,width:e.width,height:e.height})}),(0,s.catchError)(()=>s.EMPTY),(0,s.takeUntil)(this.disconnecting)).subscribe(),this._savePosition()}_drag$(){return new s.Observable(()=>{let e=this._headRef.value,t=this._containerRef.value;if(!e||!t)return;let n=!1,r=(0,s.fromEvent)(e,`pointerdown`).pipe((0,s.filter)(e=>e.button===0),(0,s.filter)(e=>{let t=e.target.tagName?.toLowerCase();return![`input`,`textarea`,`select`,`button`].includes(t)&&!e.target.closest(`schmancy-input, schmancy-icon-button, button, a`)}),(0,s.tap)(e=>{e.preventDefault(),e.stopPropagation()})).pipe((0,s.map)(e=>{let r=t.getBoundingClientRect(),i=this._currentCorner.includes(`bottom`),a=this.open;return n=!1,{startX:e.clientX,startY:e.clientY,offsetX:e.clientX-r.left,offsetY:e.clientY-r.top,rect:r,vw:window.innerWidth,vh:window.innerHeight,isBottom:i,wasOpen:a,pointerId:e.pointerId}}),(0,s.switchMap)(({startX:e,startY:r,offsetX:i,offsetY:a,rect:o,vw:c,vh:l,isBottom:u,wasOpen:d,pointerId:f})=>{let p=(0,s.fromEvent)(window,`pointermove`).pipe((0,s.filter)(e=>e.pointerId===f),(0,s.auditTime)(0,s.animationFrameScheduler),(0,s.map)(e=>({clientX:e.clientX,clientY:e.clientY}))),m=(0,s.fromEvent)(window,`pointerup`).pipe((0,s.filter)(e=>e.pointerId===f));return p.pipe((0,s.tap)(({clientX:s,clientY:f})=>{let p=s-e,m=f-r;if(Math.sqrt(p*p+m*m)>5&&!n&&(n=!0,this._applyDragVisuals(!0),d)){this.open=!1,t.style.clipPath=this.closedClipPath,t.style.overflow=`hidden`;let e=this._bodyRef.value;e&&(e.inert=!0,e.style.visibility=`hidden`)}if(!n)return;let h=Math.max(0,Math.min(s-i,c-o.width)),g=u?y-o.height:0,_=u?l-o.height:l-y,v=Math.max(g,Math.min(f-a,_));this._position={x:this._currentCorner.includes(`right`)?c-h-o.width:h,y:u?l-v-o.height:v},this._applyContainerPosition()}),(0,s.takeUntil)(m),(0,s.finalize)(()=>{n?(this._reorientToNearestCorner(),this._applyDragVisuals(!1),n=!1):(n=!1,this.toggle())}))})).subscribe();return()=>r.unsubscribe()})}connectedCallback(){super.connectedCallback(),(0,s.from)(this.updateComplete).pipe((0,s.take)(1),(0,s.tap)(()=>{this._currentCorner=this.corner,this._loadPosition(),this._applyContainerPosition(),this._initDOMState();let e=this._containerRef.value;if(e){let t=e.getBoundingClientRect(),n={left:t.left,top:t.top,width:t.width,height:t.height};_.register(this.id,n,this.freePosition?`free`:this._currentCorner)}}),(0,s.switchMap)(()=>(0,s.merge)(this._drag$(),_.selectWindow(this.id).pipe((0,s.tap)(e=>{if(!e)return;let t=this._containerRef.value;t&&(t.style.zIndex=String(e.zIndex))})),_.selectFocused().pipe((0,s.tap)(e=>{this._focused=e===this.id})))),(0,s.takeUntil)(this.disconnecting)).subscribe(),(0,s.merge)((0,s.fromEvent)(window,`resize`).pipe((0,s.auditTime)(0,s.animationFrameScheduler),(0,s.tap)(()=>this._validateBounds())),a.n.bottomOffset$.pipe((0,s.tap)(()=>this._applyContainerPosition()))).pipe((0,s.takeUntil)(this.disconnecting)).subscribe()}disconnectedCallback(){super.disconnectedCallback(),_.unregister(this.id)}_initDOMState(){let e=this._containerRef.value,t=this._bodyRef.value;e&&(this._applyContainerPosition(),this.open?(this._hasOpened=!0,e.style.overflow=``,t&&(t.inert=!1,t.style.visibility=`visible`)):(e.style.clipPath=this.closedClipPath,e.style.overflow=`hidden`,t&&(t.inert=!0,t.style.visibility=`hidden`)))}_animateOpen(){let e=this._containerRef.value,t=this._bodyRef.value;if(!e)return;this._hasOpened=!0,this.open=!0;let i=e.getBoundingClientRect(),a={left:i.left,top:this.isBottomCorner?i.top-400:i.top,width:i.width,height:448},o=_.findOverlaps(a,this.id);if(o.length>0){let e=v(a,o,{width:window.innerWidth,height:window.innerHeight});if(Math.abs(e.left-a.left)>10||Math.abs(e.top-a.top)>10){let t=this._currentCorner.includes(`right`),n=this._currentCorner.includes(`bottom`);this._position={x:t?window.innerWidth-e.left-e.width:e.left,y:n?window.innerHeight-e.top-e.height:e.top},this._applyContainerPosition()}}if(t&&(t.style.visibility=`visible`,t.inert=!1),r.t.value)return e.style.clipPath=``,e.style.overflow=``,void this.dispatchScopedEvent(`window-toggle`,{state:`expanded`});this._currentAnimation?.cancel(),e.style.overflow=`hidden`,e.style.willChange=`opacity`;let c=[{clipPath:this.closedClipPath,opacity:.95},{clipPath:this.openClipPath,opacity:1}],l=e.animate(c,{duration:n.f.duration,easing:n.f.easingFallback,fill:`forwards`});this._currentAnimation=l,(0,s.from)(l.finished).pipe((0,s.take)(1),(0,s.tap)(()=>{e.isConnected&&(e.style.clipPath=``,e.style.overflow=``,e.style.willChange=``)}),(0,s.catchError)(()=>s.EMPTY),(0,s.takeUntil)(this.disconnecting)).subscribe(),this.dispatchScopedEvent(`window-toggle`,{state:`expanded`})}_animateClose(){let e=this._containerRef.value;if(!e)return;if(r.t.value){e.style.clipPath=this.closedClipPath,e.style.overflow=`hidden`,this.open=!1;let t=this._bodyRef.value;t&&(t.inert=!0,t.style.visibility=`hidden`),this.dispatchScopedEvent(`window-toggle`,{state:`collapsed`});return}this._currentAnimation?.cancel(),e.style.overflow=`hidden`,e.style.willChange=`opacity`;let t=[{clipPath:this.openClipPath,opacity:1},{clipPath:this.closedClipPath,opacity:.95}],i=e.animate(t,{duration:Math.round(.7*n.f.duration),easing:`cubic-bezier(0.4, 0, 0.8, 0.15)`,fill:`forwards`});this._currentAnimation=i,(0,s.from)(i.finished).pipe((0,s.take)(1),(0,s.tap)(()=>{this.open=!1,e.style.willChange=``;let t=this._bodyRef.value;t&&(t.inert=!0,t.style.visibility=`hidden`)}),(0,s.catchError)(()=>s.EMPTY),(0,s.takeUntil)(this.disconnecting)).subscribe(),this.dispatchScopedEvent(`window-toggle`,{state:`collapsed`})}_applyDragVisuals(e){let t=this._headRef.value,n=this._containerRef.value;t&&(t.classList.toggle(`cursor-grabbing`,e),t.classList.toggle(`cursor-move`,!e)),n&&(n.style.opacity=e?`0.95`:``)}toggle(){this.open?this._animateClose():this._animateOpen()}expand(){this.open||this._animateOpen()}close(){this.open&&this._animateClose()}render(){let e=this._currentCorner.startsWith(`bottom`),t=(0,c.classMap)({fixed:!0,flex:!0,"flex-col":e,"flex-col-reverse":!e,"z-1000":!0,"ring-1":!this._focused,"ring-2":this._focused,"ring-primary-default/30":this._focused,"ring-primary-default/15":this.open&&!this._focused,"rounded-2xl":this.open,"ring-outline-variant/40":!this.open&&!this._focused,"rounded-[22px]":!this.open,"overflow-hidden":!0}),n=(0,l.styleMap)({width:this.panelWidth,"max-height":`calc(100vh - 32px)`,"pointer-events":`none`}),r=(0,l.styleMap)({"pointer-events":this.open?`auto`:`none`}),a=(0,c.classMap)({"h-full":!0,"px-3":!0,flex:!0,"items-center":!0,"gap-2":!0,"select-none":!0,"cursor-move":!0});return d.html`
11
+ <schmancy-surface
12
+ ${(0,f.ref)(this._containerRef)}
13
+ type="glass"
14
+ .elevation=${this.elevation}
15
+ class=${t}
16
+ style=${n}
17
+ aria-expanded=${this.open}
18
+ @pointerdown=${this._handleFocus}
19
+ >
20
+ <!-- Details section (visually above summary for bottom corners) -->
21
+ <section
22
+ ${(0,f.ref)(this._bodyRef)}
23
+ class="flex-1 min-h-0 overflow-hidden flex flex-col"
24
+ style=${r}
25
+ role="region"
26
+ aria-label="Expandable content"
27
+ >
28
+ ${this._hasOpened?d.html`<slot name="details"></slot>`:d.nothing}
29
+ </section>
30
+
31
+ <!-- Summary section -- always interactive, always visible -->
32
+ <section
33
+ class="shrink-0 bg-surface-lowest"
34
+ style=${(0,l.styleMap)({"pointer-events":`auto`,height:`48px`})}
35
+ >
36
+ <div
37
+ ${(0,f.ref)(this._headRef)}
38
+ ${i.t({radius:200,intensity:.1})}
39
+ class=${a}
40
+ role="button"
41
+ tabindex="0"
42
+ title="Drag to move, click to expand"
43
+ aria-label="${this.open?`Collapse window`:`Expand window`}"
44
+ @keydown=${this._handleHeadKeydown}
45
+ >
46
+ <div class="flex-1 min-w-0">
47
+ <slot></slot>
48
+ </div>
49
+ <svg
50
+ width="16" height="16" viewBox="0 0 24 24" fill="none"
51
+ class="shrink-0 text-surface-on/40 transition-transform duration-200 ${this.open?`rotate-180`:``}"
52
+ aria-hidden="true"
53
+ >
54
+ <path d="M6 9L12 15L18 9" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
55
+ </svg>
56
+ </div>
57
+ </section>
58
+ </schmancy-surface>
59
+ `}};t.t([(0,u.property)({type:String})],b.prototype,`id`,void 0),t.t([(0,u.property)({type:String})],b.prototype,`expandedWidth`,void 0),t.t([(0,u.property)({type:String})],b.prototype,`expandedHeight`,void 0),t.t([(0,u.property)({type:Boolean,reflect:!0})],b.prototype,`lowered`,void 0),t.t([(0,u.property)({type:String})],b.prototype,`corner`,void 0),t.t([(0,u.property)({type:Boolean})],b.prototype,`resizable`,void 0),t.t([(0,u.property)({type:Boolean})],b.prototype,`freePosition`,void 0),t.t([(0,u.property)({type:String,reflect:!0})],b.prototype,`visualState`,void 0),t.t([(0,u.property)({type:Number})],b.prototype,`minWidth`,void 0),t.t([(0,u.property)({type:Number})],b.prototype,`minHeight`,void 0),t.t([(0,u.property)({type:Boolean,reflect:!0})],b.prototype,`open`,void 0),t.t([(0,u.state)()],b.prototype,`_hasOpened`,void 0),t.t([(0,u.state)()],b.prototype,`_focused`,void 0),t.t([(0,u.state)()],b.prototype,`_currentCorner`,void 0);var x=b=g=t.t([(0,u.customElement)(`schmancy-window`)],b);Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return x}});
@@ -0,0 +1 @@
1
+ {"version":3,"file":"window-DtUOWiAj.cjs","names":[],"sources":["../src/window/window-manager.ts","../src/window/window-position.ts","../src/window/window.ts"],"sourcesContent":["/**\n * Window Manager — singleton service for multi-window coordination.\n *\n * Tracks all schmancy-window instances: positions, z-indices, focus, visual states.\n * Components register on connectedCallback, unregister on disconnectedCallback.\n * Focus changes, position updates, and overlap queries all flow through here.\n *\n * Follows the ThemeService singleton pattern (theme/theme.service.ts).\n *\n * Example:\n * windowManager.register('chat-1', bounds, 'bottom-right')\n * windowManager.focus('chat-1') // bumps z-index, updates focusedId\n * const overlaps = windowManager.findOverlaps(projectedBounds, 'chat-1')\n */\n\nimport { BehaviorSubject, Observable, distinctUntilChanged, map } from 'rxjs'\nimport { overlayStack } from '../utils/overlay-stack.js'\nimport type { WindowBounds, WindowRecord, WindowRegistryState, SnapTarget } from './window-registry.js'\n\nconst STORAGE_PREFIX = 'schmancy-window-'\nconst LEGACY_STORAGE_PREFIX = 'schmancy-float-'\n\nclass WindowManagerService {\n\tprivate static instance: WindowManagerService\n\n\tprivate readonly _state$ = new BehaviorSubject<WindowRegistryState>({\n\t\twindows: new Map(),\n\t\tfocusedId: null,\n\t\tstackOrder: [],\n\t})\n\n\treadonly state$ = this._state$.asObservable()\n\n\tprivate constructor() {}\n\n\tstatic getInstance(): WindowManagerService {\n\t\tif (!WindowManagerService.instance) {\n\t\t\tWindowManagerService.instance = new WindowManagerService()\n\t\t}\n\t\treturn WindowManagerService.instance\n\t}\n\n\t// ── Synchronous accessors ──────────────────────────────────────────\n\n\tget windows(): Map<string, WindowRecord> {\n\t\treturn this._state$.value.windows\n\t}\n\n\tget focusedId(): string | null {\n\t\treturn this._state$.value.focusedId\n\t}\n\n\t// ── Registration ───────────────────────────────────────────────────\n\n\tregister(id: string, initialBounds: WindowBounds, snapTarget: SnapTarget): void {\n\t\tconst state = this._state$.value\n\t\tif (state.windows.has(id)) return\n\n\t\tconst zIndex = overlayStack.assignZIndex(id)\n\t\tconst record: WindowRecord = {\n\t\t\tid,\n\t\t\tbounds: initialBounds,\n\t\t\tvisualState: 'normal',\n\t\t\tzIndex,\n\t\t\topen: false,\n\t\t\tsnapTarget,\n\t\t}\n\n\t\tconst windows = new Map(state.windows)\n\t\twindows.set(id, record)\n\t\tconst stackOrder = overlayStack.getStackOrder()\n\n\t\tthis._state$.next({ ...state, windows, stackOrder })\n\t}\n\n\tunregister(id: string): void {\n\t\tconst state = this._state$.value\n\t\tif (!state.windows.has(id)) return\n\n\t\toverlayStack.releaseId(id)\n\t\tconst windows = new Map(state.windows)\n\t\twindows.delete(id)\n\t\tconst stackOrder = overlayStack.getStackOrder()\n\t\tconst focusedId = state.focusedId === id ? null : state.focusedId\n\n\t\tthis._state$.next({ ...state, windows, stackOrder, focusedId })\n\t}\n\n\t// ── State mutations ────────────────────────────────────────────────\n\n\tupdateBounds(id: string, bounds: WindowBounds): void {\n\t\tthis._updateRecord(id, { bounds })\n\t}\n\n\tupdateVisualState(id: string, visualState: WindowRecord['visualState']): void {\n\t\tthis._updateRecord(id, { visualState })\n\t}\n\n\tupdateOpen(id: string, open: boolean): void {\n\t\tthis._updateRecord(id, { open })\n\t}\n\n\tfocus(id: string): void {\n\t\tconst state = this._state$.value\n\t\tif (!state.windows.has(id)) return\n\t\tif (state.focusedId === id) return\n\n\t\tconst zIndex = overlayStack.bringToFront(id)\n\t\tconst windows = new Map(state.windows)\n\t\tconst record = windows.get(id)\n\t\tif (record) {\n\t\t\twindows.set(id, { ...record, zIndex })\n\t\t}\n\t\tconst stackOrder = overlayStack.getStackOrder()\n\n\t\tthis._state$.next({ ...state, windows, stackOrder, focusedId: id })\n\t}\n\n\t// ── Queries ────────────────────────────────────────────────────────\n\n\tfindOverlaps(bounds: WindowBounds, excludeId: string): WindowRecord[] {\n\t\tconst result: WindowRecord[] = []\n\t\tfor (const [id, record] of this._state$.value.windows) {\n\t\t\tif (id === excludeId) continue\n\t\t\tif (rectsOverlap(bounds, record.bounds)) {\n\t\t\t\tresult.push(record)\n\t\t\t}\n\t\t}\n\t\treturn result\n\t}\n\n\tgetNeighbors(id: string): WindowRecord[] {\n\t\tconst result: WindowRecord[] = []\n\t\tfor (const [otherId, record] of this._state$.value.windows) {\n\t\t\tif (otherId !== id) result.push(record)\n\t\t}\n\t\treturn result\n\t}\n\n\t// ── Selectors ──────────────────────────────────────────────────────\n\n\tselectWindow(id: string): Observable<WindowRecord | undefined> {\n\t\treturn this._state$.pipe(\n\t\t\tmap(state => state.windows.get(id)),\n\t\t\tdistinctUntilChanged(),\n\t\t)\n\t}\n\n\tselectFocused(): Observable<string | null> {\n\t\treturn this._state$.pipe(\n\t\t\tmap(state => state.focusedId),\n\t\t\tdistinctUntilChanged(),\n\t\t)\n\t}\n\n\t// ── Persistence ────────────────────────────────────────────────────\n\n\tloadPosition(id: string): { x: number; y: number; anchor: string } | null {\n\t\ttry {\n\t\t\t// Try new key first, fall back to legacy\n\t\t\tconst raw = localStorage.getItem(STORAGE_PREFIX + id) ?? localStorage.getItem(LEGACY_STORAGE_PREFIX + id)\n\t\t\tif (!raw) return null\n\t\t\treturn JSON.parse(raw) as { x: number; y: number; anchor: string }\n\t\t} catch {\n\t\t\treturn null\n\t\t}\n\t}\n\n\tsavePosition(id: string, data: { x: number; y: number; anchor: string }): void {\n\t\ttry {\n\t\t\tlocalStorage.setItem(STORAGE_PREFIX + id, JSON.stringify(data))\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\tclearPosition(id: string): void {\n\t\ttry {\n\t\t\tlocalStorage.removeItem(STORAGE_PREFIX + id)\n\t\t\tlocalStorage.removeItem(LEGACY_STORAGE_PREFIX + id)\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\t// ── Internal ───────────────────────────────────────────────────────\n\n\tprivate _updateRecord(id: string, updates: Partial<WindowRecord>): void {\n\t\tconst state = this._state$.value\n\t\tconst record = state.windows.get(id)\n\t\tif (!record) return\n\n\t\tconst windows = new Map(state.windows)\n\t\twindows.set(id, { ...record, ...updates })\n\t\tthis._state$.next({ ...state, windows })\n\t}\n}\n\n/** Simple rect overlap check (inline — no circular import with window-position) */\nfunction rectsOverlap(a: WindowBounds, b: WindowBounds): boolean {\n\treturn !(a.left >= b.left + b.width || a.left + a.width <= b.left || a.top >= b.top + b.height || a.top + a.height <= b.top)\n}\n\nexport const windowManager = WindowManagerService.getInstance()\n","/**\n * Window Position — pure functions for overlap resolution, cascade, and snapping.\n *\n * All functions are stateless: they take window bounds and viewport dimensions,\n * return new bounds. No side effects, no DOM access, no subscriptions.\n *\n * Example:\n * const projected = { left: 100, top: 400, width: 360, height: 500 }\n * const neighbors = windowManager.findOverlaps(projected, 'my-id')\n * const resolved = resolveOverlap(projected, neighbors, { width: 1440, height: 900 })\n * // → { left: 144, top: 444, width: 360, height: 500 } (cascaded away from conflict)\n */\n\nimport type { WindowBounds, WindowRecord } from './window-registry.js'\n\nconst HEAD_HEIGHT = 44\nconst CASCADE_OFFSET = HEAD_HEIGHT\nconst MAX_CASCADE_ATTEMPTS = 10\n\n/** Check if two rectangles overlap (edges touching does NOT count as overlap) */\nexport function rectsOverlap(a: WindowBounds, b: WindowBounds): boolean {\n\treturn !(a.left >= b.left + b.width || a.left + a.width <= b.left || a.top >= b.top + b.height || a.top + a.height <= b.top)\n}\n\n/**\n * Resolve overlap by cascading diagonally until no conflict.\n * Shifts by (HEAD_HEIGHT, HEAD_HEIGHT) per attempt, clamped to viewport.\n */\nexport function resolveOverlap(\n\tcandidate: WindowBounds,\n\texisting: WindowRecord[],\n\tviewport: { width: number; height: number },\n): WindowBounds {\n\tconst bounds = { ...candidate }\n\n\tfor (let attempt = 0; attempt < MAX_CASCADE_ATTEMPTS; attempt++) {\n\t\tconst hasOverlap = existing.some(w => rectsOverlap(bounds, w.bounds))\n\t\tif (!hasOverlap) break\n\n\t\tbounds.left += CASCADE_OFFSET\n\t\tbounds.top += CASCADE_OFFSET\n\t}\n\n\treturn clampToViewport(bounds, viewport)\n}\n\n/**\n * Clamp bounds so the window stays fully within the viewport.\n */\nexport function clampToViewport(\n\tbounds: WindowBounds,\n\tviewport: { width: number; height: number },\n): WindowBounds {\n\treturn {\n\t\twidth: bounds.width,\n\t\theight: bounds.height,\n\t\tleft: Math.max(0, Math.min(bounds.left, viewport.width - bounds.width)),\n\t\ttop: Math.max(0, Math.min(bounds.top, viewport.height - bounds.height)),\n\t}\n}\n","import { SchmancyElement } from '@mixins/index'\nimport { css, html, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport {\n\tanimationFrameScheduler,\n\tauditTime,\n\tcatchError,\n\tEMPTY,\n\tfilter,\n\tfinalize,\n\tfrom,\n\tfromEvent,\n\tmap,\n\tmerge,\n\tObservable,\n\tswitchMap,\n\ttake,\n\ttakeUntil,\n\ttap,\n} from 'rxjs'\nimport { SPRING_SMOOTH, SPRING_SNAPPY } from '../utils/animation.js'\nimport { cursorGlow } from '../directives/cursor-glow'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport { theme } from '../theme/theme.service.js'\nimport type { SnapCorner, WindowBounds, WindowVisualState } from './window-registry.js'\nimport { windowManager } from './window-manager.js'\nimport { resolveOverlap } from './window-position.js'\n\nconst HEAD_HEIGHT = 48\nconst DRAG_THRESHOLD = 5\n\ninterface Position {\n\tx: number\n\ty: number\n}\n\n@customElement('schmancy-window')\nexport default class SchmancyWindow extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: contents;\n\t\tposition: relative;\n\t\tz-index: 1000;\n\t}\n\t:host([hidden]) {\n\t\tdisplay: none !important;\n\t}\n`]\n\n\t@property({ type: String }) id: string = 'default'\n\t/** Override the expanded panel width (e.g. '320px', '24rem'). Defaults to responsive sizing. */\n\t@property({ type: String }) expandedWidth?: string\n\t/** Override the expanded panel height (e.g. '400px', '50vh'). */\n\t@property({ type: String }) expandedHeight?: string\n\t/** When true, uses a lower elevation shadow in the collapsed state. */\n\t@property({ type: Boolean, reflect: true }) lowered: boolean = false\n\t/** Corner the window is anchored to. */\n\t@property({ type: String }) corner: SnapCorner = 'bottom-right'\n\t/** When true, window can be resized by the user. */\n\t@property({ type: Boolean }) resizable = false\n\t/** When true, window stays at its dragged position instead of snapping to a corner. */\n\t@property({ type: Boolean }) freePosition = false\n\t/** Visual state of the window (minimized, normal, maximized). */\n\t@property({ type: String, reflect: true }) visualState: WindowVisualState = 'normal'\n\t/** Minimum width in pixels. */\n\t@property({ type: Number }) minWidth = 280\n\t/** Minimum height in pixels. */\n\t@property({ type: Number }) minHeight = 200\n\n\t/** Whether the body is expanded. */\n\t@property({ type: Boolean, reflect: true }) open = false\n\n\tprivate _currentAnimation?: Animation\n\n\t/** Lazy rendering: body content not in DOM until first expand. */\n\t@state() private _hasOpened = false\n\t/** Whether this window is the focused window in the manager — drives visual ring */\n\t@state() private _focused = false\n\n\t// Internal position -- plain fields, updated directly during drag\n\tprivate _position: Position = { x: 16, y: 16 }\n\t@state() private _currentCorner: SnapCorner = 'bottom-right'\n\n\t// Track applied corner to avoid unnecessary style.removeProperty calls during drag\n\tprivate _appliedCorner: string = ''\n\n\t// Refs\n\tprivate _containerRef = createRef<HTMLElement>()\n\tprivate _bodyRef = createRef<HTMLElement>()\n\tprivate _headRef = createRef<HTMLElement>()\n\n\t// ============================================\n\t// COMPUTED\n\t// ============================================\n\n\tprivate get panelWidth(): string {\n\t\treturn this.expandedWidth ?? 'min(360px, calc(100vw - 32px))'\n\t}\n\n\tprivate get isBottomCorner(): boolean {\n\t\treturn this._currentCorner.startsWith('bottom')\n\t}\n\n\tprivate get closedClipPath(): string {\n\t\treturn this.isBottomCorner\n\t\t\t? `inset(calc(100% - ${HEAD_HEIGHT}px) 0px 0px 0px round 22px)`\n\t\t\t: `inset(0px 0px calc(100% - ${HEAD_HEIGHT}px) 0px round 22px)`\n\t}\n\n\tprivate get openClipPath(): string {\n\t\treturn 'inset(0px 0px 0px 0px round 12px)'\n\t}\n\n\tprivate get elevation(): 0 | 1 | 2 | 3 | 4 | 5 {\n\t\tif (this.open) return 4\n\t\treturn this.lowered ? 1 : 3\n\t}\n\n\t// ============================================\n\t// POSITION MANAGEMENT\n\t// ============================================\n\n\tprivate _applyContainerPosition() {\n\t\tconst container = this._containerRef.value\n\t\tif (!container) return\n\t\t// Only clear position properties when corner changes (avoids 4 style invalidations per drag frame)\n\t\tif (this._appliedCorner !== this._currentCorner) {\n\t\t\tcontainer.style.removeProperty('left')\n\t\t\tcontainer.style.removeProperty('right')\n\t\t\tcontainer.style.removeProperty('top')\n\t\t\tcontainer.style.removeProperty('bottom')\n\t\t\tthis._appliedCorner = this._currentCorner\n\t\t}\n\t\tconst { x, y } = this._position\n\t\tif (this._currentCorner.includes('right')) {\n\t\t\tcontainer.style.right = `${x}px`\n\t\t} else {\n\t\t\tcontainer.style.left = `${x}px`\n\t\t}\n\t\tif (this._currentCorner.includes('bottom')) {\n\t\t\tcontainer.style.bottom = `${y + theme.bottomOffset}px`\n\t\t} else {\n\t\t\tcontainer.style.top = `${y}px`\n\t\t}\n\t}\n\n\tprivate static readonly VALID_CORNERS = new Set<string>(['top-left', 'top-right', 'bottom-left', 'bottom-right'])\n\n\tprivate _loadPosition() {\n\t\tconst saved = windowManager.loadPosition(this.id)\n\t\tif (saved) {\n\t\t\tthis._position = { x: saved.x, y: saved.y }\n\t\t\tif (SchmancyWindow.VALID_CORNERS.has(saved.anchor)) {\n\t\t\t\tthis._currentCorner = saved.anchor as SnapCorner\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _savePosition() {\n\t\twindowManager.savePosition(this.id, { ...this._position, anchor: this._currentCorner })\n\t}\n\n\tprivate _validateBounds() {\n\t\tconst container = this._containerRef.value\n\t\tif (!container) return\n\t\tconst rect = container.getBoundingClientRect()\n\t\tif (rect.width === 0) return\n\t\tconst vw = window.innerWidth\n\t\tconst vh = window.innerHeight\n\t\tconst isRight = this._currentCorner.includes('right')\n\t\tconst isBottom = this._currentCorner.includes('bottom')\n\t\tconst actualLeft = isRight ? vw - this._position.x - rect.width : this._position.x\n\t\tconst actualTop = isBottom ? vh - this._position.y - rect.height : this._position.y\n\t\tconst newLeft = Math.max(0, Math.min(actualLeft, vw - rect.width))\n\t\tconst newTop = Math.max(0, Math.min(actualTop, vh - rect.height))\n\t\tthis._position = {\n\t\t\tx: isRight ? vw - newLeft - rect.width : newLeft,\n\t\t\ty: isBottom ? vh - newTop - rect.height : newTop,\n\t\t}\n\t\tthis._applyContainerPosition()\n\t}\n\n\t// ============================================\n\t// CORNER SNAPPING\n\t// ============================================\n\n\tprivate _reorientToNearestCorner(skipAnimation = false): void {\n\t\t// Free position mode: skip corner snapping\n\t\tif (this.freePosition) {\n\t\t\tthis._savePosition()\n\t\t\tconst rect = this._containerRef.value?.getBoundingClientRect()\n\t\t\tif (rect) {\n\t\t\t\twindowManager.updateBounds(this.id, { left: rect.left, top: rect.top, width: rect.width, height: rect.height })\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst container = this._containerRef.value\n\t\tif (!container) return\n\n\t\t// F -- record current screen position before DOM mutation\n\t\tconst rect = container.getBoundingClientRect()\n\n\t\t// L -- calculate nearest corner using head visual center\n\t\tconst currentIsBottom = this._currentCorner.includes('bottom')\n\t\tconst headCenterX = rect.left + rect.width / 2\n\t\tconst headCenterY = currentIsBottom\n\t\t\t? rect.bottom - HEAD_HEIGHT / 2\n\t\t\t: rect.top + HEAD_HEIGHT / 2\n\t\tconst side = headCenterX > window.innerWidth / 2 ? 'right' : 'left'\n\t\tconst vert = headCenterY > window.innerHeight / 2 ? 'bottom' : 'top'\n\t\tconst newCorner: SnapCorner = `${vert}-${side}` as SnapCorner\n\n\t\t// Snap corner and reset offset to standard edge gap\n\t\tthis._currentCorner = newCorner\n\t\tthis._position = { x: 16, y: 16 }\n\t\tthis._applyContainerPosition()\n\t\t// Sync clip-path to new corner\n\t\tif (!this.open) {\n\t\t\tcontainer.style.clipPath = this.closedClipPath\n\t\t}\n\n\t\tif (skipAnimation || reducedMotion$.value) {\n\t\t\tthis._savePosition()\n\t\t\tconst snapRect = container.getBoundingClientRect()\n\t\t\twindowManager.updateBounds(this.id, { left: snapRect.left, top: snapRect.top, width: snapRect.width, height: snapRect.height })\n\t\t\treturn\n\t\t}\n\n\t\t// I -- invert: shift element back to its original visual position\n\t\tconst newRect = container.getBoundingClientRect()\n\t\tconst dx = rect.left - newRect.left\n\t\tconst dy = rect.top - newRect.top\n\t\tcontainer.style.translate = `${dx}px ${dy}px`\n\n\t\t// P -- play: animate from the inverse offset to natural resting position\n\t\tconst flipKeyframes: Keyframe[] = [{ translate: `${dx}px ${dy}px` }, { translate: '0px 0px' }]\n\t\tconst anim = container.animate(\n\t\t\tflipKeyframes,\n\t\t\t{\n\t\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t)\n\t\tfrom(anim.finished).pipe(\n\t\t\ttake(1),\n\t\t\ttap(() => {\n\t\t\t\tif (container.isConnected) container.style.translate = ''\n\t\t\t\t// Report final resting bounds after animation completes\n\t\t\t\tconst finalRect = container.getBoundingClientRect()\n\t\t\t\twindowManager.updateBounds(this.id, { left: finalRect.left, top: finalRect.top, width: finalRect.width, height: finalRect.height })\n\t\t\t}),\n\t\t\tcatchError(() => EMPTY),\n\t\t\ttakeUntil(this.disconnecting),\n\t\t).subscribe()\n\n\t\tthis._savePosition()\n\t}\n\n\t// ============================================\n\t// DRAG PIPELINE\n\t// ============================================\n\n\tprivate _drag$(): Observable<never> {\n\t\treturn new Observable(() => {\n\t\t\tconst head = this._headRef.value\n\t\t\tconst container = this._containerRef.value\n\t\t\tif (!head || !container) return\n\n\t\t\tlet didDrag = false\n\n\t\t\tconst sub = fromEvent<PointerEvent>(head, 'pointerdown').pipe(\n\t\t\t\tfilter(e => e.button === 0),\n\t\t\t\tfilter(e => {\n\t\t\t\t\tconst tag = (e.target as HTMLElement).tagName?.toLowerCase()\n\t\t\t\t\treturn !['input', 'textarea', 'select', 'button'].includes(tag)\n\t\t\t\t\t\t&& !(e.target as HTMLElement).closest('schmancy-input, schmancy-icon-button, button, a')\n\t\t\t\t}),\n\t\t\t\ttap(e => {\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\te.stopPropagation()\n\t\t\t\t}),\n\t\t\t)\n\t\t\t\t.pipe(\n\t\t\t\t\tmap(e => {\n\t\t\t\t\t\tconst rect = container.getBoundingClientRect()\n\t\t\t\t\t\tconst isBottom = this._currentCorner.includes('bottom')\n\t\t\t\t\t\tconst wasOpen = this.open\n\t\t\t\t\t\tdidDrag = false\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstartX: e.clientX,\n\t\t\t\t\t\t\tstartY: e.clientY,\n\t\t\t\t\t\t\toffsetX: e.clientX - rect.left,\n\t\t\t\t\t\t\toffsetY: e.clientY - rect.top,\n\t\t\t\t\t\t\trect,\n\t\t\t\t\t\t\tvw: window.innerWidth,\n\t\t\t\t\t\t\tvh: window.innerHeight,\n\t\t\t\t\t\t\tisBottom,\n\t\t\t\t\t\t\twasOpen,\n\t\t\t\t\t\t\tpointerId: e.pointerId,\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t\tswitchMap(({ startX, startY, offsetX, offsetY, rect, vw, vh, isBottom, wasOpen, pointerId }) => {\n\t\t\t\t\t\tconst move$ = fromEvent<PointerEvent>(window, 'pointermove').pipe(\n\t\t\t\t\t\t\tfilter(e => e.pointerId === pointerId),\n\t\t\t\t\t\t\tauditTime(0, animationFrameScheduler),\n\t\t\t\t\t\t\tmap(e => ({ clientX: e.clientX, clientY: e.clientY })),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst end$ = fromEvent<PointerEvent>(window, 'pointerup').pipe(\n\t\t\t\t\t\t\tfilter(e => e.pointerId === pointerId),\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\treturn move$.pipe(\n\t\t\t\t\t\t\ttap(({ clientX, clientY }) => {\n\t\t\t\t\t\t\t\tconst dx = clientX - startX\n\t\t\t\t\t\t\t\tconst dy = clientY - startY\n\t\t\t\t\t\t\t\tif (Math.sqrt(dx * dx + dy * dy) > DRAG_THRESHOLD && !didDrag) {\n\t\t\t\t\t\t\t\t\tdidDrag = true\n\t\t\t\t\t\t\t\t\tthis._applyDragVisuals(true)\n\t\t\t\t\t\t\t\t\t// Collapse on first confirmed drag move\n\t\t\t\t\t\t\t\t\tif (wasOpen) {\n\t\t\t\t\t\t\t\t\t\tthis.open = false\n\t\t\t\t\t\t\t\t\t\tcontainer.style.clipPath = this.closedClipPath\n\t\t\t\t\t\t\t\t\t\tcontainer.style.overflow = 'hidden'\n\t\t\t\t\t\t\t\t\t\tconst body = this._bodyRef.value\n\t\t\t\t\t\t\t\t\t\tif (body) {\n\t\t\t\t\t\t\t\t\t\t\tbody.inert = true\n\t\t\t\t\t\t\t\t\t\t\tbody.style.visibility = 'hidden'\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!didDrag) return\n\n\t\t\t\t\t\t\t\tconst left = Math.max(0, Math.min(clientX - offsetX, vw - rect.width))\n\t\t\t\t\t\t\t\tconst minTop = isBottom ? HEAD_HEIGHT - rect.height : 0\n\t\t\t\t\t\t\t\tconst maxTop = isBottom ? vh - rect.height : vh - HEAD_HEIGHT\n\t\t\t\t\t\t\t\tconst top = Math.max(minTop, Math.min(clientY - offsetY, maxTop))\n\n\t\t\t\t\t\t\t\tthis._position = {\n\t\t\t\t\t\t\t\t\tx: this._currentCorner.includes('right') ? vw - left - rect.width : left,\n\t\t\t\t\t\t\t\t\ty: isBottom ? vh - top - rect.height : top,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis._applyContainerPosition()\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(end$),\n\t\t\t\t\t\t\tfinalize(() => {\n\t\t\t\t\t\t\t\tif (didDrag) {\n\t\t\t\t\t\t\t\t\tthis._reorientToNearestCorner()\n\t\t\t\t\t\t\t\t\tthis._applyDragVisuals(false)\n\t\t\t\t\t\t\t\t\tdidDrag = false\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tdidDrag = false\n\t\t\t\t\t\t\t\t\tthis.toggle()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.subscribe()\n\n\t\t\treturn () => sub.unsubscribe()\n\t\t})\n\t}\n\n\t// ============================================\n\t// LIFECYCLE\n\t// ============================================\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Pipeline 1: DOM setup + manager registration + drag + z-index sync\n\t\tfrom(this.updateComplete).pipe(\n\t\t\ttake(1),\n\t\t\ttap(() => {\n\t\t\t\tthis._currentCorner = this.corner\n\t\t\t\tthis._loadPosition()\n\t\t\t\tthis._applyContainerPosition()\n\t\t\t\tthis._initDOMState()\n\t\t\t\t// Register with window manager\n\t\t\t\tconst container = this._containerRef.value\n\t\t\t\tif (container) {\n\t\t\t\t\tconst rect = container.getBoundingClientRect()\n\t\t\t\t\tconst bounds: WindowBounds = { left: rect.left, top: rect.top, width: rect.width, height: rect.height }\n\t\t\t\t\twindowManager.register(this.id, bounds, this.freePosition ? 'free' : this._currentCorner)\n\t\t\t\t}\n\t\t\t}),\n\t\t\tswitchMap(() => merge(\n\t\t\t\tthis._drag$(),\n\t\t\t\twindowManager.selectWindow(this.id).pipe(\n\t\t\t\t\ttap(record => {\n\t\t\t\t\t\tif (!record) return\n\t\t\t\t\t\tconst container = this._containerRef.value\n\t\t\t\t\t\tif (container) container.style.zIndex = String(record.zIndex)\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\twindowManager.selectFocused().pipe(\n\t\t\t\t\ttap(focusedId => {\n\t\t\t\t\t\tthis._focused = focusedId === this.id\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t)),\n\t\t\ttakeUntil(this.disconnecting),\n\t\t).subscribe()\n\n\n\t\t// Pipeline 3: Environment -- one subscription\n\t\tmerge(\n\t\t\tfromEvent(window, 'resize').pipe(\n\t\t\t\tauditTime(0, animationFrameScheduler),\n\t\t\t\ttap(() => this._validateBounds()),\n\t\t\t),\n\t\t\ttheme.bottomOffset$.pipe(\n\t\t\t\ttap(() => this._applyContainerPosition()),\n\t\t\t),\n\t\t).pipe(takeUntil(this.disconnecting)).subscribe()\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\twindowManager.unregister(this.id)\n\t}\n\n\tprivate _initDOMState() {\n\t\tconst container = this._containerRef.value\n\t\tconst body = this._bodyRef.value\n\t\tif (!container) return\n\n\t\tthis._applyContainerPosition()\n\n\t\tif (this.open) {\n\t\t\tthis._hasOpened = true\n\t\t\tcontainer.style.overflow = ''\n\t\t\tif (body) {\n\t\t\t\tbody.inert = false\n\t\t\t\tbody.style.visibility = 'visible'\n\t\t\t}\n\t\t} else {\n\t\t\tcontainer.style.clipPath = this.closedClipPath\n\t\t\tcontainer.style.overflow = 'hidden'\n\t\t\tif (body) {\n\t\t\t\tbody.inert = true\n\t\t\t\tbody.style.visibility = 'hidden'\n\t\t\t}\n\t\t}\n\t}\n\n\t// ============================================\n\t// ANIMATION\n\t// ============================================\n\n\tprivate _animateOpen() {\n\t\tconst container = this._containerRef.value\n\t\tconst body = this._bodyRef.value\n\t\tif (!container) return\n\n\t\tthis._hasOpened = true\n\t\tthis.open = true\n\n\t\t// Overlap avoidance\n\t\tconst rect = container.getBoundingClientRect()\n\t\tconst projectedBounds: WindowBounds = {\n\t\t\tleft: rect.left,\n\t\t\ttop: this.isBottomCorner ? rect.top - 400 : rect.top,\n\t\t\twidth: rect.width,\n\t\t\theight: 400 + HEAD_HEIGHT,\n\t\t}\n\t\tconst overlaps = windowManager.findOverlaps(projectedBounds, this.id)\n\t\tif (overlaps.length > 0) {\n\t\t\tconst resolved = resolveOverlap(projectedBounds, overlaps, { width: window.innerWidth, height: window.innerHeight })\n\t\t\tif (Math.abs(resolved.left - projectedBounds.left) > 10 || Math.abs(resolved.top - projectedBounds.top) > 10) {\n\t\t\t\tconst isRight = this._currentCorner.includes('right')\n\t\t\t\tconst isBottom = this._currentCorner.includes('bottom')\n\t\t\t\tthis._position = {\n\t\t\t\t\tx: isRight ? window.innerWidth - resolved.left - resolved.width : resolved.left,\n\t\t\t\t\ty: isBottom ? window.innerHeight - resolved.top - resolved.height : resolved.top,\n\t\t\t\t}\n\t\t\t\tthis._applyContainerPosition()\n\t\t\t}\n\t\t}\n\n\t\tif (body) {\n\t\t\tbody.style.visibility = 'visible'\n\t\t\tbody.inert = false\n\t\t}\n\n\t\tif (reducedMotion$.value) {\n\t\t\tcontainer.style.clipPath = ''\n\t\t\tcontainer.style.overflow = ''\n\t\t\tthis.dispatchScopedEvent('window-toggle', { state: 'expanded' })\n\t\t\treturn\n\t\t}\n\n\t\tthis._currentAnimation?.cancel()\n\t\tcontainer.style.overflow = 'hidden'\n\t\tcontainer.style.willChange = 'opacity'\n\t\tconst openKeyframes: Keyframe[] = [\n\t\t\t{ clipPath: this.closedClipPath, opacity: 0.95 },\n\t\t\t{ clipPath: this.openClipPath, opacity: 1 },\n\t\t]\n\t\tconst anim = container.animate(openKeyframes, {\n\t\t\tduration: SPRING_SNAPPY.duration,\n\t\t\teasing: SPRING_SNAPPY.easingFallback,\n\t\t\tfill: 'forwards',\n\t\t})\n\t\tthis._currentAnimation = anim\n\n\t\tfrom(anim.finished).pipe(\n\t\t\ttake(1),\n\t\t\ttap(() => {\n\t\t\t\tif (container.isConnected) {\n\t\t\t\t\tcontainer.style.clipPath = ''\n\t\t\t\t\tcontainer.style.overflow = ''\n\t\t\t\t\tcontainer.style.willChange = ''\n\t\t\t\t}\n\t\t\t}),\n\t\t\tcatchError(() => EMPTY),\n\t\t\ttakeUntil(this.disconnecting),\n\t\t).subscribe()\n\n\t\tthis.dispatchScopedEvent('window-toggle', { state: 'expanded' })\n\t}\n\n\tprivate _animateClose() {\n\t\tconst container = this._containerRef.value\n\t\tif (!container) return\n\n\t\tif (reducedMotion$.value) {\n\t\t\tcontainer.style.clipPath = this.closedClipPath\n\t\t\tcontainer.style.overflow = 'hidden'\n\t\t\tthis.open = false\n\t\t\tconst body = this._bodyRef.value\n\t\t\tif (body) { body.inert = true; body.style.visibility = 'hidden' }\n\t\t\tthis.dispatchScopedEvent('window-toggle', { state: 'collapsed' })\n\t\t\treturn\n\t\t}\n\n\t\tthis._currentAnimation?.cancel()\n\t\tcontainer.style.overflow = 'hidden'\n\t\tcontainer.style.willChange = 'opacity'\n\t\tconst closeKeyframes: Keyframe[] = [\n\t\t\t{ clipPath: this.openClipPath, opacity: 1 },\n\t\t\t{ clipPath: this.closedClipPath, opacity: 0.95 },\n\t\t]\n\t\tconst anim = container.animate(closeKeyframes, {\n\t\t\tduration: Math.round(SPRING_SNAPPY.duration * 0.7),\n\t\t\teasing: 'cubic-bezier(0.4, 0, 0.8, 0.15)',\n\t\t\tfill: 'forwards',\n\t\t})\n\t\tthis._currentAnimation = anim\n\n\t\tfrom(anim.finished).pipe(\n\t\t\ttake(1),\n\t\t\ttap(() => {\n\t\t\t\tthis.open = false\n\t\t\t\tcontainer.style.willChange = ''\n\t\t\t\tconst body = this._bodyRef.value\n\t\t\t\tif (body) { body.inert = true; body.style.visibility = 'hidden' }\n\t\t\t}),\n\t\t\tcatchError(() => EMPTY),\n\t\t\ttakeUntil(this.disconnecting),\n\t\t).subscribe()\n\n\t\tthis.dispatchScopedEvent('window-toggle', { state: 'collapsed' })\n\t}\n\n\t// ============================================\n\t// VISUAL STATE HELPERS\n\t// ============================================\n\n\t/** Apply drag visuals directly on DOM refs — avoids full Lit re-render for cursor + opacity */\n\tprivate _applyDragVisuals(dragging: boolean) {\n\t\tconst head = this._headRef.value\n\t\tconst container = this._containerRef.value\n\t\tif (head) {\n\t\t\thead.classList.toggle('cursor-grabbing', dragging)\n\t\t\thead.classList.toggle('cursor-move', !dragging)\n\t\t}\n\t\tif (container) {\n\t\t\tcontainer.style.opacity = dragging ? '0.95' : ''\n\t\t}\n\t}\n\n\tprivate _handleFocus = () => windowManager.focus(this.id)\n\n\tprivate _handleHeadKeydown = (e: KeyboardEvent) => {\n\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\te.preventDefault()\n\t\t\tthis.toggle()\n\t\t\treturn\n\t\t}\n\t\tif (e.key === 'ArrowUp' || e.key === 'ArrowDown' || e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n\t\t\te.preventDefault()\n\t\t\tconst step = e.shiftKey ? 20 : 5\n\t\t\tconst dx = e.key === 'ArrowRight' ? step : e.key === 'ArrowLeft' ? -step : 0\n\t\t\tconst dy = e.key === 'ArrowDown' ? step : e.key === 'ArrowUp' ? -step : 0\n\t\t\tthis._position = { x: this._position.x + dx, y: this._position.y + dy }\n\t\t\tthis._applyContainerPosition()\n\t\t\tthis._savePosition()\n\t\t}\n\t}\n\n\t// ============================================\n\t// PUBLIC API\n\t// ============================================\n\n\ttoggle() {\n\t\tif (this.open) this._animateClose()\n\t\telse this._animateOpen()\n\t}\n\n\texpand() {\n\t\tif (this.open) return\n\t\tthis._animateOpen()\n\t}\n\n\tclose() {\n\t\tif (!this.open) return\n\t\tthis._animateClose()\n\t}\n\n\t// ============================================\n\t// RENDER\n\t// ============================================\n\n\tprotected render(): unknown {\n\t\tconst isBottom = this._currentCorner.startsWith('bottom')\n\n\t\tconst containerClasses = classMap({\n\t\t\tfixed: true,\n\t\t\tflex: true,\n\t\t\t'flex-col': isBottom,\n\t\t\t'flex-col-reverse': !isBottom,\n\t\t\t'z-1000': true,\n\t\t\t'ring-1': !this._focused,\n\t\t\t'ring-2': this._focused,\n\t\t\t'ring-primary-default/30': this._focused,\n\t\t\t'ring-primary-default/15': this.open && !this._focused,\n\t\t\t'rounded-2xl': this.open,\n\t\t\t'ring-outline-variant/40': !this.open && !this._focused,\n\t\t\t'rounded-[22px]': !this.open,\n\t\t\t'overflow-hidden': true,\n\t\t})\n\n\t\tconst containerStyles = styleMap({\n\t\t\twidth: this.panelWidth,\n\t\t\t'max-height': 'calc(100vh - 32px)',\n\t\t\t'pointer-events': 'none',\n\t\t})\n\n\t\tconst bodyStyles = styleMap({\n\t\t\t'pointer-events': this.open ? 'auto' : 'none',\n\t\t})\n\n\t\tconst headClasses = classMap({\n\t\t\t'h-full': true,\n\t\t\t'px-3': true,\n\t\t\tflex: true,\n\t\t\t'items-center': true,\n\t\t\t'gap-2': true,\n\t\t\t'select-none': true,\n\t\t\t'cursor-move': true,\n\t\t})\n\n\t\treturn html`\n\t\t\t<schmancy-surface\n\t\t\t\t${ref(this._containerRef)}\n\t\t\t\ttype=\"glass\"\n\t\t\t\t.elevation=${this.elevation}\n\t\t\t\tclass=${containerClasses}\n\t\t\t\tstyle=${containerStyles}\n\t\t\t\taria-expanded=${this.open}\n\t\t\t\t@pointerdown=${this._handleFocus}\n\t\t\t>\n\t\t\t\t<!-- Details section (visually above summary for bottom corners) -->\n\t\t\t\t<section\n\t\t\t\t\t${ref(this._bodyRef)}\n\t\t\t\t\tclass=\"flex-1 min-h-0 overflow-hidden flex flex-col\"\n\t\t\t\t\tstyle=${bodyStyles}\n\t\t\t\t\trole=\"region\"\n\t\t\t\t\taria-label=\"Expandable content\"\n\t\t\t\t>\n\t\t\t\t\t${this._hasOpened ? html`<slot name=\"details\"></slot>` : nothing}\n\t\t\t\t</section>\n\n\t\t\t\t<!-- Summary section -- always interactive, always visible -->\n\t\t\t\t<section\n\t\t\t\t\tclass=\"shrink-0 bg-surface-lowest\"\n\t\t\t\t\tstyle=${styleMap({ 'pointer-events': 'auto', height: `${HEAD_HEIGHT}px` })}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\t${ref(this._headRef)}\n\t\t\t\t\t\t${cursorGlow({ radius: 200, intensity: 0.10 })}\n\t\t\t\t\t\tclass=${headClasses}\n\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\ttitle=\"Drag to move, click to expand\"\n\t\t\t\t\t\taria-label=\"${this.open ? 'Collapse window' : 'Expand window'}\"\n\t\t\t\t\t\t@keydown=${this._handleHeadKeydown}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div class=\"flex-1 min-w-0\">\n\t\t\t\t\t\t\t<slot></slot>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n\t\t\t\t\t\t\tclass=\"shrink-0 text-surface-on/40 transition-transform duration-200 ${this.open ? 'rotate-180' : ''}\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<path d=\"M6 9L12 15L18 9\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t</section>\n\t\t\t</schmancy-surface>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-window': SchmancyWindow\n\t}\n}\n"],"mappings":"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"}
package/dist/window.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./window-DTUARSrU.cjs`);exports.SchmancyWindow=e.t,exports.windowManager=e.n;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./window-DtUOWiAj.cjs`);exports.SchmancyWindow=e.t,exports.windowManager=e.n;
package/dist/window.js CHANGED
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./window-CrjZdf7Y.js";
1
+ import { n as e, t } from "./window-C7yY9yp5.js";
2
2
  export { t as SchmancyWindow, e as windowManager };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mhmo91/schmancy",
3
- "version": "0.9.28",
3
+ "version": "0.10.2",
4
4
  "description": "UI library build with web components",
5
5
  "main": "./dist/index.js",
6
6
  "customElements": "custom-elements.json",
@@ -21,6 +21,7 @@
21
21
  "default": "./dist/agent/schmancy.agent.js"
22
22
  },
23
23
  "./agent/manifest": "./dist/agent/schmancy.manifest.json",
24
+ "./vite": "./plugins/vite-plugin-schmancy-auto-import.ts",
24
25
  "./*": {
25
26
  "types": "./types/src/*/index.d.ts",
26
27
  "default": "./dist/*.js"
@@ -48,6 +49,7 @@
48
49
  "types",
49
50
  "src",
50
51
  ".claude-plugin",
52
+ "plugins",
51
53
  "skills",
52
54
  "custom-elements.json",
53
55
  "README.md"
@@ -63,6 +65,10 @@
63
65
  "build:handover": "node scripts/render-handover.mjs",
64
66
  "manifest": "wca 'src/**/*.ts' --outFile custom-elements.json --format json",
65
67
  "ncu": "ncu -u && npm i",
68
+ "typecheck": "tsc --noEmit",
69
+ "lint": "oxlint src/ mixins/",
70
+ "lit-check": "lit-analyzer 'src/**/*.ts'",
71
+ "check": "yarn typecheck && yarn lint && yarn lit-check && yarn knip",
66
72
  "test": "vitest run",
67
73
  "test:watch": "vitest",
68
74
  "test:ui": "vitest --ui",
@@ -80,11 +86,11 @@
80
86
  "dependencies": {
81
87
  "@floating-ui/dom": "^1.7.6",
82
88
  "@lit-labs/motion": "^1.1.0",
89
+ "@lit-labs/signals": "^0.2.0",
83
90
  "@lit-labs/virtualizer": "^2.1.1",
84
91
  "@lit/context": "^1.1.6",
85
92
  "@material/material-color-utilities": "^0.4.0",
86
93
  "@material/web": "^2.4.1",
87
- "@types/cleave.js": "^1.4.12",
88
94
  "cleave.js": "^1.6.0",
89
95
  "dayjs": "^1.11.20",
90
96
  "highlight.js": "^11.11.1",
@@ -92,14 +98,14 @@
92
98
  "jsqr": "^1.4.0",
93
99
  "lit": "^3.3.2",
94
100
  "rxjs": "^7.8.2",
95
- "ts-is-present": "^1.2.2",
96
- "typeit": "^8.8.7"
101
+ "ts-is-present": "^1.2.2"
97
102
  },
98
103
  "devDependencies": {
99
104
  "@rollup/plugin-strip": "^3.0.4",
100
105
  "@rollup/plugin-terser": "^1.0.0",
101
106
  "@tailwindcss/postcss": "^4.2.1",
102
107
  "@tailwindcss/vite": "^4.2.1",
108
+ "@types/cleave.js": "^1.4.12",
103
109
  "@types/node": "^25.5.0",
104
110
  "@vitest/browser-playwright": "^4.1.4",
105
111
  "@vitest/coverage-v8": "^4.1.5",
@@ -107,6 +113,8 @@
107
113
  "axe-core": "^4.11.3",
108
114
  "happy-dom": "^20.8.4",
109
115
  "knip": "^6.6.0",
116
+ "lit-analyzer": "^2.0.3",
117
+ "oxlint": "^1.61.0",
110
118
  "playwright": "^1.59.1",
111
119
  "postcss": "^8.5.8",
112
120
  "prettier": "^3.8.1",
@@ -121,7 +129,10 @@
121
129
  "web-component-analyzer": "^2.0.0"
122
130
  },
123
131
  "peerDependencies": {
132
+ "@lit/context": "^1.1.0",
133
+ "immer": "^11.0.0",
124
134
  "lit": "^3.2.1",
135
+ "rxjs": "^7.8.0",
125
136
  "tailwindcss": "^4.0.0"
126
137
  }
127
138
  }
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Vite plugin — auto-inject `@mhmo91/schmancy/<subpath>` side-effect
3
+ * imports per source file based on which `<schmancy-*>` tags appear in
4
+ * its `html\`\`` templates.
5
+ *
6
+ * Schmancy's components self-register via `customElements.define`, and
7
+ * the package has no `sideEffects: false`. A wholesale
8
+ * `import '@mhmo91/schmancy'` therefore keeps every component in the
9
+ * consumer bundle. This plugin reads the package's own
10
+ * `custom-elements.json` once at startup, scans every non-
11
+ * `node_modules` `.ts` / `.tsx` file in the consumer at transform
12
+ * time, extracts the `<schmancy-*>` tags from its templates, and
13
+ * prepends `import '@mhmo91/schmancy/<subpath>';` for the matching
14
+ * subpaths. Vite splits each subpath into its own chunk; unused
15
+ * subpaths fall out of the bundle. Consumers keep clean source files
16
+ * (no per-file boilerplate, no maintained registration list) while
17
+ * the bundler sees explicit, narrow imports.
18
+ *
19
+ * Tags whose source path doesn't resolve to a top-level dist entry
20
+ * (`schmancy-avatar`, `schmancy-skill`, …) fall through silently —
21
+ * the consumer is expected to register those eagerly in its app
22
+ * entry. `schmancy-splash-screen` is the typical eager case in
23
+ * single-page apps because it usually appears in `index.html`, which
24
+ * the plugin doesn't scan.
25
+ *
26
+ * The transform regex matches any opening `<schmancy-foo` token,
27
+ * including occurrences inside JS comments. Comment-only mentions
28
+ * cause a small over-import (one extra subpath) but never a missing
29
+ * one.
30
+ *
31
+ * Usage in `vite.config.ts`:
32
+ *
33
+ * import { schmancyAutoImport } from '@mhmo91/schmancy/vite';
34
+ * export default defineConfig({
35
+ * plugins: [schmancyAutoImport()],
36
+ * });
37
+ */
38
+ import { readdirSync, readFileSync } from 'node:fs'
39
+ import path from 'node:path'
40
+ import { fileURLToPath } from 'node:url'
41
+
42
+ // Structural plugin shape — avoids importing vite's `Plugin` type, whose
43
+ // deep generic graph triggers a TS2321 "Excessive stack depth" error
44
+ // when the consumer's vite installation differs from schmancy's. Vite
45
+ // accepts any object that matches this shape structurally.
46
+ type VitePlugin = {
47
+ name: string
48
+ enforce?: 'pre' | 'post'
49
+ transform?: (code: string, id: string) => { code: string; map: null } | null
50
+ }
51
+
52
+ interface SchmancyAutoImportOptions {
53
+ /** Override the schmancy `custom-elements.json` location. */
54
+ manifestPath?: string
55
+ /** Override the schmancy `dist/` directory used to filter unmapped tags. */
56
+ distDir?: string
57
+ /** Override the package specifier used in injected imports. */
58
+ packageName?: string
59
+ /** Override the tag prefix to scan for. */
60
+ tagPrefix?: string
61
+ /**
62
+ * Optional substring required in the file `id` for the transform to
63
+ * apply. Useful in monorepos to restrict scans to a specific source
64
+ * root (e.g. `'/web/src/'`). When omitted, every non-`node_modules`
65
+ * `.ts` / `.tsx` file is scanned.
66
+ */
67
+ includeRoot?: string
68
+ }
69
+
70
+ interface SchmancyManifestTag {
71
+ name: string
72
+ path: string
73
+ }
74
+
75
+ interface SchmancyManifest {
76
+ version: string
77
+ tags: SchmancyManifestTag[]
78
+ }
79
+
80
+ const HERE = path.dirname(fileURLToPath(import.meta.url))
81
+ const DEFAULT_MANIFEST = path.resolve(HERE, '../custom-elements.json')
82
+ const DEFAULT_DIST = path.resolve(HERE, '../dist')
83
+
84
+ const TAG_RE = /<\s*(schmancy-[a-z][a-z0-9-]*)/g
85
+ // dist filenames look like `name-HASH.js` for code-split chunks vs
86
+ // `name.js` for named entries. Eight or more chars of hex/base64 after a
87
+ // dash distinguishes a chunk hash from a hyphenated entry like
88
+ // `content-drawer.js`.
89
+ const HASH_CHUNK_RE = /-[A-Za-z0-9_-]{8,}\.js$/
90
+
91
+ function manifestPathToSubpath(p: string): string {
92
+ const noPrefix = p.replace(/^\.\/src\//, '')
93
+ return noPrefix.includes('/') ? (noPrefix.split('/')[0] ?? '') : noPrefix.replace(/\.tsx?$/, '')
94
+ }
95
+
96
+ export function schmancyAutoImport(options: SchmancyAutoImportOptions = {}): VitePlugin {
97
+ const manifestPath = options.manifestPath ?? DEFAULT_MANIFEST
98
+ const distDir = options.distDir ?? DEFAULT_DIST
99
+ const packageName = options.packageName ?? '@mhmo91/schmancy'
100
+ const tagPrefix = options.tagPrefix ?? 'schmancy-'
101
+ const includeRoot = options.includeRoot
102
+
103
+ const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8')) as SchmancyManifest
104
+ const distEntries = new Set(
105
+ readdirSync(distDir)
106
+ .filter(f => f.endsWith('.js'))
107
+ .filter(f => !HASH_CHUNK_RE.test(f))
108
+ .map(f => f.replace(/\.js$/, '')),
109
+ )
110
+
111
+ const tagToSubpath = new Map<string, string>()
112
+ for (const tag of manifest.tags) {
113
+ if (!tag.name.startsWith(tagPrefix)) continue
114
+ const sub = manifestPathToSubpath(tag.path)
115
+ if (distEntries.has(sub)) tagToSubpath.set(tag.name, sub)
116
+ }
117
+
118
+ return {
119
+ name: 'vite-plugin-schmancy-auto-import',
120
+ enforce: 'pre',
121
+ transform(code, id) {
122
+ if (!id.endsWith('.ts') && !id.endsWith('.tsx')) return null
123
+ if (id.includes('/node_modules/')) return null
124
+ if (includeRoot && !id.includes(includeRoot)) return null
125
+
126
+ const subpaths = new Set<string>()
127
+ TAG_RE.lastIndex = 0
128
+ let match: RegExpExecArray | null
129
+ while ((match = TAG_RE.exec(code))) {
130
+ const sub = tagToSubpath.get(match[1]!)
131
+ if (sub) subpaths.add(sub)
132
+ }
133
+ if (subpaths.size === 0) return null
134
+
135
+ const banner = [...subpaths]
136
+ .toSorted()
137
+ .map(s => `import '${packageName}/${s}';`)
138
+ .join('\n')
139
+
140
+ return { code: `${banner}\n${code}`, map: null }
141
+ },
142
+ }
143
+ }