@mhmo91/schmancy 0.9.12 → 0.9.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (521) hide show
  1. package/README.md +34 -0
  2. package/custom-elements.json +236 -0
  3. package/dist/agent/flow-CaPi2G8y.js.map +1 -0
  4. package/dist/agent/schmancy.agent.js +36474 -0
  5. package/dist/agent/schmancy.agent.js.map +1 -0
  6. package/dist/agent/schmancy.manifest.json +7027 -0
  7. package/dist/agent/vendor-highlight-CHJZQQB7.js +2178 -0
  8. package/dist/agent/vendor-highlight-CHJZQQB7.js.map +1 -0
  9. package/dist/agent/vendor-jsqr-r7GNh4P3.js +10212 -0
  10. package/dist/agent/vendor-jsqr-r7GNh4P3.js.map +1 -0
  11. package/dist/agent/vendor-material-color-Be96dpGE.js +3309 -0
  12. package/dist/agent/vendor-material-color-Be96dpGE.js.map +1 -0
  13. package/dist/{animation-Bcwh107v.cjs.map → animation-CQRdLgzX.cjs.map} +1 -1
  14. package/dist/{animation-CXKSuUoE.js.map → animation-hXFClrIn.js.map} +1 -1
  15. package/dist/{area-CBjmKtN-.cjs → area-DBjAhgjP.cjs} +2 -2
  16. package/dist/area-DBjAhgjP.cjs.map +1 -0
  17. package/dist/{area-CjX0Ckh9.js → area-Dr4I9R2p.js} +23 -35
  18. package/dist/area-Dr4I9R2p.js.map +1 -0
  19. package/dist/area.cjs +1 -1
  20. package/dist/area.js +3 -2
  21. package/dist/{audio-DUVz7Ars.cjs → audio-Dvr-RBzE.cjs} +1 -1
  22. package/dist/{audio-DUVz7Ars.cjs.map → audio-Dvr-RBzE.cjs.map} +1 -1
  23. package/dist/{audio-C7TzWI8M.js → audio-ql6nvY0y.js} +1 -1
  24. package/dist/{audio-C7TzWI8M.js.map → audio-ql6nvY0y.js.map} +1 -1
  25. package/dist/audio.cjs +1 -1
  26. package/dist/audio.js +2 -2
  27. package/dist/{autocomplete-ppoaK_GD.js → autocomplete-CgWUCUU-.js} +3 -3
  28. package/dist/{autocomplete-ppoaK_GD.js.map → autocomplete-CgWUCUU-.js.map} +1 -1
  29. package/dist/{autocomplete-WQxz4VGO.cjs → autocomplete-EM0jE7X2.cjs} +1 -1
  30. package/dist/{autocomplete-WQxz4VGO.cjs.map → autocomplete-EM0jE7X2.cjs.map} +1 -1
  31. package/dist/autocomplete.cjs +1 -1
  32. package/dist/autocomplete.js +1 -1
  33. package/dist/badge.cjs +1 -1
  34. package/dist/badge.js +1 -1
  35. package/dist/{boat-C-T9RDiG.cjs → boat-BjYJI1HS.cjs} +1 -1
  36. package/dist/{boat-C-T9RDiG.cjs.map → boat-BjYJI1HS.cjs.map} +1 -1
  37. package/dist/{boat-C4JnoakD.js → boat-Dw8TmOzN.js} +4 -4
  38. package/dist/{boat-C4JnoakD.js.map → boat-Dw8TmOzN.js.map} +1 -1
  39. package/dist/boat.cjs +1 -1
  40. package/dist/boat.js +1 -1
  41. package/dist/breadcrumb.cjs +1 -1
  42. package/dist/breadcrumb.js +1 -1
  43. package/dist/{busy-BMRUS_Ns.cjs → busy-BmiumJpB.cjs} +1 -1
  44. package/dist/{busy-BMRUS_Ns.cjs.map → busy-BmiumJpB.cjs.map} +1 -1
  45. package/dist/{busy-DuV4A5PX.js → busy-D2hP3fOy.js} +1 -1
  46. package/dist/{busy-DuV4A5PX.js.map → busy-D2hP3fOy.js.map} +1 -1
  47. package/dist/busy.cjs +1 -1
  48. package/dist/busy.js +1 -1
  49. package/dist/button.cjs +1 -1
  50. package/dist/button.cjs.map +1 -1
  51. package/dist/button.js +4 -4
  52. package/dist/button.js.map +1 -1
  53. package/dist/{card-DBjGfCxi.cjs → card-BslSqOsf.cjs} +1 -1
  54. package/dist/{card-DBjGfCxi.cjs.map → card-BslSqOsf.cjs.map} +1 -1
  55. package/dist/{card-DzXRouJC.js → card-CEdgK9nb.js} +2 -2
  56. package/dist/{card-DzXRouJC.js.map → card-CEdgK9nb.js.map} +1 -1
  57. package/dist/card.cjs +1 -1
  58. package/dist/card.js +1 -1
  59. package/dist/charts.cjs +1 -1
  60. package/dist/charts.js +1 -1
  61. package/dist/{checkbox-BwuhSBDG.js → checkbox-Br84TiCs.js} +2 -2
  62. package/dist/{checkbox-BwuhSBDG.js.map → checkbox-Br84TiCs.js.map} +1 -1
  63. package/dist/{checkbox-BibOr-sJ.cjs → checkbox-DtcFMgZL.cjs} +1 -1
  64. package/dist/{checkbox-BibOr-sJ.cjs.map → checkbox-DtcFMgZL.cjs.map} +1 -1
  65. package/dist/checkbox.cjs +1 -1
  66. package/dist/checkbox.js +1 -1
  67. package/dist/{chips-DiB2BfTQ.js → chips-BNYOweGm.js} +5 -5
  68. package/dist/{chips-DiB2BfTQ.js.map → chips-BNYOweGm.js.map} +1 -1
  69. package/dist/{chips-D5QvIKt6.cjs → chips-DoCu5YQb.cjs} +1 -1
  70. package/dist/{chips-D5QvIKt6.cjs.map → chips-DoCu5YQb.cjs.map} +1 -1
  71. package/dist/chips.cjs +1 -1
  72. package/dist/chips.js +2 -2
  73. package/dist/chunk-BM5alsTp.js +18 -0
  74. package/dist/chunk-CncqDLb2.cjs +1 -0
  75. package/dist/{code-highlight-B5_zONzv.js → code-highlight-BgExKEto.js} +1 -1
  76. package/dist/{code-highlight-B5_zONzv.js.map → code-highlight-BgExKEto.js.map} +1 -1
  77. package/dist/{code-highlight-Q2x2hrWg.cjs → code-highlight-zSYcSfCz.cjs} +1 -1
  78. package/dist/{code-highlight-Q2x2hrWg.cjs.map → code-highlight-zSYcSfCz.cjs.map} +1 -1
  79. package/dist/code-highlight.cjs +1 -1
  80. package/dist/code-highlight.js +1 -1
  81. package/dist/{components-CjLqW8Jp.js → components-DjKNS9R_.js} +1 -1
  82. package/dist/{components-CjLqW8Jp.js.map → components-DjKNS9R_.js.map} +1 -1
  83. package/dist/{components-jfFxyq6z.cjs → components-TJT8-tva.cjs} +1 -1
  84. package/dist/{components-jfFxyq6z.cjs.map → components-TJT8-tva.cjs.map} +1 -1
  85. package/dist/components.cjs +1 -1
  86. package/dist/components.js +1 -1
  87. package/dist/connectivity.cjs +1 -1
  88. package/dist/connectivity.js +2 -2
  89. package/dist/content-drawer.cjs +1 -1
  90. package/dist/content-drawer.js +1 -1
  91. package/dist/context-CAYQh-mx.cjs +1 -0
  92. package/dist/{context-BRtGc7PP.cjs.map → context-CAYQh-mx.cjs.map} +1 -1
  93. package/dist/context-D8Q66KPe.js +3 -0
  94. package/dist/{context-DgD3c6q-.js.map → context-D8Q66KPe.js.map} +1 -1
  95. package/dist/{cursor-glow-C2YRrB8Z.js → cursor-glow-BydlDInj.js} +1 -1
  96. package/dist/{cursor-glow-C2YRrB8Z.js.map → cursor-glow-BydlDInj.js.map} +1 -1
  97. package/dist/{cursor-glow-82y5h3E4.cjs → cursor-glow-Duw9jHmh.cjs} +1 -1
  98. package/dist/{cursor-glow-82y5h3E4.cjs.map → cursor-glow-Duw9jHmh.cjs.map} +1 -1
  99. package/dist/{date-range-DF5ROfrb.cjs → date-range-CIWYm3eS.cjs} +1 -1
  100. package/dist/{date-range-DF5ROfrb.cjs.map → date-range-CIWYm3eS.cjs.map} +1 -1
  101. package/dist/{date-range-inline-LLC3Y0mi.cjs → date-range-inline-B9Dp2z6C.cjs} +1 -1
  102. package/dist/{date-range-inline-LLC3Y0mi.cjs.map → date-range-inline-B9Dp2z6C.cjs.map} +1 -1
  103. package/dist/{date-range-inline-B_g1YXu3.js.map → date-range-inline-CpKG6qt2.js.map} +1 -1
  104. package/dist/date-range-inline.cjs +1 -1
  105. package/dist/date-range-inline.js +1 -1
  106. package/dist/{date-range-Dcy8GSov.js → date-range-sGkC0KF3.js} +4 -4
  107. package/dist/{date-range-Dcy8GSov.js.map → date-range-sGkC0KF3.js.map} +1 -1
  108. package/dist/date-range.cjs +1 -1
  109. package/dist/date-range.js +1 -1
  110. package/dist/{delay-aQRihOO4.cjs → delay-Bu4WMQlV.cjs} +1 -1
  111. package/dist/{delay-aQRihOO4.cjs.map → delay-Bu4WMQlV.cjs.map} +1 -1
  112. package/dist/{delay-B7TvigGw.js → delay-DwX65fSc.js} +4 -4
  113. package/dist/{delay-B7TvigGw.js.map → delay-DwX65fSc.js.map} +1 -1
  114. package/dist/delay.cjs +1 -1
  115. package/dist/delay.js +1 -1
  116. package/dist/{details-Cs8yStsJ.cjs → details-B8p62xmR.cjs} +1 -1
  117. package/dist/{details-Cs8yStsJ.cjs.map → details-B8p62xmR.cjs.map} +1 -1
  118. package/dist/{details-DfYDNHuv.js → details-CCW52lzz.js} +5 -5
  119. package/dist/{details-DfYDNHuv.js.map → details-CCW52lzz.js.map} +1 -1
  120. package/dist/details.cjs +1 -1
  121. package/dist/details.js +1 -1
  122. package/dist/{dialog-service-DXLGSshF.cjs → dialog-service-CzDO08Gy.cjs} +1 -1
  123. package/dist/{dialog-service-DXLGSshF.cjs.map → dialog-service-CzDO08Gy.cjs.map} +1 -1
  124. package/dist/{dialog-service-CCFGpU7a.js → dialog-service-DH-tjPuE.js} +2 -2
  125. package/dist/{dialog-service-CCFGpU7a.js.map → dialog-service-DH-tjPuE.js.map} +1 -1
  126. package/dist/dialog.cjs +1 -1
  127. package/dist/dialog.cjs.map +1 -1
  128. package/dist/dialog.js +5 -5
  129. package/dist/directives.cjs +1 -1
  130. package/dist/directives.cjs.map +1 -1
  131. package/dist/directives.js +5 -5
  132. package/dist/directives.js.map +1 -1
  133. package/dist/discovery.cjs +1 -1
  134. package/dist/{divider-DE9pcMw3.js → divider-CbEWg3G_.js} +1 -1
  135. package/dist/{divider-DE9pcMw3.js.map → divider-CbEWg3G_.js.map} +1 -1
  136. package/dist/{divider-DY4ocl-Z.cjs → divider-JyyFw_3J.cjs} +1 -1
  137. package/dist/{divider-DY4ocl-Z.cjs.map → divider-JyyFw_3J.cjs.map} +1 -1
  138. package/dist/divider.cjs +1 -1
  139. package/dist/divider.js +1 -1
  140. package/dist/dropdown.cjs +1 -1
  141. package/dist/dropdown.js +2 -2
  142. package/dist/{expand-Cuu9u0j5.cjs → expand-BmwIPNjq.cjs} +1 -1
  143. package/dist/{expand-Cuu9u0j5.cjs.map → expand-BmwIPNjq.cjs.map} +1 -1
  144. package/dist/{expand-Cwis2Y6U.js → expand-bFa_qVDT.js} +4 -4
  145. package/dist/{expand-Cwis2Y6U.js.map → expand-bFa_qVDT.js.map} +1 -1
  146. package/dist/expand.cjs +1 -1
  147. package/dist/expand.js +1 -1
  148. package/dist/{extra-DRIgrdHx.cjs → extra-BUgyMgjl.cjs} +1 -1
  149. package/dist/{extra-DRIgrdHx.cjs.map → extra-BUgyMgjl.cjs.map} +1 -1
  150. package/dist/{extra-DoxLBpZ-.js → extra-HwbaUnCD.js} +1 -1
  151. package/dist/{extra-DoxLBpZ-.js.map → extra-HwbaUnCD.js.map} +1 -1
  152. package/dist/extra.cjs +1 -1
  153. package/dist/extra.js +1 -1
  154. package/dist/float-BQwhfibw.cjs +1 -0
  155. package/dist/{float-I4wePTk7.cjs.map → float-BQwhfibw.cjs.map} +1 -1
  156. package/dist/{float-2aPqW2lz.js → float-D5ezUurt.js} +1 -1
  157. package/dist/{float-2aPqW2lz.js.map → float-D5ezUurt.js.map} +1 -1
  158. package/dist/float.cjs +1 -1
  159. package/dist/float.js +1 -1
  160. package/dist/flow-BGkHnOnd.js +386 -0
  161. package/dist/{flow-BPDtbhLe.js.map → flow-BGkHnOnd.js.map} +1 -1
  162. package/dist/{flow-Dn9AZktE.cjs.map → flow-ClAJ6Qby.cjs.map} +1 -1
  163. package/dist/{form-C1qS9uvS.js.map → form-rCZqoAoK.js.map} +1 -1
  164. package/dist/{form-CzD0JLxM.cjs → form-wI58M85H.cjs} +1 -1
  165. package/dist/{form-CzD0JLxM.cjs.map → form-wI58M85H.cjs.map} +1 -1
  166. package/dist/form.cjs +1 -1
  167. package/dist/form.js +1 -1
  168. package/dist/{hashContent-BUqULUiZ.js.map → hashContent-B2IntJQf.js.map} +1 -1
  169. package/dist/{hashContent-CI39BY-_.cjs.map → hashContent-CahnEuut.cjs.map} +1 -1
  170. package/dist/{icons-UOqapID2.cjs → icons-B6V3nZ4-.cjs} +1 -1
  171. package/dist/{icons-UOqapID2.cjs.map → icons-B6V3nZ4-.cjs.map} +1 -1
  172. package/dist/{icons-DDQBxhDC.js → icons-C5-DIjet.js} +2 -2
  173. package/dist/{icons-DDQBxhDC.js.map → icons-C5-DIjet.js.map} +1 -1
  174. package/dist/icons.cjs +1 -1
  175. package/dist/icons.js +1 -1
  176. package/dist/{iframe-CMTUyiz1.js → iframe-BXBsuLwt.js} +1 -1
  177. package/dist/{iframe-CMTUyiz1.js.map → iframe-BXBsuLwt.js.map} +1 -1
  178. package/dist/{iframe-FZCULDVM.cjs → iframe-C7sHg7RC.cjs} +1 -1
  179. package/dist/{iframe-FZCULDVM.cjs.map → iframe-C7sHg7RC.cjs.map} +1 -1
  180. package/dist/iframe.cjs +1 -1
  181. package/dist/iframe.js +1 -1
  182. package/dist/index.cjs +1 -1
  183. package/dist/index.js +53 -52
  184. package/dist/{input-DIuyi3Gm.cjs → input-BGNZlfL8.cjs} +1 -1
  185. package/dist/{input-DIuyi3Gm.cjs.map → input-BGNZlfL8.cjs.map} +1 -1
  186. package/dist/{input-HzweUBSn.js → input-Bc3bVISm.js} +1 -1
  187. package/dist/{input-HzweUBSn.js.map → input-Bc3bVISm.js.map} +1 -1
  188. package/dist/{input-chip-Bt2Lzi-2.js → input-chip-CiG61y-N.js} +1 -1
  189. package/dist/{input-chip-Bt2Lzi-2.js.map → input-chip-CiG61y-N.js.map} +1 -1
  190. package/dist/{input-chip-nghCxe9L.cjs → input-chip-p24lkYtY.cjs} +1 -1
  191. package/dist/{input-chip-nghCxe9L.cjs.map → input-chip-p24lkYtY.cjs.map} +1 -1
  192. package/dist/input.cjs +1 -1
  193. package/dist/input.js +1 -1
  194. package/dist/{intersection-C0JuW_7U.js.map → intersection-BrXp4YTO.js.map} +1 -1
  195. package/dist/{intersection-MvbRovUz.cjs → intersection-DqBqnpgh.cjs} +1 -1
  196. package/dist/{intersection-MvbRovUz.cjs.map → intersection-DqBqnpgh.cjs.map} +1 -1
  197. package/dist/json.cjs +1 -1
  198. package/dist/json.js +2 -2
  199. package/dist/kbd.cjs +1 -1
  200. package/dist/kbd.js +1 -1
  201. package/dist/{layout-DHt4hK1n.cjs → layout-B0_IXfov.cjs} +1 -1
  202. package/dist/{layout-DHt4hK1n.cjs.map → layout-B0_IXfov.cjs.map} +1 -1
  203. package/dist/{layout-PZCF3kwl.cjs → layout-CTfRXQoz.cjs} +1 -1
  204. package/dist/{layout-PZCF3kwl.cjs.map → layout-CTfRXQoz.cjs.map} +1 -1
  205. package/dist/{layout-BUq6VVj0.js → layout-Cqghi_rx.js} +2 -2
  206. package/dist/{layout-BUq6VVj0.js.map → layout-Cqghi_rx.js.map} +1 -1
  207. package/dist/{layout-BE2ld1IY.js → layout-fjM1DWlF.js} +1 -1
  208. package/dist/{layout-BE2ld1IY.js.map → layout-fjM1DWlF.js.map} +1 -1
  209. package/dist/layout.cjs +1 -1
  210. package/dist/layout.js +2 -2
  211. package/dist/lazy-BDNnH_r7.cjs +1 -0
  212. package/dist/lazy-BDNnH_r7.cjs.map +1 -0
  213. package/dist/lazy-D6R5N5v4.js +13 -0
  214. package/dist/lazy-D6R5N5v4.js.map +1 -0
  215. package/dist/{lightbox-CbAbyhzE.cjs → lightbox-BWKTzA03.cjs} +1 -1
  216. package/dist/{lightbox-CbAbyhzE.cjs.map → lightbox-BWKTzA03.cjs.map} +1 -1
  217. package/dist/{lightbox-p_uYC9Hy.js → lightbox-CnCTvqSu.js} +3 -3
  218. package/dist/{lightbox-p_uYC9Hy.js.map → lightbox-CnCTvqSu.js.map} +1 -1
  219. package/dist/lightbox.cjs +1 -1
  220. package/dist/lightbox.js +1 -1
  221. package/dist/{list-DG1shv4_.js → list-BpjKUOzM.js} +2 -2
  222. package/dist/{list-DG1shv4_.js.map → list-BpjKUOzM.js.map} +1 -1
  223. package/dist/{list-pvbKwpnz.cjs → list-CMWHu6cV.cjs} +1 -1
  224. package/dist/{list-pvbKwpnz.cjs.map → list-CMWHu6cV.cjs.map} +1 -1
  225. package/dist/list.cjs +1 -1
  226. package/dist/list.js +1 -1
  227. package/dist/{litElement.mixin-BLb2kIHg.js → litElement.mixin-BnNYZ24e.js} +1 -1
  228. package/dist/{litElement.mixin-BLb2kIHg.js.map → litElement.mixin-BnNYZ24e.js.map} +1 -1
  229. package/dist/{litElement.mixin-Bx9Avv0M.cjs → litElement.mixin-CtQOmwq6.cjs} +1 -1
  230. package/dist/{litElement.mixin-Bx9Avv0M.cjs.map → litElement.mixin-CtQOmwq6.cjs.map} +1 -1
  231. package/dist/{magnetic-Dj52WplI.js → magnetic-BhXebqF3.js} +2 -2
  232. package/dist/{magnetic-Dj52WplI.js.map → magnetic-BhXebqF3.js.map} +1 -1
  233. package/dist/{magnetic-aBBnj_vk.cjs → magnetic-CVXEkYTA.cjs} +1 -1
  234. package/dist/{magnetic-aBBnj_vk.cjs.map → magnetic-CVXEkYTA.cjs.map} +1 -1
  235. package/dist/{mailbox-BCRplIro.js → mailbox-CHIpxS3W.js} +5 -5
  236. package/dist/{mailbox-BCRplIro.js.map → mailbox-CHIpxS3W.js.map} +1 -1
  237. package/dist/{mailbox-CZevIxwZ.cjs → mailbox-Tg1CROVz.cjs} +1 -1
  238. package/dist/{mailbox-CZevIxwZ.cjs.map → mailbox-Tg1CROVz.cjs.map} +1 -1
  239. package/dist/mailbox.cjs +1 -1
  240. package/dist/mailbox.js +1 -1
  241. package/dist/{map-BUcxWqBH.js → map-YY1Q4FWO.js} +1 -1
  242. package/dist/{map-BUcxWqBH.js.map → map-YY1Q4FWO.js.map} +1 -1
  243. package/dist/{map-C6kDkAju.cjs → map-Z_dsu-dv.cjs} +1 -1
  244. package/dist/{map-C6kDkAju.cjs.map → map-Z_dsu-dv.cjs.map} +1 -1
  245. package/dist/map.cjs +1 -1
  246. package/dist/map.js +1 -1
  247. package/dist/{menu-BleltblR.js → menu-BIBUgS1T.js} +2 -2
  248. package/dist/{menu-BleltblR.js.map → menu-BIBUgS1T.js.map} +1 -1
  249. package/dist/{menu-DhmDz_js.cjs → menu-DS8Iz4fJ.cjs} +1 -1
  250. package/dist/{menu-DhmDz_js.cjs.map → menu-DS8Iz4fJ.cjs.map} +1 -1
  251. package/dist/menu.cjs +1 -1
  252. package/dist/menu.js +1 -1
  253. package/dist/mixins.cjs +1 -1
  254. package/dist/mixins.js +2 -2
  255. package/dist/nav-drawer.cjs +1 -1
  256. package/dist/nav-drawer.js +1 -1
  257. package/dist/navigation-bar.cjs +1 -1
  258. package/dist/navigation-bar.js +1 -1
  259. package/dist/navigation-rail.cjs +1 -1
  260. package/dist/navigation-rail.js +1 -1
  261. package/dist/{notification-DvrozLTu.js → notification-ChAvNXf3.js} +3 -3
  262. package/dist/notification-ChAvNXf3.js.map +1 -0
  263. package/dist/{notification-BT84PlwC.cjs → notification-DPUkuifB.cjs} +1 -1
  264. package/dist/notification-DPUkuifB.cjs.map +1 -0
  265. package/dist/notification.cjs +1 -1
  266. package/dist/notification.js +1 -1
  267. package/dist/{option-EEYkHd44.js → option-Ci7C8xxh.js} +1 -1
  268. package/dist/{option-EEYkHd44.js.map → option-Ci7C8xxh.js.map} +1 -1
  269. package/dist/{option-y5FY8sz-.cjs → option-OIp0joyN.cjs} +1 -1
  270. package/dist/{option-y5FY8sz-.cjs.map → option-OIp0joyN.cjs.map} +1 -1
  271. package/dist/option.cjs +1 -1
  272. package/dist/option.js +1 -1
  273. package/dist/{overlay-stack-J_eJCUTX.cjs.map → overlay-stack-7bs4ZNnh.cjs.map} +1 -1
  274. package/dist/{overlay-stack-BJt_r6aZ.js.map → overlay-stack-DXPYHPhk.js.map} +1 -1
  275. package/dist/overlay.cjs +130 -0
  276. package/dist/overlay.cjs.map +1 -0
  277. package/dist/overlay.js +570 -0
  278. package/dist/overlay.js.map +1 -0
  279. package/dist/page.cjs +1 -1
  280. package/dist/page.cjs.map +1 -1
  281. package/dist/page.js +4 -4
  282. package/dist/{progress-B1if5cWu.cjs → progress-32Cad1NX.cjs} +1 -1
  283. package/dist/{progress-B1if5cWu.cjs.map → progress-32Cad1NX.cjs.map} +1 -1
  284. package/dist/{progress-B8nfhvrc.js → progress-DGkwPgDX.js} +1 -1
  285. package/dist/{progress-B8nfhvrc.js.map → progress-DGkwPgDX.js.map} +1 -1
  286. package/dist/progress.cjs +1 -1
  287. package/dist/progress.js +1 -1
  288. package/dist/{provide-BEMtticm.js → provide-BuzyBLGj.js} +1 -1
  289. package/dist/{provide-BEMtticm.js.map → provide-BuzyBLGj.js.map} +1 -1
  290. package/dist/{provide-BbFbvIEk.cjs → provide-MvHcXKzT.cjs} +1 -1
  291. package/dist/{provide-BbFbvIEk.cjs.map → provide-MvHcXKzT.cjs.map} +1 -1
  292. package/dist/qr-scanner.cjs +1 -1
  293. package/dist/qr-scanner.js +1 -1
  294. package/dist/{radio-group-DKXbC-jL.js → radio-group-B72sYGnS.js} +1 -1
  295. package/dist/{radio-group-DKXbC-jL.js.map → radio-group-B72sYGnS.js.map} +1 -1
  296. package/dist/{radio-group-DafTK0PB.cjs → radio-group-B7DuNxUq.cjs} +1 -1
  297. package/dist/{radio-group-DafTK0PB.cjs.map → radio-group-B7DuNxUq.cjs.map} +1 -1
  298. package/dist/radio-group.cjs +1 -1
  299. package/dist/radio-group.js +1 -1
  300. package/dist/range.cjs +1 -1
  301. package/dist/range.js +1 -1
  302. package/dist/{reduced-motion-DR32yKEO.cjs → reduced-motion-9RjNnhIg.cjs} +1 -1
  303. package/dist/{reduced-motion-DR32yKEO.cjs.map → reduced-motion-9RjNnhIg.cjs.map} +1 -1
  304. package/dist/{reduced-motion-B83yZbcO.js.map → reduced-motion-BZTLqAyl.js.map} +1 -1
  305. package/dist/{rxjs-utils-CN9fv8Xq.js → rxjs-utils-CKTnEKUH.js} +1 -1
  306. package/dist/{rxjs-utils-CN9fv8Xq.js.map → rxjs-utils-CKTnEKUH.js.map} +1 -1
  307. package/dist/{rxjs-utils-Vn6DCKgL.cjs → rxjs-utils-DJbZRjp3.cjs} +1 -1
  308. package/dist/{rxjs-utils-Vn6DCKgL.cjs.map → rxjs-utils-DJbZRjp3.cjs.map} +1 -1
  309. package/dist/rxjs-utils.cjs +1 -1
  310. package/dist/rxjs-utils.js +1 -1
  311. package/dist/{scroll-pdsp_9bT.js → scroll-CdmXRXh2.js} +1 -1
  312. package/dist/{scroll-pdsp_9bT.js.map → scroll-CdmXRXh2.js.map} +1 -1
  313. package/dist/{scroll-C6Hub5gG.cjs → scroll-V1rAZ9fK.cjs} +1 -1
  314. package/dist/{scroll-C6Hub5gG.cjs.map → scroll-V1rAZ9fK.cjs.map} +1 -1
  315. package/dist/{search-BlGJ6uJv.js.map → search-CvUZRLF1.js.map} +1 -1
  316. package/dist/{search-C8eAOzBm.cjs.map → search-CwMav5QB.cjs.map} +1 -1
  317. package/dist/{select-Zg9UqtCA.cjs → select-DFxoBgEf.cjs} +1 -1
  318. package/dist/{select-Zg9UqtCA.cjs.map → select-DFxoBgEf.cjs.map} +1 -1
  319. package/dist/{select-_Qkleofb.js → select-wFDKDLQI.js} +2 -2
  320. package/dist/{select-_Qkleofb.js.map → select-wFDKDLQI.js.map} +1 -1
  321. package/dist/select.cjs +1 -1
  322. package/dist/select.js +1 -1
  323. package/dist/{sheet-7LWVKgW9.cjs → sheet-DdlZhnDG.cjs} +2 -2
  324. package/dist/{sheet-7LWVKgW9.cjs.map → sheet-DdlZhnDG.cjs.map} +1 -1
  325. package/dist/{sheet-N9TET_t_.js → sheet-LFVo5iN4.js} +4 -4
  326. package/dist/{sheet-N9TET_t_.js.map → sheet-LFVo5iN4.js.map} +1 -1
  327. package/dist/sheet.cjs +1 -1
  328. package/dist/sheet.js +2 -2
  329. package/dist/{sheet.service-P2CkJW86.cjs → sheet.service-BfNDB0K0.cjs} +1 -1
  330. package/dist/{sheet.service-P2CkJW86.cjs.map → sheet.service-BfNDB0K0.cjs.map} +1 -1
  331. package/dist/{sheet.service-DCe4FOkQ.js → sheet.service-DQE7-_wq.js} +3 -3
  332. package/dist/{sheet.service-DCe4FOkQ.js.map → sheet.service-DQE7-_wq.js.map} +1 -1
  333. package/dist/skeleton.cjs +1 -1
  334. package/dist/skeleton.js +1 -1
  335. package/dist/skills/INDEX.md +1 -1
  336. package/dist/skills/overlay.md +200 -0
  337. package/dist/skills/schmancy/INDEX.md +1 -1
  338. package/dist/skills/schmancy/overlay.md +200 -0
  339. package/dist/slider.cjs +1 -1
  340. package/dist/slider.js +1 -1
  341. package/dist/{sound.service-BjSoGjmT.cjs → sound.service-BEN6Xjy_.cjs} +1 -1
  342. package/dist/{sound.service-BjSoGjmT.cjs.map → sound.service-BEN6Xjy_.cjs.map} +1 -1
  343. package/dist/{sound.service-cdkw3Wkv.js → sound.service-DWZe6swU.js} +1 -1
  344. package/dist/{sound.service-cdkw3Wkv.js.map → sound.service-DWZe6swU.js.map} +1 -1
  345. package/dist/{splash-screen-BUKRc46i.cjs → splash-screen-C9HqX2nR.cjs} +1 -1
  346. package/dist/{splash-screen-BUKRc46i.cjs.map → splash-screen-C9HqX2nR.cjs.map} +1 -1
  347. package/dist/{splash-screen-B5Sgz7eG.js → splash-screen-COg3Z6n8.js} +1 -1
  348. package/dist/{splash-screen-B5Sgz7eG.js.map → splash-screen-COg3Z6n8.js.map} +1 -1
  349. package/dist/splash-screen.cjs +1 -1
  350. package/dist/splash-screen.js +1 -1
  351. package/dist/{src-59eVZMmI.js → src-C7niWYur.js} +51 -51
  352. package/dist/src-C7niWYur.js.map +1 -0
  353. package/dist/{src-r2bV-AFk.cjs → src-I4M33WK2.cjs} +3 -3
  354. package/dist/src-I4M33WK2.cjs.map +1 -0
  355. package/dist/steps.cjs +1 -1
  356. package/dist/steps.js +3 -3
  357. package/dist/{store-CO4nJyGj.cjs → store-CjFHCSDb.cjs} +1 -1
  358. package/dist/{store-CO4nJyGj.cjs.map → store-CjFHCSDb.cjs.map} +1 -1
  359. package/dist/{store-Bmj6rvZY.js.map → store-CjzZDQt8.js.map} +1 -1
  360. package/dist/store.cjs +1 -1
  361. package/dist/store.js +1 -1
  362. package/dist/{surface-BL6YlaS3.js → surface-0XM4DBaT.js} +2 -2
  363. package/dist/{surface-BL6YlaS3.js.map → surface-0XM4DBaT.js.map} +1 -1
  364. package/dist/{surface-B-y5Zzmz.cjs → surface-B6DA01kL.cjs} +1 -1
  365. package/dist/{surface-B-y5Zzmz.cjs.map → surface-B6DA01kL.cjs.map} +1 -1
  366. package/dist/surface.cjs +1 -1
  367. package/dist/surface.js +1 -1
  368. package/dist/{surface.mixin-CSKqQH-0.cjs → surface.mixin-DxOi-xo0.cjs} +1 -1
  369. package/dist/{surface.mixin-CSKqQH-0.cjs.map → surface.mixin-DxOi-xo0.cjs.map} +1 -1
  370. package/dist/switch.cjs +1 -1
  371. package/dist/switch.js +1 -1
  372. package/dist/{table-CzcIcVFc.cjs → table-B-DsOqzT.cjs} +2 -2
  373. package/dist/{table-CzcIcVFc.cjs.map → table-B-DsOqzT.cjs.map} +1 -1
  374. package/dist/{table-B0-Pi4G5.js → table-hBEZRxM_.js} +3 -3
  375. package/dist/{table-B0-Pi4G5.js.map → table-hBEZRxM_.js.map} +1 -1
  376. package/dist/table.cjs +1 -1
  377. package/dist/table.js +1 -1
  378. package/dist/{tabs-D-VbZiFu.js → tabs-C7r4TqcX.js} +2 -2
  379. package/dist/{tabs-D-VbZiFu.js.map → tabs-C7r4TqcX.js.map} +1 -1
  380. package/dist/{tabs-CzC8kJyY.cjs → tabs-DZaLZUBy.cjs} +1 -1
  381. package/dist/{tabs-CzC8kJyY.cjs.map → tabs-DZaLZUBy.cjs.map} +1 -1
  382. package/dist/tabs.cjs +1 -1
  383. package/dist/tabs.js +1 -1
  384. package/dist/tailwind.mixin-Bh58QnlW.cjs +2 -0
  385. package/dist/{tailwind.mixin-ZzkXQTFA.cjs.map → tailwind.mixin-Bh58QnlW.cjs.map} +1 -1
  386. package/dist/tailwind.mixin-H5Pn7vSJ.js +219 -0
  387. package/dist/{tailwind.mixin-BCz3GEpw.js.map → tailwind.mixin-H5Pn7vSJ.js.map} +1 -1
  388. package/dist/teleport.cjs +1 -1
  389. package/dist/teleport.js +1 -1
  390. package/dist/{textarea-CgB6XptL.cjs → textarea-B2544vx9.cjs} +1 -1
  391. package/dist/{textarea-CgB6XptL.cjs.map → textarea-B2544vx9.cjs.map} +1 -1
  392. package/dist/{textarea-ZopeteYQ.js → textarea-CS-KdSLz.js} +1 -1
  393. package/dist/{textarea-ZopeteYQ.js.map → textarea-CS-KdSLz.js.map} +1 -1
  394. package/dist/textarea.cjs +1 -1
  395. package/dist/textarea.js +1 -1
  396. package/dist/{theme-C7As-iVa.js → theme-Cq_c9IO3.js} +7 -7
  397. package/dist/{theme-C7As-iVa.js.map → theme-Cq_c9IO3.js.map} +1 -1
  398. package/dist/{theme-D9bRCDs9.cjs → theme-DU5yXaV-.cjs} +1 -1
  399. package/dist/{theme-D9bRCDs9.cjs.map → theme-DU5yXaV-.cjs.map} +1 -1
  400. package/dist/{theme-button-D2nMfwSr.cjs → theme-button-CPujUbgV.cjs} +1 -1
  401. package/dist/{theme-button-D2nMfwSr.cjs.map → theme-button-CPujUbgV.cjs.map} +1 -1
  402. package/dist/{theme-button-BDXtIhZC.js → theme-button-OJl2ma0u.js} +1 -1
  403. package/dist/{theme-button-BDXtIhZC.js.map → theme-button-OJl2ma0u.js.map} +1 -1
  404. package/dist/theme-button.cjs +1 -1
  405. package/dist/theme-button.js +1 -1
  406. package/dist/theme.cjs +1 -1
  407. package/dist/{theme.events-EznKK2Y0.cjs.map → theme.events-DakXxZeP.cjs.map} +1 -1
  408. package/dist/{theme.events-Bw3mYjUA.js.map → theme.events-NuihzD_p.js.map} +1 -1
  409. package/dist/{theme.interface-Cyqv5XWY.js.map → theme.interface-Buged9Cg.js.map} +1 -1
  410. package/dist/{theme.interface-CCE3L1ql.cjs.map → theme.interface-DTwkuAKJ.cjs.map} +1 -1
  411. package/dist/theme.js +5 -5
  412. package/dist/{theme.service-ETiKUwVy.cjs → theme.service-DxJPUGlu.cjs} +1 -1
  413. package/dist/{theme.service-ETiKUwVy.cjs.map → theme.service-DxJPUGlu.cjs.map} +1 -1
  414. package/dist/{theme.service-_qP5WvB9.js → theme.service-cOfPrtfe.js} +2 -2
  415. package/dist/{theme.service-_qP5WvB9.js.map → theme.service-cOfPrtfe.js.map} +1 -1
  416. package/dist/tooltip.cjs +1 -1
  417. package/dist/tree.cjs +1 -1
  418. package/dist/tree.cjs.map +1 -1
  419. package/dist/tree.js +1 -1
  420. package/dist/{tslib.es6-PMITL0Z3.cjs.map → tslib.es6-Cnt75pb6.cjs.map} +1 -1
  421. package/dist/{tslib.es6-vJQZBGJO.js.map → tslib.es6-DMzzJKHV.js.map} +1 -1
  422. package/dist/{typewriter-DaTkMEHc.js → typewriter-DyN7xa0n.js} +5 -5
  423. package/dist/{typewriter-DaTkMEHc.js.map → typewriter-DyN7xa0n.js.map} +1 -1
  424. package/dist/{typewriter-BjuFsiR3.cjs → typewriter-LK0S4NEr.cjs} +1 -1
  425. package/dist/{typewriter-BjuFsiR3.cjs.map → typewriter-LK0S4NEr.cjs.map} +1 -1
  426. package/dist/typewriter.cjs +1 -1
  427. package/dist/typewriter.js +1 -1
  428. package/dist/typography.cjs +1 -1
  429. package/dist/typography.js +1 -1
  430. package/dist/{utils-C8PD8So2.cjs → utils-2qrmPb78.cjs} +1 -1
  431. package/dist/{utils-C8PD8So2.cjs.map → utils-2qrmPb78.cjs.map} +1 -1
  432. package/dist/{utils-DVuCPDfw.js → utils-xBXLvebz.js} +3 -3
  433. package/dist/{utils-DVuCPDfw.js.map → utils-xBXLvebz.js.map} +1 -1
  434. package/dist/utils.cjs +1 -1
  435. package/dist/utils.js +5 -5
  436. package/dist/visually-hidden.cjs +1 -1
  437. package/dist/visually-hidden.js +1 -1
  438. package/dist/{window-DPSIGCUq.js → window-BWecg8Ih.js} +6 -6
  439. package/dist/{window-DPSIGCUq.js.map → window-BWecg8Ih.js.map} +1 -1
  440. package/dist/{window-DAWRoXo1.cjs → window-Cjv2GqSN.cjs} +1 -1
  441. package/dist/{window-DAWRoXo1.cjs.map → window-Cjv2GqSN.cjs.map} +1 -1
  442. package/dist/window.cjs +1 -1
  443. package/dist/window.js +1 -1
  444. package/package.json +15 -3
  445. package/skills/schmancy/INDEX.md +1 -1
  446. package/skills/schmancy/overlay.md +200 -0
  447. package/src/agent/agent-bundle.test.ts +92 -0
  448. package/src/agent/agent-entry.ts +17 -0
  449. package/src/agent/helpers.ts +161 -0
  450. package/src/agent/index.ts +1 -0
  451. package/src/agent/schmancy-skill.ts +71 -0
  452. package/src/agent/virtual-manifest.d.ts +10 -0
  453. package/src/area/area.service.ts +11 -0
  454. package/src/content-drawer/drawer.service.ts +9 -0
  455. package/src/dialog/dialog-service.ts +11 -1
  456. package/src/notification/notification-service.ts +11 -1
  457. package/src/overlay/index.ts +15 -0
  458. package/src/overlay/overlay.animations.ts +137 -0
  459. package/src/overlay/overlay.component.ts +452 -0
  460. package/src/overlay/overlay.confirm-body.ts +149 -0
  461. package/src/overlay/overlay.gestures.ts +131 -0
  462. package/src/overlay/overlay.layout.ts +76 -0
  463. package/src/overlay/overlay.service.ts +299 -0
  464. package/src/overlay/overlay.stack.ts +171 -0
  465. package/src/overlay/overlay.types.ts +146 -0
  466. package/src/sheet/sheet.service.ts +10 -0
  467. package/src/theme/theme.service.ts +11 -1
  468. package/types/src/agent/agent-bundle.test.d.ts +1 -0
  469. package/types/src/agent/agent-entry.d.ts +4 -0
  470. package/types/src/agent/helpers.d.ts +87 -0
  471. package/types/src/agent/index.d.ts +1 -0
  472. package/types/src/agent/schmancy-skill.d.ts +33 -0
  473. package/types/src/area/area.service.d.ts +11 -0
  474. package/types/src/content-drawer/drawer.service.d.ts +9 -0
  475. package/types/src/dialog/dialog-service.d.ts +11 -1
  476. package/types/src/notification/notification-service.d.ts +11 -1
  477. package/types/src/overlay/index.d.ts +5 -0
  478. package/types/src/overlay/overlay.animations.d.ts +26 -0
  479. package/types/src/overlay/overlay.component.d.ts +48 -0
  480. package/types/src/overlay/overlay.confirm-body.d.ts +42 -0
  481. package/types/src/overlay/overlay.gestures.d.ts +39 -0
  482. package/types/src/overlay/overlay.layout.d.ts +48 -0
  483. package/types/src/overlay/overlay.service.d.ts +62 -0
  484. package/types/src/overlay/overlay.stack.d.ts +25 -0
  485. package/types/src/overlay/overlay.types.d.ts +122 -0
  486. package/types/src/sheet/sheet.service.d.ts +9 -0
  487. package/types/src/theme/theme.service.d.ts +11 -0
  488. package/dist/area-CBjmKtN-.cjs.map +0 -1
  489. package/dist/area-CjX0Ckh9.js.map +0 -1
  490. package/dist/chunk-BCfY8kxB.cjs +0 -1
  491. package/dist/context-BRtGc7PP.cjs +0 -1
  492. package/dist/context-DgD3c6q-.js +0 -3
  493. package/dist/float-I4wePTk7.cjs +0 -1
  494. package/dist/notification-BT84PlwC.cjs.map +0 -1
  495. package/dist/notification-DvrozLTu.js.map +0 -1
  496. package/dist/src-59eVZMmI.js.map +0 -1
  497. package/dist/src-r2bV-AFk.cjs.map +0 -1
  498. package/dist/tailwind.mixin-BCz3GEpw.js +0 -219
  499. package/dist/tailwind.mixin-ZzkXQTFA.cjs +0 -2
  500. /package/dist/{flow-BPDtbhLe.js → agent/flow-CaPi2G8y.js} +0 -0
  501. /package/dist/{chunk-C_1VqBVD.js → agent/rolldown-runtime-DsMetpgY.js} +0 -0
  502. /package/dist/{animation-Bcwh107v.cjs → animation-CQRdLgzX.cjs} +0 -0
  503. /package/dist/{animation-CXKSuUoE.js → animation-hXFClrIn.js} +0 -0
  504. /package/dist/{date-range-inline-B_g1YXu3.js → date-range-inline-CpKG6qt2.js} +0 -0
  505. /package/dist/{flow-Dn9AZktE.cjs → flow-ClAJ6Qby.cjs} +0 -0
  506. /package/dist/{form-C1qS9uvS.js → form-rCZqoAoK.js} +0 -0
  507. /package/dist/{hashContent-BUqULUiZ.js → hashContent-B2IntJQf.js} +0 -0
  508. /package/dist/{hashContent-CI39BY-_.cjs → hashContent-CahnEuut.cjs} +0 -0
  509. /package/dist/{intersection-C0JuW_7U.js → intersection-BrXp4YTO.js} +0 -0
  510. /package/dist/{overlay-stack-J_eJCUTX.cjs → overlay-stack-7bs4ZNnh.cjs} +0 -0
  511. /package/dist/{overlay-stack-BJt_r6aZ.js → overlay-stack-DXPYHPhk.js} +0 -0
  512. /package/dist/{reduced-motion-B83yZbcO.js → reduced-motion-BZTLqAyl.js} +0 -0
  513. /package/dist/{search-BlGJ6uJv.js → search-CvUZRLF1.js} +0 -0
  514. /package/dist/{search-C8eAOzBm.cjs → search-CwMav5QB.cjs} +0 -0
  515. /package/dist/{store-Bmj6rvZY.js → store-CjzZDQt8.js} +0 -0
  516. /package/dist/{theme.events-EznKK2Y0.cjs → theme.events-DakXxZeP.cjs} +0 -0
  517. /package/dist/{theme.events-Bw3mYjUA.js → theme.events-NuihzD_p.js} +0 -0
  518. /package/dist/{theme.interface-Cyqv5XWY.js → theme.interface-Buged9Cg.js} +0 -0
  519. /package/dist/{theme.interface-CCE3L1ql.cjs → theme.interface-DTwkuAKJ.cjs} +0 -0
  520. /package/dist/{tslib.es6-PMITL0Z3.cjs → tslib.es6-Cnt75pb6.cjs} +0 -0
  521. /package/dist/{tslib.es6-vJQZBGJO.js → tslib.es6-DMzzJKHV.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"flow-Dn9AZktE.cjs","names":[],"sources":["../node_modules/@lit-labs/virtualizer/layouts/shared/SizeCache.js","../node_modules/@lit-labs/virtualizer/layouts/shared/BaseLayout.js","../node_modules/@lit-labs/virtualizer/layouts/flow.js"],"sourcesContent":["/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nexport class SizeCache {\n constructor(config) {\n this._map = new Map();\n this._roundAverageSize = false;\n this.totalSize = 0;\n if (config?.roundAverageSize === true) {\n this._roundAverageSize = true;\n }\n }\n set(index, value) {\n const prev = this._map.get(index) || 0;\n this._map.set(index, value);\n this.totalSize += value - prev;\n }\n get averageSize() {\n if (this._map.size > 0) {\n const average = this.totalSize / this._map.size;\n return this._roundAverageSize ? Math.round(average) : average;\n }\n return 0;\n }\n getSize(index) {\n return this._map.get(index);\n }\n clear() {\n this._map.clear();\n this.totalSize = 0;\n }\n}\n//# sourceMappingURL=SizeCache.js.map","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nexport function dim1(direction) {\n return direction === 'horizontal' ? 'width' : 'height';\n}\nexport function dim2(direction) {\n return direction === 'horizontal' ? 'height' : 'width';\n}\nexport function pos1(direction) {\n return direction === 'horizontal' ? 'left' : 'top';\n}\nexport function pos2(direction) {\n return direction === 'horizontal' ? 'top' : 'left';\n}\nexport class BaseLayout {\n _getDefaultConfig() {\n return {\n direction: 'vertical',\n };\n }\n constructor(hostSink, config) {\n /**\n * The last set viewport scroll position.\n */\n this._latestCoords = { left: 0, top: 0 };\n /**\n * Scrolling direction.\n */\n this._direction = null;\n /**\n * Dimensions of the viewport.\n */\n this._viewportSize = { width: 0, height: 0 };\n this.totalScrollSize = { width: 0, height: 0 };\n this.offsetWithinScroller = { left: 0, top: 0 };\n /**\n * Flag for debouncing asynchronous reflow requests.\n */\n this._pendingReflow = false;\n this._pendingLayoutUpdate = false;\n this._pin = null;\n /**\n * The index of the first item intersecting the viewport.\n */\n this._firstVisible = 0;\n /**\n * The index of the last item intersecting the viewport.\n */\n this._lastVisible = 0;\n /**\n * Pixel offset in the scroll direction of the first child.\n */\n this._physicalMin = 0;\n /**\n * Pixel offset in the scroll direction of the last child.\n */\n this._physicalMax = 0;\n /**\n * Index of the first child.\n */\n this._first = -1;\n /**\n * Index of the last child.\n */\n this._last = -1;\n /**\n * Length in the scrolling direction.\n */\n this._sizeDim = 'height';\n /**\n * Length in the non-scrolling direction.\n */\n this._secondarySizeDim = 'width';\n /**\n * Position in the scrolling direction.\n */\n this._positionDim = 'top';\n /**\n * Position in the non-scrolling direction.\n */\n this._secondaryPositionDim = 'left';\n /**\n * Current scroll offset in pixels.\n */\n this._scrollPosition = 0;\n /**\n * Difference between current scroll offset and scroll offset calculated due\n * to a reflow.\n */\n this._scrollError = 0;\n /**\n * Total number of items that could possibly be displayed. Used to help\n * calculate the scroll size.\n */\n this._items = [];\n /**\n * The total (estimated) length of all items in the scrolling direction.\n */\n this._scrollSize = 1;\n /**\n * Number of pixels beyond the viewport to still include\n * in the active range of items.\n */\n // TODO (graynorton): Probably want to make this something we calculate based\n // on viewport size, item size, other factors, possibly still with a dial of some kind\n this._overhang = 1000;\n this._hostSink = hostSink;\n // Delay setting config so that subclasses do setup work first\n Promise.resolve().then(() => (this.config = config || this._getDefaultConfig()));\n }\n set config(config) {\n Object.assign(this, Object.assign({}, this._getDefaultConfig(), config));\n }\n get config() {\n return {\n direction: this.direction,\n };\n }\n /**\n * Maximum index of children + 1, to help estimate total height of the scroll\n * space.\n */\n get items() {\n return this._items;\n }\n set items(items) {\n this._setItems(items);\n }\n _setItems(items) {\n if (items !== this._items) {\n this._items = items;\n this._scheduleReflow();\n }\n }\n /**\n * Primary scrolling direction.\n */\n get direction() {\n return this._direction;\n }\n set direction(dir) {\n // Force it to be either horizontal or vertical.\n dir = dir === 'horizontal' ? dir : 'vertical';\n if (dir !== this._direction) {\n this._direction = dir;\n this._sizeDim = dir === 'horizontal' ? 'width' : 'height';\n this._secondarySizeDim = dir === 'horizontal' ? 'height' : 'width';\n this._positionDim = dir === 'horizontal' ? 'left' : 'top';\n this._secondaryPositionDim = dir === 'horizontal' ? 'top' : 'left';\n this._triggerReflow();\n }\n }\n /**\n * Height and width of the viewport.\n */\n get viewportSize() {\n return this._viewportSize;\n }\n set viewportSize(dims) {\n const { _viewDim1, _viewDim2 } = this;\n Object.assign(this._viewportSize, dims);\n if (_viewDim2 !== this._viewDim2) {\n // this._viewDim2Changed();\n this._scheduleLayoutUpdate();\n }\n else if (_viewDim1 !== this._viewDim1) {\n this._checkThresholds();\n }\n }\n /**\n * Scroll offset of the viewport.\n */\n get viewportScroll() {\n return this._latestCoords;\n }\n set viewportScroll(coords) {\n Object.assign(this._latestCoords, coords);\n const oldPos = this._scrollPosition;\n this._scrollPosition = this._latestCoords[this._positionDim];\n const change = Math.abs(oldPos - this._scrollPosition);\n if (change >= 1) {\n this._checkThresholds();\n }\n }\n /**\n * Perform a reflow if one has been scheduled.\n */\n reflowIfNeeded(force = false) {\n if (force || this._pendingReflow) {\n this._pendingReflow = false;\n this._reflow();\n }\n }\n set pin(options) {\n this._pin = options;\n this._triggerReflow();\n }\n get pin() {\n if (this._pin !== null) {\n const { index, block } = this._pin;\n return {\n index: Math.max(0, Math.min(index, this.items.length - 1)),\n block,\n };\n }\n return null;\n }\n _clampScrollPosition(val) {\n return Math.max(-this.offsetWithinScroller[this._positionDim], Math.min(val, this.totalScrollSize[dim1(this.direction)] - this._viewDim1));\n }\n unpin() {\n if (this._pin !== null) {\n this._sendUnpinnedMessage();\n this._pin = null;\n }\n }\n _updateLayout() {\n // Override\n }\n // protected _viewDim2Changed(): void {\n // this._scheduleLayoutUpdate();\n // }\n /**\n * The height or width of the viewport, whichever corresponds to the scrolling direction.\n */\n get _viewDim1() {\n return this._viewportSize[this._sizeDim];\n }\n /**\n * The height or width of the viewport, whichever does NOT correspond to the scrolling direction.\n */\n get _viewDim2() {\n return this._viewportSize[this._secondarySizeDim];\n }\n _scheduleReflow() {\n this._pendingReflow = true;\n }\n _scheduleLayoutUpdate() {\n this._pendingLayoutUpdate = true;\n this._scheduleReflow();\n }\n // For triggering a reflow based on incoming changes to\n // the layout config.\n _triggerReflow() {\n this._scheduleLayoutUpdate();\n // TODO graynorton@: reflowIfNeeded() isn't really supposed\n // to be called internally. Address in larger cleanup\n // of virtualizer / layout interaction pattern.\n // this.reflowIfNeeded(true);\n Promise.resolve().then(() => this.reflowIfNeeded());\n }\n _reflow() {\n if (this._pendingLayoutUpdate) {\n this._updateLayout();\n this._pendingLayoutUpdate = false;\n }\n this._updateScrollSize();\n this._setPositionFromPin();\n this._getActiveItems();\n this._updateVisibleIndices();\n this._sendStateChangedMessage();\n }\n /**\n * If we are supposed to be pinned to a particular\n * item or set of coordinates, we set `_scrollPosition`\n * accordingly and adjust `_scrollError` as needed\n * so that the virtualizer can keep the scroll\n * position in the DOM in sync\n */\n _setPositionFromPin() {\n if (this.pin !== null) {\n const lastScrollPosition = this._scrollPosition;\n const { index, block } = this.pin;\n this._scrollPosition =\n this._calculateScrollIntoViewPosition({\n index,\n block: block || 'start',\n }) - this.offsetWithinScroller[this._positionDim];\n this._scrollError = lastScrollPosition - this._scrollPosition;\n }\n }\n /**\n * Calculate the coordinates to scroll to, given\n * a request to scroll to the element at a specific\n * index.\n *\n * Supports the same positioning options (`start`,\n * `center`, `end`, `nearest`) as the standard\n * `Element.scrollIntoView()` method, but currently\n * only considers the provided value in the `block`\n * dimension, since we don't yet have any layouts\n * that support virtualization in two dimensions.\n */\n _calculateScrollIntoViewPosition(options) {\n const { block } = options;\n const index = Math.min(this.items.length, Math.max(0, options.index));\n const itemStartPosition = this._getItemPosition(index)[this._positionDim];\n let scrollPosition = itemStartPosition;\n if (block !== 'start') {\n const itemSize = this._getItemSize(index)[this._sizeDim];\n if (block === 'center') {\n scrollPosition =\n itemStartPosition - 0.5 * this._viewDim1 + 0.5 * itemSize;\n }\n else {\n const itemEndPosition = itemStartPosition - this._viewDim1 + itemSize;\n if (block === 'end') {\n scrollPosition = itemEndPosition;\n }\n else {\n // block === 'nearest'\n const currentScrollPosition = this._scrollPosition;\n scrollPosition =\n Math.abs(currentScrollPosition - itemStartPosition) <\n Math.abs(currentScrollPosition - itemEndPosition)\n ? itemStartPosition\n : itemEndPosition;\n }\n }\n }\n scrollPosition += this.offsetWithinScroller[this._positionDim];\n return this._clampScrollPosition(scrollPosition);\n }\n getScrollIntoViewCoordinates(options) {\n return {\n [this._positionDim]: this._calculateScrollIntoViewPosition(options),\n };\n }\n _sendUnpinnedMessage() {\n this._hostSink({\n type: 'unpinned',\n });\n }\n _sendVisibilityChangedMessage() {\n this._hostSink({\n type: 'visibilityChanged',\n firstVisible: this._firstVisible,\n lastVisible: this._lastVisible,\n });\n }\n _sendStateChangedMessage() {\n const childPositions = new Map();\n if (this._first !== -1 && this._last !== -1) {\n for (let idx = this._first; idx <= this._last; idx++) {\n childPositions.set(idx, this._getItemPosition(idx));\n }\n }\n const message = {\n type: 'stateChanged',\n scrollSize: {\n [this._sizeDim]: this._scrollSize,\n [this._secondarySizeDim]: null,\n },\n range: {\n first: this._first,\n last: this._last,\n firstVisible: this._firstVisible,\n lastVisible: this._lastVisible,\n },\n childPositions,\n };\n if (this._scrollError) {\n message.scrollError = {\n [this._positionDim]: this._scrollError,\n [this._secondaryPositionDim]: 0,\n };\n this._scrollError = 0;\n }\n this._hostSink(message);\n }\n /**\n * Number of items to display.\n */\n get _num() {\n if (this._first === -1 || this._last === -1) {\n return 0;\n }\n return this._last - this._first + 1;\n }\n _checkThresholds() {\n if ((this._viewDim1 === 0 && this._num > 0) || this._pin !== null) {\n this._scheduleReflow();\n }\n else {\n const min = Math.max(0, this._scrollPosition - this._overhang);\n const max = Math.min(this._scrollSize, this._scrollPosition + this._viewDim1 + this._overhang);\n if (this._physicalMin > min || this._physicalMax < max) {\n this._scheduleReflow();\n }\n else {\n this._updateVisibleIndices({ emit: true });\n }\n }\n }\n /**\n * Find the indices of the first and last items to intersect the viewport.\n * Emit a visibleindiceschange event when either index changes.\n */\n _updateVisibleIndices(options) {\n if (this._first === -1 || this._last === -1)\n return;\n let firstVisible = this._first;\n while (firstVisible < this._last &&\n Math.round(this._getItemPosition(firstVisible)[this._positionDim] +\n this._getItemSize(firstVisible)[this._sizeDim]) <= Math.round(this._scrollPosition)) {\n firstVisible++;\n }\n let lastVisible = this._last;\n while (lastVisible > this._first &&\n Math.round(this._getItemPosition(lastVisible)[this._positionDim]) >=\n Math.round(this._scrollPosition + this._viewDim1)) {\n lastVisible--;\n }\n if (firstVisible !== this._firstVisible ||\n lastVisible !== this._lastVisible) {\n this._firstVisible = firstVisible;\n this._lastVisible = lastVisible;\n if (options && options.emit) {\n this._sendVisibilityChangedMessage();\n }\n }\n }\n}\n//# sourceMappingURL=BaseLayout.js.map","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nimport { SizeCache } from './shared/SizeCache.js';\nimport { BaseLayout, dim1 } from './shared/BaseLayout.js';\nexport const flow = (config) => Object.assign({\n type: FlowLayout,\n}, config);\nfunction leadingMargin(direction) {\n return direction === 'horizontal' ? 'marginLeft' : 'marginTop';\n}\nfunction trailingMargin(direction) {\n return direction === 'horizontal' ? 'marginRight' : 'marginBottom';\n}\nfunction offset(direction) {\n return direction === 'horizontal' ? 'xOffset' : 'yOffset';\n}\nfunction collapseMargins(a, b) {\n const m = [a, b].sort();\n return m[1] <= 0 ? Math.min(...m) : m[0] >= 0 ? Math.max(...m) : m[0] + m[1];\n}\nclass MetricsCache {\n constructor() {\n this._childSizeCache = new SizeCache();\n this._marginSizeCache = new SizeCache();\n this._metricsCache = new Map();\n }\n update(metrics, direction) {\n const marginsToUpdate = new Set();\n Object.keys(metrics).forEach((key) => {\n const k = Number(key);\n this._metricsCache.set(k, metrics[k]);\n this._childSizeCache.set(k, metrics[k][dim1(direction)]);\n marginsToUpdate.add(k);\n marginsToUpdate.add(k + 1);\n });\n for (const k of marginsToUpdate) {\n const a = this._metricsCache.get(k)?.[leadingMargin(direction)] || 0;\n const b = this._metricsCache.get(k - 1)?.[trailingMargin(direction)] || 0;\n this._marginSizeCache.set(k, collapseMargins(a, b));\n }\n }\n get averageChildSize() {\n return this._childSizeCache.averageSize;\n }\n get totalChildSize() {\n return this._childSizeCache.totalSize;\n }\n get averageMarginSize() {\n return this._marginSizeCache.averageSize;\n }\n get totalMarginSize() {\n return this._marginSizeCache.totalSize;\n }\n getLeadingMarginValue(index, direction) {\n return this._metricsCache.get(index)?.[leadingMargin(direction)] || 0;\n }\n getChildSize(index) {\n return this._childSizeCache.getSize(index);\n }\n getMarginSize(index) {\n return this._marginSizeCache.getSize(index);\n }\n clear() {\n this._childSizeCache.clear();\n this._marginSizeCache.clear();\n this._metricsCache.clear();\n }\n}\nexport class FlowLayout extends BaseLayout {\n constructor() {\n super(...arguments);\n /**\n * Initial estimate of item size\n */\n this._itemSize = { width: 100, height: 100 };\n /**\n * Indices of children mapped to their (position and length) in the scrolling\n * direction. Used to keep track of children that are in range.\n */\n this._physicalItems = new Map();\n /**\n * Used in tandem with _physicalItems to track children in range across\n * reflows.\n */\n this._newPhysicalItems = new Map();\n /**\n * Width and height of children by their index.\n */\n this._metricsCache = new MetricsCache();\n /**\n * anchorIdx is the anchor around which we reflow. It is designed to allow\n * jumping to any point of the scroll size. We choose it once and stick with\n * it until stable. _first and _last are deduced around it.\n */\n this._anchorIdx = null;\n /**\n * Position in the scrolling direction of the anchor child.\n */\n this._anchorPos = null;\n /**\n * Whether all children in range were in range during the previous reflow.\n */\n this._stable = true;\n this._measureChildren = true;\n this._estimate = true;\n }\n // protected _defaultConfig: BaseLayoutConfig = Object.assign({}, super._defaultConfig, {\n // })\n // constructor(config: Layout1dConfig) {\n // super(config);\n // }\n get measureChildren() {\n return this._measureChildren;\n }\n /**\n * Determine the average size of all children represented in the sizes\n * argument.\n */\n updateItemSizes(sizes) {\n this._metricsCache.update(sizes, this.direction);\n // if (this._nMeasured) {\n // this._updateItemSize();\n this._scheduleReflow();\n // }\n }\n /**\n * Set the average item size based on the total length and number of children\n * in range.\n */\n // _updateItemSize() {\n // // Keep integer values.\n // this._itemSize[this._sizeDim] = this._metricsCache.averageChildSize;\n // }\n _getPhysicalItem(idx) {\n return this._newPhysicalItems.get(idx) ?? this._physicalItems.get(idx);\n }\n _getSize(idx) {\n const item = this._getPhysicalItem(idx);\n return item && this._metricsCache.getChildSize(idx);\n }\n _getAverageSize() {\n return this._metricsCache.averageChildSize || this._itemSize[this._sizeDim];\n }\n _estimatePosition(idx) {\n const c = this._metricsCache;\n if (this._first === -1 || this._last === -1) {\n return (c.averageMarginSize +\n idx * (c.averageMarginSize + this._getAverageSize()));\n }\n else {\n if (idx < this._first) {\n const delta = this._first - idx;\n const refItem = this._getPhysicalItem(this._first);\n return (refItem.pos -\n (c.getMarginSize(this._first - 1) || c.averageMarginSize) -\n (delta * c.averageChildSize + (delta - 1) * c.averageMarginSize));\n }\n else {\n const delta = idx - this._last;\n const refItem = this._getPhysicalItem(this._last);\n return (refItem.pos +\n (c.getChildSize(this._last) || c.averageChildSize) +\n (c.getMarginSize(this._last) || c.averageMarginSize) +\n delta * (c.averageChildSize + c.averageMarginSize));\n }\n }\n }\n /**\n * Returns the position in the scrolling direction of the item at idx.\n * Estimates it if the item at idx is not in the DOM.\n */\n _getPosition(idx) {\n const item = this._getPhysicalItem(idx);\n const { averageMarginSize } = this._metricsCache;\n return idx === 0\n ? this._metricsCache.getMarginSize(0) ?? averageMarginSize\n : item\n ? item.pos\n : this._estimatePosition(idx);\n }\n _calculateAnchor(lower, upper) {\n if (lower <= 0) {\n return 0;\n }\n if (upper > this._scrollSize - this._viewDim1) {\n return this.items.length - 1;\n }\n return Math.max(0, Math.min(this.items.length - 1, Math.floor((lower + upper) / 2 / this._delta)));\n }\n _getAnchor(lower, upper) {\n if (this._physicalItems.size === 0) {\n return this._calculateAnchor(lower, upper);\n }\n if (this._first < 0) {\n return this._calculateAnchor(lower, upper);\n }\n if (this._last < 0) {\n return this._calculateAnchor(lower, upper);\n }\n const firstItem = this._getPhysicalItem(this._first), lastItem = this._getPhysicalItem(this._last), firstMin = firstItem.pos, lastMin = lastItem.pos, lastMax = lastMin + this._metricsCache.getChildSize(this._last);\n if (lastMax < lower) {\n // Window is entirely past physical items, calculate new anchor\n return this._calculateAnchor(lower, upper);\n }\n if (firstMin > upper) {\n // Window is entirely before physical items, calculate new anchor\n return this._calculateAnchor(lower, upper);\n }\n // Window contains a physical item\n // Find one, starting with the one that was previously first visible\n let candidateIdx = this._firstVisible - 1;\n let cMax = -Infinity;\n while (cMax < lower) {\n const candidate = this._getPhysicalItem(++candidateIdx);\n cMax = candidate.pos + this._metricsCache.getChildSize(candidateIdx);\n }\n return candidateIdx;\n }\n /**\n * Updates _first and _last based on items that should be in the current\n * viewed range.\n */\n _getActiveItems() {\n if (this._viewDim1 === 0 || this.items.length === 0) {\n this._clearItems();\n }\n else {\n this._getItems();\n }\n }\n /**\n * Sets the range to empty.\n */\n _clearItems() {\n this._first = -1;\n this._last = -1;\n this._physicalMin = 0;\n this._physicalMax = 0;\n const items = this._newPhysicalItems;\n this._newPhysicalItems = this._physicalItems;\n this._newPhysicalItems.clear();\n this._physicalItems = items;\n this._stable = true;\n }\n /*\n * Updates _first and _last based on items that should be in the given range.\n */\n _getItems() {\n const items = this._newPhysicalItems;\n this._stable = true;\n let lower, upper;\n // The anchorIdx is the anchor around which we reflow. It is designed to\n // allow jumping to any point of the scroll size. We choose it once and\n // stick with it until stable. first and last are deduced around it.\n // If we have a pinned item, we anchor on it\n if (this.pin !== null) {\n const { index } = this.pin;\n this._anchorIdx = index;\n this._anchorPos = this._getPosition(index);\n }\n // Determine the lower and upper bounds of the region to be\n // rendered, relative to the viewport\n lower = this._scrollPosition - this._overhang; //leadingOverhang;\n upper = this._scrollPosition + this._viewDim1 + this._overhang; // trailingOverhang;\n if (upper < 0 || lower > this._scrollSize) {\n this._clearItems();\n return;\n }\n // If we are scrolling to a specific index or if we are doing another\n // pass to stabilize a previously started reflow, we will already\n // have an anchor. If not, establish an anchor now.\n if (this._anchorIdx === null || this._anchorPos === null) {\n this._anchorIdx = this._getAnchor(lower, upper);\n this._anchorPos = this._getPosition(this._anchorIdx);\n }\n let anchorSize = this._getSize(this._anchorIdx);\n if (anchorSize === undefined) {\n this._stable = false;\n anchorSize = this._getAverageSize();\n }\n const anchorLeadingMargin = this._metricsCache.getMarginSize(this._anchorIdx) ??\n this._metricsCache.averageMarginSize;\n const anchorTrailingMargin = this._metricsCache.getMarginSize(this._anchorIdx + 1) ??\n this._metricsCache.averageMarginSize;\n if (this._anchorIdx === 0) {\n this._anchorPos = anchorLeadingMargin;\n }\n if (this._anchorIdx === this.items.length - 1) {\n this._anchorPos = this._scrollSize - anchorTrailingMargin - anchorSize;\n }\n // Anchor might be outside bounds, so prefer correcting the error and keep\n // that anchorIdx.\n let anchorErr = 0;\n if (this._anchorPos + anchorSize + anchorTrailingMargin < lower) {\n anchorErr = lower - (this._anchorPos + anchorSize + anchorTrailingMargin);\n }\n if (this._anchorPos - anchorLeadingMargin > upper) {\n anchorErr = upper - (this._anchorPos - anchorLeadingMargin);\n }\n if (anchorErr) {\n this._scrollPosition -= anchorErr;\n lower -= anchorErr;\n upper -= anchorErr;\n this._scrollError += anchorErr;\n }\n items.set(this._anchorIdx, { pos: this._anchorPos, size: anchorSize });\n this._first = this._last = this._anchorIdx;\n this._physicalMin = this._anchorPos - anchorLeadingMargin;\n this._physicalMax = this._anchorPos + anchorSize + anchorTrailingMargin;\n while (this._physicalMin > lower && this._first > 0) {\n let size = this._getSize(--this._first);\n if (size === undefined) {\n this._stable = false;\n size = this._getAverageSize();\n }\n let margin = this._metricsCache.getMarginSize(this._first);\n if (margin === undefined) {\n this._stable = false;\n margin = this._metricsCache.averageMarginSize;\n }\n this._physicalMin -= size;\n const pos = this._physicalMin;\n items.set(this._first, { pos, size });\n this._physicalMin -= margin;\n if (this._stable === false && this._estimate === false) {\n break;\n }\n }\n while (this._physicalMax < upper && this._last < this.items.length - 1) {\n let size = this._getSize(++this._last);\n if (size === undefined) {\n this._stable = false;\n size = this._getAverageSize();\n }\n let margin = this._metricsCache.getMarginSize(this._last);\n if (margin === undefined) {\n this._stable = false;\n margin = this._metricsCache.averageMarginSize;\n }\n const pos = this._physicalMax;\n items.set(this._last, { pos, size });\n this._physicalMax += size + margin;\n if (!this._stable && !this._estimate) {\n break;\n }\n }\n // This handles the cases where we were relying on estimated sizes.\n const extentErr = this._calculateError();\n if (extentErr) {\n this._physicalMin -= extentErr;\n this._physicalMax -= extentErr;\n this._anchorPos -= extentErr;\n this._scrollPosition -= extentErr;\n items.forEach((item) => (item.pos -= extentErr));\n this._scrollError += extentErr;\n }\n if (this._stable) {\n this._newPhysicalItems = this._physicalItems;\n this._newPhysicalItems.clear();\n this._physicalItems = items;\n }\n }\n _calculateError() {\n if (this._first === 0) {\n return this._physicalMin;\n }\n else if (this._physicalMin <= 0) {\n return this._physicalMin - this._first * this._delta;\n }\n else if (this._last === this.items.length - 1) {\n return this._physicalMax - this._scrollSize;\n }\n else if (this._physicalMax >= this._scrollSize) {\n return (this._physicalMax -\n this._scrollSize +\n (this.items.length - 1 - this._last) * this._delta);\n }\n return 0;\n }\n _reflow() {\n const { _first, _last } = this;\n super._reflow();\n if ((this._first === -1 && this._last == -1) ||\n (this._first === _first && this._last === _last)) {\n this._resetReflowState();\n }\n }\n _resetReflowState() {\n this._anchorIdx = null;\n this._anchorPos = null;\n this._stable = true;\n }\n _updateScrollSize() {\n const { averageMarginSize } = this._metricsCache;\n this._scrollSize = Math.max(1, this.items.length * (averageMarginSize + this._getAverageSize()) +\n averageMarginSize);\n }\n /**\n * Returns the average size (precise or estimated) of an item in the scrolling direction,\n * including any surrounding space.\n */\n get _delta() {\n const { averageMarginSize } = this._metricsCache;\n return this._getAverageSize() + averageMarginSize;\n }\n /**\n * Returns the top and left positioning of the item at idx.\n */\n _getItemPosition(idx) {\n return {\n [this._positionDim]: this._getPosition(idx),\n [this._secondaryPositionDim]: 0,\n [offset(this.direction)]: -(this._metricsCache.getLeadingMarginValue(idx, this.direction) ??\n this._metricsCache.averageMarginSize),\n };\n }\n /**\n * Returns the height and width of the item at idx.\n */\n _getItemSize(idx) {\n return {\n [this._sizeDim]: this._getSize(idx) || this._getAverageSize(),\n [this._secondarySizeDim]: this._itemSize[this._secondarySizeDim],\n };\n }\n _viewDim2Changed() {\n this._metricsCache.clear();\n this._scheduleReflow();\n }\n}\n//# sourceMappingURL=flow.js.map"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
1
+ {"version":3,"file":"flow-ClAJ6Qby.cjs","names":[],"sources":["../node_modules/@lit-labs/virtualizer/layouts/shared/SizeCache.js","../node_modules/@lit-labs/virtualizer/layouts/shared/BaseLayout.js","../node_modules/@lit-labs/virtualizer/layouts/flow.js"],"sourcesContent":["/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nexport class SizeCache {\n constructor(config) {\n this._map = new Map();\n this._roundAverageSize = false;\n this.totalSize = 0;\n if (config?.roundAverageSize === true) {\n this._roundAverageSize = true;\n }\n }\n set(index, value) {\n const prev = this._map.get(index) || 0;\n this._map.set(index, value);\n this.totalSize += value - prev;\n }\n get averageSize() {\n if (this._map.size > 0) {\n const average = this.totalSize / this._map.size;\n return this._roundAverageSize ? Math.round(average) : average;\n }\n return 0;\n }\n getSize(index) {\n return this._map.get(index);\n }\n clear() {\n this._map.clear();\n this.totalSize = 0;\n }\n}\n//# sourceMappingURL=SizeCache.js.map","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nexport function dim1(direction) {\n return direction === 'horizontal' ? 'width' : 'height';\n}\nexport function dim2(direction) {\n return direction === 'horizontal' ? 'height' : 'width';\n}\nexport function pos1(direction) {\n return direction === 'horizontal' ? 'left' : 'top';\n}\nexport function pos2(direction) {\n return direction === 'horizontal' ? 'top' : 'left';\n}\nexport class BaseLayout {\n _getDefaultConfig() {\n return {\n direction: 'vertical',\n };\n }\n constructor(hostSink, config) {\n /**\n * The last set viewport scroll position.\n */\n this._latestCoords = { left: 0, top: 0 };\n /**\n * Scrolling direction.\n */\n this._direction = null;\n /**\n * Dimensions of the viewport.\n */\n this._viewportSize = { width: 0, height: 0 };\n this.totalScrollSize = { width: 0, height: 0 };\n this.offsetWithinScroller = { left: 0, top: 0 };\n /**\n * Flag for debouncing asynchronous reflow requests.\n */\n this._pendingReflow = false;\n this._pendingLayoutUpdate = false;\n this._pin = null;\n /**\n * The index of the first item intersecting the viewport.\n */\n this._firstVisible = 0;\n /**\n * The index of the last item intersecting the viewport.\n */\n this._lastVisible = 0;\n /**\n * Pixel offset in the scroll direction of the first child.\n */\n this._physicalMin = 0;\n /**\n * Pixel offset in the scroll direction of the last child.\n */\n this._physicalMax = 0;\n /**\n * Index of the first child.\n */\n this._first = -1;\n /**\n * Index of the last child.\n */\n this._last = -1;\n /**\n * Length in the scrolling direction.\n */\n this._sizeDim = 'height';\n /**\n * Length in the non-scrolling direction.\n */\n this._secondarySizeDim = 'width';\n /**\n * Position in the scrolling direction.\n */\n this._positionDim = 'top';\n /**\n * Position in the non-scrolling direction.\n */\n this._secondaryPositionDim = 'left';\n /**\n * Current scroll offset in pixels.\n */\n this._scrollPosition = 0;\n /**\n * Difference between current scroll offset and scroll offset calculated due\n * to a reflow.\n */\n this._scrollError = 0;\n /**\n * Total number of items that could possibly be displayed. Used to help\n * calculate the scroll size.\n */\n this._items = [];\n /**\n * The total (estimated) length of all items in the scrolling direction.\n */\n this._scrollSize = 1;\n /**\n * Number of pixels beyond the viewport to still include\n * in the active range of items.\n */\n // TODO (graynorton): Probably want to make this something we calculate based\n // on viewport size, item size, other factors, possibly still with a dial of some kind\n this._overhang = 1000;\n this._hostSink = hostSink;\n // Delay setting config so that subclasses do setup work first\n Promise.resolve().then(() => (this.config = config || this._getDefaultConfig()));\n }\n set config(config) {\n Object.assign(this, Object.assign({}, this._getDefaultConfig(), config));\n }\n get config() {\n return {\n direction: this.direction,\n };\n }\n /**\n * Maximum index of children + 1, to help estimate total height of the scroll\n * space.\n */\n get items() {\n return this._items;\n }\n set items(items) {\n this._setItems(items);\n }\n _setItems(items) {\n if (items !== this._items) {\n this._items = items;\n this._scheduleReflow();\n }\n }\n /**\n * Primary scrolling direction.\n */\n get direction() {\n return this._direction;\n }\n set direction(dir) {\n // Force it to be either horizontal or vertical.\n dir = dir === 'horizontal' ? dir : 'vertical';\n if (dir !== this._direction) {\n this._direction = dir;\n this._sizeDim = dir === 'horizontal' ? 'width' : 'height';\n this._secondarySizeDim = dir === 'horizontal' ? 'height' : 'width';\n this._positionDim = dir === 'horizontal' ? 'left' : 'top';\n this._secondaryPositionDim = dir === 'horizontal' ? 'top' : 'left';\n this._triggerReflow();\n }\n }\n /**\n * Height and width of the viewport.\n */\n get viewportSize() {\n return this._viewportSize;\n }\n set viewportSize(dims) {\n const { _viewDim1, _viewDim2 } = this;\n Object.assign(this._viewportSize, dims);\n if (_viewDim2 !== this._viewDim2) {\n // this._viewDim2Changed();\n this._scheduleLayoutUpdate();\n }\n else if (_viewDim1 !== this._viewDim1) {\n this._checkThresholds();\n }\n }\n /**\n * Scroll offset of the viewport.\n */\n get viewportScroll() {\n return this._latestCoords;\n }\n set viewportScroll(coords) {\n Object.assign(this._latestCoords, coords);\n const oldPos = this._scrollPosition;\n this._scrollPosition = this._latestCoords[this._positionDim];\n const change = Math.abs(oldPos - this._scrollPosition);\n if (change >= 1) {\n this._checkThresholds();\n }\n }\n /**\n * Perform a reflow if one has been scheduled.\n */\n reflowIfNeeded(force = false) {\n if (force || this._pendingReflow) {\n this._pendingReflow = false;\n this._reflow();\n }\n }\n set pin(options) {\n this._pin = options;\n this._triggerReflow();\n }\n get pin() {\n if (this._pin !== null) {\n const { index, block } = this._pin;\n return {\n index: Math.max(0, Math.min(index, this.items.length - 1)),\n block,\n };\n }\n return null;\n }\n _clampScrollPosition(val) {\n return Math.max(-this.offsetWithinScroller[this._positionDim], Math.min(val, this.totalScrollSize[dim1(this.direction)] - this._viewDim1));\n }\n unpin() {\n if (this._pin !== null) {\n this._sendUnpinnedMessage();\n this._pin = null;\n }\n }\n _updateLayout() {\n // Override\n }\n // protected _viewDim2Changed(): void {\n // this._scheduleLayoutUpdate();\n // }\n /**\n * The height or width of the viewport, whichever corresponds to the scrolling direction.\n */\n get _viewDim1() {\n return this._viewportSize[this._sizeDim];\n }\n /**\n * The height or width of the viewport, whichever does NOT correspond to the scrolling direction.\n */\n get _viewDim2() {\n return this._viewportSize[this._secondarySizeDim];\n }\n _scheduleReflow() {\n this._pendingReflow = true;\n }\n _scheduleLayoutUpdate() {\n this._pendingLayoutUpdate = true;\n this._scheduleReflow();\n }\n // For triggering a reflow based on incoming changes to\n // the layout config.\n _triggerReflow() {\n this._scheduleLayoutUpdate();\n // TODO graynorton@: reflowIfNeeded() isn't really supposed\n // to be called internally. Address in larger cleanup\n // of virtualizer / layout interaction pattern.\n // this.reflowIfNeeded(true);\n Promise.resolve().then(() => this.reflowIfNeeded());\n }\n _reflow() {\n if (this._pendingLayoutUpdate) {\n this._updateLayout();\n this._pendingLayoutUpdate = false;\n }\n this._updateScrollSize();\n this._setPositionFromPin();\n this._getActiveItems();\n this._updateVisibleIndices();\n this._sendStateChangedMessage();\n }\n /**\n * If we are supposed to be pinned to a particular\n * item or set of coordinates, we set `_scrollPosition`\n * accordingly and adjust `_scrollError` as needed\n * so that the virtualizer can keep the scroll\n * position in the DOM in sync\n */\n _setPositionFromPin() {\n if (this.pin !== null) {\n const lastScrollPosition = this._scrollPosition;\n const { index, block } = this.pin;\n this._scrollPosition =\n this._calculateScrollIntoViewPosition({\n index,\n block: block || 'start',\n }) - this.offsetWithinScroller[this._positionDim];\n this._scrollError = lastScrollPosition - this._scrollPosition;\n }\n }\n /**\n * Calculate the coordinates to scroll to, given\n * a request to scroll to the element at a specific\n * index.\n *\n * Supports the same positioning options (`start`,\n * `center`, `end`, `nearest`) as the standard\n * `Element.scrollIntoView()` method, but currently\n * only considers the provided value in the `block`\n * dimension, since we don't yet have any layouts\n * that support virtualization in two dimensions.\n */\n _calculateScrollIntoViewPosition(options) {\n const { block } = options;\n const index = Math.min(this.items.length, Math.max(0, options.index));\n const itemStartPosition = this._getItemPosition(index)[this._positionDim];\n let scrollPosition = itemStartPosition;\n if (block !== 'start') {\n const itemSize = this._getItemSize(index)[this._sizeDim];\n if (block === 'center') {\n scrollPosition =\n itemStartPosition - 0.5 * this._viewDim1 + 0.5 * itemSize;\n }\n else {\n const itemEndPosition = itemStartPosition - this._viewDim1 + itemSize;\n if (block === 'end') {\n scrollPosition = itemEndPosition;\n }\n else {\n // block === 'nearest'\n const currentScrollPosition = this._scrollPosition;\n scrollPosition =\n Math.abs(currentScrollPosition - itemStartPosition) <\n Math.abs(currentScrollPosition - itemEndPosition)\n ? itemStartPosition\n : itemEndPosition;\n }\n }\n }\n scrollPosition += this.offsetWithinScroller[this._positionDim];\n return this._clampScrollPosition(scrollPosition);\n }\n getScrollIntoViewCoordinates(options) {\n return {\n [this._positionDim]: this._calculateScrollIntoViewPosition(options),\n };\n }\n _sendUnpinnedMessage() {\n this._hostSink({\n type: 'unpinned',\n });\n }\n _sendVisibilityChangedMessage() {\n this._hostSink({\n type: 'visibilityChanged',\n firstVisible: this._firstVisible,\n lastVisible: this._lastVisible,\n });\n }\n _sendStateChangedMessage() {\n const childPositions = new Map();\n if (this._first !== -1 && this._last !== -1) {\n for (let idx = this._first; idx <= this._last; idx++) {\n childPositions.set(idx, this._getItemPosition(idx));\n }\n }\n const message = {\n type: 'stateChanged',\n scrollSize: {\n [this._sizeDim]: this._scrollSize,\n [this._secondarySizeDim]: null,\n },\n range: {\n first: this._first,\n last: this._last,\n firstVisible: this._firstVisible,\n lastVisible: this._lastVisible,\n },\n childPositions,\n };\n if (this._scrollError) {\n message.scrollError = {\n [this._positionDim]: this._scrollError,\n [this._secondaryPositionDim]: 0,\n };\n this._scrollError = 0;\n }\n this._hostSink(message);\n }\n /**\n * Number of items to display.\n */\n get _num() {\n if (this._first === -1 || this._last === -1) {\n return 0;\n }\n return this._last - this._first + 1;\n }\n _checkThresholds() {\n if ((this._viewDim1 === 0 && this._num > 0) || this._pin !== null) {\n this._scheduleReflow();\n }\n else {\n const min = Math.max(0, this._scrollPosition - this._overhang);\n const max = Math.min(this._scrollSize, this._scrollPosition + this._viewDim1 + this._overhang);\n if (this._physicalMin > min || this._physicalMax < max) {\n this._scheduleReflow();\n }\n else {\n this._updateVisibleIndices({ emit: true });\n }\n }\n }\n /**\n * Find the indices of the first and last items to intersect the viewport.\n * Emit a visibleindiceschange event when either index changes.\n */\n _updateVisibleIndices(options) {\n if (this._first === -1 || this._last === -1)\n return;\n let firstVisible = this._first;\n while (firstVisible < this._last &&\n Math.round(this._getItemPosition(firstVisible)[this._positionDim] +\n this._getItemSize(firstVisible)[this._sizeDim]) <= Math.round(this._scrollPosition)) {\n firstVisible++;\n }\n let lastVisible = this._last;\n while (lastVisible > this._first &&\n Math.round(this._getItemPosition(lastVisible)[this._positionDim]) >=\n Math.round(this._scrollPosition + this._viewDim1)) {\n lastVisible--;\n }\n if (firstVisible !== this._firstVisible ||\n lastVisible !== this._lastVisible) {\n this._firstVisible = firstVisible;\n this._lastVisible = lastVisible;\n if (options && options.emit) {\n this._sendVisibilityChangedMessage();\n }\n }\n }\n}\n//# sourceMappingURL=BaseLayout.js.map","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nimport { SizeCache } from './shared/SizeCache.js';\nimport { BaseLayout, dim1 } from './shared/BaseLayout.js';\nexport const flow = (config) => Object.assign({\n type: FlowLayout,\n}, config);\nfunction leadingMargin(direction) {\n return direction === 'horizontal' ? 'marginLeft' : 'marginTop';\n}\nfunction trailingMargin(direction) {\n return direction === 'horizontal' ? 'marginRight' : 'marginBottom';\n}\nfunction offset(direction) {\n return direction === 'horizontal' ? 'xOffset' : 'yOffset';\n}\nfunction collapseMargins(a, b) {\n const m = [a, b].sort();\n return m[1] <= 0 ? Math.min(...m) : m[0] >= 0 ? Math.max(...m) : m[0] + m[1];\n}\nclass MetricsCache {\n constructor() {\n this._childSizeCache = new SizeCache();\n this._marginSizeCache = new SizeCache();\n this._metricsCache = new Map();\n }\n update(metrics, direction) {\n const marginsToUpdate = new Set();\n Object.keys(metrics).forEach((key) => {\n const k = Number(key);\n this._metricsCache.set(k, metrics[k]);\n this._childSizeCache.set(k, metrics[k][dim1(direction)]);\n marginsToUpdate.add(k);\n marginsToUpdate.add(k + 1);\n });\n for (const k of marginsToUpdate) {\n const a = this._metricsCache.get(k)?.[leadingMargin(direction)] || 0;\n const b = this._metricsCache.get(k - 1)?.[trailingMargin(direction)] || 0;\n this._marginSizeCache.set(k, collapseMargins(a, b));\n }\n }\n get averageChildSize() {\n return this._childSizeCache.averageSize;\n }\n get totalChildSize() {\n return this._childSizeCache.totalSize;\n }\n get averageMarginSize() {\n return this._marginSizeCache.averageSize;\n }\n get totalMarginSize() {\n return this._marginSizeCache.totalSize;\n }\n getLeadingMarginValue(index, direction) {\n return this._metricsCache.get(index)?.[leadingMargin(direction)] || 0;\n }\n getChildSize(index) {\n return this._childSizeCache.getSize(index);\n }\n getMarginSize(index) {\n return this._marginSizeCache.getSize(index);\n }\n clear() {\n this._childSizeCache.clear();\n this._marginSizeCache.clear();\n this._metricsCache.clear();\n }\n}\nexport class FlowLayout extends BaseLayout {\n constructor() {\n super(...arguments);\n /**\n * Initial estimate of item size\n */\n this._itemSize = { width: 100, height: 100 };\n /**\n * Indices of children mapped to their (position and length) in the scrolling\n * direction. Used to keep track of children that are in range.\n */\n this._physicalItems = new Map();\n /**\n * Used in tandem with _physicalItems to track children in range across\n * reflows.\n */\n this._newPhysicalItems = new Map();\n /**\n * Width and height of children by their index.\n */\n this._metricsCache = new MetricsCache();\n /**\n * anchorIdx is the anchor around which we reflow. It is designed to allow\n * jumping to any point of the scroll size. We choose it once and stick with\n * it until stable. _first and _last are deduced around it.\n */\n this._anchorIdx = null;\n /**\n * Position in the scrolling direction of the anchor child.\n */\n this._anchorPos = null;\n /**\n * Whether all children in range were in range during the previous reflow.\n */\n this._stable = true;\n this._measureChildren = true;\n this._estimate = true;\n }\n // protected _defaultConfig: BaseLayoutConfig = Object.assign({}, super._defaultConfig, {\n // })\n // constructor(config: Layout1dConfig) {\n // super(config);\n // }\n get measureChildren() {\n return this._measureChildren;\n }\n /**\n * Determine the average size of all children represented in the sizes\n * argument.\n */\n updateItemSizes(sizes) {\n this._metricsCache.update(sizes, this.direction);\n // if (this._nMeasured) {\n // this._updateItemSize();\n this._scheduleReflow();\n // }\n }\n /**\n * Set the average item size based on the total length and number of children\n * in range.\n */\n // _updateItemSize() {\n // // Keep integer values.\n // this._itemSize[this._sizeDim] = this._metricsCache.averageChildSize;\n // }\n _getPhysicalItem(idx) {\n return this._newPhysicalItems.get(idx) ?? this._physicalItems.get(idx);\n }\n _getSize(idx) {\n const item = this._getPhysicalItem(idx);\n return item && this._metricsCache.getChildSize(idx);\n }\n _getAverageSize() {\n return this._metricsCache.averageChildSize || this._itemSize[this._sizeDim];\n }\n _estimatePosition(idx) {\n const c = this._metricsCache;\n if (this._first === -1 || this._last === -1) {\n return (c.averageMarginSize +\n idx * (c.averageMarginSize + this._getAverageSize()));\n }\n else {\n if (idx < this._first) {\n const delta = this._first - idx;\n const refItem = this._getPhysicalItem(this._first);\n return (refItem.pos -\n (c.getMarginSize(this._first - 1) || c.averageMarginSize) -\n (delta * c.averageChildSize + (delta - 1) * c.averageMarginSize));\n }\n else {\n const delta = idx - this._last;\n const refItem = this._getPhysicalItem(this._last);\n return (refItem.pos +\n (c.getChildSize(this._last) || c.averageChildSize) +\n (c.getMarginSize(this._last) || c.averageMarginSize) +\n delta * (c.averageChildSize + c.averageMarginSize));\n }\n }\n }\n /**\n * Returns the position in the scrolling direction of the item at idx.\n * Estimates it if the item at idx is not in the DOM.\n */\n _getPosition(idx) {\n const item = this._getPhysicalItem(idx);\n const { averageMarginSize } = this._metricsCache;\n return idx === 0\n ? this._metricsCache.getMarginSize(0) ?? averageMarginSize\n : item\n ? item.pos\n : this._estimatePosition(idx);\n }\n _calculateAnchor(lower, upper) {\n if (lower <= 0) {\n return 0;\n }\n if (upper > this._scrollSize - this._viewDim1) {\n return this.items.length - 1;\n }\n return Math.max(0, Math.min(this.items.length - 1, Math.floor((lower + upper) / 2 / this._delta)));\n }\n _getAnchor(lower, upper) {\n if (this._physicalItems.size === 0) {\n return this._calculateAnchor(lower, upper);\n }\n if (this._first < 0) {\n return this._calculateAnchor(lower, upper);\n }\n if (this._last < 0) {\n return this._calculateAnchor(lower, upper);\n }\n const firstItem = this._getPhysicalItem(this._first), lastItem = this._getPhysicalItem(this._last), firstMin = firstItem.pos, lastMin = lastItem.pos, lastMax = lastMin + this._metricsCache.getChildSize(this._last);\n if (lastMax < lower) {\n // Window is entirely past physical items, calculate new anchor\n return this._calculateAnchor(lower, upper);\n }\n if (firstMin > upper) {\n // Window is entirely before physical items, calculate new anchor\n return this._calculateAnchor(lower, upper);\n }\n // Window contains a physical item\n // Find one, starting with the one that was previously first visible\n let candidateIdx = this._firstVisible - 1;\n let cMax = -Infinity;\n while (cMax < lower) {\n const candidate = this._getPhysicalItem(++candidateIdx);\n cMax = candidate.pos + this._metricsCache.getChildSize(candidateIdx);\n }\n return candidateIdx;\n }\n /**\n * Updates _first and _last based on items that should be in the current\n * viewed range.\n */\n _getActiveItems() {\n if (this._viewDim1 === 0 || this.items.length === 0) {\n this._clearItems();\n }\n else {\n this._getItems();\n }\n }\n /**\n * Sets the range to empty.\n */\n _clearItems() {\n this._first = -1;\n this._last = -1;\n this._physicalMin = 0;\n this._physicalMax = 0;\n const items = this._newPhysicalItems;\n this._newPhysicalItems = this._physicalItems;\n this._newPhysicalItems.clear();\n this._physicalItems = items;\n this._stable = true;\n }\n /*\n * Updates _first and _last based on items that should be in the given range.\n */\n _getItems() {\n const items = this._newPhysicalItems;\n this._stable = true;\n let lower, upper;\n // The anchorIdx is the anchor around which we reflow. It is designed to\n // allow jumping to any point of the scroll size. We choose it once and\n // stick with it until stable. first and last are deduced around it.\n // If we have a pinned item, we anchor on it\n if (this.pin !== null) {\n const { index } = this.pin;\n this._anchorIdx = index;\n this._anchorPos = this._getPosition(index);\n }\n // Determine the lower and upper bounds of the region to be\n // rendered, relative to the viewport\n lower = this._scrollPosition - this._overhang; //leadingOverhang;\n upper = this._scrollPosition + this._viewDim1 + this._overhang; // trailingOverhang;\n if (upper < 0 || lower > this._scrollSize) {\n this._clearItems();\n return;\n }\n // If we are scrolling to a specific index or if we are doing another\n // pass to stabilize a previously started reflow, we will already\n // have an anchor. If not, establish an anchor now.\n if (this._anchorIdx === null || this._anchorPos === null) {\n this._anchorIdx = this._getAnchor(lower, upper);\n this._anchorPos = this._getPosition(this._anchorIdx);\n }\n let anchorSize = this._getSize(this._anchorIdx);\n if (anchorSize === undefined) {\n this._stable = false;\n anchorSize = this._getAverageSize();\n }\n const anchorLeadingMargin = this._metricsCache.getMarginSize(this._anchorIdx) ??\n this._metricsCache.averageMarginSize;\n const anchorTrailingMargin = this._metricsCache.getMarginSize(this._anchorIdx + 1) ??\n this._metricsCache.averageMarginSize;\n if (this._anchorIdx === 0) {\n this._anchorPos = anchorLeadingMargin;\n }\n if (this._anchorIdx === this.items.length - 1) {\n this._anchorPos = this._scrollSize - anchorTrailingMargin - anchorSize;\n }\n // Anchor might be outside bounds, so prefer correcting the error and keep\n // that anchorIdx.\n let anchorErr = 0;\n if (this._anchorPos + anchorSize + anchorTrailingMargin < lower) {\n anchorErr = lower - (this._anchorPos + anchorSize + anchorTrailingMargin);\n }\n if (this._anchorPos - anchorLeadingMargin > upper) {\n anchorErr = upper - (this._anchorPos - anchorLeadingMargin);\n }\n if (anchorErr) {\n this._scrollPosition -= anchorErr;\n lower -= anchorErr;\n upper -= anchorErr;\n this._scrollError += anchorErr;\n }\n items.set(this._anchorIdx, { pos: this._anchorPos, size: anchorSize });\n this._first = this._last = this._anchorIdx;\n this._physicalMin = this._anchorPos - anchorLeadingMargin;\n this._physicalMax = this._anchorPos + anchorSize + anchorTrailingMargin;\n while (this._physicalMin > lower && this._first > 0) {\n let size = this._getSize(--this._first);\n if (size === undefined) {\n this._stable = false;\n size = this._getAverageSize();\n }\n let margin = this._metricsCache.getMarginSize(this._first);\n if (margin === undefined) {\n this._stable = false;\n margin = this._metricsCache.averageMarginSize;\n }\n this._physicalMin -= size;\n const pos = this._physicalMin;\n items.set(this._first, { pos, size });\n this._physicalMin -= margin;\n if (this._stable === false && this._estimate === false) {\n break;\n }\n }\n while (this._physicalMax < upper && this._last < this.items.length - 1) {\n let size = this._getSize(++this._last);\n if (size === undefined) {\n this._stable = false;\n size = this._getAverageSize();\n }\n let margin = this._metricsCache.getMarginSize(this._last);\n if (margin === undefined) {\n this._stable = false;\n margin = this._metricsCache.averageMarginSize;\n }\n const pos = this._physicalMax;\n items.set(this._last, { pos, size });\n this._physicalMax += size + margin;\n if (!this._stable && !this._estimate) {\n break;\n }\n }\n // This handles the cases where we were relying on estimated sizes.\n const extentErr = this._calculateError();\n if (extentErr) {\n this._physicalMin -= extentErr;\n this._physicalMax -= extentErr;\n this._anchorPos -= extentErr;\n this._scrollPosition -= extentErr;\n items.forEach((item) => (item.pos -= extentErr));\n this._scrollError += extentErr;\n }\n if (this._stable) {\n this._newPhysicalItems = this._physicalItems;\n this._newPhysicalItems.clear();\n this._physicalItems = items;\n }\n }\n _calculateError() {\n if (this._first === 0) {\n return this._physicalMin;\n }\n else if (this._physicalMin <= 0) {\n return this._physicalMin - this._first * this._delta;\n }\n else if (this._last === this.items.length - 1) {\n return this._physicalMax - this._scrollSize;\n }\n else if (this._physicalMax >= this._scrollSize) {\n return (this._physicalMax -\n this._scrollSize +\n (this.items.length - 1 - this._last) * this._delta);\n }\n return 0;\n }\n _reflow() {\n const { _first, _last } = this;\n super._reflow();\n if ((this._first === -1 && this._last == -1) ||\n (this._first === _first && this._last === _last)) {\n this._resetReflowState();\n }\n }\n _resetReflowState() {\n this._anchorIdx = null;\n this._anchorPos = null;\n this._stable = true;\n }\n _updateScrollSize() {\n const { averageMarginSize } = this._metricsCache;\n this._scrollSize = Math.max(1, this.items.length * (averageMarginSize + this._getAverageSize()) +\n averageMarginSize);\n }\n /**\n * Returns the average size (precise or estimated) of an item in the scrolling direction,\n * including any surrounding space.\n */\n get _delta() {\n const { averageMarginSize } = this._metricsCache;\n return this._getAverageSize() + averageMarginSize;\n }\n /**\n * Returns the top and left positioning of the item at idx.\n */\n _getItemPosition(idx) {\n return {\n [this._positionDim]: this._getPosition(idx),\n [this._secondaryPositionDim]: 0,\n [offset(this.direction)]: -(this._metricsCache.getLeadingMarginValue(idx, this.direction) ??\n this._metricsCache.averageMarginSize),\n };\n }\n /**\n * Returns the height and width of the item at idx.\n */\n _getItemSize(idx) {\n return {\n [this._sizeDim]: this._getSize(idx) || this._getAverageSize(),\n [this._secondarySizeDim]: this._itemSize[this._secondarySizeDim],\n };\n }\n _viewDim2Changed() {\n this._metricsCache.clear();\n this._scheduleReflow();\n }\n}\n//# sourceMappingURL=flow.js.map"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"form-C1qS9uvS.js","names":[],"sources":["../src/form/form.ts"],"sourcesContent":["import { customElement } from 'lit/decorators.js'\n\n/**\n * A thin ergonomic wrapper around a native `<form>` element. Its children are\n * reparented into a `<form>` element in light DOM on connection, so:\n *\n * - Form-associated custom elements (FACE) resolve their `internals.form`\n * correctly via native DOM ancestry.\n * - `new FormData(form)` collects values from every FACE + native control\n * without any manual walking.\n * - `form.reset()` triggers `formResetCallback()` on every FACE.\n * - `form.reportValidity()` runs native validation UI.\n * - `<button type=\"submit\">` and `<schmancy-button type=\"submit\">` both\n * submit the form via the native submitter pipeline.\n *\n * This component exists only to translate the native `submit` / `reset`\n * events into the Schmancy event shape (`detail: FormData`). All heavy\n * lifting is the platform's.\n *\n * @element schmancy-form\n * @fires submit - `CustomEvent<FormData>` emitted when the form is submitted.\n * @fires reset - Emitted after the underlying form resets.\n */\n@customElement('schmancy-form')\nexport default class SchmancyForm extends HTMLElement {\n\tpublic static readonly tagName: string = 'schmancy-form'\n\n\tprivate _form: HTMLFormElement | null = null\n\tprivate _wrapped = false\n\n\t/** ElementInternals for `:state(invalid)` / `:state(submitting)` broadcasting. */\n\tprivate readonly _internals: ElementInternals | undefined = (() => {\n\t\ttry { return this.attachInternals() } catch { return undefined }\n\t})()\n\n\t/** Skip built-in constraint validation on submit. Mirrors `<form novalidate>`. */\n\tget novalidate(): boolean {\n\t\treturn this.hasAttribute('novalidate')\n\t}\n\tset novalidate(value: boolean) {\n\t\tif (value) this.setAttribute('novalidate', '')\n\t\telse this.removeAttribute('novalidate')\n\t}\n\n\tconnectedCallback(): void {\n\t\tthis.ensureForm()\n\t}\n\n\tdisconnectedCallback(): void {\n\t\tif (this._form) {\n\t\t\tthis._form.removeEventListener('submit', this._onSubmit)\n\t\t\tthis._form.removeEventListener('reset', this._onReset)\n\t\t}\n\t}\n\n\t/**\n\t * On first connection, create the internal light-DOM `<form>` and move\n\t * existing children into it. Re-entry is a no-op.\n\t */\n\tprivate ensureForm(): void {\n\t\tif (this._wrapped) return\n\n\t\t// Respect an explicit consumer-supplied wrapping <form>.\n\t\tconst existing = Array.from(this.children).find(c => c instanceof HTMLFormElement) as\n\t\t\t| HTMLFormElement\n\t\t\t| undefined\n\n\t\tconst form = existing ?? document.createElement('form')\n\t\tform.noValidate = true\n\n\t\tif (!existing) {\n\t\t\t// Snapshot children because appending mutates `this.childNodes`.\n\t\t\tconst children = Array.from(this.childNodes)\n\t\t\tfor (const node of children) form.appendChild(node)\n\t\t\tthis.appendChild(form)\n\t\t}\n\n\t\tform.addEventListener('submit', this._onSubmit)\n\t\tform.addEventListener('reset', this._onReset)\n\n\t\tthis._form = form\n\t\tthis._wrapped = true\n\t}\n\n\tprivate _onSubmit = (e: SubmitEvent): void => {\n\t\t// Prevent the default navigation AND stop the native submit from\n\t\t// bubbling past this wrapper — otherwise consumers listening for\n\t\t// `submit` on <schmancy-form> would see the native event plus our\n\t\t// CustomEvent (two fires per submission).\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\t\tif (!this.novalidate && !this._form!.reportValidity()) {\n\t\t\tthis._internals?.states.add('invalid')\n\t\t\treturn\n\t\t}\n\t\tthis._internals?.states.delete('invalid')\n\t\tthis._internals?.states.add('submitting')\n\t\ttry {\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent('submit', {\n\t\t\t\t\tdetail: new FormData(this._form!),\n\t\t\t\t}),\n\t\t\t)\n\t\t} finally {\n\t\t\tthis._internals?.states.delete('submitting')\n\t\t}\n\t}\n\n\tprivate _onReset = (e: Event): void => {\n\t\te.stopPropagation()\n\t\tthis._internals?.states.delete('invalid')\n\t\tthis.dispatchEvent(new CustomEvent('reset'))\n\t}\n\n\t/** Programmatically submit via the native submitter pipeline. */\n\tpublic submit(): boolean {\n\t\tif (!this._form) return false\n\t\tif (!this.novalidate && !this._form.reportValidity()) return false\n\t\tthis._form.requestSubmit()\n\t\treturn true\n\t}\n\n\t/** Programmatically reset via native `form.reset()`. */\n\tpublic reset(): void {\n\t\tthis._form?.reset()\n\t}\n\n\tpublic reportValidity(): boolean {\n\t\treturn this._form?.reportValidity() ?? true\n\t}\n\n\tpublic checkValidity(): boolean {\n\t\treturn this._form?.checkValidity() ?? true\n\t}\n\n\t/** Snapshot of current form values. Equivalent to `new FormData(this.form)`. */\n\tpublic getFormData(): FormData {\n\t\treturn this._form ? new FormData(this._form) : new FormData()\n\t}\n\n\t/** The underlying `<form>` element (escape hatch for advanced integration). */\n\tpublic get form(): HTMLFormElement | null {\n\t\treturn this._form\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-form': SchmancyForm\n\t}\n}\n\n// === Retained type surface ===\n// These interfaces were part of the old collection-based engine. They're kept\n// exported because downstream code may still import them as documentation.\n// The new implementation no longer uses them 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<FormData>\n\treset: CustomEvent\n}\n"],"mappings":";;AAwBe,IAAA,IAAA,cAA2B,YAAA;CAAA,YAAA,GAAA,GAAA;AAAA,QAAA,GAAA,EAAA,EAAA,KAAA,QAGD,MAAA,KAAA,WAAA,CACrB,GAAA,KAAA,oBAAA;AAIlB,OAAA;AAAM,WAAO,KAAK,iBAAA;WAAA;AAA4B;;MAAA,EAAA,KAAA,aAoD1B,MAAA;AAOpB,OAFA,EAAE,gBAAA,EACF,EAAE,iBAAA,EACG,KAAK,cAAe,KAAK,MAAO,gBAAA,EAArC;AAIA,SAAK,YAAY,OAAO,OAAO,UAAA,EAC/B,KAAK,YAAY,OAAO,IAAI,aAAA;AAC5B,QAAA;AACC,UAAK,cACJ,IAAI,YAAY,UAAU,EACzB,QAAQ,IAAI,SAAS,KAAK,MAAA,EAAA,CAAA,CAAA;cAAA;AAI5B,UAAK,YAAY,OAAO,OAAO,aAAA;;SAZ/B,MAAK,YAAY,OAAO,IAAI,UAAA;KAAA,KAAA,YAgBV,MAAA;AACnB,KAAE,iBAAA,EACF,KAAK,YAAY,OAAO,OAAO,UAAA,EAC/B,KAAK,cAAc,IAAI,YAAY,QAAA,CAAA;;;CAAA;AAAA,OAAA,UAtFK;;CAWzC,IAAA,aAAI;AACH,SAAO,KAAK,aAAa,aAAA;;CAE1B,IAAA,WAAe,GAAA;AACV,MAAO,KAAK,aAAa,cAAc,GAAA,GACtC,KAAK,gBAAgB,aAAA;;CAG3B,oBAAA;AACC,OAAK,YAAA;;CAGN,uBAAA;AACK,OAAK,UACR,KAAK,MAAM,oBAAoB,UAAU,KAAK,UAAA,EAC9C,KAAK,MAAM,oBAAoB,SAAS,KAAK,SAAA;;CAQ/C,aAAA;AACC,MAAI,KAAK,SAAU;EAGnB,IAAM,IAAW,MAAM,KAAK,KAAK,SAAA,CAAU,MAAK,MAAK,aAAa,gBAAA,EAI5D,IAAO,KAAY,SAAS,cAAc,OAAA;AAGhD,MAFA,EAAK,aAAA,CAAa,GAAA,CAEb,GAAU;GAEd,IAAM,IAAW,MAAM,KAAK,KAAK,WAAA;AACjC,QAAK,IAAM,KAAQ,EAAU,GAAK,YAAY,EAAA;AAC9C,QAAK,YAAY,EAAA;;AAGlB,IAAK,iBAAiB,UAAU,KAAK,UAAA,EACrC,EAAK,iBAAiB,SAAS,KAAK,SAAA,EAEpC,KAAK,QAAQ,GACb,KAAK,WAAA,CAAW;;CAkCjB,SAAA;AACC,SAAA,CAAA,CAAK,KAAK,SAAA,EAAA,CACL,KAAK,cAAA,CAAe,KAAK,MAAM,gBAAA,MACpC,KAAK,MAAM,eAAA,EAAA,CACJ;;CAIR,QAAA;AACC,OAAK,OAAO,OAAA;;CAGb,iBAAA;AACC,SAAO,KAAK,OAAO,gBAAA,IAAA,CAAoB;;CAGxC,gBAAA;AACC,SAAO,KAAK,OAAO,eAAA,IAAA,CAAmB;;CAIvC,cAAA;AACC,SAAO,KAAK,QAAQ,IAAI,SAAS,KAAK,MAAA,GAAS,IAAI,UAAA;;CAIpD,IAAA,OAAW;AACV,SAAO,KAAK;;GAAA,IAAA,IAAA,EAAA,CAvHb,EAAc,gBAAA,CAAA,EAAgB,EAAA;AAAA,SAAA,KAAA"}
1
+ {"version":3,"file":"form-rCZqoAoK.js","names":[],"sources":["../src/form/form.ts"],"sourcesContent":["import { customElement } from 'lit/decorators.js'\n\n/**\n * A thin ergonomic wrapper around a native `<form>` element. Its children are\n * reparented into a `<form>` element in light DOM on connection, so:\n *\n * - Form-associated custom elements (FACE) resolve their `internals.form`\n * correctly via native DOM ancestry.\n * - `new FormData(form)` collects values from every FACE + native control\n * without any manual walking.\n * - `form.reset()` triggers `formResetCallback()` on every FACE.\n * - `form.reportValidity()` runs native validation UI.\n * - `<button type=\"submit\">` and `<schmancy-button type=\"submit\">` both\n * submit the form via the native submitter pipeline.\n *\n * This component exists only to translate the native `submit` / `reset`\n * events into the Schmancy event shape (`detail: FormData`). All heavy\n * lifting is the platform's.\n *\n * @element schmancy-form\n * @fires submit - `CustomEvent<FormData>` emitted when the form is submitted.\n * @fires reset - Emitted after the underlying form resets.\n */\n@customElement('schmancy-form')\nexport default class SchmancyForm extends HTMLElement {\n\tpublic static readonly tagName: string = 'schmancy-form'\n\n\tprivate _form: HTMLFormElement | null = null\n\tprivate _wrapped = false\n\n\t/** ElementInternals for `:state(invalid)` / `:state(submitting)` broadcasting. */\n\tprivate readonly _internals: ElementInternals | undefined = (() => {\n\t\ttry { return this.attachInternals() } catch { return undefined }\n\t})()\n\n\t/** Skip built-in constraint validation on submit. Mirrors `<form novalidate>`. */\n\tget novalidate(): boolean {\n\t\treturn this.hasAttribute('novalidate')\n\t}\n\tset novalidate(value: boolean) {\n\t\tif (value) this.setAttribute('novalidate', '')\n\t\telse this.removeAttribute('novalidate')\n\t}\n\n\tconnectedCallback(): void {\n\t\tthis.ensureForm()\n\t}\n\n\tdisconnectedCallback(): void {\n\t\tif (this._form) {\n\t\t\tthis._form.removeEventListener('submit', this._onSubmit)\n\t\t\tthis._form.removeEventListener('reset', this._onReset)\n\t\t}\n\t}\n\n\t/**\n\t * On first connection, create the internal light-DOM `<form>` and move\n\t * existing children into it. Re-entry is a no-op.\n\t */\n\tprivate ensureForm(): void {\n\t\tif (this._wrapped) return\n\n\t\t// Respect an explicit consumer-supplied wrapping <form>.\n\t\tconst existing = Array.from(this.children).find(c => c instanceof HTMLFormElement) as\n\t\t\t| HTMLFormElement\n\t\t\t| undefined\n\n\t\tconst form = existing ?? document.createElement('form')\n\t\tform.noValidate = true\n\n\t\tif (!existing) {\n\t\t\t// Snapshot children because appending mutates `this.childNodes`.\n\t\t\tconst children = Array.from(this.childNodes)\n\t\t\tfor (const node of children) form.appendChild(node)\n\t\t\tthis.appendChild(form)\n\t\t}\n\n\t\tform.addEventListener('submit', this._onSubmit)\n\t\tform.addEventListener('reset', this._onReset)\n\n\t\tthis._form = form\n\t\tthis._wrapped = true\n\t}\n\n\tprivate _onSubmit = (e: SubmitEvent): void => {\n\t\t// Prevent the default navigation AND stop the native submit from\n\t\t// bubbling past this wrapper — otherwise consumers listening for\n\t\t// `submit` on <schmancy-form> would see the native event plus our\n\t\t// CustomEvent (two fires per submission).\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\t\tif (!this.novalidate && !this._form!.reportValidity()) {\n\t\t\tthis._internals?.states.add('invalid')\n\t\t\treturn\n\t\t}\n\t\tthis._internals?.states.delete('invalid')\n\t\tthis._internals?.states.add('submitting')\n\t\ttry {\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent('submit', {\n\t\t\t\t\tdetail: new FormData(this._form!),\n\t\t\t\t}),\n\t\t\t)\n\t\t} finally {\n\t\t\tthis._internals?.states.delete('submitting')\n\t\t}\n\t}\n\n\tprivate _onReset = (e: Event): void => {\n\t\te.stopPropagation()\n\t\tthis._internals?.states.delete('invalid')\n\t\tthis.dispatchEvent(new CustomEvent('reset'))\n\t}\n\n\t/** Programmatically submit via the native submitter pipeline. */\n\tpublic submit(): boolean {\n\t\tif (!this._form) return false\n\t\tif (!this.novalidate && !this._form.reportValidity()) return false\n\t\tthis._form.requestSubmit()\n\t\treturn true\n\t}\n\n\t/** Programmatically reset via native `form.reset()`. */\n\tpublic reset(): void {\n\t\tthis._form?.reset()\n\t}\n\n\tpublic reportValidity(): boolean {\n\t\treturn this._form?.reportValidity() ?? true\n\t}\n\n\tpublic checkValidity(): boolean {\n\t\treturn this._form?.checkValidity() ?? true\n\t}\n\n\t/** Snapshot of current form values. Equivalent to `new FormData(this.form)`. */\n\tpublic getFormData(): FormData {\n\t\treturn this._form ? new FormData(this._form) : new FormData()\n\t}\n\n\t/** The underlying `<form>` element (escape hatch for advanced integration). */\n\tpublic get form(): HTMLFormElement | null {\n\t\treturn this._form\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-form': SchmancyForm\n\t}\n}\n\n// === Retained type surface ===\n// These interfaces were part of the old collection-based engine. They're kept\n// exported because downstream code may still import them as documentation.\n// The new implementation no longer uses them 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<FormData>\n\treset: CustomEvent\n}\n"],"mappings":";;AAwBe,IAAA,IAAA,cAA2B,YAAA;CAAA,YAAA,GAAA,GAAA;AAAA,QAAA,GAAA,EAAA,EAAA,KAAA,QAGD,MAAA,KAAA,WAAA,CACrB,GAAA,KAAA,oBAAA;AAIlB,OAAA;AAAM,WAAO,KAAK,iBAAA;WAAA;AAA4B;;MAAA,EAAA,KAAA,aAoD1B,MAAA;AAOpB,OAFA,EAAE,gBAAA,EACF,EAAE,iBAAA,EACG,KAAK,cAAe,KAAK,MAAO,gBAAA,EAArC;AAIA,SAAK,YAAY,OAAO,OAAO,UAAA,EAC/B,KAAK,YAAY,OAAO,IAAI,aAAA;AAC5B,QAAA;AACC,UAAK,cACJ,IAAI,YAAY,UAAU,EACzB,QAAQ,IAAI,SAAS,KAAK,MAAA,EAAA,CAAA,CAAA;cAAA;AAI5B,UAAK,YAAY,OAAO,OAAO,aAAA;;SAZ/B,MAAK,YAAY,OAAO,IAAI,UAAA;KAAA,KAAA,YAgBV,MAAA;AACnB,KAAE,iBAAA,EACF,KAAK,YAAY,OAAO,OAAO,UAAA,EAC/B,KAAK,cAAc,IAAI,YAAY,QAAA,CAAA;;;CAAA;AAAA,OAAA,UAtFK;;CAWzC,IAAA,aAAI;AACH,SAAO,KAAK,aAAa,aAAA;;CAE1B,IAAA,WAAe,GAAA;AACV,MAAO,KAAK,aAAa,cAAc,GAAA,GACtC,KAAK,gBAAgB,aAAA;;CAG3B,oBAAA;AACC,OAAK,YAAA;;CAGN,uBAAA;AACK,OAAK,UACR,KAAK,MAAM,oBAAoB,UAAU,KAAK,UAAA,EAC9C,KAAK,MAAM,oBAAoB,SAAS,KAAK,SAAA;;CAQ/C,aAAA;AACC,MAAI,KAAK,SAAU;EAGnB,IAAM,IAAW,MAAM,KAAK,KAAK,SAAA,CAAU,MAAK,MAAK,aAAa,gBAAA,EAI5D,IAAO,KAAY,SAAS,cAAc,OAAA;AAGhD,MAFA,EAAK,aAAA,CAAa,GAAA,CAEb,GAAU;GAEd,IAAM,IAAW,MAAM,KAAK,KAAK,WAAA;AACjC,QAAK,IAAM,KAAQ,EAAU,GAAK,YAAY,EAAA;AAC9C,QAAK,YAAY,EAAA;;AAGlB,IAAK,iBAAiB,UAAU,KAAK,UAAA,EACrC,EAAK,iBAAiB,SAAS,KAAK,SAAA,EAEpC,KAAK,QAAQ,GACb,KAAK,WAAA,CAAW;;CAkCjB,SAAA;AACC,SAAA,CAAA,CAAK,KAAK,SAAA,EAAA,CACL,KAAK,cAAA,CAAe,KAAK,MAAM,gBAAA,MACpC,KAAK,MAAM,eAAA,EAAA,CACJ;;CAIR,QAAA;AACC,OAAK,OAAO,OAAA;;CAGb,iBAAA;AACC,SAAO,KAAK,OAAO,gBAAA,IAAA,CAAoB;;CAGxC,gBAAA;AACC,SAAO,KAAK,OAAO,eAAA,IAAA,CAAmB;;CAIvC,cAAA;AACC,SAAO,KAAK,QAAQ,IAAI,SAAS,KAAK,MAAA,GAAS,IAAI,UAAA;;CAIpD,IAAA,OAAW;AACV,SAAO,KAAK;;GAAA,IAAA,IAAA,EAAA,CAvHb,EAAc,gBAAA,CAAA,EAAgB,EAAA;AAAA,SAAA,KAAA"}
@@ -1 +1 @@
1
- require(`./chunk-BCfY8kxB.cjs`);const e=require(`./decorate-F9CuyeHg.cjs`);let t=require(`lit/decorators.js`);var n=class extends HTMLElement{constructor(...e){super(...e),this._form=null,this._wrapped=!1,this._internals=(()=>{try{return this.attachInternals()}catch{return}})(),this._onSubmit=e=>{if(e.preventDefault(),e.stopPropagation(),this.novalidate||this._form.reportValidity()){this._internals?.states.delete(`invalid`),this._internals?.states.add(`submitting`);try{this.dispatchEvent(new CustomEvent(`submit`,{detail:new FormData(this._form)}))}finally{this._internals?.states.delete(`submitting`)}}else this._internals?.states.add(`invalid`)},this._onReset=e=>{e.stopPropagation(),this._internals?.states.delete(`invalid`),this.dispatchEvent(new CustomEvent(`reset`))}}static{this.tagName=`schmancy-form`}get novalidate(){return this.hasAttribute(`novalidate`)}set novalidate(e){e?this.setAttribute(`novalidate`,``):this.removeAttribute(`novalidate`)}connectedCallback(){this.ensureForm()}disconnectedCallback(){this._form&&(this._form.removeEventListener(`submit`,this._onSubmit),this._form.removeEventListener(`reset`,this._onReset))}ensureForm(){if(this._wrapped)return;let e=Array.from(this.children).find(e=>e instanceof HTMLFormElement),t=e??document.createElement(`form`);if(t.noValidate=!0,!e){let e=Array.from(this.childNodes);for(let n of e)t.appendChild(n);this.appendChild(t)}t.addEventListener(`submit`,this._onSubmit),t.addEventListener(`reset`,this._onReset),this._form=t,this._wrapped=!0}submit(){return!!this._form&&!(!this.novalidate&&!this._form.reportValidity())&&(this._form.requestSubmit(),!0)}reset(){this._form?.reset()}reportValidity(){return this._form?.reportValidity()??!0}checkValidity(){return this._form?.checkValidity()??!0}getFormData(){return this._form?new FormData(this._form):new FormData}get form(){return this._form}},r=n=e.t([(0,t.customElement)(`schmancy-form`)],n);Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return r}});
1
+ require(`./chunk-CncqDLb2.cjs`);const e=require(`./decorate-F9CuyeHg.cjs`);let t=require(`lit/decorators.js`);var n=class extends HTMLElement{constructor(...e){super(...e),this._form=null,this._wrapped=!1,this._internals=(()=>{try{return this.attachInternals()}catch{return}})(),this._onSubmit=e=>{if(e.preventDefault(),e.stopPropagation(),this.novalidate||this._form.reportValidity()){this._internals?.states.delete(`invalid`),this._internals?.states.add(`submitting`);try{this.dispatchEvent(new CustomEvent(`submit`,{detail:new FormData(this._form)}))}finally{this._internals?.states.delete(`submitting`)}}else this._internals?.states.add(`invalid`)},this._onReset=e=>{e.stopPropagation(),this._internals?.states.delete(`invalid`),this.dispatchEvent(new CustomEvent(`reset`))}}static{this.tagName=`schmancy-form`}get novalidate(){return this.hasAttribute(`novalidate`)}set novalidate(e){e?this.setAttribute(`novalidate`,``):this.removeAttribute(`novalidate`)}connectedCallback(){this.ensureForm()}disconnectedCallback(){this._form&&(this._form.removeEventListener(`submit`,this._onSubmit),this._form.removeEventListener(`reset`,this._onReset))}ensureForm(){if(this._wrapped)return;let e=Array.from(this.children).find(e=>e instanceof HTMLFormElement),t=e??document.createElement(`form`);if(t.noValidate=!0,!e){let e=Array.from(this.childNodes);for(let n of e)t.appendChild(n);this.appendChild(t)}t.addEventListener(`submit`,this._onSubmit),t.addEventListener(`reset`,this._onReset),this._form=t,this._wrapped=!0}submit(){return!!this._form&&!(!this.novalidate&&!this._form.reportValidity())&&(this._form.requestSubmit(),!0)}reset(){this._form?.reset()}reportValidity(){return this._form?.reportValidity()??!0}checkValidity(){return this._form?.checkValidity()??!0}getFormData(){return this._form?new FormData(this._form):new FormData}get form(){return this._form}},r=n=e.t([(0,t.customElement)(`schmancy-form`)],n);Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return r}});
@@ -1 +1 @@
1
- {"version":3,"file":"form-CzD0JLxM.cjs","names":[],"sources":["../src/form/form.ts"],"sourcesContent":["import { customElement } from 'lit/decorators.js'\n\n/**\n * A thin ergonomic wrapper around a native `<form>` element. Its children are\n * reparented into a `<form>` element in light DOM on connection, so:\n *\n * - Form-associated custom elements (FACE) resolve their `internals.form`\n * correctly via native DOM ancestry.\n * - `new FormData(form)` collects values from every FACE + native control\n * without any manual walking.\n * - `form.reset()` triggers `formResetCallback()` on every FACE.\n * - `form.reportValidity()` runs native validation UI.\n * - `<button type=\"submit\">` and `<schmancy-button type=\"submit\">` both\n * submit the form via the native submitter pipeline.\n *\n * This component exists only to translate the native `submit` / `reset`\n * events into the Schmancy event shape (`detail: FormData`). All heavy\n * lifting is the platform's.\n *\n * @element schmancy-form\n * @fires submit - `CustomEvent<FormData>` emitted when the form is submitted.\n * @fires reset - Emitted after the underlying form resets.\n */\n@customElement('schmancy-form')\nexport default class SchmancyForm extends HTMLElement {\n\tpublic static readonly tagName: string = 'schmancy-form'\n\n\tprivate _form: HTMLFormElement | null = null\n\tprivate _wrapped = false\n\n\t/** ElementInternals for `:state(invalid)` / `:state(submitting)` broadcasting. */\n\tprivate readonly _internals: ElementInternals | undefined = (() => {\n\t\ttry { return this.attachInternals() } catch { return undefined }\n\t})()\n\n\t/** Skip built-in constraint validation on submit. Mirrors `<form novalidate>`. */\n\tget novalidate(): boolean {\n\t\treturn this.hasAttribute('novalidate')\n\t}\n\tset novalidate(value: boolean) {\n\t\tif (value) this.setAttribute('novalidate', '')\n\t\telse this.removeAttribute('novalidate')\n\t}\n\n\tconnectedCallback(): void {\n\t\tthis.ensureForm()\n\t}\n\n\tdisconnectedCallback(): void {\n\t\tif (this._form) {\n\t\t\tthis._form.removeEventListener('submit', this._onSubmit)\n\t\t\tthis._form.removeEventListener('reset', this._onReset)\n\t\t}\n\t}\n\n\t/**\n\t * On first connection, create the internal light-DOM `<form>` and move\n\t * existing children into it. Re-entry is a no-op.\n\t */\n\tprivate ensureForm(): void {\n\t\tif (this._wrapped) return\n\n\t\t// Respect an explicit consumer-supplied wrapping <form>.\n\t\tconst existing = Array.from(this.children).find(c => c instanceof HTMLFormElement) as\n\t\t\t| HTMLFormElement\n\t\t\t| undefined\n\n\t\tconst form = existing ?? document.createElement('form')\n\t\tform.noValidate = true\n\n\t\tif (!existing) {\n\t\t\t// Snapshot children because appending mutates `this.childNodes`.\n\t\t\tconst children = Array.from(this.childNodes)\n\t\t\tfor (const node of children) form.appendChild(node)\n\t\t\tthis.appendChild(form)\n\t\t}\n\n\t\tform.addEventListener('submit', this._onSubmit)\n\t\tform.addEventListener('reset', this._onReset)\n\n\t\tthis._form = form\n\t\tthis._wrapped = true\n\t}\n\n\tprivate _onSubmit = (e: SubmitEvent): void => {\n\t\t// Prevent the default navigation AND stop the native submit from\n\t\t// bubbling past this wrapper — otherwise consumers listening for\n\t\t// `submit` on <schmancy-form> would see the native event plus our\n\t\t// CustomEvent (two fires per submission).\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\t\tif (!this.novalidate && !this._form!.reportValidity()) {\n\t\t\tthis._internals?.states.add('invalid')\n\t\t\treturn\n\t\t}\n\t\tthis._internals?.states.delete('invalid')\n\t\tthis._internals?.states.add('submitting')\n\t\ttry {\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent('submit', {\n\t\t\t\t\tdetail: new FormData(this._form!),\n\t\t\t\t}),\n\t\t\t)\n\t\t} finally {\n\t\t\tthis._internals?.states.delete('submitting')\n\t\t}\n\t}\n\n\tprivate _onReset = (e: Event): void => {\n\t\te.stopPropagation()\n\t\tthis._internals?.states.delete('invalid')\n\t\tthis.dispatchEvent(new CustomEvent('reset'))\n\t}\n\n\t/** Programmatically submit via the native submitter pipeline. */\n\tpublic submit(): boolean {\n\t\tif (!this._form) return false\n\t\tif (!this.novalidate && !this._form.reportValidity()) return false\n\t\tthis._form.requestSubmit()\n\t\treturn true\n\t}\n\n\t/** Programmatically reset via native `form.reset()`. */\n\tpublic reset(): void {\n\t\tthis._form?.reset()\n\t}\n\n\tpublic reportValidity(): boolean {\n\t\treturn this._form?.reportValidity() ?? true\n\t}\n\n\tpublic checkValidity(): boolean {\n\t\treturn this._form?.checkValidity() ?? true\n\t}\n\n\t/** Snapshot of current form values. Equivalent to `new FormData(this.form)`. */\n\tpublic getFormData(): FormData {\n\t\treturn this._form ? new FormData(this._form) : new FormData()\n\t}\n\n\t/** The underlying `<form>` element (escape hatch for advanced integration). */\n\tpublic get form(): HTMLFormElement | null {\n\t\treturn this._form\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-form': SchmancyForm\n\t}\n}\n\n// === Retained type surface ===\n// These interfaces were part of the old collection-based engine. They're kept\n// exported because downstream code may still import them as documentation.\n// The new implementation no longer uses them 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<FormData>\n\treset: CustomEvent\n}\n"],"mappings":"8GAwBe,IAAA,EAAA,cAA2B,WAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,EAAA,CAAA,KAAA,MAGD,KAAA,KAAA,SAAA,CACrB,EAAA,KAAA,gBAAA,CAIlB,GAAA,CAAM,OAAO,KAAK,iBAAA,MAAA,CAA4B,WAAA,CAAA,KAAA,UAoD1B,GAAA,CAOpB,GAFA,EAAE,gBAAA,CACF,EAAE,iBAAA,CACG,KAAK,YAAe,KAAK,MAAO,gBAAA,CAArC,CAIA,KAAK,YAAY,OAAO,OAAO,UAAA,CAC/B,KAAK,YAAY,OAAO,IAAI,aAAA,CAC5B,GAAA,CACC,KAAK,cACJ,IAAI,YAAY,SAAU,CACzB,OAAQ,IAAI,SAAS,KAAK,MAAA,CAAA,CAAA,CAAA,QAAA,CAI5B,KAAK,YAAY,OAAO,OAAO,aAAA,OAZ/B,KAAK,YAAY,OAAO,IAAI,UAAA,EAAA,KAAA,SAgBV,GAAA,CACnB,EAAE,iBAAA,CACF,KAAK,YAAY,OAAO,OAAO,UAAA,CAC/B,KAAK,cAAc,IAAI,YAAY,QAAA,CAAA,EAAA,OAAA,KAAA,QAtFK,gBAWzC,IAAA,YAAI,CACH,OAAO,KAAK,aAAa,aAAA,CAE1B,IAAA,WAAe,EAAA,CACV,EAAO,KAAK,aAAa,aAAc,GAAA,CACtC,KAAK,gBAAgB,aAAA,CAG3B,mBAAA,CACC,KAAK,YAAA,CAGN,sBAAA,CACK,KAAK,QACR,KAAK,MAAM,oBAAoB,SAAU,KAAK,UAAA,CAC9C,KAAK,MAAM,oBAAoB,QAAS,KAAK,SAAA,EAQ/C,YAAA,CACC,GAAI,KAAK,SAAU,OAGnB,IAAM,EAAW,MAAM,KAAK,KAAK,SAAA,CAAU,KAAK,GAAK,aAAa,gBAAA,CAI5D,EAAO,GAAY,SAAS,cAAc,OAAA,CAGhD,GAFA,EAAK,WAAA,CAAa,EAAA,CAEb,EAAU,CAEd,IAAM,EAAW,MAAM,KAAK,KAAK,WAAA,CACjC,IAAK,IAAM,KAAQ,EAAU,EAAK,YAAY,EAAA,CAC9C,KAAK,YAAY,EAAA,CAGlB,EAAK,iBAAiB,SAAU,KAAK,UAAA,CACrC,EAAK,iBAAiB,QAAS,KAAK,SAAA,CAEpC,KAAK,MAAQ,EACb,KAAK,SAAA,CAAW,EAkCjB,QAAA,CACC,MAAA,CAAA,CAAK,KAAK,OAAA,EAAA,CACL,KAAK,YAAA,CAAe,KAAK,MAAM,gBAAA,IACpC,KAAK,MAAM,eAAA,CAAA,CACJ,GAIR,OAAA,CACC,KAAK,OAAO,OAAA,CAGb,gBAAA,CACC,OAAO,KAAK,OAAO,gBAAA,EAAA,CAAoB,EAGxC,eAAA,CACC,OAAO,KAAK,OAAO,eAAA,EAAA,CAAmB,EAIvC,aAAA,CACC,OAAO,KAAK,MAAQ,IAAI,SAAS,KAAK,MAAA,CAAS,IAAI,SAIpD,IAAA,MAAW,CACV,OAAO,KAAK,QAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAvHC,gBAAA,CAAA,CAAgB,EAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"form-wI58M85H.cjs","names":[],"sources":["../src/form/form.ts"],"sourcesContent":["import { customElement } from 'lit/decorators.js'\n\n/**\n * A thin ergonomic wrapper around a native `<form>` element. Its children are\n * reparented into a `<form>` element in light DOM on connection, so:\n *\n * - Form-associated custom elements (FACE) resolve their `internals.form`\n * correctly via native DOM ancestry.\n * - `new FormData(form)` collects values from every FACE + native control\n * without any manual walking.\n * - `form.reset()` triggers `formResetCallback()` on every FACE.\n * - `form.reportValidity()` runs native validation UI.\n * - `<button type=\"submit\">` and `<schmancy-button type=\"submit\">` both\n * submit the form via the native submitter pipeline.\n *\n * This component exists only to translate the native `submit` / `reset`\n * events into the Schmancy event shape (`detail: FormData`). All heavy\n * lifting is the platform's.\n *\n * @element schmancy-form\n * @fires submit - `CustomEvent<FormData>` emitted when the form is submitted.\n * @fires reset - Emitted after the underlying form resets.\n */\n@customElement('schmancy-form')\nexport default class SchmancyForm extends HTMLElement {\n\tpublic static readonly tagName: string = 'schmancy-form'\n\n\tprivate _form: HTMLFormElement | null = null\n\tprivate _wrapped = false\n\n\t/** ElementInternals for `:state(invalid)` / `:state(submitting)` broadcasting. */\n\tprivate readonly _internals: ElementInternals | undefined = (() => {\n\t\ttry { return this.attachInternals() } catch { return undefined }\n\t})()\n\n\t/** Skip built-in constraint validation on submit. Mirrors `<form novalidate>`. */\n\tget novalidate(): boolean {\n\t\treturn this.hasAttribute('novalidate')\n\t}\n\tset novalidate(value: boolean) {\n\t\tif (value) this.setAttribute('novalidate', '')\n\t\telse this.removeAttribute('novalidate')\n\t}\n\n\tconnectedCallback(): void {\n\t\tthis.ensureForm()\n\t}\n\n\tdisconnectedCallback(): void {\n\t\tif (this._form) {\n\t\t\tthis._form.removeEventListener('submit', this._onSubmit)\n\t\t\tthis._form.removeEventListener('reset', this._onReset)\n\t\t}\n\t}\n\n\t/**\n\t * On first connection, create the internal light-DOM `<form>` and move\n\t * existing children into it. Re-entry is a no-op.\n\t */\n\tprivate ensureForm(): void {\n\t\tif (this._wrapped) return\n\n\t\t// Respect an explicit consumer-supplied wrapping <form>.\n\t\tconst existing = Array.from(this.children).find(c => c instanceof HTMLFormElement) as\n\t\t\t| HTMLFormElement\n\t\t\t| undefined\n\n\t\tconst form = existing ?? document.createElement('form')\n\t\tform.noValidate = true\n\n\t\tif (!existing) {\n\t\t\t// Snapshot children because appending mutates `this.childNodes`.\n\t\t\tconst children = Array.from(this.childNodes)\n\t\t\tfor (const node of children) form.appendChild(node)\n\t\t\tthis.appendChild(form)\n\t\t}\n\n\t\tform.addEventListener('submit', this._onSubmit)\n\t\tform.addEventListener('reset', this._onReset)\n\n\t\tthis._form = form\n\t\tthis._wrapped = true\n\t}\n\n\tprivate _onSubmit = (e: SubmitEvent): void => {\n\t\t// Prevent the default navigation AND stop the native submit from\n\t\t// bubbling past this wrapper — otherwise consumers listening for\n\t\t// `submit` on <schmancy-form> would see the native event plus our\n\t\t// CustomEvent (two fires per submission).\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\t\tif (!this.novalidate && !this._form!.reportValidity()) {\n\t\t\tthis._internals?.states.add('invalid')\n\t\t\treturn\n\t\t}\n\t\tthis._internals?.states.delete('invalid')\n\t\tthis._internals?.states.add('submitting')\n\t\ttry {\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent('submit', {\n\t\t\t\t\tdetail: new FormData(this._form!),\n\t\t\t\t}),\n\t\t\t)\n\t\t} finally {\n\t\t\tthis._internals?.states.delete('submitting')\n\t\t}\n\t}\n\n\tprivate _onReset = (e: Event): void => {\n\t\te.stopPropagation()\n\t\tthis._internals?.states.delete('invalid')\n\t\tthis.dispatchEvent(new CustomEvent('reset'))\n\t}\n\n\t/** Programmatically submit via the native submitter pipeline. */\n\tpublic submit(): boolean {\n\t\tif (!this._form) return false\n\t\tif (!this.novalidate && !this._form.reportValidity()) return false\n\t\tthis._form.requestSubmit()\n\t\treturn true\n\t}\n\n\t/** Programmatically reset via native `form.reset()`. */\n\tpublic reset(): void {\n\t\tthis._form?.reset()\n\t}\n\n\tpublic reportValidity(): boolean {\n\t\treturn this._form?.reportValidity() ?? true\n\t}\n\n\tpublic checkValidity(): boolean {\n\t\treturn this._form?.checkValidity() ?? true\n\t}\n\n\t/** Snapshot of current form values. Equivalent to `new FormData(this.form)`. */\n\tpublic getFormData(): FormData {\n\t\treturn this._form ? new FormData(this._form) : new FormData()\n\t}\n\n\t/** The underlying `<form>` element (escape hatch for advanced integration). */\n\tpublic get form(): HTMLFormElement | null {\n\t\treturn this._form\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-form': SchmancyForm\n\t}\n}\n\n// === Retained type surface ===\n// These interfaces were part of the old collection-based engine. They're kept\n// exported because downstream code may still import them as documentation.\n// The new implementation no longer uses them 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<FormData>\n\treset: CustomEvent\n}\n"],"mappings":"8GAwBe,IAAA,EAAA,cAA2B,WAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,EAAA,CAAA,KAAA,MAGD,KAAA,KAAA,SAAA,CACrB,EAAA,KAAA,gBAAA,CAIlB,GAAA,CAAM,OAAO,KAAK,iBAAA,MAAA,CAA4B,WAAA,CAAA,KAAA,UAoD1B,GAAA,CAOpB,GAFA,EAAE,gBAAA,CACF,EAAE,iBAAA,CACG,KAAK,YAAe,KAAK,MAAO,gBAAA,CAArC,CAIA,KAAK,YAAY,OAAO,OAAO,UAAA,CAC/B,KAAK,YAAY,OAAO,IAAI,aAAA,CAC5B,GAAA,CACC,KAAK,cACJ,IAAI,YAAY,SAAU,CACzB,OAAQ,IAAI,SAAS,KAAK,MAAA,CAAA,CAAA,CAAA,QAAA,CAI5B,KAAK,YAAY,OAAO,OAAO,aAAA,OAZ/B,KAAK,YAAY,OAAO,IAAI,UAAA,EAAA,KAAA,SAgBV,GAAA,CACnB,EAAE,iBAAA,CACF,KAAK,YAAY,OAAO,OAAO,UAAA,CAC/B,KAAK,cAAc,IAAI,YAAY,QAAA,CAAA,EAAA,OAAA,KAAA,QAtFK,gBAWzC,IAAA,YAAI,CACH,OAAO,KAAK,aAAa,aAAA,CAE1B,IAAA,WAAe,EAAA,CACV,EAAO,KAAK,aAAa,aAAc,GAAA,CACtC,KAAK,gBAAgB,aAAA,CAG3B,mBAAA,CACC,KAAK,YAAA,CAGN,sBAAA,CACK,KAAK,QACR,KAAK,MAAM,oBAAoB,SAAU,KAAK,UAAA,CAC9C,KAAK,MAAM,oBAAoB,QAAS,KAAK,SAAA,EAQ/C,YAAA,CACC,GAAI,KAAK,SAAU,OAGnB,IAAM,EAAW,MAAM,KAAK,KAAK,SAAA,CAAU,KAAK,GAAK,aAAa,gBAAA,CAI5D,EAAO,GAAY,SAAS,cAAc,OAAA,CAGhD,GAFA,EAAK,WAAA,CAAa,EAAA,CAEb,EAAU,CAEd,IAAM,EAAW,MAAM,KAAK,KAAK,WAAA,CACjC,IAAK,IAAM,KAAQ,EAAU,EAAK,YAAY,EAAA,CAC9C,KAAK,YAAY,EAAA,CAGlB,EAAK,iBAAiB,SAAU,KAAK,UAAA,CACrC,EAAK,iBAAiB,QAAS,KAAK,SAAA,CAEpC,KAAK,MAAQ,EACb,KAAK,SAAA,CAAW,EAkCjB,QAAA,CACC,MAAA,CAAA,CAAK,KAAK,OAAA,EAAA,CACL,KAAK,YAAA,CAAe,KAAK,MAAM,gBAAA,IACpC,KAAK,MAAM,eAAA,CAAA,CACJ,GAIR,OAAA,CACC,KAAK,OAAO,OAAA,CAGb,gBAAA,CACC,OAAO,KAAK,OAAO,gBAAA,EAAA,CAAoB,EAGxC,eAAA,CACC,OAAO,KAAK,OAAO,eAAA,EAAA,CAAmB,EAIvC,aAAA,CACC,OAAO,KAAK,MAAQ,IAAI,SAAS,KAAK,MAAA,CAAS,IAAI,SAIpD,IAAA,MAAW,CACV,OAAO,KAAK,QAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAvHC,gBAAA,CAAA,CAAgB,EAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA"}
package/dist/form.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./form-CzD0JLxM.cjs`);exports.SchmancyForm=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./form-wI58M85H.cjs`);exports.SchmancyForm=e.t;
package/dist/form.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as e } from "./form-C1qS9uvS.js";
1
+ import { t as e } from "./form-rCZqoAoK.js";
2
2
  export { e as SchmancyForm };
@@ -1 +1 @@
1
- {"version":3,"file":"hashContent-BUqULUiZ.js","names":[],"sources":["../src/utils/hashContent.ts"],"sourcesContent":["export default function (content: string): string {\n\tconst fnvOffsetBasis = 0x811c9dc5\n\tconst fnvPrime = 0x01000193\n\tlet hash = fnvOffsetBasis\n\n\tfor (let i = 0; i < content.length; i++) {\n\t\thash ^= content.charCodeAt(i)\n\t\thash = (hash * fnvPrime) >>> 0 // Ensure unsigned 32-bit integer\n\t}\n\n\treturn hash.toString(16) // Convert to hexadecimal string for compactness\n}\n"],"mappings":"AAAA,SAAA,EAAyB,GAAA;CAGxB,IAAI,IAFmB;AAIvB,MAAK,IAAI,IAAI,GAAG,IAAI,EAAQ,QAAQ,IACnC,MAAQ,EAAQ,WAAW,EAAA,EAC3B,IALgB,WAKR,MAAqB;AAG9B,QAAO,EAAK,SAAS,GAAA;;AAAA,SAAA"}
1
+ {"version":3,"file":"hashContent-B2IntJQf.js","names":[],"sources":["../src/utils/hashContent.ts"],"sourcesContent":["export default function (content: string): string {\n\tconst fnvOffsetBasis = 0x811c9dc5\n\tconst fnvPrime = 0x01000193\n\tlet hash = fnvOffsetBasis\n\n\tfor (let i = 0; i < content.length; i++) {\n\t\thash ^= content.charCodeAt(i)\n\t\thash = (hash * fnvPrime) >>> 0 // Ensure unsigned 32-bit integer\n\t}\n\n\treturn hash.toString(16) // Convert to hexadecimal string for compactness\n}\n"],"mappings":"AAAA,SAAA,EAAyB,GAAA;CAGxB,IAAI,IAFmB;AAIvB,MAAK,IAAI,IAAI,GAAG,IAAI,EAAQ,QAAQ,IACnC,MAAQ,EAAQ,WAAW,EAAA,EAC3B,IALgB,WAKR,MAAqB;AAG9B,QAAO,EAAK,SAAS,GAAA;;AAAA,SAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"hashContent-CI39BY-_.cjs","names":[],"sources":["../src/utils/hashContent.ts"],"sourcesContent":["export default function (content: string): string {\n\tconst fnvOffsetBasis = 0x811c9dc5\n\tconst fnvPrime = 0x01000193\n\tlet hash = fnvOffsetBasis\n\n\tfor (let i = 0; i < content.length; i++) {\n\t\thash ^= content.charCodeAt(i)\n\t\thash = (hash * fnvPrime) >>> 0 // Ensure unsigned 32-bit integer\n\t}\n\n\treturn hash.toString(16) // Convert to hexadecimal string for compactness\n}\n"],"mappings":"AAAA,SAAA,EAAyB,EAAA,CAGxB,IAAI,EAFmB,WAIvB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IACnC,GAAQ,EAAQ,WAAW,EAAA,CAC3B,EALgB,SAKR,IAAqB,EAG9B,OAAO,EAAK,SAAS,GAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"hashContent-CahnEuut.cjs","names":[],"sources":["../src/utils/hashContent.ts"],"sourcesContent":["export default function (content: string): string {\n\tconst fnvOffsetBasis = 0x811c9dc5\n\tconst fnvPrime = 0x01000193\n\tlet hash = fnvOffsetBasis\n\n\tfor (let i = 0; i < content.length; i++) {\n\t\thash ^= content.charCodeAt(i)\n\t\thash = (hash * fnvPrime) >>> 0 // Ensure unsigned 32-bit integer\n\t}\n\n\treturn hash.toString(16) // Convert to hexadecimal string for compactness\n}\n"],"mappings":"AAAA,SAAA,EAAyB,EAAA,CAGxB,IAAI,EAFmB,WAIvB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IACnC,GAAQ,EAAQ,WAAW,EAAA,CAC3B,EALgB,SAKR,IAAqB,EAG9B,OAAO,EAAK,SAAS,GAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA"}
@@ -1,4 +1,4 @@
1
- require(`./chunk-BCfY8kxB.cjs`);const e=require(`./tailwind.mixin-ZzkXQTFA.cjs`),t=require(`./decorate-F9CuyeHg.cjs`);require(`./mixins.cjs`);const n=require(`./context-BRtGc7PP.cjs`);let r=require(`rxjs`),i=require(`rxjs/operators`),a=require(`lit/decorators.js`),o=require(`lit`);var s,c=class extends e.t(o.css`
1
+ require(`./chunk-CncqDLb2.cjs`);const e=require(`./tailwind.mixin-Bh58QnlW.cjs`),t=require(`./decorate-F9CuyeHg.cjs`);require(`./mixins.cjs`);const n=require(`./context-CAYQh-mx.cjs`);let r=require(`rxjs`),i=require(`rxjs/operators`),a=require(`lit/decorators.js`),o=require(`lit`);var s,c=class extends e.t(o.css`
2
2
  :host {
3
3
  --schmancy-icon-size: 24px;
4
4
  --schmancy-icon-fill: 0;
@@ -1 +1 @@
1
- {"version":3,"file":"icons-UOqapID2.cjs","names":[],"sources":["../src/icons/icon.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { consume } from '@lit/context'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { BehaviorSubject, combineLatest, takeUntil } from 'rxjs'\nimport { tap } from 'rxjs/operators'\nimport { SchmancyButtonSizeContext, type SchmancyButtonSize } from '../button/context'\n\n/**\n * Icon size tokens - M3 aligned with optical size optimization\n * - xxs: 12px (opsz: 20) - fits in 24px buttons (ultra-compact)\n * - xs: 16px (opsz: 20) - fits in 32px buttons\n * - sm: 20px (opsz: 20) - fits in 40px buttons\n * - md: 24px (opsz: 24) - fits in 48px buttons (default)\n * - lg: 32px (opsz: 40) - fits in 56px buttons\n * - Or custom string like '48px'\n */\nexport type IconSize = 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | string\n\n/**\n * @element schmancy-icon\n * Material Symbols icon component with flexible font variation properties\n *\n * @cssprop --schmancy-icon-size - The size of the icon (default: 24px)\n * @cssprop --schmancy-icon-fill - Fill value for icon (0-1)\n * @cssprop --schmancy-icon-weight - Weight value for icon (100-700)\n * @cssprop --schmancy-icon-grade - Grade value for icon (-50-200)\n * @cssprop --schmancy-icon-opsz - Optical size (default: 24)\n * @csspart icon - The inner `<span>` carrying the Material Symbols glyph.\n */\n@customElement('schmancy-icon')\nexport default class SchmancyIcon extends TailwindElement(css`\n\t:host {\n\t\t--schmancy-icon-size: 24px;\n\t\t--schmancy-icon-fill: 0;\n\t\t--schmancy-icon-weight: 400;\n\t\t--schmancy-icon-grade: 0;\n\t\t--schmancy-icon-opsz: 24;\n\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: var(--schmancy-icon-size);\n\t\theight: var(--schmancy-icon-size);\n\t\tfont-size: var(--schmancy-icon-size);\n\t\tcolor: inherit;\n\t\ttransition: font-variation-settings 0.2s ease;\n\t}\n\n\t.material-symbols {\n\t\tfont-family: var(--schmancy-icon-font, 'Material Symbols Outlined');\n\t\tfont-weight: normal;\n\t\tfont-style: normal;\n\t\tline-height: 1;\n\t\tletter-spacing: normal;\n\t\ttext-transform: none;\n\t\tdisplay: inline-block;\n\t\twhite-space: nowrap;\n\t\tword-wrap: normal;\n\t\tdirection: ltr;\n\t\t-webkit-font-smoothing: antialiased;\n\t\t-webkit-font-feature-settings: 'liga';\n\t\tfont-feature-settings: 'liga';\n\t\tfont-variation-settings:\n\t\t\t'FILL' var(--schmancy-icon-fill),\n\t\t\t'wght' var(--schmancy-icon-weight),\n\t\t\t'GRAD' var(--schmancy-icon-grade),\n\t\t\t'opsz' var(--schmancy-icon-opsz);\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t/* CSS-generated content is NOT translated by Google Translate */\n\t.material-symbols[data-icon]::before {\n\t\tcontent: attr(data-icon);\n\t}\n`) {\n\t// Static flag to track if Google Fonts have been loaded\n\tprivate static fontsLoaded = false\n\n\t/**\n\t * Load Material Symbols fonts from Google Fonts CDN\n\t */\n\tprivate static loadFonts(): void {\n\t\tif (SchmancyIcon.fontsLoaded) {\n\t\t\treturn\n\t\t}\n\n\t\tconst link = document.createElement('link')\n\t\tlink.rel = 'stylesheet'\n\t\tlink.href = 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&family=Material+Symbols+Sharp:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap'\n\t\tdocument.head.appendChild(link)\n\n\t\tSchmancyIcon.fontsLoaded = true\n\t}\n\n\t/**\n\t * Fill value for the icon (0-1)\n\t * 0 = outlined, 1 = filled\n\t */\n\t@property({ type: Number, reflect: true })\n\tfill = 0\n\n\t/**\n\t * Weight value for the icon (100-700)\n\t * Controls the thickness of the icon strokes\n\t */\n\t@property({ type: Number, reflect: true })\n\tweight = 400\n\n\t/**\n\t * Grade value for the icon (-50-200)\n\t * Adjusts the visual weight/grade\n\t */\n\t@property({ type: Number, reflect: true })\n\tgrade = 0\n\n\t/**\n\t * Icon variant style\n\t * @values outlined | rounded | sharp\n\t */\n\t@property({ type: String, reflect: true })\n\tvariant: 'outlined' | 'rounded' | 'sharp' = 'outlined'\n\n\t/**\n\t * Size of the icon - M3 aligned tokens or custom string\n\t * Tokens: 'xxs' (12px), 'xs' (16px), 'sm' (20px), 'md' (24px), 'lg' (32px)\n\t * Custom: any CSS size string like '48px', '2rem'\n\t *\n\t * When this icon is a descendant of `<schmancy-button>`, the button's\n\t * `size` wins (via `SchmancyButtonSizeContext`). The local `size` only\n\t * applies when there is no ancestor button.\n\t */\n\t@property({ type: String, reflect: true })\n\tsize: IconSize = 'md'\n\n\t/**\n\t * Size inherited from an ancestor `<schmancy-button>` via context.\n\t * Undefined when the icon is not nested in a button.\n\t */\n\t@consume({ context: SchmancyButtonSizeContext, subscribe: true })\n\t@state()\n\tprivate _buttonSize?: SchmancyButtonSize\n\n\t/**\n\t * Icon name - use this instead of slot content to prevent translation breaking icons.\n\t * When set, this takes precedence over slot content.\n\t * Example: <schmancy-icon icon=\"delete\"></schmancy-icon>\n\t */\n\t@property({ type: String })\n\ticon?: string\n\n\t// M3 aligned token sizes with optimal optical sizes\n\tprivate static readonly tokenSizes: Record<string, { size: string; opsz: number }> = {\n\t\txxs: { size: '12px', opsz: 20 }, // fits in 24px buttons (ultra-compact)\n\t\txs: { size: '16px', opsz: 20 }, // fits in 32px buttons\n\t\tsm: { size: '20px', opsz: 20 }, // fits in 40px buttons\n\t\tmd: { size: '24px', opsz: 24 }, // fits in 48px buttons (default)\n\t\tlg: { size: '32px', opsz: 40 }, // fits in 56px buttons\n\t}\n\n\t/** Extract pixel value from a custom size string for optical size */\n\tprivate static computeOpticalSize(size: string): number {\n\t\tconst px = parseFloat(size)\n\t\treturn isNaN(px) ? 24 : Math.max(20, Math.min(48, Math.round(px)))\n\t}\n\n\t// RxJS subjects for reactive property updates\n\tprivate fill$ = new BehaviorSubject(this.fill)\n\tprivate weight$ = new BehaviorSubject(this.weight)\n\tprivate grade$ = new BehaviorSubject(this.grade)\n\tprivate variant$ = new BehaviorSubject(this.variant)\n\n\t// Captured icon name from slot content (translation-proof)\n\t@state()\n\tprivate _capturedIcon?: string\n\n\t// Observer for text content changes (ternaries update text nodes, not DOM structure)\n\tprivate _observer?: MutationObserver\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback()\n\n\t\t// Capture initial icon name\n\t\tthis._updateCapturedIcon()\n\n\t\t// Watch for text content changes (characterData) for dynamic icon updates\n\t\tthis._observer = new MutationObserver(() => this._updateCapturedIcon())\n\t\tthis._observer.observe(this, { childList: true, characterData: true, subtree: true })\n\n\t\t// Load Google Fonts if not already loaded\n\t\tSchmancyIcon.loadFonts()\n\n\t\t// Prevent browser translation from breaking icon ligatures\n\t\t// Using multiple methods for maximum compatibility:\n\t\t// - translate=\"no\" (HTML5 standard)\n\t\t// - class=\"notranslate\" (Google Translate specific)\n\t\tthis.setAttribute('translate', 'no')\n\t\tthis.classList.add('notranslate')\n\n\t\t// Set accessibility attributes for decorative icons\n\t\tif (!this.hasAttribute('aria-label') &&\n\t\t !this.hasAttribute('aria-labelledby') &&\n\t\t !this.hasAttribute('aria-hidden') &&\n\t\t !this.hasAttribute('role')) {\n\t\t\tthis.setAttribute('aria-hidden', 'true')\n\t\t}\n\n\t\t// Setup reactive CSS variable updates\n\t\tcombineLatest([\n\t\t\tthis.fill$,\n\t\t\tthis.weight$,\n\t\t\tthis.grade$,\n\t\t\tthis.variant$\n\t\t]).pipe(\n\t\t\ttap(([fill, weight, grade, variant]) => {\n\t\t\t\t// Update CSS custom properties for smooth transitions\n\t\t\t\tthis.style.setProperty('--schmancy-icon-fill', String(fill))\n\t\t\t\tthis.style.setProperty('--schmancy-icon-weight', String(weight))\n\t\t\t\tthis.style.setProperty('--schmancy-icon-grade', String(grade))\n\n\t\t\t\t// Update font family based on variant\n\t\t\t\tconst fontFamily = {\n\t\t\t\t\t'outlined': 'Material Symbols Outlined',\n\t\t\t\t\t'rounded': 'Material Symbols Rounded',\n\t\t\t\t\t'sharp': 'Material Symbols Sharp'\n\t\t\t\t}[variant] || 'Material Symbols Outlined'\n\n\t\t\t\tthis.style.setProperty('--schmancy-icon-font', fontFamily)\n\t\t\t}),\n\t\t\ttakeUntil(this.disconnecting)\n\t\t).subscribe()\n\n\t}\n\n\t/**\n\t * Update captured icon from current text content\n\t */\n\tprivate _updateCapturedIcon(): void {\n\t\tif (!this.icon) {\n\t\t\tconst textContent = this.textContent?.trim()\n\t\t\tif (textContent && textContent !== this._capturedIcon) {\n\t\t\t\tthis._capturedIcon = textContent\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected updated(changedProperties: Map<string | number | symbol, unknown>): void {\n\t\tsuper.updated(changedProperties)\n\n\t\t// Update BehaviorSubjects when properties change\n\t\tif (changedProperties.has('fill')) {\n\t\t\tthis.fill$.next(this.fill)\n\t\t}\n\t\tif (changedProperties.has('weight')) {\n\t\t\tthis.weight$.next(this.weight)\n\t\t}\n\t\tif (changedProperties.has('grade')) {\n\t\t\tthis.grade$.next(this.grade)\n\t\t}\n\t\tif (changedProperties.has('variant')) {\n\t\t\tthis.variant$.next(this.variant)\n\t\t}\n\t}\n\n\tprotected render(): unknown {\n\t\tconst fontFamily = {\n\t\t\t'outlined': 'Material Symbols Outlined',\n\t\t\t'rounded': 'Material Symbols Rounded',\n\t\t\t'sharp': 'Material Symbols Sharp'\n\t\t}[this.variant] || 'Material Symbols Outlined'\n\n\t\t// Effective size: ancestor `<schmancy-button>` wins via context, else local `size`.\n\t\tconst effectiveSize: IconSize = this._buttonSize ?? this.size\n\t\t// Resolve size: token → px, bare number → px, or pass through as-is\n\t\tconst sizeConfig = SchmancyIcon.tokenSizes[effectiveSize]\n\t\tconst isNumeric = !sizeConfig && /^\\d+(\\.\\d+)?$/.test(effectiveSize)\n\t\tconst iconSize = sizeConfig?.size || (isNumeric ? `${effectiveSize}px` : effectiveSize)\n\t\tconst opticalSize = sizeConfig?.opsz || SchmancyIcon.computeOpticalSize(iconSize)\n\n\t\t// Set size on HOST so :host CSS picks it up\n\t\tthis.style.setProperty('--schmancy-icon-size', iconSize)\n\t\tthis.style.setProperty('--schmancy-icon-opsz', String(opticalSize))\n\n\t\tconst style = {\n\t\t\t'--schmancy-icon-fill': this.fill,\n\t\t\t'--schmancy-icon-weight': this.weight,\n\t\t\t'--schmancy-icon-grade': this.grade,\n\t\t\t'--schmancy-icon-font': fontFamily,\n\t\t}\n\n\t\t// Priority: icon property > captured icon (for dynamic content)\n\t\tconst iconName = this.icon || this._capturedIcon\n\n\t\t// Always render slot (hidden) to observe content changes, display via data-icon\n\t\treturn html`\n\t\t\t<span class=\"material-symbols notranslate\" part=\"icon\" translate=\"no\" data-icon=${iconName || ''} style=${this.styleMap(style)}></span>\n\t\t\t<slot style=\"display:none\"></slot>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-icon': SchmancyIcon\n\t}\n}"],"mappings":"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"}
1
+ {"version":3,"file":"icons-B6V3nZ4-.cjs","names":[],"sources":["../src/icons/icon.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { consume } from '@lit/context'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { BehaviorSubject, combineLatest, takeUntil } from 'rxjs'\nimport { tap } from 'rxjs/operators'\nimport { SchmancyButtonSizeContext, type SchmancyButtonSize } from '../button/context'\n\n/**\n * Icon size tokens - M3 aligned with optical size optimization\n * - xxs: 12px (opsz: 20) - fits in 24px buttons (ultra-compact)\n * - xs: 16px (opsz: 20) - fits in 32px buttons\n * - sm: 20px (opsz: 20) - fits in 40px buttons\n * - md: 24px (opsz: 24) - fits in 48px buttons (default)\n * - lg: 32px (opsz: 40) - fits in 56px buttons\n * - Or custom string like '48px'\n */\nexport type IconSize = 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | string\n\n/**\n * @element schmancy-icon\n * Material Symbols icon component with flexible font variation properties\n *\n * @cssprop --schmancy-icon-size - The size of the icon (default: 24px)\n * @cssprop --schmancy-icon-fill - Fill value for icon (0-1)\n * @cssprop --schmancy-icon-weight - Weight value for icon (100-700)\n * @cssprop --schmancy-icon-grade - Grade value for icon (-50-200)\n * @cssprop --schmancy-icon-opsz - Optical size (default: 24)\n * @csspart icon - The inner `<span>` carrying the Material Symbols glyph.\n */\n@customElement('schmancy-icon')\nexport default class SchmancyIcon extends TailwindElement(css`\n\t:host {\n\t\t--schmancy-icon-size: 24px;\n\t\t--schmancy-icon-fill: 0;\n\t\t--schmancy-icon-weight: 400;\n\t\t--schmancy-icon-grade: 0;\n\t\t--schmancy-icon-opsz: 24;\n\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: var(--schmancy-icon-size);\n\t\theight: var(--schmancy-icon-size);\n\t\tfont-size: var(--schmancy-icon-size);\n\t\tcolor: inherit;\n\t\ttransition: font-variation-settings 0.2s ease;\n\t}\n\n\t.material-symbols {\n\t\tfont-family: var(--schmancy-icon-font, 'Material Symbols Outlined');\n\t\tfont-weight: normal;\n\t\tfont-style: normal;\n\t\tline-height: 1;\n\t\tletter-spacing: normal;\n\t\ttext-transform: none;\n\t\tdisplay: inline-block;\n\t\twhite-space: nowrap;\n\t\tword-wrap: normal;\n\t\tdirection: ltr;\n\t\t-webkit-font-smoothing: antialiased;\n\t\t-webkit-font-feature-settings: 'liga';\n\t\tfont-feature-settings: 'liga';\n\t\tfont-variation-settings:\n\t\t\t'FILL' var(--schmancy-icon-fill),\n\t\t\t'wght' var(--schmancy-icon-weight),\n\t\t\t'GRAD' var(--schmancy-icon-grade),\n\t\t\t'opsz' var(--schmancy-icon-opsz);\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t/* CSS-generated content is NOT translated by Google Translate */\n\t.material-symbols[data-icon]::before {\n\t\tcontent: attr(data-icon);\n\t}\n`) {\n\t// Static flag to track if Google Fonts have been loaded\n\tprivate static fontsLoaded = false\n\n\t/**\n\t * Load Material Symbols fonts from Google Fonts CDN\n\t */\n\tprivate static loadFonts(): void {\n\t\tif (SchmancyIcon.fontsLoaded) {\n\t\t\treturn\n\t\t}\n\n\t\tconst link = document.createElement('link')\n\t\tlink.rel = 'stylesheet'\n\t\tlink.href = 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&family=Material+Symbols+Sharp:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap'\n\t\tdocument.head.appendChild(link)\n\n\t\tSchmancyIcon.fontsLoaded = true\n\t}\n\n\t/**\n\t * Fill value for the icon (0-1)\n\t * 0 = outlined, 1 = filled\n\t */\n\t@property({ type: Number, reflect: true })\n\tfill = 0\n\n\t/**\n\t * Weight value for the icon (100-700)\n\t * Controls the thickness of the icon strokes\n\t */\n\t@property({ type: Number, reflect: true })\n\tweight = 400\n\n\t/**\n\t * Grade value for the icon (-50-200)\n\t * Adjusts the visual weight/grade\n\t */\n\t@property({ type: Number, reflect: true })\n\tgrade = 0\n\n\t/**\n\t * Icon variant style\n\t * @values outlined | rounded | sharp\n\t */\n\t@property({ type: String, reflect: true })\n\tvariant: 'outlined' | 'rounded' | 'sharp' = 'outlined'\n\n\t/**\n\t * Size of the icon - M3 aligned tokens or custom string\n\t * Tokens: 'xxs' (12px), 'xs' (16px), 'sm' (20px), 'md' (24px), 'lg' (32px)\n\t * Custom: any CSS size string like '48px', '2rem'\n\t *\n\t * When this icon is a descendant of `<schmancy-button>`, the button's\n\t * `size` wins (via `SchmancyButtonSizeContext`). The local `size` only\n\t * applies when there is no ancestor button.\n\t */\n\t@property({ type: String, reflect: true })\n\tsize: IconSize = 'md'\n\n\t/**\n\t * Size inherited from an ancestor `<schmancy-button>` via context.\n\t * Undefined when the icon is not nested in a button.\n\t */\n\t@consume({ context: SchmancyButtonSizeContext, subscribe: true })\n\t@state()\n\tprivate _buttonSize?: SchmancyButtonSize\n\n\t/**\n\t * Icon name - use this instead of slot content to prevent translation breaking icons.\n\t * When set, this takes precedence over slot content.\n\t * Example: <schmancy-icon icon=\"delete\"></schmancy-icon>\n\t */\n\t@property({ type: String })\n\ticon?: string\n\n\t// M3 aligned token sizes with optimal optical sizes\n\tprivate static readonly tokenSizes: Record<string, { size: string; opsz: number }> = {\n\t\txxs: { size: '12px', opsz: 20 }, // fits in 24px buttons (ultra-compact)\n\t\txs: { size: '16px', opsz: 20 }, // fits in 32px buttons\n\t\tsm: { size: '20px', opsz: 20 }, // fits in 40px buttons\n\t\tmd: { size: '24px', opsz: 24 }, // fits in 48px buttons (default)\n\t\tlg: { size: '32px', opsz: 40 }, // fits in 56px buttons\n\t}\n\n\t/** Extract pixel value from a custom size string for optical size */\n\tprivate static computeOpticalSize(size: string): number {\n\t\tconst px = parseFloat(size)\n\t\treturn isNaN(px) ? 24 : Math.max(20, Math.min(48, Math.round(px)))\n\t}\n\n\t// RxJS subjects for reactive property updates\n\tprivate fill$ = new BehaviorSubject(this.fill)\n\tprivate weight$ = new BehaviorSubject(this.weight)\n\tprivate grade$ = new BehaviorSubject(this.grade)\n\tprivate variant$ = new BehaviorSubject(this.variant)\n\n\t// Captured icon name from slot content (translation-proof)\n\t@state()\n\tprivate _capturedIcon?: string\n\n\t// Observer for text content changes (ternaries update text nodes, not DOM structure)\n\tprivate _observer?: MutationObserver\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback()\n\n\t\t// Capture initial icon name\n\t\tthis._updateCapturedIcon()\n\n\t\t// Watch for text content changes (characterData) for dynamic icon updates\n\t\tthis._observer = new MutationObserver(() => this._updateCapturedIcon())\n\t\tthis._observer.observe(this, { childList: true, characterData: true, subtree: true })\n\n\t\t// Load Google Fonts if not already loaded\n\t\tSchmancyIcon.loadFonts()\n\n\t\t// Prevent browser translation from breaking icon ligatures\n\t\t// Using multiple methods for maximum compatibility:\n\t\t// - translate=\"no\" (HTML5 standard)\n\t\t// - class=\"notranslate\" (Google Translate specific)\n\t\tthis.setAttribute('translate', 'no')\n\t\tthis.classList.add('notranslate')\n\n\t\t// Set accessibility attributes for decorative icons\n\t\tif (!this.hasAttribute('aria-label') &&\n\t\t !this.hasAttribute('aria-labelledby') &&\n\t\t !this.hasAttribute('aria-hidden') &&\n\t\t !this.hasAttribute('role')) {\n\t\t\tthis.setAttribute('aria-hidden', 'true')\n\t\t}\n\n\t\t// Setup reactive CSS variable updates\n\t\tcombineLatest([\n\t\t\tthis.fill$,\n\t\t\tthis.weight$,\n\t\t\tthis.grade$,\n\t\t\tthis.variant$\n\t\t]).pipe(\n\t\t\ttap(([fill, weight, grade, variant]) => {\n\t\t\t\t// Update CSS custom properties for smooth transitions\n\t\t\t\tthis.style.setProperty('--schmancy-icon-fill', String(fill))\n\t\t\t\tthis.style.setProperty('--schmancy-icon-weight', String(weight))\n\t\t\t\tthis.style.setProperty('--schmancy-icon-grade', String(grade))\n\n\t\t\t\t// Update font family based on variant\n\t\t\t\tconst fontFamily = {\n\t\t\t\t\t'outlined': 'Material Symbols Outlined',\n\t\t\t\t\t'rounded': 'Material Symbols Rounded',\n\t\t\t\t\t'sharp': 'Material Symbols Sharp'\n\t\t\t\t}[variant] || 'Material Symbols Outlined'\n\n\t\t\t\tthis.style.setProperty('--schmancy-icon-font', fontFamily)\n\t\t\t}),\n\t\t\ttakeUntil(this.disconnecting)\n\t\t).subscribe()\n\n\t}\n\n\t/**\n\t * Update captured icon from current text content\n\t */\n\tprivate _updateCapturedIcon(): void {\n\t\tif (!this.icon) {\n\t\t\tconst textContent = this.textContent?.trim()\n\t\t\tif (textContent && textContent !== this._capturedIcon) {\n\t\t\t\tthis._capturedIcon = textContent\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected updated(changedProperties: Map<string | number | symbol, unknown>): void {\n\t\tsuper.updated(changedProperties)\n\n\t\t// Update BehaviorSubjects when properties change\n\t\tif (changedProperties.has('fill')) {\n\t\t\tthis.fill$.next(this.fill)\n\t\t}\n\t\tif (changedProperties.has('weight')) {\n\t\t\tthis.weight$.next(this.weight)\n\t\t}\n\t\tif (changedProperties.has('grade')) {\n\t\t\tthis.grade$.next(this.grade)\n\t\t}\n\t\tif (changedProperties.has('variant')) {\n\t\t\tthis.variant$.next(this.variant)\n\t\t}\n\t}\n\n\tprotected render(): unknown {\n\t\tconst fontFamily = {\n\t\t\t'outlined': 'Material Symbols Outlined',\n\t\t\t'rounded': 'Material Symbols Rounded',\n\t\t\t'sharp': 'Material Symbols Sharp'\n\t\t}[this.variant] || 'Material Symbols Outlined'\n\n\t\t// Effective size: ancestor `<schmancy-button>` wins via context, else local `size`.\n\t\tconst effectiveSize: IconSize = this._buttonSize ?? this.size\n\t\t// Resolve size: token → px, bare number → px, or pass through as-is\n\t\tconst sizeConfig = SchmancyIcon.tokenSizes[effectiveSize]\n\t\tconst isNumeric = !sizeConfig && /^\\d+(\\.\\d+)?$/.test(effectiveSize)\n\t\tconst iconSize = sizeConfig?.size || (isNumeric ? `${effectiveSize}px` : effectiveSize)\n\t\tconst opticalSize = sizeConfig?.opsz || SchmancyIcon.computeOpticalSize(iconSize)\n\n\t\t// Set size on HOST so :host CSS picks it up\n\t\tthis.style.setProperty('--schmancy-icon-size', iconSize)\n\t\tthis.style.setProperty('--schmancy-icon-opsz', String(opticalSize))\n\n\t\tconst style = {\n\t\t\t'--schmancy-icon-fill': this.fill,\n\t\t\t'--schmancy-icon-weight': this.weight,\n\t\t\t'--schmancy-icon-grade': this.grade,\n\t\t\t'--schmancy-icon-font': fontFamily,\n\t\t}\n\n\t\t// Priority: icon property > captured icon (for dynamic content)\n\t\tconst iconName = this.icon || this._capturedIcon\n\n\t\t// Always render slot (hidden) to observe content changes, display via data-icon\n\t\treturn html`\n\t\t\t<span class=\"material-symbols notranslate\" part=\"icon\" translate=\"no\" data-icon=${iconName || ''} style=${this.styleMap(style)}></span>\n\t\t\t<slot style=\"display:none\"></slot>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-icon': SchmancyIcon\n\t}\n}"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { a as e, t } from "./tailwind.mixin-BCz3GEpw.js";
1
+ import { a as e, t } from "./tailwind.mixin-H5Pn7vSJ.js";
2
2
  import { t as n } from "./decorate-D_utPUsC.js";
3
3
  import "./mixins.js";
4
- import { t as r } from "./context-DgD3c6q-.js";
4
+ import { t as r } from "./context-D8Q66KPe.js";
5
5
  import { BehaviorSubject as i, combineLatest as a, takeUntil as o } from "rxjs";
6
6
  import { tap as s } from "rxjs/operators";
7
7
  import { customElement as c, property as l, state as u } from "lit/decorators.js";
@@ -1 +1 @@
1
- {"version":3,"file":"icons-DDQBxhDC.js","names":[],"sources":["../src/icons/icon.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { consume } from '@lit/context'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { BehaviorSubject, combineLatest, takeUntil } from 'rxjs'\nimport { tap } from 'rxjs/operators'\nimport { SchmancyButtonSizeContext, type SchmancyButtonSize } from '../button/context'\n\n/**\n * Icon size tokens - M3 aligned with optical size optimization\n * - xxs: 12px (opsz: 20) - fits in 24px buttons (ultra-compact)\n * - xs: 16px (opsz: 20) - fits in 32px buttons\n * - sm: 20px (opsz: 20) - fits in 40px buttons\n * - md: 24px (opsz: 24) - fits in 48px buttons (default)\n * - lg: 32px (opsz: 40) - fits in 56px buttons\n * - Or custom string like '48px'\n */\nexport type IconSize = 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | string\n\n/**\n * @element schmancy-icon\n * Material Symbols icon component with flexible font variation properties\n *\n * @cssprop --schmancy-icon-size - The size of the icon (default: 24px)\n * @cssprop --schmancy-icon-fill - Fill value for icon (0-1)\n * @cssprop --schmancy-icon-weight - Weight value for icon (100-700)\n * @cssprop --schmancy-icon-grade - Grade value for icon (-50-200)\n * @cssprop --schmancy-icon-opsz - Optical size (default: 24)\n * @csspart icon - The inner `<span>` carrying the Material Symbols glyph.\n */\n@customElement('schmancy-icon')\nexport default class SchmancyIcon extends TailwindElement(css`\n\t:host {\n\t\t--schmancy-icon-size: 24px;\n\t\t--schmancy-icon-fill: 0;\n\t\t--schmancy-icon-weight: 400;\n\t\t--schmancy-icon-grade: 0;\n\t\t--schmancy-icon-opsz: 24;\n\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: var(--schmancy-icon-size);\n\t\theight: var(--schmancy-icon-size);\n\t\tfont-size: var(--schmancy-icon-size);\n\t\tcolor: inherit;\n\t\ttransition: font-variation-settings 0.2s ease;\n\t}\n\n\t.material-symbols {\n\t\tfont-family: var(--schmancy-icon-font, 'Material Symbols Outlined');\n\t\tfont-weight: normal;\n\t\tfont-style: normal;\n\t\tline-height: 1;\n\t\tletter-spacing: normal;\n\t\ttext-transform: none;\n\t\tdisplay: inline-block;\n\t\twhite-space: nowrap;\n\t\tword-wrap: normal;\n\t\tdirection: ltr;\n\t\t-webkit-font-smoothing: antialiased;\n\t\t-webkit-font-feature-settings: 'liga';\n\t\tfont-feature-settings: 'liga';\n\t\tfont-variation-settings:\n\t\t\t'FILL' var(--schmancy-icon-fill),\n\t\t\t'wght' var(--schmancy-icon-weight),\n\t\t\t'GRAD' var(--schmancy-icon-grade),\n\t\t\t'opsz' var(--schmancy-icon-opsz);\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t/* CSS-generated content is NOT translated by Google Translate */\n\t.material-symbols[data-icon]::before {\n\t\tcontent: attr(data-icon);\n\t}\n`) {\n\t// Static flag to track if Google Fonts have been loaded\n\tprivate static fontsLoaded = false\n\n\t/**\n\t * Load Material Symbols fonts from Google Fonts CDN\n\t */\n\tprivate static loadFonts(): void {\n\t\tif (SchmancyIcon.fontsLoaded) {\n\t\t\treturn\n\t\t}\n\n\t\tconst link = document.createElement('link')\n\t\tlink.rel = 'stylesheet'\n\t\tlink.href = 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&family=Material+Symbols+Sharp:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap'\n\t\tdocument.head.appendChild(link)\n\n\t\tSchmancyIcon.fontsLoaded = true\n\t}\n\n\t/**\n\t * Fill value for the icon (0-1)\n\t * 0 = outlined, 1 = filled\n\t */\n\t@property({ type: Number, reflect: true })\n\tfill = 0\n\n\t/**\n\t * Weight value for the icon (100-700)\n\t * Controls the thickness of the icon strokes\n\t */\n\t@property({ type: Number, reflect: true })\n\tweight = 400\n\n\t/**\n\t * Grade value for the icon (-50-200)\n\t * Adjusts the visual weight/grade\n\t */\n\t@property({ type: Number, reflect: true })\n\tgrade = 0\n\n\t/**\n\t * Icon variant style\n\t * @values outlined | rounded | sharp\n\t */\n\t@property({ type: String, reflect: true })\n\tvariant: 'outlined' | 'rounded' | 'sharp' = 'outlined'\n\n\t/**\n\t * Size of the icon - M3 aligned tokens or custom string\n\t * Tokens: 'xxs' (12px), 'xs' (16px), 'sm' (20px), 'md' (24px), 'lg' (32px)\n\t * Custom: any CSS size string like '48px', '2rem'\n\t *\n\t * When this icon is a descendant of `<schmancy-button>`, the button's\n\t * `size` wins (via `SchmancyButtonSizeContext`). The local `size` only\n\t * applies when there is no ancestor button.\n\t */\n\t@property({ type: String, reflect: true })\n\tsize: IconSize = 'md'\n\n\t/**\n\t * Size inherited from an ancestor `<schmancy-button>` via context.\n\t * Undefined when the icon is not nested in a button.\n\t */\n\t@consume({ context: SchmancyButtonSizeContext, subscribe: true })\n\t@state()\n\tprivate _buttonSize?: SchmancyButtonSize\n\n\t/**\n\t * Icon name - use this instead of slot content to prevent translation breaking icons.\n\t * When set, this takes precedence over slot content.\n\t * Example: <schmancy-icon icon=\"delete\"></schmancy-icon>\n\t */\n\t@property({ type: String })\n\ticon?: string\n\n\t// M3 aligned token sizes with optimal optical sizes\n\tprivate static readonly tokenSizes: Record<string, { size: string; opsz: number }> = {\n\t\txxs: { size: '12px', opsz: 20 }, // fits in 24px buttons (ultra-compact)\n\t\txs: { size: '16px', opsz: 20 }, // fits in 32px buttons\n\t\tsm: { size: '20px', opsz: 20 }, // fits in 40px buttons\n\t\tmd: { size: '24px', opsz: 24 }, // fits in 48px buttons (default)\n\t\tlg: { size: '32px', opsz: 40 }, // fits in 56px buttons\n\t}\n\n\t/** Extract pixel value from a custom size string for optical size */\n\tprivate static computeOpticalSize(size: string): number {\n\t\tconst px = parseFloat(size)\n\t\treturn isNaN(px) ? 24 : Math.max(20, Math.min(48, Math.round(px)))\n\t}\n\n\t// RxJS subjects for reactive property updates\n\tprivate fill$ = new BehaviorSubject(this.fill)\n\tprivate weight$ = new BehaviorSubject(this.weight)\n\tprivate grade$ = new BehaviorSubject(this.grade)\n\tprivate variant$ = new BehaviorSubject(this.variant)\n\n\t// Captured icon name from slot content (translation-proof)\n\t@state()\n\tprivate _capturedIcon?: string\n\n\t// Observer for text content changes (ternaries update text nodes, not DOM structure)\n\tprivate _observer?: MutationObserver\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback()\n\n\t\t// Capture initial icon name\n\t\tthis._updateCapturedIcon()\n\n\t\t// Watch for text content changes (characterData) for dynamic icon updates\n\t\tthis._observer = new MutationObserver(() => this._updateCapturedIcon())\n\t\tthis._observer.observe(this, { childList: true, characterData: true, subtree: true })\n\n\t\t// Load Google Fonts if not already loaded\n\t\tSchmancyIcon.loadFonts()\n\n\t\t// Prevent browser translation from breaking icon ligatures\n\t\t// Using multiple methods for maximum compatibility:\n\t\t// - translate=\"no\" (HTML5 standard)\n\t\t// - class=\"notranslate\" (Google Translate specific)\n\t\tthis.setAttribute('translate', 'no')\n\t\tthis.classList.add('notranslate')\n\n\t\t// Set accessibility attributes for decorative icons\n\t\tif (!this.hasAttribute('aria-label') &&\n\t\t !this.hasAttribute('aria-labelledby') &&\n\t\t !this.hasAttribute('aria-hidden') &&\n\t\t !this.hasAttribute('role')) {\n\t\t\tthis.setAttribute('aria-hidden', 'true')\n\t\t}\n\n\t\t// Setup reactive CSS variable updates\n\t\tcombineLatest([\n\t\t\tthis.fill$,\n\t\t\tthis.weight$,\n\t\t\tthis.grade$,\n\t\t\tthis.variant$\n\t\t]).pipe(\n\t\t\ttap(([fill, weight, grade, variant]) => {\n\t\t\t\t// Update CSS custom properties for smooth transitions\n\t\t\t\tthis.style.setProperty('--schmancy-icon-fill', String(fill))\n\t\t\t\tthis.style.setProperty('--schmancy-icon-weight', String(weight))\n\t\t\t\tthis.style.setProperty('--schmancy-icon-grade', String(grade))\n\n\t\t\t\t// Update font family based on variant\n\t\t\t\tconst fontFamily = {\n\t\t\t\t\t'outlined': 'Material Symbols Outlined',\n\t\t\t\t\t'rounded': 'Material Symbols Rounded',\n\t\t\t\t\t'sharp': 'Material Symbols Sharp'\n\t\t\t\t}[variant] || 'Material Symbols Outlined'\n\n\t\t\t\tthis.style.setProperty('--schmancy-icon-font', fontFamily)\n\t\t\t}),\n\t\t\ttakeUntil(this.disconnecting)\n\t\t).subscribe()\n\n\t}\n\n\t/**\n\t * Update captured icon from current text content\n\t */\n\tprivate _updateCapturedIcon(): void {\n\t\tif (!this.icon) {\n\t\t\tconst textContent = this.textContent?.trim()\n\t\t\tif (textContent && textContent !== this._capturedIcon) {\n\t\t\t\tthis._capturedIcon = textContent\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected updated(changedProperties: Map<string | number | symbol, unknown>): void {\n\t\tsuper.updated(changedProperties)\n\n\t\t// Update BehaviorSubjects when properties change\n\t\tif (changedProperties.has('fill')) {\n\t\t\tthis.fill$.next(this.fill)\n\t\t}\n\t\tif (changedProperties.has('weight')) {\n\t\t\tthis.weight$.next(this.weight)\n\t\t}\n\t\tif (changedProperties.has('grade')) {\n\t\t\tthis.grade$.next(this.grade)\n\t\t}\n\t\tif (changedProperties.has('variant')) {\n\t\t\tthis.variant$.next(this.variant)\n\t\t}\n\t}\n\n\tprotected render(): unknown {\n\t\tconst fontFamily = {\n\t\t\t'outlined': 'Material Symbols Outlined',\n\t\t\t'rounded': 'Material Symbols Rounded',\n\t\t\t'sharp': 'Material Symbols Sharp'\n\t\t}[this.variant] || 'Material Symbols Outlined'\n\n\t\t// Effective size: ancestor `<schmancy-button>` wins via context, else local `size`.\n\t\tconst effectiveSize: IconSize = this._buttonSize ?? this.size\n\t\t// Resolve size: token → px, bare number → px, or pass through as-is\n\t\tconst sizeConfig = SchmancyIcon.tokenSizes[effectiveSize]\n\t\tconst isNumeric = !sizeConfig && /^\\d+(\\.\\d+)?$/.test(effectiveSize)\n\t\tconst iconSize = sizeConfig?.size || (isNumeric ? `${effectiveSize}px` : effectiveSize)\n\t\tconst opticalSize = sizeConfig?.opsz || SchmancyIcon.computeOpticalSize(iconSize)\n\n\t\t// Set size on HOST so :host CSS picks it up\n\t\tthis.style.setProperty('--schmancy-icon-size', iconSize)\n\t\tthis.style.setProperty('--schmancy-icon-opsz', String(opticalSize))\n\n\t\tconst style = {\n\t\t\t'--schmancy-icon-fill': this.fill,\n\t\t\t'--schmancy-icon-weight': this.weight,\n\t\t\t'--schmancy-icon-grade': this.grade,\n\t\t\t'--schmancy-icon-font': fontFamily,\n\t\t}\n\n\t\t// Priority: icon property > captured icon (for dynamic content)\n\t\tconst iconName = this.icon || this._capturedIcon\n\n\t\t// Always render slot (hidden) to observe content changes, display via data-icon\n\t\treturn html`\n\t\t\t<span class=\"material-symbols notranslate\" part=\"icon\" translate=\"no\" data-icon=${iconName || ''} style=${this.styleMap(style)}></span>\n\t\t\t<slot style=\"display:none\"></slot>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-icon': SchmancyIcon\n\t}\n}"],"mappings":"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"}
1
+ {"version":3,"file":"icons-C5-DIjet.js","names":[],"sources":["../src/icons/icon.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { consume } from '@lit/context'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { BehaviorSubject, combineLatest, takeUntil } from 'rxjs'\nimport { tap } from 'rxjs/operators'\nimport { SchmancyButtonSizeContext, type SchmancyButtonSize } from '../button/context'\n\n/**\n * Icon size tokens - M3 aligned with optical size optimization\n * - xxs: 12px (opsz: 20) - fits in 24px buttons (ultra-compact)\n * - xs: 16px (opsz: 20) - fits in 32px buttons\n * - sm: 20px (opsz: 20) - fits in 40px buttons\n * - md: 24px (opsz: 24) - fits in 48px buttons (default)\n * - lg: 32px (opsz: 40) - fits in 56px buttons\n * - Or custom string like '48px'\n */\nexport type IconSize = 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | string\n\n/**\n * @element schmancy-icon\n * Material Symbols icon component with flexible font variation properties\n *\n * @cssprop --schmancy-icon-size - The size of the icon (default: 24px)\n * @cssprop --schmancy-icon-fill - Fill value for icon (0-1)\n * @cssprop --schmancy-icon-weight - Weight value for icon (100-700)\n * @cssprop --schmancy-icon-grade - Grade value for icon (-50-200)\n * @cssprop --schmancy-icon-opsz - Optical size (default: 24)\n * @csspart icon - The inner `<span>` carrying the Material Symbols glyph.\n */\n@customElement('schmancy-icon')\nexport default class SchmancyIcon extends TailwindElement(css`\n\t:host {\n\t\t--schmancy-icon-size: 24px;\n\t\t--schmancy-icon-fill: 0;\n\t\t--schmancy-icon-weight: 400;\n\t\t--schmancy-icon-grade: 0;\n\t\t--schmancy-icon-opsz: 24;\n\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: var(--schmancy-icon-size);\n\t\theight: var(--schmancy-icon-size);\n\t\tfont-size: var(--schmancy-icon-size);\n\t\tcolor: inherit;\n\t\ttransition: font-variation-settings 0.2s ease;\n\t}\n\n\t.material-symbols {\n\t\tfont-family: var(--schmancy-icon-font, 'Material Symbols Outlined');\n\t\tfont-weight: normal;\n\t\tfont-style: normal;\n\t\tline-height: 1;\n\t\tletter-spacing: normal;\n\t\ttext-transform: none;\n\t\tdisplay: inline-block;\n\t\twhite-space: nowrap;\n\t\tword-wrap: normal;\n\t\tdirection: ltr;\n\t\t-webkit-font-smoothing: antialiased;\n\t\t-webkit-font-feature-settings: 'liga';\n\t\tfont-feature-settings: 'liga';\n\t\tfont-variation-settings:\n\t\t\t'FILL' var(--schmancy-icon-fill),\n\t\t\t'wght' var(--schmancy-icon-weight),\n\t\t\t'GRAD' var(--schmancy-icon-grade),\n\t\t\t'opsz' var(--schmancy-icon-opsz);\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t/* CSS-generated content is NOT translated by Google Translate */\n\t.material-symbols[data-icon]::before {\n\t\tcontent: attr(data-icon);\n\t}\n`) {\n\t// Static flag to track if Google Fonts have been loaded\n\tprivate static fontsLoaded = false\n\n\t/**\n\t * Load Material Symbols fonts from Google Fonts CDN\n\t */\n\tprivate static loadFonts(): void {\n\t\tif (SchmancyIcon.fontsLoaded) {\n\t\t\treturn\n\t\t}\n\n\t\tconst link = document.createElement('link')\n\t\tlink.rel = 'stylesheet'\n\t\tlink.href = 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&family=Material+Symbols+Sharp:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap'\n\t\tdocument.head.appendChild(link)\n\n\t\tSchmancyIcon.fontsLoaded = true\n\t}\n\n\t/**\n\t * Fill value for the icon (0-1)\n\t * 0 = outlined, 1 = filled\n\t */\n\t@property({ type: Number, reflect: true })\n\tfill = 0\n\n\t/**\n\t * Weight value for the icon (100-700)\n\t * Controls the thickness of the icon strokes\n\t */\n\t@property({ type: Number, reflect: true })\n\tweight = 400\n\n\t/**\n\t * Grade value for the icon (-50-200)\n\t * Adjusts the visual weight/grade\n\t */\n\t@property({ type: Number, reflect: true })\n\tgrade = 0\n\n\t/**\n\t * Icon variant style\n\t * @values outlined | rounded | sharp\n\t */\n\t@property({ type: String, reflect: true })\n\tvariant: 'outlined' | 'rounded' | 'sharp' = 'outlined'\n\n\t/**\n\t * Size of the icon - M3 aligned tokens or custom string\n\t * Tokens: 'xxs' (12px), 'xs' (16px), 'sm' (20px), 'md' (24px), 'lg' (32px)\n\t * Custom: any CSS size string like '48px', '2rem'\n\t *\n\t * When this icon is a descendant of `<schmancy-button>`, the button's\n\t * `size` wins (via `SchmancyButtonSizeContext`). The local `size` only\n\t * applies when there is no ancestor button.\n\t */\n\t@property({ type: String, reflect: true })\n\tsize: IconSize = 'md'\n\n\t/**\n\t * Size inherited from an ancestor `<schmancy-button>` via context.\n\t * Undefined when the icon is not nested in a button.\n\t */\n\t@consume({ context: SchmancyButtonSizeContext, subscribe: true })\n\t@state()\n\tprivate _buttonSize?: SchmancyButtonSize\n\n\t/**\n\t * Icon name - use this instead of slot content to prevent translation breaking icons.\n\t * When set, this takes precedence over slot content.\n\t * Example: <schmancy-icon icon=\"delete\"></schmancy-icon>\n\t */\n\t@property({ type: String })\n\ticon?: string\n\n\t// M3 aligned token sizes with optimal optical sizes\n\tprivate static readonly tokenSizes: Record<string, { size: string; opsz: number }> = {\n\t\txxs: { size: '12px', opsz: 20 }, // fits in 24px buttons (ultra-compact)\n\t\txs: { size: '16px', opsz: 20 }, // fits in 32px buttons\n\t\tsm: { size: '20px', opsz: 20 }, // fits in 40px buttons\n\t\tmd: { size: '24px', opsz: 24 }, // fits in 48px buttons (default)\n\t\tlg: { size: '32px', opsz: 40 }, // fits in 56px buttons\n\t}\n\n\t/** Extract pixel value from a custom size string for optical size */\n\tprivate static computeOpticalSize(size: string): number {\n\t\tconst px = parseFloat(size)\n\t\treturn isNaN(px) ? 24 : Math.max(20, Math.min(48, Math.round(px)))\n\t}\n\n\t// RxJS subjects for reactive property updates\n\tprivate fill$ = new BehaviorSubject(this.fill)\n\tprivate weight$ = new BehaviorSubject(this.weight)\n\tprivate grade$ = new BehaviorSubject(this.grade)\n\tprivate variant$ = new BehaviorSubject(this.variant)\n\n\t// Captured icon name from slot content (translation-proof)\n\t@state()\n\tprivate _capturedIcon?: string\n\n\t// Observer for text content changes (ternaries update text nodes, not DOM structure)\n\tprivate _observer?: MutationObserver\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback()\n\n\t\t// Capture initial icon name\n\t\tthis._updateCapturedIcon()\n\n\t\t// Watch for text content changes (characterData) for dynamic icon updates\n\t\tthis._observer = new MutationObserver(() => this._updateCapturedIcon())\n\t\tthis._observer.observe(this, { childList: true, characterData: true, subtree: true })\n\n\t\t// Load Google Fonts if not already loaded\n\t\tSchmancyIcon.loadFonts()\n\n\t\t// Prevent browser translation from breaking icon ligatures\n\t\t// Using multiple methods for maximum compatibility:\n\t\t// - translate=\"no\" (HTML5 standard)\n\t\t// - class=\"notranslate\" (Google Translate specific)\n\t\tthis.setAttribute('translate', 'no')\n\t\tthis.classList.add('notranslate')\n\n\t\t// Set accessibility attributes for decorative icons\n\t\tif (!this.hasAttribute('aria-label') &&\n\t\t !this.hasAttribute('aria-labelledby') &&\n\t\t !this.hasAttribute('aria-hidden') &&\n\t\t !this.hasAttribute('role')) {\n\t\t\tthis.setAttribute('aria-hidden', 'true')\n\t\t}\n\n\t\t// Setup reactive CSS variable updates\n\t\tcombineLatest([\n\t\t\tthis.fill$,\n\t\t\tthis.weight$,\n\t\t\tthis.grade$,\n\t\t\tthis.variant$\n\t\t]).pipe(\n\t\t\ttap(([fill, weight, grade, variant]) => {\n\t\t\t\t// Update CSS custom properties for smooth transitions\n\t\t\t\tthis.style.setProperty('--schmancy-icon-fill', String(fill))\n\t\t\t\tthis.style.setProperty('--schmancy-icon-weight', String(weight))\n\t\t\t\tthis.style.setProperty('--schmancy-icon-grade', String(grade))\n\n\t\t\t\t// Update font family based on variant\n\t\t\t\tconst fontFamily = {\n\t\t\t\t\t'outlined': 'Material Symbols Outlined',\n\t\t\t\t\t'rounded': 'Material Symbols Rounded',\n\t\t\t\t\t'sharp': 'Material Symbols Sharp'\n\t\t\t\t}[variant] || 'Material Symbols Outlined'\n\n\t\t\t\tthis.style.setProperty('--schmancy-icon-font', fontFamily)\n\t\t\t}),\n\t\t\ttakeUntil(this.disconnecting)\n\t\t).subscribe()\n\n\t}\n\n\t/**\n\t * Update captured icon from current text content\n\t */\n\tprivate _updateCapturedIcon(): void {\n\t\tif (!this.icon) {\n\t\t\tconst textContent = this.textContent?.trim()\n\t\t\tif (textContent && textContent !== this._capturedIcon) {\n\t\t\t\tthis._capturedIcon = textContent\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected updated(changedProperties: Map<string | number | symbol, unknown>): void {\n\t\tsuper.updated(changedProperties)\n\n\t\t// Update BehaviorSubjects when properties change\n\t\tif (changedProperties.has('fill')) {\n\t\t\tthis.fill$.next(this.fill)\n\t\t}\n\t\tif (changedProperties.has('weight')) {\n\t\t\tthis.weight$.next(this.weight)\n\t\t}\n\t\tif (changedProperties.has('grade')) {\n\t\t\tthis.grade$.next(this.grade)\n\t\t}\n\t\tif (changedProperties.has('variant')) {\n\t\t\tthis.variant$.next(this.variant)\n\t\t}\n\t}\n\n\tprotected render(): unknown {\n\t\tconst fontFamily = {\n\t\t\t'outlined': 'Material Symbols Outlined',\n\t\t\t'rounded': 'Material Symbols Rounded',\n\t\t\t'sharp': 'Material Symbols Sharp'\n\t\t}[this.variant] || 'Material Symbols Outlined'\n\n\t\t// Effective size: ancestor `<schmancy-button>` wins via context, else local `size`.\n\t\tconst effectiveSize: IconSize = this._buttonSize ?? this.size\n\t\t// Resolve size: token → px, bare number → px, or pass through as-is\n\t\tconst sizeConfig = SchmancyIcon.tokenSizes[effectiveSize]\n\t\tconst isNumeric = !sizeConfig && /^\\d+(\\.\\d+)?$/.test(effectiveSize)\n\t\tconst iconSize = sizeConfig?.size || (isNumeric ? `${effectiveSize}px` : effectiveSize)\n\t\tconst opticalSize = sizeConfig?.opsz || SchmancyIcon.computeOpticalSize(iconSize)\n\n\t\t// Set size on HOST so :host CSS picks it up\n\t\tthis.style.setProperty('--schmancy-icon-size', iconSize)\n\t\tthis.style.setProperty('--schmancy-icon-opsz', String(opticalSize))\n\n\t\tconst style = {\n\t\t\t'--schmancy-icon-fill': this.fill,\n\t\t\t'--schmancy-icon-weight': this.weight,\n\t\t\t'--schmancy-icon-grade': this.grade,\n\t\t\t'--schmancy-icon-font': fontFamily,\n\t\t}\n\n\t\t// Priority: icon property > captured icon (for dynamic content)\n\t\tconst iconName = this.icon || this._capturedIcon\n\n\t\t// Always render slot (hidden) to observe content changes, display via data-icon\n\t\treturn html`\n\t\t\t<span class=\"material-symbols notranslate\" part=\"icon\" translate=\"no\" data-icon=${iconName || ''} style=${this.styleMap(style)}></span>\n\t\t\t<slot style=\"display:none\"></slot>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-icon': SchmancyIcon\n\t}\n}"],"mappings":"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"}
package/dist/icons.cjs CHANGED
@@ -1 +1 @@
1
- require(`./icons-UOqapID2.cjs`);
1
+ require(`./icons-B6V3nZ4-.cjs`);
package/dist/icons.js CHANGED
@@ -1 +1 @@
1
- import "./icons-DDQBxhDC.js";
1
+ import "./icons-C5-DIjet.js";
@@ -1,4 +1,4 @@
1
- import { t as e } from "./tailwind.mixin-BCz3GEpw.js";
1
+ import { t as e } from "./tailwind.mixin-H5Pn7vSJ.js";
2
2
  import { t } from "./decorate-D_utPUsC.js";
3
3
  import "./mixins.js";
4
4
  import { customElement as n, property as r, state as i } from "lit/decorators.js";
@@ -1 +1 @@
1
- {"version":3,"file":"iframe-CMTUyiz1.js","names":[],"sources":["../src/iframe/iframe.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { css, html, PropertyValues } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\n/** Sensible document reset for iframe content — font, spacing, word-wrap */\nconst DEFAULT_BASE_CSS = `html,body{margin:0;padding:0;overflow:hidden;background:#fff;color:#1a1a1a;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;font-size:14px;line-height:1.6;word-wrap:break-word;overflow-wrap:break-word}\nbody{padding:16px}\np{margin:0 0 1em}p:last-child{margin-bottom:0}\nul,ol{margin:0 0 1em;padding-left:1.5em}li{margin-bottom:.25em}\nh1,h2,h3,h4{margin:0 0 .5em;line-height:1.3}h1{font-size:1.5em}h2{font-size:1.25em}h3{font-size:1.1em}h4{font-size:1em}\nhr{border:none;border-top:1px solid #dadce0;margin:1em 0}\nimg{max-width:100%;height:auto}\ntable{border-collapse:collapse;max-width:100%}td,th{padding:4px 8px;border:1px solid #dadce0}\nblockquote{margin:0 0 1em;padding:.5em 0 .5em 1em;border-left:3px solid #dadce0;color:#5f6368}\npre{background:#f5f5f5;padding:.75em;border-radius:4px;overflow-x:auto;font-size:.9em}\ncode{background:#f5f5f5;padding:.1em .3em;border-radius:3px;font-size:.9em}`\n\n/**\n * Renders an HTML fragment inside a sandboxed, auto-sizing iframe.\n *\n * @slot - (none)\n * @fires load — native iframe load event\n *\n * @example\n * ```html\n * <schmancy-iframe .html=${bodyHtml} .css=${extraStyles}></schmancy-iframe>\n * ```\n */\n@customElement('schmancy-iframe')\nexport default class SchmancyIframe extends TailwindElement(css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\tiframe {\n\t\tborder: 0;\n\t\twidth: 100%;\n\t}\n`) {\n\t/** HTML body fragment to render inside the iframe */\n\t@property({ type: String }) html = ''\n\n\t/** Additional CSS injected after the base styles (consumer-specific) */\n\t@property({ type: String }) css = ''\n\n\t/** Base document CSS (font, spacing, resets). Override for fully custom styling */\n\t@property({ type: String }) baseCss = DEFAULT_BASE_CSS\n\n\t/** iframe sandbox attribute */\n\t@property({ type: String }) sandbox = 'allow-same-origin allow-popups'\n\n\t/** Minimum height in pixels */\n\t@property({ type: Number }) minHeight = 60\n\n\t@state() private _height = 60\n\tprivate _srcdoc = ''\n\n\tprotected willUpdate(changed: PropertyValues) {\n\t\tif (changed.has('html') || changed.has('css') || changed.has('baseCss')) {\n\t\t\tthis._srcdoc = this.html ? this.buildSrcdoc() : ''\n\t\t\tthis._height = this.minHeight\n\t\t}\n\t}\n\n\tprivate buildSrcdoc(): string {\n\t\tconst styles = this.css ? `${this.baseCss}\\n${this.css}` : this.baseCss\n\t\treturn `<!DOCTYPE html><html><head>\n<meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<base target=\"_blank\">\n<style>${styles}</style></head><body>${this.html}</body></html>`\n\t}\n\n\tprivate onLoad(e: Event) {\n\t\tconst iframe = e.target as HTMLIFrameElement\n\t\ttry {\n\t\t\tconst doc = iframe.contentDocument\n\t\t\tif (!doc) return\n\t\t\tthis._height = Math.max(doc.documentElement.scrollHeight, this.minHeight)\n\t\t} catch {\n\t\t\tthis._height = Math.max(200, this.minHeight)\n\t\t}\n\t}\n\n\tprotected render() {\n\t\tif (!this.html) return html``\n\t\treturn html`<iframe\n\t\t\t.srcdoc=${this._srcdoc}\n\t\t\tsandbox=${this.sandbox}\n\t\t\tstyle=\"height:${this._height}px;min-height:${this.minHeight}px;overflow:hidden\"\n\t\t\t@load=${this.onLoad}\n\t\t></iframe>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-iframe': SchmancyIframe\n\t}\n}\n"],"mappings":";;;;;AAKA,IAwBe,IAAA,cAA6B,EAAgB,CAAG;;;;;;;;;;2BAU3B,IAAA,KAAA,MAGD,IAAA,KAAA,UArCV,27BAAA,KAAA,UA2Cc,kCAAA,KAAA,YAGE,IAAA,KAAA,UAEb,IAAA,KAAA,UACT;;CAElB,WAAqB,GAAA;AAAA,GAChB,EAAQ,IAAI,OAAA,IAAW,EAAQ,IAAI,MAAA,IAAU,EAAQ,IAAI,UAAA,MAC5D,KAAK,UAAU,KAAK,OAAO,KAAK,aAAA,GAAgB,IAChD,KAAK,UAAU,KAAK;;CAItB,cAAA;AAEC,SAAO,0JADQ,KAAK,MAAM,GAAG,KAAK,QAAA,IAAY,KAAK,QAAQ,KAAK,QAAA,uBAI3B,KAAK,KAAA;;CAG3C,OAAe,GAAA;EACd,IAAM,IAAS,EAAE;AACjB,MAAA;GACC,IAAM,IAAM,EAAO;AACnB,OAAA,CAAK,EAAK;AACV,QAAK,UAAU,KAAK,IAAI,EAAI,gBAAgB,cAAc,KAAK,UAAA;UAAA;AAE/D,QAAK,UAAU,KAAK,IAAI,KAAK,KAAK,UAAA;;;CAIpC,SAAA;AACC,SAAK,KAAK,OACH,CAAI;aACA,KAAK,QAAA;aACL,KAAK,QAAA;mBACC,KAAK,QAAA,gBAAwB,KAAK,UAAA;WAC1C,KAAK,OAAA;gBALS,CAAI;;;AAAA,EAAA,CA5C3B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,QAAA,KAAA,EAAA,EAAA,EAAA,CAG1B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,OAAA,KAAA,EAAA,EAAA,EAAA,CAG1B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,WAAA,KAAA,EAAA,EAAA,EAAA,CAG1B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,WAAA,KAAA,EAAA,EAAA,EAAA,CAG1B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,aAAA,KAAA,EAAA,EAAA,EAAA,CAE1B,GAAA,CAAA,EAAO,EAAA,WAAA,WAAA,KAAA,EAAA;AAAA,IAAA,IAAA,IAAA,EAAA,CAzBR,EAAc,kBAAA,CAAA,EAAkB,EAAA;AAAA,SAAA,KAAA"}
1
+ {"version":3,"file":"iframe-BXBsuLwt.js","names":[],"sources":["../src/iframe/iframe.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { css, html, PropertyValues } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\n/** Sensible document reset for iframe content — font, spacing, word-wrap */\nconst DEFAULT_BASE_CSS = `html,body{margin:0;padding:0;overflow:hidden;background:#fff;color:#1a1a1a;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;font-size:14px;line-height:1.6;word-wrap:break-word;overflow-wrap:break-word}\nbody{padding:16px}\np{margin:0 0 1em}p:last-child{margin-bottom:0}\nul,ol{margin:0 0 1em;padding-left:1.5em}li{margin-bottom:.25em}\nh1,h2,h3,h4{margin:0 0 .5em;line-height:1.3}h1{font-size:1.5em}h2{font-size:1.25em}h3{font-size:1.1em}h4{font-size:1em}\nhr{border:none;border-top:1px solid #dadce0;margin:1em 0}\nimg{max-width:100%;height:auto}\ntable{border-collapse:collapse;max-width:100%}td,th{padding:4px 8px;border:1px solid #dadce0}\nblockquote{margin:0 0 1em;padding:.5em 0 .5em 1em;border-left:3px solid #dadce0;color:#5f6368}\npre{background:#f5f5f5;padding:.75em;border-radius:4px;overflow-x:auto;font-size:.9em}\ncode{background:#f5f5f5;padding:.1em .3em;border-radius:3px;font-size:.9em}`\n\n/**\n * Renders an HTML fragment inside a sandboxed, auto-sizing iframe.\n *\n * @slot - (none)\n * @fires load — native iframe load event\n *\n * @example\n * ```html\n * <schmancy-iframe .html=${bodyHtml} .css=${extraStyles}></schmancy-iframe>\n * ```\n */\n@customElement('schmancy-iframe')\nexport default class SchmancyIframe extends TailwindElement(css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\tiframe {\n\t\tborder: 0;\n\t\twidth: 100%;\n\t}\n`) {\n\t/** HTML body fragment to render inside the iframe */\n\t@property({ type: String }) html = ''\n\n\t/** Additional CSS injected after the base styles (consumer-specific) */\n\t@property({ type: String }) css = ''\n\n\t/** Base document CSS (font, spacing, resets). Override for fully custom styling */\n\t@property({ type: String }) baseCss = DEFAULT_BASE_CSS\n\n\t/** iframe sandbox attribute */\n\t@property({ type: String }) sandbox = 'allow-same-origin allow-popups'\n\n\t/** Minimum height in pixels */\n\t@property({ type: Number }) minHeight = 60\n\n\t@state() private _height = 60\n\tprivate _srcdoc = ''\n\n\tprotected willUpdate(changed: PropertyValues) {\n\t\tif (changed.has('html') || changed.has('css') || changed.has('baseCss')) {\n\t\t\tthis._srcdoc = this.html ? this.buildSrcdoc() : ''\n\t\t\tthis._height = this.minHeight\n\t\t}\n\t}\n\n\tprivate buildSrcdoc(): string {\n\t\tconst styles = this.css ? `${this.baseCss}\\n${this.css}` : this.baseCss\n\t\treturn `<!DOCTYPE html><html><head>\n<meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<base target=\"_blank\">\n<style>${styles}</style></head><body>${this.html}</body></html>`\n\t}\n\n\tprivate onLoad(e: Event) {\n\t\tconst iframe = e.target as HTMLIFrameElement\n\t\ttry {\n\t\t\tconst doc = iframe.contentDocument\n\t\t\tif (!doc) return\n\t\t\tthis._height = Math.max(doc.documentElement.scrollHeight, this.minHeight)\n\t\t} catch {\n\t\t\tthis._height = Math.max(200, this.minHeight)\n\t\t}\n\t}\n\n\tprotected render() {\n\t\tif (!this.html) return html``\n\t\treturn html`<iframe\n\t\t\t.srcdoc=${this._srcdoc}\n\t\t\tsandbox=${this.sandbox}\n\t\t\tstyle=\"height:${this._height}px;min-height:${this.minHeight}px;overflow:hidden\"\n\t\t\t@load=${this.onLoad}\n\t\t></iframe>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-iframe': SchmancyIframe\n\t}\n}\n"],"mappings":";;;;;AAKA,IAwBe,IAAA,cAA6B,EAAgB,CAAG;;;;;;;;;;2BAU3B,IAAA,KAAA,MAGD,IAAA,KAAA,UArCV,27BAAA,KAAA,UA2Cc,kCAAA,KAAA,YAGE,IAAA,KAAA,UAEb,IAAA,KAAA,UACT;;CAElB,WAAqB,GAAA;AAAA,GAChB,EAAQ,IAAI,OAAA,IAAW,EAAQ,IAAI,MAAA,IAAU,EAAQ,IAAI,UAAA,MAC5D,KAAK,UAAU,KAAK,OAAO,KAAK,aAAA,GAAgB,IAChD,KAAK,UAAU,KAAK;;CAItB,cAAA;AAEC,SAAO,0JADQ,KAAK,MAAM,GAAG,KAAK,QAAA,IAAY,KAAK,QAAQ,KAAK,QAAA,uBAI3B,KAAK,KAAA;;CAG3C,OAAe,GAAA;EACd,IAAM,IAAS,EAAE;AACjB,MAAA;GACC,IAAM,IAAM,EAAO;AACnB,OAAA,CAAK,EAAK;AACV,QAAK,UAAU,KAAK,IAAI,EAAI,gBAAgB,cAAc,KAAK,UAAA;UAAA;AAE/D,QAAK,UAAU,KAAK,IAAI,KAAK,KAAK,UAAA;;;CAIpC,SAAA;AACC,SAAK,KAAK,OACH,CAAI;aACA,KAAK,QAAA;aACL,KAAK,QAAA;mBACC,KAAK,QAAA,gBAAwB,KAAK,UAAA;WAC1C,KAAK,OAAA;gBALS,CAAI;;;AAAA,EAAA,CA5C3B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,QAAA,KAAA,EAAA,EAAA,EAAA,CAG1B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,OAAA,KAAA,EAAA,EAAA,EAAA,CAG1B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,WAAA,KAAA,EAAA,EAAA,EAAA,CAG1B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,WAAA,KAAA,EAAA,EAAA,EAAA,CAG1B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,aAAA,KAAA,EAAA,EAAA,EAAA,CAE1B,GAAA,CAAA,EAAO,EAAA,WAAA,WAAA,KAAA,EAAA;AAAA,IAAA,IAAA,IAAA,EAAA,CAzBR,EAAc,kBAAA,CAAA,EAAkB,EAAA;AAAA,SAAA,KAAA"}
@@ -1,4 +1,4 @@
1
- require(`./chunk-BCfY8kxB.cjs`);const e=require(`./tailwind.mixin-ZzkXQTFA.cjs`),t=require(`./decorate-F9CuyeHg.cjs`);require(`./mixins.cjs`);let n=require(`lit/decorators.js`),r=require(`lit`);var i=class extends e.t(r.css`
1
+ require(`./chunk-CncqDLb2.cjs`);const e=require(`./tailwind.mixin-Bh58QnlW.cjs`),t=require(`./decorate-F9CuyeHg.cjs`);require(`./mixins.cjs`);let n=require(`lit/decorators.js`),r=require(`lit`);var i=class extends e.t(r.css`
2
2
  :host {
3
3
  display: block;
4
4
  }
@@ -1 +1 @@
1
- {"version":3,"file":"iframe-FZCULDVM.cjs","names":[],"sources":["../src/iframe/iframe.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { css, html, PropertyValues } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\n/** Sensible document reset for iframe content — font, spacing, word-wrap */\nconst DEFAULT_BASE_CSS = `html,body{margin:0;padding:0;overflow:hidden;background:#fff;color:#1a1a1a;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;font-size:14px;line-height:1.6;word-wrap:break-word;overflow-wrap:break-word}\nbody{padding:16px}\np{margin:0 0 1em}p:last-child{margin-bottom:0}\nul,ol{margin:0 0 1em;padding-left:1.5em}li{margin-bottom:.25em}\nh1,h2,h3,h4{margin:0 0 .5em;line-height:1.3}h1{font-size:1.5em}h2{font-size:1.25em}h3{font-size:1.1em}h4{font-size:1em}\nhr{border:none;border-top:1px solid #dadce0;margin:1em 0}\nimg{max-width:100%;height:auto}\ntable{border-collapse:collapse;max-width:100%}td,th{padding:4px 8px;border:1px solid #dadce0}\nblockquote{margin:0 0 1em;padding:.5em 0 .5em 1em;border-left:3px solid #dadce0;color:#5f6368}\npre{background:#f5f5f5;padding:.75em;border-radius:4px;overflow-x:auto;font-size:.9em}\ncode{background:#f5f5f5;padding:.1em .3em;border-radius:3px;font-size:.9em}`\n\n/**\n * Renders an HTML fragment inside a sandboxed, auto-sizing iframe.\n *\n * @slot - (none)\n * @fires load — native iframe load event\n *\n * @example\n * ```html\n * <schmancy-iframe .html=${bodyHtml} .css=${extraStyles}></schmancy-iframe>\n * ```\n */\n@customElement('schmancy-iframe')\nexport default class SchmancyIframe extends TailwindElement(css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\tiframe {\n\t\tborder: 0;\n\t\twidth: 100%;\n\t}\n`) {\n\t/** HTML body fragment to render inside the iframe */\n\t@property({ type: String }) html = ''\n\n\t/** Additional CSS injected after the base styles (consumer-specific) */\n\t@property({ type: String }) css = ''\n\n\t/** Base document CSS (font, spacing, resets). Override for fully custom styling */\n\t@property({ type: String }) baseCss = DEFAULT_BASE_CSS\n\n\t/** iframe sandbox attribute */\n\t@property({ type: String }) sandbox = 'allow-same-origin allow-popups'\n\n\t/** Minimum height in pixels */\n\t@property({ type: Number }) minHeight = 60\n\n\t@state() private _height = 60\n\tprivate _srcdoc = ''\n\n\tprotected willUpdate(changed: PropertyValues) {\n\t\tif (changed.has('html') || changed.has('css') || changed.has('baseCss')) {\n\t\t\tthis._srcdoc = this.html ? this.buildSrcdoc() : ''\n\t\t\tthis._height = this.minHeight\n\t\t}\n\t}\n\n\tprivate buildSrcdoc(): string {\n\t\tconst styles = this.css ? `${this.baseCss}\\n${this.css}` : this.baseCss\n\t\treturn `<!DOCTYPE html><html><head>\n<meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<base target=\"_blank\">\n<style>${styles}</style></head><body>${this.html}</body></html>`\n\t}\n\n\tprivate onLoad(e: Event) {\n\t\tconst iframe = e.target as HTMLIFrameElement\n\t\ttry {\n\t\t\tconst doc = iframe.contentDocument\n\t\t\tif (!doc) return\n\t\t\tthis._height = Math.max(doc.documentElement.scrollHeight, this.minHeight)\n\t\t} catch {\n\t\t\tthis._height = Math.max(200, this.minHeight)\n\t\t}\n\t}\n\n\tprotected render() {\n\t\tif (!this.html) return html``\n\t\treturn html`<iframe\n\t\t\t.srcdoc=${this._srcdoc}\n\t\t\tsandbox=${this.sandbox}\n\t\t\tstyle=\"height:${this._height}px;min-height:${this.minHeight}px;overflow:hidden\"\n\t\t\t@load=${this.onLoad}\n\t\t></iframe>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-iframe': SchmancyIframe\n\t}\n}\n"],"mappings":"kMAKA,IAwBe,EAAA,cAA6B,EAAA,EAAgB,EAAA,GAAG;;;;;;;;2CAU3B,GAAA,KAAA,IAGD,GAAA,KAAA,QArCV;;;;;;;;;;6EAAA,KAAA,QA2Cc,iCAAA,KAAA,UAGE,GAAA,KAAA,QAEb,GAAA,KAAA,QACT,GAElB,WAAqB,EAAA,EAChB,EAAQ,IAAI,OAAA,EAAW,EAAQ,IAAI,MAAA,EAAU,EAAQ,IAAI,UAAA,IAC5D,KAAK,QAAU,KAAK,KAAO,KAAK,aAAA,CAAgB,GAChD,KAAK,QAAU,KAAK,WAItB,aAAA,CAEC,MAAO,0JADQ,KAAK,IAAM,GAAG,KAAK,QAAA,IAAY,KAAK,MAAQ,KAAK,QAAA,uBAI3B,KAAK,KAAA,gBAG3C,OAAe,EAAA,CACd,IAAM,EAAS,EAAE,OACjB,GAAA,CACC,IAAM,EAAM,EAAO,gBACnB,GAAA,CAAK,EAAK,OACV,KAAK,QAAU,KAAK,IAAI,EAAI,gBAAgB,aAAc,KAAK,UAAA,MAAA,CAE/D,KAAK,QAAU,KAAK,IAAI,IAAK,KAAK,UAAA,EAIpC,QAAA,CACC,OAAK,KAAK,KACH,EAAA,IAAI;aACA,KAAK,QAAA;aACL,KAAK,QAAA;mBACC,KAAK,QAAA,gBAAwB,KAAK,UAAA;WAC1C,KAAK,OAAA;cALS,EAAA,IAAI,KAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UA5ClB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,OAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,MAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,UAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,UAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,YAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,QAAA,CAAA,CAEnB,EAAA,UAAA,UAAA,IAAA,GAAA,CAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAzBM,kBAAA,CAAA,CAAkB,EAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"iframe-C7sHg7RC.cjs","names":[],"sources":["../src/iframe/iframe.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { css, html, PropertyValues } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\n/** Sensible document reset for iframe content — font, spacing, word-wrap */\nconst DEFAULT_BASE_CSS = `html,body{margin:0;padding:0;overflow:hidden;background:#fff;color:#1a1a1a;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;font-size:14px;line-height:1.6;word-wrap:break-word;overflow-wrap:break-word}\nbody{padding:16px}\np{margin:0 0 1em}p:last-child{margin-bottom:0}\nul,ol{margin:0 0 1em;padding-left:1.5em}li{margin-bottom:.25em}\nh1,h2,h3,h4{margin:0 0 .5em;line-height:1.3}h1{font-size:1.5em}h2{font-size:1.25em}h3{font-size:1.1em}h4{font-size:1em}\nhr{border:none;border-top:1px solid #dadce0;margin:1em 0}\nimg{max-width:100%;height:auto}\ntable{border-collapse:collapse;max-width:100%}td,th{padding:4px 8px;border:1px solid #dadce0}\nblockquote{margin:0 0 1em;padding:.5em 0 .5em 1em;border-left:3px solid #dadce0;color:#5f6368}\npre{background:#f5f5f5;padding:.75em;border-radius:4px;overflow-x:auto;font-size:.9em}\ncode{background:#f5f5f5;padding:.1em .3em;border-radius:3px;font-size:.9em}`\n\n/**\n * Renders an HTML fragment inside a sandboxed, auto-sizing iframe.\n *\n * @slot - (none)\n * @fires load — native iframe load event\n *\n * @example\n * ```html\n * <schmancy-iframe .html=${bodyHtml} .css=${extraStyles}></schmancy-iframe>\n * ```\n */\n@customElement('schmancy-iframe')\nexport default class SchmancyIframe extends TailwindElement(css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\tiframe {\n\t\tborder: 0;\n\t\twidth: 100%;\n\t}\n`) {\n\t/** HTML body fragment to render inside the iframe */\n\t@property({ type: String }) html = ''\n\n\t/** Additional CSS injected after the base styles (consumer-specific) */\n\t@property({ type: String }) css = ''\n\n\t/** Base document CSS (font, spacing, resets). Override for fully custom styling */\n\t@property({ type: String }) baseCss = DEFAULT_BASE_CSS\n\n\t/** iframe sandbox attribute */\n\t@property({ type: String }) sandbox = 'allow-same-origin allow-popups'\n\n\t/** Minimum height in pixels */\n\t@property({ type: Number }) minHeight = 60\n\n\t@state() private _height = 60\n\tprivate _srcdoc = ''\n\n\tprotected willUpdate(changed: PropertyValues) {\n\t\tif (changed.has('html') || changed.has('css') || changed.has('baseCss')) {\n\t\t\tthis._srcdoc = this.html ? this.buildSrcdoc() : ''\n\t\t\tthis._height = this.minHeight\n\t\t}\n\t}\n\n\tprivate buildSrcdoc(): string {\n\t\tconst styles = this.css ? `${this.baseCss}\\n${this.css}` : this.baseCss\n\t\treturn `<!DOCTYPE html><html><head>\n<meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<base target=\"_blank\">\n<style>${styles}</style></head><body>${this.html}</body></html>`\n\t}\n\n\tprivate onLoad(e: Event) {\n\t\tconst iframe = e.target as HTMLIFrameElement\n\t\ttry {\n\t\t\tconst doc = iframe.contentDocument\n\t\t\tif (!doc) return\n\t\t\tthis._height = Math.max(doc.documentElement.scrollHeight, this.minHeight)\n\t\t} catch {\n\t\t\tthis._height = Math.max(200, this.minHeight)\n\t\t}\n\t}\n\n\tprotected render() {\n\t\tif (!this.html) return html``\n\t\treturn html`<iframe\n\t\t\t.srcdoc=${this._srcdoc}\n\t\t\tsandbox=${this.sandbox}\n\t\t\tstyle=\"height:${this._height}px;min-height:${this.minHeight}px;overflow:hidden\"\n\t\t\t@load=${this.onLoad}\n\t\t></iframe>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-iframe': SchmancyIframe\n\t}\n}\n"],"mappings":"kMAKA,IAwBe,EAAA,cAA6B,EAAA,EAAgB,EAAA,GAAG;;;;;;;;2CAU3B,GAAA,KAAA,IAGD,GAAA,KAAA,QArCV;;;;;;;;;;6EAAA,KAAA,QA2Cc,iCAAA,KAAA,UAGE,GAAA,KAAA,QAEb,GAAA,KAAA,QACT,GAElB,WAAqB,EAAA,EAChB,EAAQ,IAAI,OAAA,EAAW,EAAQ,IAAI,MAAA,EAAU,EAAQ,IAAI,UAAA,IAC5D,KAAK,QAAU,KAAK,KAAO,KAAK,aAAA,CAAgB,GAChD,KAAK,QAAU,KAAK,WAItB,aAAA,CAEC,MAAO,0JADQ,KAAK,IAAM,GAAG,KAAK,QAAA,IAAY,KAAK,MAAQ,KAAK,QAAA,uBAI3B,KAAK,KAAA,gBAG3C,OAAe,EAAA,CACd,IAAM,EAAS,EAAE,OACjB,GAAA,CACC,IAAM,EAAM,EAAO,gBACnB,GAAA,CAAK,EAAK,OACV,KAAK,QAAU,KAAK,IAAI,EAAI,gBAAgB,aAAc,KAAK,UAAA,MAAA,CAE/D,KAAK,QAAU,KAAK,IAAI,IAAK,KAAK,UAAA,EAIpC,QAAA,CACC,OAAK,KAAK,KACH,EAAA,IAAI;aACA,KAAK,QAAA;aACL,KAAK,QAAA;mBACC,KAAK,QAAA,gBAAwB,KAAK,UAAA;WAC1C,KAAK,OAAA;cALS,EAAA,IAAI,KAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UA5ClB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,OAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,MAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,UAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,UAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,YAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,QAAA,CAAA,CAEnB,EAAA,UAAA,UAAA,IAAA,GAAA,CAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAzBM,kBAAA,CAAA,CAAkB,EAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA"}