@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-playground.mjs","sources":["../../../../libs/app/components/playground/playground-demo/playground-demo.component.ts","../../../../libs/app/components/playground/playground-demo/playground-demo.component.html","../../../../libs/app/components/playground/playground-property/playground-property.component.ts","../../../../libs/app/components/playground/playground-property/playground-property.component.html","../../../../libs/app/components/playground/playground-properties/playground-properties.component.ts","../../../../libs/app/components/playground/playground-properties/playground-properties.component.html","../../../../libs/app/components/playground/playground.component.ts","../../../../libs/app/components/playground/playground.component.html","../../../../libs/app/components/playground/base-playground.ts","../../../../libs/app/components/playground/ng-doc-app-components-playground.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ComponentRef,\n DestroyRef,\n inject,\n InjectionToken,\n Injector,\n Input,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n Type,\n ViewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormGroup } from '@angular/forms';\nimport { NgDocDemoDisplayerComponent } from '@ng-doc/app/components/demo-displayer';\nimport { formatHtml } from '@ng-doc/app/helpers';\nimport { getPlaygroundDemoToken } from '@ng-doc/app/providers/playground-demo';\nimport { NgDocFormPartialValue } from '@ng-doc/app/types';\nimport {\n buildPlaygroundDemoPipeTemplate,\n buildPlaygroundDemoTemplate,\n} from '@ng-doc/core/helpers/build-playground-demo-template';\nimport { objectKeys } from '@ng-doc/core/helpers/object-keys';\nimport { stringify } from '@ng-doc/core/helpers/stringify';\nimport { NgDocPlaygroundConfig, NgDocPlaygroundProperties } from '@ng-doc/core/interfaces';\nimport { Subject } from 'rxjs';\nimport { startWith, takeUntil } from 'rxjs/operators';\n\nimport { NgDocBasePlayground } from '../base-playground';\nimport { NgDocPlaygroundForm } from '../playground-form';\n\n@Component({\n selector: 'ng-doc-playground-demo',\n templateUrl: './playground-demo.component.html',\n styleUrls: ['./playground-demo.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgDocDemoDisplayerComponent],\n})\nexport class NgDocPlaygroundDemoComponent<\n T extends NgDocPlaygroundProperties = NgDocPlaygroundProperties,\n >\n implements OnChanges, OnDestroy\n{\n @Input()\n id: string = '';\n\n @Input()\n pipeName: string = '';\n\n @Input()\n selector: string = '';\n\n @Input()\n configuration?: NgDocPlaygroundConfig;\n\n @Input()\n properties?: T;\n\n @Input()\n recreateDemo: boolean = false;\n\n @Input()\n form!: FormGroup<NgDocPlaygroundForm>;\n\n @Input()\n expanded: boolean = false;\n\n @ViewChild('demoOutlet', { static: true, read: ViewContainerRef })\n demoOutlet?: ViewContainerRef;\n\n playgroundDemo?: typeof NgDocBasePlayground;\n\n protected code = '';\n\n protected readonly injector = inject(Injector);\n protected readonly changeDetectorRef = inject(ChangeDetectorRef);\n protected readonly destroyRef = inject(DestroyRef);\n\n private demoRef?: ComponentRef<NgDocBasePlayground>;\n private readonly unsubscribe$: Subject<void> = new Subject<void>();\n\n async ngOnChanges({ form, id }: SimpleChanges): Promise<void> {\n if (form || id) {\n this.unsubscribe$.next();\n\n const demoInjector: InjectionToken<Array<typeof NgDocBasePlayground>> | undefined =\n getPlaygroundDemoToken(this.id);\n\n if (demoInjector) {\n const demos: Array<typeof NgDocBasePlayground> = this.injector.get(demoInjector, []);\n\n this.playgroundDemo = demos.find(\n (demo: typeof NgDocBasePlayground) =>\n demo.selector === this.selector || demo.selector === this.pipeName,\n );\n }\n\n await this.updateDemo();\n\n this.form?.valueChanges\n .pipe(\n takeUntil(this.unsubscribe$),\n startWith(this.form?.value),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((data: NgDocFormPartialValue<typeof this.form>) => this.updateDemo(data));\n }\n }\n\n private async updateDemo(data?: NgDocFormPartialValue<typeof this.form>): Promise<void> {\n if (this.recreateDemo || !this.demoRef) {\n this.createDemo();\n }\n\n if (data) {\n this.demoRef?.setInput('properties', data.properties ?? {});\n this.demoRef?.setInput('content', data.content ?? {});\n this.demoRef?.setInput('actionData', this.configuration?.data ?? {});\n\n if (this.recreateDemo) {\n this.demoRef?.instance.onReattached.subscribe(() => {\n this.demoRef?.changeDetectorRef.detectChanges();\n });\n }\n }\n\n await this.updateCodeView();\n }\n\n private createDemo(): void {\n if (this.playgroundDemo) {\n this.demoRef?.destroy();\n this.demoRef = this.demoOutlet?.createComponent(\n this.playgroundDemo as unknown as Type<NgDocBasePlayground>,\n );\n this.demoRef?.changeDetectorRef.markForCheck();\n }\n }\n\n private async updateCodeView(): Promise<void> {\n const template: string = this.pipeName\n ? buildPlaygroundDemoPipeTemplate(\n this.configuration?.template ?? '',\n this.pipeName,\n this.getActiveContent(),\n this.getPipeActiveInputs(),\n )\n : buildPlaygroundDemoTemplate(\n this.configuration?.template ?? '',\n this.selector,\n this.getActiveContent(),\n this.getActiveInputs(),\n );\n\n this.code = await formatHtml(template);\n this.changeDetectorRef.markForCheck();\n }\n\n private getActiveContent(): Record<string, string> {\n const formData: Record<string, boolean> =\n (this.form?.controls.content.value as Record<string, boolean>) ?? {};\n\n return objectKeys(formData).reduce((result: Record<string, string>, key: string) => {\n result[key] = formData[key] ? this.configuration?.content?.[key].template ?? '' : '';\n\n return result;\n }, {});\n }\n\n private getActiveInputs(): Record<string, string> {\n const formData: Record<string, unknown> =\n (this.form?.controls.properties.value as Record<string, unknown>) ?? {};\n\n return objectKeys(formData).reduce((result: Record<string, string>, key: string) => {\n const inputName = this.properties?.[key]?.inputName ?? key;\n const value: unknown = formData[key];\n const property: unknown | undefined = this.demoRef?.instance?.defaultValues[key];\n\n if (property !== value) {\n result[inputName] = stringify(value).replace(/\"/g, `'`);\n }\n\n return result;\n }, {});\n }\n\n private getPipeActiveInputs(): Record<string, string> {\n const formData: Record<string, unknown> =\n (this.form?.controls.properties.value as Record<string, unknown>) ?? {};\n let changedInputIndex: number = -1;\n\n return objectKeys(formData)\n .map((key: string, i: number) => {\n const value: unknown = formData[key];\n const defaultValue: unknown | undefined = this.demoRef?.instance?.defaultValues[key];\n\n if (defaultValue !== value) {\n changedInputIndex = i;\n }\n\n return key;\n })\n .slice(0, changedInputIndex + 1)\n .reduce((result: Record<string, string>, key: string) => {\n result[key] = stringify(formData[key]).replace(/\"/g, `'`);\n\n return result;\n }, {});\n }\n\n ngOnDestroy(): void {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n}\n","<ng-doc-demo-displayer [code]=\"code\" [border]=\"false\" [expanded]=\"expanded\" language=\"angular-html\">\n <ng-container #demoOutlet></ng-container>\n</ng-doc-demo-displayer>\n","import {\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n HostBinding,\n Input,\n OnChanges,\n SimpleChanges,\n ViewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { isPlaygroundProperty } from '@ng-doc/app/helpers';\nimport {\n NgDocProvidedTypeControl,\n NgDocTypeControl,\n NgDocTypeControlProviderOptions,\n} from '@ng-doc/app/interfaces';\nimport { NgDocSanitizeHtmlPipe } from '@ng-doc/app/pipes';\nimport { NgDocPlaygroundContent, NgDocPlaygroundProperty } from '@ng-doc/core/interfaces';\nimport { NgDocLabelComponent, NgDocTooltipDirective } from '@ng-doc/ui-kit';\n\n@Component({\n selector: 'ng-doc-playground-property',\n templateUrl: './playground-property.component.html',\n styleUrls: ['./playground-property.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgDocLabelComponent, NgDocTooltipDirective, NgDocSanitizeHtmlPipe],\n})\nexport class NgDocPlaygroundPropertyComponent implements OnChanges {\n @Input()\n name: string = '';\n\n @Input()\n property?: NgDocPlaygroundProperty | NgDocPlaygroundContent;\n\n @Input()\n typeControl?: NgDocProvidedTypeControl;\n\n @Input()\n control?: FormControl;\n\n @Input()\n defaultValue?: unknown;\n\n @ViewChild('propertyOutlet', { read: ViewContainerRef, static: true })\n propertyOutlet?: ViewContainerRef;\n\n protected option?: NgDocTypeControlProviderOptions;\n private propertyTypeControl?: ComponentRef<NgDocTypeControl>;\n\n ngOnChanges({ property, control, typeControl, defaultValue }: SimpleChanges): void {\n if ((property || control || typeControl || defaultValue) && this.property && this.typeControl) {\n this.propertyTypeControl?.destroy();\n this.propertyTypeControl = undefined;\n\n if (this.typeControl && this.propertyOutlet) {\n this.propertyTypeControl = this.propertyOutlet.createComponent(this.typeControl.control);\n this.propertyTypeControl.instance.name = this.name;\n this.propertyTypeControl.instance.description = this.tooltipContent;\n this.propertyTypeControl.instance.options = isPlaygroundProperty(this.property)\n ? this.property.options\n : undefined;\n this.propertyTypeControl.instance.default = this.defaultValue;\n this.propertyTypeControl.instance.isManual = isPlaygroundProperty(this.property)\n ? this.property.isManual\n : undefined;\n this.propertyTypeControl.instance.writeValue(this.control?.value);\n\n this.option = this.typeControl.options;\n }\n\n if (this.control) {\n this.control?.registerOnChange((value: string) =>\n this.propertyTypeControl?.instance?.writeValue(value),\n );\n this.propertyTypeControl?.instance.registerOnChange((value: unknown) =>\n this.control?.setValue(value),\n );\n this.propertyTypeControl?.instance.registerOnTouched(() => this.control?.markAsTouched());\n }\n }\n }\n\n @HostBinding('attr.data-has-property-control')\n get hasPropertyControl(): boolean {\n return !!this.propertyTypeControl;\n }\n\n get tooltipContent(): string {\n return this.property && isPlaygroundProperty(this.property)\n ? this.property.description ?? ''\n : '';\n }\n}\n","<label [ng-doc-label]=\"option?.hideLabel ? '' : labelContent\">\n\t<ng-template #labelContent>\n\t\t<span\n\t\t\t[ngDocTooltip]=\"tooltipTemplate\"\n\t\t\t[canOpen]=\"!!tooltipContent\"\n\t\t\t[positions]=\"['left-center', 'top-right', 'bottom-right']\"\n\t\t\t>{{ name }}</span\n\t\t>\n\t\t<ng-template #tooltipTemplate>\n\t\t\t<div [innerHTML]=\"tooltipContent | ngDocSanitizeHtml\"></div>\n\t\t</ng-template>\n\t</ng-template>\n\t<ng-container #propertyOutlet></ng-container>\n</label>\n","import { BreakpointObserver, Breakpoints, BreakpointState } from '@angular/cdk/layout';\nimport { AsyncPipe, KeyValuePipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n inject,\n InjectionToken,\n Injector,\n Input,\n isDevMode,\n OnChanges,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { FormControl, FormGroup, FormsModule } from '@angular/forms';\nimport { isPlaygroundProperty } from '@ng-doc/app/helpers';\nimport { NgDocProvidedTypeControl } from '@ng-doc/app/interfaces';\nimport { getTokenForType } from '@ng-doc/app/providers/type-control';\nimport { extractValueOrThrow } from '@ng-doc/core/helpers/extract-value';\nimport { isPresent } from '@ng-doc/core/helpers/is-present';\nimport { objectKeys } from '@ng-doc/core/helpers/object-keys';\nimport {\n NgDocPlaygroundContent,\n NgDocPlaygroundProperties,\n NgDocPlaygroundProperty,\n} from '@ng-doc/core/interfaces';\nimport {\n NgDocBindPipe,\n NgDocButtonComponent,\n NgDocCheckboxComponent,\n NgDocExecutePipe,\n NgDocIconComponent,\n NgDocTextComponent,\n NgDocTextRightDirective,\n NgDocTooltipDirective,\n} from '@ng-doc/ui-kit';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { NgDocPlaygroundForm } from '../playground-form';\nimport { NgDocPlaygroundPropertyComponent } from '../playground-property/playground-property.component';\nimport { NgDocPlaygroundPropertyControl } from '../playground-property-control';\n\n@Component({\n selector: 'ng-doc-playground-properties',\n templateUrl: './playground-properties.component.html',\n styleUrls: ['./playground-properties.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgDocTextComponent,\n NgDocButtonComponent,\n NgDocCheckboxComponent,\n FormsModule,\n NgDocTooltipDirective,\n NgDocIconComponent,\n NgDocTextRightDirective,\n NgDocPlaygroundPropertyComponent,\n AsyncPipe,\n KeyValuePipe,\n NgDocBindPipe,\n NgDocExecutePipe,\n ],\n})\nexport class NgDocPlaygroundPropertiesComponent<\n P extends NgDocPlaygroundProperties,\n C extends Record<string, NgDocPlaygroundContent>,\n> implements OnChanges\n{\n protected readonly breakpointObserver = inject(BreakpointObserver);\n private injector = inject(Injector);\n\n @Input()\n form!: FormGroup<NgDocPlaygroundForm>;\n\n @Input()\n properties?: P;\n\n @Input()\n ignoreInputs?: string[] = [];\n\n @Input()\n dynamicContent?: C;\n\n @Input()\n defaultValues?: Record<string, unknown>;\n\n @Input()\n hideSidePanel: boolean = false;\n\n @Input()\n recreateDemo: boolean = false;\n\n @Input()\n showResetButton: boolean = false;\n\n @Output()\n recreateDemoChange: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n @Output()\n resetForm: EventEmitter<void> = new EventEmitter<void>();\n\n readonly breakpoints: string[] = [Breakpoints.XSmall];\n readonly observer: Observable<boolean>;\n\n protected propertyControls: NgDocPlaygroundPropertyControl[] = [];\n protected contentTypeControl?: NgDocProvidedTypeControl = this.getControlForType('boolean');\n\n constructor() {\n this.observer = this.breakpointObserver\n .observe(this.breakpoints)\n .pipe(map((state: BreakpointState) => state.matches));\n }\n\n ngOnChanges({ properties }: SimpleChanges): void {\n if (properties && this.properties) {\n this.propertyControls = objectKeys(this.properties)\n .filter((key: keyof P) => this.ignoreInputs?.includes(String(key)) !== true)\n .map((key: keyof P) => {\n if (this.properties) {\n const property: NgDocPlaygroundProperty = this.properties[key];\n const typeControl: NgDocProvidedTypeControl | undefined = this.getTypeControl(property);\n\n if (typeControl) {\n return {\n propertyName: String(key),\n property,\n typeControl,\n };\n }\n }\n\n return null;\n })\n .filter(isPresent)\n .sort((a: NgDocPlaygroundPropertyControl, b: NgDocPlaygroundPropertyControl) => {\n const aOrder: number | undefined = a.typeControl.options?.order;\n const bOrder: number | undefined = b.typeControl.options?.order;\n\n if (isPresent(aOrder) && isPresent(bOrder)) {\n return aOrder - bOrder;\n }\n if (isPresent(aOrder)) {\n return -1;\n }\n if (isPresent(bOrder)) {\n return 1;\n }\n return a.property.inputName.localeCompare(b.property.inputName);\n });\n }\n }\n\n getFormControl(controlType: keyof NgDocPlaygroundForm, key: string): FormControl {\n return this.form.get(controlType)?.get(key) as FormControl;\n }\n\n private getTypeControl(property: NgDocPlaygroundProperty): NgDocProvidedTypeControl | undefined {\n const type: string = property.type;\n const typeControl: NgDocProvidedTypeControl | undefined =\n this.getControlForType(type) ??\n this.getControlForTypeAlias(\n isPlaygroundProperty(property) ? property.options : undefined,\n property.isManual,\n );\n\n if (!typeControl && isDevMode()) {\n console.warn(\n `NgDocPlayground didn't find the control for the @Input \"${property.inputName}\", the type \"${type}\" was not recognized'`,\n );\n }\n\n return typeControl;\n }\n\n private getControlForType(type: string): NgDocProvidedTypeControl | undefined {\n const token: InjectionToken<NgDocProvidedTypeControl> | undefined = getTokenForType(type);\n\n return token ? this.injector.get(token) : undefined;\n }\n\n private getControlForTypeAlias(\n options?: string[],\n isManual?: boolean,\n ): NgDocProvidedTypeControl | undefined {\n if (options && options.length) {\n let optionsIsValid: boolean = true;\n\n if (!isManual) {\n try {\n // checking that all values are extractable\n options.forEach((item: string) => extractValueOrThrow(item));\n } catch {\n optionsIsValid = false;\n }\n }\n\n if (optionsIsValid) {\n const token: InjectionToken<NgDocProvidedTypeControl> | undefined =\n getTokenForType('NgDocTypeAlias');\n\n return token ? this.injector.get(token) : undefined;\n }\n }\n\n return undefined;\n }\n}\n","@if (defaultValues) {\n <div class=\"ng-doc-playground-properties-wrapper\" [class.vertical]=\"observer | async\">\n <div class=\"ng-doc-playground-demos\">\n <ng-content></ng-content>\n </div>\n @if (!hideSidePanel) {\n <div class=\"ng-doc-playground-properties\">\n <div class=\"ng-doc-playground-header\">\n <h4 ng-doc-text>Playground</h4>\n @if (showResetButton) {\n <button ng-doc-button color=\"alert\" (click)=\"resetForm.emit()\">Reset</button>\n }\n </div>\n <div class=\"ng-doc-playground-setting\">\n <ng-doc-checkbox\n [(ngModel)]=\"recreateDemo\"\n (ngModelChange)=\"recreateDemoChange.emit($event)\">\n <span\n ng-doc-text\n [ngDocTooltip]=\"'Recreates demo everytime\\none of the input has changed'\"\n [positions]=\"['bottom-right', 'left-center']\">\n Recreate\n <ng-doc-icon icon=\"info\" ngDocTextRight></ng-doc-icon>\n </span>\n </ng-doc-checkbox>\n </div>\n <div class=\"ng-doc-playground-divider\"></div>\n @if (propertyControls.length) {\n <h5 class=\"ng-doc-title\" ng-doc-text>Settings</h5>\n @for (propertyControl of propertyControls; track propertyControl) {\n <ng-doc-playground-property\n [name]=\"propertyControl.property.inputName\"\n [property]=\"propertyControl.property\"\n [typeControl]=\"propertyControl.typeControl\"\n [defaultValue]=\"defaultValues[propertyControl.propertyName]\"\n [control]=\"\n getFormControl | bind: this | execute: 'properties' : propertyControl.propertyName\n \">\n </ng-doc-playground-property>\n }\n }\n @if ((dynamicContent | keyvalue)?.length) {\n <h5 class=\"ng-doc-title\" ng-doc-text>Content</h5>\n @for (content of dynamicContent | keyvalue; track content) {\n <ng-doc-playground-property\n [name]=\"content.value.label\"\n [property]=\"content.value\"\n [typeControl]=\"contentTypeControl\"\n [control]=\"getFormControl | bind: this | execute: 'content' : content.key\">\n </ng-doc-playground-property>\n }\n }\n </div>\n }\n </div>\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n inject,\n Input,\n OnChanges,\n SimpleChanges,\n} from '@angular/core';\nimport { FormBuilder, FormGroup } from '@angular/forms';\nimport { NgDocRootPage } from '@ng-doc/app/classes/root-page';\nimport { isSameObject } from '@ng-doc/core/helpers/is-same-object';\nimport { objectKeys } from '@ng-doc/core/helpers/object-keys';\nimport {\n NgDocPlaygroundConfig,\n NgDocPlaygroundOptions,\n NgDocPlaygroundProperties,\n} from '@ng-doc/core/interfaces';\nimport { NgDocAsArrayPipe } from '@ng-doc/ui-kit';\n\nimport { NgDocPlaygroundDemoComponent } from './playground-demo/playground-demo.component';\nimport { NgDocPlaygroundForm } from './playground-form';\nimport { NgDocPlaygroundPropertiesComponent } from './playground-properties/playground-properties.component';\n\n@Component({\n selector: 'ng-doc-playground',\n templateUrl: './playground.component.html',\n styleUrls: ['./playground.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgDocPlaygroundPropertiesComponent, NgDocPlaygroundDemoComponent, NgDocAsArrayPipe],\n})\nexport class NgDocPlaygroundComponent<\n T extends NgDocPlaygroundProperties = NgDocPlaygroundProperties,\n >\n implements OnChanges, AfterViewInit\n{\n private readonly rootPage = inject(NgDocRootPage);\n private readonly formBuilder = inject(FormBuilder);\n\n @Input({ required: true })\n id: string = '';\n\n @Input()\n pipeName: string = '';\n\n @Input()\n selectors: string[] = [];\n\n @Input()\n properties?: T;\n\n @Input()\n options: NgDocPlaygroundOptions = {};\n\n recreateDemo: boolean = false;\n formGroup!: FormGroup<NgDocPlaygroundForm>;\n defaultValues?: Record<string, unknown>;\n configuration!: NgDocPlaygroundConfig;\n\n private defaultProperties: Record<string, unknown> = {};\n private defaultContent: Record<string, boolean> = {};\n\n constructor() {}\n\n ngOnChanges({ options }: SimpleChanges) {\n if (options) {\n // Join configuration with options\n this.configuration = Object.assign(\n {},\n this.rootPage.page?.playgrounds?.[this.id],\n this.options,\n );\n }\n }\n\n ngAfterViewInit(): void {\n this.defaultProperties = this.getPropertiesFormValues();\n this.defaultContent = this.getContentFormValues();\n\n const propertiesForm: FormGroup = this.formBuilder.group(this.defaultProperties);\n const contentForm: FormGroup = this.formBuilder.group(this.defaultContent);\n\n this.formGroup = this.formBuilder.group({\n properties: propertiesForm,\n content: contentForm,\n });\n // `patchValue` is needed to set `undefined` values, otherwise they will be ignored by the Angular form\n this.formGroup.patchValue({\n properties: Object.assign({}, this.defaultProperties, this.configuration.inputs),\n content: this.defaultContent,\n });\n }\n\n protected isDefaultState(): boolean {\n if (!this.formGroup) {\n return false;\n }\n\n return (\n isSameObject(this.formGroup.value.properties ?? {}, this.defaultValues ?? {}) &&\n isSameObject(this.formGroup.value.content ?? {}, this.defaultContent ?? {})\n );\n }\n\n private getPropertiesFormValues(): Record<string, unknown> {\n const formValues: Record<string, unknown> = objectKeys(this.properties ?? {}).reduce(\n (controls: Record<string, unknown>, key: string) => {\n if (this.properties) {\n controls[key] = this.defaultValues ? this.defaultValues[key] : undefined;\n }\n\n return controls;\n },\n {} as Record<string, unknown>,\n );\n\n return Object.assign({}, formValues, this.configuration.defaults);\n }\n\n private getContentFormValues(): Record<string, boolean> {\n return objectKeys(this.configuration?.content ?? {}).reduce(\n (controls: Record<string, boolean>, key: string) => {\n if (this.configuration?.content) {\n controls[key] = false;\n }\n\n return controls;\n },\n {} as Record<keyof T, boolean>,\n );\n }\n\n resetForm(): void {\n this.formGroup.reset({}, { emitEvent: false });\n this.formGroup?.patchValue({\n properties: this.defaultProperties,\n content: this.defaultContent,\n });\n }\n}\n","@if (configuration) {\n <ng-doc-playground-properties\n [form]=\"formGroup\"\n [properties]=\"properties\"\n [ignoreInputs]=\"configuration.hiddenInputs\"\n [dynamicContent]=\"configuration.content\"\n [hideSidePanel]=\"configuration.hideSidePanel ?? false\"\n [defaultValues]=\"defaultValues\"\n [showResetButton]=\"!isDefaultState()\"\n [(recreateDemo)]=\"recreateDemo\"\n (resetForm)=\"resetForm()\">\n @for (selector of configuration.selectors ?? selectors | asArray; track selector) {\n <ng-doc-playground-demo\n [id]=\"id\"\n [selector]=\"selector\"\n [properties]=\"properties\"\n [configuration]=\"configuration\"\n [recreateDemo]=\"recreateDemo\"\n [form]=\"formGroup\"\n [expanded]=\"configuration.expanded ?? false\">\n </ng-doc-playground-demo>\n }\n @if (pipeName) {\n <ng-doc-playground-demo\n [id]=\"id\"\n [pipeName]=\"pipeName\"\n [properties]=\"properties\"\n [configuration]=\"configuration\"\n [recreateDemo]=\"recreateDemo\"\n [form]=\"formGroup\">\n </ng-doc-playground-demo>\n }\n </ng-doc-playground-properties>\n}\n","import {\n ChangeDetectorRef,\n Directive,\n inject,\n Input,\n OnInit,\n Type,\n ViewContainerRef,\n} from '@angular/core';\nimport { extractFunctionDefaults } from '@ng-doc/core/helpers/extract-function-defaults';\nimport { NgDocPlaygroundConfig } from '@ng-doc/core/interfaces';\nimport { Constructor } from '@ng-doc/core/types';\nimport { Observable, Subject, take } from 'rxjs';\n\nimport { NgDocPlaygroundComponent } from './playground.component';\n\n/**\n * Base class for playgrounds components.\n */\n@Directive()\nexport abstract class NgDocBasePlayground implements Pick<NgDocPlaygroundConfig, 'data'>, OnInit {\n static readonly selector: string = 'unknown';\n abstract readonly playground?: Type<any>;\n abstract readonly viewContainerRef?: ViewContainerRef;\n abstract readonly configData: Record<string, unknown>;\n\n @Input()\n properties: Record<string, any> = {};\n\n @Input()\n actionData: Record<string, unknown> = {};\n\n @Input()\n content: any = {};\n\n defaultValues: Record<string, unknown> = {};\n\n private reattached: Subject<void> = new Subject<void>();\n\n private playgroundContainer: NgDocPlaygroundComponent = inject(NgDocPlaygroundComponent);\n protected changeDetectorRef: ChangeDetectorRef = inject(ChangeDetectorRef);\n\n protected constructor(private playgroundInstance?: Constructor<unknown>) {\n this.changeDetectorRef.detach();\n }\n\n get onReattached(): Observable<void> {\n return this.reattached.pipe(take(1));\n }\n\n ngOnInit(): void {\n /*\n * Extract default values from playground properties. We do this in `ngOnInit` because in this case\n * input values provided from the template are not initialized yet, and we can read default values instead.\n */\n if (this.playground) {\n this.defaultValues = Object.keys(this.playground).reduce(\n (values: Record<string, unknown>, key: string) => {\n if (this.playground) {\n try {\n values[key] =\n // @ts-expect-error we do not know the type of the playground\n typeof this.playground[key] === 'function'\n ? // @ts-expect-error we do not know the type of the playground\n this.playground[key]()\n : // @ts-expect-error we do not know the type of the playground\n this.playground[key];\n } catch (e) {\n // we do catch here because some of the playground properties can be getters and throw an error\n }\n }\n\n return values;\n },\n {},\n );\n } else if (this.playgroundInstance) {\n const defaults = extractFunctionDefaults(this.playgroundInstance.prototype.transform);\n\n this.defaultValues = Object.keys(this.playgroundContainer.properties ?? {}).reduce(\n (def: Record<string, unknown>, key: string, i: number) => {\n // we do +1 because the first argument is the `value` of the transform function\n def[key] = defaults[i + 1];\n\n return def;\n },\n {},\n );\n } else {\n throw new Error('Playground is not defined or initialized');\n }\n\n if (!this.playgroundContainer.defaultValues) {\n this.playgroundContainer.defaultValues = this.defaultValues;\n }\n\n /*\n This is a hack just to wait for the playground container to be initialized and only then\n attach the change detector to have correct inputs values.\n */\n Promise.resolve().then(() => {\n this.changeDetectorRef.reattach();\n this.reattached.next();\n });\n }\n\n get data(): any {\n return Object.assign({}, this.configData, this.actionData);\n }\n}\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-playground.mjs","sources":["../../../../libs/app/components/playground/playground-demo/playground-demo.component.ts","../../../../libs/app/components/playground/playground-demo/playground-demo.component.html","../../../../libs/app/components/playground/playground-property/playground-property.component.ts","../../../../libs/app/components/playground/playground-property/playground-property.component.html","../../../../libs/app/components/playground/playground-properties/playground-properties.component.ts","../../../../libs/app/components/playground/playground-properties/playground-properties.component.html","../../../../libs/app/components/playground/playground.component.ts","../../../../libs/app/components/playground/playground.component.html","../../../../libs/app/components/playground/base-playground.ts","../../../../libs/app/components/playground/ng-doc-app-components-playground.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n DestroyRef,\n inject,\n InjectionToken,\n Injector,\n input,\n InputSignal,\n OnChanges,\n OnDestroy,\n PendingTasks,\n Signal,\n signal,\n SimpleChanges,\n Type,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormGroup } from '@angular/forms';\nimport { NgDocDemoDisplayerComponent } from '@ng-doc/app/components/demo-displayer';\nimport { formatHtml } from '@ng-doc/app/helpers';\nimport { getPlaygroundDemoToken } from '@ng-doc/app/providers/playground-demo';\nimport { NgDocFormPartialValue } from '@ng-doc/app/types';\nimport {\n buildPlaygroundDemoPipeTemplate,\n buildPlaygroundDemoTemplate,\n} from '@ng-doc/core/helpers/build-playground-demo-template';\nimport { objectKeys } from '@ng-doc/core/helpers/object-keys';\nimport { stringify } from '@ng-doc/core/helpers/stringify';\nimport { NgDocPlaygroundConfig, NgDocPlaygroundProperties } from '@ng-doc/core/interfaces';\nimport { Subject } from 'rxjs';\nimport { startWith, takeUntil } from 'rxjs/operators';\n\nimport { NgDocBasePlayground } from '../base-playground';\nimport { NgDocPlaygroundForm } from '../playground-form';\n\n/**\n * One demo of a playground: it creates the generated playground class of its selector (or pipe),\n * passes it the form's values and shows the code of the current state.\n */\n@Component({\n selector: 'ng-doc-playground-demo',\n templateUrl: './playground-demo.component.html',\n styleUrls: ['./playground-demo.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgDocDemoDisplayerComponent],\n})\nexport class NgDocPlaygroundDemoComponent<\n T extends NgDocPlaygroundProperties = NgDocPlaygroundProperties,\n >\n implements OnChanges, OnDestroy\n{\n /** The name of the playground in the page configuration. */\n readonly id: InputSignal<string> = input<string>('');\n\n /** The name of the pipe, when the target is a pipe. */\n readonly pipeName: InputSignal<string> = input<string>('');\n\n /** The selector of the target this demo renders. */\n readonly selector: InputSignal<string> = input<string>('');\n\n /** The playground configuration, extended by the action's options. */\n readonly configuration: InputSignal<NgDocPlaygroundConfig | undefined> = input<\n NgDocPlaygroundConfig | undefined\n >(undefined);\n\n /** The inputs of the target. */\n readonly properties: InputSignal<T | undefined> = input<T | undefined>(undefined);\n\n /** Whether the demo is created again each time a value changes. */\n readonly recreateDemo: InputSignal<boolean> = input<boolean>(false);\n\n /** The values of the inputs and content slots. */\n readonly form: InputSignal<FormGroup<NgDocPlaygroundForm> | undefined> = input<\n FormGroup<NgDocPlaygroundForm> | undefined\n >(undefined);\n\n /** Whether the code of the demo is shown. */\n readonly expanded: InputSignal<boolean> = input<boolean>(false);\n\n /** Where the playground class is created. */\n readonly demoOutlet: Signal<ViewContainerRef | undefined> = viewChild('demoOutlet', {\n read: ViewContainerRef,\n });\n\n /** The generated playground class of this demo's selector or pipe. */\n playgroundDemo?: typeof NgDocBasePlayground;\n\n protected readonly code = signal('');\n\n protected readonly injector = inject(Injector);\n protected readonly destroyRef = inject(DestroyRef);\n private readonly pendingTasks = inject(PendingTasks);\n\n private demoRef?: ComponentRef<NgDocBasePlayground>;\n private readonly unsubscribe$: Subject<void> = new Subject<void>();\n\n async ngOnChanges({ form, id }: SimpleChanges): Promise<void> {\n if (form || id) {\n this.unsubscribe$.next();\n\n const demoInjector: InjectionToken<Array<typeof NgDocBasePlayground>> | undefined =\n getPlaygroundDemoToken(this.id());\n\n if (demoInjector) {\n const demos: Array<typeof NgDocBasePlayground> = this.injector.get(demoInjector, []);\n\n this.playgroundDemo = demos.find(\n (demo: typeof NgDocBasePlayground) =>\n demo.selector === this.selector() || demo.selector === this.pipeName(),\n );\n }\n\n await this.updateDemo();\n\n const form = this.form();\n\n form?.valueChanges\n .pipe(\n startWith(form.value),\n takeUntil(this.unsubscribe$),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((data: NgDocFormPartialValue<FormGroup<NgDocPlaygroundForm>>) =>\n this.updateDemo(data),\n );\n }\n }\n\n private async updateDemo(\n data?: NgDocFormPartialValue<FormGroup<NgDocPlaygroundForm>>,\n ): Promise<void> {\n if (this.recreateDemo() || !this.demoRef) {\n this.createDemo();\n }\n\n if (data) {\n this.demoRef?.setInput('properties', data.properties ?? {});\n this.demoRef?.setInput('content', data.content ?? {});\n this.demoRef?.setInput('actionData', this.configuration()?.data ?? {});\n\n if (this.recreateDemo()) {\n this.demoRef?.instance.onReattached.subscribe(() => {\n this.demoRef?.changeDetectorRef.detectChanges();\n });\n }\n }\n\n await this.updateCodeView();\n }\n\n private createDemo(): void {\n if (this.playgroundDemo) {\n this.demoRef?.destroy();\n this.demoRef = this.demoOutlet()?.createComponent(\n this.playgroundDemo as unknown as Type<NgDocBasePlayground>,\n );\n this.demoRef?.changeDetectorRef.markForCheck();\n }\n }\n\n private async updateCodeView(): Promise<void> {\n const template: string = this.pipeName()\n ? buildPlaygroundDemoPipeTemplate(\n this.configuration()?.template ?? '',\n this.pipeName(),\n this.getActiveContent(),\n this.getPipeActiveInputs(),\n )\n : buildPlaygroundDemoTemplate(\n this.configuration()?.template ?? '',\n this.selector(),\n this.getActiveContent(),\n this.getActiveInputs(),\n );\n\n // Formatting loads the formatter asynchronously. Zoneless SSR waits only for pending tasks, so\n // the page would otherwise be serialized before the code view is filled.\n const done = this.pendingTasks.add();\n\n try {\n this.code.set(await formatHtml(template));\n } finally {\n done();\n }\n }\n\n private getActiveContent(): Record<string, string> {\n const formData: Record<string, boolean> =\n (this.form()?.controls.content.value as Record<string, boolean>) ?? {};\n\n return objectKeys(formData).reduce((result: Record<string, string>, key: string) => {\n result[key] = formData[key] ? this.configuration()?.content?.[key].template ?? '' : '';\n\n return result;\n }, {});\n }\n\n private getActiveInputs(): Record<string, string> {\n const formData: Record<string, unknown> =\n (this.form()?.controls.properties.value as Record<string, unknown>) ?? {};\n\n return objectKeys(formData).reduce((result: Record<string, string>, key: string) => {\n const inputName = this.properties()?.[key]?.inputName ?? key;\n const value: unknown = formData[key];\n const property: unknown | undefined = this.demoRef?.instance?.defaultValues[key];\n\n if (property !== value) {\n result[inputName] = stringify(value).replace(/\"/g, `'`);\n }\n\n return result;\n }, {});\n }\n\n private getPipeActiveInputs(): Record<string, string> {\n const formData: Record<string, unknown> =\n (this.form()?.controls.properties.value as Record<string, unknown>) ?? {};\n let changedInputIndex: number = -1;\n\n return objectKeys(formData)\n .map((key: string, i: number) => {\n const value: unknown = formData[key];\n const defaultValue: unknown | undefined = this.demoRef?.instance?.defaultValues[key];\n\n if (defaultValue !== value) {\n changedInputIndex = i;\n }\n\n return key;\n })\n .slice(0, changedInputIndex + 1)\n .reduce((result: Record<string, string>, key: string) => {\n result[key] = stringify(formData[key]).replace(/\"/g, `'`);\n\n return result;\n }, {});\n }\n\n ngOnDestroy(): void {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n}\n","<ng-doc-demo-displayer\n [code]=\"code()\"\n [border]=\"false\"\n [expanded]=\"expanded()\"\n language=\"angular-html\">\n <ng-container #demoOutlet></ng-container>\n</ng-doc-demo-displayer>\n","import {\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n reflectComponentType,\n Signal,\n signal,\n untracked,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { NgDocKindIconComponent } from '@ng-doc/app/components/kind-icon';\nimport { isPlaygroundProperty } from '@ng-doc/app/helpers';\nimport {\n NgDocProvidedTypeControl,\n NgDocTypeControl,\n NgDocTypeControlProviderOptions,\n} from '@ng-doc/app/interfaces';\nimport { NgDocSanitizeHtmlPipe } from '@ng-doc/app/pipes';\nimport { extractValueOrThrow } from '@ng-doc/core/helpers/extract-value';\nimport { NgDocPlaygroundContent, NgDocPlaygroundProperty } from '@ng-doc/core/interfaces';\nimport { NgDocLabelComponent, NgDocTooltipDirective } from '@ng-doc/ui-kit';\n\n/** Value types that have a chip colour. */\nconst CHIP_TYPES: ReadonlySet<string> = new Set([\n 'string',\n 'number',\n 'boolean',\n 'object',\n 'null',\n 'undefined',\n]);\n\n/**\n * One row of the playground inspector: the input's name with its type chip, and the type\n * control that edits it, bound to the input's form control.\n */\n@Component({\n selector: 'ng-doc-playground-property',\n templateUrl: './playground-property.component.html',\n styleUrls: ['./playground-property.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgDocLabelComponent,\n NgDocTooltipDirective,\n NgDocSanitizeHtmlPipe,\n NgDocKindIconComponent,\n ],\n host: {\n '[attr.data-has-property-control]': 'hasPropertyControl()',\n },\n})\nexport class NgDocPlaygroundPropertyComponent {\n /** Name of the input. */\n readonly name = input<string>('');\n\n /** The input, or the content slot. */\n readonly property = input<NgDocPlaygroundProperty | NgDocPlaygroundContent | undefined>(\n undefined,\n );\n\n /** The type control that edits the input. */\n readonly typeControl = input<NgDocProvidedTypeControl | undefined>(undefined);\n\n /** Form control of the input. */\n readonly control = input<FormControl | undefined>(undefined);\n\n /** Default value of the input. */\n readonly defaultValue = input<unknown>(undefined);\n\n /** Whether a type control is rendered. */\n readonly hasPropertyControl = signal<boolean>(false);\n\n /** Description of the input, shown in the tooltip of its name. */\n protected readonly tooltipContent: Signal<string> = computed(() => {\n const property: NgDocPlaygroundProperty | NgDocPlaygroundContent | undefined = this.property();\n\n return property && isPlaygroundProperty(property) ? property.description ?? '' : '';\n });\n\n /** Options of the type control provider. */\n protected readonly option: Signal<NgDocTypeControlProviderOptions | undefined> = computed(\n () => this.typeControl()?.options,\n );\n\n /** The value type shown as a chip under the name, or an empty string. */\n protected readonly typeChip: Signal<string> = computed(() => valueType(this.property()));\n\n private readonly propertyOutlet = viewChild.required('propertyOutlet', {\n read: ViewContainerRef,\n });\n\n private propertyTypeControl?: ComponentRef<NgDocTypeControl>;\n\n constructor() {\n // A plain effect, not an after-render hook: it runs during change detection on the server\n // too, so server-rendered and prerendered pages include the controls. The outlet is a static\n // node of this view, so it exists by then. It runs again only when an input it reads changes.\n effect(() => {\n const property = this.property();\n const typeControl: NgDocProvidedTypeControl | undefined = this.typeControl();\n const control: FormControl | undefined = this.control();\n const defaultValue: unknown = this.defaultValue();\n\n untracked(() => this.createControl(property, typeControl, control, defaultValue));\n });\n\n inject(DestroyRef).onDestroy(() => this.propertyTypeControl?.destroy());\n }\n\n private createControl(\n property: NgDocPlaygroundProperty | NgDocPlaygroundContent | undefined,\n typeControl: NgDocProvidedTypeControl | undefined,\n formControl: FormControl | undefined,\n defaultValue: unknown,\n ): void {\n if (!property || !typeControl) {\n return;\n }\n\n this.propertyTypeControl?.destroy();\n\n const control: ComponentRef<NgDocTypeControl> = this.propertyOutlet().createComponent(\n typeControl.control,\n );\n\n this.propertyTypeControl = control;\n setTypeControlField(control, 'name', this.name());\n setTypeControlField(control, 'description', this.tooltipContent());\n setTypeControlField(\n control,\n 'options',\n isPlaygroundProperty(property) ? property.options : undefined,\n );\n setTypeControlField(control, 'default', defaultValue);\n setTypeControlField(\n control,\n 'isManual',\n isPlaygroundProperty(property) ? property.isManual : undefined,\n );\n control.instance.writeValue(formControl?.value);\n\n if (formControl) {\n formControl.registerOnChange((value: unknown) => control.instance.writeValue(value));\n control.instance.registerOnChange((value: unknown) => formControl.setValue(value));\n control.instance.registerOnTouched(() => formControl.markAsTouched());\n }\n\n this.hasPropertyControl.set(true);\n }\n}\n\n/**\n * The value type of an input: its declared type when it is a primitive, else the type of the first\n * value of its type alias. Content slots are booleans.\n * @param property - The input or the content slot.\n */\nfunction valueType(property: NgDocPlaygroundProperty | NgDocPlaygroundContent | undefined): string {\n if (!property) {\n return '';\n }\n\n if (!isPlaygroundProperty(property)) {\n return 'boolean';\n }\n\n if (CHIP_TYPES.has(property.type)) {\n return property.type;\n }\n\n const option: string | undefined = property.options?.[0];\n\n if (option !== undefined) {\n try {\n const type: string = typeof (property.isManual ? option : extractValueOrThrow(option));\n\n return CHIP_TYPES.has(type) ? type : '';\n } catch {\n return '';\n }\n }\n\n return '';\n}\n\n/**\n * Sets a field of a type control: through `ComponentRef.setInput()` when the control declares it\n * as an input (a signal input or a decorator input), otherwise by assigning the plain field.\n * @param control - The created type control.\n * @param field - Name of the field.\n * @param value - Value to set.\n */\nfunction setTypeControlField(\n control: ComponentRef<NgDocTypeControl>,\n field: keyof NgDocTypeControl,\n value: unknown,\n): void {\n const input = reflectComponentType(control.componentType)?.inputs.find(\n ({ propName }: { propName: string }) => propName === field,\n );\n\n if (input) {\n control.setInput(input.templateName, value);\n } else {\n (control.instance as unknown as Record<string, unknown>)[field] = value;\n }\n}\n","<label\n class=\"ng-doc-playground-property-label\"\n [class.with-label]=\"!option()?.hideLabel\"\n [ng-doc-label]=\"option()?.hideLabel ? '' : labelContent\">\n <ng-template #labelContent>\n <span\n class=\"ng-doc-playground-property-name\"\n [ngDocTooltip]=\"tooltipTemplate\"\n [canOpen]=\"!!tooltipContent()\"\n [positions]=\"['left-center', 'top-right', 'bottom-right']\"\n >{{ name() }}</span\n >\n @if (typeChip(); as type) {\n <ng-doc-kind-icon [kind]=\"type\" type=\"type\"></ng-doc-kind-icon>\n }\n <ng-template #tooltipTemplate>\n <div [innerHTML]=\"tooltipContent() | ngDocSanitizeHtml\"></div>\n </ng-template>\n </ng-template>\n <ng-container #propertyOutlet></ng-container>\n</label>\n","import { KeyValuePipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n InjectionToken,\n Injector,\n input,\n isDevMode,\n model,\n output,\n Signal,\n} from '@angular/core';\nimport { FormControl, FormGroup, FormsModule } from '@angular/forms';\nimport { isPlaygroundProperty } from '@ng-doc/app/helpers';\nimport { NgDocProvidedTypeControl } from '@ng-doc/app/interfaces';\nimport { getTokenForType } from '@ng-doc/app/providers/type-control';\nimport { extractValueOrThrow } from '@ng-doc/core/helpers/extract-value';\nimport { isPresent } from '@ng-doc/core/helpers/is-present';\nimport { objectKeys } from '@ng-doc/core/helpers/object-keys';\nimport {\n NgDocPlaygroundContent,\n NgDocPlaygroundProperties,\n NgDocPlaygroundProperty,\n} from '@ng-doc/core/interfaces';\nimport {\n NgDocBindPipe,\n NgDocCheckboxComponent,\n NgDocExecutePipe,\n NgDocIconComponent,\n NgDocTooltipDirective,\n} from '@ng-doc/ui-kit';\n\nimport { NgDocPlaygroundForm } from '../playground-form';\nimport { NgDocPlaygroundPropertyComponent } from '../playground-property/playground-property.component';\nimport { NgDocPlaygroundPropertyControl } from '../playground-property-control';\n\n/**\n * Orders inputs without an `order` by name in English whatever the locale, so a prerendered\n * playground does not depend on the machine that built it.\n */\nconst INPUT_ORDER = new Intl.Collator('en');\n\n/**\n * The playground inspector: the demos, and beside them (below them in a container narrower than\n * 640px) the Recreate setting and a control per input and content slot.\n */\n@Component({\n selector: 'ng-doc-playground-properties',\n templateUrl: './playground-properties.component.html',\n styleUrls: ['./playground-properties.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgDocCheckboxComponent,\n FormsModule,\n NgDocTooltipDirective,\n NgDocIconComponent,\n NgDocPlaygroundPropertyComponent,\n KeyValuePipe,\n NgDocBindPipe,\n NgDocExecutePipe,\n ],\n})\nexport class NgDocPlaygroundPropertiesComponent<\n P extends NgDocPlaygroundProperties,\n C extends Record<string, NgDocPlaygroundContent>,\n> {\n private readonly injector = inject(Injector);\n\n /** The form of the playground. */\n readonly form = input.required<FormGroup<NgDocPlaygroundForm>>();\n\n /** The inputs of the playground's target. */\n readonly properties = input<P | undefined>(undefined);\n\n /** Inputs that get no control. */\n readonly ignoreInputs = input<string[] | undefined>([]);\n\n /** Content slots of the playground. */\n readonly dynamicContent = input<C | undefined>(undefined);\n\n /** Default values of the inputs; the inspector renders once they are known. */\n readonly defaultValues = input<Record<string, unknown> | undefined>(undefined);\n\n /** Whether the inspector is hidden, leaving the demos only. */\n readonly hideSidePanel = input<boolean>(false);\n\n /** Where the inspector goes: right of the demos, or below them at full width. */\n readonly inspectorPosition = input<'right' | 'bottom'>('right');\n\n /** Whether the demo is recreated each time an input changes. */\n readonly recreateDemo = model<boolean>(false);\n\n /** Whether the Reset button is shown. */\n readonly showResetButton = input<boolean>(false);\n\n /** Emits when the reader resets the form. */\n readonly resetForm = output<void>();\n\n /** The control of each input, in display order. */\n protected readonly propertyControls: Signal<NgDocPlaygroundPropertyControl[]> = computed(() => {\n const properties: P | undefined = this.properties();\n const ignoreInputs: string[] | undefined = this.ignoreInputs();\n\n if (!properties) {\n return [];\n }\n\n return objectKeys(properties)\n .filter((key: keyof P) => ignoreInputs?.includes(String(key)) !== true)\n .map((key: keyof P) => {\n const property: NgDocPlaygroundProperty = properties[key];\n const typeControl: NgDocProvidedTypeControl | undefined = this.getTypeControl(property);\n\n return typeControl ? { propertyName: String(key), property, typeControl } : null;\n })\n .filter(isPresent)\n .sort((a: NgDocPlaygroundPropertyControl, b: NgDocPlaygroundPropertyControl) => {\n const aOrder: number | undefined = a.typeControl.options?.order;\n const bOrder: number | undefined = b.typeControl.options?.order;\n\n if (isPresent(aOrder) && isPresent(bOrder)) {\n return aOrder - bOrder;\n }\n if (isPresent(aOrder)) {\n return -1;\n }\n if (isPresent(bOrder)) {\n return 1;\n }\n return INPUT_ORDER.compare(a.property.inputName, b.property.inputName);\n });\n });\n\n /** The control of content slots. */\n protected readonly contentTypeControl?: NgDocProvidedTypeControl =\n this.getControlForType('boolean');\n\n /**\n * The form control of an input or a content slot.\n * @param controlType - `properties` or `content`.\n * @param key - Name of the input or slot.\n */\n getFormControl(controlType: keyof NgDocPlaygroundForm, key: string): FormControl {\n return this.form().get(controlType)?.get(key) as FormControl;\n }\n\n private getTypeControl(property: NgDocPlaygroundProperty): NgDocProvidedTypeControl | undefined {\n const type: string = property.type;\n const primitive: string | undefined = optionalPrimitive(type);\n const typeControl: NgDocProvidedTypeControl | undefined =\n this.getControlForType(type) ??\n (primitive ? this.getControlForType(primitive) : undefined) ??\n this.getControlForTypeAlias(\n isPlaygroundProperty(property) ? property.options : undefined,\n property.isManual,\n );\n\n if (!typeControl && isDevMode()) {\n console.warn(\n `NgDocPlayground didn't find the control for the @Input \"${property.inputName}\", the type \"${type}\" was not recognized'`,\n );\n }\n\n return typeControl;\n }\n\n private getControlForType(type: string): NgDocProvidedTypeControl | undefined {\n const token: InjectionToken<NgDocProvidedTypeControl> | undefined = getTokenForType(type);\n\n return token ? this.injector.get(token) : undefined;\n }\n\n private getControlForTypeAlias(\n options?: string[],\n isManual?: boolean,\n ): NgDocProvidedTypeControl | undefined {\n if (options && options.length) {\n let optionsIsValid: boolean = true;\n\n if (!isManual) {\n try {\n // checking that all values are extractable\n options.forEach((item: string) => extractValueOrThrow(item));\n } catch {\n optionsIsValid = false;\n }\n }\n\n if (optionsIsValid) {\n const token: InjectionToken<NgDocProvidedTypeControl> | undefined =\n getTokenForType('NgDocTypeAlias');\n\n return token ? this.injector.get(token) : undefined;\n }\n }\n\n return undefined;\n }\n}\n\n/** The types whose control also edits an optional or nullable input of the type. */\nconst PRIMITIVE_TYPES: ReadonlySet<string> = new Set(['string', 'number', 'boolean']);\n\n/**\n * The primitive of an optional or nullable primitive input type, such as `string` of\n * `string | undefined` (an optional `@Input() label?: string`, `input<string>()` or\n * `model<string>()`) or of `number | null`, so that the input gets the primitive's control.\n * Other types are matched by their exact name only: a custom control registered for `Position`\n * does not receive the `undefined` of a `Position | undefined` input unless it is registered for\n * that type too.\n * @param type - The input type as the builder printed it.\n * @returns The primitive, or `undefined` when the type is not one.\n */\nfunction optionalPrimitive(type: string): string | undefined {\n const members: string[] = type.split('|').map((member: string) => member.trim());\n const rest: string[] = members.filter(\n (member: string) => member !== 'undefined' && member !== 'null',\n );\n\n return rest.length === 1 && rest.length < members.length && PRIMITIVE_TYPES.has(rest[0])\n ? rest[0]\n : undefined;\n}\n","@if (defaultValues(); as defaultValues) {\n <div\n class=\"ng-doc-playground-properties-wrapper\"\n [class.no-side-panel]=\"hideSidePanel()\"\n [class.inspector-bottom]=\"inspectorPosition() === 'bottom'\">\n <div class=\"ng-doc-playground-demos\">\n <ng-content></ng-content>\n </div>\n @if (!hideSidePanel()) {\n <div class=\"ng-doc-playground-properties\">\n <div class=\"ng-doc-playground-header\">\n <h4>Playground</h4>\n @if (showResetButton()) {\n <button type=\"button\" class=\"ng-doc-playground-reset\" (click)=\"resetForm.emit()\">\n Reset\n </button>\n }\n </div>\n <div class=\"ng-doc-playground-setting\">\n <ng-doc-checkbox [ngModel]=\"recreateDemo()\" (ngModelChange)=\"recreateDemo.set($event)\">\n Recreate\n </ng-doc-checkbox>\n <ng-doc-icon\n class=\"ng-doc-playground-info\"\n icon=\"info\"\n role=\"img\"\n aria-label=\"Recreates the demo every time one of the inputs changes\"\n [ngDocTooltip]=\"'Recreates the demo every time one of the inputs changes'\"\n [positions]=\"['bottom-right', 'left-center']\"></ng-doc-icon>\n </div>\n <div class=\"ng-doc-playground-divider\"></div>\n @if (propertyControls().length) {\n <h5 class=\"ng-doc-title\">Settings</h5>\n <div class=\"ng-doc-playground-property-list\">\n @for (propertyControl of propertyControls(); track propertyControl.propertyName) {\n <ng-doc-playground-property\n [name]=\"propertyControl.property.inputName\"\n [property]=\"propertyControl.property\"\n [typeControl]=\"propertyControl.typeControl\"\n [defaultValue]=\"defaultValues[propertyControl.propertyName]\"\n [control]=\"\n getFormControl | bind: this | execute: 'properties' : propertyControl.propertyName\n \">\n </ng-doc-playground-property>\n }\n </div>\n }\n @if ((dynamicContent() | keyvalue)?.length) {\n <h5 class=\"ng-doc-title\">Content</h5>\n <div class=\"ng-doc-playground-property-list\">\n @for (content of dynamicContent() | keyvalue; track content.key) {\n <ng-doc-playground-property\n [name]=\"content.value.label\"\n [property]=\"content.value\"\n [typeControl]=\"contentTypeControl\"\n [control]=\"getFormControl | bind: this | execute: 'content' : content.key\">\n </ng-doc-playground-property>\n }\n </div>\n }\n </div>\n }\n </div>\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n InputSignal,\n Signal,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { FormBuilder, FormGroup } from '@angular/forms';\nimport { NgDocRootPage } from '@ng-doc/app/classes/root-page';\nimport { isSameObject } from '@ng-doc/core/helpers/is-same-object';\nimport { objectKeys } from '@ng-doc/core/helpers/object-keys';\nimport {\n NgDocPlaygroundConfig,\n NgDocPlaygroundOptions,\n NgDocPlaygroundProperties,\n} from '@ng-doc/core/interfaces';\nimport { NgDocAsArrayPipe } from '@ng-doc/ui-kit';\n\nimport { NgDocPlaygroundDemoComponent } from './playground-demo/playground-demo.component';\nimport { NgDocPlaygroundForm } from './playground-form';\nimport { NgDocPlaygroundPropertiesComponent } from './playground-properties/playground-properties.component';\n\n/**\n * A playground: an inspector with a control per input and content slot of its target, and a demo\n * per selector (or the pipe) rendered with the chosen values.\n */\n@Component({\n selector: 'ng-doc-playground',\n templateUrl: './playground.component.html',\n styleUrls: ['./playground.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgDocPlaygroundPropertiesComponent, NgDocPlaygroundDemoComponent, NgDocAsArrayPipe],\n})\nexport class NgDocPlaygroundComponent<\n T extends NgDocPlaygroundProperties = NgDocPlaygroundProperties,\n> implements AfterViewInit\n{\n private readonly rootPage = inject(NgDocRootPage);\n private readonly formBuilder = inject(FormBuilder);\n\n /** The name of the playground in the page configuration. */\n readonly id: InputSignal<string> = input.required<string>();\n\n /** The name of the pipe, when the target is a pipe. */\n readonly pipeName: InputSignal<string> = input<string>('');\n\n /** The selectors of the target to render a demo for. */\n readonly selectors: InputSignal<string[]> = input<string[]>([]);\n\n /** The inputs of the target. */\n readonly properties: InputSignal<T | undefined> = input<T | undefined>(undefined);\n\n /** Options of the playground action; they extend the playground configuration. */\n readonly options: InputSignal<NgDocPlaygroundOptions> = input<NgDocPlaygroundOptions>({});\n\n /** Whether the demo is created again each time a value changes. */\n readonly recreateDemo: WritableSignal<boolean> = signal(false);\n\n /** The values of the inputs and content slots. */\n readonly formGroup: WritableSignal<FormGroup<NgDocPlaygroundForm> | undefined> =\n signal(undefined);\n\n /** The default values of the target's inputs, reported by the first demo. */\n readonly defaultValues: WritableSignal<Record<string, unknown> | undefined> = signal(undefined);\n\n /** The playground configuration of the page, extended by the options. */\n readonly configuration: Signal<NgDocPlaygroundConfig> = computed(() =>\n Object.assign({}, this.rootPage.page?.playgrounds?.[this.id()], this.options()),\n );\n\n private defaultProperties: Record<string, unknown> = {};\n private defaultContent: Record<string, boolean> = {};\n\n ngAfterViewInit(): void {\n this.defaultProperties = this.getPropertiesFormValues();\n this.defaultContent = this.getContentFormValues();\n\n const propertiesForm: FormGroup = this.formBuilder.group(this.defaultProperties);\n const contentForm: FormGroup = this.formBuilder.group(this.defaultContent);\n const formGroup: FormGroup<NgDocPlaygroundForm> = this.formBuilder.group({\n properties: propertiesForm,\n content: contentForm,\n });\n\n // `patchValue` is needed to set `undefined` values, otherwise they will be ignored by the Angular form\n formGroup.patchValue({\n properties: Object.assign({}, this.defaultProperties, this.configuration().inputs),\n content: this.defaultContent,\n });\n this.formGroup.set(formGroup);\n }\n\n protected isDefaultState(): boolean {\n const formGroup = this.formGroup();\n\n if (!formGroup) {\n return false;\n }\n\n return (\n isSameObject(formGroup.value.properties ?? {}, this.defaultValues() ?? {}) &&\n isSameObject(formGroup.value.content ?? {}, this.defaultContent ?? {})\n );\n }\n\n private getPropertiesFormValues(): Record<string, unknown> {\n const defaultValues = this.defaultValues();\n const formValues: Record<string, unknown> = objectKeys(this.properties() ?? {}).reduce(\n (controls: Record<string, unknown>, key: string) => {\n controls[key] = defaultValues ? defaultValues[key] : undefined;\n\n return controls;\n },\n {} as Record<string, unknown>,\n );\n\n return Object.assign({}, formValues, this.configuration().defaults);\n }\n\n private getContentFormValues(): Record<string, boolean> {\n return objectKeys(this.configuration().content ?? {}).reduce(\n (controls: Record<string, boolean>, key: string) => {\n controls[key] = false;\n\n return controls;\n },\n {} as Record<keyof T, boolean>,\n );\n }\n\n /** Sets every input and content slot back to its default value. */\n resetForm(): void {\n const formGroup = this.formGroup();\n\n formGroup?.reset({}, { emitEvent: false });\n formGroup?.patchValue({\n properties: this.defaultProperties,\n content: this.defaultContent,\n });\n }\n}\n","@if (configuration(); as configuration) {\n <ng-doc-playground-properties\n [form]=\"formGroup()!\"\n [properties]=\"properties()\"\n [ignoreInputs]=\"configuration.hiddenInputs\"\n [dynamicContent]=\"configuration.content\"\n [hideSidePanel]=\"configuration.hideSidePanel ?? false\"\n [inspectorPosition]=\"configuration.inspectorPosition ?? 'right'\"\n [defaultValues]=\"defaultValues()\"\n [showResetButton]=\"!isDefaultState()\"\n [(recreateDemo)]=\"recreateDemo\"\n (resetForm)=\"resetForm()\">\n @for (selector of configuration.selectors ?? selectors() | asArray; track selector) {\n <ng-doc-playground-demo\n [id]=\"id()\"\n [selector]=\"selector\"\n [properties]=\"properties()\"\n [configuration]=\"configuration\"\n [recreateDemo]=\"recreateDemo()\"\n [form]=\"formGroup()\"\n [expanded]=\"configuration.expanded ?? false\">\n </ng-doc-playground-demo>\n }\n @if (pipeName()) {\n <ng-doc-playground-demo\n [id]=\"id()\"\n [pipeName]=\"pipeName()\"\n [properties]=\"properties()\"\n [configuration]=\"configuration\"\n [recreateDemo]=\"recreateDemo()\"\n [form]=\"formGroup()\">\n </ng-doc-playground-demo>\n }\n </ng-doc-playground-properties>\n}\n","import {\n ChangeDetectorRef,\n Directive,\n inject,\n input,\n InputSignal,\n OnInit,\n Signal,\n ViewContainerRef,\n} from '@angular/core';\nimport { extractFunctionDefaults } from '@ng-doc/core/helpers/extract-function-defaults';\nimport { NgDocPlaygroundConfig } from '@ng-doc/core/interfaces';\nimport { Constructor } from '@ng-doc/core/types';\nimport { Observable, Subject, take } from 'rxjs';\n\nimport { NgDocPlaygroundComponent } from './playground.component';\n\n/**\n * Base class of the playground classes the builder generates, one per playground and selector.\n * A generated class renders the playground template with the target's inputs bound to\n * `properties()`, and queries the target with `viewChild()`.\n */\n@Directive()\nexport abstract class NgDocBasePlayground implements Pick<NgDocPlaygroundConfig, 'data'>, OnInit {\n static readonly selector: string = 'unknown';\n\n /** The class the playground shows: a component, a directive or a pipe. */\n abstract readonly target: Constructor<unknown>;\n\n /** The instance of the target in the playground template; a pipe has none. */\n abstract readonly playground: Signal<unknown>;\n\n /** The view container of the target in the playground template; a pipe has none. */\n abstract readonly viewContainerRef: Signal<ViewContainerRef | undefined>;\n\n /** The `data` of the playground configuration. */\n abstract readonly configData: Record<string, unknown>;\n\n /** Values of the target's inputs, by property name. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n readonly properties: InputSignal<Record<string, any>> = input<Record<string, any>>({});\n\n /** The `data` given to the playground action; it extends the configuration's `data`. */\n readonly actionData: InputSignal<Record<string, unknown>> = input<Record<string, unknown>>({});\n\n /** Whether each content slot is shown, by slot name. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n readonly content: InputSignal<Record<string, any>> = input<Record<string, any>>({});\n\n /** The default values of the target's inputs, read before the template binds them. */\n defaultValues: Record<string, unknown> = {};\n\n private readonly reattached: Subject<void> = new Subject<void>();\n private readonly playgroundContainer: NgDocPlaygroundComponent = inject(NgDocPlaygroundComponent);\n protected readonly changeDetectorRef: ChangeDetectorRef = inject(ChangeDetectorRef);\n\n constructor() {\n // The view is not checked until the default values of the target are read, so the\n // template's bindings cannot overwrite them first.\n this.changeDetectorRef.detach();\n }\n\n /** Emits once, after the view is attached again and checks the template's bindings. */\n get onReattached(): Observable<void> {\n return this.reattached.pipe(take(1));\n }\n\n /** The playground `data`: the configuration's data extended by the action's data. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get data(): any {\n return Object.assign({}, this.configData, this.actionData());\n }\n\n ngOnInit(): void {\n // The target is created with the view, but the view has not been checked yet, so its inputs\n // still hold their defaults. Signal inputs are read by calling them.\n const playground = this.playground() as Record<string, unknown> | undefined;\n\n if (playground) {\n this.defaultValues = Object.keys(playground).reduce(\n (values: Record<string, unknown>, key: string) => {\n try {\n const value: unknown = playground[key];\n\n values[key] = typeof value === 'function' ? value.call(playground) : value;\n } catch {\n // Some properties are getters or functions that throw without their context.\n }\n\n return values;\n },\n {},\n );\n } else if (this.target) {\n // A pipe: the defaults of its `transform` parameters after the value itself.\n const defaults = extractFunctionDefaults(\n (this.target.prototype as { transform: (...args: unknown[]) => unknown }).transform,\n );\n\n this.defaultValues = Object.keys(this.playgroundContainer.properties() ?? {}).reduce(\n (values: Record<string, unknown>, key: string, i: number) => {\n values[key] = defaults[i + 1];\n\n return values;\n },\n {},\n );\n } else {\n throw new Error('Playground is not defined or initialized');\n }\n\n if (!this.playgroundContainer.defaultValues()) {\n this.playgroundContainer.defaultValues.set(this.defaultValues);\n }\n\n // The demo sets the playground's inputs right after it creates this view; the view is\n // attached again once they are set, so its first check renders the playground's values.\n Promise.resolve().then(() => {\n this.changeDetectorRef.reattach();\n this.changeDetectorRef.markForCheck();\n this.reattached.next();\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { AsyncPipe } from '@angular/common';
|
|
2
1
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { Directive,
|
|
4
|
-
import {
|
|
2
|
+
import { Directive, input, booleanAttribute, inject, DOCUMENT, viewChild, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { NgDocFullscreenRouteService } from '@ng-doc/app/services/fullscreen-route';
|
|
4
|
+
import { NgDocSidebarService } from '@ng-doc/app/services/sidebar';
|
|
5
5
|
import { NgDocSidenavComponent } from '@ng-doc/ui-kit';
|
|
6
6
|
import { PolymorpheusOutlet } from '@taiga-ui/polymorpheus';
|
|
7
7
|
|
|
@@ -19,14 +19,13 @@ import { PolymorpheusOutlet } from '@taiga-ui/polymorpheus';
|
|
|
19
19
|
* ```
|
|
20
20
|
*/
|
|
21
21
|
class NgDocCustomNavbarDirective {
|
|
22
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
23
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.
|
|
22
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocCustomNavbarDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
23
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.2.1", type: NgDocCustomNavbarDirective, isStandalone: true, selector: "[ngDocCustomNavbar]", ngImport: i0 }); }
|
|
24
24
|
}
|
|
25
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
25
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocCustomNavbarDirective, decorators: [{
|
|
26
26
|
type: Directive,
|
|
27
27
|
args: [{
|
|
28
28
|
selector: '[ngDocCustomNavbar]',
|
|
29
|
-
standalone: true,
|
|
30
29
|
}]
|
|
31
30
|
}] });
|
|
32
31
|
/**
|
|
@@ -43,53 +42,71 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
|
|
|
43
42
|
* ```
|
|
44
43
|
*/
|
|
45
44
|
class NgDocCustomSidebarDirective {
|
|
46
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
47
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.
|
|
45
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocCustomSidebarDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
46
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.2.1", type: NgDocCustomSidebarDirective, isStandalone: true, selector: "[ngDocCustomSidebar]", ngImport: i0 }); }
|
|
48
47
|
}
|
|
49
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
48
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocCustomSidebarDirective, decorators: [{
|
|
50
49
|
type: Directive,
|
|
51
50
|
args: [{
|
|
52
51
|
selector: '[ngDocCustomSidebar]',
|
|
53
|
-
standalone: true,
|
|
54
52
|
}]
|
|
55
53
|
}] });
|
|
54
|
+
/**
|
|
55
|
+
* Root layout of the NgDoc application: the navbar, the sidebar, the page and the footer.
|
|
56
|
+
*
|
|
57
|
+
* Its first focusable element is a "Skip to content" link, shown only while it has focus, that
|
|
58
|
+
* moves keyboard focus past the navbar and the sidebar to the page.
|
|
59
|
+
*
|
|
60
|
+
* While a page shows one of its fullscreen routes (`NgDocFullscreenRouteService`), only the page
|
|
61
|
+
* is shown: the navbar, the sidebar, the footer and the skip link are hidden.
|
|
62
|
+
*/
|
|
56
63
|
class NgDocRootComponent {
|
|
57
64
|
constructor() {
|
|
58
65
|
/**
|
|
59
66
|
* If `true` then the sidebar will be shown
|
|
60
67
|
* You can use it for example for landing page to hide sidebar
|
|
61
68
|
*/
|
|
62
|
-
this.sidebar = true;
|
|
69
|
+
this.sidebar = input(true, { ...(ngDevMode ? { debugName: "sidebar" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
63
70
|
/**
|
|
64
71
|
* Content for footer
|
|
65
72
|
*/
|
|
66
|
-
this.footerContent = ''
|
|
73
|
+
this.footerContent = input('', /* @ts-ignore */
|
|
74
|
+
...(ngDevMode ? [{ debugName: "footerContent" }] : /* istanbul ignore next */ []));
|
|
67
75
|
/**
|
|
68
76
|
* If `true` then page will be shown without width limit.
|
|
69
77
|
* You can use it for example for landing page
|
|
70
78
|
*/
|
|
71
|
-
this.noWidthLimit = false;
|
|
79
|
+
this.noWidthLimit = input(false, { ...(ngDevMode ? { debugName: "noWidthLimit" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
72
80
|
this.sidebarService = inject(NgDocSidebarService);
|
|
81
|
+
this.fullscreenRoute = inject(NgDocFullscreenRouteService);
|
|
82
|
+
this.document = inject(DOCUMENT);
|
|
83
|
+
this.sidenavQuery = viewChild(NgDocSidenavComponent, /* @ts-ignore */
|
|
84
|
+
...(ngDevMode ? [{ debugName: "sidenavQuery" }] : /* istanbul ignore next */ []));
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The sidenav that holds the sidebar and the page.
|
|
88
|
+
*/
|
|
89
|
+
get sidenav() {
|
|
90
|
+
return this.sidenavQuery();
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Moves keyboard focus to the page content, as the skip link does.
|
|
94
|
+
* @param event - The click on the skip link; its navigation to a fragment is cancelled.
|
|
95
|
+
*/
|
|
96
|
+
skipToContent(event) {
|
|
97
|
+
event?.preventDefault();
|
|
98
|
+
this.document.getElementById('ng-doc-content')?.focus();
|
|
73
99
|
}
|
|
74
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
75
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.
|
|
100
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocRootComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
101
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: NgDocRootComponent, isStandalone: true, selector: "ng-doc-root", inputs: { sidebar: { classPropertyName: "sidebar", publicName: "sidebar", isSignal: true, isRequired: false, transformFunction: null }, footerContent: { classPropertyName: "footerContent", publicName: "footerContent", isSignal: true, isRequired: false, transformFunction: null }, noWidthLimit: { classPropertyName: "noWidthLimit", publicName: "noWidthLimit", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-ng-doc-no-width-limit": "noWidthLimit()", "attr.data-ng-doc-fullscreen-route": "fullscreenRoute.active()" } }, viewQueries: [{ propertyName: "sidenavQuery", first: true, predicate: NgDocSidenavComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<a class=\"ng-doc-skip-link\" href=\"#ng-doc-content\" (click)=\"skipToContent($event)\">\n Skip to content\n</a>\n<div class=\"ng-doc-root-wrapper\">\n <div class=\"ng-doc-header\">\n <ng-content select=\"ng-doc-navbar\"></ng-content>\n <ng-content select=\"[ngDocCustomNavbar]\"></ng-content>\n </div>\n <main>\n <ng-doc-sidenav\n [sidebar]=\"sidebar() ? sidebarContent : null\"\n [opened]=\"sidebarService.expandedState()\"\n [hasBackdrop]=\"sidebarService.isMobile\"\n (closeEvent)=\"sidebarService.hide()\">\n <ng-template #sidebarContent>\n <ng-content select=\"ng-doc-sidebar\"></ng-content>\n <ng-content select=\"[ngDocCustomSidebar]\"></ng-content>\n </ng-template>\n\n <div class=\"ng-doc-content\" id=\"ng-doc-content\" tabindex=\"-1\">\n <ng-content></ng-content>\n </div>\n </ng-doc-sidenav>\n </main>\n @if (footerContent()) {\n <footer>\n <ng-container *polymorpheusOutlet=\"footerContent() as text\"> {{ text }}</ng-container>\n </footer>\n }\n</div>\n", styles: [":host[data-ng-doc-no-width-limit=true] .ng-doc-root-wrapper main{max-width:none}:host .ng-doc-root-wrapper{display:flex;flex-direction:column;height:100%}:host .ng-doc-root-wrapper main{display:flex;width:100%;margin-left:auto;margin-right:auto;max-width:var(--ng-doc-app-max-width);padding:var(--ng-doc-main-padding);--ng-doc-sidenav-top: var(--ng-doc-navbar-height);--ng-doc-sidenav-width: var(--ng-doc-sidebar-width);--ng-doc-sidenav-content-padding: var(--ng-doc-page-padding)}:host .ng-doc-root-wrapper footer{margin-top:auto}:host .ng-doc-root-wrapper .ng-doc-content{outline:none}:host .ng-doc-root-wrapper .ng-doc-header{position:fixed;top:0;height:var(--ng-doc-navbar-height);width:100%;z-index:15}:host .ng-doc-skip-link{position:fixed;top:var(--ng-doc-space-2);left:var(--ng-doc-space-4);z-index:70;display:inline-flex;align-items:center;height:36px;padding:0 var(--ng-doc-space-3);border:1px solid var(--ng-doc-border-color);border-radius:var(--ng-doc-radius-md);background:var(--ng-doc-background);color:var(--ng-doc-heading-color);font-family:var(--ng-doc-font-family);font-size:var(--ng-doc-text-sm-size);line-height:20px;font-weight:500;text-decoration:none;box-shadow:var(--ng-doc-shadow-md);transform:translateY(calc(-100% - var(--ng-doc-space-16)))}:host .ng-doc-skip-link:focus{transform:none}:host .ng-doc-skip-link:focus-visible{outline:none;box-shadow:var(--ng-doc-focus-ring),var(--ng-doc-shadow-md)}@media(max-width:640px){:host:not([data-ng-doc-no-width-limit=true]) .ng-doc-root-wrapper main{--ng-doc-sidenav-content-padding: var(--ng-doc-space-5) var(--ng-doc-space-4)}}:host[data-ng-doc-fullscreen-route=true] .ng-doc-skip-link,:host[data-ng-doc-fullscreen-route=true] .ng-doc-header,:host[data-ng-doc-fullscreen-route=true] footer{display:none}:host[data-ng-doc-fullscreen-route=true] .ng-doc-root-wrapper main{max-width:none;padding:0;--ng-doc-sidenav-width: 0px;--ng-doc-sidenav-content-padding: 0}:host[data-ng-doc-fullscreen-route=true] ::ng-deep .ng-doc-sidenav{display:none}\n"], dependencies: [{ kind: "component", type: NgDocSidenavComponent, selector: "ng-doc-sidenav", inputs: ["sidebar", "opened", "hasBackdrop"], outputs: ["closeEvent"] }, { kind: "directive", type: PolymorpheusOutlet, selector: "[polymorpheusOutlet]", inputs: ["polymorpheusOutlet", "polymorpheusOutletContext"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
76
102
|
}
|
|
77
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
103
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocRootComponent, decorators: [{
|
|
78
104
|
type: Component,
|
|
79
|
-
args: [{ selector: 'ng-doc-root',
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
}], noWidthLimit: [{
|
|
85
|
-
type: Input
|
|
86
|
-
}, {
|
|
87
|
-
type: HostBinding,
|
|
88
|
-
args: ['attr.data-ng-doc-no-width-limit']
|
|
89
|
-
}], sidenav: [{
|
|
90
|
-
type: ViewChild,
|
|
91
|
-
args: [NgDocSidenavComponent]
|
|
92
|
-
}] } });
|
|
105
|
+
args: [{ selector: 'ng-doc-root', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgDocSidenavComponent, PolymorpheusOutlet], host: {
|
|
106
|
+
'[attr.data-ng-doc-no-width-limit]': 'noWidthLimit()',
|
|
107
|
+
'[attr.data-ng-doc-fullscreen-route]': 'fullscreenRoute.active()',
|
|
108
|
+
}, template: "<a class=\"ng-doc-skip-link\" href=\"#ng-doc-content\" (click)=\"skipToContent($event)\">\n Skip to content\n</a>\n<div class=\"ng-doc-root-wrapper\">\n <div class=\"ng-doc-header\">\n <ng-content select=\"ng-doc-navbar\"></ng-content>\n <ng-content select=\"[ngDocCustomNavbar]\"></ng-content>\n </div>\n <main>\n <ng-doc-sidenav\n [sidebar]=\"sidebar() ? sidebarContent : null\"\n [opened]=\"sidebarService.expandedState()\"\n [hasBackdrop]=\"sidebarService.isMobile\"\n (closeEvent)=\"sidebarService.hide()\">\n <ng-template #sidebarContent>\n <ng-content select=\"ng-doc-sidebar\"></ng-content>\n <ng-content select=\"[ngDocCustomSidebar]\"></ng-content>\n </ng-template>\n\n <div class=\"ng-doc-content\" id=\"ng-doc-content\" tabindex=\"-1\">\n <ng-content></ng-content>\n </div>\n </ng-doc-sidenav>\n </main>\n @if (footerContent()) {\n <footer>\n <ng-container *polymorpheusOutlet=\"footerContent() as text\"> {{ text }}</ng-container>\n </footer>\n }\n</div>\n", styles: [":host[data-ng-doc-no-width-limit=true] .ng-doc-root-wrapper main{max-width:none}:host .ng-doc-root-wrapper{display:flex;flex-direction:column;height:100%}:host .ng-doc-root-wrapper main{display:flex;width:100%;margin-left:auto;margin-right:auto;max-width:var(--ng-doc-app-max-width);padding:var(--ng-doc-main-padding);--ng-doc-sidenav-top: var(--ng-doc-navbar-height);--ng-doc-sidenav-width: var(--ng-doc-sidebar-width);--ng-doc-sidenav-content-padding: var(--ng-doc-page-padding)}:host .ng-doc-root-wrapper footer{margin-top:auto}:host .ng-doc-root-wrapper .ng-doc-content{outline:none}:host .ng-doc-root-wrapper .ng-doc-header{position:fixed;top:0;height:var(--ng-doc-navbar-height);width:100%;z-index:15}:host .ng-doc-skip-link{position:fixed;top:var(--ng-doc-space-2);left:var(--ng-doc-space-4);z-index:70;display:inline-flex;align-items:center;height:36px;padding:0 var(--ng-doc-space-3);border:1px solid var(--ng-doc-border-color);border-radius:var(--ng-doc-radius-md);background:var(--ng-doc-background);color:var(--ng-doc-heading-color);font-family:var(--ng-doc-font-family);font-size:var(--ng-doc-text-sm-size);line-height:20px;font-weight:500;text-decoration:none;box-shadow:var(--ng-doc-shadow-md);transform:translateY(calc(-100% - var(--ng-doc-space-16)))}:host .ng-doc-skip-link:focus{transform:none}:host .ng-doc-skip-link:focus-visible{outline:none;box-shadow:var(--ng-doc-focus-ring),var(--ng-doc-shadow-md)}@media(max-width:640px){:host:not([data-ng-doc-no-width-limit=true]) .ng-doc-root-wrapper main{--ng-doc-sidenav-content-padding: var(--ng-doc-space-5) var(--ng-doc-space-4)}}:host[data-ng-doc-fullscreen-route=true] .ng-doc-skip-link,:host[data-ng-doc-fullscreen-route=true] .ng-doc-header,:host[data-ng-doc-fullscreen-route=true] footer{display:none}:host[data-ng-doc-fullscreen-route=true] .ng-doc-root-wrapper main{max-width:none;padding:0;--ng-doc-sidenav-width: 0px;--ng-doc-sidenav-content-padding: 0}:host[data-ng-doc-fullscreen-route=true] ::ng-deep .ng-doc-sidenav{display:none}\n"] }]
|
|
109
|
+
}], propDecorators: { sidebar: [{ type: i0.Input, args: [{ isSignal: true, alias: "sidebar", required: false }] }], footerContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "footerContent", required: false }] }], noWidthLimit: [{ type: i0.Input, args: [{ isSignal: true, alias: "noWidthLimit", required: false }] }], sidenavQuery: [{ type: i0.ViewChild, args: [i0.forwardRef(() => NgDocSidenavComponent), { isSignal: true }] }] } });
|
|
93
110
|
|
|
94
111
|
/**
|
|
95
112
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-doc-app-components-root.mjs","sources":["../../../../libs/app/components/root/root.component.ts","../../../../libs/app/components/root/root.component.html","../../../../libs/app/components/root/ng-doc-app-components-root.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"ng-doc-app-components-root.mjs","sources":["../../../../libs/app/components/root/root.component.ts","../../../../libs/app/components/root/root.component.html","../../../../libs/app/components/root/ng-doc-app-components-root.ts"],"sourcesContent":["import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n Directive,\n DOCUMENT,\n inject,\n input,\n viewChild,\n} from '@angular/core';\nimport { NgDocFullscreenRouteService } from '@ng-doc/app/services/fullscreen-route';\nimport { NgDocSidebarService } from '@ng-doc/app/services/sidebar';\nimport { NgDocContent, NgDocSidenavComponent } from '@ng-doc/ui-kit';\nimport { PolymorpheusOutlet } from '@taiga-ui/polymorpheus';\n\n/**\n * Directive uses for providing custom navbar, you should mark element with this directive\n * and the `NgDocRootComponent` will use it as a navbar\n *\n * ```html\n * <ng-doc-root>\n * <my-custom-navbar ngDocCustomNavbar></my-custom-navbar>\n *\n * <ng-doc-sidebar></ng-doc-sidebar>\n * <router-outlet></router-outlet>\n * </ng-doc-root>\n * ```\n */\n@Directive({\n selector: '[ngDocCustomNavbar]',\n})\nexport class NgDocCustomNavbarDirective {}\n\n/**\n * Directive uses for providing custom sidebar, you should mark element with this directive\n * and the `NgDocRootComponent` will use it as a sidebar\n *\n * ```html\n * <ng-doc-root>\n * <ng-doc-navbar></ng-doc-sidebar>\n *\n * <my-custom-sidebar ngDocCustomSidebar></my-custom-sidebar>\n * <router-outlet></router-outlet>\n * </ng-doc-root>\n * ```\n */\n@Directive({\n selector: '[ngDocCustomSidebar]',\n})\nexport class NgDocCustomSidebarDirective {}\n\n/**\n * Root layout of the NgDoc application: the navbar, the sidebar, the page and the footer.\n *\n * Its first focusable element is a \"Skip to content\" link, shown only while it has focus, that\n * moves keyboard focus past the navbar and the sidebar to the page.\n *\n * While a page shows one of its fullscreen routes (`NgDocFullscreenRouteService`), only the page\n * is shown: the navbar, the sidebar, the footer and the skip link are hidden.\n */\n@Component({\n selector: 'ng-doc-root',\n templateUrl: './root.component.html',\n styleUrls: ['./root.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgDocSidenavComponent, PolymorpheusOutlet],\n host: {\n '[attr.data-ng-doc-no-width-limit]': 'noWidthLimit()',\n '[attr.data-ng-doc-fullscreen-route]': 'fullscreenRoute.active()',\n },\n})\nexport class NgDocRootComponent {\n /**\n * If `true` then the sidebar will be shown\n * You can use it for example for landing page to hide sidebar\n */\n readonly sidebar = input<boolean, unknown>(true, { transform: booleanAttribute });\n\n /**\n * Content for footer\n */\n readonly footerContent = input<NgDocContent>('');\n\n /**\n * If `true` then page will be shown without width limit.\n * You can use it for example for landing page\n */\n readonly noWidthLimit = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n protected readonly sidebarService = inject(NgDocSidebarService);\n protected readonly fullscreenRoute = inject(NgDocFullscreenRouteService);\n private readonly document = inject(DOCUMENT);\n private readonly sidenavQuery = viewChild(NgDocSidenavComponent);\n\n /**\n * The sidenav that holds the sidebar and the page.\n */\n get sidenav(): NgDocSidenavComponent | undefined {\n return this.sidenavQuery();\n }\n\n /**\n * Moves keyboard focus to the page content, as the skip link does.\n * @param event - The click on the skip link; its navigation to a fragment is cancelled.\n */\n skipToContent(event?: Event): void {\n event?.preventDefault();\n this.document.getElementById('ng-doc-content')?.focus();\n }\n}\n","<a class=\"ng-doc-skip-link\" href=\"#ng-doc-content\" (click)=\"skipToContent($event)\">\n Skip to content\n</a>\n<div class=\"ng-doc-root-wrapper\">\n <div class=\"ng-doc-header\">\n <ng-content select=\"ng-doc-navbar\"></ng-content>\n <ng-content select=\"[ngDocCustomNavbar]\"></ng-content>\n </div>\n <main>\n <ng-doc-sidenav\n [sidebar]=\"sidebar() ? sidebarContent : null\"\n [opened]=\"sidebarService.expandedState()\"\n [hasBackdrop]=\"sidebarService.isMobile\"\n (closeEvent)=\"sidebarService.hide()\">\n <ng-template #sidebarContent>\n <ng-content select=\"ng-doc-sidebar\"></ng-content>\n <ng-content select=\"[ngDocCustomSidebar]\"></ng-content>\n </ng-template>\n\n <div class=\"ng-doc-content\" id=\"ng-doc-content\" tabindex=\"-1\">\n <ng-content></ng-content>\n </div>\n </ng-doc-sidenav>\n </main>\n @if (footerContent()) {\n <footer>\n <ng-container *polymorpheusOutlet=\"footerContent() as text\"> {{ text }}</ng-container>\n </footer>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,29 @@
|
|
|
1
1
|
import { KeyValuePipe } from '@angular/common';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import {
|
|
3
|
+
import { input, computed, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
4
|
import { RouterLink } from '@angular/router';
|
|
5
5
|
import { NgDocKindIconComponent } from '@ng-doc/app/components/kind-icon';
|
|
6
6
|
import { NgDocTextComponent, NgDocTooltipDirective } from '@ng-doc/ui-kit';
|
|
7
7
|
|
|
8
|
+
/**
|
|
9
|
+
* A list of pages grouped by their type (guides and API).
|
|
10
|
+
*/
|
|
8
11
|
class NgDocSearchResultComponent {
|
|
9
12
|
constructor() {
|
|
10
|
-
|
|
11
|
-
this.
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
grouped[item.type].push(item);
|
|
20
|
-
return grouped;
|
|
21
|
-
}, {});
|
|
22
|
-
}
|
|
13
|
+
/** The pages to list. */
|
|
14
|
+
this.result = input([], /* @ts-ignore */
|
|
15
|
+
...(ngDevMode ? [{ debugName: "result" }] : /* istanbul ignore next */ []));
|
|
16
|
+
/** The pages grouped by their type. */
|
|
17
|
+
this.groupedResult = computed(() => (this.result() ?? []).reduce((grouped, item) => {
|
|
18
|
+
(grouped[item.type] ??= []).push(item);
|
|
19
|
+
return grouped;
|
|
20
|
+
}, {}), /* @ts-ignore */
|
|
21
|
+
...(ngDevMode ? [{ debugName: "groupedResult" }] : /* istanbul ignore next */ []));
|
|
23
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Returns the heading of a group.
|
|
25
|
+
* @param type - The page type of the group.
|
|
26
|
+
*/
|
|
24
27
|
typeToLabel(type) {
|
|
25
28
|
switch (type) {
|
|
26
29
|
case 'api':
|
|
@@ -31,10 +34,10 @@ class NgDocSearchResultComponent {
|
|
|
31
34
|
return 'Unknown';
|
|
32
35
|
}
|
|
33
36
|
}
|
|
34
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
35
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.
|
|
37
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocSearchResultComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
38
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.2.1", type: NgDocSearchResultComponent, isStandalone: true, selector: "ng-doc-search-result", inputs: { result: { classPropertyName: "result", publicName: "result", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (groupedResult() | keyvalue; as results) {\n <div class=\"ng-doc-search-result-wrapper\">\n @if (results.length) {\n @for (item of results; track item) {\n <div class=\"ng-doc-search-result-category\">\n <h4 class=\"ng-doc-search-result-title\" ng-doc-text>{{ typeToLabel(item.key) }}</h4>\n <ul class=\"ng-doc-search-result-pages\">\n @for (page of item.value; track page) {\n <li class=\"ng-doc-search-result-page\">\n <a class=\"ng-doc-search-result-page-link\" [routerLink]=\"[page.route]\">\n @if (page.kind) {\n <ng-doc-kind-icon\n [kind]=\"page.kind\"\n [ngDocTooltip]=\"page.kind\"></ng-doc-kind-icon>\n }\n {{ page.title }}\n </a>\n </li>\n }\n </ul>\n </div>\n }\n } @else {\n <div ng-doc-text color=\"muted\">Nothing was found...</div>\n }\n </div>\n}\n", styles: [":host{display:block}:host .ng-doc-search-result-wrapper{display:flex;flex-direction:row}:host .ng-doc-search-result-wrapper .ng-doc-search-result-category:not(:last-child){margin-right:calc(var(--ng-doc-base-gutter) * 2)}:host .ng-doc-search-result-wrapper .ng-doc-search-result-category .ng-doc-search-result-title{margin:0 0 calc(var(--ng-doc-base-gutter) * 2)}:host .ng-doc-search-result-wrapper .ng-doc-search-result-category .ng-doc-search-result-pages{list-style:none;padding:0;margin:0}:host .ng-doc-search-result-wrapper .ng-doc-search-result-category .ng-doc-search-result-pages .ng-doc-search-result-page{margin-bottom:var(--ng-doc-base-gutter)}:host .ng-doc-search-result-wrapper .ng-doc-search-result-category .ng-doc-search-result-pages .ng-doc-search-result-page .ng-doc-search-result-page-link{display:flex;align-items:center;text-decoration:none;color:var(--ng-doc-text)}:host .ng-doc-search-result-wrapper .ng-doc-search-result-category .ng-doc-search-result-pages .ng-doc-search-result-page .ng-doc-search-result-page-link ng-doc-kind-icon{margin-right:var(--ng-doc-base-gutter)}\n"], dependencies: [{ kind: "component", type: NgDocTextComponent, selector: "[ng-doc-text]", inputs: ["size", "color", "align", "absoluteContent"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "component", type: NgDocKindIconComponent, selector: "ng-doc-kind-icon", inputs: ["kind", "type", "size"] }, { 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: KeyValuePipe, name: "keyvalue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
36
39
|
}
|
|
37
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
40
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.2.1", ngImport: i0, type: NgDocSearchResultComponent, decorators: [{
|
|
38
41
|
type: Component,
|
|
39
42
|
args: [{ selector: 'ng-doc-search-result', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
40
43
|
NgDocTextComponent,
|
|
@@ -42,10 +45,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
|
|
|
42
45
|
NgDocKindIconComponent,
|
|
43
46
|
NgDocTooltipDirective,
|
|
44
47
|
KeyValuePipe,
|
|
45
|
-
], template: "@if (groupedResult | keyvalue; as results) {\n <div class=\"ng-doc-search-result-wrapper\">\n @if (results.length) {\n @for (item of results; track item) {\n <div class=\"ng-doc-search-result-category\">\n <h4 class=\"ng-doc-search-result-title\" ng-doc-text>{{ typeToLabel(item.key) }}</h4>\n <ul class=\"ng-doc-search-result-pages\">\n @for (page of item.value; track page) {\n <li class=\"ng-doc-search-result-page\">\n <a class=\"ng-doc-search-result-page-link\" [routerLink]=\"[page.route]\">\n @if (page.kind) {\n <ng-doc-kind-icon\n [kind]=\"page.kind\"\n [ngDocTooltip]=\"page.kind\"></ng-doc-kind-icon>\n }\n {{ page.title }}\n </a>\n </li>\n }\n </ul>\n </div>\n }\n } @else {\n <div ng-doc-text color=\"muted\">Nothing was found...</div>\n }\n </div>\n}\n", styles: [":host{display:block}:host .ng-doc-search-result-wrapper{display:flex;flex-direction:row}:host .ng-doc-search-result-wrapper .ng-doc-search-result-category:not(:last-child){margin-right:calc(var(--ng-doc-base-gutter) * 2)}:host .ng-doc-search-result-wrapper .ng-doc-search-result-category .ng-doc-search-result-title{margin:0 0 calc(var(--ng-doc-base-gutter) * 2)}:host .ng-doc-search-result-wrapper .ng-doc-search-result-category .ng-doc-search-result-pages{list-style:none;padding:0;margin:0}:host .ng-doc-search-result-wrapper .ng-doc-search-result-category .ng-doc-search-result-pages .ng-doc-search-result-page{margin-bottom:var(--ng-doc-base-gutter)}:host .ng-doc-search-result-wrapper .ng-doc-search-result-category .ng-doc-search-result-pages .ng-doc-search-result-page .ng-doc-search-result-page-link{display:flex;align-items:center;text-decoration:none;color:var(--ng-doc-text)}:host .ng-doc-search-result-wrapper .ng-doc-search-result-category .ng-doc-search-result-pages .ng-doc-search-result-page .ng-doc-search-result-page-link ng-doc-kind-icon{margin-right:var(--ng-doc-base-gutter)}\n"] }]
|
|
46
|
-
}], propDecorators: { result: [{
|
|
47
|
-
type: Input
|
|
48
|
-
}] } });
|
|
48
|
+
], template: "@if (groupedResult() | keyvalue; as results) {\n <div class=\"ng-doc-search-result-wrapper\">\n @if (results.length) {\n @for (item of results; track item) {\n <div class=\"ng-doc-search-result-category\">\n <h4 class=\"ng-doc-search-result-title\" ng-doc-text>{{ typeToLabel(item.key) }}</h4>\n <ul class=\"ng-doc-search-result-pages\">\n @for (page of item.value; track page) {\n <li class=\"ng-doc-search-result-page\">\n <a class=\"ng-doc-search-result-page-link\" [routerLink]=\"[page.route]\">\n @if (page.kind) {\n <ng-doc-kind-icon\n [kind]=\"page.kind\"\n [ngDocTooltip]=\"page.kind\"></ng-doc-kind-icon>\n }\n {{ page.title }}\n </a>\n </li>\n }\n </ul>\n </div>\n }\n } @else {\n <div ng-doc-text color=\"muted\">Nothing was found...</div>\n }\n </div>\n}\n", styles: [":host{display:block}:host .ng-doc-search-result-wrapper{display:flex;flex-direction:row}:host .ng-doc-search-result-wrapper .ng-doc-search-result-category:not(:last-child){margin-right:calc(var(--ng-doc-base-gutter) * 2)}:host .ng-doc-search-result-wrapper .ng-doc-search-result-category .ng-doc-search-result-title{margin:0 0 calc(var(--ng-doc-base-gutter) * 2)}:host .ng-doc-search-result-wrapper .ng-doc-search-result-category .ng-doc-search-result-pages{list-style:none;padding:0;margin:0}:host .ng-doc-search-result-wrapper .ng-doc-search-result-category .ng-doc-search-result-pages .ng-doc-search-result-page{margin-bottom:var(--ng-doc-base-gutter)}:host .ng-doc-search-result-wrapper .ng-doc-search-result-category .ng-doc-search-result-pages .ng-doc-search-result-page .ng-doc-search-result-page-link{display:flex;align-items:center;text-decoration:none;color:var(--ng-doc-text)}:host .ng-doc-search-result-wrapper .ng-doc-search-result-category .ng-doc-search-result-pages .ng-doc-search-result-page .ng-doc-search-result-page-link ng-doc-kind-icon{margin-right:var(--ng-doc-base-gutter)}\n"] }]
|
|
49
|
+
}], propDecorators: { result: [{ type: i0.Input, args: [{ isSignal: true, alias: "result", required: false }] }] } });
|
|
49
50
|
|
|
50
51
|
/**
|
|
51
52
|
* Generated bundle index. Do not edit.
|