@mhmo91/schmancy 0.10.28 → 0.10.30

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 (451) hide show
  1. package/custom-elements.json +7 -2
  2. package/dist/SchmancyElement-BQ4DFufc.js +300 -0
  3. package/dist/SchmancyElement-BQ4DFufc.js.map +1 -0
  4. package/dist/SchmancyElement-DhSiMp6Y.cjs +2 -0
  5. package/dist/SchmancyElement-DhSiMp6Y.cjs.map +1 -0
  6. package/dist/agent/{flow-3RrZM-e7.js.map → flow-CvG1fLW5.js.map} +1 -1
  7. package/dist/agent/schmancy.agent.js +7843 -3334
  8. package/dist/agent/schmancy.agent.js.map +1 -1
  9. package/dist/agent/schmancy.manifest.json +1 -2
  10. package/dist/agent/{vendor-material-color-33Mj762T.js.map → vendor-material-color-DcL7ZPxx.js.map} +1 -1
  11. package/dist/animation-CCOIW4wJ.cjs.map +1 -1
  12. package/dist/animation-DCznELuT.js.map +1 -1
  13. package/dist/{area-C_Yvjmad.js → area-BjpUWvzE.js} +7 -7
  14. package/dist/{area-C_Yvjmad.js.map → area-BjpUWvzE.js.map} +1 -1
  15. package/dist/area-CgTzkxah.cjs +21 -0
  16. package/dist/{area-BSVOYQDA.cjs.map → area-CgTzkxah.cjs.map} +1 -1
  17. package/dist/area.cjs +1 -1
  18. package/dist/area.js +1 -1
  19. package/dist/{audio-CxO5a2HL.js → audio-CwBJntnB.js} +1 -1
  20. package/dist/{audio-CxO5a2HL.js.map → audio-CwBJntnB.js.map} +1 -1
  21. package/dist/{audio-Cvmemu84.cjs → audio-DISBFOaR.cjs} +1 -1
  22. package/dist/{audio-Cvmemu84.cjs.map → audio-DISBFOaR.cjs.map} +1 -1
  23. package/dist/audio.cjs +1 -1
  24. package/dist/audio.js +2 -2
  25. package/dist/{autocomplete-B50VXUzw.cjs → autocomplete-DbCUOgWU.cjs} +2 -2
  26. package/dist/{autocomplete-B50VXUzw.cjs.map → autocomplete-DbCUOgWU.cjs.map} +1 -1
  27. package/dist/{autocomplete-C6I1mfOT.js → autocomplete-Dy708jem.js} +7 -7
  28. package/dist/{autocomplete-C6I1mfOT.js.map → autocomplete-Dy708jem.js.map} +1 -1
  29. package/dist/autocomplete.cjs +1 -1
  30. package/dist/autocomplete.js +1 -1
  31. package/dist/avatar.cjs +3 -3
  32. package/dist/avatar.cjs.map +1 -1
  33. package/dist/avatar.js +5 -5
  34. package/dist/avatar.js.map +1 -1
  35. package/dist/badge.cjs +1 -1
  36. package/dist/badge.js +1 -1
  37. package/dist/{boat-DVQBNkk5.cjs → boat-BzZN_iwp.cjs} +11 -11
  38. package/dist/{boat-DVQBNkk5.cjs.map → boat-BzZN_iwp.cjs.map} +1 -1
  39. package/dist/{boat-C94QZ4Zt.js → boat-Z4Lzl3ai.js} +8 -8
  40. package/dist/{boat-C94QZ4Zt.js.map → boat-Z4Lzl3ai.js.map} +1 -1
  41. package/dist/boat.cjs +1 -1
  42. package/dist/boat.js +1 -1
  43. package/dist/breadcrumb.cjs +4 -4
  44. package/dist/breadcrumb.cjs.map +1 -1
  45. package/dist/breadcrumb.js +7 -7
  46. package/dist/breadcrumb.js.map +1 -1
  47. package/dist/{busy--bNb42rM.js → busy-CRFGPkcP.js} +7 -7
  48. package/dist/{busy--bNb42rM.js.map → busy-CRFGPkcP.js.map} +1 -1
  49. package/dist/{busy-DuxFvEkY.cjs → busy-Cu-47DfN.cjs} +8 -8
  50. package/dist/{busy-DuxFvEkY.cjs.map → busy-Cu-47DfN.cjs.map} +1 -1
  51. package/dist/busy.cjs +1 -1
  52. package/dist/busy.js +1 -1
  53. package/dist/{button-DAFZ5A4O.cjs → button-CN_JTjRd.cjs} +15 -15
  54. package/dist/{button-DAFZ5A4O.cjs.map → button-CN_JTjRd.cjs.map} +1 -1
  55. package/dist/{button-B7b9L_h5.js → button-D_USF3tt.js} +10 -10
  56. package/dist/{button-B7b9L_h5.js.map → button-D_USF3tt.js.map} +1 -1
  57. package/dist/button.cjs +19 -19
  58. package/dist/button.cjs.map +1 -1
  59. package/dist/button.js +9 -9
  60. package/dist/button.js.map +1 -1
  61. package/dist/{card-DZPd24Sn.cjs → card-D4P5_gg9.cjs} +10 -10
  62. package/dist/{card-DZPd24Sn.cjs.map → card-D4P5_gg9.cjs.map} +1 -1
  63. package/dist/{card-ixzxOW-Q.js → card-DpN5KIYc.js} +15 -15
  64. package/dist/{card-ixzxOW-Q.js.map → card-DpN5KIYc.js.map} +1 -1
  65. package/dist/card.cjs +1 -1
  66. package/dist/card.js +1 -1
  67. package/dist/{checkbox-DdGpepTh.js → checkbox-C8ChypKf.js} +5 -5
  68. package/dist/{checkbox-DdGpepTh.js.map → checkbox-C8ChypKf.js.map} +1 -1
  69. package/dist/{checkbox-Bi_Fm2mf.cjs → checkbox-hhXVXDV1.cjs} +3 -3
  70. package/dist/{checkbox-Bi_Fm2mf.cjs.map → checkbox-hhXVXDV1.cjs.map} +1 -1
  71. package/dist/checkbox.cjs +1 -1
  72. package/dist/checkbox.js +1 -1
  73. package/dist/{chips-DLTynyVB.js → chips-B8R9q4yl.js} +27 -27
  74. package/dist/{chips-DLTynyVB.js.map → chips-B8R9q4yl.js.map} +1 -1
  75. package/dist/{chips-DWQMZErr.cjs → chips-BTLlO_Ow.cjs} +18 -18
  76. package/dist/{chips-DWQMZErr.cjs.map → chips-BTLlO_Ow.cjs.map} +1 -1
  77. package/dist/chips.cjs +1 -1
  78. package/dist/chips.js +2 -2
  79. package/dist/connectivity.cjs +7 -7
  80. package/dist/connectivity.cjs.map +1 -1
  81. package/dist/connectivity.js +5 -5
  82. package/dist/connectivity.js.map +1 -1
  83. package/dist/content-drawer.cjs +1 -1
  84. package/dist/content-drawer.js +1 -1
  85. package/dist/cursor-glow-Ah7VXSj7.js.map +1 -1
  86. package/dist/cursor-glow-Bulq-38P.cjs.map +1 -1
  87. package/dist/{date-range-DQpmMJH-.cjs → date-range-9h6ZSkZb.cjs} +3 -3
  88. package/dist/{date-range-DQpmMJH-.cjs.map → date-range-9h6ZSkZb.cjs.map} +1 -1
  89. package/dist/{date-range-CJ6MiTpF.js → date-range-CS96dWMh.js} +7 -7
  90. package/dist/{date-range-CJ6MiTpF.js.map → date-range-CS96dWMh.js.map} +1 -1
  91. package/dist/date-range-inline-CAxnHA-l.cjs +43 -0
  92. package/dist/{date-range-inline-nPWIs-3C.cjs.map → date-range-inline-CAxnHA-l.cjs.map} +1 -1
  93. package/dist/{date-range-inline-Ho3CENTh.js → date-range-inline-DCXdGeRv.js} +5 -5
  94. package/dist/{date-range-inline-Ho3CENTh.js.map → date-range-inline-DCXdGeRv.js.map} +1 -1
  95. package/dist/date-range-inline.cjs +1 -1
  96. package/dist/date-range-inline.js +1 -1
  97. package/dist/date-range.cjs +1 -1
  98. package/dist/date-range.js +1 -1
  99. package/dist/delay.cjs +4 -4
  100. package/dist/delay.cjs.map +1 -1
  101. package/dist/delay.js +6 -6
  102. package/dist/delay.js.map +1 -1
  103. package/dist/{details-BnRWMZdt.cjs → details-BC0IObBd.cjs} +2 -2
  104. package/dist/{details-BnRWMZdt.cjs.map → details-BC0IObBd.cjs.map} +1 -1
  105. package/dist/{details-CcMTvYo7.js → details-Pgd0slKn.js} +11 -11
  106. package/dist/{details-CcMTvYo7.js.map → details-Pgd0slKn.js.map} +1 -1
  107. package/dist/details.cjs +1 -1
  108. package/dist/details.js +1 -1
  109. package/dist/{directives-DgPbz0lQ.js → directives-B-RT9R2u.js} +3 -3
  110. package/dist/{directives-DgPbz0lQ.js.map → directives-B-RT9R2u.js.map} +1 -1
  111. package/dist/{directives-BkSqmLBV.cjs → directives-CFWacnWU.cjs} +1 -1
  112. package/dist/{directives-BkSqmLBV.cjs.map → directives-CFWacnWU.cjs.map} +1 -1
  113. package/dist/directives.cjs +1 -1
  114. package/dist/directives.js +2 -2
  115. package/dist/discovery.service-CIa3Eeuk.cjs.map +1 -1
  116. package/dist/discovery.service-DZFxtRwW.js.map +1 -1
  117. package/dist/{divider-CZCj0ioH.js → divider-BMzm0lOz.js} +5 -5
  118. package/dist/{divider-CZCj0ioH.js.map → divider-BMzm0lOz.js.map} +1 -1
  119. package/dist/{divider-C6yJSL1c.cjs → divider-D1OzaRAQ.cjs} +3 -3
  120. package/dist/{divider-C6yJSL1c.cjs.map → divider-D1OzaRAQ.cjs.map} +1 -1
  121. package/dist/divider.cjs +1 -1
  122. package/dist/divider.js +1 -1
  123. package/dist/dropdown.cjs +4 -4
  124. package/dist/dropdown.cjs.map +1 -1
  125. package/dist/dropdown.js +8 -8
  126. package/dist/dropdown.js.map +1 -1
  127. package/dist/{expand-Cc6ogXsR.js → expand-C0Uqxfv0.js} +10 -10
  128. package/dist/{expand-Cc6ogXsR.js.map → expand-C0Uqxfv0.js.map} +1 -1
  129. package/dist/{expand-D4EhwOYh.cjs → expand-CiQkzth9.cjs} +3 -3
  130. package/dist/{expand-D4EhwOYh.cjs.map → expand-CiQkzth9.cjs.map} +1 -1
  131. package/dist/expand.cjs +1 -1
  132. package/dist/expand.js +1 -1
  133. package/dist/float-Bu_IfKRd.cjs +1 -0
  134. package/dist/{float-B8EPc_OG.cjs.map → float-Bu_IfKRd.cjs.map} +1 -1
  135. package/dist/{float-BvI3HTtB.js → float-DwBMXhek.js} +2 -2
  136. package/dist/{float-BvI3HTtB.js.map → float-DwBMXhek.js.map} +1 -1
  137. package/dist/float.cjs +1 -1
  138. package/dist/float.js +1 -1
  139. package/dist/{form-FtYtZScl.js → form-B9Je2W_m.js} +15 -95
  140. package/dist/form-B9Je2W_m.js.map +1 -0
  141. package/dist/{form-SHg5FLsd.cjs → form-BnbAVZyf.cjs} +4 -19
  142. package/dist/form-BnbAVZyf.cjs.map +1 -0
  143. package/dist/form.cjs +18 -1
  144. package/dist/form.cjs.map +1 -0
  145. package/dist/form.js +93 -9
  146. package/dist/form.js.map +1 -0
  147. package/dist/gravity-6pL6CfIr.cjs.map +1 -1
  148. package/dist/gravity-sVK3zGBF.js.map +1 -1
  149. package/dist/handover/agent-runtime-followups.md +1 -1
  150. package/dist/handover/agent-runtime-v1.md +3 -3
  151. package/dist/hashContent-BqU6v1Xr.js.map +1 -1
  152. package/dist/hashContent-iRZJJWtE.cjs.map +1 -1
  153. package/dist/{icon-CgIXAvKI.cjs → icons-BfWQl5k5.cjs} +6 -6
  154. package/dist/icons-BfWQl5k5.cjs.map +1 -0
  155. package/dist/{icon-B1eZr2ZL.js → icons-DJHPXKgR.js} +4 -4
  156. package/dist/{icon-CgIXAvKI.cjs.map → icons-DJHPXKgR.js.map} +1 -1
  157. package/dist/icons.cjs +1 -1
  158. package/dist/icons.js +1 -1
  159. package/dist/{iframe-CmpAZc61.js → iframe-DLz8ll0s.js} +5 -5
  160. package/dist/{iframe-CmpAZc61.js.map → iframe-DLz8ll0s.js.map} +1 -1
  161. package/dist/{iframe-BO3BpRLH.cjs → iframe-UtczJypj.cjs} +5 -5
  162. package/dist/{iframe-BO3BpRLH.cjs.map → iframe-UtczJypj.cjs.map} +1 -1
  163. package/dist/iframe.cjs +1 -1
  164. package/dist/iframe.js +1 -1
  165. package/dist/index.cjs +1 -1
  166. package/dist/index.js +69 -69
  167. package/dist/{input-_Hft9vov.js → input-AQbBEj2f.js} +15 -15
  168. package/dist/{input-_Hft9vov.js.map → input-AQbBEj2f.js.map} +1 -1
  169. package/dist/{input-5YL2oUBr.cjs → input-Pp6A1m3s.cjs} +2 -2
  170. package/dist/{input-5YL2oUBr.cjs.map → input-Pp6A1m3s.cjs.map} +1 -1
  171. package/dist/{input-chip-DKMNpcED.cjs → input-chip-B5vYNuEm.cjs} +9 -9
  172. package/dist/{input-chip-DKMNpcED.cjs.map → input-chip-B5vYNuEm.cjs.map} +1 -1
  173. package/dist/{input-chip-BNTojQT6.js → input-chip-Bbs_gXOB.js} +10 -10
  174. package/dist/{input-chip-BNTojQT6.js.map → input-chip-Bbs_gXOB.js.map} +1 -1
  175. package/dist/input.cjs +1 -1
  176. package/dist/input.js +1 -1
  177. package/dist/json.cjs +3 -3
  178. package/dist/json.cjs.map +1 -1
  179. package/dist/json.js +5 -5
  180. package/dist/json.js.map +1 -1
  181. package/dist/kbd.cjs +2 -2
  182. package/dist/kbd.cjs.map +1 -1
  183. package/dist/kbd.js +5 -5
  184. package/dist/kbd.js.map +1 -1
  185. package/dist/{layout-DSAjo92m.js → layout-9K1zxhZn.js} +1 -1
  186. package/dist/{layout-DSAjo92m.js.map → layout-9K1zxhZn.js.map} +1 -1
  187. package/dist/{layout-eXb9wjDh.cjs → layout-B0dct--7.cjs} +1 -1
  188. package/dist/{layout-eXb9wjDh.cjs.map → layout-B0dct--7.cjs.map} +1 -1
  189. package/dist/layout.cjs +2 -2
  190. package/dist/layout.cjs.map +1 -1
  191. package/dist/layout.js +7 -7
  192. package/dist/layout.js.map +1 -1
  193. package/dist/lazy-CayEFyC3.cjs.map +1 -1
  194. package/dist/lazy-D-bO2r4m.js.map +1 -1
  195. package/dist/{lightbox-t4dvb8_A.cjs → lightbox-D_EizrG3.cjs} +21 -21
  196. package/dist/{lightbox-t4dvb8_A.cjs.map → lightbox-D_EizrG3.cjs.map} +1 -1
  197. package/dist/{lightbox-CKlYcnHV.js → lightbox-DmJTs2My.js} +9 -9
  198. package/dist/{lightbox-CKlYcnHV.js.map → lightbox-DmJTs2My.js.map} +1 -1
  199. package/dist/lightbox.cjs +1 -1
  200. package/dist/lightbox.js +1 -1
  201. package/dist/{list-21mWtDKg.cjs → list-BSn8czyO.cjs} +5 -5
  202. package/dist/{list-21mWtDKg.cjs.map → list-BSn8czyO.cjs.map} +1 -1
  203. package/dist/{list-B6QhxgRJ.js → list-DjSSRZxF.js} +12 -12
  204. package/dist/{list-B6QhxgRJ.js.map → list-DjSSRZxF.js.map} +1 -1
  205. package/dist/list.cjs +1 -1
  206. package/dist/list.js +1 -1
  207. package/dist/magnetic-B2VKNfDu.js.map +1 -1
  208. package/dist/magnetic-MQ3HMHJi.cjs.map +1 -1
  209. package/dist/{menu-C5qcgMnw.js → menu-CCVEde6u.js} +7 -7
  210. package/dist/{menu-C5qcgMnw.js.map → menu-CCVEde6u.js.map} +1 -1
  211. package/dist/menu-DTNnq7j_.cjs +23 -0
  212. package/dist/{menu-Cuxt5K4Y.cjs.map → menu-DTNnq7j_.cjs.map} +1 -1
  213. package/dist/menu.cjs +1 -1
  214. package/dist/menu.js +1 -1
  215. package/dist/mixins-BYfSDvbP.js +412 -0
  216. package/dist/mixins-BYfSDvbP.js.map +1 -0
  217. package/dist/mixins-YQI9JogS.cjs +245 -0
  218. package/dist/mixins-YQI9JogS.cjs.map +1 -0
  219. package/dist/mixins.cjs +1 -1
  220. package/dist/mixins.js +3 -2
  221. package/dist/nav-drawer.cjs +1 -1
  222. package/dist/nav-drawer.js +1 -1
  223. package/dist/navigation-bar.cjs +1 -1
  224. package/dist/navigation-bar.js +1 -1
  225. package/dist/navigation-rail.cjs +10 -10
  226. package/dist/navigation-rail.cjs.map +1 -1
  227. package/dist/navigation-rail.js +15 -15
  228. package/dist/navigation-rail.js.map +1 -1
  229. package/dist/{notification-CDKBKh63.js → notification-BNEuu3Q2.js} +7 -7
  230. package/dist/{notification-CDKBKh63.js.map → notification-BNEuu3Q2.js.map} +1 -1
  231. package/dist/notification-RhaYvA1I.cjs +24 -0
  232. package/dist/{notification-CcNoBFEJ.cjs.map → notification-RhaYvA1I.cjs.map} +1 -1
  233. package/dist/notification.cjs +1 -1
  234. package/dist/notification.js +1 -1
  235. package/dist/{option-BWfmDJvm.js → option-BLMYRy5C.js} +6 -6
  236. package/dist/{option-BWfmDJvm.js.map → option-BLMYRy5C.js.map} +1 -1
  237. package/dist/{option-DejeqOad.cjs → option-Dk7UFFlr.cjs} +5 -5
  238. package/dist/{option-DejeqOad.cjs.map → option-Dk7UFFlr.cjs.map} +1 -1
  239. package/dist/option.cjs +1 -1
  240. package/dist/option.js +1 -1
  241. package/dist/overlay-BbntqsVm.cjs +43 -0
  242. package/dist/overlay-BbntqsVm.cjs.map +1 -0
  243. package/dist/{overlay-D3c_NY18.js → overlay-CujzmLxg.js} +93 -144
  244. package/dist/overlay-CujzmLxg.js.map +1 -0
  245. package/dist/overlay-stack-Bdr9lOqi.cjs.map +1 -1
  246. package/dist/overlay-stack-D2rgxQLh.js.map +1 -1
  247. package/dist/overlay.cjs +1 -1
  248. package/dist/overlay.confirm-body-CMge0LP5.cjs +70 -0
  249. package/dist/overlay.confirm-body-CMge0LP5.cjs.map +1 -0
  250. package/dist/{overlay.confirm-body-B_v0ivkn.js → overlay.confirm-body-CRk4MvKh.js} +15 -27
  251. package/dist/overlay.confirm-body-CRk4MvKh.js.map +1 -0
  252. package/dist/overlay.js +3 -3
  253. package/dist/{overlay.service-B3FjXCqc.js → overlay.service-DnT4SBlJ.js} +31 -27
  254. package/dist/{overlay.service-B3FjXCqc.js.map → overlay.service-DnT4SBlJ.js.map} +1 -1
  255. package/dist/overlay.service-Dq5XtSEL.cjs +1 -0
  256. package/dist/{overlay.service-BkSeqXIv.cjs.map → overlay.service-Dq5XtSEL.cjs.map} +1 -1
  257. package/dist/{progress-6_rb3Ah9.cjs → progress-Bqd4DdOQ.cjs} +7 -7
  258. package/dist/{progress-6_rb3Ah9.cjs.map → progress-Bqd4DdOQ.cjs.map} +1 -1
  259. package/dist/{progress-CFcmO0wv.js → progress-Cu_wh6Sl.js} +10 -10
  260. package/dist/{progress-CFcmO0wv.js.map → progress-Cu_wh6Sl.js.map} +1 -1
  261. package/dist/progress.cjs +1 -1
  262. package/dist/progress.js +1 -1
  263. package/dist/radio-group-C8rUbYL6.cjs +19 -0
  264. package/dist/{radio-group-_WZg8EKM.cjs.map → radio-group-C8rUbYL6.cjs.map} +1 -1
  265. package/dist/{radio-group-Bd8y9QpX.js → radio-group-Duzgx17I.js} +7 -7
  266. package/dist/{radio-group-Bd8y9QpX.js.map → radio-group-Duzgx17I.js.map} +1 -1
  267. package/dist/radio-group.cjs +1 -1
  268. package/dist/radio-group.js +1 -1
  269. package/dist/range.cjs +2 -2
  270. package/dist/range.cjs.map +1 -1
  271. package/dist/range.js +5 -5
  272. package/dist/range.js.map +1 -1
  273. package/dist/reduced-motion-D-L12p7G.js.map +1 -1
  274. package/dist/reduced-motion-Ds-HjMzn.cjs.map +1 -1
  275. package/dist/rxjs-utils-Csnks202.cjs.map +1 -1
  276. package/dist/rxjs-utils-d-ivVN84.js.map +1 -1
  277. package/dist/search-DPKoC-dT.cjs.map +1 -1
  278. package/dist/search-MvIBA93K.js.map +1 -1
  279. package/dist/{select-Czpl1ztD.js → select-CzCv1f1c.js} +6 -6
  280. package/dist/{select-Czpl1ztD.js.map → select-CzCv1f1c.js.map} +1 -1
  281. package/dist/{select-BaioT3yY.cjs → select-DdqEsfnG.cjs} +2 -2
  282. package/dist/{select-BaioT3yY.cjs.map → select-DdqEsfnG.cjs.map} +1 -1
  283. package/dist/select.cjs +1 -1
  284. package/dist/select.js +1 -1
  285. package/dist/skeleton.cjs +2 -2
  286. package/dist/skeleton.cjs.map +1 -1
  287. package/dist/skeleton.js +5 -5
  288. package/dist/skeleton.js.map +1 -1
  289. package/dist/skills/form.md +34 -0
  290. package/dist/skills/schmancy/form.md +34 -0
  291. package/dist/slider.cjs +7 -7
  292. package/dist/slider.cjs.map +1 -1
  293. package/dist/slider.js +6 -6
  294. package/dist/slider.js.map +1 -1
  295. package/dist/{sound.service-v_jqCkos.js → sound.service-BOWTBG16.js} +1 -1
  296. package/dist/{sound.service-v_jqCkos.js.map → sound.service-BOWTBG16.js.map} +1 -1
  297. package/dist/{sound.service-DVJZb9ox.cjs → sound.service-BwIzAFQx.cjs} +1 -1
  298. package/dist/{sound.service-DVJZb9ox.cjs.map → sound.service-BwIzAFQx.cjs.map} +1 -1
  299. package/dist/{splash-screen-YtTVkJg8.js → splash-screen-Dj-zuGuB.js} +6 -6
  300. package/dist/{splash-screen-YtTVkJg8.js.map → splash-screen-Dj-zuGuB.js.map} +1 -1
  301. package/dist/splash-screen-_KhxgneW.cjs +41 -0
  302. package/dist/{splash-screen-3FtgdVy3.cjs.map → splash-screen-_KhxgneW.cjs.map} +1 -1
  303. package/dist/splash-screen.cjs +1 -1
  304. package/dist/splash-screen.js +1 -1
  305. package/dist/src-BSjgxN07.cjs +263 -0
  306. package/dist/{src-AYRNg63f.cjs.map → src-BSjgxN07.cjs.map} +1 -1
  307. package/dist/{src-DKMEgT2z.js → src-Curgs4Yp.js} +83 -83
  308. package/dist/{src-DKMEgT2z.js.map → src-Curgs4Yp.js.map} +1 -1
  309. package/dist/state-BthYuA3T.cjs +1 -0
  310. package/dist/state-BthYuA3T.cjs.map +1 -0
  311. package/dist/{state-CHbIt2Dw.js → state-E0bVrZ7q.js} +293 -279
  312. package/dist/state-E0bVrZ7q.js.map +1 -0
  313. package/dist/state.cjs +1 -1
  314. package/dist/state.js +3 -3
  315. package/dist/steps.cjs +10 -10
  316. package/dist/steps.cjs.map +1 -1
  317. package/dist/steps.js +9 -9
  318. package/dist/steps.js.map +1 -1
  319. package/dist/{surface-CVxyQPln.js → surface-C2TIedTq.js} +4 -4
  320. package/dist/{surface-CVxyQPln.js.map → surface-C2TIedTq.js.map} +1 -1
  321. package/dist/surface-D-GqzyLn.cjs +7 -0
  322. package/dist/{surface-BNvxLEDN.cjs.map → surface-D-GqzyLn.cjs.map} +1 -1
  323. package/dist/surface.cjs +1 -1
  324. package/dist/surface.js +1 -1
  325. package/dist/switch.cjs +2 -2
  326. package/dist/switch.cjs.map +1 -1
  327. package/dist/switch.js +6 -6
  328. package/dist/switch.js.map +1 -1
  329. package/dist/table.cjs +11 -11
  330. package/dist/table.cjs.map +1 -1
  331. package/dist/table.js +10 -10
  332. package/dist/table.js.map +1 -1
  333. package/dist/{tabs-CnPXvZuZ.js → tabs-CLRVe23a.js} +11 -11
  334. package/dist/{tabs-CnPXvZuZ.js.map → tabs-CLRVe23a.js.map} +1 -1
  335. package/dist/{tabs-DTU7748z.cjs → tabs-C_493iod.cjs} +4 -4
  336. package/dist/{tabs-DTU7748z.cjs.map → tabs-C_493iod.cjs.map} +1 -1
  337. package/dist/tabs.cjs +1 -1
  338. package/dist/tabs.js +1 -1
  339. package/dist/teleport.cjs +1 -1
  340. package/dist/teleport.js +1 -1
  341. package/dist/{textarea-mQPsppmd.js → textarea-BWEyOtPy.js} +9 -9
  342. package/dist/{textarea-mQPsppmd.js.map → textarea-BWEyOtPy.js.map} +1 -1
  343. package/dist/textarea-CICgd2oP.cjs +43 -0
  344. package/dist/{textarea-Bqth6Q8P.cjs.map → textarea-CICgd2oP.cjs.map} +1 -1
  345. package/dist/textarea.cjs +1 -1
  346. package/dist/textarea.js +1 -1
  347. package/dist/{theme-BJqpv4cG.js → theme-Bfg_H2AF.js} +12 -12
  348. package/dist/{theme-BJqpv4cG.js.map → theme-Bfg_H2AF.js.map} +1 -1
  349. package/dist/theme-D7zOJiyg.cjs +181 -0
  350. package/dist/{theme-D4HGKt7N.cjs.map → theme-D7zOJiyg.cjs.map} +1 -1
  351. package/dist/{theme-button-Jap7G_IH.js → theme-button-C53GdQER.js} +4 -4
  352. package/dist/{theme-button-Jap7G_IH.js.map → theme-button-C53GdQER.js.map} +1 -1
  353. package/dist/theme-button-DgeBcqFm.cjs +8 -0
  354. package/dist/{theme-button-LP-Dgr17.cjs.map → theme-button-DgeBcqFm.cjs.map} +1 -1
  355. package/dist/theme-button.cjs +1 -1
  356. package/dist/theme-button.js +1 -1
  357. package/dist/theme.cjs +1 -1
  358. package/dist/theme.interface-CSt7JUBD.cjs.map +1 -1
  359. package/dist/theme.interface-odQEpZZH.js.map +1 -1
  360. package/dist/theme.js +3 -3
  361. package/dist/{theme.service-Bh08uOSJ.js → theme.service-BqDuioYc.js} +1 -1
  362. package/dist/{theme.service-Bh08uOSJ.js.map → theme.service-BqDuioYc.js.map} +1 -1
  363. package/dist/{theme.service-Y-e8b331.cjs → theme.service-C3PoISGd.cjs} +1 -1
  364. package/dist/{theme.service-Y-e8b331.cjs.map → theme.service-C3PoISGd.cjs.map} +1 -1
  365. package/dist/tooltip.cjs.map +1 -1
  366. package/dist/tooltip.js.map +1 -1
  367. package/dist/tree.cjs +3 -3
  368. package/dist/tree.cjs.map +1 -1
  369. package/dist/tree.js +4 -4
  370. package/dist/tree.js.map +1 -1
  371. package/dist/types.cjs.map +1 -1
  372. package/dist/types.js.map +1 -1
  373. package/dist/typewriter.cjs.map +1 -1
  374. package/dist/typewriter.js.map +1 -1
  375. package/dist/{typography-Bc4MmSal.cjs → typography-B19fJ5YT.cjs} +4 -4
  376. package/dist/{typography-Bc4MmSal.cjs.map → typography-B19fJ5YT.cjs.map} +1 -1
  377. package/dist/{typography-BJMm6b0b.js → typography-CzbQv-X0.js} +10 -10
  378. package/dist/{typography-BJMm6b0b.js.map → typography-CzbQv-X0.js.map} +1 -1
  379. package/dist/typography.cjs +1 -1
  380. package/dist/typography.js +1 -1
  381. package/dist/utils-DTa3QHxk.cjs.map +1 -1
  382. package/dist/utils-H8wNknWC.js.map +1 -1
  383. package/dist/visually-hidden.cjs +2 -2
  384. package/dist/visually-hidden.cjs.map +1 -1
  385. package/dist/visually-hidden.js +4 -4
  386. package/dist/visually-hidden.js.map +1 -1
  387. package/dist/window-DXB53PuA.cjs +59 -0
  388. package/dist/{window-CNu_WnsY.cjs.map → window-DXB53PuA.cjs.map} +1 -1
  389. package/dist/{window-DZTjkE24.js → window-DpctMXiy.js} +9 -9
  390. package/dist/{window-DZTjkE24.js.map → window-DpctMXiy.js.map} +1 -1
  391. package/dist/window.cjs +1 -1
  392. package/dist/window.js +1 -1
  393. package/package.json +1 -1
  394. package/skills/schmancy/form.md +34 -0
  395. package/src/form/form.ts +5 -1
  396. package/src/overlay/overlay.animations.ts +0 -29
  397. package/src/overlay/overlay.component.ts +30 -38
  398. package/src/overlay/overlay.confirm-body.ts +3 -15
  399. package/src/overlay/overlay.layout.ts +11 -53
  400. package/src/overlay/overlay.stack.test.ts +113 -0
  401. package/src/overlay/overlay.types.ts +17 -11
  402. package/src/state/active-host.ts +50 -1
  403. package/src/state/index.ts +50 -11
  404. package/src/state/schmancy-context.ts +97 -88
  405. package/src/surface/surface.styles.ts +14 -10
  406. package/types/src/form/form.d.ts +1 -0
  407. package/types/src/overlay/overlay.confirm-body.d.ts +1 -1
  408. package/types/src/overlay/overlay.layout.d.ts +10 -30
  409. package/types/src/overlay/overlay.stack.test.d.ts +1 -0
  410. package/types/src/overlay/overlay.types.d.ts +17 -11
  411. package/types/src/state/active-host.d.ts +3 -0
  412. package/types/src/state/index.d.ts +16 -2
  413. package/types/src/state/schmancy-context.d.ts +2 -2
  414. package/dist/active-host-BP0zy_Y9.js +0 -63
  415. package/dist/active-host-BP0zy_Y9.js.map +0 -1
  416. package/dist/active-host-jH3iloCR.cjs +0 -1
  417. package/dist/active-host-jH3iloCR.cjs.map +0 -1
  418. package/dist/agent/overlay.confirm-body-BZoUgkdK.js +0 -4574
  419. package/dist/agent/overlay.confirm-body-BZoUgkdK.js.map +0 -1
  420. package/dist/area-BSVOYQDA.cjs +0 -21
  421. package/dist/date-range-inline-nPWIs-3C.cjs +0 -43
  422. package/dist/float-B8EPc_OG.cjs +0 -1
  423. package/dist/form-FtYtZScl.js.map +0 -1
  424. package/dist/form-SHg5FLsd.cjs.map +0 -1
  425. package/dist/icon-B1eZr2ZL.js.map +0 -1
  426. package/dist/menu-Cuxt5K4Y.cjs +0 -23
  427. package/dist/mixins-8dT5j6CS.js +0 -627
  428. package/dist/mixins-8dT5j6CS.js.map +0 -1
  429. package/dist/mixins-BF3Vj8_c.cjs +0 -242
  430. package/dist/mixins-BF3Vj8_c.cjs.map +0 -1
  431. package/dist/notification-CcNoBFEJ.cjs +0 -24
  432. package/dist/overlay-D3c_NY18.js.map +0 -1
  433. package/dist/overlay-Dv2utO4C.cjs +0 -43
  434. package/dist/overlay-Dv2utO4C.cjs.map +0 -1
  435. package/dist/overlay.confirm-body-B2ntyquG.cjs +0 -79
  436. package/dist/overlay.confirm-body-B2ntyquG.cjs.map +0 -1
  437. package/dist/overlay.confirm-body-B_v0ivkn.js.map +0 -1
  438. package/dist/overlay.service-BkSeqXIv.cjs +0 -1
  439. package/dist/radio-group-_WZg8EKM.cjs +0 -19
  440. package/dist/splash-screen-3FtgdVy3.cjs +0 -41
  441. package/dist/src-AYRNg63f.cjs +0 -263
  442. package/dist/state-CHbIt2Dw.js.map +0 -1
  443. package/dist/state-DcGj-pJJ.cjs +0 -1
  444. package/dist/state-DcGj-pJJ.cjs.map +0 -1
  445. package/dist/surface-BNvxLEDN.cjs +0 -7
  446. package/dist/textarea-Bqth6Q8P.cjs +0 -43
  447. package/dist/theme-D4HGKt7N.cjs +0 -181
  448. package/dist/theme-button-LP-Dgr17.cjs +0 -8
  449. package/dist/window-CNu_WnsY.cjs +0 -59
  450. /package/dist/agent/{flow-3RrZM-e7.js → flow-CvG1fLW5.js} +0 -0
  451. /package/dist/agent/{vendor-material-color-33Mj762T.js → vendor-material-color-DcL7ZPxx.js} +0 -0
