@m3e/web 2.1.2 → 2.2.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 (193) hide show
  1. package/README.md +3 -0
  2. package/dist/all.js +2783 -354
  3. package/dist/all.js.map +1 -1
  4. package/dist/all.min.js +77 -41
  5. package/dist/all.min.js.map +1 -1
  6. package/dist/app-bar.js +14 -7
  7. package/dist/app-bar.js.map +1 -1
  8. package/dist/app-bar.min.js +1 -1
  9. package/dist/app-bar.min.js.map +1 -1
  10. package/dist/autocomplete.js +24 -26
  11. package/dist/autocomplete.js.map +1 -1
  12. package/dist/autocomplete.min.js +1 -1
  13. package/dist/autocomplete.min.js.map +1 -1
  14. package/dist/bottom-sheet.js +8 -27
  15. package/dist/bottom-sheet.js.map +1 -1
  16. package/dist/bottom-sheet.min.js +1 -1
  17. package/dist/bottom-sheet.min.js.map +1 -1
  18. package/dist/calendar.js +1082 -0
  19. package/dist/calendar.js.map +1 -0
  20. package/dist/calendar.min.js +43 -0
  21. package/dist/calendar.min.js.map +1 -0
  22. package/dist/card.js +4 -2
  23. package/dist/card.js.map +1 -1
  24. package/dist/card.min.js +1 -1
  25. package/dist/card.min.js.map +1 -1
  26. package/dist/chips.js +2 -6
  27. package/dist/chips.js.map +1 -1
  28. package/dist/chips.min.js +1 -1
  29. package/dist/chips.min.js.map +1 -1
  30. package/dist/core-a11y.js +23 -9
  31. package/dist/core-a11y.js.map +1 -1
  32. package/dist/core-a11y.min.js +4 -4
  33. package/dist/core-a11y.min.js.map +1 -1
  34. package/dist/core-anchoring.js +135 -15
  35. package/dist/core-anchoring.js.map +1 -1
  36. package/dist/core-anchoring.min.js +1 -1
  37. package/dist/core-anchoring.min.js.map +1 -1
  38. package/dist/core.js +101 -1
  39. package/dist/core.js.map +1 -1
  40. package/dist/core.min.js +1 -1
  41. package/dist/core.min.js.map +1 -1
  42. package/dist/css-custom-data.json +962 -462
  43. package/dist/custom-elements.json +16838 -12546
  44. package/dist/datepicker.js +552 -0
  45. package/dist/datepicker.js.map +1 -0
  46. package/dist/datepicker.min.js +7 -0
  47. package/dist/datepicker.min.js.map +1 -0
  48. package/dist/fab-menu.js +1 -1
  49. package/dist/fab-menu.js.map +1 -1
  50. package/dist/fab-menu.min.js +1 -1
  51. package/dist/fab-menu.min.js.map +1 -1
  52. package/dist/form-field.js +2 -6
  53. package/dist/form-field.js.map +1 -1
  54. package/dist/form-field.min.js +3 -3
  55. package/dist/form-field.min.js.map +1 -1
  56. package/dist/html-custom-data.json +546 -180
  57. package/dist/menu.js +3 -7
  58. package/dist/menu.js.map +1 -1
  59. package/dist/menu.min.js +1 -1
  60. package/dist/menu.min.js.map +1 -1
  61. package/dist/nav-menu.js +3 -11
  62. package/dist/nav-menu.js.map +1 -1
  63. package/dist/nav-menu.min.js +1 -1
  64. package/dist/nav-menu.min.js.map +1 -1
  65. package/dist/nav-rail.js +2 -6
  66. package/dist/nav-rail.js.map +1 -1
  67. package/dist/nav-rail.min.js +1 -1
  68. package/dist/nav-rail.min.js.map +1 -1
  69. package/dist/option.js +5 -6
  70. package/dist/option.js.map +1 -1
  71. package/dist/option.min.js +1 -1
  72. package/dist/option.min.js.map +1 -1
  73. package/dist/paginator.js +2 -2
  74. package/dist/paginator.js.map +1 -1
  75. package/dist/paginator.min.js +1 -1
  76. package/dist/paginator.min.js.map +1 -1
  77. package/dist/search.js +805 -0
  78. package/dist/search.js.map +1 -0
  79. package/dist/search.min.js +7 -0
  80. package/dist/search.min.js.map +1 -0
  81. package/dist/select.js +5 -16
  82. package/dist/select.js.map +1 -1
  83. package/dist/select.min.js +1 -1
  84. package/dist/select.min.js.map +1 -1
  85. package/dist/snackbar.js +2 -6
  86. package/dist/snackbar.js.map +1 -1
  87. package/dist/snackbar.min.js +1 -1
  88. package/dist/snackbar.min.js.map +1 -1
  89. package/dist/src/all.d.ts +3 -0
  90. package/dist/src/all.d.ts.map +1 -1
  91. package/dist/src/app-bar/AppBarElement.d.ts +6 -4
  92. package/dist/src/app-bar/AppBarElement.d.ts.map +1 -1
  93. package/dist/src/autocomplete/AutocompleteElement.d.ts +2 -2
  94. package/dist/src/autocomplete/AutocompleteElement.d.ts.map +1 -1
  95. package/dist/src/autocomplete/AutocompleteQueryEventDetail.d.ts +12 -0
  96. package/dist/src/autocomplete/AutocompleteQueryEventDetail.d.ts.map +1 -0
  97. package/dist/src/autocomplete/QueryEventDetail.d.ts +3 -8
  98. package/dist/src/autocomplete/QueryEventDetail.d.ts.map +1 -1
  99. package/dist/src/autocomplete/index.d.ts +1 -0
  100. package/dist/src/autocomplete/index.d.ts.map +1 -1
  101. package/dist/src/bottom-sheet/BottomSheetElement.d.ts.map +1 -1
  102. package/dist/src/calendar/CalendarElement.d.ts +213 -0
  103. package/dist/src/calendar/CalendarElement.d.ts.map +1 -0
  104. package/dist/src/calendar/CalendarView.d.ts +3 -0
  105. package/dist/src/calendar/CalendarView.d.ts.map +1 -0
  106. package/dist/src/calendar/CalendarViewElementBase.d.ts +28 -0
  107. package/dist/src/calendar/CalendarViewElementBase.d.ts.map +1 -0
  108. package/dist/src/calendar/MonthViewElement.d.ts +36 -0
  109. package/dist/src/calendar/MonthViewElement.d.ts.map +1 -0
  110. package/dist/src/calendar/MultiYearViewElement.d.ts +27 -0
  111. package/dist/src/calendar/MultiYearViewElement.d.ts.map +1 -0
  112. package/dist/src/calendar/YearViewElement.d.ts +27 -0
  113. package/dist/src/calendar/YearViewElement.d.ts.map +1 -0
  114. package/dist/src/calendar/index.d.ts +7 -0
  115. package/dist/src/calendar/index.d.ts.map +1 -0
  116. package/dist/src/calendar/utils.d.ts +24 -0
  117. package/dist/src/calendar/utils.d.ts.map +1 -0
  118. package/dist/src/card/CardElement.d.ts.map +1 -1
  119. package/dist/src/chips/InputChipSetElement.d.ts.map +1 -1
  120. package/dist/src/core/a11y/FocusTrapElement.d.ts.map +1 -1
  121. package/dist/src/core/a11y/InteractivityChecker.d.ts.map +1 -1
  122. package/dist/src/core/anchoring/AnchorOptions.d.ts +1 -1
  123. package/dist/src/core/anchoring/AnchorOptions.d.ts.map +1 -1
  124. package/dist/src/core/anchoring/FloatingPanelElement.d.ts +18 -3
  125. package/dist/src/core/anchoring/FloatingPanelElement.d.ts.map +1 -1
  126. package/dist/src/core/anchoring/positionAnchor.d.ts.map +1 -1
  127. package/dist/src/core/shared/controllers/InertController.d.ts +19 -0
  128. package/dist/src/core/shared/controllers/InertController.d.ts.map +1 -0
  129. package/dist/src/core/shared/controllers/index.d.ts +1 -0
  130. package/dist/src/core/shared/controllers/index.d.ts.map +1 -1
  131. package/dist/src/core/shared/converters/dateConverter.d.ts +4 -0
  132. package/dist/src/core/shared/converters/dateConverter.d.ts.map +1 -0
  133. package/dist/src/core/shared/converters/index.d.ts +1 -0
  134. package/dist/src/core/shared/converters/index.d.ts.map +1 -1
  135. package/dist/src/core/shared/utils/index.d.ts +1 -0
  136. package/dist/src/core/shared/utils/index.d.ts.map +1 -1
  137. package/dist/src/core/shared/utils/registerStyleSheet.d.ts +7 -0
  138. package/dist/src/core/shared/utils/registerStyleSheet.d.ts.map +1 -0
  139. package/dist/src/datepicker/DatepickerElement.d.ts +237 -0
  140. package/dist/src/datepicker/DatepickerElement.d.ts.map +1 -0
  141. package/dist/src/datepicker/DatepickerToggleElement.d.ts +21 -0
  142. package/dist/src/datepicker/DatepickerToggleElement.d.ts.map +1 -0
  143. package/dist/src/datepicker/DatepickerVariant.d.ts +3 -0
  144. package/dist/src/datepicker/DatepickerVariant.d.ts.map +1 -0
  145. package/dist/src/datepicker/index.d.ts +4 -0
  146. package/dist/src/datepicker/index.d.ts.map +1 -0
  147. package/dist/src/form-field/FormFieldElement.d.ts.map +1 -1
  148. package/dist/src/menu/MenuElement.d.ts.map +1 -1
  149. package/dist/src/nav-menu/NavMenuElement.d.ts.map +1 -1
  150. package/dist/src/nav-menu/NavMenuItemElement.d.ts.map +1 -1
  151. package/dist/src/nav-rail/NavRailElement.d.ts.map +1 -1
  152. package/dist/src/option/OptionElement.d.ts.map +1 -1
  153. package/dist/src/option/OptionPanelElement.d.ts.map +1 -1
  154. package/dist/src/paginator/PageEventDetail.d.ts +6 -11
  155. package/dist/src/paginator/PageEventDetail.d.ts.map +1 -1
  156. package/dist/src/paginator/PaginatorElement.d.ts +3 -3
  157. package/dist/src/paginator/PaginatorElement.d.ts.map +1 -1
  158. package/dist/src/paginator/PaginatorPageEventDetail.d.ts +12 -0
  159. package/dist/src/paginator/PaginatorPageEventDetail.d.ts.map +1 -0
  160. package/dist/src/paginator/index.d.ts +1 -0
  161. package/dist/src/paginator/index.d.ts.map +1 -1
  162. package/dist/src/search/SearchBarElement.d.ts +92 -0
  163. package/dist/src/search/SearchBarElement.d.ts.map +1 -0
  164. package/dist/src/search/SearchViewElement.d.ts +146 -0
  165. package/dist/src/search/SearchViewElement.d.ts.map +1 -0
  166. package/dist/src/search/SearchViewMode.d.ts +3 -0
  167. package/dist/src/search/SearchViewMode.d.ts.map +1 -0
  168. package/dist/src/search/SearchViewQueryEventDetail.d.ts +12 -0
  169. package/dist/src/search/SearchViewQueryEventDetail.d.ts.map +1 -0
  170. package/dist/src/search/index.d.ts +5 -0
  171. package/dist/src/search/index.d.ts.map +1 -0
  172. package/dist/src/search/styles/SearchBarStyle.d.ts +12 -0
  173. package/dist/src/search/styles/SearchBarStyle.d.ts.map +1 -0
  174. package/dist/src/search/styles/SearchBarToken.d.ts +27 -0
  175. package/dist/src/search/styles/SearchBarToken.d.ts.map +1 -0
  176. package/dist/src/search/styles/SearchViewStyle.d.ts +12 -0
  177. package/dist/src/search/styles/SearchViewStyle.d.ts.map +1 -0
  178. package/dist/src/search/styles/SearchViewToken.d.ts +26 -0
  179. package/dist/src/search/styles/SearchViewToken.d.ts.map +1 -0
  180. package/dist/src/search/styles/index.d.ts +3 -0
  181. package/dist/src/search/styles/index.d.ts.map +1 -0
  182. package/dist/src/select/SelectElement.d.ts.map +1 -1
  183. package/dist/src/snackbar/SnackbarElement.d.ts.map +1 -1
  184. package/dist/src/stepper/StepperElement.d.ts.map +1 -1
  185. package/dist/stepper.js +2 -6
  186. package/dist/stepper.js.map +1 -1
  187. package/dist/stepper.min.js +1 -1
  188. package/dist/stepper.min.js.map +1 -1
  189. package/dist/tooltip.js +1 -1
  190. package/dist/tooltip.js.map +1 -1
  191. package/dist/tooltip.min.js +1 -1
  192. package/dist/tooltip.min.js.map +1 -1
  193. package/package.json +16 -1
