@ng-doc/app 22.0.0-beta.1 → 22.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -29
- package/fesm2022/ng-doc-app-classes-content-anchor-controller.mjs +363 -0
- package/fesm2022/ng-doc-app-classes-content-anchor-controller.mjs.map +1 -0
- package/fesm2022/ng-doc-app-classes-content-controller.mjs +299 -0
- package/fesm2022/ng-doc-app-classes-content-controller.mjs.map +1 -0
- package/fesm2022/ng-doc-app-classes-default-search-engine.mjs +51 -35
- package/fesm2022/ng-doc-app-classes-default-search-engine.mjs.map +1 -1
- package/fesm2022/ng-doc-app-classes-root-page.mjs.map +1 -1
- package/fesm2022/ng-doc-app-classes-search-engine.mjs.map +1 -1
- package/fesm2022/ng-doc-app-classes.mjs +2 -0
- package/fesm2022/ng-doc-app-classes.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-api-list.mjs +178 -68
- package/fesm2022/ng-doc-app-components-api-list.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-breadcrumb.mjs +13 -10
- package/fesm2022/ng-doc-app-components-breadcrumb.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-code.mjs +152 -25
- package/fesm2022/ng-doc-app-components-code.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-command-palette.mjs +498 -0
- package/fesm2022/ng-doc-app-components-command-palette.mjs.map +1 -0
- package/fesm2022/ng-doc-app-components-copy-button.mjs +38 -21
- package/fesm2022/ng-doc-app-components-copy-button.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-demo-displayer.mjs +36 -29
- package/fesm2022/ng-doc-app-components-demo-displayer.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-demo-pane.mjs +39 -36
- package/fesm2022/ng-doc-app-components-demo-pane.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-demo.mjs +129 -44
- package/fesm2022/ng-doc-app-components-demo.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-fullscreen-button.mjs +12 -9
- package/fesm2022/ng-doc-app-components-fullscreen-button.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-fullscreen-toggle.mjs +79 -0
- package/fesm2022/ng-doc-app-components-fullscreen-toggle.mjs.map +1 -0
- package/fesm2022/ng-doc-app-components-heading-anchor.mjs +54 -21
- package/fesm2022/ng-doc-app-components-heading-anchor.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-image-viewer.mjs +187 -91
- package/fesm2022/ng-doc-app-components-image-viewer.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-kind-icon.mjs +42 -25
- package/fesm2022/ng-doc-app-components-kind-icon.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-link.mjs +12 -9
- package/fesm2022/ng-doc-app-components-link.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-members.mjs +30 -0
- package/fesm2022/ng-doc-app-components-members.mjs.map +1 -0
- package/fesm2022/ng-doc-app-components-mermaid-viewer.mjs +69 -24
- package/fesm2022/ng-doc-app-components-mermaid-viewer.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-navbar.mjs +39 -49
- package/fesm2022/ng-doc-app-components-navbar.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-page-header.mjs +73 -10
- package/fesm2022/ng-doc-app-components-page-header.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-page-link.mjs +123 -31
- package/fesm2022/ng-doc-app-components-page-link.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-page-navigation.mjs +17 -19
- package/fesm2022/ng-doc-app-components-page-navigation.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-page-wrapper.mjs +56 -35
- package/fesm2022/ng-doc-app-components-page-wrapper.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-page.mjs +168 -24
- package/fesm2022/ng-doc-app-components-page.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-playground.mjs +392 -263
- package/fesm2022/ng-doc-app-components-playground.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-root.mjs +48 -31
- package/fesm2022/ng-doc-app-components-root.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-search-result.mjs +22 -21
- package/fesm2022/ng-doc-app-components-search-result.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-search.mjs +64 -33
- package/fesm2022/ng-doc-app-components-search.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-sidebar.mjs +90 -63
- package/fesm2022/ng-doc-app-components-sidebar.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-tabs.mjs +18 -12
- package/fesm2022/ng-doc-app-components-tabs.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-theme-toggle.mjs +33 -21
- package/fesm2022/ng-doc-app-components-theme-toggle.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components-toc.mjs +268 -90
- package/fesm2022/ng-doc-app-components-toc.mjs.map +1 -1
- package/fesm2022/ng-doc-app-components.mjs +3 -1
- package/fesm2022/ng-doc-app-components.mjs.map +1 -1
- package/fesm2022/ng-doc-app-defaults-default-processors.mjs +2 -1
- package/fesm2022/ng-doc-app-defaults-default-processors.mjs.map +1 -1
- package/fesm2022/ng-doc-app-directives-code-highlighter.mjs +14 -7
- package/fesm2022/ng-doc-app-directives-code-highlighter.mjs.map +1 -1
- package/fesm2022/ng-doc-app-directives-members-filter.mjs +276 -0
- package/fesm2022/ng-doc-app-directives-members-filter.mjs.map +1 -0
- package/fesm2022/ng-doc-app-directives-route-active.mjs +34 -30
- package/fesm2022/ng-doc-app-directives-route-active.mjs.map +1 -1
- package/fesm2022/ng-doc-app-directives.mjs +1 -0
- package/fesm2022/ng-doc-app-directives.mjs.map +1 -1
- package/fesm2022/ng-doc-app-helpers.mjs +285 -1
- package/fesm2022/ng-doc-app-helpers.mjs.map +1 -1
- package/fesm2022/ng-doc-app-pipes-decode-uri-component.mjs +6 -4
- package/fesm2022/ng-doc-app-pipes-decode-uri-component.mjs.map +1 -1
- package/fesm2022/ng-doc-app-pipes-extract-value.mjs +6 -4
- package/fesm2022/ng-doc-app-pipes-extract-value.mjs.map +1 -1
- package/fesm2022/ng-doc-app-pipes-filter-by-text.mjs +7 -4
- package/fesm2022/ng-doc-app-pipes-filter-by-text.mjs.map +1 -1
- package/fesm2022/ng-doc-app-pipes-sanitize-html.mjs +8 -5
- package/fesm2022/ng-doc-app-pipes-sanitize-html.mjs.map +1 -1
- package/fesm2022/ng-doc-app-processors-page-processor.mjs +86 -23
- package/fesm2022/ng-doc-app-processors-page-processor.mjs.map +1 -1
- package/fesm2022/ng-doc-app-processors-processors-tooltip.mjs +26 -25
- package/fesm2022/ng-doc-app-processors-processors-tooltip.mjs.map +1 -1
- package/fesm2022/ng-doc-app-processors-processors.mjs +12 -1
- package/fesm2022/ng-doc-app-processors-processors.mjs.map +1 -1
- package/fesm2022/ng-doc-app-providers-ng-doc-app.mjs +31 -2
- package/fesm2022/ng-doc-app-providers-ng-doc-app.mjs.map +1 -1
- package/fesm2022/ng-doc-app-services-content-scroll-intent.mjs +122 -0
- package/fesm2022/ng-doc-app-services-content-scroll-intent.mjs.map +1 -0
- package/fesm2022/ng-doc-app-services-content-state.mjs +57 -0
- package/fesm2022/ng-doc-app-services-content-state.mjs.map +1 -0
- package/fesm2022/ng-doc-app-services-fullscreen-route.mjs +74 -0
- package/fesm2022/ng-doc-app-services-fullscreen-route.mjs.map +1 -0
- package/fesm2022/ng-doc-app-services-highlighter.mjs +83 -14
- package/fesm2022/ng-doc-app-services-highlighter.mjs.map +1 -1
- package/fesm2022/ng-doc-app-services-route-preloader.mjs +360 -0
- package/fesm2022/ng-doc-app-services-route-preloader.mjs.map +1 -0
- package/fesm2022/ng-doc-app-services-shortcuts.mjs +214 -0
- package/fesm2022/ng-doc-app-services-shortcuts.mjs.map +1 -0
- package/fesm2022/ng-doc-app-services-sidebar.mjs +59 -25
- package/fesm2022/ng-doc-app-services-sidebar.mjs.map +1 -1
- package/fesm2022/ng-doc-app-services-store.mjs +8 -8
- package/fesm2022/ng-doc-app-services-store.mjs.map +1 -1
- package/fesm2022/ng-doc-app-services-theme.mjs +32 -12
- package/fesm2022/ng-doc-app-services-theme.mjs.map +1 -1
- package/fesm2022/ng-doc-app-services.mjs +143 -0
- package/fesm2022/ng-doc-app-services.mjs.map +1 -1
- package/fesm2022/ng-doc-app-tokens.mjs +7 -28
- package/fesm2022/ng-doc-app-tokens.mjs.map +1 -1
- package/fesm2022/ng-doc-app-type-controls-boolean-control.mjs +18 -9
- package/fesm2022/ng-doc-app-type-controls-boolean-control.mjs.map +1 -1
- package/fesm2022/ng-doc-app-type-controls-number-control.mjs +12 -9
- package/fesm2022/ng-doc-app-type-controls-number-control.mjs.map +1 -1
- package/fesm2022/ng-doc-app-type-controls-string-control.mjs +12 -9
- package/fesm2022/ng-doc-app-type-controls-string-control.mjs.map +1 -1
- package/fesm2022/ng-doc-app-type-controls-type-alias-control.mjs +22 -16
- package/fesm2022/ng-doc-app-type-controls-type-alias-control.mjs.map +1 -1
- package/package.json +74 -32
- package/styles/global.css +1129 -205
- package/styles/main.css +1129 -205
- package/styles/themes/dark.css +78 -56
- package/types/ng-doc-app-classes-content-anchor-controller.d.ts +54 -0
- package/types/ng-doc-app-classes-content-controller.d.ts +94 -0
- package/types/ng-doc-app-classes-default-search-engine.d.ts +9 -1
- package/types/ng-doc-app-classes-root-page.d.ts +6 -1
- package/types/ng-doc-app-classes-search-engine.d.ts +5 -0
- package/types/ng-doc-app-classes.d.ts +2 -0
- package/types/ng-doc-app-components-api-list.d.ts +69 -20
- package/types/ng-doc-app-components-breadcrumb.d.ts +8 -3
- package/types/ng-doc-app-components-code.d.ts +46 -12
- package/types/ng-doc-app-components-command-palette.d.ts +147 -0
- package/types/ng-doc-app-components-copy-button.d.ts +18 -6
- package/types/ng-doc-app-components-demo-displayer.d.ts +23 -10
- package/types/ng-doc-app-components-demo-pane.d.ts +19 -15
- package/types/ng-doc-app-components-demo.d.ts +62 -15
- package/types/ng-doc-app-components-fullscreen-button.d.ts +4 -2
- package/types/ng-doc-app-components-fullscreen-toggle.d.ts +24 -0
- package/types/ng-doc-app-components-heading-anchor.d.ts +26 -7
- package/types/ng-doc-app-components-image-viewer.d.ts +71 -7
- package/types/ng-doc-app-components-kind-icon.d.ts +28 -7
- package/types/ng-doc-app-components-link.d.ts +6 -2
- package/types/ng-doc-app-components-members.d.ts +13 -0
- package/types/ng-doc-app-components-mermaid-viewer.d.ts +21 -6
- package/types/ng-doc-app-components-navbar.d.ts +25 -15
- package/types/ng-doc-app-components-page-header.d.ts +28 -4
- package/types/ng-doc-app-components-page-link.d.ts +34 -15
- package/types/ng-doc-app-components-page-navigation.d.ts +10 -5
- package/types/ng-doc-app-components-page-wrapper.d.ts +35 -11
- package/types/ng-doc-app-components-page.d.ts +57 -6
- package/types/ng-doc-app-components-playground.d.ts +146 -78
- package/types/ng-doc-app-components-root.d.ts +28 -7
- package/types/ng-doc-app-components-search-result.d.ts +14 -6
- package/types/ng-doc-app-components-search.d.ts +19 -7
- package/types/ng-doc-app-components-tabs.d.ts +13 -4
- package/types/ng-doc-app-components-theme-toggle.d.ts +18 -5
- package/types/ng-doc-app-components-toc.d.ts +76 -29
- package/types/ng-doc-app-components.d.ts +3 -1
- package/types/ng-doc-app-directives-code-highlighter.d.ts +8 -4
- package/types/ng-doc-app-directives-members-filter.d.ts +61 -0
- package/types/ng-doc-app-directives-route-active.d.ts +21 -7
- package/types/ng-doc-app-directives.d.ts +1 -0
- package/types/ng-doc-app-helpers.d.ts +124 -3
- package/types/ng-doc-app-interfaces.d.ts +48 -28
- package/types/ng-doc-app-pipes-decode-uri-component.d.ts +3 -0
- package/types/ng-doc-app-pipes-extract-value.d.ts +3 -0
- package/types/ng-doc-app-pipes-filter-by-text.d.ts +4 -0
- package/types/ng-doc-app-pipes-sanitize-html.d.ts +4 -2
- package/types/ng-doc-app-processors-page-processor.d.ts +39 -10
- package/types/ng-doc-app-processors-processors-tooltip.d.ts +11 -10
- package/types/ng-doc-app-processors-processors.d.ts +5 -1
- package/types/ng-doc-app-providers-ng-doc-app.d.ts +17 -0
- package/types/ng-doc-app-providers-playground-demo.d.ts +1 -1
- package/types/ng-doc-app-providers-type-control.d.ts +2 -2
- package/types/ng-doc-app-services-content-scroll-intent.d.ts +52 -0
- package/types/ng-doc-app-services-content-state.d.ts +40 -0
- package/types/ng-doc-app-services-fullscreen-route.d.ts +35 -0
- package/types/ng-doc-app-services-highlighter.d.ts +40 -5
- package/types/ng-doc-app-services-route-preloader.d.ts +109 -0
- package/types/ng-doc-app-services-shortcuts.d.ts +96 -0
- package/types/ng-doc-app-services-sidebar.d.ts +24 -4
- package/types/ng-doc-app-services-store.d.ts +24 -1
- package/types/ng-doc-app-services-theme.d.ts +19 -3
- package/types/ng-doc-app-services.d.ts +77 -0
- package/types/ng-doc-app-tokens.d.ts +10 -30
- package/types/ng-doc-app-type-controls-boolean-control.d.ts +11 -6
- package/types/ng-doc-app-type-controls-number-control.d.ts +5 -3
- package/types/ng-doc-app-type-controls-string-control.d.ts +5 -3
- package/types/ng-doc-app-type-controls-type-alias-control.d.ts +13 -6
- package/fesm2022/ng-doc-app-components-search-dialog.mjs +0 -78
- package/fesm2022/ng-doc-app-components-search-dialog.mjs.map +0 -1
- package/types/ng-doc-app-components-search-dialog.d.ts +0 -28
|
@@ -1,120 +1,298 @@
|
|
|
1
|
+
import { Clipboard } from '@angular/cdk/clipboard';
|
|
2
|
+
import { LocationStrategy } from '@angular/common';
|
|
1
3
|
import * as i0 from '@angular/core';
|
|
2
|
-
import {
|
|
4
|
+
import { input, booleanAttribute, numberAttribute, inject, ElementRef, ChangeDetectionStrategy, Component, signal, computed, DOCUMENT, NgZone, viewChild, viewChildren, DestroyRef, effect, afterNextRender, afterRenderEffect, untracked } from '@angular/core';
|
|
3
5
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
-
import { RouterLink, Router,
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { filter
|
|
6
|
+
import { RouterLink, Router, NavigationEnd } from '@angular/router';
|
|
7
|
+
import { ɵngDocRouteUrl as _ngDocRouteUrl, ɵngDocPageUrl as _ngDocPageUrl } from '@ng-doc/app/helpers';
|
|
8
|
+
import { NgDocShortcutsService } from '@ng-doc/app/services/shortcuts';
|
|
9
|
+
import { WA_WINDOW, WA_LOCATION } from '@ng-web-apis/common';
|
|
10
|
+
import { filter } from 'rxjs/operators';
|
|
9
11
|
import { NgDocDecodeUriComponentPipe } from '@ng-doc/app/pipes/decode-uri-component';
|
|
10
12
|
|
|
13
|
+
/**
|
|
14
|
+
* One entry of the table of contents: a link to a heading of the page.
|
|
15
|
+
*/
|
|
11
16
|
class NgDocTocElementComponent {
|
|
12
17
|
constructor() {
|
|
13
|
-
|
|
14
|
-
this.
|
|
15
|
-
|
|
16
|
-
|
|
18
|
+
/** Path of the page that holds the heading. */
|
|
19
|
+
this.path = input('', /* @ts-ignore */
|
|
20
|
+
...(ngDevMode ? [{ debugName: "path" }] : /* istanbul ignore next */ []));
|
|
21
|
+
/** Id of the heading, used as the link's fragment. */
|
|
22
|
+
this.hash = input('', /* @ts-ignore */
|
|
23
|
+
...(ngDevMode ? [{ debugName: "hash" }] : /* istanbul ignore next */ []));
|
|
24
|
+
/** Whether the heading is the section the reader is in. */
|
|
25
|
+
this.selected = input(false, { ...(ngDevMode ? { debugName: "selected" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
26
|
+
/** Depth of the heading in the table of contents, from 1. */
|
|
27
|
+
this.level = input(1, { ...(ngDevMode ? { debugName: "level" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
28
|
+
/** The list item element. */
|
|
17
29
|
this.elementRef = inject(ElementRef);
|
|
18
30
|
}
|
|
19
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
20
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
31
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocTocElementComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
32
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.2.1", type: NgDocTocElementComponent, isStandalone: true, selector: "li[ng-doc-toc-element]", inputs: { path: { classPropertyName: "path", publicName: "path", isSignal: true, isRequired: false, transformFunction: null }, hash: { classPropertyName: "hash", publicName: "hash", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-ng-doc-selected": "selected()", "attr.data-ng-doc-level": "level()" } }, ngImport: i0, template: "<a\n [routerLink]=\"[]\"\n [fragment]=\"hash() | decodeUriComponent\"\n [attr.aria-current]=\"selected() ? 'location' : null\">\n <ng-content></ng-content>\n</a>\n", styles: [":host{position:relative;display:block;margin:0}a{display:flex;align-items:center;min-height:32px;padding:6px var(--ng-doc-space-2) 6px calc(var(--ng-doc-space-2) + var(--ng-doc-toc-indent) * 1.5 * (var(--_toc-level) - 1));border-radius:var(--ng-doc-radius-md);color:var(--ng-doc-text-muted);text-decoration:none;overflow-wrap:anywhere;transition:color var(--ng-doc-transition)}a:hover{color:var(--ng-doc-heading-color)}a:focus-visible{outline:none;box-shadow:inset 0 0 0 2px var(--ng-doc-primary)}:host{--_toc-level: 1}:host([data-ng-doc-level=\"2\"]){--_toc-level: 2}:host([data-ng-doc-level=\"3\"]){--_toc-level: 3}:host([data-ng-doc-level=\"4\"]),:host([data-ng-doc-level=\"5\"]),:host([data-ng-doc-level=\"6\"]){--_toc-level: 4}:host([data-ng-doc-selected=true]) a{color:var(--ng-doc-primary-strong);font-weight:500}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "pipe", type: NgDocDecodeUriComponentPipe, name: "decodeUriComponent" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
21
33
|
}
|
|
22
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
34
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocTocElementComponent, decorators: [{
|
|
23
35
|
type: Component,
|
|
24
|
-
args: [{ selector: 'li[ng-doc-toc-element]', changeDetection: ChangeDetectionStrategy.OnPush, imports: [RouterLink, NgDocDecodeUriComponentPipe],
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}], selected: [{
|
|
30
|
-
type: Input
|
|
31
|
-
}, {
|
|
32
|
-
type: HostBinding,
|
|
33
|
-
args: ['attr.data-ng-doc-selected']
|
|
34
|
-
}], level: [{
|
|
35
|
-
type: Input
|
|
36
|
-
}, {
|
|
37
|
-
type: HostBinding,
|
|
38
|
-
args: ['attr.data-ng-doc-level']
|
|
39
|
-
}] } });
|
|
36
|
+
args: [{ selector: 'li[ng-doc-toc-element]', changeDetection: ChangeDetectionStrategy.OnPush, imports: [RouterLink, NgDocDecodeUriComponentPipe], host: {
|
|
37
|
+
'[attr.data-ng-doc-selected]': 'selected()',
|
|
38
|
+
'[attr.data-ng-doc-level]': 'level()',
|
|
39
|
+
}, template: "<a\n [routerLink]=\"[]\"\n [fragment]=\"hash() | decodeUriComponent\"\n [attr.aria-current]=\"selected() ? 'location' : null\">\n <ng-content></ng-content>\n</a>\n", styles: [":host{position:relative;display:block;margin:0}a{display:flex;align-items:center;min-height:32px;padding:6px var(--ng-doc-space-2) 6px calc(var(--ng-doc-space-2) + var(--ng-doc-toc-indent) * 1.5 * (var(--_toc-level) - 1));border-radius:var(--ng-doc-radius-md);color:var(--ng-doc-text-muted);text-decoration:none;overflow-wrap:anywhere;transition:color var(--ng-doc-transition)}a:hover{color:var(--ng-doc-heading-color)}a:focus-visible{outline:none;box-shadow:inset 0 0 0 2px var(--ng-doc-primary)}:host{--_toc-level: 1}:host([data-ng-doc-level=\"2\"]){--_toc-level: 2}:host([data-ng-doc-level=\"3\"]){--_toc-level: 3}:host([data-ng-doc-level=\"4\"]),:host([data-ng-doc-level=\"5\"]),:host([data-ng-doc-level=\"6\"]){--_toc-level: 4}:host([data-ng-doc-selected=true]) a{color:var(--ng-doc-primary-strong);font-weight:500}\n"] }]
|
|
40
|
+
}], propDecorators: { path: [{ type: i0.Input, args: [{ isSignal: true, alias: "path", required: false }] }], hash: [{ type: i0.Input, args: [{ isSignal: true, alias: "hash", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }] } });
|
|
40
41
|
|
|
42
|
+
/**
|
|
43
|
+
* How far below the navbar, in pixels, a heading counts as the start of the section the reader is
|
|
44
|
+
* in.
|
|
45
|
+
*/
|
|
46
|
+
const ACTIVE_LINE_OFFSET = 80;
|
|
47
|
+
/** Keys that scroll the page; pressing one hands the active section back to scrolling. */
|
|
48
|
+
const SCROLL_KEYS = new Set([
|
|
49
|
+
'ArrowUp',
|
|
50
|
+
'ArrowDown',
|
|
51
|
+
'PageUp',
|
|
52
|
+
'PageDown',
|
|
53
|
+
'Home',
|
|
54
|
+
'End',
|
|
55
|
+
' ',
|
|
56
|
+
]);
|
|
57
|
+
/**
|
|
58
|
+
* The "On this page" rail: the headings of the page, the section the reader is in, the reading
|
|
59
|
+
* progress, and the Back to top, Copy link and Edit this page actions.
|
|
60
|
+
*
|
|
61
|
+
* The active section follows scrolling: it is the last heading above a line a little below the
|
|
62
|
+
* navbar, or the last heading once the page is scrolled to the end. A heading the reader picked
|
|
63
|
+
* (an entry clicked, or a link to its fragment) stays active until the reader scrolls again, so a
|
|
64
|
+
* section near the end of the page, which cannot scroll to the top, is still marked. A soft marker
|
|
65
|
+
* glides to the active entry. Tracking pauses while the rail is hidden.
|
|
66
|
+
*
|
|
67
|
+
* While the rail exists, the L shortcut runs its Copy link action, so the rail confirms the copy.
|
|
68
|
+
*/
|
|
41
69
|
class NgDocTocComponent {
|
|
42
70
|
constructor() {
|
|
43
|
-
|
|
44
|
-
this.
|
|
45
|
-
|
|
71
|
+
/** The headings of the page. */
|
|
72
|
+
this.tableOfContent = input([], /* @ts-ignore */
|
|
73
|
+
...(ngDevMode ? [{ debugName: "tableOfContent" }] : /* istanbul ignore next */ []));
|
|
74
|
+
/** URL where the reader can edit the page source. Without it, the rail has no Edit action. */
|
|
75
|
+
this.editSourceFileUrl = input(undefined, /* @ts-ignore */
|
|
76
|
+
...(ngDevMode ? [{ debugName: "editSourceFileUrl" }] : /* istanbul ignore next */ []));
|
|
77
|
+
/** The symbol details of an API page, shown above the headings. */
|
|
78
|
+
this.details = input(undefined, /* @ts-ignore */
|
|
79
|
+
...(ngDevMode ? [{ debugName: "details" }] : /* istanbul ignore next */ []));
|
|
80
|
+
/** Index of the heading of the section the reader is in. */
|
|
81
|
+
this.activeIndex = signal(0, /* @ts-ignore */
|
|
82
|
+
...(ngDevMode ? [{ debugName: "activeIndex" }] : /* istanbul ignore next */ []));
|
|
83
|
+
/** The heading of the section the reader is in. */
|
|
84
|
+
this.activeItem = computed(() => this.tableOfContent()[this.activeIndex()], /* @ts-ignore */
|
|
85
|
+
...(ngDevMode ? [{ debugName: "activeItem" }] : /* istanbul ignore next */ []));
|
|
86
|
+
/** How much of the page has been scrolled, in percent. */
|
|
87
|
+
this.progress = signal(0, /* @ts-ignore */
|
|
88
|
+
...(ngDevMode ? [{ debugName: "progress" }] : /* istanbul ignore next */ []));
|
|
89
|
+
/** Whether the link was just copied. */
|
|
90
|
+
this.copied = signal(false, /* @ts-ignore */
|
|
91
|
+
...(ngDevMode ? [{ debugName: "copied" }] : /* istanbul ignore next */ []));
|
|
46
92
|
this.document = inject(DOCUMENT);
|
|
93
|
+
this.window = inject(WA_WINDOW);
|
|
94
|
+
this.location = inject(WA_LOCATION);
|
|
95
|
+
this.locationStrategy = inject(LocationStrategy);
|
|
96
|
+
this.clipboard = inject(Clipboard);
|
|
47
97
|
this.ngZone = inject(NgZone);
|
|
48
|
-
this.
|
|
49
|
-
this.
|
|
98
|
+
this.rail = inject(ElementRef).nativeElement;
|
|
99
|
+
this.list = viewChild('list', /* @ts-ignore */
|
|
100
|
+
...(ngDevMode ? [{ debugName: "list" }] : /* istanbul ignore next */ []));
|
|
101
|
+
this.detailsHost = viewChild('details', /* @ts-ignore */
|
|
102
|
+
...(ngDevMode ? [{ debugName: "detailsHost" }] : /* istanbul ignore next */ []));
|
|
103
|
+
this.marker = viewChild('marker', /* @ts-ignore */
|
|
104
|
+
...(ngDevMode ? [{ debugName: "marker" }] : /* istanbul ignore next */ []));
|
|
105
|
+
this.elements = viewChildren(NgDocTocElementComponent, /* @ts-ignore */
|
|
106
|
+
...(ngDevMode ? [{ debugName: "elements" }] : /* istanbul ignore next */ []));
|
|
50
107
|
this.router = inject(Router);
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
108
|
+
// Index of the heading the reader picked; it wins over scrolling until the next user scroll.
|
|
109
|
+
this.pinned = null;
|
|
110
|
+
const destroyRef = inject(DestroyRef);
|
|
111
|
+
// The details are page content that the page hands over; they are moved, not copied, so the
|
|
112
|
+
// content keeps no hidden duplicate. It runs on the server too, so prerendered pages have it.
|
|
113
|
+
effect(() => {
|
|
114
|
+
const host = this.detailsHost()?.nativeElement;
|
|
115
|
+
const details = this.details();
|
|
116
|
+
if (host && details && details.parentNode !== host) {
|
|
117
|
+
// The server DOM has no `replaceChildren()`.
|
|
118
|
+
while (host.firstChild)
|
|
119
|
+
host.removeChild(host.firstChild);
|
|
120
|
+
host.appendChild(details);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
// A navigation to a fragment of this page (a TOC entry, an anchor in the content, a deep
|
|
124
|
+
// link) picks that heading.
|
|
125
|
+
this.router.events
|
|
126
|
+
.pipe(filter((event) => event instanceof NavigationEnd), takeUntilDestroyed())
|
|
127
|
+
.subscribe(() => this.pinFragment(this.router.parseUrl(this.router.url).fragment));
|
|
128
|
+
// Scroll events are frequent: they are read once per frame, outside the Angular zone, and
|
|
129
|
+
// only the signal writes they cause schedule change detection.
|
|
130
|
+
afterNextRender(() => {
|
|
131
|
+
let frame = 0;
|
|
132
|
+
const onScroll = () => {
|
|
133
|
+
frame ||= this.window.requestAnimationFrame(() => {
|
|
134
|
+
frame = 0;
|
|
135
|
+
this.track();
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
// Wheel, touch and scrolling keys are the reader scrolling; the scroll events of a jump
|
|
139
|
+
// to an anchor are not, so they keep a picked heading.
|
|
140
|
+
const onUserScroll = (event) => {
|
|
141
|
+
if (event instanceof KeyboardEvent && !SCROLL_KEYS.has(event.key)) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (this.pinned !== null) {
|
|
145
|
+
this.pinned = null;
|
|
146
|
+
onScroll();
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
this.ngZone.runOutsideAngular(() => {
|
|
150
|
+
this.window.addEventListener('scroll', onScroll, { passive: true });
|
|
151
|
+
this.window.addEventListener('resize', onScroll, { passive: true });
|
|
152
|
+
this.window.addEventListener('wheel', onUserScroll, { passive: true });
|
|
153
|
+
this.window.addEventListener('touchmove', onUserScroll, { passive: true });
|
|
154
|
+
this.window.addEventListener('keydown', onUserScroll);
|
|
155
|
+
});
|
|
156
|
+
destroyRef.onDestroy(() => {
|
|
157
|
+
this.window.removeEventListener('scroll', onScroll);
|
|
158
|
+
this.window.removeEventListener('resize', onScroll);
|
|
159
|
+
this.window.removeEventListener('wheel', onUserScroll);
|
|
160
|
+
this.window.removeEventListener('touchmove', onUserScroll);
|
|
161
|
+
this.window.removeEventListener('keydown', onUserScroll);
|
|
162
|
+
this.window.cancelAnimationFrame(frame);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
destroyRef.onDestroy(() => clearTimeout(this.copiedTimer));
|
|
166
|
+
// L copies the same link as the Copy link action and shows its confirmation. The shortcuts
|
|
167
|
+
// service runs the last registration of a key, so the built-in L is back once the rail is gone.
|
|
168
|
+
destroyRef.onDestroy(inject(NgDocShortcutsService).register({ key: 'l', handler: () => this.copyLink() }));
|
|
169
|
+
// A new table of contents is tracked as soon as it is rendered; a fragment in the URL picks
|
|
170
|
+
// its heading.
|
|
171
|
+
afterRenderEffect({
|
|
172
|
+
read: () => {
|
|
173
|
+
this.tableOfContent();
|
|
174
|
+
untracked(() => {
|
|
175
|
+
this.pinned = null;
|
|
176
|
+
// The route's fragment, not the document's: with hash location the route is the
|
|
177
|
+
// document's fragment.
|
|
178
|
+
this.pinFragment(_ngDocRouteUrl(this.locationStrategy, this.location.href).hash.replace(/^#/, ''));
|
|
179
|
+
this.track();
|
|
180
|
+
});
|
|
81
181
|
},
|
|
82
182
|
});
|
|
183
|
+
// The marker glides to the active entry, and the rail scrolls to keep the entry in view.
|
|
184
|
+
afterRenderEffect({
|
|
185
|
+
earlyRead: () => {
|
|
186
|
+
const element = this.elements()[this.activeIndex()]?.elementRef.nativeElement;
|
|
187
|
+
return element ? { top: element.offsetTop, height: element.offsetHeight } : null;
|
|
188
|
+
},
|
|
189
|
+
write: (box) => {
|
|
190
|
+
const marker = this.marker()?.nativeElement;
|
|
191
|
+
const position = box();
|
|
192
|
+
if (!marker) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
marker.style.transform = `translateY(${position?.top ?? 0}px)`;
|
|
196
|
+
marker.style.height = `${position?.height ?? 0}px`;
|
|
197
|
+
this.keepInView(position);
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Scrolls the page back to its top.
|
|
203
|
+
*/
|
|
204
|
+
scrollToTop() {
|
|
205
|
+
const reduceMotion = this.window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false;
|
|
206
|
+
this.window.scrollTo({ top: 0, behavior: reduceMotion ? 'auto' : 'smooth' });
|
|
83
207
|
}
|
|
84
|
-
|
|
85
|
-
|
|
208
|
+
/**
|
|
209
|
+
* Copies the link to the page, without its query and fragment.
|
|
210
|
+
*/
|
|
211
|
+
copyLink() {
|
|
212
|
+
this.clipboard.copy(_ngDocPageUrl(this.locationStrategy, this.location));
|
|
213
|
+
this.copied.set(true);
|
|
214
|
+
clearTimeout(this.copiedTimer);
|
|
215
|
+
// The label timer must not hold the application unstable, so it runs outside the zone.
|
|
216
|
+
this.copiedTimer = this.ngZone.runOutsideAngular(() => setTimeout(() => this.copied.set(false), 1400));
|
|
86
217
|
}
|
|
87
218
|
/**
|
|
88
|
-
*
|
|
89
|
-
* @param
|
|
219
|
+
* Marks a heading as the active section until the reader scrolls again.
|
|
220
|
+
* @param index - Index of the heading in the table of contents.
|
|
90
221
|
*/
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
222
|
+
pin(index) {
|
|
223
|
+
if (index >= 0 && index < this.tableOfContent().length) {
|
|
224
|
+
this.pinned = index;
|
|
225
|
+
this.activeIndex.set(index);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
pinFragment(fragment) {
|
|
229
|
+
if (!fragment) {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
const hash = safeDecode(fragment);
|
|
233
|
+
this.pin(this.tableOfContent().findIndex((item) => item.hash === hash));
|
|
234
|
+
}
|
|
235
|
+
track() {
|
|
236
|
+
// Below the rail's breakpoint it is not displayed: nothing to update until it shows again.
|
|
237
|
+
if (this.rail.checkVisibility?.() === false) {
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
const root = this.document.documentElement;
|
|
241
|
+
const max = root.scrollHeight - this.window.innerHeight;
|
|
242
|
+
const scrolled = this.window.scrollY;
|
|
243
|
+
// A page shorter than the viewport is read in full.
|
|
244
|
+
this.progress.set(max > 0 ? Math.min(100, Math.max(0, Math.round((scrolled / max) * 100))) : 100);
|
|
245
|
+
const items = this.tableOfContent();
|
|
246
|
+
if (!items.length || this.pinned !== null) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
const header = this.document.querySelector('.ng-doc-header')?.getBoundingClientRect().bottom ?? 0;
|
|
250
|
+
const line = header + ACTIVE_LINE_OFFSET;
|
|
251
|
+
let active = 0;
|
|
252
|
+
items.forEach((item, index) => {
|
|
253
|
+
if (item.element.getBoundingClientRect().top <= line) {
|
|
254
|
+
active = index;
|
|
99
255
|
}
|
|
256
|
+
});
|
|
257
|
+
if (max > 0 && scrolled >= max - 2) {
|
|
258
|
+
active = items.length - 1;
|
|
259
|
+
}
|
|
260
|
+
this.activeIndex.set(active);
|
|
261
|
+
}
|
|
262
|
+
keepInView(position) {
|
|
263
|
+
const list = this.list()?.nativeElement;
|
|
264
|
+
if (!list || !position || this.rail.scrollHeight <= this.rail.clientHeight) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const top = list.offsetTop + position.top;
|
|
268
|
+
const bottom = top + position.height;
|
|
269
|
+
if (top < this.rail.scrollTop) {
|
|
270
|
+
this.rail.scrollTop = top;
|
|
271
|
+
}
|
|
272
|
+
else if (bottom > this.rail.scrollTop + this.rail.clientHeight) {
|
|
273
|
+
this.rail.scrollTop = bottom - this.rail.clientHeight;
|
|
100
274
|
}
|
|
101
|
-
this.activeItem.set(item);
|
|
102
275
|
}
|
|
103
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
104
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
276
|
+
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 }); }
|
|
105
278
|
}
|
|
106
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
279
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocTocComponent, decorators: [{
|
|
107
280
|
type: Component,
|
|
108
|
-
args: [{ selector: 'ng-doc-toc', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgDocTocElementComponent], template: "<div class=\"ng-doc-toc-
|
|
109
|
-
}], ctorParameters: () => [], propDecorators: { tableOfContent: [{
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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"] }]
|
|
282
|
+
}], 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
|
+
/**
|
|
284
|
+
* Decodes a URL fragment, and returns it unchanged when it is not a valid encoding.
|
|
285
|
+
* @param fragment - The fragment, without `#`.
|
|
286
|
+
* @returns The decoded fragment.
|
|
287
|
+
*/
|
|
288
|
+
function safeDecode(fragment) {
|
|
289
|
+
try {
|
|
290
|
+
return decodeURIComponent(fragment);
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
return fragment;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
118
296
|
|
|
119
297
|
/**
|
|
120
298
|
* Generated bundle index. Do not edit.
|
|
@@ -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 ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostBinding,\n inject,\n Input,\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { NgDocDecodeUriComponentPipe } from '@ng-doc/app/pipes/decode-uri-component';\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})\nexport class NgDocTocElementComponent {\n @Input()\n path: string = '';\n\n @Input()\n hash: string = '';\n\n @Input()\n @HostBinding('attr.data-ng-doc-selected')\n selected: boolean = false;\n\n @Input()\n @HostBinding('attr.data-ng-doc-level')\n level: number = 1;\n\n readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n}\n","<a\n [routerLink]=\"[]\"\n [fragment]=\"hash | decodeUriComponent\"\n [style.padding-left]=\"'calc(var(--ng-doc-toc-indent) * ' + level + ')'\">\n <ng-content></ng-content>\n</a>\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n DOCUMENT,\n ElementRef,\n inject,\n Input,\n NgZone,\n OnInit,\n QueryList,\n Renderer2,\n signal,\n ViewChild,\n ViewChildren,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Event as REvent, Router, Scroll } from '@angular/router';\nimport { NgDocPageToc, NgDocTocItem } from '@ng-doc/app/interfaces';\nimport { isPresent } from '@ng-doc/core/helpers/is-present';\nimport { ngDocZoneOptimize } from '@ng-doc/ui-kit';\nimport { fromEvent, merge, Observable } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, filter, map, startWith } from 'rxjs/operators';\n\nimport { NgDocTocElementComponent } from './toc-element/toc-element.component';\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, OnInit {\n @Input()\n tableOfContent: NgDocTocItem[] = [];\n\n @ViewChild('selection', { read: ElementRef })\n selection?: ElementRef<HTMLElement>;\n\n @ViewChildren(NgDocTocElementComponent)\n elements: QueryList<NgDocTocElementComponent> = new QueryList<NgDocTocElementComponent>();\n\n activeItem: WritableSignal<NgDocTocItem | undefined> = signal(undefined);\n\n protected readonly document: Document = inject(DOCUMENT);\n protected readonly ngZone: NgZone = inject(NgZone);\n protected readonly changeDetectorRef: ChangeDetectorRef = inject(ChangeDetectorRef);\n protected readonly renderer: Renderer2 = inject(Renderer2);\n protected readonly router: Router = inject(Router);\n protected readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n afterNextRender({\n write: () => {\n const scrollSelection: Observable<NgDocTocItem> = fromEvent(this.document, 'scroll').pipe(\n filter(() => !!this.tableOfContent.length),\n map((event: Event) => (event.target as Document).scrollingElement as HTMLElement),\n startWith(this.document.scrollingElement as HTMLElement),\n map((target: HTMLElement) => {\n const percentage: number =\n (target.scrollTop * 100) / (target.scrollHeight - target.offsetHeight);\n const selectionLine: number =\n target.scrollTop + (target.offsetHeight * percentage) / 100;\n if (!this.tableOfContent.length) {\n return null;\n }\n return this.tableOfContent.reduce((pTarget: NgDocTocItem, cTarget: NgDocTocItem) => {\n const pTop: number = pTarget.element.getBoundingClientRect().top + target.scrollTop;\n const cTop: number = cTarget.element.getBoundingClientRect().top + target.scrollTop;\n return Math.abs(cTop - selectionLine) < Math.abs(pTop - selectionLine)\n ? cTarget\n : pTarget;\n });\n }),\n filter(isPresent),\n );\n const routerSelection: Observable<NgDocTocItem> = this.router.events.pipe(\n map((event: REvent) => {\n if (event instanceof Scroll) {\n const item: NgDocTocItem | undefined = this.tableOfContent.find(\n (item: NgDocTocItem) => item.path.includes(event.routerEvent.url),\n );\n if (item) {\n return item;\n }\n }\n return null;\n }),\n filter(isPresent),\n debounceTime(20),\n );\n const elementsChanges = this.elements.changes.pipe(\n map(() => this.activeItem()),\n filter(isPresent),\n );\n merge(merge(scrollSelection, routerSelection).pipe(distinctUntilChanged()), elementsChanges)\n .pipe(\n debounceTime(0),\n ngDocZoneOptimize(this.ngZone),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(this.select.bind(this));\n },\n });\n }\n\n ngOnInit(): void {\n this.activeItem.set(this.tableOfContent[0]);\n }\n\n /**\n * Selects the item in the table of content.\n * @param item - Item to select.\n */\n protected select(item: NgDocTocItem): void {\n const index: number = this.tableOfContent.indexOf(item);\n\n if (this.selection) {\n const element: HTMLElement | undefined =\n this.elements.toArray()[index]?.elementRef.nativeElement;\n\n if (element) {\n this.renderer.setStyle(this.selection.nativeElement, 'top', `${element.offsetTop}px`);\n this.renderer.setStyle(this.selection.nativeElement, 'height', `${element.offsetHeight}px`);\n\n element.scrollIntoView({ block: 'nearest' });\n }\n }\n\n this.activeItem.set(item);\n }\n}\n","<div class=\"ng-doc-toc-wrapper\">\n <div class=\"ng-doc-toc-container\">\n <div class=\"ng-doc-toc-selection\" #selection></div>\n <ul class=\"ng-doc-toc\">\n @for (item of tableOfContent; track item) {\n <li\n ng-doc-toc-element\n [path]=\"item.path\"\n [hash]=\"item.hash\"\n [level]=\"item.level\"\n [selected]=\"item === activeItem()\">\n {{ item.title }}\n </li>\n }\n </ul>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"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 } 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,15 +1,18 @@
|
|
|
1
1
|
export * from '@ng-doc/app/components/api-list';
|
|
2
2
|
export * from '@ng-doc/app/components/breadcrumb';
|
|
3
3
|
export * from '@ng-doc/app/components/code';
|
|
4
|
+
export * from '@ng-doc/app/components/command-palette';
|
|
4
5
|
export * from '@ng-doc/app/components/copy-button';
|
|
5
6
|
export * from '@ng-doc/app/components/demo';
|
|
6
7
|
export * from '@ng-doc/app/components/demo-displayer';
|
|
7
8
|
export * from '@ng-doc/app/components/demo-pane';
|
|
8
9
|
export * from '@ng-doc/app/components/fullscreen-button';
|
|
10
|
+
export * from '@ng-doc/app/components/fullscreen-toggle';
|
|
9
11
|
export * from '@ng-doc/app/components/heading-anchor';
|
|
10
12
|
export * from '@ng-doc/app/components/image-viewer';
|
|
11
13
|
export * from '@ng-doc/app/components/kind-icon';
|
|
12
14
|
export * from '@ng-doc/app/components/link';
|
|
15
|
+
export * from '@ng-doc/app/components/members';
|
|
13
16
|
export * from '@ng-doc/app/components/mermaid-viewer';
|
|
14
17
|
export * from '@ng-doc/app/components/navbar';
|
|
15
18
|
export * from '@ng-doc/app/components/page';
|
|
@@ -20,7 +23,6 @@ export * from '@ng-doc/app/components/page-wrapper';
|
|
|
20
23
|
export * from '@ng-doc/app/components/playground';
|
|
21
24
|
export * from '@ng-doc/app/components/root';
|
|
22
25
|
export * from '@ng-doc/app/components/search';
|
|
23
|
-
export * from '@ng-doc/app/components/search-dialog';
|
|
24
26
|
export * from '@ng-doc/app/components/search-result';
|
|
25
27
|
export * from '@ng-doc/app/components/sidebar';
|
|
26
28
|
export * from '@ng-doc/app/components/tabs';
|
|
@@ -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":"
|
|
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,4 +1,4 @@
|
|
|
1
|
-
import { linkProcessor, iconProcessor, headingAnchorProcessor, blockquoteProcessor, tooltipProcessor, mermaidProcessor, codeProcessor, demoProcessor, demoPaneProcessor, playgroundProcessor, tabsProcessor, imageProcessor } from '@ng-doc/app/processors/processors';
|
|
1
|
+
import { linkProcessor, iconProcessor, headingAnchorProcessor, blockquoteProcessor, tooltipProcessor, mermaidProcessor, codeProcessor, demoProcessor, demoPaneProcessor, playgroundProcessor, tabsProcessor, imageProcessor, membersProcessor } from '@ng-doc/app/processors/processors';
|
|
2
2
|
|
|
3
3
|
const NG_DOC_DEFAULT_PAGE_PROCESSORS = [
|
|
4
4
|
/**
|
|
@@ -17,6 +17,7 @@ const NG_DOC_DEFAULT_PAGE_PROCESSORS = [
|
|
|
17
17
|
playgroundProcessor,
|
|
18
18
|
tabsProcessor,
|
|
19
19
|
imageProcessor,
|
|
20
|
+
membersProcessor,
|
|
20
21
|
];
|
|
21
22
|
|
|
22
23
|
/**
|