@aurodesignsystem-dev/auro-formkit 0.0.0-pr1478.0 → 0.0.0-pr1478.1

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 (69) hide show
  1. package/components/checkbox/demo/customize.html +1 -2
  2. package/components/checkbox/demo/customize.min.js +1 -1
  3. package/components/checkbox/demo/getting-started.min.js +1 -1
  4. package/components/checkbox/demo/index.min.js +1 -1
  5. package/components/checkbox/dist/index.js +1 -1
  6. package/components/checkbox/dist/registered.js +1 -1
  7. package/components/combobox/demo/customize.html +1 -2
  8. package/components/combobox/demo/customize.md +108 -132
  9. package/components/combobox/demo/customize.min.js +14 -23
  10. package/components/combobox/demo/getting-started.min.js +14 -23
  11. package/components/combobox/demo/index.min.js +14 -23
  12. package/components/combobox/dist/index.js +12 -21
  13. package/components/combobox/dist/registered.js +12 -21
  14. package/components/counter/demo/customize.min.js +10 -2
  15. package/components/counter/demo/index.min.js +10 -2
  16. package/components/counter/dist/index.js +10 -2
  17. package/components/counter/dist/registered.js +10 -2
  18. package/components/datepicker/demo/api.md +2 -0
  19. package/components/datepicker/demo/customize.js +0 -2
  20. package/components/datepicker/demo/customize.md +138 -38
  21. package/components/datepicker/demo/customize.min.js +17 -23
  22. package/components/datepicker/demo/index.min.js +17 -5
  23. package/components/datepicker/dist/index.js +17 -5
  24. package/components/datepicker/dist/registered.js +17 -5
  25. package/components/datepicker/dist/src/auro-datepicker.d.ts +2 -0
  26. package/components/dropdown/demo/customize.min.js +9 -1
  27. package/components/dropdown/demo/getting-started.min.js +9 -1
  28. package/components/dropdown/demo/index.min.js +9 -1
  29. package/components/dropdown/dist/auro-dropdown.d.ts +1 -0
  30. package/components/dropdown/dist/index.js +9 -1
  31. package/components/dropdown/dist/registered.js +9 -1
  32. package/components/form/demo/customize.html +6 -6
  33. package/components/form/demo/customize.js +19 -0
  34. package/components/form/demo/customize.md +203 -51
  35. package/components/form/demo/customize.min.js +620 -96
  36. package/components/form/demo/getting-started.min.js +548 -96
  37. package/components/form/demo/index.min.js +548 -96
  38. package/components/form/demo/registerDemoDeps.min.js +185 -59
  39. package/components/form/dist/auro-form.d.ts +122 -4
  40. package/components/form/dist/index.js +363 -37
  41. package/components/form/dist/registered.js +363 -37
  42. package/components/input/demo/customize.html +1 -2
  43. package/components/input/demo/customize.md +54 -53
  44. package/components/input/demo/customize.min.js +1 -1
  45. package/components/input/demo/getting-started.min.js +1 -1
  46. package/components/input/demo/index.min.js +1 -1
  47. package/components/input/dist/index.js +1 -1
  48. package/components/input/dist/registered.js +1 -1
  49. package/components/menu/demo/index.min.js +2 -2
  50. package/components/menu/dist/index.js +2 -2
  51. package/components/menu/dist/registered.js +2 -2
  52. package/components/radio/demo/customize.min.js +1 -1
  53. package/components/radio/demo/getting-started.min.js +1 -1
  54. package/components/radio/demo/index.min.js +1 -1
  55. package/components/radio/dist/index.js +1 -1
  56. package/components/radio/dist/registered.js +1 -1
  57. package/components/select/demo/api.md +1 -0
  58. package/components/select/demo/customize.html +1 -2
  59. package/components/select/demo/customize.md +71 -0
  60. package/components/select/demo/customize.min.js +143 -28
  61. package/components/select/demo/getting-started.min.js +143 -28
  62. package/components/select/demo/index.min.js +143 -28
  63. package/components/select/demo/keyboard-behavior.md +18 -0
  64. package/components/select/dist/auro-select.d.ts +38 -2
  65. package/components/select/dist/index.js +141 -26
  66. package/components/select/dist/registered.js +141 -26
  67. package/components/select/dist/selectUtils.d.ts +12 -0
  68. package/custom-elements.json +1641 -1420
  69. package/package.json +1 -1
@@ -109,7 +109,7 @@ let AuroLibraryRuntimeUtils$b = class AuroLibraryRuntimeUtils {
109
109
  }
110
110
  };
111
111
 
112
- /* eslint-disable no-underscore-dangle, max-lines, object-property-newline */
112
+ /* eslint-disable no-underscore-dangle, max-lines, object-property-newline, dot-location */
113
113
 
114
114
 
115
115
  /**
@@ -117,7 +117,7 @@ let AuroLibraryRuntimeUtils$b = class AuroLibraryRuntimeUtils {
117
117
  * @property {string | number | boolean | string[] | null} value - The value of the form element.
118
118
  * @property {ValidityState} validity - The validity state of the form element, stored when fired from the form element.
119
119
  * @property {boolean} required - Whether the form element is required or not.
120
- * @property {HTMLElement} element - Whether the form element is required or not.
120
+ * @property {boolean} disabled - Whether the form element is currently disabled. Cached from the live attribute via the MutationObserver in `connectedCallback` and refreshed from `_handleAttributeMutations`.
121
121
  */
122
122
 
123
123
  /**
@@ -201,6 +201,31 @@ class AuroForm extends i$3 {
201
201
  */
202
202
  this.mutationObservers = [];
203
203
 
204
+ /**
205
+ * Captured initial (default) value per field `name`. Populated on first
206
+ * sight of each name in `_addElementToState` and preserved across
207
+ * subsequent `initializeState` cycles (slot change, rename, reset) so
208
+ * `_setInitialState` can detect user edits as `current !== initial`,
209
+ * matching HTML's `dirtyValueFlag` semantics.
210
+ * @private
211
+ * @type {Record<string, string | number | boolean | string[] | null | undefined>}
212
+ */
213
+ this._initialValues = {};
214
+
215
+ // Single subtree observer that watches `disabled` and `name` attribute
216
+ // changes across all tracked form elements. The `name` watch is required:
217
+ // without it, renaming a tracked field at runtime leaves a stale key in
218
+ // `formState` that `_isNameDisabled` cannot resolve, so a renamed-but-
219
+ // disabled field would re-appear in `.value`.
220
+ /**
221
+ * @private
222
+ * @type {MutationObserver | null}
223
+ */
224
+ this._attributeObserver = null;
225
+
226
+ /** @private */
227
+ this._handleAttributeMutations = this._handleAttributeMutations.bind(this);
228
+
204
229
  // Bind listeners
205
230
  /** @private */
206
231
  this.reset = this.reset.bind(this);
@@ -269,6 +294,45 @@ class AuroForm extends i$3 {
269
294
  return this._isInElementCollection(AuroForm.formElementTags, element);
270
295
  }
271
296
 
297
+ /**
298
+ * Whether a given element is currently disabled. Disabled controls are excluded
299
+ * from submission, validity, and initial-state checks per the HTML spec
300
+ * (section 4.10.19.2 "Enabling and disabling form controls":
301
+ * https://www.w3.org/TR/2011/WD-html5-20110113/association-of-controls-and-forms.html).
302
+ *
303
+ * Implementation note: we deliberately read only the attribute. Every Auro
304
+ * form element in `formElementTags` declares `disabled` with `reflect: true`,
305
+ * so the attribute and property stay in sync. Reading the attribute also
306
+ * lets the MutationObserver in `connectedCallback` (which is filtered to
307
+ * `['disabled', 'name']`) be the single source of truth for re-renders.
308
+ * If a future form-element type ships without attribute reflection, expand
309
+ * this helper to also read `element.disabled`.
310
+ * @param {HTMLElement | undefined | null} element - The element to check.
311
+ * @returns {boolean}
312
+ * @private
313
+ */
314
+ _isDisabled(element) {
315
+ return Boolean(element?.hasAttribute('disabled'));
316
+ }
317
+
318
+ /**
319
+ * Whether the tracked form element registered under `name` is currently disabled.
320
+ * See `_isDisabled` for the HTML-spec rationale behind excluding disabled
321
+ * controls from form state.
322
+ *
323
+ * Reads a cached flag on `formState[name]` populated by `_addElementToState`
324
+ * at registration and refreshed by `_handleAttributeMutations` whenever the
325
+ * element's `disabled` attribute toggles. The cache is fed by the same
326
+ * `hasAttribute('disabled')` read as `_isDisabled`, so the "future form-element
327
+ * type without attribute reflection" caveat documented there applies here too.
328
+ * @param {string} name - The `name` attribute used to register the element.
329
+ * @returns {boolean}
330
+ * @private
331
+ */
332
+ _isNameDisabled(name) {
333
+ return Boolean(this.formState[name]?.disabled);
334
+ }
335
+
272
336
  /**
273
337
  * Validates if an event is from a valid form element with a name.
274
338
  * @param {Event} event - The event to validate.
@@ -308,6 +372,10 @@ class AuroForm extends i$3 {
308
372
  */
