@mhmo91/schmancy 0.10.22 → 0.10.24

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 (310) hide show
  1. package/custom-elements.json +0 -106
  2. package/dist/agent/{overlay.confirm-body-xfOh5Q28.js → overlay.confirm-body-CvdVfCnN.js} +1 -1
  3. package/dist/agent/{overlay.confirm-body-xfOh5Q28.js.map → overlay.confirm-body-CvdVfCnN.js.map} +1 -1
  4. package/dist/agent/schmancy.agent.js +1844 -1961
  5. package/dist/agent/schmancy.agent.js.map +1 -1
  6. package/dist/agent/schmancy.manifest.json +1 -89
  7. package/dist/{area-Ddk7P5wD.js → area-A_oUP4P1.js} +1 -1
  8. package/dist/{area-Ddk7P5wD.js.map → area-A_oUP4P1.js.map} +1 -1
  9. package/dist/{area-Cbkt0NX4.cjs → area-BuqdaUpQ.cjs} +1 -1
  10. package/dist/{area-Cbkt0NX4.cjs.map → area-BuqdaUpQ.cjs.map} +1 -1
  11. package/dist/area.cjs +1 -1
  12. package/dist/area.js +1 -1
  13. package/dist/{autocomplete-Ds3Q2cwR.js → autocomplete-BoCWO26L.js} +2 -2
  14. package/dist/{autocomplete-Ds3Q2cwR.js.map → autocomplete-BoCWO26L.js.map} +1 -1
  15. package/dist/{autocomplete-CfBFDSc3.cjs → autocomplete-Cy46gJxK.cjs} +1 -1
  16. package/dist/{autocomplete-CfBFDSc3.cjs.map → autocomplete-Cy46gJxK.cjs.map} +1 -1
  17. package/dist/autocomplete.cjs +1 -1
  18. package/dist/autocomplete.js +1 -1
  19. package/dist/avatar.cjs +1 -1
  20. package/dist/avatar.js +1 -1
  21. package/dist/badge.cjs +1 -1
  22. package/dist/badge.js +1 -1
  23. package/dist/{boat-BF5P6p_f.js → boat-B0h5fuAA.js} +1 -1
  24. package/dist/{boat-BF5P6p_f.js.map → boat-B0h5fuAA.js.map} +1 -1
  25. package/dist/{boat-BPN8HLzZ.cjs → boat-RRtBhD3x.cjs} +1 -1
  26. package/dist/{boat-BPN8HLzZ.cjs.map → boat-RRtBhD3x.cjs.map} +1 -1
  27. package/dist/boat.cjs +1 -1
  28. package/dist/boat.js +1 -1
  29. package/dist/breadcrumb.cjs +1 -1
  30. package/dist/breadcrumb.js +1 -1
  31. package/dist/{busy-C7ejPa-Q.cjs → busy-Bn6Pioo8.cjs} +1 -1
  32. package/dist/{busy-C7ejPa-Q.cjs.map → busy-Bn6Pioo8.cjs.map} +1 -1
  33. package/dist/{busy-BuACDJy6.js → busy-DObY7lfu.js} +1 -1
  34. package/dist/{busy-BuACDJy6.js.map → busy-DObY7lfu.js.map} +1 -1
  35. package/dist/busy.cjs +1 -1
  36. package/dist/busy.js +1 -1
  37. package/dist/button-DEi3M2nV.js +446 -0
  38. package/dist/button-DEi3M2nV.js.map +1 -0
  39. package/dist/button-XfdPzfZQ.cjs +120 -0
  40. package/dist/button-XfdPzfZQ.cjs.map +1 -0
  41. package/dist/button.cjs +1 -120
  42. package/dist/button.js +2 -447
  43. package/dist/{card-BIzaLuEg.cjs → card-BjUgRzFh.cjs} +1 -1
  44. package/dist/{card-BIzaLuEg.cjs.map → card-BjUgRzFh.cjs.map} +1 -1
  45. package/dist/{card-CgQwXO8L.js → card-jzUQK0EQ.js} +1 -1
  46. package/dist/{card-CgQwXO8L.js.map → card-jzUQK0EQ.js.map} +1 -1
  47. package/dist/card.cjs +1 -1
  48. package/dist/card.js +1 -1
  49. package/dist/{checkbox-BNdg57Om.js → checkbox-CfCm1vGN.js} +1 -1
  50. package/dist/{checkbox-BNdg57Om.js.map → checkbox-CfCm1vGN.js.map} +1 -1
  51. package/dist/{checkbox-BAqE3sTx.cjs → checkbox-rskgUBxQ.cjs} +1 -1
  52. package/dist/{checkbox-BAqE3sTx.cjs.map → checkbox-rskgUBxQ.cjs.map} +1 -1
  53. package/dist/checkbox.cjs +1 -1
  54. package/dist/checkbox.js +1 -1
  55. package/dist/{chips-DS3y4Lbn.cjs → chips-BiNZKu0J.cjs} +1 -1
  56. package/dist/{chips-DS3y4Lbn.cjs.map → chips-BiNZKu0J.cjs.map} +1 -1
  57. package/dist/{chips-DnqLaOb1.js → chips-Dfim_tQv.js} +2 -2
  58. package/dist/{chips-DnqLaOb1.js.map → chips-Dfim_tQv.js.map} +1 -1
  59. package/dist/chips.cjs +1 -1
  60. package/dist/chips.js +2 -2
  61. package/dist/connectivity.cjs +1 -1
  62. package/dist/connectivity.js +1 -1
  63. package/dist/content-drawer.cjs +1 -1
  64. package/dist/content-drawer.js +1 -1
  65. package/dist/{date-range-CAqB-B0M.js → date-range-B8zoj6Cj.js} +2 -2
  66. package/dist/{date-range-CAqB-B0M.js.map → date-range-B8zoj6Cj.js.map} +1 -1
  67. package/dist/{date-range-VA1mi1N7.cjs → date-range-em7OwhlK.cjs} +1 -1
  68. package/dist/{date-range-VA1mi1N7.cjs.map → date-range-em7OwhlK.cjs.map} +1 -1
  69. package/dist/{date-range-inline-PeRt1iIF.js → date-range-inline-BfUL8_vX.js} +1 -1
  70. package/dist/{date-range-inline-PeRt1iIF.js.map → date-range-inline-BfUL8_vX.js.map} +1 -1
  71. package/dist/{date-range-inline-CAa0_4EI.cjs → date-range-inline-DYeqoBIO.cjs} +1 -1
  72. package/dist/{date-range-inline-CAa0_4EI.cjs.map → date-range-inline-DYeqoBIO.cjs.map} +1 -1
  73. package/dist/date-range-inline.cjs +1 -1
  74. package/dist/date-range-inline.js +1 -1
  75. package/dist/date-range.cjs +1 -1
  76. package/dist/date-range.js +1 -1
  77. package/dist/delay.cjs +1 -1
  78. package/dist/delay.js +1 -1
  79. package/dist/{details-BnXbDpt7.cjs → details-CNM1tuma.cjs} +1 -1
  80. package/dist/{details-BnXbDpt7.cjs.map → details-CNM1tuma.cjs.map} +1 -1
  81. package/dist/{details-BpFjVclg.js → details-D246xN83.js} +1 -1
  82. package/dist/{details-BpFjVclg.js.map → details-D246xN83.js.map} +1 -1
  83. package/dist/details.cjs +1 -1
  84. package/dist/details.js +1 -1
  85. package/dist/{divider-D8cBBkdG.js → divider-CbIp1je9.js} +1 -1
  86. package/dist/{divider-D8cBBkdG.js.map → divider-CbIp1je9.js.map} +1 -1
  87. package/dist/{divider-B84lt1A3.cjs → divider-DaKsGNW-.cjs} +1 -1
  88. package/dist/{divider-B84lt1A3.cjs.map → divider-DaKsGNW-.cjs.map} +1 -1
  89. package/dist/divider.cjs +1 -1
  90. package/dist/divider.js +1 -1
  91. package/dist/dropdown.cjs +1 -1
  92. package/dist/dropdown.js +1 -1
  93. package/dist/{expand-DK-O37-j.cjs → expand-CQDm3BF3.cjs} +1 -1
  94. package/dist/{expand-DK-O37-j.cjs.map → expand-CQDm3BF3.cjs.map} +1 -1
  95. package/dist/{expand-BJiKggfg.js → expand-DRkiO4vw.js} +2 -2
  96. package/dist/{expand-BJiKggfg.js.map → expand-DRkiO4vw.js.map} +1 -1
  97. package/dist/expand.cjs +1 -1
  98. package/dist/expand.js +1 -1
  99. package/dist/{float-RWR6Q1Hh.cjs → float-5O26zNRh.cjs} +1 -1
  100. package/dist/{float-RWR6Q1Hh.cjs.map → float-5O26zNRh.cjs.map} +1 -1
  101. package/dist/{float-B4FDN40h.js → float-CZtu8FnO.js} +1 -1
  102. package/dist/{float-B4FDN40h.js.map → float-CZtu8FnO.js.map} +1 -1
  103. package/dist/float.cjs +1 -1
  104. package/dist/float.js +1 -1
  105. package/dist/{form-ha3df3K7.cjs → form-B90CMeqs.cjs} +1 -1
  106. package/dist/{form-ha3df3K7.cjs.map → form-B90CMeqs.cjs.map} +1 -1
  107. package/dist/{form-B-Sm6u25.js → form-CE6Gwz4r.js} +8 -8
  108. package/dist/{form-B-Sm6u25.js.map → form-CE6Gwz4r.js.map} +1 -1
  109. package/dist/form.cjs +1 -1
  110. package/dist/form.js +6 -6
  111. package/dist/handover/agent-runtime-followups.md +1 -1
  112. package/dist/handover/agent-runtime-v1.md +3 -3
  113. package/dist/icons-B7ppo07M.cjs +33 -0
  114. package/dist/icons-B7ppo07M.cjs.map +1 -0
  115. package/dist/icons-CGhozJ5v.js +48 -0
  116. package/dist/icons-CGhozJ5v.js.map +1 -0
  117. package/dist/icons.cjs +1 -1
  118. package/dist/icons.js +1 -1
  119. package/dist/{iframe-CByrVlZy.js → iframe-C3PMj1MD.js} +1 -1
  120. package/dist/{iframe-CByrVlZy.js.map → iframe-C3PMj1MD.js.map} +1 -1
  121. package/dist/{iframe-BXe1TPx1.cjs → iframe-D98csbEo.cjs} +1 -1
  122. package/dist/{iframe-BXe1TPx1.cjs.map → iframe-D98csbEo.cjs.map} +1 -1
  123. package/dist/iframe.cjs +1 -1
  124. package/dist/iframe.js +1 -1
  125. package/dist/index.cjs +1 -1
  126. package/dist/index.js +27 -27
  127. package/dist/{input-Q0fm34Co.js → input-CCOkeeVM.js} +1 -1
  128. package/dist/{input-Q0fm34Co.js.map → input-CCOkeeVM.js.map} +1 -1
  129. package/dist/{input-BY9OCQWr.cjs → input-_y92Pzon.cjs} +1 -1
  130. package/dist/{input-BY9OCQWr.cjs.map → input-_y92Pzon.cjs.map} +1 -1
  131. package/dist/{input-chip-CytUirVS.js → input-chip-Bzwr5-XL.js} +1 -1
  132. package/dist/{input-chip-CytUirVS.js.map → input-chip-Bzwr5-XL.js.map} +1 -1
  133. package/dist/{input-chip-BwNf3GD0.cjs → input-chip-CR66MWml.cjs} +1 -1
  134. package/dist/{input-chip-BwNf3GD0.cjs.map → input-chip-CR66MWml.cjs.map} +1 -1
  135. package/dist/input.cjs +1 -1
  136. package/dist/input.js +1 -1
  137. package/dist/json.cjs +2 -2
  138. package/dist/json.cjs.map +1 -1
  139. package/dist/json.js +3 -3
  140. package/dist/json.js.map +1 -1
  141. package/dist/kbd.cjs +1 -1
  142. package/dist/kbd.js +1 -1
  143. package/dist/layout.cjs +1 -1
  144. package/dist/layout.js +1 -1
  145. package/dist/{lightbox-p2E0oVR0.cjs → lightbox-Bk3ovcVu.cjs} +1 -1
  146. package/dist/{lightbox-p2E0oVR0.cjs.map → lightbox-Bk3ovcVu.cjs.map} +1 -1
  147. package/dist/{lightbox-Ckvn5YNF.js → lightbox-Dl--fEbP.js} +1 -1
  148. package/dist/{lightbox-Ckvn5YNF.js.map → lightbox-Dl--fEbP.js.map} +1 -1
  149. package/dist/lightbox.cjs +1 -1
  150. package/dist/lightbox.js +1 -1
  151. package/dist/{list-CsrPVvmm.js → list-B3WI_Nfs.js} +1 -1
  152. package/dist/{list-CsrPVvmm.js.map → list-B3WI_Nfs.js.map} +1 -1
  153. package/dist/{list-r57UFHu3.cjs → list-DWngbP2X.cjs} +1 -1
  154. package/dist/{list-r57UFHu3.cjs.map → list-DWngbP2X.cjs.map} +1 -1
  155. package/dist/list.cjs +1 -1
  156. package/dist/list.js +1 -1
  157. package/dist/{menu-DBuZiPyW.cjs → menu-CdYjxJqm.cjs} +1 -1
  158. package/dist/{menu-DBuZiPyW.cjs.map → menu-CdYjxJqm.cjs.map} +1 -1
  159. package/dist/{menu-Csm6Fg88.js → menu-IDhVp6zm.js} +2 -2
  160. package/dist/{menu-Csm6Fg88.js.map → menu-IDhVp6zm.js.map} +1 -1
  161. package/dist/menu.cjs +1 -1
  162. package/dist/menu.js +1 -1
  163. package/dist/{mixins-DTCHPEd4.cjs → mixins-BPUR4Kc4.cjs} +1 -1
  164. package/dist/{mixins-DTCHPEd4.cjs.map → mixins-BPUR4Kc4.cjs.map} +1 -1
  165. package/dist/{mixins-pU53qf6R.js → mixins-C42OILRS.js} +1 -1
  166. package/dist/{mixins-pU53qf6R.js.map → mixins-C42OILRS.js.map} +1 -1
  167. package/dist/mixins.cjs +1 -1
  168. package/dist/mixins.js +1 -1
  169. package/dist/nav-drawer.cjs +1 -1
  170. package/dist/nav-drawer.js +1 -1
  171. package/dist/navigation-bar.cjs +1 -1
  172. package/dist/navigation-bar.js +1 -1
  173. package/dist/navigation-rail.cjs +1 -1
  174. package/dist/navigation-rail.js +1 -1
  175. package/dist/{notification-58tkVys8.cjs → notification-B3wVUC8l.cjs} +1 -1
  176. package/dist/{notification-58tkVys8.cjs.map → notification-B3wVUC8l.cjs.map} +1 -1
  177. package/dist/{notification-CgTBiAdf.js → notification-CllYkvlR.js} +2 -2
  178. package/dist/{notification-CgTBiAdf.js.map → notification-CllYkvlR.js.map} +1 -1
  179. package/dist/notification.cjs +1 -1
  180. package/dist/notification.js +1 -1
  181. package/dist/{option-Bicf6xpI.js → option-CPOL0nHL.js} +1 -1
  182. package/dist/{option-Bicf6xpI.js.map → option-CPOL0nHL.js.map} +1 -1
  183. package/dist/{option-61YE3gub.cjs → option-cRsdshy8.cjs} +1 -1
  184. package/dist/{option-61YE3gub.cjs.map → option-cRsdshy8.cjs.map} +1 -1
  185. package/dist/option.cjs +1 -1
  186. package/dist/option.js +1 -1
  187. package/dist/{overlay-CpvmytrQ.cjs → overlay-BnTvnNDc.cjs} +1 -1
  188. package/dist/{overlay-CpvmytrQ.cjs.map → overlay-BnTvnNDc.cjs.map} +1 -1
  189. package/dist/{overlay-CAI2FAp7.js → overlay-DJ-vlwtR.js} +3 -3
  190. package/dist/{overlay-CAI2FAp7.js.map → overlay-DJ-vlwtR.js.map} +1 -1
  191. package/dist/overlay.cjs +1 -1
  192. package/dist/{overlay.confirm-body-QD-5cj3_.cjs → overlay.confirm-body-CQ-FwySO.cjs} +1 -1
  193. package/dist/{overlay.confirm-body-QD-5cj3_.cjs.map → overlay.confirm-body-CQ-FwySO.cjs.map} +1 -1
  194. package/dist/{overlay.confirm-body-Cq25CkTw.js → overlay.confirm-body-DEb9xw5N.js} +1 -1
  195. package/dist/{overlay.confirm-body-Cq25CkTw.js.map → overlay.confirm-body-DEb9xw5N.js.map} +1 -1
  196. package/dist/overlay.js +3 -3
  197. package/dist/{overlay.service-BG0bqPwJ.cjs → overlay.service-CKBCIP2f.cjs} +1 -1
  198. package/dist/{overlay.service-BG0bqPwJ.cjs.map → overlay.service-CKBCIP2f.cjs.map} +1 -1
  199. package/dist/{overlay.service-Bpjrhaxh.js → overlay.service-XM1YHkTk.js} +2 -2
  200. package/dist/{overlay.service-Bpjrhaxh.js.map → overlay.service-XM1YHkTk.js.map} +1 -1
  201. package/dist/{progress-D8XZJVl5.cjs → progress-CcfLfHOE.cjs} +1 -1
  202. package/dist/{progress-D8XZJVl5.cjs.map → progress-CcfLfHOE.cjs.map} +1 -1
  203. package/dist/{progress-Zqx-S9NZ.js → progress-CnMPp-9a.js} +1 -1
  204. package/dist/{progress-Zqx-S9NZ.js.map → progress-CnMPp-9a.js.map} +1 -1
  205. package/dist/progress.cjs +1 -1
  206. package/dist/progress.js +1 -1
  207. package/dist/{radio-group-D9MU1Mxz.js → radio-group-BUJgfQFi.js} +1 -1
  208. package/dist/{radio-group-D9MU1Mxz.js.map → radio-group-BUJgfQFi.js.map} +1 -1
  209. package/dist/{radio-group-bl8K4Gls.cjs → radio-group-D97hflrE.cjs} +1 -1
  210. package/dist/{radio-group-bl8K4Gls.cjs.map → radio-group-D97hflrE.cjs.map} +1 -1
  211. package/dist/radio-group.cjs +1 -1
  212. package/dist/radio-group.js +1 -1
  213. package/dist/range.cjs +1 -1
  214. package/dist/range.js +1 -1
  215. package/dist/{select-CMwkl-D6.js → select-BWEh5nRM.js} +1 -1
  216. package/dist/{select-CMwkl-D6.js.map → select-BWEh5nRM.js.map} +1 -1
  217. package/dist/{select-COIfVtZl.cjs → select-Cv5Oev6d.cjs} +1 -1
  218. package/dist/{select-COIfVtZl.cjs.map → select-Cv5Oev6d.cjs.map} +1 -1
  219. package/dist/select.cjs +1 -1
  220. package/dist/select.js +1 -1
  221. package/dist/skeleton.cjs +1 -1
  222. package/dist/skeleton.js +1 -1
  223. package/dist/skills/overlay.md +4 -0
  224. package/dist/skills/schmancy/overlay.md +4 -0
  225. package/dist/slider.cjs +1 -1
  226. package/dist/slider.js +1 -1
  227. package/dist/{splash-screen-xrMNpzkm.js → splash-screen-B6w7X2z9.js} +1 -1
  228. package/dist/{splash-screen-xrMNpzkm.js.map → splash-screen-B6w7X2z9.js.map} +1 -1
  229. package/dist/{splash-screen-2hxq8Sft.cjs → splash-screen-DFtxtO2D.cjs} +1 -1
  230. package/dist/{splash-screen-2hxq8Sft.cjs.map → splash-screen-DFtxtO2D.cjs.map} +1 -1
  231. package/dist/splash-screen.cjs +1 -1
  232. package/dist/splash-screen.js +1 -1
  233. package/dist/{src-BoHs3kDi.cjs → src-Asw6A018.cjs} +3 -3
  234. package/dist/src-Asw6A018.cjs.map +1 -0
  235. package/dist/{src-DhbXaOrS.js → src-D_NK-vMA.js} +40 -40
  236. package/dist/src-D_NK-vMA.js.map +1 -0
  237. package/dist/steps.cjs +1 -1
  238. package/dist/steps.js +1 -1
  239. package/dist/{surface-BkQ44Wuo.cjs → surface-B94ka2LY.cjs} +1 -1
  240. package/dist/{surface-BkQ44Wuo.cjs.map → surface-B94ka2LY.cjs.map} +1 -1
  241. package/dist/{surface-3nnvlxeE.js → surface-ctBcRGSZ.js} +1 -1
  242. package/dist/{surface-3nnvlxeE.js.map → surface-ctBcRGSZ.js.map} +1 -1
  243. package/dist/surface.cjs +1 -1
  244. package/dist/surface.js +1 -1
  245. package/dist/switch.cjs +1 -1
  246. package/dist/switch.js +1 -1
  247. package/dist/table.cjs +2 -2
  248. package/dist/table.cjs.map +1 -1
  249. package/dist/table.js +2 -2
  250. package/dist/table.js.map +1 -1
  251. package/dist/{tabs-Dql0rcqZ.cjs → tabs-B7kaZIom.cjs} +1 -1
  252. package/dist/{tabs-Dql0rcqZ.cjs.map → tabs-B7kaZIom.cjs.map} +1 -1
  253. package/dist/{tabs-CnLIe8nE.js → tabs-CrMx5z_y.js} +1 -1
  254. package/dist/{tabs-CnLIe8nE.js.map → tabs-CrMx5z_y.js.map} +1 -1
  255. package/dist/tabs.cjs +1 -1
  256. package/dist/tabs.js +1 -1
  257. package/dist/teleport.cjs +1 -1
  258. package/dist/teleport.js +1 -1
  259. package/dist/{textarea-CGD6lAEe.cjs → textarea-D1crj8JD.cjs} +1 -1
  260. package/dist/{textarea-CGD6lAEe.cjs.map → textarea-D1crj8JD.cjs.map} +1 -1
  261. package/dist/{textarea-BAogS_Ff.js → textarea-DeHFl80i.js} +1 -1
  262. package/dist/{textarea-BAogS_Ff.js.map → textarea-DeHFl80i.js.map} +1 -1
  263. package/dist/textarea.cjs +1 -1
  264. package/dist/textarea.js +1 -1
  265. package/dist/{theme-CUK0HrS3.js → theme-C7Yo33nh.js} +2 -2
  266. package/dist/{theme-CUK0HrS3.js.map → theme-C7Yo33nh.js.map} +1 -1
  267. package/dist/{theme-button-CmTwFm3l.cjs → theme-button-CXSM5We4.cjs} +1 -1
  268. package/dist/{theme-button-CmTwFm3l.cjs.map → theme-button-CXSM5We4.cjs.map} +1 -1
  269. package/dist/{theme-button-Bb8qW2IH.js → theme-button-Cpc_hs2O.js} +1 -1
  270. package/dist/{theme-button-Bb8qW2IH.js.map → theme-button-Cpc_hs2O.js.map} +1 -1
  271. package/dist/theme-button.cjs +1 -1
  272. package/dist/theme-button.js +1 -1
  273. package/dist/{theme-DKrrQ-ic.cjs → theme-wE2N7Yu9.cjs} +2 -2
  274. package/dist/{theme-DKrrQ-ic.cjs.map → theme-wE2N7Yu9.cjs.map} +1 -1
  275. package/dist/theme.cjs +1 -1
  276. package/dist/theme.js +2 -2
  277. package/dist/tree.cjs +1 -1
  278. package/dist/tree.js +1 -1
  279. package/dist/typography.cjs +1 -1
  280. package/dist/typography.js +1 -1
  281. package/dist/visually-hidden.cjs +1 -1
  282. package/dist/visually-hidden.js +1 -1
  283. package/dist/{window-BbWlaPZv.cjs → window-Ck_zS4bb.cjs} +1 -1
  284. package/dist/{window-BbWlaPZv.cjs.map → window-Ck_zS4bb.cjs.map} +1 -1
  285. package/dist/{window-DuDAQa6y.js → window-JtkeHoxS.js} +1 -1
  286. package/dist/{window-DuDAQa6y.js.map → window-JtkeHoxS.js.map} +1 -1
  287. package/dist/window.cjs +1 -1
  288. package/dist/window.js +1 -1
  289. package/package.json +1 -1
  290. package/skills/schmancy/overlay.md +4 -0
  291. package/src/badge/badge.ts +7 -11
  292. package/src/button/icon-button.ts +3 -4
  293. package/src/icons/icon.ts +43 -293
  294. package/src/json/json.ts +1 -1
  295. package/src/table/table.ts +2 -2
  296. package/src/theme/theme-audio-player.ts +1 -1
  297. package/types/src/badge/badge.d.ts +1 -1
  298. package/types/src/icons/icon.d.ts +0 -81
  299. package/dist/button.cjs.map +0 -1
  300. package/dist/button.js.map +0 -1
  301. package/dist/context-6oXCZmZN.js +0 -3
  302. package/dist/context-6oXCZmZN.js.map +0 -1
  303. package/dist/context-CRZeiCqq.cjs +0 -1
  304. package/dist/context-CRZeiCqq.cjs.map +0 -1
  305. package/dist/icons-BgUbHwy8.js +0 -169
  306. package/dist/icons-BgUbHwy8.js.map +0 -1
  307. package/dist/icons-morK4hHz.cjs +0 -52
  308. package/dist/icons-morK4hHz.cjs.map +0 -1
  309. package/dist/src-BoHs3kDi.cjs.map +0 -1
  310. package/dist/src-DhbXaOrS.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"expand-DK-O37-j.cjs","names":[],"sources":["../src/expand/expand-root.component.ts","../src/expand/expand.component.ts"],"sourcesContent":["import { css, html, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { SchmancyElement, SurfaceMixin } from '@mixins/index'\nimport type { TSurfaceColor } from '@schmancy/types'\nimport { SPRING_SMOOTH } from '../utils/animation.js'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport '../surface/surface.js'\n\n@customElement('schmancy-expand-root')\nexport class SchmancyExpandRoot extends SurfaceMixin(SchmancyElement) {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: contents;\n\t}\n\n\t.portal-panel {\n\t\tposition: fixed;\n\t\ttransform-origin: top left;\n\t\twill-change: clip-path, opacity;\n\t\tborder-radius: 1rem;\n\t\tbox-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.5);\n\t\tz-index: 9999;\n\t}\n\n\t.minimize-btn {\n\t\tposition: absolute;\n\t\ttop: 0.5rem;\n\t\tright: 0.5rem;\n\t\tz-index: 1;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 2rem;\n\t\theight: 2rem;\n\t\tborder-radius: 9999px;\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcursor: pointer;\n\t\topacity: 0.5;\n\t\ttransition: opacity 150ms, background 150ms;\n\t\tcolor: inherit;\n\t}\n\n\t.minimize-btn:hover {\n\t\topacity: 1;\n\t\tbackground: rgb(0 0 0 / 0.08);\n\t}\n`];\n\t@property({ reflect: true }) override type: TSurfaceColor = 'solid'\n\t@state() isOpen = false\n\tprivate summaryRect: DOMRect | null = null\n\n\tprivate _panelRef = createRef<HTMLElement>()\n\tprivate _backdropRef = createRef<HTMLDivElement>()\n\tprivate _btnRef = createRef<HTMLButtonElement>()\n\tprivate _owner: (Element & { close?: () => void }) | null = null\n\tprivate _hideIndicator = false\n\tprivate _backdrop = true\n\n\t/** Called by schmancy-expand before nodes are moved */\n\tprepare(rect: DOMRect, owner: Element, hideIndicator = false, backdrop = true) {\n\t\tthis.summaryRect = rect\n\t\tthis._owner = owner as Element & { close?: () => void }\n\t\tthis._hideIndicator = hideIndicator\n\t\tthis._backdrop = backdrop\n\t}\n\n\t/** Called by schmancy-expand after nodes are moved in */\n\tasync triggerOpen() {\n\t\tthis.isOpen = true\n\t\tawait this.updateComplete\n\n\t\tconst panel = this._panelRef.value\n\t\tif (!panel) return\n\n\t\tconst src = this.summaryRect!\n\n\t\t// 1. Anchor at summary's top-left, measure natural content size\n\t\t// Use nearly full viewport height for measurement so content near the bottom\n\t\t// of the screen isn't artificially capped — the positioning step will move the panel up.\n\t\tObject.assign(panel.style, {\n\t\t\tvisibility: 'hidden',\n\t\t\ttop: `${src.top}px`,\n\t\t\tleft: `${src.left}px`,\n\t\t\tminWidth: `${src.width}px`,\n\t\t\twidth: 'max-content',\n\t\t\tmaxWidth: `${window.innerWidth - src.left}px`,\n\t\t\theight: 'auto',\n\t\t\tmaxHeight: `${window.innerHeight - 32}px`,\n\t\t\toverflowY: 'auto',\n\t\t})\n\n\t\tconst measured = panel.getBoundingClientRect()\n\t\tconst finalW = measured.width\n\t\tconst finalH = measured.height\n\n\t\t// 2. Adjust position so panel stays within viewport\n\t\tlet finalTop = src.top\n\t\tlet finalLeft = src.left\n\t\tif (finalTop + finalH > window.innerHeight) {\n\t\t\tfinalTop = Math.max(0, src.bottom - finalH)\n\t\t}\n\t\tif (finalLeft + finalW > window.innerWidth) {\n\t\t\tfinalLeft = Math.max(0, window.innerWidth - finalW)\n\t\t}\n\n\t\t// 3. Compute clip-path insets — summary rect expressed relative to panel final position\n\t\t// These insets shrink the visible area down to exactly the summary box\n\t\tconst insetTop = Math.max(0, src.top - finalTop)\n\t\tconst insetLeft = Math.max(0, src.left - finalLeft)\n\t\tconst insetRight = Math.max(0, finalLeft + finalW - (src.left + src.width))\n\t\tconst insetBottom = Math.max(0, finalTop + finalH - (src.top + src.height))\n\n\t\t// 4. Place panel at final size + position, masked to summary bounds (no flash)\n\t\tObject.assign(panel.style, {\n\t\t\tvisibility: '',\n\t\t\ttop: `${finalTop}px`,\n\t\t\tleft: `${finalLeft}px`,\n\t\t\tminWidth: `${src.width}px`,\n\t\t\twidth: `${finalW}px`,\n\t\t\theight: `${finalH}px`,\n\t\t\tmaxWidth: '',\n\t\t\tmaxHeight: '',\n\t\t\tclipPath: `inset(${insetTop}px ${insetRight}px ${insetBottom}px ${insetLeft}px round 0.5rem)`,\n\t\t})\n\n\t\t// 5. Animate the mask open — content revealed, not stretched\n\t\tthis._animateOpen(insetTop, insetRight, insetBottom, insetLeft, finalTop)\n\t}\n\n\t/** Animate close, return Promise resolving when done */\n\tasync triggerClose(targetRect: DOMRect): Promise<void> {\n\t\tawait this._animateClose(targetRect)\n\t\tthis.isOpen = false\n\t\tthis.summaryRect = null\n\t}\n\n\tprivate _animateOpen(insetTop: number, insetRight: number, insetBottom: number, insetLeft: number, finalTop: number) {\n\t\tconst panel = this._panelRef.value\n\t\tif (!panel) return\n\n\t\tif (reducedMotion$.value) {\n\t\t\tpanel.style.clipPath = ''\n\t\t\treturn\n\t\t}\n\n\t\tconst backdrop = this._backdropRef.value\n\t\tif (backdrop) {\n\t\t\tbackdrop.animate([{ opacity: 0 }, { opacity: 1 }], {\n\t\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\n\t\tconst keyframes: Keyframe[] = [\n\t\t\t{\n\t\t\t\tclipPath: `inset(${insetTop}px ${insetRight}px ${insetBottom}px ${insetLeft}px round 0.5rem)`,\n\t\t\t\topacity: 0.9,\n\t\t\t},\n\t\t\t{\n\t\t\t\tclipPath: 'inset(0px 0px 0px 0px round 1rem)',\n\t\t\t\topacity: 1,\n\t\t\t},\n\t\t]\n\n\t\tconst anim = panel.animate(keyframes, {\n\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\tfill: 'forwards',\n\t\t})\n\n\t\t// Clear clip-path and fixed dimensions after animation so content can grow naturally,\n\t\t// but cap at viewport height so overflow-y: auto can scroll\n\t\tanim.finished.then(() => {\n\t\t\tif (panel.isConnected) {\n\t\t\t\tpanel.style.clipPath = ''\n\t\t\t\tpanel.style.height = 'auto'\n\t\t\t\tpanel.style.maxHeight = `${window.innerHeight - finalTop - 16}px`\n\t\t\t}\n\t\t\treturn\n\t\t})\n\n\t\tconst btn = this._btnRef.value\n\t\tif (btn) {\n\t\t\tbtn.animate([{ transform: 'rotate(0deg)' }, { transform: 'rotate(180deg)' }], {\n\t\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate _animateClose(targetRect: DOMRect): Promise<void> {\n\t\tconst panel = this._panelRef.value\n\t\tif (!panel) return Promise.resolve()\n\t\tif (reducedMotion$.value) return Promise.resolve()\n\n\t\t// Compute insets to mask panel back down to the summary box\n\t\tconst panelRect = panel.getBoundingClientRect()\n\t\tconst insetTop = Math.max(0, targetRect.top - panelRect.top)\n\t\tconst insetLeft = Math.max(0, targetRect.left - panelRect.left)\n\t\tconst insetRight = Math.max(0, panelRect.right - targetRect.right)\n\t\tconst insetBottom = Math.max(0, panelRect.bottom - targetRect.bottom)\n\n\t\tconst closeDuration = Math.round(SPRING_SMOOTH.duration * 0.4)\n\t\tconst closeEasing = 'cubic-bezier(0.4, 0, 1, 1)'\n\n\t\tconst closeKeyframes: Keyframe[] = [\n\t\t\t{ clipPath: 'inset(0px 0px 0px 0px round 1rem)', opacity: 1 },\n\t\t\t{\n\t\t\t\tclipPath: `inset(${insetTop}px ${insetRight}px ${insetBottom}px ${insetLeft}px round 0.5rem)`,\n\t\t\t\topacity: 0.6,\n\t\t\t},\n\t\t]\n\n\t\tconst anim = panel.animate(closeKeyframes, { duration: closeDuration, easing: closeEasing, fill: 'forwards' })\n\n\t\tconst backdrop = this._backdropRef.value\n\t\tif (backdrop) {\n\t\t\tbackdrop.animate([{ opacity: 1 }, { opacity: 0 }], {\n\t\t\t\tduration: closeDuration,\n\t\t\t\teasing: closeEasing,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\n\t\tconst btn = this._btnRef.value\n\t\tif (btn) {\n\t\t\tbtn.animate([{ transform: 'rotate(180deg)' }, { transform: 'rotate(0deg)' }], {\n\t\t\t\tduration: closeDuration,\n\t\t\t\teasing: closeEasing,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\n\t\treturn anim.finished as unknown as Promise<void>\n\t}\n\n\trender() {\n\t\tif (!this.isOpen) return nothing\n\n\t\treturn html`\n\t\t\t${this._backdrop ? html`\n\t\t\t\t<div\n\t\t\t\t\t${ref(this._backdropRef)}\n\t\t\t\t\tclass=\"fixed inset-0 z-9998 backdrop-blur-sm backdrop-saturate-150 backdrop-brightness-105 bg-black/[0.07] will-change-[opacity]\"\n\t\t\t\t\t@click=${() => this._owner?.close?.()}\n\t\t\t\t></div>\n\t\t\t` : nothing}\n\t\t\t<schmancy-surface\n\t\t\t\t${ref(this._panelRef)}\n\t\t\t\tclass=\"portal-panel\"\n\t\t\t\ttype=${this.type}\n\t\t\t\tstyle=\"overflow-y: auto;\"\n\t\t\t>\n\t\t\t\t${!this._hideIndicator ? html`\n\t\t\t\t\t<button\n\t\t\t\t\t\t${ref(this._btnRef)}\n\t\t\t\t\t\tclass=\"minimize-btn\"\n\t\t\t\t\t\taria-label=\"Minimize\"\n\t\t\t\t\t\t@click=${() => this._owner?.close?.()}\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t<path d=\"M19 9L12 16L5 9\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t` : nothing}\n\t\t\t\t<slot></slot>\n\t\t\t</schmancy-surface>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-expand-root': SchmancyExpandRoot\n\t}\n}\n","import { css, html, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport { filter, fromEvent, lastValueFrom } from 'rxjs'\nimport { tap, takeUntil } from 'rxjs/operators'\nimport { SchmancyElement } from '@mixins/index'\nimport { SPRING_SNAPPY } from '../utils/animation.js'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport { SchmancyExpandRoot } from './expand-root.component.js'\n\n/** Dispatch this event on window to close whichever schmancy-expand is currently open */\nexport const SCHMANCY_EXPAND_REQUEST_CLOSE = 'schmancy-expand-request-close'\n\n@customElement('schmancy-expand')\nexport default class SchmancyExpand extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\tsummary::-webkit-details-marker {\n\t\tdisplay: none;\n\t}\n\n\tsummary {\n\t\tlist-style: none;\n\t\tcolor: inherit;\n\t}\n\n\t.inline-grid {\n\t\tdisplay: grid;\n\t\tgrid-template-rows: 0fr;\n\t\toverflow: hidden;\n\t\ttransition: grid-template-rows 300ms cubic-bezier(0.22, 1.25, 0.36, 1),\n\t\t opacity 300ms cubic-bezier(0.22, 1.25, 0.36, 1);\n\t\topacity: 0;\n\t}\n\n\t.inline-grid[data-open] {\n\t\tgrid-template-rows: 1fr;\n\t\topacity: 1;\n\t}\n\n\t.inline-grid > .inner {\n\t\tmin-height: 0;\n\t\toverflow: hidden;\n\t}\n`];\n\t@property() summary = ''\n\n\t@property({ type: Boolean, reflect: true }) open = false\n\n\t@property({ attribute: 'summary-padding' }) summaryPadding = ''\n\n\t@property({ attribute: 'content-padding' }) contentPadding = ''\n\n\t@property({ type: Boolean, attribute: 'hide-indicator' }) hideIndicator = false\n\n\t@property({ type: Number, attribute: 'indicator-rotate' }) indicatorRotate = 90\n\n\t@property({ type: Boolean }) backdrop = true\n\n\t@property({ type: Boolean }) inline = false\n\n\tprivate _summaryRef = createRef<HTMLElement>()\n\tprivate _contentSlotRef = createRef<HTMLSlotElement>()\n\tprivate _root: SchmancyExpandRoot | null = null\n\tprivate _movedNodes: Element[] = []\n\tprivate _currentIndicatorAnim: Animation | undefined\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Close on Escape key\n\t\tfromEvent<KeyboardEvent>(window, 'keydown')\n\t\t\t.pipe(\n\t\t\t\tfilter(e => e.key === 'Escape'),\n\t\t\t\tfilter(() => this.open),\n\t\t\t\ttap(() => void this._handleClose()),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\n\t\t// Close on click outside the portal panel\n\t\tfromEvent<PointerEvent>(document, 'pointerdown')\n\t\t\t.pipe(\n\t\t\t\tfilter(() => this.open),\n\t\t\t\tfilter(e => !!this._root && !e.composedPath().includes(this._root)),\n\t\t\t\ttap(() => void this._handleClose()),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tif (this._movedNodes.length > 0) {\n\t\t\tthis._movedNodes.forEach(n => this.appendChild(n))\n\t\t\tthis._movedNodes = []\n\t\t}\n\t\tif (this._root && this._root.children.length === 0) {\n\t\t\tthis._root.remove()\n\t\t\tthis._root = null\n\t\t}\n\t}\n\n\tprivate async _getOrCreateRoot(): Promise<SchmancyExpandRoot> {\n\t\tconst theme = await lastValueFrom(this.discover<HTMLElement>('schmancy-theme'))\n\t\tconst container: HTMLElement = theme ?? document.querySelector('schmancy-theme') ?? document.body\n\t\tlet root = container.querySelector('schmancy-expand-root') as SchmancyExpandRoot | null\n\t\tif (!root) {\n\t\t\troot = new SchmancyExpandRoot()\n\t\t\tcontainer.appendChild(root)\n\t\t}\n\t\treturn root\n\t}\n\n\t/** Close the expand portal, animating back to the summary position. */\n\tpublic close(): void {\n\t\tvoid this._handleClose()\n\t}\n\n\t/** Programmatically open the expand portal. */\n\tpublic expand(): void {\n\t\tif (this.open) return\n\t\tvoid this._expand()\n\t}\n\n\tprotected override updated(changed: Map<PropertyKey, unknown>) {\n\t\tsuper.updated(changed)\n\t\tif (changed.has('open') && this.open && !this.inline && !this._root) {\n\t\t\tvoid this._expand()\n\t\t}\n\t}\n\n\tprivate _toggle() {\n\t\tif (this.inline) {\n\t\t\tthis.open = !this.open\n\t\t\tthis._animateIndicator(this.open)\n\t\t} else if (!this.open) {\n\t\t\tvoid this._expand()\n\t\t}\n\t}\n\n\tprivate _handleSummaryClick(e: MouseEvent) {\n\t\te.preventDefault()\n\t\tthis._toggle()\n\t}\n\n\tprivate async _expand() {\n\t\tif (this.inline) {\n\t\t\tthis.open = true\n\t\t\tthis._animateIndicator(true)\n\t\t\treturn\n\t\t}\n\n\t\tconst root = await this._getOrCreateRoot()\n\t\tthis._root = root\n\t\tconst summary = this._summaryRef.value\n\t\tconst contentSlot = this._contentSlotRef.value\n\t\tif (!summary || !contentSlot) return\n\n\t\tconst summaryRect = summary.getBoundingClientRect()\n\t\tconst nodes = contentSlot.assignedElements({ flatten: true })\n\t\tif (nodes.length === 0) return\n\n\t\troot.prepare(summaryRect, this, this.hideIndicator, this.backdrop)\n\n\t\tthis._movedNodes = [...nodes]\n\t\tthis._movedNodes.forEach(n => root.appendChild(n))\n\n\t\troot.triggerOpen()\n\n\t\tthis._animateIndicator(true)\n\t\tthis.open = true\n\t}\n\n\tasync _handleClose() {\n\t\tif (this.inline) {\n\t\t\tthis._animateIndicator(false)\n\t\t\tthis.open = false\n\t\t\treturn\n\t\t}\n\n\t\tconst root = this._root\n\t\tconst summary = this._summaryRef.value\n\t\tif (!root || !summary) return\n\n\t\tconst summaryRect = summary.getBoundingClientRect()\n\t\tthis._animateIndicator(false)\n\n\t\tawait root.triggerClose(summaryRect)\n\n\t\tthis._movedNodes.forEach(n => this.appendChild(n))\n\t\tthis._movedNodes = []\n\t\tthis.open = false\n\t}\n\n\tprivate _animateIndicator(isOpen: boolean) {\n\t\tif (reducedMotion$.value) return\n\n\t\tconst indicator = this.shadowRoot?.querySelector('.indicator') as HTMLElement | null\n\t\tif (!indicator) return\n\n\t\tthis._currentIndicatorAnim?.cancel()\n\t\tthis._currentIndicatorAnim = indicator.animate(\n\t\t\t[\n\t\t\t\t{ transform: `rotate(${isOpen ? '0deg' : `${this.indicatorRotate}deg`})` },\n\t\t\t\t{ transform: `rotate(${isOpen ? `${this.indicatorRotate}deg` : '0deg'})` },\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration: SPRING_SNAPPY.duration,\n\t\t\t\teasing: SPRING_SNAPPY.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t)\n\t}\n\n\trender() {\n\t\tconst summaryClasses = this.classMap({\n\t\t\t[this.summaryPadding]: true,\n\t\t\t'select-none relative flex items-center gap-2 rounded-xl transition-all duration-150': true,\n\t\t\t'hover:brightness-[0.92] active:brightness-[0.85] cursor-pointer group': true,\n\t\t\t'flex-row-reverse': true,\n\t\t})\n\n\t\treturn html`\n\t\t\t<div class=\"w-full rounded-xl\">\n\t\t\t\t<div\n\t\t\t\t\t${ref(this._summaryRef)}\n\t\t\t\t\tclass=${summaryClasses}\n\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\trole=\"button\"\n\t\t\t\t\t@click=${this._handleSummaryClick}\n\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\tthis._toggle()\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t${!this.hideIndicator\n\t\t\t\t\t\t? html`\n\t\t\t\t\t\t\t\t<span class=\"indicator flex items-center justify-center w-5 h-5 rounded-full shrink-0 opacity-70 group-hover:opacity-100 will-change-transform\">\n\t\t\t\t\t\t\t\t\t<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\td=\"M9 6L15 12L9 18\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t: nothing}\n\n\t\t\t\t\t<span class=\"flex-1 font-medium text-base min-w-0\">\n\t\t\t\t\t\t<slot name=\"summary\">${this.summary}</slot>\n\t\t\t\t\t</span>\n\n\t\t\t\t\t<slot name=\"actions\"></slot>\n\t\t\t\t</div>\n\n\t\t\t\t${this.inline\n\t\t\t\t\t? html`\n\t\t\t\t\t\t<div class=\"inline-grid\" ?data-open=${this.open}>\n\t\t\t\t\t\t\t<div class=\"inner\">\n\t\t\t\t\t\t\t\t<slot ${ref(this._contentSlotRef)}></slot>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t\t: html`\n\t\t\t\t\t\t<div style=${styleMap(this.open ? {} : { display: 'none' })}>\n\t\t\t\t\t\t\t<slot ${ref(this._contentSlotRef)}></slot>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-expand': SchmancyExpand\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"expand-CQDm3BF3.cjs","names":[],"sources":["../src/expand/expand-root.component.ts","../src/expand/expand.component.ts"],"sourcesContent":["import { css, html, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { SchmancyElement, SurfaceMixin } from '@mixins/index'\nimport type { TSurfaceColor } from '@schmancy/types'\nimport { SPRING_SMOOTH } from '../utils/animation.js'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport '../surface/surface.js'\n\n@customElement('schmancy-expand-root')\nexport class SchmancyExpandRoot extends SurfaceMixin(SchmancyElement) {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: contents;\n\t}\n\n\t.portal-panel {\n\t\tposition: fixed;\n\t\ttransform-origin: top left;\n\t\twill-change: clip-path, opacity;\n\t\tborder-radius: 1rem;\n\t\tbox-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.5);\n\t\tz-index: 9999;\n\t}\n\n\t.minimize-btn {\n\t\tposition: absolute;\n\t\ttop: 0.5rem;\n\t\tright: 0.5rem;\n\t\tz-index: 1;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 2rem;\n\t\theight: 2rem;\n\t\tborder-radius: 9999px;\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcursor: pointer;\n\t\topacity: 0.5;\n\t\ttransition: opacity 150ms, background 150ms;\n\t\tcolor: inherit;\n\t}\n\n\t.minimize-btn:hover {\n\t\topacity: 1;\n\t\tbackground: rgb(0 0 0 / 0.08);\n\t}\n`];\n\t@property({ reflect: true }) override type: TSurfaceColor = 'solid'\n\t@state() isOpen = false\n\tprivate summaryRect: DOMRect | null = null\n\n\tprivate _panelRef = createRef<HTMLElement>()\n\tprivate _backdropRef = createRef<HTMLDivElement>()\n\tprivate _btnRef = createRef<HTMLButtonElement>()\n\tprivate _owner: (Element & { close?: () => void }) | null = null\n\tprivate _hideIndicator = false\n\tprivate _backdrop = true\n\n\t/** Called by schmancy-expand before nodes are moved */\n\tprepare(rect: DOMRect, owner: Element, hideIndicator = false, backdrop = true) {\n\t\tthis.summaryRect = rect\n\t\tthis._owner = owner as Element & { close?: () => void }\n\t\tthis._hideIndicator = hideIndicator\n\t\tthis._backdrop = backdrop\n\t}\n\n\t/** Called by schmancy-expand after nodes are moved in */\n\tasync triggerOpen() {\n\t\tthis.isOpen = true\n\t\tawait this.updateComplete\n\n\t\tconst panel = this._panelRef.value\n\t\tif (!panel) return\n\n\t\tconst src = this.summaryRect!\n\n\t\t// 1. Anchor at summary's top-left, measure natural content size\n\t\t// Use nearly full viewport height for measurement so content near the bottom\n\t\t// of the screen isn't artificially capped — the positioning step will move the panel up.\n\t\tObject.assign(panel.style, {\n\t\t\tvisibility: 'hidden',\n\t\t\ttop: `${src.top}px`,\n\t\t\tleft: `${src.left}px`,\n\t\t\tminWidth: `${src.width}px`,\n\t\t\twidth: 'max-content',\n\t\t\tmaxWidth: `${window.innerWidth - src.left}px`,\n\t\t\theight: 'auto',\n\t\t\tmaxHeight: `${window.innerHeight - 32}px`,\n\t\t\toverflowY: 'auto',\n\t\t})\n\n\t\tconst measured = panel.getBoundingClientRect()\n\t\tconst finalW = measured.width\n\t\tconst finalH = measured.height\n\n\t\t// 2. Adjust position so panel stays within viewport\n\t\tlet finalTop = src.top\n\t\tlet finalLeft = src.left\n\t\tif (finalTop + finalH > window.innerHeight) {\n\t\t\tfinalTop = Math.max(0, src.bottom - finalH)\n\t\t}\n\t\tif (finalLeft + finalW > window.innerWidth) {\n\t\t\tfinalLeft = Math.max(0, window.innerWidth - finalW)\n\t\t}\n\n\t\t// 3. Compute clip-path insets — summary rect expressed relative to panel final position\n\t\t// These insets shrink the visible area down to exactly the summary box\n\t\tconst insetTop = Math.max(0, src.top - finalTop)\n\t\tconst insetLeft = Math.max(0, src.left - finalLeft)\n\t\tconst insetRight = Math.max(0, finalLeft + finalW - (src.left + src.width))\n\t\tconst insetBottom = Math.max(0, finalTop + finalH - (src.top + src.height))\n\n\t\t// 4. Place panel at final size + position, masked to summary bounds (no flash)\n\t\tObject.assign(panel.style, {\n\t\t\tvisibility: '',\n\t\t\ttop: `${finalTop}px`,\n\t\t\tleft: `${finalLeft}px`,\n\t\t\tminWidth: `${src.width}px`,\n\t\t\twidth: `${finalW}px`,\n\t\t\theight: `${finalH}px`,\n\t\t\tmaxWidth: '',\n\t\t\tmaxHeight: '',\n\t\t\tclipPath: `inset(${insetTop}px ${insetRight}px ${insetBottom}px ${insetLeft}px round 0.5rem)`,\n\t\t})\n\n\t\t// 5. Animate the mask open — content revealed, not stretched\n\t\tthis._animateOpen(insetTop, insetRight, insetBottom, insetLeft, finalTop)\n\t}\n\n\t/** Animate close, return Promise resolving when done */\n\tasync triggerClose(targetRect: DOMRect): Promise<void> {\n\t\tawait this._animateClose(targetRect)\n\t\tthis.isOpen = false\n\t\tthis.summaryRect = null\n\t}\n\n\tprivate _animateOpen(insetTop: number, insetRight: number, insetBottom: number, insetLeft: number, finalTop: number) {\n\t\tconst panel = this._panelRef.value\n\t\tif (!panel) return\n\n\t\tif (reducedMotion$.value) {\n\t\t\tpanel.style.clipPath = ''\n\t\t\treturn\n\t\t}\n\n\t\tconst backdrop = this._backdropRef.value\n\t\tif (backdrop) {\n\t\t\tbackdrop.animate([{ opacity: 0 }, { opacity: 1 }], {\n\t\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\n\t\tconst keyframes: Keyframe[] = [\n\t\t\t{\n\t\t\t\tclipPath: `inset(${insetTop}px ${insetRight}px ${insetBottom}px ${insetLeft}px round 0.5rem)`,\n\t\t\t\topacity: 0.9,\n\t\t\t},\n\t\t\t{\n\t\t\t\tclipPath: 'inset(0px 0px 0px 0px round 1rem)',\n\t\t\t\topacity: 1,\n\t\t\t},\n\t\t]\n\n\t\tconst anim = panel.animate(keyframes, {\n\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\tfill: 'forwards',\n\t\t})\n\n\t\t// Clear clip-path and fixed dimensions after animation so content can grow naturally,\n\t\t// but cap at viewport height so overflow-y: auto can scroll\n\t\tanim.finished.then(() => {\n\t\t\tif (panel.isConnected) {\n\t\t\t\tpanel.style.clipPath = ''\n\t\t\t\tpanel.style.height = 'auto'\n\t\t\t\tpanel.style.maxHeight = `${window.innerHeight - finalTop - 16}px`\n\t\t\t}\n\t\t\treturn\n\t\t})\n\n\t\tconst btn = this._btnRef.value\n\t\tif (btn) {\n\t\t\tbtn.animate([{ transform: 'rotate(0deg)' }, { transform: 'rotate(180deg)' }], {\n\t\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate _animateClose(targetRect: DOMRect): Promise<void> {\n\t\tconst panel = this._panelRef.value\n\t\tif (!panel) return Promise.resolve()\n\t\tif (reducedMotion$.value) return Promise.resolve()\n\n\t\t// Compute insets to mask panel back down to the summary box\n\t\tconst panelRect = panel.getBoundingClientRect()\n\t\tconst insetTop = Math.max(0, targetRect.top - panelRect.top)\n\t\tconst insetLeft = Math.max(0, targetRect.left - panelRect.left)\n\t\tconst insetRight = Math.max(0, panelRect.right - targetRect.right)\n\t\tconst insetBottom = Math.max(0, panelRect.bottom - targetRect.bottom)\n\n\t\tconst closeDuration = Math.round(SPRING_SMOOTH.duration * 0.4)\n\t\tconst closeEasing = 'cubic-bezier(0.4, 0, 1, 1)'\n\n\t\tconst closeKeyframes: Keyframe[] = [\n\t\t\t{ clipPath: 'inset(0px 0px 0px 0px round 1rem)', opacity: 1 },\n\t\t\t{\n\t\t\t\tclipPath: `inset(${insetTop}px ${insetRight}px ${insetBottom}px ${insetLeft}px round 0.5rem)`,\n\t\t\t\topacity: 0.6,\n\t\t\t},\n\t\t]\n\n\t\tconst anim = panel.animate(closeKeyframes, { duration: closeDuration, easing: closeEasing, fill: 'forwards' })\n\n\t\tconst backdrop = this._backdropRef.value\n\t\tif (backdrop) {\n\t\t\tbackdrop.animate([{ opacity: 1 }, { opacity: 0 }], {\n\t\t\t\tduration: closeDuration,\n\t\t\t\teasing: closeEasing,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\n\t\tconst btn = this._btnRef.value\n\t\tif (btn) {\n\t\t\tbtn.animate([{ transform: 'rotate(180deg)' }, { transform: 'rotate(0deg)' }], {\n\t\t\t\tduration: closeDuration,\n\t\t\t\teasing: closeEasing,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\n\t\treturn anim.finished as unknown as Promise<void>\n\t}\n\n\trender() {\n\t\tif (!this.isOpen) return nothing\n\n\t\treturn html`\n\t\t\t${this._backdrop ? html`\n\t\t\t\t<div\n\t\t\t\t\t${ref(this._backdropRef)}\n\t\t\t\t\tclass=\"fixed inset-0 z-9998 backdrop-blur-sm backdrop-saturate-150 backdrop-brightness-105 bg-black/[0.07] will-change-[opacity]\"\n\t\t\t\t\t@click=${() => this._owner?.close?.()}\n\t\t\t\t></div>\n\t\t\t` : nothing}\n\t\t\t<schmancy-surface\n\t\t\t\t${ref(this._panelRef)}\n\t\t\t\tclass=\"portal-panel\"\n\t\t\t\ttype=${this.type}\n\t\t\t\tstyle=\"overflow-y: auto;\"\n\t\t\t>\n\t\t\t\t${!this._hideIndicator ? html`\n\t\t\t\t\t<button\n\t\t\t\t\t\t${ref(this._btnRef)}\n\t\t\t\t\t\tclass=\"minimize-btn\"\n\t\t\t\t\t\taria-label=\"Minimize\"\n\t\t\t\t\t\t@click=${() => this._owner?.close?.()}\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t<path d=\"M19 9L12 16L5 9\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t` : nothing}\n\t\t\t\t<slot></slot>\n\t\t\t</schmancy-surface>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-expand-root': SchmancyExpandRoot\n\t}\n}\n","import { css, html, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport { filter, fromEvent, lastValueFrom } from 'rxjs'\nimport { tap, takeUntil } from 'rxjs/operators'\nimport { SchmancyElement } from '@mixins/index'\nimport { SPRING_SNAPPY } from '../utils/animation.js'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport { SchmancyExpandRoot } from './expand-root.component.js'\n\n/** Dispatch this event on window to close whichever schmancy-expand is currently open */\nexport const SCHMANCY_EXPAND_REQUEST_CLOSE = 'schmancy-expand-request-close'\n\n@customElement('schmancy-expand')\nexport default class SchmancyExpand extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\tsummary::-webkit-details-marker {\n\t\tdisplay: none;\n\t}\n\n\tsummary {\n\t\tlist-style: none;\n\t\tcolor: inherit;\n\t}\n\n\t.inline-grid {\n\t\tdisplay: grid;\n\t\tgrid-template-rows: 0fr;\n\t\toverflow: hidden;\n\t\ttransition: grid-template-rows 300ms cubic-bezier(0.22, 1.25, 0.36, 1),\n\t\t opacity 300ms cubic-bezier(0.22, 1.25, 0.36, 1);\n\t\topacity: 0;\n\t}\n\n\t.inline-grid[data-open] {\n\t\tgrid-template-rows: 1fr;\n\t\topacity: 1;\n\t}\n\n\t.inline-grid > .inner {\n\t\tmin-height: 0;\n\t\toverflow: hidden;\n\t}\n`];\n\t@property() summary = ''\n\n\t@property({ type: Boolean, reflect: true }) open = false\n\n\t@property({ attribute: 'summary-padding' }) summaryPadding = ''\n\n\t@property({ attribute: 'content-padding' }) contentPadding = ''\n\n\t@property({ type: Boolean, attribute: 'hide-indicator' }) hideIndicator = false\n\n\t@property({ type: Number, attribute: 'indicator-rotate' }) indicatorRotate = 90\n\n\t@property({ type: Boolean }) backdrop = true\n\n\t@property({ type: Boolean }) inline = false\n\n\tprivate _summaryRef = createRef<HTMLElement>()\n\tprivate _contentSlotRef = createRef<HTMLSlotElement>()\n\tprivate _root: SchmancyExpandRoot | null = null\n\tprivate _movedNodes: Element[] = []\n\tprivate _currentIndicatorAnim: Animation | undefined\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Close on Escape key\n\t\tfromEvent<KeyboardEvent>(window, 'keydown')\n\t\t\t.pipe(\n\t\t\t\tfilter(e => e.key === 'Escape'),\n\t\t\t\tfilter(() => this.open),\n\t\t\t\ttap(() => void this._handleClose()),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\n\t\t// Close on click outside the portal panel\n\t\tfromEvent<PointerEvent>(document, 'pointerdown')\n\t\t\t.pipe(\n\t\t\t\tfilter(() => this.open),\n\t\t\t\tfilter(e => !!this._root && !e.composedPath().includes(this._root)),\n\t\t\t\ttap(() => void this._handleClose()),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tif (this._movedNodes.length > 0) {\n\t\t\tthis._movedNodes.forEach(n => this.appendChild(n))\n\t\t\tthis._movedNodes = []\n\t\t}\n\t\tif (this._root && this._root.children.length === 0) {\n\t\t\tthis._root.remove()\n\t\t\tthis._root = null\n\t\t}\n\t}\n\n\tprivate async _getOrCreateRoot(): Promise<SchmancyExpandRoot> {\n\t\tconst theme = await lastValueFrom(this.discover<HTMLElement>('schmancy-theme'))\n\t\tconst container: HTMLElement = theme ?? document.querySelector('schmancy-theme') ?? document.body\n\t\tlet root = container.querySelector('schmancy-expand-root') as SchmancyExpandRoot | null\n\t\tif (!root) {\n\t\t\troot = new SchmancyExpandRoot()\n\t\t\tcontainer.appendChild(root)\n\t\t}\n\t\treturn root\n\t}\n\n\t/** Close the expand portal, animating back to the summary position. */\n\tpublic close(): void {\n\t\tvoid this._handleClose()\n\t}\n\n\t/** Programmatically open the expand portal. */\n\tpublic expand(): void {\n\t\tif (this.open) return\n\t\tvoid this._expand()\n\t}\n\n\tprotected override updated(changed: Map<PropertyKey, unknown>) {\n\t\tsuper.updated(changed)\n\t\tif (changed.has('open') && this.open && !this.inline && !this._root) {\n\t\t\tvoid this._expand()\n\t\t}\n\t}\n\n\tprivate _toggle() {\n\t\tif (this.inline) {\n\t\t\tthis.open = !this.open\n\t\t\tthis._animateIndicator(this.open)\n\t\t} else if (!this.open) {\n\t\t\tvoid this._expand()\n\t\t}\n\t}\n\n\tprivate _handleSummaryClick(e: MouseEvent) {\n\t\te.preventDefault()\n\t\tthis._toggle()\n\t}\n\n\tprivate async _expand() {\n\t\tif (this.inline) {\n\t\t\tthis.open = true\n\t\t\tthis._animateIndicator(true)\n\t\t\treturn\n\t\t}\n\n\t\tconst root = await this._getOrCreateRoot()\n\t\tthis._root = root\n\t\tconst summary = this._summaryRef.value\n\t\tconst contentSlot = this._contentSlotRef.value\n\t\tif (!summary || !contentSlot) return\n\n\t\tconst summaryRect = summary.getBoundingClientRect()\n\t\tconst nodes = contentSlot.assignedElements({ flatten: true })\n\t\tif (nodes.length === 0) return\n\n\t\troot.prepare(summaryRect, this, this.hideIndicator, this.backdrop)\n\n\t\tthis._movedNodes = [...nodes]\n\t\tthis._movedNodes.forEach(n => root.appendChild(n))\n\n\t\troot.triggerOpen()\n\n\t\tthis._animateIndicator(true)\n\t\tthis.open = true\n\t}\n\n\tasync _handleClose() {\n\t\tif (this.inline) {\n\t\t\tthis._animateIndicator(false)\n\t\t\tthis.open = false\n\t\t\treturn\n\t\t}\n\n\t\tconst root = this._root\n\t\tconst summary = this._summaryRef.value\n\t\tif (!root || !summary) return\n\n\t\tconst summaryRect = summary.getBoundingClientRect()\n\t\tthis._animateIndicator(false)\n\n\t\tawait root.triggerClose(summaryRect)\n\n\t\tthis._movedNodes.forEach(n => this.appendChild(n))\n\t\tthis._movedNodes = []\n\t\tthis.open = false\n\t}\n\n\tprivate _animateIndicator(isOpen: boolean) {\n\t\tif (reducedMotion$.value) return\n\n\t\tconst indicator = this.shadowRoot?.querySelector('.indicator') as HTMLElement | null\n\t\tif (!indicator) return\n\n\t\tthis._currentIndicatorAnim?.cancel()\n\t\tthis._currentIndicatorAnim = indicator.animate(\n\t\t\t[\n\t\t\t\t{ transform: `rotate(${isOpen ? '0deg' : `${this.indicatorRotate}deg`})` },\n\t\t\t\t{ transform: `rotate(${isOpen ? `${this.indicatorRotate}deg` : '0deg'})` },\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration: SPRING_SNAPPY.duration,\n\t\t\t\teasing: SPRING_SNAPPY.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t)\n\t}\n\n\trender() {\n\t\tconst summaryClasses = this.classMap({\n\t\t\t[this.summaryPadding]: true,\n\t\t\t'select-none relative flex items-center gap-2 rounded-xl transition-all duration-150': true,\n\t\t\t'hover:brightness-[0.92] active:brightness-[0.85] cursor-pointer group': true,\n\t\t\t'flex-row-reverse': true,\n\t\t})\n\n\t\treturn html`\n\t\t\t<div class=\"w-full rounded-xl\">\n\t\t\t\t<div\n\t\t\t\t\t${ref(this._summaryRef)}\n\t\t\t\t\tclass=${summaryClasses}\n\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\trole=\"button\"\n\t\t\t\t\t@click=${this._handleSummaryClick}\n\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\tthis._toggle()\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t${!this.hideIndicator\n\t\t\t\t\t\t? html`\n\t\t\t\t\t\t\t\t<span class=\"indicator flex items-center justify-center w-5 h-5 rounded-full shrink-0 opacity-70 group-hover:opacity-100 will-change-transform\">\n\t\t\t\t\t\t\t\t\t<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\td=\"M9 6L15 12L9 18\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t: nothing}\n\n\t\t\t\t\t<span class=\"flex-1 font-medium text-base min-w-0\">\n\t\t\t\t\t\t<slot name=\"summary\">${this.summary}</slot>\n\t\t\t\t\t</span>\n\n\t\t\t\t\t<slot name=\"actions\"></slot>\n\t\t\t\t</div>\n\n\t\t\t\t${this.inline\n\t\t\t\t\t? html`\n\t\t\t\t\t\t<div class=\"inline-grid\" ?data-open=${this.open}>\n\t\t\t\t\t\t\t<div class=\"inner\">\n\t\t\t\t\t\t\t\t<slot ${ref(this._contentSlotRef)}></slot>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t\t: html`\n\t\t\t\t\t\t<div style=${styleMap(this.open ? {} : { display: 'none' })}>\n\t\t\t\t\t\t\t<slot ${ref(this._contentSlotRef)}></slot>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-expand': SchmancyExpand\n\t}\n}\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { c as e, t } from "./mixins-pU53qf6R.js";
1
+ import { c as e, t } from "./mixins-C42OILRS.js";
2
2
  import { a as n } from "./active-host-BP0zy_Y9.js";
3
3
  import { d as r, f as i } from "./animation-DCznELuT.js";
4
4
  import { t as a } from "./reduced-motion-D7LqTUMn.js";
5
- import "./surface-3nnvlxeE.js";
5
+ import "./surface-ctBcRGSZ.js";
6
6
  import { filter as o, fromEvent as s, lastValueFrom as c } from "rxjs";
7
7
  import { takeUntil as l, tap as u } from "rxjs/operators";
8
8
  import { styleMap as d } from "lit/directives/style-map.js";
@@ -1 +1 @@
1
- {"version":3,"file":"expand-BJiKggfg.js","names":[],"sources":["../src/expand/expand-root.component.ts","../src/expand/expand.component.ts"],"sourcesContent":["import { css, html, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { SchmancyElement, SurfaceMixin } from '@mixins/index'\nimport type { TSurfaceColor } from '@schmancy/types'\nimport { SPRING_SMOOTH } from '../utils/animation.js'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport '../surface/surface.js'\n\n@customElement('schmancy-expand-root')\nexport class SchmancyExpandRoot extends SurfaceMixin(SchmancyElement) {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: contents;\n\t}\n\n\t.portal-panel {\n\t\tposition: fixed;\n\t\ttransform-origin: top left;\n\t\twill-change: clip-path, opacity;\n\t\tborder-radius: 1rem;\n\t\tbox-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.5);\n\t\tz-index: 9999;\n\t}\n\n\t.minimize-btn {\n\t\tposition: absolute;\n\t\ttop: 0.5rem;\n\t\tright: 0.5rem;\n\t\tz-index: 1;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 2rem;\n\t\theight: 2rem;\n\t\tborder-radius: 9999px;\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcursor: pointer;\n\t\topacity: 0.5;\n\t\ttransition: opacity 150ms, background 150ms;\n\t\tcolor: inherit;\n\t}\n\n\t.minimize-btn:hover {\n\t\topacity: 1;\n\t\tbackground: rgb(0 0 0 / 0.08);\n\t}\n`];\n\t@property({ reflect: true }) override type: TSurfaceColor = 'solid'\n\t@state() isOpen = false\n\tprivate summaryRect: DOMRect | null = null\n\n\tprivate _panelRef = createRef<HTMLElement>()\n\tprivate _backdropRef = createRef<HTMLDivElement>()\n\tprivate _btnRef = createRef<HTMLButtonElement>()\n\tprivate _owner: (Element & { close?: () => void }) | null = null\n\tprivate _hideIndicator = false\n\tprivate _backdrop = true\n\n\t/** Called by schmancy-expand before nodes are moved */\n\tprepare(rect: DOMRect, owner: Element, hideIndicator = false, backdrop = true) {\n\t\tthis.summaryRect = rect\n\t\tthis._owner = owner as Element & { close?: () => void }\n\t\tthis._hideIndicator = hideIndicator\n\t\tthis._backdrop = backdrop\n\t}\n\n\t/** Called by schmancy-expand after nodes are moved in */\n\tasync triggerOpen() {\n\t\tthis.isOpen = true\n\t\tawait this.updateComplete\n\n\t\tconst panel = this._panelRef.value\n\t\tif (!panel) return\n\n\t\tconst src = this.summaryRect!\n\n\t\t// 1. Anchor at summary's top-left, measure natural content size\n\t\t// Use nearly full viewport height for measurement so content near the bottom\n\t\t// of the screen isn't artificially capped — the positioning step will move the panel up.\n\t\tObject.assign(panel.style, {\n\t\t\tvisibility: 'hidden',\n\t\t\ttop: `${src.top}px`,\n\t\t\tleft: `${src.left}px`,\n\t\t\tminWidth: `${src.width}px`,\n\t\t\twidth: 'max-content',\n\t\t\tmaxWidth: `${window.innerWidth - src.left}px`,\n\t\t\theight: 'auto',\n\t\t\tmaxHeight: `${window.innerHeight - 32}px`,\n\t\t\toverflowY: 'auto',\n\t\t})\n\n\t\tconst measured = panel.getBoundingClientRect()\n\t\tconst finalW = measured.width\n\t\tconst finalH = measured.height\n\n\t\t// 2. Adjust position so panel stays within viewport\n\t\tlet finalTop = src.top\n\t\tlet finalLeft = src.left\n\t\tif (finalTop + finalH > window.innerHeight) {\n\t\t\tfinalTop = Math.max(0, src.bottom - finalH)\n\t\t}\n\t\tif (finalLeft + finalW > window.innerWidth) {\n\t\t\tfinalLeft = Math.max(0, window.innerWidth - finalW)\n\t\t}\n\n\t\t// 3. Compute clip-path insets — summary rect expressed relative to panel final position\n\t\t// These insets shrink the visible area down to exactly the summary box\n\t\tconst insetTop = Math.max(0, src.top - finalTop)\n\t\tconst insetLeft = Math.max(0, src.left - finalLeft)\n\t\tconst insetRight = Math.max(0, finalLeft + finalW - (src.left + src.width))\n\t\tconst insetBottom = Math.max(0, finalTop + finalH - (src.top + src.height))\n\n\t\t// 4. Place panel at final size + position, masked to summary bounds (no flash)\n\t\tObject.assign(panel.style, {\n\t\t\tvisibility: '',\n\t\t\ttop: `${finalTop}px`,\n\t\t\tleft: `${finalLeft}px`,\n\t\t\tminWidth: `${src.width}px`,\n\t\t\twidth: `${finalW}px`,\n\t\t\theight: `${finalH}px`,\n\t\t\tmaxWidth: '',\n\t\t\tmaxHeight: '',\n\t\t\tclipPath: `inset(${insetTop}px ${insetRight}px ${insetBottom}px ${insetLeft}px round 0.5rem)`,\n\t\t})\n\n\t\t// 5. Animate the mask open — content revealed, not stretched\n\t\tthis._animateOpen(insetTop, insetRight, insetBottom, insetLeft, finalTop)\n\t}\n\n\t/** Animate close, return Promise resolving when done */\n\tasync triggerClose(targetRect: DOMRect): Promise<void> {\n\t\tawait this._animateClose(targetRect)\n\t\tthis.isOpen = false\n\t\tthis.summaryRect = null\n\t}\n\n\tprivate _animateOpen(insetTop: number, insetRight: number, insetBottom: number, insetLeft: number, finalTop: number) {\n\t\tconst panel = this._panelRef.value\n\t\tif (!panel) return\n\n\t\tif (reducedMotion$.value) {\n\t\t\tpanel.style.clipPath = ''\n\t\t\treturn\n\t\t}\n\n\t\tconst backdrop = this._backdropRef.value\n\t\tif (backdrop) {\n\t\t\tbackdrop.animate([{ opacity: 0 }, { opacity: 1 }], {\n\t\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\n\t\tconst keyframes: Keyframe[] = [\n\t\t\t{\n\t\t\t\tclipPath: `inset(${insetTop}px ${insetRight}px ${insetBottom}px ${insetLeft}px round 0.5rem)`,\n\t\t\t\topacity: 0.9,\n\t\t\t},\n\t\t\t{\n\t\t\t\tclipPath: 'inset(0px 0px 0px 0px round 1rem)',\n\t\t\t\topacity: 1,\n\t\t\t},\n\t\t]\n\n\t\tconst anim = panel.animate(keyframes, {\n\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\tfill: 'forwards',\n\t\t})\n\n\t\t// Clear clip-path and fixed dimensions after animation so content can grow naturally,\n\t\t// but cap at viewport height so overflow-y: auto can scroll\n\t\tanim.finished.then(() => {\n\t\t\tif (panel.isConnected) {\n\t\t\t\tpanel.style.clipPath = ''\n\t\t\t\tpanel.style.height = 'auto'\n\t\t\t\tpanel.style.maxHeight = `${window.innerHeight - finalTop - 16}px`\n\t\t\t}\n\t\t\treturn\n\t\t})\n\n\t\tconst btn = this._btnRef.value\n\t\tif (btn) {\n\t\t\tbtn.animate([{ transform: 'rotate(0deg)' }, { transform: 'rotate(180deg)' }], {\n\t\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate _animateClose(targetRect: DOMRect): Promise<void> {\n\t\tconst panel = this._panelRef.value\n\t\tif (!panel) return Promise.resolve()\n\t\tif (reducedMotion$.value) return Promise.resolve()\n\n\t\t// Compute insets to mask panel back down to the summary box\n\t\tconst panelRect = panel.getBoundingClientRect()\n\t\tconst insetTop = Math.max(0, targetRect.top - panelRect.top)\n\t\tconst insetLeft = Math.max(0, targetRect.left - panelRect.left)\n\t\tconst insetRight = Math.max(0, panelRect.right - targetRect.right)\n\t\tconst insetBottom = Math.max(0, panelRect.bottom - targetRect.bottom)\n\n\t\tconst closeDuration = Math.round(SPRING_SMOOTH.duration * 0.4)\n\t\tconst closeEasing = 'cubic-bezier(0.4, 0, 1, 1)'\n\n\t\tconst closeKeyframes: Keyframe[] = [\n\t\t\t{ clipPath: 'inset(0px 0px 0px 0px round 1rem)', opacity: 1 },\n\t\t\t{\n\t\t\t\tclipPath: `inset(${insetTop}px ${insetRight}px ${insetBottom}px ${insetLeft}px round 0.5rem)`,\n\t\t\t\topacity: 0.6,\n\t\t\t},\n\t\t]\n\n\t\tconst anim = panel.animate(closeKeyframes, { duration: closeDuration, easing: closeEasing, fill: 'forwards' })\n\n\t\tconst backdrop = this._backdropRef.value\n\t\tif (backdrop) {\n\t\t\tbackdrop.animate([{ opacity: 1 }, { opacity: 0 }], {\n\t\t\t\tduration: closeDuration,\n\t\t\t\teasing: closeEasing,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\n\t\tconst btn = this._btnRef.value\n\t\tif (btn) {\n\t\t\tbtn.animate([{ transform: 'rotate(180deg)' }, { transform: 'rotate(0deg)' }], {\n\t\t\t\tduration: closeDuration,\n\t\t\t\teasing: closeEasing,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\n\t\treturn anim.finished as unknown as Promise<void>\n\t}\n\n\trender() {\n\t\tif (!this.isOpen) return nothing\n\n\t\treturn html`\n\t\t\t${this._backdrop ? html`\n\t\t\t\t<div\n\t\t\t\t\t${ref(this._backdropRef)}\n\t\t\t\t\tclass=\"fixed inset-0 z-9998 backdrop-blur-sm backdrop-saturate-150 backdrop-brightness-105 bg-black/[0.07] will-change-[opacity]\"\n\t\t\t\t\t@click=${() => this._owner?.close?.()}\n\t\t\t\t></div>\n\t\t\t` : nothing}\n\t\t\t<schmancy-surface\n\t\t\t\t${ref(this._panelRef)}\n\t\t\t\tclass=\"portal-panel\"\n\t\t\t\ttype=${this.type}\n\t\t\t\tstyle=\"overflow-y: auto;\"\n\t\t\t>\n\t\t\t\t${!this._hideIndicator ? html`\n\t\t\t\t\t<button\n\t\t\t\t\t\t${ref(this._btnRef)}\n\t\t\t\t\t\tclass=\"minimize-btn\"\n\t\t\t\t\t\taria-label=\"Minimize\"\n\t\t\t\t\t\t@click=${() => this._owner?.close?.()}\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t<path d=\"M19 9L12 16L5 9\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t` : nothing}\n\t\t\t\t<slot></slot>\n\t\t\t</schmancy-surface>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-expand-root': SchmancyExpandRoot\n\t}\n}\n","import { css, html, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport { filter, fromEvent, lastValueFrom } from 'rxjs'\nimport { tap, takeUntil } from 'rxjs/operators'\nimport { SchmancyElement } from '@mixins/index'\nimport { SPRING_SNAPPY } from '../utils/animation.js'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport { SchmancyExpandRoot } from './expand-root.component.js'\n\n/** Dispatch this event on window to close whichever schmancy-expand is currently open */\nexport const SCHMANCY_EXPAND_REQUEST_CLOSE = 'schmancy-expand-request-close'\n\n@customElement('schmancy-expand')\nexport default class SchmancyExpand extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\tsummary::-webkit-details-marker {\n\t\tdisplay: none;\n\t}\n\n\tsummary {\n\t\tlist-style: none;\n\t\tcolor: inherit;\n\t}\n\n\t.inline-grid {\n\t\tdisplay: grid;\n\t\tgrid-template-rows: 0fr;\n\t\toverflow: hidden;\n\t\ttransition: grid-template-rows 300ms cubic-bezier(0.22, 1.25, 0.36, 1),\n\t\t opacity 300ms cubic-bezier(0.22, 1.25, 0.36, 1);\n\t\topacity: 0;\n\t}\n\n\t.inline-grid[data-open] {\n\t\tgrid-template-rows: 1fr;\n\t\topacity: 1;\n\t}\n\n\t.inline-grid > .inner {\n\t\tmin-height: 0;\n\t\toverflow: hidden;\n\t}\n`];\n\t@property() summary = ''\n\n\t@property({ type: Boolean, reflect: true }) open = false\n\n\t@property({ attribute: 'summary-padding' }) summaryPadding = ''\n\n\t@property({ attribute: 'content-padding' }) contentPadding = ''\n\n\t@property({ type: Boolean, attribute: 'hide-indicator' }) hideIndicator = false\n\n\t@property({ type: Number, attribute: 'indicator-rotate' }) indicatorRotate = 90\n\n\t@property({ type: Boolean }) backdrop = true\n\n\t@property({ type: Boolean }) inline = false\n\n\tprivate _summaryRef = createRef<HTMLElement>()\n\tprivate _contentSlotRef = createRef<HTMLSlotElement>()\n\tprivate _root: SchmancyExpandRoot | null = null\n\tprivate _movedNodes: Element[] = []\n\tprivate _currentIndicatorAnim: Animation | undefined\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Close on Escape key\n\t\tfromEvent<KeyboardEvent>(window, 'keydown')\n\t\t\t.pipe(\n\t\t\t\tfilter(e => e.key === 'Escape'),\n\t\t\t\tfilter(() => this.open),\n\t\t\t\ttap(() => void this._handleClose()),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\n\t\t// Close on click outside the portal panel\n\t\tfromEvent<PointerEvent>(document, 'pointerdown')\n\t\t\t.pipe(\n\t\t\t\tfilter(() => this.open),\n\t\t\t\tfilter(e => !!this._root && !e.composedPath().includes(this._root)),\n\t\t\t\ttap(() => void this._handleClose()),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tif (this._movedNodes.length > 0) {\n\t\t\tthis._movedNodes.forEach(n => this.appendChild(n))\n\t\t\tthis._movedNodes = []\n\t\t}\n\t\tif (this._root && this._root.children.length === 0) {\n\t\t\tthis._root.remove()\n\t\t\tthis._root = null\n\t\t}\n\t}\n\n\tprivate async _getOrCreateRoot(): Promise<SchmancyExpandRoot> {\n\t\tconst theme = await lastValueFrom(this.discover<HTMLElement>('schmancy-theme'))\n\t\tconst container: HTMLElement = theme ?? document.querySelector('schmancy-theme') ?? document.body\n\t\tlet root = container.querySelector('schmancy-expand-root') as SchmancyExpandRoot | null\n\t\tif (!root) {\n\t\t\troot = new SchmancyExpandRoot()\n\t\t\tcontainer.appendChild(root)\n\t\t}\n\t\treturn root\n\t}\n\n\t/** Close the expand portal, animating back to the summary position. */\n\tpublic close(): void {\n\t\tvoid this._handleClose()\n\t}\n\n\t/** Programmatically open the expand portal. */\n\tpublic expand(): void {\n\t\tif (this.open) return\n\t\tvoid this._expand()\n\t}\n\n\tprotected override updated(changed: Map<PropertyKey, unknown>) {\n\t\tsuper.updated(changed)\n\t\tif (changed.has('open') && this.open && !this.inline && !this._root) {\n\t\t\tvoid this._expand()\n\t\t}\n\t}\n\n\tprivate _toggle() {\n\t\tif (this.inline) {\n\t\t\tthis.open = !this.open\n\t\t\tthis._animateIndicator(this.open)\n\t\t} else if (!this.open) {\n\t\t\tvoid this._expand()\n\t\t}\n\t}\n\n\tprivate _handleSummaryClick(e: MouseEvent) {\n\t\te.preventDefault()\n\t\tthis._toggle()\n\t}\n\n\tprivate async _expand() {\n\t\tif (this.inline) {\n\t\t\tthis.open = true\n\t\t\tthis._animateIndicator(true)\n\t\t\treturn\n\t\t}\n\n\t\tconst root = await this._getOrCreateRoot()\n\t\tthis._root = root\n\t\tconst summary = this._summaryRef.value\n\t\tconst contentSlot = this._contentSlotRef.value\n\t\tif (!summary || !contentSlot) return\n\n\t\tconst summaryRect = summary.getBoundingClientRect()\n\t\tconst nodes = contentSlot.assignedElements({ flatten: true })\n\t\tif (nodes.length === 0) return\n\n\t\troot.prepare(summaryRect, this, this.hideIndicator, this.backdrop)\n\n\t\tthis._movedNodes = [...nodes]\n\t\tthis._movedNodes.forEach(n => root.appendChild(n))\n\n\t\troot.triggerOpen()\n\n\t\tthis._animateIndicator(true)\n\t\tthis.open = true\n\t}\n\n\tasync _handleClose() {\n\t\tif (this.inline) {\n\t\t\tthis._animateIndicator(false)\n\t\t\tthis.open = false\n\t\t\treturn\n\t\t}\n\n\t\tconst root = this._root\n\t\tconst summary = this._summaryRef.value\n\t\tif (!root || !summary) return\n\n\t\tconst summaryRect = summary.getBoundingClientRect()\n\t\tthis._animateIndicator(false)\n\n\t\tawait root.triggerClose(summaryRect)\n\n\t\tthis._movedNodes.forEach(n => this.appendChild(n))\n\t\tthis._movedNodes = []\n\t\tthis.open = false\n\t}\n\n\tprivate _animateIndicator(isOpen: boolean) {\n\t\tif (reducedMotion$.value) return\n\n\t\tconst indicator = this.shadowRoot?.querySelector('.indicator') as HTMLElement | null\n\t\tif (!indicator) return\n\n\t\tthis._currentIndicatorAnim?.cancel()\n\t\tthis._currentIndicatorAnim = indicator.animate(\n\t\t\t[\n\t\t\t\t{ transform: `rotate(${isOpen ? '0deg' : `${this.indicatorRotate}deg`})` },\n\t\t\t\t{ transform: `rotate(${isOpen ? `${this.indicatorRotate}deg` : '0deg'})` },\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration: SPRING_SNAPPY.duration,\n\t\t\t\teasing: SPRING_SNAPPY.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t)\n\t}\n\n\trender() {\n\t\tconst summaryClasses = this.classMap({\n\t\t\t[this.summaryPadding]: true,\n\t\t\t'select-none relative flex items-center gap-2 rounded-xl transition-all duration-150': true,\n\t\t\t'hover:brightness-[0.92] active:brightness-[0.85] cursor-pointer group': true,\n\t\t\t'flex-row-reverse': true,\n\t\t})\n\n\t\treturn html`\n\t\t\t<div class=\"w-full rounded-xl\">\n\t\t\t\t<div\n\t\t\t\t\t${ref(this._summaryRef)}\n\t\t\t\t\tclass=${summaryClasses}\n\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\trole=\"button\"\n\t\t\t\t\t@click=${this._handleSummaryClick}\n\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\tthis._toggle()\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t${!this.hideIndicator\n\t\t\t\t\t\t? html`\n\t\t\t\t\t\t\t\t<span class=\"indicator flex items-center justify-center w-5 h-5 rounded-full shrink-0 opacity-70 group-hover:opacity-100 will-change-transform\">\n\t\t\t\t\t\t\t\t\t<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\td=\"M9 6L15 12L9 18\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t: nothing}\n\n\t\t\t\t\t<span class=\"flex-1 font-medium text-base min-w-0\">\n\t\t\t\t\t\t<slot name=\"summary\">${this.summary}</slot>\n\t\t\t\t\t</span>\n\n\t\t\t\t\t<slot name=\"actions\"></slot>\n\t\t\t\t</div>\n\n\t\t\t\t${this.inline\n\t\t\t\t\t? html`\n\t\t\t\t\t\t<div class=\"inline-grid\" ?data-open=${this.open}>\n\t\t\t\t\t\t\t<div class=\"inner\">\n\t\t\t\t\t\t\t\t<slot ${ref(this._contentSlotRef)}></slot>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t\t: html`\n\t\t\t\t\t\t<div style=${styleMap(this.open ? {} : { display: 'none' })}>\n\t\t\t\t\t\t\t<slot ${ref(this._contentSlotRef)}></slot>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-expand': SchmancyExpand\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"expand-DRkiO4vw.js","names":[],"sources":["../src/expand/expand-root.component.ts","../src/expand/expand.component.ts"],"sourcesContent":["import { css, html, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { SchmancyElement, SurfaceMixin } from '@mixins/index'\nimport type { TSurfaceColor } from '@schmancy/types'\nimport { SPRING_SMOOTH } from '../utils/animation.js'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport '../surface/surface.js'\n\n@customElement('schmancy-expand-root')\nexport class SchmancyExpandRoot extends SurfaceMixin(SchmancyElement) {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: contents;\n\t}\n\n\t.portal-panel {\n\t\tposition: fixed;\n\t\ttransform-origin: top left;\n\t\twill-change: clip-path, opacity;\n\t\tborder-radius: 1rem;\n\t\tbox-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.5);\n\t\tz-index: 9999;\n\t}\n\n\t.minimize-btn {\n\t\tposition: absolute;\n\t\ttop: 0.5rem;\n\t\tright: 0.5rem;\n\t\tz-index: 1;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 2rem;\n\t\theight: 2rem;\n\t\tborder-radius: 9999px;\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcursor: pointer;\n\t\topacity: 0.5;\n\t\ttransition: opacity 150ms, background 150ms;\n\t\tcolor: inherit;\n\t}\n\n\t.minimize-btn:hover {\n\t\topacity: 1;\n\t\tbackground: rgb(0 0 0 / 0.08);\n\t}\n`];\n\t@property({ reflect: true }) override type: TSurfaceColor = 'solid'\n\t@state() isOpen = false\n\tprivate summaryRect: DOMRect | null = null\n\n\tprivate _panelRef = createRef<HTMLElement>()\n\tprivate _backdropRef = createRef<HTMLDivElement>()\n\tprivate _btnRef = createRef<HTMLButtonElement>()\n\tprivate _owner: (Element & { close?: () => void }) | null = null\n\tprivate _hideIndicator = false\n\tprivate _backdrop = true\n\n\t/** Called by schmancy-expand before nodes are moved */\n\tprepare(rect: DOMRect, owner: Element, hideIndicator = false, backdrop = true) {\n\t\tthis.summaryRect = rect\n\t\tthis._owner = owner as Element & { close?: () => void }\n\t\tthis._hideIndicator = hideIndicator\n\t\tthis._backdrop = backdrop\n\t}\n\n\t/** Called by schmancy-expand after nodes are moved in */\n\tasync triggerOpen() {\n\t\tthis.isOpen = true\n\t\tawait this.updateComplete\n\n\t\tconst panel = this._panelRef.value\n\t\tif (!panel) return\n\n\t\tconst src = this.summaryRect!\n\n\t\t// 1. Anchor at summary's top-left, measure natural content size\n\t\t// Use nearly full viewport height for measurement so content near the bottom\n\t\t// of the screen isn't artificially capped — the positioning step will move the panel up.\n\t\tObject.assign(panel.style, {\n\t\t\tvisibility: 'hidden',\n\t\t\ttop: `${src.top}px`,\n\t\t\tleft: `${src.left}px`,\n\t\t\tminWidth: `${src.width}px`,\n\t\t\twidth: 'max-content',\n\t\t\tmaxWidth: `${window.innerWidth - src.left}px`,\n\t\t\theight: 'auto',\n\t\t\tmaxHeight: `${window.innerHeight - 32}px`,\n\t\t\toverflowY: 'auto',\n\t\t})\n\n\t\tconst measured = panel.getBoundingClientRect()\n\t\tconst finalW = measured.width\n\t\tconst finalH = measured.height\n\n\t\t// 2. Adjust position so panel stays within viewport\n\t\tlet finalTop = src.top\n\t\tlet finalLeft = src.left\n\t\tif (finalTop + finalH > window.innerHeight) {\n\t\t\tfinalTop = Math.max(0, src.bottom - finalH)\n\t\t}\n\t\tif (finalLeft + finalW > window.innerWidth) {\n\t\t\tfinalLeft = Math.max(0, window.innerWidth - finalW)\n\t\t}\n\n\t\t// 3. Compute clip-path insets — summary rect expressed relative to panel final position\n\t\t// These insets shrink the visible area down to exactly the summary box\n\t\tconst insetTop = Math.max(0, src.top - finalTop)\n\t\tconst insetLeft = Math.max(0, src.left - finalLeft)\n\t\tconst insetRight = Math.max(0, finalLeft + finalW - (src.left + src.width))\n\t\tconst insetBottom = Math.max(0, finalTop + finalH - (src.top + src.height))\n\n\t\t// 4. Place panel at final size + position, masked to summary bounds (no flash)\n\t\tObject.assign(panel.style, {\n\t\t\tvisibility: '',\n\t\t\ttop: `${finalTop}px`,\n\t\t\tleft: `${finalLeft}px`,\n\t\t\tminWidth: `${src.width}px`,\n\t\t\twidth: `${finalW}px`,\n\t\t\theight: `${finalH}px`,\n\t\t\tmaxWidth: '',\n\t\t\tmaxHeight: '',\n\t\t\tclipPath: `inset(${insetTop}px ${insetRight}px ${insetBottom}px ${insetLeft}px round 0.5rem)`,\n\t\t})\n\n\t\t// 5. Animate the mask open — content revealed, not stretched\n\t\tthis._animateOpen(insetTop, insetRight, insetBottom, insetLeft, finalTop)\n\t}\n\n\t/** Animate close, return Promise resolving when done */\n\tasync triggerClose(targetRect: DOMRect): Promise<void> {\n\t\tawait this._animateClose(targetRect)\n\t\tthis.isOpen = false\n\t\tthis.summaryRect = null\n\t}\n\n\tprivate _animateOpen(insetTop: number, insetRight: number, insetBottom: number, insetLeft: number, finalTop: number) {\n\t\tconst panel = this._panelRef.value\n\t\tif (!panel) return\n\n\t\tif (reducedMotion$.value) {\n\t\t\tpanel.style.clipPath = ''\n\t\t\treturn\n\t\t}\n\n\t\tconst backdrop = this._backdropRef.value\n\t\tif (backdrop) {\n\t\t\tbackdrop.animate([{ opacity: 0 }, { opacity: 1 }], {\n\t\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\n\t\tconst keyframes: Keyframe[] = [\n\t\t\t{\n\t\t\t\tclipPath: `inset(${insetTop}px ${insetRight}px ${insetBottom}px ${insetLeft}px round 0.5rem)`,\n\t\t\t\topacity: 0.9,\n\t\t\t},\n\t\t\t{\n\t\t\t\tclipPath: 'inset(0px 0px 0px 0px round 1rem)',\n\t\t\t\topacity: 1,\n\t\t\t},\n\t\t]\n\n\t\tconst anim = panel.animate(keyframes, {\n\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\tfill: 'forwards',\n\t\t})\n\n\t\t// Clear clip-path and fixed dimensions after animation so content can grow naturally,\n\t\t// but cap at viewport height so overflow-y: auto can scroll\n\t\tanim.finished.then(() => {\n\t\t\tif (panel.isConnected) {\n\t\t\t\tpanel.style.clipPath = ''\n\t\t\t\tpanel.style.height = 'auto'\n\t\t\t\tpanel.style.maxHeight = `${window.innerHeight - finalTop - 16}px`\n\t\t\t}\n\t\t\treturn\n\t\t})\n\n\t\tconst btn = this._btnRef.value\n\t\tif (btn) {\n\t\t\tbtn.animate([{ transform: 'rotate(0deg)' }, { transform: 'rotate(180deg)' }], {\n\t\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate _animateClose(targetRect: DOMRect): Promise<void> {\n\t\tconst panel = this._panelRef.value\n\t\tif (!panel) return Promise.resolve()\n\t\tif (reducedMotion$.value) return Promise.resolve()\n\n\t\t// Compute insets to mask panel back down to the summary box\n\t\tconst panelRect = panel.getBoundingClientRect()\n\t\tconst insetTop = Math.max(0, targetRect.top - panelRect.top)\n\t\tconst insetLeft = Math.max(0, targetRect.left - panelRect.left)\n\t\tconst insetRight = Math.max(0, panelRect.right - targetRect.right)\n\t\tconst insetBottom = Math.max(0, panelRect.bottom - targetRect.bottom)\n\n\t\tconst closeDuration = Math.round(SPRING_SMOOTH.duration * 0.4)\n\t\tconst closeEasing = 'cubic-bezier(0.4, 0, 1, 1)'\n\n\t\tconst closeKeyframes: Keyframe[] = [\n\t\t\t{ clipPath: 'inset(0px 0px 0px 0px round 1rem)', opacity: 1 },\n\t\t\t{\n\t\t\t\tclipPath: `inset(${insetTop}px ${insetRight}px ${insetBottom}px ${insetLeft}px round 0.5rem)`,\n\t\t\t\topacity: 0.6,\n\t\t\t},\n\t\t]\n\n\t\tconst anim = panel.animate(closeKeyframes, { duration: closeDuration, easing: closeEasing, fill: 'forwards' })\n\n\t\tconst backdrop = this._backdropRef.value\n\t\tif (backdrop) {\n\t\t\tbackdrop.animate([{ opacity: 1 }, { opacity: 0 }], {\n\t\t\t\tduration: closeDuration,\n\t\t\t\teasing: closeEasing,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\n\t\tconst btn = this._btnRef.value\n\t\tif (btn) {\n\t\t\tbtn.animate([{ transform: 'rotate(180deg)' }, { transform: 'rotate(0deg)' }], {\n\t\t\t\tduration: closeDuration,\n\t\t\t\teasing: closeEasing,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\n\t\treturn anim.finished as unknown as Promise<void>\n\t}\n\n\trender() {\n\t\tif (!this.isOpen) return nothing\n\n\t\treturn html`\n\t\t\t${this._backdrop ? html`\n\t\t\t\t<div\n\t\t\t\t\t${ref(this._backdropRef)}\n\t\t\t\t\tclass=\"fixed inset-0 z-9998 backdrop-blur-sm backdrop-saturate-150 backdrop-brightness-105 bg-black/[0.07] will-change-[opacity]\"\n\t\t\t\t\t@click=${() => this._owner?.close?.()}\n\t\t\t\t></div>\n\t\t\t` : nothing}\n\t\t\t<schmancy-surface\n\t\t\t\t${ref(this._panelRef)}\n\t\t\t\tclass=\"portal-panel\"\n\t\t\t\ttype=${this.type}\n\t\t\t\tstyle=\"overflow-y: auto;\"\n\t\t\t>\n\t\t\t\t${!this._hideIndicator ? html`\n\t\t\t\t\t<button\n\t\t\t\t\t\t${ref(this._btnRef)}\n\t\t\t\t\t\tclass=\"minimize-btn\"\n\t\t\t\t\t\taria-label=\"Minimize\"\n\t\t\t\t\t\t@click=${() => this._owner?.close?.()}\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t<path d=\"M19 9L12 16L5 9\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t` : nothing}\n\t\t\t\t<slot></slot>\n\t\t\t</schmancy-surface>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-expand-root': SchmancyExpandRoot\n\t}\n}\n","import { css, html, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport { filter, fromEvent, lastValueFrom } from 'rxjs'\nimport { tap, takeUntil } from 'rxjs/operators'\nimport { SchmancyElement } from '@mixins/index'\nimport { SPRING_SNAPPY } from '../utils/animation.js'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport { SchmancyExpandRoot } from './expand-root.component.js'\n\n/** Dispatch this event on window to close whichever schmancy-expand is currently open */\nexport const SCHMANCY_EXPAND_REQUEST_CLOSE = 'schmancy-expand-request-close'\n\n@customElement('schmancy-expand')\nexport default class SchmancyExpand extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\tsummary::-webkit-details-marker {\n\t\tdisplay: none;\n\t}\n\n\tsummary {\n\t\tlist-style: none;\n\t\tcolor: inherit;\n\t}\n\n\t.inline-grid {\n\t\tdisplay: grid;\n\t\tgrid-template-rows: 0fr;\n\t\toverflow: hidden;\n\t\ttransition: grid-template-rows 300ms cubic-bezier(0.22, 1.25, 0.36, 1),\n\t\t opacity 300ms cubic-bezier(0.22, 1.25, 0.36, 1);\n\t\topacity: 0;\n\t}\n\n\t.inline-grid[data-open] {\n\t\tgrid-template-rows: 1fr;\n\t\topacity: 1;\n\t}\n\n\t.inline-grid > .inner {\n\t\tmin-height: 0;\n\t\toverflow: hidden;\n\t}\n`];\n\t@property() summary = ''\n\n\t@property({ type: Boolean, reflect: true }) open = false\n\n\t@property({ attribute: 'summary-padding' }) summaryPadding = ''\n\n\t@property({ attribute: 'content-padding' }) contentPadding = ''\n\n\t@property({ type: Boolean, attribute: 'hide-indicator' }) hideIndicator = false\n\n\t@property({ type: Number, attribute: 'indicator-rotate' }) indicatorRotate = 90\n\n\t@property({ type: Boolean }) backdrop = true\n\n\t@property({ type: Boolean }) inline = false\n\n\tprivate _summaryRef = createRef<HTMLElement>()\n\tprivate _contentSlotRef = createRef<HTMLSlotElement>()\n\tprivate _root: SchmancyExpandRoot | null = null\n\tprivate _movedNodes: Element[] = []\n\tprivate _currentIndicatorAnim: Animation | undefined\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Close on Escape key\n\t\tfromEvent<KeyboardEvent>(window, 'keydown')\n\t\t\t.pipe(\n\t\t\t\tfilter(e => e.key === 'Escape'),\n\t\t\t\tfilter(() => this.open),\n\t\t\t\ttap(() => void this._handleClose()),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\n\t\t// Close on click outside the portal panel\n\t\tfromEvent<PointerEvent>(document, 'pointerdown')\n\t\t\t.pipe(\n\t\t\t\tfilter(() => this.open),\n\t\t\t\tfilter(e => !!this._root && !e.composedPath().includes(this._root)),\n\t\t\t\ttap(() => void this._handleClose()),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tif (this._movedNodes.length > 0) {\n\t\t\tthis._movedNodes.forEach(n => this.appendChild(n))\n\t\t\tthis._movedNodes = []\n\t\t}\n\t\tif (this._root && this._root.children.length === 0) {\n\t\t\tthis._root.remove()\n\t\t\tthis._root = null\n\t\t}\n\t}\n\n\tprivate async _getOrCreateRoot(): Promise<SchmancyExpandRoot> {\n\t\tconst theme = await lastValueFrom(this.discover<HTMLElement>('schmancy-theme'))\n\t\tconst container: HTMLElement = theme ?? document.querySelector('schmancy-theme') ?? document.body\n\t\tlet root = container.querySelector('schmancy-expand-root') as SchmancyExpandRoot | null\n\t\tif (!root) {\n\t\t\troot = new SchmancyExpandRoot()\n\t\t\tcontainer.appendChild(root)\n\t\t}\n\t\treturn root\n\t}\n\n\t/** Close the expand portal, animating back to the summary position. */\n\tpublic close(): void {\n\t\tvoid this._handleClose()\n\t}\n\n\t/** Programmatically open the expand portal. */\n\tpublic expand(): void {\n\t\tif (this.open) return\n\t\tvoid this._expand()\n\t}\n\n\tprotected override updated(changed: Map<PropertyKey, unknown>) {\n\t\tsuper.updated(changed)\n\t\tif (changed.has('open') && this.open && !this.inline && !this._root) {\n\t\t\tvoid this._expand()\n\t\t}\n\t}\n\n\tprivate _toggle() {\n\t\tif (this.inline) {\n\t\t\tthis.open = !this.open\n\t\t\tthis._animateIndicator(this.open)\n\t\t} else if (!this.open) {\n\t\t\tvoid this._expand()\n\t\t}\n\t}\n\n\tprivate _handleSummaryClick(e: MouseEvent) {\n\t\te.preventDefault()\n\t\tthis._toggle()\n\t}\n\n\tprivate async _expand() {\n\t\tif (this.inline) {\n\t\t\tthis.open = true\n\t\t\tthis._animateIndicator(true)\n\t\t\treturn\n\t\t}\n\n\t\tconst root = await this._getOrCreateRoot()\n\t\tthis._root = root\n\t\tconst summary = this._summaryRef.value\n\t\tconst contentSlot = this._contentSlotRef.value\n\t\tif (!summary || !contentSlot) return\n\n\t\tconst summaryRect = summary.getBoundingClientRect()\n\t\tconst nodes = contentSlot.assignedElements({ flatten: true })\n\t\tif (nodes.length === 0) return\n\n\t\troot.prepare(summaryRect, this, this.hideIndicator, this.backdrop)\n\n\t\tthis._movedNodes = [...nodes]\n\t\tthis._movedNodes.forEach(n => root.appendChild(n))\n\n\t\troot.triggerOpen()\n\n\t\tthis._animateIndicator(true)\n\t\tthis.open = true\n\t}\n\n\tasync _handleClose() {\n\t\tif (this.inline) {\n\t\t\tthis._animateIndicator(false)\n\t\t\tthis.open = false\n\t\t\treturn\n\t\t}\n\n\t\tconst root = this._root\n\t\tconst summary = this._summaryRef.value\n\t\tif (!root || !summary) return\n\n\t\tconst summaryRect = summary.getBoundingClientRect()\n\t\tthis._animateIndicator(false)\n\n\t\tawait root.triggerClose(summaryRect)\n\n\t\tthis._movedNodes.forEach(n => this.appendChild(n))\n\t\tthis._movedNodes = []\n\t\tthis.open = false\n\t}\n\n\tprivate _animateIndicator(isOpen: boolean) {\n\t\tif (reducedMotion$.value) return\n\n\t\tconst indicator = this.shadowRoot?.querySelector('.indicator') as HTMLElement | null\n\t\tif (!indicator) return\n\n\t\tthis._currentIndicatorAnim?.cancel()\n\t\tthis._currentIndicatorAnim = indicator.animate(\n\t\t\t[\n\t\t\t\t{ transform: `rotate(${isOpen ? '0deg' : `${this.indicatorRotate}deg`})` },\n\t\t\t\t{ transform: `rotate(${isOpen ? `${this.indicatorRotate}deg` : '0deg'})` },\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration: SPRING_SNAPPY.duration,\n\t\t\t\teasing: SPRING_SNAPPY.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t)\n\t}\n\n\trender() {\n\t\tconst summaryClasses = this.classMap({\n\t\t\t[this.summaryPadding]: true,\n\t\t\t'select-none relative flex items-center gap-2 rounded-xl transition-all duration-150': true,\n\t\t\t'hover:brightness-[0.92] active:brightness-[0.85] cursor-pointer group': true,\n\t\t\t'flex-row-reverse': true,\n\t\t})\n\n\t\treturn html`\n\t\t\t<div class=\"w-full rounded-xl\">\n\t\t\t\t<div\n\t\t\t\t\t${ref(this._summaryRef)}\n\t\t\t\t\tclass=${summaryClasses}\n\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\trole=\"button\"\n\t\t\t\t\t@click=${this._handleSummaryClick}\n\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\tthis._toggle()\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t${!this.hideIndicator\n\t\t\t\t\t\t? html`\n\t\t\t\t\t\t\t\t<span class=\"indicator flex items-center justify-center w-5 h-5 rounded-full shrink-0 opacity-70 group-hover:opacity-100 will-change-transform\">\n\t\t\t\t\t\t\t\t\t<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\td=\"M9 6L15 12L9 18\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t: nothing}\n\n\t\t\t\t\t<span class=\"flex-1 font-medium text-base min-w-0\">\n\t\t\t\t\t\t<slot name=\"summary\">${this.summary}</slot>\n\t\t\t\t\t</span>\n\n\t\t\t\t\t<slot name=\"actions\"></slot>\n\t\t\t\t</div>\n\n\t\t\t\t${this.inline\n\t\t\t\t\t? html`\n\t\t\t\t\t\t<div class=\"inline-grid\" ?data-open=${this.open}>\n\t\t\t\t\t\t\t<div class=\"inner\">\n\t\t\t\t\t\t\t\t<slot ${ref(this._contentSlotRef)}></slot>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t\t: html`\n\t\t\t\t\t\t<div style=${styleMap(this.open ? {} : { display: 'none' })}>\n\t\t\t\t\t\t\t<slot ${ref(this._contentSlotRef)}></slot>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-expand': SchmancyExpand\n\t}\n}\n"],"mappings":"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"}
package/dist/expand.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./expand-DK-O37-j.cjs`);exports.SCHMANCY_EXPAND_REQUEST_CLOSE=e.t,Object.defineProperty(exports,`SchmancyExpandRoot`,{enumerable:!0,get:function(){return e.n}});
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./expand-CQDm3BF3.cjs`);exports.SCHMANCY_EXPAND_REQUEST_CLOSE=e.t,Object.defineProperty(exports,`SchmancyExpandRoot`,{enumerable:!0,get:function(){return e.n}});
package/dist/expand.js CHANGED
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./expand-BJiKggfg.js";
1
+ import { n as e, t } from "./expand-DRkiO4vw.js";
2
2
  export { t as SCHMANCY_EXPAND_REQUEST_CLOSE, e as SchmancyExpandRoot };
