@saitec/ui 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.

Potentially problematic release.


This version of @saitec/ui might be problematic. Click here for more details.

Files changed (138) hide show
  1. package/README.md +64 -0
  2. package/fesm2022/saitec-ui-autocomplete.mjs +214 -0
  3. package/fesm2022/saitec-ui-autocomplete.mjs.map +1 -0
  4. package/fesm2022/saitec-ui-badge.mjs +26 -0
  5. package/fesm2022/saitec-ui-badge.mjs.map +1 -0
  6. package/fesm2022/saitec-ui-button.mjs +35 -0
  7. package/fesm2022/saitec-ui-button.mjs.map +1 -0
  8. package/fesm2022/saitec-ui-card.mjs +28 -0
  9. package/fesm2022/saitec-ui-card.mjs.map +1 -0
  10. package/fesm2022/saitec-ui-checkbox.mjs +87 -0
  11. package/fesm2022/saitec-ui-checkbox.mjs.map +1 -0
  12. package/fesm2022/saitec-ui-chip.mjs +32 -0
  13. package/fesm2022/saitec-ui-chip.mjs.map +1 -0
  14. package/fesm2022/saitec-ui-confirm.mjs +93 -0
  15. package/fesm2022/saitec-ui-confirm.mjs.map +1 -0
  16. package/fesm2022/saitec-ui-core.mjs +4 -0
  17. package/fesm2022/saitec-ui-core.mjs.map +1 -0
  18. package/fesm2022/saitec-ui-date-picker.mjs +92 -0
  19. package/fesm2022/saitec-ui-date-picker.mjs.map +1 -0
  20. package/fesm2022/saitec-ui-dialog.mjs +95 -0
  21. package/fesm2022/saitec-ui-dialog.mjs.map +1 -0
  22. package/fesm2022/saitec-ui-divider.mjs +22 -0
  23. package/fesm2022/saitec-ui-divider.mjs.map +1 -0
  24. package/fesm2022/saitec-ui-drawer.mjs +96 -0
  25. package/fesm2022/saitec-ui-drawer.mjs.map +1 -0
  26. package/fesm2022/saitec-ui-fieldset.mjs +32 -0
  27. package/fesm2022/saitec-ui-fieldset.mjs.map +1 -0
  28. package/fesm2022/saitec-ui-file-upload.mjs +206 -0
  29. package/fesm2022/saitec-ui-file-upload.mjs.map +1 -0
  30. package/fesm2022/saitec-ui-form-field.mjs +30 -0
  31. package/fesm2022/saitec-ui-form-field.mjs.map +1 -0
  32. package/fesm2022/saitec-ui-input-number.mjs +250 -0
  33. package/fesm2022/saitec-ui-input-number.mjs.map +1 -0
  34. package/fesm2022/saitec-ui-input.mjs +95 -0
  35. package/fesm2022/saitec-ui-input.mjs.map +1 -0
  36. package/fesm2022/saitec-ui-menu.mjs +46 -0
  37. package/fesm2022/saitec-ui-menu.mjs.map +1 -0
  38. package/fesm2022/saitec-ui-menubar.mjs +72 -0
  39. package/fesm2022/saitec-ui-menubar.mjs.map +1 -0
  40. package/fesm2022/saitec-ui-message.mjs +28 -0
  41. package/fesm2022/saitec-ui-message.mjs.map +1 -0
  42. package/fesm2022/saitec-ui-multiselect.mjs +209 -0
  43. package/fesm2022/saitec-ui-multiselect.mjs.map +1 -0
  44. package/fesm2022/saitec-ui-panel.mjs +32 -0
  45. package/fesm2022/saitec-ui-panel.mjs.map +1 -0
  46. package/fesm2022/saitec-ui-progress-spinner.mjs +24 -0
  47. package/fesm2022/saitec-ui-progress-spinner.mjs.map +1 -0
  48. package/fesm2022/saitec-ui-select.mjs +105 -0
  49. package/fesm2022/saitec-ui-select.mjs.map +1 -0
  50. package/fesm2022/saitec-ui-table.mjs +172 -0
  51. package/fesm2022/saitec-ui-table.mjs.map +1 -0
  52. package/fesm2022/saitec-ui-tabs.mjs +170 -0
  53. package/fesm2022/saitec-ui-tabs.mjs.map +1 -0
  54. package/fesm2022/saitec-ui-tag.mjs +26 -0
  55. package/fesm2022/saitec-ui-tag.mjs.map +1 -0
  56. package/fesm2022/saitec-ui-textarea.mjs +95 -0
  57. package/fesm2022/saitec-ui-textarea.mjs.map +1 -0
  58. package/fesm2022/saitec-ui-toast.mjs +109 -0
  59. package/fesm2022/saitec-ui-toast.mjs.map +1 -0
  60. package/fesm2022/saitec-ui-toggle-switch.mjs +85 -0
  61. package/fesm2022/saitec-ui-toggle-switch.mjs.map +1 -0
  62. package/fesm2022/saitec-ui-toolbar.mjs +20 -0
  63. package/fesm2022/saitec-ui-toolbar.mjs.map +1 -0
  64. package/fesm2022/saitec-ui-tooltip.mjs +219 -0
  65. package/fesm2022/saitec-ui-tooltip.mjs.map +1 -0
  66. package/fesm2022/saitec-ui.mjs +22 -0
  67. package/fesm2022/saitec-ui.mjs.map +1 -0
  68. package/lib/core/themes/dark.css +233 -0
  69. package/lib/core/themes/light.css +210 -0
  70. package/lib/core/tokens/components/autocomplete.css +26 -0
  71. package/lib/core/tokens/components/badge.css +26 -0
  72. package/lib/core/tokens/components/button.css +90 -0
  73. package/lib/core/tokens/components/card.css +15 -0
  74. package/lib/core/tokens/components/checkbox.css +17 -0
  75. package/lib/core/tokens/components/chip.css +16 -0
  76. package/lib/core/tokens/components/confirm.css +8 -0
  77. package/lib/core/tokens/components/date-picker.css +18 -0
  78. package/lib/core/tokens/components/dialog.css +18 -0
  79. package/lib/core/tokens/components/divider.css +9 -0
  80. package/lib/core/tokens/components/drawer.css +16 -0
  81. package/lib/core/tokens/components/fieldset.css +15 -0
  82. package/lib/core/tokens/components/file-upload.css +31 -0
  83. package/lib/core/tokens/components/form-field.css +14 -0
  84. package/lib/core/tokens/components/input-number.css +20 -0
  85. package/lib/core/tokens/components/input.css +31 -0
  86. package/lib/core/tokens/components/menu.css +19 -0
  87. package/lib/core/tokens/components/menubar.css +18 -0
  88. package/lib/core/tokens/components/message.css +29 -0
  89. package/lib/core/tokens/components/multiselect.css +25 -0
  90. package/lib/core/tokens/components/panel.css +18 -0
  91. package/lib/core/tokens/components/progress-spinner.css +10 -0
  92. package/lib/core/tokens/components/select.css +18 -0
  93. package/lib/core/tokens/components/table.css +32 -0
  94. package/lib/core/tokens/components/tabs.css +18 -0
  95. package/lib/core/tokens/components/tag.css +29 -0
  96. package/lib/core/tokens/components/textarea.css +19 -0
  97. package/lib/core/tokens/components/toast.css +22 -0
  98. package/lib/core/tokens/components/toggle-switch.css +17 -0
  99. package/lib/core/tokens/components/toolbar.css +11 -0
  100. package/lib/core/tokens/components/tooltip.css +12 -0
  101. package/lib/core/tokens/components.css +50 -0
  102. package/lib/core/tokens/foundations.css +132 -0
  103. package/lib/core/tokens/primitives.css +159 -0
  104. package/package.json +162 -0
  105. package/styles.css +7 -0
  106. package/types/saitec-ui-autocomplete.d.ts +50 -0
  107. package/types/saitec-ui-badge.d.ts +15 -0
  108. package/types/saitec-ui-button.d.ts +22 -0
  109. package/types/saitec-ui-card.d.ts +13 -0
  110. package/types/saitec-ui-checkbox.d.ts +33 -0
  111. package/types/saitec-ui-chip.d.ts +13 -0
  112. package/types/saitec-ui-confirm.d.ts +38 -0
  113. package/types/saitec-ui-core.d.ts +7 -0
  114. package/types/saitec-ui-date-picker.d.ts +35 -0
  115. package/types/saitec-ui-dialog.d.ts +29 -0
  116. package/types/saitec-ui-divider.d.ts +13 -0
  117. package/types/saitec-ui-drawer.d.ts +31 -0
  118. package/types/saitec-ui-fieldset.d.ts +13 -0
  119. package/types/saitec-ui-file-upload.d.ts +43 -0
  120. package/types/saitec-ui-form-field.d.ts +14 -0
  121. package/types/saitec-ui-input-number.d.ts +60 -0
  122. package/types/saitec-ui-input.d.ts +39 -0
  123. package/types/saitec-ui-menu.d.ts +17 -0
  124. package/types/saitec-ui-menubar.d.ts +21 -0
  125. package/types/saitec-ui-message.d.ts +15 -0
  126. package/types/saitec-ui-multiselect.d.ts +54 -0
  127. package/types/saitec-ui-panel.d.ts +13 -0
  128. package/types/saitec-ui-progress-spinner.d.ts +13 -0
  129. package/types/saitec-ui-select.d.ts +36 -0
  130. package/types/saitec-ui-table.d.ts +57 -0
  131. package/types/saitec-ui-tabs.d.ts +57 -0
  132. package/types/saitec-ui-tag.d.ts +15 -0
  133. package/types/saitec-ui-textarea.d.ts +37 -0
  134. package/types/saitec-ui-toast.d.ts +43 -0
  135. package/types/saitec-ui-toggle-switch.d.ts +32 -0
  136. package/types/saitec-ui-toolbar.d.ts +9 -0
  137. package/types/saitec-ui-tooltip.d.ts +38 -0
  138. package/types/saitec-ui.d.ts +8 -0