309
373
  get value() {
310
374
  return Object.keys(this.formState).reduce((acc, key) => {
375
+ if (this._isNameDisabled(key)) {
376
+ return acc;
377
+ }
378
+
311
379
  acc[key] = this.formState[key].value;
312
380
  return acc;
313
381
  }, {});
@@ -331,23 +399,113 @@ class AuroForm extends i$3 {
331
399
  return this._resetElements;
332
400
  }
333
401
 
402
+ /**
403
+ * Raw constraint-validation check. Returns `true` when no enabled field
404
+ * has a validity error. Unlike the public `validity` getter, this does
405
+ * NOT gate on `isInitialState` — callers that need to make a decision
406
+ * based on the actual constraint state (submit-button enablement, the
407
+ * internal `submit()` gate) read this so a pre-filled valid form is
408
+ * correctly recognized as submittable at first render.
409
+ * @returns {boolean}
410
+ * @private
411
+ */
412
+ _isFormValid() {
413
+ return !Object.keys(this.formState).some((key) => {
414
+ if (this._isNameDisabled(key)) {
415
+ return false;
416
+ }
417
+
418
+ const formKey = this.formState[key];
419
+ // `null` validity means "not yet validated" — auro-input doesn't
420
+ // re-validate on every keystroke, so validity stays `null` between
421
+ // input events until blur. Treating `null` as invalid disables Submit
422
+ // the moment a user types into any field, which is the wrong UX.
423
+ // We treat a field as invalid in two cases:
424
+ // 1. validity is known-bad (non-null, non-'valid')
425
+ // 2. it's `required` and structurally empty — `valueMissing` is
426
+ // certain even without a validation pass.
427
+ // `submit()` calls `validate(true)` on every enabled field before
428
+ // reading `_isFormValid()`, so any not-yet-validated field that turns
429
+ // out to fail another constraint still blocks dispatch.
430
+ const knownInvalid = formKey.validity !== null && formKey.validity !== 'valid';
431
+ const requiredAndEmpty = formKey.required && this._normalizeEmpty(formKey.value) === null;
432
+ return knownInvalid || requiredAndEmpty;
433
+ });
434
+ }
435
+
436
+ /**
437
+ * Whether the reset button should be enabled. True when the form has
438
+ * diverged from its initial state (so the user can always return to
439
+ * defaults — even if the dirty value lives behind a now-disabled field),
440
+ * OR when any non-disabled field has a current value or captured initial
441
+ * value (covers pre-filled forms and user-cleared-back-to-empty cases).
442
+ * @returns {boolean}
443
+ * @private
444
+ */
445
+ _hasResetableState() {
446
+ // Form is dirty — always allow Reset, even if the dirt is on a field
447
+ // that has since been disabled. Without this branch, the user would
448
+ // have no UI path to return the form to its initial state.
449
+ if (!this._isInitialState) {
450
+ return true;
451
+ }
452
+
453
+ return Object.keys(this.formState).some((key) => {
454
+ if (this._isNameDisabled(key)) {
455
+ return false;
456
+ }
457
+ const current = this._normalizeEmpty(this.formState[key].value);
458
+ const initial = this._normalizeEmpty(this._initialValues[key]);
459
+ return current !== null || initial !== null;
460
+ });
461
+ }
462
+
463
+ /**
464
+ * Collapse empty representations to a single canonical `null`.
465
+ *
466
+ * `_addElementToState` captures `null` for a field that mounts without a
467
+ * `value` attribute (`element.value || element.getAttribute('value')` is
468
+ * falsy → resolves to `null`), but `sharedInputListener` later stores the
469
+ * raw `event.target.value` — which is `''` for a user-cleared text input.
470
+ * Without this normalization, backspacing back to empty would taint the
471
+ * form forever (`'' !== null`) and Reset would stay enabled with nothing
472
+ * to actually reset.
473
+ *
474
+ * `''`, `undefined`, and `[]` all collapse to `null`. The empty-array case
475
+ * covers checkbox-group, radio-group, and multiselect, where `[]` means
476
+ * "no selection" — semantically the same as `null`/`''`. Genuine values
477
+ * — including `0`, `false`, non-empty strings, and non-empty arrays —
478
+ * pass through unchanged so number, boolean, and populated multi-value
479
+ * fields still compare correctly.
480
+ * @param {*} value - Value to normalize.
481
+ * @returns {*}
482
+ * @private
483
+ */
484
+ _normalizeEmpty(value) {
485
+ if (value === '' || value === undefined) {
486
+ return null;
487
+ }
488
+ if (Array.isArray(value) && value.length === 0) {
489
+ return null;
490
+ }
491
+ return value;
492
+ }
493
+
334
494
  /**
335
495
  * Infer validity status based on current formState.
496
+ *
497
+ * Validity stays `null` while the form is in its initial state — this is
498
+ * the "stay quiet until the user interacts" UX contract that consumers
499
+ * depend on to delay error indicators. Code that needs the raw
500
+ * constraint-validation result regardless of interaction (e.g.,
501
+ * submit-button enablement) should call `_isFormValid()` directly.
336
502
  * @private
337
503
  */
338
504
  _calculateValidity() {
339
505
  if (this.isInitialState) {
340
506
  this._validity = null;
341
507
  } else {
342
- // go through validity states and return the first invalid state (if any)
343
- const invalidKey = Object.keys(this.formState).
344
- find((key) => {
345
- const formKey = this.formState[key];
346
- // these are NOT extra parens
347
- // eslint-disable-next-line no-extra-parens
348
- return (formKey.validity !== 'valid' && formKey.required) || (formKey.validity !== 'valid' && formKey.value !== null);
349
- });
350
- this._validity = invalidKey ? 'invalid' : 'valid';
508
+ this._validity = this._isFormValid() ? 'valid' : 'invalid';
351
509
  }
352
510
  }
353
511
 
@@ -363,20 +521,38 @@ class AuroForm extends i$3 {
363
521
  }
364
522
 
365
523
  /**
366
- * Determines whether the form is in its initial (untouched) state and updates `_isInitialState` accordingly.
524
+ * Determines whether the form is in its initial (untouched) state.
525
+ *
526
+ * A field is tainted if either:
527
+ * - its value differs from the value captured on first render, OR
528
+ * - its validity is failing (anything other than `null` or `'valid'`).
529
+ *
530
+ * Validity acts as a backup signal: it catches users who interact with a
531
+ * field without changing its value (e.g., focusing and blurring a required
532
+ * field). We skip `null` (not yet validated) and `'valid'` (the default
533
+ * after Auro's auto-validation on mount) because neither proves the user
534
+ * touched anything.
367
535
  * @returns {void}
368
536
  * @private
369
537
  */
370
538
  _setInitialState() {
371
- const anyTainted = Object.keys(this.formState).some((key) => this.formState[key].validity !== null || this.formState[key].value !== null);
539
+ const anyTainted = Object.keys(this.formState).some((key) => {
540
+ // Normalize empty values so a freshly-captured `null` (no `value`
541
+ // attribute at mount) and a user-cleared `''` (input emptied via
542
+ // backspace) compare equal. Without this, backspacing back to an
543
+ // empty field leaves the form permanently tainted.
544
+ const initialValue = this._normalizeEmpty(this._initialValues[key]);
545
+ const currentValue = this._normalizeEmpty(this.formState[key].value);
546
+ const fieldValidity = this.formState[key].validity;
547
+ // eslint-disable-next-line no-extra-parens
548
+ return currentValue !== initialValue || (fieldValidity !== null && fieldValidity !== 'valid');
549
+ });
372
550
 
373
551
  this._isInitialState = !anyTainted;
374
-
375
- this._resetElements.forEach((resetElement) => {
376
- if (resetElement.hasAttribute("disabled")) {
377
- resetElement.removeAttribute("disabled");
378
- }
379
- });
552
+ // Button state is owned by setDisabledStateOnButtons (called from updated()
553
+ // and reset()). Touching resetElement.disabled here causes a visible flicker
554
+ // in reset(), where the final setDisabledStateOnButtons is deferred behind
555
+ // an extra updateComplete.
380
556
  }
381
557
 
382
558
  /**
@@ -394,19 +570,19 @@ class AuroForm extends i$3 {
394
570
  */
395
571
  setDisabledStateOnButtons() {
396
572
  this._resetElements.forEach((element) => {
397
- if (this.isInitialState) {
398
- element.setAttribute("disabled", "");
399
- } else {
400
- element.removeAttribute("disabled");
401
- }
573
+ // Reset is meaningful whenever any non-disabled field has a current
574
+ // value OR a captured default value — i.e., whenever the click would
575
+ // either clear something or restore a default.
576
+ element.disabled = !this._hasResetableState();
402
577
  });
403
578
 
404
579
  this._submitElements.forEach((element) => {
405
- if (this.isInitialState || this.validity !== "valid") {
406
- element.setAttribute("disabled", "");
407
- } else {
408
- element.removeAttribute("disabled");
409
- }
580
+ // Submit enablement reads raw validity (not the gated public getter)
581
+ // so a pre-filled valid form is submittable at first render — the
582
+ // public `validity` stays `null` during initial state to keep error
583
+ // indicators quiet until the user interacts, but the button decision
584
+ // bypasses that gate.
585
+ element.disabled = !this._isFormValid();
410
586
  });
411
587
  }
412
588
 
@@ -452,9 +628,18 @@ class AuroForm extends i$3 {
452
628
  value: element.value || element.getAttribute('value'),
453
629
  validity: element.validity || null,
454
630
  required: element.hasAttribute('required'),
455
- // element
631
+ disabled: element.hasAttribute('disabled'),
456
632
  };
457
633
 
634
+ // Capture the initial (default) value once per name. Use `in` rather
635
+ // than `??=` so a captured `null` (an empty field at first sight) is
636
+ // preserved across rename/slot/reset cycles — `??=` would treat the
637
+ // stored `null` as nullish and overwrite it with whatever value the
638
+ // field has now, defeating the `current !== initial` taint check.
639
+ if (!(targetName in this._initialValues)) {
640
+ this._initialValues[targetName] = this.formState[targetName].value;
641
+ }
642
+
458
643
  this._elements.push(element);
459
644
  }
