@tailng-ui/primitives 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 (166) hide show
  1. package/README.md +97 -11
  2. package/package.json +9 -3
  3. package/src/index.d.ts +5 -0
  4. package/src/index.d.ts.map +1 -1
  5. package/src/index.js +5 -0
  6. package/src/index.js.map +1 -1
  7. package/src/lib/feedback/empty/tng-empty.d.ts.map +1 -1
  8. package/src/lib/feedback/empty/tng-empty.js +5 -0
  9. package/src/lib/feedback/empty/tng-empty.js.map +1 -1
  10. package/src/lib/feedback/progress-bar/tng-progress-bar.d.ts.map +1 -1
  11. package/src/lib/feedback/progress-bar/tng-progress-bar.js +4 -1
  12. package/src/lib/feedback/progress-bar/tng-progress-bar.js.map +1 -1
  13. package/src/lib/feedback/progress-spinner/tng-progress-spinner.d.ts.map +1 -1
  14. package/src/lib/feedback/progress-spinner/tng-progress-spinner.js +3 -1
  15. package/src/lib/feedback/progress-spinner/tng-progress-spinner.js.map +1 -1
  16. package/src/lib/feedback/skeleton/tng-skeleton.d.ts +1 -0
  17. package/src/lib/feedback/skeleton/tng-skeleton.d.ts.map +1 -1
  18. package/src/lib/feedback/skeleton/tng-skeleton.js +5 -0
  19. package/src/lib/feedback/skeleton/tng-skeleton.js.map +1 -1
  20. package/src/lib/feedback/toast/tng-toast.d.ts.map +1 -1
  21. package/src/lib/feedback/toast/tng-toast.js +2 -0
  22. package/src/lib/feedback/toast/tng-toast.js.map +1 -1
  23. package/src/lib/form/checkbox/tng-checkbox.d.ts.map +1 -1
  24. package/src/lib/form/checkbox/tng-checkbox.js +1 -0
  25. package/src/lib/form/checkbox/tng-checkbox.js.map +1 -1
  26. package/src/lib/form/chips/tng-chips.d.ts +53 -1
  27. package/src/lib/form/chips/tng-chips.d.ts.map +1 -1
  28. package/src/lib/form/chips/tng-chips.js +284 -1
  29. package/src/lib/form/chips/tng-chips.js.map +1 -1
  30. package/src/lib/form/combobox/tng-combobox.d.ts.map +1 -1
  31. package/src/lib/form/combobox/tng-combobox.js +1 -0
  32. package/src/lib/form/combobox/tng-combobox.js.map +1 -1
  33. package/src/lib/form/input-otp/tng-input-otp.d.ts +22 -0
  34. package/src/lib/form/input-otp/tng-input-otp.d.ts.map +1 -1
  35. package/src/lib/form/input-otp/tng-input-otp.js +106 -1
  36. package/src/lib/form/input-otp/tng-input-otp.js.map +1 -1
  37. package/src/lib/form/label/tng-label.d.ts +2 -0
  38. package/src/lib/form/label/tng-label.d.ts.map +1 -1
  39. package/src/lib/form/label/tng-label.js +10 -0
  40. package/src/lib/form/label/tng-label.js.map +1 -1
  41. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.d.ts +1 -0
  42. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.d.ts.map +1 -1
  43. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.js +26 -0
  44. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.js.map +1 -1
  45. package/src/lib/form/multiselect/tng-multiselect.d.ts.map +1 -1
  46. package/src/lib/form/multiselect/tng-multiselect.js +1 -0
  47. package/src/lib/form/multiselect/tng-multiselect.js.map +1 -1
  48. package/src/lib/form/radio/tng-radio.d.ts +26 -0
  49. package/src/lib/form/radio/tng-radio.d.ts.map +1 -1
  50. package/src/lib/form/radio/tng-radio.js +130 -1
  51. package/src/lib/form/radio/tng-radio.js.map +1 -1
  52. package/src/lib/form/slider/tng-slider.d.ts.map +1 -1
  53. package/src/lib/form/slider/tng-slider.js +1 -0
  54. package/src/lib/form/slider/tng-slider.js.map +1 -1
  55. package/src/lib/form/switch/tng-switch.d.ts.map +1 -1
  56. package/src/lib/form/switch/tng-switch.js +1 -0
  57. package/src/lib/form/switch/tng-switch.js.map +1 -1
  58. package/src/lib/form/textarea/tng-textarea.d.ts +6 -14
  59. package/src/lib/form/textarea/tng-textarea.d.ts.map +1 -1
  60. package/src/lib/form/textarea/tng-textarea.js +42 -85
  61. package/src/lib/form/textarea/tng-textarea.js.map +1 -1
  62. package/src/lib/form/toggle/tng-toggle.d.ts.map +1 -1
  63. package/src/lib/form/toggle/tng-toggle.js +1 -0
  64. package/src/lib/form/toggle/tng-toggle.js.map +1 -1
  65. package/src/lib/form/toggle-group/tng-toggle-group.d.ts.map +1 -1
  66. package/src/lib/form/toggle-group/tng-toggle-group.js +1 -0
  67. package/src/lib/form/toggle-group/tng-toggle-group.js.map +1 -1
  68. package/src/lib/layout/accordion/tng-accordion.d.ts +9 -0
  69. package/src/lib/layout/accordion/tng-accordion.d.ts.map +1 -1
  70. package/src/lib/layout/accordion/tng-accordion.js +113 -0
  71. package/src/lib/layout/accordion/tng-accordion.js.map +1 -1
  72. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.d.ts.map +1 -1
  73. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.js +1 -0
  74. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.js.map +1 -1
  75. package/src/lib/layout/card/tng-card.d.ts.map +1 -1
  76. package/src/lib/layout/card/tng-card.js +10 -0
  77. package/src/lib/layout/card/tng-card.js.map +1 -1
  78. package/src/lib/layout/collapsible/tng-collapsible.d.ts.map +1 -1
  79. package/src/lib/layout/collapsible/tng-collapsible.js +3 -0
  80. package/src/lib/layout/collapsible/tng-collapsible.js.map +1 -1
  81. package/src/lib/layout/grid/tng-grid.d.ts.map +1 -1
  82. package/src/lib/layout/grid/tng-grid.js +1 -0
  83. package/src/lib/layout/grid/tng-grid.js.map +1 -1
  84. package/src/lib/layout/separator/tng-separator.d.ts.map +1 -1
  85. package/src/lib/layout/separator/tng-separator.js +1 -0
  86. package/src/lib/layout/separator/tng-separator.js.map +1 -1
  87. package/src/lib/layout/stepper/tng-stepper.d.ts.map +1 -1
  88. package/src/lib/layout/stepper/tng-stepper.js +1 -0
  89. package/src/lib/layout/stepper/tng-stepper.js.map +1 -1
  90. package/src/lib/layout/tree/__tests__/tng-tree.test-harness.d.ts +20 -0
  91. package/src/lib/layout/tree/__tests__/tng-tree.test-harness.d.ts.map +1 -0
  92. package/src/lib/layout/tree/__tests__/tng-tree.test-harness.js +106 -0
  93. package/src/lib/layout/tree/__tests__/tng-tree.test-harness.js.map +1 -0
  94. package/src/lib/layout/tree/index.d.ts +5 -0
  95. package/src/lib/layout/tree/index.d.ts.map +1 -0
  96. package/src/lib/layout/tree/index.js +5 -0
  97. package/src/lib/layout/tree/index.js.map +1 -0
  98. package/src/lib/layout/tree/tng-tree-group.d.ts +10 -0
  99. package/src/lib/layout/tree/tng-tree-group.d.ts.map +1 -0
  100. package/src/lib/layout/tree/tng-tree-group.js +29 -0
  101. package/src/lib/layout/tree/tng-tree-group.js.map +1 -0
  102. package/src/lib/layout/tree/tng-tree-indicator.d.ts +8 -0
  103. package/src/lib/layout/tree/tng-tree-indicator.d.ts.map +1 -0
  104. package/src/lib/layout/tree/tng-tree-indicator.js +36 -0
  105. package/src/lib/layout/tree/tng-tree-indicator.js.map +1 -0
  106. package/src/lib/layout/tree/tng-tree-item.d.ts +36 -0
  107. package/src/lib/layout/tree/tng-tree-item.d.ts.map +1 -0
  108. package/src/lib/layout/tree/tng-tree-item.js +139 -0
  109. package/src/lib/layout/tree/tng-tree-item.js.map +1 -0
  110. package/src/lib/layout/tree/tng-tree.d.ts +64 -1
  111. package/src/lib/layout/tree/tng-tree.d.ts.map +1 -1
  112. package/src/lib/layout/tree/tng-tree.js +536 -1
  113. package/src/lib/layout/tree/tng-tree.js.map +1 -1
  114. package/src/lib/layout/tree/tng-tree.transforms.d.ts +10 -0
  115. package/src/lib/layout/tree/tng-tree.transforms.d.ts.map +1 -0
  116. package/src/lib/layout/tree/tng-tree.transforms.js +46 -0
  117. package/src/lib/layout/tree/tng-tree.transforms.js.map +1 -0
  118. package/src/lib/navigation/breadcrumb/tng-breadcrumb.d.ts.map +1 -1
  119. package/src/lib/navigation/breadcrumb/tng-breadcrumb.js +5 -0
  120. package/src/lib/navigation/breadcrumb/tng-breadcrumb.js.map +1 -1
  121. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.d.ts.map +1 -1
  122. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.js +1 -0
  123. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.js.map +1 -1
  124. package/src/lib/navigation/navigation-menu/tng-navigation-menu.d.ts.map +1 -1
  125. package/src/lib/navigation/navigation-menu/tng-navigation-menu.js +1 -0
  126. package/src/lib/navigation/navigation-menu/tng-navigation-menu.js.map +1 -1
  127. package/src/lib/navigation/toolbar/tng-toolbar.d.ts.map +1 -1
  128. package/src/lib/navigation/toolbar/tng-toolbar.js +1 -0
  129. package/src/lib/navigation/toolbar/tng-toolbar.js.map +1 -1
  130. package/src/lib/overlay/dialog/tng-dialog.d.ts +158 -0
  131. package/src/lib/overlay/dialog/tng-dialog.d.ts.map +1 -0
  132. package/src/lib/overlay/dialog/tng-dialog.js +854 -0
  133. package/src/lib/overlay/dialog/tng-dialog.js.map +1 -0
  134. package/src/lib/overlay/popover/tng-popover.d.ts +121 -0
  135. package/src/lib/overlay/popover/tng-popover.d.ts.map +1 -0
  136. package/src/lib/overlay/popover/tng-popover.js +614 -0
  137. package/src/lib/overlay/popover/tng-popover.js.map +1 -0
  138. package/src/lib/overlay/tng-overlay-runtime.d.ts +11 -0
  139. package/src/lib/overlay/tng-overlay-runtime.d.ts.map +1 -0
  140. package/src/lib/overlay/tng-overlay-runtime.js +6 -0
  141. package/src/lib/overlay/tng-overlay-runtime.js.map +1 -0
  142. package/src/lib/overlay/tooltip/tng-tooltip.d.ts +92 -3
  143. package/src/lib/overlay/tooltip/tng-tooltip.d.ts.map +1 -1
  144. package/src/lib/overlay/tooltip/tng-tooltip.js +477 -3
  145. package/src/lib/overlay/tooltip/tng-tooltip.js.map +1 -1
  146. package/src/lib/utility/avatar/tng-avatar.d.ts.map +1 -1
  147. package/src/lib/utility/avatar/tng-avatar.js +3 -0
  148. package/src/lib/utility/avatar/tng-avatar.js.map +1 -1
  149. package/src/lib/utility/badge/tng-badge.d.ts +6 -0
  150. package/src/lib/utility/badge/tng-badge.d.ts.map +1 -1
  151. package/src/lib/utility/badge/tng-badge.js +66 -0
  152. package/src/lib/utility/badge/tng-badge.js.map +1 -1
  153. package/src/lib/utility/code-block/tng-code-block.d.ts.map +1 -1
  154. package/src/lib/utility/code-block/tng-code-block.js +5 -0
  155. package/src/lib/utility/code-block/tng-code-block.js.map +1 -1
  156. package/src/lib/utility/copy/tng-copy.d.ts +21 -10
  157. package/src/lib/utility/copy/tng-copy.d.ts.map +1 -1
  158. package/src/lib/utility/copy/tng-copy.js +118 -88
  159. package/src/lib/utility/copy/tng-copy.js.map +1 -1
  160. package/src/lib/utility/press/tng-press.d.ts.map +1 -1
  161. package/src/lib/utility/press/tng-press.js +1 -0
  162. package/src/lib/utility/press/tng-press.js.map +1 -1
  163. package/src/lib/utility/tag/tng-tag.d.ts +37 -0
  164. package/src/lib/utility/tag/tng-tag.d.ts.map +1 -1
  165. package/src/lib/utility/tag/tng-tag.js +198 -1
  166. package/src/lib/utility/tag/tng-tag.js.map +1 -1
