@ng-prism/core 22.2.1 → 22.4.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 (359) hide show
  1. package/README.md +34 -36
  2. package/builders.json +11 -11
  3. package/dist/app/canvas/canvas-bg.styles.d.ts +7 -12
  4. package/dist/app/canvas/canvas-bg.styles.d.ts.map +1 -1
  5. package/dist/app/canvas/canvas-bg.styles.js +37 -22
  6. package/dist/app/canvas/measure-geometry.d.ts +140 -0
  7. package/dist/app/canvas/measure-geometry.d.ts.map +1 -0
  8. package/dist/app/canvas/measure-geometry.js +217 -0
  9. package/dist/app/canvas/measure-keyboard.d.ts +20 -0
  10. package/dist/app/canvas/measure-keyboard.d.ts.map +1 -0
  11. package/dist/app/canvas/measure-keyboard.js +34 -0
  12. package/dist/app/canvas/measure-quad.d.ts +114 -0
  13. package/dist/app/canvas/measure-quad.d.ts.map +1 -0
  14. package/dist/app/canvas/measure-quad.js +173 -0
  15. package/dist/app/canvas/measure-snap.d.ts +35 -0
  16. package/dist/app/canvas/measure-snap.d.ts.map +1 -0
  17. package/dist/app/canvas/measure-snap.js +63 -0
  18. package/dist/app/canvas/prism-canvas-bg-pill.component.d.ts.map +1 -1
  19. package/dist/app/canvas/prism-canvas-bg-pill.component.js +3 -18
  20. package/dist/app/canvas/prism-canvas-measure.component.d.ts +142 -0
  21. package/dist/app/canvas/prism-canvas-measure.component.d.ts.map +1 -0
  22. package/dist/app/canvas/prism-canvas-measure.component.js +554 -0
  23. package/dist/app/canvas/prism-canvas-pin-row.component.d.ts +23 -0
  24. package/dist/app/canvas/prism-canvas-pin-row.component.d.ts.map +1 -0
  25. package/dist/app/canvas/prism-canvas-pin-row.component.js +64 -0
  26. package/dist/app/canvas/prism-canvas-rulers.component.d.ts +1 -0
  27. package/dist/app/canvas/prism-canvas-rulers.component.d.ts.map +1 -1
  28. package/dist/app/canvas/prism-canvas-rulers.component.js +9 -14
  29. package/dist/app/canvas/prism-canvas-toolbar.component.d.ts +28 -28
  30. package/dist/app/canvas/prism-canvas-toolbar.component.d.ts.map +1 -1
  31. package/dist/app/canvas/prism-canvas-toolbar.component.js +124 -162
  32. package/dist/app/canvas/prism-template-popover.component.d.ts.map +1 -1
  33. package/dist/app/canvas/prism-template-popover.component.js +8 -49
  34. package/dist/app/canvas/viewport-snap.d.ts +12 -0
  35. package/dist/app/canvas/viewport-snap.d.ts.map +1 -0
  36. package/dist/app/canvas/viewport-snap.js +23 -0
  37. package/dist/app/component-head/head-metrics.d.ts +2 -2
  38. package/dist/app/component-head/head-metrics.d.ts.map +1 -1
  39. package/dist/app/component-head/head-metrics.js +3 -3
  40. package/dist/app/component-head/prism-component-head.component.d.ts +3 -3
  41. package/dist/app/component-head/prism-component-head.component.d.ts.map +1 -1
  42. package/dist/app/component-head/prism-component-head.component.js +24 -64
  43. package/dist/app/component-head/prism-head-gauge.component.d.ts.map +1 -1
  44. package/dist/app/component-head/prism-head-gauge.component.js +4 -36
  45. package/dist/app/component-head/prism-head-info.component.d.ts +1 -1
  46. package/dist/app/component-head/prism-head-info.component.d.ts.map +1 -1
  47. package/dist/app/component-head/prism-head-info.component.js +4 -37
  48. package/dist/app/component-head/prism-stat.component.d.ts +1 -1
  49. package/dist/app/component-head/prism-stat.component.d.ts.map +1 -1
  50. package/dist/app/component-head/prism-stat.component.js +4 -15
  51. package/dist/app/controls/boolean-control.component.d.ts.map +1 -1
  52. package/dist/app/controls/boolean-control.component.js +4 -12
  53. package/dist/app/controls/json-control.component.d.ts.map +1 -1
  54. package/dist/app/controls/json-control.component.js +4 -24
  55. package/dist/app/controls/number-control.component.d.ts.map +1 -1
  56. package/dist/app/controls/number-control.component.js +4 -11
  57. package/dist/app/controls/string-control.component.d.ts.map +1 -1
  58. package/dist/app/controls/string-control.component.js +4 -11
  59. package/dist/app/controls/union-control.component.d.ts.map +1 -1
  60. package/dist/app/controls/union-control.component.js +4 -16
  61. package/dist/app/directives/prism-resizer.directive.d.ts +24 -1
  62. package/dist/app/directives/prism-resizer.directive.d.ts.map +1 -1
  63. package/dist/app/directives/prism-resizer.directive.js +44 -7
  64. package/dist/app/directives/resize-value.d.ts +22 -0
  65. package/dist/app/directives/resize-value.d.ts.map +1 -0
  66. package/dist/app/directives/resize-value.js +23 -0
  67. package/dist/app/discovery-manifest.d.ts +2 -2
  68. package/dist/app/discovery-manifest.d.ts.map +1 -1
  69. package/dist/app/discovery-manifest.js +16 -22
  70. package/dist/app/header/prism-header-widget-host.component.d.ts.map +1 -1
  71. package/dist/app/header/prism-header-widget-host.component.js +4 -8
  72. package/dist/app/header/prism-header.component.d.ts.map +1 -1
  73. package/dist/app/header/prism-header.component.js +9 -78
  74. package/dist/app/hmr.d.ts.map +1 -1
  75. package/dist/app/icons/icon-registry.d.ts +2 -2
  76. package/dist/app/icons/icon-registry.d.ts.map +1 -1
  77. package/dist/app/icons/icon-registry.js +5 -3
  78. package/dist/app/icons/prism-icon.component.d.ts +2 -2
  79. package/dist/app/icons/prism-icon.component.d.ts.map +1 -1
  80. package/dist/app/icons/prism-icon.component.js +9 -9
  81. package/dist/app/index.d.ts +3 -3
  82. package/dist/app/index.d.ts.map +1 -1
  83. package/dist/app/index.js +17 -24
  84. package/dist/app/layout-menu/prism-layout-menu.component.d.ts.map +1 -1
  85. package/dist/app/layout-menu/prism-layout-menu.component.js +3 -77
  86. package/dist/app/overview/overview-panel.js +1 -1
  87. package/dist/app/overview/overview-visibility.d.ts +1 -1
  88. package/dist/app/overview/overview-visibility.d.ts.map +1 -1
  89. package/dist/app/overview/overview-visibility.js +1 -1
  90. package/dist/app/overview/prism-overview-cell.component.d.ts +2 -2
  91. package/dist/app/overview/prism-overview-cell.component.d.ts.map +1 -1
  92. package/dist/app/overview/prism-overview-cell.component.js +17 -25
  93. package/dist/app/overview/prism-overview.component.d.ts +2 -2
  94. package/dist/app/overview/prism-overview.component.d.ts.map +1 -1
  95. package/dist/app/overview/prism-overview.component.js +6 -14
  96. package/dist/app/page-renderer/prism-page-renderer.component.d.ts.map +1 -1
  97. package/dist/app/page-renderer/prism-page-renderer.component.js +4 -17
  98. package/dist/app/panels/a11y/a11y-audit.service.d.ts.map +1 -1
  99. package/dist/app/panels/a11y/a11y-audit.service.js +14 -2
  100. package/dist/app/panels/a11y/a11y-core.plugin.d.ts.map +1 -1
  101. package/dist/app/panels/a11y/a11y-core.plugin.js +1 -1
  102. package/dist/app/panels/a11y/a11y-dom-utils.d.ts.map +1 -1
  103. package/dist/app/panels/a11y/a11y-dom-utils.js +9 -6
  104. package/dist/app/panels/a11y/a11y-header-badge.component.d.ts.map +1 -1
  105. package/dist/app/panels/a11y/a11y-header-badge.component.js +6 -22
  106. package/dist/app/panels/a11y/a11y-keyboard-overlay.component.d.ts.map +1 -1
  107. package/dist/app/panels/a11y/a11y-keyboard-overlay.component.js +6 -25
  108. package/dist/app/panels/a11y/a11y-keyboard.component.d.ts.map +1 -1
  109. package/dist/app/panels/a11y/a11y-keyboard.component.js +5 -36
  110. package/dist/app/panels/a11y/a11y-keyboard.service.d.ts.map +1 -1
  111. package/dist/app/panels/a11y/a11y-keyboard.service.js +2 -2
  112. package/dist/app/panels/a11y/a11y-overlay-host.component.d.ts.map +1 -1
  113. package/dist/app/panels/a11y/a11y-overlay-host.component.js +5 -32
  114. package/dist/app/panels/a11y/a11y-panel-state.service.d.ts.map +1 -1
  115. package/dist/app/panels/a11y/a11y-panel.component.d.ts +1 -1
  116. package/dist/app/panels/a11y/a11y-panel.component.d.ts.map +1 -1
  117. package/dist/app/panels/a11y/a11y-panel.component.js +7 -69
  118. package/dist/app/panels/a11y/a11y-perspective.service.d.ts.map +1 -1
  119. package/dist/app/panels/a11y/a11y-score.component.d.ts.map +1 -1
  120. package/dist/app/panels/a11y/a11y-score.component.js +4 -31
  121. package/dist/app/panels/a11y/a11y-sr-overlay.component.d.ts.map +1 -1
  122. package/dist/app/panels/a11y/a11y-sr-overlay.component.js +8 -28
  123. package/dist/app/panels/a11y/a11y-sr.component.d.ts.map +1 -1
  124. package/dist/app/panels/a11y/a11y-sr.component.js +5 -28
  125. package/dist/app/panels/a11y/a11y-sr.service.d.ts.map +1 -1
  126. package/dist/app/panels/a11y/a11y-sr.service.js +4 -7
  127. package/dist/app/panels/a11y/a11y-summary.d.ts +3 -4
  128. package/dist/app/panels/a11y/a11y-summary.d.ts.map +1 -1
  129. package/dist/app/panels/a11y/a11y-summary.js +5 -9
  130. package/dist/app/panels/a11y/a11y-thresholds.d.ts +1 -1
  131. package/dist/app/panels/a11y/a11y-thresholds.d.ts.map +1 -1
  132. package/dist/app/panels/a11y/a11y-thresholds.js +2 -2
  133. package/dist/app/panels/a11y/a11y-tree.component.d.ts.map +1 -1
  134. package/dist/app/panels/a11y/a11y-tree.component.js +9 -46
  135. package/dist/app/panels/a11y/a11y-tree.service.d.ts.map +1 -1
  136. package/dist/app/panels/a11y/a11y-tree.service.js +3 -5
  137. package/dist/app/panels/a11y/a11y-violations.component.d.ts.map +1 -1
  138. package/dist/app/panels/a11y/a11y-violations.component.js +7 -58
  139. package/dist/app/panels/a11y/a11y.types.d.ts +1 -1
  140. package/dist/app/panels/a11y/a11y.types.d.ts.map +1 -1
  141. package/dist/app/panels/builtin-header-widgets.js +2 -2
  142. package/dist/app/panels/builtin-navigation-decorations.d.ts +1 -1
  143. package/dist/app/panels/builtin-navigation-decorations.d.ts.map +1 -1
  144. package/dist/app/panels/builtin-navigation-decorations.js +3 -3
  145. package/dist/app/panels/builtin-panels.d.ts.map +1 -1
  146. package/dist/app/panels/builtin-panels.js +2 -7
  147. package/dist/app/panels/controls/controls-plugin.js +3 -3
  148. package/dist/app/panels/controls/non-editable-input-types.d.ts.map +1 -1
  149. package/dist/app/panels/controls/non-editable-input-types.js +2 -6
  150. package/dist/app/panels/controls/prism-controls-panel.component.d.ts.map +1 -1
  151. package/dist/app/panels/controls/prism-controls-panel.component.js +5 -95
  152. package/dist/app/panels/events/events-plugin.js +3 -3
  153. package/dist/app/panels/events/prism-events-panel.component.d.ts.map +1 -1
  154. package/dist/app/panels/events/prism-events-panel.component.js +5 -23
  155. package/dist/app/panels/events/prism-json-node.component.d.ts.map +1 -1
  156. package/dist/app/panels/events/prism-json-node.component.js +4 -86
  157. package/dist/app/panels/events/prism-json-node.utils.d.ts.map +1 -1
  158. package/dist/app/panels/panel-host/panel-badge.d.ts +1 -1
  159. package/dist/app/panels/panel-host/panel-badge.d.ts.map +1 -1
  160. package/dist/app/panels/panel-host/panel-badge.js +2 -4
  161. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts +1 -1
  162. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts.map +1 -1
  163. package/dist/app/panels/panel-host/prism-panel-host.component.js +12 -67
  164. package/dist/app/provide-prism.d.ts +1 -1
  165. package/dist/app/provide-prism.d.ts.map +1 -1
  166. package/dist/app/provide-prism.js +8 -12
  167. package/dist/app/renderer/known-inputs.d.ts +1 -1
  168. package/dist/app/renderer/known-inputs.d.ts.map +1 -1
  169. package/dist/app/renderer/known-inputs.js +1 -1
  170. package/dist/app/renderer/overlay-resolver.d.ts +17 -3
  171. package/dist/app/renderer/overlay-resolver.d.ts.map +1 -1
  172. package/dist/app/renderer/overlay-resolver.js +10 -5
  173. package/dist/app/renderer/prism-renderer.component.d.ts +28 -3
  174. package/dist/app/renderer/prism-renderer.component.d.ts.map +1 -1
  175. package/dist/app/renderer/prism-renderer.component.js +107 -80
  176. package/dist/app/renderer/projectable-content.d.ts.map +1 -1
  177. package/dist/app/renderer/projectable-content.js +4 -6
  178. package/dist/app/renderer/snippet-generator.d.ts +1 -1
  179. package/dist/app/renderer/snippet-generator.d.ts.map +1 -1
  180. package/dist/app/renderer/snippet-generator.js +7 -22
  181. package/dist/app/services/navigation-item.types.d.ts +1 -1
  182. package/dist/app/services/navigation-item.types.d.ts.map +1 -1
  183. package/dist/app/services/prism-canvas.service.d.ts +33 -0
  184. package/dist/app/services/prism-canvas.service.d.ts.map +1 -1
  185. package/dist/app/services/prism-canvas.service.js +71 -6
  186. package/dist/app/services/prism-capture.service.d.ts +24 -50
  187. package/dist/app/services/prism-capture.service.d.ts.map +1 -1
  188. package/dist/app/services/prism-capture.service.js +62 -146
  189. package/dist/app/services/prism-event-log.service.d.ts.map +1 -1
  190. package/dist/app/services/prism-event-log.service.js +1 -4
  191. package/dist/app/services/prism-layout.service.d.ts.map +1 -1
  192. package/dist/app/services/prism-layout.service.js +5 -4
  193. package/dist/app/services/prism-manifest.service.d.ts +1 -1
  194. package/dist/app/services/prism-manifest.service.d.ts.map +1 -1
  195. package/dist/app/services/prism-manifest.service.js +1 -1
  196. package/dist/app/services/prism-measure.service.d.ts +44 -0
  197. package/dist/app/services/prism-measure.service.d.ts.map +1 -0
  198. package/dist/app/services/prism-measure.service.js +91 -0
  199. package/dist/app/services/prism-navigation.service.d.ts +1 -1
  200. package/dist/app/services/prism-navigation.service.d.ts.map +1 -1
  201. package/dist/app/services/prism-navigation.service.js +5 -13
  202. package/dist/app/services/prism-panel.service.d.ts +2 -2
  203. package/dist/app/services/prism-panel.service.d.ts.map +1 -1
  204. package/dist/app/services/prism-panel.service.js +4 -7
  205. package/dist/app/services/prism-persistence.service.d.ts.map +1 -1
  206. package/dist/app/services/prism-persistence.service.js +9 -11
  207. package/dist/app/services/prism-plugin.service.d.ts.map +1 -1
  208. package/dist/app/services/prism-renderer.service.d.ts.map +1 -1
  209. package/dist/app/services/prism-renderer.service.js +5 -9
  210. package/dist/app/services/prism-search.service.d.ts.map +1 -1
  211. package/dist/app/services/prism-search.service.js +1 -2
  212. package/dist/app/services/prism-theme.service.d.ts.map +1 -1
  213. package/dist/app/services/prism-theme.service.js +6 -4
  214. package/dist/app/services/prism-url-state.service.d.ts.map +1 -1
  215. package/dist/app/services/prism-url-state.service.js +4 -10
  216. package/dist/app/services/prism-variant-bg.service.d.ts +10 -24
  217. package/dist/app/services/prism-variant-bg.service.d.ts.map +1 -1
  218. package/dist/app/services/prism-variant-bg.service.js +13 -29
  219. package/dist/app/shared/prism-metric-badge.component.d.ts +9 -15
  220. package/dist/app/shared/prism-metric-badge.component.d.ts.map +1 -1
  221. package/dist/app/shared/prism-metric-badge.component.js +13 -32
  222. package/dist/app/shell/prism-shell.component.d.ts.map +1 -1
  223. package/dist/app/shell/prism-shell.component.js +26 -125
  224. package/dist/app/sidebar/navigation-decorations.d.ts +4 -4
  225. package/dist/app/sidebar/navigation-decorations.d.ts.map +1 -1
  226. package/dist/app/sidebar/navigation-decorations.js +3 -3
  227. package/dist/app/sidebar/prism-sidebar.component.d.ts +3 -3
  228. package/dist/app/sidebar/prism-sidebar.component.d.ts.map +1 -1
  229. package/dist/app/sidebar/prism-sidebar.component.js +21 -156
  230. package/dist/app/theme/prism-default-theme.d.ts.map +1 -1
  231. package/dist/app/theme/prism-default-theme.js +6 -6
  232. package/dist/app/tokens/prism-tokens.d.ts.map +1 -1
  233. package/dist/app/tokens/prism-tokens.js +1 -1
  234. package/dist/app/variant-ribbon/prism-variant-ribbon.component.d.ts.map +1 -1
  235. package/dist/app/variant-ribbon/prism-variant-ribbon.component.js +4 -49
  236. package/dist/app/variant-ribbon/spectrum.d.ts +1 -1
  237. package/dist/app/variant-ribbon/spectrum.d.ts.map +1 -1
  238. package/dist/app/variant-ribbon/spectrum.js +1 -1
  239. package/dist/app/view-tab-bar/next-view-id.d.ts +1 -1
  240. package/dist/app/view-tab-bar/next-view-id.d.ts.map +1 -1
  241. package/dist/app/view-tab-bar/next-view-id.js +2 -4
  242. package/dist/app/view-tab-bar/prism-view-panel-host.component.d.ts.map +1 -1
  243. package/dist/app/view-tab-bar/prism-view-panel-host.component.js +5 -17
  244. package/dist/app/view-tab-bar/prism-view-tab-bar.component.d.ts.map +1 -1
  245. package/dist/app/view-tab-bar/prism-view-tab-bar.component.js +4 -27
  246. package/dist/builder/a11y/a11y-report-reader.d.ts +2 -2
  247. package/dist/builder/a11y/a11y-report-reader.d.ts.map +1 -1
  248. package/dist/builder/a11y/a11y-report-reader.js +8 -8
  249. package/dist/builder/build/index.d.ts.map +1 -1
  250. package/dist/builder/build/index.js +5 -9
  251. package/dist/builder/build/schema.d.ts.map +1 -1
  252. package/dist/builder/config-loader/config-loader.d.ts.map +1 -1
  253. package/dist/builder/config-loader/config-loader.js +4 -5
  254. package/dist/builder/manifest/host-parser.d.ts.map +1 -1
  255. package/dist/builder/manifest/host-parser.js +1 -1
  256. package/dist/builder/manifest/runtime-manifest.generator.d.ts +1 -1
  257. package/dist/builder/manifest/runtime-manifest.generator.d.ts.map +1 -1
  258. package/dist/builder/manifest/runtime-manifest.generator.js +14 -35
  259. package/dist/builder/plugin-runner/plugin-runner.d.ts.map +1 -1
  260. package/dist/builder/plugin-runner/plugin-runner.js +2 -4
  261. package/dist/builder/scanner/ast-utils.d.ts +46 -2
  262. package/dist/builder/scanner/ast-utils.d.ts.map +1 -1
  263. package/dist/builder/scanner/ast-utils.js +338 -38
  264. package/dist/builder/scanner/class-hierarchy.d.ts +33 -0
  265. package/dist/builder/scanner/class-hierarchy.d.ts.map +1 -0
  266. package/dist/builder/scanner/class-hierarchy.js +87 -0
  267. package/dist/builder/scanner/component.scanner.d.ts +7 -1
  268. package/dist/builder/scanner/component.scanner.d.ts.map +1 -1
  269. package/dist/builder/scanner/component.scanner.js +113 -72
  270. package/dist/builder/scanner/entry-point-discovery.d.ts.map +1 -1
  271. package/dist/builder/scanner/entry-point-discovery.js +3 -5
  272. package/dist/builder/scanner/entry-point.scanner.d.ts.map +1 -1
  273. package/dist/builder/scanner/entry-point.scanner.js +1 -3
  274. package/dist/builder/scanner/index.d.ts +1 -1
  275. package/dist/builder/scanner/index.d.ts.map +1 -1
  276. package/dist/builder/scanner/input.extractor.d.ts +7 -4
  277. package/dist/builder/scanner/input.extractor.d.ts.map +1 -1
  278. package/dist/builder/scanner/input.extractor.js +157 -76
  279. package/dist/builder/scanner/manifest.generator.d.ts.map +1 -1
  280. package/dist/builder/scanner/manifest.generator.js +8 -6
  281. package/dist/builder/scanner/scanner.d.ts +3 -1
  282. package/dist/builder/scanner/scanner.d.ts.map +1 -1
  283. package/dist/builder/scanner/scanner.js +10 -8
  284. package/dist/builder/scanner/showcase-diagnostics.d.ts +25 -0
  285. package/dist/builder/scanner/showcase-diagnostics.d.ts.map +1 -0
  286. package/dist/builder/scanner/showcase-diagnostics.js +96 -0
  287. package/dist/builder/serve/index.d.ts.map +1 -1
  288. package/dist/builder/serve/index.js +8 -10
  289. package/dist/builder/serve/schema.d.ts.map +1 -1
  290. package/dist/builder/shared/index.d.ts +1 -1
  291. package/dist/builder/shared/index.d.ts.map +1 -1
  292. package/dist/builder/shared/index.js +1 -1
  293. package/dist/builder/shared/prism-pipeline.d.ts +1 -1
  294. package/dist/builder/shared/prism-pipeline.d.ts.map +1 -1
  295. package/dist/builder/shared/prism-pipeline.js +29 -38
  296. package/dist/builder/shared/resolve-cache-dir.d.ts.map +1 -1
  297. package/dist/builder/shared/resolve-cache-dir.js +1 -1
  298. package/dist/builder/watcher/index.d.ts +1 -1
  299. package/dist/builder/watcher/index.d.ts.map +1 -1
  300. package/dist/builder/watcher/prism-watcher.d.ts.map +1 -1
  301. package/dist/builder/watcher/prism-watcher.js +14 -12
  302. package/dist/config/index.d.ts +2 -2
  303. package/dist/config/index.d.ts.map +1 -1
  304. package/dist/config/index.js +1 -1
  305. package/dist/decorator/index.d.ts +1 -1
  306. package/dist/decorator/index.d.ts.map +1 -1
  307. package/dist/decorator/showcase.decorator.d.ts.map +1 -1
  308. package/dist/decorator/showcase.types.d.ts +11 -9
  309. package/dist/decorator/showcase.types.d.ts.map +1 -1
  310. package/dist/index.js +3 -3
  311. package/dist/plugin/define-config.js +1 -1
  312. package/dist/plugin/index.d.ts +4 -4
  313. package/dist/plugin/index.d.ts.map +1 -1
  314. package/dist/plugin/index.js +7 -11
  315. package/dist/plugin/page-helpers.d.ts +1 -1
  316. package/dist/plugin/page-helpers.d.ts.map +1 -1
  317. package/dist/plugin/page-helpers.js +2 -2
  318. package/dist/plugin/page.types.d.ts.map +1 -1
  319. package/dist/plugin/plugin.types.d.ts +31 -14
  320. package/dist/plugin/plugin.types.d.ts.map +1 -1
  321. package/dist/schematics/migrations/v21-13-manifest-cache/index.d.ts.map +1 -1
  322. package/dist/schematics/migrations/v21-13-manifest-cache/index.js +4 -10
  323. package/dist/schematics/migrations/v22-0-cache-dir-rename/index.d.ts.map +1 -1
  324. package/dist/schematics/migrations/v22-0-cache-dir-rename/index.js +6 -10
  325. package/dist/schematics/ng-add/index.d.ts.map +1 -1
  326. package/dist/schematics/ng-add/index.js +122 -56
  327. package/dist/schematics/ng-add/schema.d.ts.map +1 -1
  328. package/dist/schematics/utils/config-ast.d.ts.map +1 -1
  329. package/dist/schematics/utils/config-ast.js +8 -15
  330. package/dist/schematics/utils/tsconfig-paths.d.ts.map +1 -1
  331. package/dist/schematics/utils/tsconfig-paths.js +1 -1
  332. package/dist/shared/canvas-bg.type.d.ts +5 -6
  333. package/dist/shared/canvas-bg.type.d.ts.map +1 -1
  334. package/dist/shared/canvas-bg.type.js +5 -13
  335. package/dist/shared/canvas-layout.type.d.ts.map +1 -1
  336. package/dist/shared/canvas-layout.type.js +1 -4
  337. package/dist/shared/measure.type.d.ts +52 -0
  338. package/dist/shared/measure.type.d.ts.map +1 -0
  339. package/dist/shared/measure.type.js +21 -0
  340. package/dist/shared/variant-bg.d.ts +20 -31
  341. package/dist/shared/variant-bg.d.ts.map +1 -1
  342. package/dist/shared/variant-bg.js +20 -31
  343. package/dist/shared/viewport.type.d.ts +43 -0
  344. package/dist/shared/viewport.type.d.ts.map +1 -0
  345. package/dist/shared/viewport.type.js +44 -0
  346. package/dist/transformer/cli.js +0 -0
  347. package/dist/transformer/index.d.ts +2 -2
  348. package/dist/transformer/index.d.ts.map +1 -1
  349. package/dist/transformer/index.js +2 -2
  350. package/dist/transformer/showcase-strip.transformer.d.ts.map +1 -1
  351. package/dist/transformer/showcase-strip.transformer.js +7 -16
  352. package/dist/transformer/strip-directory.d.ts.map +1 -1
  353. package/dist/transformer/strip-directory.js +2 -4
  354. package/package.json +5 -2
  355. package/schematics/collection.json +7 -7
  356. package/schematics/migrations.json +12 -12
  357. package/schematics/ng-add/schema.json +22 -22
  358. package/src/builder/build/schema.json +36 -36
  359. package/src/builder/serve/schema.json +37 -37
