@tailng-ui/components 0.1.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/README.md +83 -5
  2. package/package.json +9 -4
  3. package/src/lib/feedback/empty/tng-empty.component.d.ts.map +1 -1
  4. package/src/lib/feedback/empty/tng-empty.component.js +5 -0
  5. package/src/lib/feedback/empty/tng-empty.component.js.map +1 -1
  6. package/src/lib/feedback/progress-bar/tng-progress-bar.component.d.ts.map +1 -1
  7. package/src/lib/feedback/progress-bar/tng-progress-bar.component.js +1 -0
  8. package/src/lib/feedback/progress-bar/tng-progress-bar.component.js.map +1 -1
  9. package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.d.ts.map +1 -1
  10. package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.js +1 -0
  11. package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.js.map +1 -1
  12. package/src/lib/feedback/skeleton/tng-skeleton.component.d.ts.map +1 -1
  13. package/src/lib/feedback/skeleton/tng-skeleton.component.js +1 -0
  14. package/src/lib/feedback/skeleton/tng-skeleton.component.js.map +1 -1
  15. package/src/lib/feedback/toast/tng-toast.component.d.ts +55 -6
  16. package/src/lib/feedback/toast/tng-toast.component.d.ts.map +1 -1
  17. package/src/lib/feedback/toast/tng-toast.component.js +235 -23
  18. package/src/lib/feedback/toast/tng-toast.component.js.map +1 -1
  19. package/src/lib/form/autocomplete/tng-autocomplete.component.js +1 -1
  20. package/src/lib/form/autocomplete/tng-autocomplete.component.js.map +1 -1
  21. package/src/lib/form/button-toggle/tng-button-toggle-group.component.d.ts.map +1 -1
  22. package/src/lib/form/button-toggle/tng-button-toggle-group.component.js +1 -0
  23. package/src/lib/form/button-toggle/tng-button-toggle-group.component.js.map +1 -1
  24. package/src/lib/form/button-toggle/tng-button-toggle.component.d.ts.map +1 -1
  25. package/src/lib/form/button-toggle/tng-button-toggle.component.js +1 -0
  26. package/src/lib/form/button-toggle/tng-button-toggle.component.js.map +1 -1
  27. package/src/lib/form/checkbox/tng-checkbox.component.d.ts.map +1 -1
  28. package/src/lib/form/checkbox/tng-checkbox.component.js +1 -0
  29. package/src/lib/form/checkbox/tng-checkbox.component.js.map +1 -1
  30. package/src/lib/form/chips/tng-chips.component.d.ts +9 -1
  31. package/src/lib/form/chips/tng-chips.component.d.ts.map +1 -1
  32. package/src/lib/form/chips/tng-chips.component.js +40 -3
  33. package/src/lib/form/chips/tng-chips.component.js.map +1 -1
  34. package/src/lib/form/combobox/tng-combobox.component.d.ts.map +1 -1
  35. package/src/lib/form/combobox/tng-combobox.component.js +1 -0
  36. package/src/lib/form/combobox/tng-combobox.component.js.map +1 -1
  37. package/src/lib/form/index.d.ts +2 -2
  38. package/src/lib/form/index.d.ts.map +1 -1
  39. package/src/lib/form/index.js +2 -2
  40. package/src/lib/form/index.js.map +1 -1
  41. package/src/lib/form/input-otp/index.d.ts +3 -0
  42. package/src/lib/form/input-otp/index.d.ts.map +1 -0
  43. package/src/lib/form/input-otp/index.js +3 -0
  44. package/src/lib/form/input-otp/index.js.map +1 -0
  45. package/src/lib/form/input-otp/tng-input-otp.component.d.ts +79 -7
  46. package/src/lib/form/input-otp/tng-input-otp.component.d.ts.map +1 -1
  47. package/src/lib/form/input-otp/tng-input-otp.component.js +441 -81
  48. package/src/lib/form/input-otp/tng-input-otp.component.js.map +1 -1
  49. package/src/lib/form/label/tng-label.component.d.ts.map +1 -1
  50. package/src/lib/form/label/tng-label.component.js +1 -0
  51. package/src/lib/form/label/tng-label.component.js.map +1 -1
  52. package/src/lib/form/radio/tng-radio.component.d.ts +4 -0
  53. package/src/lib/form/radio/tng-radio.component.d.ts.map +1 -1
  54. package/src/lib/form/radio/tng-radio.component.js +16 -0
  55. package/src/lib/form/radio/tng-radio.component.js.map +1 -1
  56. package/src/lib/form/slider/tng-slider.component.d.ts.map +1 -1
  57. package/src/lib/form/slider/tng-slider.component.js +1 -0
  58. package/src/lib/form/slider/tng-slider.component.js.map +1 -1
  59. package/src/lib/form/switch/tng-switch.component.d.ts.map +1 -1
  60. package/src/lib/form/switch/tng-switch.component.js +1 -0
  61. package/src/lib/form/switch/tng-switch.component.js.map +1 -1
  62. package/src/lib/form/textarea/tng-textarea.component.d.ts +2 -0
  63. package/src/lib/form/textarea/tng-textarea.component.d.ts.map +1 -1
  64. package/src/lib/form/textarea/tng-textarea.component.js +8 -4
  65. package/src/lib/form/textarea/tng-textarea.component.js.map +1 -1
  66. package/src/lib/form/toggle/tng-toggle.component.d.ts.map +1 -1
  67. package/src/lib/form/toggle/tng-toggle.component.js +1 -0
  68. package/src/lib/form/toggle/tng-toggle.component.js.map +1 -1
  69. package/src/lib/form/toggle-group/tng-toggle-group.component.d.ts.map +1 -1
  70. package/src/lib/form/toggle-group/tng-toggle-group.component.js +1 -0
  71. package/src/lib/form/toggle-group/tng-toggle-group.component.js.map +1 -1
  72. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.d.ts.map +1 -1
  73. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.js +1 -0
  74. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.js.map +1 -1
  75. package/src/lib/layout/card/tng-card.component.d.ts.map +1 -1
  76. package/src/lib/layout/card/tng-card.component.js +10 -0
  77. package/src/lib/layout/card/tng-card.component.js.map +1 -1
  78. package/src/lib/layout/collapsible/tng-collapsible.component.d.ts.map +1 -1
  79. package/src/lib/layout/collapsible/tng-collapsible.component.js +1 -0
  80. package/src/lib/layout/collapsible/tng-collapsible.component.js.map +1 -1
  81. package/src/lib/layout/grid/tng-grid.component.d.ts.map +1 -1
  82. package/src/lib/layout/grid/tng-grid.component.js +1 -0
  83. package/src/lib/layout/grid/tng-grid.component.js.map +1 -1
  84. package/src/lib/layout/separator/tng-separator.component.d.ts.map +1 -1
  85. package/src/lib/layout/separator/tng-separator.component.js +1 -0
  86. package/src/lib/layout/separator/tng-separator.component.js.map +1 -1
  87. package/src/lib/layout/stepper/tng-stepper.component.d.ts.map +1 -1
  88. package/src/lib/layout/stepper/tng-stepper.component.js +1 -0
  89. package/src/lib/layout/stepper/tng-stepper.component.js.map +1 -1
  90. package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.d.ts +10 -0
  91. package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.d.ts.map +1 -1
  92. package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.js +53 -1
  93. package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.js.map +1 -1
  94. package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.d.ts.map +1 -1
  95. package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.js +1 -0
  96. package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.js.map +1 -1
  97. package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.d.ts.map +1 -1
  98. package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.js +1 -0
  99. package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.js.map +1 -1
  100. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.d.ts.map +1 -1
  101. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.js +1 -0
  102. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.js.map +1 -1
  103. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.d.ts.map +1 -1
  104. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.js +1 -0
  105. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.js.map +1 -1
  106. package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.d.ts.map +1 -1
  107. package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.js +1 -0
  108. package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.js.map +1 -1
  109. package/src/lib/navigation/context-menu/tng-context-menu.component.d.ts +1 -0
  110. package/src/lib/navigation/context-menu/tng-context-menu.component.d.ts.map +1 -1
  111. package/src/lib/navigation/context-menu/tng-context-menu.component.js +21 -4
  112. package/src/lib/navigation/context-menu/tng-context-menu.component.js.map +1 -1
  113. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.d.ts.map +1 -1
  114. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.js +1 -0
  115. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.js.map +1 -1
  116. package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.d.ts.map +1 -1
  117. package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.js +1 -0
  118. package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.js.map +1 -1
  119. package/src/lib/navigation/toolbar/tng-toolbar.component.d.ts.map +1 -1
  120. package/src/lib/navigation/toolbar/tng-toolbar.component.js +1 -0
  121. package/src/lib/navigation/toolbar/tng-toolbar.component.js.map +1 -1
  122. package/src/lib/overlay/dialog/tng-dialog.component.d.ts.map +1 -1
  123. package/src/lib/overlay/dialog/tng-dialog.component.js +1 -0
  124. package/src/lib/overlay/dialog/tng-dialog.component.js.map +1 -1
  125. package/src/lib/overlay/popover/tng-popover.component.d.ts +14 -19
  126. package/src/lib/overlay/popover/tng-popover.component.d.ts.map +1 -1
  127. package/src/lib/overlay/popover/tng-popover.component.js +25 -105
  128. package/src/lib/overlay/popover/tng-popover.component.js.map +1 -1
  129. package/src/lib/overlay/tng-overlay-focus-handoff.d.ts +10 -0
  130. package/src/lib/overlay/tng-overlay-focus-handoff.d.ts.map +1 -0
  131. package/src/lib/overlay/tng-overlay-focus-handoff.js +3 -0
  132. package/src/lib/overlay/tng-overlay-focus-handoff.js.map +1 -0
  133. package/src/lib/overlay/tng-overlay-runtime.d.ts +2 -2
  134. package/src/lib/overlay/tooltip/tng-tooltip.component.d.ts +1 -18
  135. package/src/lib/overlay/tooltip/tng-tooltip.component.d.ts.map +1 -1
  136. package/src/lib/overlay/tooltip/tng-tooltip.component.js +6 -85
  137. package/src/lib/overlay/tooltip/tng-tooltip.component.js.map +1 -1
  138. package/src/lib/utility/avatar/tng-avatar.component.d.ts.map +1 -1
  139. package/src/lib/utility/avatar/tng-avatar.component.js +9 -1
  140. package/src/lib/utility/avatar/tng-avatar.component.js.map +1 -1
  141. package/src/lib/utility/badge/tng-badge.component.d.ts.map +1 -1
  142. package/src/lib/utility/badge/tng-badge.component.js +1 -0
  143. package/src/lib/utility/badge/tng-badge.component.js.map +1 -1
  144. package/src/lib/utility/button/tng-button.component.d.ts.map +1 -1
  145. package/src/lib/utility/button/tng-button.component.js +1 -0
  146. package/src/lib/utility/button/tng-button.component.js.map +1 -1
  147. package/src/lib/utility/code-block/tng-code-block.component.d.ts.map +1 -1
  148. package/src/lib/utility/code-block/tng-code-block.component.js +1 -0
  149. package/src/lib/utility/code-block/tng-code-block.component.js.map +1 -1
  150. package/src/lib/utility/copy-button/tng-copy-button.component.d.ts.map +1 -1
  151. package/src/lib/utility/copy-button/tng-copy-button.component.js +1 -0
  152. package/src/lib/utility/copy-button/tng-copy-button.component.js.map +1 -1
  153. package/src/lib/utility/tag/tng-tag.component.d.ts +8 -0
  154. package/src/lib/utility/tag/tng-tag.component.d.ts.map +1 -1
  155. package/src/lib/utility/tag/tng-tag.component.js +17 -3
  156. package/src/lib/utility/tag/tng-tag.component.js.map +1 -1
  157. package/src/lib/utility/tree/tng-tree.component.d.ts.map +1 -1
  158. package/src/lib/utility/tree/tng-tree.component.js +1 -0
  159. package/src/lib/utility/tree/tng-tree.component.js.map +1 -1
