@ng-prism/core 22.6.0 → 22.7.0-beta.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 (377) hide show
  1. package/README.md +11 -9
  2. package/dist/app/canvas/canvas-bg.styles.d.ts +1 -1
  3. package/dist/app/canvas/canvas-bg.styles.d.ts.map +1 -1
  4. package/dist/app/canvas/canvas-bg.styles.js +1 -1
  5. package/dist/app/canvas/canvas-overlay-tokens.d.ts +12 -0
  6. package/dist/app/canvas/canvas-overlay-tokens.d.ts.map +1 -0
  7. package/dist/app/canvas/canvas-overlay-tokens.js +52 -0
  8. package/dist/app/canvas/prism-canvas-bg-pill.component.js +2 -2
  9. package/dist/app/canvas/prism-canvas-pin-row.component.js +2 -2
  10. package/dist/app/canvas/prism-canvas-rulers.component.d.ts +2 -0
  11. package/dist/app/canvas/prism-canvas-rulers.component.d.ts.map +1 -1
  12. package/dist/app/canvas/prism-canvas-rulers.component.js +17 -12
  13. package/dist/app/canvas/prism-canvas-toolbar.component.d.ts +3 -2
  14. package/dist/app/canvas/prism-canvas-toolbar.component.d.ts.map +1 -1
  15. package/dist/app/canvas/prism-canvas-toolbar.component.js +89 -97
  16. package/dist/app/canvas/prism-template-popover.component.d.ts.map +1 -1
  17. package/dist/app/canvas/prism-template-popover.component.js +16 -7
  18. package/dist/app/component-head/head-metrics.d.ts +35 -19
  19. package/dist/app/component-head/head-metrics.d.ts.map +1 -1
  20. package/dist/app/component-head/head-metrics.js +57 -27
  21. package/dist/app/component-head/pipe-facts.d.ts +9 -0
  22. package/dist/app/component-head/pipe-facts.d.ts.map +1 -0
  23. package/dist/app/component-head/pipe-facts.js +15 -0
  24. package/dist/app/component-head/prism-component-head.component.d.ts +19 -22
  25. package/dist/app/component-head/prism-component-head.component.d.ts.map +1 -1
  26. package/dist/app/component-head/prism-component-head.component.js +80 -96
  27. package/dist/app/component-head/prism-head-gauge.component.d.ts +8 -12
  28. package/dist/app/component-head/prism-head-gauge.component.d.ts.map +1 -1
  29. package/dist/app/component-head/prism-head-gauge.component.js +51 -67
  30. package/dist/app/component-head/prism-head-info.component.d.ts +13 -2
  31. package/dist/app/component-head/prism-head-info.component.d.ts.map +1 -1
  32. package/dist/app/component-head/prism-head-info.component.js +57 -16
  33. package/dist/app/component-head/prism-stat.component.d.ts +4 -5
  34. package/dist/app/component-head/prism-stat.component.d.ts.map +1 -1
  35. package/dist/app/component-head/prism-stat.component.js +16 -12
  36. package/dist/app/component-head/service-facts.d.ts +8 -0
  37. package/dist/app/component-head/service-facts.d.ts.map +1 -0
  38. package/dist/app/component-head/service-facts.js +11 -0
  39. package/dist/app/controls/boolean-control.component.js +2 -2
  40. package/dist/app/controls/json-control.component.js +2 -2
  41. package/dist/app/controls/union-control.component.js +4 -3
  42. package/dist/app/header/header-brand.d.ts +25 -0
  43. package/dist/app/header/header-brand.d.ts.map +1 -0
  44. package/dist/app/header/header-brand.js +10 -0
  45. package/dist/app/header/prism-header.component.d.ts +2 -2
  46. package/dist/app/header/prism-header.component.d.ts.map +1 -1
  47. package/dist/app/header/prism-header.component.js +73 -57
  48. package/dist/app/icons/icon-registry.d.ts.map +1 -1
  49. package/dist/app/icons/icon-registry.js +4 -1
  50. package/dist/app/index.d.ts +12 -0
  51. package/dist/app/index.d.ts.map +1 -1
  52. package/dist/app/index.js +12 -1
  53. package/dist/app/layout-menu/prism-layout-menu.component.d.ts +3 -0
  54. package/dist/app/layout-menu/prism-layout-menu.component.d.ts.map +1 -1
  55. package/dist/app/layout-menu/prism-layout-menu.component.js +72 -58
  56. package/dist/app/overview/open-in-playground.d.ts +8 -0
  57. package/dist/app/overview/open-in-playground.d.ts.map +1 -1
  58. package/dist/app/overview/open-in-playground.js +13 -0
  59. package/dist/app/overview/overview-matrix.d.ts +10 -4
  60. package/dist/app/overview/overview-matrix.d.ts.map +1 -1
  61. package/dist/app/overview/overview-matrix.js +3 -3
  62. package/dist/app/overview/prism-overview-cell.component.d.ts +6 -2
  63. package/dist/app/overview/prism-overview-cell.component.d.ts.map +1 -1
  64. package/dist/app/overview/prism-overview-cell.component.js +35 -24
  65. package/dist/app/overview/prism-overview-matrix.component.js +46 -55
  66. package/dist/app/page-renderer/prism-page-renderer.component.js +2 -2
  67. package/dist/app/panels/a11y/a11y-header-badge.component.d.ts +1 -4
  68. package/dist/app/panels/a11y/a11y-header-badge.component.d.ts.map +1 -1
  69. package/dist/app/panels/a11y/a11y-header-badge.component.js +8 -19
  70. package/dist/app/panels/a11y/a11y-keyboard-overlay.component.js +2 -2
  71. package/dist/app/panels/a11y/a11y-overlay-host.component.d.ts +1 -0
  72. package/dist/app/panels/a11y/a11y-overlay-host.component.d.ts.map +1 -1
  73. package/dist/app/panels/a11y/a11y-overlay-host.component.js +4 -3
  74. package/dist/app/panels/a11y/a11y-panel.component.d.ts +4 -1
  75. package/dist/app/panels/a11y/a11y-panel.component.d.ts.map +1 -1
  76. package/dist/app/panels/a11y/a11y-panel.component.js +32 -54
  77. package/dist/app/panels/a11y/a11y-score.component.d.ts +8 -3
  78. package/dist/app/panels/a11y/a11y-score.component.d.ts.map +1 -1
  79. package/dist/app/panels/a11y/a11y-score.component.js +19 -35
  80. package/dist/app/panels/a11y/a11y-sr-overlay.component.js +2 -2
  81. package/dist/app/panels/a11y/a11y-sr.component.js +2 -2
  82. package/dist/app/panels/a11y/a11y-summary.d.ts.map +1 -1
  83. package/dist/app/panels/a11y/a11y-summary.js +8 -1
  84. package/dist/app/panels/a11y/a11y-tree.component.js +2 -2
  85. package/dist/app/panels/a11y/a11y-violations.component.d.ts +23 -2
  86. package/dist/app/panels/a11y/a11y-violations.component.d.ts.map +1 -1
  87. package/dist/app/panels/a11y/a11y-violations.component.js +104 -89
  88. package/dist/app/panels/a11y/severity.d.ts +9 -0
  89. package/dist/app/panels/a11y/severity.d.ts.map +1 -0
  90. package/dist/app/panels/a11y/severity.js +12 -0
  91. package/dist/app/panels/controls/non-editable-input-types.d.ts +9 -1
  92. package/dist/app/panels/controls/non-editable-input-types.d.ts.map +1 -1
  93. package/dist/app/panels/controls/non-editable-input-types.js +18 -0
  94. package/dist/app/panels/controls/prism-controls-panel.component.d.ts +2 -1
  95. package/dist/app/panels/controls/prism-controls-panel.component.d.ts.map +1 -1
  96. package/dist/app/panels/controls/prism-controls-panel.component.js +77 -59
  97. package/dist/app/panels/events/prism-events-panel.component.d.ts +2 -0
  98. package/dist/app/panels/events/prism-events-panel.component.d.ts.map +1 -1
  99. package/dist/app/panels/events/prism-events-panel.component.js +20 -7
  100. package/dist/app/panels/events/prism-json-node.utils.d.ts +6 -0
  101. package/dist/app/panels/events/prism-json-node.utils.d.ts.map +1 -1
  102. package/dist/app/panels/events/prism-json-node.utils.js +8 -0
  103. package/dist/app/panels/panel-host/addon-panels.d.ts +11 -0
  104. package/dist/app/panels/panel-host/addon-panels.d.ts.map +1 -0
  105. package/dist/app/panels/panel-host/addon-panels.js +12 -0
  106. package/dist/app/panels/panel-host/panel-badge.d.ts +22 -0
  107. package/dist/app/panels/panel-host/panel-badge.d.ts.map +1 -1
  108. package/dist/app/panels/panel-host/panel-badge.js +56 -11
  109. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts +4 -1
  110. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts.map +1 -1
  111. package/dist/app/panels/panel-host/prism-panel-host.component.js +36 -70
  112. package/dist/app/renderer/composition.d.ts +20 -0
  113. package/dist/app/renderer/composition.d.ts.map +1 -0
  114. package/dist/app/renderer/composition.js +26 -0
  115. package/dist/app/renderer/input-bindings.d.ts +13 -1
  116. package/dist/app/renderer/input-bindings.d.ts.map +1 -1
  117. package/dist/app/renderer/input-bindings.js +22 -1
  118. package/dist/app/renderer/prism-renderer.component.d.ts +8 -1
  119. package/dist/app/renderer/prism-renderer.component.d.ts.map +1 -1
  120. package/dist/app/renderer/prism-renderer.component.js +40 -28
  121. package/dist/app/renderer/snippet-generator.d.ts +14 -2
  122. package/dist/app/renderer/snippet-generator.d.ts.map +1 -1
  123. package/dist/app/renderer/snippet-generator.js +137 -82
  124. package/dist/app/services/navigation-item.d.ts +10 -0
  125. package/dist/app/services/navigation-item.d.ts.map +1 -0
  126. package/dist/app/services/navigation-item.js +20 -0
  127. package/dist/app/services/navigation-item.types.d.ts +8 -0
  128. package/dist/app/services/navigation-item.types.d.ts.map +1 -1
  129. package/dist/app/services/prism-layout.service.d.ts +12 -0
  130. package/dist/app/services/prism-layout.service.d.ts.map +1 -1
  131. package/dist/app/services/prism-layout.service.js +17 -7
  132. package/dist/app/services/prism-manifest.service.d.ts +4 -0
  133. package/dist/app/services/prism-manifest.service.d.ts.map +1 -1
  134. package/dist/app/services/prism-manifest.service.js +4 -0
  135. package/dist/app/services/prism-navigation.service.d.ts +12 -0
  136. package/dist/app/services/prism-navigation.service.d.ts.map +1 -1
  137. package/dist/app/services/prism-navigation.service.js +85 -19
  138. package/dist/app/services/prism-panel.service.d.ts +7 -3
  139. package/dist/app/services/prism-panel.service.d.ts.map +1 -1
  140. package/dist/app/services/prism-panel.service.js +13 -4
  141. package/dist/app/services/prism-renderer.service.d.ts +6 -0
  142. package/dist/app/services/prism-renderer.service.d.ts.map +1 -1
  143. package/dist/app/services/prism-renderer.service.js +40 -6
  144. package/dist/app/services/prism-search.service.d.ts +4 -0
  145. package/dist/app/services/prism-search.service.d.ts.map +1 -1
  146. package/dist/app/services/prism-search.service.js +29 -6
  147. package/dist/app/services/prism-theme.service.d.ts +11 -3
  148. package/dist/app/services/prism-theme.service.d.ts.map +1 -1
  149. package/dist/app/services/prism-theme.service.js +27 -19
  150. package/dist/app/services/prism-url-state.service.d.ts.map +1 -1
  151. package/dist/app/services/prism-url-state.service.js +42 -4
  152. package/dist/app/shared/badge.types.d.ts +7 -0
  153. package/dist/app/shared/badge.types.d.ts.map +1 -0
  154. package/dist/app/shared/badge.types.js +9 -0
  155. package/dist/app/shared/brand-mark.d.ts +35 -0
  156. package/dist/app/shared/brand-mark.d.ts.map +1 -0
  157. package/dist/app/shared/brand-mark.js +52 -0
  158. package/dist/app/shared/metric-bar.d.ts +6 -0
  159. package/dist/app/shared/metric-bar.d.ts.map +1 -0
  160. package/dist/app/shared/metric-bar.js +7 -0
  161. package/dist/app/shared/prism-badge.component.d.ts +21 -0
  162. package/dist/app/shared/prism-badge.component.d.ts.map +1 -0
  163. package/dist/app/shared/prism-badge.component.js +68 -0
  164. package/dist/app/shared/prism-button.component.d.ts +12 -0
  165. package/dist/app/shared/prism-button.component.d.ts.map +1 -0
  166. package/dist/app/shared/prism-button.component.js +28 -0
  167. package/dist/app/shared/prism-icon-button.component.d.ts +17 -0
  168. package/dist/app/shared/prism-icon-button.component.d.ts.map +1 -0
  169. package/dist/app/shared/prism-icon-button.component.js +37 -0
  170. package/dist/app/shared/prism-list-row.component.d.ts +17 -0
  171. package/dist/app/shared/prism-list-row.component.d.ts.map +1 -0
  172. package/dist/app/shared/prism-list-row.component.js +57 -0
  173. package/dist/app/shared/prism-logo.component.d.ts +24 -0
  174. package/dist/app/shared/prism-logo.component.d.ts.map +1 -0
  175. package/dist/app/shared/prism-logo.component.js +77 -0
  176. package/dist/app/shared/prism-metric-badge.component.d.ts +9 -4
  177. package/dist/app/shared/prism-metric-badge.component.d.ts.map +1 -1
  178. package/dist/app/shared/prism-metric-badge.component.js +33 -12
  179. package/dist/app/shared/prism-metric-card.component.d.ts +30 -0
  180. package/dist/app/shared/prism-metric-card.component.d.ts.map +1 -0
  181. package/dist/app/shared/prism-metric-card.component.js +111 -0
  182. package/dist/app/shared/prism-panel-toolbar.component.d.ts +13 -0
  183. package/dist/app/shared/prism-panel-toolbar.component.d.ts.map +1 -0
  184. package/dist/app/shared/prism-panel-toolbar.component.js +28 -0
  185. package/dist/app/shared/prism-segmented.component.d.ts +25 -0
  186. package/dist/app/shared/prism-segmented.component.d.ts.map +1 -0
  187. package/dist/app/shared/prism-segmented.component.js +77 -0
  188. package/dist/app/shared/prism-tabs.component.d.ts +44 -0
  189. package/dist/app/shared/prism-tabs.component.d.ts.map +1 -0
  190. package/dist/app/shared/prism-tabs.component.js +134 -0
  191. package/dist/app/shared/roving-focus.d.ts +13 -0
  192. package/dist/app/shared/roving-focus.d.ts.map +1 -0
  193. package/dist/app/shared/roving-focus.js +34 -0
  194. package/dist/app/shell/prism-shell.component.d.ts +13 -0
  195. package/dist/app/shell/prism-shell.component.d.ts.map +1 -1
  196. package/dist/app/shell/prism-shell.component.js +57 -28
  197. package/dist/app/shell/should-select-first.d.ts +17 -0
  198. package/dist/app/shell/should-select-first.d.ts.map +1 -0
  199. package/dist/app/shell/should-select-first.js +13 -0
  200. package/dist/app/sidebar/navigation-decorations.d.ts +23 -1
  201. package/dist/app/sidebar/navigation-decorations.d.ts.map +1 -1
  202. package/dist/app/sidebar/navigation-decorations.js +33 -2
  203. package/dist/app/sidebar/prism-sidebar.component.d.ts +5 -15
  204. package/dist/app/sidebar/prism-sidebar.component.d.ts.map +1 -1
  205. package/dist/app/sidebar/prism-sidebar.component.js +89 -77
  206. package/dist/app/theme/deprecated-tokens.d.ts +15 -0
  207. package/dist/app/theme/deprecated-tokens.d.ts.map +1 -0
  208. package/dist/app/theme/deprecated-tokens.js +22 -0
  209. package/dist/app/theme/favicon.d.ts +3 -0
  210. package/dist/app/theme/favicon.d.ts.map +1 -0
  211. package/dist/app/theme/favicon.js +3 -0
  212. package/dist/app/theme/prism-default-theme.d.ts.map +1 -1
  213. package/dist/app/theme/prism-default-theme.js +116 -61
  214. package/dist/app/theme/resolve-theme-tokens.d.ts +29 -0
  215. package/dist/app/theme/resolve-theme-tokens.d.ts.map +1 -0
  216. package/dist/app/theme/resolve-theme-tokens.js +43 -0
  217. package/dist/app/variant-ribbon/prism-variant-ribbon.component.d.ts +4 -7
  218. package/dist/app/variant-ribbon/prism-variant-ribbon.component.d.ts.map +1 -1
  219. package/dist/app/variant-ribbon/prism-variant-ribbon.component.js +31 -69
  220. package/dist/app/view-tab-bar/next-view-id.d.ts +7 -1
  221. package/dist/app/view-tab-bar/next-view-id.d.ts.map +1 -1
  222. package/dist/app/view-tab-bar/next-view-id.js +9 -1
  223. package/dist/app/view-tab-bar/panel-inputs.d.ts +28 -0
  224. package/dist/app/view-tab-bar/panel-inputs.d.ts.map +1 -0
  225. package/dist/app/view-tab-bar/panel-inputs.js +41 -0
  226. package/dist/app/view-tab-bar/prism-view-panel-host.component.d.ts +2 -3
  227. package/dist/app/view-tab-bar/prism-view-panel-host.component.d.ts.map +1 -1
  228. package/dist/app/view-tab-bar/prism-view-panel-host.component.js +9 -9
  229. package/dist/app/view-tab-bar/prism-view-tab-bar.component.d.ts +6 -0
  230. package/dist/app/view-tab-bar/prism-view-tab-bar.component.d.ts.map +1 -1
  231. package/dist/app/view-tab-bar/prism-view-tab-bar.component.js +22 -29
  232. package/dist/builder/config-loader/deprecated-options.d.ts +4 -2
  233. package/dist/builder/config-loader/deprecated-options.d.ts.map +1 -1
  234. package/dist/builder/config-loader/deprecated-options.js +13 -2
  235. package/dist/builder/manifest/composition-wrapper.generator.d.ts +14 -0
  236. package/dist/builder/manifest/composition-wrapper.generator.d.ts.map +1 -0
  237. package/dist/builder/manifest/composition-wrapper.generator.js +66 -0
  238. package/dist/builder/manifest/host-parser.d.ts +2 -0
  239. package/dist/builder/manifest/host-parser.d.ts.map +1 -1
  240. package/dist/builder/manifest/host-parser.js +9 -4
  241. package/dist/builder/manifest/manifest-imports.d.ts +34 -0
  242. package/dist/builder/manifest/manifest-imports.d.ts.map +1 -0
  243. package/dist/builder/manifest/manifest-imports.js +91 -0
  244. package/dist/builder/manifest/runtime-manifest.generator.d.ts +13 -0
  245. package/dist/builder/manifest/runtime-manifest.generator.d.ts.map +1 -1
  246. package/dist/builder/manifest/runtime-manifest.generator.js +135 -64
  247. package/dist/builder/manifest/selector-element.d.ts +16 -0
  248. package/dist/builder/manifest/selector-element.d.ts.map +1 -0
  249. package/dist/builder/manifest/selector-element.js +46 -0
  250. package/dist/builder/manifest/template-literal.d.ts +3 -0
  251. package/dist/builder/manifest/template-literal.d.ts.map +1 -0
  252. package/dist/builder/manifest/template-literal.js +4 -0
  253. package/dist/builder/plugin-runner/plugin-runner.d.ts.map +1 -1
  254. package/dist/builder/plugin-runner/plugin-runner.js +29 -26
  255. package/dist/builder/scanner/api/angular-decorators.d.ts +84 -0
  256. package/dist/builder/scanner/api/angular-decorators.d.ts.map +1 -0
  257. package/dist/builder/scanner/api/angular-decorators.js +157 -0
  258. package/dist/builder/scanner/api/component-api.extractor.d.ts +13 -0
  259. package/dist/builder/scanner/api/component-api.extractor.d.ts.map +1 -0
  260. package/dist/builder/scanner/api/component-api.extractor.js +104 -0
  261. package/dist/builder/scanner/api/doc-tags.d.ts +13 -0
  262. package/dist/builder/scanner/api/doc-tags.d.ts.map +1 -0
  263. package/dist/builder/scanner/api/doc-tags.js +101 -0
  264. package/dist/builder/scanner/api/export-index.d.ts +18 -0
  265. package/dist/builder/scanner/api/export-index.d.ts.map +1 -0
  266. package/dist/builder/scanner/api/export-index.js +22 -0
  267. package/dist/builder/scanner/api/member.extractor.d.ts +90 -0
  268. package/dist/builder/scanner/api/member.extractor.d.ts.map +1 -0
  269. package/dist/builder/scanner/api/member.extractor.js +270 -0
  270. package/dist/builder/scanner/api/pipe-api.extractor.d.ts +12 -0
  271. package/dist/builder/scanner/api/pipe-api.extractor.d.ts.map +1 -0
  272. package/dist/builder/scanner/api/pipe-api.extractor.js +52 -0
  273. package/dist/builder/scanner/api/service-api.extractor.d.ts +14 -0
  274. package/dist/builder/scanner/api/service-api.extractor.d.ts.map +1 -0
  275. package/dist/builder/scanner/api/service-api.extractor.js +119 -0
  276. package/dist/builder/scanner/api/setup.reader.d.ts +26 -0
  277. package/dist/builder/scanner/api/setup.reader.d.ts.map +1 -0
  278. package/dist/builder/scanner/api/setup.reader.js +89 -0
  279. package/dist/builder/scanner/api/type-collector.d.ts +24 -0
  280. package/dist/builder/scanner/api/type-collector.d.ts.map +1 -0
  281. package/dist/builder/scanner/api/type-collector.js +211 -0
  282. package/dist/builder/scanner/ast-utils.d.ts +8 -0
  283. package/dist/builder/scanner/ast-utils.d.ts.map +1 -1
  284. package/dist/builder/scanner/ast-utils.js +37 -1
  285. package/dist/builder/scanner/class-hierarchy.d.ts +5 -3
  286. package/dist/builder/scanner/class-hierarchy.d.ts.map +1 -1
  287. package/dist/builder/scanner/class-hierarchy.js +12 -6
  288. package/dist/builder/scanner/component.scanner.d.ts +60 -6
  289. package/dist/builder/scanner/component.scanner.d.ts.map +1 -1
  290. package/dist/builder/scanner/component.scanner.js +209 -57
  291. package/dist/builder/scanner/composition/compose-template.d.ts +36 -0
  292. package/dist/builder/scanner/composition/compose-template.d.ts.map +1 -0
  293. package/dist/builder/scanner/composition/compose-template.js +187 -0
  294. package/dist/builder/scanner/composition/declarables.d.ts +54 -0
  295. package/dist/builder/scanner/composition/declarables.d.ts.map +1 -0
  296. package/dist/builder/scanner/composition/declarables.js +182 -0
  297. package/dist/builder/scanner/composition/match-declarables.d.ts +43 -0
  298. package/dist/builder/scanner/composition/match-declarables.d.ts.map +1 -0
  299. package/dist/builder/scanner/composition/match-declarables.js +131 -0
  300. package/dist/builder/scanner/composition/read-composition.d.ts +77 -0
  301. package/dist/builder/scanner/composition/read-composition.d.ts.map +1 -0
  302. package/dist/builder/scanner/composition/read-composition.js +302 -0
  303. package/dist/builder/scanner/composition/template-elements.d.ts +12 -0
  304. package/dist/builder/scanner/composition/template-elements.d.ts.map +1 -0
  305. package/dist/builder/scanner/composition/template-elements.js +41 -0
  306. package/dist/builder/scanner/index.d.ts +4 -0
  307. package/dist/builder/scanner/index.d.ts.map +1 -1
  308. package/dist/builder/scanner/index.js +2 -0
  309. package/dist/builder/scanner/input.extractor.d.ts +31 -2
  310. package/dist/builder/scanner/input.extractor.d.ts.map +1 -1
  311. package/dist/builder/scanner/input.extractor.js +52 -15
  312. package/dist/builder/scanner/pipe.scanner.d.ts +29 -0
  313. package/dist/builder/scanner/pipe.scanner.d.ts.map +1 -0
  314. package/dist/builder/scanner/pipe.scanner.js +65 -0
  315. package/dist/builder/scanner/scanner.d.ts +25 -1
  316. package/dist/builder/scanner/scanner.d.ts.map +1 -1
  317. package/dist/builder/scanner/scanner.js +60 -26
  318. package/dist/builder/scanner/service/angular-decorators.d.ts +80 -0
  319. package/dist/builder/scanner/service/angular-decorators.d.ts.map +1 -0
  320. package/dist/builder/scanner/service/angular-decorators.js +154 -0
  321. package/dist/builder/scanner/service/doc-tags.d.ts +13 -0
  322. package/dist/builder/scanner/service/doc-tags.d.ts.map +1 -0
  323. package/dist/builder/scanner/service/doc-tags.js +97 -0
  324. package/dist/builder/scanner/service/export-index.d.ts +18 -0
  325. package/dist/builder/scanner/service/export-index.d.ts.map +1 -0
  326. package/dist/builder/scanner/service/export-index.js +22 -0
  327. package/dist/builder/scanner/service/member.extractor.d.ts +65 -0
  328. package/dist/builder/scanner/service/member.extractor.d.ts.map +1 -0
  329. package/dist/builder/scanner/service/member.extractor.js +216 -0
  330. package/dist/builder/scanner/service/pipe-api.extractor.d.ts +12 -0
  331. package/dist/builder/scanner/service/pipe-api.extractor.d.ts.map +1 -0
  332. package/dist/builder/scanner/service/pipe-api.extractor.js +72 -0
  333. package/dist/builder/scanner/service/service-api.extractor.d.ts +14 -0
  334. package/dist/builder/scanner/service/service-api.extractor.d.ts.map +1 -0
  335. package/dist/builder/scanner/service/service-api.extractor.js +119 -0
  336. package/dist/builder/scanner/service/setup.reader.d.ts +26 -0
  337. package/dist/builder/scanner/service/setup.reader.d.ts.map +1 -0
  338. package/dist/builder/scanner/service/setup.reader.js +89 -0
  339. package/dist/builder/scanner/service/type-collector.d.ts +23 -0
  340. package/dist/builder/scanner/service/type-collector.d.ts.map +1 -0
  341. package/dist/builder/scanner/service/type-collector.js +210 -0
  342. package/dist/builder/scanner/service.scanner.d.ts +26 -0
  343. package/dist/builder/scanner/service.scanner.d.ts.map +1 -0
  344. package/dist/builder/scanner/service.scanner.js +61 -0
  345. package/dist/builder/scanner/showcase-diagnostics.d.ts +60 -1
  346. package/dist/builder/scanner/showcase-diagnostics.d.ts.map +1 -1
  347. package/dist/builder/scanner/showcase-diagnostics.js +114 -1
  348. package/dist/builder/shared/prism-pipeline.d.ts +6 -0
  349. package/dist/builder/shared/prism-pipeline.d.ts.map +1 -1
  350. package/dist/builder/shared/prism-pipeline.js +43 -5
  351. package/dist/decorator/index.d.ts +1 -1
  352. package/dist/decorator/index.d.ts.map +1 -1
  353. package/dist/decorator/showcase.types.d.ts +79 -9
  354. package/dist/decorator/showcase.types.d.ts.map +1 -1
  355. package/dist/plugin/index.d.ts +6 -1
  356. package/dist/plugin/index.d.ts.map +1 -1
  357. package/dist/plugin/index.js +4 -0
  358. package/dist/plugin/pipe.types.d.ts +36 -0
  359. package/dist/plugin/pipe.types.d.ts.map +1 -0
  360. package/dist/plugin/pipe.types.js +1 -0
  361. package/dist/plugin/plugin.types.d.ts +140 -3
  362. package/dist/plugin/plugin.types.d.ts.map +1 -1
  363. package/dist/plugin/service.types.d.ts +124 -0
  364. package/dist/plugin/service.types.d.ts.map +1 -0
  365. package/dist/plugin/service.types.js +1 -0
  366. package/dist/plugin/status.d.ts +27 -0
  367. package/dist/plugin/status.d.ts.map +1 -0
  368. package/dist/plugin/status.js +26 -0
  369. package/dist/shared/composition.d.ts +30 -0
  370. package/dist/shared/composition.d.ts.map +1 -0
  371. package/dist/shared/composition.js +29 -0
  372. package/dist/shared/pseudo-state.type.d.ts +2 -1
  373. package/dist/shared/pseudo-state.type.d.ts.map +1 -1
  374. package/dist/shared/void-elements.d.ts +3 -0
  375. package/dist/shared/void-elements.d.ts.map +1 -0
  376. package/dist/shared/void-elements.js +2 -0
  377. package/package.json +1 -1
