@star-ng/ui 0.0.0-stage → 0.2.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 (217) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +162 -2
  3. package/fesm2022/star-ng-ui-accordion.mjs +376 -0
  4. package/fesm2022/star-ng-ui-accordion.mjs.map +1 -0
  5. package/fesm2022/star-ng-ui-autocomplete.mjs +786 -0
  6. package/fesm2022/star-ng-ui-autocomplete.mjs.map +1 -0
  7. package/fesm2022/star-ng-ui-avatar.mjs +154 -0
  8. package/fesm2022/star-ng-ui-avatar.mjs.map +1 -0
  9. package/fesm2022/star-ng-ui-badge.mjs +153 -0
  10. package/fesm2022/star-ng-ui-badge.mjs.map +1 -0
  11. package/fesm2022/star-ng-ui-breadcrumb.mjs +199 -0
  12. package/fesm2022/star-ng-ui-breadcrumb.mjs.map +1 -0
  13. package/fesm2022/star-ng-ui-button.mjs +282 -0
  14. package/fesm2022/star-ng-ui-button.mjs.map +1 -0
  15. package/fesm2022/star-ng-ui-card.mjs +112 -0
  16. package/fesm2022/star-ng-ui-card.mjs.map +1 -0
  17. package/fesm2022/star-ng-ui-chart.mjs +1904 -0
  18. package/fesm2022/star-ng-ui-chart.mjs.map +1 -0
  19. package/fesm2022/star-ng-ui-checkbox.mjs +345 -0
  20. package/fesm2022/star-ng-ui-checkbox.mjs.map +1 -0
  21. package/fesm2022/star-ng-ui-core.mjs +484 -0
  22. package/fesm2022/star-ng-ui-core.mjs.map +1 -0
  23. package/fesm2022/star-ng-ui-data-display.mjs +1870 -0
  24. package/fesm2022/star-ng-ui-data-display.mjs.map +1 -0
  25. package/fesm2022/star-ng-ui-date-picker.mjs +2786 -0
  26. package/fesm2022/star-ng-ui-date-picker.mjs.map +1 -0
  27. package/fesm2022/star-ng-ui-dialog.mjs +948 -0
  28. package/fesm2022/star-ng-ui-dialog.mjs.map +1 -0
  29. package/fesm2022/star-ng-ui-drawer.mjs +158 -0
  30. package/fesm2022/star-ng-ui-drawer.mjs.map +1 -0
  31. package/fesm2022/star-ng-ui-editor.mjs +416 -0
  32. package/fesm2022/star-ng-ui-editor.mjs.map +1 -0
  33. package/fesm2022/star-ng-ui-field.mjs +378 -0
  34. package/fesm2022/star-ng-ui-field.mjs.map +1 -0
  35. package/fesm2022/star-ng-ui-file-upload.mjs +762 -0
  36. package/fesm2022/star-ng-ui-file-upload.mjs.map +1 -0
  37. package/fesm2022/star-ng-ui-i18n-de.mjs +179 -0
  38. package/fesm2022/star-ng-ui-i18n-de.mjs.map +1 -0
  39. package/fesm2022/star-ng-ui-i18n-es.mjs +179 -0
  40. package/fesm2022/star-ng-ui-i18n-es.mjs.map +1 -0
  41. package/fesm2022/star-ng-ui-input-group.mjs +188 -0
  42. package/fesm2022/star-ng-ui-input-group.mjs.map +1 -0
  43. package/fesm2022/star-ng-ui-input-mask.mjs +434 -0
  44. package/fesm2022/star-ng-ui-input-mask.mjs.map +1 -0
  45. package/fesm2022/star-ng-ui-input-number.mjs +691 -0
  46. package/fesm2022/star-ng-ui-input-number.mjs.map +1 -0
  47. package/fesm2022/star-ng-ui-input-otp.mjs +343 -0
  48. package/fesm2022/star-ng-ui-input-otp.mjs.map +1 -0
  49. package/fesm2022/star-ng-ui-input-tags.mjs +616 -0
  50. package/fesm2022/star-ng-ui-input-tags.mjs.map +1 -0
  51. package/fesm2022/star-ng-ui-knob.mjs +514 -0
  52. package/fesm2022/star-ng-ui-knob.mjs.map +1 -0
  53. package/fesm2022/star-ng-ui-layout.mjs +608 -0
  54. package/fesm2022/star-ng-ui-layout.mjs.map +1 -0
  55. package/fesm2022/star-ng-ui-listbox.mjs +886 -0
  56. package/fesm2022/star-ng-ui-listbox.mjs.map +1 -0
  57. package/fesm2022/star-ng-ui-media.mjs +833 -0
  58. package/fesm2022/star-ng-ui-media.mjs.map +1 -0
  59. package/fesm2022/star-ng-ui-menu.mjs +1840 -0
  60. package/fesm2022/star-ng-ui-menu.mjs.map +1 -0
  61. package/fesm2022/star-ng-ui-message.mjs +191 -0
  62. package/fesm2022/star-ng-ui-message.mjs.map +1 -0
  63. package/fesm2022/star-ng-ui-paginator.mjs +387 -0
  64. package/fesm2022/star-ng-ui-paginator.mjs.map +1 -0
  65. package/fesm2022/star-ng-ui-panel.mjs +324 -0
  66. package/fesm2022/star-ng-ui-panel.mjs.map +1 -0
  67. package/fesm2022/star-ng-ui-password.mjs +517 -0
  68. package/fesm2022/star-ng-ui-password.mjs.map +1 -0
  69. package/fesm2022/star-ng-ui-popover.mjs +241 -0
  70. package/fesm2022/star-ng-ui-popover.mjs.map +1 -0
  71. package/fesm2022/star-ng-ui-progress-bar.mjs +183 -0
  72. package/fesm2022/star-ng-ui-progress-bar.mjs.map +1 -0
  73. package/fesm2022/star-ng-ui-radio.mjs +411 -0
  74. package/fesm2022/star-ng-ui-radio.mjs.map +1 -0
  75. package/fesm2022/star-ng-ui-rating.mjs +211 -0
  76. package/fesm2022/star-ng-ui-rating.mjs.map +1 -0
  77. package/fesm2022/star-ng-ui-select-button.mjs +613 -0
  78. package/fesm2022/star-ng-ui-select-button.mjs.map +1 -0
  79. package/fesm2022/star-ng-ui-select.mjs +2547 -0
  80. package/fesm2022/star-ng-ui-select.mjs.map +1 -0
  81. package/fesm2022/star-ng-ui-skeleton.mjs +160 -0
  82. package/fesm2022/star-ng-ui-skeleton.mjs.map +1 -0
  83. package/fesm2022/star-ng-ui-slider.mjs +552 -0
  84. package/fesm2022/star-ng-ui-slider.mjs.map +1 -0
  85. package/fesm2022/star-ng-ui-spinner.mjs +148 -0
  86. package/fesm2022/star-ng-ui-spinner.mjs.map +1 -0
  87. package/fesm2022/star-ng-ui-stepper.mjs +360 -0
  88. package/fesm2022/star-ng-ui-stepper.mjs.map +1 -0
  89. package/fesm2022/star-ng-ui-table.mjs +3531 -0
  90. package/fesm2022/star-ng-ui-table.mjs.map +1 -0
  91. package/fesm2022/star-ng-ui-tabs.mjs +464 -0
  92. package/fesm2022/star-ng-ui-tabs.mjs.map +1 -0
  93. package/fesm2022/star-ng-ui-tag.mjs +129 -0
  94. package/fesm2022/star-ng-ui-tag.mjs.map +1 -0
  95. package/fesm2022/star-ng-ui-theme-switch.mjs +105 -0
  96. package/fesm2022/star-ng-ui-theme-switch.mjs.map +1 -0
  97. package/fesm2022/star-ng-ui-theme.mjs +98 -0
  98. package/fesm2022/star-ng-ui-theme.mjs.map +1 -0
  99. package/fesm2022/star-ng-ui-toast.mjs +298 -0
  100. package/fesm2022/star-ng-ui-toast.mjs.map +1 -0
  101. package/fesm2022/star-ng-ui-toggle-switch.mjs +316 -0
  102. package/fesm2022/star-ng-ui-toggle-switch.mjs.map +1 -0
  103. package/fesm2022/star-ng-ui-tooltip.mjs +297 -0
  104. package/fesm2022/star-ng-ui-tooltip.mjs.map +1 -0
  105. package/fesm2022/star-ng-ui-transloco.mjs +40 -0
  106. package/fesm2022/star-ng-ui-transloco.mjs.map +1 -0
  107. package/fesm2022/star-ng-ui-tree.mjs +1446 -0
  108. package/fesm2022/star-ng-ui-tree.mjs.map +1 -0
  109. package/fesm2022/star-ng-ui-utility.mjs +2134 -0
  110. package/fesm2022/star-ng-ui-utility.mjs.map +1 -0
  111. package/fesm2022/star-ng-ui.mjs +51 -0
  112. package/package.json +285 -3
  113. package/styles/_base.scss +70 -0
  114. package/styles/_shared.scss +2 -0
  115. package/styles/_tokens.scss +190 -0
  116. package/styles/controls/_accordion.scss +75 -0
  117. package/styles/controls/_autocomplete.scss +44 -0
  118. package/styles/controls/_avatar.scss +39 -0
  119. package/styles/controls/_breadcrumb.scss +45 -0
  120. package/styles/controls/_button.scss +137 -0
  121. package/styles/controls/_card.scss +38 -0
  122. package/styles/controls/_chart.scss +214 -0
  123. package/styles/controls/_chip.scss +51 -0
  124. package/styles/controls/_choice.scss +153 -0
  125. package/styles/controls/_data-display.scss +124 -0
  126. package/styles/controls/_date-picker.scss +300 -0
  127. package/styles/controls/_dialog.scss +123 -0
  128. package/styles/controls/_drawer.scss +118 -0
  129. package/styles/controls/_editor.scss +74 -0
  130. package/styles/controls/_field.scss +92 -0
  131. package/styles/controls/_file-upload.scss +136 -0
  132. package/styles/controls/_input-group.scss +104 -0
  133. package/styles/controls/_input-mask.scss +46 -0
  134. package/styles/controls/_input-number.scss +125 -0
  135. package/styles/controls/_knob.scss +76 -0
  136. package/styles/controls/_layout.scss +182 -0
  137. package/styles/controls/_listbox.scss +38 -0
  138. package/styles/controls/_media.scss +222 -0
  139. package/styles/controls/_menu.scss +254 -0
  140. package/styles/controls/_message.scss +48 -0
  141. package/styles/controls/_org-chart.scss +128 -0
  142. package/styles/controls/_paginator.scss +59 -0
  143. package/styles/controls/_panel.scss +83 -0
  144. package/styles/controls/_popover.scss +40 -0
  145. package/styles/controls/_progress-bar.scss +74 -0
  146. package/styles/controls/_select-button.scss +61 -0
  147. package/styles/controls/_select.scss +216 -0
  148. package/styles/controls/_skeleton.scss +43 -0
  149. package/styles/controls/_slider.scss +163 -0
  150. package/styles/controls/_spinner.scss +34 -0
  151. package/styles/controls/_stepper.scss +109 -0
  152. package/styles/controls/_table.scss +523 -0
  153. package/styles/controls/_tabs.scss +93 -0
  154. package/styles/controls/_tag.scss +84 -0
  155. package/styles/controls/_toast.scss +141 -0
  156. package/styles/controls/_tooltip.scss +14 -0
  157. package/styles/controls/_tree.scss +113 -0
  158. package/styles/controls/_utility.scss +654 -0
  159. package/styles/star-ng.css +5807 -0
  160. package/styles/star-ng.min.css +1 -0
  161. package/styles/star-ng.scss +50 -0
  162. package/theme/star-theme-first-paint.js +1 -0
  163. package/types/star-ng-ui-accordion.d.ts +82 -0
  164. package/types/star-ng-ui-autocomplete.d.ts +171 -0
  165. package/types/star-ng-ui-avatar.d.ts +43 -0
  166. package/types/star-ng-ui-badge.d.ts +46 -0
  167. package/types/star-ng-ui-breadcrumb.d.ts +39 -0
  168. package/types/star-ng-ui-button.d.ts +79 -0
  169. package/types/star-ng-ui-card.d.ts +29 -0
  170. package/types/star-ng-ui-chart.d.ts +337 -0
  171. package/types/star-ng-ui-checkbox.d.ts +92 -0
  172. package/types/star-ng-ui-core.d.ts +373 -0
  173. package/types/star-ng-ui-data-display.d.ts +438 -0
  174. package/types/star-ng-ui-date-picker.d.ts +701 -0
  175. package/types/star-ng-ui-dialog.d.ts +254 -0
  176. package/types/star-ng-ui-drawer.d.ts +29 -0
  177. package/types/star-ng-ui-editor.d.ts +96 -0
  178. package/types/star-ng-ui-field.d.ts +146 -0
  179. package/types/star-ng-ui-file-upload.d.ts +192 -0
  180. package/types/star-ng-ui-i18n-de.d.ts +7 -0
  181. package/types/star-ng-ui-i18n-es.d.ts +7 -0
  182. package/types/star-ng-ui-input-group.d.ts +58 -0
  183. package/types/star-ng-ui-input-mask.d.ts +126 -0
  184. package/types/star-ng-ui-input-number.d.ts +193 -0
  185. package/types/star-ng-ui-input-otp.d.ts +86 -0
  186. package/types/star-ng-ui-input-tags.d.ts +159 -0
  187. package/types/star-ng-ui-knob.d.ts +121 -0
  188. package/types/star-ng-ui-layout.d.ts +154 -0
  189. package/types/star-ng-ui-listbox.d.ts +170 -0
  190. package/types/star-ng-ui-media.d.ts +161 -0
  191. package/types/star-ng-ui-menu.d.ts +332 -0
  192. package/types/star-ng-ui-message.d.ts +52 -0
  193. package/types/star-ng-ui-paginator.d.ts +85 -0
  194. package/types/star-ng-ui-panel.d.ts +65 -0
  195. package/types/star-ng-ui-password.d.ts +129 -0
  196. package/types/star-ng-ui-popover.d.ts +57 -0
  197. package/types/star-ng-ui-progress-bar.d.ts +49 -0
  198. package/types/star-ng-ui-radio.d.ts +116 -0
  199. package/types/star-ng-ui-rating.d.ts +52 -0
  200. package/types/star-ng-ui-select-button.d.ts +169 -0
  201. package/types/star-ng-ui-select.d.ts +563 -0
  202. package/types/star-ng-ui-skeleton.d.ts +47 -0
  203. package/types/star-ng-ui-slider.d.ts +145 -0
  204. package/types/star-ng-ui-spinner.d.ts +29 -0
  205. package/types/star-ng-ui-stepper.d.ts +89 -0
  206. package/types/star-ng-ui-table.d.ts +885 -0
  207. package/types/star-ng-ui-tabs.d.ts +109 -0
  208. package/types/star-ng-ui-tag.d.ts +35 -0
  209. package/types/star-ng-ui-theme-switch.d.ts +36 -0
  210. package/types/star-ng-ui-theme.d.ts +95 -0
  211. package/types/star-ng-ui-toast.d.ts +84 -0
  212. package/types/star-ng-ui-toggle-switch.d.ts +81 -0
  213. package/types/star-ng-ui-tooltip.d.ts +66 -0
  214. package/types/star-ng-ui-transloco.d.ts +14 -0
  215. package/types/star-ng-ui-tree.d.ts +343 -0
  216. package/types/star-ng-ui-utility.d.ts +533 -0
  217. package/types/star-ng-ui.d.ts +51 -0
