@ng-prism/core 21.0.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 (307) hide show
  1. package/README.md +170 -0
  2. package/builders.json +14 -0
  3. package/dist/app/component-header/prism-component-header.component.d.ts +8 -0
  4. package/dist/app/component-header/prism-component-header.component.d.ts.map +1 -0
  5. package/dist/app/component-header/prism-component-header.component.js +77 -0
  6. package/dist/app/controls/boolean-control.component.d.ts +10 -0
  7. package/dist/app/controls/boolean-control.component.d.ts.map +1 -0
  8. package/dist/app/controls/boolean-control.component.js +58 -0
  9. package/dist/app/controls/json-control.component.d.ts +19 -0
  10. package/dist/app/controls/json-control.component.d.ts.map +1 -0
  11. package/dist/app/controls/json-control.component.js +136 -0
  12. package/dist/app/controls/number-control.component.d.ts +10 -0
  13. package/dist/app/controls/number-control.component.d.ts.map +1 -0
  14. package/dist/app/controls/number-control.component.js +55 -0
  15. package/dist/app/controls/string-control.component.d.ts +10 -0
  16. package/dist/app/controls/string-control.component.d.ts.map +1 -0
  17. package/dist/app/controls/string-control.component.js +55 -0
  18. package/dist/app/controls/union-control.component.d.ts +11 -0
  19. package/dist/app/controls/union-control.component.d.ts.map +1 -0
  20. package/dist/app/controls/union-control.component.js +72 -0
  21. package/dist/app/header/prism-header.component.d.ts +10 -0
  22. package/dist/app/header/prism-header.component.d.ts.map +1 -0
  23. package/dist/app/header/prism-header.component.js +241 -0
  24. package/dist/app/hmr.d.ts +4 -0
  25. package/dist/app/hmr.d.ts.map +1 -0
  26. package/dist/app/hmr.js +5 -0
  27. package/dist/app/index.d.ts +18 -0
  28. package/dist/app/index.d.ts.map +1 -0
  29. package/dist/app/index.js +21 -0
  30. package/dist/app/layout-menu/prism-layout-menu.component.d.ts +10 -0
  31. package/dist/app/layout-menu/prism-layout-menu.component.d.ts.map +1 -0
  32. package/dist/app/layout-menu/prism-layout-menu.component.js +190 -0
  33. package/dist/app/page-renderer/prism-icon-page.component.d.ts +8 -0
  34. package/dist/app/page-renderer/prism-icon-page.component.d.ts.map +1 -0
  35. package/dist/app/page-renderer/prism-icon-page.component.js +42 -0
  36. package/dist/app/page-renderer/prism-page-renderer.component.d.ts +8 -0
  37. package/dist/app/page-renderer/prism-page-renderer.component.d.ts.map +1 -0
  38. package/dist/app/page-renderer/prism-page-renderer.component.js +72 -0
  39. package/dist/app/page-renderer/prism-token-page.component.d.ts +8 -0
  40. package/dist/app/page-renderer/prism-token-page.component.d.ts.map +1 -0
  41. package/dist/app/page-renderer/prism-token-page.component.js +164 -0
  42. package/dist/app/panels/a11y/a11y-audit.service.d.ts +17 -0
  43. package/dist/app/panels/a11y/a11y-audit.service.d.ts.map +1 -0
  44. package/dist/app/panels/a11y/a11y-audit.service.js +71 -0
  45. package/dist/app/panels/a11y/a11y-core.plugin.d.ts +3 -0
  46. package/dist/app/panels/a11y/a11y-core.plugin.d.ts.map +1 -0
  47. package/dist/app/panels/a11y/a11y-core.plugin.js +8 -0
  48. package/dist/app/panels/a11y/a11y-dom-utils.d.ts +11 -0
  49. package/dist/app/panels/a11y/a11y-dom-utils.d.ts.map +1 -0
  50. package/dist/app/panels/a11y/a11y-dom-utils.js +149 -0
  51. package/dist/app/panels/a11y/a11y-keyboard-overlay.component.d.ts +24 -0
  52. package/dist/app/panels/a11y/a11y-keyboard-overlay.component.d.ts.map +1 -0
  53. package/dist/app/panels/a11y/a11y-keyboard-overlay.component.js +104 -0
  54. package/dist/app/panels/a11y/a11y-keyboard.component.d.ts +12 -0
  55. package/dist/app/panels/a11y/a11y-keyboard.component.d.ts.map +1 -0
  56. package/dist/app/panels/a11y/a11y-keyboard.component.js +150 -0
  57. package/dist/app/panels/a11y/a11y-keyboard.service.d.ts +8 -0
  58. package/dist/app/panels/a11y/a11y-keyboard.service.d.ts.map +1 -0
  59. package/dist/app/panels/a11y/a11y-keyboard.service.js +71 -0
  60. package/dist/app/panels/a11y/a11y-overlay-host.component.d.ts +6 -0
  61. package/dist/app/panels/a11y/a11y-overlay-host.component.d.ts.map +1 -0
  62. package/dist/app/panels/a11y/a11y-overlay-host.component.js +18 -0
  63. package/dist/app/panels/a11y/a11y-panel-state.service.d.ts +8 -0
  64. package/dist/app/panels/a11y/a11y-panel-state.service.d.ts.map +1 -0
  65. package/dist/app/panels/a11y/a11y-panel-state.service.js +11 -0
  66. package/dist/app/panels/a11y/a11y-panel.component.d.ts +14 -0
  67. package/dist/app/panels/a11y/a11y-panel.component.d.ts.map +1 -0
  68. package/dist/app/panels/a11y/a11y-panel.component.js +183 -0
  69. package/dist/app/panels/a11y/a11y-perspective.service.d.ts +8 -0
  70. package/dist/app/panels/a11y/a11y-perspective.service.d.ts.map +1 -0
  71. package/dist/app/panels/a11y/a11y-perspective.service.js +11 -0
  72. package/dist/app/panels/a11y/a11y-score.component.d.ts +11 -0
  73. package/dist/app/panels/a11y/a11y-score.component.d.ts.map +1 -0
  74. package/dist/app/panels/a11y/a11y-score.component.js +72 -0
  75. package/dist/app/panels/a11y/a11y-sr-overlay.component.d.ts +27 -0
  76. package/dist/app/panels/a11y/a11y-sr-overlay.component.d.ts.map +1 -0
  77. package/dist/app/panels/a11y/a11y-sr-overlay.component.js +127 -0
  78. package/dist/app/panels/a11y/a11y-sr.component.d.ts +19 -0
  79. package/dist/app/panels/a11y/a11y-sr.component.d.ts.map +1 -0
  80. package/dist/app/panels/a11y/a11y-sr.component.js +257 -0
  81. package/dist/app/panels/a11y/a11y-sr.service.d.ts +8 -0
  82. package/dist/app/panels/a11y/a11y-sr.service.d.ts.map +1 -0
  83. package/dist/app/panels/a11y/a11y-sr.service.js +102 -0
  84. package/dist/app/panels/a11y/a11y-tree.component.d.ts +27 -0
  85. package/dist/app/panels/a11y/a11y-tree.component.d.ts.map +1 -0
  86. package/dist/app/panels/a11y/a11y-tree.component.js +229 -0
  87. package/dist/app/panels/a11y/a11y-tree.service.d.ts +8 -0
  88. package/dist/app/panels/a11y/a11y-tree.service.d.ts.map +1 -0
  89. package/dist/app/panels/a11y/a11y-tree.service.js +47 -0
  90. package/dist/app/panels/a11y/a11y-violations.component.d.ts +15 -0
  91. package/dist/app/panels/a11y/a11y-violations.component.d.ts.map +1 -0
  92. package/dist/app/panels/a11y/a11y-violations.component.js +457 -0
  93. package/dist/app/panels/a11y/a11y.types.d.ts +44 -0
  94. package/dist/app/panels/a11y/a11y.types.d.ts.map +1 -0
  95. package/dist/app/panels/a11y/a11y.types.js +1 -0
  96. package/dist/app/panels/builtin-panels.d.ts +3 -0
  97. package/dist/app/panels/builtin-panels.d.ts.map +1 -0
  98. package/dist/app/panels/builtin-panels.js +8 -0
  99. package/dist/app/panels/controls/controls-plugin.d.ts +3 -0
  100. package/dist/app/panels/controls/controls-plugin.d.ts.map +1 -0
  101. package/dist/app/panels/controls/controls-plugin.js +12 -0
  102. package/dist/app/panels/controls/prism-controls-panel.component.d.ts +13 -0
  103. package/dist/app/panels/controls/prism-controls-panel.component.d.ts.map +1 -0
  104. package/dist/app/panels/controls/prism-controls-panel.component.js +178 -0
  105. package/dist/app/panels/events/events-plugin.d.ts +3 -0
  106. package/dist/app/panels/events/events-plugin.d.ts.map +1 -0
  107. package/dist/app/panels/events/events-plugin.js +12 -0
  108. package/dist/app/panels/events/prism-events-panel.component.d.ts +9 -0
  109. package/dist/app/panels/events/prism-events-panel.component.d.ts.map +1 -0
  110. package/dist/app/panels/events/prism-events-panel.component.js +83 -0
  111. package/dist/app/panels/events/prism-json-node.component.d.ts +22 -0
  112. package/dist/app/panels/events/prism-json-node.component.d.ts.map +1 -0
  113. package/dist/app/panels/events/prism-json-node.component.js +350 -0
  114. package/dist/app/panels/events/prism-json-node.utils.d.ts +2 -0
  115. package/dist/app/panels/events/prism-json-node.utils.d.ts.map +1 -0
  116. package/dist/app/panels/events/prism-json-node.utils.js +40 -0
  117. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts +26 -0
  118. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts.map +1 -0
  119. package/dist/app/panels/panel-host/prism-panel-host.component.js +157 -0
  120. package/dist/app/provide-prism.d.ts +8 -0
  121. package/dist/app/provide-prism.d.ts.map +1 -0
  122. package/dist/app/provide-prism.js +21 -0
  123. package/dist/app/renderer/highlight-xml.d.ts +2 -0
  124. package/dist/app/renderer/highlight-xml.d.ts.map +1 -0
  125. package/dist/app/renderer/highlight-xml.js +27 -0
  126. package/dist/app/renderer/prism-renderer.component.d.ts +32 -0
  127. package/dist/app/renderer/prism-renderer.component.d.ts.map +1 -0
  128. package/dist/app/renderer/prism-renderer.component.js +346 -0
  129. package/dist/app/renderer/snippet-generator.d.ts +7 -0
  130. package/dist/app/renderer/snippet-generator.d.ts.map +1 -0
  131. package/dist/app/renderer/snippet-generator.js +162 -0
  132. package/dist/app/services/navigation-item.types.d.ts +10 -0
  133. package/dist/app/services/navigation-item.types.d.ts.map +1 -0
  134. package/dist/app/services/navigation-item.types.js +1 -0
  135. package/dist/app/services/prism-event-log.service.d.ts +16 -0
  136. package/dist/app/services/prism-event-log.service.d.ts.map +1 -0
  137. package/dist/app/services/prism-event-log.service.js +21 -0
  138. package/dist/app/services/prism-layout.service.d.ts +23 -0
  139. package/dist/app/services/prism-layout.service.d.ts.map +1 -0
  140. package/dist/app/services/prism-layout.service.js +85 -0
  141. package/dist/app/services/prism-manifest.service.d.ts +15 -0
  142. package/dist/app/services/prism-manifest.service.d.ts.map +1 -0
  143. package/dist/app/services/prism-manifest.service.js +53 -0
  144. package/dist/app/services/prism-navigation.service.d.ts +18 -0
  145. package/dist/app/services/prism-navigation.service.d.ts.map +1 -0
  146. package/dist/app/services/prism-navigation.service.js +94 -0
  147. package/dist/app/services/prism-panel.service.d.ts +8 -0
  148. package/dist/app/services/prism-panel.service.d.ts.map +1 -0
  149. package/dist/app/services/prism-panel.service.js +12 -0
  150. package/dist/app/services/prism-plugin.service.d.ts +12 -0
  151. package/dist/app/services/prism-plugin.service.d.ts.map +1 -0
  152. package/dist/app/services/prism-plugin.service.js +32 -0
  153. package/dist/app/services/prism-renderer.service.d.ts +18 -0
  154. package/dist/app/services/prism-renderer.service.d.ts.map +1 -0
  155. package/dist/app/services/prism-renderer.service.js +84 -0
  156. package/dist/app/services/prism-search.service.d.ts +13 -0
  157. package/dist/app/services/prism-search.service.d.ts.map +1 -0
  158. package/dist/app/services/prism-search.service.js +39 -0
  159. package/dist/app/services/prism-theme.service.d.ts +9 -0
  160. package/dist/app/services/prism-theme.service.d.ts.map +1 -0
  161. package/dist/app/services/prism-theme.service.js +23 -0
  162. package/dist/app/services/prism-url-state.service.d.ts +16 -0
  163. package/dist/app/services/prism-url-state.service.d.ts.map +1 -0
  164. package/dist/app/services/prism-url-state.service.js +108 -0
  165. package/dist/app/shell/prism-shell.component.d.ts +22 -0
  166. package/dist/app/shell/prism-shell.component.d.ts.map +1 -0
  167. package/dist/app/shell/prism-shell.component.js +283 -0
  168. package/dist/app/sidebar/prism-sidebar.component.d.ts +14 -0
  169. package/dist/app/sidebar/prism-sidebar.component.d.ts.map +1 -0
  170. package/dist/app/sidebar/prism-sidebar.component.js +105 -0
  171. package/dist/app/theme/prism-default-theme.d.ts +4 -0
  172. package/dist/app/theme/prism-default-theme.d.ts.map +1 -0
  173. package/dist/app/theme/prism-default-theme.js +57 -0
  174. package/dist/app/tokens/prism-tokens.d.ts +11 -0
  175. package/dist/app/tokens/prism-tokens.d.ts.map +1 -0
  176. package/dist/app/tokens/prism-tokens.js +7 -0
  177. package/dist/app/view-tab-bar/prism-view-panel-host.component.d.ts +22 -0
  178. package/dist/app/view-tab-bar/prism-view-panel-host.component.d.ts.map +1 -0
  179. package/dist/app/view-tab-bar/prism-view-panel-host.component.js +90 -0
  180. package/dist/app/view-tab-bar/prism-view-tab-bar.component.d.ts +10 -0
  181. package/dist/app/view-tab-bar/prism-view-tab-bar.component.d.ts.map +1 -0
  182. package/dist/app/view-tab-bar/prism-view-tab-bar.component.js +65 -0
  183. package/dist/builder/build/index.d.ts +6 -0
  184. package/dist/builder/build/index.d.ts.map +1 -0
  185. package/dist/builder/build/index.js +15 -0
  186. package/dist/builder/build/schema.d.ts +9 -0
  187. package/dist/builder/build/schema.d.ts.map +1 -0
  188. package/dist/builder/build/schema.js +1 -0
  189. package/dist/builder/config-loader/config-loader.d.ts +8 -0
  190. package/dist/builder/config-loader/config-loader.d.ts.map +1 -0
  191. package/dist/builder/config-loader/config-loader.js +33 -0
  192. package/dist/builder/config-loader/index.d.ts +3 -0
  193. package/dist/builder/config-loader/index.d.ts.map +1 -0
  194. package/dist/builder/config-loader/index.js +1 -0
  195. package/dist/builder/icon-resolver/icon-resolver.d.ts +7 -0
  196. package/dist/builder/icon-resolver/icon-resolver.d.ts.map +1 -0
  197. package/dist/builder/icon-resolver/icon-resolver.js +12 -0
  198. package/dist/builder/icon-resolver/index.d.ts +2 -0
  199. package/dist/builder/icon-resolver/index.d.ts.map +1 -0
  200. package/dist/builder/icon-resolver/index.js +1 -0
  201. package/dist/builder/manifest/host-parser.d.ts +6 -0
  202. package/dist/builder/manifest/host-parser.d.ts.map +1 -0
  203. package/dist/builder/manifest/host-parser.js +9 -0
  204. package/dist/builder/manifest/index.d.ts +3 -0
  205. package/dist/builder/manifest/index.d.ts.map +1 -0
  206. package/dist/builder/manifest/index.js +1 -0
  207. package/dist/builder/manifest/runtime-manifest.generator.d.ts +9 -0
  208. package/dist/builder/manifest/runtime-manifest.generator.d.ts.map +1 -0
  209. package/dist/builder/manifest/runtime-manifest.generator.js +216 -0
  210. package/dist/builder/plugin-runner/index.d.ts +2 -0
  211. package/dist/builder/plugin-runner/index.d.ts.map +1 -0
  212. package/dist/builder/plugin-runner/index.js +1 -0
  213. package/dist/builder/plugin-runner/plugin-runner.d.ts +3 -0
  214. package/dist/builder/plugin-runner/plugin-runner.d.ts.map +1 -0
  215. package/dist/builder/plugin-runner/plugin-runner.js +38 -0
  216. package/dist/builder/scanner/ast-utils.d.ts +20 -0
  217. package/dist/builder/scanner/ast-utils.d.ts.map +1 -0
  218. package/dist/builder/scanner/ast-utils.js +100 -0
  219. package/dist/builder/scanner/component.scanner.d.ts +7 -0
  220. package/dist/builder/scanner/component.scanner.d.ts.map +1 -0
  221. package/dist/builder/scanner/component.scanner.js +113 -0
  222. package/dist/builder/scanner/entry-point-discovery.d.ts +6 -0
  223. package/dist/builder/scanner/entry-point-discovery.d.ts.map +1 -0
  224. package/dist/builder/scanner/entry-point-discovery.js +38 -0
  225. package/dist/builder/scanner/entry-point.scanner.d.ts +11 -0
  226. package/dist/builder/scanner/entry-point.scanner.d.ts.map +1 -0
  227. package/dist/builder/scanner/entry-point.scanner.js +19 -0
  228. package/dist/builder/scanner/index.d.ts +8 -0
  229. package/dist/builder/scanner/index.d.ts.map +1 -0
  230. package/dist/builder/scanner/index.js +6 -0
  231. package/dist/builder/scanner/input.extractor.d.ts +11 -0
  232. package/dist/builder/scanner/input.extractor.d.ts.map +1 -0
  233. package/dist/builder/scanner/input.extractor.js +169 -0
  234. package/dist/builder/scanner/manifest.generator.d.ts +6 -0
  235. package/dist/builder/scanner/manifest.generator.d.ts.map +1 -0
  236. package/dist/builder/scanner/manifest.generator.js +59 -0
  237. package/dist/builder/scanner/scanner.d.ts +16 -0
  238. package/dist/builder/scanner/scanner.d.ts.map +1 -0
  239. package/dist/builder/scanner/scanner.js +28 -0
  240. package/dist/builder/serve/index.d.ts +6 -0
  241. package/dist/builder/serve/index.d.ts.map +1 -0
  242. package/dist/builder/serve/index.js +48 -0
  243. package/dist/builder/serve/schema.d.ts +9 -0
  244. package/dist/builder/serve/schema.d.ts.map +1 -0
  245. package/dist/builder/serve/schema.js +1 -0
  246. package/dist/builder/shared/index.d.ts +3 -0
  247. package/dist/builder/shared/index.d.ts.map +1 -0
  248. package/dist/builder/shared/index.js +1 -0
  249. package/dist/builder/shared/prism-pipeline.d.ts +21 -0
  250. package/dist/builder/shared/prism-pipeline.d.ts.map +1 -0
  251. package/dist/builder/shared/prism-pipeline.js +95 -0
  252. package/dist/builder/token-scanner/index.d.ts +2 -0
  253. package/dist/builder/token-scanner/index.d.ts.map +1 -0
  254. package/dist/builder/token-scanner/index.js +1 -0
  255. package/dist/builder/token-scanner/token-scanner.d.ts +9 -0
  256. package/dist/builder/token-scanner/token-scanner.d.ts.map +1 -0
  257. package/dist/builder/token-scanner/token-scanner.js +95 -0
  258. package/dist/builder/watcher/index.d.ts +3 -0
  259. package/dist/builder/watcher/index.d.ts.map +1 -0
  260. package/dist/builder/watcher/index.js +1 -0
  261. package/dist/builder/watcher/prism-watcher.d.ts +29 -0
  262. package/dist/builder/watcher/prism-watcher.d.ts.map +1 -0
  263. package/dist/builder/watcher/prism-watcher.js +79 -0
  264. package/dist/config/index.d.ts +6 -0
  265. package/dist/config/index.d.ts.map +1 -0
  266. package/dist/config/index.js +2 -0
  267. package/dist/decorator/index.d.ts +3 -0
  268. package/dist/decorator/index.d.ts.map +1 -0
  269. package/dist/decorator/index.js +1 -0
  270. package/dist/decorator/showcase.decorator.d.ts +5 -0
  271. package/dist/decorator/showcase.decorator.d.ts.map +1 -0
  272. package/dist/decorator/showcase.decorator.js +7 -0
  273. package/dist/decorator/showcase.types.d.ts +54 -0
  274. package/dist/decorator/showcase.types.d.ts.map +1 -0
  275. package/dist/decorator/showcase.types.js +1 -0
  276. package/dist/index.d.ts +4 -0
  277. package/dist/index.d.ts.map +1 -0
  278. package/dist/index.js +6 -0
  279. package/dist/plugin/define-config.d.ts +4 -0
  280. package/dist/plugin/define-config.d.ts.map +1 -0
  281. package/dist/plugin/define-config.js +4 -0
  282. package/dist/plugin/index.d.ts +8 -0
  283. package/dist/plugin/index.d.ts.map +1 -0
  284. package/dist/plugin/index.js +3 -0
  285. package/dist/plugin/page-helpers.d.ts +19 -0
  286. package/dist/plugin/page-helpers.d.ts.map +1 -0
  287. package/dist/plugin/page-helpers.js +20 -0
  288. package/dist/plugin/page.types.d.ts +19 -0
  289. package/dist/plugin/page.types.d.ts.map +1 -0
  290. package/dist/plugin/page.types.js +1 -0
  291. package/dist/plugin/plugin.types.d.ts +98 -0
  292. package/dist/plugin/plugin.types.d.ts.map +1 -0
  293. package/dist/plugin/plugin.types.js +1 -0
  294. package/dist/schematics/ng-add/index.d.ts +4 -0
  295. package/dist/schematics/ng-add/index.d.ts.map +1 -0
  296. package/dist/schematics/ng-add/index.js +179 -0
  297. package/dist/schematics/ng-add/schema.d.ts +5 -0
  298. package/dist/schematics/ng-add/schema.d.ts.map +1 -0
  299. package/dist/schematics/ng-add/schema.js +1 -0
  300. package/dist/test-setup-browser.d.ts +2 -0
  301. package/dist/test-setup-browser.d.ts.map +1 -0
  302. package/dist/test-setup-browser.js +4 -0
  303. package/package.json +73 -0
  304. package/schematics/collection.json +10 -0
  305. package/schematics/ng-add/schema.json +20 -0
  306. package/src/builder/build/schema.json +35 -0
  307. package/src/builder/serve/schema.json +36 -0