@@ -1,12 +1,17 @@
1
+ import type { StatusTone } from '../../../plugin/status.js';
1
2
  import * as i0 from "@angular/core";
3
+ /**
4
+ * The a11y score as a ring, drawn in the status tone of the grade rather than
5
+ * the brand gradient: a rated value takes its verdict's colour everywhere. The
6
+ * figure itself is set by the metric card around it.
7
+ */
2
8
  export declare class A11yScoreComponent {
3
9
  readonly score: import("@angular/core").InputSignal<number>;
4
- readonly compact: import("@angular/core").InputSignal<boolean>;
5
- protected readonly gradientId: string;
10
+ readonly tone: import("@angular/core").InputSignal<StatusTone>;
6
11
  protected readonly R = 54;
7
12
  protected readonly CIRC: number;
8
13
  protected readonly dashOffset: import("@angular/core").Signal<number>;
9
14
  static ɵfac: i0.ɵɵFactoryDeclaration<A11yScoreComponent, never>;
10
- static ɵcmp: i0.ɵɵComponentDeclaration<A11yScoreComponent, "prism-a11y-score", never, { "score": { "alias": "score"; "required": true; "isSignal": true; }; "compact": { "alias": "compact"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
15
+ static ɵcmp: i0.ɵɵComponentDeclaration<A11yScoreComponent, "prism-a11y-score", never, { "score": { "alias": "score"; "required": true; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
11
16
  }
12
17
  //# sourceMappingURL=a11y-score.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"a11y-score.component.d.ts","sourceRoot":"","sources":["../../../../src/app/panels/a11y/a11y-score.component.ts"],"names":[],"mappings":";AAMA,qBAOa,kBAAkB;IAC3B,QAAQ,CAAC,KAAK,8CAA4B;IAC1C,QAAQ,CAAC,OAAO,+CAAgB;IAEhC,SAAS,CAAC,QAAQ,CAAC,UAAU,SAA0B;IACvD,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAK;IACzB,SAAS,CAAC,QAAQ,CAAC,IAAI,SAAiB;IAExC,SAAS,CAAC,QAAQ,CAAC,UAAU,yCAAwE;yCAR5F,kBAAkB;2CAAlB,kBAAkB;CAS9B"}
1
+ {"version":3,"file":"a11y-score.component.d.ts","sourceRoot":"","sources":["../../../../src/app/panels/a11y/a11y-score.component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;;AAK5D;;;;GAIG;AACH,qBAQa,kBAAkB;IAC3B,QAAQ,CAAC,KAAK,8CAA4B;IAC1C,QAAQ,CAAC,IAAI,kDAA2B;IAExC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAK;IACzB,SAAS,CAAC,QAAQ,CAAC,IAAI,SAAiB;IAExC,SAAS,CAAC,QAAQ,CAAC,UAAU,yCAAoG;yCAPxH,kBAAkB;2CAAlB,kBAAkB;CAQ9B"}
@@ -1,54 +1,38 @@
1
1
  import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
- function A11yScoreComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
4
- i0.ɵɵdomElementStart(0, "div", 7)(1, "div", 8);
5
- i0.ɵɵtext(2);
6
- i0.ɵɵdomElementEnd();
7
- i0.ɵɵdomElementStart(3, "div", 9);
8
- i0.ɵɵtext(4, "/ 100");
9
- i0.ɵɵdomElementEnd()();
10
- } if (rf & 2) {
11
- const ctx_r0 = i0.ɵɵnextContext();
12
- i0.ɵɵadvance(2);
13
- i0.ɵɵtextInterpolate(ctx_r0.score());
14
- } }
15
3
  const R = 54;
16
4
  const CIRCUMFERENCE = 2 * Math.PI * R;
17
- let nextId = 0;
5
+ /**
6
+ * The a11y score as a ring, drawn in the status tone of the grade rather than
7
+ * the brand gradient: a rated value takes its verdict's colour everywhere. The
8
+ * figure itself is set by the metric card around it.
9
+ */
18
10
  export class A11yScoreComponent {
19
11
  score = input.required(/* @ts-ignore */
20
12
  ...(ngDevMode ? [{ debugName: "score" }] : /* istanbul ignore next */ []));
21
- compact = input(false, /* @ts-ignore */
22
- ...(ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []));
23
- gradientId = `prism-sg-${nextId++}`;
13
+ tone = input('ok', /* @ts-ignore */
14
+ ...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
24
15
  R = R;
25
16
  CIRC = CIRCUMFERENCE;
26
- dashOffset = computed(() => CIRCUMFERENCE - (this.score() / 100) * CIRCUMFERENCE, /* @ts-ignore */
17
+ dashOffset = computed(() => CIRCUMFERENCE - (Math.max(0, Math.min(100, this.score())) / 100) * CIRCUMFERENCE, /* @ts-ignore */
27
18
  ...(ngDevMode ? [{ debugName: "dashOffset" }] : /* istanbul ignore next */ []));
28
19
  static ɵfac = function A11yScoreComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || A11yScoreComponent)(); };
29
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: A11yScoreComponent, selectors: [["prism-a11y-score"]], inputs: { score: [1, "score"], compact: [1, "compact"] }, decls: 9, vars: 7, consts: [[1, "score-ring"], ["viewBox", "0 0 128 128"], ["x1", "0", "y1", "0", "x2", "1", "y2", "1", 3, "id"], ["offset", "0%", 1, "gradient-start"], ["offset", "100%", 1, "gradient-end"], ["cx", "64", "cy", "64", 1, "track"], ["cx", "64", "cy", "64", 1, "fill"], [1, "score-val"], [1, "score-num"], [1, "score-max"]], template: function A11yScoreComponent_Template(rf, ctx) { if (rf & 1) {
30
- i0.ɵɵdomElementStart(0, "div", 0);
20
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: A11yScoreComponent, selectors: [["prism-a11y-score"]], hostAttrs: ["aria-hidden", "true"], hostVars: 1, hostBindings: function A11yScoreComponent_HostBindings(rf, ctx) { if (rf & 2) {
21
+ i0.ɵɵattribute("data-tone", ctx.tone());
22
+ } }, inputs: { score: [1, "score"], tone: [1, "tone"] }, decls: 3, vars: 4, consts: [["viewBox", "0 0 128 128"], ["cx", "64", "cy", "64", 1, "track"], ["cx", "64", "cy", "64", 1, "fill"]], template: function A11yScoreComponent_Template(rf, ctx) { if (rf & 1) {
31
23
  i0.ɵɵnamespaceSVG();
32
- i0.ɵɵdomElementStart(1, "svg", 1)(2, "defs")(3, "linearGradient", 2);
33
- i0.ɵɵdomElement(4, "stop", 3)(5, "stop", 4);
34
- i0.ɵɵdomElementEnd()();
35
- i0.ɵɵdomElement(6, "circle", 5)(7, "circle", 6);
36
- i0.ɵɵdomElementEnd();
37
- i0.ɵɵconditionalCreate(8, A11yScoreComponent_Conditional_8_Template, 5, 1, "div", 7);
24
+ i0.ɵɵdomElementStart(0, "svg", 0);
25
+ i0.ɵɵdomElement(1, "circle", 1)(2, "circle", 2);
38
26
  i0.ɵɵdomElementEnd();
39
27
  } if (rf & 2) {
40
- i0.ɵɵadvance(3);
41
- i0.ɵɵdomProperty("id", ctx.gradientId);
42
- i0.ɵɵadvance(3);
43
- i0.ɵɵattribute("r", ctx.R);
44
28
  i0.ɵɵadvance();
45
- i0.ɵɵattribute("r", ctx.R)("stroke-dasharray", ctx.CIRC)("stroke-dashoffset", ctx.dashOffset())("stroke", "url(#" + ctx.gradientId + ")");
29
+ i0.ɵɵattribute("r", ctx.R);
46
30
  i0.ɵɵadvance();
47
- i0.ɵɵconditional(!ctx.compact() ? 8 : -1);
48
- } }, styles: ["[_nghost-%COMP%] {\n display: inline-flex;\n}\n\n.score-ring[_ngcontent-%COMP%] {\n position: relative;\n width: 128px;\n height: 128px;\n}\n\n.compact[_nghost-%COMP%] .score-ring[_ngcontent-%COMP%], .compact [_nghost-%COMP%] .score-ring[_ngcontent-%COMP%], \n[style*='width:18px'][_nghost-%COMP%] .score-ring[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n}\n\n.score-ring[_ngcontent-%COMP%] svg[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n transform: rotate(-90deg);\n}\n\n.score-ring[_ngcontent-%COMP%] circle[_ngcontent-%COMP%] {\n fill: none;\n stroke-width: 10;\n}\n\n.track[_ngcontent-%COMP%] {\n stroke: var(--%NS%prism-input-bg);\n}\n\n.gradient-start[_ngcontent-%COMP%] {\n stop-color: var(--%NS%prism-primary);\n}\n\n.gradient-end[_ngcontent-%COMP%] {\n stop-color: var(--%NS%prism-accent);\n}\n\n.fill[_ngcontent-%COMP%] {\n stroke-linecap: round;\n transition: stroke-dashoffset 0.5s ease;\n}\n\n.score-val[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n gap: 0;\n align-items: center;\n justify-content: center;\n}\n\n.score-num[_ngcontent-%COMP%] {\n font-family: var(--%NS%font-mono);\n font-size: 30px;\n font-weight: 700;\n color: transparent;\n letter-spacing: -0.02em;\n background: linear-gradient(135deg, var(--%NS%prism-primary), var(--%NS%prism-accent));\n background-clip: text;\n}\n\n.score-max[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 500;\n color: var(--%NS%prism-text-ghost);\n}"] });
31
+ i0.ɵɵattribute("r", ctx.R)("stroke-dasharray", ctx.CIRC)("stroke-dashoffset", ctx.dashOffset());
32
+ } }, styles: ["[_nghost-%COMP%] {\n --%NS%prism-score-tone: var(--%NS%prism-success);\n\n display: inline-flex;\n flex: none;\n width: 40px;\n height: 40px;\n}\n\n[data-tone='warn'][_nghost-%COMP%] {\n --%NS%prism-score-tone: var(--%NS%prism-warn);\n}\n\n[data-tone='danger'][_nghost-%COMP%] {\n --%NS%prism-score-tone: var(--%NS%prism-danger);\n}\n\nsvg[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n transform: rotate(-90deg);\n}\n\ncircle[_ngcontent-%COMP%] {\n fill: none;\n stroke-width: 14;\n}\n\n.track[_ngcontent-%COMP%] {\n stroke: var(--%NS%prism-input-bg);\n}\n\n.fill[_ngcontent-%COMP%] {\n stroke: var(--%NS%prism-score-tone);\n stroke-linecap: round;\n transition: stroke-dashoffset 0.5s ease;\n}"] });
49
33
  }
