@akcelik/strct 5.21.0 → 5.22.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.
@@ -29759,6 +29759,13 @@ const STRCT_MD_LIMITS = {
29759
29759
  depth: 8,
29760
29760
  /** Inline delimiter runs considered per text span. */
29761
29761
  delimiters: 2000,
29762
+ /**
29763
+ * How far a closing delimiter or bracket is looked for. Without it every
29764
+ * unmatched opener scanned to the end of the document, once each: a 64 KiB
29765
+ * line of "*a " took 1.6 s to read, and a streamed reply is read again on
29766
+ * every token.
29767
+ */
29768
+ scan: 4096,
29762
29769
  };
29763
29770
  const RULE = /^ {0,3}((\*\s*){3,}|(-\s*){3,}|(_\s*){3,})$/;
29764
29771
  const ATX = /^ {0,3}(#{1,6})\s+(.*?)\s*#*\s*$/;
@@ -29996,9 +30003,10 @@ function parseInlines(source, options = {}) {
29996
30003
  continue;
29997
30004
  }
29998
30005
  }
29999
- // Hard break: two spaces at the end of a line, or a backslash.
30006
+ // Hard break: two spaces at the end of a line, or a backslash — or every
30007
+ // newline, where the consumer asked for GitHub's comment style.
30000
30008
  if (ch === '\n') {
30001
- const hard = buf.endsWith(' ') || buf.endsWith('\\');
30009
+ const hard = options.breaks === true || buf.endsWith(' ') || buf.endsWith('\\');
30002
30010
  buf = buf.replace(/( {2,}|\\)$/, '');
30003
30011
  flush();
30004
30012
  out.push(hard ? { kind: 'break' } : { kind: 'text', text: ' ' });
@@ -30040,13 +30048,39 @@ function parseInlines(source, options = {}) {
30040
30048
  }
30041
30049
  }
30042
30050
  }
30051
+ // A bare URL is a link: a model writes "see https://example.com/x" far
30052
+ // more often than it writes an autolink. Trailing punctuation belongs to
30053
+ // the sentence, not the address.
30054
+ if ((ch === 'h' || ch === 'H') && /^https?:\/\//i.test(source.slice(i, i + 8))) {
30055
+ const match = /^https?:\/\/[^\s<]+/i.exec(source.slice(i));
30056
+ if (match) {
30057
+ let url = match[0];
30058
+ const trail = /[.,;:!?)\]'"]+$/.exec(url);
30059
+ if (trail) {
30060
+ // A closing bracket is part of the address when the URL opened one.
30061
+ const kept = url.slice(0, url.length - trail[0].length);
30062
+ url = kept.includes('(') && trail[0].startsWith(')') ? kept + ')' : kept;
30063
+ }
30064
+ if (url.length > 'https://'.length) {
30065
+ flush();
30066
+ out.push({ kind: 'link', href: url, children: [{ kind: 'text', text: url }] });
30067
+ i += url.length;
30068
+ continue;
30069
+ }
30070
+ }
30071
+ }
30043
30072
  // Emphasis, strong, strikethrough. A delimiter only opens when something
30044
30073
  // follows it immediately and only closes when something precedes it —
30045
30074
  // the flanking rule, which is what keeps "2 * 3 * 4" arithmetic.
