@aurodesignsystem/auro-formkit 2.1.0-beta.2 → 2.1.0-beta.4

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 (48) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/components/checkbox/README.md +1 -1
  3. package/components/checkbox/demo/readme.md +1 -1
  4. package/components/combobox/README.md +1 -1
  5. package/components/combobox/demo/api.min.js +50 -8
  6. package/components/combobox/demo/index.min.js +50 -8
  7. package/components/combobox/demo/readme.md +1 -1
  8. package/components/combobox/dist/index.js +50 -8
  9. package/components/combobox/dist/registered.js +50 -8
  10. package/components/counter/README.md +1 -1
  11. package/components/counter/demo/api.min.js +50 -8
  12. package/components/counter/demo/index.min.js +50 -8
  13. package/components/counter/demo/readme.md +1 -1
  14. package/components/counter/dist/index.js +50 -8
  15. package/components/counter/dist/registered.js +50 -8
  16. package/components/datepicker/README.md +1 -1
  17. package/components/datepicker/demo/api.md +4 -0
  18. package/components/datepicker/demo/api.min.js +86 -19
  19. package/components/datepicker/demo/index.min.js +86 -19
  20. package/components/datepicker/demo/readme.md +1 -1
  21. package/components/datepicker/dist/index.js +86 -19
  22. package/components/datepicker/dist/registered.js +86 -19
  23. package/components/datepicker/dist/utilities.d.ts +7 -0
  24. package/components/dropdown/README.md +1 -1
  25. package/components/dropdown/demo/api.md +1 -1
  26. package/components/dropdown/demo/api.min.js +50 -8
  27. package/components/dropdown/demo/index.min.js +50 -8
  28. package/components/dropdown/demo/readme.md +1 -1
  29. package/components/dropdown/dist/auro-dropdown.d.ts +17 -1
  30. package/components/dropdown/dist/index.js +50 -8
  31. package/components/dropdown/dist/registered.js +50 -8
  32. package/components/form/README.md +1 -1
  33. package/components/form/demo/readme.md +1 -1
  34. package/components/input/README.md +1 -1
  35. package/components/input/demo/readme.md +1 -1
  36. package/components/menu/README.md +1 -1
  37. package/components/menu/demo/readme.md +1 -1
  38. package/components/radio/README.md +1 -1
  39. package/components/radio/demo/readme.md +1 -1
  40. package/components/select/README.md +2 -1
  41. package/components/select/demo/api.md +22 -0
  42. package/components/select/demo/api.min.js +50 -8
  43. package/components/select/demo/index.md +14 -0
  44. package/components/select/demo/index.min.js +50 -8
  45. package/components/select/demo/readme.md +2 -1
  46. package/components/select/dist/index.js +50 -8
  47. package/components/select/dist/registered.js +50 -8
  48. package/package.json +3 -3
