@mhmo91/schmancy 0.9.21 → 0.9.23

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 (343) hide show
  1. package/custom-elements.json +94 -0
  2. package/dist/agent/schmancy.agent.js +426 -261
  3. package/dist/agent/schmancy.agent.js.map +1 -1
  4. package/dist/agent/schmancy.manifest.json +95 -0
  5. package/dist/{area-DBjAhgjP.cjs → area-CFLFXu0Z.cjs} +1 -1
  6. package/dist/{area-DBjAhgjP.cjs.map → area-CFLFXu0Z.cjs.map} +1 -1
  7. package/dist/{area-Dr4I9R2p.js → area-CfozaCAZ.js} +1 -1
  8. package/dist/{area-Dr4I9R2p.js.map → area-CfozaCAZ.js.map} +1 -1
  9. package/dist/area.cjs +1 -1
  10. package/dist/area.js +1 -1
  11. package/dist/{autocomplete-CgWUCUU-.js → autocomplete-BNjcQ743.js} +2 -2
  12. package/dist/{autocomplete-CgWUCUU-.js.map → autocomplete-BNjcQ743.js.map} +1 -1
  13. package/dist/{autocomplete-EM0jE7X2.cjs → autocomplete-NDvRW_Xs.cjs} +1 -1
  14. package/dist/{autocomplete-EM0jE7X2.cjs.map → autocomplete-NDvRW_Xs.cjs.map} +1 -1
  15. package/dist/autocomplete.cjs +1 -1
  16. package/dist/autocomplete.js +1 -1
  17. package/dist/badge.cjs +1 -1
  18. package/dist/badge.js +1 -1
  19. package/dist/{boat-Dw8TmOzN.js → boat-DxplbTDW.js} +1 -1
  20. package/dist/{boat-Dw8TmOzN.js.map → boat-DxplbTDW.js.map} +1 -1
  21. package/dist/{boat-BjYJI1HS.cjs → boat-ZA47HbKj.cjs} +1 -1
  22. package/dist/{boat-BjYJI1HS.cjs.map → boat-ZA47HbKj.cjs.map} +1 -1
  23. package/dist/boat.cjs +1 -1
  24. package/dist/boat.js +1 -1
  25. package/dist/breadcrumb.cjs +1 -1
  26. package/dist/breadcrumb.js +1 -1
  27. package/dist/{busy-BmiumJpB.cjs → busy-BuHEz1uo.cjs} +1 -1
  28. package/dist/{busy-BmiumJpB.cjs.map → busy-BuHEz1uo.cjs.map} +1 -1
  29. package/dist/{busy-D2hP3fOy.js → busy-QZxs4u8B.js} +1 -1
  30. package/dist/{busy-D2hP3fOy.js.map → busy-QZxs4u8B.js.map} +1 -1
  31. package/dist/busy.cjs +1 -1
  32. package/dist/busy.js +1 -1
  33. package/dist/button.cjs +1 -1
  34. package/dist/button.js +3 -3
  35. package/dist/{card-CEdgK9nb.js → card-CTUaARLm.js} +1 -1
  36. package/dist/{card-CEdgK9nb.js.map → card-CTUaARLm.js.map} +1 -1
  37. package/dist/{card-BslSqOsf.cjs → card-DtN6p1Jq.cjs} +1 -1
  38. package/dist/{card-BslSqOsf.cjs.map → card-DtN6p1Jq.cjs.map} +1 -1
  39. package/dist/card.cjs +1 -1
  40. package/dist/card.js +1 -1
  41. package/dist/charts.cjs +1 -1
  42. package/dist/charts.js +1 -1
  43. package/dist/{checkbox-Br84TiCs.js → checkbox-D4cUb1T3.js} +1 -1
  44. package/dist/{checkbox-Br84TiCs.js.map → checkbox-D4cUb1T3.js.map} +1 -1
  45. package/dist/{checkbox-DtcFMgZL.cjs → checkbox-DEKQLJYR.cjs} +1 -1
  46. package/dist/{checkbox-DtcFMgZL.cjs.map → checkbox-DEKQLJYR.cjs.map} +1 -1
  47. package/dist/checkbox.cjs +1 -1
  48. package/dist/checkbox.js +1 -1
  49. package/dist/{chips-DoCu5YQb.cjs → chips-B-27tj7O.cjs} +1 -1
  50. package/dist/{chips-DoCu5YQb.cjs.map → chips-B-27tj7O.cjs.map} +1 -1
  51. package/dist/{chips-BNYOweGm.js → chips-DhAWrSgi.js} +3 -3
  52. package/dist/{chips-BNYOweGm.js.map → chips-DhAWrSgi.js.map} +1 -1
  53. package/dist/chips.cjs +1 -1
  54. package/dist/chips.js +2 -2
  55. package/dist/{code-highlight-CI_gqXYX.js → code-highlight-DgZKqo4P.js} +1 -1
  56. package/dist/{code-highlight-CI_gqXYX.js.map → code-highlight-DgZKqo4P.js.map} +1 -1
  57. package/dist/{code-highlight-B_l8vDzn.cjs → code-highlight-_ZK6FEjF.cjs} +1 -1
  58. package/dist/{code-highlight-B_l8vDzn.cjs.map → code-highlight-_ZK6FEjF.cjs.map} +1 -1
  59. package/dist/code-highlight.cjs +1 -1
  60. package/dist/code-highlight.js +1 -1
  61. package/dist/{components-TJT8-tva.cjs → components-DUiF-_Ul.cjs} +1 -1
  62. package/dist/{components-TJT8-tva.cjs.map → components-DUiF-_Ul.cjs.map} +1 -1
  63. package/dist/{components-DjKNS9R_.js → components-JHIoVqFd.js} +1 -1
  64. package/dist/{components-DjKNS9R_.js.map → components-JHIoVqFd.js.map} +1 -1
  65. package/dist/components.cjs +1 -1
  66. package/dist/components.js +1 -1
  67. package/dist/connectivity.cjs +1 -1
  68. package/dist/connectivity.js +1 -1
  69. package/dist/content-drawer.cjs +1 -1
  70. package/dist/content-drawer.js +1 -1
  71. package/dist/context-6t-yayy3.cjs +1 -0
  72. package/dist/{context-CAYQh-mx.cjs.map → context-6t-yayy3.cjs.map} +1 -1
  73. package/dist/context-BCFNNkes.js +3 -0
  74. package/dist/{context-D8Q66KPe.js.map → context-BCFNNkes.js.map} +1 -1
  75. package/dist/{date-range-sGkC0KF3.js → date-range-B1FDRGRB.js} +2 -2
  76. package/dist/{date-range-sGkC0KF3.js.map → date-range-B1FDRGRB.js.map} +1 -1
  77. package/dist/{date-range-CIWYm3eS.cjs → date-range-CrAIk8dg.cjs} +1 -1
  78. package/dist/{date-range-CIWYm3eS.cjs.map → date-range-CrAIk8dg.cjs.map} +1 -1
  79. package/dist/date-range.cjs +1 -1
  80. package/dist/date-range.js +1 -1
  81. package/dist/{delay-DwX65fSc.js → delay-Cs0i_CpQ.js} +3 -3
  82. package/dist/{delay-DwX65fSc.js.map → delay-Cs0i_CpQ.js.map} +1 -1
  83. package/dist/{delay-Bu4WMQlV.cjs → delay-DCp_QEct.cjs} +1 -1
  84. package/dist/{delay-Bu4WMQlV.cjs.map → delay-DCp_QEct.cjs.map} +1 -1
  85. package/dist/delay.cjs +1 -1
  86. package/dist/delay.js +1 -1
  87. package/dist/{details-B8p62xmR.cjs → details-BJTR16AV.cjs} +1 -1
  88. package/dist/{details-B8p62xmR.cjs.map → details-BJTR16AV.cjs.map} +1 -1
  89. package/dist/{details-CCW52lzz.js → details-CBoXUDlQ.js} +1 -1
  90. package/dist/{details-CCW52lzz.js.map → details-CBoXUDlQ.js.map} +1 -1
  91. package/dist/details.cjs +1 -1
  92. package/dist/details.js +1 -1
  93. package/dist/dialog.cjs +1 -1
  94. package/dist/dialog.js +1 -1
  95. package/dist/{divider-JyyFw_3J.cjs → divider-D6MRonTS.cjs} +1 -1
  96. package/dist/{divider-JyyFw_3J.cjs.map → divider-D6MRonTS.cjs.map} +1 -1
  97. package/dist/{divider-CbEWg3G_.js → divider-DivkYKa_.js} +1 -1
  98. package/dist/{divider-CbEWg3G_.js.map → divider-DivkYKa_.js.map} +1 -1
  99. package/dist/divider.cjs +1 -1
  100. package/dist/divider.js +1 -1
  101. package/dist/dropdown.cjs +1 -1
  102. package/dist/dropdown.js +2 -2
  103. package/dist/{expand-bFa_qVDT.js → expand-BvAVo29n.js} +2 -2
  104. package/dist/{expand-bFa_qVDT.js.map → expand-BvAVo29n.js.map} +1 -1
  105. package/dist/{expand-BmwIPNjq.cjs → expand-Dd0H6y8Z.cjs} +1 -1
  106. package/dist/{expand-BmwIPNjq.cjs.map → expand-Dd0H6y8Z.cjs.map} +1 -1
  107. package/dist/expand.cjs +1 -1
  108. package/dist/expand.js +1 -1
  109. package/dist/{extra-HwbaUnCD.js → extra-0MZSXbOH.js} +1 -1
  110. package/dist/{extra-HwbaUnCD.js.map → extra-0MZSXbOH.js.map} +1 -1
  111. package/dist/{extra-BUgyMgjl.cjs → extra-CdOUiB0K.cjs} +1 -1
  112. package/dist/{extra-BUgyMgjl.cjs.map → extra-CdOUiB0K.cjs.map} +1 -1
  113. package/dist/extra.cjs +1 -1
  114. package/dist/extra.js +1 -1
  115. package/dist/{float-BQwhfibw.cjs → float-ByW-Gth3.cjs} +1 -1
  116. package/dist/{float-BQwhfibw.cjs.map → float-ByW-Gth3.cjs.map} +1 -1
  117. package/dist/{float-D5ezUurt.js → float-D_u8mDNa.js} +1 -1
  118. package/dist/{float-D5ezUurt.js.map → float-D_u8mDNa.js.map} +1 -1
  119. package/dist/float.cjs +1 -1
  120. package/dist/float.js +1 -1
  121. package/dist/handover/agent-runtime-followups.md +1 -1
  122. package/dist/handover/agent-runtime-v1.md +3 -3
  123. package/dist/handover/agent-runtime-v2-loopback.md +71 -0
  124. package/dist/handover/claude-design-brief.md +166 -0
  125. package/dist/handover/claude-design-v2-paste.md +42 -0
  126. package/dist/{icons-C5-DIjet.js → icons-24zlLf1q.js} +2 -2
  127. package/dist/{icons-C5-DIjet.js.map → icons-24zlLf1q.js.map} +1 -1
  128. package/dist/{icons-B6V3nZ4-.cjs → icons-BpHN4Z8q.cjs} +1 -1
  129. package/dist/{icons-B6V3nZ4-.cjs.map → icons-BpHN4Z8q.cjs.map} +1 -1
  130. package/dist/icons.cjs +1 -1
  131. package/dist/icons.js +1 -1
  132. package/dist/{iframe-C7sHg7RC.cjs → iframe-BXzYZu9_.cjs} +1 -1
  133. package/dist/{iframe-C7sHg7RC.cjs.map → iframe-BXzYZu9_.cjs.map} +1 -1
  134. package/dist/{iframe-BXBsuLwt.js → iframe-B_QrvTmj.js} +1 -1
  135. package/dist/{iframe-BXBsuLwt.js.map → iframe-B_QrvTmj.js.map} +1 -1
  136. package/dist/iframe.cjs +1 -1
  137. package/dist/iframe.js +1 -1
  138. package/dist/index.cjs +1 -1
  139. package/dist/index.js +52 -51
  140. package/dist/{input-chip-CiG61y-N.js → input-chip-C09B0L1y.js} +1 -1
  141. package/dist/{input-chip-CiG61y-N.js.map → input-chip-C09B0L1y.js.map} +1 -1
  142. package/dist/{input-chip-p24lkYtY.cjs → input-chip-FZEpuSaX.cjs} +1 -1
  143. package/dist/{input-chip-p24lkYtY.cjs.map → input-chip-FZEpuSaX.cjs.map} +1 -1
  144. package/dist/json.cjs +1 -1
  145. package/dist/json.js +2 -2
  146. package/dist/kbd.cjs +1 -1
  147. package/dist/kbd.js +1 -1
  148. package/dist/{layout-B0_IXfov.cjs → layout-Bst19YG8.cjs} +1 -1
  149. package/dist/{layout-B0_IXfov.cjs.map → layout-Bst19YG8.cjs.map} +1 -1
  150. package/dist/{layout-Cqghi_rx.js → layout-aTtUdGAi.js} +2 -2
  151. package/dist/{layout-Cqghi_rx.js.map → layout-aTtUdGAi.js.map} +1 -1
  152. package/dist/layout.cjs +1 -1
  153. package/dist/layout.js +2 -2
  154. package/dist/{lightbox-CnCTvqSu.js → lightbox-Cb5-XPWV.js} +2 -2
  155. package/dist/{lightbox-CnCTvqSu.js.map → lightbox-Cb5-XPWV.js.map} +1 -1
  156. package/dist/{lightbox-BWKTzA03.cjs → lightbox-Dk2ICCBB.cjs} +1 -1
  157. package/dist/{lightbox-BWKTzA03.cjs.map → lightbox-Dk2ICCBB.cjs.map} +1 -1
  158. package/dist/lightbox.cjs +1 -1
  159. package/dist/lightbox.js +1 -1
  160. package/dist/{list-CMWHu6cV.cjs → list-DBiecR1i.cjs} +1 -1
  161. package/dist/{list-CMWHu6cV.cjs.map → list-DBiecR1i.cjs.map} +1 -1
  162. package/dist/{list-BpjKUOzM.js → list-DZWoCb3V.js} +2 -2
  163. package/dist/{list-BpjKUOzM.js.map → list-DZWoCb3V.js.map} +1 -1
  164. package/dist/list.cjs +1 -1
  165. package/dist/list.js +1 -1
  166. package/dist/{litElement.mixin-BnNYZ24e.js → litElement.mixin-BuZ28ZzP.js} +1 -1
  167. package/dist/{litElement.mixin-BnNYZ24e.js.map → litElement.mixin-BuZ28ZzP.js.map} +1 -1
  168. package/dist/{litElement.mixin-CtQOmwq6.cjs → litElement.mixin-lYlKxxjR.cjs} +1 -1
  169. package/dist/{litElement.mixin-CtQOmwq6.cjs.map → litElement.mixin-lYlKxxjR.cjs.map} +1 -1
  170. package/dist/{mailbox-Tg1CROVz.cjs → mailbox-BYNmcNIM.cjs} +1 -1
  171. package/dist/{mailbox-Tg1CROVz.cjs.map → mailbox-BYNmcNIM.cjs.map} +1 -1
  172. package/dist/{mailbox-CHIpxS3W.js → mailbox-laG7nvXl.js} +4 -4
  173. package/dist/{mailbox-CHIpxS3W.js.map → mailbox-laG7nvXl.js.map} +1 -1
  174. package/dist/mailbox.cjs +1 -1
  175. package/dist/mailbox.js +1 -1
  176. package/dist/{map-Z_dsu-dv.cjs → map-7_cexh1e.cjs} +1 -1
  177. package/dist/{map-Z_dsu-dv.cjs.map → map-7_cexh1e.cjs.map} +1 -1
  178. package/dist/{map-YY1Q4FWO.js → map-YSAPFrH9.js} +1 -1
  179. package/dist/{map-YY1Q4FWO.js.map → map-YSAPFrH9.js.map} +1 -1
  180. package/dist/map.cjs +1 -1
  181. package/dist/map.js +1 -1
  182. package/dist/{menu-BIBUgS1T.js → menu-DeNdlsSV.js} +1 -1
  183. package/dist/{menu-BIBUgS1T.js.map → menu-DeNdlsSV.js.map} +1 -1
  184. package/dist/{menu-DS8Iz4fJ.cjs → menu-RaeiF4Ja.cjs} +1 -1
  185. package/dist/{menu-DS8Iz4fJ.cjs.map → menu-RaeiF4Ja.cjs.map} +1 -1
  186. package/dist/menu.cjs +1 -1
  187. package/dist/menu.js +1 -1
  188. package/dist/metric.cjs +69 -0
  189. package/dist/metric.cjs.map +1 -0
  190. package/dist/metric.js +93 -0
  191. package/dist/metric.js.map +1 -0
  192. package/dist/mixins.cjs +1 -1
  193. package/dist/mixins.js +2 -2
  194. package/dist/nav-drawer.cjs +1 -1
  195. package/dist/nav-drawer.js +1 -1
  196. package/dist/navigation-bar.cjs +1 -1
  197. package/dist/navigation-bar.js +1 -1
  198. package/dist/navigation-rail.cjs +1 -1
  199. package/dist/navigation-rail.js +1 -1
  200. package/dist/{notification-ChAvNXf3.js → notification-DRPjMDli.js} +2 -2
  201. package/dist/{notification-ChAvNXf3.js.map → notification-DRPjMDli.js.map} +1 -1
  202. package/dist/{notification-DPUkuifB.cjs → notification-DqWW2oh9.cjs} +1 -1
  203. package/dist/{notification-DPUkuifB.cjs.map → notification-DqWW2oh9.cjs.map} +1 -1
  204. package/dist/notification.cjs +1 -1
  205. package/dist/notification.js +1 -1
  206. package/dist/{option-OIp0joyN.cjs → option-1lYctKVI.cjs} +1 -1
  207. package/dist/{option-OIp0joyN.cjs.map → option-1lYctKVI.cjs.map} +1 -1
  208. package/dist/{option-Ci7C8xxh.js → option-N3wlHTc9.js} +1 -1
  209. package/dist/{option-Ci7C8xxh.js.map → option-N3wlHTc9.js.map} +1 -1
  210. package/dist/option.cjs +1 -1
  211. package/dist/option.js +1 -1
  212. package/dist/overlay.cjs +1 -1
  213. package/dist/overlay.js +1 -1
  214. package/dist/page.cjs +1 -1
  215. package/dist/page.js +2 -2
  216. package/dist/{progress-DGkwPgDX.js → progress-DhcXo8r-.js} +1 -1
  217. package/dist/{progress-DGkwPgDX.js.map → progress-DhcXo8r-.js.map} +1 -1
  218. package/dist/{progress-32Cad1NX.cjs → progress-YOuASkdz.cjs} +1 -1
  219. package/dist/{progress-32Cad1NX.cjs.map → progress-YOuASkdz.cjs.map} +1 -1
  220. package/dist/progress.cjs +1 -1
  221. package/dist/progress.js +1 -1
  222. package/dist/{provide-MvHcXKzT.cjs → provide-B7b5TOCD.cjs} +1 -1
  223. package/dist/{provide-MvHcXKzT.cjs.map → provide-B7b5TOCD.cjs.map} +1 -1
  224. package/dist/{provide-BuzyBLGj.js → provide-uCFRzgWs.js} +1 -1
  225. package/dist/{provide-BuzyBLGj.js.map → provide-uCFRzgWs.js.map} +1 -1
  226. package/dist/qr-scanner.cjs +1 -1
  227. package/dist/qr-scanner.js +1 -1
  228. package/dist/{radio-group-B7DuNxUq.cjs → radio-group-DYvIgv3P.cjs} +1 -1
  229. package/dist/{radio-group-B7DuNxUq.cjs.map → radio-group-DYvIgv3P.cjs.map} +1 -1
  230. package/dist/{radio-group-B72sYGnS.js → radio-group-DchZApJl.js} +1 -1
  231. package/dist/{radio-group-B72sYGnS.js.map → radio-group-DchZApJl.js.map} +1 -1
  232. package/dist/radio-group.cjs +1 -1
  233. package/dist/radio-group.js +1 -1
  234. package/dist/range.cjs +1 -1
  235. package/dist/range.js +1 -1
  236. package/dist/{scroll-V1rAZ9fK.cjs → scroll-BKn4essm.cjs} +1 -1
  237. package/dist/{scroll-V1rAZ9fK.cjs.map → scroll-BKn4essm.cjs.map} +1 -1
  238. package/dist/{scroll-CdmXRXh2.js → scroll-G2YnteF9.js} +1 -1
  239. package/dist/{scroll-CdmXRXh2.js.map → scroll-G2YnteF9.js.map} +1 -1
  240. package/dist/{select-wFDKDLQI.js → select-Bydjuia9.js} +1 -1
  241. package/dist/{select-wFDKDLQI.js.map → select-Bydjuia9.js.map} +1 -1
  242. package/dist/{select-DFxoBgEf.cjs → select-CQGKkEZc.cjs} +1 -1
  243. package/dist/{select-DFxoBgEf.cjs.map → select-CQGKkEZc.cjs.map} +1 -1
  244. package/dist/select.cjs +1 -1
  245. package/dist/select.js +1 -1
  246. package/dist/{sheet-DdlZhnDG.cjs → sheet-BCxpHT62.cjs} +1 -1
  247. package/dist/{sheet-DdlZhnDG.cjs.map → sheet-BCxpHT62.cjs.map} +1 -1
  248. package/dist/{sheet-LFVo5iN4.js → sheet-DGfh9VSs.js} +3 -3
  249. package/dist/{sheet-LFVo5iN4.js.map → sheet-DGfh9VSs.js.map} +1 -1
  250. package/dist/sheet.cjs +1 -1
  251. package/dist/sheet.js +2 -2
  252. package/dist/{sheet.service-BfNDB0K0.cjs → sheet.service-B-RxqhpO.cjs} +1 -1
  253. package/dist/{sheet.service-BfNDB0K0.cjs.map → sheet.service-B-RxqhpO.cjs.map} +1 -1
  254. package/dist/{sheet.service-DQE7-_wq.js → sheet.service-Dy_fwQqQ.js} +1 -1
  255. package/dist/{sheet.service-DQE7-_wq.js.map → sheet.service-Dy_fwQqQ.js.map} +1 -1
  256. package/dist/skeleton.cjs +1 -1
  257. package/dist/skeleton.js +1 -1
  258. package/dist/skills/SKILL.md +1 -1
  259. package/dist/skills/schmancy/SKILL.md +1 -1
  260. package/dist/slider.cjs +1 -1
  261. package/dist/slider.js +1 -1
  262. package/dist/{splash-screen-DteUfSV3.cjs → splash-screen-C2xsOEdx.cjs} +1 -1
  263. package/dist/{splash-screen-DteUfSV3.cjs.map → splash-screen-C2xsOEdx.cjs.map} +1 -1
  264. package/dist/{splash-screen-BHgb3c3Q.js → splash-screen-Clv-5vsb.js} +1 -1
  265. package/dist/{splash-screen-BHgb3c3Q.js.map → splash-screen-Clv-5vsb.js.map} +1 -1
  266. package/dist/splash-screen.cjs +1 -1
  267. package/dist/splash-screen.js +1 -1
  268. package/dist/{src-sG7Ihf0e.cjs → src-Ci10_Iwf.cjs} +1 -1
  269. package/dist/{src-sG7Ihf0e.cjs.map → src-Ci10_Iwf.cjs.map} +1 -1
  270. package/dist/{src-Dw-PjtMH.js → src-DNuhxDig.js} +40 -39
  271. package/dist/{src-Dw-PjtMH.js.map → src-DNuhxDig.js.map} +1 -1
  272. package/dist/steps.cjs +1 -1
  273. package/dist/steps.js +3 -3
  274. package/dist/{surface-0XM4DBaT.js → surface-BWcq30OL.js} +2 -2
  275. package/dist/{surface-0XM4DBaT.js.map → surface-BWcq30OL.js.map} +1 -1
  276. package/dist/{surface-B6DA01kL.cjs → surface-fEmoN08Y.cjs} +1 -1
  277. package/dist/{surface-B6DA01kL.cjs.map → surface-fEmoN08Y.cjs.map} +1 -1
  278. package/dist/surface.cjs +1 -1
  279. package/dist/surface.js +1 -1
  280. package/dist/switch.cjs +1 -1
  281. package/dist/switch.js +1 -1
  282. package/dist/{table-Dwt66SR6.js → table-B8H-zioX.js} +1 -1
  283. package/dist/{table-Dwt66SR6.js.map → table-B8H-zioX.js.map} +1 -1
  284. package/dist/{table-DFlJhG5E.cjs → table-ChHS4xby.cjs} +1 -1
  285. package/dist/{table-DFlJhG5E.cjs.map → table-ChHS4xby.cjs.map} +1 -1
  286. package/dist/table.cjs +1 -1
  287. package/dist/table.js +1 -1
  288. package/dist/{tabs-C7r4TqcX.js → tabs-DB5kSuGL.js} +2 -2
  289. package/dist/{tabs-C7r4TqcX.js.map → tabs-DB5kSuGL.js.map} +1 -1
  290. package/dist/{tabs-DZaLZUBy.cjs → tabs-DGmbqqBD.cjs} +1 -1
  291. package/dist/{tabs-DZaLZUBy.cjs.map → tabs-DGmbqqBD.cjs.map} +1 -1
  292. package/dist/tabs.cjs +1 -1
  293. package/dist/tabs.js +1 -1
  294. package/dist/tailwind.mixin-BHX99hgX.cjs +2 -0
  295. package/dist/{tailwind.mixin-Bh58QnlW.cjs.map → tailwind.mixin-BHX99hgX.cjs.map} +1 -1
  296. package/dist/tailwind.mixin-DIEGVcl3.js +219 -0
  297. package/dist/{tailwind.mixin-H5Pn7vSJ.js.map → tailwind.mixin-DIEGVcl3.js.map} +1 -1
  298. package/dist/teleport.cjs +1 -1
  299. package/dist/teleport.js +1 -1
  300. package/dist/{textarea-B2544vx9.cjs → textarea-CfQnghhD.cjs} +1 -1
  301. package/dist/{textarea-B2544vx9.cjs.map → textarea-CfQnghhD.cjs.map} +1 -1
  302. package/dist/{textarea-CS-KdSLz.js → textarea-O9A58OZA.js} +1 -1
  303. package/dist/{textarea-CS-KdSLz.js.map → textarea-O9A58OZA.js.map} +1 -1
  304. package/dist/textarea.cjs +1 -1
  305. package/dist/textarea.js +1 -1
  306. package/dist/{theme-DU5yXaV-.cjs → theme-BjnQjhR0.cjs} +1 -1
  307. package/dist/{theme-DU5yXaV-.cjs.map → theme-BjnQjhR0.cjs.map} +1 -1
  308. package/dist/{theme-Cq_c9IO3.js → theme-DvCKLRkt.js} +3 -3
  309. package/dist/{theme-Cq_c9IO3.js.map → theme-DvCKLRkt.js.map} +1 -1
  310. package/dist/{theme-button-OJl2ma0u.js → theme-button-ByImreDw.js} +1 -1
  311. package/dist/{theme-button-OJl2ma0u.js.map → theme-button-ByImreDw.js.map} +1 -1
  312. package/dist/{theme-button-CPujUbgV.cjs → theme-button-CaxDEneM.cjs} +1 -1
  313. package/dist/{theme-button-CPujUbgV.cjs.map → theme-button-CaxDEneM.cjs.map} +1 -1
  314. package/dist/theme-button.cjs +1 -1
  315. package/dist/theme-button.js +1 -1
  316. package/dist/theme.cjs +1 -1
  317. package/dist/theme.js +2 -2
  318. package/dist/tree.cjs +1 -1
  319. package/dist/tree.js +1 -1
  320. package/dist/typewriter.cjs +1 -1
  321. package/dist/typewriter.js +3 -3
  322. package/dist/typography.cjs +1 -1
  323. package/dist/typography.js +1 -1
  324. package/dist/visually-hidden.cjs +1 -1
  325. package/dist/visually-hidden.js +1 -1
  326. package/dist/{window-Cjv2GqSN.cjs → window-BhrSdbk2.cjs} +1 -1
  327. package/dist/{window-Cjv2GqSN.cjs.map → window-BhrSdbk2.cjs.map} +1 -1
  328. package/dist/{window-BWecg8Ih.js → window-C8kImMiI.js} +1 -1
  329. package/dist/{window-BWecg8Ih.js.map → window-C8kImMiI.js.map} +1 -1
  330. package/dist/window.cjs +1 -1
  331. package/dist/window.js +1 -1
  332. package/package.json +1 -1
  333. package/skills/schmancy/SKILL.md +1 -1
  334. package/src/index.ts +1 -0
  335. package/src/metric/index.ts +1 -0
  336. package/src/metric/metric.ts +127 -0
  337. package/types/src/index.d.ts +1 -0
  338. package/types/src/metric/index.d.ts +1 -0
  339. package/types/src/metric/metric.d.ts +39 -0
  340. package/dist/context-CAYQh-mx.cjs +0 -1
  341. package/dist/context-D8Q66KPe.js +0 -3
  342. package/dist/tailwind.mixin-Bh58QnlW.cjs +0 -2
  343. package/dist/tailwind.mixin-H5Pn7vSJ.js +0 -219