@@ -1,4 +1,56 @@
1
- export declare class TngChips {
1
+ import { OnInit } from '@angular/core';
2
+ export declare class TngChips implements OnInit {
3
+ private readonly internalValues;
4
+ readonly values: import("@angular/core").InputSignal<readonly unknown[] | undefined>;
5
+ readonly defaultValues: import("@angular/core").InputSignal<readonly unknown[]>;
6
+ readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
7
+ readonly ariaLabel: import("@angular/core").InputSignal<string | null>;
8
+ readonly chipRemove: import("@angular/core").OutputEmitterRef<unknown>;
9
+ readonly valuesChange: import("@angular/core").OutputEmitterRef<readonly unknown[]>;
10
+ ngOnInit(): void;
11
+ isDisabled(): boolean;
12
+ removeValue(value: unknown): boolean;
13
+ private isControlled;
14
+ private resolveValues;
15
+ protected get ariaLabelAttr(): string | null;
16
+ protected get dataDisabledAttr(): '' | null;
2
17
  protected readonly dataSlot: "chips";
18
+ protected readonly role: "list";
19
+ }
20
+ export declare class TngChip {
21
+ private readonly chips;
22
+ readonly value: import("@angular/core").InputSignal<unknown>;
23
+ readonly label: import("@angular/core").InputSignal<string | null>;
24
+ readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
25
+ readonly removable: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
26
+ readonly chipRemove: import("@angular/core").OutputEmitterRef<unknown>;
27
+ isDisabled(): boolean;
28
+ isRemovable(): boolean;
29
+ resolvedLabel(): string;
30
+ requestRemove(): boolean;
31
+ protected onKeydown(event: KeyboardEvent): void;
32
+ protected get dataDisabledAttr(): '' | null;
33
+ protected readonly dataSlot: "chip";
34
+ protected get dataValueAttr(): string | null;
35
+ protected readonly role: "listitem";
36
+ }
37
+ export declare class TngChipRemove {
38
+ private readonly elementRef;
39
+ private readonly chip;
40
+ private readonly chips;
41
+ private focused;
42
+ private suppressNextClick;
43
+ readonly ariaLabel: import("@angular/core").InputSignal<string | null>;
44
+ private isDisabled;
45
+ protected onClick(event: MouseEvent): void;
46
+ protected onFocusIn(): void;
47
+ protected onFocusOut(): void;
48
+ protected onKeydown(event: KeyboardEvent): void;
49
+ protected get ariaLabelAttr(): string;
50
+ protected get dataDisabledAttr(): '' | null;
51
+ protected get dataFocusedAttr(): '' | null;
52
+ protected readonly dataSlot: "chip-remove";
53
+ protected get disabledAttr(): '' | null;
54
+ protected get typeAttr(): 'button' | null;
3
55
  }
4
56
  //# sourceMappingURL=tng-chips.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tng-chips.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/chips/tng-chips.ts"],"names":[],"mappings":"AAEA,qBAIa,QAAQ;IAEnB,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,OAAO,CAAU;CAChD"}
1
+ {"version":3,"file":"tng-chips.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/chips/tng-chips.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,MAAM,EAMP,MAAM,eAAe,CAAC;AAoCvB,qBAKa,QAAS,YAAW,MAAM;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkC;IAEjE,SAAgB,MAAM,sEAEnB;IACH,SAAgB,aAAa,0DAE1B;IACH,SAAgB,QAAQ,8EAGrB;IACH,SAAgB,SAAS,qDAEtB;IAEH,SAAgB,UAAU,oDAAqB;IAC/C,SAAgB,YAAY,+DAAgC;IAErD,QAAQ,IAAI,IAAI;IAIhB,UAAU,IAAI,OAAO;IAIrB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAsB3C,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,aAAa;IASrB,SAAS,KAAK,aAAa,IAAI,MAAM,GAAG,IAAI,CAE3C;IAGD,SAAS,KAAK,gBAAgB,IAAI,EAAE,GAAG,IAAI,CAE1C;IAGD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,OAAO,CAAU;IAG/C,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAU;CAC3C;AAED,qBAKa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwC;IAE9D,SAAgB,KAAK,+CAAmD;IACxE,SAAgB,KAAK,qDAAyD;IAC9E,SAAgB,QAAQ,8EAGrB;IACH,SAAgB,SAAS,8EAGtB;IAEH,SAAgB,UAAU,oDAAqB;IAExC,UAAU,IAAI,OAAO;IAIrB,WAAW,IAAI,OAAO;IAItB,aAAa,IAAI,MAAM;IAUvB,aAAa,IAAI,OAAO;IAY/B,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAe/C,SAAS,KAAK,gBAAgB,IAAI,EAAE,GAAG,IAAI,CAE1C;IAGD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,MAAM,CAAU;IAG9C,SAAS,KAAK,aAAa,IAAI,MAAM,GAAG,IAAI,CAE3C;IAGD,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;CAC/C;AAED,qBAKa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+C;IAC1E,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuC;IAC5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwC;IAE9D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAS;IAElC,SAAgB,SAAS,qDAEtB;IAEH,OAAO,CAAC,UAAU;IAKlB,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAkB1C,SAAS,CAAC,SAAS,IAAI,IAAI;IAK3B,SAAS,CAAC,UAAU,IAAI,IAAI;IAK5B,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAuB/C,SAAS,KAAK,aAAa,IAAI,MAAM,CAapC;IAGD,SAAS,KAAK,gBAAgB,IAAI,EAAE,GAAG,IAAI,CAE1C;IAGD,SAAS,KAAK,eAAe,IAAI,EAAE,GAAG,IAAI,CAEzC;IAGD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,aAAa,CAAU;IAGrD,SAAS,KAAK,YAAY,IAAI,EAAE,GAAG,IAAI,CAEtC;IAGD,SAAS,KAAK,QAAQ,IAAI,QAAQ,GAAG,IAAI,CAExC;CACF"}
@@ -1,16 +1,299 @@
1
1
  import { __decorate } from "tslib";
2
- import { Directive, HostBinding } from '@angular/core';
2
+ import { Directive, ElementRef, HostBinding, HostListener, booleanAttribute, inject, input, output, signal, } from '@angular/core';
3
+ function normalizeString(value) {
4
+ if (value === undefined || value === null) {
5
+ return null;
6
+ }
7
+ const normalized = value.trim();
8
+ return normalized.length > 0 ? normalized : null;
9
+ }
10
+ function normalizeValues(values) {
11
+ if (!Array.isArray(values) || values.length === 0) {
12
+ return [];
13
+ }
14
+ return [...values];
15
+ }
16
+ function toDataValue(value) {
17
+ if (value === null || value === undefined) {
18
+ return null;
19
+ }
20
+ return String(value);
21
+ }
22
+ function removeFirstOccurrence(values, target) {
23
+ const index = values.findIndex((item) => Object.is(item, target));
24
+ if (index < 0) {
25
+ return values;
26
+ }
27
+ return [...values.slice(0, index), ...values.slice(index + 1)];
28
+ }
3
29
  let TngChips = class TngChips {
30
+ internalValues = signal([]);
31
+ values = input(undefined, {
32
+ alias: 'tngChipsValues',
33
+ });
34
+ defaultValues = input([], {
35
+ alias: 'tngChipsDefaultValues',
36
+ });
37
+ disabled = input(false, {
38
+ alias: 'tngChipsDisabled',
39
+ transform: booleanAttribute,
40
+ });
41
+ ariaLabel = input(null, {
42
+ alias: 'tngChipsAriaLabel',
43
+ });
44
+ chipRemove = output();
45
+ valuesChange = output();
46
+ ngOnInit() {
47
+ this.internalValues.set(normalizeValues(this.defaultValues()));
48
+ }
49
+ isDisabled() {
50
+ return this.disabled();
51
+ }
52
+ removeValue(value) {
53
+ if (this.disabled()) {
54
+ return false;
55
+ }
56
+ this.chipRemove.emit(value);
57
+ const currentValues = this.resolveValues();
58
+ const nextValues = removeFirstOccurrence(currentValues, value);
59
+ const changed = nextValues !== currentValues;
60
+ if (!changed) {
61
+ return true;
62
+ }
63
+ if (!this.isControlled()) {
64
+ this.internalValues.set(nextValues);
65
+ }
66
+ this.valuesChange.emit(nextValues);
67
+ return true;
68
+ }
69
+ isControlled() {
70
+ return this.values() !== undefined;
71
+ }
72
+ resolveValues() {
73
+ if (this.isControlled()) {
74
+ return normalizeValues(this.values());
75
+ }
76
+ return this.internalValues();
77
+ }
78
+ get ariaLabelAttr() {
79
+ return normalizeString(this.ariaLabel());
80
+ }
81
+ get dataDisabledAttr() {
82
+ return this.disabled() ? '' : null;
83
+ }
4
84
  dataSlot = 'chips';
85
+ role = 'list';
5
86
  };
87
+ __decorate([
88
+ HostBinding('attr.aria-label')
89
+ ], TngChips.prototype, "ariaLabelAttr", null);
90
+ __decorate([
91
+ HostBinding('attr.data-disabled')
92
+ ], TngChips.prototype, "dataDisabledAttr", null);
6
93
  __decorate([
7
94
  HostBinding('attr.data-slot')
8
95
  ], TngChips.prototype, "dataSlot", void 0);
96
+ __decorate([
97
+ HostBinding('attr.role')
98
+ ], TngChips.prototype, "role", void 0);
9
99
  TngChips = __decorate([
10
100
  Directive({
11
101
  selector: '[tngChips]',
12
102
  exportAs: 'tngChips',
103
+ standalone: true,
13
104
  })
14
105
  ], TngChips);
15
106
  export { TngChips };
107
+ let TngChip = class TngChip {
108
+ chips = inject(TngChips, { optional: true });
109
+ value = input(null, { alias: 'tngChipValue' });
110
+ label = input(null, { alias: 'tngChipLabel' });
111
+ disabled = input(false, {
112
+ alias: 'tngChipDisabled',
113
+ transform: booleanAttribute,
114
+ });
115
+ removable = input(true, {
116
+ alias: 'tngChipRemovable',
117
+ transform: booleanAttribute,
118
+ });
119
+ chipRemove = output();
120
+ isDisabled() {
121
+ return this.disabled() || this.chips?.isDisabled() === true;
122
+ }
123
+ isRemovable() {
124
+ return this.removable() && !this.isDisabled();
125
+ }
126
+ resolvedLabel() {
127
+ const fromInput = normalizeString(this.label());
128
+ if (fromInput !== null) {
129
+ return fromInput;
130
+ }
131
+ const fromValue = toDataValue(this.value());
132
+ return normalizeString(fromValue) ?? 'item';
133
+ }
134
+ requestRemove() {
135
+ if (!this.isRemovable()) {
136
+ return false;
137
+ }
138
+ const chipValue = this.value();
139
+ this.chipRemove.emit(chipValue);
140
+ this.chips?.removeValue(chipValue);
141
+ return true;
142
+ }
143
+ onKeydown(event) {
144
+ if (event.key !== 'Delete' && event.key !== 'Backspace') {
145
+ return;
146
+ }
147
+ if (!this.isRemovable()) {
148
+ return;
149
+ }
150
+ event.preventDefault();
151
+ event.stopPropagation();
152
+ this.requestRemove();
153
+ }
154
+ get dataDisabledAttr() {
155
+ return this.isDisabled() ? '' : null;
156
+ }
157
+ dataSlot = 'chip';
158
+ get dataValueAttr() {
159
+ return toDataValue(this.value());
160
+ }
161
+ role = 'listitem';
162
+ };
163
+ __decorate([
164
+ HostListener('keydown', ['$event'])
165
+ ], TngChip.prototype, "onKeydown", null);
166
+ __decorate([
167
+ HostBinding('attr.data-disabled')
168
+ ], TngChip.prototype, "dataDisabledAttr", null);
169
+ __decorate([
170
+ HostBinding('attr.data-slot')
171
+ ], TngChip.prototype, "dataSlot", void 0);
172
+ __decorate([
173
+ HostBinding('attr.data-value')
174
+ ], TngChip.prototype, "dataValueAttr", null);
175
+ __decorate([
176
+ HostBinding('attr.role')
177
+ ], TngChip.prototype, "role", void 0);
178
+ TngChip = __decorate([
179
+ Directive({
180
+ selector: '[tngChip]',
181
+ exportAs: 'tngChip',
182
+ standalone: true,
183
+ })
184
+ ], TngChip);
185
+ export { TngChip };
186
+ let TngChipRemove = class TngChipRemove {
187
+ elementRef = inject(ElementRef);
188
+ chip = inject(TngChip, { optional: true });
189
+ chips = inject(TngChips, { optional: true });
190
+ focused = false;
191
+ suppressNextClick = false;
192
+ ariaLabel = input(null, {
193
+ alias: 'tngChipRemoveAriaLabel',
194
+ });
195
+ isDisabled() {
196
+ return this.chip?.isDisabled() === true || this.chips?.isDisabled() === true;
197
+ }
198
+ onClick(event) {
199
+ if (this.suppressNextClick) {
200
+ this.suppressNextClick = false;
201
+ event.preventDefault();
202
+ event.stopPropagation();
203
+ return;
204
+ }
205
+ if (this.isDisabled()) {
206
+ event.preventDefault();
207
+ event.stopPropagation();
208
+ return;
209
+ }
210
+ this.chip?.requestRemove();
211
+ }
212
+ onFocusIn() {
213
+ this.focused = true;
214
+ }
215
+ onFocusOut() {
216
+ this.focused = false;
217
+ }
218
+ onKeydown(event) {
219
+ if (event.key !== 'Enter' && event.key !== ' ') {
220
+ return;
221
+ }
222
+ if (this.isDisabled()) {
223
+ event.preventDefault();
224
+ event.stopPropagation();
225
+ return;
226
+ }
227
+ event.preventDefault();
228
+ event.stopPropagation();
229
+ this.suppressNextClick = true;
230
+ setTimeout(() => {
231
+ this.suppressNextClick = false;
232
+ });
233
+ this.chip?.requestRemove();
234
+ }
235
+ get ariaLabelAttr() {
236
+ const explicit = normalizeString(this.ariaLabel());
237
+ if (explicit !== null) {
238
+ return explicit;
239
+ }
240
+ const hostDefined = normalizeString(this.elementRef.nativeElement.getAttribute('aria-label'));
241
+ if (hostDefined !== null) {
242
+ return hostDefined;
243
+ }
244
+ const label = this.chip?.resolvedLabel() ?? 'item';
245
+ return `Remove ${label}`;
246
+ }
247
+ get dataDisabledAttr() {
248
+ return this.isDisabled() ? '' : null;
249
+ }
250
+ get dataFocusedAttr() {
251
+ return this.focused ? '' : null;
252
+ }
253
+ dataSlot = 'chip-remove';
254
+ get disabledAttr() {
255
+ return this.isDisabled() ? '' : null;
256
+ }
257
+ get typeAttr() {
258
+ return this.elementRef.nativeElement.tagName === 'BUTTON' ? 'button' : null;
259
+ }
260
+ };
261
+ __decorate([
262
+ HostListener('click', ['$event'])
263
+ ], TngChipRemove.prototype, "onClick", null);
264
+ __decorate([
265
+ HostListener('focusin')
266
+ ], TngChipRemove.prototype, "onFocusIn", null);
267
+ __decorate([
268
+ HostListener('focusout')
269
+ ], TngChipRemove.prototype, "onFocusOut", null);
270
+ __decorate([
271
+ HostListener('keydown', ['$event'])
272
+ ], TngChipRemove.prototype, "onKeydown", null);
273
+ __decorate([
274
+ HostBinding('attr.aria-label')
275
+ ], TngChipRemove.prototype, "ariaLabelAttr", null);
276
+ __decorate([
277
+ HostBinding('attr.data-disabled')
278
+ ], TngChipRemove.prototype, "dataDisabledAttr", null);
279
+ __decorate([
280
+ HostBinding('attr.data-focused')
281
+ ], TngChipRemove.prototype, "dataFocusedAttr", null);
282
+ __decorate([
283
+ HostBinding('attr.data-slot')
284
+ ], TngChipRemove.prototype, "dataSlot", void 0);
285
+ __decorate([
286
+ HostBinding('attr.disabled')
287
+ ], TngChipRemove.prototype, "disabledAttr", null);
288
+ __decorate([
289
+ HostBinding('attr.type')
290
+ ], TngChipRemove.prototype, "typeAttr", null);
291
+ TngChipRemove = __decorate([
292
+ Directive({
293
+ selector: '[tngChipRemove]',
294
+ exportAs: 'tngChipRemove',
295
+ standalone: true,
296
+ })
297
+ ], TngChipRemove);
298
+ export { TngChipRemove };
16
299
  //# sourceMappingURL=tng-chips.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tng-chips.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/chips/tng-chips.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAMhD,IAAM,QAAQ,GAAd,MAAM,QAAQ;IAEA,QAAQ,GAAG,OAAgB,CAAC;CAChD,CAAA;AADoB;IADlB,WAAW,CAAC,gBAAgB,CAAC;0CACiB;AAFpC,QAAQ;IAJpB,SAAS,CAAC;QACT,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,UAAU;KACrB,CAAC;GACW,QAAQ,CAGpB","sourcesContent":["import { Directive, HostBinding } from '@angular/core';\n\n@Directive({\n selector: '[tngChips]',\n exportAs: 'tngChips',\n})\nexport class TngChips {\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'chips' as const;\n}\n"]}
1
+ {"version":3,"file":"tng-chips.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/chips/tng-chips.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,WAAW,EACX,YAAY,EAEZ,gBAAgB,EAChB,MAAM,EACN,KAAK,EACL,MAAM,EACN,MAAM,GACP,MAAM,eAAe,CAAC;AAEvB,SAAS,eAAe,CAAC,KAAgC;IACvD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC;AAED,SAAS,eAAe,CAAC,MAA6C;IACpE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,qBAAqB,CAAC,MAA0B,EAAE,MAAe;IACxE,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAClE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAOM,IAAM,QAAQ,GAAd,MAAM,QAAQ;IACF,cAAc,GAAG,MAAM,CAAqB,EAAE,CAAC,CAAC;IAEjD,MAAM,GAAG,KAAK,CAAiC,SAAS,EAAE;QACxE,KAAK,EAAE,gBAAgB;KACxB,CAAC,CAAC;IACa,aAAa,GAAG,KAAK,CAAqB,EAAE,EAAE;QAC5D,KAAK,EAAE,uBAAuB;KAC/B,CAAC,CAAC;IACa,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,KAAK,EAAE,kBAAkB;QACzB,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,SAAS,GAAG,KAAK,CAAgB,IAAI,EAAE;QACrD,KAAK,EAAE,mBAAmB;KAC3B,CAAC,CAAC;IAEa,UAAU,GAAG,MAAM,EAAW,CAAC;IAC/B,YAAY,GAAG,MAAM,EAAsB,CAAC;IAErD,QAAQ;QACb,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC;IAEM,UAAU;QACf,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAEM,WAAW,CAAC,KAAc;QAC/B,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE5B,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,qBAAqB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,UAAU,KAAK,aAAa,CAAC;QAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACzB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,YAAY;QAClB,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,SAAS,CAAC;IACrC,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACxB,OAAO,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;IAC/B,CAAC;IAGD,IAAc,aAAa;QACzB,OAAO,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3C,CAAC;IAGD,IAAc,gBAAgB;QAC5B,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACrC,CAAC;IAGkB,QAAQ,GAAG,OAAgB,CAAC;IAG5B,IAAI,GAAG,MAAe,CAAC;CAC3C,CAAA;AAdC;IADC,WAAW,CAAC,iBAAiB,CAAC;6CAG9B;AAGD;IADC,WAAW,CAAC,oBAAoB,CAAC;gDAGjC;AAGkB;IADlB,WAAW,CAAC,gBAAgB,CAAC;0CACiB;AAG5B;IADlB,WAAW,CAAC,WAAW,CAAC;sCACiB;AA5E/B,QAAQ;IALpB,SAAS,CAAC;QACT,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,UAAU;QACpB,UAAU,EAAE,IAAI;KACjB,CAAC;GACW,QAAQ,CA6EpB;;AAOM,IAAM,OAAO,GAAb,MAAM,OAAO;IACD,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,KAAK,GAAG,KAAK,CAAU,IAAI,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;IACxD,KAAK,GAAG,KAAK,CAAgB,IAAI,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;IAC9D,QAAQ,GAAG,KAAK,CAA4B,KAAK,EAAE;QACjE,KAAK,EAAE,iBAAiB;QACxB,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACa,SAAS,GAAG,KAAK,CAA4B,IAAI,EAAE;QACjE,KAAK,EAAE,kBAAkB;QACzB,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IAEa,UAAU,GAAG,MAAM,EAAW,CAAC;IAExC,UAAU;QACf,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAC9D,CAAC;IAEM,WAAW;QAChB,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IAChD,CAAC;IAEM,aAAa;QAClB,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAChD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5C,OAAO,eAAe,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC;IAC9C,CAAC;IAEM,aAAa;QAClB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAGS,SAAS,CAAC,KAAoB;QACtC,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;YACxD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAGD,IAAc,gBAAgB;QAC5B,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAGkB,QAAQ,GAAG,MAAe,CAAC;IAG9C,IAAc,aAAa;QACzB,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACnC,CAAC;IAGkB,IAAI,GAAG,UAAmB,CAAC;CAC/C,CAAA;AA7BW;IADT,YAAY,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC;wCAanC;AAGD;IADC,WAAW,CAAC,oBAAoB,CAAC;+CAGjC;AAGkB;IADlB,WAAW,CAAC,gBAAgB,CAAC;yCACgB;AAG9C;IADC,WAAW,CAAC,iBAAiB,CAAC;4CAG9B;AAGkB;IADlB,WAAW,CAAC,WAAW,CAAC;qCACqB;AA1EnC,OAAO;IALnB,SAAS,CAAC;QACT,QAAQ,EAAE,WAAW;QACrB,QAAQ,EAAE,SAAS;QACnB,UAAU,EAAE,IAAI;KACjB,CAAC;GACW,OAAO,CA2EnB;;AAOM,IAAM,aAAa,GAAnB,MAAM,aAAa;IACP,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC,CAAC;IACzD,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtD,OAAO,GAAG,KAAK,CAAC;IAChB,iBAAiB,GAAG,KAAK,CAAC;IAElB,SAAS,GAAG,KAAK,CAAgB,IAAI,EAAE;QACrD,KAAK,EAAE,wBAAwB;KAChC,CAAC,CAAC;IAEK,UAAU;QAChB,OAAO,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAC/E,CAAC;IAGS,OAAO,CAAC,KAAiB;QACjC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC/B,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACtB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC;IAC7B,CAAC;IAGS,SAAS;QACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAGS,UAAU;QAClB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;IAGS,SAAS,CAAC,KAAoB;QACtC,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACtB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC;IAC7B,CAAC;IAGD,IAAc,aAAa;QACzB,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACnD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;QAC9F,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,MAAM,CAAC;QACnD,OAAO,UAAU,KAAK,EAAE,CAAC;IAC3B,CAAC;IAGD,IAAc,gBAAgB;QAC5B,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAGD,IAAc,eAAe;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAClC,CAAC;IAGkB,QAAQ,GAAG,aAAsB,CAAC;IAGrD,IAAc,YAAY;QACxB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAGD,IAAc,QAAQ;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9E,CAAC;CACF,CAAA;AAxFW;IADT,YAAY,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;4CAgBjC;AAGS;IADT,YAAY,CAAC,SAAS,CAAC;8CAGvB;AAGS;IADT,YAAY,CAAC,UAAU,CAAC;+CAGxB;AAGS;IADT,YAAY,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC;8CAqBnC;AAGD;IADC,WAAW,CAAC,iBAAiB,CAAC;kDAc9B;AAGD;IADC,WAAW,CAAC,oBAAoB,CAAC;qDAGjC;AAGD;IADC,WAAW,CAAC,mBAAmB,CAAC;oDAGhC;AAGkB;IADlB,WAAW,CAAC,gBAAgB,CAAC;+CACuB;AAGrD;IADC,WAAW,CAAC,eAAe,CAAC;iDAG5B;AAGD;IADC,WAAW,CAAC,WAAW,CAAC;6CAGxB;AAxGU,aAAa;IALzB,SAAS,CAAC;QACT,QAAQ,EAAE,iBAAiB;QAC3B,QAAQ,EAAE,eAAe;QACzB,UAAU,EAAE,IAAI;KACjB,CAAC;GACW,aAAa,CAyGzB","sourcesContent":["import {\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n OnInit,\n booleanAttribute,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\n\nfunction normalizeString(value: string | null | undefined): string | null {\n if (value === undefined || value === null) {\n return null;\n }\n\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeValues(values: readonly unknown[] | null | undefined): readonly unknown[] {\n if (!Array.isArray(values) || values.length === 0) {\n return [];\n }\n\n return [...values];\n}\n\nfunction toDataValue(value: unknown): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n\n return String(value);\n}\n\nfunction removeFirstOccurrence(values: readonly unknown[], target: unknown): readonly unknown[] {\n const index = values.findIndex((item) => Object.is(item, target));\n if (index < 0) {\n return values;\n }\n\n return [...values.slice(0, index), ...values.slice(index + 1)];\n}\n\n@Directive({\n selector: '[tngChips]',\n exportAs: 'tngChips',\n standalone: true,\n})\nexport class TngChips implements OnInit {\n private readonly internalValues = signal<readonly unknown[]>([]);\n\n public readonly values = input<readonly unknown[] | undefined>(undefined, {\n alias: 'tngChipsValues',\n });\n public readonly defaultValues = input<readonly unknown[]>([], {\n alias: 'tngChipsDefaultValues',\n });\n public readonly disabled = input<boolean, boolean | string>(false, {\n alias: 'tngChipsDisabled',\n transform: booleanAttribute,\n });\n public readonly ariaLabel = input<string | null>(null, {\n alias: 'tngChipsAriaLabel',\n });\n\n public readonly chipRemove = output<unknown>();\n public readonly valuesChange = output<readonly unknown[]>();\n\n public ngOnInit(): void {\n this.internalValues.set(normalizeValues(this.defaultValues()));\n }\n\n public isDisabled(): boolean {\n return this.disabled();\n }\n\n public removeValue(value: unknown): boolean {\n if (this.disabled()) {\n return false;\n }\n\n this.chipRemove.emit(value);\n\n const currentValues = this.resolveValues();\n const nextValues = removeFirstOccurrence(currentValues, value);\n const changed = nextValues !== currentValues;\n if (!changed) {\n return true;\n }\n\n if (!this.isControlled()) {\n this.internalValues.set(nextValues);\n }\n\n this.valuesChange.emit(nextValues);\n return true;\n }\n\n private isControlled(): boolean {\n return this.values() !== undefined;\n }\n\n private resolveValues(): readonly unknown[] {\n if (this.isControlled()) {\n return normalizeValues(this.values());\n }\n\n return this.internalValues();\n }\n\n @HostBinding('attr.aria-label')\n protected get ariaLabelAttr(): string | null {\n return normalizeString(this.ariaLabel());\n }\n\n @HostBinding('attr.data-disabled')\n protected get dataDisabledAttr(): '' | null {\n return this.disabled() ? '' : null;\n }\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'chips' as const;\n\n @HostBinding('attr.role')\n protected readonly role = 'list' as const;\n}\n\n@Directive({\n selector: '[tngChip]',\n exportAs: 'tngChip',\n standalone: true,\n})\nexport class TngChip {\n private readonly chips = inject(TngChips, { optional: true });\n\n public readonly value = input<unknown>(null, { alias: 'tngChipValue' });\n public readonly label = input<string | null>(null, { alias: 'tngChipLabel' });\n public readonly disabled = input<boolean, boolean | string>(false, {\n alias: 'tngChipDisabled',\n transform: booleanAttribute,\n });\n public readonly removable = input<boolean, boolean | string>(true, {\n alias: 'tngChipRemovable',\n transform: booleanAttribute,\n });\n\n public readonly chipRemove = output<unknown>();\n\n public isDisabled(): boolean {\n return this.disabled() || this.chips?.isDisabled() === true;\n }\n\n public isRemovable(): boolean {\n return this.removable() && !this.isDisabled();\n }\n\n public resolvedLabel(): string {\n const fromInput = normalizeString(this.label());\n if (fromInput !== null) {\n return fromInput;\n }\n\n const fromValue = toDataValue(this.value());\n return normalizeString(fromValue) ?? 'item';\n }\n\n public requestRemove(): boolean {\n if (!this.isRemovable()) {\n return false;\n }\n\n const chipValue = this.value();\n this.chipRemove.emit(chipValue);\n this.chips?.removeValue(chipValue);\n return true;\n }\n\n @HostListener('keydown', ['$event'])\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Delete' && event.key !== 'Backspace') {\n return;\n }\n\n if (!this.isRemovable()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.requestRemove();\n }\n\n @HostBinding('attr.data-disabled')\n protected get dataDisabledAttr(): '' | null {\n return this.isDisabled() ? '' : null;\n }\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'chip' as const;\n\n @HostBinding('attr.data-value')\n protected get dataValueAttr(): string | null {\n return toDataValue(this.value());\n }\n\n @HostBinding('attr.role')\n protected readonly role = 'listitem' as const;\n}\n\n@Directive({\n selector: '[tngChipRemove]',\n exportAs: 'tngChipRemove',\n standalone: true,\n})\nexport class TngChipRemove {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly chip = inject(TngChip, { optional: true });\n private readonly chips = inject(TngChips, { optional: true });\n\n private focused = false;\n private suppressNextClick = false;\n\n public readonly ariaLabel = input<string | null>(null, {\n alias: 'tngChipRemoveAriaLabel',\n });\n\n private isDisabled(): boolean {\n return this.chip?.isDisabled() === true || this.chips?.isDisabled() === true;\n }\n\n @HostListener('click', ['$event'])\n protected onClick(event: MouseEvent): void {\n if (this.suppressNextClick) {\n this.suppressNextClick = false;\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (this.isDisabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n this.chip?.requestRemove();\n }\n\n @HostListener('focusin')\n protected onFocusIn(): void {\n this.focused = true;\n }\n\n @HostListener('focusout')\n protected onFocusOut(): void {\n this.focused = false;\n }\n\n @HostListener('keydown', ['$event'])\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Enter' && event.key !== ' ') {\n return;\n }\n\n if (this.isDisabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n this.suppressNextClick = true;\n setTimeout(() => {\n this.suppressNextClick = false;\n });\n\n this.chip?.requestRemove();\n }\n\n @HostBinding('attr.aria-label')\n protected get ariaLabelAttr(): string {\n const explicit = normalizeString(this.ariaLabel());\n if (explicit !== null) {\n return explicit;\n }\n\n const hostDefined = normalizeString(this.elementRef.nativeElement.getAttribute('aria-label'));\n if (hostDefined !== null) {\n return hostDefined;\n }\n\n const label = this.chip?.resolvedLabel() ?? 'item';\n return `Remove ${label}`;\n }\n\n @HostBinding('attr.data-disabled')\n protected get dataDisabledAttr(): '' | null {\n return this.isDisabled() ? '' : null;\n }\n\n @HostBinding('attr.data-focused')\n protected get dataFocusedAttr(): '' | null {\n return this.focused ? '' : null;\n }\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'chip-remove' as const;\n\n @HostBinding('attr.disabled')\n protected get disabledAttr(): '' | null {\n return this.isDisabled() ? '' : null;\n }\n\n @HostBinding('attr.type')\n protected get typeAttr(): 'button' | null {\n return this.elementRef.nativeElement.tagName === 'BUTTON' ? 'button' : null;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tng-combobox.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/combobox/tng-combobox.ts"],"names":[],"mappings":"AAEA,qBAIa,WAAW;IAEtB,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,UAAU,CAAU;CACnD"}
1
+ {"version":3,"file":"tng-combobox.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/combobox/tng-combobox.ts"],"names":[],"mappings":"AAEA,qBAKa,WAAW;IAEtB,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,UAAU,CAAU;CACnD"}
@@ -10,6 +10,7 @@ TngCombobox = __decorate([
10
10
  Directive({
11
11
  selector: '[tngCombobox]',
12
12
  exportAs: 'tngCombobox',
13
+ standalone: true,
13
14
  })
14
15
  ], TngCombobox);