@@ -1,66 +1,58 @@
1
- import { c as e } from "./mixins-8dT5j6CS.js";
2
- import { a as t } from "./active-host-BP0zy_Y9.js";
1
+ import { p as e, t } from "./SchmancyElement-BQ4DFufc.js";
2
+ import "./mixins-BYfSDvbP.js";
3
3
  import { _ as n, d as r, f as i, u as a } from "./animation-DCznELuT.js";
4
4
  import { t as o } from "./reduced-motion-D-L12p7G.js";
5
- import { t as s } from "./layout-DSAjo92m.js";
6
- import "./overlay.service-B3FjXCqc.js";
7
- import "./overlay.confirm-body-B_v0ivkn.js";
8
- import { EMPTY as c, Observable as l, Subject as u, debounceTime as d, distinctUntilChanged as f, filter as p, fromEvent as m, map as h, merge as g, take as _, takeUntil as v, tap as y } from "rxjs";
9
- import { customElement as b, property as x, query as S, state as C } from "lit/decorators.js";
10
- import { css as w, html as T, render as E } from "lit";
11
- import { when as D } from "lit/directives/when.js";
12
- import { autoUpdate as O, computePosition as k, flip as A, offset as j, shift as M, size as N } from "@floating-ui/dom";
13
- var P = o.value;
5
+ import { t as s } from "./layout-9K1zxhZn.js";
6
+ import { s as c } from "./overlay.service-DnT4SBlJ.js";
7
+ import "./overlay.confirm-body-CRk4MvKh.js";
8
+ import { EMPTY as l, Observable as u, Subject as d, debounceTime as f, distinctUntilChanged as p, filter as m, fromEvent as h, map as g, merge as _, take as v, takeUntil as y, tap as b } from "rxjs";
9
+ import { customElement as x, property as S, query as C, state as w } from "lit/decorators.js";
10
+ import { css as T, html as E, render as D } from "lit";
11
+ import { when as O } from "lit/directives/when.js";
12
+ import { autoUpdate as k, computePosition as A, flip as j, offset as M, shift as N, size as P } from "@floating-ui/dom";
13
+ var F = o.value;
14
14
  o.subscribe((e) => {
15
- P = e;
15
+ F = e;
16
16
  });
