@francofantomius/material-components 1.1.1 → 1.2.0

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 (380) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +2 -1
  3. package/custom-elements.json +1049 -300
  4. package/dist/chunks/{account-menu-Dau0UHTl.js → account-menu-Bo7NghIm.js} +181 -223
  5. package/dist/chunks/{account-menu-Dau0UHTl.js.map → account-menu-Bo7NghIm.js.map} +1 -1
  6. package/dist/chunks/app-drawer-DjKSuatE.js +855 -0
  7. package/dist/chunks/{app-drawer-Du1ePzxZ.js.map → app-drawer-DjKSuatE.js.map} +1 -1
  8. package/dist/chunks/{badge-G4EjcMoy.js → badge-sZzNelZz.js} +30 -34
  9. package/dist/chunks/{badge-G4EjcMoy.js.map → badge-sZzNelZz.js.map} +1 -1
  10. package/dist/chunks/{bottom-sheet-q79BBYAj.js → bottom-sheet-BGgbUmKd.js} +98 -109
  11. package/dist/chunks/{bottom-sheet-q79BBYAj.js.map → bottom-sheet-BGgbUmKd.js.map} +1 -1
  12. package/dist/chunks/{button-D2vn7kJ8.js → button-DeQQlYds.js} +62 -72
  13. package/dist/chunks/{button-D2vn7kJ8.js.map → button-DeQQlYds.js.map} +1 -1
  14. package/dist/chunks/button-group-R2jN8FXK.js +136 -0
  15. package/dist/chunks/{button-group-CNqvJx1n.js.map → button-group-R2jN8FXK.js.map} +1 -1
  16. package/dist/chunks/{card-DVffdPpv.js → card-CVhWizDF.js} +45 -50
  17. package/dist/chunks/{card-DVffdPpv.js.map → card-CVhWizDF.js.map} +1 -1
  18. package/dist/chunks/{carousel-item-BG6kjjjk.js → carousel-item-DNp2zhP9.js} +62 -73
  19. package/dist/chunks/{carousel-item-BG6kjjjk.js.map → carousel-item-DNp2zhP9.js.map} +1 -1
  20. package/dist/chunks/{checkbox-BqlboAHd.js → checkbox-CsqUHVOF.js} +59 -64
  21. package/dist/chunks/{checkbox-BqlboAHd.js.map → checkbox-CsqUHVOF.js.map} +1 -1
  22. package/dist/chunks/{chip-CI1ZINnr.js → chip-B5c-I8bj.js} +56 -63
  23. package/dist/chunks/{chip-CI1ZINnr.js.map → chip-B5c-I8bj.js.map} +1 -1
  24. package/dist/chunks/code-CM6hIZNx.js +1531 -0
  25. package/dist/chunks/{code-C5UFBkCh.js.map → code-CM6hIZNx.js.map} +1 -1
  26. package/dist/chunks/date-picker-B15_rR0f.js +774 -0
  27. package/dist/chunks/date-picker-B15_rR0f.js.map +1 -0
  28. package/dist/chunks/decorate-DknOJ8FJ.js +40 -0
  29. package/dist/chunks/{decorate-DXuynaiA.js.map → decorate-DknOJ8FJ.js.map} +1 -1
  30. package/dist/chunks/{dialog-DGVEE5m_.js → dialog-Czknf8dl.js} +47 -52
  31. package/dist/chunks/{dialog-DGVEE5m_.js.map → dialog-Czknf8dl.js.map} +1 -1
  32. package/dist/chunks/divider-DIyCOosa.js +78 -0
  33. package/dist/chunks/{divider-DNepwoZv.js.map → divider-DIyCOosa.js.map} +1 -1
  34. package/dist/chunks/{fab-C9j3WBHE.js → fab-aZC0-lHo.js} +38 -44
  35. package/dist/chunks/{fab-C9j3WBHE.js.map → fab-aZC0-lHo.js.map} +1 -1
  36. package/dist/chunks/{fab-menu.css-3pu930sZ.js → fab-menu.css-BdVg1k4c.js} +5 -6
  37. package/dist/chunks/{fab-menu.css-3pu930sZ.js.map → fab-menu.css-BdVg1k4c.js.map} +1 -1
  38. package/dist/chunks/focus-ring-K6SY_mIm.js +69 -0
  39. package/dist/chunks/{focus-ring-CuiJuM-y.js.map → focus-ring-K6SY_mIm.js.map} +1 -1
  40. package/dist/chunks/form-associated-Do5uXckv.js +69 -0
  41. package/dist/chunks/{form-associated-Cty_ZaS9.js.map → form-associated-Do5uXckv.js.map} +1 -1
  42. package/dist/chunks/icon-FvKeXi61.js +59 -0
  43. package/dist/chunks/{icon-DrNqcNEL.js.map → icon-FvKeXi61.js.map} +1 -1
  44. package/dist/chunks/{icon-button-BQz73GLa.js → icon-button-CulnCZpZ.js} +58 -67
  45. package/dist/chunks/{icon-button-BQz73GLa.js.map → icon-button-CulnCZpZ.js.map} +1 -1
  46. package/dist/chunks/{list-D8olR7oZ.js → list-D7yrbJRL.js} +64 -72
  47. package/dist/chunks/{list-D8olR7oZ.js.map → list-D7yrbJRL.js.map} +1 -1
  48. package/dist/chunks/{loading-indicator-CvWnZr9o.js → loading-indicator-D9AyxNQh.js} +41 -46
  49. package/dist/chunks/{loading-indicator-CvWnZr9o.js.map → loading-indicator-D9AyxNQh.js.map} +1 -1
  50. package/dist/chunks/{menu-item-BBSp5Cqc.js → menu-item-C3entPo7.js} +77 -91
  51. package/dist/chunks/{menu-item-BBSp5Cqc.js.map → menu-item-C3entPo7.js.map} +1 -1
  52. package/dist/chunks/{navigation-bar-item-C9DfOEzg.js → navigation-bar-item-CWHCQeNw.js} +98 -115
  53. package/dist/chunks/{navigation-bar-item-C9DfOEzg.js.map → navigation-bar-item-CWHCQeNw.js.map} +1 -1
  54. package/dist/chunks/{navigation-drawer-CKl44Ef5.js → navigation-drawer-pGer0t4z.js} +116 -138
  55. package/dist/chunks/{navigation-drawer-CKl44Ef5.js.map → navigation-drawer-pGer0t4z.js.map} +1 -1
  56. package/dist/chunks/{navigation-rail-item-6pdhNHJK.js → navigation-rail-item-CWvGjLjC.js} +70 -86
  57. package/dist/chunks/{navigation-rail-item-6pdhNHJK.js.map → navigation-rail-item-CWvGjLjC.js.map} +1 -1
  58. package/dist/chunks/{player-C4ydiIpr.js → player-dT08kxeG.js} +423 -466
  59. package/dist/chunks/{player-C4ydiIpr.js.map → player-dT08kxeG.js.map} +1 -1
  60. package/dist/chunks/{progress-LQmLMDjX.js → progress-etZuX_VD.js} +46 -53
  61. package/dist/chunks/{progress-LQmLMDjX.js.map → progress-etZuX_VD.js.map} +1 -1
  62. package/dist/chunks/radio-jPCwykIa.js +197 -0
  63. package/dist/chunks/{radio-Bily78NT.js.map → radio-jPCwykIa.js.map} +1 -1
  64. package/dist/chunks/ripple-CBOKeVfm.js +132 -0
  65. package/dist/chunks/{ripple-squbKHhj.js.map → ripple-CBOKeVfm.js.map} +1 -1
  66. package/dist/chunks/{search-bar-fUD0qU2P.js → search-bar-B6xxVT7u.js} +244 -203
  67. package/dist/chunks/search-bar-B6xxVT7u.js.map +1 -0
  68. package/dist/chunks/segmented-button-Fon9kOHV.js +253 -0
  69. package/dist/chunks/{segmented-button-B0BvGSQ7.js.map → segmented-button-Fon9kOHV.js.map} +1 -1
  70. package/dist/chunks/{side-sheet-S2w081AK.js → side-sheet-sQ8qGKVm.js} +73 -81
  71. package/dist/chunks/{side-sheet-S2w081AK.js.map → side-sheet-sQ8qGKVm.js.map} +1 -1
  72. package/dist/chunks/slider-OIyEcUU9.js +448 -0
  73. package/dist/chunks/slider-OIyEcUU9.js.map +1 -0
  74. package/dist/chunks/{snackbar-Wsz3BzEY.js → snackbar-Yi6fF9vM.js} +57 -62
  75. package/dist/chunks/{snackbar-Wsz3BzEY.js.map → snackbar-Yi6fF9vM.js.map} +1 -1
  76. package/dist/chunks/{split-button-DUfjukQY.js → split-button-CLjVJe3I.js} +155 -172
  77. package/dist/chunks/{split-button-DUfjukQY.js.map → split-button-CLjVJe3I.js.map} +1 -1
  78. package/dist/chunks/{switch-DdukrvXb.js → switch-mtu6AVEh.js} +54 -57
  79. package/dist/chunks/{switch-DdukrvXb.js.map → switch-mtu6AVEh.js.map} +1 -1
  80. package/dist/chunks/table-C5rCvdFc.js +724 -0
  81. package/dist/chunks/{table-CqHnneAj.js.map → table-C5rCvdFc.js.map} +1 -1
  82. package/dist/chunks/tabs-C0mtURlT.js +182 -0
  83. package/dist/chunks/{tabs-BfOtoeir.js.map → tabs-C0mtURlT.js.map} +1 -1
  84. package/dist/chunks/{text-field-hN6-2HQy.js → text-field-MifFD7uk.js} +92 -110
  85. package/dist/chunks/{text-field-hN6-2HQy.js.map → text-field-MifFD7uk.js.map} +1 -1
  86. package/dist/chunks/time-picker-JTcLcJuz.js +810 -0
  87. package/dist/chunks/time-picker-JTcLcJuz.js.map +1 -0
  88. package/dist/chunks/{toolbar-DXVQbQKJ.js → toolbar-CsxKc2Yd.js} +48 -55
  89. package/dist/chunks/{toolbar-DXVQbQKJ.js.map → toolbar-CsxKc2Yd.js.map} +1 -1
  90. package/dist/chunks/tooltip-Ds3lNowS.js +380 -0
  91. package/dist/chunks/{tooltip-CE7JMHMu.js.map → tooltip-Ds3lNowS.js.map} +1 -1
  92. package/dist/chunks/{top-app-bar-Dgbp6CFv.js → top-app-bar-TrnjKzOX.js} +52 -53
  93. package/dist/chunks/top-app-bar-TrnjKzOX.js.map +1 -0
  94. package/dist/components/account-menu/account-menu.js +2 -8
  95. package/dist/components/app-drawer/app-drawer.js +2 -9
  96. package/dist/components/badge/badge.js +2 -4
  97. package/dist/components/bottom-sheet/bottom-sheet.js +2 -4
  98. package/dist/components/button/button.js +2 -4
  99. package/dist/components/button-group/button-group.js +2 -4
  100. package/dist/components/card/card.js +2 -4
  101. package/dist/components/carousel/carousel-item.js +2 -4
  102. package/dist/components/carousel/carousel.js +214 -232
  103. package/dist/components/carousel/carousel.js.map +1 -1
  104. package/dist/components/checkbox/checkbox.js +2 -4
  105. package/dist/components/chip/chip.js +2 -5
  106. package/dist/components/code/code.js +2 -5
  107. package/dist/components/date-picker/date-picker.js +2 -4
  108. package/dist/components/dialog/dialog.js +2 -4
  109. package/dist/components/divider/divider.js +2 -4
  110. package/dist/components/fab/fab.js +2 -4
  111. package/dist/components/fab-menu/fab-menu-item.js +53 -61
  112. package/dist/components/fab-menu/fab-menu-item.js.map +1 -1
  113. package/dist/components/fab-menu/fab-menu.js +98 -111
  114. package/dist/components/fab-menu/fab-menu.js.map +1 -1
  115. package/dist/components/icon/icon.js +2 -4
  116. package/dist/components/icon-button/icon-button.js +2 -4
  117. package/dist/components/list/list.js +2 -5
  118. package/dist/components/loading-indicator/loading-indicator.js +2 -4
  119. package/dist/components/menu/menu-item.js +2 -4
  120. package/dist/components/menu/menu.js +165 -183
  121. package/dist/components/menu/menu.js.map +1 -1
  122. package/dist/components/navigation-bar/navigation-bar-item.js +2 -5
  123. package/dist/components/navigation-bar/navigation-bar.js +131 -143
  124. package/dist/components/navigation-bar/navigation-bar.js.map +1 -1
  125. package/dist/components/navigation-drawer/navigation-drawer.js +2 -8
  126. package/dist/components/navigation-rail/navigation-rail-item.js +2 -5
  127. package/dist/components/navigation-rail/navigation-rail.js +92 -102
  128. package/dist/components/navigation-rail/navigation-rail.js.map +1 -1
  129. package/dist/components/player/player.js +2 -7
  130. package/dist/components/progress/progress.js +2 -5
  131. package/dist/components/radio/radio.js +2 -5
  132. package/dist/components/search-bar/search-bar.js +2 -5
  133. package/dist/components/segmented-button/segmented-button.js +2 -5
  134. package/dist/components/side-sheet/side-sheet.js +2 -4
  135. package/dist/components/slider/slider.js +2 -4
  136. package/dist/components/snackbar/snackbar.js +2 -4
  137. package/dist/components/split-button/split-button.js +2 -4
  138. package/dist/components/switch/switch.js +2 -4
  139. package/dist/components/table/table.js +2 -13
  140. package/dist/components/tabs/tabs.js +2 -5
  141. package/dist/components/text-field/text-field.js +2 -4
  142. package/dist/components/time-picker/time-picker.js +2 -4
  143. package/dist/components/toolbar/toolbar.js +2 -4
  144. package/dist/components/tooltip/tooltip.js +2 -4
  145. package/dist/components/top-app-bar/top-app-bar.js +2 -5
  146. package/dist/index.js +52 -150
  147. package/dist/internal/focus-ring/focus-ring.js +2 -4
  148. package/dist/internal/ripple/ripple.js +2 -4
  149. package/dist/tokens/index.js +468 -314
  150. package/dist/tokens/index.js.map +1 -1
  151. package/llms.txt +74 -8
  152. package/package.json +2 -14
  153. package/dist/chunks/app-drawer-Du1ePzxZ.js +0 -903
  154. package/dist/chunks/button-group-CNqvJx1n.js +0 -143
  155. package/dist/chunks/code-C5UFBkCh.js +0 -1830
  156. package/dist/chunks/date-picker-DJeHi4w-.js +0 -777
  157. package/dist/chunks/date-picker-DJeHi4w-.js.map +0 -1
  158. package/dist/chunks/decorate-DXuynaiA.js +0 -39
  159. package/dist/chunks/divider-DNepwoZv.js +0 -82
  160. package/dist/chunks/focus-ring-CuiJuM-y.js +0 -71
  161. package/dist/chunks/form-associated-Cty_ZaS9.js +0 -73
  162. package/dist/chunks/icon-DrNqcNEL.js +0 -62
  163. package/dist/chunks/radio-Bily78NT.js +0 -205
  164. package/dist/chunks/ripple-squbKHhj.js +0 -135
  165. package/dist/chunks/search-bar-fUD0qU2P.js.map +0 -1
  166. package/dist/chunks/segmented-button-B0BvGSQ7.js +0 -265
  167. package/dist/chunks/slider-D-mnO8yQ.js +0 -450
  168. package/dist/chunks/slider-D-mnO8yQ.js.map +0 -1
  169. package/dist/chunks/table-CqHnneAj.js +0 -773
  170. package/dist/chunks/tabs-BfOtoeir.js +0 -191
  171. package/dist/chunks/time-picker-CZnb2sWz.js +0 -785
  172. package/dist/chunks/time-picker-CZnb2sWz.js.map +0 -1
  173. package/dist/chunks/tooltip-CE7JMHMu.js +0 -398
  174. package/dist/chunks/top-app-bar-Dgbp6CFv.js.map +0 -1
  175. package/dist/components/account-menu/account-menu.css.d.ts +0 -3
  176. package/dist/components/account-menu/account-menu.css.d.ts.map +0 -1
  177. package/dist/components/account-menu/account-menu.d.ts +0 -111
  178. package/dist/components/account-menu/account-menu.d.ts.map +0 -1
  179. package/dist/components/app-drawer/app-drawer.css.d.ts +0 -3
  180. package/dist/components/app-drawer/app-drawer.css.d.ts.map +0 -1
  181. package/dist/components/app-drawer/app-drawer.d.ts +0 -173
  182. package/dist/components/app-drawer/app-drawer.d.ts.map +0 -1
  183. package/dist/components/badge/badge.css.d.ts +0 -2
  184. package/dist/components/badge/badge.css.d.ts.map +0 -1
  185. package/dist/components/badge/badge.d.ts +0 -16
  186. package/dist/components/badge/badge.d.ts.map +0 -1
  187. package/dist/components/bottom-sheet/bottom-sheet.css.d.ts +0 -2
  188. package/dist/components/bottom-sheet/bottom-sheet.css.d.ts.map +0 -1
  189. package/dist/components/bottom-sheet/bottom-sheet.d.ts +0 -69
  190. package/dist/components/bottom-sheet/bottom-sheet.d.ts.map +0 -1
  191. package/dist/components/button/button.css.d.ts +0 -2
  192. package/dist/components/button/button.css.d.ts.map +0 -1
  193. package/dist/components/button/button.d.ts +0 -25
  194. package/dist/components/button/button.d.ts.map +0 -1
  195. package/dist/components/button-group/button-group.css.d.ts +0 -2
  196. package/dist/components/button-group/button-group.css.d.ts.map +0 -1
  197. package/dist/components/button-group/button-group.d.ts +0 -28
  198. package/dist/components/button-group/button-group.d.ts.map +0 -1
  199. package/dist/components/card/card.css.d.ts +0 -2
  200. package/dist/components/card/card.css.d.ts.map +0 -1
  201. package/dist/components/card/card.d.ts +0 -18
  202. package/dist/components/card/card.d.ts.map +0 -1
  203. package/dist/components/carousel/carousel-item.d.ts +0 -33
  204. package/dist/components/carousel/carousel-item.d.ts.map +0 -1
  205. package/dist/components/carousel/carousel.css.d.ts +0 -3
  206. package/dist/components/carousel/carousel.css.d.ts.map +0 -1
  207. package/dist/components/carousel/carousel.d.ts +0 -81
  208. package/dist/components/carousel/carousel.d.ts.map +0 -1
  209. package/dist/components/checkbox/checkbox.css.d.ts +0 -2
  210. package/dist/components/checkbox/checkbox.css.d.ts.map +0 -1
  211. package/dist/components/checkbox/checkbox.d.ts +0 -24
  212. package/dist/components/checkbox/checkbox.d.ts.map +0 -1
  213. package/dist/components/chip/chip.css.d.ts +0 -3
  214. package/dist/components/chip/chip.css.d.ts.map +0 -1
  215. package/dist/components/chip/chip.d.ts +0 -27
  216. package/dist/components/chip/chip.d.ts.map +0 -1
  217. package/dist/components/code/code.css.d.ts +0 -2
  218. package/dist/components/code/code.css.d.ts.map +0 -1
  219. package/dist/components/code/code.d.ts +0 -106
  220. package/dist/components/code/code.d.ts.map +0 -1
  221. package/dist/components/code/highlighter.d.ts +0 -8
  222. package/dist/components/code/highlighter.d.ts.map +0 -1
  223. package/dist/components/code/linter.d.ts +0 -44
  224. package/dist/components/code/linter.d.ts.map +0 -1
  225. package/dist/components/date-picker/date-picker.css.d.ts +0 -2
  226. package/dist/components/date-picker/date-picker.css.d.ts.map +0 -1
  227. package/dist/components/date-picker/date-picker.d.ts +0 -59
  228. package/dist/components/date-picker/date-picker.d.ts.map +0 -1
  229. package/dist/components/dialog/dialog.css.d.ts +0 -2
  230. package/dist/components/dialog/dialog.css.d.ts.map +0 -1
  231. package/dist/components/dialog/dialog.d.ts +0 -22
  232. package/dist/components/dialog/dialog.d.ts.map +0 -1
  233. package/dist/components/divider/divider.css.d.ts +0 -2
  234. package/dist/components/divider/divider.css.d.ts.map +0 -1
  235. package/dist/components/divider/divider.d.ts +0 -16
  236. package/dist/components/divider/divider.d.ts.map +0 -1
  237. package/dist/components/fab/fab.css.d.ts +0 -2
  238. package/dist/components/fab/fab.css.d.ts.map +0 -1
  239. package/dist/components/fab/fab.d.ts +0 -19
  240. package/dist/components/fab/fab.d.ts.map +0 -1
  241. package/dist/components/fab-menu/fab-menu-item.d.ts +0 -35
  242. package/dist/components/fab-menu/fab-menu-item.d.ts.map +0 -1
  243. package/dist/components/fab-menu/fab-menu.css.d.ts +0 -3
  244. package/dist/components/fab-menu/fab-menu.css.d.ts.map +0 -1
  245. package/dist/components/fab-menu/fab-menu.d.ts +0 -72
  246. package/dist/components/fab-menu/fab-menu.d.ts.map +0 -1
  247. package/dist/components/icon/icon.css.d.ts +0 -2
  248. package/dist/components/icon/icon.css.d.ts.map +0 -1
  249. package/dist/components/icon/icon.d.ts +0 -15
  250. package/dist/components/icon/icon.d.ts.map +0 -1
  251. package/dist/components/icon-button/icon-button.css.d.ts +0 -2
  252. package/dist/components/icon-button/icon-button.css.d.ts.map +0 -1
  253. package/dist/components/icon-button/icon-button.d.ts +0 -22
  254. package/dist/components/icon-button/icon-button.d.ts.map +0 -1
  255. package/dist/components/list/list.css.d.ts +0 -3
  256. package/dist/components/list/list.css.d.ts.map +0 -1
  257. package/dist/components/list/list.d.ts +0 -25
  258. package/dist/components/list/list.d.ts.map +0 -1
  259. package/dist/components/loading-indicator/loading-indicator.css.d.ts +0 -2
  260. package/dist/components/loading-indicator/loading-indicator.css.d.ts.map +0 -1
  261. package/dist/components/loading-indicator/loading-indicator.d.ts +0 -48
  262. package/dist/components/loading-indicator/loading-indicator.d.ts.map +0 -1
  263. package/dist/components/menu/menu-item.d.ts +0 -41
  264. package/dist/components/menu/menu-item.d.ts.map +0 -1
  265. package/dist/components/menu/menu.css.d.ts +0 -3
  266. package/dist/components/menu/menu.css.d.ts.map +0 -1
  267. package/dist/components/menu/menu.d.ts +0 -91
  268. package/dist/components/menu/menu.d.ts.map +0 -1
  269. package/dist/components/navigation-bar/navigation-bar-item.d.ts +0 -49
  270. package/dist/components/navigation-bar/navigation-bar-item.d.ts.map +0 -1
  271. package/dist/components/navigation-bar/navigation-bar.css.d.ts +0 -3
  272. package/dist/components/navigation-bar/navigation-bar.css.d.ts.map +0 -1
  273. package/dist/components/navigation-bar/navigation-bar.d.ts +0 -50
  274. package/dist/components/navigation-bar/navigation-bar.d.ts.map +0 -1
  275. package/dist/components/navigation-drawer/navigation-drawer.css.d.ts +0 -3
  276. package/dist/components/navigation-drawer/navigation-drawer.css.d.ts.map +0 -1
  277. package/dist/components/navigation-drawer/navigation-drawer.d.ts +0 -76
  278. package/dist/components/navigation-drawer/navigation-drawer.d.ts.map +0 -1
  279. package/dist/components/navigation-rail/navigation-rail-item.d.ts +0 -36
  280. package/dist/components/navigation-rail/navigation-rail-item.d.ts.map +0 -1
  281. package/dist/components/navigation-rail/navigation-rail.css.d.ts +0 -3
  282. package/dist/components/navigation-rail/navigation-rail.css.d.ts.map +0 -1
  283. package/dist/components/navigation-rail/navigation-rail.d.ts +0 -43
  284. package/dist/components/navigation-rail/navigation-rail.d.ts.map +0 -1
  285. package/dist/components/player/player.css.d.ts +0 -2
  286. package/dist/components/player/player.css.d.ts.map +0 -1
  287. package/dist/components/player/player.d.ts +0 -99
  288. package/dist/components/player/player.d.ts.map +0 -1
  289. package/dist/components/progress/progress.css.d.ts +0 -2
  290. package/dist/components/progress/progress.css.d.ts.map +0 -1
  291. package/dist/components/progress/progress.d.ts +0 -21
  292. package/dist/components/progress/progress.d.ts.map +0 -1
  293. package/dist/components/radio/radio.css.d.ts +0 -3
  294. package/dist/components/radio/radio.css.d.ts.map +0 -1
  295. package/dist/components/radio/radio.d.ts +0 -38
  296. package/dist/components/radio/radio.d.ts.map +0 -1
  297. package/dist/components/search-bar/search-bar.css.d.ts +0 -2
  298. package/dist/components/search-bar/search-bar.css.d.ts.map +0 -1
  299. package/dist/components/search-bar/search-bar.d.ts +0 -81
  300. package/dist/components/search-bar/search-bar.d.ts.map +0 -1
  301. package/dist/components/segmented-button/segmented-button.css.d.ts +0 -3
  302. package/dist/components/segmented-button/segmented-button.css.d.ts.map +0 -1
  303. package/dist/components/segmented-button/segmented-button.d.ts +0 -40
  304. package/dist/components/segmented-button/segmented-button.d.ts.map +0 -1
  305. package/dist/components/side-sheet/side-sheet.css.d.ts +0 -2
  306. package/dist/components/side-sheet/side-sheet.css.d.ts.map +0 -1
  307. package/dist/components/side-sheet/side-sheet.d.ts +0 -57
  308. package/dist/components/side-sheet/side-sheet.d.ts.map +0 -1
  309. package/dist/components/slider/slider.css.d.ts +0 -2
  310. package/dist/components/slider/slider.css.d.ts.map +0 -1
  311. package/dist/components/slider/slider.d.ts +0 -51
  312. package/dist/components/slider/slider.d.ts.map +0 -1
  313. package/dist/components/snackbar/snackbar.css.d.ts +0 -2
  314. package/dist/components/snackbar/snackbar.css.d.ts.map +0 -1
  315. package/dist/components/snackbar/snackbar.d.ts +0 -24
  316. package/dist/components/snackbar/snackbar.d.ts.map +0 -1
  317. package/dist/components/split-button/split-button.css.d.ts +0 -2
  318. package/dist/components/split-button/split-button.css.d.ts.map +0 -1
  319. package/dist/components/split-button/split-button.d.ts +0 -89
  320. package/dist/components/split-button/split-button.d.ts.map +0 -1
  321. package/dist/components/switch/switch.css.d.ts +0 -2
  322. package/dist/components/switch/switch.css.d.ts.map +0 -1
  323. package/dist/components/switch/switch.d.ts +0 -22
  324. package/dist/components/switch/switch.d.ts.map +0 -1
  325. package/dist/components/table/table.css.d.ts +0 -8
  326. package/dist/components/table/table.css.d.ts.map +0 -1
  327. package/dist/components/table/table.d.ts +0 -158
  328. package/dist/components/table/table.d.ts.map +0 -1
  329. package/dist/components/tabs/tabs.css.d.ts +0 -3
  330. package/dist/components/tabs/tabs.css.d.ts.map +0 -1
  331. package/dist/components/tabs/tabs.d.ts +0 -33
  332. package/dist/components/tabs/tabs.d.ts.map +0 -1
  333. package/dist/components/text-field/text-field.css.d.ts +0 -2
  334. package/dist/components/text-field/text-field.css.d.ts.map +0 -1
  335. package/dist/components/text-field/text-field.d.ts +0 -40
  336. package/dist/components/text-field/text-field.d.ts.map +0 -1
  337. package/dist/components/time-picker/time-picker.css.d.ts +0 -2
  338. package/dist/components/time-picker/time-picker.css.d.ts.map +0 -1
  339. package/dist/components/time-picker/time-picker.d.ts +0 -87
  340. package/dist/components/time-picker/time-picker.d.ts.map +0 -1
  341. package/dist/components/toolbar/toolbar.css.d.ts +0 -2
  342. package/dist/components/toolbar/toolbar.css.d.ts.map +0 -1
  343. package/dist/components/toolbar/toolbar.d.ts +0 -53
  344. package/dist/components/toolbar/toolbar.d.ts.map +0 -1
  345. package/dist/components/tooltip/tooltip.css.d.ts +0 -2
  346. package/dist/components/tooltip/tooltip.css.d.ts.map +0 -1
  347. package/dist/components/tooltip/tooltip.d.ts +0 -89
  348. package/dist/components/tooltip/tooltip.d.ts.map +0 -1
  349. package/dist/components/top-app-bar/top-app-bar.css.d.ts +0 -2
  350. package/dist/components/top-app-bar/top-app-bar.css.d.ts.map +0 -1
  351. package/dist/components/top-app-bar/top-app-bar.d.ts +0 -29
  352. package/dist/components/top-app-bar/top-app-bar.d.ts.map +0 -1
  353. package/dist/index.d.ts +0 -52
  354. package/dist/index.d.ts.map +0 -1
  355. package/dist/internal/base-component.d.ts +0 -13
  356. package/dist/internal/base-component.d.ts.map +0 -1
  357. package/dist/internal/focus-ring/focus-ring.css.d.ts +0 -2
  358. package/dist/internal/focus-ring/focus-ring.css.d.ts.map +0 -1
  359. package/dist/internal/focus-ring/focus-ring.d.ts +0 -18
  360. package/dist/internal/focus-ring/focus-ring.d.ts.map +0 -1
  361. package/dist/internal/form-associated.d.ts +0 -26
  362. package/dist/internal/form-associated.d.ts.map +0 -1
  363. package/dist/internal/ripple/ripple.css.d.ts +0 -2
  364. package/dist/internal/ripple/ripple.css.d.ts.map +0 -1
  365. package/dist/internal/ripple/ripple.d.ts +0 -23
  366. package/dist/internal/ripple/ripple.d.ts.map +0 -1
  367. package/dist/tokens/colors.d.ts +0 -42
  368. package/dist/tokens/colors.d.ts.map +0 -1
  369. package/dist/tokens/elevation.d.ts +0 -9
  370. package/dist/tokens/elevation.d.ts.map +0 -1
  371. package/dist/tokens/index.d.ts +0 -7
  372. package/dist/tokens/index.d.ts.map +0 -1
  373. package/dist/tokens/motion.d.ts +0 -21
  374. package/dist/tokens/motion.d.ts.map +0 -1
  375. package/dist/tokens/shape.d.ts +0 -10
  376. package/dist/tokens/shape.d.ts.map +0 -1
  377. package/dist/tokens/theme.css.d.ts +0 -4
  378. package/dist/tokens/theme.css.d.ts.map +0 -1
  379. package/dist/tokens/typography.d.ts +0 -101
  380. package/dist/tokens/typography.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"code-C5UFBkCh.js","names":[],"sources":["../../src/components/code/code.css.ts","../../src/components/code/highlighter.ts","../../src/components/code/linter.ts","../../src/components/code/code.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const codeStyles = css`\n :host {\n display: block;\n box-sizing: border-box;\n font-family: 'Fira Code', 'Roboto Mono', Consolas, Monaco, 'Courier New', monospace;\n --md-code-bg: var(--md-sys-color-surface-container, #f3edf7);\n --md-code-header-bg: var(--md-sys-color-surface-container-high, #ece6f0);\n --md-code-border: var(--md-sys-color-outline-variant, #cac4d0);\n --md-code-color: var(--md-sys-color-on-surface, #1d1b20);\n --md-code-gutter-color: var(--md-sys-color-outline, #79747e);\n --md-code-gutter-bg: transparent;\n --md-code-radius: var(--md-sys-shape-corner-medium, 12px);\n --md-code-font-size: 13.5px;\n --md-code-line-height: 1.6;\n margin: 1rem 0;\n }\n\n .code-container {\n position: relative;\n display: flex;\n flex-direction: column;\n background-color: var(--md-code-bg);\n border: 1px solid var(--md-code-border);\n border-radius: var(--md-code-radius);\n overflow: hidden;\n color: var(--md-code-color);\n }\n\n /* Header Bar */\n .code-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 12px;\n background-color: var(--md-code-header-bg);\n border-bottom: 1px solid var(--md-code-border);\n min-height: 40px;\n font-size: 12.5px;\n font-weight: 500;\n user-select: none;\n }\n\n .code-header-left {\n display: flex;\n align-items: center;\n gap: 8px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .lang-badge {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n background-color: var(--md-sys-color-secondary-container, #e8def8);\n color: var(--md-sys-color-on-secondary-container, #1d192b);\n border-radius: var(--md-sys-shape-corner-full, 9999px);\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .code-filename {\n font-weight: 500;\n color: var(--md-sys-color-on-surface, #1d1b20);\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .code-header-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-left: auto;\n }\n\n /* Floating Copy Button (when header is hidden) */\n .floating-copy-btn {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 5;\n }\n\n /* Copy Button inside header or floating */\n .action-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 28px;\n padding: 0 10px;\n border: none;\n border-radius: var(--md-sys-shape-corner-small, 8px);\n background-color: transparent;\n color: var(--md-sys-color-on-surface-variant, #49454f);\n font-family: var(--md-sys-typescale-font-family, 'Roboto', sans-serif);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 150ms ease, color 150ms ease;\n outline: none;\n }\n\n .action-btn:hover {\n background-color: var(--md-sys-color-surface-container-highest, #e6e0e9);\n color: var(--md-sys-color-on-surface, #1d1b20);\n }\n\n .action-btn:active {\n background-color: var(--md-sys-color-secondary-container, #e8def8);\n }\n\n .action-btn.copied {\n color: var(--md-sys-color-primary, #6750a4);\n background-color: var(--md-sys-color-primary-container, #eaddff);\n }\n\n .action-btn md-icon {\n --md-icon-size: 16px;\n }\n\n /* Code Viewport & Scroll Area */\n .code-body {\n position: relative;\n display: flex;\n overflow-x: auto;\n overflow-y: auto;\n font-size: var(--md-code-font-size);\n line-height: var(--md-code-line-height);\n }\n\n pre {\n margin: 0;\n padding: 12px 16px;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n tab-size: 2;\n flex-grow: 1;\n overflow: visible;\n }\n\n code {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n display: block;\n }\n\n :host([wrap-lines]) pre {\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n :host(:not([wrap-lines])) pre {\n white-space: pre;\n }\n\n /* Line Structure */\n .code-line {\n display: block;\n padding: 0 4px;\n border-radius: 2px;\n }\n\n .code-line.highlighted {\n background-color: rgba(103, 80, 164, 0.12);\n }\n\n .code-line.has-error {\n background-color: rgba(179, 38, 30, 0.14);\n }\n\n .code-line.has-warning {\n background-color: rgba(230, 81, 0, 0.12);\n }\n\n /* Gutter & Line Numbers */\n .code-gutter {\n display: flex;\n flex-direction: column;\n padding: 12px 0 12px 10px;\n user-select: none;\n background-color: var(--md-code-gutter-bg);\n border-right: 1px solid var(--md-code-border);\n flex-shrink: 0;\n min-width: 44px;\n box-sizing: border-box;\n }\n\n .gutter-line {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 4px;\n height: calc(var(--md-code-font-size) * var(--md-code-line-height));\n padding-right: 8px;\n color: var(--md-code-gutter-color);\n font-size: 11.5px;\n }\n\n .gutter-marker {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n cursor: pointer;\n }\n\n .gutter-marker.error {\n color: var(--md-sys-color-error, #b3261e);\n }\n\n .gutter-marker.warning {\n color: #e65100;\n }\n\n .gutter-marker.info {\n color: var(--md-sys-color-primary, #6750a4);\n }\n\n .gutter-marker md-icon {\n --md-icon-size: 14px;\n }\n\n /* Lint Status Footer Bar */\n .lint-footer {\n display: flex;\n flex-direction: column;\n background-color: var(--md-code-header-bg);\n border-top: 1px solid var(--md-code-border);\n font-size: 12px;\n font-family: var(--md-sys-typescale-font-family, 'Roboto', sans-serif);\n }\n\n .lint-footer-summary {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 12px;\n cursor: pointer;\n user-select: none;\n }\n\n .lint-footer-summary:hover {\n background-color: var(--md-sys-color-surface-container-highest, #e6e0e9);\n }\n\n .lint-counts {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .lint-count-item {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-weight: 500;\n }\n\n .lint-count-item.errors {\n color: var(--md-sys-color-error, #b3261e);\n }\n\n .lint-count-item.warnings {\n color: #e65100;\n }\n\n .lint-count-item.valid {\n color: #2e7d32;\n }\n\n .lint-count-item md-icon {\n --md-icon-size: 15px;\n }\n\n .lint-issues-list {\n display: flex;\n flex-direction: column;\n max-height: 160px;\n overflow-y: auto;\n border-top: 1px solid var(--md-code-border);\n background-color: var(--md-code-bg);\n }\n\n .lint-issue-item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 6px 12px;\n border-bottom: 1px solid var(--md-code-border);\n cursor: pointer;\n transition: background-color 100ms ease;\n }\n\n .lint-issue-item:last-child {\n border-bottom: none;\n }\n\n .lint-issue-item:hover {\n background-color: var(--md-sys-color-surface-container-highest, #e6e0e9);\n }\n\n .lint-issue-item.error md-icon {\n color: var(--md-sys-color-error, #b3261e);\n --md-icon-size: 16px;\n }\n\n .lint-issue-item.warning md-icon {\n color: #e65100;\n --md-icon-size: 16px;\n }\n\n .lint-issue-item.info md-icon {\n color: var(--md-sys-color-primary, #6750a4);\n --md-icon-size: 16px;\n }\n\n .lint-issue-content {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex-grow: 1;\n }\n\n .lint-issue-loc {\n font-weight: 600;\n font-size: 11px;\n color: var(--md-sys-color-outline, #79747e);\n }\n\n .lint-issue-msg {\n font-size: 12px;\n color: var(--md-sys-color-on-surface, #1d1b20);\n }\n\n /* --- Syntax Highlighting Colors (MD3 Color Scheme Aware) --- */\n .token-keyword {\n color: var(--md-code-token-keyword, var(--md-sys-color-primary, #6750a4));\n font-weight: 600;\n }\n\n .token-string {\n color: var(--md-code-token-string, #198754);\n }\n\n .token-comment {\n color: var(--md-code-token-comment, var(--md-sys-color-outline, #79747e));\n font-style: italic;\n }\n\n .token-function {\n color: var(--md-code-token-function, var(--md-sys-color-tertiary, #7d5260));\n font-weight: 500;\n }\n\n .token-number {\n color: var(--md-code-token-number, #b35900);\n }\n\n .token-boolean {\n color: var(--md-code-token-boolean, #d9381e);\n font-weight: 600;\n }\n\n .token-constant {\n color: var(--md-code-token-constant, #b3261e);\n font-weight: 600;\n }\n\n .token-tag {\n color: var(--md-code-token-tag, var(--md-sys-color-primary, #6750a4));\n font-weight: 600;\n }\n\n .token-attr-name {\n color: var(--md-code-token-attr-name, var(--md-sys-color-secondary, #625b71));\n }\n\n .token-property {\n color: var(--md-code-token-property, var(--md-sys-color-primary, #6750a4));\n }\n\n .token-type {\n color: var(--md-code-token-type, #00838f);\n font-weight: 500;\n }\n\n .token-variable {\n color: var(--md-code-token-variable, #e65100);\n }\n\n .token-operator {\n color: var(--md-code-token-operator, var(--md-sys-color-on-surface-variant, #49454f));\n }\n\n .token-punctuation {\n color: var(--md-code-token-punctuation, var(--md-sys-color-outline, #79747e));\n }\n\n /* Dark Theme Adjustments */\n :host-context([data-theme='dark']) .token-string,\n :host([data-theme='dark']) .token-string {\n color: #4ade80;\n }\n\n :host-context([data-theme='dark']) .token-number,\n :host([data-theme='dark']) .token-number {\n color: #fb923c;\n }\n\n :host-context([data-theme='dark']) .token-type,\n :host([data-theme='dark']) .token-type {\n color: #38bdf8;\n }\n\n :host-context([data-theme='dark']) .token-boolean,\n :host([data-theme='dark']) .token-boolean {\n color: #f87171;\n }\n`;\n\n","/**\n * Lightweight, robust syntax highlighter for common programming and markup languages.\n */\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n\nfunction span(cls: string, content: string): string {\n return `<span class=\"token-${cls}\">${content}</span>`;\n}\n\n/**\n * Tokenize and highlight JavaScript / TypeScript.\n */\nfunction highlightJs(code: string): string {\n const keywords = new Set([\n 'abstract', 'any', 'as', 'async', 'await', 'boolean', 'break', 'case', 'catch', 'class',\n 'const', 'constructor', 'continue', 'debugger', 'declare', 'default', 'delete', 'do',\n 'else', 'enum', 'export', 'extends', 'false', 'finally', 'for', 'from', 'function',\n 'get', 'if', 'implements', 'import', 'in', 'infer', 'instanceof', 'interface', 'is',\n 'keyof', 'let', 'module', 'namespace', 'never', 'new', 'null', 'number', 'of', 'override',\n 'package', 'private', 'protected', 'public', 'readonly', 'require', 'return', 'set',\n 'static', 'string', 'super', 'switch', 'symbol', 'this', 'throw', 'true', 'try', 'type',\n 'typeof', 'undefined', 'unique', 'unknown', 'var', 'void', 'while', 'with', 'yield'\n ]);\n\n let result = '';\n let i = 0;\n const n = code.length;\n\n while (i < n) {\n // Single-line comment\n if (code[i] === '/' && code[i + 1] === '/') {\n let end = code.indexOf('\\n', i);\n if (end === -1) end = n;\n result += span('comment', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Multi-line comment\n if (code[i] === '/' && code[i + 1] === '*') {\n let end = code.indexOf('*/', i + 2);\n if (end === -1) end = n;\n else end += 2;\n result += span('comment', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Template string\n if (code[i] === '`') {\n let end = i + 1;\n while (end < n && code[end] !== '`') {\n if (code[end] === '\\\\') end++;\n end++;\n }\n if (end < n) end++;\n result += span('string', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Single/double quote string\n if (code[i] === '\"' || code[i] === \"'\") {\n const q = code[i]!;\n let end = i + 1;\n while (end < n && code[end] !== q && code[end] !== '\\n') {\n if (code[end] === '\\\\') end++;\n end++;\n }\n if (end < n && code[end] === q) end++;\n result += span('string', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Numbers\n if (/[0-9]/.test(code[i]!) || (code[i] === '.' && /[0-9]/.test(code[i + 1] || ''))) {\n let end = i;\n while (end < n && /[0-9a-fA-FxXbBoOeE_.]/.test(code[end]!)) {\n end++;\n }\n result += span('number', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Identifiers & Keywords\n if (/[a-zA-Z_$]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[a-zA-Z0-9_$]/.test(code[end]!)) {\n end++;\n }\n const word = code.slice(i, end);\n // Check if followed by ( -> function call / definition\n let peek = end;\n while (peek < n && /\\s/.test(code[peek]!)) peek++;\n const isFunction = code[peek] === '(';\n\n if (word === 'true' || word === 'false') {\n result += span('boolean', escapeHtml(word));\n } else if (word === 'null' || word === 'undefined') {\n result += span('constant', escapeHtml(word));\n } else if (keywords.has(word)) {\n result += span('keyword', escapeHtml(word));\n } else if (/^[A-Z][a-zA-Z0-9_$]*$/.test(word) && !isFunction) {\n result += span('type', escapeHtml(word));\n } else if (isFunction) {\n result += span('function', escapeHtml(word));\n } else {\n result += escapeHtml(word);\n }\n i = end;\n continue;\n }\n\n // Operators\n if (/[+\\-*/%=&|<>!^~?:.]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[+\\-*/%=&|<>!^~?:.]/.test(code[end]!)) {\n end++;\n }\n result += span('operator', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Punctuation\n if (/[{}()[\\];,]/.test(code[i]!)) {\n result += span('punctuation', escapeHtml(code[i]!));\n i++;\n continue;\n }\n\n result += escapeHtml(code[i]!);\n i++;\n }\n\n return result;\n}\n\n/**\n * Tokenize and highlight HTML / XML / SVG.\n */\nfunction highlightHtml(code: string): string {\n let result = '';\n let i = 0;\n const n = code.length;\n\n while (i < n) {\n // Comment <!-- ... -->\n if (code.slice(i, i + 4) === '<!--') {\n let end = code.indexOf('-->', i + 4);\n if (end === -1) end = n;\n else end += 3;\n result += span('comment', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Tag <tag ...> or </tag>\n if (code[i] === '<') {\n let end = code.indexOf('>', i);\n if (end === -1) end = n;\n else end += 1;\n\n const tagContent = code.slice(i, end);\n // Highlight tag internals\n const tagMatch = tagContent.match(/^<\\/?([a-zA-Z0-9\\-:]+)/);\n if (tagMatch && tagMatch[1]) {\n let tagRes = span('punctuation', escapeHtml(tagContent.startsWith('</') ? '</' : '<'));\n tagRes += span('tag', escapeHtml(tagMatch[1]));\n\n let rest = tagContent.slice(tagMatch[0].length);\n // Process attributes in rest\n const attrRegex = /([a-zA-Z0-9\\-:@?]+)(\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+))?/g;\n let lastIdx = 0;\n let attrMatch: RegExpExecArray | null;\n\n while ((attrMatch = attrRegex.exec(rest)) !== null) {\n const matchedAttr = attrMatch[0];\n const attrName = attrMatch[1]!;\n const attrVal = attrMatch[2];\n\n // Text before attribute\n tagRes += escapeHtml(rest.slice(lastIdx, attrMatch.index));\n\n tagRes += span('attr-name', escapeHtml(attrName));\n if (attrVal) {\n const eqIdx = attrVal.indexOf('=');\n tagRes += span('operator', '=');\n const valStr = attrVal.slice(eqIdx + 1).trim();\n tagRes += span('string', escapeHtml(valStr));\n }\n lastIdx = attrRegex.lastIndex;\n }\n\n const trailing = rest.slice(lastIdx);\n if (trailing.endsWith('/>')) {\n tagRes += escapeHtml(trailing.slice(0, -2)) + span('punctuation', '/&gt;');\n } else if (trailing.endsWith('>')) {\n tagRes += escapeHtml(trailing.slice(0, -1)) + span('punctuation', '&gt;');\n } else {\n tagRes += escapeHtml(trailing);\n }\n result += tagRes;\n } else {\n result += escapeHtml(tagContent);\n }\n i = end;\n continue;\n }\n\n result += escapeHtml(code[i]!);\n i++;\n }\n\n return result;\n}\n\n/**\n * Tokenize and highlight CSS / SCSS.\n */\nfunction highlightCss(code: string): string {\n let result = '';\n let i = 0;\n const n = code.length;\n let inBlock = false;\n\n while (i < n) {\n // Comment /* ... */\n if (code[i] === '/' && code[i + 1] === '*') {\n let end = code.indexOf('*/', i + 2);\n if (end === -1) end = n;\n else end += 2;\n result += span('comment', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Strings\n if (code[i] === '\"' || code[i] === \"'\") {\n const q = code[i]!;\n let end = i + 1;\n while (end < n && code[end] !== q && code[end] !== '\\n') end++;\n if (end < n && code[end] === q) end++;\n result += span('string', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Braces\n if (code[i] === '{') {\n inBlock = true;\n result += span('punctuation', '{');\n i++;\n continue;\n }\n if (code[i] === '}') {\n inBlock = false;\n result += span('punctuation', '}');\n i++;\n continue;\n }\n\n // Property name inside block\n if (inBlock && /[a-zA-Z-]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[a-zA-Z0-9_-]/.test(code[end]!)) end++;\n const name = code.slice(i, end);\n\n let peek = end;\n while (peek < n && /\\s/.test(code[peek]!)) peek++;\n if (code[peek] === ':') {\n result += span('property', escapeHtml(name));\n result += escapeHtml(code.slice(end, peek));\n result += span('punctuation', ':');\n i = peek + 1;\n continue;\n }\n }\n\n // Numbers & Units\n if (/[0-9]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[0-9a-zA-Z%.]/.test(code[end]!)) end++;\n result += span('number', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Color hex #fff\n if (code[i] === '#' && /[0-9a-fA-F]/.test(code[i + 1] || '')) {\n let end = i + 1;\n while (end < n && /[0-9a-fA-F]/.test(code[end]!)) end++;\n result += span('number', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Punctuation\n if (/[;:(),]/.test(code[i]!)) {\n result += span('punctuation', escapeHtml(code[i]!));\n i++;\n continue;\n }\n\n result += escapeHtml(code[i]!);\n i++;\n }\n\n return result;\n}\n\n/**\n * Tokenize and highlight JSON.\n */\nfunction highlightJson(code: string): string {\n let result = '';\n let i = 0;\n const n = code.length;\n\n while (i < n) {\n // Strings\n if (code[i] === '\"') {\n let end = i + 1;\n while (end < n && code[end] !== '\"') {\n if (code[end] === '\\\\') end++;\n end++;\n }\n if (end < n) end++;\n const str = code.slice(i, end);\n\n // Check if it's a key (followed by colon)\n let peek = end;\n while (peek < n && /\\s/.test(code[peek]!)) peek++;\n if (code[peek] === ':') {\n result += span('property', escapeHtml(str));\n } else {\n result += span('string', escapeHtml(str));\n }\n i = end;\n continue;\n }\n\n // Numbers\n if (/[0-9-]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[0-9.eE+-]/.test(code[end]!)) end++;\n result += span('number', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Keywords / Booleans\n if (/[a-zA-Z]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[a-zA-Z]/.test(code[end]!)) end++;\n const word = code.slice(i, end);\n if (word === 'true' || word === 'false') {\n result += span('boolean', escapeHtml(word));\n } else if (word === 'null') {\n result += span('constant', escapeHtml(word));\n } else {\n result += escapeHtml(word);\n }\n i = end;\n continue;\n }\n\n // Punctuation\n if (/[{}[\\]:,]/.test(code[i]!)) {\n result += span('punctuation', escapeHtml(code[i]!));\n i++;\n continue;\n }\n\n result += escapeHtml(code[i]!);\n i++;\n }\n\n return result;\n}\n\n/**\n * Tokenize and highlight Python.\n */\nfunction highlightPython(code: string): string {\n const keywords = new Set([\n 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del',\n 'elif', 'else', 'except', 'False', 'finally', 'for', 'from', 'global', 'if', 'import',\n 'in', 'is', 'lambda', 'None', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return',\n 'True', 'try', 'while', 'with', 'yield', 'self'\n ]);\n\n let result = '';\n let i = 0;\n const n = code.length;\n\n while (i < n) {\n // Comment\n if (code[i] === '#') {\n let end = code.indexOf('\\n', i);\n if (end === -1) end = n;\n result += span('comment', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Triple quotes\n if (code.slice(i, i + 3) === '\"\"\"' || code.slice(i, i + 3) === \"'''\") {\n const q = code.slice(i, i + 3);\n let end = code.indexOf(q, i + 3);\n if (end === -1) end = n;\n else end += 3;\n result += span('string', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Single / Double quotes\n if (code[i] === '\"' || code[i] === \"'\") {\n const q = code[i]!;\n let end = i + 1;\n while (end < n && code[end] !== q && code[end] !== '\\n') {\n if (code[end] === '\\\\') end++;\n end++;\n }\n if (end < n && code[end] === q) end++;\n result += span('string', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Numbers\n if (/[0-9]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[0-9a-fA-FxXbBoOeE_.]/.test(code[end]!)) end++;\n result += span('number', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Identifiers & Keywords\n if (/[a-zA-Z_]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[a-zA-Z0-9_]/.test(code[end]!)) end++;\n const word = code.slice(i, end);\n\n let peek = end;\n while (peek < n && /\\s/.test(code[peek]!)) peek++;\n const isFunction = code[peek] === '(';\n\n if (word === 'True' || word === 'False') {\n result += span('boolean', escapeHtml(word));\n } else if (word === 'None') {\n result += span('constant', escapeHtml(word));\n } else if (keywords.has(word)) {\n result += span('keyword', escapeHtml(word));\n } else if (isFunction) {\n result += span('function', escapeHtml(word));\n } else if (/^[A-Z][a-zA-Z0-9_]*$/.test(word)) {\n result += span('type', escapeHtml(word));\n } else {\n result += escapeHtml(word);\n }\n i = end;\n continue;\n }\n\n // Operators\n if (/[+\\-*/%=&|<>!^~@:]/.test(code[i]!)) {\n result += span('operator', escapeHtml(code[i]!));\n i++;\n continue;\n }\n\n // Punctuation\n if (/[{}()[\\];,.]/.test(code[i]!)) {\n result += span('punctuation', escapeHtml(code[i]!));\n i++;\n continue;\n }\n\n result += escapeHtml(code[i]!);\n i++;\n }\n\n return result;\n}\n\n/**\n * Tokenize and highlight Bash / Shell scripts.\n */\nfunction highlightBash(code: string): string {\n const keywords = new Set([\n 'case', 'do', 'done', 'elif', 'else', 'esac', 'export', 'fi', 'for', 'function',\n 'if', 'in', 'return', 'select', 'then', 'time', 'until', 'while', 'sudo', 'echo',\n 'cd', 'mkdir', 'rm', 'cp', 'mv', 'npm', 'npx', 'node', 'git', 'yarn', 'pnpm'\n ]);\n\n let result = '';\n let i = 0;\n const n = code.length;\n\n while (i < n) {\n // Comment\n if (code[i] === '#') {\n let end = code.indexOf('\\n', i);\n if (end === -1) end = n;\n result += span('comment', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // String\n if (code[i] === '\"' || code[i] === \"'\") {\n const q = code[i]!;\n let end = i + 1;\n while (end < n && code[end] !== q && code[end] !== '\\n') {\n if (code[end] === '\\\\') end++;\n end++;\n }\n if (end < n && code[end] === q) end++;\n result += span('string', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Variable expansion $VAR, ${VAR}, $(CMD)\n if (code[i] === '$') {\n let end = i + 1;\n if (code[end] === '{') {\n end = code.indexOf('}', end);\n if (end === -1) end = n;\n else end += 1;\n } else if (code[end] === '(') {\n end = code.indexOf(')', end);\n if (end === -1) end = n;\n else end += 1;\n } else {\n while (end < n && /[a-zA-Z0-9_]/.test(code[end]!)) end++;\n }\n result += span('variable', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Flags -f, --flag\n if (code[i] === '-' && /[a-zA-Z-]/.test(code[i + 1] || '')) {\n let end = i + 1;\n while (end < n && /[a-zA-Z0-9_-]/.test(code[end]!)) end++;\n result += span('attr-name', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Identifiers & Keywords\n if (/[a-zA-Z0-9_]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[a-zA-Z0-9_\\-./]/.test(code[end]!)) end++;\n const word = code.slice(i, end);\n if (keywords.has(word)) {\n result += span('keyword', escapeHtml(word));\n } else {\n result += escapeHtml(word);\n }\n i = end;\n continue;\n }\n\n // Operators\n if (/[|&><=;]/.test(code[i]!)) {\n result += span('operator', escapeHtml(code[i]!));\n i++;\n continue;\n }\n\n result += escapeHtml(code[i]!);\n i++;\n }\n\n return result;\n}\n\n/**\n * Tokenize and highlight SQL.\n */\nfunction highlightSql(code: string): string {\n const keywords = new Set([\n 'SELECT', 'FROM', 'WHERE', 'INSERT', 'INTO', 'VALUES', 'UPDATE', 'SET', 'DELETE',\n 'CREATE', 'TABLE', 'DROP', 'ALTER', 'JOIN', 'LEFT', 'RIGHT', 'INNER', 'OUTER', 'FULL',\n 'ON', 'GROUP', 'BY', 'ORDER', 'HAVING', 'LIMIT', 'OFFSET', 'UNION', 'ALL', 'AS',\n 'DISTINCT', 'COUNT', 'SUM', 'AVG', 'MIN', 'MAX', 'AND', 'OR', 'NOT', 'IN', 'IS',\n 'NULL', 'LIKE', 'BETWEEN', 'EXISTS', 'CASE', 'WHEN', 'THEN', 'ELSE', 'END', 'PRIMARY',\n 'KEY', 'FOREIGN', 'REFERENCES', 'INDEX', 'DEFAULT', 'CHECK', 'CONSTRAINT'\n ]);\n\n let result = '';\n let i = 0;\n const n = code.length;\n\n while (i < n) {\n // Comment -- ...\n if (code[i] === '-' && code[i + 1] === '-') {\n let end = code.indexOf('\\n', i);\n if (end === -1) end = n;\n result += span('comment', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // String\n if (code[i] === \"'\" || code[i] === '\"') {\n const q = code[i]!;\n let end = i + 1;\n while (end < n && code[end] !== q && code[end] !== '\\n') end++;\n if (end < n && code[end] === q) end++;\n result += span('string', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Identifiers & Keywords\n if (/[a-zA-Z_]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[a-zA-Z0-9_]/.test(code[end]!)) end++;\n const word = code.slice(i, end);\n if (keywords.has(word.toUpperCase())) {\n result += span('keyword', escapeHtml(word));\n } else {\n result += escapeHtml(word);\n }\n i = end;\n continue;\n }\n\n // Numbers\n if (/[0-9]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[0-9.]/.test(code[end]!)) end++;\n result += span('number', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Operators & Punctuation\n if (/[=<>!+*/-]/.test(code[i]!)) {\n result += span('operator', escapeHtml(code[i]!));\n i++;\n continue;\n }\n\n if (/[(),;]/.test(code[i]!)) {\n result += span('punctuation', escapeHtml(code[i]!));\n i++;\n continue;\n }\n\n result += escapeHtml(code[i]!);\n i++;\n }\n\n return result;\n}\n\n/**\n * Main syntax highlight dispatcher.\n */\nexport function highlightCode(code: string, language: string): string {\n if (!code) return '';\n\n const lang = (language || '').toLowerCase().trim();\n\n switch (lang) {\n case 'javascript':\n case 'js':\n case 'typescript':\n case 'ts':\n case 'jsx':\n case 'tsx':\n return highlightJs(code);\n case 'html':\n case 'xml':\n case 'svg':\n return highlightHtml(code);\n case 'css':\n case 'scss':\n case 'less':\n return highlightCss(code);\n case 'json':\n return highlightJson(code);\n case 'python':\n case 'py':\n return highlightPython(code);\n case 'bash':\n case 'sh':\n case 'shell':\n case 'zsh':\n return highlightBash(code);\n case 'sql':\n return highlightSql(code);\n default:\n return escapeHtml(code);\n }\n}\n\n","export interface LintDiagnostic {\n line: number; // 1-indexed\n column?: number; // 1-indexed\n message: string;\n severity?: 'error' | 'warning' | 'info';\n rule?: string;\n}\n\n/**\n * Lints JSON code and returns diagnostics for syntax errors, trailing commas, unquoted keys, etc.\n */\nexport function lintJson(code: string): LintDiagnostic[] {\n const diagnostics: LintDiagnostic[] = [];\n const trimmed = code.trim();\n if (!trimmed) return diagnostics;\n\n // 1. Try standard JSON.parse first\n try {\n JSON.parse(code);\n return diagnostics;\n } catch (err: unknown) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n \n // Attempt to extract position from error message (e.g. \"at position 42\" or \"line 3 column 5\")\n let line = 1;\n let column = 1;\n\n const posMatch = errorMsg.match(/at position (\\d+)/i);\n const lineColMatch = errorMsg.match(/line (\\d+) column (\\d+)/i);\n\n if (lineColMatch && lineColMatch[1] && lineColMatch[2]) {\n line = parseInt(lineColMatch[1], 10);\n column = parseInt(lineColMatch[2], 10);\n } else if (posMatch && posMatch[1]) {\n const pos = parseInt(posMatch[1], 10);\n const lines = code.slice(0, pos).split('\\n');\n line = lines.length;\n column = (lines[lines.length - 1]?.length || 0) + 1;\n } else {\n // Heuristic syntax analysis for specific common errors\n const lines = code.split('\\n');\n let found = false;\n\n for (let i = 0; i < lines.length; i++) {\n const lineContent = lines[i]!;\n // Single quotes check\n if (/'[^']*'/.test(lineContent)) {\n diagnostics.push({\n line: i + 1,\n column: lineContent.indexOf(\"'\") + 1,\n message: 'JSON strings must use double quotes, not single quotes',\n severity: 'error',\n rule: 'json-no-single-quotes',\n });\n found = true;\n break;\n }\n // Trailing comma before } or ]\n if (/,\\s*([}\\]])/.test(lineContent)) {\n diagnostics.push({\n line: i + 1,\n column: lineContent.search(/,\\s*([}\\]])/) + 1,\n message: 'Trailing comma is not allowed in standard JSON',\n severity: 'error',\n rule: 'json-no-trailing-comma',\n });\n found = true;\n break;\n }\n // Comments in JSON\n if (/\\/\\//.test(lineContent) || /\\/\\*/.test(lineContent)) {\n diagnostics.push({\n line: i + 1,\n column: lineContent.search(/\\/\\/|\\/\\*/) + 1,\n message: 'Comments are not permitted in standard JSON',\n severity: 'warning',\n rule: 'json-no-comments',\n });\n found = true;\n break;\n }\n // Unquoted key check e.g. { name: \"val\" }\n const unquotedKey = lineContent.match(/([{,]\\s*)([a-zA-Z0-9_$]+)\\s*:/);\n if (unquotedKey && unquotedKey[1] && unquotedKey[2]) {\n diagnostics.push({\n line: i + 1,\n column: lineContent.indexOf(unquotedKey[2]) + 1,\n message: `Key \"${unquotedKey[2]}\" must be enclosed in double quotes`,\n severity: 'error',\n rule: 'json-unquoted-key',\n });\n found = true;\n break;\n }\n }\n\n if (found) return diagnostics;\n }\n\n // Format cleaner error message\n let cleanMessage = errorMsg.replace(/^JSON\\.parse:\\s*/i, '').replace(/in JSON at position \\d+/i, '').trim();\n if (!cleanMessage) cleanMessage = 'Invalid JSON syntax';\n\n diagnostics.push({\n line,\n column,\n message: cleanMessage,\n severity: 'error',\n rule: 'json-syntax-error',\n });\n }\n\n return diagnostics;\n}\n\n/**\n * Lints JavaScript and TypeScript code for common syntax issues.\n */\nexport function lintJavaScript(code: string): LintDiagnostic[] {\n const diagnostics: LintDiagnostic[] = [];\n const lines = code.split('\\n');\n\n // Track balanced bracket stacks with line/column\n const stack: { char: string; line: number; col: number }[] = [];\n const matchMap: Record<string, string> = { '}': '{', ')': '(', ']': '[' };\n let inMultiComment = false;\n let inTemplateLiteral = false;\n\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n const lineNum = lineIdx + 1;\n const line = lines[lineIdx]!;\n let inString: string | null = null;\n let isEscaped = false;\n\n for (let colIdx = 0; colIdx < line.length; colIdx++) {\n const char = line[colIdx]!;\n const nextChar = line[colIdx + 1] || '';\n\n // Check multiline comment\n if (inMultiComment) {\n if (char === '*' && nextChar === '/') {\n inMultiComment = false;\n colIdx++;\n }\n continue;\n }\n\n // Check template literal\n if (inTemplateLiteral) {\n if (char === '\\\\') {\n colIdx++;\n continue;\n }\n if (char === '`') {\n inTemplateLiteral = false;\n }\n continue;\n }\n\n // String handling\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n } else if (char === '\\\\') {\n isEscaped = true;\n } else if (char === inString) {\n inString = null;\n }\n continue;\n }\n\n // Single-line comment\n if (char === '/' && nextChar === '/') {\n break;\n }\n\n // Start multi-line comment\n if (char === '/' && nextChar === '*') {\n inMultiComment = true;\n colIdx++;\n continue;\n }\n\n // Start template string\n if (char === '`') {\n inTemplateLiteral = true;\n continue;\n }\n\n // Start single or double quote string\n if (char === '\"' || char === \"'\") {\n inString = char;\n continue;\n }\n\n // Brackets\n if (char === '{' || char === '(' || char === '[') {\n stack.push({ char, line: lineNum, col: colIdx + 1 });\n } else if (char === '}' || char === ')' || char === ']') {\n const expected = matchMap[char];\n if (stack.length === 0) {\n diagnostics.push({\n line: lineNum,\n column: colIdx + 1,\n message: `Unexpected closing '${char}' with no matching opening bracket`,\n severity: 'error',\n rule: 'js-unmatched-bracket',\n });\n } else {\n const top = stack.pop()!;\n if (top.char !== expected) {\n diagnostics.push({\n line: lineNum,\n column: colIdx + 1,\n message: `Mismatched closing '${char}', expected matching '${top.char === '{' ? '}' : top.char === '(' ? ')' : ']'}' for '${top.char}' from line ${top.line}`,\n severity: 'error',\n rule: 'js-mismatched-bracket',\n });\n }\n }\n }\n }\n\n if (inString) {\n diagnostics.push({\n line: lineNum,\n column: line.lastIndexOf(inString) + 1,\n message: `Unclosed string literal starting with ${inString}`,\n severity: 'error',\n rule: 'js-unclosed-string',\n });\n }\n\n // Common JS checks: consecutive comparison operators\n if (/====+/.test(line)) {\n diagnostics.push({\n line: lineNum,\n column: line.indexOf('====') + 1,\n message: 'Invalid equality operator: \"====\"',\n severity: 'error',\n rule: 'js-invalid-operator',\n });\n }\n }\n\n if (inMultiComment) {\n diagnostics.push({\n line: lines.length,\n column: 1,\n message: 'Unclosed multi-line comment \"/*\"',\n severity: 'error',\n rule: 'js-unclosed-comment',\n });\n }\n\n if (inTemplateLiteral) {\n diagnostics.push({\n line: lines.length,\n column: 1,\n message: 'Unclosed template literal (`...`)',\n severity: 'error',\n rule: 'js-unclosed-template',\n });\n }\n\n // Check remaining unclosed brackets in stack\n while (stack.length > 0) {\n const unclosed = stack.pop()!;\n diagnostics.push({\n line: unclosed.line,\n column: unclosed.col,\n message: `Unclosed opening bracket '${unclosed.char}'`,\n severity: 'error',\n rule: 'js-unclosed-bracket',\n });\n }\n\n return diagnostics;\n}\n\n/**\n * Lints HTML/XML code for unclosed or mismatched tags and attribute errors.\n */\nexport function lintHtml(code: string): LintDiagnostic[] {\n const diagnostics: LintDiagnostic[] = [];\n const lines = code.split('\\n');\n\n // Void elements that do not require closing tags in HTML5\n const voidTags = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr', '!doctype'\n ]);\n\n const tagStack: { name: string; line: number; col: number }[] = [];\n\n // Match tags like <tag ...>, </tag>, <tag />\n const tagRegex = /<\\/?([a-zA-Z0-9\\-:]+)(\\s+[^>]*?)?(\\/?)>/g;\n\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n const lineNum = lineIdx + 1;\n const line = lines[lineIdx]!;\n\n let match: RegExpExecArray | null;\n tagRegex.lastIndex = 0;\n while ((match = tagRegex.exec(line)) !== null) {\n const fullTag = match[0];\n const tagName = (match[1] || '').toLowerCase();\n const isClosing = fullTag.startsWith('</');\n const isSelfClosing = fullTag.endsWith('/>') || voidTags.has(tagName);\n const col = match.index + 1;\n\n // Check for comments or doctypes\n if (tagName.startsWith('!--') || tagName.startsWith('!doctype')) {\n continue;\n }\n\n if (isClosing) {\n if (tagStack.length === 0) {\n diagnostics.push({\n line: lineNum,\n column: col,\n message: `Unexpected closing tag </${tagName}> without matching opening tag`,\n severity: 'error',\n rule: 'html-unmatched-closing-tag',\n });\n } else {\n const last = tagStack.pop()!;\n if (last.name !== tagName) {\n diagnostics.push({\n line: lineNum,\n column: col,\n message: `Mismatched closing tag </${tagName}>, expected </${last.name}> (opened on line ${last.line})`,\n severity: 'error',\n rule: 'html-mismatched-tag',\n });\n }\n }\n } else if (!isSelfClosing) {\n tagStack.push({ name: tagName, line: lineNum, col });\n }\n }\n }\n\n // Report any remaining unclosed tags\n while (tagStack.length > 0) {\n const unclosed = tagStack.pop()!;\n diagnostics.push({\n line: unclosed.line,\n column: unclosed.col,\n message: `Unclosed tag <${unclosed.name}>`,\n severity: 'error',\n rule: 'html-unclosed-tag',\n });\n }\n\n return diagnostics;\n}\n\n/**\n * Lints CSS code for unclosed braces, missing colons, and malformed declarations.\n */\nexport function lintCss(code: string): LintDiagnostic[] {\n const diagnostics: LintDiagnostic[] = [];\n const lines = code.split('\\n');\n let openBraces = 0;\n const braceStack: { line: number; col: number }[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const lineNum = i + 1;\n const line = lines[i]!;\n const trimmed = line.trim();\n\n // Skip comments and empty lines\n if (!trimmed || trimmed.startsWith('/*') || trimmed.startsWith('//')) {\n continue;\n }\n\n for (let c = 0; c < line.length; c++) {\n if (line[c] === '{') {\n openBraces++;\n braceStack.push({ line: lineNum, col: c + 1 });\n } else if (line[c] === '}') {\n if (openBraces === 0) {\n diagnostics.push({\n line: lineNum,\n column: c + 1,\n message: 'Unexpected closing brace \"}\" without opening \"{\"',\n severity: 'error',\n rule: 'css-unmatched-brace',\n });\n } else {\n openBraces--;\n braceStack.pop();\n }\n }\n }\n\n // Inside a rule block: check property declaration syntax\n if (openBraces > 0 && trimmed !== '{' && trimmed !== '}' && !trimmed.endsWith('{') && !trimmed.endsWith('}')) {\n // Check for missing colon in property: value\n if (!trimmed.includes(':') && !trimmed.startsWith('@') && !trimmed.endsWith(',')) {\n diagnostics.push({\n line: lineNum,\n column: 1,\n message: `Declaration \"${trimmed}\" is missing a colon \":\" between property and value`,\n severity: 'warning',\n rule: 'css-missing-colon',\n });\n }\n // Check for missing semicolon if line looks like a declaration and isn't the last line of a block\n if (trimmed.includes(':') && !trimmed.endsWith(';') && !trimmed.endsWith('{') && !trimmed.endsWith('}')) {\n const nextLine = lines[i + 1]?.trim() || '';\n if (nextLine && !nextLine.startsWith('}')) {\n diagnostics.push({\n line: lineNum,\n column: line.length,\n message: 'Missing semicolon \";\" at the end of CSS declaration',\n severity: 'warning',\n rule: 'css-missing-semicolon',\n });\n }\n }\n }\n }\n\n while (braceStack.length > 0) {\n const b = braceStack.pop()!;\n diagnostics.push({\n line: b.line,\n column: b.col,\n message: 'Unclosed CSS block \"{\"',\n severity: 'error',\n rule: 'css-unclosed-brace',\n });\n }\n\n return diagnostics;\n}\n\n/**\n * Lints Python code for indentation consistency, missing colons, and bracket balance.\n */\nexport function lintPython(code: string): LintDiagnostic[] {\n const diagnostics: LintDiagnostic[] = [];\n const lines = code.split('\\n');\n let hasSpaces = false;\n let hasTabs = false;\n const bracketStack: { char: string; line: number; col: number }[] = [];\n const matchMap: Record<string, string> = { ')': '(', ']': '[', '}': '{' };\n\n // Keywords that must be followed by a colon\n const colonKeywords = /^\\s*(def\\s+.*|class\\s+.*|if\\s+.*|elif\\s+.*|else|for\\s+.*|while\\s+.*|try|except(\\s+.*)?|finally|with\\s+.*)$/;\n\n for (let i = 0; i < lines.length; i++) {\n const lineNum = i + 1;\n const line = lines[i]!;\n const trimmed = line.trim();\n\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n // Check indentation\n const indentMatch = line.match(/^([ \\t]+)/);\n if (indentMatch && indentMatch[1]) {\n const indent = indentMatch[1];\n if (indent.includes(' ')) hasSpaces = true;\n if (indent.includes('\\t')) hasTabs = true;\n\n if (hasSpaces && hasTabs) {\n diagnostics.push({\n line: lineNum,\n column: 1,\n message: 'Inconsistent indentation: mixed tabs and spaces',\n severity: 'warning',\n rule: 'python-mixed-indentation',\n });\n }\n }\n\n // Check missing colon\n if (colonKeywords.test(trimmed) && !trimmed.endsWith(':') && !trimmed.includes('#')) {\n diagnostics.push({\n line: lineNum,\n column: line.length,\n message: 'Expected \":\" at the end of statement header',\n severity: 'error',\n rule: 'python-missing-colon',\n });\n }\n\n // Check bracket balance\n let inString: string | null = null;\n for (let c = 0; c < line.length; c++) {\n const ch = line[c]!;\n if (ch === '#') break; // Comment\n if (inString) {\n if (ch === inString && line[c - 1] !== '\\\\') inString = null;\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n inString = ch;\n continue;\n }\n\n if (ch === '(' || ch === '[' || ch === '{') {\n bracketStack.push({ char: ch, line: lineNum, col: c + 1 });\n } else if (ch === ')' || ch === ']' || ch === '}') {\n const expected = matchMap[ch];\n if (bracketStack.length === 0) {\n diagnostics.push({\n line: lineNum,\n column: c + 1,\n message: `Unmatched closing '${ch}'`,\n severity: 'error',\n rule: 'python-unmatched-bracket',\n });\n } else {\n const top = bracketStack.pop()!;\n if (top.char !== expected) {\n diagnostics.push({\n line: lineNum,\n column: c + 1,\n message: `Mismatched bracket '${ch}', expected closing for '${top.char}' from line ${top.line}`,\n severity: 'error',\n rule: 'python-mismatched-bracket',\n });\n }\n }\n }\n }\n }\n\n while (bracketStack.length > 0) {\n const unclosed = bracketStack.pop()!;\n diagnostics.push({\n line: unclosed.line,\n column: unclosed.col,\n message: `Unclosed '${unclosed.char}'`,\n severity: 'error',\n rule: 'python-unclosed-bracket',\n });\n }\n\n return diagnostics;\n}\n\n/**\n * Lints Bash/Shell code for unclosed quotes, missing control block terminators (fi, done, esac).\n */\nexport function lintBash(code: string): LintDiagnostic[] {\n const diagnostics: LintDiagnostic[] = [];\n const lines = code.split('\\n');\n\n const controlStack: { keyword: string; line: number }[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const lineNum = i + 1;\n const line = lines[i]!;\n const trimmed = line.trim();\n\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n // Tokens on line\n const words = trimmed.split(/\\s+/);\n for (const word of words) {\n if (word === 'if') controlStack.push({ keyword: 'if', line: lineNum });\n else if (word === 'fi') {\n const last = controlStack.pop();\n if (!last || last.keyword !== 'if') {\n diagnostics.push({\n line: lineNum,\n column: line.indexOf('fi') + 1,\n message: 'Unexpected \"fi\" with no preceding \"if\"',\n severity: 'error',\n rule: 'bash-unmatched-fi',\n });\n }\n } else if (word === 'case') controlStack.push({ keyword: 'case', line: lineNum });\n else if (word === 'esac') {\n const last = controlStack.pop();\n if (!last || last.keyword !== 'case') {\n diagnostics.push({\n line: lineNum,\n column: line.indexOf('esac') + 1,\n message: 'Unexpected \"esac\" with no preceding \"case\"',\n severity: 'error',\n rule: 'bash-unmatched-esac',\n });\n }\n } else if (word === 'do') controlStack.push({ keyword: 'do', line: lineNum });\n else if (word === 'done') {\n const last = controlStack.pop();\n if (!last || last.keyword !== 'do') {\n diagnostics.push({\n line: lineNum,\n column: line.indexOf('done') + 1,\n message: 'Unexpected \"done\" with no preceding \"do\" / loop',\n severity: 'error',\n rule: 'bash-unmatched-done',\n });\n }\n }\n }\n }\n\n while (controlStack.length > 0) {\n const unclosed = controlStack.pop()!;\n const expected = unclosed.keyword === 'if' ? 'fi' : unclosed.keyword === 'case' ? 'esac' : 'done';\n diagnostics.push({\n line: unclosed.line,\n column: 1,\n message: `Unclosed \"${unclosed.keyword}\" block, missing \"${expected}\"`,\n severity: 'error',\n rule: 'bash-unclosed-block',\n });\n }\n\n return diagnostics;\n}\n\n/**\n * Lints YAML code for tab indentation and syntax anomalies.\n */\nexport function lintYaml(code: string): LintDiagnostic[] {\n const diagnostics: LintDiagnostic[] = [];\n const lines = code.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const lineNum = i + 1;\n const line = lines[i]!;\n\n // Check tabs in indentation\n if (/^\\t+/.test(line) || /^ +\\t+/.test(line)) {\n diagnostics.push({\n line: lineNum,\n column: 1,\n message: 'YAML forbids tab characters for indentation; use spaces instead',\n severity: 'error',\n rule: 'yaml-no-tabs',\n });\n }\n\n // Key-value without space after colon (e.g. key:value instead of key: value)\n const trimmed = line.trim();\n if (/^[a-zA-Z0-9_-]+:[^ \\t\\n\\r/#]/.test(trimmed) && !trimmed.startsWith('http:') && !trimmed.startsWith('https:')) {\n diagnostics.push({\n line: lineNum,\n column: line.indexOf(':') + 1,\n message: 'YAML mappings require a space after the colon \":\" (e.g. \"key: value\")',\n severity: 'warning',\n rule: 'yaml-missing-space',\n });\n }\n }\n\n return diagnostics;\n}\n\n/**\n * Lints Markdown code for broken links and unclosed code blocks.\n */\nexport function lintMarkdown(code: string): LintDiagnostic[] {\n const diagnostics: LintDiagnostic[] = [];\n const lines = code.split('\\n');\n let openCodeFences = 0;\n let fenceStartLine = 1;\n\n for (let i = 0; i < lines.length; i++) {\n const lineNum = i + 1;\n const line = lines[i]!;\n const trimmed = line.trim();\n\n if (trimmed.startsWith('```')) {\n if (openCodeFences === 0) {\n openCodeFences++;\n fenceStartLine = lineNum;\n } else {\n openCodeFences--;\n }\n }\n }\n\n if (openCodeFences > 0) {\n diagnostics.push({\n line: fenceStartLine,\n column: 1,\n message: 'Unclosed Markdown code fence (```)',\n severity: 'error',\n rule: 'md-unclosed-fence',\n });\n }\n\n return diagnostics;\n}\n\n/**\n * Master lint function for any supported language.\n */\nexport function lintCode(code: string, language: string): LintDiagnostic[] {\n if (!code || !code.trim()) return [];\n\n const lang = (language || '').toLowerCase().trim();\n\n switch (lang) {\n case 'json':\n return lintJson(code);\n case 'javascript':\n case 'js':\n case 'typescript':\n case 'ts':\n case 'jsx':\n case 'tsx':\n return lintJavaScript(code);\n case 'html':\n case 'xml':\n case 'svg':\n return lintHtml(code);\n case 'css':\n case 'scss':\n case 'less':\n return lintCss(code);\n case 'python':\n case 'py':\n return lintPython(code);\n case 'bash':\n case 'sh':\n case 'shell':\n case 'zsh':\n return lintBash(code);\n case 'yaml':\n case 'yml':\n return lintYaml(code);\n case 'markdown':\n case 'md':\n return lintMarkdown(code);\n default:\n return [];\n }\n}\n\n","import { html, nothing, PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { MdBaseElement } from '../../internal/base-component.js';\nimport { codeStyles } from './code.css.js';\nimport { highlightCode } from './highlighter.js';\nimport { lintCode, LintDiagnostic } from './linter.js';\nimport '../icon/icon.js';\n\nexport type { LintDiagnostic };\n\n@customElement('md-code')\nexport class MdCode extends MdBaseElement {\n static override styles = [MdBaseElement.styles, codeStyles];\n\n /**\n * Raw source code string. If not provided, falls back to slot/textContent.\n */\n @property({ type: String })\n code = '';\n\n /**\n * Language identifier (e.g. 'javascript', 'typescript', 'html', 'css', 'json', 'python', 'bash', 'sql').\n */\n @property({ type: String, reflect: true })\n language = 'plaintext';\n\n /**\n * Alias for language.\n */\n @property({ type: String })\n override lang = '';\n\n /**\n * Optional filename or label to display in the header bar.\n */\n @property({ type: String })\n label = '';\n\n /**\n * Alias for label (filename).\n */\n @property({ type: String })\n filename = '';\n\n /**\n * When true, automatically lints the code for syntax issues and displays diagnostics.\n */\n @property({ type: Boolean, reflect: true })\n lint = false;\n\n /**\n * Custom / external diagnostic issues to display.\n */\n @property({ type: Array })\n diagnostics: LintDiagnostic[] = [];\n\n /**\n * Whether to show the lint issues summary bar at the bottom.\n */\n @property({\n type: Boolean,\n attribute: 'show-lint-summary',\n converter: {\n fromAttribute: (value: string | null) => value === null ? true : value !== 'false',\n toAttribute: (value: boolean) => value ? '' : null,\n },\n })\n showLintSummary = true;\n\n /**\n * Whether to render line numbers in a gutter.\n */\n @property({ type: Boolean, attribute: 'line-numbers', reflect: true })\n lineNumbers = false;\n\n /**\n * Line numbers to highlight, e.g. \"1, 3-5, 8\".\n */\n @property({ type: String, attribute: 'highlight-lines' })\n highlightLines = '';\n\n /**\n * Whether the code is copyable via the copy button.\n */\n @property({\n type: Boolean,\n reflect: true,\n converter: {\n fromAttribute: (value: string | null) => value === null ? true : value !== 'false',\n toAttribute: (value: boolean) => value ? '' : null,\n },\n })\n copyable = true;\n\n /**\n * When true, hides the copy button.\n */\n @property({ type: Boolean, attribute: 'hide-copy-button' })\n hideCopyButton = false;\n\n /**\n * When true, wraps long lines instead of scrolling horizontally.\n */\n @property({ type: Boolean, attribute: 'wrap-lines', reflect: true })\n wrapLines = false;\n\n /**\n * Maximum height for the code scroll container (e.g. \"300px\").\n */\n @property({ type: String, attribute: 'max-height' })\n maxHeight = '';\n\n @state()\n private isCopied = false;\n\n @state()\n private isIssuesExpanded = false;\n\n @state()\n private internalCode = '';\n\n @state()\n private activeDiagnostics: LintDiagnostic[] = [];\n\n private copyTimeout: ReturnType<typeof setTimeout> | null = null;\n\n override connectedCallback() {\n super.connectedCallback();\n this.extractCodeContent();\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n if (this.copyTimeout) {\n clearTimeout(this.copyTimeout);\n this.copyTimeout = null;\n }\n }\n\n override willUpdate(changedProperties: PropertyValues) {\n if (changedProperties.has('code') && this.code) {\n this.internalCode = this.code;\n } else if (!this.internalCode && this.textContent && this.textContent.trim()) {\n this.internalCode = this.normalizeIndentation(this.textContent);\n }\n this.runLint();\n }\n\n private extractCodeContent() {\n if (!this.code && this.textContent && this.textContent.trim()) {\n this.internalCode = this.normalizeIndentation(this.textContent);\n this.runLint();\n }\n }\n\n /**\n * Strips common leading indentation from multi-line template strings.\n */\n private normalizeIndentation(str: string): string {\n const lines = str.replace(/^\\r?\\n/, '').replace(/\\r?\\n\\s*$/, '').split('\\n');\n if (lines.length === 0) return str;\n\n let minIndent = Infinity;\n for (const line of lines) {\n if (line.trim().length === 0) continue;\n const indent = line.match(/^[ \\t]*/)?.[0]?.length || 0;\n if (indent < minIndent) minIndent = indent;\n }\n\n if (minIndent === Infinity || minIndent === 0) return lines.join('\\n');\n return lines.map(line => line.slice(minIndent)).join('\\n');\n }\n\n /**\n * Performs linting and combines internal and external diagnostics.\n */\n public runLint(): LintDiagnostic[] {\n const activeLang = this.effectiveLanguage;\n let computed: LintDiagnostic[] = [];\n\n const isLintEnabled = Boolean(this.lint || this.hasAttribute('lint'));\n const source = this.internalCode || this.code || '';\n if (isLintEnabled && source) {\n computed = lintCode(source, activeLang);\n }\n\n if (this.diagnostics && this.diagnostics.length > 0) {\n computed = [...computed, ...this.diagnostics];\n }\n\n this.activeDiagnostics = computed;\n this.emitEvent('lint-complete', {\n diagnostics: computed,\n isValid: computed.length === 0,\n });\n return computed;\n }\n\n /**\n * Active effective language.\n */\n get effectiveLanguage(): string {\n return this.lang || this.language || 'plaintext';\n }\n\n /**\n * Effective filename / label.\n */\n get effectiveLabel(): string {\n return this.filename || this.label;\n }\n\n /**\n * Copies the current unhighlighted code to clipboard.\n */\n public async copy(): Promise<boolean> {\n const textToCopy = this.internalCode || this.code || this.textContent || '';\n if (!textToCopy) return false;\n\n try {\n if (navigator.clipboard && navigator.clipboard.writeText) {\n await navigator.clipboard.writeText(textToCopy);\n } else {\n // Fallback for environments where clipboard API might be unavailable\n const textarea = document.createElement('textarea');\n textarea.value = textToCopy;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n }\n\n this.isCopied = true;\n this.emitEvent('copy', { code: textToCopy });\n\n if (this.copyTimeout) clearTimeout(this.copyTimeout);\n this.copyTimeout = setTimeout(() => {\n this.isCopied = false;\n }, 2000);\n\n return true;\n } catch {\n return false;\n }\n }\n\n private parseHighlightedLines(): Set<number> {\n const set = new Set<number>();\n if (!this.highlightLines) return set;\n\n const parts = this.highlightLines.split(',');\n for (const part of parts) {\n const trimmed = part.trim();\n if (trimmed.includes('-')) {\n const [startStr, endStr] = trimmed.split('-');\n const start = parseInt(startStr || '', 10);\n const end = parseInt(endStr || '', 10);\n if (!isNaN(start) && !isNaN(end)) {\n for (let i = start; i <= end; i++) set.add(i);\n }\n } else {\n const num = parseInt(trimmed, 10);\n if (!isNaN(num)) set.add(num);\n }\n }\n return set;\n }\n\n private handleSlotChange = () => {\n if (!this.code) {\n this.extractCodeContent();\n this.requestUpdate();\n }\n };\n\n private toggleIssuesList = () => {\n this.isIssuesExpanded = !this.isIssuesExpanded;\n };\n\n private scrollToLine(lineNum: number) {\n const lineEl = this.shadowRoot?.querySelector(`[data-line=\"${lineNum}\"]`);\n if (lineEl) {\n lineEl.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }\n\n override render() {\n const rawCode = this.internalCode || this.code || '';\n const activeLang = this.effectiveLanguage;\n const label = this.effectiveLabel;\n const showHeader = Boolean(label || activeLang !== 'plaintext' || this.copyable);\n const highlightedLines = this.parseHighlightedLines();\n\n // Map diagnostics by line number\n const diagnosticsByLine = new Map<number, LintDiagnostic[]>();\n for (const d of this.activeDiagnostics) {\n const list = diagnosticsByLine.get(d.line) || [];\n list.push(d);\n diagnosticsByLine.set(d.line, list);\n }\n\n const lines = rawCode.split('\\n');\n const totalLines = lines.length;\n\n // Generate highlighted HTML\n const highlightedHtml = highlightCode(rawCode, activeLang);\n const highlightedLinesHtml = highlightedHtml.split('\\n');\n\n const errorCount = this.activeDiagnostics.filter(d => d.severity === 'error' || !d.severity).length;\n const warningCount = this.activeDiagnostics.filter(d => d.severity === 'warning').length;\n const hasIssues = this.activeDiagnostics.length > 0;\n\n return html`\n <div class=\"code-container\" style=${this.maxHeight ? `--md-code-max-height: ${this.maxHeight};` : ''}>\n <!-- Hidden Slot for code content fallback -->\n <div style=\"display: none;\">\n <slot @slotchange=${this.handleSlotChange}></slot>\n </div>\n\n <!-- Header -->\n ${showHeader ? html`\n <header class=\"code-header\">\n <div class=\"code-header-left\">\n ${activeLang && activeLang !== 'plaintext' ? html`\n <span class=\"lang-badge\">${activeLang}</span>\n ` : nothing}\n ${label ? html`<span class=\"code-filename\">${label}</span>` : nothing}\n </div>\n\n <div class=\"code-header-actions\">\n <slot name=\"actions\"></slot>\n ${this.copyable && !this.hideCopyButton ? html`\n <button\n type=\"button\"\n class=\"action-btn ${this.isCopied ? 'copied' : ''}\"\n @click=${this.copy}\n aria-label=${this.isCopied ? 'Copied to clipboard' : 'Copy code to clipboard'}\n title=${this.isCopied ? 'Copied!' : 'Copy code'}\n >\n <md-icon name=${this.isCopied ? 'check' : 'content_copy'}></md-icon>\n <span>${this.isCopied ? 'Copied!' : 'Copy'}</span>\n </button>\n ` : nothing}\n </div>\n </header>\n ` : (this.copyable && !this.hideCopyButton ? html`\n <div class=\"floating-copy-btn\">\n <button\n type=\"button\"\n class=\"action-btn ${this.isCopied ? 'copied' : ''}\"\n @click=${this.copy}\n aria-label=${this.isCopied ? 'Copied to clipboard' : 'Copy code'}\n title=${this.isCopied ? 'Copied!' : 'Copy code'}\n >\n <md-icon name=${this.isCopied ? 'check' : 'content_copy'}></md-icon>\n <span>${this.isCopied ? 'Copied!' : 'Copy'}</span>\n </button>\n </div>\n ` : nothing)}\n\n <!-- Body with Gutter and Code Lines -->\n <div class=\"code-body\" style=${this.maxHeight ? `max-height: ${this.maxHeight};` : ''}>\n ${this.lineNumbers || this.hasAttribute('line-numbers') || this.lint || this.hasAttribute('lint') || this.activeDiagnostics.length > 0 ? html`\n <div class=\"code-gutter\" aria-hidden=\"true\">\n ${Array.from({ length: totalLines }, (_, idx) => {\n const lineNum = idx + 1;\n const diags = diagnosticsByLine.get(lineNum);\n const worstDiag = diags?.find(d => d.severity === 'error' || !d.severity) || diags?.[0];\n\n return html`\n <div class=\"gutter-line\" @click=${() => this.scrollToLine(lineNum)}>\n ${worstDiag ? html`\n <span\n class=\"gutter-marker ${worstDiag.severity || 'error'}\"\n title=\"Line ${lineNum}: ${worstDiag.message}\"\n >\n <md-icon name=${worstDiag.severity === 'warning' ? 'warning' : 'error'}></md-icon>\n </span>\n ` : nothing}\n ${this.lineNumbers || this.hasAttribute('line-numbers') ? html`<span>${lineNum}</span>` : nothing}\n </div>\n `;\n })}\n </div>\n ` : nothing}\n\n <pre><code>${highlightedLinesHtml.map((lineContent, idx) => {\n const lineNum = idx + 1;\n const isHighlighted = highlightedLines.has(lineNum);\n const diags = diagnosticsByLine.get(lineNum);\n const hasError = diags?.some(d => d.severity === 'error' || !d.severity);\n const hasWarning = diags?.some(d => d.severity === 'warning');\n\n const lineClasses = [\n 'code-line',\n isHighlighted ? 'highlighted' : '',\n hasError ? 'has-error' : '',\n hasWarning && !hasError ? 'has-warning' : '',\n ].filter(Boolean).join(' ');\n\n return html`<div class=${lineClasses} data-line=${lineNum}>${unsafeHTML(lineContent || '&nbsp;')}</div>`;\n })}</code></pre>\n </div>\n\n <!-- Lint Summary Footer -->\n ${(this.lint || this.hasAttribute('lint') || this.diagnostics.length > 0 || this.activeDiagnostics.length > 0) && this.showLintSummary !== false ? html`\n <footer class=\"lint-footer\">\n <div class=\"lint-footer-summary\" @click=${this.toggleIssuesList} role=\"button\" tabindex=\"0\">\n <div class=\"lint-counts\">\n ${hasIssues && errorCount > 0 ? html`\n <span class=\"lint-count-item errors\">\n <md-icon name=\"error\"></md-icon>\n <span>${errorCount} ${errorCount === 1 ? 'error' : 'errors'}</span>\n </span>\n ` : nothing}\n ${hasIssues && warningCount > 0 ? html`\n <span class=\"lint-count-item warnings\">\n <md-icon name=\"warning\"></md-icon>\n <span>${warningCount} ${warningCount === 1 ? 'warning' : 'warnings'}</span>\n </span>\n ` : nothing}\n ${!hasIssues ? html`\n <span class=\"lint-count-item valid\">\n <md-icon name=\"check_circle\"></md-icon>\n <span>No syntax issues detected</span>\n </span>\n ` : nothing}\n </div>\n\n ${hasIssues ? html`\n <button type=\"button\" class=\"action-btn\" aria-label=\"Toggle issues panel\">\n <md-icon name=${this.isIssuesExpanded ? 'expand_less' : 'expand_more'}></md-icon>\n <span>${this.isIssuesExpanded ? 'Hide issues' : 'View issues'}</span>\n </button>\n ` : nothing}\n </div>\n\n ${hasIssues && this.isIssuesExpanded ? html`\n <div class=\"lint-issues-list\" role=\"region\" aria-label=\"Lint diagnostics\">\n ${this.activeDiagnostics.map(d => html`\n <div\n class=\"lint-issue-item ${d.severity || 'error'}\"\n @click=${() => this.scrollToLine(d.line)}\n role=\"button\"\n tabindex=\"0\"\n >\n <md-icon name=${d.severity === 'warning' ? 'warning' : 'error'}></md-icon>\n <div class=\"lint-issue-content\">\n <span class=\"lint-issue-loc\">Line ${d.line}${d.column ? `:${d.column}` : ''}${d.rule ? ` • ${d.rule}` : ''}</span>\n <span class=\"lint-issue-msg\">${d.message}</span>\n </div>\n </div>\n `)}\n </div>\n ` : nothing}\n </footer>\n ` : nothing}\n </div>\n `;\n }\n}\n\n// Register alias md-code-block\n@customElement('md-code-block')\nexport class MdCodeBlock extends MdCode {}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'md-code': MdCode;\n 'md-code-block': MdCodeBlock;\n }\n}\n"],"mappings":";;;;;AAEA,IAAa,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACE1B,SAAS,EAAW,GAAsB;AACxC,SAAO,EACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAC3B;AAEA,SAAS,EAAK,GAAa,GAAyB;AAClD,SAAO,sBAAsB,CAAA,KAAQ,CAAA;AACvC;AAKA,SAAS,EAAY,GAAsB;AACzC,QAAM,IAAW,oBAAI,IAAI;AAAA,IACvB;AAAA,IAAY;AAAA,IAAO;AAAA,IAAM;AAAA,IAAS;AAAA,IAAS;AAAA,IAAW;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAS;AAAA,IAChF;AAAA,IAAS;AAAA,IAAe;AAAA,IAAY;AAAA,IAAY;AAAA,IAAW;AAAA,IAAW;AAAA,IAAU;AAAA,IAChF;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAW;AAAA,IAAS;AAAA,IAAW;AAAA,IAAO;AAAA,IAAQ;AAAA,IACxE;AAAA,IAAO;AAAA,IAAM;AAAA,IAAc;AAAA,IAAU;AAAA,IAAM;AAAA,IAAS;AAAA,IAAc;AAAA,IAAa;AAAA,IAC/E;AAAA,IAAS;AAAA,IAAO;AAAA,IAAU;AAAA,IAAa;AAAA,IAAS;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAM;AAAA,IAC/E;AAAA,IAAW;AAAA,IAAW;AAAA,IAAa;AAAA,IAAU;AAAA,IAAY;AAAA,IAAW;AAAA,IAAU;AAAA,IAC9E;AAAA,IAAU;AAAA,IAAU;AAAA,IAAS;AAAA,IAAU;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAO;AAAA,IACjF;AAAA,IAAU;AAAA,IAAa;AAAA,IAAU;AAAA,IAAW;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAQ;AAAA,EAC9E,CAAC;AAED,MAAI,IAAS,IACT,IAAI;AACR,QAAM,IAAI,EAAK;AAEf,SAAO,IAAI,KAAG;AAEZ,QAAI,EAAK,CAAA,MAAO,OAAO,EAAK,IAAI,CAAA,MAAO,KAAK;AAC1C,UAAI,IAAM,EAAK,QAAQ;AAAA,GAAM,CAAC;AAC9B,MAAI,MAAQ,OAAI,IAAM,IACtB,KAAU,EAAK,WAAW,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACxD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,EAAK,CAAA,MAAO,OAAO,EAAK,IAAI,CAAA,MAAO,KAAK;AAC1C,UAAI,IAAM,EAAK,QAAQ,MAAM,IAAI,CAAC;AAClC,MAAI,MAAQ,KAAI,IAAM,IACjB,KAAO,GACZ,KAAU,EAAK,WAAW,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACxD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,EAAK,CAAA,MAAO,KAAK;AACnB,UAAI,IAAM,IAAI;AACd,aAAO,IAAM,KAAK,EAAK,CAAA,MAAS;AAC9B,QAAI,EAAK,CAAA,MAAS,QAAM,KACxB;AAEF,MAAI,IAAM,KAAG,KACb,KAAU,EAAK,UAAU,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACvD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,EAAK,CAAA,MAAO,OAAO,EAAK,CAAA,MAAO,KAAK;AACtC,YAAM,IAAI,EAAK,CAAA;AACf,UAAI,IAAM,IAAI;AACd,aAAO,IAAM,KAAK,EAAK,CAAA,MAAS,KAAK,EAAK,CAAA,MAAS;AAAA;AACjD,QAAI,EAAK,CAAA,MAAS,QAAM,KACxB;AAEF,MAAI,IAAM,KAAK,EAAK,CAAA,MAAS,KAAG,KAChC,KAAU,EAAK,UAAU,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACvD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,QAAQ,KAAK,EAAK,CAAA,CAAG,KAAM,EAAK,CAAA,MAAO,OAAO,QAAQ,KAAK,EAAK,IAAI,CAAA,KAAM,EAAE,GAAI;AAClF,UAAI,IAAM;AACV,aAAO,IAAM,KAAK,wBAAwB,KAAK,EAAK,CAAA,CAAK,IACvD,CAAA;AAEF,MAAA,KAAU,EAAK,UAAU,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACvD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,aAAa,KAAK,EAAK,CAAA,CAAG,GAAG;AAC/B,UAAI,IAAM;AACV,aAAO,IAAM,KAAK,gBAAgB,KAAK,EAAK,CAAA,CAAK,IAC/C,CAAA;AAEF,YAAM,IAAO,EAAK,MAAM,GAAG,CAAG;AAE9B,UAAI,IAAO;AACX,aAAO,IAAO,KAAK,KAAK,KAAK,EAAK,CAAA,CAAM,IAAG,CAAA;AAC3C,YAAM,IAAa,EAAK,CAAA,MAAU;AAElC,MAAI,MAAS,UAAU,MAAS,UAC9B,KAAU,EAAK,WAAW,EAAW,CAAI,CAAC,IACjC,MAAS,UAAU,MAAS,cACrC,KAAU,EAAK,YAAY,EAAW,CAAI,CAAC,IAClC,EAAS,IAAI,CAAI,IAC1B,KAAU,EAAK,WAAW,EAAW,CAAI,CAAC,IACjC,wBAAwB,KAAK,CAAI,KAAK,CAAC,IAChD,KAAU,EAAK,QAAQ,EAAW,CAAI,CAAC,IAC9B,IACT,KAAU,EAAK,YAAY,EAAW,CAAI,CAAC,IAE3C,KAAU,EAAW,CAAI,GAE3B,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,sBAAsB,KAAK,EAAK,CAAA,CAAG,GAAG;AACxC,UAAI,IAAM;AACV,aAAO,IAAM,KAAK,sBAAsB,KAAK,EAAK,CAAA,CAAK,IACrD,CAAA;AAEF,MAAA,KAAU,EAAK,YAAY,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACzD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,cAAc,KAAK,EAAK,CAAA,CAAG,GAAG;AAChC,MAAA,KAAU,EAAK,eAAe,EAAW,EAAK,CAAA,CAAG,CAAC,GAClD;AACA;AAAA,IACF;AAEA,IAAA,KAAU,EAAW,EAAK,CAAA,CAAG,GAC7B;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,EAAc,GAAsB;AAC3C,MAAI,IAAS,IACT,IAAI;AACR,QAAM,IAAI,EAAK;AAEf,SAAO,IAAI,KAAG;AAEZ,QAAI,EAAK,MAAM,GAAG,IAAI,CAAC,MAAM,QAAQ;AACnC,UAAI,IAAM,EAAK,QAAQ,OAAO,IAAI,CAAC;AACnC,MAAI,MAAQ,KAAI,IAAM,IACjB,KAAO,GACZ,KAAU,EAAK,WAAW,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACxD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,EAAK,CAAA,MAAO,KAAK;AACnB,UAAI,IAAM,EAAK,QAAQ,KAAK,CAAC;AAC7B,MAAI,MAAQ,KAAI,IAAM,IACjB,KAAO;AAEZ,YAAM,IAAa,EAAK,MAAM,GAAG,CAAG,GAE9B,IAAW,EAAW,MAAM,wBAAwB;AAC1D,UAAI,KAAY,EAAS,CAAA,GAAI;AAC3B,YAAI,IAAS,EAAK,eAAe,EAAW,EAAW,WAAW,IAAI,IAAI,OAAO,GAAG,CAAC;AACrF,QAAA,KAAU,EAAK,OAAO,EAAW,EAAS,CAAA,CAAE,CAAC;AAE7C,YAAI,IAAO,EAAW,MAAM,EAAS,CAAA,EAAG,MAAM;AAE9C,cAAM,IAAY;AAClB,YAAI,IAAU,GACV;AAEJ,gBAAQ,IAAY,EAAU,KAAK,CAAI,OAAO,QAAM;AAC9B,UAAA,EAAU,CAAA;AAC9B,gBAAM,IAAW,EAAU,CAAA,GACrB,IAAU,EAAU,CAAA;AAM1B,cAHA,KAAU,EAAW,EAAK,MAAM,GAAS,EAAU,KAAK,CAAC,GAEzD,KAAU,EAAK,aAAa,EAAW,CAAQ,CAAC,GAC5C,GAAS;AACX,kBAAM,IAAQ,EAAQ,QAAQ,GAAG;AACjC,YAAA,KAAU,EAAK,YAAY,GAAG;AAC9B,kBAAM,IAAS,EAAQ,MAAM,IAAQ,CAAC,EAAE,KAAK;AAC7C,YAAA,KAAU,EAAK,UAAU,EAAW,CAAM,CAAC;AAAA,UAC7C;AACA,UAAA,IAAU,EAAU;AAAA,QACtB;AAEA,cAAM,IAAW,EAAK,MAAM,CAAO;AACnC,QAAI,EAAS,SAAS,IAAI,IACxB,KAAU,EAAW,EAAS,MAAM,GAAG,EAAE,CAAC,IAAI,EAAK,eAAe,OAAO,IAChE,EAAS,SAAS,GAAG,IAC9B,KAAU,EAAW,EAAS,MAAM,GAAG,EAAE,CAAC,IAAI,EAAK,eAAe,MAAM,IAExE,KAAU,EAAW,CAAQ,GAE/B,KAAU;AAAA,MACZ,MACE,CAAA,KAAU,EAAW,CAAU;AAEjC,UAAI;AACJ;AAAA,IACF;AAEA,IAAA,KAAU,EAAW,EAAK,CAAA,CAAG,GAC7B;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,EAAa,GAAsB;AAC1C,MAAI,IAAS,IACT,IAAI;AACR,QAAM,IAAI,EAAK;AACf,MAAI,IAAU;AAEd,SAAO,IAAI,KAAG;AAEZ,QAAI,EAAK,CAAA,MAAO,OAAO,EAAK,IAAI,CAAA,MAAO,KAAK;AAC1C,UAAI,IAAM,EAAK,QAAQ,MAAM,IAAI,CAAC;AAClC,MAAI,MAAQ,KAAI,IAAM,IACjB,KAAO,GACZ,KAAU,EAAK,WAAW,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACxD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,EAAK,CAAA,MAAO,OAAO,EAAK,CAAA,MAAO,KAAK;AACtC,YAAM,IAAI,EAAK,CAAA;AACf,UAAI,IAAM,IAAI;AACd,aAAO,IAAM,KAAK,EAAK,CAAA,MAAS,KAAK,EAAK,CAAA,MAAS;AAAA,IAAM,CAAA;AACzD,MAAI,IAAM,KAAK,EAAK,CAAA,MAAS,KAAG,KAChC,KAAU,EAAK,UAAU,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACvD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,EAAK,CAAA,MAAO,KAAK;AACnB,MAAA,IAAU,IACV,KAAU,EAAK,eAAe,GAAG,GACjC;AACA;AAAA,IACF;AACA,QAAI,EAAK,CAAA,MAAO,KAAK;AACnB,MAAA,IAAU,IACV,KAAU,EAAK,eAAe,GAAG,GACjC;AACA;AAAA,IACF;AAGA,QAAI,KAAW,YAAY,KAAK,EAAK,CAAA,CAAG,GAAG;AACzC,UAAI,IAAM;AACV,aAAO,IAAM,KAAK,gBAAgB,KAAK,EAAK,CAAA,CAAK,IAAG,CAAA;AACpD,YAAM,IAAO,EAAK,MAAM,GAAG,CAAG;AAE9B,UAAI,IAAO;AACX,aAAO,IAAO,KAAK,KAAK,KAAK,EAAK,CAAA,CAAM,IAAG,CAAA;AAC3C,UAAI,EAAK,CAAA,MAAU,KAAK;AACtB,QAAA,KAAU,EAAK,YAAY,EAAW,CAAI,CAAC,GAC3C,KAAU,EAAW,EAAK,MAAM,GAAK,CAAI,CAAC,GAC1C,KAAU,EAAK,eAAe,GAAG,GACjC,IAAI,IAAO;AACX;AAAA,MACF;AAAA,IACF;AAGA,QAAI,QAAQ,KAAK,EAAK,CAAA,CAAG,GAAG;AAC1B,UAAI,IAAM;AACV,aAAO,IAAM,KAAK,gBAAgB,KAAK,EAAK,CAAA,CAAK,IAAG,CAAA;AACpD,MAAA,KAAU,EAAK,UAAU,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACvD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,EAAK,CAAA,MAAO,OAAO,cAAc,KAAK,EAAK,IAAI,CAAA,KAAM,EAAE,GAAG;AAC5D,UAAI,IAAM,IAAI;AACd,aAAO,IAAM,KAAK,cAAc,KAAK,EAAK,CAAA,CAAK,IAAG,CAAA;AAClD,MAAA,KAAU,EAAK,UAAU,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACvD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,UAAU,KAAK,EAAK,CAAA,CAAG,GAAG;AAC5B,MAAA,KAAU,EAAK,eAAe,EAAW,EAAK,CAAA,CAAG,CAAC,GAClD;AACA;AAAA,IACF;AAEA,IAAA,KAAU,EAAW,EAAK,CAAA,CAAG,GAC7B;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,EAAc,GAAsB;AAC3C,MAAI,IAAS,IACT,IAAI;AACR,QAAM,IAAI,EAAK;AAEf,SAAO,IAAI,KAAG;AAEZ,QAAI,EAAK,CAAA,MAAO,KAAK;AACnB,UAAI,IAAM,IAAI;AACd,aAAO,IAAM,KAAK,EAAK,CAAA,MAAS;AAC9B,QAAI,EAAK,CAAA,MAAS,QAAM,KACxB;AAEF,MAAI,IAAM,KAAG;AACb,YAAM,IAAM,EAAK,MAAM,GAAG,CAAG;AAG7B,UAAI,IAAO;AACX,aAAO,IAAO,KAAK,KAAK,KAAK,EAAK,CAAA,CAAM,IAAG,CAAA;AAC3C,MAAI,EAAK,CAAA,MAAU,MACjB,KAAU,EAAK,YAAY,EAAW,CAAG,CAAC,IAE1C,KAAU,EAAK,UAAU,EAAW,CAAG,CAAC,GAE1C,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,SAAS,KAAK,EAAK,CAAA,CAAG,GAAG;AAC3B,UAAI,IAAM;AACV,aAAO,IAAM,KAAK,aAAa,KAAK,EAAK,CAAA,CAAK,IAAG,CAAA;AACjD,MAAA,KAAU,EAAK,UAAU,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACvD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,WAAW,KAAK,EAAK,CAAA,CAAG,GAAG;AAC7B,UAAI,IAAM;AACV,aAAO,IAAM,KAAK,WAAW,KAAK,EAAK,CAAA,CAAK,IAAG,CAAA;AAC/C,YAAM,IAAO,EAAK,MAAM,GAAG,CAAG;AAC9B,MAAI,MAAS,UAAU,MAAS,UAC9B,KAAU,EAAK,WAAW,EAAW,CAAI,CAAC,IACjC,MAAS,SAClB,KAAU,EAAK,YAAY,EAAW,CAAI,CAAC,IAE3C,KAAU,EAAW,CAAI,GAE3B,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,YAAY,KAAK,EAAK,CAAA,CAAG,GAAG;AAC9B,MAAA,KAAU,EAAK,eAAe,EAAW,EAAK,CAAA,CAAG,CAAC,GAClD;AACA;AAAA,IACF;AAEA,IAAA,KAAU,EAAW,EAAK,CAAA,CAAG,GAC7B;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,EAAgB,GAAsB;AAC7C,QAAM,IAAW,oBAAI,IAAI;AAAA,IACvB;AAAA,IAAO;AAAA,IAAM;AAAA,IAAU;AAAA,IAAS;AAAA,IAAS;AAAA,IAAS;AAAA,IAAS;AAAA,IAAY;AAAA,IAAO;AAAA,IAC9E;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAS;AAAA,IAAW;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAM;AAAA,IAC7E;AAAA,IAAM;AAAA,IAAM;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAY;AAAA,IAAO;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAS;AAAA,IACxE;AAAA,IAAQ;AAAA,IAAO;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAS;AAAA,EAC3C,CAAC;AAED,MAAI,IAAS,IACT,IAAI;AACR,QAAM,IAAI,EAAK;AAEf,SAAO,IAAI,KAAG;AAEZ,QAAI,EAAK,CAAA,MAAO,KAAK;AACnB,UAAI,IAAM,EAAK,QAAQ;AAAA,GAAM,CAAC;AAC9B,MAAI,MAAQ,OAAI,IAAM,IACtB,KAAU,EAAK,WAAW,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACxD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,EAAK,MAAM,GAAG,IAAI,CAAC,MAAM,SAAS,EAAK,MAAM,GAAG,IAAI,CAAC,MAAM,OAAO;AACpE,YAAM,IAAI,EAAK,MAAM,GAAG,IAAI,CAAC;AAC7B,UAAI,IAAM,EAAK,QAAQ,GAAG,IAAI,CAAC;AAC/B,MAAI,MAAQ,KAAI,IAAM,IACjB,KAAO,GACZ,KAAU,EAAK,UAAU,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACvD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,EAAK,CAAA,MAAO,OAAO,EAAK,CAAA,MAAO,KAAK;AACtC,YAAM,IAAI,EAAK,CAAA;AACf,UAAI,IAAM,IAAI;AACd,aAAO,IAAM,KAAK,EAAK,CAAA,MAAS,KAAK,EAAK,CAAA,MAAS;AAAA;AACjD,QAAI,EAAK,CAAA,MAAS,QAAM,KACxB;AAEF,MAAI,IAAM,KAAK,EAAK,CAAA,MAAS,KAAG,KAChC,KAAU,EAAK,UAAU,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACvD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,QAAQ,KAAK,EAAK,CAAA,CAAG,GAAG;AAC1B,UAAI,IAAM;AACV,aAAO,IAAM,KAAK,wBAAwB,KAAK,EAAK,CAAA,CAAK,IAAG,CAAA;AAC5D,MAAA,KAAU,EAAK,UAAU,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACvD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,YAAY,KAAK,EAAK,CAAA,CAAG,GAAG;AAC9B,UAAI,IAAM;AACV,aAAO,IAAM,KAAK,eAAe,KAAK,EAAK,CAAA,CAAK,IAAG,CAAA;AACnD,YAAM,IAAO,EAAK,MAAM,GAAG,CAAG;AAE9B,UAAI,IAAO;AACX,aAAO,IAAO,KAAK,KAAK,KAAK,EAAK,CAAA,CAAM,IAAG,CAAA;AAC3C,YAAM,IAAa,EAAK,CAAA,MAAU;AAElC,MAAI,MAAS,UAAU,MAAS,UAC9B,KAAU,EAAK,WAAW,EAAW,CAAI,CAAC,IACjC,MAAS,SAClB,KAAU,EAAK,YAAY,EAAW,CAAI,CAAC,IAClC,EAAS,IAAI,CAAI,IAC1B,KAAU,EAAK,WAAW,EAAW,CAAI,CAAC,IACjC,IACT,KAAU,EAAK,YAAY,EAAW,CAAI,CAAC,IAClC,uBAAuB,KAAK,CAAI,IACzC,KAAU,EAAK,QAAQ,EAAW,CAAI,CAAC,IAEvC,KAAU,EAAW,CAAI,GAE3B,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,qBAAqB,KAAK,EAAK,CAAA,CAAG,GAAG;AACvC,MAAA,KAAU,EAAK,YAAY,EAAW,EAAK,CAAA,CAAG,CAAC,GAC/C;AACA;AAAA,IACF;AAGA,QAAI,eAAe,KAAK,EAAK,CAAA,CAAG,GAAG;AACjC,MAAA,KAAU,EAAK,eAAe,EAAW,EAAK,CAAA,CAAG,CAAC,GAClD;AACA;AAAA,IACF;AAEA,IAAA,KAAU,EAAW,EAAK,CAAA,CAAG,GAC7B;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,EAAc,GAAsB;AAC3C,QAAM,IAAW,oBAAI,IAAI;AAAA,IACvB;AAAA,IAAQ;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAM;AAAA,IAAO;AAAA,IACrE;AAAA,IAAM;AAAA,IAAM;AAAA,IAAU;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAS;AAAA,IAAQ;AAAA,IAC1E;AAAA,IAAM;AAAA,IAAS;AAAA,IAAM;AAAA,IAAM;AAAA,IAAM;AAAA,IAAO;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAO;AAAA,IAAQ;AAAA,EACxE,CAAC;AAED,MAAI,IAAS,IACT,IAAI;AACR,QAAM,IAAI,EAAK;AAEf,SAAO,IAAI,KAAG;AAEZ,QAAI,EAAK,CAAA,MAAO,KAAK;AACnB,UAAI,IAAM,EAAK,QAAQ;AAAA,GAAM,CAAC;AAC9B,MAAI,MAAQ,OAAI,IAAM,IACtB,KAAU,EAAK,WAAW,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACxD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,EAAK,CAAA,MAAO,OAAO,EAAK,CAAA,MAAO,KAAK;AACtC,YAAM,IAAI,EAAK,CAAA;AACf,UAAI,IAAM,IAAI;AACd,aAAO,IAAM,KAAK,EAAK,CAAA,MAAS,KAAK,EAAK,CAAA,MAAS;AAAA;AACjD,QAAI,EAAK,CAAA,MAAS,QAAM,KACxB;AAEF,MAAI,IAAM,KAAK,EAAK,CAAA,MAAS,KAAG,KAChC,KAAU,EAAK,UAAU,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACvD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,EAAK,CAAA,MAAO,KAAK;AACnB,UAAI,IAAM,IAAI;AACd,UAAI,EAAK,CAAA,MAAS;AAChB,QAAA,IAAM,EAAK,QAAQ,KAAK,CAAG,GACvB,MAAQ,KAAI,IAAM,IACjB,KAAO;AAAA,eACH,EAAK,CAAA,MAAS;AACvB,QAAA,IAAM,EAAK,QAAQ,KAAK,CAAG,GACvB,MAAQ,KAAI,IAAM,IACjB,KAAO;AAAA,UAEZ,QAAO,IAAM,KAAK,eAAe,KAAK,EAAK,CAAA,CAAK,IAAG,CAAA;AAErD,MAAA,KAAU,EAAK,YAAY,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACzD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,EAAK,CAAA,MAAO,OAAO,YAAY,KAAK,EAAK,IAAI,CAAA,KAAM,EAAE,GAAG;AAC1D,UAAI,IAAM,IAAI;AACd,aAAO,IAAM,KAAK,gBAAgB,KAAK,EAAK,CAAA,CAAK,IAAG,CAAA;AACpD,MAAA,KAAU,EAAK,aAAa,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GAC1D,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,eAAe,KAAK,EAAK,CAAA,CAAG,GAAG;AACjC,UAAI,IAAM;AACV,aAAO,IAAM,KAAK,mBAAmB,KAAK,EAAK,CAAA,CAAK,IAAG,CAAA;AACvD,YAAM,IAAO,EAAK,MAAM,GAAG,CAAG;AAC9B,MAAI,EAAS,IAAI,CAAI,IACnB,KAAU,EAAK,WAAW,EAAW,CAAI,CAAC,IAE1C,KAAU,EAAW,CAAI,GAE3B,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,WAAW,KAAK,EAAK,CAAA,CAAG,GAAG;AAC7B,MAAA,KAAU,EAAK,YAAY,EAAW,EAAK,CAAA,CAAG,CAAC,GAC/C;AACA;AAAA,IACF;AAEA,IAAA,KAAU,EAAW,EAAK,CAAA,CAAG,GAC7B;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,EAAa,GAAsB;AAC1C,QAAM,IAAW,oBAAI,IAAI;AAAA,IACvB;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAU;AAAA,IAAO;AAAA,IACxE;AAAA,IAAU;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAS;AAAA,IAAS;AAAA,IAC/E;AAAA,IAAM;AAAA,IAAS;AAAA,IAAM;AAAA,IAAS;AAAA,IAAU;AAAA,IAAS;AAAA,IAAU;AAAA,IAAS;AAAA,IAAO;AAAA,IAC3E;AAAA,IAAY;AAAA,IAAS;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAO;AAAA,IAAM;AAAA,IAAO;AAAA,IAAM;AAAA,IAC3E;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAW;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAO;AAAA,IAC5E;AAAA,IAAO;AAAA,IAAW;AAAA,IAAc;AAAA,IAAS;AAAA,IAAW;AAAA,IAAS;AAAA,EAC/D,CAAC;AAED,MAAI,IAAS,IACT,IAAI;AACR,QAAM,IAAI,EAAK;AAEf,SAAO,IAAI,KAAG;AAEZ,QAAI,EAAK,CAAA,MAAO,OAAO,EAAK,IAAI,CAAA,MAAO,KAAK;AAC1C,UAAI,IAAM,EAAK,QAAQ;AAAA,GAAM,CAAC;AAC9B,MAAI,MAAQ,OAAI,IAAM,IACtB,KAAU,EAAK,WAAW,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACxD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,EAAK,CAAA,MAAO,OAAO,EAAK,CAAA,MAAO,KAAK;AACtC,YAAM,IAAI,EAAK,CAAA;AACf,UAAI,IAAM,IAAI;AACd,aAAO,IAAM,KAAK,EAAK,CAAA,MAAS,KAAK,EAAK,CAAA,MAAS;AAAA,IAAM,CAAA;AACzD,MAAI,IAAM,KAAK,EAAK,CAAA,MAAS,KAAG,KAChC,KAAU,EAAK,UAAU,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACvD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,YAAY,KAAK,EAAK,CAAA,CAAG,GAAG;AAC9B,UAAI,IAAM;AACV,aAAO,IAAM,KAAK,eAAe,KAAK,EAAK,CAAA,CAAK,IAAG,CAAA;AACnD,YAAM,IAAO,EAAK,MAAM,GAAG,CAAG;AAC9B,MAAI,EAAS,IAAI,EAAK,YAAY,CAAC,IACjC,KAAU,EAAK,WAAW,EAAW,CAAI,CAAC,IAE1C,KAAU,EAAW,CAAI,GAE3B,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,QAAQ,KAAK,EAAK,CAAA,CAAG,GAAG;AAC1B,UAAI,IAAM;AACV,aAAO,IAAM,KAAK,SAAS,KAAK,EAAK,CAAA,CAAK,IAAG,CAAA;AAC7C,MAAA,KAAU,EAAK,UAAU,EAAW,EAAK,MAAM,GAAG,CAAG,CAAC,CAAC,GACvD,IAAI;AACJ;AAAA,IACF;AAGA,QAAI,aAAa,KAAK,EAAK,CAAA,CAAG,GAAG;AAC/B,MAAA,KAAU,EAAK,YAAY,EAAW,EAAK,CAAA,CAAG,CAAC,GAC/C;AACA;AAAA,IACF;AAEA,QAAI,SAAS,KAAK,EAAK,CAAA,CAAG,GAAG;AAC3B,MAAA,KAAU,EAAK,eAAe,EAAW,EAAK,CAAA,CAAG,CAAC,GAClD;AACA;AAAA,IACF;AAEA,IAAA,KAAU,EAAW,EAAK,CAAA,CAAG,GAC7B;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAgB,EAAc,GAAc,GAA0B;AACpE,MAAI,CAAC,EAAM,QAAO;AAIlB,WAFc,KAAY,IAAI,YAAY,EAAE,KAEpC,GAAR;AAAA,IACE,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAY,CAAI;AAAA,IACzB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAc,CAAI;AAAA,IAC3B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAa,CAAI;AAAA,IAC1B,KAAK;AACH,aAAO,EAAc,CAAI;AAAA,IAC3B,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAgB,CAAI;AAAA,IAC7B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAc,CAAI;AAAA,IAC3B,KAAK;AACH,aAAO,EAAa,CAAI;AAAA,IAC1B;AACE,aAAO,EAAW,CAAI;AAAA,EAC1B;AACF;AC7rBA,SAAgB,EAAS,GAAgC;AACvD,QAAM,IAAgC,CAAC;AAEvC,MAAI,CADY,EAAK,KAChB,EAAS,QAAO;AAGrB,MAAI;AACF,gBAAK,MAAM,CAAI,GACR;AAAA,EACT,SAAS,GAAc;AACrB,UAAM,IAAW,aAAe,QAAQ,EAAI,UAAU,OAAO,CAAG;AAGhE,QAAI,IAAO,GACP,IAAS;AAEb,UAAM,IAAW,EAAS,MAAM,oBAAoB,GAC9C,IAAe,EAAS,MAAM,0BAA0B;AAE9D,QAAI,KAAgB,EAAa,CAAA,KAAM,EAAa,CAAA;AAClD,MAAA,IAAO,SAAS,EAAa,CAAA,GAAI,EAAE,GACnC,IAAS,SAAS,EAAa,CAAA,GAAI,EAAE;AAAA,aAC5B,KAAY,EAAS,CAAA,GAAI;AAClC,YAAM,IAAM,SAAS,EAAS,CAAA,GAAI,EAAE,GAC9B,IAAQ,EAAK,MAAM,GAAG,CAAG,EAAE,MAAM;AAAA,CAAI;AAC3C,MAAA,IAAO,EAAM,QACb,KAAU,EAAM,EAAM,SAAS,CAAA,GAAI,UAAU,KAAK;AAAA,IACpD,OAAO;AAEL,YAAM,IAAQ,EAAK,MAAM;AAAA,CAAI;AAC7B,UAAI,IAAQ;AAEZ,eAAS,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;AACrC,cAAM,IAAc,EAAM,CAAA;AAE1B,YAAI,UAAU,KAAK,CAAW,GAAG;AAC/B,UAAA,EAAY,KAAK;AAAA,YACf,MAAM,IAAI;AAAA,YACV,QAAQ,EAAY,QAAQ,GAAG,IAAI;AAAA,YACnC,SAAS;AAAA,YACT,UAAU;AAAA,YACV,MAAM;AAAA,UACR,CAAC,GACD,IAAQ;AACR;AAAA,QACF;AAEA,YAAI,cAAc,KAAK,CAAW,GAAG;AACnC,UAAA,EAAY,KAAK;AAAA,YACf,MAAM,IAAI;AAAA,YACV,QAAQ,EAAY,OAAO,aAAa,IAAI;AAAA,YAC5C,SAAS;AAAA,YACT,UAAU;AAAA,YACV,MAAM;AAAA,UACR,CAAC,GACD,IAAQ;AACR;AAAA,QACF;AAEA,YAAI,OAAO,KAAK,CAAW,KAAK,OAAO,KAAK,CAAW,GAAG;AACxD,UAAA,EAAY,KAAK;AAAA,YACf,MAAM,IAAI;AAAA,YACV,QAAQ,EAAY,OAAO,WAAW,IAAI;AAAA,YAC1C,SAAS;AAAA,YACT,UAAU;AAAA,YACV,MAAM;AAAA,UACR,CAAC,GACD,IAAQ;AACR;AAAA,QACF;AAEA,cAAM,IAAc,EAAY,MAAM,+BAA+B;AACrE,YAAI,KAAe,EAAY,CAAA,KAAM,EAAY,CAAA,GAAI;AACnD,UAAA,EAAY,KAAK;AAAA,YACf,MAAM,IAAI;AAAA,YACV,QAAQ,EAAY,QAAQ,EAAY,CAAA,CAAE,IAAI;AAAA,YAC9C,SAAS,QAAQ,EAAY,CAAA,CAAA;AAAA,YAC7B,UAAU;AAAA,YACV,MAAM;AAAA,UACR,CAAC,GACD,IAAQ;AACR;AAAA,QACF;AAAA,MACF;AAEA,UAAI,EAAO,QAAO;AAAA,IACpB;AAGA,QAAI,IAAe,EAAS,QAAQ,qBAAqB,EAAE,EAAE,QAAQ,4BAA4B,EAAE,EAAE,KAAK;AAC1G,IAAK,MAAc,IAAe,wBAElC,EAAY,KAAK;AAAA,MACf,MAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAS;AAAA,MACT,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAKA,SAAgB,EAAe,GAAgC;AAC7D,QAAM,IAAgC,CAAC,GACjC,IAAQ,EAAK,MAAM;AAAA,CAAI,GAGvB,IAAuD,CAAC,GACxD,IAAmC;AAAA,IAAE,KAAK;AAAA,IAAK,KAAK;AAAA,IAAK,KAAK;AAAA,EAAI;AACxE,MAAI,IAAiB,IACjB,IAAoB;AAExB,WAAS,IAAU,GAAG,IAAU,EAAM,QAAQ,KAAW;AACvD,UAAM,IAAU,IAAU,GACpB,IAAO,EAAM,CAAA;AACnB,QAAI,IAA0B,MAC1B,IAAY;AAEhB,aAAS,IAAS,GAAG,IAAS,EAAK,QAAQ,KAAU;AACnD,YAAM,IAAO,EAAK,CAAA,GACZ,IAAW,EAAK,IAAS,CAAA,KAAM;AAGrC,UAAI,GAAgB;AAClB,QAAI,MAAS,OAAO,MAAa,QAC/B,IAAiB,IACjB;AAEF;AAAA,MACF;AAGA,UAAI,GAAmB;AACrB,YAAI,MAAS,MAAM;AACjB,UAAA;AACA;AAAA,QACF;AACA,QAAI,MAAS,QACX,IAAoB;AAEtB;AAAA,MACF;AAGA,UAAI,GAAU;AACZ,QAAI,IACF,IAAY,KACH,MAAS,OAClB,IAAY,KACH,MAAS,MAClB,IAAW;AAEb;AAAA,MACF;AAGA,UAAI,MAAS,OAAO,MAAa,IAC/B;AAIF,UAAI,MAAS,OAAO,MAAa,KAAK;AACpC,QAAA,IAAiB,IACjB;AACA;AAAA,MACF;AAGA,UAAI,MAAS,KAAK;AAChB,QAAA,IAAoB;AACpB;AAAA,MACF;AAGA,UAAI,MAAS,OAAO,MAAS,KAAK;AAChC,QAAA,IAAW;AACX;AAAA,MACF;AAGA,UAAI,MAAS,OAAO,MAAS,OAAO,MAAS,IAC3C,CAAA,EAAM,KAAK;AAAA,QAAE,MAAA;AAAA,QAAM,MAAM;AAAA,QAAS,KAAK,IAAS;AAAA,MAAE,CAAC;AAAA,eAC1C,MAAS,OAAO,MAAS,OAAO,MAAS,KAAK;AACvD,cAAM,IAAW,EAAS,CAAA;AAC1B,YAAI,EAAM,WAAW,EACnB,CAAA,EAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,QAAQ,IAAS;AAAA,UACjB,SAAS,uBAAuB,CAAA;AAAA,UAChC,UAAU;AAAA,UACV,MAAM;AAAA,QACR,CAAC;AAAA,aACI;AACL,gBAAM,IAAM,EAAM,IAAI;AACtB,UAAI,EAAI,SAAS,KACf,EAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,QAAQ,IAAS;AAAA,YACjB,SAAS,uBAAuB,CAAA,yBAA6B,EAAI,SAAS,MAAM,MAAM,EAAI,SAAS,MAAM,MAAM,GAAA,UAAa,EAAI,IAAA,eAAmB,EAAI,IAAA;AAAA,YACvJ,UAAU;AAAA,YACV,MAAM;AAAA,UACR,CAAC;AAAA,QAEL;AAAA,MACF;AAAA,IACF;AAEA,IAAI,KACF,EAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,QAAQ,EAAK,YAAY,CAAQ,IAAI;AAAA,MACrC,SAAS,yCAAyC,CAAA;AAAA,MAClD,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC,GAIC,QAAQ,KAAK,CAAI,KACnB,EAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,QAAQ,EAAK,QAAQ,MAAM,IAAI;AAAA,MAC/B,SAAS;AAAA,MACT,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAAA,EAEL;AAuBA,OArBI,KACF,EAAY,KAAK;AAAA,IACf,MAAM,EAAM;AAAA,IACZ,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,MAAM;AAAA,EACR,CAAC,GAGC,KACF,EAAY,KAAK;AAAA,IACf,MAAM,EAAM;AAAA,IACZ,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,MAAM;AAAA,EACR,CAAC,GAII,EAAM,SAAS,KAAG;AACvB,UAAM,IAAW,EAAM,IAAI;AAC3B,IAAA,EAAY,KAAK;AAAA,MACf,MAAM,EAAS;AAAA,MACf,QAAQ,EAAS;AAAA,MACjB,SAAS,6BAA6B,EAAS,IAAA;AAAA,MAC/C,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAKA,SAAgB,EAAS,GAAgC;AACvD,QAAM,IAAgC,CAAC,GACjC,IAAQ,EAAK,MAAM;AAAA,CAAI,GAGvB,IAAW,oBAAI,IAAI;AAAA,IACvB;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAM;AAAA,IAAO;AAAA,IAAS;AAAA,IAAM;AAAA,IAAO;AAAA,IACnD;AAAA,IAAQ;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAU;AAAA,IAAS;AAAA,IAAO;AAAA,EACrD,CAAC,GAEK,IAA0D,CAAC,GAG3D,IAAW;AAEjB,WAAS,IAAU,GAAG,IAAU,EAAM,QAAQ,KAAW;AACvD,UAAM,IAAU,IAAU,GACpB,IAAO,EAAM,CAAA;AAEnB,QAAI;AAEJ,SADA,EAAS,YAAY,IACb,IAAQ,EAAS,KAAK,CAAI,OAAO,QAAM;AAC7C,YAAM,IAAU,EAAM,CAAA,GAChB,KAAW,EAAM,CAAA,KAAM,IAAI,YAAY,GACvC,IAAY,EAAQ,WAAW,IAAI,GACnC,IAAgB,EAAQ,SAAS,IAAI,KAAK,EAAS,IAAI,CAAO,GAC9D,IAAM,EAAM,QAAQ;AAG1B,UAAI,EAAA,EAAQ,WAAW,KAAK,KAAK,EAAQ,WAAW,UAAU;AAI9D,YAAI;AACF,cAAI,EAAS,WAAW,EACtB,CAAA,EAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,SAAS,4BAA4B,CAAA;AAAA,YACrC,UAAU;AAAA,YACV,MAAM;AAAA,UACR,CAAC;AAAA,eACI;AACL,kBAAM,IAAO,EAAS,IAAI;AAC1B,YAAI,EAAK,SAAS,KAChB,EAAY,KAAK;AAAA,cACf,MAAM;AAAA,cACN,QAAQ;AAAA,cACR,SAAS,4BAA4B,CAAA,iBAAwB,EAAK,IAAA,qBAAyB,EAAK,IAAA;AAAA,cAChG,UAAU;AAAA,cACV,MAAM;AAAA,YACR,CAAC;AAAA,UAEL;AAAA,YACK,CAAK,KACV,EAAS,KAAK;AAAA,UAAE,MAAM;AAAA,UAAS,MAAM;AAAA,UAAS,KAAA;AAAA,QAAI,CAAC;AAAA,IAEvD;AAAA,EACF;AAGA,SAAO,EAAS,SAAS,KAAG;AAC1B,UAAM,IAAW,EAAS,IAAI;AAC9B,IAAA,EAAY,KAAK;AAAA,MACf,MAAM,EAAS;AAAA,MACf,QAAQ,EAAS;AAAA,MACjB,SAAS,iBAAiB,EAAS,IAAA;AAAA,MACnC,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAKA,SAAgB,EAAQ,GAAgC;AACtD,QAAM,IAAgC,CAAC,GACjC,IAAQ,EAAK,MAAM;AAAA,CAAI;AAC7B,MAAI,IAAa;AACjB,QAAM,IAA8C,CAAC;AAErD,WAAS,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;AACrC,UAAM,IAAU,IAAI,GACd,IAAO,EAAM,CAAA,GACb,IAAU,EAAK,KAAK;AAG1B,QAAI,GAAC,KAAW,EAAQ,WAAW,IAAI,KAAK,EAAQ,WAAW,IAAI,IAInE;AAAA,eAAS,IAAI,GAAG,IAAI,EAAK,QAAQ,IAC/B,CAAI,EAAK,CAAA,MAAO,OACd,KACA,EAAW,KAAK;AAAA,QAAE,MAAM;AAAA,QAAS,KAAK,IAAI;AAAA,MAAE,CAAC,KACpC,EAAK,CAAA,MAAO,QACjB,MAAe,IACjB,EAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,IAAI;AAAA,QACZ,SAAS;AAAA,QACT,UAAU;AAAA,QACV,MAAM;AAAA,MACR,CAAC,KAED,KACA,EAAW,IAAI;AAMrB,UAAI,IAAa,KAAK,MAAY,OAAO,MAAY,OAAO,CAAC,EAAQ,SAAS,GAAG,KAAK,CAAC,EAAQ,SAAS,GAAG,MAErG,CAAC,EAAQ,SAAS,GAAG,KAAK,CAAC,EAAQ,WAAW,GAAG,KAAK,CAAC,EAAQ,SAAS,GAAG,KAC7E,EAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS,gBAAgB,CAAA;AAAA,QACzB,UAAU;AAAA,QACV,MAAM;AAAA,MACR,CAAC,GAGC,EAAQ,SAAS,GAAG,KAAK,CAAC,EAAQ,SAAS,GAAG,KAAK,CAAC,EAAQ,SAAS,GAAG,KAAK,CAAC,EAAQ,SAAS,GAAG,IAAG;AACvG,cAAM,IAAW,EAAM,IAAI,CAAA,GAAI,KAAK,KAAK;AACzC,QAAI,KAAY,CAAC,EAAS,WAAW,GAAG,KACtC,EAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,QAAQ,EAAK;AAAA,UACb,SAAS;AAAA,UACT,UAAU;AAAA,UACV,MAAM;AAAA,QACR,CAAC;AAAA,MAEL;AAAA;AAAA,EAEJ;AAEA,SAAO,EAAW,SAAS,KAAG;AAC5B,UAAM,IAAI,EAAW,IAAI;AACzB,IAAA,EAAY,KAAK;AAAA,MACf,MAAM,EAAE;AAAA,MACR,QAAQ,EAAE;AAAA,MACV,SAAS;AAAA,MACT,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAKA,SAAgB,EAAW,GAAgC;AACzD,QAAM,IAAgC,CAAC,GACjC,IAAQ,EAAK,MAAM;AAAA,CAAI;AAC7B,MAAI,IAAY,IACZ,IAAU;AACd,QAAM,IAA8D,CAAC,GAC/D,IAAmC;AAAA,IAAE,KAAK;AAAA,IAAK,KAAK;AAAA,IAAK,KAAK;AAAA,EAAI,GAGlE,IAAgB;AAEtB,WAAS,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;AACrC,UAAM,IAAU,IAAI,GACd,IAAO,EAAM,CAAA,GACb,IAAU,EAAK,KAAK;AAE1B,QAAI,CAAC,KAAW,EAAQ,WAAW,GAAG,EAAG;AAGzC,UAAM,IAAc,EAAK,MAAM,WAAW;AAC1C,QAAI,KAAe,EAAY,CAAA,GAAI;AACjC,YAAM,IAAS,EAAY,CAAA;AAC3B,MAAI,EAAO,SAAS,GAAG,MAAG,IAAY,KAClC,EAAO,SAAS,GAAI,MAAG,IAAU,KAEjC,KAAa,KACf,EAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,UAAU;AAAA,QACV,MAAM;AAAA,MACR,CAAC;AAAA,IAEL;AAGA,IAAI,EAAc,KAAK,CAAO,KAAK,CAAC,EAAQ,SAAS,GAAG,KAAK,CAAC,EAAQ,SAAS,GAAG,KAChF,EAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,QAAQ,EAAK;AAAA,MACb,SAAS;AAAA,MACT,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAIH,QAAI,IAA0B;AAC9B,aAAS,IAAI,GAAG,IAAI,EAAK,QAAQ,KAAK;AACpC,YAAM,IAAK,EAAK,CAAA;AAChB,UAAI,MAAO,IAAK;AAChB,UAAI,GAAU;AACZ,QAAI,MAAO,KAAY,EAAK,IAAI,CAAA,MAAO,SAAM,IAAW;AACxD;AAAA,MACF;AACA,UAAI,MAAO,OAAO,MAAO,KAAK;AAC5B,QAAA,IAAW;AACX;AAAA,MACF;AAEA,UAAI,MAAO,OAAO,MAAO,OAAO,MAAO,IACrC,CAAA,EAAa,KAAK;AAAA,QAAE,MAAM;AAAA,QAAI,MAAM;AAAA,QAAS,KAAK,IAAI;AAAA,MAAE,CAAC;AAAA,eAChD,MAAO,OAAO,MAAO,OAAO,MAAO,KAAK;AACjD,cAAM,IAAW,EAAS,CAAA;AAC1B,YAAI,EAAa,WAAW,EAC1B,CAAA,EAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,QAAQ,IAAI;AAAA,UACZ,SAAS,sBAAsB,CAAA;AAAA,UAC/B,UAAU;AAAA,UACV,MAAM;AAAA,QACR,CAAC;AAAA,aACI;AACL,gBAAM,IAAM,EAAa,IAAI;AAC7B,UAAI,EAAI,SAAS,KACf,EAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,QAAQ,IAAI;AAAA,YACZ,SAAS,uBAAuB,CAAA,4BAA8B,EAAI,IAAA,eAAmB,EAAI,IAAA;AAAA,YACzF,UAAU;AAAA,YACV,MAAM;AAAA,UACR,CAAC;AAAA,QAEL;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAa,SAAS,KAAG;AAC9B,UAAM,IAAW,EAAa,IAAI;AAClC,IAAA,EAAY,KAAK;AAAA,MACf,MAAM,EAAS;AAAA,MACf,QAAQ,EAAS;AAAA,MACjB,SAAS,aAAa,EAAS,IAAA;AAAA,MAC/B,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAKA,SAAgB,EAAS,GAAgC;AACvD,QAAM,IAAgC,CAAC,GACjC,IAAQ,EAAK,MAAM;AAAA,CAAI,GAEvB,IAAoD,CAAC;AAE3D,WAAS,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;AACrC,UAAM,IAAU,IAAI,GACd,IAAO,EAAM,CAAA,GACb,IAAU,EAAK,KAAK;AAE1B,QAAI,CAAC,KAAW,EAAQ,WAAW,GAAG,EAAG;AAGzC,UAAM,IAAQ,EAAQ,MAAM,KAAK;AACjC,eAAW,KAAQ,EACjB,KAAI,MAAS,KAAM,CAAA,EAAa,KAAK;AAAA,MAAE,SAAS;AAAA,MAAM,MAAM;AAAA,IAAQ,CAAC;AAAA,aAC5D,MAAS,MAAM;AACtB,YAAM,IAAO,EAAa,IAAI;AAC9B,OAAI,CAAC,KAAQ,EAAK,YAAY,SAC5B,EAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,EAAK,QAAQ,IAAI,IAAI;AAAA,QAC7B,SAAS;AAAA,QACT,UAAU;AAAA,QACV,MAAM;AAAA,MACR,CAAC;AAAA,IAEL,WAAW,MAAS,OAAQ,CAAA,EAAa,KAAK;AAAA,MAAE,SAAS;AAAA,MAAQ,MAAM;AAAA,IAAQ,CAAC;AAAA,aACvE,MAAS,QAAQ;AACxB,YAAM,IAAO,EAAa,IAAI;AAC9B,OAAI,CAAC,KAAQ,EAAK,YAAY,WAC5B,EAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,EAAK,QAAQ,MAAM,IAAI;AAAA,QAC/B,SAAS;AAAA,QACT,UAAU;AAAA,QACV,MAAM;AAAA,MACR,CAAC;AAAA,IAEL,WAAW,MAAS,KAAM,CAAA,EAAa,KAAK;AAAA,MAAE,SAAS;AAAA,MAAM,MAAM;AAAA,IAAQ,CAAC;AAAA,aACnE,MAAS,QAAQ;AACxB,YAAM,IAAO,EAAa,IAAI;AAC9B,OAAI,CAAC,KAAQ,EAAK,YAAY,SAC5B,EAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,EAAK,QAAQ,MAAM,IAAI;AAAA,QAC/B,SAAS;AAAA,QACT,UAAU;AAAA,QACV,MAAM;AAAA,MACR,CAAC;AAAA,IAEL;AAAA,EAEJ;AAEA,SAAO,EAAa,SAAS,KAAG;AAC9B,UAAM,IAAW,EAAa,IAAI,GAC5B,IAAW,EAAS,YAAY,OAAO,OAAO,EAAS,YAAY,SAAS,SAAS;AAC3F,IAAA,EAAY,KAAK;AAAA,MACf,MAAM,EAAS;AAAA,MACf,QAAQ;AAAA,MACR,SAAS,aAAa,EAAS,OAAA,qBAA4B,CAAA;AAAA,MAC3D,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAKA,SAAgB,EAAS,GAAgC;AACvD,QAAM,IAAgC,CAAC,GACjC,IAAQ,EAAK,MAAM;AAAA,CAAI;AAE7B,WAAS,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;AACrC,UAAM,IAAU,IAAI,GACd,IAAO,EAAM,CAAA;AAGnB,KAAI,OAAO,KAAK,CAAI,KAAK,SAAS,KAAK,CAAI,MACzC,EAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAIH,UAAM,IAAU,EAAK,KAAK;AAC1B,IAAI,+BAA+B,KAAK,CAAO,KAAK,CAAC,EAAQ,WAAW,OAAO,KAAK,CAAC,EAAQ,WAAW,QAAQ,KAC9G,EAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,QAAQ,EAAK,QAAQ,GAAG,IAAI;AAAA,MAC5B,SAAS;AAAA,MACT,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAAA,EAEL;AAEA,SAAO;AACT;AAKA,SAAgB,EAAa,GAAgC;AAC3D,QAAM,IAAgC,CAAC,GACjC,IAAQ,EAAK,MAAM;AAAA,CAAI;AAC7B,MAAI,IAAiB,GACjB,IAAiB;AAErB,WAAS,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;AACrC,UAAM,IAAU,IAAI;AAIpB,IAHa,EAAM,CAAA,EACE,KAEjB,EAAQ,WAAW,KAAK,MACtB,MAAmB,KACrB,KACA,IAAiB,KAEjB;AAAA,EAGN;AAEA,SAAI,IAAiB,KACnB,EAAY,KAAK;AAAA,IACf,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,MAAM;AAAA,EACR,CAAC,GAGI;AACT;AAKA,SAAgB,EAAS,GAAc,GAAoC;AACzE,MAAI,CAAC,KAAQ,CAAC,EAAK,KAAK,EAAG,QAAO,CAAC;AAInC,WAFc,KAAY,IAAI,YAAY,EAAE,KAEpC,GAAR;AAAA,IACE,KAAK;AACH,aAAO,EAAS,CAAI;AAAA,IACtB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAe,CAAI;AAAA,IAC5B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAS,CAAI;AAAA,IACtB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAQ,CAAI;AAAA,IACrB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAW,CAAI;AAAA,IACxB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAS,CAAI;AAAA,IACtB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAS,CAAI;AAAA,IACtB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAa,CAAI;AAAA,IAC1B;AACE,aAAO,CAAC;AAAA,EACZ;AACF;ACrtBO,IAAM,IAAN,cAAqB,EAAc;AAAA;iBAOjC,KAAA,OAAA,IAMI,KAAA,WAAA,aAMK,KAAA,OAAA,IAMR,KAAA,QAAA,IAMG,KAAA,WAAA,IAMJ,KAAA,OAAA,IAMyB,KAAA,cAAA,CAAC,GAaf,KAAA,kBAAA,IAMJ,KAAA,cAAA,IAMG,KAAA,iBAAA,IAaN,KAAA,WAAA,IAMM,KAAA,iBAAA,IAML,KAAA,YAAA,IAMA,KAAA,YAAA,IAGO,KAAA,WAAA,IAGQ,KAAA,mBAAA,IAGJ,KAAA,eAAA,IAGuB,KAAA,oBAAA,CAAC,GAEa,KAAA,cAAA,MAkJ3B,KAAA,mBAAA,MAAA;AAC/B,MAAK,KAAK,SACR,KAAK,mBAAmB,GACxB,KAAK,cAAc;AAAA,IAEvB,GAEiC,KAAA,mBAAA,MAAA;AAC/B,WAAK,mBAAmB,CAAC,KAAK;AAAA,IAChC;AAAA;;AA3QyB,SAAA,SAAA,CAAC,EAAc,QAAQ,CAAU;AAAA;EAkH1D,oBAA6B;AAC3B,UAAM,kBAAkB,GACxB,KAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,uBAAgC;AAC9B,UAAM,qBAAqB,GACvB,KAAK,gBACP,aAAa,KAAK,WAAW,GAC7B,KAAK,cAAc;AAAA,EAEvB;AAAA,EAEA,WAAoB,GAAmC;AACrD,IAAI,EAAkB,IAAI,MAAM,KAAK,KAAK,OACxC,KAAK,eAAe,KAAK,OAChB,CAAC,KAAK,gBAAgB,KAAK,eAAe,KAAK,YAAY,KAAK,MACzE,KAAK,eAAe,KAAK,qBAAqB,KAAK,WAAW,IAEhE,KAAK,QAAQ;AAAA,EACf;AAAA,EAEA,qBAA6B;AAC3B,IAAI,CAAC,KAAK,QAAQ,KAAK,eAAe,KAAK,YAAY,KAAK,MAC1D,KAAK,eAAe,KAAK,qBAAqB,KAAK,WAAW,GAC9D,KAAK,QAAQ;AAAA,EAEjB;AAAA,EAKA,qBAA6B,GAAqB;AAChD,UAAM,IAAQ,EAAI,QAAQ,UAAU,EAAE,EAAE,QAAQ,aAAa,EAAE,EAAE,MAAM;AAAA,CAAI;AAC3E,QAAI,EAAM,WAAW,EAAG,QAAO;AAE/B,QAAI,IAAY;AAChB,eAAW,KAAQ,GAAO;AACxB,UAAI,EAAK,KAAK,EAAE,WAAW,EAAG;AAC9B,YAAM,IAAS,EAAK,MAAM,SAAS,IAAI,CAAA,GAAI,UAAU;AACrD,MAAI,IAAS,MAAW,IAAY;AAAA,IACtC;AAEA,WAAI,MAAc,SAAY,MAAc,IAAU,EAAM,KAAK;AAAA,CAAI,IAC9D,EAAM,IAAA,CAAI,MAAQ,EAAK,MAAM,CAAS,CAAC,EAAE,KAAK;AAAA,CAAI;AAAA,EAC3D;AAAA,EAKA,UAAmC;AACjC,UAAM,IAAa,KAAK;AACxB,QAAI,IAA6B,CAAC;AAElC,UAAM,IAAgB,GAAQ,KAAK,QAAQ,KAAK,aAAa,MAAM,IAC7D,IAAS,KAAK,gBAAgB,KAAK,QAAQ;AACjD,WAAI,KAAiB,MACnB,IAAW,EAAS,GAAQ,CAAU,IAGpC,KAAK,eAAe,KAAK,YAAY,SAAS,MAChD,IAAW,CAAC,GAAG,GAAU,GAAG,KAAK,WAAW,IAG9C,KAAK,oBAAoB,GACzB,KAAK,UAAU,iBAAiB;AAAA,MAC9B,aAAa;AAAA,MACb,SAAS,EAAS,WAAW;AAAA,IAC/B,CAAC,GACM;AAAA,EACT;AAAA,EAKA,IAAI,oBAA4B;AAC9B,WAAO,KAAK,QAAQ,KAAK,YAAY;AAAA,EACvC;AAAA,EAKA,IAAI,iBAAyB;AAC3B,WAAO,KAAK,YAAY,KAAK;AAAA,EAC/B;AAAA,EAKA,MAAa,OAAyB;AACpC,UAAM,IAAa,KAAK,gBAAgB,KAAK,QAAQ,KAAK,eAAe;AACzE,QAAI,CAAC,EAAY,QAAO;AAExB,QAAI;AACF,UAAI,UAAU,aAAa,UAAU,UAAU,UAC7C,OAAM,UAAU,UAAU,UAAU,CAAU;AAAA,WACzC;AAEL,cAAM,IAAW,SAAS,cAAc,UAAU;AAClD,QAAA,EAAS,QAAQ,GACjB,EAAS,MAAM,WAAW,SAC1B,EAAS,MAAM,UAAU,KACzB,SAAS,KAAK,YAAY,CAAQ,GAClC,EAAS,OAAO,GAChB,SAAS,YAAY,MAAM,GAC3B,SAAS,KAAK,YAAY,CAAQ;AAAA,MACpC;AAEA,kBAAK,WAAW,IAChB,KAAK,UAAU,QAAQ,EAAE,MAAM,EAAW,CAAC,GAEvC,KAAK,eAAa,aAAa,KAAK,WAAW,GACnD,KAAK,cAAc,WAAA,MAAiB;AAClC,aAAK,WAAW;AAAA,MAClB,GAAG,GAAI,GAEA;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,wBAA6C;AAC3C,UAAM,IAAM,oBAAI,IAAY;AAC5B,QAAI,CAAC,KAAK,eAAgB,QAAO;AAEjC,UAAM,IAAQ,KAAK,eAAe,MAAM,GAAG;AAC3C,eAAW,KAAQ,GAAO;AACxB,YAAM,IAAU,EAAK,KAAK;AAC1B,UAAI,EAAQ,SAAS,GAAG,GAAG;AACzB,cAAM,CAAC,GAAU,CAAA,IAAU,EAAQ,MAAM,GAAG,GACtC,IAAQ,SAAS,KAAY,IAAI,EAAE,GACnC,IAAM,SAAS,KAAU,IAAI,EAAE;AACrC,YAAI,CAAC,MAAM,CAAK,KAAK,CAAC,MAAM,CAAG,EAC7B,UAAS,IAAI,GAAO,KAAK,GAAK,IAAK,CAAA,EAAI,IAAI,CAAC;AAAA,MAEhD,OAAO;AACL,cAAM,IAAM,SAAS,GAAS,EAAE;AAChC,QAAK,MAAM,CAAG,KAAG,EAAI,IAAI,CAAG;AAAA,MAC9B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAaA,aAAqB,GAAiB;AACpC,UAAM,IAAS,KAAK,YAAY,cAAc,eAAe,CAAA,IAAW;AACxE,IAAI,KACF,EAAO,eAAe;AAAA,MAAE,UAAU;AAAA,MAAU,OAAO;AAAA,IAAS,CAAC;AAAA,EAEjE;AAAA,EAEA,SAAkB;AAChB,UAAM,IAAU,KAAK,gBAAgB,KAAK,QAAQ,IAC5C,IAAa,KAAK,mBAClB,IAAQ,KAAK,gBACb,IAAa,GAAQ,KAAS,MAAe,eAAe,KAAK,WACjE,IAAmB,KAAK,sBAAsB,GAG9C,IAAoB,oBAAI,IAA8B;AAC5D,eAAW,KAAK,KAAK,mBAAmB;AACtC,YAAM,IAAO,EAAkB,IAAI,EAAE,IAAI,KAAK,CAAC;AAC/C,MAAA,EAAK,KAAK,CAAC,GACX,EAAkB,IAAI,EAAE,MAAM,CAAI;AAAA,IACpC;AAGA,UAAM,IADQ,EAAQ,MAAM;AAAA,CACT,EAAM,QAInB,IADkB,EAAc,GAAS,CAClB,EAAgB,MAAM;AAAA,CAAI,GAEjD,IAAa,KAAK,kBAAkB,OAAA,CAAO,MAAK,EAAE,aAAa,WAAW,CAAC,EAAE,QAAQ,EAAE,QACvF,IAAe,KAAK,kBAAkB,OAAA,CAAO,MAAK,EAAE,aAAa,SAAS,EAAE,QAC5E,IAAY,KAAK,kBAAkB,SAAS;AAElD,WAAO;AAAA,0CAC+B,KAAK,YAAY,yBAAyB,KAAK,SAAA,MAAe,EAAA;AAAA;AAAA;AAAA,8BAG1E,KAAK,gBAAA;AAAA;AAAA;AAAA;AAAA,UAIzB,IAAa;AAAA;AAAA;AAAA,gBAGP,KAAc,MAAe,cAAc;AAAA,2CAChB,CAAA;AAAA,kBACzB,CAAA;AAAA,gBACF,IAAQ,gCAAmC,CAAA,YAAiB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAK5D,KAAK,YAAY,CAAC,KAAK,iBAAiB;AAAA;AAAA;AAAA,sCAGlB,KAAK,WAAW,WAAW,EAAA;AAAA,2BACtC,KAAK,IAAA;AAAA,+BACD,KAAK,WAAW,wBAAwB,wBAAA;AAAA,0BAC7C,KAAK,WAAW,YAAY,WAAA;AAAA;AAAA,kCAEpB,KAAK,WAAW,UAAU,cAAA;AAAA,0BAClC,KAAK,WAAW,YAAY,MAAA;AAAA;AAAA,kBAEpC,CAAA;AAAA;AAAA;AAAA,YAGL,KAAK,YAAY,CAAC,KAAK,iBAAiB;AAAA;AAAA;AAAA;AAAA,kCAInB,KAAK,WAAW,WAAW,EAAA;AAAA,uBACtC,KAAK,IAAA;AAAA,2BACD,KAAK,WAAW,wBAAwB,WAAA;AAAA,sBAC7C,KAAK,WAAW,YAAY,WAAA;AAAA;AAAA,8BAEpB,KAAK,WAAW,UAAU,cAAA;AAAA,sBAClC,KAAK,WAAW,YAAY,MAAA;AAAA;AAAA;AAAA,YAGtC,CAAA;AAAA;AAAA;AAAA,uCAG2B,KAAK,YAAY,eAAe,KAAK,SAAA,MAAe,EAAA;AAAA,YAC/E,KAAK,eAAe,KAAK,aAAa,cAAc,KAAK,KAAK,QAAQ,KAAK,aAAa,MAAM,KAAK,KAAK,kBAAkB,SAAS,IAAI;AAAA;AAAA,gBAEnI,MAAM,KAAK,EAAE,QAAQ,EAAW,GAAA,CAAI,GAAG,MAAQ;AAC/C,YAAM,IAAU,IAAM,GAChB,IAAQ,EAAkB,IAAI,CAAO,GACrC,IAAY,GAAO,KAAA,CAAK,MAAK,EAAE,aAAa,WAAW,CAAC,EAAE,QAAQ,KAAK,IAAQ,CAAA;AAErF,aAAO;AAAA,oDACmC,MAAA,KAAK,aAAa,CAAO,CAAA;AAAA,sBAC7D,IAAY;AAAA;AAAA,+CAEa,EAAU,YAAY,OAAA;AAAA,sCAC/B,CAAA,KAAY,EAAU,OAAA;AAAA;AAAA,wCAEpB,EAAU,aAAa,YAAY,YAAY,OAAA;AAAA;AAAA,wBAE/D,CAAA;AAAA,sBACF,KAAK,eAAe,KAAK,aAAa,cAAc,IAAI,UAAa,CAAA,YAAmB,CAAA;AAAA;AAAA;AAAA,IAGhG,CAAC,CAAA;AAAA;AAAA,cAED,CAAA;AAAA;AAAA,uBAES,EAAqB,IAAA,CAAK,GAAa,MAAQ;AAC1D,YAAM,IAAU,IAAM,GAChB,IAAgB,EAAiB,IAAI,CAAO,GAC5C,IAAQ,EAAkB,IAAI,CAAO,GACrC,IAAW,GAAO,KAAA,CAAK,MAAK,EAAE,aAAa,WAAW,CAAC,EAAE,QAAQ,GACjE,IAAa,GAAO,KAAA,CAAK,MAAK,EAAE,aAAa,SAAS,GAEtD,IAAc;AAAA,QAClB;AAAA,QACA,IAAgB,gBAAgB;AAAA,QAChC,IAAW,cAAc;AAAA,QACzB,KAAc,CAAC,IAAW,gBAAgB;AAAA,MAC5C,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,aAAO,eAAkB,CAAA,cAAyB,CAAA,IAAW,EAAW,KAAe,QAAQ,CAAA;AAAA,IACjG,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,WAIA,KAAK,QAAQ,KAAK,aAAa,MAAM,KAAK,KAAK,YAAY,SAAS,KAAK,KAAK,kBAAkB,SAAS,MAAM,KAAK,oBAAoB,KAAQ;AAAA;AAAA,sDAErG,KAAK,gBAAA;AAAA;AAAA,kBAEzC,KAAa,IAAa,IAAI;AAAA;AAAA;AAAA,4BAGpB,CAAA,IAAc,MAAe,IAAI,UAAU,QAAA;AAAA;AAAA,oBAEnD,CAAA;AAAA,kBACF,KAAa,IAAe,IAAI;AAAA;AAAA;AAAA,4BAGtB,CAAA,IAAgB,MAAiB,IAAI,YAAY,UAAA;AAAA;AAAA,oBAEzD,CAAA;AAAA,kBACD,IAKC,IALW;AAAA;AAAA;AAAA;AAAA;AAAA,iBAKX;AAAA;AAAA;AAAA,gBAGJ,IAAY;AAAA;AAAA,kCAEM,KAAK,mBAAmB,gBAAgB,aAAA;AAAA,0BAChD,KAAK,mBAAmB,gBAAgB,aAAA;AAAA;AAAA,kBAEhD,CAAA;AAAA;AAAA;AAAA,cAGJ,KAAa,KAAK,mBAAmB;AAAA;AAAA,kBAEjC,KAAK,kBAAkB,IAAA,CAAI,MAAK;AAAA;AAAA,6CAEL,EAAE,YAAY,OAAA;AAAA,6BACxB,MAAA,KAAK,aAAa,EAAE,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,oCAIvB,EAAE,aAAa,YAAY,YAAY,OAAA;AAAA;AAAA,0DAEjB,EAAE,IAAA,GAAO,EAAE,SAAS,IAAI,EAAE,MAAA,KAAW,EAAA,GAAK,EAAE,OAAO,MAAM,EAAE,IAAA,KAAS,EAAA;AAAA,qDACzE,EAAE,OAAA;AAAA;AAAA;AAAA,iBAGtC,CAAA;AAAA;AAAA,gBAED,CAAA;AAAA;AAAA,YAEJ,CAAA;AAAA;AAAA;AAAA,EAGV;AACF;AA7bG,EAAA,CAAA,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,QAAA,MAAA;AAMzB,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,YAAA,MAAA;AAMxC,EAAA,CAAA,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,QAAA,MAAA;AAMzB,EAAA,CAAA,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,SAAA,MAAA;AAMzB,EAAA,CAAA,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,YAAA,MAAA;AAMzB,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAS,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,QAAA,MAAA;AAMzC,EAAA,CAAA,EAAS,EAAE,MAAM,MAAM,CAAC,CAAA,GAAA,EAAA,WAAA,eAAA,MAAA;AAMxB,EAAA,CAAA,EAAS;AAAA,EACR,MAAM;AAAA,EACN,WAAW;AAAA,EACX,WAAW;AAAA,IACT,eAAA,CAAgB,MAAyB,MAAU,OAAO,KAAO,MAAU;AAAA,IAC3E,aAAA,CAAc,MAAmB,IAAQ,KAAK;AAAA,EAChD;AACF,CAAC,CAAA,GAAA,EAAA,WAAA,mBAAA,MAAA;AAMA,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAS,WAAW;AAAA,EAAgB,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,eAAA,MAAA;AAMpE,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAQ,WAAW;AAAkB,CAAC,CAAA,GAAA,EAAA,WAAA,kBAAA,MAAA;AAMvD,EAAA,CAAA,EAAS;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,IACT,eAAA,CAAgB,MAAyB,MAAU,OAAO,KAAO,MAAU;AAAA,IAC3E,aAAA,CAAc,MAAmB,IAAQ,KAAK;AAAA,EAChD;AACF,CAAC,CAAA,GAAA,EAAA,WAAA,YAAA,MAAA;AAMA,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAS,WAAW;AAAmB,CAAC,CAAA,GAAA,EAAA,WAAA,kBAAA,MAAA;AAMzD,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAS,WAAW;AAAA,EAAc,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,aAAA,MAAA;AAMlE,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAQ,WAAW;AAAa,CAAC,CAAA,GAAA,EAAA,WAAA,aAAA,MAAA;AAGlD,EAAA,CAAA,EAAM,CAAA,GAAA,EAAA,WAAA,YAAA,MAAA;AAGN,EAAA,CAAA,EAAM,CAAA,GAAA,EAAA,WAAA,oBAAA,MAAA;AAGN,EAAA,CAAA,EAAM,CAAA,GAAA,EAAA,WAAA,gBAAA,MAAA;AAGN,EAAA,CAAA,EAAM,CAAA,GAAA,EAAA,WAAA,qBAAA,MAAA;AA/GR,IAAA,EAAA,CAAA,EAAc,SAAS,CAAA,GAAA,CAAA;AAwcjB,IAAM,IAAN,cAA0B,EAAO;AAAC;AADxC,IAAA,EAAA,CAAA,EAAc,eAAe,CAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"code-CM6hIZNx.js","names":[],"sources":["../../src/components/code/code.css.ts","../../src/components/code/highlighter.ts","../../src/components/code/linter.ts","../../src/components/code/code.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const codeStyles = css`\n :host {\n display: block;\n box-sizing: border-box;\n font-family: 'Fira Code', 'Roboto Mono', Consolas, Monaco, 'Courier New', monospace;\n --md-code-bg: var(--md-sys-color-surface-container, #f3edf7);\n --md-code-header-bg: var(--md-sys-color-surface-container-high, #ece6f0);\n --md-code-border: var(--md-sys-color-outline-variant, #cac4d0);\n --md-code-color: var(--md-sys-color-on-surface, #1d1b20);\n --md-code-gutter-color: var(--md-sys-color-outline, #79747e);\n --md-code-gutter-bg: transparent;\n --md-code-radius: var(--md-sys-shape-corner-medium, 12px);\n --md-code-font-size: 13.5px;\n --md-code-line-height: 1.6;\n margin: 1rem 0;\n }\n\n .code-container {\n position: relative;\n display: flex;\n flex-direction: column;\n background-color: var(--md-code-bg);\n border: 1px solid var(--md-code-border);\n border-radius: var(--md-code-radius);\n overflow: hidden;\n color: var(--md-code-color);\n }\n\n /* Header Bar */\n .code-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 12px;\n background-color: var(--md-code-header-bg);\n border-bottom: 1px solid var(--md-code-border);\n min-height: 40px;\n font-size: 12.5px;\n font-weight: 500;\n user-select: none;\n }\n\n .code-header-left {\n display: flex;\n align-items: center;\n gap: 8px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .lang-badge {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n background-color: var(--md-sys-color-secondary-container, #e8def8);\n color: var(--md-sys-color-on-secondary-container, #1d192b);\n border-radius: var(--md-sys-shape-corner-full, 9999px);\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .code-filename {\n font-weight: 500;\n color: var(--md-sys-color-on-surface, #1d1b20);\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .code-header-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-left: auto;\n }\n\n /* Floating Copy Button (when header is hidden) */\n .floating-copy-btn {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 5;\n }\n\n /* Copy Button inside header or floating */\n .action-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 28px;\n padding: 0 10px;\n border: none;\n border-radius: var(--md-sys-shape-corner-small, 8px);\n background-color: transparent;\n color: var(--md-sys-color-on-surface-variant, #49454f);\n font-family: var(--md-sys-typescale-font-family, 'Roboto', sans-serif);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background-color 150ms ease, color 150ms ease;\n outline: none;\n }\n\n .action-btn:hover {\n background-color: var(--md-sys-color-surface-container-highest, #e6e0e9);\n color: var(--md-sys-color-on-surface, #1d1b20);\n }\n\n .action-btn:active {\n background-color: var(--md-sys-color-secondary-container, #e8def8);\n }\n\n .action-btn.copied {\n color: var(--md-sys-color-primary, #6750a4);\n background-color: var(--md-sys-color-primary-container, #eaddff);\n }\n\n .action-btn md-icon {\n --md-icon-size: 16px;\n }\n\n /* Code Viewport & Scroll Area */\n .code-body {\n position: relative;\n display: flex;\n overflow-x: auto;\n overflow-y: auto;\n font-size: var(--md-code-font-size);\n line-height: var(--md-code-line-height);\n }\n\n pre {\n margin: 0;\n padding: 12px 16px;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n tab-size: 2;\n flex-grow: 1;\n overflow: visible;\n }\n\n code {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n display: block;\n }\n\n :host([wrap-lines]) pre {\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n :host(:not([wrap-lines])) pre {\n white-space: pre;\n }\n\n /* Line Structure */\n .code-line {\n display: block;\n padding: 0 4px;\n border-radius: 2px;\n }\n\n .code-line.highlighted {\n background-color: rgba(103, 80, 164, 0.12);\n }\n\n .code-line.has-error {\n background-color: rgba(179, 38, 30, 0.14);\n }\n\n .code-line.has-warning {\n background-color: rgba(230, 81, 0, 0.12);\n }\n\n /* Gutter & Line Numbers */\n .code-gutter {\n display: flex;\n flex-direction: column;\n padding: 12px 0 12px 10px;\n user-select: none;\n background-color: var(--md-code-gutter-bg);\n border-right: 1px solid var(--md-code-border);\n flex-shrink: 0;\n min-width: 44px;\n box-sizing: border-box;\n }\n\n .gutter-line {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 4px;\n height: calc(var(--md-code-font-size) * var(--md-code-line-height));\n padding-right: 8px;\n color: var(--md-code-gutter-color);\n font-size: 11.5px;\n }\n\n .gutter-marker {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n cursor: pointer;\n }\n\n .gutter-marker.error {\n color: var(--md-sys-color-error, #b3261e);\n }\n\n .gutter-marker.warning {\n color: #e65100;\n }\n\n .gutter-marker.info {\n color: var(--md-sys-color-primary, #6750a4);\n }\n\n .gutter-marker md-icon {\n --md-icon-size: 14px;\n }\n\n /* Lint Status Footer Bar */\n .lint-footer {\n display: flex;\n flex-direction: column;\n background-color: var(--md-code-header-bg);\n border-top: 1px solid var(--md-code-border);\n font-size: 12px;\n font-family: var(--md-sys-typescale-font-family, 'Roboto', sans-serif);\n }\n\n .lint-footer-summary {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 12px;\n cursor: pointer;\n user-select: none;\n }\n\n .lint-footer-summary:hover {\n background-color: var(--md-sys-color-surface-container-highest, #e6e0e9);\n }\n\n .lint-counts {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .lint-count-item {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-weight: 500;\n }\n\n .lint-count-item.errors {\n color: var(--md-sys-color-error, #b3261e);\n }\n\n .lint-count-item.warnings {\n color: #e65100;\n }\n\n .lint-count-item.valid {\n color: #2e7d32;\n }\n\n .lint-count-item md-icon {\n --md-icon-size: 15px;\n }\n\n .lint-issues-list {\n display: flex;\n flex-direction: column;\n max-height: 160px;\n overflow-y: auto;\n border-top: 1px solid var(--md-code-border);\n background-color: var(--md-code-bg);\n }\n\n .lint-issue-item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 6px 12px;\n border-bottom: 1px solid var(--md-code-border);\n cursor: pointer;\n transition: background-color 100ms ease;\n }\n\n .lint-issue-item:last-child {\n border-bottom: none;\n }\n\n .lint-issue-item:hover {\n background-color: var(--md-sys-color-surface-container-highest, #e6e0e9);\n }\n\n .lint-issue-item.error md-icon {\n color: var(--md-sys-color-error, #b3261e);\n --md-icon-size: 16px;\n }\n\n .lint-issue-item.warning md-icon {\n color: #e65100;\n --md-icon-size: 16px;\n }\n\n .lint-issue-item.info md-icon {\n color: var(--md-sys-color-primary, #6750a4);\n --md-icon-size: 16px;\n }\n\n .lint-issue-content {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex-grow: 1;\n }\n\n .lint-issue-loc {\n font-weight: 600;\n font-size: 11px;\n color: var(--md-sys-color-outline, #79747e);\n }\n\n .lint-issue-msg {\n font-size: 12px;\n color: var(--md-sys-color-on-surface, #1d1b20);\n }\n\n /* --- Syntax Highlighting Colors (MD3 Color Scheme Aware) --- */\n .token-keyword {\n color: var(--md-code-token-keyword, var(--md-sys-color-primary, #6750a4));\n font-weight: 600;\n }\n\n .token-string {\n color: var(--md-code-token-string, #198754);\n }\n\n .token-comment {\n color: var(--md-code-token-comment, var(--md-sys-color-outline, #79747e));\n font-style: italic;\n }\n\n .token-function {\n color: var(--md-code-token-function, var(--md-sys-color-tertiary, #7d5260));\n font-weight: 500;\n }\n\n .token-number {\n color: var(--md-code-token-number, #b35900);\n }\n\n .token-boolean {\n color: var(--md-code-token-boolean, #d9381e);\n font-weight: 600;\n }\n\n .token-constant {\n color: var(--md-code-token-constant, #b3261e);\n font-weight: 600;\n }\n\n .token-tag {\n color: var(--md-code-token-tag, var(--md-sys-color-primary, #6750a4));\n font-weight: 600;\n }\n\n .token-attr-name {\n color: var(--md-code-token-attr-name, var(--md-sys-color-secondary, #625b71));\n }\n\n .token-property {\n color: var(--md-code-token-property, var(--md-sys-color-primary, #6750a4));\n }\n\n .token-type {\n color: var(--md-code-token-type, #00838f);\n font-weight: 500;\n }\n\n .token-variable {\n color: var(--md-code-token-variable, #e65100);\n }\n\n .token-operator {\n color: var(--md-code-token-operator, var(--md-sys-color-on-surface-variant, #49454f));\n }\n\n .token-punctuation {\n color: var(--md-code-token-punctuation, var(--md-sys-color-outline, #79747e));\n }\n\n /* Dark Theme Adjustments */\n :host-context([data-theme='dark']) .token-string,\n :host([data-theme='dark']) .token-string {\n color: #4ade80;\n }\n\n :host-context([data-theme='dark']) .token-number,\n :host([data-theme='dark']) .token-number {\n color: #fb923c;\n }\n\n :host-context([data-theme='dark']) .token-type,\n :host([data-theme='dark']) .token-type {\n color: #38bdf8;\n }\n\n :host-context([data-theme='dark']) .token-boolean,\n :host([data-theme='dark']) .token-boolean {\n color: #f87171;\n }\n`;\n\n","/**\n * Lightweight, robust syntax highlighter for common programming and markup languages.\n */\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n\nfunction span(cls: string, content: string): string {\n return `<span class=\"token-${cls}\">${content}</span>`;\n}\n\n/**\n * Tokenize and highlight JavaScript / TypeScript.\n */\nfunction highlightJs(code: string): string {\n const keywords = new Set([\n 'abstract', 'any', 'as', 'async', 'await', 'boolean', 'break', 'case', 'catch', 'class',\n 'const', 'constructor', 'continue', 'debugger', 'declare', 'default', 'delete', 'do',\n 'else', 'enum', 'export', 'extends', 'false', 'finally', 'for', 'from', 'function',\n 'get', 'if', 'implements', 'import', 'in', 'infer', 'instanceof', 'interface', 'is',\n 'keyof', 'let', 'module', 'namespace', 'never', 'new', 'null', 'number', 'of', 'override',\n 'package', 'private', 'protected', 'public', 'readonly', 'require', 'return', 'set',\n 'static', 'string', 'super', 'switch', 'symbol', 'this', 'throw', 'true', 'try', 'type',\n 'typeof', 'undefined', 'unique', 'unknown', 'var', 'void', 'while', 'with', 'yield'\n ]);\n\n let result = '';\n let i = 0;\n const n = code.length;\n\n while (i < n) {\n // Single-line comment\n if (code[i] === '/' && code[i + 1] === '/') {\n let end = code.indexOf('\\n', i);\n if (end === -1) end = n;\n result += span('comment', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Multi-line comment\n if (code[i] === '/' && code[i + 1] === '*') {\n let end = code.indexOf('*/', i + 2);\n if (end === -1) end = n;\n else end += 2;\n result += span('comment', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Template string\n if (code[i] === '`') {\n let end = i + 1;\n while (end < n && code[end] !== '`') {\n if (code[end] === '\\\\') end++;\n end++;\n }\n if (end < n) end++;\n result += span('string', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Single/double quote string\n if (code[i] === '\"' || code[i] === \"'\") {\n const q = code[i]!;\n let end = i + 1;\n while (end < n && code[end] !== q && code[end] !== '\\n') {\n if (code[end] === '\\\\') end++;\n end++;\n }\n if (end < n && code[end] === q) end++;\n result += span('string', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Numbers\n if (/[0-9]/.test(code[i]!) || (code[i] === '.' && /[0-9]/.test(code[i + 1] || ''))) {\n let end = i;\n while (end < n && /[0-9a-fA-FxXbBoOeE_.]/.test(code[end]!)) {\n end++;\n }\n result += span('number', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Identifiers & Keywords\n if (/[a-zA-Z_$]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[a-zA-Z0-9_$]/.test(code[end]!)) {\n end++;\n }\n const word = code.slice(i, end);\n // Check if followed by ( -> function call / definition\n let peek = end;\n while (peek < n && /\\s/.test(code[peek]!)) peek++;\n const isFunction = code[peek] === '(';\n\n if (word === 'true' || word === 'false') {\n result += span('boolean', escapeHtml(word));\n } else if (word === 'null' || word === 'undefined') {\n result += span('constant', escapeHtml(word));\n } else if (keywords.has(word)) {\n result += span('keyword', escapeHtml(word));\n } else if (/^[A-Z][a-zA-Z0-9_$]*$/.test(word) && !isFunction) {\n result += span('type', escapeHtml(word));\n } else if (isFunction) {\n result += span('function', escapeHtml(word));\n } else {\n result += escapeHtml(word);\n }\n i = end;\n continue;\n }\n\n // Operators\n if (/[+\\-*/%=&|<>!^~?:.]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[+\\-*/%=&|<>!^~?:.]/.test(code[end]!)) {\n end++;\n }\n result += span('operator', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Punctuation\n if (/[{}()[\\];,]/.test(code[i]!)) {\n result += span('punctuation', escapeHtml(code[i]!));\n i++;\n continue;\n }\n\n result += escapeHtml(code[i]!);\n i++;\n }\n\n return result;\n}\n\n/**\n * Tokenize and highlight HTML / XML / SVG.\n */\nfunction highlightHtml(code: string): string {\n let result = '';\n let i = 0;\n const n = code.length;\n\n while (i < n) {\n // Comment <!-- ... -->\n if (code.slice(i, i + 4) === '<!--') {\n let end = code.indexOf('-->', i + 4);\n if (end === -1) end = n;\n else end += 3;\n result += span('comment', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Tag <tag ...> or </tag>\n if (code[i] === '<') {\n let end = code.indexOf('>', i);\n if (end === -1) end = n;\n else end += 1;\n\n const tagContent = code.slice(i, end);\n // Highlight tag internals\n const tagMatch = tagContent.match(/^<\\/?([a-zA-Z0-9\\-:]+)/);\n if (tagMatch && tagMatch[1]) {\n let tagRes = span('punctuation', escapeHtml(tagContent.startsWith('</') ? '</' : '<'));\n tagRes += span('tag', escapeHtml(tagMatch[1]));\n\n let rest = tagContent.slice(tagMatch[0].length);\n // Process attributes in rest\n const attrRegex = /([a-zA-Z0-9\\-:@?]+)(\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+))?/g;\n let lastIdx = 0;\n let attrMatch: RegExpExecArray | null;\n\n while ((attrMatch = attrRegex.exec(rest)) !== null) {\n const matchedAttr = attrMatch[0];\n const attrName = attrMatch[1]!;\n const attrVal = attrMatch[2];\n\n // Text before attribute\n tagRes += escapeHtml(rest.slice(lastIdx, attrMatch.index));\n\n tagRes += span('attr-name', escapeHtml(attrName));\n if (attrVal) {\n const eqIdx = attrVal.indexOf('=');\n tagRes += span('operator', '=');\n const valStr = attrVal.slice(eqIdx + 1).trim();\n tagRes += span('string', escapeHtml(valStr));\n }\n lastIdx = attrRegex.lastIndex;\n }\n\n const trailing = rest.slice(lastIdx);\n if (trailing.endsWith('/>')) {\n tagRes += escapeHtml(trailing.slice(0, -2)) + span('punctuation', '/&gt;');\n } else if (trailing.endsWith('>')) {\n tagRes += escapeHtml(trailing.slice(0, -1)) + span('punctuation', '&gt;');\n } else {\n tagRes += escapeHtml(trailing);\n }\n result += tagRes;\n } else {\n result += escapeHtml(tagContent);\n }\n i = end;\n continue;\n }\n\n result += escapeHtml(code[i]!);\n i++;\n }\n\n return result;\n}\n\n/**\n * Tokenize and highlight CSS / SCSS.\n */\nfunction highlightCss(code: string): string {\n let result = '';\n let i = 0;\n const n = code.length;\n let inBlock = false;\n\n while (i < n) {\n // Comment /* ... */\n if (code[i] === '/' && code[i + 1] === '*') {\n let end = code.indexOf('*/', i + 2);\n if (end === -1) end = n;\n else end += 2;\n result += span('comment', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Strings\n if (code[i] === '\"' || code[i] === \"'\") {\n const q = code[i]!;\n let end = i + 1;\n while (end < n && code[end] !== q && code[end] !== '\\n') end++;\n if (end < n && code[end] === q) end++;\n result += span('string', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Braces\n if (code[i] === '{') {\n inBlock = true;\n result += span('punctuation', '{');\n i++;\n continue;\n }\n if (code[i] === '}') {\n inBlock = false;\n result += span('punctuation', '}');\n i++;\n continue;\n }\n\n // Property name inside block\n if (inBlock && /[a-zA-Z-]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[a-zA-Z0-9_-]/.test(code[end]!)) end++;\n const name = code.slice(i, end);\n\n let peek = end;\n while (peek < n && /\\s/.test(code[peek]!)) peek++;\n if (code[peek] === ':') {\n result += span('property', escapeHtml(name));\n result += escapeHtml(code.slice(end, peek));\n result += span('punctuation', ':');\n i = peek + 1;\n continue;\n }\n }\n\n // Numbers & Units\n if (/[0-9]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[0-9a-zA-Z%.]/.test(code[end]!)) end++;\n result += span('number', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Color hex #fff\n if (code[i] === '#' && /[0-9a-fA-F]/.test(code[i + 1] || '')) {\n let end = i + 1;\n while (end < n && /[0-9a-fA-F]/.test(code[end]!)) end++;\n result += span('number', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Punctuation\n if (/[;:(),]/.test(code[i]!)) {\n result += span('punctuation', escapeHtml(code[i]!));\n i++;\n continue;\n }\n\n result += escapeHtml(code[i]!);\n i++;\n }\n\n return result;\n}\n\n/**\n * Tokenize and highlight JSON.\n */\nfunction highlightJson(code: string): string {\n let result = '';\n let i = 0;\n const n = code.length;\n\n while (i < n) {\n // Strings\n if (code[i] === '\"') {\n let end = i + 1;\n while (end < n && code[end] !== '\"') {\n if (code[end] === '\\\\') end++;\n end++;\n }\n if (end < n) end++;\n const str = code.slice(i, end);\n\n // Check if it's a key (followed by colon)\n let peek = end;\n while (peek < n && /\\s/.test(code[peek]!)) peek++;\n if (code[peek] === ':') {\n result += span('property', escapeHtml(str));\n } else {\n result += span('string', escapeHtml(str));\n }\n i = end;\n continue;\n }\n\n // Numbers\n if (/[0-9-]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[0-9.eE+-]/.test(code[end]!)) end++;\n result += span('number', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Keywords / Booleans\n if (/[a-zA-Z]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[a-zA-Z]/.test(code[end]!)) end++;\n const word = code.slice(i, end);\n if (word === 'true' || word === 'false') {\n result += span('boolean', escapeHtml(word));\n } else if (word === 'null') {\n result += span('constant', escapeHtml(word));\n } else {\n result += escapeHtml(word);\n }\n i = end;\n continue;\n }\n\n // Punctuation\n if (/[{}[\\]:,]/.test(code[i]!)) {\n result += span('punctuation', escapeHtml(code[i]!));\n i++;\n continue;\n }\n\n result += escapeHtml(code[i]!);\n i++;\n }\n\n return result;\n}\n\n/**\n * Tokenize and highlight Python.\n */\nfunction highlightPython(code: string): string {\n const keywords = new Set([\n 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del',\n 'elif', 'else', 'except', 'False', 'finally', 'for', 'from', 'global', 'if', 'import',\n 'in', 'is', 'lambda', 'None', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return',\n 'True', 'try', 'while', 'with', 'yield', 'self'\n ]);\n\n let result = '';\n let i = 0;\n const n = code.length;\n\n while (i < n) {\n // Comment\n if (code[i] === '#') {\n let end = code.indexOf('\\n', i);\n if (end === -1) end = n;\n result += span('comment', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Triple quotes\n if (code.slice(i, i + 3) === '\"\"\"' || code.slice(i, i + 3) === \"'''\") {\n const q = code.slice(i, i + 3);\n let end = code.indexOf(q, i + 3);\n if (end === -1) end = n;\n else end += 3;\n result += span('string', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Single / Double quotes\n if (code[i] === '\"' || code[i] === \"'\") {\n const q = code[i]!;\n let end = i + 1;\n while (end < n && code[end] !== q && code[end] !== '\\n') {\n if (code[end] === '\\\\') end++;\n end++;\n }\n if (end < n && code[end] === q) end++;\n result += span('string', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Numbers\n if (/[0-9]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[0-9a-fA-FxXbBoOeE_.]/.test(code[end]!)) end++;\n result += span('number', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Identifiers & Keywords\n if (/[a-zA-Z_]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[a-zA-Z0-9_]/.test(code[end]!)) end++;\n const word = code.slice(i, end);\n\n let peek = end;\n while (peek < n && /\\s/.test(code[peek]!)) peek++;\n const isFunction = code[peek] === '(';\n\n if (word === 'True' || word === 'False') {\n result += span('boolean', escapeHtml(word));\n } else if (word === 'None') {\n result += span('constant', escapeHtml(word));\n } else if (keywords.has(word)) {\n result += span('keyword', escapeHtml(word));\n } else if (isFunction) {\n result += span('function', escapeHtml(word));\n } else if (/^[A-Z][a-zA-Z0-9_]*$/.test(word)) {\n result += span('type', escapeHtml(word));\n } else {\n result += escapeHtml(word);\n }\n i = end;\n continue;\n }\n\n // Operators\n if (/[+\\-*/%=&|<>!^~@:]/.test(code[i]!)) {\n result += span('operator', escapeHtml(code[i]!));\n i++;\n continue;\n }\n\n // Punctuation\n if (/[{}()[\\];,.]/.test(code[i]!)) {\n result += span('punctuation', escapeHtml(code[i]!));\n i++;\n continue;\n }\n\n result += escapeHtml(code[i]!);\n i++;\n }\n\n return result;\n}\n\n/**\n * Tokenize and highlight Bash / Shell scripts.\n */\nfunction highlightBash(code: string): string {\n const keywords = new Set([\n 'case', 'do', 'done', 'elif', 'else', 'esac', 'export', 'fi', 'for', 'function',\n 'if', 'in', 'return', 'select', 'then', 'time', 'until', 'while', 'sudo', 'echo',\n 'cd', 'mkdir', 'rm', 'cp', 'mv', 'npm', 'npx', 'node', 'git', 'yarn', 'pnpm'\n ]);\n\n let result = '';\n let i = 0;\n const n = code.length;\n\n while (i < n) {\n // Comment\n if (code[i] === '#') {\n let end = code.indexOf('\\n', i);\n if (end === -1) end = n;\n result += span('comment', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // String\n if (code[i] === '\"' || code[i] === \"'\") {\n const q = code[i]!;\n let end = i + 1;\n while (end < n && code[end] !== q && code[end] !== '\\n') {\n if (code[end] === '\\\\') end++;\n end++;\n }\n if (end < n && code[end] === q) end++;\n result += span('string', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Variable expansion $VAR, ${VAR}, $(CMD)\n if (code[i] === '$') {\n let end = i + 1;\n if (code[end] === '{') {\n end = code.indexOf('}', end);\n if (end === -1) end = n;\n else end += 1;\n } else if (code[end] === '(') {\n end = code.indexOf(')', end);\n if (end === -1) end = n;\n else end += 1;\n } else {\n while (end < n && /[a-zA-Z0-9_]/.test(code[end]!)) end++;\n }\n result += span('variable', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Flags -f, --flag\n if (code[i] === '-' && /[a-zA-Z-]/.test(code[i + 1] || '')) {\n let end = i + 1;\n while (end < n && /[a-zA-Z0-9_-]/.test(code[end]!)) end++;\n result += span('attr-name', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Identifiers & Keywords\n if (/[a-zA-Z0-9_]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[a-zA-Z0-9_\\-./]/.test(code[end]!)) end++;\n const word = code.slice(i, end);\n if (keywords.has(word)) {\n result += span('keyword', escapeHtml(word));\n } else {\n result += escapeHtml(word);\n }\n i = end;\n continue;\n }\n\n // Operators\n if (/[|&><=;]/.test(code[i]!)) {\n result += span('operator', escapeHtml(code[i]!));\n i++;\n continue;\n }\n\n result += escapeHtml(code[i]!);\n i++;\n }\n\n return result;\n}\n\n/**\n * Tokenize and highlight SQL.\n */\nfunction highlightSql(code: string): string {\n const keywords = new Set([\n 'SELECT', 'FROM', 'WHERE', 'INSERT', 'INTO', 'VALUES', 'UPDATE', 'SET', 'DELETE',\n 'CREATE', 'TABLE', 'DROP', 'ALTER', 'JOIN', 'LEFT', 'RIGHT', 'INNER', 'OUTER', 'FULL',\n 'ON', 'GROUP', 'BY', 'ORDER', 'HAVING', 'LIMIT', 'OFFSET', 'UNION', 'ALL', 'AS',\n 'DISTINCT', 'COUNT', 'SUM', 'AVG', 'MIN', 'MAX', 'AND', 'OR', 'NOT', 'IN', 'IS',\n 'NULL', 'LIKE', 'BETWEEN', 'EXISTS', 'CASE', 'WHEN', 'THEN', 'ELSE', 'END', 'PRIMARY',\n 'KEY', 'FOREIGN', 'REFERENCES', 'INDEX', 'DEFAULT', 'CHECK', 'CONSTRAINT'\n ]);\n\n let result = '';\n let i = 0;\n const n = code.length;\n\n while (i < n) {\n // Comment -- ...\n if (code[i] === '-' && code[i + 1] === '-') {\n let end = code.indexOf('\\n', i);\n if (end === -1) end = n;\n result += span('comment', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // String\n if (code[i] === \"'\" || code[i] === '\"') {\n const q = code[i]!;\n let end = i + 1;\n while (end < n && code[end] !== q && code[end] !== '\\n') end++;\n if (end < n && code[end] === q) end++;\n result += span('string', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Identifiers & Keywords\n if (/[a-zA-Z_]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[a-zA-Z0-9_]/.test(code[end]!)) end++;\n const word = code.slice(i, end);\n if (keywords.has(word.toUpperCase())) {\n result += span('keyword', escapeHtml(word));\n } else {\n result += escapeHtml(word);\n }\n i = end;\n continue;\n }\n\n // Numbers\n if (/[0-9]/.test(code[i]!)) {\n let end = i;\n while (end < n && /[0-9.]/.test(code[end]!)) end++;\n result += span('number', escapeHtml(code.slice(i, end)));\n i = end;\n continue;\n }\n\n // Operators & Punctuation\n if (/[=<>!+*/-]/.test(code[i]!)) {\n result += span('operator', escapeHtml(code[i]!));\n i++;\n continue;\n }\n\n if (/[(),;]/.test(code[i]!)) {\n result += span('punctuation', escapeHtml(code[i]!));\n i++;\n continue;\n }\n\n result += escapeHtml(code[i]!);\n i++;\n }\n\n return result;\n}\n\n/**\n * Main syntax highlight dispatcher.\n */\nexport function highlightCode(code: string, language: string): string {\n if (!code) return '';\n\n const lang = (language || '').toLowerCase().trim();\n\n switch (lang) {\n case 'javascript':\n case 'js':\n case 'typescript':\n case 'ts':\n case 'jsx':\n case 'tsx':\n return highlightJs(code);\n case 'html':\n case 'xml':\n case 'svg':\n return highlightHtml(code);\n case 'css':\n case 'scss':\n case 'less':\n return highlightCss(code);\n case 'json':\n return highlightJson(code);\n case 'python':\n case 'py':\n return highlightPython(code);\n case 'bash':\n case 'sh':\n case 'shell':\n case 'zsh':\n return highlightBash(code);\n case 'sql':\n return highlightSql(code);\n default:\n return escapeHtml(code);\n }\n}\n\n","export interface LintDiagnostic {\n line: number; // 1-indexed\n column?: number; // 1-indexed\n message: string;\n severity?: 'error' | 'warning' | 'info';\n rule?: string;\n}\n\n/**\n * Lints JSON code and returns diagnostics for syntax errors, trailing commas, unquoted keys, etc.\n */\nexport function lintJson(code: string): LintDiagnostic[] {\n const diagnostics: LintDiagnostic[] = [];\n const trimmed = code.trim();\n if (!trimmed) return diagnostics;\n\n // 1. Try standard JSON.parse first\n try {\n JSON.parse(code);\n return diagnostics;\n } catch (err: unknown) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n \n // Attempt to extract position from error message (e.g. \"at position 42\" or \"line 3 column 5\")\n let line = 1;\n let column = 1;\n\n const posMatch = errorMsg.match(/at position (\\d+)/i);\n const lineColMatch = errorMsg.match(/line (\\d+) column (\\d+)/i);\n\n if (lineColMatch && lineColMatch[1] && lineColMatch[2]) {\n line = parseInt(lineColMatch[1], 10);\n column = parseInt(lineColMatch[2], 10);\n } else if (posMatch && posMatch[1]) {\n const pos = parseInt(posMatch[1], 10);\n const lines = code.slice(0, pos).split('\\n');\n line = lines.length;\n column = (lines[lines.length - 1]?.length || 0) + 1;\n } else {\n // Heuristic syntax analysis for specific common errors\n const lines = code.split('\\n');\n let found = false;\n\n for (let i = 0; i < lines.length; i++) {\n const lineContent = lines[i]!;\n // Single quotes check\n if (/'[^']*'/.test(lineContent)) {\n diagnostics.push({\n line: i + 1,\n column: lineContent.indexOf(\"'\") + 1,\n message: 'JSON strings must use double quotes, not single quotes',\n severity: 'error',\n rule: 'json-no-single-quotes',\n });\n found = true;\n break;\n }\n // Trailing comma before } or ]\n if (/,\\s*([}\\]])/.test(lineContent)) {\n diagnostics.push({\n line: i + 1,\n column: lineContent.search(/,\\s*([}\\]])/) + 1,\n message: 'Trailing comma is not allowed in standard JSON',\n severity: 'error',\n rule: 'json-no-trailing-comma',\n });\n found = true;\n break;\n }\n // Comments in JSON\n if (/\\/\\//.test(lineContent) || /\\/\\*/.test(lineContent)) {\n diagnostics.push({\n line: i + 1,\n column: lineContent.search(/\\/\\/|\\/\\*/) + 1,\n message: 'Comments are not permitted in standard JSON',\n severity: 'warning',\n rule: 'json-no-comments',\n });\n found = true;\n break;\n }\n // Unquoted key check e.g. { name: \"val\" }\n const unquotedKey = lineContent.match(/([{,]\\s*)([a-zA-Z0-9_$]+)\\s*:/);\n if (unquotedKey && unquotedKey[1] && unquotedKey[2]) {\n diagnostics.push({\n line: i + 1,\n column: lineContent.indexOf(unquotedKey[2]) + 1,\n message: `Key \"${unquotedKey[2]}\" must be enclosed in double quotes`,\n severity: 'error',\n rule: 'json-unquoted-key',\n });\n found = true;\n break;\n }\n }\n\n if (found) return diagnostics;\n }\n\n // Format cleaner error message\n let cleanMessage = errorMsg.replace(/^JSON\\.parse:\\s*/i, '').replace(/in JSON at position \\d+/i, '').trim();\n if (!cleanMessage) cleanMessage = 'Invalid JSON syntax';\n\n diagnostics.push({\n line,\n column,\n message: cleanMessage,\n severity: 'error',\n rule: 'json-syntax-error',\n });\n }\n\n return diagnostics;\n}\n\n/**\n * Lints JavaScript and TypeScript code for common syntax issues.\n */\nexport function lintJavaScript(code: string): LintDiagnostic[] {\n const diagnostics: LintDiagnostic[] = [];\n const lines = code.split('\\n');\n\n // Track balanced bracket stacks with line/column\n const stack: { char: string; line: number; col: number }[] = [];\n const matchMap: Record<string, string> = { '}': '{', ')': '(', ']': '[' };\n let inMultiComment = false;\n let inTemplateLiteral = false;\n\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n const lineNum = lineIdx + 1;\n const line = lines[lineIdx]!;\n let inString: string | null = null;\n let isEscaped = false;\n\n for (let colIdx = 0; colIdx < line.length; colIdx++) {\n const char = line[colIdx]!;\n const nextChar = line[colIdx + 1] || '';\n\n // Check multiline comment\n if (inMultiComment) {\n if (char === '*' && nextChar === '/') {\n inMultiComment = false;\n colIdx++;\n }\n continue;\n }\n\n // Check template literal\n if (inTemplateLiteral) {\n if (char === '\\\\') {\n colIdx++;\n continue;\n }\n if (char === '`') {\n inTemplateLiteral = false;\n }\n continue;\n }\n\n // String handling\n if (inString) {\n if (isEscaped) {\n isEscaped = false;\n } else if (char === '\\\\') {\n isEscaped = true;\n } else if (char === inString) {\n inString = null;\n }\n continue;\n }\n\n // Single-line comment\n if (char === '/' && nextChar === '/') {\n break;\n }\n\n // Start multi-line comment\n if (char === '/' && nextChar === '*') {\n inMultiComment = true;\n colIdx++;\n continue;\n }\n\n // Start template string\n if (char === '`') {\n inTemplateLiteral = true;\n continue;\n }\n\n // Start single or double quote string\n if (char === '\"' || char === \"'\") {\n inString = char;\n continue;\n }\n\n // Brackets\n if (char === '{' || char === '(' || char === '[') {\n stack.push({ char, line: lineNum, col: colIdx + 1 });\n } else if (char === '}' || char === ')' || char === ']') {\n const expected = matchMap[char];\n if (stack.length === 0) {\n diagnostics.push({\n line: lineNum,\n column: colIdx + 1,\n message: `Unexpected closing '${char}' with no matching opening bracket`,\n severity: 'error',\n rule: 'js-unmatched-bracket',\n });\n } else {\n const top = stack.pop()!;\n if (top.char !== expected) {\n diagnostics.push({\n line: lineNum,\n column: colIdx + 1,\n message: `Mismatched closing '${char}', expected matching '${top.char === '{' ? '}' : top.char === '(' ? ')' : ']'}' for '${top.char}' from line ${top.line}`,\n severity: 'error',\n rule: 'js-mismatched-bracket',\n });\n }\n }\n }\n }\n\n if (inString) {\n diagnostics.push({\n line: lineNum,\n column: line.lastIndexOf(inString) + 1,\n message: `Unclosed string literal starting with ${inString}`,\n severity: 'error',\n rule: 'js-unclosed-string',\n });\n }\n\n // Common JS checks: consecutive comparison operators\n if (/====+/.test(line)) {\n diagnostics.push({\n line: lineNum,\n column: line.indexOf('====') + 1,\n message: 'Invalid equality operator: \"====\"',\n severity: 'error',\n rule: 'js-invalid-operator',\n });\n }\n }\n\n if (inMultiComment) {\n diagnostics.push({\n line: lines.length,\n column: 1,\n message: 'Unclosed multi-line comment \"/*\"',\n severity: 'error',\n rule: 'js-unclosed-comment',\n });\n }\n\n if (inTemplateLiteral) {\n diagnostics.push({\n line: lines.length,\n column: 1,\n message: 'Unclosed template literal (`...`)',\n severity: 'error',\n rule: 'js-unclosed-template',\n });\n }\n\n // Check remaining unclosed brackets in stack\n while (stack.length > 0) {\n const unclosed = stack.pop()!;\n diagnostics.push({\n line: unclosed.line,\n column: unclosed.col,\n message: `Unclosed opening bracket '${unclosed.char}'`,\n severity: 'error',\n rule: 'js-unclosed-bracket',\n });\n }\n\n return diagnostics;\n}\n\n/**\n * Lints HTML/XML code for unclosed or mismatched tags and attribute errors.\n */\nexport function lintHtml(code: string): LintDiagnostic[] {\n const diagnostics: LintDiagnostic[] = [];\n const lines = code.split('\\n');\n\n // Void elements that do not require closing tags in HTML5\n const voidTags = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr', '!doctype'\n ]);\n\n const tagStack: { name: string; line: number; col: number }[] = [];\n\n // Match tags like <tag ...>, </tag>, <tag />\n const tagRegex = /<\\/?([a-zA-Z0-9\\-:]+)(\\s+[^>]*?)?(\\/?)>/g;\n\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n const lineNum = lineIdx + 1;\n const line = lines[lineIdx]!;\n\n let match: RegExpExecArray | null;\n tagRegex.lastIndex = 0;\n while ((match = tagRegex.exec(line)) !== null) {\n const fullTag = match[0];\n const tagName = (match[1] || '').toLowerCase();\n const isClosing = fullTag.startsWith('</');\n const isSelfClosing = fullTag.endsWith('/>') || voidTags.has(tagName);\n const col = match.index + 1;\n\n // Check for comments or doctypes\n if (tagName.startsWith('!--') || tagName.startsWith('!doctype')) {\n continue;\n }\n\n if (isClosing) {\n if (tagStack.length === 0) {\n diagnostics.push({\n line: lineNum,\n column: col,\n message: `Unexpected closing tag </${tagName}> without matching opening tag`,\n severity: 'error',\n rule: 'html-unmatched-closing-tag',\n });\n } else {\n const last = tagStack.pop()!;\n if (last.name !== tagName) {\n diagnostics.push({\n line: lineNum,\n column: col,\n message: `Mismatched closing tag </${tagName}>, expected </${last.name}> (opened on line ${last.line})`,\n severity: 'error',\n rule: 'html-mismatched-tag',\n });\n }\n }\n } else if (!isSelfClosing) {\n tagStack.push({ name: tagName, line: lineNum, col });\n }\n }\n }\n\n // Report any remaining unclosed tags\n while (tagStack.length > 0) {\n const unclosed = tagStack.pop()!;\n diagnostics.push({\n line: unclosed.line,\n column: unclosed.col,\n message: `Unclosed tag <${unclosed.name}>`,\n severity: 'error',\n rule: 'html-unclosed-tag',\n });\n }\n\n return diagnostics;\n}\n\n/**\n * Lints CSS code for unclosed braces, missing colons, and malformed declarations.\n */\nexport function lintCss(code: string): LintDiagnostic[] {\n const diagnostics: LintDiagnostic[] = [];\n const lines = code.split('\\n');\n let openBraces = 0;\n const braceStack: { line: number; col: number }[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const lineNum = i + 1;\n const line = lines[i]!;\n const trimmed = line.trim();\n\n // Skip comments and empty lines\n if (!trimmed || trimmed.startsWith('/*') || trimmed.startsWith('//')) {\n continue;\n }\n\n for (let c = 0; c < line.length; c++) {\n if (line[c] === '{') {\n openBraces++;\n braceStack.push({ line: lineNum, col: c + 1 });\n } else if (line[c] === '}') {\n if (openBraces === 0) {\n diagnostics.push({\n line: lineNum,\n column: c + 1,\n message: 'Unexpected closing brace \"}\" without opening \"{\"',\n severity: 'error',\n rule: 'css-unmatched-brace',\n });\n } else {\n openBraces--;\n braceStack.pop();\n }\n }\n }\n\n // Inside a rule block: check property declaration syntax\n if (openBraces > 0 && trimmed !== '{' && trimmed !== '}' && !trimmed.endsWith('{') && !trimmed.endsWith('}')) {\n // Check for missing colon in property: value\n if (!trimmed.includes(':') && !trimmed.startsWith('@') && !trimmed.endsWith(',')) {\n diagnostics.push({\n line: lineNum,\n column: 1,\n message: `Declaration \"${trimmed}\" is missing a colon \":\" between property and value`,\n severity: 'warning',\n rule: 'css-missing-colon',\n });\n }\n // Check for missing semicolon if line looks like a declaration and isn't the last line of a block\n if (trimmed.includes(':') && !trimmed.endsWith(';') && !trimmed.endsWith('{') && !trimmed.endsWith('}')) {\n const nextLine = lines[i + 1]?.trim() || '';\n if (nextLine && !nextLine.startsWith('}')) {\n diagnostics.push({\n line: lineNum,\n column: line.length,\n message: 'Missing semicolon \";\" at the end of CSS declaration',\n severity: 'warning',\n rule: 'css-missing-semicolon',\n });\n }\n }\n }\n }\n\n while (braceStack.length > 0) {\n const b = braceStack.pop()!;\n diagnostics.push({\n line: b.line,\n column: b.col,\n message: 'Unclosed CSS block \"{\"',\n severity: 'error',\n rule: 'css-unclosed-brace',\n });\n }\n\n return diagnostics;\n}\n\n/**\n * Lints Python code for indentation consistency, missing colons, and bracket balance.\n */\nexport function lintPython(code: string): LintDiagnostic[] {\n const diagnostics: LintDiagnostic[] = [];\n const lines = code.split('\\n');\n let hasSpaces = false;\n let hasTabs = false;\n const bracketStack: { char: string; line: number; col: number }[] = [];\n const matchMap: Record<string, string> = { ')': '(', ']': '[', '}': '{' };\n\n // Keywords that must be followed by a colon\n const colonKeywords = /^\\s*(def\\s+.*|class\\s+.*|if\\s+.*|elif\\s+.*|else|for\\s+.*|while\\s+.*|try|except(\\s+.*)?|finally|with\\s+.*)$/;\n\n for (let i = 0; i < lines.length; i++) {\n const lineNum = i + 1;\n const line = lines[i]!;\n const trimmed = line.trim();\n\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n // Check indentation\n const indentMatch = line.match(/^([ \\t]+)/);\n if (indentMatch && indentMatch[1]) {\n const indent = indentMatch[1];\n if (indent.includes(' ')) hasSpaces = true;\n if (indent.includes('\\t')) hasTabs = true;\n\n if (hasSpaces && hasTabs) {\n diagnostics.push({\n line: lineNum,\n column: 1,\n message: 'Inconsistent indentation: mixed tabs and spaces',\n severity: 'warning',\n rule: 'python-mixed-indentation',\n });\n }\n }\n\n // Check missing colon\n if (colonKeywords.test(trimmed) && !trimmed.endsWith(':') && !trimmed.includes('#')) {\n diagnostics.push({\n line: lineNum,\n column: line.length,\n message: 'Expected \":\" at the end of statement header',\n severity: 'error',\n rule: 'python-missing-colon',\n });\n }\n\n // Check bracket balance\n let inString: string | null = null;\n for (let c = 0; c < line.length; c++) {\n const ch = line[c]!;\n if (ch === '#') break; // Comment\n if (inString) {\n if (ch === inString && line[c - 1] !== '\\\\') inString = null;\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n inString = ch;\n continue;\n }\n\n if (ch === '(' || ch === '[' || ch === '{') {\n bracketStack.push({ char: ch, line: lineNum, col: c + 1 });\n } else if (ch === ')' || ch === ']' || ch === '}') {\n const expected = matchMap[ch];\n if (bracketStack.length === 0) {\n diagnostics.push({\n line: lineNum,\n column: c + 1,\n message: `Unmatched closing '${ch}'`,\n severity: 'error',\n rule: 'python-unmatched-bracket',\n });\n } else {\n const top = bracketStack.pop()!;\n if (top.char !== expected) {\n diagnostics.push({\n line: lineNum,\n column: c + 1,\n message: `Mismatched bracket '${ch}', expected closing for '${top.char}' from line ${top.line}`,\n severity: 'error',\n rule: 'python-mismatched-bracket',\n });\n }\n }\n }\n }\n }\n\n while (bracketStack.length > 0) {\n const unclosed = bracketStack.pop()!;\n diagnostics.push({\n line: unclosed.line,\n column: unclosed.col,\n message: `Unclosed '${unclosed.char}'`,\n severity: 'error',\n rule: 'python-unclosed-bracket',\n });\n }\n\n return diagnostics;\n}\n\n/**\n * Lints Bash/Shell code for unclosed quotes, missing control block terminators (fi, done, esac).\n */\nexport function lintBash(code: string): LintDiagnostic[] {\n const diagnostics: LintDiagnostic[] = [];\n const lines = code.split('\\n');\n\n const controlStack: { keyword: string; line: number }[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const lineNum = i + 1;\n const line = lines[i]!;\n const trimmed = line.trim();\n\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n // Tokens on line\n const words = trimmed.split(/\\s+/);\n for (const word of words) {\n if (word === 'if') controlStack.push({ keyword: 'if', line: lineNum });\n else if (word === 'fi') {\n const last = controlStack.pop();\n if (!last || last.keyword !== 'if') {\n diagnostics.push({\n line: lineNum,\n column: line.indexOf('fi') + 1,\n message: 'Unexpected \"fi\" with no preceding \"if\"',\n severity: 'error',\n rule: 'bash-unmatched-fi',\n });\n }\n } else if (word === 'case') controlStack.push({ keyword: 'case', line: lineNum });\n else if (word === 'esac') {\n const last = controlStack.pop();\n if (!last || last.keyword !== 'case') {\n diagnostics.push({\n line: lineNum,\n column: line.indexOf('esac') + 1,\n message: 'Unexpected \"esac\" with no preceding \"case\"',\n severity: 'error',\n rule: 'bash-unmatched-esac',\n });\n }\n } else if (word === 'do') controlStack.push({ keyword: 'do', line: lineNum });\n else if (word === 'done') {\n const last = controlStack.pop();\n if (!last || last.keyword !== 'do') {\n diagnostics.push({\n line: lineNum,\n column: line.indexOf('done') + 1,\n message: 'Unexpected \"done\" with no preceding \"do\" / loop',\n severity: 'error',\n rule: 'bash-unmatched-done',\n });\n }\n }\n }\n }\n\n while (controlStack.length > 0) {\n const unclosed = controlStack.pop()!;\n const expected = unclosed.keyword === 'if' ? 'fi' : unclosed.keyword === 'case' ? 'esac' : 'done';\n diagnostics.push({\n line: unclosed.line,\n column: 1,\n message: `Unclosed \"${unclosed.keyword}\" block, missing \"${expected}\"`,\n severity: 'error',\n rule: 'bash-unclosed-block',\n });\n }\n\n return diagnostics;\n}\n\n/**\n * Lints YAML code for tab indentation and syntax anomalies.\n */\nexport function lintYaml(code: string): LintDiagnostic[] {\n const diagnostics: LintDiagnostic[] = [];\n const lines = code.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const lineNum = i + 1;\n const line = lines[i]!;\n\n // Check tabs in indentation\n if (/^\\t+/.test(line) || /^ +\\t+/.test(line)) {\n diagnostics.push({\n line: lineNum,\n column: 1,\n message: 'YAML forbids tab characters for indentation; use spaces instead',\n severity: 'error',\n rule: 'yaml-no-tabs',\n });\n }\n\n // Key-value without space after colon (e.g. key:value instead of key: value)\n const trimmed = line.trim();\n if (/^[a-zA-Z0-9_-]+:[^ \\t\\n\\r/#]/.test(trimmed) && !trimmed.startsWith('http:') && !trimmed.startsWith('https:')) {\n diagnostics.push({\n line: lineNum,\n column: line.indexOf(':') + 1,\n message: 'YAML mappings require a space after the colon \":\" (e.g. \"key: value\")',\n severity: 'warning',\n rule: 'yaml-missing-space',\n });\n }\n }\n\n return diagnostics;\n}\n\n/**\n * Lints Markdown code for broken links and unclosed code blocks.\n */\nexport function lintMarkdown(code: string): LintDiagnostic[] {\n const diagnostics: LintDiagnostic[] = [];\n const lines = code.split('\\n');\n let openCodeFences = 0;\n let fenceStartLine = 1;\n\n for (let i = 0; i < lines.length; i++) {\n const lineNum = i + 1;\n const line = lines[i]!;\n const trimmed = line.trim();\n\n if (trimmed.startsWith('```')) {\n if (openCodeFences === 0) {\n openCodeFences++;\n fenceStartLine = lineNum;\n } else {\n openCodeFences--;\n }\n }\n }\n\n if (openCodeFences > 0) {\n diagnostics.push({\n line: fenceStartLine,\n column: 1,\n message: 'Unclosed Markdown code fence (```)',\n severity: 'error',\n rule: 'md-unclosed-fence',\n });\n }\n\n return diagnostics;\n}\n\n/**\n * Master lint function for any supported language.\n */\nexport function lintCode(code: string, language: string): LintDiagnostic[] {\n if (!code || !code.trim()) return [];\n\n const lang = (language || '').toLowerCase().trim();\n\n switch (lang) {\n case 'json':\n return lintJson(code);\n case 'javascript':\n case 'js':\n case 'typescript':\n case 'ts':\n case 'jsx':\n case 'tsx':\n return lintJavaScript(code);\n case 'html':\n case 'xml':\n case 'svg':\n return lintHtml(code);\n case 'css':\n case 'scss':\n case 'less':\n return lintCss(code);\n case 'python':\n case 'py':\n return lintPython(code);\n case 'bash':\n case 'sh':\n case 'shell':\n case 'zsh':\n return lintBash(code);\n case 'yaml':\n case 'yml':\n return lintYaml(code);\n case 'markdown':\n case 'md':\n return lintMarkdown(code);\n default:\n return [];\n }\n}\n\n","import { html, nothing, PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { MdBaseElement } from '../../internal/base-component.js';\nimport { codeStyles } from './code.css.js';\nimport { highlightCode } from './highlighter.js';\nimport { lintCode, LintDiagnostic } from './linter.js';\nimport '../icon/icon.js';\n\nexport type { LintDiagnostic };\n\n@customElement('md-code')\nexport class MdCode extends MdBaseElement {\n static override styles = [MdBaseElement.styles, codeStyles];\n\n /**\n * Raw source code string. If not provided, falls back to slot/textContent.\n */\n @property({ type: String })\n code = '';\n\n /**\n * Language identifier (e.g. 'javascript', 'typescript', 'html', 'css', 'json', 'python', 'bash', 'sql').\n */\n @property({ type: String, reflect: true })\n language = 'plaintext';\n\n /**\n * Alias for language.\n */\n @property({ type: String })\n override lang = '';\n\n /**\n * Optional filename or label to display in the header bar.\n */\n @property({ type: String })\n label = '';\n\n /**\n * Alias for label (filename).\n */\n @property({ type: String })\n filename = '';\n\n /**\n * When true, automatically lints the code for syntax issues and displays diagnostics.\n */\n @property({ type: Boolean, reflect: true })\n lint = false;\n\n /**\n * Custom / external diagnostic issues to display.\n */\n @property({ type: Array })\n diagnostics: LintDiagnostic[] = [];\n\n /**\n * Whether to show the lint issues summary bar at the bottom.\n */\n @property({\n type: Boolean,\n attribute: 'show-lint-summary',\n converter: {\n fromAttribute: (value: string | null) => value === null ? true : value !== 'false',\n toAttribute: (value: boolean) => value ? '' : null,\n },\n })\n showLintSummary = true;\n\n /**\n * Whether to render line numbers in a gutter.\n */\n @property({ type: Boolean, attribute: 'line-numbers', reflect: true })\n lineNumbers = false;\n\n /**\n * Line numbers to highlight, e.g. \"1, 3-5, 8\".\n */\n @property({ type: String, attribute: 'highlight-lines' })\n highlightLines = '';\n\n /**\n * Whether the code is copyable via the copy button.\n */\n @property({\n type: Boolean,\n reflect: true,\n converter: {\n fromAttribute: (value: string | null) => value === null ? true : value !== 'false',\n toAttribute: (value: boolean) => value ? '' : null,\n },\n })\n copyable = true;\n\n /**\n * When true, hides the copy button.\n */\n @property({ type: Boolean, attribute: 'hide-copy-button' })\n hideCopyButton = false;\n\n /**\n * When true, wraps long lines instead of scrolling horizontally.\n */\n @property({ type: Boolean, attribute: 'wrap-lines', reflect: true })\n wrapLines = false;\n\n /**\n * Maximum height for the code scroll container (e.g. \"300px\").\n */\n @property({ type: String, attribute: 'max-height' })\n maxHeight = '';\n\n @state()\n private isCopied = false;\n\n @state()\n private isIssuesExpanded = false;\n\n @state()\n private internalCode = '';\n\n @state()\n private activeDiagnostics: LintDiagnostic[] = [];\n\n private copyTimeout: ReturnType<typeof setTimeout> | null = null;\n\n override connectedCallback() {\n super.connectedCallback();\n this.extractCodeContent();\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n if (this.copyTimeout) {\n clearTimeout(this.copyTimeout);\n this.copyTimeout = null;\n }\n }\n\n override willUpdate(changedProperties: PropertyValues) {\n if (changedProperties.has('code') && this.code) {\n this.internalCode = this.code;\n } else if (!this.internalCode && this.textContent && this.textContent.trim()) {\n this.internalCode = this.normalizeIndentation(this.textContent);\n }\n this.runLint();\n }\n\n private extractCodeContent() {\n if (!this.code && this.textContent && this.textContent.trim()) {\n this.internalCode = this.normalizeIndentation(this.textContent);\n this.runLint();\n }\n }\n\n /**\n * Strips common leading indentation from multi-line template strings.\n */\n private normalizeIndentation(str: string): string {\n const lines = str.replace(/^\\r?\\n/, '').replace(/\\r?\\n\\s*$/, '').split('\\n');\n if (lines.length === 0) return str;\n\n let minIndent = Infinity;\n for (const line of lines) {\n if (line.trim().length === 0) continue;\n const indent = line.match(/^[ \\t]*/)?.[0]?.length || 0;\n if (indent < minIndent) minIndent = indent;\n }\n\n if (minIndent === Infinity || minIndent === 0) return lines.join('\\n');\n return lines.map(line => line.slice(minIndent)).join('\\n');\n }\n\n /**\n * Performs linting and combines internal and external diagnostics.\n */\n public runLint(): LintDiagnostic[] {\n const activeLang = this.effectiveLanguage;\n let computed: LintDiagnostic[] = [];\n\n const isLintEnabled = Boolean(this.lint || this.hasAttribute('lint'));\n const source = this.internalCode || this.code || '';\n if (isLintEnabled && source) {\n computed = lintCode(source, activeLang);\n }\n\n if (this.diagnostics && this.diagnostics.length > 0) {\n computed = [...computed, ...this.diagnostics];\n }\n\n this.activeDiagnostics = computed;\n this.emitEvent('lint-complete', {\n diagnostics: computed,\n isValid: computed.length === 0,\n });\n return computed;\n }\n\n /**\n * Active effective language.\n */\n get effectiveLanguage(): string {\n return this.lang || this.language || 'plaintext';\n }\n\n /**\n * Effective filename / label.\n */\n get effectiveLabel(): string {\n return this.filename || this.label;\n }\n\n /**\n * Copies the current unhighlighted code to clipboard.\n */\n public async copy(): Promise<boolean> {\n const textToCopy = this.internalCode || this.code || this.textContent || '';\n if (!textToCopy) return false;\n\n try {\n if (navigator.clipboard && navigator.clipboard.writeText) {\n await navigator.clipboard.writeText(textToCopy);\n } else {\n // Fallback for environments where clipboard API might be unavailable\n const textarea = document.createElement('textarea');\n textarea.value = textToCopy;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n }\n\n this.isCopied = true;\n this.emitEvent('copy', { code: textToCopy });\n\n if (this.copyTimeout) clearTimeout(this.copyTimeout);\n this.copyTimeout = setTimeout(() => {\n this.isCopied = false;\n }, 2000);\n\n return true;\n } catch {\n return false;\n }\n }\n\n private parseHighlightedLines(): Set<number> {\n const set = new Set<number>();\n if (!this.highlightLines) return set;\n\n const parts = this.highlightLines.split(',');\n for (const part of parts) {\n const trimmed = part.trim();\n if (trimmed.includes('-')) {\n const [startStr, endStr] = trimmed.split('-');\n const start = parseInt(startStr || '', 10);\n const end = parseInt(endStr || '', 10);\n if (!isNaN(start) && !isNaN(end)) {\n for (let i = start; i <= end; i++) set.add(i);\n }\n } else {\n const num = parseInt(trimmed, 10);\n if (!isNaN(num)) set.add(num);\n }\n }\n return set;\n }\n\n private handleSlotChange = () => {\n if (!this.code) {\n this.extractCodeContent();\n this.requestUpdate();\n }\n };\n\n private toggleIssuesList = () => {\n this.isIssuesExpanded = !this.isIssuesExpanded;\n };\n\n private scrollToLine(lineNum: number) {\n const lineEl = this.shadowRoot?.querySelector(`[data-line=\"${lineNum}\"]`);\n if (lineEl) {\n lineEl.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }\n\n override render() {\n const rawCode = this.internalCode || this.code || '';\n const activeLang = this.effectiveLanguage;\n const label = this.effectiveLabel;\n const showHeader = Boolean(label || activeLang !== 'plaintext' || this.copyable);\n const highlightedLines = this.parseHighlightedLines();\n\n // Map diagnostics by line number\n const diagnosticsByLine = new Map<number, LintDiagnostic[]>();\n for (const d of this.activeDiagnostics) {\n const list = diagnosticsByLine.get(d.line) || [];\n list.push(d);\n diagnosticsByLine.set(d.line, list);\n }\n\n const lines = rawCode.split('\\n');\n const totalLines = lines.length;\n\n // Generate highlighted HTML\n const highlightedHtml = highlightCode(rawCode, activeLang);\n const highlightedLinesHtml = highlightedHtml.split('\\n');\n\n const errorCount = this.activeDiagnostics.filter(d => d.severity === 'error' || !d.severity).length;\n const warningCount = this.activeDiagnostics.filter(d => d.severity === 'warning').length;\n const hasIssues = this.activeDiagnostics.length > 0;\n\n return html`\n <div class=\"code-container\" style=${this.maxHeight ? `--md-code-max-height: ${this.maxHeight};` : ''}>\n <!-- Hidden Slot for code content fallback -->\n <div style=\"display: none;\">\n <slot @slotchange=${this.handleSlotChange}></slot>\n </div>\n\n <!-- Header -->\n ${showHeader ? html`\n <header class=\"code-header\">\n <div class=\"code-header-left\">\n ${activeLang && activeLang !== 'plaintext' ? html`\n <span class=\"lang-badge\">${activeLang}</span>\n ` : nothing}\n ${label ? html`<span class=\"code-filename\">${label}</span>` : nothing}\n </div>\n\n <div class=\"code-header-actions\">\n <slot name=\"actions\"></slot>\n ${this.copyable && !this.hideCopyButton ? html`\n <button\n type=\"button\"\n class=\"action-btn ${this.isCopied ? 'copied' : ''}\"\n @click=${this.copy}\n aria-label=${this.isCopied ? 'Copied to clipboard' : 'Copy code to clipboard'}\n title=${this.isCopied ? 'Copied!' : 'Copy code'}\n >\n <md-icon name=${this.isCopied ? 'check' : 'content_copy'}></md-icon>\n <span>${this.isCopied ? 'Copied!' : 'Copy'}</span>\n </button>\n ` : nothing}\n </div>\n </header>\n ` : (this.copyable && !this.hideCopyButton ? html`\n <div class=\"floating-copy-btn\">\n <button\n type=\"button\"\n class=\"action-btn ${this.isCopied ? 'copied' : ''}\"\n @click=${this.copy}\n aria-label=${this.isCopied ? 'Copied to clipboard' : 'Copy code'}\n title=${this.isCopied ? 'Copied!' : 'Copy code'}\n >\n <md-icon name=${this.isCopied ? 'check' : 'content_copy'}></md-icon>\n <span>${this.isCopied ? 'Copied!' : 'Copy'}</span>\n </button>\n </div>\n ` : nothing)}\n\n <!-- Body with Gutter and Code Lines -->\n <div class=\"code-body\" style=${this.maxHeight ? `max-height: ${this.maxHeight};` : ''}>\n ${this.lineNumbers || this.hasAttribute('line-numbers') || this.lint || this.hasAttribute('lint') || this.activeDiagnostics.length > 0 ? html`\n <div class=\"code-gutter\" aria-hidden=\"true\">\n ${Array.from({ length: totalLines }, (_, idx) => {\n const lineNum = idx + 1;\n const diags = diagnosticsByLine.get(lineNum);\n const worstDiag = diags?.find(d => d.severity === 'error' || !d.severity) || diags?.[0];\n\n return html`\n <div class=\"gutter-line\" @click=${() => this.scrollToLine(lineNum)}>\n ${worstDiag ? html`\n <span\n class=\"gutter-marker ${worstDiag.severity || 'error'}\"\n title=\"Line ${lineNum}: ${worstDiag.message}\"\n >\n <md-icon name=${worstDiag.severity === 'warning' ? 'warning' : 'error'}></md-icon>\n </span>\n ` : nothing}\n ${this.lineNumbers || this.hasAttribute('line-numbers') ? html`<span>${lineNum}</span>` : nothing}\n </div>\n `;\n })}\n </div>\n ` : nothing}\n\n <pre><code>${highlightedLinesHtml.map((lineContent, idx) => {\n const lineNum = idx + 1;\n const isHighlighted = highlightedLines.has(lineNum);\n const diags = diagnosticsByLine.get(lineNum);\n const hasError = diags?.some(d => d.severity === 'error' || !d.severity);\n const hasWarning = diags?.some(d => d.severity === 'warning');\n\n const lineClasses = [\n 'code-line',\n isHighlighted ? 'highlighted' : '',\n hasError ? 'has-error' : '',\n hasWarning && !hasError ? 'has-warning' : '',\n ].filter(Boolean).join(' ');\n\n return html`<div class=${lineClasses} data-line=${lineNum}>${unsafeHTML(lineContent || '&nbsp;')}</div>`;\n })}</code></pre>\n </div>\n\n <!-- Lint Summary Footer -->\n ${(this.lint || this.hasAttribute('lint') || this.diagnostics.length > 0 || this.activeDiagnostics.length > 0) && this.showLintSummary !== false ? html`\n <footer class=\"lint-footer\">\n <div class=\"lint-footer-summary\" @click=${this.toggleIssuesList} role=\"button\" tabindex=\"0\">\n <div class=\"lint-counts\">\n ${hasIssues && errorCount > 0 ? html`\n <span class=\"lint-count-item errors\">\n <md-icon name=\"error\"></md-icon>\n <span>${errorCount} ${errorCount === 1 ? 'error' : 'errors'}</span>\n </span>\n ` : nothing}\n ${hasIssues && warningCount > 0 ? html`\n <span class=\"lint-count-item warnings\">\n <md-icon name=\"warning\"></md-icon>\n <span>${warningCount} ${warningCount === 1 ? 'warning' : 'warnings'}</span>\n </span>\n ` : nothing}\n ${!hasIssues ? html`\n <span class=\"lint-count-item valid\">\n <md-icon name=\"check_circle\"></md-icon>\n <span>No syntax issues detected</span>\n </span>\n ` : nothing}\n </div>\n\n ${hasIssues ? html`\n <button type=\"button\" class=\"action-btn\" aria-label=\"Toggle issues panel\">\n <md-icon name=${this.isIssuesExpanded ? 'expand_less' : 'expand_more'}></md-icon>\n <span>${this.isIssuesExpanded ? 'Hide issues' : 'View issues'}</span>\n </button>\n ` : nothing}\n </div>\n\n ${hasIssues && this.isIssuesExpanded ? html`\n <div class=\"lint-issues-list\" role=\"region\" aria-label=\"Lint diagnostics\">\n ${this.activeDiagnostics.map(d => html`\n <div\n class=\"lint-issue-item ${d.severity || 'error'}\"\n @click=${() => this.scrollToLine(d.line)}\n role=\"button\"\n tabindex=\"0\"\n >\n <md-icon name=${d.severity === 'warning' ? 'warning' : 'error'}></md-icon>\n <div class=\"lint-issue-content\">\n <span class=\"lint-issue-loc\">Line ${d.line}${d.column ? `:${d.column}` : ''}${d.rule ? ` • ${d.rule}` : ''}</span>\n <span class=\"lint-issue-msg\">${d.message}</span>\n </div>\n </div>\n `)}\n </div>\n ` : nothing}\n </footer>\n ` : nothing}\n </div>\n `;\n }\n}\n\n// Register alias md-code-block\n@customElement('md-code-block')\nexport class MdCodeBlock extends MdCode {}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'md-code': MdCode;\n 'md-code-block': MdCodeBlock;\n }\n}\n"],"mappings":"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"}