@@ -725,7 +725,7 @@ class AuroDatepickerUtilities {
725
725
  validDateStr(date, format) {
726
726
  const dateStrLength = 10;
727
727
 
728
- if (date.length === dateStrLength && Date.parse(this.toNorthAmericanFormat(date, format))) {
728
+ if (format !== undefined && date !== undefined && date.length === dateStrLength && Date.parse(this.toNorthAmericanFormat(date, format))) {
729
729
  return true;
730
730
  }
731
731
 
@@ -866,12 +866,21 @@ class AuroDatepickerUtilities {
866
866
  */
867
867
  getDateAsString(date) {
868
868
  const year = new Date(date).getFullYear();
869
- const month = new Date(date).getMonth() + 1;
870
- const day = new Date(date).getDate();
869
+ const month = this.formatTwoDigits(new Date(date).getMonth() + 1);
870
+ const day = this.formatTwoDigits(new Date(date).getDate());
871
871
 
872
- const dateStr = `${month}/${day}/${year}`;
872
+ return `${month}/${day}/${year}`;
873
+ }
873
874
 
874
- return dateStr;
875
+ /**
876
+ * Function to format a number to two digits.
877
+ * @private
878
+ * @param {Number} num - Number to format.
879
+ * @returns {String} Returns the number as a string.
880
+ */
881
+ formatTwoDigits(num) {
882
+ const singleDigitThreshold = 10;
883
+ return num < singleDigitThreshold ? `0${num}` : num;
875
884
  }
876
885
 
877
886
  /**
@@ -10571,10 +10580,23 @@ class CalendarUtilities {
10571
10580
  increment = -1; // eslint-disable-line no-magic-numbers
10572
10581
  }
10573
10582
 
10574
- // calculate the new central date
10575
- const newCentralDate = new Date(elem.centralDate).setMonth(new Date(elem.centralDate).getMonth() + increment);
10576
- // set the new central date to the first day of the month
10577
- elem.centralDate = this.util.convertDateToFirstOfMonth(newCentralDate);
10583
+ // Get new central date for calendar view
10584
+ const {firstRenderedMonth, centralDate, datepicker} = elem;
10585
+ const formattedDateStr = this.util.getDateAsString(centralDate, datepicker.format);
10586
+ let newCentralDate = null;
10587
+
10588
+ if (this.util.validDateStr(formattedDateStr, datepicker.format)) {
10589
+ // Use current date as base and adjust month by increment
10590
+ newCentralDate = new Date(formattedDateStr).setMonth(new Date(formattedDateStr).getMonth() + increment);
10591
+ } else {
10592
+ // Fallback to first rendered month if central date invalid
10593
+ newCentralDate = new Date(firstRenderedMonth).setMonth(new Date(firstRenderedMonth).getMonth() + increment);
10594
+ }
10595
+
10596
+ // Update calendar central date
10597
+ if (newCentralDate) {
10598
+ elem.centralDate = this.util.convertDateToFirstOfMonth(newCentralDate);
10599
+ }
10578
10600
  }
10579
10601
  }
10580
10602
 
@@ -12303,9 +12325,12 @@ class AuroCalendar extends RangeDatepicker {
12303
12325
  // Determine which month to render first
12304
12326
  let dateMatches = undefined;
12305
12327
 
12306
- if (!this.isFullscreen && this.centralDate) {
12328
+ if (!this.isFullscreen) {
12329
+
12330
+ const formattedDateStr = this.util.getDateAsString(new Date(this.centralDate), this.datepicker.format);
12331
+
12307
12332
  // On Desktop start the calendar at the central date if it exists, then minDate and finally the current date.
12308
- if (this.centralDate) {
12333
+ if (this.util.validDateStr(formattedDateStr, this.datepicker.format)) {
12309
12334
  dateMatches = this.util.datesMatch(this.firstRenderedMonth, this.util.convertDateToFirstOfMonth(this.centralDate));
12310
12335
 
12311
12336
  if (!dateMatches) {
@@ -15126,7 +15151,7 @@ class AuroDropdownBib extends r$3 {
15126
15151
 
15127
15152
  var dropdownVersion$1 = '3.0.0';
15128
15153
 
15129
- var styleCss$1$1 = i$6`:host{position:relative;display:inline-block;max-width:100%}:host([fluid]){display:block}#bibSizer{position:absolute;z-index:-1;opacity:0;pointer-events:none}.label{font-size:var(--ds-text-body-size-xs, 0.75rem);line-height:var(--ds-text-body-size-default, 1rem);transition:font-size .3s cubic-bezier(0.215, 0.61, 0.355, 1);white-space:normal}.label[hasTrigger=false]{font-size:var(--ds-text-body-size-default, 1rem)}.trigger{position:relative;display:flex;align-items:center}.trigger[showBorder]{border-width:1px;border-style:solid;cursor:pointer;outline-style:solid;outline-width:1px}@media(hover: hover){.trigger:hover{cursor:pointer}}.triggerContentWrapper{overflow:hidden;flex:1;text-overflow:ellipsis;white-space:nowrap}#showStateIcon{display:flex;overflow:hidden;height:100%;align-items:center;margin-left:var(--ds-size-100, 0.5rem)}#showStateIcon [auro-icon]{height:var(--ds-size-300, 1.5rem);line-height:var(--ds-size-300, 1.5rem)}#showStateIcon[data-expanded=true] [auro-icon]{transform:rotate(-180deg)}:host([matchwidth]) #bibSizer{width:100%}:host([disabled]){pointer-events:none}:host([inset]) .trigger{padding:var(--ds-size-150, 0.75rem) var(--ds-size-200, 1rem)}:host([common]) .trigger,:host([inset][bordered]) .trigger{padding:var(--ds-size-200, 1rem) var(--ds-size-150, 0.75rem)}:host([common]) .trigger,:host([rounded]) .trigger{border-radius:var(--ds-border-radius, 0.375rem)}`;
15154
+ var styleCss$1$1 = i$6`:host{position:relative;display:inline-block;max-width:100%}:host([fluid]){display:block}#bibSizer{position:absolute;z-index:-1;opacity:0;pointer-events:none}.label{font-size:var(--ds-text-body-size-xs, 0.75rem);line-height:var(--ds-text-body-size-default, 1rem);transition:font-size .3s cubic-bezier(0.215, 0.61, 0.355, 1);white-space:normal}.label[hasTrigger=false]{font-size:var(--ds-text-body-size-default, 1rem)}.trigger{position:relative;display:flex;align-items:center}.trigger[showBorder]{border-width:1px;border-style:solid;cursor:pointer;outline-style:solid;outline-width:1px}@media(hover: hover){.trigger:hover{cursor:pointer}}.triggerContentWrapper{overflow:hidden;flex:1;text-overflow:ellipsis;white-space:nowrap}#showStateIcon{display:flex;overflow:hidden;height:100%;align-items:center;margin-left:var(--ds-size-100, 0.5rem)}#showStateIcon [auro-icon]{height:var(--ds-size-300, 1.5rem);line-height:var(--ds-size-300, 1.5rem)}#showStateIcon[data-expanded=true] [auro-icon]{transform:rotate(-180deg)}:host([matchwidth]) #bibSizer{width:100%}:host([disabled]){pointer-events:none}:host([inset]) .trigger{padding:var(--ds-size-150, 0.75rem) var(--ds-size-200, 1rem)}:host([common]) .trigger,:host([inset][bordered]) .trigger{padding:var(--ds-size-200, 1rem) var(--ds-size-150, 0.75rem)}:host([inset][bordered][labeled]) .trigger{padding:var(--ds-size-100, 0.5rem) var(--ds-size-150, 0.75rem)}:host([common]) .trigger,:host([rounded]) .trigger{border-radius:var(--ds-border-radius, 0.375rem)}`;
15130
15155
 
15131
15156
  var colorCss$1$1 = i$6`.label{color:var(--ds-auro-dropdown-label-text-color)}.trigger{border-color:var(--ds-auro-dropdown-trigger-border-color);background-color:var(--ds-auro-dropdown-trigger-container-color);color:var(--ds-auro-dropdown-trigger-text-color);outline-color:var(--ds-auro-dropdown-trigger-outline-color)}.trigger:focus-within,.trigger:active{--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-active-default, #0074c8);--ds-auro-dropdown-trigger-outline-color: var(--ds-color-border-active-default, #0074c8)}.trigger:focus-within:not(:active){--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-ui-focus-default, #2c67b5);--ds-auro-dropdown-trigger-outline-color: var(--ds-color-border-ui-focus-default, #2c67b5)}.trigger:hover{--ds-auro-dropdown-trigger-container-color: var(--ds-color-container-ui-secondary-hover-default, rgba(0, 0, 0, 0.03))}:host([disabled]){--ds-auro-dropdown-trigger-text-color: var(--ds-color-text-ui-disabled-default, #adadad);--ds-auro-dropdown-label-text-color: var(--ds-color-text-ui-disabled-default, #adadad)}:host([common]),:host([bordered]){--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-primary-default, #585e67)}:host([common]) .trigger:active,:host([common]) .trigger:focus-within,:host([bordered]) .trigger:active,:host([bordered]) .trigger:focus-within{--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-ui-focus-default, #2c67b5)}:host([error]){--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-error-default, #cc1816)}:host([error]) .trigger{outline:solid 1px var(--ds-auro-dropdown-trigger-border-color)}:host([error]) .trigger:focus-within,:host([error]) .trigger:active{--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-active-default, #0074c8)}:host([error]) .trigger:active{box-shadow:none;outline:none}:host([disabled][common]),:host([disabled][bordered]){--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-ui-disabled-default, #adadad)}`;
15132
15157
 
@@ -15390,6 +15415,7 @@ class AuroDropdown extends r$3 {
15390
15415
  this.rounded = false;
15391
15416
  this.tabIndex = 0;
15392
15417
  this.noToggle = false;
15418
+ this.labeled = true;
15393
15419
 
15394
15420
  /**
15395
15421
  * @private
@@ -15542,7 +15568,7 @@ class AuroDropdown extends r$3 {
15542
15568
  },
15543
15569
 
15544
15570
  /**
15545
- * If true, the dropdown bib is taking the fullscreen when it's open
15571
+ * If true, the dropdown bib is taking the fullscreen when it's open.
15546
15572
  */
15547
15573
  isBibFullscreen: {
15548
15574
  type: Boolean,
@@ -15572,6 +15598,15 @@ class AuroDropdown extends r$3 {
15572
15598
  reflect: true
15573
15599
  },
15574
15600
 
15601
+ /**
15602
+ * Defines if there is a label preset.
15603
+ * @private
15604
+ */
15605
+ labeled: {
15606
+ type: Boolean,
15607
+ reflect: true
15608
+ },
15609
+
15575
15610
  /**
15576
15611
  * If declared, the popover and trigger will be set to the same width.
15577
15612
  */
@@ -15651,6 +15686,7 @@ class AuroDropdown extends r$3 {
15651
15686
 
15652
15687
  disconnectedCallback() {
15653
15688
  super.disconnectedCallback();
15689
+ this.floater.disconnect();
15654
15690
  }
15655
15691
 
15656
15692
  updated(changedProperties) {
@@ -15780,13 +15816,21 @@ class AuroDropdown extends r$3 {
15780
15816
  handleTriggerContentSlotChange(event) {
15781
15817
  this.floater.handleTriggerTabIndex();
15782
15818
 
15783
- const triggerContentNodes = this.shadowRoot.querySelector('.triggerContent slot').assignedNodes();
15819
+ const triggerSlot = this.shadowRoot.querySelector('.triggerContent slot');
15820
+
15821
+ if (triggerSlot) {
15784
15822
 
15785
- triggerContentNodes.forEach((node) => {
15786
- if (!this.triggerContentFocusable) {
15787
- this.triggerContentFocusable = this.containsFocusableElement(node);
15823
+ const triggerContentNodes = triggerSlot.assignedNodes();
15824
+
15825
+ if (triggerContentNodes) {
15826
+
15827
+ triggerContentNodes.forEach((node) => {
15828
+ if (!this.triggerContentFocusable) {
15829
+ this.triggerContentFocusable = this.containsFocusableElement(node);
15830
+ }
15831
+ });
15788
15832
  }
15789
- });
15833
+ }
15790
15834
 
15791
15835
  const trigger = this.shadowRoot.querySelector('#trigger');
15792
15836
 
@@ -15840,6 +15884,29 @@ class AuroDropdown extends r$3 {
15840
15884
  }
15841
15885
  }
15842
15886
 
15887
+ /**
15888
+ * @private
15889
+ * @method handleLabelSlotChange
15890
+ * @param {event} event - The event object representing the slot change.
15891
+ * @description Handles the slot change event for the label slot.
15892
+ */
15893
+ handleLabelSlotChange (event) {
15894
+
15895
+ // Get the nodes from the event
15896
+ const nodes = event.target.assignedNodes();
15897
+
15898
+ // Guard clause for no nodes
15899
+ if (!nodes) {
15900
+ return;
15901
+ }
15902
+
15903
+ // Convert the nodes to a measurable array so we can get the length
15904
+ const nodesArr = Array.from(nodes);
15905
+
15906
+ // If the nodes array has a length, the dropdown is labeled
15907
+ this.labeled = nodesArr.length > 0;
15908
+ }
15909
+
15843
15910
  // function that renders the HTML and CSS into the scope of the component
15844
15911
  render() {
15845
15912
  return u$2`
@@ -15854,7 +15921,7 @@ class AuroDropdown extends r$3 {
15854
15921
  >
15855
15922
  <div class="triggerContentWrapper">
15856
15923
  <label class="label" id="triggerLabel" hasTrigger=${this.hasTriggerContent}>
15857
- <slot name="label"></slot>
15924
+ <slot name="label" @slotchange="${this.handleLabelSlotChange}"></slot>
15858
15925
  </label>
15859
15926
  <div class="triggerContent">
15860
15927
  <slot
@@ -466,7 +466,7 @@ class AuroDatepickerUtilities {
466
466
  validDateStr(date, format) {
467
467
  const dateStrLength = 10;
468
468
 
469
- if (date.length === dateStrLength && Date.parse(this.toNorthAmericanFormat(date, format))) {
469
+ if (format !== undefined && date !== undefined && date.length === dateStrLength && Date.parse(this.toNorthAmericanFormat(date, format))) {
470
470
  return true;
471
471
  }
472
472
 
@@ -607,12 +607,21 @@ class AuroDatepickerUtilities {
607
607
  */
608
608
  getDateAsString(date) {
609
609
  const year = new Date(date).getFullYear();
610
- const month = new Date(date).getMonth() + 1;
611
- const day = new Date(date).getDate();
610
+ const month = this.formatTwoDigits(new Date(date).getMonth() + 1);
611
+ const day = this.formatTwoDigits(new Date(date).getDate());
612
612
 
613
- const dateStr = `${month}/${day}/${year}`;
613
+ return `${month}/${day}/${year}`;
614
+ }
614
615
 
615
- return dateStr;
616
+ /**
617
+ * Function to format a number to two digits.
618
+ * @private
619
+ * @param {Number} num - Number to format.
620
+ * @returns {String} Returns the number as a string.
621
+ */
622
+ formatTwoDigits(num) {
623
+ const singleDigitThreshold = 10;
624
+ return num < singleDigitThreshold ? `0${num}` : num;
616
625
  }
617
626
 
618
627
  /**
@@ -10312,10 +10321,23 @@ class CalendarUtilities {
10312
10321
  increment = -1; // eslint-disable-line no-magic-numbers
10313
10322
  }
10314
10323
 
10315
- // calculate the new central date
10316
- const newCentralDate = new Date(elem.centralDate).setMonth(new Date(elem.centralDate).getMonth() + increment);
10317
- // set the new central date to the first day of the month
10318
- elem.centralDate = this.util.convertDateToFirstOfMonth(newCentralDate);
10324
+ // Get new central date for calendar view
10325
+ const {firstRenderedMonth, centralDate, datepicker} = elem;
10326
+ const formattedDateStr = this.util.getDateAsString(centralDate, datepicker.format);
10327
+ let newCentralDate = null;
10328
+
10329
+ if (this.util.validDateStr(formattedDateStr, datepicker.format)) {
10330
+ // Use current date as base and adjust month by increment
10331
+ newCentralDate = new Date(formattedDateStr).setMonth(new Date(formattedDateStr).getMonth() + increment);
10332
+ } else {
10333
+ // Fallback to first rendered month if central date invalid
10334
+ newCentralDate = new Date(firstRenderedMonth).setMonth(new Date(firstRenderedMonth).getMonth() + increment);
10335
+ }
10336
+
10337
+ // Update calendar central date
10338
+ if (newCentralDate) {
10339
+ elem.centralDate = this.util.convertDateToFirstOfMonth(newCentralDate);
10340
+ }
10319
10341
  }
10320
10342
  }
10321
10343
 
@@ -12044,9 +12066,12 @@ class AuroCalendar extends RangeDatepicker {
12044
12066
  // Determine which month to render first
12045
12067
  let dateMatches = undefined;
12046
12068
 
12047
- if (!this.isFullscreen && this.centralDate) {
12069
+ if (!this.isFullscreen) {
12070
+
12071
+ const formattedDateStr = this.util.getDateAsString(new Date(this.centralDate), this.datepicker.format);
12072
+
12048
12073
  // On Desktop start the calendar at the central date if it exists, then minDate and finally the current date.
12049
- if (this.centralDate) {
12074
+ if (this.util.validDateStr(formattedDateStr, this.datepicker.format)) {
12050
12075
  dateMatches = this.util.datesMatch(this.firstRenderedMonth, this.util.convertDateToFirstOfMonth(this.centralDate));
12051
12076
 
12052
12077
  if (!dateMatches) {
@@ -14867,7 +14892,7 @@ class AuroDropdownBib extends r$3 {
14867
14892
 
14868
14893
  var dropdownVersion$1 = '3.0.0';
14869
14894
 
14870
- var styleCss$1$1 = i$6`:host{position:relative;display:inline-block;max-width:100%}:host([fluid]){display:block}#bibSizer{position:absolute;z-index:-1;opacity:0;pointer-events:none}.label{font-size:var(--ds-text-body-size-xs, 0.75rem);line-height:var(--ds-text-body-size-default, 1rem);transition:font-size .3s cubic-bezier(0.215, 0.61, 0.355, 1);white-space:normal}.label[hasTrigger=false]{font-size:var(--ds-text-body-size-default, 1rem)}.trigger{position:relative;display:flex;align-items:center}.trigger[showBorder]{border-width:1px;border-style:solid;cursor:pointer;outline-style:solid;outline-width:1px}@media(hover: hover){.trigger:hover{cursor:pointer}}.triggerContentWrapper{overflow:hidden;flex:1;text-overflow:ellipsis;white-space:nowrap}#showStateIcon{display:flex;overflow:hidden;height:100%;align-items:center;margin-left:var(--ds-size-100, 0.5rem)}#showStateIcon [auro-icon]{height:var(--ds-size-300, 1.5rem);line-height:var(--ds-size-300, 1.5rem)}#showStateIcon[data-expanded=true] [auro-icon]{transform:rotate(-180deg)}:host([matchwidth]) #bibSizer{width:100%}:host([disabled]){pointer-events:none}:host([inset]) .trigger{padding:var(--ds-size-150, 0.75rem) var(--ds-size-200, 1rem)}:host([common]) .trigger,:host([inset][bordered]) .trigger{padding:var(--ds-size-200, 1rem) var(--ds-size-150, 0.75rem)}:host([common]) .trigger,:host([rounded]) .trigger{border-radius:var(--ds-border-radius, 0.375rem)}`;
14895
+ var styleCss$1$1 = i$6`:host{position:relative;display:inline-block;max-width:100%}:host([fluid]){display:block}#bibSizer{position:absolute;z-index:-1;opacity:0;pointer-events:none}.label{font-size:var(--ds-text-body-size-xs, 0.75rem);line-height:var(--ds-text-body-size-default, 1rem);transition:font-size .3s cubic-bezier(0.215, 0.61, 0.355, 1);white-space:normal}.label[hasTrigger=false]{font-size:var(--ds-text-body-size-default, 1rem)}.trigger{position:relative;display:flex;align-items:center}.trigger[showBorder]{border-width:1px;border-style:solid;cursor:pointer;outline-style:solid;outline-width:1px}@media(hover: hover){.trigger:hover{cursor:pointer}}.triggerContentWrapper{overflow:hidden;flex:1;text-overflow:ellipsis;white-space:nowrap}#showStateIcon{display:flex;overflow:hidden;height:100%;align-items:center;margin-left:var(--ds-size-100, 0.5rem)}#showStateIcon [auro-icon]{height:var(--ds-size-300, 1.5rem);line-height:var(--ds-size-300, 1.5rem)}#showStateIcon[data-expanded=true] [auro-icon]{transform:rotate(-180deg)}:host([matchwidth]) #bibSizer{width:100%}:host([disabled]){pointer-events:none}:host([inset]) .trigger{padding:var(--ds-size-150, 0.75rem) var(--ds-size-200, 1rem)}:host([common]) .trigger,:host([inset][bordered]) .trigger{padding:var(--ds-size-200, 1rem) var(--ds-size-150, 0.75rem)}:host([inset][bordered][labeled]) .trigger{padding:var(--ds-size-100, 0.5rem) var(--ds-size-150, 0.75rem)}:host([common]) .trigger,:host([rounded]) .trigger{border-radius:var(--ds-border-radius, 0.375rem)}`;
14871
14896
 
14872
14897
  var colorCss$1$1 = i$6`.label{color:var(--ds-auro-dropdown-label-text-color)}.trigger{border-color:var(--ds-auro-dropdown-trigger-border-color);background-color:var(--ds-auro-dropdown-trigger-container-color);color:var(--ds-auro-dropdown-trigger-text-color);outline-color:var(--ds-auro-dropdown-trigger-outline-color)}.trigger:focus-within,.trigger:active{--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-active-default, #0074c8);--ds-auro-dropdown-trigger-outline-color: var(--ds-color-border-active-default, #0074c8)}.trigger:focus-within:not(:active){--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-ui-focus-default, #2c67b5);--ds-auro-dropdown-trigger-outline-color: var(--ds-color-border-ui-focus-default, #2c67b5)}.trigger:hover{--ds-auro-dropdown-trigger-container-color: var(--ds-color-container-ui-secondary-hover-default, rgba(0, 0, 0, 0.03))}:host([disabled]){--ds-auro-dropdown-trigger-text-color: var(--ds-color-text-ui-disabled-default, #adadad);--ds-auro-dropdown-label-text-color: var(--ds-color-text-ui-disabled-default, #adadad)}:host([common]),:host([bordered]){--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-primary-default, #585e67)}:host([common]) .trigger:active,:host([common]) .trigger:focus-within,:host([bordered]) .trigger:active,:host([bordered]) .trigger:focus-within{--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-ui-focus-default, #2c67b5)}:host([error]){--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-error-default, #cc1816)}:host([error]) .trigger{outline:solid 1px var(--ds-auro-dropdown-trigger-border-color)}:host([error]) .trigger:focus-within,:host([error]) .trigger:active{--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-active-default, #0074c8)}:host([error]) .trigger:active{box-shadow:none;outline:none}:host([disabled][common]),:host([disabled][bordered]){--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-ui-disabled-default, #adadad)}`;
14873
14898
 
@@ -15131,6 +15156,7 @@ class AuroDropdown extends r$3 {
15131
15156
  this.rounded = false;
15132
15157
  this.tabIndex = 0;
15133
15158
  this.noToggle = false;
15159
+ this.labeled = true;
15134
15160
 
15135
15161
  /**
15136
15162
  * @private
@@ -15283,7 +15309,7 @@ class AuroDropdown extends r$3 {
15283
15309
  },
15284
15310
 
15285
15311
  /**
15286
- * If true, the dropdown bib is taking the fullscreen when it's open
15312
+ * If true, the dropdown bib is taking the fullscreen when it's open.
15287
15313
  */
15288
15314
  isBibFullscreen: {
15289
15315
  type: Boolean,
@@ -15313,6 +15339,15 @@ class AuroDropdown extends r$3 {
15313
15339
  reflect: true
15314
15340
  },
15315
15341
 
15342
+ /**
15343
+ * Defines if there is a label preset.
15344
+ * @private
15345
+ */
15346
+ labeled: {
15347
+ type: Boolean,
15348
+ reflect: true
15349
+ },
15350
+
15316
15351
  /**
15317
15352
  * If declared, the popover and trigger will be set to the same width.
15318
15353
  */
@@ -15392,6 +15427,7 @@ class AuroDropdown extends r$3 {
15392
15427
 
15393
15428
  disconnectedCallback() {
15394
15429
  super.disconnectedCallback();
15430
+ this.floater.disconnect();
15395
15431
  }
15396
15432
 
15397
15433
  updated(changedProperties) {
@@ -15521,13 +15557,21 @@ class AuroDropdown extends r$3 {
15521
15557
  handleTriggerContentSlotChange(event) {
15522
15558
  this.floater.handleTriggerTabIndex();
15523
15559
 
15524
- const triggerContentNodes = this.shadowRoot.querySelector('.triggerContent slot').assignedNodes();
15560
+ const triggerSlot = this.shadowRoot.querySelector('.triggerContent slot');
15561
+
15562
+ if (triggerSlot) {
15525
15563
 
15526
- triggerContentNodes.forEach((node) => {
15527
- if (!this.triggerContentFocusable) {
15528
- this.triggerContentFocusable = this.containsFocusableElement(node);
15564
+ const triggerContentNodes = triggerSlot.assignedNodes();
15565
+
15566
+ if (triggerContentNodes) {
15567
+
15568
+ triggerContentNodes.forEach((node) => {
15569
+ if (!this.triggerContentFocusable) {
15570
+ this.triggerContentFocusable = this.containsFocusableElement(node);
15571
+ }
15572
+ });
15529
15573
  }
15530
- });
15574
+ }
15531
15575
 
15532
15576
  const trigger = this.shadowRoot.querySelector('#trigger');
15533
15577
 
@@ -15581,6 +15625,29 @@ class AuroDropdown extends r$3 {
15581
15625
  }
15582
15626
  }
15583
15627
 
15628
+ /**
15629
+ * @private
15630
+ * @method handleLabelSlotChange
15631
+ * @param {event} event - The event object representing the slot change.
15632
+ * @description Handles the slot change event for the label slot.
15633
+ */
15634
+ handleLabelSlotChange (event) {
15635
+
15636
+ // Get the nodes from the event
15637
+ const nodes = event.target.assignedNodes();
15638
+
15639
+ // Guard clause for no nodes
15640
+ if (!nodes) {
15641
+ return;
15642
+ }
15643
+
15644
+ // Convert the nodes to a measurable array so we can get the length
15645
+ const nodesArr = Array.from(nodes);
15646
+
15647
+ // If the nodes array has a length, the dropdown is labeled
15648
+ this.labeled = nodesArr.length > 0;
15649
+ }
15650
+
15584
15651
  // function that renders the HTML and CSS into the scope of the component
15585
15652
  render() {
15586
15653
  return u$2`
@@ -15595,7 +15662,7 @@ class AuroDropdown extends r$3 {
15595
15662
  >
15596
15663
  <div class="triggerContentWrapper">
15597
15664
  <label class="label" id="triggerLabel" hasTrigger=${this.hasTriggerContent}>
15598
- <slot name="label"></slot>
15665
+ <slot name="label" @slotchange="${this.handleLabelSlotChange}"></slot>
15599
15666
  </label>
15600
15667
  <div class="triggerContent">
15601
15668
  <slot
@@ -104,7 +104,7 @@ The use of any Auro custom element has a dependency on the [Auro Design Tokens](
104
104
  In cases where the project is not able to process JS assets, there are pre-processed assets available for use. Legacy browsers such as IE11 are no longer supported.
105
105
 
106
106
  ```html
107
- <script type="module "src="https://cdn.jsdelivr.net/npm/@aurodesignsystem/auro-formkit@2.1.0-beta.1/auro-datepicker/+esm"></script>
107
+ <script type="module "src="https://cdn.jsdelivr.net/npm/@aurodesignsystem/auro-formkit@2.1.0-beta.3/auro-datepicker/+esm"></script>
108
108
  ```
109
109
  <!-- AURO-GENERATED-CONTENT:END -->
110
110
 
@@ -440,7 +440,7 @@ class AuroDatepickerUtilities {
440
440
  validDateStr(date, format) {
441
441
  const dateStrLength = 10;
442
442
 
443
- if (date.length === dateStrLength && Date.parse(this.toNorthAmericanFormat(date, format))) {
443
+ if (format !== undefined && date !== undefined && date.length === dateStrLength && Date.parse(this.toNorthAmericanFormat(date, format))) {
444
444
  return true;
445
445
  }
446
446
 
@@ -581,12 +581,21 @@ class AuroDatepickerUtilities {
581
581
  */
582
582
  getDateAsString(date) {
583
583
  const year = new Date(date).getFullYear();
584
- const month = new Date(date).getMonth() + 1;
585
- const day = new Date(date).getDate();
584
+ const month = this.formatTwoDigits(new Date(date).getMonth() + 1);
585
+ const day = this.formatTwoDigits(new Date(date).getDate());
586
586
 
587
- const dateStr = `${month}/${day}/${year}`;
587
+ return `${month}/${day}/${year}`;
588
+ }
588
589
 
589
- return dateStr;
590
+ /**
591
+ * Function to format a number to two digits.
592
+ * @private
593
+ * @param {Number} num - Number to format.
594
+ * @returns {String} Returns the number as a string.
595
+ */
596
+ formatTwoDigits(num) {
597
+ const singleDigitThreshold = 10;
598
+ return num < singleDigitThreshold ? `0${num}` : num;
590
599
  }
591
600
 
592
601
  /**
@@ -10261,10 +10270,23 @@ class CalendarUtilities {
10261
10270
  increment = -1; // eslint-disable-line no-magic-numbers
10262
10271
  }
10263
10272
 
10264
- // calculate the new central date
10265
- const newCentralDate = new Date(elem.centralDate).setMonth(new Date(elem.centralDate).getMonth() + increment);
10266
- // set the new central date to the first day of the month
10267
- elem.centralDate = this.util.convertDateToFirstOfMonth(newCentralDate);
10273
+ // Get new central date for calendar view
10274
+ const {firstRenderedMonth, centralDate, datepicker} = elem;
10275
+ const formattedDateStr = this.util.getDateAsString(centralDate, datepicker.format);
10276
+ let newCentralDate = null;
10277
+
10278
+ if (this.util.validDateStr(formattedDateStr, datepicker.format)) {
10279
+ // Use current date as base and adjust month by increment
10280
+ newCentralDate = new Date(formattedDateStr).setMonth(new Date(formattedDateStr).getMonth() + increment);
10281
+ } else {
10282
+ // Fallback to first rendered month if central date invalid
10283
+ newCentralDate = new Date(firstRenderedMonth).setMonth(new Date(firstRenderedMonth).getMonth() + increment);
10284
+ }
10285
+
10286
+ // Update calendar central date
10287
+ if (newCentralDate) {
10288
+ elem.centralDate = this.util.convertDateToFirstOfMonth(newCentralDate);
10289
+ }
10268
10290
  }
10269
10291
  }
10270
10292
 
@@ -11987,9 +12009,12 @@ class AuroCalendar extends RangeDatepicker {
11987
12009
  // Determine which month to render first
11988
12010
  let dateMatches = undefined;
11989
12011
 
11990
- if (!this.isFullscreen && this.centralDate) {
12012
+ if (!this.isFullscreen) {
12013
+
12014
+ const formattedDateStr = this.util.getDateAsString(new Date(this.centralDate), this.datepicker.format);
12015
+
11991
12016
  // On Desktop start the calendar at the central date if it exists, then minDate and finally the current date.
11992
- if (this.centralDate) {
12017
+ if (this.util.validDateStr(formattedDateStr, this.datepicker.format)) {
11993
12018
  dateMatches = this.util.datesMatch(this.firstRenderedMonth, this.util.convertDateToFirstOfMonth(this.centralDate));
11994
12019
 
11995
12020
  if (!dateMatches) {
@@ -14810,7 +14835,7 @@ class AuroDropdownBib extends LitElement {
14810
14835
 
14811
14836
  var dropdownVersion$1 = '3.0.0';
14812
14837
 
14813
- var styleCss$1$1 = css`:host{position:relative;display:inline-block;max-width:100%}:host([fluid]){display:block}#bibSizer{position:absolute;z-index:-1;opacity:0;pointer-events:none}.label{font-size:var(--ds-text-body-size-xs, 0.75rem);line-height:var(--ds-text-body-size-default, 1rem);transition:font-size .3s cubic-bezier(0.215, 0.61, 0.355, 1);white-space:normal}.label[hasTrigger=false]{font-size:var(--ds-text-body-size-default, 1rem)}.trigger{position:relative;display:flex;align-items:center}.trigger[showBorder]{border-width:1px;border-style:solid;cursor:pointer;outline-style:solid;outline-width:1px}@media(hover: hover){.trigger:hover{cursor:pointer}}.triggerContentWrapper{overflow:hidden;flex:1;text-overflow:ellipsis;white-space:nowrap}#showStateIcon{display:flex;overflow:hidden;height:100%;align-items:center;margin-left:var(--ds-size-100, 0.5rem)}#showStateIcon [auro-icon]{height:var(--ds-size-300, 1.5rem);line-height:var(--ds-size-300, 1.5rem)}#showStateIcon[data-expanded=true] [auro-icon]{transform:rotate(-180deg)}:host([matchwidth]) #bibSizer{width:100%}:host([disabled]){pointer-events:none}:host([inset]) .trigger{padding:var(--ds-size-150, 0.75rem) var(--ds-size-200, 1rem)}:host([common]) .trigger,:host([inset][bordered]) .trigger{padding:var(--ds-size-200, 1rem) var(--ds-size-150, 0.75rem)}:host([common]) .trigger,:host([rounded]) .trigger{border-radius:var(--ds-border-radius, 0.375rem)}`;
14838
+ var styleCss$1$1 = css`:host{position:relative;display:inline-block;max-width:100%}:host([fluid]){display:block}#bibSizer{position:absolute;z-index:-1;opacity:0;pointer-events:none}.label{font-size:var(--ds-text-body-size-xs, 0.75rem);line-height:var(--ds-text-body-size-default, 1rem);transition:font-size .3s cubic-bezier(0.215, 0.61, 0.355, 1);white-space:normal}.label[hasTrigger=false]{font-size:var(--ds-text-body-size-default, 1rem)}.trigger{position:relative;display:flex;align-items:center}.trigger[showBorder]{border-width:1px;border-style:solid;cursor:pointer;outline-style:solid;outline-width:1px}@media(hover: hover){.trigger:hover{cursor:pointer}}.triggerContentWrapper{overflow:hidden;flex:1;text-overflow:ellipsis;white-space:nowrap}#showStateIcon{display:flex;overflow:hidden;height:100%;align-items:center;margin-left:var(--ds-size-100, 0.5rem)}#showStateIcon [auro-icon]{height:var(--ds-size-300, 1.5rem);line-height:var(--ds-size-300, 1.5rem)}#showStateIcon[data-expanded=true] [auro-icon]{transform:rotate(-180deg)}:host([matchwidth]) #bibSizer{width:100%}:host([disabled]){pointer-events:none}:host([inset]) .trigger{padding:var(--ds-size-150, 0.75rem) var(--ds-size-200, 1rem)}:host([common]) .trigger,:host([inset][bordered]) .trigger{padding:var(--ds-size-200, 1rem) var(--ds-size-150, 0.75rem)}:host([inset][bordered][labeled]) .trigger{padding:var(--ds-size-100, 0.5rem) var(--ds-size-150, 0.75rem)}:host([common]) .trigger,:host([rounded]) .trigger{border-radius:var(--ds-border-radius, 0.375rem)}`;
14814
14839
 
14815
14840
  var colorCss$1$1 = css`.label{color:var(--ds-auro-dropdown-label-text-color)}.trigger{border-color:var(--ds-auro-dropdown-trigger-border-color);background-color:var(--ds-auro-dropdown-trigger-container-color);color:var(--ds-auro-dropdown-trigger-text-color);outline-color:var(--ds-auro-dropdown-trigger-outline-color)}.trigger:focus-within,.trigger:active{--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-active-default, #0074c8);--ds-auro-dropdown-trigger-outline-color: var(--ds-color-border-active-default, #0074c8)}.trigger:focus-within:not(:active){--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-ui-focus-default, #2c67b5);--ds-auro-dropdown-trigger-outline-color: var(--ds-color-border-ui-focus-default, #2c67b5)}.trigger:hover{--ds-auro-dropdown-trigger-container-color: var(--ds-color-container-ui-secondary-hover-default, rgba(0, 0, 0, 0.03))}:host([disabled]){--ds-auro-dropdown-trigger-text-color: var(--ds-color-text-ui-disabled-default, #adadad);--ds-auro-dropdown-label-text-color: var(--ds-color-text-ui-disabled-default, #adadad)}:host([common]),:host([bordered]){--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-primary-default, #585e67)}:host([common]) .trigger:active,:host([common]) .trigger:focus-within,:host([bordered]) .trigger:active,:host([bordered]) .trigger:focus-within{--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-ui-focus-default, #2c67b5)}:host([error]){--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-error-default, #cc1816)}:host([error]) .trigger{outline:solid 1px var(--ds-auro-dropdown-trigger-border-color)}:host([error]) .trigger:focus-within,:host([error]) .trigger:active{--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-active-default, #0074c8)}:host([error]) .trigger:active{box-shadow:none;outline:none}:host([disabled][common]),:host([disabled][bordered]){--ds-auro-dropdown-trigger-border-color: var(--ds-color-border-ui-disabled-default, #adadad)}`;
14816
14841
 
@@ -15074,6 +15099,7 @@ class AuroDropdown extends LitElement {
15074
15099
  this.rounded = false;
15075
15100
  this.tabIndex = 0;
15076
15101
  this.noToggle = false;
15102
+ this.labeled = true;
15077
15103
 
15078
15104
  /**
15079
15105
  * @private
@@ -15226,7 +15252,7 @@ class AuroDropdown extends LitElement {
15226
15252
  },
15227
15253
 
15228
15254
  /**
15229
- * If true, the dropdown bib is taking the fullscreen when it's open
15255
+ * If true, the dropdown bib is taking the fullscreen when it's open.
15230
15256
  */
15231
15257
  isBibFullscreen: {
15232
15258
  type: Boolean,
@@ -15256,6 +15282,15 @@ class AuroDropdown extends LitElement {
15256
15282
  reflect: true
15257
15283
  },
15258
15284
 
15285
+ /**
15286
+ * Defines if there is a label preset.
15287
+ * @private
15288
+ */
15289
+ labeled: {
15290
+ type: Boolean,
15291
+ reflect: true
15292
+ },
15293
+
15259
15294
  /**
15260
15295
  * If declared, the popover and trigger will be set to the same width.
15261
15296
  */
@@ -15335,6 +15370,7 @@ class AuroDropdown extends LitElement {
15335
15370
 
15336
15371
  disconnectedCallback() {
15337
15372
  super.disconnectedCallback();
15373
+ this.floater.disconnect();
15338
15374
  }
15339
15375
 
15340
15376
  updated(changedProperties) {
@@ -15464,13 +15500,21 @@ class AuroDropdown extends LitElement {
15464
15500
  handleTriggerContentSlotChange(event) {
15465
15501
  this.floater.handleTriggerTabIndex();
15466
15502
 
15467
- const triggerContentNodes = this.shadowRoot.querySelector('.triggerContent slot').assignedNodes();
15503
+ const triggerSlot = this.shadowRoot.querySelector('.triggerContent slot');
15504
+
15505
+ if (triggerSlot) {
15468
15506
 
15469
- triggerContentNodes.forEach((node) => {
15470
- if (!this.triggerContentFocusable) {
15471
- this.triggerContentFocusable = this.containsFocusableElement(node);
15507
+ const triggerContentNodes = triggerSlot.assignedNodes();
15508
+
15509
+ if (triggerContentNodes) {
15510
+
15511
+ triggerContentNodes.forEach((node) => {
15512
+ if (!this.triggerContentFocusable) {
15513
+ this.triggerContentFocusable = this.containsFocusableElement(node);
15514
+ }
15515
+ });
15472
15516
  }
15473
- });
15517
+ }
15474
15518
 
15475
15519
  const trigger = this.shadowRoot.querySelector('#trigger');
15476
15520
 
@@ -15524,6 +15568,29 @@ class AuroDropdown extends LitElement {
15524
15568
  }
15525
15569
  }
15526
15570
 
15571
+ /**
15572
+ * @private
15573
+ * @method handleLabelSlotChange
15574
+ * @param {event} event - The event object representing the slot change.
15575
+ * @description Handles the slot change event for the label slot.
15576
+ */
15577
+ handleLabelSlotChange (event) {
15578
+
15579
+ // Get the nodes from the event
15580
+ const nodes = event.target.assignedNodes();
15581
+
15582
+ // Guard clause for no nodes
15583
+ if (!nodes) {
15584
+ return;
15585
+ }
15586
+
15587
+ // Convert the nodes to a measurable array so we can get the length
15588
+ const nodesArr = Array.from(nodes);
15589
+
15590
+ // If the nodes array has a length, the dropdown is labeled
15591
+ this.labeled = nodesArr.length > 0;
15592
+ }
15593
+
15527
15594
  // function that renders the HTML and CSS into the scope of the component
15528
15595
  render() {
15529
15596
  return html$1`
@@ -15538,7 +15605,7 @@ class AuroDropdown extends LitElement {
15538
15605
  >
15539
15606
  <div class="triggerContentWrapper">
15540
15607
  <label class="label" id="triggerLabel" hasTrigger=${this.hasTriggerContent}>
15541
- <slot name="label"></slot>
15608
+ <slot name="label" @slotchange="${this.handleLabelSlotChange}"></slot>
15542
15609
  </label>
15543
15610
  <div class="triggerContent">
15544
15611
  <slot