@carbon/web-components 2.60.0 → 2.61.0

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 (210) hide show
  1. package/custom-elements.json +1401 -361
  2. package/es/components/breadcrumb/breadcrumb.scss.js +1 -1
  3. package/es/components/breadcrumb/breadcrumb.scss.js.map +1 -1
  4. package/es/components/date-picker/date-picker-input.d.ts +13 -1
  5. package/es/components/date-picker/date-picker-input.d.ts.map +1 -1
  6. package/es/components/date-picker/date-picker-input.js +36 -16
  7. package/es/components/date-picker/date-picker-input.js.map +1 -1
  8. package/es/components/date-picker/date-picker.d.ts +6 -0
  9. package/es/components/date-picker/date-picker.d.ts.map +1 -1
  10. package/es/components/date-picker/date-picker.js +10 -2
  11. package/es/components/date-picker/date-picker.js.map +1 -1
  12. package/es/components/date-picker/date-picker.scss.js +1 -1
  13. package/es/components/date-picker/date-picker.scss.js.map +1 -1
  14. package/es/components/date-picker/defs.d.ts +18 -1
  15. package/es/components/date-picker/defs.d.ts.map +1 -1
  16. package/es/components/date-picker/defs.js +19 -1
  17. package/es/components/date-picker/defs.js.map +1 -1
  18. package/es/components/date-picker/next/adapters/web-component-adapter.d.ts +143 -0
  19. package/es/components/date-picker/next/adapters/web-component-adapter.d.ts.map +1 -0
  20. package/es/components/date-picker/next/adapters/web-component-adapter.js +215 -0
  21. package/es/components/date-picker/next/adapters/web-component-adapter.js.map +1 -0
  22. package/es/components/date-picker/next/components/calendar-renderer.d.ts +136 -0
  23. package/es/components/date-picker/next/components/calendar-renderer.d.ts.map +1 -0
  24. package/es/components/date-picker/next/components/calendar-renderer.js +278 -0
  25. package/es/components/date-picker/next/components/calendar-renderer.js.map +1 -0
  26. package/es/components/date-picker/next/components/date-picker-input-skeleton.d.ts +35 -0
  27. package/es/components/date-picker/next/components/date-picker-input-skeleton.d.ts.map +1 -0
  28. package/es/components/date-picker/next/components/date-picker-input-skeleton.js +73 -0
  29. package/es/components/date-picker/next/components/date-picker-input-skeleton.js.map +1 -0
  30. package/es/components/date-picker/next/components/date-picker-input.d.ts +196 -0
  31. package/es/components/date-picker/next/components/date-picker-input.d.ts.map +1 -0
  32. package/es/components/date-picker/next/components/date-picker-input.js +334 -0
  33. package/es/components/date-picker/next/components/date-picker-input.js.map +1 -0
  34. package/es/components/date-picker/next/components/date-picker.d.ts +329 -0
  35. package/es/components/date-picker/next/components/date-picker.d.ts.map +1 -0
  36. package/es/components/date-picker/next/components/date-picker.js +621 -0
  37. package/es/components/date-picker/next/components/date-picker.js.map +1 -0
  38. package/es/components/date-picker/next/components/date-picker.scss.js +14 -0
  39. package/es/components/date-picker/next/components/date-picker.scss.js.map +1 -0
  40. package/es/components/date-picker/next/index.d.ts +11 -0
  41. package/es/components/date-picker/next/index.d.ts.map +1 -0
  42. package/es/components/date-picker/next/index.js +11 -0
  43. package/es/components/dropdown/dropdown.d.ts +8 -0
  44. package/es/components/dropdown/dropdown.d.ts.map +1 -1
  45. package/es/components/dropdown/dropdown.js +4 -2
  46. package/es/components/dropdown/dropdown.js.map +1 -1
  47. package/es/components/fluid-date-picker/fluid-date-picker-input.d.ts +39 -0
  48. package/es/components/fluid-date-picker/fluid-date-picker-input.d.ts.map +1 -0
  49. package/es/components/fluid-date-picker/fluid-date-picker-input.js +59 -0
  50. package/es/components/fluid-date-picker/fluid-date-picker-input.js.map +1 -0
  51. package/es/components/fluid-date-picker/fluid-date-picker-skeleton.d.ts +20 -0
  52. package/es/components/fluid-date-picker/fluid-date-picker-skeleton.d.ts.map +1 -0
  53. package/es/components/fluid-date-picker/fluid-date-picker-skeleton.js +74 -0
  54. package/es/components/fluid-date-picker/fluid-date-picker-skeleton.js.map +1 -0
  55. package/es/components/fluid-date-picker/fluid-date-picker.d.ts +24 -0
  56. package/es/components/fluid-date-picker/fluid-date-picker.d.ts.map +1 -0
  57. package/es/components/fluid-date-picker/fluid-date-picker.js +51 -0
  58. package/es/components/fluid-date-picker/fluid-date-picker.js.map +1 -0
  59. package/es/components/fluid-date-picker/fluid-date-picker.scss.js +14 -0
  60. package/es/components/fluid-date-picker/fluid-date-picker.scss.js.map +1 -0
  61. package/es/components/fluid-date-picker/index.d.ts +10 -0
  62. package/es/components/fluid-date-picker/index.d.ts.map +1 -0
  63. package/es/components/fluid-date-picker/index.js +10 -0
  64. package/es/components/pagination/pagination.scss.js +1 -1
  65. package/es/components/password-input/password-input.d.ts.map +1 -1
  66. package/es/components/password-input/password-input.js +3 -2
  67. package/es/components/password-input/password-input.js.map +1 -1
  68. package/es/components/radio-button/radio-button.js +1 -1
  69. package/es/components/radio-button/radio-button.js.map +1 -1
  70. package/es/components/select/select.d.ts +8 -0
  71. package/es/components/select/select.d.ts.map +1 -1
  72. package/es/components/select/select.js +4 -2
  73. package/es/components/select/select.js.map +1 -1
  74. package/es/components/skip-to-content/skip-to-content.scss.js +1 -1
  75. package/es/components/text-input/text-input.d.ts +17 -0
  76. package/es/components/text-input/text-input.d.ts.map +1 -1
  77. package/es/components/text-input/text-input.js +28 -6
  78. package/es/components/text-input/text-input.js.map +1 -1
  79. package/es/components/textarea/textarea.d.ts.map +1 -1
  80. package/es/components/textarea/textarea.js +2 -1
  81. package/es/components/textarea/textarea.js.map +1 -1
  82. package/es/components/ui-shell/header.scss.js +1 -1
  83. package/es/components/ui-shell/header.scss.js.map +1 -1
  84. package/es/index.js +1 -1
  85. package/es-custom/components/breadcrumb/breadcrumb.scss.js +1 -1
  86. package/es-custom/components/breadcrumb/breadcrumb.scss.js.map +1 -1
  87. package/es-custom/components/date-picker/date-picker-input.d.ts +13 -1
  88. package/es-custom/components/date-picker/date-picker-input.d.ts.map +1 -1
  89. package/es-custom/components/date-picker/date-picker-input.js +36 -16
  90. package/es-custom/components/date-picker/date-picker-input.js.map +1 -1
  91. package/es-custom/components/date-picker/date-picker.d.ts +6 -0
  92. package/es-custom/components/date-picker/date-picker.d.ts.map +1 -1
  93. package/es-custom/components/date-picker/date-picker.js +10 -2
  94. package/es-custom/components/date-picker/date-picker.js.map +1 -1
  95. package/es-custom/components/date-picker/date-picker.scss.js +1 -1
  96. package/es-custom/components/date-picker/date-picker.scss.js.map +1 -1
  97. package/es-custom/components/date-picker/defs.d.ts +18 -1
  98. package/es-custom/components/date-picker/defs.d.ts.map +1 -1
  99. package/es-custom/components/date-picker/defs.js +19 -1
  100. package/es-custom/components/date-picker/defs.js.map +1 -1
  101. package/es-custom/components/date-picker/next/adapters/web-component-adapter.d.ts +143 -0
  102. package/es-custom/components/date-picker/next/adapters/web-component-adapter.d.ts.map +1 -0
  103. package/es-custom/components/date-picker/next/adapters/web-component-adapter.js +215 -0
  104. package/es-custom/components/date-picker/next/adapters/web-component-adapter.js.map +1 -0
  105. package/es-custom/components/date-picker/next/components/calendar-renderer.d.ts +136 -0
  106. package/es-custom/components/date-picker/next/components/calendar-renderer.d.ts.map +1 -0
  107. package/es-custom/components/date-picker/next/components/calendar-renderer.js +278 -0
  108. package/es-custom/components/date-picker/next/components/calendar-renderer.js.map +1 -0
  109. package/es-custom/components/date-picker/next/components/date-picker-input-skeleton.d.ts +35 -0
  110. package/es-custom/components/date-picker/next/components/date-picker-input-skeleton.d.ts.map +1 -0
  111. package/es-custom/components/date-picker/next/components/date-picker-input-skeleton.js +73 -0
  112. package/es-custom/components/date-picker/next/components/date-picker-input-skeleton.js.map +1 -0
  113. package/es-custom/components/date-picker/next/components/date-picker-input.d.ts +196 -0
  114. package/es-custom/components/date-picker/next/components/date-picker-input.d.ts.map +1 -0
  115. package/es-custom/components/date-picker/next/components/date-picker-input.js +334 -0
  116. package/es-custom/components/date-picker/next/components/date-picker-input.js.map +1 -0
  117. package/es-custom/components/date-picker/next/components/date-picker.d.ts +329 -0
  118. package/es-custom/components/date-picker/next/components/date-picker.d.ts.map +1 -0
  119. package/es-custom/components/date-picker/next/components/date-picker.js +621 -0
  120. package/es-custom/components/date-picker/next/components/date-picker.js.map +1 -0
  121. package/es-custom/components/date-picker/next/components/date-picker.scss.js +14 -0
  122. package/es-custom/components/date-picker/next/components/date-picker.scss.js.map +1 -0
  123. package/es-custom/components/date-picker/next/index.d.ts +11 -0
  124. package/es-custom/components/date-picker/next/index.d.ts.map +1 -0
  125. package/es-custom/components/date-picker/next/index.js +11 -0
  126. package/es-custom/components/dropdown/dropdown.d.ts +8 -0
  127. package/es-custom/components/dropdown/dropdown.d.ts.map +1 -1
  128. package/es-custom/components/dropdown/dropdown.js +4 -2
  129. package/es-custom/components/dropdown/dropdown.js.map +1 -1
  130. package/es-custom/components/fluid-date-picker/fluid-date-picker-input.d.ts +39 -0
  131. package/es-custom/components/fluid-date-picker/fluid-date-picker-input.d.ts.map +1 -0
  132. package/es-custom/components/fluid-date-picker/fluid-date-picker-input.js +59 -0
  133. package/es-custom/components/fluid-date-picker/fluid-date-picker-input.js.map +1 -0
  134. package/es-custom/components/fluid-date-picker/fluid-date-picker-skeleton.d.ts +20 -0
  135. package/es-custom/components/fluid-date-picker/fluid-date-picker-skeleton.d.ts.map +1 -0
  136. package/es-custom/components/fluid-date-picker/fluid-date-picker-skeleton.js +74 -0
  137. package/es-custom/components/fluid-date-picker/fluid-date-picker-skeleton.js.map +1 -0
  138. package/es-custom/components/fluid-date-picker/fluid-date-picker.d.ts +24 -0
  139. package/es-custom/components/fluid-date-picker/fluid-date-picker.d.ts.map +1 -0
  140. package/es-custom/components/fluid-date-picker/fluid-date-picker.js +51 -0
  141. package/es-custom/components/fluid-date-picker/fluid-date-picker.js.map +1 -0
  142. package/es-custom/components/fluid-date-picker/fluid-date-picker.scss.js +14 -0
  143. package/es-custom/components/fluid-date-picker/fluid-date-picker.scss.js.map +1 -0
  144. package/es-custom/components/fluid-date-picker/index.d.ts +10 -0
  145. package/es-custom/components/fluid-date-picker/index.d.ts.map +1 -0
  146. package/es-custom/components/fluid-date-picker/index.js +10 -0
  147. package/es-custom/components/pagination/pagination.scss.js +1 -1
  148. package/es-custom/components/password-input/password-input.d.ts.map +1 -1
  149. package/es-custom/components/password-input/password-input.js +3 -2
  150. package/es-custom/components/password-input/password-input.js.map +1 -1
  151. package/es-custom/components/radio-button/radio-button.js +1 -1
  152. package/es-custom/components/radio-button/radio-button.js.map +1 -1
  153. package/es-custom/components/select/select.d.ts +8 -0
  154. package/es-custom/components/select/select.d.ts.map +1 -1
  155. package/es-custom/components/select/select.js +4 -2
  156. package/es-custom/components/select/select.js.map +1 -1
  157. package/es-custom/components/skip-to-content/skip-to-content.scss.js +1 -1
  158. package/es-custom/components/text-input/text-input.d.ts +17 -0
  159. package/es-custom/components/text-input/text-input.d.ts.map +1 -1
  160. package/es-custom/components/text-input/text-input.js +28 -6
  161. package/es-custom/components/text-input/text-input.js.map +1 -1
  162. package/es-custom/components/textarea/textarea.d.ts.map +1 -1
  163. package/es-custom/components/textarea/textarea.js +2 -1
  164. package/es-custom/components/textarea/textarea.js.map +1 -1
  165. package/es-custom/components/ui-shell/header.scss.js +1 -1
  166. package/es-custom/components/ui-shell/header.scss.js.map +1 -1
  167. package/es-custom/index.js +1 -1
  168. package/lib/components/date-picker/date-picker-input.d.ts +13 -1
  169. package/lib/components/date-picker/date-picker-input.d.ts.map +1 -1
  170. package/lib/components/date-picker/date-picker.d.ts +6 -0
  171. package/lib/components/date-picker/date-picker.d.ts.map +1 -1
  172. package/lib/components/date-picker/defs.d.ts +18 -1
  173. package/lib/components/date-picker/defs.d.ts.map +1 -1
  174. package/lib/components/date-picker/defs.js +19 -0
  175. package/lib/components/date-picker/defs.js.map +1 -1
  176. package/lib/components/date-picker/next/adapters/web-component-adapter.d.ts +143 -0
  177. package/lib/components/date-picker/next/adapters/web-component-adapter.d.ts.map +1 -0
  178. package/lib/components/date-picker/next/components/calendar-renderer.d.ts +136 -0
  179. package/lib/components/date-picker/next/components/calendar-renderer.d.ts.map +1 -0
  180. package/lib/components/date-picker/next/components/date-picker-input-skeleton.d.ts +35 -0
  181. package/lib/components/date-picker/next/components/date-picker-input-skeleton.d.ts.map +1 -0
  182. package/lib/components/date-picker/next/components/date-picker-input.d.ts +196 -0
  183. package/lib/components/date-picker/next/components/date-picker-input.d.ts.map +1 -0
  184. package/lib/components/date-picker/next/components/date-picker.d.ts +329 -0
  185. package/lib/components/date-picker/next/components/date-picker.d.ts.map +1 -0
  186. package/lib/components/date-picker/next/index.d.ts +11 -0
  187. package/lib/components/date-picker/next/index.d.ts.map +1 -0
  188. package/lib/components/dropdown/dropdown.d.ts +8 -0
  189. package/lib/components/dropdown/dropdown.d.ts.map +1 -1
  190. package/lib/components/fluid-date-picker/fluid-date-picker-input.d.ts +39 -0
  191. package/lib/components/fluid-date-picker/fluid-date-picker-input.d.ts.map +1 -0
  192. package/lib/components/fluid-date-picker/fluid-date-picker-skeleton.d.ts +20 -0
  193. package/lib/components/fluid-date-picker/fluid-date-picker-skeleton.d.ts.map +1 -0
  194. package/lib/components/fluid-date-picker/fluid-date-picker.d.ts +24 -0
  195. package/lib/components/fluid-date-picker/fluid-date-picker.d.ts.map +1 -0
  196. package/lib/components/fluid-date-picker/index.d.ts +10 -0
  197. package/lib/components/fluid-date-picker/index.d.ts.map +1 -0
  198. package/lib/components/password-input/password-input.d.ts.map +1 -1
  199. package/lib/components/select/select.d.ts +8 -0
  200. package/lib/components/select/select.d.ts.map +1 -1
  201. package/lib/components/text-input/text-input.d.ts +17 -0
  202. package/lib/components/text-input/text-input.d.ts.map +1 -1
  203. package/lib/components/textarea/textarea.d.ts.map +1 -1
  204. package/package.json +10 -10
  205. package/scss/components/breadcrumb/breadcrumb.scss +4 -2
  206. package/scss/components/date-picker/date-picker.scss +6 -0
  207. package/scss/components/date-picker/next/components/date-picker.scss +124 -0
  208. package/scss/components/fluid-date-picker/fluid-date-picker.scss +282 -0
  209. package/scss/components/ui-shell/header.scss +14 -8
  210. package/telemetry.yml +29 -11