@@ -1 +1 @@
1
- require(`./chunk-CncqDLb2.cjs`);const e=require(`./active-host-jH3iloCR.cjs`),t=require(`./window-BbWlaPZv.cjs`);let n=require(`lit/decorators.js`);var r=class extends t.t{},i=r=e.a([(0,n.customElement)(`schmancy-float`)],r);Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return i}});
1
+ require(`./chunk-CncqDLb2.cjs`);const e=require(`./active-host-jH3iloCR.cjs`),t=require(`./window-Ck_zS4bb.cjs`);let n=require(`lit/decorators.js`);var r=class extends t.t{},i=r=e.a([(0,n.customElement)(`schmancy-float`)],r);Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return i}});
@@ -1 +1 @@
1
- {"version":3,"file":"float-RWR6Q1Hh.cjs","names":[],"sources":["../src/float/float.ts"],"sourcesContent":["/**\n * Backward compatibility alias — schmancy-float is now schmancy-window.\n *\n * Existing consumers using <schmancy-float> continue to work.\n * New code should use <schmancy-window> directly.\n */\n\nimport { customElement } from 'lit/decorators.js'\nimport SchmancyWindow from '../window/window.js'\n\n@customElement('schmancy-float')\nexport default class SchmancyFloat extends SchmancyWindow {}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-float': SchmancyFloat\n\t}\n}\n"],"mappings":"oJAWe,IAAA,EAAA,cAA4B,EAAA,CAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAD5B,iBAAA,CAAA,CAAiB,EAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"float-5O26zNRh.cjs","names":[],"sources":["../src/float/float.ts"],"sourcesContent":["/**\n * Backward compatibility alias — schmancy-float is now schmancy-window.\n *\n * Existing consumers using <schmancy-float> continue to work.\n * New code should use <schmancy-window> directly.\n */\n\nimport { customElement } from 'lit/decorators.js'\nimport SchmancyWindow from '../window/window.js'\n\n@customElement('schmancy-float')\nexport default class SchmancyFloat extends SchmancyWindow {}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-float': SchmancyFloat\n\t}\n}\n"],"mappings":"oJAWe,IAAA,EAAA,cAA4B,EAAA,CAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAD5B,iBAAA,CAAA,CAAiB,EAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { a as e } from "./active-host-BP0zy_Y9.js";
2
- import { t } from "./window-DuDAQa6y.js";
2
+ import { t } from "./window-JtkeHoxS.js";
3
3
  import { customElement as n } from "lit/decorators.js";
4
4
  var r = class extends t {}, i = r = e([n("schmancy-float")], r);
5
5
  export { i as t };
@@ -1 +1 @@
1
- {"version":3,"file":"float-B4FDN40h.js","names":[],"sources":["../src/float/float.ts"],"sourcesContent":["/**\n * Backward compatibility alias — schmancy-float is now schmancy-window.\n *\n * Existing consumers using <schmancy-float> continue to work.\n * New code should use <schmancy-window> directly.\n */\n\nimport { customElement } from 'lit/decorators.js'\nimport SchmancyWindow from '../window/window.js'\n\n@customElement('schmancy-float')\nexport default class SchmancyFloat extends SchmancyWindow {}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-float': SchmancyFloat\n\t}\n}\n"],"mappings":";;;AAWe,IAAA,IAAA,cAA4B,EAAA,IAAA,IAAA,IAAA,EAAA,CAD1C,EAAc,iBAAA,CAAA,EAAiB,EAAA;AAAA,SAAA,KAAA"}
1
+ {"version":3,"file":"float-CZtu8FnO.js","names":[],"sources":["../src/float/float.ts"],"sourcesContent":["/**\n * Backward compatibility alias — schmancy-float is now schmancy-window.\n *\n * Existing consumers using <schmancy-float> continue to work.\n * New code should use <schmancy-window> directly.\n */\n\nimport { customElement } from 'lit/decorators.js'\nimport SchmancyWindow from '../window/window.js'\n\n@customElement('schmancy-float')\nexport default class SchmancyFloat extends SchmancyWindow {}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-float': SchmancyFloat\n\t}\n}\n"],"mappings":";;;AAWe,IAAA,IAAA,cAA4B,EAAA,IAAA,IAAA,IAAA,EAAA,CAD1C,EAAc,iBAAA,CAAA,EAAiB,EAAA;AAAA,SAAA,KAAA"}
package/dist/float.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./float-RWR6Q1Hh.cjs`);exports.SchmancyFloat=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./float-5O26zNRh.cjs`);exports.SchmancyFloat=e.t;
package/dist/float.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as e } from "./float-B4FDN40h.js";
1
+ import { t as e } from "./float-CZtu8FnO.js";
2
2
  export { e as SchmancyFloat };
