@sondor-technology/sondor-components 1.0.7 → 1.0.9

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 (53) hide show
  1. package/dist/components/calendar/calendar.d.ts +36 -0
  2. package/dist/components/calendar/calendar.d.ts.map +1 -0
  3. package/dist/components/calendar/calendar.js +449 -0
  4. package/dist/components/calendar/calendar.js.map +1 -0
  5. package/dist/components/cron-builder/cron-builder.d.ts +37 -0
  6. package/dist/components/cron-builder/cron-builder.d.ts.map +1 -0
  7. package/dist/components/cron-builder/cron-builder.js +522 -0
  8. package/dist/components/cron-builder/cron-builder.js.map +1 -0
  9. package/dist/components/input/input.d.ts +1 -0
  10. package/dist/components/input/input.d.ts.map +1 -1
  11. package/dist/components/input/input.js +35 -12
  12. package/dist/components/input/input.js.map +1 -1
  13. package/dist/components/pin-input/pin-input.d.ts +33 -0
  14. package/dist/components/pin-input/pin-input.d.ts.map +1 -0
  15. package/dist/components/pin-input/pin-input.js +253 -0
  16. package/dist/components/pin-input/pin-input.js.map +1 -0
  17. package/dist/components/popover/popover.d.ts +26 -0
  18. package/dist/components/popover/popover.d.ts.map +1 -0
  19. package/dist/components/popover/popover.js +196 -0
  20. package/dist/components/popover/popover.js.map +1 -0
  21. package/dist/components/select/select.d.ts +4 -1
  22. package/dist/components/select/select.d.ts.map +1 -1
  23. package/dist/components/select/select.js +26 -4
  24. package/dist/components/select/select.js.map +1 -1
  25. package/dist/components/time-picker/time-picker.d.ts +38 -0
  26. package/dist/components/time-picker/time-picker.d.ts.map +1 -0
  27. package/dist/components/time-picker/time-picker.js +290 -0
  28. package/dist/components/time-picker/time-picker.js.map +1 -0
  29. package/dist/components/toggle-group/toggle-button.d.ts +23 -0
  30. package/dist/components/toggle-group/toggle-button.d.ts.map +1 -0
  31. package/dist/components/toggle-group/toggle-button.js +114 -0
  32. package/dist/components/toggle-group/toggle-button.js.map +1 -0
  33. package/dist/components/toggle-group/toggle-group.d.ts +38 -0
  34. package/dist/components/toggle-group/toggle-group.d.ts.map +1 -0
  35. package/dist/components/toggle-group/toggle-group.js +270 -0
  36. package/dist/components/toggle-group/toggle-group.js.map +1 -0
  37. package/dist/components/tooltip/tooltip.d.ts +33 -0
  38. package/dist/components/tooltip/tooltip.d.ts.map +1 -0
  39. package/dist/components/tooltip/tooltip.js +293 -0
  40. package/dist/components/tooltip/tooltip.js.map +1 -0
  41. package/dist/styles/index.css +2 -0
  42. package/package.json +33 -1
  43. package/src/components/calendar/calendar.ts +458 -0
  44. package/src/components/cron-builder/cron-builder.ts +529 -0
  45. package/src/components/input/input.ts +38 -14
  46. package/src/components/pin-input/pin-input.ts +249 -0
  47. package/src/components/popover/popover.ts +192 -0
  48. package/src/components/select/select.ts +25 -63
  49. package/src/components/time-picker/time-picker.ts +286 -0
  50. package/src/components/toggle-group/toggle-button.ts +103 -0
  51. package/src/components/toggle-group/toggle-group.ts +264 -0
  52. package/src/components/tooltip/tooltip.ts +286 -0
  53. package/src/styles/theme.css +3 -0
