@taiga-ui/addon-doc 4.66.0 → 5.0.0-canary.8b64ec1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/README.md +33 -43
  2. package/components/api/api-item-number.directive.d.ts +3 -3
  3. package/components/api/api-item.component.d.ts +12 -9
  4. package/components/{documentation/pipes → api}/inspect.pipe.d.ts +1 -1
  5. package/components/{documentation/pipes → api}/type-reference.pipe.d.ts +3 -3
  6. package/components/code/index.d.ts +9 -6
  7. package/components/copy/index.d.ts +1 -1
  8. package/components/demo/index.d.ts +14 -9
  9. package/components/doc-tab/index.d.ts +2 -2
  10. package/components/example/example.component.d.ts +13 -16
  11. package/components/example/example.options.d.ts +1 -3
  12. package/components/index.d.ts +0 -10
  13. package/components/internal/header/index.d.ts +3 -4
  14. package/components/internal/see-also/index.d.ts +2 -2
  15. package/components/internal/source-code/source-code.component.d.ts +7 -8
  16. package/components/language-switcher/index.d.ts +1 -1
  17. package/components/main/main.component.d.ts +1 -2
  18. package/components/navigation/navigation.component.d.ts +6 -5
  19. package/components/navigation/scroll-into-view.directive.d.ts +5 -3
  20. package/components/page/page-tab.directive.d.ts +2 -2
  21. package/components/page/page.component.d.ts +12 -15
  22. package/components/page/page.providers.d.ts +2 -11
  23. package/fesm2022/taiga-ui-addon-doc-components.mjs +282 -740
  24. package/fesm2022/taiga-ui-addon-doc-components.mjs.map +1 -1
  25. package/fesm2022/taiga-ui-addon-doc-services.mjs +4 -4
  26. package/fesm2022/taiga-ui-addon-doc-services.mjs.map +1 -1
  27. package/fesm2022/taiga-ui-addon-doc-tokens.mjs +2 -7
  28. package/fesm2022/taiga-ui-addon-doc-tokens.mjs.map +1 -1
  29. package/fesm2022/taiga-ui-addon-doc-types.mjs.map +1 -1
  30. package/fesm2022/taiga-ui-addon-doc-utils.mjs +7 -8
  31. package/fesm2022/taiga-ui-addon-doc-utils.mjs.map +1 -1
  32. package/fesm2022/taiga-ui-addon-doc.mjs +1 -7
  33. package/fesm2022/taiga-ui-addon-doc.mjs.map +1 -1
  34. package/index.d.ts +2 -4
  35. package/package.json +21 -36
  36. package/tokens/doc-icons.d.ts +2 -3
  37. package/types/page.d.ts +1 -1
  38. package/utils/inspect.d.ts +1 -1
  39. package/utils/provide-route-page-tab.d.ts +3 -4
  40. package/components/documentation/documentation-property-connector.directive.d.ts +0 -32
  41. package/components/documentation/documentation.component.d.ts +0 -23
  42. package/components/documentation/pipes/cleaner.pipe.d.ts +0 -7
  43. package/components/documentation/pipes/color.pipe.d.ts +0 -7
  44. package/components/documentation/pipes/opacity.pipe.d.ts +0 -7
  45. package/components/documentation/pipes/optional.pipe.d.ts +0 -7
  46. package/components/documentation/pipes/primitive-polymorpheus-content.pipe.d.ts +0 -7
  47. package/components/documentation/pipes/strip-optional.pipe.d.ts +0 -7
  48. package/directives/index.d.ts +0 -1
  49. package/directives/text-code/text-code.directive.d.ts +0 -9
  50. package/esm2022/components/api/api-item-number.directive.mjs +0 -23
  51. package/esm2022/components/api/api-item.component.mjs +0 -118
  52. package/esm2022/components/api/api.component.mjs +0 -16
  53. package/esm2022/components/code/index.mjs +0 -46
  54. package/esm2022/components/copy/index.mjs +0 -29
  55. package/esm2022/components/demo/index.mjs +0 -170
  56. package/esm2022/components/doc-tab/index.mjs +0 -17
  57. package/esm2022/components/documentation/documentation-property-connector.directive.mjs +0 -134
  58. package/esm2022/components/documentation/documentation.component.mjs +0 -108
  59. package/esm2022/components/documentation/pipes/cleaner.pipe.mjs +0 -18
  60. package/esm2022/components/documentation/pipes/color.pipe.mjs +0 -39
  61. package/esm2022/components/documentation/pipes/inspect.pipe.mjs +0 -33
  62. package/esm2022/components/documentation/pipes/opacity.pipe.mjs +0 -30
  63. package/esm2022/components/documentation/pipes/optional.pipe.mjs +0 -18
  64. package/esm2022/components/documentation/pipes/primitive-polymorpheus-content.pipe.mjs +0 -19
  65. package/esm2022/components/documentation/pipes/strip-optional.pipe.mjs +0 -18
  66. package/esm2022/components/documentation/pipes/type-reference.pipe.mjs +0 -29
  67. package/esm2022/components/example/example-get-tabs.pipe.mjs +0 -18
  68. package/esm2022/components/example/example.component.mjs +0 -118
  69. package/esm2022/components/example/example.options.mjs +0 -19
  70. package/esm2022/components/index.mjs +0 -33
  71. package/esm2022/components/internal/header/index.mjs +0 -39
  72. package/esm2022/components/internal/see-also/index.mjs +0 -26
  73. package/esm2022/components/internal/source-code/source-code.component.mjs +0 -54
  74. package/esm2022/components/language-switcher/index.mjs +0 -77
  75. package/esm2022/components/main/main.component.mjs +0 -41
  76. package/esm2022/components/navigation/navigation.component.mjs +0 -205
  77. package/esm2022/components/navigation/navigation.providers.mjs +0 -59
  78. package/esm2022/components/navigation/scroll-into-view.directive.mjs +0 -32
  79. package/esm2022/components/page/page-tab.directive.mjs +0 -20
  80. package/esm2022/components/page/page.component.mjs +0 -78
  81. package/esm2022/components/page/page.providers.mjs +0 -34
  82. package/esm2022/components/taiga-ui-addon-doc-components.mjs +0 -5
  83. package/esm2022/components/theme-switcher/theme-switcher.component.mjs +0 -45
  84. package/esm2022/directives/index.mjs +0 -2
  85. package/esm2022/directives/taiga-ui-addon-doc-directives.mjs +0 -5
  86. package/esm2022/directives/text-code/text-code.directive.mjs +0 -27
  87. package/esm2022/index.mjs +0 -28
  88. package/esm2022/services/index.mjs +0 -2
  89. package/esm2022/services/taiga-ui-addon-doc-services.mjs +0 -5
  90. package/esm2022/services/theme-dark.service.mjs +0 -52
  91. package/esm2022/taiga-ui-addon-doc.mjs +0 -5
  92. package/esm2022/tokens/code-actions.mjs +0 -8
  93. package/esm2022/tokens/code-editor.mjs +0 -6
  94. package/esm2022/tokens/default-tabs.mjs +0 -8
  95. package/esm2022/tokens/doc-icons.mjs +0 -29
  96. package/esm2022/tokens/example-content-processor.mjs +0 -16
  97. package/esm2022/tokens/excluded-properties.mjs +0 -11
  98. package/esm2022/tokens/i18n.mjs +0 -62
  99. package/esm2022/tokens/index.mjs +0 -17
  100. package/esm2022/tokens/logo.mjs +0 -8
  101. package/esm2022/tokens/page-loaded.mjs +0 -9
  102. package/esm2022/tokens/pages.mjs +0 -12
  103. package/esm2022/tokens/see-also.mjs +0 -8
  104. package/esm2022/tokens/source-code.mjs +0 -8
  105. package/esm2022/tokens/support-language.mjs +0 -5
  106. package/esm2022/tokens/taiga-ui-addon-doc-tokens.mjs +0 -5
  107. package/esm2022/tokens/title.mjs +0 -8
  108. package/esm2022/tokens/type-reference-handler.mjs +0 -9
  109. package/esm2022/tokens/url-state-handler.mjs +0 -27
  110. package/esm2022/types/code-editor.mjs +0 -2
  111. package/esm2022/types/demo-params.mjs +0 -2
  112. package/esm2022/types/index.mjs +0 -2
  113. package/esm2022/types/page.mjs +0 -6
  114. package/esm2022/types/source-code-path-options.mjs +0 -2
  115. package/esm2022/types/taiga-ui-addon-doc-types.mjs +0 -5
  116. package/esm2022/utils/clean-object.mjs +0 -10
  117. package/esm2022/utils/coerce-boolean.mjs +0 -4
  118. package/esm2022/utils/coerce-value.mjs +0 -43
  119. package/esm2022/utils/index.mjs +0 -14
  120. package/esm2022/utils/inspect.mjs +0 -67
  121. package/esm2022/utils/is-page-group.mjs +0 -4
  122. package/esm2022/utils/parse-code-block.mjs +0 -9
  123. package/esm2022/utils/provide-route-page-tab.mjs +0 -13
  124. package/esm2022/utils/raw-load-record.mjs +0 -11
  125. package/esm2022/utils/raw-load.mjs +0 -4
  126. package/esm2022/utils/sort-pages.mjs +0 -26
  127. package/esm2022/utils/taiga-ui-addon-doc-utils.mjs +0 -5
  128. package/esm2022/utils/to-flat-map-pages.mjs +0 -22
  129. package/esm2022/utils/transliterate-keyboard-layout.mjs +0 -47
  130. package/esm2022/utils/type-reference-parser.mjs +0 -21
  131. package/fesm2022/taiga-ui-addon-doc-directives.mjs +0 -33
  132. package/fesm2022/taiga-ui-addon-doc-directives.mjs.map +0 -1
