@francofantomius/material-components 0.1.0 → 1.0.1

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 (166) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +550 -90
  3. package/custom-elements.json +21010 -2354
  4. package/dist/chunks/badge-G4EjcMoy.js +89 -0
  5. package/dist/chunks/badge-G4EjcMoy.js.map +1 -0
  6. package/dist/chunks/button-B4TSZ7Sl.js +250 -0
  7. package/dist/chunks/button-B4TSZ7Sl.js.map +1 -0
  8. package/dist/chunks/card-DVffdPpv.js +163 -0
  9. package/dist/chunks/card-DVffdPpv.js.map +1 -0
  10. package/dist/chunks/checkbox-BqlboAHd.js +194 -0
  11. package/dist/chunks/checkbox-BqlboAHd.js.map +1 -0
  12. package/dist/chunks/chip-CI1ZINnr.js +169 -0
  13. package/dist/chunks/chip-CI1ZINnr.js.map +1 -0
  14. package/dist/chunks/code-C5UFBkCh.js +1830 -0
  15. package/dist/chunks/code-C5UFBkCh.js.map +1 -0
  16. package/dist/chunks/decorate-DXuynaiA.js +39 -0
  17. package/dist/chunks/decorate-DXuynaiA.js.map +1 -0
  18. package/dist/chunks/dialog-DGVEE5m_.js +158 -0
  19. package/dist/chunks/dialog-DGVEE5m_.js.map +1 -0
  20. package/dist/chunks/divider-DNepwoZv.js +82 -0
  21. package/dist/chunks/divider-DNepwoZv.js.map +1 -0
  22. package/dist/chunks/fab-C9j3WBHE.js +150 -0
  23. package/dist/chunks/fab-C9j3WBHE.js.map +1 -0
  24. package/dist/chunks/focus-ring-CuiJuM-y.js +71 -0
  25. package/dist/chunks/focus-ring-CuiJuM-y.js.map +1 -0
  26. package/dist/chunks/{form-associated-fKbeX_2P.js → form-associated-Cty_ZaS9.js} +26 -27
  27. package/dist/chunks/form-associated-Cty_ZaS9.js.map +1 -0
  28. package/dist/chunks/icon-DrNqcNEL.js +62 -0
  29. package/dist/chunks/icon-DrNqcNEL.js.map +1 -0
  30. package/dist/chunks/icon-button-BdSc7eot.js +188 -0
  31. package/dist/chunks/icon-button-BdSc7eot.js.map +1 -0
  32. package/dist/chunks/list-D8olR7oZ.js +204 -0
  33. package/dist/chunks/list-D8olR7oZ.js.map +1 -0
  34. package/dist/chunks/navigation-drawer-CKl44Ef5.js +531 -0
  35. package/dist/chunks/navigation-drawer-CKl44Ef5.js.map +1 -0
  36. package/dist/chunks/player-C4ydiIpr.js +1582 -0
  37. package/dist/chunks/player-C4ydiIpr.js.map +1 -0
  38. package/dist/chunks/progress-LQmLMDjX.js +266 -0
  39. package/dist/chunks/progress-LQmLMDjX.js.map +1 -0
  40. package/dist/chunks/radio-Bily78NT.js +205 -0
  41. package/dist/chunks/radio-Bily78NT.js.map +1 -0
  42. package/dist/chunks/ripple-squbKHhj.js +135 -0
  43. package/dist/chunks/ripple-squbKHhj.js.map +1 -0
  44. package/dist/chunks/search-bar-TXnqJ-gd.js +698 -0
  45. package/dist/chunks/search-bar-TXnqJ-gd.js.map +1 -0
  46. package/dist/chunks/snackbar-Wsz3BzEY.js +161 -0
  47. package/dist/chunks/snackbar-Wsz3BzEY.js.map +1 -0
  48. package/dist/chunks/switch-DdukrvXb.js +190 -0
  49. package/dist/chunks/switch-DdukrvXb.js.map +1 -0
  50. package/dist/chunks/table-aRTYzDyE.js +773 -0
  51. package/dist/chunks/table-aRTYzDyE.js.map +1 -0
  52. package/dist/chunks/tabs-BfOtoeir.js +191 -0
  53. package/dist/chunks/tabs-BfOtoeir.js.map +1 -0
  54. package/dist/chunks/text-field-hN6-2HQy.js +338 -0
  55. package/dist/chunks/text-field-hN6-2HQy.js.map +1 -0
  56. package/dist/chunks/top-app-bar-Dgbp6CFv.js +228 -0
  57. package/dist/chunks/top-app-bar-Dgbp6CFv.js.map +1 -0
  58. package/dist/components/account-menu/account-menu.css.d.ts +3 -0
  59. package/dist/components/account-menu/account-menu.css.d.ts.map +1 -0
  60. package/dist/components/account-menu/account-menu.d.ts +111 -0
  61. package/dist/components/account-menu/account-menu.d.ts.map +1 -0
  62. package/dist/components/app-drawer/app-drawer.css.d.ts +3 -0
  63. package/dist/components/app-drawer/app-drawer.css.d.ts.map +1 -0
  64. package/dist/components/app-drawer/app-drawer.d.ts +173 -0
  65. package/dist/components/app-drawer/app-drawer.d.ts.map +1 -0
  66. package/dist/components/badge/badge.js +2 -91
  67. package/dist/components/button/button.js +2 -261
  68. package/dist/components/card/card.js +2 -167
  69. package/dist/components/checkbox/checkbox.css.d.ts.map +1 -1
  70. package/dist/components/checkbox/checkbox.js +2 -186
  71. package/dist/components/chip/chip.js +3 -172
  72. package/dist/components/code/code.css.d.ts +2 -0
  73. package/dist/components/code/code.css.d.ts.map +1 -0
  74. package/dist/components/code/code.d.ts +106 -0
  75. package/dist/components/code/code.d.ts.map +1 -0
  76. package/dist/components/code/code.js +5 -0
  77. package/dist/components/code/highlighter.d.ts +8 -0
  78. package/dist/components/code/highlighter.d.ts.map +1 -0
  79. package/dist/components/code/linter.d.ts +44 -0
  80. package/dist/components/code/linter.d.ts.map +1 -0
  81. package/dist/components/dialog/dialog.js +2 -165
  82. package/dist/components/divider/divider.js +2 -79
  83. package/dist/components/fab/fab.js +2 -153
  84. package/dist/components/icon/icon.js +2 -68
  85. package/dist/components/icon-button/icon-button.css.d.ts.map +1 -1
  86. package/dist/components/icon-button/icon-button.js +1 -189
  87. package/dist/components/list/list.css.d.ts.map +1 -1
  88. package/dist/components/list/list.d.ts.map +1 -1
  89. package/dist/components/list/list.js +3 -188
  90. package/dist/components/navigation-drawer/navigation-drawer.css.d.ts +3 -0
  91. package/dist/components/navigation-drawer/navigation-drawer.css.d.ts.map +1 -0
  92. package/dist/components/navigation-drawer/navigation-drawer.d.ts +76 -0
  93. package/dist/components/navigation-drawer/navigation-drawer.d.ts.map +1 -0
  94. package/dist/components/navigation-drawer/navigation-drawer.js +8 -0
  95. package/dist/components/player/player.css.d.ts +2 -0
  96. package/dist/components/player/player.css.d.ts.map +1 -0
  97. package/dist/components/player/player.d.ts +99 -0
  98. package/dist/components/player/player.d.ts.map +1 -0
  99. package/dist/components/player/player.js +7 -0
  100. package/dist/components/progress/progress.css.d.ts.map +1 -1
  101. package/dist/components/progress/progress.d.ts +2 -0
  102. package/dist/components/progress/progress.d.ts.map +1 -1
  103. package/dist/components/progress/progress.js +3 -181
  104. package/dist/components/radio/radio.css.d.ts.map +1 -1
  105. package/dist/components/radio/radio.js +3 -203
  106. package/dist/components/search-bar/search-bar.css.d.ts +2 -0
  107. package/dist/components/search-bar/search-bar.css.d.ts.map +1 -0
  108. package/dist/components/search-bar/search-bar.d.ts +81 -0
  109. package/dist/components/search-bar/search-bar.d.ts.map +1 -0
  110. package/dist/components/search-bar/search-bar.js +5 -0
  111. package/dist/components/snackbar/snackbar.js +2 -162
  112. package/dist/components/switch/switch.css.d.ts.map +1 -1
  113. package/dist/components/switch/switch.js +2 -169
  114. package/dist/components/table/table.css.d.ts +8 -0
  115. package/dist/components/table/table.css.d.ts.map +1 -0
  116. package/dist/components/table/table.d.ts +158 -0
  117. package/dist/components/table/table.d.ts.map +1 -0
  118. package/dist/components/table/table.js +13 -0
  119. package/dist/components/tabs/tabs.js +3 -198
  120. package/dist/components/text-field/text-field.css.d.ts.map +1 -1
  121. package/dist/components/text-field/text-field.d.ts +1 -1
  122. package/dist/components/text-field/text-field.d.ts.map +1 -1
  123. package/dist/components/text-field/text-field.js +2 -325
  124. package/dist/components/top-app-bar/top-app-bar.css.d.ts +2 -0
  125. package/dist/components/top-app-bar/top-app-bar.css.d.ts.map +1 -0
  126. package/dist/components/top-app-bar/top-app-bar.d.ts +29 -0
  127. package/dist/components/top-app-bar/top-app-bar.d.ts.map +1 -0
  128. package/dist/components/top-app-bar/top-app-bar.js +5 -0
  129. package/dist/index.d.ts +8 -0
  130. package/dist/index.d.ts.map +1 -1
  131. package/dist/index.js +2264 -58
  132. package/dist/index.js.map +1 -1
  133. package/dist/internal/focus-ring/focus-ring.d.ts.map +1 -1
  134. package/dist/internal/focus-ring/focus-ring.js +4 -0
  135. package/dist/internal/ripple/ripple.css.d.ts.map +1 -1
  136. package/dist/internal/ripple/ripple.d.ts +0 -3
  137. package/dist/internal/ripple/ripple.d.ts.map +1 -1
  138. package/dist/internal/ripple/ripple.js +2 -142
  139. package/dist/tokens/index.js +336 -11
  140. package/dist/tokens/index.js.map +1 -1
  141. package/package.json +118 -12
  142. package/dist/chunks/base-component-DQTjlEVL.js +0 -34
  143. package/dist/chunks/base-component-DQTjlEVL.js.map +0 -1
  144. package/dist/chunks/focus-ring-Dl-XoEKK.js +0 -71
  145. package/dist/chunks/focus-ring-Dl-XoEKK.js.map +0 -1
  146. package/dist/chunks/form-associated-fKbeX_2P.js.map +0 -1
  147. package/dist/chunks/theme.css-DV3DRha-.js +0 -263
  148. package/dist/chunks/theme.css-DV3DRha-.js.map +0 -1
  149. package/dist/components/badge/badge.js.map +0 -1
  150. package/dist/components/button/button.js.map +0 -1
  151. package/dist/components/card/card.js.map +0 -1
  152. package/dist/components/checkbox/checkbox.js.map +0 -1
  153. package/dist/components/chip/chip.js.map +0 -1
  154. package/dist/components/dialog/dialog.js.map +0 -1
  155. package/dist/components/divider/divider.js.map +0 -1
  156. package/dist/components/fab/fab.js.map +0 -1
  157. package/dist/components/icon/icon.js.map +0 -1
  158. package/dist/components/icon-button/icon-button.js.map +0 -1
  159. package/dist/components/list/list.js.map +0 -1
  160. package/dist/components/progress/progress.js.map +0 -1
  161. package/dist/components/radio/radio.js.map +0 -1
  162. package/dist/components/snackbar/snackbar.js.map +0 -1
  163. package/dist/components/switch/switch.js.map +0 -1
  164. package/dist/components/tabs/tabs.js.map +0 -1
  165. package/dist/components/text-field/text-field.js.map +0 -1
  166. package/dist/internal/ripple/ripple.js.map +0 -1
