@ng-prism/core 22.5.0 → 22.7.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (437) hide show
  1. package/README.md +13 -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 +25 -3
  14. package/dist/app/canvas/prism-canvas-toolbar.component.d.ts.map +1 -1
  15. package/dist/app/canvas/prism-canvas-toolbar.component.js +154 -89
  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/canvas/state-chips.d.ts +50 -0
  19. package/dist/app/canvas/state-chips.d.ts.map +1 -0
  20. package/dist/app/canvas/state-chips.js +40 -0
  21. package/dist/app/component-head/head-metrics.d.ts +35 -19
  22. package/dist/app/component-head/head-metrics.d.ts.map +1 -1
  23. package/dist/app/component-head/head-metrics.js +57 -27
  24. package/dist/app/component-head/pipe-facts.d.ts +9 -0
  25. package/dist/app/component-head/pipe-facts.d.ts.map +1 -0
  26. package/dist/app/component-head/pipe-facts.js +15 -0
  27. package/dist/app/component-head/prism-component-head.component.d.ts +20 -22
  28. package/dist/app/component-head/prism-component-head.component.d.ts.map +1 -1
  29. package/dist/app/component-head/prism-component-head.component.js +85 -96
  30. package/dist/app/component-head/prism-head-gauge.component.d.ts +8 -12
  31. package/dist/app/component-head/prism-head-gauge.component.d.ts.map +1 -1
  32. package/dist/app/component-head/prism-head-gauge.component.js +51 -67
  33. package/dist/app/component-head/prism-head-info.component.d.ts +14 -2
  34. package/dist/app/component-head/prism-head-info.component.d.ts.map +1 -1
  35. package/dist/app/component-head/prism-head-info.component.js +84 -20
  36. package/dist/app/component-head/prism-stat.component.d.ts +4 -5
  37. package/dist/app/component-head/prism-stat.component.d.ts.map +1 -1
  38. package/dist/app/component-head/prism-stat.component.js +16 -12
  39. package/dist/app/component-head/service-facts.d.ts +8 -0
  40. package/dist/app/component-head/service-facts.d.ts.map +1 -0
  41. package/dist/app/component-head/service-facts.js +11 -0
  42. package/dist/app/controls/boolean-control.component.js +2 -2
  43. package/dist/app/controls/json-control.component.js +2 -2
  44. package/dist/app/controls/union-control.component.js +4 -3
  45. package/dist/app/directives/resize-value.d.ts +1 -1
  46. package/dist/app/directives/resize-value.js +1 -1
  47. package/dist/app/discovery-manifest.d.ts +2 -2
  48. package/dist/app/discovery-manifest.d.ts.map +1 -1
  49. package/dist/app/discovery-manifest.js +15 -3
  50. package/dist/app/header/header-brand.d.ts +25 -0
  51. package/dist/app/header/header-brand.d.ts.map +1 -0
  52. package/dist/app/header/header-brand.js +10 -0
  53. package/dist/app/header/prism-header.component.d.ts +2 -2
  54. package/dist/app/header/prism-header.component.d.ts.map +1 -1
  55. package/dist/app/header/prism-header.component.js +73 -57
  56. package/dist/app/icons/icon-registry.d.ts.map +1 -1
  57. package/dist/app/icons/icon-registry.js +4 -1
  58. package/dist/app/index.d.ts +12 -0
  59. package/dist/app/index.d.ts.map +1 -1
  60. package/dist/app/index.js +12 -1
  61. package/dist/app/layout-menu/prism-layout-menu.component.d.ts +3 -0
  62. package/dist/app/layout-menu/prism-layout-menu.component.d.ts.map +1 -1
  63. package/dist/app/layout-menu/prism-layout-menu.component.js +72 -58
  64. package/dist/app/overview/open-in-playground.d.ts +19 -0
  65. package/dist/app/overview/open-in-playground.d.ts.map +1 -0
  66. package/dist/app/overview/open-in-playground.js +25 -0
  67. package/dist/app/overview/overview-matrix.d.ts +85 -0
  68. package/dist/app/overview/overview-matrix.d.ts.map +1 -0
  69. package/dist/app/overview/overview-matrix.js +98 -0
  70. package/dist/app/overview/overview-visibility.d.ts +10 -2
  71. package/dist/app/overview/overview-visibility.d.ts.map +1 -1
  72. package/dist/app/overview/overview-visibility.js +14 -3
  73. package/dist/app/overview/prism-overview-cell.component.d.ts +27 -2
  74. package/dist/app/overview/prism-overview-cell.component.d.ts.map +1 -1
  75. package/dist/app/overview/prism-overview-cell.component.js +145 -28
  76. package/dist/app/overview/prism-overview-matrix.component.d.ts +29 -0
  77. package/dist/app/overview/prism-overview-matrix.component.d.ts.map +1 -0
  78. package/dist/app/overview/prism-overview-matrix.component.js +155 -0
  79. package/dist/app/overview/prism-overview.component.d.ts +4 -0
  80. package/dist/app/overview/prism-overview.component.d.ts.map +1 -1
  81. package/dist/app/overview/prism-overview.component.js +37 -14
  82. package/dist/app/page-renderer/prism-page-renderer.component.js +2 -2
  83. package/dist/app/panels/a11y/a11y-core.plugin.d.ts.map +1 -1
  84. package/dist/app/panels/a11y/a11y-core.plugin.js +0 -1
  85. package/dist/app/panels/a11y/a11y-header-badge.component.d.ts +1 -4
  86. package/dist/app/panels/a11y/a11y-header-badge.component.d.ts.map +1 -1
  87. package/dist/app/panels/a11y/a11y-header-badge.component.js +8 -19
  88. package/dist/app/panels/a11y/a11y-keyboard-overlay.component.js +2 -2
  89. package/dist/app/panels/a11y/a11y-overlay-host.component.d.ts +1 -0
  90. package/dist/app/panels/a11y/a11y-overlay-host.component.d.ts.map +1 -1
  91. package/dist/app/panels/a11y/a11y-overlay-host.component.js +4 -3
  92. package/dist/app/panels/a11y/a11y-panel.component.d.ts +4 -1
  93. package/dist/app/panels/a11y/a11y-panel.component.d.ts.map +1 -1
  94. package/dist/app/panels/a11y/a11y-panel.component.js +32 -54
  95. package/dist/app/panels/a11y/a11y-score.component.d.ts +8 -3
  96. package/dist/app/panels/a11y/a11y-score.component.d.ts.map +1 -1
  97. package/dist/app/panels/a11y/a11y-score.component.js +19 -35
  98. package/dist/app/panels/a11y/a11y-sr-overlay.component.js +2 -2
  99. package/dist/app/panels/a11y/a11y-sr.component.js +2 -2
  100. package/dist/app/panels/a11y/a11y-summary.d.ts.map +1 -1
  101. package/dist/app/panels/a11y/a11y-summary.js +8 -1
  102. package/dist/app/panels/a11y/a11y-tree.component.js +2 -2
  103. package/dist/app/panels/a11y/a11y-violations.component.d.ts +23 -2
  104. package/dist/app/panels/a11y/a11y-violations.component.d.ts.map +1 -1
  105. package/dist/app/panels/a11y/a11y-violations.component.js +104 -89
  106. package/dist/app/panels/a11y/severity.d.ts +9 -0
  107. package/dist/app/panels/a11y/severity.d.ts.map +1 -0
  108. package/dist/app/panels/a11y/severity.js +12 -0
  109. package/dist/app/panels/controls/controls-plugin.d.ts.map +1 -1
  110. package/dist/app/panels/controls/controls-plugin.js +1 -2
  111. package/dist/app/panels/controls/non-editable-input-types.d.ts +9 -1
  112. package/dist/app/panels/controls/non-editable-input-types.d.ts.map +1 -1
  113. package/dist/app/panels/controls/non-editable-input-types.js +18 -0
  114. package/dist/app/panels/controls/prism-controls-panel.component.d.ts +2 -1
  115. package/dist/app/panels/controls/prism-controls-panel.component.d.ts.map +1 -1
  116. package/dist/app/panels/controls/prism-controls-panel.component.js +77 -59
  117. package/dist/app/panels/events/events-plugin.d.ts.map +1 -1
  118. package/dist/app/panels/events/events-plugin.js +1 -2
  119. package/dist/app/panels/events/prism-events-panel.component.d.ts +2 -0
  120. package/dist/app/panels/events/prism-events-panel.component.d.ts.map +1 -1
  121. package/dist/app/panels/events/prism-events-panel.component.js +20 -7
  122. package/dist/app/panels/events/prism-json-node.utils.d.ts +6 -0
  123. package/dist/app/panels/events/prism-json-node.utils.d.ts.map +1 -1
  124. package/dist/app/panels/events/prism-json-node.utils.js +8 -0
  125. package/dist/app/panels/panel-host/addon-panels.d.ts +11 -0
  126. package/dist/app/panels/panel-host/addon-panels.d.ts.map +1 -0
  127. package/dist/app/panels/panel-host/addon-panels.js +12 -0
  128. package/dist/app/panels/panel-host/panel-badge.d.ts +22 -0
  129. package/dist/app/panels/panel-host/panel-badge.d.ts.map +1 -1
  130. package/dist/app/panels/panel-host/panel-badge.js +56 -11
  131. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts +4 -1
  132. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts.map +1 -1
  133. package/dist/app/panels/panel-host/prism-panel-host.component.js +36 -70
  134. package/dist/app/pseudo/pseudo-state-marker.d.ts +32 -10
  135. package/dist/app/pseudo/pseudo-state-marker.d.ts.map +1 -1
  136. package/dist/app/pseudo/pseudo-state-marker.js +83 -67
  137. package/dist/app/pseudo/pseudo-targets.d.ts +11 -0
  138. package/dist/app/pseudo/pseudo-targets.d.ts.map +1 -0
  139. package/dist/app/pseudo/pseudo-targets.js +46 -0
  140. package/dist/app/pseudo/state-fit.d.ts +28 -0
  141. package/dist/app/pseudo/state-fit.d.ts.map +1 -0
  142. package/dist/app/pseudo/state-fit.js +97 -0
  143. package/dist/app/renderer/composition.d.ts +20 -0
  144. package/dist/app/renderer/composition.d.ts.map +1 -0
  145. package/dist/app/renderer/composition.js +26 -0
  146. package/dist/app/renderer/input-bindings.d.ts +28 -0
  147. package/dist/app/renderer/input-bindings.d.ts.map +1 -0
  148. package/dist/app/renderer/input-bindings.js +42 -0
  149. package/dist/app/renderer/known-inputs.d.ts +8 -1
  150. package/dist/app/renderer/known-inputs.d.ts.map +1 -1
  151. package/dist/app/renderer/known-inputs.js +13 -5
  152. package/dist/app/renderer/prism-renderer.component.d.ts +18 -4
  153. package/dist/app/renderer/prism-renderer.component.d.ts.map +1 -1
  154. package/dist/app/renderer/prism-renderer.component.js +78 -44
  155. package/dist/app/renderer/projectable-content.d.ts +8 -1
  156. package/dist/app/renderer/projectable-content.d.ts.map +1 -1
  157. package/dist/app/renderer/projectable-content.js +40 -29
  158. package/dist/app/renderer/rendered-key.d.ts +20 -6
  159. package/dist/app/renderer/rendered-key.d.ts.map +1 -1
  160. package/dist/app/renderer/rendered-key.js +25 -8
  161. package/dist/app/renderer/snippet-generator.d.ts +14 -2
  162. package/dist/app/renderer/snippet-generator.d.ts.map +1 -1
  163. package/dist/app/renderer/snippet-generator.js +138 -81
  164. package/dist/app/services/navigation-item.d.ts +10 -0
  165. package/dist/app/services/navigation-item.d.ts.map +1 -0
  166. package/dist/app/services/navigation-item.js +20 -0
  167. package/dist/app/services/navigation-item.types.d.ts +8 -0
  168. package/dist/app/services/navigation-item.types.d.ts.map +1 -1
  169. package/dist/app/services/prism-layout.service.d.ts +12 -0
  170. package/dist/app/services/prism-layout.service.d.ts.map +1 -1
  171. package/dist/app/services/prism-layout.service.js +17 -7
  172. package/dist/app/services/prism-manifest.service.d.ts +4 -0
  173. package/dist/app/services/prism-manifest.service.d.ts.map +1 -1
  174. package/dist/app/services/prism-manifest.service.js +4 -0
  175. package/dist/app/services/prism-navigation.service.d.ts +12 -0
  176. package/dist/app/services/prism-navigation.service.d.ts.map +1 -1
  177. package/dist/app/services/prism-navigation.service.js +85 -19
  178. package/dist/app/services/prism-panel.service.d.ts +7 -3
  179. package/dist/app/services/prism-panel.service.d.ts.map +1 -1
  180. package/dist/app/services/prism-panel.service.js +13 -4
  181. package/dist/app/services/prism-pseudo-state.service.d.ts +59 -14
  182. package/dist/app/services/prism-pseudo-state.service.d.ts.map +1 -1
  183. package/dist/app/services/prism-pseudo-state.service.js +86 -29
  184. package/dist/app/services/prism-renderer.service.d.ts +23 -0
  185. package/dist/app/services/prism-renderer.service.d.ts.map +1 -1
  186. package/dist/app/services/prism-renderer.service.js +77 -8
  187. package/dist/app/services/prism-search.service.d.ts +4 -0
  188. package/dist/app/services/prism-search.service.d.ts.map +1 -1
  189. package/dist/app/services/prism-search.service.js +29 -6
  190. package/dist/app/services/prism-theme.service.d.ts +11 -3
  191. package/dist/app/services/prism-theme.service.d.ts.map +1 -1
  192. package/dist/app/services/prism-theme.service.js +27 -19
  193. package/dist/app/services/prism-url-state.service.d.ts.map +1 -1
  194. package/dist/app/services/prism-url-state.service.js +81 -12
  195. package/dist/app/shared/badge.types.d.ts +7 -0
  196. package/dist/app/shared/badge.types.d.ts.map +1 -0
  197. package/dist/app/shared/badge.types.js +9 -0
  198. package/dist/app/shared/brand-mark.d.ts +35 -0
  199. package/dist/app/shared/brand-mark.d.ts.map +1 -0
  200. package/dist/app/shared/brand-mark.js +52 -0
  201. package/dist/app/shared/metric-bar.d.ts +6 -0
  202. package/dist/app/shared/metric-bar.d.ts.map +1 -0
  203. package/dist/app/shared/metric-bar.js +7 -0
  204. package/dist/app/shared/prism-badge.component.d.ts +21 -0
  205. package/dist/app/shared/prism-badge.component.d.ts.map +1 -0
  206. package/dist/app/shared/prism-badge.component.js +68 -0
  207. package/dist/app/shared/prism-button.component.d.ts +12 -0
  208. package/dist/app/shared/prism-button.component.d.ts.map +1 -0
  209. package/dist/app/shared/prism-button.component.js +28 -0
  210. package/dist/app/shared/prism-icon-button.component.d.ts +17 -0
  211. package/dist/app/shared/prism-icon-button.component.d.ts.map +1 -0
  212. package/dist/app/shared/prism-icon-button.component.js +37 -0
  213. package/dist/app/shared/prism-list-row.component.d.ts +17 -0
  214. package/dist/app/shared/prism-list-row.component.d.ts.map +1 -0
  215. package/dist/app/shared/prism-list-row.component.js +57 -0
  216. package/dist/app/shared/prism-logo.component.d.ts +24 -0
  217. package/dist/app/shared/prism-logo.component.d.ts.map +1 -0
  218. package/dist/app/shared/prism-logo.component.js +77 -0
  219. package/dist/app/shared/prism-metric-badge.component.d.ts +9 -4
  220. package/dist/app/shared/prism-metric-badge.component.d.ts.map +1 -1
  221. package/dist/app/shared/prism-metric-badge.component.js +33 -12
  222. package/dist/app/shared/prism-metric-card.component.d.ts +30 -0
  223. package/dist/app/shared/prism-metric-card.component.d.ts.map +1 -0
  224. package/dist/app/shared/prism-metric-card.component.js +111 -0
  225. package/dist/app/shared/prism-panel-toolbar.component.d.ts +13 -0
  226. package/dist/app/shared/prism-panel-toolbar.component.d.ts.map +1 -0
  227. package/dist/app/shared/prism-panel-toolbar.component.js +28 -0
  228. package/dist/app/shared/prism-segmented.component.d.ts +25 -0
  229. package/dist/app/shared/prism-segmented.component.d.ts.map +1 -0
  230. package/dist/app/shared/prism-segmented.component.js +77 -0
  231. package/dist/app/shared/prism-tabs.component.d.ts +44 -0
  232. package/dist/app/shared/prism-tabs.component.d.ts.map +1 -0
  233. package/dist/app/shared/prism-tabs.component.js +134 -0
  234. package/dist/app/shared/roving-focus.d.ts +13 -0
  235. package/dist/app/shared/roving-focus.d.ts.map +1 -0
  236. package/dist/app/shared/roving-focus.js +34 -0
  237. package/dist/app/shell/prism-shell.component.d.ts +13 -0
  238. package/dist/app/shell/prism-shell.component.d.ts.map +1 -1
  239. package/dist/app/shell/prism-shell.component.js +57 -28
  240. package/dist/app/shell/should-select-first.d.ts +17 -0
  241. package/dist/app/shell/should-select-first.d.ts.map +1 -0
  242. package/dist/app/shell/should-select-first.js +13 -0
  243. package/dist/app/sidebar/navigation-decorations.d.ts +23 -1
  244. package/dist/app/sidebar/navigation-decorations.d.ts.map +1 -1
  245. package/dist/app/sidebar/navigation-decorations.js +33 -2
  246. package/dist/app/sidebar/prism-sidebar.component.d.ts +5 -15
  247. package/dist/app/sidebar/prism-sidebar.component.d.ts.map +1 -1
  248. package/dist/app/sidebar/prism-sidebar.component.js +89 -77
  249. package/dist/app/theme/deprecated-tokens.d.ts +15 -0
  250. package/dist/app/theme/deprecated-tokens.d.ts.map +1 -0
  251. package/dist/app/theme/deprecated-tokens.js +22 -0
  252. package/dist/app/theme/favicon.d.ts +3 -0
  253. package/dist/app/theme/favicon.d.ts.map +1 -0
  254. package/dist/app/theme/favicon.js +3 -0
  255. package/dist/app/theme/prism-default-theme.d.ts.map +1 -1
  256. package/dist/app/theme/prism-default-theme.js +122 -66
  257. package/dist/app/theme/resolve-theme-tokens.d.ts +29 -0
  258. package/dist/app/theme/resolve-theme-tokens.d.ts.map +1 -0
  259. package/dist/app/theme/resolve-theme-tokens.js +43 -0
  260. package/dist/app/variant-ribbon/prism-variant-ribbon.component.d.ts +4 -7
  261. package/dist/app/variant-ribbon/prism-variant-ribbon.component.d.ts.map +1 -1
  262. package/dist/app/variant-ribbon/prism-variant-ribbon.component.js +31 -69
  263. package/dist/app/view-tab-bar/next-view-id.d.ts +7 -1
  264. package/dist/app/view-tab-bar/next-view-id.d.ts.map +1 -1
  265. package/dist/app/view-tab-bar/next-view-id.js +9 -1
  266. package/dist/app/view-tab-bar/panel-inputs.d.ts +28 -0
  267. package/dist/app/view-tab-bar/panel-inputs.d.ts.map +1 -0
  268. package/dist/app/view-tab-bar/panel-inputs.js +41 -0
  269. package/dist/app/view-tab-bar/prism-view-panel-host.component.d.ts +2 -3
  270. package/dist/app/view-tab-bar/prism-view-panel-host.component.d.ts.map +1 -1
  271. package/dist/app/view-tab-bar/prism-view-panel-host.component.js +9 -9
  272. package/dist/app/view-tab-bar/prism-view-tab-bar.component.d.ts +6 -0
  273. package/dist/app/view-tab-bar/prism-view-tab-bar.component.d.ts.map +1 -1
  274. package/dist/app/view-tab-bar/prism-view-tab-bar.component.js +22 -29
  275. package/dist/builder/config-loader/deprecated-options.d.ts +9 -0
  276. package/dist/builder/config-loader/deprecated-options.d.ts.map +1 -0
  277. package/dist/builder/config-loader/deprecated-options.js +34 -0
  278. package/dist/builder/manifest/composition-wrapper.generator.d.ts +14 -0
  279. package/dist/builder/manifest/composition-wrapper.generator.d.ts.map +1 -0
  280. package/dist/builder/manifest/composition-wrapper.generator.js +66 -0
  281. package/dist/builder/manifest/host-parser.d.ts +2 -0
  282. package/dist/builder/manifest/host-parser.d.ts.map +1 -1
  283. package/dist/builder/manifest/host-parser.js +9 -4
  284. package/dist/builder/manifest/manifest-imports.d.ts +34 -0
  285. package/dist/builder/manifest/manifest-imports.d.ts.map +1 -0
  286. package/dist/builder/manifest/manifest-imports.js +91 -0
  287. package/dist/builder/manifest/runtime-manifest.generator.d.ts +13 -0
  288. package/dist/builder/manifest/runtime-manifest.generator.d.ts.map +1 -1
  289. package/dist/builder/manifest/runtime-manifest.generator.js +137 -65
  290. package/dist/builder/manifest/selector-element.d.ts +16 -0
  291. package/dist/builder/manifest/selector-element.d.ts.map +1 -0
  292. package/dist/builder/manifest/selector-element.js +46 -0
  293. package/dist/builder/manifest/template-literal.d.ts +3 -0
  294. package/dist/builder/manifest/template-literal.d.ts.map +1 -0
  295. package/dist/builder/manifest/template-literal.js +4 -0
  296. package/dist/builder/plugin-runner/plugin-runner.d.ts.map +1 -1
  297. package/dist/builder/plugin-runner/plugin-runner.js +29 -26
  298. package/dist/builder/scanner/api/angular-decorators.d.ts +84 -0
  299. package/dist/builder/scanner/api/angular-decorators.d.ts.map +1 -0
  300. package/dist/builder/scanner/api/angular-decorators.js +157 -0
  301. package/dist/builder/scanner/api/component-api.extractor.d.ts +13 -0
  302. package/dist/builder/scanner/api/component-api.extractor.d.ts.map +1 -0
  303. package/dist/builder/scanner/api/component-api.extractor.js +104 -0
  304. package/dist/builder/scanner/api/doc-tags.d.ts +13 -0
  305. package/dist/builder/scanner/api/doc-tags.d.ts.map +1 -0
  306. package/dist/builder/scanner/api/doc-tags.js +101 -0
  307. package/dist/builder/scanner/api/export-index.d.ts +18 -0
  308. package/dist/builder/scanner/api/export-index.d.ts.map +1 -0
  309. package/dist/builder/scanner/api/export-index.js +22 -0
  310. package/dist/builder/scanner/api/member.extractor.d.ts +90 -0
  311. package/dist/builder/scanner/api/member.extractor.d.ts.map +1 -0
  312. package/dist/builder/scanner/api/member.extractor.js +270 -0
  313. package/dist/builder/scanner/api/pipe-api.extractor.d.ts +12 -0
  314. package/dist/builder/scanner/api/pipe-api.extractor.d.ts.map +1 -0
  315. package/dist/builder/scanner/api/pipe-api.extractor.js +52 -0
  316. package/dist/builder/scanner/api/service-api.extractor.d.ts +14 -0
  317. package/dist/builder/scanner/api/service-api.extractor.d.ts.map +1 -0
  318. package/dist/builder/scanner/api/service-api.extractor.js +119 -0
  319. package/dist/builder/scanner/api/setup.reader.d.ts +26 -0
  320. package/dist/builder/scanner/api/setup.reader.d.ts.map +1 -0
  321. package/dist/builder/scanner/api/setup.reader.js +89 -0
  322. package/dist/builder/scanner/api/type-collector.d.ts +24 -0
  323. package/dist/builder/scanner/api/type-collector.d.ts.map +1 -0
  324. package/dist/builder/scanner/api/type-collector.js +211 -0
  325. package/dist/builder/scanner/ast-utils.d.ts +8 -0
  326. package/dist/builder/scanner/ast-utils.d.ts.map +1 -1
  327. package/dist/builder/scanner/ast-utils.js +37 -1
  328. package/dist/builder/scanner/class-hierarchy.d.ts +5 -3
  329. package/dist/builder/scanner/class-hierarchy.d.ts.map +1 -1
  330. package/dist/builder/scanner/class-hierarchy.js +12 -6
  331. package/dist/builder/scanner/component.scanner.d.ts +60 -6
  332. package/dist/builder/scanner/component.scanner.d.ts.map +1 -1
  333. package/dist/builder/scanner/component.scanner.js +229 -58
  334. package/dist/builder/scanner/composition/compose-template.d.ts +36 -0
  335. package/dist/builder/scanner/composition/compose-template.d.ts.map +1 -0
  336. package/dist/builder/scanner/composition/compose-template.js +187 -0
  337. package/dist/builder/scanner/composition/declarables.d.ts +54 -0
  338. package/dist/builder/scanner/composition/declarables.d.ts.map +1 -0
  339. package/dist/builder/scanner/composition/declarables.js +182 -0
  340. package/dist/builder/scanner/composition/match-declarables.d.ts +43 -0
  341. package/dist/builder/scanner/composition/match-declarables.d.ts.map +1 -0
  342. package/dist/builder/scanner/composition/match-declarables.js +131 -0
  343. package/dist/builder/scanner/composition/read-composition.d.ts +77 -0
  344. package/dist/builder/scanner/composition/read-composition.d.ts.map +1 -0
  345. package/dist/builder/scanner/composition/read-composition.js +302 -0
  346. package/dist/builder/scanner/composition/template-elements.d.ts +12 -0
  347. package/dist/builder/scanner/composition/template-elements.d.ts.map +1 -0
  348. package/dist/builder/scanner/composition/template-elements.js +41 -0
  349. package/dist/builder/scanner/entry-point-discovery.d.ts +5 -0
  350. package/dist/builder/scanner/entry-point-discovery.d.ts.map +1 -1
  351. package/dist/builder/scanner/entry-point-discovery.js +14 -0
  352. package/dist/builder/scanner/entry-point.scanner.d.ts +3 -1
  353. package/dist/builder/scanner/entry-point.scanner.d.ts.map +1 -1
  354. package/dist/builder/scanner/entry-point.scanner.js +7 -6
  355. package/dist/builder/scanner/index.d.ts +4 -0
  356. package/dist/builder/scanner/index.d.ts.map +1 -1
  357. package/dist/builder/scanner/index.js +2 -0
  358. package/dist/builder/scanner/input.extractor.d.ts +31 -2
  359. package/dist/builder/scanner/input.extractor.d.ts.map +1 -1
  360. package/dist/builder/scanner/input.extractor.js +73 -17
  361. package/dist/builder/scanner/pipe.scanner.d.ts +29 -0
  362. package/dist/builder/scanner/pipe.scanner.d.ts.map +1 -0
  363. package/dist/builder/scanner/pipe.scanner.js +65 -0
  364. package/dist/builder/scanner/pseudo-states.d.ts +1 -0
  365. package/dist/builder/scanner/pseudo-states.d.ts.map +1 -1
  366. package/dist/builder/scanner/pseudo-states.js +1 -1
  367. package/dist/builder/scanner/scanner.d.ts +27 -3
  368. package/dist/builder/scanner/scanner.d.ts.map +1 -1
  369. package/dist/builder/scanner/scanner.js +68 -24
  370. package/dist/builder/scanner/service/angular-decorators.d.ts +80 -0
  371. package/dist/builder/scanner/service/angular-decorators.d.ts.map +1 -0
  372. package/dist/builder/scanner/service/angular-decorators.js +154 -0
  373. package/dist/builder/scanner/service/doc-tags.d.ts +13 -0
  374. package/dist/builder/scanner/service/doc-tags.d.ts.map +1 -0
  375. package/dist/builder/scanner/service/doc-tags.js +97 -0
  376. package/dist/builder/scanner/service/export-index.d.ts +18 -0
  377. package/dist/builder/scanner/service/export-index.d.ts.map +1 -0
  378. package/dist/builder/scanner/service/export-index.js +22 -0
  379. package/dist/builder/scanner/service/member.extractor.d.ts +65 -0
  380. package/dist/builder/scanner/service/member.extractor.d.ts.map +1 -0
  381. package/dist/builder/scanner/service/member.extractor.js +216 -0
  382. package/dist/builder/scanner/service/pipe-api.extractor.d.ts +12 -0
  383. package/dist/builder/scanner/service/pipe-api.extractor.d.ts.map +1 -0
  384. package/dist/builder/scanner/service/pipe-api.extractor.js +72 -0
  385. package/dist/builder/scanner/service/service-api.extractor.d.ts +14 -0
  386. package/dist/builder/scanner/service/service-api.extractor.d.ts.map +1 -0
  387. package/dist/builder/scanner/service/service-api.extractor.js +119 -0
  388. package/dist/builder/scanner/service/setup.reader.d.ts +26 -0
  389. package/dist/builder/scanner/service/setup.reader.d.ts.map +1 -0
  390. package/dist/builder/scanner/service/setup.reader.js +89 -0
  391. package/dist/builder/scanner/service/type-collector.d.ts +23 -0
  392. package/dist/builder/scanner/service/type-collector.d.ts.map +1 -0
  393. package/dist/builder/scanner/service/type-collector.js +210 -0
  394. package/dist/builder/scanner/service.scanner.d.ts +26 -0
  395. package/dist/builder/scanner/service.scanner.d.ts.map +1 -0
  396. package/dist/builder/scanner/service.scanner.js +61 -0
  397. package/dist/builder/scanner/showcase-diagnostics.d.ts +60 -1
  398. package/dist/builder/scanner/showcase-diagnostics.d.ts.map +1 -1
  399. package/dist/builder/scanner/showcase-diagnostics.js +123 -10
  400. package/dist/builder/scanner/showcase-states.d.ts +17 -0
  401. package/dist/builder/scanner/showcase-states.d.ts.map +1 -0
  402. package/dist/builder/scanner/showcase-states.js +58 -0
  403. package/dist/builder/scanner/source-file-cache.d.ts +26 -0
  404. package/dist/builder/scanner/source-file-cache.d.ts.map +1 -0
  405. package/dist/builder/scanner/source-file-cache.js +60 -0
  406. package/dist/builder/shared/prism-pipeline.d.ts +6 -0
  407. package/dist/builder/shared/prism-pipeline.d.ts.map +1 -1
  408. package/dist/builder/shared/prism-pipeline.js +71 -18
  409. package/dist/decorator/index.d.ts +1 -1
  410. package/dist/decorator/index.d.ts.map +1 -1
  411. package/dist/decorator/showcase.types.d.ts +102 -9
  412. package/dist/decorator/showcase.types.d.ts.map +1 -1
  413. package/dist/plugin/index.d.ts +6 -1
  414. package/dist/plugin/index.d.ts.map +1 -1
  415. package/dist/plugin/index.js +4 -0
  416. package/dist/plugin/pipe.types.d.ts +36 -0
  417. package/dist/plugin/pipe.types.d.ts.map +1 -0
  418. package/dist/plugin/pipe.types.js +1 -0
  419. package/dist/plugin/plugin.types.d.ts +184 -8
  420. package/dist/plugin/plugin.types.d.ts.map +1 -1
  421. package/dist/plugin/service.types.d.ts +124 -0
  422. package/dist/plugin/service.types.d.ts.map +1 -0
  423. package/dist/plugin/service.types.js +1 -0
  424. package/dist/plugin/status.d.ts +27 -0
  425. package/dist/plugin/status.d.ts.map +1 -0
  426. package/dist/plugin/status.js +26 -0
  427. package/dist/shared/composition.d.ts +30 -0
  428. package/dist/shared/composition.d.ts.map +1 -0
  429. package/dist/shared/composition.js +29 -0
  430. package/dist/shared/pseudo-state.type.d.ts +2 -1
  431. package/dist/shared/pseudo-state.type.d.ts.map +1 -1
  432. package/dist/shared/void-elements.d.ts +3 -0
  433. package/dist/shared/void-elements.d.ts.map +1 -0
  434. package/dist/shared/void-elements.js +2 -0
  435. package/package.json +1 -1
  436. package/src/builder/build/schema.json +6 -6
  437. package/src/builder/serve/schema.json +6 -6