package/dist/extra.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./extra-BUgyMgjl.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-CdOUiB0K.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-HwbaUnCD.js";
1
+ import { n as e, t } from "./extra-0MZSXbOH.js";
2
2
  export { e as SchmancyCountriesSelect, t as SchmancyTimezonesSelect };
@@ -1 +1 @@
1
- require(`./chunk-CncqDLb2.cjs`);const e=require(`./decorate-F9CuyeHg.cjs`),t=require(`./window-Cjv2GqSN.cjs`);let n=require(`lit/decorators.js`);var r=class extends t.t{},i=r=e.t([(0,n.customElement)(`schmancy-float`)],r);Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return i}});
1
+ require(`./chunk-CncqDLb2.cjs`);const e=require(`./decorate-F9CuyeHg.cjs`),t=require(`./window-BhrSdbk2.cjs`);let n=require(`lit/decorators.js`);var r=class extends t.t{},i=r=e.t([(0,n.customElement)(`schmancy-float`)],r);Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return i}});
@@ -1 +1 @@
1
- {"version":3,"file":"float-BQwhfibw.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":"iJAWe,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-ByW-Gth3.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":"iJAWe,IAAA,EAAA,cAA4B,EAAA,CAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAD5B,iBAAA,CAAA,CAAiB,EAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./decorate-D_utPUsC.js";
2
- import { t } from "./window-BWecg8Ih.js";
2
+ import { t } from "./window-C8kImMiI.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-D5ezUurt.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-D_u8mDNa.js","names":[],"sources":["../src/float/float.ts"],"sourcesContent":["/**\n * Backward compatibility alias — schmancy-float is now schmancy-window.\n *\n * Existing consumers using <schmancy-float> continue to work.\n * New code should use <schmancy-window> directly.\n */\n\nimport { customElement } from 'lit/decorators.js'\nimport SchmancyWindow from '../window/window.js'\n\n@customElement('schmancy-float')\nexport default class SchmancyFloat extends SchmancyWindow {}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-float': SchmancyFloat\n\t}\n}\n"],"mappings":";;;AAWe,IAAA,IAAA,cAA4B,EAAA,IAAA,IAAA,IAAA,EAAA,CAD1C,EAAc,iBAAA,CAAA,EAAiB,EAAA;AAAA,SAAA,KAAA"}
package/dist/float.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./float-BQwhfibw.cjs`);exports.SchmancyFloat=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./float-ByW-Gth3.cjs`);exports.SchmancyFloat=e.t;
package/dist/float.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as e } from "./float-D5ezUurt.js";
1
+ import { t as e } from "./float-D_u8mDNa.js";
2
2
  export { e as SchmancyFloat };
@@ -203,7 +203,7 @@ The manifest already has everything needed; the package is just the JSON-RPC wra
203
203
 
204
204
  **Problem.** `handover/agent-runtime-v1.md` had `<PENDING>` placeholders that we manually replaced with `0.9.13` after the first publish. Future handover docs will have the same issue.
205
205
 
206
- **Fix.** A build step that substitutes `0.9.21` in `handover/**/*.md` against `package.json`'s `version` field on every build. `dist/handover/**/*.md` gets the rendered version; the source stays templated.
206
+ **Fix.** A build step that substitutes `0.9.23` in `handover/**/*.md` against `package.json`'s `version` field on every build. `dist/handover/**/*.md` gets the rendered version; the source stays templated.
207
207
 
208
208
  **Effort:** ~30 min (one sed step or a tiny script).
209
209
 
@@ -7,8 +7,8 @@
7
7
  ## The URLs you asked for
8
8
 
9
9
  ```
10
- https://esm.sh/@mhmo91/schmancy/agent@0.9.21
11
- https://esm.sh/@mhmo91/schmancy/agent/manifest@0.9.21
10
+ https://esm.sh/@mhmo91/schmancy/agent@0.9.23
11
+ https://esm.sh/@mhmo91/schmancy/agent/manifest@0.9.23
12
12
  ```
