@mhmo91/schmancy 0.9.3 → 0.9.4

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 (369) hide show
  1. package/ai/INDEX.md +53 -302
  2. package/ai/area.md +91 -165
  3. package/ai/mailbox.md +1 -1
  4. package/ai/mixins.md +37 -139
  5. package/ai/store.md +70 -136
  6. package/dist/ai/INDEX.md +53 -302
  7. package/dist/ai/area.md +91 -165
  8. package/dist/ai/mailbox.md +1 -1
  9. package/dist/ai/mixins.md +37 -139
  10. package/dist/ai/store.md +70 -136
  11. package/dist/{area-CC8fUnra.js → area-CRoGqD_u.js} +2 -2
  12. package/dist/area-CRoGqD_u.js.map +1 -0
  13. package/dist/{area-wnWUAHEn.cjs → area-JPykB7A9.cjs} +1 -1
  14. package/dist/area-JPykB7A9.cjs.map +1 -0
  15. package/dist/area.cjs +1 -1
  16. package/dist/area.js +1 -1
  17. package/dist/{autocomplete-B2Z3WK_7.cjs → autocomplete-5rVhbieU.cjs} +1 -1
  18. package/dist/{autocomplete-B2Z3WK_7.cjs.map → autocomplete-5rVhbieU.cjs.map} +1 -1
  19. package/dist/{autocomplete-CJ7YgtKN.js → autocomplete-BllPQwr8.js} +3 -3
  20. package/dist/{autocomplete-CJ7YgtKN.js.map → autocomplete-BllPQwr8.js.map} +1 -1
  21. package/dist/autocomplete.cjs +1 -1
  22. package/dist/autocomplete.js +1 -1
  23. package/dist/badge.cjs +1 -1
  24. package/dist/badge.js +1 -1
  25. package/dist/{boat-C9eU6NO-.js → boat-BDTQ-du9.js} +2 -2
  26. package/dist/{boat-C9eU6NO-.js.map → boat-BDTQ-du9.js.map} +1 -1
  27. package/dist/{boat-B57_4TzJ.cjs → boat-DYEAZ8Qj.cjs} +1 -1
  28. package/dist/{boat-B57_4TzJ.cjs.map → boat-DYEAZ8Qj.cjs.map} +1 -1
  29. package/dist/boat.cjs +1 -1
  30. package/dist/boat.js +1 -1
  31. package/dist/{busy-CGZXy0h-.js → busy-ChDAeaKF.js} +1 -1
  32. package/dist/{busy-CGZXy0h-.js.map → busy-ChDAeaKF.js.map} +1 -1
  33. package/dist/{busy--6oimtop.cjs → busy-Dj7Xn0Z0.cjs} +1 -1
  34. package/dist/{busy--6oimtop.cjs.map → busy-Dj7Xn0Z0.cjs.map} +1 -1
  35. package/dist/busy.cjs +1 -1
  36. package/dist/busy.js +1 -1
  37. package/dist/button.cjs +1 -1
  38. package/dist/button.js +2 -2
  39. package/dist/{card-BGJ0Hb1O.cjs → card-BvPWVEJX.cjs} +1 -1
  40. package/dist/{card-BGJ0Hb1O.cjs.map → card-BvPWVEJX.cjs.map} +1 -1
  41. package/dist/{card-C-ee-l5O.js → card-DZFPRPqs.js} +1 -1
  42. package/dist/{card-C-ee-l5O.js.map → card-DZFPRPqs.js.map} +1 -1
  43. package/dist/card.cjs +1 -1
  44. package/dist/card.js +1 -1
  45. package/dist/charts.cjs +1 -1
  46. package/dist/charts.js +2 -2
  47. package/dist/{checkbox-DuYaKoDZ.cjs → checkbox-BC_37rsG.cjs} +1 -1
  48. package/dist/{checkbox-DuYaKoDZ.cjs.map → checkbox-BC_37rsG.cjs.map} +1 -1
  49. package/dist/{checkbox-FRcorDrD.js → checkbox-GSSjqo6w.js} +1 -1
  50. package/dist/{checkbox-FRcorDrD.js.map → checkbox-GSSjqo6w.js.map} +1 -1
  51. package/dist/checkbox.cjs +1 -1
  52. package/dist/checkbox.js +1 -1
  53. package/dist/{chips-BpA0A-qr.cjs → chips-B19XS8Xc.cjs} +1 -1
  54. package/dist/{chips-BpA0A-qr.cjs.map → chips-B19XS8Xc.cjs.map} +1 -1
  55. package/dist/{chips-CyzNbKJD.js → chips-B9oAEfE_.js} +3 -3
  56. package/dist/{chips-CyzNbKJD.js.map → chips-B9oAEfE_.js.map} +1 -1
  57. package/dist/chips.cjs +1 -1
  58. package/dist/chips.js +2 -2
  59. package/dist/{code-highlight-C7O9ltXm.js → code-highlight-DCk5lJY-.js} +1 -1
  60. package/dist/{code-highlight-C7O9ltXm.js.map → code-highlight-DCk5lJY-.js.map} +1 -1
  61. package/dist/{code-highlight-DsBdSQBG.cjs → code-highlight-fSLrlgOb.cjs} +1 -1
  62. package/dist/{code-highlight-DsBdSQBG.cjs.map → code-highlight-fSLrlgOb.cjs.map} +1 -1
  63. package/dist/code-highlight.cjs +1 -1
  64. package/dist/code-highlight.js +1 -1
  65. package/dist/{components-CkMvOiTR.js → components-COsM6sJZ.js} +2 -2
  66. package/dist/{components-CkMvOiTR.js.map → components-COsM6sJZ.js.map} +1 -1
  67. package/dist/{components-dDI3xeIf.cjs → components-CyD6a7gQ.cjs} +1 -1
  68. package/dist/{components-dDI3xeIf.cjs.map → components-CyD6a7gQ.cjs.map} +1 -1
  69. package/dist/components.cjs +1 -1
  70. package/dist/components.js +1 -1
  71. package/dist/connectivity.cjs +1 -1
  72. package/dist/connectivity.js +1 -1
  73. package/dist/content-drawer.cjs +1 -1
  74. package/dist/content-drawer.js +1 -1
  75. package/dist/{date-range-BrN_Bs6_.js → date-range-Sfyco9-n.js} +3 -3
  76. package/dist/{date-range-BrN_Bs6_.js.map → date-range-Sfyco9-n.js.map} +1 -1
  77. package/dist/{date-range-70zhLUKE.cjs → date-range-ZAaQB22I.cjs} +1 -1
  78. package/dist/{date-range-70zhLUKE.cjs.map → date-range-ZAaQB22I.cjs.map} +1 -1
  79. package/dist/{date-range-inline-Cp294DxR.js → date-range-inline-Bl8qbiQF.js} +1 -1
  80. package/dist/{date-range-inline-Cp294DxR.js.map → date-range-inline-Bl8qbiQF.js.map} +1 -1
  81. package/dist/{date-range-inline-CPzD-tIv.cjs → date-range-inline-m7nLjOMI.cjs} +1 -1
  82. package/dist/{date-range-inline-CPzD-tIv.cjs.map → date-range-inline-m7nLjOMI.cjs.map} +1 -1
  83. package/dist/date-range-inline.cjs +1 -1
  84. package/dist/date-range-inline.js +1 -1
  85. package/dist/date-range.cjs +1 -1
  86. package/dist/date-range.js +1 -1
  87. package/dist/{delay-COcAkBqB.cjs → delay-7boauN6N.cjs} +1 -1
  88. package/dist/{delay-COcAkBqB.cjs.map → delay-7boauN6N.cjs.map} +1 -1
  89. package/dist/{delay-IV0Swce2.js → delay-CgX6m0HN.js} +3 -3
  90. package/dist/{delay-IV0Swce2.js.map → delay-CgX6m0HN.js.map} +1 -1
  91. package/dist/delay.cjs +1 -1
  92. package/dist/delay.js +1 -1
  93. package/dist/{details-DgWkPqmt.cjs → details-BHnk8l4q.cjs} +1 -1
  94. package/dist/{details-DgWkPqmt.cjs.map → details-BHnk8l4q.cjs.map} +1 -1
  95. package/dist/{details-CuKmr3Qw.js → details-BPkUg8Cq.js} +2 -2
  96. package/dist/{details-CuKmr3Qw.js.map → details-BPkUg8Cq.js.map} +1 -1
  97. package/dist/details.cjs +1 -1
  98. package/dist/details.js +1 -1
  99. package/dist/dialog.cjs +1 -1
  100. package/dist/dialog.js +2 -2
  101. package/dist/directives.cjs.map +1 -1
  102. package/dist/directives.js.map +1 -1
  103. package/dist/discovery.cjs.map +1 -1
  104. package/dist/discovery.js.map +1 -1
  105. package/dist/{divider-BWoUbfgZ.js → divider-CW9a7MMj.js} +2 -2
  106. package/dist/{divider-BWoUbfgZ.js.map → divider-CW9a7MMj.js.map} +1 -1
  107. package/dist/{divider-BghtrMbn.cjs → divider-_khrhrZo.cjs} +1 -1
  108. package/dist/{divider-BghtrMbn.cjs.map → divider-_khrhrZo.cjs.map} +1 -1
  109. package/dist/divider.cjs +1 -1
  110. package/dist/divider.js +1 -1
  111. package/dist/dropdown.cjs +1 -1
  112. package/dist/dropdown.js +2 -2
  113. package/dist/{expand-XyDE5SsO.cjs → expand-Cp7-PH8b.cjs} +1 -1
  114. package/dist/{expand-XyDE5SsO.cjs.map → expand-Cp7-PH8b.cjs.map} +1 -1
  115. package/dist/{expand-CJU9m4ga.js → expand-iQ7EOMP7.js} +3 -3
  116. package/dist/{expand-CJU9m4ga.js.map → expand-iQ7EOMP7.js.map} +1 -1
  117. package/dist/expand.cjs +1 -1
  118. package/dist/expand.js +1 -1
  119. package/dist/{extra-CsrRKKqE.cjs → extra-IKAiJJhv.cjs} +1 -1
  120. package/dist/{extra-CsrRKKqE.cjs.map → extra-IKAiJJhv.cjs.map} +1 -1
  121. package/dist/{extra-BxXFmW1w.js → extra-wEpvEFbK.js} +2 -2
  122. package/dist/{extra-BxXFmW1w.js.map → extra-wEpvEFbK.js.map} +1 -1
  123. package/dist/extra.cjs +1 -1
  124. package/dist/extra.js +1 -1
  125. package/dist/{float-BD86t_NU.js → float-BQ_urmMs.js} +2 -2
  126. package/dist/{float-BD86t_NU.js.map → float-BQ_urmMs.js.map} +1 -1
  127. package/dist/{float-DBv1FINW.cjs → float-D5rNC82i.cjs} +1 -1
  128. package/dist/{float-DBv1FINW.cjs.map → float-D5rNC82i.cjs.map} +1 -1
  129. package/dist/float.cjs +1 -1
  130. package/dist/float.js +1 -1
  131. package/dist/{form-D0bIeDWT.cjs → form-BqN1AGFj.cjs} +1 -1
  132. package/dist/{form-D0bIeDWT.cjs.map → form-BqN1AGFj.cjs.map} +1 -1
  133. package/dist/{form-Cp5-I_ZV.js → form-CajC5HnO.js} +1 -1
  134. package/dist/{form-Cp5-I_ZV.js.map → form-CajC5HnO.js.map} +1 -1
  135. package/dist/form.cjs +1 -1
  136. package/dist/form.js +1 -1
  137. package/dist/{icons-D8w_20mO.cjs → icons-B57_93VV.cjs} +1 -1
  138. package/dist/{icons-D8w_20mO.cjs.map → icons-B57_93VV.cjs.map} +1 -1
  139. package/dist/{icons-BpU0_l92.js → icons-BDqiGXrO.js} +1 -1
  140. package/dist/{icons-BpU0_l92.js.map → icons-BDqiGXrO.js.map} +1 -1
  141. package/dist/icons.cjs +1 -1
  142. package/dist/icons.js +1 -1
  143. package/dist/{iframe-BjwxA2Pg.cjs → iframe-DNHL3GIk.cjs} +1 -1
  144. package/dist/{iframe-BjwxA2Pg.cjs.map → iframe-DNHL3GIk.cjs.map} +1 -1
  145. package/dist/{iframe-tY1GY5g1.js → iframe-WnWPIrBG.js} +1 -1
  146. package/dist/{iframe-tY1GY5g1.js.map → iframe-WnWPIrBG.js.map} +1 -1
  147. package/dist/iframe.cjs +1 -1
  148. package/dist/iframe.js +1 -1
  149. package/dist/index.cjs +1 -1
  150. package/dist/index.js +33 -33
  151. package/dist/{input-BwxwognS.cjs → input-BiSrTcrR.cjs} +1 -1
  152. package/dist/{input-BwxwognS.cjs.map → input-BiSrTcrR.cjs.map} +1 -1
  153. package/dist/{input-BnfTpRN9.js → input-VaXHFrRn.js} +1 -1
  154. package/dist/{input-BnfTpRN9.js.map → input-VaXHFrRn.js.map} +1 -1
  155. package/dist/{input-chip-MjOwX5EY.cjs → input-chip-Dy-AiP55.cjs} +1 -1
  156. package/dist/{input-chip-MjOwX5EY.cjs.map → input-chip-Dy-AiP55.cjs.map} +1 -1
  157. package/dist/{input-chip-CkM2aYmO.js → input-chip-QejNcRnS.js} +1 -1
  158. package/dist/{input-chip-CkM2aYmO.js.map → input-chip-QejNcRnS.js.map} +1 -1
  159. package/dist/input.cjs +1 -1
  160. package/dist/input.js +1 -1
  161. package/dist/json.cjs +1 -1
  162. package/dist/json.js +2 -2
  163. package/dist/{layout-CJSlZlFL.js → layout-CnsXeCAy.js} +2 -2
  164. package/dist/{layout-CJSlZlFL.js.map → layout-CnsXeCAy.js.map} +1 -1
  165. package/dist/{layout-BV0EeyUS.cjs → layout-DNYG3phx.cjs} +1 -1
  166. package/dist/{layout-BV0EeyUS.cjs.map → layout-DNYG3phx.cjs.map} +1 -1
  167. package/dist/layout.cjs +1 -1
  168. package/dist/layout.js +2 -2
  169. package/dist/{lightbox-groqGmJH.js → lightbox-BrI1Z31s.js} +2 -2
  170. package/dist/{lightbox-groqGmJH.js.map → lightbox-BrI1Z31s.js.map} +1 -1
  171. package/dist/{lightbox-CpNMZHZW.cjs → lightbox-CmACf0t5.cjs} +1 -1
  172. package/dist/{lightbox-CpNMZHZW.cjs.map → lightbox-CmACf0t5.cjs.map} +1 -1
  173. package/dist/lightbox.cjs +1 -1
  174. package/dist/lightbox.js +1 -1
  175. package/dist/{list-DzkqT_r-.js → list-Cm-jjXxM.js} +2 -2
  176. package/dist/{list-DzkqT_r-.js.map → list-Cm-jjXxM.js.map} +1 -1
  177. package/dist/{list-CyHd0Zc2.cjs → list-swIL9VDv.cjs} +1 -1
  178. package/dist/{list-CyHd0Zc2.cjs.map → list-swIL9VDv.cjs.map} +1 -1
  179. package/dist/list.cjs +1 -1
  180. package/dist/list.js +1 -1
  181. package/dist/{litElement.mixin-BG6_-nYX.cjs → litElement.mixin-3llHwB-8.cjs} +1 -1
  182. package/dist/{litElement.mixin-BG6_-nYX.cjs.map → litElement.mixin-3llHwB-8.cjs.map} +1 -1
  183. package/dist/{litElement.mixin-Dm-4L8zL.js → litElement.mixin-6jJYHCrZ.js} +1 -1
  184. package/dist/{litElement.mixin-Dm-4L8zL.js.map → litElement.mixin-6jJYHCrZ.js.map} +1 -1
  185. package/dist/{mailbox-BcqnXYVP.js → mailbox-BuvsVaAQ.js} +4 -4
  186. package/dist/{mailbox-BcqnXYVP.js.map → mailbox-BuvsVaAQ.js.map} +1 -1
  187. package/dist/{mailbox-C5eYTd7p.cjs → mailbox-D6LkQcN5.cjs} +1 -1
  188. package/dist/{mailbox-C5eYTd7p.cjs.map → mailbox-D6LkQcN5.cjs.map} +1 -1
  189. package/dist/mailbox.cjs +1 -1
  190. package/dist/mailbox.js +1 -1
  191. package/dist/{map-C0o1PgLE.js → map-CQiKAxC3.js} +1 -1
  192. package/dist/{map-C0o1PgLE.js.map → map-CQiKAxC3.js.map} +1 -1
  193. package/dist/{map-BncheFt5.cjs → map-D5NN4VET.cjs} +1 -1
  194. package/dist/{map-BncheFt5.cjs.map → map-D5NN4VET.cjs.map} +1 -1
  195. package/dist/map.cjs +1 -1
  196. package/dist/map.js +1 -1
  197. package/dist/{menu-uwqlQbLd.js → menu-C1x04YZw.js} +2 -2
  198. package/dist/{menu-uwqlQbLd.js.map → menu-C1x04YZw.js.map} +1 -1
  199. package/dist/{menu-yXzwJZFf.cjs → menu-CkgMO9K5.cjs} +1 -1
  200. package/dist/{menu-yXzwJZFf.cjs.map → menu-CkgMO9K5.cjs.map} +1 -1
  201. package/dist/menu.cjs +1 -1
  202. package/dist/menu.js +1 -1
  203. package/dist/mixins.cjs +1 -1
  204. package/dist/mixins.js +3 -3
  205. package/dist/nav-drawer.cjs +1 -1
  206. package/dist/nav-drawer.js +1 -1
  207. package/dist/navigation-bar.cjs +1 -1
  208. package/dist/navigation-bar.js +1 -1
  209. package/dist/navigation-rail.cjs +1 -1
  210. package/dist/navigation-rail.js +2 -2
  211. package/dist/{notification-DzYT4deA.js → notification-BnBgxjF-.js} +3 -3
  212. package/dist/{notification-DzYT4deA.js.map → notification-BnBgxjF-.js.map} +1 -1
  213. package/dist/{notification-BjwTfLAl.cjs → notification-CZFEhWxc.cjs} +1 -1
  214. package/dist/{notification-BjwTfLAl.cjs.map → notification-CZFEhWxc.cjs.map} +1 -1
  215. package/dist/notification.cjs +1 -1
  216. package/dist/notification.js +1 -1
  217. package/dist/{option-BJsD3u2D.cjs → option-BrxCVwSx.cjs} +1 -1
  218. package/dist/{option-BJsD3u2D.cjs.map → option-BrxCVwSx.cjs.map} +1 -1
  219. package/dist/{option-JFHxgiYl.js → option-DBO8xZwd.js} +1 -1
  220. package/dist/{option-JFHxgiYl.js.map → option-DBO8xZwd.js.map} +1 -1
  221. package/dist/option.cjs +1 -1
  222. package/dist/option.js +1 -1
  223. package/dist/page.cjs +1 -1
  224. package/dist/page.js +3 -3
  225. package/dist/{progress-BoRmyGAa.cjs → progress-Db2e4_Zd.cjs} +1 -1
  226. package/dist/{progress-BoRmyGAa.cjs.map → progress-Db2e4_Zd.cjs.map} +1 -1
  227. package/dist/{progress-BUh5WBqx.js → progress-DeiHxXo7.js} +2 -2
  228. package/dist/{progress-BUh5WBqx.js.map → progress-DeiHxXo7.js.map} +1 -1
  229. package/dist/progress.cjs +1 -1
  230. package/dist/progress.js +1 -1
  231. package/dist/{provide-8MrDz_qX.js → provide-C1aQhxYo.js} +1 -1
  232. package/dist/{provide-8MrDz_qX.js.map → provide-C1aQhxYo.js.map} +1 -1
  233. package/dist/{provide-CDkxgjHb.cjs → provide-DHnhQtCH.cjs} +1 -1
  234. package/dist/{provide-CDkxgjHb.cjs.map → provide-DHnhQtCH.cjs.map} +1 -1
  235. package/dist/qr-scanner.cjs +1 -1
  236. package/dist/qr-scanner.js +2 -2
  237. package/dist/{radio-group-rhrvhB5X.cjs → radio-group-Cspwd-Vw.cjs} +1 -1
  238. package/dist/{radio-group-rhrvhB5X.cjs.map → radio-group-Cspwd-Vw.cjs.map} +1 -1
  239. package/dist/{radio-group-DbOWUPhi.js → radio-group-zSO0AkJf.js} +1 -1
  240. package/dist/{radio-group-DbOWUPhi.js.map → radio-group-zSO0AkJf.js.map} +1 -1
  241. package/dist/radio-group.cjs +1 -1
  242. package/dist/radio-group.js +1 -1
  243. package/dist/range.cjs +1 -1
  244. package/dist/range.js +1 -1
  245. package/dist/{scroll-BE9W9PF2.cjs → scroll-QMCmbbDv.cjs} +1 -1
  246. package/dist/{scroll-BE9W9PF2.cjs.map → scroll-QMCmbbDv.cjs.map} +1 -1
  247. package/dist/{scroll-qGks1R0k.js → scroll-cBDzye64.js} +1 -1
  248. package/dist/{scroll-qGks1R0k.js.map → scroll-cBDzye64.js.map} +1 -1
  249. package/dist/{select-DXU2kzg4.cjs → select-Ct37l3lg.cjs} +1 -1
  250. package/dist/{select-DXU2kzg4.cjs.map → select-Ct37l3lg.cjs.map} +1 -1
  251. package/dist/{select-D9sgBRjU.js → select-c6HbWvKP.js} +2 -2
  252. package/dist/{select-D9sgBRjU.js.map → select-c6HbWvKP.js.map} +1 -1
  253. package/dist/select.cjs +1 -1
  254. package/dist/select.js +1 -1
  255. package/dist/{sheet-CIxCCJ3H.js → sheet-BMXcUiIm.js} +4 -4
  256. package/dist/{sheet-CIxCCJ3H.js.map → sheet-BMXcUiIm.js.map} +1 -1
  257. package/dist/{sheet-CeX6BbNp.cjs → sheet-CQec-bCV.cjs} +1 -1
  258. package/dist/{sheet-CeX6BbNp.cjs.map → sheet-CQec-bCV.cjs.map} +1 -1
  259. package/dist/sheet.cjs +1 -1
  260. package/dist/sheet.js +2 -2
  261. package/dist/{sheet.service-CAB7weBc.js → sheet.service-BcPV3Du4.js} +1 -1
  262. package/dist/{sheet.service-CAB7weBc.js.map → sheet.service-BcPV3Du4.js.map} +1 -1
  263. package/dist/{sheet.service-DPAp7E3x.cjs → sheet.service-Dumvr1HT.cjs} +1 -1
  264. package/dist/{sheet.service-DPAp7E3x.cjs.map → sheet.service-Dumvr1HT.cjs.map} +1 -1
  265. package/dist/slider.cjs +1 -1
  266. package/dist/slider.js +2 -2
  267. package/dist/{src-CbO5kJ2O.js → src-BLngW2bl.js} +42 -42
  268. package/dist/{src-CbO5kJ2O.js.map → src-BLngW2bl.js.map} +1 -1
  269. package/dist/{src-SraDxEeg.cjs → src-BtQVyqMy.cjs} +1 -1
  270. package/dist/{src-SraDxEeg.cjs.map → src-BtQVyqMy.cjs.map} +1 -1
  271. package/dist/steps.cjs +1 -1
  272. package/dist/steps.js +3 -3
  273. package/dist/{surface-DuH0pm2v.cjs → surface-BjKZoJxK.cjs} +1 -1
  274. package/dist/{surface-DuH0pm2v.cjs.map → surface-BjKZoJxK.cjs.map} +1 -1
  275. package/dist/{surface-eN_Jy2MJ.js → surface-pK8hME5c.js} +3 -3
  276. package/dist/{surface-eN_Jy2MJ.js.map → surface-pK8hME5c.js.map} +1 -1
  277. package/dist/surface.cjs +1 -1
  278. package/dist/surface.js +1 -1
  279. package/dist/{surface.mixin-CIXgN6iw.cjs → surface.mixin-C5sDI1-_.cjs} +1 -1
  280. package/dist/{surface.mixin-CIXgN6iw.cjs.map → surface.mixin-C5sDI1-_.cjs.map} +1 -1
  281. package/dist/{surface.mixin-D9jv1sKG.js → surface.mixin-CBNRpJum.js} +1 -1
  282. package/dist/{surface.mixin-D9jv1sKG.js.map → surface.mixin-CBNRpJum.js.map} +1 -1
  283. package/dist/{table-Dg_tUGB_.js → table-BXIHX9h4.js} +2 -2
  284. package/dist/{table-Dg_tUGB_.js.map → table-BXIHX9h4.js.map} +1 -1
  285. package/dist/{table-C9rRQJEB.cjs → table-CiqgZzSd.cjs} +1 -1
  286. package/dist/{table-C9rRQJEB.cjs.map → table-CiqgZzSd.cjs.map} +1 -1
  287. package/dist/table.cjs +1 -1
  288. package/dist/table.js +1 -1
  289. package/dist/{tabs-soTL-x4G.cjs → tabs-CKa-W4qA.cjs} +1 -1
  290. package/dist/{tabs-soTL-x4G.cjs.map → tabs-CKa-W4qA.cjs.map} +1 -1
  291. package/dist/{tabs-BbFC9omR.js → tabs-nbV5eblZ.js} +2 -2
  292. package/dist/{tabs-BbFC9omR.js.map → tabs-nbV5eblZ.js.map} +1 -1
  293. package/dist/tabs.cjs +1 -1
  294. package/dist/tabs.js +1 -1
  295. package/dist/tailwind.mixin-BCJOOX1_.js +225 -0
  296. package/dist/tailwind.mixin-BCJOOX1_.js.map +1 -0
  297. package/dist/tailwind.mixin-BF1Huas7.cjs +2 -0
  298. package/dist/tailwind.mixin-BF1Huas7.cjs.map +1 -0
  299. package/dist/teleport.cjs +1 -1
  300. package/dist/teleport.js +1 -1
  301. package/dist/{textarea-DaRUJ0ri.cjs → textarea-Cp1ZE60O.cjs} +1 -1
  302. package/dist/{textarea-DaRUJ0ri.cjs.map → textarea-Cp1ZE60O.cjs.map} +1 -1
  303. package/dist/{textarea-hChvHbNM.js → textarea-D7q8exMg.js} +1 -1
  304. package/dist/{textarea-hChvHbNM.js.map → textarea-D7q8exMg.js.map} +1 -1
  305. package/dist/textarea.cjs +1 -1
  306. package/dist/textarea.js +1 -1
  307. package/dist/{theme-ZYH2MqX9.cjs → theme-Da4SPq9X.cjs} +1 -1
  308. package/dist/{theme-ZYH2MqX9.cjs.map → theme-Da4SPq9X.cjs.map} +1 -1
  309. package/dist/{theme-B0M8Hlyo.js → theme-_VPV6Bxh.js} +3 -3
  310. package/dist/{theme-B0M8Hlyo.js.map → theme-_VPV6Bxh.js.map} +1 -1
  311. package/dist/{theme-button-BtlX_Zgd.js → theme-button--sX8A-m1.js} +1 -1
  312. package/dist/{theme-button-BtlX_Zgd.js.map → theme-button--sX8A-m1.js.map} +1 -1
  313. package/dist/{theme-button-Dvqg-rE_.cjs → theme-button-Ci8VQ7KW.cjs} +1 -1
  314. package/dist/{theme-button-Dvqg-rE_.cjs.map → theme-button-Ci8VQ7KW.cjs.map} +1 -1
  315. package/dist/theme-button.cjs +1 -1
  316. package/dist/theme-button.js +1 -1
  317. package/dist/theme.cjs +1 -1
  318. package/dist/theme.js +2 -2
  319. package/dist/tooltip.cjs +1 -1
  320. package/dist/tooltip.js +1 -1
  321. package/dist/tree.cjs +1 -1
  322. package/dist/tree.js +1 -1
  323. package/dist/{typewriter-Cf9f2bdx.cjs → typewriter-B2TnHPjw.cjs} +1 -1
  324. package/dist/{typewriter-Cf9f2bdx.cjs.map → typewriter-B2TnHPjw.cjs.map} +1 -1
  325. package/dist/{typewriter-CCel8Nta.js → typewriter-BrZNa8T-.js} +3 -3
  326. package/dist/{typewriter-CCel8Nta.js.map → typewriter-BrZNa8T-.js.map} +1 -1
  327. package/dist/typewriter.cjs +1 -1
  328. package/dist/typewriter.js +1 -1
  329. package/dist/typography.cjs +1 -1
  330. package/dist/typography.js +1 -1
  331. package/dist/{window-CbgdwOZD.js → window-CM1ycigo.js} +2 -2
  332. package/dist/{window-CbgdwOZD.js.map → window-CM1ycigo.js.map} +1 -1
  333. package/dist/{window-B9_14c12.cjs → window-Uii13x_r.cjs} +1 -1
  334. package/dist/{window-B9_14c12.cjs.map → window-Uii13x_r.cjs.map} +1 -1
  335. package/dist/window.cjs +1 -1
  336. package/dist/window.js +1 -1
  337. package/mixins/baseElement.ts +1 -1
  338. package/mixins/discovery.service.ts +1 -1
  339. package/package.json +1 -2
  340. package/src/area/area.service.ts +1 -1
  341. package/src/area/router.types.ts +1 -1
  342. package/src/directives/animate-text.ts +1 -1
  343. package/src/discovery/discovery.service.ts +1 -1
  344. package/src/input/input.ts +1 -1
  345. package/src/mailbox/README.md +7 -10
  346. package/src/mailbox/types.ts +0 -1
  347. package/types/mixins/discovery.service.d.ts +1 -1
  348. package/types/src/discovery/discovery.service.d.ts +1 -1
  349. package/types/src/mailbox/types.d.ts +0 -1
  350. package/dist/area-CC8fUnra.js.map +0 -1
  351. package/dist/area-wnWUAHEn.cjs.map +0 -1
  352. package/dist/tailwind.mixin-BIVhjNvD.js +0 -225
  353. package/dist/tailwind.mixin-BIVhjNvD.js.map +0 -1
  354. package/dist/tailwind.mixin-DSuEu-y3.cjs +0 -2
  355. package/dist/tailwind.mixin-DSuEu-y3.cjs.map +0 -1
  356. package/src/area/readme.md +0 -338
  357. package/src/area/router-guide.md +0 -360
  358. package/src/autocomplete/README.md +0 -485
  359. package/src/content-drawer/readme.md +0 -709
  360. package/src/icons/readme.md +0 -37
  361. package/src/list/readme.md +0 -62
  362. package/src/radio-group/readme.md +0 -315
  363. package/src/select/README.md +0 -405
  364. package/src/tabs/Readme.md +0 -397
  365. package/src/teleport/readme.md +0 -91
  366. package/src/tree/README.md +0 -59
  367. package/src/typewriter/IMPROVEMENTS.md +0 -174
  368. package/src/typewriter/QUICK_REFERENCE.md +0 -166
  369. package/src/typewriter/test-typewriter.html +0 -97
