@mhmo91/schmancy 0.10.37 → 0.10.38

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 (554) hide show
  1. package/custom-elements.json +39 -0
  2. package/dist/{SchmancyElement-CDT2q1lA.js → SchmancyElement-BNnyBOwk.js} +9 -7
  3. package/dist/{SchmancyElement-CDT2q1lA.js.map → SchmancyElement-BNnyBOwk.js.map} +1 -1
  4. package/dist/{SchmancyElement-BHfQg3Tj.cjs → SchmancyElement-C41uPa6l.cjs} +2 -2
  5. package/dist/{SchmancyElement-BHfQg3Tj.cjs.map → SchmancyElement-C41uPa6l.cjs.map} +1 -1
  6. package/dist/agent/schmancy.agent.js +2329 -2297
  7. package/dist/agent/schmancy.agent.js.map +1 -1
  8. package/dist/area-2FrTZI_T.cjs +21 -0
  9. package/dist/area-2FrTZI_T.cjs.map +1 -0
  10. package/dist/{area-KtULlxuA.js → area-KVDzhT4s.js} +4 -4
  11. package/dist/area-KVDzhT4s.js.map +1 -0
  12. package/dist/area.cjs +1 -1
  13. package/dist/area.js +2 -2
  14. package/dist/{audio-zIJVTo_V.js → audio-D3gnp15Y.js} +1 -1
  15. package/dist/{audio-zIJVTo_V.js.map → audio-D3gnp15Y.js.map} +1 -1
  16. package/dist/{audio-CUMAv9D_.cjs → audio-EaD0Ggfh.cjs} +1 -1
  17. package/dist/{audio-CUMAv9D_.cjs.map → audio-EaD0Ggfh.cjs.map} +1 -1
  18. package/dist/audio.cjs +1 -1
  19. package/dist/audio.js +2 -2
  20. package/dist/autocomplete-DMmxsvUe.cjs +115 -0
  21. package/dist/autocomplete-DMmxsvUe.cjs.map +1 -0
  22. package/dist/{autocomplete-DIScyo8Q.js → autocomplete-DWiEqlQf.js} +96 -96
  23. package/dist/autocomplete-DWiEqlQf.js.map +1 -0
  24. package/dist/autocomplete.cjs +1 -1
  25. package/dist/autocomplete.js +1 -1
  26. package/dist/avatar.cjs +1 -1
  27. package/dist/avatar.js +3 -3
  28. package/dist/badge.cjs +1 -1
  29. package/dist/badge.js +1 -1
  30. package/dist/{boat-BHPqSqJd.js → boat-DmyG7y1V.js} +4 -4
  31. package/dist/{boat-BHPqSqJd.js.map → boat-DmyG7y1V.js.map} +1 -1
  32. package/dist/{boat-OBZ77exO.cjs → boat-dB1_qLm0.cjs} +1 -1
  33. package/dist/{boat-OBZ77exO.cjs.map → boat-dB1_qLm0.cjs.map} +1 -1
  34. package/dist/boat.cjs +1 -1
  35. package/dist/boat.js +1 -1
  36. package/dist/breadcrumb.cjs +3 -3
  37. package/dist/breadcrumb.cjs.map +1 -1
  38. package/dist/breadcrumb.js +4 -4
  39. package/dist/breadcrumb.js.map +1 -1
  40. package/dist/{busy-BJNsKSCM.cjs → busy-Cj_PV7oC.cjs} +1 -1
  41. package/dist/{busy-BJNsKSCM.cjs.map → busy-Cj_PV7oC.cjs.map} +1 -1
  42. package/dist/{busy-Dut78y4L.js → busy-enYCTssB.js} +2 -2
  43. package/dist/{busy-Dut78y4L.js.map → busy-enYCTssB.js.map} +1 -1
  44. package/dist/busy.cjs +1 -1
  45. package/dist/busy.js +1 -1
  46. package/dist/{button-kcpPQavY.js → button-BQSOVnHn.js} +10 -9
  47. package/dist/button-BQSOVnHn.js.map +1 -0
  48. package/dist/button-WRmXlNyw.cjs +62 -0
  49. package/dist/button-WRmXlNyw.cjs.map +1 -0
  50. package/dist/button.cjs +6 -6
  51. package/dist/button.cjs.map +1 -1
  52. package/dist/button.js +17 -16
  53. package/dist/button.js.map +1 -1
  54. package/dist/{card-DxSKxCid.js → card-BHTz1GwB.js} +16 -16
  55. package/dist/card-BHTz1GwB.js.map +1 -0
  56. package/dist/{card-BLxPLqdQ.cjs → card-ThG_ZaQE.cjs} +3 -3
  57. package/dist/card-ThG_ZaQE.cjs.map +1 -0
  58. package/dist/card.cjs +1 -1
  59. package/dist/card.js +1 -1
  60. package/dist/{checkbox-BCLkhp5G.cjs → checkbox-C4zeib84.cjs} +2 -2
  61. package/dist/{checkbox-BCLkhp5G.cjs.map → checkbox-C4zeib84.cjs.map} +1 -1
  62. package/dist/{checkbox-B1wiM3Dv.js → checkbox-Ce0DlAdW.js} +6 -6
  63. package/dist/{checkbox-B1wiM3Dv.js.map → checkbox-Ce0DlAdW.js.map} +1 -1
  64. package/dist/checkbox.cjs +1 -1
  65. package/dist/checkbox.js +1 -1
  66. package/dist/{chips-C9dS1WKn.cjs → chips-B1jui8Pe.cjs} +3 -3
  67. package/dist/chips-B1jui8Pe.cjs.map +1 -0
  68. package/dist/{chips-vWmwqQed.js → chips-DAy6v93f.js} +20 -19
  69. package/dist/chips-DAy6v93f.js.map +1 -0
  70. package/dist/chips.cjs +1 -1
  71. package/dist/chips.js +2 -2
  72. package/dist/connectivity.cjs +1 -1
  73. package/dist/connectivity.js +3 -3
  74. package/dist/content-drawer.cjs +1 -1
  75. package/dist/content-drawer.js +1 -1
  76. package/dist/cursor-glow-Ah7VXSj7.js.map +1 -1
  77. package/dist/cursor-glow-Bulq-38P.cjs.map +1 -1
  78. package/dist/{date-range-BV6HuvLw.cjs → date-range-BUaPgbTZ.cjs} +2 -2
  79. package/dist/date-range-BUaPgbTZ.cjs.map +1 -0
  80. package/dist/{date-range-D3ge1b4c.js → date-range-NTpoA1in.js} +4 -4
  81. package/dist/date-range-NTpoA1in.js.map +1 -0
  82. package/dist/{date-range-inline-DpYgdLRv.cjs → date-range-inline-D0I6k84h.cjs} +1 -1
  83. package/dist/{date-range-inline-DpYgdLRv.cjs.map → date-range-inline-D0I6k84h.cjs.map} +1 -1
  84. package/dist/{date-range-inline-DuWQaWps.js → date-range-inline-DjRdMZ1z.js} +2 -2
  85. package/dist/{date-range-inline-DuWQaWps.js.map → date-range-inline-DjRdMZ1z.js.map} +1 -1
  86. package/dist/date-range-inline.cjs +1 -1
  87. package/dist/date-range-inline.js +1 -1
  88. package/dist/date-range.cjs +1 -1
  89. package/dist/date-range.js +1 -1
  90. package/dist/delay.cjs +1 -1
  91. package/dist/delay.js +2 -2
  92. package/dist/{details-C-GZaq3j.js → details-CY49XVfp.js} +43 -35
  93. package/dist/details-CY49XVfp.js.map +1 -0
  94. package/dist/details-DQNj2oaU.cjs +164 -0
  95. package/dist/details-DQNj2oaU.cjs.map +1 -0
  96. package/dist/details.cjs +1 -1
  97. package/dist/details.js +1 -1
  98. package/dist/{directives-D_l1E5H6.cjs → directives-Bb0S1DKZ.cjs} +3 -3
  99. package/dist/directives-Bb0S1DKZ.cjs.map +1 -0
  100. package/dist/{directives-DyS51FUh.js → directives-Bfm1lkoy.js} +6 -8
  101. package/dist/directives-Bfm1lkoy.js.map +1 -0
  102. package/dist/directives.cjs +1 -1
  103. package/dist/directives.js +2 -2
  104. package/dist/{divider-nQffE0AD.js → divider-BeyX_C0A.js} +2 -2
  105. package/dist/{divider-nQffE0AD.js.map → divider-BeyX_C0A.js.map} +1 -1
  106. package/dist/{divider-CBnAmHMZ.cjs → divider-Ck2C1sKl.cjs} +1 -1
  107. package/dist/{divider-CBnAmHMZ.cjs.map → divider-Ck2C1sKl.cjs.map} +1 -1
  108. package/dist/divider.cjs +1 -1
  109. package/dist/divider.js +1 -1
  110. package/dist/dropdown.cjs +1 -1
  111. package/dist/dropdown.js +2 -2
  112. package/dist/{expand-DvTb-UPR.js → expand-BYsSEtp6.js} +53 -53
  113. package/dist/expand-BYsSEtp6.js.map +1 -0
  114. package/dist/expand-CUF163mg.cjs +141 -0
  115. package/dist/expand-CUF163mg.cjs.map +1 -0
  116. package/dist/expand.cjs +1 -1
  117. package/dist/expand.js +1 -1
  118. package/dist/fab.cjs +1 -1
  119. package/dist/fab.js +2 -2
  120. package/dist/{float-C-Ko0Le3.js → float-Cgllk_H9.js} +2 -2
  121. package/dist/{float-C-Ko0Le3.js.map → float-Cgllk_H9.js.map} +1 -1
  122. package/dist/{float-C17xgMT1.cjs → float-OvqX0nqG.cjs} +1 -1
  123. package/dist/{float-C17xgMT1.cjs.map → float-OvqX0nqG.cjs.map} +1 -1
  124. package/dist/float.cjs +1 -1
  125. package/dist/float.js +1 -1
  126. package/dist/form-4GKROq2P.cjs +27 -0
  127. package/dist/form-4GKROq2P.cjs.map +1 -0
  128. package/dist/{form-DA0hUu2h.js → form-DxaV_Ose.js} +39 -39
  129. package/dist/form-DxaV_Ose.js.map +1 -0
  130. package/dist/form.cjs +3 -3
  131. package/dist/form.cjs.map +1 -1
  132. package/dist/form.js +34 -34
  133. package/dist/form.js.map +1 -1
  134. package/dist/gravity-6pL6CfIr.cjs.map +1 -1
  135. package/dist/gravity-sVK3zGBF.js.map +1 -1
  136. package/dist/handover/agent-runtime-followups.md +1 -1
  137. package/dist/handover/agent-runtime-v1.md +3 -3
  138. package/dist/{icons-C6UfxmHZ.js → icons-CJ2mXcBi.js} +9 -9
  139. package/dist/icons-CJ2mXcBi.js.map +1 -0
  140. package/dist/icons-sZ-LybA9.cjs +24 -0
  141. package/dist/icons-sZ-LybA9.cjs.map +1 -0
  142. package/dist/icons.cjs +1 -1
  143. package/dist/icons.js +1 -1
  144. package/dist/{iframe-BTjZfYyh.js → iframe-DWvN5nGB.js} +11 -11
  145. package/dist/iframe-DWvN5nGB.js.map +1 -0
  146. package/dist/{iframe-wuYT2xFz.cjs → iframe-DpCv-QH2.cjs} +7 -7
  147. package/dist/iframe-DpCv-QH2.cjs.map +1 -0
  148. package/dist/iframe.cjs +1 -1
  149. package/dist/iframe.js +1 -1
  150. package/dist/index.cjs +1 -1
  151. package/dist/index.js +35 -35
  152. package/dist/{input-B_4g2ulO.js → input-BCCHz6tB.js} +7 -7
  153. package/dist/input-BCCHz6tB.js.map +1 -0
  154. package/dist/{input-BrDiIT60.cjs → input-Z-3N5JMv.cjs} +2 -2
  155. package/dist/input-Z-3N5JMv.cjs.map +1 -0
  156. package/dist/{input-chip-BlWhOruv.js → input-chip-BOrcKH-H.js} +2 -2
  157. package/dist/{input-chip-BlWhOruv.js.map → input-chip-BOrcKH-H.js.map} +1 -1
  158. package/dist/{input-chip-B-XWh4aE.cjs → input-chip-ChAgRCXZ.cjs} +1 -1
  159. package/dist/{input-chip-B-XWh4aE.cjs.map → input-chip-ChAgRCXZ.cjs.map} +1 -1
  160. package/dist/input.cjs +1 -1
  161. package/dist/input.js +1 -1
  162. package/dist/json.cjs +1 -1
  163. package/dist/json.js +3 -3
  164. package/dist/kbd.cjs +1 -1
  165. package/dist/kbd.js +2 -2
  166. package/dist/{layout-Dxit9enO.js → layout-CFiG3lNT.js} +1 -1
  167. package/dist/{layout-Dxit9enO.js.map → layout-CFiG3lNT.js.map} +1 -1
  168. package/dist/{layout-BhyIcEVu.cjs → layout-DZ4dpLh9.cjs} +1 -1
  169. package/dist/{layout-BhyIcEVu.cjs.map → layout-DZ4dpLh9.cjs.map} +1 -1
  170. package/dist/layout.cjs +1 -1
  171. package/dist/layout.js +2 -2
  172. package/dist/lazy-BaAiIUru.js +19 -0
  173. package/dist/lazy-BaAiIUru.js.map +1 -0
  174. package/dist/lazy-C-7a4FAe.cjs +1 -0
  175. package/dist/lazy-C-7a4FAe.cjs.map +1 -0
  176. package/dist/{lightbox-D85XAAuC.js → lightbox-B7Y4Nij_.js} +2 -2
  177. package/dist/lightbox-B7Y4Nij_.js.map +1 -0
  178. package/dist/{lightbox-CVBogswK.cjs → lightbox-Dpwsn8Qr.cjs} +1 -1
  179. package/dist/lightbox-Dpwsn8Qr.cjs.map +1 -0
  180. package/dist/lightbox.cjs +1 -1
  181. package/dist/lightbox.js +1 -1
  182. package/dist/{list-nVjLskgx.cjs → list-BhM-6dAi.cjs} +1 -1
  183. package/dist/{list-nVjLskgx.cjs.map → list-BhM-6dAi.cjs.map} +1 -1
  184. package/dist/{list-DOF_yVn5.js → list-C5WVoIfJ.js} +2 -2
  185. package/dist/{list-DOF_yVn5.js.map → list-C5WVoIfJ.js.map} +1 -1
  186. package/dist/list.cjs +1 -1
  187. package/dist/list.js +1 -1
  188. package/dist/magnetic-DKtc4umC.cjs.map +1 -1
  189. package/dist/magnetic-DaOOv5Dz.js.map +1 -1
  190. package/dist/{menu-QrAK5Uu9.js → menu-CBAAJoHu.js} +3 -3
  191. package/dist/{menu-QrAK5Uu9.js.map → menu-CBAAJoHu.js.map} +1 -1
  192. package/dist/{menu-DqmNjLgY.cjs → menu-DFQjJk3H.cjs} +1 -1
  193. package/dist/{menu-DqmNjLgY.cjs.map → menu-DFQjJk3H.cjs.map} +1 -1
  194. package/dist/menu.cjs +1 -1
  195. package/dist/menu.js +1 -1
  196. package/dist/{mixins-De1zjyhy.js → mixins-DGBI7YPO.js} +11 -11
  197. package/dist/mixins-DGBI7YPO.js.map +1 -0
  198. package/dist/{mixins-DxHpyMHA.cjs → mixins-fIpzhVMd.cjs} +1 -1
  199. package/dist/mixins-fIpzhVMd.cjs.map +1 -0
  200. package/dist/mixins.cjs +1 -1
  201. package/dist/mixins.js +2 -2
  202. package/dist/nav-drawer.cjs +1 -1
  203. package/dist/nav-drawer.js +1 -1
  204. package/dist/navigation-bar.cjs +1 -1
  205. package/dist/navigation-bar.js +1 -1
  206. package/dist/navigation-rail.cjs +3 -3
  207. package/dist/navigation-rail.cjs.map +1 -1
  208. package/dist/navigation-rail.js +11 -10
  209. package/dist/navigation-rail.js.map +1 -1
  210. package/dist/notification-B6yDL91t.cjs +24 -0
  211. package/dist/notification-B6yDL91t.cjs.map +1 -0
  212. package/dist/{notification-BtAK7NK8.js → notification-BB9OBRCr.js} +22 -22
  213. package/dist/notification-BB9OBRCr.js.map +1 -0
  214. package/dist/notification.cjs +1 -1
  215. package/dist/notification.js +1 -1
  216. package/dist/{option-DHwA0miA.js → option-B21ImL0k.js} +2 -2
  217. package/dist/{option-DHwA0miA.js.map → option-B21ImL0k.js.map} +1 -1
  218. package/dist/{option-DnSPa8ro.cjs → option-CJQM5I9q.cjs} +1 -1
  219. package/dist/{option-DnSPa8ro.cjs.map → option-CJQM5I9q.cjs.map} +1 -1
  220. package/dist/option.cjs +1 -1
  221. package/dist/option.js +1 -1
  222. package/dist/{overlay-Del1sBEB.js → overlay-CWsihJ-E.js} +75 -67
  223. package/dist/overlay-CWsihJ-E.js.map +1 -0
  224. package/dist/overlay-DkIX9Ig3.cjs +58 -0
  225. package/dist/overlay-DkIX9Ig3.cjs.map +1 -0
  226. package/dist/overlay.cjs +1 -1
  227. package/dist/{overlay.confirm-body-DSONXUzl.js → overlay.confirm-body-CPqqPNks.js} +10 -10
  228. package/dist/overlay.confirm-body-CPqqPNks.js.map +1 -0
  229. package/dist/{overlay.confirm-body-BV9umTAl.cjs → overlay.confirm-body-DwTfiNlV.cjs} +3 -3
  230. package/dist/overlay.confirm-body-DwTfiNlV.cjs.map +1 -0
  231. package/dist/overlay.js +4 -4
  232. package/dist/overlay.service-DU1nqh6A.cjs +1 -0
  233. package/dist/{overlay.service-XLlrsSdA.cjs.map → overlay.service-DU1nqh6A.cjs.map} +1 -1
  234. package/dist/{overlay.service-BTp5Oq7f.js → overlay.service-KTgBxjFb.js} +4 -4
  235. package/dist/{overlay.service-BTp5Oq7f.js.map → overlay.service-KTgBxjFb.js.map} +1 -1
  236. package/dist/{progress-DUbTL9g9.cjs → progress-B-Qg44XY.cjs} +1 -1
  237. package/dist/{progress-DUbTL9g9.cjs.map → progress-B-Qg44XY.cjs.map} +1 -1
  238. package/dist/{progress-DYA83CFU.js → progress-CUSS1sNz.js} +2 -2
  239. package/dist/{progress-DYA83CFU.js.map → progress-CUSS1sNz.js.map} +1 -1
  240. package/dist/progress.cjs +1 -1
  241. package/dist/progress.js +1 -1
  242. package/dist/{radio-group-DxX0iJBo.js → radio-group-AHLvrN8O.js} +7 -7
  243. package/dist/radio-group-AHLvrN8O.js.map +1 -0
  244. package/dist/{radio-group-B-ORNtvR.cjs → radio-group-BEtvCSS1.cjs} +2 -2
  245. package/dist/radio-group-BEtvCSS1.cjs.map +1 -0
  246. package/dist/radio-group.cjs +1 -1
  247. package/dist/radio-group.js +1 -1
  248. package/dist/range.cjs +1 -1
  249. package/dist/range.js +2 -2
  250. package/dist/select-BWpV2iv-.cjs +56 -0
  251. package/dist/select-BWpV2iv-.cjs.map +1 -0
  252. package/dist/{select-C7gkA-ab.js → select-Cawz88lG.js} +46 -46
  253. package/dist/select-Cawz88lG.js.map +1 -0
  254. package/dist/select.cjs +1 -1
  255. package/dist/select.js +1 -1
  256. package/dist/skeleton.cjs +1 -1
  257. package/dist/skeleton.js +2 -2
  258. package/dist/skills/SKILL.md +3 -0
  259. package/dist/skills/overlay.md +14 -7
  260. package/dist/skills/schmancy/SKILL.md +3 -0
  261. package/dist/skills/schmancy/overlay.md +14 -7
  262. package/dist/slider.cjs +1 -1
  263. package/dist/slider.js +2 -2
  264. package/dist/{sound.service-O0232os6.js → sound.service-CK-5zob-.js} +4 -3
  265. package/dist/sound.service-CK-5zob-.js.map +1 -0
  266. package/dist/{sound.service-C7FDY_yD.cjs → sound.service-D2GGaBXc.cjs} +1 -1
  267. package/dist/sound.service-D2GGaBXc.cjs.map +1 -0
  268. package/dist/{splash-screen-jfE47xl0.js → splash-screen-BUEtjHXC.js} +13 -13
  269. package/dist/splash-screen-BUEtjHXC.js.map +1 -0
  270. package/dist/{splash-screen-DIS4odDr.cjs → splash-screen-DqPuipox.cjs} +6 -6
  271. package/dist/splash-screen-DqPuipox.cjs.map +1 -0
  272. package/dist/splash-screen.cjs +1 -1
  273. package/dist/splash-screen.js +1 -1
  274. package/dist/{src-BP3h-9d9.js → src-CIqAj3Eh.js} +45 -45
  275. package/dist/src-CIqAj3Eh.js.map +1 -0
  276. package/dist/{src-Um_pzb-U.cjs → src-CYqBQTyt.cjs} +6 -6
  277. package/dist/src-CYqBQTyt.cjs.map +1 -0
  278. package/dist/{state-Bj0M9a6T.cjs → state-BxDNox-2.cjs} +1 -1
  279. package/dist/{state-Bj0M9a6T.cjs.map → state-BxDNox-2.cjs.map} +1 -1
  280. package/dist/{state-DscWQpoM.js → state-CnZCDMT0.js} +9 -9
  281. package/dist/{state-DscWQpoM.js.map → state-CnZCDMT0.js.map} +1 -1
  282. package/dist/state.cjs +1 -1
  283. package/dist/state.js +2 -2
  284. package/dist/steps.cjs +1 -1
  285. package/dist/steps.js +2 -2
  286. package/dist/{surface-B4Wn4SOO.js → surface-BMdG3dKQ.js} +2 -2
  287. package/dist/{surface-B4Wn4SOO.js.map → surface-BMdG3dKQ.js.map} +1 -1
  288. package/dist/{surface-DRq6cVW6.cjs → surface-CWwYD_z2.cjs} +1 -1
  289. package/dist/{surface-DRq6cVW6.cjs.map → surface-CWwYD_z2.cjs.map} +1 -1
  290. package/dist/surface.cjs +1 -1
  291. package/dist/surface.js +1 -1
  292. package/dist/switch.cjs +4 -4
  293. package/dist/switch.cjs.map +1 -1
  294. package/dist/switch.js +11 -11
  295. package/dist/switch.js.map +1 -1
  296. package/dist/table.cjs +1 -1
  297. package/dist/table.js +2 -2
  298. package/dist/{tabs-CnQPo-XS.js → tabs-CDQYDc6v.js} +2 -2
  299. package/dist/{tabs-CnQPo-XS.js.map → tabs-CDQYDc6v.js.map} +1 -1
  300. package/dist/{tabs-Ca_fbHPW.cjs → tabs-CbD9E1gd.cjs} +1 -1
  301. package/dist/{tabs-Ca_fbHPW.cjs.map → tabs-CbD9E1gd.cjs.map} +1 -1
  302. package/dist/tabs.cjs +1 -1
  303. package/dist/tabs.js +1 -1
  304. package/dist/teleport.cjs +1 -1
  305. package/dist/teleport.js +1 -1
  306. package/dist/textarea-Brgi-vD2.cjs +43 -0
  307. package/dist/textarea-Brgi-vD2.cjs.map +1 -0
  308. package/dist/{textarea-BvqENhTW.js → textarea-MPyrMi-S.js} +4 -4
  309. package/dist/textarea-MPyrMi-S.js.map +1 -0
  310. package/dist/textarea.cjs +1 -1
  311. package/dist/textarea.js +1 -1
  312. package/dist/{theme-BSwJ2YZo.cjs → theme-BMbXoqi0.cjs} +1 -1
  313. package/dist/{theme-BSwJ2YZo.cjs.map → theme-BMbXoqi0.cjs.map} +1 -1
  314. package/dist/{theme-BV0EzHQ1.js → theme-DZu-xmVp.js} +5 -5
  315. package/dist/{theme-BV0EzHQ1.js.map → theme-DZu-xmVp.js.map} +1 -1
  316. package/dist/{theme-button-C6fpUzPM.cjs → theme-button-B0OLb-43.cjs} +1 -1
  317. package/dist/{theme-button-C6fpUzPM.cjs.map → theme-button-B0OLb-43.cjs.map} +1 -1
  318. package/dist/{theme-button-O_xNCgI7.js → theme-button-D_qGvEYs.js} +2 -2
  319. package/dist/{theme-button-O_xNCgI7.js.map → theme-button-D_qGvEYs.js.map} +1 -1
  320. package/dist/theme-button.cjs +1 -1
  321. package/dist/theme-button.js +1 -1
  322. package/dist/theme.cjs +1 -1
  323. package/dist/theme.js +3 -3
  324. package/dist/{theme.service-DwLhhOmP.js → theme.service-7VkM-hVf.js} +15 -11
  325. package/dist/theme.service-7VkM-hVf.js.map +1 -0
  326. package/dist/theme.service-B15FdjOS.cjs +1 -0
  327. package/dist/theme.service-B15FdjOS.cjs.map +1 -0
  328. package/dist/tree.cjs +4 -4
  329. package/dist/tree.cjs.map +1 -1
  330. package/dist/tree.js +8 -8
  331. package/dist/tree.js.map +1 -1
  332. package/dist/{typography-opFYuUYS.cjs → typography-D4Fo1UGh.cjs} +3 -3
  333. package/dist/{typography-opFYuUYS.cjs.map → typography-D4Fo1UGh.cjs.map} +1 -1
  334. package/dist/{typography-Dtdooaic.js → typography-SZhjb_4R.js} +9 -9
  335. package/dist/{typography-Dtdooaic.js.map → typography-SZhjb_4R.js.map} +1 -1
  336. package/dist/typography.cjs +1 -1
  337. package/dist/typography.js +1 -1
  338. package/dist/visually-hidden.cjs +1 -1
  339. package/dist/visually-hidden.js +2 -2
  340. package/dist/{window-ConcHirJ.js → window-BDVyrBnk.js} +101 -100
  341. package/dist/window-BDVyrBnk.js.map +1 -0
  342. package/dist/window-BbBYjm7R.cjs +59 -0
  343. package/dist/window-BbBYjm7R.cjs.map +1 -0
  344. package/dist/window.cjs +1 -1
  345. package/dist/window.js +1 -1
  346. package/package.json +1 -1
  347. package/skills/schmancy/SKILL.md +3 -0
  348. package/skills/schmancy/overlay.md +14 -7
  349. package/src/area/area.component.ts +1 -1
  350. package/src/area/area.service.test.ts +2 -2
  351. package/src/area/area.service.ts +1 -1
  352. package/src/area/lazy.ts +87 -83
  353. package/src/audio/sound.service.ts +3 -3
  354. package/src/breadcrumb/breadcrumb.ts +2 -2
  355. package/src/button/button.ts +11 -11
  356. package/src/button/icon-button.ts +18 -18
  357. package/src/card/card.ts +16 -16
  358. package/src/content-drawer/drawer.ts +6 -6
  359. package/src/details/details.ts +55 -55
  360. package/src/directives/ai-badge.ts +2 -1
  361. package/src/directives/animate-text.ts +2 -1
  362. package/src/directives/art/art.directive.ts +2 -1
  363. package/src/directives/battery.ts +2 -1
  364. package/src/directives/confirm-click.ts +5 -3
  365. package/src/directives/cursor-glow.ts +2 -1
  366. package/src/directives/cycle-text.ts +2 -1
  367. package/src/directives/depth-of-field.ts +2 -1
  368. package/src/directives/drag.ts +4 -2
  369. package/src/directives/fyi.ts +2 -1
  370. package/src/directives/gravity.ts +2 -1
  371. package/src/directives/hummingbird.ts +2 -1
  372. package/src/directives/intersect.ts +3 -2
  373. package/src/directives/liquid.ts +2 -1
  374. package/src/directives/living-border.ts +2 -1
  375. package/src/directives/long-press.ts +2 -1
  376. package/src/directives/magnetic.ts +2 -1
  377. package/src/directives/missed-punch.ts +2 -1
  378. package/src/directives/nebula.ts +6 -5
  379. package/src/directives/overflow-within.ts +2 -1
  380. package/src/directives/reveal.ts +2 -1
  381. package/src/directives/urgent.ts +2 -1
  382. package/src/directives/working-snake.ts +2 -1
  383. package/src/expand/expand-root.component.ts +27 -27
  384. package/src/expand/expand.component.ts +48 -48
  385. package/src/form/fields/autocomplete/autocomplete.ts +154 -154
  386. package/src/form/fields/checkbox/checkbox.ts +4 -4
  387. package/src/form/fields/chips/chips.ts +2 -2
  388. package/src/form/fields/chips/filter-chip.ts +15 -15
  389. package/src/form/fields/date-range/date-range.ts +2 -2
  390. package/src/form/fields/input/input.ts +12 -12
  391. package/src/form/fields/radio-group/radio-button.ts +2 -2
  392. package/src/form/fields/radio-group/radio-group.ts +3 -3
  393. package/src/form/fields/select/select.ts +56 -56
  394. package/src/form/fields/switch/switch.ts +10 -10
  395. package/src/form/fields/textarea/textarea.ts +2 -2
  396. package/src/form/form-summary.ts +33 -33
  397. package/src/form/form.ts +45 -45
  398. package/src/icons/icon.ts +10 -8
  399. package/src/iframe/iframe.ts +11 -11
  400. package/src/lightbox/flip-directive.ts +2 -1
  401. package/src/lightbox/lightbox.directive.ts +2 -1
  402. package/src/nav-drawer/navbar.ts +3 -3
  403. package/src/navigation-rail/navigation-rail.ts +10 -10
  404. package/src/notification/notification.ts +22 -22
  405. package/src/overlay/overlay.component.ts +106 -83
  406. package/src/overlay/overlay.confirm-body.ts +4 -4
  407. package/src/overlay/overlay.service.ts +3 -3
  408. package/src/overlay/overlay.types.ts +4 -2
  409. package/src/splash-screen/splash-screen.ts +11 -11
  410. package/src/state/index.ts +12 -12
  411. package/src/state/schmancy-context.ts +9 -9
  412. package/src/teleport/teleport.component.ts +2 -2
  413. package/src/theme/theme.service.ts +17 -17
  414. package/src/tree/tree.ts +7 -7
  415. package/src/typography/typography.ts +7 -7
  416. package/src/window/window-manager.ts +20 -20
  417. package/src/window/window.ts +100 -100
  418. package/types/mixins/SchmancyElement.d.ts +3 -2
  419. package/types/mixins/formField.mixin.d.ts +1 -1
  420. package/types/src/area/area.service.d.ts +1 -1
  421. package/types/src/area/lazy.d.ts +0 -6
  422. package/types/src/audio/sound.service.d.ts +1 -2
  423. package/types/src/breadcrumb/breadcrumb.d.ts +1 -1
  424. package/types/src/button/button.d.ts +3 -3
  425. package/types/src/button/icon-button.d.ts +6 -7
  426. package/types/src/card/card.d.ts +5 -5
  427. package/types/src/content-drawer/drawer.d.ts +1 -1
  428. package/types/src/details/details.d.ts +2 -21
  429. package/types/src/directives/ai-badge.d.ts +2 -2
  430. package/types/src/directives/animate-text.d.ts +2 -2
  431. package/types/src/directives/art/art.directive.d.ts +2 -2
  432. package/types/src/directives/battery.d.ts +2 -2
  433. package/types/src/directives/confirm-click.d.ts +2 -2
  434. package/types/src/directives/cursor-glow.d.ts +2 -2
  435. package/types/src/directives/cycle-text.d.ts +2 -2
  436. package/types/src/directives/depth-of-field.d.ts +2 -2
  437. package/types/src/directives/drag.d.ts +4 -4
  438. package/types/src/directives/fyi.d.ts +2 -2
  439. package/types/src/directives/gravity.d.ts +2 -2
  440. package/types/src/directives/hummingbird.d.ts +2 -2
  441. package/types/src/directives/intersect.d.ts +2 -2
  442. package/types/src/directives/liquid.d.ts +2 -2
  443. package/types/src/directives/living-border.d.ts +2 -2
  444. package/types/src/directives/long-press.d.ts +2 -2
  445. package/types/src/directives/magnetic.d.ts +2 -2
  446. package/types/src/directives/missed-punch.d.ts +2 -2
  447. package/types/src/directives/nebula.d.ts +2 -2
  448. package/types/src/directives/overflow-within.d.ts +2 -2
  449. package/types/src/directives/reveal.d.ts +2 -2
  450. package/types/src/directives/urgent.d.ts +2 -2
  451. package/types/src/directives/working-snake.d.ts +2 -2
  452. package/types/src/expand/expand-root.component.d.ts +8 -8
  453. package/types/src/expand/expand.component.d.ts +11 -11
  454. package/types/src/form/fields/autocomplete/autocomplete.d.ts +29 -29
  455. package/types/src/form/fields/checkbox/checkbox.d.ts +1 -1
  456. package/types/src/form/fields/chips/chips.d.ts +1 -1
  457. package/types/src/form/fields/chips/filter-chip.d.ts +1 -2
  458. package/types/src/form/fields/input/input.d.ts +3 -3
  459. package/types/src/form/fields/radio-group/radio-button.d.ts +1 -1
  460. package/types/src/form/fields/radio-group/radio-group.d.ts +1 -1
  461. package/types/src/form/fields/select/select.d.ts +8 -8
  462. package/types/src/form/fields/switch/switch.d.ts +3 -3
  463. package/types/src/form/fields/textarea/textarea.d.ts +1 -1
  464. package/types/src/form/form-summary.d.ts +7 -7
  465. package/types/src/form/form.d.ts +11 -11
  466. package/types/src/icons/icon.d.ts +2 -2
  467. package/types/src/iframe/iframe.d.ts +3 -3
  468. package/types/src/lightbox/flip-directive.d.ts +2 -2
  469. package/types/src/lightbox/lightbox.directive.d.ts +2 -2
  470. package/types/src/nav-drawer/navbar.d.ts +1 -1
  471. package/types/src/navigation-rail/navigation-rail.d.ts +2 -2
  472. package/types/src/notification/notification.d.ts +8 -8
  473. package/types/src/overlay/overlay.component.d.ts +16 -16
  474. package/types/src/overlay/overlay.confirm-body.d.ts +1 -1
  475. package/types/src/overlay/overlay.types.d.ts +4 -2
  476. package/types/src/splash-screen/splash-screen.d.ts +2 -2
  477. package/types/src/state/index.d.ts +1 -1
  478. package/types/src/state/schmancy-context.d.ts +3 -3
  479. package/types/src/teleport/teleport.component.d.ts +1 -1
  480. package/types/src/theme/theme.service.d.ts +1 -4
  481. package/types/src/tree/tree.d.ts +3 -3
  482. package/types/src/typography/typography.d.ts +1 -1
  483. package/types/src/window/window-manager.d.ts +2 -2
  484. package/types/src/window/window.d.ts +20 -20
  485. package/dist/area-KtULlxuA.js.map +0 -1
  486. package/dist/area-fdKhYB6T.cjs +0 -21
  487. package/dist/area-fdKhYB6T.cjs.map +0 -1
  488. package/dist/autocomplete-DEZk6wBD.cjs +0 -115
  489. package/dist/autocomplete-DEZk6wBD.cjs.map +0 -1
  490. package/dist/autocomplete-DIScyo8Q.js.map +0 -1
  491. package/dist/button-DzlHLjWO.cjs +0 -62
  492. package/dist/button-DzlHLjWO.cjs.map +0 -1
  493. package/dist/button-kcpPQavY.js.map +0 -1
  494. package/dist/card-BLxPLqdQ.cjs.map +0 -1
  495. package/dist/card-DxSKxCid.js.map +0 -1
  496. package/dist/chips-C9dS1WKn.cjs.map +0 -1
  497. package/dist/chips-vWmwqQed.js.map +0 -1
  498. package/dist/date-range-BV6HuvLw.cjs.map +0 -1
  499. package/dist/date-range-D3ge1b4c.js.map +0 -1
  500. package/dist/details-C-GZaq3j.js.map +0 -1
  501. package/dist/details-Dp5rLIWk.cjs +0 -164
  502. package/dist/details-Dp5rLIWk.cjs.map +0 -1
  503. package/dist/directives-D_l1E5H6.cjs.map +0 -1
  504. package/dist/directives-DyS51FUh.js.map +0 -1
  505. package/dist/expand-DvTb-UPR.js.map +0 -1
  506. package/dist/expand-mlP_3XWz.cjs +0 -141
  507. package/dist/expand-mlP_3XWz.cjs.map +0 -1
  508. package/dist/form-CwPHcQYB.cjs +0 -27
  509. package/dist/form-CwPHcQYB.cjs.map +0 -1
  510. package/dist/form-DA0hUu2h.js.map +0 -1
  511. package/dist/icons-C6UfxmHZ.js.map +0 -1
  512. package/dist/icons-CW3-oMSb.cjs +0 -24
  513. package/dist/icons-CW3-oMSb.cjs.map +0 -1
  514. package/dist/iframe-BTjZfYyh.js.map +0 -1
  515. package/dist/iframe-wuYT2xFz.cjs.map +0 -1
  516. package/dist/input-B_4g2ulO.js.map +0 -1
  517. package/dist/input-BrDiIT60.cjs.map +0 -1
  518. package/dist/lazy-CayEFyC3.cjs +0 -1
  519. package/dist/lazy-CayEFyC3.cjs.map +0 -1
  520. package/dist/lazy-D-bO2r4m.js +0 -13
  521. package/dist/lazy-D-bO2r4m.js.map +0 -1
  522. package/dist/lightbox-CVBogswK.cjs.map +0 -1
  523. package/dist/lightbox-D85XAAuC.js.map +0 -1
  524. package/dist/mixins-De1zjyhy.js.map +0 -1
  525. package/dist/mixins-DxHpyMHA.cjs.map +0 -1
  526. package/dist/notification-BtAK7NK8.js.map +0 -1
  527. package/dist/notification-DYzbUb5C.cjs +0 -24
  528. package/dist/notification-DYzbUb5C.cjs.map +0 -1
  529. package/dist/overlay-BVkqZmoS.cjs +0 -58
  530. package/dist/overlay-BVkqZmoS.cjs.map +0 -1
  531. package/dist/overlay-Del1sBEB.js.map +0 -1
  532. package/dist/overlay.confirm-body-BV9umTAl.cjs.map +0 -1
  533. package/dist/overlay.confirm-body-DSONXUzl.js.map +0 -1
  534. package/dist/overlay.service-XLlrsSdA.cjs +0 -1
  535. package/dist/radio-group-B-ORNtvR.cjs.map +0 -1
  536. package/dist/radio-group-DxX0iJBo.js.map +0 -1
  537. package/dist/select-B9uj_u-s.cjs +0 -56
  538. package/dist/select-B9uj_u-s.cjs.map +0 -1
  539. package/dist/select-C7gkA-ab.js.map +0 -1
  540. package/dist/sound.service-C7FDY_yD.cjs.map +0 -1
  541. package/dist/sound.service-O0232os6.js.map +0 -1
  542. package/dist/splash-screen-DIS4odDr.cjs.map +0 -1
  543. package/dist/splash-screen-jfE47xl0.js.map +0 -1
  544. package/dist/src-BP3h-9d9.js.map +0 -1
  545. package/dist/src-Um_pzb-U.cjs.map +0 -1
  546. package/dist/textarea-BvqENhTW.js.map +0 -1
  547. package/dist/textarea-qr7oL8oU.cjs +0 -43
  548. package/dist/textarea-qr7oL8oU.cjs.map +0 -1
  549. package/dist/theme.service-DwLhhOmP.js.map +0 -1
  550. package/dist/theme.service-kn9MC025.cjs +0 -1
  551. package/dist/theme.service-kn9MC025.cjs.map +0 -1
  552. package/dist/window-BSAemI9J.cjs +0 -59
  553. package/dist/window-BSAemI9J.cjs.map +0 -1
  554. package/dist/window-ConcHirJ.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay-DkIX9Ig3.cjs","names":["#closed$"],"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_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_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: '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\t/* Modal tier promotes the whole shell (scrim + surface) into the top\n\t * layer so every overlay — anchored or modal — shares ONE stacking\n\t * domain ordered strictly by show() time. Neutralize the UA popover\n\t * box so the shell stays full-viewport. */\n\t.shell:popover-open {\n\t\tinset: 0;\n\t\tmargin: 0;\n\t\tborder: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmax-width: none;\n\t\tmax-height: none;\n\t\tbackground: transparent;\n\t\toverflow: visible;\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\t@state() private full = false\n\n\t@query('.backdrop') private backdrop?: HTMLDivElement\n\t@query('.surface') private surface!: HTMLElement\n\t@query('.shell') private shell?: HTMLElement\n\n\t/** Close trigger for the service; emits the reason + detail payload. */\n\treadonly #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 factoryEffectDispose?: () => 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.full = options.full ?? 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\tif (isTemplateFactory(content)) {\n\t\t\t// Factory content is reactive: re-run litRender whenever a signal the\n\t\t\t// factory reads changes. The overlay IS a SignalWatcher (SchmancyElement),\n\t\t\t// so its own effect loop owns tracking + scheduling + teardown. Content\n\t\t\t// stays in the light-DOM mount point — no shadow boundary, every event /\n\t\t\t// focus / ResizeObserver contract preserved.\n\t\t\tthis.factoryEffectDispose = this.updateEffect(() => litRender(content(), mount), {\n\t\t\t\tmanualDispose: true,\n\t\t\t})\n\t\t} else {\n\t\t\tawait mountContent(content, mount, options.props)\n\t\t}\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} else if (this.tier === 'modal' && this.shell) {\n\t\t\t// Promote the whole modal shell (scrim + surface) into the native\n\t\t\t// top layer — the same domain anchored tiers already use. The top\n\t\t\t// layer paints strictly in show() order, so a sheet opened from\n\t\t\t// inside an earlier anchored overlay correctly stacks above it\n\t\t\t// (and recedes behind anything opened after it). Degrade silently\n\t\t\t// to the legacy z-index host on browsers without the Popover API.\n\t\t\ttry {\n\t\t\t\tthis.positionerTeardown = positionPopoverAPI(this.shell)\n\t\t\t} catch {\n\t\t\t\t// no Popover API support — keep the host z-index:10000 path.\n\t\t\t}\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.factoryEffectDispose) {\n\t\t\ttry {\n\t\t\t\tthis.factoryEffectDispose()\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.factoryEffectDispose = undefined\n\t\t}\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 ' +\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? this.full\n\t\t\t\t\t? 'left-0 right-0 bottom-0 w-full h-[90dvh] rounded-t-[28px] shadow-overlay flex flex-col overflow-hidden'\n\t\t\t\t\t: 'left-0 right-0 bottom-0 w-full max-h-[90dvh] rounded-t-[28px] shadow-overlay overflow-auto'\n\t\t\t\t: 'max-w-[min(480px,calc(100vw-2rem))] max-h-[90dvh] rounded-3xl shadow-overlay-anchored overflow-auto'\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} class=${this.layout === 'sheet' && this.full ? 'flex-1 min-h-0 overflow-hidden' : ''}></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(() => this.maybeReResolve())\n\t}\n\n\tprivate async maybeReResolve(): 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// 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\t// Must precede the TemplateFactory check: a lazy loader is an arrow\n\t// function with no `prototype`, so isTemplateFactory would match it\n\t// first and call it as a factory.\n\tif (isLazy(content)) {\n\t\tconst mod = await content()\n\t\treturn mountContent(mod.default, host, props)\n\t}\n\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// 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)\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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"}