50
34
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(A11yScoreComponent, [{
51
35
  type: Component,
52
- args: [{ selector: 'prism-a11y-score', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"score-ring\">\n <svg viewBox=\"0 0 128 128\">\n <defs>\n <linearGradient\n [id]=\"gradientId\"\n x1=\"0\"\n y1=\"0\"\n x2=\"1\"\n y2=\"1\">\n <stop\n offset=\"0%\"\n class=\"gradient-start\" />\n <stop\n offset=\"100%\"\n class=\"gradient-end\" />\n </linearGradient>\n </defs>\n <circle\n class=\"track\"\n cx=\"64\"\n cy=\"64\"\n [attr.r]=\"R\" />\n <circle\n class=\"fill\"\n cx=\"64\"\n cy=\"64\"\n [attr.r]=\"R\"\n [attr.stroke-dasharray]=\"CIRC\"\n [attr.stroke-dashoffset]=\"dashOffset()\"\n [attr.stroke]=\"'url(#' + gradientId + ')'\" />\n </svg>\n @if (!compact()) {\n <div class=\"score-val\">\n <div class=\"score-num\">{{ score() }}</div>\n <div class=\"score-max\">/ 100</div>\n </div>\n }\n</div>\n", styles: [":host {\n display: inline-flex;\n}\n\n.score-ring {\n position: relative;\n width: 128px;\n height: 128px;\n}\n\n:host-context(.compact) .score-ring,\n:host([style*='width:18px']) .score-ring {\n width: 100%;\n height: 100%;\n}\n\n.score-ring svg {\n width: 100%;\n height: 100%;\n transform: rotate(-90deg);\n}\n\n.score-ring circle {\n fill: none;\n stroke-width: 10;\n}\n\n.track {\n stroke: var(--prism-input-bg);\n}\n\n.gradient-start {\n stop-color: var(--prism-primary);\n}\n\n.gradient-end {\n stop-color: var(--prism-accent);\n}\n\n.fill {\n stroke-linecap: round;\n transition: stroke-dashoffset 0.5s ease;\n}\n\n.score-val {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n gap: 0;\n align-items: center;\n justify-content: center;\n}\n\n.score-num {\n font-family: var(--font-mono);\n font-size: 30px;\n font-weight: 700;\n color: transparent;\n letter-spacing: -0.02em;\n background: linear-gradient(135deg, var(--prism-primary), var(--prism-accent));\n background-clip: text;\n}\n\n.score-max {\n font-size: 11px;\n font-weight: 500;\n color: var(--prism-text-ghost);\n}\n"] }]
53
- }], null, { score: [{ type: i0.Input, args: [{ isSignal: true, alias: "score", required: true }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }] }); })();
54
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(A11yScoreComponent, { className: "A11yScoreComponent", filePath: "app/panels/a11y/a11y-score.component.ts", lineNumber: 14 }); })();
36
+ args: [{ selector: 'prism-a11y-score', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: { '[attr.data-tone]': 'tone()', 'aria-hidden': 'true' }, template: "<svg viewBox=\"0 0 128 128\">\n <circle\n class=\"track\"\n cx=\"64\"\n cy=\"64\"\n [attr.r]=\"R\" />\n <circle\n class=\"fill\"\n cx=\"64\"\n cy=\"64\"\n [attr.r]=\"R\"\n [attr.stroke-dasharray]=\"CIRC\"\n [attr.stroke-dashoffset]=\"dashOffset()\" />\n</svg>\n", styles: [":host {\n --prism-score-tone: var(--prism-success);\n\n display: inline-flex;\n flex: none;\n width: 40px;\n height: 40px;\n}\n\n:host([data-tone='warn']) {\n --prism-score-tone: var(--prism-warn);\n}\n\n:host([data-tone='danger']) {\n --prism-score-tone: var(--prism-danger);\n}\n\nsvg {\n width: 100%;\n height: 100%;\n transform: rotate(-90deg);\n}\n\ncircle {\n fill: none;\n stroke-width: 14;\n}\n\n.track {\n stroke: var(--prism-input-bg);\n}\n\n.fill {\n stroke: var(--prism-score-tone);\n stroke-linecap: round;\n transition: stroke-dashoffset 0.5s ease;\n}\n"] }]
37
+ }], null, { score: [{ type: i0.Input, args: [{ isSignal: true, alias: "score", required: true }] }], tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }] }); })();
38
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(A11yScoreComponent, { className: "A11yScoreComponent", filePath: "app/panels/a11y/a11y-score.component.ts", lineNumber: 20 }); })();
@@ -100,10 +100,10 @@ export class A11ySrOverlayComponent {
100
100
  i0.ɵɵconditionalCreate(0, A11ySrOverlayComponent_Conditional_0_Template, 2, 0);
101
101
  } if (rf & 2) {
102
102
  i0.ɵɵconditional(ctx.showOverlay() ? 0 : -1);
103
- } }, styles: ["[_nghost-%COMP%] {\n position: absolute;\n inset: 0;\n z-index: 100;\n overflow: hidden;\n pointer-events: none;\n}\n\n.prism-a11y-sr-ov__focus[_ngcontent-%COMP%] {\n position: absolute;\n background: rgb(167 139 250 / 8%);\n border: 2px solid var(--%NS%prism-primary);\n border-radius: 4px;\n box-shadow: 0 0 0 4px rgb(167 139 250 / 12%);\n}\n\n.prism-a11y-sr-ov__badge[_ngcontent-%COMP%] {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n font-family: var(--%NS%prism-font-sans, system-ui, sans-serif);\n font-size: 9px;\n font-weight: 700;\n color: white;\n background: var(--%NS%prism-primary);\n border-radius: 9px;\n box-shadow:\n 0 0 0 1.5px white,\n 0 2px 4px rgb(0 0 0 / 25%);\n}\n\n.prism-a11y-sr-ov__badge--active[_ngcontent-%COMP%] {\n background: var(--%NS%prism-primary-from);\n box-shadow:\n 0 0 0 2px white,\n 0 0 0 4px rgb(124 58 237 / 40%);\n}"] });
103
+ } }, styles: ["[_nghost-%COMP%] {\n position: absolute;\n inset: 0;\n z-index: 100;\n overflow: hidden;\n pointer-events: none;\n}\n\n.prism-a11y-sr-ov__focus[_ngcontent-%COMP%] {\n position: absolute;\n background: color-mix(in srgb, var(--%NS%prism-primary-fill) 8%, transparent);\n border: 2px solid var(--%NS%prism-primary-fill);\n border-radius: 4px;\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--%NS%prism-primary-fill) 12%, transparent);\n}\n\n.prism-a11y-sr-ov__badge[_ngcontent-%COMP%] {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n font-family: var(--%NS%prism-font-sans, system-ui, sans-serif);\n font-size: 9px;\n font-weight: 700;\n color: var(--%NS%prism-on-primary);\n background: var(--%NS%prism-primary-fill);\n border-radius: 9px;\n box-shadow:\n 0 0 0 1.5px var(--%NS%prism-on-primary),\n var(--%NS%prism-shadow-sm);\n}\n\n.prism-a11y-sr-ov__badge--active[_ngcontent-%COMP%] {\n background: var(--%NS%prism-primary-fill-hover);\n box-shadow:\n 0 0 0 2px var(--%NS%prism-on-primary),\n 0 0 0 4px color-mix(in srgb, var(--%NS%prism-primary-fill) 40%, transparent);\n}"] });
104
104
  }