package/dist/extra.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./extra-CsrRKKqE.cjs`);Object.defineProperty(exports,`SchmancyCountriesSelect`,{enumerable:!0,get:function(){return e.n}}),Object.defineProperty(exports,`SchmancyTimezonesSelect`,{enumerable:!0,get:function(){return e.t}});
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./extra-IKAiJJhv.cjs`);Object.defineProperty(exports,`SchmancyCountriesSelect`,{enumerable:!0,get:function(){return e.n}}),Object.defineProperty(exports,`SchmancyTimezonesSelect`,{enumerable:!0,get:function(){return e.t}});
package/dist/extra.js CHANGED
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./extra-BxXFmW1w.js";
1
+ import { n as e, t } from "./extra-wEpvEFbK.js";
2
2
  export { e as SchmancyCountriesSelect, t as SchmancyTimezonesSelect };
@@ -1,5 +1,5 @@
1
- import { i as e } from "./tailwind.mixin-BIVhjNvD.js";
2
- import { t } from "./window-CbgdwOZD.js";
1
+ import { i as e } from "./tailwind.mixin-BCJOOX1_.js";
2
+ import { t } from "./window-CM1ycigo.js";
3
3
  import { customElement as n } from "lit/decorators.js";
4
4
  var r = class extends t {}, i = r = e([n("schmancy-float")], r);
5
5
  export { i as t };