@@ -1,54 +1,74 @@
1
- import { Component, inject, ChangeDetectionStrategy } from '@angular/core';
2
- import { PrismIconComponent } from '../icons/prism-icon.component.js';
1
+ import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
3
2
  import { CANVAS_BGS } from '../../shared/canvas-bg.type.js';
3
+ import { VIEWPORT_SNAPS } from '../../shared/viewport.type.js';
4
+ import { PrismIconComponent } from '../icons/prism-icon.component.js';
4
5
  import { PrismCanvasService } from '../services/prism-canvas.service.js';
5
6
  import { PrismVariantBgService } from '../services/prism-variant-bg.service.js';
6
7
  import * as i0 from "@angular/core";
7
8
  const _forTrack0 = ($index, $item) => $item.value;
8
- function PrismCanvasToolbarComponent_For_17_Template(rf, ctx) { if (rf & 1) {
9
- const _r1 = i0.ɵɵgetCurrentView();
10
- i0.ɵɵelementStart(0, "button", 16);
11
- i0.ɵɵlistener("click", function PrismCanvasToolbarComponent_For_17_Template_button_click_0_listener() { const bg_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setBg(bg_r2)); });
9
+ function PrismCanvasToolbarComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
10
+ i0.ɵɵelementStart(0, "span", 2);
12
11
  i0.ɵɵtext(1);
13
12
  i0.ɵɵelementEnd();
14
13
  } if (rf & 2) {
15
- const bg_r2 = ctx.$implicit;
16
- const ctx_r2 = i0.ɵɵnextContext();
17
- i0.ɵɵclassProp("is-on", ctx_r2.variantBg.effective() === bg_r2)("is-rec", ctx_r2.variantBg.recommended() === bg_r2);
18
- i0.ɵɵattribute("title", ctx_r2.bgTitle(bg_r2));
14
+ const ctx_r0 = i0.ɵɵnextContext();
19
15
  i0.ɵɵadvance();
20
- i0.ɵɵtextInterpolate1(" ", ctx_r2.capitalize(bg_r2), " ");
16
+ i0.ɵɵtextInterpolate1("", ctx_r0.canvas.viewportWidth(), "px");
21
17
  } }