@@ -1,4 +1,4 @@
1
- require(`./chunk-CncqDLb2.cjs`);const e=require(`./mixins-DTCHPEd4.cjs`),t=require(`./active-host-jH3iloCR.cjs`),n=require(`./state-DcGj-pJJ.cjs`);require(`./autocomplete-CfBFDSc3.cjs`),require(`./checkbox-BAqE3sTx.cjs`),require(`./date-range-VA1mi1N7.cjs`),require(`./input-BY9OCQWr.cjs`),require(`./radio-group-bl8K4Gls.cjs`),require(`./range.cjs`),require(`./select-COIfVtZl.cjs`),require(`./switch.cjs`),require(`./textarea-CGD6lAEe.cjs`);let r=require(`rxjs`),i=require(`lit/decorators.js`),a=require(`lit`);var o=n.i(`schmancy/form-submit`).memory({status:`idle`,error:null,submitCount:0}),s=e=>e instanceof HTMLElement&&(e.tagName===`BUTTON`||e.tagName===`SCHMANCY-BUTTON`),c=class extends e.c{constructor(...e){super(...e),this.novalidate=!0,this._fields=new Set,this._submitting=!1,this._liveStatus=`idle`,this._liveError=``,this._internals=(()=>{try{return this.attachInternals()}catch{return}})()}static{this.tagName=`schmancy-form`}connectedCallback(){super.connectedCallback(),this.parentElement?.closest(`schmancy-form`)||((0,r.fromEvent)(this,e.r).pipe((0,r.takeUntil)(this.disconnecting)).subscribe(e=>this._fields.add(e.detail)),(0,r.fromEvent)(this,`click`).pipe((0,r.takeUntil)(this.disconnecting)).subscribe(e=>this._maybeRequestSubmit(e)),(0,r.fromEvent)(this,`keydown`).pipe((0,r.takeUntil)(this.disconnecting)).subscribe(e=>{if(e.key!==`Enter`||e.shiftKey)return;let t=e.target;t?.tagName!==`TEXTAREA`&&(t?.isContentEditable||this._maybeRequestSubmit(e))}))}_maybeRequestSubmit(e){if(e.type===`click`){let t=e.composedPath();if(t.find(e=>s(e)&&e.getAttribute(`type`)===`reset`))return e.preventDefault(),void(this.shadowRoot?.querySelector(`form`))?.reset();if(!t.find(e=>s(e)&&e.getAttribute(`type`)===`submit`))return;e.preventDefault()}(this.shadowRoot?.querySelector(`form`))?.requestSubmit()}get _activeFields(){return[...this._fields].filter(e=>e.isConnected)}async _onSubmit(e){if(e.preventDefault(),e.stopPropagation(),this._submitting)return;this._activeFields.filter(e=>e.isValidating).length>0&&(this._broadcastStatus(`submitting`),await new Promise(e=>{let t=()=>{this._activeFields.every(e=>!e.isValidating)?e():requestAnimationFrame(t)};t()})),this._activeFields.forEach(e=>e.markSubmitted());let t=this._activeFields.every(e=>e.checkValidity()),n=o.value;if(!t)return o.set({...n,status:`error`,error:{message:`Validation failed`}}),this._broadcastStatus(`error`,`Validation failed. Please correct the highlighted fields.`),void this._activeFields.find(e=>e.error)?.focus();this._submitting=!0,o.set({...n,status:`submitting`,error:null,submitCount:n.submitCount+1}),this._broadcastStatus(`submitting`);let r=new FormData;for(let e of this._activeFields)for(let[t,n]of e.toFormEntries())r.append(t,n);let i=Object.fromEntries(r),a=this.schema?this.schema.parse(i):i,s=[];this.dispatchEvent(new CustomEvent(`submit`,{detail:{data:a,formData:r,until:e=>s.push(e)}}));try{await Promise.all(s),o.set({...o.value,status:`success`,error:null}),this._broadcastStatus(`success`)}catch(e){let t=e instanceof Error?e.message:String(e);o.set({...o.value,status:`error`,error:{message:t}}),this._broadcastStatus(`error`,t)}finally{this._submitting=!1}}_onReset(e){e.stopPropagation(),this._activeFields.forEach(e=>e.resetForm()),o.set({status:`idle`,error:null,submitCount:0}),this._broadcastStatus(`idle`),this.dispatchEvent(new CustomEvent(`reset`))}_broadcastStatus(e,t){this._liveStatus=e,this._liveError=t??``;let n=this._internals?.states;if(n){for(let e of[`submitting`,`success`,`error`,`idle`])n.delete(e);n.add(e)}e===`submitting`?this.setAttribute(`aria-busy`,`true`):this.removeAttribute(`aria-busy`),this.dispatchEvent(new CustomEvent(`formstate`,{detail:{...o.value},bubbles:!0,composed:!0}))}setFieldError(e,t){let n=this._activeFields.find(t=>t.name===e);return!!n&&(n.setCustomValidity(t),n.markSubmitted(),!0)}setFormError(e,t){o.set({...o.value,status:`error`,error:{message:e,code:t}}),this._broadcastStatus(`error`,e)}clearSubmitted(){this._activeFields.forEach(e=>e.clearSubmitted()),o.set({...o.value,status:`idle`,error:null}),this._broadcastStatus(`idle`)}submit(){let e=this.shadowRoot?.querySelector(`form`);return!!e&&(e.requestSubmit(),!0)}reset(){(this.shadowRoot?.querySelector(`form`))?.reset()}reportValidity(){return this._activeFields.every(e=>e.reportValidity())}checkValidity(){return this._activeFields.every(e=>e.checkValidity())}getFormData(){let e=new FormData;for(let t of this._activeFields)for(let[n,r]of t.toFormEntries())e.append(n,r);return e}render(){return a.html`
1
+ require(`./chunk-CncqDLb2.cjs`);const e=require(`./mixins-BPUR4Kc4.cjs`),t=require(`./active-host-jH3iloCR.cjs`),n=require(`./state-DcGj-pJJ.cjs`);require(`./autocomplete-Cy46gJxK.cjs`),require(`./checkbox-rskgUBxQ.cjs`),require(`./date-range-em7OwhlK.cjs`),require(`./input-_y92Pzon.cjs`),require(`./radio-group-D97hflrE.cjs`),require(`./range.cjs`),require(`./select-Cv5Oev6d.cjs`),require(`./switch.cjs`),require(`./textarea-D1crj8JD.cjs`);let r=require(`rxjs`),i=require(`lit/decorators.js`),a=require(`lit`);var o=n.i(`schmancy/form-submit`).memory({status:`idle`,error:null,submitCount:0}),s=e=>e instanceof HTMLElement&&(e.tagName===`BUTTON`||e.tagName===`SCHMANCY-BUTTON`),c=class extends e.c{constructor(...e){super(...e),this.novalidate=!0,this._fields=new Set,this._submitting=!1,this._liveStatus=`idle`,this._liveError=``,this._internals=(()=>{try{return this.attachInternals()}catch{return}})()}static{this.tagName=`schmancy-form`}connectedCallback(){super.connectedCallback(),this.parentElement?.closest(`schmancy-form`)||((0,r.fromEvent)(this,e.r).pipe((0,r.takeUntil)(this.disconnecting)).subscribe(e=>this._fields.add(e.detail)),(0,r.fromEvent)(this,`click`).pipe((0,r.takeUntil)(this.disconnecting)).subscribe(e=>this._maybeRequestSubmit(e)),(0,r.fromEvent)(this,`keydown`).pipe((0,r.takeUntil)(this.disconnecting)).subscribe(e=>{if(e.key!==`Enter`||e.shiftKey)return;let t=e.target;t?.tagName!==`TEXTAREA`&&(t?.isContentEditable||this._maybeRequestSubmit(e))}))}_maybeRequestSubmit(e){if(e.type===`click`){let t=e.composedPath();if(t.find(e=>s(e)&&e.getAttribute(`type`)===`reset`))return e.preventDefault(),void(this.shadowRoot?.querySelector(`form`))?.reset();if(!t.find(e=>s(e)&&e.getAttribute(`type`)===`submit`))return;e.preventDefault()}(this.shadowRoot?.querySelector(`form`))?.requestSubmit()}get _activeFields(){return[...this._fields].filter(e=>e.isConnected)}async _onSubmit(e){if(e.preventDefault(),e.stopPropagation(),this._submitting)return;this._activeFields.filter(e=>e.isValidating).length>0&&(this._broadcastStatus(`submitting`),await new Promise(e=>{let t=()=>{this._activeFields.every(e=>!e.isValidating)?e():requestAnimationFrame(t)};t()})),this._activeFields.forEach(e=>e.markSubmitted());let t=this._activeFields.every(e=>e.checkValidity()),n=o.value;if(!t)return o.set({...n,status:`error`,error:{message:`Validation failed`}}),this._broadcastStatus(`error`,`Validation failed. Please correct the highlighted fields.`),void this._activeFields.find(e=>e.error)?.focus();this._submitting=!0,o.set({...n,status:`submitting`,error:null,submitCount:n.submitCount+1}),this._broadcastStatus(`submitting`);let r=new FormData;for(let e of this._activeFields)for(let[t,n]of e.toFormEntries())r.append(t,n);let i=Object.fromEntries(r),a=this.schema?this.schema.parse(i):i,s=[];this.dispatchEvent(new CustomEvent(`submit`,{detail:{data:a,formData:r,until:e=>s.push(e)}}));try{await Promise.all(s),o.set({...o.value,status:`success`,error:null}),this._broadcastStatus(`success`)}catch(e){let t=e instanceof Error?e.message:String(e);o.set({...o.value,status:`error`,error:{message:t}}),this._broadcastStatus(`error`,t)}finally{this._submitting=!1}}_onReset(e){e.stopPropagation(),this._activeFields.forEach(e=>e.resetForm()),o.set({status:`idle`,error:null,submitCount:0}),this._broadcastStatus(`idle`),this.dispatchEvent(new CustomEvent(`reset`))}_broadcastStatus(e,t){this._liveStatus=e,this._liveError=t??``;let n=this._internals?.states;if(n){for(let e of[`submitting`,`success`,`error`,`idle`])n.delete(e);n.add(e)}e===`submitting`?this.setAttribute(`aria-busy`,`true`):this.removeAttribute(`aria-busy`),this.dispatchEvent(new CustomEvent(`formstate`,{detail:{...o.value},bubbles:!0,composed:!0}))}setFieldError(e,t){let n=this._activeFields.find(t=>t.name===e);return!!n&&(n.setCustomValidity(t),n.markSubmitted(),!0)}setFormError(e,t){o.set({...o.value,status:`error`,error:{message:e,code:t}}),this._broadcastStatus(`error`,e)}clearSubmitted(){this._activeFields.forEach(e=>e.clearSubmitted()),o.set({...o.value,status:`idle`,error:null}),this._broadcastStatus(`idle`)}submit(){let e=this.shadowRoot?.querySelector(`form`);return!!e&&(e.requestSubmit(),!0)}reset(){(this.shadowRoot?.querySelector(`form`))?.reset()}reportValidity(){return this._activeFields.every(e=>e.reportValidity())}checkValidity(){return this._activeFields.every(e=>e.checkValidity())}getFormData(){let e=new FormData;for(let t of this._activeFields)for(let[n,r]of t.toFormEntries())e.append(n,r);return e}render(){return a.html`
2
2
  <schmancy-context .provides=${[o]}>
3
3
  <form
4
4
  ?novalidate=${this.novalidate}
@@ -1 +1 @@
1
- {"version":3,"file":"form-ha3df3K7.cjs","names":[],"sources":["../src/form/form-state.ts","../src/form/form.ts","../src/form/form-summary.ts"],"sourcesContent":["/**\n * Form-level submit state — consumed by `<schmancy-form>` and any descendant\n * (e.g. `<schmancy-button type=\"submit\">` to drive its loading/aria-busy).\n *\n * `<schmancy-form>` wraps its render output in `<schmancy-context\n * .provides=${[formSubmitState]}>` so each instance gets an isolated copy\n * via the schmancy state library's resolveContextual mechanism. Reads of\n * `formSubmitState.value` and writes via `formSubmitState.set(...)` inside\n * the form's subtree resolve to the per-form copy automatically — no\n * `@lit/context` plumbing in user code.\n */\n\nimport { state } from '../state'\n\nexport type FormError = {\n\tmessage: string\n\tcode?: string\n}\n\nexport type FormSubmitState = {\n\tstatus: 'idle' | 'submitting' | 'success' | 'error'\n\terror: FormError | null\n\t/** Increments on every submit attempt — RHF parity. */\n\tsubmitCount: number\n}\n\nexport const formSubmitState = state<FormSubmitState>('schmancy/form-submit').memory({\n\tstatus: 'idle',\n\terror: null,\n\tsubmitCount: 0,\n})\n","/**\n * `<schmancy-form>` — schmancy form owner with isolated submit state.\n *\n * Architecture:\n * - Extends `SchmancyElement` (shadow DOM, RxJS + `disconnecting` conventions).\n * - Renders content inside `<schmancy-context .provides=${[formSubmitState]}>`\n * so each form instance gets an isolated copy of the submit state via the\n * schmancy state library — no `@lit/context` plumbing in user code.\n * - Inner `<form novalidate>` is the native-semantics trigger for Enter-key\n * submit and `type=submit` button activation.\n * - Fields self-register via `FIELD_CONNECT_EVENT` (composed event from\n * `FormFieldMixin.connectedCallback`). Stale refs (from disconnected\n * fields) are filtered by `isConnected` at iteration time.\n *\n * Schema seam — pass any `{ parse(input): T }` object (zod, valibot, ArkType,\n * etc.) via the `schema` property to get typed `submit` event detail.\n */\n\nimport { html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { fromEvent, takeUntil } from 'rxjs'\nimport { SchmancyElement } from '../../mixins'\nimport { FIELD_CONNECT_EVENT, type IFormFieldMixin } from '../../mixins/formField.mixin'\nimport { formSubmitState, type FormSubmitState, type FormError } from './form-state'\n\n/** Structural type matching zod, valibot, ArkType, etc. — any schema with `.parse()`. */\nexport interface ParseSchema<T = unknown> {\n\tparse(input: unknown): T\n}\n\nconst isButton = (node: EventTarget): node is HTMLElement => {\n\tif (!(node instanceof HTMLElement)) return false\n\treturn node.tagName === 'BUTTON' || node.tagName === 'SCHMANCY-BUTTON'\n}\n\n/** Submit event detail. `data` is typed when `schema` is set. */\nexport type SchmancyFormSubmitDetail<T = Record<string, FormDataEntryValue>> = {\n\tdata: T\n\tformData: FormData\n\t/**\n\t * Register a promise that gates the form's success/error state. If unused,\n\t * the form synchronously flips to `success` after dispatch. If used,\n\t * `success`/`error` reflect the promise's outcome.\n\t */\n\tuntil(p: Promise<unknown>): void\n}\n\n@customElement('schmancy-form')\nexport default class SchmancyForm<TSchema extends ParseSchema | undefined = undefined>\n\textends SchmancyElement {\n\tpublic static readonly tagName: string = 'schmancy-form'\n\n\t/**\n\t * Optional schema for parsing FormData on submit. Anything with a\n\t * `.parse(input)` method works (zod, valibot, ArkType). When set, the\n\t * `submit` event's `detail.data` is typed `z.infer<TSchema>`.\n\t */\n\t@property({ attribute: false })\n\tschema?: TSchema\n\n\t/** Skip built-in browser constraint validation. Mirrors `<form novalidate>`. */\n\t@property({ type: Boolean })\n\tnovalidate: boolean = true\n\n\tprivate _fields = new Set<IFormFieldMixin>()\n\tprivate _submitting = false\n\n\t/**\n\t * Local mirror of the submit-state status — drives the inline live region\n\t * synchronously. Independent of the schmancy-state library's resolution\n\t * chain (which has known cross-await fallback semantics) so the AT-facing\n\t * announcement is always correct for this form instance.\n\t */\n\t@state() private _liveStatus: 'idle' | 'submitting' | 'success' | 'error' = 'idle'\n\t@state() private _liveError: string = ''\n\tprivate _internals: ElementInternals | undefined = (() => {\n\t\ttry {\n\t\t\treturn this.attachInternals()\n\t\t} catch {\n\t\t\treturn undefined\n\t\t}\n\t})()\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback()\n\n\t\t// Forbid nested <schmancy-form>.\n\t\tif (this.parentElement?.closest('schmancy-form')) {\n\t\t\tconsole.error('[schmancy-form] nested <schmancy-form> is not supported')\n\t\t\treturn\n\t\t}\n\n\t\t// Field registry — composed event from FormFieldMixin.connectedCallback.\n\t\tfromEvent<CustomEvent<IFormFieldMixin>>(this, FIELD_CONNECT_EVENT)\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(e => this._fields.add(e.detail))\n\n\t\t// Submit-trigger interception — slotted descendants live in light DOM\n\t\t// while the inner <form> is in shadow DOM, so native form-association\n\t\t// across the shadow boundary doesn't work for `<button type=submit>`.\n\t\t// Capture clicks on type=submit buttons (native + schmancy-button) and\n\t\t// Enter keys on registered fields, then call the inner form's\n\t\t// requestSubmit() which fires the same native submit event handler\n\t\t// chain that a directly-associated button would have triggered.\n\t\tfromEvent<MouseEvent>(this, 'click')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(e => this._maybeRequestSubmit(e))\n\t\tfromEvent<KeyboardEvent>(this, 'keydown')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(e => {\n\t\t\t\tif (e.key !== 'Enter' || e.shiftKey) return\n\t\t\t\t// Skip Enter inside <textarea> (newline) and contenteditable.\n\t\t\t\tconst target = e.target as HTMLElement | null\n\t\t\t\tif (target?.tagName === 'TEXTAREA') return\n\t\t\t\tif (target?.isContentEditable) return\n\t\t\t\tthis._maybeRequestSubmit(e)\n\t\t\t})\n\t}\n\n\tprivate _maybeRequestSubmit(e: Event): void {\n\t\t// On click: trigger only when the target is a type=submit button.\n\t\t// On keydown(Enter): always trigger if focus is on a registered field.\n\t\t// type=reset is handled separately in _maybeReset.\n\t\tif (e.type === 'click') {\n\t\t\tconst path = e.composedPath()\n\t\t\tconst resetBtn = path.find(\n\t\t\t\tnode => isButton(node) && node.getAttribute('type') === 'reset',\n\t\t\t)\n\t\t\tif (resetBtn) {\n\t\t\t\te.preventDefault()\n\t\t\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\t\t\tform?.reset()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst submitBtn = path.find(\n\t\t\t\tnode => isButton(node) && node.getAttribute('type') === 'submit',\n\t\t\t)\n\t\t\tif (!submitBtn) return\n\t\t\te.preventDefault()\n\t\t}\n\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\tform?.requestSubmit()\n\t}\n\n\t/** Active fields — drops stale refs from disconnected nodes. */\n\tprivate get _activeFields(): IFormFieldMixin[] {\n\t\treturn [...this._fields].filter(f => f.isConnected)\n\t}\n\n\tprivate async _onSubmit(e: SubmitEvent): Promise<void> {\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\t\tif (this._submitting) return\n\n\t\t// If any field has an async validator pending, wait for them all to\n\t\t// settle before deciding validity. This is the hard-block model: the\n\t\t// user clicks submit, the form holds (aria-busy=\"true\"), waits for\n\t\t// validators, then proceeds with the truth they reported.\n\t\tconst pendingValidators = this._activeFields.filter(f => f.isValidating)\n\t\tif (pendingValidators.length > 0) {\n\t\t\tthis._broadcastStatus('submitting')\n\t\t\tawait new Promise<void>(resolve => {\n\t\t\t\tconst tick = () => {\n\t\t\t\t\tif (this._activeFields.every(f => !f.isValidating)) resolve()\n\t\t\t\t\telse requestAnimationFrame(tick)\n\t\t\t\t}\n\t\t\t\ttick()\n\t\t\t})\n\t\t}\n\n\t\t// Phase 4 — submit forces error display on every field.\n\t\tthis._activeFields.forEach(f => f.markSubmitted())\n\n\t\t// Validate; success path entered ONLY if all valid.\n\t\tconst allValid = this._activeFields.every(f => f.checkValidity())\n\t\tconst fs = formSubmitState.value\n\t\tif (!allValid) {\n\t\t\tformSubmitState.set({\n\t\t\t\t...fs,\n\t\t\t\tstatus: 'error',\n\t\t\t\terror: { message: 'Validation failed' },\n\t\t\t})\n\t\t\tthis._broadcastStatus('error', 'Validation failed. Please correct the highlighted fields.')\n\t\t\tconst firstInvalid = this._activeFields.find(f => f.error) as unknown as\n\t\t\t\t| HTMLElement\n\t\t\t\t| undefined\n\t\t\tfirstInvalid?.focus()\n\t\t\treturn\n\t\t}\n\n\t\tthis._submitting = true\n\t\tformSubmitState.set({\n\t\t\t...fs,\n\t\t\tstatus: 'submitting',\n\t\t\terror: null,\n\t\t\tsubmitCount: fs.submitCount + 1,\n\t\t})\n\t\tthis._broadcastStatus('submitting')\n\n\t\t// Build payload from the registered fields' contracted toFormEntries().\n\t\tconst formData = new FormData()\n\t\tfor (const field of this._activeFields) {\n\t\t\tfor (const [k, v] of field.toFormEntries()) formData.append(k, v)\n\t\t}\n\t\tconst raw = Object.fromEntries(formData)\n\t\tconst data = this.schema ? this.schema.parse(raw) : raw\n\n\t\t// Awaitable submit — consumers register promises via e.detail.until(p).\n\t\tconst pending: Promise<unknown>[] = []\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent<SchmancyFormSubmitDetail<unknown>>('submit', {\n\t\t\t\tdetail: {\n\t\t\t\t\tdata,\n\t\t\t\t\tformData,\n\t\t\t\t\tuntil: (p: Promise<unknown>) => pending.push(p),\n\t\t\t\t},\n\t\t\t}),\n\t\t)\n\n\t\ttry {\n\t\t\tawait Promise.all(pending)\n\t\t\tformSubmitState.set({\n\t\t\t\t...formSubmitState.value,\n\t\t\t\tstatus: 'success',\n\t\t\t\terror: null,\n\t\t\t})\n\t\t\tthis._broadcastStatus('success')\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err)\n\t\t\tformSubmitState.set({\n\t\t\t\t...formSubmitState.value,\n\t\t\t\tstatus: 'error',\n\t\t\t\terror: { message },\n\t\t\t})\n\t\t\tthis._broadcastStatus('error', message)\n\t\t} finally {\n\t\t\tthis._submitting = false\n\t\t}\n\t}\n\n\tprivate _onReset(e: Event): void {\n\t\te.stopPropagation()\n\t\tthis._activeFields.forEach(f => f.resetForm())\n\t\tformSubmitState.set({ status: 'idle', error: null, submitCount: 0 })\n\t\tthis._broadcastStatus('idle')\n\t\tthis.dispatchEvent(new CustomEvent('reset'))\n\t}\n\n\tprivate _broadcastStatus(status: FormSubmitState['status'], errorMessage?: string): void {\n\t\tthis._liveStatus = status\n\t\tthis._liveError = errorMessage ?? ''\n\t\tconst states = this._internals?.states\n\t\tif (states) {\n\t\t\tfor (const s of ['submitting', 'success', 'error', 'idle']) states.delete(s)\n\t\t\tstates.add(status)\n\t\t}\n\t\t// aria-busy on the host while submitting (WCAG 2.2 AA — disabled buttons\n\t\t// drop from tab order; keep them focusable, signal busy via aria).\n\t\tif (status === 'submitting') this.setAttribute('aria-busy', 'true')\n\t\telse this.removeAttribute('aria-busy')\n\t\t// Public formstate event — external state stores subscribe without\n\t\t// having to consume formSubmitState directly.\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent<FormSubmitState>('formstate', {\n\t\t\t\tdetail: { ...formSubmitState.value },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\t/**\n\t * Server-side error mapping (RHF `setError(name, ...)`-equivalent).\n\t * Sets `setCustomValidity(message)` on the matching field and ensures the\n\t * error displays by marking it submitted.\n\t */\n\tpublic setFieldError(name: string, message: string): boolean {\n\t\tconst field = this._activeFields.find(f => f.name === name)\n\t\tif (!field) return false\n\t\tfield.setCustomValidity(message)\n\t\tfield.markSubmitted()\n\t\treturn true\n\t}\n\n\t/**\n\t * Top-of-form error (RHF `setError('root.serverError', ...)`-equivalent).\n\t * Flips form status to 'error' with a structured `FormError`.\n\t */\n\tpublic setFormError(message: string, code?: string): void {\n\t\tformSubmitState.set({\n\t\t\t...formSubmitState.value,\n\t\t\tstatus: 'error',\n\t\t\terror: { message, code } as FormError,\n\t\t})\n\t\tthis._broadcastStatus('error', message)\n\t}\n\n\t/**\n\t * Clear the `submitted` flag on every registered field without resetting\n\t * their values. Wizard pattern: stepping back from a later step should not\n\t * leave the earlier step's fields in aggressive \"show all errors\" mode\n\t * (which `submitted = true` triggers via the `_shouldShowError()` gate).\n\t *\n\t * Pristine fields with `validateOn: 'dirty'` go quiet again. Fields the\n\t * user actually dirtied keep showing their errors (correct UX — those are\n\t * still genuine mistakes the user can see).\n\t */\n\tpublic clearSubmitted(): void {\n\t\tthis._activeFields.forEach(f => f.clearSubmitted())\n\t\tformSubmitState.set({\n\t\t\t...formSubmitState.value,\n\t\t\tstatus: 'idle',\n\t\t\terror: null,\n\t\t})\n\t\tthis._broadcastStatus('idle')\n\t}\n\n\t/** Programmatically submit via the native submitter pipeline. */\n\tpublic submit(): boolean {\n\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\tif (!form) return false\n\t\tform.requestSubmit()\n\t\treturn true\n\t}\n\n\t/** Programmatically reset via native `form.reset()`. */\n\tpublic reset(): void {\n\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\tform?.reset()\n\t}\n\n\tpublic reportValidity(): boolean {\n\t\treturn this._activeFields.every(f => f.reportValidity())\n\t}\n\n\tpublic checkValidity(): boolean {\n\t\treturn this._activeFields.every(f => f.checkValidity())\n\t}\n\n\t/** Snapshot of current form values from the registered fields. */\n\tpublic getFormData(): FormData {\n\t\tconst formData = new FormData()\n\t\tfor (const field of this._activeFields) {\n\t\t\tfor (const [k, v] of field.toFormEntries()) formData.append(k, v)\n\t\t}\n\t\treturn formData\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<schmancy-context .provides=${[formSubmitState]}>\n\t\t\t\t<form\n\t\t\t\t\t?novalidate=${this.novalidate}\n\t\t\t\t\t@submit=${this._onSubmit}\n\t\t\t\t\t@reset=${this._onReset}\n\t\t\t\t>\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</form>\n\t\t\t\t<!--\n\t\t\t\t\tForm-level live region — assistive tech announces server-side\n\t\t\t\t\tform errors (validation summary, network failure, server reject)\n\t\t\t\t\there. Visually hidden via the .sr-only convention; consumers\n\t\t\t\t\trender their own visible banner from formSubmitState if they\n\t\t\t\t\twant one. Empty content while idle/submitting/success — only\n\t\t\t\t\terror states populate the region. WCAG 4.1.3 (Status Messages).\n\t\t\t\t-->\n\t\t\t\t<div\n\t\t\t\t\trole=\"status\"\n\t\t\t\t\taria-live=\"assertive\"\n\t\t\t\t\taria-atomic=\"true\"\n\t\t\t\t\tclass=\"sr-only\"\n\t\t\t\t>${this._liveStatus === 'error' ? this._liveError : ''}</div>\n\t\t\t</schmancy-context>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-form': SchmancyForm\n\t}\n}\n\n// Retained type surfaces — kept exported because downstream code may import\n// them as documentation. The new implementation no longer uses them\n// internally.\n\nexport interface FormElement extends HTMLElement {\n\tname?: string\n\tvalue?: string\n\tdisabled?: boolean\n\ttype?: string\n\tdefaultValue?: string\n}\n\nexport interface CheckableFormElement extends FormElement {\n\tchecked?: boolean\n}\n\nexport interface ValidatableFormElement extends FormElement {\n\treportValidity?: () => boolean\n\tcheckValidity?: () => boolean\n}\n\nexport interface FormEventMap {\n\tsubmit: CustomEvent<SchmancyFormSubmitDetail<unknown>>\n\treset: CustomEvent\n\tformstate: CustomEvent<FormSubmitState>\n}\n","/**\n * `<schmancy-form-summary>` — top-of-form error summary with anchor links to\n * each invalid field. Linear / GOV.UK / GitHub pattern.\n *\n * Drop one inside any `<schmancy-form>`; on submit-failure or when\n * `<schmancy-form>.setFormError(...)` is called, the summary renders a\n * `role=\"alert\"` banner with the form-level error message and a list of\n * links pointing at each invalid field's `id`.\n *\n * Hidden when the form is idle, submitting, or successful — only `error`\n * populates it.\n *\n * @element schmancy-form-summary\n */\n\nimport { html, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { SchmancyElement } from '../../mixins'\nimport type SchmancyForm from './form'\n\n@customElement('schmancy-form-summary')\nexport class SchmancyFormSummary extends SchmancyElement {\n\t/**\n\t * Optional heading text. Defaults to a count-based summary\n\t * (\"1 problem with this form\" / \"3 problems with this form\").\n\t */\n\t@property({ type: String }) heading?: string\n\n\t/**\n\t * Render bumper — incremented to force a re-render when the form's state\n\t * changes (the actual content is computed from the DOM in render()).\n\t */\n\t@state() private _bump: number = 0\n\n\tprivate _form: SchmancyForm | null = null\n\tprivate _formObserver?: MutationObserver\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback()\n\t\tthis._form = this.closest('schmancy-form') as SchmancyForm | null\n\t\tif (!this._form) {\n\t\t\tconsole.error('[schmancy-form-summary] must be a descendant of <schmancy-form>')\n\t\t\treturn\n\t\t}\n\t\tconst bump = () => { this._bump++ }\n\t\tthis._formObserver = new MutationObserver(bump)\n\t\t// Form host attribute changes (aria-busy, :state class reflections,\n\t\t// descendant attribute changes for fields' aria-invalid). subtree:true\n\t\t// catches attribute mutations on every descendant including light-DOM\n\t\t// fields and the form's own host.\n\t\tthis._formObserver.observe(this._form, {\n\t\t\tattributes: true,\n\t\t\tsubtree: true,\n\t\t})\n\t\t// Defer live-region observation until the form has rendered its\n\t\t// shadow tree.\n\t\tconst attachLiveRegionObserver = async (): Promise<void> => {\n\t\t\tawait this._form?.updateComplete\n\t\t\tconst liveRegion = this._form?.shadowRoot?.querySelector('[role=\"status\"]')\n\t\t\tif (liveRegion) {\n\t\t\t\tthis._formObserver?.observe(liveRegion, {\n\t\t\t\t\tchildList: true,\n\t\t\t\t\tcharacterData: true,\n\t\t\t\t\tsubtree: true,\n\t\t\t\t})\n\t\t\t}\n\t\t\t// Force a render so the initial state is reflected.\n\t\t\tthis._bump++\n\t\t}\n\t\tvoid attachLiveRegionObserver()\n\t}\n\n\toverride disconnectedCallback(): void {\n\t\tthis._formObserver?.disconnect()\n\t\tthis._formObserver = undefined\n\t\tsuper.disconnectedCallback()\n\t}\n\n\tprivate _readFormStatus(): 'idle' | 'submitting' | 'success' | 'error' {\n\t\tif (!this._form) return 'idle'\n\t\tif (this._form.matches(':state(error)')) return 'error'\n\t\tif (this._form.matches(':state(submitting)')) return 'submitting'\n\t\tif (this._form.matches(':state(success)')) return 'success'\n\t\treturn 'idle'\n\t}\n\n\tprivate _readFormMessage(): string {\n\t\tconst liveRegion = this._form?.shadowRoot?.querySelector('[role=\"status\"]')\n\t\treturn liveRegion?.textContent?.trim() ?? ''\n\t}\n\n\tprivate _readInvalidFields(): Array<{ id: string; label: string; message: string }> {\n\t\tif (!this._form) return []\n\t\tconst result: Array<{ id: string; label: string; message: string }> = []\n\t\tfor (const el of Array.from(this._form.querySelectorAll('*'))) {\n\t\t\tif (!(el instanceof HTMLElement)) continue\n\t\t\tlet isInvalid = false\n\t\t\ttry {\n\t\t\t\tisInvalid = el.matches(':state(invalid)')\n\t\t\t} catch {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!isInvalid) continue\n\t\t\tconst f = el as HTMLElement & {\n\t\t\t\tlabel?: string\n\t\t\t\tname?: string\n\t\t\t\tvalidationMessage?: string\n\t\t\t}\n\t\t\tresult.push({\n\t\t\t\tid: f.id,\n\t\t\t\tlabel: f.label || f.name || '(field)',\n\t\t\t\tmessage: f.validationMessage || 'Invalid value',\n\t\t\t})\n\t\t}\n\t\treturn result\n\t}\n\n\trender() {\n\t\t// Read everything fresh from the DOM each render — no @state cache, no\n\t\t// re-render loops. The MutationObserver bumps `_bump` to trigger this\n\t\t// render; `_bump` itself is never read here.\n\t\tvoid this._bump\n\n\t\tconst status = this._readFormStatus()\n\t\tif (status !== 'error') return nothing\n\n\t\tconst formMessage = this._readFormMessage()\n\t\tconst invalid = this._readInvalidFields()\n\t\tconst count = invalid.length\n\t\tconst heading =\n\t\t\tthis.heading ??\n\t\t\t(count === 0\n\t\t\t\t? 'There is a problem with this form'\n\t\t\t\t: `There ${count === 1 ? 'is' : 'are'} ${count} problem${count === 1 ? '' : 's'} with this form`)\n\n\t\treturn html`\n\t\t\t<div role=\"alert\" aria-labelledby=\"schmancy-form-summary-heading\">\n\t\t\t\t<h2 id=\"schmancy-form-summary-heading\">${heading}</h2>\n\t\t\t\t${formMessage ? html`<p>${formMessage}</p>` : nothing}\n\t\t\t\t${count > 0\n\t\t\t\t\t? html`\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t${invalid.map(\n\t\t\t\t\t\t\t\tf => html`\n\t\t\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\t\thref=\"#${f.id}\"\n\t\t\t\t\t\t\t\t\t\t\t@click=${(e: MouseEvent) => this._jumpToField(e, f.id)}\n\t\t\t\t\t\t\t\t\t\t>${f.label}: ${f.message}</a>\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t`\n\t\t\t\t\t: nothing}\n\t\t\t</div>\n\t\t`\n\t}\n\n\tprivate _jumpToField(e: MouseEvent, fieldId: string): void {\n\t\te.preventDefault()\n\t\tconst target = this._form?.querySelector(`#${CSS.escape(fieldId)}`) as HTMLElement | null\n\t\ttarget?.focus()\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-form-summary': SchmancyFormSummary\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"form-B90CMeqs.cjs","names":[],"sources":["../src/form/form-state.ts","../src/form/form.ts","../src/form/form-summary.ts"],"sourcesContent":["/**\n * Form-level submit state — consumed by `<schmancy-form>` and any descendant\n * (e.g. `<schmancy-button type=\"submit\">` to drive its loading/aria-busy).\n *\n * `<schmancy-form>` wraps its render output in `<schmancy-context\n * .provides=${[formSubmitState]}>` so each instance gets an isolated copy\n * via the schmancy state library's resolveContextual mechanism. Reads of\n * `formSubmitState.value` and writes via `formSubmitState.set(...)` inside\n * the form's subtree resolve to the per-form copy automatically — no\n * `@lit/context` plumbing in user code.\n */\n\nimport { state } from '../state'\n\nexport type FormError = {\n\tmessage: string\n\tcode?: string\n}\n\nexport type FormSubmitState = {\n\tstatus: 'idle' | 'submitting' | 'success' | 'error'\n\terror: FormError | null\n\t/** Increments on every submit attempt — RHF parity. */\n\tsubmitCount: number\n}\n\nexport const formSubmitState = state<FormSubmitState>('schmancy/form-submit').memory({\n\tstatus: 'idle',\n\terror: null,\n\tsubmitCount: 0,\n})\n","/**\n * `<schmancy-form>` — schmancy form owner with isolated submit state.\n *\n * Architecture:\n * - Extends `SchmancyElement` (shadow DOM, RxJS + `disconnecting` conventions).\n * - Renders content inside `<schmancy-context .provides=${[formSubmitState]}>`\n * so each form instance gets an isolated copy of the submit state via the\n * schmancy state library — no `@lit/context` plumbing in user code.\n * - Inner `<form novalidate>` is the native-semantics trigger for Enter-key\n * submit and `type=submit` button activation.\n * - Fields self-register via `FIELD_CONNECT_EVENT` (composed event from\n * `FormFieldMixin.connectedCallback`). Stale refs (from disconnected\n * fields) are filtered by `isConnected` at iteration time.\n *\n * Schema seam — pass any `{ parse(input): T }` object (zod, valibot, ArkType,\n * etc.) via the `schema` property to get typed `submit` event detail.\n */\n\nimport { html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { fromEvent, takeUntil } from 'rxjs'\nimport { SchmancyElement } from '../../mixins'\nimport { FIELD_CONNECT_EVENT, type IFormFieldMixin } from '../../mixins/formField.mixin'\nimport { formSubmitState, type FormSubmitState, type FormError } from './form-state'\n\n/** Structural type matching zod, valibot, ArkType, etc. — any schema with `.parse()`. */\nexport interface ParseSchema<T = unknown> {\n\tparse(input: unknown): T\n}\n\nconst isButton = (node: EventTarget): node is HTMLElement => {\n\tif (!(node instanceof HTMLElement)) return false\n\treturn node.tagName === 'BUTTON' || node.tagName === 'SCHMANCY-BUTTON'\n}\n\n/** Submit event detail. `data` is typed when `schema` is set. */\nexport type SchmancyFormSubmitDetail<T = Record<string, FormDataEntryValue>> = {\n\tdata: T\n\tformData: FormData\n\t/**\n\t * Register a promise that gates the form's success/error state. If unused,\n\t * the form synchronously flips to `success` after dispatch. If used,\n\t * `success`/`error` reflect the promise's outcome.\n\t */\n\tuntil(p: Promise<unknown>): void\n}\n\n@customElement('schmancy-form')\nexport default class SchmancyForm<TSchema extends ParseSchema | undefined = undefined>\n\textends SchmancyElement {\n\tpublic static readonly tagName: string = 'schmancy-form'\n\n\t/**\n\t * Optional schema for parsing FormData on submit. Anything with a\n\t * `.parse(input)` method works (zod, valibot, ArkType). When set, the\n\t * `submit` event's `detail.data` is typed `z.infer<TSchema>`.\n\t */\n\t@property({ attribute: false })\n\tschema?: TSchema\n\n\t/** Skip built-in browser constraint validation. Mirrors `<form novalidate>`. */\n\t@property({ type: Boolean })\n\tnovalidate: boolean = true\n\n\tprivate _fields = new Set<IFormFieldMixin>()\n\tprivate _submitting = false\n\n\t/**\n\t * Local mirror of the submit-state status — drives the inline live region\n\t * synchronously. Independent of the schmancy-state library's resolution\n\t * chain (which has known cross-await fallback semantics) so the AT-facing\n\t * announcement is always correct for this form instance.\n\t */\n\t@state() private _liveStatus: 'idle' | 'submitting' | 'success' | 'error' = 'idle'\n\t@state() private _liveError: string = ''\n\tprivate _internals: ElementInternals | undefined = (() => {\n\t\ttry {\n\t\t\treturn this.attachInternals()\n\t\t} catch {\n\t\t\treturn undefined\n\t\t}\n\t})()\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback()\n\n\t\t// Forbid nested <schmancy-form>.\n\t\tif (this.parentElement?.closest('schmancy-form')) {\n\t\t\tconsole.error('[schmancy-form] nested <schmancy-form> is not supported')\n\t\t\treturn\n\t\t}\n\n\t\t// Field registry — composed event from FormFieldMixin.connectedCallback.\n\t\tfromEvent<CustomEvent<IFormFieldMixin>>(this, FIELD_CONNECT_EVENT)\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(e => this._fields.add(e.detail))\n\n\t\t// Submit-trigger interception — slotted descendants live in light DOM\n\t\t// while the inner <form> is in shadow DOM, so native form-association\n\t\t// across the shadow boundary doesn't work for `<button type=submit>`.\n\t\t// Capture clicks on type=submit buttons (native + schmancy-button) and\n\t\t// Enter keys on registered fields, then call the inner form's\n\t\t// requestSubmit() which fires the same native submit event handler\n\t\t// chain that a directly-associated button would have triggered.\n\t\tfromEvent<MouseEvent>(this, 'click')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(e => this._maybeRequestSubmit(e))\n\t\tfromEvent<KeyboardEvent>(this, 'keydown')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(e => {\n\t\t\t\tif (e.key !== 'Enter' || e.shiftKey) return\n\t\t\t\t// Skip Enter inside <textarea> (newline) and contenteditable.\n\t\t\t\tconst target = e.target as HTMLElement | null\n\t\t\t\tif (target?.tagName === 'TEXTAREA') return\n\t\t\t\tif (target?.isContentEditable) return\n\t\t\t\tthis._maybeRequestSubmit(e)\n\t\t\t})\n\t}\n\n\tprivate _maybeRequestSubmit(e: Event): void {\n\t\t// On click: trigger only when the target is a type=submit button.\n\t\t// On keydown(Enter): always trigger if focus is on a registered field.\n\t\t// type=reset is handled separately in _maybeReset.\n\t\tif (e.type === 'click') {\n\t\t\tconst path = e.composedPath()\n\t\t\tconst resetBtn = path.find(\n\t\t\t\tnode => isButton(node) && node.getAttribute('type') === 'reset',\n\t\t\t)\n\t\t\tif (resetBtn) {\n\t\t\t\te.preventDefault()\n\t\t\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\t\t\tform?.reset()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst submitBtn = path.find(\n\t\t\t\tnode => isButton(node) && node.getAttribute('type') === 'submit',\n\t\t\t)\n\t\t\tif (!submitBtn) return\n\t\t\te.preventDefault()\n\t\t}\n\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\tform?.requestSubmit()\n\t}\n\n\t/** Active fields — drops stale refs from disconnected nodes. */\n\tprivate get _activeFields(): IFormFieldMixin[] {\n\t\treturn [...this._fields].filter(f => f.isConnected)\n\t}\n\n\tprivate async _onSubmit(e: SubmitEvent): Promise<void> {\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\t\tif (this._submitting) return\n\n\t\t// If any field has an async validator pending, wait for them all to\n\t\t// settle before deciding validity. This is the hard-block model: the\n\t\t// user clicks submit, the form holds (aria-busy=\"true\"), waits for\n\t\t// validators, then proceeds with the truth they reported.\n\t\tconst pendingValidators = this._activeFields.filter(f => f.isValidating)\n\t\tif (pendingValidators.length > 0) {\n\t\t\tthis._broadcastStatus('submitting')\n\t\t\tawait new Promise<void>(resolve => {\n\t\t\t\tconst tick = () => {\n\t\t\t\t\tif (this._activeFields.every(f => !f.isValidating)) resolve()\n\t\t\t\t\telse requestAnimationFrame(tick)\n\t\t\t\t}\n\t\t\t\ttick()\n\t\t\t})\n\t\t}\n\n\t\t// Phase 4 — submit forces error display on every field.\n\t\tthis._activeFields.forEach(f => f.markSubmitted())\n\n\t\t// Validate; success path entered ONLY if all valid.\n\t\tconst allValid = this._activeFields.every(f => f.checkValidity())\n\t\tconst fs = formSubmitState.value\n\t\tif (!allValid) {\n\t\t\tformSubmitState.set({\n\t\t\t\t...fs,\n\t\t\t\tstatus: 'error',\n\t\t\t\terror: { message: 'Validation failed' },\n\t\t\t})\n\t\t\tthis._broadcastStatus('error', 'Validation failed. Please correct the highlighted fields.')\n\t\t\tconst firstInvalid = this._activeFields.find(f => f.error) as unknown as\n\t\t\t\t| HTMLElement\n\t\t\t\t| undefined\n\t\t\tfirstInvalid?.focus()\n\t\t\treturn\n\t\t}\n\n\t\tthis._submitting = true\n\t\tformSubmitState.set({\n\t\t\t...fs,\n\t\t\tstatus: 'submitting',\n\t\t\terror: null,\n\t\t\tsubmitCount: fs.submitCount + 1,\n\t\t})\n\t\tthis._broadcastStatus('submitting')\n\n\t\t// Build payload from the registered fields' contracted toFormEntries().\n\t\tconst formData = new FormData()\n\t\tfor (const field of this._activeFields) {\n\t\t\tfor (const [k, v] of field.toFormEntries()) formData.append(k, v)\n\t\t}\n\t\tconst raw = Object.fromEntries(formData)\n\t\tconst data = this.schema ? this.schema.parse(raw) : raw\n\n\t\t// Awaitable submit — consumers register promises via e.detail.until(p).\n\t\tconst pending: Promise<unknown>[] = []\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent<SchmancyFormSubmitDetail<unknown>>('submit', {\n\t\t\t\tdetail: {\n\t\t\t\t\tdata,\n\t\t\t\t\tformData,\n\t\t\t\t\tuntil: (p: Promise<unknown>) => pending.push(p),\n\t\t\t\t},\n\t\t\t}),\n\t\t)\n\n\t\ttry {\n\t\t\tawait Promise.all(pending)\n\t\t\tformSubmitState.set({\n\t\t\t\t...formSubmitState.value,\n\t\t\t\tstatus: 'success',\n\t\t\t\terror: null,\n\t\t\t})\n\t\t\tthis._broadcastStatus('success')\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err)\n\t\t\tformSubmitState.set({\n\t\t\t\t...formSubmitState.value,\n\t\t\t\tstatus: 'error',\n\t\t\t\terror: { message },\n\t\t\t})\n\t\t\tthis._broadcastStatus('error', message)\n\t\t} finally {\n\t\t\tthis._submitting = false\n\t\t}\n\t}\n\n\tprivate _onReset(e: Event): void {\n\t\te.stopPropagation()\n\t\tthis._activeFields.forEach(f => f.resetForm())\n\t\tformSubmitState.set({ status: 'idle', error: null, submitCount: 0 })\n\t\tthis._broadcastStatus('idle')\n\t\tthis.dispatchEvent(new CustomEvent('reset'))\n\t}\n\n\tprivate _broadcastStatus(status: FormSubmitState['status'], errorMessage?: string): void {\n\t\tthis._liveStatus = status\n\t\tthis._liveError = errorMessage ?? ''\n\t\tconst states = this._internals?.states\n\t\tif (states) {\n\t\t\tfor (const s of ['submitting', 'success', 'error', 'idle']) states.delete(s)\n\t\t\tstates.add(status)\n\t\t}\n\t\t// aria-busy on the host while submitting (WCAG 2.2 AA — disabled buttons\n\t\t// drop from tab order; keep them focusable, signal busy via aria).\n\t\tif (status === 'submitting') this.setAttribute('aria-busy', 'true')\n\t\telse this.removeAttribute('aria-busy')\n\t\t// Public formstate event — external state stores subscribe without\n\t\t// having to consume formSubmitState directly.\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent<FormSubmitState>('formstate', {\n\t\t\t\tdetail: { ...formSubmitState.value },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\t/**\n\t * Server-side error mapping (RHF `setError(name, ...)`-equivalent).\n\t * Sets `setCustomValidity(message)` on the matching field and ensures the\n\t * error displays by marking it submitted.\n\t */\n\tpublic setFieldError(name: string, message: string): boolean {\n\t\tconst field = this._activeFields.find(f => f.name === name)\n\t\tif (!field) return false\n\t\tfield.setCustomValidity(message)\n\t\tfield.markSubmitted()\n\t\treturn true\n\t}\n\n\t/**\n\t * Top-of-form error (RHF `setError('root.serverError', ...)`-equivalent).\n\t * Flips form status to 'error' with a structured `FormError`.\n\t */\n\tpublic setFormError(message: string, code?: string): void {\n\t\tformSubmitState.set({\n\t\t\t...formSubmitState.value,\n\t\t\tstatus: 'error',\n\t\t\terror: { message, code } as FormError,\n\t\t})\n\t\tthis._broadcastStatus('error', message)\n\t}\n\n\t/**\n\t * Clear the `submitted` flag on every registered field without resetting\n\t * their values. Wizard pattern: stepping back from a later step should not\n\t * leave the earlier step's fields in aggressive \"show all errors\" mode\n\t * (which `submitted = true` triggers via the `_shouldShowError()` gate).\n\t *\n\t * Pristine fields with `validateOn: 'dirty'` go quiet again. Fields the\n\t * user actually dirtied keep showing their errors (correct UX — those are\n\t * still genuine mistakes the user can see).\n\t */\n\tpublic clearSubmitted(): void {\n\t\tthis._activeFields.forEach(f => f.clearSubmitted())\n\t\tformSubmitState.set({\n\t\t\t...formSubmitState.value,\n\t\t\tstatus: 'idle',\n\t\t\terror: null,\n\t\t})\n\t\tthis._broadcastStatus('idle')\n\t}\n\n\t/** Programmatically submit via the native submitter pipeline. */\n\tpublic submit(): boolean {\n\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\tif (!form) return false\n\t\tform.requestSubmit()\n\t\treturn true\n\t}\n\n\t/** Programmatically reset via native `form.reset()`. */\n\tpublic reset(): void {\n\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\tform?.reset()\n\t}\n\n\tpublic reportValidity(): boolean {\n\t\treturn this._activeFields.every(f => f.reportValidity())\n\t}\n\n\tpublic checkValidity(): boolean {\n\t\treturn this._activeFields.every(f => f.checkValidity())\n\t}\n\n\t/** Snapshot of current form values from the registered fields. */\n\tpublic getFormData(): FormData {\n\t\tconst formData = new FormData()\n\t\tfor (const field of this._activeFields) {\n\t\t\tfor (const [k, v] of field.toFormEntries()) formData.append(k, v)\n\t\t}\n\t\treturn formData\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<schmancy-context .provides=${[formSubmitState]}>\n\t\t\t\t<form\n\t\t\t\t\t?novalidate=${this.novalidate}\n\t\t\t\t\t@submit=${this._onSubmit}\n\t\t\t\t\t@reset=${this._onReset}\n\t\t\t\t>\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</form>\n\t\t\t\t<!--\n\t\t\t\t\tForm-level live region — assistive tech announces server-side\n\t\t\t\t\tform errors (validation summary, network failure, server reject)\n\t\t\t\t\there. Visually hidden via the .sr-only convention; consumers\n\t\t\t\t\trender their own visible banner from formSubmitState if they\n\t\t\t\t\twant one. Empty content while idle/submitting/success — only\n\t\t\t\t\terror states populate the region. WCAG 4.1.3 (Status Messages).\n\t\t\t\t-->\n\t\t\t\t<div\n\t\t\t\t\trole=\"status\"\n\t\t\t\t\taria-live=\"assertive\"\n\t\t\t\t\taria-atomic=\"true\"\n\t\t\t\t\tclass=\"sr-only\"\n\t\t\t\t>${this._liveStatus === 'error' ? this._liveError : ''}</div>\n\t\t\t</schmancy-context>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-form': SchmancyForm\n\t}\n}\n\n// Retained type surfaces — kept exported because downstream code may import\n// them as documentation. The new implementation no longer uses them\n// internally.\n\nexport interface FormElement extends HTMLElement {\n\tname?: string\n\tvalue?: string\n\tdisabled?: boolean\n\ttype?: string\n\tdefaultValue?: string\n}\n\nexport interface CheckableFormElement extends FormElement {\n\tchecked?: boolean\n}\n\nexport interface ValidatableFormElement extends FormElement {\n\treportValidity?: () => boolean\n\tcheckValidity?: () => boolean\n}\n\nexport interface FormEventMap {\n\tsubmit: CustomEvent<SchmancyFormSubmitDetail<unknown>>\n\treset: CustomEvent\n\tformstate: CustomEvent<FormSubmitState>\n}\n","/**\n * `<schmancy-form-summary>` — top-of-form error summary with anchor links to\n * each invalid field. Linear / GOV.UK / GitHub pattern.\n *\n * Drop one inside any `<schmancy-form>`; on submit-failure or when\n * `<schmancy-form>.setFormError(...)` is called, the summary renders a\n * `role=\"alert\"` banner with the form-level error message and a list of\n * links pointing at each invalid field's `id`.\n *\n * Hidden when the form is idle, submitting, or successful — only `error`\n * populates it.\n *\n * @element schmancy-form-summary\n */\n\nimport { html, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { SchmancyElement } from '../../mixins'\nimport type SchmancyForm from './form'\n\n@customElement('schmancy-form-summary')\nexport class SchmancyFormSummary extends SchmancyElement {\n\t/**\n\t * Optional heading text. Defaults to a count-based summary\n\t * (\"1 problem with this form\" / \"3 problems with this form\").\n\t */\n\t@property({ type: String }) heading?: string\n\n\t/**\n\t * Render bumper — incremented to force a re-render when the form's state\n\t * changes (the actual content is computed from the DOM in render()).\n\t */\n\t@state() private _bump: number = 0\n\n\tprivate _form: SchmancyForm | null = null\n\tprivate _formObserver?: MutationObserver\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback()\n\t\tthis._form = this.closest('schmancy-form') as SchmancyForm | null\n\t\tif (!this._form) {\n\t\t\tconsole.error('[schmancy-form-summary] must be a descendant of <schmancy-form>')\n\t\t\treturn\n\t\t}\n\t\tconst bump = () => { this._bump++ }\n\t\tthis._formObserver = new MutationObserver(bump)\n\t\t// Form host attribute changes (aria-busy, :state class reflections,\n\t\t// descendant attribute changes for fields' aria-invalid). subtree:true\n\t\t// catches attribute mutations on every descendant including light-DOM\n\t\t// fields and the form's own host.\n\t\tthis._formObserver.observe(this._form, {\n\t\t\tattributes: true,\n\t\t\tsubtree: true,\n\t\t})\n\t\t// Defer live-region observation until the form has rendered its\n\t\t// shadow tree.\n\t\tconst attachLiveRegionObserver = async (): Promise<void> => {\n\t\t\tawait this._form?.updateComplete\n\t\t\tconst liveRegion = this._form?.shadowRoot?.querySelector('[role=\"status\"]')\n\t\t\tif (liveRegion) {\n\t\t\t\tthis._formObserver?.observe(liveRegion, {\n\t\t\t\t\tchildList: true,\n\t\t\t\t\tcharacterData: true,\n\t\t\t\t\tsubtree: true,\n\t\t\t\t})\n\t\t\t}\n\t\t\t// Force a render so the initial state is reflected.\n\t\t\tthis._bump++\n\t\t}\n\t\tvoid attachLiveRegionObserver()\n\t}\n\n\toverride disconnectedCallback(): void {\n\t\tthis._formObserver?.disconnect()\n\t\tthis._formObserver = undefined\n\t\tsuper.disconnectedCallback()\n\t}\n\n\tprivate _readFormStatus(): 'idle' | 'submitting' | 'success' | 'error' {\n\t\tif (!this._form) return 'idle'\n\t\tif (this._form.matches(':state(error)')) return 'error'\n\t\tif (this._form.matches(':state(submitting)')) return 'submitting'\n\t\tif (this._form.matches(':state(success)')) return 'success'\n\t\treturn 'idle'\n\t}\n\n\tprivate _readFormMessage(): string {\n\t\tconst liveRegion = this._form?.shadowRoot?.querySelector('[role=\"status\"]')\n\t\treturn liveRegion?.textContent?.trim() ?? ''\n\t}\n\n\tprivate _readInvalidFields(): Array<{ id: string; label: string; message: string }> {\n\t\tif (!this._form) return []\n\t\tconst result: Array<{ id: string; label: string; message: string }> = []\n\t\tfor (const el of Array.from(this._form.querySelectorAll('*'))) {\n\t\t\tif (!(el instanceof HTMLElement)) continue\n\t\t\tlet isInvalid = false\n\t\t\ttry {\n\t\t\t\tisInvalid = el.matches(':state(invalid)')\n\t\t\t} catch {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!isInvalid) continue\n\t\t\tconst f = el as HTMLElement & {\n\t\t\t\tlabel?: string\n\t\t\t\tname?: string\n\t\t\t\tvalidationMessage?: string\n\t\t\t}\n\t\t\tresult.push({\n\t\t\t\tid: f.id,\n\t\t\t\tlabel: f.label || f.name || '(field)',\n\t\t\t\tmessage: f.validationMessage || 'Invalid value',\n\t\t\t})\n\t\t}\n\t\treturn result\n\t}\n\n\trender() {\n\t\t// Read everything fresh from the DOM each render — no @state cache, no\n\t\t// re-render loops. The MutationObserver bumps `_bump` to trigger this\n\t\t// render; `_bump` itself is never read here.\n\t\tvoid this._bump\n\n\t\tconst status = this._readFormStatus()\n\t\tif (status !== 'error') return nothing\n\n\t\tconst formMessage = this._readFormMessage()\n\t\tconst invalid = this._readInvalidFields()\n\t\tconst count = invalid.length\n\t\tconst heading =\n\t\t\tthis.heading ??\n\t\t\t(count === 0\n\t\t\t\t? 'There is a problem with this form'\n\t\t\t\t: `There ${count === 1 ? 'is' : 'are'} ${count} problem${count === 1 ? '' : 's'} with this form`)\n\n\t\treturn html`\n\t\t\t<div role=\"alert\" aria-labelledby=\"schmancy-form-summary-heading\">\n\t\t\t\t<h2 id=\"schmancy-form-summary-heading\">${heading}</h2>\n\t\t\t\t${formMessage ? html`<p>${formMessage}</p>` : nothing}\n\t\t\t\t${count > 0\n\t\t\t\t\t? html`\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t${invalid.map(\n\t\t\t\t\t\t\t\tf => html`\n\t\t\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\t\thref=\"#${f.id}\"\n\t\t\t\t\t\t\t\t\t\t\t@click=${(e: MouseEvent) => this._jumpToField(e, f.id)}\n\t\t\t\t\t\t\t\t\t\t>${f.label}: ${f.message}</a>\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t`\n\t\t\t\t\t: nothing}\n\t\t\t</div>\n\t\t`\n\t}\n\n\tprivate _jumpToField(e: MouseEvent, fieldId: string): void {\n\t\te.preventDefault()\n\t\tconst target = this._form?.querySelector(`#${CSS.escape(fieldId)}`) as HTMLElement | null\n\t\ttarget?.focus()\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-form-summary': SchmancyFormSummary\n\t}\n}\n"],"mappings":"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"}
@@ -1,15 +1,15 @@
1
- import { c as e, r as t } from "./mixins-pU53qf6R.js";
1
+ import { c as e, r as t } from "./mixins-C42OILRS.js";
2
2
  import { a as n } from "./active-host-BP0zy_Y9.js";
3
3
  import { o as r } from "./state-CHbIt2Dw.js";
4
- import "./autocomplete-Ds3Q2cwR.js";
5
- import "./checkbox-BNdg57Om.js";
6
- import "./date-range-CAqB-B0M.js";
7
- import "./input-Q0fm34Co.js";
8
- import "./radio-group-D9MU1Mxz.js";
4
+ import "./autocomplete-BoCWO26L.js";
5
+ import "./checkbox-CfCm1vGN.js";
6
+ import "./date-range-B8zoj6Cj.js";
7
+ import "./input-CCOkeeVM.js";
8
+ import "./radio-group-BUJgfQFi.js";
9
9
  import "./range.js";
10
- import "./select-CMwkl-D6.js";
10
+ import "./select-BWEh5nRM.js";
11
11
  import "./switch.js";
12
- import "./textarea-BAogS_Ff.js";
12
+ import "./textarea-DeHFl80i.js";
13
13
  import { fromEvent as i, takeUntil as a } from "rxjs";
14
14
  import { customElement as o, property as s, state as c } from "lit/decorators.js";
15
15
  import { html as l, nothing as u } from "lit";