@mhmo91/schmancy 0.9.12 → 0.9.14

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 (521) hide show
  1. package/README.md +34 -0
  2. package/custom-elements.json +236 -0
  3. package/dist/agent/flow-CaPi2G8y.js.map +1 -0
  4. package/dist/agent/schmancy.agent.js +36474 -0
  5. package/dist/agent/schmancy.agent.js.map +1 -0
  6. package/dist/agent/schmancy.manifest.json +7027 -0
  7. package/dist/agent/vendor-highlight-CHJZQQB7.js +2178 -0
  8. package/dist/agent/vendor-highlight-CHJZQQB7.js.map +1 -0
  9. package/dist/agent/vendor-jsqr-r7GNh4P3.js +10212 -0
  10. package/dist/agent/vendor-jsqr-r7GNh4P3.js.map +1 -0
  11. package/dist/agent/vendor-material-color-Be96dpGE.js +3309 -0
  12. package/dist/agent/vendor-material-color-Be96dpGE.js.map +1 -0
  13. package/dist/{animation-Bcwh107v.cjs.map → animation-CQRdLgzX.cjs.map} +1 -1
  14. package/dist/{animation-CXKSuUoE.js.map → animation-hXFClrIn.js.map} +1 -1
  15. package/dist/{area-CBjmKtN-.cjs → area-DBjAhgjP.cjs} +2 -2
  16. package/dist/area-DBjAhgjP.cjs.map +1 -0
  17. package/dist/{area-CjX0Ckh9.js → area-Dr4I9R2p.js} +23 -35
  18. package/dist/area-Dr4I9R2p.js.map +1 -0
  19. package/dist/area.cjs +1 -1
  20. package/dist/area.js +3 -2
  21. package/dist/{audio-DUVz7Ars.cjs → audio-Dvr-RBzE.cjs} +1 -1
  22. package/dist/{audio-DUVz7Ars.cjs.map → audio-Dvr-RBzE.cjs.map} +1 -1
  23. package/dist/{audio-C7TzWI8M.js → audio-ql6nvY0y.js} +1 -1
  24. package/dist/{audio-C7TzWI8M.js.map → audio-ql6nvY0y.js.map} +1 -1
  25. package/dist/audio.cjs +1 -1
  26. package/dist/audio.js +2 -2
  27. package/dist/{autocomplete-ppoaK_GD.js → autocomplete-CgWUCUU-.js} +3 -3
  28. package/dist/{autocomplete-ppoaK_GD.js.map → autocomplete-CgWUCUU-.js.map} +1 -1
  29. package/dist/{autocomplete-WQxz4VGO.cjs → autocomplete-EM0jE7X2.cjs} +1 -1
  30. package/dist/{autocomplete-WQxz4VGO.cjs.map → autocomplete-EM0jE7X2.cjs.map} +1 -1
  31. package/dist/autocomplete.cjs +1 -1
  32. package/dist/autocomplete.js +1 -1
  33. package/dist/badge.cjs +1 -1
  34. package/dist/badge.js +1 -1
  35. package/dist/{boat-C-T9RDiG.cjs → boat-BjYJI1HS.cjs} +1 -1
  36. package/dist/{boat-C-T9RDiG.cjs.map → boat-BjYJI1HS.cjs.map} +1 -1
  37. package/dist/{boat-C4JnoakD.js → boat-Dw8TmOzN.js} +4 -4
  38. package/dist/{boat-C4JnoakD.js.map → boat-Dw8TmOzN.js.map} +1 -1
  39. package/dist/boat.cjs +1 -1
  40. package/dist/boat.js +1 -1
  41. package/dist/breadcrumb.cjs +1 -1
  42. package/dist/breadcrumb.js +1 -1
  43. package/dist/{busy-BMRUS_Ns.cjs → busy-BmiumJpB.cjs} +1 -1
  44. package/dist/{busy-BMRUS_Ns.cjs.map → busy-BmiumJpB.cjs.map} +1 -1
  45. package/dist/{busy-DuV4A5PX.js → busy-D2hP3fOy.js} +1 -1
  46. package/dist/{busy-DuV4A5PX.js.map → busy-D2hP3fOy.js.map} +1 -1
  47. package/dist/busy.cjs +1 -1
  48. package/dist/busy.js +1 -1
  49. package/dist/button.cjs +1 -1
  50. package/dist/button.cjs.map +1 -1
  51. package/dist/button.js +4 -4
  52. package/dist/button.js.map +1 -1
  53. package/dist/{card-DBjGfCxi.cjs → card-BslSqOsf.cjs} +1 -1
  54. package/dist/{card-DBjGfCxi.cjs.map → card-BslSqOsf.cjs.map} +1 -1
  55. package/dist/{card-DzXRouJC.js → card-CEdgK9nb.js} +2 -2
  56. package/dist/{card-DzXRouJC.js.map → card-CEdgK9nb.js.map} +1 -1
  57. package/dist/card.cjs +1 -1
  58. package/dist/card.js +1 -1
  59. package/dist/charts.cjs +1 -1
  60. package/dist/charts.js +1 -1
  61. package/dist/{checkbox-BwuhSBDG.js → checkbox-Br84TiCs.js} +2 -2
  62. package/dist/{checkbox-BwuhSBDG.js.map → checkbox-Br84TiCs.js.map} +1 -1
  63. package/dist/{checkbox-BibOr-sJ.cjs → checkbox-DtcFMgZL.cjs} +1 -1
  64. package/dist/{checkbox-BibOr-sJ.cjs.map → checkbox-DtcFMgZL.cjs.map} +1 -1
  65. package/dist/checkbox.cjs +1 -1
  66. package/dist/checkbox.js +1 -1
  67. package/dist/{chips-DiB2BfTQ.js → chips-BNYOweGm.js} +5 -5
  68. package/dist/{chips-DiB2BfTQ.js.map → chips-BNYOweGm.js.map} +1 -1
  69. package/dist/{chips-D5QvIKt6.cjs → chips-DoCu5YQb.cjs} +1 -1
  70. package/dist/{chips-D5QvIKt6.cjs.map → chips-DoCu5YQb.cjs.map} +1 -1
  71. package/dist/chips.cjs +1 -1
  72. package/dist/chips.js +2 -2
  73. package/dist/chunk-BM5alsTp.js +18 -0
  74. package/dist/chunk-CncqDLb2.cjs +1 -0
  75. package/dist/{code-highlight-B5_zONzv.js → code-highlight-BgExKEto.js} +1 -1
  76. package/dist/{code-highlight-B5_zONzv.js.map → code-highlight-BgExKEto.js.map} +1 -1
  77. package/dist/{code-highlight-Q2x2hrWg.cjs → code-highlight-zSYcSfCz.cjs} +1 -1
  78. package/dist/{code-highlight-Q2x2hrWg.cjs.map → code-highlight-zSYcSfCz.cjs.map} +1 -1
  79. package/dist/code-highlight.cjs +1 -1
  80. package/dist/code-highlight.js +1 -1
  81. package/dist/{components-CjLqW8Jp.js → components-DjKNS9R_.js} +1 -1
  82. package/dist/{components-CjLqW8Jp.js.map → components-DjKNS9R_.js.map} +1 -1
  83. package/dist/{components-jfFxyq6z.cjs → components-TJT8-tva.cjs} +1 -1
  84. package/dist/{components-jfFxyq6z.cjs.map → components-TJT8-tva.cjs.map} +1 -1
  85. package/dist/components.cjs +1 -1
  86. package/dist/components.js +1 -1
  87. package/dist/connectivity.cjs +1 -1
  88. package/dist/connectivity.js +2 -2
  89. package/dist/content-drawer.cjs +1 -1
  90. package/dist/content-drawer.js +1 -1
  91. package/dist/context-CAYQh-mx.cjs +1 -0
  92. package/dist/{context-BRtGc7PP.cjs.map → context-CAYQh-mx.cjs.map} +1 -1
  93. package/dist/context-D8Q66KPe.js +3 -0
  94. package/dist/{context-DgD3c6q-.js.map → context-D8Q66KPe.js.map} +1 -1
  95. package/dist/{cursor-glow-C2YRrB8Z.js → cursor-glow-BydlDInj.js} +1 -1
  96. package/dist/{cursor-glow-C2YRrB8Z.js.map → cursor-glow-BydlDInj.js.map} +1 -1
  97. package/dist/{cursor-glow-82y5h3E4.cjs → cursor-glow-Duw9jHmh.cjs} +1 -1
  98. package/dist/{cursor-glow-82y5h3E4.cjs.map → cursor-glow-Duw9jHmh.cjs.map} +1 -1
  99. package/dist/{date-range-DF5ROfrb.cjs → date-range-CIWYm3eS.cjs} +1 -1
  100. package/dist/{date-range-DF5ROfrb.cjs.map → date-range-CIWYm3eS.cjs.map} +1 -1
  101. package/dist/{date-range-inline-LLC3Y0mi.cjs → date-range-inline-B9Dp2z6C.cjs} +1 -1
  102. package/dist/{date-range-inline-LLC3Y0mi.cjs.map → date-range-inline-B9Dp2z6C.cjs.map} +1 -1
  103. package/dist/{date-range-inline-B_g1YXu3.js.map → date-range-inline-CpKG6qt2.js.map} +1 -1
  104. package/dist/date-range-inline.cjs +1 -1
  105. package/dist/date-range-inline.js +1 -1
  106. package/dist/{date-range-Dcy8GSov.js → date-range-sGkC0KF3.js} +4 -4
  107. package/dist/{date-range-Dcy8GSov.js.map → date-range-sGkC0KF3.js.map} +1 -1
  108. package/dist/date-range.cjs +1 -1
  109. package/dist/date-range.js +1 -1
  110. package/dist/{delay-aQRihOO4.cjs → delay-Bu4WMQlV.cjs} +1 -1
  111. package/dist/{delay-aQRihOO4.cjs.map → delay-Bu4WMQlV.cjs.map} +1 -1
  112. package/dist/{delay-B7TvigGw.js → delay-DwX65fSc.js} +4 -4
  113. package/dist/{delay-B7TvigGw.js.map → delay-DwX65fSc.js.map} +1 -1
  114. package/dist/delay.cjs +1 -1
  115. package/dist/delay.js +1 -1
  116. package/dist/{details-Cs8yStsJ.cjs → details-B8p62xmR.cjs} +1 -1
  117. package/dist/{details-Cs8yStsJ.cjs.map → details-B8p62xmR.cjs.map} +1 -1
  118. package/dist/{details-DfYDNHuv.js → details-CCW52lzz.js} +5 -5
  119. package/dist/{details-DfYDNHuv.js.map → details-CCW52lzz.js.map} +1 -1
  120. package/dist/details.cjs +1 -1
  121. package/dist/details.js +1 -1
  122. package/dist/{dialog-service-DXLGSshF.cjs → dialog-service-CzDO08Gy.cjs} +1 -1
  123. package/dist/{dialog-service-DXLGSshF.cjs.map → dialog-service-CzDO08Gy.cjs.map} +1 -1
  124. package/dist/{dialog-service-CCFGpU7a.js → dialog-service-DH-tjPuE.js} +2 -2
  125. package/dist/{dialog-service-CCFGpU7a.js.map → dialog-service-DH-tjPuE.js.map} +1 -1
  126. package/dist/dialog.cjs +1 -1
  127. package/dist/dialog.cjs.map +1 -1
  128. package/dist/dialog.js +5 -5
  129. package/dist/directives.cjs +1 -1
  130. package/dist/directives.cjs.map +1 -1
  131. package/dist/directives.js +5 -5
  132. package/dist/directives.js.map +1 -1
  133. package/dist/discovery.cjs +1 -1
  134. package/dist/{divider-DE9pcMw3.js → divider-CbEWg3G_.js} +1 -1
  135. package/dist/{divider-DE9pcMw3.js.map → divider-CbEWg3G_.js.map} +1 -1
  136. package/dist/{divider-DY4ocl-Z.cjs → divider-JyyFw_3J.cjs} +1 -1
  137. package/dist/{divider-DY4ocl-Z.cjs.map → divider-JyyFw_3J.cjs.map} +1 -1
  138. package/dist/divider.cjs +1 -1
  139. package/dist/divider.js +1 -1
  140. package/dist/dropdown.cjs +1 -1
  141. package/dist/dropdown.js +2 -2
  142. package/dist/{expand-Cuu9u0j5.cjs → expand-BmwIPNjq.cjs} +1 -1
  143. package/dist/{expand-Cuu9u0j5.cjs.map → expand-BmwIPNjq.cjs.map} +1 -1
  144. package/dist/{expand-Cwis2Y6U.js → expand-bFa_qVDT.js} +4 -4
  145. package/dist/{expand-Cwis2Y6U.js.map → expand-bFa_qVDT.js.map} +1 -1
  146. package/dist/expand.cjs +1 -1
  147. package/dist/expand.js +1 -1
  148. package/dist/{extra-DRIgrdHx.cjs → extra-BUgyMgjl.cjs} +1 -1
  149. package/dist/{extra-DRIgrdHx.cjs.map → extra-BUgyMgjl.cjs.map} +1 -1
  150. package/dist/{extra-DoxLBpZ-.js → extra-HwbaUnCD.js} +1 -1
  151. package/dist/{extra-DoxLBpZ-.js.map → extra-HwbaUnCD.js.map} +1 -1
  152. package/dist/extra.cjs +1 -1
  153. package/dist/extra.js +1 -1
  154. package/dist/float-BQwhfibw.cjs +1 -0
  155. package/dist/{float-I4wePTk7.cjs.map → float-BQwhfibw.cjs.map} +1 -1
  156. package/dist/{float-2aPqW2lz.js → float-D5ezUurt.js} +1 -1
  157. package/dist/{float-2aPqW2lz.js.map → float-D5ezUurt.js.map} +1 -1
  158. package/dist/float.cjs +1 -1
  159. package/dist/float.js +1 -1
  160. package/dist/flow-BGkHnOnd.js +386 -0
  161. package/dist/{flow-BPDtbhLe.js.map → flow-BGkHnOnd.js.map} +1 -1
  162. package/dist/{flow-Dn9AZktE.cjs.map → flow-ClAJ6Qby.cjs.map} +1 -1
  163. package/dist/{form-C1qS9uvS.js.map → form-rCZqoAoK.js.map} +1 -1
  164. package/dist/{form-CzD0JLxM.cjs → form-wI58M85H.cjs} +1 -1
  165. package/dist/{form-CzD0JLxM.cjs.map → form-wI58M85H.cjs.map} +1 -1
  166. package/dist/form.cjs +1 -1
  167. package/dist/form.js +1 -1
  168. package/dist/{hashContent-BUqULUiZ.js.map → hashContent-B2IntJQf.js.map} +1 -1
  169. package/dist/{hashContent-CI39BY-_.cjs.map → hashContent-CahnEuut.cjs.map} +1 -1
  170. package/dist/{icons-UOqapID2.cjs → icons-B6V3nZ4-.cjs} +1 -1
  171. package/dist/{icons-UOqapID2.cjs.map → icons-B6V3nZ4-.cjs.map} +1 -1
  172. package/dist/{icons-DDQBxhDC.js → icons-C5-DIjet.js} +2 -2
  173. package/dist/{icons-DDQBxhDC.js.map → icons-C5-DIjet.js.map} +1 -1
  174. package/dist/icons.cjs +1 -1
  175. package/dist/icons.js +1 -1
  176. package/dist/{iframe-CMTUyiz1.js → iframe-BXBsuLwt.js} +1 -1
  177. package/dist/{iframe-CMTUyiz1.js.map → iframe-BXBsuLwt.js.map} +1 -1
  178. package/dist/{iframe-FZCULDVM.cjs → iframe-C7sHg7RC.cjs} +1 -1
  179. package/dist/{iframe-FZCULDVM.cjs.map → iframe-C7sHg7RC.cjs.map} +1 -1
  180. package/dist/iframe.cjs +1 -1
  181. package/dist/iframe.js +1 -1
  182. package/dist/index.cjs +1 -1
  183. package/dist/index.js +53 -52
  184. package/dist/{input-DIuyi3Gm.cjs → input-BGNZlfL8.cjs} +1 -1
  185. package/dist/{input-DIuyi3Gm.cjs.map → input-BGNZlfL8.cjs.map} +1 -1
  186. package/dist/{input-HzweUBSn.js → input-Bc3bVISm.js} +1 -1
  187. package/dist/{input-HzweUBSn.js.map → input-Bc3bVISm.js.map} +1 -1
  188. package/dist/{input-chip-Bt2Lzi-2.js → input-chip-CiG61y-N.js} +1 -1
  189. package/dist/{input-chip-Bt2Lzi-2.js.map → input-chip-CiG61y-N.js.map} +1 -1
  190. package/dist/{input-chip-nghCxe9L.cjs → input-chip-p24lkYtY.cjs} +1 -1
  191. package/dist/{input-chip-nghCxe9L.cjs.map → input-chip-p24lkYtY.cjs.map} +1 -1
  192. package/dist/input.cjs +1 -1
  193. package/dist/input.js +1 -1
  194. package/dist/{intersection-C0JuW_7U.js.map → intersection-BrXp4YTO.js.map} +1 -1
  195. package/dist/{intersection-MvbRovUz.cjs → intersection-DqBqnpgh.cjs} +1 -1
  196. package/dist/{intersection-MvbRovUz.cjs.map → intersection-DqBqnpgh.cjs.map} +1 -1
  197. package/dist/json.cjs +1 -1
  198. package/dist/json.js +2 -2
  199. package/dist/kbd.cjs +1 -1
  200. package/dist/kbd.js +1 -1
  201. package/dist/{layout-DHt4hK1n.cjs → layout-B0_IXfov.cjs} +1 -1
  202. package/dist/{layout-DHt4hK1n.cjs.map → layout-B0_IXfov.cjs.map} +1 -1
  203. package/dist/{layout-PZCF3kwl.cjs → layout-CTfRXQoz.cjs} +1 -1
  204. package/dist/{layout-PZCF3kwl.cjs.map → layout-CTfRXQoz.cjs.map} +1 -1
  205. package/dist/{layout-BUq6VVj0.js → layout-Cqghi_rx.js} +2 -2
  206. package/dist/{layout-BUq6VVj0.js.map → layout-Cqghi_rx.js.map} +1 -1
  207. package/dist/{layout-BE2ld1IY.js → layout-fjM1DWlF.js} +1 -1
  208. package/dist/{layout-BE2ld1IY.js.map → layout-fjM1DWlF.js.map} +1 -1
  209. package/dist/layout.cjs +1 -1
  210. package/dist/layout.js +2 -2
  211. package/dist/lazy-BDNnH_r7.cjs +1 -0
  212. package/dist/lazy-BDNnH_r7.cjs.map +1 -0
  213. package/dist/lazy-D6R5N5v4.js +13 -0
  214. package/dist/lazy-D6R5N5v4.js.map +1 -0
  215. package/dist/{lightbox-CbAbyhzE.cjs → lightbox-BWKTzA03.cjs} +1 -1
  216. package/dist/{lightbox-CbAbyhzE.cjs.map → lightbox-BWKTzA03.cjs.map} +1 -1
  217. package/dist/{lightbox-p_uYC9Hy.js → lightbox-CnCTvqSu.js} +3 -3
  218. package/dist/{lightbox-p_uYC9Hy.js.map → lightbox-CnCTvqSu.js.map} +1 -1
  219. package/dist/lightbox.cjs +1 -1
  220. package/dist/lightbox.js +1 -1
  221. package/dist/{list-DG1shv4_.js → list-BpjKUOzM.js} +2 -2
  222. package/dist/{list-DG1shv4_.js.map → list-BpjKUOzM.js.map} +1 -1
  223. package/dist/{list-pvbKwpnz.cjs → list-CMWHu6cV.cjs} +1 -1
  224. package/dist/{list-pvbKwpnz.cjs.map → list-CMWHu6cV.cjs.map} +1 -1
  225. package/dist/list.cjs +1 -1
  226. package/dist/list.js +1 -1
  227. package/dist/{litElement.mixin-BLb2kIHg.js → litElement.mixin-BnNYZ24e.js} +1 -1
  228. package/dist/{litElement.mixin-BLb2kIHg.js.map → litElement.mixin-BnNYZ24e.js.map} +1 -1
  229. package/dist/{litElement.mixin-Bx9Avv0M.cjs → litElement.mixin-CtQOmwq6.cjs} +1 -1
  230. package/dist/{litElement.mixin-Bx9Avv0M.cjs.map → litElement.mixin-CtQOmwq6.cjs.map} +1 -1
  231. package/dist/{magnetic-Dj52WplI.js → magnetic-BhXebqF3.js} +2 -2
  232. package/dist/{magnetic-Dj52WplI.js.map → magnetic-BhXebqF3.js.map} +1 -1
  233. package/dist/{magnetic-aBBnj_vk.cjs → magnetic-CVXEkYTA.cjs} +1 -1
  234. package/dist/{magnetic-aBBnj_vk.cjs.map → magnetic-CVXEkYTA.cjs.map} +1 -1
  235. package/dist/{mailbox-BCRplIro.js → mailbox-CHIpxS3W.js} +5 -5
  236. package/dist/{mailbox-BCRplIro.js.map → mailbox-CHIpxS3W.js.map} +1 -1
  237. package/dist/{mailbox-CZevIxwZ.cjs → mailbox-Tg1CROVz.cjs} +1 -1
  238. package/dist/{mailbox-CZevIxwZ.cjs.map → mailbox-Tg1CROVz.cjs.map} +1 -1
  239. package/dist/mailbox.cjs +1 -1
  240. package/dist/mailbox.js +1 -1
  241. package/dist/{map-BUcxWqBH.js → map-YY1Q4FWO.js} +1 -1
  242. package/dist/{map-BUcxWqBH.js.map → map-YY1Q4FWO.js.map} +1 -1
  243. package/dist/{map-C6kDkAju.cjs → map-Z_dsu-dv.cjs} +1 -1
  244. package/dist/{map-C6kDkAju.cjs.map → map-Z_dsu-dv.cjs.map} +1 -1
  245. package/dist/map.cjs +1 -1
  246. package/dist/map.js +1 -1
  247. package/dist/{menu-BleltblR.js → menu-BIBUgS1T.js} +2 -2
  248. package/dist/{menu-BleltblR.js.map → menu-BIBUgS1T.js.map} +1 -1
  249. package/dist/{menu-DhmDz_js.cjs → menu-DS8Iz4fJ.cjs} +1 -1
  250. package/dist/{menu-DhmDz_js.cjs.map → menu-DS8Iz4fJ.cjs.map} +1 -1
  251. package/dist/menu.cjs +1 -1
  252. package/dist/menu.js +1 -1
  253. package/dist/mixins.cjs +1 -1
  254. package/dist/mixins.js +2 -2
  255. package/dist/nav-drawer.cjs +1 -1
  256. package/dist/nav-drawer.js +1 -1
  257. package/dist/navigation-bar.cjs +1 -1
  258. package/dist/navigation-bar.js +1 -1
  259. package/dist/navigation-rail.cjs +1 -1
  260. package/dist/navigation-rail.js +1 -1
  261. package/dist/{notification-DvrozLTu.js → notification-ChAvNXf3.js} +3 -3
  262. package/dist/notification-ChAvNXf3.js.map +1 -0
  263. package/dist/{notification-BT84PlwC.cjs → notification-DPUkuifB.cjs} +1 -1
  264. package/dist/notification-DPUkuifB.cjs.map +1 -0
  265. package/dist/notification.cjs +1 -1
  266. package/dist/notification.js +1 -1
  267. package/dist/{option-EEYkHd44.js → option-Ci7C8xxh.js} +1 -1
  268. package/dist/{option-EEYkHd44.js.map → option-Ci7C8xxh.js.map} +1 -1
  269. package/dist/{option-y5FY8sz-.cjs → option-OIp0joyN.cjs} +1 -1
  270. package/dist/{option-y5FY8sz-.cjs.map → option-OIp0joyN.cjs.map} +1 -1
  271. package/dist/option.cjs +1 -1
  272. package/dist/option.js +1 -1
  273. package/dist/{overlay-stack-J_eJCUTX.cjs.map → overlay-stack-7bs4ZNnh.cjs.map} +1 -1
  274. package/dist/{overlay-stack-BJt_r6aZ.js.map → overlay-stack-DXPYHPhk.js.map} +1 -1
  275. package/dist/overlay.cjs +130 -0
  276. package/dist/overlay.cjs.map +1 -0
  277. package/dist/overlay.js +570 -0
  278. package/dist/overlay.js.map +1 -0
  279. package/dist/page.cjs +1 -1
  280. package/dist/page.cjs.map +1 -1
  281. package/dist/page.js +4 -4
  282. package/dist/{progress-B1if5cWu.cjs → progress-32Cad1NX.cjs} +1 -1
  283. package/dist/{progress-B1if5cWu.cjs.map → progress-32Cad1NX.cjs.map} +1 -1
  284. package/dist/{progress-B8nfhvrc.js → progress-DGkwPgDX.js} +1 -1
  285. package/dist/{progress-B8nfhvrc.js.map → progress-DGkwPgDX.js.map} +1 -1
  286. package/dist/progress.cjs +1 -1
  287. package/dist/progress.js +1 -1
  288. package/dist/{provide-BEMtticm.js → provide-BuzyBLGj.js} +1 -1
  289. package/dist/{provide-BEMtticm.js.map → provide-BuzyBLGj.js.map} +1 -1
  290. package/dist/{provide-BbFbvIEk.cjs → provide-MvHcXKzT.cjs} +1 -1
  291. package/dist/{provide-BbFbvIEk.cjs.map → provide-MvHcXKzT.cjs.map} +1 -1
  292. package/dist/qr-scanner.cjs +1 -1
  293. package/dist/qr-scanner.js +1 -1
  294. package/dist/{radio-group-DKXbC-jL.js → radio-group-B72sYGnS.js} +1 -1
  295. package/dist/{radio-group-DKXbC-jL.js.map → radio-group-B72sYGnS.js.map} +1 -1
  296. package/dist/{radio-group-DafTK0PB.cjs → radio-group-B7DuNxUq.cjs} +1 -1
  297. package/dist/{radio-group-DafTK0PB.cjs.map → radio-group-B7DuNxUq.cjs.map} +1 -1
  298. package/dist/radio-group.cjs +1 -1
  299. package/dist/radio-group.js +1 -1
  300. package/dist/range.cjs +1 -1
  301. package/dist/range.js +1 -1
  302. package/dist/{reduced-motion-DR32yKEO.cjs → reduced-motion-9RjNnhIg.cjs} +1 -1
  303. package/dist/{reduced-motion-DR32yKEO.cjs.map → reduced-motion-9RjNnhIg.cjs.map} +1 -1
  304. package/dist/{reduced-motion-B83yZbcO.js.map → reduced-motion-BZTLqAyl.js.map} +1 -1
  305. package/dist/{rxjs-utils-CN9fv8Xq.js → rxjs-utils-CKTnEKUH.js} +1 -1
  306. package/dist/{rxjs-utils-CN9fv8Xq.js.map → rxjs-utils-CKTnEKUH.js.map} +1 -1
  307. package/dist/{rxjs-utils-Vn6DCKgL.cjs → rxjs-utils-DJbZRjp3.cjs} +1 -1
  308. package/dist/{rxjs-utils-Vn6DCKgL.cjs.map → rxjs-utils-DJbZRjp3.cjs.map} +1 -1
  309. package/dist/rxjs-utils.cjs +1 -1
  310. package/dist/rxjs-utils.js +1 -1
  311. package/dist/{scroll-pdsp_9bT.js → scroll-CdmXRXh2.js} +1 -1
  312. package/dist/{scroll-pdsp_9bT.js.map → scroll-CdmXRXh2.js.map} +1 -1
  313. package/dist/{scroll-C6Hub5gG.cjs → scroll-V1rAZ9fK.cjs} +1 -1
  314. package/dist/{scroll-C6Hub5gG.cjs.map → scroll-V1rAZ9fK.cjs.map} +1 -1
  315. package/dist/{search-BlGJ6uJv.js.map → search-CvUZRLF1.js.map} +1 -1
  316. package/dist/{search-C8eAOzBm.cjs.map → search-CwMav5QB.cjs.map} +1 -1
  317. package/dist/{select-Zg9UqtCA.cjs → select-DFxoBgEf.cjs} +1 -1
  318. package/dist/{select-Zg9UqtCA.cjs.map → select-DFxoBgEf.cjs.map} +1 -1
  319. package/dist/{select-_Qkleofb.js → select-wFDKDLQI.js} +2 -2
  320. package/dist/{select-_Qkleofb.js.map → select-wFDKDLQI.js.map} +1 -1
  321. package/dist/select.cjs +1 -1
  322. package/dist/select.js +1 -1
  323. package/dist/{sheet-7LWVKgW9.cjs → sheet-DdlZhnDG.cjs} +2 -2
  324. package/dist/{sheet-7LWVKgW9.cjs.map → sheet-DdlZhnDG.cjs.map} +1 -1
  325. package/dist/{sheet-N9TET_t_.js → sheet-LFVo5iN4.js} +4 -4
  326. package/dist/{sheet-N9TET_t_.js.map → sheet-LFVo5iN4.js.map} +1 -1
  327. package/dist/sheet.cjs +1 -1
  328. package/dist/sheet.js +2 -2
  329. package/dist/{sheet.service-P2CkJW86.cjs → sheet.service-BfNDB0K0.cjs} +1 -1
  330. package/dist/{sheet.service-P2CkJW86.cjs.map → sheet.service-BfNDB0K0.cjs.map} +1 -1
  331. package/dist/{sheet.service-DCe4FOkQ.js → sheet.service-DQE7-_wq.js} +3 -3
  332. package/dist/{sheet.service-DCe4FOkQ.js.map → sheet.service-DQE7-_wq.js.map} +1 -1
  333. package/dist/skeleton.cjs +1 -1
  334. package/dist/skeleton.js +1 -1
  335. package/dist/skills/INDEX.md +1 -1
  336. package/dist/skills/overlay.md +200 -0
  337. package/dist/skills/schmancy/INDEX.md +1 -1
  338. package/dist/skills/schmancy/overlay.md +200 -0
  339. package/dist/slider.cjs +1 -1
  340. package/dist/slider.js +1 -1
  341. package/dist/{sound.service-BjSoGjmT.cjs → sound.service-BEN6Xjy_.cjs} +1 -1
  342. package/dist/{sound.service-BjSoGjmT.cjs.map → sound.service-BEN6Xjy_.cjs.map} +1 -1
  343. package/dist/{sound.service-cdkw3Wkv.js → sound.service-DWZe6swU.js} +1 -1
  344. package/dist/{sound.service-cdkw3Wkv.js.map → sound.service-DWZe6swU.js.map} +1 -1
  345. package/dist/{splash-screen-BUKRc46i.cjs → splash-screen-C9HqX2nR.cjs} +1 -1
  346. package/dist/{splash-screen-BUKRc46i.cjs.map → splash-screen-C9HqX2nR.cjs.map} +1 -1
  347. package/dist/{splash-screen-B5Sgz7eG.js → splash-screen-COg3Z6n8.js} +1 -1
  348. package/dist/{splash-screen-B5Sgz7eG.js.map → splash-screen-COg3Z6n8.js.map} +1 -1
  349. package/dist/splash-screen.cjs +1 -1
  350. package/dist/splash-screen.js +1 -1
  351. package/dist/{src-59eVZMmI.js → src-C7niWYur.js} +51 -51
  352. package/dist/src-C7niWYur.js.map +1 -0
  353. package/dist/{src-r2bV-AFk.cjs → src-I4M33WK2.cjs} +3 -3
  354. package/dist/src-I4M33WK2.cjs.map +1 -0
  355. package/dist/steps.cjs +1 -1
  356. package/dist/steps.js +3 -3
  357. package/dist/{store-CO4nJyGj.cjs → store-CjFHCSDb.cjs} +1 -1
  358. package/dist/{store-CO4nJyGj.cjs.map → store-CjFHCSDb.cjs.map} +1 -1
  359. package/dist/{store-Bmj6rvZY.js.map → store-CjzZDQt8.js.map} +1 -1
  360. package/dist/store.cjs +1 -1
  361. package/dist/store.js +1 -1
  362. package/dist/{surface-BL6YlaS3.js → surface-0XM4DBaT.js} +2 -2
  363. package/dist/{surface-BL6YlaS3.js.map → surface-0XM4DBaT.js.map} +1 -1
  364. package/dist/{surface-B-y5Zzmz.cjs → surface-B6DA01kL.cjs} +1 -1
  365. package/dist/{surface-B-y5Zzmz.cjs.map → surface-B6DA01kL.cjs.map} +1 -1
  366. package/dist/surface.cjs +1 -1
  367. package/dist/surface.js +1 -1
  368. package/dist/{surface.mixin-CSKqQH-0.cjs → surface.mixin-DxOi-xo0.cjs} +1 -1
  369. package/dist/{surface.mixin-CSKqQH-0.cjs.map → surface.mixin-DxOi-xo0.cjs.map} +1 -1
  370. package/dist/switch.cjs +1 -1
  371. package/dist/switch.js +1 -1
  372. package/dist/{table-CzcIcVFc.cjs → table-B-DsOqzT.cjs} +2 -2
  373. package/dist/{table-CzcIcVFc.cjs.map → table-B-DsOqzT.cjs.map} +1 -1
  374. package/dist/{table-B0-Pi4G5.js → table-hBEZRxM_.js} +3 -3
  375. package/dist/{table-B0-Pi4G5.js.map → table-hBEZRxM_.js.map} +1 -1
  376. package/dist/table.cjs +1 -1
  377. package/dist/table.js +1 -1
  378. package/dist/{tabs-D-VbZiFu.js → tabs-C7r4TqcX.js} +2 -2
  379. package/dist/{tabs-D-VbZiFu.js.map → tabs-C7r4TqcX.js.map} +1 -1
  380. package/dist/{tabs-CzC8kJyY.cjs → tabs-DZaLZUBy.cjs} +1 -1
  381. package/dist/{tabs-CzC8kJyY.cjs.map → tabs-DZaLZUBy.cjs.map} +1 -1
  382. package/dist/tabs.cjs +1 -1
  383. package/dist/tabs.js +1 -1
  384. package/dist/tailwind.mixin-Bh58QnlW.cjs +2 -0
  385. package/dist/{tailwind.mixin-ZzkXQTFA.cjs.map → tailwind.mixin-Bh58QnlW.cjs.map} +1 -1
  386. package/dist/tailwind.mixin-H5Pn7vSJ.js +219 -0
  387. package/dist/{tailwind.mixin-BCz3GEpw.js.map → tailwind.mixin-H5Pn7vSJ.js.map} +1 -1
  388. package/dist/teleport.cjs +1 -1
  389. package/dist/teleport.js +1 -1
  390. package/dist/{textarea-CgB6XptL.cjs → textarea-B2544vx9.cjs} +1 -1
  391. package/dist/{textarea-CgB6XptL.cjs.map → textarea-B2544vx9.cjs.map} +1 -1
  392. package/dist/{textarea-ZopeteYQ.js → textarea-CS-KdSLz.js} +1 -1
  393. package/dist/{textarea-ZopeteYQ.js.map → textarea-CS-KdSLz.js.map} +1 -1
  394. package/dist/textarea.cjs +1 -1
  395. package/dist/textarea.js +1 -1
  396. package/dist/{theme-C7As-iVa.js → theme-Cq_c9IO3.js} +7 -7
  397. package/dist/{theme-C7As-iVa.js.map → theme-Cq_c9IO3.js.map} +1 -1
  398. package/dist/{theme-D9bRCDs9.cjs → theme-DU5yXaV-.cjs} +1 -1
  399. package/dist/{theme-D9bRCDs9.cjs.map → theme-DU5yXaV-.cjs.map} +1 -1
  400. package/dist/{theme-button-D2nMfwSr.cjs → theme-button-CPujUbgV.cjs} +1 -1
  401. package/dist/{theme-button-D2nMfwSr.cjs.map → theme-button-CPujUbgV.cjs.map} +1 -1
  402. package/dist/{theme-button-BDXtIhZC.js → theme-button-OJl2ma0u.js} +1 -1
  403. package/dist/{theme-button-BDXtIhZC.js.map → theme-button-OJl2ma0u.js.map} +1 -1
  404. package/dist/theme-button.cjs +1 -1
  405. package/dist/theme-button.js +1 -1
  406. package/dist/theme.cjs +1 -1
  407. package/dist/{theme.events-EznKK2Y0.cjs.map → theme.events-DakXxZeP.cjs.map} +1 -1
  408. package/dist/{theme.events-Bw3mYjUA.js.map → theme.events-NuihzD_p.js.map} +1 -1
  409. package/dist/{theme.interface-Cyqv5XWY.js.map → theme.interface-Buged9Cg.js.map} +1 -1
  410. package/dist/{theme.interface-CCE3L1ql.cjs.map → theme.interface-DTwkuAKJ.cjs.map} +1 -1
  411. package/dist/theme.js +5 -5
  412. package/dist/{theme.service-ETiKUwVy.cjs → theme.service-DxJPUGlu.cjs} +1 -1
  413. package/dist/{theme.service-ETiKUwVy.cjs.map → theme.service-DxJPUGlu.cjs.map} +1 -1
  414. package/dist/{theme.service-_qP5WvB9.js → theme.service-cOfPrtfe.js} +2 -2
  415. package/dist/{theme.service-_qP5WvB9.js.map → theme.service-cOfPrtfe.js.map} +1 -1
  416. package/dist/tooltip.cjs +1 -1
  417. package/dist/tree.cjs +1 -1
  418. package/dist/tree.cjs.map +1 -1
  419. package/dist/tree.js +1 -1
  420. package/dist/{tslib.es6-PMITL0Z3.cjs.map → tslib.es6-Cnt75pb6.cjs.map} +1 -1
  421. package/dist/{tslib.es6-vJQZBGJO.js.map → tslib.es6-DMzzJKHV.js.map} +1 -1
  422. package/dist/{typewriter-DaTkMEHc.js → typewriter-DyN7xa0n.js} +5 -5
  423. package/dist/{typewriter-DaTkMEHc.js.map → typewriter-DyN7xa0n.js.map} +1 -1
  424. package/dist/{typewriter-BjuFsiR3.cjs → typewriter-LK0S4NEr.cjs} +1 -1
  425. package/dist/{typewriter-BjuFsiR3.cjs.map → typewriter-LK0S4NEr.cjs.map} +1 -1
  426. package/dist/typewriter.cjs +1 -1
  427. package/dist/typewriter.js +1 -1
  428. package/dist/typography.cjs +1 -1
  429. package/dist/typography.js +1 -1
  430. package/dist/{utils-C8PD8So2.cjs → utils-2qrmPb78.cjs} +1 -1
  431. package/dist/{utils-C8PD8So2.cjs.map → utils-2qrmPb78.cjs.map} +1 -1
  432. package/dist/{utils-DVuCPDfw.js → utils-xBXLvebz.js} +3 -3
  433. package/dist/{utils-DVuCPDfw.js.map → utils-xBXLvebz.js.map} +1 -1
  434. package/dist/utils.cjs +1 -1
  435. package/dist/utils.js +5 -5
  436. package/dist/visually-hidden.cjs +1 -1
  437. package/dist/visually-hidden.js +1 -1
  438. package/dist/{window-DPSIGCUq.js → window-BWecg8Ih.js} +6 -6
  439. package/dist/{window-DPSIGCUq.js.map → window-BWecg8Ih.js.map} +1 -1
  440. package/dist/{window-DAWRoXo1.cjs → window-Cjv2GqSN.cjs} +1 -1
  441. package/dist/{window-DAWRoXo1.cjs.map → window-Cjv2GqSN.cjs.map} +1 -1
  442. package/dist/window.cjs +1 -1
  443. package/dist/window.js +1 -1
  444. package/package.json +15 -3
  445. package/skills/schmancy/INDEX.md +1 -1
  446. package/skills/schmancy/overlay.md +200 -0
  447. package/src/agent/agent-bundle.test.ts +92 -0
  448. package/src/agent/agent-entry.ts +17 -0
  449. package/src/agent/helpers.ts +161 -0
  450. package/src/agent/index.ts +1 -0
  451. package/src/agent/schmancy-skill.ts +71 -0
  452. package/src/agent/virtual-manifest.d.ts +10 -0
  453. package/src/area/area.service.ts +11 -0
  454. package/src/content-drawer/drawer.service.ts +9 -0
  455. package/src/dialog/dialog-service.ts +11 -1
  456. package/src/notification/notification-service.ts +11 -1
  457. package/src/overlay/index.ts +15 -0
  458. package/src/overlay/overlay.animations.ts +137 -0
  459. package/src/overlay/overlay.component.ts +452 -0
  460. package/src/overlay/overlay.confirm-body.ts +149 -0
  461. package/src/overlay/overlay.gestures.ts +131 -0
  462. package/src/overlay/overlay.layout.ts +76 -0
  463. package/src/overlay/overlay.service.ts +299 -0
  464. package/src/overlay/overlay.stack.ts +171 -0
  465. package/src/overlay/overlay.types.ts +146 -0
  466. package/src/sheet/sheet.service.ts +10 -0
  467. package/src/theme/theme.service.ts +11 -1
  468. package/types/src/agent/agent-bundle.test.d.ts +1 -0
  469. package/types/src/agent/agent-entry.d.ts +4 -0
  470. package/types/src/agent/helpers.d.ts +87 -0
  471. package/types/src/agent/index.d.ts +1 -0
  472. package/types/src/agent/schmancy-skill.d.ts +33 -0
  473. package/types/src/area/area.service.d.ts +11 -0
  474. package/types/src/content-drawer/drawer.service.d.ts +9 -0
  475. package/types/src/dialog/dialog-service.d.ts +11 -1
  476. package/types/src/notification/notification-service.d.ts +11 -1
  477. package/types/src/overlay/index.d.ts +5 -0
  478. package/types/src/overlay/overlay.animations.d.ts +26 -0
  479. package/types/src/overlay/overlay.component.d.ts +48 -0
  480. package/types/src/overlay/overlay.confirm-body.d.ts +42 -0
  481. package/types/src/overlay/overlay.gestures.d.ts +39 -0
  482. package/types/src/overlay/overlay.layout.d.ts +48 -0
  483. package/types/src/overlay/overlay.service.d.ts +62 -0
  484. package/types/src/overlay/overlay.stack.d.ts +25 -0
  485. package/types/src/overlay/overlay.types.d.ts +122 -0
  486. package/types/src/sheet/sheet.service.d.ts +9 -0
  487. package/types/src/theme/theme.service.d.ts +11 -0
  488. package/dist/area-CBjmKtN-.cjs.map +0 -1
  489. package/dist/area-CjX0Ckh9.js.map +0 -1
  490. package/dist/chunk-BCfY8kxB.cjs +0 -1
  491. package/dist/context-BRtGc7PP.cjs +0 -1
  492. package/dist/context-DgD3c6q-.js +0 -3
  493. package/dist/float-I4wePTk7.cjs +0 -1
  494. package/dist/notification-BT84PlwC.cjs.map +0 -1
  495. package/dist/notification-DvrozLTu.js.map +0 -1
  496. package/dist/src-59eVZMmI.js.map +0 -1
  497. package/dist/src-r2bV-AFk.cjs.map +0 -1
  498. package/dist/tailwind.mixin-BCz3GEpw.js +0 -219
  499. package/dist/tailwind.mixin-ZzkXQTFA.cjs +0 -2
  500. /package/dist/{flow-BPDtbhLe.js → agent/flow-CaPi2G8y.js} +0 -0
  501. /package/dist/{chunk-C_1VqBVD.js → agent/rolldown-runtime-DsMetpgY.js} +0 -0
  502. /package/dist/{animation-Bcwh107v.cjs → animation-CQRdLgzX.cjs} +0 -0
  503. /package/dist/{animation-CXKSuUoE.js → animation-hXFClrIn.js} +0 -0
  504. /package/dist/{date-range-inline-B_g1YXu3.js → date-range-inline-CpKG6qt2.js} +0 -0
  505. /package/dist/{flow-Dn9AZktE.cjs → flow-ClAJ6Qby.cjs} +0 -0
  506. /package/dist/{form-C1qS9uvS.js → form-rCZqoAoK.js} +0 -0
  507. /package/dist/{hashContent-BUqULUiZ.js → hashContent-B2IntJQf.js} +0 -0
  508. /package/dist/{hashContent-CI39BY-_.cjs → hashContent-CahnEuut.cjs} +0 -0
  509. /package/dist/{intersection-C0JuW_7U.js → intersection-BrXp4YTO.js} +0 -0
  510. /package/dist/{overlay-stack-J_eJCUTX.cjs → overlay-stack-7bs4ZNnh.cjs} +0 -0
  511. /package/dist/{overlay-stack-BJt_r6aZ.js → overlay-stack-DXPYHPhk.js} +0 -0
  512. /package/dist/{reduced-motion-B83yZbcO.js → reduced-motion-BZTLqAyl.js} +0 -0
  513. /package/dist/{search-BlGJ6uJv.js → search-CvUZRLF1.js} +0 -0
  514. /package/dist/{search-C8eAOzBm.cjs → search-CwMav5QB.cjs} +0 -0
  515. /package/dist/{store-Bmj6rvZY.js → store-CjzZDQt8.js} +0 -0
  516. /package/dist/{theme.events-EznKK2Y0.cjs → theme.events-DakXxZeP.cjs} +0 -0
  517. /package/dist/{theme.events-Bw3mYjUA.js → theme.events-NuihzD_p.js} +0 -0
  518. /package/dist/{theme.interface-Cyqv5XWY.js → theme.interface-Buged9Cg.js} +0 -0
  519. /package/dist/{theme.interface-CCE3L1ql.cjs → theme.interface-DTwkuAKJ.cjs} +0 -0
  520. /package/dist/{tslib.es6-PMITL0Z3.cjs → tslib.es6-Cnt75pb6.cjs} +0 -0
  521. /package/dist/{tslib.es6-vJQZBGJO.js → tslib.es6-DMzzJKHV.js} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-DPUkuifB.cjs","names":[],"sources":["../src/notification/notification.scss?inline","../src/notification/notification.ts","../src/notification/notification-service.ts","../src/notification/notify.ts"],"sourcesContent":[":host {\n\tdisplay: block;\n}\n\n.notification {\n\tposition: relative;\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 10px;\n\tpadding: 12px;\n\tpadding-right: 32px;\n\tbackground: var(--schmancy-sys-color-surface-container);\n\tborder-radius: var(--schmancy-sys-shape-corner-extraLarge, 16px);\n\tcolor: var(--schmancy-sys-color-surface-on);\n\tmax-width: 320px;\n\toverflow: hidden;\n\n\t/* Type-colored luminous glow */\n\t--notification-glow-color: var(--schmancy-sys-color-primary-default);\n\tbox-shadow: 0 4px 24px -6px color-mix(in srgb, var(--notification-glow-color) 18%, transparent);\n\tborder-left: 2px solid color-mix(in srgb, var(--notification-glow-color) 50%, transparent);\n\n\ttransition:\n\t\tbox-shadow 300ms ease,\n\t\ttransform 300ms cubic-bezier(0.34, 1.56, 0.64, 1);\n\n\t&.info { --notification-glow-color: var(--schmancy-sys-color-primary-default); }\n\t&.success { --notification-glow-color: var(--schmancy-sys-color-success-default); }\n\t&.warning { --notification-glow-color: var(--schmancy-sys-color-warning-default); }\n\t&.error { --notification-glow-color: var(--schmancy-sys-color-error-default); }\n\n\t&.hovered {\n\t\tbox-shadow: 0 8px 32px -4px color-mix(in srgb, var(--notification-glow-color) 28%, transparent);\n\t\ttransform: translateY(-2px);\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\ttransition: box-shadow 200ms ease;\n\t\t&.hovered { transform: none; }\n\t}\n}\n\n.emoji {\n\tfont-size: 20px;\n\tline-height: 1;\n\tflex-shrink: 0;\n\tmargin-top: 1px;\n}\n\n.content {\n\tflex: 1;\n\tmin-width: 0;\n}\n\n.title {\n\tfont-weight: 500;\n\tfont-size: 13px;\n\tline-height: 1.4;\n\tmargin-bottom: 2px;\n\tletter-spacing: 0.01em;\n\n\t.info & {\n\t\tcolor: var(--schmancy-sys-color-primary-default);\n\t}\n\t.success & {\n\t\tcolor: var(--schmancy-sys-color-success-default);\n\t}\n\t.warning & {\n\t\tcolor: var(--schmancy-sys-color-tertiary-default);\n\t}\n\t.error & {\n\t\tcolor: var(--schmancy-sys-color-error-default);\n\t}\n}\n\n.message {\n\tfont-size: 13px;\n\tline-height: 1.4;\n\topacity: 0.75;\n\tletter-spacing: 0.01em;\n}\n\n.close {\n\tposition: absolute;\n\ttop: 8px;\n\tright: 6px;\n\tbackground: none;\n\tborder: none;\n\tfont-size: 16px;\n\tfont-weight: 300;\n\tcolor: var(--schmancy-sys-color-surface-onVariant);\n\tcursor: pointer;\n\tpadding: 4px 6px;\n\tline-height: 1;\n\topacity: 0.4;\n\tborder-radius: var(--schmancy-sys-shape-corner-full, 50%);\n\ttransition: opacity 200ms ease;\n\n\t&:hover {\n\t\topacity: 0.8;\n\t}\n\n\t&:focus-visible {\n\t\toutline: none;\n\t\topacity: 1;\n\t\tbox-shadow:\n\t\t\t0 0 0 2px var(--schmancy-sys-color-primary-default),\n\t\t\t0 0 8px -2px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 25%, transparent);\n\t}\n}\n\n.progress {\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n}\n","import { $LitElement } from '@mixins/index'\nimport { html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { BehaviorSubject, timer, interval, NEVER } from 'rxjs'\nimport { switchMap, takeUntil, map, tap, distinctUntilChanged } from 'rxjs/operators'\nimport '../progress/progress'\nimport style from './notification.scss?inline'\n\nexport type NotificationType = 'info' | 'success' | 'warning' | 'error'\n\n/**\n * Calculate a point on an arc between two points\n */\nfunction calculateArcPoint(\n\tstart: { x: number; y: number },\n\tend: { x: number; y: number },\n\tarcDirection: 'up' | 'down' = 'up',\n\tintensity: number = 0.3,\n): { x: number; y: number } {\n\tconst midX = (start.x + end.x) / 2\n\tconst midY = (start.y + end.y) / 2\n\tconst distance = Math.sqrt(Math.pow(end.x - start.x, 2) + Math.pow(end.y - start.y, 2))\n\tconst arcHeight = Math.min(distance * intensity, 150)\n\treturn {\n\t\tx: midX,\n\t\ty: arcDirection === 'up' ? midY - arcHeight : midY + arcHeight,\n\t}\n}\n\n/**\n * @fires close - When notification is closed\n */\n@customElement('sch-notification')\nexport default class SchmancyNotification extends $LitElement(style) {\n\t@property({ type: String }) title = ''\n\t@property({ type: String }) message = ''\n\t@property({ type: String }) type: NotificationType = 'info'\n\t@property({ type: Boolean }) closable = true\n\t@property({ type: Number }) duration = 5000 // 0 means no auto-close\n\t@property({ type: String }) id = `notification-${Date.now()}-${Math.floor(Math.random() * 10000)}`\n\t@property({ type: Boolean }) playSound = true\n\t@property({ type: Boolean }) showProgress = false // Show indeterminate progress bar\n\t@property({ type: Object }) startPosition: { x: number; y: number } = { x: 0, y: 0 }\n\n\t@state() private _visible = true\n\t@state() private _progress = 100\n\t@state() private _hovered = false\n\t@state() private _closing = false\n\n\tprivate paused$ = new BehaviorSubject<boolean>(false)\n\tprivate startTime = 0\n\tprivate pausedAt = 0\n\tprivate elapsedBeforePause = 0\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Set fixed positioning for blackbird animation\n\t\tthis.style.position = 'fixed'\n\t\tthis.style.top = '16px'\n\t\tthis.style.right = '16px'\n\t\tthis.style.zIndex = '10001'\n\t\tthis.style.opacity = '0'\n\n\t\t// Animate in after first render\n\t\tthis.updateComplete.then(() => {\n\t\t\tthis.animateIn()\n\t\t})\n\n\t\tif (this.duration > 0) {\n\t\t\tthis.setupAutoClose()\n\t\t\tthis.setupProgressUpdates()\n\t\t}\n\n\t\tif (this.playSound) {\n\t\t\tthis._playSound()\n\t\t}\n\t}\n\n\tprivate async animateIn() {\n\t\t// Get the notification element's final position\n\t\tconst rect = this.getBoundingClientRect()\n\t\tconst targetX = rect.left + rect.width / 2\n\t\tconst targetY = rect.top + rect.height / 2\n\n\t\t// Calculate arc point for upward arc\n\t\tconst arcPoint = calculateArcPoint(this.startPosition, { x: targetX, y: targetY }, 'up', 0.3)\n\n\t\t// Animate from click position to final position with arc\n\t\tawait this.animate(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttransform: `translate(${this.startPosition.x - targetX}px, ${this.startPosition.y - targetY}px) scale(0.1)`,\n\t\t\t\t\topacity: 0,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttransform: `translate(${arcPoint.x - targetX}px, ${arcPoint.y - targetY}px) scale(0.6)`,\n\t\t\t\t\topacity: 0.9,\n\t\t\t\t\toffset: 0.5,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttransform: 'translate(0, 0) scale(1)',\n\t\t\t\t\topacity: 1,\n\t\t\t\t},\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration: 400,\n\t\t\t\teasing: 'cubic-bezier(0.34, 1.2, 0.64, 1)',\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t).finished\n\t}\n\n\tprivate setupAutoClose() {\n\t\tif (this.duration <= 0) return\n\n\t\tthis.startTime = Date.now()\n\t\tthis.elapsedBeforePause = 0\n\n\t\tthis.paused$\n\t\t\t.pipe(\n\t\t\t\tswitchMap(paused => {\n\t\t\t\t\tif (paused) {\n\t\t\t\t\t\tthis.pausedAt = Date.now()\n\t\t\t\t\t\tthis.elapsedBeforePause += this.pausedAt - this.startTime\n\t\t\t\t\t\treturn NEVER\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.startTime = Date.now()\n\t\t\t\t\t\tconst remaining = this.duration - this.elapsedBeforePause\n\t\t\t\t\t\tif (remaining <= 0) {\n\t\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\t\treturn NEVER\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn timer(remaining)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe(() => this.close())\n\t}\n\n\tprivate setupProgressUpdates() {\n\t\tif (this.duration <= 0) return\n\n\t\tinterval(16)\n\t\t\t.pipe(\n\t\t\t\tswitchMap(() =>\n\t\t\t\t\tthis.paused$.pipe(\n\t\t\t\t\t\tmap(paused => {\n\t\t\t\t\t\t\tif (paused) return this._progress\n\t\t\t\t\t\t\tconst elapsed = this.elapsedBeforePause + (Date.now() - this.startTime)\n\t\t\t\t\t\t\tconst remaining = Math.max(0, this.duration - elapsed)\n\t\t\t\t\t\t\treturn (remaining / this.duration) * 100\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tdistinctUntilChanged(),\n\t\t\t\ttap(progress => {\n\t\t\t\t\tthis._progress = progress\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\tprivate _playSound() {\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('playsound', {\n\t\t\t\tdetail: { type: this.type },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\tprivate _handleMouseEnter() {\n\t\tthis._hovered = true\n\t\tthis.paused$.next(true)\n\t}\n\n\tprivate _handleMouseLeave() {\n\t\tthis._hovered = false\n\t\tthis.paused$.next(false)\n\t}\n\n\tpublic async close() {\n\t\tif (this._closing) return\n\t\tthis._closing = true\n\t\tthis._visible = false\n\n\t\t// Animate out before dispatching close event\n\t\tawait this.animate(\n\t\t\t[\n\t\t\t\t{ transform: 'translate(0, 0) scale(1)', opacity: 1 },\n\t\t\t\t{ transform: 'translate(0, -20px) scale(0.8)', opacity: 0 },\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration: 200,\n\t\t\t\teasing: 'cubic-bezier(0.4, 0, 1, 1)',\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t).finished\n\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('close', {\n\t\t\t\tdetail: { id: this.id },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\tprivate _getEmoji(): string {\n\t\tswitch (this.type) {\n\t\t\tcase 'success':\n\t\t\t\treturn '\\u2705'\n\t\t\tcase 'warning':\n\t\t\t\treturn '\\u26A0\\uFE0F'\n\t\t\tcase 'error':\n\t\t\t\treturn '\\u274C'\n\t\t\tdefault:\n\t\t\t\treturn '\\u{1F4A1}'\n\t\t}\n\t}\n\n\trender() {\n\t\tif (!this._visible && this._closing) return html``\n\n\t\treturn html`\n\t\t\t<div\n\t\t\t\tclass=\"notification ${this.type} ${this._closing ? 'closing' : ''} ${this._hovered ? 'hovered' : ''}\"\n\t\t\t\trole=\"alert\"\n\t\t\t\t@mouseenter=${this._handleMouseEnter}\n\t\t\t\t@mouseleave=${this._handleMouseLeave}\n\t\t\t>\n\t\t\t\t<span class=\"emoji\">${this._getEmoji()}</span>\n\t\t\t\t<div class=\"content\">\n\t\t\t\t\t${this.title ? html`<div class=\"title\">${this.title}</div>` : ''}\n\t\t\t\t\t<div class=\"message\">${this.message}</div>\n\t\t\t\t</div>\n\t\t\t\t${this.closable\n\t\t\t\t\t? html`\n\t\t\t\t\t\t\t<button class=\"close\" aria-label=\"Close notification\" @click=${this.close}>x</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t: ''}\n\t\t\t\t${this.showProgress || this.duration > 0\n\t\t\t\t\t? html`<schmancy-progress\n\t\t\t\t\t\tclass=\"progress\"\n\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t.value=${this._progress}\n\t\t\t\t\t\t?indeterminate=${this.showProgress && this.duration === 0}\n\t\t\t\t\t></schmancy-progress>`\n\t\t\t\t\t: ''}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'sch-notification': SchmancyNotification\n\t}\n}\n","import { $sounds, type Feeling } from '../audio'\nimport SchmancyNotification, { NotificationType } from './notification'\n\nexport interface NotificationOptions {\n\tid?: string\n\ttitle?: string\n\tmessage: string\n\ttype?: NotificationType\n\tduration?: number\n\tclosable?: boolean\n\tplaySound?: boolean\n\tshowProgress?: boolean\n}\n\nconst typeToFeeling: Record<NotificationType, Feeling> = {\n\tinfo: 'curious',\n\tsuccess: 'content',\n\twarning: 'anxious',\n\terror: 'disappointed',\n}\n\n// Track last mouse position\nlet lastClickPosition = { x: window.innerWidth - 100, y: 50 }\n\n// Global mousedown listener to track click position\nif (typeof window !== 'undefined') {\n\twindow.addEventListener(\n\t\t'mousedown',\n\t\t(e: MouseEvent) => {\n\t\t\tlastClickPosition = { x: e.clientX, y: e.clientY }\n\t\t},\n\t\t{ capture: true, passive: true },\n\t)\n}\n\n// Track current notification element\nlet currentNotification: SchmancyNotification | null = null\n\n/**\n * Notification service for centralized notification management.\n * Provides a simple API for showing notifications.\n */\nexport class NotificationService {\n\tprivate static instance: NotificationService\n\tprivate notificationStack: string[] = []\n\tprivate audioVolume = 0.1\n\n\t// Default notification options\n\tprivate static DEFAULT_OPTIONS: Partial<NotificationOptions> = {\n\t\tduration: 1000, // 1 seconds - long enough to be readable\n\t\tclosable: true,\n\t\tplaySound: true,\n\t}\n\n\t// Type-specific default durations (in milliseconds)\n\tprivate static TYPE_DURATIONS: Record<NotificationType, number> = {\n\t\tsuccess: 1500, // 1.5 seconds - quick confirmation\n\t\tinfo: 2000, // 2 seconds - informational\n\t\twarning: 2500, // 2.5 seconds - needs attention\n\t\terror: 2500, // 2.5 seconds - important\n\t}\n\n\t// Private constructor for singleton pattern\n\tprivate constructor() {\n\t\t$sounds.setVolume(this.audioVolume)\n\t}\n\n\t/**\n\t * Get the singleton instance\n\t */\n\tpublic static getInstance(): NotificationService {\n\t\tif (!NotificationService.instance) {\n\t\t\tNotificationService.instance = new NotificationService()\n\t\t}\n\t\treturn NotificationService.instance\n\t}\n\n\t/**\n\t * Show a notification\n\t * @returns The ID of the created notification\n\t */\n\tpublic notify(options: NotificationOptions): string {\n\t\t// Apply default options\n\t\tconst completeOptions = {\n\t\t\t...NotificationService.DEFAULT_OPTIONS,\n\t\t\t...options,\n\t\t\t// Override with duraton from options if provided, otherwise use default\n\t\t\tduration: options.duration ?? NotificationService.DEFAULT_OPTIONS.duration,\n\t\t}\n\n\t\tconst id = completeOptions.id || `notification-${Date.now()}-${Math.floor(Math.random() * 10000)}`\n\n\t\t// Add to stack for tracking\n\t\tthis.notificationStack.push(id)\n\n\t\t// Remove existing notification if any (only 1 at a time)\n\t\tif (currentNotification) {\n\t\t\tcurrentNotification.remove()\n\t\t\tcurrentNotification = null\n\t\t}\n\n\t\t// Create the notification element directly\n\t\tconst notification = document.createElement('sch-notification') as SchmancyNotification\n\t\tnotification.id = id\n\t\tnotification.title = completeOptions.title || ''\n\t\tnotification.message = completeOptions.message\n\t\tnotification.type = completeOptions.type || 'info'\n\t\tnotification.duration = completeOptions.duration ?? 1000\n\t\tnotification.closable = completeOptions.closable !== false\n\t\tnotification.playSound = false // We handle sound here\n\t\tnotification.showProgress = completeOptions.showProgress || false\n\t\tnotification.startPosition = { ...lastClickPosition }\n\n\t\t// Play sound if enabled\n\t\tif (completeOptions.playSound !== false) {\n\t\t\t$sounds.play(typeToFeeling[notification.type])\n\t\t}\n\n\t\t// Listen for close event\n\t\tnotification.addEventListener('close', () => {\n\t\t\tconst index = this.notificationStack.indexOf(id)\n\t\t\tif (index > -1) {\n\t\t\t\tthis.notificationStack.splice(index, 1)\n\t\t\t}\n\t\t\tnotification.remove()\n\t\t\tif (currentNotification === notification) {\n\t\t\t\tcurrentNotification = null\n\t\t\t}\n\t\t})\n\n\t\t// Append to body\n\t\tdocument.body.appendChild(notification)\n\t\tcurrentNotification = notification\n\n\t\treturn id\n\t}\n\n\t/**\n\t * Dismiss a notification\n\t * @param id Optional notification ID. If not provided, dismisses the most recent notification\n\t */\n\tpublic dismiss(id?: string): void {\n\t\tlet targetId: string | undefined\n\n\t\tif (id) {\n\t\t\t// Remove specific notification from stack\n\t\t\tconst index = this.notificationStack.indexOf(id)\n\t\t\tif (index > -1) {\n\t\t\t\tthis.notificationStack.splice(index, 1)\n\t\t\t\ttargetId = id\n\t\t\t}\n\t\t} else {\n\t\t\t// Remove most recent notification (last in stack)\n\t\t\ttargetId = this.notificationStack.pop()\n\t\t}\n\n\t\tif (targetId && currentNotification && currentNotification.id === targetId) {\n\t\t\tcurrentNotification.close()\n\t\t}\n\t}\n\n\t/**\n\t * Update a notification's content\n\t */\n\tpublic update(id: string, options: Partial<NotificationOptions>): void {\n\t\tif (currentNotification && currentNotification.id === id) {\n\t\t\tif (options.title !== undefined) currentNotification.title = options.title\n\t\t\tif (options.message !== undefined) currentNotification.message = options.message\n\t\t\tif (options.type !== undefined) currentNotification.type = options.type\n\t\t}\n\t}\n\n\t/**\n\t * Show an info notification\n\t */\n\tpublic info(message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string {\n\t\treturn this.notify({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'info',\n\t\t\tduration: message ? (options.duration ?? NotificationService.TYPE_DURATIONS.info) : 1,\n\t\t\t...options,\n\t\t})\n\t}\n\n\t/**\n\t * Show a success notification\n\t */\n\tpublic success(message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string {\n\t\treturn this.notify({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'success',\n\t\t\tduration: message ? (options.duration ?? NotificationService.TYPE_DURATIONS.success) : 1,\n\t\t\t...options,\n\t\t})\n\t}\n\n\t/**\n\t * Show a warning notification\n\t */\n\tpublic warning(message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string {\n\t\treturn this.notify({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'warning',\n\t\t\tduration: message ? (options.duration ?? NotificationService.TYPE_DURATIONS.warning) : 1,\n\t\t\t...options,\n\t\t})\n\t}\n\n\t/**\n\t * Show an error notification\n\t */\n\tpublic error(message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string {\n\t\treturn this.notify({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'error',\n\t\t\tduration: message ? (options.duration ?? NotificationService.TYPE_DURATIONS.error) : 1,\n\t\t\t...options,\n\t\t})\n\t}\n\n\t/**\n\t * Show a notification with a custom duration\n\t */\n\tpublic customDuration(\n\t\tmessage: string,\n\t\tduration: number,\n\t\toptions: Partial<Omit<NotificationOptions, 'message' | 'duration'>> = {},\n\t): string {\n\t\treturn this.notify({\n\t\t\tmessage,\n\t\t\tduration,\n\t\t\t...options,\n\t\t})\n\t}\n\n\t/**\n\t * Show a persistent notification (won't auto-dismiss)\n\t */\n\tpublic persistent(message: string, options: Partial<Omit<NotificationOptions, 'message' | 'duration'>> = {}): string {\n\t\treturn this.notify({\n\t\t\tmessage,\n\t\t\tduration: 0, // Zero duration means no auto-close\n\t\t\t...options,\n\t\t})\n\t}\n}\n\n/**\n * Global notification (toast) utility. Fire-and-forget API for success,\n * error, info, and warning toasts, plus a low-level `show` for custom\n * notifications.\n *\n * @service\n * @summary Toast notifications — success, error, info, warning.\n * @method show(options: NotificationOptions) - Low-level; show any NotificationOptions.\n * @method success(message, options?) - Green success toast.\n * @method error(message, options?) - Red error toast.\n * @method info(message, options?) - Blue informational toast.\n * @method warning(message, options?) - Amber warning toast.\n */\nexport const $notify = {\n\t/**\n\t * Show a notification\n\t */\n\tshow: (options: NotificationOptions): string => {\n\t\treturn NotificationService.getInstance().notify(options)\n\t},\n\n\t/**\n\t * Show an info notification\n\t */\n\tinfo: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string => {\n\t\treturn NotificationService.getInstance().info(message, options)\n\t},\n\n\t/**\n\t * Show a success notification\n\t */\n\tsuccess: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string => {\n\t\treturn NotificationService.getInstance().success(message, options)\n\t},\n\n\t/**\n\t * Show a warning notification\n\t */\n\twarning: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string => {\n\t\treturn NotificationService.getInstance().warning(message, options)\n\t},\n\n\t/**\n\t * Show an error notification\n\t */\n\terror: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string => {\n\t\treturn NotificationService.getInstance().error(message, options)\n\t},\n\n\t/**\n\t * Show a notification with a custom duration\n\t * @param message The notification message\n\t * @param duration Duration in milliseconds before auto-dismissing (0 for no auto-dismiss)\n\t * @param options Additional notification options\n\t */\n\tcustomDuration: (\n\t\tmessage: string,\n\t\tduration: number,\n\t\toptions: Partial<Omit<NotificationOptions, 'message' | 'duration'>> = {},\n\t): string => {\n\t\treturn NotificationService.getInstance().customDuration(message, duration, options)\n\t},\n\n\t/**\n\t * Show a persistent notification that won't auto-dismiss\n\t */\n\tpersistent: (message: string, options: Partial<Omit<NotificationOptions, 'message' | 'duration'>> = {}): string => {\n\t\treturn NotificationService.getInstance().persistent(message, options)\n\t},\n\n\t/**\n\t * Dismiss a notification\n\t * @param id Optional notification ID. If not provided, dismisses the most recent notification (queue-like behavior)\n\t */\n\tdismiss: (id?: string): void => {\n\t\treturn NotificationService.getInstance().dismiss(id)\n\t},\n\n\t/**\n\t * Update a notification's content\n\t */\n\tupdate: (id: string, options: Partial<NotificationOptions>): void => {\n\t\treturn NotificationService.getInstance().update(id, options)\n\t},\n}\n\nexport default NotificationService\n","import { Observable, tap, finalize, catchError } from 'rxjs'\r\nimport { $notify, NotificationOptions } from './notification-service'\r\n\r\nexport interface NotifyOptions {\r\n\t/**\r\n\t * Message to show while the operation is in progress\r\n\t */\r\n\tloadingMessage?: string\r\n\t/**\r\n\t * Message to show when the operation completes successfully\r\n\t */\r\n\tsuccessMessage?: string\r\n\t/**\r\n\t * Message to show when the operation fails (can be a function to format error)\r\n\t */\r\n\terrorMessage?: string | ((error: any) => string)\r\n\t/**\r\n\t * Type of notification for loading state\r\n\t */\r\n\tloadingType?: NotificationOptions['type']\r\n\t/**\r\n\t * Type of notification for success state\r\n\t */\r\n\tsuccessType?: NotificationOptions['type']\r\n\t/**\r\n\t * Type of notification for error state\r\n\t */\r\n\terrorType?: NotificationOptions['type']\r\n\t/**\r\n\t * Whether to auto-dismiss the loading notification on complete/error\r\n\t */\r\n\tautoDismissLoading?: boolean\r\n\t/**\r\n\t * Duration for success notification (ms). Use 0 for persistent\r\n\t */\r\n\tsuccessDuration?: number\r\n\t/**\r\n\t * Duration for error notification (ms). Use 0 for persistent\r\n\t */\r\n\terrorDuration?: number\r\n}\r\n\r\n/**\r\n * Wraps an Observable with notification lifecycle management.\r\n * Shows a loading notification with progress indicator, then auto-dismisses and shows success/error notification.\r\n * \r\n * @example\r\n * ```typescript\r\n * // Basic usage with progress indicator\r\n * someApiCall().pipe(\r\n * notify({\r\n * loadingMessage: 'Loading data...',\r\n * successMessage: 'Data loaded successfully!',\r\n * errorMessage: 'Failed to load data'\r\n * })\r\n * ).subscribe()\r\n * \r\n * // With custom durations\r\n * saveData().pipe(\r\n * notify({\r\n * loadingMessage: 'Saving...',\r\n * successMessage: 'Saved!',\r\n * successDuration: 5000, // Success stays for 5 seconds\r\n * errorMessage: (err) => `Save failed: ${err.message}`,\r\n * errorDuration: 0 // Error is persistent until dismissed\r\n * })\r\n * ).subscribe()\r\n * \r\n * // Full configuration example\r\n * uploadFile().pipe(\r\n * notify({\r\n * loadingMessage: 'Uploading file...',\r\n * loadingType: 'info',\r\n * successMessage: 'Upload complete!',\r\n * successType: 'success',\r\n * successDuration: 3000,\r\n * errorMessage: (err) => `Upload failed: ${err.message}`,\r\n * errorType: 'error',\r\n * errorDuration: 10000,\r\n * autoDismissLoading: true\r\n * })\r\n * ).subscribe()\r\n * ```\r\n */\r\nexport function notify<T>(options: NotifyOptions) {\r\n\treturn (source: Observable<T>): Observable<T> => {\r\n\t\tlet loadingNotificationId: string | undefined\r\n\r\n\t\t// Show loading notification if message provided\r\n\t\tif (options.loadingMessage) {\r\n\t\t\tloadingNotificationId = $notify.show({\r\n\t\t\t\tmessage: options.loadingMessage,\r\n\t\t\t\ttype: options.loadingType || 'info',\r\n\t\t\t\tduration: 0, // Persistent until dismissed\r\n\t\t\t\tshowProgress: true, // Show indeterminate progress by default\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\treturn source.pipe(\r\n\t\t\ttap((value) => {\r\n\t\t\t\t// Check if the emitted value contains progress information\r\n\t\t\t\t// Common patterns: { progress: number }, { loaded: number, total: number }, etc.\r\n\t\t\t\tif (loadingNotificationId && typeof value === 'object' && value !== null) {\r\n\t\t\t\t\tlet progress: number | undefined\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Check for different progress patterns\r\n\t\t\t\t\tif ('progress' in value && typeof (value as any).progress === 'number') {\r\n\t\t\t\t\t\tprogress = (value as any).progress\r\n\t\t\t\t\t} else if ('loaded' in value && 'total' in value) {\r\n\t\t\t\t\t\tconst loaded = (value as any).loaded\r\n\t\t\t\t\t\tconst total = (value as any).total\r\n\t\t\t\t\t\tif (typeof loaded === 'number' && typeof total === 'number' && total > 0) {\r\n\t\t\t\t\t\t\tprogress = (loaded / total) * 100\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Update notification with progress if available\r\n\t\t\t\t\tif (progress !== undefined) {\r\n\t\t\t\t\t\t// We need to update the progress of the notification\r\n\t\t\t\t\t\t// For now, we'll update the message to show progress percentage\r\n\t\t\t\t\t\t$notify.update?.(loadingNotificationId, {\r\n\t\t\t\t\t\t\tmessage: `${options.loadingMessage} (${Math.round(progress)}%)`,\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// Check if this is the final success emission (not a progress update)\r\n\t\t\t\t// Typically file uploads emit progress events then a final result\r\n\t\t\t\tconst isProgressUpdate = typeof value === 'object' && value !== null && \r\n\t\t\t\t\t('progress' in value || ('loaded' in value && 'total' in value))\r\n\t\t\t\t\r\n\t\t\t\tif (!isProgressUpdate) {\r\n\t\t\t\t\t// On successful final emission, dismiss loading and show success\r\n\t\t\t\t\tif (loadingNotificationId && options.autoDismissLoading !== false) {\r\n\t\t\t\t\t\t$notify.dismiss(loadingNotificationId)\r\n\t\t\t\t\t\tloadingNotificationId = undefined\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (options.successMessage) {\r\n\t\t\t\t\t\t$notify.show({\r\n\t\t\t\t\t\t\tmessage: options.successMessage,\r\n\t\t\t\t\t\t\ttype: options.successType || 'success',\r\n\t\t\t\t\t\t\tduration: options.successDuration ?? 2000,\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}),\r\n\t\t\tcatchError((error) => {\r\n\t\t\t\t// On error, dismiss loading and show error\r\n\t\t\t\tif (loadingNotificationId && options.autoDismissLoading !== false) {\r\n\t\t\t\t\t$notify.dismiss(loadingNotificationId)\r\n\t\t\t\t\tloadingNotificationId = undefined\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (options.errorMessage) {\r\n\t\t\t\t\tconst message = typeof options.errorMessage === 'function' \r\n\t\t\t\t\t\t? options.errorMessage(error)\r\n\t\t\t\t\t\t: options.errorMessage\r\n\t\t\t\t\t\r\n\t\t\t\t\t$notify.show({\r\n\t\t\t\t\t\tmessage,\r\n\t\t\t\t\t\ttype: options.errorType || 'error',\r\n\t\t\t\t\t\tduration: options.errorDuration ?? 3000,\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Re-throw the error to maintain the error flow\r\n\t\t\t\tthrow error\r\n\t\t\t}),\r\n\t\t\tfinalize(() => {\r\n\t\t\t\t// Clean up any remaining loading notification\r\n\t\t\t\tif (loadingNotificationId && options.autoDismissLoading !== false) {\r\n\t\t\t\t\t$notify.dismiss(loadingNotificationId)\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t)\r\n\t}\r\n}\r\n\r\n/**\r\n * Simplified version for API calls that just need loading and auto-dismiss.\r\n * Perfect for fire-and-forget operations where you want to show progress.\r\n * \r\n * @example\r\n * ```typescript\r\n * downloadData().pipe(\r\n * notifyProgress('Downloading...')\r\n * ).subscribe()\r\n * \r\n * // With custom messages\r\n * saveDocument().pipe(\r\n * notifyProgress('Saving document...', 'Document saved!', 'Save failed')\r\n * ).subscribe()\r\n * ```\r\n */\r\nexport function notifyProgress<T>(\r\n\tloadingMessage: string,\r\n\tsuccessMessage?: string,\r\n\terrorMessage?: string\r\n) {\r\n\treturn notify<T>({\r\n\t\tloadingMessage,\r\n\t\tsuccessMessage: successMessage || undefined,\r\n\t\terrorMessage: errorMessage || undefined,\r\n\t\tautoDismissLoading: true,\r\n\t})\r\n}"],"mappings":"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"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./notification-BT84PlwC.cjs`);exports.$notify=e.r,exports.SchmancyNotification=e.i,exports.notify=e.t,exports.notifyProgress=e.n;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./notification-DPUkuifB.cjs`);exports.$notify=e.r,exports.SchmancyNotification=e.i,exports.notify=e.t,exports.notifyProgress=e.n;
@@ -1,2 +1,2 @@
1
- import { i as e, n as t, r as n, t as r } from "./notification-DvrozLTu.js";
1
+ import { i as e, n as t, r as n, t as r } from "./notification-ChAvNXf3.js";
2
2
  export { n as $notify, e as SchmancyNotification, r as notify, t as notifyProgress };
@@ -1,4 +1,4 @@
1
- import { t as e } from "./tailwind.mixin-BCz3GEpw.js";
1
+ import { t as e } from "./tailwind.mixin-H5Pn7vSJ.js";
2
2
  import { t } from "./decorate-D_utPUsC.js";
3
3
  import "./mixins.js";
4
4
  import { fromEvent as n, takeUntil as r } from "rxjs";
@@ -1 +1 @@
1
- {"version":3,"file":"option-EEYkHd44.js","names":[],"sources":["../src/option/option.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { fromEvent, takeUntil } from 'rxjs'\n\n/**\n * `schmancy-option` is an option element for schmancy-select and schmancy-autocomplete components.\n *\n * @fires click - When the option is clicked\n */\n@customElement('schmancy-option')\nexport default class SchmancyOption extends TailwindElement(css`\n\t:host {\n\t\tdisplay: block;\n\t\tcursor: pointer;\n\t\tuser-select: none;\n\t\toutline: none;\n\t}\n\n\t:host(:focus-visible) {\n\t\toutline: 2px solid var(--schmancy-sys-color-primary-default);\n\t\toutline-offset: -2px;\n\t}\n\n\t:host([hidden]) {\n\t\tdisplay: none;\n\t}\n\n\t:host([disabled]) {\n\t\topacity: 0.5;\n\t\tpointer-events: none;\n\t}\n`) {\n\t/**\n\t * The value of the option, will be used when selected.\n\t */\n\t@property({ type: String })\n\tvalue: string = ''\n\n\t/**\n\t * The human-readable label for the option.\n\t */\n\t@property({ type: String })\n\tlabel: string = ''\n\n\t/**\n\t * Whether the option is currently selected.\n\t */\n\t@property({ type: Boolean, reflect: true })\n\tselected: boolean = false\n\n\t/**\n\t * Whether the option is disabled.\n\t */\n\t@property({ type: Boolean, reflect: true })\n\tdisabled: boolean = false\n\n\t/**\n\t * Optional group this option belongs to (for option grouping).\n\t */\n\t@property({ type: String })\n\tgroup: string = ''\n\n\t/**\n\t * Optional icon or image to display before the label.\n\t */\n\t@property({ type: String })\n\ticon: string = ''\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Ensure the option has an ID for accessibility\n\t\tif (!this.id) {\n\t\t\tthis.id = `schmancy-option-${Math.random().toString(36).substring(2, 9)}`\n\t\t}\n\n\t\t// If no label was provided, use the text content or value\n\t\tif (!this.label) {\n\t\t\tthis.label = this.textContent?.trim() || this.value\n\t\t}\n\n\t\t// If value wasn't set but there's text content, use that as the value\n\t\tif (!this.value && this.textContent) {\n\t\t\tthis.value = this.textContent.trim()\n\t\t}\n\n\t\t// Make the option clickable\n\t\tfromEvent<MouseEvent>(this, 'click')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe((e) => {\n\t\t\t\te.stopPropagation()\n\t\t\t\tif (this.disabled) return\n\t\t\t\t// Dispatch a custom event with this option's value\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('option-select', {\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\tdetail: { value: this.value },\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t})\n\n\t\tfromEvent<KeyboardEvent>(this, 'keydown')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe((e) => {\n\t\t\t\t// Handle space and enter as clicks\n\t\t\t\tif (e.key === ' ' || e.key === 'Enter') {\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\te.stopPropagation()\n\t\t\t\t\tif (this.disabled) return\n\t\t\t\t\t// Dispatch a custom event with this option's value\n\t\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\t\tnew CustomEvent('option-select', {\n\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\t\tdetail: { value: this.value },\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t})\n\t}\n\n\tdisconnectedCallback() {\n\t\t// Event listeners are automatically cleaned up via takeUntil(this.disconnecting)\n\t\tsuper.disconnectedCallback()\n\t}\n\n\n\trender() {\n\t\tconst classes = {\n\t\t\t'py-2': true,\n\t\t\t'px-3': true,\n\t\t\trounded: true,\n\t\t\t'text-sm': true,\n\t\t\t'w-full': true,\n\t\t\tflex: true,\n\t\t\t'items-center': true,\n\t\t\t'gap-2': true,\n\t\t\t// Selected state\n\t\t\t'bg-primary-container': this.selected,\n\t\t\t'text-primary-onContainer': this.selected,\n\t\t\t// Hover state (when not selected)\n\t\t\t'hover:bg-surface-high': !this.selected,\n\t\t\t// Focus state\n\t\t\t'focus:outline-none': true,\n\t\t}\n\n\t\treturn html`\n\t\t\t<div class=${this.classMap(classes)} role=\"option\" aria-selected=${this.selected} aria-disabled=${this.disabled}>\n\t\t\t\t${this.icon ? html`<span class=\"icon\">${this.icon}</span>` : ''}\n\t\t\t\t<span class=\"flex-1\">${this.label || this.value}</span>\n\t\t\t\t${this.selected\n\t\t\t\t\t? html`\n\t\t\t\t\t\t\t<span class=\"check\">\n\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\twidth=\"16\"\n\t\t\t\t\t\t\t\t\theight=\"16\"\n\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<polyline points=\"20 6 9 17 4 12\"></polyline>\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t`\n\t\t\t\t\t: ''}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-option': SchmancyOption\n\t}\n}\n"],"mappings":";;;;;;AAWe,IAAA,IAAA,cAA6B,EAAgB,CAAG;;;;;;;;;;;;;;;;;;;;;;;4BA0B9C,IAAA,KAAA,QAMA,IAAA,KAAA,WAAA,CAMI,GAAA,KAAA,WAAA,CAMA,GAAA,KAAA,QAMJ,IAAA,KAAA,OAMD;;CAEf,oBAAA;AACC,QAAM,mBAAA,EAGD,AACJ,KAAK,OAAK,mBAAmB,KAAK,QAAA,CAAS,SAAS,GAAA,CAAI,UAAU,GAAG,EAAA,IAIjE,AACJ,KAAK,UAAQ,KAAK,aAAa,MAAA,IAAU,KAAK,OAAA,CAI1C,KAAK,SAAS,KAAK,gBACvB,KAAK,QAAQ,KAAK,YAAY,MAAA,GAI/B,EAAsB,MAAM,QAAA,CAC1B,KAAK,EAAU,KAAK,cAAA,CAAA,CACpB,WAAW,MAAA;AACX,KAAE,iBAAA,EACE,KAAK,YAET,KAAK,cACJ,IAAI,YAAY,iBAAiB;IAChC,SAAA,CAAS;IACT,UAAA,CAAU;IACV,QAAQ,EAAE,OAAO,KAAK,OAAA;IAAA,CAAA,CAAA;IAAA,EAK1B,EAAyB,MAAM,UAAA,CAC7B,KAAK,EAAU,KAAK,cAAA,CAAA,CACpB,WAAW,MAAA;AAEX,OAAI,EAAE,QAAQ,OAAO,EAAE,QAAQ,SAAS;AAGvC,QAFA,EAAE,gBAAA,EACF,EAAE,iBAAA,EACE,KAAK,SAAU;AAEnB,SAAK,cACJ,IAAI,YAAY,iBAAiB;KAChC,SAAA,CAAS;KACT,UAAA,CAAU;KACV,QAAQ,EAAE,OAAO,KAAK,OAAA;KAAA,CAAA,CAAA;;IAAA;;CAO5B,uBAAA;AAEC,QAAM,sBAAA;;CAIP,SAAA;EACC,IAAM,IAAU;GACf,QAAA,CAAQ;GACR,QAAA,CAAQ;GACR,SAAA,CAAS;GACT,WAAA,CAAW;GACX,UAAA,CAAU;GACV,MAAA,CAAM;GACN,gBAAA,CAAgB;GAChB,SAAA,CAAS;GAET,wBAAwB,KAAK;GAC7B,4BAA4B,KAAK;GAEjC,yBAAA,CAA0B,KAAK;GAE/B,sBAAA,CAAsB;GAAA;AAGvB,SAAO,CAAI;gBACG,KAAK,SAAS,EAAA,CAAA,+BAAwC,KAAK,SAAA,iBAA0B,KAAK,SAAA;MACpG,KAAK,OAAO,CAAI,sBAAsB,KAAK,KAAA,WAAgB,GAAA;2BACtC,KAAK,SAAS,KAAK,MAAA;MACxC,KAAK,WACJ,CAAI;;;;;;;;;;;;;;;UAgBJ,GAAA;;;;;GArIL,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,SAAA,KAAA,EAAA,EAAA,EAAA,CAM1B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,SAAA,KAAA,EAAA,EAAA,EAAA,CAM1B,EAAS;CAAE,MAAM;CAAS,SAAA,CAAS;CAAA,CAAA,CAAA,EAAO,EAAA,WAAA,YAAA,KAAA,EAAA,EAAA,EAAA,CAM1C,EAAS;CAAE,MAAM;CAAS,SAAA,CAAS;CAAA,CAAA,CAAA,EAAO,EAAA,WAAA,YAAA,KAAA,EAAA,EAAA,EAAA,CAM1C,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,SAAA,KAAA,EAAA,EAAA,EAAA,CAM1B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,QAAA,KAAA,EAAA,EAAA,IAAA,EAAA,CAxD3B,EAAc,kBAAA,CAAA,EAAkB,EAAA"}
1
+ {"version":3,"file":"option-Ci7C8xxh.js","names":[],"sources":["../src/option/option.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { fromEvent, takeUntil } from 'rxjs'\n\n/**\n * `schmancy-option` is an option element for schmancy-select and schmancy-autocomplete components.\n *\n * @fires click - When the option is clicked\n */\n@customElement('schmancy-option')\nexport default class SchmancyOption extends TailwindElement(css`\n\t:host {\n\t\tdisplay: block;\n\t\tcursor: pointer;\n\t\tuser-select: none;\n\t\toutline: none;\n\t}\n\n\t:host(:focus-visible) {\n\t\toutline: 2px solid var(--schmancy-sys-color-primary-default);\n\t\toutline-offset: -2px;\n\t}\n\n\t:host([hidden]) {\n\t\tdisplay: none;\n\t}\n\n\t:host([disabled]) {\n\t\topacity: 0.5;\n\t\tpointer-events: none;\n\t}\n`) {\n\t/**\n\t * The value of the option, will be used when selected.\n\t */\n\t@property({ type: String })\n\tvalue: string = ''\n\n\t/**\n\t * The human-readable label for the option.\n\t */\n\t@property({ type: String })\n\tlabel: string = ''\n\n\t/**\n\t * Whether the option is currently selected.\n\t */\n\t@property({ type: Boolean, reflect: true })\n\tselected: boolean = false\n\n\t/**\n\t * Whether the option is disabled.\n\t */\n\t@property({ type: Boolean, reflect: true })\n\tdisabled: boolean = false\n\n\t/**\n\t * Optional group this option belongs to (for option grouping).\n\t */\n\t@property({ type: String })\n\tgroup: string = ''\n\n\t/**\n\t * Optional icon or image to display before the label.\n\t */\n\t@property({ type: String })\n\ticon: string = ''\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Ensure the option has an ID for accessibility\n\t\tif (!this.id) {\n\t\t\tthis.id = `schmancy-option-${Math.random().toString(36).substring(2, 9)}`\n\t\t}\n\n\t\t// If no label was provided, use the text content or value\n\t\tif (!this.label) {\n\t\t\tthis.label = this.textContent?.trim() || this.value\n\t\t}\n\n\t\t// If value wasn't set but there's text content, use that as the value\n\t\tif (!this.value && this.textContent) {\n\t\t\tthis.value = this.textContent.trim()\n\t\t}\n\n\t\t// Make the option clickable\n\t\tfromEvent<MouseEvent>(this, 'click')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe((e) => {\n\t\t\t\te.stopPropagation()\n\t\t\t\tif (this.disabled) return\n\t\t\t\t// Dispatch a custom event with this option's value\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('option-select', {\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\tdetail: { value: this.value },\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t})\n\n\t\tfromEvent<KeyboardEvent>(this, 'keydown')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe((e) => {\n\t\t\t\t// Handle space and enter as clicks\n\t\t\t\tif (e.key === ' ' || e.key === 'Enter') {\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\te.stopPropagation()\n\t\t\t\t\tif (this.disabled) return\n\t\t\t\t\t// Dispatch a custom event with this option's value\n\t\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\t\tnew CustomEvent('option-select', {\n\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\t\tdetail: { value: this.value },\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t})\n\t}\n\n\tdisconnectedCallback() {\n\t\t// Event listeners are automatically cleaned up via takeUntil(this.disconnecting)\n\t\tsuper.disconnectedCallback()\n\t}\n\n\n\trender() {\n\t\tconst classes = {\n\t\t\t'py-2': true,\n\t\t\t'px-3': true,\n\t\t\trounded: true,\n\t\t\t'text-sm': true,\n\t\t\t'w-full': true,\n\t\t\tflex: true,\n\t\t\t'items-center': true,\n\t\t\t'gap-2': true,\n\t\t\t// Selected state\n\t\t\t'bg-primary-container': this.selected,\n\t\t\t'text-primary-onContainer': this.selected,\n\t\t\t// Hover state (when not selected)\n\t\t\t'hover:bg-surface-high': !this.selected,\n\t\t\t// Focus state\n\t\t\t'focus:outline-none': true,\n\t\t}\n\n\t\treturn html`\n\t\t\t<div class=${this.classMap(classes)} role=\"option\" aria-selected=${this.selected} aria-disabled=${this.disabled}>\n\t\t\t\t${this.icon ? html`<span class=\"icon\">${this.icon}</span>` : ''}\n\t\t\t\t<span class=\"flex-1\">${this.label || this.value}</span>\n\t\t\t\t${this.selected\n\t\t\t\t\t? html`\n\t\t\t\t\t\t\t<span class=\"check\">\n\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\twidth=\"16\"\n\t\t\t\t\t\t\t\t\theight=\"16\"\n\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<polyline points=\"20 6 9 17 4 12\"></polyline>\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t`\n\t\t\t\t\t: ''}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-option': SchmancyOption\n\t}\n}\n"],"mappings":";;;;;;AAWe,IAAA,IAAA,cAA6B,EAAgB,CAAG;;;;;;;;;;;;;;;;;;;;;;;4BA0B9C,IAAA,KAAA,QAMA,IAAA,KAAA,WAAA,CAMI,GAAA,KAAA,WAAA,CAMA,GAAA,KAAA,QAMJ,IAAA,KAAA,OAMD;;CAEf,oBAAA;AACC,QAAM,mBAAA,EAGD,AACJ,KAAK,OAAK,mBAAmB,KAAK,QAAA,CAAS,SAAS,GAAA,CAAI,UAAU,GAAG,EAAA,IAIjE,AACJ,KAAK,UAAQ,KAAK,aAAa,MAAA,IAAU,KAAK,OAAA,CAI1C,KAAK,SAAS,KAAK,gBACvB,KAAK,QAAQ,KAAK,YAAY,MAAA,GAI/B,EAAsB,MAAM,QAAA,CAC1B,KAAK,EAAU,KAAK,cAAA,CAAA,CACpB,WAAW,MAAA;AACX,KAAE,iBAAA,EACE,KAAK,YAET,KAAK,cACJ,IAAI,YAAY,iBAAiB;IAChC,SAAA,CAAS;IACT,UAAA,CAAU;IACV,QAAQ,EAAE,OAAO,KAAK,OAAA;IAAA,CAAA,CAAA;IAAA,EAK1B,EAAyB,MAAM,UAAA,CAC7B,KAAK,EAAU,KAAK,cAAA,CAAA,CACpB,WAAW,MAAA;AAEX,OAAI,EAAE,QAAQ,OAAO,EAAE,QAAQ,SAAS;AAGvC,QAFA,EAAE,gBAAA,EACF,EAAE,iBAAA,EACE,KAAK,SAAU;AAEnB,SAAK,cACJ,IAAI,YAAY,iBAAiB;KAChC,SAAA,CAAS;KACT,UAAA,CAAU;KACV,QAAQ,EAAE,OAAO,KAAK,OAAA;KAAA,CAAA,CAAA;;IAAA;;CAO5B,uBAAA;AAEC,QAAM,sBAAA;;CAIP,SAAA;EACC,IAAM,IAAU;GACf,QAAA,CAAQ;GACR,QAAA,CAAQ;GACR,SAAA,CAAS;GACT,WAAA,CAAW;GACX,UAAA,CAAU;GACV,MAAA,CAAM;GACN,gBAAA,CAAgB;GAChB,SAAA,CAAS;GAET,wBAAwB,KAAK;GAC7B,4BAA4B,KAAK;GAEjC,yBAAA,CAA0B,KAAK;GAE/B,sBAAA,CAAsB;GAAA;AAGvB,SAAO,CAAI;gBACG,KAAK,SAAS,EAAA,CAAA,+BAAwC,KAAK,SAAA,iBAA0B,KAAK,SAAA;MACpG,KAAK,OAAO,CAAI,sBAAsB,KAAK,KAAA,WAAgB,GAAA;2BACtC,KAAK,SAAS,KAAK,MAAA;MACxC,KAAK,WACJ,CAAI;;;;;;;;;;;;;;;UAgBJ,GAAA;;;;;GArIL,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,SAAA,KAAA,EAAA,EAAA,EAAA,CAM1B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,SAAA,KAAA,EAAA,EAAA,EAAA,CAM1B,EAAS;CAAE,MAAM;CAAS,SAAA,CAAS;CAAA,CAAA,CAAA,EAAO,EAAA,WAAA,YAAA,KAAA,EAAA,EAAA,EAAA,CAM1C,EAAS;CAAE,MAAM;CAAS,SAAA,CAAS;CAAA,CAAA,CAAA,EAAO,EAAA,WAAA,YAAA,KAAA,EAAA,EAAA,EAAA,CAM1C,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,SAAA,KAAA,EAAA,EAAA,EAAA,CAM1B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,QAAA,KAAA,EAAA,EAAA,IAAA,EAAA,CAxD3B,EAAc,kBAAA,CAAA,EAAkB,EAAA"}
@@ -1,4 +1,4 @@
1
- require(`./chunk-BCfY8kxB.cjs`);const e=require(`./tailwind.mixin-ZzkXQTFA.cjs`),t=require(`./decorate-F9CuyeHg.cjs`);require(`./mixins.cjs`);let n=require(`rxjs`),r=require(`lit/decorators.js`),i=require(`lit`);var a=class extends e.t(i.css`
1
+ require(`./chunk-CncqDLb2.cjs`);const e=require(`./tailwind.mixin-Bh58QnlW.cjs`),t=require(`./decorate-F9CuyeHg.cjs`);require(`./mixins.cjs`);let n=require(`rxjs`),r=require(`lit/decorators.js`),i=require(`lit`);var a=class extends e.t(i.css`
2
2
  :host {
3
3
  display: block;
4
4
  cursor: pointer;
@@ -1 +1 @@
1
- {"version":3,"file":"option-y5FY8sz-.cjs","names":[],"sources":["../src/option/option.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { fromEvent, takeUntil } from 'rxjs'\n\n/**\n * `schmancy-option` is an option element for schmancy-select and schmancy-autocomplete components.\n *\n * @fires click - When the option is clicked\n */\n@customElement('schmancy-option')\nexport default class SchmancyOption extends TailwindElement(css`\n\t:host {\n\t\tdisplay: block;\n\t\tcursor: pointer;\n\t\tuser-select: none;\n\t\toutline: none;\n\t}\n\n\t:host(:focus-visible) {\n\t\toutline: 2px solid var(--schmancy-sys-color-primary-default);\n\t\toutline-offset: -2px;\n\t}\n\n\t:host([hidden]) {\n\t\tdisplay: none;\n\t}\n\n\t:host([disabled]) {\n\t\topacity: 0.5;\n\t\tpointer-events: none;\n\t}\n`) {\n\t/**\n\t * The value of the option, will be used when selected.\n\t */\n\t@property({ type: String })\n\tvalue: string = ''\n\n\t/**\n\t * The human-readable label for the option.\n\t */\n\t@property({ type: String })\n\tlabel: string = ''\n\n\t/**\n\t * Whether the option is currently selected.\n\t */\n\t@property({ type: Boolean, reflect: true })\n\tselected: boolean = false\n\n\t/**\n\t * Whether the option is disabled.\n\t */\n\t@property({ type: Boolean, reflect: true })\n\tdisabled: boolean = false\n\n\t/**\n\t * Optional group this option belongs to (for option grouping).\n\t */\n\t@property({ type: String })\n\tgroup: string = ''\n\n\t/**\n\t * Optional icon or image to display before the label.\n\t */\n\t@property({ type: String })\n\ticon: string = ''\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Ensure the option has an ID for accessibility\n\t\tif (!this.id) {\n\t\t\tthis.id = `schmancy-option-${Math.random().toString(36).substring(2, 9)}`\n\t\t}\n\n\t\t// If no label was provided, use the text content or value\n\t\tif (!this.label) {\n\t\t\tthis.label = this.textContent?.trim() || this.value\n\t\t}\n\n\t\t// If value wasn't set but there's text content, use that as the value\n\t\tif (!this.value && this.textContent) {\n\t\t\tthis.value = this.textContent.trim()\n\t\t}\n\n\t\t// Make the option clickable\n\t\tfromEvent<MouseEvent>(this, 'click')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe((e) => {\n\t\t\t\te.stopPropagation()\n\t\t\t\tif (this.disabled) return\n\t\t\t\t// Dispatch a custom event with this option's value\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('option-select', {\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\tdetail: { value: this.value },\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t})\n\n\t\tfromEvent<KeyboardEvent>(this, 'keydown')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe((e) => {\n\t\t\t\t// Handle space and enter as clicks\n\t\t\t\tif (e.key === ' ' || e.key === 'Enter') {\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\te.stopPropagation()\n\t\t\t\t\tif (this.disabled) return\n\t\t\t\t\t// Dispatch a custom event with this option's value\n\t\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\t\tnew CustomEvent('option-select', {\n\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\t\tdetail: { value: this.value },\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t})\n\t}\n\n\tdisconnectedCallback() {\n\t\t// Event listeners are automatically cleaned up via takeUntil(this.disconnecting)\n\t\tsuper.disconnectedCallback()\n\t}\n\n\n\trender() {\n\t\tconst classes = {\n\t\t\t'py-2': true,\n\t\t\t'px-3': true,\n\t\t\trounded: true,\n\t\t\t'text-sm': true,\n\t\t\t'w-full': true,\n\t\t\tflex: true,\n\t\t\t'items-center': true,\n\t\t\t'gap-2': true,\n\t\t\t// Selected state\n\t\t\t'bg-primary-container': this.selected,\n\t\t\t'text-primary-onContainer': this.selected,\n\t\t\t// Hover state (when not selected)\n\t\t\t'hover:bg-surface-high': !this.selected,\n\t\t\t// Focus state\n\t\t\t'focus:outline-none': true,\n\t\t}\n\n\t\treturn html`\n\t\t\t<div class=${this.classMap(classes)} role=\"option\" aria-selected=${this.selected} aria-disabled=${this.disabled}>\n\t\t\t\t${this.icon ? html`<span class=\"icon\">${this.icon}</span>` : ''}\n\t\t\t\t<span class=\"flex-1\">${this.label || this.value}</span>\n\t\t\t\t${this.selected\n\t\t\t\t\t? html`\n\t\t\t\t\t\t\t<span class=\"check\">\n\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\twidth=\"16\"\n\t\t\t\t\t\t\t\t\theight=\"16\"\n\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<polyline points=\"20 6 9 17 4 12\"></polyline>\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t`\n\t\t\t\t\t: ''}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-option': SchmancyOption\n\t}\n}\n"],"mappings":"oNAWe,IAAA,EAAA,cAA6B,EAAA,EAAgB,EAAA,GAAG;;;;;;;;;;;;;;;;;;;;;4CA0B9C,GAAA,KAAA,MAMA,GAAA,KAAA,SAAA,CAMI,EAAA,KAAA,SAAA,CAMA,EAAA,KAAA,MAMJ,GAAA,KAAA,KAMD,GAEf,mBAAA,CACC,MAAM,mBAAA,CAGD,AACJ,KAAK,KAAK,mBAAmB,KAAK,QAAA,CAAS,SAAS,GAAA,CAAI,UAAU,EAAG,EAAA,GAIjE,AACJ,KAAK,QAAQ,KAAK,aAAa,MAAA,EAAU,KAAK,MAAA,CAI1C,KAAK,OAAS,KAAK,cACvB,KAAK,MAAQ,KAAK,YAAY,MAAA,GAI/B,EAAA,EAAA,WAAsB,KAAM,QAAA,CAC1B,MAAA,EAAA,EAAA,WAAe,KAAK,cAAA,CAAA,CACpB,UAAW,GAAA,CACX,EAAE,iBAAA,CACE,KAAK,UAET,KAAK,cACJ,IAAI,YAAY,gBAAiB,CAChC,QAAA,CAAS,EACT,SAAA,CAAU,EACV,OAAQ,CAAE,MAAO,KAAK,MAAA,CAAA,CAAA,CAAA,EAAA,EAK1B,EAAA,EAAA,WAAyB,KAAM,UAAA,CAC7B,MAAA,EAAA,EAAA,WAAe,KAAK,cAAA,CAAA,CACpB,UAAW,GAAA,CAEX,GAAI,EAAE,MAAQ,KAAO,EAAE,MAAQ,QAAS,CAGvC,GAFA,EAAE,gBAAA,CACF,EAAE,iBAAA,CACE,KAAK,SAAU,OAEnB,KAAK,cACJ,IAAI,YAAY,gBAAiB,CAChC,QAAA,CAAS,EACT,SAAA,CAAU,EACV,OAAQ,CAAE,MAAO,KAAK,MAAA,CAAA,CAAA,CAAA,GAAA,CAO5B,sBAAA,CAEC,MAAM,sBAAA,CAIP,QAAA,CACC,IAAM,EAAU,CACf,OAAA,CAAQ,EACR,OAAA,CAAQ,EACR,QAAA,CAAS,EACT,UAAA,CAAW,EACX,SAAA,CAAU,EACV,KAAA,CAAM,EACN,eAAA,CAAgB,EAChB,QAAA,CAAS,EAET,uBAAwB,KAAK,SAC7B,2BAA4B,KAAK,SAEjC,wBAAA,CAA0B,KAAK,SAE/B,qBAAA,CAAsB,EAAA,CAGvB,MAAO,GAAA,IAAI;gBACG,KAAK,SAAS,EAAA,CAAA,+BAAwC,KAAK,SAAA,iBAA0B,KAAK,SAAA;MACpG,KAAK,KAAO,EAAA,IAAI,sBAAsB,KAAK,KAAA,SAAgB,GAAA;2BACtC,KAAK,OAAS,KAAK,MAAA;MACxC,KAAK,SACJ,EAAA,IAAI;;;;;;;;;;;;;;;QAgBJ,GAAA;;0BArII,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,QAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAMjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,QAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAMjB,CAAE,KAAM,QAAS,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,WAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAMjC,CAAE,KAAM,QAAS,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,WAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAMjC,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,QAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAMjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,OAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAxDb,kBAAA,CAAA,CAAkB,EAAA"}
1
+ {"version":3,"file":"option-OIp0joyN.cjs","names":[],"sources":["../src/option/option.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { fromEvent, takeUntil } from 'rxjs'\n\n/**\n * `schmancy-option` is an option element for schmancy-select and schmancy-autocomplete components.\n *\n * @fires click - When the option is clicked\n */\n@customElement('schmancy-option')\nexport default class SchmancyOption extends TailwindElement(css`\n\t:host {\n\t\tdisplay: block;\n\t\tcursor: pointer;\n\t\tuser-select: none;\n\t\toutline: none;\n\t}\n\n\t:host(:focus-visible) {\n\t\toutline: 2px solid var(--schmancy-sys-color-primary-default);\n\t\toutline-offset: -2px;\n\t}\n\n\t:host([hidden]) {\n\t\tdisplay: none;\n\t}\n\n\t:host([disabled]) {\n\t\topacity: 0.5;\n\t\tpointer-events: none;\n\t}\n`) {\n\t/**\n\t * The value of the option, will be used when selected.\n\t */\n\t@property({ type: String })\n\tvalue: string = ''\n\n\t/**\n\t * The human-readable label for the option.\n\t */\n\t@property({ type: String })\n\tlabel: string = ''\n\n\t/**\n\t * Whether the option is currently selected.\n\t */\n\t@property({ type: Boolean, reflect: true })\n\tselected: boolean = false\n\n\t/**\n\t * Whether the option is disabled.\n\t */\n\t@property({ type: Boolean, reflect: true })\n\tdisabled: boolean = false\n\n\t/**\n\t * Optional group this option belongs to (for option grouping).\n\t */\n\t@property({ type: String })\n\tgroup: string = ''\n\n\t/**\n\t * Optional icon or image to display before the label.\n\t */\n\t@property({ type: String })\n\ticon: string = ''\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Ensure the option has an ID for accessibility\n\t\tif (!this.id) {\n\t\t\tthis.id = `schmancy-option-${Math.random().toString(36).substring(2, 9)}`\n\t\t}\n\n\t\t// If no label was provided, use the text content or value\n\t\tif (!this.label) {\n\t\t\tthis.label = this.textContent?.trim() || this.value\n\t\t}\n\n\t\t// If value wasn't set but there's text content, use that as the value\n\t\tif (!this.value && this.textContent) {\n\t\t\tthis.value = this.textContent.trim()\n\t\t}\n\n\t\t// Make the option clickable\n\t\tfromEvent<MouseEvent>(this, 'click')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe((e) => {\n\t\t\t\te.stopPropagation()\n\t\t\t\tif (this.disabled) return\n\t\t\t\t// Dispatch a custom event with this option's value\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('option-select', {\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\tdetail: { value: this.value },\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t})\n\n\t\tfromEvent<KeyboardEvent>(this, 'keydown')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe((e) => {\n\t\t\t\t// Handle space and enter as clicks\n\t\t\t\tif (e.key === ' ' || e.key === 'Enter') {\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\te.stopPropagation()\n\t\t\t\t\tif (this.disabled) return\n\t\t\t\t\t// Dispatch a custom event with this option's value\n\t\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\t\tnew CustomEvent('option-select', {\n\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\t\tdetail: { value: this.value },\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t})\n\t}\n\n\tdisconnectedCallback() {\n\t\t// Event listeners are automatically cleaned up via takeUntil(this.disconnecting)\n\t\tsuper.disconnectedCallback()\n\t}\n\n\n\trender() {\n\t\tconst classes = {\n\t\t\t'py-2': true,\n\t\t\t'px-3': true,\n\t\t\trounded: true,\n\t\t\t'text-sm': true,\n\t\t\t'w-full': true,\n\t\t\tflex: true,\n\t\t\t'items-center': true,\n\t\t\t'gap-2': true,\n\t\t\t// Selected state\n\t\t\t'bg-primary-container': this.selected,\n\t\t\t'text-primary-onContainer': this.selected,\n\t\t\t// Hover state (when not selected)\n\t\t\t'hover:bg-surface-high': !this.selected,\n\t\t\t// Focus state\n\t\t\t'focus:outline-none': true,\n\t\t}\n\n\t\treturn html`\n\t\t\t<div class=${this.classMap(classes)} role=\"option\" aria-selected=${this.selected} aria-disabled=${this.disabled}>\n\t\t\t\t${this.icon ? html`<span class=\"icon\">${this.icon}</span>` : ''}\n\t\t\t\t<span class=\"flex-1\">${this.label || this.value}</span>\n\t\t\t\t${this.selected\n\t\t\t\t\t? html`\n\t\t\t\t\t\t\t<span class=\"check\">\n\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\twidth=\"16\"\n\t\t\t\t\t\t\t\t\theight=\"16\"\n\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<polyline points=\"20 6 9 17 4 12\"></polyline>\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t`\n\t\t\t\t\t: ''}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-option': SchmancyOption\n\t}\n}\n"],"mappings":"oNAWe,IAAA,EAAA,cAA6B,EAAA,EAAgB,EAAA,GAAG;;;;;;;;;;;;;;;;;;;;;4CA0B9C,GAAA,KAAA,MAMA,GAAA,KAAA,SAAA,CAMI,EAAA,KAAA,SAAA,CAMA,EAAA,KAAA,MAMJ,GAAA,KAAA,KAMD,GAEf,mBAAA,CACC,MAAM,mBAAA,CAGD,AACJ,KAAK,KAAK,mBAAmB,KAAK,QAAA,CAAS,SAAS,GAAA,CAAI,UAAU,EAAG,EAAA,GAIjE,AACJ,KAAK,QAAQ,KAAK,aAAa,MAAA,EAAU,KAAK,MAAA,CAI1C,KAAK,OAAS,KAAK,cACvB,KAAK,MAAQ,KAAK,YAAY,MAAA,GAI/B,EAAA,EAAA,WAAsB,KAAM,QAAA,CAC1B,MAAA,EAAA,EAAA,WAAe,KAAK,cAAA,CAAA,CACpB,UAAW,GAAA,CACX,EAAE,iBAAA,CACE,KAAK,UAET,KAAK,cACJ,IAAI,YAAY,gBAAiB,CAChC,QAAA,CAAS,EACT,SAAA,CAAU,EACV,OAAQ,CAAE,MAAO,KAAK,MAAA,CAAA,CAAA,CAAA,EAAA,EAK1B,EAAA,EAAA,WAAyB,KAAM,UAAA,CAC7B,MAAA,EAAA,EAAA,WAAe,KAAK,cAAA,CAAA,CACpB,UAAW,GAAA,CAEX,GAAI,EAAE,MAAQ,KAAO,EAAE,MAAQ,QAAS,CAGvC,GAFA,EAAE,gBAAA,CACF,EAAE,iBAAA,CACE,KAAK,SAAU,OAEnB,KAAK,cACJ,IAAI,YAAY,gBAAiB,CAChC,QAAA,CAAS,EACT,SAAA,CAAU,EACV,OAAQ,CAAE,MAAO,KAAK,MAAA,CAAA,CAAA,CAAA,GAAA,CAO5B,sBAAA,CAEC,MAAM,sBAAA,CAIP,QAAA,CACC,IAAM,EAAU,CACf,OAAA,CAAQ,EACR,OAAA,CAAQ,EACR,QAAA,CAAS,EACT,UAAA,CAAW,EACX,SAAA,CAAU,EACV,KAAA,CAAM,EACN,eAAA,CAAgB,EAChB,QAAA,CAAS,EAET,uBAAwB,KAAK,SAC7B,2BAA4B,KAAK,SAEjC,wBAAA,CAA0B,KAAK,SAE/B,qBAAA,CAAsB,EAAA,CAGvB,MAAO,GAAA,IAAI;gBACG,KAAK,SAAS,EAAA,CAAA,+BAAwC,KAAK,SAAA,iBAA0B,KAAK,SAAA;MACpG,KAAK,KAAO,EAAA,IAAI,sBAAsB,KAAK,KAAA,SAAgB,GAAA;2BACtC,KAAK,OAAS,KAAK,MAAA;MACxC,KAAK,SACJ,EAAA,IAAI;;;;;;;;;;;;;;;QAgBJ,GAAA;;0BArII,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,QAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAMjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,QAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAMjB,CAAE,KAAM,QAAS,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,WAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAMjC,CAAE,KAAM,QAAS,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,WAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAMjC,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,QAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAMjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,OAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAxDb,kBAAA,CAAA,CAAkB,EAAA"}
package/dist/option.cjs CHANGED
@@ -1 +1 @@
1
- require(`./option-y5FY8sz-.cjs`);
1
+ require(`./option-OIp0joyN.cjs`);
package/dist/option.js CHANGED
@@ -1 +1 @@
1
- import "./option-EEYkHd44.js";
1
+ import "./option-Ci7C8xxh.js";
@@ -1 +1 @@
1
- {"version":3,"file":"overlay-stack-J_eJCUTX.cjs","names":[],"sources":["../src/utils/overlay-stack.ts"],"sourcesContent":["/**\n * Global overlay stack manager for coordinating z-index across dialogs, sheets, and windows.\n * Each overlay gets a unique, incrementing z-index to ensure proper stacking.\n *\n * Two modes:\n * Anonymous (dialogs/sheets): getNextZIndex() / release() — fire-and-forget counter\n * ID-tracked (windows): assignZIndex(id) / bringToFront(id) / releaseId(id) — per-window stacking\n */\nclass OverlayStackManager {\n\tprivate static instance: OverlayStackManager\n\tprivate counter = 0\n\tprivate readonly BASE_Z_INDEX = 10000\n\n\t/** ID-tracked z-index assignments for windows */\n\tprivate idMap = new Map<string, number>()\n\n\tprivate constructor() {}\n\n\tstatic getInstance(): OverlayStackManager {\n\t\tif (!OverlayStackManager.instance) {\n\t\t\tOverlayStackManager.instance = new OverlayStackManager()\n\t\t}\n\t\treturn OverlayStackManager.instance\n\t}\n\n\t// ── Anonymous mode (dialogs/sheets) ────────────────────────────────\n\n\t/**\n\t * Get the next z-index for a new overlay.\n\t * Each call increments the counter, so overlays stack in open order.\n\t */\n\tgetNextZIndex(): number {\n\t\tthis.counter++\n\t\treturn this.BASE_Z_INDEX + this.counter\n\t}\n\n\t/**\n\t * Release a z-index when overlay closes.\n\t * When all overlays close, reset counter to avoid unbounded growth.\n\t */\n\trelease(): void {\n\t\tthis.counter = Math.max(0, this.counter - 1)\n\t}\n\n\t/**\n\t * Get current overlay count (for debugging)\n\t */\n\tget activeCount(): number {\n\t\treturn this.counter\n\t}\n\n\t// ── ID-tracked mode (windows) ──────────────────────────────────────\n\n\t/**\n\t * Assign a z-index to an ID. If already assigned, returns the existing value.\n\t */\n\tassignZIndex(id: string): number {\n\t\tconst existing = this.idMap.get(id)\n\t\tif (existing !== undefined) return existing\n\t\tthis.counter++\n\t\tconst z = this.BASE_Z_INDEX + this.counter\n\t\tthis.idMap.set(id, z)\n\t\treturn z\n\t}\n\n\t/**\n\t * Move a tracked ID to the highest z-index (bring to front).\n\t * Returns the new z-index.\n\t */\n\tbringToFront(id: string): number {\n\t\tthis.counter++\n\t\tconst z = this.BASE_Z_INDEX + this.counter\n\t\tthis.idMap.set(id, z)\n\t\treturn z\n\t}\n\n\t/**\n\t * Release a tracked ID's z-index.\n\t */\n\treleaseId(id: string): void {\n\t\tthis.idMap.delete(id)\n\t}\n\n\t/**\n\t * Get the z-index for a tracked ID, or undefined if not tracked.\n\t */\n\tgetZIndex(id: string): number | undefined {\n\t\treturn this.idMap.get(id)\n\t}\n\n\t/**\n\t * Get all tracked IDs sorted by z-index (lowest first, front-most last).\n\t */\n\tgetStackOrder(): string[] {\n\t\treturn [...this.idMap.entries()]\n\t\t\t.sort(([, a], [, b]) => a - b)\n\t\t\t.map(([id]) => id)\n\t}\n}\n\nexport const overlayStack = OverlayStackManager.getInstance()\n"],"mappings":"AAQA,IA4Fa,EA5Fb,MAAM,CAAA,CAQL,aAAA,CAAA,KAAA,QANkB,EAAA,KAAA,aACc,IAAA,KAAA,MAGhB,IAAI,IAIpB,OAAA,aAAO,CAIN,MAHK,CACJ,EAAoB,WAAW,IAAI,EAE7B,EAAoB,SAS5B,eAAA,CAEC,MADA,MAAK,UACE,KAAK,aAAe,KAAK,QAOjC,SAAA,CACC,KAAK,QAAU,KAAK,IAAI,EAAG,KAAK,QAAU,EAAA,CAM3C,IAAA,aAAI,CACH,OAAO,KAAK,QAQb,aAAa,EAAA,CACZ,IAAM,EAAW,KAAK,MAAM,IAAI,EAAA,CAChC,GAAI,IAAJ,IAAiB,GAAW,OAAO,EACnC,KAAK,UACL,IAAM,EAAI,KAAK,aAAe,KAAK,QAEnC,OADA,KAAK,MAAM,IAAI,EAAI,EAAA,CACZ,EAOR,aAAa,EAAA,CACZ,KAAK,UACL,IAAM,EAAI,KAAK,aAAe,KAAK,QAEnC,OADA,KAAK,MAAM,IAAI,EAAI,EAAA,CACZ,EAMR,UAAU,EAAA,CACT,KAAK,MAAM,OAAO,EAAA,CAMnB,UAAU,EAAA,CACT,OAAO,KAAK,MAAM,IAAI,EAAA,CAMvB,eAAA,CACC,MAAO,CAAA,GAAI,KAAK,MAAM,SAAA,CAAA,CACpB,MAAA,EAAS,GAAA,EAAO,KAAO,EAAI,EAAA,CAC3B,KAAA,CAAM,KAAQ,EAAA,GAI8B,aAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"overlay-stack-7bs4ZNnh.cjs","names":[],"sources":["../src/utils/overlay-stack.ts"],"sourcesContent":["/**\n * Global overlay stack manager for coordinating z-index across dialogs, sheets, and windows.\n * Each overlay gets a unique, incrementing z-index to ensure proper stacking.\n *\n * Two modes:\n * Anonymous (dialogs/sheets): getNextZIndex() / release() — fire-and-forget counter\n * ID-tracked (windows): assignZIndex(id) / bringToFront(id) / releaseId(id) — per-window stacking\n */\nclass OverlayStackManager {\n\tprivate static instance: OverlayStackManager\n\tprivate counter = 0\n\tprivate readonly BASE_Z_INDEX = 10000\n\n\t/** ID-tracked z-index assignments for windows */\n\tprivate idMap = new Map<string, number>()\n\n\tprivate constructor() {}\n\n\tstatic getInstance(): OverlayStackManager {\n\t\tif (!OverlayStackManager.instance) {\n\t\t\tOverlayStackManager.instance = new OverlayStackManager()\n\t\t}\n\t\treturn OverlayStackManager.instance\n\t}\n\n\t// ── Anonymous mode (dialogs/sheets) ────────────────────────────────\n\n\t/**\n\t * Get the next z-index for a new overlay.\n\t * Each call increments the counter, so overlays stack in open order.\n\t */\n\tgetNextZIndex(): number {\n\t\tthis.counter++\n\t\treturn this.BASE_Z_INDEX + this.counter\n\t}\n\n\t/**\n\t * Release a z-index when overlay closes.\n\t * When all overlays close, reset counter to avoid unbounded growth.\n\t */\n\trelease(): void {\n\t\tthis.counter = Math.max(0, this.counter - 1)\n\t}\n\n\t/**\n\t * Get current overlay count (for debugging)\n\t */\n\tget activeCount(): number {\n\t\treturn this.counter\n\t}\n\n\t// ── ID-tracked mode (windows) ──────────────────────────────────────\n\n\t/**\n\t * Assign a z-index to an ID. If already assigned, returns the existing value.\n\t */\n\tassignZIndex(id: string): number {\n\t\tconst existing = this.idMap.get(id)\n\t\tif (existing !== undefined) return existing\n\t\tthis.counter++\n\t\tconst z = this.BASE_Z_INDEX + this.counter\n\t\tthis.idMap.set(id, z)\n\t\treturn z\n\t}\n\n\t/**\n\t * Move a tracked ID to the highest z-index (bring to front).\n\t * Returns the new z-index.\n\t */\n\tbringToFront(id: string): number {\n\t\tthis.counter++\n\t\tconst z = this.BASE_Z_INDEX + this.counter\n\t\tthis.idMap.set(id, z)\n\t\treturn z\n\t}\n\n\t/**\n\t * Release a tracked ID's z-index.\n\t */\n\treleaseId(id: string): void {\n\t\tthis.idMap.delete(id)\n\t}\n\n\t/**\n\t * Get the z-index for a tracked ID, or undefined if not tracked.\n\t */\n\tgetZIndex(id: string): number | undefined {\n\t\treturn this.idMap.get(id)\n\t}\n\n\t/**\n\t * Get all tracked IDs sorted by z-index (lowest first, front-most last).\n\t */\n\tgetStackOrder(): string[] {\n\t\treturn [...this.idMap.entries()]\n\t\t\t.sort(([, a], [, b]) => a - b)\n\t\t\t.map(([id]) => id)\n\t}\n}\n\nexport const overlayStack = OverlayStackManager.getInstance()\n"],"mappings":"AAQA,IA4Fa,EA5Fb,MAAM,CAAA,CAQL,aAAA,CAAA,KAAA,QANkB,EAAA,KAAA,aACc,IAAA,KAAA,MAGhB,IAAI,IAIpB,OAAA,aAAO,CAIN,MAHK,CACJ,EAAoB,WAAW,IAAI,EAE7B,EAAoB,SAS5B,eAAA,CAEC,MADA,MAAK,UACE,KAAK,aAAe,KAAK,QAOjC,SAAA,CACC,KAAK,QAAU,KAAK,IAAI,EAAG,KAAK,QAAU,EAAA,CAM3C,IAAA,aAAI,CACH,OAAO,KAAK,QAQb,aAAa,EAAA,CACZ,IAAM,EAAW,KAAK,MAAM,IAAI,EAAA,CAChC,GAAI,IAAJ,IAAiB,GAAW,OAAO,EACnC,KAAK,UACL,IAAM,EAAI,KAAK,aAAe,KAAK,QAEnC,OADA,KAAK,MAAM,IAAI,EAAI,EAAA,CACZ,EAOR,aAAa,EAAA,CACZ,KAAK,UACL,IAAM,EAAI,KAAK,aAAe,KAAK,QAEnC,OADA,KAAK,MAAM,IAAI,EAAI,EAAA,CACZ,EAMR,UAAU,EAAA,CACT,KAAK,MAAM,OAAO,EAAA,CAMnB,UAAU,EAAA,CACT,OAAO,KAAK,MAAM,IAAI,EAAA,CAMvB,eAAA,CACC,MAAO,CAAA,GAAI,KAAK,MAAM,SAAA,CAAA,CACpB,MAAA,EAAS,GAAA,EAAO,KAAO,EAAI,EAAA,CAC3B,KAAA,CAAM,KAAQ,EAAA,GAI8B,aAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"overlay-stack-BJt_r6aZ.js","names":[],"sources":["../src/utils/overlay-stack.ts"],"sourcesContent":["/**\n * Global overlay stack manager for coordinating z-index across dialogs, sheets, and windows.\n * Each overlay gets a unique, incrementing z-index to ensure proper stacking.\n *\n * Two modes:\n * Anonymous (dialogs/sheets): getNextZIndex() / release() — fire-and-forget counter\n * ID-tracked (windows): assignZIndex(id) / bringToFront(id) / releaseId(id) — per-window stacking\n */\nclass OverlayStackManager {\n\tprivate static instance: OverlayStackManager\n\tprivate counter = 0\n\tprivate readonly BASE_Z_INDEX = 10000\n\n\t/** ID-tracked z-index assignments for windows */\n\tprivate idMap = new Map<string, number>()\n\n\tprivate constructor() {}\n\n\tstatic getInstance(): OverlayStackManager {\n\t\tif (!OverlayStackManager.instance) {\n\t\t\tOverlayStackManager.instance = new OverlayStackManager()\n\t\t}\n\t\treturn OverlayStackManager.instance\n\t}\n\n\t// ── Anonymous mode (dialogs/sheets) ────────────────────────────────\n\n\t/**\n\t * Get the next z-index for a new overlay.\n\t * Each call increments the counter, so overlays stack in open order.\n\t */\n\tgetNextZIndex(): number {\n\t\tthis.counter++\n\t\treturn this.BASE_Z_INDEX + this.counter\n\t}\n\n\t/**\n\t * Release a z-index when overlay closes.\n\t * When all overlays close, reset counter to avoid unbounded growth.\n\t */\n\trelease(): void {\n\t\tthis.counter = Math.max(0, this.counter - 1)\n\t}\n\n\t/**\n\t * Get current overlay count (for debugging)\n\t */\n\tget activeCount(): number {\n\t\treturn this.counter\n\t}\n\n\t// ── ID-tracked mode (windows) ──────────────────────────────────────\n\n\t/**\n\t * Assign a z-index to an ID. If already assigned, returns the existing value.\n\t */\n\tassignZIndex(id: string): number {\n\t\tconst existing = this.idMap.get(id)\n\t\tif (existing !== undefined) return existing\n\t\tthis.counter++\n\t\tconst z = this.BASE_Z_INDEX + this.counter\n\t\tthis.idMap.set(id, z)\n\t\treturn z\n\t}\n\n\t/**\n\t * Move a tracked ID to the highest z-index (bring to front).\n\t * Returns the new z-index.\n\t */\n\tbringToFront(id: string): number {\n\t\tthis.counter++\n\t\tconst z = this.BASE_Z_INDEX + this.counter\n\t\tthis.idMap.set(id, z)\n\t\treturn z\n\t}\n\n\t/**\n\t * Release a tracked ID's z-index.\n\t */\n\treleaseId(id: string): void {\n\t\tthis.idMap.delete(id)\n\t}\n\n\t/**\n\t * Get the z-index for a tracked ID, or undefined if not tracked.\n\t */\n\tgetZIndex(id: string): number | undefined {\n\t\treturn this.idMap.get(id)\n\t}\n\n\t/**\n\t * Get all tracked IDs sorted by z-index (lowest first, front-most last).\n\t */\n\tgetStackOrder(): string[] {\n\t\treturn [...this.idMap.entries()]\n\t\t\t.sort(([, a], [, b]) => a - b)\n\t\t\t.map(([id]) => id)\n\t}\n}\n\nexport const overlayStack = OverlayStackManager.getInstance()\n"],"mappings":"AAQA,IA4Fa,IA5Fb,MAAM,EAAA;CAQL,cAAA;AAAA,OAAA,UANkB,GAAA,KAAA,eACc,KAAA,KAAA,wBAGhB,IAAI,KAAA;;CAIpB,OAAA,cAAO;AAIN,SAHK,AACJ,EAAoB,aAAW,IAAI,GAAA,EAE7B,EAAoB;;CAS5B,gBAAA;AAEC,SADA,KAAK,WACE,KAAK,eAAe,KAAK;;CAOjC,UAAA;AACC,OAAK,UAAU,KAAK,IAAI,GAAG,KAAK,UAAU,EAAA;;CAM3C,IAAA,cAAI;AACH,SAAO,KAAK;;CAQb,aAAa,GAAA;EACZ,IAAM,IAAW,KAAK,MAAM,IAAI,EAAA;AAChC,MAAI,MAAJ,KAAiB,EAAW,QAAO;AACnC,OAAK;EACL,IAAM,IAAI,KAAK,eAAe,KAAK;AAEnC,SADA,KAAK,MAAM,IAAI,GAAI,EAAA,EACZ;;CAOR,aAAa,GAAA;AACZ,OAAK;EACL,IAAM,IAAI,KAAK,eAAe,KAAK;AAEnC,SADA,KAAK,MAAM,IAAI,GAAI,EAAA,EACZ;;CAMR,UAAU,GAAA;AACT,OAAK,MAAM,OAAO,EAAA;;CAMnB,UAAU,GAAA;AACT,SAAO,KAAK,MAAM,IAAI,EAAA;;CAMvB,gBAAA;AACC,SAAO,CAAA,GAAI,KAAK,MAAM,SAAA,CAAA,CACpB,MAAA,GAAS,IAAA,GAAO,OAAO,IAAI,EAAA,CAC3B,KAAA,CAAM,OAAQ,EAAA;;EAI8B,aAAA;AAAA,SAAA"}
1
+ {"version":3,"file":"overlay-stack-DXPYHPhk.js","names":[],"sources":["../src/utils/overlay-stack.ts"],"sourcesContent":["/**\n * Global overlay stack manager for coordinating z-index across dialogs, sheets, and windows.\n * Each overlay gets a unique, incrementing z-index to ensure proper stacking.\n *\n * Two modes:\n * Anonymous (dialogs/sheets): getNextZIndex() / release() — fire-and-forget counter\n * ID-tracked (windows): assignZIndex(id) / bringToFront(id) / releaseId(id) — per-window stacking\n */\nclass OverlayStackManager {\n\tprivate static instance: OverlayStackManager\n\tprivate counter = 0\n\tprivate readonly BASE_Z_INDEX = 10000\n\n\t/** ID-tracked z-index assignments for windows */\n\tprivate idMap = new Map<string, number>()\n\n\tprivate constructor() {}\n\n\tstatic getInstance(): OverlayStackManager {\n\t\tif (!OverlayStackManager.instance) {\n\t\t\tOverlayStackManager.instance = new OverlayStackManager()\n\t\t}\n\t\treturn OverlayStackManager.instance\n\t}\n\n\t// ── Anonymous mode (dialogs/sheets) ────────────────────────────────\n\n\t/**\n\t * Get the next z-index for a new overlay.\n\t * Each call increments the counter, so overlays stack in open order.\n\t */\n\tgetNextZIndex(): number {\n\t\tthis.counter++\n\t\treturn this.BASE_Z_INDEX + this.counter\n\t}\n\n\t/**\n\t * Release a z-index when overlay closes.\n\t * When all overlays close, reset counter to avoid unbounded growth.\n\t */\n\trelease(): void {\n\t\tthis.counter = Math.max(0, this.counter - 1)\n\t}\n\n\t/**\n\t * Get current overlay count (for debugging)\n\t */\n\tget activeCount(): number {\n\t\treturn this.counter\n\t}\n\n\t// ── ID-tracked mode (windows) ──────────────────────────────────────\n\n\t/**\n\t * Assign a z-index to an ID. If already assigned, returns the existing value.\n\t */\n\tassignZIndex(id: string): number {\n\t\tconst existing = this.idMap.get(id)\n\t\tif (existing !== undefined) return existing\n\t\tthis.counter++\n\t\tconst z = this.BASE_Z_INDEX + this.counter\n\t\tthis.idMap.set(id, z)\n\t\treturn z\n\t}\n\n\t/**\n\t * Move a tracked ID to the highest z-index (bring to front).\n\t * Returns the new z-index.\n\t */\n\tbringToFront(id: string): number {\n\t\tthis.counter++\n\t\tconst z = this.BASE_Z_INDEX + this.counter\n\t\tthis.idMap.set(id, z)\n\t\treturn z\n\t}\n\n\t/**\n\t * Release a tracked ID's z-index.\n\t */\n\treleaseId(id: string): void {\n\t\tthis.idMap.delete(id)\n\t}\n\n\t/**\n\t * Get the z-index for a tracked ID, or undefined if not tracked.\n\t */\n\tgetZIndex(id: string): number | undefined {\n\t\treturn this.idMap.get(id)\n\t}\n\n\t/**\n\t * Get all tracked IDs sorted by z-index (lowest first, front-most last).\n\t */\n\tgetStackOrder(): string[] {\n\t\treturn [...this.idMap.entries()]\n\t\t\t.sort(([, a], [, b]) => a - b)\n\t\t\t.map(([id]) => id)\n\t}\n}\n\nexport const overlayStack = OverlayStackManager.getInstance()\n"],"mappings":"AAQA,IA4Fa,IA5Fb,MAAM,EAAA;CAQL,cAAA;AAAA,OAAA,UANkB,GAAA,KAAA,eACc,KAAA,KAAA,wBAGhB,IAAI,KAAA;;CAIpB,OAAA,cAAO;AAIN,SAHK,AACJ,EAAoB,aAAW,IAAI,GAAA,EAE7B,EAAoB;;CAS5B,gBAAA;AAEC,SADA,KAAK,WACE,KAAK,eAAe,KAAK;;CAOjC,UAAA;AACC,OAAK,UAAU,KAAK,IAAI,GAAG,KAAK,UAAU,EAAA;;CAM3C,IAAA,cAAI;AACH,SAAO,KAAK;;CAQb,aAAa,GAAA;EACZ,IAAM,IAAW,KAAK,MAAM,IAAI,EAAA;AAChC,MAAI,MAAJ,KAAiB,EAAW,QAAO;AACnC,OAAK;EACL,IAAM,IAAI,KAAK,eAAe,KAAK;AAEnC,SADA,KAAK,MAAM,IAAI,GAAI,EAAA,EACZ;;CAOR,aAAa,GAAA;AACZ,OAAK;EACL,IAAM,IAAI,KAAK,eAAe,KAAK;AAEnC,SADA,KAAK,MAAM,IAAI,GAAI,EAAA,EACZ;;CAMR,UAAU,GAAA;AACT,OAAK,MAAM,OAAO,EAAA;;CAMnB,UAAU,GAAA;AACT,SAAO,KAAK,MAAM,IAAI,EAAA;;CAMvB,gBAAA;AACC,SAAO,CAAA,GAAI,KAAK,MAAM,SAAA,CAAA,CACpB,MAAA,GAAS,IAAA,GAAO,OAAO,IAAI,EAAA,CAC3B,KAAA,CAAM,OAAQ,EAAA;;EAI8B,aAAA;AAAA,SAAA"}
@@ -0,0 +1,130 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./chunk-CncqDLb2.cjs`),t=require(`./decorate-F9CuyeHg.cjs`),n=require(`./litElement.mixin-CtQOmwq6.cjs`);require(`./mixins.cjs`);const r=require(`./lazy-BDNnH_r7.cjs`),i=require(`./animation-CQRdLgzX.cjs`);let a=require(`rxjs`),o=require(`lit/decorators.js`),s=require(`lit`),c=require(`lit/directives/when.js`),l=require(`lit/directives/choose.js`);function u(e,t){if(i.v())return t===`in`?{keyframes:[{opacity:0,transform:`none`},{opacity:1,transform:`none`}],options:{duration:1,easing:`linear`,fill:`forwards`}}:{keyframes:[{opacity:1,transform:`none`},{opacity:0,transform:`none`}],options:{duration:1,easing:`linear`,fill:`forwards`}};switch(e){case`centered`:return t===`in`?{keyframes:[{opacity:0,transform:`scale(0.92) translateY(16px)`},{opacity:1,transform:`scale(1) translateY(0)`}],options:{duration:i.f.duration,easing:i.f.easingFallback,fill:`forwards`}}:{keyframes:[{opacity:1,transform:`scale(1) translateY(0)`},{opacity:0,transform:`scale(0.96) translateY(8px)`}],options:{duration:150,easing:i.o,fill:`forwards`}};case`sheet`:return t===`in`?{keyframes:[{opacity:0,transform:`translateY(100%)`},{opacity:1,transform:`translateY(0)`}],options:{duration:i.u.duration,easing:i.u.easingFallback,fill:`forwards`}}:{keyframes:[{opacity:1,transform:`translateY(0)`},{opacity:0,transform:`translateY(100%)`}],options:{duration:150,easing:i.o,fill:`forwards`}};case`anchored`:return t===`in`?{keyframes:[{opacity:0},{opacity:1}],options:{duration:i.f.duration,easing:i.f.easingFallback,fill:`forwards`}}:{keyframes:[{opacity:1},{opacity:0}],options:{duration:150,easing:i.o,fill:`forwards`}}}}var d=`overlay-mount`,f=class extends n.t(s.css`
2
+ :host {
3
+ position: fixed;
4
+ inset: 0;
5
+ z-index: var(--schmancy-overlay-z, 10000);
6
+ display: contents;
7
+ pointer-events: none;
8
+ }
9
+ dialog {
10
+ margin: 0;
11
+ padding: 0;
12
+ border: 0;
13
+ background: transparent;
14
+ overflow: visible;
15
+ max-width: none;
16
+ max-height: none;
17
+ pointer-events: auto;
18
+ }
19
+ dialog::backdrop {
20
+ background: rgba(12, 12, 16, 0.28);
21
+ backdrop-filter: blur(18px) saturate(150%);
22
+ -webkit-backdrop-filter: blur(18px) saturate(150%);
23
+ }
24
+ .surface {
25
+ position: fixed;
26
+ pointer-events: auto;
27
+ max-width: calc(100vw - 2rem);
28
+ max-height: 90dvh;
29
+ overflow: auto;
30
+ border-radius: var(--schmancy-sys-shape-corner-large, 16px);
31
+ background: var(--schmancy-sys-color-surface, #ffffff);
32
+ box-shadow: 0 24px 64px -16px rgba(0, 0, 0, 0.35);
33
+ }
34
+ .surface[data-layout='centered'] {
35
+ top: 50%;
36
+ left: 50%;
37
+ transform: translate(-50%, -50%);
38
+ }
39
+ .surface[data-layout='sheet'] {
40
+ left: 0;
41
+ right: 0;
42
+ bottom: 0;
43
+ max-width: none;
44
+ max-height: 90dvh;
45
+ width: 100%;
46
+ border-radius: var(--schmancy-sys-shape-corner-large, 16px) var(--schmancy-sys-shape-corner-large, 16px) 0 0;
47
+ padding-bottom: env(safe-area-inset-bottom);
48
+ }
49
+ .surface[data-layout='anchored'] {
50
+ max-width: min(480px, calc(100vw - 2rem));
51
+ box-shadow: 0 12px 32px -8px rgba(0, 0, 0, 0.28);
52
+ }
53
+ .drag-handle {
54
+ display: flex;
55
+ justify-content: center;
56
+ padding: 8px 0 4px;
57
+ touch-action: none;
58
+ cursor: grab;
59
+ }
60
+ .drag-handle::before {
61
+ content: '';
62
+ width: 40px;
63
+ height: 4px;
64
+ border-radius: 999px;
65
+ background: var(--schmancy-sys-color-outline-variant, #cac4cf);
66
+ }
67
+ @media (prefers-reduced-motion: reduce) {
68
+ .surface { box-shadow: var(--schmancy-sys-elevation-2, 0 2px 6px rgba(0,0,0,0.2)); }
69
+ }
70
+ `){constructor(...e){super(...e),this.layout=`centered`,this.dismissable=!0,this.modal=!0,this._closed$=new a.Subject,this._mounted=!1,this._closing=!1}get closed$(){return this._closed$.asObservable()}async open(e,t){if(this._mounted)throw Error(`schmancy-overlay: open() called twice on the same element`);this._mounted=!0,this.dismissable=!1!==t.dismissable,await this.updateComplete;let n=this.renderRoot.querySelector(`#${d}`);if(!n)throw Error(`schmancy-overlay: mount point missing`);await p(e,n,t.props);let r={width:window.innerWidth,height:window.innerHeight,isCoarsePointer:window.matchMedia(`(pointer: coarse)`).matches},i={width:n.scrollWidth,height:n.scrollHeight},a=function(e){let{anchor:t,content:n,viewport:r}=e,i=r.width<640,a=r.isCoarsePointer,o=n.height>.8*r.height,s=n.width>.9*r.width;return i||a||o||s?`sheet`:t===void 0?`centered`:`anchored`}({anchor:t.anchor,content:i,viewport:r});this.layout=a;let o=t.modal??(a===`centered`||a===`sheet`);this.modal=o,await this.updateComplete,o?this._dialog.showModal():this._dialog.show(),a===`anchored`&&t.anchor&&this.positionAnchored(t.anchor),this.wireCloseTriggers(t.signal),await this.playEnterAnimations()}async close(e,t){if(!this._closing&&this._mounted){this._closing=!0;try{await this.playExitAnimations()}catch{}try{this._dialog?.close()}catch{}this._closed$.next({reason:e,result:t}),this._closed$.complete()}}wireCloseTriggers(e){let t=this.disconnecting;if((0,a.fromEvent)(this._dialog,`close`).pipe((0,a.filter)(()=>!this._closing),(0,a.tap)(()=>{let e=this._dialog.returnValue;e!==``&&e!==void 0?this.close(`native-submit`,e):this.close(`escape`)}),(0,a.takeUntil)(t)).subscribe(),(0,a.fromEvent)(this,`close`).pipe((0,a.filter)(e=>e instanceof CustomEvent),(0,a.filter)(e=>e.target!==this._dialog),(0,a.tap)(e=>{e.stopPropagation(),this.close(`structured`,e.detail)}),(0,a.takeUntil)(t)).subscribe(),(0,a.fromEvent)(this._dialog,`cancel`).pipe((0,a.tap)(e=>{this.dismissable||e.preventDefault()}),(0,a.takeUntil)(t)).subscribe(),(0,a.fromEvent)(this._dialog,`click`).pipe((0,a.filter)(e=>this.dismissable&&e.target===this._dialog),(0,a.tap)(()=>{this.close(`backdrop`)}),(0,a.takeUntil)(t)).subscribe(),this.layout===`sheet`&&this.dismissable){let e=this.renderRoot.querySelector(`.drag-handle`);(function(e){let{surface:t,dragHandle:n,until$:r}=e;return new a.Observable(e=>{let i=n??t,o=new a.Subject,s=!1,c=0,l=0,u=0;return(0,a.merge)((0,a.fromEvent)(i,`touchstart`,{passive:!0}).pipe((0,a.filter)(e=>e.touches.length===1),(0,a.filter)(e=>{if(n)return!0;let r=e.touches[0],i=t.getBoundingClientRect();return r.clientY-i.top<=40}),(0,a.tap)(e=>{s=!0,c=e.touches[0].clientY,l=performance.now(),u=0,t.style.transition=`none`,t.style.willChange=`transform`})),(0,a.fromEvent)(t,`touchmove`,{passive:!1}).pipe((0,a.filter)(()=>s),(0,a.filter)(e=>e.touches.length===1),(0,a.tap)(e=>{let n=e.touches[0].clientY-c;u=n<0?.2*n:n,t.style.transform=`translateY(${u}px)`,e.preventDefault()})),(0,a.merge)((0,a.fromEvent)(t,`touchend`,{passive:!0}),(0,a.fromEvent)(t,`touchcancel`,{passive:!0})).pipe((0,a.filter)(()=>s),(0,a.tap)(()=>{s=!1;let n=Math.max(1,performance.now()-l),r=u/n,i=t.getBoundingClientRect().height,a=Math.min(80,.3*i),o=u>a||u>20&&r>.5;t.style.willChange=``,o?(t.style.transition=`transform 300ms cubic-bezier(0.16, 1, 0.3, 1)`,t.style.transform=`translateY(100%)`,e.next(`dismiss`),e.complete()):(t.style.transition=`transform 300ms cubic-bezier(0.16, 1, 0.3, 1)`,t.style.transform=`translateY(0)`)}))).pipe((0,a.takeUntil)((0,a.merge)(o,r))).subscribe(),()=>{o.next(),o.complete(),t.style.transition=``,t.style.transform=``,t.style.willChange=``}}).pipe((0,a.take)(1))})({surface:this._surface,dragHandle:e,until$:(0,a.merge)(t,this._closed$)}).pipe((0,a.take)(1)).subscribe(()=>{this.close(`swipe`)})}e&&(e.aborted?queueMicrotask(()=>{this.close(`abort`)}):(0,a.fromEvent)(e,`abort`).pipe((0,a.take)(1),(0,a.tap)(()=>{this.close(`abort`)}),(0,a.takeUntil)(t)).subscribe())}positionAnchored(e){let t=function(e){if(e instanceof Element){let t=e.getBoundingClientRect();return{top:t.top,left:t.left,right:t.right,bottom:t.bottom,width:t.width,height:t.height}}if(`clientX`in e&&`clientY`in e)return{top:e.clientY,left:e.clientX,right:e.clientX,bottom:e.clientY,width:0,height:0};let t=e;return{top:t.y,left:t.x,right:t.x,bottom:t.y,width:0,height:0}}(e),n=this._surface.getBoundingClientRect(),r=window.innerWidth,i=window.innerHeight,a=t.bottom+8;if(a+n.height>i-16){let e=t.top-8-n.height;a=e>=16?e:Math.max(16,i-16-n.height)}let o=t.left;o+n.width>r-16&&(o=r-16-n.width),o<16&&(o=16),this._surface.style.top=`${a}px`,this._surface.style.left=`${o}px`,this._surface.style.transform=`none`}async playEnterAnimations(){let e=this._dialog,t=this._surface;if(!e||!t)return;let n=u(this.layout,`in`);await t.animate(n.keyframes,n.options).finished.catch(()=>{})}async playExitAnimations(){let e=this._surface;if(!e)return;let t=u(this.layout,`out`);await e.animate(t.keyframes,t.options).finished.catch(()=>{})}render(){return s.html`
71
+ <dialog>
72
+ <section
73
+ class="surface"
74
+ data-layout=${this.layout}
75
+ role="dialog"
76
+ aria-modal=${this.modal?`true`:`false`}
77
+ >
78
+ ${(0,c.when)(this.layout===`sheet`,()=>s.html`<div class="drag-handle" role="button" aria-label="Dismiss" tabindex="0"></div>`)}
79
+ <div id=${d}></div>
80
+ </section>
81
+ </dialog>
82
+ `}};async function p(e,t,n){if(typeof(r=e)==`object`&&r!==null&&`_$litType$`in r)return(0,s.render)(e,t),t;var r;if(e instanceof HTMLElement)return n&&Object.assign(e,n),t.appendChild(e),e;if(function(e){return typeof e==`function`&&(`preload`in e||`_promise`in e)}(e))return p((await e()).default,t,n);if(typeof e==`function`){let r=new e;return n&&Object.assign(r,n),t.appendChild(r),r}if(typeof e==`string`){let r=document.createElement(e);return n&&Object.assign(r,n),t.appendChild(r),r}throw Error(`schmancy-overlay: unsupported content type`)}t.t([(0,o.property)({type:String,reflect:!0})],f.prototype,`layout`,void 0),t.t([(0,o.property)({type:Boolean,reflect:!0})],f.prototype,`dismissable`,void 0),t.t([(0,o.property)({type:Boolean,reflect:!0})],f.prototype,`modal`,void 0),t.t([(0,o.query)(`dialog`)],f.prototype,`_dialog`,void 0),t.t([(0,o.query)(`.surface`)],f.prototype,`_surface`,void 0),f=t.t([(0,o.customElement)(`schmancy-overlay`)],f);var m=e.n({SchmancyOverlayPromptBody:()=>h}),h=class extends n.t(s.css`
83
+ :host {
84
+ display: block;
85
+ padding: 20px 24px;
86
+ min-width: 280px;
87
+ max-width: 480px;
88
+ color: var(--schmancy-sys-color-on-surface, #1a1a1a);
89
+ background: var(--schmancy-sys-color-surface, #ffffff);
90
+ border-radius: var(--schmancy-sys-shape-corner-large, 16px);
91
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.12);
92
+ }
93
+ :host([variant='danger']) .cta-confirm {
94
+ background: var(--schmancy-sys-color-error, #b3261e);
95
+ color: var(--schmancy-sys-color-on-error, #ffffff);
96
+ }
97
+ `){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`){let e=this._input;if(e&&!e.reportValidity())return;this.dismiss(e?.value??``)}else this.dismiss(!0)},this.handleSubmit=e=>{e.preventDefault(),this.handleConfirm()}}firstUpdated(){this.mode===`prompt`&&queueMicrotask(()=>this._input?.focus())}dismiss(e){this.dispatchEvent(new CustomEvent(`close`,{detail:e,bubbles:!0,composed:!0}))}render(){return s.html`
98
+ <form @submit=${this.handleSubmit}>
99
+ ${(0,c.when)(this.heading,()=>s.html`<h2 class="text-lg font-semibold mb-1">${this.heading}</h2>`)}
100
+ ${(0,c.when)(this.subtitle,()=>s.html`<p class="text-sm opacity-70 mb-2">${this.subtitle}</p>`)}
101
+ ${(0,l.choose)(this.mode,[[`prompt`,()=>s.html`
102
+ ${(0,c.when)(this.label,()=>s.html`<label class="block text-sm mb-1">${this.label}</label>`)}
103
+ <input
104
+ type=${this.inputType}
105
+ .value=${this.defaultValue}
106
+ placeholder=${this.placeholder??s.nothing}
107
+ pattern=${this.pattern??s.nothing}
108
+ ?required=${this.required}
109
+ class="w-full px-3 py-2 rounded-md border border-outline-variant text-base mb-2"
110
+ />
111
+ ${(0,c.when)(this.message,()=>s.html`<p class="text-sm mb-3">${this.message}</p>`)}
112
+ `]],()=>s.html`${(0,c.when)(this.message,()=>s.html`<p class="text-sm mb-4">${this.message}</p>`)}`)}
113
+
114
+ <div class="flex justify-end gap-2 mt-4">
115
+ <button
116
+ type="button"
117
+ @click=${this.handleCancel}
118
+ class="px-4 py-2 rounded-md border border-outline-variant bg-transparent cursor-pointer"
119
+ >
120
+ ${this.cancelText}
121
+ </button>
122
+ <button
123
+ type="submit"
124
+ class="cta-confirm px-4 py-2 rounded-md border-0 bg-primary text-on-primary cursor-pointer font-medium"
125
+ >
126
+ ${this.confirmText}
127
+ </button>
128
+ </div>
129
+ </form>
130
+ `}};t.t([(0,o.property)({type:String})],h.prototype,`heading`,void 0),t.t([(0,o.property)({type:String})],h.prototype,`subtitle`,void 0),t.t([(0,o.property)({type:String})],h.prototype,`message`,void 0),t.t([(0,o.property)({type:String,attribute:`confirm-text`})],h.prototype,`confirmText`,void 0),t.t([(0,o.property)({type:String,attribute:`cancel-text`})],h.prototype,`cancelText`,void 0),t.t([(0,o.property)({type:String,reflect:!0})],h.prototype,`variant`,void 0),t.t([(0,o.property)({type:String})],h.prototype,`mode`,void 0),t.t([(0,o.property)({type:String})],h.prototype,`label`,void 0),t.t([(0,o.property)({type:String,attribute:`default-value`})],h.prototype,`defaultValue`,void 0),t.t([(0,o.property)({type:String})],h.prototype,`placeholder`,void 0),t.t([(0,o.property)({type:String,attribute:`input-type`})],h.prototype,`inputType`,void 0),t.t([(0,o.property)({type:String})],h.prototype,`pattern`,void 0),t.t([(0,o.property)({type:Boolean})],h.prototype,`required`,void 0),t.t([(0,o.query)(`input`)],h.prototype,`_input`,void 0),h=t.t([(0,o.customElement)(`schmancy-overlay-prompt-body`)],h);var g=new a.BehaviorSubject([]),_=g.asObservable(),v=!1,y=``,b=``;g.pipe((0,a.map)(e=>e.length>0),(0,a.distinctUntilChanged)()).subscribe(e=>{typeof document<`u`&&(e&&!v?(y=document.documentElement.style.overflow,b=document.documentElement.style.getPropertyValue(`scrollbar-gutter`),document.documentElement.style.overflow=`hidden`,document.documentElement.style.setProperty(`scrollbar-gutter`,`stable`),v=!0):!e&&v&&(document.documentElement.style.overflow=y,b?document.documentElement.style.setProperty(`scrollbar-gutter`,b):document.documentElement.style.removeProperty(`scrollbar-gutter`),y=``,b=``,v=!1))});var x=new Set,S=new Set;function C(e,t){x.add(e),x.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,S.add(r))}}(t)}function w(e){x.delete(e),x.size===0&&function(){for(let e of S)e.inert=!1;S.clear()}()}var T=_;function E(e,t={}){return(0,a.defer)(()=>new a.Observable(n=>{let r=null,i=null,o=!1,s=!1,c=new a.Subject;return(async()=>{try{r=document.createElement(`schmancy-overlay`),(document.body??document.documentElement).appendChild(r),await r.updateComplete,await r.open(e,t);let l=`ov_`+Math.random().toString(36).slice(2,10)+Date.now().toString(36);i={id:l,element:r,layout:r.layout},function(e){g.next([...g.value,e])}(i),r.modal&&r.parentElement&&C(l,r);let u=t.historyStrategy??`push`;u===`push`?(history.pushState({i:l},``,location.href),o=!0):u===`replace`&&history.replaceState({i:l},``,location.href),o&&(0,a.fromEvent)(window,`popstate`).pipe((0,a.take)(1),(0,a.takeUntil)(c)).subscribe(()=>{s=!0,r?.close(`popstate`)}),r.closed$.pipe((0,a.take)(1),(0,a.takeUntil)(c)).subscribe(({result:e})=>{s=!0,n.next(e),n.complete()})}catch(e){n.error(e)}})(),()=>{c.next(),c.complete(),r&&!s&&r.close(`programmatic`),i&&(w(i.id),function(e){let t=g.value,n=t.filter(t=>t.id!==e);n.length!==t.length&&g.next(n)}(i.id)),o&&!s&&(history.state?.i===i?.id&&history.back(),o=!1),queueMicrotask(()=>{r?.remove(),r=null})}}))}Object.defineProperty(exports,`SchmancyOverlay`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`SchmancyOverlayPromptBody`,{enumerable:!0,get:function(){return h}}),exports.confirm=async function(e={}){let{SchmancyOverlayPromptBody:t}=await Promise.resolve().then(()=>m);return!0===await(0,a.firstValueFrom)(E(t,{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,a.defaultIfEmpty)(!1)))},exports.dismissAll=function(){let e=[...g.value];for(let t=e.length-1;t>=0;t--)e[t].element.close(`programmatic`);g.value.length>0&&g.next([])},exports.lazy=r.t,exports.openOverlays$=T,exports.overlayEvents=function(e,t){return function(e){let t=e.toLowerCase();return g.pipe((0,a.map)(e=>{let n=[];for(let r of e){let e=r.element.querySelector(t);e&&n.push(e)}return n}),(0,a.distinctUntilChanged)((e,t)=>e.length===t.length&&e.every((e,n)=>e===t[n])))}(e).pipe((0,a.distinctUntilChanged)((e,t)=>e.length===t.length&&e.every((e,n)=>e===t[n])),(0,a.switchMap)(e=>e.length===0?a.EMPTY:(0,a.merge)(...e.map(e=>(0,a.fromEvent)(e,t)))),(0,a.map)(e=>e))},exports.prompt=async function(e={}){let{SchmancyOverlayPromptBody:t}=await Promise.resolve().then(()=>m),n=await(0,a.firstValueFrom)(E(t,{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,a.defaultIfEmpty)(null)));return typeof n==`string`?n:null},exports.show=E;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.cjs","names":[],"sources":["../src/overlay/overlay.animations.ts","../src/overlay/overlay.gestures.ts","../src/overlay/overlay.layout.ts","../src/overlay/overlay.component.ts","../src/overlay/overlay.confirm-body.ts","../src/overlay/overlay.stack.ts","../src/overlay/overlay.service.ts"],"sourcesContent":["import {\n\tDURATION_BACKDROP,\n\tDURATION_EXIT,\n\tEASE_IN,\n\tEASE_OUT,\n\tprefersReducedMotion,\n\tSPRING_GENTLE,\n\tSPRING_SNAPPY,\n} from '../utils/animation'\nimport type { 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). Honors\n * `prefers-reduced-motion` by collapsing transforms to opacity-only.\n *\n * Returns `null` when reduced-motion is active and only opacity change\n * is needed — the caller sets style directly.\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\nexport function backdropAnimation(direction: 'in' | 'out'): AnimationSpec {\n\treturn direction === 'in'\n\t\t? {\n\t\t\t\tkeyframes: [{ opacity: 0 }, { opacity: 1 }],\n\t\t\t\toptions: { duration: DURATION_BACKDROP, easing: EASE_OUT, fill: 'forwards' },\n\t\t\t}\n\t\t: {\n\t\t\t\tkeyframes: [{ opacity: 1 }, { opacity: 0 }],\n\t\t\t\toptions: { duration: DURATION_BACKDROP, easing: EASE_OUT, fill: 'forwards' },\n\t\t\t}\n}\n\nexport function surfaceAnimation(layout: OverlayLayout, direction: 'in' | 'out'): AnimationSpec {\n\tconst reduced = prefersReducedMotion()\n\n\tif (reduced) {\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 'centered':\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.92) translateY(16px)' },\n\t\t\t\t\t\t\t{ opacity: 1, transform: 'scale(1) 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: SPRING_SNAPPY.easingFallback,\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) translateY(0)' },\n\t\t\t\t\t\t\t{ opacity: 0, transform: 'scale(0.96) translateY(8px)' },\n\t\t\t\t\t\t],\n\t\t\t\t\t\toptions: { duration: DURATION_EXIT, easing: EASE_IN, fill: 'forwards' },\n\t\t\t\t\t}\n\n\t\tcase 'sheet':\n\t\t\treturn direction === 'in'\n\t\t\t\t? {\n\t\t\t\t\t\tkeyframes: [\n\t\t\t\t\t\t\t{ opacity: 0, transform: 'translateY(100%)' },\n\t\t\t\t\t\t\t{ opacity: 1, transform: 'translateY(0)' },\n\t\t\t\t\t\t],\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tduration: SPRING_GENTLE.duration,\n\t\t\t\t\t\t\teasing: SPRING_GENTLE.easingFallback,\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: EASE_IN,\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// No transform — CSS Anchor Positioning / Floating UI owns position.\n\t\t\t// Scale-from-origin via transform-origin would be nicer but conflicts\n\t\t\t// with popover top-layer + position. Keep opacity-only for safety.\n\t\t\treturn direction === 'in'\n\t\t\t\t? {\n\t\t\t\t\t\tkeyframes: [{ opacity: 0 }, { opacity: 1 }],\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: SPRING_SNAPPY.easingFallback,\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: [{ opacity: 1 }, { opacity: 0 }],\n\t\t\t\t\t\toptions: { duration: DURATION_EXIT, easing: EASE_IN, fill: 'forwards' },\n\t\t\t\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 * RxJS-native (rxjs skill principle 3: every async source is an Observable).\n * Returns an Observable that emits `'dismiss'` when the gesture passes the\n * distance/velocity threshold. Caller maps emissions to teardown.\n *\n * Thresholds are policy constants, not magic numbers.\n */\n\n/** Distance beyond which the gesture dismisses, in px. */\nexport const DISMISS_DISTANCE_PX = 80\n/** Distance beyond which the gesture dismisses, as a fraction of sheet height. */\nexport const DISMISS_DISTANCE_FRACTION = 0.3\n/** Velocity beyond which the gesture dismisses, in px per ms. */\nexport const DISMISS_VELOCITY_PX_PER_MS = 0.5\n/** Drag only starts if touchstart is within this top-px band (unless a drag handle is used). */\nexport const DRAG_START_TOP_PX = 40\n/** Snap-back spring duration when gesture doesn't pass threshold. */\nexport const SNAP_BACK_MS = 300\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 * Returns an Observable that emits exactly once when the user commits to\n * dismissing the sheet (threshold passed). The gesture is owned by the\n * caller — teardown fires on unsubscribe.\n *\n * During an in-progress drag, the surface's `transform` is updated\n * directly for 1:1 tracking. On release-but-not-dismissed, the surface\n * 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 startY = 0\n\t\tlet startTime = 0\n\t\tlet currentDelta = 0\n\n\t\tconst touchStart$ = fromEvent<TouchEvent>(dragTarget, 'touchstart', { passive: true }).pipe(\n\t\t\t// Pinch-zoom guard — only single-finger drags dismiss.\n\t\t\tfilter((e) => e.touches.length === 1),\n\t\t\t// If no drag handle, require start within the top band.\n\t\t\tfilter((e) => {\n\t\t\t\tif (dragHandle) return true\n\t\t\t\tconst touch = e.touches[0]\n\t\t\t\tconst rect = surface.getBoundingClientRect()\n\t\t\t\treturn touch.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\tstartY = e.touches[0].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}),\n\t\t)\n\n\t\tconst touchMove$ = fromEvent<TouchEvent>(surface, 'touchmove', { passive: false }).pipe(\n\t\t\tfilter(() => dragging),\n\t\t\tfilter((e) => e.touches.length === 1),\n\t\t\ttap((e) => {\n\t\t\t\tconst deltaY = e.touches[0].clientY - startY\n\t\t\t\t// Rubber-band on upward drag.\n\t\t\t\tcurrentDelta = deltaY < 0 ? deltaY * 0.2 : deltaY\n\t\t\t\tsurface.style.transform = `translateY(${currentDelta}px)`\n\t\t\t\te.preventDefault()\n\t\t\t}),\n\t\t)\n\n\t\tconst touchEnd$ = merge(\n\t\t\tfromEvent<TouchEvent>(surface, 'touchend', { passive: true }),\n\t\t\tfromEvent<TouchEvent>(surface, 'touchcancel', { passive: true }),\n\t\t).pipe(\n\t\t\tfilter(() => dragging),\n\t\t\ttap(() => {\n\t\t\t\tdragging = false\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 || (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 then 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(touchStart$, touchMove$, touchEnd$)\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","import type { Anchor, OverlayLayout } 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/** Below this viewport width, every overlay becomes a bottom sheet. */\nexport const NARROW_VIEWPORT_PX = 640\n\n/** Content taller than this fraction of viewport height → sheet. */\nexport const TALL_CONTENT_FRACTION = 0.8\n\n/** Content wider than this fraction of viewport width → sheet. */\nexport const WIDE_CONTENT_FRACTION = 0.9\n\n/** Floating UI / CSS anchor-positioning safety padding. */\nexport const ANCHOR_FIT_PADDING_PX = 16\n\nexport interface LayoutInputs {\n\tanchor?: Anchor\n\tcontent: { width: number; height: number }\n\tviewport: {\n\t\twidth: number\n\t\theight: number\n\t\t/** `matchMedia('(pointer: coarse)').matches` at call time. */\n\t\tisCoarsePointer: boolean\n\t}\n}\n\n/**\n * Priority order:\n * 1. viewport / content forces sheet\n * 2. anchor provided → anchored (the novel default)\n * 3. fallback → centered\n *\n * Floating UI's `flip` + `shift` + `size` middleware handles \"anchor\n * doesn't fit initially\" — it returns a fitting position rather than\n * rejecting. So step 2 does NOT branch on \"does the anchor fit?\";\n * Floating UI's output IS the answer. If content is genuinely too\n * large for any anchored position, step 1 already routed to sheet.\n */\nexport function resolveLayout(inputs: LayoutInputs): OverlayLayout {\n\tconst { anchor, content, viewport } = inputs\n\n\tconst isNarrow = viewport.width < NARROW_VIEWPORT_PX\n\tconst isCoarse = viewport.isCoarsePointer\n\tconst contentTall = content.height > viewport.height * TALL_CONTENT_FRACTION\n\tconst contentWide = content.width > viewport.width * WIDE_CONTENT_FRACTION\n\n\tif (isNarrow || isCoarse || contentTall || contentWide) {\n\t\treturn 'sheet'\n\t}\n\n\tif (anchor !== undefined) {\n\t\treturn 'anchored'\n\t}\n\n\treturn 'centered'\n}\n\n/**\n * Read the current viewport + pointer inputs. Separated so tests can\n * substitute synthetic inputs and the `resolveLayout` fn stays pure.\n */\nexport function readViewport(): LayoutInputs['viewport'] {\n\treturn {\n\t\twidth: window.innerWidth,\n\t\theight: window.innerHeight,\n\t\tisCoarsePointer: window.matchMedia('(pointer: coarse)').matches,\n\t}\n}\n","import { $LitElement } from '@mixins/index'\nimport { css, html, render as litRender, type TemplateResult } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { when } from 'lit/directives/when.js'\nimport {\n\tfilter,\n\tfromEvent,\n\tmerge,\n\tSubject,\n\ttake,\n\ttakeUntil,\n\ttap,\n} from 'rxjs'\nimport type { LazyComponent } from '../area/lazy'\nimport { surfaceAnimation } from './overlay.animations'\nimport { swipeToDismiss$ } from './overlay.gestures'\nimport {\n\tANCHOR_FIT_PADDING_PX,\n\treadViewport,\n\tresolveLayout,\n} from './overlay.layout'\nimport type {\n\tAnchor,\n\tCloseReason,\n\tContent,\n\tOverlayLayout,\n\tShowOptions,\n} from './overlay.types'\n\nconst MOUNT_POINT_ID = 'overlay-mount'\n\n/**\n * The single overlay element. Hosts a native `<dialog>` in its shadow\n * root for centered/sheet layouts; for anchored, we stay modeless by\n * using `<dialog>` with .show() (non-modal) + explicit positioning.\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 * dispatches `overlay-close` when closed; the service listens and\n * resolves the caller's Observable.\n */\n@customElement('schmancy-overlay')\nexport class SchmancyOverlay extends $LitElement(css`\n\t:host {\n\t\tposition: fixed;\n\t\tinset: 0;\n\t\tz-index: var(--schmancy-overlay-z, 10000);\n\t\tdisplay: contents;\n\t\tpointer-events: none;\n\t}\n\tdialog {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tborder: 0;\n\t\tbackground: transparent;\n\t\toverflow: visible;\n\t\tmax-width: none;\n\t\tmax-height: none;\n\t\tpointer-events: auto;\n\t}\n\tdialog::backdrop {\n\t\tbackground: rgba(12, 12, 16, 0.28);\n\t\tbackdrop-filter: blur(18px) saturate(150%);\n\t\t-webkit-backdrop-filter: blur(18px) saturate(150%);\n\t}\n\t.surface {\n\t\tposition: fixed;\n\t\tpointer-events: auto;\n\t\tmax-width: calc(100vw - 2rem);\n\t\tmax-height: 90dvh;\n\t\toverflow: auto;\n\t\tborder-radius: var(--schmancy-sys-shape-corner-large, 16px);\n\t\tbackground: var(--schmancy-sys-color-surface, #ffffff);\n\t\tbox-shadow: 0 24px 64px -16px rgba(0, 0, 0, 0.35);\n\t}\n\t.surface[data-layout='centered'] {\n\t\ttop: 50%;\n\t\tleft: 50%;\n\t\ttransform: translate(-50%, -50%);\n\t}\n\t.surface[data-layout='sheet'] {\n\t\tleft: 0;\n\t\tright: 0;\n\t\tbottom: 0;\n\t\tmax-width: none;\n\t\tmax-height: 90dvh;\n\t\twidth: 100%;\n\t\tborder-radius: var(--schmancy-sys-shape-corner-large, 16px) var(--schmancy-sys-shape-corner-large, 16px) 0 0;\n\t\tpadding-bottom: env(safe-area-inset-bottom);\n\t}\n\t.surface[data-layout='anchored'] {\n\t\tmax-width: min(480px, calc(100vw - 2rem));\n\t\tbox-shadow: 0 12px 32px -8px rgba(0, 0, 0, 0.28);\n\t}\n\t.drag-handle {\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\tpadding: 8px 0 4px;\n\t\ttouch-action: none;\n\t\tcursor: grab;\n\t}\n\t.drag-handle::before {\n\t\tcontent: '';\n\t\twidth: 40px;\n\t\theight: 4px;\n\t\tborder-radius: 999px;\n\t\tbackground: var(--schmancy-sys-color-outline-variant, #cac4cf);\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.surface { box-shadow: var(--schmancy-sys-elevation-2, 0 2px 6px rgba(0,0,0,0.2)); }\n\t}\n`) {\n\t@property({ type: String, reflect: true }) layout: OverlayLayout = 'centered'\n\t@property({ type: Boolean, reflect: true }) dismissable = true\n\t@property({ type: Boolean, reflect: true }) modal = true\n\n\t@query('dialog') private _dialog!: HTMLDialogElement\n\t@query('.surface') private _surface!: HTMLDivElement\n\n\t/** Close trigger for the service; emits the reason + detail payload. */\n\tprivate readonly _closed$ = new Subject<{ reason: CloseReason; result?: unknown }>()\n\n\tprivate _mounted = false\n\tprivate _closing = false\n\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. Returns a promise that resolves\n\t * when the entrance 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\n\t\t// Resolve Content → HTMLElement and mount into the slot host.\n\t\tawait this.updateComplete\n\t\tconst mount = this.renderRoot.querySelector(`#${MOUNT_POINT_ID}`) as HTMLElement | null\n\t\tif (!mount) throw new Error('schmancy-overlay: mount point missing')\n\t\tawait mountContent(content, mount, options.props)\n\n\t\t// Measure content after mount for layout dispatch.\n\t\tconst viewport = readViewport()\n\t\tconst contentSize = {\n\t\t\twidth: mount.scrollWidth,\n\t\t\theight: mount.scrollHeight,\n\t\t}\n\t\tconst resolved = resolveLayout({\n\t\t\tanchor: options.anchor,\n\t\t\tcontent: contentSize,\n\t\t\tviewport,\n\t\t})\n\t\tthis.layout = resolved\n\n\t\t// Modal defaults per layout, with the caller's `modal` as escape hatch.\n\t\tconst isModal =\n\t\t\toptions.modal ?? (resolved === 'centered' || resolved === 'sheet')\n\t\tthis.modal = isModal\n\n\t\tawait this.updateComplete\n\n\t\t// Open the native <dialog>.\n\t\tif (isModal) {\n\t\t\tthis._dialog.showModal()\n\t\t} else {\n\t\t\tthis._dialog.show()\n\t\t}\n\n\t\t// For anchored mode, compute position from the anchor's rect.\n\t\tif (resolved === 'anchored' && options.anchor) {\n\t\t\tthis.positionAnchored(options.anchor)\n\t\t}\n\n\t\t// Wire close triggers: native 'close' event, structured 'close' from\n\t\t// content, backdrop click, swipe gesture. Signal aborts close too.\n\t\tthis.wireCloseTriggers(options.signal)\n\n\t\t// Play entrance animations.\n\t\tawait this.playEnterAnimations()\n\t}\n\n\t/** Play exit animations then close the native dialog. */\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.playExitAnimations()\n\t\t} catch {\n\t\t\t// animation can be cancelled — not an error.\n\t\t}\n\t\ttry {\n\t\t\tthis._dialog?.close()\n\t\t} catch {\n\t\t\t// Already closed natively — fine.\n\t\t}\n\t\tthis._closed$.next({ reason, result })\n\t\tthis._closed$.complete()\n\t}\n\n\t/* ---------------- close trigger wiring ------------------------------ */\n\n\tprivate wireCloseTriggers(signal?: AbortSignal): void {\n\t\tconst disconnecting = this.disconnecting\n\n\t\t// Native 'close' from <dialog>. Runs on Esc, on form[method=dialog]\n\t\t// submit, and on our own close() call. returnValue carries the native\n\t\t// string result.\n\t\tfromEvent(this._dialog, 'close')\n\t\t\t.pipe(\n\t\t\t\tfilter(() => !this._closing),\n\t\t\t\ttap(() => {\n\t\t\t\t\tconst rv = this._dialog.returnValue\n\t\t\t\t\tif (rv !== '' && rv !== undefined) {\n\t\t\t\t\t\tvoid this.close('native-submit', rv)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvoid this.close('escape')\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\ttakeUntil(disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\n\t\t// Structured close — content dispatches CustomEvent('close', { detail }).\n\t\tfromEvent<CustomEvent>(this, 'close')\n\t\t\t.pipe(\n\t\t\t\t// Filter out the native <dialog>.close event (which is a plain Event,\n\t\t\t\t// no .detail — but it still bubbles into this listener target as 'close').\n\t\t\t\tfilter((e) => e instanceof CustomEvent),\n\t\t\t\t// Don't re-enter if we're the source.\n\t\t\t\tfilter((e) => e.target !== this._dialog),\n\t\t\t\ttap((e) => {\n\t\t\t\t\te.stopPropagation()\n\t\t\t\t\tvoid this.close('structured', e.detail)\n\t\t\t\t}),\n\t\t\t\ttakeUntil(disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\n\t\t// Esc keydown — native dialog handles; we only intercept to honor `dismissable: false`.\n\t\tfromEvent<KeyboardEvent>(this._dialog, 'cancel')\n\t\t\t.pipe(\n\t\t\t\ttap((e) => {\n\t\t\t\t\tif (!this.dismissable) e.preventDefault()\n\t\t\t\t}),\n\t\t\t\ttakeUntil(disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\n\t\t// Backdrop click — native backdrop clicks bubble to the dialog.\n\t\tfromEvent<MouseEvent>(this._dialog, 'click')\n\t\t\t.pipe(\n\t\t\t\tfilter((e) => this.dismissable && e.target === this._dialog),\n\t\t\t\ttap(() => void this.close('backdrop')),\n\t\t\t\ttakeUntil(disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\n\t\t// Swipe-to-dismiss for sheet layout only.\n\t\tif (this.layout === 'sheet' && this.dismissable) {\n\t\t\tconst dragHandle = this.renderRoot.querySelector<HTMLElement>('.drag-handle')\n\t\t\tswipeToDismiss$({\n\t\t\t\tsurface: this._surface,\n\t\t\t\tdragHandle,\n\t\t\t\tuntil$: merge(disconnecting, this._closed$),\n\t\t\t})\n\t\t\t\t.pipe(take(1))\n\t\t\t\t.subscribe(() => void this.close('swipe'))\n\t\t}\n\n\t\t// AbortSignal — standard cancellation input.\n\t\tif (signal) {\n\t\t\tif (signal.aborted) {\n\t\t\t\tqueueMicrotask(() => void this.close('abort'))\n\t\t\t} else {\n\t\t\t\tfromEvent(signal, 'abort')\n\t\t\t\t\t.pipe(\n\t\t\t\t\t\ttake(1),\n\t\t\t\t\t\ttap(() => void this.close('abort')),\n\t\t\t\t\t\ttakeUntil(disconnecting),\n\t\t\t\t\t)\n\t\t\t\t\t.subscribe()\n\t\t\t}\n\t\t}\n\t}\n\n\t/* ---------------- anchored positioning ----------------------------- */\n\n\tprivate positionAnchored(anchor: Anchor): void {\n\t\tconst rect = getAnchorRect(anchor)\n\t\tconst surfaceRect = this._surface.getBoundingClientRect()\n\t\tconst viewport = { w: window.innerWidth, h: window.innerHeight }\n\t\tconst pad = ANCHOR_FIT_PADDING_PX\n\n\t\t// Prefer placing below the anchor; flip above if it doesn't fit.\n\t\tlet top = rect.bottom + 8\n\t\tif (top + surfaceRect.height > viewport.h - pad) {\n\t\t\tconst above = rect.top - 8 - surfaceRect.height\n\t\t\tif (above >= pad) top = above\n\t\t\telse top = Math.max(pad, viewport.h - pad - surfaceRect.height)\n\t\t}\n\n\t\t// Prefer aligning the surface's left to the anchor's left; shift to keep in viewport.\n\t\tlet left = rect.left\n\t\tif (left + surfaceRect.width > viewport.w - pad) {\n\t\t\tleft = viewport.w - pad - surfaceRect.width\n\t\t}\n\t\tif (left < pad) left = pad\n\n\t\tthis._surface.style.top = `${top}px`\n\t\tthis._surface.style.left = `${left}px`\n\t\tthis._surface.style.transform = 'none'\n\t}\n\n\t/* ---------------- animations --------------------------------------- */\n\n\tprivate async playEnterAnimations(): Promise<void> {\n\t\tconst dialogEl = this._dialog\n\t\tconst surface = this._surface\n\t\tif (!dialogEl || !surface) return\n\n\t\t// Backdrop animates on the dialog itself via the ::backdrop pseudo,\n\t\t// which WAAPI can't drive; we rely on CSS transition if desired.\n\t\tconst spec = surfaceAnimation(this.layout, 'in')\n\t\tawait surface.animate(spec.keyframes, spec.options).finished.catch(() => undefined)\n\t}\n\n\tprivate async playExitAnimations(): Promise<void> {\n\t\tconst surface = this._surface\n\t\tif (!surface) return\n\t\tconst spec = surfaceAnimation(this.layout, 'out')\n\t\tawait surface.animate(spec.keyframes, spec.options).finished.catch(() => undefined)\n\t}\n\n\t/* ---------------- render ------------------------------------------- */\n\n\tprotected render(): TemplateResult {\n\t\treturn html`\n\t\t\t<dialog>\n\t\t\t\t<section\n\t\t\t\t\tclass=\"surface\"\n\t\t\t\t\tdata-layout=${this.layout}\n\t\t\t\t\trole=\"dialog\"\n\t\t\t\t\taria-modal=${this.modal ? 'true' : 'false'}\n\t\t\t\t>\n\t\t\t\t\t${when(\n\t\t\t\t\t\tthis.layout === 'sheet',\n\t\t\t\t\t\t() => html`<div class=\"drag-handle\" role=\"button\" aria-label=\"Dismiss\" tabindex=\"0\"></div>`,\n\t\t\t\t\t)}\n\t\t\t\t\t<div id=${MOUNT_POINT_ID}></div>\n\t\t\t\t</section>\n\t\t\t</dialog>\n\t\t`\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 path — 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, then recurse with the default export.\n\tif (isLazy(content)) {\n\t\tconst mod = await content()\n\t\treturn mountContent(mod.default, host, props)\n\t}\n\n\t// Class constructor — narrowed by exclusion of TemplateResult / HTMLElement /\n\t// LazyComponent above; isLazy() false means the remaining `function` branch\n\t// is a CustomElementConstructor.\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 isTemplateResult(x: unknown): x is TemplateResult {\n\treturn typeof x === 'object' && x !== null && '_$litType$' in x\n}\n\nfunction isLazy(x: unknown): x is LazyComponent {\n\treturn typeof x === 'function' && ('preload' in (x as object) || '_promise' in (x as object))\n}\n\ninterface Rect {\n\ttop: number\n\tleft: number\n\tright: number\n\tbottom: number\n\twidth: number\n\theight: number\n}\n\nfunction getAnchorRect(anchor: Anchor): Rect {\n\tif (anchor instanceof Element) {\n\t\tconst r = anchor.getBoundingClientRect()\n\t\treturn { top: r.top, left: r.left, right: r.right, bottom: r.bottom, width: r.width, height: r.height }\n\t}\n\tif ('clientX' in anchor && 'clientY' in anchor) {\n\t\treturn {\n\t\t\ttop: anchor.clientY,\n\t\t\tleft: anchor.clientX,\n\t\t\tright: anchor.clientX,\n\t\t\tbottom: anchor.clientY,\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t}\n\t}\n\tconst pt = anchor as { x: number; y: number }\n\treturn { top: pt.y, left: pt.x, right: pt.x, bottom: pt.y, width: 0, height: 0 }\n}\n","import { $LitElement } from '@mixins/index'\nimport { css, html, nothing, 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'\n\n/**\n * Internal body component used by the `confirm()` / `prompt()` sugar.\n *\n * Minimal, dependency-free — plain HTML buttons / input so this file\n * doesn't need to import schmancy-form / schmancy-button (avoids the\n * risk of circular module graphs during early imports of $overlay).\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 $LitElement(css`\n\t:host {\n\t\tdisplay: block;\n\t\tpadding: 20px 24px;\n\t\tmin-width: 280px;\n\t\tmax-width: 480px;\n\t\tcolor: var(--schmancy-sys-color-on-surface, #1a1a1a);\n\t\tbackground: var(--schmancy-sys-color-surface, #ffffff);\n\t\tborder-radius: var(--schmancy-sys-shape-corner-large, 16px);\n\t\tbox-shadow: 0 10px 40px rgba(0, 0, 0, 0.12);\n\t}\n\t:host([variant='danger']) .cta-confirm {\n\t\tbackground: var(--schmancy-sys-color-error, #b3261e);\n\t\tcolor: var(--schmancy-sys-color-on-error, #ffffff);\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' }) inputType: string = 'text'\n\t@property({ type: String }) pattern?: string\n\t@property({ type: Boolean }) required = false\n\n\t@query('input') private _input?: HTMLInputElement\n\n\toverride firstUpdated(): void {\n\t\t// Focus the confirm button in confirm mode; focus the input in prompt mode.\n\t\tif (this.mode === 'prompt') {\n\t\t\tqueueMicrotask(() => this._input?.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\tconst input = this._input\n\t\t\tif (input && !input.reportValidity()) return\n\t\t\tthis.dismiss(input?.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<form @submit=${this.handleSubmit}>\n\t\t\t\t${when(\n\t\t\t\t\tthis.heading,\n\t\t\t\t\t() => html`<h2 class=\"text-lg font-semibold mb-1\">${this.heading}</h2>`,\n\t\t\t\t)}\n\t\t\t\t${when(\n\t\t\t\t\tthis.subtitle,\n\t\t\t\t\t() => html`<p class=\"text-sm opacity-70 mb-2\">${this.subtitle}</p>`,\n\t\t\t\t)}\n\t\t\t\t${choose(\n\t\t\t\t\tthis.mode,\n\t\t\t\t\t[\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t'prompt',\n\t\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t\t${when(this.label, () => html`<label class=\"block text-sm mb-1\">${this.label}</label>`)}\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\ttype=${this.inputType}\n\t\t\t\t\t\t\t\t\t.value=${this.defaultValue}\n\t\t\t\t\t\t\t\t\tplaceholder=${this.placeholder ?? nothing}\n\t\t\t\t\t\t\t\t\tpattern=${this.pattern ?? nothing}\n\t\t\t\t\t\t\t\t\t?required=${this.required}\n\t\t\t\t\t\t\t\t\tclass=\"w-full px-3 py-2 rounded-md border border-outline-variant text-base mb-2\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t${when(\n\t\t\t\t\t\t\t\t\tthis.message,\n\t\t\t\t\t\t\t\t\t() => html`<p class=\"text-sm mb-3\">${this.message}</p>`,\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\t() => html`${when(this.message, () => html`<p class=\"text-sm mb-4\">${this.message}</p>`)}`,\n\t\t\t\t)}\n\n\t\t\t\t<div class=\"flex justify-end gap-2 mt-4\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t@click=${this.handleCancel}\n\t\t\t\t\t\tclass=\"px-4 py-2 rounded-md border border-outline-variant bg-transparent cursor-pointer\"\n\t\t\t\t\t>\n\t\t\t\t\t\t${this.cancelText}\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\tclass=\"cta-confirm px-4 py-2 rounded-md border-0 bg-primary text-on-primary cursor-pointer font-medium\"\n\t\t\t\t\t>\n\t\t\t\t\t\t${this.confirmText}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</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","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/** Top entry (LIFO). Undefined when stack is empty. */\nexport function topEntry(): OverlayEntry | undefined {\n\tconst s = stack$$.value\n\treturn s[s.length - 1]\n}\n\n/* ---------------- scroll lock -------------------------------------------- */\n\n/**\n * Ref-counted body scroll lock, derived from the stack's length.\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 is still\n * 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.length > 0),\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\tdefer,\n\tdefaultIfEmpty,\n\tdistinctUntilChanged,\n\tEMPTY,\n\tfirstValueFrom,\n\tfromEvent,\n\tmap,\n\tmerge,\n\tObservable,\n\tSubject,\n\tswitchMap,\n\ttake,\n\ttakeUntil,\n} from 'rxjs'\nimport type { THistoryStrategy } from '../area/router.types'\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 * 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\treturn new Observable<T | undefined>((subscriber) => {\n\t\t\tlet el: SchmancyOverlay | null = null\n\t\t\tlet entry: OverlayEntry | null = null\n\t\t\tlet historyPushed = false\n\t\t\tlet settled = false\n\n\t\t\tconst teardown$ = new Subject<void>()\n\n\t\t\tconst mount = async () => {\n\t\t\t\ttry {\n\t\t\t\t\t// Create and append the overlay element.\n\t\t\t\t\tel = document.createElement('schmancy-overlay') as SchmancyOverlay\n\t\t\t\t\t;(document.body ?? document.documentElement).appendChild(el)\n\t\t\t\t\tawait el.updateComplete\n\n\t\t\t\t\t// Open it — mount content, resolve layout, animate in.\n\t\t\t\t\tawait el.open(content, options)\n\n\t\t\t\t\t// Register with the stack (post-open so layout is resolved).\n\t\t\t\t\tconst id = generateId()\n\t\t\t\t\tentry = {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\telement: el,\n\t\t\t\t\t\tlayout: el.layout,\n\t\t\t\t\t}\n\t\t\t\t\tpushEntry(entry)\n\n\t\t\t\t\t// Register modality for the stack-aware inert manager when modal.\n\t\t\t\t\tif (el.modal && el.parentElement) {\n\t\t\t\t\t\tmarkModal(id, el)\n\t\t\t\t\t}\n\n\t\t\t\t\t// History integration — push a sentinel unless silent.\n\t\t\t\t\tconst strategy: THistoryStrategy = options.historyStrategy ?? 'push'\n\t\t\t\t\tif (strategy === 'push') {\n\t\t\t\t\t\thistory.pushState({ __schmancyOverlayId: id }, '', location.href)\n\t\t\t\t\t\thistoryPushed = true\n\t\t\t\t\t} else if (strategy === 'replace') {\n\t\t\t\t\t\thistory.replaceState({ __schmancyOverlayId: id }, '', location.href)\n\t\t\t\t\t}\n\n\t\t\t\t\t// popstate — close this overlay when the user hits back past us.\n\t\t\t\t\t// If another overlay's popstate fires first, that's fine; each overlay\n\t\t\t\t\t// handles its own via this listener.\n\t\t\t\t\tif (historyPushed) {\n\t\t\t\t\t\tfromEvent<PopStateEvent>(window, 'popstate')\n\t\t\t\t\t\t\t.pipe(take(1), takeUntil(teardown$))\n\t\t\t\t\t\t\t.subscribe(() => {\n\t\t\t\t\t\t\t\t// Avoid double-pop on teardown — set settled so the\n\t\t\t\t\t\t\t\t// teardown fn doesn't call history.back() again.\n\t\t\t\t\t\t\t\tsettled = true\n\t\t\t\t\t\t\t\tvoid el?.close('popstate')\n\t\t\t\t\t\t\t})\n\t\t\t\t\t}\n\n\t\t\t\t\t// Subscribe to the element's internal close$ — the single source of\n\t\t\t\t\t// truth for lifecycle completion. Emits reason + optional result.\n\t\t\t\t\tel.closed$.pipe(take(1), takeUntil(teardown$)).subscribe(({ result }) => {\n\t\t\t\t\t\tsettled = true\n\t\t\t\t\t\tsubscriber.next(result as T | undefined)\n\t\t\t\t\t\tsubscriber.complete()\n\t\t\t\t\t})\n\t\t\t\t} catch (err) {\n\t\t\t\t\tsubscriber.error(err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvoid mount()\n\n\t\t\treturn () => {\n\t\t\t\tteardown$.next()\n\t\t\t\tteardown$.complete()\n\n\t\t\t\t// Unsubscribe path — caller cancelled. Tear down the overlay.\n\t\t\t\tif (el && !settled) {\n\t\t\t\t\tvoid el.close('programmatic')\n\t\t\t\t}\n\n\t\t\t\t// Clean up registry entries.\n\t\t\t\tif (entry) {\n\t\t\t\t\tunmarkModal(entry.id)\n\t\t\t\t\tremoveEntry(entry.id)\n\t\t\t\t}\n\n\t\t\t\t// Pop history if we pushed one and it's still current.\n\t\t\t\tif (historyPushed && !settled) {\n\t\t\t\t\t// Check before calling — if the user already popped, this is a noop.\n\t\t\t\t\tif (history.state?.__schmancyOverlayId === entry?.id) {\n\t\t\t\t\t\thistory.back()\n\t\t\t\t\t}\n\t\t\t\t\thistoryPushed = false\n\t\t\t\t}\n\n\t\t\t\t// Remove element after exit animation has had a chance to play.\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\tel?.remove()\n\t\t\t\t\tel = null\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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"}