ui-svelte 0.2.11 → 0.2.13

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 (225) hide show
  1. package/README.md +2 -2
  2. package/dist/charts/ArcChart.svelte +9 -14
  3. package/dist/charts/ArcChart.svelte.d.ts +3 -3
  4. package/dist/charts/AreaChart.svelte +347 -118
  5. package/dist/charts/AreaChart.svelte.d.ts +33 -4
  6. package/dist/charts/BarChart.svelte +288 -66
  7. package/dist/charts/BarChart.svelte.d.ts +26 -1
  8. package/dist/charts/Candlestick.svelte +53 -50
  9. package/dist/charts/Candlestick.svelte.d.ts +8 -8
  10. package/dist/charts/LineChart.svelte +391 -91
  11. package/dist/charts/LineChart.svelte.d.ts +26 -3
  12. package/dist/charts/PieChart.svelte +333 -92
  13. package/dist/charts/PieChart.svelte.d.ts +33 -5
  14. package/dist/charts/css/arc-chart.css +3 -3
  15. package/dist/charts/css/area-chart.css +127 -29
  16. package/dist/charts/css/bar-chart.css +114 -8
  17. package/dist/charts/css/candlestick.css +2 -0
  18. package/dist/charts/css/line-chart.css +111 -13
  19. package/dist/charts/css/pie-chart.css +92 -20
  20. package/dist/control/Audio.svelte +86 -44
  21. package/dist/control/Audio.svelte.d.ts +4 -1
  22. package/dist/control/Button.svelte +18 -27
  23. package/dist/control/Button.svelte.d.ts +3 -2
  24. package/dist/control/Fab.svelte +103 -0
  25. package/dist/control/Fab.svelte.d.ts +25 -0
  26. package/dist/control/IconButton.svelte +17 -27
  27. package/dist/control/IconButton.svelte.d.ts +3 -3
  28. package/dist/control/Image.svelte +123 -0
  29. package/dist/control/Image.svelte.d.ts +13 -0
  30. package/dist/control/Record.svelte +141 -98
  31. package/dist/control/Record.svelte.d.ts +2 -1
  32. package/dist/control/ToggleGroup.svelte +22 -8
  33. package/dist/control/ToggleGroup.svelte.d.ts +2 -1
  34. package/dist/control/ToggleTheme.svelte +13 -11
  35. package/dist/control/ToggleTheme.svelte.d.ts +3 -2
  36. package/dist/control/Video.svelte +57 -29
  37. package/dist/control/Video.svelte.d.ts +1 -0
  38. package/dist/control/css/btn.css +200 -152
  39. package/dist/control/css/fab.css +84 -0
  40. package/dist/control/css/image.css +56 -0
  41. package/dist/control/css/media.css +95 -30
  42. package/dist/control/css/toggle-group.css +253 -84
  43. package/dist/control/css/video.css +1 -14
  44. package/dist/css/animations.css +5 -9
  45. package/dist/css/base.css +13 -347
  46. package/dist/css/decorations.css +561 -0
  47. package/dist/css/rich-text.css +485 -0
  48. package/dist/css/transitions.css +158 -0
  49. package/dist/css/typography.css +291 -0
  50. package/dist/css/utilities.css +0 -4
  51. package/dist/display/Accordion.svelte +28 -4
  52. package/dist/display/Accordion.svelte.d.ts +2 -1
  53. package/dist/display/Alert.svelte +32 -12
  54. package/dist/display/Alert.svelte.d.ts +2 -3
  55. package/dist/display/Avatar.svelte +23 -18
  56. package/dist/display/Avatar.svelte.d.ts +4 -1
  57. package/dist/display/AvatarGroup.svelte +20 -18
  58. package/dist/display/AvatarGroup.svelte.d.ts +6 -3
  59. package/dist/display/Badge.svelte +11 -4
  60. package/dist/display/Badge.svelte.d.ts +2 -1
  61. package/dist/display/Card.svelte +15 -14
  62. package/dist/display/Card.svelte.d.ts +2 -3
  63. package/dist/display/Carousel.svelte +130 -99
  64. package/dist/display/Carousel.svelte.d.ts +6 -4
  65. package/dist/display/ChatBox.svelte +245 -106
  66. package/dist/display/ChatBox.svelte.d.ts +32 -5
  67. package/dist/display/Chip.svelte +31 -17
  68. package/dist/display/Chip.svelte.d.ts +3 -2
  69. package/dist/display/Code.svelte +7 -4
  70. package/dist/display/Code.svelte.d.ts +1 -0
  71. package/dist/display/Collapsible.svelte +30 -4
  72. package/dist/display/Collapsible.svelte.d.ts +2 -1
  73. package/dist/display/Countdown.svelte +169 -0
  74. package/dist/display/Countdown.svelte.d.ts +21 -0
  75. package/dist/display/Empty.svelte +37 -3
  76. package/dist/display/Empty.svelte.d.ts +3 -0
  77. package/dist/display/Item.svelte +42 -11
  78. package/dist/display/Item.svelte.d.ts +4 -2
  79. package/dist/display/Map.svelte +488 -0
  80. package/dist/display/Map.svelte.d.ts +44 -0
  81. package/dist/display/Marquee.svelte +0 -2
  82. package/dist/display/Section.svelte +14 -12
  83. package/dist/display/Section.svelte.d.ts +2 -3
  84. package/dist/display/Skeleton.svelte +32 -0
  85. package/dist/display/Skeleton.svelte.d.ts +10 -0
  86. package/dist/display/Table.svelte +94 -132
  87. package/dist/display/Table.svelte.d.ts +10 -1
  88. package/dist/display/css/accordion.css +349 -52
  89. package/dist/display/css/alert.css +38 -18
  90. package/dist/display/css/avatar-group.css +38 -75
  91. package/dist/display/css/avatar.css +139 -121
  92. package/dist/display/css/badge.css +50 -27
  93. package/dist/display/css/card.css +123 -71
  94. package/dist/display/css/carousel.css +25 -5
  95. package/dist/display/css/chat-box.css +158 -26
  96. package/dist/display/css/chip.css +142 -68
  97. package/dist/display/css/code.css +2 -6
  98. package/dist/display/css/collapsible.css +349 -45
  99. package/dist/display/css/countdown.css +206 -0
  100. package/dist/display/css/divider.css +8 -6
  101. package/dist/display/css/empty.css +7 -0
  102. package/dist/display/css/item.css +330 -84
  103. package/dist/display/css/map.css +164 -0
  104. package/dist/display/css/marquee.css +0 -3
  105. package/dist/display/css/section.css +89 -65
  106. package/dist/display/css/skeleton.css +58 -0
  107. package/dist/display/css/table.css +309 -193
  108. package/dist/form/Checkbox.svelte +11 -5
  109. package/dist/form/Checkbox.svelte.d.ts +2 -1
  110. package/dist/form/ColorField.svelte +601 -0
  111. package/dist/form/ColorField.svelte.d.ts +29 -0
  112. package/dist/form/ComboBox.svelte +24 -9
  113. package/dist/form/ComboBox.svelte.d.ts +2 -2
  114. package/dist/form/CsvField.svelte +62 -136
  115. package/dist/form/CsvField.svelte.d.ts +2 -2
  116. package/dist/form/DateField.svelte +33 -15
  117. package/dist/form/DateField.svelte.d.ts +2 -1
  118. package/dist/form/DateRange.svelte +436 -0
  119. package/dist/form/DateRange.svelte.d.ts +24 -0
  120. package/dist/form/DragDrop.svelte +578 -0
  121. package/dist/form/DragDrop.svelte.d.ts +33 -0
  122. package/dist/form/Dropzone.svelte +28 -8
  123. package/dist/form/Dropzone.svelte.d.ts +2 -2
  124. package/dist/form/Editor.svelte +626 -0
  125. package/dist/form/Editor.svelte.d.ts +50 -0
  126. package/dist/form/ImageCropper.svelte +422 -61
  127. package/dist/form/ImageCropper.svelte.d.ts +15 -1
  128. package/dist/form/{PasswordStrength.svelte → PasswordField.svelte} +58 -24
  129. package/dist/form/{PasswordStrength.svelte.d.ts → PasswordField.svelte.d.ts} +6 -5
  130. package/dist/form/PhoneField.svelte +26 -14
  131. package/dist/form/PhoneField.svelte.d.ts +4 -3
  132. package/dist/form/PinField.svelte +39 -31
  133. package/dist/form/PinField.svelte.d.ts +3 -3
  134. package/dist/form/RadioGroup.svelte +9 -5
  135. package/dist/form/RadioGroup.svelte.d.ts +1 -1
  136. package/dist/form/Select.svelte +20 -19
  137. package/dist/form/Select.svelte.d.ts +2 -2
  138. package/dist/form/Slider.svelte +10 -4
  139. package/dist/form/Slider.svelte.d.ts +2 -1
  140. package/dist/form/TextField.svelte +29 -11
  141. package/dist/form/TextField.svelte.d.ts +5 -4
  142. package/dist/form/Textarea.svelte +15 -6
  143. package/dist/form/Textarea.svelte.d.ts +2 -2
  144. package/dist/form/Toggle.svelte +7 -3
  145. package/dist/form/Toggle.svelte.d.ts +1 -1
  146. package/dist/form/css/checkbox.css +18 -2
  147. package/dist/form/css/color-field.css +141 -0
  148. package/dist/form/css/control.css +193 -82
  149. package/dist/form/css/csv-field.css +221 -0
  150. package/dist/form/css/date-range.css +122 -0
  151. package/dist/form/css/date.css +24 -2
  152. package/dist/form/css/drag-drop.css +234 -0
  153. package/dist/form/css/dropzone.css +153 -34
  154. package/dist/form/css/editor.css +367 -0
  155. package/dist/form/css/field.css +4 -0
  156. package/dist/form/css/image-cropper.css +242 -20
  157. package/dist/form/css/radio-group.css +26 -1
  158. package/dist/form/css/select.css +2 -2
  159. package/dist/form/css/slider.css +37 -0
  160. package/dist/form/css/textarea.css +178 -75
  161. package/dist/form/css/toggle.css +15 -3
  162. package/dist/hooks/use-chat.svelte.js +1 -1
  163. package/dist/hooks/use-form.svelte.js +3 -3
  164. package/dist/hooks/use-search.svelte.js +0 -3
  165. package/dist/hooks/use-table.svelte.d.ts +1 -0
  166. package/dist/hooks/use-table.svelte.js +6 -0
  167. package/dist/icons/index.d.ts +34 -2
  168. package/dist/icons/index.js +36 -4
  169. package/dist/index.css +44 -49
  170. package/dist/index.d.ts +14 -4
  171. package/dist/index.js +13 -3
  172. package/dist/layout/AppBar.svelte +22 -14
  173. package/dist/layout/AppBar.svelte.d.ts +2 -1
  174. package/dist/layout/Footer.svelte +19 -11
  175. package/dist/layout/Footer.svelte.d.ts +2 -1
  176. package/dist/layout/Provider.svelte +32 -9
  177. package/dist/layout/Provider.svelte.d.ts +3 -1
  178. package/dist/layout/Sidebar.svelte +17 -8
  179. package/dist/layout/Sidebar.svelte.d.ts +2 -1
  180. package/dist/layout/css/app-bar.css +63 -66
  181. package/dist/layout/css/footer.css +62 -65
  182. package/dist/layout/css/sidebar.css +120 -59
  183. package/dist/navigation/BottomNav.svelte +51 -14
  184. package/dist/navigation/FooterGroup.svelte +1 -1
  185. package/dist/navigation/NavMenu.svelte +47 -23
  186. package/dist/navigation/NavMenu.svelte.d.ts +29 -0
  187. package/dist/navigation/Pagination.svelte +158 -0
  188. package/dist/navigation/Pagination.svelte.d.ts +18 -0
  189. package/dist/navigation/SideNav.svelte +30 -25
  190. package/dist/navigation/SideNav.svelte.d.ts +2 -3
  191. package/dist/navigation/Tabs.svelte +17 -7
  192. package/dist/navigation/Tabs.svelte.d.ts +2 -2
  193. package/dist/navigation/css/bottom-nav.css +319 -257
  194. package/dist/navigation/css/footer-group.css +1 -1
  195. package/dist/navigation/css/footer-nav.css +1 -1
  196. package/dist/navigation/css/nav-menu.css +331 -106
  197. package/dist/navigation/css/pagination.css +74 -0
  198. package/dist/navigation/css/side-nav.css +514 -75
  199. package/dist/navigation/css/tabs.css +246 -52
  200. package/dist/overlay/AlertDialog.svelte +58 -0
  201. package/dist/overlay/AlertDialog.svelte.d.ts +14 -25
  202. package/dist/overlay/Command.svelte +347 -0
  203. package/dist/overlay/Command.svelte.d.ts +33 -25
  204. package/dist/overlay/Drawer.svelte +49 -21
  205. package/dist/overlay/Drawer.svelte.d.ts +2 -2
  206. package/dist/overlay/Dropdown.svelte +3 -3
  207. package/dist/overlay/Modal.svelte +51 -16
  208. package/dist/overlay/Modal.svelte.d.ts +3 -3
  209. package/dist/overlay/Toast.svelte +41 -17
  210. package/dist/overlay/Toast.svelte.d.ts +1 -1
  211. package/dist/overlay/Tooltip.svelte +36 -27
  212. package/dist/overlay/Tooltip.svelte.d.ts +2 -2
  213. package/dist/overlay/css/command.css +68 -0
  214. package/dist/overlay/css/drawer.css +63 -24
  215. package/dist/overlay/css/dropdown.css +1 -1
  216. package/dist/overlay/css/hovercard.css +1 -1
  217. package/dist/overlay/css/modal.css +79 -27
  218. package/dist/overlay/css/toast.css +40 -24
  219. package/dist/overlay/css/tooltip.css +110 -67
  220. package/dist/stores/theme.svelte.js +44 -12
  221. package/dist/stores/toast.svelte.d.ts +4 -4
  222. package/dist/stores/toast.svelte.js +2 -2
  223. package/package.json +1 -1
  224. package/dist/utils/charts.d.ts +0 -27
  225. package/dist/utils/charts.js +0 -140