105
105
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(A11ySrOverlayComponent, [{
106
106
  type: Component,
107
- args: [{ selector: 'prism-a11y-sr-overlay', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (showOverlay()) {\n @for (badge of badges(); track badge.index) {\n @if (badge.isActive) {\n <div\n class=\"prism-a11y-sr-ov__focus\"\n [style.left.px]=\"badge.x\"\n [style.top.px]=\"badge.y\"\n [style.width.px]=\"badge.width\"\n [style.height.px]=\"badge.height\"></div>\n }\n <div\n class=\"prism-a11y-sr-ov__badge\"\n [class.prism-a11y-sr-ov__badge--active]=\"badge.isActive\"\n [style.left.px]=\"badge.x - 10\"\n [style.top.px]=\"badge.y - 10\">\n {{ badge.index }}\n </div>\n }\n}\n", styles: [":host {\n position: absolute;\n inset: 0;\n z-index: 100;\n overflow: hidden;\n pointer-events: none;\n}\n\n.prism-a11y-sr-ov__focus {\n position: absolute;\n background: rgb(167 139 250 / 8%);\n border: 2px solid var(--prism-primary);\n border-radius: 4px;\n box-shadow: 0 0 0 4px rgb(167 139 250 / 12%);\n}\n\n.prism-a11y-sr-ov__badge {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n font-family: var(--prism-font-sans, system-ui, sans-serif);\n font-size: 9px;\n font-weight: 700;\n color: white;\n background: var(--prism-primary);\n border-radius: 9px;\n box-shadow:\n 0 0 0 1.5px white,\n 0 2px 4px rgb(0 0 0 / 25%);\n}\n\n.prism-a11y-sr-ov__badge--active {\n background: var(--prism-primary-from);\n box-shadow:\n 0 0 0 2px white,\n 0 0 0 4px rgb(124 58 237 / 40%);\n}\n"] }]
107
+ args: [{ selector: 'prism-a11y-sr-overlay', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (showOverlay()) {\n @for (badge of badges(); track badge.index) {\n @if (badge.isActive) {\n <div\n class=\"prism-a11y-sr-ov__focus\"\n [style.left.px]=\"badge.x\"\n [style.top.px]=\"badge.y\"\n [style.width.px]=\"badge.width\"\n [style.height.px]=\"badge.height\"></div>\n }\n <div\n class=\"prism-a11y-sr-ov__badge\"\n [class.prism-a11y-sr-ov__badge--active]=\"badge.isActive\"\n [style.left.px]=\"badge.x - 10\"\n [style.top.px]=\"badge.y - 10\">\n {{ badge.index }}\n </div>\n }\n}\n", styles: [":host {\n position: absolute;\n inset: 0;\n z-index: 100;\n overflow: hidden;\n pointer-events: none;\n}\n\n.prism-a11y-sr-ov__focus {\n position: absolute;\n background: color-mix(in srgb, var(--prism-primary-fill) 8%, transparent);\n border: 2px solid var(--prism-primary-fill);\n border-radius: 4px;\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--prism-primary-fill) 12%, transparent);\n}\n\n.prism-a11y-sr-ov__badge {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n font-family: var(--prism-font-sans, system-ui, sans-serif);\n font-size: 9px;\n font-weight: 700;\n color: var(--prism-on-primary);\n background: var(--prism-primary-fill);\n border-radius: 9px;\n box-shadow:\n 0 0 0 1.5px var(--prism-on-primary),\n var(--prism-shadow-sm);\n}\n\n.prism-a11y-sr-ov__badge--active {\n background: var(--prism-primary-fill-hover);\n box-shadow:\n 0 0 0 2px var(--prism-on-primary),\n 0 0 0 4px color-mix(in srgb, var(--prism-primary-fill) 40%, transparent);\n}\n"] }]
108
108
  }], () => [], null); })();
109
109
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(A11ySrOverlayComponent, { className: "A11ySrOverlayComponent", filePath: "app/panels/a11y/a11y-sr-overlay.component.ts", lineNumber: 23 }); })();
@@ -77,10 +77,10 @@ export class A11ySrComponent {
77
77
  i0.ɵɵconditionalCreate(0, A11ySrComponent_Conditional_0_Template, 2, 0, "div", 0)(1, A11ySrComponent_Conditional_1_Template, 2, 0, "div", 0)(2, A11ySrComponent_Conditional_2_Template, 3, 0, "div", 1);
78
78
  } if (rf & 2) {
79
79
  i0.ɵɵconditional(!ctx.rendererService.renderedElement() ? 0 : !ctx.announcements().length ? 1 : 2);
80
- } }, styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n overflow: auto;\n}\n\n.sr-empty[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100px;\n font-size: 13px;\n color: var(--%NS%prism-text-muted);\n}\n\n.sr-body[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 16px 20px;\n}\n\n.sr-line[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 56px 1fr;\n gap: 12px;\n padding: 10px 12px;\n background: var(--%NS%prism-bg-surface);\n border: 1px solid var(--%NS%prism-border);\n border-radius: 8px;\n}\n\n.sr-step[_ngcontent-%COMP%] {\n font-family: var(--%NS%font-mono);\n font-size: 11px;\n font-weight: 600;\n color: var(--%NS%prism-text-ghost);\n}\n\n.sr-text[_ngcontent-%COMP%] {\n font-size: 13px;\n line-height: 1.5;\n color: var(--%NS%prism-text);\n}\n\n.sr-name[_ngcontent-%COMP%] {\n font-style: normal;\n font-weight: 600;\n color: var(--%NS%prism-primary);\n}\n\n.sr-text[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n padding: 1px 5px;\n font-family: var(--%NS%font-mono);\n font-size: 11.5px;\n color: var(--%NS%prism-text-muted);\n background: var(--%NS%prism-input-bg);\n border-radius: var(--%NS%radius-xs);\n}"] });
80
+ } }, styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n overflow: auto;\n}\n\n.sr-empty[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100px;\n font-size: 13px;\n color: var(--%NS%prism-text-muted);\n}\n\n.sr-body[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 16px 20px;\n}\n\n.sr-line[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 56px 1fr;\n gap: 12px;\n padding: 10px 12px;\n background: var(--%NS%prism-bg-surface);\n border: 1px solid var(--%NS%prism-border);\n border-radius: 8px;\n}\n\n.sr-step[_ngcontent-%COMP%] {\n font-family: var(--%NS%font-mono);\n font-size: 11px;\n font-weight: 600;\n color: var(--%NS%prism-text-muted);\n}\n\n.sr-text[_ngcontent-%COMP%] {\n font-size: 13px;\n line-height: 1.5;\n color: var(--%NS%prism-text);\n}\n\n.sr-name[_ngcontent-%COMP%] {\n font-style: normal;\n font-weight: 600;\n color: var(--%NS%prism-primary);\n}\n\n.sr-text[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n padding: 1px 5px;\n font-family: var(--%NS%font-mono);\n font-size: 11.5px;\n color: var(--%NS%prism-text-muted);\n background: var(--%NS%prism-input-bg);\n border-radius: var(--%NS%radius-xs);\n}"] });
81
81
  }
