@cute-widgets/base 20.0.1

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 (183) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/LICENSE.md +191 -0
  3. package/README.md +190 -0
  4. package/abstract/index.d.ts +327 -0
  5. package/alert/index.d.ts +68 -0
  6. package/autocomplete/index.d.ts +442 -0
  7. package/badge/index.d.ts +26 -0
  8. package/bottom-sheet/index.d.ts +231 -0
  9. package/button/index.d.ts +182 -0
  10. package/button-toggle/index.d.ts +225 -0
  11. package/card/index.d.ts +163 -0
  12. package/checkbox/index.d.ts +174 -0
  13. package/chips/index.d.ts +963 -0
  14. package/collapse/index.d.ts +97 -0
  15. package/core/animation/index.d.ts +43 -0
  16. package/core/datetime/index.d.ts +404 -0
  17. package/core/directives/index.d.ts +168 -0
  18. package/core/error/index.d.ts +74 -0
  19. package/core/index.d.ts +1039 -0
  20. package/core/interfaces/index.d.ts +114 -0
  21. package/core/layout/index.d.ts +53 -0
  22. package/core/line/index.d.ts +37 -0
  23. package/core/nav/index.d.ts +321 -0
  24. package/core/observers/index.d.ts +124 -0
  25. package/core/option/index.d.ts +185 -0
  26. package/core/pipes/index.d.ts +53 -0
  27. package/core/ripple/index.d.ts +66 -0
  28. package/core/testing/index.d.ts +154 -0
  29. package/core/theming/index.d.ts +118 -0
  30. package/core/types/index.d.ts +53 -0
  31. package/core/utils/index.d.ts +129 -0
  32. package/cute-widgets-base-20.0.1.tgz +0 -0
  33. package/datepicker/index.d.ts +1817 -0
  34. package/dialog/index.d.ts +484 -0
  35. package/divider/index.d.ts +24 -0
  36. package/expansion/README.md +8 -0
  37. package/expansion/index.d.ts +308 -0
  38. package/fesm2022/cute-widgets-base-abstract.mjs +547 -0
  39. package/fesm2022/cute-widgets-base-abstract.mjs.map +1 -0
  40. package/fesm2022/cute-widgets-base-alert.mjs +198 -0
  41. package/fesm2022/cute-widgets-base-alert.mjs.map +1 -0
  42. package/fesm2022/cute-widgets-base-autocomplete.mjs +1217 -0
  43. package/fesm2022/cute-widgets-base-autocomplete.mjs.map +1 -0
  44. package/fesm2022/cute-widgets-base-badge.mjs +75 -0
  45. package/fesm2022/cute-widgets-base-badge.mjs.map +1 -0
  46. package/fesm2022/cute-widgets-base-bottom-sheet.mjs +416 -0
  47. package/fesm2022/cute-widgets-base-bottom-sheet.mjs.map +1 -0
  48. package/fesm2022/cute-widgets-base-button-toggle.mjs +640 -0
  49. package/fesm2022/cute-widgets-base-button-toggle.mjs.map +1 -0
  50. package/fesm2022/cute-widgets-base-button.mjs +546 -0
  51. package/fesm2022/cute-widgets-base-button.mjs.map +1 -0
  52. package/fesm2022/cute-widgets-base-card.mjs +471 -0
  53. package/fesm2022/cute-widgets-base-card.mjs.map +1 -0
  54. package/fesm2022/cute-widgets-base-checkbox.mjs +390 -0
  55. package/fesm2022/cute-widgets-base-checkbox.mjs.map +1 -0
  56. package/fesm2022/cute-widgets-base-chips.mjs +2360 -0
  57. package/fesm2022/cute-widgets-base-chips.mjs.map +1 -0
  58. package/fesm2022/cute-widgets-base-collapse.mjs +259 -0
  59. package/fesm2022/cute-widgets-base-collapse.mjs.map +1 -0
  60. package/fesm2022/cute-widgets-base-core-animation.mjs +53 -0
  61. package/fesm2022/cute-widgets-base-core-animation.mjs.map +1 -0
  62. package/fesm2022/cute-widgets-base-core-datetime.mjs +568 -0
  63. package/fesm2022/cute-widgets-base-core-datetime.mjs.map +1 -0
  64. package/fesm2022/cute-widgets-base-core-directives.mjs +404 -0
  65. package/fesm2022/cute-widgets-base-core-directives.mjs.map +1 -0
  66. package/fesm2022/cute-widgets-base-core-error.mjs +105 -0
  67. package/fesm2022/cute-widgets-base-core-error.mjs.map +1 -0
  68. package/fesm2022/cute-widgets-base-core-interfaces.mjs +22 -0
  69. package/fesm2022/cute-widgets-base-core-interfaces.mjs.map +1 -0
  70. package/fesm2022/cute-widgets-base-core-layout.mjs +74 -0
  71. package/fesm2022/cute-widgets-base-core-layout.mjs.map +1 -0
  72. package/fesm2022/cute-widgets-base-core-line.mjs +87 -0
  73. package/fesm2022/cute-widgets-base-core-line.mjs.map +1 -0
  74. package/fesm2022/cute-widgets-base-core-nav.mjs +863 -0
  75. package/fesm2022/cute-widgets-base-core-nav.mjs.map +1 -0
  76. package/fesm2022/cute-widgets-base-core-observers.mjs +304 -0
  77. package/fesm2022/cute-widgets-base-core-observers.mjs.map +1 -0
  78. package/fesm2022/cute-widgets-base-core-option.mjs +373 -0
  79. package/fesm2022/cute-widgets-base-core-option.mjs.map +1 -0
  80. package/fesm2022/cute-widgets-base-core-pipes.mjs +97 -0
  81. package/fesm2022/cute-widgets-base-core-pipes.mjs.map +1 -0
  82. package/fesm2022/cute-widgets-base-core-ripple.mjs +172 -0
  83. package/fesm2022/cute-widgets-base-core-ripple.mjs.map +1 -0
  84. package/fesm2022/cute-widgets-base-core-testing.mjs +210 -0
  85. package/fesm2022/cute-widgets-base-core-testing.mjs.map +1 -0
  86. package/fesm2022/cute-widgets-base-core-theming.mjs +314 -0
  87. package/fesm2022/cute-widgets-base-core-theming.mjs.map +1 -0
  88. package/fesm2022/cute-widgets-base-core-types.mjs +22 -0
  89. package/fesm2022/cute-widgets-base-core-types.mjs.map +1 -0
  90. package/fesm2022/cute-widgets-base-core-utils.mjs +257 -0
  91. package/fesm2022/cute-widgets-base-core-utils.mjs.map +1 -0
  92. package/fesm2022/cute-widgets-base-core.mjs +1600 -0
  93. package/fesm2022/cute-widgets-base-core.mjs.map +1 -0
  94. package/fesm2022/cute-widgets-base-datepicker.mjs +4827 -0
  95. package/fesm2022/cute-widgets-base-datepicker.mjs.map +1 -0
  96. package/fesm2022/cute-widgets-base-dialog.mjs +1046 -0
  97. package/fesm2022/cute-widgets-base-dialog.mjs.map +1 -0
  98. package/fesm2022/cute-widgets-base-divider.mjs +86 -0
  99. package/fesm2022/cute-widgets-base-divider.mjs.map +1 -0
  100. package/fesm2022/cute-widgets-base-expansion.mjs +623 -0
  101. package/fesm2022/cute-widgets-base-expansion.mjs.map +1 -0
  102. package/fesm2022/cute-widgets-base-form-field.mjs +969 -0
  103. package/fesm2022/cute-widgets-base-form-field.mjs.map +1 -0
  104. package/fesm2022/cute-widgets-base-grid-list.mjs +715 -0
  105. package/fesm2022/cute-widgets-base-grid-list.mjs.map +1 -0
  106. package/fesm2022/cute-widgets-base-icon.mjs +1105 -0
  107. package/fesm2022/cute-widgets-base-icon.mjs.map +1 -0
  108. package/fesm2022/cute-widgets-base-input.mjs +726 -0
  109. package/fesm2022/cute-widgets-base-input.mjs.map +1 -0
  110. package/fesm2022/cute-widgets-base-layout-container.mjs +95 -0
  111. package/fesm2022/cute-widgets-base-layout-container.mjs.map +1 -0
  112. package/fesm2022/cute-widgets-base-layout-stack.mjs +166 -0
  113. package/fesm2022/cute-widgets-base-layout-stack.mjs.map +1 -0
  114. package/fesm2022/cute-widgets-base-layout.mjs +250 -0
  115. package/fesm2022/cute-widgets-base-layout.mjs.map +1 -0
  116. package/fesm2022/cute-widgets-base-list.mjs +1557 -0
  117. package/fesm2022/cute-widgets-base-list.mjs.map +1 -0
  118. package/fesm2022/cute-widgets-base-menu.mjs +1283 -0
  119. package/fesm2022/cute-widgets-base-menu.mjs.map +1 -0
  120. package/fesm2022/cute-widgets-base-navbar.mjs +359 -0
  121. package/fesm2022/cute-widgets-base-navbar.mjs.map +1 -0
  122. package/fesm2022/cute-widgets-base-paginator.mjs +485 -0
  123. package/fesm2022/cute-widgets-base-paginator.mjs.map +1 -0
  124. package/fesm2022/cute-widgets-base-progress.mjs +321 -0
  125. package/fesm2022/cute-widgets-base-progress.mjs.map +1 -0
  126. package/fesm2022/cute-widgets-base-radio.mjs +637 -0
  127. package/fesm2022/cute-widgets-base-radio.mjs.map +1 -0
  128. package/fesm2022/cute-widgets-base-select.mjs +1208 -0
  129. package/fesm2022/cute-widgets-base-select.mjs.map +1 -0
  130. package/fesm2022/cute-widgets-base-sidenav.mjs +1095 -0
  131. package/fesm2022/cute-widgets-base-sidenav.mjs.map +1 -0
  132. package/fesm2022/cute-widgets-base-slider.mjs +99 -0
  133. package/fesm2022/cute-widgets-base-slider.mjs.map +1 -0
  134. package/fesm2022/cute-widgets-base-snack-bar.mjs +897 -0
  135. package/fesm2022/cute-widgets-base-snack-bar.mjs.map +1 -0
  136. package/fesm2022/cute-widgets-base-sort.mjs +639 -0
  137. package/fesm2022/cute-widgets-base-sort.mjs.map +1 -0
  138. package/fesm2022/cute-widgets-base-spinner.mjs +154 -0
  139. package/fesm2022/cute-widgets-base-spinner.mjs.map +1 -0
  140. package/fesm2022/cute-widgets-base-stepper.mjs +673 -0
  141. package/fesm2022/cute-widgets-base-stepper.mjs.map +1 -0
  142. package/fesm2022/cute-widgets-base-table.mjs +1023 -0
  143. package/fesm2022/cute-widgets-base-table.mjs.map +1 -0
  144. package/fesm2022/cute-widgets-base-tabs.mjs +729 -0
  145. package/fesm2022/cute-widgets-base-tabs.mjs.map +1 -0
  146. package/fesm2022/cute-widgets-base-timepicker.mjs +965 -0
  147. package/fesm2022/cute-widgets-base-timepicker.mjs.map +1 -0
  148. package/fesm2022/cute-widgets-base-toolbar.mjs +120 -0
  149. package/fesm2022/cute-widgets-base-toolbar.mjs.map +1 -0
  150. package/fesm2022/cute-widgets-base-tooltip.mjs +947 -0
  151. package/fesm2022/cute-widgets-base-tooltip.mjs.map +1 -0
  152. package/fesm2022/cute-widgets-base-tree.mjs +598 -0
  153. package/fesm2022/cute-widgets-base-tree.mjs.map +1 -0
  154. package/fesm2022/cute-widgets-base.mjs +68 -0
  155. package/fesm2022/cute-widgets-base.mjs.map +1 -0
  156. package/form-field/index.d.ts +401 -0
  157. package/grid-list/index.d.ts +361 -0
  158. package/icon/index.d.ts +477 -0
  159. package/index.d.ts +3 -0
  160. package/input/index.d.ts +256 -0
  161. package/layout/container/index.d.ts +31 -0
  162. package/layout/index.d.ts +78 -0
  163. package/layout/stack/index.d.ts +52 -0
  164. package/list/index.d.ts +659 -0
  165. package/menu/index.d.ts +497 -0
  166. package/navbar/index.d.ts +91 -0
  167. package/package.json +279 -0
  168. package/paginator/index.d.ts +216 -0
  169. package/progress/index.d.ts +130 -0
  170. package/radio/index.d.ts +259 -0
  171. package/select/index.d.ts +426 -0
  172. package/sidenav/index.d.ts +369 -0
  173. package/slider/index.d.ts +48 -0
  174. package/snack-bar/index.d.ts +374 -0
  175. package/sort/index.d.ts +334 -0
  176. package/spinner/index.d.ts +70 -0
  177. package/stepper/index.d.ts +295 -0
  178. package/table/index.d.ts +395 -0
  179. package/tabs/index.d.ts +307 -0
  180. package/timepicker/index.d.ts +350 -0
  181. package/toolbar/index.d.ts +36 -0
  182. package/tooltip/index.d.ts +299 -0
  183. package/tree/index.d.ts +314 -0