@@ -0,0 +1,522 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { LitElement, html, css } from "lit";
8
+ import { customElement, property, state } from "lit/decorators.js";
9
+ import { resetStyles } from "../../styles/reset";
10
+ let StCronBuilder = class StCronBuilder extends LitElement {
11
+ constructor() {
12
+ super();
13
+ this.name = "";
14
+ this.value = "";
15
+ this.required = false;
16
+ this._frequency = "weekly";
17
+ this._time = "12:00";
18
+ this._days = "1,3,5";
19
+ this._monthDay = "1";
20
+ this._date = "";
21
+ this._customCron = "0 * * * *";
22
+ this._customCronError = "";
23
+ this._customCronText = "";
24
+ this._defaultValue = "";
25
+ this._lastGeneratedOutput = "";
26
+ this._internals = this.attachInternals();
27
+ const today = new Date();
28
+ const pad = (n) => n.toString().padStart(2, "0");
29
+ this._date = `${today.getFullYear()}-${pad(today.getMonth() + 1)}-${pad(today.getDate())}`;
30
+ }
31
+ willUpdate(changedProperties) {
32
+ super.willUpdate(changedProperties);
33
+ // Check if value changed, is truthy (not ""), and wasn't generated by the component itself
34
+ if (changedProperties.has("value") && this.value && this.value !== this._lastGeneratedOutput) {
35
+ this._parseIncomingValue(this.value);
36
+ this._generateOutput(true); // true = silent (don't dispatch 'change' event)
37
+ }
38
+ }
39
+ firstUpdated(changedProperties) {
40
+ super.firstUpdated(changedProperties);
41
+ // If the component mounted without an external value, generate the default cron string
42
+ if (!this.value) {
43
+ this._generateOutput(true);
44
+ }
45
+ this._defaultValue = this.value;
46
+ }
47
+ _parseIncomingValue(val) {
48
+ if (!val)
49
+ return;
50
+ // 1. One-Off Checks
51
+ if (val.includes("T")) {
52
+ this._frequency = "one-off";
53
+ const [dateStr, timeStr] = val.split("T");
54
+ this._date = dateStr;
55
+ this._time = timeStr;
56
+ return;
57
+ }
58
+ const parts = val.trim().split(/\s+/);
59
+ if (parts.length !== 5) {
60
+ this._frequency = "custom";
61
+ this._customCron = val;
62
+ return;
63
+ }
64
+ // 🚀 THE FIX: Check mathematical validity FIRST.
65
+ // If it's broken (like DOW 15), force it to Custom so the error UI displays.
66
+ const analysis = this._translateCron(val);
67
+ if (!analysis.valid) {
68
+ this._frequency = "custom";
69
+ this._customCron = val;
70
+ return;
71
+ }
72
+ // 2. Safe mapping for valid cron strings
73
+ const [min, hour, dom, mon, dow] = parts;
74
+ if (/^\d+$/.test(min) && /^\d+$/.test(hour)) {
75
+ this._time = `${hour.padStart(2, "0")}:${min.padStart(2, "0")}`;
76
+ if (dom === "*" && mon === "*" && dow === "*") {
77
+ this._frequency = "daily";
78
+ return;
79
+ }
80
+ // Ensure weekly is only triggered for simple lists (e.g. "1,3,5" or "1"), not steps/ranges
81
+ else if (dom === "*" && mon === "*" && /^[0-7](,[0-7])*$/.test(dow)) {
82
+ this._frequency = "weekly";
83
+ this._days = dow;
84
+ return;
85
+ }
86
+ else if (/^\d+$/.test(dom) && mon === "*" && dow === "*") {
87
+ this._frequency = "monthly";
88
+ this._monthDay = dom;
89
+ return;
90
+ }
91
+ }
92
+ // 3. Fallback for valid but complex expressions (e.g., */15 * * * *)
93
+ this._frequency = "custom";
94
+ this._customCron = val;
95
+ }
96
+ _translateCron(cron) {
97
+ const parts = cron.trim().split(/\s+/);
98
+ if (parts.length !== 5) {
99
+ return {
100
+ valid: false,
101
+ text: `A cron expression must contain exactly 5 segments (currently ${parts.length}).`,
102
+ };
103
+ }
104
+ const types = ["Minute", "Hour", "Day of Month", "Month", "Day of Week"];
105
+ const bounds = [
106
+ { min: 0, max: 59 }, // Minute
107
+ { min: 0, max: 23 }, // Hour
108
+ { min: 1, max: 31 }, // DOM
109
+ { min: 1, max: 12 }, // Month
110
+ { min: 0, max: 7 }, // DOW
111
+ ];
112
+ for (let i = 0; i < 5; i++) {
113
+ const part = parts[i];
114
+ const type = types[i];
115
+ const bound = bounds[i];
116
+ // Prevent consecutive or hanging symbols like 1- or */
117
+ if (/(^[\/\-\,])|([\/\-\,]$)|([\/\-\,]{2,})/.test(part)) {
118
+ return { valid: false, text: `Invalid formatting in ${type} segment.` };
119
+ }
120
+ // First 3 segments (min, hour, dom) cannot have letters
121
+ if (i < 3 && /[A-Za-z]/.test(part)) {
122
+ return { valid: false, text: `${type} cannot contain letters.` };
123
+ }
124
+ // Last 2 segments can only have specific valid keywords
125
+ if (/[A-Za-z]/.test(part)) {
126
+ const words = part.match(/[A-Za-z]+/g) || [];
127
+ const validWords = i === 3
128
+ ? ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"]
129
+ : ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"];
130
+ for (const word of words) {
131
+ if (!validWords.includes(word.toUpperCase())) {
132
+ return { valid: false, text: `"${word}" is not a valid ${type}.` };
133
+ }
134
+ }
135
+ }
136
+ const numbers = part.match(/\d+/g);
137
+ if (numbers) {
138
+ for (const numStr of numbers) {
139
+ const num = parseInt(numStr, 10);
140
+ if (num < bound.min || num > bound.max) {
141
+ return {
142
+ valid: false,
143
+ text: `${type} values must be between ${bound.min} and ${bound.max}.`,
144
+ };
145
+ }
146
+ }
147
+ }
148
+ }
149
+ const [min, hour, dom, mon, dow] = parts;
150
+ let desc = "Runs ";
151
+ if (min === "*")
152
+ desc += "every minute";
153
+ else if (min.startsWith("*/"))
154
+ desc += `every ${min.substring(2)} minutes`;
155
+ else
156
+ desc += `at minute ${min}`;
157
+ if (hour !== "*") {
158
+ if (hour.startsWith("*/"))
159
+ desc += `, past every ${hour.substring(2)} hours`;
160
+ else
161
+ desc += `, past hour ${hour}`;
162
+ }
163
+ if (dom !== "*") {
164
+ if (dom.startsWith("*/"))
165
+ desc += `, every ${dom.substring(2)} days`;
166
+ else
167
+ desc += `, on day ${dom} of the month`;
168
+ }
169
+ if (mon !== "*") {
170
+ if (mon.startsWith("*/"))
171
+ desc += `, every ${mon.substring(2)} months`;
172
+ else
173
+ desc += `, in month ${mon}`;
174
+ }
175
+ if (dow !== "*") {
176
+ const days = [
177
+ "Sunday",
178
+ "Monday",
179
+ "Tuesday",
180
+ "Wednesday",
181
+ "Thursday",
182
+ "Friday",
183
+ "Saturday",
184
+ "Sunday",
185
+ ];
186
+ let dayStr = dow;
187
+ if (dow.length === 1 && /[0-7]/.test(dow)) {
188
+ dayStr = days[parseInt(dow, 10)];
189
+ }
190
+ else if (dow.includes("-") && /[0-7]-[0-7]/.test(dow)) {
191
+ dayStr = dow
192
+ .split("-")
193
+ .map((d) => days[parseInt(d, 10)])
194
+ .join(" through ");
195
+ }
196
+ desc += `, on ${dayStr}`;
197
+ }
198
+ return { valid: true, text: desc + "." };
199
+ }
200
+ _generateOutput(silent = false) {
201
+ let output = "";
202
+ this._customCronError = "";
203
+ this._customCronText = "";
204
+ this._internals.setValidity({});
205
+ if (this._frequency === "custom") {
206
+ const analysis = this._translateCron(this._customCron);
207
+ if (!analysis.valid) {
208
+ this._customCronError = analysis.text;
209
+ this._internals.setValidity({ customError: true }, analysis.text);
210
+ }
211
+ else {
212
+ this._customCronText = analysis.text;
213
+ }
214
+ output = this._customCron;
215
+ }
216
+ else if (this._frequency === "one-off") {
217
+ output = `${this._date}T${this._time}`;
218
+ }
219
+ else {
220
+ const [hh, mm] = this._time.split(":");
221
+ const minute = mm ? parseInt(mm, 10).toString() : "0";
222
+ const hour = hh ? parseInt(hh, 10).toString() : "0";
223
+ switch (this._frequency) {
224
+ case "daily":
225
+ output = `${minute} ${hour} * * *`;
226
+ break;
227
+ case "weekly":
228
+ const safeDays = this._days || "1";
229
+ output = `${minute} ${hour} * * ${safeDays}`;
230
+ break;
231
+ case "monthly":
232
+ output = `${minute} ${hour} ${this._monthDay} * *`;
233
+ break;
234
+ }
235
+ }
236
+ this._lastGeneratedOutput = output;
237
+ this.value = output;
238
+ this._internals.setFormValue(output);
239
+ // Only dispatch if the user actually clicked/typed something
240
+ if (!silent) {
241
+ this.dispatchEvent(new Event("change", { bubbles: true, composed: true }));
242
+ }
243
+ }
244
+ _handleCustomCronInput(e) {
245
+ const inputEl = e.target;
246
+ const sanitized = inputEl.value.replace(/[^0-9A-Za-z\s\*\/\-\,]/g, "");
247
+ if (inputEl.value !== sanitized) {
248
+ inputEl.value = sanitized;
249
+ }
250
+ this._customCron = sanitized;
251
+ this._generateOutput();
252
+ }
253
+ _handleFrequencyChange(e) {
254
+ this._frequency = e.target.value;
255
+ this._generateOutput();
256
+ }
257
+ checkValidity() {
258
+ return this._internals.checkValidity();
259
+ }
260
+ reportValidity() {
261
+ return this._internals.reportValidity();
262
+ }
263
+ formResetCallback() {
264
+ this.value = this._defaultValue;
265
+ this._frequency = "weekly";
266
+ this._generateOutput();
267
+ }
268
+ render() {
269
+ const frequencyOptions = [
270
+ { label: "One-Off Execution", value: "one-off" },
271
+ { label: "Daily", value: "daily" },
272
+ { label: "Weekly", value: "weekly" },
273
+ { label: "Monthly", value: "monthly" },
274
+ { label: "Custom Cron", value: "custom" },
275
+ ];
276
+ const monthDayOptions = Array.from({ length: 31 }, (_, i) => ({
277
+ label: `${i + 1}${i === 0 ? "st" : i === 1 ? "nd" : i === 2 ? "rd" : "th"}`,
278
+ value: String(i + 1),
279
+ }));
280
+ // Calculate which segment the user is currently typing in
281
+ const activeSegmentIndex = Math.min(this._customCron.trimStart().split(/\s+/).length - 1, 4);
282
+ return html `
283
+ <div class="builder-grid">
284
+ <div class="row">
285
+ <st-select
286
+ label="Schedule Type"
287
+ .options=${frequencyOptions}
288
+ .value=${this._frequency}
289
+ @change=${this._handleFrequencyChange}
290
+ ></st-select>
291
+ </div>
292
+
293
+ ${this._frequency === "weekly"
294
+ ? html `
295
+ <div class="row">
296
+ <label>Run on days</label>
297
+ <st-toggle-group
298
+ multiple
299
+ .value=${this._days}
300
+ @change=${(e) => {
301
+ this._days = e.target.value;
302
+ this._generateOutput();
303
+ }}
304
+ >
305
+ <st-toggle-button value="1">Mon</st-toggle-button>
306
+ <st-toggle-button value="2">Tue</st-toggle-button>
307
+ <st-toggle-button value="3">Wed</st-toggle-button>
308
+ <st-toggle-button value="4">Thu</st-toggle-button>
309
+ <st-toggle-button value="5">Fri</st-toggle-button>
310
+ <st-toggle-button value="6">Sat</st-toggle-button>
311
+ <st-toggle-button value="0">Sun</st-toggle-button>
312
+ </st-toggle-group>
313
+ </div>
314
+ `
315
+ : ""}
316
+ ${this._frequency === "monthly"
317
+ ? html `
318
+ <div class="row">
319
+ <st-select
320
+ label="Run on day of month"
321
+ .options=${monthDayOptions}
322
+ .value=${this._monthDay}
323
+ @change=${(e) => {
324
+ this._monthDay = e.target.value;
325
+ this._generateOutput();
326
+ }}
327
+ ></st-select>
328
+ </div>
329
+ `
330
+ : ""}
331
+ ${this._frequency === "one-off"
332
+ ? html `
333
+ <div class="row">
334
+ <label>Execution Date</label>
335
+ <st-calendar
336
+ .value=${this._date}
337
+ @change=${(e) => {
338
+ this._date = e.target.value;
339
+ this._generateOutput();
340
+ }}
341
+ ></st-calendar>
342
+ </div>
343
+ `
344
+ : ""}
345
+ ${this._frequency === "custom"
346
+ ? html `
347
+ <div class="row">
348
+ <st-input
349
+ label="Raw Cron Expression"
350
+ placeholder="*/15 * * * *"
351
+ .value=${this._customCron}
352
+ .error=${this._customCronError}
353
+ ?invalid=${!!this._customCronError}
354
+ @input=${this._handleCustomCronInput}
355
+ ></st-input>
356
+ <div class="cron-segments" aria-hidden="true">
357
+ ${["Minute", "Hour", "Day", "Month", "Weekday"].map((label, i) => html `
358
+ <div class="segment-badge ${activeSegmentIndex === i ? "active" : ""}">
359
+ ${label}
360
+ </div>
361
+ `)}
362
+ </div>
363
+
364
+ ${this._customCronText && !this._customCronError
365
+ ? html `
366
+ <div class="helper-text success-text">
367
+ <strong>Schedule:</strong> ${this._customCronText}
368
+ </div>
369
+ `
370
+ : ""}
371
+ </div>
372
+ `
373
+ : ""}
374
+ ${this._frequency !== "custom"
375
+ ? html `
376
+ <div class="row">
377
+ <st-time-picker
378
+ label="Execution Time"
379
+ .value=${this._time}
380
+ @change=${(e) => {
381
+ this._time = e.target.value;
382
+ this._generateOutput();
383
+ }}
384
+ ></st-time-picker>
385
+ </div>
386
+ `
387
+ : ""}
388
+
389
+ <div class="output-preview">
390
+ <div class="helper-text">Generated Payload</div>
391
+ <code>${this.value}</code>
392
+ </div>
393
+ </div>
394
+ `;
395
+ }
396
+ };
397
+ StCronBuilder.formAssociated = true;
398
+ StCronBuilder.styles = [
399
+ resetStyles,
400
+ css `
401
+ :host {
402
+ display: block;
403
+ background: var(--st-color-surface);
404
+ border: 1px solid var(--st-color-border);
405
+ border-radius: var(--st-radius-lg);
406
+ padding: var(--st-spacing-lg);
407
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
408
+ }
409
+
410
+ .builder-grid {
411
+ display: flex;
412
+ flex-direction: column;
413
+ gap: var(--st-spacing-lg);
414
+ }
415
+
416
+ .row {
417
+ display: flex;
418
+ flex-direction: column;
419
+ gap: var(--st-spacing-xs);
420
+ }
421
+
422
+ label {
423
+ font-size: var(--st-font-size-sm);
424
+ font-weight: 600;
425
+ color: var(--st-color-text);
426
+ }
427
+
428
+ .helper-text {
429
+ font-size: var(--st-font-size-xs);
430
+ color: var(--st-color-text-muted);
431
+ margin-top: 4px;
432
+ }
433
+
434
+ .cron-segments {
435
+ display: flex;
436
+ gap: 4px;
437
+ margin-top: var(--st-spacing-xs);
438
+ margin-bottom: var(--st-spacing-xs);
439
+ }
440
+
441
+ .segment-badge {
442
+ flex: 1;
443
+ text-align: center;
444
+ font-size: 11px;
445
+ padding: 4px;
446
+ background: var(--st-color-surface-muted, #f1f5f9);
447
+ border-radius: var(--st-radius-sm);
448
+ color: var(--st-color-text-muted);
449
+ border: 1px solid var(--st-color-border);
450
+ transition: all 0.2s;
451
+ }
452
+
453
+ .segment-badge.active {
454
+ background: var(--st-color-primary, #eff6ff);
455
+ color: var(--st-color-surface);
456
+ border-color: var(--st-color-primary);
457
+ font-weight: 600;
458
+ }
459
+
460
+ .success-text {
461
+ color: var(--st-color-success, #16a34a);
462
+ }
463
+
464
+ .error-text {
465
+ color: var(--st-color-danger, #dc2626);
466
+ font-weight: 500;
467
+ }
468
+
469
+ .output-preview {
470
+ margin-top: var(--st-spacing-md);
471
+ padding: var(--st-spacing-md);
472
+ background: var(--st-color-surface-muted, #f8fafc);
473
+ border-radius: var(--st-radius-md);
474
+ border: 1px dashed var(--st-color-border);
475
+ }
476
+
477
+ .output-preview code {
478
+ font-family: monospace;
479
+ color: var(--st-color-primary);
480
+ font-weight: bold;
481
+ font-size: var(--st-font-size-lg);
482
+ }
483
+ `,
484
+ ];
485
+ __decorate([
486
+ property({ type: String, reflect: true })
487
+ ], StCronBuilder.prototype, "name", void 0);
488
+ __decorate([
489
+ property({ type: String })
490
+ ], StCronBuilder.prototype, "value", void 0);
491
+ __decorate([
492
+ property({ type: Boolean, reflect: true })
493
+ ], StCronBuilder.prototype, "required", void 0);
494
+ __decorate([
495
+ state()
496
+ ], StCronBuilder.prototype, "_frequency", void 0);
497
+ __decorate([
498
+ state()
499
+ ], StCronBuilder.prototype, "_time", void 0);
500
+ __decorate([
501
+ state()
502
+ ], StCronBuilder.prototype, "_days", void 0);
503
+ __decorate([
504
+ state()
505
+ ], StCronBuilder.prototype, "_monthDay", void 0);
506
+ __decorate([
507
+ state()
508
+ ], StCronBuilder.prototype, "_date", void 0);
509
+ __decorate([
510
+ state()
511
+ ], StCronBuilder.prototype, "_customCron", void 0);
512
+ __decorate([
513
+ state()
514
+ ], StCronBuilder.prototype, "_customCronError", void 0);
515
+ __decorate([
516
+ state()
517
+ ], StCronBuilder.prototype, "_customCronText", void 0);
518
+ StCronBuilder = __decorate([
519
+ customElement("st-cron-builder")
520
+ ], StCronBuilder);
521
+ export { StCronBuilder };
522
+ //# sourceMappingURL=cron-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-builder.js","sourceRoot":"","sources":["../../../src/components/cron-builder/cron-builder.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAC,UAAU,EAAE,IAAI,EAAE,GAAG,EAAiB,MAAM,KAAK,CAAC;AAC1D,OAAO,EAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAC,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAGxC,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,UAAU;IAqB3C;QACE,KAAK,EAAE,CAAC;QAlB+B,SAAI,GAAG,EAAE,CAAC;QACzB,UAAK,GAAG,EAAE,CAAC;QACK,aAAQ,GAAG,KAAK,CAAC;QAE1C,eAAU,GAAG,QAAQ,CAAC;QACtB,UAAK,GAAG,OAAO,CAAC;QAChB,UAAK,GAAG,OAAO,CAAC;QAChB,cAAS,GAAG,GAAG,CAAC;QAChB,UAAK,GAAG,EAAE,CAAC;QAEX,gBAAW,GAAG,WAAW,CAAC;QAC1B,qBAAgB,GAAG,EAAE,CAAC;QACtB,oBAAe,GAAG,EAAE,CAAC;QAE9B,kBAAa,GAAG,EAAE,CAAC;QACnB,yBAAoB,GAAG,EAAE,CAAC;QAIhC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAEzC,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;IAC7F,CAAC;IA0FQ,UAAU,CAAC,iBAAiC;QACnD,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAEpC,2FAA2F;QAC3F,IAAI,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC7F,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,gDAAgD;QAC9E,CAAC;IACH,CAAC;IAEQ,YAAY,CAAC,iBAAiC;QACrD,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;QAEtC,uFAAuF;QACvF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC;IAClC,CAAC;IAEO,mBAAmB,CAAC,GAAW;QACrC,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,oBAAoB;QACpB,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAC5B,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;YACrB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;YAC3B,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;YACvB,OAAO;QACT,CAAC;QAED,iDAAiD;QACjD,6EAA6E;QAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;YAC3B,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;YACvB,OAAO;QACT,CAAC;QAED,yCAAyC;QACzC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;QAEzC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;YAEhE,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;gBAC9C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;gBAC1B,OAAO;YACT,CAAC;YACD,2FAA2F;iBACtF,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpE,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;gBAC3B,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;gBACjB,OAAO;YACT,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;gBAC3D,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;gBAC5B,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;gBACrB,OAAO;YACT,CAAC;QACH,CAAC;QAED,qEAAqE;QACrE,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;IACzB,CAAC;IAEO,cAAc,CAAC,IAAY;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,gEAAgE,KAAK,CAAC,MAAM,IAAI;aACvF,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;QAEzE,MAAM,MAAM,GAAG;YACb,EAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAC,EAAE,SAAS;YAC5B,EAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAC,EAAE,OAAO;YAC1B,EAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAC,EAAE,MAAM;YACzB,EAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAC,EAAE,QAAQ;YAC3B,EAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAC,EAAE,MAAM;SACzB,CAAC;QAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAExB,uDAAuD;YACvD,IAAI,wCAAwC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxD,OAAO,EAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,yBAAyB,IAAI,WAAW,EAAC,CAAC;YACxE,CAAC;YAED,wDAAwD;YACxD,IAAI,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,OAAO,EAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,0BAA0B,EAAC,CAAC;YACjE,CAAC;YAED,wDAAwD;YACxD,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;gBAC7C,MAAM,UAAU,GACd,CAAC,KAAK,CAAC;oBACL,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;oBACtF,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBAExD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;wBAC7C,OAAO,EAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,IAAI,oBAAoB,IAAI,GAAG,EAAC,CAAC;oBACnE,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,OAAO,EAAE,CAAC;gBACZ,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC7B,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBACjC,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;wBACvC,OAAO;4BACL,KAAK,EAAE,KAAK;4BACZ,IAAI,EAAE,GAAG,IAAI,2BAA2B,KAAK,CAAC,GAAG,QAAQ,KAAK,CAAC,GAAG,GAAG;yBACtE,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;QACzC,IAAI,IAAI,GAAG,OAAO,CAAC;QAEnB,IAAI,GAAG,KAAK,GAAG;YAAE,IAAI,IAAI,cAAc,CAAC;aACnC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,IAAI,IAAI,SAAS,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;;YACtE,IAAI,IAAI,aAAa,GAAG,EAAE,CAAC;QAEhC,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,IAAI,IAAI,gBAAgB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;;gBACxE,IAAI,IAAI,eAAe,IAAI,EAAE,CAAC;QACrC,CAAC;QAED,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YAChB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,IAAI,IAAI,WAAW,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;;gBAChE,IAAI,IAAI,YAAY,GAAG,eAAe,CAAC;QAC9C,CAAC;QAED,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YAChB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,IAAI,IAAI,WAAW,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;;gBAClE,IAAI,IAAI,cAAc,GAAG,EAAE,CAAC;QACnC,CAAC;QAED,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG;gBACX,QAAQ;gBACR,QAAQ;gBACR,SAAS;gBACT,WAAW;gBACX,UAAU;gBACV,QAAQ;gBACR,UAAU;gBACV,QAAQ;aACT,CAAC;YACF,IAAI,MAAM,GAAG,GAAG,CAAC;YAEjB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1C,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;YACnC,CAAC;iBAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxD,MAAM,GAAG,GAAG;qBACT,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;qBACjC,IAAI,CAAC,WAAW,CAAC,CAAC;YACvB,CAAC;YACD,IAAI,IAAI,QAAQ,MAAM,EAAE,CAAC;QAC3B,CAAC;QAED,OAAO,EAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,GAAG,EAAC,CAAC;IACzC,CAAC;IAEO,eAAe,CAAC,MAAM,GAAG,KAAK;QACpC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAEhC,IAAI,IAAI,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAEvD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACpB,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC;gBACtC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAC,WAAW,EAAE,IAAI,EAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC;YACvC,CAAC;YACD,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;QAC5B,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YACtD,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAEpD,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;gBACxB,KAAK,OAAO;oBACV,MAAM,GAAG,GAAG,MAAM,IAAI,IAAI,QAAQ,CAAC;oBACnC,MAAM;gBACR,KAAK,QAAQ;oBACX,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;oBACnC,MAAM,GAAG,GAAG,MAAM,IAAI,IAAI,QAAQ,QAAQ,EAAE,CAAC;oBAC7C,MAAM;gBACR,KAAK,SAAS;oBACZ,MAAM,GAAG,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,MAAM,CAAC;oBACnD,MAAM;YACV,CAAC;QACH,CAAC;QAED,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC;QACnC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;QACpB,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAErC,6DAA6D;QAC7D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,CAAM;QACnC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;QACzB,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;QAEvE,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC7B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEO,sBAAsB,CAAC,CAAM;QACnC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QACjC,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEM,aAAa;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;IACzC,CAAC;IACM,cAAc;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;IAC1C,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;QAC3B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,MAAM;QACJ,MAAM,gBAAgB,GAAG;YACvB,EAAC,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAC;YAC9C,EAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAC;YAChC,EAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAC;YAClC,EAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAC;YACpC,EAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAC;SACxC,CAAC;QAEF,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,EAAE,EAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1D,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;YAC3E,KAAK,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;SACrB,CAAC,CAAC,CAAC;QAEJ,0DAA0D;QAC1D,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7F,OAAO,IAAI,CAAA;;;;;uBAKQ,gBAAgB;qBAClB,IAAI,CAAC,UAAU;sBACd,IAAI,CAAC,sBAAsB;;;;UAIvC,IAAI,CAAC,UAAU,KAAK,QAAQ;YAC5B,CAAC,CAAC,IAAI,CAAA;;;;;2BAKW,IAAI,CAAC,KAAK;4BACT,CAAC,CAAM,EAAE,EAAE;gBACnB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,CAAC;;;;;;;;;;;aAWN;YACH,CAAC,CAAC,EAAE;UACJ,IAAI,CAAC,UAAU,KAAK,SAAS;YAC7B,CAAC,CAAC,IAAI,CAAA;;;;6BAIa,eAAe;2BACjB,IAAI,CAAC,SAAS;4BACb,CAAC,CAAM,EAAE,EAAE;gBACnB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAChC,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,CAAC;;;aAGN;YACH,CAAC,CAAC,EAAE;UACJ,IAAI,CAAC,UAAU,KAAK,SAAS;YAC7B,CAAC,CAAC,IAAI,CAAA;;;;2BAIW,IAAI,CAAC,KAAK;4BACT,CAAC,CAAM,EAAE,EAAE;gBACnB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,CAAC;;;aAGN;YACH,CAAC,CAAC,EAAE;UACJ,IAAI,CAAC,UAAU,KAAK,QAAQ;YAC5B,CAAC,CAAC,IAAI,CAAA;;;;;2BAKW,IAAI,CAAC,WAAW;2BAChB,IAAI,CAAC,gBAAgB;6BACnB,CAAC,CAAC,IAAI,CAAC,gBAAgB;2BACzB,IAAI,CAAC,sBAAsB;;;oBAGlC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,GAAG,CACjD,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAA;kDACY,kBAAkB,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;0BAChE,KAAK;;qBAEV,CACF;;;kBAGD,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,gBAAgB;gBAC9C,CAAC,CAAC,IAAI,CAAA;;qDAE6B,IAAI,CAAC,eAAe;;qBAEpD;gBACH,CAAC,CAAC,EAAE;;aAET;YACH,CAAC,CAAC,EAAE;UACJ,IAAI,CAAC,UAAU,KAAK,QAAQ;YAC5B,CAAC,CAAC,IAAI,CAAA;;;;2BAIW,IAAI,CAAC,KAAK;4BACT,CAAC,CAAM,EAAE,EAAE;gBACnB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,CAAC;;;aAGN;YACH,CAAC,CAAC,EAAE;;;;kBAII,IAAI,CAAC,KAAK;;;KAGvB,CAAC;IACJ,CAAC;CACF,CAAA;AApgBQ,4BAAc,GAAG,IAAI,AAAP,CAAQ;AA6BtB,oBAAM,GAAG;IACd,WAAW;IACX,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAmFF;CACF,AAtFY,CAsFX;AAhHuC;IAAxC,QAAQ,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC;2CAAW;AACzB;IAAzB,QAAQ,CAAC,EAAC,IAAI,EAAE,MAAM,EAAC,CAAC;4CAAY;AACK;IAAzC,QAAQ,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC;+CAAkB;AAE1C;IAAhB,KAAK,EAAE;iDAA+B;AACtB;IAAhB,KAAK,EAAE;4CAAyB;AAChB;IAAhB,KAAK,EAAE;4CAAyB;AAChB;IAAhB,KAAK,EAAE;gDAAyB;AAChB;IAAhB,KAAK,EAAE;4CAAoB;AAEX;IAAhB,KAAK,EAAE;kDAAmC;AAC1B;IAAhB,KAAK,EAAE;uDAA+B;AACtB;IAAhB,KAAK,EAAE;sDAA8B;AAhB3B,aAAa;IADzB,aAAa,CAAC,iBAAiB,CAAC;GACpB,aAAa,CAqgBzB"}
@@ -18,6 +18,7 @@ export declare class StInput extends LitElement {
18
18
  placeholder: string;
19
19
  type: InputType;
20
20
  helpText: string;
21
+ error: string;
21
22
  autocomplete?: string;
22
23
  required: boolean;
23
24
  minlength?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../src/components/input/input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAa,cAAc,EAAC,MAAM,KAAK,CAAC;AAK1D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEpF,qBACa,OAAQ,SAAQ,UAAU;IACrC,MAAM,CAAC,cAAc,UAAQ;IAC7B,MAAM,CAAC,iBAAiB;;;;;;;MAA2D;IACnF,OAAO,CAAC,UAAU,CAAmB;IAErB,OAAO,CAAC,QAAQ,CAAoB;IACX,IAAI,SAAM;IACzB,KAAK,SAAM;IACX,KAAK,SAAM;IACX,WAAW,SAAM;IACjB,IAAI,EAAE,SAAS,CAAU;IACf,QAAQ,SAAM;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IAER,QAAQ,UAAS;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IAED,QAAQ,UAAS;IACjB,OAAO,UAAS;IAChB,QAAQ,UAAS;IAE3D,cAWC;IAED,MAAM,CAAC,MAAM,4BAmGX;IAEO,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,QAOvD;IAED,OAAO,CAAC,aAAa;IASrB,iBAAiB,SAIhB;IAED,aAAa,YAEZ;IAED,cAAc,YAEb;IAED,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,aAAa;IAIvB,MAAM,yCA4CH;CACF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,OAAO,CAAC;KACrB;CACF"}
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../src/components/input/input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAa,cAAc,EAAC,MAAM,KAAK,CAAC;AAK1D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEpF,qBACa,OAAQ,SAAQ,UAAU;IACrC,MAAM,CAAC,cAAc,UAAQ;IAC7B,MAAM,CAAC,iBAAiB;;;;;;;MAA2D;IACnF,OAAO,CAAC,UAAU,CAAmB;IAErB,OAAO,CAAC,QAAQ,CAAoB;IACX,IAAI,SAAM;IACzB,KAAK,SAAM;IACX,KAAK,SAAM;IACX,WAAW,SAAM;IACjB,IAAI,EAAE,SAAS,CAAU;IACf,QAAQ,SAAM;IACxB,KAAK,SAAM;IACT,YAAY,CAAC,EAAE,MAAM,CAAC;IAER,QAAQ,UAAS;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IAED,QAAQ,UAAS;IACjB,OAAO,UAAS;IAChB,QAAQ,UAAS;IAE3D,cAWC;IAED,MAAM,CAAC,MAAM,4BA2GX;IAEO,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,IAAI,CAAC,QAUvD;IAED,OAAO,CAAC,aAAa;IAoBrB,iBAAiB,SAIhB;IAED,aAAa,YAEZ;IAED,cAAc,YAEb;IAED,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,aAAa;IAIrB,MAAM,yCA6CL;CACF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,OAAO,CAAC;KACrB;CACF"}
@@ -17,13 +17,14 @@ let StInput = class StInput extends LitElement {
17
17
  this.placeholder = "";
18
18
  this.type = "text";
19
19
  this.helpText = "";
20
+ this.error = "";
20
21
  this.required = false;
21
22
  this.disabled = false;
22
23
  this.invalid = false;
23
24
  this.readonly = false;
24
25
  this._internals = this.attachInternals();
25
26
  this.addEventListener("focusout", () => {
26
- this.invalid = !this._inputEl.validity.valid;
27
+ this.invalid = !!this.error || !this._inputEl.validity.valid;
27
28
  });
28
29
  this.addEventListener("invalid", () => {
29
30
  this.invalid = true;
@@ -34,12 +35,22 @@ let StInput = class StInput extends LitElement {
34
35
  if (changedProperties.has("value")) {
35
36
  this._internals.setFormValue(this.value);
36
37
  }
37
- this._syncValidity();
38
+ if (changedProperties.has("value") || changedProperties.has("error") || changedProperties.has("required")) {
39
+ this._syncValidity();
40
+ }
38
41
  }
39
42
  _syncValidity() {
40
43
  if (!this._inputEl)
41
44
  return;
45
+ if (this.error) {
46
+ this._internals.setValidity({ customError: true }, this.error, this._inputEl);
47
+ this.invalid = true;
48
+ return;
49
+ }
42
50
  this._internals.setValidity(this._inputEl.validity, this._inputEl.validationMessage, this._inputEl);
51
+ if (this.invalid && this._inputEl.validity.valid) {
52
+ this.invalid = false;
53
+ }
43
54
  }
44
55
  formResetCallback() {
45
56
  this.value = "";
@@ -55,7 +66,7 @@ let StInput = class StInput extends LitElement {
55
66
  _handleInput(e) {
56
67
  const target = e.target;
57
68
  this.value = target.value;
58
- if (this.invalid && target.validity.valid) {
69
+ if (this.invalid && target.validity.valid && !this.error) {
59
70
  this.invalid = false;
60
71
  }
61
72
  this.dispatchEvent(new Event("input", { bubbles: true, composed: true }));
@@ -64,8 +75,7 @@ let StInput = class StInput extends LitElement {
64
75
  this.dispatchEvent(new Event("change", { bubbles: true, composed: true }));
65
76
  }
66
77
  render() {
67
- const helpTextId = this.helpText ? "help-text" : undefined;
68
- // Security: Prevent OS/Extensions from logging sensitive data via spellcheck
78
+ const descriptionId = this.error ? "error-text" : (this.helpText ? "help-text" : undefined);
69
79
  const isSensitive = this.type === "password" || this.type === "email";
70
80
  const safeSpellcheck = isSensitive ? "false" : undefined;
71
81
  const safeAutocapitalize = isSensitive ? "none" : undefined;
@@ -92,7 +102,7 @@ let StInput = class StInput extends LitElement {
92
102
  spellcheck=${ifDefined(safeSpellcheck)}
93
103
  autocapitalize=${ifDefined(safeAutocapitalize)}
94
104
  aria-invalid=${this.invalid ? "true" : "false"}
95
- aria-describedby=${ifDefined(helpTextId)}
105
+ aria-describedby=${ifDefined(descriptionId)}
96
106
  @input=${this._handleInput}
97
107
  @change=${this._handleChange}
98
108
  />
@@ -100,9 +110,11 @@ let StInput = class StInput extends LitElement {
100
110
  <slot name="suffix"></slot>
101
111
  </div>
102
112
 
103
- ${this.helpText
104
- ? html `<div id="help-text" class="help-text">${this.helpText}</div>`
105
- : ""}
113
+ ${this.error
114
+ ? html `<div id="error-text" class="error-text">${this.error}</div>`
115
+ : this.helpText
116
+ ? html `<div id="help-text" class="help-text">${this.helpText}</div>`
117
+ : ""}
106
118
  </div>
107
119
  `;
108
120
  }
@@ -182,16 +194,24 @@ StInput.styles = [
182
194
  margin: 0;
183
195
  }
184
196
 
197
+ /* 🚀 NEW: Explicit error text styling */
198
+ .error-text {
199
+ font-size: var(--st-font-size-xs);
200
+ color: var(--st-color-error, #dc2626);
201
+ margin: 0;
202
+ font-weight: 500;
203
+ }
204
+
185
205
  :host([invalid]) .input-wrapper {
186
- border-color: var(--st-color-error);
206
+ border-color: var(--st-color-error, #dc2626);
187
207
  }
188
208
 
189
209
  :host([invalid]) .input-wrapper:focus-within {
190
- box-shadow: 0 0 0 1px var(--st-color-error);
210
+ box-shadow: 0 0 0 1px var(--st-color-error, #dc2626);
191
211
  }
192
212
 
193
213
  :host([invalid]) .help-text {
194
- color: var(--st-color-error);
214
+ color: var(--st-color-error, #dc2626);
195
215
  }
196
216
 
197
217
  :host([disabled]) .input-wrapper {
@@ -230,6 +250,9 @@ __decorate([
230
250
  __decorate([
231
251
  property({ attribute: "help-text" })
232
252
  ], StInput.prototype, "helpText", void 0);
253
+ __decorate([
254
+ property({ type: String })
255
+ ], StInput.prototype, "error", void 0);
233
256
  __decorate([
234
257
  property({ type: String })
235
258
  ], StInput.prototype, "autocomplete", void 0);