82
82
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(A11ySrComponent, [{
83
83
  type: Component,
84
- args: [{ selector: 'prism-a11y-sr', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!rendererService.renderedElement()) {\n <div class=\"sr-empty\"> Select a component to simulate screen reader output. </div>\n} @else if (!announcements().length) {\n <div class=\"sr-empty\">No announced elements found.</div>\n} @else {\n <div class=\"sr-body\">\n @for (a of announcements(); track a.index) {\n <div class=\"sr-line\">\n <div class=\"sr-step\">VO \u00B7 {{ a.index }}</div>\n <div class=\"sr-text\">\n @if (a.name) {\n \"<span class=\"sr-name\">{{ a.name }}</span\n >\",\n }\n <code>{{ a.role }}</code>\n @if (a.states.length) {\n \u00B7 {{ a.states.join(', ') }}\n }\n </div>\n </div>\n }\n </div>\n}\n", styles: [":host {\n display: block;\n height: 100%;\n overflow: auto;\n}\n\n.sr-empty {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100px;\n font-size: 13px;\n color: var(--prism-text-muted);\n}\n\n.sr-body {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 16px 20px;\n}\n\n.sr-line {\n display: grid;\n grid-template-columns: 56px 1fr;\n gap: 12px;\n padding: 10px 12px;\n background: var(--prism-bg-surface);\n border: 1px solid var(--prism-border);\n border-radius: 8px;\n}\n\n.sr-step {\n font-family: var(--font-mono);\n font-size: 11px;\n font-weight: 600;\n color: var(--prism-text-ghost);\n}\n\n.sr-text {\n font-size: 13px;\n line-height: 1.5;\n color: var(--prism-text);\n}\n\n.sr-name {\n font-style: normal;\n font-weight: 600;\n color: var(--prism-primary);\n}\n\n.sr-text code {\n padding: 1px 5px;\n font-family: var(--font-mono);\n font-size: 11.5px;\n color: var(--prism-text-muted);\n background: var(--prism-input-bg);\n border-radius: var(--radius-xs);\n}\n"] }]
84
+ args: [{ selector: 'prism-a11y-sr', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!rendererService.renderedElement()) {\n <div class=\"sr-empty\"> Select a component to simulate screen reader output. </div>\n} @else if (!announcements().length) {\n <div class=\"sr-empty\">No announced elements found.</div>\n} @else {\n <div class=\"sr-body\">\n @for (a of announcements(); track a.index) {\n <div class=\"sr-line\">\n <div class=\"sr-step\">VO \u00B7 {{ a.index }}</div>\n <div class=\"sr-text\">\n @if (a.name) {\n \"<span class=\"sr-name\">{{ a.name }}</span\n >\",\n }\n <code>{{ a.role }}</code>\n @if (a.states.length) {\n \u00B7 {{ a.states.join(', ') }}\n }\n </div>\n </div>\n }\n </div>\n}\n", styles: [":host {\n display: block;\n height: 100%;\n overflow: auto;\n}\n\n.sr-empty {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100px;\n font-size: 13px;\n color: var(--prism-text-muted);\n}\n\n.sr-body {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 16px 20px;\n}\n\n.sr-line {\n display: grid;\n grid-template-columns: 56px 1fr;\n gap: 12px;\n padding: 10px 12px;\n background: var(--prism-bg-surface);\n border: 1px solid var(--prism-border);\n border-radius: 8px;\n}\n\n.sr-step {\n font-family: var(--font-mono);\n font-size: 11px;\n font-weight: 600;\n color: var(--prism-text-muted);\n}\n\n.sr-text {\n font-size: 13px;\n line-height: 1.5;\n color: var(--prism-text);\n}\n\n.sr-name {\n font-style: normal;\n font-weight: 600;\n color: var(--prism-primary);\n}\n\n.sr-text code {\n padding: 1px 5px;\n font-family: var(--font-mono);\n font-size: 11.5px;\n color: var(--prism-text-muted);\n background: var(--prism-input-bg);\n border-radius: var(--radius-xs);\n}\n"] }]
85
85
  }], null, null); })();