13
13
 
14
14
  `0.9.13` is the first release containing `/agent`; every subsequent publish serves the same subpath. `npm view @mhmo91/schmancy version` always returns the current pin if you want to float forward.
@@ -20,7 +20,7 @@ One script tag. No bundler, no bare specifiers, no npm install.
20
20
  ```html
21
21
  <!doctype html>
22
22
  <script type="module">
23
- import { $dialog, theme } from 'https://esm.sh/@mhmo91/schmancy/agent@0.9.21';
23
+ import { $dialog, theme } from 'https://esm.sh/@mhmo91/schmancy/agent@0.9.23';
24
24
  </script>
25
25
  <schmancy-theme root scheme="dark">
26
26
  <schmancy-surface type="solid" fill="all">
@@ -0,0 +1,71 @@
1
+ # Handover follow-up: schmancy agent runtime v2 loop-back
2
+
3
+ **From:** schmancy maintainers
4
+ **To:** Claude Design agent
5
+ **Status:** ready for loop-back validation when the PRs linked below merge and publish
6
+ **Parent:** [`agent-runtime-v1.md`](./agent-runtime-v1.md), [`agent-runtime-followups.md`](./agent-runtime-followups.md)
7
+
8
+ ## What changed since v0.9.13
9
+
10
+ Four separable PRs, each shippable on its own:
11
+
12
+ | # | Title | Branch | Impact on your probe |
13
+ |---|---|---|---|
14
+ | 2 | CI smoke-test gate | `feat/ci-gate-and-version-templating` | None user-facing. `window.schmancy.help()` regressions now fail-closed at publish time instead of shipping silently. |
15
+ | 9 | `0.9.23` templating for handover docs | same branch as #2 | None user-facing. Future handover docs will have live esm.sh URLs instead of `<PENDING>` placeholders. |
16
+ | 3 | JSDoc backfill (46 components) | `feat/jsdoc-batch-{1,2,3}-*` | **This is what you'll notice.** Every form-control, container, and overlay/nav component now ships `@summary`, `@example`, and `@platform` tags in its manifest entry. `window.schmancy.help('schmancy-button')` returns a non-empty `summary`, a copy-pastable `examples[]`, and a `platformPrimitive` hint for graceful degradation. |
17
+ | 1 | Lazy vendor chunks | `feat/lazy-{typewriter,code-highlight,qr-scanner}` | Pages that don't render `<schmancy-code>`, `<schmancy-qr-scanner>`, or `<schmancy-typewriter>` no longer fetch `vendor-highlight`, `vendor-jsqr`, or the typewriter chunk on first paint. ~68 KB gzipped saved on cold starts for typical prototypes. |
18
+
19
+ The only one that changes the shape of `window.schmancy` is **#3**. The others are infra / perf.
20
+
21
+ ## Pinned URLs (live once the PRs merge)
22
+
23
+ ```
24
+ https://esm.sh/@mhmo91/schmancy/agent@0.9.23
25
+ https://esm.sh/@mhmo91/schmancy/agent/manifest@0.9.23
26
+ ```
27
+
28
+ `0.9.23` is substituted at publish time — see [`agent-runtime-followups.md`](./agent-runtime-followups.md) #9. Until the PRs land, continue pinning `@0.9.14` (the last published version at time of writing).
29
+
30
+ ## Minimum loop-back test
31
+
32
+ ```html
33
+ <!doctype html>
34
+ <script type="module">
35
+ import 'https://esm.sh/@mhmo91/schmancy/agent@0.9.23';
36
+ </script>
37
+
38
+ <schmancy-theme root scheme="dark">
39
+ <schmancy-surface type="solid" fill="all">
40
+ <schmancy-button variant="filled">Hi</schmancy-button>
41
+ <schmancy-skill></schmancy-skill>
42
+ </schmancy-surface>
43
+ </schmancy-theme>
44
+
45
+ <script>
46
+ // Expected after the JSDoc backfill lands:
47
+ // - summary: non-empty ("Trigger actions or navigate. Form-associated; …")
48
+ // - examples: array with at least one <schmancy-button variant="filled"> snippet
49
+ // - platformPrimitive: { tag: 'button', mode: 'click', note: 'Schmancy-skinned native <button>…' }
50
+ const help = window.schmancy.help('schmancy-button');
51
+ console.log(help.summary, help.examples, help.platformPrimitive);
52
+
53
+ // Capability probe unchanged from v1
54
+ console.log(window.schmancy.capabilities());
55
+ </script>
56
+ ```
57
+
58
+ ## What to report back
59
+
60
+ If anything surprises you, open an issue at `github.com/mhmo91/schmancy` with:
61
+ - The `window.schmancy.capabilities()` output from your sandbox
62
+ - Which component's `help()` surface looks wrong (empty summary, missing example, unexpected platform hint)
63
+ - The manifest schema version: `window.schmancy.manifest.schemaVersion`
64
+
65
+ Components that still have gaps after this pass — icons, tooltips, maps, charts, table internals — are on the long tail of the JSDoc campaign. They're not blockers; `help()` returns a class description when no `@summary` is present, so the response shape is still valid, just less useful.
66
+
67
+ ## What did NOT ship
68
+
69
+ - **Theme service lazy-load.** ADR 0014 in the parent monorepo (`docs/adr/0014-lazy-vendor-chunks-in-schmancy-agent.md`) specifically defers this — the synchronous `theme.value` contract is load-bearing for every downstream consumer. Needs a separate ADR + migration plan.
70
+ - **Network-log regression guard.** Proposed in ADR 0014 as a Playwright assertion that a theme-only page loads zero `vendor-*` chunks. Requires a built-bundle test harness (existing tests use the dev bundle). Deferred to a follow-up; the CI smoke-test gate catches the class of regression that matters most.
71
+ - **MCP adapter package.** Tracked as follow-up #7. Ship it only when a concrete MCP consumer asks for it — writing the adapter without a real integration partner tends to produce a wrong API.
@@ -0,0 +1,166 @@
1
+ # Claude Design brief: building with schmancy
2
+
3
+ You're designing or redesigning a web page. Use the `@mhmo91/schmancy` component library for every interactive tag, every surface, every color.
4
+
5
+ ## Rule 0 — before anything else, probe the runtime
6
+
7
+ ```js
8
+ window.schmancy.help()
9
+ // → { elements: [{ tag, summary }...], services: [{ name, summary }...] }
10
+ ```
11
+
12
+ **Every time you reach for a "missing" component, grep this list first.** A previous Claude Design session filed seven "missing primitive" complaints; four of the seven already existed (`<schmancy-badge>`, `<schmancy-avatar>`, `<schmancy-steps>`, `<schmancy-divider vertical>`). Hand-rolling a component that already ships wastes your effort and diverges from the theme system.
13
+
14
+ When in doubt, the order is:
15
+
16
+ 1. `window.schmancy.help()` — scan the `elements[]` summaries for a tag that fits what you're about to build.
17
+ 2. `window.schmancy.help('schmancy-<tag>')` — exact attributes, enum values, events, slots, copy-pasteable examples.
18
+ 3. **Only then** compose from primitives or roll a custom element.
19
+
20
+ Every custom component you write that duplicates an existing `<schmancy-*>` tag is a regression.
21
+
22
+ ## Pin URL
23
+
24
+ ```
25
+ https://cdn.jsdelivr.net/npm/@mhmo91/schmancy@0.9.22/dist/agent/schmancy.agent.js
26
+ ```
27
+
28
+ One script tag installs 100+ `<schmancy-*>` custom elements plus the `window.schmancy.*` discovery API. No bundler, no npm install, no bare specifiers.
29
+
30
+ ## App shell (always this shape)
31
+
32
+ ```html
33
+ <!doctype html>
34
+ <script type="module">
35
+ import 'https://cdn.jsdelivr.net/npm/@mhmo91/schmancy@0.9.22/dist/agent/schmancy.agent.js';
36
+ </script>
37
+
38
+ <schmancy-theme root scheme="dark">
39
+ <schmancy-surface type="solid" fill="all">
40
+ <!-- your page content -->
41
+ <schmancy-skill></schmancy-skill>
42
+ </schmancy-surface>
43
+ </schmancy-theme>
44
+ ```
45
+
46
+ - `<schmancy-theme>` generates a Material 3 palette from a seed color + scheme. Attribute `root` publishes tokens onto `document.body`.
47
+ - `<schmancy-surface>` picks up theme tokens for background / on-color / elevation. Nest surfaces for hierarchical color stacking.
48
+ - `<schmancy-skill>` (drop once on the page) installs `window.schmancy.help()`, `.tokens()`, `.capabilities()`, etc.
49
+
50
+ ## Discovery API surface
51
+
52
+ ```js
53
+ window.schmancy.help()
54
+ // → { elements: [...], services: [...] } — every tag and service with a one-line summary
55
+
56
+ window.schmancy.help('schmancy-button')
57
+ // → full declaration: attributes (with enum values[]), events, slots,
58
+ // cssParts, cssProperties, examples (copy-pasteable), platformPrimitive
59
+
60
+ window.schmancy.tokens()
61
+ // → every --schmancy-sys-color-* custom property name
62
+
63
+ window.schmancy.capabilities()
64
+ // → { popover, declarativeShadowDom, scopedRegistries, trustedTypes,
65
+ // cssRegisteredProperties, elementInternalsAria, formAssociated,
66
+ // adoptedStyleSheets }
67
+ ```
68
+
69
+ `help(tag)` is authoritative. Its `examples[]` array is copy-pasteable. Its `platformPrimitive` hint tells you what native element the tag semantically wraps, so you can degrade gracefully if a tag fails to register.
70
+
71
+ ## Common "I need this" → use this existing tag
72
+
73
+ | Need | Existing tag | Notes |
74
+ |---|---|---|
75
+ | Status pill, count chip, warning label | `<schmancy-badge>` | `tone`, `size`, `shape`, icon slot |
76
+ | Initials circle, user chip | `<schmancy-avatar>` | `initials` / `src` / `icon`, 6 sizes, color, shape, status dot |
77
+ | Filter chips at the top of a list | `<schmancy-chips>` + `<schmancy-filter-chip>` | Multi-select, `change` event |
78
+ | Stepped workflow / stage rail | `<schmancy-steps>` + `<schmancy-step>` | `position`, `completed`, lock-back |
79
+ | Vertical or horizontal rule | `<schmancy-divider vertical>` | Single tag, boolean attribute |
80
+ | Side panel / drawer with body preview | `sheet.open({ component, position })` | Imperative service; handles backdrop + focus trap + router |
81
+ | Modal confirm | `$dialog.confirm({ title, message, confirmText, cancelText })` | Imperative — do not roll your own dialog element |
82
+ | Toast / snackbar | `$notify.success('…')` / `.error()` / `.info()` | Imperative |
83
+ | List of similarly-shaped rows | `<schmancy-list>` + `<schmancy-list-item>` | `leading` / `trailing` slots |
84
+ | Card with media + body + action row | `<schmancy-card>` + `-card-media` + `-card-content` + `-card-action` | Full stack pre-styled |
85
+ | Typography | `<schmancy-typography type="…" token="…">` | 5 types × 3 tokens |
86
+
87
+ If you're unsure a tag exists, call `help()`. Never ship a hand-rolled equivalent.
88
+
89
+ ## Rules
90
+
91
+ 1. **Every UI tag is `<schmancy-*>`.** `<button>` → `<schmancy-button>`. `<input>` → `<schmancy-input>`. `<li>` → `<schmancy-list-item>`.
92
+ 2. **Colors: Tailwind utility classes against schmancy tokens.** Every `--schmancy-sys-color-*` token is exposed as a Tailwind color utility.
93
+ - `bg-primary-default`, `bg-primary-container`, `text-primary-on`
94
+ - `bg-surface-default`, `bg-surface-low`, `bg-surface-high`, `text-surface-on`, `text-surface-onVariant`
95
+ - `border-outline`, `border-outline-variant`
96
+ - `bg-secondary-container`, `bg-error-default`, `bg-success-default`, `bg-warning-default`
97
+ - **Never hex (`#6200ee`), never arbitrary values (`bg-[#ff0000]`).** Both defeat theming.
98
+ 3. **Forms:** wrap form controls in `<schmancy-form>`. Its `submit` event fires with a `FormData` payload — no manual walking of inputs. Every form control is form-associated via `ElementInternals`, so `new FormData(form)` just works.
99
+ 4. **Layout:**
100
+ - `<schmancy-page rows="auto_1fr_auto">` for app shell — fills viewport, suppresses double-tap zoom and pull-to-refresh.
101
+ - `<schmancy-nav-drawer>` for responsive sidebar + app-bar + content (persistent on desktop, modal on mobile).
102
+ - `<schmancy-scroll>` when you need debounced scroll events or hidden scrollbars.
103
+ - Use Tailwind's `grid` / `flex` utilities directly for layout math. Do NOT build `<schmancy-stack>` / `<schmancy-inline>` / `<schmancy-grid>` — Tailwind covers these; `<schmancy-grid>` is explicitly deprecated.
104
+ 5. **Overlays use imperative services, not element APIs:**
105
+ ```js
106
+ import { $dialog, sheet, $notify, SchmancySheetPosition } from 'https://cdn.jsdelivr.net/npm/@mhmo91/schmancy@0.9.22/dist/agent/schmancy.agent.js';
107
+ $dialog.confirm({ title: 'Delete?', message: 'Cannot be undone.', confirmText: 'Delete', cancelText: 'Keep' });
108
+ sheet.open({ component: new MyEditor(), position: SchmancySheetPosition.Side });
109
+ $notify.success('Saved');
110
+ ```
111
+ 6. **Accessibility is built in.** Components handle ARIA roles, focus management, keyboard navigation, form validation messages. Don't re-implement. Do provide `aria-label` on icon-only buttons (`<schmancy-icon-button aria-label="Close">`).
112
+ 7. **Typography:** use `<schmancy-typography type="..." token="...">`. Type = `display` / `headline` / `title` / `body` / `label`. Token = `lg` / `md` / `sm`.
113
+ 8. **Icons:** `<schmancy-icon>close</schmancy-icon>` renders a Material Symbols glyph. Pass the icon name as text content.
114
+
115
+ ## Minimum working page
116
+
117
+ ```html
118
+ <!doctype html>
119
+ <script type="module">
120
+ import 'https://cdn.jsdelivr.net/npm/@mhmo91/schmancy@0.9.22/dist/agent/schmancy.agent.js';
121
+ </script>
122
+
123
+ <schmancy-theme root scheme="auto" color="#6200ee">
124
+ <schmancy-page rows="auto_1fr_auto" class="min-h-screen">
125
+ <schmancy-nav-drawer-appbar class="bg-surface-low px-4 py-3 flex items-center gap-3">
126
+ <schmancy-icon-button aria-label="Menu">
127
+ <schmancy-icon>menu</schmancy-icon>
128
+ </schmancy-icon-button>
129
+ <schmancy-typography type="title" token="lg">Dashboard</schmancy-typography>
130
+ </schmancy-nav-drawer-appbar>
131
+
132
+ <schmancy-surface type="solid" fill="all" class="p-6">
133
+ <schmancy-card type="elevated" class="max-w-md">
134
+ <schmancy-card-content class="p-6">
135
+ <schmancy-typography type="headline" token="sm" class="mb-2">Welcome</schmancy-typography>
136
+ <schmancy-typography type="body" token="md" class="text-surface-onVariant">
137
+ A themed page built with schmancy primitives.
138
+ </schmancy-typography>
139
+ </schmancy-card-content>
140
+ <schmancy-card-action>
141
+ <schmancy-button variant="text">Skip</schmancy-button>
142
+ <schmancy-button variant="filled">Get started</schmancy-button>
143
+ </schmancy-card-action>
144
+ </schmancy-card>
145
+ </schmancy-surface>
146
+
147
+ <schmancy-navigation-bar activeIndex="0" class="bg-surface-low">
148
+ <schmancy-navigation-bar-item icon="home" label="Home" active></schmancy-navigation-bar-item>
149
+ <schmancy-navigation-bar-item icon="search" label="Search"></schmancy-navigation-bar-item>
150
+ <schmancy-navigation-bar-item icon="settings" label="Settings"></schmancy-navigation-bar-item>
151
+ </schmancy-navigation-bar>
152
+
153
+ <schmancy-skill></schmancy-skill>
154
+ </schmancy-page>
155
+ </schmancy-theme>
156
+ ```
157
+
158
+ ## When the design asks for something you don't recognize
159
+
160
+ 1. `window.schmancy.help()` — scan `elements[]` summaries.
161
+ 2. `window.schmancy.help('schmancy-<tag>')` — exact attributes + copy-pasteable examples.
162
+ 3. Only after both turn up nothing, compose from primitives. Custom elements are the last resort.
163
+
164
+ ## Report bugs
165
+
166
+ github.com/mhmo91/schmancy — include `window.schmancy.capabilities()`, the minimum failing HTML, and `window.schmancy.manifest.schemaVersion`.
@@ -0,0 +1,42 @@
1
+ # Paste: Claude Design v2 loop-back message
2
+
3
+ Copy-paste this into a Claude Design conversation. Full write-up is in the sibling `agent-runtime-v2-loopback.md`.
4
+
5
+ ---
6
+
7
+ **Schmancy agent runtime v2 — ready for loop-back**
8
+
9
+ Pin URL:
10
+
11
+ ```
12
+ https://cdn.jsdelivr.net/npm/@mhmo91/schmancy@0.9.21/dist/agent/schmancy.agent.js
13
+ ```
14
+
15
+ What's new since v0.9.13:
16
+
17
+ - **Richer `window.schmancy.help()`.** 46 components now return `{ summary, examples: [...], platformPrimitive: { tag, mode, note }, ...attrs }` instead of just attributes.
18
+ - **Lazy vendor chunks.** Pages that don't render `<schmancy-code>`, `<schmancy-qr-scanner>`, or `<schmancy-typewriter>` save ~68 KB gzipped on first paint.
19
+ - **CI smoke-test gate.** `window.schmancy.help()` regressions fail-closed at publish time.
20
+
21
+ Minimum test:
22
+
23
+ ```html
24
+ <!doctype html>
25
+ <script type="module">
26
+ import 'https://cdn.jsdelivr.net/npm/@mhmo91/schmancy@0.9.21/dist/agent/schmancy.agent.js';
27
+ </script>
28
+ <schmancy-theme root scheme="dark">
29
+ <schmancy-surface type="solid" fill="all">
30
+ <schmancy-button variant="filled">Hi</schmancy-button>
31
+ <schmancy-skill></schmancy-skill>
32
+ </schmancy-surface>
33
+ </schmancy-theme>
34
+ <script>
35
+ const h = window.schmancy.help('schmancy-button');
36
+ console.log('summary:', h.summary);
37
+ console.log('examples:', h.examples);
38
+ console.log('platformPrimitive:', h.platformPrimitive);
39
+ </script>
40
+ ```
41
+
42
+ Report anything surprising at github.com/mhmo91/schmancy — include `window.schmancy.capabilities()` and `window.schmancy.manifest.schemaVersion`.
@@ -1,7 +1,7 @@
1
- import { a as e, t } from "./tailwind.mixin-H5Pn7vSJ.js";
1
+ import { a as e, t } from "./tailwind.mixin-DIEGVcl3.js";
2
2
  import { t as n } from "./decorate-D_utPUsC.js";