package/dist/overlay.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./lazy-CayEFyC3.cjs`),t=require(`./overlay.service-XLlrsSdA.cjs`),n=require(`./overlay-BVkqZmoS.cjs`),r=require(`./overlay.confirm-body-BV9umTAl.cjs`);Object.defineProperty(exports,`SchmancyOverlay`,{enumerable:!0,get:function(){return n.t}}),Object.defineProperty(exports,`SchmancyOverlayPromptBody`,{enumerable:!0,get:function(){return r.t}}),exports.confirm=t.t,exports.dismissAll=t.n,exports.lazy=e.t,exports.openOverlays$=t.r,exports.overlayEvents=t.i,exports.prompt=t.a,exports.show=t.o;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./lazy-C-7a4FAe.cjs`),t=require(`./overlay.service-DU1nqh6A.cjs`),n=require(`./overlay-DkIX9Ig3.cjs`),r=require(`./overlay.confirm-body-DwTfiNlV.cjs`);Object.defineProperty(exports,`SchmancyOverlay`,{enumerable:!0,get:function(){return n.t}}),Object.defineProperty(exports,`SchmancyOverlayPromptBody`,{enumerable:!0,get:function(){return r.t}}),exports.confirm=t.t,exports.dismissAll=t.n,exports.lazy=e.t,exports.openOverlays$=t.r,exports.overlayEvents=t.i,exports.prompt=t.a,exports.show=t.o;
@@ -1,11 +1,11 @@
1
1
  import { n as e } from "./chunk-BM5alsTp.js";