@@ -1,4 +1,3 @@
1
- import { deriveA11ySummary } from '../a11y/a11y-summary.js';
2
1
  /**
3
2
  * The badge a panel's tab carries, if any.
4
3
  *
@@ -18,18 +17,64 @@ export function resolvePanelBadge(panel, component, context) {
18
17
  return component ? panel.badge(component) : null;
19
18
  }
20
19
  if (panel.id === 'controls') {
21
- return context.inputCount > 0 ? { text: String(context.inputCount), variant: 'default' } : null;
20
+ return countBadge(context.inputCount, 'input');
21
+ }
22
+ if (panel.id === 'events') {
23
+ return countBadge(context.eventCount, 'event');
22
24
  }
23
25
  if (panel.id === 'a11y') {
24
- // `=== null` rather than a falsy check: a score of 0 is a real, and the
25
- // most urgent, thing to show.
26
- const result = context.a11yResult;
27
- if (result === null)
28
- return null;
29
- return {
30
- text: String(result.score),
31
- variant: deriveA11ySummary(result, context.a11yThresholds).variant
32
- };
26
+ return a11yViolationBadge(context.a11yResult);
33
27
  }
34
28
  return null;
35
29
  }
30
+ const plural = (n, noun) => `${n} ${noun}${n === 1 ? '' : 's'}`;
31
+ function countBadge(n, noun) {
32
+ return n > 0 ? { kind: 'count', text: String(n), label: plural(n, noun) } : null;
33
+ }
34
+ /**
35
+ * Reads a badge the way the tab bar renders it, including badges written
36
+ * before 22.7 that only set `variant`.
37
+ */
38
+ export function normalizePanelBadge(badge) {
39
+ if (badge === null)
40
+ return null;
41
+ if (!badge.kind && badge.variant === 'ok')
42
+ return null;
43
+ const kind = badge.kind ?? (badge.variant === 'warn' || badge.variant === 'danger' ? 'issues' : 'count');
44
+ const label = badge.label ?? badge.text;
45
+ if (kind === 'count')
46
+ return { kind, text: badge.text, label };
47
+ if (badge.text === '0')
48
+ return null;
49
+ const legacyTone = badge.variant === 'warn' || badge.variant === 'danger' ? badge.variant : undefined;
50
+ return { kind, text: badge.text, tone: badge.tone ?? legacyTone ?? 'danger', label };
51
+ }
52
+ /**
53
+ * What to tell the author of a panel whose badge still sets `variant`, or
54
+ * `null` when it does not. The panel host logs it once per panel; the badge
55
+ * keeps rendering through {@link normalizePanelBadge} until 23.0.0.
56
+ */
57
+ export function deprecatedBadgeVariantNotice(panelId, badge) {
58
+ if (badge?.variant === undefined)
59
+ return null;
60
+ return `The badge of panel "${panelId}" sets variant, which is deprecated since 22.7.0 and will be removed in 23.0.0. It is mapped to kind and tone until then; set those instead.`;
61
+ }
62
+ /**
63
+ * The a11y tab's badge, also shown on the Violations sub-tab: a number of open
64
+ * findings, not the score. The score is graded in the gauge, the sidebar and
65
+ * the panel. The tone follows the most severe violation, the same split the
66
+ * build gate draws.
67
+ */
68
+ export function a11yViolationBadge(result) {
69
+ if (result === null)
70
+ return null;
71
+ const violations = result.critical + result.serious + result.moderate + result.minor;
72
+ if (violations === 0)
73
+ return null;
74
+ return {
75
+ kind: 'issues',
76
+ text: String(violations),
77
+ tone: result.critical + result.serious > 0 ? 'danger' : 'warn',
78
+ label: plural(violations, 'violation')
79
+ };
80
+ }
@@ -1,6 +1,7 @@
1
1
  import { EnvironmentInjector, type Type } from '@angular/core';
