@star-ng/ui 0.0.0-stage → 0.1.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 +148 -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 +782 -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 +392 -0
  22. package/fesm2022/star-ng-ui-core.mjs.map +1 -0
  23. package/fesm2022/star-ng-ui-data-display.mjs +1556 -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 +978 -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 +2523 -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 +3477 -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 +281 -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 +118 -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 +5803 -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 +310 -0
  173. package/types/star-ng-ui-data-display.d.ts +339 -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 +197 -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 +540 -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 +829 -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 +310 -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,392 @@
1
+ import { Directionality } from "@angular/cdk/bidi";
2
+ import { DOCUMENT } from "@angular/common";
3
+ import * as i0 from "@angular/core";
4
+ import { DestroyRef, Injectable, InjectionToken, Injector, effect, inject, provideEnvironmentInitializer, signal, untracked } from "@angular/core";
5
+ import { FormArray, FormGroup } from "@angular/forms";
6
+ import { SignalFormControl } from "@angular/forms/signals/compat";
7
+ function starDirectionOf(element) {
8
+ if (!element) return "ltr";
9
+ const attribute = element.closest("[dir]")?.getAttribute("dir")?.toLowerCase();
10
+ if (attribute === "rtl" || attribute === "ltr") return attribute;
11
+ return element.ownerDocument.defaultView?.getComputedStyle(element).direction === "rtl" ? "rtl" : "ltr";
12
+ }
13
+ function starIsRtl(element) {
14
+ return starDirectionOf(element) === "rtl";
15
+ }
16
+ function starInlineKey(event, element) {
17
+ if (event.key !== "ArrowLeft" && event.key !== "ArrowRight") return event.key;
18
+ if (!starIsRtl(element ?? (event.currentTarget instanceof Element ? event.currentTarget : null) ?? (event.target instanceof Element ? event.target : null))) return event.key;
19
+ return event.key === "ArrowLeft" ? "ArrowRight" : "ArrowLeft";
20
+ }
21
+ var StarDirectionService = class StarDirectionService {
22
+ document = inject(DOCUMENT);
23
+ directionality = inject(Directionality, { optional: true });
24
+ current = signal(this.read(), ...ngDevMode ? [{ debugName: "current" }] : /* istanbul ignore next */ []);
25
+ value = this.current.asReadonly();
26
+ constructor() {
27
+ this.sync();
28
+ const view = this.document.defaultView;
29
+ if (!view || typeof view.MutationObserver !== "function") return;
30
+ const observer = new view.MutationObserver(() => this.refresh());
31
+ const options = {
32
+ attributes: true,
33
+ attributeFilter: ["dir"]
34
+ };
35
+ observer.observe(this.document.documentElement, options);
36
+ if (this.document.body) observer.observe(this.document.body, options);
37
+ inject(DestroyRef).onDestroy(() => observer.disconnect());
38
+ }
39
+ refresh() {
40
+ const next = this.read();
41
+ if (next === this.current()) return;
42
+ this.current.set(next);
43
+ this.sync();
44
+ }
45
+ read() {
46
+ const raw = (this.document.body?.dir || this.document.documentElement.dir || "ltr").toLowerCase();
47
+ if (raw === "auto") return this.document.defaultView?.getComputedStyle(this.document.documentElement).direction === "rtl" ? "rtl" : "ltr";
48
+ return raw === "rtl" ? "rtl" : "ltr";
49
+ }
50
+ sync() {
51
+ const target = this.directionality;
52
+ if (!target || target.valueSignal() === this.current()) return;
53
+ target.valueSignal.set(this.current());
54
+ target.change.emit(this.current());
55
+ }
56
+ static ɵfac = i0.ɵɵngDeclareFactory({
57
+ minVersion: "12.0.0",
58
+ version: "22.2.6",
59
+ ngImport: i0,
60
+ type: StarDirectionService,
61
+ deps: [],
62
+ target: i0.ɵɵFactoryTarget.Injectable
63
+ });
64
+ static ɵprov = i0.ɵɵngDeclareInjectable({
65
+ minVersion: "12.0.0",
66
+ version: "22.2.6",
67
+ ngImport: i0,
68
+ type: StarDirectionService,
69
+ providedIn: "root"
70
+ });
71
+ };
72
+ i0.ɵɵngDeclareClassMetadata({
73
+ minVersion: "12.0.0",
74
+ version: "22.2.6",
75
+ ngImport: i0,
76
+ type: StarDirectionService,
77
+ decorators: [{
78
+ type: Injectable,
79
+ args: [{ providedIn: "root" }]
80
+ }],
81
+ ctorParameters: () => []
82
+ });
83
+ function provideStarDirection() {
84
+ return provideEnvironmentInitializer(() => {
85
+ inject(StarDirectionService);
86
+ });
87
+ }
88
+ function readOption(option, key) {
89
+ if (key === null || key === void 0) return option;
90
+ if (typeof key === "function") return key(option);
91
+ return option !== null && typeof option === "object" ? option[key] : void 0;
92
+ }
93
+ function optionText(option, key) {
94
+ const value = readOption(option, key ?? null);
95
+ return value === null || value === void 0 ? "" : String(value);
96
+ }
97
+ const collator = new Intl.Collator(void 0, {
98
+ numeric: true,
99
+ sensitivity: "base"
100
+ });
101
+ function compareValues(a, b) {
102
+ const aEmpty = a === null || a === void 0;
103
+ const bEmpty = b === null || b === void 0;
104
+ if (aEmpty && bEmpty) return 0;
105
+ if (aEmpty) return -1;
106
+ if (bEmpty) return 1;
107
+ if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();
108
+ if (typeof a === "number" && typeof b === "number") return a - b;
109
+ return collator.compare(String(a), String(b));
110
+ }
111
+ function matchesFilter(text, query) {
112
+ if (!query) return true;
113
+ const normalize = (value) => value.normalize("NFD").replace(/\p{Diacritic}/gu, "").toLocaleLowerCase();
114
+ return normalize(text).includes(normalize(query.trim()));
115
+ }
116
+ function signalControls(control) {
117
+ if (control instanceof SignalFormControl) return [control];
118
+ if (control instanceof FormGroup || control instanceof FormArray) return Object.values(control.controls).flatMap(signalControls);
119
+ return [];
120
+ }
121
+ function syncSignalFormControls(group, injector = inject(Injector)) {
122
+ const controls = signalControls(group);
123
+ return effect(() => {
124
+ for (const control of controls) {
125
+ const state = control.fieldTree();
126
+ state.valid();
127
+ state.disabled();
128
+ state.pending();
129
+ }
130
+ untracked(() => group.updateValueAndValidity());
131
+ }, { injector });
132
+ }
133
+ const STAR_UI_TEXT_DEFAULTS = {
134
+ close: "Close",
135
+ clear: "Clear",
136
+ loading: "Loading",
137
+ actions: "Actions",
138
+ moreActions: "More actions",
139
+ ofTotal: (index, total) => `${index} of ${total}`,
140
+ expandItem: (label) => `Expand ${label}`,
141
+ collapseItem: (label) => `Collapse ${label}`,
142
+ removeItem: (label) => `Remove ${label}`,
143
+ tagsHint: "Press Enter or comma to add. Backspace removes the last item.",
144
+ tagAdded: (label) => `${label} added`,
145
+ tagRemoved: (label) => `${label} removed`,
146
+ tagInvalid: (label) => `${label} is not valid.`,
147
+ tagDuplicate: (label) => `${label} is already added.`,
148
+ tagLimit: (max) => `You can add up to ${max} items.`,
149
+ notifications: "Notifications",
150
+ accept: "Confirm",
151
+ reject: "Cancel",
152
+ selectPlaceholder: "Select",
153
+ filterPlaceholder: "Search",
154
+ emptyMessage: "No options available",
155
+ emptyFilterMessage: "No results found",
156
+ selectAll: "Select all",
157
+ selectedItems: (count) => `${count} items selected`,
158
+ searching: "Searching…",
159
+ showOptions: "Show options",
160
+ resultsAvailable: (count) => count === 1 ? "1 result available" : `${count} results available`,
161
+ pagination: "Pagination",
162
+ firstPage: "First page",
163
+ previousPage: "Previous page",
164
+ nextPage: "Next page",
165
+ lastPage: "Last page",
166
+ page: (page) => `Page ${page}`,
167
+ rowsPerPage: "Rows per page",
168
+ pageReport: (first, last, total) => `${first}–${last} of ${total}`,
169
+ noData: "No records found",
170
+ selectRow: "Select row",
171
+ selectAllRows: "Select all rows",
172
+ filterBy: (column) => `Filter by ${column}`,
173
+ filterAll: "All",
174
+ filterMin: (column) => `${column} from`,
175
+ filterMax: (column) => `${column} to`,
176
+ filterMinShort: "Min",
177
+ filterMaxShort: "Max",
178
+ expandRow: "Expand row",
179
+ collapseRow: "Collapse row",
180
+ rowDetails: "Details",
181
+ reorderRows: "Order",
182
+ sortMultiHint: "Shift + click adds this column to the sort",
183
+ terminalCommand: "Command",
184
+ compareImages: "Compare images",
185
+ editCell: (column) => `Edit ${column}`,
186
+ columns: "Columns",
187
+ resizeColumn: (column) => `Resize ${column}`,
188
+ moveColumnEarlier: (column) => `Move ${column} earlier`,
189
+ moveColumnLater: (column) => `Move ${column} later`,
190
+ layout: "Layout",
191
+ layoutList: "List",
192
+ layoutGrid: "Grid",
193
+ moveSelectedItem: "Move selected item",
194
+ orderListHint: "Use Alt and the arrow keys to move the selected item.",
195
+ moveTop: "Move to top",
196
+ moveUp: "Move up",
197
+ moveDown: "Move down",
198
+ moveBottom: "Move to bottom",
199
+ itemPosition: (label, position, total) => `${label}, position ${position} of ${total}`,
200
+ transfer: "Transfer",
201
+ moveSelectedToTarget: "Move selected to target",
202
+ moveAllToTarget: "Move all to target",
203
+ moveSelectedToSource: "Move selected to source",
204
+ moveAllToSource: "Move all to source",
205
+ pickListSource: "Available",
206
+ pickListTarget: "Selected",
207
+ chooseDate: "Choose date",
208
+ chooseMonth: "Choose month",
209
+ chooseYear: "Choose year",
210
+ previousMonth: "Previous month",
211
+ nextMonth: "Next month",
212
+ previousYears: "Previous years",
213
+ nextYears: "Next years",
214
+ today: "Today",
215
+ time: "Time",
216
+ startTime: "Start time",
217
+ weekNumber: "Week number",
218
+ weekShort: "Wk",
219
+ endTime: "End time",
220
+ done: "Done",
221
+ increase: "Increase",
222
+ decrease: "Decrease",
223
+ showPassword: "Show password",
224
+ hidePassword: "Hide password",
225
+ passwordWeak: "Password strength: weak",
226
+ passwordFair: "Password strength: fair",
227
+ passwordGood: "Password strength: good",
228
+ passwordStrong: "Password strength: strong",
229
+ passwordRuleLength: (min) => `At least ${min} characters`,
230
+ passwordRuleUpper: "An uppercase letter",
231
+ passwordRuleLower: "A lowercase letter",
232
+ passwordRuleNumber: "A number",
233
+ passwordRuleSymbol: "A symbol",
234
+ ruleMet: "met",
235
+ ruleNotMet: "not met",
236
+ otpLabel: "Verification code",
237
+ otpCharacter: (position, total) => `Character ${position} of ${total}`,
238
+ ratingLabel: "Rating",
239
+ sliderMinimum: (label) => `${label} minimum`.trim(),
240
+ sliderMaximum: (label) => `${label} maximum`.trim(),
241
+ colorLabel: "Color",
242
+ customColor: "Custom color",
243
+ hexValue: (label) => `${label} hex value`,
244
+ chooseFiles: "Choose files",
245
+ dropFiles: "Drag files here, or",
246
+ fileMaxSize: (size) => `max ${size}`,
247
+ fileUpTo: (count) => `up to ${count} files`,
248
+ uploadingFile: (name) => `Uploading ${name}`,
249
+ uploaded: "Uploaded",
250
+ fileTypeNotAllowed: (name) => `${name}: this file type is not allowed.`,
251
+ fileTooLarge: (name, max) => `${name}: the file is larger than ${max}.`,
252
+ fileLimitReached: (limit) => `You can add up to ${limit} files.`,
253
+ editorLabel: "Editor",
254
+ editorFormatting: (label) => `${label} formatting`,
255
+ editorBold: "Bold",
256
+ editorItalic: "Italic",
257
+ editorUnderline: "Underline",
258
+ editorHeading: "Heading",
259
+ editorBulletList: "Bulleted list",
260
+ editorNumberedList: "Numbered list",
261
+ editorClearFormatting: "Clear formatting",
262
+ editorLink: "Link",
263
+ editorLinkPrompt: "Link address (https://…)",
264
+ breadcrumb: "Breadcrumb",
265
+ stepperLabel: "Progress",
266
+ stepCompleted: "(completed)",
267
+ resizePanes: "Resize panes",
268
+ dock: "Dock",
269
+ scrollToTop: "Scroll to top",
270
+ theme: "Theme",
271
+ themeSystem: "System",
272
+ themeLight: "Light",
273
+ themeDark: "Dark",
274
+ pauseSlides: "Pause slides",
275
+ playSlides: "Play slides",
276
+ previousSlides: "Previous slides",
277
+ nextSlides: "Next slides",
278
+ galleryLabel: "Gallery",
279
+ previousImage: "Previous image",
280
+ nextImage: "Next image",
281
+ showImage: (alt) => `Show ${alt}`,
282
+ previewImage: (alt) => `Preview: ${alt}`,
283
+ zoomIn: "Zoom in",
284
+ zoomOut: "Zoom out",
285
+ chartView: "Chart",
286
+ tableView: "Table",
287
+ chartTotal: "Total",
288
+ chartOther: "Other",
289
+ chartCategory: "Category",
290
+ chartValue: "Value",
291
+ chartShare: "Share",
292
+ chartSeries: "Series",
293
+ chartX: "X",
294
+ chartY: "Y",
295
+ chartTypeBar: "Bar chart",
296
+ chartTypeStackedBar: "Stacked bar chart",
297
+ chartTypeLine: "Line chart",
298
+ chartTypeArea: "Area chart",
299
+ chartTypeDoughnut: "Doughnut chart",
300
+ chartTypePie: "Pie chart",
301
+ chartTypeRadar: "Radar chart",
302
+ chartTypePolarArea: "Polar area chart",
303
+ chartTypeScatter: "Scatter chart",
304
+ chartDescription: (kind, series, items, min, max) => `${kind} with ${series} series and ${items} ${items === 1 ? "item" : "items"}, values from ${min} to ${max}. The same data is in the table.`,
305
+ meterValue: (value, total) => `${value} of ${total}`
306
+ };
307
+ const STAR_UI_TEXT_PARAMS = {
308
+ ofTotal: ["index", "total"],
309
+ expandItem: ["label"],
310
+ collapseItem: ["label"],
311
+ removeItem: ["label"],
312
+ tagAdded: ["label"],
313
+ tagRemoved: ["label"],
314
+ tagInvalid: ["label"],
315
+ tagDuplicate: ["label"],
316
+ tagLimit: ["max"],
317
+ selectedItems: ["count"],
318
+ resultsAvailable: ["count"],
319
+ page: ["page"],
320
+ pageReport: [
321
+ "first",
322
+ "last",
323
+ "total"
324
+ ],
325
+ filterBy: ["column"],
326
+ filterMin: ["column"],
327
+ filterMax: ["column"],
328
+ editCell: ["column"],
329
+ resizeColumn: ["column"],
330
+ moveColumnEarlier: ["column"],
331
+ moveColumnLater: ["column"],
332
+ itemPosition: [
333
+ "label",
334
+ "position",
335
+ "total"
336
+ ],
337
+ passwordRuleLength: ["min"],
338
+ otpCharacter: ["position", "total"],
339
+ sliderMinimum: ["label"],
340
+ sliderMaximum: ["label"],
341
+ hexValue: ["label"],
342
+ fileMaxSize: ["size"],
343
+ fileUpTo: ["count"],
344
+ uploadingFile: ["name"],
345
+ fileTypeNotAllowed: ["name"],
346
+ fileTooLarge: ["name", "max"],
347
+ fileLimitReached: ["limit"],
348
+ editorFormatting: ["label"],
349
+ showImage: ["alt"],
350
+ previewImage: ["alt"],
351
+ meterValue: ["value", "total"],
352
+ chartDescription: [
353
+ "kind",
354
+ "series",
355
+ "items",
356
+ "min",
357
+ "max"
358
+ ]
359
+ };
360
+ const STAR_UI_TEXT = new InjectionToken("STAR_UI_TEXT", {
361
+ providedIn: "root",
362
+ factory: () => STAR_UI_TEXT_DEFAULTS
363
+ });
364
+ function provideStarUiText(overrides) {
365
+ return {
366
+ provide: STAR_UI_TEXT,
367
+ useValue: {
368
+ ...STAR_UI_TEXT_DEFAULTS,
369
+ ...overrides
370
+ }
371
+ };
372
+ }
373
+ function starUiTextFromSignal(source) {
374
+ const text = {};
375
+ for (const name of Object.keys(STAR_UI_TEXT_DEFAULTS)) if (typeof STAR_UI_TEXT_DEFAULTS[name] === "function") text[name] = (...args) => {
376
+ return (source()[name] ?? STAR_UI_TEXT_DEFAULTS[name])(...args);
377
+ };
378
+ else Object.defineProperty(text, name, {
379
+ enumerable: true,
380
+ get: () => source()[name] ?? STAR_UI_TEXT_DEFAULTS[name]
381
+ });
382
+ return text;
383
+ }
384
+ function provideStarUiTextFromSignal(source) {
385
+ return {
386
+ provide: STAR_UI_TEXT,
387
+ useFactory: () => starUiTextFromSignal(source)
388
+ };
389
+ }
390
+ export { STAR_UI_TEXT, STAR_UI_TEXT_DEFAULTS, STAR_UI_TEXT_PARAMS, StarDirectionService, compareValues, matchesFilter, optionText, provideStarDirection, provideStarUiText, provideStarUiTextFromSignal, readOption, starDirectionOf, starInlineKey, starIsRtl, starUiTextFromSignal, syncSignalFormControls };
391
+
392
+ //# sourceMappingURL=star-ng-ui-core.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"star-ng-ui-core.mjs","names":[],"sources":["../../../projects/star-ng/core/direction.ts","../../../projects/star-ng/core/options.ts","../../../projects/star-ng/core/reactive-forms.ts","../../../projects/star-ng/core/ui-text.ts"],"sourcesContent":["import { Directionality } from '@angular/cdk/bidi';\nimport { DOCUMENT } from '@angular/common';\nimport {\n DestroyRef,\n EnvironmentProviders,\n Injectable,\n inject,\n provideEnvironmentInitializer,\n signal,\n} from '@angular/core';\n\n/** Text direction of an element: left-to-right or right-to-left. */\nexport type StarDirection = 'ltr' | 'rtl';\n\n/**\n * Text direction in force at one element. A `dir` attribute on the element or on an ancestor\n * decides; with `dir=\"auto\"` or no attribute the computed `direction` decides. The function\n * reads the DOM each time it is called, so a handler that calls it follows a direction change at\n * run time, and a part of the page that has its own `dir` attribute is respected.\n *\n * Controls use it in key handlers and pointer math: the horizontal arrow keys follow the visual\n * direction, so in `rtl` the left arrow means \"next\".\n */\nexport function starDirectionOf(element: Element | null | undefined): StarDirection {\n if (!element) return 'ltr';\n const attribute = element.closest('[dir]')?.getAttribute('dir')?.toLowerCase();\n if (attribute === 'rtl' || attribute === 'ltr') return attribute;\n const view = element.ownerDocument.defaultView;\n return view?.getComputedStyle(element).direction === 'rtl' ? 'rtl' : 'ltr';\n}\n\n/** `true` when the element is laid out right-to-left. See `starDirectionOf`. */\nexport function starIsRtl(element: Element | null | undefined): boolean {\n return starDirectionOf(element) === 'rtl';\n}\n\n/**\n * Key of a keyboard event in \"inline\" terms: `'ArrowRight'` means toward the end of the line and\n * `'ArrowLeft'` toward the start, whatever the direction. In right-to-left the two arrow keys are\n * swapped; every other key is returned as it is. A handler can then be written once, as for\n * left-to-right text:\n *\n * ```ts\n * switch (starInlineKey(event)) {\n * case 'ArrowRight': // next item in reading order\n * }\n * ```\n *\n * The element decides the direction; it defaults to `event.currentTarget`.\n */\nexport function starInlineKey(event: KeyboardEvent, element?: Element | null): string {\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return event.key;\n const target = element ?? (event.currentTarget instanceof Element ? event.currentTarget : null);\n if (!starIsRtl(target ?? (event.target instanceof Element ? event.target : null)))\n return event.key;\n return event.key === 'ArrowLeft' ? 'ArrowRight' : 'ArrowLeft';\n}\n\n/**\n * Direction of the application: the `dir` attribute of `<html>` (or `<body>`), followed at run\n * time. Controls that open an overlay or a menu (CDK `Overlay`, `CdkMenu`) inject it. It does\n * two things:\n *\n * 1. `value` is a signal, so a control can react when the application switches the direction.\n * 2. It keeps the root `Directionality` of `@angular/cdk/bidi` in step with the page. That\n * service reads the attribute once when it is created; without this, overlays and menus\n * would keep the old direction after a switch.\n *\n * The application only sets `dir` on `<html>`: `document.documentElement.dir = 'rtl'`.\n */\n@Injectable({ providedIn: 'root' })\nexport class StarDirectionService {\n private readonly document = inject(DOCUMENT);\n private readonly directionality = inject(Directionality, { optional: true });\n\n private readonly current = signal<StarDirection>(this.read());\n /** The direction of the page now. */\n readonly value = this.current.asReadonly();\n\n constructor() {\n this.sync();\n const view = this.document.defaultView;\n if (!view || typeof view.MutationObserver !== 'function') return;\n const observer = new view.MutationObserver(() => this.refresh());\n const options = { attributes: true, attributeFilter: ['dir'] };\n observer.observe(this.document.documentElement, options);\n if (this.document.body) observer.observe(this.document.body, options);\n inject(DestroyRef).onDestroy(() => observer.disconnect());\n }\n\n /** Reads the attribute again. The observer calls it; call it by hand after a change that the observer cannot see. */\n refresh(): void {\n const next = this.read();\n if (next === this.current()) return;\n this.current.set(next);\n this.sync();\n }\n\n private read(): StarDirection {\n const raw = (\n this.document.body?.dir ||\n this.document.documentElement.dir ||\n 'ltr'\n ).toLowerCase();\n if (raw === 'auto') {\n return this.document.defaultView?.getComputedStyle(this.document.documentElement)\n .direction === 'rtl'\n ? 'rtl'\n : 'ltr';\n }\n return raw === 'rtl' ? 'rtl' : 'ltr';\n }\n\n private sync(): void {\n const target = this.directionality;\n if (!target || target.valueSignal() === this.current()) return;\n target.valueSignal.set(this.current());\n target.change.emit(this.current());\n }\n}\n\n/**\n * Starts `StarDirectionService` when the application starts. Optional: the controls that open\n * an overlay start the service themselves. Use it when the direction changes at run time before\n * any such control exists, or when your own code reads `StarDirectionService.value`.\n *\n * ```ts\n * bootstrapApplication(App, { providers: [provideStarDirection()] });\n * ```\n */\nexport function provideStarDirection(): EnvironmentProviders {\n return provideEnvironmentInitializer(() => {\n inject(StarDirectionService);\n });\n}\n","/**\n * How a list control reads a property from an option: a property name or an accessor function.\n * Same idea as PrimeNG `optionLabel` / `optionValue` / `optionDisabled`, but type safe.\n */\nexport type StarOptionKey<T, R = unknown> = (keyof T & string) | ((option: T) => R);\n\nexport type StarSeverity = 'primary' | 'secondary' | 'success' | 'info' | 'warn' | 'danger';\n\nexport type StarSize = 'sm' | 'md' | 'lg';\n\nexport function readOption<T, R>(option: T, key: StarOptionKey<T, R> | null | undefined): unknown {\n if (key === null || key === undefined) return option;\n if (typeof key === 'function') return key(option);\n return option !== null && typeof option === 'object'\n ? (option as Record<string, unknown>)[key]\n : undefined;\n}\n\n/** Text shown for an option. Falls back to the option itself for primitive options. */\nexport function optionText<T>(option: T, key: StarOptionKey<T> | null | undefined): string {\n const value = readOption(option, key ?? null);\n return value === null || value === undefined ? '' : String(value);\n}\n\nconst collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });\n\n/** Locale-aware compare used by sorting: numbers and dates numerically, text with Intl.Collator. */\nexport function compareValues(a: unknown, b: unknown): number {\n const aEmpty = a === null || a === undefined;\n const bEmpty = b === null || b === undefined;\n if (aEmpty && bEmpty) return 0;\n if (aEmpty) return -1;\n if (bEmpty) return 1;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n return collator.compare(String(a), String(b));\n}\n\n/** Case- and accent-insensitive \"contains\" match used by filters. */\nexport function matchesFilter(text: string, query: string): boolean {\n if (!query) return true;\n const normalize = (value: string) =>\n value\n .normalize('NFD')\n .replace(/\\p{Diacritic}/gu, '')\n .toLocaleLowerCase();\n return normalize(text).includes(normalize(query.trim()));\n}\n","import { effect, EffectRef, inject, Injector, untracked } from '@angular/core';\nimport { AbstractControl, FormArray, FormGroup } from '@angular/forms';\nimport { SignalFormControl } from '@angular/forms/signals/compat';\n\nfunction signalControls(control: AbstractControl): SignalFormControl<unknown>[] {\n if (control instanceof SignalFormControl) return [control as SignalFormControl<unknown>];\n if (control instanceof FormGroup || control instanceof FormArray) {\n return Object.values(control.controls).flatMap(signalControls);\n }\n return [];\n}\n\n/**\n * Keeps a Reactive `FormGroup` (or `FormArray`) in step with the `SignalFormControl`s inside it.\n *\n * Angular 22 updates a parent group when a `SignalFormControl` value changes, but not when a\n * Signal Forms rule (for example `disabled({ when })` or a conditional `required`) changes the\n * child's status without a value change. The group then reports a stale `valid` / `status`.\n * This effect watches every signal control's validity, disabled and pending state and calls\n * `updateValueAndValidity()` on the group when one changes.\n *\n * Call it in an injection context (a field initializer or constructor):\n * ```ts\n * readonly form = new FormGroup({ country: new SignalFormControl<string | null>(null, rules) });\n * private readonly sync = syncSignalFormControls(this.form);\n * ```\n */\nexport function syncSignalFormControls(\n group: FormGroup | FormArray,\n injector: Injector = inject(Injector),\n): EffectRef {\n const controls = signalControls(group);\n return effect(\n () => {\n for (const control of controls) {\n const state = control.fieldTree();\n state.valid();\n state.disabled();\n state.pending();\n }\n untracked(() => group.updateValueAndValidity());\n },\n { injector },\n );\n}\n","import { InjectionToken, Provider } from '@angular/core';\n\n/**\n * Built-in texts of the StarNG UI controls (screen-reader labels, empty states, reports).\n * Defaults are English. Override them once at app level:\n * - `provideStarUiTextFromTransloco()` reads them from the active Transloco language (`ui.*` keys)\n * and updates the controls live when the language changes.\n * - `provideStarUiText({...})` sets fixed texts.\n *\n * Function entries take values (for example a count) and return the full sentence, so word order\n * can change per language. Their parameter names are listed in `STAR_UI_TEXT_PARAMS`.\n */\nexport interface StarUiText {\n // General\n readonly close: string;\n readonly clear: string;\n readonly loading: string;\n readonly actions: string;\n readonly moreActions: string;\n readonly ofTotal: (index: number, total: number) => string;\n readonly expandItem: (label: string) => string;\n readonly collapseItem: (label: string) => string;\n readonly removeItem: (label: string) => string;\n // Tags field\n readonly tagsHint: string;\n readonly tagAdded: (label: string) => string;\n readonly tagRemoved: (label: string) => string;\n readonly tagInvalid: (label: string) => string;\n readonly tagDuplicate: (label: string) => string;\n readonly tagLimit: (max: number) => string;\n readonly notifications: string;\n readonly accept: string;\n readonly reject: string;\n // Select, listbox, autocomplete\n readonly selectPlaceholder: string;\n readonly filterPlaceholder: string;\n readonly emptyMessage: string;\n readonly emptyFilterMessage: string;\n readonly selectAll: string;\n readonly selectedItems: (count: number) => string;\n readonly searching: string;\n readonly showOptions: string;\n readonly resultsAvailable: (count: number) => string;\n // Table, paginator, data view\n readonly pagination: string;\n readonly firstPage: string;\n readonly previousPage: string;\n readonly nextPage: string;\n readonly lastPage: string;\n readonly page: (page: number) => string;\n readonly rowsPerPage: string;\n readonly pageReport: (first: number, last: number, total: number) => string;\n readonly noData: string;\n readonly selectRow: string;\n readonly selectAllRows: string;\n readonly filterBy: (column: string) => string;\n readonly filterAll: string;\n readonly filterMin: (column: string) => string;\n readonly filterMax: (column: string) => string;\n readonly filterMinShort: string;\n readonly filterMaxShort: string;\n readonly expandRow: string;\n readonly collapseRow: string;\n readonly rowDetails: string;\n readonly reorderRows: string;\n readonly sortMultiHint: string;\n readonly terminalCommand: string;\n readonly compareImages: string;\n readonly editCell: (column: string) => string;\n readonly columns: string;\n readonly resizeColumn: (column: string) => string;\n readonly moveColumnEarlier: (column: string) => string;\n readonly moveColumnLater: (column: string) => string;\n readonly layout: string;\n readonly layoutList: string;\n readonly layoutGrid: string;\n // Order list, pick list\n readonly moveSelectedItem: string;\n readonly orderListHint: string;\n readonly moveTop: string;\n readonly moveUp: string;\n readonly moveDown: string;\n readonly moveBottom: string;\n readonly itemPosition: (label: string, position: number, total: number) => string;\n readonly transfer: string;\n readonly moveSelectedToTarget: string;\n readonly moveAllToTarget: string;\n readonly moveSelectedToSource: string;\n readonly moveAllToSource: string;\n readonly pickListSource: string;\n readonly pickListTarget: string;\n // Dates\n readonly chooseDate: string;\n readonly chooseMonth: string;\n readonly chooseYear: string;\n readonly previousMonth: string;\n readonly nextMonth: string;\n readonly previousYears: string;\n readonly nextYears: string;\n readonly today: string;\n readonly time: string;\n readonly startTime: string;\n readonly weekNumber: string;\n readonly weekShort: string;\n readonly endTime: string;\n readonly done: string;\n // Inputs\n readonly increase: string;\n readonly decrease: string;\n readonly showPassword: string;\n readonly hidePassword: string;\n readonly passwordWeak: string;\n readonly passwordFair: string;\n readonly passwordGood: string;\n readonly passwordStrong: string;\n readonly passwordRuleLength: (min: number) => string;\n readonly passwordRuleUpper: string;\n readonly passwordRuleLower: string;\n readonly passwordRuleNumber: string;\n readonly passwordRuleSymbol: string;\n readonly ruleMet: string;\n readonly ruleNotMet: string;\n readonly otpLabel: string;\n readonly otpCharacter: (position: number, total: number) => string;\n readonly ratingLabel: string;\n readonly sliderMinimum: (label: string) => string;\n readonly sliderMaximum: (label: string) => string;\n readonly colorLabel: string;\n readonly customColor: string;\n readonly hexValue: (label: string) => string;\n // File upload\n readonly chooseFiles: string;\n readonly dropFiles: string;\n readonly fileMaxSize: (size: string) => string;\n readonly fileUpTo: (count: number) => string;\n readonly uploadingFile: (name: string) => string;\n readonly uploaded: string;\n readonly fileTypeNotAllowed: (name: string) => string;\n readonly fileTooLarge: (name: string, max: string) => string;\n readonly fileLimitReached: (limit: number) => string;\n // Editor\n readonly editorLabel: string;\n readonly editorFormatting: (label: string) => string;\n readonly editorBold: string;\n readonly editorItalic: string;\n readonly editorUnderline: string;\n readonly editorHeading: string;\n readonly editorBulletList: string;\n readonly editorNumberedList: string;\n readonly editorClearFormatting: string;\n readonly editorLink: string;\n readonly editorLinkPrompt: string;\n // Navigation and layout\n readonly breadcrumb: string;\n readonly stepperLabel: string;\n readonly stepCompleted: string;\n readonly resizePanes: string;\n readonly dock: string;\n readonly scrollToTop: string;\n readonly theme: string;\n readonly themeSystem: string;\n readonly themeLight: string;\n readonly themeDark: string;\n // Media\n readonly pauseSlides: string;\n readonly playSlides: string;\n readonly previousSlides: string;\n readonly nextSlides: string;\n readonly galleryLabel: string;\n readonly previousImage: string;\n readonly nextImage: string;\n readonly showImage: (alt: string) => string;\n readonly previewImage: (alt: string) => string;\n readonly zoomIn: string;\n readonly zoomOut: string;\n // Charts and meters\n readonly chartView: string;\n readonly tableView: string;\n readonly chartTotal: string;\n readonly chartOther: string;\n readonly chartCategory: string;\n readonly chartValue: string;\n readonly chartShare: string;\n readonly chartSeries: string;\n readonly chartX: string;\n readonly chartY: string;\n readonly chartTypeBar: string;\n readonly chartTypeStackedBar: string;\n readonly chartTypeLine: string;\n readonly chartTypeArea: string;\n readonly chartTypeDoughnut: string;\n readonly chartTypePie: string;\n readonly chartTypeRadar: string;\n readonly chartTypePolarArea: string;\n readonly chartTypeScatter: string;\n readonly chartDescription: (\n kind: string,\n series: number,\n items: number,\n min: string,\n max: string,\n ) => string;\n readonly meterValue: (value: string, total: number) => string;\n}\n\nexport const STAR_UI_TEXT_DEFAULTS: StarUiText = {\n close: 'Close',\n clear: 'Clear',\n loading: 'Loading',\n actions: 'Actions',\n moreActions: 'More actions',\n ofTotal: (index, total) => `${index} of ${total}`,\n expandItem: (label) => `Expand ${label}`,\n collapseItem: (label) => `Collapse ${label}`,\n removeItem: (label) => `Remove ${label}`,\n tagsHint: 'Press Enter or comma to add. Backspace removes the last item.',\n tagAdded: (label) => `${label} added`,\n tagRemoved: (label) => `${label} removed`,\n tagInvalid: (label) => `${label} is not valid.`,\n tagDuplicate: (label) => `${label} is already added.`,\n tagLimit: (max) => `You can add up to ${max} items.`,\n notifications: 'Notifications',\n accept: 'Confirm',\n reject: 'Cancel',\n\n selectPlaceholder: 'Select',\n filterPlaceholder: 'Search',\n emptyMessage: 'No options available',\n emptyFilterMessage: 'No results found',\n selectAll: 'Select all',\n selectedItems: (count) => `${count} items selected`,\n searching: 'Searching…',\n showOptions: 'Show options',\n resultsAvailable: (count) => (count === 1 ? '1 result available' : `${count} results available`),\n\n pagination: 'Pagination',\n firstPage: 'First page',\n previousPage: 'Previous page',\n nextPage: 'Next page',\n lastPage: 'Last page',\n page: (page) => `Page ${page}`,\n rowsPerPage: 'Rows per page',\n pageReport: (first, last, total) => `${first}–${last} of ${total}`,\n noData: 'No records found',\n selectRow: 'Select row',\n selectAllRows: 'Select all rows',\n filterBy: (column) => `Filter by ${column}`,\n filterAll: 'All',\n filterMin: (column) => `${column} from`,\n filterMax: (column) => `${column} to`,\n filterMinShort: 'Min',\n filterMaxShort: 'Max',\n expandRow: 'Expand row',\n collapseRow: 'Collapse row',\n rowDetails: 'Details',\n reorderRows: 'Order',\n sortMultiHint: 'Shift + click adds this column to the sort',\n terminalCommand: 'Command',\n compareImages: 'Compare images',\n editCell: (column) => `Edit ${column}`,\n columns: 'Columns',\n resizeColumn: (column) => `Resize ${column}`,\n moveColumnEarlier: (column) => `Move ${column} earlier`,\n moveColumnLater: (column) => `Move ${column} later`,\n layout: 'Layout',\n layoutList: 'List',\n layoutGrid: 'Grid',\n\n moveSelectedItem: 'Move selected item',\n orderListHint: 'Use Alt and the arrow keys to move the selected item.',\n moveTop: 'Move to top',\n moveUp: 'Move up',\n moveDown: 'Move down',\n moveBottom: 'Move to bottom',\n itemPosition: (label, position, total) => `${label}, position ${position} of ${total}`,\n transfer: 'Transfer',\n moveSelectedToTarget: 'Move selected to target',\n moveAllToTarget: 'Move all to target',\n moveSelectedToSource: 'Move selected to source',\n moveAllToSource: 'Move all to source',\n pickListSource: 'Available',\n pickListTarget: 'Selected',\n\n chooseDate: 'Choose date',\n chooseMonth: 'Choose month',\n chooseYear: 'Choose year',\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n previousYears: 'Previous years',\n nextYears: 'Next years',\n today: 'Today',\n time: 'Time',\n startTime: 'Start time',\n weekNumber: 'Week number',\n weekShort: 'Wk',\n endTime: 'End time',\n done: 'Done',\n\n increase: 'Increase',\n decrease: 'Decrease',\n showPassword: 'Show password',\n hidePassword: 'Hide password',\n passwordWeak: 'Password strength: weak',\n passwordFair: 'Password strength: fair',\n passwordGood: 'Password strength: good',\n passwordStrong: 'Password strength: strong',\n passwordRuleLength: (min) => `At least ${min} characters`,\n passwordRuleUpper: 'An uppercase letter',\n passwordRuleLower: 'A lowercase letter',\n passwordRuleNumber: 'A number',\n passwordRuleSymbol: 'A symbol',\n ruleMet: 'met',\n ruleNotMet: 'not met',\n otpLabel: 'Verification code',\n otpCharacter: (position, total) => `Character ${position} of ${total}`,\n ratingLabel: 'Rating',\n sliderMinimum: (label) => `${label} minimum`.trim(),\n sliderMaximum: (label) => `${label} maximum`.trim(),\n colorLabel: 'Color',\n customColor: 'Custom color',\n hexValue: (label) => `${label} hex value`,\n\n chooseFiles: 'Choose files',\n dropFiles: 'Drag files here, or',\n fileMaxSize: (size) => `max ${size}`,\n fileUpTo: (count) => `up to ${count} files`,\n uploadingFile: (name) => `Uploading ${name}`,\n uploaded: 'Uploaded',\n fileTypeNotAllowed: (name) => `${name}: this file type is not allowed.`,\n fileTooLarge: (name, max) => `${name}: the file is larger than ${max}.`,\n fileLimitReached: (limit) => `You can add up to ${limit} files.`,\n\n editorLabel: 'Editor',\n editorFormatting: (label) => `${label} formatting`,\n editorBold: 'Bold',\n editorItalic: 'Italic',\n editorUnderline: 'Underline',\n editorHeading: 'Heading',\n editorBulletList: 'Bulleted list',\n editorNumberedList: 'Numbered list',\n editorClearFormatting: 'Clear formatting',\n editorLink: 'Link',\n editorLinkPrompt: 'Link address (https://…)',\n\n breadcrumb: 'Breadcrumb',\n stepperLabel: 'Progress',\n stepCompleted: '(completed)',\n resizePanes: 'Resize panes',\n dock: 'Dock',\n scrollToTop: 'Scroll to top',\n theme: 'Theme',\n themeSystem: 'System',\n themeLight: 'Light',\n themeDark: 'Dark',\n\n pauseSlides: 'Pause slides',\n playSlides: 'Play slides',\n previousSlides: 'Previous slides',\n nextSlides: 'Next slides',\n galleryLabel: 'Gallery',\n previousImage: 'Previous image',\n nextImage: 'Next image',\n showImage: (alt) => `Show ${alt}`,\n previewImage: (alt) => `Preview: ${alt}`,\n zoomIn: 'Zoom in',\n zoomOut: 'Zoom out',\n\n chartView: 'Chart',\n tableView: 'Table',\n chartTotal: 'Total',\n chartOther: 'Other',\n chartCategory: 'Category',\n chartValue: 'Value',\n chartShare: 'Share',\n chartSeries: 'Series',\n chartX: 'X',\n chartY: 'Y',\n chartTypeBar: 'Bar chart',\n chartTypeStackedBar: 'Stacked bar chart',\n chartTypeLine: 'Line chart',\n chartTypeArea: 'Area chart',\n chartTypeDoughnut: 'Doughnut chart',\n chartTypePie: 'Pie chart',\n chartTypeRadar: 'Radar chart',\n chartTypePolarArea: 'Polar area chart',\n chartTypeScatter: 'Scatter chart',\n chartDescription: (kind, series, items, min, max) =>\n `${kind} with ${series} series and ${items} ${items === 1 ? 'item' : 'items'}, values from ${min} to ${max}. The same data is in the table.`,\n meterValue: (value, total) => `${value} of ${total}`,\n};\n\n/** Parameter names of the function entries, in call order (used for `{{ name }}` in translations). */\nexport const STAR_UI_TEXT_PARAMS: { readonly [K in keyof StarUiText]?: readonly string[] } = {\n ofTotal: ['index', 'total'],\n expandItem: ['label'],\n collapseItem: ['label'],\n removeItem: ['label'],\n tagAdded: ['label'],\n tagRemoved: ['label'],\n tagInvalid: ['label'],\n tagDuplicate: ['label'],\n tagLimit: ['max'],\n selectedItems: ['count'],\n resultsAvailable: ['count'],\n page: ['page'],\n pageReport: ['first', 'last', 'total'],\n filterBy: ['column'],\n filterMin: ['column'],\n filterMax: ['column'],\n editCell: ['column'],\n resizeColumn: ['column'],\n moveColumnEarlier: ['column'],\n moveColumnLater: ['column'],\n itemPosition: ['label', 'position', 'total'],\n passwordRuleLength: ['min'],\n otpCharacter: ['position', 'total'],\n sliderMinimum: ['label'],\n sliderMaximum: ['label'],\n hexValue: ['label'],\n fileMaxSize: ['size'],\n fileUpTo: ['count'],\n uploadingFile: ['name'],\n fileTypeNotAllowed: ['name'],\n fileTooLarge: ['name', 'max'],\n fileLimitReached: ['limit'],\n editorFormatting: ['label'],\n showImage: ['alt'],\n previewImage: ['alt'],\n meterValue: ['value', 'total'],\n chartDescription: ['kind', 'series', 'items', 'min', 'max'],\n};\n\nexport const STAR_UI_TEXT = new InjectionToken<StarUiText>('STAR_UI_TEXT', {\n providedIn: 'root',\n factory: () => STAR_UI_TEXT_DEFAULTS,\n});\n\n/** Overrides some or all built-in control texts with fixed values. */\nexport function provideStarUiText(overrides: Partial<StarUiText>): Provider {\n return { provide: STAR_UI_TEXT, useValue: { ...STAR_UI_TEXT_DEFAULTS, ...overrides } };\n}\n\n/**\n * Builds a `StarUiText` whose entries read `source()` on every access. When `source` reads a\n * signal, every OnPush control that renders a built-in text updates when that signal changes.\n * Entries that `source()` does not return fall back to the English default.\n *\n * Use it in a factory when the signal lives in a service:\n * `{ provide: STAR_UI_TEXT, useFactory: () => starUiTextFromSignal(inject(Language).text) }`.\n */\nexport function starUiTextFromSignal(source: () => Partial<StarUiText>): StarUiText {\n const text = {} as Record<string, unknown>;\n for (const name of Object.keys(STAR_UI_TEXT_DEFAULTS) as (keyof StarUiText)[]) {\n if (typeof STAR_UI_TEXT_DEFAULTS[name] === 'function') {\n text[name] = (...args: unknown[]) => {\n const entry = (source()[name] ?? STAR_UI_TEXT_DEFAULTS[name]) as (\n ...a: unknown[]\n ) => string;\n return entry(...args);\n };\n } else {\n Object.defineProperty(text, name, {\n enumerable: true,\n get: () => source()[name] ?? STAR_UI_TEXT_DEFAULTS[name],\n });\n }\n }\n return text as unknown as StarUiText;\n}\n\n/**\n * Provides the control texts from a function that reads a signal, so the language can change at\n * run time without a translation library:\n *\n * ```ts\n * const language = signal<'en' | 'de'>('en');\n * provideStarUiTextFromSignal(() => (language() === 'de' ? STAR_UI_TEXT_DE : STAR_UI_TEXT_DEFAULTS));\n * ```\n *\n * Do not spread a pack with getters into an object (`{ ...text }`): that reads every getter once and\n * freezes the result. Pass a function, as shown above.\n */\nexport function provideStarUiTextFromSignal(source: () => Partial<StarUiText>): Provider {\n return { provide: STAR_UI_TEXT, useFactory: () => starUiTextFromSignal(source) };\n}\n"],"mappings":"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"}