@@ -1 +1 @@
1
- {"version":3,"file":"float-BD86t_NU.js","names":[],"sources":["../src/float/float.ts"],"sourcesContent":["/**\n * Backward compatibility alias — schmancy-float is now schmancy-window.\n *\n * Existing consumers using <schmancy-float> continue to work.\n * New code should use <schmancy-window> directly.\n */\n\nimport { customElement } from 'lit/decorators.js'\nimport SchmancyWindow from '../window/window.js'\n\n@customElement('schmancy-float')\nexport default class SchmancyFloat extends SchmancyWindow {}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-float': SchmancyFloat\n\t}\n}\n"],"mappings":";;;AAWe,IAAA,IAAA,cAA4B,EAAA,IAAA,IAAA,IAAA,EAAA,CAD1C,EAAc,iBAAA,CAAA,EAAiB,EAAA;AAAA,SAAA,KAAA"}
1
+ {"version":3,"file":"float-BQ_urmMs.js","names":[],"sources":["../src/float/float.ts"],"sourcesContent":["/**\n * Backward compatibility alias — schmancy-float is now schmancy-window.\n *\n * Existing consumers using <schmancy-float> continue to work.\n * New code should use <schmancy-window> directly.\n */\n\nimport { customElement } from 'lit/decorators.js'\nimport SchmancyWindow from '../window/window.js'\n\n@customElement('schmancy-float')\nexport default class SchmancyFloat extends SchmancyWindow {}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-float': SchmancyFloat\n\t}\n}\n"],"mappings":";;;AAWe,IAAA,IAAA,cAA4B,EAAA,IAAA,IAAA,IAAA,EAAA,CAD1C,EAAc,iBAAA,CAAA,EAAiB,EAAA;AAAA,SAAA,KAAA"}
@@ -1 +1 @@
1
- require(`./chunk-BCfY8kxB.cjs`);const e=require(`./tailwind.mixin-DSuEu-y3.cjs`),t=require(`./window-B9_14c12.cjs`);let n=require(`lit/decorators.js`);var r=class extends t.t{},i=r=e.i([(0,n.customElement)(`schmancy-float`)],r);Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return i}});
1
+ require(`./chunk-BCfY8kxB.cjs`);const e=require(`./tailwind.mixin-BF1Huas7.cjs`),t=require(`./window-Uii13x_r.cjs`);let n=require(`lit/decorators.js`);var r=class extends t.t{},i=r=e.i([(0,n.customElement)(`schmancy-float`)],r);Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return i}});
@@ -1 +1 @@
1
- {"version":3,"file":"float-DBv1FINW.cjs","names":[],"sources":["../src/float/float.ts"],"sourcesContent":["/**\n * Backward compatibility alias — schmancy-float is now schmancy-window.\n *\n * Existing consumers using <schmancy-float> continue to work.\n * New code should use <schmancy-window> directly.\n */\n\nimport { customElement } from 'lit/decorators.js'\nimport SchmancyWindow from '../window/window.js'\n\n@customElement('schmancy-float')\nexport default class SchmancyFloat extends SchmancyWindow {}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-float': SchmancyFloat\n\t}\n}\n"],"mappings":"uJAWe,IAAA,EAAA,cAA4B,EAAA,CAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAD5B,iBAAA,CAAA,CAAiB,EAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"float-D5rNC82i.cjs","names":[],"sources":["../src/float/float.ts"],"sourcesContent":["/**\n * Backward compatibility alias — schmancy-float is now schmancy-window.\n *\n * Existing consumers using <schmancy-float> continue to work.\n * New code should use <schmancy-window> directly.\n */\n\nimport { customElement } from 'lit/decorators.js'\nimport SchmancyWindow from '../window/window.js'\n\n@customElement('schmancy-float')\nexport default class SchmancyFloat extends SchmancyWindow {}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-float': SchmancyFloat\n\t}\n}\n"],"mappings":"uJAWe,IAAA,EAAA,cAA4B,EAAA,CAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAD5B,iBAAA,CAAA,CAAiB,EAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA"}
package/dist/float.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./float-DBv1FINW.cjs`);exports.SchmancyFloat=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./float-D5rNC82i.cjs`);exports.SchmancyFloat=e.t;
package/dist/float.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as e } from "./float-BD86t_NU.js";
1
+ import { t as e } from "./float-BQ_urmMs.js";
2
2
  export { e as SchmancyFloat };