22
18
  function PrismCanvasToolbarComponent_For_22_Template(rf, ctx) { if (rf & 1) {
19
+ const _r2 = i0.ɵɵgetCurrentView();
20
+ i0.ɵɵelementStart(0, "button", 21);
21
+ i0.ɵɵlistener("click", function PrismCanvasToolbarComponent_For_22_Template_button_click_0_listener() { const bg_r3 = i0.ɵɵrestoreView(_r2).$implicit; const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setBg(bg_r3)); });
22
+ i0.ɵɵtext(1);
23
+ i0.ɵɵelementEnd();
24
+ } if (rf & 2) {
25
+ const bg_r3 = ctx.$implicit;
26
+ const ctx_r0 = i0.ɵɵnextContext();
27
+ i0.ɵɵclassProp("is-on", ctx_r0.variantBg.effective() === bg_r3)("is-rec", ctx_r0.variantBg.recommended() === bg_r3);
28
+ i0.ɵɵattribute("title", ctx_r0.bgTitle(bg_r3));
29
+ i0.ɵɵadvance();
30
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.capitalize(bg_r3), " ");
31
+ } }
32
+ function PrismCanvasToolbarComponent_For_27_Template(rf, ctx) { if (rf & 1) {
23
33
  const _r4 = i0.ɵɵgetCurrentView();
24
- i0.ɵɵelementStart(0, "button", 16);
25
- i0.ɵɵlistener("click", function PrismCanvasToolbarComponent_For_22_Template_button_click_0_listener() { const z_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.canvas.setZoom(z_r5.value)); });
34
+ i0.ɵɵelementStart(0, "button", 21);
35
+ i0.ɵɵlistener("click", function PrismCanvasToolbarComponent_For_27_Template_button_click_0_listener() { const z_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.canvas.setZoom(z_r5.value)); });
26
36
  i0.ɵɵtext(1);
27
37
  i0.ɵɵelementEnd();
28
38
  } if (rf & 2) {
29
39
  const z_r5 = ctx.$implicit;
30
- const ctx_r2 = i0.ɵɵnextContext();
31
- i0.ɵɵclassProp("is-on", ctx_r2.canvas.zoom() === z_r5.value);
40
+ const ctx_r0 = i0.ɵɵnextContext();
41
+ i0.ɵɵclassProp("is-on", ctx_r0.canvas.zoom() === z_r5.value);
32
42
  i0.ɵɵadvance();
33
43
  i0.ɵɵtextInterpolate1(" ", z_r5.label, " ");
34
44
  } }
45
+ function PrismCanvasToolbarComponent_For_34_Template(rf, ctx) { if (rf & 1) {
46
+ const _r6 = i0.ɵɵgetCurrentView();
47
+ i0.ɵɵelementStart(0, "button", 21);
48
+ i0.ɵɵlistener("click", function PrismCanvasToolbarComponent_For_34_Template_button_click_0_listener() { const w_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.canvas.setViewportWidth(w_r7)); });
49
+ i0.ɵɵtext(1);
50
+ i0.ɵɵelementEnd();
51
+ } if (rf & 2) {
52
+ const w_r7 = ctx.$implicit;
53
+ const ctx_r0 = i0.ɵɵnextContext();
54
+ i0.ɵɵclassProp("is-on", ctx_r0.canvas.viewportWidth() === w_r7);
55
+ i0.ɵɵadvance();
56
+ i0.ɵɵtextInterpolate1(" ", w_r7, " ");
57
+ } }
35
58
  /**
36
- * The canvas tools, as a rail floating over the canvas instead of a band above
37
- * it.
59
+ * The canvas tools, as a rail floating over the canvas.
38
60
  *
39
- * The five entries were never one kind of control, and the split follows that
40
- * rather than the topic: guides and rulers are toggles you flip constantly
41
- * while measuring, so they toggle at their own button; canvas background and
42
- * zoom are choosers you set once, so they move behind a menu; the template is a
43
- * view rather than a setting and keeps its own button. The zoom *value* stays
44
- * on the rail as a readout — it is the one number here you read far more often
45
- * than you set.
61
+ * Things you toggle constantly (guides, rulers, the viewport constraint) get
62
+ * their own button; things you set once (background, zoom, viewport width) live
63
+ * in the menu. The template is a view rather than a setting and keeps its own
64
+ * button. Zoom and the active viewport width are shown as readouts; the width
65
+ * only appears while the viewport constraint is on.
46
66
  *
47
- * The host deliberately generates no box. The rail has to be a direct child of
48
- * `.prism-canvas-wrap` that does not contain the stage, because that is exactly
49
- * what capture mode's structural rule in `prism-capture.service.ts` suppresses;
50
- * a rail nested inside the renderer or the stage would survive into every
51
- * screenshot and silently corrupt visual-regression baselines.
67
+ * The host generates no box. The rail must be a direct child of
68
+ * `.prism-canvas-wrap` outside the stage, because that is what capture mode's
69
+ * structural rule in `prism-capture.service.ts` hides. A rail nested in the
70
+ * renderer or the stage would end up in every screenshot and corrupt
71
+ * visual-regression baselines.
52
72
  */
53
73
  export class PrismCanvasToolbarComponent {
54
74
  canvas = inject(PrismCanvasService);
@@ -64,28 +84,24 @@ export class PrismCanvasToolbarComponent {
64
84
  }
65
85
  }
66
86
  /**
67
- * Every {@link CanvasBg}, and the canonical list rather than a copy of it.
87
+ * Every {@link CanvasBg}, taken from the type's canonical list.
68
88
  *
69
- * This group is a readout as much as a control: the active button is
70
- * `effective()` and the recommended one carries the `is-rec` edge. A value
71
- * missing here therefore cannot be *shown* either — a variant declaring it
72
- * leaves the whole group with nothing active and the recommendation with
73
- * nowhere to sit. That is what a shorter list bought when `transparent` was
74
- * left out of it, so the list is now the type's own.
89
+ * The group is also a readout: the active button is `effective()` and the
90
+ * recommended one carries the `is-rec` edge. A value missing from the list
91
+ * cannot be shown, so a variant declaring it would leave nothing active.
75
92
  *
76
- * `checker` and `transparent` do paint the same checkerboard here, which is
77
- * why they carry titles: the difference between them is what a capture does,
78
- * and the canvas cannot show that. `checker` is deprecated for exactly that
79
- * reason and says so, but it stays in the list until 23.0.0 — a component
80
- * can still declare it, and the group has to be able to show what it has.
93
+ * `checker` and `transparent` paint the same checkerboard here, so their
94
+ * titles explain the difference, which only a capture shows. `checker` is
95
+ * deprecated but stays until 23.0.0 because components can still declare it.
81
96
  */
82
97
  bgs = CANVAS_BGS;
83
- /** What a background means, where the canvas cannot show the difference. */
84
98
  /**
99
+ * What a background means, where the canvas cannot show the difference.
100
+ *
85
101
  * Bound with `[attr.title]`, never `[title]`. A property binding assigns to
86
102
  * `HTMLElement.title`, a non-nullable DOMString, so the `null` below would
87
103
  * be stringified and every unremarkable button would carry a tooltip
88
- * reading "null" — four of the six in the common case.
104
+ * reading "null" (four of the six in the common case).
89
105
  */
90
106
  bgTitle(bg) {
91
107
  if (this.variantBg.recommended() === bg) {
@@ -95,7 +111,7 @@ export class PrismCanvasToolbarComponent {
95
111
  return 'Checkerboard here, a real alpha channel in a capture';
96
112
  }
97
113
  if (bg === 'checker') {
98
- return 'Deprecated — same look as Transparent, but a capture keeps the themed colour';
114
+ return 'Deprecated: same look as Transparent, but a capture keeps the themed colour';
99
115
  }
100
116
  return null;
101
117
  }
@@ -103,47 +119,74 @@ export class PrismCanvasToolbarComponent {
103
119
  { value: 0.75, label: '75%' },
104
120
  { value: 1, label: '100%' },
105
121
  { value: 1.5, label: '150%' },
106
- { value: 2, label: '200%' },
122
+ { value: 2, label: '200%' }
107
123
  ];
124
+ /**
125
+ * The named widths, offered the same way as the zoom chooser.
126
+ *
127
+ * Plain numbers and no device names: this tool narrows a box and simulates
128
+ * nothing, so calling 390 "iPhone" would promise a fidelity it does not have.
129
+ */
130
+ viewports = VIEWPORT_SNAPS;
108
131
  capitalize(s) {
109
132
  return s.charAt(0).toUpperCase() + s.slice(1);
110
133
  }
111
134
  static ɵfac = function PrismCanvasToolbarComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PrismCanvasToolbarComponent)(); };
