@ng-prism/plugin-jsdoc 21.12.0-beta.2 → 21.12.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
@@ -12,12 +12,12 @@ npm install @ng-prism/plugin-jsdoc
12
12
 
13
13
  ### Peer Dependencies
14
14
 
15
- | Package | Version |
16
- |---|---|
17
- | `@ng-prism/core` | `>=21.0.0` |
18
- | `@angular/core` | `>=20.0.0` |
19
- | `typescript` | `>=5.5.0` |
20
- | `highlight.js` | `>=11.0.0` |
15
+ | Package | Version |
16
+ | ----------------- | ---------- |
17
+ | `@ng-prism/core` | `>=21.0.0` |
18
+ | `@angular/core` | `>=20.0.0` |
19
+ | `typescript` | `>=5.5.0` |
20
+ | `highlight.js` | `>=11.0.0` |
21
21
  | `ngx-highlightjs` | `>=14.0.0` |
22
22
 
23
23
  ## Setup
@@ -42,6 +42,42 @@ export default defineConfig({
42
42
  - Outputs table (name, description)
43
43
  - Supported tags: `@deprecated`, `@since`, `@see`, `@example`
44
44
 
45
+ ## Markdown Support
46
+
47
+ JSDoc descriptions are rendered as Markdown:
48
+
49
+ - Headings (`#`, `##`, `###`)
50
+ - Lists (ordered/unordered) and inline code (`` `code` ``)
51
+ - Bold (`**text**`), italic (`*text*`), and links (`[text](url)`)
52
+ - Fenced code blocks with a language hint (` ```html `, ` ```scss ` …)
53
+
54
+ Class descriptions are rendered as block Markdown; input/output/method descriptions are
55
+ rendered inline (no wrapping `<p>`). Existing plain-text descriptions keep working
56
+ unchanged — plain text is valid Markdown.
57
+
58
+ ````typescript
59
+ /**
60
+ * Loading spinner component.
61
+ *
62
+ * ## Size
63
+ *
64
+ * - `small` (4px) — inline indicators
65
+ * - `large` (9px, default) — section-level loading
66
+ *
67
+ * @example
68
+ * ```html
69
+ * <sgui-loading size="small" color="light" />
70
+ * ```
71
+ */
72
+ ````
73
+
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
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
78
+ language set is loaded by default, but additional languages must be registered
79
+ explicitly by the consumer.
80
+
45
81
  ## Example
46
82
 
47
83
  ```typescript
@@ -1,12 +1,16 @@
1
+ import { SafeHtml } from '@angular/platform-browser';
1
2
  import type { InputMeta, OutputMeta } from '@ng-prism/core/plugin';
2
3
  import type { JsDocData, MethodDoc } from './jsdoc.types.js';
4
+ import { type ParsedExample } from './markdown.js';
3
5
  import * as i0 from "@angular/core";
4
6
  export declare class JsDocPanelComponent {
5
7
  readonly activeComponent: import("@angular/core").InputSignal<unknown>;
8
+ private readonly sanitizer;
6
9
  protected readonly jsdocData: import("@angular/core").Signal<JsDocData | null>;
7
10
  protected readonly inputs: import("@angular/core").Signal<InputMeta[]>;
8
11
  protected readonly outputs: import("@angular/core").Signal<OutputMeta[]>;
9
12
  protected readonly classDescription: import("@angular/core").Signal<string | undefined>;
13
+ protected readonly renderedClassDescription: import("@angular/core").Signal<SafeHtml | null>;
10
14
  protected readonly classTags: import("@angular/core").Signal<import("./jsdoc.types.js").JsDocTags>;
11
15
  protected readonly isDeprecated: import("@angular/core").Signal<boolean>;
12
16
  protected readonly deprecatedMessage: import("@angular/core").Signal<string | undefined>;
@@ -18,7 +22,8 @@ export declare class JsDocPanelComponent {
18
22
  protected readonly hasTags: import("@angular/core").Signal<boolean>;
19
23
  protected isMemberDeprecated(name: string): boolean;
20
24
  protected getMemberSince(name: string): string | undefined;
21
- protected memberDocLine(name: string, doc: string | undefined): string;
25
+ protected renderInline(text: string | undefined): SafeHtml;
26
+ protected parseExample(raw: string): ParsedExample;
22
27
  protected formatDefault(value: unknown): string;
23
28
  static ɵfac: i0.ɵɵFactoryDeclaration<JsDocPanelComponent, never>;
24
29
  static ɵcmp: i0.ɵɵComponentDeclaration<JsDocPanelComponent, "prism-jsdoc-panel", never, { "activeComponent": { "alias": "activeComponent"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"jsdoc-panel.component.d.ts","sourceRoot":"","sources":["../src/jsdoc-panel.component.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;;AAE7D,qBAqSa,mBAAmB;IAC9B,QAAQ,CAAC,eAAe,+CAAwB;IAEhD,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;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,0CAExB;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,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM;IAQtE,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;yCAnEpC,mBAAmB;2CAAnB,mBAAmB;CAuE/B"}
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,5 +1,7 @@
1
- import { ChangeDetectionStrategy, Component, computed, input, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, computed, inject, input, } from '@angular/core';
2
+ import { DomSanitizer } from '@angular/platform-browser';
2
3
  import { Highlight } from 'ngx-highlightjs';
4
+ import { parseExample, renderBlockMarkdown, renderInlineMarkdown, } from './markdown.js';
3
5
  import * as i0 from "@angular/core";
4
6
  const _forTrack0 = ($index, $item) => $item.name;
5
7
  function JsDocPanelComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
@@ -8,13 +10,9 @@ function JsDocPanelComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
8
10
  i0.ɵɵelementEnd();
9
11
  } }
10
12
  function JsDocPanelComponent_Conditional_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
11
- i0.ɵɵelementStart(0, "p", 2);
12
- i0.ɵɵtext(1);
13
- i0.ɵɵelementEnd();
13
+ i0.ɵɵelement(0, "div", 2);
14
14
  } if (rf & 2) {
15
- const ctx_r0 = i0.ɵɵnextContext(2);
16
- i0.ɵɵadvance();
17
- i0.ɵɵtextInterpolate(ctx_r0.classDescription());
15
+ i0.ɵɵproperty("innerHTML", ctx, i0.ɵɵsanitizeHtml);
18
16
  } }
19
17
  function JsDocPanelComponent_Conditional_2_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
20
18
  i0.ɵɵelementStart(0, "span", 5);
@@ -82,14 +80,15 @@ function JsDocPanelComponent_Conditional_2_Conditional_2_For_4_Template(rf, ctx)
82
80
  i0.ɵɵelementEnd();
83
81
  } if (rf & 2) {
84
82
  const example_r3 = ctx.$implicit;
83
+ const parsed_r4 = i0.ɵɵnextContext(3).parseExample(example_r3);
85
84
  i0.ɵɵadvance();
86
- i0.ɵɵproperty("highlight", example_r3);
85
+ i0.ɵɵproperty("highlight", parsed_r4.code)("language", parsed_r4.lang);
87
86
  } }
88
87
  function JsDocPanelComponent_Conditional_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
89
88
  i0.ɵɵelementStart(0, "div", 4)(1, "h3", 8);
90
89
  i0.ɵɵtext(2, "Examples");
91
90
  i0.ɵɵelementEnd();
92
- i0.ɵɵrepeaterCreate(3, JsDocPanelComponent_Conditional_2_Conditional_2_For_4_Template, 2, 1, "pre", 9, i0.ɵɵrepeaterTrackByIndex);
91
+ i0.ɵɵrepeaterCreate(3, JsDocPanelComponent_Conditional_2_Conditional_2_For_4_Template, 2, 2, "pre", 9, i0.ɵɵrepeaterTrackByIndex);
93
92
  i0.ɵɵelementEnd();
94
93
  } if (rf & 2) {
95
94
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -106,10 +105,10 @@ function JsDocPanelComponent_Conditional_2_Conditional_3_For_18_Conditional_9_Te
106
105
  i0.ɵɵtext(1);
107
106
  i0.ɵɵelementEnd();
108
107
  } if (rf & 2) {
109
- const inp_r4 = i0.ɵɵnextContext().$implicit;
108
+ const inp_r5 = i0.ɵɵnextContext().$implicit;
110
109
  const ctx_r0 = i0.ɵɵnextContext(3);
111
110
  i0.ɵɵadvance();
112
- i0.ɵɵtextInterpolate(ctx_r0.formatDefault(inp_r4.defaultValue));
111
+ i0.ɵɵtextInterpolate(ctx_r0.formatDefault(inp_r5.defaultValue));
113
112
  } }
114
113
  function JsDocPanelComponent_Conditional_2_Conditional_3_For_18_Conditional_10_Template(rf, ctx) { if (rf & 1) {
115
114
  i0.ɵɵelementStart(0, "span", 17);
@@ -126,6 +125,29 @@ function JsDocPanelComponent_Conditional_2_Conditional_3_For_18_Conditional_13_T
126
125
  i0.ɵɵtext(1, "\u2014");
127
126
  i0.ɵɵelementEnd();
128
127
  } }
128
+ function JsDocPanelComponent_Conditional_2_Conditional_3_For_18_Conditional_15_Template(rf, ctx) { if (rf & 1) {
129
+ i0.ɵɵelement(0, "span", 21);
130
+ } if (rf & 2) {
131
+ const inp_r5 = i0.ɵɵnextContext().$implicit;
132
+ const ctx_r0 = i0.ɵɵnextContext(3);
133
+ i0.ɵɵproperty("innerHTML", ctx_r0.renderInline(inp_r5.doc), i0.ɵɵsanitizeHtml);
134
+ } }
135
+ function JsDocPanelComponent_Conditional_2_Conditional_3_For_18_Conditional_16_Conditional_0_Template(rf, ctx) { if (rf & 1) {
136
+ i0.ɵɵelementStart(0, "span", 22);
137
+ i0.ɵɵtext(1, " \u00B7 ");
138
+ i0.ɵɵelementEnd();
139
+ } }
140
+ function JsDocPanelComponent_Conditional_2_Conditional_3_For_18_Conditional_16_Template(rf, ctx) { if (rf & 1) {
141
+ i0.ɵɵconditionalCreate(0, JsDocPanelComponent_Conditional_2_Conditional_3_For_18_Conditional_16_Conditional_0_Template, 2, 0, "span", 22);
142
+ i0.ɵɵelementStart(1, "span", 23);
143
+ i0.ɵɵtext(2);
144
+ i0.ɵɵelementEnd();
145
+ } if (rf & 2) {
146
+ const inp_r5 = i0.ɵɵnextContext().$implicit;
147
+ i0.ɵɵconditional(inp_r5.doc ? 0 : -1);
148
+ i0.ɵɵadvance(2);
149
+ i0.ɵɵtextInterpolate1("Since ", ctx);
150
+ } }
129
151
  function JsDocPanelComponent_Conditional_2_Conditional_3_For_18_Template(rf, ctx) { if (rf & 1) {
130
152
  i0.ɵɵelementStart(0, "tr")(1, "td", 13)(2, "code");
131
153
  i0.ɵɵtext(3);
@@ -142,24 +164,28 @@ function JsDocPanelComponent_Conditional_2_Conditional_3_For_18_Template(rf, ctx
142
164
  i0.ɵɵconditionalCreate(12, JsDocPanelComponent_Conditional_2_Conditional_3_For_18_Conditional_12_Template, 2, 0, "span", 19)(13, JsDocPanelComponent_Conditional_2_Conditional_3_For_18_Conditional_13_Template, 2, 0, "span", 17);
143
165
  i0.ɵɵelementEnd();
144
166
  i0.ɵɵelementStart(14, "td", 20);
145
- i0.ɵɵtext(15);
167
+ i0.ɵɵconditionalCreate(15, JsDocPanelComponent_Conditional_2_Conditional_3_For_18_Conditional_15_Template, 1, 1, "span", 21);
168
+ i0.ɵɵconditionalCreate(16, JsDocPanelComponent_Conditional_2_Conditional_3_For_18_Conditional_16_Template, 3, 2);
146
169
  i0.ɵɵelementEnd()();
147
170
  } if (rf & 2) {
148
- const inp_r4 = ctx.$implicit;
171
+ let tmp_19_0;
172
+ const inp_r5 = ctx.$implicit;
149
173
  const ctx_r0 = i0.ɵɵnextContext(3);
150
- i0.ɵɵclassProp("prism-jsdoc-panel__row--deprecated", ctx_r0.isMemberDeprecated(inp_r4.name));
174
+ i0.ɵɵclassProp("prism-jsdoc-panel__row--deprecated", ctx_r0.isMemberDeprecated(inp_r5.name));
151
175
  i0.ɵɵadvance(3);
152
- i0.ɵɵtextInterpolate(inp_r4.name);
176
+ i0.ɵɵtextInterpolate(inp_r5.name);
153
177
  i0.ɵɵadvance();
154
- i0.ɵɵconditional(ctx_r0.isMemberDeprecated(inp_r4.name) ? 4 : -1);
178
+ i0.ɵɵconditional(ctx_r0.isMemberDeprecated(inp_r5.name) ? 4 : -1);
155
179
  i0.ɵɵadvance(3);
156
- i0.ɵɵtextInterpolate(inp_r4.rawType ?? inp_r4.type);
180
+ i0.ɵɵtextInterpolate(inp_r5.rawType ?? inp_r5.type);
157
181
  i0.ɵɵadvance(2);
158
- i0.ɵɵconditional(inp_r4.defaultValue !== undefined ? 9 : 10);
182
+ i0.ɵɵconditional(inp_r5.defaultValue !== undefined ? 9 : 10);
159
183
  i0.ɵɵadvance(3);
160
- i0.ɵɵconditional(inp_r4.required ? 12 : 13);
184
+ i0.ɵɵconditional(inp_r5.required ? 12 : 13);
161
185
  i0.ɵɵadvance(3);
162
- i0.ɵɵtextInterpolate1(" ", inp_r4.doc ?? ctx_r0.getMemberSince(inp_r4.name) ? ctx_r0.memberDocLine(inp_r4.name, inp_r4.doc) : "", " ");
186
+ i0.ɵɵconditional(inp_r5.doc ? 15 : -1);
187
+ i0.ɵɵadvance();
188
+ i0.ɵɵconditional((tmp_19_0 = ctx_r0.getMemberSince(inp_r5.name)) ? 16 : -1, tmp_19_0);
163
189
  } }
164
190
  function JsDocPanelComponent_Conditional_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
165
191
  i0.ɵɵelementStart(0, "div", 4)(1, "h3", 8);
@@ -181,7 +207,7 @@ function JsDocPanelComponent_Conditional_2_Conditional_3_Template(rf, ctx) { if
181
207
  i0.ɵɵtext(15, "Description");
182
208
  i0.ɵɵelementEnd()()();
183
209
  i0.ɵɵelementStart(16, "tbody");
184
- i0.ɵɵrepeaterCreate(17, JsDocPanelComponent_Conditional_2_Conditional_3_For_18_Template, 16, 8, "tr", 12, _forTrack0);
210
+ i0.ɵɵrepeaterCreate(17, JsDocPanelComponent_Conditional_2_Conditional_3_For_18_Template, 17, 9, "tr", 12, _forTrack0);
185
211
  i0.ɵɵelementEnd()()();
186
212
  } if (rf & 2) {
187
213
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -193,6 +219,29 @@ function JsDocPanelComponent_Conditional_2_Conditional_4_For_12_Conditional_4_Te
193
219
  i0.ɵɵtext(1, "deprecated");
194
220
  i0.ɵɵelementEnd();
195
221
  } }
222
+ function JsDocPanelComponent_Conditional_2_Conditional_4_For_12_Conditional_6_Template(rf, ctx) { if (rf & 1) {
223
+ i0.ɵɵelement(0, "span", 21);
224
+ } if (rf & 2) {
225
+ const out_r6 = i0.ɵɵnextContext().$implicit;
226
+ const ctx_r0 = i0.ɵɵnextContext(3);
227
+ i0.ɵɵproperty("innerHTML", ctx_r0.renderInline(out_r6.doc), i0.ɵɵsanitizeHtml);
228
+ } }
229
+ function JsDocPanelComponent_Conditional_2_Conditional_4_For_12_Conditional_7_Conditional_0_Template(rf, ctx) { if (rf & 1) {
230
+ i0.ɵɵelementStart(0, "span", 22);
231
+ i0.ɵɵtext(1, " \u00B7 ");
232
+ i0.ɵɵelementEnd();
233
+ } }
234
+ function JsDocPanelComponent_Conditional_2_Conditional_4_For_12_Conditional_7_Template(rf, ctx) { if (rf & 1) {
235
+ i0.ɵɵconditionalCreate(0, JsDocPanelComponent_Conditional_2_Conditional_4_For_12_Conditional_7_Conditional_0_Template, 2, 0, "span", 22);
236
+ i0.ɵɵelementStart(1, "span", 23);
237
+ i0.ɵɵtext(2);
238
+ i0.ɵɵelementEnd();
239
+ } if (rf & 2) {
240
+ const out_r6 = i0.ɵɵnextContext().$implicit;
241
+ i0.ɵɵconditional(out_r6.doc ? 0 : -1);
242
+ i0.ɵɵadvance(2);
243
+ i0.ɵɵtextInterpolate1("Since ", ctx);
244
+ } }
196
245
  function JsDocPanelComponent_Conditional_2_Conditional_4_For_12_Template(rf, ctx) { if (rf & 1) {
197
246
  i0.ɵɵelementStart(0, "tr")(1, "td", 13)(2, "code");
198
247
  i0.ɵɵtext(3);
@@ -200,18 +249,22 @@ function JsDocPanelComponent_Conditional_2_Conditional_4_For_12_Template(rf, ctx
200
249
  i0.ɵɵconditionalCreate(4, JsDocPanelComponent_Conditional_2_Conditional_4_For_12_Conditional_4_Template, 2, 0, "span", 14);
201
250
  i0.ɵɵelementEnd();
202
251
  i0.ɵɵelementStart(5, "td", 20);
203
- i0.ɵɵtext(6);
252
+ i0.ɵɵconditionalCreate(6, JsDocPanelComponent_Conditional_2_Conditional_4_For_12_Conditional_6_Template, 1, 1, "span", 21);
253
+ i0.ɵɵconditionalCreate(7, JsDocPanelComponent_Conditional_2_Conditional_4_For_12_Conditional_7_Template, 3, 2);
204
254
  i0.ɵɵelementEnd()();
205
255
  } if (rf & 2) {
206
- const out_r5 = ctx.$implicit;
256
+ let tmp_16_0;
257
+ const out_r6 = ctx.$implicit;
207
258
  const ctx_r0 = i0.ɵɵnextContext(3);
208
- i0.ɵɵclassProp("prism-jsdoc-panel__row--deprecated", ctx_r0.isMemberDeprecated(out_r5.name));
259
+ i0.ɵɵclassProp("prism-jsdoc-panel__row--deprecated", ctx_r0.isMemberDeprecated(out_r6.name));
209
260
  i0.ɵɵadvance(3);
210
- i0.ɵɵtextInterpolate(out_r5.name);
261
+ i0.ɵɵtextInterpolate(out_r6.name);
211
262
  i0.ɵɵadvance();
212
- i0.ɵɵconditional(ctx_r0.isMemberDeprecated(out_r5.name) ? 4 : -1);
263
+ i0.ɵɵconditional(ctx_r0.isMemberDeprecated(out_r6.name) ? 4 : -1);
213
264
  i0.ɵɵadvance(2);
214
- i0.ɵɵtextInterpolate1(" ", ctx_r0.memberDocLine(out_r5.name, out_r5.doc), " ");
265
+ i0.ɵɵconditional(out_r6.doc ? 6 : -1);
266
+ i0.ɵɵadvance();
267
+ i0.ɵɵconditional((tmp_16_0 = ctx_r0.getMemberSince(out_r6.name)) ? 7 : -1, tmp_16_0);
215
268
  } }
216
269
  function JsDocPanelComponent_Conditional_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
217
270
  i0.ɵɵelementStart(0, "div", 4)(1, "h3", 8);
@@ -224,7 +277,7 @@ function JsDocPanelComponent_Conditional_2_Conditional_4_Template(rf, ctx) { if
224
277
  i0.ɵɵtext(9, "Description");
225
278
  i0.ɵɵelementEnd()()();
226
279
  i0.ɵɵelementStart(10, "tbody");
227
- i0.ɵɵrepeaterCreate(11, JsDocPanelComponent_Conditional_2_Conditional_4_For_12_Template, 7, 5, "tr", 12, _forTrack0);
280
+ i0.ɵɵrepeaterCreate(11, JsDocPanelComponent_Conditional_2_Conditional_4_For_12_Template, 8, 6, "tr", 12, _forTrack0);
228
281
  i0.ɵɵelementEnd()()();
229
282
  } if (rf & 2) {
230
283
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -241,15 +294,15 @@ function JsDocPanelComponent_Conditional_2_Conditional_5_For_16_Conditional_6_Fo
241
294
  i0.ɵɵtext(2);
242
295
  i0.ɵɵelementEnd()();
243
296
  } if (rf & 2) {
244
- const p_r6 = ctx.$implicit;
297
+ const p_r7 = ctx.$implicit;
245
298
  i0.ɵɵadvance(2);
246
- i0.ɵɵtextInterpolate2("", p_r6.name, "", p_r6.type ? ": " + p_r6.type : "");
299
+ i0.ɵɵtextInterpolate2("", p_r7.name, "", p_r7.type ? ": " + p_r7.type : "");
247
300
  } }
248
301
  function JsDocPanelComponent_Conditional_2_Conditional_5_For_16_Conditional_6_Template(rf, ctx) { if (rf & 1) {
249
302
  i0.ɵɵrepeaterCreate(0, JsDocPanelComponent_Conditional_2_Conditional_5_For_16_Conditional_6_For_1_Template, 3, 2, "div", null, _forTrack0);
250
303
  } if (rf & 2) {
251
- const method_r7 = i0.ɵɵnextContext().$implicit;
252
- i0.ɵɵrepeater(method_r7.params);
304
+ const method_r8 = i0.ɵɵnextContext().$implicit;
305
+ i0.ɵɵrepeater(method_r8.params);
253
306
  } }
254
307
  function JsDocPanelComponent_Conditional_2_Conditional_5_For_16_Conditional_7_Template(rf, ctx) { if (rf & 1) {
255
308
  i0.ɵɵelementStart(0, "span", 17);
@@ -261,15 +314,22 @@ function JsDocPanelComponent_Conditional_2_Conditional_5_For_16_Conditional_9_Te
261
314
  i0.ɵɵtext(1);
262
315
  i0.ɵɵelementEnd();
263
316
  } if (rf & 2) {
264
- const method_r7 = i0.ɵɵnextContext().$implicit;
317
+ const method_r8 = i0.ɵɵnextContext().$implicit;
265
318
  i0.ɵɵadvance();
266
- i0.ɵɵtextInterpolate(method_r7.returnType);
319
+ i0.ɵɵtextInterpolate(method_r8.returnType);
267
320
  } }
268
321
  function JsDocPanelComponent_Conditional_2_Conditional_5_For_16_Conditional_10_Template(rf, ctx) { if (rf & 1) {
269
322
  i0.ɵɵelementStart(0, "span", 17);
270
323
  i0.ɵɵtext(1, "void");
271
324
  i0.ɵɵelementEnd();
272
325
  } }
326
+ function JsDocPanelComponent_Conditional_2_Conditional_5_For_16_Conditional_12_Template(rf, ctx) { if (rf & 1) {
327
+ i0.ɵɵelement(0, "span", 21);
328
+ } if (rf & 2) {
329
+ const method_r8 = i0.ɵɵnextContext().$implicit;
330
+ const ctx_r0 = i0.ɵɵnextContext(3);
331
+ i0.ɵɵproperty("innerHTML", ctx_r0.renderInline(method_r8.description), i0.ɵɵsanitizeHtml);
332
+ } }
273
333
  function JsDocPanelComponent_Conditional_2_Conditional_5_For_16_Template(rf, ctx) { if (rf & 1) {
274
334
  i0.ɵɵelementStart(0, "tr")(1, "td", 13)(2, "code");
275
335
  i0.ɵɵtext(3);
@@ -283,21 +343,21 @@ function JsDocPanelComponent_Conditional_2_Conditional_5_For_16_Template(rf, ctx
283
343
  i0.ɵɵconditionalCreate(9, JsDocPanelComponent_Conditional_2_Conditional_5_For_16_Conditional_9_Template, 2, 1, "code")(10, JsDocPanelComponent_Conditional_2_Conditional_5_For_16_Conditional_10_Template, 2, 0, "span", 17);
284
344
  i0.ɵɵelementEnd();
285
345
  i0.ɵɵelementStart(11, "td", 20);
286
- i0.ɵɵtext(12);
346
+ i0.ɵɵconditionalCreate(12, JsDocPanelComponent_Conditional_2_Conditional_5_For_16_Conditional_12_Template, 1, 1, "span", 21);
287
347
  i0.ɵɵelementEnd()();
288
348
  } if (rf & 2) {
289
- const method_r7 = ctx.$implicit;
290
- i0.ɵɵclassProp("prism-jsdoc-panel__row--deprecated", !!method_r7.tags.deprecated);
349
+ const method_r8 = ctx.$implicit;
350
+ i0.ɵɵclassProp("prism-jsdoc-panel__row--deprecated", !!method_r8.tags.deprecated);
291
351
  i0.ɵɵadvance(3);
292
- i0.ɵɵtextInterpolate1("", method_r7.name, "()");
352
+ i0.ɵɵtextInterpolate1("", method_r8.name, "()");
293
353
  i0.ɵɵadvance();
294
- i0.ɵɵconditional(method_r7.tags.deprecated ? 4 : -1);
354
+ i0.ɵɵconditional(method_r8.tags.deprecated ? 4 : -1);
295
355
  i0.ɵɵadvance(2);
296
- i0.ɵɵconditional(method_r7.params.length ? 6 : 7);
356
+ i0.ɵɵconditional(method_r8.params.length ? 6 : 7);
297
357
  i0.ɵɵadvance(3);
298
- i0.ɵɵconditional(method_r7.returnType ? 9 : 10);
358
+ i0.ɵɵconditional(method_r8.returnType ? 9 : 10);
299
359
  i0.ɵɵadvance(3);
300
- i0.ɵɵtextInterpolate1(" ", method_r7.description ?? "", " ");
360
+ i0.ɵɵconditional(method_r8.description ? 12 : -1);
301
361
  } }
302
362
  function JsDocPanelComponent_Conditional_2_Conditional_5_Template(rf, ctx) { if (rf & 1) {
303
363
  i0.ɵɵelementStart(0, "div", 4)(1, "h3", 8);
@@ -324,15 +384,16 @@ function JsDocPanelComponent_Conditional_2_Conditional_5_Template(rf, ctx) { if
324
384
  i0.ɵɵrepeater(ctx_r0.methods());
325
385
  } }
326
386
  function JsDocPanelComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
327
- i0.ɵɵconditionalCreate(0, JsDocPanelComponent_Conditional_2_Conditional_0_Template, 2, 1, "p", 2);
387
+ i0.ɵɵconditionalCreate(0, JsDocPanelComponent_Conditional_2_Conditional_0_Template, 1, 1, "div", 2);
328
388
  i0.ɵɵconditionalCreate(1, JsDocPanelComponent_Conditional_2_Conditional_1_Template, 6, 3, "div", 3);
329
389
  i0.ɵɵconditionalCreate(2, JsDocPanelComponent_Conditional_2_Conditional_2_Template, 5, 0, "div", 4);
330
390
  i0.ɵɵconditionalCreate(3, JsDocPanelComponent_Conditional_2_Conditional_3_Template, 19, 0, "div", 4);
331
391
  i0.ɵɵconditionalCreate(4, JsDocPanelComponent_Conditional_2_Conditional_4_Template, 13, 0, "div", 4);
332
392
  i0.ɵɵconditionalCreate(5, JsDocPanelComponent_Conditional_2_Conditional_5_Template, 17, 0, "div", 4);
333
393
  } if (rf & 2) {
394
+ let tmp_1_0;
334
395
  const ctx_r0 = i0.ɵɵnextContext();
335
- i0.ɵɵconditional(ctx_r0.classDescription() ? 0 : -1);
396
+ i0.ɵɵconditional((tmp_1_0 = ctx_r0.renderedClassDescription()) ? 0 : -1, tmp_1_0);
336
397
  i0.ɵɵadvance();
337
398
  i0.ɵɵconditional(ctx_r0.hasTags() ? 1 : -1);
338
399
  i0.ɵɵadvance();
@@ -346,6 +407,7 @@ function JsDocPanelComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
346
407
  } }
347
408
  export class JsDocPanelComponent {
348
409
  activeComponent = input(null, ...(ngDevMode ? [{ debugName: "activeComponent" }] : []));
410
+ sanitizer = inject(DomSanitizer);
349
411
  jsdocData = computed(() => {
350
412
  const comp = this.activeComponent();
351
413
  return comp?.meta?.showcaseConfig?.meta?.['jsdoc'] ?? null;
@@ -359,6 +421,12 @@ export class JsDocPanelComponent {
359
421
  return comp?.meta?.outputs ?? [];
360
422
  }, ...(ngDevMode ? [{ debugName: "outputs" }] : []));
361
423
  classDescription = computed(() => this.jsdocData()?.classDescription, ...(ngDevMode ? [{ debugName: "classDescription" }] : []));
424
+ // Source is component-author JSDoc compiled into the manifest at build time,
425
+ // not user input — bypassing sanitization is safe here.
426
+ renderedClassDescription = computed(() => {
427
+ const html = renderBlockMarkdown(this.classDescription());
428
+ return html ? this.sanitizer.bypassSecurityTrustHtml(html) : null;
429
+ }, ...(ngDevMode ? [{ debugName: "renderedClassDescription" }] : []));
362
430
  classTags = computed(() => this.jsdocData()?.classTags ?? {}, ...(ngDevMode ? [{ debugName: "classTags" }] : []));
363
431
  isDeprecated = computed(() => !!this.classTags().deprecated, ...(ngDevMode ? [{ debugName: "isDeprecated" }] : []));
364
432
  deprecatedMessage = computed(() => {
@@ -370,21 +438,21 @@ export class JsDocPanelComponent {
370
438
  seeRefs = computed(() => this.classTags().see ?? [], ...(ngDevMode ? [{ debugName: "seeRefs" }] : []));
371
439
  examples = computed(() => this.classTags().example ?? [], ...(ngDevMode ? [{ debugName: "examples" }] : []));
372
440
  methods = computed(() => this.jsdocData()?.methods ?? [], ...(ngDevMode ? [{ debugName: "methods" }] : []));
373
- hasTags = computed(() => this.isDeprecated() || !!this.since() || !!this.version() || this.seeRefs().length > 0, ...(ngDevMode ? [{ debugName: "hasTags" }] : []));
441
+ hasTags = computed(() => this.isDeprecated() ||
442
+ !!this.since() ||
443
+ !!this.version() ||
444
+ this.seeRefs().length > 0, ...(ngDevMode ? [{ debugName: "hasTags" }] : []));
374
445
  isMemberDeprecated(name) {
375
446
  return !!this.jsdocData()?.memberTags[name]?.deprecated;
376
447
  }
377
448
  getMemberSince(name) {
378
449
  return this.jsdocData()?.memberTags[name]?.since;
379
450
  }
380
- memberDocLine(name, doc) {
381
- const parts = [];
382
- if (doc)
383
- parts.push(doc);
384
- const since = this.getMemberSince(name);
385
- if (since)
386
- parts.push(`Since ${since}`);
387
- return parts.join(' · ');
451
+ renderInline(text) {
452
+ return this.sanitizer.bypassSecurityTrustHtml(renderInlineMarkdown(text));
453
+ }
454
+ parseExample(raw) {
455
+ return parseExample(raw);
388
456
  }
389
457
  formatDefault(value) {
390
458
  if (typeof value === 'string')
@@ -392,14 +460,14 @@ export class JsDocPanelComponent {
392
460
  return String(value);
393
461
  }
394
462
  static ɵfac = function JsDocPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || JsDocPanelComponent)(); };
395
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: JsDocPanelComponent, selectors: [["prism-jsdoc-panel"]], inputs: { activeComponent: [1, "activeComponent"] }, decls: 3, vars: 1, consts: [[1, "prism-jsdoc-panel"], [1, "prism-jsdoc-panel__empty"], [1, "prism-jsdoc-panel__description"], [1, "prism-jsdoc-panel__meta"], [1, "prism-jsdoc-panel__section"], [1, "prism-jsdoc-panel__badge", "prism-jsdoc-panel__badge--deprecated"], [1, "prism-jsdoc-panel__meta-item"], [1, "prism-jsdoc-panel__meta-label"], [1, "prism-jsdoc-panel__heading"], [1, "prism-jsdoc-panel__code"], ["language", "typescript", 3, "highlight"], [1, "prism-jsdoc-panel__table"], [3, "prism-jsdoc-panel__row--deprecated"], [1, "prism-jsdoc-panel__cell--name"], [1, "prism-jsdoc-panel__badge", "prism-jsdoc-panel__badge--deprecated", "prism-jsdoc-panel__badge--small"], [1, "prism-jsdoc-panel__cell--type"], [1, "prism-jsdoc-panel__cell--default"], [1, "prism-jsdoc-panel__muted"], [1, "prism-jsdoc-panel__cell--required"], [1, "prism-jsdoc-panel__badge", "prism-jsdoc-panel__badge--required"], [1, "prism-jsdoc-panel__cell--doc"]], template: function JsDocPanelComponent_Template(rf, ctx) { if (rf & 1) {
463
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: JsDocPanelComponent, selectors: [["prism-jsdoc-panel"]], inputs: { activeComponent: [1, "activeComponent"] }, decls: 3, vars: 1, consts: [[1, "prism-jsdoc-panel"], [1, "prism-jsdoc-panel__empty"], [1, "prism-jsdoc-panel__description", 3, "innerHTML"], [1, "prism-jsdoc-panel__meta"], [1, "prism-jsdoc-panel__section"], [1, "prism-jsdoc-panel__badge", "prism-jsdoc-panel__badge--deprecated"], [1, "prism-jsdoc-panel__meta-item"], [1, "prism-jsdoc-panel__meta-label"], [1, "prism-jsdoc-panel__heading"], [1, "prism-jsdoc-panel__code"], [3, "highlight", "language"], [1, "prism-jsdoc-panel__table"], [3, "prism-jsdoc-panel__row--deprecated"], [1, "prism-jsdoc-panel__cell--name"], [1, "prism-jsdoc-panel__badge", "prism-jsdoc-panel__badge--deprecated", "prism-jsdoc-panel__badge--small"], [1, "prism-jsdoc-panel__cell--type"], [1, "prism-jsdoc-panel__cell--default"], [1, "prism-jsdoc-panel__muted"], [1, "prism-jsdoc-panel__cell--required"], [1, "prism-jsdoc-panel__badge", "prism-jsdoc-panel__badge--required"], [1, "prism-jsdoc-panel__cell--doc"], [3, "innerHTML"], [1, "prism-jsdoc-panel__since-sep"], [1, "prism-jsdoc-panel__since"]], template: function JsDocPanelComponent_Template(rf, ctx) { if (rf & 1) {
396
464
  i0.ɵɵelementStart(0, "div", 0);
397
465
  i0.ɵɵconditionalCreate(1, JsDocPanelComponent_Conditional_1_Template, 2, 0, "div", 1)(2, JsDocPanelComponent_Conditional_2_Template, 6, 6);
398
466
  i0.ɵɵelementEnd();
399
467
  } if (rf & 2) {
400
468
  i0.ɵɵadvance();
401
469
  i0.ɵɵconditional(!ctx.activeComponent() ? 1 : 2);
402
- } }, 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(--font-sans);\n font-size: var(--fs-md);\n color: var(--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(--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(--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(--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[_ngcontent-%COMP%] {\n font-weight: 500; color: var(--prism-primary);\n font-family: var(--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(--prism-warn) 15%, transparent);\n color: var(--prism-warn);\n }\n .prism-jsdoc-panel__badge--required[_ngcontent-%COMP%] {\n color: var(--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(--prism-text-ghost);\n }\n .prism-jsdoc-panel__code[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n font-family: var(--font-mono);\n font-size: var(--fs-sm); line-height: 1.5;\n padding: 8px 12px; display: block;\n }\n .prism-jsdoc-panel__table[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 12px;\n border-bottom: 1px solid var(--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(--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[_ngcontent-%COMP%] { color: var(--prism-text-muted); }\n .prism-jsdoc-panel__cell--doc[_ngcontent-%COMP%] { color: var(--prism-text); line-height: 1.4; }"], changeDetection: 0 });
470
+ } }, 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(--font-sans);\n font-size: var(--fs-md);\n color: var(--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(--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(--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(--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[_ngcontent-%COMP%] {\n font-weight: 500; color: var(--prism-primary);\n font-family: var(--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(--prism-warn) 15%, transparent);\n color: var(--prism-warn);\n }\n .prism-jsdoc-panel__badge--required[_ngcontent-%COMP%] {\n color: var(--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(--prism-text-ghost);\n }\n .prism-jsdoc-panel__code[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\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 [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs { background: transparent; color: var(--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(--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(--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(--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(--prism-code-com); font-style: italic; }\n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-deletion { color: var(--prism-danger); }\n [_nghost-%COMP%] .prism-jsdoc-panel__code .hljs-addition { color: var(--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(--fs-md);\n border: 1px solid var(--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(--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[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 12px;\n border-bottom: 1px solid var(--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(--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[_ngcontent-%COMP%] { color: var(--prism-text-muted); }\n .prism-jsdoc-panel__cell--doc[_ngcontent-%COMP%] { color: var(--prism-text); line-height: 1.4; }\n .prism-jsdoc-panel__since-sep[_ngcontent-%COMP%] { color: var(--prism-text-muted); }\n .prism-jsdoc-panel__since[_ngcontent-%COMP%] { color: var(--prism-text-muted); font-size: var(--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(--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(--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(--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(--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(--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[_ngcontent-%COMP%] pre[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] pre[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] blockquote[_ngcontent-%COMP%] {\n margin: 0 0 8px;\n padding: 4px 12px;\n border-left: 3px solid var(--prism-border);\n color: var(--prism-text-2);\n }"], changeDetection: 0 });
403
471
  }
404
472
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(JsDocPanelComponent, [{
405
473
  type: Component,
@@ -409,8 +477,8 @@ export class JsDocPanelComponent {
409
477
  <div class="prism-jsdoc-panel__empty">
410
478
  Select a component to view API documentation.
411
479
  </div>
412
- } @else { @if (classDescription()) {
413
- <p class="prism-jsdoc-panel__description">{{ classDescription() }}</p>
480
+ } @else { @if (renderedClassDescription(); as descHtml) {
481
+ <div class="prism-jsdoc-panel__description" [innerHTML]="descHtml"></div>
414
482
  } @if (hasTags()) {
415
483
  <div class="prism-jsdoc-panel__meta">
416
484
  @if (isDeprecated()) {
@@ -438,10 +506,11 @@ export class JsDocPanelComponent {
438
506
  } @if (examples().length) {
439
507
  <div class="prism-jsdoc-panel__section">
440
508
  <h3 class="prism-jsdoc-panel__heading">Examples</h3>
441
- @for (example of examples(); track $index) {
509
+ @for (example of examples(); track $index) { @let parsed =
510
+ parseExample(example);
442
511
  <pre
443
512
  class="prism-jsdoc-panel__code"
444
- ><code [highlight]="example" language="typescript"></code></pre>
513
+ ><code [highlight]="parsed.code" [language]="parsed.lang"></code></pre>
445
514
  }
446
515
  </div>
447
516
  } @if (inputs().length) {
@@ -494,11 +563,13 @@ export class JsDocPanelComponent {
494
563
  }
495
564
  </td>
496
565
  <td class="prism-jsdoc-panel__cell--doc">
497
- {{
498
- inp.doc ?? getMemberSince(inp.name)
499
- ? memberDocLine(inp.name, inp.doc)
500
- : ''
501
- }}
566
+ @if (inp.doc) {
567
+ <span [innerHTML]="renderInline(inp.doc)"></span>
568
+ } @if (getMemberSince(inp.name); as since) { @if (inp.doc) {
569
+ <span class="prism-jsdoc-panel__since-sep"> · </span>
570
+ }
571
+ <span class="prism-jsdoc-panel__since">Since {{ since }}</span>
572
+ }
502
573
  </td>
503
574
  </tr>
504
575
  }
@@ -532,7 +603,13 @@ export class JsDocPanelComponent {
532
603
  }
533
604
  </td>
534
605
  <td class="prism-jsdoc-panel__cell--doc">
535
- {{ memberDocLine(out.name, out.doc) }}
606
+ @if (out.doc) {
607
+ <span [innerHTML]="renderInline(out.doc)"></span>
608
+ } @if (getMemberSince(out.name); as since) { @if (out.doc) {
609
+ <span class="prism-jsdoc-panel__since-sep"> · </span>
610
+ }
611
+ <span class="prism-jsdoc-panel__since">Since {{ since }}</span>
612
+ }
536
613
  </td>
537
614
  </tr>
538
615
  }
@@ -585,7 +662,9 @@ export class JsDocPanelComponent {
585
662
  }
586
663
  </td>
587
664
  <td class="prism-jsdoc-panel__cell--doc">
588
- {{ method.description ?? '' }}
665
+ @if (method.description) {
666
+ <span [innerHTML]="renderInline(method.description)"></span>
667
+ }
589
668
  </td>
590
669
  </tr>
591
670
  }
@@ -594,6 +673,6 @@ export class JsDocPanelComponent {
594
673
  </div>
595
674
  } }
596
675
  </div>
597
- `, 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 }\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 "] }]
676
+ `, 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 "] }]
598
677
  }], null, { activeComponent: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeComponent", required: false }] }] }); })();
599
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(JsDocPanelComponent, { className: "JsDocPanelComponent", filePath: "jsdoc-panel.component.ts", lineNumber: 304 }); })();
678
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(JsDocPanelComponent, { className: "JsDocPanelComponent", filePath: "jsdoc-panel.component.ts", lineNumber: 410 }); })();
@@ -0,0 +1,8 @@
1
+ export interface ParsedExample {
2
+ lang: string;
3
+ code: string;
4
+ }
5
+ export declare function parseExample(raw: string): ParsedExample;
6
+ export declare function renderBlockMarkdown(text: string | undefined): string | null;
7
+ export declare function renderInlineMarkdown(text: string | undefined): string;
8
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,22 @@
1
+ import { marked } from 'marked';
2
+ marked.setOptions({ gfm: true, breaks: false });
3
+ const FENCE_RE = /^```([^\n`]*)\n([\s\S]*?)\n?```$/;
4
+ export function parseExample(raw) {
5
+ const trimmed = raw.trim();
6
+ const match = FENCE_RE.exec(trimmed);
7
+ if (!match) {
8
+ return { lang: 'typescript', code: raw };
9
+ }
10
+ const lang = match[1].trim() || 'typescript';
11
+ return { lang, code: match[2] };
12
+ }
13
+ export function renderBlockMarkdown(text) {
14
+ if (!text)
15
+ return null;
16
+ return marked.parse(text, { async: false });
17
+ }
18
+ export function renderInlineMarkdown(text) {
19
+ if (!text)
20
+ return '';
21
+ return marked.parseInline(text, { async: false });
22
+ }
@@ -0,0 +1,4 @@
1
+ import { type Rule } from '@angular-devkit/schematics';
2
+ import type { NgAddSchemaOptions } from './schema.js';
3
+ export declare function ngAdd(options: NgAddSchemaOptions): Rule;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,25 @@
1
+ import { chain, } from '@angular-devkit/schematics';
2
+ import { addPluginToConfig } from '@ng-prism/core/schematics/utils';
3
+ const PLUGIN_IMPORT_NAME = 'jsDocPlugin';
4
+ const PLUGIN_IMPORT_FROM = '@ng-prism/plugin-jsdoc';
5
+ const PLUGIN_CALL = 'jsDocPlugin()';
6
+ function injectPlugin(options) {
7
+ return (tree, context) => {
8
+ const configPath = options.configPath ?? 'ng-prism.config.ts';
9
+ const changed = addPluginToConfig(tree, configPath, {
10
+ importName: PLUGIN_IMPORT_NAME,
11
+ importFrom: PLUGIN_IMPORT_FROM,
12
+ call: PLUGIN_CALL,
13
+ });
14
+ if (changed) {
15
+ context.logger.info(` ${PLUGIN_IMPORT_FROM} → added to ${configPath}`);
16
+ }
17
+ else {
18
+ context.logger.info(` ${PLUGIN_IMPORT_FROM} already configured — skipped`);
19
+ }
20
+ return tree;
21
+ };
22
+ }
23
+ export function ngAdd(options) {
24
+ return chain([injectPlugin(options)]);
25
+ }
@@ -0,0 +1,4 @@
1
+ export interface NgAddSchemaOptions {
2
+ configPath?: string;
3
+ }
4
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,7 +1,11 @@
1
1
  {
2
2
  "name": "@ng-prism/plugin-jsdoc",
3
- "version": "21.12.0-beta.2",
3
+ "version": "21.12.0",
4
4
  "description": "JSDoc API documentation panel for ng-prism.",
5
+ "ng-add": {
6
+ "save": "devDependencies"
7
+ },
8
+ "schematics": "./schematics/collection.json",
5
9
  "keywords": [
6
10
  "@ng-prism/core",
7
11
  "jsdoc",
@@ -27,19 +31,21 @@
27
31
  },
28
32
  "files": [
29
33
  "dist",
34
+ "schematics",
30
35
  "!**/*.tsbuildinfo"
31
36
  ],
32
37
  "peerDependencies": {
33
38
  "@angular/core": ">=21.0.0",
34
- "typescript": ">=5.5.0",
39
+ "@ng-prism/core": "^21.12.0-0",
35
40
  "highlight.js": ">=11.0.0",
36
41
  "ngx-highlightjs": ">=14.0.0",
37
- "@ng-prism/core": "^21.12.0-0"
42
+ "typescript": ">=5.5.0"
38
43
  },
39
44
  "devDependencies": {
40
45
  "@ng-prism/core": "*"
41
46
  },
42
47
  "dependencies": {
48
+ "marked": "^15.0.12",
43
49
  "tslib": "^2.3.0"
44
50
  },
45
51
  "repository": {
@@ -0,0 +1,10 @@
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"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,16 @@
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
16
+ }