@aurodesignsystem-dev/auro-formkit 0.0.0-pr1595.4 → 0.0.0-pr1595.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/components/checkbox/demo/customize.min.js +1 -1
  2. package/components/checkbox/demo/getting-started.min.js +1 -1
  3. package/components/checkbox/demo/index.min.js +1 -1
  4. package/components/checkbox/dist/index.js +1 -1
  5. package/components/checkbox/dist/registered.js +1 -1
  6. package/components/combobox/demo/customize.min.js +67 -7
  7. package/components/combobox/demo/getting-started.min.js +67 -7
  8. package/components/combobox/demo/index.min.js +67 -7
  9. package/components/combobox/dist/index.js +67 -7
  10. package/components/combobox/dist/registered.js +67 -7
  11. package/components/counter/demo/customize.min.js +66 -6
  12. package/components/counter/demo/index.min.js +66 -6
  13. package/components/counter/dist/index.js +66 -6
  14. package/components/counter/dist/registered.js +66 -6
  15. package/components/datepicker/demo/customize.min.js +67 -7
  16. package/components/datepicker/demo/index.min.js +67 -7
  17. package/components/datepicker/dist/index.js +67 -7
  18. package/components/datepicker/dist/registered.js +67 -7
  19. package/components/dropdown/demo/customize.min.js +65 -5
  20. package/components/dropdown/demo/getting-started.min.js +66 -6
  21. package/components/dropdown/demo/index.min.js +65 -5
  22. package/components/dropdown/dist/index.js +65 -5
  23. package/components/dropdown/dist/registered.js +65 -5
  24. package/components/form/demo/customize.min.js +269 -29
  25. package/components/form/demo/getting-started.min.js +269 -29
  26. package/components/form/demo/index.min.js +269 -29
  27. package/components/form/demo/registerDemoDeps.min.js +269 -29
  28. package/components/input/demo/customize.min.js +1 -1
  29. package/components/input/demo/getting-started.min.js +1 -1
  30. package/components/input/demo/index.min.js +1 -1
  31. package/components/input/dist/index.js +1 -1
  32. package/components/input/dist/registered.js +1 -1
  33. package/components/radio/demo/customize.min.js +1 -1
  34. package/components/radio/demo/getting-started.min.js +1 -1
  35. package/components/radio/demo/index.min.js +1 -1
  36. package/components/radio/dist/index.js +1 -1
  37. package/components/radio/dist/registered.js +1 -1
  38. package/components/select/demo/customize.min.js +66 -6
  39. package/components/select/demo/getting-started.min.js +66 -6
  40. package/components/select/demo/index.min.js +66 -6
  41. package/components/select/dist/index.js +66 -6
  42. package/components/select/dist/registered.js +66 -6
  43. package/package.json +2 -2
@@ -1127,7 +1127,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
1127
1127
  }
1128
1128
  };
1129
1129
 
1130
- var formkitVersion$1 = '202608300149';
1130
+ var formkitVersion$1 = '202608300411';
1131
1131
 
1132
1132
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1133
1133
  // See LICENSE in the project root for license information.