112
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PrismCanvasToolbarComponent, selectors: [["prism-canvas-toolbar"]], decls: 23, vars: 13, consts: [[1, "prism-toolrail"], [1, "prism-toolrail__zoom"], ["type", "button", "title", "Toggle guides", "aria-label", "Toggle guides", 1, "prism-toolrail__btn", 3, "click"], ["name", "crosshair", 3, "size"], ["type", "button", "title", "Toggle rulers", "aria-label", "Toggle rulers", 1, "prism-toolrail__btn", 3, "click"], ["name", "move", 3, "size"], ["type", "button", "popovertarget", "prism-tools", "title", "Canvas and zoom", "aria-label", "Canvas and zoom", 1, "prism-toolrail__btn"], ["name", "sliders-horizontal", 3, "size"], [1, "prism-toolrail__sep"], ["type", "button", "popovertarget", "prism-template", "title", "Toggle Angular template", "aria-label", "Toggle Angular template", 1, "prism-toolrail__btn"], ["name", "code", 3, "size"], ["popover", "", "id", "prism-tools", "role", "dialog", "aria-label", "Canvas and zoom", 1, "prism-toolmenu"], [1, "prism-toolmenu__lbl"], [1, "prism-toolmenu__row"], ["type", "button", 3, "is-on", "is-rec"], ["type", "button", 3, "is-on"], ["type", "button", 3, "click"]], template: function PrismCanvasToolbarComponent_Template(rf, ctx) { if (rf & 1) {
135
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PrismCanvasToolbarComponent, selectors: [["prism-canvas-toolbar"]], decls: 35, vars: 24, consts: [[1, "prism-toolrail"], [1, "prism-toolrail__zoom"], [1, "prism-toolrail__vp"], ["type", "button", "title", "Toggle guides", "aria-label", "Toggle guides", 1, "prism-toolrail__btn", 3, "click"], ["name", "crosshair", 3, "size"], ["type", "button", "title", "Toggle rulers", "aria-label", "Toggle rulers", 1, "prism-toolrail__btn", 3, "click"], ["name", "move", 3, "size"], ["type", "button", "title", "Toggle viewport width", "aria-label", "Toggle viewport width", 1, "prism-toolrail__btn", 3, "click"], ["name", "ruler-dimension", 3, "size"], ["type", "button", "title", "Toggle measure tool", "aria-label", "Toggle measure tool", 1, "prism-toolrail__btn", 3, "click"], ["name", "ruler", 3, "size"], ["type", "button", "popovertarget", "prism-tools", "title", "Canvas, zoom and width", "aria-label", "Canvas, zoom and width", 1, "prism-toolrail__btn"], ["name", "sliders-horizontal", 3, "size"], [1, "prism-toolrail__sep"], ["type", "button", "popovertarget", "prism-template", "title", "Toggle Angular template", "aria-label", "Toggle Angular template", 1, "prism-toolrail__btn"], ["name", "code", 3, "size"], ["popover", "", "id", "prism-tools", "role", "dialog", "aria-label", "Canvas, zoom and width", 1, "prism-toolmenu"], [1, "prism-toolmenu__lbl"], [1, "prism-toolmenu__row"], ["type", "button", 3, "is-on", "is-rec"], ["type", "button", 3, "is-on"], ["type", "button", 3, "click"]], template: function PrismCanvasToolbarComponent_Template(rf, ctx) { if (rf & 1) {
113
136
  i0.ɵɵelementStart(0, "div", 0)(1, "span", 1);
114
137
  i0.ɵɵtext(2);
138
+ i0.ɵɵconditionalCreate(3, PrismCanvasToolbarComponent_Conditional_3_Template, 2, 1, "span", 2);
115
139
  i0.ɵɵelementEnd();
116
- i0.ɵɵelementStart(3, "button", 2);
117
- i0.ɵɵlistener("click", function PrismCanvasToolbarComponent_Template_button_click_3_listener() { return ctx.canvas.toggleGuides(); });
118
- i0.ɵɵelement(4, "prism-icon", 3);
140
+ i0.ɵɵelementStart(4, "button", 3);
141
+ i0.ɵɵlistener("click", function PrismCanvasToolbarComponent_Template_button_click_4_listener() { return ctx.canvas.toggleGuides(); });
142
+ i0.ɵɵelement(5, "prism-icon", 4);
119
143
  i0.ɵɵelementEnd();
120
- i0.ɵɵelementStart(5, "button", 4);
121
- i0.ɵɵlistener("click", function PrismCanvasToolbarComponent_Template_button_click_5_listener() { return ctx.canvas.toggleRulers(); });
122
- i0.ɵɵelement(6, "prism-icon", 5);
144
+ i0.ɵɵelementStart(6, "button", 5);
145
+ i0.ɵɵlistener("click", function PrismCanvasToolbarComponent_Template_button_click_6_listener() { return ctx.canvas.toggleRulers(); });
146
+ i0.ɵɵelement(7, "prism-icon", 6);
123
147
  i0.ɵɵelementEnd();
124
- i0.ɵɵelementStart(7, "button", 6);
125
- i0.ɵɵelement(8, "prism-icon", 7);
148
+ i0.ɵɵelementStart(8, "button", 7);
149
+ i0.ɵɵlistener("click", function PrismCanvasToolbarComponent_Template_button_click_8_listener() { return ctx.canvas.toggleViewport(); });
150
+ i0.ɵɵelement(9, "prism-icon", 8);
126
151
  i0.ɵɵelementEnd();
127
- i0.ɵɵelement(9, "span", 8);
128
152
  i0.ɵɵelementStart(10, "button", 9);
153
+ i0.ɵɵlistener("click", function PrismCanvasToolbarComponent_Template_button_click_10_listener() { return ctx.canvas.toggleMeasure(); });
129
154
  i0.ɵɵelement(11, "prism-icon", 10);
155
+ i0.ɵɵelementEnd();
156
+ i0.ɵɵelementStart(12, "button", 11);
157
+ i0.ɵɵelement(13, "prism-icon", 12);
158
+ i0.ɵɵelementEnd();
159
+ i0.ɵɵelement(14, "span", 13);
160
+ i0.ɵɵelementStart(15, "button", 14);
161
+ i0.ɵɵelement(16, "prism-icon", 15);
130
162
  i0.ɵɵelementEnd()();
131
- i0.ɵɵelementStart(12, "div", 11)(13, "span", 12);
132
- i0.ɵɵtext(14, "Canvas");
163
+ i0.ɵɵelementStart(17, "div", 16)(18, "span", 17);
164
+ i0.ɵɵtext(19, "Canvas");
165
+ i0.ɵɵelementEnd();
166
+ i0.ɵɵelementStart(20, "div", 18);
167
+ i0.ɵɵrepeaterCreate(21, PrismCanvasToolbarComponent_For_22_Template, 2, 6, "button", 19, i0.ɵɵrepeaterTrackByIdentity);
168
+ i0.ɵɵelementEnd();
169
+ i0.ɵɵelementStart(23, "span", 17);
170
+ i0.ɵɵtext(24, "Zoom");
133
171
  i0.ɵɵelementEnd();
134
- i0.ɵɵelementStart(15, "div", 13);
135
- i0.ɵɵrepeaterCreate(16, PrismCanvasToolbarComponent_For_17_Template, 2, 6, "button", 14, i0.ɵɵrepeaterTrackByIdentity);
172
+ i0.ɵɵelementStart(25, "div", 18);
173
+ i0.ɵɵrepeaterCreate(26, PrismCanvasToolbarComponent_For_27_Template, 2, 3, "button", 20, _forTrack0);
136
174
  i0.ɵɵelementEnd();
137
- i0.ɵɵelementStart(18, "span", 12);
138
- i0.ɵɵtext(19, "Zoom");
175
+ i0.ɵɵelementStart(28, "span", 17);
176
+ i0.ɵɵtext(29, "Width");
139
177
  i0.ɵɵelementEnd();
140
- i0.ɵɵelementStart(20, "div", 13);
141
- i0.ɵɵrepeaterCreate(21, PrismCanvasToolbarComponent_For_22_Template, 2, 3, "button", 15, _forTrack0);
178
+ i0.ɵɵelementStart(30, "div", 18)(31, "button", 21);
179
+ i0.ɵɵlistener("click", function PrismCanvasToolbarComponent_Template_button_click_31_listener() { return ctx.canvas.setViewportWidth(null); });
180
+ i0.ɵɵtext(32, " Auto ");
181
+ i0.ɵɵelementEnd();
182
+ i0.ɵɵrepeaterCreate(33, PrismCanvasToolbarComponent_For_34_Template, 2, 3, "button", 20, i0.ɵɵrepeaterTrackByIdentity);
142
183
  i0.ɵɵelementEnd()();
143
184
  } if (rf & 2) {
144
185
  i0.ɵɵclassProp("has-rulers", ctx.canvas.rulers());
145
186
  i0.ɵɵadvance(2);
146
- i0.ɵɵtextInterpolate1("", ctx.Math.round(ctx.canvas.zoom() * 100), "%");
187
+ i0.ɵɵtextInterpolate1(" ", ctx.Math.round(ctx.canvas.zoom() * 100), "% ");
188
+ i0.ɵɵadvance();
189
+ i0.ɵɵconditional(ctx.canvas.viewportWidth() !== null ? 3 : -1);
147
190
  i0.ɵɵadvance();
148
191
  i0.ɵɵclassProp("is-on", ctx.canvas.guides());
149
192
  i0.ɵɵattribute("aria-pressed", ctx.canvas.guides());
@@ -154,6 +197,16 @@ export class PrismCanvasToolbarComponent {
154
197
  i0.ɵɵattribute("aria-pressed", ctx.canvas.rulers());
155
198
  i0.ɵɵadvance();
156
199
  i0.ɵɵproperty("size", 14);
200
+ i0.ɵɵadvance();
201
+ i0.ɵɵclassProp("is-on", ctx.canvas.viewportWidth() !== null);
202
+ i0.ɵɵattribute("aria-pressed", ctx.canvas.viewportWidth() !== null);
203
+ i0.ɵɵadvance();
204
+ i0.ɵɵproperty("size", 14);
205
+ i0.ɵɵadvance();
206
+ i0.ɵɵclassProp("is-on", ctx.canvas.measure());
207
+ i0.ɵɵattribute("aria-pressed", ctx.canvas.measure());
208
+ i0.ɵɵadvance();
209
+ i0.ɵɵproperty("size", 14);
157
210
  i0.ɵɵadvance(2);
158
211
  i0.ɵɵproperty("size", 14);
159
212
  i0.ɵɵadvance(3);
@@ -162,105 +215,14 @@ export class PrismCanvasToolbarComponent {
162
215
  i0.ɵɵrepeater(ctx.bgs);
163
216
  i0.ɵɵadvance(5);
164
217
  i0.ɵɵrepeater(ctx.zooms);
165
- } }, dependencies: [PrismIconComponent], styles: ["[_nghost-%COMP%] { display: contents; }\n\n \n\n\n\n\n\n\n\n\n\n\n\n .prism-toolrail[_ngcontent-%COMP%] {\n position: absolute;\n top: var(--%NS%prism-canvas-overlay-top, 12px);\n right: var(--%NS%prism-canvas-overlay-inline, 20px);\n z-index: 5;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--%NS%sp-1);\n padding: var(--%NS%sp-2);\n border: 1px solid var(--%NS%prism-border-strong);\n border-radius: var(--%NS%radius-md);\n background: var(--%NS%prism-bg-elevated);\n box-shadow: 0 4px 16px -6px rgba(0, 0, 0, 0.4);\n anchor-name: --prism-toolrail;\n }\n .prism-toolrail.has-rulers[_ngcontent-%COMP%] {\n --%NS%prism-canvas-overlay-top: 28px;\n --%NS%prism-canvas-overlay-inline: 28px;\n }\n\n .prism-toolrail__zoom[_ngcontent-%COMP%] {\n width: 100%;\n padding-bottom: var(--%NS%sp-1);\n border-bottom: 1px solid var(--%NS%prism-border);\n font-family: var(--%NS%font-mono);\n font-size: 9px;\n color: var(--%NS%prism-text-ghost);\n text-align: center;\n }\n\n .prism-toolrail__btn[_ngcontent-%COMP%] {\n display: grid;\n place-items: center;\n width: 26px;\n height: 26px;\n padding: 0;\n border: 0;\n border-radius: var(--%NS%radius-xs);\n background: transparent;\n color: var(--%NS%prism-text-muted);\n cursor: pointer;\n }\n .prism-toolrail__btn[_ngcontent-%COMP%]:hover { color: var(--%NS%prism-text); }\n .prism-toolrail__btn[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--%NS%prism-primary);\n outline-offset: 1px;\n }\n .prism-toolrail__btn.is-on[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--%NS%prism-primary) 18%, transparent);\n color: var(--%NS%prism-text);\n }\n .prism-toolrail__sep[_ngcontent-%COMP%] {\n width: 14px;\n height: 1px;\n background: var(--%NS%prism-border);\n margin: var(--%NS%sp-1) 0;\n }\n\n .prism-toolmenu[_ngcontent-%COMP%] {\n margin: 0;\n padding: var(--%NS%sp-3);\n border: 1px solid var(--%NS%prism-border-strong);\n border-radius: var(--%NS%radius-md);\n background: var(--%NS%prism-bg-elevated);\n box-shadow: 0 8px 28px -10px rgba(0, 0, 0, 0.45);\n gap: var(--%NS%sp-2);\n position-anchor: --prism-toolrail;\n position-area: inline-start;\n position-try-fallbacks: flip-inline;\n inset: auto;\n margin-inline-end: var(--%NS%sp-2);\n }\n\n \n\n\n\n .prism-toolmenu[_ngcontent-%COMP%]:popover-open {\n display: flex;\n flex-direction: column;\n }\n\n .prism-toolmenu__lbl[_ngcontent-%COMP%] {\n font-size: var(--%NS%fs-xs);\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--%NS%prism-text-ghost);\n }\n .prism-toolmenu__row[_ngcontent-%COMP%] { display: flex; flex-wrap: wrap; gap: var(--%NS%sp-1); }\n .prism-toolmenu__row[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n padding: 2px var(--%NS%sp-3);\n border: 1px solid var(--%NS%prism-border);\n border-radius: var(--%NS%radius-xs);\n background: transparent;\n font-size: var(--%NS%fs-md);\n color: var(--%NS%prism-text-2);\n cursor: pointer;\n white-space: nowrap;\n }\n .prism-toolmenu__row[_ngcontent-%COMP%] button.is-on[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--%NS%prism-primary) 16%, transparent);\n border-color: color-mix(in srgb, var(--%NS%prism-primary) 38%, transparent);\n color: var(--%NS%prism-text);\n }\n .prism-toolmenu__row[_ngcontent-%COMP%] button.is-rec[_ngcontent-%COMP%] {\n border-color: color-mix(in srgb, var(--%NS%prism-primary) 30%, transparent);\n }"] });
218
+ i0.ɵɵadvance(5);
219
+ i0.ɵɵclassProp("is-on", ctx.canvas.viewportWidth() === null);
220
+ i0.ɵɵadvance(2);
221
+ i0.ɵɵrepeater(ctx.viewports);
222
+ } }, dependencies: [PrismIconComponent], styles: ["[_nghost-%COMP%] {\n display: contents;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n.prism-toolrail[_ngcontent-%COMP%] {\n position: absolute;\n top: var(--%NS%prism-canvas-overlay-top, 12px);\n right: var(--%NS%prism-canvas-overlay-inline, 20px);\n z-index: 5;\n display: flex;\n flex-direction: column;\n gap: var(--%NS%sp-1);\n align-items: center;\n padding: var(--%NS%sp-2);\n anchor-name: --prism-toolrail;\n background: var(--%NS%prism-bg-elevated);\n border: 1px solid var(--%NS%prism-border-strong);\n border-radius: var(--%NS%radius-md);\n box-shadow: 0 4px 16px -6px rgb(0 0 0 / 40%);\n}\n\n.prism-toolrail.has-rulers[_ngcontent-%COMP%] {\n --%NS%prism-canvas-overlay-top: 28px;\n --%NS%prism-canvas-overlay-inline: 28px;\n}\n\n.prism-toolrail__zoom[_ngcontent-%COMP%] {\n width: 100%;\n padding-bottom: var(--%NS%sp-1);\n font-family: var(--%NS%font-mono);\n font-size: 9px;\n color: var(--%NS%prism-text-ghost);\n text-align: center;\n border-bottom: 1px solid var(--%NS%prism-border);\n}\n\n\n\n\n.prism-toolrail__vp[_ngcontent-%COMP%] {\n display: block;\n color: var(--%NS%prism-measure);\n}\n\n.prism-toolrail__btn[_ngcontent-%COMP%] {\n display: grid;\n place-items: center;\n width: 26px;\n height: 26px;\n padding: 0;\n color: var(--%NS%prism-text-muted);\n cursor: pointer;\n background: transparent;\n border: 0;\n border-radius: var(--%NS%radius-xs);\n}\n\n.prism-toolrail__btn[_ngcontent-%COMP%]:hover {\n color: var(--%NS%prism-text);\n}\n\n.prism-toolrail__btn[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--%NS%prism-primary);\n outline-offset: 1px;\n}\n\n.prism-toolrail__btn.is-on[_ngcontent-%COMP%] {\n color: var(--%NS%prism-text);\n background: color-mix(in srgb, var(--%NS%prism-primary) 18%, transparent);\n}\n\n.prism-toolrail__sep[_ngcontent-%COMP%] {\n width: 14px;\n height: 1px;\n margin: var(--%NS%sp-1) 0;\n background: var(--%NS%prism-border);\n}\n\n.prism-toolmenu[_ngcontent-%COMP%] {\n inset: auto;\n gap: var(--%NS%sp-2);\n padding: var(--%NS%sp-3);\n margin: 0;\n margin-inline-end: var(--%NS%sp-2);\n position-area: inline-start;\n position-anchor: --prism-toolrail;\n position-try-fallbacks: flip-inline;\n background: var(--%NS%prism-bg-elevated);\n border: 1px solid var(--%NS%prism-border-strong);\n border-radius: var(--%NS%radius-md);\n box-shadow: 0 8px 28px -10px rgb(0 0 0 / 45%);\n}\n\n\n\n\n\n.prism-toolmenu[_ngcontent-%COMP%]:popover-open {\n display: flex;\n flex-direction: column;\n}\n\n.prism-toolmenu__lbl[_ngcontent-%COMP%] {\n font-size: var(--%NS%fs-xs);\n color: var(--%NS%prism-text-ghost);\n text-transform: uppercase;\n letter-spacing: 0.08em;\n}\n\n.prism-toolmenu__row[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: var(--%NS%sp-1);\n}\n\n.prism-toolmenu__row[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n padding: 2px var(--%NS%sp-3);\n font-size: var(--%NS%fs-md);\n color: var(--%NS%prism-text-2);\n white-space: nowrap;\n cursor: pointer;\n background: transparent;\n border: 1px solid var(--%NS%prism-border);\n border-radius: var(--%NS%radius-xs);\n}\n\n.prism-toolmenu__row[_ngcontent-%COMP%] button.is-on[_ngcontent-%COMP%] {\n color: var(--%NS%prism-text);\n background: color-mix(in srgb, var(--%NS%prism-primary) 16%, transparent);\n border-color: color-mix(in srgb, var(--%NS%prism-primary) 38%, transparent);\n}\n\n.prism-toolmenu__row[_ngcontent-%COMP%] button.is-rec[_ngcontent-%COMP%] {\n border-color: color-mix(in srgb, var(--%NS%prism-primary) 30%, transparent);\n}"] });
166
223
  }