15
16
  export { TngCombobox };
@@ -1 +1 @@
1
- {"version":3,"file":"tng-combobox.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/combobox/tng-combobox.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAMhD,IAAM,WAAW,GAAjB,MAAM,WAAW;IAEH,QAAQ,GAAG,UAAmB,CAAC;CACnD,CAAA;AADoB;IADlB,WAAW,CAAC,gBAAgB,CAAC;6CACoB;AAFvC,WAAW;IAJvB,SAAS,CAAC;QACT,QAAQ,EAAE,eAAe;QACzB,QAAQ,EAAE,aAAa;KACxB,CAAC;GACW,WAAW,CAGvB","sourcesContent":["import { Directive, HostBinding } from '@angular/core';\n\n@Directive({\n selector: '[tngCombobox]',\n exportAs: 'tngCombobox',\n})\nexport class TngCombobox {\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'combobox' as const;\n}\n"]}
1
+ {"version":3,"file":"tng-combobox.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/combobox/tng-combobox.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAOhD,IAAM,WAAW,GAAjB,MAAM,WAAW;IAEH,QAAQ,GAAG,UAAmB,CAAC;CACnD,CAAA;AADoB;IADlB,WAAW,CAAC,gBAAgB,CAAC;6CACoB;AAFvC,WAAW;IALvB,SAAS,CAAC;QACT,QAAQ,EAAE,eAAe;QACzB,QAAQ,EAAE,aAAa;QACvB,UAAU,EAAE,IAAI;KACjB,CAAC;GACW,WAAW,CAGvB","sourcesContent":["import { Directive, HostBinding } from '@angular/core';\n\n@Directive({\n selector: '[tngCombobox]',\n exportAs: 'tngCombobox',\n standalone: true,\n})\nexport class TngCombobox {\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'combobox' as const;\n}\n"]}
@@ -1,7 +1,29 @@
1
1
  export declare function normalizeTngOtpLength(value: number): number;