@@ -1,6 +1,10 @@
1
1
  import { __decorate } from "tslib";
2
- import { Component, input, output, signal } from '@angular/core';
2
+ import { Component, effect, input, output, signal, viewChild } from '@angular/core';
3
+ import { createTngIdFactory, createTngKeyedTimerController, resolveFocusableElements, } from '@tailng-ui/cdk';
3
4
  import { TngToastItem as TngToastItemPrimitive, TngToastViewport as TngToastViewportPrimitive, } from '@tailng-ui/primitives';
5
+ import { tngOverlayFocusHandoff } from '../../overlay/tng-overlay-focus-handoff';
6
+ import { tngOverlayRuntime } from '../../overlay/tng-overlay-runtime';
7
+ const createToastLayerId = createTngIdFactory('tng-toast-layer');
4
8
  export function normalizeTngToastDuration(value, fallback) {
5
9
  if (!Number.isFinite(value) || value < 0) {
6
10
  return fallback;
@@ -22,16 +26,53 @@ export function resolveTngToastNextSlice(values, maxVisible) {
22
26
  export function shouldDismissTngToastForKey(key) {
23
27
  return key === 'Escape';
24
28
  }
29
+ function mapOverlayDismissReasonToToastDismissReason(reason) {
30
+ if (reason === 'escape-key') {
31
+ return 'escape';
32
+ }
33
+ return null;
34
+ }
35
+ function normalizeTngToastAction(action) {
36
+ if (action === null || action === undefined) {
37
+ return null;
38
+ }
39
+ const normalizedLabel = action.label.trim();
40
+ if (normalizedLabel.length === 0) {
41
+ return null;
42
+ }
43
+ return {
44
+ dismissOnSelect: action.dismissOnSelect ?? true,
45
+ label: normalizedLabel,
46
+ onSelect: action.onSelect,
47
+ };
48
+ }
25
49
  let TngToastComponent = class TngToastComponent {
26
- sequence = 0;
27
- timeoutByToastId = new Map();
50
+ createToastId = createTngIdFactory('tng-toast');
51
+ dismissTimers = createTngKeyedTimerController();
52
+ documentRef = typeof document === 'undefined' ? null : document;
53
+ overlayLayerId = createToastLayerId();
54
+ createToastFocusId = createTngIdFactory('tng-toast-focus', this.overlayLayerId);
55
+ isFocusLayerActive = false;
56
+ isFocusLayerRegistered = false;
57
+ isOverlayLayerRegistered = false;
28
58
  duration = input(4000);
29
59
  maxVisible = input(4);
30
60
  mode = input('toast');
31
61
  position = input('bottom-right');
32
62
  dismissed = output();
63
+ dismissedWithReason = output();
33
64
  toasts = signal([]);
34
- dismiss(id) {
65
+ viewportRef = viewChild('viewportRef');
66
+ overlayLayerEffect = effect(() => {
67
+ if (this.toasts().length > 0) {
68
+ this.registerOverlayLayer();
69
+ this.activateFocusLayer();
70
+ return;
71
+ }
72
+ this.deactivateFocusLayer();
73
+ this.unregisterOverlayLayer();
74
+ });
75
+ dismiss(id, reason = 'manual') {
35
76
  const currentToasts = this.toasts();
36
77
  const nextToasts = currentToasts.filter((toast) => toast.id !== id);
37
78
  if (nextToasts.length === currentToasts.length) {
@@ -39,20 +80,26 @@ let TngToastComponent = class TngToastComponent {
39
80
  }
40
81
  this.clearDismissTimer(id);
41
82
  this.toasts.set(nextToasts);
83
+ this.dismissedWithReason.emit({
84
+ id,
85
+ reason,
86
+ });
42
87
  this.dismissed.emit(id);
43
88
  }
44
89
  ngOnDestroy() {
45
- for (const timeoutId of this.timeoutByToastId.values()) {
46
- clearTimeout(timeoutId);
47
- }
48
- this.timeoutByToastId.clear();
90
+ this.overlayLayerEffect.destroy();
91
+ this.deactivateFocusLayer();
92
+ this.unregisterFocusLayer();
93
+ this.unregisterOverlayLayer();
94
+ this.dismissTimers.clearAll();
49
95
  }
50
96
  show(message, options = {}) {
51
- this.sequence += 1;
52
- const id = `tng-toast-${this.sequence}`;
97
+ const id = this.createToastId();
53
98
  const fallbackDuration = this.duration();
54
99
  const resolvedDuration = normalizeTngToastDuration(options.duration ?? fallbackDuration, fallbackDuration);
100
+ const resolvedAction = normalizeTngToastAction(options.action);
55
101
  const nextToast = {
102
+ action: resolvedAction,
56
103
  duration: resolvedDuration,
57
104
  id,
58
105
  message,
@@ -72,35 +119,200 @@ let TngToastComponent = class TngToastComponent {
72
119
  this.scheduleDismiss(nextToast);
73
120
  return id;
74
121
  }
75
- onToastKeydown(id, event) {
76
- if (!shouldDismissTngToastForKey(event.key)) {
122
+ onActionClick(toast) {
123
+ toast.action?.onSelect?.(toast.id);
124
+ if (toast.action?.dismissOnSelect ?? false) {
125
+ this.dismiss(toast.id, 'manual');
126
+ }
127
+ }
128
+ onViewportFocusin(event) {
129
+ const viewportElement = this.viewportRef()?.nativeElement;
130
+ if (viewportElement === undefined) {
77
131
  return;
78
132
  }
79
- event.preventDefault();
80
- this.dismiss(id);
133
+ const target = event.target;
134
+ if (!(target instanceof HTMLElement) || !viewportElement.contains(target)) {
135
+ return;
136
+ }
137
+ const targetId = this.ensureElementId(target);
138
+ tngOverlayFocusHandoff.recordFocus(this.overlayLayerId, targetId);
81
139
  }
82
140
  clearDismissTimer(id) {
83
- const timeoutId = this.timeoutByToastId.get(id);
84
- if (timeoutId === undefined) {
141
+ this.dismissTimers.cancel(id);
142
+ }
143
+ handleOverlayDismiss(reason) {
144
+ const dismissReason = mapOverlayDismissReasonToToastDismissReason(reason);
145
+ if (dismissReason === null) {
146
+ return;
147
+ }
148
+ const toastId = this.resolveEscapeDismissToastId();
149
+ if (toastId === null) {
150
+ return;
151
+ }
152
+ this.dismiss(toastId, dismissReason);
153
+ }
154
+ registerOverlayLayer() {
155
+ if (this.isOverlayLayerRegistered) {
156
+ return;
157
+ }
158
+ this.isOverlayLayerRegistered = true;
159
+ tngOverlayRuntime.registerLayer({
160
+ containsTarget: (target, path) => {
161
+ const viewportElement = this.viewportRef()?.nativeElement;
162
+ if (viewportElement === undefined) {
163
+ return false;
164
+ }
165
+ if (path.includes(viewportElement)) {
166
+ return true;
167
+ }
168
+ return target instanceof Node ? viewportElement.contains(target) : false;
169
+ },
170
+ dismissOnEscape: true,
171
+ dismissOnOutsidePointer: false,
172
+ id: this.overlayLayerId,
173
+ onDismiss: (reason) => {
174
+ this.handleOverlayDismiss(reason);
175
+ },
176
+ priority: -100,
177
+ });
178
+ }
179
+ resolveEscapeDismissToastId() {
180
+ const latestToast = this.toasts()[this.toasts().length - 1];
181
+ const fallbackToastId = latestToast?.id ?? null;
182
+ const viewportElement = this.viewportRef()?.nativeElement;
183
+ if (viewportElement === undefined || this.documentRef === null) {
184
+ return fallbackToastId;
185
+ }
186
+ const activeElement = this.documentRef.activeElement;
187
+ if (!(activeElement instanceof HTMLElement) || !viewportElement.contains(activeElement)) {
188
+ return fallbackToastId;
189
+ }
190
+ const focusedToast = activeElement.closest('[data-slot="toast-item"][data-toast-id]');
191
+ return focusedToast?.getAttribute('data-toast-id') ?? fallbackToastId;
192
+ }
193
+ activateFocusLayer() {
194
+ this.registerFocusLayer();
195
+ if (this.isFocusLayerActive) {
196
+ return;
197
+ }
198
+ this.isFocusLayerActive = true;
199
+ const activeElementId = this.resolveActiveElementId();
200
+ tngOverlayFocusHandoff.activateLayer(this.overlayLayerId, activeElementId);
201
+ }
202
+ deactivateFocusLayer() {
203
+ if (!this.isFocusLayerActive) {
204
+ return;
205
+ }
206
+ this.isFocusLayerActive = false;
207
+ const restoreFocusTargetId = tngOverlayFocusHandoff.deactivateLayer(this.overlayLayerId);
208
+ if (restoreFocusTargetId === null || !this.shouldRestoreFocus()) {
209
+ return;
210
+ }
211
+ const restoreElement = this.resolveElementById(restoreFocusTargetId);
212
+ restoreElement?.focus();
213
+ }
214
+ ensureElementId(element) {
215
+ const existingId = element.id.trim();
216
+ if (existingId.length > 0) {
217
+ return existingId;
218
+ }
219
+ const nextId = this.createToastFocusId();
220
+ element.id = nextId;
221
+ return nextId;
222
+ }
223
+ registerFocusLayer() {
224
+ if (this.isFocusLayerRegistered) {
225
+ return;
226
+ }
227
+ this.isFocusLayerRegistered = true;
228
+ tngOverlayFocusHandoff.registerLayer({
229
+ layerId: this.overlayLayerId,
230
+ members: () => {
231
+ const viewportElement = this.viewportRef()?.nativeElement;
232
+ if (viewportElement === undefined) {
233
+ return [];
234
+ }
235
+ return this.resolveFocusableMemberIds(viewportElement);
236
+ },
237
+ restoreFocus: true,
238
+ trapFocus: false,
239
+ });
240
+ }
241
+ resolveActiveElementId() {
242
+ if (this.documentRef === null) {
243
+ return null;
244
+ }
245
+ const activeElement = this.documentRef.activeElement;
246
+ if (!(activeElement instanceof HTMLElement)) {
247
+ return null;
248
+ }
249
+ return this.ensureElementId(activeElement);
250
+ }
251
+ resolveElementById(id) {
252
+ if (this.documentRef === null) {
253
+ return null;
254
+ }
255
+ const element = this.documentRef.getElementById(id);
256
+ return element instanceof HTMLElement ? element : null;
257
+ }
258
+ resolveFocusableMemberIds(viewportElement) {
259
+ const focusableMembers = resolveFocusableElements(viewportElement);
260
+ const ids = [];
261
+ const seenIds = new Set();
262
+ for (const member of focusableMembers) {
263
+ const id = this.ensureElementId(member);
264
+ if (seenIds.has(id)) {
265
+ continue;
266
+ }
267
+ seenIds.add(id);
268
+ ids.push(id);
269
+ }
270
+ return ids;
271
+ }
272
+ shouldRestoreFocus() {
273
+ if (this.documentRef === null) {
274
+ return false;
275
+ }
276
+ const viewportElement = this.viewportRef()?.nativeElement;
277
+ const activeElement = this.documentRef.activeElement;
278
+ if (!(activeElement instanceof HTMLElement)) {
279
+ return true;
280
+ }
281
+ if (activeElement === this.documentRef.body) {
282
+ return true;
283
+ }
284
+ if (viewportElement === undefined) {
285
+ return false;
286
+ }
287
+ return viewportElement.contains(activeElement);
288
+ }
289
+ unregisterFocusLayer() {
290
+ if (!this.isFocusLayerRegistered) {
291
+ return;
292
+ }
293
+ this.isFocusLayerRegistered = false;
294
+ tngOverlayFocusHandoff.unregisterLayer(this.overlayLayerId);
295
+ }
296
+ unregisterOverlayLayer() {
297
+ if (!this.isOverlayLayerRegistered) {
85
298
  return;
86
299
  }
87
- clearTimeout(timeoutId);
88
- this.timeoutByToastId.delete(id);
300
+ this.isOverlayLayerRegistered = false;
301
+ tngOverlayRuntime.unregisterLayer(this.overlayLayerId);
89
302
  }
90
303
  scheduleDismiss(toast) {
91
304
  this.clearDismissTimer(toast.id);
92
305
  if (toast.duration === 0) {
93
306
  return;
94
307
  }
95
- const timeoutId = setTimeout(() => {
96
- this.timeoutByToastId.delete(toast.id);
97
- this.dismiss(toast.id);
98
- }, toast.duration);
99
- this.timeoutByToastId.set(toast.id, timeoutId);
308
+ this.dismissTimers.schedule(toast.id, toast.duration, () => {
309
+ this.dismiss(toast.id, 'timeout');
310
+ });
100
311
  }
101
312
  };
102
313
  TngToastComponent = __decorate([
103
314
  Component({
315
+ standalone: true,
104
316
  selector: 'tng-toast',
105
317
  imports: [TngToastItemPrimitive, TngToastViewportPrimitive],
106
318
  templateUrl: './tng-toast.component.html',
@@ -1 +1 @@
1
- {"version":3,"file":"tng-toast.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/feedback/toast/tng-toast.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, input, output, signal } from '@angular/core';\nimport type { OnDestroy } from '@angular/core';\nimport type { TngToastTone } from '@tailng-ui/primitives';\nimport {\n TngToastItem as TngToastItemPrimitive,\n TngToastViewport as TngToastViewportPrimitive,\n} from '@tailng-ui/primitives';\n\nexport type TngToastMode = 'snackbar' | 'toast';\nexport type TngToastPosition = 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right';\n\nexport type TngToastOptions = Readonly<\n Partial<{\n duration: number;\n title: string | null;\n tone: TngToastTone;\n }>\n>;\n\ntype TngToastKeyboardEvent = Readonly<Pick<KeyboardEvent, 'key'>> &\n Readonly<{ preventDefault: () => void }>;\n\ntype TngToastRecord = Readonly<{\n duration: number;\n id: string;\n message: string;\n title: string | null;\n tone: TngToastTone;\n}>;\n\nexport function normalizeTngToastDuration(value: number, fallback: number): number {\n if (!Number.isFinite(value) || value < 0) {\n return fallback;\n }\n\n return value;\n}\n\nexport function normalizeTngToastMaxVisible(value: number): number {\n if (!Number.isFinite(value) || value < 1) {\n return 1;\n }\n\n return Math.floor(value);\n}\n\nexport function resolveTngToastNextSlice<TValue>(\n values: readonly TValue[],\n maxVisible: number,\n): readonly TValue[] {\n if (values.length <= maxVisible) {\n return values;\n }\n\n return values.slice(values.length - maxVisible);\n}\n\nexport function shouldDismissTngToastForKey(key: string): boolean {\n return key === 'Escape';\n}\n\n@Component({\n selector: 'tng-toast',\n imports: [TngToastItemPrimitive, TngToastViewportPrimitive],\n templateUrl: './tng-toast.component.html',\n styleUrl: './tng-toast.component.css',\n})\nexport class TngToastComponent implements OnDestroy {\n private sequence = 0;\n private readonly timeoutByToastId = new Map<string, ReturnType<typeof setTimeout>>();\n\n public readonly duration = input<number>(4000);\n public readonly maxVisible = input<number>(4);\n public readonly mode = input<TngToastMode>('toast');\n public readonly position = input<TngToastPosition>('bottom-right');\n\n public readonly dismissed = output<string>();\n protected readonly toasts = signal<readonly TngToastRecord[]>([]);\n\n public dismiss(id: string): void {\n const currentToasts = this.toasts();\n const nextToasts = currentToasts.filter((toast) => toast.id !== id);\n if (nextToasts.length === currentToasts.length) {\n return;\n }\n\n this.clearDismissTimer(id);\n this.toasts.set(nextToasts);\n this.dismissed.emit(id);\n }\n\n public ngOnDestroy(): void {\n for (const timeoutId of this.timeoutByToastId.values()) {\n clearTimeout(timeoutId);\n }\n\n this.timeoutByToastId.clear();\n }\n\n public show(message: string, options: TngToastOptions = {}): string {\n this.sequence += 1;\n const id = `tng-toast-${this.sequence}`;\n const fallbackDuration = this.duration();\n const resolvedDuration = normalizeTngToastDuration(\n options.duration ?? fallbackDuration,\n fallbackDuration,\n );\n const nextToast: TngToastRecord = {\n duration: resolvedDuration,\n id,\n message,\n title: options.title ?? null,\n tone: options.tone ?? 'neutral',\n };\n\n const previousToasts = this.toasts();\n const visibleLimit = normalizeTngToastMaxVisible(this.maxVisible());\n const nextToasts = resolveTngToastNextSlice([...previousToasts, nextToast], visibleLimit);\n const nextIds = new Set(nextToasts.map((toast) => toast.id));\n\n for (const previousToast of previousToasts) {\n if (!nextIds.has(previousToast.id)) {\n this.clearDismissTimer(previousToast.id);\n }\n }\n\n this.toasts.set(nextToasts);\n this.scheduleDismiss(nextToast);\n return id;\n }\n\n protected onToastKeydown(id: string, event: TngToastKeyboardEvent): void {\n if (!shouldDismissTngToastForKey(event.key)) {\n return;\n }\n\n event.preventDefault();\n this.dismiss(id);\n }\n\n private clearDismissTimer(id: string): void {\n const timeoutId = this.timeoutByToastId.get(id);\n if (timeoutId === undefined) {\n return;\n }\n\n clearTimeout(timeoutId);\n this.timeoutByToastId.delete(id);\n }\n\n private scheduleDismiss(toast: TngToastRecord): void {\n this.clearDismissTimer(toast.id);\n if (toast.duration === 0) {\n return;\n }\n\n const timeoutId = setTimeout(() => {\n this.timeoutByToastId.delete(toast.id);\n this.dismiss(toast.id);\n }, toast.duration);\n\n this.timeoutByToastId.set(toast.id, timeoutId);\n }\n}\n"]}
1
+ {"version":3,"file":"tng-toast.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/feedback/toast/tng-toast.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, effect, input, output, signal, viewChild } from '@angular/core';\nimport type { OnDestroy } from '@angular/core';\nimport {\n createTngIdFactory,\n createTngKeyedTimerController,\n resolveFocusableElements,\n} from '@tailng-ui/cdk';\nimport type { ElementRef } from '@angular/core';\nimport type { TngOverlayDismissReason } from '@tailng-ui/cdk';\nimport type { TngToastTone } from '@tailng-ui/primitives';\nimport {\n TngToastItem as TngToastItemPrimitive,\n TngToastViewport as TngToastViewportPrimitive,\n} from '@tailng-ui/primitives';\nimport { tngOverlayFocusHandoff } from '../../overlay/tng-overlay-focus-handoff';\nimport { tngOverlayRuntime } from '../../overlay/tng-overlay-runtime';\n\nexport type TngToastMode = 'snackbar' | 'toast';\nexport type TngToastPosition = 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right';\nexport type TngToastDismissReason = 'escape' | 'manual' | 'timeout';\n\nexport type TngToastDismissEvent = Readonly<{\n id: string;\n reason: TngToastDismissReason;\n}>;\n\nexport type TngToastAction = Readonly<{\n dismissOnSelect: boolean;\n label: string;\n onSelect?: (id: string) => void;\n}>;\n\nexport type TngToastActionOptions = Readonly<{\n dismissOnSelect?: boolean;\n label: string;\n onSelect?: (id: string) => void;\n}>;\n\nexport type TngToastOptions = Readonly<\n Partial<{\n action: TngToastActionOptions | null;\n duration: number;\n title: string | null;\n tone: TngToastTone;\n }>\n>;\n\ntype TngToastRecord = Readonly<{\n action: TngToastAction | null;\n duration: number;\n id: string;\n message: string;\n title: string | null;\n tone: TngToastTone;\n}>;\n\nconst createToastLayerId = createTngIdFactory('tng-toast-layer');\n\nexport function normalizeTngToastDuration(value: number, fallback: number): number {\n if (!Number.isFinite(value) || value < 0) {\n return fallback;\n }\n\n return value;\n}\n\nexport function normalizeTngToastMaxVisible(value: number): number {\n if (!Number.isFinite(value) || value < 1) {\n return 1;\n }\n\n return Math.floor(value);\n}\n\nexport function resolveTngToastNextSlice<TValue>(\n values: readonly TValue[],\n maxVisible: number,\n): readonly TValue[] {\n if (values.length <= maxVisible) {\n return values;\n }\n\n return values.slice(values.length - maxVisible);\n}\n\nexport function shouldDismissTngToastForKey(key: string): boolean {\n return key === 'Escape';\n}\n\nfunction mapOverlayDismissReasonToToastDismissReason(\n reason: TngOverlayDismissReason,\n): TngToastDismissReason | null {\n if (reason === 'escape-key') {\n return 'escape';\n }\n\n return null;\n}\n\nfunction normalizeTngToastAction(\n action: TngToastActionOptions | null | undefined,\n): TngToastAction | null {\n if (action === null || action === undefined) {\n return null;\n }\n\n const normalizedLabel = action.label.trim();\n if (normalizedLabel.length === 0) {\n return null;\n }\n\n return {\n dismissOnSelect: action.dismissOnSelect ?? true,\n label: normalizedLabel,\n onSelect: action.onSelect,\n };\n}\n\n@Component({\n standalone: true,\n selector: 'tng-toast',\n imports: [TngToastItemPrimitive, TngToastViewportPrimitive],\n templateUrl: './tng-toast.component.html',\n styleUrl: './tng-toast.component.css',\n})\nexport class TngToastComponent implements OnDestroy {\n private readonly createToastId = createTngIdFactory('tng-toast');\n private readonly dismissTimers = createTngKeyedTimerController<string>();\n private readonly documentRef = typeof document === 'undefined' ? null : document;\n private readonly overlayLayerId = createToastLayerId();\n private readonly createToastFocusId = createTngIdFactory('tng-toast-focus', this.overlayLayerId);\n private isFocusLayerActive = false;\n private isFocusLayerRegistered = false;\n private isOverlayLayerRegistered = false;\n\n public readonly duration = input<number>(4000);\n public readonly maxVisible = input<number>(4);\n public readonly mode = input<TngToastMode>('toast');\n public readonly position = input<TngToastPosition>('bottom-right');\n\n public readonly dismissed = output<string>();\n public readonly dismissedWithReason = output<TngToastDismissEvent>();\n protected readonly toasts = signal<readonly TngToastRecord[]>([]);\n protected readonly viewportRef = viewChild<ElementRef<HTMLElement>>('viewportRef');\n\n private readonly overlayLayerEffect = effect((): void => {\n if (this.toasts().length > 0) {\n this.registerOverlayLayer();\n this.activateFocusLayer();\n return;\n }\n\n this.deactivateFocusLayer();\n this.unregisterOverlayLayer();\n });\n\n public dismiss(id: string, reason: TngToastDismissReason = 'manual'): void {\n const currentToasts = this.toasts();\n const nextToasts = currentToasts.filter((toast) => toast.id !== id);\n if (nextToasts.length === currentToasts.length) {\n return;\n }\n\n this.clearDismissTimer(id);\n this.toasts.set(nextToasts);\n this.dismissedWithReason.emit({\n id,\n reason,\n });\n this.dismissed.emit(id);\n }\n\n public ngOnDestroy(): void {\n this.overlayLayerEffect.destroy();\n this.deactivateFocusLayer();\n this.unregisterFocusLayer();\n this.unregisterOverlayLayer();\n this.dismissTimers.clearAll();\n }\n\n public show(message: string, options: TngToastOptions = {}): string {\n const id = this.createToastId();\n const fallbackDuration = this.duration();\n const resolvedDuration = normalizeTngToastDuration(\n options.duration ?? fallbackDuration,\n fallbackDuration,\n );\n const resolvedAction = normalizeTngToastAction(options.action);\n const nextToast: TngToastRecord = {\n action: resolvedAction,\n duration: resolvedDuration,\n id,\n message,\n title: options.title ?? null,\n tone: options.tone ?? 'neutral',\n };\n\n const previousToasts = this.toasts();\n const visibleLimit = normalizeTngToastMaxVisible(this.maxVisible());\n const nextToasts = resolveTngToastNextSlice([...previousToasts, nextToast], visibleLimit);\n const nextIds = new Set(nextToasts.map((toast) => toast.id));\n\n for (const previousToast of previousToasts) {\n if (!nextIds.has(previousToast.id)) {\n this.clearDismissTimer(previousToast.id);\n }\n }\n\n this.toasts.set(nextToasts);\n this.scheduleDismiss(nextToast);\n return id;\n }\n\n protected onActionClick(toast: TngToastRecord): void {\n toast.action?.onSelect?.(toast.id);\n if (toast.action?.dismissOnSelect ?? false) {\n this.dismiss(toast.id, 'manual');\n }\n }\n\n protected onViewportFocusin(event: FocusEvent): void {\n const viewportElement = this.viewportRef()?.nativeElement;\n if (viewportElement === undefined) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof HTMLElement) || !viewportElement.contains(target)) {\n return;\n }\n\n const targetId = this.ensureElementId(target);\n tngOverlayFocusHandoff.recordFocus(this.overlayLayerId, targetId);\n }\n\n private clearDismissTimer(id: string): void {\n this.dismissTimers.cancel(id);\n }\n\n private handleOverlayDismiss(reason: TngOverlayDismissReason): void {\n const dismissReason = mapOverlayDismissReasonToToastDismissReason(reason);\n if (dismissReason === null) {\n return;\n }\n\n const toastId = this.resolveEscapeDismissToastId();\n if (toastId === null) {\n return;\n }\n\n this.dismiss(toastId, dismissReason);\n }\n\n private registerOverlayLayer(): void {\n if (this.isOverlayLayerRegistered) {\n return;\n }\n\n this.isOverlayLayerRegistered = true;\n tngOverlayRuntime.registerLayer({\n containsTarget: (target: unknown, path: readonly unknown[]): boolean => {\n const viewportElement = this.viewportRef()?.nativeElement;\n if (viewportElement === undefined) {\n return false;\n }\n\n if (path.includes(viewportElement)) {\n return true;\n }\n\n return target instanceof Node ? viewportElement.contains(target) : false;\n },\n dismissOnEscape: true,\n dismissOnOutsidePointer: false,\n id: this.overlayLayerId,\n onDismiss: (reason: TngOverlayDismissReason): void => {\n this.handleOverlayDismiss(reason);\n },\n priority: -100,\n });\n }\n\n private resolveEscapeDismissToastId(): string | null {\n const latestToast = this.toasts()[this.toasts().length - 1];\n const fallbackToastId = latestToast?.id ?? null;\n\n const viewportElement = this.viewportRef()?.nativeElement;\n if (viewportElement === undefined || this.documentRef === null) {\n return fallbackToastId;\n }\n\n const activeElement = this.documentRef.activeElement;\n if (!(activeElement instanceof HTMLElement) || !viewportElement.contains(activeElement)) {\n return fallbackToastId;\n }\n\n const focusedToast = activeElement.closest<HTMLElement>('[data-slot=\"toast-item\"][data-toast-id]');\n return focusedToast?.getAttribute('data-toast-id') ?? fallbackToastId;\n }\n\n private activateFocusLayer(): void {\n this.registerFocusLayer();\n if (this.isFocusLayerActive) {\n return;\n }\n\n this.isFocusLayerActive = true;\n const activeElementId = this.resolveActiveElementId();\n tngOverlayFocusHandoff.activateLayer(this.overlayLayerId, activeElementId);\n }\n\n private deactivateFocusLayer(): void {\n if (!this.isFocusLayerActive) {\n return;\n }\n\n this.isFocusLayerActive = false;\n const restoreFocusTargetId = tngOverlayFocusHandoff.deactivateLayer(this.overlayLayerId);\n if (restoreFocusTargetId === null || !this.shouldRestoreFocus()) {\n return;\n }\n\n const restoreElement = this.resolveElementById(restoreFocusTargetId);\n restoreElement?.focus();\n }\n\n private ensureElementId(element: HTMLElement): string {\n const existingId = element.id.trim();\n if (existingId.length > 0) {\n return existingId;\n }\n\n const nextId = this.createToastFocusId();\n element.id = nextId;\n return nextId;\n }\n\n private registerFocusLayer(): void {\n if (this.isFocusLayerRegistered) {\n return;\n }\n\n this.isFocusLayerRegistered = true;\n tngOverlayFocusHandoff.registerLayer({\n layerId: this.overlayLayerId,\n members: (): readonly string[] => {\n const viewportElement = this.viewportRef()?.nativeElement;\n if (viewportElement === undefined) {\n return [];\n }\n\n return this.resolveFocusableMemberIds(viewportElement);\n },\n restoreFocus: true,\n trapFocus: false,\n });\n }\n\n private resolveActiveElementId(): string | null {\n if (this.documentRef === null) {\n return null;\n }\n\n const activeElement = this.documentRef.activeElement;\n if (!(activeElement instanceof HTMLElement)) {\n return null;\n }\n\n return this.ensureElementId(activeElement);\n }\n\n private resolveElementById(id: string): HTMLElement | null {\n if (this.documentRef === null) {\n return null;\n }\n\n const element = this.documentRef.getElementById(id);\n return element instanceof HTMLElement ? element : null;\n }\n\n private resolveFocusableMemberIds(viewportElement: HTMLElement): readonly string[] {\n const focusableMembers = resolveFocusableElements(viewportElement);\n const ids: string[] = [];\n const seenIds = new Set<string>();\n\n for (const member of focusableMembers) {\n const id = this.ensureElementId(member);\n if (seenIds.has(id)) {\n continue;\n }\n\n seenIds.add(id);\n ids.push(id);\n }\n\n return ids;\n }\n\n private shouldRestoreFocus(): boolean {\n if (this.documentRef === null) {\n return false;\n }\n\n const viewportElement = this.viewportRef()?.nativeElement;\n const activeElement = this.documentRef.activeElement;\n if (!(activeElement instanceof HTMLElement)) {\n return true;\n }\n\n if (activeElement === this.documentRef.body) {\n return true;\n }\n\n if (viewportElement === undefined) {\n return false;\n }\n\n return viewportElement.contains(activeElement);\n }\n\n private unregisterFocusLayer(): void {\n if (!this.isFocusLayerRegistered) {\n return;\n }\n\n this.isFocusLayerRegistered = false;\n tngOverlayFocusHandoff.unregisterLayer(this.overlayLayerId);\n }\n\n private unregisterOverlayLayer(): void {\n if (!this.isOverlayLayerRegistered) {\n return;\n }\n\n this.isOverlayLayerRegistered = false;\n tngOverlayRuntime.unregisterLayer(this.overlayLayerId);\n }\n\n private scheduleDismiss(toast: TngToastRecord): void {\n this.clearDismissTimer(toast.id);\n if (toast.duration === 0) {\n return;\n }\n\n this.dismissTimers.schedule(toast.id, toast.duration, () => {\n this.dismiss(toast.id, 'timeout');\n });\n }\n}\n"]}
@@ -41,7 +41,7 @@ let TngAutocompleteComponent = class TngAutocompleteComponent {
41
41
  });
42
42
  selectedLabel = computed(() => {
43
43
  const opt = this.selectedOption();
44
- return opt ? this.getOptionLabel()(opt) : this.placeholder();
44
+ return opt ? this.getOptionLabel()(opt) : '';
45
45
  });
46
46
  filteredOptions = computed(() => {
47
47
  const q = this.query().toLowerCase().trim();
@@ -1 +1 @@
1
- {"version":3,"file":"tng-autocomplete.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/autocomplete/tng-autocomplete.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n computed,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\n\nimport {\n TngAutocomplete,\n TngAutocompleteTrigger,\n TngAutocompleteTriggerContainer,\n TngAutocompleteIcon,\n TngAutocompleteContent,\n TngAutocompleteOverlay,\n TngAutocompleteListbox,\n TngAutocompleteOption,\n} from '@tailng-ui/primitives';\n\nexport type TngAutocompleteGetValue<O, V> = (opt: O) => V;\nexport type TngAutocompleteGetLabel<O> = (opt: O) => string;\nexport type TngAutocompleteIsDisabled<O> = (opt: O) => boolean;\nexport type TngAutocompleteTrackBy<O> = (index: number, opt: O) => unknown;\n\n@Component({\n selector: 'tng-autocomplete',\n standalone: true,\n imports: [\n TngAutocompleteTrigger,\n TngAutocompleteTriggerContainer,\n TngAutocompleteIcon,\n TngAutocompleteContent,\n TngAutocompleteOverlay,\n TngAutocompleteListbox,\n TngAutocompleteOption,\n ],\n hostDirectives: [\n {\n directive: TngAutocomplete,\n inputs: [\n 'open',\n 'value',\n 'disabled',\n 'loading',\n 'invalid',\n 'labelId',\n 'descriptionId',\n 'errorId',\n ],\n outputs: ['openChange', 'valueChange'],\n },\n ],\n templateUrl: './tng-autocomplete.component.html',\n styleUrl: './tng-autocomplete.component.css',\n})\nexport class TngAutocompleteComponent<O = unknown, V = unknown> {\n protected readonly primitive = inject<TngAutocomplete<V>>(TngAutocomplete);\n\n readonly options = input<readonly O[]>([]);\n readonly placeholder = input<string>('Type to search…');\n\n readonly getOptionValue = input<TngAutocompleteGetValue<O, V>>(\n ((opt: unknown) => (opt as { value?: V })?.value) as TngAutocompleteGetValue<O, V>,\n );\n readonly getOptionLabel = input<TngAutocompleteGetLabel<O>>(\n ((opt: unknown) =>\n String(\n (opt as { label?: string; value?: unknown })?.label ??\n (opt as { value?: unknown })?.value ??\n opt,\n )) as TngAutocompleteGetLabel<O>,\n );\n readonly isOptionDisabled = input<TngAutocompleteIsDisabled<O>>(\n ((opt: unknown) => !!(opt as { disabled?: boolean })?.disabled) as TngAutocompleteIsDisabled<O>,\n );\n /** Default: track by value, id, or option (stable identity for async/replaced options). */\n readonly trackBy = input<TngAutocompleteTrackBy<O>>((_, opt) => {\n const o = opt as Record<string, unknown> | null | undefined;\n return o?.['value'] ?? o?.['id'] ?? opt;\n });\n\n readonly iconText = input<string>('▾');\n\n readonly ariaLabel = input<string>('Autocomplete');\n\n protected readonly query = signal('');\n\n constructor() {\n effect(() => {\n const v = this.primitive.value();\n const open = this.primitive.open();\n if (!open) {\n const opt = this.findOption(v);\n this.query.set(opt ? this.getOptionLabel()(opt) : '');\n }\n });\n }\n\n protected readonly selectedOption = computed<O | null>(() => {\n const v = this.primitive.value();\n if (v === null) return null;\n const getV = this.getOptionValue();\n for (const opt of this.options()) {\n if (Object.is(getV(opt), v)) return opt;\n }\n return null;\n });\n\n protected readonly selectedLabel = computed<string>(() => {\n const opt = this.selectedOption();\n return opt ? this.getOptionLabel()(opt) : this.placeholder();\n });\n\n protected readonly filteredOptions = computed<readonly O[]>(() => {\n const q = this.query().toLowerCase().trim();\n const list = this.options();\n if (!q) return list;\n const getLabel = this.getOptionLabel();\n return list.filter((opt) =>\n getLabel(opt).toLowerCase().includes(q),\n );\n });\n\n protected readonly displayText = computed<string>(() =>\n this.primitive.open() ? this.query() : this.selectedLabel(),\n );\n\n protected onInput(ev: Event): void {\n const val = (ev.target as HTMLInputElement).value;\n this.query.set(val);\n }\n\n private findOption(value: V | null): O | null {\n if (value === null) return null;\n const getV = this.getOptionValue();\n for (const opt of this.options()) {\n if (Object.is(getV(opt), value)) return opt;\n }\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"tng-autocomplete.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/autocomplete/tng-autocomplete.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n computed,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\n\nimport {\n TngAutocomplete,\n TngAutocompleteTrigger,\n TngAutocompleteTriggerContainer,\n TngAutocompleteIcon,\n TngAutocompleteContent,\n TngAutocompleteOverlay,\n TngAutocompleteListbox,\n TngAutocompleteOption,\n} from '@tailng-ui/primitives';\n\nexport type TngAutocompleteGetValue<O, V> = (opt: O) => V;\nexport type TngAutocompleteGetLabel<O> = (opt: O) => string;\nexport type TngAutocompleteIsDisabled<O> = (opt: O) => boolean;\nexport type TngAutocompleteTrackBy<O> = (index: number, opt: O) => unknown;\n\n@Component({\n selector: 'tng-autocomplete',\n standalone: true,\n imports: [\n TngAutocompleteTrigger,\n TngAutocompleteTriggerContainer,\n TngAutocompleteIcon,\n TngAutocompleteContent,\n TngAutocompleteOverlay,\n TngAutocompleteListbox,\n TngAutocompleteOption,\n ],\n hostDirectives: [\n {\n directive: TngAutocomplete,\n inputs: [\n 'open',\n 'value',\n 'disabled',\n 'loading',\n 'invalid',\n 'labelId',\n 'descriptionId',\n 'errorId',\n ],\n outputs: ['openChange', 'valueChange'],\n },\n ],\n templateUrl: './tng-autocomplete.component.html',\n styleUrl: './tng-autocomplete.component.css',\n})\nexport class TngAutocompleteComponent<O = unknown, V = unknown> {\n protected readonly primitive = inject<TngAutocomplete<V>>(TngAutocomplete);\n\n readonly options = input<readonly O[]>([]);\n readonly placeholder = input<string>('Type to search…');\n\n readonly getOptionValue = input<TngAutocompleteGetValue<O, V>>(\n ((opt: unknown) => (opt as { value?: V })?.value) as TngAutocompleteGetValue<O, V>,\n );\n readonly getOptionLabel = input<TngAutocompleteGetLabel<O>>(\n ((opt: unknown) =>\n String(\n (opt as { label?: string; value?: unknown })?.label ??\n (opt as { value?: unknown })?.value ??\n opt,\n )) as TngAutocompleteGetLabel<O>,\n );\n readonly isOptionDisabled = input<TngAutocompleteIsDisabled<O>>(\n ((opt: unknown) => !!(opt as { disabled?: boolean })?.disabled) as TngAutocompleteIsDisabled<O>,\n );\n /** Default: track by value, id, or option (stable identity for async/replaced options). */\n readonly trackBy = input<TngAutocompleteTrackBy<O>>((_, opt) => {\n const o = opt as Record<string, unknown> | null | undefined;\n return o?.['value'] ?? o?.['id'] ?? opt;\n });\n\n readonly iconText = input<string>('▾');\n\n readonly ariaLabel = input<string>('Autocomplete');\n\n protected readonly query = signal('');\n\n constructor() {\n effect(() => {\n const v = this.primitive.value();\n const open = this.primitive.open();\n if (!open) {\n const opt = this.findOption(v);\n this.query.set(opt ? this.getOptionLabel()(opt) : '');\n }\n });\n }\n\n protected readonly selectedOption = computed<O | null>(() => {\n const v = this.primitive.value();\n if (v === null) return null;\n const getV = this.getOptionValue();\n for (const opt of this.options()) {\n if (Object.is(getV(opt), v)) return opt;\n }\n return null;\n });\n\n protected readonly selectedLabel = computed<string>(() => {\n const opt = this.selectedOption();\n return opt ? this.getOptionLabel()(opt) : '';\n });\n\n protected readonly filteredOptions = computed<readonly O[]>(() => {\n const q = this.query().toLowerCase().trim();\n const list = this.options();\n if (!q) return list;\n const getLabel = this.getOptionLabel();\n return list.filter((opt) =>\n getLabel(opt).toLowerCase().includes(q),\n );\n });\n\n protected readonly displayText = computed<string>(() =>\n this.primitive.open() ? this.query() : this.selectedLabel(),\n );\n\n protected onInput(ev: Event): void {\n const val = (ev.target as HTMLInputElement).value;\n this.query.set(val);\n }\n\n private findOption(value: V | null): O | null {\n if (value === null) return null;\n const getV = this.getOptionValue();\n for (const opt of this.options()) {\n if (Object.is(getV(opt), value)) return opt;\n }\n return null;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tng-button-toggle-group.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/button-toggle/tng-button-toggle-group.component.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAE/B,KAAK,wBAAwB,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AACvD,KAAK,0BAA0B,GAAG,YAAY,GAAG,UAAU,CAAC;AAC5D,KAAK,mBAAmB,GAAG,UAAU,GAAG,QAAQ,CAAC;AACjD,KAAK,6BAA6B,GAAG,MAAM,GAAG,QAAQ,CAAC;AA6CvD,qBAMa,6BAA6B;IACxC,SAAgB,SAAS,8CAAwC;IAEjE,SAAgB,IAAI,2DAAwC;IAC5D,SAAgB,UAAU,qEAAgD;IAC1E,SAAgB,WAAW,kEAAmD;IAC9E,SAAgB,GAAG,gEAA2C;IAC9D,SAAgB,UAAU,qEAEvB;IACH,SAAgB,QAAQ,qEAErB;IACH,SAAgB,IAAI,qEAEjB;IAEH,SAAgB,UAAU,qGAGvB;IACH,SAAgB,WAAW,yGAMzB;IACF,SAAgB,iBAAiB,qGAM/B;IACF,SAAgB,kBAAkB,yGAMhC;IAEF,SAAgB,kBAAkB,qGAMhC;IACF,SAAgB,mBAAmB,yGAMjC;IACF,SAAgB,yBAAyB,qGAMvC;IACF,SAAgB,0BAA0B,yGAMvC;IAEH,SAAgB,WAAW,wEAAyC;IACpE,SAAgB,YAAY,4EAA6C;IACzE,SAAgB,YAAY;;;;;;;QAAwC;IACpE,SAAgB,WAAW;;;;QAA6C;IAExE,SAAS,CAAC,aAAa,IAAI,oBAAoB,GAAG,IAAI,GAAG,SAAS;IASlE,SAAS,CAAC,cAAc,IAAI,SAAS,oBAAoB,EAAE,GAAG,SAAS;IASvE,SAAS,CAAC,oBAAoB,IAAI,oBAAoB,GAAG,IAAI,GAAG,SAAS;IASzE,SAAS,CAAC,qBAAqB,IAAI,SAAS,oBAAoB,EAAE,GAAG,SAAS;CAQ/E"}
1
+ {"version":3,"file":"tng-button-toggle-group.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/button-toggle/tng-button-toggle-group.component.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAE/B,KAAK,wBAAwB,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AACvD,KAAK,0BAA0B,GAAG,YAAY,GAAG,UAAU,CAAC;AAC5D,KAAK,mBAAmB,GAAG,UAAU,GAAG,QAAQ,CAAC;AACjD,KAAK,6BAA6B,GAAG,MAAM,GAAG,QAAQ,CAAC;AA6CvD,qBAOa,6BAA6B;IACxC,SAAgB,SAAS,8CAAwC;IAEjE,SAAgB,IAAI,2DAAwC;IAC5D,SAAgB,UAAU,qEAAgD;IAC1E,SAAgB,WAAW,kEAAmD;IAC9E,SAAgB,GAAG,gEAA2C;IAC9D,SAAgB,UAAU,qEAEvB;IACH,SAAgB,QAAQ,qEAErB;IACH,SAAgB,IAAI,qEAEjB;IAEH,SAAgB,UAAU,qGAGvB;IACH,SAAgB,WAAW,yGAMzB;IACF,SAAgB,iBAAiB,qGAM/B;IACF,SAAgB,kBAAkB,yGAMhC;IAEF,SAAgB,kBAAkB,qGAMhC;IACF,SAAgB,mBAAmB,yGAMjC;IACF,SAAgB,yBAAyB,qGAMvC;IACF,SAAgB,0BAA0B,yGAMvC;IAEH,SAAgB,WAAW,wEAAyC;IACpE,SAAgB,YAAY,4EAA6C;IACzE,SAAgB,YAAY;;;;;;;QAAwC;IACpE,SAAgB,WAAW;;;;QAA6C;IAExE,SAAS,CAAC,aAAa,IAAI,oBAAoB,GAAG,IAAI,GAAG,SAAS;IASlE,SAAS,CAAC,cAAc,IAAI,SAAS,oBAAoB,EAAE,GAAG,SAAS;IASvE,SAAS,CAAC,oBAAoB,IAAI,oBAAoB,GAAG,IAAI,GAAG,SAAS;IASzE,SAAS,CAAC,qBAAqB,IAAI,SAAS,oBAAoB,EAAE,GAAG,SAAS;CAQ/E"}
@@ -113,6 +113,7 @@ let TngButtonToggleGroupComponent = class TngButtonToggleGroupComponent {
113
113
  };
114
114
  TngButtonToggleGroupComponent = __decorate([
115
115
  Component({
116
+ standalone: true,
116
117
  selector: 'tng-button-toggle-group',
117
118
  imports: [TngButtonToggleGroupPrimitive],
118
119
  templateUrl: './tng-button-toggle-group.component.html',
@@ -1 +1 @@
1
- {"version":3,"file":"tng-button-toggle-group.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/button-toggle/tng-button-toggle-group.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n booleanAttribute,\n input,\n output,\n} from '@angular/core';\nimport {\n TngButtonToggleChangeEvent,\n TngButtonToggleFocusChangeEvent,\n TngButtonToggleGroup as TngButtonToggleGroupPrimitive,\n type TngButtonToggleValue,\n} from '@tailng-ui/primitives';\n\ntype TngButtonToggleDirection = 'auto' | 'ltr' | 'rtl';\ntype TngButtonToggleOrientation = 'horizontal' | 'vertical';\ntype TngButtonToggleType = 'multiple' | 'single';\ntype TngButtonToggleActivationMode = 'auto' | 'manual';\n\nfunction normalizeOptionalButtonToggleValue(\n value: unknown,\n): TngButtonToggleValue | null | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (value === null) {\n return null;\n }\n\n if (typeof value === 'number' || typeof value === 'string') {\n return value;\n }\n\n return String(value);\n}\n\nfunction normalizeOptionalButtonToggleValues(\n value: unknown,\n): readonly TngButtonToggleValue[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (value === null) {\n return [];\n }\n\n if (Array.isArray(value)) {\n return value\n .map((item) => normalizeOptionalButtonToggleValue(item))\n .filter((item): item is TngButtonToggleValue => item !== null && item !== undefined);\n }\n\n const normalized = normalizeOptionalButtonToggleValue(value);\n if (normalized === null || normalized === undefined) {\n return [];\n }\n\n return [normalized];\n}\n\n@Component({\n selector: 'tng-button-toggle-group',\n imports: [TngButtonToggleGroupPrimitive],\n templateUrl: './tng-button-toggle-group.component.html',\n styleUrl: './tng-button-toggle-group.component.css',\n})\nexport class TngButtonToggleGroupComponent {\n public readonly ariaLabel = input<string>('Button Toggle Group');\n\n public readonly type = input<TngButtonToggleType>('single');\n public readonly activation = input<TngButtonToggleActivationMode>('auto');\n public readonly orientation = input<TngButtonToggleOrientation>('horizontal');\n public readonly dir = input<TngButtonToggleDirection>('auto');\n public readonly allowEmpty = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n public readonly disabled = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n public readonly loop = input<boolean, unknown>(true, {\n transform: booleanAttribute,\n });\n\n public readonly valueInput = input<TngButtonToggleValue | null | undefined, unknown>(undefined, {\n alias: 'tngButtonToggleValue',\n transform: normalizeOptionalButtonToggleValue,\n });\n public readonly valuesInput = input<readonly TngButtonToggleValue[] | undefined, unknown>(\n undefined,\n {\n alias: 'tngButtonToggleValues',\n transform: normalizeOptionalButtonToggleValues,\n },\n );\n public readonly defaultValueInput = input<TngButtonToggleValue | null | undefined, unknown>(\n undefined,\n {\n alias: 'tngButtonToggleDefaultValue',\n transform: normalizeOptionalButtonToggleValue,\n },\n );\n public readonly defaultValuesInput = input<readonly TngButtonToggleValue[] | undefined, unknown>(\n undefined,\n {\n alias: 'tngButtonToggleDefaultValues',\n transform: normalizeOptionalButtonToggleValues,\n },\n );\n\n public readonly valueFallbackInput = input<TngButtonToggleValue | null | undefined, unknown>(\n undefined,\n {\n alias: 'value',\n transform: normalizeOptionalButtonToggleValue,\n },\n );\n public readonly valuesFallbackInput = input<readonly TngButtonToggleValue[] | undefined, unknown>(\n undefined,\n {\n alias: 'values',\n transform: normalizeOptionalButtonToggleValues,\n },\n );\n public readonly defaultValueFallbackInput = input<TngButtonToggleValue | null | undefined, unknown>(\n undefined,\n {\n alias: 'defaultValue',\n transform: normalizeOptionalButtonToggleValue,\n },\n );\n public readonly defaultValuesFallbackInput = input<\n readonly TngButtonToggleValue[] | undefined,\n unknown\n >(undefined, {\n alias: 'defaultValues',\n transform: normalizeOptionalButtonToggleValues,\n });\n\n public readonly valueChange = output<TngButtonToggleValue | null>();\n public readonly valuesChange = output<readonly TngButtonToggleValue[]>();\n public readonly toggleChange = output<TngButtonToggleChangeEvent>();\n public readonly focusChange = output<TngButtonToggleFocusChangeEvent>();\n\n protected resolvedValue(): TngButtonToggleValue | null | undefined {\n const explicit = this.valueInput();\n if (explicit !== undefined) {\n return explicit;\n }\n\n return this.valueFallbackInput();\n }\n\n protected resolvedValues(): readonly TngButtonToggleValue[] | undefined {\n const explicit = this.valuesInput();\n if (explicit !== undefined) {\n return explicit;\n }\n\n return this.valuesFallbackInput();\n }\n\n protected resolvedDefaultValue(): TngButtonToggleValue | null | undefined {\n const explicit = this.defaultValueInput();\n if (explicit !== undefined) {\n return explicit;\n }\n\n return this.defaultValueFallbackInput();\n }\n\n protected resolvedDefaultValues(): readonly TngButtonToggleValue[] | undefined {\n const explicit = this.defaultValuesInput();\n if (explicit !== undefined) {\n return explicit;\n }\n\n return this.defaultValuesFallbackInput();\n }\n}\n"]}
1
+ {"version":3,"file":"tng-button-toggle-group.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/button-toggle/tng-button-toggle-group.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n booleanAttribute,\n input,\n output,\n} from '@angular/core';\nimport {\n TngButtonToggleChangeEvent,\n TngButtonToggleFocusChangeEvent,\n TngButtonToggleGroup as TngButtonToggleGroupPrimitive,\n type TngButtonToggleValue,\n} from '@tailng-ui/primitives';\n\ntype TngButtonToggleDirection = 'auto' | 'ltr' | 'rtl';\ntype TngButtonToggleOrientation = 'horizontal' | 'vertical';\ntype TngButtonToggleType = 'multiple' | 'single';\ntype TngButtonToggleActivationMode = 'auto' | 'manual';\n\nfunction normalizeOptionalButtonToggleValue(\n value: unknown,\n): TngButtonToggleValue | null | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (value === null) {\n return null;\n }\n\n if (typeof value === 'number' || typeof value === 'string') {\n return value;\n }\n\n return String(value);\n}\n\nfunction normalizeOptionalButtonToggleValues(\n value: unknown,\n): readonly TngButtonToggleValue[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (value === null) {\n return [];\n }\n\n if (Array.isArray(value)) {\n return value\n .map((item) => normalizeOptionalButtonToggleValue(item))\n .filter((item): item is TngButtonToggleValue => item !== null && item !== undefined);\n }\n\n const normalized = normalizeOptionalButtonToggleValue(value);\n if (normalized === null || normalized === undefined) {\n return [];\n }\n\n return [normalized];\n}\n\n@Component({\n standalone: true,\n selector: 'tng-button-toggle-group',\n imports: [TngButtonToggleGroupPrimitive],\n templateUrl: './tng-button-toggle-group.component.html',\n styleUrl: './tng-button-toggle-group.component.css',\n})\nexport class TngButtonToggleGroupComponent {\n public readonly ariaLabel = input<string>('Button Toggle Group');\n\n public readonly type = input<TngButtonToggleType>('single');\n public readonly activation = input<TngButtonToggleActivationMode>('auto');\n public readonly orientation = input<TngButtonToggleOrientation>('horizontal');\n public readonly dir = input<TngButtonToggleDirection>('auto');\n public readonly allowEmpty = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n public readonly disabled = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n public readonly loop = input<boolean, unknown>(true, {\n transform: booleanAttribute,\n });\n\n public readonly valueInput = input<TngButtonToggleValue | null | undefined, unknown>(undefined, {\n alias: 'tngButtonToggleValue',\n transform: normalizeOptionalButtonToggleValue,\n });\n public readonly valuesInput = input<readonly TngButtonToggleValue[] | undefined, unknown>(\n undefined,\n {\n alias: 'tngButtonToggleValues',\n transform: normalizeOptionalButtonToggleValues,\n },\n );\n public readonly defaultValueInput = input<TngButtonToggleValue | null | undefined, unknown>(\n undefined,\n {\n alias: 'tngButtonToggleDefaultValue',\n transform: normalizeOptionalButtonToggleValue,\n },\n );\n public readonly defaultValuesInput = input<readonly TngButtonToggleValue[] | undefined, unknown>(\n undefined,\n {\n alias: 'tngButtonToggleDefaultValues',\n transform: normalizeOptionalButtonToggleValues,\n },\n );\n\n public readonly valueFallbackInput = input<TngButtonToggleValue | null | undefined, unknown>(\n undefined,\n {\n alias: 'value',\n transform: normalizeOptionalButtonToggleValue,\n },\n );\n public readonly valuesFallbackInput = input<readonly TngButtonToggleValue[] | undefined, unknown>(\n undefined,\n {\n alias: 'values',\n transform: normalizeOptionalButtonToggleValues,\n },\n );\n public readonly defaultValueFallbackInput = input<TngButtonToggleValue | null | undefined, unknown>(\n undefined,\n {\n alias: 'defaultValue',\n transform: normalizeOptionalButtonToggleValue,\n },\n );\n public readonly defaultValuesFallbackInput = input<\n readonly TngButtonToggleValue[] | undefined,\n unknown\n >(undefined, {\n alias: 'defaultValues',\n transform: normalizeOptionalButtonToggleValues,\n });\n\n public readonly valueChange = output<TngButtonToggleValue | null>();\n public readonly valuesChange = output<readonly TngButtonToggleValue[]>();\n public readonly toggleChange = output<TngButtonToggleChangeEvent>();\n public readonly focusChange = output<TngButtonToggleFocusChangeEvent>();\n\n protected resolvedValue(): TngButtonToggleValue | null | undefined {\n const explicit = this.valueInput();\n if (explicit !== undefined) {\n return explicit;\n }\n\n return this.valueFallbackInput();\n }\n\n protected resolvedValues(): readonly TngButtonToggleValue[] | undefined {\n const explicit = this.valuesInput();\n if (explicit !== undefined) {\n return explicit;\n }\n\n return this.valuesFallbackInput();\n }\n\n protected resolvedDefaultValue(): TngButtonToggleValue | null | undefined {\n const explicit = this.defaultValueInput();\n if (explicit !== undefined) {\n return explicit;\n }\n\n return this.defaultValueFallbackInput();\n }\n\n protected resolvedDefaultValues(): readonly TngButtonToggleValue[] | undefined {\n const explicit = this.defaultValuesInput();\n if (explicit !== undefined) {\n return explicit;\n }\n\n return this.defaultValuesFallbackInput();\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tng-button-toggle.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/button-toggle/tng-button-toggle.component.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAE/B,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAEpE;AAoBD,qBAMa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+C;IAEvE,SAAgB,QAAQ,8EAErB;IACH,SAAgB,OAAO,8EAEpB;IACH,SAAgB,gBAAgB,qGAM9B;IACF,SAAgB,UAAU,qGAGvB;IAEH,SAAgB,aAAa,oDAAqB;IAE3C,QAAQ,IAAI,IAAI;IAYvB,SAAS,CAAC,aAAa,IAAI,oBAAoB,GAAG,IAAI,GAAG,SAAS;IASlE,OAAO,CAAC,mBAAmB;CAG5B"}
1
+ {"version":3,"file":"tng-button-toggle.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/button-toggle/tng-button-toggle.component.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAE/B,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAEpE;AAoBD,qBAOa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+C;IAEvE,SAAgB,QAAQ,8EAErB;IACH,SAAgB,OAAO,8EAEpB;IACH,SAAgB,gBAAgB,qGAM9B;IACF,SAAgB,UAAU,qGAGvB;IAEH,SAAgB,aAAa,oDAAqB;IAE3C,QAAQ,IAAI,IAAI;IAYvB,SAAS,CAAC,aAAa,IAAI,oBAAoB,GAAG,IAAI,GAAG,SAAS;IASlE,OAAO,CAAC,mBAAmB;CAG5B"}
@@ -55,6 +55,7 @@ let TngButtonToggleComponent = class TngButtonToggleComponent {
55
55
  };
56
56
  TngButtonToggleComponent = __decorate([
57
57
  Component({
58
+ standalone: true,
58
59
  selector: 'tng-button-toggle',
59
60
  imports: [TngButtonTogglePrimitive],
60
61
  templateUrl: './tng-button-toggle.component.html',
@@ -1 +1 @@
1
- {"version":3,"file":"tng-button-toggle.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/button-toggle/tng-button-toggle.component.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,MAAM,EACN,KAAK,EACL,MAAM,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,eAAe,IAAI,wBAAwB,GAE5C,MAAM,uBAAuB,CAAC;AAE/B,MAAM,UAAU,0BAA0B,CAAC,OAAgB;IACzD,OAAO,CAAC,OAAO,CAAC;AAClB,CAAC;AAED,SAAS,kCAAkC,CACzC,KAAc;IAEd,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC3D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAQM,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IAClB,OAAO,GAAG,MAAM,CAA0B,UAAU,CAAC,CAAC;IAEvD,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,OAAO,GAAG,KAAK,CAA4B,KAAK,EAAE;QAChE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,gBAAgB,GAAG,KAAK,CACtC,SAAS,EACT;QACE,KAAK,EAAE,sBAAsB;QAC7B,SAAS,EAAE,kCAAkC;KAC9C,CACF,CAAC;IACc,UAAU,GAAG,KAAK,CAAmD,SAAS,EAAE;QAC9F,KAAK,EAAE,OAAO;QACd,SAAS,EAAE,kCAAkC;KAC9C,CAAC,CAAC;IAEa,aAAa,GAAG,MAAM,EAAW,CAAC;IAE3C,QAAQ;QACb,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC;IAES,aAAa;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACzC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;IAC3B,CAAC;IAEO,mBAAmB;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,mCAAmC,CAAC,KAAK,IAAI,CAAC;IAC1F,CAAC;CACF,CAAA;AA/CY,wBAAwB;IANpC,SAAS,CAAC;QACT,QAAQ,EAAE,mBAAmB;QAC7B,OAAO,EAAE,CAAC,wBAAwB,CAAC;QACnC,WAAW,EAAE,oCAAoC;QACjD,QAAQ,EAAE,mCAAmC;KAC9C,CAAC;GACW,wBAAwB,CA+CpC","sourcesContent":["import {\n ElementRef,\n booleanAttribute,\n Component,\n inject,\n input,\n output,\n} from '@angular/core';\nimport {\n TngButtonToggle as TngButtonTogglePrimitive,\n type TngButtonToggleValue,\n} from '@tailng-ui/primitives';\n\nexport function toggleTngButtonToggleState(pressed: boolean): boolean {\n return !pressed;\n}\n\nfunction normalizeOptionalButtonToggleValue(\n value: unknown,\n): TngButtonToggleValue | null | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (value === null) {\n return null;\n }\n\n if (typeof value === 'number' || typeof value === 'string') {\n return value;\n }\n\n return String(value);\n}\n\n@Component({\n selector: 'tng-button-toggle',\n imports: [TngButtonTogglePrimitive],\n templateUrl: './tng-button-toggle.component.html',\n styleUrl: './tng-button-toggle.component.css',\n})\nexport class TngButtonToggleComponent {\n private readonly hostRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n public readonly disabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly pressed = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly toggleValueInput = input<TngButtonToggleValue | null | undefined, unknown>(\n undefined,\n {\n alias: 'tngButtonToggleValue',\n transform: normalizeOptionalButtonToggleValue,\n },\n );\n public readonly valueInput = input<TngButtonToggleValue | null | undefined, unknown>(undefined, {\n alias: 'value',\n transform: normalizeOptionalButtonToggleValue,\n });\n\n public readonly pressedChange = output<boolean>();\n\n public onToggle(): void {\n if (this.disabled()) {\n return;\n }\n\n if (this.isInsideToggleGroup()) {\n return;\n }\n\n this.pressedChange.emit(toggleTngButtonToggleState(this.pressed()));\n }\n\n protected resolvedValue(): TngButtonToggleValue | null | undefined {\n const explicit = this.toggleValueInput();\n if (explicit !== undefined) {\n return explicit;\n }\n\n return this.valueInput();\n }\n\n private isInsideToggleGroup(): boolean {\n return this.hostRef.nativeElement.closest('[data-slot=\"button-toggle-group\"]') !== null;\n }\n}\n"]}
1
+ {"version":3,"file":"tng-button-toggle.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/button-toggle/tng-button-toggle.component.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,MAAM,EACN,KAAK,EACL,MAAM,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,eAAe,IAAI,wBAAwB,GAE5C,MAAM,uBAAuB,CAAC;AAE/B,MAAM,UAAU,0BAA0B,CAAC,OAAgB;IACzD,OAAO,CAAC,OAAO,CAAC;AAClB,CAAC;AAED,SAAS,kCAAkC,CACzC,KAAc;IAEd,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC3D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AASM,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IAClB,OAAO,GAAG,MAAM,CAA0B,UAAU,CAAC,CAAC;IAEvD,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,OAAO,GAAG,KAAK,CAA4B,KAAK,EAAE;QAChE,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,gBAAgB,GAAG,KAAK,CACtC,SAAS,EACT;QACE,KAAK,EAAE,sBAAsB;QAC7B,SAAS,EAAE,kCAAkC;KAC9C,CACF,CAAC;IACc,UAAU,GAAG,KAAK,CAAmD,SAAS,EAAE;QAC9F,KAAK,EAAE,OAAO;QACd,SAAS,EAAE,kCAAkC;KAC9C,CAAC,CAAC;IAEa,aAAa,GAAG,MAAM,EAAW,CAAC;IAE3C,QAAQ;QACb,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC;IAES,aAAa;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACzC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;IAC3B,CAAC;IAEO,mBAAmB;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,mCAAmC,CAAC,KAAK,IAAI,CAAC;IAC1F,CAAC;CACF,CAAA;AA/CY,wBAAwB;IAPpC,SAAS,CAAC;QACT,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,mBAAmB;QAC7B,OAAO,EAAE,CAAC,wBAAwB,CAAC;QACnC,WAAW,EAAE,oCAAoC;QACjD,QAAQ,EAAE,mCAAmC;KAC9C,CAAC;GACW,wBAAwB,CA+CpC","sourcesContent":["import {\n ElementRef,\n booleanAttribute,\n Component,\n inject,\n input,\n output,\n} from '@angular/core';\nimport {\n TngButtonToggle as TngButtonTogglePrimitive,\n type TngButtonToggleValue,\n} from '@tailng-ui/primitives';\n\nexport function toggleTngButtonToggleState(pressed: boolean): boolean {\n return !pressed;\n}\n\nfunction normalizeOptionalButtonToggleValue(\n value: unknown,\n): TngButtonToggleValue | null | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (value === null) {\n return null;\n }\n\n if (typeof value === 'number' || typeof value === 'string') {\n return value;\n }\n\n return String(value);\n}\n\n@Component({\n standalone: true,\n selector: 'tng-button-toggle',\n imports: [TngButtonTogglePrimitive],\n templateUrl: './tng-button-toggle.component.html',\n styleUrl: './tng-button-toggle.component.css',\n})\nexport class TngButtonToggleComponent {\n private readonly hostRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n public readonly disabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly pressed = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly toggleValueInput = input<TngButtonToggleValue | null | undefined, unknown>(\n undefined,\n {\n alias: 'tngButtonToggleValue',\n transform: normalizeOptionalButtonToggleValue,\n },\n );\n public readonly valueInput = input<TngButtonToggleValue | null | undefined, unknown>(undefined, {\n alias: 'value',\n transform: normalizeOptionalButtonToggleValue,\n });\n\n public readonly pressedChange = output<boolean>();\n\n public onToggle(): void {\n if (this.disabled()) {\n return;\n }\n\n if (this.isInsideToggleGroup()) {\n return;\n }\n\n this.pressedChange.emit(toggleTngButtonToggleState(this.pressed()));\n }\n\n protected resolvedValue(): TngButtonToggleValue | null | undefined {\n const explicit = this.toggleValueInput();\n if (explicit !== undefined) {\n return explicit;\n }\n\n return this.valueInput();\n }\n\n private isInsideToggleGroup(): boolean {\n return this.hostRef.nativeElement.closest('[data-slot=\"button-toggle-group\"]') !== null;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tng-checkbox.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/checkbox/tng-checkbox.component.ts"],"names":[],"mappings":"AAUA,OAAO,EAAqB,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAG9E,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,OAAO,CAAC;AAEtD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CAU7E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CAc9E;AAKD,qBAaa,oBAAqB,YAAW,oBAAoB;IAC/D,SAAgB,eAAe,qDAA8B;IAC7D,SAAgB,OAAO,8EAEpB;IACH,SAAgB,QAAQ,8EAErB;IACH,SAAgB,OAAO,8EAEpB;IACH,SAAgB,aAAa,8EAE1B;IACH,SAAgB,IAAI,qDAA8B;IAClD,SAAgB,QAAQ,8EAErB;IACH,SAAgB,QAAQ,8EAErB;IACH,SAAgB,KAAK,8CAAuB;IAE5C,SAAgB,aAAa,oDAAqB;IAClD,SAAgB,mBAAmB,oDAAqB;IAExD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAiB;IACvD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiB;IAE7C,OAAO,CAAC,eAAe,CAA2D;IAClF,OAAO,CAAC,gBAAgB,CAA8B;IAEtD,SAAS,CAAC,QAAQ,CAAC,eAAe,0CAM/B;IAEH,SAAS,CAAC,QAAQ,CAAC,gBAAgB,0CAMhC;IAEH,SAAS,CAAC,QAAQ,CAAC,qBAAqB,0CAMrC;;IAgBI,MAAM,IAAI,IAAI;IAId,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAkB9B,gBAAgB,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,GAAG,IAAI;IAKlE,iBAAiB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAKvC,gBAAgB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAK3C,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;CAMxC"}
1
+ {"version":3,"file":"tng-checkbox.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/checkbox/tng-checkbox.component.ts"],"names":[],"mappings":"AAUA,OAAO,EAAqB,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAG9E,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,OAAO,CAAC;AAEtD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CAU7E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CAc9E;AAKD,qBAca,oBAAqB,YAAW,oBAAoB;IAC/D,SAAgB,eAAe,qDAA8B;IAC7D,SAAgB,OAAO,8EAEpB;IACH,SAAgB,QAAQ,8EAErB;IACH,SAAgB,OAAO,8EAEpB;IACH,SAAgB,aAAa,8EAE1B;IACH,SAAgB,IAAI,qDAA8B;IAClD,SAAgB,QAAQ,8EAErB;IACH,SAAgB,QAAQ,8EAErB;IACH,SAAgB,KAAK,8CAAuB;IAE5C,SAAgB,aAAa,oDAAqB;IAClD,SAAgB,mBAAmB,oDAAqB;IAExD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAiB;IACvD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiB;IAE7C,OAAO,CAAC,eAAe,CAA2D;IAClF,OAAO,CAAC,gBAAgB,CAA8B;IAEtD,SAAS,CAAC,QAAQ,CAAC,eAAe,0CAM/B;IAEH,SAAS,CAAC,QAAQ,CAAC,gBAAgB,0CAMhC;IAEH,SAAS,CAAC,QAAQ,CAAC,qBAAqB,0CAMrC;;IAgBI,MAAM,IAAI,IAAI;IAId,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAkB9B,gBAAgB,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,GAAG,IAAI;IAKlE,iBAAiB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAKvC,gBAAgB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAK3C,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;CAMxC"}
@@ -121,6 +121,7 @@ let TngCheckboxComponent = class TngCheckboxComponent {
121
121
  };
122
122
  TngCheckboxComponent = __decorate([
123
123
  Component({
124
+ standalone: true,
124
125
  selector: 'tng-checkbox',
125
126
  imports: [TngCheckboxPrimitive],
126
127
  templateUrl: './tng-checkbox.component.html',
@@ -1 +1 @@
1
- {"version":3,"file":"tng-checkbox.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/checkbox/tng-checkbox.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n booleanAttribute,\n Component,\n computed,\n effect,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\nimport { TngCheckbox as TngCheckboxPrimitive } from '@tailng-ui/primitives';\n\nexport type TngCheckboxChange = Readonly<{\n checked: boolean;\n indeterminate: boolean;\n}>;\n\nexport type TngCheckboxModelValue = 'mixed' | boolean;\n\nexport function coerceTngCheckboxModelValue(value: unknown): TngCheckboxChange {\n if (value === 'mixed') {\n return { checked: false, indeterminate: true };\n }\n\n if (value === true) {\n return { checked: true, indeterminate: false };\n }\n\n return { checked: false, indeterminate: false };\n}\n\nexport function readTngCheckboxChange(event: unknown): TngCheckboxChange | null {\n if (!(event instanceof Event)) {\n return null;\n }\n\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) {\n return null;\n }\n\n return {\n checked: target.checked,\n indeterminate: target.indeterminate,\n };\n}\n\nconst noControlChange = (_value: TngCheckboxModelValue): void => undefined;\nconst noControlTouch = (): void => undefined;\n\n@Component({\n selector: 'tng-checkbox',\n imports: [TngCheckboxPrimitive],\n templateUrl: './tng-checkbox.component.html',\n styleUrl: './tng-checkbox.component.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TngCheckboxComponent),\n multi: true,\n },\n ],\n})\nexport class TngCheckboxComponent implements ControlValueAccessor {\n public readonly ariaDescribedBy = input<string | null>(null);\n public readonly checked = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly disabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly invalid = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly indeterminate = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly name = input<string | null>(null);\n public readonly readonly = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly required = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly value = input<string>('on');\n\n public readonly checkedChange = output<boolean>();\n public readonly indeterminateChange = output<boolean>();\n\n private readonly internalChecked = signal(false);\n private readonly internalIndeterminate = signal(false);\n private readonly cvaModeEnabled = signal(false);\n private readonly cvaDisabled = signal(false);\n\n private onControlChange: (value: TngCheckboxModelValue) => void = noControlChange;\n private onControlTouched: () => void = noControlTouch;\n\n protected readonly resolvedChecked = computed<boolean>(() => {\n if (this.cvaModeEnabled()) {\n return this.internalChecked();\n }\n\n return this.checked();\n });\n\n protected readonly resolvedDisabled = computed<boolean>(() => {\n if (this.cvaModeEnabled()) {\n return this.cvaDisabled();\n }\n\n return this.disabled();\n });\n\n protected readonly resolvedIndeterminate = computed<boolean>(() => {\n if (this.cvaModeEnabled()) {\n return this.internalIndeterminate();\n }\n\n return this.indeterminate();\n });\n\n public constructor() {\n effect(\n () => {\n if (this.cvaModeEnabled()) {\n return;\n }\n\n this.internalChecked.set(this.checked());\n this.internalIndeterminate.set(this.indeterminate());\n },\n { allowSignalWrites: true },\n );\n }\n\n public onBlur(): void {\n this.onControlTouched();\n }\n\n public onChange(event: unknown): void {\n const change = readTngCheckboxChange(event);\n if (change === null) {\n return;\n }\n\n if (this.readonly() || this.resolvedDisabled()) {\n return;\n }\n\n this.internalChecked.set(change.checked);\n this.internalIndeterminate.set(change.indeterminate);\n\n this.checkedChange.emit(change.checked);\n this.indeterminateChange.emit(change.indeterminate);\n this.onControlChange(change.indeterminate ? 'mixed' : change.checked);\n }\n\n public registerOnChange(fn: (value: TngCheckboxModelValue) => void): void {\n this.cvaModeEnabled.set(true);\n this.onControlChange = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.cvaModeEnabled.set(true);\n this.onControlTouched = fn;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.cvaModeEnabled.set(true);\n this.cvaDisabled.set(isDisabled);\n }\n\n public writeValue(value: unknown): void {\n this.cvaModeEnabled.set(true);\n const normalized = coerceTngCheckboxModelValue(value);\n this.internalChecked.set(normalized.checked);\n this.internalIndeterminate.set(normalized.indeterminate);\n }\n}\n"]}
1
+ {"version":3,"file":"tng-checkbox.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/checkbox/tng-checkbox.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n booleanAttribute,\n Component,\n computed,\n effect,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\nimport { TngCheckbox as TngCheckboxPrimitive } from '@tailng-ui/primitives';\n\nexport type TngCheckboxChange = Readonly<{\n checked: boolean;\n indeterminate: boolean;\n}>;\n\nexport type TngCheckboxModelValue = 'mixed' | boolean;\n\nexport function coerceTngCheckboxModelValue(value: unknown): TngCheckboxChange {\n if (value === 'mixed') {\n return { checked: false, indeterminate: true };\n }\n\n if (value === true) {\n return { checked: true, indeterminate: false };\n }\n\n return { checked: false, indeterminate: false };\n}\n\nexport function readTngCheckboxChange(event: unknown): TngCheckboxChange | null {\n if (!(event instanceof Event)) {\n return null;\n }\n\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) {\n return null;\n }\n\n return {\n checked: target.checked,\n indeterminate: target.indeterminate,\n };\n}\n\nconst noControlChange = (_value: TngCheckboxModelValue): void => undefined;\nconst noControlTouch = (): void => undefined;\n\n@Component({\n standalone: true,\n selector: 'tng-checkbox',\n imports: [TngCheckboxPrimitive],\n templateUrl: './tng-checkbox.component.html',\n styleUrl: './tng-checkbox.component.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TngCheckboxComponent),\n multi: true,\n },\n ],\n})\nexport class TngCheckboxComponent implements ControlValueAccessor {\n public readonly ariaDescribedBy = input<string | null>(null);\n public readonly checked = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly disabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly invalid = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly indeterminate = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly name = input<string | null>(null);\n public readonly readonly = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly required = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly value = input<string>('on');\n\n public readonly checkedChange = output<boolean>();\n public readonly indeterminateChange = output<boolean>();\n\n private readonly internalChecked = signal(false);\n private readonly internalIndeterminate = signal(false);\n private readonly cvaModeEnabled = signal(false);\n private readonly cvaDisabled = signal(false);\n\n private onControlChange: (value: TngCheckboxModelValue) => void = noControlChange;\n private onControlTouched: () => void = noControlTouch;\n\n protected readonly resolvedChecked = computed<boolean>(() => {\n if (this.cvaModeEnabled()) {\n return this.internalChecked();\n }\n\n return this.checked();\n });\n\n protected readonly resolvedDisabled = computed<boolean>(() => {\n if (this.cvaModeEnabled()) {\n return this.cvaDisabled();\n }\n\n return this.disabled();\n });\n\n protected readonly resolvedIndeterminate = computed<boolean>(() => {\n if (this.cvaModeEnabled()) {\n return this.internalIndeterminate();\n }\n\n return this.indeterminate();\n });\n\n public constructor() {\n effect(\n () => {\n if (this.cvaModeEnabled()) {\n return;\n }\n\n this.internalChecked.set(this.checked());\n this.internalIndeterminate.set(this.indeterminate());\n },\n { allowSignalWrites: true },\n );\n }\n\n public onBlur(): void {\n this.onControlTouched();\n }\n\n public onChange(event: unknown): void {\n const change = readTngCheckboxChange(event);\n if (change === null) {\n return;\n }\n\n if (this.readonly() || this.resolvedDisabled()) {\n return;\n }\n\n this.internalChecked.set(change.checked);\n this.internalIndeterminate.set(change.indeterminate);\n\n this.checkedChange.emit(change.checked);\n this.indeterminateChange.emit(change.indeterminate);\n this.onControlChange(change.indeterminate ? 'mixed' : change.checked);\n }\n\n public registerOnChange(fn: (value: TngCheckboxModelValue) => void): void {\n this.cvaModeEnabled.set(true);\n this.onControlChange = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.cvaModeEnabled.set(true);\n this.onControlTouched = fn;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.cvaModeEnabled.set(true);\n this.cvaDisabled.set(isDisabled);\n }\n\n public writeValue(value: unknown): void {\n this.cvaModeEnabled.set(true);\n const normalized = coerceTngCheckboxModelValue(value);\n this.internalChecked.set(normalized.checked);\n this.internalIndeterminate.set(normalized.indeterminate);\n }\n}\n"]}