@@ -0,0 +1,616 @@
1
+ import { _IdGenerator } from "@angular/cdk/a11y";
2
+ import * as i0 from "@angular/core";
3
+ import { ChangeDetectionStrategy, Component, booleanAttribute, computed, inject, input, model, output, signal, viewChild } from "@angular/core";
4
+ import { STAR_UI_TEXT } from "@star-ng/ui/core";
5
+ import { StarField } from "@star-ng/ui/field";
6
+ var StarInputTags = class StarInputTags {
7
+ text = inject(STAR_UI_TEXT);
8
+ ids = inject(_IdGenerator);
9
+ field = inject(StarField, { optional: true });
10
+ constructor() {
11
+ this.field?.linkControl(this.inputId);
12
+ }
13
+ value = model([], ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
14
+ placeholder = input(null, ...ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []);
15
+ separators = input([",", ";"], ...ngDevMode ? [{ debugName: "separators" }] : /* istanbul ignore next */ []);
16
+ validate = input(null, ...ngDevMode ? [{ debugName: "validate" }] : /* istanbul ignore next */ []);
17
+ allowDuplicates = input(false, {
18
+ ...ngDevMode ? { debugName: "allowDuplicates" } : /* istanbul ignore next */ {},
19
+ transform: booleanAttribute
20
+ });
21
+ maxTags = input(0, ...ngDevMode ? [{ debugName: "maxTags" }] : /* istanbul ignore next */ []);
22
+ maxLength = input(void 0, ...ngDevMode ? [{ debugName: "maxLength" }] : /* istanbul ignore next */ []);
23
+ addOnBlur = input(true, {
24
+ ...ngDevMode ? { debugName: "addOnBlur" } : /* istanbul ignore next */ {},
25
+ transform: booleanAttribute
26
+ });
27
+ showClear = input(false, {
28
+ ...ngDevMode ? { debugName: "showClear" } : /* istanbul ignore next */ {},
29
+ transform: booleanAttribute
30
+ });
31
+ ariaLabel = input(null, ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
32
+ inputId = input(this.ids.getId("star-tags-"), ...ngDevMode ? [{ debugName: "inputId" }] : /* istanbul ignore next */ []);
33
+ disabled = input(false, {
34
+ ...ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {},
35
+ transform: booleanAttribute
36
+ });
37
+ readonly = input(false, {
38
+ ...ngDevMode ? { debugName: "readonly" } : /* istanbul ignore next */ {},
39
+ transform: booleanAttribute
40
+ });
41
+ invalid = input(false, {
42
+ ...ngDevMode ? { debugName: "invalid" } : /* istanbul ignore next */ {},
43
+ transform: booleanAttribute
44
+ });
45
+ touched = input(false, {
46
+ ...ngDevMode ? { debugName: "touched" } : /* istanbul ignore next */ {},
47
+ transform: booleanAttribute
48
+ });
49
+ name = input("", ...ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []);
50
+ touch = output();
51
+ added = output();
52
+ removed = output();
53
+ rejected = output();
54
+ hintId = this.ids.getId("star-tags-hint-");
55
+ describedBy = computed(() => [this.hintId, this.field?.describedBy()].filter(Boolean).join(" "), ...ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []);
56
+ draft = signal("", ...ngDevMode ? [{ debugName: "draft" }] : /* istanbul ignore next */ []);
57
+ rejection = signal(null, ...ngDevMode ? [{ debugName: "rejection" }] : /* istanbul ignore next */ []);
58
+ announcement = signal("", ...ngDevMode ? [{ debugName: "announcement" }] : /* istanbul ignore next */ []);
59
+ input = viewChild.required("input", ...ngDevMode ? [{ debugName: "input" }] : /* istanbul ignore next */ []);
60
+ atLimit = computed(() => this.maxTags() > 0 && this.value().length >= this.maxTags(), ...ngDevMode ? [{ debugName: "atLimit" }] : /* istanbul ignore next */ []);
61
+ rejectionText = computed(() => {
62
+ const rejection = this.rejection();
63
+ if (!rejection) return null;
64
+ if (rejection.reason === "duplicate") return this.text.tagDuplicate(rejection.tag);
65
+ if (rejection.reason === "limit") return this.text.tagLimit(this.maxTags());
66
+ return this.text.tagInvalid(rejection.tag);
67
+ }, ...ngDevMode ? [{ debugName: "rejectionText" }] : /* istanbul ignore next */ []);
68
+ add(raw) {
69
+ if (this.disabled() || this.readonly()) return [...raw];
70
+ const next = [...this.value()];
71
+ const leftover = [];
72
+ let lastRejection = null;
73
+ for (const tag of raw.map((t) => t.trim()).filter(Boolean)) {
74
+ const lower = tag.toLocaleLowerCase();
75
+ let reason = null;
76
+ if (this.maxTags() > 0 && next.length >= this.maxTags()) reason = "limit";
77
+ else if (this.validate() && !this.validate()(tag)) reason = "invalid";
78
+ else if (!this.allowDuplicates() && next.some((t) => t.toLocaleLowerCase() === lower)) reason = "duplicate";
79
+ if (reason) {
80
+ leftover.push(tag);
81
+ lastRejection = {
82
+ tag,
83
+ reason
84
+ };
85
+ this.rejected.emit({
86
+ tag,
87
+ reason
88
+ });
89
+ continue;
90
+ }
91
+ next.push(tag);
92
+ this.added.emit(tag);
93
+ this.announcement.set(this.text.tagAdded(tag));
94
+ }
95
+ if (next.length !== this.value().length) this.value.set(next);
96
+ this.rejection.set(lastRejection);
97
+ return leftover;
98
+ }
99
+ removeAt(index) {
100
+ const tag = this.value()[index];
101
+ if (tag === void 0 || this.disabled() || this.readonly()) return;
102
+ this.value.update((tags) => tags.filter((_, i) => i !== index));
103
+ this.removed.emit(tag);
104
+ this.announcement.set(this.text.tagRemoved(tag));
105
+ this.rejection.set(null);
106
+ this.focus();
107
+ }
108
+ clear() {
109
+ this.value.set([]);
110
+ this.rejection.set(null);
111
+ this.focus();
112
+ }
113
+ splitPattern() {
114
+ const escaped = this.separators().map((s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
115
+ return new RegExp(`[${escaped.join("")}\\n\\t]`);
116
+ }
117
+ setDraft(text) {
118
+ this.draft.set(text);
119
+ this.input().nativeElement.value = text;
120
+ }
121
+ onInput(input) {
122
+ const text = input.value;
123
+ this.rejection.set(null);
124
+ if (this.separators().some((s) => text.includes(s))) {
125
+ const parts = text.split(this.splitPattern());
126
+ const last = parts.pop() ?? "";
127
+ const leftover = this.add(parts);
128
+ this.setDraft(leftover.length ? leftover.join(", ") : last);
129
+ } else this.draft.set(text);
130
+ }
131
+ onKeydown(event) {
132
+ const draft = this.draft().trim();
133
+ if ((event.key === "Enter" || event.key === "Tab" && draft) && draft) {
134
+ event.preventDefault();
135
+ const leftover = this.add([draft]);
136
+ this.setDraft(leftover[0] ?? "");
137
+ } else if (event.key === "Backspace" && !this.draft() && this.value().length) {
138
+ event.preventDefault();
139
+ this.removeAt(this.value().length - 1);
140
+ } else if (event.key === "Escape" && this.draft()) {
141
+ this.setDraft("");
142
+ this.rejection.set(null);
143
+ }
144
+ }
145
+ onPaste(event) {
146
+ const text = event.clipboardData?.getData("text") ?? "";
147
+ if (!this.splitPattern().test(text)) return;
148
+ event.preventDefault();
149
+ const leftover = this.add(text.split(this.splitPattern()));
150
+ this.setDraft(leftover.join(", "));
151
+ }
152
+ onBlur() {
153
+ if (this.addOnBlur() && this.draft().trim()) {
154
+ const leftover = this.add([this.draft()]);
155
+ this.setDraft(leftover[0] ?? "");
156
+ }
157
+ this.touch.emit();
158
+ }
159
+ focus(options) {
160
+ this.input().nativeElement.focus(options);
161
+ }
162
+ static ɵfac = i0.ɵɵngDeclareFactory({
163
+ minVersion: "12.0.0",
164
+ version: "22.2.6",
165
+ ngImport: i0,
166
+ type: StarInputTags,
167
+ deps: [],
168
+ target: i0.ɵɵFactoryTarget.Component
169
+ });
170
+ static ɵcmp = i0.ɵɵngDeclareComponent({
171
+ minVersion: "17.0.0",
172
+ version: "22.2.6",
173
+ type: StarInputTags,
174
+ isStandalone: true,
175
+ selector: "star-input-tags",
176
+ inputs: {
177
+ value: {
178
+ classPropertyName: "value",
179
+ publicName: "value",
180
+ isSignal: true,
181
+ isRequired: false,
182
+ transformFunction: null
183
+ },
184
+ placeholder: {
185
+ classPropertyName: "placeholder",
186
+ publicName: "placeholder",
187
+ isSignal: true,
188
+ isRequired: false,
189
+ transformFunction: null
190
+ },
191
+ separators: {
192
+ classPropertyName: "separators",
193
+ publicName: "separators",
194
+ isSignal: true,
195
+ isRequired: false,
196
+ transformFunction: null
197
+ },
198
+ validate: {
199
+ classPropertyName: "validate",
200
+ publicName: "validate",
201
+ isSignal: true,
202
+ isRequired: false,
203
+ transformFunction: null
204
+ },
205
+ allowDuplicates: {
206
+ classPropertyName: "allowDuplicates",
207
+ publicName: "allowDuplicates",
208
+ isSignal: true,
209
+ isRequired: false,
210
+ transformFunction: null
211
+ },
212
+ maxTags: {
213
+ classPropertyName: "maxTags",
214
+ publicName: "maxTags",
215
+ isSignal: true,
216
+ isRequired: false,
217
+ transformFunction: null
218
+ },
219
+ maxLength: {
220
+ classPropertyName: "maxLength",
221
+ publicName: "maxLength",
222
+ isSignal: true,
223
+ isRequired: false,
224
+ transformFunction: null
225
+ },
226
+ addOnBlur: {
227
+ classPropertyName: "addOnBlur",
228
+ publicName: "addOnBlur",
229
+ isSignal: true,
230
+ isRequired: false,
231
+ transformFunction: null
232
+ },
233
+ showClear: {
234
+ classPropertyName: "showClear",
235
+ publicName: "showClear",
236
+ isSignal: true,
237
+ isRequired: false,
238
+ transformFunction: null
239
+ },
240
+ ariaLabel: {
241
+ classPropertyName: "ariaLabel",
242
+ publicName: "ariaLabel",
243
+ isSignal: true,
244
+ isRequired: false,
245
+ transformFunction: null
246
+ },
247
+ inputId: {
248
+ classPropertyName: "inputId",
249
+ publicName: "inputId",
250
+ isSignal: true,
251
+ isRequired: false,
252
+ transformFunction: null
253
+ },
254
+ disabled: {
255
+ classPropertyName: "disabled",
256
+ publicName: "disabled",
257
+ isSignal: true,
258
+ isRequired: false,
259
+ transformFunction: null
260
+ },
261
+ readonly: {
262
+ classPropertyName: "readonly",
263
+ publicName: "readonly",
264
+ isSignal: true,
265
+ isRequired: false,
266
+ transformFunction: null
267
+ },
268
+ invalid: {
269
+ classPropertyName: "invalid",
270
+ publicName: "invalid",
271
+ isSignal: true,
272
+ isRequired: false,
273
+ transformFunction: null
274
+ },
275
+ touched: {
276
+ classPropertyName: "touched",
277
+ publicName: "touched",
278
+ isSignal: true,
279
+ isRequired: false,
280
+ transformFunction: null
281
+ },
282
+ name: {
283
+ classPropertyName: "name",
284
+ publicName: "name",
285
+ isSignal: true,
286
+ isRequired: false,
287
+ transformFunction: null
288
+ }
289
+ },
290
+ outputs: {
291
+ value: "valueChange",
292
+ touch: "touch",
293
+ added: "added",
294
+ removed: "removed",
295
+ rejected: "rejected"
296
+ },
297
+ host: {
298
+ properties: {
299
+ "class.star-select--disabled": "disabled()",
300
+ "class.star-select--invalid": "(invalid() && touched()) || !!rejection()"
301
+ },
302
+ classAttribute: "star-select star-tags"
303
+ },
304
+ viewQueries: [{
305
+ propertyName: "input",
306
+ first: true,
307
+ predicate: ["input"],
308
+ descendants: true,
309
+ isSignal: true
310
+ }],
311
+ ngImport: i0,
312
+ template: `
313
+ <!-- Pointer convenience only: keyboard users reach the input directly. -->
314
+ <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->
315
+ <div class="star-select__control star-ac__control star-tags__control" (click)="focus()">
316
+ <ul
317
+ class="star-tags__list"
318
+ [attr.aria-label]="ariaLabel()"
319
+ [attr.aria-disabled]="disabled() || null"
320
+ >
321
+ @for (tag of value(); track tag; let i = $index) {
322
+ <li class="star-chip star-chip--sm">
323
+ {{ tag }}
324
+ @if (!disabled() && !readonly()) {
325
+ <button
326
+ type="button"
327
+ class="star-chip__remove"
328
+ tabindex="-1"
329
+ [attr.aria-label]="text.removeItem(tag)"
330
+ (click)="$event.stopPropagation(); removeAt(i)"
331
+ >
332
+ <i class="ph-bold ph-x" aria-hidden="true"></i>
333
+ </button>
334
+ }
335
+ </li>
336
+ }
337
+ </ul>
338
+ <input
339
+ #input
340
+ type="text"
341
+ class="star-ac__input"
342
+ autocomplete="off"
343
+ [id]="inputId()"
344
+ [attr.name]="name() || null"
345
+ [value]="draft()"
346
+ [attr.placeholder]="atLimit() ? null : placeholder()"
347
+ [attr.maxlength]="maxLength() ?? null"
348
+ [disabled]="disabled()"
349
+ [readOnly]="readonly() || atLimit()"
350
+ [attr.aria-label]="ariaLabel()"
351
+ [attr.aria-describedby]="describedBy()"
352
+ [attr.aria-invalid]="(invalid() && touched()) || !!rejection() || null"
353
+ (input)="onInput(input)"
354
+ (keydown)="onKeydown($event)"
355
+ (paste)="onPaste($event)"
356
+ (blur)="onBlur()"
357
+ />
358
+ @if (showClear() && value().length && !disabled() && !readonly()) {
359
+ <button
360
+ type="button"
361
+ class="star-select__icon-btn"
362
+ [attr.aria-label]="text.clear"
363
+ (click)="$event.stopPropagation(); clear()"
364
+ >
365
+ <i class="ph-bold ph-x" aria-hidden="true"></i>
366
+ </button>
367
+ }
368
+ </div>
369
+ <p class="star-sr-only" [id]="hintId">{{ text.tagsHint }}</p>
370
+ <p class="star-sr-only" aria-live="polite">{{ announcement() }}</p>
371
+ @if (rejectionText(); as message) {
372
+ <p class="star-field__error star-tags__error" role="alert">{{ message }}</p>
373
+ }
374
+ `,
375
+ isInline: true,
376
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
377
+ });
378
+ };
379
+ i0.ɵɵngDeclareClassMetadata({
380
+ minVersion: "12.0.0",
381
+ version: "22.2.6",
382
+ ngImport: i0,
383
+ type: StarInputTags,
384
+ decorators: [{
385
+ type: Component,
386
+ args: [{
387
+ selector: "star-input-tags",
388
+ changeDetection: ChangeDetectionStrategy.OnPush,
389
+ host: {
390
+ class: "star-select star-tags",
391
+ "[class.star-select--disabled]": "disabled()",
392
+ "[class.star-select--invalid]": "(invalid() && touched()) || !!rejection()"
393
+ },
394
+ template: `
395
+ <!-- Pointer convenience only: keyboard users reach the input directly. -->
396
+ <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->
397
+ <div class="star-select__control star-ac__control star-tags__control" (click)="focus()">
398
+ <ul
399
+ class="star-tags__list"
400
+ [attr.aria-label]="ariaLabel()"
401
+ [attr.aria-disabled]="disabled() || null"
402
+ >
403
+ @for (tag of value(); track tag; let i = $index) {
404
+ <li class="star-chip star-chip--sm">
405
+ {{ tag }}
406
+ @if (!disabled() && !readonly()) {
407
+ <button
408
+ type="button"
409
+ class="star-chip__remove"
410
+ tabindex="-1"
411
+ [attr.aria-label]="text.removeItem(tag)"
412
+ (click)="$event.stopPropagation(); removeAt(i)"
413
+ >
414
+ <i class="ph-bold ph-x" aria-hidden="true"></i>
415
+ </button>
416
+ }
417
+ </li>
418
+ }
419
+ </ul>
420
+ <input
421
+ #input
422
+ type="text"
423
+ class="star-ac__input"
424
+ autocomplete="off"
425
+ [id]="inputId()"
426
+ [attr.name]="name() || null"
427
+ [value]="draft()"
428
+ [attr.placeholder]="atLimit() ? null : placeholder()"
429
+ [attr.maxlength]="maxLength() ?? null"
430
+ [disabled]="disabled()"
431
+ [readOnly]="readonly() || atLimit()"
432
+ [attr.aria-label]="ariaLabel()"
433
+ [attr.aria-describedby]="describedBy()"
434
+ [attr.aria-invalid]="(invalid() && touched()) || !!rejection() || null"
435
+ (input)="onInput(input)"
436
+ (keydown)="onKeydown($event)"
437
+ (paste)="onPaste($event)"
438
+ (blur)="onBlur()"
439
+ />
440
+ @if (showClear() && value().length && !disabled() && !readonly()) {
441
+ <button
442
+ type="button"
443
+ class="star-select__icon-btn"
444
+ [attr.aria-label]="text.clear"
445
+ (click)="$event.stopPropagation(); clear()"
446
+ >
447
+ <i class="ph-bold ph-x" aria-hidden="true"></i>
448
+ </button>
449
+ }
450
+ </div>
451
+ <p class="star-sr-only" [id]="hintId">{{ text.tagsHint }}</p>
452
+ <p class="star-sr-only" aria-live="polite">{{ announcement() }}</p>
453
+ @if (rejectionText(); as message) {
454
+ <p class="star-field__error star-tags__error" role="alert">{{ message }}</p>
455
+ }
456
+ `
457
+ }]
458
+ }],
459
+ ctorParameters: () => [],
460
+ propDecorators: {
461
+ value: [{
462
+ type: i0.Input,
463
+ args: [{
464
+ isSignal: true,
465
+ alias: "value",
466
+ required: false
467
+ }]
468
+ }, {
469
+ type: i0.Output,
470
+ args: ["valueChange"]
471
+ }],
472
+ placeholder: [{
473
+ type: i0.Input,
474
+ args: [{
475
+ isSignal: true,
476
+ alias: "placeholder",
477
+ required: false
478
+ }]
479
+ }],
480
+ separators: [{
481
+ type: i0.Input,
482
+ args: [{
483
+ isSignal: true,
484
+ alias: "separators",
485
+ required: false
486
+ }]
487
+ }],
488
+ validate: [{
489
+ type: i0.Input,
490
+ args: [{
491
+ isSignal: true,
492
+ alias: "validate",
493
+ required: false
494
+ }]
495
+ }],
496
+ allowDuplicates: [{
497
+ type: i0.Input,
498
+ args: [{
499
+ isSignal: true,
500
+ alias: "allowDuplicates",
501
+ required: false
502
+ }]
503
+ }],
504
+ maxTags: [{
505
+ type: i0.Input,
506
+ args: [{
507
+ isSignal: true,
508
+ alias: "maxTags",
509
+ required: false
510
+ }]
511
+ }],
512
+ maxLength: [{
513
+ type: i0.Input,
514
+ args: [{
515
+ isSignal: true,
516
+ alias: "maxLength",
517
+ required: false
518
+ }]
519
+ }],
520
+ addOnBlur: [{
521
+ type: i0.Input,
522
+ args: [{
523
+ isSignal: true,
524
+ alias: "addOnBlur",
525
+ required: false
526
+ }]
527
+ }],
528
+ showClear: [{
529
+ type: i0.Input,
530
+ args: [{
531
+ isSignal: true,
532
+ alias: "showClear",
533
+ required: false
534
+ }]
535
+ }],
536
+ ariaLabel: [{
537
+ type: i0.Input,
538
+ args: [{
539
+ isSignal: true,
540
+ alias: "ariaLabel",
541
+ required: false
542
+ }]
543
+ }],
544
+ inputId: [{
545
+ type: i0.Input,
546
+ args: [{
547
+ isSignal: true,
548
+ alias: "inputId",
549
+ required: false
550
+ }]
551
+ }],
552
+ disabled: [{
553
+ type: i0.Input,
554
+ args: [{
555
+ isSignal: true,
556
+ alias: "disabled",
557
+ required: false
558
+ }]
559
+ }],
560
+ readonly: [{
561
+ type: i0.Input,
562
+ args: [{
563
+ isSignal: true,
564
+ alias: "readonly",
565
+ required: false
566
+ }]
567
+ }],
568
+ invalid: [{
569
+ type: i0.Input,
570
+ args: [{
571
+ isSignal: true,
572
+ alias: "invalid",
573
+ required: false
574
+ }]
575
+ }],
576
+ touched: [{
577
+ type: i0.Input,
578
+ args: [{
579
+ isSignal: true,
580
+ alias: "touched",
581
+ required: false
582
+ }]
583
+ }],
584
+ name: [{
585
+ type: i0.Input,
586
+ args: [{
587
+ isSignal: true,
588
+ alias: "name",
589
+ required: false
590
+ }]
591
+ }],
592
+ touch: [{
593
+ type: i0.Output,
594
+ args: ["touch"]
595
+ }],
596
+ added: [{
597
+ type: i0.Output,
598
+ args: ["added"]
599
+ }],
600
+ removed: [{
601
+ type: i0.Output,
602
+ args: ["removed"]
603
+ }],
604
+ rejected: [{
605
+ type: i0.Output,
606
+ args: ["rejected"]
607
+ }],
608
+ input: [{
609
+ type: i0.ViewChild,
610
+ args: ["input", { isSignal: true }]
611
+ }]
612
+ }
613
+ });
614
+ export { StarInputTags };
615
+
616
+ //# sourceMappingURL=star-ng-ui-input-tags.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"star-ng-ui-input-tags.mjs","names":[],"sources":["../../../projects/star-ng/input-tags/input-tags.ts"],"sourcesContent":["import { _IdGenerator } from '@angular/cdk/a11y';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { STAR_UI_TEXT } from '@star-ng/ui/core';\nimport { StarField } from '@star-ng/ui/field';\n\nexport type StarTagRejection = 'invalid' | 'duplicate' | 'limit';\n\n/**\n * Free-text tag field (PrimeNG `p-inputtags` / chips): type a value and press Enter, a\n * separator (default comma) or Tab to add it as a chip. Pasting \"a, b; c\" adds several.\n * Backspace in the empty field removes the last chip; each chip has a remove button.\n * Optional `validate` (for example an e-mail check), duplicate prevention, `maxTags` count and\n * per-tag `maxLength`. A live region announces added, removed and rejected tags.\n *\n * `<star-input-tags [formField]=\"form.cc\" [validate]=\"isEmail\" placeholder=\"Add e-mail\" ariaLabel=\"CC\" />`\n */\n@Component({\n selector: 'star-input-tags',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'star-select star-tags',\n '[class.star-select--disabled]': 'disabled()',\n '[class.star-select--invalid]': '(invalid() && touched()) || !!rejection()',\n },\n template: `\n <!-- Pointer convenience only: keyboard users reach the input directly. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div class=\"star-select__control star-ac__control star-tags__control\" (click)=\"focus()\">\n <ul\n class=\"star-tags__list\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-disabled]=\"disabled() || null\"\n >\n @for (tag of value(); track tag; let i = $index) {\n <li class=\"star-chip star-chip--sm\">\n {{ tag }}\n @if (!disabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"star-chip__remove\"\n tabindex=\"-1\"\n [attr.aria-label]=\"text.removeItem(tag)\"\n (click)=\"$event.stopPropagation(); removeAt(i)\"\n >\n <i class=\"ph-bold ph-x\" aria-hidden=\"true\"></i>\n </button>\n }\n </li>\n }\n </ul>\n <input\n #input\n type=\"text\"\n class=\"star-ac__input\"\n autocomplete=\"off\"\n [id]=\"inputId()\"\n [attr.name]=\"name() || null\"\n [value]=\"draft()\"\n [attr.placeholder]=\"atLimit() ? null : placeholder()\"\n [attr.maxlength]=\"maxLength() ?? null\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly() || atLimit()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"(invalid() && touched()) || !!rejection() || null\"\n (input)=\"onInput(input)\"\n (keydown)=\"onKeydown($event)\"\n (paste)=\"onPaste($event)\"\n (blur)=\"onBlur()\"\n />\n @if (showClear() && value().length && !disabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"star-select__icon-btn\"\n [attr.aria-label]=\"text.clear\"\n (click)=\"$event.stopPropagation(); clear()\"\n >\n <i class=\"ph-bold ph-x\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n <p class=\"star-sr-only\" [id]=\"hintId\">{{ text.tagsHint }}</p>\n <p class=\"star-sr-only\" aria-live=\"polite\">{{ announcement() }}</p>\n @if (rejectionText(); as message) {\n <p class=\"star-field__error star-tags__error\" role=\"alert\">{{ message }}</p>\n }\n `,\n})\nexport class StarInputTags implements FormValueControl<readonly string[]> {\n protected readonly text = inject(STAR_UI_TEXT);\n private readonly ids = inject(_IdGenerator);\n private readonly field = inject(StarField, { optional: true });\n\n constructor() {\n // The label of a parent `star-field` points at the input.\n this.field?.linkControl(this.inputId);\n }\n\n readonly value = model<readonly string[]>([]);\n readonly placeholder = input<string | null>(null);\n /** Characters that end a tag while typing or split pasted text (Enter always adds). */\n readonly separators = input<readonly string[]>([',', ';']);\n /** Returns true for a valid tag. Invalid text stays in the field with an error. */\n readonly validate = input<((tag: string) => boolean) | null>(null);\n readonly allowDuplicates = input(false, { transform: booleanAttribute });\n /** Maximum number of tags (0 = no limit). */\n readonly maxTags = input(0);\n /** Maximum characters per tag. */\n readonly maxLength = input<number | undefined>(undefined);\n /** Add the typed text when the field loses focus. */\n readonly addOnBlur = input(true, { transform: booleanAttribute });\n readonly showClear = input(false, { transform: booleanAttribute });\n readonly ariaLabel = input<string | null>(null);\n readonly inputId = input(this.ids.getId('star-tags-'));\n\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly invalid = input(false, { transform: booleanAttribute });\n readonly touched = input(false, { transform: booleanAttribute });\n readonly name = input('');\n readonly touch = output<void>();\n readonly added = output<string>();\n readonly removed = output<string>();\n readonly rejected = output<{ tag: string; reason: StarTagRejection }>();\n\n protected readonly hintId = this.ids.getId('star-tags-hint-');\n /** The hint of the keys, and the hint or error of a parent `star-field`. */\n protected readonly describedBy = computed(() =>\n [this.hintId, this.field?.describedBy()].filter(Boolean).join(' '),\n );\n protected readonly draft = signal('');\n protected readonly rejection = signal<{ tag: string; reason: StarTagRejection } | null>(null);\n protected readonly announcement = signal('');\n private readonly input = viewChild.required<ElementRef<HTMLInputElement>>('input');\n\n protected readonly atLimit = computed(\n () => this.maxTags() > 0 && this.value().length >= this.maxTags(),\n );\n protected readonly rejectionText = computed(() => {\n const rejection = this.rejection();\n if (!rejection) return null;\n if (rejection.reason === 'duplicate') return this.text.tagDuplicate(rejection.tag);\n if (rejection.reason === 'limit') return this.text.tagLimit(this.maxTags());\n return this.text.tagInvalid(rejection.tag);\n });\n\n /** Adds tags; returns the texts that were not added (invalid, duplicate or over the limit). */\n add(raw: readonly string[]): string[] {\n if (this.disabled() || this.readonly()) return [...raw];\n const next = [...this.value()];\n const leftover: string[] = [];\n let lastRejection: { tag: string; reason: StarTagRejection } | null = null;\n for (const tag of raw.map((t) => t.trim()).filter(Boolean)) {\n const lower = tag.toLocaleLowerCase();\n let reason: StarTagRejection | null = null;\n if (this.maxTags() > 0 && next.length >= this.maxTags()) reason = 'limit';\n else if (this.validate() && !this.validate()!(tag)) reason = 'invalid';\n else if (!this.allowDuplicates() && next.some((t) => t.toLocaleLowerCase() === lower))\n reason = 'duplicate';\n if (reason) {\n leftover.push(tag);\n lastRejection = { tag, reason };\n this.rejected.emit({ tag, reason });\n continue;\n }\n next.push(tag);\n this.added.emit(tag);\n this.announcement.set(this.text.tagAdded(tag));\n }\n if (next.length !== this.value().length) this.value.set(next);\n this.rejection.set(lastRejection);\n return leftover;\n }\n\n removeAt(index: number): void {\n const tag = this.value()[index];\n if (tag === undefined || this.disabled() || this.readonly()) return;\n this.value.update((tags) => tags.filter((_, i) => i !== index));\n this.removed.emit(tag);\n this.announcement.set(this.text.tagRemoved(tag));\n this.rejection.set(null);\n this.focus();\n }\n\n clear(): void {\n this.value.set([]);\n this.rejection.set(null);\n this.focus();\n }\n\n private splitPattern(): RegExp {\n const escaped = this.separators().map((s) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\n return new RegExp(`[${escaped.join('')}\\\\n\\\\t]`);\n }\n\n /** Writes the draft to signal and DOM (the binding skips unchanged signal values). */\n private setDraft(text: string): void {\n this.draft.set(text);\n this.input().nativeElement.value = text;\n }\n\n protected onInput(input: HTMLInputElement): void {\n const text = input.value;\n this.rejection.set(null);\n if (this.separators().some((s) => text.includes(s))) {\n const parts = text.split(this.splitPattern());\n const last = parts.pop() ?? '';\n const leftover = this.add(parts);\n this.setDraft(leftover.length ? leftover.join(', ') : last);\n } else {\n this.draft.set(text);\n }\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const draft = this.draft().trim();\n if ((event.key === 'Enter' || (event.key === 'Tab' && draft)) && draft) {\n event.preventDefault();\n const leftover = this.add([draft]);\n this.setDraft(leftover[0] ?? '');\n } else if (event.key === 'Backspace' && !this.draft() && this.value().length) {\n event.preventDefault();\n this.removeAt(this.value().length - 1);\n } else if (event.key === 'Escape' && this.draft()) {\n this.setDraft('');\n this.rejection.set(null);\n }\n }\n\n protected onPaste(event: ClipboardEvent): void {\n const text = event.clipboardData?.getData('text') ?? '';\n if (!this.splitPattern().test(text)) return;\n event.preventDefault();\n const leftover = this.add(text.split(this.splitPattern()));\n this.setDraft(leftover.join(', '));\n }\n\n protected onBlur(): void {\n if (this.addOnBlur() && this.draft().trim()) {\n const leftover = this.add([this.draft()]);\n this.setDraft(leftover[0] ?? '');\n }\n this.touch.emit();\n }\n\n focus(options?: FocusOptions): void {\n this.input().nativeElement.focus(options);\n }\n}\n"],"mappings":"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"}