@ng-doc/app 22.0.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 (173) 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 +279 -0
  20. package/fesm2022/ng-doc-app-components-demo-frame.mjs.map +1 -0
  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 +97 -14
  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 +838 -141
  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-tabs.mjs +21 -3
  52. package/fesm2022/ng-doc-app-components-tabs.mjs.map +1 -1
  53. package/fesm2022/ng-doc-app-components-theme-toggle.mjs +7 -5
  54. package/fesm2022/ng-doc-app-components-theme-toggle.mjs.map +1 -1
  55. package/fesm2022/ng-doc-app-components-toc.mjs +4 -2
  56. package/fesm2022/ng-doc-app-components-toc.mjs.map +1 -1
  57. package/fesm2022/ng-doc-app-components.mjs +1 -0
  58. package/fesm2022/ng-doc-app-components.mjs.map +1 -1
  59. package/fesm2022/ng-doc-app-constants.mjs +11 -1
  60. package/fesm2022/ng-doc-app-constants.mjs.map +1 -1
  61. package/fesm2022/ng-doc-app-demo-app.mjs +779 -0
  62. package/fesm2022/ng-doc-app-demo-app.mjs.map +1 -0
  63. package/fesm2022/ng-doc-app-helpers.mjs +147 -7
  64. package/fesm2022/ng-doc-app-helpers.mjs.map +1 -1
  65. package/fesm2022/ng-doc-app-processors-processors.mjs +30 -9
  66. package/fesm2022/ng-doc-app-processors-processors.mjs.map +1 -1
  67. package/fesm2022/ng-doc-app-providers-ng-doc-app.mjs +29 -18
  68. package/fesm2022/ng-doc-app-providers-ng-doc-app.mjs.map +1 -1
  69. package/fesm2022/ng-doc-app-providers-texts.mjs +53 -0
  70. package/fesm2022/ng-doc-app-providers-texts.mjs.map +1 -0
  71. package/fesm2022/ng-doc-app-providers-title.mjs +129 -0
  72. package/fesm2022/ng-doc-app-providers-title.mjs.map +1 -0
  73. package/fesm2022/ng-doc-app-providers.mjs +2 -0
  74. package/fesm2022/ng-doc-app-providers.mjs.map +1 -1
  75. package/fesm2022/ng-doc-app-services-content-scroll-intent.mjs +27 -2
  76. package/fesm2022/ng-doc-app-services-content-scroll-intent.mjs.map +1 -1
  77. package/fesm2022/ng-doc-app-services-highlighter.mjs +23 -16
  78. package/fesm2022/ng-doc-app-services-highlighter.mjs.map +1 -1
  79. package/fesm2022/ng-doc-app-services-route-preloader.mjs +34 -10
  80. package/fesm2022/ng-doc-app-services-route-preloader.mjs.map +1 -1
  81. package/fesm2022/ng-doc-app-services-shortcuts.mjs +38 -4
  82. package/fesm2022/ng-doc-app-services-shortcuts.mjs.map +1 -1
  83. package/fesm2022/ng-doc-app-texts-ar.mjs +238 -0
  84. package/fesm2022/ng-doc-app-texts-ar.mjs.map +1 -0
  85. package/fesm2022/ng-doc-app-texts-de.mjs +205 -0
  86. package/fesm2022/ng-doc-app-texts-de.mjs.map +1 -0
  87. package/fesm2022/ng-doc-app-texts-es.mjs +205 -0
  88. package/fesm2022/ng-doc-app-texts-es.mjs.map +1 -0
  89. package/fesm2022/ng-doc-app-texts-fr.mjs +205 -0
  90. package/fesm2022/ng-doc-app-texts-fr.mjs.map +1 -0
  91. package/fesm2022/ng-doc-app-texts-hi.mjs +219 -0
  92. package/fesm2022/ng-doc-app-texts-hi.mjs.map +1 -0
  93. package/fesm2022/ng-doc-app-texts-ja.mjs +205 -0
  94. package/fesm2022/ng-doc-app-texts-ja.mjs.map +1 -0
  95. package/fesm2022/ng-doc-app-texts-ko.mjs +205 -0
  96. package/fesm2022/ng-doc-app-texts-ko.mjs.map +1 -0
  97. package/fesm2022/ng-doc-app-texts-pt-br.mjs +205 -0
  98. package/fesm2022/ng-doc-app-texts-pt-br.mjs.map +1 -0
  99. package/fesm2022/ng-doc-app-texts-ru.mjs +231 -0
  100. package/fesm2022/ng-doc-app-texts-ru.mjs.map +1 -0
  101. package/fesm2022/ng-doc-app-texts-uk.mjs +231 -0
  102. package/fesm2022/ng-doc-app-texts-uk.mjs.map +1 -0
  103. package/fesm2022/ng-doc-app-texts-zh.mjs +205 -0
  104. package/fesm2022/ng-doc-app-texts-zh.mjs.map +1 -0
  105. package/fesm2022/ng-doc-app-tokens.mjs +214 -1
  106. package/fesm2022/ng-doc-app-tokens.mjs.map +1 -1
  107. package/fesm2022/ng-doc-app-type-controls-json-control.mjs +90 -0
  108. package/fesm2022/ng-doc-app-type-controls-json-control.mjs.map +1 -0
  109. package/fesm2022/ng-doc-app-type-controls-list-control.mjs +792 -0
  110. package/fesm2022/ng-doc-app-type-controls-list-control.mjs.map +1 -0
  111. package/fesm2022/ng-doc-app-type-controls-type-alias-control.mjs +45 -8
  112. package/fesm2022/ng-doc-app-type-controls-type-alias-control.mjs.map +1 -1
  113. package/fesm2022/ng-doc-app-type-controls.mjs +2 -0
  114. package/fesm2022/ng-doc-app-type-controls.mjs.map +1 -1
  115. package/package.json +73 -4
  116. package/styles/global.css +4 -0
  117. package/styles/main.css +4 -0
  118. package/styles/themes/dark.css +10 -0
  119. package/types/ng-doc-app-classes-default-search-engine.d.ts +11 -0
  120. package/types/ng-doc-app-classes-root-page.d.ts +13 -0
  121. package/types/ng-doc-app-components-api-list.d.ts +3 -1
  122. package/types/ng-doc-app-components-breadcrumb.d.ts +2 -1
  123. package/types/ng-doc-app-components-code.d.ts +2 -0
  124. package/types/ng-doc-app-components-command-palette.d.ts +3 -1
  125. package/types/ng-doc-app-components-copy-button.d.ts +3 -1
  126. package/types/ng-doc-app-components-demo-displayer.d.ts +13 -1
  127. package/types/ng-doc-app-components-demo-frame.d.ts +107 -0
  128. package/types/ng-doc-app-components-demo.d.ts +47 -10
  129. package/types/ng-doc-app-components-fullscreen-button.d.ts +2 -0
  130. package/types/ng-doc-app-components-fullscreen-toggle.d.ts +2 -0
  131. package/types/ng-doc-app-components-heading-anchor.d.ts +2 -0
  132. package/types/ng-doc-app-components-image-viewer.d.ts +2 -0
  133. package/types/ng-doc-app-components-navbar.d.ts +2 -0
  134. package/types/ng-doc-app-components-page-navigation.d.ts +2 -1
  135. package/types/ng-doc-app-components-page.d.ts +10 -1
  136. package/types/ng-doc-app-components-playground.d.ts +260 -42
  137. package/types/ng-doc-app-components-root.d.ts +18 -0
  138. package/types/ng-doc-app-components-search-result.d.ts +2 -0
  139. package/types/ng-doc-app-components-search.d.ts +2 -0
  140. package/types/ng-doc-app-components-sidebar.d.ts +2 -1
  141. package/types/ng-doc-app-components-tabs.d.ts +13 -3
  142. package/types/ng-doc-app-components-theme-toggle.d.ts +4 -1
  143. package/types/ng-doc-app-components-toc.d.ts +2 -1
  144. package/types/ng-doc-app-components.d.ts +1 -0
  145. package/types/ng-doc-app-constants.d.ts +11 -1
  146. package/types/ng-doc-app-demo-app.d.ts +297 -0
  147. package/types/ng-doc-app-helpers.d.ts +75 -4
  148. package/types/ng-doc-app-interfaces.d.ts +635 -6
  149. package/types/ng-doc-app-processors-processors.d.ts +5 -0
  150. package/types/ng-doc-app-providers-ng-doc-app.d.ts +7 -1
  151. package/types/ng-doc-app-providers-texts.d.ts +28 -0
  152. package/types/ng-doc-app-providers-title.d.ts +59 -0
  153. package/types/ng-doc-app-providers.d.ts +2 -0
  154. package/types/ng-doc-app-services-content-scroll-intent.d.ts +11 -1
  155. package/types/ng-doc-app-services-highlighter.d.ts +15 -6
  156. package/types/ng-doc-app-services-route-preloader.d.ts +13 -1
  157. package/types/ng-doc-app-services-shortcuts.d.ts +16 -0
  158. package/types/ng-doc-app-texts-ar.d.ts +13 -0
  159. package/types/ng-doc-app-texts-de.d.ts +12 -0
  160. package/types/ng-doc-app-texts-es.d.ts +12 -0
  161. package/types/ng-doc-app-texts-fr.d.ts +12 -0
  162. package/types/ng-doc-app-texts-hi.d.ts +12 -0
  163. package/types/ng-doc-app-texts-ja.d.ts +12 -0
  164. package/types/ng-doc-app-texts-ko.d.ts +12 -0
  165. package/types/ng-doc-app-texts-pt-br.d.ts +12 -0
  166. package/types/ng-doc-app-texts-ru.d.ts +12 -0
  167. package/types/ng-doc-app-texts-uk.d.ts +12 -0
  168. package/types/ng-doc-app-texts-zh.d.ts +12 -0
  169. package/types/ng-doc-app-tokens.d.ts +21 -2
  170. package/types/ng-doc-app-type-controls-json-control.d.ts +38 -0
  171. package/types/ng-doc-app-type-controls-list-control.d.ts +313 -0
  172. package/types/ng-doc-app-type-controls-type-alias-control.d.ts +28 -5
  173. package/types/ng-doc-app-type-controls.d.ts +2 -0