@@ -0,0 +1,621 @@
1
+ /**
2
+ * Copyright IBM Corp. 2026
3
+ *
4
+ * This source code is licensed under the Apache-2.0 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ import "../../../../globals/settings.js";
9
+ import { carbonElement } from "../../../../globals/decorators/carbon-element.js";
10
+ import __decorate from "../../../../_virtual/_@oxc-project_runtime@0.139.0/helpers/esm/decorate.js";
11
+ import HostListener from "../../../../globals/decorators/host-listener.js";
12
+ import HostListenerMixin from "../../../../globals/mixins/host-listener.js";
13
+ import FormMixin from "../../../../globals/mixins/form.js";
14
+ import { WebComponentAdapter } from "../adapters/web-component-adapter.js";
15
+ import date_picker_default$1 from "./date-picker.scss.js";
16
+ import { LitElement, html } from "lit";
17
+ import { property, query } from "lit/decorators.js";
18
+ import { ClickOutsideHandler, DatePickerEvent, DatePickerState, formatPlainDate, mapKeyboardToStateMachineEvent, parseDateToPlainDate, parseISOToPlainDate } from "@carbon/utilities/date-picker";
19
+ //#region src/components/date-picker/next/components/date-picker.ts
20
+ /**
21
+ * Copyright IBM Corp. 2026
22
+ *
23
+ * This source code is licensed under the Apache-2.0 license found in the
24
+ * LICENSE file in the root directory of this source tree.
25
+ */
26
+ /**
27
+ * Date picker.
28
+ *
29
+ * @element cds-preview-date-picker
30
+ * @fires cds-preview-date-picker-changed - The custom event fired when the date selection changes.
31
+ * @fires cds-preview-date-picker-error - The custom event fired when an error occurs.
32
+ */
33
+ let CDSDatePicker = class CDSDatePicker extends HostListenerMixin(FormMixin(LitElement)) {
34
+ constructor(..._args) {
35
+ super(..._args);
36
+ this._dateInteractNode = null;
37
+ this._adapter = null;
38
+ this._clickOutsideHandler = null;
39
+ this._pendingRestoreFocusTo = null;
40
+ this._lastTabCloseTime = 0;
41
+ this._restoringFocus = false;
42
+ this._handleChange = ({ detail }) => {
43
+ const { selectedDates } = detail;
44
+ if (selectedDates && Array.isArray(selectedDates)) this._value = selectedDates.filter((date) => date != null).map((date) => {
45
+ if (typeof date === "string") return date;
46
+ return date.toString();
47
+ }).join("/");
48
+ };
49
+ this._handleIconClick = () => {
50
+ if (this._adapter && !this.disabled && !this.readonly) this._adapter.send(DatePickerEvent.CALENDAR_ICON_CLICK);
51
+ };
52
+ this._handleInputFocus = (event) => {
53
+ if (this._adapter && !this.disabled && !this.readonly) {
54
+ const { inputType } = event.detail || {};
55
+ this._adapter.send(DatePickerEvent.INPUT_FOCUS, { inputType });
56
+ const timeSinceTabClose = Date.now() - this._lastTabCloseTime;
57
+ if (!this._restoringFocus && timeSinceTabClose >= 100) this._adapter.send(DatePickerEvent.CALENDAR_OPEN);
58
+ }
59
+ };
60
+ this._handleInputClick = (event) => {
61
+ if (this._adapter && !this.disabled && !this.readonly && !this.open) {
62
+ const { inputType } = event.detail || {};
63
+ this._adapter.send(DatePickerEvent.INPUT_FOCUS, { inputType });
64
+ this._adapter.send(DatePickerEvent.CALENDAR_OPEN);
65
+ }
66
+ };
67
+ this._handleInputBlur = (event) => {
68
+ if (this._adapter) {
69
+ const { inputType } = event.detail || {};
70
+ this._adapter.send(DatePickerEvent.INPUT_BLUR, { inputType });
71
+ }
72
+ };
73
+ this._handleStateChange = (transition) => {
74
+ const { to, from, context } = transition;
75
+ const newState = to;
76
+ if (newState === DatePickerState.CALENDAR_OPEN) {
77
+ this.open = true;
78
+ if (from === DatePickerState.CALENDAR_OPEN) this.requestUpdate();
79
+ } else if (newState === DatePickerState.SELECTING_END) {
80
+ this.open = true;
81
+ if (from === DatePickerState.SELECTING_END) this.requestUpdate();
82
+ } else if (newState === DatePickerState.IDLE) this.open = false;
83
+ else if (newState === DatePickerState.FOCUSED) if (from !== DatePickerState.CALENDAR_OPEN && from !== DatePickerState.SELECTING_END) this.open = false;
84
+ else this.open = context.isOpen ?? false;
85
+ else if (newState === DatePickerState.DATE_SELECTED) {
86
+ this.open = context.isOpen ?? false;
87
+ this.requestUpdate();
88
+ }
89
+ if (newState === DatePickerState.DATE_SELECTED || newState === DatePickerState.SELECTING_END || newState === DatePickerState.FOCUSED && from === DatePickerState.CALENDAR_OPEN && context.startDate) {
90
+ const selectedDates = context.endDate ? [context.startDate, context.endDate].filter((date) => date != null) : context.startDate ? [context.startDate] : [];
91
+ if (this._mode === "range") {
92
+ const { selectorInputFrom, selectorInputTo } = this.constructor;
93
+ const inputFrom = this.querySelector(selectorInputFrom);
94
+ const inputTo = this.querySelector(selectorInputTo);
95
+ if (newState === DatePickerState.DATE_SELECTED && context.startDate && context.endDate) {
96
+ if (inputFrom) inputFrom.value = formatPlainDate(context.startDate, context.dateFormat);
97
+ if (inputTo) inputTo.value = formatPlainDate(context.endDate, context.dateFormat);
98
+ } else if (context.lastFocusedInput === "to" && inputTo && context.endDate) inputTo.value = formatPlainDate(context.endDate, context.dateFormat);
99
+ else if (inputFrom && context.startDate) inputFrom.value = formatPlainDate(context.startDate, context.dateFormat);
100
+ } else if (this._dateInteractNode && context.startDate) this._dateInteractNode.value = formatPlainDate(context.startDate, context.dateFormat);
101
+ this.dispatchEvent(new CustomEvent(this.constructor.eventChange, {
102
+ bubbles: true,
103
+ composed: true,
104
+ detail: {
105
+ selectedDates,
106
+ value: this._value
107
+ }
108
+ }));
109
+ }
110
+ if (context.shouldRestoreFocus && context.restoreFocusTo) {
111
+ this._pendingRestoreFocusTo = context.restoreFocusTo;
112
+ this.updateComplete.then(() => {
113
+ const targetSelector = this._pendingRestoreFocusTo === "to" ? this.constructor.selectorInputTo : this.constructor.selectorInputFrom;
114
+ const targetInput = this.querySelector(targetSelector);
115
+ this._restoringFocus = true;
116
+ targetInput?.input?.focus();
117
+ this._restoringFocus = false;
118
+ this._adapter?.updateContext({
119
+ shouldRestoreFocus: false,
120
+ restoreFocusTo: null
121
+ });
122
+ this._pendingRestoreFocusTo = null;
123
+ });
124
+ }
125
+ };
126
+ this._handleCalendarDateSelect = (event) => {
127
+ const { date } = event.detail;
128
+ if (!this._adapter || !date) return;
129
+ const { _mode: mode } = this;
130
+ const context = this._adapter.getContext();
131
+ if (mode === "range") if (!context.startDate || context.endDate) this._adapter.send(DatePickerEvent.RANGE_START_SELECT, { date });
132
+ else this._adapter.send(DatePickerEvent.RANGE_END_SELECT, { date });
133
+ else this._adapter.send(DatePickerEvent.DATE_SELECT, { date });
134
+ };
135
+ this._handleCalendarMonthChange = (event) => {
136
+ const { month } = event.detail;
137
+ if (!this._adapter || !month) return;
138
+ const firstDayOfMonth = month.toPlainDate({ day: 1 });
139
+ this._adapter.updateContext({ viewDate: firstDayOfMonth });
140
+ };
141
+ this.allowInput = true;
142
+ this.closeOnSelect = true;
143
+ this.locale = "en";
144
+ this.disabled = false;
145
+ this.name = "";
146
+ this.open = false;
147
+ this.readonly = false;
148
+ this._handleKeyDown = (event) => {
149
+ if (!this._adapter) return;
150
+ const { key } = event;
151
+ if (key === "Tab") {
152
+ const composedPath = event.composedPath();
153
+ const target = composedPath[0];
154
+ const { selectorInputFrom, selectorInputTo } = this.constructor;
155
+ const inputFrom = this.querySelector(selectorInputFrom);
156
+ const inputTo = this.querySelector(selectorInputTo);
157
+ const isOnFirstInput = inputFrom && composedPath.includes(inputFrom);
158
+ const isOnSecondInput = inputTo && composedPath.includes(inputTo);
159
+ const calendar = this.shadowRoot?.querySelector("cds-preview-date-picker-calendar");
160
+ const isFocusInCalendar = target === calendar || target.closest?.("cds-preview-date-picker-calendar") !== null || composedPath.includes(calendar);
161
+ if (!this.open && (isOnFirstInput || isOnSecondInput) && !event.shiftKey) {
162
+ event.preventDefault();
163
+ event.stopPropagation();
164
+ this._lastTabCloseTime = 0;
165
+ this._adapter.send(DatePickerEvent.INPUT_FOCUS, { inputType: isOnSecondInput ? "to" : "from" });
166
+ this._adapter.send(DatePickerEvent.CALENDAR_OPEN);
167
+ this.requestUpdate();
168
+ return;
169
+ }
170
+ if (this.open && isOnFirstInput && !event.shiftKey) {
171
+ event.preventDefault();
172
+ event.stopPropagation();
173
+ const calendarDiv = (this.shadowRoot?.querySelector("cds-preview-date-picker-calendar"))?.shadowRoot?.querySelector(".cds--date-picker__calendar");
174
+ if (calendarDiv) setTimeout(() => {
175
+ calendarDiv.focus();
176
+ }, 0);
177
+ return;
178
+ }
179
+ if (this.open && isOnSecondInput && !event.shiftKey && this._mode === "range") {
180
+ event.preventDefault();
181
+ event.stopPropagation();
182
+ const calendarDiv = (this.shadowRoot?.querySelector("cds-preview-date-picker-calendar"))?.shadowRoot?.querySelector(".cds--date-picker__calendar");
183
+ if (calendarDiv) setTimeout(() => {
184
+ calendarDiv.focus();
185
+ }, 0);
186
+ return;
187
+ }
188
+ if (this.open && isFocusInCalendar && event.shiftKey) {
189
+ event.preventDefault();
190
+ if (this._mode === "range") {
191
+ if ((this._adapter?.getContext())?.lastFocusedInput === "to" && inputTo) inputTo.input?.focus();
192
+ else if (inputFrom) inputFrom.input?.focus();
193
+ } else if (inputFrom) inputFrom.input?.focus();
194
+ return;
195
+ }
196
+ if (this.open && isFocusInCalendar && !event.shiftKey) {
197
+ if (this._mode === "range") {
198
+ if ((this._adapter?.getContext())?.lastFocusedInput === "from" && inputTo) {
199
+ event.preventDefault();
200
+ inputTo.input?.focus();
201
+ return;
202
+ }
203
+ }
204
+ this._lastTabCloseTime = Date.now();
205
+ this._adapter.send(DatePickerEvent.TAB_KEY);
206
+ this._activateExitSentinel();
207
+ return;
208
+ }
209
+ }
210
+ if (!this.open) return;
211
+ const target = event.composedPath()[0];
212
+ if (target === this.shadowRoot?.querySelector("input")) return;
213
+ if (!(target.classList?.contains("cds--date-picker__calendar") || target.closest?.(".cds--date-picker__calendar") !== null)) return;
214
+ const context = this._adapter.getContext();
215
+ const currentState = this._adapter.getState();
216
+ const mappedEvent = mapKeyboardToStateMachineEvent({
217
+ key,
218
+ shiftKey: event.shiftKey,
219
+ mode: this._mode === "range" ? "range" : "single",
220
+ state: currentState,
221
+ focusedDate: context.focusedDate
222
+ });
223
+ if (mappedEvent) {
224
+ if (mappedEvent.preventDefault) event.preventDefault();
225
+ if (mappedEvent.eventType) this._adapter.send(mappedEvent.eventType, mappedEvent.payload);
226
+ if (key === "Escape") this.open = false;
227
+ return;
228
+ }
229
+ };
230
+ this._handleExitSentinelFocus = () => {
231
+ if (this._exitSentinelNode) this._exitSentinelNode.tabIndex = -1;
232
+ if (this.open) this._adapter?.send(DatePickerEvent.TAB_KEY);
233
+ };
234
+ }
235
+ /**
236
+ * @returns The effective date picker mode, determined by the child `<cds-preview-date-picker-input>`.
237
+ */
238
+ get _mode() {
239
+ const { selectorInputTo } = this.constructor;
240
+ if (this.querySelector(selectorInputTo)) return "range";
241
+ if (this.querySelector(`cds-preview-date-picker-input[kind="single"]`)) return "single";
242
+ return "simple";
243
+ }
244
+ /**
245
+ * Handles form data event
246
+ *
247
+ * @param {FormDataEvent} event - The form data event
248
+ */
249
+ _handleFormdata(event) {
250
+ const { formData } = event;
251
+ const { disabled, name, value } = this;
252
+ if (!disabled) formData.append(name, value);
253
+ }
254
+ /**
255
+ * Handles `slotchange` event in the `<slot>`.
256
+ *
257
+ * @param {Event} root0 - The event object
258
+ * @param {EventTarget} root0.target - The event target
259
+ */
260
+ _handleSlotChange({ target }) {
261
+ const { _dateInteractNode: oldDateInteractNode } = this;
262
+ const dateInteractNode = target.assignedNodes().find((node) => node.nodeType === Node.ELEMENT_NODE && node.matches(this.constructor.selectorInputFrom));
263
+ if (oldDateInteractNode !== dateInteractNode) {
264
+ this._dateInteractNode = dateInteractNode;
265
+ this._initializeDatePicker();
266
+ }
267
+ }
268
+ /**
269
+ * Show the calendar popover using Popover API
270
+ */
271
+ _showCalendarPopover() {
272
+ const popover = this.shadowRoot?.querySelector(`#cds-preview-date-picker-calendar-popover`);
273
+ if (popover && typeof popover.showPopover === "function") try {
274
+ popover.showPopover();
275
+ } catch (e) {
276
+ console.warn("Could not show popover:", e);
277
+ }
278
+ }
279
+ /**
280
+ * Hide the calendar popover using Popover API
281
+ */
282
+ _hideCalendarPopover() {
283
+ const popover = this.shadowRoot?.querySelector(`#cds-preview-date-picker-calendar-popover`);
284
+ if (popover && typeof popover.hidePopover === "function") try {
285
+ popover.hidePopover();
286
+ } catch (e) {
287
+ console.warn("Could not hide popover:", e);
288
+ }
289
+ }
290
+ /**
291
+ * Initializes the date picker with a state machine.
292
+ */
293
+ _initializeDatePicker() {
294
+ this._releaseDatePicker();
295
+ const { _dateInteractNode: dateInteractNode, _mode: mode } = this;
296
+ if (!dateInteractNode || !dateInteractNode.input || mode === "simple") return;
297
+ this._adapter = new WebComponentAdapter({
298
+ component: this,
299
+ initialContext: {
300
+ mode: mode === "range" ? "range" : "single",
301
+ dateFormat: this.dateFormat || "m/d/Y",
302
+ allowInput: this.allowInput,
303
+ closeOnSelect: this.closeOnSelect,
304
+ value: this.value || "",
305
+ startDate: null,
306
+ endDate: null,
307
+ isOpen: false,
308
+ isFocused: false,
309
+ isDisabled: this.disabled,
310
+ isReadonly: this.readonly,
311
+ isInvalid: false,
312
+ lastFocusedInput: null,
313
+ minDate: parseDateToPlainDate(this.minDate),
314
+ maxDate: parseDateToPlainDate(this.maxDate)
315
+ },
316
+ onStateChange: this._handleStateChange
317
+ });
318
+ if (this.value) {
319
+ const dates = this.value.split("/").filter(Boolean);
320
+ if (dates.length > 0) {
321
+ this._adapter.send(mode === "range" ? DatePickerEvent.RANGE_START_SELECT : DatePickerEvent.DATE_SELECT, { date: dates[0] });
322
+ if (mode === "range" && dates.length > 1) this._adapter.send(DatePickerEvent.RANGE_END_SELECT, { date: dates[1] });
323
+ }
324
+ }
325
+ }
326
+ /**
327
+ * Releases the date picker state machine.
328
+ */
329
+ _releaseDatePicker() {
330
+ this._pendingRestoreFocusTo = null;
331
+ if (this._adapter) {
332
+ this._adapter.destroy();
333
+ this._adapter = null;
334
+ }
335
+ }
336
+ /**
337
+ * The date(s) in ISO8601 format (date portion only), for range mode, '/' is used for separate start/end dates.
338
+ */
339
+ get value() {
340
+ return this._value;
341
+ }
342
+ /**
343
+ * Sets the value
344
+ *
345
+ * @param {string} value - The new value
346
+ */
347
+ set value(value) {
348
+ const { _value: oldValue } = this;
349
+ this._value = value;
350
+ this.requestUpdate("value", oldValue);
351
+ }
352
+ /**
353
+ * Temporarily make the exit sentinel tabbable so the browser's native Tab
354
+ * handling delivers focus to it after the calendar.
355
+ */
356
+ _activateExitSentinel() {
357
+ if (this._exitSentinelNode) this._exitSentinelNode.tabIndex = 0;
358
+ }
359
+ /**
360
+ * Lifecycle callback when element is connected
361
+ */
362
+ connectedCallback() {
363
+ super.connectedCallback();
364
+ this._initializeDatePicker();
365
+ this._clickOutsideHandler = new ClickOutsideHandler({
366
+ isOpen: this.open,
367
+ /**
368
+ * Check if a node is contained within the date picker
369
+ * @param {Node} node - The node to check
370
+ * @returns {boolean} True if the node is within the date picker
371
+ */
372
+ containsNode: (node) => {
373
+ return node === this || this.contains(node) || (this.shadowRoot?.contains(node) ?? false);
374
+ },
375
+ /**
376
+ * Handle clicks outside the date picker
377
+ */
378
+ onOutsideClick: () => {
379
+ if (this._adapter) this._adapter.send(DatePickerEvent.OUTSIDE_CLICK);
380
+ },
381
+ useCapture: true,
382
+ attachDelay: 0
383
+ });
384
+ this._clickOutsideHandler.attach();
385
+ document.addEventListener("keydown", this._handleKeyDown, true);
386
+ }
387
+ /**
388
+ * Lifecycle callback when element is disconnected
389
+ */
390
+ disconnectedCallback() {
391
+ this._clickOutsideHandler?.detach();
392
+ this._clickOutsideHandler = null;
393
+ document.removeEventListener("keydown", this._handleKeyDown, true);
394
+ this._releaseDatePicker();
395
+ super.disconnectedCallback();
396
+ }
397
+ /**
398
+ * Lifecycle callback when properties change
399
+ *
400
+ * @param {Map<string, unknown>} changedProperties - Map of changed properties
401
+ */
402
+ updated(changedProperties) {
403
+ if (changedProperties.has("open")) this._clickOutsideHandler?.updateConfig({ isOpen: this.open });
404
+ if (this._adapter) {
405
+ if (changedProperties.has("minDate") || changedProperties.has("maxDate")) this._adapter.updateContext({
406
+ minDate: parseDateToPlainDate(this.minDate),
407
+ maxDate: parseDateToPlainDate(this.maxDate)
408
+ });
409
+ if (changedProperties.has("open")) {
410
+ if (this.open && !this.readonly) {
411
+ this._adapter.send(DatePickerEvent.CALENDAR_OPEN);
412
+ this._showCalendarPopover();
413
+ } else if (!this.open) {
414
+ this._adapter.send(DatePickerEvent.CALENDAR_CLOSE);
415
+ this._hideCalendarPopover();
416
+ }
417
+ }
418
+ if (changedProperties.has("closeOnSelect")) this._adapter.updateContext({ closeOnSelect: this.closeOnSelect });
419
+ if (changedProperties.has("disabled") || changedProperties.has("readonly")) {
420
+ const { selectorInputFrom, selectorInputTo } = this.constructor;
421
+ [this.querySelector(selectorInputFrom), this.querySelector(selectorInputTo)].forEach((input) => {
422
+ if (input) {
423
+ input.disabled = this.disabled;
424
+ input.readonly = this.readonly;
425
+ }
426
+ });
427
+ this._adapter.updateContext({
428
+ isDisabled: this.disabled,
429
+ isReadonly: this.readonly
430
+ });
431
+ }
432
+ if (changedProperties.has("value") && this.value) {
433
+ const dates = this.value.split("/").filter(Boolean);
434
+ if (dates.length > 0) {
435
+ const startDate = parseISOToPlainDate(dates[0]);
436
+ if (startDate) {
437
+ this._adapter.send(this._mode === "range" ? DatePickerEvent.RANGE_START_SELECT : DatePickerEvent.DATE_SELECT, { date: startDate });
438
+ if (this._mode === "range" && dates.length > 1) {
439
+ const endDate = parseISOToPlainDate(dates[1]);
440
+ if (endDate) this._adapter.send(DatePickerEvent.RANGE_END_SELECT, { date: endDate });
441
+ }
442
+ }
443
+ }
444
+ }
445
+ }
446
+ }
447
+ /**
448
+ * Renders the component
449
+ */
450
+ render() {
451
+ const { _handleSlotChange: handleSlotChange, _mode: mode, open } = this;
452
+ const context = this._adapter?.getContext();
453
+ const selectedDates = context?.endDate ? [context.startDate, context.endDate].filter((date) => Boolean(date)) : context?.startDate ? [context.startDate] : [];
454
+ return html`
455
+ <slot @slotchange="${handleSlotChange}"></slot>
456
+ <div
457
+ id="floating-menu-container"
458
+ class="${"cds"}--date-picker__calendar-container">
459
+ ${mode !== "simple" && open ? html`
460
+ <cds-preview-date-picker-calendar
461
+ .rangeMode="${mode === "range"}"
462
+ .dateFormat="${this.dateFormat || "m/d/Y"}"
463
+ .locale="${this.locale}"
464
+ .minDate="${parseDateToPlainDate(this.minDate) || void 0}"
465
+ .maxDate="${parseDateToPlainDate(this.maxDate) || void 0}"
466
+ .selectedDates="${selectedDates}"
467
+ .viewDate="${context?.viewDate || void 0}"
468
+ .focusedDate="${context?.focusedDate || null}"
469
+ @cds-preview-date-picker-calendar-date-select="${this._handleCalendarDateSelect}"
470
+ @cds-preview-date-picker-calendar-month-change="${this._handleCalendarMonthChange}">
471
+ </cds-preview-date-picker-calendar>
472
+ ` : ""}
473
+ </div>
474
+ <!--
475
+ Exit sentinel: sits just after the calendar container in shadow-DOM tab
476
+ order. Normally tabindex="-1" (invisible to Tab). _activateExitSentinel()
477
+ sets it to tabindex="0" when the user presses Tab from the calendar, so the
478
+ browser delivers that Tab keystroke here naturally. The focus handler then
479
+ closes the calendar and restores tabindex="-1".
480
+ -->
481
+ <span
482
+ class="${"cds"}--date-picker__exit-sentinel"
483
+ tabindex="-1"
484
+ aria-hidden="true"
485
+ @focus="${this._handleExitSentinelFocus}"></span>
486
+ `;
487
+ }
488
+ /**
489
+ * The CSS class for the calendar dropdown.
490
+ */
491
+ static get classCalendarContainer() {
492
+ return `cds--date-picker__calendar`;
493
+ }
494
+ /**
495
+ * The CSS class for the month navigator.
496
+ */
497
+ static get classMonth() {
498
+ return `cds--date-picker__month`;
499
+ }
500
+ /**
501
+ * The CSS class for the container of the weekdays.
502
+ */
503
+ static get classWeekdays() {
504
+ return `cds--date-picker__weekdays`;
505
+ }
506
+ /**
507
+ * The CSS class for the container of the days.
508
+ */
509
+ static get classDays() {
510
+ return `cds--date-picker__days`;
511
+ }
512
+ /**
513
+ * The CSS class applied to each weekdays.
514
+ */
515
+ static get classWeekday() {
516
+ return `cds--date-picker__weekday`;
517
+ }
518
+ /**
519
+ * The CSS class applied to each days.
520
+ */
521
+ static get classDay() {
522
+ return `cds--date-picker__day`;
523
+ }
524
+ static {
525
+ this.classNoBorder = "no-border";
526
+ }
527
+ static {
528
+ this.defaultDateFormat = "m/d/Y";
529
+ }
530
+ /**
531
+ * A selector that will return the `<input>` to enter starting date.
532
+ */
533
+ static get selectorInputFrom() {
534
+ return `cds-preview-date-picker-input,cds-preview-date-picker-input[kind="from"]`;
535
+ }
536
+ /**
537
+ * A selector that will return the `<input>` to enter end date.
538
+ */
539
+ static get selectorInputTo() {
540
+ return `cds-preview-date-picker-input[kind="to"]`;
541
+ }
542
+ /**
543
+ * The name of the custom event when an error occurs.
544
+ */
545
+ static get eventError() {
546
+ return `cds-preview-date-picker-error`;
547
+ }
548
+ /**
549
+ * The name of the custom event fired when the date selection changes.
550
+ */
551
+ static get eventChange() {
552
+ return `cds-preview-date-picker-changed`;
553
+ }
554
+ /**
555
+ * The name of the custom event fired when the calendar icon is clicked.
556
+ */
557
+ static get eventIconClick() {
558
+ return `cds-preview-date-picker-icon-click`;
559
+ }
560
+ /**
561
+ * The name of the custom event fired when an input receives focus.
562
+ */
563
+ static get eventInputFocus() {
564
+ return `cds-preview-date-picker-input-focus`;
565
+ }
566
+ /**
567
+ * The name of the custom event fired when an input loses focus.
568
+ */
569
+ static get eventInputBlur() {
570
+ return `cds-preview-date-picker-input-blur`;
571
+ }
572
+ /**
573
+ * The name of the custom event fired when an input is clicked.
574
+ */
575
+ static get eventInputClick() {
576
+ return `cds-preview-date-picker-input-click`;
577
+ }
578
+ static {
579
+ this.styles = date_picker_default$1;
580
+ }
581
+ };
582
+ __decorate([HostListener("eventChange")], CDSDatePicker.prototype, "_handleChange", void 0);
583
+ __decorate([HostListener("eventIconClick")], CDSDatePicker.prototype, "_handleIconClick", void 0);
584
+ __decorate([HostListener("eventInputFocus")], CDSDatePicker.prototype, "_handleInputFocus", void 0);
585
+ __decorate([HostListener("eventInputClick")], CDSDatePicker.prototype, "_handleInputClick", void 0);
586
+ __decorate([HostListener("eventInputBlur")], CDSDatePicker.prototype, "_handleInputBlur", void 0);
587
+ __decorate([property({
588
+ type: Boolean,
589
+ reflect: true,
590
+ attribute: "allow-input"
591
+ })], CDSDatePicker.prototype, "allowInput", void 0);
592
+ __decorate([property({
593
+ type: Boolean,
594
+ reflect: true,
595
+ attribute: "close-on-select"
596
+ })], CDSDatePicker.prototype, "closeOnSelect", void 0);
597
+ __decorate([property({ attribute: "date-format" })], CDSDatePicker.prototype, "dateFormat", void 0);
598
+ __decorate([property({ reflect: true })], CDSDatePicker.prototype, "locale", void 0);
599
+ __decorate([property({
600
+ type: Boolean,
601
+ reflect: true
602
+ })], CDSDatePicker.prototype, "disabled", void 0);
603
+ __decorate([property({ attribute: "max-date" })], CDSDatePicker.prototype, "maxDate", void 0);
604
+ __decorate([property({ attribute: "min-date" })], CDSDatePicker.prototype, "minDate", void 0);
605
+ __decorate([property()], CDSDatePicker.prototype, "name", void 0);
606
+ __decorate([property({
607
+ type: Boolean,
608
+ reflect: true
609
+ })], CDSDatePicker.prototype, "open", void 0);
610
+ __decorate([property({
611
+ type: Boolean,
612
+ reflect: true
613
+ })], CDSDatePicker.prototype, "readonly", void 0);
614
+ __decorate([property()], CDSDatePicker.prototype, "value", null);
615
+ __decorate([query(`.cds--date-picker__exit-sentinel`)], CDSDatePicker.prototype, "_exitSentinelNode", void 0);
616
+ CDSDatePicker = __decorate([carbonElement(`cds-preview-date-picker`)], CDSDatePicker);
617
+ var date_picker_default = CDSDatePicker;
618
+ //#endregion
619
+ export { date_picker_default as default };
620
+
621
+ //# sourceMappingURL=date-picker.js.map