@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,1557 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, inject, HostBinding, Input, Directive, ChangeDetectionStrategy, ViewEncapsulation, Component, DOCUMENT, NgZone, ANIMATION_MODULE_TYPE, isDevMode, ContentChildren, ViewChild, EventEmitter, Output, forwardRef, ElementRef, signal, NgModule } from '@angular/core';
3
+ import { CuteFocusableControl } from '@cute-widgets/base/abstract';
4
+ import { toTextBgCssClass, toThemeColor } from '@cute-widgets/base/core';
5
+ import { coerceNumberProperty, coerceBooleanProperty } from '@angular/cdk/coercion';
6
+ import { Subscription, merge, Subject } from 'rxjs';
7
+ import { CdkObserveContent } from '@angular/cdk/observers';
8
+ import { CuteCheckbox } from '@cute-widgets/base/checkbox';
9
+ import { CuteRadioButton } from '@cute-widgets/base/radio';
10
+ import { NgTemplateOutlet, CommonModule } from '@angular/common';
11
+ import * as i2 from '@angular/cdk/listbox';
12
+ import { CdkOption, CdkListboxModule, CdkListbox } from '@angular/cdk/listbox';
13
+ import { ListKeyManager, FocusKeyManager } from '@angular/cdk/a11y';
14
+ import { SelectionModel } from '@angular/cdk/collections';
15
+ import { hasModifierKey } from '@angular/cdk/keycodes';
16
+ import { _getFocusedElementPierceShadowDom } from '@angular/cdk/platform';
17
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
18
+ import { takeUntil } from 'rxjs/operators';
19
+
20
+ /**
21
+ * @license Apache-2.0
22
+ *
23
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
24
+ *
25
+ * You may not use this file except in compliance with the License
26
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
27
+ *
28
+ * This code is a modification of the `@angular/material` original
29
+ * code licensed under MIT-style License (https://angular.dev/license).
30
+ */
31
+ /** Injection token that can be used to provide the default options the list module. */
32
+ const CUTE_LIST_CONFIG = new InjectionToken('CUTE_LIST_CONFIG');
33
+ let nextId = -1;
34
+ class CuteListBase extends CuteFocusableControl {
35
+ constructor() {
36
+ super(...arguments);
37
+ this._defaultOptions = inject(CUTE_LIST_CONFIG, { optional: true });
38
+ /** Whether the list and its items are not interactive. */
39
+ this._isNonInteractive = true;
40
+ /** Generate numbered list group items */
41
+ this.numbered = false;
42
+ /**
43
+ * Whether to apply the layout of list group items from vertical to horizontal across all breakpoints.
44
+ * Note that currently, horizontal list groups cannot be combined with `flush` list groups.
45
+ */
46
+ this.horizontal = false;
47
+ }
48
+ /**
49
+ * Adds `.list-group-horizontal` to change the layout of list group items from vertical to horizontal across all breakpoints.
50
+ * Currently, **horizontal list groups cannot be combined with flush list groups.**
51
+ */
52
+ get getClassList() {
53
+ let classList = [];
54
+ if (this.horizontal && !this.flushBorders) {
55
+ const horizontalClass = "list-group-horizontal";
56
+ if (this.horizontalBreakpoint) {
57
+ classList.push(horizontalClass + "-" + this.horizontalBreakpoint);
58
+ }
59
+ else {
60
+ classList.push(horizontalClass);
61
+ }
62
+ }
63
+ if (this.color) {
64
+ classList.push(toTextBgCssClass(this.color));
65
+ }
66
+ return classList ? classList.join(" ") : undefined;
67
+ }
68
+ generateId() {
69
+ return `cute-list-${++nextId}`;
70
+ }
71
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListBase, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
72
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: CuteListBase, isStandalone: true, inputs: { flushBorders: "flushBorders", numbered: "numbered", horizontal: "horizontal", horizontalBreakpoint: "horizontalBreakpoint" }, host: { attributes: { "tabindex": "-1" }, properties: { "class.list-group-flush": "!!flushBorders", "class.list-group-numbered": "numbered", "class.cute-list-interactive": "!_isNonInteractive", "attr.aria-disabled": "disabled", "class": "this.getClassList" }, classAttribute: "cute-list-base list-group" }, usesInheritance: true, ngImport: i0 }); }
73
+ }
74
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListBase, decorators: [{
75
+ type: Directive,
76
+ args: [{
77
+ host: {
78
+ 'class': 'cute-list-base list-group',
79
+ '[class.list-group-flush]': '!!flushBorders',
80
+ '[class.list-group-numbered]': 'numbered',
81
+ '[class.cute-list-interactive]': '!_isNonInteractive',
82
+ '[attr.aria-disabled]': 'disabled',
83
+ 'tabindex': '-1',
84
+ }
85
+ }]
86
+ }], propDecorators: { flushBorders: [{
87
+ type: Input
88
+ }], numbered: [{
89
+ type: Input
90
+ }], horizontal: [{
91
+ type: Input
92
+ }], horizontalBreakpoint: [{
93
+ type: Input
94
+ }], getClassList: [{
95
+ type: HostBinding,
96
+ args: ["class"]
97
+ }] } });
98
+
99
+ /**
100
+ * @license Apache-2.0
101
+ *
102
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
103
+ *
104
+ * You may not use this file except in compliance with the License
105
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
106
+ *
107
+ * This code is a modification of the `@angular/material` original
108
+ * code licensed under MIT-style License (https://angular.dev/license).
109
+ */
110
+ class CuteActionList extends CuteListBase {
111
+ constructor() {
112
+ super(...arguments);
113
+ // A navigation list is considered interactive, but does not extend the interactive list
114
+ // base class. We do this because as per MDC, items of interactive lists are only reachable
115
+ // through keyboard shortcuts. We want all items for the navigation list to be reachable
116
+ // through a tab key as we do not intend to provide any special accessibility treatment. The
117
+ // accessibility treatment depends on how the end-user will interact with it.
118
+ this._isNonInteractive = false;
119
+ }
120
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteActionList, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
121
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: CuteActionList, isStandalone: true, selector: "cute-action-list", host: { attributes: { "role": "group" }, classAttribute: "cute-action-list" }, providers: [{ provide: CuteListBase, useExisting: CuteActionList }], exportAs: ["cuteActionList"], usesInheritance: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [".cute-list-base{overflow-y:auto;width:100%}.cute-list-base .cute-list-item-title,.cute-list-base .cute-list-item-line{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cute-list-base .cute-list-group__subheader{padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x)}.cute-list-base.list-group-numbered>.list-group-item:before{width:1em}.cute-list-base.list-group-flush[flushborders=full]{border:none;border-radius:var(--bs-border-radius)}.cute-list-base.list-group-flush[flushborders=full].cute-thematic-widget .list-group-item{background-color:initial!important}.cute-list-base.list-group-flush[flushborders=full] .list-group-item{border:none;border-radius:var(--bs-border-radius)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:not(.active):hover{background-color:var(--bs-secondary-bg)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:active:hover{background-color:var(--bs-secondary-bg-subtle)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
122
+ }
123
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteActionList, decorators: [{
124
+ type: Component,
125
+ args: [{ selector: 'cute-action-list', exportAs: 'cuteActionList', template: '<ng-content></ng-content>', host: {
126
+ 'class': 'cute-action-list',
127
+ 'role': 'group',
128
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: CuteListBase, useExisting: CuteActionList }], standalone: true, styles: [".cute-list-base{overflow-y:auto;width:100%}.cute-list-base .cute-list-item-title,.cute-list-base .cute-list-item-line{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cute-list-base .cute-list-group__subheader{padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x)}.cute-list-base.list-group-numbered>.list-group-item:before{width:1em}.cute-list-base.list-group-flush[flushborders=full]{border:none;border-radius:var(--bs-border-radius)}.cute-list-base.list-group-flush[flushborders=full].cute-thematic-widget .list-group-item{background-color:initial!important}.cute-list-base.list-group-flush[flushborders=full] .list-group-item{border:none;border-radius:var(--bs-border-radius)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:not(.active):hover{background-color:var(--bs-secondary-bg)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:active:hover{background-color:var(--bs-secondary-bg-subtle)}\n"] }]
129
+ }] });
130
+
131
+ /**
132
+ * @license Apache-2.0
133
+ *
134
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
135
+ *
136
+ * You may not use this file except in compliance with the License
137
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
138
+ *
139
+ * This code is a modification of the `@angular/material` original
140
+ * code licensed under MIT-style License (https://angular.dev/license).
141
+ */
142
+ /**
143
+ * Injection token that can be used to inject instances of `CuteList`. It serves as
144
+ * an alternative token to the actual `CuteList` class which could cause unnecessary
145
+ * retention of the class and its component metadata.
146
+ */
147
+ const CUTE_LIST = new InjectionToken('CuteList');
148
+ /**
149
+ * Flexible and powerful component for displaying a series of content.
150
+ */
151
+ class CuteList extends CuteListBase {
152
+ constructor() {
153
+ super();
154
+ }
155
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteList, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
156
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: CuteList, isStandalone: true, selector: "cute-list", host: { classAttribute: "cute-list" }, providers: [{ provide: CuteListBase, useExisting: CuteList }], exportAs: ["cuteList"], usesInheritance: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [".cute-list-base{overflow-y:auto;width:100%}.cute-list-base .cute-list-item-title,.cute-list-base .cute-list-item-line{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cute-list-base .cute-list-group__subheader{padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x)}.cute-list-base.list-group-numbered>.list-group-item:before{width:1em}.cute-list-base.list-group-flush[flushborders=full]{border:none;border-radius:var(--bs-border-radius)}.cute-list-base.list-group-flush[flushborders=full].cute-thematic-widget .list-group-item{background-color:initial!important}.cute-list-base.list-group-flush[flushborders=full] .list-group-item{border:none;border-radius:var(--bs-border-radius)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:not(.active):hover{background-color:var(--bs-secondary-bg)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:active:hover{background-color:var(--bs-secondary-bg-subtle)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
157
+ }
158
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteList, decorators: [{
159
+ type: Component,
160
+ args: [{ selector: 'cute-list', exportAs: 'cuteList', template: '<ng-content></ng-content>', host: {
161
+ 'class': 'cute-list',
162
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: CuteListBase, useExisting: CuteList }], standalone: true, styles: [".cute-list-base{overflow-y:auto;width:100%}.cute-list-base .cute-list-item-title,.cute-list-base .cute-list-item-line{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cute-list-base .cute-list-group__subheader{padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x)}.cute-list-base.list-group-numbered>.list-group-item:before{width:1em}.cute-list-base.list-group-flush[flushborders=full]{border:none;border-radius:var(--bs-border-radius)}.cute-list-base.list-group-flush[flushborders=full].cute-thematic-widget .list-group-item{background-color:initial!important}.cute-list-base.list-group-flush[flushborders=full] .list-group-item{border:none;border-radius:var(--bs-border-radius)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:not(.active):hover{background-color:var(--bs-secondary-bg)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:active:hover{background-color:var(--bs-secondary-bg-subtle)}\n"] }]
163
+ }], ctorParameters: () => [] });
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
+ * This code is a modification of the `@angular/material` original
174
+ * code licensed under MIT-style License (https://angular.dev/license).
175
+ */
176
+ /**
177
+ * Injection token that can be used to reference instances of an `ListOption`. It serves
178
+ * as an alternative token to an actual implementation which could result in undesired
179
+ * retention of the class or circular references breaking runtime execution.
180
+ * @docs-private
181
+ */
182
+ const LIST_OPTION = new InjectionToken('ListOption');
183
+
184
+ /**
185
+ * @license Apache-2.0
186
+ *
187
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
188
+ *
189
+ * You may not use this file except in compliance with the License
190
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
191
+ *
192
+ * This code is a modification of the `@angular/material` original
193
+ * code licensed under MIT-style License (https://angular.dev/license).
194
+ */
195
+ /**
196
+ * Directive capturing the title of a list item. A list item usually consists of a
197
+ * title and optional secondary or tertiary lines.
198
+ *
199
+ * Text content for the title never wraps. There can only be a single title per-list item.
200
+ */
201
+ class CuteListItemTitle {
202
+ constructor(_elementRef) {
203
+ this._elementRef = _elementRef;
204
+ }
205
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListItemTitle, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
206
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: CuteListItemTitle, isStandalone: true, selector: "[cuteListItemTitle]", host: { classAttribute: "cute-list-item-title" }, ngImport: i0 }); }
207
+ }
208
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListItemTitle, decorators: [{
209
+ type: Directive,
210
+ args: [{
211
+ selector: '[cuteListItemTitle]',
212
+ host: { 'class': 'cute-list-item-title' },
213
+ standalone: true,
214
+ }]
215
+ }], ctorParameters: () => [{ type: i0.ElementRef }] });
216
+ /**
217
+ * Directive capturing a line in a list item. A list item usually consists of a
218
+ * title and optional secondary or tertiary lines.
219
+ *
220
+ * Text content inside a line never wraps. There can be at maximum two lines per list item.
221
+ */
222
+ class CuteListItemLine {
223
+ constructor(_elementRef) {
224
+ this._elementRef = _elementRef;
225
+ }
226
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListItemLine, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
227
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: CuteListItemLine, isStandalone: true, selector: "[cuteListItemLine]", host: { classAttribute: "cute-list-item-line" }, ngImport: i0 }); }
228
+ }
229
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListItemLine, decorators: [{
230
+ type: Directive,
231
+ args: [{
232
+ selector: '[cuteListItemLine]',
233
+ host: { 'class': 'cute-list-item-line' },
234
+ standalone: true,
235
+ }]
236
+ }], ctorParameters: () => [{ type: i0.ElementRef }] });
237
+ /**
238
+ * Directive matching an optional meta-section for list items.
239
+ *
240
+ * List items can reserve space at the end of an item to display a control,
241
+ * button or additional text content.
242
+ */
243
+ class CuteListItemMeta {
244
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListItemMeta, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
245
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: CuteListItemMeta, isStandalone: true, selector: "[cuteListItemMeta]", host: { classAttribute: "cute-list-item-meta" }, ngImport: i0 }); }
246
+ }
247
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListItemMeta, decorators: [{
248
+ type: Directive,
249
+ args: [{
250
+ selector: '[cuteListItemMeta]',
251
+ host: { 'class': 'cute-list-item-meta' },
252
+ standalone: true,
253
+ }]
254
+ }] });
255
+ /**
256
+ * CuteWidgets uses the very intuitively named classes `.cute-list-item__start` and `.cute-list-item__end` to
257
+ * position content such as icons or checkboxes/radios that comes either before or after the text
258
+ * content respectively. This directive detects the placement of the checkbox/radio and applies the
259
+ * correct CuteWidgets class to position the icon/avatar on the opposite side.
260
+ */
261
+ class _CuteListItemGraphicBase {
262
+ constructor() {
263
+ this._listOption = inject(LIST_OPTION, { optional: true });
264
+ }
265
+ _isAlignedAtStart() {
266
+ // By default, in all list items, the graphic is aligned at start. In list options,
267
+ // the graphic is only aligned at the start if the checkbox/radio is at the end.
268
+ return !this._listOption || this._listOption?._getTogglePosition() === 'after';
269
+ }
270
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: _CuteListItemGraphicBase, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
271
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: _CuteListItemGraphicBase, isStandalone: true, host: { properties: { "class.cute-list-item__start": "_isAlignedAtStart()", "class.cute-list-item__end": "!_isAlignedAtStart()" } }, ngImport: i0 }); }
272
+ }
273
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: _CuteListItemGraphicBase, decorators: [{
274
+ type: Directive,
275
+ args: [{
276
+ host: {
277
+ '[class.cute-list-item__start]': '_isAlignedAtStart()',
278
+ '[class.cute-list-item__end]': '!_isAlignedAtStart()',
279
+ }
280
+ }]
281
+ }] });
282
+ /**
283
+ * Directive matching an optional avatar within a list item.
284
+ *
285
+ * List items can reserve space at the beginning of an item to display an avatar.
286
+ */
287
+ class CuteListItemAvatar extends _CuteListItemGraphicBase {
288
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListItemAvatar, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
289
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: CuteListItemAvatar, isStandalone: true, selector: "[cuteListItemAvatar]", host: { classAttribute: "cute-list-item-avatar" }, usesInheritance: true, ngImport: i0 }); }
290
+ }
291
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListItemAvatar, decorators: [{
292
+ type: Directive,
293
+ args: [{
294
+ selector: '[cuteListItemAvatar]',
295
+ host: { 'class': 'cute-list-item-avatar' },
296
+ standalone: true,
297
+ }]
298
+ }] });
299
+ /**
300
+ * Directive matching an optional icon within a list item.
301
+ *
302
+ * List items can reserve space at the beginning of an item to display an icon.
303
+ */
304
+ class CuteListItemIcon extends _CuteListItemGraphicBase {
305
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListItemIcon, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
306
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: CuteListItemIcon, isStandalone: true, selector: "[cuteListItemIcon]", host: { classAttribute: "cute-list-item-icon" }, usesInheritance: true, ngImport: i0 }); }
307
+ }
308
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListItemIcon, decorators: [{
309
+ type: Directive,
310
+ args: [{
311
+ selector: '[cuteListItemIcon]',
312
+ host: { 'class': 'cute-list-item-icon' },
313
+ standalone: true,
314
+ }]
315
+ }] });
316
+
317
+ /**
318
+ * @license Apache-2.0
319
+ *
320
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
321
+ *
322
+ * You may not use this file except in compliance with the License
323
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
324
+ *
325
+ * This code is a modification of the `@angular/material` original
326
+ * code licensed under MIT-style License (https://angular.dev/license).
327
+ */
328
+ /**
329
+ * Injection token that can be used to inject instances of `CuteNavList`. It serves as
330
+ * an alternative token to the actual `CuteNavList` class which could cause unnecessary
331
+ * retention of the class and its component metadata.
332
+ */
333
+ const CUTE_NAV_LIST = new InjectionToken('CuteNavList');
334
+ class CuteNavList extends CuteListBase {
335
+ constructor() {
336
+ super(...arguments);
337
+ // A navigation list is considered interactive, but does not extend the interactive list
338
+ // base class. We do this because as per MDC, items of interactive lists are only reachable
339
+ // through keyboard shortcuts. We want all items for the navigation list to be reachable
340
+ // through a tab key as we do not intend to provide any special accessibility treatment. The
341
+ // accessibility treatment depends on how the end-user will interact with it.
342
+ this._isNonInteractive = false;
343
+ }
344
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteNavList, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
345
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: CuteNavList, isStandalone: true, selector: "cute-nav-list", host: { attributes: { "role": "navigation" }, classAttribute: "cute-nav-list nav" }, providers: [
346
+ { provide: CuteListBase, useExisting: CuteNavList },
347
+ { provide: CUTE_NAV_LIST, useExisting: CuteNavList },
348
+ ], exportAs: ["cuteNavList"], usesInheritance: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [".cute-list-base{overflow-y:auto;width:100%}.cute-list-base .cute-list-item-title,.cute-list-base .cute-list-item-line{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cute-list-base .cute-list-group__subheader{padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x)}.cute-list-base.list-group-numbered>.list-group-item:before{width:1em}.cute-list-base.list-group-flush[flushborders=full]{border:none;border-radius:var(--bs-border-radius)}.cute-list-base.list-group-flush[flushborders=full].cute-thematic-widget .list-group-item{background-color:initial!important}.cute-list-base.list-group-flush[flushborders=full] .list-group-item{border:none;border-radius:var(--bs-border-radius)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:not(.active):hover{background-color:var(--bs-secondary-bg)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:active:hover{background-color:var(--bs-secondary-bg-subtle)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
349
+ }
350
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteNavList, decorators: [{
351
+ type: Component,
352
+ args: [{ selector: 'cute-nav-list', exportAs: 'cuteNavList', template: '<ng-content></ng-content>', host: {
353
+ 'class': 'cute-nav-list nav',
354
+ 'role': 'navigation',
355
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
356
+ { provide: CuteListBase, useExisting: CuteNavList },
357
+ { provide: CUTE_NAV_LIST, useExisting: CuteNavList },
358
+ ], standalone: true, styles: [".cute-list-base{overflow-y:auto;width:100%}.cute-list-base .cute-list-item-title,.cute-list-base .cute-list-item-line{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cute-list-base .cute-list-group__subheader{padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x)}.cute-list-base.list-group-numbered>.list-group-item:before{width:1em}.cute-list-base.list-group-flush[flushborders=full]{border:none;border-radius:var(--bs-border-radius)}.cute-list-base.list-group-flush[flushborders=full].cute-thematic-widget .list-group-item{background-color:initial!important}.cute-list-base.list-group-flush[flushborders=full] .list-group-item{border:none;border-radius:var(--bs-border-radius)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:not(.active):hover{background-color:var(--bs-secondary-bg)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:active:hover{background-color:var(--bs-secondary-bg-subtle)}\n"] }]
359
+ }] });
360
+
361
+ /**
362
+ * @license Apache-2.0
363
+ *
364
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
365
+ *
366
+ * You may not use this file except in compliance with the License
367
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
368
+ *
369
+ * This code is a modification of the `@angular/material` original
370
+ * code licensed under MIT-style License (https://angular.dev/license).
371
+ */
372
+ class CuteListItemBase extends CuteFocusableControl {
373
+ /**
374
+ * The number of lines this list item should reserve space for. If not specified,
375
+ * lines are inferred based on the projected content.
376
+ *
377
+ * Explicitly specifying the number of lines is useful if you want to acquire additional
378
+ * space and enable the wrapping of text. The unscoped text content of a list item will
379
+ * always be able to take up the remaining space of the item, unless it represents the title.
380
+ *
381
+ * A maximum of three lines is supported as per the Material Design specification.
382
+ */
383
+ set lines(lines) {
384
+ this._explicitLines = coerceNumberProperty(lines, null);
385
+ this._updateItemLines(false);
386
+ }
387
+ constructor() {
388
+ super();
389
+ this._document = inject(DOCUMENT);
390
+ this._listBase = inject(CuteListBase, { optional: true });
391
+ this._ngZone = inject(NgZone);
392
+ this._navList = inject(CUTE_NAV_LIST, { optional: true });
393
+ this._isInteractiveItem = false;
394
+ this.toThemeColor = toThemeColor;
395
+ /** Whether the list item has unscoped text content. */
396
+ this._hasUnscopedTextContent = false;
397
+ this._subscriptions = new Subscription();
398
+ this._explicitLines = null;
399
+ const animationMode = inject(ANIMATION_MODULE_TYPE, { optional: true });
400
+ this._hostElement = this._nativeElement;
401
+ this._isButtonElement = this._hostElement.nodeName.toLowerCase() === 'button';
402
+ this._noopAnimations = animationMode === 'NoopAnimations';
403
+ if (this._listBase && !this._listBase._isNonInteractive) {
404
+ this._initInteractiveListItem();
405
+ }
406
+ // If no type attribute is specified for a host `<button>` element, set it to `button`. If a
407
+ // type attribute is already specified, we do nothing. We do this for backwards compatibility.
408
+ // TODO: Determine if we intend to continue doing this for the MDC-based list.
409
+ // if (this._isButtonElement && !this._hostElement.hasAttribute('type')) {
410
+ // this._hostElement.setAttribute('type', 'button');
411
+ // }
412
+ }
413
+ _initInteractiveListItem() {
414
+ this._isInteractiveItem = true;
415
+ this._hostElement.classList.add('cute-list-item-interactive');
416
+ // this._rippleRenderer = new RippleRenderer(
417
+ // this,
418
+ // this._ngZone,
419
+ // this._hostElement,
420
+ // this._platform,
421
+ // );
422
+ // this._rippleRenderer.setupTriggerEvents(this._hostElement);
423
+ }
424
+ /**
425
+ * Subscribes to changes in the projected title and lines.
426
+ * Triggers item lines update whenever a change occurs.
427
+ */
428
+ _monitorProjectedLinesAndTitle() {
429
+ this._ngZone.runOutsideAngular(() => {
430
+ this._subscriptions.add(merge(this._lines.changes, this._titles.changes).subscribe(() => this._updateItemLines(false)));
431
+ });
432
+ }
433
+ /**
434
+ * Updates the lines of the list item. Based on the projected user content and optional
435
+ * explicit lines setting, the visual appearance of the list item is determined.
436
+ *
437
+ * This method should be invoked whenever the projected user content changes, or
438
+ * when the explicit lines have been updated.
439
+ *
440
+ * @param recheckUnscopedContent Whether the projected unscoped content should be re-checked.
441
+ * The unscoped content is not re-checked for every update as it is a rather expensive check
442
+ * for content that is expected to not change very often.
443
+ */
444
+ _updateItemLines(recheckUnscopedContent) {
445
+ // If the updated is triggered too early before the view and content are initialized,
446
+ // we just skip the update. After view initialization, the update is triggered again.
447
+ if (!this._lines || !this._titles || !this._unscopedContent) {
448
+ return;
449
+ }
450
+ // Re-check the DOM for unscoped text content if requested. This needs to
451
+ // happen before any computation or sanity checks run as these rely on the
452
+ // result of whether there is unscoped text content or not.
453
+ if (recheckUnscopedContent) {
454
+ this._checkDomForUnscopedTextContent();
455
+ }
456
+ // Sanity checks the list item lines and title in the content. This is a dev-mode only
457
+ // check that can be dead-code eliminated by Terser in production.
458
+ if (isDevMode()) {
459
+ sanityCheckListItemContent(this);
460
+ }
461
+ const numberOfLines = this._explicitLines ?? this._inferLinesFromContent();
462
+ const unscopedContentEl = this._unscopedContent.nativeElement;
463
+ // Update the list item element to reflect the number of lines.
464
+ this._hostElement.classList.toggle('cute-list-item-single-line', numberOfLines <= 1);
465
+ this._hostElement.classList.toggle('cute-list-item--with-one-line', numberOfLines <= 1);
466
+ this._hostElement.classList.toggle('cute-list-item--with-two-lines', numberOfLines === 2);
467
+ this._hostElement.classList.toggle('cute-list-item--with-three-lines', numberOfLines === 3);
468
+ // If there is no title and the unscoped content is the only line, the
469
+ // unscoped text content will be treated as the title of the list-item.
470
+ if (this._hasUnscopedTextContent) {
471
+ const treatAsTitle = this._titles.length === 0 && numberOfLines === 1;
472
+ unscopedContentEl.classList.toggle('cute-list-item__primary-text', treatAsTitle);
473
+ unscopedContentEl.classList.toggle('cute-list-item__secondary-text', !treatAsTitle);
474
+ }
475
+ else {
476
+ unscopedContentEl.classList.remove('cute-list-item__primary-text');
477
+ unscopedContentEl.classList.remove('cute-list-item__secondary-text');
478
+ }
479
+ }
480
+ /**
481
+ * Infers the number of lines based on the projected user content. This is useful
482
+ * if no explicit number of lines has been specified on the list item.
483
+ *
484
+ * The number of lines is inferred based on whether there is a title, the number of
485
+ * additional lines (secondary/tertiary). An additional line is acquired if there is
486
+ * unscoped text content.
487
+ */
488
+ _inferLinesFromContent() {
489
+ let numOfLines = this._titles.length + this._lines.length;
490
+ if (this._hasUnscopedTextContent) {
491
+ numOfLines += 1;
492
+ }
493
+ return numOfLines;
494
+ }
495
+ /** Checks whether the list item has unscoped text content. */
496
+ _checkDomForUnscopedTextContent() {
497
+ this._hasUnscopedTextContent = Array.from(this._unscopedContent.nativeElement.childNodes)
498
+ .filter(node => node.nodeType !== node.COMMENT_NODE)
499
+ .some(node => !!(node.textContent && node.textContent.trim()));
500
+ }
501
+ /** Whether the list item has icons or avatars. */
502
+ _hasIconOrAvatar() {
503
+ return !!(this._avatars?.length || this._icons?.length);
504
+ }
505
+ generateId() {
506
+ return "";
507
+ }
508
+ /**
509
+ * "Use `a`s or `button`s to create actionable list group items..." (`Bootstrap` docs)
510
+ * @returns Whether the list item is actionable
511
+ */
512
+ isActionItem() {
513
+ const tag = this._nativeElement.nodeName.toLowerCase();
514
+ return tag === "a" || tag === "button";
515
+ }
516
+ onClick(event) {
517
+ const elem = event.target;
518
+ if (elem instanceof HTMLAnchorElement && elem.hash && elem.hash.startsWith("#")) {
519
+ event.preventDefault();
520
+ event.stopPropagation();
521
+ const target = this._document.getElementById(elem.hash.substring(1));
522
+ if (target) {
523
+ target.scrollIntoView({ behavior: "smooth", block: "nearest" });
524
+ }
525
+ }
526
+ }
527
+ ngAfterViewInit() {
528
+ super.ngAfterViewInit();
529
+ this._monitorProjectedLinesAndTitle();
530
+ this._updateItemLines(true);
531
+ }
532
+ ngOnDestroy() {
533
+ super.ngOnDestroy();
534
+ this._subscriptions.unsubscribe();
535
+ }
536
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListItemBase, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
537
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: CuteListItemBase, isStandalone: true, inputs: { lines: "lines" }, host: { listeners: { "click": "onClick($event)" }, properties: { "class": "color ? \"list-group-item-\"+ toThemeColor(color) : \"\"", "class.list-group-item-action": "_isInteractiveItem", "class.disabled": "disabled", "attr.aria-disabled": "disabled", "attr.disabled": "(_isButtonElement && disabled) || null" }, classAttribute: "cute-list-item-base list-group-item" }, queries: [{ propertyName: "_avatars", predicate: CuteListItemAvatar }, { propertyName: "_icons", predicate: CuteListItemIcon }], usesInheritance: true, ngImport: i0 }); }
538
+ }
539
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListItemBase, decorators: [{
540
+ type: Directive,
541
+ args: [{
542
+ host: {
543
+ 'class': 'cute-list-item-base list-group-item',
544
+ '[class]': 'color ? "list-group-item-"+ toThemeColor(color) : ""',
545
+ //'[class.nav-link]': '_navList',
546
+ '[class.list-group-item-action]': '_isInteractiveItem',
547
+ '[class.disabled]': 'disabled',
548
+ '[attr.aria-disabled]': 'disabled',
549
+ '[attr.disabled]': '(_isButtonElement && disabled) || null',
550
+ //'[attr.tabindex]': '_isInteractiveItem && !disabled ? 0 : -1',
551
+ '(click)': 'onClick($event)',
552
+ }
553
+ }]
554
+ }], ctorParameters: () => [], propDecorators: { _avatars: [{
555
+ type: ContentChildren,
556
+ args: [CuteListItemAvatar, { descendants: false }]
557
+ }], _icons: [{
558
+ type: ContentChildren,
559
+ args: [CuteListItemIcon, { descendants: false }]
560
+ }], lines: [{
561
+ type: Input
562
+ }] } });
563
+ /**
564
+ * Sanity checks the configuration of the list item with respect to the amount
565
+ * of lines, whether there is a title, or if there is unscoped text content.
566
+ *
567
+ * The checks are extracted into a top-level function that can be dead-code
568
+ * eliminated by Terser or other optimizers in production mode.
569
+ */
570
+ function sanityCheckListItemContent(item) {
571
+ const numTitles = item._titles.length;
572
+ const numLines = item._lines.length;
573
+ if (numTitles > 1) {
574
+ console.warn('A list item cannot have multiple titles.');
575
+ }
576
+ if (numTitles === 0 && numLines > 0) {
577
+ console.warn('A list item line can only be used if there is a list item title.');
578
+ }
579
+ if (numTitles === 0 &&
580
+ item._hasUnscopedTextContent &&
581
+ item._explicitLines !== null &&
582
+ item._explicitLines > 1) {
583
+ console.warn('A list item cannot have wrapping content without a title.');
584
+ }
585
+ if (numLines > 2 || (numLines === 2 && item._hasUnscopedTextContent)) {
586
+ console.warn('A list item can have at maximum three lines.');
587
+ }
588
+ }
589
+
590
+ /**
591
+ * @license Apache-2.0
592
+ *
593
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
594
+ *
595
+ * You may not use this file except in compliance with the License
596
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
597
+ *
598
+ * This code is a modification of the `@angular/material` original
599
+ * code licensed under MIT-style License (https://angular.dev/license).
600
+ */
601
+ class CuteListItem extends CuteListItemBase {
602
+ constructor() {
603
+ super(...arguments);
604
+ this._activated = false;
605
+ }
606
+ /** Indicates whether an item in a `<cute-nav-list>` is the currently active page. */
607
+ get activated() { return this._activated; }
608
+ set activated(activated) {
609
+ this._activated = coerceBooleanProperty(activated);
610
+ }
611
+ /**
612
+ * Determine the value of `aria-current`. Return 'page' if this item is an activated anchor tag.
613
+ * Otherwise, return `null`. This method is safe to use with server-side rendering.
614
+ */
615
+ _getAriaCurrent() {
616
+ return this._hostElement.nodeName === 'A' && this._activated ? 'page' : null;
617
+ }
618
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListItem, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
619
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: CuteListItem, isStandalone: true, selector: "cute-list-item, a[cute-list-item], button[cute-list-item]", inputs: { activated: "activated" }, host: { properties: { "class.active": "activated", "attr.aria-current": "_getAriaCurrent()" }, classAttribute: "cute-list-item" }, queries: [{ propertyName: "_lines", predicate: CuteListItemLine, descendants: true }, { propertyName: "_titles", predicate: CuteListItemTitle, descendants: true }, { propertyName: "_meta", predicate: CuteListItemMeta, descendants: true }], viewQueries: [{ propertyName: "_unscopedContent", first: true, predicate: ["unscopedContent"], descendants: true }, { propertyName: "_itemText", first: true, predicate: ["text"], descendants: true }], exportAs: ["cuteListItem"], usesInheritance: true, ngImport: i0, template: "<ng-content select=\"[cuteListItemAvatar],[cuteListItemIcon]\"></ng-content>\r\n\r\n<div class=\"cute-list-item-content\">\r\n <ng-content select=\"[cuteListItemTitle]\"></ng-content>\r\n <ng-content select=\"[cuteListItemLine]\"></ng-content>\r\n <span #unscopedContent class=\"cute-list-item-content-unscoped\"\r\n (cdkObserveContent)=\"_updateItemLines(true)\">\r\n <ng-content></ng-content>\r\n </span>\r\n</div>\r\n\r\n<ng-content select=\"[cuteListItemMeta]\"></ng-content>\r\n\r\n<ng-content select=\"cute-divider\"></ng-content>\r\n\r\n<!--\r\n Strong focus indicator element. MDC uses the `::before` pseudo element for the default\r\n focus/hover/selected state, so we need a separate element.\r\n-->\r\n<!--<div class=\"cute-focus-indicator\"></div>-->\r\n", styles: [".cute-list-item{display:flex;position:relative;justify-content:flex-start;align-items:stretch;pointer-events:auto;cursor:default;width:100%;gap:.5em}.cute-list-item:focus{outline:0}.cute-list-item .cute-list-item-content{width:100%}.cute-list-item .cute-list-item-content .cute-list-item--with-two-lines{height:var(--cute-list-item-with-two-lines, 64px)}.cute-list-item .cute-list-item-content .cute-list-item-title,.cute-list-item .cute-list-item-content cute-list-item__primary-text{font-weight:600}.cute-list-item .cute-list-item-content .cute-list-item-line,.cute-list-item .cute-list-item-content .cute-list-item__secondary-text{font-size:.875em;font-weight:400;line-height:1.25rem}.cute-list-item .cute-list-item-content .cute-list-item-line .cute-list-item:not(:hover),.cute-list-item .cute-list-item-content .cute-list-item__secondary-text .cute-list-item:not(:hover){color:var(--bs-secondary-color)}.cute-list-item .cute-list-item-content .cute-list-item.cute-list-item--with-three-lines .cute-list-item-line.cute-list-item__secondary-text{white-space:nowrap;line-height:normal}.cute-list-item .cute-list-item-content .cute-list-item.cute-list-item--with-three-lines .cute-list-item-unscoped-content.cute-list-item__secondary-text{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.cute-list-item .cute-list-item-icon{margin-top:.25em}.cute-list-item.cute-list-item-interactive{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: CdkObserveContent, selector: "[cdkObserveContent]", inputs: ["cdkObserveContentDisabled", "debounce"], outputs: ["cdkObserveContent"], exportAs: ["cdkObserveContent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
620
+ }
621
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListItem, decorators: [{
622
+ type: Component,
623
+ args: [{ selector: `cute-list-item, a[cute-list-item], button[cute-list-item]`, exportAs: 'cuteListItem', host: {
624
+ 'class': 'cute-list-item',
625
+ '[class.active]': 'activated',
626
+ '[attr.aria-current]': '_getAriaCurrent()',
627
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CdkObserveContent], template: "<ng-content select=\"[cuteListItemAvatar],[cuteListItemIcon]\"></ng-content>\r\n\r\n<div class=\"cute-list-item-content\">\r\n <ng-content select=\"[cuteListItemTitle]\"></ng-content>\r\n <ng-content select=\"[cuteListItemLine]\"></ng-content>\r\n <span #unscopedContent class=\"cute-list-item-content-unscoped\"\r\n (cdkObserveContent)=\"_updateItemLines(true)\">\r\n <ng-content></ng-content>\r\n </span>\r\n</div>\r\n\r\n<ng-content select=\"[cuteListItemMeta]\"></ng-content>\r\n\r\n<ng-content select=\"cute-divider\"></ng-content>\r\n\r\n<!--\r\n Strong focus indicator element. MDC uses the `::before` pseudo element for the default\r\n focus/hover/selected state, so we need a separate element.\r\n-->\r\n<!--<div class=\"cute-focus-indicator\"></div>-->\r\n", styles: [".cute-list-item{display:flex;position:relative;justify-content:flex-start;align-items:stretch;pointer-events:auto;cursor:default;width:100%;gap:.5em}.cute-list-item:focus{outline:0}.cute-list-item .cute-list-item-content{width:100%}.cute-list-item .cute-list-item-content .cute-list-item--with-two-lines{height:var(--cute-list-item-with-two-lines, 64px)}.cute-list-item .cute-list-item-content .cute-list-item-title,.cute-list-item .cute-list-item-content cute-list-item__primary-text{font-weight:600}.cute-list-item .cute-list-item-content .cute-list-item-line,.cute-list-item .cute-list-item-content .cute-list-item__secondary-text{font-size:.875em;font-weight:400;line-height:1.25rem}.cute-list-item .cute-list-item-content .cute-list-item-line .cute-list-item:not(:hover),.cute-list-item .cute-list-item-content .cute-list-item__secondary-text .cute-list-item:not(:hover){color:var(--bs-secondary-color)}.cute-list-item .cute-list-item-content .cute-list-item.cute-list-item--with-three-lines .cute-list-item-line.cute-list-item__secondary-text{white-space:nowrap;line-height:normal}.cute-list-item .cute-list-item-content .cute-list-item.cute-list-item--with-three-lines .cute-list-item-unscoped-content.cute-list-item__secondary-text{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.cute-list-item .cute-list-item-icon{margin-top:.25em}.cute-list-item.cute-list-item-interactive{cursor:pointer}\n"] }]
628
+ }], propDecorators: { _lines: [{
629
+ type: ContentChildren,
630
+ args: [CuteListItemLine, { descendants: true }]
631
+ }], _titles: [{
632
+ type: ContentChildren,
633
+ args: [CuteListItemTitle, { descendants: true }]
634
+ }], _meta: [{
635
+ type: ContentChildren,
636
+ args: [CuteListItemMeta, { descendants: true }]
637
+ }], _unscopedContent: [{
638
+ type: ViewChild,
639
+ args: ['unscopedContent']
640
+ }], _itemText: [{
641
+ type: ViewChild,
642
+ args: ['text']
643
+ }], activated: [{
644
+ type: Input
645
+ }] } });
646
+
647
+ /**
648
+ * @license Apache-2.0
649
+ *
650
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
651
+ *
652
+ * You may not use this file except in compliance with the License
653
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
654
+ *
655
+ * This code is a modification of the `@angular/material` original
656
+ * code licensed under MIT-style License (https://angular.dev/license).
657
+ */
658
+ /**
659
+ * Injection token that can be used to reference instances of an `SelectionList`. It serves
660
+ * as an alternative token to an actual implementation which would result in circular references.
661
+ */
662
+ const SELECTION_LIST = new InjectionToken('SelectionList');
663
+ class CuteListOption extends CuteListItemBase {
664
+ constructor() {
665
+ super(...arguments);
666
+ this._selectionList = inject(SELECTION_LIST);
667
+ /**
668
+ * Emits when the selected state of the option has changed.
669
+ * Use to facilitate two-data binding to the `selected` property.
670
+ */
671
+ this.selectedChange = new EventEmitter();
672
+ /** Whether the label should appear before or after the checkbox/radio. Defaults to 'after' */
673
+ this.togglePosition = 'after';
674
+ this._selected = false;
675
+ /** Relative size of the internal input element. */
676
+ this.iconSize = "middle";
677
+ /**
678
+ * This is set to true after the first OnChanges cycle, so we don't
679
+ * clear the value of `selected` in the first cycle.
680
+ */
681
+ this._inputsInitialized = false;
682
+ }
683
+ /** Value of the option */
684
+ get value() { return this._value; }
685
+ set value(newValue) {
686
+ if (this.selected && newValue !== this.value && this._inputsInitialized) {
687
+ this.selected = false;
688
+ }
689
+ this._value = newValue;
690
+ }
691
+ /** Whether the option is selected. */
692
+ get selected() { return this._selectionList.selectedOptions.isSelected(this); }
693
+ set selected(value) {
694
+ const isSelected = coerceBooleanProperty(value);
695
+ if (isSelected !== this._selected) {
696
+ this._setSelected(isSelected);
697
+ if (isSelected || this._selectionList.multiple) {
698
+ this._selectionList._reportValueChange();
699
+ }
700
+ }
701
+ }
702
+ get hideIndicator() {
703
+ return !this._selectionList.multiple && this._selectionList.hideSingleSelectionIndicator;
704
+ }
705
+ get hiddenIndicatorSelected() {
706
+ return this.selected && this.hideIndicator;
707
+ }
708
+ ngOnInit() {
709
+ super.ngOnInit();
710
+ const list = this._selectionList;
711
+ if (list._value && list._value.some(value => list.compareWith(this._value, value))) {
712
+ this._setSelected(true);
713
+ }
714
+ const wasSelected = this._selected;
715
+ // List options that are selected at initialization can't be reported properly to the form
716
+ // control. This is because it takes some time until the selection-list knows about all
717
+ // available options. Also, it can happen that the ControlValueAccessor has an initial value
718
+ // that should be used instead. Deferring the value change report to the next tick ensures
719
+ // that the form control value is not being overwritten.
720
+ Promise.resolve().then(() => {
721
+ if (this._selected || wasSelected) {
722
+ this.selected = true;
723
+ this.markForCheck();
724
+ }
725
+ });
726
+ this._inputsInitialized = true;
727
+ }
728
+ ngOnDestroy() {
729
+ super.ngOnDestroy();
730
+ if (this.selected) {
731
+ // We have to delay this until the next tick in order
732
+ // to avoid changed after checked errors.
733
+ Promise.resolve().then(() => {
734
+ this.selected = false;
735
+ });
736
+ }
737
+ }
738
+ /** Toggles the selection state of the option. */
739
+ toggle() {
740
+ this.selected = !this.selected;
741
+ }
742
+ /** Gets the text label of the list option. Used for the typeahead functionality in the list. */
743
+ getLabel() {
744
+ const titleElement = this._titles?.get(0)?._elementRef.nativeElement;
745
+ // If there is no explicit title element, the unscoped text content
746
+ // is treated as the list item title.
747
+ const labelEl = titleElement || this._unscopedContent?.nativeElement;
748
+ return labelEl?.textContent || '';
749
+ }
750
+ /** Whether a checkbox is shown at the given position. */
751
+ _hasCheckboxAt(position) {
752
+ return this._selectionList.multiple && this._getTogglePosition() === position;
753
+ }
754
+ /** Where a radio indicator is shown at the given position. */
755
+ _hasRadioAt(position) {
756
+ return (!this._selectionList.multiple &&
757
+ this._getTogglePosition() === position &&
758
+ !this._selectionList.hideSingleSelectionIndicator);
759
+ }
760
+ /** Whether icons or avatars are shown at the given position. */
761
+ _hasIconsOrAvatarsAt(position) {
762
+ return this._hasProjected('icons', position) || this._hasProjected('avatars', position);
763
+ }
764
+ /** Gets whether the given type of element is projected at the specified position. */
765
+ _hasProjected(type, position) {
766
+ // If the checkbox/radio is shown at the specified position, none of the icons or
767
+ // avatars can be shown at the position.
768
+ return (this._getTogglePosition() !== position &&
769
+ (type === 'avatars' ? this._avatars?.length !== 0 : this._icons?.length !== 0));
770
+ }
771
+ _handleBlur() {
772
+ this._selectionList._onTouched();
773
+ }
774
+ /** Gets the current position of the checkbox/radio. */
775
+ _getTogglePosition() {
776
+ return this.togglePosition || 'after';
777
+ }
778
+ /**
779
+ * Sets the selected state of the option.
780
+ * @returns Whether the value has changed.
781
+ * @internal
782
+ */
783
+ _setSelected(selected) {
784
+ if (selected === this._selected) {
785
+ return false;
786
+ }
787
+ this._selected = selected;
788
+ if (selected) {
789
+ this._selectionList.selectedOptions.select(this);
790
+ }
791
+ else {
792
+ this._selectionList.selectedOptions.deselect(this);
793
+ }
794
+ this.selectedChange.emit(selected);
795
+ this.markForCheck();
796
+ return true;
797
+ }
798
+ /**
799
+ * Toggles the option's value based on a user interaction.
800
+ * @internal
801
+ */
802
+ _toggleOnInteraction() {
803
+ if (!this.disabled) {
804
+ if (this._selectionList.multiple) {
805
+ this.selected = !this.selected;
806
+ this._selectionList._emitChangeEvent([this]);
807
+ }
808
+ else if (!this.selected) {
809
+ this.selected = true;
810
+ this._selectionList._emitChangeEvent([this]);
811
+ }
812
+ }
813
+ }
814
+ /** Sets the tabindex of the list option. */
815
+ _setTabindex(value) {
816
+ this.setAttribute('tabindex', value + '');
817
+ }
818
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListOption, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
819
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: CuteListOption, isStandalone: true, selector: "cute-list-option", inputs: { togglePosition: "togglePosition", value: "value", selected: "selected", iconSize: "iconSize" }, outputs: { selectedChange: "selectedChange" }, host: { attributes: { "role": "option" }, listeners: { "blur": "_handleBlur()", "click": "_toggleOnInteraction()" }, properties: { "class.cute-list-option-separated": "hideIndicator", "class.cute-list-item--selected": "hiddenIndicatorSelected", "class.active": "hiddenIndicatorSelected", "attr.aria-selected": "selected" }, classAttribute: "cute-list-option" }, providers: [
820
+ { provide: CuteListItemBase, useExisting: CuteListOption },
821
+ { provide: LIST_OPTION, useExisting: CuteListOption },
822
+ ], queries: [{ propertyName: "_lines", predicate: CuteListItemLine, descendants: true }, { propertyName: "_titles", predicate: CuteListItemTitle, descendants: true }], viewQueries: [{ propertyName: "_unscopedContent", first: true, predicate: ["unscopedContent"], descendants: true }], exportAs: ["cuteListOption"], usesInheritance: true, ngImport: i0, template: "<ng-template #icons>\r\n <ng-content select=\"[cuteListItemAvatar],[cuteListItemIcon]\"></ng-content>\r\n</ng-template>\r\n<ng-template #checkbox>\r\n <cute-checkbox tabIndex=\"-1\" [checked]=\"selected\" [disabled]=\"disabled\" [iconSize]=\"iconSize\" class=\"pe-none\"></cute-checkbox>\r\n</ng-template>\r\n<ng-template #radio>\r\n <cute-radio-button tabIndex=\"-1\" [checked]=\"selected\" [disabled]=\"disabled\" [iconSize]=\"iconSize\" class=\"pe-none\"></cute-radio-button>\r\n</ng-template>\r\n\r\n@if (_hasCheckboxAt('before')) {\r\n <!-- Container for the checkbox at start. -->\r\n <span class=\"cute-list-option-checkbox-before\">\r\n <ng-template [ngTemplateOutlet]=\"checkbox\"></ng-template>\r\n </span>\r\n} @else if (_hasRadioAt('before')) {\r\n <!-- Container for the radio at the start. -->\r\n <span class=\"cute-list-option-radio cute-list-option-radio-before\">\r\n <ng-template [ngTemplateOutlet]=\"radio\"></ng-template>\r\n </span>\r\n}\r\n<!-- Conditionally renders icons/avatars before the list item text. -->\r\n@if (_hasIconsOrAvatarsAt('before')) {\r\n <ng-template [ngTemplateOutlet]=\"icons\"></ng-template>\r\n}\r\n\r\n<!-- Text -->\r\n<span class=\"cute-list-item-content\">\r\n <ng-content select=\"[cuteListItemTitle]\"></ng-content>\r\n <ng-content select=\"[cuteListItemLine]\"></ng-content>\r\n <span #unscopedContent class=\"cute-list-item-content-unscoped\"\r\n (cdkObserveContent)=\"_updateItemLines(true)\">\r\n <ng-content></ng-content>\r\n </span>\r\n</span>\r\n\r\n@if (_hasCheckboxAt('after')) {\r\n <!-- Container for the checkbox at the end. -->\r\n <span class=\"cute-list-item__end\">\r\n <ng-template [ngTemplateOutlet]=\"checkbox\"></ng-template>\r\n </span>\r\n} @else if (_hasRadioAt('after')) {\r\n <!-- Container for the radio at the end. -->\r\n <span class=\"cute-list-option-radio cute-list-item__end\">\r\n <ng-template [ngTemplateOutlet]=\"radio\"></ng-template>\r\n </span>\r\n}\r\n\r\n<!-- Conditionally renders icons/avatars after the list item text. -->\r\n@if (_hasIconsOrAvatarsAt('after')) {\r\n <ng-template [ngTemplateOutlet]=\"icons\"></ng-template>\r\n}\r\n\r\n<!-- Divider -->\r\n<ng-content select=\"cute-divider\"></ng-content>\r\n\r\n<!--\r\n Strong focus indicator element. MDC uses the `::before` pseudo element for the default\r\n focus/hover/selected state, so we need a separate element.\r\n-->\r\n<!--<div class=\"cute-focus-indicator\"></div>-->\r\n", styles: [".cute-list-option{display:flex;cursor:pointer}.cute-list-option.disabled .cute-list-item-content{opacity:.5}.cute-list-option.cute-list-option-separated{border-top-width:var(--bs-list-group-border-width);border-radius:var(--bs-border-radius-lg);padding-top:1rem;padding-bottom:1rem}.cute-list-option.cute-list-option-separated[aria-selected=true]{--cute-width: calc(var(--bs-list-group-border-width) * 2)}.cute-list-option.cute-list-option-separated[aria-selected=true]:not(.active){border-color:var(--bs-primary);border-width:var(--cute-width)}.cute-list-option.cute-list-option-separated[aria-selected=true]:focus{border-color:var(--bs-primary)}.cute-list-option.cute-list-item--selected>.cute-list-option-radio{position:absolute;clip:rect(0,0,0,0)}.cute-list-option .cute-list-item-content{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cute-list-option .cute-list-item-title{font-weight:600}.cute-list-option .cute-list-item-line{color:var(--bs-secondary-color);font-size:.875em;font-weight:400;line-height:1.25rem}.cute-list-option .cute-list-item__end .form-check{display:flex;justify-content:flex-end}.cute-list-option .cute-list-item__end .form-check .form-check-input.icon-large{margin-right:auto}[dir=rtl] .cute-list-option .form-check{display:flex;justify-content:flex-start}\n"], dependencies: [{ kind: "directive", type: CdkObserveContent, selector: "[cdkObserveContent]", inputs: ["cdkObserveContentDisabled", "debounce"], outputs: ["cdkObserveContent"], exportAs: ["cdkObserveContent"] }, { kind: "component", type: CuteCheckbox, selector: "cute-checkbox, cute-slide-toggle:not([cuteToggleSwitch])", inputs: ["aria-expanded", "aria-controls", "aria-owns", "value", "valueOn", "valueOff", "inline", "checked", "indeterminate", "labelPosition", "disabledInteractive", "iconSize"], outputs: ["change", "indeterminateChange"], exportAs: ["cuteCheckbox"] }, { kind: "component", type: CuteRadioButton, selector: "cute-radio-button", inputs: ["checked", "inline", "labelPosition", "value", "disabledInteractive", "iconSize"], outputs: ["change"], exportAs: ["cuteRadioButton"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
823
+ }
824
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListOption, decorators: [{
825
+ type: Component,
826
+ args: [{ selector: 'cute-list-option', exportAs: 'cuteListOption', host: {
827
+ 'class': 'cute-list-option', // list-group-item-action',
828
+ '[class.cute-list-option-separated]': 'hideIndicator',
829
+ '[class.cute-list-item--selected]': 'hiddenIndicatorSelected',
830
+ '[class.active]': 'hiddenIndicatorSelected',
831
+ '[attr.aria-selected]': 'selected',
832
+ //'[style.cursor]': '"pointer"',
833
+ 'role': 'option',
834
+ '(blur)': '_handleBlur()',
835
+ '(click)': '_toggleOnInteraction()',
836
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
837
+ { provide: CuteListItemBase, useExisting: CuteListOption },
838
+ { provide: LIST_OPTION, useExisting: CuteListOption },
839
+ ], imports: [
840
+ CdkObserveContent,
841
+ CuteCheckbox,
842
+ CuteRadioButton,
843
+ NgTemplateOutlet
844
+ ], template: "<ng-template #icons>\r\n <ng-content select=\"[cuteListItemAvatar],[cuteListItemIcon]\"></ng-content>\r\n</ng-template>\r\n<ng-template #checkbox>\r\n <cute-checkbox tabIndex=\"-1\" [checked]=\"selected\" [disabled]=\"disabled\" [iconSize]=\"iconSize\" class=\"pe-none\"></cute-checkbox>\r\n</ng-template>\r\n<ng-template #radio>\r\n <cute-radio-button tabIndex=\"-1\" [checked]=\"selected\" [disabled]=\"disabled\" [iconSize]=\"iconSize\" class=\"pe-none\"></cute-radio-button>\r\n</ng-template>\r\n\r\n@if (_hasCheckboxAt('before')) {\r\n <!-- Container for the checkbox at start. -->\r\n <span class=\"cute-list-option-checkbox-before\">\r\n <ng-template [ngTemplateOutlet]=\"checkbox\"></ng-template>\r\n </span>\r\n} @else if (_hasRadioAt('before')) {\r\n <!-- Container for the radio at the start. -->\r\n <span class=\"cute-list-option-radio cute-list-option-radio-before\">\r\n <ng-template [ngTemplateOutlet]=\"radio\"></ng-template>\r\n </span>\r\n}\r\n<!-- Conditionally renders icons/avatars before the list item text. -->\r\n@if (_hasIconsOrAvatarsAt('before')) {\r\n <ng-template [ngTemplateOutlet]=\"icons\"></ng-template>\r\n}\r\n\r\n<!-- Text -->\r\n<span class=\"cute-list-item-content\">\r\n <ng-content select=\"[cuteListItemTitle]\"></ng-content>\r\n <ng-content select=\"[cuteListItemLine]\"></ng-content>\r\n <span #unscopedContent class=\"cute-list-item-content-unscoped\"\r\n (cdkObserveContent)=\"_updateItemLines(true)\">\r\n <ng-content></ng-content>\r\n </span>\r\n</span>\r\n\r\n@if (_hasCheckboxAt('after')) {\r\n <!-- Container for the checkbox at the end. -->\r\n <span class=\"cute-list-item__end\">\r\n <ng-template [ngTemplateOutlet]=\"checkbox\"></ng-template>\r\n </span>\r\n} @else if (_hasRadioAt('after')) {\r\n <!-- Container for the radio at the end. -->\r\n <span class=\"cute-list-option-radio cute-list-item__end\">\r\n <ng-template [ngTemplateOutlet]=\"radio\"></ng-template>\r\n </span>\r\n}\r\n\r\n<!-- Conditionally renders icons/avatars after the list item text. -->\r\n@if (_hasIconsOrAvatarsAt('after')) {\r\n <ng-template [ngTemplateOutlet]=\"icons\"></ng-template>\r\n}\r\n\r\n<!-- Divider -->\r\n<ng-content select=\"cute-divider\"></ng-content>\r\n\r\n<!--\r\n Strong focus indicator element. MDC uses the `::before` pseudo element for the default\r\n focus/hover/selected state, so we need a separate element.\r\n-->\r\n<!--<div class=\"cute-focus-indicator\"></div>-->\r\n", styles: [".cute-list-option{display:flex;cursor:pointer}.cute-list-option.disabled .cute-list-item-content{opacity:.5}.cute-list-option.cute-list-option-separated{border-top-width:var(--bs-list-group-border-width);border-radius:var(--bs-border-radius-lg);padding-top:1rem;padding-bottom:1rem}.cute-list-option.cute-list-option-separated[aria-selected=true]{--cute-width: calc(var(--bs-list-group-border-width) * 2)}.cute-list-option.cute-list-option-separated[aria-selected=true]:not(.active){border-color:var(--bs-primary);border-width:var(--cute-width)}.cute-list-option.cute-list-option-separated[aria-selected=true]:focus{border-color:var(--bs-primary)}.cute-list-option.cute-list-item--selected>.cute-list-option-radio{position:absolute;clip:rect(0,0,0,0)}.cute-list-option .cute-list-item-content{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cute-list-option .cute-list-item-title{font-weight:600}.cute-list-option .cute-list-item-line{color:var(--bs-secondary-color);font-size:.875em;font-weight:400;line-height:1.25rem}.cute-list-option .cute-list-item__end .form-check{display:flex;justify-content:flex-end}.cute-list-option .cute-list-item__end .form-check .form-check-input.icon-large{margin-right:auto}[dir=rtl] .cute-list-option .form-check{display:flex;justify-content:flex-start}\n"] }]
845
+ }], propDecorators: { _lines: [{
846
+ type: ContentChildren,
847
+ args: [CuteListItemLine, { descendants: true }]
848
+ }], _titles: [{
849
+ type: ContentChildren,
850
+ args: [CuteListItemTitle, { descendants: true }]
851
+ }], _unscopedContent: [{
852
+ type: ViewChild,
853
+ args: ['unscopedContent']
854
+ }], selectedChange: [{
855
+ type: Output
856
+ }], togglePosition: [{
857
+ type: Input
858
+ }], value: [{
859
+ type: Input
860
+ }], selected: [{
861
+ type: Input
862
+ }], iconSize: [{
863
+ type: Input
864
+ }] } });
865
+
866
+ /**
867
+ * @license Apache-2.0
868
+ *
869
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
870
+ *
871
+ * You may not use this file except in compliance with the License
872
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
873
+ */
874
+ /**
875
+ * An item within a listbox.
876
+ *
877
+ * @experimental
878
+ */
879
+ class CuteListBoxOption extends CuteListItem {
880
+ /** The value of this option */
881
+ get value() { return this.cdkOption.value; }
882
+ set value(v) { this.cdkOption.value = v; }
883
+ /** Whether the option is selected or not. */
884
+ get selected() {
885
+ return this.cdkOption.isSelected();
886
+ }
887
+ constructor(listBox) {
888
+ super(listBox);
889
+ this.listBox = listBox;
890
+ this.cdkOption = inject(CdkOption);
891
+ this.role = "option";
892
+ }
893
+ /** Sets focus to this option */
894
+ focus() {
895
+ this.cdkOption.focus();
896
+ }
897
+ /** Gets the option's label that is part of the `FocusableOption` interface */
898
+ getLabel() {
899
+ return this.cdkOption.getLabel();
900
+ }
901
+ /** Whether this option is active */
902
+ isActive() {
903
+ return this.cdkOption.isActive();
904
+ }
905
+ /** Select this option if it is not selected */
906
+ select() {
907
+ this.cdkOption.select();
908
+ }
909
+ /** Deselect this option if it is selected */
910
+ deselect() {
911
+ this.cdkOption.deselect();
912
+ }
913
+ /** Toggle the selected state of this option */
914
+ toggle() {
915
+ this.cdkOption.toggle();
916
+ }
917
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListBoxOption, deps: [{ token: CuteListBox }], target: i0.ɵɵFactoryTarget.Component }); }
918
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: CuteListBoxOption, isStandalone: true, selector: "cute-listbox-option, a[cute-listbox-option], button[cute-listbox-option]", inputs: { value: "value" }, host: { properties: { "class.active": "selected", "class.disabled": "disabled", "attr.aria-disabled": "disabled", "attr.aria-selected": "selected", "attr.aria-current": "_getAriaCurrent()", "attr.role": "role", "attr.tabindex": "-1" }, classAttribute: "cute-listbox-option" }, exportAs: ["cuteListboxOption"], usesInheritance: true, hostDirectives: [{ directive: i2.CdkOption, inputs: ["cdkOption", "value", "cdkOptionTypeaheadLabel", "typeaheadLabel", "cdkOptionDisabled", "disabled", "tabindex", "tabindex", "id", "id"] }], ngImport: i0, template: "<ng-content select=\"[cuteListItemAvatar],[cuteListItemIcon]\"></ng-content>\r\n\r\n<span class=\"cute-list-item-content\">\r\n <ng-content select=\"[cuteListItemTitle]\"></ng-content>\r\n <ng-content select=\"[cuteListItemLine]\"></ng-content>\r\n <span #unscopedContent class=\"cute-list-item-content-unscoped\"\r\n (cdkObserveContent)=\"_updateItemLines(true)\">\r\n <ng-content></ng-content>\r\n </span>\r\n </span>\r\n\r\n<ng-content select=\"[cuteListItemMeta]\"></ng-content>\r\n\r\n<ng-content select=\"cute-divider\"></ng-content>\r\n\r\n<!--\r\n Strong focus indicator element. MDC uses the `::before` pseudo element for the default\r\n focus/hover/selected state, so we need a separate element.\r\n-->\r\n<!--<div class=\"cute-focus-indicator\"></div>-->\r\n", dependencies: [{ kind: "ngmodule", type: CdkListboxModule }, { kind: "directive", type: CdkObserveContent, selector: "[cdkObserveContent]", inputs: ["cdkObserveContentDisabled", "debounce"], outputs: ["cdkObserveContent"], exportAs: ["cdkObserveContent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
919
+ }
920
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListBoxOption, decorators: [{
921
+ type: Component,
922
+ args: [{ selector: 'cute-listbox-option, a[cute-listbox-option], button[cute-listbox-option]', exportAs: 'cuteListboxOption', host: {
923
+ 'class': 'cute-listbox-option',
924
+ '[class.active]': 'selected',
925
+ '[class.disabled]': 'disabled',
926
+ '[attr.aria-disabled]': 'disabled',
927
+ '[attr.aria-selected]': 'selected',
928
+ '[attr.aria-current]': '_getAriaCurrent()',
929
+ '[attr.role]': 'role',
930
+ '[attr.tabindex]': '-1',
931
+ }, imports: [CdkListboxModule, CdkObserveContent], hostDirectives: [
932
+ {
933
+ directive: CdkOption,
934
+ inputs: [
935
+ 'cdkOption: value',
936
+ 'cdkOptionTypeaheadLabel: typeaheadLabel',
937
+ 'cdkOptionDisabled: disabled',
938
+ 'tabindex',
939
+ 'id',
940
+ ],
941
+ outputs: [],
942
+ }
943
+ ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content select=\"[cuteListItemAvatar],[cuteListItemIcon]\"></ng-content>\r\n\r\n<span class=\"cute-list-item-content\">\r\n <ng-content select=\"[cuteListItemTitle]\"></ng-content>\r\n <ng-content select=\"[cuteListItemLine]\"></ng-content>\r\n <span #unscopedContent class=\"cute-list-item-content-unscoped\"\r\n (cdkObserveContent)=\"_updateItemLines(true)\">\r\n <ng-content></ng-content>\r\n </span>\r\n </span>\r\n\r\n<ng-content select=\"[cuteListItemMeta]\"></ng-content>\r\n\r\n<ng-content select=\"cute-divider\"></ng-content>\r\n\r\n<!--\r\n Strong focus indicator element. MDC uses the `::before` pseudo element for the default\r\n focus/hover/selected state, so we need a separate element.\r\n-->\r\n<!--<div class=\"cute-focus-indicator\"></div>-->\r\n" }]
944
+ }], ctorParameters: () => [{ type: CuteListBox }], propDecorators: { value: [{
945
+ type: Input
946
+ }] } });
947
+
948
+ /**
949
+ * @license Apache-2.0
950
+ *
951
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
952
+ *
953
+ * You may not use this file except in compliance with the License
954
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
955
+ */
956
+ /**
957
+ * Injection token that can be used to inject instances of `CuteListBox`. It serves as
958
+ * an alternative token to the actual `CuteListBox` class which could cause unnecessary
959
+ * retention of the class and its component metadata.
960
+ */
961
+ const CUTE_LISTBOX = new InjectionToken('CuteListBox');
962
+ /**
963
+ * A component that displays a list of options for users to select from, supporting keyboard navigation,
964
+ * single or multiple selection, and screen reader support.
965
+ *
966
+ * @experimental
967
+ */
968
+ class CuteListBox extends CuteListBase {
969
+ constructor() {
970
+ super();
971
+ this.cdkListbox = inject(CdkListbox);
972
+ this.role = "listbox";
973
+ this._isNonInteractive = false;
974
+ }
975
+ /** Deselect the given option */
976
+ deselect(option) {
977
+ this.cdkListbox.deselect(option);
978
+ }
979
+ /** Deselect the given value */
980
+ deselectValue(value) {
981
+ this.cdkListbox.deselectValue(value);
982
+ }
983
+ /** Focus the list-box's host element */
984
+ focus() {
985
+ this.cdkListbox.focus();
986
+ }
987
+ /** Get whether the given option is active. */
988
+ isActive(option) {
989
+ return this.cdkListbox.isActive(option);
990
+ }
991
+ /** Get whether the given option is selected. */
992
+ isSelected(option) {
993
+ return this.cdkListbox.isSelected(option);
994
+ }
995
+ /** Get whether the given value is selected. */
996
+ isValueSelected(value) {
997
+ return this.cdkListbox.isValueSelected(value);
998
+ }
999
+ /** Select the given option. */
1000
+ select(option) {
1001
+ this.cdkListbox.select(option);
1002
+ }
1003
+ /** Select the given value. */
1004
+ selectValue(value) {
1005
+ this.cdkListbox.selectValue(value);
1006
+ }
1007
+ /** Set the selected state of all options. */
1008
+ setAllSelected(isSelected) {
1009
+ this.cdkListbox.setAllSelected(isSelected);
1010
+ }
1011
+ /** Toggle the selected state of the given option. */
1012
+ toggle(option) {
1013
+ this.cdkListbox.toggle(option);
1014
+ }
1015
+ /** Toggle the selected state of the given value. */
1016
+ toggleValue(value) {
1017
+ this.cdkListbox.toggleValue(value);
1018
+ }
1019
+ registerOnChange(fn) {
1020
+ this.cdkListbox.registerOnChange(fn);
1021
+ }
1022
+ registerOnTouched(fn) {
1023
+ this.cdkListbox.registerOnTouched(fn);
1024
+ }
1025
+ writeValue(obj) {
1026
+ this.cdkListbox.writeValue(obj);
1027
+ }
1028
+ setDisabledState(newState) {
1029
+ if (super.setDisabledState(newState)) {
1030
+ this.cdkListbox.setDisabledState(newState);
1031
+ return true;
1032
+ }
1033
+ return false;
1034
+ }
1035
+ _handleKeydown(event) {
1036
+ this._keyManager?.onKeydown(event);
1037
+ }
1038
+ ngAfterContentInit() {
1039
+ super.ngAfterContentInit();
1040
+ if (this._options) {
1041
+ this._keyManager = new ListKeyManager(this._options);
1042
+ this._keyManager
1043
+ .withVerticalOrientation()
1044
+ .withHomeAndEnd()
1045
+ .withPageUpDown()
1046
+ .withWrap()
1047
+ .withTypeAhead()
1048
+ .skipPredicate(item => item.disabled);
1049
+ }
1050
+ }
1051
+ ngOnDestroy() {
1052
+ super.ngOnDestroy();
1053
+ this._keyManager?.destroy();
1054
+ }
1055
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListBox, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1056
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: CuteListBox, isStandalone: true, selector: "cute-listbox", host: { listeners: { "keydown": "_handleKeydown($event)" }, properties: { "attr.aria-multiselectable": "cdkListbox.multiple", "attr.aria-orientation": "cdkListbox.orientation", "attr.role": "role" } }, providers: [{ provide: CuteListBase, useExisting: CuteListBox }], queries: [{ propertyName: "_options", predicate: CuteListBoxOption, descendants: true }], exportAs: ["cuteListBox"], usesInheritance: true, hostDirectives: [{ directive: i2.CdkListbox, inputs: ["id", "id", "tabindex", "tabindex", "cdkListboxMultiple", "multiple", "cdkListboxValue", "value", "cdkListboxDisabled", "disabled", "cdkListboxUseActiveDescendant", "useActiveDescendant", "cdkListboxOrientation", "orientation", "cdkListboxNavigationWrapDisabled", "navigationWrapDisabled", "cdkListboxCompareWith", "compareWith", "cdkListboxNavigatesDisabledOptions", "navigatesDisabledOptions"], outputs: ["cdkListboxValueChange", "valueChange"] }], ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [".cute-list-base{overflow-y:auto;width:100%}.cute-list-base .cute-list-item-title,.cute-list-base .cute-list-item-line{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cute-list-base .cute-list-group__subheader{padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x)}.cute-list-base.list-group-numbered>.list-group-item:before{width:1em}.cute-list-base.list-group-flush[flushborders=full]{border:none;border-radius:var(--bs-border-radius)}.cute-list-base.list-group-flush[flushborders=full].cute-thematic-widget .list-group-item{background-color:initial!important}.cute-list-base.list-group-flush[flushborders=full] .list-group-item{border:none;border-radius:var(--bs-border-radius)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:not(.active):hover{background-color:var(--bs-secondary-bg)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:active:hover{background-color:var(--bs-secondary-bg-subtle)}\n"], dependencies: [{ kind: "ngmodule", type: CdkListboxModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1057
+ }
1058
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListBox, decorators: [{
1059
+ type: Component,
1060
+ args: [{ selector: 'cute-listbox', template: '<ng-content></ng-content>', exportAs: 'cuteListBox', host: {
1061
+ '[attr.aria-multiselectable]': 'cdkListbox.multiple',
1062
+ '[attr.aria-orientation]': 'cdkListbox.orientation',
1063
+ '[attr.role]': 'role',
1064
+ '(keydown)': '_handleKeydown($event)',
1065
+ }, imports: [CdkListboxModule], hostDirectives: [
1066
+ { directive: CdkListbox,
1067
+ inputs: [
1068
+ 'id',
1069
+ 'tabindex',
1070
+ 'cdkListboxMultiple: multiple',
1071
+ 'cdkListboxValue: value',
1072
+ 'cdkListboxDisabled: disabled',
1073
+ 'cdkListboxUseActiveDescendant: useActiveDescendant',
1074
+ 'cdkListboxOrientation: orientation',
1075
+ 'cdkListboxNavigationWrapDisabled: navigationWrapDisabled',
1076
+ 'cdkListboxCompareWith: compareWith',
1077
+ 'cdkListboxNavigatesDisabledOptions: navigatesDisabledOptions'
1078
+ ],
1079
+ outputs: ['cdkListboxValueChange: valueChange']
1080
+ }
1081
+ ], providers: [{ provide: CuteListBase, useExisting: CuteListBox }], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".cute-list-base{overflow-y:auto;width:100%}.cute-list-base .cute-list-item-title,.cute-list-base .cute-list-item-line{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cute-list-base .cute-list-group__subheader{padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x)}.cute-list-base.list-group-numbered>.list-group-item:before{width:1em}.cute-list-base.list-group-flush[flushborders=full]{border:none;border-radius:var(--bs-border-radius)}.cute-list-base.list-group-flush[flushborders=full].cute-thematic-widget .list-group-item{background-color:initial!important}.cute-list-base.list-group-flush[flushborders=full] .list-group-item{border:none;border-radius:var(--bs-border-radius)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:not(.active):hover{background-color:var(--bs-secondary-bg)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:active:hover{background-color:var(--bs-secondary-bg-subtle)}\n"] }]
1082
+ }], ctorParameters: () => [], propDecorators: { _options: [{
1083
+ type: ContentChildren,
1084
+ args: [CuteListBoxOption, { descendants: true }]
1085
+ }] } });
1086
+
1087
+ /**
1088
+ * @license Apache-2.0
1089
+ *
1090
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
1091
+ *
1092
+ * You may not use this file except in compliance with the License
1093
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
1094
+ *
1095
+ * This code is a modification of the `@angular/material` original
1096
+ * code licensed under MIT-style License (https://angular.dev/license).
1097
+ */
1098
+ const CUTE_SELECTION_LIST_VALUE_ACCESSOR = {
1099
+ provide: NG_VALUE_ACCESSOR,
1100
+ useExisting: forwardRef(() => CuteSelectionList),
1101
+ multi: true,
1102
+ };
1103
+ /** Change event that is being fired whenever the selected state of an option changes. */
1104
+ class CuteSelectionListChange {
1105
+ constructor(
1106
+ /** Reference to the selection list that emitted the event. */
1107
+ source,
1108
+ /** Reference to the options that have been changed. */
1109
+ options) {
1110
+ this.source = source;
1111
+ this.options = options;
1112
+ }
1113
+ }
1114
+ class CuteSelectionList extends CuteListBase {
1115
+ /** Whether selection is limited to one or multiple items (default multiple). */
1116
+ get multiple() { return this._multiple; }
1117
+ set multiple(value) {
1118
+ const newValue = coerceBooleanProperty(value);
1119
+ if (newValue !== this._multiple) {
1120
+ if (isDevMode() && this._initialized) {
1121
+ throw new Error('Cannot change `multiple` mode of cute-selection-list after initialization.');
1122
+ }
1123
+ this._multiple = newValue;
1124
+ this.selectedOptions = new SelectionModel(this._multiple, this.selectedOptions.selected);
1125
+ }
1126
+ }
1127
+ /** Whether radio indicator for all list items is hidden. */
1128
+ get hideSingleSelectionIndicator() { return this._hideSingleSelectionIndicator; }
1129
+ set hideSingleSelectionIndicator(value) {
1130
+ this._hideSingleSelectionIndicator = coerceBooleanProperty(value);
1131
+ }
1132
+ constructor() {
1133
+ super();
1134
+ this._element = inject(ElementRef);
1135
+ this._ngZone = inject(NgZone);
1136
+ this._initialized = false;
1137
+ /** Subject that emits when the component has been destroyed. */
1138
+ this._destroyed = new Subject();
1139
+ /** Whether the list has been destroyed. */
1140
+ this._isDestroyed = false;
1141
+ /** View to model callback that should be called whenever the selected options change. */
1142
+ this._onChange = (_) => { };
1143
+ /** Emits a change event whenever the selected state of an option changes. */
1144
+ this.selectionChange = new EventEmitter();
1145
+ /**
1146
+ * Function used for comparing an option against the selected value when determining which
1147
+ * options should appear as selected. The first argument is the value of an options. The second
1148
+ * one is a value from the selected value. A boolean must be returned.
1149
+ */
1150
+ this.compareWith = (a1, a2) => a1 === a2;
1151
+ this._multiple = true;
1152
+ this._hideSingleSelectionIndicator = this._defaultOptions?.hideSingleSelectionIndicator ?? false;
1153
+ /** The currently selected options. */
1154
+ this.selectedOptions = new SelectionModel(this._multiple);
1155
+ /** Keeps track of the currently selected value. */
1156
+ this._value = null;
1157
+ /** View to model callback that should be called if the list or its options lost focus. */
1158
+ this._onTouched = () => { };
1159
+ this._selectionListDisabled = signal(false, ...(ngDevMode ? [{ debugName: "_selectionListDisabled" }] : []));
1160
+ /** Handles focusout events within the list. */
1161
+ this._handleFocusout = () => {
1162
+ // Focus takes a while to update, so we have to wrap our call in a timeout.
1163
+ setTimeout(() => {
1164
+ if (!this._containsFocus()) {
1165
+ this._resetActiveOption();
1166
+ }
1167
+ });
1168
+ };
1169
+ /** Handles focusin events within the list. */
1170
+ this._handleFocusin = (event) => {
1171
+ if (this.disabled) {
1172
+ return;
1173
+ }
1174
+ const activeIndex = this._items?.toArray()
1175
+ .findIndex(item => item.contains(event.target)) ?? -1;
1176
+ if (activeIndex > -1) {
1177
+ this._setActiveOption(activeIndex);
1178
+ }
1179
+ else {
1180
+ this._resetActiveOption();
1181
+ }
1182
+ };
1183
+ this._isNonInteractive = false;
1184
+ //this.color = "primary";
1185
+ }
1186
+ ngAfterViewInit() {
1187
+ super.ngAfterViewInit();
1188
+ // Mark the selection list as initialized so that the `multiple`
1189
+ // binding can no longer be changed.
1190
+ this._initialized = true;
1191
+ this._setupRovingTabindex();
1192
+ // These events are bound outside the zone, because they don't change
1193
+ // any change-detected properties, and they can trigger timeouts.
1194
+ this._ngZone.runOutsideAngular(() => {
1195
+ this._listenerCleanups = [
1196
+ this._renderer.listen(this._element.nativeElement, 'focusin', this._handleFocusin),
1197
+ this._renderer.listen(this._element.nativeElement, 'focusout', this._handleFocusout),
1198
+ ];
1199
+ });
1200
+ if (this._value) {
1201
+ this._setOptionsFromValues(this._value);
1202
+ }
1203
+ this._watchForSelectionChange();
1204
+ }
1205
+ ngOnChanges(changes) {
1206
+ super.ngOnChanges(changes);
1207
+ const disabledChanges = changes['disabled'];
1208
+ const disableRippleChanges = changes['disableRipple'];
1209
+ const hideSingleSelectionIndicatorChanges = changes['hideSingleSelectionIndicator'];
1210
+ if ((disableRippleChanges && !disableRippleChanges.firstChange) ||
1211
+ (disabledChanges && !disabledChanges.firstChange) ||
1212
+ (hideSingleSelectionIndicatorChanges && !hideSingleSelectionIndicatorChanges.firstChange)) {
1213
+ this._markOptionsForCheck();
1214
+ }
1215
+ }
1216
+ ngOnDestroy() {
1217
+ super.ngOnDestroy();
1218
+ this._keyManager?.destroy();
1219
+ this._listenerCleanups?.forEach(current => current());
1220
+ this._destroyed.next();
1221
+ this._destroyed.complete();
1222
+ this._isDestroyed = true;
1223
+ }
1224
+ /** Selects all the options. Returns the options that changed as a result. */
1225
+ selectAll() {
1226
+ return this._setAllOptionsSelected(true);
1227
+ }
1228
+ /** Deselects all the options. Returns the options that changed as a result. */
1229
+ deselectAll() {
1230
+ return this._setAllOptionsSelected(false);
1231
+ }
1232
+ /** Reports a value change to the ControlValueAccessor */
1233
+ _reportValueChange() {
1234
+ // Stop reporting value changes after the list has been destroyed. This avoids
1235
+ // cases where the list might wrongly reset its value once it is removed, but
1236
+ // the form of control is still live.
1237
+ if (this.options && !this._isDestroyed) {
1238
+ const value = this._getSelectedOptionValues();
1239
+ this._onChange(value);
1240
+ this._value = value;
1241
+ }
1242
+ }
1243
+ /** Emits a change event if the selected state of an option changed. */
1244
+ _emitChangeEvent(options) {
1245
+ this.selectionChange.emit(new CuteSelectionListChange(this, options));
1246
+ }
1247
+ /** Implemented as part of ControlValueAccessor. */
1248
+ writeValue(values) {
1249
+ this._value = values;
1250
+ if (this.options) {
1251
+ this._setOptionsFromValues(values || []);
1252
+ }
1253
+ }
1254
+ /**
1255
+ * Whether the *entire* selection list is disabled. When true, each list item is also disabled,
1256
+ * and each list item is removed from the tab order (has tabindex="-1").
1257
+ */
1258
+ getDisabledState() { return this._selectionListDisabled(); }
1259
+ /** Implemented as a part of ControlValueAccessor. */
1260
+ setDisabledState(value) {
1261
+ // Update the disabled state of this list. Write to `this._selectionListDisabled` instead of
1262
+ // `super.disabled`. That is to avoid closure compiler compatibility issues with assigning to
1263
+ // a super property.
1264
+ this._selectionListDisabled.set(coerceBooleanProperty(value));
1265
+ if (this._selectionListDisabled()) {
1266
+ this._keyManager?.setActiveItem(-1);
1267
+ }
1268
+ return true;
1269
+ }
1270
+ /** Implemented as part of ControlValueAccessor. */
1271
+ registerOnChange(fn) {
1272
+ this._onChange = fn;
1273
+ }
1274
+ /** Implemented as part of ControlValueAccessor. */
1275
+ registerOnTouched(fn) {
1276
+ this._onTouched = fn;
1277
+ }
1278
+ /** Watches for changes in the selected state of the options and updates the list accordingly. */
1279
+ _watchForSelectionChange() {
1280
+ this.selectedOptions.changed.pipe(takeUntil(this._destroyed)).subscribe(event => {
1281
+ // Sync external changes to the model back to the options.
1282
+ for (let item of event.added) {
1283
+ item.selected = true;
1284
+ }
1285
+ for (let item of event.removed) {
1286
+ item.selected = false;
1287
+ }
1288
+ if (!this._containsFocus()) {
1289
+ this._resetActiveOption();
1290
+ }
1291
+ });
1292
+ }
1293
+ /** Sets the selected options based on the specified values. */
1294
+ _setOptionsFromValues(values) {
1295
+ this.options?.forEach(option => option._setSelected(false));
1296
+ values.forEach(value => {
1297
+ const correspondingOption = this.options?.find(option => {
1298
+ // Skip options that are already in the model. This allows us to handle cases
1299
+ // where the same primitive value is selected multiple times.
1300
+ return option.selected ? false : this.compareWith(option.value, value);
1301
+ });
1302
+ if (correspondingOption) {
1303
+ correspondingOption._setSelected(true);
1304
+ }
1305
+ });
1306
+ }
1307
+ /** Returns the values of the selected options. */
1308
+ _getSelectedOptionValues() {
1309
+ return this.options?.filter(option => option.selected).map(option => option.value) ?? [];
1310
+ }
1311
+ /** Marks all the options to be checked in the next change detection run. */
1312
+ _markOptionsForCheck() {
1313
+ if (this.options) {
1314
+ this.options.forEach(option => option.markForCheck());
1315
+ }
1316
+ }
1317
+ /**
1318
+ * Sets the selected state on all the options
1319
+ * and emits an event if anything changed.
1320
+ */
1321
+ _setAllOptionsSelected(isSelected, skipDisabled) {
1322
+ // Keep track of whether anything changed, because we only want to
1323
+ // emit the changed event when something actually changed.
1324
+ const changedOptions = [];
1325
+ this.options?.forEach(option => {
1326
+ if ((!skipDisabled || !option.disabled) && option._setSelected(isSelected)) {
1327
+ changedOptions.push(option);
1328
+ }
1329
+ });
1330
+ if (changedOptions.length) {
1331
+ this._reportValueChange();
1332
+ }
1333
+ return changedOptions;
1334
+ }
1335
+ // Note: This getter exists for backwards compatibility. The `_items` query list
1336
+ // cannot be named `options` as it will be picked up by the interactive list base.
1337
+ /** The option components contained within this selection-list. */
1338
+ get options() {
1339
+ return this._items;
1340
+ }
1341
+ /** Handles keydown events within the list. */
1342
+ _handleKeydown(event) {
1343
+ const activeItem = this._keyManager?.activeItem;
1344
+ if ((event.code === "Enter" || event.code === "Space") &&
1345
+ !this._keyManager?.isTyping() &&
1346
+ activeItem &&
1347
+ !activeItem.disabled) {
1348
+ event.preventDefault();
1349
+ activeItem._toggleOnInteraction();
1350
+ }
1351
+ else if (event.code === "KeyA" &&
1352
+ this.multiple &&
1353
+ !this._keyManager?.isTyping() &&
1354
+ hasModifierKey(event, 'ctrlKey')) {
1355
+ const shouldSelect = this.options?.some(option => !option.disabled && !option.selected) || false;
1356
+ event.preventDefault();
1357
+ this._emitChangeEvent(this._setAllOptionsSelected(shouldSelect, true));
1358
+ }
1359
+ else {
1360
+ this._keyManager?.onKeydown(event);
1361
+ }
1362
+ }
1363
+ /**
1364
+ * Sets up the logic for maintaining the roving tabindex.
1365
+ *
1366
+ * `skipPredicate` determines if key manager should avoid putting a given list item in the tab
1367
+ * index. Allow disabled list items to receive focus to align with WAI ARIA recommendation.
1368
+ * Normally WAI ARIA's instructions are to exclude disabled items from the tab order, but it
1369
+ * makes a few exceptions for compound widgets.
1370
+ *
1371
+ * From [Developing a Keyboard Interface](
1372
+ * https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/):
1373
+ * "For the following composite widget elements, keep them focusable when disabled: Options in a
1374
+ * Listbox..."
1375
+ */
1376
+ _setupRovingTabindex() {
1377
+ if (this._items) {
1378
+ this._keyManager = new FocusKeyManager(this._items)
1379
+ .withHomeAndEnd()
1380
+ .withTypeAhead()
1381
+ .withWrap()
1382
+ .skipPredicate((item) => item.disabled || this.disabled);
1383
+ // Set the initial focus.
1384
+ this._resetActiveOption();
1385
+ // Move the tabindex to the currently focused list item.
1386
+ this._keyManager.change.subscribe(activeItemIndex => this._setActiveOption(activeItemIndex));
1387
+ // If the active item is removed from the list, reset back to the first one.
1388
+ this._items.changes.pipe(takeUntil(this._destroyed)).subscribe(() => {
1389
+ const activeItem = this._keyManager.activeItem;
1390
+ if (!activeItem || !this._items?.toArray().indexOf(activeItem)) {
1391
+ this._resetActiveOption();
1392
+ }
1393
+ });
1394
+ }
1395
+ }
1396
+ /**
1397
+ * Sets an option as active.
1398
+ * @param index Index of the active option. If set to -1, no option will be active.
1399
+ */
1400
+ _setActiveOption(index) {
1401
+ this._items?.forEach((item, itemIndex) => item._setTabindex(itemIndex === index ? 0 : -1));
1402
+ this._keyManager?.updateActiveItem(index);
1403
+ }
1404
+ /**
1405
+ * Resets the active option. When the list is disabled, remove all options from to the tab order.
1406
+ * Otherwise, focus on the first selected option.
1407
+ */
1408
+ _resetActiveOption() {
1409
+ if (this.disabled) {
1410
+ this._setActiveOption(-1);
1411
+ return;
1412
+ }
1413
+ if (!this._items) {
1414
+ return;
1415
+ }
1416
+ const activeItem = this._items.find(item => item.selected && !item.disabled) || this._items.first;
1417
+ this._setActiveOption(activeItem ? this._items.toArray().indexOf(activeItem) : -1);
1418
+ }
1419
+ /** Returns whether the focus is currently within the list. */
1420
+ _containsFocus() {
1421
+ const activeElement = _getFocusedElementPierceShadowDom();
1422
+ return activeElement && this._element.nativeElement.contains(activeElement);
1423
+ }
1424
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteSelectionList, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1425
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: CuteSelectionList, isStandalone: true, selector: "cute-selection-list", inputs: { compareWith: "compareWith", multiple: "multiple", hideSingleSelectionIndicator: "hideSingleSelectionIndicator" }, outputs: { selectionChange: "selectionChange" }, host: { attributes: { "role": "listbox" }, listeners: { "keydown": "_handleKeydown($event)" }, properties: { "class.gap-2": "!multiple && hideSingleSelectionIndicator", "attr.aria-multiselectable": "multiple" }, classAttribute: "cute-selection-list" }, providers: [
1426
+ CUTE_SELECTION_LIST_VALUE_ACCESSOR,
1427
+ { provide: CuteListBase, useExisting: CuteSelectionList },
1428
+ { provide: SELECTION_LIST, useExisting: CuteSelectionList },
1429
+ ], queries: [{ propertyName: "_items", predicate: CuteListOption, descendants: true }], exportAs: ["cuteSelectionList"], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [".cute-list-base{overflow-y:auto;width:100%}.cute-list-base .cute-list-item-title,.cute-list-base .cute-list-item-line{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cute-list-base .cute-list-group__subheader{padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x)}.cute-list-base.list-group-numbered>.list-group-item:before{width:1em}.cute-list-base.list-group-flush[flushborders=full]{border:none;border-radius:var(--bs-border-radius)}.cute-list-base.list-group-flush[flushborders=full].cute-thematic-widget .list-group-item{background-color:initial!important}.cute-list-base.list-group-flush[flushborders=full] .list-group-item{border:none;border-radius:var(--bs-border-radius)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:not(.active):hover{background-color:var(--bs-secondary-bg)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:active:hover{background-color:var(--bs-secondary-bg-subtle)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1430
+ }
1431
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteSelectionList, decorators: [{
1432
+ type: Component,
1433
+ args: [{ selector: 'cute-selection-list', template: '<ng-content></ng-content>', exportAs: 'cuteSelectionList', host: {
1434
+ 'class': 'cute-selection-list',
1435
+ '[class.gap-2]': '!multiple && hideSingleSelectionIndicator',
1436
+ 'role': 'listbox',
1437
+ '[attr.aria-multiselectable]': 'multiple',
1438
+ '(keydown)': '_handleKeydown($event)',
1439
+ }, providers: [
1440
+ CUTE_SELECTION_LIST_VALUE_ACCESSOR,
1441
+ { provide: CuteListBase, useExisting: CuteSelectionList },
1442
+ { provide: SELECTION_LIST, useExisting: CuteSelectionList },
1443
+ ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, styles: [".cute-list-base{overflow-y:auto;width:100%}.cute-list-base .cute-list-item-title,.cute-list-base .cute-list-item-line{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cute-list-base .cute-list-group__subheader{padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x)}.cute-list-base.list-group-numbered>.list-group-item:before{width:1em}.cute-list-base.list-group-flush[flushborders=full]{border:none;border-radius:var(--bs-border-radius)}.cute-list-base.list-group-flush[flushborders=full].cute-thematic-widget .list-group-item{background-color:initial!important}.cute-list-base.list-group-flush[flushborders=full] .list-group-item{border:none;border-radius:var(--bs-border-radius)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:not(.active):hover{background-color:var(--bs-secondary-bg)}.cute-list-interactive .cute-list-base.list-group-flush[flushborders=full] .list-group-item:active:hover{background-color:var(--bs-secondary-bg-subtle)}\n"] }]
1444
+ }], ctorParameters: () => [], propDecorators: { _items: [{
1445
+ type: ContentChildren,
1446
+ args: [CuteListOption, { descendants: true }]
1447
+ }], selectionChange: [{
1448
+ type: Output
1449
+ }], compareWith: [{
1450
+ type: Input
1451
+ }], multiple: [{
1452
+ type: Input
1453
+ }], hideSingleSelectionIndicator: [{
1454
+ type: Input
1455
+ }] } });
1456
+
1457
+ /**
1458
+ * @license Apache-2.0
1459
+ *
1460
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
1461
+ *
1462
+ * You may not use this file except in compliance with the License
1463
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
1464
+ *
1465
+ * This code is a modification of the `@angular/material` original
1466
+ * code licensed under MIT-style License (https://angular.dev/license).
1467
+ */
1468
+ /**
1469
+ * Directive whose purpose is to add the `cute-` CSS styling to this selector.
1470
+ */
1471
+ class CuteListSubheaderCssStyler {
1472
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListSubheaderCssStyler, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1473
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: CuteListSubheaderCssStyler, isStandalone: true, selector: "[cute-subheader], [cuteSubheader]", host: { classAttribute: "cute-subheader cute-list-group__subheader" }, ngImport: i0 }); }
1474
+ }
1475
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListSubheaderCssStyler, decorators: [{
1476
+ type: Directive,
1477
+ args: [{
1478
+ selector: '[cute-subheader], [cuteSubheader]',
1479
+ // TODO(mmalerba): MDC's subheader font looks identical to the list item font, figure out why and
1480
+ // make a change in one of the repos to visually distinguish.
1481
+ host: { 'class': 'cute-subheader cute-list-group__subheader' },
1482
+ standalone: true,
1483
+ }]
1484
+ }] });
1485
+
1486
+ /**
1487
+ * @license Apache-2.0
1488
+ *
1489
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
1490
+ *
1491
+ * You may not use this file except in compliance with the License
1492
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
1493
+ */
1494
+ const TYPES = [
1495
+ CuteActionList,
1496
+ CuteList,
1497
+ CuteListItem,
1498
+ CuteListItemLine,
1499
+ CuteListItemTitle,
1500
+ CuteListItemMeta,
1501
+ CuteListItemAvatar,
1502
+ CuteListItemIcon,
1503
+ CuteListOption,
1504
+ CuteListSubheaderCssStyler,
1505
+ CuteListBox,
1506
+ CuteListBoxOption,
1507
+ CuteNavList,
1508
+ CuteSelectionList,
1509
+ ];
1510
+ class CuteListModule {
1511
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1512
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: CuteListModule, imports: [CommonModule, CuteActionList,
1513
+ CuteList,
1514
+ CuteListItem,
1515
+ CuteListItemLine,
1516
+ CuteListItemTitle,
1517
+ CuteListItemMeta,
1518
+ CuteListItemAvatar,
1519
+ CuteListItemIcon,
1520
+ CuteListOption,
1521
+ CuteListSubheaderCssStyler,
1522
+ CuteListBox,
1523
+ CuteListBoxOption,
1524
+ CuteNavList,
1525
+ CuteSelectionList], exports: [CuteActionList,
1526
+ CuteList,
1527
+ CuteListItem,
1528
+ CuteListItemLine,
1529
+ CuteListItemTitle,
1530
+ CuteListItemMeta,
1531
+ CuteListItemAvatar,
1532
+ CuteListItemIcon,
1533
+ CuteListOption,
1534
+ CuteListSubheaderCssStyler,
1535
+ CuteListBox,
1536
+ CuteListBoxOption,
1537
+ CuteNavList,
1538
+ CuteSelectionList] }); }
1539
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListModule, imports: [CommonModule, CuteListOption,
1540
+ CuteListBox,
1541
+ CuteListBoxOption] }); }
1542
+ }
1543
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteListModule, decorators: [{
1544
+ type: NgModule,
1545
+ args: [{
1546
+ declarations: [],
1547
+ imports: [CommonModule, ...TYPES],
1548
+ exports: [...TYPES]
1549
+ }]
1550
+ }] });
1551
+
1552
+ /**
1553
+ * Generated bundle index. Do not edit.
1554
+ */
1555
+
1556
+ export { CUTE_LIST, CUTE_LISTBOX, CUTE_LIST_CONFIG, CUTE_NAV_LIST, CUTE_SELECTION_LIST_VALUE_ACCESSOR, CuteActionList, CuteList, CuteListBase, CuteListBox, CuteListBoxOption, CuteListItem, CuteListItemAvatar, CuteListItemIcon, CuteListItemLine, CuteListItemMeta, CuteListItemTitle, CuteListModule, CuteListOption, CuteListSubheaderCssStyler, CuteNavList, CuteSelectionList, CuteSelectionListChange, SELECTION_LIST, _CuteListItemGraphicBase };
1557
+ //# sourceMappingURL=cute-widgets-base-list.mjs.map