@@ -2,7 +2,10 @@ import * as i0 from '@angular/core';
2
2
  import { input, computed, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import { NgDocTabGroupComponent, NgDocTabComponent, NgDocIconComponent, NgDocExecutePipe } from '@ng-doc/ui-kit';
4
4
 
5
- /** Grouped code blocks of a page, shown as tabs. */
5
+ /**
6
+ * Tabs of a page: grouped code blocks, or any content that Markdown wraps in
7
+ * `<ng-doc-tab group="…" name="…">` elements.
8
+ */
6
9
  class NgDocTabsComponent {
7
10
  constructor() {
8
11
  /** The tabs; their content is moved into the open panel. */
@@ -11,6 +14,19 @@ class NgDocTabsComponent {
11
14
  /** Index of the tab that opens first: the one marked active, or the first. */
12
15
  this.activeIndex = computed(() => Math.max(this.tabs().findIndex((tab) => tab.active), 0), /* @ts-ignore */
13
16
  ...(ngDevMode ? [{ debugName: "activeIndex" }] : /* istanbul ignore next */ []));
17
+ /**
18
+ * Whether the tabs hold page content rather than a code group. A code group has one code block
19
+ * per tab and is drawn as one framed code surface; content tabs are only a tab bar over their
20
+ * content, so a framed demo or code block inside them doesn't sit in a second frame.
21
+ */
22
+ this.contentTabs = computed(() => this.tabs().some((tab) => tab.content.childElementCount !== 1 ||
23
+ !tab.content.firstElementChild?.matches('ng-doc-code, pre')), /* @ts-ignore */
24
+ ...(ngDevMode ? [{ debugName: "contentTabs" }] : /* istanbul ignore next */ []));
25
+ }
26
+ ngOnInit() {
27
+ // The tabs processor leaves the contents on the page until every processor has run on them;
28
+ // only the open tab's content is shown, in the panel.
29
+ this.tabs().forEach((tab) => tab.content.remove());
14
30
  }
15
31
  /**
16
32
  * Moves a tab's content into its panel.
@@ -21,11 +37,13 @@ class NgDocTabsComponent {
21
37
  parent.appendChild(element);
22
38
  }
23
39
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocTabsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: NgDocTabsComponent, isStandalone: true, selector: "ng-doc-tabs", inputs: { tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<ng-doc-tab-group [openedTab]=\"activeIndex()\">\n @for (tab of tabs(); track tab; let i = $index) {\n <ng-doc-tab [label]=\"label\" [content]=\"content\" [id]=\"i\">\n <ng-template #label>\n @if (tab.icon) {\n <ng-doc-icon [customIcon]=\"tab.icon\"></ng-doc-icon>\n }\n {{ tab.title }}\n </ng-template>\n <ng-template #content>\n <div #element>\n {{ appendElement | execute: tab.content : element }}\n </div>\n </ng-template>\n </ng-doc-tab>\n }\n</ng-doc-tab-group>\n", styles: [":host{display:block;border-radius:var(--ng-doc-tabs-border-radius);border:var(--ng-doc-tabs-border, 1px solid var(--ng-doc-border-color));margin:var(--ng-doc-tabs-margin);overflow:hidden;--ng-doc-code-margin: 0;--ng-doc-code-border-radius: 0;--ng-doc-code-border: none;--ng-doc-tab-group-background: var(--ng-doc-code-background);--ng-doc-tab-group-header-background: var(--ng-doc-code-background);--ng-doc-tab-group-tabs-background: var(--ng-doc-code-header-background, transparent)}\n"], dependencies: [{ kind: "component", type: NgDocTabGroupComponent, selector: "ng-doc-tab-group", inputs: ["openedTab"] }, { kind: "component", type: NgDocTabComponent, selector: "ng-doc-tab, a[ng-doc-tab]", inputs: ["label", "id", "content"] }, { kind: "component", type: NgDocIconComponent, selector: "ng-doc-icon", inputs: ["icon", "customIcon", "size"] }, { kind: "pipe", type: NgDocExecutePipe, name: "execute" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
40
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: NgDocTabsComponent, isStandalone: true, selector: "ng-doc-tabs", inputs: { tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.ng-doc-content-tabs": "contentTabs()" } }, ngImport: i0, template: "<ng-doc-tab-group [openedTab]=\"activeIndex()\" [appearance]=\"contentTabs() ? 'plain' : 'framed'\">\n @for (tab of tabs(); track tab; let i = $index) {\n <ng-doc-tab [label]=\"label\" [content]=\"content\" [id]=\"i\">\n <ng-template #label>\n @if (tab.icon) {\n <ng-doc-icon [customIcon]=\"tab.icon\"></ng-doc-icon>\n }\n {{ tab.title }}\n </ng-template>\n <ng-template #content>\n <div #element [class.ng-doc-tabs-content]=\"contentTabs()\">\n {{ appendElement | execute: tab.content : element }}\n </div>\n </ng-template>\n </ng-doc-tab>\n }\n</ng-doc-tab-group>\n", styles: [":host{display:block;margin:var(--ng-doc-tabs-margin)}:host(:not(.ng-doc-content-tabs)){border-radius:var(--ng-doc-tabs-border-radius);border:var(--ng-doc-tabs-border, 1px solid var(--ng-doc-border-color));overflow:hidden;--ng-doc-code-margin: 0;--ng-doc-code-border-radius: 0;--ng-doc-code-border: none;--ng-doc-tab-group-background: var(--ng-doc-code-background);--ng-doc-tab-group-header-background: var(--ng-doc-code-background);--ng-doc-tab-group-tabs-background: var(--ng-doc-code-header-background, transparent)}.ng-doc-tabs-content ::ng-deep>*>:first-child{margin-top:0}.ng-doc-tabs-content ::ng-deep>*>:last-child{margin-bottom:0}\n"], dependencies: [{ kind: "component", type: NgDocTabGroupComponent, selector: "ng-doc-tab-group", inputs: ["appearance", "openedTab"] }, { kind: "component", type: NgDocTabComponent, selector: "ng-doc-tab, a[ng-doc-tab]", inputs: ["label", "id", "content"] }, { kind: "component", type: NgDocIconComponent, selector: "ng-doc-icon", inputs: ["icon", "customIcon", "size"] }, { kind: "pipe", type: NgDocExecutePipe, name: "execute" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25
41
  }
26
42
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocTabsComponent, decorators: [{
27
43
  type: Component,
28
- args: [{ selector: 'ng-doc-tabs', imports: [NgDocTabGroupComponent, NgDocTabComponent, NgDocExecutePipe, NgDocIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-doc-tab-group [openedTab]=\"activeIndex()\">\n @for (tab of tabs(); track tab; let i = $index) {\n <ng-doc-tab [label]=\"label\" [content]=\"content\" [id]=\"i\">\n <ng-template #label>\n @if (tab.icon) {\n <ng-doc-icon [customIcon]=\"tab.icon\"></ng-doc-icon>\n }\n {{ tab.title }}\n </ng-template>\n <ng-template #content>\n <div #element>\n {{ appendElement | execute: tab.content : element }}\n </div>\n </ng-template>\n </ng-doc-tab>\n }\n</ng-doc-tab-group>\n", styles: [":host{display:block;border-radius:var(--ng-doc-tabs-border-radius);border:var(--ng-doc-tabs-border, 1px solid var(--ng-doc-border-color));margin:var(--ng-doc-tabs-margin);overflow:hidden;--ng-doc-code-margin: 0;--ng-doc-code-border-radius: 0;--ng-doc-code-border: none;--ng-doc-tab-group-background: var(--ng-doc-code-background);--ng-doc-tab-group-header-background: var(--ng-doc-code-background);--ng-doc-tab-group-tabs-background: var(--ng-doc-code-header-background, transparent)}\n"] }]
44
+ args: [{ selector: 'ng-doc-tabs', imports: [NgDocTabGroupComponent, NgDocTabComponent, NgDocExecutePipe, NgDocIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, host: {
45
+ '[class.ng-doc-content-tabs]': 'contentTabs()',
46
+ }, template: "<ng-doc-tab-group [openedTab]=\"activeIndex()\" [appearance]=\"contentTabs() ? 'plain' : 'framed'\">\n @for (tab of tabs(); track tab; let i = $index) {\n <ng-doc-tab [label]=\"label\" [content]=\"content\" [id]=\"i\">\n <ng-template #label>\n @if (tab.icon) {\n <ng-doc-icon [customIcon]=\"tab.icon\"></ng-doc-icon>\n }\n {{ tab.title }}\n </ng-template>\n <ng-template #content>\n <div #element [class.ng-doc-tabs-content]=\"contentTabs()\">\n {{ appendElement | execute: tab.content : element }}\n </div>\n </ng-template>\n </ng-doc-tab>\n }\n</ng-doc-tab-group>\n", styles: [":host{display:block;margin:var(--ng-doc-tabs-margin)}:host(:not(.ng-doc-content-tabs)){border-radius:var(--ng-doc-tabs-border-radius);border:var(--ng-doc-tabs-border, 1px solid var(--ng-doc-border-color));overflow:hidden;--ng-doc-code-margin: 0;--ng-doc-code-border-radius: 0;--ng-doc-code-border: none;--ng-doc-tab-group-background: var(--ng-doc-code-background);--ng-doc-tab-group-header-background: var(--ng-doc-code-background);--ng-doc-tab-group-tabs-background: var(--ng-doc-code-header-background, transparent)}.ng-doc-tabs-content ::ng-deep>*>:first-child{margin-top:0}.ng-doc-tabs-content ::ng-deep>*>:last-child{margin-bottom:0}\n"] }]
29
47
  }], propDecorators: { tabs: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabs", required: false }] }] } });
30
48
 
31
49
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ng-doc-app-components-tabs.mjs","sources":["../../../../libs/app/components/tabs/tabs.component.ts","../../../../libs/app/components/tabs/tabs.component.html","../../../../libs/app/components/tabs/ng-doc-app-components-tabs.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, input, Signal } from '@angular/core';\nimport { NgDocTab } from '@ng-doc/app/interfaces';\nimport {\n NgDocExecutePipe,\n NgDocIconComponent,\n NgDocTabComponent,\n NgDocTabGroupComponent,\n} from '@ng-doc/ui-kit';\n\n/** Grouped code blocks of a page, shown as tabs. */\n@Component({\n selector: 'ng-doc-tabs',\n imports: [NgDocTabGroupComponent, NgDocTabComponent, NgDocExecutePipe, NgDocIconComponent],\n templateUrl: './tabs.component.html',\n styleUrls: ['./tabs.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgDocTabsComponent {\n /** The tabs; their content is moved into the open panel. */\n readonly tabs = input<NgDocTab[]>([]);\n\n /** Index of the tab that opens first: the one marked active, or the first. */\n protected readonly activeIndex: Signal<number> = computed(() =>\n Math.max(\n this.tabs().findIndex((tab: NgDocTab) => tab.active),\n 0,\n ),\n );\n\n /**\n * Moves a tab's content into its panel.\n * @param element - Content of the tab.\n * @param parent - The panel element.\n */\n appendElement(element: Element, parent: Element): void {\n parent.appendChild(element);\n }\n}\n","<ng-doc-tab-group [openedTab]=\"activeIndex()\">\n @for (tab of tabs(); track tab; let i = $index) {\n <ng-doc-tab [label]=\"label\" [content]=\"content\" [id]=\"i\">\n <ng-template #label>\n @if (tab.icon) {\n <ng-doc-icon [customIcon]=\"tab.icon\"></ng-doc-icon>\n }\n {{ tab.title }}\n </ng-template>\n <ng-template #content>\n <div #element>\n {{ appendElement | execute: tab.content : element }}\n </div>\n </ng-template>\n </ng-doc-tab>\n }\n</ng-doc-tab-group>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AASA;MAQa,kBAAkB,CAAA;AAP/B,IAAA,WAAA,GAAA;;QASW,IAAA,CAAA,IAAI,GAAG,KAAK,CAAa,EAAE;iFAAC;;AAGlB,QAAA,IAAA,CAAA,WAAW,GAAmB,QAAQ,CAAC,MACxD,IAAI,CAAC,GAAG,CACN,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,GAAa,KAAK,GAAG,CAAC,MAAM,CAAC,EACpD,CAAC,CACF;wFACF;AAUF,IAAA;AARC;;;;AAIG;IACH,aAAa,CAAC,OAAgB,EAAE,MAAe,EAAA;AAC7C,QAAA,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;IAC7B;8GAnBW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjB/B,wiBAiBA,EAAA,MAAA,EAAA,CAAA,weAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDLY,sBAAsB,oFAAE,iBAAiB,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAoB,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAApC,gBAAgB,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAK1D,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAP9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,EAAA,OAAA,EACd,CAAC,sBAAsB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,EAAA,eAAA,EAGzE,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,wiBAAA,EAAA,MAAA,EAAA,CAAA,weAAA,CAAA,EAAA;;;AEfjD;;AAEG;;;;"}
1
+ {"version":3,"file":"ng-doc-app-components-tabs.mjs","sources":["../../../../libs/app/components/tabs/tabs.component.ts","../../../../libs/app/components/tabs/tabs.component.html","../../../../libs/app/components/tabs/ng-doc-app-components-tabs.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, input, OnInit, Signal } from '@angular/core';\nimport { NgDocTab } from '@ng-doc/app/interfaces';\nimport {\n NgDocExecutePipe,\n NgDocIconComponent,\n NgDocTabComponent,\n NgDocTabGroupComponent,\n} from '@ng-doc/ui-kit';\n\n/**\n * Tabs of a page: grouped code blocks, or any content that Markdown wraps in\n * `<ng-doc-tab group=\"…\" name=\"…\">` elements.\n */\n@Component({\n selector: 'ng-doc-tabs',\n imports: [NgDocTabGroupComponent, NgDocTabComponent, NgDocExecutePipe, NgDocIconComponent],\n templateUrl: './tabs.component.html',\n styleUrls: ['./tabs.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.ng-doc-content-tabs]': 'contentTabs()',\n },\n})\nexport class NgDocTabsComponent implements OnInit {\n /** The tabs; their content is moved into the open panel. */\n readonly tabs = input<NgDocTab[]>([]);\n\n /** Index of the tab that opens first: the one marked active, or the first. */\n protected readonly activeIndex: Signal<number> = computed(() =>\n Math.max(\n this.tabs().findIndex((tab: NgDocTab) => tab.active),\n 0,\n ),\n );\n\n /**\n * Whether the tabs hold page content rather than a code group. A code group has one code block\n * per tab and is drawn as one framed code surface; content tabs are only a tab bar over their\n * content, so a framed demo or code block inside them doesn't sit in a second frame.\n */\n protected readonly contentTabs: Signal<boolean> = computed(() =>\n this.tabs().some(\n (tab: NgDocTab) =>\n tab.content.childElementCount !== 1 ||\n !tab.content.firstElementChild?.matches('ng-doc-code, pre'),\n ),\n );\n\n ngOnInit(): void {\n // The tabs processor leaves the contents on the page until every processor has run on them;\n // only the open tab's content is shown, in the panel.\n this.tabs().forEach((tab: NgDocTab) => tab.content.remove());\n }\n\n /**\n * Moves a tab's content into its panel.\n * @param element - Content of the tab.\n * @param parent - The panel element.\n */\n appendElement(element: Element, parent: Element): void {\n parent.appendChild(element);\n }\n}\n","<ng-doc-tab-group [openedTab]=\"activeIndex()\" [appearance]=\"contentTabs() ? 'plain' : 'framed'\">\n @for (tab of tabs(); track tab; let i = $index) {\n <ng-doc-tab [label]=\"label\" [content]=\"content\" [id]=\"i\">\n <ng-template #label>\n @if (tab.icon) {\n <ng-doc-icon [customIcon]=\"tab.icon\"></ng-doc-icon>\n }\n {{ tab.title }}\n </ng-template>\n <ng-template #content>\n <div #element [class.ng-doc-tabs-content]=\"contentTabs()\">\n {{ appendElement | execute: tab.content : element }}\n </div>\n </ng-template>\n </ng-doc-tab>\n }\n</ng-doc-tab-group>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AASA;;;AAGG;MAWU,kBAAkB,CAAA;AAV/B,IAAA,WAAA,GAAA;;QAYW,IAAA,CAAA,IAAI,GAAG,KAAK,CAAa,EAAE;iFAAC;;AAGlB,QAAA,IAAA,CAAA,WAAW,GAAmB,QAAQ,CAAC,MACxD,IAAI,CAAC,GAAG,CACN,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,GAAa,KAAK,GAAG,CAAC,MAAM,CAAC,EACpD,CAAC,CACF;wFACF;AAED;;;;AAIG;QACgB,IAAA,CAAA,WAAW,GAAoB,QAAQ,CAAC,MACzD,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CACd,CAAC,GAAa,KACZ,GAAG,CAAC,OAAO,CAAC,iBAAiB,KAAK,CAAC;YACnC,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAC9D;wFACF;AAgBF,IAAA;IAdC,QAAQ,GAAA;;;AAGN,QAAA,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,GAAa,KAAK,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IAC9D;AAEA;;;;AAIG;IACH,aAAa,CAAC,OAAgB,EAAE,MAAe,EAAA;AAC7C,QAAA,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;IAC7B;8GAtCW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,2BAAA,EAAA,eAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvB/B,0oBAiBA,EAAA,MAAA,EAAA,CAAA,koBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDFY,sBAAsB,kGAAE,iBAAiB,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAoB,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAApC,gBAAgB,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAQ1D,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAV9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,EAAA,OAAA,EACd,CAAC,sBAAsB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,EAAA,eAAA,EAGzE,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,6BAA6B,EAAE,eAAe;AAC/C,qBAAA,EAAA,QAAA,EAAA,0oBAAA,EAAA,MAAA,EAAA,CAAA,koBAAA,CAAA,EAAA;;;AErBH;;AAEG;;;;"}
@@ -1,12 +1,13 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, computed, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import { NgDocThemeService } from '@ng-doc/app/services/theme';
4
+ import { NG_DOC_TEXTS } from '@ng-doc/app/tokens';
4
5
  import { NgDocButtonIconComponent, NgDocTooltipDirective } from '@ng-doc/ui-kit';
5
6
 
6
7
  const THEMES = [
7
- { name: 'Auto', theme: 'auto' },
8
- { name: 'Light', theme: null },
9
- { name: 'Dark', theme: 'dark' },
8
+ { text: 'auto', theme: 'auto' },
9
+ { text: 'light', theme: null },
10
+ { text: 'dark', theme: 'dark' },
10
11
  ];
11
12
  /**
12
13
  * Button that switches the theme in turn: Auto (follows the system), Light and Dark.
@@ -16,6 +17,7 @@ const THEMES = [
16
17
  class NgDocThemeToggleComponent {
17
18
  constructor() {
18
19
  this.themeService = inject(NgDocThemeService);
20
+ this.texts = inject(NG_DOC_TEXTS).theme;
19
21
  /**
20
22
  * The current theme. A custom theme id counts as Auto, because the toggle does not offer it.
21
23
  */
@@ -38,11 +40,11 @@ class NgDocThemeToggleComponent {
38
40
  this.themeService.set(theme ?? undefined);
39
41
  }
40
42
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocThemeToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
41
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: NgDocThemeToggleComponent, isStandalone: true, selector: "ng-doc-theme-toggle", ngImport: i0, template: "<button\n type=\"button\"\n ng-doc-button-icon\n size=\"large\"\n [rounded]=\"false\"\n [attr.aria-label]=\"currentTheme().name + ' theme. Switch to ' + nextTheme().name.toLowerCase()\"\n [ngDocTooltip]=\"currentTheme().name + ' theme'\"\n (click)=\"toggleTheme()\">\n @switch (currentTheme().name) {\n @case ('Light') {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path\n d=\"M12 2v2m0 16v2M4.9 4.9l1.4 1.4m11.4 11.4 1.4 1.4M2 12h2m16 0h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\" />\n </svg>\n }\n @case ('Dark') {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z\" />\n </svg>\n }\n @default {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 3a9 9 0 0 0 0 18z\" fill=\"currentColor\" />\n </svg>\n }\n }\n</button>\n", styles: [":host{display:inline-flex;flex:none}\n"], dependencies: [{ 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: NgDocTooltipDirective, selector: "[ngDocTooltip]", inputs: ["ngDocTooltip", "delay", "displayOrigin", "pointerOrigin", "positions", "canOpen", "panelClass", "minHeight", "maxHeight", "height", "minWidth", "maxWidth", "width"], outputs: ["beforeOpen", "afterOpen", "beforeClose", "afterClose"], exportAs: ["ngDocTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
43
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: NgDocThemeToggleComponent, isStandalone: true, selector: "ng-doc-theme-toggle", ngImport: i0, template: "<button\n type=\"button\"\n ng-doc-button-icon\n size=\"large\"\n [rounded]=\"false\"\n [attr.aria-label]=\"\n texts.label({ current: texts[currentTheme().text], next: texts[nextTheme().text] })\n \"\n [ngDocTooltip]=\"texts.tooltip({ current: texts[currentTheme().text] })\"\n (click)=\"toggleTheme()\">\n @switch (currentTheme().text) {\n @case ('light') {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path\n d=\"M12 2v2m0 16v2M4.9 4.9l1.4 1.4m11.4 11.4 1.4 1.4M2 12h2m16 0h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\" />\n </svg>\n }\n @case ('dark') {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z\" />\n </svg>\n }\n @default {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 3a9 9 0 0 0 0 18z\" fill=\"currentColor\" />\n </svg>\n }\n }\n</button>\n", styles: [":host{display:inline-flex;flex:none}\n"], dependencies: [{ 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: NgDocTooltipDirective, selector: "[ngDocTooltip]", inputs: ["ngDocTooltip", "delay", "displayOrigin", "pointerOrigin", "positions", "canOpen", "panelClass", "minHeight", "maxHeight", "height", "minWidth", "maxWidth", "width"], outputs: ["beforeOpen", "afterOpen", "beforeClose", "afterClose"], exportAs: ["ngDocTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
42
44
  }
43
45
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocThemeToggleComponent, decorators: [{
44
46
  type: Component,
45
- args: [{ selector: 'ng-doc-theme-toggle', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgDocButtonIconComponent, NgDocTooltipDirective], template: "<button\n type=\"button\"\n ng-doc-button-icon\n size=\"large\"\n [rounded]=\"false\"\n [attr.aria-label]=\"currentTheme().name + ' theme. Switch to ' + nextTheme().name.toLowerCase()\"\n [ngDocTooltip]=\"currentTheme().name + ' theme'\"\n (click)=\"toggleTheme()\">\n @switch (currentTheme().name) {\n @case ('Light') {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path\n d=\"M12 2v2m0 16v2M4.9 4.9l1.4 1.4m11.4 11.4 1.4 1.4M2 12h2m16 0h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\" />\n </svg>\n }\n @case ('Dark') {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z\" />\n </svg>\n }\n @default {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 3a9 9 0 0 0 0 18z\" fill=\"currentColor\" />\n </svg>\n }\n }\n</button>\n", styles: [":host{display:inline-flex;flex:none}\n"] }]
47
+ args: [{ selector: 'ng-doc-theme-toggle', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgDocButtonIconComponent, NgDocTooltipDirective], template: "<button\n type=\"button\"\n ng-doc-button-icon\n size=\"large\"\n [rounded]=\"false\"\n [attr.aria-label]=\"\n texts.label({ current: texts[currentTheme().text], next: texts[nextTheme().text] })\n \"\n [ngDocTooltip]=\"texts.tooltip({ current: texts[currentTheme().text] })\"\n (click)=\"toggleTheme()\">\n @switch (currentTheme().text) {\n @case ('light') {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path\n d=\"M12 2v2m0 16v2M4.9 4.9l1.4 1.4m11.4 11.4 1.4 1.4M2 12h2m16 0h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\" />\n </svg>\n }\n @case ('dark') {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z\" />\n </svg>\n }\n @default {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 3a9 9 0 0 0 0 18z\" fill=\"currentColor\" />\n </svg>\n }\n }\n</button>\n", styles: [":host{display:inline-flex;flex:none}\n"] }]
46
48
  }] });
47
49
 
48
50
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ng-doc-app-components-theme-toggle.mjs","sources":["../../../../libs/app/components/theme-toggle/theme-toggle.component.ts","../../../../libs/app/components/theme-toggle/theme-toggle.component.html","../../../../libs/app/components/theme-toggle/ng-doc-app-components-theme-toggle.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, inject, Signal } from '@angular/core';\nimport { NgDocThemeService } from '@ng-doc/app/services/theme';\nimport { NgDocButtonIconComponent, NgDocTooltipDirective } from '@ng-doc/ui-kit';\n\ninterface ToggleTheme {\n name: string;\n theme: string | null;\n}\n\nconst THEMES: readonly ToggleTheme[] = [\n { name: 'Auto', theme: 'auto' },\n { name: 'Light', theme: null },\n { name: 'Dark', theme: 'dark' },\n];\n\n/**\n * Button that switches the theme in turn: Auto (follows the system), Light and Dark.\n *\n * It shows the current theme and follows theme changes made elsewhere through the theme service.\n */\n@Component({\n selector: 'ng-doc-theme-toggle',\n templateUrl: './theme-toggle.component.html',\n styleUrls: ['./theme-toggle.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgDocButtonIconComponent, NgDocTooltipDirective],\n})\nexport class NgDocThemeToggleComponent {\n protected readonly themeService = inject(NgDocThemeService);\n\n /**\n * The current theme. A custom theme id counts as Auto, because the toggle does not offer it.\n */\n protected readonly currentTheme: Signal<ToggleTheme> = computed(() => {\n const theme: string | null = this.themeService.theme();\n\n return THEMES.find(({ theme: t }) => t === theme) ?? THEMES[0];\n });\n\n /**\n * The theme the next press switches to.\n */\n protected readonly nextTheme: Signal<ToggleTheme> = computed(\n () => THEMES[(THEMES.indexOf(this.currentTheme()) + 1) % THEMES.length],\n );\n\n /**\n * Switches to the next theme.\n */\n toggleTheme(): void {\n const { theme } = this.nextTheme();\n\n this.themeService.set(theme ?? undefined);\n }\n}\n","<button\n type=\"button\"\n ng-doc-button-icon\n size=\"large\"\n [rounded]=\"false\"\n [attr.aria-label]=\"currentTheme().name + ' theme. Switch to ' + nextTheme().name.toLowerCase()\"\n [ngDocTooltip]=\"currentTheme().name + ' theme'\"\n (click)=\"toggleTheme()\">\n @switch (currentTheme().name) {\n @case ('Light') {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path\n d=\"M12 2v2m0 16v2M4.9 4.9l1.4 1.4m11.4 11.4 1.4 1.4M2 12h2m16 0h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\" />\n </svg>\n }\n @case ('Dark') {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z\" />\n </svg>\n }\n @default {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 3a9 9 0 0 0 0 18z\" fill=\"currentColor\" />\n </svg>\n }\n }\n</button>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AASA,MAAM,MAAM,GAA2B;AACrC,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;AAC/B,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;AAC9B,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;CAChC;AAED;;;;AAIG;MAQU,yBAAyB,CAAA;AAPtC,IAAA,WAAA,GAAA;AAQqB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAE3D;;AAEG;AACgB,QAAA,IAAA,CAAA,YAAY,GAAwB,QAAQ,CAAC,MAAK;YACnE,MAAM,KAAK,GAAkB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;YAEtD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;QAChE,CAAC;yFAAC;AAEF;;AAEG;QACgB,IAAA,CAAA,SAAS,GAAwB,QAAQ,CAC1D,MAAM,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC;sFACxE;AAUF,IAAA;AARC;;AAEG;IACH,WAAW,GAAA;QACT,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE;QAElC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,IAAI,SAAS,CAAC;IAC3C;8GA1BW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3BtC,imDAwDA,EAAA,MAAA,EAAA,CAAA,wCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED/BY,wBAAwB,uQAAE,qBAAqB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,OAAA,EAAA,eAAA,EAAA,eAAA,EAAA,WAAA,EAAA,SAAA,EAAA,YAAA,EAAA,WAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAE9C,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;+BACE,qBAAqB,EAAA,eAAA,EAGd,uBAAuB,CAAC,MAAM,WACtC,CAAC,wBAAwB,EAAE,qBAAqB,CAAC,EAAA,QAAA,EAAA,imDAAA,EAAA,MAAA,EAAA,CAAA,wCAAA,CAAA,EAAA;;;AEzB5D;;AAEG;;;;"}
1
+ {"version":3,"file":"ng-doc-app-components-theme-toggle.mjs","sources":["../../../../libs/app/components/theme-toggle/theme-toggle.component.ts","../../../../libs/app/components/theme-toggle/theme-toggle.component.html","../../../../libs/app/components/theme-toggle/ng-doc-app-components-theme-toggle.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, inject, Signal } from '@angular/core';\nimport type { NgDocThemeTexts } from '@ng-doc/app/interfaces';\nimport { NgDocThemeService } from '@ng-doc/app/services/theme';\nimport { NG_DOC_TEXTS } from '@ng-doc/app/tokens';\nimport { NgDocButtonIconComponent, NgDocTooltipDirective } from '@ng-doc/ui-kit';\n\ninterface ToggleTheme {\n /** The text of the theme's name. */\n text: 'auto' | 'light' | 'dark';\n theme: string | null;\n}\n\nconst THEMES: readonly ToggleTheme[] = [\n { text: 'auto', theme: 'auto' },\n { text: 'light', theme: null },\n { text: 'dark', theme: 'dark' },\n];\n\n/**\n * Button that switches the theme in turn: Auto (follows the system), Light and Dark.\n *\n * It shows the current theme and follows theme changes made elsewhere through the theme service.\n */\n@Component({\n selector: 'ng-doc-theme-toggle',\n templateUrl: './theme-toggle.component.html',\n styleUrls: ['./theme-toggle.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgDocButtonIconComponent, NgDocTooltipDirective],\n})\nexport class NgDocThemeToggleComponent {\n protected readonly themeService = inject(NgDocThemeService);\n protected readonly texts: NgDocThemeTexts = inject(NG_DOC_TEXTS).theme;\n\n /**\n * The current theme. A custom theme id counts as Auto, because the toggle does not offer it.\n */\n protected readonly currentTheme: Signal<ToggleTheme> = computed(() => {\n const theme: string | null = this.themeService.theme();\n\n return THEMES.find(({ theme: t }) => t === theme) ?? THEMES[0];\n });\n\n /**\n * The theme the next press switches to.\n */\n protected readonly nextTheme: Signal<ToggleTheme> = computed(\n () => THEMES[(THEMES.indexOf(this.currentTheme()) + 1) % THEMES.length],\n );\n\n /**\n * Switches to the next theme.\n */\n toggleTheme(): void {\n const { theme } = this.nextTheme();\n\n this.themeService.set(theme ?? undefined);\n }\n}\n","<button\n type=\"button\"\n ng-doc-button-icon\n size=\"large\"\n [rounded]=\"false\"\n [attr.aria-label]=\"\n texts.label({ current: texts[currentTheme().text], next: texts[nextTheme().text] })\n \"\n [ngDocTooltip]=\"texts.tooltip({ current: texts[currentTheme().text] })\"\n (click)=\"toggleTheme()\">\n @switch (currentTheme().text) {\n @case ('light') {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path\n d=\"M12 2v2m0 16v2M4.9 4.9l1.4 1.4m11.4 11.4 1.4 1.4M2 12h2m16 0h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\" />\n </svg>\n }\n @case ('dark') {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z\" />\n </svg>\n }\n @default {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 3a9 9 0 0 0 0 18z\" fill=\"currentColor\" />\n </svg>\n }\n }\n</button>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAYA,MAAM,MAAM,GAA2B;AACrC,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;AAC/B,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;AAC9B,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;CAChC;AAED;;;;AAIG;MAQU,yBAAyB,CAAA;AAPtC,IAAA,WAAA,GAAA;AAQqB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACxC,QAAA,IAAA,CAAA,KAAK,GAAoB,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK;AAEtE;;AAEG;AACgB,QAAA,IAAA,CAAA,YAAY,GAAwB,QAAQ,CAAC,MAAK;YACnE,MAAM,KAAK,GAAkB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;YAEtD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;QAChE,CAAC;yFAAC;AAEF;;AAEG;QACgB,IAAA,CAAA,SAAS,GAAwB,QAAQ,CAC1D,MAAM,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC;sFACxE;AAUF,IAAA;AARC;;AAEG;IACH,WAAW,GAAA;QACT,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE;QAElC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,IAAI,SAAS,CAAC;IAC3C;8GA3BW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9BtC,2oDA0DA,EAAA,MAAA,EAAA,CAAA,wCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED9BY,wBAAwB,uQAAE,qBAAqB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,OAAA,EAAA,eAAA,EAAA,eAAA,EAAA,WAAA,EAAA,SAAA,EAAA,YAAA,EAAA,WAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAE9C,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;+BACE,qBAAqB,EAAA,eAAA,EAGd,uBAAuB,CAAC,MAAM,WACtC,CAAC,wBAAwB,EAAE,qBAAqB,CAAC,EAAA,QAAA,EAAA,2oDAAA,EAAA,MAAA,EAAA,CAAA,wCAAA,CAAA,EAAA;;;AE5B5D;;AAEG;;;;"}
@@ -6,6 +6,7 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
6
  import { RouterLink, Router, NavigationEnd } from '@angular/router';
7
7
  import { ɵngDocRouteUrl as _ngDocRouteUrl, ɵngDocPageUrl as _ngDocPageUrl } from '@ng-doc/app/helpers';
8
8
  import { NgDocShortcutsService } from '@ng-doc/app/services/shortcuts';
9
+ import { NG_DOC_TEXTS } from '@ng-doc/app/tokens';
9
10
  import { WA_WINDOW, WA_LOCATION } from '@ng-web-apis/common';
10
11
  import { filter } from 'rxjs/operators';
11
12
  import { NgDocDecodeUriComponentPipe } from '@ng-doc/app/pipes/decode-uri-component';
@@ -68,6 +69,7 @@ const SCROLL_KEYS = new Set([
68
69
  */
69
70
  class NgDocTocComponent {
70
71
  constructor() {
72
+ this.texts = inject(NG_DOC_TEXTS).toc;
71
73
  /** The headings of the page. */
72
74
  this.tableOfContent = input([], /* @ts-ignore */
73
75
  ...(ngDevMode ? [{ debugName: "tableOfContent" }] : /* istanbul ignore next */ []));
@@ -274,11 +276,11 @@ class NgDocTocComponent {
274
276
  }
275
277
  }
276
278
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocTocComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
277
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: NgDocTocComponent, isStandalone: true, selector: "ng-doc-toc", inputs: { tableOfContent: { classPropertyName: "tableOfContent", publicName: "tableOfContent", isSignal: true, isRequired: false, transformFunction: null }, editSourceFileUrl: { classPropertyName: "editSourceFileUrl", publicName: "editSourceFileUrl", isSignal: true, isRequired: false, transformFunction: null }, details: { classPropertyName: "details", publicName: "details", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "list", first: true, predicate: ["list"], descendants: true, isSignal: true }, { propertyName: "detailsHost", first: true, predicate: ["details"], descendants: true, isSignal: true }, { propertyName: "marker", first: true, predicate: ["marker"], descendants: true, isSignal: true }, { propertyName: "elements", predicate: NgDocTocElementComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@if (details()) {\n <section class=\"ng-doc-toc-section ng-doc-toc-details\" aria-label=\"Symbol\">\n <div class=\"ng-doc-toc-head\">\n <span class=\"ng-doc-toc-label\">Symbol</span>\n </div>\n <div #details></div>\n </section>\n}\n@if (tableOfContent().length) {\n <nav class=\"ng-doc-toc-section\" aria-label=\"On this page\">\n <div class=\"ng-doc-toc-head\">\n <span class=\"ng-doc-toc-label\">On this page</span>\n <span class=\"ng-doc-toc-percent\" aria-hidden=\"true\">{{ progress() }}%</span>\n </div>\n <div\n class=\"ng-doc-toc-progress\"\n role=\"progressbar\"\n aria-label=\"Reading progress\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuenow]=\"progress()\">\n <span [style.width.%]=\"progress()\"></span>\n </div>\n <ul class=\"ng-doc-toc\" #list>\n <li class=\"ng-doc-toc-marker\" aria-hidden=\"true\" #marker></li>\n @for (item of tableOfContent(); track item; let index = $index) {\n <li\n ng-doc-toc-element\n [path]=\"item.path\"\n [hash]=\"item.hash\"\n [level]=\"item.level\"\n [selected]=\"index === activeIndex()\"\n (click)=\"pin(index)\">\n {{ item.title }}\n </li>\n }\n </ul>\n </nav>\n}\n<div class=\"ng-doc-toc-section ng-doc-toc-actions\">\n <button type=\"button\" class=\"ng-doc-toc-action\" (click)=\"scrollToTop()\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M12 19V5m-6 6 6-6 6 6\" />\n </svg>\n Back to top\n </button>\n <button\n type=\"button\"\n class=\"ng-doc-toc-action\"\n [attr.data-ng-doc-copied]=\"copied()\"\n (click)=\"copyLink()\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M10 13a5 5 0 0 0 7.5.5l3-3a5 5 0 0 0-7-7l-1.7 1.7\" />\n <path d=\"M14 11a5 5 0 0 0-7.5-.5l-3 3a5 5 0 0 0 7 7l1.7-1.7\" />\n </svg>\n <span aria-live=\"polite\">{{ copied() ? 'Copied' : 'Copy link' }}</span>\n </button>\n @if (editSourceFileUrl(); as url) {\n <a class=\"ng-doc-toc-action\" [href]=\"url\" target=\"_blank\" rel=\"noopener\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M12 20h9M16.5 3.5a2.1 2.1 0 1 1 3 3L7 19l-4 1 1-4Z\" />\n </svg>\n Edit this page\n </a>\n }\n</div>\n", styles: [":host{position:sticky;top:var(--ng-doc-navbar-height);align-self:flex-start;flex:none;width:var(--ng-doc-toc-width);max-height:calc(100vh - var(--ng-doc-navbar-height));margin:calc(var(--ng-doc-space-6) * -1) 0 0 var(--ng-doc-toc-margin);padding:calc(var(--ng-doc-toc-top-padding) + var(--ng-doc-space-2)) 0 var(--ng-doc-toc-top-padding);overflow:auto;font-family:var(--ng-doc-font-family);font-size:var(--ng-doc-text-sm-size);line-height:20px}@media(max-width:1240px){:host{display:none}}.ng-doc-toc-section+.ng-doc-toc-section{margin-top:var(--ng-doc-space-6);padding-top:var(--ng-doc-space-5);border-top:1px solid var(--ng-doc-border-color)}.ng-doc-toc-head{display:flex;align-items:center;justify-content:space-between;gap:var(--ng-doc-space-2);margin:0 0 var(--ng-doc-space-2);padding:0 var(--ng-doc-space-2)}.ng-doc-toc-label{color:var(--ng-doc-text-muted);font-size:11px;line-height:16px;font-weight:600;letter-spacing:.05em;text-transform:uppercase}.ng-doc-toc-percent{color:var(--ng-doc-text-muted);font-size:12px;font-variant-numeric:tabular-nums}.ng-doc-toc-progress{height:2px;margin:0 var(--ng-doc-space-2) var(--ng-doc-space-3);border-radius:var(--ng-doc-radius-full);background:var(--ng-doc-base-2);overflow:hidden}.ng-doc-toc-progress span{display:block;height:100%;border-radius:var(--ng-doc-radius-full);background:var(--ng-doc-primary);transition:width .12s linear}.ng-doc-toc{position:relative;margin:0;padding:0;list-style:none}.ng-doc-toc-marker{position:absolute;top:0;left:0;right:0;height:0;border-radius:var(--ng-doc-radius-md);background:var(--ng-doc-primary-soft);pointer-events:none;transition:transform .22s var(--ng-doc-easing),height .22s var(--ng-doc-easing)}.ng-doc-toc-actions{display:grid;gap:1px}.ng-doc-toc-action{display:flex;align-items:center;gap:var(--ng-doc-space-2);min-height:32px;padding:6px var(--ng-doc-space-2);border:0;border-radius:var(--ng-doc-radius-md);background:none;color:var(--ng-doc-text-muted);font:inherit;font-size:13px;line-height:18px;text-align:left;text-decoration:none;cursor:pointer;transition:background var(--ng-doc-transition),color var(--ng-doc-transition)}.ng-doc-toc-action:hover{background:var(--ng-doc-hover-background);color:var(--ng-doc-heading-color)}.ng-doc-toc-action:focus-visible{outline:none;box-shadow:inset 0 0 0 2px var(--ng-doc-primary)}.ng-doc-toc-action[data-ng-doc-copied=true]{color:var(--ng-doc-success-strong)}@media(prefers-reduced-motion:reduce){.ng-doc-toc-marker,.ng-doc-toc-progress span,.ng-doc-toc-action{transition:none}}\n"], dependencies: [{ kind: "component", type: NgDocTocElementComponent, selector: "li[ng-doc-toc-element]", inputs: ["path", "hash", "selected", "level"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
279
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: NgDocTocComponent, isStandalone: true, selector: "ng-doc-toc", inputs: { tableOfContent: { classPropertyName: "tableOfContent", publicName: "tableOfContent", isSignal: true, isRequired: false, transformFunction: null }, editSourceFileUrl: { classPropertyName: "editSourceFileUrl", publicName: "editSourceFileUrl", isSignal: true, isRequired: false, transformFunction: null }, details: { classPropertyName: "details", publicName: "details", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "list", first: true, predicate: ["list"], descendants: true, isSignal: true }, { propertyName: "detailsHost", first: true, predicate: ["details"], descendants: true, isSignal: true }, { propertyName: "marker", first: true, predicate: ["marker"], descendants: true, isSignal: true }, { propertyName: "elements", predicate: NgDocTocElementComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@if (details()) {\n <section class=\"ng-doc-toc-section ng-doc-toc-details\" [attr.aria-label]=\"texts.symbol\">\n <div class=\"ng-doc-toc-head\">\n <span class=\"ng-doc-toc-label\">{{ texts.symbol }}</span>\n </div>\n <div #details></div>\n </section>\n}\n@if (tableOfContent().length) {\n <nav class=\"ng-doc-toc-section\" [attr.aria-label]=\"texts.onThisPage\">\n <div class=\"ng-doc-toc-head\">\n <span class=\"ng-doc-toc-label\">{{ texts.onThisPage }}</span>\n <span class=\"ng-doc-toc-percent\" aria-hidden=\"true\">{{ progress() }}%</span>\n </div>\n <div\n class=\"ng-doc-toc-progress\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-label]=\"texts.readingProgress\"\n [attr.aria-valuenow]=\"progress()\">\n <span [style.width.%]=\"progress()\"></span>\n </div>\n <ul class=\"ng-doc-toc\" #list>\n <li class=\"ng-doc-toc-marker\" aria-hidden=\"true\" #marker></li>\n @for (item of tableOfContent(); track item; let index = $index) {\n <li\n ng-doc-toc-element\n [path]=\"item.path\"\n [hash]=\"item.hash\"\n [level]=\"item.level\"\n [selected]=\"index === activeIndex()\"\n (click)=\"pin(index)\">\n {{ item.title }}\n </li>\n }\n </ul>\n </nav>\n}\n<div class=\"ng-doc-toc-section ng-doc-toc-actions\">\n <button type=\"button\" class=\"ng-doc-toc-action\" (click)=\"scrollToTop()\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M12 19V5m-6 6 6-6 6 6\" />\n </svg>\n {{ texts.backToTop }}\n </button>\n <button\n type=\"button\"\n class=\"ng-doc-toc-action\"\n [attr.data-ng-doc-copied]=\"copied()\"\n (click)=\"copyLink()\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M10 13a5 5 0 0 0 7.5.5l3-3a5 5 0 0 0-7-7l-1.7 1.7\" />\n <path d=\"M14 11a5 5 0 0 0-7.5-.5l-3 3a5 5 0 0 0 7 7l1.7-1.7\" />\n </svg>\n <span aria-live=\"polite\">{{ copied() ? texts.copied : texts.copyLink }}</span>\n </button>\n @if (editSourceFileUrl(); as url) {\n <a class=\"ng-doc-toc-action\" [href]=\"url\" target=\"_blank\" rel=\"noopener\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M12 20h9M16.5 3.5a2.1 2.1 0 1 1 3 3L7 19l-4 1 1-4Z\" />\n </svg>\n {{ texts.edit }}\n </a>\n }\n</div>\n", styles: [":host{position:sticky;top:calc(var(--ng-doc-navbar-height) + var(--ng-doc-layout-top));align-self:flex-start;flex:none;width:var(--ng-doc-toc-width);max-height:calc(100vh - var(--ng-doc-navbar-height) - var(--ng-doc-layout-top));margin:calc(var(--ng-doc-space-6) * -1) 0 0 var(--ng-doc-toc-margin);padding:calc(var(--ng-doc-toc-top-padding) + var(--ng-doc-space-2)) 0 var(--ng-doc-toc-top-padding);overflow:auto;font-family:var(--ng-doc-font-family);font-size:var(--ng-doc-text-sm-size);line-height:20px}@media(max-width:1240px){:host{display:none}}.ng-doc-toc-section+.ng-doc-toc-section{margin-top:var(--ng-doc-space-6);padding-top:var(--ng-doc-space-5);border-top:1px solid var(--ng-doc-border-color)}.ng-doc-toc-head{display:flex;align-items:center;justify-content:space-between;gap:var(--ng-doc-space-2);margin:0 0 var(--ng-doc-space-2);padding:0 var(--ng-doc-space-2)}.ng-doc-toc-label{color:var(--ng-doc-text-muted);font-size:11px;line-height:16px;font-weight:600;letter-spacing:.05em;text-transform:uppercase}.ng-doc-toc-percent{color:var(--ng-doc-text-muted);font-size:12px;font-variant-numeric:tabular-nums}.ng-doc-toc-progress{height:2px;margin:0 var(--ng-doc-space-2) var(--ng-doc-space-3);border-radius:var(--ng-doc-radius-full);background:var(--ng-doc-base-2);overflow:hidden}.ng-doc-toc-progress span{display:block;height:100%;border-radius:var(--ng-doc-radius-full);background:var(--ng-doc-primary);transition:width .12s linear}.ng-doc-toc{position:relative;margin:0;padding:0;list-style:none}.ng-doc-toc-marker{position:absolute;top:0;left:0;right:0;height:0;border-radius:var(--ng-doc-radius-md);background:var(--ng-doc-primary-soft);pointer-events:none;transition:transform .22s var(--ng-doc-easing),height .22s var(--ng-doc-easing)}.ng-doc-toc-actions{display:grid;gap:1px}.ng-doc-toc-action{display:flex;align-items:center;gap:var(--ng-doc-space-2);min-height:32px;padding:6px var(--ng-doc-space-2);border:0;border-radius:var(--ng-doc-radius-md);background:none;color:var(--ng-doc-text-muted);font:inherit;font-size:13px;line-height:18px;text-align:left;text-decoration:none;cursor:pointer;transition:background var(--ng-doc-transition),color var(--ng-doc-transition)}.ng-doc-toc-action:hover{background:var(--ng-doc-hover-background);color:var(--ng-doc-heading-color)}.ng-doc-toc-action:focus-visible{outline:none;box-shadow:inset 0 0 0 2px var(--ng-doc-primary)}.ng-doc-toc-action[data-ng-doc-copied=true]{color:var(--ng-doc-success-strong)}@media(prefers-reduced-motion:reduce){.ng-doc-toc-marker,.ng-doc-toc-progress span,.ng-doc-toc-action{transition:none}}\n"], dependencies: [{ kind: "component", type: NgDocTocElementComponent, selector: "li[ng-doc-toc-element]", inputs: ["path", "hash", "selected", "level"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
278
280
  }
279
281
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocTocComponent, decorators: [{
280
282
  type: Component,
281
- args: [{ selector: 'ng-doc-toc', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgDocTocElementComponent], template: "@if (details()) {\n <section class=\"ng-doc-toc-section ng-doc-toc-details\" aria-label=\"Symbol\">\n <div class=\"ng-doc-toc-head\">\n <span class=\"ng-doc-toc-label\">Symbol</span>\n </div>\n <div #details></div>\n </section>\n}\n@if (tableOfContent().length) {\n <nav class=\"ng-doc-toc-section\" aria-label=\"On this page\">\n <div class=\"ng-doc-toc-head\">\n <span class=\"ng-doc-toc-label\">On this page</span>\n <span class=\"ng-doc-toc-percent\" aria-hidden=\"true\">{{ progress() }}%</span>\n </div>\n <div\n class=\"ng-doc-toc-progress\"\n role=\"progressbar\"\n aria-label=\"Reading progress\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuenow]=\"progress()\">\n <span [style.width.%]=\"progress()\"></span>\n </div>\n <ul class=\"ng-doc-toc\" #list>\n <li class=\"ng-doc-toc-marker\" aria-hidden=\"true\" #marker></li>\n @for (item of tableOfContent(); track item; let index = $index) {\n <li\n ng-doc-toc-element\n [path]=\"item.path\"\n [hash]=\"item.hash\"\n [level]=\"item.level\"\n [selected]=\"index === activeIndex()\"\n (click)=\"pin(index)\">\n {{ item.title }}\n </li>\n }\n </ul>\n </nav>\n}\n<div class=\"ng-doc-toc-section ng-doc-toc-actions\">\n <button type=\"button\" class=\"ng-doc-toc-action\" (click)=\"scrollToTop()\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M12 19V5m-6 6 6-6 6 6\" />\n </svg>\n Back to top\n </button>\n <button\n type=\"button\"\n class=\"ng-doc-toc-action\"\n [attr.data-ng-doc-copied]=\"copied()\"\n (click)=\"copyLink()\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M10 13a5 5 0 0 0 7.5.5l3-3a5 5 0 0 0-7-7l-1.7 1.7\" />\n <path d=\"M14 11a5 5 0 0 0-7.5-.5l-3 3a5 5 0 0 0 7 7l1.7-1.7\" />\n </svg>\n <span aria-live=\"polite\">{{ copied() ? 'Copied' : 'Copy link' }}</span>\n </button>\n @if (editSourceFileUrl(); as url) {\n <a class=\"ng-doc-toc-action\" [href]=\"url\" target=\"_blank\" rel=\"noopener\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M12 20h9M16.5 3.5a2.1 2.1 0 1 1 3 3L7 19l-4 1 1-4Z\" />\n </svg>\n Edit this page\n </a>\n }\n</div>\n", styles: [":host{position:sticky;top:var(--ng-doc-navbar-height);align-self:flex-start;flex:none;width:var(--ng-doc-toc-width);max-height:calc(100vh - var(--ng-doc-navbar-height));margin:calc(var(--ng-doc-space-6) * -1) 0 0 var(--ng-doc-toc-margin);padding:calc(var(--ng-doc-toc-top-padding) + var(--ng-doc-space-2)) 0 var(--ng-doc-toc-top-padding);overflow:auto;font-family:var(--ng-doc-font-family);font-size:var(--ng-doc-text-sm-size);line-height:20px}@media(max-width:1240px){:host{display:none}}.ng-doc-toc-section+.ng-doc-toc-section{margin-top:var(--ng-doc-space-6);padding-top:var(--ng-doc-space-5);border-top:1px solid var(--ng-doc-border-color)}.ng-doc-toc-head{display:flex;align-items:center;justify-content:space-between;gap:var(--ng-doc-space-2);margin:0 0 var(--ng-doc-space-2);padding:0 var(--ng-doc-space-2)}.ng-doc-toc-label{color:var(--ng-doc-text-muted);font-size:11px;line-height:16px;font-weight:600;letter-spacing:.05em;text-transform:uppercase}.ng-doc-toc-percent{color:var(--ng-doc-text-muted);font-size:12px;font-variant-numeric:tabular-nums}.ng-doc-toc-progress{height:2px;margin:0 var(--ng-doc-space-2) var(--ng-doc-space-3);border-radius:var(--ng-doc-radius-full);background:var(--ng-doc-base-2);overflow:hidden}.ng-doc-toc-progress span{display:block;height:100%;border-radius:var(--ng-doc-radius-full);background:var(--ng-doc-primary);transition:width .12s linear}.ng-doc-toc{position:relative;margin:0;padding:0;list-style:none}.ng-doc-toc-marker{position:absolute;top:0;left:0;right:0;height:0;border-radius:var(--ng-doc-radius-md);background:var(--ng-doc-primary-soft);pointer-events:none;transition:transform .22s var(--ng-doc-easing),height .22s var(--ng-doc-easing)}.ng-doc-toc-actions{display:grid;gap:1px}.ng-doc-toc-action{display:flex;align-items:center;gap:var(--ng-doc-space-2);min-height:32px;padding:6px var(--ng-doc-space-2);border:0;border-radius:var(--ng-doc-radius-md);background:none;color:var(--ng-doc-text-muted);font:inherit;font-size:13px;line-height:18px;text-align:left;text-decoration:none;cursor:pointer;transition:background var(--ng-doc-transition),color var(--ng-doc-transition)}.ng-doc-toc-action:hover{background:var(--ng-doc-hover-background);color:var(--ng-doc-heading-color)}.ng-doc-toc-action:focus-visible{outline:none;box-shadow:inset 0 0 0 2px var(--ng-doc-primary)}.ng-doc-toc-action[data-ng-doc-copied=true]{color:var(--ng-doc-success-strong)}@media(prefers-reduced-motion:reduce){.ng-doc-toc-marker,.ng-doc-toc-progress span,.ng-doc-toc-action{transition:none}}\n"] }]
283
+ args: [{ selector: 'ng-doc-toc', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgDocTocElementComponent], template: "@if (details()) {\n <section class=\"ng-doc-toc-section ng-doc-toc-details\" [attr.aria-label]=\"texts.symbol\">\n <div class=\"ng-doc-toc-head\">\n <span class=\"ng-doc-toc-label\">{{ texts.symbol }}</span>\n </div>\n <div #details></div>\n </section>\n}\n@if (tableOfContent().length) {\n <nav class=\"ng-doc-toc-section\" [attr.aria-label]=\"texts.onThisPage\">\n <div class=\"ng-doc-toc-head\">\n <span class=\"ng-doc-toc-label\">{{ texts.onThisPage }}</span>\n <span class=\"ng-doc-toc-percent\" aria-hidden=\"true\">{{ progress() }}%</span>\n </div>\n <div\n class=\"ng-doc-toc-progress\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-label]=\"texts.readingProgress\"\n [attr.aria-valuenow]=\"progress()\">\n <span [style.width.%]=\"progress()\"></span>\n </div>\n <ul class=\"ng-doc-toc\" #list>\n <li class=\"ng-doc-toc-marker\" aria-hidden=\"true\" #marker></li>\n @for (item of tableOfContent(); track item; let index = $index) {\n <li\n ng-doc-toc-element\n [path]=\"item.path\"\n [hash]=\"item.hash\"\n [level]=\"item.level\"\n [selected]=\"index === activeIndex()\"\n (click)=\"pin(index)\">\n {{ item.title }}\n </li>\n }\n </ul>\n </nav>\n}\n<div class=\"ng-doc-toc-section ng-doc-toc-actions\">\n <button type=\"button\" class=\"ng-doc-toc-action\" (click)=\"scrollToTop()\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M12 19V5m-6 6 6-6 6 6\" />\n </svg>\n {{ texts.backToTop }}\n </button>\n <button\n type=\"button\"\n class=\"ng-doc-toc-action\"\n [attr.data-ng-doc-copied]=\"copied()\"\n (click)=\"copyLink()\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M10 13a5 5 0 0 0 7.5.5l3-3a5 5 0 0 0-7-7l-1.7 1.7\" />\n <path d=\"M14 11a5 5 0 0 0-7.5-.5l-3 3a5 5 0 0 0 7 7l1.7-1.7\" />\n </svg>\n <span aria-live=\"polite\">{{ copied() ? texts.copied : texts.copyLink }}</span>\n </button>\n @if (editSourceFileUrl(); as url) {\n <a class=\"ng-doc-toc-action\" [href]=\"url\" target=\"_blank\" rel=\"noopener\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M12 20h9M16.5 3.5a2.1 2.1 0 1 1 3 3L7 19l-4 1 1-4Z\" />\n </svg>\n {{ texts.edit }}\n </a>\n }\n</div>\n", styles: [":host{position:sticky;top:calc(var(--ng-doc-navbar-height) + var(--ng-doc-layout-top));align-self:flex-start;flex:none;width:var(--ng-doc-toc-width);max-height:calc(100vh - var(--ng-doc-navbar-height) - var(--ng-doc-layout-top));margin:calc(var(--ng-doc-space-6) * -1) 0 0 var(--ng-doc-toc-margin);padding:calc(var(--ng-doc-toc-top-padding) + var(--ng-doc-space-2)) 0 var(--ng-doc-toc-top-padding);overflow:auto;font-family:var(--ng-doc-font-family);font-size:var(--ng-doc-text-sm-size);line-height:20px}@media(max-width:1240px){:host{display:none}}.ng-doc-toc-section+.ng-doc-toc-section{margin-top:var(--ng-doc-space-6);padding-top:var(--ng-doc-space-5);border-top:1px solid var(--ng-doc-border-color)}.ng-doc-toc-head{display:flex;align-items:center;justify-content:space-between;gap:var(--ng-doc-space-2);margin:0 0 var(--ng-doc-space-2);padding:0 var(--ng-doc-space-2)}.ng-doc-toc-label{color:var(--ng-doc-text-muted);font-size:11px;line-height:16px;font-weight:600;letter-spacing:.05em;text-transform:uppercase}.ng-doc-toc-percent{color:var(--ng-doc-text-muted);font-size:12px;font-variant-numeric:tabular-nums}.ng-doc-toc-progress{height:2px;margin:0 var(--ng-doc-space-2) var(--ng-doc-space-3);border-radius:var(--ng-doc-radius-full);background:var(--ng-doc-base-2);overflow:hidden}.ng-doc-toc-progress span{display:block;height:100%;border-radius:var(--ng-doc-radius-full);background:var(--ng-doc-primary);transition:width .12s linear}.ng-doc-toc{position:relative;margin:0;padding:0;list-style:none}.ng-doc-toc-marker{position:absolute;top:0;left:0;right:0;height:0;border-radius:var(--ng-doc-radius-md);background:var(--ng-doc-primary-soft);pointer-events:none;transition:transform .22s var(--ng-doc-easing),height .22s var(--ng-doc-easing)}.ng-doc-toc-actions{display:grid;gap:1px}.ng-doc-toc-action{display:flex;align-items:center;gap:var(--ng-doc-space-2);min-height:32px;padding:6px var(--ng-doc-space-2);border:0;border-radius:var(--ng-doc-radius-md);background:none;color:var(--ng-doc-text-muted);font:inherit;font-size:13px;line-height:18px;text-align:left;text-decoration:none;cursor:pointer;transition:background var(--ng-doc-transition),color var(--ng-doc-transition)}.ng-doc-toc-action:hover{background:var(--ng-doc-hover-background);color:var(--ng-doc-heading-color)}.ng-doc-toc-action:focus-visible{outline:none;box-shadow:inset 0 0 0 2px var(--ng-doc-primary)}.ng-doc-toc-action[data-ng-doc-copied=true]{color:var(--ng-doc-success-strong)}@media(prefers-reduced-motion:reduce){.ng-doc-toc-marker,.ng-doc-toc-progress span,.ng-doc-toc-action{transition:none}}\n"] }]
282
284
  }], ctorParameters: () => [], propDecorators: { tableOfContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "tableOfContent", required: false }] }], editSourceFileUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "editSourceFileUrl", required: false }] }], details: [{ type: i0.Input, args: [{ isSignal: true, alias: "details", required: false }] }], list: [{ type: i0.ViewChild, args: ['list', { isSignal: true }] }], detailsHost: [{ type: i0.ViewChild, args: ['details', { isSignal: true }] }], marker: [{ type: i0.ViewChild, args: ['marker', { isSignal: true }] }], elements: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => NgDocTocElementComponent), { isSignal: true }] }] } });
283
285
  /**
284
286
  * Decodes a URL fragment, and returns it unchanged when it is not a valid encoding.
@@ -1 +1 @@
1
- {"version":3,"file":"ng-doc-app-components-toc.mjs","sources":["../../../../libs/app/components/toc/toc-element/toc-element.component.ts","../../../../libs/app/components/toc/toc-element/toc-element.component.html","../../../../libs/app/components/toc/toc.component.ts","../../../../libs/app/components/toc/toc.component.html","../../../../libs/app/components/toc/ng-doc-app-components-toc.ts"],"sourcesContent":["import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { NgDocDecodeUriComponentPipe } from '@ng-doc/app/pipes/decode-uri-component';\n\n/**\n * One entry of the table of contents: a link to a heading of the page.\n */\n@Component({\n selector: 'li[ng-doc-toc-element]',\n templateUrl: './toc-element.component.html',\n styleUrls: ['./toc-element.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterLink, NgDocDecodeUriComponentPipe],\n host: {\n '[attr.data-ng-doc-selected]': 'selected()',\n '[attr.data-ng-doc-level]': 'level()',\n },\n})\nexport class NgDocTocElementComponent {\n /** Path of the page that holds the heading. */\n readonly path = input<string>('');\n\n /** Id of the heading, used as the link's fragment. */\n readonly hash = input<string>('');\n\n /** Whether the heading is the section the reader is in. */\n readonly selected = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /** Depth of the heading in the table of contents, from 1. */\n readonly level = input<number, unknown>(1, { transform: numberAttribute });\n\n /** The list item element. */\n readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n}\n","<a\n [routerLink]=\"[]\"\n [fragment]=\"hash() | decodeUriComponent\"\n [attr.aria-current]=\"selected() ? 'location' : null\">\n <ng-content></ng-content>\n</a>\n","import { Clipboard } from '@angular/cdk/clipboard';\nimport { LocationStrategy } from '@angular/common';\nimport {\n afterNextRender,\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n DOCUMENT,\n effect,\n ElementRef,\n inject,\n input,\n NgZone,\n Signal,\n signal,\n untracked,\n viewChild,\n viewChildren,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { ɵngDocPageUrl, ɵngDocRouteUrl } from '@ng-doc/app/helpers';\nimport { NgDocPageToc, NgDocTocItem } from '@ng-doc/app/interfaces';\nimport { NgDocShortcutsService } from '@ng-doc/app/services/shortcuts';\nimport { WA_LOCATION, WA_WINDOW } from '@ng-web-apis/common';\nimport { filter } from 'rxjs/operators';\n\nimport { NgDocTocElementComponent } from './toc-element/toc-element.component';\n\n/**\n * How far below the navbar, in pixels, a heading counts as the start of the section the reader is\n * in.\n */\nconst ACTIVE_LINE_OFFSET = 80;\n\n/** Keys that scroll the page; pressing one hands the active section back to scrolling. */\nconst SCROLL_KEYS: ReadonlySet<string> = new Set([\n 'ArrowUp',\n 'ArrowDown',\n 'PageUp',\n 'PageDown',\n 'Home',\n 'End',\n ' ',\n]);\n\n/**\n * The \"On this page\" rail: the headings of the page, the section the reader is in, the reading\n * progress, and the Back to top, Copy link and Edit this page actions.\n *\n * The active section follows scrolling: it is the last heading above a line a little below the\n * navbar, or the last heading once the page is scrolled to the end. A heading the reader picked\n * (an entry clicked, or a link to its fragment) stays active until the reader scrolls again, so a\n * section near the end of the page, which cannot scroll to the top, is still marked. A soft marker\n * glides to the active entry. Tracking pauses while the rail is hidden.\n *\n * While the rail exists, the L shortcut runs its Copy link action, so the rail confirms the copy.\n */\n@Component({\n selector: 'ng-doc-toc',\n templateUrl: './toc.component.html',\n styleUrls: ['./toc.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgDocTocElementComponent],\n})\nexport class NgDocTocComponent implements NgDocPageToc {\n /** The headings of the page. */\n readonly tableOfContent = input<NgDocTocItem[]>([]);\n\n /** URL where the reader can edit the page source. Without it, the rail has no Edit action. */\n readonly editSourceFileUrl = input<string | undefined>(undefined);\n\n /** The symbol details of an API page, shown above the headings. */\n readonly details = input<Element | undefined>(undefined);\n\n /** Index of the heading of the section the reader is in. */\n protected readonly activeIndex = signal(0);\n\n /** The heading of the section the reader is in. */\n readonly activeItem: Signal<NgDocTocItem | undefined> = computed(\n () => this.tableOfContent()[this.activeIndex()],\n );\n\n /** How much of the page has been scrolled, in percent. */\n protected readonly progress = signal(0);\n\n /** Whether the link was just copied. */\n protected readonly copied = signal(false);\n\n protected readonly document = inject(DOCUMENT);\n\n private readonly window = inject(WA_WINDOW);\n private readonly location = inject(WA_LOCATION);\n private readonly locationStrategy = inject(LocationStrategy);\n private readonly clipboard = inject(Clipboard);\n private readonly ngZone = inject(NgZone);\n private readonly rail: HTMLElement = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n private readonly list = viewChild<ElementRef<HTMLElement>>('list');\n private readonly detailsHost = viewChild<ElementRef<HTMLElement>>('details');\n private readonly marker = viewChild<ElementRef<HTMLElement>>('marker');\n private readonly elements = viewChildren(NgDocTocElementComponent);\n private readonly router = inject(Router);\n private copiedTimer?: ReturnType<typeof setTimeout>;\n // Index of the heading the reader picked; it wins over scrolling until the next user scroll.\n private pinned: number | null = null;\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n\n // The details are page content that the page hands over; they are moved, not copied, so the\n // content keeps no hidden duplicate. It runs on the server too, so prerendered pages have it.\n effect(() => {\n const host = this.detailsHost()?.nativeElement;\n const details = this.details();\n\n if (host && details && details.parentNode !== host) {\n // The server DOM has no `replaceChildren()`.\n while (host.firstChild) host.removeChild(host.firstChild);\n host.appendChild(details);\n }\n });\n\n // A navigation to a fragment of this page (a TOC entry, an anchor in the content, a deep\n // link) picks that heading.\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(),\n )\n .subscribe(() => this.pinFragment(this.router.parseUrl(this.router.url).fragment));\n\n // Scroll events are frequent: they are read once per frame, outside the Angular zone, and\n // only the signal writes they cause schedule change detection.\n afterNextRender(() => {\n let frame = 0;\n const onScroll = (): void => {\n frame ||= this.window.requestAnimationFrame(() => {\n frame = 0;\n this.track();\n });\n };\n\n // Wheel, touch and scrolling keys are the reader scrolling; the scroll events of a jump\n // to an anchor are not, so they keep a picked heading.\n const onUserScroll = (event: Event): void => {\n if (event instanceof KeyboardEvent && !SCROLL_KEYS.has(event.key)) {\n return;\n }\n\n if (this.pinned !== null) {\n this.pinned = null;\n onScroll();\n }\n };\n\n this.ngZone.runOutsideAngular(() => {\n this.window.addEventListener('scroll', onScroll, { passive: true });\n this.window.addEventListener('resize', onScroll, { passive: true });\n this.window.addEventListener('wheel', onUserScroll, { passive: true });\n this.window.addEventListener('touchmove', onUserScroll, { passive: true });\n this.window.addEventListener('keydown', onUserScroll);\n });\n destroyRef.onDestroy(() => {\n this.window.removeEventListener('scroll', onScroll);\n this.window.removeEventListener('resize', onScroll);\n this.window.removeEventListener('wheel', onUserScroll);\n this.window.removeEventListener('touchmove', onUserScroll);\n this.window.removeEventListener('keydown', onUserScroll);\n this.window.cancelAnimationFrame(frame);\n });\n });\n\n destroyRef.onDestroy(() => clearTimeout(this.copiedTimer));\n\n // L copies the same link as the Copy link action and shows its confirmation. The shortcuts\n // service runs the last registration of a key, so the built-in L is back once the rail is gone.\n destroyRef.onDestroy(\n inject(NgDocShortcutsService).register({ key: 'l', handler: () => this.copyLink() }),\n );\n\n // A new table of contents is tracked as soon as it is rendered; a fragment in the URL picks\n // its heading.\n afterRenderEffect({\n read: () => {\n this.tableOfContent();\n untracked(() => {\n this.pinned = null;\n // The route's fragment, not the document's: with hash location the route is the\n // document's fragment.\n this.pinFragment(\n ɵngDocRouteUrl(this.locationStrategy, this.location.href).hash.replace(/^#/, ''),\n );\n this.track();\n });\n },\n });\n\n // The marker glides to the active entry, and the rail scrolls to keep the entry in view.\n afterRenderEffect({\n earlyRead: () => {\n const element: HTMLElement | undefined =\n this.elements()[this.activeIndex()]?.elementRef.nativeElement;\n\n return element ? { top: element.offsetTop, height: element.offsetHeight } : null;\n },\n write: (box) => {\n const marker: HTMLElement | undefined = this.marker()?.nativeElement;\n const position = box();\n\n if (!marker) {\n return;\n }\n\n marker.style.transform = `translateY(${position?.top ?? 0}px)`;\n marker.style.height = `${position?.height ?? 0}px`;\n this.keepInView(position);\n },\n });\n }\n\n /**\n * Scrolls the page back to its top.\n */\n scrollToTop(): void {\n const reduceMotion: boolean =\n this.window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false;\n\n this.window.scrollTo({ top: 0, behavior: reduceMotion ? 'auto' : 'smooth' });\n }\n\n /**\n * Copies the link to the page, without its query and fragment.\n */\n copyLink(): void {\n this.clipboard.copy(ɵngDocPageUrl(this.locationStrategy, this.location));\n this.copied.set(true);\n clearTimeout(this.copiedTimer);\n // The label timer must not hold the application unstable, so it runs outside the zone.\n this.copiedTimer = this.ngZone.runOutsideAngular(() =>\n setTimeout(() => this.copied.set(false), 1400),\n );\n }\n\n /**\n * Marks a heading as the active section until the reader scrolls again.\n * @param index - Index of the heading in the table of contents.\n */\n pin(index: number): void {\n if (index >= 0 && index < this.tableOfContent().length) {\n this.pinned = index;\n this.activeIndex.set(index);\n }\n }\n\n private pinFragment(fragment: string | null | undefined): void {\n if (!fragment) {\n return;\n }\n\n const hash: string = safeDecode(fragment);\n\n this.pin(this.tableOfContent().findIndex((item: NgDocTocItem) => item.hash === hash));\n }\n\n private track(): void {\n // Below the rail's breakpoint it is not displayed: nothing to update until it shows again.\n if (this.rail.checkVisibility?.() === false) {\n return;\n }\n\n const root: HTMLElement = this.document.documentElement;\n const max: number = root.scrollHeight - this.window.innerHeight;\n const scrolled: number = this.window.scrollY;\n\n // A page shorter than the viewport is read in full.\n this.progress.set(\n max > 0 ? Math.min(100, Math.max(0, Math.round((scrolled / max) * 100))) : 100,\n );\n\n const items: NgDocTocItem[] = this.tableOfContent();\n\n if (!items.length || this.pinned !== null) {\n return;\n }\n\n const header: number =\n this.document.querySelector('.ng-doc-header')?.getBoundingClientRect().bottom ?? 0;\n const line: number = header + ACTIVE_LINE_OFFSET;\n let active = 0;\n\n items.forEach((item: NgDocTocItem, index: number) => {\n if (item.element.getBoundingClientRect().top <= line) {\n active = index;\n }\n });\n\n if (max > 0 && scrolled >= max - 2) {\n active = items.length - 1;\n }\n\n this.activeIndex.set(active);\n }\n\n private keepInView(position: { top: number; height: number } | null): void {\n const list: HTMLElement | undefined = this.list()?.nativeElement;\n\n if (!list || !position || this.rail.scrollHeight <= this.rail.clientHeight) {\n return;\n }\n\n const top: number = list.offsetTop + position.top;\n const bottom: number = top + position.height;\n\n if (top < this.rail.scrollTop) {\n this.rail.scrollTop = top;\n } else if (bottom > this.rail.scrollTop + this.rail.clientHeight) {\n this.rail.scrollTop = bottom - this.rail.clientHeight;\n }\n }\n}\n\n/**\n * Decodes a URL fragment, and returns it unchanged when it is not a valid encoding.\n * @param fragment - The fragment, without `#`.\n * @returns The decoded fragment.\n */\nfunction safeDecode(fragment: string): string {\n try {\n return decodeURIComponent(fragment);\n } catch {\n return fragment;\n }\n}\n","@if (details()) {\n <section class=\"ng-doc-toc-section ng-doc-toc-details\" aria-label=\"Symbol\">\n <div class=\"ng-doc-toc-head\">\n <span class=\"ng-doc-toc-label\">Symbol</span>\n </div>\n <div #details></div>\n </section>\n}\n@if (tableOfContent().length) {\n <nav class=\"ng-doc-toc-section\" aria-label=\"On this page\">\n <div class=\"ng-doc-toc-head\">\n <span class=\"ng-doc-toc-label\">On this page</span>\n <span class=\"ng-doc-toc-percent\" aria-hidden=\"true\">{{ progress() }}%</span>\n </div>\n <div\n class=\"ng-doc-toc-progress\"\n role=\"progressbar\"\n aria-label=\"Reading progress\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuenow]=\"progress()\">\n <span [style.width.%]=\"progress()\"></span>\n </div>\n <ul class=\"ng-doc-toc\" #list>\n <li class=\"ng-doc-toc-marker\" aria-hidden=\"true\" #marker></li>\n @for (item of tableOfContent(); track item; let index = $index) {\n <li\n ng-doc-toc-element\n [path]=\"item.path\"\n [hash]=\"item.hash\"\n [level]=\"item.level\"\n [selected]=\"index === activeIndex()\"\n (click)=\"pin(index)\">\n {{ item.title }}\n </li>\n }\n </ul>\n </nav>\n}\n<div class=\"ng-doc-toc-section ng-doc-toc-actions\">\n <button type=\"button\" class=\"ng-doc-toc-action\" (click)=\"scrollToTop()\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M12 19V5m-6 6 6-6 6 6\" />\n </svg>\n Back to top\n </button>\n <button\n type=\"button\"\n class=\"ng-doc-toc-action\"\n [attr.data-ng-doc-copied]=\"copied()\"\n (click)=\"copyLink()\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M10 13a5 5 0 0 0 7.5.5l3-3a5 5 0 0 0-7-7l-1.7 1.7\" />\n <path d=\"M14 11a5 5 0 0 0-7.5-.5l-3 3a5 5 0 0 0 7 7l1.7-1.7\" />\n </svg>\n <span aria-live=\"polite\">{{ copied() ? 'Copied' : 'Copy link' }}</span>\n </button>\n @if (editSourceFileUrl(); as url) {\n <a class=\"ng-doc-toc-action\" [href]=\"url\" target=\"_blank\" rel=\"noopener\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M12 20h9M16.5 3.5a2.1 2.1 0 1 1 3 3L7 19l-4 1 1-4Z\" />\n </svg>\n Edit this page\n </a>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["ɵngDocRouteUrl","ɵngDocPageUrl"],"mappings":"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"}
1
+ {"version":3,"file":"ng-doc-app-components-toc.mjs","sources":["../../../../libs/app/components/toc/toc-element/toc-element.component.ts","../../../../libs/app/components/toc/toc-element/toc-element.component.html","../../../../libs/app/components/toc/toc.component.ts","../../../../libs/app/components/toc/toc.component.html","../../../../libs/app/components/toc/ng-doc-app-components-toc.ts"],"sourcesContent":["import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n inject,\n input,\n numberAttribute,\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { NgDocDecodeUriComponentPipe } from '@ng-doc/app/pipes/decode-uri-component';\n\n/**\n * One entry of the table of contents: a link to a heading of the page.\n */\n@Component({\n selector: 'li[ng-doc-toc-element]',\n templateUrl: './toc-element.component.html',\n styleUrls: ['./toc-element.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterLink, NgDocDecodeUriComponentPipe],\n host: {\n '[attr.data-ng-doc-selected]': 'selected()',\n '[attr.data-ng-doc-level]': 'level()',\n },\n})\nexport class NgDocTocElementComponent {\n /** Path of the page that holds the heading. */\n readonly path = input<string>('');\n\n /** Id of the heading, used as the link's fragment. */\n readonly hash = input<string>('');\n\n /** Whether the heading is the section the reader is in. */\n readonly selected = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /** Depth of the heading in the table of contents, from 1. */\n readonly level = input<number, unknown>(1, { transform: numberAttribute });\n\n /** The list item element. */\n readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n}\n","<a\n [routerLink]=\"[]\"\n [fragment]=\"hash() | decodeUriComponent\"\n [attr.aria-current]=\"selected() ? 'location' : null\">\n <ng-content></ng-content>\n</a>\n","import { Clipboard } from '@angular/cdk/clipboard';\nimport { LocationStrategy } from '@angular/common';\nimport {\n afterNextRender,\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n DOCUMENT,\n effect,\n ElementRef,\n inject,\n input,\n NgZone,\n Signal,\n signal,\n untracked,\n viewChild,\n viewChildren,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { ɵngDocPageUrl, ɵngDocRouteUrl } from '@ng-doc/app/helpers';\nimport { NgDocPageToc, NgDocTocItem, NgDocTocTexts } from '@ng-doc/app/interfaces';\nimport { NgDocShortcutsService } from '@ng-doc/app/services/shortcuts';\nimport { NG_DOC_TEXTS } from '@ng-doc/app/tokens';\nimport { WA_LOCATION, WA_WINDOW } from '@ng-web-apis/common';\nimport { filter } from 'rxjs/operators';\n\nimport { NgDocTocElementComponent } from './toc-element/toc-element.component';\n\n/**\n * How far below the navbar, in pixels, a heading counts as the start of the section the reader is\n * in.\n */\nconst ACTIVE_LINE_OFFSET = 80;\n\n/** Keys that scroll the page; pressing one hands the active section back to scrolling. */\nconst SCROLL_KEYS: ReadonlySet<string> = new Set([\n 'ArrowUp',\n 'ArrowDown',\n 'PageUp',\n 'PageDown',\n 'Home',\n 'End',\n ' ',\n]);\n\n/**\n * The \"On this page\" rail: the headings of the page, the section the reader is in, the reading\n * progress, and the Back to top, Copy link and Edit this page actions.\n *\n * The active section follows scrolling: it is the last heading above a line a little below the\n * navbar, or the last heading once the page is scrolled to the end. A heading the reader picked\n * (an entry clicked, or a link to its fragment) stays active until the reader scrolls again, so a\n * section near the end of the page, which cannot scroll to the top, is still marked. A soft marker\n * glides to the active entry. Tracking pauses while the rail is hidden.\n *\n * While the rail exists, the L shortcut runs its Copy link action, so the rail confirms the copy.\n */\n@Component({\n selector: 'ng-doc-toc',\n templateUrl: './toc.component.html',\n styleUrls: ['./toc.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgDocTocElementComponent],\n})\nexport class NgDocTocComponent implements NgDocPageToc {\n protected readonly texts: NgDocTocTexts = inject(NG_DOC_TEXTS).toc;\n\n /** The headings of the page. */\n readonly tableOfContent = input<NgDocTocItem[]>([]);\n\n /** URL where the reader can edit the page source. Without it, the rail has no Edit action. */\n readonly editSourceFileUrl = input<string | undefined>(undefined);\n\n /** The symbol details of an API page, shown above the headings. */\n readonly details = input<Element | undefined>(undefined);\n\n /** Index of the heading of the section the reader is in. */\n protected readonly activeIndex = signal(0);\n\n /** The heading of the section the reader is in. */\n readonly activeItem: Signal<NgDocTocItem | undefined> = computed(\n () => this.tableOfContent()[this.activeIndex()],\n );\n\n /** How much of the page has been scrolled, in percent. */\n protected readonly progress = signal(0);\n\n /** Whether the link was just copied. */\n protected readonly copied = signal(false);\n\n protected readonly document = inject(DOCUMENT);\n\n private readonly window = inject(WA_WINDOW);\n private readonly location = inject(WA_LOCATION);\n private readonly locationStrategy = inject(LocationStrategy);\n private readonly clipboard = inject(Clipboard);\n private readonly ngZone = inject(NgZone);\n private readonly rail: HTMLElement = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n private readonly list = viewChild<ElementRef<HTMLElement>>('list');\n private readonly detailsHost = viewChild<ElementRef<HTMLElement>>('details');\n private readonly marker = viewChild<ElementRef<HTMLElement>>('marker');\n private readonly elements = viewChildren(NgDocTocElementComponent);\n private readonly router = inject(Router);\n private copiedTimer?: ReturnType<typeof setTimeout>;\n // Index of the heading the reader picked; it wins over scrolling until the next user scroll.\n private pinned: number | null = null;\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n\n // The details are page content that the page hands over; they are moved, not copied, so the\n // content keeps no hidden duplicate. It runs on the server too, so prerendered pages have it.\n effect(() => {\n const host = this.detailsHost()?.nativeElement;\n const details = this.details();\n\n if (host && details && details.parentNode !== host) {\n // The server DOM has no `replaceChildren()`.\n while (host.firstChild) host.removeChild(host.firstChild);\n host.appendChild(details);\n }\n });\n\n // A navigation to a fragment of this page (a TOC entry, an anchor in the content, a deep\n // link) picks that heading.\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(),\n )\n .subscribe(() => this.pinFragment(this.router.parseUrl(this.router.url).fragment));\n\n // Scroll events are frequent: they are read once per frame, outside the Angular zone, and\n // only the signal writes they cause schedule change detection.\n afterNextRender(() => {\n let frame = 0;\n const onScroll = (): void => {\n frame ||= this.window.requestAnimationFrame(() => {\n frame = 0;\n this.track();\n });\n };\n\n // Wheel, touch and scrolling keys are the reader scrolling; the scroll events of a jump\n // to an anchor are not, so they keep a picked heading.\n const onUserScroll = (event: Event): void => {\n if (event instanceof KeyboardEvent && !SCROLL_KEYS.has(event.key)) {\n return;\n }\n\n if (this.pinned !== null) {\n this.pinned = null;\n onScroll();\n }\n };\n\n this.ngZone.runOutsideAngular(() => {\n this.window.addEventListener('scroll', onScroll, { passive: true });\n this.window.addEventListener('resize', onScroll, { passive: true });\n this.window.addEventListener('wheel', onUserScroll, { passive: true });\n this.window.addEventListener('touchmove', onUserScroll, { passive: true });\n this.window.addEventListener('keydown', onUserScroll);\n });\n destroyRef.onDestroy(() => {\n this.window.removeEventListener('scroll', onScroll);\n this.window.removeEventListener('resize', onScroll);\n this.window.removeEventListener('wheel', onUserScroll);\n this.window.removeEventListener('touchmove', onUserScroll);\n this.window.removeEventListener('keydown', onUserScroll);\n this.window.cancelAnimationFrame(frame);\n });\n });\n\n destroyRef.onDestroy(() => clearTimeout(this.copiedTimer));\n\n // L copies the same link as the Copy link action and shows its confirmation. The shortcuts\n // service runs the last registration of a key, so the built-in L is back once the rail is gone.\n destroyRef.onDestroy(\n inject(NgDocShortcutsService).register({ key: 'l', handler: () => this.copyLink() }),\n );\n\n // A new table of contents is tracked as soon as it is rendered; a fragment in the URL picks\n // its heading.\n afterRenderEffect({\n read: () => {\n this.tableOfContent();\n untracked(() => {\n this.pinned = null;\n // The route's fragment, not the document's: with hash location the route is the\n // document's fragment.\n this.pinFragment(\n ɵngDocRouteUrl(this.locationStrategy, this.location.href).hash.replace(/^#/, ''),\n );\n this.track();\n });\n },\n });\n\n // The marker glides to the active entry, and the rail scrolls to keep the entry in view.\n afterRenderEffect({\n earlyRead: () => {\n const element: HTMLElement | undefined =\n this.elements()[this.activeIndex()]?.elementRef.nativeElement;\n\n return element ? { top: element.offsetTop, height: element.offsetHeight } : null;\n },\n write: (box) => {\n const marker: HTMLElement | undefined = this.marker()?.nativeElement;\n const position = box();\n\n if (!marker) {\n return;\n }\n\n marker.style.transform = `translateY(${position?.top ?? 0}px)`;\n marker.style.height = `${position?.height ?? 0}px`;\n this.keepInView(position);\n },\n });\n }\n\n /**\n * Scrolls the page back to its top.\n */\n scrollToTop(): void {\n const reduceMotion: boolean =\n this.window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false;\n\n this.window.scrollTo({ top: 0, behavior: reduceMotion ? 'auto' : 'smooth' });\n }\n\n /**\n * Copies the link to the page, without its query and fragment.\n */\n copyLink(): void {\n this.clipboard.copy(ɵngDocPageUrl(this.locationStrategy, this.location));\n this.copied.set(true);\n clearTimeout(this.copiedTimer);\n // The label timer must not hold the application unstable, so it runs outside the zone.\n this.copiedTimer = this.ngZone.runOutsideAngular(() =>\n setTimeout(() => this.copied.set(false), 1400),\n );\n }\n\n /**\n * Marks a heading as the active section until the reader scrolls again.\n * @param index - Index of the heading in the table of contents.\n */\n pin(index: number): void {\n if (index >= 0 && index < this.tableOfContent().length) {\n this.pinned = index;\n this.activeIndex.set(index);\n }\n }\n\n private pinFragment(fragment: string | null | undefined): void {\n if (!fragment) {\n return;\n }\n\n const hash: string = safeDecode(fragment);\n\n this.pin(this.tableOfContent().findIndex((item: NgDocTocItem) => item.hash === hash));\n }\n\n private track(): void {\n // Below the rail's breakpoint it is not displayed: nothing to update until it shows again.\n if (this.rail.checkVisibility?.() === false) {\n return;\n }\n\n const root: HTMLElement = this.document.documentElement;\n const max: number = root.scrollHeight - this.window.innerHeight;\n const scrolled: number = this.window.scrollY;\n\n // A page shorter than the viewport is read in full.\n this.progress.set(\n max > 0 ? Math.min(100, Math.max(0, Math.round((scrolled / max) * 100))) : 100,\n );\n\n const items: NgDocTocItem[] = this.tableOfContent();\n\n if (!items.length || this.pinned !== null) {\n return;\n }\n\n const header: number =\n this.document.querySelector('.ng-doc-header')?.getBoundingClientRect().bottom ?? 0;\n const line: number = header + ACTIVE_LINE_OFFSET;\n let active = 0;\n\n items.forEach((item: NgDocTocItem, index: number) => {\n if (item.element.getBoundingClientRect().top <= line) {\n active = index;\n }\n });\n\n if (max > 0 && scrolled >= max - 2) {\n active = items.length - 1;\n }\n\n this.activeIndex.set(active);\n }\n\n private keepInView(position: { top: number; height: number } | null): void {\n const list: HTMLElement | undefined = this.list()?.nativeElement;\n\n if (!list || !position || this.rail.scrollHeight <= this.rail.clientHeight) {\n return;\n }\n\n const top: number = list.offsetTop + position.top;\n const bottom: number = top + position.height;\n\n if (top < this.rail.scrollTop) {\n this.rail.scrollTop = top;\n } else if (bottom > this.rail.scrollTop + this.rail.clientHeight) {\n this.rail.scrollTop = bottom - this.rail.clientHeight;\n }\n }\n}\n\n/**\n * Decodes a URL fragment, and returns it unchanged when it is not a valid encoding.\n * @param fragment - The fragment, without `#`.\n * @returns The decoded fragment.\n */\nfunction safeDecode(fragment: string): string {\n try {\n return decodeURIComponent(fragment);\n } catch {\n return fragment;\n }\n}\n","@if (details()) {\n <section class=\"ng-doc-toc-section ng-doc-toc-details\" [attr.aria-label]=\"texts.symbol\">\n <div class=\"ng-doc-toc-head\">\n <span class=\"ng-doc-toc-label\">{{ texts.symbol }}</span>\n </div>\n <div #details></div>\n </section>\n}\n@if (tableOfContent().length) {\n <nav class=\"ng-doc-toc-section\" [attr.aria-label]=\"texts.onThisPage\">\n <div class=\"ng-doc-toc-head\">\n <span class=\"ng-doc-toc-label\">{{ texts.onThisPage }}</span>\n <span class=\"ng-doc-toc-percent\" aria-hidden=\"true\">{{ progress() }}%</span>\n </div>\n <div\n class=\"ng-doc-toc-progress\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-label]=\"texts.readingProgress\"\n [attr.aria-valuenow]=\"progress()\">\n <span [style.width.%]=\"progress()\"></span>\n </div>\n <ul class=\"ng-doc-toc\" #list>\n <li class=\"ng-doc-toc-marker\" aria-hidden=\"true\" #marker></li>\n @for (item of tableOfContent(); track item; let index = $index) {\n <li\n ng-doc-toc-element\n [path]=\"item.path\"\n [hash]=\"item.hash\"\n [level]=\"item.level\"\n [selected]=\"index === activeIndex()\"\n (click)=\"pin(index)\">\n {{ item.title }}\n </li>\n }\n </ul>\n </nav>\n}\n<div class=\"ng-doc-toc-section ng-doc-toc-actions\">\n <button type=\"button\" class=\"ng-doc-toc-action\" (click)=\"scrollToTop()\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M12 19V5m-6 6 6-6 6 6\" />\n </svg>\n {{ texts.backToTop }}\n </button>\n <button\n type=\"button\"\n class=\"ng-doc-toc-action\"\n [attr.data-ng-doc-copied]=\"copied()\"\n (click)=\"copyLink()\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M10 13a5 5 0 0 0 7.5.5l3-3a5 5 0 0 0-7-7l-1.7 1.7\" />\n <path d=\"M14 11a5 5 0 0 0-7.5-.5l-3 3a5 5 0 0 0 7 7l1.7-1.7\" />\n </svg>\n <span aria-live=\"polite\">{{ copied() ? texts.copied : texts.copyLink }}</span>\n </button>\n @if (editSourceFileUrl(); as url) {\n <a class=\"ng-doc-toc-action\" [href]=\"url\" target=\"_blank\" rel=\"noopener\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\">\n <path d=\"M12 20h9M16.5 3.5a2.1 2.1 0 1 1 3 3L7 19l-4 1 1-4Z\" />\n </svg>\n {{ texts.edit }}\n </a>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["ɵngDocRouteUrl","ɵngDocPageUrl"],"mappings":"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"}
@@ -5,6 +5,7 @@ export * from '@ng-doc/app/components/command-palette';
5
5
  export * from '@ng-doc/app/components/copy-button';
6
6
  export * from '@ng-doc/app/components/demo';
7
7
  export * from '@ng-doc/app/components/demo-displayer';
8
+ export * from '@ng-doc/app/components/demo-frame';
8
9
  export * from '@ng-doc/app/components/demo-pane';
9
10
  export * from '@ng-doc/app/components/fullscreen-button';
10
11
  export * from '@ng-doc/app/components/fullscreen-toggle';
@@ -1 +1 @@
1
- {"version":3,"file":"ng-doc-app-components.mjs","sources":["../../../../libs/app/components/ng-doc-app-components.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-components.mjs","sources":["../../../../libs/app/components/ng-doc-app-components.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAEG"}
@@ -1,8 +1,18 @@
1
+ /**
2
+ * The window event that the NgDoc development client of the Vite host dispatches when a commit
3
+ * changed only generated content modules (and the search index). Its `detail` holds the new
4
+ * `payloads` of the changed content modules and whether the `search` index changed. A page that
5
+ * applies it calls `preventDefault()`; the client reloads the page when nobody does, so a page
6
+ * without the NgDoc runtime still shows the new content.
7
+ * @internal
8
+ */
9
+ const ɵNG_DOC_CONTENT_UPDATE_EVENT = 'ng-doc:content-update';
10
+
1
11
  const NG_DOC_STORE_THEME_KEY = 'ng-doc-theme-id';
2
12
 
3
13
  /**
4
14
  * Generated bundle index. Do not edit.
5
15
  */
6
16
 
7
- export { NG_DOC_STORE_THEME_KEY };
17
+ export { NG_DOC_STORE_THEME_KEY, ɵNG_DOC_CONTENT_UPDATE_EVENT };
8
18
  //# sourceMappingURL=ng-doc-app-constants.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ng-doc-app-constants.mjs","sources":["../../../../libs/app/constants/store-keys.ts","../../../../libs/app/constants/ng-doc-app-constants.ts"],"sourcesContent":["export const NG_DOC_STORE_THEME_KEY: string = 'ng-doc-theme-id';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAO,MAAM,sBAAsB,GAAW;;ACA9C;;AAEG;;;;"}
1
+ {"version":3,"file":"ng-doc-app-constants.mjs","sources":["../../../../libs/app/constants/content-update.ts","../../../../libs/app/constants/store-keys.ts","../../../../libs/app/constants/ng-doc-app-constants.ts"],"sourcesContent":["/**\n * The window event that the NgDoc development client of the Vite host dispatches when a commit\n * changed only generated content modules (and the search index). Its `detail` holds the new\n * `payloads` of the changed content modules and whether the `search` index changed. A page that\n * applies it calls `preventDefault()`; the client reloads the page when nobody does, so a page\n * without the NgDoc runtime still shows the new content.\n * @internal\n */\nexport const ɵNG_DOC_CONTENT_UPDATE_EVENT = 'ng-doc:content-update';\n","export const NG_DOC_STORE_THEME_KEY: string = 'ng-doc-theme-id';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA;;;;;;;AAOG;AACI,MAAM,4BAA4B,GAAG;;ACRrC,MAAM,sBAAsB,GAAW;;ACA9C;;AAEG;;;;"}