167
224
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PrismCanvasToolbarComponent, [{
168
225
  type: Component,
169
- args: [{ selector: 'prism-canvas-toolbar', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [PrismIconComponent], template: `
170
- <!-- Anchored in .prism-canvas-wrap, deliberately absolute and not fixed:
171
- a viewport-fixed rail would float over the sidebar and the panel, stay
172
- put while those are resized, and sit on top of running text in the API
173
- view where it has no business being. -->
174
- <div class="prism-toolrail" [class.has-rulers]="canvas.rulers()">
175
- <span class="prism-toolrail__zoom"
176
- >{{ Math.round(canvas.zoom() * 100) }}%</span
177
- >
178
-
179
- <button
180
- type="button"
181
- class="prism-toolrail__btn"
182
- [class.is-on]="canvas.guides()"
183
- (click)="canvas.toggleGuides()"
184
- title="Toggle guides"
185
- aria-label="Toggle guides"
186
- [attr.aria-pressed]="canvas.guides()"
187
- >
188
- <prism-icon name="crosshair" [size]="14" />
189
- </button>
190
-
191
- <button
192
- type="button"
193
- class="prism-toolrail__btn"
194
- [class.is-on]="canvas.rulers()"
195
- (click)="canvas.toggleRulers()"
196
- title="Toggle rulers"
197
- aria-label="Toggle rulers"
198
- [attr.aria-pressed]="canvas.rulers()"
199
- >
200
- <prism-icon name="move" [size]="14" />
201
- </button>
202
-
203
- <button
204
- type="button"
205
- class="prism-toolrail__btn"
206
- popovertarget="prism-tools"
207
- title="Canvas and zoom"
208
- aria-label="Canvas and zoom"
209
- >
210
- <prism-icon name="sliders-horizontal" [size]="14" />
211
- </button>
212
-
213
- <span class="prism-toolrail__sep"></span>
214
-
215
- <button
216
- type="button"
217
- class="prism-toolrail__btn"
218
- popovertarget="prism-template"
219
- title="Toggle Angular template"
220
- aria-label="Toggle Angular template"
221
- >
222
- <prism-icon name="code" [size]="14" />
223
- </button>
224
- </div>
225
-
226
- <!-- Only the two choosers. The toggles stay outside: you flip guides and
227
- rulers constantly while measuring, and a toggle two clicks deep is the
228
- classic mistake. What you only ever set may live in a menu. -->
229
- <div
230
- popover
231
- id="prism-tools"
232
- class="prism-toolmenu"
233
- role="dialog"
234
- aria-label="Canvas and zoom"
235
- >
236
- <span class="prism-toolmenu__lbl">Canvas</span>
237
- <div class="prism-toolmenu__row">
238
- @for (bg of bgs; track bg) {
239
- <button
240
- type="button"
241
- [class.is-on]="variantBg.effective() === bg"
242
- [class.is-rec]="variantBg.recommended() === bg"
243
- [attr.title]="bgTitle(bg)"
244
- (click)="setBg(bg)"
245
- >
246
- {{ capitalize(bg) }}
247
- </button>
248
- }
249
- </div>
250
-
251
- <span class="prism-toolmenu__lbl">Zoom</span>
252
- <div class="prism-toolmenu__row">
253
- @for (z of zooms; track z.value) {
254
- <button
255
- type="button"
256
- [class.is-on]="canvas.zoom() === z.value"
257
- (click)="canvas.setZoom(z.value)"
258
- >
259
- {{ z.label }}
260
- </button>
261
- }
262
- </div>
263
- </div>
264
- `, styles: ["\n :host { display: contents; }\n\n /* Canvas overlays sit at --prism-canvas-overlay-*, which the stage grows\n when the rulers claim its top and left edges (see the\n .prism-canvas-stage[data-rulers] rule in prism-renderer.component.ts).\n prism-canvas-bg-pill simply inherits those; this rail cannot, because\n capture mode requires it to be a direct child of .prism-canvas-wrap\n outside the stage. So it mirrors the same values off canvas.rulers()\n instead \u2014 keep the two in step.\n\n z-index outranks the rulers' 4 rather than matching it: the rail is a\n control and they are chrome, and the toolbar renders before the\n renderer in the shell, so an equal z-index let the rulers paint over\n the buttons. */\n .prism-toolrail {\n position: absolute;\n top: var(--prism-canvas-overlay-top, 12px);\n right: var(--prism-canvas-overlay-inline, 20px);\n z-index: 5;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--sp-1);\n padding: var(--sp-2);\n border: 1px solid var(--prism-border-strong);\n border-radius: var(--radius-md);\n background: var(--prism-bg-elevated);\n box-shadow: 0 4px 16px -6px rgba(0, 0, 0, 0.4);\n anchor-name: --prism-toolrail;\n }\n .prism-toolrail.has-rulers {\n --prism-canvas-overlay-top: 28px;\n --prism-canvas-overlay-inline: 28px;\n }\n\n .prism-toolrail__zoom {\n width: 100%;\n padding-bottom: var(--sp-1);\n border-bottom: 1px solid var(--prism-border);\n font-family: var(--font-mono);\n font-size: 9px;\n color: var(--prism-text-ghost);\n text-align: center;\n }\n\n .prism-toolrail__btn {\n display: grid;\n place-items: center;\n width: 26px;\n height: 26px;\n padding: 0;\n border: 0;\n border-radius: var(--radius-xs);\n background: transparent;\n color: var(--prism-text-muted);\n cursor: pointer;\n }\n .prism-toolrail__btn:hover { color: var(--prism-text); }\n .prism-toolrail__btn:focus-visible {\n outline: 2px solid var(--prism-primary);\n outline-offset: 1px;\n }\n .prism-toolrail__btn.is-on {\n background: color-mix(in srgb, var(--prism-primary) 18%, transparent);\n color: var(--prism-text);\n }\n .prism-toolrail__sep {\n width: 14px;\n height: 1px;\n background: var(--prism-border);\n margin: var(--sp-1) 0;\n }\n\n .prism-toolmenu {\n margin: 0;\n padding: var(--sp-3);\n border: 1px solid var(--prism-border-strong);\n border-radius: var(--radius-md);\n background: var(--prism-bg-elevated);\n box-shadow: 0 8px 28px -10px rgba(0, 0, 0, 0.45);\n gap: var(--sp-2);\n position-anchor: --prism-toolrail;\n position-area: inline-start;\n position-try-fallbacks: flip-inline;\n inset: auto;\n margin-inline-end: var(--sp-2);\n }\n\n /* display belongs on :popover-open and nowhere else \u2014 see the note in\n prism-template-popover.component.ts. An author display on the base\n rule outranks the UA's [popover]:not(:popover-open) { display: none }\n and pins the menu open. */\n .prism-toolmenu:popover-open {\n display: flex;\n flex-direction: column;\n }\n\n .prism-toolmenu__lbl {\n font-size: var(--fs-xs);\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--prism-text-ghost);\n }\n .prism-toolmenu__row { display: flex; flex-wrap: wrap; gap: var(--sp-1); }\n .prism-toolmenu__row button {\n padding: 2px var(--sp-3);\n border: 1px solid var(--prism-border);\n border-radius: var(--radius-xs);\n background: transparent;\n font-size: var(--fs-md);\n color: var(--prism-text-2);\n cursor: pointer;\n white-space: nowrap;\n }\n .prism-toolmenu__row button.is-on {\n background: color-mix(in srgb, var(--prism-primary) 16%, transparent);\n border-color: color-mix(in srgb, var(--prism-primary) 38%, transparent);\n color: var(--prism-text);\n }\n .prism-toolmenu__row button.is-rec {\n border-color: color-mix(in srgb, var(--prism-primary) 30%, transparent);\n }\n "] }]
226
+ args: [{ selector: 'prism-canvas-toolbar', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [PrismIconComponent], template: "<!-- Anchored in .prism-canvas-wrap, absolute, not fixed:\n a viewport-fixed rail would float over the sidebar and the panel, stay\n put while those are resized, and sit on top of running text in the API\n view where it has no business being. -->\n<div\n class=\"prism-toolrail\"\n [class.has-rulers]=\"canvas.rulers()\">\n <span class=\"prism-toolrail__zoom\">\n {{ Math.round(canvas.zoom() * 100) }}%\n @if (canvas.viewportWidth() !== null) {\n <span class=\"prism-toolrail__vp\">{{ canvas.viewportWidth() }}px</span>\n }\n </span>\n\n <button\n type=\"button\"\n class=\"prism-toolrail__btn\"\n [class.is-on]=\"canvas.guides()\"\n (click)=\"canvas.toggleGuides()\"\n title=\"Toggle guides\"\n aria-label=\"Toggle guides\"\n [attr.aria-pressed]=\"canvas.guides()\">\n <prism-icon\n name=\"crosshair\"\n [size]=\"14\" />\n </button>\n\n <button\n type=\"button\"\n class=\"prism-toolrail__btn\"\n [class.is-on]=\"canvas.rulers()\"\n (click)=\"canvas.toggleRulers()\"\n title=\"Toggle rulers\"\n aria-label=\"Toggle rulers\"\n [attr.aria-pressed]=\"canvas.rulers()\">\n <prism-icon\n name=\"move\"\n [size]=\"14\" />\n </button>\n\n <button\n type=\"button\"\n class=\"prism-toolrail__btn\"\n [class.is-on]=\"canvas.viewportWidth() !== null\"\n (click)=\"canvas.toggleViewport()\"\n title=\"Toggle viewport width\"\n aria-label=\"Toggle viewport width\"\n [attr.aria-pressed]=\"canvas.viewportWidth() !== null\">\n <prism-icon\n name=\"ruler-dimension\"\n [size]=\"14\" />\n </button>\n\n <button\n type=\"button\"\n class=\"prism-toolrail__btn\"\n [class.is-on]=\"canvas.measure()\"\n (click)=\"canvas.toggleMeasure()\"\n title=\"Toggle measure tool\"\n aria-label=\"Toggle measure tool\"\n [attr.aria-pressed]=\"canvas.measure()\">\n <prism-icon\n name=\"ruler\"\n [size]=\"14\" />\n </button>\n\n <button\n type=\"button\"\n class=\"prism-toolrail__btn\"\n popovertarget=\"prism-tools\"\n title=\"Canvas, zoom and width\"\n aria-label=\"Canvas, zoom and width\">\n <prism-icon\n name=\"sliders-horizontal\"\n [size]=\"14\" />\n </button>\n\n <span class=\"prism-toolrail__sep\"></span>\n\n <button\n type=\"button\"\n class=\"prism-toolrail__btn\"\n popovertarget=\"prism-template\"\n title=\"Toggle Angular template\"\n aria-label=\"Toggle Angular template\">\n <prism-icon\n name=\"code\"\n [size]=\"14\" />\n </button>\n</div>\n\n<!-- Only the three choosers. The toggles stay outside: you flip guides,\n rulers and the viewport constraint constantly while working, and a\n toggle two clicks deep is the classic mistake. What you only ever\n set may live in a menu. -->\n<div\n popover\n id=\"prism-tools\"\n class=\"prism-toolmenu\"\n role=\"dialog\"\n aria-label=\"Canvas, zoom and width\">\n <span class=\"prism-toolmenu__lbl\">Canvas</span>\n <div class=\"prism-toolmenu__row\">\n @for (bg of bgs; track bg) {\n <button\n type=\"button\"\n [class.is-on]=\"variantBg.effective() === bg\"\n [class.is-rec]=\"variantBg.recommended() === bg\"\n [attr.title]=\"bgTitle(bg)\"\n (click)=\"setBg(bg)\">\n {{ capitalize(bg) }}\n </button>\n }\n </div>\n\n <span class=\"prism-toolmenu__lbl\">Zoom</span>\n <div class=\"prism-toolmenu__row\">\n @for (z of zooms; track z.value) {\n <button\n type=\"button\"\n [class.is-on]=\"canvas.zoom() === z.value\"\n (click)=\"canvas.setZoom(z.value)\">\n {{ z.label }}\n </button>\n }\n </div>\n\n <span class=\"prism-toolmenu__lbl\">Width</span>\n <div class=\"prism-toolmenu__row\">\n <button\n type=\"button\"\n [class.is-on]=\"canvas.viewportWidth() === null\"\n (click)=\"canvas.setViewportWidth(null)\">\n Auto\n </button>\n @for (w of viewports; track w) {\n <button\n type=\"button\"\n [class.is-on]=\"canvas.viewportWidth() === w\"\n (click)=\"canvas.setViewportWidth(w)\">\n {{ w }}\n </button>\n }\n </div>\n</div>\n", styles: [":host {\n display: contents;\n}\n\n/* Canvas overlays sit at --prism-canvas-overlay-*, which the stage grows\n when the rulers claim its top and left edges (see the\n .prism-canvas-stage[data-rulers] rule in prism-renderer.component.ts).\n prism-canvas-bg-pill simply inherits those; this rail cannot, because\n capture mode requires it to be a direct child of .prism-canvas-wrap\n outside the stage. So it mirrors the same values off canvas.rulers()\n instead, so keep the two in step.\n\n z-index outranks the rulers' 4 rather than matching it: the rail is a\n control and they are chrome, and the toolbar renders before the\n renderer in the shell, so an equal z-index let the rulers paint over\n the buttons. */\n.prism-toolrail {\n position: absolute;\n top: var(--prism-canvas-overlay-top, 12px);\n right: var(--prism-canvas-overlay-inline, 20px);\n z-index: 5;\n display: flex;\n flex-direction: column;\n gap: var(--sp-1);\n align-items: center;\n padding: var(--sp-2);\n anchor-name: --prism-toolrail;\n background: var(--prism-bg-elevated);\n border: 1px solid var(--prism-border-strong);\n border-radius: var(--radius-md);\n box-shadow: 0 4px 16px -6px rgb(0 0 0 / 40%);\n}\n\n.prism-toolrail.has-rulers {\n --prism-canvas-overlay-top: 28px;\n --prism-canvas-overlay-inline: 28px;\n}\n\n.prism-toolrail__zoom {\n width: 100%;\n padding-bottom: var(--sp-1);\n font-family: var(--font-mono);\n font-size: 9px;\n color: var(--prism-text-ghost);\n text-align: center;\n border-bottom: 1px solid var(--prism-border);\n}\n\n/* The one number on this rail that is not a percentage, so it takes the\n measurement colour the theme already reserves for rulers and guides\n rather than a second neutral that would read as a second zoom. */\n.prism-toolrail__vp {\n display: block;\n color: var(--prism-measure);\n}\n\n.prism-toolrail__btn {\n display: grid;\n place-items: center;\n width: 26px;\n height: 26px;\n padding: 0;\n color: var(--prism-text-muted);\n cursor: pointer;\n background: transparent;\n border: 0;\n border-radius: var(--radius-xs);\n}\n\n.prism-toolrail__btn:hover {\n color: var(--prism-text);\n}\n\n.prism-toolrail__btn:focus-visible {\n outline: 2px solid var(--prism-primary);\n outline-offset: 1px;\n}\n\n.prism-toolrail__btn.is-on {\n color: var(--prism-text);\n background: color-mix(in srgb, var(--prism-primary) 18%, transparent);\n}\n\n.prism-toolrail__sep {\n width: 14px;\n height: 1px;\n margin: var(--sp-1) 0;\n background: var(--prism-border);\n}\n\n.prism-toolmenu {\n inset: auto;\n gap: var(--sp-2);\n padding: var(--sp-3);\n margin: 0;\n margin-inline-end: var(--sp-2);\n position-area: inline-start;\n position-anchor: --prism-toolrail;\n position-try-fallbacks: flip-inline;\n background: var(--prism-bg-elevated);\n border: 1px solid var(--prism-border-strong);\n border-radius: var(--radius-md);\n box-shadow: 0 8px 28px -10px rgb(0 0 0 / 45%);\n}\n\n/* display belongs on :popover-open and nowhere else (see the note in\n prism-template-popover.component.ts). An author display on the base\n rule outranks the UA's [popover]:not(:popover-open) { display: none }\n and pins the menu open. */\n.prism-toolmenu:popover-open {\n display: flex;\n flex-direction: column;\n}\n\n.prism-toolmenu__lbl {\n font-size: var(--fs-xs);\n color: var(--prism-text-ghost);\n text-transform: uppercase;\n letter-spacing: 0.08em;\n}\n\n.prism-toolmenu__row {\n display: flex;\n flex-wrap: wrap;\n gap: var(--sp-1);\n}\n\n.prism-toolmenu__row button {\n padding: 2px var(--sp-3);\n font-size: var(--fs-md);\n color: var(--prism-text-2);\n white-space: nowrap;\n cursor: pointer;\n background: transparent;\n border: 1px solid var(--prism-border);\n border-radius: var(--radius-xs);\n}\n\n.prism-toolmenu__row button.is-on {\n color: var(--prism-text);\n background: color-mix(in srgb, var(--prism-primary) 16%, transparent);\n border-color: color-mix(in srgb, var(--prism-primary) 38%, transparent);\n}\n\n.prism-toolmenu__row button.is-rec {\n border-color: color-mix(in srgb, var(--prism-primary) 30%, transparent);\n}\n"] }]
265
227
  }], null, null); })();
