@mhmo91/schmancy 0.10.32 → 0.10.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/custom-elements.json +7 -22
  2. package/dist/SchmancyElement-CA0Wqt8m.js +284 -0
  3. package/dist/{SchmancyElement-DuzT2AMa.js.map → SchmancyElement-CA0Wqt8m.js.map} +1 -1
  4. package/dist/SchmancyElement-CYIif26I.cjs +2 -0
  5. package/dist/{SchmancyElement-D8_z9JrW.cjs.map → SchmancyElement-CYIif26I.cjs.map} +1 -1
  6. package/dist/agent/schmancy.agent.js +1694 -1728
  7. package/dist/agent/schmancy.agent.js.map +1 -1
  8. package/dist/agent/schmancy.manifest.json +4 -10
  9. package/dist/{area-WGfTrwcJ.cjs → area-CTSTgjlx.cjs} +1 -1
  10. package/dist/{area-WGfTrwcJ.cjs.map → area-CTSTgjlx.cjs.map} +1 -1
  11. package/dist/{area-0l8V7HlF.js → area-DviXdbDx.js} +2 -2
  12. package/dist/{area-0l8V7HlF.js.map → area-DviXdbDx.js.map} +1 -1
  13. package/dist/area.cjs +1 -1
  14. package/dist/area.js +1 -1
  15. package/dist/{audio-x9oLVKBH.js → audio-DFYoaw0M.js} +1 -1
  16. package/dist/{audio-x9oLVKBH.js.map → audio-DFYoaw0M.js.map} +1 -1
  17. package/dist/{audio-9QLk4pU-.cjs → audio-Q9oB_cQR.cjs} +1 -1
  18. package/dist/{audio-9QLk4pU-.cjs.map → audio-Q9oB_cQR.cjs.map} +1 -1
  19. package/dist/audio.cjs +1 -1
  20. package/dist/audio.js +2 -2
  21. package/dist/{autocomplete-sjZovPcs.js → autocomplete-BDvuma6D.js} +3 -3
  22. package/dist/{autocomplete-sjZovPcs.js.map → autocomplete-BDvuma6D.js.map} +1 -1
  23. package/dist/{autocomplete-CjjfXbJC.cjs → autocomplete-DmLXJr7C.cjs} +1 -1
  24. package/dist/{autocomplete-CjjfXbJC.cjs.map → autocomplete-DmLXJr7C.cjs.map} +1 -1
  25. package/dist/autocomplete.cjs +1 -1
  26. package/dist/autocomplete.js +1 -1
  27. package/dist/avatar.cjs +1 -1
  28. package/dist/avatar.js +3 -3
  29. package/dist/badge.cjs +1 -1
  30. package/dist/badge.js +1 -1
  31. package/dist/boat-BgpWcLnV.cjs +38 -0
  32. package/dist/boat-BgpWcLnV.cjs.map +1 -0
  33. package/dist/boat-Y5UMiJCV.js +216 -0
  34. package/dist/boat-Y5UMiJCV.js.map +1 -0
  35. package/dist/boat.cjs +1 -1
  36. package/dist/boat.js +1 -1
  37. package/dist/breadcrumb.cjs +1 -1
  38. package/dist/breadcrumb.js +2 -2
  39. package/dist/{busy-DDKXlzDA.cjs → busy-CgzZbGfx.cjs} +1 -1
  40. package/dist/{busy-DDKXlzDA.cjs.map → busy-CgzZbGfx.cjs.map} +1 -1
  41. package/dist/{busy-DwD-XHqS.js → busy-DgQ4ux5N.js} +2 -2
  42. package/dist/{busy-DwD-XHqS.js.map → busy-DgQ4ux5N.js.map} +1 -1
  43. package/dist/busy.cjs +1 -1
  44. package/dist/busy.js +1 -1
  45. package/dist/{button-nDZQe1ES.cjs → button-DFvR1iXX.cjs} +1 -1
  46. package/dist/{button-nDZQe1ES.cjs.map → button-DFvR1iXX.cjs.map} +1 -1
  47. package/dist/{button-qARUurjf.js → button-qbN1muQ0.js} +2 -2
  48. package/dist/{button-qARUurjf.js.map → button-qbN1muQ0.js.map} +1 -1
  49. package/dist/button.cjs +1 -1
  50. package/dist/button.js +3 -3
  51. package/dist/{card-D3IxxBBP.js → card-DAbr-7Vy.js} +2 -2
  52. package/dist/{card-D3IxxBBP.js.map → card-DAbr-7Vy.js.map} +1 -1
  53. package/dist/{card-DWZhZ5Ds.cjs → card-D_GlwZ5q.cjs} +1 -1
  54. package/dist/{card-DWZhZ5Ds.cjs.map → card-D_GlwZ5q.cjs.map} +1 -1
  55. package/dist/card.cjs +1 -1
  56. package/dist/card.js +1 -1
  57. package/dist/{checkbox-t__wRS-9.js → checkbox-BNORaxMF.js} +2 -2
  58. package/dist/{checkbox-t__wRS-9.js.map → checkbox-BNORaxMF.js.map} +1 -1
  59. package/dist/{checkbox-BBttnA_a.cjs → checkbox-BUY_uc_r.cjs} +1 -1
  60. package/dist/{checkbox-BBttnA_a.cjs.map → checkbox-BUY_uc_r.cjs.map} +1 -1
  61. package/dist/checkbox.cjs +1 -1
  62. package/dist/checkbox.js +1 -1
  63. package/dist/{chips-DIZFWnDZ.cjs → chips-CXZ4dJCK.cjs} +1 -1
  64. package/dist/{chips-DIZFWnDZ.cjs.map → chips-CXZ4dJCK.cjs.map} +1 -1
  65. package/dist/{chips-xaoSmwBK.js → chips-Dg6Lk6BT.js} +4 -4
  66. package/dist/{chips-xaoSmwBK.js.map → chips-Dg6Lk6BT.js.map} +1 -1
  67. package/dist/chips.cjs +1 -1
  68. package/dist/chips.js +2 -2
  69. package/dist/connectivity.cjs +1 -1
  70. package/dist/connectivity.js +3 -3
  71. package/dist/content-drawer.cjs +1 -1
  72. package/dist/content-drawer.js +1 -1
  73. package/dist/{date-range-8OkCahnR.js → date-range-BU6WX7d5.js} +3 -3
  74. package/dist/{date-range-8OkCahnR.js.map → date-range-BU6WX7d5.js.map} +1 -1
  75. package/dist/{date-range-Bbzg9aym.cjs → date-range-C-_be3_E.cjs} +1 -1
  76. package/dist/{date-range-Bbzg9aym.cjs.map → date-range-C-_be3_E.cjs.map} +1 -1
  77. package/dist/{date-range-inline-BEP-oWJZ.js → date-range-inline-7o7xtVIu.js} +2 -2
  78. package/dist/{date-range-inline-BEP-oWJZ.js.map → date-range-inline-7o7xtVIu.js.map} +1 -1
  79. package/dist/{date-range-inline-lhkwHFxY.cjs → date-range-inline-DJtUmHKF.cjs} +1 -1
  80. package/dist/{date-range-inline-lhkwHFxY.cjs.map → date-range-inline-DJtUmHKF.cjs.map} +1 -1
  81. package/dist/date-range-inline.cjs +1 -1
  82. package/dist/date-range-inline.js +1 -1
  83. package/dist/date-range.cjs +1 -1
  84. package/dist/date-range.js +1 -1
  85. package/dist/delay.cjs +1 -1
  86. package/dist/delay.js +2 -2
  87. package/dist/{details-3X9YKpuP.cjs → details-Bs0MyyvF.cjs} +1 -1
  88. package/dist/{details-3X9YKpuP.cjs.map → details-Bs0MyyvF.cjs.map} +1 -1
  89. package/dist/{details-BO_3CCNn.js → details-EfbDPVEo.js} +2 -2
  90. package/dist/{details-BO_3CCNn.js.map → details-EfbDPVEo.js.map} +1 -1
  91. package/dist/details.cjs +1 -1
  92. package/dist/details.js +1 -1
  93. package/dist/{directives-CPFrvZVC.cjs → directives-fLwDj6b0.cjs} +11 -11
  94. package/dist/directives-fLwDj6b0.cjs.map +1 -0
  95. package/dist/{directives-ltIff8q0.js → directives-zi1Mm2er.js} +233 -160
  96. package/dist/directives-zi1Mm2er.js.map +1 -0
  97. package/dist/directives.cjs +1 -1
  98. package/dist/directives.js +2 -2
  99. package/dist/{divider-BHgrisGQ.js → divider-CEPfrIwe.js} +2 -2
  100. package/dist/{divider-BHgrisGQ.js.map → divider-CEPfrIwe.js.map} +1 -1
  101. package/dist/{divider-D21yKZNJ.cjs → divider-CdIsWZrM.cjs} +1 -1
  102. package/dist/{divider-D21yKZNJ.cjs.map → divider-CdIsWZrM.cjs.map} +1 -1
  103. package/dist/divider.cjs +1 -1
  104. package/dist/divider.js +1 -1
  105. package/dist/dropdown.cjs +1 -1
  106. package/dist/dropdown.js +2 -2
  107. package/dist/{expand-wRphbpW6.cjs → expand--at1k3qo.cjs} +1 -1
  108. package/dist/{expand-wRphbpW6.cjs.map → expand--at1k3qo.cjs.map} +1 -1
  109. package/dist/{expand-2TTbmm_z.js → expand-g1vqqUp1.js} +3 -3
  110. package/dist/{expand-2TTbmm_z.js.map → expand-g1vqqUp1.js.map} +1 -1
  111. package/dist/expand.cjs +1 -1
  112. package/dist/expand.js +1 -1
  113. package/dist/{float-dtDqRmcL.js → float-DxVzgI9o.js} +2 -2
  114. package/dist/{float-dtDqRmcL.js.map → float-DxVzgI9o.js.map} +1 -1
  115. package/dist/{float-B0L_CH4v.cjs → float-P9HukAm-.cjs} +1 -1
  116. package/dist/{float-B0L_CH4v.cjs.map → float-P9HukAm-.cjs.map} +1 -1
  117. package/dist/float.cjs +1 -1
  118. package/dist/float.js +1 -1
  119. package/dist/{form-DvqHReDF.cjs → form-ByYhXe1p.cjs} +1 -1
  120. package/dist/{form-DvqHReDF.cjs.map → form-ByYhXe1p.cjs.map} +1 -1
  121. package/dist/{form-BxY-9F6N.js → form-CqLaozHp.js} +3 -3
  122. package/dist/{form-BxY-9F6N.js.map → form-CqLaozHp.js.map} +1 -1
  123. package/dist/form.cjs +1 -1
  124. package/dist/form.js +10 -10
  125. package/dist/handover/agent-runtime-followups.md +1 -1
  126. package/dist/handover/agent-runtime-v1.md +3 -3
  127. package/dist/{icons-CO8UrTJQ.js → icons-CkphcMp6.js} +2 -2
  128. package/dist/{icons-CO8UrTJQ.js.map → icons-CkphcMp6.js.map} +1 -1
  129. package/dist/{icons-BbC4t44c.cjs → icons-DYtiRU5V.cjs} +1 -1
  130. package/dist/{icons-BbC4t44c.cjs.map → icons-DYtiRU5V.cjs.map} +1 -1
  131. package/dist/icons.cjs +1 -1
  132. package/dist/icons.js +1 -1
  133. package/dist/{iframe-BepoWz9Z.cjs → iframe-C3trkP8q.cjs} +1 -1
  134. package/dist/{iframe-BepoWz9Z.cjs.map → iframe-C3trkP8q.cjs.map} +1 -1
  135. package/dist/{iframe-t5zo89Fs.js → iframe-CjqJksl8.js} +2 -2
  136. package/dist/{iframe-t5zo89Fs.js.map → iframe-CjqJksl8.js.map} +1 -1
  137. package/dist/iframe.cjs +1 -1
  138. package/dist/iframe.js +1 -1
  139. package/dist/index.cjs +1 -1
  140. package/dist/index.js +37 -37
  141. package/dist/{input-2OR6wjfT.js → input-CG51zDVh.js} +2 -2
  142. package/dist/{input-2OR6wjfT.js.map → input-CG51zDVh.js.map} +1 -1
  143. package/dist/{input-B-wPPC5o.cjs → input-DuavpwNL.cjs} +1 -1
  144. package/dist/{input-B-wPPC5o.cjs.map → input-DuavpwNL.cjs.map} +1 -1
  145. package/dist/{input-chip-O5-pgek1.cjs → input-chip-57tgNXKT.cjs} +1 -1
  146. package/dist/{input-chip-O5-pgek1.cjs.map → input-chip-57tgNXKT.cjs.map} +1 -1
  147. package/dist/{input-chip-NBsnZkzu.js → input-chip-C6Lq1927.js} +2 -2
  148. package/dist/{input-chip-NBsnZkzu.js.map → input-chip-C6Lq1927.js.map} +1 -1
  149. package/dist/input.cjs +1 -1
  150. package/dist/input.js +1 -1
  151. package/dist/json.cjs +1 -1
  152. package/dist/json.js +3 -3
  153. package/dist/kbd.cjs +1 -1
  154. package/dist/kbd.js +2 -2
  155. package/dist/{layout-D7nKwpa5.cjs → layout-6ipbiWTl.cjs} +1 -1
  156. package/dist/{layout-D7nKwpa5.cjs.map → layout-6ipbiWTl.cjs.map} +1 -1
  157. package/dist/{layout-CJ01zE9V.js → layout-D4IOwx7p.js} +1 -1
  158. package/dist/{layout-CJ01zE9V.js.map → layout-D4IOwx7p.js.map} +1 -1
  159. package/dist/layout.cjs +1 -1
  160. package/dist/layout.js +2 -2
  161. package/dist/{lightbox-Droe9dYY.js → lightbox-CsyO2XSr.js} +2 -2
  162. package/dist/{lightbox-Droe9dYY.js.map → lightbox-CsyO2XSr.js.map} +1 -1
  163. package/dist/{lightbox-DVpvjsYb.cjs → lightbox-H8pVWGMX.cjs} +1 -1
  164. package/dist/{lightbox-DVpvjsYb.cjs.map → lightbox-H8pVWGMX.cjs.map} +1 -1
  165. package/dist/lightbox.cjs +1 -1
  166. package/dist/lightbox.js +1 -1
  167. package/dist/{list-DzAWv99q.js → list-BAwH0pQW.js} +2 -2
  168. package/dist/{list-DzAWv99q.js.map → list-BAwH0pQW.js.map} +1 -1
  169. package/dist/{list-JjUsFCP6.cjs → list-Bs9m8kw7.cjs} +1 -1
  170. package/dist/{list-JjUsFCP6.cjs.map → list-Bs9m8kw7.cjs.map} +1 -1
  171. package/dist/list.cjs +1 -1
  172. package/dist/list.js +1 -1
  173. package/dist/{menu-B5EKUeeD.cjs → menu-BMcGzj1h.cjs} +1 -1
  174. package/dist/{menu-B5EKUeeD.cjs.map → menu-BMcGzj1h.cjs.map} +1 -1
  175. package/dist/{menu-CgdXrzir.js → menu-tQVARVaC.js} +3 -3
  176. package/dist/{menu-CgdXrzir.js.map → menu-tQVARVaC.js.map} +1 -1
  177. package/dist/menu.cjs +1 -1
  178. package/dist/menu.js +1 -1
  179. package/dist/{mixins-Cevarn7V.js → mixins-Bp0wIHg2.js} +1 -1
  180. package/dist/{mixins-Cevarn7V.js.map → mixins-Bp0wIHg2.js.map} +1 -1
  181. package/dist/{mixins-JyO9GSGy.cjs → mixins-CGXSzZc7.cjs} +1 -1
  182. package/dist/{mixins-JyO9GSGy.cjs.map → mixins-CGXSzZc7.cjs.map} +1 -1
  183. package/dist/mixins.cjs +1 -1
  184. package/dist/mixins.js +2 -2
  185. package/dist/nav-drawer.cjs +1 -1
  186. package/dist/nav-drawer.js +1 -1
  187. package/dist/navigation-bar.cjs +1 -1
  188. package/dist/navigation-bar.js +1 -1
  189. package/dist/navigation-rail.cjs +1 -1
  190. package/dist/navigation-rail.js +2 -2
  191. package/dist/{notification-CaeRS5US.cjs → notification-Bz00zdpV.cjs} +1 -1
  192. package/dist/{notification-CaeRS5US.cjs.map → notification-Bz00zdpV.cjs.map} +1 -1
  193. package/dist/{notification-Dxwx0Zln.js → notification-D1tX2nx5.js} +4 -4
  194. package/dist/{notification-Dxwx0Zln.js.map → notification-D1tX2nx5.js.map} +1 -1
  195. package/dist/notification.cjs +1 -1
  196. package/dist/notification.js +1 -1
  197. package/dist/{option-C6wXFQOM.cjs → option-BnybLEDO.cjs} +1 -1
  198. package/dist/{option-C6wXFQOM.cjs.map → option-BnybLEDO.cjs.map} +1 -1
  199. package/dist/{option-BCnYutZz.js → option-BpGV8Apj.js} +2 -2
  200. package/dist/{option-BCnYutZz.js.map → option-BpGV8Apj.js.map} +1 -1
  201. package/dist/option.cjs +1 -1
  202. package/dist/option.js +1 -1
  203. package/dist/{overlay-BWcB2pRx.js → overlay-BpNhd74N.js} +24 -7
  204. package/dist/overlay-BpNhd74N.js.map +1 -0
  205. package/dist/{overlay-5PMZ75PO.cjs → overlay-UQR2Dy3u.cjs} +18 -3
  206. package/dist/overlay-UQR2Dy3u.cjs.map +1 -0
  207. package/dist/overlay.cjs +1 -1
  208. package/dist/{overlay.confirm-body-B7W0DOGS.js → overlay.confirm-body-BHcXu5Wk.js} +6 -6
  209. package/dist/{overlay.confirm-body-B7W0DOGS.js.map → overlay.confirm-body-BHcXu5Wk.js.map} +1 -1
  210. package/dist/{overlay.confirm-body-CsvwcBvG.cjs → overlay.confirm-body-CVDtVk5X.cjs} +1 -1
  211. package/dist/{overlay.confirm-body-CsvwcBvG.cjs.map → overlay.confirm-body-CVDtVk5X.cjs.map} +1 -1
  212. package/dist/overlay.js +3 -3
  213. package/dist/{overlay.service-CC4zckoV.cjs → overlay.service-C8RsQzgM.cjs} +1 -1
  214. package/dist/{overlay.service-CC4zckoV.cjs.map → overlay.service-C8RsQzgM.cjs.map} +1 -1
  215. package/dist/{overlay.service-zx465FI8.js → overlay.service-DTE6NwIM.js} +2 -2
  216. package/dist/{overlay.service-zx465FI8.js.map → overlay.service-DTE6NwIM.js.map} +1 -1
  217. package/dist/{progress-BoFm3r6h.js → progress-CAKsxp29.js} +2 -2
  218. package/dist/{progress-BoFm3r6h.js.map → progress-CAKsxp29.js.map} +1 -1
  219. package/dist/{progress-Bc_IBaNH.cjs → progress-gbIALDRs.cjs} +1 -1
  220. package/dist/{progress-Bc_IBaNH.cjs.map → progress-gbIALDRs.cjs.map} +1 -1
  221. package/dist/progress.cjs +1 -1
  222. package/dist/progress.js +1 -1
  223. package/dist/{radio-group-C34WDjrN.cjs → radio-group-CfJ5DtI4.cjs} +1 -1
  224. package/dist/{radio-group-C34WDjrN.cjs.map → radio-group-CfJ5DtI4.cjs.map} +1 -1
  225. package/dist/{radio-group-DnHhGrXp.js → radio-group-otyvZvUk.js} +2 -2
  226. package/dist/{radio-group-DnHhGrXp.js.map → radio-group-otyvZvUk.js.map} +1 -1
  227. package/dist/radio-group.cjs +1 -1
  228. package/dist/radio-group.js +1 -1
  229. package/dist/range.cjs +1 -1
  230. package/dist/range.js +2 -2
  231. package/dist/{select-ypXSw5IR.cjs → select-81jniVTs.cjs} +1 -1
  232. package/dist/{select-ypXSw5IR.cjs.map → select-81jniVTs.cjs.map} +1 -1
  233. package/dist/{select-oZGIVus4.js → select-9vXx1fhr.js} +3 -3
  234. package/dist/{select-oZGIVus4.js.map → select-9vXx1fhr.js.map} +1 -1
  235. package/dist/select.cjs +1 -1
  236. package/dist/select.js +1 -1
  237. package/dist/skeleton.cjs +1 -1
  238. package/dist/skeleton.js +2 -2
  239. package/dist/skills/boat.md +27 -18
  240. package/dist/skills/schmancy/boat.md +27 -18
  241. package/dist/slider.cjs +1 -1
  242. package/dist/slider.js +2 -2
  243. package/dist/{sound.service-Czs3gmRx.cjs → sound.service-CmIw63aM.cjs} +1 -1
  244. package/dist/{sound.service-Czs3gmRx.cjs.map → sound.service-CmIw63aM.cjs.map} +1 -1
  245. package/dist/{sound.service-Cuo4-X_-.js → sound.service-D3ZSq1Kj.js} +1 -1
  246. package/dist/{sound.service-Cuo4-X_-.js.map → sound.service-D3ZSq1Kj.js.map} +1 -1
  247. package/dist/{splash-screen-CbcYpkIx.js → splash-screen-BOjrmGLk.js} +2 -2
  248. package/dist/{splash-screen-CbcYpkIx.js.map → splash-screen-BOjrmGLk.js.map} +1 -1
  249. package/dist/{splash-screen-C0oeDPxV.cjs → splash-screen-C5KAWXvA.cjs} +1 -1
  250. package/dist/{splash-screen-C0oeDPxV.cjs.map → splash-screen-C5KAWXvA.cjs.map} +1 -1
  251. package/dist/splash-screen.cjs +1 -1
  252. package/dist/splash-screen.js +1 -1
  253. package/dist/{src-_OZKm1Am.cjs → src-Bm1vop0l.cjs} +1 -1
  254. package/dist/{src-_OZKm1Am.cjs.map → src-Bm1vop0l.cjs.map} +1 -1
  255. package/dist/{src-CDdxnUbF.js → src-DoOhMBtI.js} +35 -35
  256. package/dist/{src-CDdxnUbF.js.map → src-DoOhMBtI.js.map} +1 -1
  257. package/dist/{state-B-5H9i10.js → state-CWBRTSvE.js} +1 -1
  258. package/dist/{state-B-5H9i10.js.map → state-CWBRTSvE.js.map} +1 -1
  259. package/dist/{state-D85Se4Fx.cjs → state-Cex3rmx2.cjs} +1 -1
  260. package/dist/{state-D85Se4Fx.cjs.map → state-Cex3rmx2.cjs.map} +1 -1
  261. package/dist/state.cjs +1 -1
  262. package/dist/state.js +2 -2
  263. package/dist/steps.cjs +1 -1
  264. package/dist/steps.js +2 -2
  265. package/dist/{surface-gZpeCF6E.js → surface-9S5scTsD.js} +2 -2
  266. package/dist/{surface-gZpeCF6E.js.map → surface-9S5scTsD.js.map} +1 -1
  267. package/dist/{surface-DHPaLOTA.cjs → surface-PfiejLuw.cjs} +1 -1
  268. package/dist/{surface-DHPaLOTA.cjs.map → surface-PfiejLuw.cjs.map} +1 -1
  269. package/dist/surface.cjs +1 -1
  270. package/dist/surface.js +1 -1
  271. package/dist/switch.cjs +1 -1
  272. package/dist/switch.js +2 -2
  273. package/dist/table.cjs +1 -1
  274. package/dist/table.js +2 -2
  275. package/dist/{tabs-DJNdoE-x.js → tabs-BBOjAmgG.js} +2 -2
  276. package/dist/{tabs-DJNdoE-x.js.map → tabs-BBOjAmgG.js.map} +1 -1
  277. package/dist/{tabs-DgaVwuOo.cjs → tabs-uYvb1P06.cjs} +1 -1
  278. package/dist/{tabs-DgaVwuOo.cjs.map → tabs-uYvb1P06.cjs.map} +1 -1
  279. package/dist/tabs.cjs +1 -1
  280. package/dist/tabs.js +1 -1
  281. package/dist/teleport.cjs +1 -1
  282. package/dist/teleport.js +1 -1
  283. package/dist/{textarea-8x0prbgm.js → textarea-QzSj8Dkl.js} +2 -2
  284. package/dist/{textarea-8x0prbgm.js.map → textarea-QzSj8Dkl.js.map} +1 -1
  285. package/dist/{textarea-2QE5z6Ny.cjs → textarea-YPHX4g7Y.cjs} +1 -1
  286. package/dist/{textarea-2QE5z6Ny.cjs.map → textarea-YPHX4g7Y.cjs.map} +1 -1
  287. package/dist/textarea.cjs +1 -1
  288. package/dist/textarea.js +1 -1
  289. package/dist/{theme-DSD9Bs69.js → theme-C2Mp-VGt.js} +4 -4
  290. package/dist/{theme-DSD9Bs69.js.map → theme-C2Mp-VGt.js.map} +1 -1
  291. package/dist/{theme-button-Dpr6SGzB.cjs → theme-button-CJmhxfMe.cjs} +1 -1
  292. package/dist/{theme-button-Dpr6SGzB.cjs.map → theme-button-CJmhxfMe.cjs.map} +1 -1
  293. package/dist/{theme-button-nd6Z7plT.js → theme-button-DGWAXhzd.js} +2 -2
  294. package/dist/{theme-button-nd6Z7plT.js.map → theme-button-DGWAXhzd.js.map} +1 -1
  295. package/dist/theme-button.cjs +1 -1
  296. package/dist/theme-button.js +1 -1
  297. package/dist/{theme-D0yboni1.cjs → theme-iKUaS9JB.cjs} +1 -1
  298. package/dist/{theme-D0yboni1.cjs.map → theme-iKUaS9JB.cjs.map} +1 -1
  299. package/dist/theme.cjs +1 -1
  300. package/dist/theme.js +3 -3
  301. package/dist/{theme.service-mRlvWZVs.js → theme.service-hc4N-1Oz.js} +1 -1
  302. package/dist/{theme.service-mRlvWZVs.js.map → theme.service-hc4N-1Oz.js.map} +1 -1
  303. package/dist/{theme.service-LtQw04e6.cjs → theme.service-p61RsJBF.cjs} +1 -1
  304. package/dist/{theme.service-LtQw04e6.cjs.map → theme.service-p61RsJBF.cjs.map} +1 -1
  305. package/dist/tree.cjs +1 -1
  306. package/dist/tree.js +2 -2
  307. package/dist/{typography-CiZQpzE4.cjs → typography-Bdt8RlX2.cjs} +1 -1
  308. package/dist/{typography-CiZQpzE4.cjs.map → typography-Bdt8RlX2.cjs.map} +1 -1
  309. package/dist/{typography-DXyf-KdK.js → typography-DwV0sqht.js} +2 -2
  310. package/dist/{typography-DXyf-KdK.js.map → typography-DwV0sqht.js.map} +1 -1
  311. package/dist/typography.cjs +1 -1
  312. package/dist/typography.js +1 -1
  313. package/dist/visually-hidden.cjs +1 -1
  314. package/dist/visually-hidden.js +2 -2
  315. package/dist/{window-qKfP5c6M.cjs → window-D2WfvNng.cjs} +1 -1
  316. package/dist/{window-qKfP5c6M.cjs.map → window-D2WfvNng.cjs.map} +1 -1
  317. package/dist/{window-C_ATa3qM.js → window-n4jN60B_.js} +3 -3
  318. package/dist/{window-C_ATa3qM.js.map → window-n4jN60B_.js.map} +1 -1
  319. package/dist/window.cjs +1 -1
  320. package/dist/window.js +1 -1
  321. package/package.json +21 -21
  322. package/skills/schmancy/boat.md +27 -18
  323. package/src/boat/boat.ts +121 -365
  324. package/src/directives/art/art.directive.ts +4 -2
  325. package/src/directives/art/effects/starfield.ts +222 -77
  326. package/src/directives/art/types.ts +41 -6
  327. package/src/overlay/overlay.component.ts +28 -0
  328. package/types/src/boat/boat.d.ts +18 -25
  329. package/types/src/directives/art/effects/starfield.d.ts +11 -4
  330. package/types/src/directives/art/types.d.ts +41 -6
  331. package/types/src/overlay/overlay.component.d.ts +1 -0
  332. package/dist/SchmancyElement-D8_z9JrW.cjs +0 -2
  333. package/dist/SchmancyElement-DuzT2AMa.js +0 -284
  334. package/dist/boat-CEaQaCmG.js +0 -339
  335. package/dist/boat-CEaQaCmG.js.map +0 -1
  336. package/dist/boat-CI5rcGS5.cjs +0 -85
  337. package/dist/boat-CI5rcGS5.cjs.map +0 -1
  338. package/dist/directives-CPFrvZVC.cjs.map +0 -1
  339. package/dist/directives-ltIff8q0.js.map +0 -1
  340. package/dist/overlay-5PMZ75PO.cjs.map +0 -1
  341. package/dist/overlay-BWcB2pRx.js.map +0 -1