3
3
  import "./mixins.js";
4
- import { t as r } from "./context-D8Q66KPe.js";
4
+ import { t as r } from "./context-BCFNNkes.js";
5
5
  import { BehaviorSubject as i, combineLatest as a, takeUntil as o } from "rxjs";
6
6
  import { tap as s } from "rxjs/operators";
7
7
  import { customElement as c, property as l, state as u } from "lit/decorators.js";
@@ -1 +1 @@
1
- {"version":3,"file":"icons-C5-DIjet.js","names":[],"sources":["../src/icons/icon.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { consume } from '@lit/context'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { BehaviorSubject, combineLatest, takeUntil } from 'rxjs'\nimport { tap } from 'rxjs/operators'\nimport { SchmancyButtonSizeContext, type SchmancyButtonSize } from '../button/context'\n\n/**\n * Icon size tokens - M3 aligned with optical size optimization\n * - xxs: 12px (opsz: 20) - fits in 24px buttons (ultra-compact)\n * - xs: 16px (opsz: 20) - fits in 32px buttons\n * - sm: 20px (opsz: 20) - fits in 40px buttons\n * - md: 24px (opsz: 24) - fits in 48px buttons (default)\n * - lg: 32px (opsz: 40) - fits in 56px buttons\n * - Or custom string like '48px'\n */\nexport type IconSize = 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | string\n\n/**\n * @element schmancy-icon\n * Material Symbols icon component with flexible font variation properties\n *\n * @cssprop --schmancy-icon-size - The size of the icon (default: 24px)\n * @cssprop --schmancy-icon-fill - Fill value for icon (0-1)\n * @cssprop --schmancy-icon-weight - Weight value for icon (100-700)\n * @cssprop --schmancy-icon-grade - Grade value for icon (-50-200)\n * @cssprop --schmancy-icon-opsz - Optical size (default: 24)\n * @csspart icon - The inner `<span>` carrying the Material Symbols glyph.\n */\n@customElement('schmancy-icon')\nexport default class SchmancyIcon extends TailwindElement(css`\n\t:host {\n\t\t--schmancy-icon-size: 24px;\n\t\t--schmancy-icon-fill: 0;\n\t\t--schmancy-icon-weight: 400;\n\t\t--schmancy-icon-grade: 0;\n\t\t--schmancy-icon-opsz: 24;\n\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: var(--schmancy-icon-size);\n\t\theight: var(--schmancy-icon-size);\n\t\tfont-size: var(--schmancy-icon-size);\n\t\tcolor: inherit;\n\t\ttransition: font-variation-settings 0.2s ease;\n\t}\n\n\t.material-symbols {\n\t\tfont-family: var(--schmancy-icon-font, 'Material Symbols Outlined');\n\t\tfont-weight: normal;\n\t\tfont-style: normal;\n\t\tline-height: 1;\n\t\tletter-spacing: normal;\n\t\ttext-transform: none;\n\t\tdisplay: inline-block;\n\t\twhite-space: nowrap;\n\t\tword-wrap: normal;\n\t\tdirection: ltr;\n\t\t-webkit-font-smoothing: antialiased;\n\t\t-webkit-font-feature-settings: 'liga';\n\t\tfont-feature-settings: 'liga';\n\t\tfont-variation-settings:\n\t\t\t'FILL' var(--schmancy-icon-fill),\n\t\t\t'wght' var(--schmancy-icon-weight),\n\t\t\t'GRAD' var(--schmancy-icon-grade),\n\t\t\t'opsz' var(--schmancy-icon-opsz);\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t/* CSS-generated content is NOT translated by Google Translate */\n\t.material-symbols[data-icon]::before {\n\t\tcontent: attr(data-icon);\n\t}\n`) {\n\t// Static flag to track if Google Fonts have been loaded\n\tprivate static fontsLoaded = false\n\n\t/**\n\t * Load Material Symbols fonts from Google Fonts CDN\n\t */\n\tprivate static loadFonts(): void {\n\t\tif (SchmancyIcon.fontsLoaded) {\n\t\t\treturn\n\t\t}\n\n\t\tconst link = document.createElement('link')\n\t\tlink.rel = 'stylesheet'\n\t\tlink.href = 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&family=Material+Symbols+Sharp:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap'\n\t\tdocument.head.appendChild(link)\n\n\t\tSchmancyIcon.fontsLoaded = true\n\t}\n\n\t/**\n\t * Fill value for the icon (0-1)\n\t * 0 = outlined, 1 = filled\n\t */\n\t@property({ type: Number, reflect: true })\n\tfill = 0\n\n\t/**\n\t * Weight value for the icon (100-700)\n\t * Controls the thickness of the icon strokes\n\t */\n\t@property({ type: Number, reflect: true })\n\tweight = 400\n\n\t/**\n\t * Grade value for the icon (-50-200)\n\t * Adjusts the visual weight/grade\n\t */\n\t@property({ type: Number, reflect: true })\n\tgrade = 0\n\n\t/**\n\t * Icon variant style\n\t * @values outlined | rounded | sharp\n\t */\n\t@property({ type: String, reflect: true })\n\tvariant: 'outlined' | 'rounded' | 'sharp' = 'outlined'\n\n\t/**\n\t * Size of the icon - M3 aligned tokens or custom string\n\t * Tokens: 'xxs' (12px), 'xs' (16px), 'sm' (20px), 'md' (24px), 'lg' (32px)\n\t * Custom: any CSS size string like '48px', '2rem'\n\t *\n\t * When this icon is a descendant of `<schmancy-button>`, the button's\n\t * `size` wins (via `SchmancyButtonSizeContext`). The local `size` only\n\t * applies when there is no ancestor button.\n\t */\n\t@property({ type: String, reflect: true })\n\tsize: IconSize = 'md'\n\n\t/**\n\t * Size inherited from an ancestor `<schmancy-button>` via context.\n\t * Undefined when the icon is not nested in a button.\n\t */\n\t@consume({ context: SchmancyButtonSizeContext, subscribe: true })\n\t@state()\n\tprivate _buttonSize?: SchmancyButtonSize\n\n\t/**\n\t * Icon name - use this instead of slot content to prevent translation breaking icons.\n\t * When set, this takes precedence over slot content.\n\t * Example: <schmancy-icon icon=\"delete\"></schmancy-icon>\n\t */\n\t@property({ type: String })\n\ticon?: string\n\n\t// M3 aligned token sizes with optimal optical sizes\n\tprivate static readonly tokenSizes: Record<string, { size: string; opsz: number }> = {\n\t\txxs: { size: '12px', opsz: 20 }, // fits in 24px buttons (ultra-compact)\n\t\txs: { size: '16px', opsz: 20 }, // fits in 32px buttons\n\t\tsm: { size: '20px', opsz: 20 }, // fits in 40px buttons\n\t\tmd: { size: '24px', opsz: 24 }, // fits in 48px buttons (default)\n\t\tlg: { size: '32px', opsz: 40 }, // fits in 56px buttons\n\t}\n\n\t/** Extract pixel value from a custom size string for optical size */\n\tprivate static computeOpticalSize(size: string): number {\n\t\tconst px = parseFloat(size)\n\t\treturn isNaN(px) ? 24 : Math.max(20, Math.min(48, Math.round(px)))\n\t}\n\n\t// RxJS subjects for reactive property updates\n\tprivate fill$ = new BehaviorSubject(this.fill)\n\tprivate weight$ = new BehaviorSubject(this.weight)\n\tprivate grade$ = new BehaviorSubject(this.grade)\n\tprivate variant$ = new BehaviorSubject(this.variant)\n\n\t// Captured icon name from slot content (translation-proof)\n\t@state()\n\tprivate _capturedIcon?: string\n\n\t// Observer for text content changes (ternaries update text nodes, not DOM structure)\n\tprivate _observer?: MutationObserver\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback()\n\n\t\t// Capture initial icon name\n\t\tthis._updateCapturedIcon()\n\n\t\t// Watch for text content changes (characterData) for dynamic icon updates\n\t\tthis._observer = new MutationObserver(() => this._updateCapturedIcon())\n\t\tthis._observer.observe(this, { childList: true, characterData: true, subtree: true })\n\n\t\t// Load Google Fonts if not already loaded\n\t\tSchmancyIcon.loadFonts()\n\n\t\t// Prevent browser translation from breaking icon ligatures\n\t\t// Using multiple methods for maximum compatibility:\n\t\t// - translate=\"no\" (HTML5 standard)\n\t\t// - class=\"notranslate\" (Google Translate specific)\n\t\tthis.setAttribute('translate', 'no')\n\t\tthis.classList.add('notranslate')\n\n\t\t// Set accessibility attributes for decorative icons\n\t\tif (!this.hasAttribute('aria-label') &&\n\t\t !this.hasAttribute('aria-labelledby') &&\n\t\t !this.hasAttribute('aria-hidden') &&\n\t\t !this.hasAttribute('role')) {\n\t\t\tthis.setAttribute('aria-hidden', 'true')\n\t\t}\n\n\t\t// Setup reactive CSS variable updates\n\t\tcombineLatest([\n\t\t\tthis.fill$,\n\t\t\tthis.weight$,\n\t\t\tthis.grade$,\n\t\t\tthis.variant$\n\t\t]).pipe(\n\t\t\ttap(([fill, weight, grade, variant]) => {\n\t\t\t\t// Update CSS custom properties for smooth transitions\n\t\t\t\tthis.style.setProperty('--schmancy-icon-fill', String(fill))\n\t\t\t\tthis.style.setProperty('--schmancy-icon-weight', String(weight))\n\t\t\t\tthis.style.setProperty('--schmancy-icon-grade', String(grade))\n\n\t\t\t\t// Update font family based on variant\n\t\t\t\tconst fontFamily = {\n\t\t\t\t\t'outlined': 'Material Symbols Outlined',\n\t\t\t\t\t'rounded': 'Material Symbols Rounded',\n\t\t\t\t\t'sharp': 'Material Symbols Sharp'\n\t\t\t\t}[variant] || 'Material Symbols Outlined'\n\n\t\t\t\tthis.style.setProperty('--schmancy-icon-font', fontFamily)\n\t\t\t}),\n\t\t\ttakeUntil(this.disconnecting)\n\t\t).subscribe()\n\n\t}\n\n\t/**\n\t * Update captured icon from current text content\n\t */\n\tprivate _updateCapturedIcon(): void {\n\t\tif (!this.icon) {\n\t\t\tconst textContent = this.textContent?.trim()\n\t\t\tif (textContent && textContent !== this._capturedIcon) {\n\t\t\t\tthis._capturedIcon = textContent\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected updated(changedProperties: Map<string | number | symbol, unknown>): void {\n\t\tsuper.updated(changedProperties)\n\n\t\t// Update BehaviorSubjects when properties change\n\t\tif (changedProperties.has('fill')) {\n\t\t\tthis.fill$.next(this.fill)\n\t\t}\n\t\tif (changedProperties.has('weight')) {\n\t\t\tthis.weight$.next(this.weight)\n\t\t}\n\t\tif (changedProperties.has('grade')) {\n\t\t\tthis.grade$.next(this.grade)\n\t\t}\n\t\tif (changedProperties.has('variant')) {\n\t\t\tthis.variant$.next(this.variant)\n\t\t}\n\t}\n\n\tprotected render(): unknown {\n\t\tconst fontFamily = {\n\t\t\t'outlined': 'Material Symbols Outlined',\n\t\t\t'rounded': 'Material Symbols Rounded',\n\t\t\t'sharp': 'Material Symbols Sharp'\n\t\t}[this.variant] || 'Material Symbols Outlined'\n\n\t\t// Effective size: ancestor `<schmancy-button>` wins via context, else local `size`.\n\t\tconst effectiveSize: IconSize = this._buttonSize ?? this.size\n\t\t// Resolve size: token → px, bare number → px, or pass through as-is\n\t\tconst sizeConfig = SchmancyIcon.tokenSizes[effectiveSize]\n\t\tconst isNumeric = !sizeConfig && /^\\d+(\\.\\d+)?$/.test(effectiveSize)\n\t\tconst iconSize = sizeConfig?.size || (isNumeric ? `${effectiveSize}px` : effectiveSize)\n\t\tconst opticalSize = sizeConfig?.opsz || SchmancyIcon.computeOpticalSize(iconSize)\n\n\t\t// Set size on HOST so :host CSS picks it up\n\t\tthis.style.setProperty('--schmancy-icon-size', iconSize)\n\t\tthis.style.setProperty('--schmancy-icon-opsz', String(opticalSize))\n\n\t\tconst style = {\n\t\t\t'--schmancy-icon-fill': this.fill,\n\t\t\t'--schmancy-icon-weight': this.weight,\n\t\t\t'--schmancy-icon-grade': this.grade,\n\t\t\t'--schmancy-icon-font': fontFamily,\n\t\t}\n\n\t\t// Priority: icon property > captured icon (for dynamic content)\n\t\tconst iconName = this.icon || this._capturedIcon\n\n\t\t// Always render slot (hidden) to observe content changes, display via data-icon\n\t\treturn html`\n\t\t\t<span class=\"material-symbols notranslate\" part=\"icon\" translate=\"no\" data-icon=${iconName || ''} style=${this.styleMap(style)}></span>\n\t\t\t<slot style=\"display:none\"></slot>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-icon': SchmancyIcon\n\t}\n}"],"mappings":"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"}
1
+ {"version":3,"file":"icons-24zlLf1q.js","names":[],"sources":["../src/icons/icon.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { consume } from '@lit/context'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { BehaviorSubject, combineLatest, takeUntil } from 'rxjs'\nimport { tap } from 'rxjs/operators'\nimport { SchmancyButtonSizeContext, type SchmancyButtonSize } from '../button/context'\n\n/**\n * Icon size tokens - M3 aligned with optical size optimization\n * - xxs: 12px (opsz: 20) - fits in 24px buttons (ultra-compact)\n * - xs: 16px (opsz: 20) - fits in 32px buttons\n * - sm: 20px (opsz: 20) - fits in 40px buttons\n * - md: 24px (opsz: 24) - fits in 48px buttons (default)\n * - lg: 32px (opsz: 40) - fits in 56px buttons\n * - Or custom string like '48px'\n */\nexport type IconSize = 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | string\n\n/**\n * @element schmancy-icon\n * Material Symbols icon component with flexible font variation properties\n *\n * @cssprop --schmancy-icon-size - The size of the icon (default: 24px)\n * @cssprop --schmancy-icon-fill - Fill value for icon (0-1)\n * @cssprop --schmancy-icon-weight - Weight value for icon (100-700)\n * @cssprop --schmancy-icon-grade - Grade value for icon (-50-200)\n * @cssprop --schmancy-icon-opsz - Optical size (default: 24)\n * @csspart icon - The inner `<span>` carrying the Material Symbols glyph.\n */\n@customElement('schmancy-icon')\nexport default class SchmancyIcon extends TailwindElement(css`\n\t:host {\n\t\t--schmancy-icon-size: 24px;\n\t\t--schmancy-icon-fill: 0;\n\t\t--schmancy-icon-weight: 400;\n\t\t--schmancy-icon-grade: 0;\n\t\t--schmancy-icon-opsz: 24;\n\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: var(--schmancy-icon-size);\n\t\theight: var(--schmancy-icon-size);\n\t\tfont-size: var(--schmancy-icon-size);\n\t\tcolor: inherit;\n\t\ttransition: font-variation-settings 0.2s ease;\n\t}\n\n\t.material-symbols {\n\t\tfont-family: var(--schmancy-icon-font, 'Material Symbols Outlined');\n\t\tfont-weight: normal;\n\t\tfont-style: normal;\n\t\tline-height: 1;\n\t\tletter-spacing: normal;\n\t\ttext-transform: none;\n\t\tdisplay: inline-block;\n\t\twhite-space: nowrap;\n\t\tword-wrap: normal;\n\t\tdirection: ltr;\n\t\t-webkit-font-smoothing: antialiased;\n\t\t-webkit-font-feature-settings: 'liga';\n\t\tfont-feature-settings: 'liga';\n\t\tfont-variation-settings:\n\t\t\t'FILL' var(--schmancy-icon-fill),\n\t\t\t'wght' var(--schmancy-icon-weight),\n\t\t\t'GRAD' var(--schmancy-icon-grade),\n\t\t\t'opsz' var(--schmancy-icon-opsz);\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t/* CSS-generated content is NOT translated by Google Translate */\n\t.material-symbols[data-icon]::before {\n\t\tcontent: attr(data-icon);\n\t}\n`) {\n\t// Static flag to track if Google Fonts have been loaded\n\tprivate static fontsLoaded = false\n\n\t/**\n\t * Load Material Symbols fonts from Google Fonts CDN\n\t */\n\tprivate static loadFonts(): void {\n\t\tif (SchmancyIcon.fontsLoaded) {\n\t\t\treturn\n\t\t}\n\n\t\tconst link = document.createElement('link')\n\t\tlink.rel = 'stylesheet'\n\t\tlink.href = 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&family=Material+Symbols+Sharp:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap'\n\t\tdocument.head.appendChild(link)\n\n\t\tSchmancyIcon.fontsLoaded = true\n\t}\n\n\t/**\n\t * Fill value for the icon (0-1)\n\t * 0 = outlined, 1 = filled\n\t */\n\t@property({ type: Number, reflect: true })\n\tfill = 0\n\n\t/**\n\t * Weight value for the icon (100-700)\n\t * Controls the thickness of the icon strokes\n\t */\n\t@property({ type: Number, reflect: true })\n\tweight = 400\n\n\t/**\n\t * Grade value for the icon (-50-200)\n\t * Adjusts the visual weight/grade\n\t */\n\t@property({ type: Number, reflect: true })\n\tgrade = 0\n\n\t/**\n\t * Icon variant style\n\t * @values outlined | rounded | sharp\n\t */\n\t@property({ type: String, reflect: true })\n\tvariant: 'outlined' | 'rounded' | 'sharp' = 'outlined'\n\n\t/**\n\t * Size of the icon - M3 aligned tokens or custom string\n\t * Tokens: 'xxs' (12px), 'xs' (16px), 'sm' (20px), 'md' (24px), 'lg' (32px)\n\t * Custom: any CSS size string like '48px', '2rem'\n\t *\n\t * When this icon is a descendant of `<schmancy-button>`, the button's\n\t * `size` wins (via `SchmancyButtonSizeContext`). The local `size` only\n\t * applies when there is no ancestor button.\n\t */\n\t@property({ type: String, reflect: true })\n\tsize: IconSize = 'md'\n\n\t/**\n\t * Size inherited from an ancestor `<schmancy-button>` via context.\n\t * Undefined when the icon is not nested in a button.\n\t */\n\t@consume({ context: SchmancyButtonSizeContext, subscribe: true })\n\t@state()\n\tprivate _buttonSize?: SchmancyButtonSize\n\n\t/**\n\t * Icon name - use this instead of slot content to prevent translation breaking icons.\n\t * When set, this takes precedence over slot content.\n\t * Example: <schmancy-icon icon=\"delete\"></schmancy-icon>\n\t */\n\t@property({ type: String })\n\ticon?: string\n\n\t// M3 aligned token sizes with optimal optical sizes\n\tprivate static readonly tokenSizes: Record<string, { size: string; opsz: number }> = {\n\t\txxs: { size: '12px', opsz: 20 }, // fits in 24px buttons (ultra-compact)\n\t\txs: { size: '16px', opsz: 20 }, // fits in 32px buttons\n\t\tsm: { size: '20px', opsz: 20 }, // fits in 40px buttons\n\t\tmd: { size: '24px', opsz: 24 }, // fits in 48px buttons (default)\n\t\tlg: { size: '32px', opsz: 40 }, // fits in 56px buttons\n\t}\n\n\t/** Extract pixel value from a custom size string for optical size */\n\tprivate static computeOpticalSize(size: string): number {\n\t\tconst px = parseFloat(size)\n\t\treturn isNaN(px) ? 24 : Math.max(20, Math.min(48, Math.round(px)))\n\t}\n\n\t// RxJS subjects for reactive property updates\n\tprivate fill$ = new BehaviorSubject(this.fill)\n\tprivate weight$ = new BehaviorSubject(this.weight)\n\tprivate grade$ = new BehaviorSubject(this.grade)\n\tprivate variant$ = new BehaviorSubject(this.variant)\n\n\t// Captured icon name from slot content (translation-proof)\n\t@state()\n\tprivate _capturedIcon?: string\n\n\t// Observer for text content changes (ternaries update text nodes, not DOM structure)\n\tprivate _observer?: MutationObserver\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback()\n\n\t\t// Capture initial icon name\n\t\tthis._updateCapturedIcon()\n\n\t\t// Watch for text content changes (characterData) for dynamic icon updates\n\t\tthis._observer = new MutationObserver(() => this._updateCapturedIcon())\n\t\tthis._observer.observe(this, { childList: true, characterData: true, subtree: true })\n\n\t\t// Load Google Fonts if not already loaded\n\t\tSchmancyIcon.loadFonts()\n\n\t\t// Prevent browser translation from breaking icon ligatures\n\t\t// Using multiple methods for maximum compatibility:\n\t\t// - translate=\"no\" (HTML5 standard)\n\t\t// - class=\"notranslate\" (Google Translate specific)\n\t\tthis.setAttribute('translate', 'no')\n\t\tthis.classList.add('notranslate')\n\n\t\t// Set accessibility attributes for decorative icons\n\t\tif (!this.hasAttribute('aria-label') &&\n\t\t !this.hasAttribute('aria-labelledby') &&\n\t\t !this.hasAttribute('aria-hidden') &&\n\t\t !this.hasAttribute('role')) {\n\t\t\tthis.setAttribute('aria-hidden', 'true')\n\t\t}\n\n\t\t// Setup reactive CSS variable updates\n\t\tcombineLatest([\n\t\t\tthis.fill$,\n\t\t\tthis.weight$,\n\t\t\tthis.grade$,\n\t\t\tthis.variant$\n\t\t]).pipe(\n\t\t\ttap(([fill, weight, grade, variant]) => {\n\t\t\t\t// Update CSS custom properties for smooth transitions\n\t\t\t\tthis.style.setProperty('--schmancy-icon-fill', String(fill))\n\t\t\t\tthis.style.setProperty('--schmancy-icon-weight', String(weight))\n\t\t\t\tthis.style.setProperty('--schmancy-icon-grade', String(grade))\n\n\t\t\t\t// Update font family based on variant\n\t\t\t\tconst fontFamily = {\n\t\t\t\t\t'outlined': 'Material Symbols Outlined',\n\t\t\t\t\t'rounded': 'Material Symbols Rounded',\n\t\t\t\t\t'sharp': 'Material Symbols Sharp'\n\t\t\t\t}[variant] || 'Material Symbols Outlined'\n\n\t\t\t\tthis.style.setProperty('--schmancy-icon-font', fontFamily)\n\t\t\t}),\n\t\t\ttakeUntil(this.disconnecting)\n\t\t).subscribe()\n\n\t}\n\n\t/**\n\t * Update captured icon from current text content\n\t */\n\tprivate _updateCapturedIcon(): void {\n\t\tif (!this.icon) {\n\t\t\tconst textContent = this.textContent?.trim()\n\t\t\tif (textContent && textContent !== this._capturedIcon) {\n\t\t\t\tthis._capturedIcon = textContent\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected updated(changedProperties: Map<string | number | symbol, unknown>): void {\n\t\tsuper.updated(changedProperties)\n\n\t\t// Update BehaviorSubjects when properties change\n\t\tif (changedProperties.has('fill')) {\n\t\t\tthis.fill$.next(this.fill)\n\t\t}\n\t\tif (changedProperties.has('weight')) {\n\t\t\tthis.weight$.next(this.weight)\n\t\t}\n\t\tif (changedProperties.has('grade')) {\n\t\t\tthis.grade$.next(this.grade)\n\t\t}\n\t\tif (changedProperties.has('variant')) {\n\t\t\tthis.variant$.next(this.variant)\n\t\t}\n\t}\n\n\tprotected render(): unknown {\n\t\tconst fontFamily = {\n\t\t\t'outlined': 'Material Symbols Outlined',\n\t\t\t'rounded': 'Material Symbols Rounded',\n\t\t\t'sharp': 'Material Symbols Sharp'\n\t\t}[this.variant] || 'Material Symbols Outlined'\n\n\t\t// Effective size: ancestor `<schmancy-button>` wins via context, else local `size`.\n\t\tconst effectiveSize: IconSize = this._buttonSize ?? this.size\n\t\t// Resolve size: token → px, bare number → px, or pass through as-is\n\t\tconst sizeConfig = SchmancyIcon.tokenSizes[effectiveSize]\n\t\tconst isNumeric = !sizeConfig && /^\\d+(\\.\\d+)?$/.test(effectiveSize)\n\t\tconst iconSize = sizeConfig?.size || (isNumeric ? `${effectiveSize}px` : effectiveSize)\n\t\tconst opticalSize = sizeConfig?.opsz || SchmancyIcon.computeOpticalSize(iconSize)\n\n\t\t// Set size on HOST so :host CSS picks it up\n\t\tthis.style.setProperty('--schmancy-icon-size', iconSize)\n\t\tthis.style.setProperty('--schmancy-icon-opsz', String(opticalSize))\n\n\t\tconst style = {\n\t\t\t'--schmancy-icon-fill': this.fill,\n\t\t\t'--schmancy-icon-weight': this.weight,\n\t\t\t'--schmancy-icon-grade': this.grade,\n\t\t\t'--schmancy-icon-font': fontFamily,\n\t\t}\n\n\t\t// Priority: icon property > captured icon (for dynamic content)\n\t\tconst iconName = this.icon || this._capturedIcon\n\n\t\t// Always render slot (hidden) to observe content changes, display via data-icon\n\t\treturn html`\n\t\t\t<span class=\"material-symbols notranslate\" part=\"icon\" translate=\"no\" data-icon=${iconName || ''} style=${this.styleMap(style)}></span>\n\t\t\t<slot style=\"display:none\"></slot>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-icon': SchmancyIcon\n\t}\n}"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- require(`./chunk-CncqDLb2.cjs`);const e=require(`./tailwind.mixin-Bh58QnlW.cjs`),t=require(`./decorate-F9CuyeHg.cjs`);require(`./mixins.cjs`);const n=require(`./context-CAYQh-mx.cjs`);let r=require(`rxjs`),i=require(`rxjs/operators`),a=require(`lit/decorators.js`),o=require(`lit`);var s,c=class extends e.t(o.css`
1
+ require(`./chunk-CncqDLb2.cjs`);const e=require(`./tailwind.mixin-BHX99hgX.cjs`),t=require(`./decorate-F9CuyeHg.cjs`);require(`./mixins.cjs`);const n=require(`./context-6t-yayy3.cjs`);let r=require(`rxjs`),i=require(`rxjs/operators`),a=require(`lit/decorators.js`),o=require(`lit`);var s,c=class extends e.t(o.css`
2
2
  :host {
3
3
  --schmancy-icon-size: 24px;
4
4
  --schmancy-icon-fill: 0;
@@ -1 +1 @@
1
- {"version":3,"file":"icons-B6V3nZ4-.cjs","names":[],"sources":["../src/icons/icon.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { consume } from '@lit/context'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { BehaviorSubject, combineLatest, takeUntil } from 'rxjs'\nimport { tap } from 'rxjs/operators'\nimport { SchmancyButtonSizeContext, type SchmancyButtonSize } from '../button/context'\n\n/**\n * Icon size tokens - M3 aligned with optical size optimization\n * - xxs: 12px (opsz: 20) - fits in 24px buttons (ultra-compact)\n * - xs: 16px (opsz: 20) - fits in 32px buttons\n * - sm: 20px (opsz: 20) - fits in 40px buttons\n * - md: 24px (opsz: 24) - fits in 48px buttons (default)\n * - lg: 32px (opsz: 40) - fits in 56px buttons\n * - Or custom string like '48px'\n */\nexport type IconSize = 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | string\n\n/**\n * @element schmancy-icon\n * Material Symbols icon component with flexible font variation properties\n *\n * @cssprop --schmancy-icon-size - The size of the icon (default: 24px)\n * @cssprop --schmancy-icon-fill - Fill value for icon (0-1)\n * @cssprop --schmancy-icon-weight - Weight value for icon (100-700)\n * @cssprop --schmancy-icon-grade - Grade value for icon (-50-200)\n * @cssprop --schmancy-icon-opsz - Optical size (default: 24)\n * @csspart icon - The inner `<span>` carrying the Material Symbols glyph.\n */\n@customElement('schmancy-icon')\nexport default class SchmancyIcon extends TailwindElement(css`\n\t:host {\n\t\t--schmancy-icon-size: 24px;\n\t\t--schmancy-icon-fill: 0;\n\t\t--schmancy-icon-weight: 400;\n\t\t--schmancy-icon-grade: 0;\n\t\t--schmancy-icon-opsz: 24;\n\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: var(--schmancy-icon-size);\n\t\theight: var(--schmancy-icon-size);\n\t\tfont-size: var(--schmancy-icon-size);\n\t\tcolor: inherit;\n\t\ttransition: font-variation-settings 0.2s ease;\n\t}\n\n\t.material-symbols {\n\t\tfont-family: var(--schmancy-icon-font, 'Material Symbols Outlined');\n\t\tfont-weight: normal;\n\t\tfont-style: normal;\n\t\tline-height: 1;\n\t\tletter-spacing: normal;\n\t\ttext-transform: none;\n\t\tdisplay: inline-block;\n\t\twhite-space: nowrap;\n\t\tword-wrap: normal;\n\t\tdirection: ltr;\n\t\t-webkit-font-smoothing: antialiased;\n\t\t-webkit-font-feature-settings: 'liga';\n\t\tfont-feature-settings: 'liga';\n\t\tfont-variation-settings:\n\t\t\t'FILL' var(--schmancy-icon-fill),\n\t\t\t'wght' var(--schmancy-icon-weight),\n\t\t\t'GRAD' var(--schmancy-icon-grade),\n\t\t\t'opsz' var(--schmancy-icon-opsz);\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t/* CSS-generated content is NOT translated by Google Translate */\n\t.material-symbols[data-icon]::before {\n\t\tcontent: attr(data-icon);\n\t}\n`) {\n\t// Static flag to track if Google Fonts have been loaded\n\tprivate static fontsLoaded = false\n\n\t/**\n\t * Load Material Symbols fonts from Google Fonts CDN\n\t */\n\tprivate static loadFonts(): void {\n\t\tif (SchmancyIcon.fontsLoaded) {\n\t\t\treturn\n\t\t}\n\n\t\tconst link = document.createElement('link')\n\t\tlink.rel = 'stylesheet'\n\t\tlink.href = 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&family=Material+Symbols+Sharp:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap'\n\t\tdocument.head.appendChild(link)\n\n\t\tSchmancyIcon.fontsLoaded = true\n\t}\n\n\t/**\n\t * Fill value for the icon (0-1)\n\t * 0 = outlined, 1 = filled\n\t */\n\t@property({ type: Number, reflect: true })\n\tfill = 0\n\n\t/**\n\t * Weight value for the icon (100-700)\n\t * Controls the thickness of the icon strokes\n\t */\n\t@property({ type: Number, reflect: true })\n\tweight = 400\n\n\t/**\n\t * Grade value for the icon (-50-200)\n\t * Adjusts the visual weight/grade\n\t */\n\t@property({ type: Number, reflect: true })\n\tgrade = 0\n\n\t/**\n\t * Icon variant style\n\t * @values outlined | rounded | sharp\n\t */\n\t@property({ type: String, reflect: true })\n\tvariant: 'outlined' | 'rounded' | 'sharp' = 'outlined'\n\n\t/**\n\t * Size of the icon - M3 aligned tokens or custom string\n\t * Tokens: 'xxs' (12px), 'xs' (16px), 'sm' (20px), 'md' (24px), 'lg' (32px)\n\t * Custom: any CSS size string like '48px', '2rem'\n\t *\n\t * When this icon is a descendant of `<schmancy-button>`, the button's\n\t * `size` wins (via `SchmancyButtonSizeContext`). The local `size` only\n\t * applies when there is no ancestor button.\n\t */\n\t@property({ type: String, reflect: true })\n\tsize: IconSize = 'md'\n\n\t/**\n\t * Size inherited from an ancestor `<schmancy-button>` via context.\n\t * Undefined when the icon is not nested in a button.\n\t */\n\t@consume({ context: SchmancyButtonSizeContext, subscribe: true })\n\t@state()\n\tprivate _buttonSize?: SchmancyButtonSize\n\n\t/**\n\t * Icon name - use this instead of slot content to prevent translation breaking icons.\n\t * When set, this takes precedence over slot content.\n\t * Example: <schmancy-icon icon=\"delete\"></schmancy-icon>\n\t */\n\t@property({ type: String })\n\ticon?: string\n\n\t// M3 aligned token sizes with optimal optical sizes\n\tprivate static readonly tokenSizes: Record<string, { size: string; opsz: number }> = {\n\t\txxs: { size: '12px', opsz: 20 }, // fits in 24px buttons (ultra-compact)\n\t\txs: { size: '16px', opsz: 20 }, // fits in 32px buttons\n\t\tsm: { size: '20px', opsz: 20 }, // fits in 40px buttons\n\t\tmd: { size: '24px', opsz: 24 }, // fits in 48px buttons (default)\n\t\tlg: { size: '32px', opsz: 40 }, // fits in 56px buttons\n\t}\n\n\t/** Extract pixel value from a custom size string for optical size */\n\tprivate static computeOpticalSize(size: string): number {\n\t\tconst px = parseFloat(size)\n\t\treturn isNaN(px) ? 24 : Math.max(20, Math.min(48, Math.round(px)))\n\t}\n\n\t// RxJS subjects for reactive property updates\n\tprivate fill$ = new BehaviorSubject(this.fill)\n\tprivate weight$ = new BehaviorSubject(this.weight)\n\tprivate grade$ = new BehaviorSubject(this.grade)\n\tprivate variant$ = new BehaviorSubject(this.variant)\n\n\t// Captured icon name from slot content (translation-proof)\n\t@state()\n\tprivate _capturedIcon?: string\n\n\t// Observer for text content changes (ternaries update text nodes, not DOM structure)\n\tprivate _observer?: MutationObserver\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback()\n\n\t\t// Capture initial icon name\n\t\tthis._updateCapturedIcon()\n\n\t\t// Watch for text content changes (characterData) for dynamic icon updates\n\t\tthis._observer = new MutationObserver(() => this._updateCapturedIcon())\n\t\tthis._observer.observe(this, { childList: true, characterData: true, subtree: true })\n\n\t\t// Load Google Fonts if not already loaded\n\t\tSchmancyIcon.loadFonts()\n\n\t\t// Prevent browser translation from breaking icon ligatures\n\t\t// Using multiple methods for maximum compatibility:\n\t\t// - translate=\"no\" (HTML5 standard)\n\t\t// - class=\"notranslate\" (Google Translate specific)\n\t\tthis.setAttribute('translate', 'no')\n\t\tthis.classList.add('notranslate')\n\n\t\t// Set accessibility attributes for decorative icons\n\t\tif (!this.hasAttribute('aria-label') &&\n\t\t !this.hasAttribute('aria-labelledby') &&\n\t\t !this.hasAttribute('aria-hidden') &&\n\t\t !this.hasAttribute('role')) {\n\t\t\tthis.setAttribute('aria-hidden', 'true')\n\t\t}\n\n\t\t// Setup reactive CSS variable updates\n\t\tcombineLatest([\n\t\t\tthis.fill$,\n\t\t\tthis.weight$,\n\t\t\tthis.grade$,\n\t\t\tthis.variant$\n\t\t]).pipe(\n\t\t\ttap(([fill, weight, grade, variant]) => {\n\t\t\t\t// Update CSS custom properties for smooth transitions\n\t\t\t\tthis.style.setProperty('--schmancy-icon-fill', String(fill))\n\t\t\t\tthis.style.setProperty('--schmancy-icon-weight', String(weight))\n\t\t\t\tthis.style.setProperty('--schmancy-icon-grade', String(grade))\n\n\t\t\t\t// Update font family based on variant\n\t\t\t\tconst fontFamily = {\n\t\t\t\t\t'outlined': 'Material Symbols Outlined',\n\t\t\t\t\t'rounded': 'Material Symbols Rounded',\n\t\t\t\t\t'sharp': 'Material Symbols Sharp'\n\t\t\t\t}[variant] || 'Material Symbols Outlined'\n\n\t\t\t\tthis.style.setProperty('--schmancy-icon-font', fontFamily)\n\t\t\t}),\n\t\t\ttakeUntil(this.disconnecting)\n\t\t).subscribe()\n\n\t}\n\n\t/**\n\t * Update captured icon from current text content\n\t */\n\tprivate _updateCapturedIcon(): void {\n\t\tif (!this.icon) {\n\t\t\tconst textContent = this.textContent?.trim()\n\t\t\tif (textContent && textContent !== this._capturedIcon) {\n\t\t\t\tthis._capturedIcon = textContent\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected updated(changedProperties: Map<string | number | symbol, unknown>): void {\n\t\tsuper.updated(changedProperties)\n\n\t\t// Update BehaviorSubjects when properties change\n\t\tif (changedProperties.has('fill')) {\n\t\t\tthis.fill$.next(this.fill)\n\t\t}\n\t\tif (changedProperties.has('weight')) {\n\t\t\tthis.weight$.next(this.weight)\n\t\t}\n\t\tif (changedProperties.has('grade')) {\n\t\t\tthis.grade$.next(this.grade)\n\t\t}\n\t\tif (changedProperties.has('variant')) {\n\t\t\tthis.variant$.next(this.variant)\n\t\t}\n\t}\n\n\tprotected render(): unknown {\n\t\tconst fontFamily = {\n\t\t\t'outlined': 'Material Symbols Outlined',\n\t\t\t'rounded': 'Material Symbols Rounded',\n\t\t\t'sharp': 'Material Symbols Sharp'\n\t\t}[this.variant] || 'Material Symbols Outlined'\n\n\t\t// Effective size: ancestor `<schmancy-button>` wins via context, else local `size`.\n\t\tconst effectiveSize: IconSize = this._buttonSize ?? this.size\n\t\t// Resolve size: token → px, bare number → px, or pass through as-is\n\t\tconst sizeConfig = SchmancyIcon.tokenSizes[effectiveSize]\n\t\tconst isNumeric = !sizeConfig && /^\\d+(\\.\\d+)?$/.test(effectiveSize)\n\t\tconst iconSize = sizeConfig?.size || (isNumeric ? `${effectiveSize}px` : effectiveSize)\n\t\tconst opticalSize = sizeConfig?.opsz || SchmancyIcon.computeOpticalSize(iconSize)\n\n\t\t// Set size on HOST so :host CSS picks it up\n\t\tthis.style.setProperty('--schmancy-icon-size', iconSize)\n\t\tthis.style.setProperty('--schmancy-icon-opsz', String(opticalSize))\n\n\t\tconst style = {\n\t\t\t'--schmancy-icon-fill': this.fill,\n\t\t\t'--schmancy-icon-weight': this.weight,\n\t\t\t'--schmancy-icon-grade': this.grade,\n\t\t\t'--schmancy-icon-font': fontFamily,\n\t\t}\n\n\t\t// Priority: icon property > captured icon (for dynamic content)\n\t\tconst iconName = this.icon || this._capturedIcon\n\n\t\t// Always render slot (hidden) to observe content changes, display via data-icon\n\t\treturn html`\n\t\t\t<span class=\"material-symbols notranslate\" part=\"icon\" translate=\"no\" data-icon=${iconName || ''} style=${this.styleMap(style)}></span>\n\t\t\t<slot style=\"display:none\"></slot>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-icon': SchmancyIcon\n\t}\n}"],"mappings":"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"}
1
+ {"version":3,"file":"icons-BpHN4Z8q.cjs","names":[],"sources":["../src/icons/icon.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { consume } from '@lit/context'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { BehaviorSubject, combineLatest, takeUntil } from 'rxjs'\nimport { tap } from 'rxjs/operators'\nimport { SchmancyButtonSizeContext, type SchmancyButtonSize } from '../button/context'\n\n/**\n * Icon size tokens - M3 aligned with optical size optimization\n * - xxs: 12px (opsz: 20) - fits in 24px buttons (ultra-compact)\n * - xs: 16px (opsz: 20) - fits in 32px buttons\n * - sm: 20px (opsz: 20) - fits in 40px buttons\n * - md: 24px (opsz: 24) - fits in 48px buttons (default)\n * - lg: 32px (opsz: 40) - fits in 56px buttons\n * - Or custom string like '48px'\n */\nexport type IconSize = 'xxs' | 'xs' | 'sm' | 'md' | 'lg' | string\n\n/**\n * @element schmancy-icon\n * Material Symbols icon component with flexible font variation properties\n *\n * @cssprop --schmancy-icon-size - The size of the icon (default: 24px)\n * @cssprop --schmancy-icon-fill - Fill value for icon (0-1)\n * @cssprop --schmancy-icon-weight - Weight value for icon (100-700)\n * @cssprop --schmancy-icon-grade - Grade value for icon (-50-200)\n * @cssprop --schmancy-icon-opsz - Optical size (default: 24)\n * @csspart icon - The inner `<span>` carrying the Material Symbols glyph.\n */\n@customElement('schmancy-icon')\nexport default class SchmancyIcon extends TailwindElement(css`\n\t:host {\n\t\t--schmancy-icon-size: 24px;\n\t\t--schmancy-icon-fill: 0;\n\t\t--schmancy-icon-weight: 400;\n\t\t--schmancy-icon-grade: 0;\n\t\t--schmancy-icon-opsz: 24;\n\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: var(--schmancy-icon-size);\n\t\theight: var(--schmancy-icon-size);\n\t\tfont-size: var(--schmancy-icon-size);\n\t\tcolor: inherit;\n\t\ttransition: font-variation-settings 0.2s ease;\n\t}\n\n\t.material-symbols {\n\t\tfont-family: var(--schmancy-icon-font, 'Material Symbols Outlined');\n\t\tfont-weight: normal;\n\t\tfont-style: normal;\n\t\tline-height: 1;\n\t\tletter-spacing: normal;\n\t\ttext-transform: none;\n\t\tdisplay: inline-block;\n\t\twhite-space: nowrap;\n\t\tword-wrap: normal;\n\t\tdirection: ltr;\n\t\t-webkit-font-smoothing: antialiased;\n\t\t-webkit-font-feature-settings: 'liga';\n\t\tfont-feature-settings: 'liga';\n\t\tfont-variation-settings:\n\t\t\t'FILL' var(--schmancy-icon-fill),\n\t\t\t'wght' var(--schmancy-icon-weight),\n\t\t\t'GRAD' var(--schmancy-icon-grade),\n\t\t\t'opsz' var(--schmancy-icon-opsz);\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t/* CSS-generated content is NOT translated by Google Translate */\n\t.material-symbols[data-icon]::before {\n\t\tcontent: attr(data-icon);\n\t}\n`) {\n\t// Static flag to track if Google Fonts have been loaded\n\tprivate static fontsLoaded = false\n\n\t/**\n\t * Load Material Symbols fonts from Google Fonts CDN\n\t */\n\tprivate static loadFonts(): void {\n\t\tif (SchmancyIcon.fontsLoaded) {\n\t\t\treturn\n\t\t}\n\n\t\tconst link = document.createElement('link')\n\t\tlink.rel = 'stylesheet'\n\t\tlink.href = 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&family=Material+Symbols+Sharp:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap'\n\t\tdocument.head.appendChild(link)\n\n\t\tSchmancyIcon.fontsLoaded = true\n\t}\n\n\t/**\n\t * Fill value for the icon (0-1)\n\t * 0 = outlined, 1 = filled\n\t */\n\t@property({ type: Number, reflect: true })\n\tfill = 0\n\n\t/**\n\t * Weight value for the icon (100-700)\n\t * Controls the thickness of the icon strokes\n\t */\n\t@property({ type: Number, reflect: true })\n\tweight = 400\n\n\t/**\n\t * Grade value for the icon (-50-200)\n\t * Adjusts the visual weight/grade\n\t */\n\t@property({ type: Number, reflect: true })\n\tgrade = 0\n\n\t/**\n\t * Icon variant style\n\t * @values outlined | rounded | sharp\n\t */\n\t@property({ type: String, reflect: true })\n\tvariant: 'outlined' | 'rounded' | 'sharp' = 'outlined'\n\n\t/**\n\t * Size of the icon - M3 aligned tokens or custom string\n\t * Tokens: 'xxs' (12px), 'xs' (16px), 'sm' (20px), 'md' (24px), 'lg' (32px)\n\t * Custom: any CSS size string like '48px', '2rem'\n\t *\n\t * When this icon is a descendant of `<schmancy-button>`, the button's\n\t * `size` wins (via `SchmancyButtonSizeContext`). The local `size` only\n\t * applies when there is no ancestor button.\n\t */\n\t@property({ type: String, reflect: true })\n\tsize: IconSize = 'md'\n\n\t/**\n\t * Size inherited from an ancestor `<schmancy-button>` via context.\n\t * Undefined when the icon is not nested in a button.\n\t */\n\t@consume({ context: SchmancyButtonSizeContext, subscribe: true })\n\t@state()\n\tprivate _buttonSize?: SchmancyButtonSize\n\n\t/**\n\t * Icon name - use this instead of slot content to prevent translation breaking icons.\n\t * When set, this takes precedence over slot content.\n\t * Example: <schmancy-icon icon=\"delete\"></schmancy-icon>\n\t */\n\t@property({ type: String })\n\ticon?: string\n\n\t// M3 aligned token sizes with optimal optical sizes\n\tprivate static readonly tokenSizes: Record<string, { size: string; opsz: number }> = {\n\t\txxs: { size: '12px', opsz: 20 }, // fits in 24px buttons (ultra-compact)\n\t\txs: { size: '16px', opsz: 20 }, // fits in 32px buttons\n\t\tsm: { size: '20px', opsz: 20 }, // fits in 40px buttons\n\t\tmd: { size: '24px', opsz: 24 }, // fits in 48px buttons (default)\n\t\tlg: { size: '32px', opsz: 40 }, // fits in 56px buttons\n\t}\n\n\t/** Extract pixel value from a custom size string for optical size */\n\tprivate static computeOpticalSize(size: string): number {\n\t\tconst px = parseFloat(size)\n\t\treturn isNaN(px) ? 24 : Math.max(20, Math.min(48, Math.round(px)))\n\t}\n\n\t// RxJS subjects for reactive property updates\n\tprivate fill$ = new BehaviorSubject(this.fill)\n\tprivate weight$ = new BehaviorSubject(this.weight)\n\tprivate grade$ = new BehaviorSubject(this.grade)\n\tprivate variant$ = new BehaviorSubject(this.variant)\n\n\t// Captured icon name from slot content (translation-proof)\n\t@state()\n\tprivate _capturedIcon?: string\n\n\t// Observer for text content changes (ternaries update text nodes, not DOM structure)\n\tprivate _observer?: MutationObserver\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback()\n\n\t\t// Capture initial icon name\n\t\tthis._updateCapturedIcon()\n\n\t\t// Watch for text content changes (characterData) for dynamic icon updates\n\t\tthis._observer = new MutationObserver(() => this._updateCapturedIcon())\n\t\tthis._observer.observe(this, { childList: true, characterData: true, subtree: true })\n\n\t\t// Load Google Fonts if not already loaded\n\t\tSchmancyIcon.loadFonts()\n\n\t\t// Prevent browser translation from breaking icon ligatures\n\t\t// Using multiple methods for maximum compatibility:\n\t\t// - translate=\"no\" (HTML5 standard)\n\t\t// - class=\"notranslate\" (Google Translate specific)\n\t\tthis.setAttribute('translate', 'no')\n\t\tthis.classList.add('notranslate')\n\n\t\t// Set accessibility attributes for decorative icons\n\t\tif (!this.hasAttribute('aria-label') &&\n\t\t !this.hasAttribute('aria-labelledby') &&\n\t\t !this.hasAttribute('aria-hidden') &&\n\t\t !this.hasAttribute('role')) {\n\t\t\tthis.setAttribute('aria-hidden', 'true')\n\t\t}\n\n\t\t// Setup reactive CSS variable updates\n\t\tcombineLatest([\n\t\t\tthis.fill$,\n\t\t\tthis.weight$,\n\t\t\tthis.grade$,\n\t\t\tthis.variant$\n\t\t]).pipe(\n\t\t\ttap(([fill, weight, grade, variant]) => {\n\t\t\t\t// Update CSS custom properties for smooth transitions\n\t\t\t\tthis.style.setProperty('--schmancy-icon-fill', String(fill))\n\t\t\t\tthis.style.setProperty('--schmancy-icon-weight', String(weight))\n\t\t\t\tthis.style.setProperty('--schmancy-icon-grade', String(grade))\n\n\t\t\t\t// Update font family based on variant\n\t\t\t\tconst fontFamily = {\n\t\t\t\t\t'outlined': 'Material Symbols Outlined',\n\t\t\t\t\t'rounded': 'Material Symbols Rounded',\n\t\t\t\t\t'sharp': 'Material Symbols Sharp'\n\t\t\t\t}[variant] || 'Material Symbols Outlined'\n\n\t\t\t\tthis.style.setProperty('--schmancy-icon-font', fontFamily)\n\t\t\t}),\n\t\t\ttakeUntil(this.disconnecting)\n\t\t).subscribe()\n\n\t}\n\n\t/**\n\t * Update captured icon from current text content\n\t */\n\tprivate _updateCapturedIcon(): void {\n\t\tif (!this.icon) {\n\t\t\tconst textContent = this.textContent?.trim()\n\t\t\tif (textContent && textContent !== this._capturedIcon) {\n\t\t\t\tthis._capturedIcon = textContent\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected updated(changedProperties: Map<string | number | symbol, unknown>): void {\n\t\tsuper.updated(changedProperties)\n\n\t\t// Update BehaviorSubjects when properties change\n\t\tif (changedProperties.has('fill')) {\n\t\t\tthis.fill$.next(this.fill)\n\t\t}\n\t\tif (changedProperties.has('weight')) {\n\t\t\tthis.weight$.next(this.weight)\n\t\t}\n\t\tif (changedProperties.has('grade')) {\n\t\t\tthis.grade$.next(this.grade)\n\t\t}\n\t\tif (changedProperties.has('variant')) {\n\t\t\tthis.variant$.next(this.variant)\n\t\t}\n\t}\n\n\tprotected render(): unknown {\n\t\tconst fontFamily = {\n\t\t\t'outlined': 'Material Symbols Outlined',\n\t\t\t'rounded': 'Material Symbols Rounded',\n\t\t\t'sharp': 'Material Symbols Sharp'\n\t\t}[this.variant] || 'Material Symbols Outlined'\n\n\t\t// Effective size: ancestor `<schmancy-button>` wins via context, else local `size`.\n\t\tconst effectiveSize: IconSize = this._buttonSize ?? this.size\n\t\t// Resolve size: token → px, bare number → px, or pass through as-is\n\t\tconst sizeConfig = SchmancyIcon.tokenSizes[effectiveSize]\n\t\tconst isNumeric = !sizeConfig && /^\\d+(\\.\\d+)?$/.test(effectiveSize)\n\t\tconst iconSize = sizeConfig?.size || (isNumeric ? `${effectiveSize}px` : effectiveSize)\n\t\tconst opticalSize = sizeConfig?.opsz || SchmancyIcon.computeOpticalSize(iconSize)\n\n\t\t// Set size on HOST so :host CSS picks it up\n\t\tthis.style.setProperty('--schmancy-icon-size', iconSize)\n\t\tthis.style.setProperty('--schmancy-icon-opsz', String(opticalSize))\n\n\t\tconst style = {\n\t\t\t'--schmancy-icon-fill': this.fill,\n\t\t\t'--schmancy-icon-weight': this.weight,\n\t\t\t'--schmancy-icon-grade': this.grade,\n\t\t\t'--schmancy-icon-font': fontFamily,\n\t\t}\n\n\t\t// Priority: icon property > captured icon (for dynamic content)\n\t\tconst iconName = this.icon || this._capturedIcon\n\n\t\t// Always render slot (hidden) to observe content changes, display via data-icon\n\t\treturn html`\n\t\t\t<span class=\"material-symbols notranslate\" part=\"icon\" translate=\"no\" data-icon=${iconName || ''} style=${this.styleMap(style)}></span>\n\t\t\t<slot style=\"display:none\"></slot>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-icon': SchmancyIcon\n\t}\n}"],"mappings":"gSA+Be,EAAA,cAA2B,EAAA,EAAgB,EAAA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yDAyErD,EAAA,KAAA,OAOE,IAAA,KAAA,MAOD,EAAA,KAAA,QAOoC,WAAA,KAAA,KAY3B,KAAA,KAAA,MAkCD,IAAI,EAAA,gBAAgB,KAAK,KAAA,CAAA,KAAA,QACvB,IAAI,EAAA,gBAAgB,KAAK,OAAA,CAAA,KAAA,OAC1B,IAAI,EAAA,gBAAgB,KAAK,MAAA,CAAA,KAAA,SACvB,IAAI,EAAA,gBAAgB,KAAK,QAAA,CAAA,OAAA,KAAA,YAAA,CA7Ff,EAK7B,OAAA,WAAe,CACd,GAAA,EAAiB,YAChB,OAGD,IAAM,EAAO,SAAS,cAAc,OAAA,CACpC,EAAK,IAAM,aACX,EAAK,KAAO,sSACZ,SAAS,KAAK,YAAY,EAAA,CAE1B,EAAa,YAAA,CAAc,EAAA,OAAA,KAAA,WA4DyD,CACpF,IAAK,CAAE,KAAM,OAAQ,KAAM,GAAA,CAC3B,GAAI,CAAE,KAAM,OAAQ,KAAM,GAAA,CAC1B,GAAI,CAAE,KAAM,OAAQ,KAAM,GAAA,CAC1B,GAAI,CAAE,KAAM,OAAQ,KAAM,GAAA,CAC1B,GAAI,CAAE,KAAM,OAAQ,KAAM,GAAA,CAAA,CAI3B,OAAA,mBAAkC,EAAA,CACjC,IAAM,EAAK,WAAW,EAAA,CACtB,OAAO,MAAM,EAAA,CAAM,GAAK,KAAK,IAAI,GAAI,KAAK,IAAI,GAAI,KAAK,MAAM,EAAA,CAAA,CAAA,CAgB9D,mBAAA,CACC,MAAM,mBAAA,CAGN,KAAK,qBAAA,CAGL,KAAK,UAAY,IAAI,qBAAuB,KAAK,qBAAA,CAAA,CACjD,KAAK,UAAU,QAAQ,KAAM,CAAE,UAAA,CAAW,EAAM,cAAA,CAAe,EAAM,QAAA,CAAS,EAAA,CAAA,CAG9E,EAAa,WAAA,CAMb,KAAK,aAAa,YAAa,KAAA,CAC/B,KAAK,UAAU,IAAI,cAAA,CAGd,KAAK,aAAa,aAAA,EAClB,KAAK,aAAa,kBAAA,EAClB,KAAK,aAAa,cAAA,EAClB,KAAK,aAAa,OAAA,EACtB,KAAK,aAAa,cAAe,OAAA,EAIlC,EAAA,EAAA,eAAc,CACb,KAAK,MACL,KAAK,QACL,KAAK,OACL,KAAK,SAAA,CAAA,CACH,MAAA,EAAA,EAAA,MAAA,CACI,EAAM,EAAQ,EAAO,KAAA,CAE1B,KAAK,MAAM,YAAY,uBAAwB,OAAO,EAAA,CAAA,CACtD,KAAK,MAAM,YAAY,yBAA0B,OAAO,EAAA,CAAA,CACxD,KAAK,MAAM,YAAY,wBAAyB,OAAO,EAAA,CAAA,CAGvD,IAAM,EAAa,CAClB,SAAY,4BACZ,QAAW,2BACX,MAAS,yBAAA,CACR,IAAY,4BAEd,KAAK,MAAM,YAAY,uBAAwB,EAAA,EAAA,EAC9C,EAAA,EAAA,WACQ,KAAK,cAAA,CAAA,CACd,WAAA,CAOH,qBAAA,CACC,GAAA,CAAK,KAAK,KAAM,CACf,IAAM,EAAc,KAAK,aAAa,MAAA,CAClC,GAAe,IAAgB,KAAK,gBACvC,KAAK,cAAgB,IAKxB,QAAkB,EAAA,CACjB,MAAM,QAAQ,EAAA,CAGV,EAAkB,IAAI,OAAA,EACzB,KAAK,MAAM,KAAK,KAAK,KAAA,CAElB,EAAkB,IAAI,SAAA,EACzB,KAAK,QAAQ,KAAK,KAAK,OAAA,CAEpB,EAAkB,IAAI,QAAA,EACzB,KAAK,OAAO,KAAK,KAAK,MAAA,CAEnB,EAAkB,IAAI,UAAA,EACzB,KAAK,SAAS,KAAK,KAAK,QAAA,CAI1B,QAAA,CACC,IAAM,EAAa,CAClB,SAAY,4BACZ,QAAW,2BACX,MAAS,yBAAA,CACR,KAAK,UAAY,4BAGb,EAA0B,KAAK,aAAe,KAAK,KAEnD,EAAA,EAA0B,WAAW,GACrC,EAAA,CAAa,GAAc,gBAAgB,KAAK,EAAA,CAChD,EAAW,GAAY,OAAS,EAAY,GAAG,EAAA,IAAoB,GACnE,EAAc,GAAY,MAAA,EAAqB,mBAAmB,EAAA,CAGxE,KAAK,MAAM,YAAY,uBAAwB,EAAA,CAC/C,KAAK,MAAM,YAAY,uBAAwB,OAAO,EAAA,CAAA,CAEtD,IAAM,EAAQ,CACb,uBAAwB,KAAK,KAC7B,yBAA0B,KAAK,OAC/B,wBAAyB,KAAK,MAC9B,uBAAwB,EAAA,CAOzB,MAAO,GAAA,IAAI;qFAHM,KAAK,MAAQ,KAAK,eAI4D,GAAA,SAAY,KAAK,SAAS,EAAA,CAAA;;0BApMhH,CAAE,KAAM,OAAQ,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,OAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAOhC,CAAE,KAAM,OAAQ,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,SAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAOhC,CAAE,KAAM,OAAQ,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,QAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAOhC,CAAE,KAAM,OAAQ,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,UAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAYhC,CAAE,KAAM,OAAQ,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,OAAA,IAAA,GAAA,CAAA,EAAA,EAAA,CAOzC,EAAA,EAAQ,CAAE,QAAS,EAAA,EAA2B,UAAA,CAAW,EAAA,CAAA,EAAO,EAAA,EAAA,QAAA,CAAA,CACzD,EAAA,UAAA,cAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAQE,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,OAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,QAAA,CAAA,CAyBnB,EAAA,UAAA,gBAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAnJM,gBAAA,CAAA,CAAgB,EAAA"}
package/dist/icons.cjs CHANGED
@@ -1 +1 @@
1
- require(`./icons-B6V3nZ4-.cjs`);
1
+ require(`./icons-BpHN4Z8q.cjs`);
package/dist/icons.js CHANGED
@@ -1 +1 @@
1
- import "./icons-C5-DIjet.js";
1
+ import "./icons-24zlLf1q.js";
@@ -1,4 +1,4 @@
1
- require(`./chunk-CncqDLb2.cjs`);const e=require(`./tailwind.mixin-Bh58QnlW.cjs`),t=require(`./decorate-F9CuyeHg.cjs`);require(`./mixins.cjs`);let n=require(`lit/decorators.js`),r=require(`lit`);var i=class extends e.t(r.css`
1
+ require(`./chunk-CncqDLb2.cjs`);const e=require(`./tailwind.mixin-BHX99hgX.cjs`),t=require(`./decorate-F9CuyeHg.cjs`);require(`./mixins.cjs`);let n=require(`lit/decorators.js`),r=require(`lit`);var i=class extends e.t(r.css`
2
2
  :host {
3
3
  display: block;
4
4
  }
@@ -1 +1 @@
1
- {"version":3,"file":"iframe-C7sHg7RC.cjs","names":[],"sources":["../src/iframe/iframe.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { css, html, PropertyValues } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\n/** Sensible document reset for iframe content — font, spacing, word-wrap */\nconst DEFAULT_BASE_CSS = `html,body{margin:0;padding:0;overflow:hidden;background:#fff;color:#1a1a1a;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;font-size:14px;line-height:1.6;word-wrap:break-word;overflow-wrap:break-word}\nbody{padding:16px}\np{margin:0 0 1em}p:last-child{margin-bottom:0}\nul,ol{margin:0 0 1em;padding-left:1.5em}li{margin-bottom:.25em}\nh1,h2,h3,h4{margin:0 0 .5em;line-height:1.3}h1{font-size:1.5em}h2{font-size:1.25em}h3{font-size:1.1em}h4{font-size:1em}\nhr{border:none;border-top:1px solid #dadce0;margin:1em 0}\nimg{max-width:100%;height:auto}\ntable{border-collapse:collapse;max-width:100%}td,th{padding:4px 8px;border:1px solid #dadce0}\nblockquote{margin:0 0 1em;padding:.5em 0 .5em 1em;border-left:3px solid #dadce0;color:#5f6368}\npre{background:#f5f5f5;padding:.75em;border-radius:4px;overflow-x:auto;font-size:.9em}\ncode{background:#f5f5f5;padding:.1em .3em;border-radius:3px;font-size:.9em}`\n\n/**\n * Renders an HTML fragment inside a sandboxed, auto-sizing iframe.\n *\n * @slot - (none)\n * @fires load — native iframe load event\n *\n * @example\n * ```html\n * <schmancy-iframe .html=${bodyHtml} .css=${extraStyles}></schmancy-iframe>\n * ```\n */\n@customElement('schmancy-iframe')\nexport default class SchmancyIframe extends TailwindElement(css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\tiframe {\n\t\tborder: 0;\n\t\twidth: 100%;\n\t}\n`) {\n\t/** HTML body fragment to render inside the iframe */\n\t@property({ type: String }) html = ''\n\n\t/** Additional CSS injected after the base styles (consumer-specific) */\n\t@property({ type: String }) css = ''\n\n\t/** Base document CSS (font, spacing, resets). Override for fully custom styling */\n\t@property({ type: String }) baseCss = DEFAULT_BASE_CSS\n\n\t/** iframe sandbox attribute */\n\t@property({ type: String }) sandbox = 'allow-same-origin allow-popups'\n\n\t/** Minimum height in pixels */\n\t@property({ type: Number }) minHeight = 60\n\n\t@state() private _height = 60\n\tprivate _srcdoc = ''\n\n\tprotected willUpdate(changed: PropertyValues) {\n\t\tif (changed.has('html') || changed.has('css') || changed.has('baseCss')) {\n\t\t\tthis._srcdoc = this.html ? this.buildSrcdoc() : ''\n\t\t\tthis._height = this.minHeight\n\t\t}\n\t}\n\n\tprivate buildSrcdoc(): string {\n\t\tconst styles = this.css ? `${this.baseCss}\\n${this.css}` : this.baseCss\n\t\treturn `<!DOCTYPE html><html><head>\n<meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<base target=\"_blank\">\n<style>${styles}</style></head><body>${this.html}</body></html>`\n\t}\n\n\tprivate onLoad(e: Event) {\n\t\tconst iframe = e.target as HTMLIFrameElement\n\t\ttry {\n\t\t\tconst doc = iframe.contentDocument\n\t\t\tif (!doc) return\n\t\t\tthis._height = Math.max(doc.documentElement.scrollHeight, this.minHeight)\n\t\t} catch {\n\t\t\tthis._height = Math.max(200, this.minHeight)\n\t\t}\n\t}\n\n\tprotected render() {\n\t\tif (!this.html) return html``\n\t\treturn html`<iframe\n\t\t\t.srcdoc=${this._srcdoc}\n\t\t\tsandbox=${this.sandbox}\n\t\t\tstyle=\"height:${this._height}px;min-height:${this.minHeight}px;overflow:hidden\"\n\t\t\t@load=${this.onLoad}\n\t\t></iframe>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-iframe': SchmancyIframe\n\t}\n}\n"],"mappings":"kMAKA,IAwBe,EAAA,cAA6B,EAAA,EAAgB,EAAA,GAAG;;;;;;;;2CAU3B,GAAA,KAAA,IAGD,GAAA,KAAA,QArCV;;;;;;;;;;6EAAA,KAAA,QA2Cc,iCAAA,KAAA,UAGE,GAAA,KAAA,QAEb,GAAA,KAAA,QACT,GAElB,WAAqB,EAAA,EAChB,EAAQ,IAAI,OAAA,EAAW,EAAQ,IAAI,MAAA,EAAU,EAAQ,IAAI,UAAA,IAC5D,KAAK,QAAU,KAAK,KAAO,KAAK,aAAA,CAAgB,GAChD,KAAK,QAAU,KAAK,WAItB,aAAA,CAEC,MAAO,0JADQ,KAAK,IAAM,GAAG,KAAK,QAAA,IAAY,KAAK,MAAQ,KAAK,QAAA,uBAI3B,KAAK,KAAA,gBAG3C,OAAe,EAAA,CACd,IAAM,EAAS,EAAE,OACjB,GAAA,CACC,IAAM,EAAM,EAAO,gBACnB,GAAA,CAAK,EAAK,OACV,KAAK,QAAU,KAAK,IAAI,EAAI,gBAAgB,aAAc,KAAK,UAAA,MAAA,CAE/D,KAAK,QAAU,KAAK,IAAI,IAAK,KAAK,UAAA,EAIpC,QAAA,CACC,OAAK,KAAK,KACH,EAAA,IAAI;aACA,KAAK,QAAA;aACL,KAAK,QAAA;mBACC,KAAK,QAAA,gBAAwB,KAAK,UAAA;WAC1C,KAAK,OAAA;cALS,EAAA,IAAI,KAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UA5ClB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,OAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,MAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,UAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,UAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,YAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,QAAA,CAAA,CAEnB,EAAA,UAAA,UAAA,IAAA,GAAA,CAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAzBM,kBAAA,CAAA,CAAkB,EAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"iframe-BXzYZu9_.cjs","names":[],"sources":["../src/iframe/iframe.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { css, html, PropertyValues } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\n/** Sensible document reset for iframe content — font, spacing, word-wrap */\nconst DEFAULT_BASE_CSS = `html,body{margin:0;padding:0;overflow:hidden;background:#fff;color:#1a1a1a;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;font-size:14px;line-height:1.6;word-wrap:break-word;overflow-wrap:break-word}\nbody{padding:16px}\np{margin:0 0 1em}p:last-child{margin-bottom:0}\nul,ol{margin:0 0 1em;padding-left:1.5em}li{margin-bottom:.25em}\nh1,h2,h3,h4{margin:0 0 .5em;line-height:1.3}h1{font-size:1.5em}h2{font-size:1.25em}h3{font-size:1.1em}h4{font-size:1em}\nhr{border:none;border-top:1px solid #dadce0;margin:1em 0}\nimg{max-width:100%;height:auto}\ntable{border-collapse:collapse;max-width:100%}td,th{padding:4px 8px;border:1px solid #dadce0}\nblockquote{margin:0 0 1em;padding:.5em 0 .5em 1em;border-left:3px solid #dadce0;color:#5f6368}\npre{background:#f5f5f5;padding:.75em;border-radius:4px;overflow-x:auto;font-size:.9em}\ncode{background:#f5f5f5;padding:.1em .3em;border-radius:3px;font-size:.9em}`\n\n/**\n * Renders an HTML fragment inside a sandboxed, auto-sizing iframe.\n *\n * @slot - (none)\n * @fires load — native iframe load event\n *\n * @example\n * ```html\n * <schmancy-iframe .html=${bodyHtml} .css=${extraStyles}></schmancy-iframe>\n * ```\n */\n@customElement('schmancy-iframe')\nexport default class SchmancyIframe extends TailwindElement(css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\tiframe {\n\t\tborder: 0;\n\t\twidth: 100%;\n\t}\n`) {\n\t/** HTML body fragment to render inside the iframe */\n\t@property({ type: String }) html = ''\n\n\t/** Additional CSS injected after the base styles (consumer-specific) */\n\t@property({ type: String }) css = ''\n\n\t/** Base document CSS (font, spacing, resets). Override for fully custom styling */\n\t@property({ type: String }) baseCss = DEFAULT_BASE_CSS\n\n\t/** iframe sandbox attribute */\n\t@property({ type: String }) sandbox = 'allow-same-origin allow-popups'\n\n\t/** Minimum height in pixels */\n\t@property({ type: Number }) minHeight = 60\n\n\t@state() private _height = 60\n\tprivate _srcdoc = ''\n\n\tprotected willUpdate(changed: PropertyValues) {\n\t\tif (changed.has('html') || changed.has('css') || changed.has('baseCss')) {\n\t\t\tthis._srcdoc = this.html ? this.buildSrcdoc() : ''\n\t\t\tthis._height = this.minHeight\n\t\t}\n\t}\n\n\tprivate buildSrcdoc(): string {\n\t\tconst styles = this.css ? `${this.baseCss}\\n${this.css}` : this.baseCss\n\t\treturn `<!DOCTYPE html><html><head>\n<meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<base target=\"_blank\">\n<style>${styles}</style></head><body>${this.html}</body></html>`\n\t}\n\n\tprivate onLoad(e: Event) {\n\t\tconst iframe = e.target as HTMLIFrameElement\n\t\ttry {\n\t\t\tconst doc = iframe.contentDocument\n\t\t\tif (!doc) return\n\t\t\tthis._height = Math.max(doc.documentElement.scrollHeight, this.minHeight)\n\t\t} catch {\n\t\t\tthis._height = Math.max(200, this.minHeight)\n\t\t}\n\t}\n\n\tprotected render() {\n\t\tif (!this.html) return html``\n\t\treturn html`<iframe\n\t\t\t.srcdoc=${this._srcdoc}\n\t\t\tsandbox=${this.sandbox}\n\t\t\tstyle=\"height:${this._height}px;min-height:${this.minHeight}px;overflow:hidden\"\n\t\t\t@load=${this.onLoad}\n\t\t></iframe>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-iframe': SchmancyIframe\n\t}\n}\n"],"mappings":"kMAKA,IAwBe,EAAA,cAA6B,EAAA,EAAgB,EAAA,GAAG;;;;;;;;2CAU3B,GAAA,KAAA,IAGD,GAAA,KAAA,QArCV;;;;;;;;;;6EAAA,KAAA,QA2Cc,iCAAA,KAAA,UAGE,GAAA,KAAA,QAEb,GAAA,KAAA,QACT,GAElB,WAAqB,EAAA,EAChB,EAAQ,IAAI,OAAA,EAAW,EAAQ,IAAI,MAAA,EAAU,EAAQ,IAAI,UAAA,IAC5D,KAAK,QAAU,KAAK,KAAO,KAAK,aAAA,CAAgB,GAChD,KAAK,QAAU,KAAK,WAItB,aAAA,CAEC,MAAO,0JADQ,KAAK,IAAM,GAAG,KAAK,QAAA,IAAY,KAAK,MAAQ,KAAK,QAAA,uBAI3B,KAAK,KAAA,gBAG3C,OAAe,EAAA,CACd,IAAM,EAAS,EAAE,OACjB,GAAA,CACC,IAAM,EAAM,EAAO,gBACnB,GAAA,CAAK,EAAK,OACV,KAAK,QAAU,KAAK,IAAI,EAAI,gBAAgB,aAAc,KAAK,UAAA,MAAA,CAE/D,KAAK,QAAU,KAAK,IAAI,IAAK,KAAK,UAAA,EAIpC,QAAA,CACC,OAAK,KAAK,KACH,EAAA,IAAI;aACA,KAAK,QAAA;aACL,KAAK,QAAA;mBACC,KAAK,QAAA,gBAAwB,KAAK,UAAA;WAC1C,KAAK,OAAA;cALS,EAAA,IAAI,KAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UA5ClB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,OAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,MAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,UAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,UAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,YAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,QAAA,CAAA,CAEnB,EAAA,UAAA,UAAA,IAAA,GAAA,CAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAzBM,kBAAA,CAAA,CAAkB,EAAA,CAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "./tailwind.mixin-H5Pn7vSJ.js";
1
+ import { t as e } from "./tailwind.mixin-DIEGVcl3.js";
2
2
  import { t } from "./decorate-D_utPUsC.js";
3
3
  import "./mixins.js";
4
4
  import { customElement as n, property as r, state as i } from "lit/decorators.js";
@@ -1 +1 @@
1
- {"version":3,"file":"iframe-BXBsuLwt.js","names":[],"sources":["../src/iframe/iframe.ts"],"sourcesContent":["import { TailwindElement } from '@mixins/index'\nimport { css, html, PropertyValues } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\n/** Sensible document reset for iframe content — font, spacing, word-wrap */\nconst DEFAULT_BASE_CSS = `html,body{margin:0;padding:0;overflow:hidden;background:#fff;color:#1a1a1a;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;font-size:14px;line-height:1.6;word-wrap:break-word;overflow-wrap:break-word}\nbody{padding:16px}\np{margin:0 0 1em}p:last-child{margin-bottom:0}\nul,ol{margin:0 0 1em;padding-left:1.5em}li{margin-bottom:.25em}\nh1,h2,h3,h4{margin:0 0 .5em;line-height:1.3}h1{font-size:1.5em}h2{font-size:1.25em}h3{font-size:1.1em}h4{font-size:1em}\nhr{border:none;border-top:1px solid #dadce0;margin:1em 0}\nimg{max-width:100%;height:auto}\ntable{border-collapse:collapse;max-width:100%}td,th{padding:4px 8px;border:1px solid #dadce0}\nblockquote{margin:0 0 1em;padding:.5em 0 .5em 1em;border-left:3px solid #dadce0;color:#5f6368}\npre{background:#f5f5f5;padding:.75em;border-radius:4px;overflow-x:auto;font-size:.9em}\ncode{background:#f5f5f5;padding:.1em .3em;border-radius:3px;font-size:.9em}`\n\n/**\n * Renders an HTML fragment inside a sandboxed, auto-sizing iframe.\n *\n * @slot - (none)\n * @fires load — native iframe load event\n *\n * @example\n * ```html\n * <schmancy-iframe .html=${bodyHtml} .css=${extraStyles}></schmancy-iframe>\n * ```\n */\n@customElement('schmancy-iframe')\nexport default class SchmancyIframe extends TailwindElement(css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\tiframe {\n\t\tborder: 0;\n\t\twidth: 100%;\n\t}\n`) {\n\t/** HTML body fragment to render inside the iframe */\n\t@property({ type: String }) html = ''\n\n\t/** Additional CSS injected after the base styles (consumer-specific) */\n\t@property({ type: String }) css = ''\n\n\t/** Base document CSS (font, spacing, resets). Override for fully custom styling */\n\t@property({ type: String }) baseCss = DEFAULT_BASE_CSS\n\n\t/** iframe sandbox attribute */\n\t@property({ type: String }) sandbox = 'allow-same-origin allow-popups'\n\n\t/** Minimum height in pixels */\n\t@property({ type: Number }) minHeight = 60\n\n\t@state() private _height = 60\n\tprivate _srcdoc = ''\n\n\tprotected willUpdate(changed: PropertyValues) {\n\t\tif (changed.has('html') || changed.has('css') || changed.has('baseCss')) {\n\t\t\tthis._srcdoc = this.html ? this.buildSrcdoc() : ''\n\t\t\tthis._height = this.minHeight\n\t\t}\n\t}\n\n\tprivate buildSrcdoc(): string {\n\t\tconst styles = this.css ? `${this.baseCss}\\n${this.css}` : this.baseCss\n\t\treturn `<!DOCTYPE html><html><head>\n<meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<base target=\"_blank\">\n<style>${styles}</style></head><body>${this.html}</body></html>`\n\t}\n\n\tprivate onLoad(e: Event) {\n\t\tconst iframe = e.target as HTMLIFrameElement\n\t\ttry {\n\t\t\tconst doc = iframe.contentDocument\n\t\t\tif (!doc) return\n\t\t\tthis._height = Math.max(doc.documentElement.scrollHeight, this.minHeight)\n\t\t} catch {\n\t\t\tthis._height = Math.max(200, this.minHeight)\n\t\t}\n\t}\n\n\tprotected render() {\n\t\tif (!this.html) return html``\n\t\treturn html`<iframe\n\t\t\t.srcdoc=${this._srcdoc}\n\t\t\tsandbox=${this.sandbox}\n\t\t\tstyle=\"height:${this._height}px;min-height:${this.minHeight}px;overflow:hidden\"\n\t\t\t@load=${this.onLoad}\n\t\t></iframe>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-iframe': SchmancyIframe\n\t}\n}\n"],"mappings":";;;;;AAKA,IAwBe,IAAA,cAA6B,EAAgB,CAAG;;;;;;;;;;2BAU3B,IAAA,KAAA,MAGD,IAAA,KAAA,UArCV,27BAAA,KAAA,UA2Cc,kCAAA,KAAA,YAGE,IAAA,KAAA,UAEb,IAAA,KAAA,UACT;;CAElB,WAAqB,GAAA;AAAA,GAChB,EAAQ,IAAI,OAAA,IAAW,EAAQ,IAAI,MAAA,IAAU,EAAQ,IAAI,UAAA,MAC5D,KAAK,UAAU,KAAK,OAAO,KAAK,aAAA,GAAgB,IAChD,KAAK,UAAU,KAAK;;CAItB,cAAA;AAEC,SAAO,0JADQ,KAAK,MAAM,GAAG,KAAK,QAAA,IAAY,KAAK,QAAQ,KAAK,QAAA,uBAI3B,KAAK,KAAA;;CAG3C,OAAe,GAAA;EACd,IAAM,IAAS,EAAE;AACjB,MAAA;GACC,IAAM,IAAM,EAAO;AACnB,OAAA,CAAK,EAAK;AACV,QAAK,UAAU,KAAK,IAAI,EAAI,gBAAgB,cAAc,KAAK,UAAA;UAAA;AAE/D,QAAK,UAAU,KAAK,IAAI,KAAK,KAAK,UAAA;;;CAIpC,SAAA;AACC,SAAK,KAAK,OACH,CAAI;aACA,KAAK,QAAA;aACL,KAAK,QAAA;mBACC,KAAK,QAAA,gBAAwB,KAAK,UAAA;WAC1C,KAAK,OAAA;gBALS,CAAI;;;AAAA,EAAA,CA5C3B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,QAAA,KAAA,EAAA,EAAA,EAAA,CAG1B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,OAAA,KAAA,EAAA,EAAA,EAAA,CAG1B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,WAAA,KAAA,EAAA,EAAA,EAAA,CAG1B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,WAAA,KAAA,EAAA,EAAA,EAAA,CAG1B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,aAAA,KAAA,EAAA,EAAA,EAAA,CAE1B,GAAA,CAAA,EAAO,EAAA,WAAA,WAAA,KAAA,EAAA;AAAA,IAAA,IAAA,IAAA,EAAA,CAzBR,EAAc,kBAAA,CAAA,EAAkB,EAAA;AAAA,SAAA,KAAA"}
1
+ {"version":3,"file":"iframe-B_QrvTmj.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"}