@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,640 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, forwardRef, inject, EventEmitter, isDevMode, booleanAttribute, Output, Input, ContentChildren, Directive, ChangeDetectionStrategy, ViewEncapsulation, Component, NgModule } from '@angular/core';
3
+ import { CuteButtonGroup, CuteButtonBase, CUTE_BUTTON_BASE } from '@cute-widgets/base/button';
4
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
5
+ import { SelectionModel } from '@angular/cdk/collections';
6
+ import { hasModifierKey, RIGHT_ARROW, DOWN_ARROW, LEFT_ARROW, UP_ARROW, ENTER, SPACE } from '@angular/cdk/keycodes';
7
+ import { Directionality } from '@angular/cdk/bidi';
8
+ import { _animationsDisabled, toThemeColor } from '@cute-widgets/base/core';
9
+ import { CommonModule } from '@angular/common';
10
+
11
+ /**
12
+ * @license Apache-2.0
13
+ *
14
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
15
+ *
16
+ * You may not use this file except in compliance with the License
17
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
18
+ */
19
+ /**
20
+ * Injection token that can be used to reference instances of `CuteButtonToggleGroup`.
21
+ * It serves as an alternative token to the actual `CuteButtonToggleGroup` class which
22
+ * could cause unnecessary retention of the class and its component metadata.
23
+ */
24
+ const CUTE_BUTTON_TOGGLE_GROUP = new InjectionToken('CuteButtonToggleGroup');
25
+ /**
26
+ * Provider Expression that allows cute-button-toggle-group to register as a ControlValueAccessor.
27
+ * This allows it to support [(ngModel)].
28
+ * @docs-private
29
+ */
30
+ const CUTE_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR = {
31
+ provide: NG_VALUE_ACCESSOR,
32
+ useExisting: forwardRef(() => CuteButtonToggleGroup),
33
+ multi: true,
34
+ };
35
+ // Counter used to generate unique IDs.
36
+ let uniqueIdCounter = 0;
37
+ /** Exclusive selection button toggle group that behaves like a radio-button group. */
38
+ class CuteButtonToggleGroup extends CuteButtonGroup {
39
+ /** `name` attribute for the underlying `input` element. */
40
+ get name() { return this._name; }
41
+ set name(value) {
42
+ this._name = value;
43
+ this._markButtonsForCheck();
44
+ }
45
+ /** Value of the toggle group. */
46
+ get value() {
47
+ const selected = this._selectionModel ? this._selectionModel.selected : [];
48
+ if (this.multiple) {
49
+ return selected.map(toggle => toggle.value);
50
+ }
51
+ return selected[0] ? selected[0].value : undefined;
52
+ }
53
+ set value(newValue) {
54
+ this._setSelectionByValue(newValue);
55
+ this.valueChange.emit(this.value);
56
+ }
57
+ /** Selected button toggles in the group. */
58
+ get selected() {
59
+ const selected = this._selectionModel ? this._selectionModel.selected : [];
60
+ return this.multiple ? selected : selected[0] || null;
61
+ }
62
+ /** Whether multiple button toggles can be selected. */
63
+ get multiple() { return this._multiple; }
64
+ set multiple(value) {
65
+ this._multiple = value;
66
+ this._markButtonsForCheck();
67
+ }
68
+ /** Whether buttons in the group should be interactive while they're disabled. */
69
+ get disabledInteractive() { return this._disabledInteractive; }
70
+ set disabledInteractive(value) {
71
+ this._disabledInteractive = value;
72
+ this._markButtonsForCheck();
73
+ }
74
+ /** Whether the checkmark indicator for single-selection button toggle groups is hidden. */
75
+ get hideSingleSelectionIndicator() { return this._hideSingleSelectionIndicator; }
76
+ set hideSingleSelectionIndicator(value) {
77
+ this._hideSingleSelectionIndicator = value;
78
+ this._markButtonsForCheck();
79
+ }
80
+ /** Whether the checkmark indicator for multiple-selection button toggle groups is hidden. */
81
+ get hideMultipleSelectionIndicator() { return this._hideMultipleSelectionIndicator; }
82
+ set hideMultipleSelectionIndicator(value) {
83
+ this._hideMultipleSelectionIndicator = value;
84
+ this._markButtonsForCheck();
85
+ }
86
+ /** The layout direction of the toggle button group. */
87
+ get dir() {
88
+ return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';
89
+ }
90
+ constructor() {
91
+ super();
92
+ this._dir = inject(Directionality, { optional: true });
93
+ this._multiple = false;
94
+ /**
95
+ * The method to be called in order to update ngModel.
96
+ * Now `ngModel` binding is not supported in multiple selection mode.
97
+ */
98
+ this._controlValueAccessorChangeFn = () => { };
99
+ /** onTouch function registered via registerOnTouch (ControlValueAccessor). */
100
+ this._onTouched = () => { };
101
+ /** The button toggle default style. Only outlined buttons supported. */
102
+ this.buttonStyle = "outline-button";
103
+ this._name = `cute-button-toggle-group-${uniqueIdCounter++}`;
104
+ this._disabledInteractive = false;
105
+ this._hideSingleSelectionIndicator = false;
106
+ this._hideMultipleSelectionIndicator = false;
107
+ /**
108
+ * Event that emits whenever the value of the group changes.
109
+ * Used to facilitate two-way data binding.
110
+ * @docs-private
111
+ */
112
+ this.valueChange = new EventEmitter();
113
+ /** Event emitted when the group's value changes. */
114
+ this.change = new EventEmitter();
115
+ const defaultOptions = inject(CUTE_BUTTON_TOGGLE_DEFAULT_OPTIONS, { optional: true });
116
+ //this.appearance =
117
+ // defaultOptions && defaultOptions.appearance ? defaultOptions.appearance : 'standard';
118
+ this.hideSingleSelectionIndicator = defaultOptions?.hideSingleSelectionIndicator ?? false;
119
+ this.hideMultipleSelectionIndicator = defaultOptions?.hideMultipleSelectionIndicator ?? false;
120
+ }
121
+ ngOnInit() {
122
+ super.ngOnInit();
123
+ this._selectionModel = new SelectionModel(this.multiple, undefined, false);
124
+ }
125
+ ngAfterContentInit() {
126
+ super.ngAfterContentInit();
127
+ if (this._buttonToggles) {
128
+ this._selectionModel?.select(...this._buttonToggles.filter(toggle => toggle.checked));
129
+ }
130
+ if (!this.multiple) {
131
+ this._initializeTabIndex();
132
+ }
133
+ }
134
+ /** Initializes the tabindex attribute using the radio pattern. */
135
+ _initializeTabIndex() {
136
+ if (this._buttonToggles) {
137
+ this._buttonToggles.forEach(toggle => {
138
+ toggle.tabIndex = -1;
139
+ });
140
+ if (this.selected) {
141
+ this.selected.tabIndex = 0;
142
+ }
143
+ else {
144
+ for (let i = 0; i < this._buttonToggles.length; i++) {
145
+ const toggle = this._buttonToggles.get(i);
146
+ if (!toggle.disabled) {
147
+ toggle.tabIndex = 0;
148
+ break;
149
+ }
150
+ }
151
+ }
152
+ this._markButtonsForCheck();
153
+ }
154
+ }
155
+ /**
156
+ * Sets the model value. Implemented as part of ControlValueAccessor.
157
+ * @param value Value to be set to the model.
158
+ */
159
+ writeValue(value) {
160
+ this.value = value;
161
+ this.markForCheck();
162
+ }
163
+ // Implemented as part of ControlValueAccessor.
164
+ registerOnChange(fn) {
165
+ this._controlValueAccessorChangeFn = fn;
166
+ }
167
+ // Implemented as part of ControlValueAccessor.
168
+ registerOnTouched(fn) {
169
+ this._onTouched = fn;
170
+ }
171
+ // Implemented as part of ControlValueAccessor.
172
+ setDisabledState(isDisabled) {
173
+ if (super.setDisabledState(isDisabled)) {
174
+ this._buttonToggles?.forEach(toggle => toggle.disabled = isDisabled);
175
+ this._markButtonsForCheck();
176
+ }
177
+ return false;
178
+ }
179
+ /** Handle keydown event calling to single-select button toggle. */
180
+ _keydown(event) {
181
+ if (this.multiple || this.disabled || hasModifierKey(event) || !this._buttonToggles) {
182
+ return;
183
+ }
184
+ const target = event.target;
185
+ const buttonId = target.id;
186
+ const index = this._buttonToggles.toArray().findIndex(toggle => {
187
+ return toggle.buttonId === buttonId;
188
+ });
189
+ if (index == -1) {
190
+ return;
191
+ }
192
+ let nextButton = null;
193
+ switch (event.keyCode) {
194
+ case SPACE:
195
+ case ENTER:
196
+ nextButton = this._buttonToggles.get(index) || null;
197
+ //nextButton.checked = true;
198
+ break;
199
+ case UP_ARROW:
200
+ nextButton = this._getNextButton(index, -1);
201
+ break;
202
+ case LEFT_ARROW:
203
+ nextButton = this._getNextButton(index, this.dir === 'ltr' ? -1 : 1);
204
+ break;
205
+ case DOWN_ARROW:
206
+ nextButton = this._getNextButton(index, 1);
207
+ break;
208
+ case RIGHT_ARROW:
209
+ nextButton = this._getNextButton(index, this.dir === 'ltr' ? 1 : -1);
210
+ break;
211
+ default:
212
+ return;
213
+ }
214
+ if (nextButton) {
215
+ event.preventDefault();
216
+ nextButton._onButtonClick();
217
+ nextButton.focus();
218
+ }
219
+ }
220
+ /** Dispatch change event with current selection and group value. */
221
+ _emitChangeEvent(toggle) {
222
+ const event = new CuteButtonToggleChange(toggle, this.value);
223
+ this._rawValue = event.value;
224
+ this._controlValueAccessorChangeFn(event.value);
225
+ this.change.emit(event);
226
+ }
227
+ /**
228
+ * Syncs a button toggle's selected state with the model value.
229
+ * @param toggle Toggle to be synced.
230
+ * @param select Whether the toggle should be selected.
231
+ * @param isUserInput Whether the change was a result of a user interaction.
232
+ * @param deferEvents Whether to defer emitting the change events.
233
+ */
234
+ _syncButtonToggle(toggle, select, isUserInput = false, deferEvents = false) {
235
+ // Deselect the currently selected toggle if we're in single-selection
236
+ // mode and the button being toggled isn't selected at the moment.
237
+ if (!this.multiple && this.selected && !toggle.checked) {
238
+ this.selected.checked = false;
239
+ }
240
+ if (this._selectionModel) {
241
+ if (select) {
242
+ this._selectionModel.select(toggle);
243
+ }
244
+ else {
245
+ this._selectionModel.deselect(toggle);
246
+ }
247
+ }
248
+ else {
249
+ deferEvents = true;
250
+ }
251
+ // We need to defer in some cases in order to avoid "changed after checked errors", however,
252
+ // the side effect is that we may end up updating the model value out of sequence in others
253
+ // The `deferEvents` flag allows us to decide whether to do it on a case-by-case basis.
254
+ if (deferEvents) {
255
+ Promise.resolve().then(() => this._updateModelValue(toggle, isUserInput));
256
+ }
257
+ else {
258
+ this._updateModelValue(toggle, isUserInput);
259
+ }
260
+ }
261
+ /** Checks whether a button toggle is selected. */
262
+ _isSelected(toggle) {
263
+ return this._selectionModel ? this._selectionModel.isSelected(toggle) : false;
264
+ }
265
+ /** Determines whether a button toggle should be checked on init. */
266
+ _isPrechecked(toggle) {
267
+ if (typeof this._rawValue === 'undefined') {
268
+ return false;
269
+ }
270
+ if (this.multiple && Array.isArray(this._rawValue)) {
271
+ return this._rawValue.some(value => toggle.value != null && value === toggle.value);
272
+ }
273
+ return toggle.value === this._rawValue;
274
+ }
275
+ /** Obtains the subsequent toggle to which the focus shifts. */
276
+ _getNextButton(startIndex, offset) {
277
+ const items = this._buttonToggles;
278
+ if (items) {
279
+ for (let i = 1; i <= items.length; i++) {
280
+ const index = (startIndex + offset * i + items.length) % items.length;
281
+ const item = items.get(index);
282
+ if (item && !item.disabled) {
283
+ return item;
284
+ }
285
+ }
286
+ }
287
+ return null;
288
+ }
289
+ /** Updates the selection state of the toggles in the group based on a value. */
290
+ _setSelectionByValue(value) {
291
+ this._rawValue = value;
292
+ if (!this._buttonToggles) {
293
+ return;
294
+ }
295
+ const toggles = this._buttonToggles.toArray();
296
+ if (this.multiple && value) {
297
+ if (!Array.isArray(value) && isDevMode()) {
298
+ throw Error('Value must be an array in multiple-selection mode.');
299
+ }
300
+ this._clearSelection();
301
+ value.forEach((currentValue) => this._selectValue(currentValue, toggles));
302
+ }
303
+ else {
304
+ this._clearSelection();
305
+ this._selectValue(value, toggles);
306
+ }
307
+ // In single selection mode, we need at least one enabled toggle to always be focusable.
308
+ if (!this.multiple && toggles.every(toggle => toggle.tabIndex === -1)) {
309
+ for (const toggle of toggles) {
310
+ if (!toggle.disabled) {
311
+ toggle.tabIndex = 0;
312
+ break;
313
+ }
314
+ }
315
+ }
316
+ }
317
+ /** Clears the selected toggles. */
318
+ _clearSelection() {
319
+ this._selectionModel?.clear();
320
+ this._buttonToggles?.forEach(toggle => {
321
+ toggle.checked = false;
322
+ // If the button toggle is in single select mode, initialize the tabIndex.
323
+ if (!this.multiple) {
324
+ toggle.tabIndex = -1;
325
+ }
326
+ });
327
+ }
328
+ /** Selects a value if there's a toggle that corresponds to it. */
329
+ _selectValue(value, toggles) {
330
+ if (this._selectionModel) {
331
+ for (const toggle of toggles) {
332
+ if (toggle.value != null && toggle.value === value) {
333
+ toggle.checked = true;
334
+ this._selectionModel.select(toggle);
335
+ if (!this.multiple) {
336
+ // If the button toggle is in single select mode, reset the tabIndex.
337
+ toggle.tabIndex = 0;
338
+ }
339
+ break;
340
+ }
341
+ }
342
+ }
343
+ }
344
+ /** Syncs up the group's value with the model and emits the change event. */
345
+ _updateModelValue(toggle, isUserInput) {
346
+ // Only emit the change event for user input.
347
+ if (isUserInput) {
348
+ this._emitChangeEvent(toggle);
349
+ }
350
+ // Note: we emit this one no matter whether it was a user interaction, because
351
+ // it is used by Angular to sync up the two-way data binding.
352
+ this.valueChange.emit(this.value);
353
+ }
354
+ /** Marks all the child button toggles to be checked. */
355
+ _markButtonsForCheck() {
356
+ this._buttonToggles?.forEach(toggle => toggle.markForCheck());
357
+ }
358
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteButtonToggleGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
359
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "20.3.15", type: CuteButtonToggleGroup, isStandalone: true, selector: "cute-button-toggle-group", inputs: { name: "name", value: "value", multiple: ["multiple", "multiple", booleanAttribute], disabledInteractive: ["disabledInteractive", "disabledInteractive", booleanAttribute], hideSingleSelectionIndicator: ["hideSingleSelectionIndicator", "hideSingleSelectionIndicator", booleanAttribute], hideMultipleSelectionIndicator: ["hideMultipleSelectionIndicator", "hideMultipleSelectionIndicator", booleanAttribute] }, outputs: { valueChange: "valueChange", change: "change" }, host: { listeners: { "keydown": "_keydown($event)" }, properties: { "attr.role": "multiple ? \"group\" : \"radiogroup\"", "attr.aria-disabled": "disabled", "attr.tabindex": "-1" }, classAttribute: "cute-button-toggle-group" }, providers: [
360
+ CUTE_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR,
361
+ { provide: CUTE_BUTTON_TOGGLE_GROUP, useExisting: CuteButtonToggleGroup },
362
+ ], queries: [{ propertyName: "_buttonToggles", predicate: i0.forwardRef(() => CuteButtonToggle), descendants: true }], exportAs: ["cuteButtonToggleGroup"], usesInheritance: true, ngImport: i0 }); }
363
+ }
364
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteButtonToggleGroup, decorators: [{
365
+ type: Directive,
366
+ args: [{
367
+ selector: 'cute-button-toggle-group',
368
+ providers: [
369
+ CUTE_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR,
370
+ { provide: CUTE_BUTTON_TOGGLE_GROUP, useExisting: CuteButtonToggleGroup },
371
+ ],
372
+ host: {
373
+ 'class': 'cute-button-toggle-group',
374
+ '[attr.role]': 'multiple ? "group" : "radiogroup"',
375
+ '[attr.aria-disabled]': 'disabled',
376
+ '[attr.tabindex]': '-1',
377
+ '(keydown)': '_keydown($event)',
378
+ },
379
+ exportAs: 'cuteButtonToggleGroup',
380
+ standalone: true,
381
+ }]
382
+ }], ctorParameters: () => [], propDecorators: { _buttonToggles: [{
383
+ type: ContentChildren,
384
+ args: [forwardRef(() => CuteButtonToggle), {
385
+ // Note that this would technically pick up toggles
386
+ // from nested groups, but that's not a case that we support.
387
+ descendants: true,
388
+ }]
389
+ }], name: [{
390
+ type: Input
391
+ }], value: [{
392
+ type: Input
393
+ }], multiple: [{
394
+ type: Input,
395
+ args: [{ transform: booleanAttribute }]
396
+ }], disabledInteractive: [{
397
+ type: Input,
398
+ args: [{ transform: booleanAttribute }]
399
+ }], hideSingleSelectionIndicator: [{
400
+ type: Input,
401
+ args: [{ transform: booleanAttribute }]
402
+ }], hideMultipleSelectionIndicator: [{
403
+ type: Input,
404
+ args: [{ transform: booleanAttribute }]
405
+ }], valueChange: [{
406
+ type: Output
407
+ }], change: [{
408
+ type: Output
409
+ }] } });
410
+
411
+ /**
412
+ * @license Apache-2.0
413
+ *
414
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
415
+ *
416
+ * You may not use this file except in compliance with the License
417
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
418
+ */
419
+ /**
420
+ * Injection token that can be used to configure the
421
+ * default options for all button toggles within an app.
422
+ */
423
+ const CUTE_BUTTON_TOGGLE_DEFAULT_OPTIONS = new InjectionToken('CUTE_BUTTON_TOGGLE_DEFAULT_OPTIONS', {
424
+ providedIn: 'root',
425
+ factory: () => ({
426
+ hideSingleSelectionIndicator: false,
427
+ hideMultipleSelectionIndicator: false,
428
+ disabledInteractive: false,
429
+ }),
430
+ });
431
+ // Counter used to generate unique IDs.
432
+ let uniqueId = 0;
433
+ /** Change event object emitted by button toggle. */
434
+ class CuteButtonToggleChange {
435
+ constructor(
436
+ /** The button toggle that emits the event. */
437
+ source,
438
+ /** The value assigned to the button toggle. */
439
+ value) {
440
+ this.source = source;
441
+ this.value = value;
442
+ }
443
+ }
444
+ /** Single toggle button that should be nested directly inside a toggle group. */
445
+ class CuteButtonToggle extends CuteButtonBase {
446
+ /** Unique ID for the underlying `button` element. */
447
+ get buttonId() {
448
+ return this.id ?? `cute-toggle-button-${uniqueId++}`;
449
+ }
450
+ get inputButtonStyle() {
451
+ return super.inputButtonStyle;
452
+ }
453
+ set inputButtonStyle(value) {
454
+ super.inputButtonStyle = value;
455
+ }
456
+ /** Whether ripples are disabled on the button toggle. */
457
+ //@Input({transform: booleanAttribute}) disableRipple: boolean = false;
458
+ /** Whether the button is checked. */
459
+ get checked() {
460
+ return this.buttonToggleGroup ? this.buttonToggleGroup._isSelected(this) : this._checked;
461
+ }
462
+ set checked(value) {
463
+ if (value !== this._checked) {
464
+ this._checked = value;
465
+ if (this.buttonToggleGroup) {
466
+ this.buttonToggleGroup._syncButtonToggle(this, this._checked);
467
+ }
468
+ this.markForCheck();
469
+ }
470
+ }
471
+ /** Whether the button should remain interactive when it is disabled. */
472
+ get disabledInteractive() {
473
+ return (super.disabledInteractive ||
474
+ (this.buttonToggleGroup !== null && this.buttonToggleGroup.disabledInteractive));
475
+ }
476
+ set disabledInteractive(value) {
477
+ super.disabledInteractive = value;
478
+ }
479
+ constructor() {
480
+ super();
481
+ this._animationDisabled = _animationsDisabled();
482
+ this._multiple = true;
483
+ this._checked = false;
484
+ /** Event emitted when the group value changes. */
485
+ this.change = new EventEmitter();
486
+ this.toThemeColor = toThemeColor;
487
+ const toggleGroup = inject(CUTE_BUTTON_TOGGLE_GROUP, { optional: true });
488
+ //const defaultTabIndex = inject(new HostAttributeToken('tabindex'), {optional: true}) || '';
489
+ const defaultOptions = inject(CUTE_BUTTON_TOGGLE_DEFAULT_OPTIONS, { optional: true });
490
+ //this._tabIndex = parseInt(defaultTabIndex) || 0;
491
+ this.buttonToggleGroup = toggleGroup;
492
+ this.disabledInteractive = defaultOptions?.disabledInteractive ?? false;
493
+ }
494
+ ngOnInit() {
495
+ super.ngOnInit();
496
+ const group = this.buttonToggleGroup;
497
+ this.id = this.id || `cute-button-toggle-${uniqueId++}`;
498
+ if (group) {
499
+ if (!this.color) {
500
+ this.defaultColor = group.color;
501
+ }
502
+ if (group._isPrechecked(this)) {
503
+ this.checked = true;
504
+ }
505
+ else if (group._isSelected(this) !== this._checked) {
506
+ // As a side effect of the circular dependency between the toggle group and the button,
507
+ // we may end up in a state where the button is supposed to be checked on init, but it
508
+ // isn't, because the checked value was assigned too early. This can happen when Ivy
509
+ // assigns the static input value before the `ngOnInit` has run.
510
+ group._syncButtonToggle(this, this._checked);
511
+ }
512
+ }
513
+ }
514
+ /*
515
+ override ngAfterViewInit() {
516
+ super.ngAfterViewInit();
517
+ // This serves two purposes:
518
+ // 1. We don't want the animation to fire on the first render for pre-checked toggles so we
519
+ // delay adding the class until the view is rendered.
520
+ // 2. We don't want animation if the `NoopAnimationsModule` is provided.
521
+ //if (this._animationMode !== 'NoopAnimations') {
522
+ // this._elementRef.nativeElement.classList.add('mat-button-toggle-animations-enabled');
523
+ //}
524
+
525
+ this._focusMonitor.monitor(this._elementRef, true);
526
+ }
527
+ */
528
+ ngOnDestroy() {
529
+ super.ngOnDestroy();
530
+ const group = this.buttonToggleGroup;
531
+ // Remove the toggle from the selection once it's destroyed. Needs to happen
532
+ // on the next tick to avoid "changed after checked" errors.
533
+ if (group && group._isSelected(this)) {
534
+ group._syncButtonToggle(this, false, false, true);
535
+ }
536
+ }
537
+ /** Checks the button toggle due to an interaction with the underlying native button. */
538
+ _onButtonClick() {
539
+ if (this.disabled) {
540
+ return;
541
+ }
542
+ const newChecked = this.isSingleSelector() ? true : !this._checked;
543
+ if (newChecked !== this._checked) {
544
+ this._checked = newChecked;
545
+ if (this.buttonToggleGroup) {
546
+ this.buttonToggleGroup._syncButtonToggle(this, this._checked, true);
547
+ this.buttonToggleGroup._onTouched();
548
+ }
549
+ }
550
+ if (this.isSingleSelector()) {
551
+ const focusable = this.buttonToggleGroup._buttonToggles?.find(toggle => {
552
+ return toggle.tabIndex === 0;
553
+ });
554
+ // Modify the tabindex attribute of the last focusable button toggle to -1.
555
+ if (focusable) {
556
+ focusable.tabIndex = -1;
557
+ }
558
+ // Modify the tabindex attribute of the presently selected button toggle to 0.
559
+ this.tabIndex = 0;
560
+ }
561
+ // Emit a change event when it's the single selector
562
+ this.change.emit(new CuteButtonToggleChange(this, this.value));
563
+ }
564
+ /** Gets the name that should be assigned to the inner DOM node. */
565
+ _getButtonName() {
566
+ if (this.isSingleSelector()) {
567
+ return this.buttonToggleGroup.name;
568
+ }
569
+ return this.name || null;
570
+ }
571
+ /** Whether the toggle is in single selection mode. */
572
+ isSingleSelector() {
573
+ return this.buttonToggleGroup && !this.buttonToggleGroup.multiple;
574
+ }
575
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteButtonToggle, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
576
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: CuteButtonToggle, isStandalone: true, selector: "cute-button-toggle", inputs: { name: "name", value: "value", checked: ["checked", "checked", booleanAttribute] }, outputs: { change: "change" }, host: { listeners: { "focus": "focus()", "click": "_onButtonClick()" }, properties: { "class.cute-button-toggle-standalone": "!buttonToggleGroup", "class.active": "checked", "attr.aria-label": "null", "attr.aria-labelledby": "null", "attr.name": "null", "style.--bs-btn-hover-color": "'var(--bs-'+toThemeColor(color)+'-text-emphasis)'" }, classAttribute: "cute-button-toggle" }, providers: [
577
+ { provide: CUTE_BUTTON_BASE, useExisting: CuteButtonToggle }
578
+ ], exportAs: ["cuteButtonToggle"], usesInheritance: true, ngImport: i0, template: "<!--\r\n For capturing HTML-elements such as <i class..> or <img src=\"\"...> and others\r\n we need apply [cuteButtonIcon] attribute to them.\r\n-->\r\n<span class=\"cute-icon-wrapper\">\r\n <ng-content select=\".material-icons:not([iconPositionEnd]),\r\n .bi:not([iconPositionEnd]),\r\n cute-icon:not([iconPositionEnd]),\r\n cute-avatar:not([iconPositionEnd]),\r\n [cuteButtonIcon]:not([iconPositionEnd])\">\r\n </ng-content>\r\n</span>\r\n\r\n<span class=\"cute-button-label\">\r\n <ng-content>\r\n @if(visuallyHiddenLabel) {\r\n <span class=\"visually-hidden\"> {{visuallyHiddenLabel}} </span>\r\n }\r\n </ng-content>\r\n</span>\r\n\r\n<span class=\"cute-icon-wrapper\">\r\n <ng-content select=\".material-icons[iconPositionEnd],\r\n .bi:[iconPositionEnd],\r\n cute-icon[iconPositionEnd],\r\n cute-avatar:[iconPositionEnd],\r\n [cuteButtonIcon][iconPositionEnd]\">\r\n </ng-content>\r\n</span>\r\n", styles: [".cute-ripple-element{--cute-ripple-duration: .5s;--cute-ripple-bg-color: rgba(255, 255, 255, .18);position:absolute;border-radius:50%;pointer-events:none;transform:scale3d(0,0,0);animation:cute-ripple-element-animation var(--cute-ripple-duration) cubic-bezier(.65,.05,.36,1);background-color:var(--cute-ripple-bg-color);will-change:transform,opacity}@media (forced-colors: active){.cute-ripple-element{display:none}}@keyframes cute-ripple-element-animation{to{transform:scale(8);opacity:0}}.cute-button,.cute-anchor{position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;overflow:visible;box-shadow:none}.cute-button:has(>:not(.cute-ripple):nth-child(2)),.cute-anchor:has(>:not(.cute-ripple):nth-child(2)){gap:.5em}.cute-button.dropdown-toggle,.cute-anchor.dropdown-toggle{gap:.375em}.cute-button.dropdown-toggle-split,.cute-anchor.dropdown-toggle-split{gap:0}.cute-button .cute-icon-wrapper,.cute-anchor .cute-icon-wrapper{display:contents}.cute-button .cute-icon-wrapper:empty,.cute-anchor .cute-icon-wrapper:empty{display:none}.cute-button .cute-button-label,.cute-anchor .cute-button-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cute-button .cute-button-label .badge,.cute-anchor .cute-button-label .badge{line-height:var(--bs-btn-line-height);top:0}.cute-button .cute-button-label:empty,.cute-anchor .cute-button-label:empty{display:none}.cute-button.cute-button-disabled-interactive,.cute-anchor.cute-button-disabled-interactive{cursor:pointer}.cute-button.cute-button-disabled-interactive:disabled,.cute-button.cute-button-disabled-interactive.disabled,.cute-anchor.cute-button-disabled-interactive:disabled,.cute-anchor.cute-button-disabled-interactive.disabled{pointer-events:auto;cursor:default;box-shadow:none;--bs-btn-active-bg: var(--bs-btn-disabled-bg);--bs-btn-active-border-color: var(--bs-btn-disabled-border-color);--bs-btn-active-color: var(--bs-btn-disabled-color)}.cute-button.cute-button-disabled-interactive:disabled.cute-icon-button,.cute-button.cute-button-disabled-interactive.disabled.cute-icon-button,.cute-anchor.cute-button-disabled-interactive:disabled.cute-icon-button,.cute-anchor.cute-button-disabled-interactive.disabled.cute-icon-button{--bs-btn-active-bg: transparent;--bs-btn-active-border-color: transparent;--bs-btn-hover-bg: transparent}.cute-button.cute-base-button,.cute-anchor.cute-base-button{font-weight:500;--cute-base-button-color-rgb: var(--bs-body-color-rgb);--bs-btn-active-bg: rgba(var(--cute-base-button-color-rgb), .08);--bs-btn-active-border-color: rgba(var(--cute-base-button-color-rgb), .12);--bs-btn-disabled-border-color: transparent;--bs-btn-hover-bg: rgba(var(--cute-base-button-color-rgb), .06)}.cute-button.cute-flat-button.cute-unthemed,.cute-anchor.cute-flat-button.cute-unthemed{--bs-btn-bg: var(--bs-tertiary-bg);--bs-btn-hover-bg: var(--bs-secondary-bg);--bs-btn-active-bg: var(--bs-secondary-bg);border-color:transparent}.cute-button.raised,.cute-anchor.raised{box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f;transition:box-shadow .2s cubic-bezier(.4,0,.2,1)}.cute-button.raised:hover,.cute-button.raised:focus,.cute-anchor.raised:hover,.cute-anchor.raised:focus{box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.cute-button.raised:active,.cute-anchor.raised:active{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cute-button.raised:disabled,.cute-button.raised.disabled,.cute-anchor.raised:disabled,.cute-anchor.raised.disabled{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f}.cute-button.btn-light:disabled,.cute-button.btn-light.disabled,.cute-anchor.btn-light:disabled,.cute-anchor.btn-light.disabled{background-color:#0000001a}.cute-button>[role=img],.cute-button i[class],.cute-anchor>[role=img],.cute-anchor i[class]{align-self:center;pointer-events:none;overflow:visible}.cute-button.cute-fab-button,.cute-anchor.cute-fab-button{--icon-size: 40px;width:var(--icon-size);height:var(--icon-size);min-width:var(--icon-size);line-height:1;padding:0;padding-top:revert;gap:0;border-radius:50%;flex-shrink:0;-webkit-tap-highlight-color:rgba(0,0,0,0);box-shadow:0 3px 5px -1px #0003,0 6px 10px #00000024,0 1px 18px #0000001f}.cute-button.cute-fab-button[magnitude=largest],.cute-anchor.cute-fab-button[magnitude=largest]{--icon-size: 64px}.cute-button.cute-fab-button[magnitude=larger],.cute-anchor.cute-fab-button[magnitude=larger]{--icon-size: 56px}.cute-button.cute-fab-button[magnitude=large],.cute-anchor.cute-fab-button[magnitude=large]{--icon-size: 48px}.cute-button.cute-fab-button[magnitude=middle],.cute-anchor.cute-fab-button[magnitude=middle]{--icon-size: 40px}.cute-button.cute-fab-button[magnitude=small],.cute-anchor.cute-fab-button[magnitude=small]{--icon-size: 32px}.cute-button.cute-fab-button[magnitude=smaller],.cute-anchor.cute-fab-button[magnitude=smaller]{--icon-size: 24px}.cute-button.cute-fab-button[magnitude=smallest],.cute-anchor.cute-fab-button[magnitude=smallest]{--icon-size: 16px}.cute-button.cute-fab-button svg,.cute-anchor.cute-fab-button svg{vertical-align:baseline}.cute-button.cute-fab-button:active,.cute-anchor.cute-fab-button:active{box-shadow:0 7px 8px -4px #0003,0 12px 17px 2px #00000024,0 5px 22px 4px #0000001f}.cute-button.cute-fab-button:active.btn-light,.cute-anchor.cute-fab-button:active.btn-light{border-color:#00000040}.cute-button.cute-fab-button:hover,.cute-button.cute-fab-button.cdk-focused,.cute-anchor.cute-fab-button:hover,.cute-anchor.cute-fab-button.cdk-focused{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cute-button.cute-fab-button:disabled,.cute-button.cute-fab-button.disabled,.cute-anchor.cute-fab-button:disabled,.cute-anchor.cute-fab-button.disabled{border:0;box-shadow:none}.cute-button.cute-fab-button:disabled>[role=img],.cute-button.cute-fab-button:disabled i[class],.cute-button.cute-fab-button.disabled>[role=img],.cute-button.cute-fab-button.disabled i[class],.cute-anchor.cute-fab-button:disabled>[role=img],.cute-anchor.cute-fab-button:disabled i[class],.cute-anchor.cute-fab-button.disabled>[role=img],.cute-anchor.cute-fab-button.disabled i[class]{color:#00000061!important}.cute-button.cute-icon-button,.cute-anchor.cute-icon-button{overflow:hidden;border-radius:50%;border:0;padding:0;gap:0!important;--icon-size: 40px;width:var(--icon-size);height:var(--icon-size);min-width:var(--icon-size);line-height:1;--cute-icon-button-color-rgb: var(--bs-body-color-rgb);--bs-btn-active-bg: rgba(var(--cute-icon-button-color-rgb), .12);--bs-btn-active-border-color: rgba(var(--cute-icon-button-color-rgb), .12);--bs-btn-hover-bg: rgba(var(--cute-icon-button-color-rgb), .06)}.cute-button.cute-icon-button[magnitude=largest],.cute-anchor.cute-icon-button[magnitude=largest]{--icon-size: 64px}.cute-button.cute-icon-button[magnitude=larger],.cute-anchor.cute-icon-button[magnitude=larger]{--icon-size: 56px}.cute-button.cute-icon-button[magnitude=large],.cute-anchor.cute-icon-button[magnitude=large]{--icon-size: 48px}.cute-button.cute-icon-button[magnitude=middle],.cute-anchor.cute-icon-button[magnitude=middle]{--icon-size: 40px}.cute-button.cute-icon-button[magnitude=small],.cute-anchor.cute-icon-button[magnitude=small]{--icon-size: 32px}.cute-button.cute-icon-button[magnitude=smaller],.cute-anchor.cute-icon-button[magnitude=smaller]{--icon-size: 24px}.cute-button.cute-icon-button[magnitude=smallest],.cute-anchor.cute-icon-button[magnitude=smallest]{--icon-size: 16px}.cute-button.cute-icon-button svg,.cute-anchor.cute-icon-button svg{vertical-align:baseline}.cute-button.cute-icon-button.cdk-focused,.cute-anchor.cute-icon-button.cdk-focused{--bs-btn-hover-bg: rgba(var(--cute-icon-button-color-rgb), .04)}.cute-btn-xxs,.cute-btn-group-xxs>.btn{--bs-btn-padding-y: .25rem;--bs-btn-padding-x: .5rem;--bs-btn-font-size: .5rem}.cute-btn-xs,.cute-btn-group-xs>.btn{--bs-btn-padding-y: .25rem;--bs-btn-padding-x: .5rem;--bs-btn-font-size: .75rem}.cute-btn-xl,.cute-btn-group-xl>.btn{--bs-btn-padding-y: .5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size: 1.5rem}.cute-btn-xxl,.cute-btn-group-xxl>.btn{--bs-btn-padding-y: .5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size: 2.5rem}[dir=rtl] .btn-group>.btn:not(:first-child):not(.dropdown-toggle),[dir=rtl] .btn-group>.btn.dropdown-toggle-split:last-child,[dir=rtl] .btn-group>.btn-group:not(:first-child)>.btn{border-radius:0}[dir=rtl] .btn-group>.btn:nth-child(n+3),[dir=rtl] .btn-group>:not(.btn-check)+.btn,[dir=rtl] .btn-group>.btn-group:not(:last-child)>.btn{border-radius:0 var(--bs-btn-border-radius) var(--bs-btn-border-radius) 0}[dir=rtl] .btn-group>.btn:first-child:not(.dropdown-toggle),[dir=rtl] .btn-group>.btn.dropdown-toggle-split:first-child,[dir=rtl] .btn-group>.btn-group:first-child>.btn{border-radius:0 var(--bs-btn-border-radius) var(--bs-btn-border-radius) 0}[dir=rtl] .btn-group>.btn:last-child:not(.dropdown-toggle),[dir=rtl] .btn-group>.btn.dropdown-toggle-split:last-child,[dir=rtl] .btn-group>.btn-group:last-child>.btn{border-radius:var(--bs-btn-border-radius) 0 0 var(--bs-btn-border-radius)}.cute-button-expandable{padding:.25rem .5rem;font-weight:600;color:var(--bs-emphasis-color);background-color:transparent}.cute-button-expandable:hover,.cute-button-expandable:focus{color:rgba(var(--bs-emphasis-color-rgb),.85);background-color:var(--bs-tertiary-bg)}.cute-button-expandable:before{width:1.25em;line-height:0;content:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%280,0,0,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e\");transition:transform .35s ease;transform-origin:.5em 50%;transform:scale(.85)}[data-bs-theme=dark] .cute-button-expandable:before{content:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%28255,255,255,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e\")}[dir=rtl] .cute-button-expandable:before{transform:rotate(180deg) scale(.85);margin-left:.25em;text-align:end}.cute-button-expandable[aria-expanded=true]{color:rgba(var(--bs-emphasis-color-rgb),.85)}.cute-button-expandable[aria-expanded=true]:before{transform:rotate(90deg) scale(.85)}\n", ".cute-button-toggle{--bs-btn-hover-bg: transparent}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
579
+ }
580
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteButtonToggle, decorators: [{
581
+ type: Component,
582
+ args: [{ selector: 'cute-button-toggle', exportAs: 'cuteButtonToggle', host: {
583
+ 'class': 'cute-button-toggle',
584
+ '[class.cute-button-toggle-standalone]': '!buttonToggleGroup',
585
+ '[class.active]': 'checked',
586
+ '[attr.aria-label]': 'null',
587
+ '[attr.aria-labelledby]': 'null',
588
+ '[attr.name]': 'null',
589
+ '(focus)': 'focus()',
590
+ '(click)': '_onButtonClick()',
591
+ '[style.--bs-btn-hover-color]': "'var(--bs-'+toThemeColor(color)+'-text-emphasis)'",
592
+ //'role': 'presentation',
593
+ }, providers: [
594
+ { provide: CUTE_BUTTON_BASE, useExisting: CuteButtonToggle }
595
+ ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<!--\r\n For capturing HTML-elements such as <i class..> or <img src=\"\"...> and others\r\n we need apply [cuteButtonIcon] attribute to them.\r\n-->\r\n<span class=\"cute-icon-wrapper\">\r\n <ng-content select=\".material-icons:not([iconPositionEnd]),\r\n .bi:not([iconPositionEnd]),\r\n cute-icon:not([iconPositionEnd]),\r\n cute-avatar:not([iconPositionEnd]),\r\n [cuteButtonIcon]:not([iconPositionEnd])\">\r\n </ng-content>\r\n</span>\r\n\r\n<span class=\"cute-button-label\">\r\n <ng-content>\r\n @if(visuallyHiddenLabel) {\r\n <span class=\"visually-hidden\"> {{visuallyHiddenLabel}} </span>\r\n }\r\n </ng-content>\r\n</span>\r\n\r\n<span class=\"cute-icon-wrapper\">\r\n <ng-content select=\".material-icons[iconPositionEnd],\r\n .bi:[iconPositionEnd],\r\n cute-icon[iconPositionEnd],\r\n cute-avatar:[iconPositionEnd],\r\n [cuteButtonIcon][iconPositionEnd]\">\r\n </ng-content>\r\n</span>\r\n", styles: [".cute-ripple-element{--cute-ripple-duration: .5s;--cute-ripple-bg-color: rgba(255, 255, 255, .18);position:absolute;border-radius:50%;pointer-events:none;transform:scale3d(0,0,0);animation:cute-ripple-element-animation var(--cute-ripple-duration) cubic-bezier(.65,.05,.36,1);background-color:var(--cute-ripple-bg-color);will-change:transform,opacity}@media (forced-colors: active){.cute-ripple-element{display:none}}@keyframes cute-ripple-element-animation{to{transform:scale(8);opacity:0}}.cute-button,.cute-anchor{position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;overflow:visible;box-shadow:none}.cute-button:has(>:not(.cute-ripple):nth-child(2)),.cute-anchor:has(>:not(.cute-ripple):nth-child(2)){gap:.5em}.cute-button.dropdown-toggle,.cute-anchor.dropdown-toggle{gap:.375em}.cute-button.dropdown-toggle-split,.cute-anchor.dropdown-toggle-split{gap:0}.cute-button .cute-icon-wrapper,.cute-anchor .cute-icon-wrapper{display:contents}.cute-button .cute-icon-wrapper:empty,.cute-anchor .cute-icon-wrapper:empty{display:none}.cute-button .cute-button-label,.cute-anchor .cute-button-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cute-button .cute-button-label .badge,.cute-anchor .cute-button-label .badge{line-height:var(--bs-btn-line-height);top:0}.cute-button .cute-button-label:empty,.cute-anchor .cute-button-label:empty{display:none}.cute-button.cute-button-disabled-interactive,.cute-anchor.cute-button-disabled-interactive{cursor:pointer}.cute-button.cute-button-disabled-interactive:disabled,.cute-button.cute-button-disabled-interactive.disabled,.cute-anchor.cute-button-disabled-interactive:disabled,.cute-anchor.cute-button-disabled-interactive.disabled{pointer-events:auto;cursor:default;box-shadow:none;--bs-btn-active-bg: var(--bs-btn-disabled-bg);--bs-btn-active-border-color: var(--bs-btn-disabled-border-color);--bs-btn-active-color: var(--bs-btn-disabled-color)}.cute-button.cute-button-disabled-interactive:disabled.cute-icon-button,.cute-button.cute-button-disabled-interactive.disabled.cute-icon-button,.cute-anchor.cute-button-disabled-interactive:disabled.cute-icon-button,.cute-anchor.cute-button-disabled-interactive.disabled.cute-icon-button{--bs-btn-active-bg: transparent;--bs-btn-active-border-color: transparent;--bs-btn-hover-bg: transparent}.cute-button.cute-base-button,.cute-anchor.cute-base-button{font-weight:500;--cute-base-button-color-rgb: var(--bs-body-color-rgb);--bs-btn-active-bg: rgba(var(--cute-base-button-color-rgb), .08);--bs-btn-active-border-color: rgba(var(--cute-base-button-color-rgb), .12);--bs-btn-disabled-border-color: transparent;--bs-btn-hover-bg: rgba(var(--cute-base-button-color-rgb), .06)}.cute-button.cute-flat-button.cute-unthemed,.cute-anchor.cute-flat-button.cute-unthemed{--bs-btn-bg: var(--bs-tertiary-bg);--bs-btn-hover-bg: var(--bs-secondary-bg);--bs-btn-active-bg: var(--bs-secondary-bg);border-color:transparent}.cute-button.raised,.cute-anchor.raised{box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f;transition:box-shadow .2s cubic-bezier(.4,0,.2,1)}.cute-button.raised:hover,.cute-button.raised:focus,.cute-anchor.raised:hover,.cute-anchor.raised:focus{box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.cute-button.raised:active,.cute-anchor.raised:active{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cute-button.raised:disabled,.cute-button.raised.disabled,.cute-anchor.raised:disabled,.cute-anchor.raised.disabled{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f}.cute-button.btn-light:disabled,.cute-button.btn-light.disabled,.cute-anchor.btn-light:disabled,.cute-anchor.btn-light.disabled{background-color:#0000001a}.cute-button>[role=img],.cute-button i[class],.cute-anchor>[role=img],.cute-anchor i[class]{align-self:center;pointer-events:none;overflow:visible}.cute-button.cute-fab-button,.cute-anchor.cute-fab-button{--icon-size: 40px;width:var(--icon-size);height:var(--icon-size);min-width:var(--icon-size);line-height:1;padding:0;padding-top:revert;gap:0;border-radius:50%;flex-shrink:0;-webkit-tap-highlight-color:rgba(0,0,0,0);box-shadow:0 3px 5px -1px #0003,0 6px 10px #00000024,0 1px 18px #0000001f}.cute-button.cute-fab-button[magnitude=largest],.cute-anchor.cute-fab-button[magnitude=largest]{--icon-size: 64px}.cute-button.cute-fab-button[magnitude=larger],.cute-anchor.cute-fab-button[magnitude=larger]{--icon-size: 56px}.cute-button.cute-fab-button[magnitude=large],.cute-anchor.cute-fab-button[magnitude=large]{--icon-size: 48px}.cute-button.cute-fab-button[magnitude=middle],.cute-anchor.cute-fab-button[magnitude=middle]{--icon-size: 40px}.cute-button.cute-fab-button[magnitude=small],.cute-anchor.cute-fab-button[magnitude=small]{--icon-size: 32px}.cute-button.cute-fab-button[magnitude=smaller],.cute-anchor.cute-fab-button[magnitude=smaller]{--icon-size: 24px}.cute-button.cute-fab-button[magnitude=smallest],.cute-anchor.cute-fab-button[magnitude=smallest]{--icon-size: 16px}.cute-button.cute-fab-button svg,.cute-anchor.cute-fab-button svg{vertical-align:baseline}.cute-button.cute-fab-button:active,.cute-anchor.cute-fab-button:active{box-shadow:0 7px 8px -4px #0003,0 12px 17px 2px #00000024,0 5px 22px 4px #0000001f}.cute-button.cute-fab-button:active.btn-light,.cute-anchor.cute-fab-button:active.btn-light{border-color:#00000040}.cute-button.cute-fab-button:hover,.cute-button.cute-fab-button.cdk-focused,.cute-anchor.cute-fab-button:hover,.cute-anchor.cute-fab-button.cdk-focused{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cute-button.cute-fab-button:disabled,.cute-button.cute-fab-button.disabled,.cute-anchor.cute-fab-button:disabled,.cute-anchor.cute-fab-button.disabled{border:0;box-shadow:none}.cute-button.cute-fab-button:disabled>[role=img],.cute-button.cute-fab-button:disabled i[class],.cute-button.cute-fab-button.disabled>[role=img],.cute-button.cute-fab-button.disabled i[class],.cute-anchor.cute-fab-button:disabled>[role=img],.cute-anchor.cute-fab-button:disabled i[class],.cute-anchor.cute-fab-button.disabled>[role=img],.cute-anchor.cute-fab-button.disabled i[class]{color:#00000061!important}.cute-button.cute-icon-button,.cute-anchor.cute-icon-button{overflow:hidden;border-radius:50%;border:0;padding:0;gap:0!important;--icon-size: 40px;width:var(--icon-size);height:var(--icon-size);min-width:var(--icon-size);line-height:1;--cute-icon-button-color-rgb: var(--bs-body-color-rgb);--bs-btn-active-bg: rgba(var(--cute-icon-button-color-rgb), .12);--bs-btn-active-border-color: rgba(var(--cute-icon-button-color-rgb), .12);--bs-btn-hover-bg: rgba(var(--cute-icon-button-color-rgb), .06)}.cute-button.cute-icon-button[magnitude=largest],.cute-anchor.cute-icon-button[magnitude=largest]{--icon-size: 64px}.cute-button.cute-icon-button[magnitude=larger],.cute-anchor.cute-icon-button[magnitude=larger]{--icon-size: 56px}.cute-button.cute-icon-button[magnitude=large],.cute-anchor.cute-icon-button[magnitude=large]{--icon-size: 48px}.cute-button.cute-icon-button[magnitude=middle],.cute-anchor.cute-icon-button[magnitude=middle]{--icon-size: 40px}.cute-button.cute-icon-button[magnitude=small],.cute-anchor.cute-icon-button[magnitude=small]{--icon-size: 32px}.cute-button.cute-icon-button[magnitude=smaller],.cute-anchor.cute-icon-button[magnitude=smaller]{--icon-size: 24px}.cute-button.cute-icon-button[magnitude=smallest],.cute-anchor.cute-icon-button[magnitude=smallest]{--icon-size: 16px}.cute-button.cute-icon-button svg,.cute-anchor.cute-icon-button svg{vertical-align:baseline}.cute-button.cute-icon-button.cdk-focused,.cute-anchor.cute-icon-button.cdk-focused{--bs-btn-hover-bg: rgba(var(--cute-icon-button-color-rgb), .04)}.cute-btn-xxs,.cute-btn-group-xxs>.btn{--bs-btn-padding-y: .25rem;--bs-btn-padding-x: .5rem;--bs-btn-font-size: .5rem}.cute-btn-xs,.cute-btn-group-xs>.btn{--bs-btn-padding-y: .25rem;--bs-btn-padding-x: .5rem;--bs-btn-font-size: .75rem}.cute-btn-xl,.cute-btn-group-xl>.btn{--bs-btn-padding-y: .5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size: 1.5rem}.cute-btn-xxl,.cute-btn-group-xxl>.btn{--bs-btn-padding-y: .5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size: 2.5rem}[dir=rtl] .btn-group>.btn:not(:first-child):not(.dropdown-toggle),[dir=rtl] .btn-group>.btn.dropdown-toggle-split:last-child,[dir=rtl] .btn-group>.btn-group:not(:first-child)>.btn{border-radius:0}[dir=rtl] .btn-group>.btn:nth-child(n+3),[dir=rtl] .btn-group>:not(.btn-check)+.btn,[dir=rtl] .btn-group>.btn-group:not(:last-child)>.btn{border-radius:0 var(--bs-btn-border-radius) var(--bs-btn-border-radius) 0}[dir=rtl] .btn-group>.btn:first-child:not(.dropdown-toggle),[dir=rtl] .btn-group>.btn.dropdown-toggle-split:first-child,[dir=rtl] .btn-group>.btn-group:first-child>.btn{border-radius:0 var(--bs-btn-border-radius) var(--bs-btn-border-radius) 0}[dir=rtl] .btn-group>.btn:last-child:not(.dropdown-toggle),[dir=rtl] .btn-group>.btn.dropdown-toggle-split:last-child,[dir=rtl] .btn-group>.btn-group:last-child>.btn{border-radius:var(--bs-btn-border-radius) 0 0 var(--bs-btn-border-radius)}.cute-button-expandable{padding:.25rem .5rem;font-weight:600;color:var(--bs-emphasis-color);background-color:transparent}.cute-button-expandable:hover,.cute-button-expandable:focus{color:rgba(var(--bs-emphasis-color-rgb),.85);background-color:var(--bs-tertiary-bg)}.cute-button-expandable:before{width:1.25em;line-height:0;content:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%280,0,0,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e\");transition:transform .35s ease;transform-origin:.5em 50%;transform:scale(.85)}[data-bs-theme=dark] .cute-button-expandable:before{content:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%28255,255,255,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e\")}[dir=rtl] .cute-button-expandable:before{transform:rotate(180deg) scale(.85);margin-left:.25em;text-align:end}.cute-button-expandable[aria-expanded=true]{color:rgba(var(--bs-emphasis-color-rgb),.85)}.cute-button-expandable[aria-expanded=true]:before{transform:rotate(90deg) scale(.85)}\n", ".cute-button-toggle{--bs-btn-hover-bg: transparent}\n"] }]
596
+ }], ctorParameters: () => [], propDecorators: { name: [{
597
+ type: Input
598
+ }], value: [{
599
+ type: Input
600
+ }], checked: [{
601
+ type: Input,
602
+ args: [{ transform: booleanAttribute }]
603
+ }], change: [{
604
+ type: Output
605
+ }] } });
606
+
607
+ /**
608
+ * @license Apache-2.0
609
+ *
610
+ * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
611
+ *
612
+ * You may not use this file except in compliance with the License
613
+ * that can be found at http://www.apache.org/licenses/LICENSE-2.0
614
+ */
615
+ const TYPES = [
616
+ CuteButtonToggle,
617
+ CuteButtonToggleGroup,
618
+ ];
619
+ class CuteButtonToggleModule {
620
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteButtonToggleModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
621
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: CuteButtonToggleModule, imports: [CommonModule, CuteButtonToggle,
622
+ CuteButtonToggleGroup], exports: [CuteButtonToggle,
623
+ CuteButtonToggleGroup] }); }
624
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteButtonToggleModule, imports: [CommonModule] }); }
625
+ }
626
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteButtonToggleModule, decorators: [{
627
+ type: NgModule,
628
+ args: [{
629
+ imports: [CommonModule, ...TYPES],
630
+ exports: TYPES,
631
+ declarations: [],
632
+ }]
633
+ }] });
634
+
635
+ /**
636
+ * Generated bundle index. Do not edit.
637
+ */
638
+
639
+ export { CUTE_BUTTON_TOGGLE_DEFAULT_OPTIONS, CUTE_BUTTON_TOGGLE_GROUP, CUTE_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR, CuteButtonToggle, CuteButtonToggleChange, CuteButtonToggleGroup, CuteButtonToggleModule };
640
+ //# sourceMappingURL=cute-widgets-base-button-toggle.mjs.map