2
+ export type TngOtpCompletionState = 'complete' | 'empty' | 'partial';
3
+ export declare function normalizeTngOtpValue(value: unknown): string;
4
+ export declare function clampTngOtpValue(value: string, length: number): string;
5
+ export declare function resolveTngOtpState(length: number, value: string): TngOtpCompletionState;
2
6
  export declare class TngInputOtp {
3
7
  readonly length: import("@angular/core").InputSignalWithTransform<number, string | number>;
8
+ readonly value: import("@angular/core").InputSignal<string>;
9
+ readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
10
+ readonly readonly: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
11
+ readonly required: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
12
+ readonly invalid: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
13
+ readonly focused: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
14
+ readonly focusVisible: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
15
+ readonly activeIndex: import("@angular/core").InputSignal<number | null>;
4
16
  protected readonly dataSlot: "input-otp";
5
17
  protected readonly roleAttr: "group";
18
+ protected get dataEmptyAttr(): '' | null;
19
+ protected get dataPartialAttr(): '' | null;
20
+ protected get dataCompleteAttr(): '' | null;
21
+ protected get dataDisabledAttr(): '' | null;
22
+ protected get dataReadonlyAttr(): '' | null;
23
+ protected get dataRequiredAttr(): '' | null;
24
+ protected get dataInvalidAttr(): '' | null;
25
+ protected get dataFocusedAttr(): '' | null;
26
+ protected get dataFocusVisibleAttr(): '' | null;
27
+ protected get dataActiveAttr(): string | null;
6
28
  }