@@ -1,339 +0,0 @@
1
- import { t as e, u as t } from "./SchmancyElement-DuzT2AMa.js";
2
- import "./mixins-Cevarn7V.js";
3
- import { d as n, f as r } from "./animation-DCznELuT.js";
4
- import { t as i } from "./reduced-motion-D-L12p7G.js";
5
- import { n as a } from "./theme.service-mRlvWZVs.js";
6
- import { filter as o, finalize as s, fromEvent as c, map as l, merge as u, switchMap as d, takeUntil as f, tap as p } from "rxjs";
7
- import { classMap as m } from "lit/directives/class-map.js";
8
- import { styleMap as h } from "lit/directives/style-map.js";
9
- import { customElement as g, property as _, state as v } from "lit/decorators.js";
10
- import { css as y, html as b } from "lit";
11
- import { createRef as x, ref as S } from "lit/directives/ref.js";
12
- import { when as C } from "lit/directives/when.js";
13
- var w = 36, T = "schmancy-boat-", E = class extends e {
14
- constructor(...e) {
15
- super(...e), this.id = "default", this.lowered = !1, this.corner = "bottom-right", this.open = !1, this.isDragging = !1, this._position = {
16
- x: 16,
17
- y: 16
18
- }, this._currentCorner = "bottom-right", this._containerRef = x(), this._contentRef = x(), this._headerRef = x();
19
- }
20
- static {
21
- this.styles = [y`
22
- :host {
23
- display: contents;
24
- position: relative;
25
- z-index: 1000;
26
- }
27
- :host([hidden]) {
28
- display: none !important;
29
- }
30
- `];
31
- }
32
- get state() {
33
- return this.open ? "expanded" : "collapsed";
34
- }
35
- set state(e) {
36
- e === "expanded" ? this.expand() : this.close();
37
- }
38
- get panelWidth() {
39
- return this.expandedWidth ?? "min(360px, calc(100vw - 32px))";
40
- }
41
- get isBottomCorner() {
42
- return this._currentCorner.startsWith("bottom");
43
- }
44
- get closedClipPath() {
45
- return this.isBottomCorner ? "inset(calc(100% - 36px) 0px 0px 0px round 10px)" : "inset(0px 0px calc(100% - 36px) 0px round 10px)";
46
- }
47
- get openClipPath() {
48
- return "inset(0px 0px 0px 0px round 4px)";
49
- }
50
- get elevation() {
51
- return this.open ? 4 : this.lowered ? 1 : 3;
52
- }
53
- _applyContainerPosition() {
54
- let e = this._containerRef.value;
55
- if (!e) return;
56
- e.style.removeProperty("left"), e.style.removeProperty("right"), e.style.removeProperty("top"), e.style.removeProperty("bottom");
57
- let { x: t, y: n } = this._position;
58
- this._currentCorner.includes("right") ? e.style.right = `${t}px` : e.style.left = `${t}px`, this._currentCorner.includes("bottom") ? e.style.bottom = `${n + a.bottomOffset}px` : e.style.top = `${n}px`;
59
- }
60
- _loadPosition() {
61
- try {
62
- let e = localStorage.getItem(T + this.id);
63
- if (e) {
64
- let t = JSON.parse(e);
65
- this._position = {
66
- x: t.x,
67
- y: t.y
68
- }, this._currentCorner = t.anchor;
69
- }
70
- } catch {}
71
- }
72
- _savePosition() {
73
- try {
74
- localStorage.setItem(T + this.id, JSON.stringify({
75
- ...this._position,
76
- anchor: this._currentCorner
77
- }));
78
- } catch {}
79
- }
80
- _validateBounds() {
81
- let e = this._containerRef.value;
82
- if (!e) return;
83
- let t = e.getBoundingClientRect();
84
- if (t.width === 0) return;
85
- 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));
86
- this._position = {
87
- x: i ? n - c - t.width : c,
88
- y: a ? r - l - t.height : l
89
- }, this._applyContainerPosition();
90
- }
91
- _reorientToNearestCorner(e = !1) {
92
- let t = this._containerRef.value;
93
- if (!t) return;
94
- let r = t.getBoundingClientRect(), a = this._currentCorner.includes("bottom"), o = r.left + r.width / 2, s = a ? r.bottom - 18 : r.top + 18, c = o > window.innerWidth / 2 ? "right" : "left", l = `${s > window.innerHeight / 2 ? "bottom" : "top"}-${c}`;
95
- if (this._currentCorner = l, this._position = {
96
- x: 16,
97
- y: 16
98
- }, this._applyContainerPosition(), this.open || (t.style.clipPath = this.closedClipPath), e || i.value) return void this._savePosition();
99
- let u = t.getBoundingClientRect(), d = r.left - u.left, f = r.top - u.top;
100
- t.style.transform = `translate(${d}px, ${f}px)`, this._currentAnimation?.cancel();
101
- let p = t.animate([{ transform: t.style.transform }, { transform: "translate(0,0)" }], {
102
- duration: n.duration,
103
- easing: n.easingFallback,
104
- fill: "forwards"
105
- });
106
- this._currentAnimation = p, p.finished.then(() => {
107
- t.isConnected && (t.style.transform = "");
108
- }), this._savePosition();
109
- }
110
- _setupDrag() {
111
- let e = this._headerRef.value, t = this._containerRef.value;
112
- if (!e || !t) return;
113
- let n = !1;
114
- c(e, "pointerdown").pipe(o((e) => e.button === 0), p((t) => {
115
- t.preventDefault(), t.stopPropagation(), e.setPointerCapture(t.pointerId);
116
- }), l((e) => {
117
- let r = t.getBoundingClientRect(), i = this._currentCorner.includes("bottom"), a = this.open;
118
- return n = !1, {
119
- pointerId: e.pointerId,
120
- startX: e.clientX,
121
- startY: e.clientY,
122
- offsetX: e.clientX - r.left,
123
- offsetY: e.clientY - r.top,
124
- rect: r,
125
- isBottom: i,
126
- wasOpen: a
127
- };
128
- }), d(({ pointerId: e, startX: r, startY: i, offsetX: a, offsetY: l, rect: d, isBottom: m, wasOpen: h }) => {
129
- let g = (t) => t.pointerId === e, _ = c(window, "pointermove").pipe(o(g)), v = u(c(window, "pointerup"), c(window, "pointercancel")).pipe(o(g));
130
- return _.pipe(p(({ clientX: e, clientY: o }) => {
131
- let s = e - r, c = o - i;
132
- if (Math.sqrt(s * s + c * c) > 5 && !n && (n = !0, this.isDragging = !0, h)) {
133
- this._currentAnimation?.cancel(), this.open = !1, t.style.clipPath = this.closedClipPath, t.style.overflow = "hidden";
134
- let e = this._contentRef.value;
135
- e && (e.inert = !0, e.style.visibility = "hidden");
136
- }
137
- if (!n) return;
138
- let u = window.innerWidth, f = window.innerHeight, p = Math.max(0, Math.min(e - a, u - d.width)), g = m ? w - d.height : 0, _ = m ? f - d.height : f - w, v = Math.max(g, Math.min(o - l, _));
139
- this._position = {
140
- x: this._currentCorner.includes("right") ? u - p - d.width : p,
141
- y: m ? f - v - d.height : v
142
- }, this._applyContainerPosition();
143
- }), f(v), s(() => {
144
- n ? (this._reorientToNearestCorner(), this.isDragging = !1, n = !1) : (this.isDragging = !1, n = !1, this.toggle());
145
- }));
146
- }), f(this.disconnecting)).subscribe();
147
- }
148
- connectedCallback() {
149
- super.connectedCallback(), c(window, "resize").pipe(f(this.disconnecting)).subscribe(() => this._validateBounds()), a.bottomOffset$.pipe(p(() => this._applyContainerPosition()), f(this.disconnecting)).subscribe();
150
- }
151
- firstUpdated() {
152
- this._currentCorner = this.corner, this._loadPosition();
153
- let e = this._containerRef.value, t = this._contentRef.value;
154
- e && (this._applyContainerPosition(), this.open ? (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")), this._setupDrag());
155
- }
156
- disconnectedCallback() {
157
- super.disconnectedCallback(), this._currentAnimation?.cancel();
158
- }
159
- async _animateOpen() {
160
- let e = this._containerRef.value, t = this._contentRef.value;
161
- if (!e) return;
162
- if (t && (t.style.visibility = "visible", t.inert = !1), this.open = !0, await this.updateComplete, i.value) return e.style.clipPath = "", e.style.overflow = "", void this.dispatchScopedEvent("toggle", "expanded");
163
- this._currentAnimation?.cancel(), e.style.overflow = "hidden";
164
- let r = [{
165
- clipPath: this.closedClipPath,
166
- opacity: .85
167
- }, {
168
- clipPath: this.openClipPath,
169
- opacity: 1
170
- }], a = e.animate(r, {
171
- duration: n.duration,
172
- easing: n.easingFallback,
173
- fill: "forwards"
174
- });
175
- this._currentAnimation = a, a.finished.then(() => {
176
- e.isConnected && (e.style.clipPath = "", e.style.overflow = "");
177
- }), this.dispatchScopedEvent("toggle", "expanded");
178
- }
179
- async _animateClose() {
180
- let e = this._containerRef.value;
181
- if (!e) return;
182
- if (i.value) {
183
- e.style.clipPath = this.closedClipPath, e.style.overflow = "hidden", this.open = !1;
184
- let t = this._contentRef.value;
185
- t && (t.inert = !0, t.style.visibility = "hidden"), this.dispatchScopedEvent("toggle", "collapsed");
186
- return;
187
- }
188
- this._currentAnimation?.cancel(), e.style.overflow = "hidden";
189
- let t = [{
190
- clipPath: this.openClipPath,
191
- opacity: 1
192
- }, {
193
- clipPath: this.closedClipPath,
194
- opacity: .85
195
- }], n = e.animate(t, {
196
- duration: Math.round(.9 * r.duration),
197
- easing: "cubic-bezier(0.4, 0, 0.8, 0.15)",
198
- fill: "forwards"
199
- });
200
- this._currentAnimation = n, await n.finished, this.open = !1;
201
- let a = this._contentRef.value;
202
- a && (a.inert = !0, a.style.visibility = "hidden"), this.dispatchScopedEvent("toggle", "collapsed");
203
- }
204
- toggle() {
205
- this.open ? this._animateClose() : this._animateOpen();
206
- }
207
- expand() {
208
- this.open || (this.removeAttribute("hidden"), this._containerRef.value ? this._animateOpen() : this.open = !0);
209
- }
210
- show() {
211
- this.expand();
212
- }
213
- close() {
214
- this.open && (this._containerRef.value ? this._animateClose() : this.open = !1);
215
- }
216
- render() {
217
- let e = this._currentCorner.startsWith("bottom"), t = m({
218
- flex: !0,
219
- "flex-col": e,
220
- "flex-col-reverse": !e,
221
- "will-change-[clip-path]": !0,
222
- "z-1000": !0,
223
- rounded: this.open,
224
- "rounded-lg": !this.open,
225
- "overflow-hidden": !0,
226
- "opacity-85": this.isDragging,
227
- "scale-95": this.isDragging
228
- }), n = h({
229
- position: "fixed",
230
- width: this.panelWidth,
231
- "max-height": "calc(100vh - 32px)",
232
- "pointer-events": "none"
233
- }), r = h({ "pointer-events": this.open ? "auto" : "none" }), i = m({
234
- "h-full": !0,
235
- "px-3": !0,
236
- flex: !0,
237
- "items-center": !0,
238
- "gap-2": !0,
239
- "select-none": !0,
240
- "touch-none": !0,
241
- "cursor-grabbing": this.isDragging,
242
- "cursor-move": !this.isDragging,
243
- "transition-opacity": !0,
244
- "duration-200": !0
245
- });
246
- return b`
247
- <!-- schmancy-surface owns background color and elevation-based shadow.
248
- Position is managed imperatively via _applyContainerPosition(). -->
249
- <schmancy-surface
250
- ${S(this._containerRef)}
251
- type="glass"
252
- .elevation=${this.elevation}
253
- class=${t}
254
- style=${n}
255
- aria-expanded=${this.open}
256
- >
257
- <!-- Content section (visually above header for bottom corners) -->
258
- <section
259
- ${S(this._contentRef)}
260
- class="flex-1 min-h-0 overflow-hidden flex flex-col"
261
- style=${r}
262
- role="dialog"
263
- aria-label="${this.label ?? "Floating panel"}"
264
- >
265
- <schmancy-surface type="solid" class="flex flex-col flex-1 min-h-0 overflow-hidden">
266
- <schmancy-scroll hide class="flex-1">
267
- <slot></slot>
268
- </schmancy-scroll>
269
- </schmancy-surface>
270
- </section>
271
-
272
- <!-- Header / FAB section — always interactive, always visible -->
273
- <section
274
- class="shrink-0 bg-surface-containerLowest relative"
275
- style=${h({
276
- "pointer-events": "auto",
277
- height: "36px"
278
- })}
279
- >
280
- <!-- 1px top inner highlight — reads as a lit edge when open, instrument-panel HUD accent -->
281
- ${C(this.open, () => b`<div
282
- class="absolute inset-x-0 top-0 h-px bg-linear-to-r from-transparent via-primary-default/40 to-transparent pointer-events-none"
283
- ></div>`)}
284
- <div
285
- ${S(this._headerRef)}
286
- class=${i}
287
- title="Drag to move"
288
- aria-label="Drag to reposition panel"
289
- >
290
- <!-- Grip indicator: only visible when collapsed, signals "this is a handle" -->
291
- ${C(!this.open, () => b`<div
292
- class="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-6 h-0.5 rounded-full bg-on-surface/20 pointer-events-none"
293
- style="z-index:0"
294
- ></div>`)}
295
-
296
- <!-- Summary slot rendered once — avoids DOM teardown on toggle -->
297
- <div class="flex-1 min-w-0 relative" style="z-index:1">
298
- <slot name="summary"></slot>
299
- </div>
300
-
301
- <!-- Toggle button: chevron up/down matches open/close direction per corner -->
302
- ${C(this.open, () => b`
303
- <schmancy-icon-button
304
- size="sm"
305
- variant="text"
306
- @click=${(e) => {
307
- e.stopPropagation(), this.close();
308
- }}
309
- title="Collapse"
310
- >
311
- ${e ? "expand_more" : "expand_less"}
312
- </schmancy-icon-button>
313
- `, () => b`
314
- <schmancy-icon-button
315
- size="sm"
316
- variant="text"
317
- @click=${(e) => {
318
- e.stopPropagation(), this.expand();
319
- }}
320
- title="Expand"
321
- >
322
- ${e ? "expand_less" : "expand_more"}
323
- </schmancy-icon-button>
324
- `)}
325
- </div>
326
- </section>
327
- </schmancy-surface>
328
- `;
329
- }
330
- };
331
- t([_({ type: String })], E.prototype, "id", void 0), t([_({ type: String })], E.prototype, "icon", void 0), t([_({ type: String })], E.prototype, "label", void 0), t([_({ type: String })], E.prototype, "expandedWidth", void 0), t([_({
332
- type: Boolean,
333
- reflect: !0
334
- })], E.prototype, "lowered", void 0), t([_({ type: String })], E.prototype, "corner", void 0), t([_({
335
- type: Boolean,
336
- reflect: !0
337
- })], E.prototype, "open", void 0), t([v()], E.prototype, "isDragging", void 0), t([v()], E.prototype, "_currentCorner", void 0);
338
- var D = E = t([g("schmancy-boat")], E);
339
- export { D as t };
@@ -1 +0,0 @@
1
- {"version":3,"file":"boat-CEaQaCmG.js","names":[],"sources":["../src/boat/boat.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html } 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 { when } from 'lit/directives/when.js'\nimport { filter, finalize, fromEvent, map, merge, switchMap, takeUntil, tap } from 'rxjs'\nimport { SPRING_SMOOTH, SPRING_SNAPPY } from '../utils/animation.js'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport { theme } from '../theme/theme.service.js'\n\nconst FAB_HEIGHT = 36\nconst DRAG_THRESHOLD = 5\nconst POSITION_STORAGE_KEY_PREFIX = 'schmancy-boat-'\n\ntype Corner = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\ntype BoatState = 'collapsed' | 'expanded'\ninterface Position {\n\tx: number\n\ty: number\n}\n\n@customElement('schmancy-boat')\nexport default class SchmancyBoat 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@property({ type: String }) icon?: string\n\t@property({ type: String }) label?: string\n\t/** Override the expanded panel width (e.g. '320px', '24rem'). Defaults to responsive sizing. */\n\t@property({ type: String }) expandedWidth?: string\n\t/** When true, uses a lower elevation shadow in the minimized (FAB) state. */\n\t@property({ type: Boolean, reflect: true }) lowered: boolean = false\n\t/** Corner the boat is anchored to. */\n\t@property({ type: String }) corner: Corner = 'bottom-right'\n\t/** Whether the panel is open. */\n\t@property({ type: Boolean, reflect: true }) open: boolean = false\n\n\t/**\n\t * State property.\n\t * Maps 'expanded' → open=true, 'collapsed' → open=false (FAB visible).\n\t */\n\tget state(): BoatState {\n\t\treturn this.open ? 'expanded' : 'collapsed'\n\t}\n\tset state(val: BoatState) {\n\t\tif (val === 'expanded') {\n\t\t\tthis.expand()\n\t\t} else {\n\t\t\t// collapsed\n\t\t\tthis.close()\n\t\t}\n\t}\n\n\t// Internal drag state (triggers re-render for cursor class)\n\t@state() private isDragging = false\n\n\t// Internal position — plain fields, updated directly during drag (no re-render needed)\n\tprivate _position: Position = { x: 16, y: 16 }\n\t@state() private _currentCorner: Corner = 'bottom-right'\n\n\t// Refs\n\tprivate _containerRef = createRef<HTMLElement>()\n\tprivate _contentRef = createRef<HTMLElement>()\n\tprivate _headerRef = createRef<HTMLElement>()\n\tprivate _currentAnimation?: Animation\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% - ${FAB_HEIGHT}px) 0px 0px 0px round 10px)`\n\t\t\t: `inset(0px 0px calc(100% - ${FAB_HEIGHT}px) 0px round 10px)`\n\t}\n\n\tprivate get openClipPath(): string {\n\t\treturn 'inset(0px 0px 0px 0px round 4px)'\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\tcontainer.style.removeProperty('left')\n\t\tcontainer.style.removeProperty('right')\n\t\tcontainer.style.removeProperty('top')\n\t\tcontainer.style.removeProperty('bottom')\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 _loadPosition() {\n\t\ttry {\n\t\t\tconst saved = localStorage.getItem(POSITION_STORAGE_KEY_PREFIX + this.id)\n\t\t\tif (saved) {\n\t\t\t\tconst parsed = JSON.parse(saved) as { x: number; y: number; anchor: Corner }\n\t\t\t\tthis._position = { x: parsed.x, y: parsed.y }\n\t\t\t\tthis._currentCorner = parsed.anchor\n\t\t\t}\n\t\t} catch {\n\t\t\t// ignore localStorage errors\n\t\t}\n\t}\n\n\tprivate _savePosition() {\n\t\ttry {\n\t\t\tlocalStorage.setItem(\n\t\t\t\tPOSITION_STORAGE_KEY_PREFIX + this.id,\n\t\t\t\tJSON.stringify({ ...this._position, anchor: this._currentCorner }),\n\t\t\t)\n\t\t} catch {\n\t\t\t// ignore localStorage errors\n\t\t}\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\n\t// ============================================\n\t// CORNER SNAPPING\n\t// ============================================\n\n\tprivate _reorientToNearestCorner(skipAnimation = false): void {\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 FAB visual center (container is always collapsed during drag)\n\t\tconst currentIsBottom = this._currentCorner.includes('bottom')\n\t\tconst fabCenterX = rect.left + rect.width / 2\n\t\tconst fabCenterY = currentIsBottom\n\t\t\t? rect.bottom - FAB_HEIGHT / 2\n\t\t\t: rect.top + FAB_HEIGHT / 2\n\t\tconst side = fabCenterX > window.innerWidth / 2 ? 'right' : 'left'\n\t\tconst vert = fabCenterY > window.innerHeight / 2 ? 'bottom' : 'top'\n\t\tconst newCorner: Corner = `${vert}-${side}` as Corner\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 — managed imperatively, not via styleMap\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\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.transform = `translate(${dx}px, ${dy}px)`\n\n\t\t// P — play: animate from the inverse offset to natural resting position\n\t\tthis._currentAnimation?.cancel()\n\t\tconst anim = container.animate(\n\t\t\t[{ transform: container.style.transform }, { transform: 'translate(0,0)' }],\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\tthis._currentAnimation = anim\n\t\tanim.finished.then(() => {\n\t\t\tif (container.isConnected) {\n\t\t\t\tcontainer.style.transform = ''\n\t\t\t}\n\t\t\treturn\n\t\t})\n\n\t\tthis._savePosition()\n\t}\n\n\t// ============================================\n\t// DRAG PIPELINE\n\t// ============================================\n\n\tprivate _setupDrag() {\n\t\tconst header = this._headerRef.value\n\t\tconst container = this._containerRef.value\n\t\tif (!header || !container) return\n\n\t\tlet didDrag = false\n\n\t\tfromEvent<PointerEvent>(header, 'pointerdown')\n\t\t\t.pipe(\n\t\t\t\tfilter(e => e.button === 0),\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\theader.setPointerCapture(e.pointerId)\n\t\t\t\t}),\n\t\t\t\tmap(e => {\n\t\t\t\t\tconst rect = container.getBoundingClientRect()\n\t\t\t\t\tconst isBottom = this._currentCorner.includes('bottom')\n\t\t\t\t\tconst wasOpen = this.open\n\t\t\t\t\tdidDrag = false\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpointerId: e.pointerId,\n\t\t\t\t\t\tstartX: e.clientX,\n\t\t\t\t\t\tstartY: e.clientY,\n\t\t\t\t\t\toffsetX: e.clientX - rect.left,\n\t\t\t\t\t\toffsetY: e.clientY - rect.top,\n\t\t\t\t\t\trect,\n\t\t\t\t\t\tisBottom,\n\t\t\t\t\t\twasOpen,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tswitchMap(({ pointerId, startX, startY, offsetX, offsetY, rect, isBottom, wasOpen }) => {\n\t\t\t\t\tconst sameId = (e: PointerEvent) => e.pointerId === pointerId\n\t\t\t\t\tconst move$ = fromEvent<PointerEvent>(window, 'pointermove').pipe(filter(sameId))\n\t\t\t\t\tconst end$ = merge(\n\t\t\t\t\t\tfromEvent<PointerEvent>(window, 'pointerup'),\n\t\t\t\t\t\tfromEvent<PointerEvent>(window, 'pointercancel'),\n\t\t\t\t\t).pipe(filter(sameId))\n\n\t\t\t\t\treturn move$.pipe(\n\t\t\t\t\t\ttap(({ clientX, clientY }) => {\n\t\t\t\t\t\t\tconst dx = clientX - startX\n\t\t\t\t\t\t\tconst dy = clientY - startY\n\t\t\t\t\t\t\tif (Math.sqrt(dx * dx + dy * dy) > DRAG_THRESHOLD && !didDrag) {\n\t\t\t\t\t\t\t\tdidDrag = true\n\t\t\t\t\t\t\t\tthis.isDragging = true\n\t\t\t\t\t\t\t\t// Collapse on first confirmed drag move (not on click)\n\t\t\t\t\t\t\t\tif (wasOpen) {\n\t\t\t\t\t\t\t\t\tthis._currentAnimation?.cancel()\n\t\t\t\t\t\t\t\t\tthis.open = false\n\t\t\t\t\t\t\t\t\tcontainer.style.clipPath = this.closedClipPath\n\t\t\t\t\t\t\t\t\tcontainer.style.overflow = 'hidden'\n\t\t\t\t\t\t\t\t\tconst content = this._contentRef.value\n\t\t\t\t\t\t\t\t\tif (content) {\n\t\t\t\t\t\t\t\t\t\tcontent.inert = true\n\t\t\t\t\t\t\t\t\t\tcontent.style.visibility = 'hidden'\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}\n\t\t\t\t\t\t\tif (!didDrag) return\n\n\t\t\t\t\t\t\tconst vw = window.innerWidth\n\t\t\t\t\t\t\tconst vh = window.innerHeight\n\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// Allow container to go partially off-screen so FAB stays reachable at all edges\n\t\t\t\t\t\t\tconst minTop = isBottom ? FAB_HEIGHT - rect.height : 0\n\t\t\t\t\t\t\tconst maxTop = isBottom ? vh - rect.height : vh - FAB_HEIGHT\n\t\t\t\t\t\t\tconst top = Math.max(minTop, Math.min(clientY - offsetY, maxTop))\n\n\t\t\t\t\t\t\tthis._position = {\n\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\ty: isBottom ? vh - top - rect.height : top,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis._applyContainerPosition()\n\t\t\t\t\t\t}),\n\t\t\t\t\t\ttakeUntil(end$),\n\t\t\t\t\t\tfinalize(() => {\n\t\t\t\t\t\t\tif (didDrag) {\n\t\t\t\t\t\t\t\tthis._reorientToNearestCorner()\n\t\t\t\t\t\t\t\tthis.isDragging = false\n\t\t\t\t\t\t\t\tdidDrag = false\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.isDragging = false\n\t\t\t\t\t\t\t\tdidDrag = false\n\t\t\t\t\t\t\t\tthis.toggle()\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\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\t// ============================================\n\t// LIFECYCLE\n\t// ============================================\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\tfromEvent(window, 'resize')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(() => this._validateBounds())\n\n\t\ttheme.bottomOffset$.pipe(\n\t\t\ttap(() => this._applyContainerPosition()),\n\t\t\ttakeUntil(this.disconnecting),\n\t\t).subscribe()\n\t}\n\n\tfirstUpdated() {\n\t\t// Initialize corner from property\n\t\tthis._currentCorner = this.corner\n\n\t\t// Load saved drag position from localStorage\n\t\tthis._loadPosition()\n\n\t\tconst container = this._containerRef.value\n\t\tconst content = this._contentRef.value\n\t\tif (!container) return\n\n\t\t// Apply initial position\n\t\tthis._applyContainerPosition()\n\n\t\t// Set initial open/closed visual state\n\t\tif (this.open) {\n\t\t\tcontainer.style.overflow = ''\n\t\t\tif (content) {\n\t\t\t\tcontent.inert = false\n\t\t\t\tcontent.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 (content) {\n\t\t\t\tcontent.inert = true\n\t\t\t\tcontent.style.visibility = 'hidden'\n\t\t\t}\n\t\t}\n\n\t\t// Set up drag\n\t\tthis._setupDrag()\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tthis._currentAnimation?.cancel()\n\t}\n\n\t// ============================================\n\t// ANIMATION\n\t// ============================================\n\n\tprivate async _animateOpen(): Promise<void> {\n\t\tconst container = this._containerRef.value\n\t\tconst content = this._contentRef.value\n\t\tif (!container) return\n\n\t\tif (content) {\n\t\t\tcontent.style.visibility = 'visible'\n\t\t\tcontent.inert = false\n\t\t}\n\n\t\tthis.open = true\n\t\tawait this.updateComplete\n\n\t\tif (reducedMotion$.value) {\n\t\t\tcontainer.style.clipPath = ''\n\t\t\tcontainer.style.overflow = ''\n\t\t\tthis.dispatchScopedEvent('toggle', 'expanded')\n\t\t\treturn\n\t\t}\n\n\t\tthis._currentAnimation?.cancel()\n\t\tcontainer.style.overflow = 'hidden'\n\n\t\tconst openKeyframes: Keyframe[] = [\n\t\t\t{ clipPath: this.closedClipPath, opacity: 0.85 },\n\t\t\t{ clipPath: this.openClipPath, opacity: 1 },\n\t\t]\n\t\tconst anim = container.animate(openKeyframes, {\n\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\tfill: 'forwards',\n\t\t})\n\t\tthis._currentAnimation = anim\n\n\t\t// Clear clip-path so overflow/scroll work normally after animation\n\t\tanim.finished.then(() => {\n\t\t\tif (container.isConnected) {\n\t\t\t\tcontainer.style.clipPath = ''\n\t\t\t\tcontainer.style.overflow = ''\n\t\t\t}\n\t\t\treturn\n\t\t})\n\n\t\tthis.dispatchScopedEvent('toggle', 'expanded')\n\t}\n\n\tprivate async _animateClose(): Promise<void> {\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 content = this._contentRef.value\n\t\t\tif (content) {\n\t\t\t\tcontent.inert = true\n\t\t\t\tcontent.style.visibility = 'hidden'\n\t\t\t}\n\t\t\tthis.dispatchScopedEvent('toggle', 'collapsed')\n\t\t\treturn\n\t\t}\n\n\t\tthis._currentAnimation?.cancel()\n\t\tcontainer.style.overflow = 'hidden'\n\n\t\tconst closeKeyframes: Keyframe[] = [\n\t\t\t{ clipPath: this.openClipPath, opacity: 1 },\n\t\t\t{ clipPath: this.closedClipPath, opacity: 0.85 },\n\t\t]\n\t\tconst anim = container.animate(closeKeyframes, {\n\t\t\tduration: Math.round(SPRING_SNAPPY.duration * 0.9),\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\tawait anim.finished\n\n\t\tthis.open = false\n\n\t\tconst content = this._contentRef.value\n\t\tif (content) {\n\t\t\tcontent.inert = true\n\t\t\tcontent.style.visibility = 'hidden'\n\t\t}\n\n\t\tthis.dispatchScopedEvent('toggle', 'collapsed')\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.removeAttribute('hidden')\n\t\tif (!this._containerRef.value) {\n\t\t\tthis.open = true\n\t\t\treturn\n\t\t}\n\t\tthis._animateOpen()\n\t}\n\n\t/** Alias for expand() — kept for backwards compatibility. */\n\tshow() {\n\t\tthis.expand()\n\t}\n\n\tclose() {\n\t\tif (!this.open) return\n\t\tif (!this._containerRef.value) {\n\t\t\tthis.open = false\n\t\t\treturn\n\t\t}\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\tflex: true,\n\t\t\t'flex-col': isBottom,\n\t\t\t'flex-col-reverse': !isBottom,\n\t\t\t'will-change-[clip-path]': true,\n\t\t\t'z-1000': true,\n\t\t\t// open: 4px radius (instrument-sharp); closed: 10px (status-bar pill)\n\t\t\t'rounded': this.open,\n\t\t\t'rounded-lg': !this.open,\n\t\t\t'overflow-hidden': true,\n\t\t\t// micro-scale + reduced opacity signals lift during drag\n\t\t\t'opacity-85': this.isDragging,\n\t\t\t'scale-95': this.isDragging,\n\t\t})\n\n\t\tconst containerStyles = styleMap({\n\t\t\tposition: 'fixed',\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 contentStyles = styleMap({\n\t\t\t'pointer-events': this.open ? 'auto' : 'none',\n\t\t})\n\n\t\tconst headerClasses = 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'touch-none': true,\n\t\t\t'cursor-grabbing': this.isDragging,\n\t\t\t'cursor-move': !this.isDragging,\n\t\t\t'transition-opacity': true,\n\t\t\t'duration-200': true,\n\t\t})\n\n\t\treturn html`\n\t\t\t<!-- schmancy-surface owns background color and elevation-based shadow.\n\t\t\t Position is managed imperatively via _applyContainerPosition(). -->\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>\n\t\t\t\t<!-- Content section (visually above header for bottom corners) -->\n\t\t\t\t<section\n\t\t\t\t\t${ref(this._contentRef)}\n\t\t\t\t\tclass=\"flex-1 min-h-0 overflow-hidden flex flex-col\"\n\t\t\t\t\tstyle=${contentStyles}\n\t\t\t\t\trole=\"dialog\"\n\t\t\t\t\taria-label=\"${this.label ?? 'Floating panel'}\"\n\t\t\t\t>\n\t\t\t\t\t<schmancy-surface type=\"solid\" class=\"flex flex-col flex-1 min-h-0 overflow-hidden\">\n\t\t\t\t\t\t<schmancy-scroll hide class=\"flex-1\">\n\t\t\t\t\t\t\t<slot></slot>\n\t\t\t\t\t\t</schmancy-scroll>\n\t\t\t\t\t</schmancy-surface>\n\t\t\t\t</section>\n\n\t\t\t\t<!-- Header / FAB section — always interactive, always visible -->\n\t\t\t\t<section\n\t\t\t\t\tclass=\"shrink-0 bg-surface-containerLowest relative\"\n\t\t\t\t\tstyle=${styleMap({ 'pointer-events': 'auto', height: `${FAB_HEIGHT}px` })}\n\t\t\t\t>\n\t\t\t\t\t<!-- 1px top inner highlight — reads as a lit edge when open, instrument-panel HUD accent -->\n\t\t\t\t\t${when(\n\t\t\t\t\t\tthis.open,\n\t\t\t\t\t\t() => html`<div\n\t\t\t\t\t\t\tclass=\"absolute inset-x-0 top-0 h-px bg-linear-to-r from-transparent via-primary-default/40 to-transparent pointer-events-none\"\n\t\t\t\t\t\t></div>`,\n\t\t\t\t\t)}\n\t\t\t\t\t<div\n\t\t\t\t\t\t${ref(this._headerRef)}\n\t\t\t\t\t\tclass=${headerClasses}\n\t\t\t\t\t\ttitle=\"Drag to move\"\n\t\t\t\t\t\taria-label=\"Drag to reposition panel\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<!-- Grip indicator: only visible when collapsed, signals \"this is a handle\" -->\n\t\t\t\t\t\t${when(\n\t\t\t\t\t\t\t!this.open,\n\t\t\t\t\t\t\t() => html`<div\n\t\t\t\t\t\t\t\tclass=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-6 h-0.5 rounded-full bg-on-surface/20 pointer-events-none\"\n\t\t\t\t\t\t\t\tstyle=\"z-index:0\"\n\t\t\t\t\t\t\t></div>`,\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t<!-- Summary slot rendered once — avoids DOM teardown on toggle -->\n\t\t\t\t\t\t<div class=\"flex-1 min-w-0 relative\" style=\"z-index:1\">\n\t\t\t\t\t\t\t<slot name=\"summary\"></slot>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- Toggle button: chevron up/down matches open/close direction per corner -->\n\t\t\t\t\t\t${when(\n\t\t\t\t\t\t\tthis.open,\n\t\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t\t<schmancy-icon-button\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\tvariant=\"text\"\n\t\t\t\t\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ttitle=\"Collapse\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t${isBottom ? 'expand_more' : 'expand_less'}\n\t\t\t\t\t\t\t\t</schmancy-icon-button>\n\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t\t<schmancy-icon-button\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\tvariant=\"text\"\n\t\t\t\t\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\t\t\t\tthis.expand()\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ttitle=\"Expand\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t${isBottom ? 'expand_less' : 'expand_more'}\n\t\t\t\t\t\t\t\t</schmancy-icon-button>\n\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t)}\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-boat': SchmancyBoat\n\t}\n}\n"],"mappings":"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"}
@@ -1,85 +0,0 @@
1
- require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-D8_z9JrW.cjs`);require(`./mixins-JyO9GSGy.cjs`);const t=require(`./animation-CCOIW4wJ.cjs`),n=require(`./reduced-motion-Ds-HjMzn.cjs`),r=require(`./theme.service-LtQw04e6.cjs`);let i=require(`rxjs`),a=require(`lit/directives/class-map.js`),o=require(`lit/directives/style-map.js`),s=require(`lit/decorators.js`),c=require(`lit`),l=require(`lit/directives/ref.js`),u=require(`lit/directives/when.js`);var d=36,f=`schmancy-boat-`,p=class extends e.t{constructor(...e){super(...e),this.id=`default`,this.lowered=!1,this.corner=`bottom-right`,this.open=!1,this.isDragging=!1,this._position={x:16,y:16},this._currentCorner=`bottom-right`,this._containerRef=(0,l.createRef)(),this._contentRef=(0,l.createRef)(),this._headerRef=(0,l.createRef)()}static{this.styles=[c.css`
2
- :host {
3
- display: contents;
4
- position: relative;
5
- z-index: 1000;
6
- }
7
- :host([hidden]) {
8
- display: none !important;
9
- }
10
- `]}get state(){return this.open?`expanded`:`collapsed`}set state(e){e===`expanded`?this.expand():this.close()}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% - 36px) 0px 0px 0px round 10px)`:`inset(0px 0px calc(100% - 36px) 0px round 10px)`}get openClipPath(){return`inset(0px 0px 0px 0px round 4px)`}get elevation(){return this.open?4:this.lowered?1:3}_applyContainerPosition(){let e=this._containerRef.value;if(!e)return;e.style.removeProperty(`left`),e.style.removeProperty(`right`),e.style.removeProperty(`top`),e.style.removeProperty(`bottom`);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+r.n.bottomOffset}px`:e.style.top=`${n}px`}_loadPosition(){try{let e=localStorage.getItem(f+this.id);if(e){let t=JSON.parse(e);this._position={x:t.x,y:t.y},this._currentCorner=t.anchor}}catch{}}_savePosition(){try{localStorage.setItem(f+this.id,JSON.stringify({...this._position,anchor:this._currentCorner}))}catch{}}_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){let r=this._containerRef.value;if(!r)return;let i=r.getBoundingClientRect(),a=this._currentCorner.includes(`bottom`),o=i.left+i.width/2,s=a?i.bottom-18:i.top+18,c=o>window.innerWidth/2?`right`:`left`,l=`${s>window.innerHeight/2?`bottom`:`top`}-${c}`;if(this._currentCorner=l,this._position={x:16,y:16},this._applyContainerPosition(),this.open||(r.style.clipPath=this.closedClipPath),e||n.t.value)return void this._savePosition();let u=r.getBoundingClientRect(),d=i.left-u.left,f=i.top-u.top;r.style.transform=`translate(${d}px, ${f}px)`,this._currentAnimation?.cancel();let p=r.animate([{transform:r.style.transform},{transform:`translate(0,0)`}],{duration:t.d.duration,easing:t.d.easingFallback,fill:`forwards`});this._currentAnimation=p,p.finished.then(()=>{r.isConnected&&(r.style.transform=``)}),this._savePosition()}_setupDrag(){let e=this._headerRef.value,t=this._containerRef.value;if(!e||!t)return;let n=!1;(0,i.fromEvent)(e,`pointerdown`).pipe((0,i.filter)(e=>e.button===0),(0,i.tap)(t=>{t.preventDefault(),t.stopPropagation(),e.setPointerCapture(t.pointerId)}),(0,i.map)(e=>{let r=t.getBoundingClientRect(),i=this._currentCorner.includes(`bottom`),a=this.open;return n=!1,{pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,offsetX:e.clientX-r.left,offsetY:e.clientY-r.top,rect:r,isBottom:i,wasOpen:a}}),(0,i.switchMap)(({pointerId:e,startX:r,startY:a,offsetX:o,offsetY:s,rect:c,isBottom:l,wasOpen:u})=>{let f=t=>t.pointerId===e,p=(0,i.fromEvent)(window,`pointermove`).pipe((0,i.filter)(f)),m=(0,i.merge)((0,i.fromEvent)(window,`pointerup`),(0,i.fromEvent)(window,`pointercancel`)).pipe((0,i.filter)(f));return p.pipe((0,i.tap)(({clientX:e,clientY:i})=>{let f=e-r,p=i-a;if(Math.sqrt(f*f+p*p)>5&&!n&&(n=!0,this.isDragging=!0,u)){this._currentAnimation?.cancel(),this.open=!1,t.style.clipPath=this.closedClipPath,t.style.overflow=`hidden`;let e=this._contentRef.value;e&&(e.inert=!0,e.style.visibility=`hidden`)}if(!n)return;let m=window.innerWidth,h=window.innerHeight,g=Math.max(0,Math.min(e-o,m-c.width)),_=l?d-c.height:0,v=l?h-c.height:h-d,y=Math.max(_,Math.min(i-s,v));this._position={x:this._currentCorner.includes(`right`)?m-g-c.width:g,y:l?h-y-c.height:y},this._applyContainerPosition()}),(0,i.takeUntil)(m),(0,i.finalize)(()=>{n?(this._reorientToNearestCorner(),this.isDragging=!1,n=!1):(this.isDragging=!1,n=!1,this.toggle())}))}),(0,i.takeUntil)(this.disconnecting)).subscribe()}connectedCallback(){super.connectedCallback(),(0,i.fromEvent)(window,`resize`).pipe((0,i.takeUntil)(this.disconnecting)).subscribe(()=>this._validateBounds()),r.n.bottomOffset$.pipe((0,i.tap)(()=>this._applyContainerPosition()),(0,i.takeUntil)(this.disconnecting)).subscribe()}firstUpdated(){this._currentCorner=this.corner,this._loadPosition();let e=this._containerRef.value,t=this._contentRef.value;e&&(this._applyContainerPosition(),this.open?(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`)),this._setupDrag())}disconnectedCallback(){super.disconnectedCallback(),this._currentAnimation?.cancel()}async _animateOpen(){let e=this._containerRef.value,r=this._contentRef.value;if(!e)return;if(r&&(r.style.visibility=`visible`,r.inert=!1),this.open=!0,await this.updateComplete,n.t.value)return e.style.clipPath=``,e.style.overflow=``,void this.dispatchScopedEvent(`toggle`,`expanded`);this._currentAnimation?.cancel(),e.style.overflow=`hidden`;let i=[{clipPath:this.closedClipPath,opacity:.85},{clipPath:this.openClipPath,opacity:1}],a=e.animate(i,{duration:t.d.duration,easing:t.d.easingFallback,fill:`forwards`});this._currentAnimation=a,a.finished.then(()=>{e.isConnected&&(e.style.clipPath=``,e.style.overflow=``)}),this.dispatchScopedEvent(`toggle`,`expanded`)}async _animateClose(){let e=this._containerRef.value;if(!e)return;if(n.t.value){e.style.clipPath=this.closedClipPath,e.style.overflow=`hidden`,this.open=!1;let t=this._contentRef.value;t&&(t.inert=!0,t.style.visibility=`hidden`),this.dispatchScopedEvent(`toggle`,`collapsed`);return}this._currentAnimation?.cancel(),e.style.overflow=`hidden`;let r=[{clipPath:this.openClipPath,opacity:1},{clipPath:this.closedClipPath,opacity:.85}],i=e.animate(r,{duration:Math.round(.9*t.f.duration),easing:`cubic-bezier(0.4, 0, 0.8, 0.15)`,fill:`forwards`});this._currentAnimation=i,await i.finished,this.open=!1;let a=this._contentRef.value;a&&(a.inert=!0,a.style.visibility=`hidden`),this.dispatchScopedEvent(`toggle`,`collapsed`)}toggle(){this.open?this._animateClose():this._animateOpen()}expand(){this.open||(this.removeAttribute(`hidden`),this._containerRef.value?this._animateOpen():this.open=!0)}show(){this.expand()}close(){this.open&&(this._containerRef.value?this._animateClose():this.open=!1)}render(){let e=this._currentCorner.startsWith(`bottom`),t=(0,a.classMap)({flex:!0,"flex-col":e,"flex-col-reverse":!e,"will-change-[clip-path]":!0,"z-1000":!0,rounded:this.open,"rounded-lg":!this.open,"overflow-hidden":!0,"opacity-85":this.isDragging,"scale-95":this.isDragging}),n=(0,o.styleMap)({position:`fixed`,width:this.panelWidth,"max-height":`calc(100vh - 32px)`,"pointer-events":`none`}),r=(0,o.styleMap)({"pointer-events":this.open?`auto`:`none`}),i=(0,a.classMap)({"h-full":!0,"px-3":!0,flex:!0,"items-center":!0,"gap-2":!0,"select-none":!0,"touch-none":!0,"cursor-grabbing":this.isDragging,"cursor-move":!this.isDragging,"transition-opacity":!0,"duration-200":!0});return c.html`
11
- <!-- schmancy-surface owns background color and elevation-based shadow.
12
- Position is managed imperatively via _applyContainerPosition(). -->
13
- <schmancy-surface
14
- ${(0,l.ref)(this._containerRef)}
15
- type="glass"
16
- .elevation=${this.elevation}
17
- class=${t}
18
- style=${n}
19
- aria-expanded=${this.open}
20
- >
21
- <!-- Content section (visually above header for bottom corners) -->
22
- <section
23
- ${(0,l.ref)(this._contentRef)}
24
- class="flex-1 min-h-0 overflow-hidden flex flex-col"
25
- style=${r}
26
- role="dialog"
27
- aria-label="${this.label??`Floating panel`}"
28
- >
29
- <schmancy-surface type="solid" class="flex flex-col flex-1 min-h-0 overflow-hidden">
30
- <schmancy-scroll hide class="flex-1">
31
- <slot></slot>
32
- </schmancy-scroll>
33
- </schmancy-surface>
34
- </section>
35
-
36
- <!-- Header / FAB section — always interactive, always visible -->
37
- <section
38
- class="shrink-0 bg-surface-containerLowest relative"
39
- style=${(0,o.styleMap)({"pointer-events":`auto`,height:`36px`})}
40
- >
41
- <!-- 1px top inner highlight — reads as a lit edge when open, instrument-panel HUD accent -->
42
- ${(0,u.when)(this.open,()=>c.html`<div
43
- class="absolute inset-x-0 top-0 h-px bg-linear-to-r from-transparent via-primary-default/40 to-transparent pointer-events-none"
44
- ></div>`)}
45
- <div
46
- ${(0,l.ref)(this._headerRef)}
47
- class=${i}
48
- title="Drag to move"
49
- aria-label="Drag to reposition panel"
50
- >
51
- <!-- Grip indicator: only visible when collapsed, signals "this is a handle" -->
52
- ${(0,u.when)(!this.open,()=>c.html`<div
53
- class="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-6 h-0.5 rounded-full bg-on-surface/20 pointer-events-none"
54
- style="z-index:0"
55
- ></div>`)}
56
-
57
- <!-- Summary slot rendered once — avoids DOM teardown on toggle -->
58
- <div class="flex-1 min-w-0 relative" style="z-index:1">
59
- <slot name="summary"></slot>
60
- </div>
61
-
62
- <!-- Toggle button: chevron up/down matches open/close direction per corner -->
63
- ${(0,u.when)(this.open,()=>c.html`
64
- <schmancy-icon-button
65
- size="sm"
66
- variant="text"
67
- @click=${e=>{e.stopPropagation(),this.close()}}
68
- title="Collapse"
69
- >
70
- ${e?`expand_more`:`expand_less`}
71
- </schmancy-icon-button>
72
- `,()=>c.html`
73
- <schmancy-icon-button
74
- size="sm"
75
- variant="text"
76
- @click=${e=>{e.stopPropagation(),this.expand()}}
77
- title="Expand"
78
- >
79
- ${e?`expand_less`:`expand_more`}
80
- </schmancy-icon-button>
81
- `)}
82
- </div>
83
- </section>
84
- </schmancy-surface>
85
- `}};e.u([(0,s.property)({type:String})],p.prototype,`id`,void 0),e.u([(0,s.property)({type:String})],p.prototype,`icon`,void 0),e.u([(0,s.property)({type:String})],p.prototype,`label`,void 0),e.u([(0,s.property)({type:String})],p.prototype,`expandedWidth`,void 0),e.u([(0,s.property)({type:Boolean,reflect:!0})],p.prototype,`lowered`,void 0),e.u([(0,s.property)({type:String})],p.prototype,`corner`,void 0),e.u([(0,s.property)({type:Boolean,reflect:!0})],p.prototype,`open`,void 0),e.u([(0,s.state)()],p.prototype,`isDragging`,void 0),e.u([(0,s.state)()],p.prototype,`_currentCorner`,void 0);var m=p=e.u([(0,s.customElement)(`schmancy-boat`)],p);Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return m}});
@@ -1 +0,0 @@
1
- {"version":3,"file":"boat-CI5rcGS5.cjs","names":[],"sources":["../src/boat/boat.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html } 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 { when } from 'lit/directives/when.js'\nimport { filter, finalize, fromEvent, map, merge, switchMap, takeUntil, tap } from 'rxjs'\nimport { SPRING_SMOOTH, SPRING_SNAPPY } from '../utils/animation.js'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport { theme } from '../theme/theme.service.js'\n\nconst FAB_HEIGHT = 36\nconst DRAG_THRESHOLD = 5\nconst POSITION_STORAGE_KEY_PREFIX = 'schmancy-boat-'\n\ntype Corner = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\ntype BoatState = 'collapsed' | 'expanded'\ninterface Position {\n\tx: number\n\ty: number\n}\n\n@customElement('schmancy-boat')\nexport default class SchmancyBoat 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@property({ type: String }) icon?: string\n\t@property({ type: String }) label?: string\n\t/** Override the expanded panel width (e.g. '320px', '24rem'). Defaults to responsive sizing. */\n\t@property({ type: String }) expandedWidth?: string\n\t/** When true, uses a lower elevation shadow in the minimized (FAB) state. */\n\t@property({ type: Boolean, reflect: true }) lowered: boolean = false\n\t/** Corner the boat is anchored to. */\n\t@property({ type: String }) corner: Corner = 'bottom-right'\n\t/** Whether the panel is open. */\n\t@property({ type: Boolean, reflect: true }) open: boolean = false\n\n\t/**\n\t * State property.\n\t * Maps 'expanded' → open=true, 'collapsed' → open=false (FAB visible).\n\t */\n\tget state(): BoatState {\n\t\treturn this.open ? 'expanded' : 'collapsed'\n\t}\n\tset state(val: BoatState) {\n\t\tif (val === 'expanded') {\n\t\t\tthis.expand()\n\t\t} else {\n\t\t\t// collapsed\n\t\t\tthis.close()\n\t\t}\n\t}\n\n\t// Internal drag state (triggers re-render for cursor class)\n\t@state() private isDragging = false\n\n\t// Internal position — plain fields, updated directly during drag (no re-render needed)\n\tprivate _position: Position = { x: 16, y: 16 }\n\t@state() private _currentCorner: Corner = 'bottom-right'\n\n\t// Refs\n\tprivate _containerRef = createRef<HTMLElement>()\n\tprivate _contentRef = createRef<HTMLElement>()\n\tprivate _headerRef = createRef<HTMLElement>()\n\tprivate _currentAnimation?: Animation\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% - ${FAB_HEIGHT}px) 0px 0px 0px round 10px)`\n\t\t\t: `inset(0px 0px calc(100% - ${FAB_HEIGHT}px) 0px round 10px)`\n\t}\n\n\tprivate get openClipPath(): string {\n\t\treturn 'inset(0px 0px 0px 0px round 4px)'\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\tcontainer.style.removeProperty('left')\n\t\tcontainer.style.removeProperty('right')\n\t\tcontainer.style.removeProperty('top')\n\t\tcontainer.style.removeProperty('bottom')\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 _loadPosition() {\n\t\ttry {\n\t\t\tconst saved = localStorage.getItem(POSITION_STORAGE_KEY_PREFIX + this.id)\n\t\t\tif (saved) {\n\t\t\t\tconst parsed = JSON.parse(saved) as { x: number; y: number; anchor: Corner }\n\t\t\t\tthis._position = { x: parsed.x, y: parsed.y }\n\t\t\t\tthis._currentCorner = parsed.anchor\n\t\t\t}\n\t\t} catch {\n\t\t\t// ignore localStorage errors\n\t\t}\n\t}\n\n\tprivate _savePosition() {\n\t\ttry {\n\t\t\tlocalStorage.setItem(\n\t\t\t\tPOSITION_STORAGE_KEY_PREFIX + this.id,\n\t\t\t\tJSON.stringify({ ...this._position, anchor: this._currentCorner }),\n\t\t\t)\n\t\t} catch {\n\t\t\t// ignore localStorage errors\n\t\t}\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\n\t// ============================================\n\t// CORNER SNAPPING\n\t// ============================================\n\n\tprivate _reorientToNearestCorner(skipAnimation = false): void {\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 FAB visual center (container is always collapsed during drag)\n\t\tconst currentIsBottom = this._currentCorner.includes('bottom')\n\t\tconst fabCenterX = rect.left + rect.width / 2\n\t\tconst fabCenterY = currentIsBottom\n\t\t\t? rect.bottom - FAB_HEIGHT / 2\n\t\t\t: rect.top + FAB_HEIGHT / 2\n\t\tconst side = fabCenterX > window.innerWidth / 2 ? 'right' : 'left'\n\t\tconst vert = fabCenterY > window.innerHeight / 2 ? 'bottom' : 'top'\n\t\tconst newCorner: Corner = `${vert}-${side}` as Corner\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 — managed imperatively, not via styleMap\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\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.transform = `translate(${dx}px, ${dy}px)`\n\n\t\t// P — play: animate from the inverse offset to natural resting position\n\t\tthis._currentAnimation?.cancel()\n\t\tconst anim = container.animate(\n\t\t\t[{ transform: container.style.transform }, { transform: 'translate(0,0)' }],\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\tthis._currentAnimation = anim\n\t\tanim.finished.then(() => {\n\t\t\tif (container.isConnected) {\n\t\t\t\tcontainer.style.transform = ''\n\t\t\t}\n\t\t\treturn\n\t\t})\n\n\t\tthis._savePosition()\n\t}\n\n\t// ============================================\n\t// DRAG PIPELINE\n\t// ============================================\n\n\tprivate _setupDrag() {\n\t\tconst header = this._headerRef.value\n\t\tconst container = this._containerRef.value\n\t\tif (!header || !container) return\n\n\t\tlet didDrag = false\n\n\t\tfromEvent<PointerEvent>(header, 'pointerdown')\n\t\t\t.pipe(\n\t\t\t\tfilter(e => e.button === 0),\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\theader.setPointerCapture(e.pointerId)\n\t\t\t\t}),\n\t\t\t\tmap(e => {\n\t\t\t\t\tconst rect = container.getBoundingClientRect()\n\t\t\t\t\tconst isBottom = this._currentCorner.includes('bottom')\n\t\t\t\t\tconst wasOpen = this.open\n\t\t\t\t\tdidDrag = false\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpointerId: e.pointerId,\n\t\t\t\t\t\tstartX: e.clientX,\n\t\t\t\t\t\tstartY: e.clientY,\n\t\t\t\t\t\toffsetX: e.clientX - rect.left,\n\t\t\t\t\t\toffsetY: e.clientY - rect.top,\n\t\t\t\t\t\trect,\n\t\t\t\t\t\tisBottom,\n\t\t\t\t\t\twasOpen,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tswitchMap(({ pointerId, startX, startY, offsetX, offsetY, rect, isBottom, wasOpen }) => {\n\t\t\t\t\tconst sameId = (e: PointerEvent) => e.pointerId === pointerId\n\t\t\t\t\tconst move$ = fromEvent<PointerEvent>(window, 'pointermove').pipe(filter(sameId))\n\t\t\t\t\tconst end$ = merge(\n\t\t\t\t\t\tfromEvent<PointerEvent>(window, 'pointerup'),\n\t\t\t\t\t\tfromEvent<PointerEvent>(window, 'pointercancel'),\n\t\t\t\t\t).pipe(filter(sameId))\n\n\t\t\t\t\treturn move$.pipe(\n\t\t\t\t\t\ttap(({ clientX, clientY }) => {\n\t\t\t\t\t\t\tconst dx = clientX - startX\n\t\t\t\t\t\t\tconst dy = clientY - startY\n\t\t\t\t\t\t\tif (Math.sqrt(dx * dx + dy * dy) > DRAG_THRESHOLD && !didDrag) {\n\t\t\t\t\t\t\t\tdidDrag = true\n\t\t\t\t\t\t\t\tthis.isDragging = true\n\t\t\t\t\t\t\t\t// Collapse on first confirmed drag move (not on click)\n\t\t\t\t\t\t\t\tif (wasOpen) {\n\t\t\t\t\t\t\t\t\tthis._currentAnimation?.cancel()\n\t\t\t\t\t\t\t\t\tthis.open = false\n\t\t\t\t\t\t\t\t\tcontainer.style.clipPath = this.closedClipPath\n\t\t\t\t\t\t\t\t\tcontainer.style.overflow = 'hidden'\n\t\t\t\t\t\t\t\t\tconst content = this._contentRef.value\n\t\t\t\t\t\t\t\t\tif (content) {\n\t\t\t\t\t\t\t\t\t\tcontent.inert = true\n\t\t\t\t\t\t\t\t\t\tcontent.style.visibility = 'hidden'\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}\n\t\t\t\t\t\t\tif (!didDrag) return\n\n\t\t\t\t\t\t\tconst vw = window.innerWidth\n\t\t\t\t\t\t\tconst vh = window.innerHeight\n\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// Allow container to go partially off-screen so FAB stays reachable at all edges\n\t\t\t\t\t\t\tconst minTop = isBottom ? FAB_HEIGHT - rect.height : 0\n\t\t\t\t\t\t\tconst maxTop = isBottom ? vh - rect.height : vh - FAB_HEIGHT\n\t\t\t\t\t\t\tconst top = Math.max(minTop, Math.min(clientY - offsetY, maxTop))\n\n\t\t\t\t\t\t\tthis._position = {\n\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\ty: isBottom ? vh - top - rect.height : top,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis._applyContainerPosition()\n\t\t\t\t\t\t}),\n\t\t\t\t\t\ttakeUntil(end$),\n\t\t\t\t\t\tfinalize(() => {\n\t\t\t\t\t\t\tif (didDrag) {\n\t\t\t\t\t\t\t\tthis._reorientToNearestCorner()\n\t\t\t\t\t\t\t\tthis.isDragging = false\n\t\t\t\t\t\t\t\tdidDrag = false\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.isDragging = false\n\t\t\t\t\t\t\t\tdidDrag = false\n\t\t\t\t\t\t\t\tthis.toggle()\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\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\t// ============================================\n\t// LIFECYCLE\n\t// ============================================\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\tfromEvent(window, 'resize')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(() => this._validateBounds())\n\n\t\ttheme.bottomOffset$.pipe(\n\t\t\ttap(() => this._applyContainerPosition()),\n\t\t\ttakeUntil(this.disconnecting),\n\t\t).subscribe()\n\t}\n\n\tfirstUpdated() {\n\t\t// Initialize corner from property\n\t\tthis._currentCorner = this.corner\n\n\t\t// Load saved drag position from localStorage\n\t\tthis._loadPosition()\n\n\t\tconst container = this._containerRef.value\n\t\tconst content = this._contentRef.value\n\t\tif (!container) return\n\n\t\t// Apply initial position\n\t\tthis._applyContainerPosition()\n\n\t\t// Set initial open/closed visual state\n\t\tif (this.open) {\n\t\t\tcontainer.style.overflow = ''\n\t\t\tif (content) {\n\t\t\t\tcontent.inert = false\n\t\t\t\tcontent.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 (content) {\n\t\t\t\tcontent.inert = true\n\t\t\t\tcontent.style.visibility = 'hidden'\n\t\t\t}\n\t\t}\n\n\t\t// Set up drag\n\t\tthis._setupDrag()\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tthis._currentAnimation?.cancel()\n\t}\n\n\t// ============================================\n\t// ANIMATION\n\t// ============================================\n\n\tprivate async _animateOpen(): Promise<void> {\n\t\tconst container = this._containerRef.value\n\t\tconst content = this._contentRef.value\n\t\tif (!container) return\n\n\t\tif (content) {\n\t\t\tcontent.style.visibility = 'visible'\n\t\t\tcontent.inert = false\n\t\t}\n\n\t\tthis.open = true\n\t\tawait this.updateComplete\n\n\t\tif (reducedMotion$.value) {\n\t\t\tcontainer.style.clipPath = ''\n\t\t\tcontainer.style.overflow = ''\n\t\t\tthis.dispatchScopedEvent('toggle', 'expanded')\n\t\t\treturn\n\t\t}\n\n\t\tthis._currentAnimation?.cancel()\n\t\tcontainer.style.overflow = 'hidden'\n\n\t\tconst openKeyframes: Keyframe[] = [\n\t\t\t{ clipPath: this.closedClipPath, opacity: 0.85 },\n\t\t\t{ clipPath: this.openClipPath, opacity: 1 },\n\t\t]\n\t\tconst anim = container.animate(openKeyframes, {\n\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\tfill: 'forwards',\n\t\t})\n\t\tthis._currentAnimation = anim\n\n\t\t// Clear clip-path so overflow/scroll work normally after animation\n\t\tanim.finished.then(() => {\n\t\t\tif (container.isConnected) {\n\t\t\t\tcontainer.style.clipPath = ''\n\t\t\t\tcontainer.style.overflow = ''\n\t\t\t}\n\t\t\treturn\n\t\t})\n\n\t\tthis.dispatchScopedEvent('toggle', 'expanded')\n\t}\n\n\tprivate async _animateClose(): Promise<void> {\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 content = this._contentRef.value\n\t\t\tif (content) {\n\t\t\t\tcontent.inert = true\n\t\t\t\tcontent.style.visibility = 'hidden'\n\t\t\t}\n\t\t\tthis.dispatchScopedEvent('toggle', 'collapsed')\n\t\t\treturn\n\t\t}\n\n\t\tthis._currentAnimation?.cancel()\n\t\tcontainer.style.overflow = 'hidden'\n\n\t\tconst closeKeyframes: Keyframe[] = [\n\t\t\t{ clipPath: this.openClipPath, opacity: 1 },\n\t\t\t{ clipPath: this.closedClipPath, opacity: 0.85 },\n\t\t]\n\t\tconst anim = container.animate(closeKeyframes, {\n\t\t\tduration: Math.round(SPRING_SNAPPY.duration * 0.9),\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\tawait anim.finished\n\n\t\tthis.open = false\n\n\t\tconst content = this._contentRef.value\n\t\tif (content) {\n\t\t\tcontent.inert = true\n\t\t\tcontent.style.visibility = 'hidden'\n\t\t}\n\n\t\tthis.dispatchScopedEvent('toggle', 'collapsed')\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.removeAttribute('hidden')\n\t\tif (!this._containerRef.value) {\n\t\t\tthis.open = true\n\t\t\treturn\n\t\t}\n\t\tthis._animateOpen()\n\t}\n\n\t/** Alias for expand() — kept for backwards compatibility. */\n\tshow() {\n\t\tthis.expand()\n\t}\n\n\tclose() {\n\t\tif (!this.open) return\n\t\tif (!this._containerRef.value) {\n\t\t\tthis.open = false\n\t\t\treturn\n\t\t}\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\tflex: true,\n\t\t\t'flex-col': isBottom,\n\t\t\t'flex-col-reverse': !isBottom,\n\t\t\t'will-change-[clip-path]': true,\n\t\t\t'z-1000': true,\n\t\t\t// open: 4px radius (instrument-sharp); closed: 10px (status-bar pill)\n\t\t\t'rounded': this.open,\n\t\t\t'rounded-lg': !this.open,\n\t\t\t'overflow-hidden': true,\n\t\t\t// micro-scale + reduced opacity signals lift during drag\n\t\t\t'opacity-85': this.isDragging,\n\t\t\t'scale-95': this.isDragging,\n\t\t})\n\n\t\tconst containerStyles = styleMap({\n\t\t\tposition: 'fixed',\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 contentStyles = styleMap({\n\t\t\t'pointer-events': this.open ? 'auto' : 'none',\n\t\t})\n\n\t\tconst headerClasses = 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'touch-none': true,\n\t\t\t'cursor-grabbing': this.isDragging,\n\t\t\t'cursor-move': !this.isDragging,\n\t\t\t'transition-opacity': true,\n\t\t\t'duration-200': true,\n\t\t})\n\n\t\treturn html`\n\t\t\t<!-- schmancy-surface owns background color and elevation-based shadow.\n\t\t\t Position is managed imperatively via _applyContainerPosition(). -->\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>\n\t\t\t\t<!-- Content section (visually above header for bottom corners) -->\n\t\t\t\t<section\n\t\t\t\t\t${ref(this._contentRef)}\n\t\t\t\t\tclass=\"flex-1 min-h-0 overflow-hidden flex flex-col\"\n\t\t\t\t\tstyle=${contentStyles}\n\t\t\t\t\trole=\"dialog\"\n\t\t\t\t\taria-label=\"${this.label ?? 'Floating panel'}\"\n\t\t\t\t>\n\t\t\t\t\t<schmancy-surface type=\"solid\" class=\"flex flex-col flex-1 min-h-0 overflow-hidden\">\n\t\t\t\t\t\t<schmancy-scroll hide class=\"flex-1\">\n\t\t\t\t\t\t\t<slot></slot>\n\t\t\t\t\t\t</schmancy-scroll>\n\t\t\t\t\t</schmancy-surface>\n\t\t\t\t</section>\n\n\t\t\t\t<!-- Header / FAB section — always interactive, always visible -->\n\t\t\t\t<section\n\t\t\t\t\tclass=\"shrink-0 bg-surface-containerLowest relative\"\n\t\t\t\t\tstyle=${styleMap({ 'pointer-events': 'auto', height: `${FAB_HEIGHT}px` })}\n\t\t\t\t>\n\t\t\t\t\t<!-- 1px top inner highlight — reads as a lit edge when open, instrument-panel HUD accent -->\n\t\t\t\t\t${when(\n\t\t\t\t\t\tthis.open,\n\t\t\t\t\t\t() => html`<div\n\t\t\t\t\t\t\tclass=\"absolute inset-x-0 top-0 h-px bg-linear-to-r from-transparent via-primary-default/40 to-transparent pointer-events-none\"\n\t\t\t\t\t\t></div>`,\n\t\t\t\t\t)}\n\t\t\t\t\t<div\n\t\t\t\t\t\t${ref(this._headerRef)}\n\t\t\t\t\t\tclass=${headerClasses}\n\t\t\t\t\t\ttitle=\"Drag to move\"\n\t\t\t\t\t\taria-label=\"Drag to reposition panel\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<!-- Grip indicator: only visible when collapsed, signals \"this is a handle\" -->\n\t\t\t\t\t\t${when(\n\t\t\t\t\t\t\t!this.open,\n\t\t\t\t\t\t\t() => html`<div\n\t\t\t\t\t\t\t\tclass=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-6 h-0.5 rounded-full bg-on-surface/20 pointer-events-none\"\n\t\t\t\t\t\t\t\tstyle=\"z-index:0\"\n\t\t\t\t\t\t\t></div>`,\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t<!-- Summary slot rendered once — avoids DOM teardown on toggle -->\n\t\t\t\t\t\t<div class=\"flex-1 min-w-0 relative\" style=\"z-index:1\">\n\t\t\t\t\t\t\t<slot name=\"summary\"></slot>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- Toggle button: chevron up/down matches open/close direction per corner -->\n\t\t\t\t\t\t${when(\n\t\t\t\t\t\t\tthis.open,\n\t\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t\t<schmancy-icon-button\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\tvariant=\"text\"\n\t\t\t\t\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ttitle=\"Collapse\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t${isBottom ? 'expand_more' : 'expand_less'}\n\t\t\t\t\t\t\t\t</schmancy-icon-button>\n\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t\t<schmancy-icon-button\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\tvariant=\"text\"\n\t\t\t\t\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\t\t\t\tthis.expand()\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ttitle=\"Expand\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t${isBottom ? 'expand_less' : 'expand_more'}\n\t\t\t\t\t\t\t\t</schmancy-icon-button>\n\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t)}\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-boat': SchmancyBoat\n\t}\n}\n"],"mappings":"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"}