2
2
  import type { PanelDefinition } from '../../../plugin/plugin.types.js';
3
3
  import { PrismPanelService } from '../../services/prism-panel.service.js';
4
+ import { type PrismTabItem } from '../../shared/prism-tabs.component.js';
4
5
  import * as i0 from "@angular/core";
5
6
  type RenderedPanelEntry = {
6
7
  id: string;
@@ -24,7 +25,9 @@ export declare class PrismPanelHostComponent {
24
25
  */
25
26
  private readonly a11yThresholds;
26
27
  private readonly inputCount;
27
- protected panelBadge(panel: PanelDefinition): import("../../../plugin/plugin.types.js").PanelBadge | null;
28
+ private readonly eventLog;
29
+ private panelBadge;
30
+ protected readonly tabItems: import("@angular/core").Signal<PrismTabItem[]>;
28
31
  private readonly builtInPanels;
29
32
  protected readonly allPanels: import("@angular/core").Signal<PanelDefinition[]>;
30
33
  protected readonly panelInputs: import("@angular/core").Signal<{
@@ -1 +1 @@
1
- {"version":3,"file":"prism-panel-host.component.d.ts","sourceRoot":"","sources":["../../../../src/app/panels/panel-host/prism-panel-host.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAwD,mBAAmB,EAAkB,KAAK,IAAI,EAAa,MAAM,eAAe,CAAC;AAChJ,OAAO,KAAK,EAAiB,eAAe,EAAmB,MAAM,iCAAiC,CAAC;AAGvG,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;;AAU1E,KAAK,kBAAkB,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,qBAQa,uBAAuB;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8B;IAC5D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkC;IACtD,SAAS,CAAC,QAAQ,CAAC,YAAY,oBAA6B;IAC5D,SAAS,CAAC,QAAQ,CAAC,WAAW,sBAA+B;IAC7D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4B;IACzD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgC;IAChE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IACpE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAE9D;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAO5B;IAEH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAIxB;IAEH,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,eAAe;IAQ3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkB;IAEhD,SAAS,CAAC,QAAQ,CAAC,SAAS,oDAMzB;IAEH,SAAS,CAAC,QAAQ,CAAC,WAAW;;OAE1B;IAEJ,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoC;IAE9D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsD;IACrF,SAAS,CAAC,QAAQ,CAAC,mBAAmB,uDAA8D;;IAwCpG,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,mBAAmB;yCAnIlB,uBAAuB;2CAAvB,uBAAuB;CAuJnC"}
1
+ {"version":3,"file":"prism-panel-host.component.d.ts","sourceRoot":"","sources":["../../../../src/app/panels/panel-host/prism-panel-host.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAwD,mBAAmB,EAAkB,KAAK,IAAI,EAAa,MAAM,eAAe,CAAC;AAChJ,OAAO,KAAK,EAAiB,eAAe,EAAmB,MAAM,iCAAiC,CAAC;AAGvG,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAG1E,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,sCAAsC,CAAC;;AAY7F,KAAK,kBAAkB,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,qBAQa,uBAAuB;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8B;IAC5D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkC;IACtD,SAAS,CAAC,QAAQ,CAAC,YAAY,oBAA6B;IAC5D,SAAS,CAAC,QAAQ,CAAC,WAAW,sBAA+B;IAC7D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4B;IACzD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgC;IAChE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IACpE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAE9D;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAO5B;IAEH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAIxB;IAEH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;IAEzD,OAAO,CAAC,UAAU;IAgBlB,SAAS,CAAC,QAAQ,CAAC,QAAQ,iDAEzB;IAEF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkB;IAEhD,SAAS,CAAC,QAAQ,CAAC,SAAS,oDAE1B;IAEF,SAAS,CAAC,QAAQ,CAAC,WAAW;;OAE1B;IAEJ,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoC;IAE9D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsD;IACrF,SAAS,CAAC,QAAQ,CAAC,mBAAmB,uDAA8D;;IAwCpG,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,mBAAmB;yCA7IlB,uBAAuB;2CAAvB,uBAAuB;CAiKnC"}
@@ -1,73 +1,35 @@
1
1
  import { NgComponentOutlet } from '@angular/common';
2
2
  import { ChangeDetectionStrategy, Component, computed, effect, EnvironmentInjector, inject, signal, untracked } from '@angular/core';
3
- import { PrismIconComponent } from '../../icons/prism-icon.component.js';
3
+ import { PrismEventLogService } from '../../services/prism-event-log.service.js';
4
4
  import { PrismNavigationService } from '../../services/prism-navigation.service.js';
5
5
  import { PrismPanelService } from '../../services/prism-panel.service.js';
6
6
  import { PrismPluginService } from '../../services/prism-plugin.service.js';
7
7
  import { PrismRendererService } from '../../services/prism-renderer.service.js';
8
+ import { PrismTabsComponent } from '../../shared/prism-tabs.component.js';
8
9
  import { PRISM_CONFIG, PRISM_MANIFEST } from '../../tokens/prism-tokens.js';
9
10
  import { A11yAuditService } from '../a11y/a11y-audit.service.js';
10
11
  import { resolveA11yThresholds } from '../a11y/a11y-thresholds.js';
11
12
  import { BUILTIN_PANELS } from '../builtin-panels.js';
12
- import { resolvePanelBadge } from './panel-badge.js';
13
+ import { addonPanelsFor } from './addon-panels.js';
14
+ import { deprecatedBadgeVariantNotice, normalizePanelBadge, resolvePanelBadge } from './panel-badge.js';
13
15
  import * as i0 from "@angular/core";
14
16
  const _forTrack0 = ($index, $item) => $item.id;
15
- function PrismPanelHostComponent_For_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
16
- i0.ɵɵelement(0, "prism-icon", 6);
17
- } if (rf & 2) {
18
- const panel_r2 = i0.ɵɵnextContext().$implicit;
19
- i0.ɵɵproperty("name", panel_r2.icon)("size", 13);
20
- } }
21
- function PrismPanelHostComponent_For_3_Conditional_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
22
- i0.ɵɵelementStart(0, "span", 8);
23
- i0.ɵɵtext(1);
24
- i0.ɵɵelementEnd();
25
- } if (rf & 2) {
26
- const badge_r4 = i0.ɵɵnextContext();
27
- i0.ɵɵclassProp("warn", badge_r4.variant === "warn")("danger", badge_r4.variant === "danger");
28
- i0.ɵɵadvance();
29
- i0.ɵɵtextInterpolate(badge_r4.text);
30
- } }
31
- function PrismPanelHostComponent_For_3_Conditional_3_Template(rf, ctx) { if (rf & 1) {
32
- i0.ɵɵconditionalCreate(0, PrismPanelHostComponent_For_3_Conditional_3_Conditional_0_Template, 2, 5, "span", 7);
33
- } if (rf & 2) {
34
- i0.ɵɵconditional(ctx.variant !== "ok" ? 0 : -1);
35
- } }
36
- function PrismPanelHostComponent_For_3_Template(rf, ctx) { if (rf & 1) {
37
- const _r1 = i0.ɵɵgetCurrentView();
38
- i0.ɵɵelementStart(0, "button", 5);
39
- i0.ɵɵlistener("click", function PrismPanelHostComponent_For_3_Template_button_click_0_listener() { const panel_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.panelService.activePanelId.set(panel_r2.id)); });
40
- i0.ɵɵconditionalCreate(1, PrismPanelHostComponent_For_3_Conditional_1_Template, 1, 2, "prism-icon", 6);
41
- i0.ɵɵtext(2);
42
- i0.ɵɵconditionalCreate(3, PrismPanelHostComponent_For_3_Conditional_3_Template, 1, 1);
43
- i0.ɵɵelementEnd();
44
- } if (rf & 2) {
45
- let tmp_15_0;
46
- const panel_r2 = ctx.$implicit;
47
- const ctx_r2 = i0.ɵɵnextContext();
48
- i0.ɵɵclassProp("p-tab--active", ctx_r2.panelService.activePanelId() === panel_r2.id);
49
- i0.ɵɵattribute("aria-selected", ctx_r2.panelService.activePanelId() === panel_r2.id)("aria-controls", ctx_r2.panelService.activePanelId() === panel_r2.id ? "panel-" + panel_r2.id : null);
50
- i0.ɵɵadvance();
51
- i0.ɵɵconditional(panel_r2.icon ? 1 : -1);
52
- i0.ɵɵadvance();
53
- i0.ɵɵtextInterpolate1(" ", panel_r2.label, " ");
54
- i0.ɵɵadvance();
55
- i0.ɵɵconditional((tmp_15_0 = ctx_r2.panelBadge(panel_r2)) ? 3 : -1, tmp_15_0);
56
- } }
57
- function PrismPanelHostComponent_For_6_ng_container_1_Template(rf, ctx) { if (rf & 1) {
17
+ function PrismPanelHostComponent_For_5_ng_container_1_Template(rf, ctx) { if (rf & 1) {
58
18
  i0.ɵɵelementContainer(0);
59
19
  } }
60
- function PrismPanelHostComponent_For_6_Template(rf, ctx) { if (rf & 1) {
20
+ function PrismPanelHostComponent_For_5_Template(rf, ctx) { if (rf & 1) {
61
21
  i0.ɵɵelementStart(0, "div", 4);
62
- i0.ɵɵtemplate(1, PrismPanelHostComponent_For_6_ng_container_1_Template, 1, 0, "ng-container", 9);
22
+ i0.ɵɵtemplate(1, PrismPanelHostComponent_For_5_ng_container_1_Template, 1, 0, "ng-container", 5);
63
23
  i0.ɵɵelementEnd();
64
24
  } if (rf & 2) {
65
- const entry_r5 = ctx.$implicit;
66
- const ctx_r2 = i0.ɵɵnextContext();
67
- i0.ɵɵproperty("hidden", entry_r5.id !== ctx_r2.panelService.activePanelId());
25
+ const entry_r1 = ctx.$implicit;
26
+ const ctx_r1 = i0.ɵɵnextContext();
27
+ i0.ɵɵproperty("hidden", entry_r1.id !== ctx_r1.panelService.activePanelId());
68
28
  i0.ɵɵadvance();
69
- i0.ɵɵproperty("ngComponentOutlet", entry_r5.component)("ngComponentOutletInputs", ctx_r2.panelInputs())("ngComponentOutletInjector", entry_r5.injector ?? ctx_r2.envInjector);
29
+ i0.ɵɵproperty("ngComponentOutlet", entry_r1.component)("ngComponentOutletInputs", ctx_r1.panelInputs())("ngComponentOutletInjector", entry_r1.injector ?? ctx_r1.envInjector);
70
30
  } }
31
+ /** Panels whose badge still sets `variant`, warned about once per page load. */
32
+ const warnedVariantBadges = new Set();
71
33
  export class PrismPanelHostComponent {
72
34
  pluginService = inject(PrismPluginService);
73
35
  nav = inject(PrismNavigationService);
@@ -95,21 +57,25 @@ export class PrismPanelHostComponent {
95
57
  return comp?.meta.inputs.length ?? 0;
96
58
  }, /* @ts-ignore */
97
59
  ...(ngDevMode ? [{ debugName: "inputCount" }] : /* istanbul ignore next */ []));
60
+ eventLog = inject(PrismEventLogService);
98
61
  panelBadge(panel) {
99
- return resolvePanelBadge(panel, this.nav.activeComponent(), {
62
+ const badge = resolvePanelBadge(panel, this.nav.activeComponent(), {
100
63
  inputCount: this.inputCount(),
64
+ eventCount: this.eventLog.events().length,
101
65
  a11yResult: this.auditService.scoreResult(),
102
66
  a11yThresholds: this.a11yThresholds()
103
67
  });
68
+ const notice = deprecatedBadgeVariantNotice(panel.id, badge);
69
+ if (notice && !warnedVariantBadges.has(panel.id)) {
70
+ warnedVariantBadges.add(panel.id);
71
+ console.warn(`[ng-prism] ${notice}`);
72
+ }
73
+ return normalizePanelBadge(badge);
104
74
  }
75
+ tabItems = computed(() => this.allPanels().map((panel) => ({ id: panel.id, label: panel.label, icon: panel.icon, badge: this.panelBadge(panel) })), /* @ts-ignore */
76
+ ...(ngDevMode ? [{ debugName: "tabItems" }] : /* istanbul ignore next */ []));
105
77
  builtInPanels = BUILTIN_PANELS;
106
- allPanels = computed(() => {
107
- const comp = this.nav.activeComponent();
108
- const panels = [...this.builtInPanels.filter((p) => p.placement !== 'view'), ...this.pluginService.addonPanels()];
109
- if (!comp)
110
- return panels;
111
- return panels.filter((p) => !p.isVisible || p.isVisible(comp));
112
- }, /* @ts-ignore */
78
+ allPanels = computed(() => addonPanelsFor([...this.builtInPanels.filter((p) => p.placement !== 'view'), ...this.pluginService.addonPanels()], this.nav.activeComponent()), /* @ts-ignore */
113
79
  ...(ngDevMode ? [{ debugName: "allPanels" }] : /* istanbul ignore next */ []));
114
80
  panelInputs = computed(() => ({
115
81
  activeComponent: this.nav.activeComponent()
@@ -199,24 +165,24 @@ export class PrismPanelHostComponent {
199
165
  this.renderedPanels.set(next);
200
166
  }
201
167
  static ɵfac = function PrismPanelHostComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PrismPanelHostComponent)(); };
202
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PrismPanelHostComponent, selectors: [["prism-panel-host"]], decls: 7, vars: 1, consts: [[1, "panel"], ["role", "tablist", 1, "panel-tabs"], ["role", "tab", 1, "p-tab", 3, "p-tab--active"], ["role", "tabpanel", 1, "panel-body", 3, "id"], [1, "panel-pane", 3, "hidden"], ["role", "tab", 1, "p-tab", 3, "click"], [3, "name", "size"], [1, "p-tab-badge", 3, "warn", "danger"], [1, "p-tab-badge"], [4, "ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector"]], template: function PrismPanelHostComponent_Template(rf, ctx) { if (rf & 1) {
203
- i0.ɵɵelementStart(0, "div", 0)(1, "nav", 1);
204
- i0.ɵɵrepeaterCreate(2, PrismPanelHostComponent_For_3_Template, 4, 7, "button", 2, _forTrack0);
205
- i0.ɵɵelementEnd();
206
- i0.ɵɵelementStart(4, "div", 3);
207
- i0.ɵɵrepeaterCreate(5, PrismPanelHostComponent_For_6_Template, 2, 4, "div", 4, _forTrack0);
168
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PrismPanelHostComponent, selectors: [["prism-panel-host"]], decls: 6, vars: 3, consts: [[1, "panel"], [1, "panel-tabs"], ["ariaLabel", "Panels", "panelIdPrefix", "panel-", 3, "activeChange", "items", "active"], ["role", "tabpanel", 1, "panel-body", 3, "id"], [1, "panel-pane", 3, "hidden"], [4, "ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector"]], template: function PrismPanelHostComponent_Template(rf, ctx) { if (rf & 1) {
169
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "prism-tabs", 2);
170
+ i0.ɵɵlistener("activeChange", function PrismPanelHostComponent_Template_prism_tabs_activeChange_2_listener($event) { return $event && ctx.panelService.activePanelId.set($event); });
171
+ i0.ɵɵelementEnd()();
172
+ i0.ɵɵelementStart(3, "div", 3);
173
+ i0.ɵɵrepeaterCreate(4, PrismPanelHostComponent_For_5_Template, 2, 4, "div", 4, _forTrack0);
208
174
  i0.ɵɵelementEnd()();
209
175
  } if (rf & 2) {
210
176
  i0.ɵɵadvance(2);
211
- i0.ɵɵrepeater(ctx.allPanels());
212
- i0.ɵɵadvance(2);
177
+ i0.ɵɵproperty("items", ctx.tabItems())("active", ctx.panelService.activePanelId());
178
+ i0.ɵɵadvance();
213
179
  i0.ɵɵproperty("id", "panel-" + ctx.panelService.activePanelId());
214
180
  i0.ɵɵadvance();
215
181
  i0.ɵɵrepeater(ctx.renderedPanelsArray());
216
- } }, dependencies: [NgComponentOutlet, PrismIconComponent], styles: [".panel[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n background: var(--%NS%prism-bg-elevated);\n border-top: 1px solid var(--%NS%prism-border);\n}\n\n.panel-tabs[_ngcontent-%COMP%] {\n display: flex;\n flex-shrink: 0;\n gap: 2px;\n align-items: center;\n height: 40px;\n padding: 0 16px;\n overflow-x: auto;\n scrollbar-width: none;\n background: var(--%NS%prism-bg);\n border-bottom: 1px solid var(--%NS%prism-border);\n}\n\n.panel-tabs[_ngcontent-%COMP%]::-webkit-scrollbar {\n display: none;\n}\n\n.p-tab[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n gap: 7px;\n align-items: center;\n height: 100%;\n padding: 0 12px;\n font-family: var(--%NS%font-sans);\n font-size: var(--%NS%fs-md);\n font-weight: 500;\n color: var(--%NS%prism-text-muted);\n white-space: nowrap;\n cursor: pointer;\n background: none;\n border: none;\n transition: color var(--%NS%dur-fast);\n}\n\n.p-tab[_ngcontent-%COMP%]:hover {\n color: var(--%NS%prism-text-2);\n}\n\n.p-tab--active[_ngcontent-%COMP%] {\n color: var(--%NS%prism-text);\n}\n\n.p-tab--%NS%active[_ngcontent-%COMP%]::after {\n position: absolute;\n right: 8px;\n bottom: -1px;\n left: 8px;\n height: 2px;\n content: '';\n background: linear-gradient(90deg, var(--%NS%prism-primary-from), var(--%NS%prism-primary-to));\n border-radius: 1px;\n}\n\n.p-tab-badge[_ngcontent-%COMP%] {\n display: grid;\n place-items: center;\n min-width: 16px;\n height: 16px;\n padding: 0 5px;\n font-family: var(--%NS%font-mono);\n font-size: 10px;\n font-weight: 700;\n color: var(--%NS%prism-primary);\n background: color-mix(in srgb, var(--%NS%prism-primary) 18%, transparent);\n border-radius: 8px;\n}\n\n.p-tab-badge.warn[_ngcontent-%COMP%] {\n color: var(--%NS%prism-warn);\n background: color-mix(in srgb, var(--%NS%prism-warn) 18%, transparent);\n}\n\n.p-tab-badge.danger[_ngcontent-%COMP%] {\n color: var(--%NS%prism-danger);\n background: color-mix(in srgb, var(--%NS%prism-danger) 18%, transparent);\n}\n\n.panel-tabs-right[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n align-items: center;\n padding-left: 10px;\n margin-left: auto;\n}\n\n.icon-btn[_ngcontent-%COMP%] {\n display: grid;\n place-items: center;\n width: 28px;\n height: 28px;\n color: var(--%NS%prism-text-muted);\n cursor: pointer;\n background: none;\n border: none;\n border-radius: var(--%NS%radius-sm);\n transition: all var(--%NS%dur-fast);\n}\n\n.icon-btn[_ngcontent-%COMP%]:hover {\n color: var(--%NS%prism-text);\n background: var(--%NS%prism-input-bg);\n}\n\n.panel-body[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow: auto;\n background: var(--%NS%prism-bg-elevated);\n}\n\n.panel-body[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n.panel-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--%NS%prism-border-strong);\n border-radius: 4px;\n}\n\n.panel-pane[_ngcontent-%COMP%] {\n height: 100%;\n}\n\n.panel-pane[hidden][_ngcontent-%COMP%] {\n display: none;\n}\n\n[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--%NS%prism-primary);\n outline-offset: 2px;\n}"] });
182
+ } }, dependencies: [NgComponentOutlet, PrismTabsComponent], styles: [".panel[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n background: var(--%NS%prism-bg-surface);\n border-top: 1px solid var(--%NS%prism-border);\n}\n\n.panel-tabs[_ngcontent-%COMP%] {\n display: flex;\n flex-shrink: 0;\n height: 38px;\n padding: 0 12px;\n background: var(--%NS%prism-bg);\n border-bottom: 1px solid var(--%NS%prism-border);\n}\n\n.panel-body[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow: auto;\n background: var(--%NS%prism-bg-surface);\n}\n\n.panel-body[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n.panel-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--%NS%prism-border-strong);\n border-radius: 4px;\n}\n\n.panel-pane[_ngcontent-%COMP%] {\n height: 100%;\n}\n\n.panel-pane[hidden][_ngcontent-%COMP%] {\n display: none;\n}\n\n[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--%NS%prism-primary);\n outline-offset: 2px;\n}"] });
217
183
  }
218
184
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PrismPanelHostComponent, [{
219
185
  type: Component,
220
- args: [{ selector: 'prism-panel-host', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgComponentOutlet, PrismIconComponent], template: "<div class=\"panel\">\n <nav\n class=\"panel-tabs\"\n role=\"tablist\">\n @for (panel of allPanels(); track panel.id) {\n <button\n class=\"p-tab\"\n [class.p-tab--active]=\"panelService.activePanelId() === panel.id\"\n (click)=\"panelService.activePanelId.set(panel.id)\"\n role=\"tab\"\n [attr.aria-selected]=\"panelService.activePanelId() === panel.id\"\n [attr.aria-controls]=\"panelService.activePanelId() === panel.id ? 'panel-' + panel.id : null\">\n @if (panel.icon) {\n <prism-icon\n [name]=\"panel.icon\"\n [size]=\"13\" />\n }\n {{ panel.label }}\n @if (panelBadge(panel); as badge) {\n @if (badge.variant !== 'ok') {\n <span\n class=\"p-tab-badge\"\n [class.warn]=\"badge.variant === 'warn'\"\n [class.danger]=\"badge.variant === 'danger'\"\n >{{ badge.text }}</span\n >\n }\n }\n </button>\n }\n </nav>\n <div\n class=\"panel-body\"\n [id]=\"'panel-' + panelService.activePanelId()\"\n role=\"tabpanel\">\n @for (entry of renderedPanelsArray(); track entry.id) {\n <div\n class=\"panel-pane\"\n [hidden]=\"entry.id !== panelService.activePanelId()\">\n <ng-container *ngComponentOutlet=\"entry.component; inputs: panelInputs(); injector: entry.injector ?? envInjector\" />\n </div>\n }\n </div>\n</div>\n", styles: [".panel {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n background: var(--prism-bg-elevated);\n border-top: 1px solid var(--prism-border);\n}\n\n.panel-tabs {\n display: flex;\n flex-shrink: 0;\n gap: 2px;\n align-items: center;\n height: 40px;\n padding: 0 16px;\n overflow-x: auto;\n scrollbar-width: none;\n background: var(--prism-bg);\n border-bottom: 1px solid var(--prism-border);\n}\n\n.panel-tabs::-webkit-scrollbar {\n display: none;\n}\n\n.p-tab {\n position: relative;\n display: flex;\n gap: 7px;\n align-items: center;\n height: 100%;\n padding: 0 12px;\n font-family: var(--font-sans);\n font-size: var(--fs-md);\n font-weight: 500;\n color: var(--prism-text-muted);\n white-space: nowrap;\n cursor: pointer;\n background: none;\n border: none;\n transition: color var(--dur-fast);\n}\n\n.p-tab:hover {\n color: var(--prism-text-2);\n}\n\n.p-tab--active {\n color: var(--prism-text);\n}\n\n.p-tab--active::after {\n position: absolute;\n right: 8px;\n bottom: -1px;\n left: 8px;\n height: 2px;\n content: '';\n background: linear-gradient(90deg, var(--prism-primary-from), var(--prism-primary-to));\n border-radius: 1px;\n}\n\n.p-tab-badge {\n display: grid;\n place-items: center;\n min-width: 16px;\n height: 16px;\n padding: 0 5px;\n font-family: var(--font-mono);\n font-size: 10px;\n font-weight: 700;\n color: var(--prism-primary);\n background: color-mix(in srgb, var(--prism-primary) 18%, transparent);\n border-radius: 8px;\n}\n\n.p-tab-badge.warn {\n color: var(--prism-warn);\n background: color-mix(in srgb, var(--prism-warn) 18%, transparent);\n}\n\n.p-tab-badge.danger {\n color: var(--prism-danger);\n background: color-mix(in srgb, var(--prism-danger) 18%, transparent);\n}\n\n.panel-tabs-right {\n display: flex;\n gap: 4px;\n align-items: center;\n padding-left: 10px;\n margin-left: auto;\n}\n\n.icon-btn {\n display: grid;\n place-items: center;\n width: 28px;\n height: 28px;\n color: var(--prism-text-muted);\n cursor: pointer;\n background: none;\n border: none;\n border-radius: var(--radius-sm);\n transition: all var(--dur-fast);\n}\n\n.icon-btn:hover {\n color: var(--prism-text);\n background: var(--prism-input-bg);\n}\n\n.panel-body {\n flex: 1;\n min-height: 0;\n overflow: auto;\n background: var(--prism-bg-elevated);\n}\n\n.panel-body::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n.panel-body::-webkit-scrollbar-thumb {\n background: var(--prism-border-strong);\n border-radius: 4px;\n}\n\n.panel-pane {\n height: 100%;\n}\n\n.panel-pane[hidden] {\n display: none;\n}\n\n:focus-visible {\n outline: 2px solid var(--prism-primary);\n outline-offset: 2px;\n}\n"] }]
186
+ args: [{ selector: 'prism-panel-host', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgComponentOutlet, PrismTabsComponent], template: "<div class=\"panel\">\n <div class=\"panel-tabs\">\n <prism-tabs\n ariaLabel=\"Panels\"\n panelIdPrefix=\"panel-\"\n [items]=\"tabItems()\"\n [active]=\"panelService.activePanelId()\"\n (activeChange)=\"$event && panelService.activePanelId.set($event)\" />\n </div>\n <div\n class=\"panel-body\"\n [id]=\"'panel-' + panelService.activePanelId()\"\n role=\"tabpanel\">\n @for (entry of renderedPanelsArray(); track entry.id) {\n <div\n class=\"panel-pane\"\n [hidden]=\"entry.id !== panelService.activePanelId()\">\n <ng-container *ngComponentOutlet=\"entry.component; inputs: panelInputs(); injector: entry.injector ?? envInjector\" />\n </div>\n }\n </div>\n</div>\n", styles: [".panel {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n background: var(--prism-bg-surface);\n border-top: 1px solid var(--prism-border);\n}\n\n.panel-tabs {\n display: flex;\n flex-shrink: 0;\n height: 38px;\n padding: 0 12px;\n background: var(--prism-bg);\n border-bottom: 1px solid var(--prism-border);\n}\n\n.panel-body {\n flex: 1;\n min-height: 0;\n overflow: auto;\n background: var(--prism-bg-surface);\n}\n\n.panel-body::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n.panel-body::-webkit-scrollbar-thumb {\n background: var(--prism-border-strong);\n border-radius: 4px;\n}\n\n.panel-pane {\n height: 100%;\n}\n\n.panel-pane[hidden] {\n display: none;\n}\n\n:focus-visible {\n outline: 2px solid var(--prism-primary);\n outline-offset: 2px;\n}\n"] }]
221
187
  }], () => [], null); })();