266
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismCanvasToolbarComponent, { className: "PrismCanvasToolbarComponent", filePath: "app/canvas/prism-canvas-toolbar.component.ts", lineNumber: 251 }); })();
228
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismCanvasToolbarComponent, { className: "PrismCanvasToolbarComponent", filePath: "app/canvas/prism-canvas-toolbar.component.ts", lineNumber: 31 }); })();
@@ -1 +1 @@
1
- {"version":3,"file":"prism-template-popover.component.d.ts","sourceRoot":"","sources":["../../../src/app/canvas/prism-template-popover.component.ts"],"names":[],"mappings":";AAyCA,qBAwLa,6BAA6B;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAkC;IACpE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgC;IAEhE,SAAS,CAAC,QAAQ,CAAC,MAAM,kDAAiB;IAC1C,OAAO,CAAC,gBAAgB,CAA8C;IAEtE,SAAS,CAAC,QAAQ,CAAC,OAAO,yCAqBvB;IAEH,SAAS,CAAC,QAAQ,CAAC,WAAW,yCAI3B;IAEH,SAAS,CAAC,IAAI,IAAI,IAAI;yCApCX,6BAA6B;2CAA7B,6BAA6B;CA4CzC"}
1
+ {"version":3,"file":"prism-template-popover.component.d.ts","sourceRoot":"","sources":["../../../src/app/canvas/prism-template-popover.component.ts"],"names":[],"mappings":";AAmCA,qBAQa,6BAA6B;IACtC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAkC;IACpE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgC;IAEhE,SAAS,CAAC,QAAQ,CAAC,MAAM,kDAAiB;IAC1C,OAAO,CAAC,gBAAgB,CAA8C;IAEtE,SAAS,CAAC,QAAQ,CAAC,OAAO,yCAgBvB;IAEH,SAAS,CAAC,QAAQ,CAAC,WAAW,yCAK3B;IAEH,SAAS,CAAC,IAAI,IAAI,IAAI;yCAhCb,6BAA6B;2CAA7B,6BAA6B;CAyCzC"}
@@ -1,14 +1,14 @@
1
- import { Component, inject, computed, signal, ChangeDetectionStrategy, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';
2
2
  import { PrismIconComponent } from '../icons/prism-icon.component.js';
3
+ import { generateSnippet } from '../renderer/snippet-generator.js';
3
4
  import { PrismNavigationService } from '../services/prism-navigation.service.js';
4
5
  import { PrismRendererService } from '../services/prism-renderer.service.js';
5
- import { generateSnippet } from '../renderer/snippet-generator.js';
6
6
  import * as i0 from "@angular/core";
7
7
  function esc(s) {
8
8
  return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
9
9
  }
10
10
  function tokenizeXml(code) {
11
- const re = /(\/\/[^\n]*)|(<\/?[\w-]+)|(\[[\w.]+\]|[\w-]+)=|"([^"]*)"|(\/>|>)|(\n)|([^<\["\n/>=]+|[/=])/g;
11
+ const re = /(\/\/[^\n]*)|(<\/?[\w-]+)|(\[[\w.]+\]|[\w-]+)=|"([^"]*)"|(\/>|>)|(\n)|([^<["\n/>=]+|[/=])/g;
12
12
  let out = '';
