@aurodesignsystem-dev/auro-formkit 0.0.0-pr1489.5 → 0.0.0-pr1489.6

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 (64) hide show
  1. package/components/checkbox/demo/customize.min.js +249 -125
  2. package/components/checkbox/demo/getting-started.min.js +249 -125
  3. package/components/checkbox/demo/index.min.js +249 -125
  4. package/components/checkbox/demo/styles.min.css +1 -1
  5. package/components/checkbox/dist/index.js +249 -125
  6. package/components/checkbox/dist/registered.js +249 -125
  7. package/components/combobox/demo/customize.min.js +502 -254
  8. package/components/combobox/demo/getting-started.min.js +502 -254
  9. package/components/combobox/demo/index.min.js +502 -254
  10. package/components/combobox/demo/styles.min.css +1 -1
  11. package/components/combobox/dist/index.js +502 -254
  12. package/components/combobox/dist/registered.js +502 -254
  13. package/components/counter/demo/customize.min.js +250 -126
  14. package/components/counter/demo/index.min.js +250 -126
  15. package/components/counter/demo/styles.min.css +1 -1
  16. package/components/counter/dist/index.js +249 -125
  17. package/components/counter/dist/registered.js +249 -125
  18. package/components/datepicker/demo/accessibility.md +9 -6
  19. package/components/datepicker/demo/api.md +1 -1
  20. package/components/datepicker/demo/customize.min.js +1544 -527
  21. package/components/datepicker/demo/index.md +6 -4
  22. package/components/datepicker/demo/index.min.js +1560 -532
  23. package/components/datepicker/demo/keyboard-behavior.md +15 -15
  24. package/components/datepicker/demo/styles.min.css +1 -1
  25. package/components/datepicker/demo/voiceover.md +5 -3
  26. package/components/datepicker/demo/why-datepicker.md +2 -2
  27. package/components/datepicker/dist/index.js +1536 -519
  28. package/components/datepicker/dist/registered.js +1536 -519
  29. package/components/datepicker/dist/src/auro-calendar-cell.d.ts +50 -15
  30. package/components/datepicker/dist/src/auro-calendar-month.d.ts +9 -0
  31. package/components/datepicker/dist/src/auro-calendar.d.ts +161 -8
  32. package/components/datepicker/dist/src/auro-datepicker.d.ts +5 -7
  33. package/components/dropdown/demo/customize.min.js +1 -1
  34. package/components/dropdown/demo/getting-started.min.js +1 -1
  35. package/components/dropdown/demo/index.min.js +1 -1
  36. package/components/dropdown/demo/styles.min.css +1 -1
  37. package/components/dropdown/dist/index.js +1 -1
  38. package/components/dropdown/dist/registered.js +1 -1
  39. package/components/form/demo/customize.min.js +3263 -1378
  40. package/components/form/demo/getting-started.min.js +3263 -1378
  41. package/components/form/demo/index.min.js +3263 -1378
  42. package/components/form/demo/registerDemoDeps.min.js +3263 -1378
  43. package/components/form/demo/styles.min.css +1 -1
  44. package/components/input/demo/customize.min.js +249 -125
  45. package/components/input/demo/getting-started.min.js +249 -125
  46. package/components/input/demo/index.min.js +249 -125
  47. package/components/input/demo/styles.min.css +1 -1
  48. package/components/input/dist/index.js +249 -125
  49. package/components/input/dist/registered.js +249 -125
  50. package/components/menu/demo/styles.min.css +1 -1
  51. package/components/radio/demo/customize.min.js +249 -125
  52. package/components/radio/demo/getting-started.min.js +249 -125
  53. package/components/radio/demo/index.min.js +249 -125
  54. package/components/radio/demo/styles.min.css +1 -1
  55. package/components/radio/dist/index.js +249 -125
  56. package/components/radio/dist/registered.js +249 -125
  57. package/components/select/demo/customize.min.js +250 -126
  58. package/components/select/demo/getting-started.min.js +250 -126
  59. package/components/select/demo/index.min.js +250 -126
  60. package/components/select/demo/styles.min.css +1 -1
  61. package/components/select/dist/index.js +250 -126
  62. package/components/select/dist/registered.js +250 -126
  63. package/custom-elements.json +1818 -1491
  64. package/package.json +8 -8