2
- import { t, u as n } from "./SchmancyElement-CDT2q1lA.js";
3
- import "./mixins-De1zjyhy.js";
2
+ import { t, u as n } from "./SchmancyElement-BNnyBOwk.js";
3
+ import "./mixins-DGBI7YPO.js";
4
4
  import { t as r } from "./gravity-sVK3zGBF.js";
5
- import "./button-kcpPQavY.js";
6
- import "./form-DA0hUu2h.js";
7
- import "./input-B_4g2ulO.js";
8
- import "./typography-Dtdooaic.js";
5
+ import "./button-BQSOVnHn.js";
6
+ import "./form-DxaV_Ose.js";
7
+ import "./input-BCCHz6tB.js";
8
+ import "./typography-SZhjb_4R.js";
9
9
  import { customElement as i, property as a, query as o } from "lit/decorators.js";
10
10
  import { css as s, html as c } from "lit";
11
11
  import { ifDefined as l } from "lit/directives/if-defined.js";
@@ -17,8 +17,8 @@ var f = e({ SchmancyOverlayPromptBody: () => p }), p = class extends t {
17
17
  this.dismiss(this.mode === "prompt" && null);
18
18
  }, this.handleConfirm = () => {
19
19
  if (this.mode === "prompt") {
20
- if (this._schmancyInput && !this._schmancyInput.reportValidity()) return;
21
- this.dismiss(this._schmancyInput?.value ?? "");
20
+ if (this.schmancyInput && !this.schmancyInput.reportValidity()) return;
21
+ this.dismiss(this.schmancyInput?.value ?? "");
22
22
  } else this.dismiss(!0);
23
23
  }, this.handleSubmit = (e) => {
24
24
  e.preventDefault(), this.handleConfirm();
@@ -34,7 +34,7 @@ var f = e({ SchmancyOverlayPromptBody: () => p }), p = class extends t {
34
34
  `];
35
35
  }
36
36
  firstUpdated() {
37
- this.mode === "prompt" && this._schmancyInput?.focus();
37
+ this.mode === "prompt" && this.schmancyInput?.focus();
38
38
  }
39
39
  dismiss(e) {
40
40
  this.dispatchEvent(new CustomEvent("close", {
@@ -143,5 +143,5 @@ n([a({ type: String })], p.prototype, "heading", void 0), n([a({ type: String })
143
143
  })], p.prototype, "defaultValue", void 0), n([a({ type: String })], p.prototype, "placeholder", void 0), n([a({
144
144
  type: String,
145
145
  attribute: "input-type"
146
- })], p.prototype, "inputType", void 0), n([a({ type: String })], p.prototype, "pattern", void 0), n([a({ type: Boolean })], p.prototype, "required", void 0), n([o("schmancy-input")], p.prototype, "_schmancyInput", void 0), p = n([i("schmancy-overlay-prompt-body")], p);
146
+ })], p.prototype, "inputType", void 0), n([a({ type: String })], p.prototype, "pattern", void 0), n([a({ type: Boolean })], p.prototype, "required", void 0), n([o("schmancy-input")], p.prototype, "schmancyInput", void 0), p = n([i("schmancy-overlay-prompt-body")], p);
147
147
  export { f as n, p as t };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.confirm-body-CPqqPNks.js","names":[],"sources":["../src/overlay/overlay.confirm-body.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html, type TemplateResult } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { when } from 'lit/directives/when.js'\nimport { choose } from 'lit/directives/choose.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport { gravity } from '../directives/gravity'\nimport type SchmancyInput from '../form/fields/input/input'\n\nimport '../form/form'\nimport '../form/fields/input/input'\nimport '../typography/typography'\nimport '../button/button'\n\n/**\n * Internal body component used by the `confirm()` / `prompt()` sugar.\n *\n * `overlay.service.ts` lazy-imports this body via `await import('./overlay.confirm-body')`\n * so by mount time `schmancy-button`, `schmancy-input`, `schmancy-typography`,\n * and `schmancy-icon` are all registered.\n *\n * Emits a `close` CustomEvent with the typed result; the overlay picks\n * that up as the primary return channel. For custom-styled confirms,\n * callers pass their own component to `show()`.\n */\n@customElement('schmancy-overlay-prompt-body')\nexport class SchmancyOverlayPromptBody extends SchmancyElement {\n\tstatic styles = [css`\n\t\t:host {\n\t\t\tdisplay: block;\n\t\t\tmin-width: 280px;\n\t\t\tmax-width: 480px;\n\t\t}\n\t`]\n\n\t@property({ type: String }) heading?: string\n\t@property({ type: String }) subtitle?: string\n\t@property({ type: String }) message?: string\n\t@property({ type: String, attribute: 'confirm-text' }) confirmText = 'Confirm'\n\t@property({ type: String, attribute: 'cancel-text' }) cancelText = 'Cancel'\n\t@property({ type: String, reflect: true }) variant: 'default' | 'danger' = 'default'\n\n\t/** Presence of `mode` switches between confirm (boolean) and prompt (string). */\n\t@property({ type: String }) mode: 'confirm' | 'prompt' = 'confirm'\n\t@property({ type: String }) label?: string\n\t@property({ type: String, attribute: 'default-value' }) defaultValue = ''\n\t@property({ type: String }) placeholder?: string\n\t@property({ type: String, attribute: 'input-type' })\n\tinputType:\n\t\t| 'text'\n\t\t| 'email'\n\t\t| 'password'\n\t\t| 'tel'\n\t\t| 'url'\n\t\t| 'number'\n\t\t| 'search'\n\t\t| 'date'\n\t\t| 'time'\n\t\t| 'datetime-local' = 'text'\n\t@property({ type: String }) pattern?: string\n\t@property({ type: Boolean }) required = false\n\n\t@query('schmancy-input') private schmancyInput?: SchmancyInput\n\n\toverride firstUpdated(): void {\n\t\tif (this.mode === 'prompt') {\n\t\t\tthis.schmancyInput?.focus()\n\t\t}\n\t}\n\n\tprivate dismiss(value: boolean | string | null): void {\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('close', {\n\t\t\t\tdetail: value,\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\tprivate handleCancel = (): void => {\n\t\tthis.dismiss(this.mode === 'prompt' ? null : false)\n\t}\n\n\tprivate handleConfirm = (): void => {\n\t\tif (this.mode === 'prompt') {\n\t\t\tif (this.schmancyInput && !this.schmancyInput.reportValidity()) return\n\t\t\tthis.dismiss(this.schmancyInput?.value ?? '')\n\t\t} else {\n\t\t\tthis.dismiss(true)\n\t\t}\n\t}\n\n\tprivate handleSubmit = (e: Event): void => {\n\t\te.preventDefault()\n\t\tthis.handleConfirm()\n\t}\n\n\tprotected render(): TemplateResult {\n\t\treturn html`\n\t\t\t<schmancy-form @submit=${this.handleSubmit} class=\"p-6\">\n\t\t\t\t<div class=\"flex flex-col gap-3\">\n\t\t\t\t\t${when(\n\t\t\t\t\t\tthis.heading,\n\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t<schmancy-typography\n\t\t\t\t\t\t\t\t${gravity({ delay: 0, mass: 0.8 })}\n\t\t\t\t\t\t\t\ttype=\"headline\"\n\t\t\t\t\t\t\t\ttoken=\"sm\"\n\t\t\t\t\t\t\t>${this.heading}</schmancy-typography>\n\t\t\t\t\t\t`,\n\t\t\t\t\t)}\n\n\t\t\t\t\t${when(\n\t\t\t\t\t\tthis.subtitle,\n\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t<schmancy-typography\n\t\t\t\t\t\t\t\t${gravity({ delay: 60, mass: 0.9 })}\n\t\t\t\t\t\t\t\ttype=\"body\"\n\t\t\t\t\t\t\t\ttoken=\"md\"\n\t\t\t\t\t\t\t\tclass=\"opacity-70\"\n\t\t\t\t\t\t\t>${this.subtitle}</schmancy-typography>\n\t\t\t\t\t\t`,\n\t\t\t\t\t)}\n\n\t\t\t\t\t${choose(\n\t\t\t\t\t\tthis.mode,\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t'prompt',\n\t\t\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t\t\t<schmancy-input\n\t\t\t\t\t\t\t\t\t\t${gravity({ delay: 120, mass: 1.0 })}\n\t\t\t\t\t\t\t\t\t\t.label=${this.label ?? ''}\n\t\t\t\t\t\t\t\t\t\t.value=${this.defaultValue}\n\t\t\t\t\t\t\t\t\t\t.type=${this.inputType}\n\t\t\t\t\t\t\t\t\t\tplaceholder=${ifDefined(this.placeholder)}\n\t\t\t\t\t\t\t\t\t\tpattern=${ifDefined(this.pattern)}\n\t\t\t\t\t\t\t\t\t\t.required=${this.required}\n\t\t\t\t\t\t\t\t\t></schmancy-input>\n\t\t\t\t\t\t\t\t\t${when(\n\t\t\t\t\t\t\t\t\t\tthis.message,\n\t\t\t\t\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t\t\t\t\t<schmancy-typography\n\t\t\t\t\t\t\t\t\t\t\t\t${gravity({ delay: 180, mass: 1.0 })}\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"body\"\n\t\t\t\t\t\t\t\t\t\t\t\ttoken=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"opacity-70\"\n\t\t\t\t\t\t\t\t\t\t\t>${this.message}</schmancy-typography>\n\t\t\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t],\n\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t${when(\n\t\t\t\t\t\t\t\tthis.message,\n\t\t\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t\t\t<schmancy-typography\n\t\t\t\t\t\t\t\t\t\t${gravity({ delay: 60, mass: 0.9 })}\n\t\t\t\t\t\t\t\t\t\ttype=\"body\"\n\t\t\t\t\t\t\t\t\t\ttoken=\"md\"\n\t\t\t\t\t\t\t\t\t\tclass=\"opacity-70\"\n\t\t\t\t\t\t\t\t\t>${this.message}</schmancy-typography>\n\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t`,\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t<div ${gravity({ delay: 180, mass: 1.0 })} class=\"flex justify-end gap-2 mt-6\">\n\t\t\t\t\t<schmancy-button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"text\"\n\t\t\t\t\t\t@click=${this.handleCancel}\n\t\t\t\t\t>${this.cancelText}</schmancy-button>\n\t\t\t\t\t<schmancy-button\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\tvariant=\"filled\"\n\t\t\t\t\t\tcolor=${this.variant === 'danger' ? 'error' : 'primary'}\n\t\t\t\t\t>${this.confirmText}</schmancy-button>\n\t\t\t\t</div>\n\t\t\t</schmancy-form>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-overlay-prompt-body': SchmancyOverlayPromptBody\n\t}\n}\n"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- const e=require(`./chunk-CncqDLb2.cjs`),t=require(`./SchmancyElement-BHfQg3Tj.cjs`);require(`./mixins-DxHpyMHA.cjs`);const n=require(`./gravity-6pL6CfIr.cjs`);require(`./button-DzlHLjWO.cjs`),require(`./form-CwPHcQYB.cjs`),require(`./input-BrDiIT60.cjs`),require(`./typography-opFYuUYS.cjs`);let r=require(`lit/decorators.js`),i=require(`lit`),a=require(`lit/directives/if-defined.js`),o=require(`lit/directives/when.js`),s=require(`lit/directives/choose.js`);var c=e.n({SchmancyOverlayPromptBody:()=>l}),l=class extends t.t{constructor(...e){super(...e),this.confirmText=`Confirm`,this.cancelText=`Cancel`,this.variant=`default`,this.mode=`confirm`,this.defaultValue=``,this.inputType=`text`,this.required=!1,this.handleCancel=()=>{this.dismiss(this.mode===`prompt`&&null)},this.handleConfirm=()=>{if(this.mode===`prompt`){if(this._schmancyInput&&!this._schmancyInput.reportValidity())return;this.dismiss(this._schmancyInput?.value??``)}else this.dismiss(!0)},this.handleSubmit=e=>{e.preventDefault(),this.handleConfirm()}}static{this.styles=[i.css`
1
+ const e=require(`./chunk-CncqDLb2.cjs`),t=require(`./SchmancyElement-C41uPa6l.cjs`);require(`./mixins-fIpzhVMd.cjs`);const n=require(`./gravity-6pL6CfIr.cjs`);require(`./button-WRmXlNyw.cjs`),require(`./form-4GKROq2P.cjs`),require(`./input-Z-3N5JMv.cjs`),require(`./typography-D4Fo1UGh.cjs`);let r=require(`lit/decorators.js`),i=require(`lit`),a=require(`lit/directives/if-defined.js`),o=require(`lit/directives/when.js`),s=require(`lit/directives/choose.js`);var c=e.n({SchmancyOverlayPromptBody:()=>l}),l=class extends t.t{constructor(...e){super(...e),this.confirmText=`Confirm`,this.cancelText=`Cancel`,this.variant=`default`,this.mode=`confirm`,this.defaultValue=``,this.inputType=`text`,this.required=!1,this.handleCancel=()=>{this.dismiss(this.mode===`prompt`&&null)},this.handleConfirm=()=>{if(this.mode===`prompt`){if(this.schmancyInput&&!this.schmancyInput.reportValidity())return;this.dismiss(this.schmancyInput?.value??``)}else this.dismiss(!0)},this.handleSubmit=e=>{e.preventDefault(),this.handleConfirm()}}static{this.styles=[i.css`
2
2
  :host {
3
3
  display: block;
4
4
  min-width: 280px;
5
5
  max-width: 480px;
6
6
  }
7
- `]}firstUpdated(){this.mode===`prompt`&&this._schmancyInput?.focus()}dismiss(e){this.dispatchEvent(new CustomEvent(`close`,{detail:e,bubbles:!0,composed:!0}))}render(){return i.html`
7
+ `]}firstUpdated(){this.mode===`prompt`&&this.schmancyInput?.focus()}dismiss(e){this.dispatchEvent(new CustomEvent(`close`,{detail:e,bubbles:!0,composed:!0}))}render(){return i.html`
8
8
  <schmancy-form @submit=${this.handleSubmit} class="p-6">
9
9
  <div class="flex flex-col gap-3">
10
10
  ${(0,o.when)(this.heading,()=>i.html`
@@ -67,4 +67,4 @@ const e=require(`./chunk-CncqDLb2.cjs`),t=require(`./SchmancyElement-BHfQg3Tj.cj
67
67
  >${this.confirmText}</schmancy-button>
68
68
  </div>
69
69
  </schmancy-form>
70
- `}};t.u([(0,r.property)({type:String})],l.prototype,`heading`,void 0),t.u([(0,r.property)({type:String})],l.prototype,`subtitle`,void 0),t.u([(0,r.property)({type:String})],l.prototype,`message`,void 0),t.u([(0,r.property)({type:String,attribute:`confirm-text`})],l.prototype,`confirmText`,void 0),t.u([(0,r.property)({type:String,attribute:`cancel-text`})],l.prototype,`cancelText`,void 0),t.u([(0,r.property)({type:String,reflect:!0})],l.prototype,`variant`,void 0),t.u([(0,r.property)({type:String})],l.prototype,`mode`,void 0),t.u([(0,r.property)({type:String})],l.prototype,`label`,void 0),t.u([(0,r.property)({type:String,attribute:`default-value`})],l.prototype,`defaultValue`,void 0),t.u([(0,r.property)({type:String})],l.prototype,`placeholder`,void 0),t.u([(0,r.property)({type:String,attribute:`input-type`})],l.prototype,`inputType`,void 0),t.u([(0,r.property)({type:String})],l.prototype,`pattern`,void 0),t.u([(0,r.property)({type:Boolean})],l.prototype,`required`,void 0),t.u([(0,r.query)(`schmancy-input`)],l.prototype,`_schmancyInput`,void 0),l=t.u([(0,r.customElement)(`schmancy-overlay-prompt-body`)],l),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return l}});
70
+ `}};t.u([(0,r.property)({type:String})],l.prototype,`heading`,void 0),t.u([(0,r.property)({type:String})],l.prototype,`subtitle`,void 0),t.u([(0,r.property)({type:String})],l.prototype,`message`,void 0),t.u([(0,r.property)({type:String,attribute:`confirm-text`})],l.prototype,`confirmText`,void 0),t.u([(0,r.property)({type:String,attribute:`cancel-text`})],l.prototype,`cancelText`,void 0),t.u([(0,r.property)({type:String,reflect:!0})],l.prototype,`variant`,void 0),t.u([(0,r.property)({type:String})],l.prototype,`mode`,void 0),t.u([(0,r.property)({type:String})],l.prototype,`label`,void 0),t.u([(0,r.property)({type:String,attribute:`default-value`})],l.prototype,`defaultValue`,void 0),t.u([(0,r.property)({type:String})],l.prototype,`placeholder`,void 0),t.u([(0,r.property)({type:String,attribute:`input-type`})],l.prototype,`inputType`,void 0),t.u([(0,r.property)({type:String})],l.prototype,`pattern`,void 0),t.u([(0,r.property)({type:Boolean})],l.prototype,`required`,void 0),t.u([(0,r.query)(`schmancy-input`)],l.prototype,`schmancyInput`,void 0),l=t.u([(0,r.customElement)(`schmancy-overlay-prompt-body`)],l),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return l}});
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.confirm-body-DwTfiNlV.cjs","names":[],"sources":["../src/overlay/overlay.confirm-body.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html, type TemplateResult } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { when } from 'lit/directives/when.js'\nimport { choose } from 'lit/directives/choose.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport { gravity } from '../directives/gravity'\nimport type SchmancyInput from '../form/fields/input/input'\n\nimport '../form/form'\nimport '../form/fields/input/input'\nimport '../typography/typography'\nimport '../button/button'\n\n/**\n * Internal body component used by the `confirm()` / `prompt()` sugar.\n *\n * `overlay.service.ts` lazy-imports this body via `await import('./overlay.confirm-body')`\n * so by mount time `schmancy-button`, `schmancy-input`, `schmancy-typography`,\n * and `schmancy-icon` are all registered.\n *\n * Emits a `close` CustomEvent with the typed result; the overlay picks\n * that up as the primary return channel. For custom-styled confirms,\n * callers pass their own component to `show()`.\n */\n@customElement('schmancy-overlay-prompt-body')\nexport class SchmancyOverlayPromptBody extends SchmancyElement {\n\tstatic styles = [css`\n\t\t:host {\n\t\t\tdisplay: block;\n\t\t\tmin-width: 280px;\n\t\t\tmax-width: 480px;\n\t\t}\n\t`]\n\n\t@property({ type: String }) heading?: string\n\t@property({ type: String }) subtitle?: string\n\t@property({ type: String }) message?: string\n\t@property({ type: String, attribute: 'confirm-text' }) confirmText = 'Confirm'\n\t@property({ type: String, attribute: 'cancel-text' }) cancelText = 'Cancel'\n\t@property({ type: String, reflect: true }) variant: 'default' | 'danger' = 'default'\n\n\t/** Presence of `mode` switches between confirm (boolean) and prompt (string). */\n\t@property({ type: String }) mode: 'confirm' | 'prompt' = 'confirm'\n\t@property({ type: String }) label?: string\n\t@property({ type: String, attribute: 'default-value' }) defaultValue = ''\n\t@property({ type: String }) placeholder?: string\n\t@property({ type: String, attribute: 'input-type' })\n\tinputType:\n\t\t| 'text'\n\t\t| 'email'\n\t\t| 'password'\n\t\t| 'tel'\n\t\t| 'url'\n\t\t| 'number'\n\t\t| 'search'\n\t\t| 'date'\n\t\t| 'time'\n\t\t| 'datetime-local' = 'text'\n\t@property({ type: String }) pattern?: string\n\t@property({ type: Boolean }) required = false\n\n\t@query('schmancy-input') private schmancyInput?: SchmancyInput\n\n\toverride firstUpdated(): void {\n\t\tif (this.mode === 'prompt') {\n\t\t\tthis.schmancyInput?.focus()\n\t\t}\n\t}\n\n\tprivate dismiss(value: boolean | string | null): void {\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('close', {\n\t\t\t\tdetail: value,\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\tprivate handleCancel = (): void => {\n\t\tthis.dismiss(this.mode === 'prompt' ? null : false)\n\t}\n\n\tprivate handleConfirm = (): void => {\n\t\tif (this.mode === 'prompt') {\n\t\t\tif (this.schmancyInput && !this.schmancyInput.reportValidity()) return\n\t\t\tthis.dismiss(this.schmancyInput?.value ?? '')\n\t\t} else {\n\t\t\tthis.dismiss(true)\n\t\t}\n\t}\n\n\tprivate handleSubmit = (e: Event): void => {\n\t\te.preventDefault()\n\t\tthis.handleConfirm()\n\t}\n\n\tprotected render(): TemplateResult {\n\t\treturn html`\n\t\t\t<schmancy-form @submit=${this.handleSubmit} class=\"p-6\">\n\t\t\t\t<div class=\"flex flex-col gap-3\">\n\t\t\t\t\t${when(\n\t\t\t\t\t\tthis.heading,\n\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t<schmancy-typography\n\t\t\t\t\t\t\t\t${gravity({ delay: 0, mass: 0.8 })}\n\t\t\t\t\t\t\t\ttype=\"headline\"\n\t\t\t\t\t\t\t\ttoken=\"sm\"\n\t\t\t\t\t\t\t>${this.heading}</schmancy-typography>\n\t\t\t\t\t\t`,\n\t\t\t\t\t)}\n\n\t\t\t\t\t${when(\n\t\t\t\t\t\tthis.subtitle,\n\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t<schmancy-typography\n\t\t\t\t\t\t\t\t${gravity({ delay: 60, mass: 0.9 })}\n\t\t\t\t\t\t\t\ttype=\"body\"\n\t\t\t\t\t\t\t\ttoken=\"md\"\n\t\t\t\t\t\t\t\tclass=\"opacity-70\"\n\t\t\t\t\t\t\t>${this.subtitle}</schmancy-typography>\n\t\t\t\t\t\t`,\n\t\t\t\t\t)}\n\n\t\t\t\t\t${choose(\n\t\t\t\t\t\tthis.mode,\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t'prompt',\n\t\t\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t\t\t<schmancy-input\n\t\t\t\t\t\t\t\t\t\t${gravity({ delay: 120, mass: 1.0 })}\n\t\t\t\t\t\t\t\t\t\t.label=${this.label ?? ''}\n\t\t\t\t\t\t\t\t\t\t.value=${this.defaultValue}\n\t\t\t\t\t\t\t\t\t\t.type=${this.inputType}\n\t\t\t\t\t\t\t\t\t\tplaceholder=${ifDefined(this.placeholder)}\n\t\t\t\t\t\t\t\t\t\tpattern=${ifDefined(this.pattern)}\n\t\t\t\t\t\t\t\t\t\t.required=${this.required}\n\t\t\t\t\t\t\t\t\t></schmancy-input>\n\t\t\t\t\t\t\t\t\t${when(\n\t\t\t\t\t\t\t\t\t\tthis.message,\n\t\t\t\t\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t\t\t\t\t<schmancy-typography\n\t\t\t\t\t\t\t\t\t\t\t\t${gravity({ delay: 180, mass: 1.0 })}\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"body\"\n\t\t\t\t\t\t\t\t\t\t\t\ttoken=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"opacity-70\"\n\t\t\t\t\t\t\t\t\t\t\t>${this.message}</schmancy-typography>\n\t\t\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t],\n\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t${when(\n\t\t\t\t\t\t\t\tthis.message,\n\t\t\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t\t\t<schmancy-typography\n\t\t\t\t\t\t\t\t\t\t${gravity({ delay: 60, mass: 0.9 })}\n\t\t\t\t\t\t\t\t\t\ttype=\"body\"\n\t\t\t\t\t\t\t\t\t\ttoken=\"md\"\n\t\t\t\t\t\t\t\t\t\tclass=\"opacity-70\"\n\t\t\t\t\t\t\t\t\t>${this.message}</schmancy-typography>\n\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t`,\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t<div ${gravity({ delay: 180, mass: 1.0 })} class=\"flex justify-end gap-2 mt-6\">\n\t\t\t\t\t<schmancy-button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"text\"\n\t\t\t\t\t\t@click=${this.handleCancel}\n\t\t\t\t\t>${this.cancelText}</schmancy-button>\n\t\t\t\t\t<schmancy-button\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\tvariant=\"filled\"\n\t\t\t\t\t\tcolor=${this.variant === 'danger' ? 'error' : 'primary'}\n\t\t\t\t\t>${this.confirmText}</schmancy-button>\n\t\t\t\t</div>\n\t\t\t</schmancy-form>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-overlay-prompt-body': SchmancyOverlayPromptBody\n\t}\n}\n"],"mappings":"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"}
package/dist/overlay.js CHANGED
@@ -1,5 +1,5 @@
1
- import { t as e } from "./lazy-D-bO2r4m.js";
2
- import { a as t, i as n, n as r, o as i, r as a, t as o } from "./overlay.service-BTp5Oq7f.js";
3
- import { t as s } from "./overlay-Del1sBEB.js";
4
- import { t as c } from "./overlay.confirm-body-DSONXUzl.js";
1
+ import { t as e } from "./lazy-BaAiIUru.js";
2
+ import { a as t, i as n, n as r, o as i, r as a, t as o } from "./overlay.service-KTgBxjFb.js";
3
+ import { t as s } from "./overlay-CWsihJ-E.js";
4
+ import { t as c } from "./overlay.confirm-body-CPqqPNks.js";
5
5
  export { s as SchmancyOverlay, c as SchmancyOverlayPromptBody, o as confirm, r as dismissAll, e as lazy, a as openOverlays$, n as overlayEvents, t as prompt, i as show };