13
13
  let m;
14
14
  while ((m = re.exec(code)) !== null) {
@@ -47,12 +47,8 @@ export class PrismTemplatePopoverComponent {
47
47
  if (!comp)
48
48
  return '';
49
49
  const variant = comp.meta.showcaseConfig.variants?.[this.rendererService.activeVariantIndex()];
50
- const explicitKeys = variant?.inputs
51
- ? new Set(Object.keys(variant.inputs))
52
- : undefined;
53
- const directiveOptions = comp.meta.componentMeta.isDirective
54
- ? { host: comp.meta.showcaseConfig.host }
55
- : undefined;
50
+ const explicitKeys = variant?.inputs ? new Set(Object.keys(variant.inputs)) : undefined;
51
+ const directiveOptions = comp.meta.componentMeta.isDirective ? { host: comp.meta.showcaseConfig.host } : undefined;
56
52
  return generateSnippet(comp.meta.componentMeta.selector, comp.meta.inputs, this.rendererService.inputValues(), explicitKeys, this.rendererService.activeContent(), directiveOptions);
57
53
  }, /* @ts-ignore */
58
54
  ...(ngDevMode ? [{ debugName: "snippet" }] : /* istanbul ignore next */ []));
@@ -103,47 +99,10 @@ export class PrismTemplatePopoverComponent {
103
99
  i0.ɵɵproperty("size", 13);
104
100
  i0.ɵɵadvance();
105
101
  i0.ɵɵproperty("innerHTML", ctx.highlighted(), i0.ɵɵsanitizeHtml);
106
- } }, dependencies: [PrismIconComponent], styles: ["[_nghost-%COMP%] { display: contents; }\n\n \n\n\n\n\n\n .tpl-popover[_ngcontent-%COMP%] {\n width: 520px;\n max-width: calc(100vw - var(--%NS%sp-6));\n max-height: min(420px, calc(100vh - var(--%NS%sp-7)));\n position-anchor: --prism-toolrail;\n position-area: block-end span-inline-start;\n position-try-fallbacks: flip-block, flip-inline;\n inset: auto;\n margin: var(--%NS%sp-2) 0 0 0;\n background: var(--%NS%prism-bg-elevated);\n border: 1px solid var(--%NS%prism-border-strong);\n border-radius: var(--%NS%radius-lg, 10px);\n box-shadow:\n 0 20px 60px rgba(0, 0, 0, 0.45),\n 0 0 0 1px color-mix(in srgb, var(--%NS%prism-primary) 10%, transparent);\n overflow: hidden;\n animation: _ngcontent-%COMP%_tpl-fade-in var(--%NS%dur-fast, 0.15s) var(--%NS%ease-default, ease-out);\n }\n\n \n\n\n\n\n\n .tpl-popover[_ngcontent-%COMP%]:popover-open {\n display: flex;\n flex-direction: column;\n }\n\n @keyframes _ngcontent-%COMP%_tpl-fade-in {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .tpl-popover-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0 12px 0 16px;\n height: 40px;\n border-bottom: 1px solid var(--%NS%prism-border);\n background: linear-gradient(\n 180deg,\n var(--%NS%prism-bg-surface),\n var(--%NS%prism-bg-elevated)\n );\n flex-shrink: 0;\n }\n .tpl-popover-head[_ngcontent-%COMP%] > prism-icon[_ngcontent-%COMP%] {\n color: var(--%NS%prism-text-muted);\n }\n .tpl-popover-head[_ngcontent-%COMP%] > span[_ngcontent-%COMP%] {\n flex: 1;\n font-size: var(--%NS%fs-xs);\n font-weight: 700;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--%NS%prism-text-2);\n }\n\n .tpl-popover-copy[_ngcontent-%COMP%] {\n height: 26px;\n padding: 0 10px;\n font-size: var(--%NS%fs-sm);\n font-family: var(--%NS%font-sans);\n font-weight: 500;\n color: var(--%NS%prism-primary);\n background: color-mix(in srgb, var(--%NS%prism-primary) 12%, transparent);\n border: 1px solid color-mix(in srgb, var(--%NS%prism-primary) 25%, transparent);\n border-radius: var(--%NS%radius-sm, 5px);\n display: flex;\n align-items: center;\n gap: 5px;\n cursor: pointer;\n transition: background var(--%NS%dur-fast);\n }\n .tpl-popover-copy[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--%NS%prism-primary) 20%, transparent);\n }\n\n .tpl-popover-close[_ngcontent-%COMP%] {\n width: 26px;\n height: 26px;\n display: grid;\n place-items: center;\n border-radius: var(--%NS%radius-sm, 5px);\n color: var(--%NS%prism-text-muted);\n background: transparent;\n border: 0;\n cursor: pointer;\n transition: background var(--%NS%dur-fast), color var(--%NS%dur-fast);\n }\n .tpl-popover-close[_ngcontent-%COMP%]:hover {\n color: var(--%NS%prism-text);\n background: var(--%NS%prism-input-bg);\n }\n\n .tpl-popover-body[_ngcontent-%COMP%] {\n margin: 0;\n padding: 14px 18px;\n font-family: var(--%NS%font-mono);\n font-size: var(--%NS%fs-md);\n line-height: 1.7;\n color: var(--%NS%prism-text-2);\n overflow: auto;\n background: var(--%NS%prism-bg);\n flex: 1;\n min-height: 0;\n white-space: pre;\n }\n .tpl-popover-body[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n }\n .tpl-popover-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--%NS%prism-border-strong);\n border-radius: 3px;\n }\n\n [_nghost-%COMP%] .tok-tag { color: var(--%NS%prism-code-tag); }\n [_nghost-%COMP%] .tok-attr { color: var(--%NS%prism-code-attr); }\n [_nghost-%COMP%] .tok-str { color: var(--%NS%prism-code-str); }\n [_nghost-%COMP%] .tok-com { color: var(--%NS%prism-code-com); font-style: italic; }"] });
102
+ } }, dependencies: [PrismIconComponent], styles: ["[_nghost-%COMP%] {\n display: contents;\n}\n\n\n\n\n\n\n\n.tpl-popover[_ngcontent-%COMP%] {\n inset: auto;\n width: 520px;\n max-width: calc(100vw - var(--%NS%sp-6));\n max-height: min(420px, calc(100vh - var(--%NS%sp-7)));\n margin: var(--%NS%sp-2) 0 0 0;\n position-area: block-end span-inline-start;\n position-anchor: --prism-toolrail;\n position-try-fallbacks: flip-block, flip-inline;\n overflow: hidden;\n background: var(--%NS%prism-bg-elevated);\n border: 1px solid var(--%NS%prism-border-strong);\n border-radius: var(--%NS%radius-lg, 10px);\n box-shadow:\n 0 20px 60px rgb(0 0 0 / 45%),\n 0 0 0 1px color-mix(in srgb, var(--%NS%prism-primary) 10%, transparent);\n animation: _ngcontent-%COMP%_tpl-fade-in var(--%NS%dur-fast, 0.15s) var(--%NS%ease-default, ease-out);\n}\n\n\n\n\n\n\n\n.tpl-popover[_ngcontent-%COMP%]:popover-open {\n display: flex;\n flex-direction: column;\n}\n\n@keyframes _ngcontent-%COMP%_tpl-fade-in {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.tpl-popover-head[_ngcontent-%COMP%] {\n display: flex;\n flex-shrink: 0;\n gap: 8px;\n align-items: center;\n height: 40px;\n padding: 0 12px 0 16px;\n background: linear-gradient(180deg, var(--%NS%prism-bg-surface), var(--%NS%prism-bg-elevated));\n border-bottom: 1px solid var(--%NS%prism-border);\n}\n\n.tpl-popover-head[_ngcontent-%COMP%] > prism-icon[_ngcontent-%COMP%] {\n color: var(--%NS%prism-text-muted);\n}\n\n.tpl-popover-head[_ngcontent-%COMP%] > span[_ngcontent-%COMP%] {\n flex: 1;\n font-size: var(--%NS%fs-xs);\n font-weight: 700;\n color: var(--%NS%prism-text-2);\n text-transform: uppercase;\n letter-spacing: 0.08em;\n}\n\n.tpl-popover-copy[_ngcontent-%COMP%] {\n display: flex;\n gap: 5px;\n align-items: center;\n height: 26px;\n padding: 0 10px;\n font-family: var(--%NS%font-sans);\n font-size: var(--%NS%fs-sm);\n font-weight: 500;\n color: var(--%NS%prism-primary);\n cursor: pointer;\n background: color-mix(in srgb, var(--%NS%prism-primary) 12%, transparent);\n border: 1px solid color-mix(in srgb, var(--%NS%prism-primary) 25%, transparent);\n border-radius: var(--%NS%radius-sm, 5px);\n transition: background var(--%NS%dur-fast);\n}\n\n.tpl-popover-copy[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--%NS%prism-primary) 20%, transparent);\n}\n\n.tpl-popover-close[_ngcontent-%COMP%] {\n display: grid;\n place-items: center;\n width: 26px;\n height: 26px;\n color: var(--%NS%prism-text-muted);\n cursor: pointer;\n background: transparent;\n border: 0;\n border-radius: var(--%NS%radius-sm, 5px);\n transition:\n background var(--%NS%dur-fast),\n color var(--%NS%dur-fast);\n}\n\n.tpl-popover-close[_ngcontent-%COMP%]:hover {\n color: var(--%NS%prism-text);\n background: var(--%NS%prism-input-bg);\n}\n\n.tpl-popover-body[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n padding: 14px 18px;\n margin: 0;\n overflow: auto;\n font-family: var(--%NS%font-mono);\n font-size: var(--%NS%fs-md);\n line-height: 1.7;\n color: var(--%NS%prism-text-2);\n white-space: pre;\n background: var(--%NS%prism-bg);\n}\n\n.tpl-popover-body[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n}\n\n.tpl-popover-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--%NS%prism-border-strong);\n border-radius: 3px;\n}\n\n[_nghost-%COMP%] .tok-tag {\n color: var(--%NS%prism-code-tag);\n}\n\n[_nghost-%COMP%] .tok-attr {\n color: var(--%NS%prism-code-attr);\n}\n\n[_nghost-%COMP%] .tok-str {\n color: var(--%NS%prism-code-str);\n}\n\n[_nghost-%COMP%] .tok-com {\n font-style: italic;\n color: var(--%NS%prism-code-com);\n}"] });
107
103
  }