@@ -1,170 +0,0 @@
1
- import { __decorate } from "tslib";
2
- import { JsonPipe, Location, NgIf, NgTemplateOutlet } from '@angular/common';
3
- import { ChangeDetectionStrategy, Component, computed, ContentChild, inject, Input, signal, TemplateRef, ViewChild, } from '@angular/core';
4
- import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
5
- import { FormGroup, FormsModule, ReactiveFormsModule, } from '@angular/forms';
6
- import { UrlSerializer } from '@angular/router';
7
- import { TUI_DOC_DEMO_TEXTS, TUI_DOC_URL_STATE_HANDLER } from '@taiga-ui/addon-doc/tokens';
8
- import { tuiCleanObject, tuiCoerceValueIsTrue } from '@taiga-ui/addon-doc/utils';
9
- import { TuiResizable, TuiResizer } from '@taiga-ui/cdk/directives/resizer';
10
- import { tuiInjectElement } from '@taiga-ui/cdk/utils/dom';
11
- import { tuiClamp, tuiToInteger } from '@taiga-ui/cdk/utils/math';
12
- import { tuiPure, tuiPx } from '@taiga-ui/cdk/utils/miscellaneous';
13
- import { TuiButton } from '@taiga-ui/core/components/button';
14
- import { TuiExpand } from '@taiga-ui/core/components/expand';
15
- import { TuiGroup } from '@taiga-ui/core/directives/group';
16
- import { TUI_DARK_MODE } from '@taiga-ui/core/tokens';
17
- import { TuiDataListWrapper } from '@taiga-ui/kit/components/data-list-wrapper';
18
- import { TuiSwitch } from '@taiga-ui/kit/components/switch';
19
- import { TuiChevron } from '@taiga-ui/kit/directives/chevron';
20
- import { TuiSelectModule } from '@taiga-ui/legacy/components/select';
21
- import { TuiTextfieldControllerModule } from '@taiga-ui/legacy/directives/textfield-controller';
22
- import { skip } from 'rxjs';
23
- import * as i0 from "@angular/core";
24
- import * as i1 from "@angular/forms";
25
- import * as i2 from "@taiga-ui/kit/components/data-list-wrapper";
26
- import * as i3 from "@taiga-ui/core/components/data-list";
27
- import * as i4 from "@taiga-ui/core/components/expand";
28
- import * as i5 from "@taiga-ui/legacy/components/select";
29
- import * as i6 from "@taiga-ui/legacy/directives/textfield-controller";
30
- const MIN_WIDTH = 160;
31
- class TuiDocDemo {
32
- constructor() {
33
- this.el = tuiInjectElement();
34
- this.locationRef = inject(Location);
35
- this.urlSerializer = inject(UrlSerializer);
36
- this.urlStateHandler = inject(TUI_DOC_URL_STATE_HANDLER);
37
- this.darkMode = inject(TUI_DARK_MODE);
38
- this.template = null;
39
- this.rendered = signal(false);
40
- this.theme = computed(() => (this.dark() ? 'dark' : 'light'));
41
- this.dark = signal(tuiCoerceValueIsTrue(this.params.darkMode ?? this.darkMode()));
42
- this.$ = toObservable(this.darkMode)
43
- .pipe(skip(1), takeUntilDestroyed())
44
- .subscribe((mode) => this.onModeChange(mode));
45
- this.updateOnVariants = ['change', 'blur', 'submit'];
46
- this.updateOn = this.params.updateOn || this.updateOnVariants[0];
47
- this.opaque = tuiCoerceValueIsTrue(this.params.sandboxOpaque ?? true);
48
- this.expanded = tuiCoerceValueIsTrue(this.params.sandboxExpanded ?? false);
49
- this.sandboxWidth = tuiToInteger(this.params.sandboxWidth);
50
- this.texts = inject(TUI_DOC_DEMO_TEXTS);
51
- this.control = null;
52
- this.sticky = true;
53
- }
54
- ngAfterViewInit() {
55
- this.createForm();
56
- this.updateWidth(this.sandboxWidth + this.delta);
57
- this.rendered.set(true);
58
- }
59
- onResize() {
60
- this.updateWidth();
61
- this.onMouseUp();
62
- }
63
- onMouseUp() {
64
- this.updateUrl({ sandboxWidth: this.sandboxWidth });
65
- }
66
- onModeChange(darkMode) {
67
- this.dark.set(darkMode);
68
- this.updateUrl({ sandboxWidth: this.sandboxWidth, darkMode });
69
- }
70
- toggleDetails() {
71
- this.expanded = !this.expanded;
72
- this.updateUrl({ sandboxExpanded: this.expanded });
73
- }
74
- changeOpaque(opaque) {
75
- this.opaque = opaque;
76
- this.updateUrl({ sandboxOpaque: this.opaque });
77
- }
78
- updateOnChange(updateOn) {
79
- this.updateOn = updateOn;
80
- this.updateUrl({ updateOn });
81
- this.createForm();
82
- }
83
- updateWidth(width = NaN) {
84
- if (!this.resizer || !this.resizable || !this.content) {
85
- return;
86
- }
87
- const safe = width || this.resizable.nativeElement.clientWidth;
88
- const total = this.el.clientWidth;
89
- const clamped = Math.round(tuiClamp(safe, MIN_WIDTH, total)) - this.delta;
90
- const validated = safe < total ? clamped : NaN;
91
- this.resizer.nativeElement.textContent = String(clamped || '-');
92
- this.resizable.nativeElement.style.width = validated ? tuiPx(safe) : '';
93
- this.sandboxWidth = validated;
94
- }
95
- get delta() {
96
- return this.resizable && this.content
97
- ? this.resizable.nativeElement.clientWidth -
98
- this.content.nativeElement.clientWidth
99
- : 0;
100
- }
101
- get params() {
102
- return this.getUrlTree().queryParams;
103
- }
104
- updateUrl(params) {
105
- const tree = this.getUrlTree();
106
- const { queryParams } = tree;
107
- delete queryParams.sandboxWidth;
108
- tree.queryParams = {
109
- ...queryParams,
110
- ...tuiCleanObject({ ...params }),
111
- };
112
- this.locationRef.go(this.urlStateHandler(tree));
113
- }
114
- createForm() {
115
- const { control, updateOn } = this;
116
- if (control) {
117
- this.testForm = new FormGroup({ testValue: control }, { updateOn });
118
- }
119
- }
120
- getUrlTree() {
121
- return this.urlSerializer.parse(this.locationRef.path());
122
- }
123
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDocDemo, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
124
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiDocDemo, isStandalone: true, selector: "tui-doc-demo", inputs: { control: "control", sticky: "sticky" }, host: { listeners: { "window:resize": "onResize()", "document:mouseup.zoneless": "onMouseUp()" }, properties: { "class._sticky": "sticky" } }, queries: [{ propertyName: "template", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "resizable", first: true, predicate: TuiResizable, descendants: true, static: true }, { propertyName: "content", first: true, predicate: ["content"], descendants: true, static: true }, { propertyName: "resizer", first: true, predicate: ["resizer"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"t-settings\">\n <label class=\"t-label\">\n <input\n size=\"s\"\n tuiSwitch\n type=\"checkbox\"\n [ngModel]=\"dark()\"\n (ngModelChange)=\"onModeChange($event)\"\n />\n {{ texts[0] }}\n </label>\n <label class=\"t-label\">\n <input\n size=\"s\"\n tuiSwitch\n type=\"checkbox\"\n [ngModel]=\"opaque\"\n (ngModelChange)=\"changeOpaque($event)\"\n />\n {{ texts[1] }}\n </label>\n</div>\n<div\n tuiResizable\n class=\"t-wrapper\"\n [attr.tuiTheme]=\"theme()\"\n [class.t-wrapper_transparent]=\"!opaque\"\n [style.visibility]=\"rendered() ? 'visible' : 'hidden'\"\n>\n <div class=\"t-content\">\n <div\n #content\n id=\"demo-content\"\n >\n <form\n *ngIf=\"testForm\"\n class=\"t-form\"\n [formGroup]=\"testForm\"\n >\n <div class=\"t-input-wrapper\">\n <ng-container [ngTemplateOutlet]=\"template\" />\n </div>\n <button\n automation-id=\"tui-demo-button__toggle-details\"\n size=\"s\"\n tuiButton\n type=\"button\"\n class=\"t-button\"\n [tuiChevron]=\"expanded\"\n (click)=\"toggleDetails()\"\n >\n {{ texts[2] }}\n </button>\n <tui-expand\n class=\"t-expand\"\n [expanded]=\"expanded\"\n >\n <ng-template tuiExpandContent>\n <pre class=\"t-value\">Form data: {{ testForm.value | json }}</pre>\n <div\n tuiGroup\n class=\"t-form-controls\"\n >\n <tui-select\n automation-id=\"tui-demo-select__expand-update-on\"\n tuiTextfieldSize=\"s\"\n class=\"t-select\"\n [ngModel]=\"updateOn\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"updateOnChange($event)\"\n >\n updateOn\n <tui-data-list-wrapper\n *tuiDataList\n [items]=\"updateOnVariants\"\n />\n </tui-select>\n <button\n automation-id=\"tui-demo-button__reset-state\"\n size=\"s\"\n tuiButton\n type=\"reset\"\n [style.flex]=\"'0 0 auto'\"\n >\n Reset\n </button>\n <button\n automation-id=\"tui-demo-button__submit-state\"\n size=\"s\"\n tuiButton\n type=\"submit\"\n [style.flex]=\"'0 0 auto'\"\n >\n Submit\n </button>\n </div>\n </ng-template>\n </tui-expand>\n </form>\n <ng-content />\n </div>\n </div>\n <div\n #resizer\n class=\"t-resizer\"\n [tuiResizer]=\"[1, 0]\"\n (tuiSizeChange)=\"updateWidth($event[0])\"\n ></div>\n</div>\n", styles: [":host{position:relative;display:block;min-inline-size:100%;margin:1.5rem 0;pointer-events:none;font:var(--tui-font-text-s)}.t-settings{position:absolute;bottom:calc(100% + .75rem);display:flex;gap:1rem;align-items:center;justify-content:flex-end;pointer-events:none;inline-size:100%}.t-settings>*{pointer-events:auto}.t-label{display:flex;align-items:center;gap:.5rem}.t-wrapper{display:flex;box-shadow:var(--tui-shadow-medium);border:1px solid var(--tui-border-normal);border-radius:var(--tui-radius-m);max-inline-size:100%;min-block-size:6rem;inline-size:100%;min-inline-size:10rem;color:var(--tui-text-primary);background-color:var(--tui-background-base);overflow:hidden;pointer-events:auto}.t-wrapper.t-wrapper_transparent{background-image:linear-gradient(45deg,var(--tui-background-base-alt) 25%,transparent 25%),linear-gradient(-45deg,var(--tui-background-base-alt) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,var(--tui-background-base-alt) 75%),linear-gradient(-45deg,transparent 75%,var(--tui-background-base-alt) 75%);background-size:1.25rem 1.25rem;background-position:0 0,0 .625rem,.625rem -.625rem,-.625rem 0}@media screen and (max-width: 47.9625em){.t-wrapper{min-block-size:auto}}.t-content{flex:1 1 0;min-inline-size:0;padding:1.5rem;box-sizing:border-box;overflow:hidden}@media screen and (max-width: 47.9625em){.t-content{padding:1rem}}.t-form{display:flex;flex-wrap:wrap;align-items:flex-start}.t-input-wrapper{inline-size:100%;margin-block-end:.5rem}.t-expand{inline-size:100%}.t-value{flex:1;background:var(--tui-background-neutral-1);padding:.75rem;border-radius:.25rem}.t-mode{inline-size:12.5rem}.t-select{max-inline-size:15rem}.t-resizer{position:relative;display:flex;box-shadow:var(--tui-shadow-medium);inline-size:3.5rem;min-block-size:inherit;align-items:center;justify-content:center;flex-shrink:0;border-inline-start:1px solid var(--tui-border-normal);outline:none;background:var(--tui-background-base);color:var(--tui-text-primary)}.t-resizer:before,.t-resizer:after{content:\"\";position:absolute;top:.75rem;left:50%;bottom:calc(50% + 1rem);inline-size:1px;background:var(--tui-border-normal);box-shadow:-.25rem 0 var(--tui-border-normal);transform:translateZ(0)}.t-resizer:after{bottom:.75rem;top:calc(50% + 1rem)}@media screen and (max-width: 47.9625em){.t-resizer{display:none}}.t-resizer-text{position:relative;z-index:1;font:var(--tui-font-text-s);padding:.75rem;background:var(--tui-background-base)}.wrapper_light .t-resizer-text{background:#3e464e}.t-group,.t-checkbox{display:flex;align-items:center;margin-inline-start:.75rem}.t-button,.t-form-controls{margin-block-start:.75rem}@supports (position: sticky){@media screen and (min-height: 37.5rem){:host._sticky{position:sticky;top:4.625rem;z-index:2}}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: JsonPipe, name: "json" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: TuiChevron, selector: "[tuiChevron]", inputs: ["tuiChevron"] }, { kind: "component", type: i2.TuiDataListWrapperComponent, selector: "tui-data-list-wrapper:not([labels]), tui-data-list-wrapper:not([labels])[new]", inputs: ["items", "disabledItemHandler", "emptyContent", "size", "itemContent"], outputs: ["itemClick"] }, { kind: "directive", type: i3.TuiDataListDirective, selector: "ng-template[tuiDataList]" }, { kind: "component", type: i4.TuiExpandComponent, selector: "tui-expand", inputs: ["async", "expanded"] }, { kind: "directive", type: i4.TuiExpandContent, selector: "[tuiExpandContent]" }, { kind: "directive", type: TuiGroup, selector: "[tuiGroup]:not(ng-container)", inputs: ["orientation", "collapsed", "rounded", "size"] }, { kind: "directive", type: TuiResizable, selector: "[tuiResizable]" }, { kind: "directive", type: TuiResizer, selector: "[tuiResizer]", inputs: ["tuiResizer"], outputs: ["tuiSizeChange"] }, { kind: "ngmodule", type: TuiSelectModule }, { kind: "component", type: i5.TuiSelectComponent, selector: "tui-select", inputs: ["stringify", "identityMatcher", "valueContent"] }, { kind: "directive", type: i5.TuiSelectDirective, selector: "tui-select" }, { kind: "component", type: TuiSwitch, selector: "input[type=\"checkbox\"][tuiSwitch]", inputs: ["size", "showIcons"] }, { kind: "ngmodule", type: TuiTextfieldControllerModule }, { kind: "directive", type: i6.TuiTextfieldSizeDirective, selector: "[tuiTextfieldSize]", inputs: ["tuiTextfieldSize"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
125
- }
126
- __decorate([
127
- tuiPure
128
- ], TuiDocDemo.prototype, "updateUrl", null);
129
- export { TuiDocDemo };
130
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDocDemo, decorators: [{
131
- type: Component,
132
- args: [{ standalone: true, selector: 'tui-doc-demo', imports: [
133
- FormsModule,
134
- JsonPipe,
135
- NgIf,
136
- NgTemplateOutlet,
137
- ReactiveFormsModule,
138
- TuiButton,
139
- TuiChevron,
140
- TuiDataListWrapper,
141
- TuiExpand,
142
- TuiGroup,
143
- TuiResizable,
144
- TuiResizer,
145
- TuiSelectModule,
146
- TuiSwitch,
147
- TuiTextfieldControllerModule,
148
- ], changeDetection: ChangeDetectionStrategy.OnPush, host: {
149
- '[class._sticky]': 'sticky',
150
- '(window:resize)': 'onResize()',
151
- '(document:mouseup.zoneless)': 'onMouseUp()',
152
- }, template: "<div class=\"t-settings\">\n <label class=\"t-label\">\n <input\n size=\"s\"\n tuiSwitch\n type=\"checkbox\"\n [ngModel]=\"dark()\"\n (ngModelChange)=\"onModeChange($event)\"\n />\n {{ texts[0] }}\n </label>\n <label class=\"t-label\">\n <input\n size=\"s\"\n tuiSwitch\n type=\"checkbox\"\n [ngModel]=\"opaque\"\n (ngModelChange)=\"changeOpaque($event)\"\n />\n {{ texts[1] }}\n </label>\n</div>\n<div\n tuiResizable\n class=\"t-wrapper\"\n [attr.tuiTheme]=\"theme()\"\n [class.t-wrapper_transparent]=\"!opaque\"\n [style.visibility]=\"rendered() ? 'visible' : 'hidden'\"\n>\n <div class=\"t-content\">\n <div\n #content\n id=\"demo-content\"\n >\n <form\n *ngIf=\"testForm\"\n class=\"t-form\"\n [formGroup]=\"testForm\"\n >\n <div class=\"t-input-wrapper\">\n <ng-container [ngTemplateOutlet]=\"template\" />\n </div>\n <button\n automation-id=\"tui-demo-button__toggle-details\"\n size=\"s\"\n tuiButton\n type=\"button\"\n class=\"t-button\"\n [tuiChevron]=\"expanded\"\n (click)=\"toggleDetails()\"\n >\n {{ texts[2] }}\n </button>\n <tui-expand\n class=\"t-expand\"\n [expanded]=\"expanded\"\n >\n <ng-template tuiExpandContent>\n <pre class=\"t-value\">Form data: {{ testForm.value | json }}</pre>\n <div\n tuiGroup\n class=\"t-form-controls\"\n >\n <tui-select\n automation-id=\"tui-demo-select__expand-update-on\"\n tuiTextfieldSize=\"s\"\n class=\"t-select\"\n [ngModel]=\"updateOn\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"updateOnChange($event)\"\n >\n updateOn\n <tui-data-list-wrapper\n *tuiDataList\n [items]=\"updateOnVariants\"\n />\n </tui-select>\n <button\n automation-id=\"tui-demo-button__reset-state\"\n size=\"s\"\n tuiButton\n type=\"reset\"\n [style.flex]=\"'0 0 auto'\"\n >\n Reset\n </button>\n <button\n automation-id=\"tui-demo-button__submit-state\"\n size=\"s\"\n tuiButton\n type=\"submit\"\n [style.flex]=\"'0 0 auto'\"\n >\n Submit\n </button>\n </div>\n </ng-template>\n </tui-expand>\n </form>\n <ng-content />\n </div>\n </div>\n <div\n #resizer\n class=\"t-resizer\"\n [tuiResizer]=\"[1, 0]\"\n (tuiSizeChange)=\"updateWidth($event[0])\"\n ></div>\n</div>\n", styles: [":host{position:relative;display:block;min-inline-size:100%;margin:1.5rem 0;pointer-events:none;font:var(--tui-font-text-s)}.t-settings{position:absolute;bottom:calc(100% + .75rem);display:flex;gap:1rem;align-items:center;justify-content:flex-end;pointer-events:none;inline-size:100%}.t-settings>*{pointer-events:auto}.t-label{display:flex;align-items:center;gap:.5rem}.t-wrapper{display:flex;box-shadow:var(--tui-shadow-medium);border:1px solid var(--tui-border-normal);border-radius:var(--tui-radius-m);max-inline-size:100%;min-block-size:6rem;inline-size:100%;min-inline-size:10rem;color:var(--tui-text-primary);background-color:var(--tui-background-base);overflow:hidden;pointer-events:auto}.t-wrapper.t-wrapper_transparent{background-image:linear-gradient(45deg,var(--tui-background-base-alt) 25%,transparent 25%),linear-gradient(-45deg,var(--tui-background-base-alt) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,var(--tui-background-base-alt) 75%),linear-gradient(-45deg,transparent 75%,var(--tui-background-base-alt) 75%);background-size:1.25rem 1.25rem;background-position:0 0,0 .625rem,.625rem -.625rem,-.625rem 0}@media screen and (max-width: 47.9625em){.t-wrapper{min-block-size:auto}}.t-content{flex:1 1 0;min-inline-size:0;padding:1.5rem;box-sizing:border-box;overflow:hidden}@media screen and (max-width: 47.9625em){.t-content{padding:1rem}}.t-form{display:flex;flex-wrap:wrap;align-items:flex-start}.t-input-wrapper{inline-size:100%;margin-block-end:.5rem}.t-expand{inline-size:100%}.t-value{flex:1;background:var(--tui-background-neutral-1);padding:.75rem;border-radius:.25rem}.t-mode{inline-size:12.5rem}.t-select{max-inline-size:15rem}.t-resizer{position:relative;display:flex;box-shadow:var(--tui-shadow-medium);inline-size:3.5rem;min-block-size:inherit;align-items:center;justify-content:center;flex-shrink:0;border-inline-start:1px solid var(--tui-border-normal);outline:none;background:var(--tui-background-base);color:var(--tui-text-primary)}.t-resizer:before,.t-resizer:after{content:\"\";position:absolute;top:.75rem;left:50%;bottom:calc(50% + 1rem);inline-size:1px;background:var(--tui-border-normal);box-shadow:-.25rem 0 var(--tui-border-normal);transform:translateZ(0)}.t-resizer:after{bottom:.75rem;top:calc(50% + 1rem)}@media screen and (max-width: 47.9625em){.t-resizer{display:none}}.t-resizer-text{position:relative;z-index:1;font:var(--tui-font-text-s);padding:.75rem;background:var(--tui-background-base)}.wrapper_light .t-resizer-text{background:#3e464e}.t-group,.t-checkbox{display:flex;align-items:center;margin-inline-start:.75rem}.t-button,.t-form-controls{margin-block-start:.75rem}@supports (position: sticky){@media screen and (min-height: 37.5rem){:host._sticky{position:sticky;top:4.625rem;z-index:2}}}\n"] }]
153
- }], propDecorators: { resizable: [{
154
- type: ViewChild,
155
- args: [TuiResizable, { static: true }]
156
- }], content: [{
157
- type: ViewChild,
158
- args: ['content', { static: true }]
159
- }], resizer: [{
160
- type: ViewChild,
161
- args: ['resizer', { static: true }]
162
- }], template: [{
163
- type: ContentChild,
164
- args: [TemplateRef]
165
- }], control: [{
166
- type: Input
167
- }], sticky: [{
168
- type: Input
169
- }], updateUrl: [] } });
170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZGRvbi1kb2MvY29tcG9uZW50cy9kZW1vL2luZGV4LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWRkb24tZG9jL2NvbXBvbmVudHMvZGVtby9pbmRleC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRSxPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsWUFBWSxFQUVaLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGtCQUFrQixFQUFFLFlBQVksRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzVFLE9BQU8sRUFFSCxTQUFTLEVBQ1QsV0FBVyxFQUNYLG1CQUFtQixHQUN0QixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBYyxhQUFhLEVBQWUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RSxPQUFPLEVBQUMsa0JBQWtCLEVBQUUseUJBQXlCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUV6RixPQUFPLEVBQUMsY0FBYyxFQUFFLG9CQUFvQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDL0UsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsUUFBUSxFQUFFLFlBQVksRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDakUsT0FBTyxFQUFD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QkFDVCxVQUFVO3dCQUNWLGtCQUFrQjt3QkFDbEIsU0FBUzt3QkFDVCxRQUFRO3dCQUNSLFlBQVk7d0JBQ1osVUFBVTt3QkFDVixlQUFlO3dCQUNmLFNBQVM7d0JBQ1QsNEJBQTRCO3FCQUMvQixtQkFHZ0IsdUJBQXVCLENBQUMsTUFBTSxRQUN6Qzt3QkFDRixpQkFBaUIsRUFBRSxRQUFRO3dCQUMzQixpQkFBaUIsRUFBRSxZQUFZO3dCQUMvQiw2QkFBNkIsRUFBRSxhQUFhO3FCQUMvQzs4QkFJZ0IsU0FBUztzQkFEekIsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUl0QixPQUFPO3NCQUR2QixTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBSW5CLE9BQU87c0JBRHZCLFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFVakIsUUFBUTtzQkFEMUIsWUFBWTt1QkFBQyxXQUFXO2dCQTRCbEIsT0FBTztzQkFEYixLQUFLO2dCQUlDLE1BQU07c0JBRFosS0FBSztnQkFrRUUsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SnNvblBpcGUsIExvY2F0aW9uLCBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0fSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICB0eXBlIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICB0eXBlIEVsZW1lbnRSZWYsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIHNpZ25hbCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHt0YWtlVW50aWxEZXN0cm95ZWQsIHRvT2JzZXJ2YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtcbiAgICB0eXBlIEFic3RyYWN0Q29udHJvbCxcbiAgICBGb3JtR3JvdXAsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHt0eXBlIFBhcmFtcywgVXJsU2VyaWFsaXplciwgdHlwZSBVcmxUcmVlfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtUVUlfRE9DX0RFTU9fVEVYVFMsIFRVSV9ET0NfVVJMX1NUQVRFX0hBTkRMRVJ9IGZyb20gJ0B0YWlnYS11aS9hZGRvbi1kb2MvdG9rZW5zJztcbmltcG9ydCB7dHlwZSBUdWlEZW1vUGFyYW1zfSBmcm9tICdAdGFpZ2EtdWkvYWRkb24tZG9jL3R5cGVzJztcbmltcG9ydCB7dHVpQ2xlYW5PYmplY3QsIHR1aUNvZXJjZVZhbHVlSXNUcnVlfSBmcm9tICdAdGFpZ2EtdWkvYWRkb24tZG9jL3V0aWxzJztcbmltcG9ydCB7VHVpUmVzaXphYmxlLCBUdWlSZXNpemVyfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RpcmVjdGl2ZXMvcmVzaXplcic7XG5pbXBvcnQge3R1aUluamVjdEVsZW1lbnR9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvZG9tJztcbmltcG9ydCB7dHVpQ2xhbXAsIHR1aVRvSW50ZWdlcn0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9tYXRoJztcbmltcG9ydCB7dHVpUHVyZSwgdHVpUHh9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWlzY2VsbGFuZW91cyc7XG5pbXBvcnQge1R1aUJ1dHRvbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9idXR0b24nO1xuaW1wb3J0IHtUdWlFeHBhbmR9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvZXhwYW5kJztcbmltcG9ydCB7VHVpR3JvdXB9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2RpcmVjdGl2ZXMvZ3JvdXAnO1xuaW1wb3J0IHtUVUlfREFSS19NT0RFfSBmcm9tICdAdGFpZ2EtdWkvY29yZS90b2tlbnMnO1xuaW1wb3J0IHtUdWlEYXRhTGlzdFdyYXBwZXJ9IGZyb20gJ0B0YWlnYS11aS9raXQvY29tcG9uZW50cy9kYXRhLWxpc3Qtd3JhcHBlcic7XG5pbXBvcnQge1R1aVN3aXRjaH0gZnJvbSAnQHRhaWdhLXVpL2tpdC9jb21wb25lbnRzL3N3aXRjaCc7XG5pbXBvcnQge1R1aUNoZXZyb259IGZyb20gJ0B0YWlnYS11aS9raXQvZGlyZWN0aXZlcy9jaGV2cm9uJztcbmltcG9ydCB7VHVpU2VsZWN0TW9kdWxlfSBmcm9tICdAdGFpZ2EtdWkvbGVnYWN5L2NvbXBvbmVudHMvc2VsZWN0JztcbmltcG9ydCB7VHVpVGV4dGZpZWxkQ29udHJvbGxlck1vZHVsZX0gZnJvbSAnQHRhaWdhLXVpL2xlZ2FjeS9kaXJlY3RpdmVzL3RleHRmaWVsZC1jb250cm9sbGVyJztcbmltcG9ydCB7c2tpcH0gZnJvbSAncnhqcyc7XG5cbmNvbnN0IE1JTl9XSURUSCA9IDE2MDtcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ3R1aS1kb2MtZGVtbycsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBGb3Jtc01vZHVsZSxcbiAgICAgICAgSnNvblBpcGUsXG4gICAgICAgIE5nSWYsXG4gICAgICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIFR1aUJ1dHRvbixcbiAgICAgICAgVHVpQ2hldnJvbixcbiAgICAgICAgVHVpRGF0YUxpc3RXcmFwcGVyLFxuICAgICAgICBUdWlFeHBhbmQsXG4gICAgICAgIFR1aUdyb3VwLFxuICAgICAgICBUdWlSZXNpemFibGUsXG4gICAgICAgIFR1aVJlc2l6ZXIsXG4gICAgICAgIFR1aVNlbGVjdE1vZHVsZSxcbiAgICAgICAgVHVpU3dpdGNoLFxuICAgICAgICBUdWlUZXh0ZmllbGRDb250cm9sbGVyTW9kdWxlLFxuICAgIF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL2luZGV4Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2luZGV4Lmxlc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBob3N0OiB7XG4gICAgICAgICdbY2xhc3MuX3N0aWNreV0nOiAnc3RpY2t5JyxcbiAgICAgICAgJyh3aW5kb3c6cmVzaXplKSc6ICdvblJlc2l6ZSgpJyxcbiAgICAgICAgJyhkb2N1bWVudDptb3VzZXVwLnpvbmVsZXNzKSc6ICdvbk1vdXNlVXAoKScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpRG9jRGVtbyBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICAgIEBWaWV3Q2hpbGQoVHVpUmVzaXphYmxlLCB7c3RhdGljOiB0cnVlfSlcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc2l6YWJsZT86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgnY29udGVudCcsIHtzdGF0aWM6IHRydWV9KVxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udGVudD86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgncmVzaXplcicsIHtzdGF0aWM6IHRydWV9KVxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzaXplcj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbCA9IHR1aUluamVjdEVsZW1lbnQoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvY2F0aW9uUmVmID0gaW5qZWN0KExvY2F0aW9uKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVybFNlcmlhbGl6ZXIgPSBpbmplY3QoVXJsU2VyaWFsaXplcik7XG4gICAgcHJpdmF0ZSByZWFkb25seSB1cmxTdGF0ZUhhbmRsZXIgPSBpbmplY3QoVFVJX0RPQ19VUkxfU1RBVEVfSEFORExFUik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkYXJrTW9kZSA9IGluamVjdChUVUlfREFSS19NT0RFKTtcblxuICAgIEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYpXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCBudWxsID0gbnVsbDtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSByZW5kZXJlZCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgICBwcm90ZWN0ZWQgdGhlbWUgPSBjb21wdXRlZCgoKSA9PiAodGhpcy5kYXJrKCkgPyAnZGFyaycgOiAnbGlnaHQnKSk7XG5cbiAgICBwcm90ZWN0ZWQgZGFyayA9IHNpZ25hbChcbiAgICAgICAgdHVpQ29lcmNlVmFsdWVJc1RydWUodGhpcy5wYXJhbXMuZGFya01vZGUgPz8gdGhpcy5kYXJrTW9kZSgpKSxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5ICQgPSB0b09ic2VydmFibGUodGhpcy5kYXJrTW9kZSlcbiAgICAgICAgLnBpcGUoc2tpcCgxKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKG1vZGUpID0+IHRoaXMub25Nb2RlQ2hhbmdlKG1vZGUpKTtcblxuICAgIHByb3RlY3RlZCB0ZXN0Rm9ybT86IEZvcm1Hcm91cDtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSB1cGRhdGVPblZhcmlhbnRzID0gWydjaGFuZ2UnLCAnYmx1cicsICdzdWJtaXQnXSBhcyBjb25zdDtcblxuICAgIHByb3RlY3RlZCB1cGRhdGVPbjogJ2JsdXInIHwgJ2NoYW5nZScgfCAnc3VibWl0JyA9XG4gICAgICAgIHRoaXMucGFyYW1zLnVwZGF0ZU9uIHx8IHRoaXMudXBkYXRlT25WYXJpYW50c1swXTtcblxuICAgIHByb3RlY3RlZCBvcGFxdWUgPSB0dWlDb2VyY2VWYWx1ZUlzVHJ1ZSh0aGlzLnBhcmFtcy5zYW5kYm94T3BhcXVlID8/IHRydWUpO1xuICAgIHByb3RlY3RlZCBleHBhbmRlZCA9IHR1aUNvZXJjZVZhbHVlSXNUcnVlKHRoaXMucGFyYW1zLnNhbmRib3hFeHBhbmRlZCA/PyBmYWxzZSk7XG4gICAgcHJvdGVjdGVkIHNhbmRib3hXaWR0aCA9IHR1aVRvSW50ZWdlcih0aGlzLnBhcmFtcy5zYW5kYm94V2lkdGgpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSB0ZXh0cyA9IGluamVjdChUVUlfRE9DX0RFTU9fVEVYVFMpO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY29udHJvbDogQWJzdHJhY3RDb250cm9sIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzdGlja3kgPSB0cnVlO1xuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JtKCk7XG4gICAgICAgIHRoaXMudXBkYXRlV2lkdGgodGhpcy5zYW5kYm94V2lkdGggKyB0aGlzLmRlbHRhKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlZC5zZXQodHJ1ZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uUmVzaXplKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZHRoKCk7XG4gICAgICAgIHRoaXMub25Nb3VzZVVwKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uTW91c2VVcCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGRhdGVVcmwoe3NhbmRib3hXaWR0aDogdGhpcy5zYW5kYm94V2lkdGh9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25Nb2RlQ2hhbmdlKGRhcmtNb2RlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGFyay5zZXQoZGFya01vZGUpO1xuICAgICAgICB0aGlzLnVwZGF0ZVVybCh7c2FuZGJveFdpZHRoOiB0aGlzLnNhbmRib3hXaWR0aCwgZGFya01vZGV9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdG9nZ2xlRGV0YWlscygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5leHBhbmRlZCA9ICF0aGlzLmV4cGFuZGVkO1xuICAgICAgICB0aGlzLnVwZGF0ZVVybCh7c2FuZGJveEV4cGFuZGVkOiB0aGlzLmV4cGFuZGVkfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNoYW5nZU9wYXF1ZShvcGFxdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vcGFxdWUgPSBvcGFxdWU7XG4gICAgICAgIHRoaXMudXBkYXRlVXJsKHtzYW5kYm94T3BhcXVlOiB0aGlzLm9wYXF1ZX0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB1cGRhdGVPbkNoYW5nZSh1cGRhdGVPbjogJ2JsdXInIHwgJ2NoYW5nZScgfCAnc3VibWl0Jyk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZU9uID0gdXBkYXRlT247XG4gICAgICAgIHRoaXMudXBkYXRlVXJsKHt1cGRhdGVPbn0pO1xuICAgICAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdXBkYXRlV2lkdGgod2lkdGggPSBOYU4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlc2l6ZXIgfHwgIXRoaXMucmVzaXphYmxlIHx8ICF0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNhZmUgPSB3aWR0aCB8fCB0aGlzLnJlc2l6YWJsZS5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgICBjb25zdCB0b3RhbCA9IHRoaXMuZWwuY2xpZW50V2lkdGg7XG4gICAgICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLnJvdW5kKHR1aUNsYW1wKHNhZmUsIE1JTl9XSURUSCwgdG90YWwpKSAtIHRoaXMuZGVsdGE7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZCA9IHNhZmUgPCB0b3RhbCA/IGNsYW1wZWQgOiBOYU47XG5cbiAgICAgICAgdGhpcy5yZXNpemVyLm5hdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQgPSBTdHJpbmcoY2xhbXBlZCB8fCAnLScpO1xuICAgICAgICB0aGlzLnJlc2l6YWJsZS5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gdmFsaWRhdGVkID8gdHVpUHgoc2FmZSkgOiAnJztcbiAgICAgICAgdGhpcy5zYW5kYm94V2lkdGggPSB2YWxpZGF0ZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgZGVsdGEoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXphYmxlICYmIHRoaXMuY29udGVudFxuICAgICAgICAgICAgPyB0aGlzLnJlc2l6YWJsZS5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoIC1cbiAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoXG4gICAgICAgICAgICA6IDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgcGFyYW1zKCk6IFBhcmFtcyB8IFR1aURlbW9QYXJhbXMge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRVcmxUcmVlKCkucXVlcnlQYXJhbXM7XG4gICAgfVxuXG4gICAgQHR1aVB1cmVcbiAgICBwcml2YXRlIHVwZGF0ZVVybChwYXJhbXM6IFR1aURlbW9QYXJhbXMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdHJlZSA9IHRoaXMuZ2V0VXJsVHJlZSgpO1xuICAgICAgICBjb25zdCB7cXVlcnlQYXJhbXN9ID0gdHJlZTtcblxuICAgICAgICBkZWxldGUgcXVlcnlQYXJhbXMuc2FuZGJveFdpZHRoO1xuXG4gICAgICAgIHRyZWUucXVlcnlQYXJhbXMgPSB7XG4gICAgICAgICAgICAuLi5xdWVyeVBhcmFtcyxcbiAgICAgICAgICAgIC4uLnR1aUNsZWFuT2JqZWN0KHsuLi5wYXJhbXN9KSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmxvY2F0aW9uUmVmLmdvKHRoaXMudXJsU3RhdGVIYW5kbGVyKHRyZWUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUZvcm0oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHtjb250cm9sLCB1cGRhdGVPbn0gPSB0aGlzO1xuXG4gICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLnRlc3RGb3JtID0gbmV3IEZvcm1Hcm91cCh7dGVzdFZhbHVlOiBjb250cm9sfSwge3VwZGF0ZU9ufSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFVybFRyZWUoKTogVXJsVHJlZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVybFNlcmlhbGl6ZXIucGFyc2UodGhpcy5sb2NhdGlvblJlZi5wYXRoKCkpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0LXNldHRpbmdzXCI+XG4gICAgPGxhYmVsIGNsYXNzPVwidC1sYWJlbFwiPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHNpemU9XCJzXCJcbiAgICAgICAgICAgIHR1aVN3aXRjaFxuICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cImRhcmsoKVwiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbk1vZGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIC8+XG4gICAgICAgIHt7IHRleHRzWzBdIH19XG4gICAgPC9sYWJlbD5cbiAgICA8bGFiZWwgY2xhc3M9XCJ0LWxhYmVsXCI+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgICAgdHVpU3dpdGNoXG4gICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwib3BhcXVlXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZU9wYXF1ZSgkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgICAge3sgdGV4dHNbMV0gfX1cbiAgICA8L2xhYmVsPlxuPC9kaXY+XG48ZGl2XG4gICAgdHVpUmVzaXphYmxlXG4gICAgY2xhc3M9XCJ0LXdyYXBwZXJcIlxuICAgIFthdHRyLnR1aVRoZW1lXT1cInRoZW1lKClcIlxuICAgIFtjbGFzcy50LXdyYXBwZXJfdHJhbnNwYXJlbnRdPVwiIW9wYXF1ZVwiXG4gICAgW3N0eWxlLnZpc2liaWxpdHldPVwicmVuZGVyZWQoKSA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nXCJcbj5cbiAgICA8ZGl2IGNsYXNzPVwidC1jb250ZW50XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICNjb250ZW50XG4gICAgICAgICAgICBpZD1cImRlbW8tY29udGVudFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxmb3JtXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJ0ZXN0Rm9ybVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0LWZvcm1cIlxuICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwidGVzdEZvcm1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0LWlucHV0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aW9uLWlkPVwidHVpLWRlbW8tYnV0dG9uX190b2dnbGUtZGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgICAgIHNpemU9XCJzXCJcbiAgICAgICAgICAgICAgICAgICAgdHVpQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInQtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgW3R1aUNoZXZyb25dPVwiZXhwYW5kZWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRGV0YWlscygpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7IHRleHRzWzJdIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPHR1aS1leHBhbmRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0LWV4cGFuZFwiXG4gICAgICAgICAgICAgICAgICAgIFtleHBhbmRlZF09XCJleHBhbmRlZFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgdHVpRXhwYW5kQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9XCJ0LXZhbHVlXCI+Rm9ybSBkYXRhOiB7eyB0ZXN0Rm9ybS52YWx1ZSB8IGpzb24gfX08L3ByZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlHcm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidC1mb3JtLWNvbnRyb2xzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHVpLXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aW9uLWlkPVwidHVpLWRlbW8tc2VsZWN0X19leHBhbmQtdXBkYXRlLW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpVGV4dGZpZWxkU2l6ZT1cInNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInQtc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwidXBkYXRlT25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVPblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHVpLWRhdGEtbGlzdC13cmFwcGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHVpRGF0YUxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJ1cGRhdGVPblZhcmlhbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3R1aS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aW9uLWlkPVwidHVpLWRlbW8tYnV0dG9uX19yZXNldC1zdGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJyZXNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mbGV4XT1cIicwIDAgYXV0bydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpb24taWQ9XCJ0dWktZGVtby1idXR0b25fX3N1Ym1pdC1zdGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZmxleF09XCInMCAwIGF1dG8nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym1pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC90dWktZXhwYW5kPlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgICAjcmVzaXplclxuICAgICAgICBjbGFzcz1cInQtcmVzaXplclwiXG4gICAgICAgIFt0dWlSZXNpemVyXT1cIlsxLCAwXVwiXG4gICAgICAgICh0dWlTaXplQ2hhbmdlKT1cInVwZGF0ZVdpZHRoKCRldmVudFswXSlcIlxuICAgID48L2Rpdj5cbjwvZGl2PlxuIl19
@@ -1,17 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- class TuiDocTab {
4
- constructor() {
5
- this.src = '';
6
- }
7
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDocTab, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiDocTab, isStandalone: true, selector: "tui-doc-tab", inputs: { src: "src" }, ngImport: i0, template: "<div class=\"t-tab\">\n <img\n alt=\"Documentation tab icon\"\n class=\"t-icon\"\n [src]=\"src\"\n />\n <ng-content />\n</div>\n", styles: [".t-tab{display:flex;align-items:center;justify-content:center;padding:0 .5rem;gap:.5rem;color:var(--tui-text-primary)}.t-tab .t-icon{inline-size:1rem;block-size:1rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9
- }
10
- export { TuiDocTab };
11
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDocTab, decorators: [{
12
- type: Component,
13
- args: [{ standalone: true, selector: 'tui-doc-tab', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"t-tab\">\n <img\n alt=\"Documentation tab icon\"\n class=\"t-icon\"\n [src]=\"src\"\n />\n <ng-content />\n</div>\n", styles: [".t-tab{display:flex;align-items:center;justify-content:center;padding:0 .5rem;gap:.5rem;color:var(--tui-text-primary)}.t-tab .t-icon{inline-size:1rem;block-size:1rem}\n"] }]
14
- }], propDecorators: { src: [{
15
- type: Input
16
- }] } });
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZGRvbi1kb2MvY29tcG9uZW50cy9kb2MtdGFiL2luZGV4LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWRkb24tZG9jL2NvbXBvbmVudHMvZG9jLXRhYi9pbmRleC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFDLE1BQU0sZUFBZSxDQUFDOztBQUV4RSxNQU9hLFNBQVM7SUFQdEI7UUFTVyxRQUFHLEdBQUcsRUFBRSxDQUFDO0tBQ25COytHQUhZLFNBQVM7bUdBQVQsU0FBUywrRkNUdEIsZ0tBUUE7O1NEQ2EsU0FBUzs0RkFBVCxTQUFTO2tCQVByQixTQUFTO2lDQUNNLElBQUksWUFDTixhQUFhLG1CQUdOLHVCQUF1QixDQUFDLE1BQU07OEJBSXhDLEdBQUc7c0JBRFQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAndHVpLWRvYy10YWInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9pbmRleC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9pbmRleC5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFR1aURvY1RhYiB7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc3JjID0gJyc7XG59XG4iLCI8ZGl2IGNsYXNzPVwidC10YWJcIj5cbiAgICA8aW1nXG4gICAgICAgIGFsdD1cIkRvY3VtZW50YXRpb24gdGFiIGljb25cIlxuICAgICAgICBjbGFzcz1cInQtaWNvblwiXG4gICAgICAgIFtzcmNdPVwic3JjXCJcbiAgICAvPlxuICAgIDxuZy1jb250ZW50IC8+XG48L2Rpdj5cbiJdfQ==
@@ -1,134 +0,0 @@
1
- import { Location } from '@angular/common';
2
- import { Directive, EventEmitter, inject, Input, Output, signal, TemplateRef, } from '@angular/core';
3
- import { ActivatedRoute, UrlSerializer } from '@angular/router';
4
- import { TUI_DOC_URL_STATE_HANDLER } from '@taiga-ui/addon-doc/tokens';
5
- import { tuiCleanObject, tuiCoerceValue, tuiInspectAny } from '@taiga-ui/addon-doc/utils';
6
- import { tuiIsNumber } from '@taiga-ui/cdk/utils/miscellaneous';
7
- import { TuiAlertService } from '@taiga-ui/core/components/alert';
8
- import { Subject } from 'rxjs';
9
- import * as i0 from "@angular/core";
10
- const SERIALIZED_SUFFIX = '$';
11
- // @bad TODO: refactor output and value sync
12
- class TuiDocDocumentationPropertyConnector {
13
- constructor() {
14
- this.locationRef = inject(Location);
15
- this.activatedRoute = inject(ActivatedRoute);
16
- this.urlSerializer = inject(UrlSerializer);
17
- this.urlStateHandler = inject(TUI_DOC_URL_STATE_HANDLER);
18
- this.alerts = inject(TuiAlertService);
19
- this.documentationPropertyName = '';
20
- this.documentationPropertyMode = null;
21
- this.documentationPropertyType = '';
22
- this.documentationPropertyDeprecated = false;
23
- this.documentationPropertyValues = null;
24
- this.documentationPropertyValueChange = new EventEmitter();
25
- this.changed$ = new Subject();
26
- this.emits = signal(1);
27
- this.template = inject(TemplateRef);
28
- }
29
- get attrName() {
30
- switch (this.documentationPropertyMode) {
31
- case 'input':
32
- return `[${this.documentationPropertyName}]`;
33
- case 'input-output':
34
- return `[(${this.documentationPropertyName})]`;
35
- case 'output':
36
- return `(${this.documentationPropertyName})`;
37
- default:
38
- return this.documentationPropertyName;
39
- }
40
- }
41
- get shouldShowValues() {
42
- return this.documentationPropertyMode !== 'output';
43
- }
44
- get hasItems() {
45
- return !!this.documentationPropertyValues;
46
- }
47
- ngOnInit() {
48
- this.parseParams(this.activatedRoute.snapshot.queryParams);
49
- }
50
- ngOnChanges() {
51
- this.changed$.next();
52
- }
53
- onValueChange(value) {
54
- this.documentationPropertyValue = value;
55
- this.documentationPropertyValueChange.emit(value);
56
- this.setQueryParam(value);
57
- }
58
- emitEvent(event) {
59
- // For more convenient debugging
60
- console.info(this.attrName, event);
61
- this.emits.update((x) => ++x);
62
- let content;
63
- if (event !== undefined) {
64
- content = tuiInspectAny(event, 2);
65
- }
66
- this.alerts.open(content, { label: this.attrName }).subscribe();
67
- }
68
- parseParams(params) {
69
- const propertyValue = params[this.documentationPropertyName];
70
- const propertyValueWithSuffix = params[`${this.documentationPropertyName}${SERIALIZED_SUFFIX}`];
71
- if (!propertyValue && !propertyValueWithSuffix) {
72
- return;
73
- }
74
- let value = !!propertyValueWithSuffix && this.documentationPropertyValues
75
- ? this.documentationPropertyValues[propertyValueWithSuffix]
76
- : tuiCoerceValue(propertyValue);
77
- if (this.documentationPropertyType === 'string' && tuiIsNumber(value)) {
78
- value = value.toString();
79
- }
80
- this.onValueChange(value);
81
- }
82
- setQueryParam(value) {
83
- const tree = this.urlSerializer.parse(this.locationRef.path());
84
- const isValueAvailableByKey = value instanceof Object;
85
- const name = this.documentationPropertyName;
86
- const nameWithSuffix = `${name}${SERIALIZED_SUFFIX}`;
87
- const computedValue = isValueAvailableByKey && this.documentationPropertyValues
88
- ? this.documentationPropertyValues.indexOf(value)
89
- : value;
90
- tree.queryParams = tuiCleanObject({
91
- ...tree.queryParams,
92
- /**
93
- * Caretaker note: reset previous conflicted param in route
94
- * issue: https://github.com/taiga-family/taiga-ui/issues/9764
95
- */
96
- ...(isValueAvailableByKey
97
- ? {
98
- [nameWithSuffix]: computedValue,
99
- [name]: undefined,
100
- }
101
- : {
102
- [nameWithSuffix]: undefined,
103
- [name]: computedValue,
104
- }),
105
- });
106
- this.locationRef.go(this.urlStateHandler(tree));
107
- }
108
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDocDocumentationPropertyConnector, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
109
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiDocDocumentationPropertyConnector, isStandalone: true, selector: "ng-template[documentationPropertyName]", inputs: { documentationPropertyName: "documentationPropertyName", documentationPropertyMode: "documentationPropertyMode", documentationPropertyType: "documentationPropertyType", documentationPropertyValue: "documentationPropertyValue", documentationPropertyDeprecated: "documentationPropertyDeprecated", documentationPropertyValues: "documentationPropertyValues" }, outputs: { documentationPropertyValueChange: "documentationPropertyValueChange" }, exportAs: ["documentationProperty"], usesOnChanges: true, ngImport: i0 }); }
110
- }
111
- export { TuiDocDocumentationPropertyConnector };
112
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDocDocumentationPropertyConnector, decorators: [{
113
- type: Directive,
114
- args: [{
115
- standalone: true,
116
- selector: 'ng-template[documentationPropertyName]',
117
- exportAs: 'documentationProperty',
118
- }]
119
- }], propDecorators: { documentationPropertyName: [{
120
- type: Input
121
- }], documentationPropertyMode: [{
122
- type: Input
123
- }], documentationPropertyType: [{
124
- type: Input
125
- }], documentationPropertyValue: [{
126
- type: Input
127
- }], documentationPropertyDeprecated: [{
128
- type: Input
129
- }], documentationPropertyValues: [{
130
- type: Input
131
- }], documentationPropertyValueChange: [{
132
- type: Output
133
- }] } });
134
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnRhdGlvbi1wcm9wZXJ0eS1jb25uZWN0b3IuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWRkb24tZG9jL2NvbXBvbmVudHMvZG9jdW1lbnRhdGlvbi9kb2N1bWVudGF0aW9uLXByb3BlcnR5LWNvbm5lY3Rvci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFDSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUNOLE1BQU0sRUFDTixXQUFXLEdBQ2QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGNBQWMsRUFBZSxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRSxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRSxPQUFPLEVBQUMsY0FBYyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDOUQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7O0FBRTdCLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDO0FBSTlCLDRDQUE0QztBQUM1QyxNQUthLG9DQUFvQztJQUxqRDtRQU1xQixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixtQkFBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN4QyxrQkFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0QyxvQkFBZSxHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FB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Q0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDOytHQXRJUSxvQ0FBb0M7bUdBQXBDLG9DQUFvQzs7U0FBcEMsb0NBQW9DOzRGQUFwQyxvQ0FBb0M7a0JBTGhELFNBQVM7bUJBQUM7b0JBQ1AsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSx3Q0FBd0M7b0JBQ2xELFFBQVEsRUFBRSx1QkFBdUI7aUJBQ3BDOzhCQVNVLHlCQUF5QjtzQkFEL0IsS0FBSztnQkFJQyx5QkFBeUI7c0JBRC9CLEtBQUs7Z0JBSUMseUJBQXlCO3NCQUQvQixLQUFLO2dCQUlDLDBCQUEwQjtzQkFEaEMsS0FBSztnQkFJQywrQkFBK0I7c0JBRHJDLEtBQUs7Z0JBSUMsMkJBQTJCO3NCQURqQyxLQUFLO2dCQUlVLGdDQUFnQztzQkFEL0MsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TG9jYXRpb259IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIHR5cGUgT25DaGFuZ2VzLFxuICAgIHR5cGUgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBzaWduYWwsXG4gICAgVGVtcGxhdGVSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgdHlwZSBQYXJhbXMsIFVybFNlcmlhbGl6ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1RVSV9ET0NfVVJMX1NUQVRFX0hBTkRMRVJ9IGZyb20gJ0B0YWlnYS11aS9hZGRvbi1kb2MvdG9rZW5zJztcbmltcG9ydCB7dHVpQ2xlYW5PYmplY3QsIHR1aUNvZXJjZVZhbHVlLCB0dWlJbnNwZWN0QW55fSBmcm9tICdAdGFpZ2EtdWkvYWRkb24tZG9jL3V0aWxzJztcbmltcG9ydCB7dHVpSXNOdW1iZXJ9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWlzY2VsbGFuZW91cyc7XG5pbXBvcnQge1R1aUFsZXJ0U2VydmljZX0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9hbGVydCc7XG5pbXBvcnQge1N1YmplY3R9IGZyb20gJ3J4anMnO1xuXG5jb25zdCBTRVJJQUxJWkVEX1NVRkZJWCA9ICckJztcblxuZXhwb3J0IHR5cGUgVHVpRG9jdW1lbnRhdGlvblByb3BlcnR5VHlwZSA9ICdpbnB1dC1vdXRwdXQnIHwgJ2lucHV0JyB8ICdvdXRwdXQnIHwgbnVsbDtcblxuLy8gQGJhZCBUT0RPOiByZWZhY3RvciBvdXRwdXQgYW5kIHZhbHVlIHN5bmNcbkBEaXJlY3RpdmUoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICduZy10ZW1wbGF0ZVtkb2N1bWVudGF0aW9uUHJvcGVydHlOYW1lXScsXG4gICAgZXhwb3J0QXM6ICdkb2N1bWVudGF0aW9uUHJvcGVydHknLFxufSlcbmV4cG9ydCBjbGFzcyBUdWlEb2NEb2N1bWVudGF0aW9uUHJvcGVydHlDb25uZWN0b3I8VD4gaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2NhdGlvblJlZiA9IGluamVjdChMb2NhdGlvbik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmF0ZWRSb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB1cmxTZXJpYWxpemVyID0gaW5qZWN0KFVybFNlcmlhbGl6ZXIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdXJsU3RhdGVIYW5kbGVyID0gaW5qZWN0KFRVSV9ET0NfVVJMX1NUQVRFX0hBTkRMRVIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYWxlcnRzID0gaW5qZWN0KFR1aUFsZXJ0U2VydmljZSk7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkb2N1bWVudGF0aW9uUHJvcGVydHlOYW1lID0gJyc7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkb2N1bWVudGF0aW9uUHJvcGVydHlNb2RlOiBUdWlEb2N1bWVudGF0aW9uUHJvcGVydHlUeXBlID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRvY3VtZW50YXRpb25Qcm9wZXJ0eVR5cGUgPSAnJztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRvY3VtZW50YXRpb25Qcm9wZXJ0eVZhbHVlITogVDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRvY3VtZW50YXRpb25Qcm9wZXJ0eURlcHJlY2F0ZWQgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRvY3VtZW50YXRpb25Qcm9wZXJ0eVZhbHVlczogcmVhZG9ubHkgVFtdIHwgbnVsbCA9IG51bGw7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jdW1lbnRhdGlvblByb3BlcnR5VmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IGVtaXRzID0gc2lnbmFsKDEpO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IHRlbXBsYXRlID0gaW5qZWN0KFRlbXBsYXRlUmVmKTtcblxuICAgIHB1YmxpYyBnZXQgYXR0ck5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmRvY3VtZW50YXRpb25Qcm9wZXJ0eU1vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3RoaXMuZG9jdW1lbnRhdGlvblByb3BlcnR5TmFtZX1dYDtcbiAgICAgICAgICAgIGNhc2UgJ2lucHV0LW91dHB1dCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbKCR7dGhpcy5kb2N1bWVudGF0aW9uUHJvcGVydHlOYW1lfSldYDtcbiAgICAgICAgICAgIGNhc2UgJ291dHB1dCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAoJHt0aGlzLmRvY3VtZW50YXRpb25Qcm9wZXJ0eU5hbWV9KWA7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50YXRpb25Qcm9wZXJ0eU5hbWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNob3VsZFNob3dWYWx1ZXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50YXRpb25Qcm9wZXJ0eU1vZGUgIT09ICdvdXRwdXQnO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzSXRlbXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZG9jdW1lbnRhdGlvblByb3BlcnR5VmFsdWVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYXJzZVBhcmFtcyh0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2hhbmdlZCQubmV4dCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblZhbHVlQ2hhbmdlKHZhbHVlOiBUKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRhdGlvblByb3BlcnR5VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5kb2N1bWVudGF0aW9uUHJvcGVydHlWYWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICAgICAgdGhpcy5zZXRRdWVyeVBhcmFtKHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZW1pdEV2ZW50KGV2ZW50OiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIC8vIEZvciBtb3JlIGNvbnZlbmllbnQgZGVidWdnaW5nXG4gICAgICAgIGNvbnNvbGUuaW5mbyh0aGlzLmF0dHJOYW1lLCBldmVudCk7XG5cbiAgICAgICAgdGhpcy5lbWl0cy51cGRhdGUoKHgpID0+ICsreCk7XG5cbiAgICAgICAgbGV0IGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoZXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29udGVudCA9IHR1aUluc3BlY3RBbnkoZXZlbnQsIDIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hbGVydHMub3Blbihjb250ZW50LCB7bGFiZWw6IHRoaXMuYXR0ck5hbWV9KS5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlUGFyYW1zKHBhcmFtczogUGFyYW1zKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5VmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHBhcmFtc1t0aGlzLmRvY3VtZW50YXRpb25Qcm9wZXJ0eU5hbWVdO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eVZhbHVlV2l0aFN1ZmZpeDogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgICAgICAgIHBhcmFtc1tgJHt0aGlzLmRvY3VtZW50YXRpb25Qcm9wZXJ0eU5hbWV9JHtTRVJJQUxJWkVEX1NVRkZJWH1gXTtcblxuICAgICAgICBpZiAoIXByb3BlcnR5VmFsdWUgJiYgIXByb3BlcnR5VmFsdWVXaXRoU3VmZml4KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmFsdWUgPVxuICAgICAgICAgICAgISFwcm9wZXJ0eVZhbHVlV2l0aFN1ZmZpeCAmJiB0aGlzLmRvY3VtZW50YXRpb25Qcm9wZXJ0eVZhbHVlc1xuICAgICAgICAgICAgICAgID8gdGhpcy5kb2N1bWVudGF0aW9uUHJvcGVydHlWYWx1ZXNbcHJvcGVydHlWYWx1ZVdpdGhTdWZmaXggYXMgbnVtYmVyXVxuICAgICAgICAgICAgICAgIDogdHVpQ29lcmNlVmFsdWUocHJvcGVydHlWYWx1ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZG9jdW1lbnRhdGlvblByb3BlcnR5VHlwZSA9PT0gJ3N0cmluZycgJiYgdHVpSXNOdW1iZXIodmFsdWUpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2UodmFsdWUgYXMgVCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRRdWVyeVBhcmFtKHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnVybFNlcmlhbGl6ZXIucGFyc2UodGhpcy5sb2NhdGlvblJlZi5wYXRoKCkpO1xuICAgICAgICBjb25zdCBpc1ZhbHVlQXZhaWxhYmxlQnlLZXkgPSB2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdDtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZG9jdW1lbnRhdGlvblByb3BlcnR5TmFtZTtcbiAgICAgICAgY29uc3QgbmFtZVdpdGhTdWZmaXggPSBgJHtuYW1lfSR7U0VSSUFMSVpFRF9TVUZGSVh9YDtcblxuICAgICAgICBjb25zdCBjb21wdXRlZFZhbHVlID1cbiAgICAgICAgICAgIGlzVmFsdWVBdmFpbGFibGVCeUtleSAmJiB0aGlzLmRvY3VtZW50YXRpb25Qcm9wZXJ0eVZhbHVlc1xuICAgICAgICAgICAgICAgID8gdGhpcy5kb2N1bWVudGF0aW9uUHJvcGVydHlWYWx1ZXMuaW5kZXhPZih2YWx1ZSBhcyBUKVxuICAgICAgICAgICAgICAgIDogdmFsdWU7XG5cbiAgICAgICAgdHJlZS5xdWVyeVBhcmFtcyA9IHR1aUNsZWFuT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRyZWUucXVlcnlQYXJhbXMsXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIENhcmV0YWtlciBub3RlOiByZXNldCBwcmV2aW91cyBjb25mbGljdGVkIHBhcmFtIGluIHJvdXRlXG4gICAgICAgICAgICAgKiBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3RhaWdhLWZhbWlseS90YWlnYS11aS9pc3N1ZXMvOTc2NFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAuLi4oaXNWYWx1ZUF2YWlsYWJsZUJ5S2V5XG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgW25hbWVXaXRoU3VmZml4XTogY29tcHV0ZWRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBbbmFtZV06IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgICBbbmFtZVdpdGhTdWZmaXhdOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgW25hbWVdOiBjb21wdXRlZFZhbHVlLFxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubG9jYXRpb25SZWYuZ28odGhpcy51cmxTdGF0ZUhhbmRsZXIodHJlZSkpO1xuICAgIH1cbn1cbiJdfQ==