7
29
  //# sourceMappingURL=tng-input-otp.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tng-input-otp.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/input-otp/tng-input-otp.ts"],"names":[],"mappings":"AAEA,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAW3D;AAED,qBAIa,WAAW;IACtB,SAAgB,MAAM,4EAGnB;IAGH,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,WAAW,CAAU;IAGnD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,OAAO,CAAU;CAChD"}
1
+ {"version":3,"file":"tng-input-otp.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/input-otp/tng-input-otp.ts"],"names":[],"mappings":"AAEA,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAW3D;AAED,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AAErE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAM3D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,qBAAqB,CASvF;AAED,qBAKa,WAAW;IACtB,SAAgB,MAAM,4EAGnB;IACH,SAAgB,KAAK,8CAAqB;IAC1C,SAAgB,QAAQ,8EAErB;IACH,SAAgB,QAAQ,8EAErB;IACH,SAAgB,QAAQ,8EAErB;IACH,SAAgB,OAAO,8EAEpB;IACH,SAAgB,OAAO,8EAEpB;IACH,SAAgB,YAAY,8EAEzB;IACH,SAAgB,WAAW,qDAA8B;IAGzD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,WAAW,CAAU;IAGnD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,OAAO,CAAU;IAG/C,SAAS,KAAK,aAAa,IAAI,EAAE,GAAG,IAAI,CAEvC;IAGD,SAAS,KAAK,eAAe,IAAI,EAAE,GAAG,IAAI,CAEzC;IAGD,SAAS,KAAK,gBAAgB,IAAI,EAAE,GAAG,IAAI,CAE1C;IAGD,SAAS,KAAK,gBAAgB,IAAI,EAAE,GAAG,IAAI,CAE1C;IAGD,SAAS,KAAK,gBAAgB,IAAI,EAAE,GAAG,IAAI,CAE1C;IAGD,SAAS,KAAK,gBAAgB,IAAI,EAAE,GAAG,IAAI,CAE1C;IAGD,SAAS,KAAK,eAAe,IAAI,EAAE,GAAG,IAAI,CAEzC;IAGD,SAAS,KAAK,eAAe,IAAI,EAAE,GAAG,IAAI,CAEzC;IAGD,SAAS,KAAK,oBAAoB,IAAI,EAAE,GAAG,IAAI,CAE9C;IAGD,SAAS,KAAK,cAAc,IAAI,MAAM,GAAG,IAAI,CAW5C;CACF"}
@@ -1,5 +1,5 @@
1
1
  import { __decorate } from "tslib";