@@ -0,0 +1,250 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, output, signal, computed, forwardRef, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+
5
+ let nextInputNumberId = 0;
6
+ class SuiInputNumber {
7
+ id = input(`sui-input-number-${++nextInputNumberId}`, /* @ts-ignore */
8
+ ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
9
+ name = input(/* @ts-ignore */
10
+ ...(ngDevMode ? [undefined, { debugName: "name" }] : /* istanbul ignore next */ []));
11
+ placeholder = input('', /* @ts-ignore */
12
+ ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
13
+ mode = input('decimal', /* @ts-ignore */
14
+ ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
15
+ locale = input('es-CO', /* @ts-ignore */
16
+ ...(ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []));
17
+ currency = input('COP', /* @ts-ignore */
18
+ ...(ngDevMode ? [{ debugName: "currency" }] : /* istanbul ignore next */ []));
19
+ currencyDisplay = input('symbol', /* @ts-ignore */
20
+ ...(ngDevMode ? [{ debugName: "currencyDisplay" }] : /* istanbul ignore next */ []));
21
+ useGrouping = input(true, /* @ts-ignore */
22
+ ...(ngDevMode ? [{ debugName: "useGrouping" }] : /* istanbul ignore next */ []));
23
+ minFractionDigits = input(0, /* @ts-ignore */
24
+ ...(ngDevMode ? [{ debugName: "minFractionDigits" }] : /* istanbul ignore next */ []));
25
+ maxFractionDigits = input(2, /* @ts-ignore */
26
+ ...(ngDevMode ? [{ debugName: "maxFractionDigits" }] : /* istanbul ignore next */ []));
27
+ min = input(/* @ts-ignore */
28
+ ...(ngDevMode ? [undefined, { debugName: "min" }] : /* istanbul ignore next */ []));
29
+ max = input(/* @ts-ignore */
30
+ ...(ngDevMode ? [undefined, { debugName: "max" }] : /* istanbul ignore next */ []));
31
+ step = input(1, /* @ts-ignore */
32
+ ...(ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []));
33
+ prefix = input('', /* @ts-ignore */
34
+ ...(ngDevMode ? [{ debugName: "prefix" }] : /* istanbul ignore next */ []));
35
+ suffix = input('', /* @ts-ignore */
36
+ ...(ngDevMode ? [{ debugName: "suffix" }] : /* istanbul ignore next */ []));
37
+ disabled = input(false, /* @ts-ignore */
38
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
39
+ readonly = input(false, /* @ts-ignore */
40
+ ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
41
+ required = input(false, /* @ts-ignore */
42
+ ...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
43
+ showButtons = input(false, /* @ts-ignore */
44
+ ...(ngDevMode ? [{ debugName: "showButtons" }] : /* istanbul ignore next */ []));
45
+ ariaLabel = input(/* @ts-ignore */
46
+ ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
47
+ ariaDescribedBy = input(/* @ts-ignore */
48
+ ...(ngDevMode ? [undefined, { debugName: "ariaDescribedBy" }] : /* istanbul ignore next */ []));
49
+ ariaInvalid = input(/* @ts-ignore */
50
+ ...(ngDevMode ? [undefined, { debugName: "ariaInvalid" }] : /* istanbul ignore next */ []));
51
+ valueChange = output();
52
+ focused = output();
53
+ blurred = output();
54
+ value = signal(null, /* @ts-ignore */
55
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
56
+ text = signal('', /* @ts-ignore */
57
+ ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
58
+ focusedState = signal(false, /* @ts-ignore */
59
+ ...(ngDevMode ? [{ debugName: "focusedState" }] : /* istanbul ignore next */ []));
60
+ formDisabled = signal(false, /* @ts-ignore */
61
+ ...(ngDevMode ? [{ debugName: "formDisabled" }] : /* istanbul ignore next */ []));
62
+ isDisabled = computed(() => this.disabled() ||
63
+ this.formDisabled(), /* @ts-ignore */
64
+ ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
65
+ onChange = () => { };
66
+ onTouched = () => { };
67
+ get formatter() {
68
+ const options = {
69
+ useGrouping: this.useGrouping(),
70
+ minimumFractionDigits: this.minFractionDigits(),
71
+ maximumFractionDigits: this.maxFractionDigits()
72
+ };
73
+ if (this.mode() === 'currency') {
74
+ options.style = 'currency';
75
+ options.currency =
76
+ this.currency();
77
+ options.currencyDisplay =
78
+ this.currencyDisplay();
79
+ }
80
+ else {
81
+ options.style = 'decimal';
82
+ }
83
+ return new Intl.NumberFormat(this.locale(), options);
84
+ }
85
+ writeValue(value) {
86
+ this.value.set(value ?? null);
87
+ this.updateDisplay();
88
+ }
89
+ registerOnChange(fn) {
90
+ this.onChange = fn;
91
+ }
92
+ registerOnTouched(fn) {
93
+ this.onTouched = fn;
94
+ }
95
+ setDisabledState(disabled) {
96
+ this.formDisabled.set(disabled);
97
+ }
98
+ handleInput(event) {
99
+ const element = event.target;
100
+ this.text.set(element.value);
101
+ const parsed = this.parse(element.value);
102
+ if (parsed === null) {
103
+ this.updateValue(null);
104
+ return;
105
+ }
106
+ this.updateValue(this.clamp(parsed));
107
+ }
108
+ handleFocus(event) {
109
+ this.focusedState.set(true);
110
+ const value = this.value();
111
+ this.text.set(value === null
112
+ ? ''
113
+ : this.toEditableString(value));
114
+ this.focused.emit(event);
115
+ }
116
+ handleBlur(event) {
117
+ this.focusedState.set(false);
118
+ this.onTouched();
119
+ const value = this.value();
120
+ if (value !== null) {
121
+ const normalized = this.clamp(this.round(value));
122
+ this.updateValue(normalized);
123
+ }
124
+ this.updateDisplay();
125
+ this.blurred.emit(event);
126
+ }
127
+ increment() {
128
+ if (this.isDisabled() ||
129
+ this.readonly()) {
130
+ return;
131
+ }
132
+ const current = this.value() ?? 0;
133
+ const value = this.clamp(this.round(current +
134
+ this.step()));
135
+ this.updateValue(value);
136
+ this.updateDisplay();
137
+ }
138
+ decrement() {
139
+ if (this.isDisabled() ||
140
+ this.readonly()) {
141
+ return;
142
+ }
143
+ const current = this.value() ?? 0;
144
+ const value = this.clamp(this.round(current -
145
+ this.step()));
146
+ this.updateValue(value);
147
+ this.updateDisplay();
148
+ }
149
+ updateValue(value) {
150
+ this.value.set(value);
151
+ this.onChange(value);
152
+ this.valueChange.emit(value);
153
+ }
154
+ updateDisplay() {
155
+ const value = this.value();
156
+ if (value === null) {
157
+ this.text.set('');
158
+ return;
159
+ }
160
+ this.text.set(`${this.prefix()}${this.formatter.format(value)}${this.suffix()}`);
161
+ }
162
+ parse(input) {
163
+ let value = input.trim();
164
+ if (!value) {
165
+ return null;
166
+ }
167
+ const parts = this.formatter.formatToParts(12345.6);
168
+ const decimalSeparator = parts.find(part => part.type === 'decimal')?.value ?? '.';
169
+ const groupSeparator = parts.find(part => part.type === 'group')?.value ?? ',';
170
+ if (this.prefix()) {
171
+ value =
172
+ value.replace(this.prefix(), '');
173
+ }
174
+ if (this.suffix()) {
175
+ value =
176
+ value.replace(this.suffix(), '');
177
+ }
178
+ value =
179
+ value
180
+ .replace(new RegExp(this.escapeRegex(groupSeparator), 'g'), '')
181
+ .replace(decimalSeparator, '.')
182
+ .replace(/[^\d.+-]/g, '');
183
+ if (value === '' ||
184
+ value === '-' ||
185
+ value === '+' ||
186
+ value === '.') {
187
+ return null;
188
+ }
189
+ const result = Number(value);
190
+ return Number.isFinite(result)
191
+ ? result
192
+ : null;
193
+ }
194
+ clamp(value) {
195
+ const min = this.min();
196
+ const max = this.max();
197
+ if (min !== undefined &&
198
+ value < min) {
199
+ return min;
200
+ }
201
+ if (max !== undefined &&
202
+ value > max) {
203
+ return max;
204
+ }
205
+ return value;
206
+ }
207
+ round(value) {
208
+ const digits = this.maxFractionDigits();
209
+ const multiplier = 10 ** digits;
210
+ return (Math.round((value + Number.EPSILON) *
211
+ multiplier) /
212
+ multiplier);
213
+ }
214
+ toEditableString(value) {
215
+ const parts = new Intl.NumberFormat(this.locale(), {
216
+ useGrouping: false,
217
+ maximumFractionDigits: this.maxFractionDigits()
218
+ })
219
+ .format(value);
220
+ return parts;
221
+ }
222
+ escapeRegex(value) {
223
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
224
+ }
225
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SuiInputNumber, deps: [], target: i0.ɵɵFactoryTarget.Component });
226
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: SuiInputNumber, isStandalone: true, selector: "sui-input-number", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, currency: { classPropertyName: "currency", publicName: "currency", isSignal: true, isRequired: false, transformFunction: null }, currencyDisplay: { classPropertyName: "currencyDisplay", publicName: "currencyDisplay", isSignal: true, isRequired: false, transformFunction: null }, useGrouping: { classPropertyName: "useGrouping", publicName: "useGrouping", isSignal: true, isRequired: false, transformFunction: null }, minFractionDigits: { classPropertyName: "minFractionDigits", publicName: "minFractionDigits", isSignal: true, isRequired: false, transformFunction: null }, maxFractionDigits: { classPropertyName: "maxFractionDigits", publicName: "maxFractionDigits", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, prefix: { classPropertyName: "prefix", publicName: "prefix", isSignal: true, isRequired: false, transformFunction: null }, suffix: { classPropertyName: "suffix", publicName: "suffix", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, showButtons: { classPropertyName: "showButtons", publicName: "showButtons", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedBy: { classPropertyName: "ariaDescribedBy", publicName: "ariaDescribedBy", isSignal: true, isRequired: false, transformFunction: null }, ariaInvalid: { classPropertyName: "ariaInvalid", publicName: "ariaInvalid", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", focused: "focused", blurred: "blurred" }, providers: [
227
+ {
228
+ provide: NG_VALUE_ACCESSOR,
229
+ useExisting: forwardRef(() => SuiInputNumber),
230
+ multi: true
231
+ }
232
+ ], ngImport: i0, template: "<div class=\"sui-input-number\">\n\n <input\n class=\"sui-input-number-input\"\n\n type=\"text\"\n\n [id]=\"id()\"\n [name]=\"name() ?? ''\"\n\n [value]=\"text()\"\n\n [placeholder]=\"placeholder()\"\n\n [disabled]=\"isDisabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n\n inputmode=\"decimal\"\n\n [attr.aria-label]=\"\n ariaLabel() ?? null\n \"\n\n [attr.aria-describedby]=\"\n ariaDescribedBy() ?? null\n \"\n\n [attr.aria-invalid]=\"\n ariaInvalid() ?? null\n \"\n\n (input)=\"handleInput($event)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n />\n\n @if (showButtons()) {\n\n <div class=\"sui-input-number-buttons\">\n\n <button\n type=\"button\"\n class=\"sui-input-number-button\"\n\n tabindex=\"-1\"\n\n [disabled]=\"isDisabled() || readonly()\"\n\n aria-label=\"Increase\"\n\n (click)=\"increment()\">\n\n \u25B2\n\n </button>\n\n <button\n type=\"button\"\n class=\"sui-input-number-button\"\n\n tabindex=\"-1\"\n\n [disabled]=\"isDisabled() || readonly()\"\n\n aria-label=\"Decrease\"\n\n (click)=\"decrement()\">\n\n \u25BC\n\n </button>\n\n </div>\n\n }\n\n</div>", styles: [":host{display:block;width:100%}.sui-input-number{position:relative;display:flex;width:100%}.sui-input-number-input{display:block;width:100%;min-height:var(--sui-input-number-height);box-sizing:border-box;padding:var(--sui-space-2) var(--sui-input-number-padding-x);font-family:inherit;font-size:var(--sui-control-font-size-md);line-height:1.25rem;color:var(--sui-input-number-text);background:var(--sui-input-number-background);border:1px solid var(--sui-input-number-border);border-radius:var(--sui-input-number-radius);outline:none;transition:border-color var(--sui-duration-normal) var(--sui-easing-standard),box-shadow var(--sui-duration-normal) var(--sui-easing-standard),background-color var(--sui-duration-normal) var(--sui-easing-standard)}.sui-input-number-input:hover:not(:disabled):not(:read-only){border-color:var(--sui-input-number-border-hover)}.sui-input-number-input:focus{border-color:var(--sui-input-number-border-focus);box-shadow:0 0 0 2px var(--sui-input-number-focus-color)}.sui-input-number-input:disabled{cursor:not-allowed;color:var(--sui-color-content-disabled);background:var(--sui-color-surface-alt)}.sui-input-number-input:read-only{background:var(--sui-color-surface-alt)}.sui-input-number-input[aria-invalid=true]{border-color:var(--sui-color-danger)}.sui-input-number-buttons{display:flex;flex-direction:column;margin-left:-1px}.sui-input-number-button{display:flex;align-items:center;justify-content:center;width:2rem;flex:1;padding:0;color:var(--sui-input-number-button-text);background:var(--sui-input-number-button-background);border:1px solid var(--sui-input-number-border);cursor:pointer;font-size:.55rem}.sui-input-number-button:first-child{border-radius:0 var(--sui-input-number-radius) 0 0}.sui-input-number-button:last-child{margin-top:-1px;border-radius:0 0 var(--sui-input-number-radius) 0}.sui-input-number-button:hover:not(:disabled){color:var(--sui-input-number-button-text);background:var(--sui-input-number-button-background-hover)}.sui-input-number-button:disabled{cursor:not-allowed;opacity:.5}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
233
+ }
234
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SuiInputNumber, decorators: [{
235
+ type: Component,
236
+ args: [{ selector: 'sui-input-number', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
237
+ {
238
+ provide: NG_VALUE_ACCESSOR,
239
+ useExisting: forwardRef(() => SuiInputNumber),
240
+ multi: true
241
+ }
242
+ ], template: "<div class=\"sui-input-number\">\n\n <input\n class=\"sui-input-number-input\"\n\n type=\"text\"\n\n [id]=\"id()\"\n [name]=\"name() ?? ''\"\n\n [value]=\"text()\"\n\n [placeholder]=\"placeholder()\"\n\n [disabled]=\"isDisabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n\n inputmode=\"decimal\"\n\n [attr.aria-label]=\"\n ariaLabel() ?? null\n \"\n\n [attr.aria-describedby]=\"\n ariaDescribedBy() ?? null\n \"\n\n [attr.aria-invalid]=\"\n ariaInvalid() ?? null\n \"\n\n (input)=\"handleInput($event)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n />\n\n @if (showButtons()) {\n\n <div class=\"sui-input-number-buttons\">\n\n <button\n type=\"button\"\n class=\"sui-input-number-button\"\n\n tabindex=\"-1\"\n\n [disabled]=\"isDisabled() || readonly()\"\n\n aria-label=\"Increase\"\n\n (click)=\"increment()\">\n\n \u25B2\n\n </button>\n\n <button\n type=\"button\"\n class=\"sui-input-number-button\"\n\n tabindex=\"-1\"\n\n [disabled]=\"isDisabled() || readonly()\"\n\n aria-label=\"Decrease\"\n\n (click)=\"decrement()\">\n\n \u25BC\n\n </button>\n\n </div>\n\n }\n\n</div>", styles: [":host{display:block;width:100%}.sui-input-number{position:relative;display:flex;width:100%}.sui-input-number-input{display:block;width:100%;min-height:var(--sui-input-number-height);box-sizing:border-box;padding:var(--sui-space-2) var(--sui-input-number-padding-x);font-family:inherit;font-size:var(--sui-control-font-size-md);line-height:1.25rem;color:var(--sui-input-number-text);background:var(--sui-input-number-background);border:1px solid var(--sui-input-number-border);border-radius:var(--sui-input-number-radius);outline:none;transition:border-color var(--sui-duration-normal) var(--sui-easing-standard),box-shadow var(--sui-duration-normal) var(--sui-easing-standard),background-color var(--sui-duration-normal) var(--sui-easing-standard)}.sui-input-number-input:hover:not(:disabled):not(:read-only){border-color:var(--sui-input-number-border-hover)}.sui-input-number-input:focus{border-color:var(--sui-input-number-border-focus);box-shadow:0 0 0 2px var(--sui-input-number-focus-color)}.sui-input-number-input:disabled{cursor:not-allowed;color:var(--sui-color-content-disabled);background:var(--sui-color-surface-alt)}.sui-input-number-input:read-only{background:var(--sui-color-surface-alt)}.sui-input-number-input[aria-invalid=true]{border-color:var(--sui-color-danger)}.sui-input-number-buttons{display:flex;flex-direction:column;margin-left:-1px}.sui-input-number-button{display:flex;align-items:center;justify-content:center;width:2rem;flex:1;padding:0;color:var(--sui-input-number-button-text);background:var(--sui-input-number-button-background);border:1px solid var(--sui-input-number-border);cursor:pointer;font-size:.55rem}.sui-input-number-button:first-child{border-radius:0 var(--sui-input-number-radius) 0 0}.sui-input-number-button:last-child{margin-top:-1px;border-radius:0 0 var(--sui-input-number-radius) 0}.sui-input-number-button:hover:not(:disabled){color:var(--sui-input-number-button-text);background:var(--sui-input-number-button-background-hover)}.sui-input-number-button:disabled{cursor:not-allowed;opacity:.5}\n"] }]
243
+ }], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], currency: [{ type: i0.Input, args: [{ isSignal: true, alias: "currency", required: false }] }], currencyDisplay: [{ type: i0.Input, args: [{ isSignal: true, alias: "currencyDisplay", required: false }] }], useGrouping: [{ type: i0.Input, args: [{ isSignal: true, alias: "useGrouping", required: false }] }], minFractionDigits: [{ type: i0.Input, args: [{ isSignal: true, alias: "minFractionDigits", required: false }] }], maxFractionDigits: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFractionDigits", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], prefix: [{ type: i0.Input, args: [{ isSignal: true, alias: "prefix", required: false }] }], suffix: [{ type: i0.Input, args: [{ isSignal: true, alias: "suffix", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], showButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "showButtons", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], ariaDescribedBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaDescribedBy", required: false }] }], ariaInvalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaInvalid", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], focused: [{ type: i0.Output, args: ["focused"] }], blurred: [{ type: i0.Output, args: ["blurred"] }] } });
244
+
245
+ /**
246
+ * Generated bundle index. Do not edit.
247
+ */
248
+
249
+ export { SuiInputNumber };
250
+ //# sourceMappingURL=saitec-ui-input-number.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saitec-ui-input-number.mjs","sources":["../../../projects/ui/input-number/src/input-number.component.ts","../../../projects/ui/input-number/src/input-number.component.html","../../../projects/ui/input-number/src/saitec-ui-input-number.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n output,\n signal\n} from '@angular/core';\n\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR\n} from '@angular/forms';\n\nexport type SuiInputNumberMode =\n | 'decimal'\n | 'currency';\n\nlet nextInputNumberId = 0;\n\n@Component({\n selector: 'sui-input-number',\n standalone: true,\n templateUrl: './input-number.component.html',\n styleUrl: './input-number.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiInputNumber),\n multi: true\n }\n ]\n})\nexport class SuiInputNumber implements ControlValueAccessor {\n\n id = input(`sui-input-number-${++nextInputNumberId}`);\n\n name = input<string>();\n\n placeholder = input('');\n\n mode = input<SuiInputNumberMode>('decimal');\n\n locale = input('es-CO');\n\n currency = input('COP');\n\n currencyDisplay =\n input<'symbol' | 'code' | 'name'>('symbol');\n\n useGrouping = input(true);\n\n minFractionDigits = input(0);\n\n maxFractionDigits = input(2);\n\n min = input<number>();\n\n max = input<number>();\n\n step = input(1);\n\n prefix = input('');\n\n suffix = input('');\n\n disabled = input(false);\n\n readonly = input(false);\n\n required = input(false);\n\n showButtons = input(false);\n\n ariaLabel = input<string>();\n\n ariaDescribedBy = input<string>();\n\n ariaInvalid = input<boolean>();\n\n valueChange = output<number | null>();\n\n focused = output<FocusEvent>();\n\n blurred = output<FocusEvent>();\n\n protected readonly value =\n signal<number | null>(null);\n\n protected readonly text =\n signal('');\n\n protected readonly focusedState =\n signal(false);\n\n private readonly formDisabled =\n signal(false);\n\n protected readonly isDisabled =\n computed(\n () =>\n this.disabled() ||\n this.formDisabled()\n );\n\n private onChange:\n (value: number | null) => void =\n () => {};\n\n private onTouched:\n () => void =\n () => {};\n\n private get formatter(): Intl.NumberFormat {\n\n const options:\n Intl.NumberFormatOptions = {\n\n useGrouping:\n this.useGrouping(),\n\n minimumFractionDigits:\n this.minFractionDigits(),\n\n maximumFractionDigits:\n this.maxFractionDigits()\n };\n\n if (this.mode() === 'currency') {\n\n options.style = 'currency';\n\n options.currency =\n this.currency();\n\n options.currencyDisplay =\n this.currencyDisplay();\n }\n else {\n options.style = 'decimal';\n }\n\n return new Intl.NumberFormat(\n this.locale(),\n options\n );\n }\n\n writeValue(\n value: number | null | undefined\n ): void {\n\n this.value.set(\n value ?? null\n );\n\n this.updateDisplay();\n }\n\n registerOnChange(\n fn: (value: number | null) => void\n ): void {\n this.onChange = fn;\n }\n\n registerOnTouched(\n fn: () => void\n ): void {\n this.onTouched = fn;\n }\n\n setDisabledState(\n disabled: boolean\n ): void {\n this.formDisabled.set(disabled);\n }\n\n protected handleInput(\n event: Event\n ): void {\n\n const element =\n event.target as HTMLInputElement;\n\n this.text.set(\n element.value\n );\n\n const parsed =\n this.parse(element.value);\n\n if (parsed === null) {\n\n this.updateValue(null);\n\n return;\n }\n\n this.updateValue(\n this.clamp(parsed)\n );\n }\n\n protected handleFocus(\n event: FocusEvent\n ): void {\n\n this.focusedState.set(true);\n\n const value =\n this.value();\n\n this.text.set(\n value === null\n ? ''\n : this.toEditableString(value)\n );\n\n this.focused.emit(event);\n }\n\n protected handleBlur(\n event: FocusEvent\n ): void {\n\n this.focusedState.set(false);\n\n this.onTouched();\n\n const value =\n this.value();\n\n if (value !== null) {\n\n const normalized =\n this.clamp(\n this.round(value)\n );\n\n this.updateValue(\n normalized\n );\n }\n\n this.updateDisplay();\n\n this.blurred.emit(event);\n }\n\n protected increment(): void {\n\n if (\n this.isDisabled() ||\n this.readonly()\n ) {\n return;\n }\n\n const current =\n this.value() ?? 0;\n\n const value =\n this.clamp(\n this.round(\n current +\n this.step()\n )\n );\n\n this.updateValue(value);\n this.updateDisplay();\n }\n\n protected decrement(): void {\n\n if (\n this.isDisabled() ||\n this.readonly()\n ) {\n return;\n }\n\n const current =\n this.value() ?? 0;\n\n const value =\n this.clamp(\n this.round(\n current -\n this.step()\n )\n );\n\n this.updateValue(value);\n this.updateDisplay();\n }\n\n private updateValue(\n value: number | null\n ): void {\n\n this.value.set(value);\n\n this.onChange(value);\n\n this.valueChange.emit(value);\n }\n\n private updateDisplay(): void {\n\n const value =\n this.value();\n\n if (value === null) {\n this.text.set('');\n return;\n }\n\n this.text.set(\n `${this.prefix()}${this.formatter.format(value)}${this.suffix()}`\n );\n }\n\n private parse(\n input: string\n ): number | null {\n\n let value =\n input.trim();\n\n if (!value) {\n return null;\n }\n\n const parts =\n this.formatter.formatToParts(\n 12345.6\n );\n\n const decimalSeparator =\n parts.find(\n part =>\n part.type === 'decimal'\n )?.value ?? '.';\n\n const groupSeparator =\n parts.find(\n part =>\n part.type === 'group'\n )?.value ?? ',';\n\n if (this.prefix()) {\n\n value =\n value.replace(\n this.prefix(),\n ''\n );\n }\n\n if (this.suffix()) {\n\n value =\n value.replace(\n this.suffix(),\n ''\n );\n }\n\n value =\n value\n .replace(\n new RegExp(\n this.escapeRegex(\n groupSeparator\n ),\n 'g'\n ),\n ''\n )\n .replace(\n decimalSeparator,\n '.'\n )\n .replace(\n /[^\\d.+-]/g,\n ''\n );\n\n if (\n value === '' ||\n value === '-' ||\n value === '+' ||\n value === '.'\n ) {\n return null;\n }\n\n const result =\n Number(value);\n\n return Number.isFinite(result)\n ? result\n : null;\n }\n\n private clamp(\n value: number\n ): number {\n\n const min =\n this.min();\n\n const max =\n this.max();\n\n if (\n min !== undefined &&\n value < min\n ) {\n return min;\n }\n\n if (\n max !== undefined &&\n value > max\n ) {\n return max;\n }\n\n return value;\n }\n\n private round(\n value: number\n ): number {\n\n const digits =\n this.maxFractionDigits();\n\n const multiplier =\n 10 ** digits;\n\n return (\n Math.round(\n (value + Number.EPSILON) *\n multiplier\n ) /\n multiplier\n );\n }\n\n private toEditableString(\n value: number\n ): string {\n\n const parts =\n new Intl.NumberFormat(\n this.locale(),\n {\n useGrouping: false,\n maximumFractionDigits:\n this.maxFractionDigits()\n }\n )\n .format(value);\n\n return parts;\n }\n\n private escapeRegex(\n value: string\n ): string {\n\n return value.replace(\n /[.*+?^${}()|[\\]\\\\]/g,\n '\\\\$&'\n );\n }\n}","<div class=\"sui-input-number\">\n\n <input\n class=\"sui-input-number-input\"\n\n type=\"text\"\n\n [id]=\"id()\"\n [name]=\"name() ?? ''\"\n\n [value]=\"text()\"\n\n [placeholder]=\"placeholder()\"\n\n [disabled]=\"isDisabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n\n inputmode=\"decimal\"\n\n [attr.aria-label]=\"\n ariaLabel() ?? null\n \"\n\n [attr.aria-describedby]=\"\n ariaDescribedBy() ?? null\n \"\n\n [attr.aria-invalid]=\"\n ariaInvalid() ?? null\n \"\n\n (input)=\"handleInput($event)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n />\n\n @if (showButtons()) {\n\n <div class=\"sui-input-number-buttons\">\n\n <button\n type=\"button\"\n class=\"sui-input-number-button\"\n\n tabindex=\"-1\"\n\n [disabled]=\"isDisabled() || readonly()\"\n\n aria-label=\"Increase\"\n\n (click)=\"increment()\">\n\n ▲\n\n </button>\n\n <button\n type=\"button\"\n class=\"sui-input-number-button\"\n\n tabindex=\"-1\"\n\n [disabled]=\"isDisabled() || readonly()\"\n\n aria-label=\"Decrease\"\n\n (click)=\"decrement()\">\n\n ▼\n\n </button>\n\n </div>\n\n }\n\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, output, signal, computed, forwardRef, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+
5
+ let nextInputId = 0;
6
+ class SuiInput {
7
+ id = input(`sui-input-${++nextInputId}`, /* @ts-ignore */
8
+ ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
9
+ name = input(/* @ts-ignore */
10
+ ...(ngDevMode ? [undefined, { debugName: "name" }] : /* istanbul ignore next */ []));
11
+ type = input('text', /* @ts-ignore */
12
+ ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
13
+ placeholder = input('', /* @ts-ignore */
14
+ ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
15
+ autocomplete = input(/* @ts-ignore */
16
+ ...(ngDevMode ? [undefined, { debugName: "autocomplete" }] : /* istanbul ignore next */ []));
17
+ inputMode = input(/* @ts-ignore */
18
+ ...(ngDevMode ? [undefined, { debugName: "inputMode" }] : /* istanbul ignore next */ []));
19
+ readonly = input(false, /* @ts-ignore */
20
+ ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
21
+ disabled = input(false, /* @ts-ignore */
22
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
23
+ maxlength = input(/* @ts-ignore */
24
+ ...(ngDevMode ? [undefined, { debugName: "maxlength" }] : /* istanbul ignore next */ []));
25
+ minlength = input(/* @ts-ignore */
26
+ ...(ngDevMode ? [undefined, { debugName: "minlength" }] : /* istanbul ignore next */ []));
27
+ ariaLabel = input(/* @ts-ignore */
28
+ ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
29
+ ariaDescribedBy = input(/* @ts-ignore */
30
+ ...(ngDevMode ? [undefined, { debugName: "ariaDescribedBy" }] : /* istanbul ignore next */ []));
31
+ ariaInvalid = input(/* @ts-ignore */
32
+ ...(ngDevMode ? [undefined, { debugName: "ariaInvalid" }] : /* istanbul ignore next */ []));
33
+ valueChange = output();
34
+ focused = output();
35
+ blurred = output();
36
+ value = signal('', /* @ts-ignore */
37
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
38
+ formDisabled = signal(false, /* @ts-ignore */
39
+ ...(ngDevMode ? [{ debugName: "formDisabled" }] : /* istanbul ignore next */ []));
40
+ isDisabled = computed(() => this.disabled() || this.formDisabled(), /* @ts-ignore */
41
+ ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
42
+ onChange = () => { };
43
+ onTouched = () => { };
44
+ writeValue(value) {
45
+ this.value.set(value ?? '');
46
+ }
47
+ registerOnChange(fn) {
48
+ this.onChange = fn;
49
+ }
50
+ registerOnTouched(fn) {
51
+ this.onTouched = fn;
52
+ }
53
+ setDisabledState(disabled) {
54
+ this.formDisabled.set(disabled);
55
+ }
56
+ handleInput(event) {
57
+ const element = event.target;
58
+ const value = element.value;
59
+ this.value.set(value);
60
+ this.onChange(value);
61
+ this.valueChange.emit(value);
62
+ }
63
+ handleFocus(event) {
64
+ this.focused.emit(event);
65
+ }
66
+ handleBlur(event) {
67
+ this.onTouched();
68
+ this.blurred.emit(event);
69
+ }
70
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SuiInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
71
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.1", type: SuiInput, isStandalone: true, selector: "sui-input", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, autocomplete: { classPropertyName: "autocomplete", publicName: "autocomplete", isSignal: true, isRequired: false, transformFunction: null }, inputMode: { classPropertyName: "inputMode", publicName: "inputMode", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, maxlength: { classPropertyName: "maxlength", publicName: "maxlength", isSignal: true, isRequired: false, transformFunction: null }, minlength: { classPropertyName: "minlength", publicName: "minlength", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedBy: { classPropertyName: "ariaDescribedBy", publicName: "ariaDescribedBy", isSignal: true, isRequired: false, transformFunction: null }, ariaInvalid: { classPropertyName: "ariaInvalid", publicName: "ariaInvalid", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", focused: "focused", blurred: "blurred" }, providers: [
72
+ {
73
+ provide: NG_VALUE_ACCESSOR,
74
+ useExisting: forwardRef(() => SuiInput),
75
+ multi: true
76
+ }
77
+ ], ngImport: i0, template: "<input\r\n class=\"sui-input\"\r\n\r\n [id]=\"id()\"\r\n [name]=\"name() ?? ''\"\r\n [type]=\"type()\"\r\n [value]=\"value()\"\r\n\r\n [placeholder]=\"placeholder()\"\r\n\r\n [disabled]=\"isDisabled()\"\r\n [readOnly]=\"readonly()\"\r\n\r\n [attr.autocomplete]=\"autocomplete() ?? null\"\r\n [attr.inputmode]=\"inputMode() ?? null\"\r\n\r\n [attr.maxlength]=\"maxlength() ?? null\"\r\n [attr.minlength]=\"minlength() ?? null\"\r\n\r\n [attr.aria-label]=\"ariaLabel() ?? null\"\r\n [attr.aria-describedby]=\"ariaDescribedBy() ?? null\"\r\n [attr.aria-invalid]=\"ariaInvalid() ?? null\"\r\n\r\n (input)=\"handleInput($event)\"\r\n (focus)=\"handleFocus($event)\"\r\n (blur)=\"handleBlur($event)\"\r\n/>", styles: [":host{display:block;width:100%}.sui-input{display:block;width:100%;box-sizing:border-box;padding:var(--sui-space-2) var(--sui-input-padding-x);font-family:inherit;font-size:var(--sui-control-font-size-md);line-height:1.25rem;color:var(--sui-input-text);background:var(--sui-input-background);border:var(--sui-input-border-width) solid var(--sui-input-border);border-radius:var(--sui-input-radius);outline:none;transition:border-color var(--sui-duration-normal) var(--sui-easing-standard),box-shadow var(--sui-duration-normal) var(--sui-easing-standard),background-color var(--sui-duration-normal) var(--sui-easing-standard)}.sui-input::placeholder{color:var(--sui-input-placeholder)}.sui-input:hover:not(:disabled):not(:read-only){border-color:var(--sui-input-border-hover)}.sui-input:focus{border-color:var(--sui-input-border-focus);box-shadow:0 0 0 var(--sui-focus-ring-width) var(--sui-input-focus-color)}.sui-input:disabled{cursor:not-allowed;color:var(--sui-input-disabled-text);background:var(--sui-input-disabled-background);border-color:var(--sui-color-border)}.sui-input:read-only{background:var(--sui-color-surface-alt)}.sui-input[aria-invalid=true]{border-color:var(--sui-input-border-invalid)}.sui-input[aria-invalid=true]:focus{box-shadow:0 0 0 var(--sui-focus-ring-width) var(--sui-color-danger)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
78
+ }
79
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SuiInput, decorators: [{
80
+ type: Component,
81
+ args: [{ selector: 'sui-input', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
82
+ {
83
+ provide: NG_VALUE_ACCESSOR,
84
+ useExisting: forwardRef(() => SuiInput),
85
+ multi: true
86
+ }
87
+ ], template: "<input\r\n class=\"sui-input\"\r\n\r\n [id]=\"id()\"\r\n [name]=\"name() ?? ''\"\r\n [type]=\"type()\"\r\n [value]=\"value()\"\r\n\r\n [placeholder]=\"placeholder()\"\r\n\r\n [disabled]=\"isDisabled()\"\r\n [readOnly]=\"readonly()\"\r\n\r\n [attr.autocomplete]=\"autocomplete() ?? null\"\r\n [attr.inputmode]=\"inputMode() ?? null\"\r\n\r\n [attr.maxlength]=\"maxlength() ?? null\"\r\n [attr.minlength]=\"minlength() ?? null\"\r\n\r\n [attr.aria-label]=\"ariaLabel() ?? null\"\r\n [attr.aria-describedby]=\"ariaDescribedBy() ?? null\"\r\n [attr.aria-invalid]=\"ariaInvalid() ?? null\"\r\n\r\n (input)=\"handleInput($event)\"\r\n (focus)=\"handleFocus($event)\"\r\n (blur)=\"handleBlur($event)\"\r\n/>", styles: [":host{display:block;width:100%}.sui-input{display:block;width:100%;box-sizing:border-box;padding:var(--sui-space-2) var(--sui-input-padding-x);font-family:inherit;font-size:var(--sui-control-font-size-md);line-height:1.25rem;color:var(--sui-input-text);background:var(--sui-input-background);border:var(--sui-input-border-width) solid var(--sui-input-border);border-radius:var(--sui-input-radius);outline:none;transition:border-color var(--sui-duration-normal) var(--sui-easing-standard),box-shadow var(--sui-duration-normal) var(--sui-easing-standard),background-color var(--sui-duration-normal) var(--sui-easing-standard)}.sui-input::placeholder{color:var(--sui-input-placeholder)}.sui-input:hover:not(:disabled):not(:read-only){border-color:var(--sui-input-border-hover)}.sui-input:focus{border-color:var(--sui-input-border-focus);box-shadow:0 0 0 var(--sui-focus-ring-width) var(--sui-input-focus-color)}.sui-input:disabled{cursor:not-allowed;color:var(--sui-input-disabled-text);background:var(--sui-input-disabled-background);border-color:var(--sui-color-border)}.sui-input:read-only{background:var(--sui-color-surface-alt)}.sui-input[aria-invalid=true]{border-color:var(--sui-input-border-invalid)}.sui-input[aria-invalid=true]:focus{box-shadow:0 0 0 var(--sui-focus-ring-width) var(--sui-color-danger)}\n"] }]
88
+ }], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], autocomplete: [{ type: i0.Input, args: [{ isSignal: true, alias: "autocomplete", required: false }] }], inputMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "inputMode", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], maxlength: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxlength", required: false }] }], minlength: [{ type: i0.Input, args: [{ isSignal: true, alias: "minlength", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], ariaDescribedBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaDescribedBy", required: false }] }], ariaInvalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaInvalid", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], focused: [{ type: i0.Output, args: ["focused"] }], blurred: [{ type: i0.Output, args: ["blurred"] }] } });
89
+
90
+ /**
91
+ * Generated bundle index. Do not edit.
92
+ */
93
+
94
+ export { SuiInput };
95
+ //# sourceMappingURL=saitec-ui-input.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saitec-ui-input.mjs","sources":["../../../projects/ui/input/src/input.component.ts","../../../projects/ui/input/src/input.component.html","../../../projects/ui/input/src/saitec-ui-input.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n forwardRef,\r\n input,\r\n output,\r\n signal\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR\r\n} from '@angular/forms';\r\n\r\nexport type SaiInputType =\r\n | 'text'\r\n | 'email'\r\n | 'password'\r\n | 'search'\r\n | 'tel'\r\n | 'url';\r\n\r\nlet nextInputId = 0;\r\n\r\n@Component({\r\n selector: 'sui-input',\r\n standalone: true,\r\n templateUrl: './input.component.html',\r\n styleUrl: './input.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SuiInput),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class SuiInput implements ControlValueAccessor {\r\n\r\n id = input(`sui-input-${++nextInputId}`);\r\n\r\n name = input<string>();\r\n\r\n type = input<SaiInputType>('text');\r\n\r\n placeholder = input('');\r\n\r\n autocomplete = input<string>();\r\n\r\n inputMode = input<string>();\r\n\r\n readonly = input(false);\r\n\r\n disabled = input(false);\r\n\r\n maxlength = input<number>();\r\n\r\n minlength = input<number>();\r\n\r\n ariaLabel = input<string>();\r\n\r\n ariaDescribedBy = input<string>();\r\n\r\n ariaInvalid = input<boolean>();\r\n\r\n valueChange = output<string>();\r\n\r\n focused = output<FocusEvent>();\r\n\r\n blurred = output<FocusEvent>();\r\n\r\n protected readonly value = signal('');\r\n\r\n private readonly formDisabled = signal(false);\r\n\r\n protected readonly isDisabled = computed(\r\n () => this.disabled() || this.formDisabled()\r\n );\r\n\r\n private onChange: (value: string) => void = () => {};\r\n\r\n private onTouched: () => void = () => {};\r\n\r\n writeValue(value: string | null | undefined): void {\r\n this.value.set(value ?? '');\r\n }\r\n\r\n registerOnChange(fn: (value: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(disabled: boolean): void {\r\n this.formDisabled.set(disabled);\r\n }\r\n\r\n protected handleInput(event: Event): void {\r\n const element = event.target as HTMLInputElement;\r\n const value = element.value;\r\n\r\n this.value.set(value);\r\n\r\n this.onChange(value);\r\n this.valueChange.emit(value);\r\n }\r\n\r\n protected handleFocus(event: FocusEvent): void {\r\n this.focused.emit(event);\r\n }\r\n\r\n protected handleBlur(event: FocusEvent): void {\r\n this.onTouched();\r\n this.blurred.emit(event);\r\n }\r\n}","<input\r\n class=\"sui-input\"\r\n\r\n [id]=\"id()\"\r\n [name]=\"name() ?? ''\"\r\n [type]=\"type()\"\r\n [value]=\"value()\"\r\n\r\n [placeholder]=\"placeholder()\"\r\n\r\n [disabled]=\"isDisabled()\"\r\n [readOnly]=\"readonly()\"\r\n\r\n [attr.autocomplete]=\"autocomplete() ?? null\"\r\n [attr.inputmode]=\"inputMode() ?? null\"\r\n\r\n [attr.maxlength]=\"maxlength() ?? null\"\r\n [attr.minlength]=\"minlength() ?? null\"\r\n\r\n [attr.aria-label]=\"ariaLabel() ?? null\"\r\n [attr.aria-describedby]=\"ariaDescribedBy() ?? null\"\r\n [attr.aria-invalid]=\"ariaInvalid() ?? null\"\r\n\r\n (input)=\"handleInput($event)\"\r\n (focus)=\"handleFocus($event)\"\r\n (blur)=\"handleBlur($event)\"\r\n/>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, signal, ChangeDetectionStrategy, Component } from '@angular/core';
3
+
4
+ class SuiMenuItemView {
5
+ item = input.required(/* @ts-ignore */
6
+ ...(ngDevMode ? [{ debugName: "item" }] : /* istanbul ignore next */ []));
7
+ expanded = signal(false, /* @ts-ignore */
8
+ ...(ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []));
9
+ handleClick() {
10
+ const item = this.item();
11
+ if (item.disabled) {
12
+ return;
13
+ }
14
+ if (item.items?.length) {
15
+ this.expanded.update(value => !value);
16
+ return;
17
+ }
18
+ item.command?.(item);
19
+ }
20
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SuiMenuItemView, deps: [], target: i0.ɵɵFactoryTarget.Component });
21
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: SuiMenuItemView, isStandalone: true, selector: "sui-menu-item-view", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@if (item().separator) {\r\n\r\n <div\r\n class=\"sui-menu-separator\"\r\n role=\"separator\">\r\n </div>\r\n\r\n}\r\n@else {\r\n\r\n <button\r\n type=\"button\"\r\n class=\"sui-menu-item\"\r\n\r\n [disabled]=\"item().disabled ?? false\"\r\n\r\n [attr.aria-haspopup]=\"\r\n item().items?.length\r\n ? 'menu'\r\n : null\r\n \"\r\n\r\n [attr.aria-expanded]=\"\r\n item().items?.length\r\n ? expanded()\r\n : null\r\n \"\r\n\r\n role=\"menuitem\"\r\n\r\n (click)=\"handleClick()\">\r\n\r\n <span class=\"sui-menu-item-label\">\r\n {{ item().label }}\r\n </span>\r\n\r\n @if (item().items?.length) {\r\n\r\n <span\r\n class=\"sui-menu-item-chevron\"\r\n [class.sui-menu-item-chevron-expanded]=\"expanded()\"\r\n aria-hidden=\"true\">\r\n\r\n \u203A\r\n </span>\r\n\r\n }\r\n\r\n </button>\r\n\r\n @if (\r\n item().items?.length &&\r\n expanded()\r\n ) {\r\n\r\n <ul\r\n class=\"sui-menu-submenu\"\r\n role=\"menu\">\r\n\r\n @for (\r\n child of item().items;\r\n track $index\r\n ) {\r\n\r\n <li role=\"none\">\r\n\r\n <sui-menu-item-view\r\n [item]=\"child\">\r\n </sui-menu-item-view>\r\n\r\n </li>\r\n\r\n }\r\n\r\n </ul>\r\n\r\n }\r\n\r\n}", styles: [":host{display:block}.sui-menu-item{display:flex;align-items:center;justify-content:space-between;width:100%;box-sizing:border-box;padding:.5rem .625rem;color:var(--sui-menu-text);background:transparent;border:0;border-radius:var(--sui-menu-item-radius);cursor:pointer;font-family:inherit;font-size:var(--sui-control-font-size-sm);text-align:left}.sui-menu-item:hover:not(:disabled){color:var(--sui-color-content);background:var(--sui-menu-item-background-hover)}.sui-menu-item:focus-visible{outline:var(--sui-focus-ring-width) solid var(--sui-color-focus);outline-offset:-2px}.sui-menu-item:disabled{cursor:not-allowed;color:var(--sui-menu-item-disabled-text);opacity:.65}.sui-menu-item-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sui-menu-item-chevron{flex-shrink:0;margin-left:.75rem;font-size:1rem;transition:transform var(--sui-duration-normal) var(--sui-easing-standard)}.sui-menu-item-chevron-expanded{transform:rotate(90deg)}.sui-menu-submenu{display:flex;flex-direction:column;gap:.125rem;margin:.125rem 0 .125rem .75rem;padding:0 0 0 .5rem;list-style:none;border-left:var(--sui-menu-border-width) solid var(--sui-menu-border)}.sui-menu-separator{height:1px;margin:.25rem .375rem;background:var(--sui-menu-separator)}\n"], dependencies: [{ kind: "component", type: SuiMenuItemView, selector: "sui-menu-item-view", inputs: ["item"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
22
+ }
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SuiMenuItemView, decorators: [{
24
+ type: Component,
25
+ args: [{ selector: 'sui-menu-item-view', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (item().separator) {\r\n\r\n <div\r\n class=\"sui-menu-separator\"\r\n role=\"separator\">\r\n </div>\r\n\r\n}\r\n@else {\r\n\r\n <button\r\n type=\"button\"\r\n class=\"sui-menu-item\"\r\n\r\n [disabled]=\"item().disabled ?? false\"\r\n\r\n [attr.aria-haspopup]=\"\r\n item().items?.length\r\n ? 'menu'\r\n : null\r\n \"\r\n\r\n [attr.aria-expanded]=\"\r\n item().items?.length\r\n ? expanded()\r\n : null\r\n \"\r\n\r\n role=\"menuitem\"\r\n\r\n (click)=\"handleClick()\">\r\n\r\n <span class=\"sui-menu-item-label\">\r\n {{ item().label }}\r\n </span>\r\n\r\n @if (item().items?.length) {\r\n\r\n <span\r\n class=\"sui-menu-item-chevron\"\r\n [class.sui-menu-item-chevron-expanded]=\"expanded()\"\r\n aria-hidden=\"true\">\r\n\r\n \u203A\r\n </span>\r\n\r\n }\r\n\r\n </button>\r\n\r\n @if (\r\n item().items?.length &&\r\n expanded()\r\n ) {\r\n\r\n <ul\r\n class=\"sui-menu-submenu\"\r\n role=\"menu\">\r\n\r\n @for (\r\n child of item().items;\r\n track $index\r\n ) {\r\n\r\n <li role=\"none\">\r\n\r\n <sui-menu-item-view\r\n [item]=\"child\">\r\n </sui-menu-item-view>\r\n\r\n </li>\r\n\r\n }\r\n\r\n </ul>\r\n\r\n }\r\n\r\n}", styles: [":host{display:block}.sui-menu-item{display:flex;align-items:center;justify-content:space-between;width:100%;box-sizing:border-box;padding:.5rem .625rem;color:var(--sui-menu-text);background:transparent;border:0;border-radius:var(--sui-menu-item-radius);cursor:pointer;font-family:inherit;font-size:var(--sui-control-font-size-sm);text-align:left}.sui-menu-item:hover:not(:disabled){color:var(--sui-color-content);background:var(--sui-menu-item-background-hover)}.sui-menu-item:focus-visible{outline:var(--sui-focus-ring-width) solid var(--sui-color-focus);outline-offset:-2px}.sui-menu-item:disabled{cursor:not-allowed;color:var(--sui-menu-item-disabled-text);opacity:.65}.sui-menu-item-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sui-menu-item-chevron{flex-shrink:0;margin-left:.75rem;font-size:1rem;transition:transform var(--sui-duration-normal) var(--sui-easing-standard)}.sui-menu-item-chevron-expanded{transform:rotate(90deg)}.sui-menu-submenu{display:flex;flex-direction:column;gap:.125rem;margin:.125rem 0 .125rem .75rem;padding:0 0 0 .5rem;list-style:none;border-left:var(--sui-menu-border-width) solid var(--sui-menu-border)}.sui-menu-separator{height:1px;margin:.25rem .375rem;background:var(--sui-menu-separator)}\n"] }]
26
+ }], propDecorators: { item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: true }] }] } });
27
+
28
+ class SuiMenu {
29
+ items = input([], /* @ts-ignore */
30
+ ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
31
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SuiMenu, deps: [], target: i0.ɵɵFactoryTarget.Component });
32
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: SuiMenu, isStandalone: true, selector: "sui-menu", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<nav\n class=\"sui-menu\"\n aria-label=\"Menu\">\n\n <ul\n class=\"sui-menu-list\"\n role=\"menu\">\n\n @for (\n item of items();\n track $index\n ) {\n <li role=\"none\">\n\n <sui-menu-item-view\n [item]=\"item\">\n </sui-menu-item-view>\n\n </li>\n }\n\n </ul>\n\n</nav>", styles: [":host{display:block}.sui-menu{min-width:var(--sui-menu-min-width);box-sizing:border-box;padding:.25rem;color:var(--sui-menu-text);background:var(--sui-menu-background);border:var(--sui-menu-border-width) solid var(--sui-menu-border);border-radius:var(--sui-menu-radius);box-shadow:var(--sui-menu-shadow)}.sui-menu-list{display:flex;flex-direction:column;gap:.125rem;margin:0;padding:0;list-style:none}\n"], dependencies: [{ kind: "component", type: SuiMenuItemView, selector: "sui-menu-item-view", inputs: ["item"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
33
+ }
34
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: SuiMenu, decorators: [{
35
+ type: Component,
36
+ args: [{ selector: 'sui-menu', standalone: true, imports: [
37
+ SuiMenuItemView
38
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<nav\n class=\"sui-menu\"\n aria-label=\"Menu\">\n\n <ul\n class=\"sui-menu-list\"\n role=\"menu\">\n\n @for (\n item of items();\n track $index\n ) {\n <li role=\"none\">\n\n <sui-menu-item-view\n [item]=\"item\">\n </sui-menu-item-view>\n\n </li>\n }\n\n </ul>\n\n</nav>", styles: [":host{display:block}.sui-menu{min-width:var(--sui-menu-min-width);box-sizing:border-box;padding:.25rem;color:var(--sui-menu-text);background:var(--sui-menu-background);border:var(--sui-menu-border-width) solid var(--sui-menu-border);border-radius:var(--sui-menu-radius);box-shadow:var(--sui-menu-shadow)}.sui-menu-list{display:flex;flex-direction:column;gap:.125rem;margin:0;padding:0;list-style:none}\n"] }]
39
+ }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }] } });
40
+
41
+ /**
42
+ * Generated bundle index. Do not edit.
43
+ */
44
+
45
+ export { SuiMenu };
46
+ //# sourceMappingURL=saitec-ui-menu.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saitec-ui-menu.mjs","sources":["../../../projects/ui/menu/src/menu-item-view.component.ts","../../../projects/ui/menu/src/menu-item-view.component.html","../../../projects/ui/menu/src/menu.component.ts","../../../projects/ui/menu/src/menu.component.html","../../../projects/ui/menu/src/saitec-ui-menu.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n input,\r\n signal\r\n} from '@angular/core';\r\n\r\nimport {\r\n SuiMenuItem\r\n} from './menu.component';\r\n\r\n@Component({\r\n selector: 'sui-menu-item-view',\r\n standalone: true,\r\n templateUrl: './menu-item-view.component.html',\r\n styleUrl: './menu-item-view.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class SuiMenuItemView {\r\n\r\n item = input.required<SuiMenuItem>();\r\n\r\n protected readonly expanded =\r\n signal(false);\r\n\r\n protected handleClick(): void {\r\n const item = this.item();\r\n\r\n if (item.disabled) {\r\n return;\r\n }\r\n\r\n if (item.items?.length) {\r\n this.expanded.update(\r\n value => !value\r\n );\r\n\r\n return;\r\n }\r\n\r\n item.command?.(item);\r\n }\r\n}","@if (item().separator) {\r\n\r\n <div\r\n class=\"sui-menu-separator\"\r\n role=\"separator\">\r\n </div>\r\n\r\n}\r\n@else {\r\n\r\n <button\r\n type=\"button\"\r\n class=\"sui-menu-item\"\r\n\r\n [disabled]=\"item().disabled ?? false\"\r\n\r\n [attr.aria-haspopup]=\"\r\n item().items?.length\r\n ? 'menu'\r\n : null\r\n \"\r\n\r\n [attr.aria-expanded]=\"\r\n item().items?.length\r\n ? expanded()\r\n : null\r\n \"\r\n\r\n role=\"menuitem\"\r\n\r\n (click)=\"handleClick()\">\r\n\r\n <span class=\"sui-menu-item-label\">\r\n {{ item().label }}\r\n </span>\r\n\r\n @if (item().items?.length) {\r\n\r\n <span\r\n class=\"sui-menu-item-chevron\"\r\n [class.sui-menu-item-chevron-expanded]=\"expanded()\"\r\n aria-hidden=\"true\">\r\n\r\n ›\r\n </span>\r\n\r\n }\r\n\r\n </button>\r\n\r\n @if (\r\n item().items?.length &&\r\n expanded()\r\n ) {\r\n\r\n <ul\r\n class=\"sui-menu-submenu\"\r\n role=\"menu\">\r\n\r\n @for (\r\n child of item().items;\r\n track $index\r\n ) {\r\n\r\n <li role=\"none\">\r\n\r\n <sui-menu-item-view\r\n [item]=\"child\">\r\n </sui-menu-item-view>\r\n\r\n </li>\r\n\r\n }\r\n\r\n </ul>\r\n\r\n }\r\n\r\n}","import {\n ChangeDetectionStrategy,\n Component,\n input\n} from '@angular/core';\n\nimport { SuiMenuItemView } from './menu-item-view.component';\n\nexport interface SuiMenuItem {\n label?: string;\n\n disabled?: boolean;\n\n separator?: boolean;\n\n items?: SuiMenuItem[];\n\n command?: (item: SuiMenuItem) => void;\n}\n\n@Component({\n selector: 'sui-menu',\n standalone: true,\n imports: [\n SuiMenuItemView\n ],\n templateUrl: './menu.component.html',\n styleUrl: './menu.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SuiMenu {\n\n items = input<SuiMenuItem[]>([]);\n}","<nav\n class=\"sui-menu\"\n aria-label=\"Menu\">\n\n <ul\n class=\"sui-menu-list\"\n role=\"menu\">\n\n @for (\n item of items();\n track $index\n ) {\n <li role=\"none\">\n\n <sui-menu-item-view\n [item]=\"item\">\n </sui-menu-item-view>\n\n </li>\n }\n\n </ul>\n\n</nav>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;MAkBa,eAAe,CAAA;IAExB,IAAI,GAAG,KAAK,CAAC,QAAQ;6EAAe;IAEjB,QAAQ,GACvB,MAAM,CAAC,KAAK;iFAAC;IAEP,WAAW,GAAA;AACjB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AAExB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf;QACJ;AAEA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE;AACpB,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAChB,KAAK,IAAI,CAAC,KAAK,CAClB;YAED;QACJ;AAEA,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACxB;uGAvBS,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClB5B,6mDA8EC,EAAA,MAAA,EAAA,CAAA,8uCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED5DY,eAAe,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,6mDAAA,EAAA,MAAA,EAAA,CAAA,8uCAAA,CAAA,EAAA;;;MEctC,OAAO,CAAA;IAEhB,KAAK,GAAG,KAAK,CAAgB,EAAE;8EAAC;uGAFvB,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAP,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9BpB,8ZAuBM,EAAA,MAAA,EAAA,CAAA,qZAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDCE,eAAe,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAMV,OAAO,EAAA,UAAA,EAAA,CAAA;kBAVnB,SAAS;+BACI,UAAU,EAAA,UAAA,EACR,IAAI,EAAA,OAAA,EACP;wBACL;qBACH,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,8ZAAA,EAAA,MAAA,EAAA,CAAA,qZAAA,CAAA,EAAA;;;AE5BnD;;AAEG;;;;"}