@@ -0,0 +1,863 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, DOCUMENT, NgZone, booleanAttribute, Input, Directive, TemplateRef, InjectionToken, ViewContainerRef, ViewChild, ContentChild, ChangeDetectionStrategy, ViewEncapsulation, Component, DestroyRef, EventEmitter, numberAttribute, HostBinding, Output, ContentChildren, forwardRef, NgModule } from '@angular/core';
3
+ import { FocusKeyManager } from '@angular/cdk/a11y';
4
+ import { Directionality } from '@angular/cdk/bidi';
5
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
+ import { CuteFocusableControl, CuteLayoutControl } from '@cute-widgets/base/abstract';
7
+ import { toThemeColor, getOverallTransitionDuration } from '@cute-widgets/base/core';
8
+ import { fromEvent } from 'rxjs';
9
+ import { TemplatePortal, CdkPortalOutlet, PortalModule } from '@angular/cdk/portal';
10
+ import * as i1 from '@angular/cdk/overlay';
11
+ import { CdkScrollable } from '@angular/cdk/overlay';
12
+ import { CommonModule } from '@angular/common';
13
+
14
+ /**
15
+ * @license Apache-2.0
16
+ *
17
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
18
+ *
19
+ * You may not use this file except in compliance with the License
20
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
21
+ */
22
+ let nextId$2 = -1;
23
+ /**
24
+ * This class can be used to create a navigation menu, where it is applied to `<a>` elements.
25
+ */
26
+ class CuteNavLink extends CuteFocusableControl {
27
+ constructor() {
28
+ super();
29
+ this._document = inject(DOCUMENT);
30
+ this._ngZone = inject(NgZone);
31
+ this.nav = inject(CUTE_NAV, { optional: true });
32
+ this.toThemeColor = toThemeColor;
33
+ /** Whether the link is active. */
34
+ this.active = false;
35
+ this._focusMonitor.monitor(this._elementRef)
36
+ .pipe(takeUntilDestroyed())
37
+ .subscribe(origin => {
38
+ this._ngZone.run(() => {
39
+ if (this.nav) {
40
+ this.nav._focusChanged(this, origin);
41
+ }
42
+ });
43
+ });
44
+ // MouseDown event
45
+ fromEvent(this._nativeElement, "mousedown", { capture: true })
46
+ .pipe(takeUntilDestroyed())
47
+ .subscribe((event) => this.onMouseDown(event));
48
+ }
49
+ generateId() {
50
+ return `cute-nav-link-${++nextId$2}`;
51
+ }
52
+ /** Gets fallback element identifier(s) whose content or presence are controlled by the link. */
53
+ getAriaControls() {
54
+ if (!(this.nav && this.nav.isTab()))
55
+ return "";
56
+ const index = this.nav.getNavLinkIndex(this);
57
+ let ids = "";
58
+ if (index >= 0) {
59
+ ids = `${this.nav.id}-pane-${index}`;
60
+ }
61
+ return ids;
62
+ }
63
+ /**
64
+ * MouseDown event handler in `capture` state of the event propagation.
65
+ * @param event MouseEvent
66
+ * @protected
67
+ */
68
+ onMouseDown(event) {
69
+ if (this.nav) {
70
+ if (!this.nav.activateNavLink(this, 'mouse')) {
71
+ // we need to prevent default action so CSS-styles may be applied incorrectly
72
+ event.stopImmediatePropagation();
73
+ event.preventDefault();
74
+ }
75
+ }
76
+ }
77
+ onClick(event) {
78
+ const elem = event.target;
79
+ event.preventDefault();
80
+ if (elem instanceof HTMLAnchorElement && elem.hash && elem.hash.startsWith("#")) {
81
+ event.stopPropagation();
82
+ const target = this._document.getElementById(elem.hash.substring(1));
83
+ if (target) {
84
+ target.scrollIntoView({ behavior: "smooth", block: "nearest" });
85
+ }
86
+ }
87
+ }
88
+ onTouchStart(event) {
89
+ if (this.nav) {
90
+ this.nav.activateNavLink(this, 'touch');
91
+ event.preventDefault();
92
+ }
93
+ }
94
+ ngOnInit() {
95
+ super.ngOnInit();
96
+ if (this.nav?.role == "tablist") {
97
+ this.role = "tab";
98
+ }
99
+ }
100
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteNavLink, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
101
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "20.3.15", type: CuteNavLink, isStandalone: true, selector: "a[cute-nav-link], a[cuteNavLink],\n button[cute-nav-link], button[cuteNavLink]\n ", inputs: { active: ["active", "active", booleanAttribute], ariaControls: ["aria-controls", "ariaControls"] }, host: { listeners: { "click": "onClick($event)" }, properties: { "class.active": "active", "class.disabled": "disabled", "disabled": "disabled", "attr.aria-disabled": "disabled", "attr.aria-current": "active ? \"page\" : null", "attr.aria-selected": "active || null", "aria-controls": "ariaControls || getAriaControls()", "attr.id": "id || null", "attr.role": "role || null", "attr.tabindex": "active && !disabled ? 0 : -1", "style.--bs-btn-border-radius": "0", "style.--bs-navbar-active-color": "!nav.isTab() ? \"var(\"+(color ? \"--bs-\"+toThemeColor(color)+\"-text-emphasis\" : \"--bs-emphasis-color\")+\")\" : undefined" }, classAttribute: "cute-nav-link nav-link" }, exportAs: ["cuteNavLink"], usesInheritance: true, ngImport: i0 }); }
102
+ }
103
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteNavLink, decorators: [{
104
+ type: Directive,
105
+ args: [{
106
+ selector: `a[cute-nav-link], a[cuteNavLink],
107
+ button[cute-nav-link], button[cuteNavLink]
108
+ `,
109
+ exportAs: 'cuteNavLink',
110
+ host: {
111
+ 'class': 'cute-nav-link nav-link',
112
+ //'[class]': 'color ? "link-"+toThemeColor(color) : undefined',
113
+ '[class.active]': 'active',
114
+ '[class.disabled]': 'disabled',
115
+ '[disabled]': 'disabled',
116
+ '[attr.aria-disabled]': 'disabled',
117
+ '[attr.aria-current]': 'active ? "page" : null',
118
+ '[attr.aria-selected]': 'active || null',
119
+ '[aria-controls]': 'ariaControls || getAriaControls()',
120
+ '[attr.id]': 'id || null',
121
+ '[attr.role]': 'role || null',
122
+ '[attr.tabindex]': 'active && !disabled ? 0 : -1',
123
+ '[style.--bs-btn-border-radius]': '0', // bootstrap's tab-link already stylized with radius of top angles
124
+ '[style.--bs-navbar-active-color]': '!nav.isTab() ? "var("+(color ? "--bs-"+toThemeColor(color)+"-text-emphasis" : "--bs-emphasis-color")+")" : undefined',
125
+ '(click)': 'onClick($event)',
126
+ //'(touchstart)': 'onTouchStart($event)',
127
+ },
128
+ standalone: true,
129
+ }]
130
+ }], ctorParameters: () => [], propDecorators: { active: [{
131
+ type: Input,
132
+ args: [{ transform: booleanAttribute }]
133
+ }], ariaControls: [{
134
+ type: Input,
135
+ args: ["aria-controls"]
136
+ }] } });
137
+
138
+ /**
139
+ * @license Apache-2.0
140
+ *
141
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
142
+ *
143
+ * You may not use this file except in compliance with the License
144
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
145
+ */
146
+ /**
147
+ * Lazy loading content of the `cute-nav-item` element.
148
+ */
149
+ class CuteNavContent /* extends ... */ {
150
+ constructor() {
151
+ this.template = inject(TemplateRef);
152
+ }
153
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteNavContent /* extends ... */, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
154
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: CuteNavContent /* extends ... */, isStandalone: true, selector: "ng-template[cuteNavContent], ng-template[cute-nav-content]", exportAs: ["cuteNavContent"], ngImport: i0 }); }
155
+ }
156
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteNavContent /* extends ... */, decorators: [{
157
+ type: Directive,
158
+ args: [{
159
+ selector: 'ng-template[cuteNavContent], ng-template[cute-nav-content]',
160
+ exportAs: 'cuteNavContent',
161
+ standalone: true,
162
+ }]
163
+ }] });
164
+
165
+ /**
166
+ * @license Apache-2.0
167
+ *
168
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
169
+ *
170
+ * You may not use this file except in compliance with the License
171
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
172
+ */
173
+ let nextId$1 = 0;
174
+ /**
175
+ * Token used to provide a `CuteNavItem` to `CuteNavLink`.
176
+ * Used to avoid circular imports between `CuteNavItem` and `CuteNavLink`.
177
+ */
178
+ const CUTE_NAV_ITEM = new InjectionToken('CUTE_NAV_ITEM');
179
+ /**
180
+ * The purpose of this class is to ensure that the list items in the navigation have the correct spacing in **Bootstrap** framework.
181
+ */
182
+ class CuteNavItem extends CuteLayoutControl {
183
+ /**
184
+ * By default, tabs remove their content from the DOM while it's off-screen. Setting this to _true_ will keep it in
185
+ * the DOM which will prevent elements like `iframes` and `videos` from reloading next time it comes back into the view.
186
+ */
187
+ get preserveTabContent() { return this._preserveTabContent || this.nav.preserveTabContent; }
188
+ set preserveTabContent(value) {
189
+ this._preserveTabContent = value;
190
+ }
191
+ /** Portal that will be the hosted content of the nav */
192
+ get content() { return this._contentPortal; }
193
+ /**
194
+ * Whether the tab/nav is currently active.
195
+ */
196
+ get isActive() {
197
+ return this.navLink?.active || false;
198
+ }
199
+ /** Override the `color` setting for Tab control */
200
+ get color() { return undefined; /* super.color;*/ }
201
+ set color(value) {
202
+ if (this.nav.isTab()) {
203
+ this.defaultColor = value;
204
+ }
205
+ else {
206
+ super.color = value;
207
+ }
208
+ }
209
+ constructor() {
210
+ super();
211
+ // DI
212
+ this._viewContainerRef = inject(ViewContainerRef);
213
+ this.nav = inject(CUTE_NAV);
214
+ /** Nested <ng-template cuteNavContent> projected content */
215
+ this._navContent = null;
216
+ this._contentPortal = null;
217
+ this.role = this.nav.isTab() ? "presentation" : "listitem";
218
+ }
219
+ generateId() {
220
+ // Used as a track id in the @for() loop
221
+ return `cute-nav-item-${nextId$1++}`;
222
+ }
223
+ ngOnInit() {
224
+ super.ngOnInit();
225
+ const contentTemplate = (this._navContent && this._navContent.template) || this._staticContentTemplate;
226
+ if (contentTemplate) {
227
+ this._contentPortal = new TemplatePortal(contentTemplate, this._viewContainerRef);
228
+ }
229
+ }
230
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteNavItem, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
231
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.15", type: CuteNavItem, isStandalone: true, selector: "cute-nav-item, [cute-nav-item], [cuteNavItem]", inputs: { preserveTabContent: ["preserveTabContent", "preserveTabContent", booleanAttribute] }, host: { properties: { "attr.role": "role || null" }, classAttribute: "cute-nav-item nav-item" }, providers: [{ provide: CUTE_NAV_ITEM, useExisting: CuteNavItem }], queries: [{ propertyName: "navLink", first: true, predicate: CuteNavLink, descendants: true }, { propertyName: "_navContent", first: true, predicate: CuteNavContent, descendants: true, static: true }], viewQueries: [{ propertyName: "_staticContentTemplate", first: true, predicate: ["staticContent"], descendants: true, read: TemplateRef, static: true }], exportAs: ["cuteNavItem"], usesInheritance: true, ngImport: i0, template: `
232
+ <ng-content select="[cute-nav-link], [cuteNavLink]"></ng-content>
233
+ <ng-content select="[cute-nav-content], [cuteNavContent]"></ng-content>
234
+ <ng-template #staticContent>
235
+ <ng-content></ng-content>
236
+ </ng-template>
237
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
238
+ }
239
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteNavItem, decorators: [{
240
+ type: Component,
241
+ args: [{
242
+ selector: 'cute-nav-item, [cute-nav-item], [cuteNavItem]',
243
+ template: `
244
+ <ng-content select="[cute-nav-link], [cuteNavLink]"></ng-content>
245
+ <ng-content select="[cute-nav-content], [cuteNavContent]"></ng-content>
246
+ <ng-template #staticContent>
247
+ <ng-content></ng-content>
248
+ </ng-template>
249
+ `,
250
+ exportAs: 'cuteNavItem',
251
+ host: {
252
+ 'class': 'cute-nav-item nav-item',
253
+ '[attr.role]': 'role || null',
254
+ },
255
+ standalone: true,
256
+ providers: [{ provide: CUTE_NAV_ITEM, useExisting: CuteNavItem }],
257
+ encapsulation: ViewEncapsulation.None,
258
+ changeDetection: ChangeDetectionStrategy.OnPush,
259
+ }]
260
+ }], ctorParameters: () => [], propDecorators: { navLink: [{
261
+ type: ContentChild,
262
+ args: [CuteNavLink, { descendants: true }]
263
+ }], _navContent: [{
264
+ type: ContentChild,
265
+ args: [CuteNavContent, { static: true }]
266
+ }], _staticContentTemplate: [{
267
+ type: ViewChild,
268
+ args: ['staticContent', { read: TemplateRef, static: true }]
269
+ }], preserveTabContent: [{
270
+ type: Input,
271
+ args: [{ transform: booleanAttribute }]
272
+ }] } });
273
+
274
+ /**
275
+ * @license Apache-2.0
276
+ *
277
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
278
+ *
279
+ * You may not use this file except in compliance with the License
280
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
281
+ */
282
+ /**
283
+ * Token used to provide a `CuteNav` to `CuteNavItem` or `CuteNavLink`.
284
+ * Used to avoid circular imports between `CuteNav` and `CuteNavItem`.
285
+ */
286
+ const CUTE_NAV = new InjectionToken('CUTE_NAV');
287
+ /** Event emitted when the `nav-link` selection has changed. */
288
+ class CuteNavChangeEvent extends Event {
289
+ constructor(
290
+ /** Index of the currently-selected link item. */
291
+ index,
292
+ /** Reference to the currently-selected link item. */
293
+ link,
294
+ /** Index of the previously-selected link item. */
295
+ fromIndex,
296
+ /** Reference to the currently-selected link item. */
297
+ fromLink,
298
+ /** How the link was focused. */
299
+ origin) {
300
+ super("navChange");
301
+ this.index = index;
302
+ this.link = link;
303
+ this.fromIndex = fromIndex;
304
+ this.fromLink = fromLink;
305
+ this.origin = origin;
306
+ }
307
+ }
308
+ /** Cancelable event emitted when the current `nav-link` selection is about to change. */
309
+ class CuteNavChangingEvent extends Event {
310
+ constructor(
311
+ /** Index of the currently-selected link item. */
312
+ index,
313
+ /** Reference to the currently-selected link item. */
314
+ link,
315
+ /** Index of the previously-selected link item. */
316
+ fromIndex,
317
+ /** Reference to the currently-selected link item. */
318
+ fromLink,
319
+ /** How the link was focused. */
320
+ origin) {
321
+ super("navChanging", { cancelable: true });
322
+ this.index = index;
323
+ this.link = link;
324
+ this.fromIndex = fromIndex;
325
+ this.fromLink = fromLink;
326
+ this.origin = origin;
327
+ }
328
+ }
329
+ let nextId = -1;
330
+ /**
331
+ * The navigation component that is built with `flexbox` and provide a strong foundation for building other types of navigation components.
332
+ * It includes some style overrides (for working with lists), some _link_ padding for larger hit areas, and basic _disabled_ styling.
333
+ * @example
334
+ * ```html
335
+ * <nav cute-nav alignment="center">
336
+ * <a cute-nav-link active href="#">Active</a>
337
+ * <a cute-nav-link href="#">Link</a>
338
+ * <a cute-nav-link href="#">Link</a>
339
+ * <a cute-nav-link disabled>Disabled</a>
340
+ * </nav>
341
+ * ```
342
+ */
343
+ class CuteNav extends CuteLayoutControl {
344
+ /** Orientation of the navigation items */
345
+ get orientation() { return this._orientation; }
346
+ set orientation(value) {
347
+ if (value !== this._orientation) {
348
+ this._orientation = value;
349
+ if (this._keyManager) {
350
+ if (value == "horizontal") {
351
+ this._keyManager.withHorizontalOrientation(this._dir.value);
352
+ }
353
+ else {
354
+ this._keyManager.withVerticalOrientation(true).withPageUpDown();
355
+ }
356
+ this.markForCheck();
357
+ }
358
+ }
359
+ }
360
+ /** The index of the active link item. */
361
+ get selectedIndex() { return this._selectedIndex; }
362
+ set selectedIndex(value) {
363
+ if (value !== this._selectedIndex) {
364
+ this._selectedIndexToChange = value;
365
+ Promise.resolve().then(() => this.activateNavLink(value));
366
+ }
367
+ }
368
+ get classBinding() {
369
+ let classList = "justify-content-" + this.alignment;
370
+ switch (this.orientation) {
371
+ case "vertical":
372
+ if (this.breakpoint) {
373
+ classList += " flex-" + this.breakpoint + "-column";
374
+ }
375
+ else {
376
+ classList += " flex-column";
377
+ }
378
+ break;
379
+ case "horizontal":
380
+ if (this.breakpoint) {
381
+ // Nav will be stacked on the lowest breakpoint, then adapt to a horizontal layout that fills the available width starting
382
+ // from the small breakpoint.
383
+ classList += " flex-column flex-" + this.breakpoint + "-row";
384
+ }
385
+ break;
386
+ }
387
+ return classList;
388
+ }
389
+ constructor() {
390
+ super();
391
+ this._destroyRef = inject(DestroyRef);
392
+ this._dir = inject(Directionality);
393
+ this._oldFocusLink = null;
394
+ /** To synchronize selectedIndex and keyManager.activeIndex */
395
+ this._selectedIndexToChange = null;
396
+ /** The type of the navigation component */
397
+ this.navStyle = "base";
398
+ this._orientation = "horizontal";
399
+ /** The alignment of navigation items on the main flexbox' axis */
400
+ this.alignment = "start";
401
+ /**
402
+ * Determines how the `cute-nav`'s content is stretched, such as taking up the entire available width (**none**), proportionally (**fill**) or equally (**justified**).
403
+ * The width is determined by the longest `cute-nav-link`'s label. By default, stretching of items is not used (**none**).
404
+ */
405
+ this.stretchItems = "none";
406
+ /**
407
+ * By default, tabs remove their content from the DOM while it's off-screen. Setting this to _true_ will keep it in
408
+ * the DOM which will prevent elements like `iframes` and `videos` from reloading next time it comes back into the view.
409
+ */
410
+ this.preserveTabContent = false;
411
+ /** @deprecated */
412
+ this.animation = true;
413
+ /** Should the first not disabled link item be automatically selected if none were activated during initialization. */
414
+ this.autoSelect = false;
415
+ this._selectedIndex = null;
416
+ /** Output to enable support for two-way binding on `[(selectedIndex)]` */
417
+ this.selectedIndexChange = new EventEmitter();
418
+ /** Event emitted when the `nav` selection has changed. */
419
+ this.selectedLinkChange = new EventEmitter();
420
+ /** Event emitted when the `nav` selection gets changing. */
421
+ this.selectedLinkChanging = new EventEmitter();
422
+ /** Event emitted when focus has changed within a `nav`-element. */
423
+ this.focusChange = new EventEmitter();
424
+ }
425
+ generateId() {
426
+ return `cute-nav-${++nextId}`;
427
+ }
428
+ /** Whether the navigation component has a `tab` presentation style. */
429
+ isTab() {
430
+ return this.navStyle == "tabs";
431
+ }
432
+ /**
433
+ * Gets an index of the navigation link in the links array.
434
+ * @param link Navigation link reference
435
+ * @returns An index of the navigation link or **-1** if it was not found
436
+ */
437
+ getNavLinkIndex(link) {
438
+ return this.navLinks?.toArray().indexOf(link) ?? -1;
439
+ }
440
+ /**
441
+ * Request to activate cute-nav-link element
442
+ * @param linkToActivate `cute-nav-link` or its index in the links array to activate. Set _null_ for use the currently selected or first `cute-nav-link` in the list.
443
+ * @param origin (optional) Tells how the element was focused (via the mouse, keyboard, touch, or programmatically). The latter is the default value.
444
+ * @returns _true_ when succeeded, otherwise _false_.
445
+ */
446
+ activateNavLink(linkToActivate, origin = "program") {
447
+ if (linkToActivate == null) {
448
+ if (this.selectedIndex != null) {
449
+ linkToActivate = this.selectedIndex;
450
+ }
451
+ else if (this.navLinks) {
452
+ const firstEnabled = this.navLinks.find(link => !link.disabled);
453
+ if (firstEnabled) {
454
+ linkToActivate = firstEnabled;
455
+ }
456
+ else {
457
+ return false;
458
+ }
459
+ }
460
+ else {
461
+ return false;
462
+ }
463
+ }
464
+ if (!this.navLinks || this.navLinks.length == 0) {
465
+ return false;
466
+ }
467
+ if (typeof linkToActivate === "number") {
468
+ const linkIndex = linkToActivate;
469
+ linkToActivate = this.navLinks.get(linkIndex) ?? null;
470
+ }
471
+ if (!linkToActivate) {
472
+ return false;
473
+ }
474
+ const navLink = linkToActivate;
475
+ const newIndex = this.getNavLinkIndex(navLink);
476
+ if (this.selectedIndex == newIndex) {
477
+ // The link has already been activated
478
+ this._keyManager?.updateActiveItem(newIndex);
479
+ return true;
480
+ }
481
+ if (newIndex >= 0 && !navLink.disabled) {
482
+ const oldIndex = this._selectedIndex;
483
+ const oldLink = oldIndex != null ? this.navLinks.get(oldIndex) ?? null : null;
484
+ if (oldLink) {
485
+ // Check before index changing condition
486
+ const event = new CuteNavChangingEvent(newIndex, navLink, oldIndex, oldLink, origin);
487
+ this.selectedLinkChanging.emit(event);
488
+ if (event.defaultPrevented) {
489
+ return false;
490
+ }
491
+ }
492
+ this._keyManager?.updateActiveItem(newIndex);
493
+ this.navLinks.forEach(link => {
494
+ link.active = false;
495
+ });
496
+ navLink.active = true;
497
+ this._selectedIndexToChange = null;
498
+ this._selectedIndex = newIndex;
499
+ this._focusChanged(newIndex, "program");
500
+ this.selectedIndexChange.emit(newIndex);
501
+ this.selectedLinkChange.emit(new CuteNavChangeEvent(newIndex, navLink, oldIndex, oldLink, origin));
502
+ this.markForCheck();
503
+ return true;
504
+ }
505
+ return false;
506
+ }
507
+ /**
508
+ * Link focus changed handler
509
+ * @param link Source link
510
+ * @param origin Focus origin
511
+ */
512
+ _focusChanged(link, origin) {
513
+ let linkIndex;
514
+ if (typeof link === "number") {
515
+ if (this.isValidLinkIndex(link)) {
516
+ linkIndex = link;
517
+ link = this.navLinks.get(linkIndex);
518
+ }
519
+ else {
520
+ // Error
521
+ return;
522
+ }
523
+ }
524
+ else {
525
+ linkIndex = this.getNavLinkIndex(link);
526
+ }
527
+ if (origin && this._oldFocusLink !== link) {
528
+ const oldIndex = this._oldFocusLink ? this.getNavLinkIndex(this._oldFocusLink) : null;
529
+ this.focusChange.emit(new CuteNavChangeEvent(linkIndex, link, oldIndex, this._oldFocusLink, origin));
530
+ this._oldFocusLink = link;
531
+ }
532
+ }
533
+ /** Whether the specified link index is a valid nav index. */
534
+ isValidLinkIndex(index) {
535
+ return this.navLinks != null && (index >= 0 && index < this.navLinks.length);
536
+ }
537
+ onKeydown(event) {
538
+ if (event.code == "Space" || event.code == "Enter") {
539
+ if (this._keyManager
540
+ && this._keyManager.activeItemIndex != null
541
+ && this.selectedIndex != this._keyManager.activeItemIndex) {
542
+ this.activateNavLink(this._keyManager.activeItemIndex, "keyboard");
543
+ }
544
+ event.preventDefault();
545
+ }
546
+ else {
547
+ this._keyManager?.onKeydown(event);
548
+ }
549
+ }
550
+ ngOnInit() {
551
+ super.ngOnInit();
552
+ const tagName = this._elementRef.nativeElement.tagName;
553
+ if (this.isTab() && !this.role && !(tagName.toLowerCase() === "nav")) {
554
+ this.role = "tablist";
555
+ }
556
+ }
557
+ ngAfterContentInit() {
558
+ super.ngAfterContentInit();
559
+ if (this.navLinks) {
560
+ this._keyManager = new FocusKeyManager(this.navLinks)
561
+ .withWrap(true)
562
+ .withHomeAndEnd(true)
563
+ // Allow focus to land on disabled tabs, as per https://w3c.github.io/aria-practices/#kbd_disabled_controls
564
+ .skipPredicate(() => false);
565
+ if (this.orientation == "horizontal") {
566
+ this._keyManager.withHorizontalOrientation(this._dir.value);
567
+ }
568
+ else {
569
+ this._keyManager.withVerticalOrientation(true).withPageUpDown(true);
570
+ }
571
+ // Immediate activation on focus changing
572
+ this._keyManager.change
573
+ .pipe(takeUntilDestroyed(this._destroyRef))
574
+ .subscribe(newIndex => {
575
+ this._focusChanged(newIndex, "keyboard");
576
+ });
577
+ this._keyManager.tabOut
578
+ .pipe(takeUntilDestroyed(this._destroyRef))
579
+ .subscribe(() => {
580
+ if (this.selectedIndex != null) {
581
+ this._keyManager?.updateActiveItem(this.selectedIndex);
582
+ }
583
+ });
584
+ if (this._selectedIndexToChange == null && this.autoSelect) {
585
+ Promise.resolve().then(() => this.activateNavLink(null));
586
+ }
587
+ }
588
+ }
589
+ ngAfterViewInit() {
590
+ super.ngAfterViewInit();
591
+ }
592
+ ngOnDestroy() {
593
+ super.ngOnDestroy();
594
+ this._keyManager?.destroy();
595
+ }
596
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteNav, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
597
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "20.3.15", type: CuteNav, isStandalone: true, selector: "[cute-nav], [cuteNav]", inputs: { navStyle: ["cuteNav", "navStyle"], orientation: "orientation", alignment: "alignment", stretchItems: "stretchItems", preserveTabContent: ["preserveTabContent", "preserveTabContent", booleanAttribute], animation: ["animation", "animation", booleanAttribute], autoSelect: ["autoSelect", "autoSelect", booleanAttribute], selectedIndex: ["selectedIndex", "selectedIndex", numberAttribute] }, outputs: { selectedIndexChange: "selectedIndexChange", selectedLinkChange: "selectedLinkChange", selectedLinkChanging: "selectedLinkChanging", focusChange: "focusChange" }, host: { listeners: { "keydown": "onKeydown($event)" }, properties: { "class.nav-tabs": "isTab()", "class.nav-pills": "navStyle==\"pills\"", "class.nav-underline": "navStyle==\"underline\"", "class.nav-fill": "stretchItems==\"fill\"", "class.nav-justified": "stretchItems==\"justified\"", "attr.aria-orientation": "orientation", "attr.role": "role || null", "class": "this.classBinding" }, classAttribute: "cute-nav nav" }, providers: [{ provide: CUTE_NAV, useExisting: CuteNav }], queries: [{ propertyName: "navItems", predicate: CuteNavItem, descendants: true }, { propertyName: "navLinks", predicate: CuteNavLink, descendants: true }], exportAs: ["cuteNav"], usesInheritance: true, ngImport: i0 }); }
598
+ }
599
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteNav, decorators: [{
600
+ type: Directive,
601
+ args: [{
602
+ selector: '[cute-nav], [cuteNav]',
603
+ exportAs: 'cuteNav',
604
+ host: {
605
+ 'class': 'cute-nav nav',
606
+ '[class.nav-tabs]': 'isTab()',
607
+ '[class.nav-pills]': 'navStyle=="pills"',
608
+ '[class.nav-underline]': 'navStyle=="underline"',
609
+ '[class.nav-fill]': 'stretchItems=="fill"',
610
+ '[class.nav-justified]': 'stretchItems=="justified"',
611
+ '[attr.aria-orientation]': 'orientation',
612
+ '[attr.role]': 'role || null',
613
+ '(keydown)': 'onKeydown($event)',
614
+ },
615
+ providers: [{ provide: CUTE_NAV, useExisting: CuteNav }],
616
+ standalone: true,
617
+ }]
618
+ }], ctorParameters: () => [], propDecorators: { navItems: [{
619
+ type: ContentChildren,
620
+ args: [CuteNavItem, { descendants: true }]
621
+ }], navLinks: [{
622
+ type: ContentChildren,
623
+ args: [CuteNavLink, { descendants: true }]
624
+ }], navStyle: [{
625
+ type: Input,
626
+ args: ["cuteNav"]
627
+ }], orientation: [{
628
+ type: Input
629
+ }], alignment: [{
630
+ type: Input
631
+ }], stretchItems: [{
632
+ type: Input
633
+ }], preserveTabContent: [{
634
+ type: Input,
635
+ args: [{ transform: booleanAttribute }]
636
+ }], animation: [{
637
+ type: Input,
638
+ args: [{ transform: booleanAttribute }]
639
+ }], autoSelect: [{
640
+ type: Input,
641
+ args: [{ transform: booleanAttribute }]
642
+ }], selectedIndex: [{
643
+ type: Input,
644
+ args: [{ transform: numberAttribute }]
645
+ }], selectedIndexChange: [{
646
+ type: Output
647
+ }], selectedLinkChange: [{
648
+ type: Output
649
+ }], selectedLinkChanging: [{
650
+ type: Output
651
+ }], focusChange: [{
652
+ type: Output
653
+ }], classBinding: [{
654
+ type: HostBinding,
655
+ args: ["class"]
656
+ }] } });
657
+
658
+ /**
659
+ * @license Apache-2.0
660
+ *
661
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
662
+ *
663
+ * You may not use this file except in compliance with the License
664
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
665
+ */
666
+ class CuteNavPaneOutlet extends CdkPortalOutlet {
667
+ constructor() {
668
+ super();
669
+ this._pane = inject(forwardRef(() => CuteNavPane));
670
+ this._pane.show
671
+ .pipe(takeUntilDestroyed())
672
+ .subscribe(() => {
673
+ const panePortal = this._pane.item?.content;
674
+ if (panePortal && !panePortal.isAttached) {
675
+ panePortal.attach(this);
676
+ }
677
+ });
678
+ this._pane.hide
679
+ .pipe(takeUntilDestroyed())
680
+ .subscribe(() => {
681
+ const item = this._pane.item;
682
+ const panePortal = item?.content;
683
+ if (panePortal && panePortal.isAttached) {
684
+ if (!item?.preserveTabContent) {
685
+ panePortal.detach();
686
+ }
687
+ }
688
+ });
689
+ }
690
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteNavPaneOutlet, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
691
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: CuteNavPaneOutlet, isStandalone: true, selector: "[cuteNavPaneOutlet]", inputs: { portal: ["cuteNavPaneOutlet", "portal"] }, exportAs: ["cuteNavPaneOutlet"], usesInheritance: true, hostDirectives: [{ directive: i1.CdkScrollable }], ngImport: i0 }); }
692
+ }
693
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteNavPaneOutlet, decorators: [{
694
+ type: Directive,
695
+ args: [{
696
+ selector: '[cuteNavPaneOutlet]',
697
+ exportAs: 'cuteNavPaneOutlet',
698
+ inputs: ['portal: cuteNavPaneOutlet'],
699
+ hostDirectives: [CdkScrollable],
700
+ standalone: true,
701
+ }]
702
+ }], ctorParameters: () => [] });
703
+ class CuteNavPane extends CuteLayoutControl {
704
+ constructor() {
705
+ super();
706
+ this._active = false;
707
+ this._show = false;
708
+ /** Pane index */
709
+ this.index = NaN;
710
+ this.hide = new EventEmitter();
711
+ this.show = new EventEmitter();
712
+ }
713
+ generateId() {
714
+ return "";
715
+ }
716
+ ngOnInit() {
717
+ super.ngOnInit();
718
+ this.id = `${this.item?.nav.id}-pane-${this.index}`;
719
+ if (this.item) {
720
+ this._subs = this.item.nav.selectedLinkChange.subscribe(ev => {
721
+ this._active = (ev.index === this.index);
722
+ if (this._active) {
723
+ this.show.emit();
724
+ setTimeout(() => {
725
+ this._show = true;
726
+ this.markForCheck();
727
+ }, getOverallTransitionDuration(this._nativeElement));
728
+ }
729
+ else {
730
+ this.hide.emit();
731
+ this._show = false;
732
+ }
733
+ this.markForCheck();
734
+ });
735
+ }
736
+ }
737
+ ngOnDestroy() {
738
+ super.ngOnDestroy();
739
+ if (this._subs) {
740
+ this._subs.unsubscribe();
741
+ }
742
+ }
743
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteNavPane, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
744
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "20.3.15", type: CuteNavPane, isStandalone: true, selector: "[cute-nav-pane], [cuteNavPane]", inputs: { index: ["index", "index", numberAttribute], item: "item" }, outputs: { hide: "hide", show: "show" }, host: { attributes: { "role": "tabpanel" }, properties: { "class.fade": "item.nav.animation", "class.active": "_active", "class.show": "_show", "attr.tabindex": "0", "attr.aria-labelledby": "ariaLabelledby || null" }, classAttribute: "cute-nav-pane tab-pane" }, exportAs: ["cuteNavPane"], usesInheritance: true, ngImport: i0 }); }
745
+ }
746
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteNavPane, decorators: [{
747
+ type: Directive,
748
+ args: [{
749
+ selector: '[cute-nav-pane], [cuteNavPane]',
750
+ exportAs: 'cuteNavPane',
751
+ host: {
752
+ 'class': 'cute-nav-pane tab-pane',
753
+ '[class.fade]': 'item.nav.animation',
754
+ '[class.active]': '_active',
755
+ '[class.show]': '_show',
756
+ '[attr.tabindex]': '0', //'_active ? 0 : -1',
757
+ '[attr.aria-labelledby]': 'ariaLabelledby || null',
758
+ 'role': 'tabpanel',
759
+ },
760
+ standalone: true,
761
+ }]
762
+ }], ctorParameters: () => [], propDecorators: { index: [{
763
+ type: Input,
764
+ args: [{ transform: numberAttribute }]
765
+ }], item: [{
766
+ type: Input
767
+ }], hide: [{
768
+ type: Output
769
+ }], show: [{
770
+ type: Output
771
+ }] } });
772
+
773
+ /**
774
+ * @license Apache-2.0
775
+ *
776
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
777
+ *
778
+ * You may not use this file except in compliance with the License
779
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
780
+ */
781
+ class CuteNavOutlet /*implements AfterViewChecked*/ {
782
+ get nav() { return this._nav; }
783
+ set nav(value) { this._nav = value; }
784
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteNavOutlet /*implements AfterViewChecked*/, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
785
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: CuteNavOutlet /*implements AfterViewChecked*/, isStandalone: true, selector: "cute-nav-outlet", inputs: { nav: ["for", "nav"] }, host: { classAttribute: "cute-nav-outlet tab-content" }, exportAs: ["cuteNavOutlet"], ngImport: i0, template: `
786
+ @for (item of nav?.navItems; track item.id; let i=$index) {
787
+ <div cute-nav-pane
788
+ [index]="i"
789
+ [item]="item"
790
+ [color]="item.defaultColor"
791
+ [aria-labelledby]="item.navLink?.id || null">
792
+ <ng-container [cuteNavPaneOutlet]="null"></ng-container>
793
+ </div>
794
+ }
795
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: PortalModule }, { kind: "directive", type: CuteNavPane, selector: "[cute-nav-pane], [cuteNavPane]", inputs: ["index", "item"], outputs: ["hide", "show"], exportAs: ["cuteNavPane"] }, { kind: "directive", type: CuteNavPaneOutlet, selector: "[cuteNavPaneOutlet]", inputs: ["cuteNavPaneOutlet"], exportAs: ["cuteNavPaneOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
796
+ }
797
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteNavOutlet /*implements AfterViewChecked*/, decorators: [{
798
+ type: Component,
799
+ args: [{ selector: 'cute-nav-outlet', exportAs: 'cuteNavOutlet', template: `
800
+ @for (item of nav?.navItems; track item.id; let i=$index) {
801
+ <div cute-nav-pane
802
+ [index]="i"
803
+ [item]="item"
804
+ [color]="item.defaultColor"
805
+ [aria-labelledby]="item.navLink?.id || null">
806
+ <ng-container [cuteNavPaneOutlet]="null"></ng-container>
807
+ </div>
808
+ }
809
+ `, host: {
810
+ 'class': 'cute-nav-outlet tab-content'
811
+ }, imports: [PortalModule, CuteNavPane, CuteNavPaneOutlet], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush }]
812
+ }], propDecorators: { nav: [{
813
+ type: Input,
814
+ args: [{ alias: "for", required: true }]
815
+ }] } });
816
+
817
+ /**
818
+ * @license Apache-2.0
819
+ *
820
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
821
+ *
822
+ * You may not use this file except in compliance with the License
823
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
824
+ */
825
+ const TYPES = [
826
+ CuteNav,
827
+ CuteNavItem,
828
+ CuteNavLink,
829
+ CuteNavOutlet,
830
+ CuteNavContent,
831
+ CuteNavPane,
832
+ ];
833
+ class CuteNavModule {
834
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteNavModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
835
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: CuteNavModule, imports: [CommonModule, CuteNav,
836
+ CuteNavItem,
837
+ CuteNavLink,
838
+ CuteNavOutlet,
839
+ CuteNavContent,
840
+ CuteNavPane], exports: [CuteNav,
841
+ CuteNavItem,
842
+ CuteNavLink,
843
+ CuteNavOutlet,
844
+ CuteNavContent,
845
+ CuteNavPane] }); }
846
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteNavModule, imports: [CommonModule, CuteNavOutlet] }); }
847
+ }
848
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteNavModule, decorators: [{
849
+ type: NgModule,
850
+ args: [{
851
+ declarations: [],
852
+ imports: [CommonModule, ...TYPES],
853
+ exports: [TYPES],
854
+ providers: [],
855
+ }]
856
+ }] });
857
+
858
+ /**
859
+ * Generated bundle index. Do not edit.
860
+ */
861
+
862
+ export { CUTE_NAV, CUTE_NAV_ITEM, CuteNav, CuteNavChangeEvent, CuteNavChangingEvent, CuteNavContent, CuteNavItem, CuteNavLink, CuteNavModule, CuteNavOutlet, CuteNavPane, CuteNavPaneOutlet };
863
+ //# sourceMappingURL=cute-widgets-base-core-nav.mjs.map