2
- import { Directive, HostBinding, input } from '@angular/core';
2
+ import { Directive, HostBinding, booleanAttribute, input } from '@angular/core';
3
3
  export function normalizeTngOtpLength(value) {
4
4
  if (!Number.isFinite(value)) {
5
5
  return 6;
@@ -10,12 +10,86 @@ export function normalizeTngOtpLength(value) {
10
10
  }
11
11
  return rounded > 12 ? 12 : rounded;
12
12
  }
13
+ export function normalizeTngOtpValue(value) {
14
+ if (typeof value !== 'string') {
15
+ return '';
16
+ }
17
+ return value;
18
+ }
19
+ export function clampTngOtpValue(value, length) {
20
+ return Array.from(value).slice(0, length).join('');
21
+ }
22
+ export function resolveTngOtpState(length, value) {
23
+ const normalizedLength = normalizeTngOtpLength(length);
24
+ const clampedValue = clampTngOtpValue(normalizeTngOtpValue(value), normalizedLength);
25
+ if (clampedValue.length === 0) {
26
+ return 'empty';
27
+ }
28
+ return clampedValue.length >= normalizedLength ? 'complete' : 'partial';
29
+ }
13
30
  let TngInputOtp = class TngInputOtp {
14
31
  length = input(6, {
15
32
  transform: (value) => normalizeTngOtpLength(typeof value === 'number' ? value : Number(value)),
16
33
  });
34
+ value = input('');
35
+ disabled = input(false, {
36
+ transform: booleanAttribute,
37
+ });
38
+ readonly = input(false, {
39
+ transform: booleanAttribute,
40
+ });
41
+ required = input(false, {
42
+ transform: booleanAttribute,
43
+ });
44
+ invalid = input(false, {
45
+ transform: booleanAttribute,
46
+ });
47
+ focused = input(false, {
48
+ transform: booleanAttribute,
49
+ });
50
+ focusVisible = input(false, {
51
+ transform: booleanAttribute,
52
+ });
53
+ activeIndex = input(null);
17
54
  dataSlot = 'input-otp';
18
55
  roleAttr = 'group';
56
+ get dataEmptyAttr() {
57
+ return resolveTngOtpState(this.length(), this.value()) === 'empty' ? '' : null;
58
+ }
59
+ get dataPartialAttr() {
60
+ return resolveTngOtpState(this.length(), this.value()) === 'partial' ? '' : null;
61
+ }
62
+ get dataCompleteAttr() {
63
+ return resolveTngOtpState(this.length(), this.value()) === 'complete' ? '' : null;
64
+ }
65
+ get dataDisabledAttr() {
66
+ return this.disabled() ? '' : null;
67
+ }
68
+ get dataReadonlyAttr() {
69
+ return this.readonly() ? '' : null;
70
+ }
71
+ get dataRequiredAttr() {
72
+ return this.required() ? '' : null;
73
+ }
74
+ get dataInvalidAttr() {
75
+ return this.invalid() ? '' : null;
76
+ }
77
+ get dataFocusedAttr() {
78
+ return this.focused() ? '' : null;
79
+ }
80
+ get dataFocusVisibleAttr() {
81
+ return this.focusVisible() ? '' : null;
82
+ }
83
+ get dataActiveAttr() {
84
+ const index = this.activeIndex();
85
+ if (typeof index !== 'number' || !Number.isFinite(index)) {
86
+ return null;
87
+ }
88
+ if (index < 0 || index >= this.length()) {
89
+ return null;
90
+ }
91
+ return String(index);
92
+ }
19
93
  };
20
94
  __decorate([
21
95
  HostBinding('attr.data-slot')
@@ -23,10 +97,41 @@ __decorate([
23
97
  __decorate([
24
98
  HostBinding('attr.role')
25
99
  ], TngInputOtp.prototype, "roleAttr", void 0);
100
+ __decorate([
101
+ HostBinding('attr.data-empty')
102
+ ], TngInputOtp.prototype, "dataEmptyAttr", null);
103
+ __decorate([
104
+ HostBinding('attr.data-partial')
105
+ ], TngInputOtp.prototype, "dataPartialAttr", null);
106
+ __decorate([
107
+ HostBinding('attr.data-complete')
108
+ ], TngInputOtp.prototype, "dataCompleteAttr", null);
109
+ __decorate([
110
+ HostBinding('attr.data-disabled')
111
+ ], TngInputOtp.prototype, "dataDisabledAttr", null);
112
+ __decorate([
113
+ HostBinding('attr.data-readonly')
114
+ ], TngInputOtp.prototype, "dataReadonlyAttr", null);
115
+ __decorate([
116
+ HostBinding('attr.data-required')
117
+ ], TngInputOtp.prototype, "dataRequiredAttr", null);
118
+ __decorate([
119
+ HostBinding('attr.data-invalid')
120
+ ], TngInputOtp.prototype, "dataInvalidAttr", null);
121
+ __decorate([
122
+ HostBinding('attr.data-focused')
123
+ ], TngInputOtp.prototype, "dataFocusedAttr", null);
124
+ __decorate([
125
+ HostBinding('attr.data-focus-visible')
126
+ ], TngInputOtp.prototype, "dataFocusVisibleAttr", null);
127
+ __decorate([
128
+ HostBinding('attr.data-active')
129
+ ], TngInputOtp.prototype, "dataActiveAttr", null);
26
130
  TngInputOtp = __decorate([
27
131
  Directive({
28
132
  selector: '[tngInputOtp]',
29
133
  exportAs: 'tngInputOtp',
134
+ standalone: true,
30
135
  })
31
136
  ], TngInputOtp);
32
137
  export { TngInputOtp };
@@ -1 +1 @@
1
- {"version":3,"file":"tng-input-otp.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/input-otp/tng-input-otp.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAE9D,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACrC,CAAC;AAMM,IAAM,WAAW,GAAjB,MAAM,WAAW;IACN,MAAM,GAAG,KAAK,CAA0B,CAAC,EAAE;QACzD,SAAS,EAAE,CAAC,KAAsB,EAAU,EAAE,CAC5C,qBAAqB,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC3E,CAAC,CAAC;IAGgB,QAAQ,GAAG,WAAoB,CAAC;IAGhC,QAAQ,GAAG,OAAgB,CAAC;CAChD,CAAA;AAJoB;IADlB,WAAW,CAAC,gBAAgB,CAAC;6CACqB;AAGhC;IADlB,WAAW,CAAC,WAAW,CAAC;6CACsB;AAVpC,WAAW;IAJvB,SAAS,CAAC;QACT,QAAQ,EAAE,eAAe;QACzB,QAAQ,EAAE,aAAa;KACxB,CAAC;GACW,WAAW,CAWvB","sourcesContent":["import { Directive, HostBinding, input } from '@angular/core';\n\nexport function normalizeTngOtpLength(value: number): number {\n if (!Number.isFinite(value)) {\n return 6;\n }\n\n const rounded = Math.trunc(value);\n if (rounded < 1) {\n return 1;\n }\n\n return rounded > 12 ? 12 : rounded;\n}\n\n@Directive({\n selector: '[tngInputOtp]',\n exportAs: 'tngInputOtp',\n})\nexport class TngInputOtp {\n public readonly length = input<number, number | string>(6, {\n transform: (value: number | string): number =>\n normalizeTngOtpLength(typeof value === 'number' ? value : Number(value)),\n });\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'input-otp' as const;\n\n @HostBinding('attr.role')\n protected readonly roleAttr = 'group' as const;\n}\n"]}
1
+ {"version":3,"file":"tng-input-otp.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/input-otp/tng-input-otp.ts"],"names":[],"mappings":"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","sourcesContent":["import { Directive, HostBinding, booleanAttribute, input } from '@angular/core';\n\nexport function normalizeTngOtpLength(value: number): number {\n if (!Number.isFinite(value)) {\n return 6;\n }\n\n const rounded = Math.trunc(value);\n if (rounded < 1) {\n return 1;\n }\n\n return rounded > 12 ? 12 : rounded;\n}\n\nexport type TngOtpCompletionState = 'complete' | 'empty' | 'partial';\n\nexport function normalizeTngOtpValue(value: unknown): string {\n if (typeof value !== 'string') {\n return '';\n }\n\n return value;\n}\n\nexport function clampTngOtpValue(value: string, length: number): string {\n return Array.from(value).slice(0, length).join('');\n}\n\nexport function resolveTngOtpState(length: number, value: string): TngOtpCompletionState {\n const normalizedLength = normalizeTngOtpLength(length);\n const clampedValue = clampTngOtpValue(normalizeTngOtpValue(value), normalizedLength);\n\n if (clampedValue.length === 0) {\n return 'empty';\n }\n\n return clampedValue.length >= normalizedLength ? 'complete' : 'partial';\n}\n\n@Directive({\n selector: '[tngInputOtp]',\n exportAs: 'tngInputOtp',\n standalone: true,\n})\nexport class TngInputOtp {\n public readonly length = input<number, number | string>(6, {\n transform: (value: number | string): number =>\n normalizeTngOtpLength(typeof value === 'number' ? value : Number(value)),\n });\n public readonly value = input<string>('');\n public readonly disabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\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 invalid = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly focused = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly focusVisible = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly activeIndex = input<number | null>(null);\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'input-otp' as const;\n\n @HostBinding('attr.role')\n protected readonly roleAttr = 'group' as const;\n\n @HostBinding('attr.data-empty')\n protected get dataEmptyAttr(): '' | null {\n return resolveTngOtpState(this.length(), this.value()) === 'empty' ? '' : null;\n }\n\n @HostBinding('attr.data-partial')\n protected get dataPartialAttr(): '' | null {\n return resolveTngOtpState(this.length(), this.value()) === 'partial' ? '' : null;\n }\n\n @HostBinding('attr.data-complete')\n protected get dataCompleteAttr(): '' | null {\n return resolveTngOtpState(this.length(), this.value()) === 'complete' ? '' : null;\n }\n\n @HostBinding('attr.data-disabled')\n protected get dataDisabledAttr(): '' | null {\n return this.disabled() ? '' : null;\n }\n\n @HostBinding('attr.data-readonly')\n protected get dataReadonlyAttr(): '' | null {\n return this.readonly() ? '' : null;\n }\n\n @HostBinding('attr.data-required')\n protected get dataRequiredAttr(): '' | null {\n return this.required() ? '' : null;\n }\n\n @HostBinding('attr.data-invalid')\n protected get dataInvalidAttr(): '' | null {\n return this.invalid() ? '' : null;\n }\n\n @HostBinding('attr.data-focused')\n protected get dataFocusedAttr(): '' | null {\n return this.focused() ? '' : null;\n }\n\n @HostBinding('attr.data-focus-visible')\n protected get dataFocusVisibleAttr(): '' | null {\n return this.focusVisible() ? '' : null;\n }\n\n @HostBinding('attr.data-active')\n protected get dataActiveAttr(): string | null {\n const index = this.activeIndex();\n if (typeof index !== 'number' || !Number.isFinite(index)) {\n return null;\n }\n\n if (index < 0 || index >= this.length()) {\n return null;\n }\n\n return String(index);\n }\n}\n"]}
@@ -1,6 +1,8 @@
1
1
  export declare class TngLabel {
2
2
  readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
3
+ readonly required: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
3
4
  protected get dataDisabledAttr(): '' | null;
5
+ protected get dataRequiredAttr(): '' | null;
4
6
  protected readonly dataSlot: "label";
5
7
  }
6
8
  //# sourceMappingURL=tng-label.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tng-label.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/label/tng-label.ts"],"names":[],"mappings":"AAEA,qBAIa,QAAQ;IACnB,SAAgB,QAAQ,8EAErB;IAGH,SAAS,KAAK,gBAAgB,IAAI,EAAE,GAAG,IAAI,CAE1C;IAGD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,OAAO,CAAU;CAChD"}
1
+ {"version":3,"file":"tng-label.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/label/tng-label.ts"],"names":[],"mappings":"AAEA,qBAKa,QAAQ;IACnB,SAAgB,QAAQ,8EAErB;IACH,SAAgB,QAAQ,8EAErB;IAGH,SAAS,KAAK,gBAAgB,IAAI,EAAE,GAAG,IAAI,CAE1C;IAGD,SAAS,KAAK,gBAAgB,IAAI,EAAE,GAAG,IAAI,CAE1C;IAGD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,OAAO,CAAU;CAChD"}