460
645
 
@@ -491,6 +676,15 @@ class AuroForm extends i$3 {
491
676
  }
492
677
  });
493
678
 
679
+ // Drop captured initial values for fields that no longer exist in the form.
680
+ // Rename migration in _handleAttributeMutations has already re-keyed surviving
681
+ // fields, so anything left here is a field that was removed from the DOM.
682
+ for (const key of Object.keys(this._initialValues)) {
683
+ if (!(key in this.formState)) {
684
+ delete this._initialValues[key];
685
+ }
686
+ }
687
+
494
688
  this.dispatchEvent(new Event('change', {
495
689
  bubbles: true,
496
690
  composed: true,
@@ -535,16 +729,21 @@ class AuroForm extends i$3 {
535
729
  * @returns {Promise<void>}
536
730
  */
537
731
  async submit() {
538
- // Force validation on ALL elements
539
- this._elements.forEach((element) => {
540
- element.validate(true);
541
- });
732
+ // Force validation on all enabled elements. Disabled fields are skipped
733
+ // because disabled controls are not validated nor submitted per the HTML spec.
734
+ this._elements.
735
+ filter((element) => !this._isDisabled(element)).
736
+ forEach((element) => {
737
+ element.validate(true);
738
+ });
542
739
 
543
740
  // Wait for validation to complete and formState to update
544
741
  await this.updateComplete;
545
742
 
546
- // Only dispatch submit event if form is valid
547
- if (this.validity === 'valid') {
743
+ // Gate on raw constraint-validation rather than the public `validity`
744
+ // getter (which is `null` while in initial state). A pre-filled valid
745
+ // form should be submittable without a prior user edit.
746
+ if (this._isFormValid()) {
548
747
  this.dispatchEvent(new CustomEvent('submit', {
549
748
  bubbles: true,
550
749
  composed: true,
@@ -614,7 +813,14 @@ class AuroForm extends i$3 {
614
813
  this._addElementToState(event.target);
615
814
  }
616
815
 
617
- this.formState[targetName].validity = event.detail.validity;
816
+ // `auroFormElement-validated` can fire with `detail.validity === undefined`
817
+ // when auro-input's updated() lifecycle invokes `validate()` mid-edit but
818
+ // the validation framework's gating conditions (not focused, touched-or-
819
+ // has-value) aren't met — the dispatch still fires, just with the current
820
+ // (untouched) validity. Normalize to `null` so the rest of the form treats
821
+ // "no known status" identically whether it came from `_addElementToState`
822
+ // at mount or from this passthrough mid-typing.
823
+ this.formState[targetName].validity = event.detail.validity ?? null;
618
824
  this._calculateValidity();
619
825
  this.requestUpdate('formState');
620
826
  }
@@ -626,6 +832,11 @@ class AuroForm extends i$3 {
626
832
  */
627
833
  handleKeyDown(event) {
628
834
  if (event.key === 'Enter' && this.isFormElement(event.target)) {
835
+ // Disabled controls do not submit a form natively.
836
+ if (this._isDisabled(event.target)) {
837
+ return;
838
+ }
839
+
629
840
  // Don't submit if it's a textarea (allow new lines)
630
841
  if (event.target.tagName.toLowerCase() === 'textarea' ||
631
842
  event.target.hasAttribute('textarea')) {
@@ -657,6 +868,121 @@ class AuroForm extends i$3 {
657
868
  });
658
869
  }
659
870
 
871
+ /**
872
+ * Handle batched MutationObserver records for `disabled` and `name`
873
+ * attribute changes on tracked form elements. A `name` change invalidates
874
+ * the formState keying — we resolve it by re-initializing state. A `disabled`
875
+ * change simply needs a re-render (so `value` / `validity` getters re-evaluate)
876
+ * and a refresh of the submit/reset button enablement.
877
+ * @param {MutationRecord[]} mutations - The batched mutation records.
878
+ * @returns {void}
879
+ * @private
880
+ */
881
+ _handleAttributeMutations(mutations) {
882
+ // Only mutations on tracked FORM elements matter here. The same observer
883
+ // also sees attribute changes on the submit/reset buttons (which this
884
+ // component itself toggles via `setDisabledStateOnButtons`); reacting to
885
+ // those would create an infinite observer/update loop.
886
+ const relevant = mutations.filter((mutation) => this.isFormElement(mutation.target));
887
+ if (relevant.length === 0) {
888
+ return;
889
+ }
890
+
891
+ const renameMutations = relevant.filter((mutation) => mutation.attributeName === 'name');
892
+ if (renameMutations.length > 0) {
893
+ // Migrate each renamed field's captured initial value from the old key
894
+ // to the new key before `initializeState()` re-runs `_addElementToState`.
895
+ // Without this, the new-name lookup in `_initialValues` would miss, the
896
+ // field's current (possibly user-edited) value would be captured as the
897
+ // new initial, and the form would incorrectly flip back to its initial
898
+ // state. The old key would also leak in `_initialValues` indefinitely.
899
+ renameMutations.forEach((mutation) => {
900
+ const oldName = mutation.oldValue;
901
+ const newName = mutation.target.getAttribute('name');
902
+ if (!oldName || oldName === newName) {
903
+ return;
904
+ }
905
+ if (newName === null) {
906
+ // `name` attribute removed — field will fall out of formState on re-init.
907
+ // Drop its captured initial so it doesn't leak in _initialValues.
908
+ delete this._initialValues[oldName];
909
+ return;
910
+ }
911
+ if (oldName in this._initialValues) {
912
+ this._initialValues[newName] = this._initialValues[oldName];
913
+ delete this._initialValues[oldName];
914
+ }
915
+ });
916
+ // initializeState() rebuilds formState from scratch (re-keying any
917
+ // renamed element) and also dispatches `change` + refreshes button state.
918
+ // We also re-run _attachEventListeners() because elements that previously
919
+ // had no `name` were skipped by queryAuroElements() (which selects
920
+ // `[name]`) and therefore never received input/validation/keydown
921
+ // listeners. Re-attaching is safe — the listener-removal step inside
922
+ // _attachEventListeners() prevents duplicates on already-wired elements.
923
+ this.initializeState();
924
+ this._attachEventListeners();
925
+ return;
926
+ }
927
+
928
+ // Refresh the cached `disabled` flag on each affected formState entry
929
+ // before the re-render, so getters that read `_isNameDisabled` see the
930
+ // current attribute state in the same tick.
931
+ relevant
932
+ .filter((mutation) => mutation.attributeName === 'disabled')
933
+ .forEach((mutation) => {
934
+ const name = mutation.target.getAttribute('name');
935
+ if (name && this.formState[name]) {
936
+ this.formState[name].disabled = mutation.target.hasAttribute('disabled');
937
+ }
938
+ });
939
+
940
+ this.requestUpdate('formState');
941
+ this.setDisabledStateOnButtons();
942
+ }
943
+
944
+ /**
945
+ * @returns {void}
946
+ */
947
+ connectedCallback() {
948
+ super.connectedCallback();
949
+
950
+ // One observer rooted at the host catches `disabled` / `name` changes on
951
+ // any tracked form element (light-DOM children, including those nested in
952
+ // wrapper elements). Cheaper than allocating an observer per element and
953
+ // resilient to runtime DOM mutations.
954
+ if (!this._attributeObserver) {
955
+ this._attributeObserver = new MutationObserver(this._handleAttributeMutations);
956
+ }
957
+
958
+ this._attributeObserver.observe(this, {
959
+ attributes: true,
960
+ subtree: true,
961
+ attributeOldValue: true,
962
+ attributeFilter: [
963
+ 'disabled',
964
+ 'name'
965
+ ]
966
+ });
967
+ }
968
+
969
+ /**
970
+ * @returns {void}
971
+ */
972
+ disconnectedCallback() {
973
+ // Disconnect everything we own to avoid leaking observers (and the strong
974
+ // refs they hold to DOM nodes) past the form's lifetime.
975
+ this._attributeObserver?.disconnect();
976
+ this.mutationObservers.forEach((observer) => observer.disconnect());
977
+ this.mutationObservers = [];
978
+ // Intentionally do NOT clear _initialValues here. Slot-moves trigger a
979
+ // disconnect/reconnect cycle; clearing would cause the next initializeState
980
+ // to capture the user's edited values as the new "initial" and silently
981
+ // flip the form back to its initial state.
982
+
983
+ super.disconnectedCallback();
984
+ }
985
+
660
986
  /**
661
987
  * @param {import('lit').PropertyValues} _changedProperties - Map of changed properties with their previous values.
662
988
  * @returns {void}
@@ -13043,7 +13369,7 @@ let AuroHelpText$8 = class AuroHelpText extends i$3 {
13043
13369
  }
13044
13370
  };
13045
13371
 
13046
- var formkitVersion$8 = '202606171812';
13372
+ var formkitVersion$8 = '202606231828';
13047
13373
 
13048
13374
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
13049
13375
  // See LICENSE in the project root for license information.
@@ -24541,7 +24867,7 @@ var styleCss$7$1 = i$6`.body-default{font-family:var(--wcss-body-family, "AS Cir
24541
24867
 
24542
24868
  var colorCss$7$1 = i$6`.calendarNavBtn{border-color:var(--ds-auro-calendar-nav-btn-border-color);background-color:var(--ds-auro-calendar-nav-btn-container-color);color:var(--ds-auro-calendar-nav-btn-chevron-color)}.calendarNavBtn:hover{--ds-auro-calendar-nav-btn-container-color: var(--ds-advanced-color-state-background-hover, #f2f2f2);--ds-auro-calendar-nav-btn-border-color: var(--ds-basic-color-brand-primary, #01426a)}.calendarNavBtn:focus{--ds-auro-calendar-nav-btn-border-color: var(--ds-basic-color-brand-primary, #01426a)}.calendarNavBtn:active{--ds-auro-calendar-nav-btn-border-color: var(--ds-basic-color-brand-primary, #01426a);box-shadow:inset 0 0 0 1px var(--ds-auro-calendar-nav-btn-border-color)}.mobileHeader{background-color:var(--ds-auro-calendar-mobile-header-container-color)}.mobileDateLabel{color:var(--ds-auro-calendar-mobile-header-text-color)}:host(:not([noRange])) .headerDateTo:after{background-color:var(--ds-auro-calendar-mobile-header-divider-color)}::slotted([slot="bib.fullscreen.fromStr"]),::slotted([slot=mobileDateToStr]){color:var(--ds-auro-datepicker-placeholder-color)}@media screen and (max-width: 576px){.calendarNavBtn{--ds-auro-calendar-nav-btn-border-color: var(--ds-basic-color-brand-primary, #01426a)}}`;
24543
24869
 
24544
- var styleCss$6$1 = i$6`:focus:not(:focus-visible){outline:3px solid transparent}.body-default{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-default-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-font-size, 1rem);line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-default-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-emphasized-font-size, 1rem);line-height:var(--wcss-body-default-emphasized-line-height, 1.5rem)}.body-lg{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-lg-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-font-size, 1.125rem);line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-lg-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-lg-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-emphasized-font-size, 1.125rem);line-height:var(--wcss-body-lg-emphasized-line-height, 1.625rem)}.body-sm{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-sm-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-font-size, 0.875rem);line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-sm-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-emphasized-font-size, 0.875rem);line-height:var(--wcss-body-sm-emphasized-line-height, 1.25rem)}.body-xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-font-size, 0.75rem);line-height:var(--wcss-body-xs-line-height, 1rem)}.body-xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-emphasized-font-size, 0.75rem);line-height:var(--wcss-body-xs-emphasized-line-height, 1rem)}.body-2xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-2xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-font-size, 0.625rem);line-height:var(--wcss-body-2xs-line-height, 0.875rem)}.body-2xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-2xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-emphasized-font-size, 0.625rem);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-weight:var(--wcss-display-2xl-weight, 300);line-height:var(--wcss-display-2xl-line-height, 1.3);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));letter-spacing:var(--wcss-display-2xl-letter-spacing, 0)}.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-weight:var(--wcss-display-xl-weight, 300);line-height:var(--wcss-display-xl-line-height, 1.3);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));letter-spacing:var(--wcss-display-xl-letter-spacing, 0)}.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-weight:var(--wcss-display-lg-weight, 300);line-height:var(--wcss-display-lg-line-height, 1.3);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));letter-spacing:var(--wcss-display-lg-letter-spacing, 0)}.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-weight:var(--wcss-display-md-weight, 300);line-height:var(--wcss-display-md-line-height, 1.3);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));letter-spacing:var(--wcss-display-md-letter-spacing, 0)}.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-weight:var(--wcss-display-sm-weight, 300);line-height:var(--wcss-display-sm-line-height, 1.3);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));letter-spacing:var(--wcss-display-sm-letter-spacing, 0)}.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-weight:var(--wcss-display-xs-weight, 300);line-height:var(--wcss-display-xs-line-height, 1.3);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));letter-spacing:var(--wcss-display-xs-letter-spacing, 0)}.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-weight:var(--wcss-heading-xl-weight, 300);line-height:var(--wcss-heading-xl-line-height, 1.3);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));letter-spacing:var(--wcss-heading-xl-letter-spacing, 0)}.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-weight:var(--wcss-heading-lg-weight, 300);line-height:var(--wcss-heading-lg-line-height, 1.3);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));letter-spacing:var(--wcss-heading-lg-letter-spacing, 0)}.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-weight:var(--wcss-heading-md-weight, 300);line-height:var(--wcss-heading-md-line-height, 1.3);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));letter-spacing:var(--wcss-heading-md-letter-spacing, 0)}.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-weight:var(--wcss-heading-sm-weight, 300);line-height:var(--wcss-heading-sm-line-height, 1.3);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));letter-spacing:var(--wcss-heading-sm-letter-spacing, 0)}.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-weight:var(--wcss-heading-xs-weight, 300);line-height:var(--wcss-heading-xs-line-height, 1.3);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));letter-spacing:var(--wcss-heading-xs-letter-spacing, 0)}.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-weight:var(--wcss-heading-2xs-weight, 300);line-height:var(--wcss-heading-2xs-line-height, 1.3);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0)}.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-weight:var(--wcss-accent-2xl-weight, 450);line-height:var(--wcss-accent-2xl-line-height, 1);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));letter-spacing:var(--wcss-accent-2xl-letter-spacing, 0.05em);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-weight:var(--wcss-accent-xl-weight, 450);line-height:var(--wcss-accent-xl-line-height, 1.3);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));letter-spacing:var(--wcss-accent-xl-letter-spacing, 0.05em);text-transform:uppercase}.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-weight:var(--wcss-accent-lg-weight, 450);line-height:var(--wcss-accent-lg-line-height, 1.3);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));letter-spacing:var(--wcss-accent-lg-letter-spacing, 0.05em);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-weight:var(--wcss-accent-md-weight, 500);line-height:var(--wcss-accent-md-line-height, 1.3);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));letter-spacing:var(--wcss-accent-md-letter-spacing, 0.05em);text-transform:uppercase}.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-weight:var(--wcss-accent-sm-weight, 500);line-height:var(--wcss-accent-sm-line-height, 1.3);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));letter-spacing:var(--wcss-accent-sm-letter-spacing, 0.05em);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-weight:var(--wcss-accent-xs-weight, 500);line-height:var(--wcss-accent-xs-line-height, 1.3);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));letter-spacing:var(--wcss-accent-xs-letter-spacing, 0.1em);text-transform:uppercase}.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-weight:var(--wcss-accent-2xs-weight, 450);line-height:var(--wcss-accent-2xs-line-height, 1.3);font-size:var(--wcss-accent-2xs-font-size, clamp(0.875rem, 1.1666666667vw, 0.875rem));letter-spacing:var(--wcss-accent-2xs-letter-spacing, 0.1em);text-transform:uppercase}:host{position:relative;display:block;width:calc(100% - var(--ds-size-200, 1rem) - var(--ds-size-200, 1rem));margin:0 var(--ds-size-200, 1rem)}@media screen and (min-width: 576px){:host{width:336px;padding:var(--ds-size-200, 1rem) var(--ds-size-200, 1rem) 0}}@media screen and (min-width: 576px){:host(:not(:last-of-type)):after{position:absolute;top:var(--ds-size-200, 1rem);right:calc(-1*var(--ds-size-200, 1rem));height:calc(100% - var(--ds-size-200, 1rem) - var(--ds-size-200, 1rem));display:block;width:1px;content:""}}.header{display:flex;height:var(--ds-size-500, 2.5rem);margin-bottom:var(--ds-size-150, 0.75rem);align-items:center;flex-direction:row;text-align:center}.headerTitle{display:flex;align-items:center;flex:1;flex-direction:row;justify-content:center}.headerTitle div:first-child{margin-right:var(--ds-size-100, 0.5rem)}.calendarNavBtn{position:relative;display:flex;width:var(--ds-size-500, 2.5rem);height:var(--ds-size-500, 2.5rem);align-items:center;justify-content:center;border-width:1px;border-style:solid;border-radius:50%;cursor:pointer}.table{width:100%;border-collapse:collapse}.thead{margin-bottom:var(--ds-size-100, 0.5rem)}.th{display:flex;flex:1;align-items:center;justify-content:center}.th abbr{text-decoration:none}.tbody{width:100%;transition:all 0ms;transform:translateX(0)}@media screen and (min-width: 576px){.tbody{height:336px}}.td{flex:1;margin:0;padding:0}.tr{display:flex;flex-direction:row;width:100%;border-radius:10px;overflow:hidden}.tr:not(:last-of-type){margin-bottom:var(--ds-size-100, 0.5rem)}`;
24870
+ var styleCss$6$1 = i$6`:focus:not(:focus-visible){outline:3px solid transparent}.body-default{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-default-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-font-size, 1rem);line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-default-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-emphasized-font-size, 1rem);line-height:var(--wcss-body-default-emphasized-line-height, 1.5rem)}.body-lg{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-lg-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-font-size, 1.125rem);line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-lg-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-lg-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-emphasized-font-size, 1.125rem);line-height:var(--wcss-body-lg-emphasized-line-height, 1.625rem)}.body-sm{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-sm-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-font-size, 0.875rem);line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-sm-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-emphasized-font-size, 0.875rem);line-height:var(--wcss-body-sm-emphasized-line-height, 1.25rem)}.body-xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-font-size, 0.75rem);line-height:var(--wcss-body-xs-line-height, 1rem)}.body-xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-emphasized-font-size, 0.75rem);line-height:var(--wcss-body-xs-emphasized-line-height, 1rem)}.body-2xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-2xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-font-size, 0.625rem);line-height:var(--wcss-body-2xs-line-height, 0.875rem)}.body-2xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-2xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-emphasized-font-size, 0.625rem);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-weight:var(--wcss-display-2xl-weight, 300);line-height:var(--wcss-display-2xl-line-height, 1.3);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));letter-spacing:var(--wcss-display-2xl-letter-spacing, 0)}.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-weight:var(--wcss-display-xl-weight, 300);line-height:var(--wcss-display-xl-line-height, 1.3);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));letter-spacing:var(--wcss-display-xl-letter-spacing, 0)}.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-weight:var(--wcss-display-lg-weight, 300);line-height:var(--wcss-display-lg-line-height, 1.3);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));letter-spacing:var(--wcss-display-lg-letter-spacing, 0)}.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-weight:var(--wcss-display-md-weight, 300);line-height:var(--wcss-display-md-line-height, 1.3);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));letter-spacing:var(--wcss-display-md-letter-spacing, 0)}.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-weight:var(--wcss-display-sm-weight, 300);line-height:var(--wcss-display-sm-line-height, 1.3);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));letter-spacing:var(--wcss-display-sm-letter-spacing, 0)}.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-weight:var(--wcss-display-xs-weight, 300);line-height:var(--wcss-display-xs-line-height, 1.3);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));letter-spacing:var(--wcss-display-xs-letter-spacing, 0)}.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-weight:var(--wcss-heading-xl-weight, 300);line-height:var(--wcss-heading-xl-line-height, 1.3);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));letter-spacing:var(--wcss-heading-xl-letter-spacing, 0)}.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-weight:var(--wcss-heading-lg-weight, 300);line-height:var(--wcss-heading-lg-line-height, 1.3);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));letter-spacing:var(--wcss-heading-lg-letter-spacing, 0)}.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-weight:var(--wcss-heading-md-weight, 300);line-height:var(--wcss-heading-md-line-height, 1.3);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));letter-spacing:var(--wcss-heading-md-letter-spacing, 0)}.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-weight:var(--wcss-heading-sm-weight, 300);line-height:var(--wcss-heading-sm-line-height, 1.3);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));letter-spacing:var(--wcss-heading-sm-letter-spacing, 0)}.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-weight:var(--wcss-heading-xs-weight, 300);line-height:var(--wcss-heading-xs-line-height, 1.3);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));letter-spacing:var(--wcss-heading-xs-letter-spacing, 0)}.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-weight:var(--wcss-heading-2xs-weight, 300);line-height:var(--wcss-heading-2xs-line-height, 1.3);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0)}.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-weight:var(--wcss-accent-2xl-weight, 450);line-height:var(--wcss-accent-2xl-line-height, 1);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));letter-spacing:var(--wcss-accent-2xl-letter-spacing, 0.05em);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-weight:var(--wcss-accent-xl-weight, 450);line-height:var(--wcss-accent-xl-line-height, 1.3);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));letter-spacing:var(--wcss-accent-xl-letter-spacing, 0.05em);text-transform:uppercase}.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-weight:var(--wcss-accent-lg-weight, 450);line-height:var(--wcss-accent-lg-line-height, 1.3);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));letter-spacing:var(--wcss-accent-lg-letter-spacing, 0.05em);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-weight:var(--wcss-accent-md-weight, 500);line-height:var(--wcss-accent-md-line-height, 1.3);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));letter-spacing:var(--wcss-accent-md-letter-spacing, 0.05em);text-transform:uppercase}.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-weight:var(--wcss-accent-sm-weight, 500);line-height:var(--wcss-accent-sm-line-height, 1.3);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));letter-spacing:var(--wcss-accent-sm-letter-spacing, 0.05em);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-weight:var(--wcss-accent-xs-weight, 500);line-height:var(--wcss-accent-xs-line-height, 1.3);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));letter-spacing:var(--wcss-accent-xs-letter-spacing, 0.1em);text-transform:uppercase}.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-weight:var(--wcss-accent-2xs-weight, 450);line-height:var(--wcss-accent-2xs-line-height, 1.3);font-size:var(--wcss-accent-2xs-font-size, clamp(0.875rem, 1.1666666667vw, 0.875rem));letter-spacing:var(--wcss-accent-2xs-letter-spacing, 0.1em);text-transform:uppercase}:host{position:relative;display:block;width:calc(100% - var(--ds-size-200, 1rem) - var(--ds-size-200, 1rem));margin:0 var(--ds-size-200, 1rem)}@media screen and (min-width: 576px){:host{width:336px;padding:var(--ds-size-200, 1rem) var(--ds-size-200, 1rem) 0}}@media screen and (min-width: 576px){:host(:not(:last-of-type)):after{position:absolute;top:var(--ds-size-200, 1rem);right:calc(-1*var(--ds-size-200, 1rem));height:calc(100% - var(--ds-size-200, 1rem) - var(--ds-size-200, 1rem));display:block;width:1px;content:""}}.header{display:flex;height:var(--ds-size-500, 2.5rem);margin-bottom:var(--ds-size-150, 0.75rem);align-items:center;flex-direction:row;text-align:center}.headerTitle{display:flex;align-items:center;flex:1;flex-direction:row;justify-content:center}.headerTitle div:first-child{margin-right:var(--ds-size-100, 0.5rem)}.calendarNavBtn{position:relative;display:flex;width:var(--ds-size-500, 2.5rem);height:var(--ds-size-500, 2.5rem);align-items:center;justify-content:center;border-width:1px;border-style:solid;border-radius:50%;cursor:pointer}.table{width:100%;border-collapse:collapse}.thead{margin-bottom:var(--ds-size-100, 0.5rem)}.th{display:flex;flex:1;align-items:center;justify-content:center}.th abbr{text-decoration:none}.tbody{width:100%;transition:all 0ms;transform:translateX(0)}@media screen and (min-width: 576px){.tbody{height:376px}}.td{flex:1;margin:0;padding:0}.tr{display:flex;flex-direction:row;width:100%;border-radius:10px;overflow:hidden}.tr:not(:last-of-type){margin-bottom:var(--ds-size-100, 0.5rem)}`;
24545
24871
 
24546
24872
  var colorCss$6$1 = i$6`:focus:not(:focus-visible){outline:3px solid transparent}:host{background-color:var(--ds-auro-calendar-month-container-color)}@media screen and (min-width: 576px){:host(:not(:last-of-type)):after{background-color:var(--ds-auro-calendar-month-divider-color)}}.header{color:var(--ds-auro-calendar-month-header-color)}`;
24547
24873
 
@@ -27162,7 +27488,7 @@ let AuroBibtemplate$3 = class AuroBibtemplate extends i$3 {
27162
27488
  }
27163
27489
  };
27164
27490
 
27165
- var formkitVersion$2$1 = '202606171812';
27491
+ var formkitVersion$2$1 = '202606231828';
27166
27492
 
27167
27493
  let l$1$2 = class l{generateElementName(t,e){let o=t;return o+="-",o+=e.replace(/[.]/g,"_"),o}generateTag(o,s,a){const r=this.generateElementName(o,s),i=i$2`${s$3(r)}`;return customElements.get(r)||customElements.define(r,class extends a{}),i}};let d$1$2 = class d{registerComponent(t,e){customElements.get(t)||customElements.define(t,class extends e{});}closestElement(t,e=this,o=(e,s=e&&e.closest(t))=>e&&e!==document&&e!==window?s||o(e.getRootNode().host):null){return o(e)}handleComponentTagRename(t,e){const o=e.toLowerCase();t.tagName.toLowerCase()!==o&&t.setAttribute(o,true);}elementMatch(t,e){const o=e.toLowerCase();return t.tagName.toLowerCase()===o||t.hasAttribute(o)}getSlotText(t,e){const o=t.shadowRoot?.querySelector(`slot[name="${e}"]`),s=(o?.assignedNodes({flatten:true})||[]).map(t=>t.textContent?.trim()).join(" ").trim();return s||null}};let h$1$2 = class h{registerComponent(t,e){customElements.get(t)||customElements.define(t,class extends e{});}closestElement(t,e=this,o=(e,s=e&&e.closest(t))=>e&&e!==document&&e!==window?s||o(e.getRootNode().host):null){return o(e)}handleComponentTagRename(t,e){const o=e.toLowerCase();t.tagName.toLowerCase()!==o&&t.setAttribute(o,true);}elementMatch(t,e){const o=e.toLowerCase();return t.tagName.toLowerCase()===o||t.hasAttribute(o)}};var c$1$3=i$6`:host{color:var(--ds-auro-loader-color)}:host>span{background-color:var(--ds-auro-loader-background-color);border-color:var(--ds-auro-loader-border-color)}:host([onlight]),:host([appearance=brand]){--ds-auro-loader-color: var(--ds-basic-color-brand-primary, #01426a)}:host([ondark]),:host([appearance=inverse]){--ds-auro-loader-color: var(--ds-basic-color-texticon-inverse, #ffffff)}:host([orbit])>span{--ds-auro-loader-background-color: transparent}:host([orbit])>span:nth-child(1){--ds-auro-loader-border-color: currentcolor;opacity:.25}:host([orbit])>span:nth-child(2){--ds-auro-loader-border-color: currentcolor;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}
27168
27494
  `,u$4$2=i$6`.body-default{font-size:var(--wcss-body-default-font-size, 1rem);line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default,.body-lg{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-lg{font-size:var(--wcss-body-lg-font-size, 1.125rem);line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-sm{font-size:var(--wcss-body-sm-font-size, .875rem);line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm,.body-xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-xs{font-size:var(--wcss-body-xs-font-size, .75rem);line-height:var(--wcss-body-xs-line-height, 1rem)}.body-2xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:var(--wcss-body-2xs-font-size, .625rem);font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0);line-height:var(--wcss-body-2xs-line-height, .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, 450);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, 450);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, .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, .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, .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, .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, .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, .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(.875rem, 1.1666666667vw, .875rem));font-weight:var(--wcss-accent-2xs-weight, 450);letter-spacing:var(--wcss-accent-2xs-letter-spacing, .1em);line-height:var(--wcss-accent-2xs-line-height, 1.3);text-transform:uppercase}:focus:not(:focus-visible){outline:3px solid transparent}:host,:host>span{position:relative}:host{width:2rem;height:2rem;display:inline-block;font-size:0}:host>span{position:absolute;display:inline-block;float:none;top:0;left:0;width:2rem;height:2rem;border-radius:100%;border-style:solid;border-width:0;box-sizing:border-box}:host([xs]),:host([xs])>span{width:1.2rem;height:1.2rem}:host([sm]),:host([sm])>span{width:3rem;height:3rem}:host([md]),:host([md])>span{width:5rem;height:5rem}:host([lg]),:host([lg])>span{width:8rem;height:8rem}:host{--margin: .375rem;--margin-xs: .2rem;--margin-sm: .5rem;--margin-md: .75rem;--margin-lg: 1rem}:host([pulse]),:host([pulse])>span{position:relative}:host([pulse]){width:calc(3rem + var(--margin) * 6);height:calc(1rem + var(--margin) * 2)}:host([pulse])>span{width:1rem;height:1rem;margin:var(--margin);animation:pulse 1.5s ease infinite}:host([pulse][xs]){width:calc(1.95rem + var(--margin-xs) * 6);height:calc(.65rem + var(--margin-xs) * 2)}:host([pulse][xs])>span{margin:var(--margin-xs);width:.65rem;height:.65rem}:host([pulse][sm]){width:calc(6rem + var(--margin-sm) * 6);height:calc(2rem + var(--margin-sm) * 2)}:host([pulse][sm])>span{margin:var(--margin-sm);width:2rem;height:2rem}:host([pulse][md]){width:calc(9rem + var(--margin-md) * 6);height:calc(3rem + var(--margin-md) * 2)}:host([pulse][md])>span{margin:var(--margin-md);width:3rem;height:3rem}:host([pulse][lg]){width:calc(15rem + var(--margin-lg) * 6);height:calc(5rem + var(--margin-lg) * 2)}:host([pulse][lg])>span{margin:var(--margin-lg);width:5rem;height:5rem}:host([pulse])>span:nth-child(1){animation-delay:-.4s}:host([pulse])>span:nth-child(2){animation-delay:-.2s}:host([pulse])>span:nth-child(3){animation-delay:0ms}@keyframes pulse{0%,to{opacity:.1;transform:scale(.9)}50%{opacity:1;transform:scale(1.1)}}:host([orbit]),:host([orbit])>span{opacity:1}:host([orbit])>span{border-width:5px}:host([orbit])>span:nth-child(2){animation:orbit 2s linear infinite}:host([orbit][sm])>span{border-width:8px}:host([orbit][md])>span{border-width:13px}:host([orbit][lg])>span{border-width:21px}@keyframes orbit{0%{transform:rotate(0)}to{transform:rotate(360deg)}}:host([ringworm])>svg{animation:rotate 2s linear infinite;height:100%;width:100%;stroke:currentcolor;stroke-width:8}:host([ringworm]) .path{stroke-dashoffset:0;animation:ringworm 1.5s ease-in-out infinite;stroke-linecap:round}@keyframes rotate{to{transform:rotate(360deg)}}@keyframes ringworm{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}:host([laser]){position:static;width:100%;display:block;height:0;overflow:hidden;font-size:unset}:host([laser])>span{position:fixed;width:100%;height:.25rem;border-radius:0;z-index:100}:host([laser])>span:nth-child(1){border-color:currentcolor;opacity:.25}:host([laser])>span:nth-child(2){border-color:currentcolor;animation:laser 2s linear infinite;opacity:1;width:50%}:host([laser][sm])>span:nth-child(2){width:20%}:host([laser][md])>span:nth-child(2){width:30%}:host([laser][lg])>span:nth-child(2){width:50%;animation-duration:1.5s}:host([laser][xl])>span:nth-child(2){width:80%;animation-duration:1.5s}@keyframes laser{0%{left:-100%}to{left:110%}}:host>.no-animation{display:none}@media (prefers-reduced-motion: reduce){:host{display:flex;align-items:center;justify-content:center}:host>span{opacity:1}:host>.loader{display:none}:host>svg{display:none}:host>.no-animation{display:block}}
@@ -32673,7 +32999,7 @@ let AuroHelpText$2$1 = class AuroHelpText extends i$3 {
32673
32999
  }
32674
33000
  };
32675
33001
 
32676
- var formkitVersion$1$3 = '202606171812';
33002
+ var formkitVersion$1$3 = '202606231828';
32677
33003
 
32678
33004
  let AuroElement$2$2 = class AuroElement extends i$3 {
32679
33005
  static get properties() {
@@ -33624,6 +33950,14 @@ let AuroDropdown$3 = class AuroDropdown extends AuroElement$2$2 {
33624
33950
  };
33625
33951
  this.addEventListener('keydown', this._bibTabHandler);
33626
33952
 
33953
+ // Suppress AuroFloatingUI's auto-hide-on-focus-loss while the
33954
+ // desktopModal trap owns focus management. Without this, the very
33955
+ // first focus move into the bib (from the RAF below) triggers
33956
+ // handleFocusLoss → hideBib, tearing down the trap before the
33957
+ // user can press Tab.
33958
+ this._priorNoHideOnFocusLoss = this.noHideOnThisFocusLoss;
33959
+ this.noHideOnThisFocusLoss = true;
33960
+
33627
33961
  // Move initial focus into the bib content, matching FocusTrap behavior
33628
33962
  requestAnimationFrame(() => {
33629
33963
  const focusables = getFocusableElements$3(this.bibContent);
@@ -46255,7 +46589,7 @@ let AuroHelpText$1$3 = class AuroHelpText extends i$3 {
46255
46589
  }
46256
46590
  };
46257
46591
 
46258
- var formkitVersion$7 = '202606171812';
46592
+ var formkitVersion$7 = '202606231828';
46259
46593
 
46260
46594
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
46261
46595
  // See LICENSE in the project root for license information.
@@ -47675,6 +48009,8 @@ const datepickerKeyboardStrategy = {
47675
48009
  * @slot label - Defines the label content for the entire datepicker when `layout="snowflake"`.
47676
48010
  * @slot toLabel - Defines the label content for the second input when the `range` attribute is used.
47677
48011
  * @slot fromLabel - Defines the label content for the first input.
48012
+ * @slot optionalFromLabel - Overrides the "(optional)" text rendered next to the first input's label when the datepicker is not `required`.
48013
+ * @slot optionalToLabel - Overrides the "(optional)" text rendered next to the second input's label when `range` is set and the datepicker is not `required`.
47678
48014
  * @slot date_YYYY_MM_DD - Defines the content to display in the auro-calendar-cell for the specified date. The content text is colored using the success state token when the `highlight` attribute is applied to the slot.
47679
48015
  * @slot popover_YYYY_MM_DD - Defines the content to display in the auro-calendar-cell popover for the specified date.
47680
48016
  * @csspart dropdown - Use for customizing the style of the dropdown.
@@ -49270,7 +49606,7 @@ class AuroDatePicker extends AuroElement$5 {
49270
49606
  // update the calendar
49271
49607
  if (this.valueEndObject) {
49272
49608
  this.calendar.dateTo = this.convertToWcValidTime(this.valueEndObject);
49273
- if (!(this.wasCellClick && this.range)) {
49609
+ if (!this.wasCellClick) {
49274
49610
  this.calendarRenderUtil.updateCentralDate(this, this.valueEndObject);
49275
49611
  }
49276
49612
  } else {
@@ -49667,6 +50003,7 @@ class AuroDatePicker extends AuroElement$5 {
49667
50003
  }
49668
50004
  <span slot="ariaLabel.clear">${this.runtimeUtils.getSlotText(this, 'ariaLabel.input.clear') || i18n$2(this.lang, 'clearInput')}</span>
49669
50005
  <span slot="label"><slot name="fromLabel"></slot></span>
50006
+ <slot name="optionalFromLabel" slot="optionalLabel"> (optional)</slot>
49670
50007
  </${this.inputTag}>
49671
50008
  </div>
49672
50009
 
@@ -49711,6 +50048,7 @@ class AuroDatePicker extends AuroElement$5 {
49711
50048
  }
49712
50049
  <span slot="ariaLabel.clear">${this.runtimeUtils.getSlotText(this, 'ariaLabel.input.clear') || this.runtimeUtils.getSlotText(this, 'ariaLabel.input.clear') || i18n$2(this.lang, 'clearInput')}</span>
49713
50050
  <span slot="label"><slot name="toLabel"></slot></span>
50051
+ <slot name="optionalToLabel" slot="optionalLabel"> (optional)</slot>
49714
50052
  </${this.inputTag}>
49715
50053
  </div>
49716
50054
  ` : undefined}
@@ -50954,7 +51292,7 @@ let AuroHelpText$1$2 = class AuroHelpText extends i$3 {
50954
51292
  }
50955
51293
  };
50956
51294
 
50957
- var formkitVersion$1$2 = '202606171812';
51295
+ var formkitVersion$1$2 = '202606231828';
50958
51296
 
50959
51297
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
50960
51298
  // See LICENSE in the project root for license information.
@@ -55282,7 +55620,7 @@ let AuroHelpText$6 = class AuroHelpText extends i$3 {
55282
55620
  }
55283
55621
  };
55284
55622
 
55285
- var formkitVersion$6 = '202606171812';
55623
+ var formkitVersion$6 = '202606231828';
55286
55624
 
55287
55625
  let AuroElement$1$2 = class AuroElement extends i$3 {
55288
55626
  static get properties() {
@@ -56233,6 +56571,14 @@ let AuroDropdown$2 = class AuroDropdown extends AuroElement$1$2 {
56233
56571
  };
56234
56572
  this.addEventListener('keydown', this._bibTabHandler);
56235
56573
 
56574
+ // Suppress AuroFloatingUI's auto-hide-on-focus-loss while the
56575
+ // desktopModal trap owns focus management. Without this, the very
56576
+ // first focus move into the bib (from the RAF below) triggers
56577
+ // handleFocusLoss → hideBib, tearing down the trap before the
56578
+ // user can press Tab.
56579
+ this._priorNoHideOnFocusLoss = this.noHideOnThisFocusLoss;
56580
+ this.noHideOnThisFocusLoss = true;
56581
+
56236
56582
  // Move initial focus into the bib content, matching FocusTrap behavior
56237
56583
  requestAnimationFrame(() => {
56238
56584
  const focusables = getFocusableElements$2(this.bibContent);
@@ -59214,7 +59560,7 @@ let AuroHelpText$5 = class AuroHelpText extends i$3 {
59214
59560
  }
59215
59561
  };
59216
59562
 
59217
- var formkitVersion$5 = '202606171812';
59563
+ var formkitVersion$5 = '202606231828';
59218
59564
 
59219
59565
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
59220
59566
  // See LICENSE in the project root for license information.
@@ -60964,7 +61310,7 @@ let AuroHelpText$4 = class AuroHelpText extends i$3 {
60964
61310
  }
60965
61311
  };
60966
61312
 
60967
- var formkitVersion$4 = '202606171812';
61313
+ var formkitVersion$4 = '202606231828';
60968
61314
 
60969
61315
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
60970
61316
  // See LICENSE in the project root for license information.
@@ -66179,7 +66525,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$3 {
66179
66525
  }
66180
66526
  };
66181
66527
 
66182
- var formkitVersion$2 = '202606171812';
66528
+ var formkitVersion$2 = '202606231828';
66183
66529
 
66184
66530
  let AuroElement$2$1 = class AuroElement extends i$3 {
66185
66531
  static get properties() {
@@ -67130,6 +67476,14 @@ let AuroDropdown$1 = class AuroDropdown extends AuroElement$2$1 {
67130
67476
  };
67131
67477
  this.addEventListener('keydown', this._bibTabHandler);
67132
67478
 
67479
+ // Suppress AuroFloatingUI's auto-hide-on-focus-loss while the
67480
+ // desktopModal trap owns focus management. Without this, the very
67481
+ // first focus move into the bib (from the RAF below) triggers
67482
+ // handleFocusLoss → hideBib, tearing down the trap before the
67483
+ // user can press Tab.
67484
+ this._priorNoHideOnFocusLoss = this.noHideOnThisFocusLoss;
67485
+ this.noHideOnThisFocusLoss = true;
67486
+
67133
67487
  // Move initial focus into the bib content, matching FocusTrap behavior
67134
67488
  requestAnimationFrame(() => {
67135
67489
  const focusables = getFocusableElements$1(this.bibContent);
@@ -79761,7 +80115,7 @@ let AuroHelpText$1$1 = class AuroHelpText extends i$3 {
79761
80115
  }
79762
80116
  };
79763
80117
 
79764
- var formkitVersion$1$1 = '202606171812';
80118
+ var formkitVersion$1$1 = '202606231828';
79765
80119
 
79766
80120
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
79767
80121
  // See LICENSE in the project root for license information.
@@ -80882,7 +81236,7 @@ let AuroBibtemplate$1 = class AuroBibtemplate extends i$3 {
80882
81236
  }
80883
81237
  };
80884
81238
 
80885
- var formkitVersion$3 = '202606171812';
81239
+ var formkitVersion$3 = '202606231828';
80886
81240
 
80887
81241
  var styleCss$1$3 = 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}:host{display:block;text-align:left}:host [auro-dropdown]{--ds-auro-dropdown-trigger-background-color: transparent}:host #inputInBib::part(wrapper){box-shadow:none}:host #inputInBib::part(accent-left){display:none}:host([layout*=classic]) [auro-input]{width:100%}:host([layout*=classic]) [auro-input]::part(helpText){display:none}:host([layout*=classic]) #slotHolder{display:none}`;
80888
81242
 
@@ -82233,24 +82587,7 @@ class AuroCombobox extends AuroElement$3 {
82233
82587
  nativeInput.setSelectionRange(len, len);
82234
82588
  }
82235
82589
  } else {
82236
- // Safety net for the strategy-change setTimeout: a viewport-crossing
82237
- // fullscreen→floating switch can close the dialog and leave focus on
82238
- // body. Every other Branch 2 callsite already has focus on the input
82239
- // via the focusin → this.focus() redirect (L1448-1452), so this is a
82240
- // no-op in the common case.
82241
- if (!this.input.componentHasFocus) {
82242
- this.input.focus();
82243
- }
82244
-
82245
- // Park the trigger native input's caret at end-of-text every time the
82246
- // popover opens. Chrome focuses the native via the floating <label for="…">
82247
- // overlay on click and resets selection to [0, 0]; no JS fires between
82248
- // mousedown and selectionchange, so we restore the caret here.
82249
- const triggerNativeInput = this.input.inputElement;
82250
- if (triggerNativeInput && triggerNativeInput.value) {
82251
- const len = triggerNativeInput.value.length;
82252
- triggerNativeInput.setSelectionRange(len, len);
82253
- }
82590
+ this.input.focus();
82254
82591
  }
82255
82592
  }
82256
82593
 
@@ -83646,8 +83983,8 @@ class AuroMenu extends AuroElement$2 {
83646
83983
  // Malformed JSON (e.g. a literal string that happens to start with "[") falls back
83647
83984
  // to a single-item array rather than throwing during render.
83648
83985
  try {
83649
- const parsed = JSON.parse(this.value);
83650
- return Array.isArray(parsed) ? parsed : [this.value];
83986
+ // any valid JSON starting with `[` ALWAYS parses to an array
83987
+ return JSON.parse(this.value);
83651
83988
  } catch {
83652
83989
  return [this.value];
83653
83990
  }
@@ -85646,6 +85983,21 @@ function getEnabledOptions(menu) {
85646
85983
  return (menu?.options || []).filter((option) => !option.disabled);
85647
85984
  }
85648
85985
 
85986
+ /**
85987
+ * Returns the active (selectable + visible) options for type-ahead navigation.
85988
+ *
85989
+ * Uses auro-menuoption's `isActive` getter, which excludes disabled, hidden,
85990
+ * and static options (e.g. `static nomatch` placeholders) so the type-ahead
85991
+ * cursor never lands on a non-actionable item. Same empty-safe handling as
85992
+ * `getEnabledOptions`.
85993
+ *
85994
+ * @param {HTMLElement | null | undefined} menu - The auro-menu element.
85995
+ * @returns {Array<HTMLElement>} Active options, empty array when none.
85996
+ */
85997
+ function getActiveOptions(menu) {
85998
+ return (menu?.options || []).filter((option) => option.isActive);
85999
+ }
86000
+
85649
86001
  /* eslint-disable new-cap */
85650
86002
 
85651
86003
  const selectKeyboardStrategy = {
@@ -85678,6 +86030,14 @@ const selectKeyboardStrategy = {
85678
86030
  },
85679
86031
 
85680
86032
  Escape(component, evt, ctx) {
86033
+ // Always clear the type-ahead buffer — Escape is a universal cancel.
86034
+ // Safe to call when the buffer is empty.
86035
+ // eslint-disable-next-line no-underscore-dangle
86036
+ if (typeof component._clearTypeaheadBuffer === 'function') {
86037
+ // eslint-disable-next-line no-underscore-dangle
86038
+ component._clearTypeaheadBuffer();
86039
+ }
86040
+
85681
86041
  if (!ctx.isExpanded) {
85682
86042
  return;
85683
86043
  }
@@ -85737,16 +86097,25 @@ const selectKeyboardStrategy = {
85737
86097
  },
85738
86098
 
85739
86099
  default(component, evt, ctx) {
85740
- component.updateActiveOptionBasedOnKey(evt.key);
86100
+ // Space resolves to either typeahead-buffer extension or bib toggle
86101
+ // depending on whether a type-ahead buffer is active. Mirrors native
86102
+ // <select> and the WAI-ARIA APG Listbox guidance: mid-typeahead space
86103
+ // is a search character (e.g. "San Francisco"); otherwise it toggles.
85741
86104
  if (evt.key === ' ') {
85742
86105
  evt.preventDefault();
85743
86106
  evt.stopPropagation();
86107
+ if (component.typeaheadBuffer && component.typeaheadBuffer.length > 0) {
86108
+ component.updateActiveOptionBasedOnKey(evt.key);
86109
+ return;
86110
+ }
85744
86111
  if (ctx.isExpanded) {
85745
86112
  component.dropdown.hide();
85746
- return;
86113
+ } else {
86114
+ component.dropdown.show();
85747
86115
  }
85748
- component.dropdown.show();
86116
+ return;
85749
86117
  }
86118
+ component.updateActiveOptionBasedOnKey(evt.key);
85750
86119
  },
85751
86120
  };
85752
86121
 
@@ -89658,7 +90027,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$3 {
89658
90027
  }
89659
90028
  };
89660
90029
 
89661
- var formkitVersion$1 = '202606171812';
90030
+ var formkitVersion$1 = '202606231828';
89662
90031
 
89663
90032
  class AuroElement extends i$3 {
89664
90033
  static get properties() {
@@ -90609,6 +90978,14 @@ class AuroDropdown extends AuroElement {
90609
90978
  };
90610
90979
  this.addEventListener('keydown', this._bibTabHandler);
90611
90980
 
90981
+ // Suppress AuroFloatingUI's auto-hide-on-focus-loss while the
90982
+ // desktopModal trap owns focus management. Without this, the very
90983
+ // first focus move into the bib (from the RAF below) triggers
90984
+ // handleFocusLoss → hideBib, tearing down the trap before the
90985
+ // user can press Tab.
90986
+ this._priorNoHideOnFocusLoss = this.noHideOnThisFocusLoss;
90987
+ this.noHideOnThisFocusLoss = true;
90988
+
90612
90989
  // Move initial focus into the bib content, matching FocusTrap behavior
90613
90990
  requestAnimationFrame(() => {
90614
90991
  const focusables = getFocusableElements(this.bibContent);
@@ -91671,7 +92048,7 @@ class AuroHelpText extends i$3 {
91671
92048
  }
91672
92049
  }
91673
92050
 
91674
- var formkitVersion = '202606171812';
92051
+ var formkitVersion = '202606231828';
91675
92052
 
91676
92053
  var styleCss = 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}`;
91677
92054
 
@@ -91776,6 +92153,16 @@ class AuroSelect extends AuroElement$1 {
91776
92153
  * @private
91777
92154
  */
91778
92155
  this.hasDisplayValueContent = false;
92156
+
92157
+ /**
92158
+ * @private
92159
+ */
92160
+ this.typeaheadBuffer = '';
92161
+
92162
+ /**
92163
+ * @private
92164
+ */
92165
+ this._typeaheadTimeout = null;
91779
92166
  }
91780
92167
 
91781
92168
  /**
@@ -91788,6 +92175,7 @@ class AuroSelect extends AuroElement$1 {
91788
92175
  this.fullscreenBreakpoint = 'sm';
91789
92176
  this.onDark = false;
91790
92177
  this.isPopoverVisible = false;
92178
+ this.typeaheadTimeoutMs = 500;
91791
92179
 
91792
92180
  // Layout Config
91793
92181
  this.layout = 'classic';
@@ -92091,6 +92479,16 @@ class AuroSelect extends AuroElement$1 {
92091
92479
  attribute: false
92092
92480
  },
92093
92481
 
92482
+ /**
92483
+ * Milliseconds of keyboard inactivity before the type-ahead buffer resets.
92484
+ * Increase for users who type slowly.
92485
+ * @default 500
92486
+ */
92487
+ typeaheadTimeoutMs: {
92488
+ type: Number,
92489
+ reflect: true
92490
+ },
92491
+
92094
92492
  /**
92095
92493
  * Specifies the `validityState` this element is in.
92096
92494
  */
@@ -92530,6 +92928,7 @@ class AuroSelect extends AuroElement$1 {
92530
92928
  this.addEventListener('blur', () => {
92531
92929
  this.validate();
92532
92930
  this.hasFocus = false;
92931
+ this._clearTypeaheadBuffer();
92533
92932
  });
92534
92933
  }
92535
92934
 
@@ -92543,41 +92942,89 @@ class AuroSelect extends AuroElement$1 {
92543
92942
  }
92544
92943
  }
92545
92944
 
92945
+ /**
92946
+ * Returns the lowercase, trimmed text content of a menu option.
92947
+ * @private
92948
+ * @param {HTMLElement} option - The menu option element.
92949
+ * @returns {string}
92950
+ */
92951
+ _getOptionDisplayText(option) {
92952
+ return (option.textContent || '').trim().toLowerCase();
92953
+ }
92954
+
92955
+ /**
92956
+ * Empties the type-ahead buffer and cancels any pending reset timeout.
92957
+ * Called when focus leaves the component, when Escape closes the bib, and on disconnect
92958
+ * so a stale buffer never bridges into a fresh interaction.
92959
+ * @private
92960
+ */
92961
+ _clearTypeaheadBuffer() {
92962
+ if (this._typeaheadTimeout) {
92963
+ clearTimeout(this._typeaheadTimeout);
92964
+ this._typeaheadTimeout = null;
92965
+ }
92966
+ this.typeaheadBuffer = '';
92967
+ }
92968
+
92546
92969
  /**
92547
92970
  * Updates the active option in the menu based on keyboard input.
92971
+ *
92972
+ * Implements the WAI-ARIA APG Listbox type-ahead pattern: accumulates printable
92973
+ * keystrokes into a buffer that resets after `typeaheadTimeoutMs` of inactivity.
92974
+ * A multi-character buffer matches the first option whose displayed text starts
92975
+ * with the buffer; repeating a single character cycles through options that start
92976
+ * with that character.
92548
92977
  * @private
92549
92978
  * @param {string} _key - The key pressed by the user.
92550
92979
  * @returns {void}
92551
92980
  */
92552
92981
  updateActiveOptionBasedOnKey(_key) {
92982
+ // Ignore non-printable keys (Shift, ArrowDown, Tab, etc.)
92983
+ if (typeof _key !== 'string' || _key.length !== 1) {
92984
+ return;
92985
+ }
92553
92986
 
92554
- // Get a lowercase version of the key pressed
92555
- const key = _key.toLowerCase();
92556
-
92557
- // Calculate how many times the same letter has been pressed
92558
- this.sameLetterTimes = key === this.lastLetter ? this.sameLetterTimes + 1 : 0;
92987
+ // No selectable options to match against clear any stale buffer/timer so
92988
+ // Space stays a bib toggle and the next keystroke after fresh options load
92989
+ // starts cleanly. `getActiveOptions` excludes disabled, hidden, and static
92990
+ // options (e.g. `static nomatch` placeholders). Checked BEFORE mutating
92991
+ // the buffer.
92992
+ const options = getActiveOptions(this.menu);
92993
+ if (!options.length) {
92994
+ this._clearTypeaheadBuffer();
92995
+ return;
92996
+ }
92559
92997
 
92560
- // Set last letter for tracking
92561
- this.lastLetter = key;
92998
+ const key = _key.toLowerCase();
92562
92999
 
92563
- // Get all the options that start with the last letter pressed
92564
- const letterOptions = this.menu.options.filter((option) => {
92565
- const optionText = option.value || '';
92566
- return optionText.toLowerCase().startsWith(this.lastLetter);
92567
- });
93000
+ // Reset the buffer after a period of inactivity
93001
+ if (this._typeaheadTimeout) {
93002
+ clearTimeout(this._typeaheadTimeout);
93003
+ }
93004
+ this._typeaheadTimeout = setTimeout(() => {
93005
+ this._clearTypeaheadBuffer();
93006
+ }, this.typeaheadTimeoutMs);
92568
93007
 
92569
- // If we have options that match the letter pressed
92570
- if (letterOptions.length) {
93008
+ this.typeaheadBuffer += key;
92571
93009
 
92572
- // Show the dropdown if it is not already visible
92573
- this.dropdown.show();
93010
+ const isRepeatedChar = this.typeaheadBuffer.length > 1 && new Set(this.typeaheadBuffer).size === 1;
92574
93011
 
92575
- // Get the index we're after based on how many times the letter has been pressed and the length of the letterOptions array
92576
- const index = this.sameLetterTimes < letterOptions.length ? this.sameLetterTimes : this.sameLetterTimes % letterOptions.length;
93012
+ let match = null;
93013
+ if (isRepeatedChar) {
93014
+ const matches = options.filter((option) => this._getOptionDisplayText(option).startsWith(key));
93015
+ if (matches.length) {
93016
+ const cycleIndex = (this.typeaheadBuffer.length - 1) % matches.length;
93017
+ match = matches[cycleIndex];
93018
+ }
93019
+ } else {
93020
+ match = options.find((option) => this._getOptionDisplayText(option).startsWith(this.typeaheadBuffer));
93021
+ }
92577
93022
 
92578
- // Select the new option in the menu
92579
- const newOption = letterOptions[index];
92580
- this.menu.updateActiveOption(newOption);
93023
+ if (match) {
93024
+ if (!this.dropdown.isPopoverVisible) {
93025
+ this.dropdown.show();
93026
+ }
93027
+ this.menu.updateActiveOption(match);
92581
93028
  }
92582
93029
  }
92583
93030
 
@@ -92691,6 +93138,11 @@ class AuroSelect extends AuroElement$1 {
92691
93138
  }
92692
93139
  }
92693
93140
 
93141
+ disconnectedCallback() {
93142
+ super.disconnectedCallback();
93143
+ this._clearTypeaheadBuffer();
93144
+ }
93145
+
92694
93146
  // lifecycle runs only after the element's DOM has been updated the first time
92695
93147
  firstUpdated() {
92696
93148
  // Add the tag name as an attribute if it is different than the component name