17
- var F = "--schmancy-overlay-origin-x", I = "--schmancy-overlay-origin-y", L = `var(${F}, 50%) var(${I}, 50%)`;
18
- function R(e) {
17
+ var I = "--schmancy-overlay-origin-x", L = "--schmancy-overlay-origin-y", R = `var(${I}, 50%) var(${L}, 50%)`;
18
+ function z(e) {
19
19
  return Number.isNaN(e) || !Number.isFinite(e) ? 50 : Math.max(0, Math.min(100, e));
20
20
  }
21
- function z(e) {
21
+ function B(e) {
22
22
  let { surface: t, dragHandle: n, until$: r } = e;
23
- return new l((e) => {
24
- let i = n ?? t, a = new u(), o = !1, s = null, c = 0, l = 0, d = 0;
25
- return g(m(i, "pointerdown").pipe(p((e) => e.isPrimary && (e.pointerType !== "mouse" || e.button === 0)), p((e) => {
23
+ return new u((e) => {
24
+ let i = n ?? t, a = new d(), o = !1, s = null, c = 0, l = 0, u = 0;
25
+ return _(h(i, "pointerdown").pipe(m((e) => e.isPrimary && (e.pointerType !== "mouse" || e.button === 0)), m((e) => {
26
26
  if (n) return !0;
27
27
  let r = t.getBoundingClientRect();
28
28
  return e.clientY - r.top <= 40;
29
- }), y((e) => {
30
- o = !0, s = e.pointerId, c = e.clientY, l = performance.now(), d = 0, t.style.transition = "none", t.style.willChange = "transform";
29
+ }), b((e) => {
30
+ o = !0, s = e.pointerId, c = e.clientY, l = performance.now(), u = 0, t.style.transition = "none", t.style.willChange = "transform";
31
31
  try {
32
32
  i.setPointerCapture?.(e.pointerId);
33
33
  } catch {}
34
- })), m(i, "pointermove").pipe(p(() => o), p((e) => e.pointerId === s), y((e) => {
35
- d = function(e) {
34
+ })), h(i, "pointermove").pipe(m(() => o), m((e) => e.pointerId === s), b((e) => {
35
+ u = function(e) {
36
36
  if (e >= 0) return e;
37
37
  let t = -e;
38
38
  return -Math.max(0, 8 * (Math.log(t + 1) - 2));
39
- }(e.clientY - c), t.style.transform = `translateY(${d}px)`, e.cancelable && e.preventDefault();
40
- })), g(m(i, "pointerup"), m(i, "pointercancel"), m(i, "lostpointercapture")).pipe(p(() => o), p((e) => e.pointerId === s), y(() => {
39
+ }(e.clientY - c), t.style.transform = `translateY(${u}px)`, e.cancelable && e.preventDefault();
40
+ })), _(h(i, "pointerup"), h(i, "pointercancel"), h(i, "lostpointercapture")).pipe(m(() => o), m((e) => e.pointerId === s), b(() => {
41
41
  o = !1;
42
42
  let n = s;
43
43
  s = null;
44
44
  try {
45
45
  n !== null && i.releasePointerCapture?.(n);
46
46
  } catch {}
47
- let r = Math.max(1, performance.now() - l), a = d / r, c = t.getBoundingClientRect().height, u = Math.min(80, .25 * c), f = d > u || d > 20 && a > .4;
47
+ let r = Math.max(1, performance.now() - l), a = u / r, c = t.getBoundingClientRect().height, d = Math.min(80, .25 * c), f = u > d || u > 20 && a > .4;
48
48
  t.style.willChange = "", f ? (t.style.transition = "transform 300ms cubic-bezier(0.16, 1, 0.3, 1)", t.style.transform = "translateY(100%)", e.next("dismiss"), e.complete()) : (t.style.transition = "transform 300ms cubic-bezier(0.16, 1, 0.3, 1)", t.style.transform = "translateY(0)");
49
- }))).pipe(v(g(a, r))).subscribe(), () => {
49
+ }))).pipe(y(_(a, r))).subscribe(), () => {
50
50
  a.next(), a.complete(), t.style.transition = "", t.style.transform = "", t.style.willChange = "";
51
51
  };
52
- }).pipe(_(1));
52
+ }).pipe(v(1));
53
53
  }
54
- function B(e) {
55
- let { anchor: t, content: n, viewport: r } = e, i = r.width < 640, a = r.isCoarsePointer, o = n.height > .8 * r.height, s = n.width > .9 * r.width;
56
- return i || a || o || s ? "sheet" : t === void 0 ? "centered" : "anchored";
57
- }
58
- function V() {
59
- return {
60
- width: window.innerWidth,
61
- height: window.innerHeight,
62
- isCoarsePointer: window.matchMedia("(pointer: coarse)").matches
63
- };
54
+ function V(e) {
55
+ return e.anchor === void 0 ? "sheet" : "anchored";
64
56
  }
65
57
  function H(e, t) {
66
58
  return {
@@ -102,22 +94,22 @@ function W(e) {
102
94
  };
103
95
  }
104
96
  function G(e, t, n = {}) {
105
- return new l((r) => {
97
+ return new u((r) => {
106
98
  let i = t.el ?? t.virtual;
107
99
  if (!i) return void r.error(/* @__PURE__ */ Error("positionFloatingUI requires an element or virtual anchor"));
108
- let a = n.placement ?? "bottom-start", o = n.padding ?? 16, s = n.offsetPx ?? 8, c = O(i, e, async () => {
100
+ let a = n.placement ?? "bottom-start", o = n.padding ?? 16, s = n.offsetPx ?? 8, c = k(i, e, async () => {
109
101
  try {
110
- let { x: t, y: n } = await k(i, e, {
102
+ let { x: t, y: n } = await A(i, e, {
111
103
  strategy: "fixed",
112
104
  placement: a,
113
105
  middleware: [
114
- j(s),
115
- A({
106
+ M(s),
107
+ j({
116
108
  padding: o,
117
109
  fallbackPlacements: K(a)
118
110
  }),
119
- M({ padding: o }),
120
- N({
111
+ N({ padding: o }),
112
+ P({
121
113
  padding: o,
122
114
  apply({ availableWidth: e, availableHeight: t, elements: n }) {
123
115
  n.floating.style.maxWidth = `${Math.max(0, e)}px`, n.floating.style.maxHeight = `${Math.max(0, t)}px`;
@@ -209,14 +201,14 @@ function K(e) {
209
201
  default: return ["top-start", "bottom-end"];
210
202
  }
211
203
  }
212
- var q = "overlay-mount", J = class extends e {
204
+ var q = "overlay-mount", J = class extends t {
213
205
  constructor(...e) {
214
- super(...e), this.layout = "centered", this.dismissable = !0, this.modal = !0, this.tier = "modal", this._active = !1, this._closed$ = new u(), this._mounted = !1, this._closing = !1, this._lastFocusedElement = null, this._inertedSiblings = [], this._lastReResolveAt = 0, this.onBackdropClick = () => {
206
+ super(...e), this.layout = "sheet", this.dismissable = !0, this.modal = !0, this.tier = "modal", this._active = !1, this._closed$ = new d(), this._mounted = !1, this._closing = !1, this._lastFocusedElement = null, this._inertedSiblings = [], this._lastReResolveAt = 0, this.onBackdropClick = () => {
215
207
  this.dismissable && this.close("backdrop");
216
208
  };
217
209
  }
218
210
  static {
219
- this.styles = [w`
211
+ this.styles = [T`
220
212
  :host {
221
213
  position: fixed;
222
214
  inset: 0;
@@ -271,17 +263,8 @@ var q = "overlay-mount", J = class extends e {
271
263
  }(t.anchor), this._active = !0, this.setAttribute("active", ""), await this.updateComplete;
272
264
  let n = this.renderRoot.querySelector(`#${q}`);
273
265
  if (!n) throw Error("schmancy-overlay: mount point missing");
274
- await Y(e, n, t.props);
275
- let r = V(), i = {
276
- width: n.scrollWidth,
277
- height: n.scrollHeight
278
- };
279
- var a;
280
- if (this.layout = B({
281
- anchor: t.anchor,
282
- content: i,
283
- viewport: r
284
- }), this.modal = t.modal ?? (this.layout === "centered" || this.layout === "sheet"), this.tier = this.modal ? "modal" : this._resolvedAnchor ? (a = this._resolvedAnchor, U.popover && U.cssAnchor && a.el ? "css-anchor" : U.popover ? "popover-fui" : "fui-only") : "modal", await this.updateComplete, this.tier === "css-anchor" && this._resolvedAnchor?.el && this.shadowRoot) {
266
+ var r;
267
+ if (await Y(e, n, t.props), this.layout = t.as ?? V({ anchor: t.anchor }), this.modal = this.layout === "sheet", this.tier = this.modal ? "modal" : this._resolvedAnchor ? (r = this._resolvedAnchor, U.popover && U.cssAnchor && r.el ? "css-anchor" : U.popover ? "popover-fui" : "fui-only") : "modal", await this.updateComplete, this.tier === "css-anchor" && this._resolvedAnchor?.el && this.shadowRoot) {
285
268
  this._positionerTeardown = function(e, t, n, r = { id: "" }) {
286
269
  if (!t.el) throw Error("positionCSSAnchor requires an element anchor");
287
270
  let i = t.el, a = `--ov-${r.id || Math.random().toString(36).slice(2, 10)}`, o = r.placement ?? "bottom-start", s = i.style.getPropertyValue("anchor-name");
@@ -318,7 +301,7 @@ var q = "overlay-mount", J = class extends e {
318
301
  placement: t.preferredPlacement ?? "bottom-start",
319
302
  offsetPx: 8,
320
303
  track: !1 !== t.track
321
- }).pipe(v(this.disconnecting)).subscribe();
304
+ }).pipe(y(this.disconnecting)).subscribe();
322
305
  this._positionerTeardown = () => {
323
306
  e(), n.unsubscribe();
324
307
  };
@@ -327,7 +310,7 @@ var q = "overlay-mount", J = class extends e {
327
310
  placement: t.preferredPlacement ?? "bottom-start",
328
311
  offsetPx: 8,
329
312
  track: !1 !== t.track
330
- }).pipe(v(this.disconnecting)).subscribe();
313
+ }).pipe(y(this.disconnecting)).subscribe();
331
314
  this._positionerTeardown = () => e.unsubscribe();
332
315
  }
333
316
  this.setAnchorOriginVars(), this.wireFocusTrap(), this.wireCloseTriggers(t.signal), this.wireResizeObserver(n), await this.playAnimations("in");
@@ -351,11 +334,11 @@ var q = "overlay-mount", J = class extends e {
351
334
  }
352
335
  }
353
336
  render() {
354
- if (!this._active) return T``;
355
- let e = this.layout === "centered" ? "top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 max-w-[min(calc(100vw-2rem),560px)] max-h-[90dvh] rounded-3xl shadow-overlay" : this.layout === "sheet" ? "left-0 right-0 bottom-0 w-full max-h-[90dvh] rounded-t-[28px] shadow-overlay" : "max-w-[min(480px,calc(100vw-2rem))] max-h-[90dvh] rounded-3xl shadow-overlay-anchored";
356
- return T`
337
+ if (!this._active) return E``;
338
+ let e = this.layout === "sheet" ? "left-0 right-0 bottom-0 w-full max-h-[90dvh] rounded-t-[28px] shadow-overlay" : "max-w-[min(480px,calc(100vw-2rem))] max-h-[90dvh] rounded-3xl shadow-overlay-anchored";
339
+ return E`
357
340
  <div class="shell fixed inset-0 pointer-events-none" part="shell">
358
- ${D(this.modal, () => T`<div class="backdrop fixed inset-0 pointer-events-auto" part="backdrop" @click=${this.onBackdropClick}></div>`)}
341
+ ${O(this.modal, () => E`<div class="backdrop fixed inset-0 pointer-events-auto" part="backdrop" @click=${this.onBackdropClick}></div>`)}
359
342
  <section
360
343
  class="${"surface fixed pointer-events-auto overflow-auto bg-surface-container/85 text-surface-on backdrop-blur-md border border-surface-on/8"} ${e}"
361
344
  part="surface"
@@ -373,10 +356,10 @@ var q = "overlay-mount", J = class extends e {
373
356
  setAnchorOriginVars() {
374
357
  let e = this._surface;
375
358
  if (!e) return;
376
- let t = e.getBoundingClientRect(), n = this.layout !== "centered" || this._anchorOriginAnchor ? this.layout !== "sheet" || this._anchorOriginAnchor ? function(e, t) {
359
+ let t = e.getBoundingClientRect(), n = this.layout !== "sheet" || this._anchorOriginAnchor ? function(e, t) {
377
360
  if (!e) return {
378
- [F]: "50%",
379
- [I]: "50%"
361
+ [I]: "50%",
362
+ [L]: "50%"
380
363
  };
381
364
  let { x: n, y: r } = function(e) {
382
365
  if (typeof e.getBoundingClientRect == "function") {
@@ -414,20 +397,17 @@ var q = "overlay-mount", J = class extends e {
414
397
  };
415
398
  }(e);
416
399
  if (!t.width || !t.height) return {
417
- [F]: "50%",
418
- [I]: "50%"
400
+ [I]: "50%",
401
+ [L]: "50%"
419
402
  };
420
- let i = R((n - t.left) / t.width * 100), a = R((r - t.top) / t.height * 100);
403
+ let i = z((n - t.left) / t.width * 100), a = z((r - t.top) / t.height * 100);
421
404
  return {
422
- [F]: `${i}%`,
423
- [I]: `${a}%`
405
+ [I]: `${i}%`,
406
+ [L]: `${a}%`
424
407
  };
425
408
  }(this._anchorOriginAnchor, t) : {
426
409
  "--schmancy-overlay-origin-x": "50%",
427
410
  "--schmancy-overlay-origin-y": "100%"
428
- } : {
429
- "--schmancy-overlay-origin-x": "50%",
430
- "--schmancy-overlay-origin-y": "50%"
431
411
  };
432
412
  for (let [t, r] of Object.entries(n)) e.style.setProperty(t, r);
433
413
  }
@@ -456,29 +436,36 @@ var q = "overlay-mount", J = class extends e {
456
436
  if (e?.aborted) return void queueMicrotask(() => {
457
437
  this.close("abort");
458
438
  });
459
- let n = m(this, "close").pipe(p((e) => e instanceof CustomEvent), y((e) => e.stopPropagation()), h((e) => ({
439
+ let n = h(this, "close").pipe(m((e) => e instanceof CustomEvent), b((e) => e.stopPropagation()), g((e) => ({
460
440
  reason: "structured",
461
441
  result: e.detail
462
- }))), r = m(this, "submit").pipe(p((e) => {
442
+ }))), r = h(this, "submit").pipe(m((e) => {
463
443
  let t = e.target;
464
444
  return !!t && t.method === "dialog";
465
- }), y((e) => e.preventDefault()), h((e) => ({
445
+ }), b((e) => e.preventDefault()), g((e) => ({
466
446
  reason: "native-submit",
467
447
  result: e.submitter?.value ?? ""
468
- }))), i = m(document, "keydown").pipe(p((e) => e.key === "Escape"), y((e) => e.preventDefault()), p(() => this.dismissable), h(() => ({ reason: "escape" })), _(1)), a = this.tier === "modal" ? null : m(document, "pointerdown", { capture: !0 }).pipe(p((e) => {
448
+ }))), i = h(document, "keydown").pipe(m((e) => e.key === "Escape"), b((e) => e.preventDefault()), m(() => this.dismissable), g(() => ({ reason: "escape" })), v(1)), a = this.tier === "modal" ? null : h(document, "pointerdown", { capture: !0 }).pipe(m((e) => {
469
449
  if (!this.dismissable) return !1;
470
450
  let t = e.composedPath();
471
- return (!this._surface || !t.includes(this._surface)) && (!this._resolvedAnchor?.el || !t.includes(this._resolvedAnchor.el));
472
- }), h(() => ({ reason: "backdrop" })), _(1)), o = this.layout === "sheet" && this.dismissable ? z({
451
+ if (this._surface && t.includes(this._surface) || this._resolvedAnchor?.el && t.includes(this._resolvedAnchor.el)) return !1;
452
+ let n = c(), r = n.findIndex((e) => e.element === this);
453
+ if (r !== -1) for (let e = r + 1; e < n.length; e++) {
454
+ if (t.includes(n[e].element)) return !1;
455
+ let r = n[e].element.shadowRoot?.querySelector(".surface");
456
+ if (r && t.includes(r)) return !1;
457
+ }
458
+ return !0;
459
+ }), g(() => ({ reason: "backdrop" })), v(1)), o = this.layout === "sheet" && this.dismissable ? B({
473
460
  surface: this._surface,
474
- until$: g(t, this._closed$)
475
- }).pipe(_(1), h(() => ({ reason: "swipe" }))) : null, s = e ? m(e, "abort").pipe(_(1), h(() => ({ reason: "abort" }))) : null;
476
- g(n, r, i, a ?? c, o ?? c, s ?? c).pipe(v(t)).subscribe(({ reason: e, result: t }) => {
461
+ until$: _(t, this._closed$)
462
+ }).pipe(v(1), g(() => ({ reason: "swipe" }))) : null, s = e ? h(e, "abort").pipe(v(1), g(() => ({ reason: "abort" }))) : null;
463
+ _(n, r, i, a ?? l, o ?? l, s ?? l).pipe(y(t)).subscribe(({ reason: e, result: t }) => {
477
464
  this.close(e, t);
478
465
  });
479
466
  }
480
467
  wireResizeObserver(e) {
481
- s(e).pipe(h((e) => {
468
+ s(e).pipe(g((e) => {
482
469
  let t = e[0];
483
470
  if (!t) return null;
484
471
  let n = t.contentRect;
@@ -486,24 +473,17 @@ var q = "overlay-mount", J = class extends e {
486
473
  w: n.width,
487
474
  h: n.height
488
475
  };
489
- }), p((e) => e !== null), f((e, t) => e.w === t.w && e.h === t.h), d(80), v(g(this.disconnecting, this._closed$))).subscribe((e) => this.maybeReResolve(e));
476
+ }), m((e) => e !== null), p((e, t) => e.w === t.w && e.h === t.h), f(80), y(_(this.disconnecting, this._closed$))).subscribe((e) => this.maybeReResolve(e));
490
477
  }
491
478
  async maybeReResolve(e) {
492
479
  if (this._closing) return;
493
- let t = V(), i = B({
494
- anchor: this._rawAnchor,
495
- content: {
496
- width: e.w,
497
- height: e.h
498
- },
499
- viewport: t
500
- });
501
- if (i === this.layout || performance.now() - this._lastReResolveAt < 600 || (a = this.layout, o = i, !(a === "centered" && o === "sheet" || a === "anchored" && o === "sheet"))) return;
502
- var a, o;
503
- let s = this._surface, c = s.getBoundingClientRect();
504
- this.layout = i, await this.updateComplete;
505
- let l = function(e, t) {
506
- return P ? {
480
+ let t = V({ anchor: this._rawAnchor });
481
+ if (t === this.layout || performance.now() - this._lastReResolveAt < 600 || (i = this.layout, a = t, i !== "anchored" || a !== "sheet")) return;
482
+ var i, a;
483
+ let o = this._surface, s = o.getBoundingClientRect();
484
+ this.layout = t, await this.updateComplete;
485
+ let c = function(e, t) {
486
+ return F ? {
507
487
  keyframes: [{ transform: "none" }, { transform: "none" }],
508
488
  options: {
509
489
  duration: 1,
@@ -524,9 +504,9 @@ var q = "overlay-mount", J = class extends e {
524
504
  fill: "forwards"
525
505
  }
526
506
  };
527
- }(c, s.getBoundingClientRect());
507
+ }(s, o.getBoundingClientRect());
528
508
  try {
529
- await s.animate(l.keyframes, l.options).finished;
509
+ await o.animate(c.keyframes, c.options).finished;
530
510
  } catch {}
531
511
  this._lastReResolveAt = performance.now();
532
512
  }
@@ -534,7 +514,7 @@ var q = "overlay-mount", J = class extends e {
534
514
  let t = this._surface;
535
515
  if (!t) return;
536
516
  let o = function(e, t) {
537
- if (P) return t === "in" ? {
517
+ if (F) return t === "in" ? {
538
518
  keyframes: [{
539
519
  opacity: 0,
540
520
  transform: "none"
@@ -562,37 +542,6 @@ var q = "overlay-mount", J = class extends e {
562
542
  }
563
543
  };
564
544
  switch (e) {
565
- case "centered": return t === "in" ? {
566
- keyframes: [{
567
- opacity: 0,
568
- transform: "scale(0.6)",
569
- transformOrigin: L
570
- }, {
571
- opacity: 1,
572
- transform: "scale(1)",
573
- transformOrigin: L
574
- }],
575
- options: {
576
- duration: i.duration,
577
- easing: n(i),
578
- fill: "forwards"
579
- }
580
- } : {
581
- keyframes: [{
582
- opacity: 1,
583
- transform: "scale(1)",
584
- transformOrigin: L
585
- }, {
586
- opacity: 0,
587
- transform: "scale(0.95)",
588
- transformOrigin: L
589
- }],
590
- options: {
591
- duration: 150,
592
- easing: n(r),
593
- fill: "forwards"
594
- }
595
- };
596
545
  case "sheet": return t === "in" ? {
597
546
  keyframes: [{
598
547
  opacity: 0,
@@ -624,11 +573,11 @@ var q = "overlay-mount", J = class extends e {
624
573
  keyframes: [{
625
574
  opacity: 0,
626
575
  transform: "scale(0.85)",
627
- transformOrigin: L
576
+ transformOrigin: R
628
577
  }, {
629
578
  opacity: 1,
630
579
  transform: "scale(1)",
631
- transformOrigin: L
580
+ transformOrigin: R
632
581
  }],
633
582
  options: {
634
583
  duration: i.duration,
@@ -639,11 +588,11 @@ var q = "overlay-mount", J = class extends e {
639
588
  keyframes: [{
640
589
  opacity: 1,
641
590
  transform: "scale(1)",
642
- transformOrigin: L
591
+ transformOrigin: R
643
592
  }, {
644
593
  opacity: 0,
645
594
  transform: "scale(0.92)",
646
- transformOrigin: L
595
+ transformOrigin: R
647
596
  }],
648
597
  options: {
649
598
  duration: 150,
@@ -665,7 +614,7 @@ async function Y(e, t, n) {
665
614
  var r;
666
615
  if (function(e) {
667
616
  return typeof e == "object" && !!e && "_$litType$" in e;
668
- }(e)) return E(e, t), t;
617
+ }(e)) return D(e, t), t;
669
618
  if (e instanceof HTMLElement) return n && Object.assign(e, n), t.appendChild(e), e;
670
619
  if (function(e) {
671
620
  return typeof e == "function" && ("preload" in e || "_promise" in e);
@@ -680,17 +629,17 @@ async function Y(e, t, n) {
680
629
  }
681
630
  throw Error("schmancy-overlay: unsupported content type");
682
631
  }
683
- t([x({
632
+ e([S({
684
633
  type: String,
685
634
  reflect: !0
686
- })], J.prototype, "layout", void 0), t([x({
635
+ })], J.prototype, "layout", void 0), e([S({
687
636
  type: Boolean,
688
637
  reflect: !0
689
- })], J.prototype, "dismissable", void 0), t([x({
638
+ })], J.prototype, "dismissable", void 0), e([S({
690
639
  type: Boolean,
691
640
  reflect: !0
692
- })], J.prototype, "modal", void 0), t([x({
641
+ })], J.prototype, "modal", void 0), e([S({
693
642
  type: String,
694
643
  reflect: !0
695
- })], J.prototype, "tier", void 0), t([C()], J.prototype, "_active", void 0), t([S(".backdrop")], J.prototype, "_backdrop", void 0), t([S(".surface")], J.prototype, "_surface", void 0), J = t([b("schmancy-overlay")], J);
644
+ })], J.prototype, "tier", void 0), e([w()], J.prototype, "_active", void 0), e([C(".backdrop")], J.prototype, "_backdrop", void 0), e([C(".surface")], J.prototype, "_surface", void 0), J = e([x("schmancy-overlay")], J);
696
645
  export { J as t };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay-CujzmLxg.js","names":[],"sources":["../src/overlay/overlay.animations.ts","../src/overlay/overlay.gestures.ts","../src/overlay/overlay.layout.ts","../src/overlay/overlay.positioning.ts","../src/overlay/overlay.component.ts"],"sourcesContent":["import {\n\tDURATION_EXIT,\n\tgetEasing,\n\tSPRING_GENTLE,\n\tSPRING_SMOOTH,\n\tSPRING_SNAPPY,\n} from '../utils/animation'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport type { Anchor, OverlayLayout } from './overlay.types'\n\n/**\n * WAAPI keyframes + options per layout + direction.\n *\n * One animation vocabulary — no per-element bespoke keyframes. Aligns\n * with the `animation` skill (spring physics presets). Every easing runs\n * through `getEasing()` so modern browsers (that support\n * `animation-timing-function: linear(0, 1)`) get the true `linear()`\n * spring expression while older browsers fall through to the cubic-bezier\n * fallback. Honors `prefers-reduced-motion` by collapsing transforms to\n * opacity-only.\n *\n * Anchor-origin bloom: the caller computes\n * `anchorOriginVars(anchor, surfaceRect)` and writes the resulting CSS\n * custom properties onto the surface element BEFORE triggering the\n * entrance animation. Keyframes reference those vars via\n * `transform-origin: var(--schmancy-overlay-origin-x, 50%) var(...)`, so\n * the surface scales OUT of the click point — not from its own centre.\n */\n\n/**\n * Shape matches both DOM `AnimationEffectTiming` and\n * `KeyframeAnimationOptions` so it passes structural checks in both\n * older and newer `lib.dom.d.ts` vintages.\n */\nexport interface AnimationSpec {\n\tkeyframes: Keyframe[]\n\toptions: {\n\t\tduration: number\n\t\teasing: string\n\t\tfill?: FillMode\n\t}\n}\n\n/**\n * Module-scope reduced-motion state, kept in sync with the house\n * `reducedMotion$` BehaviorSubject. The subscribe has no teardown —\n * module lifetime IS the subscription lifetime (house rxjs rule 4:\n * module singletons don't need explicit teardown).\n */\nlet reducedMotion = reducedMotion$.value\nreducedMotion$.subscribe((v) => {\n\treducedMotion = v\n})\n\nconst ORIGIN_X_VAR = '--schmancy-overlay-origin-x'\nconst ORIGIN_Y_VAR = '--schmancy-overlay-origin-y'\nconst ORIGIN_CSS = `var(${ORIGIN_X_VAR}, 50%) var(${ORIGIN_Y_VAR}, 50%)`\n\nfunction clampPercent(value: number): number {\n\tif (Number.isNaN(value) || !Number.isFinite(value)) return 50\n\treturn Math.max(0, Math.min(100, value))\n}\n\nfunction getAnchorCenter(anchor: Anchor): { x: number; y: number } {\n\t// Element | VirtualAnchor — anything exposing getBoundingClientRect()\n\tif (\n\t\ttypeof (anchor as { getBoundingClientRect?: unknown }).getBoundingClientRect === 'function'\n\t) {\n\t\tconst r = (anchor as { getBoundingClientRect(): DOMRect }).getBoundingClientRect()\n\t\treturn { x: r.left + r.width / 2, y: r.top + r.height / 2 }\n\t}\n\t// DOMRect — has left/top/width/height but no getBoundingClientRect()\n\tif (\n\t\ttypeof (anchor as DOMRect).width === 'number' &&\n\t\ttypeof (anchor as DOMRect).height === 'number' &&\n\t\ttypeof (anchor as DOMRect).left === 'number' &&\n\t\ttypeof (anchor as DOMRect).top === 'number'\n\t) {\n\t\tconst r = anchor as DOMRect\n\t\treturn { x: r.left + r.width / 2, y: r.top + r.height / 2 }\n\t}\n\t// MouseEvent / PointerEvent\n\tif (typeof (anchor as MouseEvent).clientX === 'number' && typeof (anchor as MouseEvent).clientY === 'number') {\n\t\tconst e = anchor as MouseEvent\n\t\treturn { x: e.clientX, y: e.clientY }\n\t}\n\t// TouchEvent\n\tif (\n\t\ttypeof (anchor as TouchEvent).touches !== 'undefined' &&\n\t\t(anchor as TouchEvent).touches.length > 0\n\t) {\n\t\tconst t = (anchor as TouchEvent).touches[0]\n\t\treturn { x: t.clientX, y: t.clientY }\n\t}\n\t// Plain { x, y } point\n\tconst pt = anchor as { x: number; y: number }\n\treturn { x: pt.x, y: pt.y }\n}\n\n/**\n * Compute CSS-var values for the anchor-relative transform origin.\n * Caller writes the returned record onto the surface element's style\n * before triggering the entrance animation. When no anchor is present,\n * returns sensible per-layout defaults (caller picks which to use):\n * - centered → 50% 50% (self-centre)\n * - sheet → 50% 100% (rises from bottom edge)\n * - anchored → computed from the anchor's position relative to the\n * surface rect\n */\nexport function anchorOriginVars(\n\tanchor: Anchor | undefined,\n\tsurfaceRect: DOMRect | { left: number; top: number; width: number; height: number },\n): Record<string, string> {\n\tif (!anchor) {\n\t\treturn {\n\t\t\t[ORIGIN_X_VAR]: '50%',\n\t\t\t[ORIGIN_Y_VAR]: '50%',\n\t\t}\n\t}\n\tconst { x, y } = getAnchorCenter(anchor)\n\tif (!surfaceRect.width || !surfaceRect.height) {\n\t\treturn {\n\t\t\t[ORIGIN_X_VAR]: '50%',\n\t\t\t[ORIGIN_Y_VAR]: '50%',\n\t\t}\n\t}\n\tconst originX = clampPercent(((x - surfaceRect.left) / surfaceRect.width) * 100)\n\tconst originY = clampPercent(((y - surfaceRect.top) / surfaceRect.height) * 100)\n\treturn {\n\t\t[ORIGIN_X_VAR]: `${originX}%`,\n\t\t[ORIGIN_Y_VAR]: `${originY}%`,\n\t}\n}\n\nexport function surfaceAnimation(layout: OverlayLayout, direction: 'in' | 'out'): AnimationSpec {\n\tif (reducedMotion) {\n\t\t// Opacity-only; explicit reset to { opacity: 1, transform: none } on `in`\n\t\t// so any leftover transform from a prior `out` doesn't persist.\n\t\treturn direction === 'in'\n\t\t\t? {\n\t\t\t\t\tkeyframes: [\n\t\t\t\t\t\t{ opacity: 0, transform: 'none' },\n\t\t\t\t\t\t{ opacity: 1, transform: 'none' },\n\t\t\t\t\t],\n\t\t\t\t\toptions: { duration: 1, easing: 'linear', fill: 'forwards' },\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\tkeyframes: [\n\t\t\t\t\t\t{ opacity: 1, transform: 'none' },\n\t\t\t\t\t\t{ opacity: 0, transform: 'none' },\n\t\t\t\t\t],\n\t\t\t\t\toptions: { duration: 1, easing: 'linear', fill: 'forwards' },\n\t\t\t\t}\n\t}\n\n\tswitch (layout) {\n\t\tcase 'sheet':\n\t\t\treturn direction === 'in'\n\t\t\t\t? {\n\t\t\t\t\t\tkeyframes: [\n\t\t\t\t\t\t\t{ opacity: 0, transform: 'translateY(100%)' },\n\t\t\t\t\t\t\t{ opacity: 1, transform: 'translateY(0)' },\n\t\t\t\t\t\t],\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tduration: SPRING_GENTLE.duration,\n\t\t\t\t\t\t\teasing: getEasing(SPRING_GENTLE),\n\t\t\t\t\t\t\tfill: 'forwards',\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tkeyframes: [\n\t\t\t\t\t\t\t{ opacity: 1, transform: 'translateY(0)' },\n\t\t\t\t\t\t\t{ opacity: 0, transform: 'translateY(100%)' },\n\t\t\t\t\t\t],\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tduration: DURATION_EXIT,\n\t\t\t\t\t\t\teasing: getEasing(SPRING_SMOOTH),\n\t\t\t\t\t\t\tfill: 'forwards',\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\n\t\tcase 'anchored':\n\t\t\t// Anchored surfaces get a scale-from-origin treatment too — the\n\t\t\t// positioning strategy (Popover API / CSS Anchor / Floating UI) owns\n\t\t\t// the final placement; the surface merely blooms from the anchor.\n\t\t\treturn direction === 'in'\n\t\t\t\t? {\n\t\t\t\t\t\tkeyframes: [\n\t\t\t\t\t\t\t{ opacity: 0, transform: 'scale(0.85)', transformOrigin: ORIGIN_CSS },\n\t\t\t\t\t\t\t{ opacity: 1, transform: 'scale(1)', transformOrigin: ORIGIN_CSS },\n\t\t\t\t\t\t],\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tduration: SPRING_SNAPPY.duration,\n\t\t\t\t\t\t\teasing: getEasing(SPRING_SNAPPY),\n\t\t\t\t\t\t\tfill: 'forwards',\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tkeyframes: [\n\t\t\t\t\t\t\t{ opacity: 1, transform: 'scale(1)', transformOrigin: ORIGIN_CSS },\n\t\t\t\t\t\t\t{ opacity: 0, transform: 'scale(0.92)', transformOrigin: ORIGIN_CSS },\n\t\t\t\t\t\t],\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tduration: DURATION_EXIT,\n\t\t\t\t\t\t\teasing: getEasing(SPRING_SMOOTH),\n\t\t\t\t\t\t\tfill: 'forwards',\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t}\n}\n\n/**\n * FLIP (First / Last / Invert / Play) animation from `before` rect to\n * `after` rect. Caller has already moved the element between the two\n * states; this produces the WAAPI spec that animates the delta back.\n *\n * Used by the ResizeObserver-driven layout re-resolve in the overlay\n * element — when content grows past threshold mid-session and the\n * layout switches from centered → sheet, this animates the transition\n * instead of a hard cut.\n *\n * Reduced-motion collapses to an instant 1ms no-op; caller should check\n * `reducedMotion` (not exported) — or just run this and tolerate the\n * 1ms animation.\n */\nexport function flipAnimation(\n\tbefore: DOMRect | { left: number; top: number; width: number; height: number },\n\tafter: DOMRect | { left: number; top: number; width: number; height: number },\n): AnimationSpec {\n\tif (reducedMotion) {\n\t\treturn {\n\t\t\tkeyframes: [{ transform: 'none' }, { transform: 'none' }],\n\t\t\toptions: { duration: 1, easing: 'linear', fill: 'forwards' },\n\t\t}\n\t}\n\tconst dx = before.left - after.left\n\tconst dy = before.top - after.top\n\tconst sx = after.width > 0 ? before.width / after.width : 1\n\tconst sy = after.height > 0 ? before.height / after.height : 1\n\treturn {\n\t\tkeyframes: [\n\t\t\t{\n\t\t\t\ttransform: `translate(${dx}px, ${dy}px) scale(${sx}, ${sy})`,\n\t\t\t\ttransformOrigin: 'top left',\n\t\t\t},\n\t\t\t{ transform: 'none', transformOrigin: 'top left' },\n\t\t],\n\t\toptions: {\n\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\teasing: getEasing(SPRING_SMOOTH),\n\t\t\tfill: 'forwards',\n\t\t},\n\t}\n}\n","import { filter, fromEvent, merge, Observable, Subject, take, takeUntil, tap } from 'rxjs'\n\n/**\n * Swipe-to-dismiss gesture for sheet-layout overlays.\n *\n * Pointer-event based — a single pipeline covers touch, mouse, pen, and\n * any future pointer source. Without a visible drag handle, the gesture\n * only starts within the top DRAG_START_TOP_PX band of the surface (a\n * standard pull-to-dismiss convention). Escape + backdrop click cover\n * the non-pointer dismiss paths via the component's modal-tier listeners.\n *\n * RxJS-native (rxjs skill principle 3: every async source is an Observable).\n * Thresholds are policy constants, not magic numbers.\n */\n\n/** Distance (px) past which the gesture dismisses. */\nexport const DISMISS_DISTANCE_PX = 80\n/** Distance as fraction of sheet height past which the gesture dismisses. */\nexport const DISMISS_DISTANCE_FRACTION = 0.25 // Vaul's value — feels right.\n/** Velocity (px/ms) past which the gesture dismisses even short of distance. */\nexport const DISMISS_VELOCITY_PX_PER_MS = 0.4 // Vaul's value.\n/** Drag only starts if pointerdown is within this top band (unless a drag handle is used). */\nexport const DRAG_START_TOP_PX = 40\n/** Snap-back animation duration when gesture doesn't pass threshold. */\nexport const SNAP_BACK_MS = 300\n\n/**\n * Logarithmic rubber-band damping for upward (negative) drag past the\n * top detent. Pulled from Vaul — `8 * (log(v + 1) - 2)` — diminishing\n * returns that feel physical, unlike the linear × 0.2 this replaces.\n *\n * Applied only to upward motion; downward drag tracks 1:1.\n */\nexport function logDamp(delta: number): number {\n\tif (delta >= 0) return delta\n\tconst abs = -delta\n\treturn -Math.max(0, 8 * (Math.log(abs + 1) - 2))\n}\n\nexport interface SwipeInputs {\n\t/** The surface element to track gestures on. */\n\tsurface: HTMLElement\n\t/** Optional drag handle. When provided, drag can start from anywhere on\n\t * the handle; without it, drag must start in the top DRAG_START_TOP_PX band. */\n\tdragHandle?: HTMLElement | null\n\t/** Completes the gesture stream (component disconnect / layout change). */\n\tuntil$: Observable<unknown>\n}\n\n/**\n * Emits exactly once when the user commits to dismissing the sheet\n * (distance OR velocity threshold passed). Works for touch, mouse, and\n * pen via the Pointer Events API. During an in-progress drag the\n * surface's `transform` is updated directly for 1:1 tracking. On\n * release-but-not-dismissed, the surface snaps back via a CSS transition.\n */\nexport function swipeToDismiss$(inputs: SwipeInputs): Observable<'dismiss'> {\n\tconst { surface, dragHandle, until$ } = inputs\n\n\treturn new Observable<'dismiss'>((subscriber) => {\n\t\tconst dragTarget = dragHandle ?? surface\n\t\tconst stopCurrent$ = new Subject<void>()\n\n\t\tlet dragging = false\n\t\tlet activePointerId: number | null = null\n\t\tlet startY = 0\n\t\tlet startTime = 0\n\t\tlet currentDelta = 0\n\n\t\tconst pointerDown$ = fromEvent<PointerEvent>(dragTarget, 'pointerdown').pipe(\n\t\t\t// Primary button / primary finger only. For touch, isPrimary also\n\t\t\t// covers the pinch-zoom guard (only one finger has isPrimary=true).\n\t\t\tfilter((e) => e.isPrimary && (e.pointerType !== 'mouse' || e.button === 0)),\n\t\t\t// Without a dedicated drag handle, require start in the top band.\n\t\t\tfilter((e) => {\n\t\t\t\tif (dragHandle) return true\n\t\t\t\tconst rect = surface.getBoundingClientRect()\n\t\t\t\treturn e.clientY - rect.top <= DRAG_START_TOP_PX\n\t\t\t}),\n\t\t\ttap((e) => {\n\t\t\t\tdragging = true\n\t\t\t\tactivePointerId = e.pointerId\n\t\t\t\tstartY = e.clientY\n\t\t\t\tstartTime = performance.now()\n\t\t\t\tcurrentDelta = 0\n\t\t\t\tsurface.style.transition = 'none'\n\t\t\t\tsurface.style.willChange = 'transform'\n\t\t\t\t// Capture so pointermove fires even if the pointer leaves the element\n\t\t\t\t// (covers the \"drag from handle, move past surface edge\" case).\n\t\t\t\ttry {\n\t\t\t\t\t;(dragTarget as Element).setPointerCapture?.(e.pointerId)\n\t\t\t\t} catch {\n\t\t\t\t\t// setPointerCapture can throw on detached elements; safe to ignore.\n\t\t\t\t}\n\t\t\t}),\n\t\t)\n\n\t\tconst pointerMove$ = fromEvent<PointerEvent>(dragTarget, 'pointermove').pipe(\n\t\t\tfilter(() => dragging),\n\t\t\tfilter((e) => e.pointerId === activePointerId),\n\t\t\ttap((e) => {\n\t\t\t\tconst deltaY = e.clientY - startY\n\t\t\t\tcurrentDelta = logDamp(deltaY)\n\t\t\t\tsurface.style.transform = `translateY(${currentDelta}px)`\n\t\t\t\t// preventDefault is a no-op on default Pointer Events but avoids\n\t\t\t\t// accidental text selection / page scroll during the drag.\n\t\t\t\tif (e.cancelable) e.preventDefault()\n\t\t\t}),\n\t\t)\n\n\t\tconst pointerEnd$ = merge(\n\t\t\tfromEvent<PointerEvent>(dragTarget, 'pointerup'),\n\t\t\tfromEvent<PointerEvent>(dragTarget, 'pointercancel'),\n\t\t\tfromEvent<PointerEvent>(dragTarget, 'lostpointercapture'),\n\t\t).pipe(\n\t\t\tfilter(() => dragging),\n\t\t\tfilter((e) => e.pointerId === activePointerId),\n\t\t\ttap(() => {\n\t\t\t\tdragging = false\n\t\t\t\tconst pointerId = activePointerId\n\t\t\t\tactivePointerId = null\n\t\t\t\ttry {\n\t\t\t\t\tif (pointerId !== null) (dragTarget as Element).releasePointerCapture?.(pointerId)\n\t\t\t\t} catch {\n\t\t\t\t\t// same reason as setPointerCapture — ignore.\n\t\t\t\t}\n\n\t\t\t\tconst elapsed = Math.max(1, performance.now() - startTime)\n\t\t\t\tconst velocity = currentDelta / elapsed\n\t\t\t\tconst surfaceHeight = surface.getBoundingClientRect().height\n\t\t\t\tconst distanceThreshold = Math.min(DISMISS_DISTANCE_PX, surfaceHeight * DISMISS_DISTANCE_FRACTION)\n\n\t\t\t\tconst shouldDismiss =\n\t\t\t\t\tcurrentDelta > distanceThreshold ||\n\t\t\t\t\t(currentDelta > 20 && velocity > DISMISS_VELOCITY_PX_PER_MS)\n\n\t\t\t\tsurface.style.willChange = ''\n\n\t\t\t\tif (shouldDismiss) {\n\t\t\t\t\t// Finish translate off-screen for visual continuity with the dismiss\n\t\t\t\t\t// animation; the caller's teardown will unmount.\n\t\t\t\t\tsurface.style.transition = `transform ${SNAP_BACK_MS}ms cubic-bezier(0.16, 1, 0.3, 1)`\n\t\t\t\t\tsurface.style.transform = 'translateY(100%)'\n\t\t\t\t\tsubscriber.next('dismiss')\n\t\t\t\t\tsubscriber.complete()\n\t\t\t\t} else {\n\t\t\t\t\t// Snap back to 0.\n\t\t\t\t\tsurface.style.transition = `transform ${SNAP_BACK_MS}ms cubic-bezier(0.16, 1, 0.3, 1)`\n\t\t\t\t\tsurface.style.transform = 'translateY(0)'\n\t\t\t\t}\n\t\t\t}),\n\t\t)\n\n\t\tmerge(pointerDown$, pointerMove$, pointerEnd$)\n\t\t\t.pipe(takeUntil(merge(stopCurrent$, until$)))\n\t\t\t.subscribe()\n\n\t\treturn () => {\n\t\t\tstopCurrent$.next()\n\t\t\tstopCurrent$.complete()\n\t\t\tsurface.style.transition = ''\n\t\t\tsurface.style.transform = ''\n\t\t\tsurface.style.willChange = ''\n\t\t}\n\t}).pipe(take(1))\n}\n\n","import type { Anchor, OverlayLayout, VirtualAnchor } from './overlay.types'\n\n/**\n * Layout dispatch engine — pure function of (anchor, content, viewport).\n * No DOM access, no side effects — testable with synthetic inputs.\n *\n * Thresholds are policy constants, not magic numbers. Changes are visible\n * as named-constant diffs, not hidden in inline literals (state skill:\n * \"thresholds ARE the policy\").\n */\n\n/** Floating UI / CSS anchor-positioning safety padding. */\nexport const ANCHOR_FIT_PADDING_PX = 16\n\nexport interface LayoutInputs {\n\tanchor?: Anchor\n}\n\n/**\n * Two outcomes, one signal: anchor presence.\n *\n * - anchor provided → anchored (popover/menu/dropdown next to a trigger)\n * - no anchor → sheet (everything else: dialogs, takeovers, content panels)\n *\n * Callers who want to force a specific layout regardless of anchor pass\n * `ShowOptions.as` — the resolver is bypassed entirely in that case.\n *\n * Floating UI's `flip` + `shift` + `size` middleware handles \"anchor doesn't\n * fit initially\" — it returns a fitting position rather than rejecting. So\n * anchored layouts don't need a fallback; Floating UI's output IS the answer.\n */\nexport function resolveLayout(inputs: LayoutInputs): OverlayLayout {\n\treturn inputs.anchor !== undefined ? 'anchored' : 'sheet'\n}\n\n/**\n * Resolved reference the positioning strategies consume.\n *\n * `el` is populated when the anchor is an HTMLElement — the Popover API\n * tier uses it directly via the `anchor=<id>` attribute, and Tier 1 / CSS\n * Anchor Positioning sets `element.style.anchorName` on it.\n *\n * `virtual` is populated for point/rect/TouchEvent anchors — Floating UI\n * accepts any object exposing `getBoundingClientRect()` as a virtual\n * reference. The Popover API path cannot use virtual references, so a\n * caller passing a point / DOMRect / event forces Tier 3 (or Tier 2 with\n * Floating UI, not CSS Anchor Positioning).\n */\nexport interface ResolvedAnchor {\n\tel?: HTMLElement\n\tvirtual?: VirtualAnchor\n}\n\n/**\n * Normalise an `Anchor` input into the shape the positioning strategies\n * accept. One function, one decision: element wins if present; otherwise\n * synthesize a zero-size virtual reference at the anchor's point.\n *\n * Called by the overlay element during `open()` before dispatching to\n * `pickPositioner(resolved)`.\n */\nexport function resolveAnchorRef(anchor: Anchor | undefined): ResolvedAnchor | undefined {\n\tif (!anchor) return undefined\n\n\t// HTMLElement — native element reference.\n\tif (typeof HTMLElement !== 'undefined' && anchor instanceof HTMLElement) {\n\t\treturn { el: anchor }\n\t}\n\n\t// Any other object with getBoundingClientRect — treat as virtual.\n\tif (typeof (anchor as { getBoundingClientRect?: unknown }).getBoundingClientRect === 'function') {\n\t\treturn {\n\t\t\tvirtual: {\n\t\t\t\tgetBoundingClientRect: () => (anchor as { getBoundingClientRect(): DOMRect }).getBoundingClientRect(),\n\t\t\t},\n\t\t}\n\t}\n\n\t// DOMRect — fixed rect; synthesize a virtual that returns it verbatim.\n\tif (\n\t\ttypeof (anchor as DOMRect).width === 'number' &&\n\t\ttypeof (anchor as DOMRect).height === 'number' &&\n\t\ttypeof (anchor as DOMRect).left === 'number' &&\n\t\ttypeof (anchor as DOMRect).top === 'number'\n\t) {\n\t\tconst rect = anchor as DOMRect\n\t\treturn {\n\t\t\tvirtual: {\n\t\t\t\tgetBoundingClientRect: () => rect,\n\t\t\t},\n\t\t}\n\t}\n\n\t// MouseEvent / PointerEvent — zero-size rect at click point.\n\tif (typeof (anchor as MouseEvent).clientX === 'number' && typeof (anchor as MouseEvent).clientY === 'number') {\n\t\tconst e = anchor as MouseEvent\n\t\tconst rect = makePointRect(e.clientX, e.clientY)\n\t\treturn { virtual: { getBoundingClientRect: () => rect } }\n\t}\n\n\t// TouchEvent — zero-size rect at first touch point.\n\tif (\n\t\ttypeof (anchor as TouchEvent).touches !== 'undefined' &&\n\t\t(anchor as TouchEvent).touches.length > 0\n\t) {\n\t\tconst t = (anchor as TouchEvent).touches[0]\n\t\tconst rect = makePointRect(t.clientX, t.clientY)\n\t\treturn { virtual: { getBoundingClientRect: () => rect } }\n\t}\n\n\t// { x, y } point — zero-size rect at coords.\n\tconst pt = anchor as { x: number; y: number }\n\tconst rect = makePointRect(pt.x, pt.y)\n\treturn { virtual: { getBoundingClientRect: () => rect } }\n}\n\n/**\n * Construct a DOMRect-compatible object for a zero-width / zero-height\n * point. Avoids `new DOMRect(...)` which isn't constructable across all\n * lib.dom.d.ts vintages.\n */\nfunction makePointRect(x: number, y: number): DOMRect {\n\treturn {\n\t\tx,\n\t\ty,\n\t\twidth: 0,\n\t\theight: 0,\n\t\tleft: x,\n\t\tright: x,\n\t\ttop: y,\n\t\tbottom: y,\n\t\ttoJSON() {\n\t\t\treturn { x, y, width: 0, height: 0, left: x, right: x, top: y, bottom: y }\n\t\t},\n\t}\n}\n","import {\n\tautoUpdate,\n\tcomputePosition,\n\tflip,\n\toffset,\n\tshift,\n\tsize,\n\ttype Placement,\n} from '@floating-ui/dom'\nimport { Observable } from 'rxjs'\nimport { ANCHOR_FIT_PADDING_PX, type ResolvedAnchor } from './overlay.layout'\nimport type { OverlayPlacement, OverlayTier } from './overlay.types'\n\n/**\n * Three-tier positioning ladder for anchored overlays. Public API of the\n * overlay doesn't change based on the tier — the strategy is picked\n * internally by feature-detection.\n *\n * Tier 1 — CSS Anchor Positioning (Popover + `anchor-name` / `position-anchor`)\n * Zero-JS position tracking. Chromium-only today.\n *\n * Tier 2 — Popover API + Floating UI\n * Native top-layer + light-dismiss + Esc from `popover=\"auto\"`, Floating\n * UI middleware for the position math. Safari 17+, Chrome 114+, Firefox 125+.\n *\n * Tier 3 — Floating UI only\n * Fallback for browsers without the Popover API. Caller provides manual\n * backdrop + click-outside + Esc wiring.\n */\n\n/**\n * Feature-detection snapshot captured at module load. Frozen so consumers\n * can safely destructure and compare.\n */\nexport const CAPS = Object.freeze({\n\tpopover:\n\t\ttypeof HTMLElement !== 'undefined' &&\n\t\t'popover' in HTMLElement.prototype &&\n\t\ttypeof (HTMLElement.prototype as unknown as { showPopover?: () => void }).showPopover === 'function',\n\tcssAnchor:\n\t\ttypeof CSS !== 'undefined' &&\n\t\ttypeof CSS.supports === 'function' &&\n\t\tCSS.supports('anchor-name: --x'),\n})\n\n/**\n * Pick the positioning tier for an anchor.\n *\n * CSS Anchor Positioning (Tier 1) requires a real element anchor — you\n * can't point `anchor-name` at a DOMRect or a coord. A point/rect anchor\n * forces Tier 2 (or Tier 3 if popover isn't supported).\n */\nexport function pickPositioner(anchor: ResolvedAnchor): OverlayTier {\n\tif (CAPS.popover && CAPS.cssAnchor && anchor.el) return 'css-anchor'\n\tif (CAPS.popover) return 'popover-fui'\n\treturn 'fui-only'\n}\n\n/* ======================================================================= *\n * Tier 1 — Popover API + CSS Anchor *\n * ======================================================================= */\n\n/**\n * Set up CSS Anchor Positioning. Assigns a unique `anchor-name` to the\n * anchor element and injects a stylesheet into the shadow root that\n * positions the surface relative to it. No JS running per frame.\n *\n * Returns a cleanup function that removes the injected styles and the\n * anchor-name from the anchor element.\n */\nexport function positionCSSAnchor(\n\tsurface: HTMLElement,\n\tanchor: ResolvedAnchor,\n\tshadowRoot: ShadowRoot,\n\topts: { id: string; placement?: OverlayPlacement } = { id: '' },\n): () => void {\n\tif (!anchor.el) {\n\t\tthrow new Error('positionCSSAnchor requires an element anchor')\n\t}\n\tconst anchorEl = anchor.el\n\tconst anchorName = `--ov-${opts.id || Math.random().toString(36).slice(2, 10)}`\n\tconst placement = opts.placement ?? 'bottom-start'\n\n\t// Save any prior anchor-name so we can restore it on cleanup.\n\tconst priorAnchorName = anchorEl.style.getPropertyValue('anchor-name')\n\tanchorEl.style.setProperty('anchor-name', anchorName)\n\n\tconst sheet = new CSSStyleSheet()\n\tsheet.replaceSync(`\n\t\t${surface.localName}[data-overlay-ref=\"${opts.id}\"] {\n\t\t\tposition-anchor: ${anchorName};\n\t\t\t${cssForPlacement(placement)}\n\t\t\tmargin: 8px;\n\t\t\tposition-try-fallbacks:\n\t\t\t\tflip-block,\n\t\t\t\tflip-inline,\n\t\t\t\tflip-block flip-inline;\n\t\t}\n\t`)\n\tsurface.dataset.overlayRef = opts.id\n\tconst existing = shadowRoot.adoptedStyleSheets\n\tshadowRoot.adoptedStyleSheets = [...existing, sheet]\n\n\treturn () => {\n\t\tif (priorAnchorName) {\n\t\t\tanchorEl.style.setProperty('anchor-name', priorAnchorName)\n\t\t} else {\n\t\t\tanchorEl.style.removeProperty('anchor-name')\n\t\t}\n\t\tshadowRoot.adoptedStyleSheets = shadowRoot.adoptedStyleSheets.filter((s) => s !== sheet)\n\t\tdelete surface.dataset.overlayRef\n\t}\n}\n\nfunction cssForPlacement(p: OverlayPlacement): string {\n\t// Minimal mapping for the Tier 1 stylesheet. The browser's\n\t// `position-try-fallbacks` flips when the preferred side doesn't fit,\n\t// so only the starting side needs to be encoded here.\n\tswitch (p) {\n\t\tcase 'top':\n\t\tcase 'top-start':\n\t\t\treturn 'bottom: anchor(top); left: anchor(start);'\n\t\tcase 'top-end':\n\t\t\treturn 'bottom: anchor(top); right: anchor(end);'\n\t\tcase 'bottom':\n\t\tcase 'bottom-start':\n\t\t\treturn 'top: anchor(bottom); left: anchor(start);'\n\t\tcase 'bottom-end':\n\t\t\treturn 'top: anchor(bottom); right: anchor(end);'\n\t\tcase 'left':\n\t\tcase 'left-start':\n\t\t\treturn 'right: anchor(left); top: anchor(start);'\n\t\tcase 'left-end':\n\t\t\treturn 'right: anchor(left); bottom: anchor(end);'\n\t\tcase 'right':\n\t\tcase 'right-start':\n\t\t\treturn 'left: anchor(right); top: anchor(start);'\n\t\tcase 'right-end':\n\t\t\treturn 'left: anchor(right); bottom: anchor(end);'\n\t}\n}\n\n/* ======================================================================= *\n * Tier 2 — Popover API (top-layer only) *\n * ======================================================================= */\n\n/**\n * Wire the Popover API lifecycle — the surface gets `popover=\"manual\"` and\n * `showPopover()` is called to promote it into the native top layer. No\n * position math here; the caller pairs this with `positionFloatingUI` for\n * the geometry, since Tier 2 is Popover-for-stacking + Floating UI-for-math.\n *\n * `manual` (not `auto`) so stacked overlays don't fight the browser's\n * popover-auto light-dismiss algorithm: opening a second `popover=\"auto\"`\n * that isn't a DOM/invoker descendant of the first closes the first via\n * the toggle event. Each schmancy overlay is appended as a sibling to\n * `<body>`, so the browser can't see the nesting and would dismiss the\n * parent. With `manual`, schmancy owns Esc + outside-click via\n * `wireCloseTriggers`, and the top-layer rendering is preserved.\n *\n * Returns a cleanup function that hides the popover and strips the attr.\n */\nexport function positionPopoverAPI(surface: HTMLElement): () => void {\n\tif (!CAPS.popover) {\n\t\tthrow new Error('positionPopoverAPI requires Popover API support')\n\t}\n\tsurface.setAttribute('popover', 'manual')\n\ttry {\n\t\t;(surface as unknown as { showPopover(): void }).showPopover()\n\t} catch {\n\t\t// showPopover can throw if already shown or detached; the component\n\t\t// is responsible for calling this on an already-mounted, not-yet-shown\n\t\t// surface. Silently swallowing a double-open is fine.\n\t}\n\treturn () => {\n\t\ttry {\n\t\t\t;(surface as unknown as { hidePopover?: () => void }).hidePopover?.()\n\t\t} catch {\n\t\t\t// already hidden / disconnected — fine.\n\t\t}\n\t\tsurface.removeAttribute('popover')\n\t}\n}\n\n/* ======================================================================= *\n * Tier 2 / 3 — Floating UI position math *\n * ======================================================================= */\n\nexport interface FloatingUIOptions {\n\t/** Preferred placement; Floating UI's `flip` middleware handles falls. */\n\tplacement?: OverlayPlacement\n\t/** Padding used by `shift` + `size` middleware. Defaults to\n\t * `ANCHOR_FIT_PADDING_PX` from overlay.layout. */\n\tpadding?: number\n\t/** Gap between anchor and surface. Default 8px. */\n\toffsetPx?: number\n\t/** Whether `autoUpdate` should track element resizes. Default true. */\n\ttrack?: boolean\n}\n\n/**\n * Floating UI-driven positioning. Returns a cold Observable — subscribe to\n * start positioning, unsubscribe to stop tracking (teardown cancels the\n * `autoUpdate` loop). The caller composes with `takeUntil(this.disconnecting)`:\n *\n * positionFloatingUI(surface, anchor, opts)\n * .pipe(takeUntil(this.disconnecting))\n * .subscribe()\n *\n * Middleware (stack, in order):\n * offset(opts.offsetPx)\n * → flip({ fallbackPlacements: [...] })\n * → shift({ padding: opts.padding })\n * → size({ apply: clamp maxWidth AND maxHeight from availableWidth/Height })\n *\n * `flip` is chosen over `autoPlacement` because element-anchored overlays\n * should respect the trigger's spatial context (menus shouldn't jump\n * sides). Dialog uses `autoPlacement` because it's point-anchored.\n */\nexport function positionFloatingUI(\n\tsurface: HTMLElement,\n\tanchor: ResolvedAnchor,\n\topts: FloatingUIOptions = {},\n): Observable<void> {\n\treturn new Observable<void>((subscriber) => {\n\t\tconst reference = anchor.el ?? anchor.virtual\n\t\tif (!reference) {\n\t\t\tsubscriber.error(new Error('positionFloatingUI requires an element or virtual anchor'))\n\t\t\treturn\n\t\t}\n\n\t\tconst placement: Placement = (opts.placement ?? 'bottom-start') as Placement\n\t\tconst padding = opts.padding ?? ANCHOR_FIT_PADDING_PX\n\t\tconst offsetPx = opts.offsetPx ?? 8\n\n\t\tconst update = async (): Promise<void> => {\n\t\t\ttry {\n\t\t\t\tconst { x, y } = await computePosition(reference, surface, {\n\t\t\t\t\tstrategy: 'fixed',\n\t\t\t\t\tplacement,\n\t\t\t\t\tmiddleware: [\n\t\t\t\t\t\toffset(offsetPx),\n\t\t\t\t\t\tflip({ padding, fallbackPlacements: defaultFallbacks(placement) }),\n\t\t\t\t\t\tshift({ padding }),\n\t\t\t\t\t\tsize({\n\t\t\t\t\t\t\tpadding,\n\t\t\t\t\t\t\tapply({ availableWidth, availableHeight, elements }) {\n\t\t\t\t\t\t\t\telements.floating.style.maxWidth = `${Math.max(0, availableWidth)}px`\n\t\t\t\t\t\t\t\telements.floating.style.maxHeight = `${Math.max(0, availableHeight)}px`\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\tObject.assign(surface.style, {\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\tleft: `${Math.round(x)}px`,\n\t\t\t\t\ttop: `${Math.round(y)}px`,\n\t\t\t\t\ttransform: 'none',\n\t\t\t\t})\n\t\t\t\tsubscriber.next()\n\t\t\t} catch (err) {\n\t\t\t\tsubscriber.error(err)\n\t\t\t}\n\t\t}\n\n\t\tconst cleanup = autoUpdate(reference, surface, update, {\n\t\t\tancestorScroll: true,\n\t\t\tancestorResize: true,\n\t\t\telementResize: opts.track !== false,\n\t\t})\n\n\t\treturn () => {\n\t\t\tcleanup()\n\t\t}\n\t})\n}\n\nfunction defaultFallbacks(preferred: Placement): Placement[] {\n\t// Flip to the opposite side first, then try the perpendicular ends.\n\t// Small, deterministic list — not exhaustive.\n\tswitch (preferred) {\n\t\tcase 'bottom-start':\n\t\t\treturn ['top-start', 'bottom-end', 'top-end']\n\t\tcase 'bottom-end':\n\t\t\treturn ['top-end', 'bottom-start', 'top-start']\n\t\tcase 'top-start':\n\t\t\treturn ['bottom-start', 'top-end', 'bottom-end']\n\t\tcase 'top-end':\n\t\t\treturn ['bottom-end', 'top-start', 'bottom-start']\n\t\tcase 'left-start':\n\t\t\treturn ['right-start', 'left-end', 'right-end']\n\t\tcase 'left-end':\n\t\t\treturn ['right-end', 'left-start', 'right-start']\n\t\tcase 'right-start':\n\t\t\treturn ['left-start', 'right-end', 'left-end']\n\t\tcase 'right-end':\n\t\t\treturn ['left-end', 'right-start', 'left-start']\n\t\tcase 'top':\n\t\t\treturn ['bottom', 'left', 'right']\n\t\tcase 'bottom':\n\t\t\treturn ['top', 'left', 'right']\n\t\tcase 'left':\n\t\t\treturn ['right', 'top', 'bottom']\n\t\tcase 'right':\n\t\t\treturn ['left', 'top', 'bottom']\n\t\tdefault:\n\t\t\treturn ['top-start', 'bottom-end']\n\t}\n}\n","import { SchmancyElement } from '@mixins/index'\nimport { css, html, render as litRender, type TemplateResult } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { when } from 'lit/directives/when.js'\nimport {\n\tdebounceTime,\n\tdistinctUntilChanged,\n\tEMPTY,\n\tfilter,\n\tfromEvent,\n\tmap,\n\tmerge,\n\tSubject,\n\ttake,\n\ttakeUntil,\n\ttap,\n} from 'rxjs'\nimport type { LazyComponent } from '../area/lazy'\nimport { fromResizeObserver } from '../directives/layout'\nimport {\n\tanchorOriginVars,\n\tflipAnimation,\n\tsurfaceAnimation,\n} from './overlay.animations'\nimport { swipeToDismiss$ } from './overlay.gestures'\nimport {\n\tresolveAnchorRef,\n\tresolveLayout,\n\ttype ResolvedAnchor,\n} from './overlay.layout'\nimport {\n\tpickPositioner,\n\tpositionCSSAnchor,\n\tpositionFloatingUI,\n\tpositionPopoverAPI,\n} from './overlay.positioning'\nimport { currentStack } from './overlay.stack'\nimport type {\n\tAnchor,\n\tCloseReason,\n\tContent,\n\tOverlayLayout,\n\tOverlayTier,\n\tShowOptions,\n} from './overlay.types'\n\nconst MOUNT_POINT_ID = 'overlay-mount'\nconst RE_RESOLVE_COOLDOWN_MS = 600\n\n/**\n * The single overlay element. Custom `<div>` shell (not a native\n * `<dialog>`) — one backdrop mechanism for all layouts, one focus-trap\n * path, one animation orchestrator. The shell is always rendered; the\n * backdrop only renders when modal. The surface is positioned per tier:\n *\n * - Modal layouts (centered / sheet) → backdrop + surface, focus-trapped,\n * library-managed z-index.\n * - Anchored 'css-anchor' tier → surface as `popover=\"auto\"` with\n * CSS Anchor Positioning; native top-layer + light-dismiss.\n * - Anchored 'popover-fui' tier → surface as `popover=\"auto\"` + Floating\n * UI position math; native top-layer + light-dismiss.\n * - Anchored 'fui-only' tier → surface positioned by Floating UI;\n * manual click-outside + manual Esc.\n *\n * Public lifecycle: the service calls `open()` to mount content and\n * animate in, `close(reason)` to animate out and dismiss. The element\n * exposes `closed$` (Observable emitting reason + result once) and\n * `tier` / `layout` / `modal` as properties for the stack entry.\n */\n@customElement('schmancy-overlay')\nexport class SchmancyOverlay extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tposition: fixed;\n\t\tinset: 0;\n\t\tz-index: 10000;\n\t\tdisplay: none;\n\t\tpointer-events: none;\n\t}\n\t:host([active]) {\n\t\tdisplay: block;\n\t}\n\t/* Vertical-gradient scrim — Tailwind's bg-gradient utilities cannot reach\n\t * these color-mix percentages with sufficient control. */\n\t.backdrop {\n\t\tbackground: linear-gradient(\n\t\t\tto bottom,\n\t\t\tcolor-mix(in srgb, var(--schmancy-sys-color-scrim) 18%, transparent) 0%,\n\t\t\tcolor-mix(in srgb, var(--schmancy-sys-color-scrim) 56%, transparent) 100%\n\t\t);\n\t\t-webkit-backdrop-filter: blur(16px) saturate(160%);\n\t\tbackdrop-filter: blur(16px) saturate(160%);\n\t}\n\t/* Popover top-layer surfaces — UA defaults push surface off-screen. */\n\t.surface:popover-open {\n\t\tmargin: 0;\n\t\tborder: 0;\n\t}\n`]\n\n\t@property({ type: String, reflect: true }) layout: OverlayLayout = 'sheet'\n\t@property({ type: Boolean, reflect: true }) dismissable = true\n\t@property({ type: Boolean, reflect: true }) modal = true\n\t@property({ type: String, reflect: true }) tier: OverlayTier = 'modal'\n\n\t@state() private _active = false\n\n\t@query('.backdrop') private _backdrop?: HTMLDivElement\n\t@query('.surface') private _surface!: HTMLElement\n\n\t/** Close trigger for the service; emits the reason + detail payload. */\n\tprivate readonly _closed$ = new Subject<{ reason: CloseReason; result?: unknown }>()\n\n\tprivate _mounted = false\n\tprivate _closing = false\n\tprivate _resolvedAnchor?: ResolvedAnchor\n\tprivate _rawAnchor?: Anchor\n\tprivate _anchorOriginAnchor?: Anchor\n\tprivate _positionerTeardown?: () => void\n\tprivate _lastFocusedElement: HTMLElement | null = null\n\tprivate _inertedSiblings: HTMLElement[] = []\n\tprivate _lastReResolveAt = 0\n\n\t/** Service subscribes to this to know when the overlay dismissed. */\n\tget closed$(): import('rxjs').Observable<{ reason: CloseReason; result?: unknown }> {\n\t\treturn this._closed$.asObservable()\n\t}\n\n\t/**\n\t * Mount content and animate in. Called by the service after the\n\t * element is attached to the DOM. Resolves when the entrance\n\t * animation completes.\n\t */\n\tasync open(content: Content, options: ShowOptions): Promise<void> {\n\t\tif (this._mounted) throw new Error('schmancy-overlay: open() called twice on the same element')\n\t\tthis._mounted = true\n\n\t\tthis.dismissable = options.dismissable !== false\n\t\tthis._rawAnchor = options.anchor\n\t\tthis._anchorOriginAnchor = options.anchor\n\t\tthis._resolvedAnchor = resolveAnchorRef(options.anchor)\n\n\t\t// Ensure the shell is rendered so the mount point exists.\n\t\tthis._active = true\n\t\tthis.setAttribute('active', '')\n\t\tawait this.updateComplete\n\n\t\tconst mount = this.renderRoot.querySelector(`#${MOUNT_POINT_ID}`) as HTMLElement | null\n\t\tif (!mount) throw new Error('schmancy-overlay: mount point missing')\n\t\tawait mountContent(content, mount, options.props)\n\n\t\t// Caller-forced layout (`as`) wins; otherwise resolver decides from anchor.\n\t\tthis.layout = options.as ?? resolveLayout({ anchor: options.anchor })\n\n\t\t// Modal is derived from layout: sheet is always modal, anchored never is.\n\t\tthis.modal = this.layout === 'sheet'\n\n\t\t// Pick the positioning tier. Modal layouts always use the 'modal'\n\t\t// tier (custom shell + manual backdrop); anchored uses the CAPS-driven\n\t\t// ladder. `modal: true` on an anchored layout stays modal.\n\t\tthis.tier = this.modal\n\t\t\t? 'modal'\n\t\t\t: this._resolvedAnchor\n\t\t\t\t? pickPositioner(this._resolvedAnchor)\n\t\t\t\t: 'modal'\n\n\t\tawait this.updateComplete\n\n\t\t// Apply tier-specific positioning. For 'modal' the CSS data-layout\n\t\t// attribute + :host styles already place the surface; nothing to do.\n\t\t// For anchored tiers we delegate to the positioning module.\n\t\tif (this.tier === 'css-anchor' && this._resolvedAnchor?.el && this.shadowRoot) {\n\t\t\tthis._positionerTeardown = positionCSSAnchor(this._surface, this._resolvedAnchor, this.shadowRoot, {\n\t\t\t\tid: `ov-${Math.random().toString(36).slice(2, 10)}`,\n\t\t\t\tplacement: options.preferredPlacement ?? 'bottom-start',\n\t\t\t})\n\t\t\t// Pair with Popover API to get native top-layer + light-dismiss.\n\t\t\tconst popoverCleanup = positionPopoverAPI(this._surface)\n\t\t\tconst cssAnchorTeardown = this._positionerTeardown\n\t\t\tthis._positionerTeardown = () => {\n\t\t\t\tpopoverCleanup()\n\t\t\t\tcssAnchorTeardown?.()\n\t\t\t}\n\t\t} else if (this.tier === 'popover-fui' && this._resolvedAnchor) {\n\t\t\tconst popoverCleanup = positionPopoverAPI(this._surface)\n\t\t\tconst floatSub = positionFloatingUI(this._surface, this._resolvedAnchor, {\n\t\t\t\tplacement: options.preferredPlacement ?? 'bottom-start',\n\t\t\t\toffsetPx: 8,\n\t\t\t\ttrack: options.track !== false,\n\t\t\t})\n\t\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t\t.subscribe()\n\t\t\tthis._positionerTeardown = () => {\n\t\t\t\tpopoverCleanup()\n\t\t\t\tfloatSub.unsubscribe()\n\t\t\t}\n\t\t} else if (this.tier === 'fui-only' && this._resolvedAnchor) {\n\t\t\tconst floatSub = positionFloatingUI(this._surface, this._resolvedAnchor, {\n\t\t\t\tplacement: options.preferredPlacement ?? 'bottom-start',\n\t\t\t\toffsetPx: 8,\n\t\t\t\ttrack: options.track !== false,\n\t\t\t})\n\t\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t\t.subscribe()\n\t\t\tthis._positionerTeardown = () => floatSub.unsubscribe()\n\t\t}\n\n\t\t// Set the anchor-origin CSS vars so the entrance animation blooms\n\t\t// from the click point. Must happen AFTER positioning so the\n\t\t// surface rect is final.\n\t\tthis.setAnchorOriginVars()\n\n\t\t// Wire close triggers (focus trap, Esc, backdrop click, etc).\n\t\tthis.wireFocusTrap()\n\t\tthis.wireCloseTriggers(options.signal)\n\n\t\t// Watch content for mid-session re-resolves (upward-only + cooldown).\n\t\tthis.wireResizeObserver(mount)\n\n\t\t// Play entrance animations.\n\t\tawait this.playAnimations('in')\n\t}\n\n\t/** Play exit animations then dismiss. */\n\tasync close(reason: CloseReason, result?: unknown): Promise<void> {\n\t\tif (this._closing || !this._mounted) return\n\t\tthis._closing = true\n\t\ttry {\n\t\t\tawait this.playAnimations('out')\n\t\t} catch {\n\t\t\t// animation cancelled mid-flight — not an error.\n\t\t}\n\t\tthis.releaseFocusTrap()\n\t\tif (this._positionerTeardown) {\n\t\t\ttry {\n\t\t\t\tthis._positionerTeardown()\n\t\t\t} catch {\n\t\t\t\t// cleanup shouldn't throw; ignore anything that does.\n\t\t\t}\n\t\t\tthis._positionerTeardown = undefined\n\t\t}\n\t\tthis._active = false\n\t\tthis.removeAttribute('active')\n\t\tthis._closed$.next({ reason, result })\n\t\tthis._closed$.complete()\n\t}\n\n\t/* ---------------- render ------------------------------------------- */\n\n\tprotected render(): TemplateResult {\n\t\tif (!this._active) return html``\n\t\tconst baseClasses =\n\t\t\t'surface fixed pointer-events-auto overflow-auto ' +\n\t\t\t'bg-surface-container/85 text-surface-on backdrop-blur-md ' +\n\t\t\t'border border-surface-on/8'\n\t\tconst layoutClasses =\n\t\t\tthis.layout === 'sheet'\n\t\t\t\t? 'left-0 right-0 bottom-0 w-full max-h-[90dvh] rounded-t-[28px] shadow-overlay'\n\t\t\t\t: 'max-w-[min(480px,calc(100vw-2rem))] max-h-[90dvh] rounded-3xl shadow-overlay-anchored'\n\t\treturn html`\n\t\t\t<div class=\"shell fixed inset-0 pointer-events-none\" part=\"shell\">\n\t\t\t\t${when(\n\t\t\t\t\tthis.modal,\n\t\t\t\t\t() => html`<div class=\"backdrop fixed inset-0 pointer-events-auto\" part=\"backdrop\" @click=${this.onBackdropClick}></div>`,\n\t\t\t\t)}\n\t\t\t\t<section\n\t\t\t\t\tclass=\"${baseClasses} ${layoutClasses}\"\n\t\t\t\t\tpart=\"surface\"\n\t\t\t\t\tdata-layout=${this.layout}\n\t\t\t\t\tdata-tier=${this.tier}\n\t\t\t\t\trole=${this.modal ? 'dialog' : 'region'}\n\t\t\t\t\taria-modal=${this.modal ? 'true' : 'false'}\n\t\t\t\t\ttabindex=\"-1\"\n\t\t\t\t>\n\t\t\t\t\t<div id=${MOUNT_POINT_ID}></div>\n\t\t\t\t</section>\n\t\t\t</div>\n\t\t`\n\t}\n\n\tprivate onBackdropClick = (): void => {\n\t\tif (this.dismissable) void this.close('backdrop')\n\t}\n\n\t/* ---------------- anchor-origin bloom ------------------------------ */\n\n\tprivate setAnchorOriginVars(): void {\n\t\tconst surface = this._surface\n\t\tif (!surface) return\n\t\tconst rect = surface.getBoundingClientRect()\n\t\tconst vars =\n\t\t\tthis.layout === 'sheet' && !this._anchorOriginAnchor\n\t\t\t\t? { '--schmancy-overlay-origin-x': '50%', '--schmancy-overlay-origin-y': '100%' }\n\t\t\t\t: anchorOriginVars(this._anchorOriginAnchor, rect)\n\t\tfor (const [k, v] of Object.entries(vars)) {\n\t\t\tsurface.style.setProperty(k, v)\n\t\t}\n\t}\n\n\t/* ---------------- focus trap --------------------------------------- */\n\n\tprivate wireFocusTrap(): void {\n\t\tif (!this.modal) return\n\t\tthis._lastFocusedElement = (document.activeElement as HTMLElement) ?? null\n\t\tconst parent = this.parentElement\n\t\tif (parent) {\n\t\t\tthis._inertedSiblings = []\n\t\t\tfor (const child of Array.from(parent.children)) {\n\t\t\t\tif (child !== this && child instanceof HTMLElement && !child.inert) {\n\t\t\t\t\tchild.inert = true\n\t\t\t\t\tthis._inertedSiblings.push(child)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Focus the surface or the first [autofocus] child.\n\t\tqueueMicrotask(() => {\n\t\t\tconst auto = this._surface?.querySelector<HTMLElement>('[autofocus]')\n\t\t\t;(auto ?? this._surface)?.focus()\n\t\t})\n\t}\n\n\tprivate releaseFocusTrap(): void {\n\t\tfor (const el of this._inertedSiblings) {\n\t\t\tel.inert = false\n\t\t}\n\t\tthis._inertedSiblings = []\n\t\ttry {\n\t\t\tthis._lastFocusedElement?.focus?.()\n\t\t} catch {\n\t\t\t// trigger may be detached now; no-op.\n\t\t}\n\t\tthis._lastFocusedElement = null\n\t}\n\n\t/* ---------------- close triggers ----------------------------------- */\n\n\tprivate wireCloseTriggers(signal?: AbortSignal): void {\n\t\tconst until = this.disconnecting\n\n\t\t// Handle already-aborted signal synchronously — no stream needed.\n\t\tif (signal?.aborted) {\n\t\t\tqueueMicrotask(() => void this.close('abort'))\n\t\t\treturn\n\t\t}\n\n\t\t// Structured close — content dispatches CustomEvent('close', { detail }).\n\t\tconst structured$ = fromEvent<CustomEvent>(this, 'close').pipe(\n\t\t\tfilter((e) => e instanceof CustomEvent),\n\t\t\ttap((e) => e.stopPropagation()),\n\t\t\tmap((e) => ({ reason: 'structured' as CloseReason, result: e.detail })),\n\t\t)\n\n\t\t// Native <form method=\"dialog\"> submission bubbles up as a regular\n\t\t// submit event with `submitter.value` (returnValue proxy for our\n\t\t// custom shell). Capture it and resolve with the string value.\n\t\tconst nativeSubmit$ = fromEvent<SubmitEvent>(this, 'submit').pipe(\n\t\t\tfilter((e) => {\n\t\t\t\tconst form = e.target as HTMLFormElement | null\n\t\t\t\treturn !!form && form.method === 'dialog'\n\t\t\t}),\n\t\t\ttap((e) => e.preventDefault()),\n\t\t\tmap((e) => {\n\t\t\t\tconst submitter = (e as SubmitEvent & { submitter?: HTMLButtonElement | HTMLInputElement })\n\t\t\t\t\t.submitter\n\t\t\t\treturn { reason: 'native-submit' as CloseReason, result: submitter?.value ?? '' }\n\t\t\t}),\n\t\t)\n\n\t\t// Manual Esc — all tiers. Modal has no native dismiss; anchored\n\t\t// tiers use `popover=\"manual\"` so the browser doesn't auto-Esc them\n\t\t// either (the auto popover-stack would close ancestor overlays when\n\t\t// a nested overlay opens — see positionPopoverAPI's comment).\n\t\tconst escape$ = fromEvent<KeyboardEvent>(document, 'keydown').pipe(\n\t\t\tfilter((e) => e.key === 'Escape'),\n\t\t\ttap((e) => e.preventDefault()),\n\t\t\tfilter(() => this.dismissable),\n\t\t\tmap(() => ({ reason: 'escape' as CloseReason })),\n\t\t\ttake(1),\n\t\t)\n\n\t\t// Manual outside-click — all anchored tiers. Modal layouts have a\n\t\t// backdrop that catches outside clicks via `onBackdropClick`; the\n\t\t// anchored tiers (no backdrop) need a document-level pointerdown\n\t\t// listener that ignores clicks whose composedPath includes the\n\t\t// surface or anchor. Use composedPath membership (not\n\t\t// `Node.contains`) so clicks on elements inside slotted /\n\t\t// shadow-DOM descendants of the surface are correctly classified\n\t\t// as \"inside\".\n\t\tconst outsideClick$ = this.tier !== 'modal'\n\t\t\t? fromEvent<PointerEvent>(document, 'pointerdown', { capture: true }).pipe(\n\t\t\t\tfilter((e) => {\n\t\t\t\t\tif (!this.dismissable) return false\n\t\t\t\t\tconst path = e.composedPath()\n\t\t\t\t\tif (this._surface && path.includes(this._surface)) return false\n\t\t\t\t\tif (this._resolvedAnchor?.el && path.includes(this._resolvedAnchor.el)) return false\n\t\t\t\t\t// Suppress dismiss when the click lands inside any overlay that sits\n\t\t\t\t\t// ABOVE this one in the stack (nested overlays sibling-appended to\n\t\t\t\t\t// body). Read the stack fresh per pointerdown — it mutates as overlays\n\t\t\t\t\t// open and close.\n\t\t\t\t\tconst stack = currentStack()\n\t\t\t\t\tconst myIndex = stack.findIndex((entry) => entry.element === this)\n\t\t\t\t\tif (myIndex !== -1) {\n\t\t\t\t\t\tfor (let i = myIndex + 1; i < stack.length; i++) {\n\t\t\t\t\t\t\tif (path.includes(stack[i].element)) return false\n\t\t\t\t\t\t\tconst aboveSurface = stack[i].element.shadowRoot?.querySelector('.surface')\n\t\t\t\t\t\t\tif (aboveSurface && path.includes(aboveSurface)) return false\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn true\n\t\t\t\t}),\n\t\t\t\tmap(() => ({ reason: 'backdrop' as CloseReason })),\n\t\t\t\ttake(1),\n\t\t\t)\n\t\t\t: null\n\n\t\t// Swipe-to-dismiss for sheet layout only. No visual drag handle —\n\t\t// the gesture starts from the top 40px of the surface (see\n\t\t// DRAG_START_TOP_PX in overlay.gestures). Escape + backdrop click\n\t\t// cover the other dismiss paths via the modal-tier listeners above.\n\t\tconst swipe$ = this.layout === 'sheet' && this.dismissable\n\t\t\t? swipeToDismiss$({ surface: this._surface, until$: merge(until, this._closed$) }).pipe(\n\t\t\t\ttake(1),\n\t\t\t\tmap(() => ({ reason: 'swipe' as CloseReason })),\n\t\t\t)\n\t\t\t: null\n\n\t\t// AbortSignal — standard cancellation input.\n\t\tconst abort$ = signal\n\t\t\t? fromEvent(signal, 'abort').pipe(\n\t\t\t\ttake(1),\n\t\t\t\tmap(() => ({ reason: 'abort' as CloseReason })),\n\t\t\t)\n\t\t\t: null\n\n\t\tmerge(\n\t\t\tstructured$,\n\t\t\tnativeSubmit$,\n\t\t\tescape$,\n\t\t\toutsideClick$ ?? EMPTY,\n\t\t\tswipe$ ?? EMPTY,\n\t\t\tabort$ ?? EMPTY,\n\t\t)\n\t\t\t.pipe(takeUntil(until))\n\t\t\t.subscribe(({ reason, result }: { reason: CloseReason; result?: unknown }) => void this.close(reason, result))\n\t}\n\n\t/* ---------------- ResizeObserver FLIP re-resolve ------------------- */\n\n\tprivate wireResizeObserver(mount: HTMLElement): void {\n\t\tfromResizeObserver(mount)\n\t\t\t.pipe(\n\t\t\t\tmap((entries) => {\n\t\t\t\t\tconst entry = entries[0]\n\t\t\t\t\tif (!entry) return null\n\t\t\t\t\tconst box = entry.contentRect\n\t\t\t\t\treturn { w: box.width, h: box.height }\n\t\t\t\t}),\n\t\t\t\tfilter((v): v is { w: number; h: number } => v !== null),\n\t\t\t\tdistinctUntilChanged((a, b) => a.w === b.w && a.h === b.h),\n\t\t\t\tdebounceTime(80),\n\t\t\t\ttakeUntil(merge(this.disconnecting, this._closed$)),\n\t\t\t)\n\t\t\t.subscribe((size) => this.maybeReResolve(size))\n\t}\n\n\tprivate async maybeReResolve(_size: { w: number; h: number }): Promise<void> {\n\t\tif (this._closing) return\n\t\tconst next = resolveLayout({ anchor: this._rawAnchor })\n\t\tif (next === this.layout) return\n\t\t// Cooldown: prevent churn-driven bouncing.\n\t\tconst now = performance.now()\n\t\tif (now - this._lastReResolveAt < RE_RESOLVE_COOLDOWN_MS) return\n\t\t// Upward-only ratchet: centered → sheet on content-grow is OK,\n\t\t// sheet → centered on content-shrink is ignored.\n\t\tif (!isUpwardTransition(this.layout, next)) return\n\n\t\t// FLIP: capture `before` rect, apply new layout, capture `after`,\n\t\t// animate the inverse transform.\n\t\tconst surface = this._surface\n\t\tconst before = surface.getBoundingClientRect()\n\t\tthis.layout = next\n\t\tawait this.updateComplete\n\t\tconst after = surface.getBoundingClientRect()\n\t\tconst spec = flipAnimation(before, after)\n\t\ttry {\n\t\t\tawait surface.animate(spec.keyframes, spec.options).finished\n\t\t} catch {\n\t\t\t// cancelled — not an error.\n\t\t}\n\t\tthis._lastReResolveAt = performance.now()\n\t}\n\n\t/* ---------------- animations --------------------------------------- */\n\n\tprivate async playAnimations(direction: 'in' | 'out'): Promise<void> {\n\t\tconst surface = this._surface\n\t\tif (!surface) return\n\t\tconst spec = surfaceAnimation(this.layout, direction)\n\t\tconst tasks: Promise<unknown>[] = [\n\t\t\tsurface.animate(spec.keyframes, spec.options).finished.catch(() => undefined),\n\t\t]\n\t\tconst backdrop = this._backdrop\n\t\tif (this.modal && backdrop) {\n\t\t\ttasks.push(\n\t\t\t\tbackdrop\n\t\t\t\t\t.animate(\n\t\t\t\t\t\tdirection === 'in' ? [{ opacity: 0 }, { opacity: 1 }] : [{ opacity: 1 }, { opacity: 0 }],\n\t\t\t\t\t\t{ duration: spec.options.duration, easing: direction === 'in' ? 'ease-out' : 'ease-in', fill: 'forwards' },\n\t\t\t\t\t)\n\t\t\t\t\t.finished.catch(() => undefined),\n\t\t\t)\n\t\t}\n\t\tawait Promise.all(tasks)\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-overlay': SchmancyOverlay\n\t}\n}\n\n/* ======================================================================= *\n * content mounting helpers *\n * ======================================================================= */\n\nasync function mountContent(\n\tcontent: Content,\n\thost: HTMLElement,\n\tprops?: Record<string, unknown>,\n): Promise<HTMLElement> {\n\t// TemplateFactory — call at mount time so closed-over variables are read lazily.\n\tif (isTemplateFactory(content)) {\n\t\treturn mountContent(content(), host, props)\n\t}\n\n\t// TemplateResult — render via lit's `render`.\n\tif (isTemplateResult(content)) {\n\t\tlitRender(content, host)\n\t\treturn host\n\t}\n\n\t// Already-instantiated element — append directly.\n\tif (content instanceof HTMLElement) {\n\t\tif (props) Object.assign(content, props)\n\t\thost.appendChild(content)\n\t\treturn content\n\t}\n\n\t// LazyComponent — await the module, recurse with the default export.\n\tif (isLazy(content)) {\n\t\tconst mod = await content()\n\t\treturn mountContent(mod.default, host, props)\n\t}\n\n\t// Class constructor.\n\tif (typeof content === 'function') {\n\t\tconst Ctor = content as unknown as { new (): HTMLElement }\n\t\tconst el = new Ctor()\n\t\tif (props) Object.assign(el, props)\n\t\thost.appendChild(el)\n\t\treturn el\n\t}\n\n\t// Tag name.\n\tif (typeof content === 'string') {\n\t\tconst el = document.createElement(content)\n\t\tif (props) Object.assign(el, props)\n\t\thost.appendChild(el)\n\t\treturn el\n\t}\n\n\tthrow new Error('schmancy-overlay: unsupported content type')\n}\n\nfunction isTemplateFactory(x: unknown): x is import('./overlay.types').TemplateFactory {\n\treturn typeof x === 'function' && !(x as { prototype?: unknown }).prototype\n}\n\nfunction isTemplateResult(x: unknown): x is TemplateResult {\n\treturn typeof x === 'object' && x !== null && '_$litType$' in x\n}\n\nfunction isLazy(x: unknown): x is LazyComponent {\n\treturn typeof x === 'function' && ('preload' in (x as object) || '_promise' in (x as object))\n}\n\nfunction isUpwardTransition(from: OverlayLayout, to: OverlayLayout): boolean {\n\t// Anchored → sheet is the only valid runtime transition (content\n\t// overflowed and the surface re-resolves to a sheet). Sheet stays sheet.\n\treturn from === 'anchored' && to === 'sheet'\n}\n"],"mappings":"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"}