222
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismPanelHostComponent, { className: "PrismPanelHostComponent", filePath: "app/panels/panel-host/prism-panel-host.component.ts", lineNumber: 31 }); })();
188
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismPanelHostComponent, { className: "PrismPanelHostComponent", filePath: "app/panels/panel-host/prism-panel-host.component.ts", lineNumber: 36 }); })();
@@ -1,12 +1,18 @@
1
- import { type ForcedPseudoStates } from '../../shared/pseudo-state.type.js';
1
+ import { type ForcedPseudoStates, type PseudoState } from '../../shared/pseudo-state.type.js';
2
2
  import type { PseudoStyleSheets } from './pseudo-stylesheets.js';
3
+ import { type StateFit } from './state-fit.js';
3
4
  /** The element a marker forces states in, and the states it forces there. */
4
5
  export interface AppliedPseudoStates {
5
6
  root: Element;
6
- states: ForcedPseudoStates;
7
+ /** The variant's own states with the toggles on top, unfiltered as in 22.5.0. */
8
+ states: ForcedPseudoStates | null;
9
+ /** The active state's pseudo, `null` when no state is active. */
10
+ state: ForcedPseudoStates | null;
11
+ /** `null` when `state` is `null`. Re-evaluated on every mark. */
12
+ fit: StateFit | null;
7
13
  }
