@latty-ds/web 0.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 (228) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +106 -0
  3. package/custom-elements.json +8785 -0
  4. package/dist/base/index.d.ts +1 -0
  5. package/dist/base/index.js +35 -0
  6. package/dist/base/themeable-element.d.ts +20 -0
  7. package/dist/components/accordion/accordion.d.ts +82 -0
  8. package/dist/components/accordion/accordion.styles.d.ts +1 -0
  9. package/dist/components/accordion/accordion.types.d.ts +10 -0
  10. package/dist/components/accordion/index.d.ts +8 -0
  11. package/dist/components/accordion/index.js +468 -0
  12. package/dist/components/alert/alert.d.ts +51 -0
  13. package/dist/components/alert/alert.styles.d.ts +1 -0
  14. package/dist/components/alert/alert.types.d.ts +2 -0
  15. package/dist/components/alert/index.d.ts +2 -0
  16. package/dist/components/alert/index.js +746 -0
  17. package/dist/components/avatar/avatar.d.ts +27 -0
  18. package/dist/components/avatar/avatar.styles.d.ts +1 -0
  19. package/dist/components/avatar/avatar.types.d.ts +3 -0
  20. package/dist/components/avatar/index.d.ts +2 -0
  21. package/dist/components/avatar/index.js +222 -0
  22. package/dist/components/badge/badge.d.ts +29 -0
  23. package/dist/components/badge/badge.styles.d.ts +1 -0
  24. package/dist/components/badge/badge.types.d.ts +3 -0
  25. package/dist/components/badge/index.d.ts +2 -0
  26. package/dist/components/badge/index.js +277 -0
  27. package/dist/components/breadcrumb/breadcrumb.d.ts +53 -0
  28. package/dist/components/breadcrumb/breadcrumb.styles.d.ts +2 -0
  29. package/dist/components/breadcrumb/breadcrumb.types.d.ts +1 -0
  30. package/dist/components/breadcrumb/index.d.ts +2 -0
  31. package/dist/components/breadcrumb/index.js +166 -0
  32. package/dist/components/button/button.d.ts +111 -0
  33. package/dist/components/button/button.styles.d.ts +1 -0
  34. package/dist/components/button/button.types.d.ts +38 -0
  35. package/dist/components/button/index.d.ts +8 -0
  36. package/dist/components/button/index.js +466 -0
  37. package/dist/components/calendar/calendar.d.ts +84 -0
  38. package/dist/components/calendar/calendar.styles.d.ts +1 -0
  39. package/dist/components/calendar/calendar.types.d.ts +15 -0
  40. package/dist/components/calendar/index.d.ts +1 -0
  41. package/dist/components/calendar/index.js +958 -0
  42. package/dist/components/checkbox/checkbox.d.ts +113 -0
  43. package/dist/components/checkbox/checkbox.styles.d.ts +1 -0
  44. package/dist/components/checkbox/checkbox.types.d.ts +21 -0
  45. package/dist/components/checkbox/index.d.ts +8 -0
  46. package/dist/components/checkbox/index.js +320 -0
  47. package/dist/components/chip/chip.d.ts +35 -0
  48. package/dist/components/chip/chip.styles.d.ts +1 -0
  49. package/dist/components/chip/chip.types.d.ts +3 -0
  50. package/dist/components/chip/index.d.ts +2 -0
  51. package/dist/components/chip/index.js +282 -0
  52. package/dist/components/color-input/color-input.d.ts +55 -0
  53. package/dist/components/color-input/color-input.styles.d.ts +1 -0
  54. package/dist/components/color-input/color-input.types.d.ts +2 -0
  55. package/dist/components/color-input/index.d.ts +1 -0
  56. package/dist/components/color-input/index.js +489 -0
  57. package/dist/components/combobox/combobox.d.ts +59 -0
  58. package/dist/components/combobox/combobox.styles.d.ts +1 -0
  59. package/dist/components/combobox/combobox.types.d.ts +7 -0
  60. package/dist/components/combobox/index.d.ts +2 -0
  61. package/dist/components/combobox/index.js +1988 -0
  62. package/dist/components/date-input/date-input.d.ts +66 -0
  63. package/dist/components/date-input/date-input.styles.d.ts +1 -0
  64. package/dist/components/date-input/date-input.types.d.ts +3 -0
  65. package/dist/components/date-input/index.d.ts +2 -0
  66. package/dist/components/date-input/index.js +2863 -0
  67. package/dist/components/datepicker/datepicker.d.ts +52 -0
  68. package/dist/components/datepicker/datepicker.styles.d.ts +1 -0
  69. package/dist/components/datepicker/datepicker.types.d.ts +3 -0
  70. package/dist/components/datepicker/index.d.ts +2 -0
  71. package/dist/components/datepicker/index.js +416 -0
  72. package/dist/components/dialog/dialog.d.ts +114 -0
  73. package/dist/components/dialog/dialog.styles.d.ts +1 -0
  74. package/dist/components/dialog/dialog.types.d.ts +11 -0
  75. package/dist/components/dialog/index.d.ts +2 -0
  76. package/dist/components/dialog/index.js +920 -0
  77. package/dist/components/divider/divider.d.ts +35 -0
  78. package/dist/components/divider/divider.styles.d.ts +1 -0
  79. package/dist/components/divider/divider.types.d.ts +2 -0
  80. package/dist/components/divider/index.d.ts +2 -0
  81. package/dist/components/divider/index.js +149 -0
  82. package/dist/components/dropdown/dropdown-item.d.ts +24 -0
  83. package/dist/components/dropdown/dropdown-item.styles.d.ts +1 -0
  84. package/dist/components/dropdown/dropdown.d.ts +30 -0
  85. package/dist/components/dropdown/dropdown.styles.d.ts +1 -0
  86. package/dist/components/dropdown/dropdown.types.d.ts +1 -0
  87. package/dist/components/dropdown/index.d.ts +3 -0
  88. package/dist/components/dropdown/index.js +1791 -0
  89. package/dist/components/header/header.d.ts +19 -0
  90. package/dist/components/header/header.styles.d.ts +1 -0
  91. package/dist/components/header/header.types.d.ts +1 -0
  92. package/dist/components/header/index.d.ts +2 -0
  93. package/dist/components/header/index.js +104 -0
  94. package/dist/components/icon-button/icon-button.d.ts +52 -0
  95. package/dist/components/icon-button/icon-button.styles.d.ts +1 -0
  96. package/dist/components/icon-button/icon-button.types.d.ts +8 -0
  97. package/dist/components/icon-button/index.d.ts +1 -0
  98. package/dist/components/icon-button/index.js +342 -0
  99. package/dist/components/image/image.d.ts +26 -0
  100. package/dist/components/image/image.styles.d.ts +1 -0
  101. package/dist/components/image/image.types.d.ts +0 -0
  102. package/dist/components/image/index.d.ts +1 -0
  103. package/dist/components/image/index.js +105 -0
  104. package/dist/components/link/index.d.ts +1 -0
  105. package/dist/components/link/index.js +108 -0
  106. package/dist/components/link/link.d.ts +22 -0
  107. package/dist/components/link/link.styles.d.ts +1 -0
  108. package/dist/components/link/link.types.d.ts +1 -0
  109. package/dist/components/list/index.d.ts +9 -0
  110. package/dist/components/list/index.js +254 -0
  111. package/dist/components/list/list-item.d.ts +41 -0
  112. package/dist/components/list/list-item.styles.d.ts +1 -0
  113. package/dist/components/list/list.d.ts +85 -0
  114. package/dist/components/list/list.styles.d.ts +1 -0
  115. package/dist/components/list/list.types.d.ts +16 -0
  116. package/dist/components/nav/index.d.ts +3 -0
  117. package/dist/components/nav/index.js +345 -0
  118. package/dist/components/nav/nav-item.d.ts +73 -0
  119. package/dist/components/nav/nav.d.ts +49 -0
  120. package/dist/components/nav/nav.styles.d.ts +2 -0
  121. package/dist/components/nav/nav.types.d.ts +1 -0
  122. package/dist/components/pagination/index.d.ts +2 -0
  123. package/dist/components/pagination/index.js +210 -0
  124. package/dist/components/pagination/pagination.d.ts +34 -0
  125. package/dist/components/pagination/pagination.styles.d.ts +1 -0
  126. package/dist/components/pagination/pagination.types.d.ts +1 -0
  127. package/dist/components/progress/index.d.ts +2 -0
  128. package/dist/components/progress/index.js +167 -0
  129. package/dist/components/progress/progress.d.ts +44 -0
  130. package/dist/components/progress/progress.styles.d.ts +1 -0
  131. package/dist/components/progress/progress.types.d.ts +2 -0
  132. package/dist/components/radio/index.d.ts +8 -0
  133. package/dist/components/radio/index.js +294 -0
  134. package/dist/components/radio/radio.d.ts +96 -0
  135. package/dist/components/radio/radio.styles.d.ts +1 -0
  136. package/dist/components/radio/radio.types.d.ts +21 -0
  137. package/dist/components/radio-group/index.d.ts +8 -0
  138. package/dist/components/radio-group/index.js +384 -0
  139. package/dist/components/radio-group/radio-group.d.ts +100 -0
  140. package/dist/components/radio-group/radio-group.styles.d.ts +1 -0
  141. package/dist/components/radio-group/radio-group.types.d.ts +8 -0
  142. package/dist/components/select/index.d.ts +8 -0
  143. package/dist/components/select/index.js +2123 -0
  144. package/dist/components/select/select.d.ts +129 -0
  145. package/dist/components/select/select.styles.d.ts +1 -0
  146. package/dist/components/select/select.types.d.ts +37 -0
  147. package/dist/components/shared/backdrop.styles.d.ts +1 -0
  148. package/dist/components/shared/floating.d.ts +10 -0
  149. package/dist/components/sidepanel/index.d.ts +1 -0
  150. package/dist/components/sidepanel/index.js +768 -0
  151. package/dist/components/sidepanel/sidepanel.d.ts +48 -0
  152. package/dist/components/sidepanel/sidepanel.styles.d.ts +1 -0
  153. package/dist/components/sidepanel/sidepanel.types.d.ts +1 -0
  154. package/dist/components/skeleton/index.d.ts +2 -0
  155. package/dist/components/skeleton/index.js +129 -0
  156. package/dist/components/skeleton/skeleton.d.ts +39 -0
  157. package/dist/components/skeleton/skeleton.styles.d.ts +1 -0
  158. package/dist/components/skeleton/skeleton.types.d.ts +1 -0
  159. package/dist/components/slider/index.d.ts +2 -0
  160. package/dist/components/slider/index.js +635 -0
  161. package/dist/components/slider/slider.d.ts +33 -0
  162. package/dist/components/slider/slider.styles.d.ts +1 -0
  163. package/dist/components/slider/slider.types.d.ts +1 -0
  164. package/dist/components/snackbar/index.d.ts +2 -0
  165. package/dist/components/snackbar/index.js +358 -0
  166. package/dist/components/snackbar/snackbar.d.ts +63 -0
  167. package/dist/components/snackbar/snackbar.styles.d.ts +1 -0
  168. package/dist/components/snackbar/snackbar.types.d.ts +1 -0
  169. package/dist/components/spinner/index.d.ts +8 -0
  170. package/dist/components/spinner/index.js +131 -0
  171. package/dist/components/spinner/spineer.styles.d.ts +1 -0
  172. package/dist/components/spinner/spinner.d.ts +52 -0
  173. package/dist/components/spinner/spinner.types.d.ts +18 -0
  174. package/dist/components/surface/index.d.ts +8 -0
  175. package/dist/components/surface/index.js +128 -0
  176. package/dist/components/surface/surface.d.ts +48 -0
  177. package/dist/components/surface/surface.styles.d.ts +1 -0
  178. package/dist/components/surface/surface.types.d.ts +20 -0
  179. package/dist/components/switch/index.d.ts +8 -0
  180. package/dist/components/switch/index.js +293 -0
  181. package/dist/components/switch/switch.d.ts +90 -0
  182. package/dist/components/switch/switch.styles.d.ts +1 -0
  183. package/dist/components/switch/switch.types.d.ts +21 -0
  184. package/dist/components/tab/index.d.ts +9 -0
  185. package/dist/components/tab/index.js +252 -0
  186. package/dist/components/tab/tab-panel.d.ts +28 -0
  187. package/dist/components/tab/tab-panel.styles.d.ts +1 -0
  188. package/dist/components/tab/tab.d.ts +59 -0
  189. package/dist/components/tab/tab.styles.d.ts +1 -0
  190. package/dist/components/tab/tab.types.d.ts +7 -0
  191. package/dist/components/tab-group/index.d.ts +8 -0
  192. package/dist/components/tab-group/index.js +441 -0
  193. package/dist/components/tab-group/tab-group.d.ts +99 -0
  194. package/dist/components/tab-group/tab-group.styles.d.ts +1 -0
  195. package/dist/components/tab-group/tab-group.types.d.ts +11 -0
  196. package/dist/components/table/index.d.ts +2 -0
  197. package/dist/components/table/index.js +582 -0
  198. package/dist/components/table/table.d.ts +160 -0
  199. package/dist/components/table/table.styles.d.ts +1 -0
  200. package/dist/components/table/table.types.d.ts +106 -0
  201. package/dist/components/text/index.d.ts +1 -0
  202. package/dist/components/text/index.js +207 -0
  203. package/dist/components/text/text.d.ts +32 -0
  204. package/dist/components/text/text.styles.d.ts +1 -0
  205. package/dist/components/text/text.types.d.ts +2 -0
  206. package/dist/components/textfield/index.d.ts +8 -0
  207. package/dist/components/textfield/index.js +718 -0
  208. package/dist/components/textfield/textfield.d.ts +168 -0
  209. package/dist/components/textfield/textfield.styles.d.ts +1 -0
  210. package/dist/components/textfield/textfield.types.d.ts +40 -0
  211. package/dist/components/tooltip/index.d.ts +2 -0
  212. package/dist/components/tooltip/index.js +379 -0
  213. package/dist/components/tooltip/tooltip.d.ts +42 -0
  214. package/dist/components/tooltip/tooltip.styles.d.ts +1 -0
  215. package/dist/components/tooltip/tooltip.types.d.ts +1 -0
  216. package/dist/css/font-face.css +22 -0
  217. package/dist/css/latty.css +57 -0
  218. package/dist/fonts/HankenGrotesk-Variable.woff2 +0 -0
  219. package/dist/fonts/HankenGrotesk-VariableItalic.woff2 +0 -0
  220. package/dist/index.cjs +12739 -0
  221. package/dist/index.d.ts +101 -0
  222. package/dist/index.js +11406 -0
  223. package/dist/manifest.json +2396 -0
  224. package/dist/utils/click-outside.d.ts +22 -0
  225. package/dist/utils/color.d.ts +14 -0
  226. package/dist/utils/dispatch.d.ts +18 -0
  227. package/dist/utils/index.d.ts +3 -0
  228. package/package.json +231 -0