@@ -152,109 +152,236 @@ var shapeSizeCss$1 = i$6`.shape-classic-xl,.shape-classic-lg,.shape-classic-md,.
152
152
 
153
153
  var tokensCss$3 = i$6`:host(:not([ondark])),:host(:not([appearance=inverse])){--ds-auro-select-border-color: var(--ds-basic-color-border-bold, #585e67);--ds-auro-select-background-color: var(--ds-basic-color-surface-default, #ffffff);--ds-auro-select-label-text-color: var(--ds-basic-color-texticon-muted, #676767);--ds-auro-select-placeholder-text-color: var(--ds-basic-color-texticon-default, #2a2a2a);--ds-auro-select-text-color: var(--ds-basic-color-texticon-default, #2a2a2a);--ds-auro-select-error-icon-color: var(--ds-basic-color-status-error, #e31f26);--ds-auro-select-outline-color: transparent}:host([ondark]),:host([appearance=inverse]){--ds-auro-select-border-color: var(--ds-basic-color-border-inverse, #ffffff);--ds-auro-select-background-color: var(--ds-advanced-color-shared-background-inverse, rgba(255, 255, 255, 0.15));--ds-auro-select-label-text-color: var(--ds-basic-color-texticon-inverse-muted, #ccd2db);--ds-auro-select-placeholder-text-color: var(--ds-basic-color-texticon-inverse, #ffffff);--ds-auro-select-text-color: var(--ds-basic-color-texticon-inverse, #ffffff);--ds-auro-select-error-icon-color: var(--ds-advanced-color-state-error-inverse, #f9a4a8);--ds-auro-select-outline-color: transparent}`;
154
154
 
155
- class DateFormatter {
155
+ /**
156
+ * @description Splits a date string into its parts according to the provided format. Does NOT validate that the result is a real calendar date — use `parseDate` when validation is required.
157
+ * @param {string} dateStr - Date string to parse.
158
+ * @param {string} format - Date format to parse.
159
+ * @returns {{ month?: string, day?: string, year?: string }|undefined}
160
+ */
161
+ function getDateParts(dateStr, format) {
162
+ if (!dateStr) {
163
+ return undefined;
164
+ }
156
165
 
157
- constructor() {
166
+ const formatSeparatorMatch = format.match(/[/.-]/);
167
+ let valueParts;
168
+ let formatParts;
158
169
 
159
- /**
160
- * @description Parses a date string into its components.
161
- * @param {string} dateStr - Date string to parse.
162
- * @param {string} format - Date format to parse.
163
- * @returns {Object<key["month" | "day" | "year"]: number>|undefined}
164
- */
165
- this.parseDate = (dateStr, format = 'mm/dd/yyyy') => {
170
+ if (formatSeparatorMatch) {
171
+ const separator = formatSeparatorMatch[0];
172
+ valueParts = dateStr.split(separator);
173
+ formatParts = format.split(separator);
174
+ } else {
175
+ if (dateStr.match(/[/.-]/)) {
176
+ throw new Error(
177
+ "AuroDatepickerUtilities | parseDate: Date string has no separators",
178
+ );
179
+ }
166
180
 
167
- // Guard Clause: Date string is defined
168
- if (!dateStr) {
169
- return undefined;
170
- }
181
+ if (dateStr.length !== format.length) {
182
+ throw new Error(
183
+ "AuroDatepickerUtilities | parseDate: Date string and format length do not match",
184
+ );
185
+ }
171
186
 
172
- // Assume the separator is a "/" a defined in our code base
173
- const separator = '/';
187
+ valueParts = [dateStr];
188
+ formatParts = [format];
189
+ }
174
190
 
175
- // Get the parts of the date and format
176
- const valueParts = dateStr.split(separator);
177
- const formatParts = format.split(separator);
191
+ if (valueParts.length !== formatParts.length) {
192
+ throw new Error(
193
+ `AuroDatepickerUtilities | parseDate: Date string and format do not match : ${dateStr} vs ${format}`,
194
+ );
195
+ }
178
196
 
179
- // Check if the value and format have the correct number of parts
180
- if (valueParts.length !== formatParts.length) {
181
- throw new Error('AuroDatepickerUtilities | parseDate: Date string and format length do not match');
182
- }
197
+ const result = formatParts.reduce((acc, part, index) => {
198
+ const value = valueParts[index];
183
199
 
184
- // Holds the result to be returned
185
- const result = formatParts.reduce((acc, part, index) => {
186
- const value = valueParts[index];
200
+ if (/m/iu.test(part) && part.length === value.length) {
201
+ acc.month = value;
202
+ } else if (/d/iu.test(part) && part.length === value.length) {
203
+ acc.day = value;
204
+ } else if (/y/iu.test(part) && part.length === value.length) {
205
+ acc.year = value;
206
+ }
187
207
 
188
- if ((/m/iu).test(part)) {
189
- acc.month = value;
190
- } else if ((/d/iu).test(part)) {
191
- acc.day = value;
192
- } else if ((/y/iu).test(part)) {
193
- acc.year = value;
194
- }
208
+ return acc;
209
+ }, {});
195
210
 
196
- return acc;
197
- }, {});
211
+ if (!result.month && !result.day && !result.year) {
212
+ throw new Error(
213
+ "AuroDatepickerUtilities | parseDate: Unable to parse date string",
214
+ );
215
+ }
198
216
 
199
- // If we found all the parts, return the result
200
- if (result.month && result.year) {
201
- return result;
202
- }
217
+ return result;
218
+ }
203
219
 
204
- // Throw an error to let the dev know we were unable to parse the date string
205
- throw new Error('AuroDatepickerUtilities | parseDate: Unable to parse date string');
206
- };
220
+ function isCalendarDate(year, month, day) {
221
+ let yearNumber = Number(year);
222
+ const monthNumber = Number(month);
223
+ const dayNumber = Number(day);
207
224
 
208
- /**
209
- * Convert a date object to string format.
210
- * @param {Object} date - Date to convert to string.
211
- * @param {String} locale - Optional locale to use for the date string. Defaults to user's locale.
212
- * @returns {String} Returns the date as a string.
213
- */
214
- this.getDateAsString = (date, locale = undefined) => date.toLocaleDateString(locale, {
215
- year: "numeric",
216
- month: "2-digit",
217
- day: "2-digit",
218
- });
225
+ if (
226
+ !Number.isInteger(yearNumber) ||
227
+ !Number.isInteger(monthNumber) ||
228
+ !Number.isInteger(dayNumber)
229
+ ) {
230
+ return false;
231
+ }
219
232
 
220
- /**
221
- * Converts a date string to a North American date format.
222
- * @param {String} dateStr - Date to validate.
223
- * @param {String} format - Date format to validate against.
224
- * @returns {Boolean}
225
- */
226
- this.toNorthAmericanFormat = (dateStr, format) => {
233
+ // Handle 2-digit years by converting them to 4-digit years based on a cutoff. This allows for parsing of 2-digit year formats while still validating the resulting date.
234
+ if (yearNumber < 100 && yearNumber >= 50) {
235
+ yearNumber += 1900;
236
+ } else if (yearNumber < 50) {
237
+ yearNumber += 2000;
238
+ }
227
239
 
228
- if (format === 'mm/dd/yyyy') {
229
- return dateStr;
230
- }
240
+ const stringified = `${String(yearNumber).padStart(4, "0")}-${String(monthNumber).padStart(2, "0")}-${String(dayNumber).padStart(2, "0")}`;
241
+ const date = new Date(stringified.replace(/[.-]/g, "/"));
231
242
 
232
- const parsedDate = this.parseDate(dateStr, format);
243
+ return (
244
+ !Number.isNaN(date.getTime()) && toISOFormatString(date) === stringified
245
+ );
246
+ }
233
247
 
234
- if (!parsedDate) {
235
- throw new Error('AuroDatepickerUtilities | toNorthAmericanFormat: Unable to parse date string');
236
- }
248
+ /**
249
+ * @description Parses a date string into its components and validates that the result is a real calendar date. Use `getDateParts` instead when raw splitting without validation is needed (e.g. for in-progress input).
250
+ *
251
+ * Partial formats are supported: components absent from `format` default to `year → "0"`,
252
+ * `month → "01"`, `day → "01"` for calendar validation only. The returned object contains
253
+ * only the fields actually present in the format string — missing fields are never injected.
254
+ * @param {string} dateStr - Date string to parse.
255
+ * @param {string} format - Date format to parse.
256
+ * @returns {{ month?: string, day?: string, year?: string }|undefined}
257
+ * @throws {Error} Throws when the parsed result does not represent a valid calendar date.
258
+ */
259
+ function parseDate(dateStr, format = "mm/dd/yyyy") {
260
+ if (!dateStr || !format) {
261
+ return undefined;
262
+ }
263
+ const result = getDateParts(dateStr.trim(), format);
237
264
 
238
- const { month, day, year } = parsedDate;
265
+ if (!result) {
266
+ return undefined;
267
+ }
239
268
 
240
- const dateParts = [];
241
- if (month) {
242
- dateParts.push(month);
243
- }
269
+ const lowerFormat = format.toLowerCase();
270
+ const year = lowerFormat.includes("yy") ? result.year : "0";
271
+ const month = lowerFormat.includes("mm") ? result.month : "01";
272
+ const day = lowerFormat.includes("dd") ? result.day : "01";
244
273
 
245
- if (day) {
246
- dateParts.push(day);
247
- }
274
+ if (isCalendarDate(year, month, day)) {
275
+ return result;
276
+ }
248
277
 
249
- if (year) {
250
- dateParts.push(year);
251
- }
278
+ throw new Error(
279
+ `AuroDatepickerUtilities | parseDate: Date string is not a valid date ${JSON.stringify(result)} with format ${format}`,
280
+ );
281
+ }
252
282
 
253
- return dateParts.join('/');
254
- };
283
+ /**
284
+ * Convert a date object to string format.
285
+ * @param {Object} date - Date to convert to string.
286
+ * @param {String} locale - Optional locale to use for the date string. Defaults to user's locale.
287
+ * @returns {String} Returns the date as a string.
288
+ */
289
+ function getDateAsString(date, locale = undefined) {
290
+ return date.toLocaleDateString(locale, {
291
+ year: "numeric",
292
+ month: "2-digit",
293
+ day: "2-digit",
294
+ });
295
+ }
296
+
297
+ /**
298
+ * Converts a date string to a North American date format.
299
+ * @param {String} dateStr - Date to validate.
300
+ * @param {String} format - Date format to validate against.
301
+ * @returns {String}
302
+ */
303
+ function toNorthAmericanFormat$1(dateStr, format) {
304
+ if (format === "mm/dd/yyyy") {
305
+ return dateStr;
255
306
  }
307
+
308
+ const parsedDate = parseDate(dateStr, format);
309
+
310
+ if (!parsedDate) {
311
+ throw new Error(
312
+ "AuroDatepickerUtilities | toNorthAmericanFormat: Unable to parse date string",
313
+ );
314
+ }
315
+
316
+ const { month, day, year } = parsedDate;
317
+
318
+ return [month, day, year].filter(Boolean).join("/");
256
319
  }
257
- const dateFormatter = new DateFormatter();
320
+
321
+ /**
322
+ * Validates that a date string matches the provided format and represents a real calendar date.
323
+ *
324
+ * @param {string} dateStr - Date string to validate.
325
+ * @param {string} [format="yyyy-mm-dd"] - Format of the date string.
326
+ * @returns {boolean} True when the date string is valid for the provided format, otherwise false.
327
+ */
328
+ function isValidDate(dateStr, format = "yyyy-mm-dd") {
329
+ try {
330
+ if (typeof dateStr !== "string" || !dateStr || format?.length < 8) {
331
+ return false;
332
+ }
333
+
334
+ if (parseDate(dateStr, format)) {
335
+ return true;
336
+ }
337
+ } catch (error) {
338
+ return false;
339
+ }
340
+ return false;
341
+ }
342
+
343
+ /**
344
+ * Converts a JavaScript Date instance to a simple ISO-like date string. This returns only the calendar date portion without any time or timezone information.
345
+ *
346
+ * @param {Date} date - Date instance to convert to an ISO-like string.
347
+ * @returns {string} A string in the format "yyyy-mm-dd" representing the provided date.
348
+ * @throws {Error} Throws an error when the input is not a valid Date instance.
349
+ */
350
+ function toISOFormatString(date) {
351
+ if (!(date instanceof Date) || Number.isNaN(date.getTime())) {
352
+ throw new Error(
353
+ "AuroDatepickerUtilities | toISOFormatString: Input must be a valid Date instance",
354
+ );
355
+ }
356
+ return `${String(date.getFullYear()).padStart(4, "0")}-${String(date.getMonth() + 1).padStart(2, "0")}-${String(date.getDate()).padStart(2, "0")}`;
357
+ }
358
+
359
+ /**
360
+ * Converts a date string into a JavaScript Date instance. This method supports ISO formatted strings and other formats that can be parsed by the formatter.
361
+ *
362
+ * @param {String} dateStr - Date string to convert into a Date object.
363
+ * @param {String} format - Date format used to parse the string when it is not in ISO format.
364
+ * @returns {Date|null} Returns a Date instance for valid input or null for non-string input.
365
+ * @throws {Error} Throws when parsing fails for non-ISO string input.
366
+ */
367
+ function stringToDateInstance(dateStr, format = "yyyy-mm-dd") {
368
+ if (typeof dateStr !== "string") {
369
+ return null;
370
+ }
371
+
372
+ const { month, day, year } = parseDate(dateStr, format);
373
+ return new Date(`${year}/${month}/${day}`);
374
+ }
375
+
376
+ const dateFormatter = {
377
+ parseDate,
378
+ getDateParts,
379
+ getDateAsString,
380
+ toNorthAmericanFormat: toNorthAmericanFormat$1,
381
+ isValidDate,
382
+ toISOFormatString,
383
+ stringToDateInstance,
384
+ };
258
385
 
259
386
  // filepath: dateConstraints.mjs
260
387
  const DATE_UTIL_CONSTRAINTS = {
@@ -326,12 +453,11 @@ class AuroDateUtilitiesBase {
326
453
  /* eslint-disable no-magic-numbers */
327
454
 
328
455
  class AuroDateUtilities extends AuroDateUtilitiesBase {
329
-
330
456
  /**
331
457
  * Returns the current century.
332
458
  * @returns {String} The current century.
333
459
  */
334
- getCentury () {
460
+ getCentury() {
335
461
  return String(new Date().getFullYear()).slice(0, 2);
336
462
  }
337
463
 
@@ -340,14 +466,12 @@ class AuroDateUtilities extends AuroDateUtilitiesBase {
340
466
  * @param {String} year - The year to convert to four digits.
341
467
  * @returns {String} The four digit year.
342
468
  */
343
- getFourDigitYear (year) {
344
-
469
+ getFourDigitYear(year) {
345
470
  const strYear = String(year).trim();
346
471
  return strYear.length <= 2 ? this.getCentury() + strYear : strYear;
347
472
  }
348
473
 
349
474
  constructor() {
350
-
351
475
  super();
352
476
 
353
477
  /**
@@ -356,7 +480,8 @@ class AuroDateUtilities extends AuroDateUtilitiesBase {
356
480
  * @param {Object} date2 - Second date to compare.
357
481
  * @returns {Boolean} Returns true if the dates match.
358
482
  */
359
- this.datesMatch = (date1, date2) => new Date(date1).getTime() === new Date(date2).getTime();
483
+ this.datesMatch = (date1, date2) =>
484
+ new Date(date1).getTime() === new Date(date2).getTime();
360
485
 
361
486
  /**
362
487
  * Returns true if value passed in is a valid date.
@@ -365,53 +490,41 @@ class AuroDateUtilities extends AuroDateUtilitiesBase {
365
490
  * @returns {Boolean}
366
491
  */
367
492
  this.validDateStr = (date, format) => {
368
-
369
493
  // The length we expect the date string to be
370
- const dateStrLength = format.length;
494
+ const dateStrLength = format?.length || 0;
371
495
 
372
496
  // Guard Clause: Date and format are defined
373
497
  if (typeof date === "undefined" || typeof format === "undefined") {
374
- throw new Error('AuroDatepickerUtilities | validateDateStr: Date and format are required');
498
+ throw new Error(
499
+ "AuroDatepickerUtilities | validateDateStr: Date and format are required",
500
+ );
375
501
  }
376
502
 
377
503
  // Guard Clause: Date should be of type string
378
504
  if (typeof date !== "string") {
379
- throw new Error('AuroDatepickerUtilities | validateDateStr: Date must be a string');
505
+ throw new Error(
506
+ "AuroDatepickerUtilities | validateDateStr: Date must be a string",
507
+ );
380
508
  }
381
509
 
382
510
  // Guard Clause: Format should be of type string
383
511
  if (typeof format !== "string") {
384
- throw new Error('AuroDatepickerUtilities | validateDateStr: Format must be a string');
512
+ throw new Error(
513
+ "AuroDatepickerUtilities | validateDateStr: Format must be a string",
514
+ );
385
515
  }
386
516
 
387
517
  // Guard Clause: Length is what we expect it to be
388
518
  if (date.length !== dateStrLength) {
389
519
  return false;
390
520
  }
391
- // Get a formatted date string and parse it
392
- const dateParts = dateFormatter.parseDate(date, format);
393
-
394
- // Guard Clause: Date parse succeeded
395
- if (!dateParts) {
396
- return false;
397
- }
398
521
 
399
- // Create the expected date string based on the date parts
400
- const expectedDateStr = `${dateParts.month}/${dateParts.day || "01"}/${this.getFourDigitYear(dateParts.year)}`;
401
-
402
- // Generate a date object that we will extract a string date from to compare to the passed in date string
403
- const dateObj = new Date(this.getFourDigitYear(dateParts.year), dateParts.month - 1, dateParts.day || 1);
404
-
405
- // Get the date string of the date object we created from the string date
406
- const actualDateStr = dateFormatter.getDateAsString(dateObj, "en-US");
407
-
408
- // Guard Clause: Generated date matches date string input
409
- if (expectedDateStr !== actualDateStr) {
522
+ // Get a formatted date string and parse and validate it
523
+ try {
524
+ return Boolean(dateFormatter.parseDate(date, format));
525
+ } catch (error) {
410
526
  return false;
411
527
  }
412
-
413
- // If we passed all other checks, we can assume the date is valid
414
- return true;
415
528
  };
416
529
 
417
530
  /**
@@ -421,10 +534,11 @@ class AuroDateUtilities extends AuroDateUtilitiesBase {
421
534
  * @returns {boolean}
422
535
  */
423
536
  this.dateAndFormatMatch = (value, format) => {
424
-
425
537
  // Ensure we have both values we need to do the comparison
426
538
  if (!value || !format) {
427
- throw new Error('AuroFormValidation | dateFormatMatch: value and format are required');
539
+ throw new Error(
540
+ "AuroFormValidation | dateFormatMatch: value and format are required",
541
+ );
428
542
  }
429
543
 
430
544
  // If the lengths are different, they cannot match
@@ -433,11 +547,10 @@ class AuroDateUtilities extends AuroDateUtilitiesBase {
433
547
  }
434
548
 
435
549
  // Get the parts of the date
436
- const dateParts = dateFormatter.parseDate(value, format);
550
+ const dateParts = dateFormatter.getDateParts(value, format);
437
551
 
438
552
  // Validator for day
439
553
  const dayValueIsValid = (day) => {
440
-
441
554
  // Guard clause: if there is no day in the dateParts, we can ignore this check.
442
555
  if (!dateParts.day) {
443
556
  return true;
@@ -453,7 +566,9 @@ class AuroDateUtilities extends AuroDateUtilitiesBase {
453
566
 
454
567
  // Guard clause: ensure day is a valid integer
455
568
  if (Number.isNaN(numDay)) {
456
- throw new Error('AuroDatepickerUtilities | dayValueIsValid: Unable to parse day value integer');
569
+ throw new Error(
570
+ "AuroDatepickerUtilities | dayValueIsValid: Unable to parse day value integer",
571
+ );
457
572
  }
458
573
 
459
574
  // Guard clause: ensure day is within the valid range
@@ -467,6 +582,10 @@ class AuroDateUtilities extends AuroDateUtilitiesBase {
467
582
 
468
583
  // Validator for month
469
584
  const monthValueIsValid = (month) => {
585
+ // Guard clause: if there is no month in the dateParts, we can ignore this check.
586
+ if (!dateParts.month) {
587
+ return true;
588
+ }
470
589
 
471
590
  // Guard clause: ensure month exists.
472
591
  if (!month) {
@@ -478,7 +597,9 @@ class AuroDateUtilities extends AuroDateUtilitiesBase {
478
597
 
479
598
  // Guard clause: ensure month is a valid integer
480
599
  if (Number.isNaN(numMonth)) {
481
- throw new Error('AuroDatepickerUtilities | monthValueIsValid: Unable to parse month value integer');
600
+ throw new Error(
601
+ "AuroDatepickerUtilities | monthValueIsValid: Unable to parse month value integer",
602
+ );
482
603
  }
483
604
 
484
605
  // Guard clause: ensure month is within the valid range
@@ -492,6 +613,10 @@ class AuroDateUtilities extends AuroDateUtilitiesBase {
492
613
 
493
614
  // Validator for year
494
615
  const yearIsValid = (_year) => {
616
+ // Guard clause: if there is no year in the dateParts, we can ignore this check.
617
+ if (!dateParts.year) {
618
+ return true;
619
+ }
495
620
 
496
621
  // Guard clause: ensure year exists.
497
622
  if (!_year) {
@@ -506,7 +631,9 @@ class AuroDateUtilities extends AuroDateUtilitiesBase {
506
631
 
507
632
  // Guard clause: ensure year is a valid integer
508
633
  if (Number.isNaN(numYear)) {
509
- throw new Error('AuroDatepickerUtilities | yearValueIsValid: Unable to parse year value integer');
634
+ throw new Error(
635
+ "AuroDatepickerUtilities | yearValueIsValid: Unable to parse year value integer",
636
+ );
510
637
  }
511
638
 
512
639
  // Guard clause: ensure year is within the valid range
@@ -522,7 +649,7 @@ class AuroDateUtilities extends AuroDateUtilitiesBase {
522
649
  const checks = [
523
650
  monthValueIsValid(dateParts.month),
524
651
  dayValueIsValid(dateParts.day),
525
- yearIsValid(dateParts.year)
652
+ yearIsValid(dateParts.year),
526
653
  ];
527
654
 
528
655
  // If any of the checks failed, the date format does not match and the result is invalid
@@ -556,10 +683,7 @@ const {
556
683
  } = dateUtilities;
557
684
 
558
685
  const {
559
- toNorthAmericanFormat,
560
- parseDate,
561
- getDateAsString
562
- } = dateFormatter;
686
+ toNorthAmericanFormat} = dateFormatter;
563
687
 
564
688
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
565
689
  // See LICENSE in the project root for license information.
@@ -5335,7 +5459,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$3 {
5335
5459
  }
5336
5460
  };
5337
5461
 
5338
- var formkitVersion$1 = '202606011922';
5462
+ var formkitVersion$1 = '202606012139';
5339
5463
 
5340
5464
  class AuroElement extends i$3 {
5341
5465
  static get properties() {
@@ -7309,7 +7433,7 @@ class AuroHelpText extends i$3 {
7309
7433
  }
7310
7434
  }
7311
7435
 
7312
- var formkitVersion = '202606011922';
7436
+ var formkitVersion = '202606012139';
7313
7437
 
7314
7438
  var styleCss$2 = i$6`.util_displayInline{display:inline}.util_displayInlineBlock{display:inline-block}.util_displayBlock{display:block}.util_displayFlex{display:flex}.util_displayHidden{display:none}.util_displayHiddenVisually{position:absolute;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;padding:0;border:0}.body-default{font-size:var(--wcss-body-default-font-size, 1rem);font-weight:var(--wcss-body-default-weight, );line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default,.body-default-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-default-emphasized{font-size:var(--wcss-body-default-emphasized-font-size, 1rem);font-weight:var(--wcss-body-default-emphasized-weight, );line-height:var(--wcss-body-default-emphasized-line-height, 1.5rem)}.body-lg{font-size:var(--wcss-body-lg-font-size, 1.125rem);font-weight:var(--wcss-body-lg-weight, );line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-lg,.body-lg-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-lg-emphasized{font-size:var(--wcss-body-lg-emphasized-font-size, 1.125rem);font-weight:var(--wcss-body-lg-emphasized-weight, );line-height:var(--wcss-body-lg-emphasized-line-height, 1.625rem)}.body-sm{font-size:var(--wcss-body-sm-font-size, 0.875rem);font-weight:var(--wcss-body-sm-weight, );line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm,.body-sm-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-sm-emphasized{font-size:var(--wcss-body-sm-emphasized-font-size, 0.875rem);font-weight:var(--wcss-body-sm-emphasized-weight, );line-height:var(--wcss-body-sm-emphasized-line-height, 1.25rem)}.body-xs{font-size:var(--wcss-body-xs-font-size, 0.75rem);font-weight:var(--wcss-body-xs-weight, );line-height:var(--wcss-body-xs-line-height, 1rem)}.body-xs,.body-xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-xs-emphasized{font-size:var(--wcss-body-xs-emphasized-font-size, 0.75rem);font-weight:var(--wcss-body-xs-emphasized-weight, );line-height:var(--wcss-body-xs-emphasized-line-height, 1rem)}.body-2xs{font-size:var(--wcss-body-2xs-font-size, 0.625rem);font-weight:var(--wcss-body-2xs-weight, );line-height:var(--wcss-body-2xs-line-height, 0.875rem)}.body-2xs,.body-2xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-2xs-emphasized{font-size:var(--wcss-body-2xs-emphasized-font-size, 0.625rem);font-weight:var(--wcss-body-2xs-emphasized-weight, );line-height:var(--wcss-body-2xs-emphasized-line-height, 0.875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));font-weight:var(--wcss-display-2xl-weight, 300);letter-spacing:var(--wcss-display-2xl-letter-spacing, 0);line-height:var(--wcss-display-2xl-line-height, 1.3)}.display-xl{font-family:var(--wcss-display-xl-family, "AS Circular"),var(--wcss-display-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));font-weight:var(--wcss-display-xl-weight, 300);letter-spacing:var(--wcss-display-xl-letter-spacing, 0);line-height:var(--wcss-display-xl-line-height, 1.3)}.display-lg{font-family:var(--wcss-display-lg-family, "AS Circular"),var(--wcss-display-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));font-weight:var(--wcss-display-lg-weight, 300);letter-spacing:var(--wcss-display-lg-letter-spacing, 0);line-height:var(--wcss-display-lg-line-height, 1.3)}.display-md{font-family:var(--wcss-display-md-family, "AS Circular"),var(--wcss-display-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));font-weight:var(--wcss-display-md-weight, 300);letter-spacing:var(--wcss-display-md-letter-spacing, 0);line-height:var(--wcss-display-md-line-height, 1.3)}.display-sm{font-family:var(--wcss-display-sm-family, "AS Circular"),var(--wcss-display-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));font-weight:var(--wcss-display-sm-weight, 300);letter-spacing:var(--wcss-display-sm-letter-spacing, 0);line-height:var(--wcss-display-sm-line-height, 1.3)}.display-xs{font-family:var(--wcss-display-xs-family, "AS Circular"),var(--wcss-display-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));font-weight:var(--wcss-display-xs-weight, 300);letter-spacing:var(--wcss-display-xs-letter-spacing, 0);line-height:var(--wcss-display-xs-line-height, 1.3)}.heading-xl{font-family:var(--wcss-heading-xl-family, "AS Circular"),var(--wcss-heading-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));font-weight:var(--wcss-heading-xl-weight, 300);letter-spacing:var(--wcss-heading-xl-letter-spacing, 0);line-height:var(--wcss-heading-xl-line-height, 1.3)}.heading-lg{font-family:var(--wcss-heading-lg-family, "AS Circular"),var(--wcss-heading-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));font-weight:var(--wcss-heading-lg-weight, 300);letter-spacing:var(--wcss-heading-lg-letter-spacing, 0);line-height:var(--wcss-heading-lg-line-height, 1.3)}.heading-md{font-family:var(--wcss-heading-md-family, "AS Circular"),var(--wcss-heading-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));font-weight:var(--wcss-heading-md-weight, 300);letter-spacing:var(--wcss-heading-md-letter-spacing, 0);line-height:var(--wcss-heading-md-line-height, 1.3)}.heading-sm{font-family:var(--wcss-heading-sm-family, "AS Circular"),var(--wcss-heading-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));font-weight:var(--wcss-heading-sm-weight, 300);letter-spacing:var(--wcss-heading-sm-letter-spacing, 0);line-height:var(--wcss-heading-sm-line-height, 1.3)}.heading-xs{font-family:var(--wcss-heading-xs-family, "AS Circular"),var(--wcss-heading-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));font-weight:var(--wcss-heading-xs-weight, 300);letter-spacing:var(--wcss-heading-xs-letter-spacing, 0);line-height:var(--wcss-heading-xs-line-height, 1.3)}.heading-2xs{font-family:var(--wcss-heading-2xs-family, "AS Circular"),var(--wcss-heading-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));font-weight:var(--wcss-heading-2xs-weight, 300);letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0);line-height:var(--wcss-heading-2xs-line-height, 1.3)}.accent-2xl{font-family:var(--wcss-accent-2xl-family, "Good OT"),var(--wcss-accent-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));font-weight:var(--wcss-accent-2xl-weight, 450);letter-spacing:var(--wcss-accent-2xl-letter-spacing, 0.05em);line-height:var(--wcss-accent-2xl-line-height, 1)}.accent-2xl,.accent-xl{text-transform:uppercase}.accent-xl{font-family:var(--wcss-accent-xl-family, "Good OT"),var(--wcss-accent-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));font-weight:var(--wcss-accent-xl-weight, 450);letter-spacing:var(--wcss-accent-xl-letter-spacing, 0.05em);line-height:var(--wcss-accent-xl-line-height, 1.3)}.accent-lg{font-family:var(--wcss-accent-lg-family, "Good OT"),var(--wcss-accent-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));font-weight:var(--wcss-accent-lg-weight, 450);letter-spacing:var(--wcss-accent-lg-letter-spacing, 0.05em);line-height:var(--wcss-accent-lg-line-height, 1.3)}.accent-lg,.accent-md{text-transform:uppercase}.accent-md{font-family:var(--wcss-accent-md-family, "Good OT"),var(--wcss-accent-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));font-weight:var(--wcss-accent-md-weight, 500);letter-spacing:var(--wcss-accent-md-letter-spacing, 0.05em);line-height:var(--wcss-accent-md-line-height, 1.3)}.accent-sm{font-family:var(--wcss-accent-sm-family, "Good OT"),var(--wcss-accent-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));font-weight:var(--wcss-accent-sm-weight, 500);letter-spacing:var(--wcss-accent-sm-letter-spacing, 0.05em);line-height:var(--wcss-accent-sm-line-height, 1.3)}.accent-sm,.accent-xs{text-transform:uppercase}.accent-xs{font-family:var(--wcss-accent-xs-family, "Good OT"),var(--wcss-accent-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));font-weight:var(--wcss-accent-xs-weight, 500);letter-spacing:var(--wcss-accent-xs-letter-spacing, 0.1em);line-height:var(--wcss-accent-xs-line-height, 1.3)}.accent-2xs{font-family:var(--wcss-accent-2xs-family, "Good OT"),var(--wcss-accent-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xs-font-size, clamp(0.875rem, 1.1666666667vw, 0.875rem));font-weight:var(--wcss-accent-2xs-weight, 450);letter-spacing:var(--wcss-accent-2xs-letter-spacing, 0.1em);line-height:var(--wcss-accent-2xs-line-height, 1.3);text-transform:uppercase}[auro-dropdown]{--ds-auro-dropdown-trigger-border-color: var(--ds-auro-select-border-color);--ds-auro-dropdown-trigger-background-color: var(--ds-auro-select-background-color);--ds-auro-dropdown-trigger-container-color: var(--ds-auro-select-background-color);--ds-auro-dropdown-trigger-outline-color: var(--ds-auro-select-outline-color)}:host{display:inline-block;text-align:left;vertical-align:top}:host([layout*=emphasized]) [auro-dropdown],:host([layout*=snowflake]) [auro-dropdown]{--ds-auro-select-border-color: transparent}:host([layout*=emphasized]) .mainContent,:host([layout*=snowflake]) .mainContent{text-align:center}.mainContent{position:relative;display:flex;overflow:hidden;flex:1;flex-direction:column;align-items:center;justify-content:center}.valueContainer [slot=displayValue]{display:none}.accents{display:flex;flex-direction:row;align-items:center;justify-content:center}::slotted([slot=typeIcon]){margin-right:var(--ds-size-100, 0.5rem)}.displayValue{display:block}.displayValue:not(.force){display:none}.displayValue:not(.force).hasContent:is(.withValue):not(.hasFocus){display:block}.triggerContent{display:flex;width:100%;align-items:center;justify-content:center}:host([layout*=emphasized]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem) 0 var(--ds-size-300, 1.5rem)}:host([layout*=snowflake]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem) 0 var(--ds-size-200, 1rem)}:host([layout*=snowflake]) label{padding-block:var(--ds-size-25, 0.125rem)}:host([layout*=classic]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem)}:host([layout*=classic]) .mainContent{align-items:start}:host([layout*=classic]) label{overflow:hidden;cursor:text;text-overflow:ellipsis;white-space:nowrap}:host([layout*=classic]) .value{height:auto}label{color:var(--ds-auro-select-label-text-color)}:host(:is([validity]:not([validity=valid]))) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-basic-color-status-error, #e31f26);--ds-auro-select-outline-color: var(--ds-basic-color-status-error, #e31f26);--ds-auro-dropdown-helptext-text-color: var(--ds-basic-color-texticon-default, #2a2a2a)}:host([ondark]:is([validity]:not([validity=valid]))) [auro-dropdown],:host([appearance=inverse]:is([validity]:not([validity=valid]))) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-advanced-color-state-error-inverse, #f9a4a8);--ds-auro-select-outline-color: var(--ds-advanced-color-state-error-inverse, #f9a4a8);--ds-auro-dropdown-helptext-text-color: var(--ds-basic-color-texticon-inverse, #ffffff)}#slotHolder{display:none}:host([fluid]){width:100%}:host([disabled]){pointer-events:none;user-select:none}:host([disabled]:not([ondark])) [auro-dropdown],:host([disabled]:not([appearance=inverse])) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-basic-color-border-subtle, #dddddd)}:host(:not([layout*=classic])[disabled][ondark]) [auro-dropdown],:host(:not([layout*=classic])[disabled][appearance=inverse]) [auro-dropdown]{--ds-auro-select-border-color: transparent}`;
7315
7439