86
86
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(A11ySrComponent, { className: "A11ySrComponent", filePath: "app/panels/a11y/a11y-sr.component.ts", lineNumber: 12 }); })();
@@ -1 +1 @@
1
- {"version":3,"file":"a11y-summary.d.ts","sourceRoot":"","sources":["../../../../src/app/panels/a11y/a11y-summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE1F;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,GAAG,WAAW,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAmB/H"}
1
+ {"version":3,"file":"a11y-summary.d.ts","sourceRoot":"","sources":["../../../../src/app/panels/a11y/a11y-summary.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE1F;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,GAAG,WAAW,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CA2B/H"}
@@ -1,3 +1,4 @@
1
+ import { statusFor, thresholdFromTarget } from '../../../plugin/status.js';
1
2
  /**
2
3
  * A component's standing, derived with the same precedence
3
4
  * `checkA11yThresholds` uses library-wide.
@@ -22,7 +23,13 @@ export function deriveA11ySummary(score, thresholds) {
22
23
  const label = parts.length > 0 ? `A11y: ${parts.join(', ')}` : `A11y score ${score.score}`;
23
24
  return { variant: 'danger', label };
24
25
  }
25
- if (score.moderate > thresholds.moderate || score.score < thresholds.score) {
26
+ // The score is graded like every other key figure: ok from the target,
27
+ // warn down to 0.75 of it, critical below that.
28
+ const scoreTone = statusFor(score.score, thresholdFromTarget(thresholds.score));
29
+ if (scoreTone === 'danger') {
30
+ return { variant: 'danger', label: `A11y score ${score.score}` };
31
+ }
32
+ if (score.moderate > thresholds.moderate || scoreTone === 'warn') {
26
33
  return { variant: 'warn', label: `A11y score ${score.score}` };
27
34
  }
28
35
  return { variant: 'ok', label: `A11y score ${score.score}` };
@@ -133,11 +133,11 @@ export class A11yTreeNodeComponent {
133
133
  i0.ɵɵrepeater(ctx.stateEntries());
134
134
  i0.ɵɵadvance(2);
135
135
  i0.ɵɵconditional(ctx.expanded() && ctx.node().children.length ? 9 : -1);
136
- } }, dependencies: [A11yTreeNodeComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n}\n\n.aria-tree-line[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n align-items: center;\n padding: 2px 0;\n font-family: var(--%NS%font-mono);\n font-size: 12.5px;\n line-height: 1.8;\n color: var(--%NS%prism-text-2);\n}\n\n.aria-tree-line--hidden[_ngcontent-%COMP%] {\n opacity: 0.4;\n}\n\n.indent[_ngcontent-%COMP%] {\n flex-shrink: 0;\n font-size: 12px;\n color: var(--%NS%prism-text-ghost);\n text-align: right;\n white-space: pre;\n user-select: none;\n opacity: 0.5;\n}\n\n.tree-toggle[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 12px;\n padding: 0;\n font-size: 10px;\n color: var(--%NS%prism-text-muted);\n cursor: pointer;\n background: none;\n border: none;\n}\n\n.role[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--%NS%prism-primary);\n}\n\n.name[_ngcontent-%COMP%] {\n color: var(--%NS%prism-text);\n}\n\n.attr[_ngcontent-%COMP%] {\n color: var(--%NS%prism-text-ghost);\n}"] });
136
+ } }, dependencies: [A11yTreeNodeComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n}\n\n.aria-tree-line[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n align-items: center;\n padding: 2px 0;\n font-family: var(--%NS%font-mono);\n font-size: 12.5px;\n line-height: 1.8;\n color: var(--%NS%prism-text-2);\n}\n\n.aria-tree-line--hidden[_ngcontent-%COMP%] {\n opacity: 0.4;\n}\n\n.indent[_ngcontent-%COMP%] {\n flex-shrink: 0;\n font-size: 12px;\n color: var(--%NS%prism-text-ghost);\n text-align: right;\n white-space: pre;\n user-select: none;\n opacity: 0.5;\n}\n\n.tree-toggle[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 12px;\n padding: 0;\n font-size: 10px;\n color: var(--%NS%prism-text-muted);\n cursor: pointer;\n background: none;\n border: none;\n}\n\n.role[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--%NS%prism-primary);\n}\n\n.name[_ngcontent-%COMP%] {\n color: var(--%NS%prism-text);\n}\n\n.attr[_ngcontent-%COMP%] {\n color: var(--%NS%prism-text-muted);\n}"] });
137
137
  }
138
138
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(A11yTreeNodeComponent, [{
139
139
  type: Component,
140
- args: [{ selector: 'prism-a11y-tree-node', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"aria-tree-line\"\n [class.aria-tree-line--hidden]=\"node().hidden\">\n <span\n class=\"indent\"\n [style.width.px]=\"depth() * 20\">\n @if (depth() > 0) {\n {{ isLast() ? '\u2514\u2500' : '\u251C\u2500' }}\n }\n </span>\n @if (node().children.length) {\n <button\n class=\"tree-toggle\"\n (click)=\"toggleExpanded()\">\n {{ expanded() ? '\u25BE' : '\u25B8' }}\n </button>\n }\n <span class=\"role\">{{ node().role }}</span>\n @if (node().name) {\n <span class=\"name\">\"{{ node().name }}\"</span>\n }\n @for (entry of stateEntries(); track entry.key) {\n <span class=\"attr\">[{{ entry.label }}]</span>\n }\n</div>\n@if (expanded() && node().children.length) {\n @for (child of node().children; track child.element; let last = $last) {\n <prism-a11y-tree-node\n [node]=\"child\"\n [depth]=\"depth() + 1\"\n [isLast]=\"last\" />\n }\n}\n", styles: [":host {\n display: block;\n}\n\n.aria-tree-line {\n display: flex;\n gap: 8px;\n align-items: center;\n padding: 2px 0;\n font-family: var(--font-mono);\n font-size: 12.5px;\n line-height: 1.8;\n color: var(--prism-text-2);\n}\n\n.aria-tree-line--hidden {\n opacity: 0.4;\n}\n\n.indent {\n flex-shrink: 0;\n font-size: 12px;\n color: var(--prism-text-ghost);\n text-align: right;\n white-space: pre;\n user-select: none;\n opacity: 0.5;\n}\n\n.tree-toggle {\n flex-shrink: 0;\n width: 12px;\n padding: 0;\n font-size: 10px;\n color: var(--prism-text-muted);\n cursor: pointer;\n background: none;\n border: none;\n}\n\n.role {\n font-weight: 600;\n color: var(--prism-primary);\n}\n\n.name {\n color: var(--prism-text);\n}\n\n.attr {\n color: var(--prism-text-ghost);\n}\n"] }]
140
+ args: [{ selector: 'prism-a11y-tree-node', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"aria-tree-line\"\n [class.aria-tree-line--hidden]=\"node().hidden\">\n <span\n class=\"indent\"\n [style.width.px]=\"depth() * 20\">\n @if (depth() > 0) {\n {{ isLast() ? '\u2514\u2500' : '\u251C\u2500' }}\n }\n </span>\n @if (node().children.length) {\n <button\n class=\"tree-toggle\"\n (click)=\"toggleExpanded()\">\n {{ expanded() ? '\u25BE' : '\u25B8' }}\n </button>\n }\n <span class=\"role\">{{ node().role }}</span>\n @if (node().name) {\n <span class=\"name\">\"{{ node().name }}\"</span>\n }\n @for (entry of stateEntries(); track entry.key) {\n <span class=\"attr\">[{{ entry.label }}]</span>\n }\n</div>\n@if (expanded() && node().children.length) {\n @for (child of node().children; track child.element; let last = $last) {\n <prism-a11y-tree-node\n [node]=\"child\"\n [depth]=\"depth() + 1\"\n [isLast]=\"last\" />\n }\n}\n", styles: [":host {\n display: block;\n}\n\n.aria-tree-line {\n display: flex;\n gap: 8px;\n align-items: center;\n padding: 2px 0;\n font-family: var(--font-mono);\n font-size: 12.5px;\n line-height: 1.8;\n color: var(--prism-text-2);\n}\n\n.aria-tree-line--hidden {\n opacity: 0.4;\n}\n\n.indent {\n flex-shrink: 0;\n font-size: 12px;\n color: var(--prism-text-ghost);\n text-align: right;\n white-space: pre;\n user-select: none;\n opacity: 0.5;\n}\n\n.tree-toggle {\n flex-shrink: 0;\n width: 12px;\n padding: 0;\n font-size: 10px;\n color: var(--prism-text-muted);\n cursor: pointer;\n background: none;\n border: none;\n}\n\n.role {\n font-weight: 600;\n color: var(--prism-primary);\n}\n\n.name {\n color: var(--prism-text);\n}\n\n.attr {\n color: var(--prism-text-muted);\n}\n"] }]
141
141
  }], () => [], { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }], depth: [{ type: i0.Input, args: [{ isSignal: true, alias: "depth", required: false }] }], isLast: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLast", required: false }] }] }); })();
142
142
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(A11yTreeNodeComponent, { className: "A11yTreeNodeComponent", filePath: "app/panels/a11y/a11y-tree.component.ts", lineNumber: 13 }); })();
143
143
  export class A11yTreeComponent {
@@ -1,10 +1,31 @@
1
1
  import { A11yAuditService } from './a11y-audit.service.js';
2
2
  import * as i0 from "@angular/core";
3
+ /**
4
+ * The Violations view: the score as a small metric card with a ring in its
5
+ * grade's tone, the violations as list rows, most severe first, and the passed
6
+ * checks folded away below them.
7
+ */
3
8
  export declare class A11yViolationsComponent {
4
9
  protected readonly auditService: A11yAuditService;
10
+ private readonly manifest;
11
+ private readonly config;
5
12
  protected readonly scoreResult: import("@angular/core").Signal<import("./a11y.types.js").A11yScoreResult | null>;
6
- protected readonly allResults: import("@angular/core").Signal<import("axe-core").Result[]>;
7
- protected sevColor(impact: string | null | undefined): string;
13
+ private readonly thresholds;
14
+ /** The score's grade, by the rule every other a11y surface uses. */
15
+ protected readonly grade: import("@angular/core").Signal<"ok" | "warn" | "danger">;
16
+ protected readonly badgeTone: import("@angular/core").Signal<import("../../shared/badge.types.js").BadgeTone>;
17
+ protected readonly scoreTitle: import("@angular/core").Signal<string>;
18
+ protected readonly violations: import("@angular/core").Signal<{
19
+ badge: import("./severity.js").SeverityBadge;
20
+ description: string;
21
+ help: string;
22
+ helpUrl: string;
23
+ id: string;
24
+ impact?: import("axe-core").ImpactValue;
25
+ tags: import("axe-core").TagValue[];
26
+ nodes: import("axe-core").NodeResult[];
27
+ }[]>;
28
+ protected readonly passes: import("@angular/core").Signal<import("axe-core").Result[]>;
8
29
  static ɵfac: i0.ɵɵFactoryDeclaration<A11yViolationsComponent, never>;
9
30
  static ɵcmp: i0.ɵɵComponentDeclaration<A11yViolationsComponent, "prism-a11y-violations", never, {}, {}, never, never, true, never>;
10
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"a11y-violations.component.d.ts","sourceRoot":"","sources":["../../../../src/app/panels/a11y/a11y-violations.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;;AAqB3D,qBAQa,uBAAuB;IAChC,SAAS,CAAC,QAAQ,CAAC,YAAY,mBAA4B;IAE3D,SAAS,CAAC,QAAQ,CAAC,WAAW,mFAAmD;IAEjF,SAAS,CAAC,QAAQ,CAAC,UAAU,8DAQ1B;IAEH,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM;yCAfpD,uBAAuB;2CAAvB,uBAAuB;CAkBnC"}
1
+ {"version":3,"file":"a11y-violations.component.d.ts","sourceRoot":"","sources":["../../../../src/app/panels/a11y/a11y-violations.component.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;;AAc3D;;;;GAIG;AACH,qBAQa,uBAAuB;IAChC,SAAS,CAAC,QAAQ,CAAC,YAAY,mBAA4B;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IACpE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAE9D,SAAS,CAAC,QAAQ,CAAC,WAAW,mFAAmD;IAEjF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAIxB;IAEH,oEAAoE;IACpE,SAAS,CAAC,QAAQ,CAAC,KAAK,2DAIrB;IAEH,SAAS,CAAC,QAAQ,CAAC,SAAS,kFAA+C;IAE3E,SAAS,CAAC,QAAQ,CAAC,UAAU,yCAQ1B;IAEH,SAAS,CAAC,QAAQ,CAAC,UAAU;;;;;;;;;SAO1B;IAEH,SAAS,CAAC,QAAQ,CAAC,MAAM,8DAA6D;yCAzC7E,uBAAuB;2CAAvB,uBAAuB;CA0CnC"}
@@ -1,8 +1,16 @@
1
1
  import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';
2
+ import { toneForStatus } from '../../shared/badge.types.js';
3
+ import { PrismBadgeComponent } from '../../shared/prism-badge.component.js';
4
+ import { PrismListRowComponent } from '../../shared/prism-list-row.component.js';
5
+ import { PrismMetricCardComponent } from '../../shared/prism-metric-card.component.js';
6
+ import { PRISM_CONFIG, PRISM_MANIFEST } from '../../tokens/prism-tokens.js';
2
7
  import { A11yAuditService } from './a11y-audit.service.js';
3
8
  import { A11yScoreComponent } from './a11y-score.component.js';
9
+ import { deriveA11ySummary } from './a11y-summary.js';
10
+ import { resolveA11yThresholds } from './a11y-thresholds.js';
11
+ import { severityBadge } from './severity.js';
4
12
  import * as i0 from "@angular/core";
5
- const _forTrack0 = ($index, $item) => $item.id + $item.impact;
13
+ const _forTrack0 = ($index, $item) => $item.id;
6
14
  function A11yViolationsComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
7
15
  i0.ɵɵelementStart(0, "div", 0);
8
16
  i0.ɵɵtext(1);
@@ -12,100 +20,89 @@ function A11yViolationsComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
12
20
  i0.ɵɵadvance();
13
21
  i0.ɵɵtextInterpolate1(" Audit failed: ", ctx_r0.auditService.error(), " ");
14
22
  } }
15
- function A11yViolationsComponent_Conditional_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
16
- i0.ɵɵelementStart(0, "span");
17
- i0.ɵɵelement(1, "i", 11);
18
- i0.ɵɵtext(2);
23
+ function A11yViolationsComponent_Conditional_1_For_5_Template(rf, ctx) { if (rf & 1) {
24
+ i0.ɵɵelementStart(0, "prism-list-row");
25
+ i0.ɵɵelement(1, "prism-badge", 8);
26
+ i0.ɵɵelementStart(2, "span", 9);
27
+ i0.ɵɵtext(3);
19
28
  i0.ɵɵelementEnd();
20
- } if (rf & 2) {
21
- const ctx_r0 = i0.ɵɵnextContext(2);
22
- i0.ɵɵadvance(2);
23
- i0.ɵɵtextInterpolate1("", ctx_r0.scoreResult().critical, " critical");
24
- } }
25
- function A11yViolationsComponent_Conditional_1_Conditional_7_Template(rf, ctx) { if (rf & 1) {
26
- i0.ɵɵelementStart(0, "span");
27
- i0.ɵɵelement(1, "i", 12);
28
- i0.ɵɵtext(2);
29
+ i0.ɵɵelementStart(4, "span", 10);
30
+ i0.ɵɵtext(5);
29
31
  i0.ɵɵelementEnd();
32
+ i0.ɵɵelementStart(6, "span", 11);
33
+ i0.ɵɵtext(7);
34
+ i0.ɵɵelementEnd()();
30
35
  } if (rf & 2) {
31
- const ctx_r0 = i0.ɵɵnextContext(2);
36
+ const item_r2 = ctx.$implicit;
37
+ i0.ɵɵadvance();
38
+ i0.ɵɵproperty("tone", item_r2.badge.tone)("variant", item_r2.badge.variant)("label", item_r2.badge.label);
39
+ i0.ɵɵadvance(2);
40
+ i0.ɵɵtextInterpolate(item_r2.help || item_r2.description);
32
41
  i0.ɵɵadvance(2);
33
- i0.ɵɵtextInterpolate1("", ctx_r0.scoreResult().moderate, " moderate");
42
+ i0.ɵɵtextInterpolate(item_r2.description);
43
+ i0.ɵɵadvance(2);
44
+ i0.ɵɵtextInterpolate(item_r2.id);
34
45
  } }
35
- function A11yViolationsComponent_Conditional_1_For_13_Conditional_6_Template(rf, ctx) { if (rf & 1) {
36
- i0.ɵɵelementStart(0, "span");
37
- i0.ɵɵtext(1);
46
+ function A11yViolationsComponent_Conditional_1_ForEmpty_6_Conditional_0_Template(rf, ctx) { if (rf & 1) {
47
+ i0.ɵɵelementStart(0, "div", 2);
48
+ i0.ɵɵtext(1, "No violations.");
38
49
  i0.ɵɵelementEnd();
50
+ } }
51
+ function A11yViolationsComponent_Conditional_1_ForEmpty_6_Template(rf, ctx) { if (rf & 1) {
52
+ i0.ɵɵconditionalCreate(0, A11yViolationsComponent_Conditional_1_ForEmpty_6_Conditional_0_Template, 2, 0, "div", 2);
39
53
  } if (rf & 2) {
40
- const item_r2 = i0.ɵɵnextContext().$implicit;
41
- i0.ɵɵadvance();
42
- i0.ɵɵtextInterpolate(item_r2.help);
54
+ const ctx_r0 = i0.ɵɵnextContext(2);
55
+ i0.ɵɵconditional(!ctx_r0.auditService.running() ? 0 : -1);
43
56
  } }
44
- function A11yViolationsComponent_Conditional_1_For_13_Template(rf, ctx) { if (rf & 1) {
45
- i0.ɵɵelementStart(0, "div", 13)(1, "span", 14);
46
- i0.ɵɵtext(2);
57
+ function A11yViolationsComponent_Conditional_1_Conditional_7_For_5_Template(rf, ctx) { if (rf & 1) {
58
+ i0.ɵɵelementStart(0, "prism-list-row");
59
+ i0.ɵɵelement(1, "prism-badge", 13);
60
+ i0.ɵɵelementStart(2, "span", 9);
61
+ i0.ɵɵtext(3);
47
62
  i0.ɵɵelementEnd();
48
- i0.ɵɵelementStart(3, "div", 15)(4, "b");
63
+ i0.ɵɵelementStart(4, "span", 11);
49
64
  i0.ɵɵtext(5);
50
- i0.ɵɵelementEnd();
51
- i0.ɵɵconditionalCreate(6, A11yViolationsComponent_Conditional_1_For_13_Conditional_6_Template, 2, 1, "span");
52
- i0.ɵɵelementEnd();
53
- i0.ɵɵelementStart(7, "span", 16);
54
- i0.ɵɵtext(8);
55
65
  i0.ɵɵelementEnd()();
56
66
  } if (rf & 2) {
57
- const item_r2 = ctx.$implicit;
58
- const ctx_r0 = i0.ɵɵnextContext(2);
59
- i0.ɵɵstyleProp("--%NS%sev-color", ctx_r0.sevColor(item_r2.impact));
60
- i0.ɵɵadvance(2);
61
- i0.ɵɵtextInterpolate(item_r2.impact ?? "pass");
67
+ const pass_r3 = ctx.$implicit;
62
68
  i0.ɵɵadvance(3);
63
- i0.ɵɵtextInterpolate(item_r2.description);
64
- i0.ɵɵadvance();
65
- i0.ɵɵconditional(item_r2.help ? 6 : -1);
69
+ i0.ɵɵtextInterpolate(pass_r3.help || pass_r3.description);
66
70
  i0.ɵɵadvance(2);
67
- i0.ɵɵtextInterpolate(item_r2.id);
71
+ i0.ɵɵtextInterpolate(pass_r3.id);
68
72
  } }
69
- function A11yViolationsComponent_Conditional_1_ForEmpty_14_Conditional_0_Template(rf, ctx) { if (rf & 1) {
70
- i0.ɵɵelementStart(0, "div", 2);
71
- i0.ɵɵtext(1, "No results yet.");
73
+ function A11yViolationsComponent_Conditional_1_Conditional_7_Template(rf, ctx) { if (rf & 1) {
74
+ i0.ɵɵelementStart(0, "details", 7)(1, "summary");
75
+ i0.ɵɵtext(2);
72
76
  i0.ɵɵelementEnd();
73
- } }
74
- function A11yViolationsComponent_Conditional_1_ForEmpty_14_Template(rf, ctx) { if (rf & 1) {
75
- i0.ɵɵconditionalCreate(0, A11yViolationsComponent_Conditional_1_ForEmpty_14_Conditional_0_Template, 2, 0, "div", 2);
77
+ i0.ɵɵelementStart(3, "div", 12);
78
+ i0.ɵɵrepeaterCreate(4, A11yViolationsComponent_Conditional_1_Conditional_7_For_5_Template, 6, 2, "prism-list-row", null, _forTrack0);
79
+ i0.ɵɵelementEnd()();
76
80
  } if (rf & 2) {
77
81
  const ctx_r0 = i0.ɵɵnextContext(2);
78
- i0.ɵɵconditional(!ctx_r0.auditService.running() ? 0 : -1);
82
+ i0.ɵɵadvance(2);
83
+ i0.ɵɵtextInterpolate2("", ctx_r0.passes().length, " passed ", ctx_r0.passes().length === 1 ? "check" : "checks");
84
+ i0.ɵɵadvance(2);
85
+ i0.ɵɵrepeater(ctx_r0.passes());
79
86
  } }
80
87
  function A11yViolationsComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
81
- i0.ɵɵelementStart(0, "div", 3)(1, "div", 4);
88
+ i0.ɵɵelementStart(0, "div", 3)(1, "prism-metric-card", 4);
82
89
  i0.ɵɵelement(2, "prism-a11y-score", 5);
83
- i0.ɵɵelementStart(3, "div", 6);
84
- i0.ɵɵtext(4, "axe-core audit");
85
90
  i0.ɵɵelementEnd();
86
- i0.ɵɵelementStart(5, "div", 7);
87
- i0.ɵɵconditionalCreate(6, A11yViolationsComponent_Conditional_1_Conditional_6_Template, 3, 1, "span");
88
- i0.ɵɵconditionalCreate(7, A11yViolationsComponent_Conditional_1_Conditional_7_Template, 3, 1, "span");
89
- i0.ɵɵelementStart(8, "span");
90
- i0.ɵɵelement(9, "i", 8);
91
- i0.ɵɵtext(10);
92
- i0.ɵɵelementEnd()()();
93
- i0.ɵɵelementStart(11, "div", 9);
94
- i0.ɵɵrepeaterCreate(12, A11yViolationsComponent_Conditional_1_For_13_Template, 9, 6, "div", 10, _forTrack0, false, A11yViolationsComponent_Conditional_1_ForEmpty_14_Template, 1, 1);
91
+ i0.ɵɵelementStart(3, "div", 6);
92
+ i0.ɵɵrepeaterCreate(4, A11yViolationsComponent_Conditional_1_For_5_Template, 8, 6, "prism-list-row", null, _forTrack0, false, A11yViolationsComponent_Conditional_1_ForEmpty_6_Template, 1, 1);
93
+ i0.ɵɵconditionalCreate(7, A11yViolationsComponent_Conditional_1_Conditional_7_Template, 6, 2, "details", 7);
95
94
  i0.ɵɵelementEnd()();
96
95
  } if (rf & 2) {
97
96
  const ctx_r0 = i0.ɵɵnextContext();
98
97
  i0.ɵɵclassProp("a11y-body--loading", ctx_r0.auditService.running());
99
- i0.ɵɵadvance(2);
100
- i0.ɵɵproperty("score", ctx_r0.scoreResult()?.score ?? 0);
101
- i0.ɵɵadvance(4);
102
- i0.ɵɵconditional(ctx_r0.scoreResult()?.critical ? 6 : -1);
103
98
  i0.ɵɵadvance();
104
- i0.ɵɵconditional(ctx_r0.scoreResult()?.moderate ? 7 : -1);
105
- i0.ɵɵadvance(3);
106
- i0.ɵɵtextInterpolate1("", ctx_r0.scoreResult()?.passes ?? 0, " pass");
99
+ i0.ɵɵproperty("value", "" + (ctx_r0.scoreResult()?.score ?? 0))("tone", ctx_r0.badgeTone())("title", ctx_r0.scoreTitle());
100
+ i0.ɵɵadvance();
101
+ i0.ɵɵproperty("score", ctx_r0.scoreResult()?.score ?? 0)("tone", ctx_r0.grade());
107
102
  i0.ɵɵadvance(2);
108
- i0.ɵɵrepeater(ctx_r0.allResults());
103
+ i0.ɵɵrepeater(ctx_r0.violations());
104
+ i0.ɵɵadvance(3);
105
+ i0.ɵɵconditional(ctx_r0.passes().length > 0 ? 7 : -1);
109
106
  } }
110
107
  function A11yViolationsComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
111
108
  i0.ɵɵelementStart(0, "div", 2);
@@ -118,40 +115,58 @@ const IMPACT_ORDER = {
118
115
  moderate: 2,
119
116
  minor: 3
120
117
  };
121
- const IMPACT_COLOR = {
122
- critical: 'var(--prism-danger)',
123
- serious: '#fb923c',
124
- moderate: 'var(--prism-warn)',
125
- minor: 'var(--prism-text-muted)'
126
- };
127
- function sevColor(impact) {
128
- return IMPACT_COLOR[impact ?? ''] ?? 'var(--prism-success)';
129
- }
118
+ /**
119
+ * The Violations view: the score as a small metric card with a ring in its
120
+ * grade's tone, the violations as list rows, most severe first, and the passed
121
+ * checks folded away below them.
122
+ */
130
123
  export class A11yViolationsComponent {
131
124
  auditService = inject(A11yAuditService);
125
+ manifest = inject(PRISM_MANIFEST);
126
+ config = inject(PRISM_CONFIG);
132
127
  scoreResult = computed(() => this.auditService.scoreResult(), /* @ts-ignore */
133
128
  ...(ngDevMode ? [{ debugName: "scoreResult" }] : /* istanbul ignore next */ []));
134
- allResults = computed(() => {
129
+ thresholds = computed(() => {
130
+ const meta = this.manifest.meta?.['a11y'];
131
+ return resolveA11yThresholds({ ...meta?.thresholds, ...this.config.a11y?.thresholds });
132
+ }, /* @ts-ignore */
133
+ ...(ngDevMode ? [{ debugName: "thresholds" }] : /* istanbul ignore next */ []));
134
+ /** The score's grade, by the rule every other a11y surface uses. */
135
+ grade = computed(() => {
136
+ const result = this.scoreResult();
137
+ return result ? deriveA11ySummary(result, this.thresholds()).variant : 'ok';
138
+ }, /* @ts-ignore */
139
+ ...(ngDevMode ? [{ debugName: "grade" }] : /* istanbul ignore next */ []));
140
+ badgeTone = computed(() => toneForStatus(this.grade()), /* @ts-ignore */
141
+ ...(ngDevMode ? [{ debugName: "badgeTone" }] : /* istanbul ignore next */ []));
142
+ scoreTitle = computed(() => {
143
+ const r = this.scoreResult();
144
+ if (!r)
145
+ return '';
146
+ return (`axe-core audit · target ${this.thresholds().score}\n` +
147
+ `${r.critical} critical · ${r.serious} serious · ${r.moderate} moderate · ${r.minor} minor · ${r.passes} passed`);
148
+ }, /* @ts-ignore */
149
+ ...(ngDevMode ? [{ debugName: "scoreTitle" }] : /* istanbul ignore next */ []));
150
+ violations = computed(() => {
135
151
  const results = this.auditService.results();
136
152
  if (!results)
137
153
  return [];
138
- const violations = [...results.violations].sort((a, b) => (IMPACT_ORDER[a.impact ?? ''] ?? 4) - (IMPACT_ORDER[b.impact ?? ''] ?? 4));
139
- const passes = results.passes.slice(0, 4);
140
- return [...violations, ...passes];
154
+ return [...results.violations]
155
+ .sort((a, b) => (IMPACT_ORDER[a.impact ?? ''] ?? 4) - (IMPACT_ORDER[b.impact ?? ''] ?? 4))
156
+ .map((v) => ({ ...v, badge: severityBadge(v.impact) }));
141
157
  }, /* @ts-ignore */
142
- ...(ngDevMode ? [{ debugName: "allResults" }] : /* istanbul ignore next */ []));
143
- sevColor(impact) {
144
- return sevColor(impact);
145
- }
158
+ ...(ngDevMode ? [{ debugName: "violations" }] : /* istanbul ignore next */ []));
159
+ passes = computed(() => this.auditService.results()?.passes ?? [], /* @ts-ignore */
160
+ ...(ngDevMode ? [{ debugName: "passes" }] : /* istanbul ignore next */ []));
146
161
  static ɵfac = function A11yViolationsComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || A11yViolationsComponent)(); };
147
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: A11yViolationsComponent, selectors: [["prism-a11y-violations"]], decls: 3, vars: 1, consts: [[1, "a11y-status", "a11y-status--error"], [1, "a11y-body", 3, "a11y-body--loading"], [1, "a11y-status"], [1, "a11y-body"], [1, "score-wrap"], [3, "score"], [1, "score-label"], [1, "score-meta"], [2, "background", "var(--prism-success)"], [1, "viol-list"], [1, "viol", 3, "--%NS%sev-color"], [2, "background", "var(--prism-danger)"], [2, "background", "var(--prism-warn)"], [1, "viol"], [1, "viol-sev"], [1, "viol-text"], [1, "viol-rule"]], template: function A11yViolationsComponent_Template(rf, ctx) { if (rf & 1) {
148
- i0.ɵɵconditionalCreate(0, A11yViolationsComponent_Conditional_0_Template, 2, 1, "div", 0)(1, A11yViolationsComponent_Conditional_1_Template, 15, 7, "div", 1)(2, A11yViolationsComponent_Conditional_2_Template, 2, 0, "div", 2);
162
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: A11yViolationsComponent, selectors: [["prism-a11y-violations"]], decls: 3, vars: 1, consts: [[1, "a11y-status", "a11y-status--error"], [1, "a11y-body", 3, "a11y-body--loading"], [1, "a11y-status"], [1, "a11y-body"], ["label", "Score", "unit", "/ 100", 1, "a11y-score-card", 3, "value", "tone", "title"], ["metricVisual", "", 3, "score", "tone"], [1, "viol-list"], [1, "viol-passed"], ["rowBadge", "", 3, "tone", "variant", "label"], ["rowTitle", ""], ["rowDescription", ""], ["rowMeta", ""], [1, "viol-passed__list"], ["rowBadge", "", "tone", "success", "label", "Passed"]], template: function A11yViolationsComponent_Template(rf, ctx) { if (rf & 1) {
163
+ i0.ɵɵconditionalCreate(0, A11yViolationsComponent_Conditional_0_Template, 2, 1, "div", 0)(1, A11yViolationsComponent_Conditional_1_Template, 8, 9, "div", 1)(2, A11yViolationsComponent_Conditional_2_Template, 2, 0, "div", 2);
149
164
  } if (rf & 2) {
150
165
  i0.ɵɵconditional(ctx.auditService.error() ? 0 : ctx.auditService.results() || ctx.auditService.running() ? 1 : 2);
151
- } }, dependencies: [A11yScoreComponent], styles: ["[_nghost-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: auto;\n}\n\n.a11y-body[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 220px 1fr;\n gap: 20px;\n min-height: 0;\n padding: 18px 20px;\n}\n\n.a11y-body--loading[_ngcontent-%COMP%] {\n opacity: 0.55;\n transition: opacity var(--%NS%dur-base);\n}\n\n.score-wrap[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n align-items: center;\n align-self: start;\n padding: 14px;\n background: var(--%NS%prism-bg-surface);\n border: 1px solid var(--%NS%prism-border);\n border-radius: 10px;\n}\n\n.score-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n color: var(--%NS%prism-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.08em;\n}\n\n.score-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n margin-top: 2px;\n font-size: 11px;\n color: var(--%NS%prism-text-muted);\n}\n\n.score-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n align-items: center;\n}\n\n.score-meta[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n display: block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n}\n\n.viol-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n}\n\n.viol[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: auto 1fr auto;\n gap: 12px;\n align-items: center;\n padding: 10px 12px;\n background: var(--%NS%prism-bg-surface);\n border: 1px solid var(--%NS%prism-border);\n border-left: 3px solid var(--%NS%sev-color, var(--%NS%prism-primary));\n border-radius: 8px;\n transition: border-color var(--%NS%dur-fast);\n}\n\n.viol[_ngcontent-%COMP%]:hover {\n border-color: var(--%NS%prism-border-strong);\n}\n\n.viol-sev[_ngcontent-%COMP%] {\n padding: 2px 6px;\n font-family: var(--%NS%font-mono);\n font-size: 9.5px;\n font-weight: 700;\n color: var(--%NS%sev-color);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n background: color-mix(in srgb, var(--%NS%sev-color) 15%, transparent);\n border-radius: var(--%NS%radius-xs);\n}\n\n.viol-text[_ngcontent-%COMP%] {\n min-width: 0;\n font-size: 12.5px;\n color: var(--%NS%prism-text);\n}\n\n.viol-text[_ngcontent-%COMP%] b[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 1px;\n font-weight: 600;\n}\n\n.viol-text[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 11.5px;\n color: var(--%NS%prism-text-muted);\n}\n\n.viol-rule[_ngcontent-%COMP%] {\n padding: 2px 7px;\n font-family: var(--%NS%font-mono);\n font-size: 11px;\n color: var(--%NS%prism-text-ghost);\n white-space: nowrap;\n background: var(--%NS%prism-input-bg);\n border-radius: var(--%NS%radius-xs);\n}\n\n.a11y-status[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100px;\n font-size: 13px;\n color: var(--%NS%prism-text-muted);\n}\n\n.a11y-status--error[_ngcontent-%COMP%] {\n color: var(--%NS%prism-danger);\n}\n\n@media (width <= 1100px) {\n .a11y-body[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}"] });
166
+ } }, dependencies: [A11yScoreComponent, PrismBadgeComponent, PrismListRowComponent, PrismMetricCardComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n}\n\n.a11y-body[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 180px minmax(0, 1fr);\n gap: 12px;\n align-items: start;\n padding: 16px 18px;\n transition: opacity var(--%NS%dur-base);\n}\n\n.a11y-body--loading[_ngcontent-%COMP%] {\n opacity: 0.6;\n}\n\n.viol-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n}\n\n.viol-passed[_ngcontent-%COMP%] summary[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n align-items: center;\n padding: 6px 2px;\n font-size: 12px;\n font-weight: 500;\n color: var(--%NS%prism-text-muted);\n cursor: pointer;\n list-style: none;\n}\n\n.viol-passed[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]::-webkit-details-marker {\n display: none;\n}\n\n.viol-passed[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]::before {\n font-size: 10px;\n content: '\u25B8';\n transition: transform var(--%NS%dur-fast);\n}\n\n.viol-passed[open][_ngcontent-%COMP%] summary[_ngcontent-%COMP%]::before {\n transform: rotate(90deg);\n}\n\n.viol-passed[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]:hover {\n color: var(--%NS%prism-text-2);\n}\n\n.viol-passed[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--%NS%prism-primary);\n outline-offset: 2px;\n border-radius: 2px;\n}\n\n.viol-passed__list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-top: 4px;\n}\n\n.a11y-status[_ngcontent-%COMP%] {\n padding: 4px 2px;\n font-size: 12.5px;\n color: var(--%NS%prism-text-muted);\n}\n\n.a11y-status--error[_ngcontent-%COMP%] {\n padding: 16px 18px;\n color: var(--%NS%prism-danger);\n}\n\n@container (max-width: 560px) {\n .a11y-body[_ngcontent-%COMP%] {\n grid-template-columns: minmax(0, 1fr);\n }\n}"] });
152
167
  }