@@ -0,0 +1,1082 @@
1
+ /**
2
+ * @license MIT
3
+ * Copyright (c) 2025 matraic
4
+ * See LICENSE file in the project root for full license text.
5
+ */
6
+ import { __decorate, __classPrivateFieldGet, __classPrivateFieldSet } from 'tslib';
7
+ import { css, LitElement, html, nothing, unsafeCSS } from 'lit';
8
+ import { query, property, state } from 'lit/decorators.js';
9
+ import { classMap } from 'lit/directives/class-map.js';
10
+ import { ifDefined } from 'lit/directives/if-defined.js';
11
+ import { DesignToken, dateConverter, focusWhenReady, customElement, prefersReducedMotion } from '@m3e/web/core';
12
+ import { M3eDirectionality } from '@m3e/web/core/bidi';
13
+ import '@m3e/web/button';
14
+ import '@m3e/web/icon-button';
15
+ import '@m3e/web/tooltip';
16
+
17
+ /** @private */
18
+ function createDateWithOverflow(year, month, day) {
19
+ const date = new Date();
20
+ date.setFullYear(year, month, day);
21
+ date.setHours(0, 0, 0, 0);
22
+ return date;
23
+ }
24
+ /** @private */
25
+ function getStartingYear(minDate, maxDate) {
26
+ if (maxDate) {
27
+ return maxDate.getFullYear() - YEARS_PER_PAGE + 1;
28
+ } else if (minDate) {
29
+ return minDate.getFullYear();
30
+ }
31
+ return 0;
32
+ }
33
+ /** @private */
34
+ function euclideanModulo(a, b) {
35
+ return (a % b + b) % b;
36
+ }
37
+ /** @internal */
38
+ function addCalendarDays(date, days) {
39
+ return createDateWithOverflow(date.getFullYear(), date.getMonth(), date.getDate() + days);
40
+ }
41
+ /** @internal */
42
+ function addCalendarMonths(date, months) {
43
+ let newDate = createDateWithOverflow(date.getFullYear(), date.getMonth() + months, date.getDate());
44
+ if (newDate.getMonth() != ((date.getMonth() + months) % 12 + 12) % 12) {
45
+ newDate = createDateWithOverflow(newDate.getFullYear(), newDate.getMonth(), 0);
46
+ }
47
+ return newDate;
48
+ }
49
+ /** @internal */
50
+ function addCalendarYears(date, years) {
51
+ return addCalendarMonths(date, years * 12);
52
+ }
53
+ /** @internal */
54
+ function getNumDaysInMonth(date) {
55
+ return createDateWithOverflow(date.getFullYear(), date.getMonth() + 1, 0).getDate();
56
+ }
57
+ /** @internal */
58
+ function compareDate(first, second) {
59
+ return first.getFullYear() - second.getFullYear() || first.getMonth() - second.getMonth() || first.getDate() - second.getDate();
60
+ }
61
+ /** @internal */
62
+ function sameDate(first, second) {
63
+ return first && second ? compareDate(first, second) == 0 : first == second;
64
+ }
65
+ /** @internal */
66
+ function getActiveOffset(activeDate, minDate, maxDate) {
67
+ return euclideanModulo(activeDate.getFullYear() - getStartingYear(minDate, maxDate), YEARS_PER_PAGE);
68
+ }
69
+ /** @internal */
70
+ function minYearOfPage(activeDate, minDate, maxDate) {
71
+ return activeDate.getFullYear() - getActiveOffset(activeDate, minDate, maxDate);
72
+ }
73
+ /** @internal */
74
+ function maxYearOfPage(activeDate, minDate, maxDate) {
75
+ return minYearOfPage(activeDate, minDate, maxDate) + YEARS_PER_PAGE - 1;
76
+ }
77
+ /** @internal */
78
+ function clampDate(date, minDate, maxDate) {
79
+ if (minDate && compareDate(date, minDate) < 0) return minDate;
80
+ if (maxDate && compareDate(date, maxDate) > 0) return maxDate;
81
+ return date;
82
+ }
83
+ /** @internal */
84
+ const YEARS_PER_PAGE = 15;
85
+ /** @internal */
86
+ const YEARS_PER_ROW = 3;
87
+ /** @internal */
88
+ const MONTHS_PER_ROW = 4;
89
+
90
+ /**
91
+ * A base implementation for a view in a calendar. This class must be inherited.
92
+ * @internal
93
+ */
94
+ class CalendarViewElementBase extends LitElement {
95
+ constructor() {
96
+ super(...arguments);
97
+ /** Today's date. */
98
+ this.today = new Date();
99
+ /** The selected date. */
100
+ this.date = null;
101
+ /** The active date. */
102
+ this.activeDate = new Date();
103
+ /** The minimum date that can be selected. */
104
+ this.minDate = null;
105
+ /** The maximum date that can be selected. */
106
+ this.maxDate = null;
107
+ }
108
+ /**
109
+ * Asynchronously focuses the active date.
110
+ * @returns {Promise<void>} A promise that resolves after the active date has been focused.
111
+ */
112
+ async focusActiveCell() {
113
+ if (this.isUpdatePending) {
114
+ await this.updateComplete;
115
+ }
116
+ if (this._activeItem) {
117
+ await focusWhenReady(this._activeItem);
118
+ }
119
+ }
120
+ /** @internal */
121
+ _changeActiveDate(activeDate) {
122
+ activeDate = clampDate(activeDate, this.minDate, this.maxDate);
123
+ if (!sameDate(activeDate, this.activeDate)) {
124
+ this._activeItem?.style.setProperty("--m3e-state-layer-duration", "0ms");
125
+ this._activeItem?.blur();
126
+ this._activeItem?.style.removeProperty("--m3e-state-layer-duration");
127
+ this.activeDate = activeDate;
128
+ this.dispatchEvent(new Event("active-change", {
129
+ bubbles: false
130
+ }));
131
+ }
132
+ }
133
+ }
134
+ /** The styles of the element. */
135
+ CalendarViewElementBase.styles = css`:host { display: inline-block; user-select: none; vertical-align: top; } .visually-hidden { position: absolute; appearance: none; visibility: hidden; border: none; outline: none; overflow: hidden; left: 0; height: 1px; width: 1px; margin: -1px; padding: 0; white-space: nowrap; } table { border-collapse: collapse; border-spacing: 0; width: calc(3rem * 7); } td, th { font: inherit; text-align: center; padding: unset; } td { box-sizing: border-box; height: 3rem; padding: 0.25rem; position: relative; } .item, .item > span { position: relative; } .item { display: flex; align-items: center; justify-content: center; border-radius: inherit; outline: none; width: 100%; height: 100%; border-radius: ${DesignToken.shape.corner.full}; } .item:not([aria-disabled]) { cursor: pointer; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } .touch { position: absolute; height: 3rem; width: 3rem; margin: auto; } td:not(:has(.item[aria-disabled])).selected { color: var(--m3e-calendar-item-selected-color, ${DesignToken.color.onPrimary}); --m3e-ripple-color: var(--m3e-calendar-item-selected-ripple-color, ${DesignToken.color.onPrimary}); --m3e-state-layer-hover-color: var(--m3e-calendar-item-selected-hover-color, ${DesignToken.color.onPrimary}); --m3e-state-layer-focus-color: var(--m3e-calendar-item-selected-focus-color, ${DesignToken.color.onPrimary}); } td:not(:has(.item[aria-disabled])).selected .state-layer { background-color: var(--m3e-calendar-item-selected-container-color, ${DesignToken.color.primary}); } td.current:not(.selected):not(.special):not(.range-start):not(.range-end) { color: var(--m3e-calendar-item-current-outline-color, ${DesignToken.color.primary}); } td.current:not(.selected):not(.special):not(.range-start):not(.range-end) .state-layer { outline-style: solid; outline-offset: -1px; outline-width: var(--m3e-calendar-item-current-outline-thickness, 1px); outline-color: var(--m3e-calendar-item-current-outline-color, ${DesignToken.color.primary}); } td:has(.item[aria-disabled]) { color: color-mix( in srgb, var(--m3e-calendar-item-disabled-color, ${DesignToken.color.onSurface}) var(--m3e-calendar-item-disabled-color-opacity, 38%), transparent ); } @media (forced-colors: active) { td:not(:has(.item[aria-disabled])).selected { forced-color-adjust: none; color: ButtonFace; } td:not(:has(.item[aria-disabled])).selected .state-layer { background-color: ButtonText; } td:has(.item[aria-disabled]) { color: GrayText; } td.current:not(.selected):not(.special):not(.range-start):not(.range-end) { color: ButtonText; } td.current:not(.selected):not(.special):not(.range-start):not(.range-end) .state-layer { border-color: ButtonText; } }`;
136
+ __decorate([query(".active > .item")], CalendarViewElementBase.prototype, "_activeItem", void 0);
137
+ __decorate([property({
138
+ converter: dateConverter
139
+ })], CalendarViewElementBase.prototype, "today", void 0);
140
+ __decorate([property({
141
+ converter: dateConverter
142
+ })], CalendarViewElementBase.prototype, "date", void 0);
143
+ __decorate([property({
144
+ attribute: "active-date",
145
+ converter: dateConverter
146
+ })], CalendarViewElementBase.prototype, "activeDate", void 0);
147
+ __decorate([property({
148
+ attribute: "min-date",
149
+ converter: dateConverter
150
+ })], CalendarViewElementBase.prototype, "minDate", void 0);
151
+ __decorate([property({
152
+ attribute: "max-date",
153
+ converter: dateConverter
154
+ })], CalendarViewElementBase.prototype, "maxDate", void 0);
155
+
156
+ /**
157
+ * Adapted from Angular Material Datepicker
158
+ * Source: https://github.com/angular/components/blob/main/src/material/datepicker/month-view.ts
159
+ *
160
+ * @license MIT
161
+ * Copyright (c) 2025 Google LLC
162
+ * See LICENSE file in the project root for full license text.
163
+ */
164
+ var _M3eMonthViewElement_instances, _M3eMonthViewElement_renderItem, _M3eMonthViewElement_handleItemClick, _M3eMonthViewElement_handleItemKeyDown, _M3eMonthViewElement_handleItemMouseEnter, _M3eMonthViewElement_handleItemFocus, _M3eMonthViewElement_setRangeHighlight, _M3eMonthViewElement_clearRangeHighlight;
165
+ /**
166
+ * An internal component used to display a single month in a calendar.
167
+ * @internal
168
+ */
169
+ let M3eMonthViewElement = class M3eMonthViewElement extends CalendarViewElementBase {
170
+ constructor() {
171
+ super(...arguments);
172
+ _M3eMonthViewElement_instances.add(this);
173
+ /** @internal */
174
+ this._suppressFocusHighlight = true;
175
+ /** Start of a date range. */
176
+ this.rangeStart = null;
177
+ /** End of a date range. */
178
+ this.rangeEnd = null;
179
+ /** A function used to determine whether a date cannot be selected. */
180
+ this.blackoutDates = null;
181
+ /** A function used to determine whether a date is special. */
182
+ this.specialDates = null;
183
+ }
184
+ /** @inheritdoc */
185
+ render() {
186
+ const date = new Date(this.today);
187
+ date.setDate(1);
188
+ while (date.getDay() != 0) {
189
+ date.setDate(date.getDate() + 1);
190
+ }
191
+ const weekdays = new Array();
192
+ const narrowFormat = new Intl.DateTimeFormat(navigator.language, {
193
+ weekday: "narrow"
194
+ });
195
+ const longFormat = new Intl.DateTimeFormat(navigator.language, {
196
+ weekday: "long"
197
+ });
198
+ for (let i = 0; i < 7; i++) {
199
+ weekdays.push({
200
+ id: i,
201
+ narrow: narrowFormat.format(date),
202
+ long: longFormat.format(date)
203
+ });
204
+ date.setDate(date.getDate() + 1);
205
+ }
206
+ const year = this.activeDate.getFullYear();
207
+ const month = this.activeDate.getMonth();
208
+ const firstDate = new Date(year, month, 1);
209
+ const lastDate = new Date(year, month + 1, 0);
210
+ const numDays = lastDate.getDate();
211
+ let weeks = [];
212
+ let dayOfWeek = firstDate.getDay();
213
+ for (let i = 1; i <= numDays; i++) {
214
+ if (dayOfWeek === 0 || weeks.length === 0) {
215
+ weeks.push([]);
216
+ }
217
+ weeks[weeks.length - 1].push(i);
218
+ dayOfWeek = (dayOfWeek + 1) % 7;
219
+ }
220
+ weeks = weeks.filter(x => !!x.length);
221
+ return html`<table role="grid"><thead><tr>${weekdays.map(x => html`<th scope="col"><span class="visually-hidden">${x.long}</span><div id="weekday-${x.id}-month-${month}" aria-hidden="true">${x.narrow}</div><m3e-tooltip for="weekday-${x.id}-month-${month}">${x.long}</m3e-tooltip></th>`)}</tr></thead><tbody>${weeks.map((row, i) => html`<tr role="row">${i === 0 && row.length < 7 ? html`<td colspan="${7 - row.length}"></td>` : nothing} ${row.map(y => __classPrivateFieldGet(this, _M3eMonthViewElement_instances, "m", _M3eMonthViewElement_renderItem).call(this, new Date(year, month, y)))} ${i > 0 && row.length < 7 ? html`<td colspan="${7 - row.length}"></td>` : nothing}</tr>`)}</tbody></table>`;
222
+ }
223
+ };
224
+ _M3eMonthViewElement_instances = new WeakSet();
225
+ _M3eMonthViewElement_renderItem = function _M3eMonthViewElement_renderItem(value) {
226
+ const long = new Intl.DateTimeFormat(navigator.language, {
227
+ year: "numeric",
228
+ month: "long",
229
+ day: "numeric"
230
+ }).format(value);
231
+ const special = this.specialDates?.(value) ?? false;
232
+ const selected = sameDate(this.date, value);
233
+ const active = sameDate(this.activeDate, value);
234
+ const current = sameDate(this.today, value);
235
+ const disabled = this.minDate && compareDate(value, this.minDate) < 0 || this.maxDate && compareDate(value, this.maxDate) > 0 || this.blackoutDates?.(value) === true;
236
+ const id = `date-${value.getMonth()}-${value.getDate()}-${value.getFullYear()}`;
237
+ let range = false,
238
+ rangeStart = false,
239
+ rangeEnd = false,
240
+ rangeStartRange = false;
241
+ if (this.rangeStart) {
242
+ if (!this.rangeEnd) {
243
+ rangeStart = sameDate(value, this.rangeStart);
244
+ } else {
245
+ range = compareDate(value, this.rangeStart) > 0 && compareDate(value, this.rangeEnd) < 0;
246
+ if (!range) {
247
+ rangeStart = compareDate(value, this.rangeStart) >= 0 && compareDate(value, this.rangeEnd) < 0;
248
+ if (!rangeStart) {
249
+ rangeEnd = compareDate(value, this.rangeStart) > 0 && compareDate(value, this.rangeEnd) <= 0;
250
+ } else {
251
+ rangeStartRange = true;
252
+ }
253
+ }
254
+ }
255
+ }
256
+ return html`<td role="gridcell" class="${classMap({
257
+ current,
258
+ selected,
259
+ active,
260
+ special,
261
+ range,
262
+ "range-start": rangeStart,
263
+ "range-start-range": rangeStartRange,
264
+ "range-end": rangeEnd
265
+ })}"><div id="${id}" role="button" class="item" data-value="${value.toISOString()}" tabindex="${active ? "0" : "-1"}" aria-disabled="${ifDefined(disabled || undefined)}" aria-current="${ifDefined(current ? "date" : undefined)}" aria-pressed="${selected || rangeStart || rangeEnd}" @click="${__classPrivateFieldGet(this, _M3eMonthViewElement_instances, "m", _M3eMonthViewElement_handleItemClick)}" @mouseenter="${__classPrivateFieldGet(this, _M3eMonthViewElement_instances, "m", _M3eMonthViewElement_handleItemMouseEnter)}" @focus="${__classPrivateFieldGet(this, _M3eMonthViewElement_instances, "m", _M3eMonthViewElement_handleItemFocus)}" @mouseleave="${__classPrivateFieldGet(this, _M3eMonthViewElement_instances, "m", _M3eMonthViewElement_clearRangeHighlight)}" @blur="${__classPrivateFieldGet(this, _M3eMonthViewElement_instances, "m", _M3eMonthViewElement_clearRangeHighlight)}" @keydown="${__classPrivateFieldGet(this, _M3eMonthViewElement_instances, "m", _M3eMonthViewElement_handleItemKeyDown)}"><m3e-focus-ring class="focus-ring" for="${id}"></m3e-focus-ring><m3e-state-layer class="state-layer" for="${id}" ?disable-hover="${disabled}"></m3e-state-layer><m3e-ripple class="ripple" centered for="${id}" ?disabled="${disabled}"></m3e-ripple><div class="touch"></div><span class="visually-hidden">${long}</span> <span aria-hidden="true">${value.getDate()}</span></div></td>`;
266
+ };
267
+ _M3eMonthViewElement_handleItemClick = function _M3eMonthViewElement_handleItemClick(e) {
268
+ const item = e.currentTarget;
269
+ if (item.ariaDisabled === "true" || !item.dataset["value"]) return;
270
+ this.activeDate = new Date(item.dataset["value"]);
271
+ this.activeDate = clampDate(this.activeDate, this.minDate, this.maxDate);
272
+ if (this.rangeStart) {
273
+ if (compareDate(this.activeDate, this.rangeStart) < 0) {
274
+ this.rangeStart = this.activeDate;
275
+ this.rangeEnd = null;
276
+ } else {
277
+ this.rangeEnd = this.activeDate;
278
+ }
279
+ __classPrivateFieldGet(this, _M3eMonthViewElement_instances, "m", _M3eMonthViewElement_clearRangeHighlight).call(this);
280
+ }
281
+ this.dispatchEvent(new Event("change", {
282
+ bubbles: false
283
+ }));
284
+ };
285
+ _M3eMonthViewElement_handleItemKeyDown = function _M3eMonthViewElement_handleItemKeyDown(e) {
286
+ let activeDate = this.activeDate;
287
+ switch (e.key) {
288
+ case " ":
289
+ case "Enter":
290
+ e.preventDefault();
291
+ e.currentTarget.click();
292
+ return;
293
+ case "ArrowLeft":
294
+ case "Left":
295
+ activeDate = addCalendarDays(activeDate, M3eDirectionality.current === "rtl" ? 1 : -1);
296
+ break;
297
+ case "ArrowRight":
298
+ case "Right":
299
+ activeDate = addCalendarDays(activeDate, M3eDirectionality.current === "rtl" ? -1 : 1);
300
+ break;
301
+ case "ArrowUp":
302
+ case "Up":
303
+ activeDate = addCalendarDays(activeDate, -7);
304
+ break;
305
+ case "ArrowDown":
306
+ case "Down":
307
+ activeDate = addCalendarDays(activeDate, 7);
308
+ break;
309
+ case "Home":
310
+ activeDate = addCalendarDays(activeDate, 1 - activeDate.getDate());
311
+ break;
312
+ case "End":
313
+ activeDate = addCalendarDays(activeDate, getNumDaysInMonth(activeDate) - activeDate.getDate());
314
+ break;
315
+ case "PageUp":
316
+ activeDate = e.altKey ? addCalendarYears(activeDate, -1) : addCalendarMonths(activeDate, -1);
317
+ break;
318
+ case "PageDown":
319
+ activeDate = e.altKey ? addCalendarYears(activeDate, 1) : addCalendarMonths(activeDate, 1);
320
+ break;
321
+ default:
322
+ return;
323
+ }
324
+ e.preventDefault();
325
+ this._changeActiveDate(activeDate);
326
+ };
327
+ _M3eMonthViewElement_handleItemMouseEnter = function _M3eMonthViewElement_handleItemMouseEnter(e) {
328
+ __classPrivateFieldGet(this, _M3eMonthViewElement_instances, "m", _M3eMonthViewElement_setRangeHighlight).call(this, e.currentTarget);
329
+ };
330
+ _M3eMonthViewElement_handleItemFocus = function _M3eMonthViewElement_handleItemFocus(e) {
331
+ if (!this._suppressFocusHighlight) {
332
+ __classPrivateFieldGet(this, _M3eMonthViewElement_instances, "m", _M3eMonthViewElement_setRangeHighlight).call(this, e.currentTarget);
333
+ }
334
+ };
335
+ _M3eMonthViewElement_setRangeHighlight = function _M3eMonthViewElement_setRangeHighlight(item) {
336
+ __classPrivateFieldGet(this, _M3eMonthViewElement_instances, "m", _M3eMonthViewElement_clearRangeHighlight).call(this);
337
+ if (this.rangeStart && item.dataset["value"]) {
338
+ if (compareDate(new Date(item.dataset["value"]), this.rangeStart) > 0) {
339
+ item.parentElement.classList.add("range-highlight-end");
340
+ }
341
+ for (const cell of item.closest("table")?.querySelectorAll(".item") ?? []) {
342
+ if (cell === item) break;
343
+ const value = new Date(cell.dataset["value"]);
344
+ if (compareDate(value, this.rangeStart) > 0) {
345
+ cell.parentElement.classList.add("range-highlight");
346
+ } else if (compareDate(value, this.rangeStart) >= 0) {
347
+ cell.parentElement.classList.add("range-highlight-start");
348
+ }
349
+ }
350
+ }
351
+ };
352
+ _M3eMonthViewElement_clearRangeHighlight = function _M3eMonthViewElement_clearRangeHighlight() {
353
+ if (this.rangeStart) {
354
+ this.shadowRoot?.querySelectorAll(".range-highlight,.range-highlight-end,.range-highlight-start").forEach(x => x.classList.remove("range-highlight", "range-highlight-end", "range-highlight-start"));
355
+ }
356
+ };
357
+ /** The styles of the element. */
358
+ M3eMonthViewElement.styles = [CalendarViewElementBase.styles, css`thead { font-size: var(--m3e-calendar-weekday-font-size, ${DesignToken.typescale.standard.title.small.fontSize}); font-weight: var(--m3e-calendar-weekday-font-weight, ${DesignToken.typescale.standard.title.small.fontWeight}); line-height: var(--m3e-calendar-weekday-line-height, ${DesignToken.typescale.standard.title.small.lineHeight}); letter-spacing: var(--m3e-calendar-weekday-tracking, ${DesignToken.typescale.standard.title.small.tracking}); } th { height: 1.5rem; padding-block-start: 1.875rem; padding-block-end: 1rem; } tbody { font-size: var(--m3e-calendar-date-font-size, ${DesignToken.typescale.standard.body.medium.fontSize}); font-weight: var(--m3e-calendar-date-font-weight, ${DesignToken.typescale.standard.body.medium.fontWeight}); line-height: var(--m3e-calendar-date-line-height, ${DesignToken.typescale.standard.body.medium.lineHeight}); letter-spacing: var(--m3e-calendar-date-tracking, ${DesignToken.typescale.standard.body.medium.tracking}); } td:not(:has(.item[aria-disabled])):not(.selected):not(.range-start):not(.range-end).special { color: var(--m3e-calendar-item-special-color, ${DesignToken.color.onTertiaryContainer}); --m3e-ripple-color: var(--m3e-calendar-item-special-ripple-color, ${DesignToken.color.onTertiaryContainer}); --m3e-state-layer-hover-color: var( --m3e-calendar-item-special-hover-color, ${DesignToken.color.onTertiaryContainer} ); --m3e-state-layer-focus-color: var( --m3e-calendar-item-special-focus-color, ${DesignToken.color.onTertiaryContainer} ); } td:not(:has(.item[aria-disabled])):not(.selected):not(.range-start):not(.range-end).special .state-layer { background-color: var(--m3e-calendar-item-special-container-color, ${DesignToken.color.tertiaryContainer}); } td:not(:has(.item[aria-disabled])).range-start, td:not(:has(.item[aria-disabled])).range-end { color: var(--m3e-calendar-item-selected-color, ${DesignToken.color.onPrimary}); --m3e-ripple-color: var(--m3e-calendar-item-selected-ripple-color, ${DesignToken.color.onPrimary}); } td:not(:has(.item[aria-disabled])).range-start .state-layer, td:not(:has(.item[aria-disabled])).range-end .state-layer { background-color: var(--m3e-calendar-item-selected-container-color, ${DesignToken.color.primary}); } td:not(:has(.item[aria-disabled])).range::before, td:not(:has(.item[aria-disabled])).range-start-range::before, td:not(:has(.item[aria-disabled])).range-end::before { content: ""; position: absolute; left: 0; right: 0; top: 0.25rem; bottom: 0.25rem; background-color: var(--m3e-calendar-range-container-color, ${DesignToken.color.primaryContainer}); } td:not(:has(.item[aria-disabled])):not(.selected).range { color: var(--m3e-calendar-range-color, ${DesignToken.color.onPrimaryContainer}); } td:not(:has(.item[aria-disabled])).range-start::before { inset-inline-start: 50%; width: 50%; } td:not(:has(.item[aria-disabled])).range-end::before { inset-inline-end: 50%; width: 50%; } td:not(:has(.item[aria-disabled])).range-highlight-start .item::after, td:not(:has(.item[aria-disabled])).range-highlight .item::after, td:not(:has(.item[aria-disabled])).range-highlight-end .item::after { content: ""; position: absolute; top: 0; left: calc(0px - 0.1875rem); right: calc(0px - 0.1875rem); bottom: 0; border-style: dashed; border-color: ${DesignToken.color.primary}; border-width: 1px; } td:not(:has(.item[aria-disabled])).range-highlight-start .item::after { margin-inline-start: 50%; } td:not(:has(.item[aria-disabled])).range-highlight-end .item::after { margin-inline-end: 0.1875rem; } td:not(:has(.item[aria-disabled])).range-highlight-start .item::after, td:not(:has(.item[aria-disabled])).range-highlight .item::after { border-inline-style: none; } td:not(:has(.item[aria-disabled])).range-highlight-end .item::after { border-start-end-radius: ${DesignToken.shape.corner.full}; border-end-end-radius: ${DesignToken.shape.corner.full}; border-inline-start-style: none; } @media (forced-colors: active) { td:not(:has(.item[aria-disabled])).range-start, td:not(:has(.item[aria-disabled])).range-end { forced-color-adjust: none; color: HighlightText; } td:not(:has(.item[aria-disabled])).range-start .state-layer, td:not(:has(.item[aria-disabled])).range-end .state-layer { background-color: Highlight; } td:not(:has(.item[aria-disabled])).range::before, td:not(:has(.item[aria-disabled])).range-start-range::before, td:not(:has(.item[aria-disabled])).range-end::before { background-color: Highlight; } td:not(:has(.item[aria-disabled])):not(.selected).range { forced-color-adjust: none; color: HighlightText; } td:not(:has(.item[aria-disabled])).range-highlight-start .item::after, td:not(:has(.item[aria-disabled])).range-highlight .item::after, td:not(:has(.item[aria-disabled])).range-highlight-end .item::after { border-color: GrayText; } }`];
359
+ __decorate([property({
360
+ attribute: "range-start",
361
+ converter: dateConverter
362
+ })], M3eMonthViewElement.prototype, "rangeStart", void 0);
363
+ __decorate([property({
364
+ attribute: "range-end",
365
+ converter: dateConverter
366
+ })], M3eMonthViewElement.prototype, "rangeEnd", void 0);
367
+ __decorate([property({
368
+ attribute: false
369
+ })], M3eMonthViewElement.prototype, "blackoutDates", void 0);
370
+ __decorate([property({
371
+ attribute: false
372
+ })], M3eMonthViewElement.prototype, "specialDates", void 0);
373
+ M3eMonthViewElement = __decorate([customElement("m3e-month-view")], M3eMonthViewElement);
374
+
375
+ /**
376
+ * Adapted from Angular Material Datepicker
377
+ * Source: https://github.com/angular/components/blob/main/src/material/datepicker/multi-year-view.ts
378
+ *
379
+ * @license MIT
380
+ * Copyright (c) 2025 Google LLC
381
+ * See LICENSE file in the project root for full license text.
382
+ */
383
+ var _M3eMultiYearViewElement_instances, _M3eMultiYearViewElement_renderItem, _M3eMultiYearViewElement_handleItemClick, _M3eMultiYearViewElement_handleItemKeyDown;
384
+ /**
385
+ * An internal component used to display a year selector in a calendar.
386
+ * @internal
387
+ */
388
+ let M3eMultiYearViewElement = class M3eMultiYearViewElement extends CalendarViewElementBase {
389
+ constructor() {
390
+ super(...arguments);
391
+ _M3eMultiYearViewElement_instances.add(this);
392
+ }
393
+ /** @inheritdoc */
394
+ render() {
395
+ const years = new Array();
396
+ const minYear = minYearOfPage(this.activeDate, this.minDate, this.maxDate);
397
+ for (let i = 0, row = []; i < YEARS_PER_PAGE; i++) {
398
+ row.push(minYear + i);
399
+ if (row.length === YEARS_PER_ROW) {
400
+ years.push(row);
401
+ row = new Array();
402
+ }
403
+ }
404
+ return html`<table role="grid"><thead aria-hidden="true"><tr><th colspan="${YEARS_PER_ROW}"></th></tr></thead><tbody>${years.map(row => html`<tr role="row">${row.map(year => __classPrivateFieldGet(this, _M3eMultiYearViewElement_instances, "m", _M3eMultiYearViewElement_renderItem).call(this, year))}</tr>`)}</tbody></table>`;
405
+ }
406
+ };
407
+ _M3eMultiYearViewElement_instances = new WeakSet();
408
+ _M3eMultiYearViewElement_renderItem = function _M3eMultiYearViewElement_renderItem(year) {
409
+ const yearFormat = new Intl.DateTimeFormat(navigator.language, {
410
+ year: "numeric"
411
+ });
412
+ const active = this.activeDate.getFullYear() === year;
413
+ const selected = this.date?.getFullYear() === year;
414
+ const current = this.today.getFullYear() === year;
415
+ const disabled = this.minDate && year < this.minDate.getFullYear() || this.maxDate && year > this.maxDate.getFullYear();
416
+ const id = `year-${year}`;
417
+ return html`<td role="gridcell" class="${classMap({
418
+ current,
419
+ selected,
420
+ active
421
+ })}"><div id="${id}" class="item" role="button" tabindex="${active ? "0" : "-1"}" data-value="${year}" aria-disabled="${ifDefined(disabled || undefined)}" aria-current="${ifDefined(current ? "date" : undefined)}" aria-pressed="${selected}" @click="${__classPrivateFieldGet(this, _M3eMultiYearViewElement_instances, "m", _M3eMultiYearViewElement_handleItemClick)}" @keydown="${__classPrivateFieldGet(this, _M3eMultiYearViewElement_instances, "m", _M3eMultiYearViewElement_handleItemKeyDown)}"><m3e-focus-ring class="focus-ring" for="${id}"></m3e-focus-ring><m3e-state-layer class="state-layer" for="${id}" ?disable-hover="${disabled}"></m3e-state-layer><m3e-ripple class="ripple" for="${id}" centered ?disabled="${disabled}"></m3e-ripple><div class="touch"></div><span>${yearFormat.format(new Date(year, 0, 1))}</span></div></td>`;
422
+ };
423
+ _M3eMultiYearViewElement_handleItemClick = function _M3eMultiYearViewElement_handleItemClick(e) {
424
+ const item = e.currentTarget;
425
+ if (item.ariaDisabled === "true" || !item.dataset["value"]) return;
426
+ this.activeDate = new Date(this.activeDate);
427
+ this.activeDate.setFullYear(Number(item.dataset["value"]));
428
+ this.activeDate = clampDate(this.activeDate, this.minDate, this.maxDate);
429
+ this.dispatchEvent(new Event("change", {
430
+ bubbles: false
431
+ }));
432
+ };
433
+ _M3eMultiYearViewElement_handleItemKeyDown = function _M3eMultiYearViewElement_handleItemKeyDown(e) {
434
+ let activeDate = this.activeDate;
435
+ switch (e.key) {
436
+ case " ":
437
+ case "Enter":
438
+ e.preventDefault();
439
+ e.currentTarget.click();
440
+ return;
441
+ case "ArrowLeft":
442
+ case "Left":
443
+ activeDate = addCalendarYears(activeDate, M3eDirectionality.current === "rtl" ? 1 : -1);
444
+ break;
445
+ case "ArrowRight":
446
+ case "Right":
447
+ activeDate = addCalendarYears(activeDate, M3eDirectionality.current === "rtl" ? -1 : 1);
448
+ break;
449
+ case "ArrowUp":
450
+ case "Up":
451
+ activeDate = addCalendarYears(activeDate, -YEARS_PER_ROW);
452
+ break;
453
+ case "ArrowDown":
454
+ case "Down":
455
+ activeDate = addCalendarYears(activeDate, YEARS_PER_ROW);
456
+ break;
457
+ case "Home":
458
+ activeDate = addCalendarYears(activeDate, -getActiveOffset(activeDate, this.minDate, this.maxDate));
459
+ break;
460
+ case "End":
461
+ activeDate = addCalendarYears(activeDate, YEARS_PER_PAGE - getActiveOffset(activeDate, this.minDate, this.maxDate) - 1);
462
+ break;
463
+ case "PageUp":
464
+ activeDate = addCalendarYears(activeDate, e.altKey ? -YEARS_PER_PAGE * 10 : -YEARS_PER_PAGE);
465
+ break;
466
+ case "PageDown":
467
+ activeDate = addCalendarYears(activeDate, e.altKey ? YEARS_PER_PAGE * 10 : YEARS_PER_PAGE);
468
+ break;
469
+ default:
470
+ return;
471
+ }
472
+ e.preventDefault();
473
+ this._changeActiveDate(activeDate);
474
+ };
475
+ /** The styles of the element. */
476
+ M3eMultiYearViewElement.styles = [CalendarViewElementBase.styles, css`.item { height: 2.25rem; } .touch { width: 100%; } th { height: 1rem; } td { padding-inline: 1rem; } tbody { font-size: var(--m3e-calendar-item-font-size, ${DesignToken.typescale.standard.body.medium.fontSize}); font-weight: var(--m3e-calendar-item-font-weight, ${DesignToken.typescale.standard.body.medium.fontWeight}); line-height: var(--m3e-calendar-item-line-height, ${DesignToken.typescale.standard.body.medium.lineHeight}); letter-spacing: var(--m3e-calendar-item-tracking, ${DesignToken.typescale.standard.body.medium.tracking}); }`];
477
+ M3eMultiYearViewElement = __decorate([customElement("m3e-multi-year-view")], M3eMultiYearViewElement);
478
+
479
+ /**
480
+ * Adapted from Angular Material Datepicker
481
+ * Source: https://github.com/angular/components/blob/main/src/material/datepicker/year-view.ts
482
+ *
483
+ * @license MIT
484
+ * Copyright (c) 2025 Google LLC
485
+ * See LICENSE file in the project root for full license text.
486
+ */
487
+ var _M3eYearViewElement_instances, _M3eYearViewElement_renderItem, _M3eYearViewElement_handleItemClick, _M3eYearViewElement_handleItemKeyDown;
488
+ /**
489
+ * An internal component used to display a single year in a calendar.
490
+ * @internal
491
+ */
492
+ let M3eYearViewElement = class M3eYearViewElement extends CalendarViewElementBase {
493
+ constructor() {
494
+ super(...arguments);
495
+ _M3eYearViewElement_instances.add(this);
496
+ }
497
+ /** @inheritdoc */
498
+ render() {
499
+ const months = new Array();
500
+ const shortFormat = new Intl.DateTimeFormat(navigator.language, {
501
+ month: "short"
502
+ });
503
+ const longFormat = new Intl.DateTimeFormat(navigator.language, {
504
+ month: "long"
505
+ });
506
+ const year = this.activeDate.getFullYear();
507
+ for (let month = 0, row = new Array(); month < 12; month++) {
508
+ const date = new Date(year, month, 1);
509
+ row.push({
510
+ narrow: shortFormat.format(date),
511
+ long: longFormat.format(date),
512
+ date: date
513
+ });
514
+ if (row.length == MONTHS_PER_ROW) {
515
+ months.push(row);
516
+ row = [];
517
+ }
518
+ }
519
+ return html`<table role="grid"><thead aria-hidden="true"><tr><th colspan="${MONTHS_PER_ROW}"></th></tr></thead><tbody>${months.map(row => html`<tr role="row">${row.map(month => __classPrivateFieldGet(this, _M3eYearViewElement_instances, "m", _M3eYearViewElement_renderItem).call(this, month))}</tr>`)}</tbody></table>`;
520
+ }
521
+ };
522
+ _M3eYearViewElement_instances = new WeakSet();
523
+ _M3eYearViewElement_renderItem = function _M3eYearViewElement_renderItem(month) {
524
+ const active = this.activeDate.getFullYear() === month.date.getFullYear() && this.activeDate.getMonth() === month.date.getMonth();
525
+ const selected = this.date?.getFullYear() === month.date.getFullYear() && this.date?.getMonth() === month.date.getMonth();
526
+ const current = this.today.getFullYear() === month.date.getFullYear() && this.today.getMonth() === month.date.getMonth();
527
+ const disabled = this.minDate && (month.date.getFullYear() < this.minDate.getFullYear() || month.date.getFullYear() === this.minDate.getFullYear() && month.date.getMonth() < this.minDate.getMonth()) || this.maxDate && (month.date.getFullYear() > this.maxDate.getFullYear() || month.date.getFullYear() === this.maxDate.getFullYear() && month.date.getMonth() > this.maxDate.getMonth());
528
+ const id = `month-${month.date.getMonth()}`;
529
+ return html`<td role="gridcell" class="${classMap({
530
+ current,
531
+ selected,
532
+ active
533
+ })}"><div id="${id}" class="item" role="button" tabindex="${active ? "0" : "-1"}" data-value="${month.date.toISOString()}" aria-disabled="${ifDefined(disabled || undefined)}" aria-current="${ifDefined(current ? "date" : undefined)}" aria-pressed="${selected}" @click="${__classPrivateFieldGet(this, _M3eYearViewElement_instances, "m", _M3eYearViewElement_handleItemClick)}" @keydown="${__classPrivateFieldGet(this, _M3eYearViewElement_instances, "m", _M3eYearViewElement_handleItemKeyDown)}"><m3e-focus-ring class="focus-ring" for="${id}"></m3e-focus-ring><m3e-state-layer class="state-layer" for="${id}" ?disable-hover="${disabled}"></m3e-state-layer><m3e-ripple class="ripple" centered for="${id}" ?disabled="${disabled}"></m3e-ripple><div class="touch"></div><span class="visually-hidden">${month.long}</span> <span aria-hidden="true">${month.narrow}</span></div></td>`;
534
+ };
535
+ _M3eYearViewElement_handleItemClick = function _M3eYearViewElement_handleItemClick(e) {
536
+ const item = e.currentTarget;
537
+ if (item.ariaDisabled === "true" || !item.dataset["value"]) return;
538
+ this.activeDate = clampDate(new Date(item.dataset["value"]), this.minDate, this.maxDate);
539
+ this.dispatchEvent(new Event("change", {
540
+ bubbles: false
541
+ }));
542
+ };
543
+ _M3eYearViewElement_handleItemKeyDown = function _M3eYearViewElement_handleItemKeyDown(e) {
544
+ let activeDate = this.activeDate;
545
+ switch (e.key) {
546
+ case " ":
547
+ case "Enter":
548
+ e.preventDefault();
549
+ e.currentTarget.click();
550
+ return;
551
+ case "ArrowLeft":
552
+ case "Left":
553
+ activeDate = addCalendarMonths(activeDate, M3eDirectionality.current === "rtl" ? 1 : -1);
554
+ break;
555
+ case "ArrowRight":
556
+ case "Right":
557
+ activeDate = addCalendarMonths(activeDate, M3eDirectionality.current === "rtl" ? -1 : 1);
558
+ break;
559
+ case "ArrowUp":
560
+ case "Up":
561
+ activeDate = addCalendarMonths(activeDate, -4);
562
+ break;
563
+ case "ArrowDown":
564
+ case "Down":
565
+ activeDate = addCalendarMonths(activeDate, 4);
566
+ break;
567
+ case "Home":
568
+ activeDate = addCalendarMonths(activeDate, -activeDate.getMonth());
569
+ break;
570
+ case "End":
571
+ activeDate = addCalendarMonths(activeDate, 11 - activeDate.getMonth());
572
+ break;
573
+ case "PageUp":
574
+ activeDate = addCalendarYears(activeDate, e.altKey ? -10 : -1);
575
+ break;
576
+ case "PageDown":
577
+ activeDate = addCalendarYears(activeDate, e.altKey ? 10 : 1);
578
+ break;
579
+ default:
580
+ return;
581
+ }
582
+ e.preventDefault();
583
+ this._changeActiveDate(activeDate);
584
+ };
585
+ /** The styles of the element. */
586
+ M3eYearViewElement.styles = [CalendarViewElementBase.styles, css`.item { height: 2.25rem; } .touch { width: 100%; } th { height: 1rem; } td { padding-inline: 0.375rem; } tbody { font-size: var(--m3e-calendar-item-font-size, ${DesignToken.typescale.standard.body.medium.fontSize}); font-weight: var(--m3e-calendar-item-font-weight, ${DesignToken.typescale.standard.body.medium.fontWeight}); line-height: var(--m3e-calendar-item-line-height, ${DesignToken.typescale.standard.body.medium.lineHeight}); letter-spacing: var(--m3e-calendar-item-tracking, ${DesignToken.typescale.standard.body.medium.tracking}); }`];
587
+ M3eYearViewElement = __decorate([customElement("m3e-year-view")], M3eYearViewElement);
588
+
589
+ /**
590
+ * Adapted from Angular Material Datepicker
591
+ * Source: https://github.com/angular/components/blob/main/src/material/datepicker/calendar.ts
592
+ *
593
+ * @license MIT
594
+ * Copyright (c) 2025 Google LLC
595
+ * See LICENSE file in the project root for full license text.
596
+ */
597
+ var _M3eCalendarElement_instances, _M3eCalendarElement_transitionComplete, _M3eCalendarElement_renderHeader, _M3eCalendarElement_renderView, _M3eCalendarElement_handleDateChange, _M3eCalendarElement_handleMonthChange, _M3eCalendarElement_handleYearChange, _M3eCalendarElement_handleActiveChange, _M3eCalendarElement_getPreviousPeriod, _M3eCalendarElement_getNextPeriod;
598
+ /**
599
+ * A calendar used to select a date.
600
+ *
601
+ * @description
602
+ * The `m3e-calendar` component provides structured navigation and selection across
603
+ * month, year, and multi‑year views. It supports single‑date and range selection,
604
+ * applies disabled rules including minimum, maximum, and blackout constraints, and
605
+ * provides styling hooks for special date states.
606
+ *
607
+ * @example
608
+ * The following example illustrates use of the `m3e-calendar`. In this example, a calendar is displayed
609
+ * with a selected date.
610
+ *
611
+ * ```html
612
+ * <m3e-calendar date="2025-12-13"></m3e-calendar>
613
+ * ```
614
+ *
615
+ * @tag m3e-calendar
616
+ *
617
+ * @slot header - Renders the header of the calendar.
618
+ *
619
+ * @attr date - The selected date.
620
+ * @attr max-date - The maximum date that can be selected.
621
+ * @attr min-date - The minimum date that can be selected.
622
+ * @attr range-end - End of a date range.
623
+ * @attr range-start - Start of a date range.
624
+ * @attr start-at - A date specifying the period (month or year) to start the calendar in.
625
+ * @attr start-view - The initial view used to select a date.
626
+ * @attr previous-month-label - The accessible label given to the button used to move to the previous month.
627
+ * @attr next-month-label - The accessible label given to the button used to move to the next month.
628
+ * @attr previous-year-label - The accessible label given to the button used to move to the previous year.
629
+ * @attr next-year-label - The accessible label given to the button used to move to the next year.
630
+ * @attr previous-multi-year-label - The accessible label given to the button used to move to the previous 24 years.
631
+ * @attr next-multi-year-label - The accessible label given to the button used to move to the next 24 years.
632
+ *
633
+ * @fires change - Emitted when the selected date changes.
634
+ *
635
+ * @cssprop --m3e-calendar-container-color - Background color of the container surface.
636
+ * @cssprop --m3e-calendar-container-elevation - Elevation shadow applied to the container surface.
637
+ * @cssprop --m3e-calendar-container-shape - Corner radius of the container surface.
638
+ * @cssprop --m3e-calendar-padding - Padding applied to the calendar header and body.
639
+ * @cssprop --m3e-calendar-period-button-text-color - Text color used for the period‑navigation buttons in the header.
640
+ * @cssprop --m3e-calendar-weekday-font-size - Font size of weekday labels in month view.
641
+ * @cssprop --m3e-calendar-weekday-font-weight - Font weight of weekday labels in month view.
642
+ * @cssprop --m3e-calendar-weekday-line-height - Line height of weekday labels in month view.
643
+ * @cssprop --m3e-calendar-weekday-tracking - Letter spacing of weekday labels in month view.
644
+ * @cssprop --m3e-calendar-date-font-size - Font size of date cells in month view.
645
+ * @cssprop --m3e-calendar-date-font-weight - Font weight of date cells in month view.
646
+ * @cssprop --m3e-calendar-date-line-height - Line height of date cells in month view.
647
+ * @cssprop --m3e-calendar-date-tracking - Letter spacing of date cells in month view.
648
+ * @cssprop --m3e-calendar-item-font-size - Font size of items in year and multi‑year views.
649
+ * @cssprop --m3e-calendar-item-font-weight - Font weight of items in year and multi‑year views.
650
+ * @cssprop --m3e-calendar-item-line-height - Line height of items in year and multi‑year views.
651
+ * @cssprop --m3e-calendar-item-tracking - Letter spacing of items in year and multi‑year views.
652
+ * @cssprop --m3e-calendar-item-selected-color - Text color for selected date items.
653
+ * @cssprop --m3e-calendar-item-selected-container-color - Background color for selected date items.
654
+ * @cssprop --m3e-calendar-item-selected-ripple-color - Ripple color used when interacting with selected date items.
655
+ * @cssprop --m3e-calendar-item-selected-hover-color - Hover color used when interacting with selected date items.
656
+ * @cssprop --m3e-calendar-item-selected-focus-color - Focus color used when interacting with selected date items.
657
+ * @cssprop --m3e-calendar-item-current-outline-thickness - Outline thickness used to indicate the current date.
658
+ * @cssprop --m3e-calendar-item-current-outline-color - Outline color used to indicate the current date.
659
+ * @cssprop --m3e-calendar-item-special-color - Text color for dates marked as special.
660
+ * @cssprop --m3e-calendar-item-special-container-color - Background color for dates marked as special.
661
+ * @cssprop --m3e-calendar-item-special-ripple-color - Ripple color used when interacting with dates marked as special.
662
+ * @cssprop --m3e-calendar-item-special-hover-color - Hover color used when interacting with dates marked as special.
663
+ * @cssprop --m3e-calendar-item-special-focus-color - Focus color used when interacting with dates marked as special.
664
+ * @cssprop --m3e-calendar-range-container-color - Background color applied to the selected date range.
665
+ * @cssprop --m3e-calendar-range-color - Text color for dates within a selected range.
666
+ * @cssprop --m3e-calendar-item-disabled-color - Color used for disabled date items.
667
+ * @cssprop --m3e-calendar-item-disabled-color-opacity - Opacity applied to the disabled item color.
668
+ * @cssprop --m3e-calendar-slide-animation-duration - Duration of slide transitions between calendar views.
669
+ */
670
+ let M3eCalendarElement = class M3eCalendarElement extends LitElement {
671
+ constructor() {
672
+ super(...arguments);
673
+ _M3eCalendarElement_instances.add(this);
674
+ /** @private */
675
+ _M3eCalendarElement_transitionComplete.set(this, void 0);
676
+ /** @private */
677
+ this._today = new Date();
678
+ /** @private */
679
+ this._activeView = "month";
680
+ /** @private */
681
+ this._activeDate = new Date();
682
+ /**
683
+ * The initial view used to select a date.
684
+ * @default "month"
685
+ */
686
+ this.startView = "month";
687
+ /**
688
+ * The selected date.
689
+ * @default null
690
+ */
691
+ this.date = null;
692
+ /**
693
+ * A date specifying the period (month or year) to start the calendar in.
694
+ * @default null
695
+ */
696
+ this.startAt = null;
697
+ /**
698
+ * The minimum date that can be selected.
699
+ * @default null
700
+ */
701
+ this.minDate = null;
702
+ /**
703
+ * The maximum date that can be selected.
704
+ * @default null
705
+ */
706
+ this.maxDate = null;
707
+ /**
708
+ * Start of a date range.
709
+ * @default null
710
+ */
711
+ this.rangeStart = null;
712
+ /**
713
+ * End of a date range.
714
+ * @default null
715
+ */
716
+ this.rangeEnd = null;
717
+ /**
718
+ * A function used to determine whether a date cannot be selected.
719
+ * @default null
720
+ */
721
+ this.blackoutDates = null;
722
+ /**
723
+ * A function used to determine whether a date is special.
724
+ * @default null
725
+ */
726
+ this.specialDates = null;
727
+ /**
728
+ * The accessible label given to the button used to move to the previous month.
729
+ * @default "Previous month"
730
+ */
731
+ this.previousMonthLabel = "Previous month";
732
+ /**
733
+ * The accessible label given to the button used to move to the previous year.
734
+ * @default "Previous year"
735
+ */
736
+ this.previousYearLabel = "Previous year";
737
+ /**
738
+ * The accessible label given to the button used to move to the previous 24 years.
739
+ * @default "Previous 24 years"
740
+ */
741
+ this.previousMultiYearLabel = "Previous 24 years";
742
+ /**
743
+ * The accessible label given to the button used to move to the next month.
744
+ * @default "Next month"
745
+ */
746
+ this.nextMonthLabel = "Next month";
747
+ /**
748
+ * The accessible label given to the button used to move to the next year.
749
+ * @default "Next year"
750
+ */
751
+ this.nextYearLabel = "Next year";
752
+ /**
753
+ * The accessible label given to the button used to move to the next 24 years.
754
+ * @default "Next 24 years"
755
+ */
756
+ this.nextMultiYearLabel = "Next 24 years";
757
+ }
758
+ /** The label to present for the current period. */
759
+ get periodLabel() {
760
+ switch (this._activeView) {
761
+ case "month":
762
+ return new Intl.DateTimeFormat(navigator.language, {
763
+ month: "short",
764
+ year: "numeric"
765
+ }).format(this._activeDate);
766
+ case "year":
767
+ return new Intl.DateTimeFormat(navigator.language, {
768
+ year: "numeric"
769
+ }).format(new Date(this._activeDate.getFullYear(), 0, 1));
770
+ case "multi-year":
771
+ return new Intl.DateTimeFormat(navigator.language, {
772
+ year: "numeric"
773
+ }).formatRange(new Date(minYearOfPage(this._activeDate, this.minDate, this.maxDate), 0, 1), new Date(maxYearOfPage(this._activeDate, this.minDate, this.maxDate), 0, 1));
774
+ }
775
+ }
776
+ /** Whether the calendar can move to the previous period. */
777
+ get canMovePreviousPeriod() {
778
+ if (!this.minDate) return true;
779
+ switch (this._activeView) {
780
+ case "month":
781
+ return new Date(this._activeDate.getFullYear(), this._activeDate.getMonth(), 0) >= this.minDate;
782
+ case "year":
783
+ return new Date(this._activeDate.getFullYear() - 1, 12, 1) >= this.minDate;
784
+ case "multi-year":
785
+ return new Date(minYearOfPage(this._activeDate, this.minDate, this.maxDate) - 1, 12, 1) >= this.minDate;
786
+ }
787
+ }
788
+ /** Whether the calendar can move to the next period. */
789
+ get canMoveNextPeriod() {
790
+ if (!this.maxDate) return true;
791
+ switch (this._activeView) {
792
+ case "month":
793
+ return new Date(this._activeDate.getFullYear(), this._activeDate.getMonth() + 1, 1) <= this.maxDate;
794
+ case "year":
795
+ return new Date(this._activeDate.getFullYear() + 1, 1, 1) <= this.maxDate;
796
+ case "multi-year":
797
+ return new Date(maxYearOfPage(this._activeDate, this.minDate, this.maxDate) + 1, 12, 1) <= this.maxDate;
798
+ }
799
+ }
800
+ /**
801
+ * Asynchronously focuses the active date.
802
+ * @returns {Promise<void>} A promise that resolves after the active date has been focused.
803
+ */
804
+ async focusActiveCell() {
805
+ if (this.isUpdatePending) {
806
+ await this.updateComplete;
807
+ }
808
+ await this._view?.focusActiveCell();
809
+ }
810
+ /** Updates today's date. */
811
+ updateTodayDate() {
812
+ this._today = new Date();
813
+ }
814
+ /**
815
+ * Moves the calendar to the previous period.
816
+ * @returns {Promise<void>} A promise that resolves when the operation is complete.
817
+ */
818
+ async movePreviousPeriod() {
819
+ if (!this.canMovePreviousPeriod) return;
820
+ if (prefersReducedMotion()) {
821
+ this._activeDate = __classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_getPreviousPeriod).call(this, this._activeView);
822
+ return;
823
+ }
824
+ await __classPrivateFieldGet(this, _M3eCalendarElement_transitionComplete, "f");
825
+ const views = [...(this.shadowRoot?.querySelectorAll(`.row.${this._activeView} .view`) ?? [])];
826
+ if (views.length != 3) return;
827
+ __classPrivateFieldSet(this, _M3eCalendarElement_transitionComplete, new Promise(resolve => {
828
+ views[0].addEventListener("transitionend", () => {
829
+ this._activeDate = __classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_getPreviousPeriod).call(this, this._activeView);
830
+ views.forEach(x => x.classList.add("no-animate"));
831
+ views[1].classList.remove("after");
832
+ views[0].classList.add("before");
833
+ setTimeout(() => {
834
+ views.forEach(x => x.classList.remove("no-animate"));
835
+ resolve();
836
+ });
837
+ }, {
838
+ once: true
839
+ });
840
+ }), "f");
841
+ this._body.style.overflow = "hidden";
842
+ views[1].classList.add("after");
843
+ views[0].classList.remove("before");
844
+ await __classPrivateFieldGet(this, _M3eCalendarElement_transitionComplete, "f");
845
+ this._body.style.overflow = "";
846
+ }
847
+ /**
848
+ * Moves the calendar to the next period.
849
+ * @returns {Promise<void>} A promise that resolves when the operation is complete.
850
+ */
851
+ async moveNextPeriod() {
852
+ if (!this.canMoveNextPeriod) return;
853
+ if (prefersReducedMotion()) {
854
+ this._activeDate = __classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_getNextPeriod).call(this, this._activeView);
855
+ return;
856
+ }
857
+ await __classPrivateFieldGet(this, _M3eCalendarElement_transitionComplete, "f");
858
+ const views = [...(this.shadowRoot?.querySelectorAll(`.row.${this._activeView} .view`) ?? [])];
859
+ if (views.length != 3) return;
860
+ __classPrivateFieldSet(this, _M3eCalendarElement_transitionComplete, new Promise(resolve => {
861
+ views[2].addEventListener("transitionend", () => {
862
+ this._activeDate = __classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_getNextPeriod).call(this, this._activeView);
863
+ views.forEach(x => x.classList.add("no-animate"));
864
+ views[1].classList.remove("before");
865
+ views[2].classList.add("after");
866
+ setTimeout(() => {
867
+ views.forEach(x => x.classList.remove("no-animate"));
868
+ resolve();
869
+ });
870
+ }, {
871
+ once: true
872
+ });
873
+ }), "f");
874
+ this._body.style.overflow = "hidden";
875
+ views[1].classList.add("before");
876
+ views[2].classList.remove("after");
877
+ await __classPrivateFieldGet(this, _M3eCalendarElement_transitionComplete, "f");
878
+ this._body.style.overflow = "";
879
+ }
880
+ /**
881
+ * Toggles the current period.
882
+ * @returns {Promise<void>} A promise that resolves when the operation is complete.
883
+ */
884
+ async togglePeriod() {
885
+ await __classPrivateFieldGet(this, _M3eCalendarElement_transitionComplete, "f");
886
+ this._activeView = this._activeView === "month" ? "multi-year" : "month";
887
+ await this.focusActiveCell();
888
+ }
889
+ /** @inheritdoc */
890
+ willUpdate(changedProperties) {
891
+ super.willUpdate(changedProperties);
892
+ if (changedProperties.has("date")) {
893
+ this._activeDate = new Date(this.date ?? this._today);
894
+ }
895
+ if (changedProperties.has("startAt")) {
896
+ this._activeDate = new Date(this.startAt ?? this.date ?? this._today);
897
+ }
898
+ if (changedProperties.has("startView")) {
899
+ this._activeView = this.startView;
900
+ }
901
+ }
902
+ /** @inheritdoc */
903
+ updated(_changedProperties) {
904
+ super.updated(_changedProperties);
905
+ if (this._view instanceof M3eMonthViewElement) {
906
+ if (_changedProperties.has("specialDates") || _changedProperties.has("blackoutDates")) {
907
+ this.shadowRoot?.querySelectorAll("m3e-month-view").forEach(x => {
908
+ x.specialDates = this.specialDates;
909
+ x.blackoutDates = this.blackoutDates;
910
+ });
911
+ }
912
+ }
913
+ }
914
+ /** @inheritdoc */
915
+ render() {
916
+ return html`<div class="base"><slot name="header">${__classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_renderHeader).call(this)}</slot><div class="body ${this._activeView}"><div class="row multi-year">${__classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_renderView).call(this, "multi-year", -1)}${__classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_renderView).call(this, "multi-year", 0)}${__classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_renderView).call(this, "multi-year", 1)}</div><div class="row year">${__classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_renderView).call(this, "year", -1)}${__classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_renderView).call(this, "year", 0)}${__classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_renderView).call(this, "year", 1)}</div><div class="row month">${__classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_renderView).call(this, "month", -1)}${__classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_renderView).call(this, "month", 0)}${__classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_renderView).call(this, "month", 1)}</div></div></div>`;
917
+ }
918
+ };
919
+ _M3eCalendarElement_transitionComplete = new WeakMap();
920
+ _M3eCalendarElement_instances = new WeakSet();
921
+ _M3eCalendarElement_renderHeader = function _M3eCalendarElement_renderHeader() {
922
+ return html`<div class="header"><m3e-button @click="${this.togglePeriod}">${this.periodLabel} <svg class="${classMap({
923
+ rotate: this._activeView !== "month"
924
+ })}" slot="trailing-icon" viewBox="0 -960 960 960" fill="currentColor"><path d="M480-360 280-560h400L480-360Z"/></svg></m3e-button><div class="spacer"></div><m3e-icon-button ?disabled="${!this.canMovePreviousPeriod}" @click="${this.movePreviousPeriod}" aria-label="${this._activeView === "month" ? this.previousMonthLabel : this._activeView === "year" ? this.previousYearLabel : this.previousMultiYearLabel}">${M3eDirectionality.current === "ltr" ? html`<svg viewBox="0 -960 960 960" fill="currentColor"><path d="M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z"/></svg>` : html`<svg viewBox="0 -960 960 960" fill="currentColor"><path d="M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z"/></svg>`}</m3e-icon-button><m3e-icon-button ?disabled="${!this.canMoveNextPeriod}" @click="${this.moveNextPeriod}" aria-label="${this._activeView === "month" ? this.nextMonthLabel : this._activeView === "year" ? this.nextYearLabel : this.nextMultiYearLabel}">${M3eDirectionality.current === "ltr" ? html`<svg viewBox="0 -960 960 960" fill="currentColor"><path d="M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z"/></svg>` : html`<svg viewBox="0 -960 960 960" fill="currentColor"><path d="M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z"/></svg>`}</m3e-icon-button></div>`;
925
+ };
926
+ _M3eCalendarElement_renderView = function _M3eCalendarElement_renderView(view, offset) {
927
+ const activeDate = offset < 0 ? __classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_getPreviousPeriod).call(this, view) : offset > 0 ? __classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_getNextPeriod).call(this, view) : new Date(this._activeDate);
928
+ switch (view) {
929
+ case "month":
930
+ return html`<m3e-month-view class="view ${classMap({
931
+ before: offset < 0,
932
+ after: offset > 0,
933
+ active: view === this._activeView && offset === 0
934
+ })}" ?inert="${offset !== 0}" today="${this._today.toISOString()}" date="${ifDefined(this.date?.toISOString())}" active-date="${activeDate.toISOString()}" min-date="${ifDefined(this.minDate?.toISOString())}" max-date="${ifDefined(this.maxDate?.toISOString())}" range-start="${ifDefined(this.rangeStart?.toISOString())}" range-end="${ifDefined(this.rangeEnd?.toISOString())}" @active-change="${offset === 0 ? __classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_handleActiveChange) : undefined}" @change="${offset === 0 ? __classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_handleDateChange) : undefined}"></m3e-month-view>`;
935
+ case "year":
936
+ return html`<m3e-year-view class="view ${classMap({
937
+ before: offset < 0,
938
+ after: offset > 0,
939
+ active: view === this._activeView && offset === 0
940
+ })}" ?inert="${offset !== 0}" today="${this._today.toISOString()}" date="${ifDefined(this.date?.toISOString())}" active-date="${activeDate.toISOString()}" min-date="${ifDefined(this.minDate?.toISOString())}" max-date="${ifDefined(this.maxDate?.toISOString())}" @active-change="${offset === 0 ? __classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_handleActiveChange) : undefined}" @change="${offset === 0 ? __classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_handleMonthChange) : undefined}"></m3e-year-view>`;
941
+ case "multi-year":
942
+ return html`<m3e-multi-year-view class="view ${classMap({
943
+ before: offset < 0,
944
+ after: offset > 0,
945
+ active: view === this._activeView && offset === 0
946
+ })}" ?inert="${offset !== 0}" today="${this._today.toISOString()}" date="${ifDefined(this.date?.toISOString())}" active-date="${activeDate.toISOString()}" min-date="${ifDefined(this.minDate?.toISOString())}" max-date="${ifDefined(this.maxDate?.toISOString())}" @active-change="${offset === 0 ? __classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_handleActiveChange) : undefined}" @change="${offset === 0 ? __classPrivateFieldGet(this, _M3eCalendarElement_instances, "m", _M3eCalendarElement_handleYearChange) : undefined}"></m3e-multi-year-view>`;
947
+ }
948
+ };
949
+ _M3eCalendarElement_handleDateChange = function _M3eCalendarElement_handleDateChange(e) {
950
+ const monthView = e.currentTarget;
951
+ this._activeDate = new Date(monthView.activeDate);
952
+ this.rangeStart = monthView.rangeStart;
953
+ this.rangeEnd = monthView.rangeEnd;
954
+ this.date = new Date(this._activeDate);
955
+ this.dispatchEvent(new Event("change", {
956
+ bubbles: true
957
+ }));
958
+ };
959
+ _M3eCalendarElement_handleMonthChange = /** @private */
960
+ async function _M3eCalendarElement_handleMonthChange(e) {
961
+ this._activeDate = new Date(e.currentTarget.activeDate);
962
+ this._activeView = "month";
963
+ this.focusActiveCell();
964
+ };
965
+ _M3eCalendarElement_handleYearChange = function _M3eCalendarElement_handleYearChange(e) {
966
+ this._activeDate = new Date(e.currentTarget.activeDate);
967
+ this._activeView = "year";
968
+ this.focusActiveCell();
969
+ };
970
+ _M3eCalendarElement_handleActiveChange = /** @private */
971
+ async function _M3eCalendarElement_handleActiveChange(e) {
972
+ if (this._view instanceof M3eMonthViewElement) {
973
+ this._view._suppressFocusHighlight = false;
974
+ }
975
+ this._activeDate = new Date(e.currentTarget.activeDate);
976
+ await this.focusActiveCell();
977
+ if (this._view instanceof M3eMonthViewElement) {
978
+ this._view._suppressFocusHighlight = false;
979
+ }
980
+ };
981
+ _M3eCalendarElement_getPreviousPeriod = function _M3eCalendarElement_getPreviousPeriod(view) {
982
+ const activeDate = new Date(this._activeDate);
983
+ switch (view) {
984
+ case "month":
985
+ activeDate.setMonth(this._activeDate.getMonth() - 1);
986
+ while (activeDate.getMonth() === this._activeDate.getMonth()) {
987
+ activeDate.setDate(activeDate.getDate() - 1);
988
+ }
989
+ break;
990
+ case "year":
991
+ activeDate.setFullYear(this._activeDate.getFullYear() - 1);
992
+ break;
993
+ case "multi-year":
994
+ {
995
+ activeDate.setDate(1);
996
+ activeDate.setFullYear(minYearOfPage(this._activeDate, this.minDate, this.maxDate) - 1);
997
+ }
998
+ }
999
+ return activeDate;
1000
+ };
1001
+ _M3eCalendarElement_getNextPeriod = function _M3eCalendarElement_getNextPeriod(view) {
1002
+ const activeDate = new Date(this._activeDate);
1003
+ switch (view) {
1004
+ case "month":
1005
+ activeDate.setMonth(this._activeDate.getMonth() + 1);
1006
+ while (activeDate.getMonth() === this._activeDate.getMonth()) {
1007
+ activeDate.setDate(activeDate.getDate() + 1);
1008
+ }
1009
+ break;
1010
+ case "year":
1011
+ activeDate.setFullYear(this._activeDate.getFullYear() + 1);
1012
+ break;
1013
+ case "multi-year":
1014
+ activeDate.setDate(1);
1015
+ activeDate.setFullYear(maxYearOfPage(this._activeDate, this.minDate, this.maxDate) + 1);
1016
+ break;
1017
+ }
1018
+ return activeDate;
1019
+ };
1020
+ /** The styles of the element. */
1021
+ M3eCalendarElement.styles = css`:host { display: inline-block; vertical-align: top; width: fit-content; height: fit-content; } .base { display: flex; flex-direction: column; width: fit-content; overflow: hidden; padding: var(--m3e-calendar-padding, 0.5rem); background-color: var(--m3e-calendar-container-color); box-shadow: var(--m3e-calendar-container-elevation); border-radius: var(--m3e-calendar-container-shape); } .header { display: flex; align-items: center; --m3e-text-button-label-text-color: var( --m3e-calendar-period-button-text-color, ${DesignToken.color.onSurfaceVariant} ); --m3e-text-button-hover-label-text-color: var( --m3e-calendar-period-button-text-color, ${DesignToken.color.onSurfaceVariant} ); --m3e-text-button-focus-label-text-color: var( --m3e-calendar-period-button-text-color, ${DesignToken.color.onSurfaceVariant} ); --m3e-text-button-pressed-label-text-color: var( --m3e-calendar-period-button-text-color, ${DesignToken.color.onSurfaceVariant} ); } .spacer { flex: 1 1 auto; } svg { transition: transform ${DesignToken.motion.spring.fastEffects}; } svg.rotate { transform: rotate(-180deg); } .body { position: relative; } .view:not(.no-animate) { transition: ${unsafeCSS(`margin var(--m3e-calendar-slide-animation-duration, ${DesignToken.motion.duration.long2}) ${DesignToken.motion.easing.standard},
1022
+ visibility var(--m3e-calendar-slide-animation-duration, ${DesignToken.motion.duration.long2}) ${DesignToken.motion.easing.standard} allow-discrete`)}; } .view.before, .view.after { visibility: hidden; position: absolute; } .view.before { margin-inline-start: -100%; } .view.after { margin-inline-start: 100%; } .view:not(.before):not(.after) { visibility: visible; position: relative; left: 0; margin-inline-start: 0; } .row { opacity: 1; transform: translateY(0); } .row.multi-year { transition: ${unsafeCSS(`transform var(--m3e-calendar-slide-animation-duration, ${DesignToken.motion.duration.long2}) ${DesignToken.motion.easing.standard} allow-discrete,
1023
+ opacity var(--m3e-calendar-slide-animation-duration, ${DesignToken.motion.duration.long2}) ${DesignToken.motion.easing.standard} allow-discrete`)}; } .row:not(.multi-year) { transition: ${unsafeCSS(`opacity var(--m3e-calendar-slide-animation-duration, ${DesignToken.motion.duration.long2}) ${DesignToken.motion.easing.standard} allow-discrete`)}; } .body.month > .row:not(.month), .body.year > .row:not(.year), .body.multi-year > .row:not(.multi-year) { visibility: hidden; position: absolute; transform: translateY(-10%); opacity: 0; } .body.month > .row:not(.month) .view:not(.before):not(.after), .body.year > .row:not(.year) .view:not(.before):not(.after), .body.multi-year > .row:not(.multi-year) .view:not(.before):not(.after) { visibility: hidden; transition: none; } @media (prefers-reduced-motion) { .row:not(.multi-year), .row.multi-year, .view:not(.no-animate), svg { transition: none; } }`;
1024
+ __decorate([state()], M3eCalendarElement.prototype, "_today", void 0);
1025
+ __decorate([state()], M3eCalendarElement.prototype, "_activeView", void 0);
1026
+ __decorate([state()], M3eCalendarElement.prototype, "_activeDate", void 0);
1027
+ __decorate([query(".active")], M3eCalendarElement.prototype, "_view", void 0);
1028
+ __decorate([query(".body")], M3eCalendarElement.prototype, "_body", void 0);
1029
+ __decorate([property({
1030
+ attribute: "start-view"
1031
+ })], M3eCalendarElement.prototype, "startView", void 0);
1032
+ __decorate([property({
1033
+ converter: dateConverter
1034
+ })], M3eCalendarElement.prototype, "date", void 0);
1035
+ __decorate([property({
1036
+ attribute: "start-at",
1037
+ converter: dateConverter
1038
+ })], M3eCalendarElement.prototype, "startAt", void 0);
1039
+ __decorate([property({
1040
+ attribute: "min-date",
1041
+ converter: dateConverter
1042
+ })], M3eCalendarElement.prototype, "minDate", void 0);
1043
+ __decorate([property({
1044
+ attribute: "max-date",
1045
+ converter: dateConverter
1046
+ })], M3eCalendarElement.prototype, "maxDate", void 0);
1047
+ __decorate([property({
1048
+ attribute: "range-start",
1049
+ converter: dateConverter
1050
+ })], M3eCalendarElement.prototype, "rangeStart", void 0);
1051
+ __decorate([property({
1052
+ attribute: "range-end",
1053
+ converter: dateConverter
1054
+ })], M3eCalendarElement.prototype, "rangeEnd", void 0);
1055
+ __decorate([property({
1056
+ attribute: false
1057
+ })], M3eCalendarElement.prototype, "blackoutDates", void 0);
1058
+ __decorate([property({
1059
+ attribute: false
1060
+ })], M3eCalendarElement.prototype, "specialDates", void 0);
1061
+ __decorate([property({
1062
+ attribute: "previous-month-label"
1063
+ })], M3eCalendarElement.prototype, "previousMonthLabel", void 0);
1064
+ __decorate([property({
1065
+ attribute: "previous-year-label"
1066
+ })], M3eCalendarElement.prototype, "previousYearLabel", void 0);
1067
+ __decorate([property({
1068
+ attribute: "previous-multi-year-label"
1069
+ })], M3eCalendarElement.prototype, "previousMultiYearLabel", void 0);
1070
+ __decorate([property({
1071
+ attribute: "next-month-label"
1072
+ })], M3eCalendarElement.prototype, "nextMonthLabel", void 0);
1073
+ __decorate([property({
1074
+ attribute: "next-year-label"
1075
+ })], M3eCalendarElement.prototype, "nextYearLabel", void 0);
1076
+ __decorate([property({
1077
+ attribute: "next-multi-year-label"
1078
+ })], M3eCalendarElement.prototype, "nextMultiYearLabel", void 0);
1079
+ M3eCalendarElement = __decorate([customElement("m3e-calendar")], M3eCalendarElement);
1080
+
1081
+ export { CalendarViewElementBase, M3eCalendarElement, M3eMonthViewElement, M3eMultiYearViewElement, M3eYearViewElement };
1082
+ //# sourceMappingURL=calendar.js.map