@ng-doc/app 22.0.0-beta.2 → 22.1.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-frame.mjs +96 -0
- package/fesm2022/ng-doc-app-components-demo-frame.mjs.map +1 -0
- 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 +175 -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 +477 -286
- 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 +35 -11
- 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 +4 -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-demo-app.mjs +176 -0
- package/fesm2022/ng-doc-app-demo-app.mjs.map +1 -0
- 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 +307 -2
- 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 +42 -10
- 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-providers-title.mjs +129 -0
- package/fesm2022/ng-doc-app-providers-title.mjs.map +1 -0
- package/fesm2022/ng-doc-app-providers.mjs +1 -0
- package/fesm2022/ng-doc-app-providers.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 +90 -17
- package/fesm2022/ng-doc-app-services-highlighter.mjs.map +1 -1
- package/fesm2022/ng-doc-app-services-route-preloader.mjs +384 -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 +59 -18
- package/fesm2022/ng-doc-app-type-controls-type-alias-control.mjs.map +1 -1
- package/package.json +82 -28
- package/styles/global.css +1128 -201
- package/styles/main.css +1128 -201
- package/styles/themes/dark.css +88 -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 +14 -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-frame.d.ts +48 -0
- package/types/ng-doc-app-components-demo-pane.d.ts +19 -15
- package/types/ng-doc-app-components-demo.d.ts +80 -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 +167 -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 +24 -5
- 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 +4 -1
- package/types/ng-doc-app-demo-app.d.ts +89 -0
- 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 +142 -3
- package/types/ng-doc-app-interfaces.d.ts +62 -31
- 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 +10 -1
- package/types/ng-doc-app-providers-ng-doc-app.d.ts +18 -1
- package/types/ng-doc-app-providers-title.d.ts +59 -0
- package/types/ng-doc-app-providers.d.ts +1 -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 +47 -5
- package/types/ng-doc-app-services-route-preloader.d.ts +121 -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 +35 -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,8 +1,151 @@
|
|
|
1
|
+
import { HttpClient } from '@angular/common/http';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { inject, signal, computed, Service } from '@angular/core';
|
|
4
|
+
import { Router } from '@angular/router';
|
|
5
|
+
import { NG_DOC_CONTEXT } from '@ng-doc/app/tokens';
|
|
6
|
+
import { NG_REQUEST_BASE_PATH } from '@ng-doc/ui-kit/tokens';
|
|
7
|
+
import { firstValueFrom } from 'rxjs';
|
|
8
|
+
export * from '@ng-doc/app/services/content-scroll-intent';
|
|
9
|
+
export * from '@ng-doc/app/services/content-state';
|
|
10
|
+
export * from '@ng-doc/app/services/fullscreen-route';
|
|
1
11
|
export * from '@ng-doc/app/services/highlighter';
|
|
12
|
+
export * from '@ng-doc/app/services/route-preloader';
|
|
13
|
+
export * from '@ng-doc/app/services/shortcuts';
|
|
2
14
|
export * from '@ng-doc/app/services/sidebar';
|
|
3
15
|
export * from '@ng-doc/app/services/store';
|
|
16
|
+
export * from '@ng-doc/app/services/theme';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The route data key that names the segment of an API entry's list data
|
|
20
|
+
* (assets/ng-doc/SEGMENT/api-list.json). An empty string is the root list.
|
|
21
|
+
*/
|
|
22
|
+
const NG_DOC_API_LIST_SEGMENT_DATA = 'ngDocApiListSegment';
|
|
23
|
+
/** Route folders of API declaration pages. */
|
|
24
|
+
const DECLARATION_ROUTE = /^(.*?)\/(classes|interfaces|functions|type-aliases|variables|enums)\/[^/]+\/[^/]+$/;
|
|
25
|
+
/**
|
|
26
|
+
* Loads the API lists of every API entry once, for the search palette. The data file of an entry
|
|
27
|
+
* is assets/ng-doc/SEGMENT/api-list.json, where the segment is the route of the entry in its API
|
|
28
|
+
* configuration, or the root when it has none.
|
|
29
|
+
*
|
|
30
|
+
* The new engine lists every segment in the generated context (`NgDocContext.apiLists`), so
|
|
31
|
+
* exactly those files are requested, and none when the site has no API entry. Otherwise the
|
|
32
|
+
* entries are found in the router configuration: a route that carries the route data key
|
|
33
|
+
* NG_DOC_API_LIST_SEGMENT_DATA names its segment, and a route that declaration pages live under
|
|
34
|
+
* (ENTRY/classes/SCOPE/NAME and so on) tries its last route segment, with the root as the
|
|
35
|
+
* fallback ("api" tries the root first, as that is the default route of an API entry). When the
|
|
36
|
+
* configuration shows no entry (lazy routes), the root list is loaded. A list that cannot be
|
|
37
|
+
* loaded is skipped quietly, and each file is requested at most once per application.
|
|
38
|
+
*/
|
|
39
|
+
class NgDocApiListIndexService {
|
|
40
|
+
constructor() {
|
|
41
|
+
this.http = inject(HttpClient);
|
|
42
|
+
this.router = inject(Router);
|
|
43
|
+
this.basePath = inject(NG_REQUEST_BASE_PATH);
|
|
44
|
+
this.context = inject(NG_DOC_CONTEXT, { optional: true });
|
|
45
|
+
this.lists = signal(new Map(), /* @ts-ignore */
|
|
46
|
+
...(ngDevMode ? [{ debugName: "lists" }] : /* istanbul ignore next */ []));
|
|
47
|
+
this.requests = new Map();
|
|
48
|
+
/** Every declaration of the loaded API lists. */
|
|
49
|
+
this.declarations = computed(() => [...this.lists().values()].flatMap((lists) => lists.flatMap((scope) => scope.items.map((item) => ({
|
|
50
|
+
name: item.name,
|
|
51
|
+
kind: item.type,
|
|
52
|
+
scope: scope.title,
|
|
53
|
+
route: item.route.replace(/^\/+/, ''),
|
|
54
|
+
description: item.description,
|
|
55
|
+
signature: item.signature,
|
|
56
|
+
})))), /* @ts-ignore */
|
|
57
|
+
...(ngDevMode ? [{ debugName: "declarations" }] : /* istanbul ignore next */ []));
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Starts loading the API lists of every API entry, once.
|
|
61
|
+
* @returns A promise that settles when every list has loaded or failed.
|
|
62
|
+
*/
|
|
63
|
+
load() {
|
|
64
|
+
const generated = this.context?.apiLists;
|
|
65
|
+
const entries = generated
|
|
66
|
+
? generated.map((segment) => ({ segments: [segment] }))
|
|
67
|
+
: apiEntries(this.router.config);
|
|
68
|
+
// Generated sites load their pages with lazy routes, which the router configuration does
|
|
69
|
+
// not list until they are loaded. Without the generated list, the root list is where the
|
|
70
|
+
// default API entry keeps its data, so it is tried when no entry is found.
|
|
71
|
+
this.loading ??= Promise.all((entries.length || generated ? entries : [{ segments: [''] }]).map((entry) => this.loadEntry(entry))).then(() => undefined);
|
|
72
|
+
return this.loading;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Records an API list that is already loaded (the API index page loads its own), so the
|
|
76
|
+
* palette does not request it again.
|
|
77
|
+
* @param segment - The segment of the list data, or an empty string for the root list.
|
|
78
|
+
* @param list - The list.
|
|
79
|
+
*/
|
|
80
|
+
remember(segment, list) {
|
|
81
|
+
this.requests.set(segment, Promise.resolve(list));
|
|
82
|
+
this.store(segment, list);
|
|
83
|
+
}
|
|
84
|
+
async loadEntry(entry) {
|
|
85
|
+
for (const segment of entry.segments) {
|
|
86
|
+
const list = await this.request(segment);
|
|
87
|
+
if (list) {
|
|
88
|
+
this.store(segment, list);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
request(segment) {
|
|
94
|
+
let request = this.requests.get(segment);
|
|
95
|
+
if (!request) {
|
|
96
|
+
const url = `${this.basePath}assets/ng-doc/${segment ? `${segment}/` : ''}api-list.json`;
|
|
97
|
+
request = firstValueFrom(this.http.get(url)).then((list) => (Array.isArray(list) ? list : undefined), () => undefined);
|
|
98
|
+
this.requests.set(segment, request);
|
|
99
|
+
}
|
|
100
|
+
return request;
|
|
101
|
+
}
|
|
102
|
+
store(segment, list) {
|
|
103
|
+
this.lists.update((lists) => new Map(lists).set(segment, list));
|
|
104
|
+
}
|
|
105
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocApiListIndexService, deps: [], target: i0.ɵɵFactoryTarget.Service }); }
|
|
106
|
+
static { this.ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.2.1", ngImport: i0, type: NgDocApiListIndexService }); }
|
|
107
|
+
}
|
|
108
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocApiListIndexService, decorators: [{
|
|
109
|
+
type: Service
|
|
110
|
+
}] });
|
|
111
|
+
/**
|
|
112
|
+
* Finds the API entries in a router configuration.
|
|
113
|
+
* @param routes - The routes.
|
|
114
|
+
*/
|
|
115
|
+
function apiEntries(routes) {
|
|
116
|
+
const entries = new Map();
|
|
117
|
+
const entryRoutes = new Map();
|
|
118
|
+
const visit = (children, prefix) => {
|
|
119
|
+
for (const route of children) {
|
|
120
|
+
const path = [prefix, route.path ?? ''].filter(Boolean).join('/');
|
|
121
|
+
entryRoutes.set(path, route);
|
|
122
|
+
if (route.children) {
|
|
123
|
+
visit(route.children, path);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
visit(routes, '');
|
|
128
|
+
// A route with the segment in its data is an entry, even while its pages are lazy.
|
|
129
|
+
for (const [path, route] of entryRoutes) {
|
|
130
|
+
const configured = route.data?.[NG_DOC_API_LIST_SEGMENT_DATA];
|
|
131
|
+
if (typeof configured === 'string') {
|
|
132
|
+
entries.set(path, { segments: [configured] });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
for (const path of entryRoutes.keys()) {
|
|
136
|
+
const match = DECLARATION_ROUTE.exec(path);
|
|
137
|
+
if (!match || entries.has(match[1])) {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const last = match[1].split('/').pop() ?? '';
|
|
141
|
+
entries.set(match[1], { segments: last === 'api' ? ['', last] : [last, ''] });
|
|
142
|
+
}
|
|
143
|
+
return [...entries.values()];
|
|
144
|
+
}
|
|
4
145
|
|
|
5
146
|
/**
|
|
6
147
|
* Generated bundle index. Do not edit.
|
|
7
148
|
*/
|
|
149
|
+
|
|
150
|
+
export { NG_DOC_API_LIST_SEGMENT_DATA, NgDocApiListIndexService };
|
|
8
151
|
//# sourceMappingURL=ng-doc-app-services.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-doc-app-services.mjs","sources":["../../../../libs/app/services/ng-doc-app-services.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAAA;;AAEG"}
|
|
1
|
+
{"version":3,"file":"ng-doc-app-services.mjs","sources":["../../../../libs/app/services/search-index/api-list-index.service.ts","../../../../libs/app/services/ng-doc-app-services.ts"],"sourcesContent":["import { HttpClient } from '@angular/common/http';\nimport { computed, inject, Service, Signal, signal } from '@angular/core';\nimport { Route, Router } from '@angular/router';\nimport { NG_DOC_CONTEXT } from '@ng-doc/app/tokens';\nimport type { NgDocApiList } from '@ng-doc/core/interfaces';\nimport { NG_REQUEST_BASE_PATH } from '@ng-doc/ui-kit/tokens';\nimport { firstValueFrom } from 'rxjs';\n\n/**\n * A declaration of an API list, with the scope it belongs to.\n */\nexport interface NgDocApiListDeclaration {\n /** The name of the declaration. */\n name: string;\n /** The kind of the declaration, for example Class or Function. */\n kind: string;\n /** The scope of the declaration, for example the package name. */\n scope: string;\n /** The route of the declaration page, without the leading slash. */\n route: string;\n /** A one-line description, when the API list data carries one. */\n description?: string;\n /** The declaration header, when the API list data carries it. */\n signature?: string;\n}\n\n/**\n * The route data key that names the segment of an API entry's list data\n * (assets/ng-doc/SEGMENT/api-list.json). An empty string is the root list.\n */\nexport const NG_DOC_API_LIST_SEGMENT_DATA: string = 'ngDocApiListSegment';\n\n/** Route folders of API declaration pages. */\nconst DECLARATION_ROUTE =\n /^(.*?)\\/(classes|interfaces|functions|type-aliases|variables|enums)\\/[^/]+\\/[^/]+$/;\n\n/**\n * Loads the API lists of every API entry once, for the search palette. The data file of an entry\n * is assets/ng-doc/SEGMENT/api-list.json, where the segment is the route of the entry in its API\n * configuration, or the root when it has none.\n *\n * The new engine lists every segment in the generated context (`NgDocContext.apiLists`), so\n * exactly those files are requested, and none when the site has no API entry. Otherwise the\n * entries are found in the router configuration: a route that carries the route data key\n * NG_DOC_API_LIST_SEGMENT_DATA names its segment, and a route that declaration pages live under\n * (ENTRY/classes/SCOPE/NAME and so on) tries its last route segment, with the root as the\n * fallback (\"api\" tries the root first, as that is the default route of an API entry). When the\n * configuration shows no entry (lazy routes), the root list is loaded. A list that cannot be\n * loaded is skipped quietly, and each file is requested at most once per application.\n */\n@Service()\nexport class NgDocApiListIndexService {\n private readonly http = inject(HttpClient);\n private readonly router = inject(Router);\n private readonly basePath = inject(NG_REQUEST_BASE_PATH);\n private readonly context = inject(NG_DOC_CONTEXT, { optional: true });\n private readonly lists = signal<ReadonlyMap<string, NgDocApiList[]>>(new Map());\n private readonly requests = new Map<string, Promise<NgDocApiList[] | undefined>>();\n private loading?: Promise<void>;\n\n /** Every declaration of the loaded API lists. */\n readonly declarations: Signal<NgDocApiListDeclaration[]> = computed(() =>\n [...this.lists().values()].flatMap((lists: NgDocApiList[]) =>\n lists.flatMap((scope: NgDocApiList) =>\n scope.items.map((item) => ({\n name: item.name,\n kind: item.type,\n scope: scope.title,\n route: item.route.replace(/^\\/+/, ''),\n description: item.description,\n signature: item.signature,\n })),\n ),\n ),\n );\n\n /**\n * Starts loading the API lists of every API entry, once.\n * @returns A promise that settles when every list has loaded or failed.\n */\n load(): Promise<void> {\n const generated: readonly string[] | undefined = this.context?.apiLists;\n const entries: ApiEntry[] = generated\n ? generated.map((segment: string) => ({ segments: [segment] }))\n : apiEntries(this.router.config);\n\n // Generated sites load their pages with lazy routes, which the router configuration does\n // not list until they are loaded. Without the generated list, the root list is where the\n // default API entry keeps its data, so it is tried when no entry is found.\n this.loading ??= Promise.all(\n (entries.length || generated ? entries : [{ segments: [''] }]).map((entry: ApiEntry) =>\n this.loadEntry(entry),\n ),\n ).then(() => undefined);\n\n return this.loading;\n }\n\n /**\n * Records an API list that is already loaded (the API index page loads its own), so the\n * palette does not request it again.\n * @param segment - The segment of the list data, or an empty string for the root list.\n * @param list - The list.\n */\n remember(segment: string, list: NgDocApiList[]): void {\n this.requests.set(segment, Promise.resolve(list));\n this.store(segment, list);\n }\n\n private async loadEntry(entry: ApiEntry): Promise<void> {\n for (const segment of entry.segments) {\n const list = await this.request(segment);\n\n if (list) {\n this.store(segment, list);\n\n return;\n }\n }\n }\n\n private request(segment: string): Promise<NgDocApiList[] | undefined> {\n let request = this.requests.get(segment);\n\n if (!request) {\n const url = `${this.basePath}assets/ng-doc/${segment ? `${segment}/` : ''}api-list.json`;\n\n request = firstValueFrom(this.http.get<NgDocApiList[]>(url)).then(\n (list: NgDocApiList[]) => (Array.isArray(list) ? list : undefined),\n () => undefined,\n );\n this.requests.set(segment, request);\n }\n\n return request;\n }\n\n private store(segment: string, list: NgDocApiList[]): void {\n this.lists.update((lists: ReadonlyMap<string, NgDocApiList[]>) =>\n new Map(lists).set(segment, list),\n );\n }\n}\n\ninterface ApiEntry {\n segments: string[];\n}\n\n/**\n * Finds the API entries in a router configuration.\n * @param routes - The routes.\n */\nfunction apiEntries(routes: Route[]): ApiEntry[] {\n const entries = new Map<string, ApiEntry>();\n const entryRoutes = new Map<string, Route>();\n\n const visit = (children: Route[], prefix: string) => {\n for (const route of children) {\n const path = [prefix, route.path ?? ''].filter(Boolean).join('/');\n\n entryRoutes.set(path, route);\n if (route.children) {\n visit(route.children, path);\n }\n }\n };\n\n visit(routes, '');\n\n // A route with the segment in its data is an entry, even while its pages are lazy.\n for (const [path, route] of entryRoutes) {\n const configured = route.data?.[NG_DOC_API_LIST_SEGMENT_DATA];\n\n if (typeof configured === 'string') {\n entries.set(path, { segments: [configured] });\n }\n }\n\n for (const path of entryRoutes.keys()) {\n const match = DECLARATION_ROUTE.exec(path);\n\n if (!match || entries.has(match[1])) {\n continue;\n }\n\n const last = match[1].split('/').pop() ?? '';\n\n entries.set(match[1], { segments: last === 'api' ? ['', last] : [last, ''] });\n }\n\n return [...entries.values()];\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { InjectionToken } from '@angular/core';
|
|
2
2
|
import { asArray } from '@ng-doc/core/helpers/as-array';
|
|
3
3
|
|
|
4
|
+
/** Enables one delayed anchor replay after asynchronous NgDoc content is processed. */
|
|
5
|
+
const NG_DOC_CONTENT_ANCHOR_SCROLLING = new InjectionToken('NG_DOC_CONTENT_ANCHOR_SCROLLING', { providedIn: 'root', factory: () => false });
|
|
6
|
+
|
|
7
|
+
/** Declares whether delayed NgDoc content may replay a missed saved scroll position. */
|
|
8
|
+
const NG_DOC_CONTENT_SCROLL_POSITION_RESTORATION = new InjectionToken('NG_DOC_CONTENT_SCROLL_POSITION_RESTORATION', { providedIn: 'root', factory: () => 'disabled' });
|
|
9
|
+
|
|
4
10
|
const NG_DOC_CONTEXT = new InjectionToken('NG_DOC_CONTEXT');
|
|
5
11
|
|
|
6
12
|
const NG_DOC_MERMAID = new InjectionToken('NG_DOC_MERMAID');
|
|
@@ -37,38 +43,11 @@ const NG_DOC_ROUTE_PREFIX = new InjectionToken('NG_DOC_ROUTE_PREFIX');
|
|
|
37
43
|
|
|
38
44
|
const NG_DOC_SHIKI_THEME = new InjectionToken('NG_DOC_SHIKI_THEME');
|
|
39
45
|
|
|
40
|
-
/**
|
|
41
|
-
* Token that can be used to provide custom theme.
|
|
42
|
-
* You must compile your theme to CSS and add it to `assets` so that NgDoc can load it dynamically.
|
|
43
|
-
*
|
|
44
|
-
* You always should provide custom themes in root of your application with `multi: true` parameter.
|
|
45
|
-
*
|
|
46
|
-
* For example
|
|
47
|
-
* ```typescript
|
|
48
|
-
* @NgModule({
|
|
49
|
-
* declarations: [AppComponent],
|
|
50
|
-
* imports: [],
|
|
51
|
-
* providers: [
|
|
52
|
-
* {provide: NG_DOC_THEME, useValue: {id: 'CustomTheme', path: '/assets/themes/custom.css'}, multi: true}
|
|
53
|
-
* ],
|
|
54
|
-
* bootstrap: [AppComponent],
|
|
55
|
-
* })
|
|
56
|
-
* export class AppModule {}
|
|
57
|
-
* ```
|
|
58
|
-
*/
|
|
59
|
-
const NG_DOC_THEME = new InjectionToken(`NG_DOC_THEME`);
|
|
60
|
-
/**
|
|
61
|
-
* Default theme for application if user didn't change it manually.
|
|
62
|
-
*
|
|
63
|
-
* You can provide this token in the root of you application, to set theme by default.
|
|
64
|
-
*/
|
|
65
|
-
const NG_DOC_DEFAULT_THEME_ID = new InjectionToken(`NG_DOC_DEFAULT_THEME`);
|
|
66
|
-
|
|
67
46
|
const NG_DOC_TYPE_CONTROL = new InjectionToken('NG_DOC_TYPE_CONTROL');
|
|
68
47
|
|
|
69
48
|
/**
|
|
70
49
|
* Generated bundle index. Do not edit.
|
|
71
50
|
*/
|
|
72
51
|
|
|
73
|
-
export {
|
|
52
|
+
export { NG_DOC_CONTENT_ANCHOR_SCROLLING, NG_DOC_CONTENT_SCROLL_POSITION_RESTORATION, NG_DOC_CONTEXT, NG_DOC_MERMAID, NG_DOC_PAGE_CUSTOM_PROCESSOR, NG_DOC_PAGE_PROCESSOR, NG_DOC_PAGE_SKELETON, NG_DOC_ROUTE_PREFIX, NG_DOC_SHIKI_THEME, NG_DOC_TYPE_CONTROL, provideMainPageProcessor, providePageProcessor };
|
|
74
53
|
//# sourceMappingURL=ng-doc-app-tokens.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-doc-app-tokens.mjs","sources":["../../../../libs/app/tokens/
|
|
1
|
+
{"version":3,"file":"ng-doc-app-tokens.mjs","sources":["../../../../libs/app/tokens/content-anchor-scrolling.ts","../../../../libs/app/tokens/content-scroll-position-restoration.ts","../../../../libs/app/tokens/context.ts","../../../../libs/app/tokens/mermaid.ts","../../../../libs/app/tokens/page-processor.ts","../../../../libs/app/tokens/page-skeleton.ts","../../../../libs/app/tokens/route-prefix.ts","../../../../libs/app/tokens/shiki-theme.ts","../../../../libs/app/tokens/type-control.ts","../../../../libs/app/tokens/ng-doc-app-tokens.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/** Enables one delayed anchor replay after asynchronous NgDoc content is processed. */\nexport const NG_DOC_CONTENT_ANCHOR_SCROLLING = new InjectionToken<boolean>(\n 'NG_DOC_CONTENT_ANCHOR_SCROLLING',\n { providedIn: 'root', factory: () => false },\n);\n","import { InjectionToken } from '@angular/core';\n\nexport type NgDocContentScrollPositionRestoration = 'enabled' | 'top' | 'disabled';\n\n/** Declares whether delayed NgDoc content may replay a missed saved scroll position. */\nexport const NG_DOC_CONTENT_SCROLL_POSITION_RESTORATION =\n new InjectionToken<NgDocContentScrollPositionRestoration>(\n 'NG_DOC_CONTENT_SCROLL_POSITION_RESTORATION',\n { providedIn: 'root', factory: () => 'disabled' },\n );\n","import { InjectionToken } from '@angular/core';\nimport { NgDocContext } from '@ng-doc/app/interfaces';\n\nexport const NG_DOC_CONTEXT: InjectionToken<NgDocContext> = new InjectionToken<NgDocContext>(\n\t'NG_DOC_CONTEXT',\n);\n","import { InjectionToken } from '@angular/core';\nimport type { Mermaid } from 'mermaid';\n\nexport const NG_DOC_MERMAID = new InjectionToken<Mermaid>('NG_DOC_MERMAID');\n","import { InjectionToken, Provider } from '@angular/core';\nimport { NgDocPageProcessor } from '@ng-doc/app/interfaces';\nimport { asArray } from '@ng-doc/core/helpers/as-array';\n\nexport const NG_DOC_PAGE_PROCESSOR: InjectionToken<NgDocPageProcessor<unknown>> =\n new InjectionToken<NgDocPageProcessor<unknown>>('NG_DOC_PAGE_PROCESSOR');\nexport const NG_DOC_PAGE_CUSTOM_PROCESSOR: InjectionToken<NgDocPageProcessor<unknown>> =\n new InjectionToken<NgDocPageProcessor<unknown>>('NG_DOC_PAGE_CUSTOM_PROCESSOR');\n\n/**\n * Provide a main processor to replace html nodes with an Angular component.\n * Main processors are run before custom processors.\n * @param processors - The processor to provide.\n */\nexport function provideMainPageProcessor(\n processors: NgDocPageProcessor<unknown> | Array<NgDocPageProcessor<unknown>>,\n): Provider[] {\n return asArray(processors).map((processor) => ({\n provide: NG_DOC_PAGE_PROCESSOR,\n useValue: processor,\n multi: true,\n }));\n}\n\n/**\n * Provide a processor to replace html nodes with an Angular component.\n * @param processors - The processor to provide.\n */\nexport function providePageProcessor<T>(\n processors: NgDocPageProcessor<T> | Array<NgDocPageProcessor<T>>,\n): Provider[] {\n return asArray(processors).map((processor) => ({\n provide: NG_DOC_PAGE_CUSTOM_PROCESSOR,\n useValue: processor,\n multi: true,\n }));\n}\n","import { InjectionToken } from '@angular/core';\nimport { NgDocPageSkeleton } from '@ng-doc/app/interfaces';\n\nexport const NG_DOC_PAGE_SKELETON: InjectionToken<NgDocPageSkeleton> =\n\tnew InjectionToken<NgDocPageSkeleton>('NG_DOC_PAGE_SKELETON');\n","import { InjectionToken } from '@angular/core';\n\nexport const NG_DOC_ROUTE_PREFIX = new InjectionToken<string>('NG_DOC_ROUTE_PREFIX');\n","import { InjectionToken } from '@angular/core';\n\nexport interface NgDocShikiTheme {\n light: string;\n dark: string;\n}\n\nexport const NG_DOC_SHIKI_THEME = new InjectionToken<NgDocShikiTheme>('NG_DOC_SHIKI_THEME');\n","import { InjectionToken } from '@angular/core';\nimport { NgDocTypeControl } from '@ng-doc/app/interfaces';\n\nexport const NG_DOC_TYPE_CONTROL: InjectionToken<NgDocTypeControl> =\n\tnew InjectionToken<NgDocTypeControl>('NG_DOC_TYPE_CONTROL');\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAEA;MACa,+BAA+B,GAAG,IAAI,cAAc,CAC/D,iCAAiC,EACjC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,EAAE;;ACD9C;MACa,0CAA0C,GACrD,IAAI,cAAc,CAChB,4CAA4C,EAC5C,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAAU,EAAE;;MCLxC,cAAc,GAAiC,IAAI,cAAc,CAC7E,gBAAgB;;MCDJ,cAAc,GAAG,IAAI,cAAc,CAAU,gBAAgB;;MCC7D,qBAAqB,GAChC,IAAI,cAAc,CAA8B,uBAAuB;MAC5D,4BAA4B,GACvC,IAAI,cAAc,CAA8B,8BAA8B;AAEhF;;;;AAIG;AACG,SAAU,wBAAwB,CACtC,UAA4E,EAAA;AAE5E,IAAA,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,MAAM;AAC7C,QAAA,OAAO,EAAE,qBAAqB;AAC9B,QAAA,QAAQ,EAAE,SAAS;AACnB,QAAA,KAAK,EAAE,IAAI;AACZ,KAAA,CAAC,CAAC;AACL;AAEA;;;AAGG;AACG,SAAU,oBAAoB,CAClC,UAAgE,EAAA;AAEhE,IAAA,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,MAAM;AAC7C,QAAA,OAAO,EAAE,4BAA4B;AACrC,QAAA,QAAQ,EAAE,SAAS;AACnB,QAAA,KAAK,EAAE,IAAI;AACZ,KAAA,CAAC,CAAC;AACL;;MCjCa,oBAAoB,GAChC,IAAI,cAAc,CAAoB,sBAAsB;;MCFhD,mBAAmB,GAAG,IAAI,cAAc,CAAS,qBAAqB;;MCKtE,kBAAkB,GAAG,IAAI,cAAc,CAAkB,oBAAoB;;MCJ7E,mBAAmB,GAC/B,IAAI,cAAc,CAAmB,qBAAqB;;ACJ3D;;AAEG;;;;"}
|
|
@@ -1,28 +1,37 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
|
2
|
+
import { input, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import { NgDocSanitizeHtmlPipe } from '@ng-doc/app/pipes';
|
|
4
4
|
import { NgDocCheckboxComponent, NgDocTooltipDirective } from '@ng-doc/ui-kit';
|
|
5
5
|
import { DIControl, provideHostControl } from 'di-controls';
|
|
6
6
|
|
|
7
|
+
/** The playground control of `boolean` inputs: a checkbox labelled with the input name. */
|
|
7
8
|
class NgDocBooleanControlComponent extends DIControl {
|
|
8
9
|
constructor() {
|
|
9
10
|
super();
|
|
10
|
-
|
|
11
|
-
this.
|
|
11
|
+
/** Default value of the input; `undefined` leaves the component's own default. */
|
|
12
|
+
this.default = input(undefined, /* @ts-ignore */
|
|
13
|
+
...(ngDevMode ? [{ debugName: "default" }] : /* istanbul ignore next */ []));
|
|
14
|
+
/** Name of the input. */
|
|
15
|
+
this.name = input('', /* @ts-ignore */
|
|
16
|
+
...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
|
|
17
|
+
/** Description of the input, shown in a tooltip. */
|
|
18
|
+
this.description = input('', /* @ts-ignore */
|
|
19
|
+
...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
|
|
12
20
|
}
|
|
21
|
+
/** The value an unchecked box stands for. */
|
|
13
22
|
get defaultValue() {
|
|
14
|
-
return
|
|
23
|
+
return this.default();
|
|
15
24
|
}
|
|
16
25
|
updateModel(obj) {
|
|
17
26
|
super.updateModel(obj ? obj : !this.defaultValue ? this.defaultValue : false);
|
|
18
27
|
}
|
|
19
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
20
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
28
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocBooleanControlComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
29
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.2.1", type: NgDocBooleanControlComponent, isStandalone: true, selector: "ng-doc-boolean-control", inputs: { default: { classPropertyName: "default", publicName: "default", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideHostControl(NgDocBooleanControlComponent)], usesInheritance: true, ngImport: i0, template: "<ng-doc-checkbox [ngDocTooltip]=\"tooltipTemplate\" [canOpen]=\"!!description()\">\n {{ name() }}\n <ng-template #tooltipTemplate>\n <div [innerHTML]=\"description() | ngDocSanitizeHtml\"></div>\n </ng-template>\n</ng-doc-checkbox>\n", styles: [":host{display:inline-flex;width:100%}\n"], dependencies: [{ kind: "component", type: NgDocCheckboxComponent, selector: "ng-doc-checkbox", inputs: ["color"] }, { kind: "directive", type: NgDocTooltipDirective, selector: "[ngDocTooltip]", inputs: ["ngDocTooltip", "delay", "displayOrigin", "pointerOrigin", "positions", "canOpen", "panelClass", "minHeight", "maxHeight", "height", "minWidth", "maxWidth", "width"], outputs: ["beforeOpen", "afterOpen", "beforeClose", "afterClose"], exportAs: ["ngDocTooltip"] }, { kind: "pipe", type: NgDocSanitizeHtmlPipe, name: "ngDocSanitizeHtml" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
21
30
|
}
|
|
22
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
31
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocBooleanControlComponent, decorators: [{
|
|
23
32
|
type: Component,
|
|
24
|
-
args: [{ selector: 'ng-doc-boolean-control', providers: [provideHostControl(NgDocBooleanControlComponent)], changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgDocCheckboxComponent, NgDocTooltipDirective, NgDocSanitizeHtmlPipe], template: "<ng-doc-checkbox [ngDocTooltip]=\"tooltipTemplate\" [canOpen]=\"!!description\">\n
|
|
25
|
-
}], ctorParameters: () => [] });
|
|
33
|
+
args: [{ selector: 'ng-doc-boolean-control', providers: [provideHostControl(NgDocBooleanControlComponent)], changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgDocCheckboxComponent, NgDocTooltipDirective, NgDocSanitizeHtmlPipe], template: "<ng-doc-checkbox [ngDocTooltip]=\"tooltipTemplate\" [canOpen]=\"!!description()\">\n {{ name() }}\n <ng-template #tooltipTemplate>\n <div [innerHTML]=\"description() | ngDocSanitizeHtml\"></div>\n </ng-template>\n</ng-doc-checkbox>\n", styles: [":host{display:inline-flex;width:100%}\n"] }]
|
|
34
|
+
}], ctorParameters: () => [], propDecorators: { default: [{ type: i0.Input, args: [{ isSignal: true, alias: "default", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }] } });
|
|
26
35
|
|
|
27
36
|
/**
|
|
28
37
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-doc-app-type-controls-boolean-control.mjs","sources":["../../../../libs/app/type-controls/boolean-control/boolean-control.component.ts","../../../../libs/app/type-controls/boolean-control/boolean-control.component.html","../../../../libs/app/type-controls/boolean-control/ng-doc-app-type-controls-boolean-control.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { NgDocTypeControl } from '@ng-doc/app/interfaces';\nimport { NgDocSanitizeHtmlPipe } from '@ng-doc/app/pipes';\nimport { NgDocCheckboxComponent, NgDocTooltipDirective } from '@ng-doc/ui-kit';\nimport { DIControl, provideHostControl } from 'di-controls';\n\n@Component({\n selector: 'ng-doc-boolean-control',\n templateUrl: './boolean-control.component.html',\n styleUrls: ['./boolean-control.component.scss'],\n providers: [provideHostControl(NgDocBooleanControlComponent)],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgDocCheckboxComponent, NgDocTooltipDirective, NgDocSanitizeHtmlPipe],\n})\nexport class NgDocBooleanControlComponent\n extends DIControl<boolean | undefined>\n implements NgDocTypeControl<boolean | undefined>\n{\n default
|
|
1
|
+
{"version":3,"file":"ng-doc-app-type-controls-boolean-control.mjs","sources":["../../../../libs/app/type-controls/boolean-control/boolean-control.component.ts","../../../../libs/app/type-controls/boolean-control/boolean-control.component.html","../../../../libs/app/type-controls/boolean-control/ng-doc-app-type-controls-boolean-control.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { NgDocTypeControl } from '@ng-doc/app/interfaces';\nimport { NgDocSanitizeHtmlPipe } from '@ng-doc/app/pipes';\nimport { NgDocCheckboxComponent, NgDocTooltipDirective } from '@ng-doc/ui-kit';\nimport { DIControl, provideHostControl } from 'di-controls';\n\n/** The playground control of `boolean` inputs: a checkbox labelled with the input name. */\n@Component({\n selector: 'ng-doc-boolean-control',\n templateUrl: './boolean-control.component.html',\n styleUrls: ['./boolean-control.component.scss'],\n providers: [provideHostControl(NgDocBooleanControlComponent)],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgDocCheckboxComponent, NgDocTooltipDirective, NgDocSanitizeHtmlPipe],\n})\nexport class NgDocBooleanControlComponent\n extends DIControl<boolean | undefined>\n implements NgDocTypeControl<boolean | undefined>\n{\n /** Default value of the input; `undefined` leaves the component's own default. */\n readonly default = input<boolean | undefined>(undefined);\n\n /** Name of the input. */\n readonly name = input<string>('');\n\n /** Description of the input, shown in a tooltip. */\n readonly description = input<string>('');\n\n constructor() {\n super();\n }\n\n /** The value an unchecked box stands for. */\n get defaultValue(): boolean | undefined {\n return this.default();\n }\n\n override updateModel(obj: boolean | null | undefined) {\n super.updateModel(obj ? obj : !this.defaultValue ? this.defaultValue : false);\n }\n}\n","<ng-doc-checkbox [ngDocTooltip]=\"tooltipTemplate\" [canOpen]=\"!!description()\">\n {{ name() }}\n <ng-template #tooltipTemplate>\n <div [innerHTML]=\"description() | ngDocSanitizeHtml\"></div>\n </ng-template>\n</ng-doc-checkbox>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAMA;AASM,MAAO,4BACX,SAAQ,SAA8B,CAAA;AAYtC,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;;QATA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAsB,SAAS;oFAAC;;QAG/C,IAAA,CAAA,IAAI,GAAG,KAAK,CAAS,EAAE;iFAAC;;QAGxB,IAAA,CAAA,WAAW,GAAG,KAAK,CAAS,EAAE;wFAAC;IAIxC;;AAGA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE;IACvB;AAES,IAAA,WAAW,CAAC,GAA+B,EAAA;QAClD,KAAK,CAAC,WAAW,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC/E;8GAxBW,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAJ5B,CAAC,kBAAkB,CAAC,4BAA4B,CAAC,CAAC,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECX/D,iPAMA,EAAA,MAAA,EAAA,CAAA,yCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDOY,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,qBAAqB,qUAAE,qBAAqB,EAAA,IAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAEnE,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBARxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,aAGvB,CAAC,kBAAkB,CAAA,4BAAA,CAA8B,CAAC,mBAC5C,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,sBAAsB,EAAE,qBAAqB,EAAE,qBAAqB,CAAC,EAAA,QAAA,EAAA,iPAAA,EAAA,MAAA,EAAA,CAAA,yCAAA,CAAA,EAAA;;;AEbjF;;AAEG;;;;"}
|
|
@@ -1,21 +1,26 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { input, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import * as i1 from '@angular/forms';
|
|
4
4
|
import { FormsModule } from '@angular/forms';
|
|
5
5
|
import { NgDocInputWrapperComponent, NgDocInputNumberDirective, NgDocButtonIconComponent, NgDocFocusableDirective, NgDocIconComponent } from '@ng-doc/ui-kit';
|
|
6
6
|
import { DIControl, DIControlSilencerDirective } from 'di-controls';
|
|
7
7
|
|
|
8
|
+
/** The playground control of `number` inputs. */
|
|
8
9
|
class NgDocNumberControlComponent extends DIControl {
|
|
9
10
|
constructor() {
|
|
10
11
|
super();
|
|
12
|
+
/** Default value of the input; clearing the field returns to it. */
|
|
13
|
+
this.default = input(undefined, /* @ts-ignore */
|
|
14
|
+
...(ngDevMode ? [{ debugName: "default" }] : /* istanbul ignore next */ []));
|
|
11
15
|
}
|
|
12
16
|
changeModel(value) {
|
|
13
|
-
|
|
17
|
+
const defaultValue = this.default();
|
|
18
|
+
this.updateModel(value === null && defaultValue ? defaultValue : value);
|
|
14
19
|
}
|
|
15
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
16
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.
|
|
20
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocNumberControlComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
21
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: NgDocNumberControlComponent, isStandalone: true, selector: "ng-doc-number-control", inputs: { default: { classPropertyName: "default", publicName: "default", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<ng-doc-input-wrapper diControlSilencer>\n <input ngDocInputNumber type=\"number\" [ngModel]=\"model()\" (ngModelChange)=\"changeModel($event)\" />\n\n @if (model() && model() !== default()) {\n <button\n ng-doc-button-icon-transparent\n ngDocInputWrapperRight\n size=\"large\"\n [ngDocFocusable]=\"false\"\n [disabled]=\"disabled\"\n [rounded]=\"false\"\n (click)=\"updateModel(default() ?? null)\"\n (focusout)=\"touch()\">\n <ng-doc-icon icon=\"x\"></ng-doc-icon>\n </button>\n }\n</ng-doc-input-wrapper>\n", styles: [":host{display:block;width:100%}\n"], dependencies: [{ kind: "component", type: NgDocInputWrapperComponent, selector: "ng-doc-input-wrapper", inputs: ["blurContent", "blurContext", "align"] }, { kind: "directive", type: DIControlSilencerDirective, selector: "[diControlSilencer]" }, { kind: "directive", type: NgDocInputNumberDirective, selector: "input[ngDocInputNumber]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number]:not([ngNoCva])[formControlName],input[type=number]:not([ngNoCva])[formControl],input[type=number]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: NgDocButtonIconComponent, selector: "button[ng-doc-button-icon], a[ng-doc-button-icon], button[ng-doc-button-icon-raised], a[ng-doc-button-icon-raised], button[ng-doc-button-icon-transparent], a[ng-doc-button-icon-transparent]", inputs: ["size", "rounded"] }, { kind: "directive", type: NgDocFocusableDirective, selector: "[ngDocFocusable]", inputs: ["ngDocFocusable"], exportAs: ["ngDocFocusable"] }, { kind: "component", type: NgDocIconComponent, selector: "ng-doc-icon", inputs: ["icon", "customIcon", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
17
22
|
}
|
|
18
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
23
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocNumberControlComponent, decorators: [{
|
|
19
24
|
type: Component,
|
|
20
25
|
args: [{ selector: 'ng-doc-number-control', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
21
26
|
NgDocInputWrapperComponent,
|
|
@@ -25,10 +30,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
|
|
|
25
30
|
NgDocButtonIconComponent,
|
|
26
31
|
NgDocFocusableDirective,
|
|
27
32
|
NgDocIconComponent,
|
|
28
|
-
], template: "<ng-doc-input-wrapper diControlSilencer>\n <input ngDocInputNumber type=\"number\" [ngModel]=\"model()\" (ngModelChange)=\"changeModel($event)\" />\n\n @if (model() && model() !== default) {\n <button\n ng-doc-button-icon-transparent\n ngDocInputWrapperRight\n size=\"large\"\n [ngDocFocusable]=\"false\"\n [disabled]=\"disabled\"\n [rounded]=\"false\"\n (click)=\"updateModel(default ?? null)\"\n (focusout)=\"touch()\">\n <ng-doc-icon icon=\"x\"></ng-doc-icon>\n </button>\n }\n</ng-doc-input-wrapper>\n", styles: [":host{display:block;width:100%}\n"] }]
|
|
29
|
-
}], ctorParameters: () => [], propDecorators: { default: [{
|
|
30
|
-
type: Input
|
|
31
|
-
}] } });
|
|
33
|
+
], template: "<ng-doc-input-wrapper diControlSilencer>\n <input ngDocInputNumber type=\"number\" [ngModel]=\"model()\" (ngModelChange)=\"changeModel($event)\" />\n\n @if (model() && model() !== default()) {\n <button\n ng-doc-button-icon-transparent\n ngDocInputWrapperRight\n size=\"large\"\n [ngDocFocusable]=\"false\"\n [disabled]=\"disabled\"\n [rounded]=\"false\"\n (click)=\"updateModel(default() ?? null)\"\n (focusout)=\"touch()\">\n <ng-doc-icon icon=\"x\"></ng-doc-icon>\n </button>\n }\n</ng-doc-input-wrapper>\n", styles: [":host{display:block;width:100%}\n"] }]
|
|
34
|
+
}], ctorParameters: () => [], propDecorators: { default: [{ type: i0.Input, args: [{ isSignal: true, alias: "default", required: false }] }] } });
|
|
32
35
|
|
|
33
36
|
/**
|
|
34
37
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-doc-app-type-controls-number-control.mjs","sources":["../../../../libs/app/type-controls/number-control/number-control.component.ts","../../../../libs/app/type-controls/number-control/number-control.component.html","../../../../libs/app/type-controls/number-control/ng-doc-app-type-controls-number-control.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component,
|
|
1
|
+
{"version":3,"file":"ng-doc-app-type-controls-number-control.mjs","sources":["../../../../libs/app/type-controls/number-control/number-control.component.ts","../../../../libs/app/type-controls/number-control/number-control.component.html","../../../../libs/app/type-controls/number-control/ng-doc-app-type-controls-number-control.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { NgDocTypeControl } from '@ng-doc/app/interfaces';\nimport {\n NgDocButtonIconComponent,\n NgDocFocusableDirective,\n NgDocIconComponent,\n NgDocInputNumberDirective,\n NgDocInputWrapperComponent,\n} from '@ng-doc/ui-kit';\nimport { DIControl, DIControlSilencerDirective } from 'di-controls';\n\n/** The playground control of `number` inputs. */\n@Component({\n selector: 'ng-doc-number-control',\n templateUrl: './number-control.component.html',\n styleUrls: ['./number-control.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgDocInputWrapperComponent,\n DIControlSilencerDirective,\n NgDocInputNumberDirective,\n FormsModule,\n NgDocButtonIconComponent,\n NgDocFocusableDirective,\n NgDocIconComponent,\n ],\n})\nexport class NgDocNumberControlComponent\n extends DIControl<number>\n implements NgDocTypeControl<number>\n{\n /** Default value of the input; clearing the field returns to it. */\n readonly default = input<number | undefined>(undefined);\n\n constructor() {\n super();\n }\n\n changeModel(value: number | null): void {\n const defaultValue: number | undefined = this.default();\n\n this.updateModel(value === null && defaultValue ? defaultValue : value);\n }\n}\n","<ng-doc-input-wrapper diControlSilencer>\n <input ngDocInputNumber type=\"number\" [ngModel]=\"model()\" (ngModelChange)=\"changeModel($event)\" />\n\n @if (model() && model() !== default()) {\n <button\n ng-doc-button-icon-transparent\n ngDocInputWrapperRight\n size=\"large\"\n [ngDocFocusable]=\"false\"\n [disabled]=\"disabled\"\n [rounded]=\"false\"\n (click)=\"updateModel(default() ?? null)\"\n (focusout)=\"touch()\">\n <ng-doc-icon icon=\"x\"></ng-doc-icon>\n </button>\n }\n</ng-doc-input-wrapper>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +1,29 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { input, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import * as i1 from '@angular/forms';
|
|
4
4
|
import { FormsModule } from '@angular/forms';
|
|
5
5
|
import { NgDocInputWrapperComponent, NgDocInputStringDirective, NgDocButtonIconComponent, NgDocFocusableDirective, NgDocIconComponent } from '@ng-doc/ui-kit';
|
|
6
6
|
import { DIControl, DIControlSilencerDirective } from 'di-controls';
|
|
7
7
|
|
|
8
|
+
/** The playground control of `string` inputs. */
|
|
8
9
|
class NgDocStringControlComponent extends DIControl {
|
|
9
10
|
constructor() {
|
|
10
11
|
super();
|
|
12
|
+
/** Default value of the input; clearing the field returns to it. */
|
|
13
|
+
this.default = input(undefined, /* @ts-ignore */
|
|
14
|
+
...(ngDevMode ? [{ debugName: "default" }] : /* istanbul ignore next */ []));
|
|
11
15
|
}
|
|
12
16
|
changeModel(value) {
|
|
13
|
-
|
|
17
|
+
const defaultValue = this.default();
|
|
18
|
+
this.updateModel(value === null && defaultValue ? defaultValue : value);
|
|
14
19
|
}
|
|
15
20
|
writeValue(value) {
|
|
16
21
|
super.writeValue(value);
|
|
17
22
|
}
|
|
18
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
19
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.
|
|
23
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocStringControlComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
24
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: NgDocStringControlComponent, isStandalone: true, selector: "ng-doc-string-control", inputs: { default: { classPropertyName: "default", publicName: "default", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<ng-doc-input-wrapper diControlSilencer>\n <input ngDocInputString [ngModel]=\"model()\" (ngModelChange)=\"changeModel($event)\" />\n @if (model() && model() !== default()) {\n <button\n ng-doc-button-icon-transparent\n ngDocInputWrapperRight\n size=\"large\"\n [ngDocFocusable]=\"false\"\n [disabled]=\"disabled\"\n [rounded]=\"false\"\n (click)=\"updateModel(default() ?? null)\"\n (focusout)=\"touch()\">\n <ng-doc-icon icon=\"x\"></ng-doc-icon>\n </button>\n }\n</ng-doc-input-wrapper>\n", styles: [":host{display:block;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: NgDocInputWrapperComponent, selector: "ng-doc-input-wrapper", inputs: ["blurContent", "blurContext", "align"] }, { kind: "directive", type: NgDocInputStringDirective, selector: "input[ngDocInputString]" }, { kind: "component", type: NgDocButtonIconComponent, selector: "button[ng-doc-button-icon], a[ng-doc-button-icon], button[ng-doc-button-icon-raised], a[ng-doc-button-icon-raised], button[ng-doc-button-icon-transparent], a[ng-doc-button-icon-transparent]", inputs: ["size", "rounded"] }, { kind: "directive", type: NgDocFocusableDirective, selector: "[ngDocFocusable]", inputs: ["ngDocFocusable"], exportAs: ["ngDocFocusable"] }, { kind: "component", type: NgDocIconComponent, selector: "ng-doc-icon", inputs: ["icon", "customIcon", "size"] }, { kind: "directive", type: DIControlSilencerDirective, selector: "[diControlSilencer]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
20
25
|
}
|
|
21
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
26
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocStringControlComponent, decorators: [{
|
|
22
27
|
type: Component,
|
|
23
28
|
args: [{ selector: 'ng-doc-string-control', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
24
29
|
FormsModule,
|
|
@@ -28,10 +33,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
|
|
|
28
33
|
NgDocFocusableDirective,
|
|
29
34
|
NgDocIconComponent,
|
|
30
35
|
DIControlSilencerDirective,
|
|
31
|
-
], template: "<ng-doc-input-wrapper diControlSilencer>\n <input ngDocInputString [ngModel]=\"model()\" (ngModelChange)=\"changeModel($event)\" />\n @if (model() && model() !== default) {\n <button\n ng-doc-button-icon-transparent\n ngDocInputWrapperRight\n size=\"large\"\n [ngDocFocusable]=\"false\"\n [disabled]=\"disabled\"\n [rounded]=\"false\"\n (click)=\"updateModel(default ?? null)\"\n (focusout)=\"touch()\">\n <ng-doc-icon icon=\"x\"></ng-doc-icon>\n </button>\n }\n</ng-doc-input-wrapper>\n", styles: [":host{display:block;width:100%}\n"] }]
|
|
32
|
-
}], ctorParameters: () => [], propDecorators: { default: [{
|
|
33
|
-
type: Input
|
|
34
|
-
}] } });
|
|
36
|
+
], template: "<ng-doc-input-wrapper diControlSilencer>\n <input ngDocInputString [ngModel]=\"model()\" (ngModelChange)=\"changeModel($event)\" />\n @if (model() && model() !== default()) {\n <button\n ng-doc-button-icon-transparent\n ngDocInputWrapperRight\n size=\"large\"\n [ngDocFocusable]=\"false\"\n [disabled]=\"disabled\"\n [rounded]=\"false\"\n (click)=\"updateModel(default() ?? null)\"\n (focusout)=\"touch()\">\n <ng-doc-icon icon=\"x\"></ng-doc-icon>\n </button>\n }\n</ng-doc-input-wrapper>\n", styles: [":host{display:block;width:100%}\n"] }]
|
|
37
|
+
}], ctorParameters: () => [], propDecorators: { default: [{ type: i0.Input, args: [{ isSignal: true, alias: "default", required: false }] }] } });
|
|
35
38
|
|
|
36
39
|
/**
|
|
37
40
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-doc-app-type-controls-string-control.mjs","sources":["../../../../libs/app/type-controls/string-control/string-control.component.ts","../../../../libs/app/type-controls/string-control/string-control.component.html","../../../../libs/app/type-controls/string-control/ng-doc-app-type-controls-string-control.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component,
|
|
1
|
+
{"version":3,"file":"ng-doc-app-type-controls-string-control.mjs","sources":["../../../../libs/app/type-controls/string-control/string-control.component.ts","../../../../libs/app/type-controls/string-control/string-control.component.html","../../../../libs/app/type-controls/string-control/ng-doc-app-type-controls-string-control.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { NgDocTypeControl } from '@ng-doc/app/interfaces';\nimport {\n NgDocButtonIconComponent,\n NgDocFocusableDirective,\n NgDocIconComponent,\n NgDocInputStringDirective,\n NgDocInputWrapperComponent,\n} from '@ng-doc/ui-kit';\nimport { DIControl, DIControlSilencerDirective } from 'di-controls';\n\n/** The playground control of `string` inputs. */\n@Component({\n selector: 'ng-doc-string-control',\n templateUrl: './string-control.component.html',\n styleUrls: ['./string-control.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n FormsModule,\n NgDocInputWrapperComponent,\n NgDocInputStringDirective,\n NgDocButtonIconComponent,\n NgDocFocusableDirective,\n NgDocIconComponent,\n DIControlSilencerDirective,\n ],\n})\nexport class NgDocStringControlComponent\n extends DIControl<string>\n implements NgDocTypeControl<string>\n{\n /** Default value of the input; clearing the field returns to it. */\n readonly default = input<string | undefined>(undefined);\n\n constructor() {\n super();\n }\n\n changeModel(value: string | null): void {\n const defaultValue: string | undefined = this.default();\n\n this.updateModel(value === null && defaultValue ? defaultValue : value);\n }\n\n override writeValue(value: string | null) {\n super.writeValue(value);\n }\n}\n","<ng-doc-input-wrapper diControlSilencer>\n <input ngDocInputString [ngModel]=\"model()\" (ngModelChange)=\"changeModel($event)\" />\n @if (model() && model() !== default()) {\n <button\n ng-doc-button-icon-transparent\n ngDocInputWrapperRight\n size=\"large\"\n [ngDocFocusable]=\"false\"\n [disabled]=\"disabled\"\n [rounded]=\"false\"\n (click)=\"updateModel(default() ?? null)\"\n (focusout)=\"touch()\">\n <ng-doc-icon icon=\"x\"></ng-doc-icon>\n </button>\n }\n</ng-doc-input-wrapper>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AAYA;AAgBM,MAAO,2BACX,SAAQ,SAAiB,CAAA;AAMzB,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;;QAHA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAqB,SAAS;oFAAC;IAIvD;AAEA,IAAA,WAAW,CAAC,KAAoB,EAAA;AAC9B,QAAA,MAAM,YAAY,GAAuB,IAAI,CAAC,OAAO,EAAE;AAEvD,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,KAAK,IAAI,IAAI,YAAY,GAAG,YAAY,GAAG,KAAK,CAAC;IACzE;AAES,IAAA,UAAU,CAAC,KAAoB,EAAA;AACtC,QAAA,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;IACzB;8GAnBW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5BxC,miBAgBA,EAAA,MAAA,EAAA,CAAA,mCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDGI,WAAW,ysBACX,0BAA0B,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,aAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC1B,yBAAyB,EAAA,QAAA,EAAA,yBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,wBAAwB,EAAA,QAAA,EAAA,+LAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,uBAAuB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,kBAAkB,gGAClB,0BAA0B,EAAA,QAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAGjB,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAfvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,eAAA,EAGhB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,WAAW;wBACX,0BAA0B;wBAC1B,yBAAyB;wBACzB,wBAAwB;wBACxB,uBAAuB;wBACvB,kBAAkB;wBAClB,0BAA0B;AAC3B,qBAAA,EAAA,QAAA,EAAA,miBAAA,EAAA,MAAA,EAAA,CAAA,mCAAA,CAAA,EAAA;;;AE1BH;;AAEG;;;;"}
|