@ng-prism/plugin-jsdoc 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.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  API documentation plugin for [@ng-prism/core](https://github.com/dyingangel666/ng-prism). Extracts JSDoc comments from component source code at build time and renders an interactive API panel.
4
4
 
5
- > **Full documentation:** [ng-prism Docs — JSDoc Plugin](https://dyingangel666.github.io/ng-prism/#/plugins/jsdoc)
5
+ > **Full documentation:** [ng-prism Docs: JSDoc Plugin](https://dyingangel666.github.io/ng-prism/#/plugins/jsdoc)
6
6
 
7
7
  ## Installation
8
8
 
@@ -28,7 +28,7 @@ import { defineConfig } from '@ng-prism/core/config';
28
28
  import { jsDocPlugin } from '@ng-prism/plugin-jsdoc';
29
29
 
30
30
  export default defineConfig({
31
- plugins: [jsDocPlugin()],
31
+ plugins: [jsDocPlugin()]
32
32
  });
33
33
  ```
34
34
 
@@ -37,10 +37,10 @@ export default defineConfig({
37
37
  - Extracts class-level JSDoc description
38
38
  - Extracts per-input and per-output JSDoc comments
39
39
  - Renders an **API** panel with:
40
- - Component description
41
- - Inputs table (name, type, default, description)
42
- - Outputs table (name, description)
43
- - Supported tags: `@deprecated`, `@since`, `@see`, `@example`
40
+ - Component description
41
+ - Inputs table (name, type, default, description)
42
+ - Outputs table (name, description)
43
+ - Supported tags: `@deprecated`, `@since`, `@see`, `@example`
44
44
 
45
45
  ## Markdown Support
46
46
 
@@ -49,11 +49,11 @@ JSDoc descriptions are rendered as Markdown:
49
49
  - Headings (`#`, `##`, `###`)
50
50
  - Lists (ordered/unordered) and inline code (`` `code` ``)
51
51
  - Bold (`**text**`), italic (`*text*`), and links (`[text](url)`)
52
- - Fenced code blocks with a language hint (` ```html `, ` ```scss ` …)
52
+ - Fenced code blocks with a language hint (` ```html `, ` ```scss `, ...)
53
53
 
54
54
  Class descriptions are rendered as block Markdown; input/output/method descriptions are
55
55
  rendered inline (no wrapping `<p>`). Existing plain-text descriptions keep working
56
- unchanged — plain text is valid Markdown.
56
+ unchanged, since plain text is valid Markdown.
57
57
 
58
58
  ````typescript
59
59
  /**
@@ -61,8 +61,8 @@ unchanged — plain text is valid Markdown.
61
61
  *
62
62
  * ## Size
63
63
  *
64
- * - `small` (4px) — inline indicators
65
- * - `large` (9px, default) — section-level loading
64
+ * - `small` (4px): inline indicators
65
+ * - `large` (9px, default): section-level loading
66
66
  *
67
67
  * @example
68
68
  * ```html
@@ -72,9 +72,9 @@ unchanged — plain text is valid Markdown.
72
72
  ````
73
73
 
74
74
  `@example` blocks accept a fenced code block with a language hint. The language is
75
- passed through to `ngx-highlightjs` (`html`, `scss`, `typescript`, …). Examples without
75
+ passed through to `ngx-highlightjs` (`html`, `scss`, `typescript`, ...). Examples without
76
76
  fences fall back to `typescript` for backwards compatibility. Make sure the languages
77
- you reference are registered with `highlight.js` in your app — `highlight.js`'s core
77
+ you reference are registered with `highlight.js` in your app. `highlight.js`'s core
78
78
  language set is loaded by default, but additional languages must be registered
79
79
  explicitly by the consumer.
80
80
 
@@ -1,3 +1,11 @@
1
1
  import type { JsDocData } from './jsdoc.types.js';
2
- export declare function extractJsDocData(filePath: string, className: string): JsDocData | null;
2
+ /**
3
+ * `baseClasses` come from the scanner, nearest first. Members are read from
4
+ * the class and then from each of them; the first class that declares a
5
+ * member decides its tags, as a redeclaration replaces the inherited one.
6
+ */
7
+ export declare function extractJsDocData(filePath: string, className: string, baseClasses?: {
8
+ className: string;
9
+ filePath: string;
10
+ }[]): JsDocData | null;
3
11
  //# sourceMappingURL=jsdoc-extractor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"jsdoc-extractor.d.ts","sourceRoot":"","sources":["../src/jsdoc-extractor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAkC,MAAM,kBAAkB,CAAC;AAElF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAatF"}
1
+ {"version":3,"file":"jsdoc-extractor.d.ts","sourceRoot":"","sources":["../src/jsdoc-extractor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAkC,MAAM,kBAAkB,CAAC;AAElF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,GAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAO,GAAG,SAAS,GAAG,IAAI,CAyBnJ"}
@@ -1,16 +1,29 @@
1
1
  import { readFileSync } from 'node:fs';
2
2
  import ts from 'typescript';
3
- export function extractJsDocData(filePath, className) {
4
- const sourceText = readFileSync(filePath, 'utf-8');
5
- const sourceFile = ts.createSourceFile(filePath, sourceText, ts.ScriptTarget.ES2022, true);
6
- const classDecl = findClassByName(sourceFile, className);
3
+ /**
4
+ * `baseClasses` come from the scanner, nearest first. Members are read from
5
+ * the class and then from each of them; the first class that declares a
6
+ * member decides its tags, as a redeclaration replaces the inherited one.
7
+ */
8
+ export function extractJsDocData(filePath, className, baseClasses = []) {
9
+ const sourceFiles = new Map();
10
+ const findClass = (path, name) => {
11
+ let sourceFile = sourceFiles.get(path);
12
+ if (!sourceFile) {
13
+ sourceFile = ts.createSourceFile(path, readFileSync(path, 'utf-8'), ts.ScriptTarget.ES2022, true);
14
+ sourceFiles.set(path, sourceFile);
15
+ }
16
+ return findClassByName(sourceFile, name);
17
+ };
18
+ const classDecl = findClass(filePath, className);
7
19
  if (!classDecl)
8
20
  return null;
21
+ const hierarchy = [classDecl, ...baseClasses.flatMap((base) => findClass(base.filePath, base.className) ?? [])];
9
22
  return {
10
23
  classDescription: extractDescription(classDecl),
11
24
  classTags: extractTags(classDecl),
12
- memberTags: extractAllMemberTags(classDecl),
13
- methods: extractPublicMethods(classDecl),
25
+ memberTags: extractAllMemberTags(hierarchy),
26
+ methods: extractPublicMethods(hierarchy)
14
27
  };
15
28
  }
16
29
  function findClassByName(sourceFile, className) {
@@ -37,10 +50,10 @@ function extractDescription(node) {
37
50
  return undefined;
38
51
  if (typeof comment === 'string')
39
52
  return comment.trim() || undefined;
40
- return comment
53
+ return (comment
41
54
  .map((c) => (typeof c === 'string' ? c : c.text))
42
55
  .join('')
43
- .trim() || undefined;
56
+ .trim() || undefined);
44
57
  }
45
58
  function extractTags(node) {
46
59
  const tags = ts.getJSDocTags(node);
@@ -85,23 +98,42 @@ function tagCommentToString(comment) {
85
98
  return undefined;
86
99
  if (typeof comment === 'string')
87
100
  return comment.trim() || undefined;
88
- return comment
101
+ return (comment
89
102
  .map((c) => (typeof c === 'string' ? c : c.text))
90
103
  .join('')
91
- .trim() || undefined;
104
+ .trim() || undefined);
92
105
  }
93
- function extractAllMemberTags(classDecl) {
106
+ function extractAllMemberTags(hierarchy) {
94
107
  const result = {};
108
+ const shadowed = new Set();
109
+ for (const classDecl of hierarchy) {
110
+ for (const member of classDecl.members) {
111
+ const name = getMemberName(member);
112
+ if (!name || shadowed.has(name))
113
+ continue;
114
+ const tags = ts.getJSDocTags(member);
115
+ if (tags.length === 0)
116
+ continue;
117
+ result[name] = buildTagsFromList(tags);
118
+ }
119
+ addMemberNames(classDecl, shadowed);
120
+ }
121
+ return result;
122
+ }
123
+ /**
124
+ * A member with JSDoc of its own hides the same name further up, as it does
125
+ * for TypeScript and for the description the scanner reads; one without
126
+ * keeps the documentation it inherits. Applied after the whole class, so the
127
+ * getter, setter or overloads next to a member are read too. A static member
128
+ * hides nothing, since inputs, outputs and methods are instance members.
129
+ */
130
+ function addMemberNames(classDecl, names) {
95
131
  for (const member of classDecl.members) {
96
132
  const name = getMemberName(member);
97
- if (!name)
98
- continue;
99
- const tags = ts.getJSDocTags(member);
100
- if (tags.length === 0)
101
- continue;
102
- result[name] = buildTagsFromList(tags);
133
+ const isStatic = ts.canHaveModifiers(member) && ts.getModifiers(member)?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword);
134
+ if (name && !isStatic && ts.getJSDocCommentsAndTags(member).length > 0)
135
+ names.add(name);
103
136
  }
104
- return result;
105
137
  }
106
138
  function getMemberName(member) {
107
139
  if (!member.name)
@@ -113,33 +145,44 @@ function getMemberName(member) {
113
145
  return undefined;
114
146
  }
115
147
  const LIFECYCLE_HOOKS = new Set([
116
- 'ngOnInit', 'ngOnDestroy', 'ngOnChanges', 'ngDoCheck',
117
- 'ngAfterContentInit', 'ngAfterContentChecked',
118
- 'ngAfterViewInit', 'ngAfterViewChecked',
148
+ 'ngOnInit',
149
+ 'ngOnDestroy',
150
+ 'ngOnChanges',
151
+ 'ngDoCheck',
152
+ 'ngAfterContentInit',
153
+ 'ngAfterContentChecked',
154
+ 'ngAfterViewInit',
155
+ 'ngAfterViewChecked'
119
156
  ]);
120
- function extractPublicMethods(classDecl) {
157
+ function extractPublicMethods(hierarchy) {
121
158
  const result = [];
122
- const sourceFile = classDecl.getSourceFile();
123
- for (const member of classDecl.members) {
124
- if (!ts.isMethodDeclaration(member))
125
- continue;
126
- const name = getMemberName(member);
127
- if (!name || name.startsWith('_'))
128
- continue;
129
- if (LIFECYCLE_HOOKS.has(name))
130
- continue;
131
- const isPrivate = member.modifiers?.some((m) => m.kind === ts.SyntaxKind.PrivateKeyword || m.kind === ts.SyntaxKind.ProtectedKeyword);
132
- if (isPrivate)
133
- continue;
134
- if (!hasDirectJsDoc(member, sourceFile))
135
- continue;
136
- const description = extractDescription(member);
137
- const tags = extractTags(member);
138
- const params = extractParamDocs(member);
139
- const returnType = member.type ? member.type.getText() : undefined;
140
- if (!description && Object.keys(tags).length === 0)
141
- continue;
142
- result.push({ name, description, tags, params, returnType });
159
+ const shadowed = new Set();
160
+ for (const classDecl of hierarchy) {
161
+ const sourceFile = classDecl.getSourceFile();
162
+ for (const member of classDecl.members) {
163
+ if (!ts.isMethodDeclaration(member))
164
+ continue;
165
+ const name = getMemberName(member);
166
+ if (!name || shadowed.has(name))
167
+ continue;
168
+ if (name.startsWith('_'))
169
+ continue;
170
+ if (LIFECYCLE_HOOKS.has(name))
171
+ continue;
172
+ const isPrivate = member.modifiers?.some((m) => m.kind === ts.SyntaxKind.PrivateKeyword || m.kind === ts.SyntaxKind.ProtectedKeyword);
173
+ if (isPrivate)
174
+ continue;
175
+ if (!hasDirectJsDoc(member, sourceFile))
176
+ continue;
177
+ const description = extractDescription(member);
178
+ const tags = extractTags(member);
179
+ const params = extractParamDocs(member);
180
+ const returnType = member.type ? member.type.getText() : undefined;
181
+ if (!description && Object.keys(tags).length === 0)
182
+ continue;
183
+ result.push({ name, description, tags, params, returnType });
184
+ }
185
+ addMemberNames(classDecl, shadowed);
143
186
  }
144
187
  return result;
145
188
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jsdoc-panel.component.d.ts","sourceRoot":"","sources":["../src/jsdoc-panel.component.ts"],"names":[],"mappings":"AAOA,OAAO,EAAgB,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAEnE,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;;AAEvB,qBAuYa,mBAAmB;IAC9B,QAAQ,CAAC,eAAe,+CAAwB;IAEhD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwB;IAElD,SAAS,CAAC,QAAQ,CAAC,SAAS,mDAGzB;IAEH,SAAS,CAAC,QAAQ,CAAC,MAAM,8CAGtB;IAEH,SAAS,CAAC,QAAQ,CAAC,OAAO,+CAGvB;IAEH,SAAS,CAAC,QAAQ,CAAC,gBAAgB,qDAEjC;IAIF,SAAS,CAAC,QAAQ,CAAC,wBAAwB,kDAKzC;IAEF,SAAS,CAAC,QAAQ,CAAC,SAAS,uEAE1B;IAEF,SAAS,CAAC,QAAQ,CAAC,YAAY,0CAE7B;IAEF,SAAS,CAAC,QAAQ,CAAC,iBAAiB,qDAGjC;IAEH,SAAS,CAAC,QAAQ,CAAC,KAAK,qDAA0C;IAElE,SAAS,CAAC,QAAQ,CAAC,OAAO,qDAA4C;IAEtE,SAAS,CAAC,QAAQ,CAAC,OAAO,2CAA8C;IAExE,SAAS,CAAC,QAAQ,CAAC,QAAQ,2CAAkD;IAE7E,SAAS,CAAC,QAAQ,CAAC,OAAO,8CAExB;IAEF,SAAS,CAAC,QAAQ,CAAC,OAAO,0CAMxB;IAEF,SAAS,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAInD,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI1D,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ;IAI1D,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa;IAIlD,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;yCAlFpC,mBAAmB;2CAAnB,mBAAmB;CAsF/B"}
1
+ {"version":3,"file":"jsdoc-panel.component.d.ts","sourceRoot":"","sources":["../src/jsdoc-panel.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,KAAK,aAAa,EAA2D,MAAM,eAAe,CAAC;;AAE5G,qBAQa,mBAAmB;IAC5B,QAAQ,CAAC,eAAe,+CAAwB;IAEhD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwB;IAElD,SAAS,CAAC,QAAQ,CAAC,SAAS,mDAIzB;IAEH,SAAS,CAAC,QAAQ,CAAC,MAAM,8CAItB;IAEH,SAAS,CAAC,QAAQ,CAAC,OAAO,+CAIvB;IAEH,SAAS,CAAC,QAAQ,CAAC,gBAAgB,qDAAsD;IAIzF,SAAS,CAAC,QAAQ,CAAC,wBAAwB,kDAIxC;IAEH,SAAS,CAAC,QAAQ,CAAC,SAAS,uEAAqD;IAEjF,SAAS,CAAC,QAAQ,CAAC,YAAY,0CAAiD;IAEhF,SAAS,CAAC,QAAQ,CAAC,iBAAiB,qDAIjC;IAEH,SAAS,CAAC,QAAQ,CAAC,KAAK,qDAA0C;IAElE,SAAS,CAAC,QAAQ,CAAC,OAAO,qDAA4C;IAEtE,SAAS,CAAC,QAAQ,CAAC,OAAO,2CAA8C;IAExE,SAAS,CAAC,QAAQ,CAAC,QAAQ,2CAAkD;IAE7E,SAAS,CAAC,QAAQ,CAAC,OAAO,8CAAgE;IAE1F,SAAS,CAAC,QAAQ,CAAC,OAAO,0CAA0G;IAEpI,SAAS,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAInD,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI1D,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ;IAI1D,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa;IAIlD,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;yCAvEtC,mBAAmB;2CAAnB,mBAAmB;CA2E/B"}
@@ -1,7 +1,7 @@
1
- import { ChangeDetectionStrategy, Component, computed, inject, input, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';
2
2
  import { DomSanitizer } from '@angular/platform-browser';
3
3
  import { Highlight } from 'ngx-highlightjs';
4
- import { parseExample, renderBlockMarkdown, renderInlineMarkdown, } from './markdown.js';
4
+ import { parseExample, renderBlockMarkdown, renderInlineMarkdown } from './markdown.js';
5
5
  import * as i0 from "@angular/core";
6
6
  const _forTrack0 = ($index, $item) => $item.name;
7
7
  function JsDocPanelComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
@@ -427,7 +427,7 @@ export class JsDocPanelComponent {
427
427
  classDescription = computed(() => this.jsdocData()?.classDescription, /* @ts-ignore */
428
428
  ...(ngDevMode ? [{ debugName: "classDescription" }] : /* istanbul ignore next */ []));
429
429
  // Source is component-author JSDoc compiled into the manifest at build time,
430
- // not user input — bypassing sanitization is safe here.
430
+ // not user input, so bypassing sanitization is safe here.
431
431
  renderedClassDescription = computed(() => {
432
432
  const html = renderBlockMarkdown(this.classDescription());
433
433
  return html ? this.sanitizer.bypassSecurityTrustHtml(html) : null;
@@ -452,10 +452,7 @@ export class JsDocPanelComponent {
452
452
  ...(ngDevMode ? [{ debugName: "examples" }] : /* istanbul ignore next */ []));
453
453
  methods = computed(() => this.jsdocData()?.methods ?? [], /* @ts-ignore */
454
454
  ...(ngDevMode ? [{ debugName: "methods" }] : /* istanbul ignore next */ []));
455
- hasTags = computed(() => this.isDeprecated() ||
456
- !!this.since() ||
457
- !!this.version() ||
458
- this.seeRefs().length > 0, /* @ts-ignore */
455
+ hasTags = computed(() => this.isDeprecated() || !!this.since() || !!this.version() || this.seeRefs().length > 0, /* @ts-ignore */
459
456
  ...(ngDevMode ? [{ debugName: "hasTags" }] : /* istanbul ignore next */ []));
460
457
  isMemberDeprecated(name) {
461
458
  return !!this.jsdocData()?.memberTags[name]?.deprecated;
@@ -482,212 +479,10 @@ export class JsDocPanelComponent {
482
479
  } if (rf & 2) {
483
480
  i0.ɵɵadvance();
484
481
  i0.ɵɵconditional(!ctx.activeComponent() ? 1 : 2);
485
- } }, dependencies: [Highlight], styles: ["[_nghost-%COMP%] { display: block; height: 100%; overflow: auto; }\n .prism-jsdoc-panel[_ngcontent-%COMP%] {\n padding: 20px 24px;\n max-width: 880px;\n font-family: var(--%NS%font-sans);\n font-size: var(--%NS%fs-md);\n color: var(--%NS%prism-text);\n }\n .prism-jsdoc-panel__empty[_ngcontent-%COMP%] {\n display: flex; align-items: center; justify-content: center;\n min-height: 120px; color: var(--%NS%prism-text-muted);\n }\n .prism-jsdoc-panel__description[_ngcontent-%COMP%] {\n margin: 0 0 18px;\n font-size: 14px;\n line-height: 1.7;\n color: var(--%NS%prism-text-2);\n }\n .prism-jsdoc-panel__meta[_ngcontent-%COMP%] {\n display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 18px;\n }\n .prism-jsdoc-panel__meta-item[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 6px;\n padding: 3px 9px; border-radius: 4px;\n background: var(--%NS%prism-input-bg);\n border: 1px solid var(--%NS%prism-border);\n font-size: var(--%NS%fs-sm); color: var(--%NS%prism-text-2);\n }\n .prism-jsdoc-panel__meta-label[_ngcontent-%COMP%] {\n font-weight: 500; color: var(--%NS%prism-primary);\n font-family: var(--%NS%font-mono);\n }\n .prism-jsdoc-panel__badge[_ngcontent-%COMP%] {\n display: inline-flex; align-items: center;\n padding: 2px 8px; border-radius: 10px;\n font-size: 12px; font-weight: 600;\n }\n .prism-jsdoc-panel__badge--deprecated[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--%NS%prism-warn) 15%, transparent);\n color: var(--%NS%prism-warn);\n }\n .prism-jsdoc-panel__badge--required[_ngcontent-%COMP%] {\n color: var(--%NS%prism-accent); font-weight: 700; margin-left: 4px;\n }\n .prism-jsdoc-panel__badge--small[_ngcontent-%COMP%] { padding: 1px 5px; font-size: 10px; margin-left: 4px; }\n .prism-jsdoc-panel__section[_ngcontent-%COMP%] { margin-bottom: 20px; }\n .prism-jsdoc-panel__heading[_ngcontent-%COMP%] {\n font-size: 11px; font-weight: 700; text-transform: uppercase;\n letter-spacing: 0.08em; margin: 22px 0 10px;\n color: var(--%NS%prism-text-ghost);\n }\n .prism-jsdoc-panel__code[_ngcontent-%COMP%] {\n margin: 0 0 8px; padding: 0;\n background: var(--%NS%prism-bg-surface);\n border: 1px solid var(--%NS%prism-border);\n border-radius: 8px; overflow: auto;\n }\n .prism-jsdoc-panel__code[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n font-family: var(--%NS%font-mono);\n font-size: var(--%NS%fs-sm); line-height: 1.5;\n padding: 8px 12px; display: block;\n background: transparent !important;\n color: var(--%NS%prism-text-2);\n }\n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs { background: transparent; color: var(--%NS%prism-text-2); }\n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-tag, \n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-name, \n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-selector-tag, \n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-keyword, \n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-title, \n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-title.function_, \n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-built_in, \n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-type { color: var(--%NS%prism-code-tag); }\n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-attr, \n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-attribute, \n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-property, \n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-variable, \n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-template-variable, \n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-params { color: var(--%NS%prism-code-attr); }\n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-string, \n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-doctag, \n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-regexp, \n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-symbol, \n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-number, \n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-literal { color: var(--%NS%prism-code-str); }\n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-comment, \n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-quote, \n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-meta { color: var(--%NS%prism-code-com); font-style: italic; }\n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-deletion { color: var(--%NS%prism-danger); }\n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-addition { color: var(--%NS%prism-success); }\n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-emphasis { font-style: italic; }\n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-strong { font-weight: 700; }\n .prism-jsdoc-panel__table[_ngcontent-%COMP%] {\n width: 100%; border-collapse: collapse;\n font-size: var(--%NS%fs-md);\n border: 1px solid var(--%NS%prism-border);\n border-radius: 8px; overflow: hidden;\n }\n .prism-jsdoc-panel__table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left; padding: 8px 12px;\n background: var(--%NS%prism-bg-surface);\n font-size: 10.5px; text-transform: uppercase;\n letter-spacing: 0.06em; font-weight: 700;\n color: var(--%NS%prism-text-ghost);\n border-bottom: 1px solid var(--%NS%prism-border);\n }\n .prism-jsdoc-panel__table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 12px;\n border-bottom: 1px solid var(--%NS%prism-border);\n vertical-align: top;\n }\n .prism-jsdoc-panel__table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] { border-bottom: 0; }\n .prism-jsdoc-panel__row--deprecated[_ngcontent-%COMP%] td[_ngcontent-%COMP%] { opacity: 0.6; }\n .prism-jsdoc-panel__cell--name[_ngcontent-%COMP%] code[_ngcontent-%COMP%], \n .prism-jsdoc-panel__cell--type[_ngcontent-%COMP%] code[_ngcontent-%COMP%], \n .prism-jsdoc-panel__cell--default[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n font-family: var(--%NS%font-mono);\n font-size: var(--%NS%fs-sm); color: var(--%NS%prism-primary);\n background: color-mix(in srgb, var(--%NS%prism-primary) 8%, transparent);\n padding: 1px 5px; border-radius: var(--%NS%radius-xs);\n }\n .prism-jsdoc-panel__muted[_ngcontent-%COMP%] { color: var(--%NS%prism-text-muted); }\n .prism-jsdoc-panel__cell--doc[_ngcontent-%COMP%] { color: var(--%NS%prism-text); line-height: 1.4; }\n .prism-jsdoc-panel__since-sep[_ngcontent-%COMP%] { color: var(--%NS%prism-text-muted); }\n .prism-jsdoc-panel__since[_ngcontent-%COMP%] { color: var(--%NS%prism-text-muted); font-size: var(--%NS%fs-sm); }\n\n .prism-jsdoc-panel__description[_ngcontent-%COMP%] [_ngcontent-%COMP%]:first-child { margin-top: 0; }\n .prism-jsdoc-panel__description[_ngcontent-%COMP%] [_ngcontent-%COMP%]:last-child { margin-bottom: 0; }\n .prism-jsdoc-panel__description[_ngcontent-%COMP%] p[_ngcontent-%COMP%] { margin: 0 0 8px; line-height: 1.7; }\n .prism-jsdoc-panel__description[_ngcontent-%COMP%] h1[_ngcontent-%COMP%], \n .prism-jsdoc-panel__description[_ngcontent-%COMP%] h2[_ngcontent-%COMP%], \n .prism-jsdoc-panel__description[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n color: var(--%NS%prism-text);\n font-weight: 600;\n line-height: 1.3;\n margin: 18px 0 8px;\n }\n .prism-jsdoc-panel__description[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] { font-size: 18px; }\n .prism-jsdoc-panel__description[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] { font-size: 15px; }\n .prism-jsdoc-panel__description[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 11px; font-weight: 700;\n text-transform: uppercase; letter-spacing: 0.08em;\n color: var(--%NS%prism-text-ghost);\n }\n .prism-jsdoc-panel__description[_ngcontent-%COMP%] ul[_ngcontent-%COMP%], \n .prism-jsdoc-panel__description[_ngcontent-%COMP%] ol[_ngcontent-%COMP%] {\n margin: 0 0 8px; padding-left: 20px;\n }\n .prism-jsdoc-panel__description[_ngcontent-%COMP%] li[_ngcontent-%COMP%] { margin: 2px 0; line-height: 1.6; }\n .prism-jsdoc-panel__description[_ngcontent-%COMP%] a[_ngcontent-%COMP%] {\n color: var(--%NS%prism-primary);\n text-decoration: none;\n }\n .prism-jsdoc-panel__description[_ngcontent-%COMP%] a[_ngcontent-%COMP%]:hover { text-decoration: underline; }\n .prism-jsdoc-panel__description[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] { color: var(--%NS%prism-text); font-weight: 600; }\n .prism-jsdoc-panel__description[_ngcontent-%COMP%] code[_ngcontent-%COMP%], \n .prism-jsdoc-panel__cell--doc[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n font-family: var(--%NS%font-mono);\n font-size: var(--%NS%fs-sm); color: var(--%NS%prism-primary);\n background: color-mix(in srgb, var(--%NS%prism-primary) 8%, transparent);\n padding: 1px 5px; border-radius: var(--%NS%radius-xs);\n }\n .prism-jsdoc-panel__description[_ngcontent-%COMP%] pre[_ngcontent-%COMP%] {\n margin: 0 0 8px; padding: 0;\n background: var(--%NS%prism-bg-surface);\n border: 1px solid var(--%NS%prism-border);\n border-radius: 8px; overflow: auto;\n }\n .prism-jsdoc-panel__description[_ngcontent-%COMP%] pre[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n font-family: var(--%NS%font-mono);\n font-size: var(--%NS%fs-sm); line-height: 1.5;\n padding: 8px 12px; display: block;\n background: none; color: var(--%NS%prism-text);\n }\n .prism-jsdoc-panel__description[_ngcontent-%COMP%] blockquote[_ngcontent-%COMP%] {\n margin: 0 0 8px;\n padding: 4px 12px;\n border-left: 3px solid var(--%NS%prism-border);\n color: var(--%NS%prism-text-2);\n }"] });
482
+ } }, dependencies: [Highlight], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n overflow: auto;\n}\n\n.prism-jsdoc-panel[_ngcontent-%COMP%] {\n max-width: 880px;\n padding: 20px 24px;\n font-family: var(--%NS%font-sans);\n font-size: var(--%NS%fs-md);\n color: var(--%NS%prism-text);\n}\n\n.prism-jsdoc-panel__empty[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 120px;\n color: var(--%NS%prism-text-muted);\n}\n\n.prism-jsdoc-panel__description[_ngcontent-%COMP%] {\n margin: 0 0 18px;\n font-size: 14px;\n line-height: 1.7;\n color: var(--%NS%prism-text-2);\n}\n\n.prism-jsdoc-panel__meta[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-bottom: 18px;\n}\n\n.prism-jsdoc-panel__meta-item[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n align-items: center;\n padding: 3px 9px;\n font-size: var(--%NS%fs-sm);\n color: var(--%NS%prism-text-2);\n background: var(--%NS%prism-input-bg);\n border: 1px solid var(--%NS%prism-border);\n border-radius: 4px;\n}\n\n.prism-jsdoc-panel__meta-label[_ngcontent-%COMP%] {\n font-family: var(--%NS%font-mono);\n font-weight: 500;\n color: var(--%NS%prism-primary);\n}\n\n.prism-jsdoc-panel__badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n font-size: 12px;\n font-weight: 600;\n border-radius: 10px;\n}\n\n.prism-jsdoc-panel__badge--deprecated[_ngcontent-%COMP%] {\n color: var(--%NS%prism-warn);\n background: color-mix(in srgb, var(--%NS%prism-warn) 15%, transparent);\n}\n\n.prism-jsdoc-panel__badge--required[_ngcontent-%COMP%] {\n margin-left: 4px;\n font-weight: 700;\n color: var(--%NS%prism-accent);\n}\n\n.prism-jsdoc-panel__badge--small[_ngcontent-%COMP%] {\n padding: 1px 5px;\n margin-left: 4px;\n font-size: 10px;\n}\n\n.prism-jsdoc-panel__section[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n\n.prism-jsdoc-panel__heading[_ngcontent-%COMP%] {\n margin: 22px 0 10px;\n font-size: 11px;\n font-weight: 700;\n color: var(--%NS%prism-text-ghost);\n text-transform: uppercase;\n letter-spacing: 0.08em;\n}\n\n.prism-jsdoc-panel__code[_ngcontent-%COMP%] {\n padding: 0;\n margin: 0 0 8px;\n overflow: auto;\n background: var(--%NS%prism-bg-surface);\n border: 1px solid var(--%NS%prism-border);\n border-radius: 8px;\n}\n\n.prism-jsdoc-panel__code[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n display: block;\n padding: 8px 12px;\n font-family: var(--%NS%font-mono);\n font-size: var(--%NS%fs-sm);\n line-height: 1.5;\n color: var(--%NS%prism-text-2);\n background: transparent !important;\n}\n\n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs {\n color: var(--%NS%prism-text-2);\n background: transparent;\n}\n\n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-tag, \n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-name, \n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-selector-tag, \n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-keyword, \n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-title, \n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-title.function_, \n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-built_in, \n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-type {\n color: var(--%NS%prism-code-tag);\n}\n\n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-attr, \n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-attribute, \n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-property, \n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-variable, \n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-template-variable, \n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-params {\n color: var(--%NS%prism-code-attr);\n}\n\n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-string, \n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-doctag, \n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-regexp, \n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-symbol, \n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-number, \n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-literal {\n color: var(--%NS%prism-code-str);\n}\n\n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-comment, \n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-quote, \n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-meta {\n font-style: italic;\n color: var(--%NS%prism-code-com);\n}\n\n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-deletion {\n color: var(--%NS%prism-danger);\n}\n\n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-addition {\n color: var(--%NS%prism-success);\n}\n\n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-emphasis {\n font-style: italic;\n}\n\n[_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-strong {\n font-weight: 700;\n}\n\n.prism-jsdoc-panel__table[_ngcontent-%COMP%] {\n width: 100%;\n overflow: hidden;\n font-size: var(--%NS%fs-md);\n border-collapse: collapse;\n border: 1px solid var(--%NS%prism-border);\n border-radius: 8px;\n}\n\n.prism-jsdoc-panel__table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 8px 12px;\n font-size: 10.5px;\n font-weight: 700;\n color: var(--%NS%prism-text-ghost);\n text-align: left;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n background: var(--%NS%prism-bg-surface);\n border-bottom: 1px solid var(--%NS%prism-border);\n}\n\n.prism-jsdoc-panel__table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 12px;\n vertical-align: top;\n border-bottom: 1px solid var(--%NS%prism-border);\n}\n\n.prism-jsdoc-panel__table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: 0;\n}\n\n.prism-jsdoc-panel__row--deprecated[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n opacity: 0.6;\n}\n\n.prism-jsdoc-panel__cell--name[_ngcontent-%COMP%] code[_ngcontent-%COMP%], \n.prism-jsdoc-panel__cell--type[_ngcontent-%COMP%] code[_ngcontent-%COMP%], \n.prism-jsdoc-panel__cell--default[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n padding: 1px 5px;\n font-family: var(--%NS%font-mono);\n font-size: var(--%NS%fs-sm);\n color: var(--%NS%prism-primary);\n background: color-mix(in srgb, var(--%NS%prism-primary) 8%, transparent);\n border-radius: var(--%NS%radius-xs);\n}\n\n.prism-jsdoc-panel__muted[_ngcontent-%COMP%] {\n color: var(--%NS%prism-text-muted);\n}\n\n.prism-jsdoc-panel__cell--doc[_ngcontent-%COMP%] {\n line-height: 1.4;\n color: var(--%NS%prism-text);\n}\n\n.prism-jsdoc-panel__since-sep[_ngcontent-%COMP%] {\n color: var(--%NS%prism-text-muted);\n}\n\n.prism-jsdoc-panel__since[_ngcontent-%COMP%] {\n font-size: var(--%NS%fs-sm);\n color: var(--%NS%prism-text-muted);\n}\n\n.prism-jsdoc-panel__description[_ngcontent-%COMP%] [_ngcontent-%COMP%]:first-child {\n margin-top: 0;\n}\n\n.prism-jsdoc-panel__description[_ngcontent-%COMP%] [_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.prism-jsdoc-panel__description[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 8px;\n line-height: 1.7;\n}\n\n.prism-jsdoc-panel__description[_ngcontent-%COMP%] h1[_ngcontent-%COMP%], \n.prism-jsdoc-panel__description[_ngcontent-%COMP%] h2[_ngcontent-%COMP%], \n.prism-jsdoc-panel__description[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 18px 0 8px;\n font-weight: 600;\n line-height: 1.3;\n color: var(--%NS%prism-text);\n}\n\n.prism-jsdoc-panel__description[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n font-size: 18px;\n}\n\n.prism-jsdoc-panel__description[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n font-size: 15px;\n}\n\n.prism-jsdoc-panel__description[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 700;\n color: var(--%NS%prism-text-ghost);\n text-transform: uppercase;\n letter-spacing: 0.08em;\n}\n\n.prism-jsdoc-panel__description[_ngcontent-%COMP%] ul[_ngcontent-%COMP%], \n.prism-jsdoc-panel__description[_ngcontent-%COMP%] ol[_ngcontent-%COMP%] {\n padding-left: 20px;\n margin: 0 0 8px;\n}\n\n.prism-jsdoc-panel__description[_ngcontent-%COMP%] li[_ngcontent-%COMP%] {\n margin: 2px 0;\n line-height: 1.6;\n}\n\n.prism-jsdoc-panel__description[_ngcontent-%COMP%] a[_ngcontent-%COMP%] {\n color: var(--%NS%prism-primary);\n text-decoration: none;\n}\n\n.prism-jsdoc-panel__description[_ngcontent-%COMP%] a[_ngcontent-%COMP%]:hover {\n text-decoration: underline;\n}\n\n.prism-jsdoc-panel__description[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--%NS%prism-text);\n}\n\n.prism-jsdoc-panel__description[_ngcontent-%COMP%] code[_ngcontent-%COMP%], \n.prism-jsdoc-panel__cell--doc[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n padding: 1px 5px;\n font-family: var(--%NS%font-mono);\n font-size: var(--%NS%fs-sm);\n color: var(--%NS%prism-primary);\n background: color-mix(in srgb, var(--%NS%prism-primary) 8%, transparent);\n border-radius: var(--%NS%radius-xs);\n}\n\n.prism-jsdoc-panel__description[_ngcontent-%COMP%] pre[_ngcontent-%COMP%] {\n padding: 0;\n margin: 0 0 8px;\n overflow: auto;\n background: var(--%NS%prism-bg-surface);\n border: 1px solid var(--%NS%prism-border);\n border-radius: 8px;\n}\n\n.prism-jsdoc-panel__description[_ngcontent-%COMP%] pre[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n display: block;\n padding: 8px 12px;\n font-family: var(--%NS%font-mono);\n font-size: var(--%NS%fs-sm);\n line-height: 1.5;\n color: var(--%NS%prism-text);\n background: none;\n}\n\n.prism-jsdoc-panel__description[_ngcontent-%COMP%] blockquote[_ngcontent-%COMP%] {\n padding: 4px 12px;\n margin: 0 0 8px;\n color: var(--%NS%prism-text-2);\n border-left: 3px solid var(--%NS%prism-border);\n}"] });
486
483
  }
487
484
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(JsDocPanelComponent, [{
488
485
  type: Component,
489
- args: [{ selector: 'prism-jsdoc-panel', standalone: true, imports: [Highlight], changeDetection: ChangeDetectionStrategy.OnPush, template: `
490
- <div class="prism-jsdoc-panel">
491
- @if (!activeComponent()) {
492
- <div class="prism-jsdoc-panel__empty">
493
- Select a component to view API documentation.
494
- </div>
495
- } @else { @if (renderedClassDescription(); as descHtml) {
496
- <div class="prism-jsdoc-panel__description" [innerHTML]="descHtml"></div>
497
- } @if (hasTags()) {
498
- <div class="prism-jsdoc-panel__meta">
499
- @if (isDeprecated()) {
500
- <span
501
- class="prism-jsdoc-panel__badge prism-jsdoc-panel__badge--deprecated"
502
- >
503
- Deprecated{{ deprecatedMessage() ? ': ' + deprecatedMessage() : '' }}
504
- </span>
505
- } @if (version()) {
506
- <span class="prism-jsdoc-panel__meta-item">
507
- <span class="prism-jsdoc-panel__meta-label">Version:</span>
508
- {{ version() }}
509
- </span>
510
- } @if (since()) {
511
- <span class="prism-jsdoc-panel__meta-item">
512
- <span class="prism-jsdoc-panel__meta-label">Since:</span>
513
- {{ since() }}
514
- </span>
515
- } @for (ref of seeRefs(); track $index) {
516
- <span class="prism-jsdoc-panel__meta-item">
517
- <span class="prism-jsdoc-panel__meta-label">See:</span> {{ ref }}
518
- </span>
519
- }
520
- </div>
521
- } @if (examples().length) {
522
- <div class="prism-jsdoc-panel__section">
523
- <h3 class="prism-jsdoc-panel__heading">Examples</h3>
524
- @for (example of examples(); track $index) { @let parsed =
525
- parseExample(example);
526
- <pre
527
- class="prism-jsdoc-panel__code"
528
- ><code [highlight]="parsed.code" [language]="parsed.lang"></code></pre>
529
- }
530
- </div>
531
- } @if (inputs().length) {
532
- <div class="prism-jsdoc-panel__section">
533
- <h3 class="prism-jsdoc-panel__heading">Inputs</h3>
534
- <table class="prism-jsdoc-panel__table">
535
- <thead>
536
- <tr>
537
- <th>Name</th>
538
- <th>Type</th>
539
- <th>Default</th>
540
- <th>Required</th>
541
- <th>Description</th>
542
- </tr>
543
- </thead>
544
- <tbody>
545
- @for (inp of inputs(); track inp.name) {
546
- <tr
547
- [class.prism-jsdoc-panel__row--deprecated]="
548
- isMemberDeprecated(inp.name)
549
- "
550
- >
551
- <td class="prism-jsdoc-panel__cell--name">
552
- <code>{{ inp.name }}</code>
553
- @if (isMemberDeprecated(inp.name)) {
554
- <span
555
- class="prism-jsdoc-panel__badge prism-jsdoc-panel__badge--deprecated prism-jsdoc-panel__badge--small"
556
- >deprecated</span
557
- >
558
- }
559
- </td>
560
- <td class="prism-jsdoc-panel__cell--type">
561
- <code>{{ inp.rawType ?? inp.type }}</code>
562
- </td>
563
- <td class="prism-jsdoc-panel__cell--default">
564
- @if (inp.defaultValue !== undefined) {
565
- <code>{{ formatDefault(inp.defaultValue) }}</code>
566
- } @else {
567
- <span class="prism-jsdoc-panel__muted">—</span>
568
- }
569
- </td>
570
- <td class="prism-jsdoc-panel__cell--required">
571
- @if (inp.required) {
572
- <span
573
- class="prism-jsdoc-panel__badge prism-jsdoc-panel__badge--required"
574
- >required</span
575
- >
576
- } @else {
577
- <span class="prism-jsdoc-panel__muted">—</span>
578
- }
579
- </td>
580
- <td class="prism-jsdoc-panel__cell--doc">
581
- @if (inp.doc) {
582
- <span [innerHTML]="renderInline(inp.doc)"></span>
583
- } @if (getMemberSince(inp.name); as since) { @if (inp.doc) {
584
- <span class="prism-jsdoc-panel__since-sep"> · </span>
585
- }
586
- <span class="prism-jsdoc-panel__since">Since {{ since }}</span>
587
- }
588
- </td>
589
- </tr>
590
- }
591
- </tbody>
592
- </table>
593
- </div>
594
- } @if (outputs().length) {
595
- <div class="prism-jsdoc-panel__section">
596
- <h3 class="prism-jsdoc-panel__heading">Outputs</h3>
597
- <table class="prism-jsdoc-panel__table">
598
- <thead>
599
- <tr>
600
- <th>Name</th>
601
- <th>Description</th>
602
- </tr>
603
- </thead>
604
- <tbody>
605
- @for (out of outputs(); track out.name) {
606
- <tr
607
- [class.prism-jsdoc-panel__row--deprecated]="
608
- isMemberDeprecated(out.name)
609
- "
610
- >
611
- <td class="prism-jsdoc-panel__cell--name">
612
- <code>{{ out.name }}</code>
613
- @if (isMemberDeprecated(out.name)) {
614
- <span
615
- class="prism-jsdoc-panel__badge prism-jsdoc-panel__badge--deprecated prism-jsdoc-panel__badge--small"
616
- >deprecated</span
617
- >
618
- }
619
- </td>
620
- <td class="prism-jsdoc-panel__cell--doc">
621
- @if (out.doc) {
622
- <span [innerHTML]="renderInline(out.doc)"></span>
623
- } @if (getMemberSince(out.name); as since) { @if (out.doc) {
624
- <span class="prism-jsdoc-panel__since-sep"> · </span>
625
- }
626
- <span class="prism-jsdoc-panel__since">Since {{ since }}</span>
627
- }
628
- </td>
629
- </tr>
630
- }
631
- </tbody>
632
- </table>
633
- </div>
634
- } @if (methods().length) {
635
- <div class="prism-jsdoc-panel__section">
636
- <h3 class="prism-jsdoc-panel__heading">Methods</h3>
637
- <table class="prism-jsdoc-panel__table">
638
- <thead>
639
- <tr>
640
- <th>Name</th>
641
- <th>Parameters</th>
642
- <th>Returns</th>
643
- <th>Description</th>
644
- </tr>
645
- </thead>
646
- <tbody>
647
- @for (method of methods(); track method.name) {
648
- <tr
649
- [class.prism-jsdoc-panel__row--deprecated]="
650
- !!method.tags.deprecated
651
- "
652
- >
653
- <td class="prism-jsdoc-panel__cell--name">
654
- <code>{{ method.name }}()</code>
655
- @if (method.tags.deprecated) {
656
- <span
657
- class="prism-jsdoc-panel__badge prism-jsdoc-panel__badge--deprecated prism-jsdoc-panel__badge--small"
658
- >deprecated</span
659
- >
660
- }
661
- </td>
662
- <td class="prism-jsdoc-panel__cell--type">
663
- @if (method.params.length) { @for (p of method.params; track
664
- p.name) {
665
- <div>
666
- <code>{{ p.name }}{{ p.type ? ': ' + p.type : '' }}</code>
667
- </div>
668
- } } @else {
669
- <span class="prism-jsdoc-panel__muted">—</span>
670
- }
671
- </td>
672
- <td class="prism-jsdoc-panel__cell--type">
673
- @if (method.returnType) {
674
- <code>{{ method.returnType }}</code>
675
- } @else {
676
- <span class="prism-jsdoc-panel__muted">void</span>
677
- }
678
- </td>
679
- <td class="prism-jsdoc-panel__cell--doc">
680
- @if (method.description) {
681
- <span [innerHTML]="renderInline(method.description)"></span>
682
- }
683
- </td>
684
- </tr>
685
- }
686
- </tbody>
687
- </table>
688
- </div>
689
- } }
690
- </div>
691
- `, styles: ["\n :host { display: block; height: 100%; overflow: auto; }\n .prism-jsdoc-panel {\n padding: 20px 24px;\n max-width: 880px;\n font-family: var(--font-sans);\n font-size: var(--fs-md);\n color: var(--prism-text);\n }\n .prism-jsdoc-panel__empty {\n display: flex; align-items: center; justify-content: center;\n min-height: 120px; color: var(--prism-text-muted);\n }\n .prism-jsdoc-panel__description {\n margin: 0 0 18px;\n font-size: 14px;\n line-height: 1.7;\n color: var(--prism-text-2);\n }\n .prism-jsdoc-panel__meta {\n display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 18px;\n }\n .prism-jsdoc-panel__meta-item {\n display: flex; align-items: center; gap: 6px;\n padding: 3px 9px; border-radius: 4px;\n background: var(--prism-input-bg);\n border: 1px solid var(--prism-border);\n font-size: var(--fs-sm); color: var(--prism-text-2);\n }\n .prism-jsdoc-panel__meta-label {\n font-weight: 500; color: var(--prism-primary);\n font-family: var(--font-mono);\n }\n .prism-jsdoc-panel__badge {\n display: inline-flex; align-items: center;\n padding: 2px 8px; border-radius: 10px;\n font-size: 12px; font-weight: 600;\n }\n .prism-jsdoc-panel__badge--deprecated {\n background: color-mix(in srgb, var(--prism-warn) 15%, transparent);\n color: var(--prism-warn);\n }\n .prism-jsdoc-panel__badge--required {\n color: var(--prism-accent); font-weight: 700; margin-left: 4px;\n }\n .prism-jsdoc-panel__badge--small { padding: 1px 5px; font-size: 10px; margin-left: 4px; }\n .prism-jsdoc-panel__section { margin-bottom: 20px; }\n .prism-jsdoc-panel__heading {\n font-size: 11px; font-weight: 700; text-transform: uppercase;\n letter-spacing: 0.08em; margin: 22px 0 10px;\n color: var(--prism-text-ghost);\n }\n .prism-jsdoc-panel__code {\n margin: 0 0 8px; padding: 0;\n background: var(--prism-bg-surface);\n border: 1px solid var(--prism-border);\n border-radius: 8px; overflow: auto;\n }\n .prism-jsdoc-panel__code code {\n font-family: var(--font-mono);\n font-size: var(--fs-sm); line-height: 1.5;\n padding: 8px 12px; display: block;\n background: transparent !important;\n color: var(--prism-text-2);\n }\n :host ::ng-deep .prism-jsdoc-panel__code .hljs { background: transparent; color: var(--prism-text-2); }\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-tag,\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-name,\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-selector-tag,\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-keyword,\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-title,\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-title.function_,\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-built_in,\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-type { color: var(--prism-code-tag); }\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-attr,\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-attribute,\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-property,\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-variable,\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-template-variable,\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-params { color: var(--prism-code-attr); }\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-string,\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-doctag,\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-regexp,\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-symbol,\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-number,\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-literal { color: var(--prism-code-str); }\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-comment,\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-quote,\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-meta { color: var(--prism-code-com); font-style: italic; }\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-deletion { color: var(--prism-danger); }\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-addition { color: var(--prism-success); }\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-emphasis { font-style: italic; }\n :host ::ng-deep .prism-jsdoc-panel__code .hljs-strong { font-weight: 700; }\n .prism-jsdoc-panel__table {\n width: 100%; border-collapse: collapse;\n font-size: var(--fs-md);\n border: 1px solid var(--prism-border);\n border-radius: 8px; overflow: hidden;\n }\n .prism-jsdoc-panel__table th {\n text-align: left; padding: 8px 12px;\n background: var(--prism-bg-surface);\n font-size: 10.5px; text-transform: uppercase;\n letter-spacing: 0.06em; font-weight: 700;\n color: var(--prism-text-ghost);\n border-bottom: 1px solid var(--prism-border);\n }\n .prism-jsdoc-panel__table td {\n padding: 10px 12px;\n border-bottom: 1px solid var(--prism-border);\n vertical-align: top;\n }\n .prism-jsdoc-panel__table tr:last-child td { border-bottom: 0; }\n .prism-jsdoc-panel__row--deprecated td { opacity: 0.6; }\n .prism-jsdoc-panel__cell--name code,\n .prism-jsdoc-panel__cell--type code,\n .prism-jsdoc-panel__cell--default code {\n font-family: var(--font-mono);\n font-size: var(--fs-sm); color: var(--prism-primary);\n background: color-mix(in srgb, var(--prism-primary) 8%, transparent);\n padding: 1px 5px; border-radius: var(--radius-xs);\n }\n .prism-jsdoc-panel__muted { color: var(--prism-text-muted); }\n .prism-jsdoc-panel__cell--doc { color: var(--prism-text); line-height: 1.4; }\n .prism-jsdoc-panel__since-sep { color: var(--prism-text-muted); }\n .prism-jsdoc-panel__since { color: var(--prism-text-muted); font-size: var(--fs-sm); }\n\n .prism-jsdoc-panel__description :first-child { margin-top: 0; }\n .prism-jsdoc-panel__description :last-child { margin-bottom: 0; }\n .prism-jsdoc-panel__description p { margin: 0 0 8px; line-height: 1.7; }\n .prism-jsdoc-panel__description h1,\n .prism-jsdoc-panel__description h2,\n .prism-jsdoc-panel__description h3 {\n color: var(--prism-text);\n font-weight: 600;\n line-height: 1.3;\n margin: 18px 0 8px;\n }\n .prism-jsdoc-panel__description h1 { font-size: 18px; }\n .prism-jsdoc-panel__description h2 { font-size: 15px; }\n .prism-jsdoc-panel__description h3 {\n font-size: 11px; font-weight: 700;\n text-transform: uppercase; letter-spacing: 0.08em;\n color: var(--prism-text-ghost);\n }\n .prism-jsdoc-panel__description ul,\n .prism-jsdoc-panel__description ol {\n margin: 0 0 8px; padding-left: 20px;\n }\n .prism-jsdoc-panel__description li { margin: 2px 0; line-height: 1.6; }\n .prism-jsdoc-panel__description a {\n color: var(--prism-primary);\n text-decoration: none;\n }\n .prism-jsdoc-panel__description a:hover { text-decoration: underline; }\n .prism-jsdoc-panel__description strong { color: var(--prism-text); font-weight: 600; }\n .prism-jsdoc-panel__description code,\n .prism-jsdoc-panel__cell--doc code {\n font-family: var(--font-mono);\n font-size: var(--fs-sm); color: var(--prism-primary);\n background: color-mix(in srgb, var(--prism-primary) 8%, transparent);\n padding: 1px 5px; border-radius: var(--radius-xs);\n }\n .prism-jsdoc-panel__description pre {\n margin: 0 0 8px; padding: 0;\n background: var(--prism-bg-surface);\n border: 1px solid var(--prism-border);\n border-radius: 8px; overflow: auto;\n }\n .prism-jsdoc-panel__description pre code {\n font-family: var(--font-mono);\n font-size: var(--fs-sm); line-height: 1.5;\n padding: 8px 12px; display: block;\n background: none; color: var(--prism-text);\n }\n .prism-jsdoc-panel__description blockquote {\n margin: 0 0 8px;\n padding: 4px 12px;\n border-left: 3px solid var(--prism-border);\n color: var(--prism-text-2);\n }\n "] }]
486
+ args: [{ selector: 'prism-jsdoc-panel', standalone: true, imports: [Highlight], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"prism-jsdoc-panel\">\n @if (!activeComponent()) {\n <div class=\"prism-jsdoc-panel__empty\"> Select a component to view API documentation. </div>\n } @else {\n @if (renderedClassDescription(); as descHtml) {\n <div\n class=\"prism-jsdoc-panel__description\"\n [innerHTML]=\"descHtml\"></div>\n }\n @if (hasTags()) {\n <div class=\"prism-jsdoc-panel__meta\">\n @if (isDeprecated()) {\n <span class=\"prism-jsdoc-panel__badge prism-jsdoc-panel__badge--deprecated\">\n Deprecated{{ deprecatedMessage() ? ': ' + deprecatedMessage() : '' }}\n </span>\n }\n @if (version()) {\n <span class=\"prism-jsdoc-panel__meta-item\">\n <span class=\"prism-jsdoc-panel__meta-label\">Version:</span>\n {{ version() }}\n </span>\n }\n @if (since()) {\n <span class=\"prism-jsdoc-panel__meta-item\">\n <span class=\"prism-jsdoc-panel__meta-label\">Since:</span>\n {{ since() }}\n </span>\n }\n @for (ref of seeRefs(); track $index) {\n <span class=\"prism-jsdoc-panel__meta-item\"> <span class=\"prism-jsdoc-panel__meta-label\">See:</span> {{ ref }} </span>\n }\n </div>\n }\n @if (examples().length) {\n <div class=\"prism-jsdoc-panel__section\">\n <h3 class=\"prism-jsdoc-panel__heading\">Examples</h3>\n @for (example of examples(); track $index) {\n @let parsed = parseExample(example);\n <pre class=\"prism-jsdoc-panel__code\"><code [highlight]=\"parsed.code\" [language]=\"parsed.lang\"></code></pre>\n }\n </div>\n }\n @if (inputs().length) {\n <div class=\"prism-jsdoc-panel__section\">\n <h3 class=\"prism-jsdoc-panel__heading\">Inputs</h3>\n <table class=\"prism-jsdoc-panel__table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Type</th>\n <th>Default</th>\n <th>Required</th>\n <th>Description</th>\n </tr>\n </thead>\n <tbody>\n @for (inp of inputs(); track inp.name) {\n <tr [class.prism-jsdoc-panel__row--deprecated]=\"isMemberDeprecated(inp.name)\">\n <td class=\"prism-jsdoc-panel__cell--name\">\n <code>{{ inp.name }}</code>\n @if (isMemberDeprecated(inp.name)) {\n <span class=\"prism-jsdoc-panel__badge prism-jsdoc-panel__badge--deprecated prism-jsdoc-panel__badge--small\">deprecated</span>\n }\n </td>\n <td class=\"prism-jsdoc-panel__cell--type\">\n <code>{{ inp.rawType ?? inp.type }}</code>\n </td>\n <td class=\"prism-jsdoc-panel__cell--default\">\n @if (inp.defaultValue !== undefined) {\n <code>{{ formatDefault(inp.defaultValue) }}</code>\n } @else {\n <span class=\"prism-jsdoc-panel__muted\">\u2014</span>\n }\n </td>\n <td class=\"prism-jsdoc-panel__cell--required\">\n @if (inp.required) {\n <span class=\"prism-jsdoc-panel__badge prism-jsdoc-panel__badge--required\">required</span>\n } @else {\n <span class=\"prism-jsdoc-panel__muted\">\u2014</span>\n }\n </td>\n <td class=\"prism-jsdoc-panel__cell--doc\">\n @if (inp.doc) {\n <span [innerHTML]=\"renderInline(inp.doc)\"></span>\n }\n @if (getMemberSince(inp.name); as since) {\n @if (inp.doc) {\n <span class=\"prism-jsdoc-panel__since-sep\"> \u00B7 </span>\n }\n <span class=\"prism-jsdoc-panel__since\">Since {{ since }}</span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n @if (outputs().length) {\n <div class=\"prism-jsdoc-panel__section\">\n <h3 class=\"prism-jsdoc-panel__heading\">Outputs</h3>\n <table class=\"prism-jsdoc-panel__table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Description</th>\n </tr>\n </thead>\n <tbody>\n @for (out of outputs(); track out.name) {\n <tr [class.prism-jsdoc-panel__row--deprecated]=\"isMemberDeprecated(out.name)\">\n <td class=\"prism-jsdoc-panel__cell--name\">\n <code>{{ out.name }}</code>\n @if (isMemberDeprecated(out.name)) {\n <span class=\"prism-jsdoc-panel__badge prism-jsdoc-panel__badge--deprecated prism-jsdoc-panel__badge--small\">deprecated</span>\n }\n </td>\n <td class=\"prism-jsdoc-panel__cell--doc\">\n @if (out.doc) {\n <span [innerHTML]=\"renderInline(out.doc)\"></span>\n }\n @if (getMemberSince(out.name); as since) {\n @if (out.doc) {\n <span class=\"prism-jsdoc-panel__since-sep\"> \u00B7 </span>\n }\n <span class=\"prism-jsdoc-panel__since\">Since {{ since }}</span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n @if (methods().length) {\n <div class=\"prism-jsdoc-panel__section\">\n <h3 class=\"prism-jsdoc-panel__heading\">Methods</h3>\n <table class=\"prism-jsdoc-panel__table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Parameters</th>\n <th>Returns</th>\n <th>Description</th>\n </tr>\n </thead>\n <tbody>\n @for (method of methods(); track method.name) {\n <tr [class.prism-jsdoc-panel__row--deprecated]=\"!!method.tags.deprecated\">\n <td class=\"prism-jsdoc-panel__cell--name\">\n <code>{{ method.name }}()</code>\n @if (method.tags.deprecated) {\n <span class=\"prism-jsdoc-panel__badge prism-jsdoc-panel__badge--deprecated prism-jsdoc-panel__badge--small\">deprecated</span>\n }\n </td>\n <td class=\"prism-jsdoc-panel__cell--type\">\n @if (method.params.length) {\n @for (p of method.params; track p.name) {\n <div>\n <code>{{ p.name }}{{ p.type ? ': ' + p.type : '' }}</code>\n </div>\n }\n } @else {\n <span class=\"prism-jsdoc-panel__muted\">\u2014</span>\n }\n </td>\n <td class=\"prism-jsdoc-panel__cell--type\">\n @if (method.returnType) {\n <code>{{ method.returnType }}</code>\n } @else {\n <span class=\"prism-jsdoc-panel__muted\">void</span>\n }\n </td>\n <td class=\"prism-jsdoc-panel__cell--doc\">\n @if (method.description) {\n <span [innerHTML]=\"renderInline(method.description)\"></span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n</div>\n", styles: [":host {\n display: block;\n height: 100%;\n overflow: auto;\n}\n\n.prism-jsdoc-panel {\n max-width: 880px;\n padding: 20px 24px;\n font-family: var(--font-sans);\n font-size: var(--fs-md);\n color: var(--prism-text);\n}\n\n.prism-jsdoc-panel__empty {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 120px;\n color: var(--prism-text-muted);\n}\n\n.prism-jsdoc-panel__description {\n margin: 0 0 18px;\n font-size: 14px;\n line-height: 1.7;\n color: var(--prism-text-2);\n}\n\n.prism-jsdoc-panel__meta {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-bottom: 18px;\n}\n\n.prism-jsdoc-panel__meta-item {\n display: flex;\n gap: 6px;\n align-items: center;\n padding: 3px 9px;\n font-size: var(--fs-sm);\n color: var(--prism-text-2);\n background: var(--prism-input-bg);\n border: 1px solid var(--prism-border);\n border-radius: 4px;\n}\n\n.prism-jsdoc-panel__meta-label {\n font-family: var(--font-mono);\n font-weight: 500;\n color: var(--prism-primary);\n}\n\n.prism-jsdoc-panel__badge {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n font-size: 12px;\n font-weight: 600;\n border-radius: 10px;\n}\n\n.prism-jsdoc-panel__badge--deprecated {\n color: var(--prism-warn);\n background: color-mix(in srgb, var(--prism-warn) 15%, transparent);\n}\n\n.prism-jsdoc-panel__badge--required {\n margin-left: 4px;\n font-weight: 700;\n color: var(--prism-accent);\n}\n\n.prism-jsdoc-panel__badge--small {\n padding: 1px 5px;\n margin-left: 4px;\n font-size: 10px;\n}\n\n.prism-jsdoc-panel__section {\n margin-bottom: 20px;\n}\n\n.prism-jsdoc-panel__heading {\n margin: 22px 0 10px;\n font-size: 11px;\n font-weight: 700;\n color: var(--prism-text-ghost);\n text-transform: uppercase;\n letter-spacing: 0.08em;\n}\n\n.prism-jsdoc-panel__code {\n padding: 0;\n margin: 0 0 8px;\n overflow: auto;\n background: var(--prism-bg-surface);\n border: 1px solid var(--prism-border);\n border-radius: 8px;\n}\n\n.prism-jsdoc-panel__code code {\n display: block;\n padding: 8px 12px;\n font-family: var(--font-mono);\n font-size: var(--fs-sm);\n line-height: 1.5;\n color: var(--prism-text-2);\n background: transparent !important;\n}\n\n:host ::ng-deep .prism-jsdoc-panel__code .hljs {\n color: var(--prism-text-2);\n background: transparent;\n}\n\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-tag,\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-name,\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-selector-tag,\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-keyword,\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-title,\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-title.function_,\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-built_in,\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-type {\n color: var(--prism-code-tag);\n}\n\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-attr,\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-attribute,\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-property,\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-variable,\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-template-variable,\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-params {\n color: var(--prism-code-attr);\n}\n\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-string,\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-doctag,\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-regexp,\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-symbol,\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-number,\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-literal {\n color: var(--prism-code-str);\n}\n\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-comment,\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-quote,\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-meta {\n font-style: italic;\n color: var(--prism-code-com);\n}\n\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-deletion {\n color: var(--prism-danger);\n}\n\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-addition {\n color: var(--prism-success);\n}\n\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-emphasis {\n font-style: italic;\n}\n\n:host ::ng-deep .prism-jsdoc-panel__code .hljs-strong {\n font-weight: 700;\n}\n\n.prism-jsdoc-panel__table {\n width: 100%;\n overflow: hidden;\n font-size: var(--fs-md);\n border-collapse: collapse;\n border: 1px solid var(--prism-border);\n border-radius: 8px;\n}\n\n.prism-jsdoc-panel__table th {\n padding: 8px 12px;\n font-size: 10.5px;\n font-weight: 700;\n color: var(--prism-text-ghost);\n text-align: left;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n background: var(--prism-bg-surface);\n border-bottom: 1px solid var(--prism-border);\n}\n\n.prism-jsdoc-panel__table td {\n padding: 10px 12px;\n vertical-align: top;\n border-bottom: 1px solid var(--prism-border);\n}\n\n.prism-jsdoc-panel__table tr:last-child td {\n border-bottom: 0;\n}\n\n.prism-jsdoc-panel__row--deprecated td {\n opacity: 0.6;\n}\n\n.prism-jsdoc-panel__cell--name code,\n.prism-jsdoc-panel__cell--type code,\n.prism-jsdoc-panel__cell--default code {\n padding: 1px 5px;\n font-family: var(--font-mono);\n font-size: var(--fs-sm);\n color: var(--prism-primary);\n background: color-mix(in srgb, var(--prism-primary) 8%, transparent);\n border-radius: var(--radius-xs);\n}\n\n.prism-jsdoc-panel__muted {\n color: var(--prism-text-muted);\n}\n\n.prism-jsdoc-panel__cell--doc {\n line-height: 1.4;\n color: var(--prism-text);\n}\n\n.prism-jsdoc-panel__since-sep {\n color: var(--prism-text-muted);\n}\n\n.prism-jsdoc-panel__since {\n font-size: var(--fs-sm);\n color: var(--prism-text-muted);\n}\n\n.prism-jsdoc-panel__description :first-child {\n margin-top: 0;\n}\n\n.prism-jsdoc-panel__description :last-child {\n margin-bottom: 0;\n}\n\n.prism-jsdoc-panel__description p {\n margin: 0 0 8px;\n line-height: 1.7;\n}\n\n.prism-jsdoc-panel__description h1,\n.prism-jsdoc-panel__description h2,\n.prism-jsdoc-panel__description h3 {\n margin: 18px 0 8px;\n font-weight: 600;\n line-height: 1.3;\n color: var(--prism-text);\n}\n\n.prism-jsdoc-panel__description h1 {\n font-size: 18px;\n}\n\n.prism-jsdoc-panel__description h2 {\n font-size: 15px;\n}\n\n.prism-jsdoc-panel__description h3 {\n font-size: 11px;\n font-weight: 700;\n color: var(--prism-text-ghost);\n text-transform: uppercase;\n letter-spacing: 0.08em;\n}\n\n.prism-jsdoc-panel__description ul,\n.prism-jsdoc-panel__description ol {\n padding-left: 20px;\n margin: 0 0 8px;\n}\n\n.prism-jsdoc-panel__description li {\n margin: 2px 0;\n line-height: 1.6;\n}\n\n.prism-jsdoc-panel__description a {\n color: var(--prism-primary);\n text-decoration: none;\n}\n\n.prism-jsdoc-panel__description a:hover {\n text-decoration: underline;\n}\n\n.prism-jsdoc-panel__description strong {\n font-weight: 600;\n color: var(--prism-text);\n}\n\n.prism-jsdoc-panel__description code,\n.prism-jsdoc-panel__cell--doc code {\n padding: 1px 5px;\n font-family: var(--font-mono);\n font-size: var(--fs-sm);\n color: var(--prism-primary);\n background: color-mix(in srgb, var(--prism-primary) 8%, transparent);\n border-radius: var(--radius-xs);\n}\n\n.prism-jsdoc-panel__description pre {\n padding: 0;\n margin: 0 0 8px;\n overflow: auto;\n background: var(--prism-bg-surface);\n border: 1px solid var(--prism-border);\n border-radius: 8px;\n}\n\n.prism-jsdoc-panel__description pre code {\n display: block;\n padding: 8px 12px;\n font-family: var(--font-mono);\n font-size: var(--fs-sm);\n line-height: 1.5;\n color: var(--prism-text);\n background: none;\n}\n\n.prism-jsdoc-panel__description blockquote {\n padding: 4px 12px;\n margin: 0 0 8px;\n color: var(--prism-text-2);\n border-left: 3px solid var(--prism-border);\n}\n"] }]
692
487
  }], null, { activeComponent: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeComponent", required: false }] }] }); })();
693
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(JsDocPanelComponent, { className: "JsDocPanelComponent", filePath: "jsdoc-panel.component.ts", lineNumber: 410 }); })();
488
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(JsDocPanelComponent, { className: "JsDocPanelComponent", filePath: "jsdoc-panel.component.ts", lineNumber: 16 }); })();
@@ -1 +1 @@
1
- {"version":3,"file":"jsdoc-plugin.browser.d.ts","sourceRoot":"","sources":["../src/jsdoc-plugin.browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,wBAAgB,WAAW,IAAI,aAAa,CAiB3C"}
1
+ {"version":3,"file":"jsdoc-plugin.browser.d.ts","sourceRoot":"","sources":["../src/jsdoc-plugin.browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,wBAAgB,WAAW,IAAI,aAAa,CAc3C"}
@@ -8,8 +8,8 @@ export function jsDocPlugin() {
8
8
  icon: 'file-text',
9
9
  loadComponent: () => import('./jsdoc-panel.component.js').then((m) => m.JsDocPanelComponent),
10
10
  position: 'bottom',
11
- placement: 'view',
12
- },
13
- ],
11
+ placement: 'view'
12
+ }
13
+ ]
14
14
  };
15
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jsdoc-plugin.d.ts","sourceRoot":"","sources":["../src/jsdoc-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D,wBAAgB,WAAW,IAAI,aAAa,CA2B3C"}
1
+ {"version":3,"file":"jsdoc-plugin.d.ts","sourceRoot":"","sources":["../src/jsdoc-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D,wBAAgB,WAAW,IAAI,aAAa,CAyB3C"}
@@ -3,15 +3,15 @@ export function jsDocPlugin() {
3
3
  return {
4
4
  name: '@ng-prism/plugin-jsdoc',
5
5
  async onComponentScanned(component) {
6
- const jsdoc = extractJsDocData(component.filePath, component.className);
6
+ const jsdoc = extractJsDocData(component.filePath, component.className, component.baseClasses);
7
7
  if (!jsdoc)
8
8
  return;
9
9
  return {
10
10
  ...component,
11
11
  showcaseConfig: {
12
12
  ...component.showcaseConfig,
13
- meta: { ...component.showcaseConfig.meta, jsdoc },
14
- },
13
+ meta: { ...component.showcaseConfig.meta, jsdoc }
14
+ }
15
15
  };
16
16
  },
17
17
  panels: [
@@ -20,8 +20,8 @@ export function jsDocPlugin() {
20
20
  label: 'API',
21
21
  icon: 'file-text',
22
22
  loadComponent: () => import('./jsdoc-panel.component.js').then((m) => m.JsDocPanelComponent),
23
- position: 'bottom',
24
- },
25
- ],
23
+ position: 'bottom'
24
+ }
25
+ ]
26
26
  };
27
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jsdoc.types.d.ts","sourceRoot":"","sources":["../src/jsdoc.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;CACvB"}
1
+ {"version":3,"file":"jsdoc.types.d.ts","sourceRoot":"","sources":["../src/jsdoc.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;CACzB"}
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAQvD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAG3E;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGrE"}
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAUvD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAG3E;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGrE"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/schematics/ng-add/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,IAAI,EAGV,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAyBtD,wBAAgB,KAAK,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAEvD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/schematics/ng-add/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,IAAI,EAAoC,MAAM,4BAA4B,CAAC;AAEhG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAwBtD,wBAAgB,KAAK,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAEvD"}
@@ -1,4 +1,4 @@
1
- import { chain, } from '@angular-devkit/schematics';
1
+ import { chain } from '@angular-devkit/schematics';
2
2
  import { addPluginToConfig } from '@ng-prism/core/schematics/utils';
3
3
  const PLUGIN_IMPORT_NAME = 'jsDocPlugin';
4
4
  const PLUGIN_IMPORT_FROM = '@ng-prism/plugin-jsdoc';
@@ -9,13 +9,13 @@ function injectPlugin(options) {
9
9
  const changed = addPluginToConfig(tree, configPath, {
10
10
  importName: PLUGIN_IMPORT_NAME,
11
11
  importFrom: PLUGIN_IMPORT_FROM,
12
- call: PLUGIN_CALL,
12
+ call: PLUGIN_CALL
13
13
  });
14
14
  if (changed) {
15
- context.logger.info(` ${PLUGIN_IMPORT_FROM} → added to ${configPath}`);
15
+ context.logger.info(` ${PLUGIN_IMPORT_FROM} added to ${configPath}`);
16
16
  }
17
17
  else {
18
- context.logger.info(` ${PLUGIN_IMPORT_FROM} already configured — skipped`);
18
+ context.logger.info(` ${PLUGIN_IMPORT_FROM} already configured, skipped`);
19
19
  }
20
20
  return tree;
21
21
  };
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/schematics/ng-add/schema.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/schematics/ng-add/schema.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ng-prism/plugin-jsdoc",
3
- "version": "22.2.1",
3
+ "version": "22.4.0",
4
4
  "description": "JSDoc API documentation panel for ng-prism.",
5
5
  "ng-add": {
6
6
  "save": "devDependencies"
@@ -36,10 +36,12 @@
36
36
  ],
37
37
  "peerDependencies": {
38
38
  "@angular/core": ">=20.0.0",
39
- "@ng-prism/core": "^22.2.1-0",
39
+ "@ng-prism/core": "^22.4.0-0",
40
40
  "highlight.js": ">=11.0.0",
41
41
  "ngx-highlightjs": ">=14.0.0",
42
- "typescript": ">=5.5.0"
42
+ "typescript": ">=5.5.0",
43
+ "@angular-devkit/schematics": ">=20.0.0",
44
+ "@angular/platform-browser": ">=20.0.0"
43
45
  },
44
46
  "devDependencies": {
45
47
  "@ng-prism/core": "*"
@@ -1,10 +1,10 @@
1
1
  {
2
- "$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json",
3
- "schematics": {
4
- "ng-add": {
5
- "description": "Adds @ng-prism/plugin-jsdoc to the ng-prism config",
6
- "factory": "../dist/schematics/ng-add/index#ngAdd",
7
- "schema": "./ng-add/schema.json"
2
+ "$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json",
3
+ "schematics": {
4
+ "ng-add": {
5
+ "description": "Adds @ng-prism/plugin-jsdoc to the ng-prism config",
6
+ "factory": "../dist/schematics/ng-add/index#ngAdd",
7
+ "schema": "./ng-add/schema.json"
8
+ }
8
9
  }
9
- }
10
10
  }
@@ -1,16 +1,16 @@
1
1
  {
2
- "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "NgPrismPluginJsDocNgAdd",
4
- "title": "Add @ng-prism/plugin-jsdoc",
5
- "description": "Registers @ng-prism/plugin-jsdoc in ng-prism.config.ts",
6
- "type": "object",
7
- "properties": {
8
- "configPath": {
9
- "type": "string",
10
- "description": "Path to ng-prism.config.ts",
11
- "default": "ng-prism.config.ts"
12
- }
13
- },
14
- "required": [],
15
- "additionalProperties": false
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "NgPrismPluginJsDocNgAdd",
4
+ "title": "Add @ng-prism/plugin-jsdoc",
5
+ "description": "Registers @ng-prism/plugin-jsdoc in ng-prism.config.ts",
6
+ "type": "object",
7
+ "properties": {
8
+ "configPath": {
9
+ "type": "string",
10
+ "description": "Path to ng-prism.config.ts",
11
+ "default": "ng-prism.config.ts"
12
+ }
13
+ },
14
+ "required": [],
15
+ "additionalProperties": false
16
16
  }