tera-system-ui 0.1.64 → 0.1.66
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.
- package/dist/COMPONENT_API.md +2 -539
- package/dist/components/accordion/Accordion.d.ts +24 -0
- package/dist/components/accordion/Accordion.js +4 -0
- package/dist/components/accordion/components/Accordion.svelte +2 -8
- package/dist/components/accordion/components/AccordionContent.svelte +5 -12
- package/dist/components/accordion/components/AccordionItem.svelte +3 -9
- package/dist/components/accordion/components/AccordionTrigger.svelte +5 -15
- package/dist/components/ai/ChatBubble.svelte +35 -0
- package/dist/components/ai/ChatBubble.svelte.d.ts +12 -0
- package/dist/components/ai/PromptInput.svelte +58 -0
- package/dist/components/ai/PromptInput.svelte.d.ts +13 -0
- package/dist/components/ai/StreamText.svelte +41 -0
- package/dist/components/ai/StreamText.svelte.d.ts +11 -0
- package/dist/components/ai/SuggestionChips.svelte +34 -0
- package/dist/components/ai/SuggestionChips.svelte.d.ts +10 -0
- package/dist/components/ai/ThinkingLoader.svelte +34 -0
- package/dist/components/ai/ThinkingLoader.svelte.d.ts +11 -0
- package/dist/components/ai/index.d.ts +5 -0
- package/dist/components/ai/index.js +5 -0
- package/dist/components/alert/Alert.svelte +47 -0
- package/dist/components/alert/Alert.svelte.d.ts +15 -0
- package/dist/components/alert/index.d.ts +1 -0
- package/dist/components/alert/index.js +1 -0
- package/dist/components/avatar/Avatar.svelte +9 -25
- package/dist/components/badge/Badge.d.ts +52 -0
- package/dist/components/badge/Badge.js +22 -0
- package/dist/components/badge/Badge.svelte +22 -0
- package/dist/components/badge/Badge.svelte.d.ts +4 -0
- package/dist/components/badge/index.d.ts +2 -0
- package/dist/components/badge/index.js +1 -0
- package/dist/components/brand-logo/BrandLogo.svelte +12 -10
- package/dist/components/button/Button.d.ts +2 -2
- package/dist/components/button/Button.js +12 -12
- package/dist/components/button/Button.svelte +7 -34
- package/dist/components/card/Card.d.ts +68 -0
- package/dist/components/card/Card.js +28 -0
- package/dist/components/card/Card.svelte +33 -0
- package/dist/components/card/Card.svelte.d.ts +4 -0
- package/dist/components/card/index.d.ts +2 -0
- package/dist/components/card/index.js +1 -0
- package/dist/components/checkbox/Checkbox.d.ts +25 -4
- package/dist/components/checkbox/Checkbox.js +4 -0
- package/dist/components/checkbox/Checkbox.svelte +13 -16
- package/dist/components/checkbox/Checkbox.svelte.d.ts +2 -2
- package/dist/components/combobox/Combobox.d.ts +45 -9
- package/dist/components/combobox/Combobox.js +5 -7
- package/dist/components/combobox/Combobox.svelte +226 -8
- package/dist/components/combobox/Combobox.svelte.d.ts +2 -2
- package/dist/components/combobox/index.d.ts +1 -1
- package/dist/components/command/components/command-empty.svelte +3 -8
- package/dist/components/command/components/command-group.svelte +3 -13
- package/dist/components/command/components/command-input.svelte +5 -13
- package/dist/components/command/components/command-item.svelte +3 -9
- package/dist/components/command/components/command-link-item.svelte +3 -8
- package/dist/components/command/components/command-list.svelte +3 -8
- package/dist/components/command/components/command-separator.svelte +3 -8
- package/dist/components/command/components/command-shortcut.svelte +2 -10
- package/dist/components/command/components/command.svelte +29 -42
- package/dist/components/date-range-picker/DateRangePicker.svelte +490 -0
- package/dist/components/date-range-picker/DateRangePicker.svelte.d.ts +4 -0
- package/dist/components/date-range-picker/DateRangePicker.types.d.ts +38 -0
- package/dist/components/date-range-picker/DateRangePicker.types.js +1 -0
- package/dist/components/date-range-picker/index.d.ts +2 -0
- package/dist/components/date-range-picker/index.js +1 -0
- package/dist/components/dialog/Dialog.d.ts +43 -121
- package/dist/components/dialog/Dialog.js +1 -39
- package/dist/components/dialog/Dialog.svelte +103 -113
- package/dist/components/dialog/Dialog.svelte.d.ts +1 -2
- package/dist/components/dialog/dialog.scss +21 -24
- package/dist/components/drawer/Drawer.svelte +63 -0
- package/dist/components/drawer/Drawer.svelte.d.ts +16 -0
- package/dist/components/drawer/index.d.ts +1 -0
- package/dist/components/drawer/index.js +1 -0
- package/dist/components/dropdown-menu/DropdownMenu.d.ts +51 -24
- package/dist/components/dropdown-menu/DropdownMenu.js +1 -15
- package/dist/components/dropdown-menu/components/DropdownMenu.svelte +36 -34
- package/dist/components/dropdown-menu/components/DropdownMenu.svelte.d.ts +1 -1
- package/dist/components/dropdown-menu/components/DropdownMenuGroup.svelte +8 -12
- package/dist/components/dropdown-menu/components/DropdownMenuGroup.svelte.d.ts +2 -4
- package/dist/components/dropdown-menu/components/DropdownMenuHeader.svelte +11 -12
- package/dist/components/dropdown-menu/components/DropdownMenuHeader.svelte.d.ts +2 -4
- package/dist/components/dropdown-menu/components/DropdownMenuItem.svelte +27 -30
- package/dist/components/dropdown-menu/components/DropdownMenuItem.svelte.d.ts +1 -1
- package/dist/components/dropdown-menu/components/DropdownMenuSeparator.svelte +9 -11
- package/dist/components/dropdown-menu/components/DropdownMenuSeparator.svelte.d.ts +2 -4
- package/dist/components/fonts/TeraFontMono.svelte +4 -4
- package/dist/components/fonts/TeraFontMono.svelte.d.ts +1 -0
- package/dist/components/fonts/TeraFontSansSerif.svelte +4 -4
- package/dist/components/fonts/TeraFontSansSerif.svelte.d.ts +1 -1
- package/dist/components/header/Header.svelte +6 -9
- package/dist/components/header/header.scss +1 -1
- package/dist/components/icons/IconArrowBigRightFilled.svelte +3 -7
- package/dist/components/icons/IconBook.svelte +3 -6
- package/dist/components/icons/IconBookmarkPlus.svelte +3 -6
- package/dist/components/icons/IconCalculator.svelte +3 -6
- package/dist/components/icons/IconCheck.svelte +3 -6
- package/dist/components/icons/IconChevronDown.svelte +3 -6
- package/dist/components/icons/IconCoin.svelte +3 -6
- package/dist/components/icons/IconCoinConvert.svelte +2 -5
- package/dist/components/icons/IconCopy.svelte +3 -6
- package/dist/components/icons/IconCopyCheckFilled.svelte +3 -6
- package/dist/components/icons/IconHamburger.svelte +3 -6
- package/dist/components/icons/IconLanguage.svelte +3 -6
- package/dist/components/icons/IconLoader2.svelte +3 -6
- package/dist/components/icons/IconLogout.svelte +3 -6
- package/dist/components/icons/IconMoon.svelte +3 -6
- package/dist/components/icons/IconPointFilled.svelte +3 -6
- package/dist/components/icons/IconSearch.svelte +3 -6
- package/dist/components/icons/IconSettings.svelte +3 -6
- package/dist/components/icons/IconSun.svelte +3 -6
- package/dist/components/icons/IconSwitchHorizontal.svelte +3 -6
- package/dist/components/icons/IconSwitchVertical.svelte +3 -6
- package/dist/components/icons/IconTransform.svelte +3 -6
- package/dist/components/icons/IconX.svelte +3 -6
- package/dist/components/input/Input.d.ts +2 -2
- package/dist/components/input/Input.js +10 -10
- package/dist/components/input/Input.svelte +10 -26
- package/dist/components/label/Label.d.ts +2 -2
- package/dist/components/label/Label.js +2 -2
- package/dist/components/label/Label.svelte +4 -12
- package/dist/components/language-picker-button/LanguagePickerButton.svelte +23 -42
- package/dist/components/light-dark-toggle/LightDarkToggle.svelte +21 -26
- package/dist/components/marketing/FeatureCard.svelte +37 -0
- package/dist/components/marketing/FeatureCard.svelte.d.ts +13 -0
- package/dist/components/marketing/PricingCard.svelte +48 -0
- package/dist/components/marketing/PricingCard.svelte.d.ts +15 -0
- package/dist/components/marketing/StatBlock.svelte +14 -0
- package/dist/components/marketing/StatBlock.svelte.d.ts +10 -0
- package/dist/components/marketing/TestimonialCard.svelte +24 -0
- package/dist/components/marketing/TestimonialCard.svelte.d.ts +12 -0
- package/dist/components/marketing/index.d.ts +4 -0
- package/dist/components/marketing/index.js +4 -0
- package/dist/components/popover/Popover.d.ts +32 -13
- package/dist/components/popover/Popover.js +1 -7
- package/dist/components/popover/Popover.svelte +40 -158
- package/dist/components/popover/Popover.svelte.d.ts +2 -2
- package/dist/components/popover-responsive/PopoverResponsive.d.ts +18 -7
- package/dist/components/popover-responsive/PopoverResponsive.js +1 -7
- package/dist/components/popover-responsive/PopoverResponsive.svelte +25 -87
- package/dist/components/popover-responsive/PopoverResponsive.svelte.d.ts +2 -11
- package/dist/components/select/Select.d.ts +60 -23
- package/dist/components/select/Select.js +14 -35
- package/dist/components/select/Select.svelte +157 -28
- package/dist/components/select/Select.svelte.d.ts +2 -3
- package/dist/components/select/index.d.ts +1 -1
- package/dist/components/side-navigation/SideNavigation.svelte +73 -96
- package/dist/components/side-navigation/SideNavigationItem.svelte +2 -2
- package/dist/components/side-navigation/SideNavigationLayout.svelte +3 -5
- package/dist/components/side-navigation/sidenav.scss +17 -13
- package/dist/components/skeleton/Skeleton.svelte +48 -0
- package/dist/components/skeleton/Skeleton.svelte.d.ts +12 -0
- package/dist/components/skeleton/index.d.ts +1 -0
- package/dist/components/skeleton/index.js +1 -0
- package/dist/components/slider/Slider.d.ts +25 -15
- package/dist/components/slider/Slider.js +1 -7
- package/dist/components/slider/Slider.svelte +38 -164
- package/dist/components/slider/Slider.svelte.d.ts +1 -1
- package/dist/components/spinner/Spinner.svelte +39 -0
- package/dist/components/spinner/Spinner.svelte.d.ts +10 -0
- package/dist/components/spinner/index.d.ts +1 -0
- package/dist/components/spinner/index.js +1 -0
- package/dist/components/star-rating/StarRating.svelte +33 -49
- package/dist/components/switch/Switch.d.ts +19 -4
- package/dist/components/switch/Switch.js +4 -0
- package/dist/components/switch/Switch.svelte +13 -17
- package/dist/components/switch/Switch.svelte.d.ts +2 -2
- package/dist/components/table/Table.svelte +68 -0
- package/dist/components/table/Table.svelte.d.ts +40 -0
- package/dist/components/table/index.d.ts +1 -0
- package/dist/components/table/index.js +1 -0
- package/dist/components/tabs/Tabs.svelte.d.ts +45 -16
- package/dist/components/tabs/Tabs.svelte.js +8 -18
- package/dist/components/tabs/components/Tabs.svelte +27 -33
- package/dist/components/tabs/components/Tabs.svelte.d.ts +1 -1
- package/dist/components/tabs/components/TabsContent.svelte +13 -36
- package/dist/components/tabs/components/TabsContent.svelte.d.ts +2 -5
- package/dist/components/tabs/components/TabsItem.svelte +43 -32
- package/dist/components/tabs/components/TabsItem.svelte.d.ts +2 -5
- package/dist/components/tabs/components/TabsList.svelte +90 -58
- package/dist/components/tabs/components/TabsList.svelte.d.ts +2 -4
- package/dist/components/tera-ui-context/TeraUiContext.svelte +13 -26
- package/dist/components/text-area/TextArea.d.ts +2 -2
- package/dist/components/text-area/TextArea.js +9 -9
- package/dist/components/text-area/TextArea.svelte +41 -65
- package/dist/components/toast/ToastContainer.svelte +50 -0
- package/dist/components/toast/ToastContainer.svelte.d.ts +18 -0
- package/dist/components/toast/index.d.ts +3 -0
- package/dist/components/toast/index.js +2 -0
- package/dist/components/toast/toast.svelte.d.ts +22 -0
- package/dist/components/toast/toast.svelte.js +18 -0
- package/dist/components/tooltip/Tooltip.d.ts +23 -0
- package/dist/components/tooltip/Tooltip.js +1 -0
- package/dist/components/tooltip/Tooltip.svelte +30 -0
- package/dist/components/tooltip/Tooltip.svelte.d.ts +4 -0
- package/dist/components/tooltip/index.d.ts +2 -0
- package/dist/components/tooltip/index.js +1 -0
- package/dist/components/user-avatar-with-menu/UserAvatarWithMenu.svelte +48 -69
- package/dist/index.d.ts +19 -2
- package/dist/index.js +12 -0
- package/dist/llms/accordion.md +90 -0
- package/dist/llms/ai.md +110 -0
- package/dist/llms/alert.md +29 -0
- package/dist/llms/avatar.md +34 -0
- package/dist/llms/badge.md +31 -0
- package/dist/llms/brand-logo.md +30 -0
- package/dist/llms/button.md +37 -0
- package/dist/llms/card.md +32 -0
- package/dist/llms/checkbox.md +35 -0
- package/dist/llms/colors.md +161 -0
- package/dist/llms/combobox.md +40 -0
- package/dist/llms/command.md +7 -0
- package/dist/llms/date-range-picker.md +36 -0
- package/dist/llms/dialog.md +45 -0
- package/dist/llms/drawer.md +30 -0
- package/dist/llms/dropdown-menu.md +112 -0
- package/dist/llms/fonts.md +7 -0
- package/dist/llms/header.md +26 -0
- package/dist/llms/icons.md +43 -0
- package/dist/llms/index.md +65 -0
- package/dist/llms/input.md +37 -0
- package/dist/llms/label.md +30 -0
- package/dist/llms/language-picker-button.md +30 -0
- package/dist/llms/light-dark-toggle.md +26 -0
- package/dist/llms/marketing.md +95 -0
- package/dist/llms/popover-responsive.md +32 -0
- package/dist/llms/popover.md +40 -0
- package/dist/llms/select.md +44 -0
- package/dist/llms/side-navigation.md +30 -0
- package/dist/llms/skeleton.md +28 -0
- package/dist/llms/slider.md +36 -0
- package/dist/llms/spinner.md +25 -0
- package/dist/llms/star-rating.md +31 -0
- package/dist/llms/switch.md +33 -0
- package/dist/llms/table.md +30 -0
- package/dist/llms/tabs.md +92 -0
- package/dist/llms/tera-ui-context.md +30 -0
- package/dist/llms/text-area.md +39 -0
- package/dist/llms/toast.md +7 -0
- package/dist/llms/tooltip.md +32 -0
- package/dist/llms/user-avatar-with-menu.md +28 -0
- package/dist/paraglide/README.md +72 -3
- package/dist/paraglide/messages/text_account_settings.d.ts +14 -2
- package/dist/paraglide/messages/text_account_settings.js +53 -58
- package/dist/paraglide/messages/text_calces_documentation.d.ts +14 -2
- package/dist/paraglide/messages/text_calces_documentation.js +53 -58
- package/dist/paraglide/messages/text_calces_scientific_calculator.d.ts +14 -2
- package/dist/paraglide/messages/text_calces_scientific_calculator.js +53 -58
- package/dist/paraglide/messages/text_currency_converter.d.ts +14 -2
- package/dist/paraglide/messages/text_currency_converter.js +53 -58
- package/dist/paraglide/messages/text_logout.d.ts +14 -2
- package/dist/paraglide/messages/text_logout.js +53 -58
- package/dist/paraglide/messages/text_select_language.d.ts +14 -2
- package/dist/paraglide/messages/text_select_language.js +53 -58
- package/dist/paraglide/messages/text_unit_converter.d.ts +14 -2
- package/dist/paraglide/messages/text_unit_converter.js +53 -58
- package/dist/paraglide/registry.d.ts +13 -0
- package/dist/paraglide/registry.js +15 -0
- package/dist/paraglide/runtime.d.ts +243 -126
- package/dist/paraglide/runtime.js +473 -148
- package/dist/paraglide/server.d.ts +13 -20
- package/dist/paraglide/server.js +92 -40
- package/dist/stories/ComponentOverview.stories.svelte +533 -0
- package/dist/stories/ComponentOverview.stories.svelte.d.ts +6 -0
- package/dist/themes/tera-ui-base.css +242 -77
- package/dist/themes/theme-ai.css +100 -0
- package/dist/themes/theme-marketing.css +91 -0
- package/dist/themes/theme-professional.css +41 -0
- package/package.json +35 -29
- package/dist/tera-i18n/projects/tera-system-ui/project.inlang/.meta.json +0 -3
- package/dist/tera-i18n/projects/tera-system-ui/project.inlang/README.md +0 -103
- package/dist/tera-i18n/projects/tera-system-ui/project.inlang/project_id +0 -1
- package/dist/themes/tw-preset.cjs +0 -160
- package/dist/themes/tw-preset.d.cts +0 -157
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
<script lang="ts">import { DateRangeField, Popover as PopoverPrimitive, RangeCalendar as CalendarPrimitive } from 'bits-ui';
|
|
2
|
+
import { CalendarDate } from '@internationalized/date';
|
|
3
|
+
import IconCalendar from "@tabler/icons-svelte/icons/calendar";
|
|
4
|
+
import IconChevronLeft from "@tabler/icons-svelte/icons/chevron-left";
|
|
5
|
+
import IconChevronRight from "@tabler/icons-svelte/icons/chevron-right";
|
|
6
|
+
import { IconX } from '../icons/index.js';
|
|
7
|
+
import { cn } from '../../utils/utils.js';
|
|
8
|
+
import { untrack } from 'svelte';
|
|
9
|
+
import { innerWidth } from 'svelte/reactivity/window';
|
|
10
|
+
import { Dialog } from '../dialog/index.js';
|
|
11
|
+
let { dateRange = $bindable([]), onchange, enableTime = false, placeholder = 'Select date range', disabled = false, class: className, minValue, maxValue, isDateDisabled, numberOfMonths: numberOfMonthsProp, weekStartsOn, } = $props();
|
|
12
|
+
const isDesktop = $derived((innerWidth.current ?? 768) >= 768);
|
|
13
|
+
let open = $state(false);
|
|
14
|
+
// ── Date-field value: drives DateRangeField segments ──────────────────
|
|
15
|
+
function toCalendarDate(date) {
|
|
16
|
+
return new CalendarDate(date.getFullYear(), date.getMonth() + 1, date.getDate());
|
|
17
|
+
}
|
|
18
|
+
function fromCalendarDate(date, timeStr) {
|
|
19
|
+
const [h, m] = timeStr.split(':').map(Number);
|
|
20
|
+
return new Date(date.year, date.month - 1, date.day, h, m);
|
|
21
|
+
}
|
|
22
|
+
const [initD0, initD1] = dateRange;
|
|
23
|
+
let fieldValue = $state({
|
|
24
|
+
start: initD0 ? toCalendarDate(initD0) : undefined,
|
|
25
|
+
end: initD1 ? toCalendarDate(initD1) : undefined,
|
|
26
|
+
});
|
|
27
|
+
// ── Pending: temporary calendar state while picker is open ────────────
|
|
28
|
+
let pendingRange = $state({ start: undefined, end: undefined });
|
|
29
|
+
let startTime = $state('00:00');
|
|
30
|
+
let endTime = $state('23:59');
|
|
31
|
+
// Derived: highlight whichever quick-select preset matches the current
|
|
32
|
+
// pendingRange (works for manual picks, quick-select clicks, and pre-set values).
|
|
33
|
+
const activeQuickSelect = $derived.by(() => {
|
|
34
|
+
if (!pendingRange.start || !pendingRange.end)
|
|
35
|
+
return null;
|
|
36
|
+
const ps = pendingRange.start;
|
|
37
|
+
const pe = pendingRange.end;
|
|
38
|
+
for (const { key } of quickRanges) {
|
|
39
|
+
const { start, end } = getQuickRange(key);
|
|
40
|
+
if (ps.compare(toCalendarDate(start)) === 0 &&
|
|
41
|
+
pe.compare(toCalendarDate(end)) === 0) {
|
|
42
|
+
return key;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
});
|
|
47
|
+
const hasRange = $derived(dateRange.length >= 2);
|
|
48
|
+
const canApply = $derived(!!pendingRange.start && !!pendingRange.end);
|
|
49
|
+
// ── Field direct-edit handler ─────────────────────────────────────────
|
|
50
|
+
function handleFieldChange(range) {
|
|
51
|
+
if (!range)
|
|
52
|
+
return;
|
|
53
|
+
fieldValue = range;
|
|
54
|
+
if (range.start && range.end) {
|
|
55
|
+
const result = [
|
|
56
|
+
fromCalendarDate(range.start, enableTime ? startTime : '00:00'),
|
|
57
|
+
fromCalendarDate(range.end, enableTime ? endTime : '23:59'),
|
|
58
|
+
];
|
|
59
|
+
dateRange = result;
|
|
60
|
+
onchange?.(result);
|
|
61
|
+
}
|
|
62
|
+
else if (!range.start && !range.end && dateRange.length > 0) {
|
|
63
|
+
dateRange = [];
|
|
64
|
+
onchange?.([]);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// ── Picker open: copy fieldValue → pendingRange ───────────────────────
|
|
68
|
+
function initPendingState() {
|
|
69
|
+
pendingRange = { start: fieldValue.start, end: fieldValue.end };
|
|
70
|
+
const [d0, d1] = dateRange;
|
|
71
|
+
if (enableTime && d0 && d1) {
|
|
72
|
+
const sh = d0.getHours(), sm = d0.getMinutes();
|
|
73
|
+
const eh = d1.getHours(), em = d1.getMinutes();
|
|
74
|
+
startTime = `${String(sh).padStart(2, '0')}:${String(sm).padStart(2, '0')}`;
|
|
75
|
+
endTime = `${String(eh).padStart(2, '0')}:${String(em).padStart(2, '0')}`;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
startTime = '00:00';
|
|
79
|
+
endTime = '23:59';
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
$effect(() => {
|
|
83
|
+
if (open)
|
|
84
|
+
untrack(initPendingState);
|
|
85
|
+
});
|
|
86
|
+
// ── Apply / Reset ─────────────────────────────────────────────────────
|
|
87
|
+
function applyRange() {
|
|
88
|
+
if (!pendingRange.start || !pendingRange.end)
|
|
89
|
+
return;
|
|
90
|
+
const start = pendingRange.start;
|
|
91
|
+
const end = pendingRange.end;
|
|
92
|
+
fieldValue = { start, end };
|
|
93
|
+
const result = [
|
|
94
|
+
fromCalendarDate(start, enableTime ? startTime : '00:00'),
|
|
95
|
+
fromCalendarDate(end, enableTime ? endTime : '23:59'),
|
|
96
|
+
];
|
|
97
|
+
dateRange = result;
|
|
98
|
+
onchange?.(result);
|
|
99
|
+
open = false;
|
|
100
|
+
}
|
|
101
|
+
function resetRange() {
|
|
102
|
+
fieldValue = { start: undefined, end: undefined };
|
|
103
|
+
dateRange = [];
|
|
104
|
+
onchange?.([]);
|
|
105
|
+
open = false;
|
|
106
|
+
}
|
|
107
|
+
// ── Quick select ──────────────────────────────────────────────────────
|
|
108
|
+
function applyQuickSelect(key) {
|
|
109
|
+
const { start, end } = getQuickRange(key);
|
|
110
|
+
pendingRange = { start: toCalendarDate(start), end: toCalendarDate(end) };
|
|
111
|
+
}
|
|
112
|
+
function getQuickRange(key) {
|
|
113
|
+
const now = new Date();
|
|
114
|
+
const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
|
115
|
+
switch (key) {
|
|
116
|
+
case 'today':
|
|
117
|
+
return { start: new Date(today), end: new Date(today) };
|
|
118
|
+
case 'yesterday': {
|
|
119
|
+
const y = new Date(today);
|
|
120
|
+
y.setDate(today.getDate() - 1);
|
|
121
|
+
return { start: y, end: new Date(y) };
|
|
122
|
+
}
|
|
123
|
+
case 'thisWeek': {
|
|
124
|
+
const dow = today.getDay();
|
|
125
|
+
const mon = new Date(today);
|
|
126
|
+
mon.setDate(today.getDate() - (dow === 0 ? 6 : dow - 1));
|
|
127
|
+
return { start: mon, end: new Date(today) };
|
|
128
|
+
}
|
|
129
|
+
case 'last7': {
|
|
130
|
+
const s = new Date(today);
|
|
131
|
+
s.setDate(today.getDate() - 6);
|
|
132
|
+
return { start: s, end: new Date(today) };
|
|
133
|
+
}
|
|
134
|
+
case 'last30': {
|
|
135
|
+
const s = new Date(today);
|
|
136
|
+
s.setDate(today.getDate() - 29);
|
|
137
|
+
return { start: s, end: new Date(today) };
|
|
138
|
+
}
|
|
139
|
+
case 'thisMonth':
|
|
140
|
+
return {
|
|
141
|
+
start: new Date(today.getFullYear(), today.getMonth(), 1),
|
|
142
|
+
end: new Date(today.getFullYear(), today.getMonth() + 1, 0)
|
|
143
|
+
};
|
|
144
|
+
case 'lastMonth':
|
|
145
|
+
return {
|
|
146
|
+
start: new Date(today.getFullYear(), today.getMonth() - 1, 1),
|
|
147
|
+
end: new Date(today.getFullYear(), today.getMonth(), 0)
|
|
148
|
+
};
|
|
149
|
+
case 'thisQuarter': {
|
|
150
|
+
const q = Math.floor(today.getMonth() / 3);
|
|
151
|
+
return {
|
|
152
|
+
start: new Date(today.getFullYear(), q * 3, 1),
|
|
153
|
+
end: new Date(today.getFullYear(), q * 3 + 3, 0)
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
case 'last3Months':
|
|
157
|
+
return {
|
|
158
|
+
start: new Date(today.getFullYear(), today.getMonth() - 3, today.getDate()),
|
|
159
|
+
end: new Date(today)
|
|
160
|
+
};
|
|
161
|
+
default:
|
|
162
|
+
return { start: new Date(today), end: new Date(today) };
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const quickRanges = [
|
|
166
|
+
{ key: 'today', label: 'Today' },
|
|
167
|
+
{ key: 'yesterday', label: 'Yesterday' },
|
|
168
|
+
{ key: 'thisWeek', label: 'This week' },
|
|
169
|
+
{ key: 'last7', label: 'Last 7 days' },
|
|
170
|
+
{ key: 'last30', label: 'Last 30 days' },
|
|
171
|
+
{ key: 'thisMonth', label: 'This month' },
|
|
172
|
+
{ key: 'lastMonth', label: 'Last month' },
|
|
173
|
+
{ key: 'thisQuarter', label: 'This quarter' },
|
|
174
|
+
{ key: 'last3Months', label: 'Last 3 months' },
|
|
175
|
+
];
|
|
176
|
+
// ── Styles ────────────────────────────────────────────────────────────
|
|
177
|
+
const triggerStyles = $derived(cn('inline-flex items-center gap-2 h-9 px-3 rounded-md text-sm w-full', 'border border-border-default bg-surface-control', 'focus-within:border-interactive-hover focus-within:shadow-focus', 'data-[state=open]:border-interactive-hover data-[state=open]:shadow-focus', 'transition-[border-color,box-shadow] ease-ui duration-150', 'cursor-text', disabled && 'opacity-50 pointer-events-none'));
|
|
178
|
+
const iconBtnStyles = cn('inline-flex items-center justify-center size-6 rounded shrink-0 cursor-pointer', 'text-text-tertiary hover:bg-surface-hover hover:text-text-primary', 'transition-colors ease-ui duration-100');
|
|
179
|
+
const segmentStyles = cn('inline-block rounded-sm px-0.5 text-sm tabular-nums caret-transparent select-none outline-none', 'text-text-primary', 'data-[placeholder]:text-text-tertiary', 'focus:bg-primary-100 focus:text-primary-700 dark:focus:bg-primary-950 dark:focus:text-primary-300');
|
|
180
|
+
const dayStyles = cn('inline-flex items-center justify-center size-full rounded-md text-sm cursor-pointer select-none', 'transition-colors ease-ui duration-100', 'hover:bg-surface-hover text-text-primary', 'data-[outside-month]:opacity-0 data-[outside-month]:pointer-events-none', 'data-[today]:ring-1 data-[today]:ring-inset data-[today]:ring-border-default', 'data-[selected]:bg-primary-600 data-[selected]:text-white data-[selected]:hover:bg-primary-500 data-[selected]:ring-0', 'data-[range-middle]:bg-primary-100 data-[range-middle]:text-primary-700 data-[range-middle]:rounded-none data-[range-middle]:hover:bg-primary-200', 'dark:data-[range-middle]:bg-primary-950 dark:data-[range-middle]:text-primary-300 dark:data-[range-middle]:hover:bg-primary-900', 'data-[range-start]:rounded-r-none', 'data-[range-end]:rounded-l-none', 'data-[disabled]:opacity-30 data-[disabled]:pointer-events-none', 'data-[unavailable]:opacity-30 data-[unavailable]:pointer-events-none');
|
|
181
|
+
const popoverContentStyles = cn('z-50 overflow-hidden bg-surface rounded-container border border-border-default shadow-lg', 'animate-in fade-in zoom-in-95 duration-150', 'data-[state=closed]:animate-out data-[state=closed]:fade-out data-[state=closed]:zoom-out-95');
|
|
182
|
+
</script>
|
|
183
|
+
|
|
184
|
+
<!-- ─── Shared snippets ──────────────────────────────────────────────────── -->
|
|
185
|
+
|
|
186
|
+
{#snippet dateField()}
|
|
187
|
+
<DateRangeField.Root
|
|
188
|
+
bind:value={fieldValue}
|
|
189
|
+
onValueChange={handleFieldChange}
|
|
190
|
+
{disabled}
|
|
191
|
+
class="drp-field flex items-center gap-0.5 min-w-0 flex-1"
|
|
192
|
+
>
|
|
193
|
+
<DateRangeField.Input type="start" class="flex items-center gap-0">
|
|
194
|
+
{#snippet children({segments})}
|
|
195
|
+
{#each segments as {part, value}, si (si)}
|
|
196
|
+
{#if part === 'literal'}
|
|
197
|
+
<span class="text-text-tertiary text-sm select-none">{value}</span>
|
|
198
|
+
{:else}
|
|
199
|
+
<DateRangeField.Segment {part} class={segmentStyles}>{value}</DateRangeField.Segment>
|
|
200
|
+
{/if}
|
|
201
|
+
{/each}
|
|
202
|
+
{/snippet}
|
|
203
|
+
</DateRangeField.Input>
|
|
204
|
+
|
|
205
|
+
<span class="text-text-tertiary text-sm mx-1.5 select-none shrink-0">–</span>
|
|
206
|
+
|
|
207
|
+
<DateRangeField.Input type="end" class="flex items-center gap-0">
|
|
208
|
+
{#snippet children({segments})}
|
|
209
|
+
{#each segments as {part, value}, si (si)}
|
|
210
|
+
{#if part === 'literal'}
|
|
211
|
+
<span class="text-text-tertiary text-sm select-none">{value}</span>
|
|
212
|
+
{:else}
|
|
213
|
+
<DateRangeField.Segment {part} class={segmentStyles}>{value}</DateRangeField.Segment>
|
|
214
|
+
{/if}
|
|
215
|
+
{/each}
|
|
216
|
+
{/snippet}
|
|
217
|
+
</DateRangeField.Input>
|
|
218
|
+
</DateRangeField.Root>
|
|
219
|
+
{/snippet}
|
|
220
|
+
|
|
221
|
+
{#snippet calendarGrid(numberOfMonths: number)}
|
|
222
|
+
<CalendarPrimitive.Root
|
|
223
|
+
bind:value={pendingRange}
|
|
224
|
+
{numberOfMonths}
|
|
225
|
+
weekdayFormat="short"
|
|
226
|
+
fixedWeeks
|
|
227
|
+
{minValue}
|
|
228
|
+
{maxValue}
|
|
229
|
+
isDateDisabled={isDateDisabled ? (d) => isDateDisabled(d as CalendarDate) : undefined}
|
|
230
|
+
weekStartsOn={weekStartsOn}
|
|
231
|
+
>
|
|
232
|
+
{#snippet children({months, weekdays})}
|
|
233
|
+
<div class={cn('flex justify-center', numberOfMonths > 1 && 'gap-6')}>
|
|
234
|
+
{#each months as month, i (month.value.toString())}
|
|
235
|
+
<div class="flex flex-col gap-2">
|
|
236
|
+
<!-- Month heading -->
|
|
237
|
+
<div class="flex items-center justify-between gap-2">
|
|
238
|
+
{#if i === 0}
|
|
239
|
+
<CalendarPrimitive.PrevButton
|
|
240
|
+
class="inline-flex items-center justify-center size-7 rounded-md text-text-tertiary
|
|
241
|
+
hover:bg-surface-hover hover:text-text-primary
|
|
242
|
+
transition-colors ease-ui duration-100
|
|
243
|
+
disabled:opacity-30 disabled:pointer-events-none"
|
|
244
|
+
>
|
|
245
|
+
<IconChevronLeft class="size-4"/>
|
|
246
|
+
</CalendarPrimitive.PrevButton>
|
|
247
|
+
{:else}
|
|
248
|
+
<div class="size-7 shrink-0"></div>
|
|
249
|
+
{/if}
|
|
250
|
+
|
|
251
|
+
<span class="text-sm font-medium text-text-primary whitespace-nowrap">
|
|
252
|
+
{new Date(month.value.year, month.value.month - 1)
|
|
253
|
+
.toLocaleDateString('en-US', {month: 'long', year: 'numeric'})}
|
|
254
|
+
</span>
|
|
255
|
+
|
|
256
|
+
{#if i === months.length - 1}
|
|
257
|
+
<CalendarPrimitive.NextButton
|
|
258
|
+
class="inline-flex items-center justify-center size-7 rounded-md text-text-tertiary
|
|
259
|
+
hover:bg-surface-hover hover:text-text-primary
|
|
260
|
+
transition-colors ease-ui duration-100
|
|
261
|
+
disabled:opacity-30 disabled:pointer-events-none"
|
|
262
|
+
>
|
|
263
|
+
<IconChevronRight class="size-4"/>
|
|
264
|
+
</CalendarPrimitive.NextButton>
|
|
265
|
+
{:else}
|
|
266
|
+
<div class="size-7 shrink-0"></div>
|
|
267
|
+
{/if}
|
|
268
|
+
</div>
|
|
269
|
+
|
|
270
|
+
<!-- Grid -->
|
|
271
|
+
<CalendarPrimitive.Grid class="w-full border-collapse">
|
|
272
|
+
<CalendarPrimitive.GridHead>
|
|
273
|
+
<CalendarPrimitive.GridRow class="flex">
|
|
274
|
+
{#each weekdays as day (day)}
|
|
275
|
+
<CalendarPrimitive.HeadCell
|
|
276
|
+
class="w-9 h-8 text-xs font-medium text-text-tertiary flex items-center justify-center"
|
|
277
|
+
>
|
|
278
|
+
{day}
|
|
279
|
+
</CalendarPrimitive.HeadCell>
|
|
280
|
+
{/each}
|
|
281
|
+
</CalendarPrimitive.GridRow>
|
|
282
|
+
</CalendarPrimitive.GridHead>
|
|
283
|
+
<CalendarPrimitive.GridBody>
|
|
284
|
+
{#each month.weeks as weekDates, wi (wi)}
|
|
285
|
+
<CalendarPrimitive.GridRow class="flex mt-0.5">
|
|
286
|
+
{#each weekDates as date (date.toString())}
|
|
287
|
+
<CalendarPrimitive.Cell
|
|
288
|
+
{date}
|
|
289
|
+
month={month.value}
|
|
290
|
+
class="relative size-9 p-0 text-center"
|
|
291
|
+
>
|
|
292
|
+
<CalendarPrimitive.Day class={dayStyles}/>
|
|
293
|
+
</CalendarPrimitive.Cell>
|
|
294
|
+
{/each}
|
|
295
|
+
</CalendarPrimitive.GridRow>
|
|
296
|
+
{/each}
|
|
297
|
+
</CalendarPrimitive.GridBody>
|
|
298
|
+
</CalendarPrimitive.Grid>
|
|
299
|
+
</div>
|
|
300
|
+
{/each}
|
|
301
|
+
</div>
|
|
302
|
+
{/snippet}
|
|
303
|
+
</CalendarPrimitive.Root>
|
|
304
|
+
{/snippet}
|
|
305
|
+
|
|
306
|
+
{#snippet timePickers()}
|
|
307
|
+
<div class="border-t border-border-default px-4 py-3 flex items-center gap-2">
|
|
308
|
+
<span class="text-xs font-medium text-text-tertiary w-9 shrink-0">Start</span>
|
|
309
|
+
<input
|
|
310
|
+
type="time"
|
|
311
|
+
bind:value={startTime}
|
|
312
|
+
class="h-7 px-2 text-sm text-text-primary border border-border-default rounded-md bg-surface-control
|
|
313
|
+
focus:border-interactive-hover focus:shadow-focus outline-none
|
|
314
|
+
transition-[border-color,box-shadow] ease-ui duration-150"
|
|
315
|
+
/>
|
|
316
|
+
<span class="text-text-tertiary mx-1 shrink-0">→</span>
|
|
317
|
+
<span class="text-xs font-medium text-text-tertiary w-6 shrink-0">End</span>
|
|
318
|
+
<input
|
|
319
|
+
type="time"
|
|
320
|
+
bind:value={endTime}
|
|
321
|
+
class="h-7 px-2 text-sm text-text-primary border border-border-default rounded-md bg-surface-control
|
|
322
|
+
focus:border-interactive-hover focus:shadow-focus outline-none
|
|
323
|
+
transition-[border-color,box-shadow] ease-ui duration-150"
|
|
324
|
+
/>
|
|
325
|
+
</div>
|
|
326
|
+
{/snippet}
|
|
327
|
+
|
|
328
|
+
{#snippet pickerFooter()}
|
|
329
|
+
<div class="border-t border-border-default px-4 py-3 flex items-center justify-between gap-3">
|
|
330
|
+
<button
|
|
331
|
+
class="inline-flex items-center h-8 px-3 text-sm rounded-md cursor-pointer
|
|
332
|
+
border border-border-default bg-surface-control text-text-primary
|
|
333
|
+
hover:text-interactive-hover hover:border-interactive-hover
|
|
334
|
+
transition-[border-color,color] ease-ui duration-150"
|
|
335
|
+
onclick={resetRange}
|
|
336
|
+
>
|
|
337
|
+
Reset
|
|
338
|
+
</button>
|
|
339
|
+
<button
|
|
340
|
+
disabled={!canApply}
|
|
341
|
+
class="inline-flex items-center h-8 px-4 text-sm rounded-md cursor-pointer
|
|
342
|
+
bg-primary-600 text-white border border-primary-600
|
|
343
|
+
hover:bg-primary-500 hover:border-primary-500
|
|
344
|
+
disabled:opacity-40 disabled:cursor-not-allowed disabled:pointer-events-none
|
|
345
|
+
transition-[background-color,border-color,opacity] ease-ui duration-150"
|
|
346
|
+
onclick={applyRange}
|
|
347
|
+
>
|
|
348
|
+
Apply
|
|
349
|
+
</button>
|
|
350
|
+
</div>
|
|
351
|
+
{/snippet}
|
|
352
|
+
|
|
353
|
+
<!-- ─── Root ─────────────────────────────────────────────────────────────── -->
|
|
354
|
+
|
|
355
|
+
<div class={cn('inline-flex w-full', className)}>
|
|
356
|
+
{#if isDesktop}
|
|
357
|
+
<!-- ── DESKTOP: Popover anchored to the whole trigger container ── -->
|
|
358
|
+
<PopoverPrimitive.Root bind:open>
|
|
359
|
+
<PopoverPrimitive.Trigger class={triggerStyles}>
|
|
360
|
+
{#snippet child({props: triggerProps})}
|
|
361
|
+
<!--
|
|
362
|
+
Intercept clicks: only toggle the popover when clicking
|
|
363
|
+
outside the date-field area (calendar icon, empty space).
|
|
364
|
+
-->
|
|
365
|
+
<div
|
|
366
|
+
{...triggerProps}
|
|
367
|
+
onclick={(e) => {
|
|
368
|
+
if (!(e.target as HTMLElement).closest('.drp-field')) {
|
|
369
|
+
(triggerProps.onclick as EventListener | undefined)?.(e);
|
|
370
|
+
}
|
|
371
|
+
}}
|
|
372
|
+
class={triggerStyles}
|
|
373
|
+
>
|
|
374
|
+
{@render dateField()}
|
|
375
|
+
|
|
376
|
+
<div class="flex items-center gap-1 shrink-0 ml-1">
|
|
377
|
+
<IconCalendar class="size-4 text-text-tertiary pointer-events-none"/>
|
|
378
|
+
{#if hasRange}
|
|
379
|
+
<button
|
|
380
|
+
type="button"
|
|
381
|
+
class={iconBtnStyles}
|
|
382
|
+
aria-label="Clear date range"
|
|
383
|
+
onclick={(e) => { e.stopPropagation(); resetRange(); }}
|
|
384
|
+
>
|
|
385
|
+
<IconX class="size-3"/>
|
|
386
|
+
</button>
|
|
387
|
+
{/if}
|
|
388
|
+
</div>
|
|
389
|
+
</div>
|
|
390
|
+
{/snippet}
|
|
391
|
+
</PopoverPrimitive.Trigger>
|
|
392
|
+
|
|
393
|
+
<PopoverPrimitive.Portal>
|
|
394
|
+
<PopoverPrimitive.Content sideOffset={4} align="start" class={popoverContentStyles}>
|
|
395
|
+
<div class="flex">
|
|
396
|
+
<!-- Quick-select sidebar -->
|
|
397
|
+
<div class="border-r border-border-default p-2 flex flex-col gap-0.5 w-36 shrink-0">
|
|
398
|
+
<p class="px-2 py-1 text-[10px] font-semibold uppercase tracking-wider text-text-tertiary">
|
|
399
|
+
Quick Select
|
|
400
|
+
</p>
|
|
401
|
+
{#each quickRanges as range (range.key)}
|
|
402
|
+
<button
|
|
403
|
+
class={cn(
|
|
404
|
+
'w-full text-left px-2 py-1.5 rounded text-sm cursor-pointer',
|
|
405
|
+
'transition-colors ease-ui duration-100',
|
|
406
|
+
activeQuickSelect === range.key
|
|
407
|
+
? 'bg-interactive/10 text-interactive font-medium'
|
|
408
|
+
: 'text-text-primary hover:bg-surface-hover',
|
|
409
|
+
)}
|
|
410
|
+
onclick={() => applyQuickSelect(range.key)}
|
|
411
|
+
>
|
|
412
|
+
{range.label}
|
|
413
|
+
</button>
|
|
414
|
+
{/each}
|
|
415
|
+
</div>
|
|
416
|
+
|
|
417
|
+
<!-- Calendar + time + footer -->
|
|
418
|
+
<div class="flex flex-col min-w-0">
|
|
419
|
+
<div class="p-4">
|
|
420
|
+
{@render calendarGrid(numberOfMonthsProp ?? 2)}
|
|
421
|
+
</div>
|
|
422
|
+
{#if enableTime}{@render timePickers()}{/if}
|
|
423
|
+
{@render pickerFooter()}
|
|
424
|
+
</div>
|
|
425
|
+
</div>
|
|
426
|
+
</PopoverPrimitive.Content>
|
|
427
|
+
</PopoverPrimitive.Portal>
|
|
428
|
+
</PopoverPrimitive.Root>
|
|
429
|
+
|
|
430
|
+
{:else}
|
|
431
|
+
<!-- ── MOBILE: plain trigger → Dialog (bottom-sheet style) ─────── -->
|
|
432
|
+
<div class={triggerStyles}>
|
|
433
|
+
{@render dateField()}
|
|
434
|
+
|
|
435
|
+
<div class="flex items-center gap-1 shrink-0 ml-1">
|
|
436
|
+
<button
|
|
437
|
+
class={iconBtnStyles}
|
|
438
|
+
aria-label="Open date picker"
|
|
439
|
+
onclick={() => (open = true)}
|
|
440
|
+
>
|
|
441
|
+
<IconCalendar class="size-4"/>
|
|
442
|
+
</button>
|
|
443
|
+
{#if hasRange}
|
|
444
|
+
<button class={iconBtnStyles} aria-label="Clear date range" onclick={resetRange}>
|
|
445
|
+
<IconX class="size-3"/>
|
|
446
|
+
</button>
|
|
447
|
+
{/if}
|
|
448
|
+
</div>
|
|
449
|
+
</div>
|
|
450
|
+
|
|
451
|
+
<Dialog bind:open size="sm" closeButton={false} padding="none">
|
|
452
|
+
<div class="flex flex-col">
|
|
453
|
+
<!-- Dialog header -->
|
|
454
|
+
<div class="flex items-center justify-between px-4 py-3 border-b border-border-default shrink-0">
|
|
455
|
+
<span class="text-sm font-semibold text-text-primary">Select Date Range</span>
|
|
456
|
+
<button class={iconBtnStyles} aria-label="Close" onclick={() => (open = false)}>
|
|
457
|
+
<IconX class="size-4"/>
|
|
458
|
+
</button>
|
|
459
|
+
</div>
|
|
460
|
+
|
|
461
|
+
<!-- Horizontal quick-select pills -->
|
|
462
|
+
<div class="flex gap-1.5 px-3 py-2.5 overflow-x-auto border-b border-border-default shrink-0"
|
|
463
|
+
style="scrollbar-width:none;-ms-overflow-style:none;">
|
|
464
|
+
{#each quickRanges as range (range.key)}
|
|
465
|
+
<button
|
|
466
|
+
class={cn(
|
|
467
|
+
'shrink-0 px-2.5 py-1 rounded-full text-xs border cursor-pointer whitespace-nowrap',
|
|
468
|
+
'transition-colors ease-ui duration-100',
|
|
469
|
+
activeQuickSelect === range.key
|
|
470
|
+
? 'bg-interactive/10 text-interactive border-interactive font-medium'
|
|
471
|
+
: 'border-border-default text-text-secondary hover:border-interactive hover:text-interactive',
|
|
472
|
+
)}
|
|
473
|
+
onclick={() => applyQuickSelect(range.key)}
|
|
474
|
+
>
|
|
475
|
+
{range.label}
|
|
476
|
+
</button>
|
|
477
|
+
{/each}
|
|
478
|
+
</div>
|
|
479
|
+
|
|
480
|
+
<!-- Single-month calendar -->
|
|
481
|
+
<div class="p-4 overflow-auto">
|
|
482
|
+
{@render calendarGrid(1)}
|
|
483
|
+
</div>
|
|
484
|
+
|
|
485
|
+
{#if enableTime}{@render timePickers()}{/if}
|
|
486
|
+
{@render pickerFooter()}
|
|
487
|
+
</div>
|
|
488
|
+
</Dialog>
|
|
489
|
+
{/if}
|
|
490
|
+
</div>
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @component DateRangePicker - Date range picker with quick-select presets, optional time support, and popover/drawer UI.
|
|
3
|
+
* Built on BitsUI RangeCalendar and Popover primitives.
|
|
4
|
+
*/
|
|
5
|
+
import type { CalendarDate } from "@internationalized/date";
|
|
6
|
+
export interface DateRangePickerProps {
|
|
7
|
+
/** The currently selected date range as a two-element array [start, end]. Bindable. */
|
|
8
|
+
dateRange?: Date[];
|
|
9
|
+
/** Called when the user applies a new date range. */
|
|
10
|
+
onchange?: (date: Date[]) => void;
|
|
11
|
+
/** When true, shows hour and minute pickers alongside the calendar. */
|
|
12
|
+
enableTime?: boolean;
|
|
13
|
+
/** Placeholder text shown in the trigger when no range is selected. */
|
|
14
|
+
placeholder?: string;
|
|
15
|
+
/** Prevents all interaction. */
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
/** Additional CSS classes for the trigger button. */
|
|
18
|
+
class?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Earliest selectable date.
|
|
21
|
+
* Use `import { CalendarDate } from '@internationalized/date'` to construct values.
|
|
22
|
+
*/
|
|
23
|
+
minValue?: CalendarDate;
|
|
24
|
+
/**
|
|
25
|
+
* Latest selectable date.
|
|
26
|
+
* Use `import { CalendarDate } from '@internationalized/date'` to construct values.
|
|
27
|
+
*/
|
|
28
|
+
maxValue?: CalendarDate;
|
|
29
|
+
/** Returns true for dates that should be shown as disabled and unselectable. */
|
|
30
|
+
isDateDisabled?: (date: CalendarDate) => boolean;
|
|
31
|
+
/** Number of calendar months shown side-by-side (desktop only). Defaults to 2. */
|
|
32
|
+
numberOfMonths?: 1 | 2;
|
|
33
|
+
/**
|
|
34
|
+
* Day of the week the calendar grid starts on.
|
|
35
|
+
* 0 = Sunday, 1 = Monday, … 6 = Saturday.
|
|
36
|
+
*/
|
|
37
|
+
weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
|
|
38
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as DateRangePicker } from './DateRangePicker.svelte';
|