8
- /** True when `states` forces at least one state on at least one target. */
9
- export declare function forcesAnyState(states: ForcedPseudoStates | null | undefined): states is ForcedPseudoStates;
14
+ /** The pseudo-classes actually forced right now: `states`, plus `state` while it fits. */
15
+ export declare function appliedStateNames(applied: AppliedPseudoStates | null): PseudoState[];
10
16
  /**
11
17
  * Forces a variant's pseudo states on one rendered component.
12
18
  *
@@ -16,9 +22,19 @@ export declare function forcesAnyState(states: ForcedPseudoStates | null | undef
16
22
  * component's own CSS then applies, with no special case for sibling
17
23
  * combinators, pseudo-elements, `:has()` or `:not()`.
18
24
  *
25
+ * A second layer carries the component state that is active: its pseudo is
26
+ * forced only while it fits, and only on the targets a user could reach
27
+ * ({@link evaluateStateFit}). The variant's own states are forced as they are.
28
+ * Fit and reach are measured with the variant's classes and the state's on all
29
+ * of its targets at once, on every pass. The first pass, the one
30
+ * `data-prism-rendered` waits for, therefore marks what any later pass would,
31
+ * and a rule that takes away the pointer under its own `:hover` reads as not
32
+ * fitting, as the browser could not keep such an element hovered either.
33
+ *
19
34
  * The root is watched while states are forced: an element rendered later
20
35
  * (`@if`), or one whose classes or attributes change so that it starts or
21
- * stops matching a selector (`button:not([disabled])`), is marked again.
36
+ * stops matching a selector (`button:not([disabled])`), is marked again, and
37
+ * the state is checked again.
22
38
  *
23
39
  * One marker per rendered component: the Playground canvas has one, each
24
40
  * Overview cell has its own, so a state never leaks into a neighbouring cell.
@@ -28,17 +44,23 @@ export declare class PseudoStateMarker {
28
44
  private readonly _applied;
29
45
  private observer;
30
46
  /**
31
- * What the marks are in place for, `null` while nothing is forced. A
32
- * signal, so the renderer can hold back `data-prism-rendered` until the
33
- * states it reports are the ones on screen.
47
+ * What the marks are in place for, `null` while nothing is forced and no
48
+ * state is active. A signal, so the renderer can hold back
49
+ * `data-prism-rendered` until the states it reports are the ones on screen.
50
+ * A state that does not fit keeps it set, with the reason in `fit`.
34
51
  */