108
104
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PrismTemplatePopoverComponent, [{
109
105
  type: Component,
110
- args: [{ selector: 'prism-template-popover', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [PrismIconComponent], template: `
111
- <!-- A native popover: the platform owns open, light-dismiss and Escape, so
112
- there is no visibility signal, no document click listener and no key
113
- handler here. The id is what the rail's button names in its
114
- popovertarget. -->
115
- <div
116
- popover
117
- id="prism-template"
118
- class="tpl-popover"
119
- role="dialog"
120
- aria-label="Angular template"
121
- >
122
- <div class="tpl-popover-head">
123
- <prism-icon name="code" [size]="13" />
124
- <span>Angular Template</span>
125
- <button
126
- type="button"
127
- class="tpl-popover-copy"
128
- (click)="copy()"
129
- [title]="copied() ? 'Copied!' : 'Copy to clipboard'"
130
- >
131
- <prism-icon [name]="copied() ? 'shield-check' : 'copy'" [size]="12" />
132
- {{ copied() ? 'Copied' : 'Copy' }}
133
- </button>
134
- <button
135
- type="button"
136
- class="tpl-popover-close"
137
- popovertarget="prism-template"
138
- popovertargetaction="hide"
139
- aria-label="Close"
140
- title="Close (Esc)"
141
- >
142
- <prism-icon name="x" [size]="13" />
143
- </button>
144
- </div>
145
- <pre class="tpl-popover-body" [innerHTML]="highlighted()"></pre>
146
- </div>
147
- `, styles: ["\n :host { display: contents; }\n\n /* No position of its own: a popover is in the top layer, where the\n containing block is the viewport, so the old right/top pair against the\n canvas would have parked this in the corner of the *window* and over the\n header. It hangs off the rail instead, the same way the head popovers\n hang off their triggers. Viewport units, not percentages \u2014 a percentage\n here resolves against the position area, not the canvas. */\n .tpl-popover {\n width: 520px;\n max-width: calc(100vw - var(--sp-6));\n max-height: min(420px, calc(100vh - var(--sp-7)));\n position-anchor: --prism-toolrail;\n position-area: block-end span-inline-start;\n position-try-fallbacks: flip-block, flip-inline;\n inset: auto;\n margin: var(--sp-2) 0 0 0;\n background: var(--prism-bg-elevated);\n border: 1px solid var(--prism-border-strong);\n border-radius: var(--radius-lg, 10px);\n box-shadow:\n 0 20px 60px rgba(0, 0, 0, 0.45),\n 0 0 0 1px color-mix(in srgb, var(--prism-primary) 10%, transparent);\n overflow: hidden;\n animation: tpl-fade-in var(--dur-fast, 0.15s) var(--ease-default, ease-out);\n }\n\n /* display belongs on :popover-open and nowhere else. The UA stylesheet\n hides a closed popover with [popover]:not(:popover-open) { display: none },\n and any author display on the base rule outranks it \u2014 the panel then\n shows permanently and neither Escape nor light-dismiss can hide it,\n because closing only drops :popover-open and leaves the author rule\n standing. */\n .tpl-popover:popover-open {\n display: flex;\n flex-direction: column;\n }\n\n @keyframes tpl-fade-in {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .tpl-popover-head {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0 12px 0 16px;\n height: 40px;\n border-bottom: 1px solid var(--prism-border);\n background: linear-gradient(\n 180deg,\n var(--prism-bg-surface),\n var(--prism-bg-elevated)\n );\n flex-shrink: 0;\n }\n .tpl-popover-head > prism-icon {\n color: var(--prism-text-muted);\n }\n .tpl-popover-head > span {\n flex: 1;\n font-size: var(--fs-xs);\n font-weight: 700;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--prism-text-2);\n }\n\n .tpl-popover-copy {\n height: 26px;\n padding: 0 10px;\n font-size: var(--fs-sm);\n font-family: var(--font-sans);\n font-weight: 500;\n color: var(--prism-primary);\n background: color-mix(in srgb, var(--prism-primary) 12%, transparent);\n border: 1px solid color-mix(in srgb, var(--prism-primary) 25%, transparent);\n border-radius: var(--radius-sm, 5px);\n display: flex;\n align-items: center;\n gap: 5px;\n cursor: pointer;\n transition: background var(--dur-fast);\n }\n .tpl-popover-copy:hover {\n background: color-mix(in srgb, var(--prism-primary) 20%, transparent);\n }\n\n .tpl-popover-close {\n width: 26px;\n height: 26px;\n display: grid;\n place-items: center;\n border-radius: var(--radius-sm, 5px);\n color: var(--prism-text-muted);\n background: transparent;\n border: 0;\n cursor: pointer;\n transition: background var(--dur-fast), color var(--dur-fast);\n }\n .tpl-popover-close:hover {\n color: var(--prism-text);\n background: var(--prism-input-bg);\n }\n\n .tpl-popover-body {\n margin: 0;\n padding: 14px 18px;\n font-family: var(--font-mono);\n font-size: var(--fs-md);\n line-height: 1.7;\n color: var(--prism-text-2);\n overflow: auto;\n background: var(--prism-bg);\n flex: 1;\n min-height: 0;\n white-space: pre;\n }\n .tpl-popover-body::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n }\n .tpl-popover-body::-webkit-scrollbar-thumb {\n background: var(--prism-border-strong);\n border-radius: 3px;\n }\n\n :host ::ng-deep .tok-tag { color: var(--prism-code-tag); }\n :host ::ng-deep .tok-attr { color: var(--prism-code-attr); }\n :host ::ng-deep .tok-str { color: var(--prism-code-str); }\n :host ::ng-deep .tok-com { color: var(--prism-code-com); font-style: italic; }\n "] }]
106
+ args: [{ selector: 'prism-template-popover', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [PrismIconComponent], template: "<!-- A native popover: the platform owns open, light-dismiss and Escape, so\n there is no visibility signal, no document click listener and no key\n handler here. The id is what the rail's button names in its\n popovertarget. -->\n<div\n popover\n id=\"prism-template\"\n class=\"tpl-popover\"\n role=\"dialog\"\n aria-label=\"Angular template\">\n <div class=\"tpl-popover-head\">\n <prism-icon\n name=\"code\"\n [size]=\"13\" />\n <span>Angular Template</span>\n <button\n type=\"button\"\n class=\"tpl-popover-copy\"\n (click)=\"copy()\"\n [title]=\"copied() ? 'Copied!' : 'Copy to clipboard'\">\n <prism-icon\n [name]=\"copied() ? 'shield-check' : 'copy'\"\n [size]=\"12\" />\n {{ copied() ? 'Copied' : 'Copy' }}\n </button>\n <button\n type=\"button\"\n class=\"tpl-popover-close\"\n popovertarget=\"prism-template\"\n popovertargetaction=\"hide\"\n aria-label=\"Close\"\n title=\"Close (Esc)\">\n <prism-icon\n name=\"x\"\n [size]=\"13\" />\n </button>\n </div>\n <pre\n class=\"tpl-popover-body\"\n [innerHTML]=\"highlighted()\"></pre>\n</div>\n", styles: [":host {\n display: contents;\n}\n\n/* No position of its own: a popover is in the top layer, where the\n containing block is the viewport, so the old right/top pair against the\n canvas would have parked this in the corner of the *window* and over the\n header. It hangs off the rail instead, the same way the head popovers\n hang off their triggers. Viewport units, not percentages, because a\n percentage here resolves against the position area, not the canvas. */\n.tpl-popover {\n inset: auto;\n width: 520px;\n max-width: calc(100vw - var(--sp-6));\n max-height: min(420px, calc(100vh - var(--sp-7)));\n margin: var(--sp-2) 0 0 0;\n position-area: block-end span-inline-start;\n position-anchor: --prism-toolrail;\n position-try-fallbacks: flip-block, flip-inline;\n overflow: hidden;\n background: var(--prism-bg-elevated);\n border: 1px solid var(--prism-border-strong);\n border-radius: var(--radius-lg, 10px);\n box-shadow:\n 0 20px 60px rgb(0 0 0 / 45%),\n 0 0 0 1px color-mix(in srgb, var(--prism-primary) 10%, transparent);\n animation: tpl-fade-in var(--dur-fast, 0.15s) var(--ease-default, ease-out);\n}\n\n/* display belongs on :popover-open and nowhere else. The UA stylesheet\n hides a closed popover with [popover]:not(:popover-open) { display: none },\n and any author display on the base rule outranks it. The panel then\n shows permanently and neither Escape nor light-dismiss can hide it,\n because closing only drops :popover-open and leaves the author rule\n standing. */\n.tpl-popover:popover-open {\n display: flex;\n flex-direction: column;\n}\n\n@keyframes tpl-fade-in {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.tpl-popover-head {\n display: flex;\n flex-shrink: 0;\n gap: 8px;\n align-items: center;\n height: 40px;\n padding: 0 12px 0 16px;\n background: linear-gradient(180deg, var(--prism-bg-surface), var(--prism-bg-elevated));\n border-bottom: 1px solid var(--prism-border);\n}\n\n.tpl-popover-head > prism-icon {\n color: var(--prism-text-muted);\n}\n\n.tpl-popover-head > span {\n flex: 1;\n font-size: var(--fs-xs);\n font-weight: 700;\n color: var(--prism-text-2);\n text-transform: uppercase;\n letter-spacing: 0.08em;\n}\n\n.tpl-popover-copy {\n display: flex;\n gap: 5px;\n align-items: center;\n height: 26px;\n padding: 0 10px;\n font-family: var(--font-sans);\n font-size: var(--fs-sm);\n font-weight: 500;\n color: var(--prism-primary);\n cursor: pointer;\n background: color-mix(in srgb, var(--prism-primary) 12%, transparent);\n border: 1px solid color-mix(in srgb, var(--prism-primary) 25%, transparent);\n border-radius: var(--radius-sm, 5px);\n transition: background var(--dur-fast);\n}\n\n.tpl-popover-copy:hover {\n background: color-mix(in srgb, var(--prism-primary) 20%, transparent);\n}\n\n.tpl-popover-close {\n display: grid;\n place-items: center;\n width: 26px;\n height: 26px;\n color: var(--prism-text-muted);\n cursor: pointer;\n background: transparent;\n border: 0;\n border-radius: var(--radius-sm, 5px);\n transition:\n background var(--dur-fast),\n color var(--dur-fast);\n}\n\n.tpl-popover-close:hover {\n color: var(--prism-text);\n background: var(--prism-input-bg);\n}\n\n.tpl-popover-body {\n flex: 1;\n min-height: 0;\n padding: 14px 18px;\n margin: 0;\n overflow: auto;\n font-family: var(--font-mono);\n font-size: var(--fs-md);\n line-height: 1.7;\n color: var(--prism-text-2);\n white-space: pre;\n background: var(--prism-bg);\n}\n\n.tpl-popover-body::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n}\n\n.tpl-popover-body::-webkit-scrollbar-thumb {\n background: var(--prism-border-strong);\n border-radius: 3px;\n}\n\n:host ::ng-deep .tok-tag {\n color: var(--prism-code-tag);\n}\n\n:host ::ng-deep .tok-attr {\n color: var(--prism-code-attr);\n}\n\n:host ::ng-deep .tok-str {\n color: var(--prism-code-str);\n}\n\n:host ::ng-deep .tok-com {\n font-style: italic;\n color: var(--prism-code-com);\n}\n"] }]
148
107
  }], null, null); })();
149
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismTemplatePopoverComponent, { className: "PrismTemplatePopoverComponent", filePath: "app/canvas/prism-template-popover.component.ts", lineNumber: 226 }); })();
108
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismTemplatePopoverComponent, { className: "PrismTemplatePopoverComponent", filePath: "app/canvas/prism-template-popover.component.ts", lineNumber: 44 }); })();
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `width`, pulled onto the nearest preset it comes within `tolerance` of.
3
+ *
4
+ * The tolerance is what makes a drag land on 390 instead of 388: without it,
5
+ * hitting a named width by hand is a game of pixels, and the presets in the
6
+ * menu would be the only way to reach them exactly. Outside the tolerance the
7
+ * width is returned untouched. Searching for a breakpoint between the presets
8
+ * is the other half of what this tool is for, and a grid that always snapped
9
+ * would make that impossible.
10
+ */
11
+ export declare function snapViewportWidth(width: number, snaps?: readonly number[], tolerance?: number): number;
12
+ //# sourceMappingURL=viewport-snap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewport-snap.d.ts","sourceRoot":"","sources":["../../../src/app/canvas/viewport-snap.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,SAAS,MAAM,EAAmB,EAAE,SAAS,GAAE,MAAgC,GAAG,MAAM,CAc/I"}
@@ -0,0 +1,23 @@
1
+ import { VIEWPORT_SNAP_TOLERANCE, VIEWPORT_SNAPS } from '../../shared/viewport.type.js';
2
+ /**
3
+ * `width`, pulled onto the nearest preset it comes within `tolerance` of.
4
+ *
5
+ * The tolerance is what makes a drag land on 390 instead of 388: without it,
6
+ * hitting a named width by hand is a game of pixels, and the presets in the
7
+ * menu would be the only way to reach them exactly. Outside the tolerance the
8
+ * width is returned untouched. Searching for a breakpoint between the presets
9
+ * is the other half of what this tool is for, and a grid that always snapped
10
+ * would make that impossible.
11
+ */
12
+ export function snapViewportWidth(width, snaps = VIEWPORT_SNAPS, tolerance = VIEWPORT_SNAP_TOLERANCE) {
13
+ let best = null;
14
+ let bestDistance = Infinity;
15
+ for (const snap of snaps) {
16
+ const distance = Math.abs(snap - width);
17
+ if (distance <= tolerance && distance < bestDistance) {
18
+ best = snap;
19
+ bestDistance = distance;
20
+ }
21
+ }
22
+ return best ?? width;
23
+ }