153
168
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(A11yViolationsComponent, [{
154
169
  type: Component,
155
- args: [{ selector: 'prism-a11y-violations', standalone: true, imports: [A11yScoreComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (auditService.error()) {\n <div class=\"a11y-status a11y-status--error\"> Audit failed: {{ auditService.error() }} </div>\n} @else if (auditService.results() || auditService.running()) {\n <div\n class=\"a11y-body\"\n [class.a11y-body--loading]=\"auditService.running()\">\n <div class=\"score-wrap\">\n <prism-a11y-score [score]=\"scoreResult()?.score ?? 0\" />\n <div class=\"score-label\">axe-core audit</div>\n <div class=\"score-meta\">\n @if (scoreResult()?.critical) {\n <span><i style=\"background: var(--prism-danger)\"></i>{{ scoreResult()!.critical }} critical</span>\n }\n @if (scoreResult()?.moderate) {\n <span><i style=\"background: var(--prism-warn)\"></i>{{ scoreResult()!.moderate }} moderate</span>\n }\n <span><i style=\"background: var(--prism-success)\"></i>{{ scoreResult()?.passes ?? 0 }} pass</span>\n </div>\n </div>\n <div class=\"viol-list\">\n @for (item of allResults(); track item.id + item.impact) {\n <div\n class=\"viol\"\n [style.--sev-color]=\"sevColor(item.impact)\">\n <span class=\"viol-sev\">{{ item.impact ?? 'pass' }}</span>\n <div class=\"viol-text\">\n <b>{{ item.description }}</b>\n @if (item.help) {\n <span>{{ item.help }}</span>\n }\n </div>\n <span class=\"viol-rule\">{{ item.id }}</span>\n </div>\n } @empty {\n @if (!auditService.running()) {\n <div class=\"a11y-status\">No results yet.</div>\n }\n }\n </div>\n </div>\n} @else {\n <div class=\"a11y-status\"> Select a component to run accessibility audit. </div>\n}\n", styles: [":host {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: auto;\n}\n\n.a11y-body {\n display: grid;\n grid-template-columns: 220px 1fr;\n gap: 20px;\n min-height: 0;\n padding: 18px 20px;\n}\n\n.a11y-body--loading {\n opacity: 0.55;\n transition: opacity var(--dur-base);\n}\n\n.score-wrap {\n display: flex;\n flex-direction: column;\n gap: 10px;\n align-items: center;\n align-self: start;\n padding: 14px;\n background: var(--prism-bg-surface);\n border: 1px solid var(--prism-border);\n border-radius: 10px;\n}\n\n.score-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--prism-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.08em;\n}\n\n.score-meta {\n display: flex;\n gap: 12px;\n margin-top: 2px;\n font-size: 11px;\n color: var(--prism-text-muted);\n}\n\n.score-meta span {\n display: flex;\n gap: 4px;\n align-items: center;\n}\n\n.score-meta i {\n display: block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n}\n\n.viol-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n}\n\n.viol {\n display: grid;\n grid-template-columns: auto 1fr auto;\n gap: 12px;\n align-items: center;\n padding: 10px 12px;\n background: var(--prism-bg-surface);\n border: 1px solid var(--prism-border);\n border-left: 3px solid var(--sev-color, var(--prism-primary));\n border-radius: 8px;\n transition: border-color var(--dur-fast);\n}\n\n.viol:hover {\n border-color: var(--prism-border-strong);\n}\n\n.viol-sev {\n padding: 2px 6px;\n font-family: var(--font-mono);\n font-size: 9.5px;\n font-weight: 700;\n color: var(--sev-color);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n background: color-mix(in srgb, var(--sev-color) 15%, transparent);\n border-radius: var(--radius-xs);\n}\n\n.viol-text {\n min-width: 0;\n font-size: 12.5px;\n color: var(--prism-text);\n}\n\n.viol-text b {\n display: block;\n margin-bottom: 1px;\n font-weight: 600;\n}\n\n.viol-text span {\n font-size: 11.5px;\n color: var(--prism-text-muted);\n}\n\n.viol-rule {\n padding: 2px 7px;\n font-family: var(--font-mono);\n font-size: 11px;\n color: var(--prism-text-ghost);\n white-space: nowrap;\n background: var(--prism-input-bg);\n border-radius: var(--radius-xs);\n}\n\n.a11y-status {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100px;\n font-size: 13px;\n color: var(--prism-text-muted);\n}\n\n.a11y-status--error {\n color: var(--prism-danger);\n}\n\n@media (width <= 1100px) {\n .a11y-body {\n grid-template-columns: 1fr;\n }\n}\n"] }]
170
+ args: [{ selector: 'prism-a11y-violations', standalone: true, imports: [A11yScoreComponent, PrismBadgeComponent, PrismListRowComponent, PrismMetricCardComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (auditService.error()) {\n <div class=\"a11y-status a11y-status--error\"> Audit failed: {{ auditService.error() }} </div>\n} @else if (auditService.results() || auditService.running()) {\n <div\n class=\"a11y-body\"\n [class.a11y-body--loading]=\"auditService.running()\">\n <prism-metric-card\n class=\"a11y-score-card\"\n label=\"Score\"\n unit=\"/ 100\"\n [value]=\"'' + (scoreResult()?.score ?? 0)\"\n [tone]=\"badgeTone()\"\n [title]=\"scoreTitle()\">\n <prism-a11y-score\n metricVisual\n [score]=\"scoreResult()?.score ?? 0\"\n [tone]=\"grade()\" />\n </prism-metric-card>\n\n <div class=\"viol-list\">\n @for (item of violations(); track item.id) {\n <prism-list-row>\n <prism-badge\n rowBadge\n [tone]=\"item.badge.tone\"\n [variant]=\"item.badge.variant\"\n [label]=\"item.badge.label\" />\n <span rowTitle>{{ item.help || item.description }}</span>\n <span rowDescription>{{ item.description }}</span>\n <span rowMeta>{{ item.id }}</span>\n </prism-list-row>\n } @empty {\n @if (!auditService.running()) {\n <div class=\"a11y-status\">No violations.</div>\n }\n }\n\n @if (passes().length > 0) {\n <details class=\"viol-passed\">\n <summary>{{ passes().length }} passed {{ passes().length === 1 ? 'check' : 'checks' }}</summary>\n <div class=\"viol-passed__list\">\n @for (pass of passes(); track pass.id) {\n <prism-list-row>\n <prism-badge\n rowBadge\n tone=\"success\"\n label=\"Passed\" />\n <span rowTitle>{{ pass.help || pass.description }}</span>\n <span rowMeta>{{ pass.id }}</span>\n </prism-list-row>\n }\n </div>\n </details>\n }\n </div>\n </div>\n} @else {\n <div class=\"a11y-status\"> Select a component to run accessibility audit. </div>\n}\n", styles: [":host {\n display: block;\n}\n\n.a11y-body {\n display: grid;\n grid-template-columns: 180px minmax(0, 1fr);\n gap: 12px;\n align-items: start;\n padding: 16px 18px;\n transition: opacity var(--dur-base);\n}\n\n.a11y-body--loading {\n opacity: 0.6;\n}\n\n.viol-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n}\n\n.viol-passed summary {\n display: flex;\n gap: 6px;\n align-items: center;\n padding: 6px 2px;\n font-size: 12px;\n font-weight: 500;\n color: var(--prism-text-muted);\n cursor: pointer;\n list-style: none;\n}\n\n.viol-passed summary::-webkit-details-marker {\n display: none;\n}\n\n.viol-passed summary::before {\n font-size: 10px;\n content: '\u25B8';\n transition: transform var(--dur-fast);\n}\n\n.viol-passed[open] summary::before {\n transform: rotate(90deg);\n}\n\n.viol-passed summary:hover {\n color: var(--prism-text-2);\n}\n\n.viol-passed summary:focus-visible {\n outline: 2px solid var(--prism-primary);\n outline-offset: 2px;\n border-radius: 2px;\n}\n\n.viol-passed__list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-top: 4px;\n}\n\n.a11y-status {\n padding: 4px 2px;\n font-size: 12.5px;\n color: var(--prism-text-muted);\n}\n\n.a11y-status--error {\n padding: 16px 18px;\n color: var(--prism-danger);\n}\n\n@container (max-width: 560px) {\n .a11y-body {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n"] }]
156
171
  }], null, null); })();
157
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(A11yViolationsComponent, { className: "A11yViolationsComponent", filePath: "app/panels/a11y/a11y-violations.component.ts", lineNumber: 31 }); })();
172
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(A11yViolationsComponent, { className: "A11yViolationsComponent", filePath: "app/panels/a11y/a11y-violations.component.ts", lineNumber: 35 }); })();
@@ -0,0 +1,9 @@
1
+ import type { BadgeTone } from '../../shared/badge.types.js';
2
+ export interface SeverityBadge {
3
+ label: string;
4
+ tone: BadgeTone;
5
+ variant: 'soft' | 'outline';
6
+ }
7
+ /** The badge of an axe impact level; an unknown impact reads as minor. */
8
+ export declare function severityBadge(impact: string | null | undefined): SeverityBadge;
9
+ //# sourceMappingURL=severity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"severity.d.ts","sourceRoot":"","sources":["../../../../src/app/panels/a11y/severity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAWD,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,aAAa,CAE9E"}