@@ -3669,15 +3669,57 @@ class AuroFloatingUI {
3669
3669
  document.body.style.top = `-${this._savedScrollY}px`;
3670
3670
  document.body.style.width = "100%";
3671
3671
 
3672
- // Move `bib` by the amount the viewport is shifted to stay aligned in fullscreen.
3673
- if (element?.bib && window?.visualViewport?.offsetTop) {
3674
- element.bib.style.transform = `translateY(${window?.visualViewport?.offsetTop}px)`;
3672
+ // Keep the bib aligned with the visual viewport as the VKB opens.
3673
+ // A one-shot offsetTop check at lock time is stale by the time the user
3674
+ // taps an input mid-drawer — iOS then pans visualViewport upward and the
3675
+ // bib drifts off-screen. Listen continuously so the transform tracks the pan.
3676
+ // RAF-throttled to avoid a style recalc on every scroll tick during the
3677
+ // keyboard animation; the pending frame is canceled on unlock so it cannot
3678
+ // reapply a translate after bibTransform has been restored.
3679
+ if (window.visualViewport) {
3680
+ this._viewportRafId = undefined;
3681
+ this._viewportHandler = () => {
3682
+ if (this._viewportRafId !== undefined) {
3683
+ return;
3684
+ }
3685
+ this._viewportRafId = requestAnimationFrame(() => {
3686
+ this._viewportRafId = undefined;
3687
+ if (element?.bib) {
3688
+ element.bib.style.transform = `translateY(${window.visualViewport.offsetTop}px)`;
3689
+ }
3690
+ });
3691
+ };
3692
+ window.visualViewport.addEventListener(
3693
+ "resize",
3694
+ this._viewportHandler,
3695
+ );
3696
+ window.visualViewport.addEventListener(
3697
+ "scroll",
3698
+ this._viewportHandler,
3699
+ );
3700
+ this._viewportHandler();
3675
3701
  }
3676
3702
 
3677
3703
  this.lockTouchScroll(true);
3678
3704
  }
3679
3705
  } else {
3680
3706
  if (this._scrollLocked) {
3707
+ if (this._viewportHandler && window.visualViewport) {
3708
+ window.visualViewport.removeEventListener(
3709
+ "resize",
3710
+ this._viewportHandler,
3711
+ );
3712
+ window.visualViewport.removeEventListener(
3713
+ "scroll",
3714
+ this._viewportHandler,
3715
+ );
3716
+ this._viewportHandler = undefined;
3717
+ }
3718
+ if (this._viewportRafId !== undefined) {
3719
+ cancelAnimationFrame(this._viewportRafId);
3720
+ this._viewportRafId = undefined;
3721
+ }
3722
+
3681
3723
  document.documentElement.style.scrollbarGutter =
3682
3724
  this._savedScrollStyles?.rootScrollbarGutter ?? "";
3683
3725
  document.documentElement.style.overflow =
@@ -3769,7 +3811,7 @@ class AuroFloatingUI {
3769
3811
  bibContent.style.width = "";
3770
3812
  bibContent.style.height = "";
3771
3813
  bibContent.style.maxWidth = "";
3772
- bibContent.style.maxHeight = `${window?.visualViewport?.height}px`;
3814
+ bibContent.style.maxHeight = "";
3773
3815
  this.configureTrial = 0;
3774
3816
  } else if (this.configureTrial < MAX_CONFIGURATION_COUNT) {
3775
3817
  this.configureTrial += 1;
@@ -4066,6 +4108,24 @@ class AuroFloatingUI {
4066
4108
  if (!this.showing) {
4067
4109
  if (!element.modal) {
4068
4110
  this.setupHideHandlers();
4111
+ } else {
4112
+ if (this.keyDownHandler) {
4113
+ document.removeEventListener("keydown", this.keyDownHandler);
4114
+ }
4115
+ this.keyDownHandler = (evt) => {
4116
+ if (evt.key === "Escape" && element.isPopoverVisible) {
4117
+ // Intercept at keydown so CloseWatcher never sees the keystroke.
4118
+ // Canceling `cancel` alone is insufficient — a second Esc with no
4119
+ // intervening user activation triggers the anti-trap and fires `close`
4120
+ // directly, bypassing any `cancel` preventDefault (AB#1613688).
4121
+ // stopImmediatePropagation is intentional: it prevents other document
4122
+ // keydown handlers (e.g. consumer code, auro-dialog) from also acting
4123
+ // on Escape while the modal owns the key.
4124
+ evt.preventDefault();
4125
+ evt.stopImmediatePropagation();
4126
+ }
4127
+ };
4128
+ document.addEventListener("keydown", this.keyDownHandler);
4069
4129
  }
4070
4130
  this.showing = true;
4071
4131
  element.isPopoverVisible = true;
@@ -5339,7 +5399,7 @@ class AuroHelpText extends i$2 {
5339
5399
  }
5340
5400
  }
5341
5401
 
5342
- var formkitVersion = '202608300149';
5402
+ var formkitVersion = '202608300411';
5343
5403
 
5344
5404
  /**
5345
5405
  * AuroElement is the shared base class for layout-aware Auro form components.
@@ -1127,7 +1127,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
1127
1127
  }
1128
1128
  };
1129
1129
 
1130
- var formkitVersion$1 = '202608300149';
1130
+ var formkitVersion$1 = '202608300411';
1131
1131
 
1132
1132
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1133
1133
  // See LICENSE in the project root for license information.
@@ -3669,15 +3669,57 @@ class AuroFloatingUI {
3669
3669
  document.body.style.top = `-${this._savedScrollY}px`;
3670
3670
  document.body.style.width = "100%";
3671
3671
 
3672
- // Move `bib` by the amount the viewport is shifted to stay aligned in fullscreen.
3673
- if (element?.bib && window?.visualViewport?.offsetTop) {
3674
- element.bib.style.transform = `translateY(${window?.visualViewport?.offsetTop}px)`;
3672
+ // Keep the bib aligned with the visual viewport as the VKB opens.
3673
+ // A one-shot offsetTop check at lock time is stale by the time the user
3674
+ // taps an input mid-drawer — iOS then pans visualViewport upward and the
3675
+ // bib drifts off-screen. Listen continuously so the transform tracks the pan.
3676
+ // RAF-throttled to avoid a style recalc on every scroll tick during the
3677
+ // keyboard animation; the pending frame is canceled on unlock so it cannot
3678
+ // reapply a translate after bibTransform has been restored.
3679
+ if (window.visualViewport) {
3680
+ this._viewportRafId = undefined;
3681
+ this._viewportHandler = () => {
3682
+ if (this._viewportRafId !== undefined) {
3683
+ return;
3684
+ }
3685
+ this._viewportRafId = requestAnimationFrame(() => {
3686
+ this._viewportRafId = undefined;
3687
+ if (element?.bib) {
3688
+ element.bib.style.transform = `translateY(${window.visualViewport.offsetTop}px)`;
3689
+ }
3690
+ });
3691
+ };
3692
+ window.visualViewport.addEventListener(
3693
+ "resize",
3694
+ this._viewportHandler,
3695
+ );
3696
+ window.visualViewport.addEventListener(
3697
+ "scroll",
3698
+ this._viewportHandler,
3699
+ );
3700
+ this._viewportHandler();
3675
3701
  }
3676
3702
 
3677
3703
  this.lockTouchScroll(true);
3678
3704
  }
3679
3705
  } else {
3680
3706
  if (this._scrollLocked) {
3707
+ if (this._viewportHandler && window.visualViewport) {
3708
+ window.visualViewport.removeEventListener(
3709
+ "resize",
3710
+ this._viewportHandler,
3711
+ );
3712
+ window.visualViewport.removeEventListener(
3713
+ "scroll",
3714
+ this._viewportHandler,
3715
+ );
3716
+ this._viewportHandler = undefined;
3717
+ }
3718
+ if (this._viewportRafId !== undefined) {
3719
+ cancelAnimationFrame(this._viewportRafId);
3720
+ this._viewportRafId = undefined;
3721
+ }
3722
+
3681
3723
  document.documentElement.style.scrollbarGutter =
3682
3724
  this._savedScrollStyles?.rootScrollbarGutter ?? "";
3683
3725
  document.documentElement.style.overflow =
@@ -3769,7 +3811,7 @@ class AuroFloatingUI {
3769
3811
  bibContent.style.width = "";
3770
3812
  bibContent.style.height = "";
3771
3813
  bibContent.style.maxWidth = "";
3772
- bibContent.style.maxHeight = `${window?.visualViewport?.height}px`;
3814
+ bibContent.style.maxHeight = "";
3773
3815
  this.configureTrial = 0;
3774
3816
  } else if (this.configureTrial < MAX_CONFIGURATION_COUNT) {
3775
3817
  this.configureTrial += 1;
@@ -4066,6 +4108,24 @@ class AuroFloatingUI {
4066
4108
  if (!this.showing) {
4067
4109
  if (!element.modal) {
4068
4110
  this.setupHideHandlers();
4111
+ } else {
4112
+ if (this.keyDownHandler) {
4113
+ document.removeEventListener("keydown", this.keyDownHandler);
4114
+ }
4115
+ this.keyDownHandler = (evt) => {
4116
+ if (evt.key === "Escape" && element.isPopoverVisible) {
4117
+ // Intercept at keydown so CloseWatcher never sees the keystroke.
4118
+ // Canceling `cancel` alone is insufficient — a second Esc with no
4119
+ // intervening user activation triggers the anti-trap and fires `close`
4120
+ // directly, bypassing any `cancel` preventDefault (AB#1613688).
4121
+ // stopImmediatePropagation is intentional: it prevents other document
4122
+ // keydown handlers (e.g. consumer code, auro-dialog) from also acting
4123
+ // on Escape while the modal owns the key.
4124
+ evt.preventDefault();
4125
+ evt.stopImmediatePropagation();
4126
+ }
4127
+ };
4128
+ document.addEventListener("keydown", this.keyDownHandler);
4069
4129
  }
4070
4130
  this.showing = true;
4071
4131
  element.isPopoverVisible = true;
@@ -5339,7 +5399,7 @@ class AuroHelpText extends i$2 {
5339
5399
  }
5340
5400
  }
5341
5401
 
5342
- var formkitVersion = '202608300149';
5402
+ var formkitVersion = '202608300411';
5343
5403
 
5344
5404
  /**
5345
5405
  * AuroElement is the shared base class for layout-aware Auro form components.
@@ -1077,7 +1077,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
1077
1077
  }
1078
1078
  };
1079
1079
 
1080
- var formkitVersion$1 = '202608300149';
1080
+ var formkitVersion$1 = '202608300411';
1081
1081
 
1082
1082
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1083
1083
  // See LICENSE in the project root for license information.
@@ -3601,15 +3601,57 @@ class AuroFloatingUI {
3601
3601
  document.body.style.top = `-${this._savedScrollY}px`;
3602
3602
  document.body.style.width = "100%";
3603
3603
 
3604
- // Move `bib` by the amount the viewport is shifted to stay aligned in fullscreen.
3605
- if (element?.bib && window?.visualViewport?.offsetTop) {
3606
- element.bib.style.transform = `translateY(${window?.visualViewport?.offsetTop}px)`;
3604
+ // Keep the bib aligned with the visual viewport as the VKB opens.
3605
+ // A one-shot offsetTop check at lock time is stale by the time the user
3606
+ // taps an input mid-drawer — iOS then pans visualViewport upward and the
3607
+ // bib drifts off-screen. Listen continuously so the transform tracks the pan.
3608
+ // RAF-throttled to avoid a style recalc on every scroll tick during the
3609
+ // keyboard animation; the pending frame is canceled on unlock so it cannot
3610
+ // reapply a translate after bibTransform has been restored.
3611
+ if (window.visualViewport) {
3612
+ this._viewportRafId = undefined;
3613
+ this._viewportHandler = () => {
3614
+ if (this._viewportRafId !== undefined) {
3615
+ return;
3616
+ }
3617
+ this._viewportRafId = requestAnimationFrame(() => {
3618
+ this._viewportRafId = undefined;
3619
+ if (element?.bib) {
3620
+ element.bib.style.transform = `translateY(${window.visualViewport.offsetTop}px)`;
3621
+ }
3622
+ });
3623
+ };
3624
+ window.visualViewport.addEventListener(
3625
+ "resize",
3626
+ this._viewportHandler,
3627
+ );
3628
+ window.visualViewport.addEventListener(
3629
+ "scroll",
3630
+ this._viewportHandler,
3631
+ );
3632
+ this._viewportHandler();
3607
3633
  }
3608
3634
 
3609
3635
  this.lockTouchScroll(true);
3610
3636
  }
3611
3637
  } else {
3612
3638
  if (this._scrollLocked) {
3639
+ if (this._viewportHandler && window.visualViewport) {
3640
+ window.visualViewport.removeEventListener(
3641
+ "resize",
3642
+ this._viewportHandler,
3643
+ );
3644
+ window.visualViewport.removeEventListener(
3645
+ "scroll",
3646
+ this._viewportHandler,
3647
+ );
3648
+ this._viewportHandler = undefined;
3649
+ }
3650
+ if (this._viewportRafId !== undefined) {
3651
+ cancelAnimationFrame(this._viewportRafId);
3652
+ this._viewportRafId = undefined;
3653
+ }
3654
+
3613
3655
  document.documentElement.style.scrollbarGutter =
3614
3656
  this._savedScrollStyles?.rootScrollbarGutter ?? "";
3615
3657
  document.documentElement.style.overflow =
@@ -3701,7 +3743,7 @@ class AuroFloatingUI {
3701
3743
  bibContent.style.width = "";
3702
3744
  bibContent.style.height = "";
3703
3745
  bibContent.style.maxWidth = "";
3704
- bibContent.style.maxHeight = `${window?.visualViewport?.height}px`;
3746
+ bibContent.style.maxHeight = "";
3705
3747
  this.configureTrial = 0;
3706
3748
  } else if (this.configureTrial < MAX_CONFIGURATION_COUNT) {
3707
3749
  this.configureTrial += 1;
@@ -3998,6 +4040,24 @@ class AuroFloatingUI {
3998
4040
  if (!this.showing) {
3999
4041
  if (!element.modal) {
4000
4042
  this.setupHideHandlers();
4043
+ } else {
4044
+ if (this.keyDownHandler) {
4045
+ document.removeEventListener("keydown", this.keyDownHandler);
4046
+ }
4047
+ this.keyDownHandler = (evt) => {
4048
+ if (evt.key === "Escape" && element.isPopoverVisible) {
4049
+ // Intercept at keydown so CloseWatcher never sees the keystroke.
4050
+ // Canceling `cancel` alone is insufficient — a second Esc with no
4051
+ // intervening user activation triggers the anti-trap and fires `close`
4052
+ // directly, bypassing any `cancel` preventDefault (AB#1613688).
4053
+ // stopImmediatePropagation is intentional: it prevents other document
4054
+ // keydown handlers (e.g. consumer code, auro-dialog) from also acting
4055
+ // on Escape while the modal owns the key.
4056
+ evt.preventDefault();
4057
+ evt.stopImmediatePropagation();
4058
+ }
4059
+ };
4060
+ document.addEventListener("keydown", this.keyDownHandler);
4001
4061
  }
4002
4062
  this.showing = true;
4003
4063
  element.isPopoverVisible = true;
@@ -5271,7 +5331,7 @@ class AuroHelpText extends LitElement {
5271
5331
  }
5272
5332
  }
5273
5333
 
5274
- var formkitVersion = '202608300149';
5334
+ var formkitVersion = '202608300411';
5275
5335
 
5276
5336
  /**
5277
5337
  * AuroElement is the shared base class for layout-aware Auro form components.
@@ -1077,7 +1077,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
1077
1077
  }
1078
1078
  };
1079
1079
 
1080
- var formkitVersion$1 = '202608300149';
1080
+ var formkitVersion$1 = '202608300411';
1081
1081
 
1082
1082
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1083
1083
  // See LICENSE in the project root for license information.
@@ -3601,15 +3601,57 @@ class AuroFloatingUI {
3601
3601
  document.body.style.top = `-${this._savedScrollY}px`;
3602
3602
  document.body.style.width = "100%";
3603
3603
 
3604
- // Move `bib` by the amount the viewport is shifted to stay aligned in fullscreen.
3605
- if (element?.bib && window?.visualViewport?.offsetTop) {
3606
- element.bib.style.transform = `translateY(${window?.visualViewport?.offsetTop}px)`;
3604
+ // Keep the bib aligned with the visual viewport as the VKB opens.
3605
+ // A one-shot offsetTop check at lock time is stale by the time the user
3606
+ // taps an input mid-drawer — iOS then pans visualViewport upward and the
3607
+ // bib drifts off-screen. Listen continuously so the transform tracks the pan.
3608
+ // RAF-throttled to avoid a style recalc on every scroll tick during the
3609
+ // keyboard animation; the pending frame is canceled on unlock so it cannot
3610
+ // reapply a translate after bibTransform has been restored.
3611
+ if (window.visualViewport) {
3612
+ this._viewportRafId = undefined;
3613
+ this._viewportHandler = () => {
3614
+ if (this._viewportRafId !== undefined) {
3615
+ return;
3616
+ }
3617
+ this._viewportRafId = requestAnimationFrame(() => {
3618
+ this._viewportRafId = undefined;
3619
+ if (element?.bib) {
3620
+ element.bib.style.transform = `translateY(${window.visualViewport.offsetTop}px)`;
3621
+ }
3622
+ });
3623
+ };
3624
+ window.visualViewport.addEventListener(
3625
+ "resize",
3626
+ this._viewportHandler,
3627
+ );
3628
+ window.visualViewport.addEventListener(
3629
+ "scroll",
3630
+ this._viewportHandler,
3631
+ );
3632
+ this._viewportHandler();
3607
3633
  }
3608
3634
 
3609
3635
  this.lockTouchScroll(true);
3610
3636
  }
3611
3637
  } else {
3612
3638
  if (this._scrollLocked) {
3639
+ if (this._viewportHandler && window.visualViewport) {
3640
+ window.visualViewport.removeEventListener(
3641
+ "resize",
3642
+ this._viewportHandler,
3643
+ );
3644
+ window.visualViewport.removeEventListener(
3645
+ "scroll",
3646
+ this._viewportHandler,
3647
+ );
3648
+ this._viewportHandler = undefined;
3649
+ }
3650
+ if (this._viewportRafId !== undefined) {
3651
+ cancelAnimationFrame(this._viewportRafId);
3652
+ this._viewportRafId = undefined;
3653
+ }
3654
+
3613
3655
  document.documentElement.style.scrollbarGutter =
3614
3656
  this._savedScrollStyles?.rootScrollbarGutter ?? "";
3615
3657
  document.documentElement.style.overflow =
@@ -3701,7 +3743,7 @@ class AuroFloatingUI {
3701
3743
  bibContent.style.width = "";
3702
3744
  bibContent.style.height = "";
3703
3745
  bibContent.style.maxWidth = "";
3704
- bibContent.style.maxHeight = `${window?.visualViewport?.height}px`;
3746
+ bibContent.style.maxHeight = "";
3705
3747
  this.configureTrial = 0;
3706
3748
  } else if (this.configureTrial < MAX_CONFIGURATION_COUNT) {
3707
3749
  this.configureTrial += 1;
@@ -3998,6 +4040,24 @@ class AuroFloatingUI {
3998
4040
  if (!this.showing) {
3999
4041
  if (!element.modal) {
4000
4042
  this.setupHideHandlers();
4043
+ } else {
4044
+ if (this.keyDownHandler) {
4045
+ document.removeEventListener("keydown", this.keyDownHandler);
4046
+ }
4047
+ this.keyDownHandler = (evt) => {
4048
+ if (evt.key === "Escape" && element.isPopoverVisible) {
4049
+ // Intercept at keydown so CloseWatcher never sees the keystroke.
4050
+ // Canceling `cancel` alone is insufficient — a second Esc with no
4051
+ // intervening user activation triggers the anti-trap and fires `close`
4052
+ // directly, bypassing any `cancel` preventDefault (AB#1613688).
4053
+ // stopImmediatePropagation is intentional: it prevents other document
4054
+ // keydown handlers (e.g. consumer code, auro-dialog) from also acting
4055
+ // on Escape while the modal owns the key.
4056
+ evt.preventDefault();
4057
+ evt.stopImmediatePropagation();
4058
+ }
4059
+ };
4060
+ document.addEventListener("keydown", this.keyDownHandler);
4001
4061
  }
4002
4062
  this.showing = true;
4003
4063
  element.isPopoverVisible = true;
@@ -5271,7 +5331,7 @@ class AuroHelpText extends LitElement {
5271
5331
  }
5272
5332
  }
5273
5333
 
5274
- var formkitVersion = '202608300149';
5334
+ var formkitVersion = '202608300411';
5275
5335
 
5276
5336
  /**
5277
5337
  * AuroElement is the shared base class for layout-aware Auro form components.
@@ -13825,7 +13825,7 @@ class AuroBibtemplate extends i$1 {
13825
13825
  }
13826
13826
  }
13827
13827
 
13828
- var formkitVersion$2 = '202608300149';
13828
+ var formkitVersion$2 = '202608300411';
13829
13829
 
13830
13830
  let l$1 = 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$5`${s$5(r)}`;return customElements.get(r)||customElements.define(r,class extends a{}),i}};let d$1 = 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$4 = 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$3=i$3`: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}
13831
13831
  `,u$6=i$3`.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}}
@@ -17963,15 +17963,57 @@ class AuroFloatingUI {
17963
17963
  document.body.style.top = `-${this._savedScrollY}px`;
17964
17964
  document.body.style.width = "100%";
17965
17965
 
17966
- // Move `bib` by the amount the viewport is shifted to stay aligned in fullscreen.
17967
- if (element?.bib && window?.visualViewport?.offsetTop) {
17968
- element.bib.style.transform = `translateY(${window?.visualViewport?.offsetTop}px)`;
17966
+ // Keep the bib aligned with the visual viewport as the VKB opens.
17967
+ // A one-shot offsetTop check at lock time is stale by the time the user
17968
+ // taps an input mid-drawer — iOS then pans visualViewport upward and the
17969
+ // bib drifts off-screen. Listen continuously so the transform tracks the pan.
17970
+ // RAF-throttled to avoid a style recalc on every scroll tick during the
17971
+ // keyboard animation; the pending frame is canceled on unlock so it cannot
17972
+ // reapply a translate after bibTransform has been restored.
17973
+ if (window.visualViewport) {
17974
+ this._viewportRafId = undefined;
17975
+ this._viewportHandler = () => {
17976
+ if (this._viewportRafId !== undefined) {
17977
+ return;
17978
+ }
17979
+ this._viewportRafId = requestAnimationFrame(() => {
17980
+ this._viewportRafId = undefined;
17981
+ if (element?.bib) {
17982
+ element.bib.style.transform = `translateY(${window.visualViewport.offsetTop}px)`;
17983
+ }
17984
+ });
17985
+ };
17986
+ window.visualViewport.addEventListener(
17987
+ "resize",
17988
+ this._viewportHandler,
17989
+ );
17990
+ window.visualViewport.addEventListener(
17991
+ "scroll",
17992
+ this._viewportHandler,
17993
+ );
17994
+ this._viewportHandler();
17969
17995
  }
17970
17996
 
17971
17997
  this.lockTouchScroll(true);
17972
17998
  }
17973
17999
  } else {
17974
18000
  if (this._scrollLocked) {
18001
+ if (this._viewportHandler && window.visualViewport) {
18002
+ window.visualViewport.removeEventListener(
18003
+ "resize",
18004
+ this._viewportHandler,
18005
+ );
18006
+ window.visualViewport.removeEventListener(
18007
+ "scroll",
18008
+ this._viewportHandler,
18009
+ );
18010
+ this._viewportHandler = undefined;
18011
+ }
18012
+ if (this._viewportRafId !== undefined) {
18013
+ cancelAnimationFrame(this._viewportRafId);
18014
+ this._viewportRafId = undefined;
18015
+ }
18016
+
17975
18017
  document.documentElement.style.scrollbarGutter =
17976
18018
  this._savedScrollStyles?.rootScrollbarGutter ?? "";
17977
18019
  document.documentElement.style.overflow =
@@ -18063,7 +18105,7 @@ class AuroFloatingUI {
18063
18105
  bibContent.style.width = "";
18064
18106
  bibContent.style.height = "";
18065
18107
  bibContent.style.maxWidth = "";
18066
- bibContent.style.maxHeight = `${window?.visualViewport?.height}px`;
18108
+ bibContent.style.maxHeight = "";
18067
18109
  this.configureTrial = 0;
18068
18110
  } else if (this.configureTrial < MAX_CONFIGURATION_COUNT) {
18069
18111
  this.configureTrial += 1;
@@ -18360,6 +18402,24 @@ class AuroFloatingUI {
18360
18402
  if (!this.showing) {
18361
18403
  if (!element.modal) {
18362
18404
  this.setupHideHandlers();
18405
+ } else {
18406
+ if (this.keyDownHandler) {
18407
+ document.removeEventListener("keydown", this.keyDownHandler);
18408
+ }
18409
+ this.keyDownHandler = (evt) => {
18410
+ if (evt.key === "Escape" && element.isPopoverVisible) {
18411
+ // Intercept at keydown so CloseWatcher never sees the keystroke.
18412
+ // Canceling `cancel` alone is insufficient — a second Esc with no
18413
+ // intervening user activation triggers the anti-trap and fires `close`
18414
+ // directly, bypassing any `cancel` preventDefault (AB#1613688).
18415
+ // stopImmediatePropagation is intentional: it prevents other document
18416
+ // keydown handlers (e.g. consumer code, auro-dialog) from also acting
18417
+ // on Escape while the modal owns the key.
18418
+ evt.preventDefault();
18419
+ evt.stopImmediatePropagation();
18420
+ }
18421
+ };
18422
+ document.addEventListener("keydown", this.keyDownHandler);
18363
18423
  }
18364
18424
  this.showing = true;
18365
18425
  element.isPopoverVisible = true;
@@ -19633,7 +19693,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$1 {
19633
19693
  }
19634
19694
  };
19635
19695
 
19636
- var formkitVersion$1 = '202608300149';
19696
+ var formkitVersion$1 = '202608300411';
19637
19697
 
19638
19698
  /**
19639
19699
  * AuroElement is the shared base class for layout-aware Auro form components.
@@ -33502,7 +33562,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$1 {
33502
33562
  }
33503
33563
  };
33504
33564
 
33505
- var formkitVersion = '202608300149';
33565
+ var formkitVersion = '202608300411';
33506
33566
 
33507
33567
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
33508
33568
  // See LICENSE in the project root for license information.