@@ -0,0 +1,958 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators, target, key, kind) => {
4
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
6
+ if (decorator = decorators[i])
7
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
+ if (kind && result) __defProp(target, key, result);
9
+ return result;
10
+ };
11
+
12
+ // src/components/calendar/calendar.ts
13
+ import { html } from "lit";
14
+ import { customElement, property as property2, state } from "lit/decorators.js";
15
+
16
+ // src/base/themeable-element.ts
17
+ import { LitElement } from "lit";
18
+ import { property } from "lit/decorators.js";
19
+ var ThemeableElement = class extends LitElement {
20
+ willUpdate(changed) {
21
+ super.willUpdate(changed);
22
+ if (changed.has("theme")) {
23
+ this._syncThemeAttribute();
24
+ }
25
+ }
26
+ _syncThemeAttribute() {
27
+ if (this.theme === "dark" || this.theme === "light") {
28
+ this.setAttribute("data-theme", this.theme);
29
+ } else {
30
+ this.removeAttribute("data-theme");
31
+ }
32
+ }
33
+ };
34
+ __decorateClass([
35
+ property({ reflect: true })
36
+ ], ThemeableElement.prototype, "theme", 2);
37
+
38
+ // src/components/calendar/calendar.ts
39
+ import "@latty-ds/icons";
40
+
41
+ // src/components/calendar/calendar.styles.ts
42
+ import { css } from "lit";
43
+ var calendarStyles = css`
44
+ :host {
45
+ display: inline-block;
46
+ font-family: 'Hanken Grotesk', sans-serif;
47
+ }
48
+
49
+ .calendar {
50
+ background: var(--lt-bg-default);
51
+ border-radius: var(--lt-border-radius);
52
+ border: 1px solid var(--lt-border-default);
53
+ display: flex;
54
+ flex-direction: column;
55
+ gap: var(--lt-spacing-2);
56
+ padding: var(--lt-spacing-3);
57
+ width: 17.25rem;
58
+ }
59
+
60
+ /* ── Header ── */
61
+
62
+ .header {
63
+ align-items: center;
64
+ display: flex;
65
+ justify-content: space-between;
66
+ }
67
+
68
+ .month-label-btn {
69
+ align-items: center;
70
+ background: transparent;
71
+ border-radius: var(--lt-border-radius);
72
+ border: 1px solid transparent;
73
+ color: var(--lt-text-default);
74
+ cursor: pointer;
75
+ display: inline-flex;
76
+ font-family: inherit;
77
+ font-size: 0.9375rem;
78
+ font-weight: 600;
79
+ gap: var(--lt-spacing-1);
80
+ letter-spacing: 0.01em;
81
+ padding: var(--lt-spacing-1) var(--lt-spacing-2);
82
+ transition:
83
+ background 120ms ease,
84
+ border-color 120ms ease;
85
+ }
86
+
87
+ .month-label-btn:hover:not(:disabled) {
88
+ background: var(--lt-bg-neutral-subtle);
89
+ border-color: var(--lt-border-default);
90
+ }
91
+
92
+ .month-label-btn--open {
93
+ background: var(--lt-bg-neutral-subtle);
94
+ border-color: var(--lt-border-default);
95
+ }
96
+
97
+ .month-label-btn:disabled {
98
+ cursor: not-allowed;
99
+ opacity: 0.6;
100
+ }
101
+
102
+ .picker-chevron {
103
+ color: var(--lt-text-subtle);
104
+ transition: transform 150ms ease;
105
+ }
106
+
107
+ .month-label-btn--open .picker-chevron {
108
+ transform: rotate(180deg);
109
+ }
110
+
111
+ .nav-btn {
112
+ align-items: center;
113
+ background: transparent;
114
+ border-radius: var(--lt-border-radius);
115
+ border: 1px solid transparent;
116
+ color: var(--lt-text-subtle);
117
+ cursor: pointer;
118
+ display: inline-flex;
119
+ height: 2rem;
120
+ justify-content: center;
121
+ padding: 0;
122
+ transition:
123
+ background 120ms ease,
124
+ border-color 120ms ease,
125
+ color 120ms ease;
126
+ width: 2rem;
127
+ }
128
+
129
+ .nav-btn:hover:not(:disabled) {
130
+ background: var(--lt-bg-neutral-subtle);
131
+ border-color: var(--lt-border-default);
132
+ color: var(--lt-text-default);
133
+ }
134
+
135
+ .nav-btn:disabled {
136
+ color: var(--lt-text-disabled);
137
+ cursor: not-allowed;
138
+ }
139
+
140
+ /* ── Weekday headers ── */
141
+
142
+ .weekdays {
143
+ column-gap: 0;
144
+ display: grid;
145
+ grid-template-columns: repeat(7, 1fr);
146
+ }
147
+
148
+ .weekday {
149
+ color: var(--lt-text-muted);
150
+ font-size: 0.75rem;
151
+ font-weight: 500;
152
+ text-align: center;
153
+ }
154
+
155
+ /* ── Day grid ── */
156
+
157
+ .grid {
158
+ column-gap: 0;
159
+ display: grid;
160
+ grid-template-columns: repeat(7, 1fr);
161
+ row-gap: var(--lt-spacing-1);
162
+ }
163
+
164
+ [role='row'] {
165
+ display: contents;
166
+ }
167
+
168
+ /* Day button — strip layer in range mode */
169
+ .day {
170
+ align-items: center;
171
+ background: transparent;
172
+ border: none;
173
+ color: var(--lt-text-default);
174
+ cursor: pointer;
175
+ display: inline-flex;
176
+ font-family: inherit;
177
+ font-size: 0.8125rem;
178
+ font-weight: 400;
179
+ height: 2.25rem;
180
+ justify-content: center;
181
+ outline: none;
182
+ padding: 0;
183
+ transition: background 100ms ease;
184
+ width: 100%;
185
+ }
186
+
187
+ .day:disabled {
188
+ cursor: not-allowed;
189
+ }
190
+
191
+ /* Day inner — the visible circle */
192
+ .day__inner {
193
+ align-items: center;
194
+ background: transparent;
195
+ border: 2px solid transparent;
196
+ border-radius: 50%;
197
+ color: inherit;
198
+ display: inline-flex;
199
+ font-size: inherit;
200
+ font-weight: inherit;
201
+ height: 2.25rem;
202
+ justify-content: center;
203
+ transition:
204
+ background 100ms ease,
205
+ border-color 100ms ease,
206
+ color 100ms ease;
207
+ width: 2.25rem;
208
+ }
209
+
210
+ .day:hover:not(:disabled) .day__inner {
211
+ background: var(--lt-bg-neutral-subtle);
212
+ }
213
+
214
+ .day:focus-visible .day__inner {
215
+ outline: 2px solid var(--lt-border-focus);
216
+ outline-offset: 1px;
217
+ }
218
+
219
+ /* Today ring */
220
+ .day--today .day__inner {
221
+ border-color: var(--lt-border-primary);
222
+ font-weight: 600;
223
+ }
224
+
225
+ /* Single-mode selected */
226
+ .day--selected .day__inner {
227
+ background: var(--lt-interactive-primary-bg);
228
+ border-color: transparent;
229
+ color: var(--lt-text-on-primary);
230
+ font-weight: 600;
231
+ }
232
+
233
+ .day--selected:hover:not(:disabled) .day__inner {
234
+ background: var(--lt-interactive-primary-bg-hover);
235
+ }
236
+
237
+ /* Outside days */
238
+ .day--outside {
239
+ color: var(--lt-text-muted);
240
+ opacity: 0.5;
241
+ }
242
+
243
+ /* Empty filler cell */
244
+ .day--empty {
245
+ background: transparent;
246
+ border: none;
247
+ cursor: default;
248
+ pointer-events: none;
249
+ }
250
+
251
+ .day:disabled .day__inner {
252
+ color: var(--lt-text-disabled);
253
+ opacity: 0.4;
254
+ }
255
+
256
+ /* ── Range strips (on .day button = strip layer) ── */
257
+
258
+ /* Start: transparent on left, strip on right */
259
+ .day--range-left {
260
+ background: linear-gradient(to right, transparent 50%, var(--lt-bg-primary-subtle) 50%);
261
+ }
262
+
263
+ /* End: strip on left, transparent on right */
264
+ .day--range-right {
265
+ background: linear-gradient(to right, var(--lt-bg-primary-subtle) 50%, transparent 50%);
266
+ }
267
+
268
+ /* Same-day start+end — no strip needed */
269
+ .day--range-left.day--range-right {
270
+ background: transparent;
271
+ }
272
+
273
+ /* Days between confirmed endpoints */
274
+ .day--in-range {
275
+ background: var(--lt-bg-primary-subtle);
276
+ }
277
+
278
+ .day--in-range:hover:not(:disabled) .day__inner {
279
+ background: var(--lt-bg-neutral-subtle);
280
+ }
281
+
282
+ /* Days between hover preview endpoints */
283
+ .day--in-hover-range {
284
+ background: var(--lt-bg-primary-subtle);
285
+ opacity: 0.45;
286
+ }
287
+
288
+ /* Confirmed range endpoint circle */
289
+ .day--range-confirmed .day__inner {
290
+ background: var(--lt-interactive-primary-bg);
291
+ border-color: transparent;
292
+ color: var(--lt-text-on-primary);
293
+ font-weight: 600;
294
+ }
295
+
296
+ .day--range-confirmed:hover:not(:disabled) .day__inner {
297
+ background: var(--lt-interactive-primary-bg-hover);
298
+ }
299
+
300
+ /* Hover preview endpoint circle (semi-transparent) */
301
+ .day--range-hover .day__inner {
302
+ background: var(--lt-interactive-primary-bg);
303
+ border-color: transparent;
304
+ color: var(--lt-text-on-primary);
305
+ opacity: 0.5;
306
+ }
307
+
308
+ /* ── Multi-month layout ── */
309
+
310
+ .calendar--multi {
311
+ width: auto;
312
+ }
313
+
314
+ .month-label-row {
315
+ display: flex;
316
+ flex: 1;
317
+ justify-content: space-around;
318
+ }
319
+
320
+ .month-label {
321
+ color: var(--lt-text-default);
322
+ font-size: 0.9375rem;
323
+ font-weight: 600;
324
+ letter-spacing: 0.01em;
325
+ text-align: center;
326
+ }
327
+
328
+ .month-panels {
329
+ display: flex;
330
+ gap: var(--lt-spacing-4);
331
+ }
332
+
333
+ .month-col {
334
+ width: 17.25rem;
335
+ }
336
+
337
+ /* ── Month/year picker ── */
338
+
339
+ .picker-months {
340
+ display: grid;
341
+ gap: var(--lt-spacing-1);
342
+ grid-template-columns: repeat(3, 1fr);
343
+ }
344
+
345
+ .picker-month-btn {
346
+ background: transparent;
347
+ border-radius: var(--lt-border-radius);
348
+ border: 1px solid transparent;
349
+ color: var(--lt-text-default);
350
+ cursor: pointer;
351
+ font-family: inherit;
352
+ font-size: 0.8125rem;
353
+ font-weight: 400;
354
+ padding: var(--lt-spacing-2) 0;
355
+ text-align: center;
356
+ transition:
357
+ background 100ms ease,
358
+ border-color 100ms ease;
359
+ }
360
+
361
+ .picker-month-btn:hover:not(:disabled) {
362
+ background: var(--lt-bg-neutral-subtle);
363
+ border-color: var(--lt-border-default);
364
+ }
365
+
366
+ .picker-month-btn--current {
367
+ background: var(--lt-interactive-primary-bg);
368
+ border-color: transparent;
369
+ color: var(--lt-text-on-primary);
370
+ font-weight: 600;
371
+ }
372
+
373
+ .picker-month-btn--current:hover:not(:disabled) {
374
+ background: var(--lt-interactive-primary-bg-hover);
375
+ }
376
+
377
+ .picker-month-btn:disabled {
378
+ color: var(--lt-text-disabled);
379
+ cursor: not-allowed;
380
+ opacity: 0.5;
381
+ }
382
+
383
+ /* ── Footer ── */
384
+
385
+ .footer {
386
+ border-top: 1px solid var(--lt-border-subtle);
387
+ display: flex;
388
+ justify-content: flex-end;
389
+ padding-top: var(--lt-spacing-1);
390
+ }
391
+
392
+ .today-btn {
393
+ background: transparent;
394
+ border-radius: var(--lt-border-radius);
395
+ border: 1px solid var(--lt-border-default);
396
+ color: var(--lt-text-subtle);
397
+ cursor: pointer;
398
+ font-family: inherit;
399
+ font-size: 0.75rem;
400
+ font-weight: 500;
401
+ padding: var(--lt-spacing-1) var(--lt-spacing-2);
402
+ transition:
403
+ background 120ms ease,
404
+ border-color 120ms ease,
405
+ color 120ms ease;
406
+ }
407
+
408
+ .today-btn:hover:not(:disabled) {
409
+ background: var(--lt-bg-neutral-subtle);
410
+ border-color: var(--lt-border-strong);
411
+ color: var(--lt-text-default);
412
+ }
413
+
414
+ .today-btn:disabled {
415
+ color: var(--lt-text-disabled);
416
+ cursor: not-allowed;
417
+ opacity: 0.5;
418
+ }
419
+ `;
420
+
421
+ // src/utils/dispatch.ts
422
+ var dispatch = (host, name, detail, init) => host.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true, ...init }));
423
+
424
+ // src/components/calendar/calendar.ts
425
+ var Calendar = class extends ThemeableElement {
426
+ constructor() {
427
+ super(...arguments);
428
+ this.mode = "single";
429
+ this.value = "";
430
+ this.valueStart = "";
431
+ this.valueEnd = "";
432
+ this.min = "";
433
+ this.max = "";
434
+ this.locale = "en-US";
435
+ this.weekStart = "0";
436
+ this.showOutsideDays = true;
437
+ this.disabled = false;
438
+ this.months = 1;
439
+ /** Specific dates to disable, as an array of Date objects. Not reflected as an attribute. */
440
+ this.disabledDates = [];
441
+ this._viewYear = (/* @__PURE__ */ new Date()).getFullYear();
442
+ this._viewMonth = (/* @__PURE__ */ new Date()).getMonth();
443
+ this._focusedDate = null;
444
+ this._hoverDate = null;
445
+ this._pickingMonthYear = false;
446
+ this._pickerYear = (/* @__PURE__ */ new Date()).getFullYear();
447
+ this._handleCalendarKeyDown = (e) => {
448
+ if (e.key === "Escape" && this._pickingMonthYear) {
449
+ e.stopPropagation();
450
+ this._closePicker();
451
+ }
452
+ };
453
+ this._handleGridMouseOver = (e) => {
454
+ if (this.mode !== "range" || this.valueEnd) return;
455
+ const btn = e.target.closest("[data-date]");
456
+ if (btn?.dataset.date) {
457
+ const d = this._parseDate(btn.dataset.date);
458
+ if (d && (!this._hoverDate || !this._isSameDay(d, this._hoverDate))) {
459
+ this._hoverDate = d;
460
+ }
461
+ }
462
+ };
463
+ this._handleGridMouseLeave = () => {
464
+ if (this.mode === "range") this._hoverDate = null;
465
+ };
466
+ this._handleKeyDown = (e) => {
467
+ const today = /* @__PURE__ */ new Date();
468
+ const focusedDate = this._focusedDate ?? this._parseDate(this.value) ?? new Date(this._viewYear, this._viewMonth, today.getDate() || 1);
469
+ const next = new Date(focusedDate);
470
+ const weekStart = Number(this.weekStart);
471
+ switch (e.key) {
472
+ case "ArrowRight":
473
+ next.setDate(next.getDate() + 1);
474
+ break;
475
+ case "ArrowLeft":
476
+ next.setDate(next.getDate() - 1);
477
+ break;
478
+ case "ArrowDown":
479
+ next.setDate(next.getDate() + 7);
480
+ break;
481
+ case "ArrowUp":
482
+ next.setDate(next.getDate() - 7);
483
+ break;
484
+ case "Home": {
485
+ const offset = (next.getDay() - weekStart + 7) % 7;
486
+ next.setDate(next.getDate() - offset);
487
+ break;
488
+ }
489
+ case "End": {
490
+ const offset = (next.getDay() - weekStart + 7) % 7;
491
+ next.setDate(next.getDate() + (6 - offset));
492
+ break;
493
+ }
494
+ case "PageUp":
495
+ e.preventDefault();
496
+ this._navigate(-1);
497
+ return;
498
+ case "PageDown":
499
+ e.preventDefault();
500
+ this._navigate(1);
501
+ return;
502
+ case "Enter":
503
+ case " ": {
504
+ e.preventDefault();
505
+ const days = this._buildDays();
506
+ const day = days.find((d) => this._isSameDay(d.date, focusedDate));
507
+ if (day && !day.isDisabled) this._selectDay(day);
508
+ return;
509
+ }
510
+ default:
511
+ return;
512
+ }
513
+ e.preventDefault();
514
+ if (next.getFullYear() !== this._viewYear || next.getMonth() !== this._viewMonth) {
515
+ this._viewYear = next.getFullYear();
516
+ this._viewMonth = next.getMonth();
517
+ }
518
+ this._focusedDate = next;
519
+ this._focusCell(this._toIso(next));
520
+ };
521
+ }
522
+ willUpdate(changed) {
523
+ super.willUpdate(changed);
524
+ if (changed.has("value") && this.value) {
525
+ const d = this._parseDate(this.value);
526
+ if (d) {
527
+ this._viewYear = d.getFullYear();
528
+ this._viewMonth = d.getMonth();
529
+ }
530
+ }
531
+ if (changed.has("valueStart") && this.valueStart) {
532
+ const d = this._parseDate(this.valueStart);
533
+ if (d) {
534
+ this._viewYear = d.getFullYear();
535
+ this._viewMonth = d.getMonth();
536
+ }
537
+ }
538
+ if (changed.has("months") && this.months > 1 && this._pickingMonthYear) {
539
+ this._pickingMonthYear = false;
540
+ }
541
+ }
542
+ _monthAtOffset(offset) {
543
+ let m = this._viewMonth + offset;
544
+ let y = this._viewYear;
545
+ while (m > 11) {
546
+ m -= 12;
547
+ y++;
548
+ }
549
+ return { year: y, month: m };
550
+ }
551
+ _parseDate(iso) {
552
+ if (!iso) return null;
553
+ const d = /* @__PURE__ */ new Date(`${iso}T00:00:00`);
554
+ return isNaN(d.getTime()) ? null : d;
555
+ }
556
+ _toIso(date) {
557
+ const y = date.getFullYear();
558
+ const m = String(date.getMonth() + 1).padStart(2, "0");
559
+ const d = String(date.getDate()).padStart(2, "0");
560
+ return `${y}-${m}-${d}`;
561
+ }
562
+ _isSameDay(a, b) {
563
+ return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
564
+ }
565
+ _isDisabled(date) {
566
+ if (this.disabled) return true;
567
+ if (this.min) {
568
+ const min = this._parseDate(this.min);
569
+ if (min && date < min) return true;
570
+ }
571
+ if (this.max) {
572
+ const max = this._parseDate(this.max);
573
+ if (max && date > max) return true;
574
+ }
575
+ return this.disabledDates.some((d) => this._isSameDay(d, date));
576
+ }
577
+ _buildDays(year = this._viewYear, month = this._viewMonth) {
578
+ const today = /* @__PURE__ */ new Date();
579
+ const selected = this._parseDate(this.value);
580
+ const weekStart = Number(this.weekStart);
581
+ const rangeStart = this.mode === "range" ? this._parseDate(this.valueStart) : null;
582
+ const rangeEnd = this.mode === "range" ? this._parseDate(this.valueEnd) : null;
583
+ let visHoverStart = null;
584
+ let visHoverEnd = null;
585
+ if (rangeStart && !rangeEnd && this._hoverDate) {
586
+ if (this._hoverDate >= rangeStart) {
587
+ visHoverStart = rangeStart;
588
+ visHoverEnd = this._hoverDate;
589
+ } else {
590
+ visHoverStart = this._hoverDate;
591
+ visHoverEnd = rangeStart;
592
+ }
593
+ }
594
+ const firstOfMonth = new Date(year, month, 1);
595
+ const lastOfMonth = new Date(year, month + 1, 0);
596
+ const startOffset = (firstOfMonth.getDay() - weekStart + 7) % 7;
597
+ const totalCurrent = startOffset + lastOfMonth.getDate();
598
+ const endOffset = totalCurrent % 7 === 0 ? 0 : 7 - totalCurrent % 7;
599
+ const days = [];
600
+ const buildDay = (date, isCurrentMonth) => {
601
+ const isRangeStart = !!rangeStart && this._isSameDay(date, rangeStart);
602
+ const isRangeEnd = !!rangeEnd && this._isSameDay(date, rangeEnd);
603
+ const isInRange = !!rangeStart && !!rangeEnd && date > rangeStart && date < rangeEnd && !this._isSameDay(date, rangeStart) && !this._isSameDay(date, rangeEnd);
604
+ const isRangeHoverStart = !!visHoverStart && this._isSameDay(date, visHoverStart);
605
+ const isRangeHoverEnd = !!visHoverEnd && !this._isSameDay(visHoverStart, visHoverEnd) && this._isSameDay(date, visHoverEnd);
606
+ const isInHoverRange = !!visHoverStart && !!visHoverEnd && date > visHoverStart && date < visHoverEnd;
607
+ return {
608
+ date,
609
+ isCurrentMonth,
610
+ isToday: this._isSameDay(date, today),
611
+ isSelected: this.mode === "single" && selected ? this._isSameDay(date, selected) : false,
612
+ isDisabled: this._isDisabled(date),
613
+ isRangeStart,
614
+ isRangeEnd,
615
+ isInRange,
616
+ isRangeHoverStart,
617
+ isRangeHoverEnd,
618
+ isInHoverRange
619
+ };
620
+ };
621
+ for (let i = startOffset; i > 0; i--) {
622
+ days.push(buildDay(new Date(year, month, 1 - i), false));
623
+ }
624
+ for (let d = 1; d <= lastOfMonth.getDate(); d++) {
625
+ days.push(buildDay(new Date(year, month, d), true));
626
+ }
627
+ for (let d = 1; d <= endOffset; d++) {
628
+ days.push(buildDay(new Date(year, month + 1, d), false));
629
+ }
630
+ return days;
631
+ }
632
+ _getWeekdayLabels() {
633
+ const weekStart = Number(this.weekStart);
634
+ const fmt = new Intl.DateTimeFormat(this.locale, { weekday: "narrow" });
635
+ const refSunday = new Date(2026, 0, 4);
636
+ return Array.from({ length: 7 }, (_, i) => {
637
+ const date = new Date(refSunday);
638
+ date.setDate(refSunday.getDate() + weekStart + i);
639
+ return fmt.format(date);
640
+ });
641
+ }
642
+ _navigate(delta) {
643
+ if (this._pickingMonthYear) {
644
+ this._pickerYear += delta;
645
+ return;
646
+ }
647
+ let month = this._viewMonth + delta;
648
+ let year = this._viewYear;
649
+ while (month < 0) {
650
+ month += 12;
651
+ year--;
652
+ }
653
+ while (month > 11) {
654
+ month -= 12;
655
+ year++;
656
+ }
657
+ this._viewMonth = month;
658
+ this._viewYear = year;
659
+ this._focusedDate = null;
660
+ dispatch(this, "month-change", { year: this._viewYear, month: this._viewMonth });
661
+ }
662
+ _openPicker() {
663
+ this._pickerYear = this._viewYear;
664
+ this._pickingMonthYear = true;
665
+ }
666
+ _closePicker() {
667
+ this._pickingMonthYear = false;
668
+ }
669
+ _selectPickerMonth(month) {
670
+ this._viewYear = this._pickerYear;
671
+ this._viewMonth = month;
672
+ this._pickingMonthYear = false;
673
+ this._focusedDate = null;
674
+ dispatch(this, "month-change", { year: this._viewYear, month: this._viewMonth });
675
+ }
676
+ _selectDay(day) {
677
+ if (day.isDisabled || this.disabled) return;
678
+ if (!day.isCurrentMonth) {
679
+ this._viewMonth = day.date.getMonth();
680
+ this._viewYear = day.date.getFullYear();
681
+ }
682
+ if (this.mode === "range") {
683
+ const iso2 = this._toIso(day.date);
684
+ const hasStart = !!this.valueStart;
685
+ const hasEnd = !!this.valueEnd;
686
+ if (!hasStart || hasEnd) {
687
+ this.valueStart = iso2;
688
+ this.valueEnd = "";
689
+ this._hoverDate = null;
690
+ } else {
691
+ const startDate = this._parseDate(this.valueStart);
692
+ if (this._isSameDay(day.date, startDate)) {
693
+ this.valueStart = "";
694
+ } else if (day.date < startDate) {
695
+ this.valueEnd = this.valueStart;
696
+ this.valueStart = iso2;
697
+ } else {
698
+ this.valueEnd = iso2;
699
+ }
700
+ if (this.valueStart && this.valueEnd) {
701
+ dispatch(this, "change", { valueStart: this.valueStart, valueEnd: this.valueEnd });
702
+ }
703
+ }
704
+ this._focusedDate = day.date;
705
+ return;
706
+ }
707
+ const iso = this._toIso(day.date);
708
+ this.value = iso;
709
+ this._focusedDate = day.date;
710
+ dispatch(this, "change", { value: iso });
711
+ }
712
+ _goToToday() {
713
+ const today = /* @__PURE__ */ new Date();
714
+ this._viewYear = today.getFullYear();
715
+ this._viewMonth = today.getMonth();
716
+ this._focusedDate = null;
717
+ this._pickingMonthYear = false;
718
+ }
719
+ _dayAriaLabel(date) {
720
+ return new Intl.DateTimeFormat(this.locale, {
721
+ weekday: "long",
722
+ year: "numeric",
723
+ month: "long",
724
+ day: "numeric"
725
+ }).format(date);
726
+ }
727
+ _focusCell(iso) {
728
+ this.updateComplete.then(() => {
729
+ const target = this.shadowRoot?.querySelector(`[data-date="${iso}"]`);
730
+ target?.focus();
731
+ });
732
+ }
733
+ _renderDay(day, rovingDate) {
734
+ if (!day.isCurrentMonth && !this.showOutsideDays) {
735
+ return html`<div role="gridcell" aria-hidden="true" class="day day--empty"></div>`;
736
+ }
737
+ const isRangeLeft = day.isRangeStart || day.isRangeHoverStart;
738
+ const isRangeRight = day.isRangeEnd || day.isRangeHoverEnd;
739
+ const isRangeConfirmed = day.isRangeStart || day.isRangeEnd;
740
+ const isRangeHoverPoint = !isRangeConfirmed && (day.isRangeHoverStart || day.isRangeHoverEnd);
741
+ const classes = [
742
+ "day",
743
+ !day.isCurrentMonth ? "day--outside" : "",
744
+ day.isToday ? "day--today" : "",
745
+ day.isSelected ? "day--selected" : "",
746
+ isRangeLeft ? "day--range-left" : "",
747
+ isRangeRight ? "day--range-right" : "",
748
+ isRangeConfirmed ? "day--range-confirmed" : "",
749
+ isRangeHoverPoint ? "day--range-hover" : "",
750
+ day.isInRange ? "day--in-range" : "",
751
+ day.isInHoverRange ? "day--in-hover-range" : ""
752
+ ].filter(Boolean).join(" ");
753
+ const iso = this._toIso(day.date);
754
+ const isSelected = day.isSelected || day.isRangeStart || day.isRangeEnd;
755
+ return html`
756
+ <button
757
+ role="gridcell"
758
+ class=${classes}
759
+ data-date=${iso}
760
+ ?disabled=${day.isDisabled}
761
+ aria-selected=${isSelected ? "true" : "false"}
762
+ aria-label=${this._dayAriaLabel(day.date)}
763
+ tabindex=${this._isSameDay(day.date, rovingDate) ? 0 : -1}
764
+ @click=${() => this._selectDay(day)}
765
+ @keydown=${this._handleKeyDown}
766
+ >
767
+ <span class="day__inner">${day.date.getDate()}</span>
768
+ </button>
769
+ `;
770
+ }
771
+ _renderMonthGrid(year, month, gridLabel, rovingDate) {
772
+ const days = this._buildDays(year, month);
773
+ const weekdayLabels = this._getWeekdayLabels();
774
+ const weeks = [];
775
+ for (let i = 0; i < days.length; i += 7) weeks.push(days.slice(i, i + 7));
776
+ return html`
777
+ <div class="weekdays" aria-hidden="true">
778
+ ${weekdayLabels.map((label) => html`<div class="weekday">${label}</div>`)}
779
+ </div>
780
+ <div
781
+ class="grid"
782
+ role="grid"
783
+ aria-label="${gridLabel}"
784
+ @mouseover=${this._handleGridMouseOver}
785
+ @mouseleave=${this._handleGridMouseLeave}
786
+ >
787
+ ${weeks.map((week) => html` <div role="row">${week.map((day) => this._renderDay(day, rovingDate))}</div> `)}
788
+ </div>
789
+ `;
790
+ }
791
+ render() {
792
+ const today = /* @__PURE__ */ new Date();
793
+ const isMulti = this.months > 1;
794
+ const rovingAnchor = this._parseDate(this.mode === "range" ? this.valueStart : this.value);
795
+ const rovingDate = this._focusedDate ?? rovingAnchor ?? (today.getFullYear() === this._viewYear && today.getMonth() === this._viewMonth ? today : null) ?? new Date(this._viewYear, this._viewMonth, 1);
796
+ const footer = html`
797
+ <div class="footer">
798
+ <button class="today-btn" ?disabled=${this.disabled} @click=${this._goToToday}>Today</button>
799
+ </div>
800
+ `;
801
+ if (isMulti) {
802
+ const panelLabels = Array.from({ length: this.months }, (_, i) => {
803
+ const { year, month } = this._monthAtOffset(i);
804
+ return new Intl.DateTimeFormat(this.locale, { month: "long", year: "numeric" }).format(new Date(year, month));
805
+ });
806
+ return html`
807
+ <div class="calendar calendar--multi" part="base" @keydown=${this._handleCalendarKeyDown}>
808
+ <div class="header">
809
+ <button
810
+ class="nav-btn"
811
+ aria-label="Previous month"
812
+ ?disabled=${this.disabled}
813
+ @click=${() => this._navigate(-1)}
814
+ >
815
+ <lt-icon name="arrow-left" size="sm"></lt-icon>
816
+ </button>
817
+ <div class="month-label-row">
818
+ ${panelLabels.map(
819
+ (label, i) => html`<span class="month-label" aria-live=${i === 0 ? "polite" : "off"} aria-atomic="true"
820
+ >${label}</span
821
+ >`
822
+ )}
823
+ </div>
824
+ <button
825
+ class="nav-btn"
826
+ aria-label="Next month"
827
+ ?disabled=${this.disabled}
828
+ @click=${() => this._navigate(1)}
829
+ >
830
+ <lt-icon name="arrow-right" size="sm"></lt-icon>
831
+ </button>
832
+ </div>
833
+ <div class="month-panels">
834
+ ${Array.from(
835
+ { length: this.months },
836
+ (_, i) => html`
837
+ <div class="month-col">
838
+ ${this._renderMonthGrid(
839
+ this._monthAtOffset(i).year,
840
+ this._monthAtOffset(i).month,
841
+ panelLabels[i],
842
+ rovingDate
843
+ )}
844
+ </div>
845
+ `
846
+ )}
847
+ </div>
848
+ ${footer}
849
+ </div>
850
+ `;
851
+ }
852
+ const monthLabel = new Intl.DateTimeFormat(this.locale, { month: "long", year: "numeric" }).format(
853
+ new Date(this._viewYear, this._viewMonth)
854
+ );
855
+ const prevLabel = this._pickingMonthYear ? "Previous year" : "Previous month";
856
+ const nextLabel = this._pickingMonthYear ? "Next year" : "Next month";
857
+ const header = html`
858
+ <div class="header">
859
+ <button class="nav-btn" aria-label=${prevLabel} ?disabled=${this.disabled} @click=${() => this._navigate(-1)}>
860
+ <lt-icon name="arrow-left" size="sm"></lt-icon>
861
+ </button>
862
+ <button
863
+ class="month-label-btn ${this._pickingMonthYear ? "month-label-btn--open" : ""}"
864
+ aria-expanded=${this._pickingMonthYear ? "true" : "false"}
865
+ aria-label="Choose month and year"
866
+ ?disabled=${this.disabled}
867
+ @click=${() => this._pickingMonthYear ? this._closePicker() : this._openPicker()}
868
+ >
869
+ <span aria-live="polite" aria-atomic="true">${this._pickingMonthYear ? this._pickerYear : monthLabel}</span>
870
+ <lt-icon name="arrow-down" size="sm" class="picker-chevron"></lt-icon>
871
+ </button>
872
+ <button class="nav-btn" aria-label=${nextLabel} ?disabled=${this.disabled} @click=${() => this._navigate(1)}>
873
+ <lt-icon name="arrow-right" size="sm"></lt-icon>
874
+ </button>
875
+ </div>
876
+ `;
877
+ const pickerBody = this._pickingMonthYear ? html`
878
+ <div class="picker-months">
879
+ ${Array.from({ length: 12 }, (_, i) => {
880
+ const label = new Intl.DateTimeFormat(this.locale, { month: "short" }).format(
881
+ new Date(this._pickerYear, i)
882
+ );
883
+ const isCurrent = i === this._viewMonth && this._pickerYear === this._viewYear;
884
+ return html`
885
+ <button
886
+ class="picker-month-btn ${isCurrent ? "picker-month-btn--current" : ""}"
887
+ ?disabled=${this.disabled}
888
+ @click=${() => this._selectPickerMonth(i)}
889
+ >
890
+ ${label}
891
+ </button>
892
+ `;
893
+ })}
894
+ </div>
895
+ ` : this._renderMonthGrid(this._viewYear, this._viewMonth, monthLabel, rovingDate);
896
+ return html`
897
+ <div class="calendar" part="base" @keydown=${this._handleCalendarKeyDown}>${header} ${pickerBody} ${footer}</div>
898
+ `;
899
+ }
900
+ };
901
+ Calendar.styles = calendarStyles;
902
+ __decorateClass([
903
+ property2({ reflect: true })
904
+ ], Calendar.prototype, "mode", 2);
905
+ __decorateClass([
906
+ property2({ reflect: true })
907
+ ], Calendar.prototype, "value", 2);
908
+ __decorateClass([
909
+ property2({ reflect: true, attribute: "value-start" })
910
+ ], Calendar.prototype, "valueStart", 2);
911
+ __decorateClass([
912
+ property2({ reflect: true, attribute: "value-end" })
913
+ ], Calendar.prototype, "valueEnd", 2);
914
+ __decorateClass([
915
+ property2({ reflect: true })
916
+ ], Calendar.prototype, "min", 2);
917
+ __decorateClass([
918
+ property2({ reflect: true })
919
+ ], Calendar.prototype, "max", 2);
920
+ __decorateClass([
921
+ property2({ reflect: true })
922
+ ], Calendar.prototype, "locale", 2);
923
+ __decorateClass([
924
+ property2({ attribute: "week-start", reflect: true })
925
+ ], Calendar.prototype, "weekStart", 2);
926
+ __decorateClass([
927
+ property2({ type: Boolean, attribute: "show-outside-days", reflect: true })
928
+ ], Calendar.prototype, "showOutsideDays", 2);
929
+ __decorateClass([
930
+ property2({ type: Boolean, reflect: true })
931
+ ], Calendar.prototype, "disabled", 2);
932
+ __decorateClass([
933
+ property2({ type: Number, reflect: true })
934
+ ], Calendar.prototype, "months", 2);
935
+ __decorateClass([
936
+ state()
937
+ ], Calendar.prototype, "_viewYear", 2);
938
+ __decorateClass([
939
+ state()
940
+ ], Calendar.prototype, "_viewMonth", 2);
941
+ __decorateClass([
942
+ state()
943
+ ], Calendar.prototype, "_focusedDate", 2);
944
+ __decorateClass([
945
+ state()
946
+ ], Calendar.prototype, "_hoverDate", 2);
947
+ __decorateClass([
948
+ state()
949
+ ], Calendar.prototype, "_pickingMonthYear", 2);
950
+ __decorateClass([
951
+ state()
952
+ ], Calendar.prototype, "_pickerYear", 2);
953
+ Calendar = __decorateClass([
954
+ customElement("lt-calendar")
955
+ ], Calendar);
956
+ export {
957
+ Calendar
958
+ };