30046
30075
  if ((ch === '*' || ch === '_' || ch === '~') && budget-- > 0) {
30047
30076
  const run = new RegExp(`^\\${ch}+`).exec(source.slice(i))[0];
30048
30077
  const len = ch === '~' ? (run.length >= 2 ? 2 : 0) : Math.min(run.length, 2);
30049
- const opens = !/^\s|^$/.test(source.slice(i + run.length, i + run.length + 1) || '');
30078
+ const after = source.slice(i + run.length, i + run.length + 1) || '';
30079
+ const before = i > 0 ? source[i - 1] : '';
30080
+ // An underscore inside a word is a character, not a delimiter — or
30081
+ // `list_inventory for vm_cpu_usage` loses its underscores to emphasis.
30082
+ const intraword = ch === '_' && /[\p{L}\p{N}]/u.test(before) && /[\p{L}\p{N}]/u.test(after);
30083
+ const opens = !/^\s|^$/.test(after) && !intraword;
30050
30084
  if (len && opens) {
30051
30085
  const marker = ch.repeat(len);
30052
30086
  const close = findCloser(source, marker, i + len);
@@ -30075,10 +30109,15 @@ function parseInlines(source, options = {}) {
30075
30109
  * no such closer is not a delimiter at all, it is the character written.
30076
30110
  */
30077
30111
  function findCloser(source, marker, from) {
30112
+ // Bounded: an unmatched delimiter in a long reply used to scan to the end of
30113
+ // the document, once per delimiter — 1.6s for a 64 KiB line of "*a ".
30114
+ const limit = Math.min(source.length, from + STRCT_MD_LIMITS.scan);
30078
30115
  let at = source.indexOf(marker, from);
30079
- while (at !== -1) {
30116
+ while (at !== -1 && at < limit) {
30080
30117
  const before = source[at - 1];
30081
- if (before && !/\s/.test(before))
30118
+ const after = source[at + marker.length] ?? '';
30119
+ const intraword = marker[0] === '_' && /[\p{L}\p{N}]/u.test(before ?? '') && /[\p{L}\p{N}]/u.test(after);
30120
+ if (before && !/\s/.test(before) && !intraword)
30082
30121
  return at;
30083
30122
  at = source.indexOf(marker, at + marker.length);
30084
30123
  }
@@ -30087,7 +30126,8 @@ function findCloser(source, marker, from) {
30087
30126
  /** The index of the `]` matching the `[` at `from`, or -1. */
30088
30127
  function matchBracket(source, from) {
30089
30128
  let depth = 0;
30090
- for (let i = from; i < source.length; i++) {
30129
+ const limit = Math.min(source.length, from + STRCT_MD_LIMITS.scan);
30130
+ for (let i = from; i < limit; i++) {
30091
30131
  if (source[i] === '\\') {
30092
30132
  i++;
30093
30133
  continue;
@@ -30140,7 +30180,7 @@ function applyTokens(text, tokenize) {
30140
30180
  * model wrote: `javascript:`, `data:`, a protocol-relative `//host`, or
30141
30181
  * anything this does not recognise.
30142
30182
  */
30143
- function strctClassifyHref(href) {
30183
+ function strctClassifyHref(href, options = {}) {
30144
30184
  const raw = (href ?? '').trim();
30145
30185
  if (!raw)
30146
30186
  return null;
@@ -30149,10 +30189,16 @@ function strctClassifyHref(href) {
30149
30189
  return null;
30150
30190
  if (/^https?:\/\/[^/]/i.test(raw))
30151
30191
  return 'external';
30152
- if (/^mailto:[^@\s]+@[^@\s]+$/i.test(raw))
30192
+ // mailto: opens a mail client with a subject and a body the model wrote, so
30193
+ // it is something an app says yes to rather than the default.
30194
+ if (options.mailto && /^mailto:[^@\s]+@[^@\s]+$/i.test(raw))
30153
30195
  return 'external';
30154
30196
  if (raw.startsWith('//'))
30155
30197
  return null;
30198
+ // A browser reads a backslash as a slash: "/\evil.example" is an in-app
30199
+ // path to this function and https://evil.example/ to a middle-click.
30200
+ if (/[\\]/.test(raw) || /%5c/i.test(raw))
30201
+ return null;
30156
30202
  if (raw.startsWith('/'))
30157
30203
  return 'internal';
30158
30204
  return null;
@@ -30226,10 +30272,32 @@ class StrctMarkdown {
30226
30272
  /** Claim runs of plain text — an inventory id becomes an object chip. */
30227
30273
  tokens = input(null, /* @ts-ignore */
30228
30274
  ...(ngDevMode ? [{ debugName: "tokens" }] : /* istanbul ignore next */ []));
30275
+ /**
30276
+ * A single newline is a line break, the way a comment box reads: a model
30277
+ * writing "Host: X\nCPU: 40 %" means two lines. Off by default, which is
30278
+ * CommonMark.
30279
+ */
30280
+ breaks = input(false, { ...(ngDevMode ? { debugName: "breaks" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
30281
+ /** What a screen reader hears after an external link (localisable). */
30282
+ newTabLabel = input(' (opens in a new tab)', /* @ts-ignore */
30283
+ ...(ngDevMode ? [{ debugName: "newTabLabel" }] : /* istanbul ignore next */ []));
30284
+ /**
30285
+ * The token templates of the view that nested this one. A list item or a
30286
+ * quote is drawn by a nested view, which has no projected content of its
30287
+ * own — without this its claimed runs fall back to plain text.
30288
+ */
30289
+ inheritedTokens = input([], /* @ts-ignore */
30290
+ ...(ngDevMode ? [{ debugName: "inheritedTokens" }] : /* istanbul ignore next */ []));
30229
30291
  /** An in-app link was followed; the consumer routes it. */
30230
30292
  navigate = output();
30231
- tokenDefs = contentChildren(StrctMarkdownToken, /* @ts-ignore */
30232
- ...(ngDevMode ? [{ debugName: "tokenDefs" }] : /* istanbul ignore next */ []));
30293
+ ownTokenDefs = contentChildren(StrctMarkdownToken, /* @ts-ignore */
30294
+ ...(ngDevMode ? [{ debugName: "ownTokenDefs" }] : /* istanbul ignore next */ []));
30295
+ /** This view's own templates, plus the ones handed down to it. */
30296
+ allTokenDefs = computed(() => {
30297
+ const own = this.ownTokenDefs();
30298
+ return own.length ? own : this.inheritedTokens();
30299
+ }, /* @ts-ignore */
30300
+ ...(ngDevMode ? [{ debugName: "allTokenDefs" }] : /* istanbul ignore next */ []));
30233
30301
  blocks = computed(() => {
30234
30302
  const given = this.tree();
30235
30303
  if (given)
@@ -30237,6 +30305,7 @@ class StrctMarkdown {
30237
30305
  return strctParseMarkdown(this.source(), {
30238
30306
  streaming: this.streaming(),
30239
30307
  tokenize: this.tokens() ?? undefined,
30308
+ breaks: this.breaks(),
30240
30309
  });
30241
30310
  }, /* @ts-ignore */
30242
30311
  ...(ngDevMode ? [{ debugName: "blocks" }] : /* istanbul ignore next */ []));
@@ -30248,7 +30317,7 @@ class StrctMarkdown {
30248
30317
  return own ? own(href) : strctClassifyHref(href);
30249
30318
  }
30250
30319
  tokenTemplate(kind) {
30251
- return this.tokenDefs().find((d) => d.strctMarkdownToken() === kind)?.template ?? null;
30320
+ return this.allTokenDefs().find((d) => d.strctMarkdownToken() === kind)?.template ?? null;
30252
30321
  }
30253
30322
  /** The caret belongs to the last block, and only while streaming. */
30254
30323
  caretOn(index) {
@@ -30263,7 +30332,7 @@ class StrctMarkdown {
30263
30332
  this.navigate.emit(href);
30264
30333
  }
30265
30334
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctMarkdown, deps: [], target: i0.ɵɵFactoryTarget.Component });
30266
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.4", type: StrctMarkdown, isStandalone: true, selector: "strct-markdown", inputs: { source: { classPropertyName: "source", publicName: "source", isSignal: true, isRequired: false, transformFunction: null }, tree: { classPropertyName: "tree", publicName: "tree", isSignal: true, isRequired: false, transformFunction: null }, streaming: { classPropertyName: "streaming", publicName: "streaming", isSignal: true, isRequired: false, transformFunction: null }, headingOffset: { classPropertyName: "headingOffset", publicName: "headingOffset", isSignal: true, isRequired: false, transformFunction: null }, linkPolicy: { classPropertyName: "linkPolicy", publicName: "linkPolicy", isSignal: true, isRequired: false, transformFunction: null }, tokens: { classPropertyName: "tokens", publicName: "tokens", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { navigate: "navigate" }, host: { classAttribute: "strct-md" }, queries: [{ propertyName: "tokenDefs", predicate: StrctMarkdownToken, isSignal: true }], ngImport: i0, template: `
30335
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.4", type: StrctMarkdown, isStandalone: true, selector: "strct-markdown", inputs: { source: { classPropertyName: "source", publicName: "source", isSignal: true, isRequired: false, transformFunction: null }, tree: { classPropertyName: "tree", publicName: "tree", isSignal: true, isRequired: false, transformFunction: null }, streaming: { classPropertyName: "streaming", publicName: "streaming", isSignal: true, isRequired: false, transformFunction: null }, headingOffset: { classPropertyName: "headingOffset", publicName: "headingOffset", isSignal: true, isRequired: false, transformFunction: null }, linkPolicy: { classPropertyName: "linkPolicy", publicName: "linkPolicy", isSignal: true, isRequired: false, transformFunction: null }, tokens: { classPropertyName: "tokens", publicName: "tokens", isSignal: true, isRequired: false, transformFunction: null }, breaks: { classPropertyName: "breaks", publicName: "breaks", isSignal: true, isRequired: false, transformFunction: null }, newTabLabel: { classPropertyName: "newTabLabel", publicName: "newTabLabel", isSignal: true, isRequired: false, transformFunction: null }, inheritedTokens: { classPropertyName: "inheritedTokens", publicName: "inheritedTokens", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { navigate: "navigate" }, host: { classAttribute: "strct-md" }, queries: [{ propertyName: "ownTokenDefs", predicate: StrctMarkdownToken, isSignal: true }], ngImport: i0, template: `
30267
30336
  @for (block of blocks(); track $index) {
30268
30337
  @switch (block.kind) {
30269
30338
  @case ('p') {
@@ -30408,10 +30477,16 @@ class StrctMarkdown {
30408
30477
  <!-- Blocks inside a list item or a quote. -->
30409
30478
  <ng-template #blockRun let-blocks>
30410
30479
  @for (b of blocks; track $index) {
30480
+ <!-- The nested view had no token templates of its own, so a claimed
30481
+ run inside a list item or a quote was drawn as plain text while
30482
+ the same run in a paragraph became a chip. -->
30411
30483
  <strct-markdown
30412
30484
  [tree]="[b]"
30413
30485
  [headingOffset]="headingOffset()"
30414
30486
  [linkPolicy]="linkPolicy()"
30487
+ [tokens]="tokens()"
30488
+ [breaks]="breaks()"
30489
+ [inheritedTokens]="allTokenDefs()"
30415
30490
  (navigate)="navigate.emit($event)"
30416
30491
  />
30417
30492
  }
@@ -30483,6 +30558,7 @@ class StrctMarkdown {
30483
30558
  [size]="11"
30484
30559
  aria-hidden="true"
30485
30560
  />
30561
+ <span class="strct-sr-only">{{ newTabLabel() }}</span>
30486
30562
  </a>
30487
30563
  }
30488
30564
  @case ('internal') {
@@ -30509,7 +30585,7 @@ class StrctMarkdown {
30509
30585
  }
30510
30586
  }
30511
30587
  </ng-template>
30512
- `, isInline: true, styles: [".strct-md{display:block;color:var(--t1);font-size:13px;line-height:1.55}.strct-md__p{margin:0 0 var(--space-2)}.strct-md__p:last-child{margin-bottom:0}.strct-md__h{margin:var(--space-3) 0 var(--space-2);font-size:14px;font-weight:600;color:var(--t1)}.strct-md__h:first-child{margin-top:0}.strct-md__list{margin:0 0 var(--space-2);padding-inline-start:20px}.strct-md__list li{margin-block:2px}.strct-md__quote{margin:0 0 var(--space-2);padding-inline-start:var(--space-3);border-inline-start:2px solid var(--b2);color:var(--t2)}.strct-md__rule{border:0;border-block-start:1px solid var(--b1);margin:var(--space-3) 0}.strct-md__codespan{font-family:var(--mono);font-size:.92em;background:var(--bg-2);border-radius:var(--radius-sm);padding:1px 4px}.strct-md__code{margin-block-end:var(--space-2)}.strct-md__link{color:var(--acc)}.strct-md__ext{margin-inline-start:2px;vertical-align:-1px}.strct-md__tablewrap{overflow-x:auto;margin-block-end:var(--space-2)}.strct-md__table{border-collapse:collapse;width:max-content;min-width:100%}.strct-md__table th,.strct-md__table td{border:1px solid var(--b1);padding:4px 8px;text-align:start}.strct-md__table th{background:var(--bg-2);font-weight:600}.strct-md__caret{display:inline-block;width:2px;height:1em;margin-inline-start:2px;vertical-align:-2px;background:var(--acc);animation:strct-md-caret 1s steps(2) infinite}@keyframes strct-md-caret{50%{opacity:0}}@media(prefers-reduced-motion:reduce){.strct-md__caret{animation:none}}\n"], dependencies: [{ kind: "component", type: StrctMarkdown, selector: "strct-markdown", inputs: ["source", "tree", "streaming", "headingOffset", "linkPolicy", "tokens"], outputs: ["navigate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: StrctCode, selector: "strct-code", inputs: ["code", "title", "language", "copyable", "collapsible", "collapsed", "lineNumbers", "wrap", "maxHeight", "collapseLabel", "expandLabel", "regionLabel"], outputs: ["collapsedChange"] }, { kind: "component", type: StrctIcon, selector: "strct-icon", inputs: ["name", "strictName", "size", "strokeWidth", "badge", "ariaLabel", "count", "countMax", "countStatus", "countLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
30588
+ `, isInline: true, styles: [".strct-md{display:block;color:var(--t1);font-size:13px;line-height:1.55}.strct-md__p{margin:0 0 var(--space-2)}.strct-md__p:last-child{margin-bottom:0}.strct-md__h{margin:var(--space-3) 0 var(--space-2);font-size:14px;font-weight:600;color:var(--t1)}.strct-md__h:first-child{margin-top:0}.strct-md__list{margin:0 0 var(--space-2);padding-inline-start:20px}.strct-md__list li{margin-block:2px}.strct-md__quote{margin:0 0 var(--space-2);padding-inline-start:var(--space-3);border-inline-start:2px solid var(--b2);color:var(--t2)}.strct-md__rule{border:0;border-block-start:1px solid var(--b1);margin:var(--space-3) 0}.strct-md__codespan{font-family:var(--mono);font-size:.92em;background:var(--bg-2);border-radius:var(--radius-sm);padding:1px 4px}.strct-md__code{margin-block-end:var(--space-2)}.strct-md__link{color:var(--acc)}.strct-md__ext{margin-inline-start:2px;vertical-align:-1px}.strct-md__tablewrap{overflow-x:auto;margin-block-end:var(--space-2)}.strct-md__table{border-collapse:collapse;width:max-content;min-width:100%}.strct-md__table th,.strct-md__table td{border:1px solid var(--b1);padding:4px 8px;text-align:start}.strct-md__table th{background:var(--bg-2);font-weight:600}.strct-md__caret{display:inline-block;width:2px;height:1em;margin-inline-start:2px;vertical-align:-2px;background:var(--acc);animation:strct-md-caret 1s steps(2) infinite}@keyframes strct-md-caret{50%{opacity:0}}@media(prefers-reduced-motion:reduce){.strct-md__caret{animation:none}}\n"], dependencies: [{ kind: "component", type: StrctMarkdown, selector: "strct-markdown", inputs: ["source", "tree", "streaming", "headingOffset", "linkPolicy", "tokens", "breaks", "newTabLabel", "inheritedTokens"], outputs: ["navigate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: StrctCode, selector: "strct-code", inputs: ["code", "title", "language", "copyable", "collapsible", "collapsed", "lineNumbers", "wrap", "maxHeight", "collapseLabel", "expandLabel", "regionLabel"], outputs: ["collapsedChange"] }, { kind: "component", type: StrctIcon, selector: "strct-icon", inputs: ["name", "strictName", "size", "strokeWidth", "badge", "ariaLabel", "count", "countMax", "countStatus", "countLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
30513
30589
  }
30514
30590
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImport: i0, type: StrctMarkdown, decorators: [{
30515
30591
  type: Component,
@@ -30658,10 +30734,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
30658
30734
  <!-- Blocks inside a list item or a quote. -->
30659
30735
  <ng-template #blockRun let-blocks>
30660
30736
  @for (b of blocks; track $index) {
30737
+ <!-- The nested view had no token templates of its own, so a claimed
30738
+ run inside a list item or a quote was drawn as plain text while
30739
+ the same run in a paragraph became a chip. -->
30661
30740
  <strct-markdown
30662
30741
  [tree]="[b]"
30663
30742
  [headingOffset]="headingOffset()"
30664
30743
  [linkPolicy]="linkPolicy()"
30744
+ [tokens]="tokens()"
30745
+ [breaks]="breaks()"
30746
+ [inheritedTokens]="allTokenDefs()"
30665
30747
  (navigate)="navigate.emit($event)"
30666
30748
  />
30667
30749
  }
@@ -30733,6 +30815,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
30733
30815
  [size]="11"
30734
30816
  aria-hidden="true"
30735
30817
  />
30818
+ <span class="strct-sr-only">{{ newTabLabel() }}</span>
30736
30819
  </a>
30737
30820
  }
30738
30821
  @case ('internal') {
@@ -30760,7 +30843,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
30760
30843
  }
30761
30844
  </ng-template>
30762
30845
  `, host: { class: 'strct-md' }, styles: [".strct-md{display:block;color:var(--t1);font-size:13px;line-height:1.55}.strct-md__p{margin:0 0 var(--space-2)}.strct-md__p:last-child{margin-bottom:0}.strct-md__h{margin:var(--space-3) 0 var(--space-2);font-size:14px;font-weight:600;color:var(--t1)}.strct-md__h:first-child{margin-top:0}.strct-md__list{margin:0 0 var(--space-2);padding-inline-start:20px}.strct-md__list li{margin-block:2px}.strct-md__quote{margin:0 0 var(--space-2);padding-inline-start:var(--space-3);border-inline-start:2px solid var(--b2);color:var(--t2)}.strct-md__rule{border:0;border-block-start:1px solid var(--b1);margin:var(--space-3) 0}.strct-md__codespan{font-family:var(--mono);font-size:.92em;background:var(--bg-2);border-radius:var(--radius-sm);padding:1px 4px}.strct-md__code{margin-block-end:var(--space-2)}.strct-md__link{color:var(--acc)}.strct-md__ext{margin-inline-start:2px;vertical-align:-1px}.strct-md__tablewrap{overflow-x:auto;margin-block-end:var(--space-2)}.strct-md__table{border-collapse:collapse;width:max-content;min-width:100%}.strct-md__table th,.strct-md__table td{border:1px solid var(--b1);padding:4px 8px;text-align:start}.strct-md__table th{background:var(--bg-2);font-weight:600}.strct-md__caret{display:inline-block;width:2px;height:1em;margin-inline-start:2px;vertical-align:-2px;background:var(--acc);animation:strct-md-caret 1s steps(2) infinite}@keyframes strct-md-caret{50%{opacity:0}}@media(prefers-reduced-motion:reduce){.strct-md__caret{animation:none}}\n"] }]
30763
- }], propDecorators: { source: [{ type: i0.Input, args: [{ isSignal: true, alias: "source", required: false }] }], tree: [{ type: i0.Input, args: [{ isSignal: true, alias: "tree", required: false }] }], streaming: [{ type: i0.Input, args: [{ isSignal: true, alias: "streaming", required: false }] }], headingOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "headingOffset", required: false }] }], linkPolicy: [{ type: i0.Input, args: [{ isSignal: true, alias: "linkPolicy", required: false }] }], tokens: [{ type: i0.Input, args: [{ isSignal: true, alias: "tokens", required: false }] }], navigate: [{ type: i0.Output, args: ["navigate"] }], tokenDefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrctMarkdownToken), { isSignal: true }] }] } });
30846
+ }], propDecorators: { source: [{ type: i0.Input, args: [{ isSignal: true, alias: "source", required: false }] }], tree: [{ type: i0.Input, args: [{ isSignal: true, alias: "tree", required: false }] }], streaming: [{ type: i0.Input, args: [{ isSignal: true, alias: "streaming", required: false }] }], headingOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "headingOffset", required: false }] }], linkPolicy: [{ type: i0.Input, args: [{ isSignal: true, alias: "linkPolicy", required: false }] }], tokens: [{ type: i0.Input, args: [{ isSignal: true, alias: "tokens", required: false }] }], breaks: [{ type: i0.Input, args: [{ isSignal: true, alias: "breaks", required: false }] }], newTabLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "newTabLabel", required: false }] }], inheritedTokens: [{ type: i0.Input, args: [{ isSignal: true, alias: "inheritedTokens", required: false }] }], navigate: [{ type: i0.Output, args: ["navigate"] }], ownTokenDefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StrctMarkdownToken), { isSignal: true }] }] } });
30764
30847
 
30765
30848
  /**
30766
30849
  * The product switcher every multi-product console grows: a chip beside the