35
52
  readonly applied: import("@angular/core").Signal<AppliedPseudoStates | null>;
36
53
  constructor(stylesheets: PseudoStyleSheets);
37
- /** Forces `states` under `root`, replacing whatever this marker forced before. */
38
- apply(root: Element | null, states: ForcedPseudoStates | null | undefined): void;
54
+ /**
55
+ * Forces `states`, and `state` where it fits, under `root`, replacing
56
+ * whatever this marker forced before.
57
+ */
58
+ apply(root: Element | null, states: ForcedPseudoStates | null | undefined, state?: ForcedPseudoStates | null): void;
39
59
  /** Removes every mark, stops watching, and releases the stylesheets. */
40
60
  clear(): void;
41
61
  private observe;
42
62
  private mark;
63
+ /** Puts the class of `name` on exactly `targets` under `root`. */
64
+ private write;
43
65
  }
44
66
  //# sourceMappingURL=pseudo-state-marker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pseudo-state-marker.d.ts","sourceRoot":"","sources":["../../../src/app/pseudo/pseudo-state-marker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,kBAAkB,EAAoC,MAAM,mCAAmC,CAAC;AAE9G,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,6EAA6E;AAC7E,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,kBAAkB,CAAC;CAC9B;AAED,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,IAAI,kBAAkB,CAE1G;AA8CD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,iBAAiB;IAWd,OAAO,CAAC,QAAQ,CAAC,WAAW;IAVxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4C;IACrE,OAAO,CAAC,QAAQ,CAAiC;IAEjD;;;;OAIG;IACH,QAAQ,CAAC,OAAO,6DAA8B;gBAEjB,WAAW,EAAE,iBAAiB;IAE3D,kFAAkF;IAClF,KAAK,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,MAAM,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAqBhF,wEAAwE;IACxE,KAAK,IAAI,IAAI;IAab,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,IAAI;CAoBf"}