@@ -0,0 +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;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"}
@@ -0,0 +1,39 @@
1
+ import { LitElement as a, css as f } from "lit";
2
+ var m = class extends a {
3
+ static {
4
+ this.styles = f`
5
+ :host {
6
+ box-sizing: border-box;
7
+ font-family: var(--md-sys-typescale-font-family, 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif);
8
+ -webkit-font-smoothing: antialiased;
9
+ -moz-osx-font-smoothing: grayscale;
10
+ }
11
+
12
+ *, *::before, *::after {
13
+ box-sizing: inherit;
14
+ }
15
+ `;
16
+ }
17
+ emitEvent(s, e, n = {}) {
18
+ const o = new CustomEvent(s, {
19
+ bubbles: !0,
20
+ composed: !0,
21
+ cancelable: !0,
22
+ detail: e,
23
+ ...n
24
+ });
25
+ return this.dispatchEvent(o);
26
+ }
27
+ };
28
+ function b(s, e, n, o) {
29
+ var i = arguments.length, t = i < 3 ? e : o === null ? o = Object.getOwnPropertyDescriptor(e, n) : o, r;
30
+ if (typeof Reflect == "object" && typeof Reflect.decorate == "function") t = Reflect.decorate(s, e, n, o);
31
+ else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (t = (i < 3 ? r(t) : i > 3 ? r(e, n, t) : r(e, n)) || t);
32
+ return i > 3 && t && Object.defineProperty(e, n, t), t;
33
+ }
34
+ export {
35
+ m as n,
36
+ b as t
37
+ };
38
+
39
+ //# sourceMappingURL=decorate-DXuynaiA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorate-DXuynaiA.js","names":[],"sources":["../../src/internal/base-component.ts"],"sourcesContent":["import { LitElement, css, CSSResultGroup } from 'lit';\n\n/**\n * Base element class for all Material Web Components.\n * Provides standard reset styles and event dispatch helpers.\n */\nexport class MdBaseElement extends LitElement {\n static override styles: CSSResultGroup = css`\n :host {\n box-sizing: border-box;\n font-family: var(--md-sys-typescale-font-family, 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif);\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n *, *::before, *::after {\n box-sizing: inherit;\n }\n `;\n\n /**\n * Helper to dispatch custom events with standard bubbles/composed defaults.\n */\n protected emitEvent<T = unknown>(\n name: string,\n detail?: T,\n options: CustomEventInit<T> = {}\n ): boolean {\n const event = new CustomEvent<T>(name, {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail,\n ...options,\n });\n return this.dispatchEvent(event);\n }\n}\n\n"],"mappings":";AAMA,IAAa,IAAb,cAAmC,EAAW;AAAA;AACH,SAAA,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAgBzC,UACE,GACA,GACA,IAA8B,CAAC,GACtB;AACT,UAAM,IAAQ,IAAI,YAAe,GAAM;AAAA,MACrC,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,QAAA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AACD,WAAO,KAAK,cAAc,CAAK;AAAA,EACjC;AACF"}
@@ -0,0 +1,158 @@
1
+ import { n, t as a } from "./decorate-DXuynaiA.js";
2
+ import "./icon-DrNqcNEL.js";
3
+ import { css as d, html as l, nothing as r } from "lit";
4
+ import { customElement as c, property as s, query as p } from "lit/decorators.js";
5
+ var h = d`
6
+ :host {
7
+ display: contents;
8
+ }
9
+
10
+ dialog {
11
+ box-sizing: border-box;
12
+ min-width: 280px;
13
+ max-width: 560px;
14
+ padding: 24px;
15
+ border: none;
16
+ border-radius: var(--md-sys-shape-corner-extra-large, 28px);
17
+ background-color: var(--md-sys-color-surface-container-high, #ECE6F0);
18
+ color: var(--md-sys-color-on-surface, #1D1B20);
19
+ box-shadow: var(--md-sys-elevation-level3, 0px 1px 3px 0px rgba(0,0,0,0.30));
20
+ font-family: var(--md-sys-typescale-font-family, inherit);
21
+ position: fixed;
22
+ inset: 0;
23
+ margin: auto;
24
+ overflow: auto;
25
+ z-index: 1000;
26
+ }
27
+
28
+ dialog::backdrop {
29
+ background-color: rgba(0, 0, 0, 0.32);
30
+ backdrop-filter: blur(2px);
31
+ animation: md-fade-in 150ms ease-out forwards;
32
+ }
33
+
34
+ dialog[open] {
35
+ animation: md-dialog-in 150ms cubic-bezier(0.2, 0, 0, 1) forwards;
36
+ }
37
+
38
+ @keyframes md-fade-in {
39
+ from { opacity: 0; }
40
+ to { opacity: 1; }
41
+ }
42
+
43
+ @keyframes md-dialog-in {
44
+ from {
45
+ opacity: 0;
46
+ transform: scale(0.92);
47
+ }
48
+ to {
49
+ opacity: 1;
50
+ transform: scale(1);
51
+ }
52
+ }
53
+
54
+ .dialog-container {
55
+ display: flex;
56
+ flex-direction: column;
57
+ gap: 16px;
58
+ }
59
+
60
+ .icon {
61
+ display: flex;
62
+ justify-content: center;
63
+ color: var(--md-sys-color-secondary, #625B71);
64
+ }
65
+
66
+ .headline {
67
+ font-size: var(--md-sys-typescale-headline-small-size, 24px);
68
+ line-height: 32px;
69
+ font-weight: 400;
70
+ color: var(--md-sys-color-on-surface, #1D1B20);
71
+ margin: 0;
72
+ }
73
+
74
+ .content {
75
+ font-size: var(--md-sys-typescale-body-medium-size, 14px);
76
+ line-height: 20px;
77
+ color: var(--md-sys-color-on-surface-variant, #49454F);
78
+ }
79
+
80
+ .actions {
81
+ display: flex;
82
+ align-items: center;
83
+ justify-content: flex-end;
84
+ gap: 8px;
85
+ padding-top: 8px;
86
+ }
87
+ `, i = class extends n {
88
+ constructor(...e) {
89
+ super(...e), this.open = !1, this.headline = "", this.icon = "", this.returnValue = "", this.handleCancel = (o) => {
90
+ o.preventDefault(), this.close("cancel");
91
+ }, this.handleBackdropClick = (o) => {
92
+ if (o.target === this.dialogElement) {
93
+ const t = this.dialogElement.getBoundingClientRect();
94
+ t.top <= o.clientY && o.clientY <= t.top + t.height && t.left <= o.clientX && o.clientX <= t.left + t.width || this.close("backdrop");
95
+ }
96
+ };
97
+ }
98
+ static {
99
+ this.styles = [n.styles, h];
100
+ }
101
+ updated(e) {
102
+ super.updated(e), e.has("open") && (this.open ? this.dialogElement && !this.dialogElement.open && this.dialogElement.showModal() : this.dialogElement && this.dialogElement.open && this.dialogElement.close());
103
+ }
104
+ showModal() {
105
+ this.open = !0;
106
+ }
107
+ show() {
108
+ this.open = !0;
109
+ }
110
+ close(e) {
111
+ e !== void 0 && (this.returnValue = e), this.open = !1, this.emitEvent("close", { returnValue: this.returnValue });
112
+ }
113
+ render() {
114
+ return l`
115
+ <dialog
116
+ @cancel=${this.handleCancel}
117
+ @click=${this.handleBackdropClick}
118
+ >
119
+ <div class="dialog-container">
120
+ <div class="icon">
121
+ <slot name="icon">
122
+ ${this.icon ? l`<md-icon name=${this.icon} size="32"></md-icon>` : r}
123
+ </slot>
124
+ </div>
125
+
126
+ <slot name="headline">
127
+ ${this.headline ? l`<h2 class="headline">${this.headline}</h2>` : r}
128
+ </slot>
129
+
130
+ <div class="content">
131
+ <slot></slot>
132
+ </div>
133
+
134
+ <div class="actions">
135
+ <slot name="actions"></slot>
136
+ </div>
137
+ </div>
138
+ </dialog>
139
+ `;
140
+ }
141
+ };
142
+ a([s({
143
+ type: Boolean,
144
+ reflect: !0
145
+ })], i.prototype, "open", void 0);
146
+ a([s({ type: String })], i.prototype, "headline", void 0);
147
+ a([s({ type: String })], i.prototype, "icon", void 0);
148
+ a([s({
149
+ type: String,
150
+ attribute: "return-value"
151
+ })], i.prototype, "returnValue", void 0);
152
+ a([p("dialog")], i.prototype, "dialogElement", void 0);
153
+ i = a([c("md-dialog")], i);
154
+ export {
155
+ i as t
156
+ };
157
+
158
+ //# sourceMappingURL=dialog-DGVEE5m_.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog-DGVEE5m_.js","names":[],"sources":["../../src/components/dialog/dialog.css.ts","../../src/components/dialog/dialog.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const dialogStyles = css`\n :host {\n display: contents;\n }\n\n dialog {\n box-sizing: border-box;\n min-width: 280px;\n max-width: 560px;\n padding: 24px;\n border: none;\n border-radius: var(--md-sys-shape-corner-extra-large, 28px);\n background-color: var(--md-sys-color-surface-container-high, #ECE6F0);\n color: var(--md-sys-color-on-surface, #1D1B20);\n box-shadow: var(--md-sys-elevation-level3, 0px 1px 3px 0px rgba(0,0,0,0.30));\n font-family: var(--md-sys-typescale-font-family, inherit);\n position: fixed;\n inset: 0;\n margin: auto;\n overflow: auto;\n z-index: 1000;\n }\n\n dialog::backdrop {\n background-color: rgba(0, 0, 0, 0.32);\n backdrop-filter: blur(2px);\n animation: md-fade-in 150ms ease-out forwards;\n }\n\n dialog[open] {\n animation: md-dialog-in 150ms cubic-bezier(0.2, 0, 0, 1) forwards;\n }\n\n @keyframes md-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n @keyframes md-dialog-in {\n from {\n opacity: 0;\n transform: scale(0.92);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n .dialog-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .icon {\n display: flex;\n justify-content: center;\n color: var(--md-sys-color-secondary, #625B71);\n }\n\n .headline {\n font-size: var(--md-sys-typescale-headline-small-size, 24px);\n line-height: 32px;\n font-weight: 400;\n color: var(--md-sys-color-on-surface, #1D1B20);\n margin: 0;\n }\n\n .content {\n font-size: var(--md-sys-typescale-body-medium-size, 14px);\n line-height: 20px;\n color: var(--md-sys-color-on-surface-variant, #49454F);\n }\n\n .actions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n padding-top: 8px;\n }\n`;\n\n","import { html, nothing } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { MdBaseElement } from '../../internal/base-component.js';\nimport '../icon/icon.js';\nimport { dialogStyles } from './dialog.css.js';\n\n@customElement('md-dialog')\nexport class MdDialog extends MdBaseElement {\n static override styles = [MdBaseElement.styles, dialogStyles];\n\n @property({ type: Boolean, reflect: true })\n open = false;\n\n @property({ type: String })\n headline = '';\n\n @property({ type: String })\n icon = '';\n\n @property({ type: String, attribute: 'return-value' })\n returnValue = '';\n\n @query('dialog')\n private dialogElement?: HTMLDialogElement;\n\n override updated(changedProperties: Map<string, unknown>) {\n super.updated(changedProperties);\n if (changedProperties.has('open')) {\n if (this.open) {\n if (this.dialogElement && !this.dialogElement.open) {\n this.dialogElement.showModal();\n }\n } else {\n if (this.dialogElement && this.dialogElement.open) {\n this.dialogElement.close();\n }\n }\n }\n }\n\n showModal() {\n this.open = true;\n }\n\n show() {\n this.open = true;\n }\n\n close(returnValue?: string) {\n if (returnValue !== undefined) {\n this.returnValue = returnValue;\n }\n this.open = false;\n this.emitEvent('close', { returnValue: this.returnValue });\n }\n\n private handleCancel = (event: Event) => {\n event.preventDefault();\n this.close('cancel');\n };\n\n private handleBackdropClick = (event: MouseEvent) => {\n if (event.target === this.dialogElement) {\n const rect = this.dialogElement.getBoundingClientRect();\n const isInDialog = (\n rect.top <= event.clientY &&\n event.clientY <= rect.top + rect.height &&\n rect.left <= event.clientX &&\n event.clientX <= rect.left + rect.width\n );\n if (!isInDialog) {\n this.close('backdrop');\n }\n }\n };\n\n override render() {\n return html`\n <dialog\n @cancel=${this.handleCancel}\n @click=${this.handleBackdropClick}\n >\n <div class=\"dialog-container\">\n <div class=\"icon\">\n <slot name=\"icon\">\n ${this.icon ? html`<md-icon name=${this.icon} size=\"32\"></md-icon>` : nothing}\n </slot>\n </div>\n\n <slot name=\"headline\">\n ${this.headline ? html`<h2 class=\"headline\">${this.headline}</h2>` : nothing}\n </slot>\n\n <div class=\"content\">\n <slot></slot>\n </div>\n\n <div class=\"actions\">\n <slot name=\"actions\"></slot>\n </div>\n </div>\n </dialog>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'md-dialog': MdDialog;\n }\n}\n\n"],"mappings":";;;;AAEA,IAAa,IAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GCKf,IAAN,cAAuB,EAAc;AAAA;iBAInC,KAAA,OAAA,IAGI,KAAA,WAAA,IAGJ,KAAA,OAAA,IAGO,KAAA,cAAA,IAoCU,KAAA,eAAA,CAAA,MAAiB;AACvC,MAAA,EAAM,eAAe,GACrB,KAAK,MAAM,QAAQ;AAAA,IACrB,GAE+B,KAAA,sBAAA,CAAA,MAAsB;AACnD,UAAI,EAAM,WAAW,KAAK,eAAe;AACvC,cAAM,IAAO,KAAK,cAAc,sBAAsB;AAOtD,QALE,EAAK,OAAO,EAAM,WAClB,EAAM,WAAW,EAAK,MAAM,EAAK,UACjC,EAAK,QAAQ,EAAM,WACnB,EAAM,WAAW,EAAK,OAAO,EAAK,SAGlC,KAAK,MAAM,UAAU;AAAA,MAEzB;AAAA,IACF;AAAA;;AAlEyB,SAAA,SAAA,CAAC,EAAc,QAAQ,CAAY;AAAA;EAiB5D,QAAiB,GAAyC;AACxD,UAAM,QAAQ,CAAiB,GAC3B,EAAkB,IAAI,MAAM,MAC1B,KAAK,OACH,KAAK,iBAAiB,CAAC,KAAK,cAAc,QAC5C,KAAK,cAAc,UAAU,IAG3B,KAAK,iBAAiB,KAAK,cAAc,QAC3C,KAAK,cAAc,MAAM;AAAA,EAIjC;AAAA,EAEA,YAAY;AACV,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,OAAO;AACL,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,MAAM,GAAsB;AAC1B,IAAI,MAAgB,WAClB,KAAK,cAAc,IAErB,KAAK,OAAO,IACZ,KAAK,UAAU,SAAS,EAAE,aAAa,KAAK,YAAY,CAAC;AAAA,EAC3D;AAAA,EAsBA,SAAkB;AAChB,WAAO;AAAA;AAAA,kBAEO,KAAK,YAAA;AAAA,iBACN,KAAK,mBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAKN,KAAK,OAAO,kBAAqB,KAAK,IAAA,0BAA8B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAKtE,KAAK,WAAW,yBAA4B,KAAK,QAAA,UAAkB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAa/E;AACF;AA9FG,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAS,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,QAAA,MAAA;AAGzC,EAAA,CAAA,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,YAAA,MAAA;AAGzB,EAAA,CAAA,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,QAAA,MAAA;AAGzB,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAQ,WAAW;AAAe,CAAC,CAAA,GAAA,EAAA,WAAA,eAAA,MAAA;AAGpD,EAAA,CAAA,EAAM,QAAQ,CAAA,GAAA,EAAA,WAAA,iBAAA,MAAA;AAhBhB,IAAA,EAAA,CAAA,EAAc,WAAW,CAAA,GAAA,CAAA"}
@@ -0,0 +1,82 @@
1
+ import { n as r, t as e } from "./decorate-DXuynaiA.js";
2
+ import { css as a, html as s } from "lit";
3
+ import { customElement as l, property as i } from "lit/decorators.js";
4
+ var n = a`
5
+ :host {
6
+ display: block;
7
+ box-sizing: border-box;
8
+ }
9
+
10
+ :host(:not([vertical])) {
11
+ width: 100%;
12
+ height: 1px;
13
+ background-color: var(--md-sys-color-outline-variant, #CAC4D0);
14
+ }
15
+
16
+ :host([vertical]) {
17
+ display: inline-block;
18
+ width: 1px;
19
+ height: 100%;
20
+ vertical-align: middle;
21
+ background-color: var(--md-sys-color-outline-variant, #CAC4D0);
22
+ }
23
+
24
+ :host([inset]:not([vertical])) {
25
+ margin-left: 16px;
26
+ margin-right: 16px;
27
+ width: calc(100% - 32px);
28
+ }
29
+
30
+ :host([inset-start]:not([vertical])) {
31
+ margin-left: 16px;
32
+ width: calc(100% - 16px);
33
+ }
34
+
35
+ :host([inset-end]:not([vertical])) {
36
+ margin-right: 16px;
37
+ width: calc(100% - 16px);
38
+ }
39
+
40
+ :host([inset][vertical]) {
41
+ margin-top: 8px;
42
+ margin-bottom: 8px;
43
+ height: calc(100% - 16px);
44
+ }
45
+ `, t = class extends r {
46
+ constructor(...o) {
47
+ super(...o), this.vertical = !1, this.inset = !1, this.insetStart = !1, this.insetEnd = !1;
48
+ }
49
+ static {
50
+ this.styles = [r.styles, n];
51
+ }
52
+ connectedCallback() {
53
+ super.connectedCallback(), this.setAttribute("role", "separator"), this.setAttribute("aria-orientation", this.vertical ? "vertical" : "horizontal");
54
+ }
55
+ render() {
56
+ return s``;
57
+ }
58
+ };
59
+ e([i({
60
+ type: Boolean,
61
+ reflect: !0
62
+ })], t.prototype, "vertical", void 0);
63
+ e([i({
64
+ type: Boolean,
65
+ reflect: !0
66
+ })], t.prototype, "inset", void 0);
67
+ e([i({
68
+ type: Boolean,
69
+ reflect: !0,
70
+ attribute: "inset-start"
71
+ })], t.prototype, "insetStart", void 0);
72
+ e([i({
73
+ type: Boolean,
74
+ reflect: !0,
75
+ attribute: "inset-end"
76
+ })], t.prototype, "insetEnd", void 0);
77
+ t = e([l("md-divider")], t);
78
+ export {
79
+ t
80
+ };
81
+
82
+ //# sourceMappingURL=divider-DNepwoZv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"divider-DNepwoZv.js","names":[],"sources":["../../src/components/divider/divider.css.ts","../../src/components/divider/divider.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const dividerStyles = css`\n :host {\n display: block;\n box-sizing: border-box;\n }\n\n :host(:not([vertical])) {\n width: 100%;\n height: 1px;\n background-color: var(--md-sys-color-outline-variant, #CAC4D0);\n }\n\n :host([vertical]) {\n display: inline-block;\n width: 1px;\n height: 100%;\n vertical-align: middle;\n background-color: var(--md-sys-color-outline-variant, #CAC4D0);\n }\n\n :host([inset]:not([vertical])) {\n margin-left: 16px;\n margin-right: 16px;\n width: calc(100% - 32px);\n }\n\n :host([inset-start]:not([vertical])) {\n margin-left: 16px;\n width: calc(100% - 16px);\n }\n\n :host([inset-end]:not([vertical])) {\n margin-right: 16px;\n width: calc(100% - 16px);\n }\n\n :host([inset][vertical]) {\n margin-top: 8px;\n margin-bottom: 8px;\n height: calc(100% - 16px);\n }\n`;\n\n","import { html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { MdBaseElement } from '../../internal/base-component.js';\nimport { dividerStyles } from './divider.css.js';\n\n@customElement('md-divider')\nexport class MdDivider extends MdBaseElement {\n static override styles = [MdBaseElement.styles, dividerStyles];\n\n @property({ type: Boolean, reflect: true })\n vertical = false;\n\n @property({ type: Boolean, reflect: true })\n inset = false;\n\n @property({ type: Boolean, reflect: true, attribute: 'inset-start' })\n insetStart = false;\n\n @property({ type: Boolean, reflect: true, attribute: 'inset-end' })\n insetEnd = false;\n\n override connectedCallback() {\n super.connectedCallback();\n this.setAttribute('role', 'separator');\n this.setAttribute('aria-orientation', this.vertical ? 'vertical' : 'horizontal');\n }\n\n override render() {\n return html``;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'md-divider': MdDivider;\n }\n}\n\n"],"mappings":";;;AAEA,IAAa,IAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GCIhB,IAAN,cAAwB,EAAc;AAAA;iBAIhC,KAAA,WAAA,IAGH,KAAA,QAAA,IAGK,KAAA,aAAA,IAGF,KAAA,WAAA;AAAA;;AAZc,SAAA,SAAA,CAAC,EAAc,QAAQ,CAAa;AAAA;EAc7D,oBAA6B;AAC3B,UAAM,kBAAkB,GACxB,KAAK,aAAa,QAAQ,WAAW,GACrC,KAAK,aAAa,oBAAoB,KAAK,WAAW,aAAa,YAAY;AAAA,EACjF;AAAA,EAEA,SAAkB;AAChB,WAAO;AAAA,EACT;AACF;AArBG,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAS,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,YAAA,MAAA;AAGzC,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAS,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,SAAA,MAAA;AAGzC,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAS,SAAS;AAAA,EAAM,WAAW;AAAc,CAAC,CAAA,GAAA,EAAA,WAAA,cAAA,MAAA;AAGnE,EAAA,CAAA,EAAS;AAAA,EAAE,MAAM;AAAA,EAAS,SAAS;AAAA,EAAM,WAAW;AAAY,CAAC,CAAA,GAAA,EAAA,WAAA,YAAA,MAAA;AAbnE,IAAA,EAAA,CAAA,EAAc,YAAY,CAAA,GAAA,CAAA"}