@@ -1 +1 @@
1
- require(`./chunk-BCfY8kxB.cjs`);const e=require(`./tailwind.mixin-DSuEu-y3.cjs`);require(`./mixins.cjs`);let t=require(`rxjs`),n=require(`lit/decorators.js`),r=require(`lit`);var i,a=class extends e.t(){static{i=this}static{this.tagName=`sch-form`}static{this.formControlRegistry=[{tagName:`input`,hasValue:!0,hasChecked:!0,canSubmit:!0},{tagName:`textarea`,hasValue:!0},{tagName:`select`,hasValue:!0},{tagName:`button`,canSubmit:!0},{tagName:`radio`,hasChecked:!0},{tagName:`schmancy-input`,hasValue:!0,canSubmit:!0},{tagName:`schmancy-mask-input`,hasValue:!0},{tagName:`schmancy-button`,canSubmit:!0},{tagName:`schmancy-icon-button`,canSubmit:!0},{tagName:`schmancy-radio`,hasChecked:!0},{tagName:`schmancy-switch`,hasChecked:!0},{tagName:`schmancy-checkbox`,hasValue:!0,hasChecked:!0},{tagName:`schmancy-radio-group`,hasChecked:!0},{tagName:`schmancy-autocomplete`,hasValue:!0,hasChecked:!0},{tagName:`schmancy-select`,hasValue:!0,hasChecked:!0},{tagName:`schmancy-combo`,hasValue:!0},{tagName:`schmancy-date-time-input`,hasValue:!0},{tagName:`schmancy-rating`,hasValue:!0}]}static registerFormControl(e){let t=this.formControlRegistry.findIndex(t=>t.tagName===e.tagName);t>=0?this.formControlRegistry[t]={...this.formControlRegistry[t],...e}:this.formControlRegistry.push(e)}static hasValue(e){return this.formControlRegistry.find(t=>t.tagName===e)?.hasValue||!1}static hasChecked(e){return this.formControlRegistry.find(t=>t.tagName===e)?.hasChecked||!1}static canSubmit(e){return this.formControlRegistry.find(t=>t.tagName===e)?.canSubmit||!1}static{this.shadowRootOptions={...r.LitElement.shadowRootOptions,mode:`open`,delegatesFocus:!1}}constructor(){super(),this.$disconnecting=new t.Subject,this.novalidate=!1,(0,t.merge)((0,t.fromEvent)(this,`click`).pipe((0,t.tap)(e=>{e.target.type?.toLowerCase()===`submit`&&this.handleSubmitRequest(e)})),(0,t.fromEvent)(this,`keydown`).pipe((0,t.tap)(e=>{e.code!==`Enter`&&e.key!==`Enter`||this.handleSubmitRequest(e)}))).pipe((0,t.takeUntil)(this.$disconnecting)).subscribe()}disconnectedCallback(){super.disconnectedCallback(),this.$disconnecting.next(null),this.$disconnecting.complete()}submit(){let e=this.getFormData();return!(!this.novalidate&&!this.reportValidity())&&(this.dispatchEvent(new CustomEvent(`submit`,{detail:e})),!0)}reset(){this.getFormElements().forEach(e=>{let t=e.tagName.toLowerCase();if(t===`select`){let t=e;for(let e=0;e<t.options.length;e++){let n=t.options[e];n.selected=n.defaultSelected}}else t===`input`&&(e.type===`checkbox`||e.type===`radio`)||t!==`input`&&i.hasChecked(t)?e.checked=e.hasAttribute(`checked`):t===`schmancy-input`||t===`schmancy-rating`||t===`schmancy-mask-input`||t===`schmancy-date-time-input`?e.value=e.getAttribute(`value`):i.hasValue(t)&&(e.value=e.defaultValue)}),this.dispatchEvent(new CustomEvent(`reset`))}getFormElements(){let e=(this.shadowRoot?.querySelector(`slot`))?.assignedElements({flatten:!0}),t=[];return e?.forEach(e=>{e.disabled||t.push(e);let n=Array.from(e.getElementsByTagName(`*`)).filter(e=>!e.disabled);t.push(...n)}),t}getFormData(){let e=new FormData;return this.getFormElements().forEach(t=>{if(!t.name)return;let n=t.tagName.toLowerCase();if(n===`select`)for(let n=0;n<t.options.length;n++){let r=t.options[n];r.selected&&e.append(t.name,r.value)}else i.hasChecked(n)&&t.checked?e.append(t.name,t.value||`on`):i.hasValue(n)&&t.type!==`checkbox`&&t.type!==`radio`&&t.type!==`submit`&&e.append(t.name,t.value||``)}),e}reportValidity(){return!this.getFormElements().some(e=>typeof e.reportValidity==`function`&&!1===e.reportValidity())}handleSubmitRequest(e){let t=e.target,n=t.tagName.toLowerCase();return i.canSubmit(n)?this.submit():t.type?.toLowerCase()===`reset`&&this.reset(),!0}render(){return r.html`<slot></slot>`}};e.i([(0,n.property)({type:Boolean,reflect:!0})],a.prototype,`novalidate`,void 0),a=i=e.i([(0,n.customElement)(`sch-form`)],a);var o=class extends e.t(){static{this.tagName=`schmancy-form`}static{this.shadowRootOptions={...r.LitElement.shadowRootOptions,mode:`open`,delegatesFocus:!1}}constructor(){super(),this.$disconnecting=new t.Subject,this._controlsWithChecked=[`input`,`radio`,`schmancy-radio`,`schmancy-switch`,`schmancy-checkbox`,`schmancy-radio-group`,`schmancy-autocomplete`,`schmancy-select`],this._controlsWithValue=[`input`,`schmancy-input`,`schmancy-mask-input`,`textarea`,`schmancy-rating`,`schmancy-select`,`schmancy-combo`,`schmancy-date-time-input`,`schmancy-autocomplete`,`schmancy-checkbox`,`schmancy-select`],this._controlsThatSubmit=[`button`,`schmancy-input`,`schmancy-button`,`schmancy-icon-button`],this.novalidate=!1,(0,t.merge)((0,t.fromEvent)(this,`click`).pipe((0,t.tap)(e=>{e.target.type?.toLowerCase()===`submit`&&this.handleSubmitRequest(e)})),(0,t.fromEvent)(this,`keydown`).pipe((0,t.tap)(e=>{e.code!==`Enter`&&e.key!==`Enter`||this.handleSubmitRequest(e)}))).pipe((0,t.takeUntil)(this.$disconnecting)).subscribe()}submit(){let e=this.getFormData();return!(!this.novalidate&&!this.reportValidity())&&(this.dispatchEvent(new CustomEvent(`submit`,{detail:e})),!0)}reset(){this.getFormElements().forEach(e=>{let t=e.tagName.toLowerCase();if(t===`select`)for(let t=0;t<e.options.length;t++){let n=e.options[t];n.selected=n.defaultSelected}else t===`input`&&(e.type===`checkbox`||e.type==`radio`)||t!==`input`&&this._controlsWithChecked.includes(t)?e.checked=e.hasAttribute(`checked`):t===`schmancy-input`||t===`schmancy-rating`||t===`schmancy-mask-input`||t===`schmancy-date-time-input`?e.value=e.getAttribute(`value`):this._controlsWithValue.includes(t)&&(e.value=e.defaultValue)}),this.dispatchEvent(new CustomEvent(`reset`))}getFormElements(){let e=(this.shadowRoot?.querySelector(`slot`))?.assignedElements({flatten:!0}),t=[];return e?.forEach(e=>{e.disabled||t.push(e);let n=Array.from(e.getElementsByTagName(`*`)).filter(e=>!e.disabled);t.push(...n)}),t}getFormData(){let e=new FormData;return this.getFormElements().forEach(t=>{let n=t.tagName.toLowerCase();if(n===`select`)for(let n=0;n<t.options.length;n++){let r=t.options[n];r.selected&&e.append(t.name,r.value)}else this._controlsWithChecked.includes(n)&&t.checked?e.append(t.name,t.value||`on`):this._controlsWithValue.includes(n)&&t.type!==`checkbox`&&t.type!==`radio`&&t.type!==`submit`&&e.append(t.name,t.value)}),e}reportValidity(){return!this.getFormElements().some(e=>typeof e.reportValidity==`function`&&!1===e.reportValidity())}handleSubmitRequest(e){let t=e.target;return this._controlsThatSubmit.includes(t.tagName.toLowerCase())?this.submit():t.type?.toLowerCase()===`reset`&&this.reset(),!0}render(){return r.html`<slot></slot>`}};e.i([(0,n.property)({type:Boolean,reflect:!0})],o.prototype,`novalidate`,void 0),o=e.i([(0,n.customElement)(`schmancy-form`)],o);
1
+ require(`./chunk-BCfY8kxB.cjs`);const e=require(`./tailwind.mixin-BF1Huas7.cjs`);require(`./mixins.cjs`);let t=require(`rxjs`),n=require(`lit/decorators.js`),r=require(`lit`);var i,a=class extends e.t(){static{i=this}static{this.tagName=`sch-form`}static{this.formControlRegistry=[{tagName:`input`,hasValue:!0,hasChecked:!0,canSubmit:!0},{tagName:`textarea`,hasValue:!0},{tagName:`select`,hasValue:!0},{tagName:`button`,canSubmit:!0},{tagName:`radio`,hasChecked:!0},{tagName:`schmancy-input`,hasValue:!0,canSubmit:!0},{tagName:`schmancy-mask-input`,hasValue:!0},{tagName:`schmancy-button`,canSubmit:!0},{tagName:`schmancy-icon-button`,canSubmit:!0},{tagName:`schmancy-radio`,hasChecked:!0},{tagName:`schmancy-switch`,hasChecked:!0},{tagName:`schmancy-checkbox`,hasValue:!0,hasChecked:!0},{tagName:`schmancy-radio-group`,hasChecked:!0},{tagName:`schmancy-autocomplete`,hasValue:!0,hasChecked:!0},{tagName:`schmancy-select`,hasValue:!0,hasChecked:!0},{tagName:`schmancy-combo`,hasValue:!0},{tagName:`schmancy-date-time-input`,hasValue:!0},{tagName:`schmancy-rating`,hasValue:!0}]}static registerFormControl(e){let t=this.formControlRegistry.findIndex(t=>t.tagName===e.tagName);t>=0?this.formControlRegistry[t]={...this.formControlRegistry[t],...e}:this.formControlRegistry.push(e)}static hasValue(e){return this.formControlRegistry.find(t=>t.tagName===e)?.hasValue||!1}static hasChecked(e){return this.formControlRegistry.find(t=>t.tagName===e)?.hasChecked||!1}static canSubmit(e){return this.formControlRegistry.find(t=>t.tagName===e)?.canSubmit||!1}static{this.shadowRootOptions={...r.LitElement.shadowRootOptions,mode:`open`,delegatesFocus:!1}}constructor(){super(),this.$disconnecting=new t.Subject,this.novalidate=!1,(0,t.merge)((0,t.fromEvent)(this,`click`).pipe((0,t.tap)(e=>{e.target.type?.toLowerCase()===`submit`&&this.handleSubmitRequest(e)})),(0,t.fromEvent)(this,`keydown`).pipe((0,t.tap)(e=>{e.code!==`Enter`&&e.key!==`Enter`||this.handleSubmitRequest(e)}))).pipe((0,t.takeUntil)(this.$disconnecting)).subscribe()}disconnectedCallback(){super.disconnectedCallback(),this.$disconnecting.next(null),this.$disconnecting.complete()}submit(){let e=this.getFormData();return!(!this.novalidate&&!this.reportValidity())&&(this.dispatchEvent(new CustomEvent(`submit`,{detail:e})),!0)}reset(){this.getFormElements().forEach(e=>{let t=e.tagName.toLowerCase();if(t===`select`){let t=e;for(let e=0;e<t.options.length;e++){let n=t.options[e];n.selected=n.defaultSelected}}else t===`input`&&(e.type===`checkbox`||e.type===`radio`)||t!==`input`&&i.hasChecked(t)?e.checked=e.hasAttribute(`checked`):t===`schmancy-input`||t===`schmancy-rating`||t===`schmancy-mask-input`||t===`schmancy-date-time-input`?e.value=e.getAttribute(`value`):i.hasValue(t)&&(e.value=e.defaultValue)}),this.dispatchEvent(new CustomEvent(`reset`))}getFormElements(){let e=(this.shadowRoot?.querySelector(`slot`))?.assignedElements({flatten:!0}),t=[];return e?.forEach(e=>{e.disabled||t.push(e);let n=Array.from(e.getElementsByTagName(`*`)).filter(e=>!e.disabled);t.push(...n)}),t}getFormData(){let e=new FormData;return this.getFormElements().forEach(t=>{if(!t.name)return;let n=t.tagName.toLowerCase();if(n===`select`)for(let n=0;n<t.options.length;n++){let r=t.options[n];r.selected&&e.append(t.name,r.value)}else i.hasChecked(n)&&t.checked?e.append(t.name,t.value||`on`):i.hasValue(n)&&t.type!==`checkbox`&&t.type!==`radio`&&t.type!==`submit`&&e.append(t.name,t.value||``)}),e}reportValidity(){return!this.getFormElements().some(e=>typeof e.reportValidity==`function`&&!1===e.reportValidity())}handleSubmitRequest(e){let t=e.target,n=t.tagName.toLowerCase();return i.canSubmit(n)?this.submit():t.type?.toLowerCase()===`reset`&&this.reset(),!0}render(){return r.html`<slot></slot>`}};e.i([(0,n.property)({type:Boolean,reflect:!0})],a.prototype,`novalidate`,void 0),a=i=e.i([(0,n.customElement)(`sch-form`)],a);var o=class extends e.t(){static{this.tagName=`schmancy-form`}static{this.shadowRootOptions={...r.LitElement.shadowRootOptions,mode:`open`,delegatesFocus:!1}}constructor(){super(),this.$disconnecting=new t.Subject,this._controlsWithChecked=[`input`,`radio`,`schmancy-radio`,`schmancy-switch`,`schmancy-checkbox`,`schmancy-radio-group`,`schmancy-autocomplete`,`schmancy-select`],this._controlsWithValue=[`input`,`schmancy-input`,`schmancy-mask-input`,`textarea`,`schmancy-rating`,`schmancy-select`,`schmancy-combo`,`schmancy-date-time-input`,`schmancy-autocomplete`,`schmancy-checkbox`,`schmancy-select`],this._controlsThatSubmit=[`button`,`schmancy-input`,`schmancy-button`,`schmancy-icon-button`],this.novalidate=!1,(0,t.merge)((0,t.fromEvent)(this,`click`).pipe((0,t.tap)(e=>{e.target.type?.toLowerCase()===`submit`&&this.handleSubmitRequest(e)})),(0,t.fromEvent)(this,`keydown`).pipe((0,t.tap)(e=>{e.code!==`Enter`&&e.key!==`Enter`||this.handleSubmitRequest(e)}))).pipe((0,t.takeUntil)(this.$disconnecting)).subscribe()}submit(){let e=this.getFormData();return!(!this.novalidate&&!this.reportValidity())&&(this.dispatchEvent(new CustomEvent(`submit`,{detail:e})),!0)}reset(){this.getFormElements().forEach(e=>{let t=e.tagName.toLowerCase();if(t===`select`)for(let t=0;t<e.options.length;t++){let n=e.options[t];n.selected=n.defaultSelected}else t===`input`&&(e.type===`checkbox`||e.type==`radio`)||t!==`input`&&this._controlsWithChecked.includes(t)?e.checked=e.hasAttribute(`checked`):t===`schmancy-input`||t===`schmancy-rating`||t===`schmancy-mask-input`||t===`schmancy-date-time-input`?e.value=e.getAttribute(`value`):this._controlsWithValue.includes(t)&&(e.value=e.defaultValue)}),this.dispatchEvent(new CustomEvent(`reset`))}getFormElements(){let e=(this.shadowRoot?.querySelector(`slot`))?.assignedElements({flatten:!0}),t=[];return e?.forEach(e=>{e.disabled||t.push(e);let n=Array.from(e.getElementsByTagName(`*`)).filter(e=>!e.disabled);t.push(...n)}),t}getFormData(){let e=new FormData;return this.getFormElements().forEach(t=>{let n=t.tagName.toLowerCase();if(n===`select`)for(let n=0;n<t.options.length;n++){let r=t.options[n];r.selected&&e.append(t.name,r.value)}else this._controlsWithChecked.includes(n)&&t.checked?e.append(t.name,t.value||`on`):this._controlsWithValue.includes(n)&&t.type!==`checkbox`&&t.type!==`radio`&&t.type!==`submit`&&e.append(t.name,t.value)}),e}reportValidity(){return!this.getFormElements().some(e=>typeof e.reportValidity==`function`&&!1===e.reportValidity())}handleSubmitRequest(e){let t=e.target;return this._controlsThatSubmit.includes(t.tagName.toLowerCase())?this.submit():t.type?.toLowerCase()===`reset`&&this.reset(),!0}render(){return r.html`<slot></slot>`}};e.i([(0,n.property)({type:Boolean,reflect:!0})],o.prototype,`novalidate`,void 0),o=e.i([(0,n.customElement)(`schmancy-form`)],o);
@@ -1 +1 @@
1
- {"version":3,"file":"form-D0bIeDWT.cjs","names":[],"sources":["../src/form/form-v2.ts","../src/form/form.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { fromEvent, merge, Subject, takeUntil, tap } from 'rxjs'\n\n// Define interfaces for form element capabilities\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}\n\n// Define interface for form control registry\nexport interface FormControlConfig {\n\ttagName: string\n\thasValue?: boolean\n\thasChecked?: boolean\n\tcanSubmit?: boolean\n}\n\n/**\n * The form is a component used to collect user input from\n * interactive controls.\n *\n * @element sch-form\n *\n * @slot - Default slot for the form.\n *\n * @fires submit - Emitted when the form is submitted.\n * @fires reset - Emitted when the form is reset.\n */\n@customElement('sch-form')\nexport default class SchmancyFormV2 extends TailwindElement() {\n\tprivate $disconnecting = new Subject()\n\tpublic static readonly tagName = 'sch-form'\n\n\t// Static registry of form controls\n\tprivate static formControlRegistry: FormControlConfig[] = [\n\t\t// Native elements\n\t\t{ tagName: 'input', hasValue: true, hasChecked: true, canSubmit: true },\n\t\t{ tagName: 'textarea', hasValue: true },\n\t\t{ tagName: 'select', hasValue: true },\n\t\t{ tagName: 'button', canSubmit: true },\n\t\t{ tagName: 'radio', hasChecked: true },\n\n\t\t// Custom elements\n\t\t{ tagName: 'schmancy-input', hasValue: true, canSubmit: true },\n\t\t{ tagName: 'schmancy-mask-input', hasValue: true },\n\t\t{ tagName: 'schmancy-button', canSubmit: true },\n\t\t{ tagName: 'schmancy-icon-button', canSubmit: true },\n\t\t{ tagName: 'schmancy-radio', hasChecked: true },\n\t\t{ tagName: 'schmancy-switch', hasChecked: true },\n\t\t{ tagName: 'schmancy-checkbox', hasValue: true, hasChecked: true },\n\t\t{ tagName: 'schmancy-radio-group', hasChecked: true },\n\t\t{ tagName: 'schmancy-autocomplete', hasValue: true, hasChecked: true },\n\t\t{ tagName: 'schmancy-select', hasValue: true, hasChecked: true },\n\t\t{ tagName: 'schmancy-combo', hasValue: true },\n\t\t{ tagName: 'schmancy-date-time-input', hasValue: true },\n\t\t{ tagName: 'schmancy-rating', hasValue: true },\n\t]\n\n\t// Static methods to register new form controls\n\tpublic static registerFormControl(config: FormControlConfig): void {\n\t\tconst existingIndex = this.formControlRegistry.findIndex(item => item.tagName === config.tagName)\n\n\t\tif (existingIndex >= 0) {\n\t\t\tthis.formControlRegistry[existingIndex] = {\n\t\t\t\t...this.formControlRegistry[existingIndex],\n\t\t\t\t...config,\n\t\t\t}\n\t\t} else {\n\t\t\tthis.formControlRegistry.push(config)\n\t\t}\n\t}\n\n\t// Helper methods to check control capabilities\n\tprivate static hasValue(tagName: string): boolean {\n\t\tconst config = this.formControlRegistry.find(item => item.tagName === tagName)\n\t\treturn config?.hasValue || false\n\t}\n\n\tprivate static hasChecked(tagName: string): boolean {\n\t\tconst config = this.formControlRegistry.find(item => item.tagName === tagName)\n\t\treturn config?.hasChecked || false\n\t}\n\n\tprivate static canSubmit(tagName: string): boolean {\n\t\tconst config = this.formControlRegistry.find(item => item.tagName === tagName)\n\t\treturn config?.canSubmit || false\n\t}\n\n\tprotected static shadowRootOptions = {\n\t\t...LitElement.shadowRootOptions,\n\t\tmode: 'open',\n\t\tdelegatesFocus: false,\n\t}\n\n\n\t/** Specifies if form data validation should be skipped on submit.\n\t * @attr novalidate\n\t * @type {boolean}\n\t * @public\n\t */\n\t@property({ type: Boolean, reflect: true }) public novalidate = false\n\n\tconstructor() {\n\t\tsuper()\n\t\tmerge(\n\t\t\tfromEvent<MouseEvent>(this, 'click').pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\tconst target = e.target as HTMLButtonElement\n\t\t\t\t\tif (target.type?.toLowerCase() === 'submit') {\n\t\t\t\t\t\tthis.handleSubmitRequest(e)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t),\n\t\t\tfromEvent<KeyboardEvent>(this, 'keydown').pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\tif (e.code === 'Enter' || e.key === 'Enter') {\n\t\t\t\t\t\tthis.handleSubmitRequest(e)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t\t\t.pipe(takeUntil(this.$disconnecting))\n\t\t\t.subscribe()\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tthis.$disconnecting.next(null)\n\t\tthis.$disconnecting.complete()\n\t}\n\n\t/** Submits the form. */\n\tpublic submit(): boolean {\n\t\tconst formData = this.getFormData()\n\t\tif (!this.novalidate && !this.reportValidity()) {\n\t\t\treturn false\n\t\t}\n\t\tthis.dispatchEvent(new CustomEvent('submit', { detail: formData }))\n\t\treturn true\n\t}\n\n\t/** Resets the form. */\n\tpublic reset() {\n\t\tconst formElements = this.getFormElements()\n\t\tformElements.forEach(element => {\n\t\t\tconst tagName = element.tagName.toLowerCase()\n\n\t\t\tif (tagName === 'select') {\n\t\t\t\tconst selectElement = element as HTMLSelectElement\n\t\t\t\tfor (let i = 0; i < selectElement.options.length; i++) {\n\t\t\t\t\tconst option = selectElement.options[i]\n\t\t\t\t\toption.selected = option.defaultSelected\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\t(tagName === 'input' && (element.type === 'checkbox' || element.type === 'radio')) ||\n\t\t\t\t(tagName !== 'input' && SchmancyFormV2.hasChecked(tagName))\n\t\t\t) {\n\t\t\t\t;(element as CheckableFormElement).checked = element.hasAttribute('checked')\n\t\t\t} else if (\n\t\t\t\ttagName === 'schmancy-input' ||\n\t\t\t\ttagName === 'schmancy-rating' ||\n\t\t\t\ttagName === 'schmancy-mask-input' ||\n\t\t\t\ttagName === 'schmancy-date-time-input'\n\t\t\t) {\n\t\t\t\telement.value = element.getAttribute('value')\n\t\t\t} else if (SchmancyFormV2.hasValue(tagName)) {\n\t\t\t\telement.value = element.defaultValue\n\t\t\t}\n\t\t})\n\t\tthis.dispatchEvent(new CustomEvent('reset'))\n\t}\n\n\tprivate getFormElements(): FormElement[] {\n\t\tconst slot = this.shadowRoot?.querySelector('slot')\n\t\tconst assignedElements = slot?.assignedElements({ flatten: true })\n\t\tconst formElements: FormElement[] = []\n\n\t\tassignedElements?.forEach((element: FormElement) => {\n\t\t\tif (!element.disabled) {\n\t\t\t\tformElements.push(element)\n\t\t\t}\n\n\t\t\tconst children = Array.from(element.getElementsByTagName('*')).filter(\n\t\t\t\t(childElement: FormElement) => !childElement.disabled,\n\t\t\t)\n\t\t\tformElements.push(...(children as FormElement[]))\n\t\t})\n\n\t\treturn formElements\n\t}\n\n\tpublic getFormData() {\n\t\tconst formData = new FormData()\n\t\tconst formElements = this.getFormElements()\n\n\t\tformElements.forEach(element => {\n\t\t\tif (!element.name) return\n\n\t\t\tconst tagName = element.tagName.toLowerCase()\n\n\t\t\tif (tagName === 'select') {\n\t\t\t\tfor (let i = 0; i < (element as HTMLSelectElement).options.length; i++) {\n\t\t\t\t\tconst option = (element as HTMLSelectElement).options[i]\n\t\t\t\t\tif (option.selected) {\n\t\t\t\t\t\tformData.append(element.name, option.value)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (SchmancyFormV2.hasChecked(tagName) && (element as CheckableFormElement).checked) {\n\t\t\t\tformData.append(element.name, element.value || 'on')\n\t\t\t} else if (\n\t\t\t\tSchmancyFormV2.hasValue(tagName) &&\n\t\t\t\t(element as HTMLInputElement).type !== 'checkbox' &&\n\t\t\t\t(element as HTMLInputElement).type !== 'radio' &&\n\t\t\t\t(element as HTMLInputElement).type !== 'submit'\n\t\t\t) {\n\t\t\t\tformData.append(element.name, element.value || '')\n\t\t\t}\n\t\t})\n\n\t\treturn formData\n\t}\n\n\t/** Checks for validity of the form. */\n\tpublic reportValidity(): boolean {\n\t\tconst formElements = this.getFormElements()\n\t\treturn !formElements.some(\n\t\t\telement =>\n\t\t\t\ttypeof (element as ValidatableFormElement).reportValidity === 'function' &&\n\t\t\t\t(element as ValidatableFormElement).reportValidity() === false,\n\t\t)\n\t}\n\n\tprivate handleSubmitRequest(event: MouseEvent | KeyboardEvent) {\n\t\tconst targetElement = event.target as HTMLElement\n\t\tconst tagName = targetElement.tagName.toLowerCase()\n\n\t\tif (SchmancyFormV2.canSubmit(tagName)) {\n\t\t\tthis.submit()\n\t\t} else if ((targetElement as HTMLButtonElement).type?.toLowerCase() === 'reset') {\n\t\t\tthis.reset()\n\t\t}\n\n\t\treturn true\n\t}\n\n\tprotected override render() {\n\t\treturn html`<slot></slot>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'sch-form': SchmancyFormV2\n\t}\n}\n","import { TailwindElement } from '@mixins/index'\nimport { html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { fromEvent, merge, Subject, takeUntil, tap } from 'rxjs'\n\nexport interface FormEventMap {\n\tsubmit: CustomEvent<FormData>\n\treset: CustomEvent\n}\n\n/**\n * The form is a component used to collect user input from\n * interactive controls.\n *\n * @element schmancy-form\n *\n * @slot - Default slot for the form.\n *\n * @fires submit - Emitted when the form is submitted.\n * @fires reset - Emitted when the form is reset.\n */\n@customElement('schmancy-form')\nexport default class SchmancyForm extends TailwindElement() {\n\tprivate $disconnecting = new Subject()\n\tpublic static readonly tagName = 'schmancy-form'\n\tprotected static shadowRootOptions = {\n\t\t...LitElement.shadowRootOptions,\n\t\tmode: 'open',\n\t\tdelegatesFocus: false,\n\t}\n\n\tprivate _controlsWithChecked = [\n\t\t'input',\n\t\t'radio',\n\t\t'schmancy-radio',\n\t\t'schmancy-switch',\n\t\t'schmancy-checkbox',\n\t\t'schmancy-radio-group',\n\t\t'schmancy-autocomplete',\n\t\t'schmancy-select',\n\t]\n\tprivate _controlsWithValue = [\n\t\t'input',\n\t\t'schmancy-input',\n\t\t'schmancy-mask-input',\n\t\t'textarea',\n\t\t'schmancy-rating',\n\t\t'schmancy-select',\n\t\t'schmancy-combo',\n\t\t'schmancy-date-time-input',\n\t\t'schmancy-autocomplete',\n\t\t'schmancy-checkbox',\n\t\t'schmancy-select',\n\t]\n\tprivate _controlsThatSubmit = ['button', 'schmancy-input', 'schmancy-button', 'schmancy-icon-button']\n\n\t/** Specifies if form data validation should be skipped on submit.\n\t * @attr novalidate\n\t * @type {boolean}\n\t * @public\n\t */\n\t@property({ type: Boolean, reflect: true }) public novalidate = false\n\n\tconstructor() {\n\t\tsuper()\n\t\tmerge(\n\t\t\tfromEvent<MouseEvent>(this, 'click').pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\tif ((e.target as HTMLButtonElement).type?.toLowerCase() === 'submit') this.handleSubmitRequest(e)\n\t\t\t\t}),\n\t\t\t),\n\t\t\tfromEvent<KeyboardEvent>(this, 'keydown').pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\tif (e.code === 'Enter' || e.key === 'Enter') {\n\t\t\t\t\t\tthis.handleSubmitRequest(e)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t\t\t.pipe(takeUntil(this.$disconnecting))\n\t\t\t.subscribe()\n\t}\n\n\t/** Submits the form. */\n\tpublic submit(): boolean {\n\t\tconst formData = this.getFormData()\n\t\tif (!this.novalidate && !this.reportValidity()) {\n\t\t\treturn false\n\t\t}\n\t\tthis.dispatchEvent(new CustomEvent('submit', { detail: formData }))\n\t\treturn true\n\t}\n\n\t/** Resets the form. */\n\tpublic reset() {\n\t\tconst formElements = this.getFormElements()\n\t\tformElements.forEach(element => {\n\t\t\tconst tagName = element.tagName.toLowerCase()\n\t\t\tif (tagName === 'select') {\n\t\t\t\tfor (let i = 0; i < element.options.length; i++) {\n\t\t\t\t\tconst option = element.options[i]\n\t\t\t\t\toption.selected = option.defaultSelected\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\t(tagName === 'input' && (element.type === 'checkbox' || element.type == 'radio')) ||\n\t\t\t\t(tagName !== 'input' && this._controlsWithChecked.includes(tagName))\n\t\t\t) {\n\t\t\t\telement.checked = element.hasAttribute('checked')\n\t\t\t} else if (\n\t\t\t\ttagName === 'schmancy-input' ||\n\t\t\t\ttagName === 'schmancy-rating' ||\n\t\t\t\ttagName === 'schmancy-mask-input' ||\n\t\t\t\ttagName === 'schmancy-date-time-input'\n\t\t\t) {\n\t\t\t\telement.value = element.getAttribute('value')\n\t\t\t} else if (this._controlsWithValue.includes(tagName)) {\n\t\t\t\telement.value = element.defaultValue\n\t\t\t}\n\t\t})\n\t\tthis.dispatchEvent(new CustomEvent('reset'))\n\t}\n\n\tprivate getFormElements(): any[] {\n\t\tconst slot = this.shadowRoot?.querySelector('slot')\n\t\tconst assignedElements = slot?.assignedElements({ flatten: true })\n\t\tconst formElements: any[] = []\n\t\tassignedElements?.forEach((element: any) => {\n\t\t\tif (!element.disabled) {\n\t\t\t\tformElements.push(element)\n\t\t\t}\n\t\t\tconst children = Array.from(element.getElementsByTagName('*')).filter((element: any) => !element.disabled)\n\t\t\tformElements.push(...children)\n\t\t})\n\n\t\treturn formElements\n\t}\n\n\tpublic getFormData() {\n\t\tconst formData = new FormData()\n\n\t\tconst formElements = this.getFormElements()\n\t\tformElements.forEach(element => {\n\t\t\tconst tagName = element.tagName.toLowerCase()\n\t\t\tif (tagName === 'select') {\n\t\t\t\tfor (let i = 0; i < element.options.length; i++) {\n\t\t\t\t\tconst option = element.options[i]\n\t\t\t\t\tif (option.selected) {\n\t\t\t\t\t\tformData.append(element.name, option.value)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (this._controlsWithChecked.includes(tagName) && element.checked) {\n\t\t\t\tformData.append(element.name, element.value || 'on')\n\t\t\t} else if (\n\t\t\t\tthis._controlsWithValue.includes(tagName) &&\n\t\t\t\telement.type !== 'checkbox' &&\n\t\t\t\telement.type !== 'radio' &&\n\t\t\t\telement.type !== 'submit'\n\t\t\t) {\n\t\t\t\tformData.append(element.name, element.value)\n\t\t\t}\n\t\t})\n\n\t\treturn formData\n\t}\n\n\t/** Checks for validity of the form. */\n\tpublic reportValidity(): boolean {\n\t\tconst formElements = this.getFormElements()\n\t\treturn !formElements.some(\n\t\t\telement => typeof element.reportValidity === 'function' && element.reportValidity() === false,\n\t\t)\n\t}\n\n\tprivate handleSubmitRequest(event: MouseEvent | KeyboardEvent) {\n\t\tconst targetElement: any = event.target as HTMLElement\n\t\tif (this._controlsThatSubmit.includes(targetElement.tagName.toLowerCase())) {\n\t\t\tthis.submit()\n\t\t} else if (targetElement.type?.toLowerCase() === 'reset') {\n\t\t\tthis.reset()\n\t\t}\n\n\t\treturn true\n\t}\n\n\tprotected override render() {\n\t\treturn html`<slot></slot>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-form': SchmancyForm\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"form-BqN1AGFj.cjs","names":[],"sources":["../src/form/form-v2.ts","../src/form/form.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { fromEvent, merge, Subject, takeUntil, tap } from 'rxjs'\n\n// Define interfaces for form element capabilities\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}\n\n// Define interface for form control registry\nexport interface FormControlConfig {\n\ttagName: string\n\thasValue?: boolean\n\thasChecked?: boolean\n\tcanSubmit?: boolean\n}\n\n/**\n * The form is a component used to collect user input from\n * interactive controls.\n *\n * @element sch-form\n *\n * @slot - Default slot for the form.\n *\n * @fires submit - Emitted when the form is submitted.\n * @fires reset - Emitted when the form is reset.\n */\n@customElement('sch-form')\nexport default class SchmancyFormV2 extends TailwindElement() {\n\tprivate $disconnecting = new Subject()\n\tpublic static readonly tagName = 'sch-form'\n\n\t// Static registry of form controls\n\tprivate static formControlRegistry: FormControlConfig[] = [\n\t\t// Native elements\n\t\t{ tagName: 'input', hasValue: true, hasChecked: true, canSubmit: true },\n\t\t{ tagName: 'textarea', hasValue: true },\n\t\t{ tagName: 'select', hasValue: true },\n\t\t{ tagName: 'button', canSubmit: true },\n\t\t{ tagName: 'radio', hasChecked: true },\n\n\t\t// Custom elements\n\t\t{ tagName: 'schmancy-input', hasValue: true, canSubmit: true },\n\t\t{ tagName: 'schmancy-mask-input', hasValue: true },\n\t\t{ tagName: 'schmancy-button', canSubmit: true },\n\t\t{ tagName: 'schmancy-icon-button', canSubmit: true },\n\t\t{ tagName: 'schmancy-radio', hasChecked: true },\n\t\t{ tagName: 'schmancy-switch', hasChecked: true },\n\t\t{ tagName: 'schmancy-checkbox', hasValue: true, hasChecked: true },\n\t\t{ tagName: 'schmancy-radio-group', hasChecked: true },\n\t\t{ tagName: 'schmancy-autocomplete', hasValue: true, hasChecked: true },\n\t\t{ tagName: 'schmancy-select', hasValue: true, hasChecked: true },\n\t\t{ tagName: 'schmancy-combo', hasValue: true },\n\t\t{ tagName: 'schmancy-date-time-input', hasValue: true },\n\t\t{ tagName: 'schmancy-rating', hasValue: true },\n\t]\n\n\t// Static methods to register new form controls\n\tpublic static registerFormControl(config: FormControlConfig): void {\n\t\tconst existingIndex = this.formControlRegistry.findIndex(item => item.tagName === config.tagName)\n\n\t\tif (existingIndex >= 0) {\n\t\t\tthis.formControlRegistry[existingIndex] = {\n\t\t\t\t...this.formControlRegistry[existingIndex],\n\t\t\t\t...config,\n\t\t\t}\n\t\t} else {\n\t\t\tthis.formControlRegistry.push(config)\n\t\t}\n\t}\n\n\t// Helper methods to check control capabilities\n\tprivate static hasValue(tagName: string): boolean {\n\t\tconst config = this.formControlRegistry.find(item => item.tagName === tagName)\n\t\treturn config?.hasValue || false\n\t}\n\n\tprivate static hasChecked(tagName: string): boolean {\n\t\tconst config = this.formControlRegistry.find(item => item.tagName === tagName)\n\t\treturn config?.hasChecked || false\n\t}\n\n\tprivate static canSubmit(tagName: string): boolean {\n\t\tconst config = this.formControlRegistry.find(item => item.tagName === tagName)\n\t\treturn config?.canSubmit || false\n\t}\n\n\tprotected static shadowRootOptions = {\n\t\t...LitElement.shadowRootOptions,\n\t\tmode: 'open',\n\t\tdelegatesFocus: false,\n\t}\n\n\n\t/** Specifies if form data validation should be skipped on submit.\n\t * @attr novalidate\n\t * @type {boolean}\n\t * @public\n\t */\n\t@property({ type: Boolean, reflect: true }) public novalidate = false\n\n\tconstructor() {\n\t\tsuper()\n\t\tmerge(\n\t\t\tfromEvent<MouseEvent>(this, 'click').pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\tconst target = e.target as HTMLButtonElement\n\t\t\t\t\tif (target.type?.toLowerCase() === 'submit') {\n\t\t\t\t\t\tthis.handleSubmitRequest(e)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t),\n\t\t\tfromEvent<KeyboardEvent>(this, 'keydown').pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\tif (e.code === 'Enter' || e.key === 'Enter') {\n\t\t\t\t\t\tthis.handleSubmitRequest(e)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t\t\t.pipe(takeUntil(this.$disconnecting))\n\t\t\t.subscribe()\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tthis.$disconnecting.next(null)\n\t\tthis.$disconnecting.complete()\n\t}\n\n\t/** Submits the form. */\n\tpublic submit(): boolean {\n\t\tconst formData = this.getFormData()\n\t\tif (!this.novalidate && !this.reportValidity()) {\n\t\t\treturn false\n\t\t}\n\t\tthis.dispatchEvent(new CustomEvent('submit', { detail: formData }))\n\t\treturn true\n\t}\n\n\t/** Resets the form. */\n\tpublic reset() {\n\t\tconst formElements = this.getFormElements()\n\t\tformElements.forEach(element => {\n\t\t\tconst tagName = element.tagName.toLowerCase()\n\n\t\t\tif (tagName === 'select') {\n\t\t\t\tconst selectElement = element as HTMLSelectElement\n\t\t\t\tfor (let i = 0; i < selectElement.options.length; i++) {\n\t\t\t\t\tconst option = selectElement.options[i]\n\t\t\t\t\toption.selected = option.defaultSelected\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\t(tagName === 'input' && (element.type === 'checkbox' || element.type === 'radio')) ||\n\t\t\t\t(tagName !== 'input' && SchmancyFormV2.hasChecked(tagName))\n\t\t\t) {\n\t\t\t\t;(element as CheckableFormElement).checked = element.hasAttribute('checked')\n\t\t\t} else if (\n\t\t\t\ttagName === 'schmancy-input' ||\n\t\t\t\ttagName === 'schmancy-rating' ||\n\t\t\t\ttagName === 'schmancy-mask-input' ||\n\t\t\t\ttagName === 'schmancy-date-time-input'\n\t\t\t) {\n\t\t\t\telement.value = element.getAttribute('value')\n\t\t\t} else if (SchmancyFormV2.hasValue(tagName)) {\n\t\t\t\telement.value = element.defaultValue\n\t\t\t}\n\t\t})\n\t\tthis.dispatchEvent(new CustomEvent('reset'))\n\t}\n\n\tprivate getFormElements(): FormElement[] {\n\t\tconst slot = this.shadowRoot?.querySelector('slot')\n\t\tconst assignedElements = slot?.assignedElements({ flatten: true })\n\t\tconst formElements: FormElement[] = []\n\n\t\tassignedElements?.forEach((element: FormElement) => {\n\t\t\tif (!element.disabled) {\n\t\t\t\tformElements.push(element)\n\t\t\t}\n\n\t\t\tconst children = Array.from(element.getElementsByTagName('*')).filter(\n\t\t\t\t(childElement: FormElement) => !childElement.disabled,\n\t\t\t)\n\t\t\tformElements.push(...(children as FormElement[]))\n\t\t})\n\n\t\treturn formElements\n\t}\n\n\tpublic getFormData() {\n\t\tconst formData = new FormData()\n\t\tconst formElements = this.getFormElements()\n\n\t\tformElements.forEach(element => {\n\t\t\tif (!element.name) return\n\n\t\t\tconst tagName = element.tagName.toLowerCase()\n\n\t\t\tif (tagName === 'select') {\n\t\t\t\tfor (let i = 0; i < (element as HTMLSelectElement).options.length; i++) {\n\t\t\t\t\tconst option = (element as HTMLSelectElement).options[i]\n\t\t\t\t\tif (option.selected) {\n\t\t\t\t\t\tformData.append(element.name, option.value)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (SchmancyFormV2.hasChecked(tagName) && (element as CheckableFormElement).checked) {\n\t\t\t\tformData.append(element.name, element.value || 'on')\n\t\t\t} else if (\n\t\t\t\tSchmancyFormV2.hasValue(tagName) &&\n\t\t\t\t(element as HTMLInputElement).type !== 'checkbox' &&\n\t\t\t\t(element as HTMLInputElement).type !== 'radio' &&\n\t\t\t\t(element as HTMLInputElement).type !== 'submit'\n\t\t\t) {\n\t\t\t\tformData.append(element.name, element.value || '')\n\t\t\t}\n\t\t})\n\n\t\treturn formData\n\t}\n\n\t/** Checks for validity of the form. */\n\tpublic reportValidity(): boolean {\n\t\tconst formElements = this.getFormElements()\n\t\treturn !formElements.some(\n\t\t\telement =>\n\t\t\t\ttypeof (element as ValidatableFormElement).reportValidity === 'function' &&\n\t\t\t\t(element as ValidatableFormElement).reportValidity() === false,\n\t\t)\n\t}\n\n\tprivate handleSubmitRequest(event: MouseEvent | KeyboardEvent) {\n\t\tconst targetElement = event.target as HTMLElement\n\t\tconst tagName = targetElement.tagName.toLowerCase()\n\n\t\tif (SchmancyFormV2.canSubmit(tagName)) {\n\t\t\tthis.submit()\n\t\t} else if ((targetElement as HTMLButtonElement).type?.toLowerCase() === 'reset') {\n\t\t\tthis.reset()\n\t\t}\n\n\t\treturn true\n\t}\n\n\tprotected override render() {\n\t\treturn html`<slot></slot>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'sch-form': SchmancyFormV2\n\t}\n}\n","import { TailwindElement } from '@mixins/index'\nimport { html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { fromEvent, merge, Subject, takeUntil, tap } from 'rxjs'\n\nexport interface FormEventMap {\n\tsubmit: CustomEvent<FormData>\n\treset: CustomEvent\n}\n\n/**\n * The form is a component used to collect user input from\n * interactive controls.\n *\n * @element schmancy-form\n *\n * @slot - Default slot for the form.\n *\n * @fires submit - Emitted when the form is submitted.\n * @fires reset - Emitted when the form is reset.\n */\n@customElement('schmancy-form')\nexport default class SchmancyForm extends TailwindElement() {\n\tprivate $disconnecting = new Subject()\n\tpublic static readonly tagName = 'schmancy-form'\n\tprotected static shadowRootOptions = {\n\t\t...LitElement.shadowRootOptions,\n\t\tmode: 'open',\n\t\tdelegatesFocus: false,\n\t}\n\n\tprivate _controlsWithChecked = [\n\t\t'input',\n\t\t'radio',\n\t\t'schmancy-radio',\n\t\t'schmancy-switch',\n\t\t'schmancy-checkbox',\n\t\t'schmancy-radio-group',\n\t\t'schmancy-autocomplete',\n\t\t'schmancy-select',\n\t]\n\tprivate _controlsWithValue = [\n\t\t'input',\n\t\t'schmancy-input',\n\t\t'schmancy-mask-input',\n\t\t'textarea',\n\t\t'schmancy-rating',\n\t\t'schmancy-select',\n\t\t'schmancy-combo',\n\t\t'schmancy-date-time-input',\n\t\t'schmancy-autocomplete',\n\t\t'schmancy-checkbox',\n\t\t'schmancy-select',\n\t]\n\tprivate _controlsThatSubmit = ['button', 'schmancy-input', 'schmancy-button', 'schmancy-icon-button']\n\n\t/** Specifies if form data validation should be skipped on submit.\n\t * @attr novalidate\n\t * @type {boolean}\n\t * @public\n\t */\n\t@property({ type: Boolean, reflect: true }) public novalidate = false\n\n\tconstructor() {\n\t\tsuper()\n\t\tmerge(\n\t\t\tfromEvent<MouseEvent>(this, 'click').pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\tif ((e.target as HTMLButtonElement).type?.toLowerCase() === 'submit') this.handleSubmitRequest(e)\n\t\t\t\t}),\n\t\t\t),\n\t\t\tfromEvent<KeyboardEvent>(this, 'keydown').pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\tif (e.code === 'Enter' || e.key === 'Enter') {\n\t\t\t\t\t\tthis.handleSubmitRequest(e)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t\t\t.pipe(takeUntil(this.$disconnecting))\n\t\t\t.subscribe()\n\t}\n\n\t/** Submits the form. */\n\tpublic submit(): boolean {\n\t\tconst formData = this.getFormData()\n\t\tif (!this.novalidate && !this.reportValidity()) {\n\t\t\treturn false\n\t\t}\n\t\tthis.dispatchEvent(new CustomEvent('submit', { detail: formData }))\n\t\treturn true\n\t}\n\n\t/** Resets the form. */\n\tpublic reset() {\n\t\tconst formElements = this.getFormElements()\n\t\tformElements.forEach(element => {\n\t\t\tconst tagName = element.tagName.toLowerCase()\n\t\t\tif (tagName === 'select') {\n\t\t\t\tfor (let i = 0; i < element.options.length; i++) {\n\t\t\t\t\tconst option = element.options[i]\n\t\t\t\t\toption.selected = option.defaultSelected\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\t(tagName === 'input' && (element.type === 'checkbox' || element.type == 'radio')) ||\n\t\t\t\t(tagName !== 'input' && this._controlsWithChecked.includes(tagName))\n\t\t\t) {\n\t\t\t\telement.checked = element.hasAttribute('checked')\n\t\t\t} else if (\n\t\t\t\ttagName === 'schmancy-input' ||\n\t\t\t\ttagName === 'schmancy-rating' ||\n\t\t\t\ttagName === 'schmancy-mask-input' ||\n\t\t\t\ttagName === 'schmancy-date-time-input'\n\t\t\t) {\n\t\t\t\telement.value = element.getAttribute('value')\n\t\t\t} else if (this._controlsWithValue.includes(tagName)) {\n\t\t\t\telement.value = element.defaultValue\n\t\t\t}\n\t\t})\n\t\tthis.dispatchEvent(new CustomEvent('reset'))\n\t}\n\n\tprivate getFormElements(): any[] {\n\t\tconst slot = this.shadowRoot?.querySelector('slot')\n\t\tconst assignedElements = slot?.assignedElements({ flatten: true })\n\t\tconst formElements: any[] = []\n\t\tassignedElements?.forEach((element: any) => {\n\t\t\tif (!element.disabled) {\n\t\t\t\tformElements.push(element)\n\t\t\t}\n\t\t\tconst children = Array.from(element.getElementsByTagName('*')).filter((element: any) => !element.disabled)\n\t\t\tformElements.push(...children)\n\t\t})\n\n\t\treturn formElements\n\t}\n\n\tpublic getFormData() {\n\t\tconst formData = new FormData()\n\n\t\tconst formElements = this.getFormElements()\n\t\tformElements.forEach(element => {\n\t\t\tconst tagName = element.tagName.toLowerCase()\n\t\t\tif (tagName === 'select') {\n\t\t\t\tfor (let i = 0; i < element.options.length; i++) {\n\t\t\t\t\tconst option = element.options[i]\n\t\t\t\t\tif (option.selected) {\n\t\t\t\t\t\tformData.append(element.name, option.value)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (this._controlsWithChecked.includes(tagName) && element.checked) {\n\t\t\t\tformData.append(element.name, element.value || 'on')\n\t\t\t} else if (\n\t\t\t\tthis._controlsWithValue.includes(tagName) &&\n\t\t\t\telement.type !== 'checkbox' &&\n\t\t\t\telement.type !== 'radio' &&\n\t\t\t\telement.type !== 'submit'\n\t\t\t) {\n\t\t\t\tformData.append(element.name, element.value)\n\t\t\t}\n\t\t})\n\n\t\treturn formData\n\t}\n\n\t/** Checks for validity of the form. */\n\tpublic reportValidity(): boolean {\n\t\tconst formElements = this.getFormElements()\n\t\treturn !formElements.some(\n\t\t\telement => typeof element.reportValidity === 'function' && element.reportValidity() === false,\n\t\t)\n\t}\n\n\tprivate handleSubmitRequest(event: MouseEvent | KeyboardEvent) {\n\t\tconst targetElement: any = event.target as HTMLElement\n\t\tif (this._controlsThatSubmit.includes(targetElement.tagName.toLowerCase())) {\n\t\t\tthis.submit()\n\t\t} else if (targetElement.type?.toLowerCase() === 'reset') {\n\t\t\tthis.reset()\n\t\t}\n\n\t\treturn true\n\t}\n\n\tprotected override render() {\n\t\treturn html`<slot></slot>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-form': SchmancyForm\n\t}\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { i as e, t } from "./tailwind.mixin-BIVhjNvD.js";
1
+ import { i as e, t } from "./tailwind.mixin-BCJOOX1_.js";
2
2
  import "./mixins.js";
3
3
  import { Subject as n, fromEvent as r, merge as i, takeUntil as a, tap as o } from "rxjs";
4
4
  import { customElement as s, property as c } from "lit/decorators.js";
@@ -1 +1 @@
1
- {"version":3,"file":"form-Cp5-I_ZV.js","names":[],"sources":["../src/form/form-v2.ts","../src/form/form.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { fromEvent, merge, Subject, takeUntil, tap } from 'rxjs'\n\n// Define interfaces for form element capabilities\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}\n\n// Define interface for form control registry\nexport interface FormControlConfig {\n\ttagName: string\n\thasValue?: boolean\n\thasChecked?: boolean\n\tcanSubmit?: boolean\n}\n\n/**\n * The form is a component used to collect user input from\n * interactive controls.\n *\n * @element sch-form\n *\n * @slot - Default slot for the form.\n *\n * @fires submit - Emitted when the form is submitted.\n * @fires reset - Emitted when the form is reset.\n */\n@customElement('sch-form')\nexport default class SchmancyFormV2 extends TailwindElement() {\n\tprivate $disconnecting = new Subject()\n\tpublic static readonly tagName = 'sch-form'\n\n\t// Static registry of form controls\n\tprivate static formControlRegistry: FormControlConfig[] = [\n\t\t// Native elements\n\t\t{ tagName: 'input', hasValue: true, hasChecked: true, canSubmit: true },\n\t\t{ tagName: 'textarea', hasValue: true },\n\t\t{ tagName: 'select', hasValue: true },\n\t\t{ tagName: 'button', canSubmit: true },\n\t\t{ tagName: 'radio', hasChecked: true },\n\n\t\t// Custom elements\n\t\t{ tagName: 'schmancy-input', hasValue: true, canSubmit: true },\n\t\t{ tagName: 'schmancy-mask-input', hasValue: true },\n\t\t{ tagName: 'schmancy-button', canSubmit: true },\n\t\t{ tagName: 'schmancy-icon-button', canSubmit: true },\n\t\t{ tagName: 'schmancy-radio', hasChecked: true },\n\t\t{ tagName: 'schmancy-switch', hasChecked: true },\n\t\t{ tagName: 'schmancy-checkbox', hasValue: true, hasChecked: true },\n\t\t{ tagName: 'schmancy-radio-group', hasChecked: true },\n\t\t{ tagName: 'schmancy-autocomplete', hasValue: true, hasChecked: true },\n\t\t{ tagName: 'schmancy-select', hasValue: true, hasChecked: true },\n\t\t{ tagName: 'schmancy-combo', hasValue: true },\n\t\t{ tagName: 'schmancy-date-time-input', hasValue: true },\n\t\t{ tagName: 'schmancy-rating', hasValue: true },\n\t]\n\n\t// Static methods to register new form controls\n\tpublic static registerFormControl(config: FormControlConfig): void {\n\t\tconst existingIndex = this.formControlRegistry.findIndex(item => item.tagName === config.tagName)\n\n\t\tif (existingIndex >= 0) {\n\t\t\tthis.formControlRegistry[existingIndex] = {\n\t\t\t\t...this.formControlRegistry[existingIndex],\n\t\t\t\t...config,\n\t\t\t}\n\t\t} else {\n\t\t\tthis.formControlRegistry.push(config)\n\t\t}\n\t}\n\n\t// Helper methods to check control capabilities\n\tprivate static hasValue(tagName: string): boolean {\n\t\tconst config = this.formControlRegistry.find(item => item.tagName === tagName)\n\t\treturn config?.hasValue || false\n\t}\n\n\tprivate static hasChecked(tagName: string): boolean {\n\t\tconst config = this.formControlRegistry.find(item => item.tagName === tagName)\n\t\treturn config?.hasChecked || false\n\t}\n\n\tprivate static canSubmit(tagName: string): boolean {\n\t\tconst config = this.formControlRegistry.find(item => item.tagName === tagName)\n\t\treturn config?.canSubmit || false\n\t}\n\n\tprotected static shadowRootOptions = {\n\t\t...LitElement.shadowRootOptions,\n\t\tmode: 'open',\n\t\tdelegatesFocus: false,\n\t}\n\n\n\t/** Specifies if form data validation should be skipped on submit.\n\t * @attr novalidate\n\t * @type {boolean}\n\t * @public\n\t */\n\t@property({ type: Boolean, reflect: true }) public novalidate = false\n\n\tconstructor() {\n\t\tsuper()\n\t\tmerge(\n\t\t\tfromEvent<MouseEvent>(this, 'click').pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\tconst target = e.target as HTMLButtonElement\n\t\t\t\t\tif (target.type?.toLowerCase() === 'submit') {\n\t\t\t\t\t\tthis.handleSubmitRequest(e)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t),\n\t\t\tfromEvent<KeyboardEvent>(this, 'keydown').pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\tif (e.code === 'Enter' || e.key === 'Enter') {\n\t\t\t\t\t\tthis.handleSubmitRequest(e)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t\t\t.pipe(takeUntil(this.$disconnecting))\n\t\t\t.subscribe()\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tthis.$disconnecting.next(null)\n\t\tthis.$disconnecting.complete()\n\t}\n\n\t/** Submits the form. */\n\tpublic submit(): boolean {\n\t\tconst formData = this.getFormData()\n\t\tif (!this.novalidate && !this.reportValidity()) {\n\t\t\treturn false\n\t\t}\n\t\tthis.dispatchEvent(new CustomEvent('submit', { detail: formData }))\n\t\treturn true\n\t}\n\n\t/** Resets the form. */\n\tpublic reset() {\n\t\tconst formElements = this.getFormElements()\n\t\tformElements.forEach(element => {\n\t\t\tconst tagName = element.tagName.toLowerCase()\n\n\t\t\tif (tagName === 'select') {\n\t\t\t\tconst selectElement = element as HTMLSelectElement\n\t\t\t\tfor (let i = 0; i < selectElement.options.length; i++) {\n\t\t\t\t\tconst option = selectElement.options[i]\n\t\t\t\t\toption.selected = option.defaultSelected\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\t(tagName === 'input' && (element.type === 'checkbox' || element.type === 'radio')) ||\n\t\t\t\t(tagName !== 'input' && SchmancyFormV2.hasChecked(tagName))\n\t\t\t) {\n\t\t\t\t;(element as CheckableFormElement).checked = element.hasAttribute('checked')\n\t\t\t} else if (\n\t\t\t\ttagName === 'schmancy-input' ||\n\t\t\t\ttagName === 'schmancy-rating' ||\n\t\t\t\ttagName === 'schmancy-mask-input' ||\n\t\t\t\ttagName === 'schmancy-date-time-input'\n\t\t\t) {\n\t\t\t\telement.value = element.getAttribute('value')\n\t\t\t} else if (SchmancyFormV2.hasValue(tagName)) {\n\t\t\t\telement.value = element.defaultValue\n\t\t\t}\n\t\t})\n\t\tthis.dispatchEvent(new CustomEvent('reset'))\n\t}\n\n\tprivate getFormElements(): FormElement[] {\n\t\tconst slot = this.shadowRoot?.querySelector('slot')\n\t\tconst assignedElements = slot?.assignedElements({ flatten: true })\n\t\tconst formElements: FormElement[] = []\n\n\t\tassignedElements?.forEach((element: FormElement) => {\n\t\t\tif (!element.disabled) {\n\t\t\t\tformElements.push(element)\n\t\t\t}\n\n\t\t\tconst children = Array.from(element.getElementsByTagName('*')).filter(\n\t\t\t\t(childElement: FormElement) => !childElement.disabled,\n\t\t\t)\n\t\t\tformElements.push(...(children as FormElement[]))\n\t\t})\n\n\t\treturn formElements\n\t}\n\n\tpublic getFormData() {\n\t\tconst formData = new FormData()\n\t\tconst formElements = this.getFormElements()\n\n\t\tformElements.forEach(element => {\n\t\t\tif (!element.name) return\n\n\t\t\tconst tagName = element.tagName.toLowerCase()\n\n\t\t\tif (tagName === 'select') {\n\t\t\t\tfor (let i = 0; i < (element as HTMLSelectElement).options.length; i++) {\n\t\t\t\t\tconst option = (element as HTMLSelectElement).options[i]\n\t\t\t\t\tif (option.selected) {\n\t\t\t\t\t\tformData.append(element.name, option.value)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (SchmancyFormV2.hasChecked(tagName) && (element as CheckableFormElement).checked) {\n\t\t\t\tformData.append(element.name, element.value || 'on')\n\t\t\t} else if (\n\t\t\t\tSchmancyFormV2.hasValue(tagName) &&\n\t\t\t\t(element as HTMLInputElement).type !== 'checkbox' &&\n\t\t\t\t(element as HTMLInputElement).type !== 'radio' &&\n\t\t\t\t(element as HTMLInputElement).type !== 'submit'\n\t\t\t) {\n\t\t\t\tformData.append(element.name, element.value || '')\n\t\t\t}\n\t\t})\n\n\t\treturn formData\n\t}\n\n\t/** Checks for validity of the form. */\n\tpublic reportValidity(): boolean {\n\t\tconst formElements = this.getFormElements()\n\t\treturn !formElements.some(\n\t\t\telement =>\n\t\t\t\ttypeof (element as ValidatableFormElement).reportValidity === 'function' &&\n\t\t\t\t(element as ValidatableFormElement).reportValidity() === false,\n\t\t)\n\t}\n\n\tprivate handleSubmitRequest(event: MouseEvent | KeyboardEvent) {\n\t\tconst targetElement = event.target as HTMLElement\n\t\tconst tagName = targetElement.tagName.toLowerCase()\n\n\t\tif (SchmancyFormV2.canSubmit(tagName)) {\n\t\t\tthis.submit()\n\t\t} else if ((targetElement as HTMLButtonElement).type?.toLowerCase() === 'reset') {\n\t\t\tthis.reset()\n\t\t}\n\n\t\treturn true\n\t}\n\n\tprotected override render() {\n\t\treturn html`<slot></slot>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'sch-form': SchmancyFormV2\n\t}\n}\n","import { TailwindElement } from '@mixins/index'\nimport { html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { fromEvent, merge, Subject, takeUntil, tap } from 'rxjs'\n\nexport interface FormEventMap {\n\tsubmit: CustomEvent<FormData>\n\treset: CustomEvent\n}\n\n/**\n * The form is a component used to collect user input from\n * interactive controls.\n *\n * @element schmancy-form\n *\n * @slot - Default slot for the form.\n *\n * @fires submit - Emitted when the form is submitted.\n * @fires reset - Emitted when the form is reset.\n */\n@customElement('schmancy-form')\nexport default class SchmancyForm extends TailwindElement() {\n\tprivate $disconnecting = new Subject()\n\tpublic static readonly tagName = 'schmancy-form'\n\tprotected static shadowRootOptions = {\n\t\t...LitElement.shadowRootOptions,\n\t\tmode: 'open',\n\t\tdelegatesFocus: false,\n\t}\n\n\tprivate _controlsWithChecked = [\n\t\t'input',\n\t\t'radio',\n\t\t'schmancy-radio',\n\t\t'schmancy-switch',\n\t\t'schmancy-checkbox',\n\t\t'schmancy-radio-group',\n\t\t'schmancy-autocomplete',\n\t\t'schmancy-select',\n\t]\n\tprivate _controlsWithValue = [\n\t\t'input',\n\t\t'schmancy-input',\n\t\t'schmancy-mask-input',\n\t\t'textarea',\n\t\t'schmancy-rating',\n\t\t'schmancy-select',\n\t\t'schmancy-combo',\n\t\t'schmancy-date-time-input',\n\t\t'schmancy-autocomplete',\n\t\t'schmancy-checkbox',\n\t\t'schmancy-select',\n\t]\n\tprivate _controlsThatSubmit = ['button', 'schmancy-input', 'schmancy-button', 'schmancy-icon-button']\n\n\t/** Specifies if form data validation should be skipped on submit.\n\t * @attr novalidate\n\t * @type {boolean}\n\t * @public\n\t */\n\t@property({ type: Boolean, reflect: true }) public novalidate = false\n\n\tconstructor() {\n\t\tsuper()\n\t\tmerge(\n\t\t\tfromEvent<MouseEvent>(this, 'click').pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\tif ((e.target as HTMLButtonElement).type?.toLowerCase() === 'submit') this.handleSubmitRequest(e)\n\t\t\t\t}),\n\t\t\t),\n\t\t\tfromEvent<KeyboardEvent>(this, 'keydown').pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\tif (e.code === 'Enter' || e.key === 'Enter') {\n\t\t\t\t\t\tthis.handleSubmitRequest(e)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t\t\t.pipe(takeUntil(this.$disconnecting))\n\t\t\t.subscribe()\n\t}\n\n\t/** Submits the form. */\n\tpublic submit(): boolean {\n\t\tconst formData = this.getFormData()\n\t\tif (!this.novalidate && !this.reportValidity()) {\n\t\t\treturn false\n\t\t}\n\t\tthis.dispatchEvent(new CustomEvent('submit', { detail: formData }))\n\t\treturn true\n\t}\n\n\t/** Resets the form. */\n\tpublic reset() {\n\t\tconst formElements = this.getFormElements()\n\t\tformElements.forEach(element => {\n\t\t\tconst tagName = element.tagName.toLowerCase()\n\t\t\tif (tagName === 'select') {\n\t\t\t\tfor (let i = 0; i < element.options.length; i++) {\n\t\t\t\t\tconst option = element.options[i]\n\t\t\t\t\toption.selected = option.defaultSelected\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\t(tagName === 'input' && (element.type === 'checkbox' || element.type == 'radio')) ||\n\t\t\t\t(tagName !== 'input' && this._controlsWithChecked.includes(tagName))\n\t\t\t) {\n\t\t\t\telement.checked = element.hasAttribute('checked')\n\t\t\t} else if (\n\t\t\t\ttagName === 'schmancy-input' ||\n\t\t\t\ttagName === 'schmancy-rating' ||\n\t\t\t\ttagName === 'schmancy-mask-input' ||\n\t\t\t\ttagName === 'schmancy-date-time-input'\n\t\t\t) {\n\t\t\t\telement.value = element.getAttribute('value')\n\t\t\t} else if (this._controlsWithValue.includes(tagName)) {\n\t\t\t\telement.value = element.defaultValue\n\t\t\t}\n\t\t})\n\t\tthis.dispatchEvent(new CustomEvent('reset'))\n\t}\n\n\tprivate getFormElements(): any[] {\n\t\tconst slot = this.shadowRoot?.querySelector('slot')\n\t\tconst assignedElements = slot?.assignedElements({ flatten: true })\n\t\tconst formElements: any[] = []\n\t\tassignedElements?.forEach((element: any) => {\n\t\t\tif (!element.disabled) {\n\t\t\t\tformElements.push(element)\n\t\t\t}\n\t\t\tconst children = Array.from(element.getElementsByTagName('*')).filter((element: any) => !element.disabled)\n\t\t\tformElements.push(...children)\n\t\t})\n\n\t\treturn formElements\n\t}\n\n\tpublic getFormData() {\n\t\tconst formData = new FormData()\n\n\t\tconst formElements = this.getFormElements()\n\t\tformElements.forEach(element => {\n\t\t\tconst tagName = element.tagName.toLowerCase()\n\t\t\tif (tagName === 'select') {\n\t\t\t\tfor (let i = 0; i < element.options.length; i++) {\n\t\t\t\t\tconst option = element.options[i]\n\t\t\t\t\tif (option.selected) {\n\t\t\t\t\t\tformData.append(element.name, option.value)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (this._controlsWithChecked.includes(tagName) && element.checked) {\n\t\t\t\tformData.append(element.name, element.value || 'on')\n\t\t\t} else if (\n\t\t\t\tthis._controlsWithValue.includes(tagName) &&\n\t\t\t\telement.type !== 'checkbox' &&\n\t\t\t\telement.type !== 'radio' &&\n\t\t\t\telement.type !== 'submit'\n\t\t\t) {\n\t\t\t\tformData.append(element.name, element.value)\n\t\t\t}\n\t\t})\n\n\t\treturn formData\n\t}\n\n\t/** Checks for validity of the form. */\n\tpublic reportValidity(): boolean {\n\t\tconst formElements = this.getFormElements()\n\t\treturn !formElements.some(\n\t\t\telement => typeof element.reportValidity === 'function' && element.reportValidity() === false,\n\t\t)\n\t}\n\n\tprivate handleSubmitRequest(event: MouseEvent | KeyboardEvent) {\n\t\tconst targetElement: any = event.target as HTMLElement\n\t\tif (this._controlsThatSubmit.includes(targetElement.tagName.toLowerCase())) {\n\t\t\tthis.submit()\n\t\t} else if (targetElement.type?.toLowerCase() === 'reset') {\n\t\t\tthis.reset()\n\t\t}\n\n\t\treturn true\n\t}\n\n\tprotected override render() {\n\t\treturn html`<slot></slot>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-form': SchmancyForm\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"form-CajC5HnO.js","names":[],"sources":["../src/form/form-v2.ts","../src/form/form.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { fromEvent, merge, Subject, takeUntil, tap } from 'rxjs'\n\n// Define interfaces for form element capabilities\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}\n\n// Define interface for form control registry\nexport interface FormControlConfig {\n\ttagName: string\n\thasValue?: boolean\n\thasChecked?: boolean\n\tcanSubmit?: boolean\n}\n\n/**\n * The form is a component used to collect user input from\n * interactive controls.\n *\n * @element sch-form\n *\n * @slot - Default slot for the form.\n *\n * @fires submit - Emitted when the form is submitted.\n * @fires reset - Emitted when the form is reset.\n */\n@customElement('sch-form')\nexport default class SchmancyFormV2 extends TailwindElement() {\n\tprivate $disconnecting = new Subject()\n\tpublic static readonly tagName = 'sch-form'\n\n\t// Static registry of form controls\n\tprivate static formControlRegistry: FormControlConfig[] = [\n\t\t// Native elements\n\t\t{ tagName: 'input', hasValue: true, hasChecked: true, canSubmit: true },\n\t\t{ tagName: 'textarea', hasValue: true },\n\t\t{ tagName: 'select', hasValue: true },\n\t\t{ tagName: 'button', canSubmit: true },\n\t\t{ tagName: 'radio', hasChecked: true },\n\n\t\t// Custom elements\n\t\t{ tagName: 'schmancy-input', hasValue: true, canSubmit: true },\n\t\t{ tagName: 'schmancy-mask-input', hasValue: true },\n\t\t{ tagName: 'schmancy-button', canSubmit: true },\n\t\t{ tagName: 'schmancy-icon-button', canSubmit: true },\n\t\t{ tagName: 'schmancy-radio', hasChecked: true },\n\t\t{ tagName: 'schmancy-switch', hasChecked: true },\n\t\t{ tagName: 'schmancy-checkbox', hasValue: true, hasChecked: true },\n\t\t{ tagName: 'schmancy-radio-group', hasChecked: true },\n\t\t{ tagName: 'schmancy-autocomplete', hasValue: true, hasChecked: true },\n\t\t{ tagName: 'schmancy-select', hasValue: true, hasChecked: true },\n\t\t{ tagName: 'schmancy-combo', hasValue: true },\n\t\t{ tagName: 'schmancy-date-time-input', hasValue: true },\n\t\t{ tagName: 'schmancy-rating', hasValue: true },\n\t]\n\n\t// Static methods to register new form controls\n\tpublic static registerFormControl(config: FormControlConfig): void {\n\t\tconst existingIndex = this.formControlRegistry.findIndex(item => item.tagName === config.tagName)\n\n\t\tif (existingIndex >= 0) {\n\t\t\tthis.formControlRegistry[existingIndex] = {\n\t\t\t\t...this.formControlRegistry[existingIndex],\n\t\t\t\t...config,\n\t\t\t}\n\t\t} else {\n\t\t\tthis.formControlRegistry.push(config)\n\t\t}\n\t}\n\n\t// Helper methods to check control capabilities\n\tprivate static hasValue(tagName: string): boolean {\n\t\tconst config = this.formControlRegistry.find(item => item.tagName === tagName)\n\t\treturn config?.hasValue || false\n\t}\n\n\tprivate static hasChecked(tagName: string): boolean {\n\t\tconst config = this.formControlRegistry.find(item => item.tagName === tagName)\n\t\treturn config?.hasChecked || false\n\t}\n\n\tprivate static canSubmit(tagName: string): boolean {\n\t\tconst config = this.formControlRegistry.find(item => item.tagName === tagName)\n\t\treturn config?.canSubmit || false\n\t}\n\n\tprotected static shadowRootOptions = {\n\t\t...LitElement.shadowRootOptions,\n\t\tmode: 'open',\n\t\tdelegatesFocus: false,\n\t}\n\n\n\t/** Specifies if form data validation should be skipped on submit.\n\t * @attr novalidate\n\t * @type {boolean}\n\t * @public\n\t */\n\t@property({ type: Boolean, reflect: true }) public novalidate = false\n\n\tconstructor() {\n\t\tsuper()\n\t\tmerge(\n\t\t\tfromEvent<MouseEvent>(this, 'click').pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\tconst target = e.target as HTMLButtonElement\n\t\t\t\t\tif (target.type?.toLowerCase() === 'submit') {\n\t\t\t\t\t\tthis.handleSubmitRequest(e)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t),\n\t\t\tfromEvent<KeyboardEvent>(this, 'keydown').pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\tif (e.code === 'Enter' || e.key === 'Enter') {\n\t\t\t\t\t\tthis.handleSubmitRequest(e)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t\t\t.pipe(takeUntil(this.$disconnecting))\n\t\t\t.subscribe()\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tthis.$disconnecting.next(null)\n\t\tthis.$disconnecting.complete()\n\t}\n\n\t/** Submits the form. */\n\tpublic submit(): boolean {\n\t\tconst formData = this.getFormData()\n\t\tif (!this.novalidate && !this.reportValidity()) {\n\t\t\treturn false\n\t\t}\n\t\tthis.dispatchEvent(new CustomEvent('submit', { detail: formData }))\n\t\treturn true\n\t}\n\n\t/** Resets the form. */\n\tpublic reset() {\n\t\tconst formElements = this.getFormElements()\n\t\tformElements.forEach(element => {\n\t\t\tconst tagName = element.tagName.toLowerCase()\n\n\t\t\tif (tagName === 'select') {\n\t\t\t\tconst selectElement = element as HTMLSelectElement\n\t\t\t\tfor (let i = 0; i < selectElement.options.length; i++) {\n\t\t\t\t\tconst option = selectElement.options[i]\n\t\t\t\t\toption.selected = option.defaultSelected\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\t(tagName === 'input' && (element.type === 'checkbox' || element.type === 'radio')) ||\n\t\t\t\t(tagName !== 'input' && SchmancyFormV2.hasChecked(tagName))\n\t\t\t) {\n\t\t\t\t;(element as CheckableFormElement).checked = element.hasAttribute('checked')\n\t\t\t} else if (\n\t\t\t\ttagName === 'schmancy-input' ||\n\t\t\t\ttagName === 'schmancy-rating' ||\n\t\t\t\ttagName === 'schmancy-mask-input' ||\n\t\t\t\ttagName === 'schmancy-date-time-input'\n\t\t\t) {\n\t\t\t\telement.value = element.getAttribute('value')\n\t\t\t} else if (SchmancyFormV2.hasValue(tagName)) {\n\t\t\t\telement.value = element.defaultValue\n\t\t\t}\n\t\t})\n\t\tthis.dispatchEvent(new CustomEvent('reset'))\n\t}\n\n\tprivate getFormElements(): FormElement[] {\n\t\tconst slot = this.shadowRoot?.querySelector('slot')\n\t\tconst assignedElements = slot?.assignedElements({ flatten: true })\n\t\tconst formElements: FormElement[] = []\n\n\t\tassignedElements?.forEach((element: FormElement) => {\n\t\t\tif (!element.disabled) {\n\t\t\t\tformElements.push(element)\n\t\t\t}\n\n\t\t\tconst children = Array.from(element.getElementsByTagName('*')).filter(\n\t\t\t\t(childElement: FormElement) => !childElement.disabled,\n\t\t\t)\n\t\t\tformElements.push(...(children as FormElement[]))\n\t\t})\n\n\t\treturn formElements\n\t}\n\n\tpublic getFormData() {\n\t\tconst formData = new FormData()\n\t\tconst formElements = this.getFormElements()\n\n\t\tformElements.forEach(element => {\n\t\t\tif (!element.name) return\n\n\t\t\tconst tagName = element.tagName.toLowerCase()\n\n\t\t\tif (tagName === 'select') {\n\t\t\t\tfor (let i = 0; i < (element as HTMLSelectElement).options.length; i++) {\n\t\t\t\t\tconst option = (element as HTMLSelectElement).options[i]\n\t\t\t\t\tif (option.selected) {\n\t\t\t\t\t\tformData.append(element.name, option.value)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (SchmancyFormV2.hasChecked(tagName) && (element as CheckableFormElement).checked) {\n\t\t\t\tformData.append(element.name, element.value || 'on')\n\t\t\t} else if (\n\t\t\t\tSchmancyFormV2.hasValue(tagName) &&\n\t\t\t\t(element as HTMLInputElement).type !== 'checkbox' &&\n\t\t\t\t(element as HTMLInputElement).type !== 'radio' &&\n\t\t\t\t(element as HTMLInputElement).type !== 'submit'\n\t\t\t) {\n\t\t\t\tformData.append(element.name, element.value || '')\n\t\t\t}\n\t\t})\n\n\t\treturn formData\n\t}\n\n\t/** Checks for validity of the form. */\n\tpublic reportValidity(): boolean {\n\t\tconst formElements = this.getFormElements()\n\t\treturn !formElements.some(\n\t\t\telement =>\n\t\t\t\ttypeof (element as ValidatableFormElement).reportValidity === 'function' &&\n\t\t\t\t(element as ValidatableFormElement).reportValidity() === false,\n\t\t)\n\t}\n\n\tprivate handleSubmitRequest(event: MouseEvent | KeyboardEvent) {\n\t\tconst targetElement = event.target as HTMLElement\n\t\tconst tagName = targetElement.tagName.toLowerCase()\n\n\t\tif (SchmancyFormV2.canSubmit(tagName)) {\n\t\t\tthis.submit()\n\t\t} else if ((targetElement as HTMLButtonElement).type?.toLowerCase() === 'reset') {\n\t\t\tthis.reset()\n\t\t}\n\n\t\treturn true\n\t}\n\n\tprotected override render() {\n\t\treturn html`<slot></slot>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'sch-form': SchmancyFormV2\n\t}\n}\n","import { TailwindElement } from '@mixins/index'\nimport { html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { fromEvent, merge, Subject, takeUntil, tap } from 'rxjs'\n\nexport interface FormEventMap {\n\tsubmit: CustomEvent<FormData>\n\treset: CustomEvent\n}\n\n/**\n * The form is a component used to collect user input from\n * interactive controls.\n *\n * @element schmancy-form\n *\n * @slot - Default slot for the form.\n *\n * @fires submit - Emitted when the form is submitted.\n * @fires reset - Emitted when the form is reset.\n */\n@customElement('schmancy-form')\nexport default class SchmancyForm extends TailwindElement() {\n\tprivate $disconnecting = new Subject()\n\tpublic static readonly tagName = 'schmancy-form'\n\tprotected static shadowRootOptions = {\n\t\t...LitElement.shadowRootOptions,\n\t\tmode: 'open',\n\t\tdelegatesFocus: false,\n\t}\n\n\tprivate _controlsWithChecked = [\n\t\t'input',\n\t\t'radio',\n\t\t'schmancy-radio',\n\t\t'schmancy-switch',\n\t\t'schmancy-checkbox',\n\t\t'schmancy-radio-group',\n\t\t'schmancy-autocomplete',\n\t\t'schmancy-select',\n\t]\n\tprivate _controlsWithValue = [\n\t\t'input',\n\t\t'schmancy-input',\n\t\t'schmancy-mask-input',\n\t\t'textarea',\n\t\t'schmancy-rating',\n\t\t'schmancy-select',\n\t\t'schmancy-combo',\n\t\t'schmancy-date-time-input',\n\t\t'schmancy-autocomplete',\n\t\t'schmancy-checkbox',\n\t\t'schmancy-select',\n\t]\n\tprivate _controlsThatSubmit = ['button', 'schmancy-input', 'schmancy-button', 'schmancy-icon-button']\n\n\t/** Specifies if form data validation should be skipped on submit.\n\t * @attr novalidate\n\t * @type {boolean}\n\t * @public\n\t */\n\t@property({ type: Boolean, reflect: true }) public novalidate = false\n\n\tconstructor() {\n\t\tsuper()\n\t\tmerge(\n\t\t\tfromEvent<MouseEvent>(this, 'click').pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\tif ((e.target as HTMLButtonElement).type?.toLowerCase() === 'submit') this.handleSubmitRequest(e)\n\t\t\t\t}),\n\t\t\t),\n\t\t\tfromEvent<KeyboardEvent>(this, 'keydown').pipe(\n\t\t\t\ttap(e => {\n\t\t\t\t\tif (e.code === 'Enter' || e.key === 'Enter') {\n\t\t\t\t\t\tthis.handleSubmitRequest(e)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t\t\t.pipe(takeUntil(this.$disconnecting))\n\t\t\t.subscribe()\n\t}\n\n\t/** Submits the form. */\n\tpublic submit(): boolean {\n\t\tconst formData = this.getFormData()\n\t\tif (!this.novalidate && !this.reportValidity()) {\n\t\t\treturn false\n\t\t}\n\t\tthis.dispatchEvent(new CustomEvent('submit', { detail: formData }))\n\t\treturn true\n\t}\n\n\t/** Resets the form. */\n\tpublic reset() {\n\t\tconst formElements = this.getFormElements()\n\t\tformElements.forEach(element => {\n\t\t\tconst tagName = element.tagName.toLowerCase()\n\t\t\tif (tagName === 'select') {\n\t\t\t\tfor (let i = 0; i < element.options.length; i++) {\n\t\t\t\t\tconst option = element.options[i]\n\t\t\t\t\toption.selected = option.defaultSelected\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\t(tagName === 'input' && (element.type === 'checkbox' || element.type == 'radio')) ||\n\t\t\t\t(tagName !== 'input' && this._controlsWithChecked.includes(tagName))\n\t\t\t) {\n\t\t\t\telement.checked = element.hasAttribute('checked')\n\t\t\t} else if (\n\t\t\t\ttagName === 'schmancy-input' ||\n\t\t\t\ttagName === 'schmancy-rating' ||\n\t\t\t\ttagName === 'schmancy-mask-input' ||\n\t\t\t\ttagName === 'schmancy-date-time-input'\n\t\t\t) {\n\t\t\t\telement.value = element.getAttribute('value')\n\t\t\t} else if (this._controlsWithValue.includes(tagName)) {\n\t\t\t\telement.value = element.defaultValue\n\t\t\t}\n\t\t})\n\t\tthis.dispatchEvent(new CustomEvent('reset'))\n\t}\n\n\tprivate getFormElements(): any[] {\n\t\tconst slot = this.shadowRoot?.querySelector('slot')\n\t\tconst assignedElements = slot?.assignedElements({ flatten: true })\n\t\tconst formElements: any[] = []\n\t\tassignedElements?.forEach((element: any) => {\n\t\t\tif (!element.disabled) {\n\t\t\t\tformElements.push(element)\n\t\t\t}\n\t\t\tconst children = Array.from(element.getElementsByTagName('*')).filter((element: any) => !element.disabled)\n\t\t\tformElements.push(...children)\n\t\t})\n\n\t\treturn formElements\n\t}\n\n\tpublic getFormData() {\n\t\tconst formData = new FormData()\n\n\t\tconst formElements = this.getFormElements()\n\t\tformElements.forEach(element => {\n\t\t\tconst tagName = element.tagName.toLowerCase()\n\t\t\tif (tagName === 'select') {\n\t\t\t\tfor (let i = 0; i < element.options.length; i++) {\n\t\t\t\t\tconst option = element.options[i]\n\t\t\t\t\tif (option.selected) {\n\t\t\t\t\t\tformData.append(element.name, option.value)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (this._controlsWithChecked.includes(tagName) && element.checked) {\n\t\t\t\tformData.append(element.name, element.value || 'on')\n\t\t\t} else if (\n\t\t\t\tthis._controlsWithValue.includes(tagName) &&\n\t\t\t\telement.type !== 'checkbox' &&\n\t\t\t\telement.type !== 'radio' &&\n\t\t\t\telement.type !== 'submit'\n\t\t\t) {\n\t\t\t\tformData.append(element.name, element.value)\n\t\t\t}\n\t\t})\n\n\t\treturn formData\n\t}\n\n\t/** Checks for validity of the form. */\n\tpublic reportValidity(): boolean {\n\t\tconst formElements = this.getFormElements()\n\t\treturn !formElements.some(\n\t\t\telement => typeof element.reportValidity === 'function' && element.reportValidity() === false,\n\t\t)\n\t}\n\n\tprivate handleSubmitRequest(event: MouseEvent | KeyboardEvent) {\n\t\tconst targetElement: any = event.target as HTMLElement\n\t\tif (this._controlsThatSubmit.includes(targetElement.tagName.toLowerCase())) {\n\t\t\tthis.submit()\n\t\t} else if (targetElement.type?.toLowerCase() === 'reset') {\n\t\t\tthis.reset()\n\t\t}\n\n\t\treturn true\n\t}\n\n\tprotected override render() {\n\t\treturn html`<slot></slot>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-form': SchmancyForm\n\t}\n}\n"],"mappings":"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"}
package/dist/form.cjs CHANGED
@@ -1 +1 @@
1
- require(`./form-D0bIeDWT.cjs`);
1
+ require(`./form-BqN1AGFj.cjs`);
package/dist/form.js CHANGED
@@ -1 +1 @@
1
- import "./form-Cp5-I_ZV.js";
1
+ import "./form-CajC5HnO.js";
@@ -1,4 +1,4 @@
1
- require(`./chunk-BCfY8kxB.cjs`);const e=require(`./tailwind.mixin-DSuEu-y3.cjs`);require(`./mixins.cjs`);let t=require(`rxjs`),n=require(`rxjs/operators`),r=require(`lit/decorators.js`),i=require(`lit`);var a,o=class extends e.t(i.css`
1
+ require(`./chunk-BCfY8kxB.cjs`);const e=require(`./tailwind.mixin-BF1Huas7.cjs`);require(`./mixins.cjs`);let t=require(`rxjs`),n=require(`rxjs/operators`),r=require(`lit/decorators.js`),i=require(`lit`);var a,o=class extends e.t(i.css`
2
2
  :host {
3
3
  --schmancy-icon-size: 24px;
4
4
  --schmancy-icon-fill: 0;
@@ -1 +1 @@
1
- {"version":3,"file":"icons-D8w_20mO.cjs","names":[],"sources":["../src/icons/icon.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { BehaviorSubject, combineLatest, takeUntil } from 'rxjs'\nimport { tap } from 'rxjs/operators'\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 */\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@property({ type: String, reflect: true })\n\tsize: IconSize = 'md'\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// Resolve size: token → px, bare number → px, or pass through as-is\n\t\tconst sizeConfig = SchmancyIcon.tokenSizes[this.size]\n\t\tconst isNumeric = !sizeConfig && /^\\d+(\\.\\d+)?$/.test(this.size)\n\t\tconst iconSize = sizeConfig?.size || (isNumeric ? `${this.size}px` : this.size)\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-B57_93VV.cjs","names":[],"sources":["../src/icons/icon.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { BehaviorSubject, combineLatest, takeUntil } from 'rxjs'\nimport { tap } from 'rxjs/operators'\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 */\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@property({ type: String, reflect: true })\n\tsize: IconSize = 'md'\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// Resolve size: token → px, bare number → px, or pass through as-is\n\t\tconst sizeConfig = SchmancyIcon.tokenSizes[this.size]\n\t\tconst isNumeric = !sizeConfig && /^\\d+(\\.\\d+)?$/.test(this.size)\n\t\tconst iconSize = sizeConfig?.size || (isNumeric ? `${this.size}px` : this.size)\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,4 +1,4 @@
1
- import { i as e, t } from "./tailwind.mixin-BIVhjNvD.js";
1
+ import { i as e, t } from "./tailwind.mixin-BCJOOX1_.js";
2
2
  import "./mixins.js";
3
3
  import { BehaviorSubject as n, combineLatest as r, takeUntil as i } from "rxjs";
4
4
  import { tap as a } from "rxjs/operators";
@@ -1 +1 @@
1
- {"version":3,"file":"icons-BpU0_l92.js","names":[],"sources":["../src/icons/icon.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { BehaviorSubject, combineLatest, takeUntil } from 'rxjs'\nimport { tap } from 'rxjs/operators'\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 */\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@property({ type: String, reflect: true })\n\tsize: IconSize = 'md'\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// Resolve size: token → px, bare number → px, or pass through as-is\n\t\tconst sizeConfig = SchmancyIcon.tokenSizes[this.size]\n\t\tconst isNumeric = !sizeConfig && /^\\d+(\\.\\d+)?$/.test(this.size)\n\t\tconst iconSize = sizeConfig?.size || (isNumeric ? `${this.size}px` : this.size)\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-BDqiGXrO.js","names":[],"sources":["../src/icons/icon.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { BehaviorSubject, combineLatest, takeUntil } from 'rxjs'\nimport { tap } from 'rxjs/operators'\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 */\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@property({ type: String, reflect: true })\n\tsize: IconSize = 'md'\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// Resolve size: token → px, bare number → px, or pass through as-is\n\t\tconst sizeConfig = SchmancyIcon.tokenSizes[this.size]\n\t\tconst isNumeric = !sizeConfig && /^\\d+(\\.\\d+)?$/.test(this.size)\n\t\tconst iconSize = sizeConfig?.size || (isNumeric ? `${this.size}px` : this.size)\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":";;;;;;OA4Be,IAAA,cAA2B,EAAgB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAyErD,GAAA,KAAA,SAOE,KAAA,KAAA,QAOD,GAAA,KAAA,UAOoC,YAAA,KAAA,OAQ3B,MAAA,KAAA,QA0BD,IAAI,EAAgB,KAAK,KAAA,EAAA,KAAA,UACvB,IAAI,EAAgB,KAAK,OAAA,EAAA,KAAA,SAC1B,IAAI,EAAgB,KAAK,MAAA,EAAA,KAAA,WACvB,IAAI,EAAgB,KAAK,QAAA;;CAAA;AAAA,OAAA,cAAA,CAjFf;;CAK7B,OAAA,YAAe;AACd,MAAA,EAAiB,YAChB;EAGD,IAAM,IAAO,SAAS,cAAc,OAAA;AACpC,IAAK,MAAM,cACX,EAAK,OAAO,uSACZ,SAAS,KAAK,YAAY,EAAA,EAE1B,EAAa,cAAA,CAAc;;CAAA;AAAA,OAAA,aAgDyD;GACpF,KAAK;IAAE,MAAM;IAAQ,MAAM;IAAA;GAC3B,IAAI;IAAE,MAAM;IAAQ,MAAM;IAAA;GAC1B,IAAI;IAAE,MAAM;IAAQ,MAAM;IAAA;GAC1B,IAAI;IAAE,MAAM;IAAQ,MAAM;IAAA;GAC1B,IAAI;IAAE,MAAM;IAAQ,MAAM;IAAA;GAAA;;CAI3B,OAAA,mBAAkC,GAAA;EACjC,IAAM,IAAK,WAAW,EAAA;AACtB,SAAO,MAAM,EAAA,GAAM,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,MAAM,EAAA,CAAA,CAAA;;CAgB9D,oBAAA;AACC,QAAM,mBAAA,EAGN,KAAK,qBAAA,EAGL,KAAK,YAAY,IAAI,uBAAuB,KAAK,qBAAA,CAAA,EACjD,KAAK,UAAU,QAAQ,MAAM;GAAE,WAAA,CAAW;GAAM,eAAA,CAAe;GAAM,SAAA,CAAS;GAAA,CAAA,EAG9E,EAAa,WAAA,EAMb,KAAK,aAAa,aAAa,KAAA,EAC/B,KAAK,UAAU,IAAI,cAAA,EAGd,KAAK,aAAa,aAAA,IAClB,KAAK,aAAa,kBAAA,IAClB,KAAK,aAAa,cAAA,IAClB,KAAK,aAAa,OAAA,IACtB,KAAK,aAAa,eAAe,OAAA,EAIlC,EAAc;GACb,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GAAA,CAAA,CACH,KACF,GAAA,CAAM,GAAM,GAAQ,GAAO,OAAA;AAE1B,QAAK,MAAM,YAAY,wBAAwB,OAAO,EAAA,CAAA,EACtD,KAAK,MAAM,YAAY,0BAA0B,OAAO,EAAA,CAAA,EACxD,KAAK,MAAM,YAAY,yBAAyB,OAAO,EAAA,CAAA;GAGvD,IAAM,IAAa;IAClB,UAAY;IACZ,SAAW;IACX,OAAS;IAAA,CACR,MAAY;AAEd,QAAK,MAAM,YAAY,wBAAwB,EAAA;IAAA,EAEhD,EAAU,KAAK,cAAA,CAAA,CACd,WAAA;;CAOH,sBAAA;AACC,MAAA,CAAK,KAAK,MAAM;GACf,IAAM,IAAc,KAAK,aAAa,MAAA;AAClC,QAAe,MAAgB,KAAK,kBACvC,KAAK,gBAAgB;;;CAKxB,QAAkB,GAAA;AACjB,QAAM,QAAQ,EAAA,EAGV,EAAkB,IAAI,OAAA,IACzB,KAAK,MAAM,KAAK,KAAK,KAAA,EAElB,EAAkB,IAAI,SAAA,IACzB,KAAK,QAAQ,KAAK,KAAK,OAAA,EAEpB,EAAkB,IAAI,QAAA,IACzB,KAAK,OAAO,KAAK,KAAK,MAAA,EAEnB,EAAkB,IAAI,UAAA,IACzB,KAAK,SAAS,KAAK,KAAK,QAAA;;CAI1B,SAAA;EACC,IAAM,IAAa;GAClB,UAAY;GACZ,SAAW;GACX,OAAS;GAAA,CACR,KAAK,YAAY,6BAGb,IAAA,EAA0B,WAAW,KAAK,OAC1C,IAAA,CAAa,KAAc,gBAAgB,KAAK,KAAK,KAAA,EACrD,IAAW,GAAY,SAAS,IAAY,GAAG,KAAK,KAAA,MAAW,KAAK,OACpE,IAAc,GAAY,QAAA,EAAqB,mBAAmB,EAAA;AAGxE,OAAK,MAAM,YAAY,wBAAwB,EAAA,EAC/C,KAAK,MAAM,YAAY,wBAAwB,OAAO,EAAA,CAAA;EAEtD,IAAM,IAAQ;GACb,wBAAwB,KAAK;GAC7B,0BAA0B,KAAK;GAC/B,yBAAyB,KAAK;GAC9B,wBAAwB;GAAA;AAOzB,SAAO,CAAI;qFAHM,KAAK,QAAQ,KAAK,iBAI4D,GAAA,SAAY,KAAK,SAAS,EAAA,CAAA;;;;;GAtLzH,EAAS;CAAE,MAAM;CAAQ,SAAA,CAAS;CAAA,CAAA,CAAA,EAAO,EAAA,WAAA,QAAA,KAAA,EAAA,EAAA,EAAA,CAOzC,EAAS;CAAE,MAAM;CAAQ,SAAA,CAAS;CAAA,CAAA,CAAA,EAAO,EAAA,WAAA,UAAA,KAAA,EAAA,EAAA,EAAA,CAOzC,EAAS;CAAE,MAAM;CAAQ,SAAA,CAAS;CAAA,CAAA,CAAA,EAAO,EAAA,WAAA,SAAA,KAAA,EAAA,EAAA,EAAA,CAOzC,EAAS;CAAE,MAAM;CAAQ,SAAA,CAAS;CAAA,CAAA,CAAA,EAAO,EAAA,WAAA,WAAA,KAAA,EAAA,EAAA,EAAA,CAQzC,EAAS;CAAE,MAAM;CAAQ,SAAA,CAAS;CAAA,CAAA,CAAA,EAAO,EAAA,WAAA,QAAA,KAAA,EAAA,EAAA,EAAA,CAQzC,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,QAAA,KAAA,EAAA,EAAA,EAAA,CAyB1B,GAAA,CAAA,EAAO,EAAA,WAAA,iBAAA,KAAA,EAAA,EAAA,IAAA,IAAA,EAAA,CAvIR,EAAc,gBAAA,CAAA,EAAgB,EAAA"}
package/dist/icons.cjs CHANGED
@@ -1 +1 @@
1
- require(`./icons-D8w_20mO.cjs`);
1
+ require(`./icons-B57_93VV.cjs`);
package/dist/icons.js CHANGED
@@ -1 +1 @@
1
- import "./icons-BpU0_l92.js";
1
+ import "./icons-BDqiGXrO.js";
@@ -1,4 +1,4 @@
1
- require(`./chunk-BCfY8kxB.cjs`);const e=require(`./tailwind.mixin-DSuEu-y3.cjs`);require(`./mixins.cjs`);let t=require(`lit/decorators.js`),n=require(`lit`);var r=class extends e.t(n.css`
1
+ require(`./chunk-BCfY8kxB.cjs`);const e=require(`./tailwind.mixin-BF1Huas7.cjs`);require(`./mixins.cjs`);let t=require(`lit/decorators.js`),n=require(`lit`);var r=class extends e.t(n.css`
2
2
  :host {
3
3
  display: block;
4
4
  }
@@ -1 +1 @@
1
- {"version":3,"file":"iframe-BjwxA2Pg.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":"6JAKA,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-DNHL3GIk.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":"6JAKA,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,4 +1,4 @@
1
- import { i as e, t } from "./tailwind.mixin-BIVhjNvD.js";
1
+ import { i as e, t } from "./tailwind.mixin-BCJOOX1_.js";
2
2
  import "./mixins.js";
3
3
  import { customElement as n, property as r, state as i } from "lit/decorators.js";
4
4
  import { css as a, html as o } from "lit";
@@ -1 +1 @@
1
- {"version":3,"file":"iframe-tY1GY5g1.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-WnWPIrBG.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"}
package/dist/iframe.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./iframe-BjwxA2Pg.cjs`);exports.SchmancyIframe=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./iframe-DNHL3GIk.cjs`);exports.SchmancyIframe=e.t;
package/dist/iframe.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as e } from "./iframe-tY1GY5g1.js";
1
+ import { t as e } from "./iframe-WnWPIrBG.js";
2
2
  export { e as SchmancyIframe };