1
+ {"version":3,"file":"pseudo-state-marker.d.ts","sourceRoot":"","sources":["../../../src/app/pseudo/pseudo-state-marker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,kBAAkB,EAAiB,KAAK,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAE7G,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EAAsC,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEnF,6EAA6E;AAC7E,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,iFAAiF;IACjF,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAClC,iEAAiE;IACjE,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACjC,iEAAiE;IACjE,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;CACxB;AAED,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,GAAG,WAAW,EAAE,CAMpF;AAcD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,iBAAiB;IAYd,OAAO,CAAC,QAAQ,CAAC,WAAW;IAXxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4C;IACrE,OAAO,CAAC,QAAQ,CAAiC;IAEjD;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,6DAA8B;gBAEjB,WAAW,EAAE,iBAAiB;IAE3D;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,MAAM,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,CAAC,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI;IAqBnH,wEAAwE;IACxE,KAAK,IAAI,IAAI;IAab,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,IAAI;IA2CZ,kEAAkE;IAClE,OAAO,CAAC,KAAK;CAYhB"}
@@ -1,49 +1,20 @@
1
1
  import { signal } from '@angular/core';
2
2
  import { PSEUDO_STATES } from '../../shared/pseudo-state.type.js';
3
3
  import { PSEUDO_CLASS_PREFIX, pseudoStateClass } from './pseudo-selector.js';
4
- /** True when `states` forces at least one state on at least one target. */
5
- export function forcesAnyState(states) {
6
- return !!states && PSEUDO_STATES.some((state) => hasTarget(states[state]));
4
+ import { forcesAnyState, hasTarget, resolveTargets } from './pseudo-targets.js';
5
+ import { evaluateStateFit, reachableTargets } from './state-fit.js';
6
+ /** The pseudo-classes actually forced right now: `states`, plus `state` while it fits. */
7
+ export function appliedStateNames(applied) {
8
+ if (!applied)
9
+ return [];
10
+ const { states, state, fit } = applied;
11
+ const stateForced = !!state && !!fit?.fits;
12
+ return PSEUDO_STATES.filter((name) => hasTarget(states?.[name]) || (stateForced && hasTarget(state[name])));
7
13
  }
8
- function hasTarget(target) {
9
- if (target === true)
10
- return true;
11
- if (typeof target === 'string')
12
- return target.trim() !== '';
13
- return Array.isArray(target) && target.some((selector) => typeof selector === 'string' && selector.trim() !== '');
14
- }
15
- const warnedSelectors = new Set();
16
- /**
17
- * The elements under `root` a target names. `root` counts: a selector can name
18
- * the component's host, and `true` includes it.
19
- */
20
- function resolveTargets(root, target) {
21
- const targets = new Set();
22
- if (target === undefined)
23
- return targets;
24
- if (target === true) {
25
- targets.add(root);
26
- for (const el of Array.from(root.querySelectorAll('*')))
27
- targets.add(el);
28
- return targets;
29
- }
30
- for (const selector of typeof target === 'string' ? [target] : target) {
31
- if (typeof selector !== 'string' || selector.trim() === '')
32
- continue;
33
- try {
34
- if (root.matches(selector))
35
- targets.add(root);
36
- for (const el of Array.from(root.querySelectorAll(selector)))
37
- targets.add(el);
38
- }
39
- catch {
40
- if (!warnedSelectors.has(selector)) {
41
- warnedSelectors.add(selector);
42
- console.warn(`[ng-prism] "${selector}" in a variant's pseudo states is not a valid selector, skipping it.`);
43
- }
44
- }
45
- }
46
- return targets;
14
+ function sameFit(a, b) {
15
+ if (a === null || b === null)
16
+ return a === b;
17
+ return a.fits ? b.fits : !b.fits && a.reason === b.reason;
47
18
  }
48
19
  /** Every element under `root`, `root` included, that carries a forced-state class. */
49
20
  function markedElements(root) {
@@ -59,9 +30,19 @@ function markedElements(root) {
59
30
  * component's own CSS then applies, with no special case for sibling
60
31
  * combinators, pseudo-elements, `:has()` or `:not()`.
61
32
  *
33
+ * A second layer carries the component state that is active: its pseudo is
34
+ * forced only while it fits, and only on the targets a user could reach
35
+ * ({@link evaluateStateFit}). The variant's own states are forced as they are.
36
+ * Fit and reach are measured with the variant's classes and the state's on all
37
+ * of its targets at once, on every pass. The first pass, the one
38
+ * `data-prism-rendered` waits for, therefore marks what any later pass would,
39
+ * and a rule that takes away the pointer under its own `:hover` reads as not
40
+ * fitting, as the browser could not keep such an element hovered either.
41
+ *
62
42
  * The root is watched while states are forced: an element rendered later
63
43
  * (`@if`), or one whose classes or attributes change so that it starts or
64
- * stops matching a selector (`button:not([disabled])`), is marked again.
44
+ * stops matching a selector (`button:not([disabled])`), is marked again, and
45
+ * the state is checked again.
65
46
  *
66
47
  * One marker per rendered component: the Playground canvas has one, each
67
48
  * Overview cell has its own, so a state never leaks into a neighbouring cell.
@@ -72,17 +53,21 @@ export class PseudoStateMarker {
72
53
  ...(ngDevMode ? [{ debugName: "_applied" }] : /* istanbul ignore next */ []));
73
54
  observer = null;
74
55
  /**
75
- * What the marks are in place for, `null` while nothing is forced. A
76
- * signal, so the renderer can hold back `data-prism-rendered` until the
77
- * states it reports are the ones on screen.
56
+ * What the marks are in place for, `null` while nothing is forced and no
57
+ * state is active. A signal, so the renderer can hold back
58
+ * `data-prism-rendered` until the states it reports are the ones on screen.
59
+ * A state that does not fit keeps it set, with the reason in `fit`.
78
60
  */
79
61
  applied = this._applied.asReadonly();
80
62
  constructor(stylesheets) {
81
63
  this.stylesheets = stylesheets;
82
64
  }
83
- /** Forces `states` under `root`, replacing whatever this marker forced before. */
84
- apply(root, states) {
85
- if (!root || !forcesAnyState(states)) {
65
+ /**
66
+ * Forces `states`, and `state` where it fits, under `root`, replacing
67
+ * whatever this marker forced before.
68
+ */
69
+ apply(root, states, state) {
70
+ if (!root || (!forcesAnyState(states) && !state)) {
86
71
  this.clear();
87
72
  return;
88
73
  }
@@ -97,7 +82,7 @@ export class PseudoStateMarker {
97
82
  // Same root, new variant: its styles may have arrived since.
98
83
  this.stylesheets.sync();
99
84
  }
100
- this._applied.set({ root, states });
85
+ this._applied.set({ root, states: states ?? null, state: state ?? null, fit: null });
101
86
  this.mark();
102
87
  }
103
88
  /** Removes every mark, stops watching, and releases the stylesheets. */
@@ -117,9 +102,9 @@ export class PseudoStateMarker {
117
102
  observe(root) {
118
103
  if (typeof MutationObserver === 'undefined')
119
104
  return;
120
- // Our own class changes come back through here too; the second pass finds
121
- // nothing to change. Inline styles alone cannot change what a selector
122
- // matches, and an animation can write them every frame.
105
+ // Inline styles alone cannot change what a selector matches, and an
106
+ // animation can write them every frame. The marker's own writes never
107
+ // get here, see the end of mark.
123
108
  this.observer = new MutationObserver((records) => {
124
109
  if (records.some((record) => record.attributeName !== 'style'))
125
110
  this.mark();
@@ -130,20 +115,51 @@ export class PseudoStateMarker {
130
115
  const applied = this._applied();
131
116
  if (!applied)
132
117
  return;
133
- const { root, states } = applied;
134
- for (const state of PSEUDO_STATES) {
135
- const cls = pseudoStateClass(state);
136
- const targets = resolveTargets(root, states[state]);
137
- // `classList.remove` writes the attribute even when the class is absent,
138
- // and the write would come back through the observer as a mutation.
139
- for (const el of markedElements(root)) {
140
- if (!targets.has(el) && el.classList.contains(cls))
141
- el.classList.remove(cls);
142
- }
143
- for (const el of targets) {
144
- if (!el.classList.contains(cls))
145
- el.classList.add(cls);
146
- }
118
+ const { root, states, state } = applied;
119
+ const forced = new Map();
120
+ const stateTargets = new Map();
121
+ // Every pass measures one DOM, whatever the previous pass left: the
122
+ // variant's classes, and the state's on every target it names, all at
123
+ // once. A target can take the pointer only under another forced class
124
+ // (a hover-reveal), and a mark must not depend on whether an unrelated
125
+ // write set off a second pass.
126
+ for (const name of PSEUDO_STATES) {
127
+ const variantTargets = resolveTargets(root, states?.[name]);
128
+ const targets = state ? resolveTargets(root, state[name]) : new Set();
129
+ forced.set(name, variantTargets);
130
+ stateTargets.set(name, targets);
131
+ this.write(root, name, new Set([...variantTargets, ...targets]));
132
+ }
133
+ const fit = state ? evaluateStateFit(root, state) : null;
134
+ // Read before the first class comes off, so no target is measured
135
+ // against a DOM another one's removal changed.
136
+ const reachable = PSEUDO_STATES.map((name) => new Set(fit?.fits ? reachableTargets(root, name, stateTargets.get(name)) : []));
137
+ // Only a change of the fit is news. The signal setting off its own
138
+ // effects is harmless, a new value on every mark is not.
139
+ if (!sameFit(applied.fit, fit))
140
+ this._applied.set({ ...applied, fit });
141
+ // The state's class comes off what it cannot reach, and off all of its
142
+ // targets when it does not fit. The variant's classes stay.
143
+ PSEUDO_STATES.forEach((name, i) => this.write(root, name, new Set([...forced.get(name), ...reachable[i]])));
144
+ // The records of the writes above are ours. Acting on them would only
145
+ // repeat this pass, and a state whose class takes away its own reach
146
+ // (`pointer-events: none`) would rewrite its class on every one. Anything
147
+ // the component changed before this pass was read by it, so nothing
148
+ // pending is lost.
149
+ this.observer?.takeRecords();
150
+ }
151
+ /** Puts the class of `name` on exactly `targets` under `root`. */
152
+ write(root, name, targets) {
153
+ const cls = pseudoStateClass(name);
154
+ // `classList.remove` writes the attribute even when the class is absent,
155
+ // and the write would come back through the observer as a mutation.
156
+ for (const el of markedElements(root)) {
157
+ if (!targets.has(el) && el.classList.contains(cls))
158
+ el.classList.remove(cls);
159
+ }
160
+ for (const el of targets) {
161
+ if (!el.classList.contains(cls))
162
+ el.classList.add(cls);
147
163
  }
148
164
  }
149
165
  }
@@ -0,0 +1,11 @@
1
+ import { type ForcedPseudoStates, type PseudoTarget } from '../../shared/pseudo-state.type.js';
2
+ /** True when `states` forces at least one state on at least one target. */
3
+ export declare function forcesAnyState(states: ForcedPseudoStates | null | undefined): states is ForcedPseudoStates;
4
+ /** True when `target` names something: `true`, or a selector that is not blank. */
5
+ export declare function hasTarget(target: PseudoTarget | undefined): boolean;
6
+ /**
7
+ * The elements under `root` a target names. `root` counts: a selector can name
8
+ * the component's host, and `true` includes it.
9
+ */
10
+ export declare function resolveTargets(root: Element, target: PseudoTarget | undefined): Set<Element>;
11
+ //# sourceMappingURL=pseudo-targets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pseudo-targets.d.ts","sourceRoot":"","sources":["../../../src/app/pseudo/pseudo-targets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAiB,KAAK,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAE9G,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,IAAI,kBAAkB,CAE1G;AAED,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAInE;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,CAuB5F"}