@@ -0,0 +1 @@
1
+ require(`./chunk-CncqDLb2.cjs`);const e=require(`./discovery.service-CIa3Eeuk.cjs`);let t=require(`rxjs`);var n=new t.BehaviorSubject([]),r=n.asObservable();function i(){return n.value}var a=!1,o=``,s=``;n.pipe((0,t.map)(e=>e.some(e=>e.modal)),(0,t.distinctUntilChanged)()).subscribe(e=>{typeof document<`u`&&(e&&!a?(o=document.documentElement.style.overflow,s=document.documentElement.style.getPropertyValue(`scrollbar-gutter`),document.documentElement.style.overflow=`hidden`,document.documentElement.style.setProperty(`scrollbar-gutter`,`stable`),a=!0):!e&&a&&(document.documentElement.style.overflow=o,s?document.documentElement.style.setProperty(`scrollbar-gutter`,s):document.documentElement.style.removeProperty(`scrollbar-gutter`),o=``,s=``,a=!1))});var c=new Set,l=new Set;function u(e,t){c.add(e),c.size===1&&function(e){let t=e.parentElement??document.body;for(let n=0;n<t.children.length;n++){let r=t.children[n];r!==e&&r instanceof HTMLElement&&!r.inert&&(r.inert=!0,l.add(r))}}(t)}function d(e){c.delete(e),c.size===0&&function(){for(let e of l)e.inert=!1;l.clear()}()}var f=r,p=new t.BehaviorSubject(null);function m(){let e=p.value;if(e&&!(performance.now()-e.capturedAt>750))return e.event}function h(r,i={}){return(0,t.defer)(()=>{let a={...i,anchor:i.anchor??m()},o=`ov_`+Math.random().toString(36).slice(2,10)+Date.now().toString(36),s={settled:!1,historyPushed:!1};return e.o(`schmancy-theme`).pipe((0,t.switchMap)(e=>{let i=document.createElement(`schmancy-overlay`);(e??document.body??document.documentElement).appendChild(i);let c=(0,t.from)(i.updateComplete.then(()=>i.open(r,a))).pipe((0,t.tap)(()=>{var e={id:o,element:i,layout:i.layout,modal:i.modal,tier:i.tier};n.next([...n.value,e]),i.modal&&i.parentElement&&u(o,i);let t=a.historyStrategy??`push`;t===`push`?(history.pushState({schmancyOverlayId:o},``,location.href),s.historyPushed=!0):t===`replace`&&history.replaceState({schmancyOverlayId:o},``,location.href)})),l=(0,t.fromEvent)(window,`popstate`).pipe((0,t.take)(1),(0,t.filter)(()=>s.historyPushed),(0,t.tap)(()=>{s.settled=!0,i.close(`popstate`)}),(0,t.ignoreElements)()),f=i.closed$.pipe((0,t.take)(1),(0,t.tap)(()=>{s.settled=!0}),(0,t.map)(({result:e})=>e));return c.pipe((0,t.switchMap)(()=>(0,t.merge)(f,l).pipe((0,t.take)(1))),(0,t.finalize)(()=>{s.settled||i.close(`programmatic`),d(o),function(e){let t=n.value,r=t.filter(t=>t.id!==e);r.length!==t.length&&n.next(r)}(o),s.historyPushed&&!s.settled&&history.state?.schmancyOverlayId===o&&history.back(),queueMicrotask(()=>i.remove())}))}))})}async function g(e={}){let{SchmancyOverlayPromptBody:n}=await Promise.resolve().then(()=>require(`./overlay.confirm-body-DwTfiNlV.cjs`)).then(e=>e.n);return!0===await(0,t.firstValueFrom)(h(n,{anchor:e.anchor,signal:e.signal,props:{mode:`confirm`,heading:e.title,subtitle:e.subtitle,message:e.message,confirmText:e.confirmText??`Confirm`,cancelText:e.cancelText??`Cancel`,variant:e.variant??`default`}}).pipe((0,t.defaultIfEmpty)(!1)))}async function _(e={}){let{SchmancyOverlayPromptBody:n}=await Promise.resolve().then(()=>require(`./overlay.confirm-body-DwTfiNlV.cjs`)).then(e=>e.n),r=await(0,t.firstValueFrom)(h(n,{anchor:e.anchor,signal:e.signal,props:{mode:`prompt`,heading:e.title,subtitle:e.subtitle,message:e.message,label:e.label,defaultValue:e.defaultValue??``,placeholder:e.placeholder,inputType:e.inputType??`text`,pattern:e.pattern,required:e.required??!1,confirmText:e.confirmText??`OK`,cancelText:e.cancelText??`Cancel`}}).pipe((0,t.defaultIfEmpty)(null)));return typeof r==`string`?r:null}function v(e,r){return function(e){let r=e.toLowerCase();return n.pipe((0,t.map)(e=>{let t=[];for(let n of e){let e=n.element.querySelector(r);e&&t.push(e)}return t}),(0,t.distinctUntilChanged)((e,t)=>e.length===t.length&&e.every((e,n)=>e===t[n])))}(e).pipe((0,t.distinctUntilChanged)((e,t)=>e.length===t.length&&e.every((e,n)=>e===t[n])),(0,t.switchMap)(e=>e.length===0?t.EMPTY:(0,t.merge)(...e.map(e=>(0,t.fromEvent)(e,r)))),(0,t.map)(e=>e))}function y(){let e=[...i()];for(let t=e.length-1;t>=0;t--)e[t].element.close(`programmatic`);n.value.length>0&&n.next([])}typeof document<`u`&&(0,t.merge)((0,t.fromEvent)(document,`pointerdown`,{capture:!0,passive:!0}).pipe((0,t.map)(e=>({event:e,capturedAt:performance.now()}))),(0,t.fromEvent)(document,`click`,{capture:!0,passive:!0}).pipe((0,t.map)(e=>({event:e,capturedAt:performance.now()}))),(0,t.fromEvent)(document,`keydown`,{capture:!0}).pipe((0,t.filter)(e=>e.target instanceof Element),(0,t.map)(e=>{let t=e.target.getBoundingClientRect();return{event:new MouseEvent(`click`,{clientX:t.left+t.width/2,clientY:t.top+t.height/2,bubbles:!0}),capturedAt:performance.now()}}))).subscribe(e=>p.next(e)),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return g}});
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.service-XLlrsSdA.cjs","names":[],"sources":["../src/overlay/overlay.stack.ts","../src/overlay/overlay.service.ts"],"sourcesContent":["import { BehaviorSubject, distinctUntilChanged, map, Observable } from 'rxjs'\nimport type { OverlayEntry } from './overlay.types'\n\n/**\n * Overlay stack — single source of truth for \"what is currently open.\"\n *\n * A module-scope BehaviorSubject matching the `schmancy` skill's\n * \"contexts at module scope; many small contexts beat one monolith\"\n * guidance. Reactive pipelines inside the overlay service and public\n * `openOverlays$` observable project off this.\n *\n * Scroll lock and the stack-aware inert manager are both derived from\n * the stack state — no separate mutable counter variables. Honors rxjs\n * SUBSCRIPTION_IS_STATE: the stack IS the state; scroll lock / inert\n * are declarative projections.\n */\n\nconst stack$$ = new BehaviorSubject<readonly OverlayEntry[]>([])\n\n/** Public read-only stream of the current stack. Emits on every push/pop. */\nexport const stack$: Observable<readonly OverlayEntry[]> = stack$$.asObservable()\n\n/** Synchronous snapshot. Use only when a component can't subscribe. */\nexport function currentStack(): readonly OverlayEntry[] {\n\treturn stack$$.value\n}\n\n/** Append an entry (top of stack). */\nexport function pushEntry(entry: OverlayEntry): void {\n\tstack$$.next([...stack$$.value, entry])\n}\n\n/** Remove by id. No-op if the id is not in the stack. */\nexport function removeEntry(id: string): void {\n\tconst current = stack$$.value\n\tconst next = current.filter((e) => e.id !== id)\n\tif (next.length !== current.length) {\n\t\tstack$$.next(next)\n\t}\n}\n\n/** Clear the entire stack. Used by dismissAll(). */\nexport function clearStack(): void {\n\tif (stack$$.value.length > 0) {\n\t\tstack$$.next([])\n\t}\n}\n\n/* ---------------- scroll lock -------------------------------------------- */\n\n/**\n * Ref-counted body scroll lock. Active whenever ANY modal-tier overlay is\n * in the stack. Popover-tier (Tier 1/2) overlays do NOT lock body scroll —\n * a menu / share card / picker shouldn't freeze the page scroll behind it\n * (that's platform UX convention).\n *\n * Subscription is idempotent — subscribing multiple times won't stack\n * effects, because it's a distinctUntilChanged boolean projection.\n *\n * Inner overlay close does NOT release the lock while an outer modal is\n * still open (this was the pre-existing bug in sheet.service.ts).\n */\nlet scrollLockActive = false\nlet previousOverflow = ''\nlet previousScrollbarGutter = ''\n\nstack$$\n\t.pipe(\n\t\tmap((s) => s.some((e) => e.modal)),\n\t\tdistinctUntilChanged(),\n\t)\n\t.subscribe((shouldLock) => {\n\t\tif (typeof document === 'undefined') return\n\n\t\tif (shouldLock && !scrollLockActive) {\n\t\t\tpreviousOverflow = document.documentElement.style.overflow\n\t\t\tpreviousScrollbarGutter = document.documentElement.style.getPropertyValue('scrollbar-gutter')\n\t\t\tdocument.documentElement.style.overflow = 'hidden'\n\t\t\tdocument.documentElement.style.setProperty('scrollbar-gutter', 'stable')\n\t\t\tscrollLockActive = true\n\t\t} else if (!shouldLock && scrollLockActive) {\n\t\t\tdocument.documentElement.style.overflow = previousOverflow\n\t\t\tif (previousScrollbarGutter) {\n\t\t\t\tdocument.documentElement.style.setProperty('scrollbar-gutter', previousScrollbarGutter)\n\t\t\t} else {\n\t\t\t\tdocument.documentElement.style.removeProperty('scrollbar-gutter')\n\t\t\t}\n\t\t\tpreviousOverflow = ''\n\t\t\tpreviousScrollbarGutter = ''\n\t\t\tscrollLockActive = false\n\t\t}\n\t})\n\n/* ---------------- stack-aware inert -------------------------------------- */\n\n/**\n * When the first modal overlay opens, mark every sibling outside the\n * overlay host subtree as `inert` so AT and keyboard focus can't reach\n * them. Restored when the last modal overlay closes.\n *\n * Note: native `<dialog>.showModal()` already inerts the rest of the\n * document automatically. We keep this as a safety net for:\n * - anchored (popover) overlays which are non-modal by design but may\n * carry `modal: true` as the escape hatch;\n * - stacked overlays where an inner modal opens above a non-modal —\n * the sibling-inert is a no-op but we still guarantee the invariant.\n *\n * Callers that don't want inert (anchored/menu overlays) skip registration\n * via `markNonModal(id)`.\n */\nconst modalIds = new Set<string>()\nconst inertedSiblings = new Set<HTMLElement>()\n\nexport function markModal(id: string, hostContainer: HTMLElement): void {\n\tmodalIds.add(id)\n\tif (modalIds.size === 1) {\n\t\tapplyInert(hostContainer)\n\t}\n}\n\nexport function unmarkModal(id: string): void {\n\tmodalIds.delete(id)\n\tif (modalIds.size === 0) {\n\t\treleaseInert()\n\t}\n}\n\nfunction applyInert(hostContainer: HTMLElement): void {\n\tconst parent = hostContainer.parentElement ?? document.body\n\tfor (let i = 0; i < parent.children.length; i++) {\n\t\tconst child = parent.children[i]\n\t\tif (child !== hostContainer && child instanceof HTMLElement && !child.inert) {\n\t\t\tchild.inert = true\n\t\t\tinertedSiblings.add(child)\n\t\t}\n\t}\n}\n\nfunction releaseInert(): void {\n\tfor (const el of inertedSiblings) {\n\t\tel.inert = false\n\t}\n\tinertedSiblings.clear()\n}\n\n/* ---------------- overlayEvents multicast helper ------------------------- */\n\n/**\n * Returns an Observable of `tagName` elements currently in the stack.\n * The overlayEvents public helper composes `fromEvent` over this stream\n * via switchMap to tap events without owning the overlay lifecycle.\n *\n * Stays alive across open/close cycles — the caller owns completion via\n * `takeUntil(this.disconnecting)`, matching the house rxjs convention.\n */\nexport function elementsByTag$(tagName: string): Observable<readonly HTMLElement[]> {\n\tconst lower = tagName.toLowerCase()\n\treturn stack$$.pipe(\n\t\tmap((entries) => {\n\t\t\tconst matches: HTMLElement[] = []\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst inner = entry.element.querySelector<HTMLElement>(lower)\n\t\t\t\tif (inner) matches.push(inner)\n\t\t\t}\n\t\t\treturn matches\n\t\t}),\n\t\tdistinctUntilChanged((a, b) => a.length === b.length && a.every((el, i) => el === b[i])),\n\t)\n}\n","import {\n\tBehaviorSubject,\n\tdefer,\n\tdefaultIfEmpty,\n\tdistinctUntilChanged,\n\tEMPTY,\n\tfilter,\n\tfinalize,\n\tfirstValueFrom,\n\tfrom,\n\tfromEvent,\n\tignoreElements,\n\tmap,\n\tmerge,\n\tObservable,\n\tswitchMap,\n\ttake,\n\ttap,\n} from 'rxjs'\nimport type { THistoryStrategy } from '../area/router.types'\nimport { discoverComponent } from '../discovery/discovery.service'\nimport { SchmancyOverlay } from './overlay.component'\nimport {\n\tclearStack,\n\tcurrentStack,\n\telementsByTag$,\n\tmarkModal,\n\tpushEntry,\n\tremoveEntry,\n\tstack$ as internalStack$,\n\tunmarkModal,\n} from './overlay.stack'\nimport type {\n\tCloseReason,\n\tOverlayConfirmOptions,\n\tContent,\n\tOverlayEntry,\n\tOverlayPromptOptions,\n\tShowOptions,\n} from './overlay.types'\n\n/**\n * Public read-only stream of the current overlay stack. Subscribe to\n * observe stack changes — e.g. to update a breadcrumb, show a \"close\n * all\" button, or gate another action while any overlay is open.\n *\n * Emits synchronously with the current snapshot on subscribe. Never\n * completes — the caller owns teardown via `takeUntil(this.disconnecting)`.\n */\nexport const openOverlays$: Observable<readonly OverlayEntry[]> = internalStack$\n\n/* ======================================================================= *\n * ambient event capture *\n * ======================================================================= *\n * Novel: callers do not need to pass `anchor: event` manually. The service\n * listens to pointerdown / click / keydown at capture phase on the document\n * and remembers the most-recent user gesture. When show() is invoked\n * synchronously (or shortly after) in response to that gesture, the remembered\n * event becomes the default anchor. This matches the \"anchored is the novel\n * default\" principle without forcing callers to thread events through\n * handlers.\n *\n * Staleness guard: an event older than AMBIENT_ANCHOR_MAX_AGE_MS is ignored.\n * Timer-driven or async show() calls that don't originate from a user gesture\n * fall through to centered / sheet layout.\n */\nconst AMBIENT_ANCHOR_MAX_AGE_MS = 750\n\ninterface AmbientAnchor {\n\tevent: MouseEvent\n\tcapturedAt: number\n}\n\n/**\n * BehaviorSubject projected off three document-level event streams,\n * merged as Observables per rxjs principle 3 (every async source\n * lifted into fromEvent). Keydown activations synthesize a MouseEvent\n * at the focused element's bounding rect so the anchor path can\n * carry keyboard-triggered opens uniformly.\n *\n * The singleton subscribe has no explicit teardown — the module's\n * lifetime IS the subscription's lifetime, which is the correct\n * SUBSCRIPTION_IS_STATE shape for a document-level event sink.\n */\nconst ambientAnchor$ = new BehaviorSubject<AmbientAnchor | null>(null)\n\nif (typeof document !== 'undefined') {\n\tconst pointerdown$ = fromEvent<PointerEvent>(document, 'pointerdown', { capture: true, passive: true }).pipe(\n\t\tmap((e): AmbientAnchor => ({ event: e, capturedAt: performance.now() })),\n\t)\n\tconst click$ = fromEvent<MouseEvent>(document, 'click', { capture: true, passive: true }).pipe(\n\t\tmap((e): AmbientAnchor => ({ event: e, capturedAt: performance.now() })),\n\t)\n\tconst keydown$ = fromEvent<KeyboardEvent>(document, 'keydown', { capture: true }).pipe(\n\t\tfilter((e) => e.target instanceof Element),\n\t\tmap((e): AmbientAnchor => {\n\t\t\tconst rect = (e.target as Element).getBoundingClientRect()\n\t\t\tconst synthetic = new MouseEvent('click', {\n\t\t\t\tclientX: rect.left + rect.width / 2,\n\t\t\t\tclientY: rect.top + rect.height / 2,\n\t\t\t\tbubbles: true,\n\t\t\t})\n\t\t\treturn { event: synthetic, capturedAt: performance.now() }\n\t\t}),\n\t)\n\n\tmerge(pointerdown$, click$, keydown$).subscribe((ambient) => ambientAnchor$.next(ambient))\n}\n\nfunction ambientAnchor(): MouseEvent | undefined {\n\tconst cur = ambientAnchor$.value\n\tif (!cur) return undefined\n\tif (performance.now() - cur.capturedAt > AMBIENT_ANCHOR_MAX_AGE_MS) return undefined\n\treturn cur.event\n}\n\n\n/* ======================================================================= *\n * show *\n * ======================================================================= */\n\n/**\n * Open an overlay containing `content`. Returns a cold Observable — the\n * overlay mounts on subscribe and dismisses on unsubscribe. Emits at\n * most one value (the result from content's `close` event) then completes.\n *\n * The subscription IS the overlay lifecycle. `takeUntil(this.disconnecting)`\n * on the caller's side means the overlay auto-dismisses when the caller\n * unmounts — no handles to track, no leaks.\n *\n * **Anchored is the novel default.** When triggered by a user event, pass\n * it as `anchor` — the overlay blooms from the point of attention. Falls\n * back to centered or sheet when the viewport / content makes that the\n * better layout (see overlay.layout.ts).\n *\n * @example\n * show(MyEditor, { props: { id }, anchor: event })\n * .pipe(takeUntil(this.disconnecting))\n * .subscribe(saved => saved && this.store.persist(saved))\n */\nexport function show<T = void>(\n\tcontent: Content,\n\toptions: ShowOptions = {},\n): Observable<T | undefined> {\n\treturn defer(() => {\n\t\t// Resolve anchor + theme container at subscribe time. Anchor: caller's\n\t\t// explicit value wins, otherwise the ambient gesture fills in. Theme:\n\t\t// dispatch `schmancy-theme-where-are-you` via the discovery service so\n\t\t// the overlay mounts inside the nearest <schmancy-theme> and inherits\n\t\t// its --schmancy-* tokens (same mechanism the old $dialog used). Falls\n\t\t// back to body when no theme responds.\n\t\tconst resolvedOptions: ShowOptions = {\n\t\t\t...options,\n\t\t\tanchor: options.anchor ?? ambientAnchor(),\n\t\t}\n\t\tconst id = generateId()\n\t\tconst state = { settled: false, historyPushed: false }\n\n\t\treturn discoverComponent<HTMLElement>('schmancy-theme').pipe(\n\t\t\tswitchMap((theme) => {\n\t\t\t\tconst el = document.createElement('schmancy-overlay') as SchmancyOverlay\n\t\t\t\t;(theme ?? document.body ?? document.documentElement).appendChild(el)\n\n\t\t\t\tconst opened$ = from(\n\t\t\t\t\tel.updateComplete.then(() => el.open(content, resolvedOptions)),\n\t\t\t\t).pipe(\n\t\t\t\t\ttap(() => {\n\t\t\t\t\t\tpushEntry({\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\telement: el,\n\t\t\t\t\t\t\tlayout: el.layout,\n\t\t\t\t\t\t\tmodal: el.modal,\n\t\t\t\t\t\t\ttier: el.tier,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif (el.modal && el.parentElement) markModal(id, el)\n\n\t\t\t\t\t\tconst strategy: THistoryStrategy = resolvedOptions.historyStrategy ?? 'push'\n\t\t\t\t\t\tif (strategy === 'push') {\n\t\t\t\t\t\t\thistory.pushState({ __schmancyOverlayId: id }, '', location.href)\n\t\t\t\t\t\t\tstate.historyPushed = true\n\t\t\t\t\t\t} else if (strategy === 'replace') {\n\t\t\t\t\t\t\thistory.replaceState({ __schmancyOverlayId: id }, '', location.href)\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t)\n\n\t\t\t\t// popstate side-channel — listened only after history.pushState\n\t\t\t\t// completed inside opened$'s tap. ignoreElements keeps the merge\n\t\t\t\t// emitting only the eventual close result.\n\t\t\t\tconst popstateClose$ = fromEvent<PopStateEvent>(window, 'popstate').pipe(\n\t\t\t\t\ttake(1),\n\t\t\t\t\tfilter(() => state.historyPushed),\n\t\t\t\t\ttap(() => {\n\t\t\t\t\t\tstate.settled = true\n\t\t\t\t\t\tvoid el.close('popstate')\n\t\t\t\t\t}),\n\t\t\t\t\tignoreElements(),\n\t\t\t\t)\n\n\t\t\t\tconst closed$ = el.closed$.pipe(\n\t\t\t\t\ttake(1),\n\t\t\t\t\ttap(() => {\n\t\t\t\t\t\tstate.settled = true\n\t\t\t\t\t}),\n\t\t\t\t\tmap(({ result }) => result as T | undefined),\n\t\t\t\t)\n\n\t\t\t\treturn opened$.pipe(\n\t\t\t\t\tswitchMap(() => merge(closed$, popstateClose$).pipe(take(1))),\n\t\t\t\t\tfinalize(() => {\n\t\t\t\t\t\tif (!state.settled) void el.close('programmatic')\n\t\t\t\t\t\tunmarkModal(id)\n\t\t\t\t\t\tremoveEntry(id)\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tstate.historyPushed &&\n\t\t\t\t\t\t\t!state.settled &&\n\t\t\t\t\t\t\thistory.state?.__schmancyOverlayId === id\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\thistory.back()\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqueueMicrotask(() => el.remove())\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}),\n\t\t)\n\t})\n}\n\n/* ======================================================================= *\n * confirm / prompt sugar *\n * ======================================================================= */\n\n/**\n * Yes/no confirmation dialog. Returns a Promise that resolves with the\n * user's choice. `variant: 'danger'` flips to destructive styling and\n * `role=\"alertdialog\"`.\n */\nexport async function confirm(options: OverlayConfirmOptions = {}): Promise<boolean> {\n\t// Lazy-import the confirm body so push-only callers don't ship these\n\t// deps. The module is small; one-shot import penalty is fine.\n\tconst { SchmancyOverlayPromptBody } = await import('./overlay.confirm-body')\n\n\tconst result = await firstValueFrom(\n\t\tshow<boolean>(SchmancyOverlayPromptBody, {\n\t\t\tanchor: options.anchor,\n\t\t\tsignal: options.signal,\n\t\t\tprops: {\n\t\t\t\tmode: 'confirm',\n\t\t\t\theading: options.title,\n\t\t\t\tsubtitle: options.subtitle,\n\t\t\t\tmessage: options.message,\n\t\t\t\tconfirmText: options.confirmText ?? 'Confirm',\n\t\t\t\tcancelText: options.cancelText ?? 'Cancel',\n\t\t\t\tvariant: options.variant ?? 'default',\n\t\t\t},\n\t\t}).pipe(defaultIfEmpty(false as boolean | undefined)),\n\t)\n\treturn result === true\n}\n\n/**\n * Input prompt dialog. Returns the entered string, or `null` if the user\n * cancels or dismisses.\n */\nexport async function prompt(options: OverlayPromptOptions = {}): Promise<string | null> {\n\tconst { SchmancyOverlayPromptBody } = await import('./overlay.confirm-body')\n\n\tconst result = await firstValueFrom(\n\t\tshow<string | null>(SchmancyOverlayPromptBody, {\n\t\t\tanchor: options.anchor,\n\t\t\tsignal: options.signal,\n\t\t\tprops: {\n\t\t\t\tmode: 'prompt',\n\t\t\t\theading: options.title,\n\t\t\t\tsubtitle: options.subtitle,\n\t\t\t\tmessage: options.message,\n\t\t\t\tlabel: options.label,\n\t\t\t\tdefaultValue: options.defaultValue ?? '',\n\t\t\t\tplaceholder: options.placeholder,\n\t\t\t\tinputType: options.inputType ?? 'text',\n\t\t\t\tpattern: options.pattern,\n\t\t\t\trequired: options.required ?? false,\n\t\t\t\tconfirmText: options.confirmText ?? 'OK',\n\t\t\t\tcancelText: options.cancelText ?? 'Cancel',\n\t\t\t},\n\t\t}).pipe(defaultIfEmpty(null as string | null | undefined)),\n\t)\n\treturn typeof result === 'string' ? result : null\n}\n\n/* ======================================================================= *\n * overlayEvents *\n * ======================================================================= */\n\n/**\n * Subscribe to custom events emitted from any currently-open overlay\n * whose content matches `tagName`. Inspired by `area.on(name)` — keyed\n * by tag name (stable across HMR / lazy chunks) rather than a uid or\n * class reference.\n *\n * The returned Observable never completes on its own — the caller owns\n * teardown via `takeUntil(this.disconnecting)`. During gaps where no\n * matching overlay is open, no events are emitted; when an instance\n * mounts, events flow.\n *\n * Stacked instances of the same content merge their event streams.\n */\nexport function overlayEvents<E extends Event = CustomEvent>(\n\ttagName: string,\n\teventName: string,\n): Observable<E> {\n\treturn elementsByTag$(tagName).pipe(\n\t\tdistinctUntilChanged((a, b) => a.length === b.length && a.every((el, i) => el === b[i])),\n\t\tswitchMap((elements) =>\n\t\t\telements.length === 0 ? EMPTY : merge(...elements.map((el) => fromEvent<E>(el, eventName))),\n\t\t),\n\t\tmap((e) => e),\n\t)\n}\n\n/* ======================================================================= *\n * dismissAll *\n * ======================================================================= */\n\n/**\n * Close every currently-open overlay. LIFO order. Imperative — use for\n * app-level flows like logout or route reset.\n */\nexport function dismissAll(): void {\n\tconst stack = [...currentStack()]\n\t// LIFO: close top-of-stack first.\n\tfor (let i = stack.length - 1; i >= 0; i--) {\n\t\tconst entry = stack[i]\n\t\tconst overlay = entry.element as SchmancyOverlay\n\t\tvoid overlay.close('programmatic')\n\t}\n\tclearStack()\n}\n\n/* ======================================================================= *\n * helpers *\n * ======================================================================= */\n\nfunction generateId(): string {\n\t// 8-char base36 is enough entropy for session-scoped uniqueness.\n\treturn 'ov_' + Math.random().toString(36).slice(2, 10) + Date.now().toString(36)\n}\n\n// Re-export the close reason type for consumers who want to narrow on it.\nexport type { CloseReason }\n"],"mappings":"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"}
1
+ {"version":3,"file":"overlay.service-DU1nqh6A.cjs","names":[],"sources":["../src/overlay/overlay.stack.ts","../src/overlay/overlay.service.ts"],"sourcesContent":["import { BehaviorSubject, distinctUntilChanged, map, Observable } from 'rxjs'\nimport type { OverlayEntry } from './overlay.types'\n\n/**\n * Overlay stack — single source of truth for \"what is currently open.\"\n *\n * A module-scope BehaviorSubject matching the `schmancy` skill's\n * \"contexts at module scope; many small contexts beat one monolith\"\n * guidance. Reactive pipelines inside the overlay service and public\n * `openOverlays$` observable project off this.\n *\n * Scroll lock and the stack-aware inert manager are both derived from\n * the stack state — no separate mutable counter variables. Honors rxjs\n * SUBSCRIPTION_IS_STATE: the stack IS the state; scroll lock / inert\n * are declarative projections.\n */\n\nconst stack$$ = new BehaviorSubject<readonly OverlayEntry[]>([])\n\n/** Public read-only stream of the current stack. Emits on every push/pop. */\nexport const stack$: Observable<readonly OverlayEntry[]> = stack$$.asObservable()\n\n/** Synchronous snapshot. Use only when a component can't subscribe. */\nexport function currentStack(): readonly OverlayEntry[] {\n\treturn stack$$.value\n}\n\n/** Append an entry (top of stack). */\nexport function pushEntry(entry: OverlayEntry): void {\n\tstack$$.next([...stack$$.value, entry])\n}\n\n/** Remove by id. No-op if the id is not in the stack. */\nexport function removeEntry(id: string): void {\n\tconst current = stack$$.value\n\tconst next = current.filter((e) => e.id !== id)\n\tif (next.length !== current.length) {\n\t\tstack$$.next(next)\n\t}\n}\n\n/** Clear the entire stack. Used by dismissAll(). */\nexport function clearStack(): void {\n\tif (stack$$.value.length > 0) {\n\t\tstack$$.next([])\n\t}\n}\n\n/* ---------------- scroll lock -------------------------------------------- */\n\n/**\n * Ref-counted body scroll lock. Active whenever ANY modal-tier overlay is\n * in the stack. Popover-tier (Tier 1/2) overlays do NOT lock body scroll —\n * a menu / share card / picker shouldn't freeze the page scroll behind it\n * (that's platform UX convention).\n *\n * Subscription is idempotent — subscribing multiple times won't stack\n * effects, because it's a distinctUntilChanged boolean projection.\n *\n * Inner overlay close does NOT release the lock while an outer modal is\n * still open (this was the pre-existing bug in sheet.service.ts).\n */\nlet scrollLockActive = false\nlet previousOverflow = ''\nlet previousScrollbarGutter = ''\n\nstack$$\n\t.pipe(\n\t\tmap((s) => s.some((e) => e.modal)),\n\t\tdistinctUntilChanged(),\n\t)\n\t.subscribe((shouldLock) => {\n\t\tif (typeof document === 'undefined') return\n\n\t\tif (shouldLock && !scrollLockActive) {\n\t\t\tpreviousOverflow = document.documentElement.style.overflow\n\t\t\tpreviousScrollbarGutter = document.documentElement.style.getPropertyValue('scrollbar-gutter')\n\t\t\tdocument.documentElement.style.overflow = 'hidden'\n\t\t\tdocument.documentElement.style.setProperty('scrollbar-gutter', 'stable')\n\t\t\tscrollLockActive = true\n\t\t} else if (!shouldLock && scrollLockActive) {\n\t\t\tdocument.documentElement.style.overflow = previousOverflow\n\t\t\tif (previousScrollbarGutter) {\n\t\t\t\tdocument.documentElement.style.setProperty('scrollbar-gutter', previousScrollbarGutter)\n\t\t\t} else {\n\t\t\t\tdocument.documentElement.style.removeProperty('scrollbar-gutter')\n\t\t\t}\n\t\t\tpreviousOverflow = ''\n\t\t\tpreviousScrollbarGutter = ''\n\t\t\tscrollLockActive = false\n\t\t}\n\t})\n\n/* ---------------- stack-aware inert -------------------------------------- */\n\n/**\n * When the first modal overlay opens, mark every sibling outside the\n * overlay host subtree as `inert` so AT and keyboard focus can't reach\n * them. Restored when the last modal overlay closes.\n *\n * Note: native `<dialog>.showModal()` already inerts the rest of the\n * document automatically. We keep this as a safety net for:\n * - anchored (popover) overlays which are non-modal by design but may\n * carry `modal: true` as the escape hatch;\n * - stacked overlays where an inner modal opens above a non-modal —\n * the sibling-inert is a no-op but we still guarantee the invariant.\n *\n * Callers that don't want inert (anchored/menu overlays) skip registration\n * via `markNonModal(id)`.\n */\nconst modalIds = new Set<string>()\nconst inertedSiblings = new Set<HTMLElement>()\n\nexport function markModal(id: string, hostContainer: HTMLElement): void {\n\tmodalIds.add(id)\n\tif (modalIds.size === 1) {\n\t\tapplyInert(hostContainer)\n\t}\n}\n\nexport function unmarkModal(id: string): void {\n\tmodalIds.delete(id)\n\tif (modalIds.size === 0) {\n\t\treleaseInert()\n\t}\n}\n\nfunction applyInert(hostContainer: HTMLElement): void {\n\tconst parent = hostContainer.parentElement ?? document.body\n\tfor (let i = 0; i < parent.children.length; i++) {\n\t\tconst child = parent.children[i]\n\t\tif (child !== hostContainer && child instanceof HTMLElement && !child.inert) {\n\t\t\tchild.inert = true\n\t\t\tinertedSiblings.add(child)\n\t\t}\n\t}\n}\n\nfunction releaseInert(): void {\n\tfor (const el of inertedSiblings) {\n\t\tel.inert = false\n\t}\n\tinertedSiblings.clear()\n}\n\n/* ---------------- overlayEvents multicast helper ------------------------- */\n\n/**\n * Returns an Observable of `tagName` elements currently in the stack.\n * The overlayEvents public helper composes `fromEvent` over this stream\n * via switchMap to tap events without owning the overlay lifecycle.\n *\n * Stays alive across open/close cycles — the caller owns completion via\n * `takeUntil(this.disconnecting)`, matching the house rxjs convention.\n */\nexport function elementsByTag$(tagName: string): Observable<readonly HTMLElement[]> {\n\tconst lower = tagName.toLowerCase()\n\treturn stack$$.pipe(\n\t\tmap((entries) => {\n\t\t\tconst matches: HTMLElement[] = []\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst inner = entry.element.querySelector<HTMLElement>(lower)\n\t\t\t\tif (inner) matches.push(inner)\n\t\t\t}\n\t\t\treturn matches\n\t\t}),\n\t\tdistinctUntilChanged((a, b) => a.length === b.length && a.every((el, i) => el === b[i])),\n\t)\n}\n","import {\n\tBehaviorSubject,\n\tdefer,\n\tdefaultIfEmpty,\n\tdistinctUntilChanged,\n\tEMPTY,\n\tfilter,\n\tfinalize,\n\tfirstValueFrom,\n\tfrom,\n\tfromEvent,\n\tignoreElements,\n\tmap,\n\tmerge,\n\tObservable,\n\tswitchMap,\n\ttake,\n\ttap,\n} from 'rxjs'\nimport type { THistoryStrategy } from '../area/router.types'\nimport { discoverComponent } from '../discovery/discovery.service'\nimport { SchmancyOverlay } from './overlay.component'\nimport {\n\tclearStack,\n\tcurrentStack,\n\telementsByTag$,\n\tmarkModal,\n\tpushEntry,\n\tremoveEntry,\n\tstack$ as internalStack$,\n\tunmarkModal,\n} from './overlay.stack'\nimport type {\n\tCloseReason,\n\tOverlayConfirmOptions,\n\tContent,\n\tOverlayEntry,\n\tOverlayPromptOptions,\n\tShowOptions,\n} from './overlay.types'\n\n/**\n * Public read-only stream of the current overlay stack. Subscribe to\n * observe stack changes — e.g. to update a breadcrumb, show a \"close\n * all\" button, or gate another action while any overlay is open.\n *\n * Emits synchronously with the current snapshot on subscribe. Never\n * completes — the caller owns teardown via `takeUntil(this.disconnecting)`.\n */\nexport const openOverlays$: Observable<readonly OverlayEntry[]> = internalStack$\n\n/* ======================================================================= *\n * ambient event capture *\n * ======================================================================= *\n * Novel: callers do not need to pass `anchor: event` manually. The service\n * listens to pointerdown / click / keydown at capture phase on the document\n * and remembers the most-recent user gesture. When show() is invoked\n * synchronously (or shortly after) in response to that gesture, the remembered\n * event becomes the default anchor. This matches the \"anchored is the novel\n * default\" principle without forcing callers to thread events through\n * handlers.\n *\n * Staleness guard: an event older than AMBIENT_ANCHOR_MAX_AGE_MS is ignored.\n * Timer-driven or async show() calls that don't originate from a user gesture\n * fall through to centered / sheet layout.\n */\nconst AMBIENT_ANCHOR_MAX_AGE_MS = 750\n\ninterface AmbientAnchor {\n\tevent: MouseEvent\n\tcapturedAt: number\n}\n\n/**\n * BehaviorSubject projected off three document-level event streams,\n * merged as Observables per rxjs principle 3 (every async source\n * lifted into fromEvent). Keydown activations synthesize a MouseEvent\n * at the focused element's bounding rect so the anchor path can\n * carry keyboard-triggered opens uniformly.\n *\n * The singleton subscribe has no explicit teardown — the module's\n * lifetime IS the subscription's lifetime, which is the correct\n * SUBSCRIPTION_IS_STATE shape for a document-level event sink.\n */\nconst ambientAnchor$ = new BehaviorSubject<AmbientAnchor | null>(null)\n\nif (typeof document !== 'undefined') {\n\tconst pointerdown$ = fromEvent<PointerEvent>(document, 'pointerdown', { capture: true, passive: true }).pipe(\n\t\tmap((e): AmbientAnchor => ({ event: e, capturedAt: performance.now() })),\n\t)\n\tconst click$ = fromEvent<MouseEvent>(document, 'click', { capture: true, passive: true }).pipe(\n\t\tmap((e): AmbientAnchor => ({ event: e, capturedAt: performance.now() })),\n\t)\n\tconst keydown$ = fromEvent<KeyboardEvent>(document, 'keydown', { capture: true }).pipe(\n\t\tfilter((e) => e.target instanceof Element),\n\t\tmap((e): AmbientAnchor => {\n\t\t\tconst rect = (e.target as Element).getBoundingClientRect()\n\t\t\tconst synthetic = new MouseEvent('click', {\n\t\t\t\tclientX: rect.left + rect.width / 2,\n\t\t\t\tclientY: rect.top + rect.height / 2,\n\t\t\t\tbubbles: true,\n\t\t\t})\n\t\t\treturn { event: synthetic, capturedAt: performance.now() }\n\t\t}),\n\t)\n\n\tmerge(pointerdown$, click$, keydown$).subscribe((ambient) => ambientAnchor$.next(ambient))\n}\n\nfunction ambientAnchor(): MouseEvent | undefined {\n\tconst cur = ambientAnchor$.value\n\tif (!cur) return undefined\n\tif (performance.now() - cur.capturedAt > AMBIENT_ANCHOR_MAX_AGE_MS) return undefined\n\treturn cur.event\n}\n\n\n/* ======================================================================= *\n * show *\n * ======================================================================= */\n\n/**\n * Open an overlay containing `content`. Returns a cold Observable — the\n * overlay mounts on subscribe and dismisses on unsubscribe. Emits at\n * most one value (the result from content's `close` event) then completes.\n *\n * The subscription IS the overlay lifecycle. `takeUntil(this.disconnecting)`\n * on the caller's side means the overlay auto-dismisses when the caller\n * unmounts — no handles to track, no leaks.\n *\n * **Anchored is the novel default.** When triggered by a user event, pass\n * it as `anchor` — the overlay blooms from the point of attention. Falls\n * back to centered or sheet when the viewport / content makes that the\n * better layout (see overlay.layout.ts).\n *\n * @example\n * show(MyEditor, { props: { id }, anchor: event })\n * .pipe(takeUntil(this.disconnecting))\n * .subscribe(saved => saved && this.store.persist(saved))\n */\nexport function show<T = void>(\n\tcontent: Content,\n\toptions: ShowOptions = {},\n): Observable<T | undefined> {\n\treturn defer(() => {\n\t\t// Resolve anchor + theme container at subscribe time. Anchor: caller's\n\t\t// explicit value wins, otherwise the ambient gesture fills in. Theme:\n\t\t// dispatch `schmancy-theme-where-are-you` via the discovery service so\n\t\t// the overlay mounts inside the nearest <schmancy-theme> and inherits\n\t\t// its --schmancy-* tokens (same mechanism the old $dialog used). Falls\n\t\t// back to body when no theme responds.\n\t\tconst resolvedOptions: ShowOptions = {\n\t\t\t...options,\n\t\t\tanchor: options.anchor ?? ambientAnchor(),\n\t\t}\n\t\tconst id = generateId()\n\t\tconst state = { settled: false, historyPushed: false }\n\n\t\treturn discoverComponent<HTMLElement>('schmancy-theme').pipe(\n\t\t\tswitchMap((theme) => {\n\t\t\t\tconst el = document.createElement('schmancy-overlay') as SchmancyOverlay\n\t\t\t\t;(theme ?? document.body ?? document.documentElement).appendChild(el)\n\n\t\t\t\tconst opened$ = from(\n\t\t\t\t\tel.updateComplete.then(() => el.open(content, resolvedOptions)),\n\t\t\t\t).pipe(\n\t\t\t\t\ttap(() => {\n\t\t\t\t\t\tpushEntry({\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\telement: el,\n\t\t\t\t\t\t\tlayout: el.layout,\n\t\t\t\t\t\t\tmodal: el.modal,\n\t\t\t\t\t\t\ttier: el.tier,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif (el.modal && el.parentElement) markModal(id, el)\n\n\t\t\t\t\t\tconst strategy: THistoryStrategy = resolvedOptions.historyStrategy ?? 'push'\n\t\t\t\t\t\tif (strategy === 'push') {\n\t\t\t\t\t\t\thistory.pushState({ schmancyOverlayId: id }, '', location.href)\n\t\t\t\t\t\t\tstate.historyPushed = true\n\t\t\t\t\t\t} else if (strategy === 'replace') {\n\t\t\t\t\t\t\thistory.replaceState({ schmancyOverlayId: id }, '', location.href)\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t)\n\n\t\t\t\t// popstate side-channel — listened only after history.pushState\n\t\t\t\t// completed inside opened$'s tap. ignoreElements keeps the merge\n\t\t\t\t// emitting only the eventual close result.\n\t\t\t\tconst popstateClose$ = fromEvent<PopStateEvent>(window, 'popstate').pipe(\n\t\t\t\t\ttake(1),\n\t\t\t\t\tfilter(() => state.historyPushed),\n\t\t\t\t\ttap(() => {\n\t\t\t\t\t\tstate.settled = true\n\t\t\t\t\t\tvoid el.close('popstate')\n\t\t\t\t\t}),\n\t\t\t\t\tignoreElements(),\n\t\t\t\t)\n\n\t\t\t\tconst closed$ = el.closed$.pipe(\n\t\t\t\t\ttake(1),\n\t\t\t\t\ttap(() => {\n\t\t\t\t\t\tstate.settled = true\n\t\t\t\t\t}),\n\t\t\t\t\tmap(({ result }) => result as T | undefined),\n\t\t\t\t)\n\n\t\t\t\treturn opened$.pipe(\n\t\t\t\t\tswitchMap(() => merge(closed$, popstateClose$).pipe(take(1))),\n\t\t\t\t\tfinalize(() => {\n\t\t\t\t\t\tif (!state.settled) void el.close('programmatic')\n\t\t\t\t\t\tunmarkModal(id)\n\t\t\t\t\t\tremoveEntry(id)\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tstate.historyPushed &&\n\t\t\t\t\t\t\t!state.settled &&\n\t\t\t\t\t\t\thistory.state?.schmancyOverlayId === id\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\thistory.back()\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqueueMicrotask(() => el.remove())\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}),\n\t\t)\n\t})\n}\n\n/* ======================================================================= *\n * confirm / prompt sugar *\n * ======================================================================= */\n\n/**\n * Yes/no confirmation dialog. Returns a Promise that resolves with the\n * user's choice. `variant: 'danger'` flips to destructive styling and\n * `role=\"alertdialog\"`.\n */\nexport async function confirm(options: OverlayConfirmOptions = {}): Promise<boolean> {\n\t// Lazy-import the confirm body so push-only callers don't ship these\n\t// deps. The module is small; one-shot import penalty is fine.\n\tconst { SchmancyOverlayPromptBody } = await import('./overlay.confirm-body')\n\n\tconst result = await firstValueFrom(\n\t\tshow<boolean>(SchmancyOverlayPromptBody, {\n\t\t\tanchor: options.anchor,\n\t\t\tsignal: options.signal,\n\t\t\tprops: {\n\t\t\t\tmode: 'confirm',\n\t\t\t\theading: options.title,\n\t\t\t\tsubtitle: options.subtitle,\n\t\t\t\tmessage: options.message,\n\t\t\t\tconfirmText: options.confirmText ?? 'Confirm',\n\t\t\t\tcancelText: options.cancelText ?? 'Cancel',\n\t\t\t\tvariant: options.variant ?? 'default',\n\t\t\t},\n\t\t}).pipe(defaultIfEmpty(false as boolean | undefined)),\n\t)\n\treturn result === true\n}\n\n/**\n * Input prompt dialog. Returns the entered string, or `null` if the user\n * cancels or dismisses.\n */\nexport async function prompt(options: OverlayPromptOptions = {}): Promise<string | null> {\n\tconst { SchmancyOverlayPromptBody } = await import('./overlay.confirm-body')\n\n\tconst result = await firstValueFrom(\n\t\tshow<string | null>(SchmancyOverlayPromptBody, {\n\t\t\tanchor: options.anchor,\n\t\t\tsignal: options.signal,\n\t\t\tprops: {\n\t\t\t\tmode: 'prompt',\n\t\t\t\theading: options.title,\n\t\t\t\tsubtitle: options.subtitle,\n\t\t\t\tmessage: options.message,\n\t\t\t\tlabel: options.label,\n\t\t\t\tdefaultValue: options.defaultValue ?? '',\n\t\t\t\tplaceholder: options.placeholder,\n\t\t\t\tinputType: options.inputType ?? 'text',\n\t\t\t\tpattern: options.pattern,\n\t\t\t\trequired: options.required ?? false,\n\t\t\t\tconfirmText: options.confirmText ?? 'OK',\n\t\t\t\tcancelText: options.cancelText ?? 'Cancel',\n\t\t\t},\n\t\t}).pipe(defaultIfEmpty(null as string | null | undefined)),\n\t)\n\treturn typeof result === 'string' ? result : null\n}\n\n/* ======================================================================= *\n * overlayEvents *\n * ======================================================================= */\n\n/**\n * Subscribe to custom events emitted from any currently-open overlay\n * whose content matches `tagName`. Inspired by `area.on(name)` — keyed\n * by tag name (stable across HMR / lazy chunks) rather than a uid or\n * class reference.\n *\n * The returned Observable never completes on its own — the caller owns\n * teardown via `takeUntil(this.disconnecting)`. During gaps where no\n * matching overlay is open, no events are emitted; when an instance\n * mounts, events flow.\n *\n * Stacked instances of the same content merge their event streams.\n */\nexport function overlayEvents<E extends Event = CustomEvent>(\n\ttagName: string,\n\teventName: string,\n): Observable<E> {\n\treturn elementsByTag$(tagName).pipe(\n\t\tdistinctUntilChanged((a, b) => a.length === b.length && a.every((el, i) => el === b[i])),\n\t\tswitchMap((elements) =>\n\t\t\telements.length === 0 ? EMPTY : merge(...elements.map((el) => fromEvent<E>(el, eventName))),\n\t\t),\n\t\tmap((e) => e),\n\t)\n}\n\n/* ======================================================================= *\n * dismissAll *\n * ======================================================================= */\n\n/**\n * Close every currently-open overlay. LIFO order. Imperative — use for\n * app-level flows like logout or route reset.\n */\nexport function dismissAll(): void {\n\tconst stack = [...currentStack()]\n\t// LIFO: close top-of-stack first.\n\tfor (let i = stack.length - 1; i >= 0; i--) {\n\t\tconst entry = stack[i]\n\t\tconst overlay = entry.element as SchmancyOverlay\n\t\tvoid overlay.close('programmatic')\n\t}\n\tclearStack()\n}\n\n/* ======================================================================= *\n * helpers *\n * ======================================================================= */\n\nfunction generateId(): string {\n\t// 8-char base36 is enough entropy for session-scoped uniqueness.\n\treturn 'ov_' + Math.random().toString(36).slice(2, 10) + Date.now().toString(36)\n}\n\n// Re-export the close reason type for consumers who want to narrow on it.\nexport type { CloseReason }\n"],"mappings":"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"}
@@ -51,7 +51,7 @@ function A(t, n = {}) {
51
51
  };
52
52
  _.next([..._.value, e]), n.modal && n.parentElement && T(i, n);
53
53
  let t = r.historyStrategy ?? "push";
54
- t === "push" ? (history.pushState({ t: i }, "", location.href), a.historyPushed = !0) : t === "replace" && history.replaceState({ t: i }, "", location.href);
54
+ t === "push" ? (history.pushState({ schmancyOverlayId: i }, "", location.href), a.historyPushed = !0) : t === "replace" && history.replaceState({ schmancyOverlayId: i }, "", location.href);
55
55
  })), v = u(window, "popstate").pipe(h(1), o(() => a.historyPushed), g(() => {
56
56
  a.settled = !0, n.close("popstate");
57
57
  }), d()), y = n.closed$.pipe(h(1), g(() => {
@@ -61,13 +61,13 @@ function A(t, n = {}) {
61
61
  a.settled || n.close("programmatic"), E(i), function(e) {
62
62
  let t = _.value, n = t.filter((t) => t.id !== e);
63
63
  n.length !== t.length && _.next(n);
64
- }(i), a.historyPushed && !a.settled && history.state?.t === i && history.back(), queueMicrotask(() => n.remove());
64
+ }(i), a.historyPushed && !a.settled && history.state?.schmancyOverlayId === i && history.back(), queueMicrotask(() => n.remove());
65
65
  }));
66
66
  }));
67
67
  });
68
68
  }
69
69
  async function j(e = {}) {
70
- let { SchmancyOverlayPromptBody: t } = await import("./overlay.confirm-body-DSONXUzl.js").then((e) => e.n);
70
+ let { SchmancyOverlayPromptBody: t } = await import("./overlay.confirm-body-CPqqPNks.js").then((e) => e.n);
71
71
  return !0 === await c(A(t, {
72
72
  anchor: e.anchor,
73
73
  signal: e.signal,
@@ -83,7 +83,7 @@ async function j(e = {}) {
83
83
  }).pipe(r(!1)));
84
84
  }
85
85
  async function M(e = {}) {
86
- let { SchmancyOverlayPromptBody: t } = await import("./overlay.confirm-body-DSONXUzl.js").then((e) => e.n), n = await c(A(t, {
86
+ let { SchmancyOverlayPromptBody: t } = await import("./overlay.confirm-body-CPqqPNks.js").then((e) => e.n), n = await c(A(t, {
87
87
  anchor: e.anchor,
88
88
  signal: e.signal,
89
89
  props: {