@mhmo91/schmancy 0.10.28 → 0.10.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/custom-elements.json +7 -2
  2. package/dist/SchmancyElement-BQ4DFufc.js +300 -0
  3. package/dist/SchmancyElement-BQ4DFufc.js.map +1 -0
  4. package/dist/SchmancyElement-DhSiMp6Y.cjs +2 -0
  5. package/dist/SchmancyElement-DhSiMp6Y.cjs.map +1 -0
  6. package/dist/agent/{flow-3RrZM-e7.js.map → flow-CvG1fLW5.js.map} +1 -1
  7. package/dist/agent/schmancy.agent.js +7843 -3334
  8. package/dist/agent/schmancy.agent.js.map +1 -1
  9. package/dist/agent/schmancy.manifest.json +1 -2
  10. package/dist/agent/{vendor-material-color-33Mj762T.js.map → vendor-material-color-DcL7ZPxx.js.map} +1 -1
  11. package/dist/animation-CCOIW4wJ.cjs.map +1 -1
  12. package/dist/animation-DCznELuT.js.map +1 -1
  13. package/dist/{area-C_Yvjmad.js → area-BjpUWvzE.js} +7 -7
  14. package/dist/{area-C_Yvjmad.js.map → area-BjpUWvzE.js.map} +1 -1
  15. package/dist/area-CgTzkxah.cjs +21 -0
  16. package/dist/{area-BSVOYQDA.cjs.map → area-CgTzkxah.cjs.map} +1 -1
  17. package/dist/area.cjs +1 -1
  18. package/dist/area.js +1 -1
  19. package/dist/{audio-CxO5a2HL.js → audio-CwBJntnB.js} +1 -1
  20. package/dist/{audio-CxO5a2HL.js.map → audio-CwBJntnB.js.map} +1 -1
  21. package/dist/{audio-Cvmemu84.cjs → audio-DISBFOaR.cjs} +1 -1
  22. package/dist/{audio-Cvmemu84.cjs.map → audio-DISBFOaR.cjs.map} +1 -1
  23. package/dist/audio.cjs +1 -1
  24. package/dist/audio.js +2 -2
  25. package/dist/{autocomplete-B50VXUzw.cjs → autocomplete-DbCUOgWU.cjs} +2 -2
  26. package/dist/{autocomplete-B50VXUzw.cjs.map → autocomplete-DbCUOgWU.cjs.map} +1 -1
  27. package/dist/{autocomplete-C6I1mfOT.js → autocomplete-Dy708jem.js} +7 -7
  28. package/dist/{autocomplete-C6I1mfOT.js.map → autocomplete-Dy708jem.js.map} +1 -1
  29. package/dist/autocomplete.cjs +1 -1
  30. package/dist/autocomplete.js +1 -1
  31. package/dist/avatar.cjs +3 -3
  32. package/dist/avatar.cjs.map +1 -1
  33. package/dist/avatar.js +5 -5
  34. package/dist/avatar.js.map +1 -1
  35. package/dist/badge.cjs +1 -1
  36. package/dist/badge.js +1 -1
  37. package/dist/{boat-DVQBNkk5.cjs → boat-BzZN_iwp.cjs} +11 -11
  38. package/dist/{boat-DVQBNkk5.cjs.map → boat-BzZN_iwp.cjs.map} +1 -1
  39. package/dist/{boat-C94QZ4Zt.js → boat-Z4Lzl3ai.js} +8 -8
  40. package/dist/{boat-C94QZ4Zt.js.map → boat-Z4Lzl3ai.js.map} +1 -1
  41. package/dist/boat.cjs +1 -1
  42. package/dist/boat.js +1 -1
  43. package/dist/breadcrumb.cjs +4 -4
  44. package/dist/breadcrumb.cjs.map +1 -1
  45. package/dist/breadcrumb.js +7 -7
  46. package/dist/breadcrumb.js.map +1 -1
  47. package/dist/{busy--bNb42rM.js → busy-CRFGPkcP.js} +7 -7
  48. package/dist/{busy--bNb42rM.js.map → busy-CRFGPkcP.js.map} +1 -1
  49. package/dist/{busy-DuxFvEkY.cjs → busy-Cu-47DfN.cjs} +8 -8
  50. package/dist/{busy-DuxFvEkY.cjs.map → busy-Cu-47DfN.cjs.map} +1 -1
  51. package/dist/busy.cjs +1 -1
  52. package/dist/busy.js +1 -1
  53. package/dist/{button-DAFZ5A4O.cjs → button-CN_JTjRd.cjs} +15 -15
  54. package/dist/{button-DAFZ5A4O.cjs.map → button-CN_JTjRd.cjs.map} +1 -1
  55. package/dist/{button-B7b9L_h5.js → button-D_USF3tt.js} +10 -10
  56. package/dist/{button-B7b9L_h5.js.map → button-D_USF3tt.js.map} +1 -1
  57. package/dist/button.cjs +19 -19
  58. package/dist/button.cjs.map +1 -1
  59. package/dist/button.js +9 -9
  60. package/dist/button.js.map +1 -1
  61. package/dist/{card-DZPd24Sn.cjs → card-D4P5_gg9.cjs} +10 -10
  62. package/dist/{card-DZPd24Sn.cjs.map → card-D4P5_gg9.cjs.map} +1 -1
  63. package/dist/{card-ixzxOW-Q.js → card-DpN5KIYc.js} +15 -15
  64. package/dist/{card-ixzxOW-Q.js.map → card-DpN5KIYc.js.map} +1 -1
  65. package/dist/card.cjs +1 -1
  66. package/dist/card.js +1 -1
  67. package/dist/{checkbox-DdGpepTh.js → checkbox-C8ChypKf.js} +5 -5
  68. package/dist/{checkbox-DdGpepTh.js.map → checkbox-C8ChypKf.js.map} +1 -1
  69. package/dist/{checkbox-Bi_Fm2mf.cjs → checkbox-hhXVXDV1.cjs} +3 -3
  70. package/dist/{checkbox-Bi_Fm2mf.cjs.map → checkbox-hhXVXDV1.cjs.map} +1 -1
  71. package/dist/checkbox.cjs +1 -1
  72. package/dist/checkbox.js +1 -1
  73. package/dist/{chips-DLTynyVB.js → chips-B8R9q4yl.js} +27 -27
  74. package/dist/{chips-DLTynyVB.js.map → chips-B8R9q4yl.js.map} +1 -1
  75. package/dist/{chips-DWQMZErr.cjs → chips-BTLlO_Ow.cjs} +18 -18
  76. package/dist/{chips-DWQMZErr.cjs.map → chips-BTLlO_Ow.cjs.map} +1 -1
  77. package/dist/chips.cjs +1 -1
  78. package/dist/chips.js +2 -2
  79. package/dist/connectivity.cjs +7 -7
  80. package/dist/connectivity.cjs.map +1 -1
  81. package/dist/connectivity.js +5 -5
  82. package/dist/connectivity.js.map +1 -1
  83. package/dist/content-drawer.cjs +1 -1
  84. package/dist/content-drawer.js +1 -1
  85. package/dist/cursor-glow-Ah7VXSj7.js.map +1 -1
  86. package/dist/cursor-glow-Bulq-38P.cjs.map +1 -1
  87. package/dist/{date-range-DQpmMJH-.cjs → date-range-9h6ZSkZb.cjs} +3 -3
  88. package/dist/{date-range-DQpmMJH-.cjs.map → date-range-9h6ZSkZb.cjs.map} +1 -1
  89. package/dist/{date-range-CJ6MiTpF.js → date-range-CS96dWMh.js} +7 -7
  90. package/dist/{date-range-CJ6MiTpF.js.map → date-range-CS96dWMh.js.map} +1 -1
  91. package/dist/date-range-inline-CAxnHA-l.cjs +43 -0
  92. package/dist/{date-range-inline-nPWIs-3C.cjs.map → date-range-inline-CAxnHA-l.cjs.map} +1 -1
  93. package/dist/{date-range-inline-Ho3CENTh.js → date-range-inline-DCXdGeRv.js} +5 -5
  94. package/dist/{date-range-inline-Ho3CENTh.js.map → date-range-inline-DCXdGeRv.js.map} +1 -1
  95. package/dist/date-range-inline.cjs +1 -1
  96. package/dist/date-range-inline.js +1 -1
  97. package/dist/date-range.cjs +1 -1
  98. package/dist/date-range.js +1 -1
  99. package/dist/delay.cjs +4 -4
  100. package/dist/delay.cjs.map +1 -1
  101. package/dist/delay.js +6 -6
  102. package/dist/delay.js.map +1 -1
  103. package/dist/{details-BnRWMZdt.cjs → details-BC0IObBd.cjs} +2 -2
  104. package/dist/{details-BnRWMZdt.cjs.map → details-BC0IObBd.cjs.map} +1 -1
  105. package/dist/{details-CcMTvYo7.js → details-Pgd0slKn.js} +11 -11
  106. package/dist/{details-CcMTvYo7.js.map → details-Pgd0slKn.js.map} +1 -1
  107. package/dist/details.cjs +1 -1
  108. package/dist/details.js +1 -1
  109. package/dist/{directives-DgPbz0lQ.js → directives-B-RT9R2u.js} +3 -3
  110. package/dist/{directives-DgPbz0lQ.js.map → directives-B-RT9R2u.js.map} +1 -1
  111. package/dist/{directives-BkSqmLBV.cjs → directives-CFWacnWU.cjs} +1 -1
  112. package/dist/{directives-BkSqmLBV.cjs.map → directives-CFWacnWU.cjs.map} +1 -1
  113. package/dist/directives.cjs +1 -1
  114. package/dist/directives.js +2 -2
  115. package/dist/discovery.service-CIa3Eeuk.cjs.map +1 -1
  116. package/dist/discovery.service-DZFxtRwW.js.map +1 -1
  117. package/dist/{divider-CZCj0ioH.js → divider-BMzm0lOz.js} +5 -5
  118. package/dist/{divider-CZCj0ioH.js.map → divider-BMzm0lOz.js.map} +1 -1
  119. package/dist/{divider-C6yJSL1c.cjs → divider-D1OzaRAQ.cjs} +3 -3
  120. package/dist/{divider-C6yJSL1c.cjs.map → divider-D1OzaRAQ.cjs.map} +1 -1
  121. package/dist/divider.cjs +1 -1
  122. package/dist/divider.js +1 -1
  123. package/dist/dropdown.cjs +4 -4
  124. package/dist/dropdown.cjs.map +1 -1
  125. package/dist/dropdown.js +8 -8
  126. package/dist/dropdown.js.map +1 -1
  127. package/dist/{expand-Cc6ogXsR.js → expand-C0Uqxfv0.js} +10 -10
  128. package/dist/{expand-Cc6ogXsR.js.map → expand-C0Uqxfv0.js.map} +1 -1
  129. package/dist/{expand-D4EhwOYh.cjs → expand-CiQkzth9.cjs} +3 -3
  130. package/dist/{expand-D4EhwOYh.cjs.map → expand-CiQkzth9.cjs.map} +1 -1
  131. package/dist/expand.cjs +1 -1
  132. package/dist/expand.js +1 -1
  133. package/dist/float-Bu_IfKRd.cjs +1 -0
  134. package/dist/{float-B8EPc_OG.cjs.map → float-Bu_IfKRd.cjs.map} +1 -1
  135. package/dist/{float-BvI3HTtB.js → float-DwBMXhek.js} +2 -2
  136. package/dist/{float-BvI3HTtB.js.map → float-DwBMXhek.js.map} +1 -1
  137. package/dist/float.cjs +1 -1
  138. package/dist/float.js +1 -1
  139. package/dist/{form-FtYtZScl.js → form-B9Je2W_m.js} +15 -95
  140. package/dist/form-B9Je2W_m.js.map +1 -0
  141. package/dist/{form-SHg5FLsd.cjs → form-BnbAVZyf.cjs} +4 -19
  142. package/dist/form-BnbAVZyf.cjs.map +1 -0
  143. package/dist/form.cjs +18 -1
  144. package/dist/form.cjs.map +1 -0
  145. package/dist/form.js +93 -9
  146. package/dist/form.js.map +1 -0
  147. package/dist/gravity-6pL6CfIr.cjs.map +1 -1
  148. package/dist/gravity-sVK3zGBF.js.map +1 -1
  149. package/dist/handover/agent-runtime-followups.md +1 -1
  150. package/dist/handover/agent-runtime-v1.md +3 -3
  151. package/dist/hashContent-BqU6v1Xr.js.map +1 -1
  152. package/dist/hashContent-iRZJJWtE.cjs.map +1 -1
  153. package/dist/{icon-CgIXAvKI.cjs → icons-BfWQl5k5.cjs} +6 -6
  154. package/dist/icons-BfWQl5k5.cjs.map +1 -0
  155. package/dist/{icon-B1eZr2ZL.js → icons-DJHPXKgR.js} +4 -4
  156. package/dist/{icon-CgIXAvKI.cjs.map → icons-DJHPXKgR.js.map} +1 -1
  157. package/dist/icons.cjs +1 -1
  158. package/dist/icons.js +1 -1
  159. package/dist/{iframe-CmpAZc61.js → iframe-DLz8ll0s.js} +5 -5
  160. package/dist/{iframe-CmpAZc61.js.map → iframe-DLz8ll0s.js.map} +1 -1
  161. package/dist/{iframe-BO3BpRLH.cjs → iframe-UtczJypj.cjs} +5 -5
  162. package/dist/{iframe-BO3BpRLH.cjs.map → iframe-UtczJypj.cjs.map} +1 -1
  163. package/dist/iframe.cjs +1 -1
  164. package/dist/iframe.js +1 -1
  165. package/dist/index.cjs +1 -1
  166. package/dist/index.js +69 -69
  167. package/dist/{input-_Hft9vov.js → input-AQbBEj2f.js} +15 -15
  168. package/dist/{input-_Hft9vov.js.map → input-AQbBEj2f.js.map} +1 -1
  169. package/dist/{input-5YL2oUBr.cjs → input-Pp6A1m3s.cjs} +2 -2
  170. package/dist/{input-5YL2oUBr.cjs.map → input-Pp6A1m3s.cjs.map} +1 -1
  171. package/dist/{input-chip-DKMNpcED.cjs → input-chip-B5vYNuEm.cjs} +9 -9
  172. package/dist/{input-chip-DKMNpcED.cjs.map → input-chip-B5vYNuEm.cjs.map} +1 -1
  173. package/dist/{input-chip-BNTojQT6.js → input-chip-Bbs_gXOB.js} +10 -10
  174. package/dist/{input-chip-BNTojQT6.js.map → input-chip-Bbs_gXOB.js.map} +1 -1
  175. package/dist/input.cjs +1 -1
  176. package/dist/input.js +1 -1
  177. package/dist/json.cjs +3 -3
  178. package/dist/json.cjs.map +1 -1
  179. package/dist/json.js +5 -5
  180. package/dist/json.js.map +1 -1
  181. package/dist/kbd.cjs +2 -2
  182. package/dist/kbd.cjs.map +1 -1
  183. package/dist/kbd.js +5 -5
  184. package/dist/kbd.js.map +1 -1
  185. package/dist/{layout-DSAjo92m.js → layout-9K1zxhZn.js} +1 -1
  186. package/dist/{layout-DSAjo92m.js.map → layout-9K1zxhZn.js.map} +1 -1
  187. package/dist/{layout-eXb9wjDh.cjs → layout-B0dct--7.cjs} +1 -1
  188. package/dist/{layout-eXb9wjDh.cjs.map → layout-B0dct--7.cjs.map} +1 -1
  189. package/dist/layout.cjs +2 -2
  190. package/dist/layout.cjs.map +1 -1
  191. package/dist/layout.js +7 -7
  192. package/dist/layout.js.map +1 -1
  193. package/dist/lazy-CayEFyC3.cjs.map +1 -1
  194. package/dist/lazy-D-bO2r4m.js.map +1 -1
  195. package/dist/{lightbox-t4dvb8_A.cjs → lightbox-D_EizrG3.cjs} +21 -21
  196. package/dist/{lightbox-t4dvb8_A.cjs.map → lightbox-D_EizrG3.cjs.map} +1 -1
  197. package/dist/{lightbox-CKlYcnHV.js → lightbox-DmJTs2My.js} +9 -9
  198. package/dist/{lightbox-CKlYcnHV.js.map → lightbox-DmJTs2My.js.map} +1 -1
  199. package/dist/lightbox.cjs +1 -1
  200. package/dist/lightbox.js +1 -1
  201. package/dist/{list-21mWtDKg.cjs → list-BSn8czyO.cjs} +5 -5
  202. package/dist/{list-21mWtDKg.cjs.map → list-BSn8czyO.cjs.map} +1 -1
  203. package/dist/{list-B6QhxgRJ.js → list-DjSSRZxF.js} +12 -12
  204. package/dist/{list-B6QhxgRJ.js.map → list-DjSSRZxF.js.map} +1 -1
  205. package/dist/list.cjs +1 -1
  206. package/dist/list.js +1 -1
  207. package/dist/magnetic-B2VKNfDu.js.map +1 -1
  208. package/dist/magnetic-MQ3HMHJi.cjs.map +1 -1
  209. package/dist/{menu-C5qcgMnw.js → menu-CCVEde6u.js} +7 -7
  210. package/dist/{menu-C5qcgMnw.js.map → menu-CCVEde6u.js.map} +1 -1
  211. package/dist/menu-DTNnq7j_.cjs +23 -0
  212. package/dist/{menu-Cuxt5K4Y.cjs.map → menu-DTNnq7j_.cjs.map} +1 -1
  213. package/dist/menu.cjs +1 -1
  214. package/dist/menu.js +1 -1
  215. package/dist/mixins-BYfSDvbP.js +412 -0
  216. package/dist/mixins-BYfSDvbP.js.map +1 -0
  217. package/dist/mixins-YQI9JogS.cjs +245 -0
  218. package/dist/mixins-YQI9JogS.cjs.map +1 -0
  219. package/dist/mixins.cjs +1 -1
  220. package/dist/mixins.js +3 -2
  221. package/dist/nav-drawer.cjs +1 -1
  222. package/dist/nav-drawer.js +1 -1
  223. package/dist/navigation-bar.cjs +1 -1
  224. package/dist/navigation-bar.js +1 -1
  225. package/dist/navigation-rail.cjs +10 -10
  226. package/dist/navigation-rail.cjs.map +1 -1
  227. package/dist/navigation-rail.js +15 -15
  228. package/dist/navigation-rail.js.map +1 -1
  229. package/dist/{notification-CDKBKh63.js → notification-BNEuu3Q2.js} +7 -7
  230. package/dist/{notification-CDKBKh63.js.map → notification-BNEuu3Q2.js.map} +1 -1
  231. package/dist/notification-RhaYvA1I.cjs +24 -0
  232. package/dist/{notification-CcNoBFEJ.cjs.map → notification-RhaYvA1I.cjs.map} +1 -1
  233. package/dist/notification.cjs +1 -1
  234. package/dist/notification.js +1 -1
  235. package/dist/{option-BWfmDJvm.js → option-BLMYRy5C.js} +6 -6
  236. package/dist/{option-BWfmDJvm.js.map → option-BLMYRy5C.js.map} +1 -1
  237. package/dist/{option-DejeqOad.cjs → option-Dk7UFFlr.cjs} +5 -5
  238. package/dist/{option-DejeqOad.cjs.map → option-Dk7UFFlr.cjs.map} +1 -1
  239. package/dist/option.cjs +1 -1
  240. package/dist/option.js +1 -1
  241. package/dist/overlay-BbntqsVm.cjs +43 -0
  242. package/dist/overlay-BbntqsVm.cjs.map +1 -0
  243. package/dist/{overlay-D3c_NY18.js → overlay-CujzmLxg.js} +93 -144
  244. package/dist/overlay-CujzmLxg.js.map +1 -0
  245. package/dist/overlay-stack-Bdr9lOqi.cjs.map +1 -1
  246. package/dist/overlay-stack-D2rgxQLh.js.map +1 -1
  247. package/dist/overlay.cjs +1 -1
  248. package/dist/overlay.confirm-body-CMge0LP5.cjs +70 -0
  249. package/dist/overlay.confirm-body-CMge0LP5.cjs.map +1 -0
  250. package/dist/{overlay.confirm-body-B_v0ivkn.js → overlay.confirm-body-CRk4MvKh.js} +15 -27
  251. package/dist/overlay.confirm-body-CRk4MvKh.js.map +1 -0
  252. package/dist/overlay.js +3 -3
  253. package/dist/{overlay.service-B3FjXCqc.js → overlay.service-DnT4SBlJ.js} +31 -27
  254. package/dist/{overlay.service-B3FjXCqc.js.map → overlay.service-DnT4SBlJ.js.map} +1 -1
  255. package/dist/overlay.service-Dq5XtSEL.cjs +1 -0
  256. package/dist/{overlay.service-BkSeqXIv.cjs.map → overlay.service-Dq5XtSEL.cjs.map} +1 -1
  257. package/dist/{progress-6_rb3Ah9.cjs → progress-Bqd4DdOQ.cjs} +7 -7
  258. package/dist/{progress-6_rb3Ah9.cjs.map → progress-Bqd4DdOQ.cjs.map} +1 -1
  259. package/dist/{progress-CFcmO0wv.js → progress-Cu_wh6Sl.js} +10 -10
  260. package/dist/{progress-CFcmO0wv.js.map → progress-Cu_wh6Sl.js.map} +1 -1
  261. package/dist/progress.cjs +1 -1
  262. package/dist/progress.js +1 -1
  263. package/dist/radio-group-C8rUbYL6.cjs +19 -0
  264. package/dist/{radio-group-_WZg8EKM.cjs.map → radio-group-C8rUbYL6.cjs.map} +1 -1
  265. package/dist/{radio-group-Bd8y9QpX.js → radio-group-Duzgx17I.js} +7 -7
  266. package/dist/{radio-group-Bd8y9QpX.js.map → radio-group-Duzgx17I.js.map} +1 -1
  267. package/dist/radio-group.cjs +1 -1
  268. package/dist/radio-group.js +1 -1
  269. package/dist/range.cjs +2 -2
  270. package/dist/range.cjs.map +1 -1
  271. package/dist/range.js +5 -5
  272. package/dist/range.js.map +1 -1
  273. package/dist/reduced-motion-D-L12p7G.js.map +1 -1
  274. package/dist/reduced-motion-Ds-HjMzn.cjs.map +1 -1
  275. package/dist/rxjs-utils-Csnks202.cjs.map +1 -1
  276. package/dist/rxjs-utils-d-ivVN84.js.map +1 -1
  277. package/dist/search-DPKoC-dT.cjs.map +1 -1
  278. package/dist/search-MvIBA93K.js.map +1 -1
  279. package/dist/{select-Czpl1ztD.js → select-CzCv1f1c.js} +6 -6
  280. package/dist/{select-Czpl1ztD.js.map → select-CzCv1f1c.js.map} +1 -1
  281. package/dist/{select-BaioT3yY.cjs → select-DdqEsfnG.cjs} +2 -2
  282. package/dist/{select-BaioT3yY.cjs.map → select-DdqEsfnG.cjs.map} +1 -1
  283. package/dist/select.cjs +1 -1
  284. package/dist/select.js +1 -1
  285. package/dist/skeleton.cjs +2 -2
  286. package/dist/skeleton.cjs.map +1 -1
  287. package/dist/skeleton.js +5 -5
  288. package/dist/skeleton.js.map +1 -1
  289. package/dist/skills/form.md +34 -0
  290. package/dist/skills/schmancy/form.md +34 -0
  291. package/dist/slider.cjs +7 -7
  292. package/dist/slider.cjs.map +1 -1
  293. package/dist/slider.js +6 -6
  294. package/dist/slider.js.map +1 -1
  295. package/dist/{sound.service-v_jqCkos.js → sound.service-BOWTBG16.js} +1 -1
  296. package/dist/{sound.service-v_jqCkos.js.map → sound.service-BOWTBG16.js.map} +1 -1
  297. package/dist/{sound.service-DVJZb9ox.cjs → sound.service-BwIzAFQx.cjs} +1 -1
  298. package/dist/{sound.service-DVJZb9ox.cjs.map → sound.service-BwIzAFQx.cjs.map} +1 -1
  299. package/dist/{splash-screen-YtTVkJg8.js → splash-screen-Dj-zuGuB.js} +6 -6
  300. package/dist/{splash-screen-YtTVkJg8.js.map → splash-screen-Dj-zuGuB.js.map} +1 -1
  301. package/dist/splash-screen-_KhxgneW.cjs +41 -0
  302. package/dist/{splash-screen-3FtgdVy3.cjs.map → splash-screen-_KhxgneW.cjs.map} +1 -1
  303. package/dist/splash-screen.cjs +1 -1
  304. package/dist/splash-screen.js +1 -1
  305. package/dist/src-BSjgxN07.cjs +263 -0
  306. package/dist/{src-AYRNg63f.cjs.map → src-BSjgxN07.cjs.map} +1 -1
  307. package/dist/{src-DKMEgT2z.js → src-Curgs4Yp.js} +83 -83
  308. package/dist/{src-DKMEgT2z.js.map → src-Curgs4Yp.js.map} +1 -1
  309. package/dist/state-BthYuA3T.cjs +1 -0
  310. package/dist/state-BthYuA3T.cjs.map +1 -0
  311. package/dist/{state-CHbIt2Dw.js → state-E0bVrZ7q.js} +293 -279
  312. package/dist/state-E0bVrZ7q.js.map +1 -0
  313. package/dist/state.cjs +1 -1
  314. package/dist/state.js +3 -3
  315. package/dist/steps.cjs +10 -10
  316. package/dist/steps.cjs.map +1 -1
  317. package/dist/steps.js +9 -9
  318. package/dist/steps.js.map +1 -1
  319. package/dist/{surface-CVxyQPln.js → surface-C2TIedTq.js} +4 -4
  320. package/dist/{surface-CVxyQPln.js.map → surface-C2TIedTq.js.map} +1 -1
  321. package/dist/surface-D-GqzyLn.cjs +7 -0
  322. package/dist/{surface-BNvxLEDN.cjs.map → surface-D-GqzyLn.cjs.map} +1 -1
  323. package/dist/surface.cjs +1 -1
  324. package/dist/surface.js +1 -1
  325. package/dist/switch.cjs +2 -2
  326. package/dist/switch.cjs.map +1 -1
  327. package/dist/switch.js +6 -6
  328. package/dist/switch.js.map +1 -1
  329. package/dist/table.cjs +11 -11
  330. package/dist/table.cjs.map +1 -1
  331. package/dist/table.js +10 -10
  332. package/dist/table.js.map +1 -1
  333. package/dist/{tabs-CnPXvZuZ.js → tabs-CLRVe23a.js} +11 -11
  334. package/dist/{tabs-CnPXvZuZ.js.map → tabs-CLRVe23a.js.map} +1 -1
  335. package/dist/{tabs-DTU7748z.cjs → tabs-C_493iod.cjs} +4 -4
  336. package/dist/{tabs-DTU7748z.cjs.map → tabs-C_493iod.cjs.map} +1 -1
  337. package/dist/tabs.cjs +1 -1
  338. package/dist/tabs.js +1 -1
  339. package/dist/teleport.cjs +1 -1
  340. package/dist/teleport.js +1 -1
  341. package/dist/{textarea-mQPsppmd.js → textarea-BWEyOtPy.js} +9 -9
  342. package/dist/{textarea-mQPsppmd.js.map → textarea-BWEyOtPy.js.map} +1 -1
  343. package/dist/textarea-CICgd2oP.cjs +43 -0
  344. package/dist/{textarea-Bqth6Q8P.cjs.map → textarea-CICgd2oP.cjs.map} +1 -1
  345. package/dist/textarea.cjs +1 -1
  346. package/dist/textarea.js +1 -1
  347. package/dist/{theme-BJqpv4cG.js → theme-Bfg_H2AF.js} +12 -12
  348. package/dist/{theme-BJqpv4cG.js.map → theme-Bfg_H2AF.js.map} +1 -1
  349. package/dist/theme-D7zOJiyg.cjs +181 -0
  350. package/dist/{theme-D4HGKt7N.cjs.map → theme-D7zOJiyg.cjs.map} +1 -1
  351. package/dist/{theme-button-Jap7G_IH.js → theme-button-C53GdQER.js} +4 -4
  352. package/dist/{theme-button-Jap7G_IH.js.map → theme-button-C53GdQER.js.map} +1 -1
  353. package/dist/theme-button-DgeBcqFm.cjs +8 -0
  354. package/dist/{theme-button-LP-Dgr17.cjs.map → theme-button-DgeBcqFm.cjs.map} +1 -1
  355. package/dist/theme-button.cjs +1 -1
  356. package/dist/theme-button.js +1 -1
  357. package/dist/theme.cjs +1 -1
  358. package/dist/theme.interface-CSt7JUBD.cjs.map +1 -1
  359. package/dist/theme.interface-odQEpZZH.js.map +1 -1
  360. package/dist/theme.js +3 -3
  361. package/dist/{theme.service-Bh08uOSJ.js → theme.service-BqDuioYc.js} +1 -1
  362. package/dist/{theme.service-Bh08uOSJ.js.map → theme.service-BqDuioYc.js.map} +1 -1
  363. package/dist/{theme.service-Y-e8b331.cjs → theme.service-C3PoISGd.cjs} +1 -1
  364. package/dist/{theme.service-Y-e8b331.cjs.map → theme.service-C3PoISGd.cjs.map} +1 -1
  365. package/dist/tooltip.cjs.map +1 -1
  366. package/dist/tooltip.js.map +1 -1
  367. package/dist/tree.cjs +3 -3
  368. package/dist/tree.cjs.map +1 -1
  369. package/dist/tree.js +4 -4
  370. package/dist/tree.js.map +1 -1
  371. package/dist/types.cjs.map +1 -1
  372. package/dist/types.js.map +1 -1
  373. package/dist/typewriter.cjs.map +1 -1
  374. package/dist/typewriter.js.map +1 -1
  375. package/dist/{typography-Bc4MmSal.cjs → typography-B19fJ5YT.cjs} +4 -4
  376. package/dist/{typography-Bc4MmSal.cjs.map → typography-B19fJ5YT.cjs.map} +1 -1
  377. package/dist/{typography-BJMm6b0b.js → typography-CzbQv-X0.js} +10 -10
  378. package/dist/{typography-BJMm6b0b.js.map → typography-CzbQv-X0.js.map} +1 -1
  379. package/dist/typography.cjs +1 -1
  380. package/dist/typography.js +1 -1
  381. package/dist/utils-DTa3QHxk.cjs.map +1 -1
  382. package/dist/utils-H8wNknWC.js.map +1 -1
  383. package/dist/visually-hidden.cjs +2 -2
  384. package/dist/visually-hidden.cjs.map +1 -1
  385. package/dist/visually-hidden.js +4 -4
  386. package/dist/visually-hidden.js.map +1 -1
  387. package/dist/window-DXB53PuA.cjs +59 -0
  388. package/dist/{window-CNu_WnsY.cjs.map → window-DXB53PuA.cjs.map} +1 -1
  389. package/dist/{window-DZTjkE24.js → window-DpctMXiy.js} +9 -9
  390. package/dist/{window-DZTjkE24.js.map → window-DpctMXiy.js.map} +1 -1
  391. package/dist/window.cjs +1 -1
  392. package/dist/window.js +1 -1
  393. package/package.json +1 -1
  394. package/skills/schmancy/form.md +34 -0
  395. package/src/form/form.ts +5 -1
  396. package/src/overlay/overlay.animations.ts +0 -29
  397. package/src/overlay/overlay.component.ts +30 -38
  398. package/src/overlay/overlay.confirm-body.ts +3 -15
  399. package/src/overlay/overlay.layout.ts +11 -53
  400. package/src/overlay/overlay.stack.test.ts +113 -0
  401. package/src/overlay/overlay.types.ts +17 -11
  402. package/src/state/active-host.ts +50 -1
  403. package/src/state/index.ts +50 -11
  404. package/src/state/schmancy-context.ts +97 -88
  405. package/src/surface/surface.styles.ts +14 -10
  406. package/types/src/form/form.d.ts +1 -0
  407. package/types/src/overlay/overlay.confirm-body.d.ts +1 -1
  408. package/types/src/overlay/overlay.layout.d.ts +10 -30
  409. package/types/src/overlay/overlay.stack.test.d.ts +1 -0
  410. package/types/src/overlay/overlay.types.d.ts +17 -11
  411. package/types/src/state/active-host.d.ts +3 -0
  412. package/types/src/state/index.d.ts +16 -2
  413. package/types/src/state/schmancy-context.d.ts +2 -2
  414. package/dist/active-host-BP0zy_Y9.js +0 -63
  415. package/dist/active-host-BP0zy_Y9.js.map +0 -1
  416. package/dist/active-host-jH3iloCR.cjs +0 -1
  417. package/dist/active-host-jH3iloCR.cjs.map +0 -1
  418. package/dist/agent/overlay.confirm-body-BZoUgkdK.js +0 -4574
  419. package/dist/agent/overlay.confirm-body-BZoUgkdK.js.map +0 -1
  420. package/dist/area-BSVOYQDA.cjs +0 -21
  421. package/dist/date-range-inline-nPWIs-3C.cjs +0 -43
  422. package/dist/float-B8EPc_OG.cjs +0 -1
  423. package/dist/form-FtYtZScl.js.map +0 -1
  424. package/dist/form-SHg5FLsd.cjs.map +0 -1
  425. package/dist/icon-B1eZr2ZL.js.map +0 -1
  426. package/dist/menu-Cuxt5K4Y.cjs +0 -23
  427. package/dist/mixins-8dT5j6CS.js +0 -627
  428. package/dist/mixins-8dT5j6CS.js.map +0 -1
  429. package/dist/mixins-BF3Vj8_c.cjs +0 -242
  430. package/dist/mixins-BF3Vj8_c.cjs.map +0 -1
  431. package/dist/notification-CcNoBFEJ.cjs +0 -24
  432. package/dist/overlay-D3c_NY18.js.map +0 -1
  433. package/dist/overlay-Dv2utO4C.cjs +0 -43
  434. package/dist/overlay-Dv2utO4C.cjs.map +0 -1
  435. package/dist/overlay.confirm-body-B2ntyquG.cjs +0 -79
  436. package/dist/overlay.confirm-body-B2ntyquG.cjs.map +0 -1
  437. package/dist/overlay.confirm-body-B_v0ivkn.js.map +0 -1
  438. package/dist/overlay.service-BkSeqXIv.cjs +0 -1
  439. package/dist/radio-group-_WZg8EKM.cjs +0 -19
  440. package/dist/splash-screen-3FtgdVy3.cjs +0 -41
  441. package/dist/src-AYRNg63f.cjs +0 -263
  442. package/dist/state-CHbIt2Dw.js.map +0 -1
  443. package/dist/state-DcGj-pJJ.cjs +0 -1
  444. package/dist/state-DcGj-pJJ.cjs.map +0 -1
  445. package/dist/surface-BNvxLEDN.cjs +0 -7
  446. package/dist/textarea-Bqth6Q8P.cjs +0 -43
  447. package/dist/theme-D4HGKt7N.cjs +0 -181
  448. package/dist/theme-button-LP-Dgr17.cjs +0 -8
  449. package/dist/window-CNu_WnsY.cjs +0 -59
  450. /package/dist/agent/{flow-3RrZM-e7.js → flow-CvG1fLW5.js} +0 -0
  451. /package/dist/agent/{vendor-material-color-33Mj762T.js → vendor-material-color-DcL7ZPxx.js} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"mixins-BF3Vj8_c.cjs","names":[],"sources":["../mixins/discovery.service.ts","../src/theme/context.ts","../mixins/baseElement.ts","../mixins/tailwind.css?inline","../mixins/tailwind.mixin.ts","../mixins/SchmancyElement.ts","../mixins/formField.mixin.ts","../mixins/litElement.mixin.ts","../src/surface/surface.styles.ts","../mixins/surface.mixin.ts"],"sourcesContent":["import { fromEvent, timer, race, Observable } from 'rxjs'\nimport { takeUntil, map, defaultIfEmpty, take } from 'rxjs/operators'\n\n/**\n * Global discovery event names\n */\nconst DISCOVER_EVENT = 'schmancy-discover'\nconst DISCOVER_RESPONSE_EVENT = 'schmancy-discover-response'\n\n/**\n * Discovery request detail\n */\ninterface DiscoverRequest {\n\tselector: string\n\trequestId: string\n}\n\n/**\n * Discovery response detail\n */\ninterface DiscoverResponse {\n\trequestId: string\n\telement: HTMLElement\n}\n\n/**\n * Discover a component in the DOM using the WhereAreYou/HereIAm pattern.\n *\n * @param componentTag - The tag name of the component to discover (e.g., 'schmancy-navigation-rail')\n * @param timeout - How long to wait for a response in milliseconds (default: 100)\n * @returns Observable that emits the discovered component or null if not found\n */\nexport function discoverComponent<T extends HTMLElement>(\n\tcomponentTag: string,\n\ttimeout = 100,\n): Observable<T | null> {\n\tconst whereAreYouEvent = `${componentTag}-where-are-you`\n\tconst hereIAmEvent = `${componentTag}-here-i-am`\n\n\treturn new Observable(subscriber => {\n\t\t// Listen for response first (you were right!)\n\t\tconst subscription = fromEvent<CustomEvent>(window, hereIAmEvent)\n\t\t\t.pipe(\n\t\t\t\ttakeUntil(timer(timeout)),\n\t\t\t\tmap(e => e.detail.component as T),\n\t\t\t\tdefaultIfEmpty(null),\n\t\t\t)\n\t\t\t.subscribe(component => {\n\t\t\t\tsubscriber.next(component)\n\t\t\t\tsubscriber.complete()\n\t\t\t})\n\n\t\t// Then dispatch discovery request\n\t\twindow.dispatchEvent(\n\t\t\tnew CustomEvent(whereAreYouEvent, {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\n\t\t// Return cleanup function\n\t\treturn () => subscription.unsubscribe()\n\t})\n}\n\n/**\n * Discover any of multiple components using race.\n * Returns the first component that responds.\n *\n * @param componentTags - Array of component tag names to discover\n * @returns Observable that emits the first discovered component or null if none found\n */\nexport function discoverAnyComponent<T extends HTMLElement>(...componentTags: string[]): Observable<T | null> {\n\tif (componentTags.length === 0) {\n\t\treturn new Observable(subscriber => {\n\t\t\tsubscriber.next(null)\n\t\t\tsubscriber.complete()\n\t\t})\n\t}\n\n\treturn race(...componentTags.map(tag => discoverComponent<T>(tag)))\n}\n\n/**\n * Universal element discovery - finds ANY element by CSS selector across shadow DOM boundaries.\n * Uses event-based discovery pattern - no DOM traversal needed.\n *\n * How it works:\n * 1. Broadcasts a discovery request event on window\n * 2. All $LitElement components receive this event and check their shadow DOM\n * 3. If a match is found, they respond with the element\n *\n * @param selector - CSS selector (e.g., '#my-id', '.my-class', '[data-attr]')\n * @param timeout - How long to wait for a response in milliseconds (default: 150)\n * @returns Observable that emits the discovered element or null if not found\n *\n * @example\n * ```typescript\n * // Find element by ID across shadow boundaries\n * discoverElement('#app-card').subscribe(el => {\n * if (el) console.log('Found:', el)\n * })\n *\n * // Find element by class\n * discoverElement('.special-button').subscribe(el => {...})\n * ```\n */\nexport function discoverElement<T extends HTMLElement>(\n\tselector: string,\n\ttimeout = 150,\n): Observable<T | null> {\n\tconst requestId = `discover-${Date.now()}-${Math.random().toString(36).slice(2)}`\n\n\treturn new Observable(subscriber => {\n\t\t// Listen for response first\n\t\tconst subscription = fromEvent<CustomEvent<DiscoverResponse>>(window, DISCOVER_RESPONSE_EVENT)\n\t\t\t.pipe(\n\t\t\t\ttakeUntil(timer(timeout)),\n\t\t\t\tmap(e => e.detail),\n\t\t\t\t// Filter for our specific request\n\t\t\t\tmap(detail => (detail.requestId === requestId ? (detail.element as T) : null)),\n\t\t\t\t// Only take the first non-null response\n\t\t\t\ttake(1),\n\t\t\t\tdefaultIfEmpty(null),\n\t\t\t)\n\t\t\t.subscribe(element => {\n\t\t\t\tsubscriber.next(element)\n\t\t\t\tsubscriber.complete()\n\t\t\t})\n\n\t\t// Broadcast discovery request\n\t\twindow.dispatchEvent(\n\t\t\tnew CustomEvent<DiscoverRequest>(DISCOVER_EVENT, {\n\t\t\t\tdetail: { selector, requestId },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\n\t\treturn () => subscription.unsubscribe()\n\t})\n}\n\n/**\n * Discover multiple elements matching a selector.\n * Collects all responses within the timeout period.\n *\n * @param selector - CSS selector\n * @param timeout - How long to collect responses (default: 150ms)\n * @returns Observable that emits array of discovered elements\n */\nexport function discoverAllElements<T extends HTMLElement>(\n\tselector: string,\n\ttimeout = 150,\n): Observable<T[]> {\n\tconst requestId = `discover-all-${Date.now()}-${Math.random().toString(36).slice(2)}`\n\tconst elements: T[] = []\n\n\treturn new Observable(subscriber => {\n\t\t// Collect all responses\n\t\tconst subscription = fromEvent<CustomEvent<DiscoverResponse>>(window, DISCOVER_RESPONSE_EVENT)\n\t\t\t.pipe(takeUntil(timer(timeout)))\n\t\t\t.subscribe({\n\t\t\t\tnext: e => {\n\t\t\t\t\tif (e.detail.requestId === requestId) {\n\t\t\t\t\t\telements.push(e.detail.element as T)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcomplete: () => {\n\t\t\t\t\tsubscriber.next(elements)\n\t\t\t\t\tsubscriber.complete()\n\t\t\t\t},\n\t\t\t})\n\n\t\t// Broadcast discovery request\n\t\twindow.dispatchEvent(\n\t\t\tnew CustomEvent<DiscoverRequest>(DISCOVER_EVENT, {\n\t\t\t\tdetail: { selector, requestId },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\n\t\treturn () => subscription.unsubscribe()\n\t})\n}\n\n/**\n * Smart discovery - automatically detects if input is a CSS selector or component tag.\n *\n * @param query - CSS selector (starts with #, ., [) OR component tag name\n * @param timeout - How long to wait (default: 150ms)\n * @returns Observable that emits the discovered element or null\n *\n * @example\n * ```typescript\n * // CSS selector - uses discoverElement\n * discover('#my-element').subscribe(...)\n *\n * // Component tag - uses discoverComponent\n * discover('schmancy-fancy').subscribe(...)\n * ```\n */\nexport function discover<T extends HTMLElement>(\n\tquery: string,\n\ttimeout = 150,\n): Observable<T | null> {\n\t// Check if it's a CSS selector (starts with #, ., or [)\n\tconst isCssSelector = /^[#.\\[]/.test(query)\n\n\tif (isCssSelector) {\n\t\treturn discoverElement<T>(query, timeout)\n\t}\n\n\t// Otherwise treat as component tag name\n\treturn discoverComponent<T>(query, timeout)\n}\n\n// Export event names for use in baseElement\nexport { DISCOVER_EVENT, DISCOVER_RESPONSE_EVENT }\nexport type { DiscoverRequest, DiscoverResponse }\n","import { createContext } from '@lit/context'\nimport { TSchmancyTheme } from './theme.interface'\n\n/**\n * Lit Context for sharing theme configuration across components.\\n *\n * This context is provided by SchmancyThemeComponent and can be consumed\n * by any child component to access the current theme configuration.\n *\n * @type {Context<Partial<TSchmancyTheme>>}\n *\n * @example\n * ```typescript\n * import { consume } from '@lit/context'\n * import { themeContext } from '@schmancy/theme'\n *\n * class MyComponent extends LitElement {\n * @consume({ context: themeContext })\n * theme?: Partial<TSchmancyTheme>\n *\n * render() {\n * // Access theme variables\n * const primaryColor = this.theme?.sys?.color?.primary?.default\n * // ...\n * }\n * }\n * ```\n */\nexport const themeContext = createContext<Partial<TSchmancyTheme>>('theme-context')\n","import type { Constructor } from './constructor'\nimport { LitElement } from 'lit'\nimport { Subject, fromEvent, Observable } from 'rxjs'\nimport { takeUntil } from 'rxjs/operators'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport { discoverComponent, DISCOVER_EVENT, DISCOVER_RESPONSE_EVENT, type DiscoverRequest } from './discovery.service'\nimport { consume } from '@lit/context'\nimport { themeContext } from '../src/theme/context'\nimport type { TSchmancyTheme } from '../src/theme/theme.interface'\n\nexport declare class IBaseMixin {\n\tdisconnecting: Subject<boolean>\n\tclassMap: typeof classMap\n\tstyleMap: typeof styleMap\n\tdiscover<T extends HTMLElement>(tag: string): Observable<T | null>\n\treadonly stableId: string\n\tuid: string\n\t/**\n\t * Current locale from theme context. Use with Intl.NumberFormat/DateTimeFormat.\n\t * Defaults to navigator.language if no theme provider is found.\n\t * @example new Intl.NumberFormat(this.locale).format(1234.56)\n\t */\n\treadonly locale: string\n\tdispatchScopedEvent<T>(eventName: string, detail?: T, options?: { bubbles?: boolean; composed?: boolean }): void\n}\n\nexport const BaseElement = <T extends Constructor<LitElement>>(superClass: T) => {\n\tclass BaseElement extends superClass {\n\t\tdisconnecting = new Subject<boolean>()\n\t\tprivate _stableId?: string\n\t\tprivate _uid?: string\n\n\t\t@consume({ context: themeContext, subscribe: true })\n\t\tprivate _theme?: Partial<TSchmancyTheme>\n\n\t\t/** Current locale from theme context. Falls back to navigator.language. */\n\t\tget locale(): string {\n\t\t\treturn this._theme?.locale ?? (typeof navigator !== 'undefined' ? navigator.language : 'de-DE')\n\t\t}\n\n\t\t/** Stable ID from DOM path - lazy, only computed on first access */\n\t\tget stableId(): string {\n\t\t\tif (this._stableId) return this._stableId\n\t\t\tconst path: string[] = []\n\t\t\tfor (let el: Element | null = this; el?.parentElement && path.length < 5; el = el.parentElement) {\n\t\t\t\tconst tag = el.tagName.toLowerCase()\n\t\t\t\tconst siblings = Array.from(el.parentElement.children).filter(c => c.tagName === el!.tagName)\n\t\t\t\tpath.unshift(siblings.length > 1 ? `${tag}:nth-of-type(${siblings.indexOf(el) + 1})` : tag)\n\t\t\t}\n\t\t\tconst hash = Array.from(path.join('>')).reduce((h, c) => Math.imul(31, h) + c.charCodeAt(0) | 0, 0)\n\t\t\treturn this._stableId = `el-${Math.abs(hash).toString(36)}`\n\t\t}\n\n\t\t/**\n\t\t * Unique instance ID - can be overridden via attribute, otherwise auto-generated.\n\t\t * Usage: <my-component uid=\"custom-id\"> or let it auto-generate\n\t\t */\n\t\tget uid(): string {\n\t\t\t// Check if uid was set via attribute\n\t\t\tconst attrUid = this.getAttribute('uid')\n\t\t\tif (attrUid) return attrUid\n\n\t\t\t// Auto-generate if not set\n\t\t\tif (!this._uid) {\n\t\t\t\tthis._uid = `el-${crypto.randomUUID()}`\n\t\t\t}\n\t\t\treturn this._uid\n\t\t}\n\n\t\tset uid(value: string) {\n\t\t\tif (value) {\n\t\t\t\tthis.setAttribute('uid', value)\n\t\t\t} else {\n\t\t\t\tthis.removeAttribute('uid')\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Dispatch an event scoped to this component instance.\n\t\t * Emits BOTH scoped event (eventName::uid) and generic event for backward compatibility.\n\t\t * This prevents event collision between multiple instances of the same component.\n\t\t */\n\t\tdispatchScopedEvent<T>(eventName: string, detail?: T, options: { bubbles?: boolean; composed?: boolean } = {}): void {\n\t\t\tconst { bubbles = false, composed = true } = options\n\n\t\t\t// Emit scoped event for new code\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent(`${eventName}::${this.uid}`, {\n\t\t\t\t\tdetail,\n\t\t\t\t\tbubbles,\n\t\t\t\t\tcomposed,\n\t\t\t\t})\n\t\t\t)\n\n\t\t\t// Emit generic event for backward compatibility\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent(eventName, {\n\t\t\t\t\tdetail,\n\t\t\t\t\tbubbles,\n\t\t\t\t\tcomposed,\n\t\t\t\t})\n\t\t\t)\n\t\t}\n\n\t\tclassMap(classes: Record<string, boolean>) {\n\t\t\tconst newClasses: Record<string, boolean> = {}\n\t\t\tObject.keys(classes).forEach(key => {\n\t\t\t\tkey\n\t\t\t\t\t.trim()\n\t\t\t\t\t.split(' ')\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.forEach(k => {\n\t\t\t\t\t\tnewClasses[k] = classes[key]\n\t\t\t\t\t})\n\t\t\t})\n\t\t\treturn classMap(newClasses)\n\t\t}\n\n\t\tstyleMap(styles: Record<string, string | number>) {\n\t\t\treturn styleMap(styles)\n\t\t}\n\n\t\tconnectedCallback() {\n\t\t\tsuper.connectedCallback()\n\t\t\tthis.setupDiscoveryResponse()\n\t\t}\n\n\t\tprivate setupDiscoveryResponse() {\n\t\t\tconst tagName = this.tagName.toLowerCase()\n\t\t\tconst whereAreYouEvent = `${tagName}-where-are-you`\n\t\t\tconst hereIAmEvent = `${tagName}-here-i-am`\n\n\t\t\t// 1. Component tag discovery (e.g., 'schmancy-fancy-where-are-you')\n\t\t\tfromEvent(window, whereAreYouEvent)\n\t\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t\t.subscribe(() => {\n\t\t\t\t\twindow.dispatchEvent(\n\t\t\t\t\t\tnew CustomEvent(hereIAmEvent, {\n\t\t\t\t\t\t\tdetail: { component: this },\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}),\n\t\t\t\t\t)\n\t\t\t\t})\n\n\t\t\t// 2. CSS selector discovery (e.g., '#app-card', '.my-class', '[uid=\"xyz\"]')\n\t\t\tfromEvent<CustomEvent<DiscoverRequest>>(window, DISCOVER_EVENT)\n\t\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t\t.subscribe(({ detail: { selector, requestId } }) => {\n\t\t\t\t\tlet found: Element | null = null\n\n\t\t\t\t\t// Check if selector matches this component's id or uid\n\t\t\t\t\tif (selector.startsWith('#')) {\n\t\t\t\t\t\tconst id = selector.slice(1)\n\t\t\t\t\t\tif (this.id === id || this.uid === id) {\n\t\t\t\t\t\t\tfound = this\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check our shadow DOM for matching element\n\t\t\t\t\tif (!found && this.shadowRoot) {\n\t\t\t\t\t\tfound = this.shadowRoot.querySelector(selector)\n\t\t\t\t\t}\n\n\t\t\t\t\tif (found) {\n\t\t\t\t\t\twindow.dispatchEvent(\n\t\t\t\t\t\t\tnew CustomEvent(DISCOVER_RESPONSE_EVENT, {\n\t\t\t\t\t\t\t\tdetail: { requestId, element: found },\n\t\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t}\n\n\t\t// Make discover public to match the interface\n\t\tdiscover<T extends HTMLElement>(tag: string): Observable<T | null> {\n\t\t\treturn discoverComponent<T>(tag)\n\t\t}\n\n\t\tdisconnectedCallback() {\n\t\t\tthis.disconnecting.next(true)\n\t\t\tthis.disconnecting.complete()\n\t\t\tsuper.disconnectedCallback()\n\t\t}\n\t}\n\treturn BaseElement as Constructor<IBaseMixin> & T\n}\n","@import 'tailwindcss';\n\n/* Tell Tailwind's content scanner to also look at the library source,\n which lives one level up from this file. Without this, consumers whose\n Vite root sits outside the library (e.g. the demo at `/demo/`) only get\n utilities for classes typed in their own source — library classes like\n `bg-primary-default`, `border-outline`, `text-primary-on` silently no-op. */\n@source \"../src/**/*.{ts,tsx,js,jsx,html}\";\n\n/* Cascade-layer order contract. Consumer (unlayered) CSS always overrides\n library styles regardless of specificity. Library-internal tokens and\n components live in named layers so consumers can target them precisely. */\n@layer schmancy.tokens, schmancy.base, schmancy.components;\n\n@layer schmancy.base {\n:host,\n:root {\n\tfont-family: var(--schmancy-font-family);\n\t/* Advertise both schemes so UA form controls, scrollbars, and\n\t `light-dark()` all render correctly until a theme resolves it. */\n\tcolor-scheme: light dark;\n}\n:host,\n:host *,\n* {\n\t/* pan-x pan-y allows scrolling but disables pinch-zoom */\n\ttouch-action: pan-x pan-y;\n}\n\n/* Interactive: luminous lift on hover, spring compress on active */\n.interactive {\n\ttransition:\n\t\ttransform 300ms cubic-bezier(0.34, 1.56, 0.64, 1),\n\t\tbox-shadow 400ms ease,\n\t\tfilter 200ms ease;\n}\n.interactive:hover {\n\ttransform: translateY(-1px);\n\tfilter: brightness(1.03);\n\tbox-shadow: 0 4px 20px -6px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 18%, transparent);\n}\n.interactive:active {\n\ttransform: scale(0.97);\n\tfilter: brightness(0.96);\n\tbox-shadow: none;\n\ttransition-duration: 100ms;\n}\n@media (prefers-reduced-motion: reduce) {\n\t.interactive { transition: filter 150ms ease; }\n\t.interactive:hover { transform: none; box-shadow: none; }\n\t.interactive:active { transform: none; }\n}\n@theme inline {\n\t--md-ref-typeface-brand: var(--schmancy-font-family);\n\t--md-ref-typeface-plain: var(--schmancy-font-family);\n\t--md-sys-color-primary: var(--schmancy-sys-color-primary-default);\n\t--md-sys-color-secondary: var(--schmancy-sys-color-secondary-default);\n\n\t--*: initial;\n\t--border-style: solid;\n\t--spacing: 4px;\n\t--color-scrim: var(--schmancy-sys-color-scrim);\n\t--color-outline-default: var(--schmancy-sys-color-outline);\n\t--color-outline-variant: var(--schmancy-sys-color-outlineVariant);\n\t/* Shorthand alias */\n\t--color-outline: var(--schmancy-sys-color-outline);\n\t--color-surface-default: var(--schmancy-sys-color-surface-default);\n\t--color-surface-dim: var(--schmancy-sys-color-surface-dim);\n\t--color-surface-bright: var(--schmancy-sys-color-surface-bright);\n\t--color-surface-container: var(--schmancy-sys-color-surface-container);\n\t--color-surface-low: var(--schmancy-sys-color-surface-low);\n\t--color-surface-high: var(--schmancy-sys-color-surface-high);\n\t--color-surface-highest: var(--schmancy-sys-color-surface-highest);\n\t--color-surface-lowest: var(--schmancy-sys-color-surface-lowest);\n\t/* CamelCase variants for Tailwind compatibility */\n\t--color-surface-containerLow: var(--schmancy-sys-color-surface-containerLow);\n\t--color-surface-containerHigh: var(--schmancy-sys-color-surface-containerHigh);\n\t--color-surface-containerLowest: var(--schmancy-sys-color-surface-containerLowest);\n\t--color-surface-containerHighest: var(--schmancy-sys-color-surface-containerHighest);\n\t--color-surface-on: var(--schmancy-sys-color-surface-on);\n\t--color-surface-on-variant: var(--schmancy-sys-color-surface-onVariant);\n\t--color-primary-default: var(--schmancy-sys-color-primary-default);\n\t--color-primary-on: var(--schmancy-sys-color-primary-on);\n\t--color-primary-container: var(--schmancy-sys-color-primary-container);\n\t--color-primary-on-container: var(--schmancy-sys-color-primary-onContainer);\n\t--color-secondary-default: var(--schmancy-sys-color-secondary-default);\n\t--color-secondary-on: var(--schmancy-sys-color-secondary-on);\n\t--color-secondary-container: var(--schmancy-sys-color-secondary-container);\n\t--color-secondary-on-container: var(--schmancy-sys-color-secondary-onContainer);\n\t--color-tertiary-default: var(--schmancy-sys-color-tertiary-default);\n\t--color-tertiary-on: var(--schmancy-sys-color-tertiary-on);\n\t--color-tertiary-container: var(--schmancy-sys-color-tertiary-container);\n\t--color-tertiary-on-container: var(--schmancy-sys-color-tertiary-onContainer);\n\t--color-error-default: var(--schmancy-sys-color-error-default);\n\t--color-error-on: var(--schmancy-sys-color-error-on);\n\t--color-error-container: var(--schmancy-sys-color-error-container);\n\t--color-error-on-container: var(--schmancy-sys-color-error-onContainer);\n\t--color-success-default: var(--schmancy-sys-color-success-default);\n\t--color-success-on: var(--schmancy-sys-color-success-on);\n\t--color-success-container: var(--schmancy-sys-color-success-container);\n\t--color-success-on-container: var(--schmancy-sys-color-success-onContainer);\n\t--color-warning-default: var(--schmancy-sys-color-warning-default);\n\t--color-warning-on: var(--schmancy-sys-color-warning-on);\n\t--color-warning-container: var(--schmancy-sys-color-warning-container);\n\t--color-warning-on-container: var(--schmancy-sys-color-warning-onContainer);\n\t--color-info-default: var(--schmancy-sys-color-info-default);\n\t--color-info-on: var(--schmancy-sys-color-info-on);\n\t--color-info-container: var(--schmancy-sys-color-info-container);\n\t--color-info-on-container: var(--schmancy-sys-color-info-onContainer);\n\n\t/* DEPRECATED: camelCase aliases for backward compatibility - use hyphenated format instead */\n\t--color-outlineVariant: var(--schmancy-sys-color-outlineVariant);\n\t--color-surface-onVariant: var(--schmancy-sys-color-surface-onVariant);\n\t--color-primary-onContainer: var(--schmancy-sys-color-primary-onContainer);\n\t--color-secondary-onContainer: var(--schmancy-sys-color-secondary-onContainer);\n\t--color-tertiary-onContainer: var(--schmancy-sys-color-tertiary-onContainer);\n\t--color-error-onContainer: var(--schmancy-sys-color-error-onContainer);\n\t--color-success-onContainer: var(--schmancy-sys-color-success-onContainer);\n\t--color-warning-onContainer: var(--schmancy-sys-color-warning-onContainer);\n\t--color-info-onContainer: var(--schmancy-sys-color-info-onContainer);\n\n\t/* Shorthand aliases (maps to -default variant) */\n\t--color-primary: var(--schmancy-sys-color-primary-default);\n\t--color-secondary: var(--schmancy-sys-color-secondary-default);\n\t--color-tertiary: var(--schmancy-sys-color-tertiary-default);\n\t--color-error: var(--schmancy-sys-color-error-default);\n\t--color-success: var(--schmancy-sys-color-success-default);\n\t--color-warning: var(--schmancy-sys-color-warning-default);\n\t--color-info: var(--schmancy-sys-color-info-default);\n\t--color-surface: var(--schmancy-sys-color-surface-default);\n\n\t--shadow-0: var(--schmancy-sys-elevation-0);\n\t--shadow-1: var(--schmancy-sys-elevation-1);\n\t--shadow-2: var(--schmancy-sys-elevation-2);\n\t--shadow-3: var(--schmancy-sys-elevation-3);\n\t--shadow-4: var(--schmancy-sys-elevation-4);\n\t--shadow-5: var(--schmancy-sys-elevation-5);\n\t--outline-1: var(--schmancy-sys-outline-1);\n\n\t/* Luminous glow elevation — light-based depth for futuristic UI\n\t Use shadow-glow-{1-5} classes. Glow intensifies with level. */\n\t--shadow-glow-1: 0 2px 12px -2px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 15%, transparent);\n\t--shadow-glow-2: 0 4px 20px -2px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 22%, transparent);\n\t--shadow-glow-3: 0 8px 32px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 28%, transparent);\n\t--shadow-glow-4: 0 12px 44px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 35%, transparent);\n\t--shadow-glow-5: 0 20px 60px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 42%, transparent);\n\n\t/* Frosted-glass overlay shadows — use shadow-overlay (centered/sheet) and shadow-overlay-anchored (popover) */\n\t--shadow-overlay:\n\t\t0 1px 2px color-mix(in srgb, #000 8%, transparent),\n\t\t0 28px 60px -20px color-mix(in srgb, #000 45%, transparent),\n\t\tinset 0 1px 0 0 color-mix(in srgb, var(--schmancy-sys-color-surface-on) 8%, transparent);\n\t--shadow-overlay-anchored:\n\t\t0 1px 2px color-mix(in srgb, #000 8%, transparent),\n\t\t0 12px 28px -12px color-mix(in srgb, #000 35%, transparent),\n\t\tinset 0 1px 0 0 color-mix(in srgb, var(--schmancy-sys-color-surface-on) 8%, transparent);\n\t--font-sans:\n\t\tvar(--schmancy-font-family), ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',\n\t\t'Segoe UI Symbol', 'Noto Color Emoji';\n\t--font-serif: var(--schmancy-font-family), ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif;\n\t--font-mono:\n\t\tvar(--schmancy-font-family), ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono',\n\t\t'Courier New', monospace;\n\t--color-black: #000;\n\t--color-white: #fff;\n\t--spacing: 0.25rem;\n\t--breakpoint-sm: 40rem;\n\t--breakpoint-md: 48rem;\n\t--breakpoint-lg: 64rem;\n\t--breakpoint-xl: 80rem;\n\t--breakpoint-2xl: 96rem;\n\t--container-3xs: 16rem;\n\t--container-2xs: 18rem;\n\t--container-xs: 20rem;\n\t--container-sm: 24rem;\n\t--container-md: 28rem;\n\t--container-lg: 32rem;\n\t--container-xl: 36rem;\n\t--container-2xl: 42rem;\n\t--container-3xl: 48rem;\n\t--container-4xl: 56rem;\n\t--container-5xl: 64rem;\n\t--container-6xl: 72rem;\n\t--container-7xl: 80rem;\n\t--text-xs: 0.75rem;\n\t--text-xs--line-height: calc(1 / 0.75);\n\t--text-sm: 0.875rem;\n\t--text-sm--line-height: calc(1.25 / 0.875);\n\t--text-base: 1rem;\n\t--text-base--line-height: calc(1.5 / 1);\n\t--text-lg: 1.125rem;\n\t--text-lg--line-height: calc(1.75 / 1.125);\n\t--text-xl: 1.25rem;\n\t--text-xl--line-height: calc(1.75 / 1.25);\n\t--text-2xl: 1.5rem;\n\t--text-2xl--line-height: calc(2 / 1.5);\n\t--text-3xl: 1.875rem;\n\t--text-3xl--line-height: calc(2.25 / 1.875);\n\t--text-4xl: 2.25rem;\n\t--text-4xl--line-height: calc(2.5 / 2.25);\n\t--text-5xl: 3rem;\n\t--text-5xl--line-height: 1;\n\t--text-6xl: 3.75rem;\n\t--text-6xl--line-height: 1;\n\t--text-7xl: 4.5rem;\n\t--text-7xl--line-height: 1;\n\t--text-8xl: 6rem;\n\t--text-8xl--line-height: 1;\n\t--text-9xl: 8rem;\n\t--text-9xl--line-height: 1;\n\t--font-weight-thin: 100;\n\t--font-weight-extralight: 200;\n\t--font-weight-light: 300;\n\t--font-weight-normal: 400;\n\t--font-weight-medium: 500;\n\t--font-weight-semibold: 600;\n\t--font-weight-bold: 700;\n\t--font-weight-extrabold: 800;\n\t--font-weight-black: 900;\n\t--tracking-tighter: -0.05em;\n\t--tracking-tight: -0.025em;\n\t--tracking-normal: 0em;\n\t--tracking-wide: 0.025em;\n\t--tracking-wider: 0.05em;\n\t--tracking-widest: 0.1em;\n\t--leading-tight: 1.25;\n\t--leading-snug: 1.375;\n\t--leading-normal: 1.5;\n\t--leading-relaxed: 1.625;\n\t--leading-loose: 2;\n\t--radius-xs: 0.125rem;\n\t--radius-sm: 0.25rem;\n\t--radius-md: 0.375rem;\n\t--radius-lg: 0.5rem;\n\t--radius-xl: 0.75rem;\n\t--radius-2xl: 1rem;\n\t--radius-3xl: 1.5rem;\n\t--radius-4xl: 2rem;\n\t--shadow-2xs: 0 1px rgb(0 0 0 / 0.05);\n\t--shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n\t--shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n\t--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n\t--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n\t--shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n\t--shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n\t--inset-shadow-2xs: inset 0 1px rgb(0 0 0 / 0.05);\n\t--inset-shadow-xs: inset 0 1px 1px rgb(0 0 0 / 0.05);\n\t--inset-shadow-sm: inset 0 2px 4px rgb(0 0 0 / 0.05);\n\t--drop-shadow-xs: 0 1px 1px rgb(0 0 0 / 0.05);\n\t--drop-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.15);\n\t--drop-shadow-md: 0 3px 3px rgb(0 0 0 / 0.12);\n\t--drop-shadow-lg: 0 4px 4px rgb(0 0 0 / 0.15);\n\t--drop-shadow-xl: 0 9px 7px rgb(0 0 0 / 0.1);\n\t--drop-shadow-2xl: 0 25px 25px rgb(0 0 0 / 0.15);\n\t--blur-xs: 4px;\n\t--blur-sm: 8px;\n\t--blur-md: 12px;\n\t--blur-lg: 16px;\n\t--blur-xl: 24px;\n\t--blur-2xl: 40px;\n\t--blur-3xl: 64px;\n\t--perspective-dramatic: 100px;\n\t--perspective-near: 300px;\n\t--perspective-normal: 500px;\n\t--perspective-midrange: 800px;\n\t--perspective-distant: 1200px;\n\t--aspect-video: 16 / 9;\n\t--ease-in: cubic-bezier(0.4, 0, 1, 1);\n\t--ease-out: cubic-bezier(0, 0, 0.2, 1);\n\t--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n\t--animate-spin: spin 1s linear infinite;\n\t--animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;\n\t--animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n\t--animate-bounce: bounce 1s infinite;\n\t/* ========================================================================\n\t ANIMATION SYSTEM\n\n\t A comprehensive, reusable animation library organized by category.\n\t All animations use CSS custom properties for easy customization.\n\n\t NAMING CONVENTION:\n\t - Entrance animations: *-in (fade-in, slide-in, pop-in)\n\t - Exit animations: *-out (fade-out, slide-out)\n\t - Looping animations: descriptive name (float, pulse, shimmer)\n\n\t USAGE:\n\t - Use `animate-{name}` class in Tailwind\n\t - Combine with `opacity-0` for entrance animations\n\t - Use `animation-delay` via style attribute for staggered effects\n\t ======================================================================== */\n\n\t/* ------------------------------------------------------------------------\n\t TAILWIND DEFAULT ANIMATIONS\n\t Standard animations from Tailwind CSS\n\t ------------------------------------------------------------------------ */\n\t@keyframes spin {\n\t\tto { transform: rotate(360deg); }\n\t}\n\t@keyframes ping {\n\t\t75%, 100% { transform: scale(2); opacity: 0; }\n\t}\n\t@keyframes pulse {\n\t\t50% { opacity: 0.5; }\n\t}\n\t@keyframes bounce {\n\t\t0%, 100% {\n\t\t\ttransform: translateY(-25%);\n\t\t\tanimation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n\t\t}\n\t\t50% {\n\t\t\ttransform: none;\n\t\t\tanimation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n\t\t}\n\t}\n\n\t/* ------------------------------------------------------------------------\n\t ENTRANCE ANIMATIONS\n\t One-shot animations for elements entering the viewport.\n\t All use `forwards` fill-mode to maintain end state.\n\t ------------------------------------------------------------------------ */\n\n\t/* Fade In - Simple opacity transition */\n\t--animate-fade-in: fade-in 0.5s ease forwards;\n\t@keyframes fade-in {\n\t\tfrom { opacity: 0; }\n\t\tto { opacity: 1; }\n\t}\n\n\t/* Fade In Up - Fade with upward movement (subtle) */\n\t--animate-fade-in-up: fade-in-up 0.5s ease forwards;\n\t@keyframes fade-in-up {\n\t\tfrom { opacity: 0; transform: translateY(20px); }\n\t\tto { opacity: 1; transform: translateY(0); }\n\t}\n\n\t/* Fade In Up Large - Fade with larger upward movement + scale */\n\t--animate-fade-in-up-lg: fade-in-up-lg 0.6s cubic-bezier(0.34, 1.2, 0.64, 1) forwards;\n\t@keyframes fade-in-up-lg {\n\t\tfrom { opacity: 0; transform: translateY(30px) scale(0.95); }\n\t\tto { opacity: 1; transform: translateY(0) scale(1); }\n\t}\n\n\t/* Slide In Left - Enter from left side */\n\t--animate-slide-in-left: slide-in-left 0.5s ease forwards;\n\t@keyframes slide-in-left {\n\t\tfrom { opacity: 0; transform: translateX(-30px); }\n\t\tto { opacity: 1; transform: translateX(0); }\n\t}\n\n\t/* Slide In Right - Enter from right side */\n\t--animate-slide-in-right: slide-in-right 0.5s ease forwards;\n\t@keyframes slide-in-right {\n\t\tfrom { opacity: 0; transform: translateX(30px); }\n\t\tto { opacity: 1; transform: translateX(0); }\n\t}\n\n\t/* Pop In - Scale up with bounce easing */\n\t--animate-pop-in: pop-in 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;\n\t@keyframes pop-in {\n\t\tfrom { opacity: 0; transform: scale(0.8); }\n\t\tto { opacity: 1; transform: scale(1); }\n\t}\n\n\t/* Expand In - Subtle scale + translate entrance */\n\t--animate-expand-in: expand-in 0.5s ease forwards;\n\t@keyframes expand-in {\n\t\tfrom { opacity: 0; transform: scale(0.95) translateY(10px); }\n\t\tto { opacity: 1; transform: scale(1) translateY(0); }\n\t}\n\n\t/* Converge In - Dramatic entrance with overshoot */\n\t--animate-converge-in: converge-in 0.8s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;\n\t@keyframes converge-in {\n\t\t0% { opacity: 0; transform: scale(0) translateY(50px); }\n\t\t60% { opacity: 1; transform: scale(1.1) translateY(-10px); }\n\t\t100% { opacity: 1; transform: scale(1) translateY(0); }\n\t}\n\n\t/* Spin In - Rotate + scale entrance */\n\t--animate-spin-in: spin-in 0.6s cubic-bezier(0.34, 1.2, 0.64, 1) forwards;\n\t@keyframes spin-in {\n\t\tfrom { opacity: 0; transform: scale(0) rotate(-180deg); }\n\t\tto { opacity: 1; transform: scale(1) rotate(0deg); }\n\t}\n\n\t/* Scatter In - Scale from 0 to partial opacity (for decorative elements) */\n\t--animate-scatter-in: scatter-in 1s ease forwards;\n\t@keyframes scatter-in {\n\t\tfrom { opacity: 0; transform: scale(0); }\n\t\tto { opacity: 0.2; transform: scale(1); }\n\t}\n\n\t/* ------------------------------------------------------------------------\n\t LOOPING ANIMATIONS - PULSE VARIANTS\n\t Continuous pulsing effects for attention/status indicators.\n\t ------------------------------------------------------------------------ */\n\n\t/* Pulse Opacity - Simple opacity pulse */\n\t--animate-pulse-opacity: pulse-opacity 2s ease-in-out infinite;\n\t@keyframes pulse-opacity {\n\t\t0%, 100% { opacity: 1; }\n\t\t50% { opacity: 0.5; }\n\t}\n\n\t/* Pulse Scale - Scale + opacity pulse (for status dots) */\n\t--animate-pulse-scale: pulse-scale 1.5s ease infinite;\n\t@keyframes pulse-scale {\n\t\t0%, 100% { transform: scale(1); opacity: 1; }\n\t\t50% { transform: scale(1.3); opacity: 0.6; }\n\t}\n\n\t/* Pulse Glow - Scale + dynamic box-shadow (for highlighted elements) */\n\t--animate-pulse-glow: pulse-glow 2s ease infinite;\n\t@keyframes pulse-glow {\n\t\t0%, 100% {\n\t\t\ttransform: scale(1);\n\t\t\tbox-shadow: 0 0 20px var(--schmancy-sys-color-primary-default);\n\t\t}\n\t\t50% {\n\t\t\ttransform: scale(1.05);\n\t\t\tbox-shadow: 0 0 40px var(--schmancy-sys-color-primary-default);\n\t\t}\n\t}\n\n\t/* Pulse Ring - Expanding ring effect (for ripples) */\n\t--animate-pulse-ring: pulse-ring 2s ease-out infinite;\n\t@keyframes pulse-ring {\n\t\t0% { transform: scale(0.8); opacity: 0.6; }\n\t\t100% { transform: scale(2); opacity: 0; }\n\t}\n\n\t/* ------------------------------------------------------------------------\n\t LOOPING ANIMATIONS - FLOAT VARIANTS\n\t Gentle floating/hovering effects for ambient motion.\n\t ------------------------------------------------------------------------ */\n\n\t/* Float - Simple vertical float */\n\t--animate-float: float 3s ease-in-out infinite;\n\t@keyframes float {\n\t\t0%, 100% { transform: translateY(0); }\n\t\t50% { transform: translateY(-8px); }\n\t}\n\n\t/* Float Particle - Vertical float with scale + opacity (for particles) */\n\t--animate-float-particle: float-particle 4s ease-in-out infinite;\n\t@keyframes float-particle {\n\t\t0%, 100% { transform: translateY(0) scale(1); opacity: 0.6; }\n\t\t50% { transform: translateY(-30px) scale(1.2); opacity: 0.3; }\n\t}\n\n\t/* Float Chaos - Multi-axis chaotic movement (for scattered elements) */\n\t--animate-float-chaos: float-chaos 8s ease-in-out infinite;\n\t@keyframes float-chaos {\n\t\t0% { transform: translateY(0) rotate(0deg) scale(1); }\n\t\t25% { transform: translateY(-30px) rotate(15deg) scale(1.1); }\n\t\t50% { transform: translateY(-10px) rotate(-10deg) scale(0.95); }\n\t\t75% { transform: translateY(-40px) rotate(8deg) scale(1.05); }\n\t\t100% { transform: translateY(0) rotate(0deg) scale(1); }\n\t}\n\n\t/* ------------------------------------------------------------------------\n\t LOOPING ANIMATIONS - ROTATION\n\t Continuous rotation effects.\n\t ------------------------------------------------------------------------ */\n\n\t/* Rotate Orbit - Slow continuous rotation (for orbital elements) */\n\t--animate-rotate-orbit: rotate-orbit 20s linear infinite;\n\t@keyframes rotate-orbit {\n\t\tfrom { transform: rotate(0deg); }\n\t\tto { transform: rotate(360deg); }\n\t}\n\n\t/* ------------------------------------------------------------------------\n\t LOOPING ANIMATIONS - MOVEMENT EFFECTS\n\t Horizontal/directional movement for progress/flow indicators.\n\t ------------------------------------------------------------------------ */\n\n\t/* Shimmer - Left-to-right shine effect (use with overflow:hidden) */\n\t--animate-shimmer: shimmer 2s ease-in-out infinite;\n\t@keyframes shimmer {\n\t\t0% { left: -100%; }\n\t\t50%, 100% { left: 100%; }\n\t}\n\n\t/* Scan Vertical - Top-to-bottom scanning line */\n\t--animate-scan-vertical: scan-vertical 2s ease-in-out infinite;\n\t@keyframes scan-vertical {\n\t\t0% { top: 0; opacity: 0; }\n\t\t10% { opacity: 1; }\n\t\t90% { opacity: 1; }\n\t\t100% { top: 100%; opacity: 0; }\n\t}\n\n\t/* Scan Horizontal - Left-to-right scanning */\n\t--animate-scan-horizontal: scan-horizontal 2s ease-in-out infinite;\n\t@keyframes scan-horizontal {\n\t\t0% { left: -100%; }\n\t\t100% { left: 100%; }\n\t}\n\n\t/* Flow - Continuous left-to-right flow (for progress connectors) */\n\t--animate-flow: flow 2s ease-in-out infinite;\n\t@keyframes flow {\n\t\t0% { left: -50%; }\n\t\t100% { left: 150%; }\n\t}\n\n\t/* Line Float - Horizontal line traversal with opacity (for decorative lines) */\n\t--animate-line-float: line-float 4s ease-in-out infinite;\n\t@keyframes line-float {\n\t\t0%, 100% { transform: translateX(-100%) scaleX(0.5); opacity: 0; }\n\t\t50% { transform: translateX(100%) scaleX(1); opacity: 0.3; }\n\t}\n\n\t/* ------------------------------------------------------------------------\n\t KINETIC STATE — Physics-based feedback animations.\n\t UI communicates through motion, not icons.\n\t ------------------------------------------------------------------------ */\n\n\t/* Breathe — gentle living pulse for loading/active states */\n\t--animate-breathe: breathe 2.5s ease-in-out infinite;\n\t@keyframes breathe {\n\t\t0%, 100% { transform: scale(1); opacity: 1; }\n\t\t50% { transform: scale(1.015); opacity: 0.88; }\n\t}\n\n\t/* Glow Pulse — luminous throb for highlighted elements */\n\t--animate-glow-pulse: glow-pulse 2s ease-in-out infinite;\n\t@keyframes glow-pulse {\n\t\t0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--schmancy-sys-color-primary-default) 30%, transparent); }\n\t\t50% { box-shadow: 0 0 24px 4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 15%, transparent); }\n\t}\n\n\t/* Kinetic Shake — physics-damped error feedback */\n\t--animate-kinetic-shake: kinetic-shake 0.5s cubic-bezier(0.36, 0.07, 0.19, 0.97);\n\t@keyframes kinetic-shake {\n\t\t0%, 100% { transform: translateX(0); }\n\t\t10% { transform: translateX(-6px); }\n\t\t20% { transform: translateX(5px); }\n\t\t30% { transform: translateX(-4px); }\n\t\t40% { transform: translateX(3px); }\n\t\t50% { transform: translateX(-2px); }\n\t\t60% { transform: translateX(1px); }\n\t}\n\n\t/* Scale Tap — spring-physics tap response */\n\t--animate-scale-tap: scale-tap 250ms cubic-bezier(0.34, 1.56, 0.64, 1);\n\t@keyframes scale-tap {\n\t\t0% { transform: scale(1); }\n\t\t40% { transform: scale(0.94); }\n\t\t100% { transform: scale(1); }\n\t}\n\n\t/* Glow In — luminous entrance with depth */\n\t--animate-glow-in: glow-in 0.6s cubic-bezier(0.34, 1.2, 0.64, 1) forwards;\n\t@keyframes glow-in {\n\t\tfrom {\n\t\t\tbox-shadow: 0 0 0 0 transparent;\n\t\t\topacity: 0;\n\t\t\ttransform: scale(0.96);\n\t\t}\n\t\tto {\n\t\t\tbox-shadow: 0 8px 32px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 20%, transparent);\n\t\t\topacity: 1;\n\t\t\ttransform: scale(1);\n\t\t}\n\t}\n\n\t/* ------------------------------------------------------------------------\n\t CUSTOM EASING CURVES\n\t Reusable timing functions for consistent animation feel.\n\t ------------------------------------------------------------------------ */\n\t--ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);\n\t--ease-smooth: cubic-bezier(0.4, 0, 0.2, 1);\n\t--ease-snap: cubic-bezier(0.34, 1.2, 0.64, 1);\n}\n} /* end @layer schmancy.base */\n","import { CSSResult, LitElement, unsafeCSS } from 'lit'\n\nimport style from './tailwind.css?inline'\nimport { BaseElement, IBaseMixin } from './baseElement'\nimport { Constructor } from './constructor'\n\nexport declare class ITailwindElementMixin {\n\tstyles: (typeof CSSResult)[]\n}\n\nexport const tailwindStyles = unsafeCSS(style)\n\nconst TailwindElementBase = <T extends CSSResult>(componentStyle?: T) => {\n\tclass TailwindMixinClass extends LitElement {\n\t\tstatic styles = [unsafeCSS(componentStyle), tailwindStyles]\n\t}\n\treturn TailwindMixinClass as Constructor<LitElement> /* see \"typing the subclass\" below */\n}\n\nexport const TailwindElement = <T extends CSSResult>(componentStyle?: T) => {\n\tclass TailwindMixinClass extends BaseElement(TailwindElementBase(componentStyle)) {\n\t\tdisconnectedCallback = () => {\n\t\t\tsuper.disconnectedCallback()\n\t\t}\n\t}\n\treturn TailwindMixinClass as Constructor<CustomElementConstructor> &\n\t\tConstructor<ITailwindElementMixin> &\n\t\tConstructor<LitElement> &\n\t\tConstructor<IBaseMixin>\n}\n","import { LitElement, type CSSResultGroup, type CSSResultOrNative } from 'lit'\nimport { SignalWatcher } from '@lit-labs/signals'\nimport { BaseElement, type IBaseMixin } from './baseElement'\nimport { tailwindStyles } from './tailwind.mixin'\nimport type { Constructor } from './constructor'\nimport { _activeHost } from '../src/state/active-host'\n\n// Cast to instance-only Constructor + a narrow static surface for `finalizeStyles`.\n// Avoids exposing LitElement's full static side (which has `protected static\n// shadowRootOptions`); that would conflict with subclasses that declare their own\n// `protected static shadowRootOptions = { ..., delegatesFocus: true }` to widen\n// visibility — same shape TailwindElement uses.\ntype StaticFinalizeStyles = {\n\tfinalizeStyles(styles?: CSSResultGroup): CSSResultOrNative[]\n}\nconst SchmancyElementBase = SignalWatcher(BaseElement(LitElement)) as unknown as\n\tCustomElementConstructor & Constructor<LitElement> & Constructor<IBaseMixin> & StaticFinalizeStyles\n\n// ---------------------------------------------------------------------------\n// Active-host integration. Two layers:\n//\n// (1) Prototype-chain wrap. The first instance of every concrete subclass\n// triggers a walk that wraps every function-typed descriptor on the\n// chain (up to but not including HTMLElement.prototype) with\n// `_activeHost.run(this, …)`. Catches `render()`, every Lit lifecycle\n// hook, and every user-defined class method (sync or async — the host\n// propagates across `await` via the Promise.then patch in\n// `active-host.ts`). Idempotent: each prototype object is wrapped at\n// most once, regardless of how many subclasses share it.\n//\n// (2) `addEventListener` override. Listeners attached imperatively to\n// the host run inside `_activeHost.run(this, …)`. We keep an\n// `original→wrapped` map so `removeEventListener` finds the wrapped\n// listener.\n//\n// Inline arrow handlers attached via Lit templates (`@click=${() => …}`)\n// are not wrapped at this layer — Lit attaches them to *child* elements,\n// not the host. They resolve correctly via the\n// `window.event.composedPath()` fallback in `resolveActiveHost()`: a\n// `context-request` dispatched from the click target bubbles (composed)\n// up to the enclosing `<schmancy-context>` provider.\n// ---------------------------------------------------------------------------\n\n// Lit's internal protocol methods (e.g. `_$attributeToProperty`) are\n// framework plumbing; wrapping them risks breaking Lit's update scheduling\n// for no semantic gain — the host is already on the stack from the wrap of\n// the public lifecycle methods that call them.\nfunction shouldSkipMethod(key: string): boolean {\n\tif (key === 'constructor') return true\n\tif (key.startsWith('_$')) return true\n\treturn false\n}\n\nconst wrappedProtos = new WeakSet<object>()\n\nfunction wrapPrototypeChain(ctor: { prototype: object }): void {\n\tlet proto: object | null = ctor.prototype\n\twhile (proto && proto !== HTMLElement.prototype) {\n\t\tif (wrappedProtos.has(proto)) break\n\t\twrappedProtos.add(proto)\n\t\tconst descs = Object.getOwnPropertyDescriptors(proto)\n\t\tfor (const [key, desc] of Object.entries(descs)) {\n\t\t\tif (shouldSkipMethod(key)) continue\n\t\t\tif (typeof desc.value !== 'function') continue\n\t\t\tif (!desc.configurable) continue\n\t\t\tconst original = desc.value as (...args: unknown[]) => unknown\n\t\t\tObject.defineProperty(proto, key, {\n\t\t\t\t...desc,\n\t\t\t\tvalue: function wrappedForActiveHost(this: HTMLElement, ...args: unknown[]) {\n\t\t\t\t\treturn _activeHost.run(this, () => original.apply(this, args))\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\tproto = Object.getPrototypeOf(proto) as object | null\n\t}\n}\n\ntype AnyListener = EventListener | EventListenerObject\nconst listenerWrapCache = new WeakMap<AnyListener, EventListener>()\n\nfunction wrapHostListener(host: HTMLElement, listener: AnyListener): EventListener {\n\tconst cached = listenerWrapCache.get(listener)\n\tif (cached) return cached\n\tconst wrapped: EventListener = function wrappedHostListener(this: unknown, evt: Event) {\n\t\t_activeHost.run(host, () => {\n\t\t\tif (typeof listener === 'function') {\n\t\t\t\t;(listener as EventListener).call(this, evt)\n\t\t\t} else {\n\t\t\t\tlistener.handleEvent(evt)\n\t\t\t}\n\t\t})\n\t}\n\tlistenerWrapCache.set(listener, wrapped)\n\treturn wrapped\n}\n\n/**\n * Base class for Schmancy components. A concrete named class — not a mixin\n * factory — so DevTools shows `SchmancyElement` in the prototype chain and\n * `extends SchmancyElement` reads like `extends LitElement` for new\n * contributors.\n *\n * Composes:\n * 1. `LitElement` — Lit base\n * 2. `BaseElement` — `disconnecting` Subject, classMap/styleMap,\n * discovery, `stableId`, `uid`, `locale`\n * 3. `SignalWatcher` — auto-tracks every signal read in `render()`\n *\n * Tailwind styles are injected automatically via `finalizeStyles` — subclasses\n * just declare their own component-local styles in `static styles`:\n *\n * @customElement('my-card')\n * class MyCard extends SchmancyElement {\n * static styles = [css`:host { display: block }`]\n * render() { return html`<slot></slot>` }\n * }\n *\n * Cleanup primitives (both fire on disconnect):\n * - `disconnecting: Subject<void>` — RxJS, used with `takeUntil`\n * - `disconnectedSignal: AbortSignal` — native, used with `fetch`,\n * `addEventListener`, or any AbortSignal-aware API\n *\n * Never wrap with `SignalWatcher` again — it is already part of the base.\n * `SignalWatcher(SchmancyElement)` creates two nested Computeds and panics\n * with \"Detected cycle in computations\" at runtime; the pre-edit lint\n * (`NO_SIGNAL_WATCHER_WRAP`) blocks it as belt-and-suspenders.\n */\nexport class SchmancyElement extends SchmancyElementBase {\n\tprivate _abortController = new AbortController()\n\n\t/** AbortSignal that fires when the element disconnects. */\n\treadonly disconnectedSignal: AbortSignal = this._abortController.signal\n\n\tconstructor() {\n\t\tsuper()\n\t\twrapPrototypeChain(this.constructor as { prototype: object })\n\t}\n\n\tstatic override finalizeStyles(\n\t\tstyles?: CSSResultGroup,\n\t): CSSResultOrNative[] {\n\t\treturn [...super.finalizeStyles(styles), tailwindStyles]\n\t}\n\n\toverride addEventListener(\n\t\ttype: string,\n\t\tlistener: EventListenerOrEventListenerObject | null,\n\t\toptions?: boolean | AddEventListenerOptions,\n\t): void {\n\t\tif (listener == null) {\n\t\t\tsuper.addEventListener(type, listener, options)\n\t\t\treturn\n\t\t}\n\t\tsuper.addEventListener(type, wrapHostListener(this, listener), options)\n\t}\n\n\toverride removeEventListener(\n\t\ttype: string,\n\t\tlistener: EventListenerOrEventListenerObject | null,\n\t\toptions?: boolean | EventListenerOptions,\n\t): void {\n\t\tif (listener == null) {\n\t\t\tsuper.removeEventListener(type, listener, options)\n\t\t\treturn\n\t\t}\n\t\tconst wrapped = listenerWrapCache.get(listener)\n\t\tsuper.removeEventListener(type, wrapped ?? (listener as EventListener), options)\n\t}\n\n\toverride disconnectedCallback() {\n\t\tthis._abortController.abort()\n\t\tsuper.disconnectedCallback()\n\t}\n}\n\n/**\n * Decorator: `@schmancyElement('tag-name')`. The standard way to register\n * a `SchmancyElement` subclass.\n *\n * Drop-in replacement for Lit's `@customElement`. The difference is\n * timing: this decorator wraps the prototype's methods with\n * `_activeHost.run` BEFORE calling `customElements.define`.\n *\n * Why this matters: the HTML spec captures the element's lifecycle\n * callback references (`connectedCallback`, `disconnectedCallback`, etc.)\n * off the prototype at `customElements.define` time, and the browser\n * invokes those cached references for the element's lifecycle — it does\n * NOT re-look-up the prototype each time. SchmancyElement's constructor\n * installs the active-host wrap on first instantiation, which is strictly\n * later than `define`, so the browser ends up calling unwrapped\n * lifecycle callbacks. Reads inside `connectedCallback` then fall through\n * to `document.activeElement`, miss the enclosing `<schmancy-context>`,\n * and resolve to the module-scoped global instead of the isolated copy.\n *\n * Use this decorator for any subclass that:\n * - Reads or writes a state-singleton inside `connectedCallback` or\n * `disconnectedCallback`, AND\n * - May appear inside a `<schmancy-context>` subtree.\n *\n * For elements that never touch state in lifecycle callbacks, plain\n * `@customElement` from `lit/decorators.js` still works — the\n * constructor's wrap covers everything else (render, class methods,\n * event handlers attached via the prototype). The two decorators are\n * interchangeable for those cases.\n */\nexport function schmancyElement(tagName: string) {\n\treturn <T extends CustomElementConstructor>(cls: T): T => {\n\t\twrapPrototypeChain(cls as { prototype: object })\n\t\tcustomElements.define(tagName, cls)\n\t\treturn cls\n\t}\n}\n","import { CSSResult, LitElement, PropertyValueMap } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { IBaseMixin } from './baseElement'\nimport { Constructor } from './constructor'\nimport { ITailwindElementMixin } from './tailwind.mixin'\nimport { SchmancyElement } from './SchmancyElement'\n\n/**\n * Cross-realm brand used by `<schmancy-form>` to discover form fields by\n * inheritance rather than tag-name allowlists. `Symbol.for` puts the symbol in\n * the global registry so detection works across module realms/bundles.\n */\nexport const SCHMANCY_FORM_FIELD = Symbol.for('schmancy.form-field')\n\n/**\n * Composed event a field dispatches in `connectedCallback`. `<schmancy-form>`\n * subscribes via `fromEvent(this, FIELD_CONNECT_EVENT)` and adds the field to\n * its registry. No matching disconnect event — composed events from a\n * disconnected node have an empty composed path; cleanup is via `isConnected`\n * filter at iteration time.\n */\nexport const FIELD_CONNECT_EVENT = 'schmancy:field:connect'\n\n/**\n * Validation modes.\n * - `dirty` (default per Revolute) — show errors only after value diverged.\n * - `touched` — show errors after first blur, even if value unchanged.\n * - `always` — show errors immediately (live search).\n * - `submitted` — hold all errors until submit (wizard step).\n * - `length` — fire validation only when `value.length` reaches `maxlength`\n * (Stripe pattern for predictable-length fields: ZIP, phone, card number).\n */\nexport type ValidateOn = 'always' | 'touched' | 'dirty' | 'submitted' | 'length'\n\n/**\n * Per-field error-message override map. Keys are `ValidityState` flag names;\n * values are the message to display when that flag is set. Unset flags fall\n * back to the mixin's hardcoded defaults (English).\n *\n * Use for i18n or domain-specific copy:\n * ```ts\n * <schmancy-input\n * .errorMessages=${{ valueMissing: 'Adresse e-mail requise', typeMismatch: 'Format e-mail invalide' }}\n * type=\"email\" required\n * ></schmancy-input>\n * ```\n */\nexport type ErrorMessages = Partial<Record<keyof ValidityState, string>>\n\n/**\n * Interface defining the properties and methods that the FormFieldMixin adds.\n */\nexport interface IFormFieldMixin extends Element {\n\tname: string\n\tvalue: string | string[] | boolean | number | undefined\n\tlabel: string\n\trequired: boolean\n\tdisabled: boolean\n\treadonly: boolean\n\terror: boolean\n\tvalidationMessage: string\n\thint?: string\n\tid: string\n\n\t/** Set to `true` once the user has blurred the field at least once. */\n\ttouched: boolean\n\t/** `true` when the current value differs from the captured default. */\n\tdirty: boolean\n\t/** Inverse of `dirty`. */\n\tpristine: boolean\n\t/** Set to `true` by `<schmancy-form>` on submit (forces error display). */\n\tsubmitted: boolean\n\t/** Validation mode — controls when errors display. Default `'dirty'`. */\n\tvalidateOn: ValidateOn\n\n\t/**\n\t * Per-field error-message override map (i18n hook). See `ErrorMessages`.\n\t * Unset keys fall back to the mixin's hardcoded English defaults.\n\t */\n\terrorMessages?: ErrorMessages\n\n\t/**\n\t * `ElementInternals` instance attached by the mixin. Exposed so subclasses\n\t * with non-standard validity semantics (date-range, multi-select) can\n\t * surface platform `ValidityStateFlags` directly via\n\t * `internals.setValidity({ valueMissing: true })` rather than rolling their\n\t * own `attachInternals` call.\n\t */\n\tinternals: ElementInternals | undefined\n\n\tform: HTMLFormElement | null\n\n\tcheckValidity(): boolean\n\treportValidity(): boolean\n\tsetCustomValidity(message: string): void\n\n\t/** Mark the field as touched (component should call on blur). */\n\tmarkTouched(): void\n\t/** Mark the field as submitted (called by `<schmancy-form>` on submit). */\n\tmarkSubmitted(): void\n\t/**\n\t * Clear the `submitted` flag without resetting value/touched/error.\n\t * Used by wizards: stepping back from step N to step N-1 should not\n\t * leave step N-1's fields in aggressive \"show all errors\" mode.\n\t */\n\tclearSubmitted(): void\n\n\t/**\n\t * `true` while an async validator is in flight. Broadcast as\n\t * `:state(validating)`. `<schmancy-form>` blocks submit until every\n\t * registered field's `isValidating` is back to `false`.\n\t */\n\tisValidating: boolean\n\n\t/**\n\t * Run an async validator. While the promise is pending, `isValidating` is\n\t * `true` and `:state(validating)` is broadcast. On resolve, the returned\n\t * string is passed to `setCustomValidity` — empty string clears any\n\t * existing custom error; non-empty marks the field invalid with that\n\t * message.\n\t *\n\t * Submitting the form while a validator is pending is queued — the form\n\t * waits for `Promise.all(pending validators)` to settle before proceeding.\n\t */\n\trunAsyncValidator(fn: () => Promise<string>): Promise<void>\n\n\t/**\n\t * Whether the gate for showing validation errors is open right now. Exposed\n\t * so subclasses with custom error-display channels (e.g. select renders\n\t * errors on a child input) can keep their gate consistent with the mixin's.\n\t * Subclasses should not override this — extend the truth table by changing\n\t * `validateOn` instead.\n\t */\n\t_shouldShowError(): boolean\n\n\ttoFormEntries(): Array<[string, FormDataEntryValue]>\n\tresetForm(): void\n\n\temitChange(detail: any): void\n}\n\n/** Predicate used by `<schmancy-form>` to detect mixin descendants. */\nexport function isSchmancyFormField(el: unknown): el is IFormFieldMixin {\n\treturn !!el && typeof el === 'object' && (el as any).constructor?.[SCHMANCY_FORM_FIELD] === true\n}\n\n/**\n * A mixin that adds form field capabilities to a LitElement class.\n * Components that extend this mixin are automatically discovered and\n * collected by `<schmancy-form>` — no tag-name registration needed.\n *\n * Subclasses may override `toFormEntries()` to contribute multiple\n * name/value pairs to FormData (e.g. date-range, tag-input).\n *\n * @example\n * ```ts\n * class MyInput extends FormFieldMixin(TailwindElement(css`...`)) {\n * // Your component code here\n * }\n * ```\n */\nexport function FormFieldMixin<T extends Constructor<LitElement>>(superClass: T) {\n\tclass FormFieldMixinClass extends superClass {\n\t\tstatic formAssociated = true\n\n\t\t/** Brand for cross-realm detection by `<schmancy-form>`. */\n\t\tstatic readonly [SCHMANCY_FORM_FIELD] = true\n\n\t\t// Element internals for form association\n\t\tinternals: ElementInternals | undefined\n\n\t\t/** Value snapshot captured at first render, used by `resetForm()`. */\n\t\tprotected _defaultValue: string | string[] | boolean | number | undefined = undefined\n\n\t\t@property({ type: String })\n\t\tname: string = ''\n\n\t\t@property({ reflect: true })\n\t\tvalue: string | string[] | boolean | number | undefined = ''\n\n\t\t@property({ type: String })\n\t\tlabel: string = ''\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\trequired: boolean = false\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\tdisabled: boolean = false\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\treadonly: boolean = false\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\terror: boolean = false\n\n\t\t@property({ type: String })\n\t\tvalidationMessage: string = ''\n\n\t\t@property({ type: String })\n\t\thint?: string\n\n\t\t@property({ reflect: true })\n\t\toverride id: string = `schmancy-field-${Date.now()}-${Math.floor(Math.random() * 1000)}`\n\n\t\t// ----- Validation UX state (Revolute contract) -----\n\n\t\t/** True after the user has blurred the field at least once. */\n\t\t@state() touched: boolean = false\n\n\t\t/** Set by `<schmancy-form>` on submit; persists until `resetForm()`. */\n\t\t@state() submitted: boolean = false\n\n\t\t/**\n\t\t * When errors display. Default `'dirty'` — the autofocus+cancel anti-pattern\n\t\t * is avoided because pristine fields never show errors until submit.\n\t\t */\n\t\t@property({ type: String, reflect: true })\n\t\tvalidateOn: ValidateOn = 'dirty'\n\n\t\t/**\n\t\t * Optional override for the validity-flag → message map. See\n\t\t * `ErrorMessages`. Unset keys fall back to the mixin's defaults.\n\t\t */\n\t\t@property({ attribute: false })\n\t\terrorMessages?: ErrorMessages\n\n\t\t/** True when value has been changed from the captured default. */\n\t\tget dirty(): boolean {\n\t\t\treturn this._defaultValue !== undefined && this.value !== this._defaultValue\n\t\t}\n\n\t\tget pristine(): boolean {\n\t\t\treturn !this.dirty\n\t\t}\n\n\t\tmarkTouched(): void {\n\t\t\tif (!this.touched) this.touched = true\n\t\t}\n\n\t\tmarkSubmitted(): void {\n\t\t\tif (!this.submitted) this.submitted = true\n\t\t}\n\n\t\tclearSubmitted(): void {\n\t\t\tif (this.submitted) this.submitted = false\n\t\t}\n\n\t\t/**\n\t\t * Reactive flag set while an async validator is in flight. Read by\n\t\t * `<schmancy-form>` to gate submit; broadcast as `:state(validating)`\n\t\t * for CSS spinner targeting.\n\t\t */\n\t\t@state() isValidating: boolean = false\n\n\t\tasync runAsyncValidator(fn: () => Promise<string>): Promise<void> {\n\t\t\tif (this.isValidating) {\n\t\t\t\t// Cancel-by-supersede semantics — a new call wins; the previous\n\t\t\t\t// is best-effort and its result is dropped if it resolves later.\n\t\t\t\tthis._asyncValidatorEpoch++\n\t\t\t}\n\t\t\tconst epoch = ++this._asyncValidatorEpoch\n\t\t\tthis.isValidating = true\n\t\t\ttry {\n\t\t\t\tconst message = await fn()\n\t\t\t\tif (epoch !== this._asyncValidatorEpoch) return // superseded\n\t\t\t\tthis.setCustomValidity(message)\n\t\t\t} finally {\n\t\t\t\tif (epoch === this._asyncValidatorEpoch) {\n\t\t\t\t\tthis.isValidating = false\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tprivate _asyncValidatorEpoch: number = 0\n\n\t\t/**\n\t\t * Whether `checkValidity()` should display errors right now.\n\t\t * `submitted` overrides every mode — once a submit attempt happens, the\n\t\t * field stays in live-correction mode (Phase 3) for the rest of the\n\t\t * session, and `resetForm()` is the only way back. The leading\n\t\t * underscore marks this as an internal API: subclasses may call it but\n\t\t * should not override it (extend the truth table by changing\n\t\t * `validateOn` instead).\n\t\t */\n\t\t_shouldShowError(): boolean {\n\t\t\tif (this.submitted) return true\n\t\t\tswitch (this.validateOn) {\n\t\t\t\tcase 'always':\n\t\t\t\t\treturn true\n\t\t\t\tcase 'touched':\n\t\t\t\t\treturn this.touched\n\t\t\t\tcase 'dirty':\n\t\t\t\t\treturn this.dirty\n\t\t\t\tcase 'submitted':\n\t\t\t\t\treturn false\n\t\t\t\tcase 'length':\n\t\t\t\t\t// Predictable-length fields: validate once value reaches the\n\t\t\t\t\t// maxlength constraint. Stripe pattern. Falls back to dirty\n\t\t\t\t\t// if no maxlength is set.\n\t\t\t\t\tif (typeof this.value === 'string') {\n\t\t\t\t\t\tconst max = (this as unknown as { maxlength?: number }).maxlength\n\t\t\t\t\t\tif (typeof max === 'number' && max > 0) {\n\t\t\t\t\t\t\treturn this.value.length >= max\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this.dirty\n\t\t\t}\n\t\t}\n\n\t\tconstructor(...args: any[]) {\n\t\t\tsuper(...args)\n\t\t\ttry {\n\t\t\t\tthis.internals = this.attachInternals()\n\t\t\t} catch {\n\t\t\t\tthis.internals = undefined\n\t\t\t}\n\t\t}\n\n\t\toverride connectedCallback(): void {\n\t\t\tsuper.connectedCallback()\n\t\t\t// Register with any ancestor <schmancy-form> via composed event.\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent(FIELD_CONNECT_EVENT, {\n\t\t\t\t\tdetail: this,\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\t/** The form this element is associated with (native FACE behavior). */\n\t\tget form(): HTMLFormElement | null {\n\t\t\treturn this.internals?.form ?? null\n\t\t}\n\n\t\tprotected firstUpdated(changedProps: PropertyValueMap<any>): void {\n\t\t\tsuper.firstUpdated?.(changedProps)\n\t\t\tif (this._defaultValue === undefined) this._defaultValue = this.value\n\t\t\t// Sync platform validity (`internals.setValidity`) once after first\n\t\t\t// render so `<form>.checkValidity()` and `:invalid` reflect truth\n\t\t\t// even when no property change has fired through `willUpdate` yet\n\t\t\t// (e.g. for required-empty fields with class-field-initialized\n\t\t\t// defaults that Lit doesn't see as \"changed\" on the first cycle).\n\t\t\tthis.checkValidity()\n\t\t}\n\n\t\tprotected willUpdate(changedProps: PropertyValueMap<any>): void {\n\t\t\tsuper.willUpdate(changedProps)\n\n\t\t\tif (changedProps.has('value')) {\n\t\t\t\tthis.internals?.setFormValue(this.value as string | File | FormData | null)\n\t\t\t\t// :state(dirty) tracks value-vs-default; recompute on every value change.\n\t\t\t\tif (this.dirty) this.internals?.states.add('dirty')\n\t\t\t\telse this.internals?.states.delete('dirty')\n\t\t\t\t// Always sync platform validity (internals.setValidity) so\n\t\t\t\t// `<form>.checkValidity()` and `:invalid` reflect truth, even\n\t\t\t\t// while the visual `error` gate stays closed for pristine\n\t\t\t\t// fields under `validateOn: 'dirty'`. The visibility gate is\n\t\t\t\t// inside checkValidity() itself.\n\t\t\t\tthis.checkValidity()\n\t\t\t}\n\n\t\t\tif (changedProps.has('required') || changedProps.has('disabled')) {\n\t\t\t\tthis.checkValidity()\n\t\t\t}\n\n\t\t\tif (changedProps.has('isValidating')) {\n\t\t\t\tif (this.isValidating) this.internals?.states.add('validating')\n\t\t\t\telse this.internals?.states.delete('validating')\n\t\t\t}\n\n\t\t\tif (changedProps.has('touched')) {\n\t\t\t\tif (this.touched) this.internals?.states.add('touched')\n\t\t\t\telse this.internals?.states.delete('touched')\n\t\t\t\t// Phase 2 — blur on a dirty field. Validate to surface the error.\n\t\t\t\tif (this.touched && this.dirty) this.checkValidity()\n\t\t\t}\n\n\t\t\tif (changedProps.has('submitted')) {\n\t\t\t\tif (this.submitted) {\n\t\t\t\t\tthis.internals?.states.add('submitted')\n\t\t\t\t\t// Phase 4 — submit forces error display regardless of dirty/touched.\n\t\t\t\t\tthis.checkValidity()\n\t\t\t\t} else {\n\t\t\t\t\tthis.internals?.states.delete('submitted')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Note: we do not write to `internals.setValidity` from willUpdate\n\t\t\t// based on `error` / `validationMessage` changes. `checkValidity`\n\t\t\t// and `setCustomValidity` are the sole writers — overwriting the\n\t\t\t// validity flags from willUpdate would clobber structured flags\n\t\t\t// set by subclass overrides (e.g. input.ts surfaces typeMismatch /\n\t\t\t// patternMismatch / tooShort / etc.).\n\n\t\t\tif (changedProps.has('error')) {\n\t\t\t\tif (this.error) this.internals?.states.add('invalid')\n\t\t\t\telse this.internals?.states.delete('invalid')\n\t\t\t\t// ARIA reflection through ElementInternals reaches AT through shadow DOM.\n\t\t\t\tif (this.internals) this.internals.ariaInvalid = this.error ? 'true' : 'false'\n\t\t\t}\n\n\t\t\tif (changedProps.has('required') || changedProps.has('disabled')) {\n\t\t\t\tif (this.required) this.internals?.states.add('required')\n\t\t\t\telse this.internals?.states.delete('required')\n\t\t\t\t// Suppress aria-required when disabled — disabled fields shouldn't\n\t\t\t\t// announce as required to assistive tech.\n\t\t\t\tif (this.internals) {\n\t\t\t\t\tthis.internals.ariaRequired = this.required && !this.disabled ? 'true' : 'false'\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (changedProps.has('disabled')) {\n\t\t\t\tif (this.disabled) this.internals?.states.add('disabled')\n\t\t\t\telse this.internals?.states.delete('disabled')\n\t\t\t}\n\t\t\tif (changedProps.has('readonly')) {\n\t\t\t\tif (this.readonly) this.internals?.states.add('readonly')\n\t\t\t\telse this.internals?.states.delete('readonly')\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Native FACE lifecycle — called by the browser when the owning form\n\t\t * is reset. Delegates to `resetForm()` so subclasses have one\n\t\t * override point for both programmatic and user-initiated resets.\n\t\t */\n\t\tformResetCallback(): void {\n\t\t\tthis.resetForm()\n\t\t}\n\n\t\t/** Native FACE lifecycle — called when the form's disabled state changes. */\n\t\tformDisabledCallback(disabled: boolean): void {\n\t\t\tthis.disabled = disabled\n\t\t}\n\n\t\t/**\n\t\t * Native FACE lifecycle — restore value after bfcache / form autofill.\n\t\t */\n\t\tformStateRestoreCallback(state: string | File | FormData | null): void {\n\t\t\tif (state == null) return\n\t\t\tthis.value = state as any\n\t\t}\n\n\t\t/** Override to customize reset behavior; default restores `_defaultValue`. */\n\t\tresetForm(): void {\n\t\t\tthis.value = this._defaultValue ?? ''\n\t\t\tthis.error = false\n\t\t\tthis.validationMessage = ''\n\t\t\tthis.touched = false\n\t\t\tthis.submitted = false\n\t\t\tthis.internals?.setValidity({})\n\t\t}\n\n\t\t/**\n\t\t * Contribute entries to a parent FormData. Default: a single\n\t\t * `[name, value]` pair when `name` is set and value is meaningful.\n\t\t * Override for multi-entry controls (e.g. date range).\n\t\t */\n\t\ttoFormEntries(): Array<[string, FormDataEntryValue]> {\n\t\t\tif (!this.name || this.disabled) return []\n\t\t\tconst v = this.value\n\t\t\tif (v === undefined || v === null || v === '') return []\n\t\t\tif (Array.isArray(v)) return v.map(item => [this.name, String(item)] as [string, FormDataEntryValue])\n\t\t\tif (typeof v === 'boolean') return v ? [[this.name, 'on']] : []\n\t\t\treturn [[this.name, String(v)]]\n\t\t}\n\n\t\tcheckValidity(): boolean {\n\t\t\tif (this.disabled) {\n\t\t\t\tthis.internals?.setValidity({})\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tconst requiredFailed =\n\t\t\t\tthis.required && (this.value === '' || this.value === undefined || this.value === null)\n\t\t\t// Custom errors set via setCustomValidity() are platform-truth too —\n\t\t\t// preserve them through re-validation cycles.\n\t\t\tconst customErrorSet = !!this.internals?.validity?.customError\n\t\t\tconst isValid = !requiredFailed && !customErrorSet\n\t\t\tconst requiredMessage =\n\t\t\t\tthis.errorMessages?.valueMissing ?? 'This field is required'\n\t\t\tconst defaultMessage = requiredFailed ? requiredMessage : 'Invalid value'\n\n\t\t\t// Platform validity (read by `form.checkValidity()` and `:invalid`)\n\t\t\t// is always set to the truth — independent of the visual gate.\n\t\t\tif (requiredFailed) {\n\t\t\t\tthis.internals?.setValidity(\n\t\t\t\t\t{ valueMissing: true },\n\t\t\t\t\tthis.validationMessage || defaultMessage,\n\t\t\t\t)\n\t\t\t} else if (!customErrorSet) {\n\t\t\t\t// No required failure, no custom error — clear flags.\n\t\t\t\tthis.internals?.setValidity({})\n\t\t\t}\n\t\t\t// (customErrorSet branch falls through — leave the custom validity intact.)\n\n\t\t\t// Visual `error` flag is gated. The returned boolean tells the caller\n\t\t\t// the truth; only the in-component error display is suppressed for\n\t\t\t// pristine fields under `validateOn: 'dirty'`.\n\t\t\tif (this._shouldShowError()) {\n\t\t\t\tthis.error = !isValid\n\t\t\t\tif (!isValid && !this.validationMessage) {\n\t\t\t\t\tthis.validationMessage = defaultMessage\n\t\t\t\t} else if (isValid) {\n\t\t\t\t\tthis.validationMessage = ''\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn isValid\n\t\t}\n\n\t\treportValidity(): boolean {\n\t\t\tconst isValid = this.checkValidity()\n\t\t\tif (!isValid) this.internals?.reportValidity()\n\t\t\treturn isValid\n\t\t}\n\n\t\tsetCustomValidity(message: string): void {\n\t\t\tthis.validationMessage = message\n\t\t\tthis.error = message !== ''\n\t\t\tif (message) {\n\t\t\t\tthis.internals?.setValidity({ customError: true }, message)\n\t\t\t} else {\n\t\t\t\tthis.internals?.setValidity({})\n\t\t\t}\n\t\t}\n\n\t\temitChange(detail: any): void {\n\t\t\tif ('dispatchScopedEvent' in this && typeof this.dispatchScopedEvent === 'function') {\n\t\t\t\tthis.dispatchScopedEvent('change', detail, { bubbles: true })\n\t\t\t} else {\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('change', {\n\t\t\t\t\t\tdetail,\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn FormFieldMixinClass as Constructor<IFormFieldMixin> & T\n}\n\n/**\n * A convenience function that composes FormFieldMixin with SchmancyElement\n * to create a base class for Schmancy form components. Subclasses gain the\n * full SchmancyElement stack (SignalWatcher, _activeHost wrap, AbortSignal,\n * automatic Tailwind injection) plus the form-field semantics.\n */\nexport function SchmancyFormField<T extends CSSResult>(componentStyle?: T) {\n\tclass StyledSchmancyElement extends SchmancyElement {\n\t\tstatic styles = componentStyle ? [componentStyle] : []\n\t}\n\treturn FormFieldMixin(StyledSchmancyElement) as unknown as Constructor<IFormFieldMixin> &\n\t\tConstructor<ITailwindElementMixin> &\n\t\tConstructor<LitElement> &\n\t\tConstructor<IBaseMixin>\n}\n","import { CSSResult, LitElement } from 'lit'\nimport { IBaseMixin } from './baseElement'\nimport { Constructor } from './constructor'\nimport { SchmancyElement } from './SchmancyElement'\n\n/**\n * @deprecated Extend `SchmancyElement` directly and declare `static styles`.\n *\n * Before: extends $LitElement(css`...`)\n * After: extends SchmancyElement { static styles = [css`...`] }\n *\n * Kept as a thin alias for the migration window; will be removed in the next\n * major Schmancy release. The returned class extends `SchmancyElement` so\n * runtime semantics (Tailwind injection, `disconnecting` Subject,\n * `disconnectedSignal` AbortSignal, SignalWatcher) match exactly.\n */\nexport const $LitElement = <T extends CSSResult>(componentStyle?: T) => {\n\tclass LegacyAlias extends SchmancyElement {\n\t\tstatic styles = componentStyle ? [componentStyle] : []\n\t}\n\treturn LegacyAlias as CustomElementConstructor &\n\t\tConstructor<LitElement> &\n\t\tConstructor<IBaseMixin>\n}\n","import { css } from 'lit'\n\n/**\n * Luminous Glass surface type styles.\n *\n * Depth model: blur intensity + opacity replaces M3 tonal hierarchy.\n * - solid: opaque ground (0 blur, 100% opacity)\n * - subtle: frosted panel (4px blur, ~72% opacity)\n * - glass: full frosted glass (20px blur, ~55% opacity)\n * - luminous: glass + glow halo (24px blur, ~22% opacity)\n */\nexport const surfaceTypeStyles = css`\n\t/* ================================================================\n\t STRUCTURAL TYPES — All-glass depth model.\n\t Nothing is opaque. Every layer is translucent.\n\t Blur creates readability. Light borders isolate layers.\n\t Rule: text must ALWAYS be readable on every surface.\n\t ================================================================ */\n\n\t/* Solid — dense glass, high readability ground layer (no blur — 92% opacity is enough) */\n\t:host([type='solid']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 92%, transparent);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* Subtle — frosted glass, clearly readable */\n\t:host([type='subtle']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-container);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 78%, transparent);\n\t\tbackdrop-filter: blur(8px) saturate(130%);\n\t\t-webkit-backdrop-filter: blur(8px) saturate(130%);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* Glass — frosted glass, blur ensures readability */\n\t:host([type='glass']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\n\t\tbackground: color-mix(in srgb, var(--glass-base) 55%, transparent);\n\t\tbackdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\t-webkit-backdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tcontain: content;\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\tisolation: isolate;\n\t}\n\n\t/* Luminous — glass + glow halo, heavy blur keeps readability */\n\t:host([type='luminous']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\t--glow-color: var(--schmancy-sys-color-primary-default);\n\n\t\tbackground: color-mix(in srgb, var(--glass-base) 42%, transparent);\n\t\tbackdrop-filter: blur(20px) saturate(200%) brightness(1.08);\n\t\t-webkit-backdrop-filter: blur(20px) saturate(200%) brightness(1.08);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tcontain: content;\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\tisolation: isolate;\n\t}\n\n\t/* ================================================================\n\t UTILITY TYPES\n\t ================================================================ */\n\n\t/* Transparent — no background */\n\t:host([type='transparent']) {\n\t\tbackground-color: transparent;\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* Outlined — border with luminous hover potential */\n\t:host([type='outlined']) {\n\t\tbackground-color: transparent;\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tborder: 1px solid var(--schmancy-sys-color-outlineVariant);\n\t\ttransition: border-color 300ms ease, box-shadow 300ms ease;\n\t}\n\n\t/* ================================================================\n\t SEMANTIC TYPES — tinted glass for status/role\n\t ================================================================ */\n\n\t:host([type='primary']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-primary-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-primary-default);\n\t}\n\t:host([type='secondary']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-secondary-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-secondary-default);\n\t}\n\t:host([type='tertiary']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-tertiary-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-tertiary-default);\n\t}\n\t:host([type='error']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-error-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-error-onContainer);\n\t}\n\t:host([type='success']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-success-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-success-onContainer);\n\t}\n\t:host([type='warning']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-warning-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-warning-onContainer);\n\t}\n\t:host([type='info']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-info-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-info-onContainer);\n\t}\n\n\t/* ================================================================\n\t LEGACY M3 ALIASES — backward compatibility\n\t Old type names render as their new Luminous Glass equivalents.\n\t ================================================================ */\n\n\t/* solid aliases — dense glass */\n\t:host([type='surface']),\n\t:host([type='surfaceDim']),\n\t:host([type='surfaceBright']),\n\t:host([type='containerLowest']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 92%, transparent);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* subtle aliases — frosted glass */\n\t:host([type='containerLow']),\n\t:host([type='container']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-container);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 78%, transparent);\n\t\tbackdrop-filter: blur(8px) saturate(130%);\n\t\t-webkit-backdrop-filter: blur(8px) saturate(130%);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* glass aliases */\n\t:host([type='containerHigh']),\n\t:host([type='containerHighest']),\n\t:host([type='glassOforim']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\n\t\tbackground: color-mix(in srgb, var(--glass-base) 55%, transparent);\n\t\tbackdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\t-webkit-backdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\tisolation: isolate;\n\t}\n\n\t/* ================================================================\n\t REDUCED MOTION — disable glass animations\n\t ================================================================ */\n`\n\n/**\n * Surface rounded corner styles\n */\nexport const surfaceRoundedStyles = css`\n\t:host([rounded='none']) {\n\t\tborder-radius: 0;\n\t}\n\t:host([rounded='top']) {\n\t\tborder-radius: var(--schmancy-sys-shape-corner-large) var(--schmancy-sys-shape-corner-large) 0 0;\n\t}\n\t:host([rounded='left']) {\n\t\tborder-radius: var(--schmancy-sys-shape-corner-large) 0 0 var(--schmancy-sys-shape-corner-large);\n\t}\n\t:host([rounded='right']) {\n\t\tborder-radius: 0 var(--schmancy-sys-shape-corner-large) var(--schmancy-sys-shape-corner-large) 0;\n\t}\n\t:host([rounded='bottom']) {\n\t\tborder-radius: 0 0 var(--schmancy-sys-shape-corner-large) var(--schmancy-sys-shape-corner-large);\n\t}\n\t:host([rounded='all']) {\n\t\tborder-radius: var(--schmancy-sys-shape-corner-large);\n\t}\n`\n\n/**\n * Luminous glow elevation — replaces M3 dark drop shadows with primary-colored glow.\n * No ::after tint overlay — depth comes from glow intensity, not surface tint.\n */\nexport const surfaceElevationStyles = css`\n\t:host([elevation='1']) {\n\t\tbox-shadow: 0 2px 12px -2px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 15%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='2']) {\n\t\tbox-shadow: 0 4px 20px -2px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 22%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='3']) {\n\t\tbox-shadow: 0 8px 32px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 28%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='4']) {\n\t\tbox-shadow: 0 12px 44px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 35%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='5']) {\n\t\tbox-shadow: 0 20px 60px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 42%, transparent);\n\t\tposition: relative;\n\t}\n`\n\n/**\n * Surface clickable styles - luminous hover, spring active\n */\nexport const surfaceClickableStyles = css`\n\t:host([clickable]) {\n\t\tcursor: pointer;\n\t\tuser-select: none;\n\t\t-webkit-tap-highlight-color: transparent;\n\t\ttransition:\n\t\t\tfilter 200ms ease,\n\t\t\ttransform 300ms cubic-bezier(0.34, 1.56, 0.64, 1),\n\t\t\tbox-shadow 400ms ease;\n\t}\n\t:host([clickable]:hover) {\n\t\tfilter: brightness(1.03);\n\t}\n\t:host([clickable]:active) {\n\t\tfilter: brightness(0.96);\n\t\ttransform: scale(0.98);\n\t\ttransition-duration: 100ms;\n\t}\n\t:host([clickable]:focus-visible) {\n\t\toutline: 2px solid var(--schmancy-sys-color-primary-default);\n\t\toutline-offset: 2px;\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:host([clickable]) { transition: filter 150ms ease; }\n\t\t:host([clickable]:hover) { transform: none; box-shadow: none; }\n\t\t:host([clickable]:active) { transform: none; }\n\t}\n`\n\n/**\n * Combined surface styles - includes all surface styling capabilities\n */\nexport const surfaceStyles = css`\n\t${surfaceTypeStyles}\n\t${surfaceRoundedStyles}\n\t${surfaceElevationStyles}\n\t${surfaceClickableStyles}\n`\n","import type { Constructor } from './constructor'\nimport { CSSResultGroup, CSSResultOrNative, LitElement } from 'lit'\nimport { property } from 'lit/decorators.js'\nimport type { TSurfaceColor } from '../src/types/surface'\nimport { surfaceStyles } from '../src/surface/surface.styles'\n\nexport type SchmancySurfaceRounded = 'none' | 'top' | 'left' | 'right' | 'bottom' | 'all'\nexport type SchmancySurfaceElevation = 0 | 1 | 2 | 3 | 4 | 5\n\nexport declare class ISurfaceMixin {\n\trounded: SchmancySurfaceRounded\n\televation: SchmancySurfaceElevation\n\ttype: TSurfaceColor\n\tclickable: boolean\n}\n\n/**\n * SurfaceMixin - Adds surface styling properties AND styles to any LitElement\n *\n * Uses Lit's finalizeStyles hook to inject surfaceStyles CSS for all surface type selectors.\n * This is the recommended pattern for mixins that need to add styles.\n *\n * Provides these reflected properties:\n * - `rounded`: 'none' | 'top' | 'left' | 'right' | 'bottom' | 'all' - Corner rounding\n * - `elevation`: 0-5 - Shadow depth level\n * - `type`: TSurfaceColor - Surface color variant (26+ options)\n *\n * Usage:\n * ```typescript\n * import { SurfaceMixin } from '@mixins/surface.mixin'\n *\n * @customElement('my-component')\n * class MyComponent extends SurfaceMixin(TailwindElement(css`\n * :host { display: block; }\n * `)) {\n * // Component now has type, fill, rounded, elevation properties\n * // AND surfaceStyles are automatically included\n * }\n * ```\n */\nexport const SurfaceMixin = <T extends Constructor<LitElement>>(superClass: T) => {\n\tclass SurfaceMixinClass extends superClass {\n\t\t/**\n\t\t * Override finalizeStyles to inject surfaceStyles.\n\t\t * This is the Lit-recommended way for mixins to add styles.\n\t\t */\n\t\tprotected static finalizeStyles(styles?: CSSResultGroup): CSSResultOrNative[] {\n\t\t\t// Get parent's finalized styles using LitElement's method\n\t\t\tconst parentStyles = (superClass as unknown as typeof LitElement).finalizeStyles(styles)\n\t\t\t// Append surfaceStyles at the end (higher specificity)\n\t\t\treturn [...parentStyles, surfaceStyles as CSSResultOrNative]\n\t\t}\n\n\t\t/**\n\t\t * Specifies the rounding style of the component's corners.\n\t\t * @default 'none'\n\t\t */\n\t\t@property({ reflect: true })\n\t\trounded: SchmancySurfaceRounded = 'none'\n\n\t\t/**\n\t\t * Defines the elevation level (shadow depth) of the surface.\n\t\t * @default 0\n\t\t */\n\t\t@property({ type: Number, reflect: true })\n\t\televation: SchmancySurfaceElevation = 0\n\n\t\t/**\n\t\t * Specifies the surface type for styling.\n\t\t * @default 'container'\n\t\t */\n\t\t@property({ reflect: true })\n\t\ttype: TSurfaceColor = 'subtle'\n\n\t\t/**\n\t\t * Makes the surface interactive with hover, active states and cursor pointer.\n\t\t * @default false\n\t\t */\n\t\t@property({ type: Boolean, reflect: true })\n\t\tclickable = false\n\t}\n\treturn SurfaceMixinClass as Constructor<ISurfaceMixin> & T\n}\n"],"mappings":"2TAMA,IAAM,EAAiB,oBACjB,EAA0B,6BAyBhC,SAAgB,EACf,EACA,EAAU,IAAA,CAEV,IAAM,EAAmB,GAAG,EAAA,gBACtB,EAAe,GAAG,EAAA,YAExB,OAAO,IAAI,EAAA,WAAW,GAAA,CAErB,IAAM,GAAA,EAAA,EAAA,WAAsC,OAAQ,EAAA,CAClD,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,OACgB,EAAA,CAAA,EAAS,EAAA,EAAA,KACrB,GAAK,EAAE,OAAO,UAAA,EAAe,EAAA,EAAA,gBAClB,KAAA,CAAA,CAEf,UAAU,GAAA,CACV,EAAW,KAAK,EAAA,CAChB,EAAW,UAAA,EAAA,CAYb,OARA,OAAO,cACN,IAAI,YAAY,EAAkB,CACjC,QAAA,CAAS,EACT,SAAA,CAAU,EAAA,CAAA,CAAA,KAKC,EAAa,aAAA,EAAA,CAW5B,SAAgB,EAAA,GAA+C,EAAA,CAC9D,OAAI,EAAc,SAAW,EACrB,IAAI,EAAA,WAAW,GAAA,CACrB,EAAW,KAAK,KAAA,CAChB,EAAW,UAAA,EAAA,EAIb,EAAA,EAAA,MAAA,GAAe,EAAc,IAAI,GAAO,EAAqB,EAAA,CAAA,CAAA,CA2B9D,SAAgB,EACf,EACA,EAAU,IAAA,CAEV,IAAM,EAAY,YAAY,KAAK,KAAA,CAAA,GAAS,KAAK,QAAA,CAAS,SAAS,GAAA,CAAI,MAAM,EAAA,GAE7E,OAAO,IAAI,EAAA,WAAW,GAAA,CAErB,IAAM,GAAA,EAAA,EAAA,WAAwD,OAAQ,EAAA,CACpE,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,OACgB,EAAA,CAAA,EAAS,EAAA,EAAA,KACrB,GAAK,EAAE,OAAA,EAAO,EAAA,EAAA,KAEd,GAAW,EAAO,YAAc,EAAa,EAAO,QAAgB,KAAA,EAAM,EAAA,EAAA,MAEzE,EAAA,EAAE,EAAA,EAAA,gBACQ,KAAA,CAAA,CAEf,UAAU,GAAA,CACV,EAAW,KAAK,EAAA,CAChB,EAAW,UAAA,EAAA,CAYb,OARA,OAAO,cACN,IAAI,YAA6B,EAAgB,CAChD,OAAQ,CAAE,SAAA,EAAU,UAAA,EAAA,CACpB,QAAA,CAAS,EACT,SAAA,CAAU,EAAA,CAAA,CAAA,KAIC,EAAa,aAAA,EAAA,CAY5B,SAAgB,EACf,EACA,EAAU,IAAA,CAEV,IAAM,EAAY,gBAAgB,KAAK,KAAA,CAAA,GAAS,KAAK,QAAA,CAAS,SAAS,GAAA,CAAI,MAAM,EAAA,GAC3E,EAAgB,EAAA,CAEtB,OAAO,IAAI,EAAA,WAAW,GAAA,CAErB,IAAM,GAAA,EAAA,EAAA,WAAwD,OAAQ,EAAA,CACpE,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,OAAqB,EAAA,CAAA,CAAA,CACrB,UAAU,CACV,KAAM,GAAA,CACD,EAAE,OAAO,YAAc,GAC1B,EAAS,KAAK,EAAE,OAAO,QAAA,EAGzB,aAAA,CACC,EAAW,KAAK,EAAA,CAChB,EAAW,UAAA,EAAA,CAAA,CAad,OARA,OAAO,cACN,IAAI,YAA6B,EAAgB,CAChD,OAAQ,CAAE,SAAA,EAAU,UAAA,EAAA,CACpB,QAAA,CAAS,EACT,SAAA,CAAU,EAAA,CAAA,CAAA,KAIC,EAAa,aAAA,EAAA,CAoB5B,SAAgB,EACf,EACA,EAAU,IAAA,CAKV,MAFsB,UAAU,KAAK,EAAA,CAG7B,EAAmB,EAAO,EAAA,CAI3B,EAAqB,EAAO,EAAA,CC5LpC,IAAa,GAAA,EAAA,EAAA,eAAsD,gBAAA,CCAtD,EAAkD,GAAA,CAC9D,MAAM,UAAoB,CAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,EAAA,CAAA,KAAA,cACT,IAAI,EAAA,QAQpB,IAAA,QAAI,CACH,OAAO,KAAK,QAAQ,SAAgC,OAAd,UAAc,IAAc,UAAU,SAAW,SAIxF,IAAA,UAAI,CACH,GAAI,KAAK,UAAW,OAAO,KAAK,UAChC,IAAM,EAAiB,EAAA,CACvB,IAAK,IAAI,EAAqB,KAAM,GAAI,eAAiB,EAAK,OAAS,EAAG,EAAK,EAAG,cAAe,CAChG,IAAM,EAAM,EAAG,QAAQ,aAAA,CACjB,EAAW,MAAM,KAAK,EAAG,cAAc,SAAA,CAAU,OAAO,GAAK,EAAE,UAAY,EAAI,QAAA,CACrF,EAAK,QAAQ,EAAS,OAAS,EAAI,GAAG,EAAA,eAAmB,EAAS,QAAQ,EAAA,CAAM,EAAA,GAAO,EAAA,CAExF,IAAM,EAAO,MAAM,KAAK,EAAK,KAAK,IAAA,CAAA,CAAM,QAAQ,EAAG,IAAM,KAAK,KAAK,GAAI,EAAA,CAAK,EAAE,WAAW,EAAA,CAAK,EAAG,EAAA,CACjG,MAAO,MAAK,UAAY,MAAM,KAAK,IAAI,EAAA,CAAM,SAAS,GAAA,GAOvD,IAAA,KAAI,CAGH,OADgB,KAAK,aAAa,MAC9B,GAGC,AACJ,KAAK,OAAO,MAAM,OAAO,YAAA,GAEnB,KAAK,MAGb,IAAA,IAAQ,EAAA,CACH,EACH,KAAK,aAAa,MAAO,EAAA,CAEzB,KAAK,gBAAgB,MAAA,CASvB,oBAAuB,EAAmB,EAAY,EAAqD,EAAA,CAAA,CAC1G,GAAA,CAAM,QAAE,EAAA,CAAU,EAAA,SAAO,EAAA,CAAW,GAAS,EAG7C,KAAK,cACJ,IAAI,YAAY,GAAG,EAAA,IAAc,KAAK,MAAO,CAC5C,OAAA,EACA,QAAA,EACA,SAAA,EAAA,CAAA,CAAA,CAKF,KAAK,cACJ,IAAI,YAAY,EAAW,CAC1B,OAAA,EACA,QAAA,EACA,SAAA,EAAA,CAAA,CAAA,CAKH,SAAS,EAAA,CACR,IAAM,EAAsC,EAAA,CAU5C,OATA,OAAO,KAAK,EAAA,CAAS,QAAQ,GAAA,CAC5B,EACE,MAAA,CACA,MAAM,IAAA,CACN,OAAO,QAAA,CACP,QAAQ,GAAA,CACR,EAAW,GAAK,EAAQ,IAAA,EAAA,EAG3B,EAAA,EAAA,UAAgB,EAAA,CAGjB,SAAS,EAAA,CACR,OAAA,EAAA,EAAA,UAAgB,EAAA,CAGjB,mBAAA,CACC,MAAM,mBAAA,CACN,KAAK,wBAAA,CAGN,wBAAA,CACC,IAAM,EAAU,KAAK,QAAQ,aAAA,CACvB,EAAmB,GAAG,EAAA,gBACtB,EAAe,GAAG,EAAA,aAGxB,EAAA,EAAA,WAAU,OAAQ,EAAA,CAChB,MAAA,EAAA,EAAA,WAAe,KAAK,cAAA,CAAA,CACpB,cAAA,CACA,OAAO,cACN,IAAI,YAAY,EAAc,CAC7B,OAAQ,CAAE,UAAW,KAAA,CACrB,QAAA,CAAS,EACT,SAAA,CAAU,EAAA,CAAA,CAAA,EAAA,EAMd,EAAA,EAAA,WAAwC,OAAQ,EAAA,CAC9C,MAAA,EAAA,EAAA,WAAe,KAAK,cAAA,CAAA,CACpB,WAAA,CAAa,OAAA,CAAU,SAAA,EAAU,UAAA,MAAA,CACjC,IAAI,EAAwB,KAG5B,GAAI,EAAS,WAAW,IAAA,CAAM,CAC7B,IAAM,EAAK,EAAS,MAAM,EAAA,CACtB,KAAK,KAAO,GAAM,KAAK,MAAQ,IAClC,EAAQ,MAAA,CAKL,GAAS,KAAK,aAClB,EAAQ,KAAK,WAAW,cAAc,EAAA,EAGnC,GACH,OAAO,cACN,IAAI,YAAY,EAAyB,CACxC,OAAQ,CAAE,UAAA,EAAW,QAAS,EAAA,CAC9B,QAAA,CAAS,EACT,SAAA,CAAU,EAAA,CAAA,CAAA,EAAA,CAQhB,SAAgC,EAAA,CAC/B,OAAO,EAAqB,EAAA,CAG7B,sBAAA,CACC,KAAK,cAAc,KAAA,CAAK,EAAA,CACxB,KAAK,cAAc,UAAA,CACnB,MAAM,sBAAA,EAGR,OAAA,EAAA,EAAA,EAAA,EAAA,EAAA,SA3JU,CAAE,QAAS,EAAc,UAAA,CAAW,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,SAAA,IAAA,GAAA,CA2J9C,GElLK,GAAA,EAAA,EAAA,WAAA;wkhEAAA,CAEP,EAA4C,GAAA,CACjD,MAAM,UAA2B,EAAA,UAAA,CAAA,OAAA,KAAA,OAChB,EAAA,EAAA,EAAA,WAAW,EAAA,CAAiB,EAAA,EAE7C,OAAO,GAGK,EAAwC,GAAA,CACpD,MAAM,UAA2B,EAAY,EAAoB,EAAA,CAAA,AAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,EAAA,CAAA,KAAA,yBAAA,CAE/D,MAAM,sBAAA,GAGR,OAAO,GCVF,GAAA,EAAA,EAAA,eAAoC,EAAY,EAAA,WAAA,CAAA,CAgCtD,SAAS,EAAiB,EAAA,CACzB,OAAI,IAAQ,eAAR,CAAA,CACA,EAAI,WAAW,KAAA,CAIpB,IAAM,EAAgB,IAAI,QAE1B,SAAS,EAAmB,EAAA,CAC3B,IAAI,EAAuB,EAAK,UAChC,KAAO,GAAS,IAAU,YAAY,WAAA,CACjC,EAAc,IAAI,EAAA,EAD0B,CAEhD,EAAc,IAAI,EAAA,CAClB,IAAM,EAAQ,OAAO,0BAA0B,EAAA,CAC/C,IAAK,GAAA,CAAO,EAAK,KAAS,OAAO,QAAQ,EAAA,CAAQ,CAGhD,GAFI,EAAiB,EAAA,EACK,OAAf,EAAK,OAAU,YAC1B,CAAK,EAAK,aAAc,SACxB,IAAM,EAAW,EAAK,MACtB,OAAO,eAAe,EAAO,EAAK,CAAA,GAC9B,EACH,MAAO,SAAA,GAAoD,EAAA,CAC1D,OAAO,EAAA,EAAY,IAAI,SAAY,EAAS,MAAM,KAAM,EAAA,CAAA,EAAA,CAAA,CAI3D,EAAQ,OAAO,eAAe,EAAA,EAKhC,IAAM,EAAoB,IAAI,QAiDjB,EAAb,cAAqC,CAAA,CAMpC,aAAA,CACC,OAAA,CAAA,KAAA,iBAN0B,IAAI,gBAAA,KAAA,mBAGY,KAAK,iBAAiB,OAIhE,EAAmB,KAAK,YAAA,CAGzB,OAAA,eACC,EAAA,CAEA,MAAO,CAAA,GAAI,MAAM,eAAe,EAAA,CAAS,EAAA,CAG1C,iBACC,EACA,EACA,EAAA,CAEI,GAAY,KACf,MAAM,iBAAiB,EAAM,EAAU,EAAA,CAGxC,MAAM,iBAAiB,EAzEzB,SAA0B,EAAmB,EAAA,CAC5C,IAAM,EAAS,EAAkB,IAAI,EAAA,CACrC,GAAI,EAAQ,OAAO,EACnB,IAAM,EAAyB,SAA4C,EAAA,CAC1E,EAAA,EAAY,IAAI,MAAA,CACS,OAAb,GAAa,WACtB,EAA4B,KAAK,KAAM,EAAA,CAExC,EAAS,YAAY,EAAA,EAAA,EAKxB,OADA,EAAkB,IAAI,EAAU,EAAA,CACzB,GA4DwC,KAAM,EAAA,CAAW,EAAA,CAGhE,oBACC,EACA,EACA,EAAA,CAEA,GAAI,GAAY,KAEf,OAAA,KADA,MAAM,oBAAoB,EAAM,EAAU,EAAA,CAG3C,IAAM,EAAU,EAAkB,IAAI,EAAA,CACtC,MAAM,oBAAoB,EAAM,GAAY,EAA4B,EAAA,CAGzE,sBAAA,CACC,KAAK,iBAAiB,OAAA,CACtB,MAAM,sBAAA,GAkCR,SAAgB,EAAgB,EAAA,CAC/B,MAA4C,KAC3C,EAAmB,EAAA,CACnB,eAAe,OAAO,EAAS,EAAA,CACxB,GCrMT,IAAa,EAAsB,OAAO,IAAI,sBAAA,CASjC,EAAsB,yBAyHnC,SAAgB,EAAoB,EAAA,CACnC,MAAA,CAAA,CAAS,GAAoB,OAAP,GAAO,UAAP,CAAsE,IAAlD,EAAW,cAAc,GAkBpE,SAAgB,EAAkD,EAAA,CACjE,MAAM,UAA4B,CAAA,CAAA,OAAA,KAAA,eAAA,CACT,EAAA,OAAA,KAGP,GAAA,CAAuB,EA6DxC,IAAA,OAAI,CACH,OAAO,KAAK,gBAAZ,IAA8B,IAAa,KAAK,QAAU,KAAK,cAGhE,IAAA,UAAI,CACH,MAAA,CAAQ,KAAK,MAGd,aAAA,CACM,AAAc,KAAK,UAAA,CAAU,EAGnC,eAAA,CACM,AAAgB,KAAK,YAAA,CAAY,EAGvC,gBAAA,CACK,AAAgB,KAAK,YAAA,CAAY,EAUtC,MAAA,kBAAwB,EAAA,CACnB,KAAK,cAGR,KAAK,uBAEN,IAAM,EAAA,EAAU,KAAK,qBACrB,KAAK,aAAA,CAAe,EACpB,GAAA,CACC,IAAM,EAAA,MAAgB,GAAA,CACtB,GAAI,IAAU,KAAK,qBAAsB,OACzC,KAAK,kBAAkB,EAAA,QAAA,CAEnB,IAAU,KAAK,uBAClB,KAAK,aAAA,CAAe,IAgBvB,kBAAA,CACC,GAAI,KAAK,UAAW,MAAA,CAAO,EAC3B,OAAQ,KAAK,WAAb,CACC,IAAK,SACJ,MAAA,CAAO,EACR,IAAK,UACJ,OAAO,KAAK,QACb,IAAK,QACJ,OAAO,KAAK,MACb,IAAK,YACJ,MAAA,CAAO,EACR,IAAK,SAIJ,GAA0B,OAAf,KAAK,OAAU,SAAU,CACnC,IAAM,EAAO,KAA2C,UACxD,GAAmB,OAAR,GAAQ,UAAY,EAAM,EACpC,OAAO,KAAK,MAAM,QAAU,EAG9B,OAAO,KAAK,OAIf,YAAA,GAAe,EAAA,CACd,MAAA,GAAS,EAAA,CAAA,KAAA,cAAA,IA1IkE,GAAA,KAAA,KAG7D,GAAA,KAAA,MAG2C,GAAA,KAAA,MAG1C,GAAA,KAAA,SAAA,CAGI,EAAA,KAAA,SAAA,CAGA,EAAA,KAAA,SAAA,CAGA,EAAA,KAAA,MAAA,CAGH,EAAA,KAAA,kBAGW,GAAA,KAAA,GAMN,kBAAkB,KAAK,KAAA,CAAA,GAAS,KAAK,MAAsB,IAAhB,KAAK,QAAA,CAAA,GAAA,KAAA,QAAA,CAK1C,EAAA,KAAA,UAAA,CAGE,EAAA,KAAA,WAOL,QAAA,KAAA,aAAA,CAmCQ,EAAA,KAAA,qBAqBM,EAsCtC,GAAA,CACC,KAAK,UAAY,KAAK,iBAAA,MAAA,CAEtB,KAAK,UAAA,IAAY,IAInB,mBAAA,CACC,MAAM,mBAAA,CAEN,KAAK,cACJ,IAAI,YAAY,EAAqB,CACpC,OAAQ,KACR,QAAA,CAAS,EACT,SAAA,CAAU,EAAA,CAAA,CAAA,CAMb,IAAA,MAAI,CACH,OAAO,KAAK,WAAW,MAAQ,KAGhC,aAAuB,EAAA,CACtB,MAAM,eAAe,EAAA,CACjB,KAAK,gBADY,IACM,KAAW,KAAK,cAAgB,KAAK,OAMhE,KAAK,eAAA,CAGN,WAAqB,EAAA,CACpB,MAAM,WAAW,EAAA,CAEb,EAAa,IAAI,QAAA,GACpB,KAAK,WAAW,aAAa,KAAK,MAAA,CAE9B,KAAK,MAAO,KAAK,WAAW,OAAO,IAAI,QAAA,CACtC,KAAK,WAAW,OAAO,OAAO,QAAA,CAMnC,KAAK,eAAA,GAGF,EAAa,IAAI,WAAA,EAAe,EAAa,IAAI,WAAA,GACpD,KAAK,eAAA,CAGF,EAAa,IAAI,eAAA,GAChB,KAAK,aAAc,KAAK,WAAW,OAAO,IAAI,aAAA,CAC7C,KAAK,WAAW,OAAO,OAAO,aAAA,EAGhC,EAAa,IAAI,UAAA,GAChB,KAAK,QAAS,KAAK,WAAW,OAAO,IAAI,UAAA,CACxC,KAAK,WAAW,OAAO,OAAO,UAAA,CAE/B,KAAK,SAAW,KAAK,OAAO,KAAK,eAAA,EAGlC,EAAa,IAAI,YAAA,GAChB,KAAK,WACR,KAAK,WAAW,OAAO,IAAI,YAAA,CAE3B,KAAK,eAAA,EAEL,KAAK,WAAW,OAAO,OAAO,YAAA,EAW5B,EAAa,IAAI,QAAA,GAChB,KAAK,MAAO,KAAK,WAAW,OAAO,IAAI,UAAA,CACtC,KAAK,WAAW,OAAO,OAAO,UAAA,CAE/B,KAAK,YAAW,KAAK,UAAU,YAAc,KAAK,MAAQ,OAAS,WAGpE,EAAa,IAAI,WAAA,EAAe,EAAa,IAAI,WAAA,IAChD,KAAK,SAAU,KAAK,WAAW,OAAO,IAAI,WAAA,CACzC,KAAK,WAAW,OAAO,OAAO,WAAA,CAG/B,KAAK,YACR,KAAK,UAAU,aAAe,KAAK,UAAA,CAAa,KAAK,SAAW,OAAS,UAGvE,EAAa,IAAI,WAAA,GAChB,KAAK,SAAU,KAAK,WAAW,OAAO,IAAI,WAAA,CACzC,KAAK,WAAW,OAAO,OAAO,WAAA,EAEhC,EAAa,IAAI,WAAA,GAChB,KAAK,SAAU,KAAK,WAAW,OAAO,IAAI,WAAA,CACzC,KAAK,WAAW,OAAO,OAAO,WAAA,EASrC,mBAAA,CACC,KAAK,WAAA,CAIN,qBAAqB,EAAA,CACpB,KAAK,SAAW,EAMjB,yBAAyB,EAAA,CACpB,GAAS,OACb,KAAK,MAAQ,GAId,WAAA,CACC,KAAK,MAAQ,KAAK,eAAiB,GACnC,KAAK,MAAA,CAAQ,EACb,KAAK,kBAAoB,GACzB,KAAK,QAAA,CAAU,EACf,KAAK,UAAA,CAAY,EACjB,KAAK,WAAW,YAAY,EAAA,CAAA,CAQ7B,eAAA,CACC,GAAA,CAAK,KAAK,MAAQ,KAAK,SAAU,MAAO,EAAA,CACxC,IAAM,EAAI,KAAK,MACf,OAAI,GAAA,MAAiC,IAAM,GAAW,EAAA,CAClD,MAAM,QAAQ,EAAA,CAAW,EAAE,IAAI,GAAQ,CAAC,KAAK,KAAM,OAAO,EAAA,CAAA,CAAA,CAC7C,OAAN,GAAM,UAAkB,EAAI,CAAC,CAAC,KAAK,KAAM,KAAA,CAAA,CAAS,EAAA,CACtD,CAAC,CAAC,KAAK,KAAM,OAAO,EAAA,CAAA,CAAA,CAG5B,eAAA,CACC,GAAI,KAAK,SAER,OADA,KAAK,WAAW,YAAY,EAAA,CAAA,CAAA,CACrB,EAGR,IAAM,EACL,KAAK,WAAa,KAAK,QAAU,IAAM,KAAK,QAArB,IAA+B,IAAa,KAAK,QAAU,MAG7E,EAAA,CAAA,CAAmB,KAAK,WAAW,UAAU,YAC7C,EAAA,CAAW,GAAA,CAAmB,EAC9B,EACL,KAAK,eAAe,cAAgB,yBAC/B,EAAiB,EAAiB,EAAkB,gBA2B1D,OAvBI,EACH,KAAK,WAAW,YACf,CAAE,aAAA,CAAc,EAAA,CAChB,KAAK,mBAAqB,EAAA,CAEhB,GAEX,KAAK,WAAW,YAAY,EAAA,CAAA,CAOzB,KAAK,kBAAA,GACR,KAAK,MAAA,CAAS,EACT,GAAY,KAAK,kBAEX,IACV,KAAK,kBAAoB,IAFzB,KAAK,kBAAoB,GAMpB,EAGR,gBAAA,CACC,IAAM,EAAU,KAAK,eAAA,CAErB,OADK,GAAS,KAAK,WAAW,gBAAA,CACvB,EAGR,kBAAkB,EAAA,CACjB,KAAK,kBAAoB,EACzB,KAAK,MAAQ,IAAY,GACrB,EACH,KAAK,WAAW,YAAY,CAAE,YAAA,CAAa,EAAA,CAAQ,EAAA,CAEnD,KAAK,WAAW,YAAY,EAAA,CAAA,CAI9B,WAAW,EAAA,CACN,wBAAyB,MAA4C,OAA7B,KAAK,qBAAwB,WACxE,KAAK,oBAAoB,SAAU,EAAQ,CAAE,QAAA,CAAS,EAAA,CAAA,CAEtD,KAAK,cACJ,IAAI,YAAY,SAAU,CACzB,OAAA,EACA,QAAA,CAAS,EACT,SAAA,CAAU,EAAA,CAAA,CAAA,EAOf,OAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAhXW,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,OAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,QAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGlB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,QAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,KAAM,QAAS,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,WAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjC,CAAE,KAAM,QAAS,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,WAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjC,CAAE,KAAM,QAAS,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,WAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjC,CAAE,KAAM,QAAS,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,QAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjC,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,oBAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,OAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,KAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,QAAA,CAAA,CAMpB,EAAA,UAAA,UAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,QAAA,CAAA,CAGA,EAAA,UAAA,YAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAME,CAAE,KAAM,OAAQ,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,aAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAOhC,CAAE,UAAA,CAAW,EAAA,CAAA,CAAA,CAAQ,EAAA,UAAA,gBAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,QAAA,CAAA,CA6BvB,EAAA,UAAA,eAAA,IAAA,GAAA,CAkSF,EASR,SAAgB,EAAuC,EAAA,CACtD,MAAM,UAA8B,CAAA,CAAA,OAAA,KAAA,OACnB,EAAiB,CAAC,EAAA,CAAkB,EAAA,EAErD,OAAO,EAAe,EAAA,CC3hBvB,IAAa,EAAoC,GAAA,CAChD,MAAM,UAAoB,CAAA,CAAA,OAAA,KAAA,OACT,EAAiB,CAAC,EAAA,CAAkB,EAAA,EAErD,OAAO,GCTK,EAAoB,EAAA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6KvB,EAAuB,EAAA,GAAG;;;;;;;;;;;;;;;;;;;EAyB1B,EAAyB,EAAA,GAAG;;;;;;;;;;;;;;;;;;;;;EA0B5B,EAAyB,EAAA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgC5B,EAAgB,EAAA,GAAG;GAC7B,EAAA;GACA,EAAA;GACA,EAAA;GACA,EAAA;ECvOU,EAAmD,GAAA,CAC/D,MAAM,UAA0B,CAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,EAAA,CAAA,KAAA,QAiBG,OAAA,KAAA,UAOI,EAAA,KAAA,KAOhB,SAAA,KAAA,UAAA,CAOV,EAjCZ,OAAA,eAAgC,EAAA,CAI/B,MAAO,CAAA,GAFe,EAA4C,eAAe,EAAA,CAExD,EAAA,EA+B3B,OAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAxBW,CAAE,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,UAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAOlB,CAAE,KAAM,OAAQ,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,YAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAOhC,CAAE,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,OAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAOlB,CAAE,KAAM,QAAS,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,YAAA,IAAA,GAAA,CAGrC,GAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA"}
