@ng-doc/app 22.0.0-beta.2 → 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 +173 -69
- 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 +183 -89
- 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 +61 -20
- 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 +86 -61
- 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 +267 -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 +11 -5
- 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 +69 -28
- package/styles/global.css +1125 -201
- package/styles/main.css +1125 -201
- 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-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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-doc-app-components-page-header.mjs","sources":["../../../../libs/app/components/page-header/page-header.component.ts","../../../../libs/app/components/page-header/page-header.component.html","../../../../libs/app/components/page-header/ng-doc-app-components-page-header.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"ng-doc-app-components-page-header.mjs","sources":["../../../../libs/app/components/page-header/page-header.component.ts","../../../../libs/app/components/page-header/page-header.component.html","../../../../libs/app/components/page-header/ng-doc-app-components-page-header.ts"],"sourcesContent":["import { isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n PLATFORM_ID,\n untracked,\n} from '@angular/core';\nimport { NgDocContentController } from '@ng-doc/app/classes/content-controller';\nimport { ɵrestoreNgDocHydrationSnapshot } from '@ng-doc/app/helpers';\nimport { NgDocSanitizeHtmlPipe } from '@ng-doc/app/pipes';\nimport { NgDocPageProcessorComponent } from '@ng-doc/app/processors';\nimport type { NgDocContentSource } from '@ng-doc/core/interfaces';\n\n/**\n * The header of a documentation page: the rendered header HTML, or the header of an\n * asynchronous content source.\n */\n@Component({\n selector: 'ng-doc-page-header',\n imports: [NgDocPageProcessorComponent, NgDocSanitizeHtmlPipe],\n templateUrl: './page-header.component.html',\n styleUrl: './page-header.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [NgDocContentController],\n host: {\n ngSkipHydration: 'true',\n // Tells the browser that the server-rendered header must be kept until the loaded one\n // renders (ɵNG_DOC_ASYNC_CONTENT_ATTRIBUTE).\n '[attr.data-ng-doc-async-content]': 'headerContentSource() ? \"\" : null',\n },\n})\nexport class NgDocPageHeaderComponent {\n /** The rendered header HTML, used when there is no content source. */\n readonly headerContent = input.required<string>();\n\n /** The source of the header content, for pages whose content loads asynchronously. */\n readonly headerContentSource = input<NgDocContentSource>();\n\n protected readonly contentController = inject(NgDocContentController);\n\n private readonly host: HTMLElement = inject(ElementRef).nativeElement;\n private readonly browser = isPlatformBrowser(inject(PLATFORM_ID));\n /** Removes the server-rendered copy shown while asynchronous content loads. */\n private snapshot?: () => void;\n\n constructor() {\n // Connects the controller to the current source, before the template renders its content.\n effect(() => {\n const source = this.headerContentSource();\n\n untracked(() => {\n if (source) {\n // Angular empties this host (it skips hydration) and the header loads asynchronously,\n // so the server-rendered header stays visible until the loaded one renders. The copy\n // is shown once, for the host's first source.\n if (this.browser && !this.snapshot)\n this.snapshot = ɵrestoreNgDocHydrationSnapshot(this.host);\n this.contentController.connect(source);\n } else {\n this.releaseSnapshot();\n this.contentController.disconnect();\n }\n });\n });\n // A load that needs no new pass (its header is already rendered) or that failed settles\n // without `revealLoaded`.\n effect(() => {\n if (this.contentController.settled()) untracked(() => this.releaseSnapshot());\n });\n effect(() => {\n if (this.contentController.error()) untracked(() => this.releaseSnapshot());\n });\n inject(DestroyRef).onDestroy(() => this.releaseSnapshot());\n }\n\n /**\n * Shows the loaded header in place of the server-rendered copy when a pass of it is about to\n * render, in the same task. The pass of the empty header before the source has loaded keeps\n * the copy.\n * @param version - The content version of the pass.\n * @internal\n */\n protected revealLoaded(version: number): void {\n if (version === this.contentController.loadedVersion()) this.releaseSnapshot();\n }\n\n private releaseSnapshot(): void {\n const release = this.snapshot;\n\n this.snapshot = undefined;\n release?.();\n }\n}\n","@if (headerContentSource()) {\n @if (contentController.error(); as error) {\n <header class=\"ng-doc-page-header ngde\" role=\"alert\">{{ error.message }}</header>\n } @else {\n <header\n class=\"ng-doc-page-header ngde\"\n [ngDocPageProcessor]=\"contentController.html() | ngDocSanitizeHtml\"\n [contentVersion]=\"contentController.version()\"\n (beforeRender)=\"revealLoaded($event)\"\n (contentProcessed)=\"contentController.processed($event)\"\n (processingError)=\"contentController.processingFailed($event)\"></header>\n }\n} @else {\n <header\n class=\"ng-doc-page-header ngde\"\n [ngDocPageProcessor]=\"headerContent() | ngDocSanitizeHtml\"></header>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["ɵrestoreNgDocHydrationSnapshot"],"mappings":"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"}
|
|
@@ -1,49 +1,141 @@
|
|
|
1
|
-
import { NgTemplateOutlet } from '@angular/common';
|
|
1
|
+
import { LocationStrategy, NgTemplateOutlet } from '@angular/common';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { inject, ElementRef,
|
|
4
|
-
import { RouterLink } from '@angular/router';
|
|
5
|
-
import {
|
|
3
|
+
import { input, signal, inject, ElementRef, computed, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
|
+
import { Router, RouterLink } from '@angular/router';
|
|
5
|
+
import { ɵngDocRouteUrl as _ngDocRouteUrl } from '@ng-doc/app/helpers';
|
|
6
6
|
import { NgDocIconComponent } from '@ng-doc/ui-kit';
|
|
7
7
|
import { WA_LOCATION } from '@ng-web-apis/common';
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* A link in the page content. Links inside the application navigate with the router; other links
|
|
11
|
+
* open in a new tab and, outside code, show an external-link icon.
|
|
12
|
+
*/
|
|
9
13
|
class NgDocPageLinkComponent {
|
|
10
14
|
constructor() {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
15
|
+
/**
|
|
16
|
+
* The link target, as written in the content. It is optional so that a render before the
|
|
17
|
+
* page processor sets it (auto-detected change detection) does not fail.
|
|
18
|
+
*/
|
|
19
|
+
this.href = input('', /* @ts-ignore */
|
|
20
|
+
...(ngDevMode ? [{ debugName: "href" }] : /* istanbul ignore next */ []));
|
|
21
|
+
/** Classes of the link element. */
|
|
22
|
+
this.classes = input('', /* @ts-ignore */
|
|
23
|
+
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
24
|
+
/** Whether the link sits inside a code element. */
|
|
25
|
+
this.isInCode = signal(false, /* @ts-ignore */
|
|
26
|
+
...(ngDevMode ? [{ debugName: "isInCode" }] : /* istanbul ignore next */ []));
|
|
14
27
|
this.location = inject(WA_LOCATION);
|
|
28
|
+
this.locationStrategy = inject(LocationStrategy);
|
|
29
|
+
this.router = inject(Router);
|
|
15
30
|
this.elementRef = inject(ElementRef);
|
|
31
|
+
this.resolved = computed(() => {
|
|
32
|
+
const href = this.href();
|
|
33
|
+
const resolvesFromCurrentPage = href.startsWith('#') || href.startsWith('?');
|
|
34
|
+
const absoluteUrl = isAbsoluteUrl(href);
|
|
35
|
+
// `#section` and `?query` resolve against the route, which with hash location is not the
|
|
36
|
+
// document's path.
|
|
37
|
+
const link = new URL(href, resolvesFromCurrentPage
|
|
38
|
+
? _ngDocRouteUrl(this.locationStrategy, this.location.href)
|
|
39
|
+
: this.location.origin);
|
|
40
|
+
const routerBasePath = normalizeRouterBasePath(this.locationStrategy.getBaseHref(), this.location.origin);
|
|
41
|
+
const usesRouterLink = link.origin === this.location.origin &&
|
|
42
|
+
(!absoluteUrl || isPathWithinBase(link.pathname, routerBasePath));
|
|
43
|
+
return {
|
|
44
|
+
link,
|
|
45
|
+
usesRouterLink,
|
|
46
|
+
stripsRouterBase: usesRouterLink && (resolvesFromCurrentPage || absoluteUrl),
|
|
47
|
+
routerBasePath,
|
|
48
|
+
};
|
|
49
|
+
}, /* @ts-ignore */
|
|
50
|
+
...(ngDevMode ? [{ debugName: "resolved" }] : /* istanbul ignore next */ []));
|
|
51
|
+
/** Whether the link navigates with the router. */
|
|
52
|
+
this.usesRouterLink = computed(() => this.resolved().usesRouterLink, /* @ts-ignore */
|
|
53
|
+
...(ngDevMode ? [{ debugName: "usesRouterLink" }] : /* istanbul ignore next */ []));
|
|
54
|
+
/** The router target of an application link. */
|
|
55
|
+
this.routerLink = computed(() => {
|
|
56
|
+
const { link, usesRouterLink } = this.resolved();
|
|
57
|
+
return usesRouterLink
|
|
58
|
+
? this.router.parseUrl(escapeInvalidPercents(`${this.path()}${link.search}${link.hash}`))
|
|
59
|
+
: undefined;
|
|
60
|
+
}, /* @ts-ignore */
|
|
61
|
+
...(ngDevMode ? [{ debugName: "routerLink" }] : /* istanbul ignore next */ []));
|
|
62
|
+
/** Whether the link leaves the application's origin. */
|
|
63
|
+
this.isExternalLink = computed(() => this.resolved().link.origin !== this.location.origin, /* @ts-ignore */
|
|
64
|
+
...(ngDevMode ? [{ debugName: "isExternalLink" }] : /* istanbul ignore next */ []));
|
|
65
|
+
/** The path of an application link, or the `href` of any other link. */
|
|
66
|
+
this.path = computed(() => {
|
|
67
|
+
const { link, usesRouterLink, stripsRouterBase, routerBasePath } = this.resolved();
|
|
68
|
+
if (!usesRouterLink) {
|
|
69
|
+
return this.href();
|
|
70
|
+
}
|
|
71
|
+
return stripsRouterBase ? stripRouterBase(link.pathname, routerBasePath) : link.pathname;
|
|
72
|
+
}, /* @ts-ignore */
|
|
73
|
+
...(ngDevMode ? [{ debugName: "path" }] : /* istanbul ignore next */ []));
|
|
74
|
+
/** The fragment of the link, without `#`. */
|
|
75
|
+
this.fragment = computed(() => this.resolved().link.hash.replace(/^#/, '') || undefined, /* @ts-ignore */
|
|
76
|
+
...(ngDevMode ? [{ debugName: "fragment" }] : /* istanbul ignore next */ []));
|
|
77
|
+
/** The query parameters of the link. */
|
|
78
|
+
this.queryParams = computed(() => Object.fromEntries(this.resolved().link.searchParams.entries()), /* @ts-ignore */
|
|
79
|
+
...(ngDevMode ? [{ debugName: "queryParams" }] : /* istanbul ignore next */ []));
|
|
16
80
|
}
|
|
17
81
|
ngOnInit() {
|
|
18
|
-
this.isInCode
|
|
19
|
-
}
|
|
20
|
-
ngOnChanges() {
|
|
21
|
-
this.link = new URL(this.href, this.location.origin);
|
|
82
|
+
this.isInCode.set(this.elementRef.nativeElement.closest('code') !== null);
|
|
22
83
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
84
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocPageLinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
85
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: NgDocPageLinkComponent, isStandalone: true, selector: "ng-doc-page-link", inputs: { href: { classPropertyName: "href", publicName: "href", isSignal: true, isRequired: false, transformFunction: null }, classes: { classPropertyName: "classes", publicName: "classes", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (usesRouterLink()) {\n <a [class]=\"classes()\" [routerLink]=\"routerLink()\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </a>\n} @else {\n <a [class]=\"classes()\" [href]=\"path()\" [attr.target]=\"isExternalLink() ? '_blank' : null\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n @if (isExternalLink() && !isInCode()) {\n <ng-doc-icon icon=\"external-link\"></ng-doc-icon>\n }\n </a>\n}\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n", styles: [":host ng-doc-icon{margin-left:calc(var(--ng-doc-base-gutter) / 2);--ng-doc-icon-color: currentColor}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgDocIconComponent, selector: "ng-doc-icon", inputs: ["icon", "customIcon", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
86
|
+
}
|
|
87
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocPageLinkComponent, decorators: [{
|
|
88
|
+
type: Component,
|
|
89
|
+
args: [{ selector: 'ng-doc-page-link', changeDetection: ChangeDetectionStrategy.OnPush, imports: [RouterLink, NgTemplateOutlet, NgDocIconComponent], template: "@if (usesRouterLink()) {\n <a [class]=\"classes()\" [routerLink]=\"routerLink()\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </a>\n} @else {\n <a [class]=\"classes()\" [href]=\"path()\" [attr.target]=\"isExternalLink() ? '_blank' : null\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n @if (isExternalLink() && !isInCode()) {\n <ng-doc-icon icon=\"external-link\"></ng-doc-icon>\n }\n </a>\n}\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n", styles: [":host ng-doc-icon{margin-left:calc(var(--ng-doc-base-gutter) / 2);--ng-doc-icon-color: currentColor}\n"] }]
|
|
90
|
+
}], propDecorators: { href: [{ type: i0.Input, args: [{ isSignal: true, alias: "href", required: false }] }], classes: [{ type: i0.Input, args: [{ isSignal: true, alias: "classes", required: false }] }] } });
|
|
91
|
+
/**
|
|
92
|
+
*
|
|
93
|
+
* @param href
|
|
94
|
+
*/
|
|
95
|
+
function isAbsoluteUrl(href) {
|
|
96
|
+
return /^[a-z][a-z\d+.-]*:/i.test(href) || href.startsWith('//');
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
*
|
|
100
|
+
* @param baseHref
|
|
101
|
+
* @param origin
|
|
102
|
+
*/
|
|
103
|
+
function normalizeRouterBasePath(baseHref, origin) {
|
|
104
|
+
const pathname = new URL(baseHref || '/', origin).pathname;
|
|
105
|
+
if (pathname === '/') {
|
|
106
|
+
return pathname;
|
|
28
107
|
}
|
|
29
|
-
|
|
30
|
-
|
|
108
|
+
return `/${pathname.replace(/^\/+|\/+$/g, '')}/`;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
*
|
|
112
|
+
* @param pathname
|
|
113
|
+
* @param basePath
|
|
114
|
+
*/
|
|
115
|
+
function isPathWithinBase(pathname, basePath) {
|
|
116
|
+
return basePath === '/' || pathname === basePath.slice(0, -1) || pathname.startsWith(basePath);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
*
|
|
120
|
+
* @param pathname
|
|
121
|
+
* @param basePath
|
|
122
|
+
*/
|
|
123
|
+
function stripRouterBase(pathname, basePath) {
|
|
124
|
+
if (basePath === '/' || !isPathWithinBase(pathname, basePath)) {
|
|
125
|
+
return pathname;
|
|
31
126
|
}
|
|
32
|
-
|
|
33
|
-
return
|
|
127
|
+
if (pathname === basePath.slice(0, -1)) {
|
|
128
|
+
return '/';
|
|
34
129
|
}
|
|
35
|
-
|
|
36
|
-
|
|
130
|
+
return `/${pathname.slice(basePath.length)}`;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
*
|
|
134
|
+
* @param url
|
|
135
|
+
*/
|
|
136
|
+
function escapeInvalidPercents(url) {
|
|
137
|
+
return url.replace(/%(?![\da-f]{2})/gi, '%25');
|
|
37
138
|
}
|
|
38
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: NgDocPageLinkComponent, decorators: [{
|
|
39
|
-
type: Component,
|
|
40
|
-
args: [{ selector: 'ng-doc-page-link', changeDetection: ChangeDetectionStrategy.OnPush, imports: [RouterLink, NgTemplateOutlet, NgDocIconComponent, NgDocDecodeUriComponentPipe], template: "@if (!isExternalLink) {\n <a\n [class]=\"classes\"\n [routerLink]=\"path\"\n [fragment]=\"fragment ? (fragment | decodeUriComponent) : undefined\"\n [queryParams]=\"queryParams\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </a>\n}\n\n@if (isExternalLink) {\n <a [class]=\"classes\" [href]=\"path\" target=\"_blank\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n @if (!isInCode) {\n <ng-doc-icon icon=\"external-link\"></ng-doc-icon>\n }\n </a>\n}\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n", styles: [":host{white-space:nowrap}:host ng-doc-icon{margin-left:calc(var(--ng-doc-base-gutter) / 2);--ng-doc-icon-color: currentColor}\n"] }]
|
|
41
|
-
}], propDecorators: { href: [{
|
|
42
|
-
type: Input,
|
|
43
|
-
args: [{ required: true }]
|
|
44
|
-
}], classes: [{
|
|
45
|
-
type: Input
|
|
46
|
-
}] } });
|
|
47
139
|
|
|
48
140
|
/**
|
|
49
141
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-doc-app-components-page-link.mjs","sources":["../../../../libs/app/components/page-link/page-link.component.ts","../../../../libs/app/components/page-link/page-link.component.html","../../../../libs/app/components/page-link/ng-doc-app-components-page-link.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n inject,\n Input,\n OnChanges,\n OnInit,\n} from '@angular/core';\nimport { Params, RouterLink } from '@angular/router';\nimport { NgDocDecodeUriComponentPipe } from '@ng-doc/app/pipes';\nimport { NgDocIconComponent } from '@ng-doc/ui-kit';\nimport { WA_LOCATION } from '@ng-web-apis/common';\n\n@Component({\n selector: 'ng-doc-page-link',\n templateUrl: './page-link.component.html',\n styleUrls: ['./page-link.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterLink, NgTemplateOutlet, NgDocIconComponent, NgDocDecodeUriComponentPipe],\n})\nexport class NgDocPageLinkComponent implements OnInit, OnChanges {\n @Input({ required: true })\n href: string = '';\n\n @Input()\n classes: string = '';\n\n protected isInCode: boolean = false;\n\n private link: URL | undefined;\n\n private readonly location = inject(WA_LOCATION);\n private readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n\n ngOnInit(): void {\n this.isInCode = this.elementRef.nativeElement.closest('code') !== null;\n }\n\n ngOnChanges(): void {\n this.link = new URL(this.href, this.location.origin);\n }\n\n get isExternalLink(): boolean {\n return this.link?.origin !== this.location.origin;\n }\n\n get path(): string {\n return (!this.isExternalLink ? this.link?.pathname : this.href) ?? '';\n }\n\n get fragment(): string | undefined {\n return this.link?.hash.replace(/^#/, '') || undefined;\n }\n\n get queryParams(): Params {\n return Object.fromEntries(this.link?.searchParams.entries() ?? []);\n }\n}\n","@if (!isExternalLink) {\n <a\n [class]=\"classes\"\n [routerLink]=\"path\"\n [fragment]=\"fragment ? (fragment | decodeUriComponent) : undefined\"\n [queryParams]=\"queryParams\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </a>\n}\n\n@if (isExternalLink) {\n <a [class]=\"classes\" [href]=\"path\" target=\"_blank\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n @if (!isInCode) {\n <ng-doc-icon icon=\"external-link\"></ng-doc-icon>\n }\n </a>\n}\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;MAsBa,sBAAsB,CAAA;AAPnC,IAAA,WAAA,GAAA;QASE,IAAA,CAAA,IAAI,GAAW,EAAE;QAGjB,IAAA,CAAA,OAAO,GAAW,EAAE;QAEV,IAAA,CAAA,QAAQ,GAAY,KAAK;AAIlB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC;AAC9B,QAAA,IAAA,CAAA,UAAU,GAA4B,MAAM,CAAC,UAAU,CAAC;AAyB1E,IAAA;IAvBC,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI;IACxE;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IACtD;AAEA,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO,IAAI,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM;IACnD;AAEA,IAAA,IAAI,IAAI,GAAA;QACN,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,EAAE;IACvE;AAEA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,SAAS;IACvD;AAEA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;IACpE;8GApCW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtBnC,klBAsBA,EAAA,MAAA,EAAA,CAAA,iIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDFY,UAAU,kPAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,2BAA2B,EAAA,IAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAE5E,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAAA,eAAA,EAGX,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,2BAA2B,CAAC,EAAA,QAAA,EAAA,klBAAA,EAAA,MAAA,EAAA,CAAA,iIAAA,CAAA,EAAA;;sBAGvF,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBAGxB;;;AE1BH;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"ng-doc-app-components-page-link.mjs","sources":["../../../../libs/app/components/page-link/page-link.component.ts","../../../../libs/app/components/page-link/page-link.component.html","../../../../libs/app/components/page-link/ng-doc-app-components-page-link.ts"],"sourcesContent":["import { LocationStrategy, NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n OnInit,\n signal,\n} from '@angular/core';\nimport { Params, Router, RouterLink, UrlTree } from '@angular/router';\nimport { ɵngDocRouteUrl } from '@ng-doc/app/helpers';\nimport { NgDocIconComponent } from '@ng-doc/ui-kit';\nimport { WA_LOCATION } from '@ng-web-apis/common';\n\n/** How a page link resolves its `href`. */\ninterface NgDocResolvedPageLink {\n link: URL;\n usesRouterLink: boolean;\n stripsRouterBase: boolean;\n routerBasePath: string;\n}\n\n/**\n * A link in the page content. Links inside the application navigate with the router; other links\n * open in a new tab and, outside code, show an external-link icon.\n */\n@Component({\n selector: 'ng-doc-page-link',\n templateUrl: './page-link.component.html',\n styleUrls: ['./page-link.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterLink, NgTemplateOutlet, NgDocIconComponent],\n})\nexport class NgDocPageLinkComponent implements OnInit {\n /**\n * The link target, as written in the content. It is optional so that a render before the\n * page processor sets it (auto-detected change detection) does not fail.\n */\n readonly href = input<string>('');\n\n /** Classes of the link element. */\n readonly classes = input<string>('');\n\n /** Whether the link sits inside a code element. */\n protected readonly isInCode = signal(false);\n\n private readonly location = inject(WA_LOCATION);\n private readonly locationStrategy = inject(LocationStrategy);\n private readonly router = inject(Router);\n private readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n\n private readonly resolved = computed<NgDocResolvedPageLink>(() => {\n const href: string = this.href();\n const resolvesFromCurrentPage = href.startsWith('#') || href.startsWith('?');\n const absoluteUrl = isAbsoluteUrl(href);\n // `#section` and `?query` resolve against the route, which with hash location is not the\n // document's path.\n const link = new URL(\n href,\n resolvesFromCurrentPage\n ? ɵngDocRouteUrl(this.locationStrategy, this.location.href)\n : this.location.origin,\n );\n const routerBasePath = normalizeRouterBasePath(\n this.locationStrategy.getBaseHref(),\n this.location.origin,\n );\n const usesRouterLink =\n link.origin === this.location.origin &&\n (!absoluteUrl || isPathWithinBase(link.pathname, routerBasePath));\n\n return {\n link,\n usesRouterLink,\n stripsRouterBase: usesRouterLink && (resolvesFromCurrentPage || absoluteUrl),\n routerBasePath,\n };\n });\n\n /** Whether the link navigates with the router. */\n protected readonly usesRouterLink = computed(() => this.resolved().usesRouterLink);\n\n /** The router target of an application link. */\n protected readonly routerLink = computed<UrlTree | undefined>(() => {\n const { link, usesRouterLink } = this.resolved();\n\n return usesRouterLink\n ? this.router.parseUrl(escapeInvalidPercents(`${this.path()}${link.search}${link.hash}`))\n : undefined;\n });\n\n /** Whether the link leaves the application's origin. */\n readonly isExternalLink = computed(() => this.resolved().link.origin !== this.location.origin);\n\n /** The path of an application link, or the `href` of any other link. */\n readonly path = computed(() => {\n const { link, usesRouterLink, stripsRouterBase, routerBasePath } = this.resolved();\n\n if (!usesRouterLink) {\n return this.href();\n }\n\n return stripsRouterBase ? stripRouterBase(link.pathname, routerBasePath) : link.pathname;\n });\n\n /** The fragment of the link, without `#`. */\n readonly fragment = computed(() => this.resolved().link.hash.replace(/^#/, '') || undefined);\n\n /** The query parameters of the link. */\n readonly queryParams = computed<Params>(() =>\n Object.fromEntries(this.resolved().link.searchParams.entries()),\n );\n\n ngOnInit(): void {\n this.isInCode.set(this.elementRef.nativeElement.closest('code') !== null);\n }\n}\n\n/**\n *\n * @param href\n */\nfunction isAbsoluteUrl(href: string): boolean {\n return /^[a-z][a-z\\d+.-]*:/i.test(href) || href.startsWith('//');\n}\n\n/**\n *\n * @param baseHref\n * @param origin\n */\nfunction normalizeRouterBasePath(baseHref: string, origin: string): string {\n const pathname = new URL(baseHref || '/', origin).pathname;\n\n if (pathname === '/') {\n return pathname;\n }\n\n return `/${pathname.replace(/^\\/+|\\/+$/g, '')}/`;\n}\n\n/**\n *\n * @param pathname\n * @param basePath\n */\nfunction isPathWithinBase(pathname: string, basePath: string): boolean {\n return basePath === '/' || pathname === basePath.slice(0, -1) || pathname.startsWith(basePath);\n}\n\n/**\n *\n * @param pathname\n * @param basePath\n */\nfunction stripRouterBase(pathname: string, basePath: string): string {\n if (basePath === '/' || !isPathWithinBase(pathname, basePath)) {\n return pathname;\n }\n\n if (pathname === basePath.slice(0, -1)) {\n return '/';\n }\n\n return `/${pathname.slice(basePath.length)}`;\n}\n\n/**\n *\n * @param url\n */\nfunction escapeInvalidPercents(url: string): string {\n return url.replace(/%(?![\\da-f]{2})/gi, '%25');\n}\n","@if (usesRouterLink()) {\n <a [class]=\"classes()\" [routerLink]=\"routerLink()\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </a>\n} @else {\n <a [class]=\"classes()\" [href]=\"path()\" [attr.target]=\"isExternalLink() ? '_blank' : null\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n @if (isExternalLink() && !isInCode()) {\n <ng-doc-icon icon=\"external-link\"></ng-doc-icon>\n }\n </a>\n}\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["ɵngDocRouteUrl"],"mappings":"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"}
|
|
@@ -1,28 +1,26 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { input, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import { RouterLink } from '@angular/router';
|
|
4
|
-
import { NgDocIconComponent, NgDocTextComponent, NgDocTextLeftDirective, NgDocTextRightDirective } from '@ng-doc/ui-kit';
|
|
5
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Links to the previous and the next page, as two cards at the bottom of a guide.
|
|
7
|
+
*/
|
|
6
8
|
class NgDocPageNavigationComponent {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
constructor() {
|
|
10
|
+
/** The page before this one in the sidebar. */
|
|
11
|
+
this.prevPage = input(/* @ts-ignore */
|
|
12
|
+
...(ngDevMode ? [undefined, { debugName: "prevPage" }] : /* istanbul ignore next */ []));
|
|
13
|
+
/** The page after this one in the sidebar. */
|
|
14
|
+
this.nextPage = input(/* @ts-ignore */
|
|
15
|
+
...(ngDevMode ? [undefined, { debugName: "nextPage" }] : /* istanbul ignore next */ []));
|
|
16
|
+
}
|
|
17
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocPageNavigationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
18
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: NgDocPageNavigationComponent, isStandalone: true, selector: "ng-doc-page-navigation", inputs: { prevPage: { classPropertyName: "prevPage", publicName: "prevPage", isSignal: true, isRequired: false, transformFunction: null }, nextPage: { classPropertyName: "nextPage", publicName: "nextPage", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (prevPage() || nextPage()) {\n <nav class=\"ng-doc-navigation-controls\" aria-label=\"Previous and next page\">\n @if (prevPage(); as page) {\n <a class=\"ng-doc-prev-page\" [routerLink]=\"page.route\">\n <span class=\"ng-doc-navigation-page-label\">\n <svg\n width=\"14\"\n height=\"14\"\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=\"M19 12H5m6-6-6 6 6 6\" />\n </svg>\n Previous\n </span>\n <span class=\"ng-doc-navigation-page-title\">{{ page.title }}</span>\n </a>\n }\n @if (nextPage(); as page) {\n <a class=\"ng-doc-next-page\" [routerLink]=\"page.route\">\n <span class=\"ng-doc-navigation-page-label\">\n Next\n <svg\n width=\"14\"\n height=\"14\"\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=\"M5 12h14m-6-6 6 6-6 6\" />\n </svg>\n </span>\n <span class=\"ng-doc-navigation-page-title\">{{ page.title }}</span>\n </a>\n }\n </nav>\n}\n", styles: [".ng-doc-navigation-controls{display:grid;grid-template-columns:1fr 1fr;gap:var(--ng-doc-space-4);margin-top:var(--ng-doc-space-16);font-family:var(--ng-doc-font-family)}.ng-doc-navigation-controls a{display:grid;gap:2px;padding:var(--ng-doc-space-4) var(--ng-doc-space-5);border:1px solid var(--ng-doc-border-color);border-radius:var(--ng-doc-radius-lg);text-decoration:none;transition:border-color var(--ng-doc-transition)}.ng-doc-navigation-controls a:hover{border-color:var(--ng-doc-primary)}.ng-doc-navigation-controls a:focus-visible{outline:none;box-shadow:var(--ng-doc-focus-ring)}.ng-doc-navigation-controls .ng-doc-next-page{grid-column:2;text-align:right}.ng-doc-navigation-controls .ng-doc-next-page .ng-doc-navigation-page-label{justify-content:flex-end}.ng-doc-navigation-page-label{display:flex;align-items:center;gap:6px;color:var(--ng-doc-text-muted);font-size:13px;line-height:18px}.ng-doc-navigation-page-title{color:var(--ng-doc-link-color);font-size:var(--ng-doc-font-size);line-height:24px;font-weight:600;overflow-wrap:anywhere}@media(max-width:640px){.ng-doc-navigation-controls{grid-template-columns:1fr}.ng-doc-navigation-controls .ng-doc-next-page{grid-column:auto}}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
9
19
|
}
|
|
10
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
20
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocPageNavigationComponent, decorators: [{
|
|
11
21
|
type: Component,
|
|
12
|
-
args: [{ selector: 'ng-doc-page-navigation', imports: [
|
|
13
|
-
|
|
14
|
-
NgDocTextComponent,
|
|
15
|
-
NgDocTextLeftDirective,
|
|
16
|
-
NgDocTextRightDirective,
|
|
17
|
-
RouterLink,
|
|
18
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ng-doc-navigation-controls\">\n @if (prevPage) {\n <a class=\"ng-doc-prev-page\" [routerLink]=\"prevPage.route\">\n <div class=\"ng-doc-navigation-page-label\" ng-doc-text size=\"small\">\n <ng-doc-icon icon=\"arrow-left\" ngDocTextLeft></ng-doc-icon>\n Previous\n </div>\n <div class=\"ng-doc-navigation-page-title\" ng-doc-text>{{ prevPage.title }}</div>\n </a>\n }\n @if (nextPage) {\n <a class=\"ng-doc-next-page\" [routerLink]=\"nextPage.route\">\n <div class=\"ng-doc-navigation-page-label\" ng-doc-text size=\"small\">\n Next\n <ng-doc-icon icon=\"arrow-right\" ngDocTextRight></ng-doc-icon>\n </div>\n <div class=\"ng-doc-navigation-page-title\" ng-doc-text>{{ nextPage.title }}</div>\n </a>\n }\n</div>\n", styles: [":host .ng-doc-navigation-controls{display:flex;margin-top:calc(var(--ng-doc-base-gutter) * 12);border-top:1px solid var(--ng-doc-base-2);padding-top:calc(var(--ng-doc-base-gutter) * 2)}:host .ng-doc-navigation-controls a{display:flex;flex-direction:column;text-decoration:unset;transition:var(--ng-doc-transition);--ng-doc-button-hover-background: var(--ng-doc-base-1);--ng-doc-button-active-background: var(--ng-doc-base-2);--ng-doc-text: var(--ng-doc-base-9);--ng-doc-icon-color: var(--ng-doc-text)}:host .ng-doc-navigation-controls a:hover{opacity:.6}:host .ng-doc-navigation-controls a.ng-doc-next-page{margin-left:auto}:host .ng-doc-navigation-controls a.ng-doc-prev-page{align-items:flex-start}:host .ng-doc-navigation-controls a.ng-doc-next-page{align-items:flex-end}:host .ng-doc-navigation-controls a .ng-doc-navigation-page-title{--ng-doc-text: var(--ng-doc-link-color)}\n"] }]
|
|
19
|
-
}], propDecorators: { prevPage: [{
|
|
20
|
-
type: Input,
|
|
21
|
-
args: [{ required: true }]
|
|
22
|
-
}], nextPage: [{
|
|
23
|
-
type: Input,
|
|
24
|
-
args: [{ required: true }]
|
|
25
|
-
}] } });
|
|
22
|
+
args: [{ selector: 'ng-doc-page-navigation', imports: [RouterLink], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (prevPage() || nextPage()) {\n <nav class=\"ng-doc-navigation-controls\" aria-label=\"Previous and next page\">\n @if (prevPage(); as page) {\n <a class=\"ng-doc-prev-page\" [routerLink]=\"page.route\">\n <span class=\"ng-doc-navigation-page-label\">\n <svg\n width=\"14\"\n height=\"14\"\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=\"M19 12H5m6-6-6 6 6 6\" />\n </svg>\n Previous\n </span>\n <span class=\"ng-doc-navigation-page-title\">{{ page.title }}</span>\n </a>\n }\n @if (nextPage(); as page) {\n <a class=\"ng-doc-next-page\" [routerLink]=\"page.route\">\n <span class=\"ng-doc-navigation-page-label\">\n Next\n <svg\n width=\"14\"\n height=\"14\"\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=\"M5 12h14m-6-6 6 6-6 6\" />\n </svg>\n </span>\n <span class=\"ng-doc-navigation-page-title\">{{ page.title }}</span>\n </a>\n }\n </nav>\n}\n", styles: [".ng-doc-navigation-controls{display:grid;grid-template-columns:1fr 1fr;gap:var(--ng-doc-space-4);margin-top:var(--ng-doc-space-16);font-family:var(--ng-doc-font-family)}.ng-doc-navigation-controls a{display:grid;gap:2px;padding:var(--ng-doc-space-4) var(--ng-doc-space-5);border:1px solid var(--ng-doc-border-color);border-radius:var(--ng-doc-radius-lg);text-decoration:none;transition:border-color var(--ng-doc-transition)}.ng-doc-navigation-controls a:hover{border-color:var(--ng-doc-primary)}.ng-doc-navigation-controls a:focus-visible{outline:none;box-shadow:var(--ng-doc-focus-ring)}.ng-doc-navigation-controls .ng-doc-next-page{grid-column:2;text-align:right}.ng-doc-navigation-controls .ng-doc-next-page .ng-doc-navigation-page-label{justify-content:flex-end}.ng-doc-navigation-page-label{display:flex;align-items:center;gap:6px;color:var(--ng-doc-text-muted);font-size:13px;line-height:18px}.ng-doc-navigation-page-title{color:var(--ng-doc-link-color);font-size:var(--ng-doc-font-size);line-height:24px;font-weight:600;overflow-wrap:anywhere}@media(max-width:640px){.ng-doc-navigation-controls{grid-template-columns:1fr}.ng-doc-navigation-controls .ng-doc-next-page{grid-column:auto}}\n"] }]
|
|
23
|
+
}], propDecorators: { prevPage: [{ type: i0.Input, args: [{ isSignal: true, alias: "prevPage", required: false }] }], nextPage: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextPage", required: false }] }] } });
|
|
26
24
|
|
|
27
25
|
/**
|
|
28
26
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-doc-app-components-page-navigation.mjs","sources":["../../../../libs/app/components/page-navigation/page-navigation.component.ts","../../../../libs/app/components/page-navigation/page-navigation.component.html","../../../../libs/app/components/page-navigation/ng-doc-app-components-page-navigation.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component,
|
|
1
|
+
{"version":3,"file":"ng-doc-app-components-page-navigation.mjs","sources":["../../../../libs/app/components/page-navigation/page-navigation.component.ts","../../../../libs/app/components/page-navigation/page-navigation.component.html","../../../../libs/app/components/page-navigation/ng-doc-app-components-page-navigation.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { NgDocNavigation, NgDocPageNavigation } from '@ng-doc/app/interfaces';\n\n/**\n * Links to the previous and the next page, as two cards at the bottom of a guide.\n */\n@Component({\n selector: 'ng-doc-page-navigation',\n imports: [RouterLink],\n templateUrl: './page-navigation.component.html',\n styleUrls: ['./page-navigation.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgDocPageNavigationComponent implements NgDocPageNavigation {\n /** The page before this one in the sidebar. */\n readonly prevPage = input<NgDocNavigation>();\n\n /** The page after this one in the sidebar. */\n readonly nextPage = input<NgDocNavigation>();\n}\n","@if (prevPage() || nextPage()) {\n <nav class=\"ng-doc-navigation-controls\" aria-label=\"Previous and next page\">\n @if (prevPage(); as page) {\n <a class=\"ng-doc-prev-page\" [routerLink]=\"page.route\">\n <span class=\"ng-doc-navigation-page-label\">\n <svg\n width=\"14\"\n height=\"14\"\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=\"M19 12H5m6-6-6 6 6 6\" />\n </svg>\n Previous\n </span>\n <span class=\"ng-doc-navigation-page-title\">{{ page.title }}</span>\n </a>\n }\n @if (nextPage(); as page) {\n <a class=\"ng-doc-next-page\" [routerLink]=\"page.route\">\n <span class=\"ng-doc-navigation-page-label\">\n Next\n <svg\n width=\"14\"\n height=\"14\"\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=\"M5 12h14m-6-6 6 6-6 6\" />\n </svg>\n </span>\n <span class=\"ng-doc-navigation-page-title\">{{ page.title }}</span>\n </a>\n }\n </nav>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAIA;;AAEG;MAQU,4BAA4B,CAAA;AAPzC,IAAA,WAAA,GAAA;;AASW,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK;gGAAmB;;AAGnC,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK;gGAAmB;AAC7C,IAAA;8GANY,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECdzC,w7CA4CA,EAAA,MAAA,EAAA,CAAA,4qCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDnCY,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAKT,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAPxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,WACzB,CAAC,UAAU,CAAC,EAAA,eAAA,EAGJ,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,w7CAAA,EAAA,MAAA,EAAA,CAAA,4qCAAA,CAAA,EAAA;;;AEZjD;;AAEG;;;;"}
|
|
@@ -1,38 +1,77 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { input, booleanAttribute, viewChild, ViewContainerRef, inject, Injector, afterNextRender, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import { Router, ActivatedRoute, RouterOutlet, RouterLink, RouterLinkActive } from '@angular/router';
|
|
4
4
|
import { NgDocPageHeaderComponent } from '@ng-doc/app/components/page-header';
|
|
5
5
|
import { createComponent } from '@ng-doc/app/helpers';
|
|
6
|
+
import { NgDocFullscreenRouteService } from '@ng-doc/app/services/fullscreen-route';
|
|
7
|
+
import { NgDocRoutePreloader } from '@ng-doc/app/services/route-preloader';
|
|
6
8
|
import { NG_DOC_PAGE_SKELETON, NG_DOC_CONTEXT } from '@ng-doc/app/tokens';
|
|
7
9
|
import { isPresent } from '@ng-doc/core/helpers/is-present';
|
|
8
10
|
import { NgDocTabRouteComponent, NgDocTabRoutesGroupComponent, NgDocIconComponent } from '@ng-doc/ui-kit';
|
|
9
11
|
|
|
12
|
+
/**
|
|
13
|
+
* Layout of a generated page: the breadcrumbs, the page header, the tabs of a page with several
|
|
14
|
+
* routes, the page itself, the previous and next page links, and the table of contents beside it.
|
|
15
|
+
*
|
|
16
|
+
* The breadcrumbs, the page links and the table of contents are the page skeleton's components,
|
|
17
|
+
* created in the containers this component exposes.
|
|
18
|
+
*
|
|
19
|
+
* While the page shows one of its fullscreen routes (`NgDocFullscreenRouteService`), only the page
|
|
20
|
+
* is shown.
|
|
21
|
+
*/
|
|
10
22
|
class NgDocPageWrapperComponent {
|
|
11
23
|
constructor() {
|
|
12
|
-
|
|
13
|
-
this.
|
|
24
|
+
/** Routes of the page; a page with more than one gets tabs. */
|
|
25
|
+
this.routes = input.required(/* @ts-ignore */
|
|
26
|
+
...(ngDevMode ? [{ debugName: "routes" }] : /* istanbul ignore next */ []));
|
|
27
|
+
/** HTML of the page header. */
|
|
28
|
+
this.headerContent = input.required(/* @ts-ignore */
|
|
29
|
+
...(ngDevMode ? [{ debugName: "headerContent" }] : /* istanbul ignore next */ []));
|
|
30
|
+
/** Deferred source of the page header, for generated pages that load it separately. */
|
|
31
|
+
this.headerContentSource = input(/* @ts-ignore */
|
|
32
|
+
...(ngDevMode ? [undefined, { debugName: "headerContentSource" }] : /* istanbul ignore next */ []));
|
|
33
|
+
/** Whether the page shows breadcrumbs. */
|
|
34
|
+
this.hasBreadcrumb = input(true, { ...(ngDevMode ? { debugName: "hasBreadcrumb" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
35
|
+
/** Type of the page: guides get previous and next page links, API pages do not. */
|
|
36
|
+
this.pageType = input('guide', /* @ts-ignore */
|
|
37
|
+
...(ngDevMode ? [{ debugName: "pageType" }] : /* istanbul ignore next */ []));
|
|
38
|
+
/** Container of the breadcrumbs. */
|
|
39
|
+
this.pageBreadcrumbs = viewChild.required('pageBreadcrumbs', { ...(ngDevMode ? { debugName: "pageBreadcrumbs" } : /* istanbul ignore next */ {}), read: ViewContainerRef });
|
|
40
|
+
/** Container of the table of contents. */
|
|
41
|
+
this.pageToc = viewChild.required('pageToc', { ...(ngDevMode ? { debugName: "pageToc" } : /* istanbul ignore next */ {}), read: ViewContainerRef });
|
|
42
|
+
/** Container of the previous and next page links. */
|
|
43
|
+
this.pageNavigation = viewChild.required('pageNavigation', { ...(ngDevMode ? { debugName: "pageNavigation" } : /* istanbul ignore next */ {}), read: ViewContainerRef });
|
|
14
44
|
this.skeleton = inject(NG_DOC_PAGE_SKELETON);
|
|
15
45
|
this.router = inject(Router);
|
|
16
46
|
this.route = inject(ActivatedRoute);
|
|
17
47
|
this.context = inject(NG_DOC_CONTEXT);
|
|
48
|
+
this.fullscreenRoute = inject(NgDocFullscreenRouteService);
|
|
18
49
|
this.breadcrumbs = inject(ActivatedRoute)
|
|
19
50
|
.pathFromRoot.filter((route) => !!route.snapshot.url.length)
|
|
20
51
|
.map((route) => route.snapshot.title)
|
|
21
52
|
.filter(isPresent);
|
|
53
|
+
this.preloader = inject(NgDocRoutePreloader);
|
|
54
|
+
this.injector = inject(Injector);
|
|
22
55
|
}
|
|
23
56
|
ngOnInit() {
|
|
24
|
-
if (this.skeleton.breadcrumbs && this.hasBreadcrumb) {
|
|
25
|
-
createComponent(this.pageBreadcrumbs, this.skeleton.breadcrumbs, {
|
|
57
|
+
if (this.skeleton.breadcrumbs && this.hasBreadcrumb()) {
|
|
58
|
+
createComponent(this.pageBreadcrumbs(), this.skeleton.breadcrumbs, {
|
|
26
59
|
breadcrumbs: this.breadcrumbs,
|
|
27
60
|
});
|
|
28
61
|
}
|
|
29
|
-
if (this.pageType === 'guide') {
|
|
30
|
-
|
|
31
|
-
createComponent(this.pageNavigation, this.skeleton.navigation, this.navigationInputs());
|
|
32
|
-
}
|
|
62
|
+
if (this.pageType() === 'guide' && this.skeleton.navigation) {
|
|
63
|
+
createComponent(this.pageNavigation(), this.skeleton.navigation, this.adjacentPages());
|
|
33
64
|
}
|
|
65
|
+
// Readers often go on to the previous or next guide, so both are preloaded once the browser
|
|
66
|
+
// is idle after this one has rendered. Render hooks never run on the server.
|
|
67
|
+
afterNextRender(() => {
|
|
68
|
+
if (this.pageType() !== 'guide')
|
|
69
|
+
return;
|
|
70
|
+
const { prevPage, nextPage } = this.adjacentPages();
|
|
71
|
+
this.preloader.preloadWhenIdle([prevPage?.route, nextPage?.route]);
|
|
72
|
+
}, { injector: this.injector });
|
|
34
73
|
}
|
|
35
|
-
|
|
74
|
+
adjacentPages() {
|
|
36
75
|
const url = '/' +
|
|
37
76
|
this.route.pathFromRoot
|
|
38
77
|
.map((route) => route.snapshot.url)
|
|
@@ -47,10 +86,10 @@ class NgDocPageWrapperComponent {
|
|
|
47
86
|
nextPage: flatPages[flatPages.findIndex((item) => url === item.route) + 1],
|
|
48
87
|
};
|
|
49
88
|
}
|
|
50
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
51
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.
|
|
89
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocPageWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
90
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: NgDocPageWrapperComponent, isStandalone: true, selector: "ng-doc-page-wrapper", inputs: { routes: { classPropertyName: "routes", publicName: "routes", isSignal: true, isRequired: true, transformFunction: null }, headerContent: { classPropertyName: "headerContent", publicName: "headerContent", isSignal: true, isRequired: true, transformFunction: null }, headerContentSource: { classPropertyName: "headerContentSource", publicName: "headerContentSource", isSignal: true, isRequired: false, transformFunction: null }, hasBreadcrumb: { classPropertyName: "hasBreadcrumb", publicName: "hasBreadcrumb", isSignal: true, isRequired: false, transformFunction: null }, pageType: { classPropertyName: "pageType", publicName: "pageType", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-ng-doc-page-tabs": "routes().length > 1", "attr.data-ng-doc-fullscreen-route": "fullscreenRoute.active()" } }, viewQueries: [{ propertyName: "pageBreadcrumbs", first: true, predicate: ["pageBreadcrumbs"], descendants: true, read: ViewContainerRef, isSignal: true }, { propertyName: "pageToc", first: true, predicate: ["pageToc"], descendants: true, read: ViewContainerRef, isSignal: true }, { propertyName: "pageNavigation", first: true, predicate: ["pageNavigation"], descendants: true, read: ViewContainerRef, isSignal: true }], ngImport: i0, template: "<article class=\"ngde\">\n <ng-container #pageBreadcrumbs></ng-container>\n\n <ng-doc-page-header\n [headerContent]=\"headerContent()\"\n [headerContentSource]=\"headerContentSource()\" />\n\n @if (routes().length > 1) {\n <ng-doc-tab-routes-group>\n @for (route of routes(); track route) {\n <a\n ng-doc-tab-route\n [routerLink]=\"['./' + route.path]\"\n routerLinkActive\n [routerLinkActiveOptions]=\"{ exact: true }\"\n #rla=\"routerLinkActive\"\n [isActive]=\"rla.isActive\">\n @if (route.data?.['icon']; as icon) {\n <ng-doc-icon [customIcon]=\"icon\" />\n }\n {{ route.title }}\n </a>\n }\n </ng-doc-tab-routes-group>\n }\n\n <router-outlet></router-outlet>\n\n <ng-container #pageNavigation></ng-container>\n</article>\n\n<ng-container #pageToc></ng-container>\n", styles: [":host{display:flex;justify-content:space-between;--ng-doc-page-sticky-offset: var(--ng-doc-navbar-height)}:host[data-ng-doc-page-tabs=true]{--ng-doc-page-sticky-offset: calc( var(--ng-doc-navbar-height) + var(--ng-doc-page-wrapper-tabs-height) )}:host{--ng-doc-toc-margin: calc(var(--ng-doc-base-gutter) * 5)}:host article{position:relative;width:var(--ng-doc-article-width, 100%);max-width:var(--ng-doc-article-width, var(--ng-doc-content-max-width));margin-left:auto;margin-right:auto;min-width:0}:host article:has(.ng-doc-page-tags),:host article:has(ng-doc-api-list){max-width:var(--ng-doc-article-width, var(--ng-doc-api-content-max-width))}:host header ::ng-deep h1{margin-top:0}:host ng-doc-tab-routes-group{position:sticky!important;top:var(--ng-doc-navbar-height);margin:calc(var(--ng-doc-base-gutter) * 2) 0;background:var(--ng-doc-navbar-background);z-index:5;height:var(--ng-doc-page-wrapper-tabs-height)}:host .ng-doc-page-header{margin-bottom:calc(var(--ng-doc-base-gutter) * 3)}:host[data-ng-doc-fullscreen-route=true]{display:block}:host[data-ng-doc-fullscreen-route=true] article{width:100%;max-width:none}:host[data-ng-doc-fullscreen-route=true] ::ng-deep>:not(article),:host[data-ng-doc-fullscreen-route=true] ::ng-deep article>:not(router-outlet+*){display:none}\n"], dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "component", type: NgDocTabRouteComponent, selector: "a[ng-doc-tab-route]", inputs: ["isActive"] }, { kind: "component", type: NgDocTabRoutesGroupComponent, selector: "ng-doc-tab-routes-group" }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type: NgDocIconComponent, selector: "ng-doc-icon", inputs: ["icon", "customIcon", "size"] }, { kind: "component", type: NgDocPageHeaderComponent, selector: "ng-doc-page-header", inputs: ["headerContent", "headerContentSource"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
52
91
|
}
|
|
53
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
92
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocPageWrapperComponent, decorators: [{
|
|
54
93
|
type: Component,
|
|
55
94
|
args: [{ selector: 'ng-doc-page-wrapper', imports: [
|
|
56
95
|
RouterOutlet,
|
|
@@ -61,28 +100,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
|
|
|
61
100
|
NgDocIconComponent,
|
|
62
101
|
NgDocPageHeaderComponent,
|
|
63
102
|
], changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
64
|
-
'[attr.data-ng-doc-page-tabs]': 'routes.length > 1',
|
|
65
|
-
|
|
66
|
-
}],
|
|
67
|
-
|
|
68
|
-
args: [{ required: true }]
|
|
69
|
-
}], headerContent: [{
|
|
70
|
-
type: Input,
|
|
71
|
-
args: [{ required: true }]
|
|
72
|
-
}], hasBreadcrumb: [{
|
|
73
|
-
type: Input
|
|
74
|
-
}], pageType: [{
|
|
75
|
-
type: Input
|
|
76
|
-
}], pageBreadcrumbs: [{
|
|
77
|
-
type: ViewChild,
|
|
78
|
-
args: ['pageBreadcrumbs', { read: ViewContainerRef, static: true }]
|
|
79
|
-
}], pageToc: [{
|
|
80
|
-
type: ViewChild,
|
|
81
|
-
args: ['pageToc', { read: ViewContainerRef, static: true }]
|
|
82
|
-
}], pageNavigation: [{
|
|
83
|
-
type: ViewChild,
|
|
84
|
-
args: ['pageNavigation', { read: ViewContainerRef, static: true }]
|
|
85
|
-
}] } });
|
|
103
|
+
'[attr.data-ng-doc-page-tabs]': 'routes().length > 1',
|
|
104
|
+
'[attr.data-ng-doc-fullscreen-route]': 'fullscreenRoute.active()',
|
|
105
|
+
}, template: "<article class=\"ngde\">\n <ng-container #pageBreadcrumbs></ng-container>\n\n <ng-doc-page-header\n [headerContent]=\"headerContent()\"\n [headerContentSource]=\"headerContentSource()\" />\n\n @if (routes().length > 1) {\n <ng-doc-tab-routes-group>\n @for (route of routes(); track route) {\n <a\n ng-doc-tab-route\n [routerLink]=\"['./' + route.path]\"\n routerLinkActive\n [routerLinkActiveOptions]=\"{ exact: true }\"\n #rla=\"routerLinkActive\"\n [isActive]=\"rla.isActive\">\n @if (route.data?.['icon']; as icon) {\n <ng-doc-icon [customIcon]=\"icon\" />\n }\n {{ route.title }}\n </a>\n }\n </ng-doc-tab-routes-group>\n }\n\n <router-outlet></router-outlet>\n\n <ng-container #pageNavigation></ng-container>\n</article>\n\n<ng-container #pageToc></ng-container>\n", styles: [":host{display:flex;justify-content:space-between;--ng-doc-page-sticky-offset: var(--ng-doc-navbar-height)}:host[data-ng-doc-page-tabs=true]{--ng-doc-page-sticky-offset: calc( var(--ng-doc-navbar-height) + var(--ng-doc-page-wrapper-tabs-height) )}:host{--ng-doc-toc-margin: calc(var(--ng-doc-base-gutter) * 5)}:host article{position:relative;width:var(--ng-doc-article-width, 100%);max-width:var(--ng-doc-article-width, var(--ng-doc-content-max-width));margin-left:auto;margin-right:auto;min-width:0}:host article:has(.ng-doc-page-tags),:host article:has(ng-doc-api-list){max-width:var(--ng-doc-article-width, var(--ng-doc-api-content-max-width))}:host header ::ng-deep h1{margin-top:0}:host ng-doc-tab-routes-group{position:sticky!important;top:var(--ng-doc-navbar-height);margin:calc(var(--ng-doc-base-gutter) * 2) 0;background:var(--ng-doc-navbar-background);z-index:5;height:var(--ng-doc-page-wrapper-tabs-height)}:host .ng-doc-page-header{margin-bottom:calc(var(--ng-doc-base-gutter) * 3)}:host[data-ng-doc-fullscreen-route=true]{display:block}:host[data-ng-doc-fullscreen-route=true] article{width:100%;max-width:none}:host[data-ng-doc-fullscreen-route=true] ::ng-deep>:not(article),:host[data-ng-doc-fullscreen-route=true] ::ng-deep article>:not(router-outlet+*){display:none}\n"] }]
|
|
106
|
+
}], propDecorators: { routes: [{ type: i0.Input, args: [{ isSignal: true, alias: "routes", required: true }] }], headerContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerContent", required: true }] }], headerContentSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerContentSource", required: false }] }], hasBreadcrumb: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasBreadcrumb", required: false }] }], pageType: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageType", required: false }] }], pageBreadcrumbs: [{ type: i0.ViewChild, args: ['pageBreadcrumbs', { ...{ read: ViewContainerRef }, isSignal: true }] }], pageToc: [{ type: i0.ViewChild, args: ['pageToc', { ...{ read: ViewContainerRef }, isSignal: true }] }], pageNavigation: [{ type: i0.ViewChild, args: ['pageNavigation', { ...{ read: ViewContainerRef }, isSignal: true }] }] } });
|
|
86
107
|
|
|
87
108
|
/**
|
|
88
109
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-doc-app-components-page-wrapper.mjs","sources":["../../../../libs/app/components/page-wrapper/page-wrapper.component.ts","../../../../libs/app/components/page-wrapper/page-wrapper.component.html","../../../../libs/app/components/page-wrapper/ng-doc-app-components-page-wrapper.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n inject,\n Input,\n OnInit,\n ViewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport {\n ActivatedRoute,\n Router,\n RouterLink,\n RouterLinkActive,\n RouterOutlet,\n Routes,\n} from '@angular/router';\nimport { NgDocPageHeaderComponent } from '@ng-doc/app/components/page-header';\nimport { createComponent } from '@ng-doc/app/helpers';\nimport { NgDocNavigation, NgDocPageNavigation } from '@ng-doc/app/interfaces';\nimport { NG_DOC_CONTEXT, NG_DOC_PAGE_SKELETON } from '@ng-doc/app/tokens';\nimport { isPresent } from '@ng-doc/core/helpers/is-present';\nimport { NgDocPageType } from '@ng-doc/core/types';\nimport {\n NgDocIconComponent,\n NgDocTabRouteComponent,\n NgDocTabRoutesGroupComponent,\n} from '@ng-doc/ui-kit';\n\n@Component({\n selector: 'ng-doc-page-wrapper',\n imports: [\n RouterOutlet,\n RouterLink,\n NgDocTabRouteComponent,\n NgDocTabRoutesGroupComponent,\n RouterLinkActive,\n NgDocIconComponent,\n NgDocPageHeaderComponent,\n ],\n templateUrl: './page-wrapper.component.html',\n styleUrl: './page-wrapper.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-ng-doc-page-tabs]': 'routes.length > 1',\n },\n})\nexport class NgDocPageWrapperComponent implements OnInit {\n @Input({ required: true })\n routes!: Routes;\n\n @Input({ required: true })\n headerContent!: string;\n\n @Input()\n hasBreadcrumb = true;\n\n @Input()\n pageType: NgDocPageType = 'guide';\n\n @ViewChild('pageBreadcrumbs', { read: ViewContainerRef, static: true })\n pageBreadcrumbs!: ViewContainerRef;\n\n @ViewChild('pageToc', { read: ViewContainerRef, static: true })\n pageToc?: ViewContainerRef;\n\n @ViewChild('pageNavigation', { read: ViewContainerRef, static: true })\n pageNavigation!: ViewContainerRef;\n\n protected skeleton = inject(NG_DOC_PAGE_SKELETON);\n protected router = inject(Router);\n protected route = inject(ActivatedRoute);\n protected context = inject(NG_DOC_CONTEXT);\n\n private breadcrumbs: string[] = inject(ActivatedRoute)\n .pathFromRoot.filter((route: ActivatedRoute) => !!route.snapshot.url.length)\n .map((route: ActivatedRoute) => route.snapshot.title)\n .filter(isPresent);\n\n ngOnInit(): void {\n if (this.skeleton.breadcrumbs && this.hasBreadcrumb) {\n createComponent(this.pageBreadcrumbs, this.skeleton.breadcrumbs, {\n breadcrumbs: this.breadcrumbs,\n });\n }\n\n if (this.pageType === 'guide') {\n if (this.skeleton.navigation) {\n createComponent(this.pageNavigation, this.skeleton.navigation, this.navigationInputs());\n }\n }\n }\n\n private navigationInputs(): NgDocPageNavigation {\n const url =\n '/' +\n this.route.pathFromRoot\n .map((route: ActivatedRoute) => route.snapshot.url)\n .flat()\n .join('/');\n const flatItems = (items: NgDocNavigation[]): NgDocNavigation[] =>\n items\n .map((item: NgDocNavigation) => [item.children?.length ? flatItems(item.children) : item])\n .flat(2);\n const flatPages: NgDocNavigation[] = flatItems(this.context.navigation);\n\n return {\n prevPage: flatPages[flatPages.findIndex((item: NgDocNavigation) => url === item.route) - 1],\n nextPage: flatPages[flatPages.findIndex((item: NgDocNavigation) => url === item.route) + 1],\n };\n }\n}\n","<article class=\"ngde\">\n <ng-container #pageBreadcrumbs></ng-container>\n\n <ng-doc-page-header [headerContent]=\"headerContent\" />\n\n @if (routes.length > 1) {\n <ng-doc-tab-routes-group>\n @for (route of routes; track route) {\n <a\n ng-doc-tab-route\n [routerLink]=\"['./' + route.path]\"\n routerLinkActive\n [routerLinkActiveOptions]=\"{ exact: true }\"\n #rla=\"routerLinkActive\"\n [isActive]=\"rla.isActive\">\n @if (route.data?.['icon']; as icon) {\n <ng-doc-icon [customIcon]=\"icon\" />\n }\n {{ route.title }}\n </a>\n }\n </ng-doc-tab-routes-group>\n }\n\n <router-outlet></router-outlet>\n\n <ng-container #pageNavigation></ng-container>\n</article>\n\n<ng-container #pageToc></ng-container>\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-page-wrapper.mjs","sources":["../../../../libs/app/components/page-wrapper/page-wrapper.component.ts","../../../../libs/app/components/page-wrapper/page-wrapper.component.html","../../../../libs/app/components/page-wrapper/ng-doc-app-components-page-wrapper.ts"],"sourcesContent":["import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n inject,\n Injector,\n input,\n OnInit,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport {\n ActivatedRoute,\n Router,\n RouterLink,\n RouterLinkActive,\n RouterOutlet,\n Routes,\n} from '@angular/router';\nimport { NgDocPageHeaderComponent } from '@ng-doc/app/components/page-header';\nimport { createComponent } from '@ng-doc/app/helpers';\nimport { NgDocNavigation } from '@ng-doc/app/interfaces';\nimport { NgDocFullscreenRouteService } from '@ng-doc/app/services/fullscreen-route';\nimport { NgDocRoutePreloader } from '@ng-doc/app/services/route-preloader';\nimport { NG_DOC_CONTEXT, NG_DOC_PAGE_SKELETON } from '@ng-doc/app/tokens';\nimport { isPresent } from '@ng-doc/core/helpers/is-present';\nimport type { NgDocContentSource } from '@ng-doc/core/interfaces';\nimport { NgDocPageType } from '@ng-doc/core/types';\nimport {\n NgDocIconComponent,\n NgDocTabRouteComponent,\n NgDocTabRoutesGroupComponent,\n} from '@ng-doc/ui-kit';\n\n/**\n * Layout of a generated page: the breadcrumbs, the page header, the tabs of a page with several\n * routes, the page itself, the previous and next page links, and the table of contents beside it.\n *\n * The breadcrumbs, the page links and the table of contents are the page skeleton's components,\n * created in the containers this component exposes.\n *\n * While the page shows one of its fullscreen routes (`NgDocFullscreenRouteService`), only the page\n * is shown.\n */\n@Component({\n selector: 'ng-doc-page-wrapper',\n imports: [\n RouterOutlet,\n RouterLink,\n NgDocTabRouteComponent,\n NgDocTabRoutesGroupComponent,\n RouterLinkActive,\n NgDocIconComponent,\n NgDocPageHeaderComponent,\n ],\n templateUrl: './page-wrapper.component.html',\n styleUrl: './page-wrapper.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-ng-doc-page-tabs]': 'routes().length > 1',\n '[attr.data-ng-doc-fullscreen-route]': 'fullscreenRoute.active()',\n },\n})\nexport class NgDocPageWrapperComponent implements OnInit {\n /** Routes of the page; a page with more than one gets tabs. */\n readonly routes = input.required<Routes>();\n\n /** HTML of the page header. */\n readonly headerContent = input.required<string>();\n\n /** Deferred source of the page header, for generated pages that load it separately. */\n readonly headerContentSource = input<NgDocContentSource>();\n\n /** Whether the page shows breadcrumbs. */\n readonly hasBreadcrumb = input<boolean, unknown>(true, { transform: booleanAttribute });\n\n /** Type of the page: guides get previous and next page links, API pages do not. */\n readonly pageType = input<NgDocPageType>('guide');\n\n /** Container of the breadcrumbs. */\n readonly pageBreadcrumbs = viewChild.required('pageBreadcrumbs', { read: ViewContainerRef });\n\n /** Container of the table of contents. */\n readonly pageToc = viewChild.required('pageToc', { read: ViewContainerRef });\n\n /** Container of the previous and next page links. */\n readonly pageNavigation = viewChild.required('pageNavigation', { read: ViewContainerRef });\n\n protected skeleton = inject(NG_DOC_PAGE_SKELETON);\n protected router = inject(Router);\n protected route = inject(ActivatedRoute);\n protected context = inject(NG_DOC_CONTEXT);\n protected readonly fullscreenRoute = inject(NgDocFullscreenRouteService);\n\n private breadcrumbs: string[] = inject(ActivatedRoute)\n .pathFromRoot.filter((route: ActivatedRoute) => !!route.snapshot.url.length)\n .map((route: ActivatedRoute) => route.snapshot.title)\n .filter(isPresent);\n\n private readonly preloader = inject(NgDocRoutePreloader);\n private readonly injector = inject(Injector);\n\n ngOnInit(): void {\n if (this.skeleton.breadcrumbs && this.hasBreadcrumb()) {\n createComponent(this.pageBreadcrumbs(), this.skeleton.breadcrumbs, {\n breadcrumbs: this.breadcrumbs,\n });\n }\n\n if (this.pageType() === 'guide' && this.skeleton.navigation) {\n createComponent(this.pageNavigation(), this.skeleton.navigation, this.adjacentPages());\n }\n\n // Readers often go on to the previous or next guide, so both are preloaded once the browser\n // is idle after this one has rendered. Render hooks never run on the server.\n afterNextRender(\n () => {\n if (this.pageType() !== 'guide') return;\n\n const { prevPage, nextPage } = this.adjacentPages();\n\n this.preloader.preloadWhenIdle([prevPage?.route, nextPage?.route]);\n },\n { injector: this.injector },\n );\n }\n\n private adjacentPages(): { prevPage?: NgDocNavigation; nextPage?: NgDocNavigation } {\n const url =\n '/' +\n this.route.pathFromRoot\n .map((route: ActivatedRoute) => route.snapshot.url)\n .flat()\n .join('/');\n const flatItems = (items: NgDocNavigation[]): NgDocNavigation[] =>\n items\n .map((item: NgDocNavigation) => [item.children?.length ? flatItems(item.children) : item])\n .flat(2);\n const flatPages: NgDocNavigation[] = flatItems(this.context.navigation);\n\n return {\n prevPage: flatPages[flatPages.findIndex((item: NgDocNavigation) => url === item.route) - 1],\n nextPage: flatPages[flatPages.findIndex((item: NgDocNavigation) => url === item.route) + 1],\n };\n }\n}\n","<article class=\"ngde\">\n <ng-container #pageBreadcrumbs></ng-container>\n\n <ng-doc-page-header\n [headerContent]=\"headerContent()\"\n [headerContentSource]=\"headerContentSource()\" />\n\n @if (routes().length > 1) {\n <ng-doc-tab-routes-group>\n @for (route of routes(); track route) {\n <a\n ng-doc-tab-route\n [routerLink]=\"['./' + route.path]\"\n routerLinkActive\n [routerLinkActiveOptions]=\"{ exact: true }\"\n #rla=\"routerLinkActive\"\n [isActive]=\"rla.isActive\">\n @if (route.data?.['icon']; as icon) {\n <ng-doc-icon [customIcon]=\"icon\" />\n }\n {{ route.title }}\n </a>\n }\n </ng-doc-tab-routes-group>\n }\n\n <router-outlet></router-outlet>\n\n <ng-container #pageNavigation></ng-container>\n</article>\n\n<ng-container #pageToc></ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|