package/README.md ADDED
@@ -0,0 +1,170 @@
1
+ # ng-prism
2
+
3
+ Lightweight, Angular-native component showcase tool. Annotate components with `@Showcase` — no separate story files needed.
4
+
5
+ [![Angular](https://img.shields.io/badge/Angular-21+-dd0031)](https://angular.dev)
6
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.9-3178c6)](https://www.typescriptlang.org)
7
+ [![License](https://img.shields.io/badge/license-MIT-green)](./LICENSE)
8
+
9
+ ## Features
10
+
11
+ - **Zero-config discovery** — TypeScript Compiler API scans your library at build time
12
+ - **Signal-native** — works with `input()` / `output()` signals
13
+ - **Directive support** — showcase directives with configurable host elements
14
+ - **Plugin architecture** — JSDoc, A11y, Figma, Performance, Box Model plugins
15
+ - **Live Controls** — auto-generated input controls with type-aware editors
16
+ - **Code Snippets** — live-updating Angular template snippets per variant
17
+ - **Component Pages** — free-form demo pages for complex components
18
+ - **Deep-linking** — URL state sync for sharing specific component/variant/view
19
+ - **Themeable** — full CSS custom property system, replaceable UI sections
20
+
21
+ ## Quick Start
22
+
23
+ ### 1. Install
24
+
25
+ ```bash
26
+ npm install ng-prism
27
+ ```
28
+
29
+ ### 2. Add `@Showcase` to a component
30
+
31
+ ```typescript
32
+ import { Component, input, output } from '@angular/core';
33
+ import { Showcase } from 'ng-prism';
34
+
35
+ @Showcase({
36
+ title: 'Button',
37
+ category: 'Atoms',
38
+ description: 'Primary action button',
39
+ variants: [
40
+ { name: 'Primary', inputs: { variant: 'primary', label: 'Click me' } },
41
+ { name: 'Danger', inputs: { variant: 'danger', disabled: true } },
42
+ ],
43
+ })
44
+ @Component({
45
+ selector: 'my-button',
46
+ standalone: true,
47
+ template: `<button [class]="variant()">{{ label() }}</button>`,
48
+ })
49
+ export class ButtonComponent {
50
+ variant = input<'primary' | 'secondary' | 'danger'>('primary');
51
+ label = input('Button');
52
+ disabled = input(false);
53
+ clicked = output<void>();
54
+ }
55
+ ```
56
+
57
+ ### 3. Run the schematic
58
+
59
+ ```bash
60
+ ng add ng-prism
61
+ ```
62
+
63
+ This creates the prism app project, configures Angular builders, and generates `ng-prism.config.ts`.
64
+
65
+ ### 4. Start the dev server
66
+
67
+ ```bash
68
+ ng run my-lib:prism
69
+ ```
70
+
71
+ Open `http://localhost:4400` — your component appears in the sidebar with live controls, code snippets, and variant tabs.
72
+
73
+ ## Configuration
74
+
75
+ ```typescript
76
+ // ng-prism.config.ts
77
+ import { defineConfig } from 'ng-prism/config';
78
+ import { jsDocPlugin } from '@ng-prism/plugin-jsdoc';
79
+
80
+ export default defineConfig({
81
+ plugins: [jsDocPlugin()],
82
+
83
+ theme: {
84
+ '--prism-primary': '#00a67e',
85
+ '--prism-bg': '#ffffff',
86
+ '--prism-font-sans': "'Inter', sans-serif",
87
+ },
88
+
89
+ ui: {
90
+ header: MyCustomHeaderComponent,
91
+ },
92
+
93
+ appProviders: [
94
+ provideAnimationsAsync(),
95
+ provideHttpClient(),
96
+ ],
97
+ });
98
+ ```
99
+
100
+ ## Directives
101
+
102
+ Directives need a host element. Use `host` to wrap them:
103
+
104
+ ```typescript
105
+ @Showcase({
106
+ title: 'Tooltip',
107
+ host: {
108
+ selector: 'my-button',
109
+ import: { name: 'ButtonComponent', from: 'my-lib' },
110
+ inputs: { label: 'Hover me' },
111
+ },
112
+ variants: [
113
+ { name: 'Top', inputs: { position: 'top', text: 'Tooltip!' } },
114
+ ],
115
+ })
116
+ @Directive({ selector: '[myTooltip]' })
117
+ export class TooltipDirective { ... }
118
+ ```
119
+
120
+ ## Component Pages
121
+
122
+ For complex components that need template projections or mock data:
123
+
124
+ ```typescript
125
+ // Register in main.ts
126
+ providePrism(PRISM_RUNTIME_MANIFEST, config, {
127
+ componentPages: [
128
+ { title: 'Table Demo', category: 'Data', component: TableDemoPage },
129
+ ],
130
+ });
131
+ ```
132
+
133
+ Link to a `@Showcase`-decorated component for combined API docs + custom rendering:
134
+
135
+ ```typescript
136
+ @Showcase({
137
+ title: 'Table',
138
+ renderPage: 'Table Demo', // delegates rendering to the page
139
+ variants: [{ name: 'Default', inputs: { height: '400px' } }],
140
+ })
141
+ @Component({ selector: 'my-table' })
142
+ export class TableComponent { ... }
143
+ ```
144
+
145
+ ## Official Plugins
146
+
147
+ | Plugin | Package | Description |
148
+ |---|---|---|
149
+ | JSDoc | `@ng-prism/plugin-jsdoc` | API documentation from JSDoc comments |
150
+ | Figma | `@ng-prism/plugin-figma` | Figma design embed + visual diff |
151
+ | Box Model | `@ng-prism/plugin-box-model` | CSS box model inspector |
152
+ | Perf | `@ng-prism/plugin-perf` | Render performance profiling |
153
+
154
+ > **Note:** Accessibility auditing (axe-core) is built into ng-prism core — no plugin needed.
155
+
156
+ ## Documentation
157
+
158
+ Full documentation with API reference, plugin guide, and advanced configuration:
159
+
160
+ **[ng-prism Documentation](https://your-org.github.io/ng-prism/)**
161
+
162
+ ## Requirements
163
+
164
+ - Angular >= 21
165
+ - TypeScript >= 5.9
166
+ - Components must use `input()` / `output()` signals (not `@Input()` / `@Output()` decorators)
167
+
168
+ ## License
169
+
170
+ MIT
package/builders.json ADDED
@@ -0,0 +1,14 @@
1
+ {
2
+ "builders": {
3
+ "serve": {
4
+ "implementation": "./dist/builder/serve/index.js",
5
+ "schema": "./src/builder/serve/schema.json",
6
+ "description": "Start the ng-prism development server"
7
+ },
8
+ "build": {
9
+ "implementation": "./dist/builder/build/index.js",
10
+ "schema": "./src/builder/build/schema.json",
11
+ "description": "Build the ng-prism styleguide for production"
12
+ }
13
+ }
14
+ }
@@ -0,0 +1,8 @@
1
+ import { PrismNavigationService } from '../services/prism-navigation.service.js';
2
+ import * as i0 from "@angular/core";
3
+ export declare class PrismComponentHeaderComponent {
4
+ protected readonly navigationService: PrismNavigationService;
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<PrismComponentHeaderComponent, never>;
6
+ static ɵcmp: i0.ɵɵComponentDeclaration<PrismComponentHeaderComponent, "prism-component-header", never, {}, {}, never, never, true, never>;
7
+ }
8
+ //# sourceMappingURL=prism-component-header.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prism-component-header.component.d.ts","sourceRoot":"","sources":["../../../src/app/component-header/prism-component-header.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;;AAEjF,qBAkEa,6BAA6B;IACxC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,yBAAkC;yCAD3D,6BAA6B;2CAA7B,6BAA6B;CAEzC"}
@@ -0,0 +1,77 @@
1
+ import { Component, inject } from '@angular/core';
2
+ import { PrismNavigationService } from '../services/prism-navigation.service.js';
3
+ import * as i0 from "@angular/core";
4
+ function PrismComponentHeaderComponent_Conditional_0_Conditional_3_Template(rf, ctx) { if (rf & 1) {
5
+ i0.ɵɵdomElementStart(0, "p", 2);
6
+ i0.ɵɵtext(1);
7
+ i0.ɵɵdomElementEnd();
8
+ } if (rf & 2) {
9
+ const comp_r1 = i0.ɵɵnextContext();
10
+ i0.ɵɵadvance();
11
+ i0.ɵɵtextInterpolate(comp_r1.meta.showcaseConfig.description);
12
+ } }
13
+ function PrismComponentHeaderComponent_Conditional_0_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
14
+ i0.ɵɵdomElementStart(0, "span", 4);
15
+ i0.ɵɵtext(1);
16
+ i0.ɵɵdomElementEnd();
17
+ } if (rf & 2) {
18
+ const tag_r2 = ctx.$implicit;
19
+ i0.ɵɵadvance();
20
+ i0.ɵɵtextInterpolate(tag_r2);
21
+ } }
22
+ function PrismComponentHeaderComponent_Conditional_0_Conditional_4_Template(rf, ctx) { if (rf & 1) {
23
+ i0.ɵɵdomElementStart(0, "div", 3);
24
+ i0.ɵɵrepeaterCreate(1, PrismComponentHeaderComponent_Conditional_0_Conditional_4_For_2_Template, 2, 1, "span", 4, i0.ɵɵrepeaterTrackByIdentity);
25
+ i0.ɵɵdomElementEnd();
26
+ } if (rf & 2) {
27
+ const comp_r1 = i0.ɵɵnextContext();
28
+ i0.ɵɵadvance();
29
+ i0.ɵɵrepeater(comp_r1.meta.showcaseConfig.tags);
30
+ } }
31
+ function PrismComponentHeaderComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
32
+ i0.ɵɵdomElementStart(0, "div", 0)(1, "h2", 1);
33
+ i0.ɵɵtext(2);
34
+ i0.ɵɵdomElementEnd();
35
+ i0.ɵɵconditionalCreate(3, PrismComponentHeaderComponent_Conditional_0_Conditional_3_Template, 2, 1, "p", 2);
36
+ i0.ɵɵconditionalCreate(4, PrismComponentHeaderComponent_Conditional_0_Conditional_4_Template, 3, 0, "div", 3);
37
+ i0.ɵɵdomElementEnd();
38
+ } if (rf & 2) {
39
+ const comp_r1 = ctx;
40
+ i0.ɵɵadvance(2);
41
+ i0.ɵɵtextInterpolate(comp_r1.meta.showcaseConfig.title);
42
+ i0.ɵɵadvance();
43
+ i0.ɵɵconditional(comp_r1.meta.showcaseConfig.description ? 3 : -1);
44
+ i0.ɵɵadvance();
45
+ i0.ɵɵconditional((comp_r1.meta.showcaseConfig.tags == null ? null : comp_r1.meta.showcaseConfig.tags.length) ? 4 : -1);
46
+ } }
47
+ export class PrismComponentHeaderComponent {
48
+ navigationService = inject(PrismNavigationService);
49
+ static ɵfac = function PrismComponentHeaderComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PrismComponentHeaderComponent)(); };
50
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PrismComponentHeaderComponent, selectors: [["prism-component-header"]], decls: 1, vars: 1, consts: [[1, "prism-component-header"], [1, "prism-component-header__title"], [1, "prism-component-header__description"], [1, "prism-component-header__tags"], [1, "prism-component-header__tag"]], template: function PrismComponentHeaderComponent_Template(rf, ctx) { if (rf & 1) {
51
+ i0.ɵɵconditionalCreate(0, PrismComponentHeaderComponent_Conditional_0_Template, 5, 3, "div", 0);
52
+ } if (rf & 2) {
53
+ let tmp_0_0;
54
+ i0.ɵɵconditional((tmp_0_0 = ctx.navigationService.activeComponent()) ? 0 : -1, tmp_0_0);
55
+ } }, styles: [".prism-component-header[_ngcontent-%COMP%] {\n padding: 16px 20px;\n border-bottom: 1px solid var(--prism-border);\n border-left: 3px solid;\n border-image: linear-gradient(180deg, var(--prism-primary-from), var(--prism-primary-to)) 1;\n background: var(--prism-bg-surface);\n }\n\n .prism-component-header__title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n letter-spacing: -0.01em;\n color: var(--prism-text);\n font-family: var(--prism-font-sans);\n }\n\n .prism-component-header__description[_ngcontent-%COMP%] {\n margin: 4px 0 0;\n font-size: 13px;\n line-height: 1.6;\n color: var(--prism-text-2);\n font-family: var(--prism-font-sans);\n }\n\n .prism-component-header__tags[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n margin-top: 10px;\n flex-wrap: wrap;\n }\n\n .prism-component-header__tag[_ngcontent-%COMP%] {\n padding: 2px 8px;\n font-size: 11px;\n font-weight: 500;\n border-radius: var(--prism-radius-xs);\n background: color-mix(in srgb, var(--prism-primary) 12%, transparent);\n color: var(--prism-primary);\n border: 1px solid color-mix(in srgb, var(--prism-primary) 20%, transparent);\n letter-spacing: 0.02em;\n font-family: var(--prism-font-sans);\n }"] });
56
+ }
57
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PrismComponentHeaderComponent, [{
58
+ type: Component,
59
+ args: [{ selector: 'prism-component-header', standalone: true, template: `
60
+ @if (navigationService.activeComponent(); as comp) {
61
+ <div class="prism-component-header">
62
+ <h2 class="prism-component-header__title">{{ comp.meta.showcaseConfig.title }}</h2>
63
+ @if (comp.meta.showcaseConfig.description) {
64
+ <p class="prism-component-header__description">{{ comp.meta.showcaseConfig.description }}</p>
65
+ }
66
+ @if (comp.meta.showcaseConfig.tags?.length) {
67
+ <div class="prism-component-header__tags">
68
+ @for (tag of comp.meta.showcaseConfig.tags; track tag) {
69
+ <span class="prism-component-header__tag">{{ tag }}</span>
70
+ }
71
+ </div>
72
+ }
73
+ </div>
74
+ }
75
+ `, styles: ["\n .prism-component-header {\n padding: 16px 20px;\n border-bottom: 1px solid var(--prism-border);\n border-left: 3px solid;\n border-image: linear-gradient(180deg, var(--prism-primary-from), var(--prism-primary-to)) 1;\n background: var(--prism-bg-surface);\n }\n\n .prism-component-header__title {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n letter-spacing: -0.01em;\n color: var(--prism-text);\n font-family: var(--prism-font-sans);\n }\n\n .prism-component-header__description {\n margin: 4px 0 0;\n font-size: 13px;\n line-height: 1.6;\n color: var(--prism-text-2);\n font-family: var(--prism-font-sans);\n }\n\n .prism-component-header__tags {\n display: flex;\n gap: 6px;\n margin-top: 10px;\n flex-wrap: wrap;\n }\n\n .prism-component-header__tag {\n padding: 2px 8px;\n font-size: 11px;\n font-weight: 500;\n border-radius: var(--prism-radius-xs);\n background: color-mix(in srgb, var(--prism-primary) 12%, transparent);\n color: var(--prism-primary);\n border: 1px solid color-mix(in srgb, var(--prism-primary) 20%, transparent);\n letter-spacing: 0.02em;\n font-family: var(--prism-font-sans);\n }\n "] }]
76
+ }], null, null); })();
77
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismComponentHeaderComponent, { className: "PrismComponentHeaderComponent", filePath: "app/component-header/prism-component-header.component.ts", lineNumber: 70 }); })();
@@ -0,0 +1,10 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class BooleanControlComponent {
3
+ readonly value: import("@angular/core").InputSignal<boolean>;
4
+ readonly label: import("@angular/core").InputSignal<string>;
5
+ readonly typeName: import("@angular/core").InputSignal<string>;
6
+ readonly valueChange: import("@angular/core").OutputEmitterRef<boolean>;
7
+ static ɵfac: i0.ɵɵFactoryDeclaration<BooleanControlComponent, never>;
8
+ static ɵcmp: i0.ɵɵComponentDeclaration<BooleanControlComponent, "prism-boolean-control", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "typeName": { "alias": "typeName"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
9
+ }
10
+ //# sourceMappingURL=boolean-control.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boolean-control.component.d.ts","sourceRoot":"","sources":["../../../src/app/controls/boolean-control.component.ts"],"names":[],"mappings":";AAEA,qBAiFa,uBAAuB;IAClC,QAAQ,CAAC,KAAK,+CAAgB;IAC9B,QAAQ,CAAC,KAAK,8CAAa;IAC3B,QAAQ,CAAC,QAAQ,8CAAa;IAC9B,QAAQ,CAAC,WAAW,oDAAqB;yCAJ9B,uBAAuB;2CAAvB,uBAAuB;CAKnC"}
@@ -0,0 +1,58 @@
1
+ import { Component, input, output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ function BooleanControlComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
4
+ i0.ɵɵdomElementStart(0, "code", 3);
5
+ i0.ɵɵtext(1);
6
+ i0.ɵɵdomElementEnd();
7
+ } if (rf & 2) {
8
+ const ctx_r0 = i0.ɵɵnextContext();
9
+ i0.ɵɵadvance();
10
+ i0.ɵɵtextInterpolate(ctx_r0.typeName());
11
+ } }
12
+ export class BooleanControlComponent {
13
+ value = input(false, ...(ngDevMode ? [{ debugName: "value" }] : []));
14
+ label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
15
+ typeName = input('', ...(ngDevMode ? [{ debugName: "typeName" }] : []));
16
+ valueChange = output();
17
+ static ɵfac = function BooleanControlComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || BooleanControlComponent)(); };
18
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: BooleanControlComponent, selectors: [["prism-boolean-control"]], inputs: { value: [1, "value"], label: [1, "label"], typeName: [1, "typeName"] }, outputs: { valueChange: "valueChange" }, decls: 7, vars: 5, consts: [[1, "prism-boolean-control"], [1, "prism-boolean-control__label"], [1, "prism-boolean-control__label-text"], [1, "prism-boolean-control__type"], ["role", "switch", 1, "prism-boolean-control__toggle", 3, "click"], [1, "prism-boolean-control__thumb"]], template: function BooleanControlComponent_Template(rf, ctx) { if (rf & 1) {
19
+ i0.ɵɵdomElementStart(0, "div", 0)(1, "div", 1)(2, "span", 2);
20
+ i0.ɵɵtext(3);
21
+ i0.ɵɵdomElementEnd();
22
+ i0.ɵɵconditionalCreate(4, BooleanControlComponent_Conditional_4_Template, 2, 1, "code", 3);
23
+ i0.ɵɵdomElementEnd();
24
+ i0.ɵɵdomElementStart(5, "button", 4);
25
+ i0.ɵɵdomListener("click", function BooleanControlComponent_Template_button_click_5_listener() { return ctx.valueChange.emit(!ctx.value()); });
26
+ i0.ɵɵdomElement(6, "span", 5);
27
+ i0.ɵɵdomElementEnd()();
28
+ } if (rf & 2) {
29
+ i0.ɵɵadvance(3);
30
+ i0.ɵɵtextInterpolate(ctx.label());
31
+ i0.ɵɵadvance();
32
+ i0.ɵɵconditional(ctx.typeName() ? 4 : -1);
33
+ i0.ɵɵadvance();
34
+ i0.ɵɵclassProp("prism-boolean-control__toggle--on", ctx.value());
35
+ i0.ɵɵattribute("aria-checked", ctx.value());
36
+ } }, styles: [".prism-boolean-control[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 16px;\n min-height: 36px;\n }\n\n .prism-boolean-control__label[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 1px;\n }\n .prism-boolean-control__label-text[_ngcontent-%COMP%] {\n font-size: 13px;\n font-family: var(--prism-font-sans);\n color: var(--prism-text-muted);\n font-weight: 500;\n }\n .prism-boolean-control__type[_ngcontent-%COMP%] {\n font-size: 10px;\n font-family: var(--prism-font-mono, monospace);\n color: var(--prism-text-ghost);\n }\n\n .prism-boolean-control__toggle[_ngcontent-%COMP%] {\n position: relative;\n width: 36px;\n height: 20px;\n border-radius: 10px;\n border: 1px solid var(--prism-border-strong);\n background: var(--prism-bg-surface);\n cursor: pointer;\n transition: background 0.2s, border-color 0.2s;\n padding: 0;\n flex-shrink: 0;\n }\n\n .prism-boolean-control__toggle--on[_ngcontent-%COMP%] {\n background: var(--prism-primary);\n border-color: var(--prism-primary);\n }\n\n .prism-boolean-control__thumb[_ngcontent-%COMP%] {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n background: var(--prism-text-ghost);\n transition: transform 0.2s, background 0.2s;\n }\n\n .prism-boolean-control__toggle--on[_ngcontent-%COMP%] .prism-boolean-control__thumb[_ngcontent-%COMP%] {\n transform: translateX(16px);\n background: var(--prism-bg-elevated);\n }"] });
37
+ }
38
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BooleanControlComponent, [{
39
+ type: Component,
40
+ args: [{ selector: 'prism-boolean-control', standalone: true, template: `
41
+ <div class="prism-boolean-control">
42
+ <div class="prism-boolean-control__label">
43
+ <span class="prism-boolean-control__label-text">{{ label() }}</span>
44
+ @if (typeName()) { <code class="prism-boolean-control__type">{{ typeName() }}</code> }
45
+ </div>
46
+ <button
47
+ class="prism-boolean-control__toggle"
48
+ [class.prism-boolean-control__toggle--on]="value()"
49
+ (click)="valueChange.emit(!value())"
50
+ role="switch"
51
+ [attr.aria-checked]="value()"
52
+ >
53
+ <span class="prism-boolean-control__thumb"></span>
54
+ </button>
55
+ </div>
56
+ `, styles: ["\n .prism-boolean-control {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 16px;\n min-height: 36px;\n }\n\n .prism-boolean-control__label {\n display: flex;\n flex-direction: column;\n gap: 1px;\n }\n .prism-boolean-control__label-text {\n font-size: 13px;\n font-family: var(--prism-font-sans);\n color: var(--prism-text-muted);\n font-weight: 500;\n }\n .prism-boolean-control__type {\n font-size: 10px;\n font-family: var(--prism-font-mono, monospace);\n color: var(--prism-text-ghost);\n }\n\n .prism-boolean-control__toggle {\n position: relative;\n width: 36px;\n height: 20px;\n border-radius: 10px;\n border: 1px solid var(--prism-border-strong);\n background: var(--prism-bg-surface);\n cursor: pointer;\n transition: background 0.2s, border-color 0.2s;\n padding: 0;\n flex-shrink: 0;\n }\n\n .prism-boolean-control__toggle--on {\n background: var(--prism-primary);\n border-color: var(--prism-primary);\n }\n\n .prism-boolean-control__thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n background: var(--prism-text-ghost);\n transition: transform 0.2s, background 0.2s;\n }\n\n .prism-boolean-control__toggle--on .prism-boolean-control__thumb {\n transform: translateX(16px);\n background: var(--prism-bg-elevated);\n }\n "] }]
57
+ }], null, { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], typeName: [{ type: i0.Input, args: [{ isSignal: true, alias: "typeName", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }] }); })();
58
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(BooleanControlComponent, { className: "BooleanControlComponent", filePath: "app/controls/boolean-control.component.ts", lineNumber: 84 }); })();
@@ -0,0 +1,19 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class JsonControlComponent {
3
+ readonly value: import("@angular/core").InputSignal<unknown>;
4
+ readonly label: import("@angular/core").InputSignal<string>;
5
+ readonly typeName: import("@angular/core").InputSignal<string>;
6
+ readonly valueChange: import("@angular/core").OutputEmitterRef<unknown>;
7
+ readonly parseError: import("@angular/core").WritableSignal<boolean>;
8
+ readonly localText: import("@angular/core").WritableSignal<string | null>;
9
+ private readonly textareaEl;
10
+ private readonly preEl;
11
+ readonly displayText: import("@angular/core").Signal<string>;
12
+ readonly highlightedHtml: import("@angular/core").Signal<string>;
13
+ stringify(val: unknown): string;
14
+ onInput(raw: string): void;
15
+ syncScroll(): void;
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<JsonControlComponent, never>;
17
+ static ɵcmp: i0.ɵɵComponentDeclaration<JsonControlComponent, "prism-json-control", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "typeName": { "alias": "typeName"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
18
+ }
19
+ //# sourceMappingURL=json-control.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-control.component.d.ts","sourceRoot":"","sources":["../../../src/app/controls/json-control.component.ts"],"names":[],"mappings":";AAgBA,qBAyIa,oBAAoB;IAC/B,QAAQ,CAAC,KAAK,+CAAwB;IACtC,QAAQ,CAAC,KAAK,8CAAa;IAC3B,QAAQ,CAAC,QAAQ,8CAAa;IAC9B,QAAQ,CAAC,WAAW,oDAAqB;IAEzC,QAAQ,CAAC,UAAU,kDAAiB;IACpC,QAAQ,CAAC,SAAS,wDAA+B;IAEjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4D;IACvF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkD;IAExE,QAAQ,CAAC,WAAW,yCAIjB;IAEH,QAAQ,CAAC,eAAe,yCAAqD;IAE7E,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM;IAQ/B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAW1B,UAAU,IAAI,IAAI;yCAvCP,oBAAoB;2CAApB,oBAAoB;CA+ChC"}
@@ -0,0 +1,136 @@
1
+ import { Component, computed, input, output, signal, viewChild } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ const _c0 = ["textareaEl"];
4
+ const _c1 = ["preEl"];
5
+ function JsonControlComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
6
+ i0.ɵɵdomElementStart(0, "code", 5);
7
+ i0.ɵɵtext(1);
8
+ i0.ɵɵdomElementEnd();
9
+ } if (rf & 2) {
10
+ const ctx_r0 = i0.ɵɵnextContext();
11
+ i0.ɵɵadvance();
12
+ i0.ɵɵtextInterpolate(ctx_r0.typeName());
13
+ } }
14
+ function JsonControlComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
15
+ i0.ɵɵdomElementStart(0, "span", 11);
16
+ i0.ɵɵtext(1, "Invalid JSON");
17
+ i0.ɵɵdomElementEnd();
18
+ } }
19
+ function highlightJson(json) {
20
+ return json.replace(/("(?:\\.|[^"\\])*")\s*(:)|("(?:\\.|[^"\\])*")|(true|false)|(null)|(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)/g, (match, key, colon, str, bool, nil, num) => {
21
+ if (key && colon)
22
+ return `<span class="jh-key">${key}</span>${colon}`;
23
+ if (str)
24
+ return `<span class="jh-string">${str}</span>`;
25
+ if (bool)
26
+ return `<span class="jh-bool">${bool}</span>`;
27
+ if (nil)
28
+ return `<span class="jh-null">${nil}</span>`;
29
+ if (num)
30
+ return `<span class="jh-number">${num}</span>`;
31
+ return match;
32
+ });
33
+ }
34
+ export class JsonControlComponent {
35
+ value = input(null, ...(ngDevMode ? [{ debugName: "value" }] : []));
36
+ label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
37
+ typeName = input('', ...(ngDevMode ? [{ debugName: "typeName" }] : []));
38
+ valueChange = output();
39
+ parseError = signal(false, ...(ngDevMode ? [{ debugName: "parseError" }] : []));
40
+ localText = signal(null, ...(ngDevMode ? [{ debugName: "localText" }] : []));
41
+ textareaEl = viewChild('textareaEl', ...(ngDevMode ? [{ debugName: "textareaEl" }] : []));
42
+ preEl = viewChild('preEl', ...(ngDevMode ? [{ debugName: "preEl" }] : []));
43
+ displayText = computed(() => {
44
+ const local = this.localText();
45
+ if (local !== null)
46
+ return local;
47
+ return this.stringify(this.value());
48
+ }, ...(ngDevMode ? [{ debugName: "displayText" }] : []));
49
+ highlightedHtml = computed(() => highlightJson(this.displayText()), ...(ngDevMode ? [{ debugName: "highlightedHtml" }] : []));
50
+ stringify(val) {
51
+ try {
52
+ return JSON.stringify(val, null, 2);
53
+ }
54
+ catch {
55
+ return String(val);
56
+ }
57
+ }
58
+ onInput(raw) {
59
+ this.localText.set(raw);
60
+ try {
61
+ const parsed = JSON.parse(raw);
62
+ this.parseError.set(false);
63
+ this.valueChange.emit(parsed);
64
+ }
65
+ catch {
66
+ this.parseError.set(true);
67
+ }
68
+ }
69
+ syncScroll() {
70
+ const textarea = this.textareaEl()?.nativeElement;
71
+ const pre = this.preEl()?.nativeElement;
72
+ if (textarea && pre) {
73
+ pre.scrollTop = textarea.scrollTop;
74
+ pre.scrollLeft = textarea.scrollLeft;
75
+ }
76
+ }
77
+ static ɵfac = function JsonControlComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || JsonControlComponent)(); };
78
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: JsonControlComponent, selectors: [["prism-json-control"]], viewQuery: function JsonControlComponent_Query(rf, ctx) { if (rf & 1) {
79
+ i0.ɵɵviewQuerySignal(ctx.textareaEl, _c0, 5)(ctx.preEl, _c1, 5);
80
+ } if (rf & 2) {
81
+ i0.ɵɵqueryAdvance(2);
82
+ } }, inputs: { value: [1, "value"], label: [1, "label"], typeName: [1, "typeName"] }, outputs: { valueChange: "valueChange" }, decls: 13, vars: 5, consts: [["preEl", ""], ["textareaEl", ""], [1, "prism-json-control"], [1, "prism-json-control__label"], [1, "prism-json-control__label-text"], [1, "prism-json-control__type"], [1, "prism-json-control__editor"], [1, "prism-json-control__overlay"], [1, "prism-json-control__pre"], [3, "innerHTML"], ["spellcheck", "false", 1, "prism-json-control__input", 3, "input", "scroll", "value"], [1, "prism-json-control__error"]], template: function JsonControlComponent_Template(rf, ctx) { if (rf & 1) {
83
+ i0.ɵɵdomElementStart(0, "div", 2)(1, "div", 3)(2, "span", 4);
84
+ i0.ɵɵtext(3);
85
+ i0.ɵɵdomElementEnd();
86
+ i0.ɵɵconditionalCreate(4, JsonControlComponent_Conditional_4_Template, 2, 1, "code", 5);
87
+ i0.ɵɵdomElementEnd();
88
+ i0.ɵɵdomElementStart(5, "div", 6)(6, "div", 7)(7, "pre", 8, 0);
89
+ i0.ɵɵdomElement(9, "code", 9);
90
+ i0.ɵɵdomElementEnd();
91
+ i0.ɵɵdomElementStart(10, "textarea", 10, 1);
92
+ i0.ɵɵdomListener("input", function JsonControlComponent_Template_textarea_input_10_listener($event) { return ctx.onInput($event.target.value); })("scroll", function JsonControlComponent_Template_textarea_scroll_10_listener() { return ctx.syncScroll(); });
93
+ i0.ɵɵdomElementEnd()();
94
+ i0.ɵɵconditionalCreate(12, JsonControlComponent_Conditional_12_Template, 2, 0, "span", 11);
95
+ i0.ɵɵdomElementEnd()();
96
+ } if (rf & 2) {
97
+ i0.ɵɵadvance(3);
98
+ i0.ɵɵtextInterpolate(ctx.label());
99
+ i0.ɵɵadvance();
100
+ i0.ɵɵconditional(ctx.typeName() ? 4 : -1);
101
+ i0.ɵɵadvance(5);
102
+ i0.ɵɵdomProperty("innerHTML", ctx.highlightedHtml(), i0.ɵɵsanitizeHtml);
103
+ i0.ɵɵadvance();
104
+ i0.ɵɵdomProperty("value", ctx.displayText());
105
+ i0.ɵɵadvance(2);
106
+ i0.ɵɵconditional(ctx.parseError() ? 12 : -1);
107
+ } }, styles: [".prism-json-control[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 6px 16px;\n min-height: 36px;\n }\n\n .prism-json-control__label[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 140px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n gap: 1px;\n padding-top: 4px;\n }\n .prism-json-control__label-text[_ngcontent-%COMP%] {\n font-size: 13px;\n font-family: var(--prism-font-sans);\n color: var(--prism-text-muted);\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .prism-json-control__type[_ngcontent-%COMP%] {\n font-size: 10px;\n font-family: var(--prism-font-mono, monospace);\n color: var(--prism-text-ghost);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .prism-json-control__editor[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n }\n\n .prism-json-control__overlay[_ngcontent-%COMP%] {\n position: relative;\n border: 1px solid var(--prism-border);\n border-radius: var(--prism-radius-sm);\n overflow: hidden;\n transition: border-color 0.15s;\n }\n .prism-json-control__overlay[_ngcontent-%COMP%]:focus-within {\n border-color: var(--prism-primary);\n box-shadow: 0 0 0 2px var(--prism-glow);\n }\n\n .prism-json-control__pre[_ngcontent-%COMP%], \n .prism-json-control__input[_ngcontent-%COMP%] {\n margin: 0;\n padding: 4px 8px;\n font-family: var(--prism-font-mono, monospace);\n font-size: 12px;\n line-height: 1.4;\n white-space: pre-wrap;\n word-wrap: break-word;\n tab-size: 2;\n }\n\n .prism-json-control__pre[_ngcontent-%COMP%] {\n min-height: 56px;\n pointer-events: none;\n }\n\n .prism-json-control__pre[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n }\n\n [_nghost-%COMP%] .jh-key { color: #93c5fd; }\n [_nghost-%COMP%] .jh-string { color: #7dd3fc; }\n [_nghost-%COMP%] .jh-number { color: #fbbf24; }\n [_nghost-%COMP%] .jh-bool { color: #a78bfa; }\n [_nghost-%COMP%] .jh-null { color: var(--prism-text-ghost); }\n\n .prism-json-control__input[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n background: transparent;\n color: transparent;\n caret-color: var(--prism-text);\n border: none;\n resize: none;\n overflow: auto;\n box-sizing: border-box;\n }\n .prism-json-control__input[_ngcontent-%COMP%]:focus {\n outline: none;\n }\n .prism-json-control__input[_ngcontent-%COMP%]::selection {\n background: rgba(99, 102, 241, 0.3);\n }\n\n .prism-json-control__error[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #ef4444;\n display: block;\n margin-top: 2px;\n }"] });
108
+ }
109
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(JsonControlComponent, [{
110
+ type: Component,
111
+ args: [{ selector: 'prism-json-control', standalone: true, template: `
112
+ <div class="prism-json-control">
113
+ <div class="prism-json-control__label">
114
+ <span class="prism-json-control__label-text">{{ label() }}</span>
115
+ @if (typeName()) { <code class="prism-json-control__type">{{ typeName() }}</code> }
116
+ </div>
117
+ <div class="prism-json-control__editor">
118
+ <div class="prism-json-control__overlay">
119
+ <pre class="prism-json-control__pre" #preEl><code [innerHTML]="highlightedHtml()"></code></pre>
120
+ <textarea
121
+ #textareaEl
122
+ class="prism-json-control__input"
123
+ [value]="displayText()"
124
+ (input)="onInput($any($event.target).value)"
125
+ (scroll)="syncScroll()"
126
+ spellcheck="false"
127
+ ></textarea>
128
+ </div>
129
+ @if (parseError()) {
130
+ <span class="prism-json-control__error">Invalid JSON</span>
131
+ }
132
+ </div>
133
+ </div>
134
+ `, styles: ["\n .prism-json-control {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 6px 16px;\n min-height: 36px;\n }\n\n .prism-json-control__label {\n flex-shrink: 0;\n width: 140px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n gap: 1px;\n padding-top: 4px;\n }\n .prism-json-control__label-text {\n font-size: 13px;\n font-family: var(--prism-font-sans);\n color: var(--prism-text-muted);\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .prism-json-control__type {\n font-size: 10px;\n font-family: var(--prism-font-mono, monospace);\n color: var(--prism-text-ghost);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .prism-json-control__editor {\n flex: 1;\n min-width: 0;\n }\n\n .prism-json-control__overlay {\n position: relative;\n border: 1px solid var(--prism-border);\n border-radius: var(--prism-radius-sm);\n overflow: hidden;\n transition: border-color 0.15s;\n }\n .prism-json-control__overlay:focus-within {\n border-color: var(--prism-primary);\n box-shadow: 0 0 0 2px var(--prism-glow);\n }\n\n .prism-json-control__pre,\n .prism-json-control__input {\n margin: 0;\n padding: 4px 8px;\n font-family: var(--prism-font-mono, monospace);\n font-size: 12px;\n line-height: 1.4;\n white-space: pre-wrap;\n word-wrap: break-word;\n tab-size: 2;\n }\n\n .prism-json-control__pre {\n min-height: 56px;\n pointer-events: none;\n }\n\n .prism-json-control__pre code {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n }\n\n :host ::ng-deep .jh-key { color: #93c5fd; }\n :host ::ng-deep .jh-string { color: #7dd3fc; }\n :host ::ng-deep .jh-number { color: #fbbf24; }\n :host ::ng-deep .jh-bool { color: #a78bfa; }\n :host ::ng-deep .jh-null { color: var(--prism-text-ghost); }\n\n .prism-json-control__input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n background: transparent;\n color: transparent;\n caret-color: var(--prism-text);\n border: none;\n resize: none;\n overflow: auto;\n box-sizing: border-box;\n }\n .prism-json-control__input:focus {\n outline: none;\n }\n .prism-json-control__input::selection {\n background: rgba(99, 102, 241, 0.3);\n }\n\n .prism-json-control__error {\n font-size: 11px;\n color: #ef4444;\n display: block;\n margin-top: 2px;\n }\n "] }]
135
+ }], null, { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], typeName: [{ type: i0.Input, args: [{ isSignal: true, alias: "typeName", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], textareaEl: [{ type: i0.ViewChild, args: ['textareaEl', { isSignal: true }] }], preEl: [{ type: i0.ViewChild, args: ['preEl', { isSignal: true }] }] }); })();
136
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(JsonControlComponent, { className: "JsonControlComponent", filePath: "app/controls/json-control.component.ts", lineNumber: 154 }); })();
@@ -0,0 +1,10 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class NumberControlComponent {
3
+ readonly value: import("@angular/core").InputSignal<number>;
4
+ readonly label: import("@angular/core").InputSignal<string>;
5
+ readonly typeName: import("@angular/core").InputSignal<string>;
6
+ readonly valueChange: import("@angular/core").OutputEmitterRef<number>;
7
+ static ɵfac: i0.ɵɵFactoryDeclaration<NumberControlComponent, never>;
8
+ static ɵcmp: i0.ɵɵComponentDeclaration<NumberControlComponent, "prism-number-control", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "typeName": { "alias": "typeName"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
9
+ }
10
+ //# sourceMappingURL=number-control.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number-control.component.d.ts","sourceRoot":"","sources":["../../../src/app/controls/number-control.component.ts"],"names":[],"mappings":";AAEA,qBA0Ea,sBAAsB;IACjC,QAAQ,CAAC,KAAK,8CAAY;IAC1B,QAAQ,CAAC,KAAK,8CAAa;IAC3B,QAAQ,CAAC,QAAQ,8CAAa;IAC9B,QAAQ,CAAC,WAAW,mDAAoB;yCAJ7B,sBAAsB;2CAAtB,sBAAsB;CAKlC"}
@@ -0,0 +1,55 @@
1
+ import { Component, input, output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ function NumberControlComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
4
+ i0.ɵɵdomElementStart(0, "code", 3);
5
+ i0.ɵɵtext(1);
6
+ i0.ɵɵdomElementEnd();
7
+ } if (rf & 2) {
8
+ const ctx_r0 = i0.ɵɵnextContext();
9
+ i0.ɵɵadvance();
10
+ i0.ɵɵtextInterpolate(ctx_r0.typeName());
11
+ } }
12
+ export class NumberControlComponent {
13
+ value = input(0, ...(ngDevMode ? [{ debugName: "value" }] : []));
14
+ label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
15
+ typeName = input('', ...(ngDevMode ? [{ debugName: "typeName" }] : []));
16
+ valueChange = output();
17
+ static ɵfac = function NumberControlComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || NumberControlComponent)(); };
18
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: NumberControlComponent, selectors: [["prism-number-control"]], inputs: { value: [1, "value"], label: [1, "label"], typeName: [1, "typeName"] }, outputs: { valueChange: "valueChange" }, decls: 6, vars: 4, consts: [[1, "prism-number-control"], [1, "prism-number-control__label"], [1, "prism-number-control__label-text"], [1, "prism-number-control__type"], ["type", "number", 1, "prism-number-control__input", 3, "input", "value"]], template: function NumberControlComponent_Template(rf, ctx) { if (rf & 1) {
19
+ i0.ɵɵdomElementStart(0, "div", 0)(1, "div", 1)(2, "span", 2);
20
+ i0.ɵɵtext(3);
21
+ i0.ɵɵdomElementEnd();
22
+ i0.ɵɵconditionalCreate(4, NumberControlComponent_Conditional_4_Template, 2, 1, "code", 3);
23
+ i0.ɵɵdomElementEnd();
24
+ i0.ɵɵdomElementStart(5, "input", 4);
25
+ i0.ɵɵdomListener("input", function NumberControlComponent_Template_input_input_5_listener($event) { return ctx.valueChange.emit($event.target.valueAsNumber || 0); });
26
+ i0.ɵɵdomElementEnd()();
27
+ } if (rf & 2) {
28
+ i0.ɵɵadvance(3);
29
+ i0.ɵɵtextInterpolate(ctx.label());
30
+ i0.ɵɵadvance();
31
+ i0.ɵɵconditional(ctx.typeName() ? 4 : -1);
32
+ i0.ɵɵadvance();
33
+ i0.ɵɵdomProperty("value", ctx.value());
34
+ i0.ɵɵattribute("aria-label", ctx.label());
35
+ } }, styles: [".prism-number-control[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 6px 16px;\n min-height: 36px;\n }\n\n .prism-number-control__label[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 140px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n gap: 1px;\n }\n .prism-number-control__label-text[_ngcontent-%COMP%] {\n font-size: 13px;\n font-family: var(--prism-font-sans);\n color: var(--prism-text-muted);\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .prism-number-control__type[_ngcontent-%COMP%] {\n font-size: 10px;\n font-family: var(--prism-font-mono, monospace);\n color: var(--prism-text-ghost);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .prism-number-control__input[_ngcontent-%COMP%] {\n flex: 1;\n background: var(--prism-input-bg);\n border: 1px solid var(--prism-border);\n border-radius: var(--prism-radius-sm);\n color: var(--prism-text);\n font-family: var(--prism-font-sans);\n padding: 4px 8px;\n font-size: 13px;\n min-width: 0;\n box-sizing: border-box;\n transition: border-color 0.15s;\n }\n\n .prism-number-control__input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--prism-primary);\n box-shadow: 0 0 0 2px var(--prism-glow);\n }"] });
36
+ }
37
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NumberControlComponent, [{
38
+ type: Component,
39
+ args: [{ selector: 'prism-number-control', standalone: true, template: `
40
+ <div class="prism-number-control">
41
+ <div class="prism-number-control__label">
42
+ <span class="prism-number-control__label-text">{{ label() }}</span>
43
+ @if (typeName()) { <code class="prism-number-control__type">{{ typeName() }}</code> }
44
+ </div>
45
+ <input
46
+ type="number"
47
+ class="prism-number-control__input"
48
+ [attr.aria-label]="label()"
49
+ [value]="value()"
50
+ (input)="valueChange.emit($any($event.target).valueAsNumber || 0)"
51
+ />
52
+ </div>
53
+ `, styles: ["\n .prism-number-control {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 6px 16px;\n min-height: 36px;\n }\n\n .prism-number-control__label {\n flex-shrink: 0;\n width: 140px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n gap: 1px;\n }\n .prism-number-control__label-text {\n font-size: 13px;\n font-family: var(--prism-font-sans);\n color: var(--prism-text-muted);\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .prism-number-control__type {\n font-size: 10px;\n font-family: var(--prism-font-mono, monospace);\n color: var(--prism-text-ghost);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .prism-number-control__input {\n flex: 1;\n background: var(--prism-input-bg);\n border: 1px solid var(--prism-border);\n border-radius: var(--prism-radius-sm);\n color: var(--prism-text);\n font-family: var(--prism-font-sans);\n padding: 4px 8px;\n font-size: 13px;\n min-width: 0;\n box-sizing: border-box;\n transition: border-color 0.15s;\n }\n\n .prism-number-control__input:focus {\n outline: none;\n border-color: var(--prism-primary);\n box-shadow: 0 0 0 2px var(--prism-glow);\n }\n "] }]
54
+ }], null, { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], typeName: [{ type: i0.Input, args: [{ isSignal: true, alias: "typeName", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }] }); })();
55
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(NumberControlComponent, { className: "NumberControlComponent", filePath: "app/controls/number-control.component.ts", lineNumber: 77 }); })();
@@ -0,0 +1,10 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class StringControlComponent {
3
+ readonly value: import("@angular/core").InputSignal<string>;
4
+ readonly label: import("@angular/core").InputSignal<string>;
5
+ readonly typeName: import("@angular/core").InputSignal<string>;
6
+ readonly valueChange: import("@angular/core").OutputEmitterRef<string>;
7
+ static ɵfac: i0.ɵɵFactoryDeclaration<StringControlComponent, never>;
8
+ static ɵcmp: i0.ɵɵComponentDeclaration<StringControlComponent, "prism-string-control", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "typeName": { "alias": "typeName"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
9
+ }
10
+ //# sourceMappingURL=string-control.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string-control.component.d.ts","sourceRoot":"","sources":["../../../src/app/controls/string-control.component.ts"],"names":[],"mappings":";AAEA,qBA0Ea,sBAAsB;IACjC,QAAQ,CAAC,KAAK,8CAAa;IAC3B,QAAQ,CAAC,KAAK,8CAAa;IAC3B,QAAQ,CAAC,QAAQ,8CAAa;IAC9B,QAAQ,CAAC,WAAW,mDAAoB;yCAJ7B,sBAAsB;2CAAtB,sBAAsB;CAKlC"}