@@ -1,24 +0,0 @@
1
- require(`./chunk-CncqDLb2.cjs`);const e=require(`./mixins-BF3Vj8_c.cjs`),t=require(`./active-host-jH3iloCR.cjs`),n=require(`./audio-Cvmemu84.cjs`);require(`./progress-6_rb3Ah9.cjs`);let r=require(`rxjs`),i=require(`rxjs/operators`),a=require(`lit/decorators.js`),o=require(`lit`);var s=class extends e.c{constructor(...e){super(...e),this.title=``,this.message=``,this.type=`info`,this.closable=!0,this.duration=5e3,this.id=`notification-${Date.now()}-${Math.floor(1e4*Math.random())}`,this.playSound=!0,this.showProgress=!1,this.startPosition={x:0,y:0},this._visible=!0,this._progress=100,this._hovered=!1,this._closing=!1,this.paused$=new r.BehaviorSubject(!1),this.startTime=0,this.pausedAt=0,this.elapsedBeforePause=0}static{this.styles=[(0,o.unsafeCSS)(`:host{display:block}.notification{outline:1px solid color-mix(in srgb, var(--schmancy-sys-color-outline-variant) 50%, transparent);background:linear-gradient(180deg, color-mix(in srgb, var(--schmancy-sys-color-surface-container) 100%, transparent), color-mix(in srgb, var(--schmancy-sys-color-surface-containerHigh) 100%, transparent));max-width:360px;color:var(--schmancy-sys-color-surface-on);--notification-glow-color:var(--schmancy-sys-color-primary-default);box-shadow:0 6px 28px -10px color-mix(in srgb, var(--notification-glow-color) 22%, transparent), 0 1px 0 0 color-mix(in srgb, var(--schmancy-sys-color-outline-variant) 30%, transparent);border-radius:4px 14px 14px 4px;align-items:stretch;transition:box-shadow .3s,transform .3s cubic-bezier(.34,1.56,.64,1);display:flex;position:relative;overflow:hidden}.notification.info{--notification-glow-color:var(--schmancy-sys-color-primary-default);--notification-accent:var(--schmancy-sys-color-primary-default)}.notification.success{--notification-glow-color:var(--schmancy-sys-color-success-default);--notification-accent:var(--schmancy-sys-color-success-default)}.notification.warning{--notification-glow-color:var(--schmancy-sys-color-tertiary-default);--notification-accent:var(--schmancy-sys-color-tertiary-default)}.notification.error{--notification-glow-color:var(--schmancy-sys-color-error-default);--notification-accent:var(--schmancy-sys-color-error-default)}.notification.hovered{box-shadow:0 10px 36px -8px color-mix(in srgb, var(--notification-glow-color) 34%, transparent), 0 1px 0 0 color-mix(in srgb, var(--schmancy-sys-color-outline-variant) 30%, transparent);transform:translateY(-2px)}.notification.hovered .accent-rail{width:4px}@media (prefers-reduced-motion:reduce){.notification{transition:box-shadow .2s}.notification.hovered{transform:none}}.accent-rail{background:var(--notification-accent,var(--schmancy-sys-color-primary-default));border-radius:4px 0 0 4px;flex-shrink:0;align-self:stretch;width:3px;transition:width .2s}.content{flex:1;min-width:0;padding:14px 36px 14px 18px}.type-tag{letter-spacing:.14em;text-transform:uppercase;opacity:.7;color:var(--notification-accent,var(--schmancy-sys-color-primary-default));margin-bottom:4px;font-family:ui-monospace,Cascadia Code,Source Code Pro,Menlo,Consolas,monospace;font-size:10px;line-height:1;display:block}.title{color:var(--schmancy-sys-color-surface-on);margin-bottom:3px;font-family:ui-serif,Georgia,Cambria,Times New Roman,serif;font-size:15px;font-weight:500;line-height:1.3}.message{opacity:.72;font-family:ui-sans-serif,system-ui,-apple-system,sans-serif;font-size:13px;line-height:1.45}.close{width:28px;height:28px;color:var(--schmancy-sys-color-surface-onVariant);cursor:pointer;opacity:.4;background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;padding:0;font-size:18px;font-weight:400;line-height:1;transition:opacity .2s;display:flex;position:absolute;top:6px;right:6px}.close:hover{opacity:.85}.close:focus-visible{opacity:1;box-shadow:0 0 0 2px var(--notification-accent,var(--schmancy-sys-color-primary-default));outline:none}.progress{position:absolute;inset:0 0 auto}`)]}connectedCallback(){super.connectedCallback(),this.style.position=`fixed`,this.style.top=`16px`,this.style.right=`16px`,this.style.zIndex=`10001`,this.style.opacity=`0`,this.updateComplete.then(()=>{this.animateIn()}),this.duration>0&&(this.setupAutoClose(),this.setupProgressUpdates()),this.playSound&&this._playSound()}async animateIn(){let e=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches;await this.animate(e?[{opacity:0},{opacity:1}]:[{transform:`translateX(40px) scale(0.96)`,opacity:0},{transform:`translateX(0) scale(1)`,opacity:1}],{duration:e?200:360,easing:`cubic-bezier(0.22, 1, 0.36, 1)`,fill:`forwards`}).finished}setupAutoClose(){this.duration<=0||(this.startTime=Date.now(),this.elapsedBeforePause=0,this.paused$.pipe((0,i.switchMap)(e=>{if(e)return this.pausedAt=Date.now(),this.elapsedBeforePause+=this.pausedAt-this.startTime,r.NEVER;{this.startTime=Date.now();let e=this.duration-this.elapsedBeforePause;return e<=0?(this.close(),r.NEVER):(0,r.timer)(e)}}),(0,i.takeUntil)(this.disconnecting)).subscribe(()=>this.close()))}setupProgressUpdates(){this.duration<=0||(0,r.interval)(16).pipe((0,i.switchMap)(()=>this.paused$.pipe((0,i.map)(e=>{if(e)return this._progress;let t=this.elapsedBeforePause+(Date.now()-this.startTime);return Math.max(0,this.duration-t)/this.duration*100}))),(0,i.distinctUntilChanged)(),(0,i.tap)(e=>{this._progress=e}),(0,i.takeUntil)(this.disconnecting)).subscribe()}_playSound(){this.dispatchEvent(new CustomEvent(`playsound`,{detail:{type:this.type},bubbles:!0,composed:!0}))}_handleMouseEnter(){this._hovered=!0,this.paused$.next(!0)}_handleMouseLeave(){this._hovered=!1,this.paused$.next(!1)}async close(){this._closing||(this._closing=!0,this._visible=!1,await this.animate([{transform:`translateX(0) scale(1)`,opacity:1},{transform:`translateX(20px) scale(0.98)`,opacity:0}],{duration:180,easing:`cubic-bezier(0.4, 0, 1, 1)`,fill:`forwards`}).finished,this.dispatchEvent(new CustomEvent(`close`,{detail:{id:this.id},bubbles:!0,composed:!0})))}_getTypeLabel(){switch(this.type){case`success`:return`SUCCESS`;case`warning`:return`WARNING`;case`error`:return`ERROR`;default:return`INFO`}}render(){return!this._visible&&this._closing?o.html``:o.html`
2
- <div
3
- class="notification ${this.type} ${this._closing?`closing`:``} ${this._hovered?`hovered`:``}"
4
- role="alert"
5
- @mouseenter=${this._handleMouseEnter}
6
- @mouseleave=${this._handleMouseLeave}
7
- >
8
- ${this.showProgress||this.duration>0?o.html`<schmancy-progress
9
- class="progress"
10
- size="xs"
11
- .value=${this._progress}
12
- ?indeterminate=${this.showProgress&&this.duration===0}
13
- ></schmancy-progress>`:``}
14
- <div class="accent-rail"></div>
15
- <div class="content">
16
- <span class="type-tag">${this._getTypeLabel()}</span>
17
- ${this.title?o.html`<div class="title">${this.title}</div>`:``}
18
- <div class="message">${this.message}</div>
19
- </div>
20
- ${this.closable?o.html`
21
- <button class="close" aria-label="Close notification" @click=${this.close}>&#215;</button>
22
- `:``}
23
- </div>
24
- `}};t.a([(0,a.property)({type:String})],s.prototype,`title`,void 0),t.a([(0,a.property)({type:String})],s.prototype,`message`,void 0),t.a([(0,a.property)({type:String})],s.prototype,`type`,void 0),t.a([(0,a.property)({type:Boolean})],s.prototype,`closable`,void 0),t.a([(0,a.property)({type:Number})],s.prototype,`duration`,void 0),t.a([(0,a.property)({type:String})],s.prototype,`id`,void 0),t.a([(0,a.property)({type:Boolean})],s.prototype,`playSound`,void 0),t.a([(0,a.property)({type:Boolean})],s.prototype,`showProgress`,void 0),t.a([(0,a.property)({type:Object})],s.prototype,`startPosition`,void 0),t.a([(0,a.state)()],s.prototype,`_visible`,void 0),t.a([(0,a.state)()],s.prototype,`_progress`,void 0),t.a([(0,a.state)()],s.prototype,`_hovered`,void 0),t.a([(0,a.state)()],s.prototype,`_closing`,void 0);var c=s=t.a([(0,a.customElement)(`sch-notification`)],s),l={info:`curious`,success:`content`,warning:`anxious`,error:`disappointed`},u=1500,d=2e3,f=2500,p=2500;n.t.setVolume(.1);var m={x:window.innerWidth-100,y:50};typeof window<`u`&&(0,r.fromEvent)(window,`mousedown`,{capture:!0,passive:!0}).subscribe(e=>{m={x:e.clientX,y:e.clientY}});var h=null,g=[];function _(e){let t=e.id??`notification-${Date.now()}-${Math.floor(1e4*Math.random())}`;g.push(t),h&&=(h.remove(),null);let i=document.createElement(`sch-notification`);return i.id=t,i.title=e.title??``,i.message=e.message,i.type=e.type??`info`,i.duration=e.duration??1e3,i.closable=!1!==e.closable,i.playSound=!1,i.showProgress=e.showProgress??!1,i.startPosition={...m},!1!==e.playSound&&n.t.play(l[i.type]),(0,r.fromEvent)(i,`close`).subscribe(()=>{let e=g.indexOf(t);e>-1&&g.splice(e,1),i.remove(),h===i&&(h=null)}),document.body.appendChild(i),h=i,t}var v={show:_,info:(e,t={})=>_({message:e??``,type:`info`,duration:e?t.duration??d:1,...t}),success:(e,t={})=>_({message:e??``,type:`success`,duration:e?t.duration??u:1,...t}),warning:(e,t={})=>_({message:e??``,type:`warning`,duration:e?t.duration??f:1,...t}),error:(e,t={})=>_({message:e??``,type:`error`,duration:e?t.duration??p:1,...t}),customDuration:(e,t,n={})=>_({message:e,duration:t,...n}),persistent:(e,t={})=>_({message:e,duration:0,...t}),dismiss:e=>{let t=e?g.splice(g.indexOf(e),1)[0]:g.pop();t&&h?.id===t&&h.close()},update:(e,t)=>{h?.id===e&&(t.title!==void 0&&(h.title=t.title),t.message!==void 0&&(h.message=t.message),t.type!==void 0&&(h.type=t.type))}};function y(e){return t=>{let n;return e.loadingMessage&&(n=v.show({message:e.loadingMessage,type:e.loadingType||`info`,duration:0,showProgress:!0})),t.pipe((0,r.tap)(t=>{if(n&&typeof t==`object`&&t){let r;if(`progress`in t&&typeof t.progress==`number`)r=t.progress;else if(`loaded`in t&&`total`in t){let e=t.loaded,n=t.total;typeof e==`number`&&typeof n==`number`&&n>0&&(r=e/n*100)}r!==void 0&&v.update?.(n,{message:`${e.loadingMessage} (${Math.round(r)}%)`})}typeof t==`object`&&t&&(`progress`in t||`loaded`in t&&`total`in t)||(n&&!1!==e.autoDismissLoading&&(v.dismiss(n),n=void 0),e.successMessage&&v.show({message:e.successMessage,type:e.successType||`success`,duration:e.successDuration??2e3}))}),(0,r.catchError)(t=>{if(n&&!1!==e.autoDismissLoading&&(v.dismiss(n),n=void 0),e.errorMessage){let n=typeof e.errorMessage==`function`?e.errorMessage(t):e.errorMessage;v.show({message:n,type:e.errorType||`error`,duration:e.errorDuration??3e3})}throw t}),(0,r.finalize)(()=>{n&&!1!==e.autoDismissLoading&&v.dismiss(n)}))}}function b(e,t,n){return y({loadingMessage:e,successMessage:t||void 0,errorMessage:n||void 0,autoDismissLoading:!0})}Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return y}});
@@ -1 +0,0 @@
1
- {"version":3,"file":"overlay-D3c_NY18.js","names":[],"sources":["../src/overlay/overlay.animations.ts","../src/overlay/overlay.gestures.ts","../src/overlay/overlay.layout.ts","../src/overlay/overlay.positioning.ts","../src/overlay/overlay.component.ts"],"sourcesContent":["import {\n\tDURATION_EXIT,\n\tgetEasing,\n\tSPRING_GENTLE,\n\tSPRING_SMOOTH,\n\tSPRING_SNAPPY,\n} from '../utils/animation'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport type { Anchor, OverlayLayout } from './overlay.types'\n\n/**\n * WAAPI keyframes + options per layout + direction.\n *\n * One animation vocabulary — no per-element bespoke keyframes. Aligns\n * with the `animation` skill (spring physics presets). Every easing runs\n * through `getEasing()` so modern browsers (that support\n * `animation-timing-function: linear(0, 1)`) get the true `linear()`\n * spring expression while older browsers fall through to the cubic-bezier\n * fallback. Honors `prefers-reduced-motion` by collapsing transforms to\n * opacity-only.\n *\n * Anchor-origin bloom: the caller computes\n * `anchorOriginVars(anchor, surfaceRect)` and writes the resulting CSS\n * custom properties onto the surface element BEFORE triggering the\n * entrance animation. Keyframes reference those vars via\n * `transform-origin: var(--schmancy-overlay-origin-x, 50%) var(...)`, so\n * the surface scales OUT of the click point — not from its own centre.\n */\n\n/**\n * Shape matches both DOM `AnimationEffectTiming` and\n * `KeyframeAnimationOptions` so it passes structural checks in both\n * older and newer `lib.dom.d.ts` vintages.\n */\nexport interface AnimationSpec {\n\tkeyframes: Keyframe[]\n\toptions: {\n\t\tduration: number\n\t\teasing: string\n\t\tfill?: FillMode\n\t}\n}\n\n/**\n * Module-scope reduced-motion state, kept in sync with the house\n * `reducedMotion$` BehaviorSubject. The subscribe has no teardown —\n * module lifetime IS the subscription lifetime (house rxjs rule 4:\n * module singletons don't need explicit teardown).\n */\nlet reducedMotion = reducedMotion$.value\nreducedMotion$.subscribe((v) => {\n\treducedMotion = v\n})\n\nconst ORIGIN_X_VAR = '--schmancy-overlay-origin-x'\nconst ORIGIN_Y_VAR = '--schmancy-overlay-origin-y'\nconst ORIGIN_CSS = `var(${ORIGIN_X_VAR}, 50%) var(${ORIGIN_Y_VAR}, 50%)`\n\nfunction clampPercent(value: number): number {\n\tif (Number.isNaN(value) || !Number.isFinite(value)) return 50\n\treturn Math.max(0, Math.min(100, value))\n}\n\nfunction getAnchorCenter(anchor: Anchor): { x: number; y: number } {\n\t// Element | VirtualAnchor — anything exposing getBoundingClientRect()\n\tif (\n\t\ttypeof (anchor as { getBoundingClientRect?: unknown }).getBoundingClientRect === 'function'\n\t) {\n\t\tconst r = (anchor as { getBoundingClientRect(): DOMRect }).getBoundingClientRect()\n\t\treturn { x: r.left + r.width / 2, y: r.top + r.height / 2 }\n\t}\n\t// DOMRect — has left/top/width/height but no getBoundingClientRect()\n\tif (\n\t\ttypeof (anchor as DOMRect).width === 'number' &&\n\t\ttypeof (anchor as DOMRect).height === 'number' &&\n\t\ttypeof (anchor as DOMRect).left === 'number' &&\n\t\ttypeof (anchor as DOMRect).top === 'number'\n\t) {\n\t\tconst r = anchor as DOMRect\n\t\treturn { x: r.left + r.width / 2, y: r.top + r.height / 2 }\n\t}\n\t// MouseEvent / PointerEvent\n\tif (typeof (anchor as MouseEvent).clientX === 'number' && typeof (anchor as MouseEvent).clientY === 'number') {\n\t\tconst e = anchor as MouseEvent\n\t\treturn { x: e.clientX, y: e.clientY }\n\t}\n\t// TouchEvent\n\tif (\n\t\ttypeof (anchor as TouchEvent).touches !== 'undefined' &&\n\t\t(anchor as TouchEvent).touches.length > 0\n\t) {\n\t\tconst t = (anchor as TouchEvent).touches[0]\n\t\treturn { x: t.clientX, y: t.clientY }\n\t}\n\t// Plain { x, y } point\n\tconst pt = anchor as { x: number; y: number }\n\treturn { x: pt.x, y: pt.y }\n}\n\n/**\n * Compute CSS-var values for the anchor-relative transform origin.\n * Caller writes the returned record onto the surface element's style\n * before triggering the entrance animation. When no anchor is present,\n * returns sensible per-layout defaults (caller picks which to use):\n * - centered → 50% 50% (self-centre)\n * - sheet → 50% 100% (rises from bottom edge)\n * - anchored → computed from the anchor's position relative to the\n * surface rect\n */\nexport function anchorOriginVars(\n\tanchor: Anchor | undefined,\n\tsurfaceRect: DOMRect | { left: number; top: number; width: number; height: number },\n): Record<string, string> {\n\tif (!anchor) {\n\t\treturn {\n\t\t\t[ORIGIN_X_VAR]: '50%',\n\t\t\t[ORIGIN_Y_VAR]: '50%',\n\t\t}\n\t}\n\tconst { x, y } = getAnchorCenter(anchor)\n\tif (!surfaceRect.width || !surfaceRect.height) {\n\t\treturn {\n\t\t\t[ORIGIN_X_VAR]: '50%',\n\t\t\t[ORIGIN_Y_VAR]: '50%',\n\t\t}\n\t}\n\tconst originX = clampPercent(((x - surfaceRect.left) / surfaceRect.width) * 100)\n\tconst originY = clampPercent(((y - surfaceRect.top) / surfaceRect.height) * 100)\n\treturn {\n\t\t[ORIGIN_X_VAR]: `${originX}%`,\n\t\t[ORIGIN_Y_VAR]: `${originY}%`,\n\t}\n}\n\nexport function surfaceAnimation(layout: OverlayLayout, direction: 'in' | 'out'): AnimationSpec {\n\tif (reducedMotion) {\n\t\t// Opacity-only; explicit reset to { opacity: 1, transform: none } on `in`\n\t\t// so any leftover transform from a prior `out` doesn't persist.\n\t\treturn direction === 'in'\n\t\t\t? {\n\t\t\t\t\tkeyframes: [\n\t\t\t\t\t\t{ opacity: 0, transform: 'none' },\n\t\t\t\t\t\t{ opacity: 1, transform: 'none' },\n\t\t\t\t\t],\n\t\t\t\t\toptions: { duration: 1, easing: 'linear', fill: 'forwards' },\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\tkeyframes: [\n\t\t\t\t\t\t{ opacity: 1, transform: 'none' },\n\t\t\t\t\t\t{ opacity: 0, transform: 'none' },\n\t\t\t\t\t],\n\t\t\t\t\toptions: { duration: 1, easing: 'linear', fill: 'forwards' },\n\t\t\t\t}\n\t}\n\n\tswitch (layout) {\n\t\tcase 'centered':\n\t\t\t// Anchor-origin bloom: scale 0.6 → 1 from the var-driven origin.\n\t\t\t// More aggressive than dialog's 0.92 because the origin carries the\n\t\t\t// spatial work, so less translate is needed. Caller sets the origin\n\t\t\t// vars via anchorOriginVars() before triggering this animation.\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.6)', transformOrigin: ORIGIN_CSS },\n\t\t\t\t\t\t\t{ opacity: 1, transform: 'scale(1)', transformOrigin: ORIGIN_CSS },\n\t\t\t\t\t\t],\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tduration: SPRING_SNAPPY.duration,\n\t\t\t\t\t\t\teasing: getEasing(SPRING_SNAPPY),\n\t\t\t\t\t\t\tfill: 'forwards',\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tkeyframes: [\n\t\t\t\t\t\t\t{ opacity: 1, transform: 'scale(1)', transformOrigin: ORIGIN_CSS },\n\t\t\t\t\t\t\t{ opacity: 0, transform: 'scale(0.95)', transformOrigin: ORIGIN_CSS },\n\t\t\t\t\t\t],\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tduration: DURATION_EXIT,\n\t\t\t\t\t\t\teasing: getEasing(SPRING_SMOOTH),\n\t\t\t\t\t\t\tfill: 'forwards',\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\n\t\tcase 'sheet':\n\t\t\treturn direction === 'in'\n\t\t\t\t? {\n\t\t\t\t\t\tkeyframes: [\n\t\t\t\t\t\t\t{ opacity: 0, transform: 'translateY(100%)' },\n\t\t\t\t\t\t\t{ opacity: 1, transform: 'translateY(0)' },\n\t\t\t\t\t\t],\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tduration: SPRING_GENTLE.duration,\n\t\t\t\t\t\t\teasing: getEasing(SPRING_GENTLE),\n\t\t\t\t\t\t\tfill: 'forwards',\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tkeyframes: [\n\t\t\t\t\t\t\t{ opacity: 1, transform: 'translateY(0)' },\n\t\t\t\t\t\t\t{ opacity: 0, transform: 'translateY(100%)' },\n\t\t\t\t\t\t],\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tduration: DURATION_EXIT,\n\t\t\t\t\t\t\teasing: getEasing(SPRING_SMOOTH),\n\t\t\t\t\t\t\tfill: 'forwards',\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\n\t\tcase 'anchored':\n\t\t\t// Anchored surfaces get a scale-from-origin treatment too — the\n\t\t\t// positioning strategy (Popover API / CSS Anchor / Floating UI) owns\n\t\t\t// the final placement; the surface merely blooms from the anchor.\n\t\t\treturn direction === 'in'\n\t\t\t\t? {\n\t\t\t\t\t\tkeyframes: [\n\t\t\t\t\t\t\t{ opacity: 0, transform: 'scale(0.85)', transformOrigin: ORIGIN_CSS },\n\t\t\t\t\t\t\t{ opacity: 1, transform: 'scale(1)', transformOrigin: ORIGIN_CSS },\n\t\t\t\t\t\t],\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tduration: SPRING_SNAPPY.duration,\n\t\t\t\t\t\t\teasing: getEasing(SPRING_SNAPPY),\n\t\t\t\t\t\t\tfill: 'forwards',\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tkeyframes: [\n\t\t\t\t\t\t\t{ opacity: 1, transform: 'scale(1)', transformOrigin: ORIGIN_CSS },\n\t\t\t\t\t\t\t{ opacity: 0, transform: 'scale(0.92)', transformOrigin: ORIGIN_CSS },\n\t\t\t\t\t\t],\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tduration: DURATION_EXIT,\n\t\t\t\t\t\t\teasing: getEasing(SPRING_SMOOTH),\n\t\t\t\t\t\t\tfill: 'forwards',\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t}\n}\n\n/**\n * FLIP (First / Last / Invert / Play) animation from `before` rect to\n * `after` rect. Caller has already moved the element between the two\n * states; this produces the WAAPI spec that animates the delta back.\n *\n * Used by the ResizeObserver-driven layout re-resolve in the overlay\n * element — when content grows past threshold mid-session and the\n * layout switches from centered → sheet, this animates the transition\n * instead of a hard cut.\n *\n * Reduced-motion collapses to an instant 1ms no-op; caller should check\n * `reducedMotion` (not exported) — or just run this and tolerate the\n * 1ms animation.\n */\nexport function flipAnimation(\n\tbefore: DOMRect | { left: number; top: number; width: number; height: number },\n\tafter: DOMRect | { left: number; top: number; width: number; height: number },\n): AnimationSpec {\n\tif (reducedMotion) {\n\t\treturn {\n\t\t\tkeyframes: [{ transform: 'none' }, { transform: 'none' }],\n\t\t\toptions: { duration: 1, easing: 'linear', fill: 'forwards' },\n\t\t}\n\t}\n\tconst dx = before.left - after.left\n\tconst dy = before.top - after.top\n\tconst sx = after.width > 0 ? before.width / after.width : 1\n\tconst sy = after.height > 0 ? before.height / after.height : 1\n\treturn {\n\t\tkeyframes: [\n\t\t\t{\n\t\t\t\ttransform: `translate(${dx}px, ${dy}px) scale(${sx}, ${sy})`,\n\t\t\t\ttransformOrigin: 'top left',\n\t\t\t},\n\t\t\t{ transform: 'none', transformOrigin: 'top left' },\n\t\t],\n\t\toptions: {\n\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\teasing: getEasing(SPRING_SMOOTH),\n\t\t\tfill: 'forwards',\n\t\t},\n\t}\n}\n","import { filter, fromEvent, merge, Observable, Subject, take, takeUntil, tap } from 'rxjs'\n\n/**\n * Swipe-to-dismiss gesture for sheet-layout overlays.\n *\n * Pointer-event based — a single pipeline covers touch, mouse, pen, and\n * any future pointer source. Without a visible drag handle, the gesture\n * only starts within the top DRAG_START_TOP_PX band of the surface (a\n * standard pull-to-dismiss convention). Escape + backdrop click cover\n * the non-pointer dismiss paths via the component's modal-tier listeners.\n *\n * RxJS-native (rxjs skill principle 3: every async source is an Observable).\n * Thresholds are policy constants, not magic numbers.\n */\n\n/** Distance (px) past which the gesture dismisses. */\nexport const DISMISS_DISTANCE_PX = 80\n/** Distance as fraction of sheet height past which the gesture dismisses. */\nexport const DISMISS_DISTANCE_FRACTION = 0.25 // Vaul's value — feels right.\n/** Velocity (px/ms) past which the gesture dismisses even short of distance. */\nexport const DISMISS_VELOCITY_PX_PER_MS = 0.4 // Vaul's value.\n/** Drag only starts if pointerdown is within this top band (unless a drag handle is used). */\nexport const DRAG_START_TOP_PX = 40\n/** Snap-back animation duration when gesture doesn't pass threshold. */\nexport const SNAP_BACK_MS = 300\n\n/**\n * Logarithmic rubber-band damping for upward (negative) drag past the\n * top detent. Pulled from Vaul — `8 * (log(v + 1) - 2)` — diminishing\n * returns that feel physical, unlike the linear × 0.2 this replaces.\n *\n * Applied only to upward motion; downward drag tracks 1:1.\n */\nexport function logDamp(delta: number): number {\n\tif (delta >= 0) return delta\n\tconst abs = -delta\n\treturn -Math.max(0, 8 * (Math.log(abs + 1) - 2))\n}\n\nexport interface SwipeInputs {\n\t/** The surface element to track gestures on. */\n\tsurface: HTMLElement\n\t/** Optional drag handle. When provided, drag can start from anywhere on\n\t * the handle; without it, drag must start in the top DRAG_START_TOP_PX band. */\n\tdragHandle?: HTMLElement | null\n\t/** Completes the gesture stream (component disconnect / layout change). */\n\tuntil$: Observable<unknown>\n}\n\n/**\n * Emits exactly once when the user commits to dismissing the sheet\n * (distance OR velocity threshold passed). Works for touch, mouse, and\n * pen via the Pointer Events API. During an in-progress drag the\n * surface's `transform` is updated directly for 1:1 tracking. On\n * release-but-not-dismissed, the surface snaps back via a CSS transition.\n */\nexport function swipeToDismiss$(inputs: SwipeInputs): Observable<'dismiss'> {\n\tconst { surface, dragHandle, until$ } = inputs\n\n\treturn new Observable<'dismiss'>((subscriber) => {\n\t\tconst dragTarget = dragHandle ?? surface\n\t\tconst stopCurrent$ = new Subject<void>()\n\n\t\tlet dragging = false\n\t\tlet activePointerId: number | null = null\n\t\tlet startY = 0\n\t\tlet startTime = 0\n\t\tlet currentDelta = 0\n\n\t\tconst pointerDown$ = fromEvent<PointerEvent>(dragTarget, 'pointerdown').pipe(\n\t\t\t// Primary button / primary finger only. For touch, isPrimary also\n\t\t\t// covers the pinch-zoom guard (only one finger has isPrimary=true).\n\t\t\tfilter((e) => e.isPrimary && (e.pointerType !== 'mouse' || e.button === 0)),\n\t\t\t// Without a dedicated drag handle, require start in the top band.\n\t\t\tfilter((e) => {\n\t\t\t\tif (dragHandle) return true\n\t\t\t\tconst rect = surface.getBoundingClientRect()\n\t\t\t\treturn e.clientY - rect.top <= DRAG_START_TOP_PX\n\t\t\t}),\n\t\t\ttap((e) => {\n\t\t\t\tdragging = true\n\t\t\t\tactivePointerId = e.pointerId\n\t\t\t\tstartY = e.clientY\n\t\t\t\tstartTime = performance.now()\n\t\t\t\tcurrentDelta = 0\n\t\t\t\tsurface.style.transition = 'none'\n\t\t\t\tsurface.style.willChange = 'transform'\n\t\t\t\t// Capture so pointermove fires even if the pointer leaves the element\n\t\t\t\t// (covers the \"drag from handle, move past surface edge\" case).\n\t\t\t\ttry {\n\t\t\t\t\t;(dragTarget as Element).setPointerCapture?.(e.pointerId)\n\t\t\t\t} catch {\n\t\t\t\t\t// setPointerCapture can throw on detached elements; safe to ignore.\n\t\t\t\t}\n\t\t\t}),\n\t\t)\n\n\t\tconst pointerMove$ = fromEvent<PointerEvent>(dragTarget, 'pointermove').pipe(\n\t\t\tfilter(() => dragging),\n\t\t\tfilter((e) => e.pointerId === activePointerId),\n\t\t\ttap((e) => {\n\t\t\t\tconst deltaY = e.clientY - startY\n\t\t\t\tcurrentDelta = logDamp(deltaY)\n\t\t\t\tsurface.style.transform = `translateY(${currentDelta}px)`\n\t\t\t\t// preventDefault is a no-op on default Pointer Events but avoids\n\t\t\t\t// accidental text selection / page scroll during the drag.\n\t\t\t\tif (e.cancelable) e.preventDefault()\n\t\t\t}),\n\t\t)\n\n\t\tconst pointerEnd$ = merge(\n\t\t\tfromEvent<PointerEvent>(dragTarget, 'pointerup'),\n\t\t\tfromEvent<PointerEvent>(dragTarget, 'pointercancel'),\n\t\t\tfromEvent<PointerEvent>(dragTarget, 'lostpointercapture'),\n\t\t).pipe(\n\t\t\tfilter(() => dragging),\n\t\t\tfilter((e) => e.pointerId === activePointerId),\n\t\t\ttap(() => {\n\t\t\t\tdragging = false\n\t\t\t\tconst pointerId = activePointerId\n\t\t\t\tactivePointerId = null\n\t\t\t\ttry {\n\t\t\t\t\tif (pointerId !== null) (dragTarget as Element).releasePointerCapture?.(pointerId)\n\t\t\t\t} catch {\n\t\t\t\t\t// same reason as setPointerCapture — ignore.\n\t\t\t\t}\n\n\t\t\t\tconst elapsed = Math.max(1, performance.now() - startTime)\n\t\t\t\tconst velocity = currentDelta / elapsed\n\t\t\t\tconst surfaceHeight = surface.getBoundingClientRect().height\n\t\t\t\tconst distanceThreshold = Math.min(DISMISS_DISTANCE_PX, surfaceHeight * DISMISS_DISTANCE_FRACTION)\n\n\t\t\t\tconst shouldDismiss =\n\t\t\t\t\tcurrentDelta > distanceThreshold ||\n\t\t\t\t\t(currentDelta > 20 && velocity > DISMISS_VELOCITY_PX_PER_MS)\n\n\t\t\t\tsurface.style.willChange = ''\n\n\t\t\t\tif (shouldDismiss) {\n\t\t\t\t\t// Finish translate off-screen for visual continuity with the dismiss\n\t\t\t\t\t// animation; the caller's teardown will unmount.\n\t\t\t\t\tsurface.style.transition = `transform ${SNAP_BACK_MS}ms cubic-bezier(0.16, 1, 0.3, 1)`\n\t\t\t\t\tsurface.style.transform = 'translateY(100%)'\n\t\t\t\t\tsubscriber.next('dismiss')\n\t\t\t\t\tsubscriber.complete()\n\t\t\t\t} else {\n\t\t\t\t\t// Snap back to 0.\n\t\t\t\t\tsurface.style.transition = `transform ${SNAP_BACK_MS}ms cubic-bezier(0.16, 1, 0.3, 1)`\n\t\t\t\t\tsurface.style.transform = 'translateY(0)'\n\t\t\t\t}\n\t\t\t}),\n\t\t)\n\n\t\tmerge(pointerDown$, pointerMove$, pointerEnd$)\n\t\t\t.pipe(takeUntil(merge(stopCurrent$, until$)))\n\t\t\t.subscribe()\n\n\t\treturn () => {\n\t\t\tstopCurrent$.next()\n\t\t\tstopCurrent$.complete()\n\t\t\tsurface.style.transition = ''\n\t\t\tsurface.style.transform = ''\n\t\t\tsurface.style.willChange = ''\n\t\t}\n\t}).pipe(take(1))\n}\n\n","import type { Anchor, OverlayLayout, VirtualAnchor } from './overlay.types'\n\n/**\n * Layout dispatch engine — pure function of (anchor, content, viewport).\n * No DOM access, no side effects — testable with synthetic inputs.\n *\n * Thresholds are policy constants, not magic numbers. Changes are visible\n * as named-constant diffs, not hidden in inline literals (state skill:\n * \"thresholds ARE the policy\").\n */\n\n/** 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\n/**\n * Resolved reference the positioning strategies consume.\n *\n * `el` is populated when the anchor is an HTMLElement — the Popover API\n * tier uses it directly via the `anchor=<id>` attribute, and Tier 1 / CSS\n * Anchor Positioning sets `element.style.anchorName` on it.\n *\n * `virtual` is populated for point/rect/TouchEvent anchors — Floating UI\n * accepts any object exposing `getBoundingClientRect()` as a virtual\n * reference. The Popover API path cannot use virtual references, so a\n * caller passing a point / DOMRect / event forces Tier 3 (or Tier 2 with\n * Floating UI, not CSS Anchor Positioning).\n */\nexport interface ResolvedAnchor {\n\tel?: HTMLElement\n\tvirtual?: VirtualAnchor\n}\n\n/**\n * Normalise an `Anchor` input into the shape the positioning strategies\n * accept. One function, one decision: element wins if present; otherwise\n * synthesize a zero-size virtual reference at the anchor's point.\n *\n * Called by the overlay element during `open()` before dispatching to\n * `pickPositioner(resolved)`.\n */\nexport function resolveAnchorRef(anchor: Anchor | undefined): ResolvedAnchor | undefined {\n\tif (!anchor) return undefined\n\n\t// HTMLElement — native element reference.\n\tif (typeof HTMLElement !== 'undefined' && anchor instanceof HTMLElement) {\n\t\treturn { el: anchor }\n\t}\n\n\t// Any other object with getBoundingClientRect — treat as virtual.\n\tif (typeof (anchor as { getBoundingClientRect?: unknown }).getBoundingClientRect === 'function') {\n\t\treturn {\n\t\t\tvirtual: {\n\t\t\t\tgetBoundingClientRect: () => (anchor as { getBoundingClientRect(): DOMRect }).getBoundingClientRect(),\n\t\t\t},\n\t\t}\n\t}\n\n\t// DOMRect — fixed rect; synthesize a virtual that returns it verbatim.\n\tif (\n\t\ttypeof (anchor as DOMRect).width === 'number' &&\n\t\ttypeof (anchor as DOMRect).height === 'number' &&\n\t\ttypeof (anchor as DOMRect).left === 'number' &&\n\t\ttypeof (anchor as DOMRect).top === 'number'\n\t) {\n\t\tconst rect = anchor as DOMRect\n\t\treturn {\n\t\t\tvirtual: {\n\t\t\t\tgetBoundingClientRect: () => rect,\n\t\t\t},\n\t\t}\n\t}\n\n\t// MouseEvent / PointerEvent — zero-size rect at click point.\n\tif (typeof (anchor as MouseEvent).clientX === 'number' && typeof (anchor as MouseEvent).clientY === 'number') {\n\t\tconst e = anchor as MouseEvent\n\t\tconst rect = makePointRect(e.clientX, e.clientY)\n\t\treturn { virtual: { getBoundingClientRect: () => rect } }\n\t}\n\n\t// TouchEvent — zero-size rect at first touch point.\n\tif (\n\t\ttypeof (anchor as TouchEvent).touches !== 'undefined' &&\n\t\t(anchor as TouchEvent).touches.length > 0\n\t) {\n\t\tconst t = (anchor as TouchEvent).touches[0]\n\t\tconst rect = makePointRect(t.clientX, t.clientY)\n\t\treturn { virtual: { getBoundingClientRect: () => rect } }\n\t}\n\n\t// { x, y } point — zero-size rect at coords.\n\tconst pt = anchor as { x: number; y: number }\n\tconst rect = makePointRect(pt.x, pt.y)\n\treturn { virtual: { getBoundingClientRect: () => rect } }\n}\n\n/**\n * Construct a DOMRect-compatible object for a zero-width / zero-height\n * point. Avoids `new DOMRect(...)` which isn't constructable across all\n * lib.dom.d.ts vintages.\n */\nfunction makePointRect(x: number, y: number): DOMRect {\n\treturn {\n\t\tx,\n\t\ty,\n\t\twidth: 0,\n\t\theight: 0,\n\t\tleft: x,\n\t\tright: x,\n\t\ttop: y,\n\t\tbottom: y,\n\t\ttoJSON() {\n\t\t\treturn { x, y, width: 0, height: 0, left: x, right: x, top: y, bottom: y }\n\t\t},\n\t}\n}\n","import {\n\tautoUpdate,\n\tcomputePosition,\n\tflip,\n\toffset,\n\tshift,\n\tsize,\n\ttype Placement,\n} from '@floating-ui/dom'\nimport { Observable } from 'rxjs'\nimport { ANCHOR_FIT_PADDING_PX, type ResolvedAnchor } from './overlay.layout'\nimport type { OverlayPlacement, OverlayTier } from './overlay.types'\n\n/**\n * Three-tier positioning ladder for anchored overlays. Public API of the\n * overlay doesn't change based on the tier — the strategy is picked\n * internally by feature-detection.\n *\n * Tier 1 — CSS Anchor Positioning (Popover + `anchor-name` / `position-anchor`)\n * Zero-JS position tracking. Chromium-only today.\n *\n * Tier 2 — Popover API + Floating UI\n * Native top-layer + light-dismiss + Esc from `popover=\"auto\"`, Floating\n * UI middleware for the position math. Safari 17+, Chrome 114+, Firefox 125+.\n *\n * Tier 3 — Floating UI only\n * Fallback for browsers without the Popover API. Caller provides manual\n * backdrop + click-outside + Esc wiring.\n */\n\n/**\n * Feature-detection snapshot captured at module load. Frozen so consumers\n * can safely destructure and compare.\n */\nexport const CAPS = Object.freeze({\n\tpopover:\n\t\ttypeof HTMLElement !== 'undefined' &&\n\t\t'popover' in HTMLElement.prototype &&\n\t\ttypeof (HTMLElement.prototype as unknown as { showPopover?: () => void }).showPopover === 'function',\n\tcssAnchor:\n\t\ttypeof CSS !== 'undefined' &&\n\t\ttypeof CSS.supports === 'function' &&\n\t\tCSS.supports('anchor-name: --x'),\n})\n\n/**\n * Pick the positioning tier for an anchor.\n *\n * CSS Anchor Positioning (Tier 1) requires a real element anchor — you\n * can't point `anchor-name` at a DOMRect or a coord. A point/rect anchor\n * forces Tier 2 (or Tier 3 if popover isn't supported).\n */\nexport function pickPositioner(anchor: ResolvedAnchor): OverlayTier {\n\tif (CAPS.popover && CAPS.cssAnchor && anchor.el) return 'css-anchor'\n\tif (CAPS.popover) return 'popover-fui'\n\treturn 'fui-only'\n}\n\n/* ======================================================================= *\n * Tier 1 — Popover API + CSS Anchor *\n * ======================================================================= */\n\n/**\n * Set up CSS Anchor Positioning. Assigns a unique `anchor-name` to the\n * anchor element and injects a stylesheet into the shadow root that\n * positions the surface relative to it. No JS running per frame.\n *\n * Returns a cleanup function that removes the injected styles and the\n * anchor-name from the anchor element.\n */\nexport function positionCSSAnchor(\n\tsurface: HTMLElement,\n\tanchor: ResolvedAnchor,\n\tshadowRoot: ShadowRoot,\n\topts: { id: string; placement?: OverlayPlacement } = { id: '' },\n): () => void {\n\tif (!anchor.el) {\n\t\tthrow new Error('positionCSSAnchor requires an element anchor')\n\t}\n\tconst anchorEl = anchor.el\n\tconst anchorName = `--ov-${opts.id || Math.random().toString(36).slice(2, 10)}`\n\tconst placement = opts.placement ?? 'bottom-start'\n\n\t// Save any prior anchor-name so we can restore it on cleanup.\n\tconst priorAnchorName = anchorEl.style.getPropertyValue('anchor-name')\n\tanchorEl.style.setProperty('anchor-name', anchorName)\n\n\tconst sheet = new CSSStyleSheet()\n\tsheet.replaceSync(`\n\t\t${surface.localName}[data-overlay-ref=\"${opts.id}\"] {\n\t\t\tposition-anchor: ${anchorName};\n\t\t\t${cssForPlacement(placement)}\n\t\t\tmargin: 8px;\n\t\t\tposition-try-fallbacks:\n\t\t\t\tflip-block,\n\t\t\t\tflip-inline,\n\t\t\t\tflip-block flip-inline;\n\t\t}\n\t`)\n\tsurface.dataset.overlayRef = opts.id\n\tconst existing = shadowRoot.adoptedStyleSheets\n\tshadowRoot.adoptedStyleSheets = [...existing, sheet]\n\n\treturn () => {\n\t\tif (priorAnchorName) {\n\t\t\tanchorEl.style.setProperty('anchor-name', priorAnchorName)\n\t\t} else {\n\t\t\tanchorEl.style.removeProperty('anchor-name')\n\t\t}\n\t\tshadowRoot.adoptedStyleSheets = shadowRoot.adoptedStyleSheets.filter((s) => s !== sheet)\n\t\tdelete surface.dataset.overlayRef\n\t}\n}\n\nfunction cssForPlacement(p: OverlayPlacement): string {\n\t// Minimal mapping for the Tier 1 stylesheet. The browser's\n\t// `position-try-fallbacks` flips when the preferred side doesn't fit,\n\t// so only the starting side needs to be encoded here.\n\tswitch (p) {\n\t\tcase 'top':\n\t\tcase 'top-start':\n\t\t\treturn 'bottom: anchor(top); left: anchor(start);'\n\t\tcase 'top-end':\n\t\t\treturn 'bottom: anchor(top); right: anchor(end);'\n\t\tcase 'bottom':\n\t\tcase 'bottom-start':\n\t\t\treturn 'top: anchor(bottom); left: anchor(start);'\n\t\tcase 'bottom-end':\n\t\t\treturn 'top: anchor(bottom); right: anchor(end);'\n\t\tcase 'left':\n\t\tcase 'left-start':\n\t\t\treturn 'right: anchor(left); top: anchor(start);'\n\t\tcase 'left-end':\n\t\t\treturn 'right: anchor(left); bottom: anchor(end);'\n\t\tcase 'right':\n\t\tcase 'right-start':\n\t\t\treturn 'left: anchor(right); top: anchor(start);'\n\t\tcase 'right-end':\n\t\t\treturn 'left: anchor(right); bottom: anchor(end);'\n\t}\n}\n\n/* ======================================================================= *\n * Tier 2 — Popover API (top-layer only) *\n * ======================================================================= */\n\n/**\n * Wire the Popover API lifecycle — the surface gets `popover=\"manual\"` and\n * `showPopover()` is called to promote it into the native top layer. No\n * position math here; the caller pairs this with `positionFloatingUI` for\n * the geometry, since Tier 2 is Popover-for-stacking + Floating UI-for-math.\n *\n * `manual` (not `auto`) so stacked overlays don't fight the browser's\n * popover-auto light-dismiss algorithm: opening a second `popover=\"auto\"`\n * that isn't a DOM/invoker descendant of the first closes the first via\n * the toggle event. Each schmancy overlay is appended as a sibling to\n * `<body>`, so the browser can't see the nesting and would dismiss the\n * parent. With `manual`, schmancy owns Esc + outside-click via\n * `wireCloseTriggers`, and the top-layer rendering is preserved.\n *\n * Returns a cleanup function that hides the popover and strips the attr.\n */\nexport function positionPopoverAPI(surface: HTMLElement): () => void {\n\tif (!CAPS.popover) {\n\t\tthrow new Error('positionPopoverAPI requires Popover API support')\n\t}\n\tsurface.setAttribute('popover', 'manual')\n\ttry {\n\t\t;(surface as unknown as { showPopover(): void }).showPopover()\n\t} catch {\n\t\t// showPopover can throw if already shown or detached; the component\n\t\t// is responsible for calling this on an already-mounted, not-yet-shown\n\t\t// surface. Silently swallowing a double-open is fine.\n\t}\n\treturn () => {\n\t\ttry {\n\t\t\t;(surface as unknown as { hidePopover?: () => void }).hidePopover?.()\n\t\t} catch {\n\t\t\t// already hidden / disconnected — fine.\n\t\t}\n\t\tsurface.removeAttribute('popover')\n\t}\n}\n\n/* ======================================================================= *\n * Tier 2 / 3 — Floating UI position math *\n * ======================================================================= */\n\nexport interface FloatingUIOptions {\n\t/** Preferred placement; Floating UI's `flip` middleware handles falls. */\n\tplacement?: OverlayPlacement\n\t/** Padding used by `shift` + `size` middleware. Defaults to\n\t * `ANCHOR_FIT_PADDING_PX` from overlay.layout. */\n\tpadding?: number\n\t/** Gap between anchor and surface. Default 8px. */\n\toffsetPx?: number\n\t/** Whether `autoUpdate` should track element resizes. Default true. */\n\ttrack?: boolean\n}\n\n/**\n * Floating UI-driven positioning. Returns a cold Observable — subscribe to\n * start positioning, unsubscribe to stop tracking (teardown cancels the\n * `autoUpdate` loop). The caller composes with `takeUntil(this.disconnecting)`:\n *\n * positionFloatingUI(surface, anchor, opts)\n * .pipe(takeUntil(this.disconnecting))\n * .subscribe()\n *\n * Middleware (stack, in order):\n * offset(opts.offsetPx)\n * → flip({ fallbackPlacements: [...] })\n * → shift({ padding: opts.padding })\n * → size({ apply: clamp maxWidth AND maxHeight from availableWidth/Height })\n *\n * `flip` is chosen over `autoPlacement` because element-anchored overlays\n * should respect the trigger's spatial context (menus shouldn't jump\n * sides). Dialog uses `autoPlacement` because it's point-anchored.\n */\nexport function positionFloatingUI(\n\tsurface: HTMLElement,\n\tanchor: ResolvedAnchor,\n\topts: FloatingUIOptions = {},\n): Observable<void> {\n\treturn new Observable<void>((subscriber) => {\n\t\tconst reference = anchor.el ?? anchor.virtual\n\t\tif (!reference) {\n\t\t\tsubscriber.error(new Error('positionFloatingUI requires an element or virtual anchor'))\n\t\t\treturn\n\t\t}\n\n\t\tconst placement: Placement = (opts.placement ?? 'bottom-start') as Placement\n\t\tconst padding = opts.padding ?? ANCHOR_FIT_PADDING_PX\n\t\tconst offsetPx = opts.offsetPx ?? 8\n\n\t\tconst update = async (): Promise<void> => {\n\t\t\ttry {\n\t\t\t\tconst { x, y } = await computePosition(reference, surface, {\n\t\t\t\t\tstrategy: 'fixed',\n\t\t\t\t\tplacement,\n\t\t\t\t\tmiddleware: [\n\t\t\t\t\t\toffset(offsetPx),\n\t\t\t\t\t\tflip({ padding, fallbackPlacements: defaultFallbacks(placement) }),\n\t\t\t\t\t\tshift({ padding }),\n\t\t\t\t\t\tsize({\n\t\t\t\t\t\t\tpadding,\n\t\t\t\t\t\t\tapply({ availableWidth, availableHeight, elements }) {\n\t\t\t\t\t\t\t\telements.floating.style.maxWidth = `${Math.max(0, availableWidth)}px`\n\t\t\t\t\t\t\t\telements.floating.style.maxHeight = `${Math.max(0, availableHeight)}px`\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t],\n\t\t\t\t})\n\t\t\t\tObject.assign(surface.style, {\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\tleft: `${Math.round(x)}px`,\n\t\t\t\t\ttop: `${Math.round(y)}px`,\n\t\t\t\t\ttransform: 'none',\n\t\t\t\t})\n\t\t\t\tsubscriber.next()\n\t\t\t} catch (err) {\n\t\t\t\tsubscriber.error(err)\n\t\t\t}\n\t\t}\n\n\t\tconst cleanup = autoUpdate(reference, surface, update, {\n\t\t\tancestorScroll: true,\n\t\t\tancestorResize: true,\n\t\t\telementResize: opts.track !== false,\n\t\t})\n\n\t\treturn () => {\n\t\t\tcleanup()\n\t\t}\n\t})\n}\n\nfunction defaultFallbacks(preferred: Placement): Placement[] {\n\t// Flip to the opposite side first, then try the perpendicular ends.\n\t// Small, deterministic list — not exhaustive.\n\tswitch (preferred) {\n\t\tcase 'bottom-start':\n\t\t\treturn ['top-start', 'bottom-end', 'top-end']\n\t\tcase 'bottom-end':\n\t\t\treturn ['top-end', 'bottom-start', 'top-start']\n\t\tcase 'top-start':\n\t\t\treturn ['bottom-start', 'top-end', 'bottom-end']\n\t\tcase 'top-end':\n\t\t\treturn ['bottom-end', 'top-start', 'bottom-start']\n\t\tcase 'left-start':\n\t\t\treturn ['right-start', 'left-end', 'right-end']\n\t\tcase 'left-end':\n\t\t\treturn ['right-end', 'left-start', 'right-start']\n\t\tcase 'right-start':\n\t\t\treturn ['left-start', 'right-end', 'left-end']\n\t\tcase 'right-end':\n\t\t\treturn ['left-end', 'right-start', 'left-start']\n\t\tcase 'top':\n\t\t\treturn ['bottom', 'left', 'right']\n\t\tcase 'bottom':\n\t\t\treturn ['top', 'left', 'right']\n\t\tcase 'left':\n\t\t\treturn ['right', 'top', 'bottom']\n\t\tcase 'right':\n\t\t\treturn ['left', 'top', 'bottom']\n\t\tdefault:\n\t\t\treturn ['top-start', 'bottom-end']\n\t}\n}\n","import { SchmancyElement } from '@mixins/index'\nimport { css, html, render as litRender, type TemplateResult } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { when } from 'lit/directives/when.js'\nimport {\n\tdebounceTime,\n\tdistinctUntilChanged,\n\tEMPTY,\n\tfilter,\n\tfromEvent,\n\tmap,\n\tmerge,\n\tSubject,\n\ttake,\n\ttakeUntil,\n\ttap,\n} from 'rxjs'\nimport type { LazyComponent } from '../area/lazy'\nimport { fromResizeObserver } from '../directives/layout'\nimport {\n\tanchorOriginVars,\n\tflipAnimation,\n\tsurfaceAnimation,\n} from './overlay.animations'\nimport { swipeToDismiss$ } from './overlay.gestures'\nimport {\n\treadViewport,\n\tresolveAnchorRef,\n\tresolveLayout,\n\ttype ResolvedAnchor,\n} from './overlay.layout'\nimport {\n\tpickPositioner,\n\tpositionCSSAnchor,\n\tpositionFloatingUI,\n\tpositionPopoverAPI,\n} from './overlay.positioning'\nimport type {\n\tAnchor,\n\tCloseReason,\n\tContent,\n\tOverlayLayout,\n\tOverlayTier,\n\tShowOptions,\n} from './overlay.types'\n\nconst MOUNT_POINT_ID = 'overlay-mount'\nconst RE_RESOLVE_COOLDOWN_MS = 600\n\n/**\n * The single overlay element. Custom `<div>` shell (not a native\n * `<dialog>`) — one backdrop mechanism for all layouts, one focus-trap\n * path, one animation orchestrator. The shell is always rendered; the\n * backdrop only renders when modal. The surface is positioned per tier:\n *\n * - Modal layouts (centered / sheet) → backdrop + surface, focus-trapped,\n * library-managed z-index.\n * - Anchored 'css-anchor' tier → surface as `popover=\"auto\"` with\n * CSS Anchor Positioning; native top-layer + light-dismiss.\n * - Anchored 'popover-fui' tier → surface as `popover=\"auto\"` + Floating\n * UI position math; native top-layer + light-dismiss.\n * - Anchored 'fui-only' tier → surface positioned by Floating UI;\n * manual click-outside + manual Esc.\n *\n * Public lifecycle: the service calls `open()` to mount content and\n * animate in, `close(reason)` to animate out and dismiss. The element\n * exposes `closed$` (Observable emitting reason + result once) and\n * `tier` / `layout` / `modal` as properties for the stack entry.\n */\n@customElement('schmancy-overlay')\nexport class SchmancyOverlay extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tposition: fixed;\n\t\tinset: 0;\n\t\tz-index: 10000;\n\t\tdisplay: none;\n\t\tpointer-events: none;\n\t}\n\t:host([active]) {\n\t\tdisplay: block;\n\t}\n\t/* Vertical-gradient scrim — Tailwind's bg-gradient utilities cannot reach\n\t * these color-mix percentages with sufficient control. */\n\t.backdrop {\n\t\tbackground: linear-gradient(\n\t\t\tto bottom,\n\t\t\tcolor-mix(in srgb, var(--schmancy-sys-color-scrim) 18%, transparent) 0%,\n\t\t\tcolor-mix(in srgb, var(--schmancy-sys-color-scrim) 56%, transparent) 100%\n\t\t);\n\t\t-webkit-backdrop-filter: blur(16px) saturate(160%);\n\t\tbackdrop-filter: blur(16px) saturate(160%);\n\t}\n\t/* Popover top-layer surfaces — UA defaults push surface off-screen. */\n\t.surface:popover-open {\n\t\tmargin: 0;\n\t\tborder: 0;\n\t}\n`]\n\n\t@property({ type: String, reflect: true }) layout: OverlayLayout = 'centered'\n\t@property({ type: Boolean, reflect: true }) dismissable = true\n\t@property({ type: Boolean, reflect: true }) modal = true\n\t@property({ type: String, reflect: true }) tier: OverlayTier = 'modal'\n\n\t@state() private _active = false\n\n\t@query('.backdrop') private _backdrop?: HTMLDivElement\n\t@query('.surface') private _surface!: HTMLElement\n\n\t/** Close trigger for the service; emits the reason + detail payload. */\n\tprivate readonly _closed$ = new Subject<{ reason: CloseReason; result?: unknown }>()\n\n\tprivate _mounted = false\n\tprivate _closing = false\n\tprivate _resolvedAnchor?: ResolvedAnchor\n\tprivate _rawAnchor?: Anchor\n\tprivate _anchorOriginAnchor?: Anchor\n\tprivate _positionerTeardown?: () => void\n\tprivate _lastFocusedElement: HTMLElement | null = null\n\tprivate _inertedSiblings: HTMLElement[] = []\n\tprivate _lastReResolveAt = 0\n\n\t/** Service subscribes to this to know when the overlay dismissed. */\n\tget closed$(): import('rxjs').Observable<{ reason: CloseReason; result?: unknown }> {\n\t\treturn this._closed$.asObservable()\n\t}\n\n\t/**\n\t * Mount content and animate in. Called by the service after the\n\t * element is attached to the DOM. Resolves when the entrance\n\t * animation completes.\n\t */\n\tasync open(content: Content, options: ShowOptions): Promise<void> {\n\t\tif (this._mounted) throw new Error('schmancy-overlay: open() called twice on the same element')\n\t\tthis._mounted = true\n\n\t\tthis.dismissable = options.dismissable !== false\n\t\tthis._rawAnchor = options.anchor\n\t\tthis._anchorOriginAnchor = options.anchor\n\t\tthis._resolvedAnchor = resolveAnchorRef(options.anchor)\n\n\t\t// Ensure the shell is rendered so the mount point exists.\n\t\tthis._active = true\n\t\tthis.setAttribute('active', '')\n\t\tawait this.updateComplete\n\n\t\tconst mount = this.renderRoot.querySelector(`#${MOUNT_POINT_ID}`) as HTMLElement | null\n\t\tif (!mount) throw new Error('schmancy-overlay: mount point missing')\n\t\tawait mountContent(content, mount, options.props)\n\n\t\t// 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\tthis.layout = resolveLayout({\n\t\t\tanchor: options.anchor,\n\t\t\tcontent: contentSize,\n\t\t\tviewport,\n\t\t})\n\n\t\t// Modal defaults per layout, with the caller's `modal` as escape hatch.\n\t\tthis.modal =\n\t\t\toptions.modal ?? (this.layout === 'centered' || this.layout === 'sheet')\n\n\t\t// Pick the positioning tier. Modal layouts always use the 'modal'\n\t\t// tier (custom shell + manual backdrop); anchored uses the CAPS-driven\n\t\t// ladder. `modal: true` on an anchored layout stays modal.\n\t\tthis.tier = this.modal\n\t\t\t? 'modal'\n\t\t\t: this._resolvedAnchor\n\t\t\t\t? pickPositioner(this._resolvedAnchor)\n\t\t\t\t: 'modal'\n\n\t\tawait this.updateComplete\n\n\t\t// Apply tier-specific positioning. For 'modal' the CSS data-layout\n\t\t// attribute + :host styles already place the surface; nothing to do.\n\t\t// For anchored tiers we delegate to the positioning module.\n\t\tif (this.tier === 'css-anchor' && this._resolvedAnchor?.el && this.shadowRoot) {\n\t\t\tthis._positionerTeardown = positionCSSAnchor(this._surface, this._resolvedAnchor, this.shadowRoot, {\n\t\t\t\tid: `ov-${Math.random().toString(36).slice(2, 10)}`,\n\t\t\t\tplacement: options.preferredPlacement ?? 'bottom-start',\n\t\t\t})\n\t\t\t// Pair with Popover API to get native top-layer + light-dismiss.\n\t\t\tconst popoverCleanup = positionPopoverAPI(this._surface)\n\t\t\tconst cssAnchorTeardown = this._positionerTeardown\n\t\t\tthis._positionerTeardown = () => {\n\t\t\t\tpopoverCleanup()\n\t\t\t\tcssAnchorTeardown?.()\n\t\t\t}\n\t\t} else if (this.tier === 'popover-fui' && this._resolvedAnchor) {\n\t\t\tconst popoverCleanup = positionPopoverAPI(this._surface)\n\t\t\tconst floatSub = positionFloatingUI(this._surface, this._resolvedAnchor, {\n\t\t\t\tplacement: options.preferredPlacement ?? 'bottom-start',\n\t\t\t\toffsetPx: 8,\n\t\t\t\ttrack: options.track !== false,\n\t\t\t})\n\t\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t\t.subscribe()\n\t\t\tthis._positionerTeardown = () => {\n\t\t\t\tpopoverCleanup()\n\t\t\t\tfloatSub.unsubscribe()\n\t\t\t}\n\t\t} else if (this.tier === 'fui-only' && this._resolvedAnchor) {\n\t\t\tconst floatSub = positionFloatingUI(this._surface, this._resolvedAnchor, {\n\t\t\t\tplacement: options.preferredPlacement ?? 'bottom-start',\n\t\t\t\toffsetPx: 8,\n\t\t\t\ttrack: options.track !== false,\n\t\t\t})\n\t\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t\t.subscribe()\n\t\t\tthis._positionerTeardown = () => floatSub.unsubscribe()\n\t\t}\n\n\t\t// Set the anchor-origin CSS vars so the entrance animation blooms\n\t\t// from the click point. Must happen AFTER positioning so the\n\t\t// surface rect is final.\n\t\tthis.setAnchorOriginVars()\n\n\t\t// Wire close triggers (focus trap, Esc, backdrop click, etc).\n\t\tthis.wireFocusTrap()\n\t\tthis.wireCloseTriggers(options.signal)\n\n\t\t// Watch content for mid-session re-resolves (upward-only + cooldown).\n\t\tthis.wireResizeObserver(mount)\n\n\t\t// Play entrance animations.\n\t\tawait this.playAnimations('in')\n\t}\n\n\t/** Play exit animations then dismiss. */\n\tasync close(reason: CloseReason, result?: unknown): Promise<void> {\n\t\tif (this._closing || !this._mounted) return\n\t\tthis._closing = true\n\t\ttry {\n\t\t\tawait this.playAnimations('out')\n\t\t} catch {\n\t\t\t// animation cancelled mid-flight — not an error.\n\t\t}\n\t\tthis.releaseFocusTrap()\n\t\tif (this._positionerTeardown) {\n\t\t\ttry {\n\t\t\t\tthis._positionerTeardown()\n\t\t\t} catch {\n\t\t\t\t// cleanup shouldn't throw; ignore anything that does.\n\t\t\t}\n\t\t\tthis._positionerTeardown = undefined\n\t\t}\n\t\tthis._active = false\n\t\tthis.removeAttribute('active')\n\t\tthis._closed$.next({ reason, result })\n\t\tthis._closed$.complete()\n\t}\n\n\t/* ---------------- render ------------------------------------------- */\n\n\tprotected render(): TemplateResult {\n\t\tif (!this._active) return html``\n\t\tconst baseClasses =\n\t\t\t'surface fixed pointer-events-auto overflow-auto ' +\n\t\t\t'bg-surface-container/85 text-surface-on backdrop-blur-md ' +\n\t\t\t'border border-surface-on/8'\n\t\tconst layoutClasses =\n\t\t\tthis.layout === 'centered'\n\t\t\t\t? 'top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 max-w-[min(calc(100vw-2rem),560px)] max-h-[90dvh] rounded-3xl shadow-overlay'\n\t\t\t\t: this.layout === 'sheet'\n\t\t\t\t\t? 'left-0 right-0 bottom-0 w-full max-h-[90dvh] rounded-t-[28px] shadow-overlay'\n\t\t\t\t\t: 'max-w-[min(480px,calc(100vw-2rem))] max-h-[90dvh] rounded-3xl shadow-overlay-anchored'\n\t\treturn html`\n\t\t\t<div class=\"shell fixed inset-0 pointer-events-none\" part=\"shell\">\n\t\t\t\t${when(\n\t\t\t\t\tthis.modal,\n\t\t\t\t\t() => html`<div class=\"backdrop fixed inset-0 pointer-events-auto\" part=\"backdrop\" @click=${this.onBackdropClick}></div>`,\n\t\t\t\t)}\n\t\t\t\t<section\n\t\t\t\t\tclass=\"${baseClasses} ${layoutClasses}\"\n\t\t\t\t\tpart=\"surface\"\n\t\t\t\t\tdata-layout=${this.layout}\n\t\t\t\t\tdata-tier=${this.tier}\n\t\t\t\t\trole=${this.modal ? 'dialog' : 'region'}\n\t\t\t\t\taria-modal=${this.modal ? 'true' : 'false'}\n\t\t\t\t\ttabindex=\"-1\"\n\t\t\t\t>\n\t\t\t\t\t<div id=${MOUNT_POINT_ID}></div>\n\t\t\t\t</section>\n\t\t\t</div>\n\t\t`\n\t}\n\n\tprivate onBackdropClick = (): void => {\n\t\tif (this.dismissable) void this.close('backdrop')\n\t}\n\n\t/* ---------------- anchor-origin bloom ------------------------------ */\n\n\tprivate setAnchorOriginVars(): void {\n\t\tconst surface = this._surface\n\t\tif (!surface) return\n\t\tconst rect = surface.getBoundingClientRect()\n\t\tconst vars =\n\t\t\tthis.layout === 'centered' && !this._anchorOriginAnchor\n\t\t\t\t? { '--schmancy-overlay-origin-x': '50%', '--schmancy-overlay-origin-y': '50%' }\n\t\t\t\t: this.layout === 'sheet' && !this._anchorOriginAnchor\n\t\t\t\t\t? { '--schmancy-overlay-origin-x': '50%', '--schmancy-overlay-origin-y': '100%' }\n\t\t\t\t\t: anchorOriginVars(this._anchorOriginAnchor, rect)\n\t\tfor (const [k, v] of Object.entries(vars)) {\n\t\t\tsurface.style.setProperty(k, v)\n\t\t}\n\t}\n\n\t/* ---------------- focus trap --------------------------------------- */\n\n\tprivate wireFocusTrap(): void {\n\t\tif (!this.modal) return\n\t\tthis._lastFocusedElement = (document.activeElement as HTMLElement) ?? null\n\t\tconst parent = this.parentElement\n\t\tif (parent) {\n\t\t\tthis._inertedSiblings = []\n\t\t\tfor (const child of Array.from(parent.children)) {\n\t\t\t\tif (child !== this && child instanceof HTMLElement && !child.inert) {\n\t\t\t\t\tchild.inert = true\n\t\t\t\t\tthis._inertedSiblings.push(child)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Focus the surface or the first [autofocus] child.\n\t\tqueueMicrotask(() => {\n\t\t\tconst auto = this._surface?.querySelector<HTMLElement>('[autofocus]')\n\t\t\t;(auto ?? this._surface)?.focus()\n\t\t})\n\t}\n\n\tprivate releaseFocusTrap(): void {\n\t\tfor (const el of this._inertedSiblings) {\n\t\t\tel.inert = false\n\t\t}\n\t\tthis._inertedSiblings = []\n\t\ttry {\n\t\t\tthis._lastFocusedElement?.focus?.()\n\t\t} catch {\n\t\t\t// trigger may be detached now; no-op.\n\t\t}\n\t\tthis._lastFocusedElement = null\n\t}\n\n\t/* ---------------- close triggers ----------------------------------- */\n\n\tprivate wireCloseTriggers(signal?: AbortSignal): void {\n\t\tconst until = this.disconnecting\n\n\t\t// Handle already-aborted signal synchronously — no stream needed.\n\t\tif (signal?.aborted) {\n\t\t\tqueueMicrotask(() => void this.close('abort'))\n\t\t\treturn\n\t\t}\n\n\t\t// Structured close — content dispatches CustomEvent('close', { detail }).\n\t\tconst structured$ = fromEvent<CustomEvent>(this, 'close').pipe(\n\t\t\tfilter((e) => e instanceof CustomEvent),\n\t\t\ttap((e) => e.stopPropagation()),\n\t\t\tmap((e) => ({ reason: 'structured' as CloseReason, result: e.detail })),\n\t\t)\n\n\t\t// Native <form method=\"dialog\"> submission bubbles up as a regular\n\t\t// submit event with `submitter.value` (returnValue proxy for our\n\t\t// custom shell). Capture it and resolve with the string value.\n\t\tconst nativeSubmit$ = fromEvent<SubmitEvent>(this, 'submit').pipe(\n\t\t\tfilter((e) => {\n\t\t\t\tconst form = e.target as HTMLFormElement | null\n\t\t\t\treturn !!form && form.method === 'dialog'\n\t\t\t}),\n\t\t\ttap((e) => e.preventDefault()),\n\t\t\tmap((e) => {\n\t\t\t\tconst submitter = (e as SubmitEvent & { submitter?: HTMLButtonElement | HTMLInputElement })\n\t\t\t\t\t.submitter\n\t\t\t\treturn { reason: 'native-submit' as CloseReason, result: submitter?.value ?? '' }\n\t\t\t}),\n\t\t)\n\n\t\t// Manual Esc — all tiers. Modal has no native dismiss; anchored\n\t\t// tiers use `popover=\"manual\"` so the browser doesn't auto-Esc them\n\t\t// either (the auto popover-stack would close ancestor overlays when\n\t\t// a nested overlay opens — see positionPopoverAPI's comment).\n\t\tconst escape$ = fromEvent<KeyboardEvent>(document, 'keydown').pipe(\n\t\t\tfilter((e) => e.key === 'Escape'),\n\t\t\ttap((e) => e.preventDefault()),\n\t\t\tfilter(() => this.dismissable),\n\t\t\tmap(() => ({ reason: 'escape' as CloseReason })),\n\t\t\ttake(1),\n\t\t)\n\n\t\t// Manual outside-click — all anchored tiers. Modal layouts have a\n\t\t// backdrop that catches outside clicks via `onBackdropClick`; the\n\t\t// anchored tiers (no backdrop) need a document-level pointerdown\n\t\t// listener that ignores clicks whose composedPath includes the\n\t\t// surface or anchor. Use composedPath membership (not\n\t\t// `Node.contains`) so clicks on elements inside slotted /\n\t\t// shadow-DOM descendants of the surface are correctly classified\n\t\t// as \"inside\".\n\t\tconst outsideClick$ = this.tier !== 'modal'\n\t\t\t? fromEvent<PointerEvent>(document, 'pointerdown', { capture: true }).pipe(\n\t\t\t\tfilter((e) => {\n\t\t\t\t\tif (!this.dismissable) return false\n\t\t\t\t\tconst path = e.composedPath()\n\t\t\t\t\tif (this._surface && path.includes(this._surface)) return false\n\t\t\t\t\tif (this._resolvedAnchor?.el && path.includes(this._resolvedAnchor.el)) return false\n\t\t\t\t\treturn true\n\t\t\t\t}),\n\t\t\t\tmap(() => ({ reason: 'backdrop' as CloseReason })),\n\t\t\t\ttake(1),\n\t\t\t)\n\t\t\t: null\n\n\t\t// Swipe-to-dismiss for sheet layout only. No visual drag handle —\n\t\t// the gesture starts from the top 40px of the surface (see\n\t\t// DRAG_START_TOP_PX in overlay.gestures). Escape + backdrop click\n\t\t// cover the other dismiss paths via the modal-tier listeners above.\n\t\tconst swipe$ = this.layout === 'sheet' && this.dismissable\n\t\t\t? swipeToDismiss$({ surface: this._surface, until$: merge(until, this._closed$) }).pipe(\n\t\t\t\ttake(1),\n\t\t\t\tmap(() => ({ reason: 'swipe' as CloseReason })),\n\t\t\t)\n\t\t\t: null\n\n\t\t// AbortSignal — standard cancellation input.\n\t\tconst abort$ = signal\n\t\t\t? fromEvent(signal, 'abort').pipe(\n\t\t\t\ttake(1),\n\t\t\t\tmap(() => ({ reason: 'abort' as CloseReason })),\n\t\t\t)\n\t\t\t: null\n\n\t\tmerge(\n\t\t\tstructured$,\n\t\t\tnativeSubmit$,\n\t\t\tescape$,\n\t\t\toutsideClick$ ?? EMPTY,\n\t\t\tswipe$ ?? EMPTY,\n\t\t\tabort$ ?? EMPTY,\n\t\t)\n\t\t\t.pipe(takeUntil(until))\n\t\t\t.subscribe(({ reason, result }: { reason: CloseReason; result?: unknown }) => void this.close(reason, result))\n\t}\n\n\t/* ---------------- ResizeObserver FLIP re-resolve ------------------- */\n\n\tprivate wireResizeObserver(mount: HTMLElement): void {\n\t\tfromResizeObserver(mount)\n\t\t\t.pipe(\n\t\t\t\tmap((entries) => {\n\t\t\t\t\tconst entry = entries[0]\n\t\t\t\t\tif (!entry) return null\n\t\t\t\t\tconst box = entry.contentRect\n\t\t\t\t\treturn { w: box.width, h: box.height }\n\t\t\t\t}),\n\t\t\t\tfilter((v): v is { w: number; h: number } => v !== null),\n\t\t\t\tdistinctUntilChanged((a, b) => a.w === b.w && a.h === b.h),\n\t\t\t\tdebounceTime(80),\n\t\t\t\ttakeUntil(merge(this.disconnecting, this._closed$)),\n\t\t\t)\n\t\t\t.subscribe((size) => this.maybeReResolve(size))\n\t}\n\n\tprivate async maybeReResolve(size: { w: number; h: number }): Promise<void> {\n\t\tif (this._closing) return\n\t\tconst viewport = readViewport()\n\t\tconst next = resolveLayout({\n\t\t\tanchor: this._rawAnchor,\n\t\t\tcontent: { width: size.w, height: size.h },\n\t\t\tviewport,\n\t\t})\n\t\tif (next === this.layout) return\n\t\t// Cooldown: prevent churn-driven bouncing.\n\t\tconst now = performance.now()\n\t\tif (now - this._lastReResolveAt < RE_RESOLVE_COOLDOWN_MS) return\n\t\t// Upward-only ratchet: centered → sheet on content-grow is OK,\n\t\t// sheet → centered on content-shrink is ignored.\n\t\tif (!isUpwardTransition(this.layout, next)) return\n\n\t\t// FLIP: capture `before` rect, apply new layout, capture `after`,\n\t\t// animate the inverse transform.\n\t\tconst surface = this._surface\n\t\tconst before = surface.getBoundingClientRect()\n\t\tthis.layout = next\n\t\tawait this.updateComplete\n\t\tconst after = surface.getBoundingClientRect()\n\t\tconst spec = flipAnimation(before, after)\n\t\ttry {\n\t\t\tawait surface.animate(spec.keyframes, spec.options).finished\n\t\t} catch {\n\t\t\t// cancelled — not an error.\n\t\t}\n\t\tthis._lastReResolveAt = performance.now()\n\t}\n\n\t/* ---------------- animations --------------------------------------- */\n\n\tprivate async playAnimations(direction: 'in' | 'out'): Promise<void> {\n\t\tconst surface = this._surface\n\t\tif (!surface) return\n\t\tconst spec = surfaceAnimation(this.layout, direction)\n\t\tconst tasks: Promise<unknown>[] = [\n\t\t\tsurface.animate(spec.keyframes, spec.options).finished.catch(() => undefined),\n\t\t]\n\t\tconst backdrop = this._backdrop\n\t\tif (this.modal && backdrop) {\n\t\t\ttasks.push(\n\t\t\t\tbackdrop\n\t\t\t\t\t.animate(\n\t\t\t\t\t\tdirection === 'in' ? [{ opacity: 0 }, { opacity: 1 }] : [{ opacity: 1 }, { opacity: 0 }],\n\t\t\t\t\t\t{ duration: spec.options.duration, easing: direction === 'in' ? 'ease-out' : 'ease-in', fill: 'forwards' },\n\t\t\t\t\t)\n\t\t\t\t\t.finished.catch(() => undefined),\n\t\t\t)\n\t\t}\n\t\tawait Promise.all(tasks)\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-overlay': SchmancyOverlay\n\t}\n}\n\n/* ======================================================================= *\n * content mounting helpers *\n * ======================================================================= */\n\nasync function mountContent(\n\tcontent: Content,\n\thost: HTMLElement,\n\tprops?: Record<string, unknown>,\n): Promise<HTMLElement> {\n\t// TemplateFactory — call at mount time so closed-over variables are read lazily.\n\tif (isTemplateFactory(content)) {\n\t\treturn mountContent(content(), host, props)\n\t}\n\n\t// TemplateResult — render via lit's `render`.\n\tif (isTemplateResult(content)) {\n\t\tlitRender(content, host)\n\t\treturn host\n\t}\n\n\t// Already-instantiated element — append directly.\n\tif (content instanceof HTMLElement) {\n\t\tif (props) Object.assign(content, props)\n\t\thost.appendChild(content)\n\t\treturn content\n\t}\n\n\t// LazyComponent — await the module, recurse with the default export.\n\tif (isLazy(content)) {\n\t\tconst mod = await content()\n\t\treturn mountContent(mod.default, host, props)\n\t}\n\n\t// Class constructor.\n\tif (typeof content === 'function') {\n\t\tconst Ctor = content as unknown as { new (): HTMLElement }\n\t\tconst el = new Ctor()\n\t\tif (props) Object.assign(el, props)\n\t\thost.appendChild(el)\n\t\treturn el\n\t}\n\n\t// Tag name.\n\tif (typeof content === 'string') {\n\t\tconst el = document.createElement(content)\n\t\tif (props) Object.assign(el, props)\n\t\thost.appendChild(el)\n\t\treturn el\n\t}\n\n\tthrow new Error('schmancy-overlay: unsupported content type')\n}\n\nfunction isTemplateFactory(x: unknown): x is import('./overlay.types').TemplateFactory {\n\treturn typeof x === 'function' && !(x as { prototype?: unknown }).prototype\n}\n\nfunction isTemplateResult(x: unknown): x is TemplateResult {\n\treturn typeof x === 'object' && x !== null && '_$litType$' in x\n}\n\nfunction isLazy(x: unknown): x is LazyComponent {\n\treturn typeof x === 'function' && ('preload' in (x as object) || '_promise' in (x as object))\n}\n\nfunction isUpwardTransition(from: OverlayLayout, to: OverlayLayout): boolean {\n\t// Upward ladder: centered < sheet. anchored → sheet is also upward\n\t// (overflow went past threshold). anchored → centered is NOT upward.\n\tif (from === 'centered' && to === 'sheet') return true\n\tif (from === 'anchored' && to === 'sheet') return true\n\treturn false\n}\n"],"mappings":"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"}
@@ -1,43 +0,0 @@
1
- require(`./chunk-CncqDLb2.cjs`);const e=require(`./mixins-BF3Vj8_c.cjs`),t=require(`./active-host-jH3iloCR.cjs`),n=require(`./animation-CCOIW4wJ.cjs`),r=require(`./reduced-motion-Ds-HjMzn.cjs`),i=require(`./layout-eXb9wjDh.cjs`);require(`./overlay.service-BkSeqXIv.cjs`),require(`./overlay.confirm-body-B2ntyquG.cjs`);let a=require(`rxjs`),o=require(`lit/decorators.js`),s=require(`lit`),c=require(`lit/directives/when.js`),l=require(`@floating-ui/dom`);var u=r.t.value;r.t.subscribe(e=>{u=e});var d=`--schmancy-overlay-origin-x`,f=`--schmancy-overlay-origin-y`,p=`var(${d}, 50%) var(${f}, 50%)`;function m(e){return Number.isNaN(e)||!Number.isFinite(e)?50:Math.max(0,Math.min(100,e))}function h(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=null,l=0,u=0,d=0;return(0,a.merge)((0,a.fromEvent)(i,`pointerdown`).pipe((0,a.filter)(e=>e.isPrimary&&(e.pointerType!==`mouse`||e.button===0)),(0,a.filter)(e=>{if(n)return!0;let r=t.getBoundingClientRect();return e.clientY-r.top<=40}),(0,a.tap)(e=>{s=!0,c=e.pointerId,l=e.clientY,u=performance.now(),d=0,t.style.transition=`none`,t.style.willChange=`transform`;try{i.setPointerCapture?.(e.pointerId)}catch{}})),(0,a.fromEvent)(i,`pointermove`).pipe((0,a.filter)(()=>s),(0,a.filter)(e=>e.pointerId===c),(0,a.tap)(e=>{d=function(e){if(e>=0)return e;let t=-e;return-Math.max(0,8*(Math.log(t+1)-2))}(e.clientY-l),t.style.transform=`translateY(${d}px)`,e.cancelable&&e.preventDefault()})),(0,a.merge)((0,a.fromEvent)(i,`pointerup`),(0,a.fromEvent)(i,`pointercancel`),(0,a.fromEvent)(i,`lostpointercapture`)).pipe((0,a.filter)(()=>s),(0,a.filter)(e=>e.pointerId===c),(0,a.tap)(()=>{s=!1;let n=c;c=null;try{n!==null&&i.releasePointerCapture?.(n)}catch{}let r=Math.max(1,performance.now()-u),a=d/r,o=t.getBoundingClientRect().height,l=Math.min(80,.25*o),f=d>l||d>20&&a>.4;t.style.willChange=``,f?(t.style.transition=`transform 300ms cubic-bezier(0.16, 1, 0.3, 1)`,t.style.transform=`translateY(100%)`,e.next(`dismiss`),e.complete()):(t.style.transition=`transform 300ms cubic-bezier(0.16, 1, 0.3, 1)`,t.style.transform=`translateY(0)`)}))).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))}function g(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`}function _(){return{width:window.innerWidth,height:window.innerHeight,isCoarsePointer:window.matchMedia(`(pointer: coarse)`).matches}}function v(e,t){return{x:e,y:t,width:0,height:0,left:e,right:e,top:t,bottom:t,toJSON:()=>({x:e,y:t,width:0,height:0,left:e,right:e,top:t,bottom:t})}}var y=Object.freeze({popover:typeof HTMLElement<`u`&&`popover`in HTMLElement.prototype&&typeof HTMLElement.prototype.showPopover==`function`,cssAnchor:typeof CSS<`u`&&typeof CSS.supports==`function`&&CSS.supports(`anchor-name: --x`)});function b(e){if(!y.popover)throw Error(`positionPopoverAPI requires Popover API support`);e.setAttribute(`popover`,`manual`);try{e.showPopover()}catch{}return()=>{try{e.hidePopover?.()}catch{}e.removeAttribute(`popover`)}}function x(e,t,n={}){return new a.Observable(r=>{let i=t.el??t.virtual;if(!i)return void r.error(Error(`positionFloatingUI requires an element or virtual anchor`));let a=n.placement??`bottom-start`,o=n.padding??16,s=n.offsetPx??8,c=(0,l.autoUpdate)(i,e,async()=>{try{let{x:t,y:n}=await(0,l.computePosition)(i,e,{strategy:`fixed`,placement:a,middleware:[(0,l.offset)(s),(0,l.flip)({padding:o,fallbackPlacements:S(a)}),(0,l.shift)({padding:o}),(0,l.size)({padding:o,apply({availableWidth:e,availableHeight:t,elements:n}){n.floating.style.maxWidth=`${Math.max(0,e)}px`,n.floating.style.maxHeight=`${Math.max(0,t)}px`}})]});Object.assign(e.style,{position:`fixed`,left:`${Math.round(t)}px`,top:`${Math.round(n)}px`,transform:`none`}),r.next()}catch(e){r.error(e)}},{ancestorScroll:!0,ancestorResize:!0,elementResize:!1!==n.track});return()=>{c()}})}function S(e){switch(e){case`bottom-start`:return[`top-start`,`bottom-end`,`top-end`];case`bottom-end`:return[`top-end`,`bottom-start`,`top-start`];case`top-start`:return[`bottom-start`,`top-end`,`bottom-end`];case`top-end`:return[`bottom-end`,`top-start`,`bottom-start`];case`left-start`:return[`right-start`,`left-end`,`right-end`];case`left-end`:return[`right-end`,`left-start`,`right-start`];case`right-start`:return[`left-start`,`right-end`,`left-end`];case`right-end`:return[`left-end`,`right-start`,`left-start`];case`top`:return[`bottom`,`left`,`right`];case`bottom`:return[`top`,`left`,`right`];case`left`:return[`right`,`top`,`bottom`];case`right`:return[`left`,`top`,`bottom`];default:return[`top-start`,`bottom-end`]}}var C=`overlay-mount`,w=class extends e.c{constructor(...e){super(...e),this.layout=`centered`,this.dismissable=!0,this.modal=!0,this.tier=`modal`,this._active=!1,this._closed$=new a.Subject,this._mounted=!1,this._closing=!1,this._lastFocusedElement=null,this._inertedSiblings=[],this._lastReResolveAt=0,this.onBackdropClick=()=>{this.dismissable&&this.close(`backdrop`)}}static{this.styles=[s.css`
2
- :host {
3
- position: fixed;
4
- inset: 0;
5
- z-index: 10000;
6
- display: none;
7
- pointer-events: none;
8
- }
9
- :host([active]) {
10
- display: block;
11
- }
12
- /* Vertical-gradient scrim — Tailwind's bg-gradient utilities cannot reach
13
- * these color-mix percentages with sufficient control. */
14
- .backdrop {
15
- background: linear-gradient(
16
- to bottom,
17
- color-mix(in srgb, var(--schmancy-sys-color-scrim) 18%, transparent) 0%,
18
- color-mix(in srgb, var(--schmancy-sys-color-scrim) 56%, transparent) 100%
19
- );
20
- -webkit-backdrop-filter: blur(16px) saturate(160%);
21
- backdrop-filter: blur(16px) saturate(160%);
22
- }
23
- /* Popover top-layer surfaces — UA defaults push surface off-screen. */
24
- .surface:popover-open {
25
- margin: 0;
26
- border: 0;
27
- }
28
- `]}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,this._rawAnchor=t.anchor,this._anchorOriginAnchor=t.anchor,this._resolvedAnchor=function(e){if(!e)return;if(typeof HTMLElement<`u`&&e instanceof HTMLElement)return{el:e};if(typeof e.getBoundingClientRect==`function`)return{virtual:{getBoundingClientRect:()=>e.getBoundingClientRect()}};if(typeof e.width==`number`&&typeof e.height==`number`&&typeof e.left==`number`&&typeof e.top==`number`){let t=e;return{virtual:{getBoundingClientRect:()=>t}}}if(typeof e.clientX==`number`&&typeof e.clientY==`number`){let t=e,n=v(t.clientX,t.clientY);return{virtual:{getBoundingClientRect:()=>n}}}if(e.touches!==void 0&&e.touches.length>0){let t=e.touches[0],n=v(t.clientX,t.clientY);return{virtual:{getBoundingClientRect:()=>n}}}let t=e,n=v(t.x,t.y);return{virtual:{getBoundingClientRect:()=>n}}}(t.anchor),this._active=!0,this.setAttribute(`active`,``),await this.updateComplete;let n=this.renderRoot.querySelector(`#${C}`);if(!n)throw Error(`schmancy-overlay: mount point missing`);await T(e,n,t.props);let r=_(),i={width:n.scrollWidth,height:n.scrollHeight};var o;if(this.layout=g({anchor:t.anchor,content:i,viewport:r}),this.modal=t.modal??(this.layout===`centered`||this.layout===`sheet`),this.tier=this.modal?`modal`:this._resolvedAnchor?(o=this._resolvedAnchor,y.popover&&y.cssAnchor&&o.el?`css-anchor`:y.popover?`popover-fui`:`fui-only`):`modal`,await this.updateComplete,this.tier===`css-anchor`&&this._resolvedAnchor?.el&&this.shadowRoot){this._positionerTeardown=function(e,t,n,r={id:``}){if(!t.el)throw Error(`positionCSSAnchor requires an element anchor`);let i=t.el,a=`--ov-${r.id||Math.random().toString(36).slice(2,10)}`,o=r.placement??`bottom-start`,s=i.style.getPropertyValue(`anchor-name`);i.style.setProperty(`anchor-name`,a);let c=new CSSStyleSheet;return c.replaceSync(`\n\t\t${e.localName}[data-overlay-ref="${r.id}"] {\n\t\t\tposition-anchor: ${a};\n\t\t\t${function(e){switch(e){case`top`:case`top-start`:return`bottom: anchor(top); left: anchor(start);`;case`top-end`:return`bottom: anchor(top); right: anchor(end);`;case`bottom`:case`bottom-start`:return`top: anchor(bottom); left: anchor(start);`;case`bottom-end`:return`top: anchor(bottom); right: anchor(end);`;case`left`:case`left-start`:return`right: anchor(left); top: anchor(start);`;case`left-end`:return`right: anchor(left); bottom: anchor(end);`;case`right`:case`right-start`:return`left: anchor(right); top: anchor(start);`;case`right-end`:return`left: anchor(right); bottom: anchor(end);`}}(o)}\n\t\t\tmargin: 8px;\n\t\t\tposition-try-fallbacks:\n\t\t\t\tflip-block,\n\t\t\t\tflip-inline,\n\t\t\t\tflip-block flip-inline;\n\t\t}\n\t`),e.dataset.overlayRef=r.id,n.adoptedStyleSheets=[...n.adoptedStyleSheets,c],()=>{s?i.style.setProperty(`anchor-name`,s):i.style.removeProperty(`anchor-name`),n.adoptedStyleSheets=n.adoptedStyleSheets.filter(e=>e!==c),delete e.dataset.overlayRef}}(this._surface,this._resolvedAnchor,this.shadowRoot,{id:`ov-${Math.random().toString(36).slice(2,10)}`,placement:t.preferredPlacement??`bottom-start`});let e=b(this._surface),n=this._positionerTeardown;this._positionerTeardown=()=>{e(),n?.()}}else if(this.tier===`popover-fui`&&this._resolvedAnchor){let e=b(this._surface),n=x(this._surface,this._resolvedAnchor,{placement:t.preferredPlacement??`bottom-start`,offsetPx:8,track:!1!==t.track}).pipe((0,a.takeUntil)(this.disconnecting)).subscribe();this._positionerTeardown=()=>{e(),n.unsubscribe()}}else if(this.tier===`fui-only`&&this._resolvedAnchor){let e=x(this._surface,this._resolvedAnchor,{placement:t.preferredPlacement??`bottom-start`,offsetPx:8,track:!1!==t.track}).pipe((0,a.takeUntil)(this.disconnecting)).subscribe();this._positionerTeardown=()=>e.unsubscribe()}this.setAnchorOriginVars(),this.wireFocusTrap(),this.wireCloseTriggers(t.signal),this.wireResizeObserver(n),await this.playAnimations(`in`)}async close(e,t){if(!this._closing&&this._mounted){this._closing=!0;try{await this.playAnimations(`out`)}catch{}if(this.releaseFocusTrap(),this._positionerTeardown){try{this._positionerTeardown()}catch{}this._positionerTeardown=void 0}this._active=!1,this.removeAttribute(`active`),this._closed$.next({reason:e,result:t}),this._closed$.complete()}}render(){if(!this._active)return s.html``;let e=this.layout===`centered`?`top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 max-w-[min(calc(100vw-2rem),560px)] max-h-[90dvh] rounded-3xl shadow-overlay`:this.layout===`sheet`?`left-0 right-0 bottom-0 w-full max-h-[90dvh] rounded-t-[28px] shadow-overlay`:`max-w-[min(480px,calc(100vw-2rem))] max-h-[90dvh] rounded-3xl shadow-overlay-anchored`;return s.html`
29
- <div class="shell fixed inset-0 pointer-events-none" part="shell">
30
- ${(0,c.when)(this.modal,()=>s.html`<div class="backdrop fixed inset-0 pointer-events-auto" part="backdrop" @click=${this.onBackdropClick}></div>`)}
31
- <section
32
- class="${`surface fixed pointer-events-auto overflow-auto bg-surface-container/85 text-surface-on backdrop-blur-md border border-surface-on/8`} ${e}"
33
- part="surface"
34
- data-layout=${this.layout}
35
- data-tier=${this.tier}
36
- role=${this.modal?`dialog`:`region`}
37
- aria-modal=${this.modal?`true`:`false`}
38
- tabindex="-1"
39
- >
40
- <div id=${C}></div>
41
- </section>
42
- </div>
43
- `}setAnchorOriginVars(){let e=this._surface;if(!e)return;let t=e.getBoundingClientRect(),n=this.layout!==`centered`||this._anchorOriginAnchor?this.layout!==`sheet`||this._anchorOriginAnchor?function(e,t){if(!e)return{[d]:`50%`,[f]:`50%`};let{x:n,y:r}=function(e){if(typeof e.getBoundingClientRect==`function`){let t=e.getBoundingClientRect();return{x:t.left+t.width/2,y:t.top+t.height/2}}if(typeof e.width==`number`&&typeof e.height==`number`&&typeof e.left==`number`&&typeof e.top==`number`){let t=e;return{x:t.left+t.width/2,y:t.top+t.height/2}}if(typeof e.clientX==`number`&&typeof e.clientY==`number`){let t=e;return{x:t.clientX,y:t.clientY}}if(e.touches!==void 0&&e.touches.length>0){let t=e.touches[0];return{x:t.clientX,y:t.clientY}}let t=e;return{x:t.x,y:t.y}}(e);if(!t.width||!t.height)return{[d]:`50%`,[f]:`50%`};let i=m((n-t.left)/t.width*100),a=m((r-t.top)/t.height*100);return{[d]:`${i}%`,[f]:`${a}%`}}(this._anchorOriginAnchor,t):{"--schmancy-overlay-origin-x":`50%`,"--schmancy-overlay-origin-y":`100%`}:{"--schmancy-overlay-origin-x":`50%`,"--schmancy-overlay-origin-y":`50%`};for(let[t,r]of Object.entries(n))e.style.setProperty(t,r)}wireFocusTrap(){if(!this.modal)return;this._lastFocusedElement=document.activeElement??null;let e=this.parentElement;if(e){this._inertedSiblings=[];for(let t of Array.from(e.children))t!==this&&t instanceof HTMLElement&&!t.inert&&(t.inert=!0,this._inertedSiblings.push(t))}queueMicrotask(()=>{(this._surface?.querySelector(`[autofocus]`)??this._surface)?.focus()})}releaseFocusTrap(){for(let e of this._inertedSiblings)e.inert=!1;this._inertedSiblings=[];try{this._lastFocusedElement?.focus?.()}catch{}this._lastFocusedElement=null}wireCloseTriggers(e){let t=this.disconnecting;if(e?.aborted)return void queueMicrotask(()=>{this.close(`abort`)});let n=(0,a.fromEvent)(this,`close`).pipe((0,a.filter)(e=>e instanceof CustomEvent),(0,a.tap)(e=>e.stopPropagation()),(0,a.map)(e=>({reason:`structured`,result:e.detail}))),r=(0,a.fromEvent)(this,`submit`).pipe((0,a.filter)(e=>{let t=e.target;return!!t&&t.method===`dialog`}),(0,a.tap)(e=>e.preventDefault()),(0,a.map)(e=>({reason:`native-submit`,result:e.submitter?.value??``}))),i=(0,a.fromEvent)(document,`keydown`).pipe((0,a.filter)(e=>e.key===`Escape`),(0,a.tap)(e=>e.preventDefault()),(0,a.filter)(()=>this.dismissable),(0,a.map)(()=>({reason:`escape`})),(0,a.take)(1)),o=this.tier===`modal`?null:(0,a.fromEvent)(document,`pointerdown`,{capture:!0}).pipe((0,a.filter)(e=>{if(!this.dismissable)return!1;let t=e.composedPath();return(!this._surface||!t.includes(this._surface))&&(!this._resolvedAnchor?.el||!t.includes(this._resolvedAnchor.el))}),(0,a.map)(()=>({reason:`backdrop`})),(0,a.take)(1)),s=this.layout===`sheet`&&this.dismissable?h({surface:this._surface,until$:(0,a.merge)(t,this._closed$)}).pipe((0,a.take)(1),(0,a.map)(()=>({reason:`swipe`}))):null,c=e?(0,a.fromEvent)(e,`abort`).pipe((0,a.take)(1),(0,a.map)(()=>({reason:`abort`}))):null;(0,a.merge)(n,r,i,o??a.EMPTY,s??a.EMPTY,c??a.EMPTY).pipe((0,a.takeUntil)(t)).subscribe(({reason:e,result:t})=>{this.close(e,t)})}wireResizeObserver(e){i.t(e).pipe((0,a.map)(e=>{let t=e[0];if(!t)return null;let n=t.contentRect;return{w:n.width,h:n.height}}),(0,a.filter)(e=>e!==null),(0,a.distinctUntilChanged)((e,t)=>e.w===t.w&&e.h===t.h),(0,a.debounceTime)(80),(0,a.takeUntil)((0,a.merge)(this.disconnecting,this._closed$))).subscribe(e=>this.maybeReResolve(e))}async maybeReResolve(e){if(this._closing)return;let t=_(),r=g({anchor:this._rawAnchor,content:{width:e.w,height:e.h},viewport:t});if(r===this.layout||performance.now()-this._lastReResolveAt<600||(i=this.layout,a=r,!(i===`centered`&&a===`sheet`||i===`anchored`&&a===`sheet`)))return;var i,a;let o=this._surface,s=o.getBoundingClientRect();this.layout=r,await this.updateComplete;let c=function(e,t){return u?{keyframes:[{transform:`none`},{transform:`none`}],options:{duration:1,easing:`linear`,fill:`forwards`}}:{keyframes:[{transform:`translate(${e.left-t.left}px, ${e.top-t.top}px) scale(${t.width>0?e.width/t.width:1}, ${t.height>0?e.height/t.height:1})`,transformOrigin:`top left`},{transform:`none`,transformOrigin:`top left`}],options:{duration:n.d.duration,easing:n._(n.d),fill:`forwards`}}}(s,o.getBoundingClientRect());try{await o.animate(c.keyframes,c.options).finished}catch{}this._lastReResolveAt=performance.now()}async playAnimations(e){let t=this._surface;if(!t)return;let r=function(e,t){if(u)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.6)`,transformOrigin:p},{opacity:1,transform:`scale(1)`,transformOrigin:p}],options:{duration:n.f.duration,easing:n._(n.f),fill:`forwards`}}:{keyframes:[{opacity:1,transform:`scale(1)`,transformOrigin:p},{opacity:0,transform:`scale(0.95)`,transformOrigin:p}],options:{duration:150,easing:n._(n.d),fill:`forwards`}};case`sheet`:return t===`in`?{keyframes:[{opacity:0,transform:`translateY(100%)`},{opacity:1,transform:`translateY(0)`}],options:{duration:n.u.duration,easing:n._(n.u),fill:`forwards`}}:{keyframes:[{opacity:1,transform:`translateY(0)`},{opacity:0,transform:`translateY(100%)`}],options:{duration:150,easing:n._(n.d),fill:`forwards`}};case`anchored`:return t===`in`?{keyframes:[{opacity:0,transform:`scale(0.85)`,transformOrigin:p},{opacity:1,transform:`scale(1)`,transformOrigin:p}],options:{duration:n.f.duration,easing:n._(n.f),fill:`forwards`}}:{keyframes:[{opacity:1,transform:`scale(1)`,transformOrigin:p},{opacity:0,transform:`scale(0.92)`,transformOrigin:p}],options:{duration:150,easing:n._(n.d),fill:`forwards`}}}}(this.layout,e),i=[t.animate(r.keyframes,r.options).finished.catch(()=>{})],a=this._backdrop;this.modal&&a&&i.push(a.animate(e===`in`?[{opacity:0},{opacity:1}]:[{opacity:1},{opacity:0}],{duration:r.options.duration,easing:e===`in`?`ease-out`:`ease-in`,fill:`forwards`}).finished.catch(()=>{})),await Promise.all(i)}};async function T(e,t,n){if(typeof(r=e)==`function`&&!r.prototype)return T(e(),t,n);var r;if(function(e){return typeof e==`object`&&!!e&&`_$litType$`in e}(e))return(0,s.render)(e,t),t;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 T((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.a([(0,o.property)({type:String,reflect:!0})],w.prototype,`layout`,void 0),t.a([(0,o.property)({type:Boolean,reflect:!0})],w.prototype,`dismissable`,void 0),t.a([(0,o.property)({type:Boolean,reflect:!0})],w.prototype,`modal`,void 0),t.a([(0,o.property)({type:String,reflect:!0})],w.prototype,`tier`,void 0),t.a([(0,o.state)()],w.prototype,`_active`,void 0),t.a([(0,o.query)(`.backdrop`)],w.prototype,`_backdrop`,void 0),t.a([(0,o.query)(`.surface`)],w.prototype,`_surface`,void 0),w=t.a([(0,o.customElement)(`schmancy-overlay`)],w),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return w}});