@ng-doc/app 22.1.0 → 22.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/LICENSE +21 -0
  2. package/fesm2022/ng-doc-app-classes-content-controller.mjs +22 -4
  3. package/fesm2022/ng-doc-app-classes-content-controller.mjs.map +1 -1
  4. package/fesm2022/ng-doc-app-classes-default-search-engine.mjs +36 -12
  5. package/fesm2022/ng-doc-app-classes-default-search-engine.mjs.map +1 -1
  6. package/fesm2022/ng-doc-app-classes-root-page.mjs.map +1 -1
  7. package/fesm2022/ng-doc-app-components-api-list.mjs +7 -5
  8. package/fesm2022/ng-doc-app-components-api-list.mjs.map +1 -1
  9. package/fesm2022/ng-doc-app-components-breadcrumb.mjs +5 -3
  10. package/fesm2022/ng-doc-app-components-breadcrumb.mjs.map +1 -1
  11. package/fesm2022/ng-doc-app-components-code.mjs +6 -4
  12. package/fesm2022/ng-doc-app-components-code.mjs.map +1 -1
  13. package/fesm2022/ng-doc-app-components-command-palette.mjs +35 -27
  14. package/fesm2022/ng-doc-app-components-command-palette.mjs.map +1 -1
  15. package/fesm2022/ng-doc-app-components-copy-button.mjs +6 -4
  16. package/fesm2022/ng-doc-app-components-copy-button.mjs.map +1 -1
  17. package/fesm2022/ng-doc-app-components-demo-displayer.mjs +19 -4
  18. package/fesm2022/ng-doc-app-components-demo-displayer.mjs.map +1 -1
  19. package/fesm2022/ng-doc-app-components-demo-frame.mjs +195 -12
  20. package/fesm2022/ng-doc-app-components-demo-frame.mjs.map +1 -1
  21. package/fesm2022/ng-doc-app-components-demo-pane.mjs +2 -2
  22. package/fesm2022/ng-doc-app-components-demo-pane.mjs.map +1 -1
  23. package/fesm2022/ng-doc-app-components-demo.mjs +49 -12
  24. package/fesm2022/ng-doc-app-components-demo.mjs.map +1 -1
  25. package/fesm2022/ng-doc-app-components-fullscreen-button.mjs +5 -3
  26. package/fesm2022/ng-doc-app-components-fullscreen-button.mjs.map +1 -1
  27. package/fesm2022/ng-doc-app-components-fullscreen-toggle.mjs +4 -2
  28. package/fesm2022/ng-doc-app-components-fullscreen-toggle.mjs.map +1 -1
  29. package/fesm2022/ng-doc-app-components-heading-anchor.mjs +5 -3
  30. package/fesm2022/ng-doc-app-components-heading-anchor.mjs.map +1 -1
  31. package/fesm2022/ng-doc-app-components-image-viewer.mjs +5 -3
  32. package/fesm2022/ng-doc-app-components-image-viewer.mjs.map +1 -1
  33. package/fesm2022/ng-doc-app-components-navbar.mjs +4 -2
  34. package/fesm2022/ng-doc-app-components-navbar.mjs.map +1 -1
  35. package/fesm2022/ng-doc-app-components-page-navigation.mjs +5 -3
  36. package/fesm2022/ng-doc-app-components-page-navigation.mjs.map +1 -1
  37. package/fesm2022/ng-doc-app-components-page-wrapper.mjs +2 -2
  38. package/fesm2022/ng-doc-app-components-page-wrapper.mjs.map +1 -1
  39. package/fesm2022/ng-doc-app-components-page.mjs +83 -16
  40. package/fesm2022/ng-doc-app-components-page.mjs.map +1 -1
  41. package/fesm2022/ng-doc-app-components-playground.mjs +743 -108
  42. package/fesm2022/ng-doc-app-components-playground.mjs.map +1 -1
  43. package/fesm2022/ng-doc-app-components-root.mjs +51 -4
  44. package/fesm2022/ng-doc-app-components-root.mjs.map +1 -1
  45. package/fesm2022/ng-doc-app-components-search-result.mjs +8 -6
  46. package/fesm2022/ng-doc-app-components-search-result.mjs.map +1 -1
  47. package/fesm2022/ng-doc-app-components-search.mjs +7 -5
  48. package/fesm2022/ng-doc-app-components-search.mjs.map +1 -1
  49. package/fesm2022/ng-doc-app-components-sidebar.mjs +4 -3
  50. package/fesm2022/ng-doc-app-components-sidebar.mjs.map +1 -1
  51. package/fesm2022/ng-doc-app-components-theme-toggle.mjs +7 -5
  52. package/fesm2022/ng-doc-app-components-theme-toggle.mjs.map +1 -1
  53. package/fesm2022/ng-doc-app-components-toc.mjs +4 -2
  54. package/fesm2022/ng-doc-app-components-toc.mjs.map +1 -1
  55. package/fesm2022/ng-doc-app-constants.mjs +11 -1
  56. package/fesm2022/ng-doc-app-constants.mjs.map +1 -1
  57. package/fesm2022/ng-doc-app-demo-app.mjs +618 -15
  58. package/fesm2022/ng-doc-app-demo-app.mjs.map +1 -1
  59. package/fesm2022/ng-doc-app-helpers.mjs +125 -6
  60. package/fesm2022/ng-doc-app-helpers.mjs.map +1 -1
  61. package/fesm2022/ng-doc-app-providers-ng-doc-app.mjs +29 -18
  62. package/fesm2022/ng-doc-app-providers-ng-doc-app.mjs.map +1 -1
  63. package/fesm2022/ng-doc-app-providers-texts.mjs +53 -0
  64. package/fesm2022/ng-doc-app-providers-texts.mjs.map +1 -0
  65. package/fesm2022/ng-doc-app-providers.mjs +1 -0
  66. package/fesm2022/ng-doc-app-providers.mjs.map +1 -1
  67. package/fesm2022/ng-doc-app-services-content-scroll-intent.mjs +27 -2
  68. package/fesm2022/ng-doc-app-services-content-scroll-intent.mjs.map +1 -1
  69. package/fesm2022/ng-doc-app-services-highlighter.mjs +8 -5
  70. package/fesm2022/ng-doc-app-services-highlighter.mjs.map +1 -1
  71. package/fesm2022/ng-doc-app-services-shortcuts.mjs +38 -4
  72. package/fesm2022/ng-doc-app-services-shortcuts.mjs.map +1 -1
  73. package/fesm2022/ng-doc-app-texts-ar.mjs +238 -0
  74. package/fesm2022/ng-doc-app-texts-ar.mjs.map +1 -0
  75. package/fesm2022/ng-doc-app-texts-de.mjs +205 -0
  76. package/fesm2022/ng-doc-app-texts-de.mjs.map +1 -0
  77. package/fesm2022/ng-doc-app-texts-es.mjs +205 -0
  78. package/fesm2022/ng-doc-app-texts-es.mjs.map +1 -0
  79. package/fesm2022/ng-doc-app-texts-fr.mjs +205 -0
  80. package/fesm2022/ng-doc-app-texts-fr.mjs.map +1 -0
  81. package/fesm2022/ng-doc-app-texts-hi.mjs +219 -0
  82. package/fesm2022/ng-doc-app-texts-hi.mjs.map +1 -0
  83. package/fesm2022/ng-doc-app-texts-ja.mjs +205 -0
  84. package/fesm2022/ng-doc-app-texts-ja.mjs.map +1 -0
  85. package/fesm2022/ng-doc-app-texts-ko.mjs +205 -0
  86. package/fesm2022/ng-doc-app-texts-ko.mjs.map +1 -0
  87. package/fesm2022/ng-doc-app-texts-pt-br.mjs +205 -0
  88. package/fesm2022/ng-doc-app-texts-pt-br.mjs.map +1 -0
  89. package/fesm2022/ng-doc-app-texts-ru.mjs +231 -0
  90. package/fesm2022/ng-doc-app-texts-ru.mjs.map +1 -0
  91. package/fesm2022/ng-doc-app-texts-uk.mjs +231 -0
  92. package/fesm2022/ng-doc-app-texts-uk.mjs.map +1 -0
  93. package/fesm2022/ng-doc-app-texts-zh.mjs +205 -0
  94. package/fesm2022/ng-doc-app-texts-zh.mjs.map +1 -0
  95. package/fesm2022/ng-doc-app-tokens.mjs +214 -1
  96. package/fesm2022/ng-doc-app-tokens.mjs.map +1 -1
  97. package/fesm2022/ng-doc-app-type-controls-json-control.mjs +90 -0
  98. package/fesm2022/ng-doc-app-type-controls-json-control.mjs.map +1 -0
  99. package/fesm2022/ng-doc-app-type-controls-list-control.mjs +792 -0
  100. package/fesm2022/ng-doc-app-type-controls-list-control.mjs.map +1 -0
  101. package/fesm2022/ng-doc-app-type-controls-type-alias-control.mjs +5 -3
  102. package/fesm2022/ng-doc-app-type-controls-type-alias-control.mjs.map +1 -1
  103. package/fesm2022/ng-doc-app-type-controls.mjs +2 -0
  104. package/fesm2022/ng-doc-app-type-controls.mjs.map +1 -1
  105. package/package.json +59 -3
  106. package/styles/global.css +1 -0
  107. package/styles/main.css +1 -0
  108. package/types/ng-doc-app-classes-default-search-engine.d.ts +11 -0
  109. package/types/ng-doc-app-classes-root-page.d.ts +5 -0
  110. package/types/ng-doc-app-components-api-list.d.ts +3 -1
  111. package/types/ng-doc-app-components-breadcrumb.d.ts +2 -1
  112. package/types/ng-doc-app-components-code.d.ts +2 -0
  113. package/types/ng-doc-app-components-command-palette.d.ts +3 -1
  114. package/types/ng-doc-app-components-copy-button.d.ts +3 -1
  115. package/types/ng-doc-app-components-demo-displayer.d.ts +13 -1
  116. package/types/ng-doc-app-components-demo-frame.d.ts +62 -3
  117. package/types/ng-doc-app-components-demo.d.ts +27 -8
  118. package/types/ng-doc-app-components-fullscreen-button.d.ts +2 -0
  119. package/types/ng-doc-app-components-fullscreen-toggle.d.ts +2 -0
  120. package/types/ng-doc-app-components-heading-anchor.d.ts +2 -0
  121. package/types/ng-doc-app-components-image-viewer.d.ts +2 -0
  122. package/types/ng-doc-app-components-navbar.d.ts +2 -0
  123. package/types/ng-doc-app-components-page-navigation.d.ts +2 -1
  124. package/types/ng-doc-app-components-page.d.ts +10 -1
  125. package/types/ng-doc-app-components-playground.d.ts +241 -44
  126. package/types/ng-doc-app-components-root.d.ts +18 -0
  127. package/types/ng-doc-app-components-search-result.d.ts +2 -0
  128. package/types/ng-doc-app-components-search.d.ts +2 -0
  129. package/types/ng-doc-app-components-sidebar.d.ts +2 -1
  130. package/types/ng-doc-app-components-theme-toggle.d.ts +4 -1
  131. package/types/ng-doc-app-components-toc.d.ts +2 -1
  132. package/types/ng-doc-app-constants.d.ts +11 -1
  133. package/types/ng-doc-app-demo-app.d.ts +211 -3
  134. package/types/ng-doc-app-helpers.d.ts +56 -3
  135. package/types/ng-doc-app-interfaces.d.ts +621 -3
  136. package/types/ng-doc-app-providers-ng-doc-app.d.ts +6 -0
  137. package/types/ng-doc-app-providers-texts.d.ts +28 -0
  138. package/types/ng-doc-app-providers.d.ts +1 -0
  139. package/types/ng-doc-app-services-content-scroll-intent.d.ts +11 -1
  140. package/types/ng-doc-app-services-highlighter.d.ts +3 -1
  141. package/types/ng-doc-app-services-shortcuts.d.ts +16 -0
  142. package/types/ng-doc-app-texts-ar.d.ts +13 -0
  143. package/types/ng-doc-app-texts-de.d.ts +12 -0
  144. package/types/ng-doc-app-texts-es.d.ts +12 -0
  145. package/types/ng-doc-app-texts-fr.d.ts +12 -0
  146. package/types/ng-doc-app-texts-hi.d.ts +12 -0
  147. package/types/ng-doc-app-texts-ja.d.ts +12 -0
  148. package/types/ng-doc-app-texts-ko.d.ts +12 -0
  149. package/types/ng-doc-app-texts-pt-br.d.ts +12 -0
  150. package/types/ng-doc-app-texts-ru.d.ts +12 -0
  151. package/types/ng-doc-app-texts-uk.d.ts +12 -0
  152. package/types/ng-doc-app-texts-zh.d.ts +12 -0
  153. package/types/ng-doc-app-tokens.d.ts +21 -2
  154. package/types/ng-doc-app-type-controls-json-control.d.ts +38 -0
  155. package/types/ng-doc-app-type-controls-list-control.d.ts +313 -0
  156. package/types/ng-doc-app-type-controls-type-alias-control.d.ts +2 -1
  157. package/types/ng-doc-app-type-controls.d.ts +2 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-doc-app-type-controls-list-control.mjs","sources":["../../../../libs/app/type-controls/list-control/list-control.component.ts","../../../../libs/app/type-controls/list-control/list-control.component.html","../../../../libs/app/type-controls/list-control/ng-doc-app-type-controls-list-control.ts"],"sourcesContent":["import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n Signal,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { NgDocResolvedPlaygroundOption, resolvePlaygroundOption } from '@ng-doc/app/helpers';\nimport { NgDocPlaygroundTexts, NgDocTypeControl } from '@ng-doc/app/interfaces';\nimport { NG_DOC_TEXTS } from '@ng-doc/app/tokens';\nimport { NgDocPlaygroundOption } from '@ng-doc/core/interfaces';\nimport {\n NgDocButtonIconComponent,\n NgDocDropdownComponent,\n NgDocDropdownOriginDirective,\n NgDocIconComponent,\n NgDocTagComponent,\n} from '@ng-doc/ui-kit';\nimport { DIControl } from 'di-controls';\n\n/** A value that an item of an array control can be. */\ntype NgDocListControlItem = string | number | boolean;\n\n/** A row of the dropdown of an array control. */\ninterface NgDocListControlRow<T> {\n /** `add` for the row that adds the typed text, `item` for a suggestion or a value of a union. */\n kind: 'add' | 'item';\n /** The value that the row adds. */\n value: T;\n /** The text of the value. */\n label: string;\n /** Whether the array holds the value: a picked value of a union. */\n selected: boolean;\n}\n\n/** A pointer that is on a chip, and drags it once it has moved far enough. */\ninterface NgDocListControlDrag {\n pointerId: number;\n x: number;\n y: number;\n /** The position of the item when the pointer went down. */\n index: number;\n started: boolean;\n}\n\n/** How far, in pixels, a pointer moves on a chip before it drags the chip. */\nconst DRAG_THRESHOLD: number = 4;\n\nlet nextId = 0;\n\n/**\n * The base of the playground controls of array inputs: a chip combobox. The items are chips, in\n * one field with a text field after them. Enter adds the typed value, Backspace in the empty field\n * removes the last chip, and the × of a chip removes it. A chip is dragged to another place, or\n * moved with Alt+Left and Alt+Right while it is focused, and the arrow keys move between chips.\n * While the reader types, a dropdown lists the matching suggestions; the arrow keys move its\n * highlight, and Enter or a click picks a row. Escape closes it.\n *\n * Subclasses decide what an item is: typed text (`parseItem`) for the arrays of strings and\n * numbers, which suggest the input's default items and the items removed while the control is\n * shown, or the values of a union, which the dropdown lists (`NgDocTypeAliasListControlComponent`).\n *\n * The control never changes an array it received: every edit reports a new array of plain values,\n * so the value can be compared with the default and sent to an isolated demo as it is. An\n * `undefined` or `null` value has no items and shows as such; the first added item makes it an\n * array, and removing the last item leaves an empty array. Reset returns to the input's default,\n * which is how an optional input gets back to `undefined`.\n */\n@Directive({\n host: {\n '(focusout)': 'leave($event)',\n },\n})\nexport abstract class NgDocListControl<T extends NgDocListControlItem>\n extends DIControl<T[] | undefined>\n implements NgDocTypeControl<T[] | undefined>\n{\n /** Default value of the input; Reset returns to it. */\n readonly default = input<T[] | undefined>(undefined);\n\n /**\n * Whether typed text becomes an item (`parseItem`). Without it, the dropdown lists the values the\n * items can have, and a value is in the array at most once.\n */\n protected abstract readonly freeText: boolean;\n\n protected readonly texts: NgDocPlaygroundTexts = inject(NG_DOC_TEXTS).playground;\n\n /** The prefix of the IDs of the parts of the control. */\n protected readonly id: string = `ng-doc-list-control-${nextId++}`;\n\n /** The items of the value; none when the value is not an array. */\n protected readonly items: Signal<readonly T[]> = computed(() => {\n const value: T[] | null | undefined = this.model();\n\n return Array.isArray(value) ? value : [];\n });\n\n /** The items as the chips show them: in the order of a drag in progress. */\n protected readonly shownItems: Signal<readonly T[]> = computed(\n () => this.dragOrder() ?? this.items(),\n );\n\n /**\n * The text shown instead of the items when the value is not an array (`undefined` or `null`), or\n * is an empty array (`[]`), so that the two can be told apart. These are code, not words.\n */\n protected readonly literal: Signal<string> = computed(() => {\n const value: T[] | null | undefined = this.model();\n\n if (Array.isArray(value)) {\n return value.length ? '' : '[]';\n }\n\n return value === null ? 'null' : 'undefined';\n });\n\n /** Whether Reset is shown: the value differs from the default. */\n protected readonly canReset: Signal<boolean> = computed(\n () => !sameItems(this.model(), this.default()),\n );\n\n /** The text of the text field. */\n protected readonly text = signal<string>('');\n\n /** Whether the reader asked for the dropdown, by typing, clicking or an arrow key. */\n protected readonly expanded = signal<boolean>(false);\n\n /** The position of the highlighted row of the dropdown, or `-1`. */\n protected readonly highlighted = signal<number>(-1);\n\n /** The position of the item edited in place, or `null`. */\n protected readonly editing = signal<number | null>(null);\n\n /** The text of the field that edits an item in place. */\n protected readonly editText = signal<string>('');\n\n /** The position of the chip in the tab order; the others are reached with the arrow keys. */\n protected readonly tabStop = signal<number>(0);\n\n /** The position of the chip being dragged, or `null`. */\n protected readonly dragIndex = signal<number | null>(null);\n\n /** What the live region announces: the new position of a moved item. */\n protected readonly announcement = signal<string>('');\n\n /** The width of the dropdown: the width of the field. */\n protected readonly panelWidth = signal<number>(0);\n\n /** Whether the text field holds text that is not an item, such as a word in a `number[]`. */\n protected readonly invalid: Signal<boolean> = computed(\n () => this.freeText && this.text().trim() !== '' && this.parseItem(this.text()) === undefined,\n );\n\n /** Whether the field that edits an item holds text that is not an item. */\n protected readonly editInvalid: Signal<boolean> = computed(\n () => this.editing() !== null && this.parseItem(this.editText()) === undefined,\n );\n\n /**\n * The rows of the dropdown: the values of `candidates()` whose text contains the typed text (the\n * one equal to it first), and, when the typed text is an item that no row adds, a row that adds\n * it, first.\n */\n protected readonly rows: Signal<Array<NgDocListControlRow<T>>> = computed(() => {\n const text: string = this.text();\n const query: string = text.trim().toLowerCase();\n const items: readonly T[] = this.items();\n const typed: T | undefined = this.freeText && query ? this.parseItem(text) : undefined;\n const rows: Array<NgDocListControlRow<T>> = this.candidates()\n .map((value: T) => ({\n kind: 'item' as const,\n value,\n label: this.labelOf(value),\n selected: items.some((item: T) => Object.is(item, value)),\n }))\n .filter((row: NgDocListControlRow<T>) => row.label.toLowerCase().includes(query));\n const exact: number =\n typed === undefined\n ? -1\n : rows.findIndex((row: NgDocListControlRow<T>) => Object.is(row.value, typed));\n\n if (exact > 0) {\n rows.unshift(...rows.splice(exact, 1));\n }\n\n return typed !== undefined && exact < 0\n ? [{ kind: 'add', value: typed, label: this.labelOf(typed), selected: false }, ...rows]\n : rows;\n });\n\n /**\n * Whether the dropdown is open: the reader asked for it and it has rows, or, for a union, says\n * that no value matches the typed text.\n */\n protected readonly panelOpen: Signal<boolean> = computed(\n () =>\n this.expanded() &&\n !this.disabled &&\n (this.rows().length > 0 || (!this.freeText && this.text().trim() !== '')),\n );\n\n /** The items removed while the control is shown, which the arrays of strings and numbers suggest. */\n private readonly removed = signal<readonly T[]>([]);\n\n private readonly injector = inject(Injector);\n private readonly dropdown = viewChild(NgDocDropdownComponent);\n private readonly fieldBox = viewChild<ElementRef<HTMLElement>>('fieldBox');\n\n /** The items in the order of a drag in progress, or `null`. */\n private readonly dragOrder = signal<T[] | null>(null);\n private drag: NgDocListControlDrag | null = null;\n\n /** The last array the control reported, which the form writes back. */\n private reported: T[] | undefined | null = null;\n\n protected constructor() {\n super({\n // The form writes back each value the control reports. Another value, such as the\n // inspector's Reset, ends an edit or a drag of the items that it replaces.\n onIncomingUpdate: (value: T[] | undefined | null) => {\n if (value !== this.reported) {\n this.editing.set(null);\n this.cancelDrag();\n }\n },\n });\n\n // The dropdown is an overlay; it follows the state, and it closes itself on an outside click.\n effect(() => {\n const open: boolean = this.panelOpen();\n const dropdown: NgDocDropdownComponent | undefined = this.dropdown();\n\n untracked(() => {\n if (open) {\n this.panelWidth.set(this.fieldBox()?.nativeElement.offsetWidth ?? 0);\n dropdown?.open();\n } else {\n dropdown?.close();\n }\n });\n });\n }\n\n /**\n * Reads typed text as an item.\n * @param text - The text.\n * @returns The item, or `undefined` when the text is not one.\n */\n protected abstract parseItem(text: string): T | undefined;\n\n /**\n * The values that the dropdown can list, before the typed text filters them: for an array of\n * strings or numbers, the items of the default and the removed items that the array doesn't\n * hold. Plain arrays may hold an item twice, so typed text that is an item is added again, but\n * the suggestions never repeat an item.\n */\n protected candidates(): readonly T[] {\n const items: readonly T[] = this.items();\n const pool: T[] = [...(this.default() ?? []), ...this.removed()];\n\n return pool.filter(\n (value: T, index: number) =>\n pool.findIndex((other: T) => Object.is(other, value)) === index &&\n !items.some((item: T) => Object.is(item, value)),\n );\n }\n\n /**\n * The text of an item.\n * @param item - The item.\n */\n protected labelOf(item: T): string {\n return String(item);\n }\n\n /**\n * The text of a chip: the item's text, or `\"\"` for an empty string.\n * @param item - The item.\n */\n protected chipText(item: T): string {\n return this.labelOf(item) || '\"\"';\n }\n\n /**\n * Reads the text field as the reader types.\n * @param text - The text of the field.\n */\n protected type(text: string): void {\n this.text.set(text);\n this.expanded.set(true);\n // With text, the first row is the typed value or the value that matches it best.\n this.highlighted.set(text.trim() && this.rows().length ? 0 : -1);\n }\n\n /**\n * Handles the keys of the text field.\n * @param event - The key event.\n * @param field - The text field.\n */\n protected fieldKeydown(event: KeyboardEvent, field: HTMLInputElement): void {\n const count: number = this.items().length;\n\n switch (event.key) {\n case 'Enter':\n event.preventDefault();\n this.enter();\n break;\n case 'ArrowDown':\n case 'ArrowUp':\n event.preventDefault();\n this.moveHighlight(event.key === 'ArrowDown' ? 1 : -1);\n break;\n case 'Escape':\n if (this.panelOpen()) {\n // The dropdown closes; the key does not reach the page.\n event.preventDefault();\n event.stopPropagation();\n this.expanded.set(false);\n }\n break;\n case 'Backspace':\n if (field.value === '' && count) {\n event.preventDefault();\n this.remove(count - 1);\n }\n break;\n case 'ArrowLeft':\n case 'ArrowRight':\n // The key toward the chips, at the start of the field, focuses the last chip.\n if (\n event.key === (this.isRtl() ? 'ArrowRight' : 'ArrowLeft') &&\n field.selectionStart === 0 &&\n field.selectionEnd === 0 &&\n count\n ) {\n event.preventDefault();\n this.expanded.set(false);\n this.focusChip(count - 1);\n }\n break;\n case 'Tab':\n this.expanded.set(false);\n break;\n }\n }\n\n /**\n * Opens the dropdown when the reader clicks the field, and focuses the text field when the click\n * is not on a chip or a button.\n * @param event - The click.\n * @param field - The text field.\n */\n protected fieldClick(event: MouseEvent, field: HTMLInputElement): void {\n const target: Element | null = event.target instanceof Element ? event.target : null;\n\n if (this.disabled || target?.closest('[data-ng-doc-list-item], button')) {\n return;\n }\n\n field.focus();\n this.expanded.set(true);\n }\n\n /**\n * Picks a row of the dropdown: adds its value, or removes a picked value of a union.\n * @param row - The row.\n */\n protected pick(row: NgDocListControlRow<T>): void {\n if (!this.freeText && row.selected) {\n this.remove(\n this.items().findIndex((item: T) => Object.is(item, row.value)),\n false,\n );\n } else {\n this.add(row.value);\n }\n\n this.text.set('');\n\n if (this.freeText) {\n this.expanded.set(false);\n this.highlighted.set(-1);\n } else {\n // A union keeps its values open, so that the reader can pick several; the highlight stays on\n // the picked value.\n this.highlighted.set(\n this.rows().findIndex((other: NgDocListControlRow<T>) => Object.is(other.value, row.value)),\n );\n }\n }\n\n /**\n * Handles the keys of a focused chip.\n * @param event - The key event.\n * @param index - The position of the chip.\n */\n protected chipKeydown(event: KeyboardEvent, index: number): void {\n const count: number = this.items().length;\n const forward: string = this.isRtl() ? 'ArrowLeft' : 'ArrowRight';\n\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowRight': {\n const offset: -1 | 1 = event.key === forward ? 1 : -1;\n\n event.preventDefault();\n\n if (event.altKey) {\n this.move(index, offset);\n } else if (index + offset >= count) {\n this.focusField();\n } else {\n this.focusChip(Math.max(index + offset, 0));\n }\n break;\n }\n case 'Home':\n case 'End':\n event.preventDefault();\n this.focusChip(event.key === 'Home' ? 0 : count - 1);\n break;\n case 'Delete':\n case 'Backspace':\n event.preventDefault();\n this.remove(index);\n break;\n case 'Enter':\n case 'F2':\n if (this.freeText) {\n event.preventDefault();\n this.startEdit(index);\n }\n break;\n }\n }\n\n /**\n * Removes an item. The focus goes to the chip that takes its place, the previous chip, or the\n * text field when the field had it, or no chip is left.\n * @param index - The position of the item.\n * @param focus - Whether the focus moves; a pick in the dropdown keeps it in the text field.\n */\n protected remove(index: number, focus: boolean = true): void {\n const items: readonly T[] = this.items();\n const value: T = items[index];\n const rest: T[] = items.filter((_item: T, position: number) => position !== index);\n const fromField: boolean = this.isFocused(this.fieldElement());\n\n if (!this.removed().some((item: T) => Object.is(item, value))) {\n this.removed.set([...this.removed(), value]);\n }\n\n this.report(rest);\n\n if (!focus) {\n return;\n }\n\n if (fromField || !rest.length) {\n this.focusField();\n } else {\n this.focusChip(Math.min(index, rest.length - 1));\n }\n }\n\n /**\n * Edits an item in place: its chip becomes a text field.\n * @param index - The position of the item.\n */\n protected startEdit(index: number): void {\n if (!this.freeText || this.disabled) {\n return;\n }\n\n this.expanded.set(false);\n this.editText.set(String(this.items()[index]));\n this.editing.set(index);\n\n afterNextRender(\n () => {\n const field: HTMLInputElement | null = this.host().querySelector('[data-ng-doc-list-edit]');\n\n field?.focus();\n field?.select();\n },\n { injector: this.injector },\n );\n }\n\n /**\n * Handles the keys of the field that edits an item: Enter keeps the text, Escape the item.\n * @param event - The key event.\n */\n protected editKeydown(event: KeyboardEvent): void {\n const index: number | null = this.editing();\n\n if (index === null) {\n return;\n }\n\n if (event.key === 'Enter') {\n event.preventDefault();\n\n if (this.commitEdit()) {\n this.focusChip(index);\n }\n } else if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.editing.set(null);\n this.focusChip(index);\n }\n }\n\n /** Ends an edit when its field loses the focus: with the text when it is an item. */\n protected editBlur(): void {\n if (this.editing() !== null && !this.commitEdit()) {\n this.editing.set(null);\n }\n }\n\n /**\n * Starts to follow a pointer that went down on a chip.\n * @param event - The pointer event.\n * @param index - The position of the chip.\n */\n protected chipPointerDown(event: PointerEvent, index: number): void {\n if (this.disabled || event.button !== 0 || this.editing() !== null) {\n return;\n }\n\n this.drag = {\n pointerId: event.pointerId,\n x: event.clientX,\n y: event.clientY,\n index,\n started: false,\n };\n // The chip keeps the pointer while it moves over the other chips.\n (event.currentTarget as HTMLElement | null)?.setPointerCapture?.(event.pointerId);\n }\n\n /**\n * Drags the chip once the pointer has moved far enough, and moves it in front of or behind the\n * chip under the pointer once the pointer passes that chip's middle.\n * @param event - The pointer event.\n */\n protected chipPointerMove(event: PointerEvent): void {\n const drag: NgDocListControlDrag | null = this.drag;\n\n if (!drag || drag.pointerId !== event.pointerId) {\n return;\n }\n\n if (!drag.started) {\n if (Math.hypot(event.clientX - drag.x, event.clientY - drag.y) < DRAG_THRESHOLD) {\n return;\n }\n\n drag.started = true;\n this.expanded.set(false);\n this.dragOrder.set([...this.items()]);\n this.dragIndex.set(drag.index);\n }\n\n const from: number | null = this.dragIndex();\n const order: T[] | null = this.dragOrder();\n const target: number | null = from === null ? null : this.dropTarget(event, from);\n\n if (from !== null && order && target !== null) {\n this.dragOrder.set(moveItem(order, from, target));\n this.dragIndex.set(target);\n }\n }\n\n /**\n * Drops a dragged chip: the items take the order of the drag.\n * @param event - The pointer event.\n */\n protected chipPointerUp(event: PointerEvent): void {\n const drag: NgDocListControlDrag | null = this.drag;\n\n if (!drag || drag.pointerId !== event.pointerId) {\n return;\n }\n\n const order: T[] | null = this.dragOrder();\n const index: number | null = this.dragIndex();\n\n this.cancelDrag();\n\n if (drag.started && order && index !== null && index !== drag.index) {\n this.report(order);\n this.announceMove(order, index);\n this.focusChip(index);\n }\n }\n\n /** Stops following the pointer; a drag in progress leaves the items as they were. */\n protected cancelDrag(): void {\n this.drag = null;\n this.dragOrder.set(null);\n this.dragIndex.set(null);\n }\n\n /**\n * Closes the dropdown and marks the control as touched when the focus leaves the control.\n * @param event - The focus event.\n */\n protected leave(event: FocusEvent): void {\n const next: Node | null = event.relatedTarget instanceof Node ? event.relatedTarget : null;\n\n if (!next || !this.host().contains(next)) {\n this.expanded.set(false);\n this.touch();\n }\n }\n\n /** Sets the value back to the default of the input. */\n protected reset(): void {\n const value: T[] | undefined = this.default();\n\n this.text.set('');\n this.editing.set(null);\n this.report(Array.isArray(value) ? [...value] : value);\n }\n\n /**\n * The ID of a row of the dropdown, which the text field names as its active descendant.\n * @param index - The position of the row.\n */\n protected rowId(index: number): string {\n return `${this.id}-row-${index}`;\n }\n\n /**\n * Adds an item at the end.\n * @param value - The item.\n */\n private add(value: T): void {\n this.report([...this.items(), value]);\n }\n\n /** Adds the highlighted row, or the typed text when it is an item. */\n private enter(): void {\n const rows: Array<NgDocListControlRow<T>> = this.rows();\n const row: NgDocListControlRow<T> | undefined = this.panelOpen()\n ? rows[this.highlighted()]\n : undefined;\n\n if (row) {\n this.pick(row);\n\n return;\n }\n\n const typed: T | undefined =\n this.freeText && this.text().trim() ? this.parseItem(this.text()) : undefined;\n\n if (typed !== undefined) {\n this.add(typed);\n this.text.set('');\n this.expanded.set(false);\n }\n }\n\n /**\n * Moves the highlight of the dropdown, and opens it.\n * @param step - `1` for the next row, `-1` for the previous one.\n */\n private moveHighlight(step: 1 | -1): void {\n const count: number = this.rows().length;\n const current: number = this.panelOpen() ? this.highlighted() : -1;\n\n this.expanded.set(true);\n\n if (count) {\n this.highlighted.set(\n current < 0 ? (step > 0 ? 0 : count - 1) : (current + step + count) % count,\n );\n }\n }\n\n /**\n * Moves an item one place, with the focus.\n * @param index - The position of the item.\n * @param offset - `-1` toward the start, `1` toward the end.\n */\n private move(index: number, offset: -1 | 1): void {\n const target: number = index + offset;\n const items: readonly T[] = this.items();\n\n if (target < 0 || target >= items.length) {\n return;\n }\n\n const order: T[] = moveItem(items, index, target);\n\n this.report(order);\n this.announceMove(order, target);\n this.focusChip(target);\n }\n\n /**\n * Sets the edited item from the text of its field.\n * @returns Whether the text is an item.\n */\n private commitEdit(): boolean {\n const index: number | null = this.editing();\n const value: T | undefined = this.parseItem(this.editText());\n\n if (index === null || value === undefined) {\n return false;\n }\n\n this.editing.set(null);\n\n if (!Object.is(value, this.items()[index])) {\n this.report(\n this.items().map((item: T, position: number) => (position === index ? value : item)),\n );\n }\n\n return true;\n }\n\n /**\n * The position a dragged chip moves to: the position of the chip under the pointer, once the\n * pointer has passed its middle in the direction of the move.\n * @param event - The pointer event.\n * @param from - The position of the dragged chip.\n */\n private dropTarget(event: PointerEvent, from: number): number | null {\n const rtl: boolean = this.isRtl();\n\n for (const chip of Array.from(\n this.host().querySelectorAll<HTMLElement>('[data-ng-doc-list-item]'),\n )) {\n const index: number = Number(chip.getAttribute('data-ng-doc-list-item'));\n const rect: DOMRect = chip.getBoundingClientRect();\n\n if (\n index === from ||\n event.clientX < rect.left ||\n event.clientX > rect.right ||\n event.clientY < rect.top ||\n event.clientY > rect.bottom\n ) {\n continue;\n }\n\n const middle: number = rect.left + rect.width / 2;\n const pastMiddle: boolean =\n index > from !== rtl ? event.clientX > middle : event.clientX < middle;\n\n return pastMiddle ? index : null;\n }\n\n return null;\n }\n\n /**\n * Reports a new value.\n * @param value - The value.\n */\n private report(value: T[] | undefined): void {\n this.reported = value;\n this.updateModel(value);\n }\n\n /**\n * Announces the new position of a moved item.\n * @param order - The items after the move.\n * @param index - The new position of the item.\n */\n private announceMove(order: readonly T[], index: number): void {\n this.announcement.set(\n this.texts.itemMoved({\n item: this.chipText(order[index]),\n position: index + 1,\n count: order.length,\n }),\n );\n }\n\n /**\n * Focuses a chip once the chips have rendered: they are tracked by position, so the focused\n * element may show another item, or be gone.\n * @param index - The position of the chip.\n */\n private focusChip(index: number): void {\n this.tabStop.set(index);\n afterNextRender(\n () =>\n this.host()\n .querySelector<HTMLElement>(`[data-ng-doc-list-item=\"${index}\"] [data-ng-doc-list-chip]`)\n ?.focus(),\n { injector: this.injector },\n );\n }\n\n /** Focuses the text field once the chips have rendered. */\n private focusField(): void {\n afterNextRender(() => this.fieldElement()?.focus(), { injector: this.injector });\n }\n\n private fieldElement(): HTMLInputElement | null {\n return this.host().querySelector('[data-ng-doc-list-field]');\n }\n\n private isFocused(element: Element | null): boolean {\n return !!element && element.ownerDocument.activeElement === element;\n }\n\n /** Whether the chips flow from right to left, which turns the arrow keys round. */\n private isRtl(): boolean {\n const host: HTMLElement = this.host();\n\n return host.ownerDocument.defaultView?.getComputedStyle(host).direction === 'rtl';\n }\n\n private host(): HTMLElement {\n return this.elementRef.nativeElement;\n }\n}\n\n/** The shared metadata of the array controls. */\nconst LIST_CONTROL_IMPORTS = [\n NgDocButtonIconComponent,\n NgDocDropdownComponent,\n NgDocDropdownOriginDirective,\n NgDocIconComponent,\n NgDocTagComponent,\n];\n\n/**\n * The playground control of `string[]` inputs: a chip combobox (`NgDocListControl`). Typed text is\n * an item as it is, and a double click, Enter or F2 edits a chip in place.\n */\n@Component({\n selector: 'ng-doc-string-list-control',\n templateUrl: './list-control.component.html',\n styleUrls: ['./list-control.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: LIST_CONTROL_IMPORTS,\n})\nexport class NgDocStringListControlComponent extends NgDocListControl<string> {\n protected readonly freeText = true;\n\n constructor() {\n super();\n }\n\n protected parseItem(text: string): string {\n return text;\n }\n}\n\n/**\n * The playground control of `number[]` inputs: a chip combobox (`NgDocListControl`) whose items are\n * numbers. Text that is not a number marks the field as invalid and adds nothing; a chip edited to\n * such text keeps its number.\n */\n@Component({\n selector: 'ng-doc-number-list-control',\n templateUrl: './list-control.component.html',\n styleUrls: ['./list-control.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: LIST_CONTROL_IMPORTS,\n})\nexport class NgDocNumberListControlComponent extends NgDocListControl<number> {\n protected readonly freeText = true;\n\n constructor() {\n super();\n }\n\n protected parseItem(text: string): number | undefined {\n const value: number = Number(text);\n\n return text.trim() !== '' && Number.isFinite(value) ? value : undefined;\n }\n}\n\n/**\n * The playground control of arrays of a union of literals, such as `NgDocSize[]` or\n * `('a' | 'b')[]`: a chip combobox (`NgDocListControl`) whose dropdown lists every value of the\n * union, with the same texts as the control of the union (`NgDocTypeAliasControlComponent`).\n * Picking a value adds it, and picking a value that the array holds, which is marked, removes it.\n * The typed text filters the values; it is never an item itself.\n */\n@Component({\n selector: 'ng-doc-type-alias-list-control',\n templateUrl: './list-control.component.html',\n styleUrls: ['./list-control.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: LIST_CONTROL_IMPORTS,\n})\nexport class NgDocTypeAliasListControlComponent extends NgDocListControl<NgDocListControlItem> {\n /**\n * The values of the items: the members of the union as written in code, plain values when\n * `isManual` is set, or the names and values of enum members.\n */\n readonly options = input<Array<string | NgDocPlaygroundOption> | undefined>(undefined);\n\n /** Whether `options` are values the user listed in the playground config. */\n readonly isManual = input<boolean | undefined>(undefined);\n\n protected readonly freeText = false;\n\n /** The values of the union that an item can be; `undefined`, `null` and repeats are left out. */\n protected readonly values: Signal<NgDocResolvedPlaygroundOption[]> = computed(() => {\n const isManual: boolean | undefined = this.isManual();\n const values: NgDocResolvedPlaygroundOption[] = [];\n\n for (const option of this.options() ?? []) {\n try {\n const value: NgDocResolvedPlaygroundOption = resolvePlaygroundOption(option, isManual);\n\n if (\n isListItem(value.value) &&\n !values.some((other: NgDocResolvedPlaygroundOption) =>\n Object.is(other.value, value.value),\n )\n ) {\n values.push(value);\n }\n } catch {\n // A member that is not a value, such as a type, is not offered.\n }\n }\n\n return values;\n });\n\n constructor() {\n super();\n }\n\n protected override candidates(): readonly NgDocListControlItem[] {\n return this.values().map(\n (option: NgDocResolvedPlaygroundOption) => option.value as NgDocListControlItem,\n );\n }\n\n protected override labelOf(item: NgDocListControlItem): string {\n return (\n this.values().find((option: NgDocResolvedPlaygroundOption) => Object.is(option.value, item))\n ?.label ?? String(item)\n );\n }\n\n protected parseItem(): undefined {\n return undefined;\n }\n}\n\n/**\n * Whether a value can be an item of an array control.\n * @param value - The value.\n */\nfunction isListItem(value: unknown): value is NgDocListControlItem {\n return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n}\n\n/**\n * The items with one of them moved to another position.\n * @param items - The items.\n * @param from - The position of the item.\n * @param to - Its new position.\n */\nfunction moveItem<T>(items: readonly T[], from: number, to: number): T[] {\n const order: T[] = [...items];\n const [item] = order.splice(from, 1);\n\n order.splice(to, 0, item);\n\n return order;\n}\n\n/**\n * Whether two values of a list control hold the same items in the same order. `undefined` and\n * `null` are values of their own.\n * @param a - The first value.\n * @param b - The second value.\n */\nfunction sameItems(a: unknown, b: unknown): boolean {\n if (Array.isArray(a) && Array.isArray(b)) {\n return (\n a.length === b.length && a.every((item: unknown, index: number) => Object.is(item, b[index]))\n );\n }\n\n return a === b;\n}\n","<!-- The chips and the text field share one field-styled box, which the dropdown is attached to. -->\n<div\n #fieldBox\n class=\"ng-doc-list-control-box\"\n ngDocDropdownOrigin\n [attr.data-ng-doc-invalid]=\"invalid() || editInvalid()\"\n [attr.data-ng-doc-disabled]=\"disabled\"\n (click)=\"fieldClick($event, field)\">\n <div class=\"ng-doc-list-control-flow\">\n <!-- `display: contents` lets the chips and the text field wrap as one line of content. -->\n <ul class=\"ng-doc-list-control-chips\" role=\"list\">\n @for (item of shownItems(); track $index) {\n <li\n class=\"ng-doc-list-control-item\"\n [attr.data-ng-doc-list-item]=\"$index\"\n [attr.data-ng-doc-dragging]=\"dragIndex() === $index\">\n @if (editing() === $index) {\n <input\n class=\"ng-doc-list-control-edit\"\n data-ng-doc-list-edit\n spellcheck=\"false\"\n autocomplete=\"off\"\n [size]=\"editText().length || 1\"\n [value]=\"editText()\"\n [attr.aria-label]=\"texts.editItem({ item: chipText(item) })\"\n [attr.aria-invalid]=\"editInvalid() ? 'true' : null\"\n [attr.aria-describedby]=\"editInvalid() ? id + '-error' : null\"\n (input)=\"editText.set(edit.value)\"\n (keydown)=\"editKeydown($event)\"\n (blur)=\"editBlur()\"\n #edit />\n } @else {\n <ng-doc-tag class=\"ng-doc-list-control-chip\" mod=\"light\">\n <span\n class=\"ng-doc-list-control-chip-text\"\n data-ng-doc-list-chip\n [class.ng-doc-list-control-empty-string]=\"labelOf(item) === ''\"\n [attr.role]=\"freeText ? 'button' : null\"\n [attr.tabindex]=\"\n disabled ? null : $index === tabStop() || ($last && tabStop() > $index) ? 0 : -1\n \"\n [attr.aria-describedby]=\"\n freeText ? id + '-edit-keys ' + id + '-keys' : id + '-keys'\n \"\n (focus)=\"tabStop.set($index)\"\n (keydown)=\"chipKeydown($event, $index)\"\n (dblclick)=\"startEdit($index)\"\n (pointerdown)=\"chipPointerDown($event, $index)\"\n (pointermove)=\"chipPointerMove($event)\"\n (pointerup)=\"chipPointerUp($event)\"\n (pointercancel)=\"cancelDrag()\"\n >{{ chipText(item) }}</span\n >\n <button\n type=\"button\"\n class=\"ng-doc-list-control-remove\"\n data-ng-doc-list-remove\n tabindex=\"-1\"\n [attr.aria-label]=\"texts.removeItem({ item: chipText(item) })\"\n [disabled]=\"disabled\"\n (click)=\"remove($index)\">\n <ng-doc-icon icon=\"x\" aria-hidden=\"true\"></ng-doc-icon>\n </button>\n </ng-doc-tag>\n }\n </li>\n }\n </ul>\n @if (literal(); as literal) {\n <code class=\"ng-doc-list-control-literal\" data-ng-doc-list-literal>{{ literal }}</code>\n }\n <input\n #field\n class=\"ng-doc-list-control-field\"\n data-ng-doc-list-field\n role=\"combobox\"\n aria-autocomplete=\"list\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n [value]=\"text()\"\n [placeholder]=\"items().length ? '' : texts.addItem\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"texts.addItem\"\n [attr.aria-expanded]=\"panelOpen()\"\n [attr.aria-controls]=\"id + '-rows'\"\n [attr.aria-activedescendant]=\"panelOpen() && highlighted() >= 0 ? rowId(highlighted()) : null\"\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\n [attr.aria-describedby]=\"invalid() ? id + '-error' : null\"\n (input)=\"type(field.value)\"\n (keydown)=\"fieldKeydown($event, field)\" />\n </div>\n @if (canReset()) {\n <button\n ng-doc-button-icon-transparent\n type=\"button\"\n size=\"small\"\n class=\"ng-doc-list-control-reset\"\n data-ng-doc-list-reset\n [rounded]=\"false\"\n [attr.aria-label]=\"texts.resetToDefault\"\n [disabled]=\"disabled\"\n (click)=\"reset()\">\n <ng-doc-icon icon=\"x\" aria-hidden=\"true\"></ng-doc-icon>\n </button>\n }\n <!-- The dropdown's host takes the focus while it is open, to move it into the overlay. The rows\n here are never focused (the text field names the highlighted one), so the host is inert. -->\n <span class=\"ng-doc-list-control-dropdown\" inert>\n <ng-doc-dropdown\n [content]=\"panel\"\n [positions]=\"['bottom-center', 'top-center']\"\n [maxHeight]=\"240\"\n (beforeClose)=\"expanded.set(false)\"></ng-doc-dropdown>\n </span>\n</div>\n@if (invalid() || editInvalid()) {\n <span class=\"ng-doc-list-control-error\" [id]=\"id + '-error'\">{{ texts.invalidNumber }}</span>\n}\n<span hidden [id]=\"id + '-keys'\">{{ texts.itemKeys }}</span>\n<span hidden [id]=\"id + '-edit-keys'\">{{ texts.editKeys }}</span>\n<span class=\"ng-doc-list-control-status\" role=\"status\">{{ announcement() }}</span>\n\n<ng-template #panel>\n <!-- A press on a row keeps the focus in the text field. -->\n <div\n class=\"ng-doc-list-control-panel\"\n [style.width.px]=\"panelWidth()\"\n (mousedown)=\"$event.preventDefault()\">\n @if (rows().length) {\n <div\n role=\"listbox\"\n class=\"ng-doc-list-control-rows\"\n [id]=\"id + '-rows'\"\n [attr.aria-label]=\"texts.suggestions\"\n [attr.aria-multiselectable]=\"freeText ? null : 'true'\">\n @for (row of rows(); track $index) {\n <div\n role=\"option\"\n class=\"ng-doc-list-control-row\"\n [id]=\"rowId($index)\"\n [attr.data-ng-doc-list-row]=\"row.kind\"\n [attr.data-ng-doc-highlighted]=\"highlighted() === $index\"\n [attr.aria-selected]=\"freeText ? highlighted() === $index : row.selected\"\n (pointerenter)=\"highlighted.set($index)\"\n (click)=\"pick(row)\">\n <span class=\"ng-doc-list-control-row-text\">\n {{ row.kind === 'add' ? texts.addValue({ value: row.label }) : row.label || '\"\"' }}\n </span>\n @if (row.selected) {\n <ng-doc-icon\n class=\"ng-doc-list-control-check\"\n icon=\"check\"\n aria-hidden=\"true\"></ng-doc-icon>\n }\n </div>\n }\n </div>\n } @else {\n <div class=\"ng-doc-list-control-no-matches\" role=\"status\">{{ texts.noMatches }}</div>\n }\n </div>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { NgTemplateOutlet } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { input, computed, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { inject, input, computed, ChangeDetectionStrategy, Component } from '@angular/core';
4
4
  import * as i1 from '@angular/forms';
5
5
  import { FormsModule } from '@angular/forms';
6
6
  import { resolvePlaygroundOption } from '@ng-doc/app/helpers';
7
+ import { NG_DOC_TEXTS } from '@ng-doc/app/tokens';
7
8
  import { NgDocComboboxComponent, NgDocDataDirective, NgDocListComponent, NgDocOptionComponent, NgDocButtonIconComponent, NgDocFocusableDirective, NgDocIconComponent } from '@ng-doc/ui-kit';
8
9
  import { DIControl } from 'di-controls';
9
10
 
@@ -15,6 +16,7 @@ import { DIControl } from 'di-controls';
15
16
  class NgDocTypeAliasControlComponent extends DIControl {
16
17
  constructor() {
17
18
  super();
19
+ this.texts = inject(NG_DOC_TEXTS).playground;
18
20
  /** Default value of the input; clearing the selection returns to it. */
19
21
  this.default = input(undefined, /* @ts-ignore */
20
22
  ...(ngDevMode ? [{ debugName: "default" }] : /* istanbul ignore next */ []));
@@ -68,7 +70,7 @@ class NgDocTypeAliasControlComponent extends DIControl {
68
70
  this.updateModel(value === null && defaultValue ? defaultValue : value);
69
71
  }
70
72
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocTypeAliasControlComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
71
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: NgDocTypeAliasControlComponent, isStandalone: true, selector: "ng-doc-type-alias-control", inputs: { default: { classPropertyName: "default", publicName: "default", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, isManual: { classPropertyName: "isManual", publicName: "isManual", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<ng-doc-combobox\n [ngModel]=\"model()\"\n [readonly]=\"true\"\n [valueContent]=\"valueTemplate\"\n [clearButton]=\"false\"\n [rightContent]=\"rightContent\"\n (ngModelChange)=\"changeModel($event)\">\n <ng-doc-list *ngDocData>\n @for (item of items(); track $index) {\n <ng-doc-option [value]=\"item.value\">\n <ng-container\n *ngTemplateOutlet=\"valueTemplate; context: { $implicit: item.value }\"></ng-container>\n </ng-doc-option>\n }\n </ng-doc-list>\n <ng-template let-value #valueTemplate>\n <div class=\"ng-doc-type-alias-value\">\n <span class=\"ng-doc-type-alias-value-text\">{{ labelOf(value) }}</span>\n @if (value === default()) {\n <span class=\"ng-doc-type-alias-default\">default</span>\n }\n </div>\n </ng-template>\n <ng-template #rightContent>\n @if (canReset(model())) {\n <button\n ng-doc-button-icon-transparent\n size=\"large\"\n aria-label=\"Reset to the default value\"\n [ngDocFocusable]=\"false\"\n [disabled]=\"disabled\"\n [rounded]=\"false\"\n (click)=\"updateModel(default() ?? null)\"\n (focusout)=\"touch()\">\n <ng-doc-icon icon=\"x\"></ng-doc-icon>\n </button>\n }\n </ng-template>\n</ng-doc-combobox>\n", styles: [":host{display:block;width:100%}.ng-doc-type-alias-value{display:flex;align-items:center;gap:var(--ng-doc-space-2);width:100%;min-width:0;font-family:var(--ng-doc-font-family);font-size:14px;line-height:20px;color:var(--ng-doc-heading-color)}.ng-doc-type-alias-value-text{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ng-doc-type-alias-default{margin-left:auto;padding-right:var(--ng-doc-space-2);font-size:12px;color:var(--ng-doc-text-muted);white-space:nowrap}\n"], dependencies: [{ kind: "component", type: NgDocComboboxComponent, selector: "ng-doc-combobox", inputs: ["readonly", "placeholder", "clearButton", "rightContent", "valueContent"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgDocDataDirective, selector: "[ngDocData]" }, { kind: "component", type: NgDocListComponent, selector: "ng-doc-list" }, { kind: "component", type: NgDocOptionComponent, selector: "ng-doc-option" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgDocButtonIconComponent, selector: "button[ng-doc-button-icon], a[ng-doc-button-icon], button[ng-doc-button-icon-raised], a[ng-doc-button-icon-raised], button[ng-doc-button-icon-transparent], a[ng-doc-button-icon-transparent]", inputs: ["size", "rounded"] }, { kind: "directive", type: NgDocFocusableDirective, selector: "[ngDocFocusable]", inputs: ["ngDocFocusable"], exportAs: ["ngDocFocusable"] }, { kind: "component", type: NgDocIconComponent, selector: "ng-doc-icon", inputs: ["icon", "customIcon", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
73
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: NgDocTypeAliasControlComponent, isStandalone: true, selector: "ng-doc-type-alias-control", inputs: { default: { classPropertyName: "default", publicName: "default", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, isManual: { classPropertyName: "isManual", publicName: "isManual", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<ng-doc-combobox\n [ngModel]=\"model()\"\n [readonly]=\"true\"\n [valueContent]=\"valueTemplate\"\n [clearButton]=\"false\"\n [rightContent]=\"rightContent\"\n (ngModelChange)=\"changeModel($event)\">\n <ng-doc-list *ngDocData>\n @for (item of items(); track $index) {\n <ng-doc-option [value]=\"item.value\">\n <div class=\"ng-doc-type-alias-option\" [attr.data-ng-doc-selected]=\"item.value === model()\">\n <ng-container\n *ngTemplateOutlet=\"valueTemplate; context: { $implicit: item.value }\"></ng-container>\n <!-- The slot stays when empty, so the default markers line up. -->\n <span class=\"ng-doc-type-alias-check\" data-ng-doc-type-alias-check>\n @if (item.value === model()) {\n <ng-doc-icon icon=\"check\" aria-hidden=\"true\"></ng-doc-icon>\n }\n </span>\n </div>\n </ng-doc-option>\n }\n </ng-doc-list>\n <ng-template let-value #valueTemplate>\n <div class=\"ng-doc-type-alias-value\">\n <span class=\"ng-doc-type-alias-value-text\">{{ labelOf(value) }}</span>\n @if (value === default()) {\n <span class=\"ng-doc-type-alias-default\">{{ texts.defaultValue }}</span>\n }\n </div>\n </ng-template>\n <ng-template #rightContent>\n @if (canReset(model())) {\n <button\n ng-doc-button-icon-transparent\n size=\"large\"\n [attr.aria-label]=\"texts.resetToDefault\"\n [ngDocFocusable]=\"false\"\n [disabled]=\"disabled\"\n [rounded]=\"false\"\n (click)=\"updateModel(default() ?? null)\"\n (focusout)=\"touch()\">\n <ng-doc-icon icon=\"x\"></ng-doc-icon>\n </button>\n }\n </ng-template>\n</ng-doc-combobox>\n", styles: [":host{display:block;width:100%}.ng-doc-type-alias-value{display:flex;align-items:center;gap:var(--ng-doc-space-2);width:100%;min-width:0;font-family:var(--ng-doc-font-family);font-size:14px;line-height:20px;color:var(--ng-doc-heading-color)}.ng-doc-type-alias-value-text{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ng-doc-type-alias-default{margin-left:auto;padding-right:var(--ng-doc-space-2);font-size:12px;color:var(--ng-doc-text-muted);white-space:nowrap}ng-doc-list{padding:var(--ng-doc-space-1) 0}ng-doc-option{--ng-doc-option-padding: 4px calc(var(--ng-doc-base-gutter) * 1.5)}.ng-doc-type-alias-option{display:flex;align-items:center;gap:var(--ng-doc-space-2);min-width:0}.ng-doc-type-alias-option .ng-doc-type-alias-value{color:var(--ng-doc-text)}.ng-doc-type-alias-option[data-ng-doc-selected=true] .ng-doc-type-alias-value{color:var(--ng-doc-heading-color)}.ng-doc-type-alias-option .ng-doc-type-alias-default{padding-right:0}.ng-doc-type-alias-check{display:inline-flex;flex:none;width:16px;--ng-doc-icon-color: var(--ng-doc-primary)}\n"], dependencies: [{ kind: "component", type: NgDocComboboxComponent, selector: "ng-doc-combobox", inputs: ["readonly", "placeholder", "clearButton", "rightContent", "valueContent"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgDocDataDirective, selector: "[ngDocData]" }, { kind: "component", type: NgDocListComponent, selector: "ng-doc-list" }, { kind: "component", type: NgDocOptionComponent, selector: "ng-doc-option" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgDocButtonIconComponent, selector: "button[ng-doc-button-icon], a[ng-doc-button-icon], button[ng-doc-button-icon-raised], a[ng-doc-button-icon-raised], button[ng-doc-button-icon-transparent], a[ng-doc-button-icon-transparent]", inputs: ["size", "rounded"] }, { kind: "directive", type: NgDocFocusableDirective, selector: "[ngDocFocusable]", inputs: ["ngDocFocusable"], exportAs: ["ngDocFocusable"] }, { kind: "component", type: NgDocIconComponent, selector: "ng-doc-icon", inputs: ["icon", "customIcon", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
72
74
  }
73
75
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocTypeAliasControlComponent, decorators: [{
74
76
  type: Component,
@@ -82,7 +84,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImpor
82
84
  NgDocButtonIconComponent,
83
85
  NgDocFocusableDirective,
84
86
  NgDocIconComponent,
85
- ], template: "<ng-doc-combobox\n [ngModel]=\"model()\"\n [readonly]=\"true\"\n [valueContent]=\"valueTemplate\"\n [clearButton]=\"false\"\n [rightContent]=\"rightContent\"\n (ngModelChange)=\"changeModel($event)\">\n <ng-doc-list *ngDocData>\n @for (item of items(); track $index) {\n <ng-doc-option [value]=\"item.value\">\n <ng-container\n *ngTemplateOutlet=\"valueTemplate; context: { $implicit: item.value }\"></ng-container>\n </ng-doc-option>\n }\n </ng-doc-list>\n <ng-template let-value #valueTemplate>\n <div class=\"ng-doc-type-alias-value\">\n <span class=\"ng-doc-type-alias-value-text\">{{ labelOf(value) }}</span>\n @if (value === default()) {\n <span class=\"ng-doc-type-alias-default\">default</span>\n }\n </div>\n </ng-template>\n <ng-template #rightContent>\n @if (canReset(model())) {\n <button\n ng-doc-button-icon-transparent\n size=\"large\"\n aria-label=\"Reset to the default value\"\n [ngDocFocusable]=\"false\"\n [disabled]=\"disabled\"\n [rounded]=\"false\"\n (click)=\"updateModel(default() ?? null)\"\n (focusout)=\"touch()\">\n <ng-doc-icon icon=\"x\"></ng-doc-icon>\n </button>\n }\n </ng-template>\n</ng-doc-combobox>\n", styles: [":host{display:block;width:100%}.ng-doc-type-alias-value{display:flex;align-items:center;gap:var(--ng-doc-space-2);width:100%;min-width:0;font-family:var(--ng-doc-font-family);font-size:14px;line-height:20px;color:var(--ng-doc-heading-color)}.ng-doc-type-alias-value-text{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ng-doc-type-alias-default{margin-left:auto;padding-right:var(--ng-doc-space-2);font-size:12px;color:var(--ng-doc-text-muted);white-space:nowrap}\n"] }]
87
+ ], template: "<ng-doc-combobox\n [ngModel]=\"model()\"\n [readonly]=\"true\"\n [valueContent]=\"valueTemplate\"\n [clearButton]=\"false\"\n [rightContent]=\"rightContent\"\n (ngModelChange)=\"changeModel($event)\">\n <ng-doc-list *ngDocData>\n @for (item of items(); track $index) {\n <ng-doc-option [value]=\"item.value\">\n <div class=\"ng-doc-type-alias-option\" [attr.data-ng-doc-selected]=\"item.value === model()\">\n <ng-container\n *ngTemplateOutlet=\"valueTemplate; context: { $implicit: item.value }\"></ng-container>\n <!-- The slot stays when empty, so the default markers line up. -->\n <span class=\"ng-doc-type-alias-check\" data-ng-doc-type-alias-check>\n @if (item.value === model()) {\n <ng-doc-icon icon=\"check\" aria-hidden=\"true\"></ng-doc-icon>\n }\n </span>\n </div>\n </ng-doc-option>\n }\n </ng-doc-list>\n <ng-template let-value #valueTemplate>\n <div class=\"ng-doc-type-alias-value\">\n <span class=\"ng-doc-type-alias-value-text\">{{ labelOf(value) }}</span>\n @if (value === default()) {\n <span class=\"ng-doc-type-alias-default\">{{ texts.defaultValue }}</span>\n }\n </div>\n </ng-template>\n <ng-template #rightContent>\n @if (canReset(model())) {\n <button\n ng-doc-button-icon-transparent\n size=\"large\"\n [attr.aria-label]=\"texts.resetToDefault\"\n [ngDocFocusable]=\"false\"\n [disabled]=\"disabled\"\n [rounded]=\"false\"\n (click)=\"updateModel(default() ?? null)\"\n (focusout)=\"touch()\">\n <ng-doc-icon icon=\"x\"></ng-doc-icon>\n </button>\n }\n </ng-template>\n</ng-doc-combobox>\n", styles: [":host{display:block;width:100%}.ng-doc-type-alias-value{display:flex;align-items:center;gap:var(--ng-doc-space-2);width:100%;min-width:0;font-family:var(--ng-doc-font-family);font-size:14px;line-height:20px;color:var(--ng-doc-heading-color)}.ng-doc-type-alias-value-text{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ng-doc-type-alias-default{margin-left:auto;padding-right:var(--ng-doc-space-2);font-size:12px;color:var(--ng-doc-text-muted);white-space:nowrap}ng-doc-list{padding:var(--ng-doc-space-1) 0}ng-doc-option{--ng-doc-option-padding: 4px calc(var(--ng-doc-base-gutter) * 1.5)}.ng-doc-type-alias-option{display:flex;align-items:center;gap:var(--ng-doc-space-2);min-width:0}.ng-doc-type-alias-option .ng-doc-type-alias-value{color:var(--ng-doc-text)}.ng-doc-type-alias-option[data-ng-doc-selected=true] .ng-doc-type-alias-value{color:var(--ng-doc-heading-color)}.ng-doc-type-alias-option .ng-doc-type-alias-default{padding-right:0}.ng-doc-type-alias-check{display:inline-flex;flex:none;width:16px;--ng-doc-icon-color: var(--ng-doc-primary)}\n"] }]
86
88
  }], ctorParameters: () => [], propDecorators: { default: [{ type: i0.Input, args: [{ isSignal: true, alias: "default", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], isManual: [{ type: i0.Input, args: [{ isSignal: true, alias: "isManual", required: false }] }] } });
87
89
 
88
90
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ng-doc-app-type-controls-type-alias-control.mjs","sources":["../../../../libs/app/type-controls/type-alias-control/type-alias-control.component.ts","../../../../libs/app/type-controls/type-alias-control/type-alias-control.component.html","../../../../libs/app/type-controls/type-alias-control/ng-doc-app-type-controls-type-alias-control.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, Signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { NgDocResolvedPlaygroundOption, resolvePlaygroundOption } from '@ng-doc/app/helpers';\nimport { NgDocTypeControl } from '@ng-doc/app/interfaces';\nimport { NgDocPlaygroundOption } from '@ng-doc/core/interfaces';\nimport {\n NgDocButtonIconComponent,\n NgDocComboboxComponent,\n NgDocDataDirective,\n NgDocFocusableDirective,\n NgDocIconComponent,\n NgDocListComponent,\n NgDocOptionComponent,\n} from '@ng-doc/ui-kit';\nimport { DIControl } from 'di-controls';\n\n/**\n * The playground control of union type aliases and enums: a select that shows the value (or the\n * name of an enum member) and whether it is the default. The inspector shows the value type under\n * the input's name.\n */\n@Component({\n selector: 'ng-doc-type-alias-control',\n templateUrl: './type-alias-control.component.html',\n styleUrls: ['./type-alias-control.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgDocComboboxComponent,\n FormsModule,\n NgDocDataDirective,\n NgDocListComponent,\n NgDocOptionComponent,\n NgTemplateOutlet,\n NgDocButtonIconComponent,\n NgDocFocusableDirective,\n NgDocIconComponent,\n ],\n})\nexport class NgDocTypeAliasControlComponent<T> extends DIControl<T> implements NgDocTypeControl<T> {\n /** Default value of the input; clearing the selection returns to it. */\n readonly default = input<T | undefined>(undefined);\n\n /**\n * Values the input accepts: literal source text, plain values when `isManual` is set, or the\n * names and values of enum members.\n */\n readonly options = input<Array<string | NgDocPlaygroundOption> | undefined>(undefined);\n\n /** Whether `options` are values the user listed in the playground config. */\n readonly isManual = input<boolean | undefined>(undefined);\n\n /**\n * The options of the select. `undefined` and `null` get no option: clearing the selection\n * returns to the default value instead.\n */\n protected readonly items: Signal<NgDocResolvedPlaygroundOption[]> = computed(() => {\n const isManual: boolean | undefined = this.isManual();\n\n return (this.options() ?? []).flatMap((option: string | NgDocPlaygroundOption) => {\n try {\n const item: NgDocResolvedPlaygroundOption = resolvePlaygroundOption(option, isManual);\n\n return item.value === undefined || item.value === null ? [] : [item];\n } catch {\n return [];\n }\n });\n });\n\n constructor() {\n super();\n }\n\n typeOf(value: unknown): string {\n return typeof value;\n }\n\n /**\n * The text of a value: the name of its option, such as the name of an enum member.\n * @param value - A value of the input.\n */\n labelOf(value: unknown): string {\n return (\n this.items().find((item: NgDocResolvedPlaygroundOption) => item.value === value)?.label ??\n String(value ?? '')\n );\n }\n\n /**\n * Whether the reset button is shown: a value other than the default is selected.\n * @param value - The selected value.\n */\n protected canReset(value: T | null): boolean {\n return value !== undefined && value !== null && value !== this.default();\n }\n\n changeModel(value: T | null): void {\n const defaultValue: T | undefined = this.default();\n\n this.updateModel(value === null && defaultValue ? defaultValue : value);\n }\n}\n","<ng-doc-combobox\n [ngModel]=\"model()\"\n [readonly]=\"true\"\n [valueContent]=\"valueTemplate\"\n [clearButton]=\"false\"\n [rightContent]=\"rightContent\"\n (ngModelChange)=\"changeModel($event)\">\n <ng-doc-list *ngDocData>\n @for (item of items(); track $index) {\n <ng-doc-option [value]=\"item.value\">\n <ng-container\n *ngTemplateOutlet=\"valueTemplate; context: { $implicit: item.value }\"></ng-container>\n </ng-doc-option>\n }\n </ng-doc-list>\n <ng-template let-value #valueTemplate>\n <div class=\"ng-doc-type-alias-value\">\n <span class=\"ng-doc-type-alias-value-text\">{{ labelOf(value) }}</span>\n @if (value === default()) {\n <span class=\"ng-doc-type-alias-default\">default</span>\n }\n </div>\n </ng-template>\n <ng-template #rightContent>\n @if (canReset(model())) {\n <button\n ng-doc-button-icon-transparent\n size=\"large\"\n aria-label=\"Reset to the default value\"\n [ngDocFocusable]=\"false\"\n [disabled]=\"disabled\"\n [rounded]=\"false\"\n (click)=\"updateModel(default() ?? null)\"\n (focusout)=\"touch()\">\n <ng-doc-icon icon=\"x\"></ng-doc-icon>\n </button>\n }\n </ng-template>\n</ng-doc-combobox>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;AAiBA;;;;AAIG;AAkBG,MAAO,8BAAkC,SAAQ,SAAY,CAAA;AA+BjE,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;;QA9BA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAgB,SAAS;oFAAC;AAElD;;;AAGG;QACM,IAAA,CAAA,OAAO,GAAG,KAAK,CAAoD,SAAS;oFAAC;;QAG7E,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAsB,SAAS;qFAAC;AAEzD;;;AAGG;AACgB,QAAA,IAAA,CAAA,KAAK,GAA4C,QAAQ,CAAC,MAAK;AAChF,YAAA,MAAM,QAAQ,GAAwB,IAAI,CAAC,QAAQ,EAAE;AAErD,YAAA,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,MAAsC,KAAI;AAC/E,gBAAA,IAAI;oBACF,MAAM,IAAI,GAAkC,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAC;oBAErF,OAAO,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC;gBACtE;AAAE,gBAAA,MAAM;AACN,oBAAA,OAAO,EAAE;gBACX;AACF,YAAA,CAAC,CAAC;QACJ,CAAC;kFAAC;IAIF;AAEA,IAAA,MAAM,CAAC,KAAc,EAAA;QACnB,OAAO,OAAO,KAAK;IACrB;AAEA;;;AAGG;AACH,IAAA,OAAO,CAAC,KAAc,EAAA;QACpB,QACE,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,IAAmC,KAAK,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,KAAK;AACvF,YAAA,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;IAEvB;AAEA;;;AAGG;AACO,IAAA,QAAQ,CAAC,KAAe,EAAA;AAChC,QAAA,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE;IAC1E;AAEA,IAAA,WAAW,CAAC,KAAe,EAAA;AACzB,QAAA,MAAM,YAAY,GAAkB,IAAI,CAAC,OAAO,EAAE;AAElD,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,KAAK,IAAI,IAAI,YAAY,GAAG,YAAY,GAAG,KAAK,CAAC;IACzE;8GA9DW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA9B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,8BAA8B,qfCvC3C,2wCAuCA,EAAA,MAAA,EAAA,CAAA,0eAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDXI,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACtB,WAAW,+VACX,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,oBAAoB,0DACpB,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,wBAAwB,EAAA,QAAA,EAAA,+LAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,uBAAuB,uHACvB,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAGT,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAjB1C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,EAAA,eAAA,EAGpB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,sBAAsB;wBACtB,WAAW;wBACX,kBAAkB;wBAClB,kBAAkB;wBAClB,oBAAoB;wBACpB,gBAAgB;wBAChB,wBAAwB;wBACxB,uBAAuB;wBACvB,kBAAkB;AACnB,qBAAA,EAAA,QAAA,EAAA,2wCAAA,EAAA,MAAA,EAAA,CAAA,0eAAA,CAAA,EAAA;;;AErCH;;AAEG;;;;"}
1
+ {"version":3,"file":"ng-doc-app-type-controls-type-alias-control.mjs","sources":["../../../../libs/app/type-controls/type-alias-control/type-alias-control.component.ts","../../../../libs/app/type-controls/type-alias-control/type-alias-control.component.html","../../../../libs/app/type-controls/type-alias-control/ng-doc-app-type-controls-type-alias-control.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, Signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { NgDocResolvedPlaygroundOption, resolvePlaygroundOption } from '@ng-doc/app/helpers';\nimport { NgDocPlaygroundTexts, NgDocTypeControl } from '@ng-doc/app/interfaces';\nimport { NG_DOC_TEXTS } from '@ng-doc/app/tokens';\nimport { NgDocPlaygroundOption } from '@ng-doc/core/interfaces';\nimport {\n NgDocButtonIconComponent,\n NgDocComboboxComponent,\n NgDocDataDirective,\n NgDocFocusableDirective,\n NgDocIconComponent,\n NgDocListComponent,\n NgDocOptionComponent,\n} from '@ng-doc/ui-kit';\nimport { DIControl } from 'di-controls';\n\n/**\n * The playground control of union type aliases and enums: a select that shows the value (or the\n * name of an enum member) and whether it is the default. The inspector shows the value type under\n * the input's name.\n */\n@Component({\n selector: 'ng-doc-type-alias-control',\n templateUrl: './type-alias-control.component.html',\n styleUrls: ['./type-alias-control.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgDocComboboxComponent,\n FormsModule,\n NgDocDataDirective,\n NgDocListComponent,\n NgDocOptionComponent,\n NgTemplateOutlet,\n NgDocButtonIconComponent,\n NgDocFocusableDirective,\n NgDocIconComponent,\n ],\n})\nexport class NgDocTypeAliasControlComponent<T> extends DIControl<T> implements NgDocTypeControl<T> {\n protected readonly texts: NgDocPlaygroundTexts = inject(NG_DOC_TEXTS).playground;\n\n /** Default value of the input; clearing the selection returns to it. */\n readonly default = input<T | undefined>(undefined);\n\n /**\n * Values the input accepts: literal source text, plain values when `isManual` is set, or the\n * names and values of enum members.\n */\n readonly options = input<Array<string | NgDocPlaygroundOption> | undefined>(undefined);\n\n /** Whether `options` are values the user listed in the playground config. */\n readonly isManual = input<boolean | undefined>(undefined);\n\n /**\n * The options of the select. `undefined` and `null` get no option: clearing the selection\n * returns to the default value instead.\n */\n protected readonly items: Signal<NgDocResolvedPlaygroundOption[]> = computed(() => {\n const isManual: boolean | undefined = this.isManual();\n\n return (this.options() ?? []).flatMap((option: string | NgDocPlaygroundOption) => {\n try {\n const item: NgDocResolvedPlaygroundOption = resolvePlaygroundOption(option, isManual);\n\n return item.value === undefined || item.value === null ? [] : [item];\n } catch {\n return [];\n }\n });\n });\n\n constructor() {\n super();\n }\n\n typeOf(value: unknown): string {\n return typeof value;\n }\n\n /**\n * The text of a value: the name of its option, such as the name of an enum member.\n * @param value - A value of the input.\n */\n labelOf(value: unknown): string {\n return (\n this.items().find((item: NgDocResolvedPlaygroundOption) => item.value === value)?.label ??\n String(value ?? '')\n );\n }\n\n /**\n * Whether the reset button is shown: a value other than the default is selected.\n * @param value - The selected value.\n */\n protected canReset(value: T | null): boolean {\n return value !== undefined && value !== null && value !== this.default();\n }\n\n changeModel(value: T | null): void {\n const defaultValue: T | undefined = this.default();\n\n this.updateModel(value === null && defaultValue ? defaultValue : value);\n }\n}\n","<ng-doc-combobox\n [ngModel]=\"model()\"\n [readonly]=\"true\"\n [valueContent]=\"valueTemplate\"\n [clearButton]=\"false\"\n [rightContent]=\"rightContent\"\n (ngModelChange)=\"changeModel($event)\">\n <ng-doc-list *ngDocData>\n @for (item of items(); track $index) {\n <ng-doc-option [value]=\"item.value\">\n <div class=\"ng-doc-type-alias-option\" [attr.data-ng-doc-selected]=\"item.value === model()\">\n <ng-container\n *ngTemplateOutlet=\"valueTemplate; context: { $implicit: item.value }\"></ng-container>\n <!-- The slot stays when empty, so the default markers line up. -->\n <span class=\"ng-doc-type-alias-check\" data-ng-doc-type-alias-check>\n @if (item.value === model()) {\n <ng-doc-icon icon=\"check\" aria-hidden=\"true\"></ng-doc-icon>\n }\n </span>\n </div>\n </ng-doc-option>\n }\n </ng-doc-list>\n <ng-template let-value #valueTemplate>\n <div class=\"ng-doc-type-alias-value\">\n <span class=\"ng-doc-type-alias-value-text\">{{ labelOf(value) }}</span>\n @if (value === default()) {\n <span class=\"ng-doc-type-alias-default\">{{ texts.defaultValue }}</span>\n }\n </div>\n </ng-template>\n <ng-template #rightContent>\n @if (canReset(model())) {\n <button\n ng-doc-button-icon-transparent\n size=\"large\"\n [attr.aria-label]=\"texts.resetToDefault\"\n [ngDocFocusable]=\"false\"\n [disabled]=\"disabled\"\n [rounded]=\"false\"\n (click)=\"updateModel(default() ?? null)\"\n (focusout)=\"touch()\">\n <ng-doc-icon icon=\"x\"></ng-doc-icon>\n </button>\n }\n </ng-template>\n</ng-doc-combobox>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  export * from '@ng-doc/app/type-controls/boolean-control';
2
+ export * from '@ng-doc/app/type-controls/json-control';
3
+ export * from '@ng-doc/app/type-controls/list-control';
2
4
  export * from '@ng-doc/app/type-controls/number-control';
3
5
  export * from '@ng-doc/app/type-controls/string-control';
4
6
  export * from '@ng-doc/app/type-controls/type-alias-control';
@@ -1 +1 @@
1
- {"version":3,"file":"ng-doc-app-type-controls.mjs","sources":["../../../../libs/app/type-controls/ng-doc-app-type-controls.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAAA;;AAEG"}
1
+ {"version":3,"file":"ng-doc-app-type-controls.mjs","sources":["../../../../libs/app/type-controls/ng-doc-app-type-controls.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AAAA;;AAEG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ng-doc/app",
3
- "version": "22.1.0",
3
+ "version": "22.2.0",
4
4
  "description": "The NgDoc documentation site: layout, navigation, search, demos, playgrounds and API pages.",
5
5
  "keywords": [
6
6
  "angular",
@@ -32,8 +32,8 @@
32
32
  },
33
33
  "dependencies": {
34
34
  "tslib": "^2.6.2",
35
- "@ng-doc/core": "22.1.0",
36
- "@ng-doc/ui-kit": "22.1.0",
35
+ "@ng-doc/core": "22.2.0",
36
+ "@ng-doc/ui-kit": "22.2.0",
37
37
  "@orama/plugin-match-highlight": "2.0.17",
38
38
  "@orama/stemmers": "2.0.17",
39
39
  "mermaid": "10.9.8",
@@ -319,6 +319,10 @@
319
319
  "types": "./types/ng-doc-app-providers-search-engine.d.ts",
320
320
  "default": "./fesm2022/ng-doc-app-providers-search-engine.mjs"
321
321
  },
322
+ "./providers/texts": {
323
+ "types": "./types/ng-doc-app-providers-texts.d.ts",
324
+ "default": "./fesm2022/ng-doc-app-providers-texts.mjs"
325
+ },
322
326
  "./providers/title": {
323
327
  "types": "./types/ng-doc-app-providers-title.d.ts",
324
328
  "default": "./fesm2022/ng-doc-app-providers-title.mjs"
@@ -367,6 +371,50 @@
367
371
  "types": "./types/ng-doc-app-services-theme.d.ts",
368
372
  "default": "./fesm2022/ng-doc-app-services-theme.mjs"
369
373
  },
374
+ "./texts/ar": {
375
+ "types": "./types/ng-doc-app-texts-ar.d.ts",
376
+ "default": "./fesm2022/ng-doc-app-texts-ar.mjs"
377
+ },
378
+ "./texts/de": {
379
+ "types": "./types/ng-doc-app-texts-de.d.ts",
380
+ "default": "./fesm2022/ng-doc-app-texts-de.mjs"
381
+ },
382
+ "./texts/es": {
383
+ "types": "./types/ng-doc-app-texts-es.d.ts",
384
+ "default": "./fesm2022/ng-doc-app-texts-es.mjs"
385
+ },
386
+ "./texts/fr": {
387
+ "types": "./types/ng-doc-app-texts-fr.d.ts",
388
+ "default": "./fesm2022/ng-doc-app-texts-fr.mjs"
389
+ },
390
+ "./texts/hi": {
391
+ "types": "./types/ng-doc-app-texts-hi.d.ts",
392
+ "default": "./fesm2022/ng-doc-app-texts-hi.mjs"
393
+ },
394
+ "./texts/ja": {
395
+ "types": "./types/ng-doc-app-texts-ja.d.ts",
396
+ "default": "./fesm2022/ng-doc-app-texts-ja.mjs"
397
+ },
398
+ "./texts/ko": {
399
+ "types": "./types/ng-doc-app-texts-ko.d.ts",
400
+ "default": "./fesm2022/ng-doc-app-texts-ko.mjs"
401
+ },
402
+ "./texts/pt-br": {
403
+ "types": "./types/ng-doc-app-texts-pt-br.d.ts",
404
+ "default": "./fesm2022/ng-doc-app-texts-pt-br.mjs"
405
+ },
406
+ "./texts/ru": {
407
+ "types": "./types/ng-doc-app-texts-ru.d.ts",
408
+ "default": "./fesm2022/ng-doc-app-texts-ru.mjs"
409
+ },
410
+ "./texts/uk": {
411
+ "types": "./types/ng-doc-app-texts-uk.d.ts",
412
+ "default": "./fesm2022/ng-doc-app-texts-uk.mjs"
413
+ },
414
+ "./texts/zh": {
415
+ "types": "./types/ng-doc-app-texts-zh.d.ts",
416
+ "default": "./fesm2022/ng-doc-app-texts-zh.mjs"
417
+ },
370
418
  "./tokens": {
371
419
  "types": "./types/ng-doc-app-tokens.d.ts",
372
420
  "default": "./fesm2022/ng-doc-app-tokens.mjs"
@@ -379,6 +427,14 @@
379
427
  "types": "./types/ng-doc-app-type-controls-boolean-control.d.ts",
380
428
  "default": "./fesm2022/ng-doc-app-type-controls-boolean-control.mjs"
381
429
  },
430
+ "./type-controls/json-control": {
431
+ "types": "./types/ng-doc-app-type-controls-json-control.d.ts",
432
+ "default": "./fesm2022/ng-doc-app-type-controls-json-control.mjs"
433
+ },
434
+ "./type-controls/list-control": {
435
+ "types": "./types/ng-doc-app-type-controls-list-control.d.ts",
436
+ "default": "./fesm2022/ng-doc-app-type-controls-list-control.mjs"
437
+ },
382
438
  "./type-controls/number-control": {
383
439
  "types": "./types/ng-doc-app-type-controls-number-control.d.ts",
384
440
  "default": "./fesm2022/ng-doc-app-type-controls-number-control.mjs"
package/styles/global.css CHANGED
@@ -656,6 +656,7 @@ mark.ng-doc-mark {
656
656
  --ng-doc-code-background: var(--ng-doc-base-1);
657
657
  --ng-doc-page-padding: calc(var(--ng-doc-base-gutter) * 3) var(--ng-doc-app-horizontal-padding);
658
658
  --ng-doc-main-padding: var(--ng-doc-navbar-height) 0 0 0;
659
+ --ng-doc-layout-top: 0px;
659
660
  --ng-doc-page-block-margin: var(--ng-doc-space-6) 0;
660
661
  --ng-doc-page-wrapper-tabs-height: calc(var(--ng-doc-base-gutter) * 6);
661
662
  --ng-doc-class-color: var(--ng-doc-on-hue);
package/styles/main.css CHANGED
@@ -656,6 +656,7 @@ mark.ng-doc-mark {
656
656
  --ng-doc-code-background: var(--ng-doc-base-1);
657
657
  --ng-doc-page-padding: calc(var(--ng-doc-base-gutter) * 3) var(--ng-doc-app-horizontal-padding);
658
658
  --ng-doc-main-padding: var(--ng-doc-navbar-height) 0 0 0;
659
+ --ng-doc-layout-top: 0px;
659
660
  --ng-doc-page-block-margin: var(--ng-doc-space-6) 0;
660
661
  --ng-doc-page-wrapper-tabs-height: calc(var(--ng-doc-base-gutter) * 6);
661
662
  --ng-doc-class-color: var(--ng-doc-on-hue);
@@ -37,6 +37,8 @@ interface NgDocDefaultSearchEngineOptions {
37
37
  declare class NgDocDefaultSearchEngine extends NgDocSearchEngine {
38
38
  private options?;
39
39
  private db$;
40
+ /** The loaded index, shared by every search until a development update replaces it. */
41
+ private index?;
40
42
  constructor(options?: NgDocDefaultSearchEngineOptions | undefined);
41
43
  /**
42
44
  * Search the documentation for the given query.
@@ -44,6 +46,15 @@ declare class NgDocDefaultSearchEngine extends NgDocSearchEngine {
44
46
  */
45
47
  search(query: string): Observable<NgDocSearchResult[]>;
46
48
  private searchPages;
49
+ /**
50
+ * The Vite development host updates an edited guide in place (`ɵNG_DOC_CONTENT_UPDATE_EVENT`);
51
+ * when its search records changed too, the next search loads the index again, as a reloaded
52
+ * page would. The listener holds the engine weakly, so an engine nobody uses any more stops
53
+ * listening. Nothing dispatches the event outside the development host, and Angular's
54
+ * production mode skips the listener altogether.
55
+ */
56
+ private refreshOnContentUpdates;
57
+ private loadIndex;
47
58
  private request;
48
59
  private createDatabase;
49
60
  }
@@ -43,6 +43,11 @@ declare abstract class NgDocRootPage {
43
43
  readonly demoRoute?: string;
44
44
  /** Whether the page's demos are isolated unless their `demo` action says otherwise (`isolatedDemos`). */
45
45
  readonly isolatedDemos?: boolean;
46
+ /**
47
+ * Whether the page's playgrounds are isolated unless their `playground` action or configuration
48
+ * says otherwise (`isolatedPlaygrounds`).
49
+ */
50
+ readonly isolatedPlaygrounds?: boolean;
46
51
  }
47
52
 
48
53
  export { NgDocRootPage };
@@ -1,6 +1,7 @@
1
1
  import * as _angular_forms_signals from '@angular/forms/signals';
2
2
  import * as _angular_core from '@angular/core';
3
3
  import { Signal } from '@angular/core';
4
+ import { NgDocApiListTexts } from '@ng-doc/app/interfaces';
4
5
  import { NgDocShortcutsService } from '@ng-doc/app/services/shortcuts';
5
6
  import { NgDocApiListItem } from '@ng-doc/core/interfaces';
6
7
 
@@ -31,7 +32,8 @@ interface KindFilter {
31
32
  * the query parameters (filter, type, scope and group), so a filtered index can be linked.
32
33
  */
33
34
  declare class NgDocApiListComponent {
34
- /** The title of the page. */
35
+ protected readonly texts: NgDocApiListTexts;
36
+ /** The title of the page. Defaults to the `apiList.title` text. */
35
37
  readonly title: _angular_core.InputSignal<string>;
36
38
  /** The segment of the API list data, when the site has more than one API list. */
37
39
  readonly segment: _angular_core.InputSignal<string | undefined>;
@@ -1,11 +1,12 @@
1
1
  import * as i0 from '@angular/core';
2
- import { NgDocPageBreadcrumbs } from '@ng-doc/app/interfaces';
2
+ import { NgDocPageBreadcrumbs, NgDocNavigationTexts } from '@ng-doc/app/interfaces';
3
3
 
4
4
  /**
5
5
  * The breadcrumbs of a page: a navigation landmark that lists the categories above the page and
6
6
  * marks the page itself as the current one.
7
7
  */
8
8
  declare class NgDocBreadcrumbComponent implements NgDocPageBreadcrumbs {
9
+ protected readonly texts: NgDocNavigationTexts;
9
10
  /** Titles from the top category down to the page. */
10
11
  readonly breadcrumbs: i0.InputSignal<string[]>;
11
12
  static ɵfac: i0.ɵɵFactoryDeclaration<NgDocBreadcrumbComponent, never>;
@@ -1,5 +1,6 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { AfterViewInit, Signal } from '@angular/core';
3
+ import { NgDocContentTexts } from '@ng-doc/app/interfaces';
3
4
 
4
5
  /**
5
6
  * Renders a code block: a header with the file name, the language and the highlighted lines
@@ -9,6 +10,7 @@ import { AfterViewInit, Signal } from '@angular/core';
9
10
  * `code-line-numbers` theme variable to `none` hides them.
10
11
  */
11
12
  declare class NgDocCodeComponent implements AfterViewInit {
13
+ protected readonly texts: NgDocContentTexts;
12
14
  private readonly elementRef;
13
15
  /** Highlighted HTML of the code. When empty, the projected content is shown instead. */
14
16
  readonly html: _angular_core.InputSignal<string>;
@@ -1,6 +1,7 @@
1
1
  import * as _angular_forms_signals from '@angular/forms/signals';
2
2
  import * as _angular_core from '@angular/core';
3
3
  import { Signal } from '@angular/core';
4
+ import { NgDocSearchPaletteTexts } from '@ng-doc/app/interfaces';
4
5
  import { NgDocShortcutsService } from '@ng-doc/app/services/shortcuts';
5
6
 
6
7
  /**
@@ -58,7 +59,8 @@ interface Action {
58
59
  * slash key.
59
60
  */
60
61
  declare class NgDocCommandPaletteComponent {
61
- protected readonly scopes: readonly {
62
+ protected readonly texts: NgDocSearchPaletteTexts;
63
+ protected readonly scopes: {
62
64
  id: NgDocCommandPaletteScope;
63
65
  label: string;
64
66
  }[];
@@ -1,5 +1,6 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { Clipboard } from '@angular/cdk/clipboard';
3
+ import { NgDocCopyTexts } from '@ng-doc/app/interfaces';
3
4
  import { NgDocTooltipDirective } from '@ng-doc/ui-kit';
4
5
 
5
6
  /** The text a copy button copies, or a function that reads it when the button is pressed. */
@@ -9,9 +10,10 @@ type NgDocCopyButtonText = string | (() => string);
9
10
  * icon into it.
10
11
  */
11
12
  declare class NgDocCopyButtonComponent {
13
+ protected readonly texts: NgDocCopyTexts;
12
14
  /** The text to copy, or a function that returns it when the button is pressed. */
13
15
  readonly text: _angular_core.InputSignal<NgDocCopyButtonText>;
14
- /** Accessible name of the button, also shown in its tooltip. */
16
+ /** Accessible name of the button, also shown in its tooltip. Defaults to the `copy.copy` text. */
15
17
  readonly label: _angular_core.InputSignal<string>;
16
18
  /** The tooltip of the button. */
17
19
  readonly tooltip: _angular_core.Signal<NgDocTooltipDirective>;
@@ -1,4 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
+ import { NgDocDemoTexts, NgDocCopyTexts } from '@ng-doc/app/interfaces';
2
3
  import { NgDocContent } from '@ng-doc/ui-kit';
3
4
 
4
5
  /**
@@ -6,6 +7,8 @@ import { NgDocContent } from '@ng-doc/ui-kit';
6
7
  * (the rows of a playground use it).
7
8
  */
8
9
  declare class NgDocDemoDisplayerComponent {
10
+ protected readonly texts: NgDocDemoTexts;
11
+ protected readonly copyTexts: NgDocCopyTexts;
9
12
  /** Content shown when the code is revealed; when empty, the highlighted `code` is shown. */
10
13
  readonly codeContent: _angular_core.InputSignal<NgDocContent>;
11
14
  /** Code of the demo, copied by the copy button and shown when there is no `codeContent`. */
@@ -14,16 +17,25 @@ declare class NgDocDemoDisplayerComponent {
14
17
  readonly language: _angular_core.InputSignal<string>;
15
18
  /** Whether the demo is shown in the stage with its controls; otherwise it is shown as is. */
16
19
  readonly container: _angular_core.InputSignal<boolean>;
20
+ /**
21
+ * The background of the canvas, such as the background of an isolated demo that shows a theme
22
+ * of its own.
23
+ */
24
+ readonly canvasBackground: _angular_core.InputSignal<string | undefined>;
25
+ /** The color of the dots of the canvas, such as the dots of a demo's own theme. */
26
+ readonly canvasDots: _angular_core.InputSignal<string | undefined>;
17
27
  /** Whether the displayer draws its border. */
18
28
  readonly border: _angular_core.InputSignal<boolean>;
19
29
  /** Whether the code is revealed. */
20
30
  readonly expanded: _angular_core.ModelSignal<boolean>;
31
+ /** A page that shows the demo alone, which the toolbar opens in a new tab. */
32
+ readonly newTabUrl: _angular_core.InputSignal<string | undefined>;
21
33
  /** Id of the region that holds the code, for the toggle's `aria-controls`. */
22
34
  protected readonly codeId: string;
23
35
  /** Reveals or hides the code. */
24
36
  toggle(): void;
25
37
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgDocDemoDisplayerComponent, never>;
26
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgDocDemoDisplayerComponent, "ng-doc-demo-displayer", never, { "codeContent": { "alias": "codeContent"; "required": false; "isSignal": true; }; "code": { "alias": "code"; "required": false; "isSignal": true; }; "language": { "alias": "language"; "required": false; "isSignal": true; }; "container": { "alias": "container"; "required": false; "isSignal": true; }; "border": { "alias": "border"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; }, { "expanded": "expandedChange"; }, never, ["*", "*"], true, never>;
38
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgDocDemoDisplayerComponent, "ng-doc-demo-displayer", never, { "codeContent": { "alias": "codeContent"; "required": false; "isSignal": true; }; "code": { "alias": "code"; "required": false; "isSignal": true; }; "language": { "alias": "language"; "required": false; "isSignal": true; }; "container": { "alias": "container"; "required": false; "isSignal": true; }; "canvasBackground": { "alias": "canvasBackground"; "required": false; "isSignal": true; }; "canvasDots": { "alias": "canvasDots"; "required": false; "isSignal": true; }; "border": { "alias": "border"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; "newTabUrl": { "alias": "newTabUrl"; "required": false; "isSignal": true; }; }, { "expanded": "expandedChange"; }, never, ["[ngDocDemoControl]", "*", "*"], true, never>;
27
39
  }
28
40
 
29
41
  export { NgDocDemoDisplayerComponent };