@@ -0,0 +1,436 @@
1
+ <script lang="ts">
2
+ import { ArrowLeft24RegularIcon, ArrowRight24RegularIcon } from '../icons/index.js';
3
+ import { formatDate, getWeekdays, IconButton } from '../index.js';
4
+ import { cn } from '../utils/class-names.js';
5
+ import { onMount } from 'svelte';
6
+
7
+ type Props = {
8
+ startDate?: Date | null;
9
+ endDate?: Date | null;
10
+ placeholder?: string;
11
+ onchange?: (range: { start: Date | null; end: Date | null }) => void;
12
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
13
+ variant?: 'solid' | 'soft' | 'outlined' | 'line';
14
+ size?: 'sm' | 'md' | 'lg';
15
+ name?: string;
16
+ class?: string;
17
+ label?: string;
18
+ isLabelActive?: boolean;
19
+ helpText?: string;
20
+ errorText?: string;
21
+ isFloatLabel?: boolean;
22
+ minDate?: Date | null;
23
+ maxDate?: Date | null;
24
+ };
25
+
26
+ let {
27
+ startDate = $bindable(null),
28
+ endDate = $bindable(null),
29
+ placeholder = 'Select date range',
30
+ onchange,
31
+ variant = 'outlined',
32
+ color = 'muted',
33
+ size = 'md',
34
+ name,
35
+ label,
36
+ isLabelActive,
37
+ helpText,
38
+ errorText,
39
+ class: className,
40
+ isFloatLabel,
41
+ minDate = null,
42
+ maxDate = null
43
+ }: Props = $props();
44
+
45
+ let currentViewDate = $state<Date>(startDate ? new Date(startDate) : new Date());
46
+ let currentMonth = $derived(currentViewDate.getMonth());
47
+ let currentYear = $derived(currentViewDate.getFullYear());
48
+ let contentEl = $state<HTMLDivElement>();
49
+ let controlElement = $state<HTMLElement>();
50
+
51
+ let isOpen = $state(false);
52
+ let hoverDate = $state<Date | null>(null);
53
+ let selectionMode = $state<'start' | 'end'>('start');
54
+
55
+ let isActive = $state(false);
56
+ let isFocused = $state(false);
57
+
58
+ let position = $state({
59
+ top: 0,
60
+ left: 0,
61
+ width: 'auto',
62
+ isBottomHalf: false
63
+ });
64
+
65
+ const colors = {
66
+ primary: 'is-primary',
67
+ secondary: 'is-secondary',
68
+ muted: 'is-muted',
69
+ success: 'is-success',
70
+ info: 'is-info',
71
+ danger: 'is-danger',
72
+ warning: 'is-warning'
73
+ };
74
+
75
+ const variants = {
76
+ solid: 'is-solid',
77
+ soft: 'is-soft',
78
+ outlined: 'is-outlined',
79
+ line: 'is-line'
80
+ };
81
+
82
+ const sizeClasses = {
83
+ sm: 'is-sm',
84
+ md: 'is-md',
85
+ lg: 'is-lg'
86
+ };
87
+
88
+ const style = $derived(
89
+ `top: ${position.top}px; left: ${position.left}px; width: ${position.width}px; transform-origin: ${position.isBottomHalf ? 'bottom' : 'top'} center;`
90
+ );
91
+
92
+ const nextMonth = $derived((currentMonth + 1) % 12);
93
+ const nextMonthYear = $derived(currentMonth === 11 ? currentYear + 1 : currentYear);
94
+
95
+ const getDaysInMonth = (month: number, year: number) => {
96
+ const firstDay = new Date(year, month, 1);
97
+ const lastDay = new Date(year, month + 1, 0);
98
+ const daysInMonth = lastDay.getDate();
99
+ const startingDayOfWeek = firstDay.getDay();
100
+
101
+ const days: (Date | null)[] = [];
102
+
103
+ for (let i = 0; i < startingDayOfWeek; i++) {
104
+ days.push(null);
105
+ }
106
+
107
+ for (let day = 1; day <= daysInMonth; day++) {
108
+ days.push(new Date(year, month, day));
109
+ }
110
+
111
+ return days;
112
+ };
113
+
114
+ const changeMonth = (direction: 'prev' | 'next') => {
115
+ const newDate = new Date(currentViewDate);
116
+ if (direction === 'prev') {
117
+ newDate.setMonth(newDate.getMonth() - 1);
118
+ } else {
119
+ newDate.setMonth(newDate.getMonth() + 1);
120
+ }
121
+ currentViewDate = newDate;
122
+ };
123
+
124
+ const selectDate = (date: Date) => {
125
+ if (selectionMode === 'start') {
126
+ startDate = new Date(date);
127
+ endDate = null;
128
+ selectionMode = 'end';
129
+ } else {
130
+ if (startDate && date < startDate) {
131
+ endDate = new Date(startDate);
132
+ startDate = new Date(date);
133
+ } else {
134
+ endDate = new Date(date);
135
+ }
136
+ selectionMode = 'start';
137
+ onchange?.({ start: startDate, end: endDate });
138
+ }
139
+ };
140
+
141
+ const isToday = (date: Date) => {
142
+ const today = new Date();
143
+ return (
144
+ date &&
145
+ date.getDate() === today.getDate() &&
146
+ date.getMonth() === today.getMonth() &&
147
+ date.getFullYear() === today.getFullYear()
148
+ );
149
+ };
150
+
151
+ const isStartDate = (date: Date) => {
152
+ return (
153
+ startDate &&
154
+ date &&
155
+ date.getDate() === startDate.getDate() &&
156
+ date.getMonth() === startDate.getMonth() &&
157
+ date.getFullYear() === startDate.getFullYear()
158
+ );
159
+ };
160
+
161
+ const isEndDate = (date: Date) => {
162
+ return (
163
+ endDate &&
164
+ date &&
165
+ date.getDate() === endDate.getDate() &&
166
+ date.getMonth() === endDate.getMonth() &&
167
+ date.getFullYear() === endDate.getFullYear()
168
+ );
169
+ };
170
+
171
+ const isInRange = (date: Date) => {
172
+ if (!date || !startDate) return false;
173
+
174
+ const effectiveEnd = endDate ?? hoverDate;
175
+ if (!effectiveEnd) return false;
176
+
177
+ const start = startDate < effectiveEnd ? startDate : effectiveEnd;
178
+ const end = startDate < effectiveEnd ? effectiveEnd : startDate;
179
+
180
+ return date > start && date < end;
181
+ };
182
+
183
+ const isDisabled = (date: Date) => {
184
+ if (!date) return false;
185
+ if (minDate && date < minDate) return true;
186
+ if (maxDate && date > maxDate) return true;
187
+ return false;
188
+ };
189
+
190
+ const monthNameLeft = $derived(
191
+ formatDate(new Date(currentYear, currentMonth, 1), {
192
+ month: 'short'
193
+ })
194
+ );
195
+
196
+ const monthNameRight = $derived(
197
+ formatDate(new Date(nextMonthYear, nextMonth, 1), {
198
+ month: 'short'
199
+ })
200
+ );
201
+
202
+ const daysLeft = $derived(getDaysInMonth(currentMonth, currentYear));
203
+ const daysRight = $derived(getDaysInMonth(nextMonth, nextMonthYear));
204
+ const weekdays = $derived(getWeekdays('narrow'));
205
+
206
+ const formattedRange = $derived.by(() => {
207
+ if (!startDate && !endDate) return '';
208
+
209
+ const formatOptions = {
210
+ year: 'numeric' as const,
211
+ month: 'short' as const,
212
+ day: 'numeric' as const
213
+ };
214
+
215
+ const startStr = startDate ? formatDate(startDate, formatOptions) : '';
216
+ const endStr = endDate ? formatDate(endDate, formatOptions) : '';
217
+
218
+ if (startStr && endStr) {
219
+ return `${startStr} - ${endStr}`;
220
+ }
221
+ return startStr || endStr;
222
+ });
223
+
224
+ const handleClickOutside = (event: Event) => {
225
+ if (
226
+ isOpen &&
227
+ !controlElement?.contains(event.target as Node) &&
228
+ !contentEl?.contains(event.target as Node)
229
+ ) {
230
+ isOpen = false;
231
+ }
232
+ };
233
+
234
+ const toggleDropdown = () => {
235
+ if (!isOpen) {
236
+ startEventListeners();
237
+ updatePosition();
238
+ isOpen = true;
239
+ } else {
240
+ stopEventListeners();
241
+ isOpen = false;
242
+ }
243
+ };
244
+
245
+ const updatePosition = () => {
246
+ if (!controlElement || !contentEl) return;
247
+
248
+ const rect = controlElement.getBoundingClientRect();
249
+ const windowHeight = window.innerHeight;
250
+ const contentHeight = contentEl.getBoundingClientRect().height;
251
+ const isBottomHalf = rect.top + rect.height / 2 > windowHeight / 2;
252
+
253
+ const top = isBottomHalf ? rect.top - contentHeight - 8 : rect.top + rect.height;
254
+ position = {
255
+ top: top,
256
+ left: rect.left + window.scrollX,
257
+ width: 'auto',
258
+ isBottomHalf
259
+ };
260
+ };
261
+
262
+ const startEventListeners = () => {
263
+ window.addEventListener('resize', updatePosition);
264
+ window.addEventListener('scroll', updatePosition, true);
265
+ document.addEventListener('click', handleClickOutside);
266
+ };
267
+
268
+ const stopEventListeners = () => {
269
+ window.removeEventListener('resize', updatePosition);
270
+ window.removeEventListener('scroll', updatePosition, true);
271
+ document.removeEventListener('click', handleClickOutside);
272
+ };
273
+
274
+ onMount(() => {
275
+ return () => stopEventListeners();
276
+ });
277
+ </script>
278
+
279
+ <div class={cn('field', className)}>
280
+ <input type="text" {name} value={formattedRange} hidden />
281
+
282
+ {#if !isFloatLabel && label}
283
+ <div class="field-label">{label}</div>
284
+ {/if}
285
+
286
+ <button
287
+ type="button"
288
+ bind:this={controlElement}
289
+ class={cn(
290
+ 'control',
291
+ colors[color],
292
+ variants[variant],
293
+ sizeClasses[size],
294
+ isFloatLabel && 'is-float',
295
+ (isActive || isFocused) && 'is-active'
296
+ )}
297
+ class:is-error={errorText}
298
+ onclick={toggleDropdown}
299
+ onmouseenter={() => (isActive = true)}
300
+ onmouseleave={() => (isActive = false)}
301
+ >
302
+ {#if isFloatLabel && label}
303
+ <span
304
+ class={cn(
305
+ 'control-label',
306
+ (isActive || isFocused || isLabelActive || isOpen || formattedRange !== '') && 'is-active'
307
+ )}
308
+ >
309
+ {label}
310
+ </span>
311
+ {/if}
312
+ <div class="control-selected">
313
+ {#if formattedRange}
314
+ {formattedRange}
315
+ {:else if isFloatLabel}
316
+ {#if isActive || isOpen}
317
+ {placeholder}
318
+ {/if}
319
+ {:else}
320
+ {placeholder}
321
+ {/if}
322
+ </div>
323
+ </button>
324
+
325
+ {#if errorText || helpText}
326
+ <div class={cn('field-help', errorText && 'is-error')}>{errorText || helpText}</div>
327
+ {/if}
328
+
329
+ <div class:is-active={isOpen} class="date-range-popover" {style} bind:this={contentEl}>
330
+ <div class="date-range-calendars">
331
+ <div class="date-range-calendar">
332
+ <div class="date-picker-header">
333
+ <IconButton
334
+ onclick={() => changeMonth('prev')}
335
+ icon={ArrowLeft24RegularIcon}
336
+ {color}
337
+ variant="ghost"
338
+ size="sm"
339
+ />
340
+
341
+ <span>{monthNameLeft} {currentYear}</span>
342
+
343
+ <div class="date-range-spacer"></div>
344
+ </div>
345
+ <div class="date-picker-weekdays">
346
+ {#each weekdays as weekday}
347
+ <div class="weekday">{weekday}</div>
348
+ {/each}
349
+ </div>
350
+ <div class="date-picker-days">
351
+ {#each daysLeft as day}
352
+ {#if day}
353
+ <button
354
+ class={cn('date-range-day-button', colors[color])}
355
+ class:today={isToday(day)}
356
+ class:is-start={isStartDate(day)}
357
+ class:is-end={isEndDate(day)}
358
+ class:is-in-range={isInRange(day)}
359
+ class:is-disabled={isDisabled(day)}
360
+ disabled={isDisabled(day)}
361
+ onclick={() => selectDate(day)}
362
+ onmouseenter={() => (hoverDate = day)}
363
+ onmouseleave={() => (hoverDate = null)}
364
+ type="button"
365
+ >
366
+ {day.getDate()}
367
+ </button>
368
+ {:else}
369
+ <div class="date-picker-empty-day"></div>
370
+ {/if}
371
+ {/each}
372
+ </div>
373
+ </div>
374
+
375
+ <div class="date-range-calendar">
376
+ <div class="date-picker-header">
377
+ <div class="date-range-spacer"></div>
378
+
379
+ <span>{monthNameRight} {nextMonthYear}</span>
380
+
381
+ <IconButton
382
+ onclick={() => changeMonth('next')}
383
+ icon={ArrowRight24RegularIcon}
384
+ {color}
385
+ variant="ghost"
386
+ size="sm"
387
+ />
388
+ </div>
389
+ <div class="date-picker-weekdays">
390
+ {#each weekdays as weekday}
391
+ <div class="weekday">{weekday}</div>
392
+ {/each}
393
+ </div>
394
+ <div class="date-picker-days">
395
+ {#each daysRight as day}
396
+ {#if day}
397
+ <button
398
+ class={cn('date-range-day-button', colors[color])}
399
+ class:today={isToday(day)}
400
+ class:is-start={isStartDate(day)}
401
+ class:is-end={isEndDate(day)}
402
+ class:is-in-range={isInRange(day)}
403
+ class:is-disabled={isDisabled(day)}
404
+ disabled={isDisabled(day)}
405
+ onclick={() => selectDate(day)}
406
+ onmouseenter={() => (hoverDate = day)}
407
+ onmouseleave={() => (hoverDate = null)}
408
+ type="button"
409
+ >
410
+ {day.getDate()}
411
+ </button>
412
+ {:else}
413
+ <div class="date-picker-empty-day"></div>
414
+ {/if}
415
+ {/each}
416
+ </div>
417
+ </div>
418
+ </div>
419
+
420
+ {#if startDate || endDate}
421
+ <div class="date-range-footer">
422
+ <span class="date-range-selection">
423
+ {#if startDate && !endDate}
424
+ {formatDate(startDate, { month: 'short', day: 'numeric', year: 'numeric' })} - Select end
425
+ date
426
+ {:else if startDate && endDate}
427
+ {formatDate(startDate, { month: 'short', day: 'numeric', year: 'numeric' })} - {formatDate(
428
+ endDate,
429
+ { month: 'short', day: 'numeric', year: 'numeric' }
430
+ )}
431
+ {/if}
432
+ </span>
433
+ </div>
434
+ {/if}
435
+ </div>
436
+ </div>
@@ -0,0 +1,24 @@
1
+ type Props = {
2
+ startDate?: Date | null;
3
+ endDate?: Date | null;
4
+ placeholder?: string;
5
+ onchange?: (range: {
6
+ start: Date | null;
7
+ end: Date | null;
8
+ }) => void;
9
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
10
+ variant?: 'solid' | 'soft' | 'outlined' | 'line';
11
+ size?: 'sm' | 'md' | 'lg';
12
+ name?: string;
13
+ class?: string;
14
+ label?: string;
15
+ isLabelActive?: boolean;
16
+ helpText?: string;
17
+ errorText?: string;
18
+ isFloatLabel?: boolean;
19
+ minDate?: Date | null;
20
+ maxDate?: Date | null;
21
+ };
22
+ declare const DateRange: import("svelte").Component<Props, {}, "startDate" | "endDate">;
23
+ type DateRange = ReturnType<typeof DateRange>;
24
+ export default DateRange;