@sixthshift/design-system 0.2.1 → 0.3.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.
- package/README.md +135 -28
- package/dist/components/Badge/Badge.d.ts +5 -2
- package/dist/components/Badge/Badge.d.ts.map +1 -1
- package/dist/components/Badge/Badge.js +5 -3
- package/dist/components/Badge/Badge.js.map +1 -1
- package/dist/components/BarChart/BarChart.d.ts +8 -2
- package/dist/components/BarChart/BarChart.d.ts.map +1 -1
- package/dist/components/BarChart/BarChart.js +5 -3
- package/dist/components/BarChart/BarChart.js.map +1 -1
- package/dist/components/Calendar/Calendar.d.ts +17 -1
- package/dist/components/Calendar/Calendar.d.ts.map +1 -1
- package/dist/components/Calendar/Calendar.js +80 -225
- package/dist/components/Calendar/Calendar.js.map +1 -1
- package/dist/components/Calendar/CalendarView.d.ts +15 -0
- package/dist/components/Calendar/CalendarView.d.ts.map +1 -0
- package/dist/components/Calendar/CalendarView.js +255 -0
- package/dist/components/Calendar/CalendarView.js.map +1 -0
- package/dist/components/Calendar/calendar.types.d.ts +78 -27
- package/dist/components/Calendar/calendar.types.d.ts.map +1 -1
- package/dist/components/Calendar/calendar.types.js +10 -3
- package/dist/components/Calendar/calendar.types.js.map +1 -1
- package/dist/components/Calendar/index.d.ts +16 -2
- package/dist/components/Calendar/index.d.ts.map +1 -1
- package/dist/components/Calendar/index.js +15 -1
- package/dist/components/Calendar/index.js.map +1 -1
- package/dist/components/ColorDot/ColorDot.d.ts +9 -3
- package/dist/components/ColorDot/ColorDot.d.ts.map +1 -1
- package/dist/components/ColorDot/ColorDot.js +5 -3
- package/dist/components/ColorDot/ColorDot.js.map +1 -1
- package/dist/components/DatePicker/DatePicker.d.ts +2 -2
- package/dist/components/DatePicker/DatePicker.d.ts.map +1 -1
- package/dist/components/DatePicker/DatePicker.js +65 -10
- package/dist/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/components/DatePicker/datepicker.types.d.ts +34 -36
- package/dist/components/DatePicker/datepicker.types.d.ts.map +1 -1
- package/dist/components/DatePicker/datepicker.types.js +5 -3
- package/dist/components/DatePicker/datepicker.types.js.map +1 -1
- package/dist/components/DatePicker/index.d.ts +10 -1
- package/dist/components/DatePicker/index.d.ts.map +1 -1
- package/dist/components/DatePicker/index.js +8 -0
- package/dist/components/DatePicker/index.js.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.d.ts +3 -2
- package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.js +17 -21
- package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
- package/dist/components/DateRangePicker/daterangepicker.types.d.ts +20 -20
- package/dist/components/DateRangePicker/daterangepicker.types.d.ts.map +1 -1
- package/dist/components/DateRangePicker/daterangepicker.types.js +6 -0
- package/dist/components/DateRangePicker/daterangepicker.types.js.map +1 -1
- package/dist/components/DateRangePicker/index.d.ts +8 -1
- package/dist/components/DateRangePicker/index.d.ts.map +1 -1
- package/dist/components/DateRangePicker/index.js +6 -0
- package/dist/components/DateRangePicker/index.js.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.d.ts +3 -3
- package/dist/components/DateTimePicker/DateTimePicker.d.ts.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.js +30 -12
- package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
- package/dist/components/DateTimePicker/datetimepicker.types.d.ts +20 -17
- package/dist/components/DateTimePicker/datetimepicker.types.d.ts.map +1 -1
- package/dist/components/DateTimePicker/datetimepicker.types.js +10 -0
- package/dist/components/DateTimePicker/datetimepicker.types.js.map +1 -1
- package/dist/components/DateTimePicker/index.d.ts +8 -1
- package/dist/components/DateTimePicker/index.d.ts.map +1 -1
- package/dist/components/DateTimePicker/index.js +6 -0
- package/dist/components/DateTimePicker/index.js.map +1 -1
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts +3 -3
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts.map +1 -1
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js +41 -20
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js.map +1 -1
- package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts +22 -18
- package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts.map +1 -1
- package/dist/components/DateTimeRangePicker/datetimerangepicker.types.js +8 -0
- package/dist/components/DateTimeRangePicker/datetimerangepicker.types.js.map +1 -1
- package/dist/components/DateTimeRangePicker/index.d.ts +8 -0
- package/dist/components/DateTimeRangePicker/index.d.ts.map +1 -1
- package/dist/components/DateTimeRangePicker/index.js +7 -0
- package/dist/components/DateTimeRangePicker/index.js.map +1 -1
- package/dist/components/EmptyState/EmptyState.d.ts +16 -5
- package/dist/components/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/components/EmptyState/EmptyState.js +5 -3
- package/dist/components/EmptyState/EmptyState.js.map +1 -1
- package/dist/components/Field/Field.d.ts +3 -3
- package/dist/components/Field/Field.d.ts.map +1 -1
- package/dist/components/Field/Field.js +6 -4
- package/dist/components/Field/Field.js.map +1 -1
- package/dist/components/LineChart/LineChart.d.ts +18 -2
- package/dist/components/LineChart/LineChart.d.ts.map +1 -1
- package/dist/components/LineChart/LineChart.js +5 -3
- package/dist/components/LineChart/LineChart.js.map +1 -1
- package/dist/components/Markdown/Markdown.d.ts +2 -4
- package/dist/components/Markdown/Markdown.d.ts.map +1 -1
- package/dist/components/Markdown/Markdown.js +3 -2
- package/dist/components/Markdown/Markdown.js.map +1 -1
- package/dist/components/Message/Message.d.ts.map +1 -1
- package/dist/components/Message/Message.js +16 -1
- package/dist/components/Message/Message.js.map +1 -1
- package/dist/components/MetricList/MetricList.d.ts +3 -3
- package/dist/components/MetricList/MetricList.d.ts.map +1 -1
- package/dist/components/MetricList/MetricList.js +5 -3
- package/dist/components/MetricList/MetricList.js.map +1 -1
- package/dist/components/Modal/Modal.d.ts +24 -5
- package/dist/components/Modal/Modal.d.ts.map +1 -1
- package/dist/components/Modal/Modal.js +16 -6
- package/dist/components/Modal/Modal.js.map +1 -1
- package/dist/components/Modal/components/ModalContext.d.ts +14 -0
- package/dist/components/Modal/components/ModalContext.d.ts.map +1 -1
- package/dist/components/Modal/components/ModalContext.js.map +1 -1
- package/dist/components/Modal/components/ModalHeader.d.ts.map +1 -1
- package/dist/components/Modal/components/ModalHeader.js +13 -2
- package/dist/components/Modal/components/ModalHeader.js.map +1 -1
- package/dist/components/NavBottom/NavBottom.d.ts +2 -1
- package/dist/components/NavBottom/NavBottom.d.ts.map +1 -1
- package/dist/components/NavBottom/NavBottom.js +6 -4
- package/dist/components/NavBottom/NavBottom.js.map +1 -1
- package/dist/components/NavSide/NavItem.js +1 -1
- package/dist/components/NavSide/NavItem.js.map +1 -1
- package/dist/components/NavSide/NavSide.d.ts +2 -1
- package/dist/components/NavSide/NavSide.d.ts.map +1 -1
- package/dist/components/NavSide/NavSide.js +5 -3
- package/dist/components/NavSide/NavSide.js.map +1 -1
- package/dist/components/Popover/Popover.d.ts.map +1 -1
- package/dist/components/Popover/Popover.js +7 -0
- package/dist/components/Popover/Popover.js.map +1 -1
- package/dist/components/Popover/components/PopoverBody.d.ts.map +1 -1
- package/dist/components/Popover/components/PopoverBody.js +5 -2
- package/dist/components/Popover/components/PopoverBody.js.map +1 -1
- package/dist/components/Popover/components/PopoverContext.d.ts +1 -0
- package/dist/components/Popover/components/PopoverContext.d.ts.map +1 -1
- package/dist/components/Popover/components/PopoverContext.js.map +1 -1
- package/dist/components/Popover/components/PopoverTrigger.d.ts.map +1 -1
- package/dist/components/Popover/components/PopoverTrigger.js +2 -2
- package/dist/components/Popover/components/PopoverTrigger.js.map +1 -1
- package/dist/components/ProgressBar/ProgressBar.d.ts +2 -1
- package/dist/components/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/components/ProgressBar/ProgressBar.js +5 -3
- package/dist/components/ProgressBar/ProgressBar.js.map +1 -1
- package/dist/components/Select/Select.d.ts +11 -2
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/Select.js +64 -18
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/Select/SelectDropdown.d.ts +14 -2
- package/dist/components/Select/SelectDropdown.d.ts.map +1 -1
- package/dist/components/Select/SelectDropdown.js +19 -4
- package/dist/components/Select/SelectDropdown.js.map +1 -1
- package/dist/components/Select/SelectTrigger.d.ts +10 -3
- package/dist/components/Select/SelectTrigger.d.ts.map +1 -1
- package/dist/components/Select/SelectTrigger.js +12 -3
- package/dist/components/Select/SelectTrigger.js.map +1 -1
- package/dist/components/Select/useSelectKeyboard.d.ts +15 -1
- package/dist/components/Select/useSelectKeyboard.d.ts.map +1 -1
- package/dist/components/Select/useSelectKeyboard.js +73 -65
- package/dist/components/Select/useSelectKeyboard.js.map +1 -1
- package/dist/components/Sheet/Sheet.d.ts +19 -5
- package/dist/components/Sheet/Sheet.d.ts.map +1 -1
- package/dist/components/Sheet/Sheet.js +18 -6
- package/dist/components/Sheet/Sheet.js.map +1 -1
- package/dist/components/Sheet/components/SheetContext.d.ts +10 -0
- package/dist/components/Sheet/components/SheetContext.d.ts.map +1 -1
- package/dist/components/Sheet/components/SheetContext.js.map +1 -1
- package/dist/components/Sheet/components/SheetHeader.d.ts.map +1 -1
- package/dist/components/Sheet/components/SheetHeader.js +11 -2
- package/dist/components/Sheet/components/SheetHeader.js.map +1 -1
- package/dist/components/Skeleton/Skeleton.d.ts +2 -1
- package/dist/components/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/components/Skeleton/Skeleton.js +5 -3
- package/dist/components/Skeleton/Skeleton.js.map +1 -1
- package/dist/components/Sparkline/Sparkline.d.ts +10 -2
- package/dist/components/Sparkline/Sparkline.d.ts.map +1 -1
- package/dist/components/Sparkline/Sparkline.js +5 -3
- package/dist/components/Sparkline/Sparkline.js.map +1 -1
- package/dist/components/StatsCard/StatsCard.d.ts +4 -4
- package/dist/components/StatsCard/StatsCard.d.ts.map +1 -1
- package/dist/components/StatsCard/StatsCard.js +5 -3
- package/dist/components/StatsCard/StatsCard.js.map +1 -1
- package/dist/components/Tabs/Tabs.d.ts +2 -2
- package/dist/components/Tabs/components/TabsList.d.ts +1 -1
- package/dist/components/Tabs/components/TabsList.d.ts.map +1 -1
- package/dist/components/Tabs/components/TabsList.js +5 -4
- package/dist/components/Tabs/components/TabsList.js.map +1 -1
- package/dist/components/Tabs/components/TabsPanels.d.ts +1 -1
- package/dist/components/Tabs/components/TabsPanels.d.ts.map +1 -1
- package/dist/components/Tabs/components/TabsPanels.js +5 -3
- package/dist/components/Tabs/components/TabsPanels.js.map +1 -1
- package/dist/components/TagChip/TagChip.d.ts +2 -1
- package/dist/components/TagChip/TagChip.d.ts.map +1 -1
- package/dist/components/TagChip/TagChip.js +5 -3
- package/dist/components/TagChip/TagChip.js.map +1 -1
- package/dist/components/TagInput/TagInput.d.ts +1 -1
- package/dist/components/TagInput/TagInput.d.ts.map +1 -1
- package/dist/components/TagInput/TagInput.js +5 -4
- package/dist/components/TagInput/TagInput.js.map +1 -1
- package/dist/components/TimePicker/TimePicker.d.ts +2 -2
- package/dist/components/TimePicker/TimePicker.d.ts.map +1 -1
- package/dist/components/TimePicker/TimePicker.js +27 -11
- package/dist/components/TimePicker/TimePicker.js.map +1 -1
- package/dist/components/TimePicker/timepicker.types.d.ts +14 -13
- package/dist/components/TimePicker/timepicker.types.d.ts.map +1 -1
- package/dist/components/TimePicker/timepicker.types.js +4 -3
- package/dist/components/TimePicker/timepicker.types.js.map +1 -1
- package/dist/date-time/index.d.ts +2 -0
- package/dist/date-time/index.d.ts.map +1 -1
- package/dist/date-time/index.js +9 -0
- package/dist/date-time/index.js.map +1 -1
- package/dist/date-time/iso.d.ts +261 -0
- package/dist/date-time/iso.d.ts.map +1 -0
- package/dist/date-time/iso.js +358 -0
- package/dist/date-time/iso.js.map +1 -0
- package/dist/date-time/now.d.ts +7 -6
- package/dist/date-time/now.d.ts.map +1 -1
- package/dist/date-time/now.js +3 -3
- package/dist/date-time/now.js.map +1 -1
- package/dist/theme/index.d.ts +4 -3
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +3 -2
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/schema.d.ts +70 -32
- package/dist/theme/schema.d.ts.map +1 -1
- package/dist/theme/schema.js +36 -18
- package/dist/theme/schema.js.map +1 -1
- package/package.json +9 -15
- package/src/components/Badge/Badge.tsx +5 -4
- package/src/components/BarChart/BarChart.tsx +25 -30
- package/src/components/Calendar/Calendar.tsx +91 -401
- package/src/components/Calendar/CalendarView.tsx +445 -0
- package/src/components/Calendar/calendar.types.ts +94 -29
- package/src/components/Calendar/index.ts +16 -17
- package/src/components/ColorDot/ColorDot.tsx +6 -4
- package/src/components/DatePicker/DatePicker.tsx +92 -16
- package/src/components/DatePicker/datepicker.types.ts +38 -39
- package/src/components/DatePicker/index.ts +11 -10
- package/src/components/DateRangePicker/DateRangePicker.tsx +17 -21
- package/src/components/DateRangePicker/daterangepicker.types.ts +22 -22
- package/src/components/DateRangePicker/index.ts +9 -1
- package/src/components/DateTimePicker/DateTimePicker.tsx +46 -18
- package/src/components/DateTimePicker/datetimepicker.types.ts +22 -18
- package/src/components/DateTimePicker/index.ts +9 -1
- package/src/components/DateTimeRangePicker/DateTimeRangePicker.tsx +62 -28
- package/src/components/DateTimeRangePicker/datetimerangepicker.types.ts +24 -19
- package/src/components/DateTimeRangePicker/index.ts +9 -0
- package/src/components/EmptyState/EmptyState.tsx +8 -7
- package/src/components/Field/Field.tsx +7 -6
- package/src/components/LineChart/LineChart.tsx +147 -141
- package/src/components/Markdown/Markdown.tsx +4 -3
- package/src/components/Message/Message.tsx +17 -1
- package/src/components/MetricList/MetricList.tsx +10 -5
- package/src/components/Modal/Modal.tsx +119 -87
- package/src/components/Modal/components/ModalContext.tsx +14 -0
- package/src/components/Modal/components/ModalHeader.tsx +14 -2
- package/src/components/NavBottom/NavBottom.tsx +6 -4
- package/src/components/NavSide/NavItem.tsx +1 -1
- package/src/components/NavSide/NavSide.tsx +5 -3
- package/src/components/Popover/Popover.tsx +7 -0
- package/src/components/Popover/components/PopoverBody.tsx +6 -1
- package/src/components/Popover/components/PopoverContext.tsx +1 -0
- package/src/components/Popover/components/PopoverTrigger.tsx +2 -1
- package/src/components/ProgressBar/ProgressBar.tsx +32 -28
- package/src/components/Select/Select.tsx +76 -19
- package/src/components/Select/SelectDropdown.tsx +32 -3
- package/src/components/Select/SelectTrigger.tsx +26 -3
- package/src/components/Select/useSelectKeyboard.ts +20 -10
- package/src/components/Sheet/Sheet.tsx +108 -83
- package/src/components/Sheet/components/SheetContext.tsx +10 -0
- package/src/components/Sheet/components/SheetHeader.tsx +17 -2
- package/src/components/Skeleton/Skeleton.tsx +5 -3
- package/src/components/Sparkline/Sparkline.tsx +29 -36
- package/src/components/StatsCard/StatsCard.tsx +7 -6
- package/src/components/Tabs/components/TabsList.tsx +5 -3
- package/src/components/Tabs/components/TabsPanels.tsx +5 -3
- package/src/components/TagChip/TagChip.tsx +10 -3
- package/src/components/TagInput/TagInput.tsx +5 -3
- package/src/components/TimePicker/TimePicker.tsx +31 -13
- package/src/components/TimePicker/timepicker.types.ts +14 -13
- package/src/date-time/index.ts +61 -0
- package/src/date-time/iso.ts +511 -0
- package/src/date-time/now.ts +10 -9
- package/src/theme/index.ts +11 -3
- package/src/theme/schema.ts +82 -54
- package/src/theme/tokens.css +807 -0
- package/dist/styles.css +0 -2
- package/dist/theme.generated.css +0 -438
- package/src/styles/base.css +0 -41
- package/src/theme/palette.json +0 -100
- package/src/theme/palette.schema.json +0 -40
- package/src/theme/theme.json +0 -349
- package/src/theme/theme.schema.json +0 -876
- package/src/theme/typography.json +0 -7
- package/src/theme/typography.schema.json +0 -36
- package/tailwind.config.ts +0 -261
|
@@ -1,27 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
/**
|
|
2
|
+
* DateTimePicker types.
|
|
3
|
+
*
|
|
4
|
+
* The value is an absolute instant, exchanged as a canonical UTC ISO string
|
|
5
|
+
* (`"2026-08-26T00:30:00Z"`). Input written with a numeric offset is accepted and
|
|
6
|
+
* normalised to the `Z` form, so one instant always has one representation.
|
|
7
|
+
*
|
|
8
|
+
* Date and time constraints are plain dates and wall-clock times, since they
|
|
9
|
+
* describe the picker's grid rather than an absolute moment.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { DisabledDates, ISODate, ISOInstant, ISOTime, WeekStartsOn } from "../../date-time";
|
|
10
13
|
|
|
11
14
|
export type DateTimePickerProps = {
|
|
12
|
-
// Value (controlled/uncontrolled)
|
|
13
|
-
value?:
|
|
14
|
-
defaultValue?:
|
|
15
|
-
|
|
15
|
+
// Value (controlled/uncontrolled) — an absolute instant, in UTC
|
|
16
|
+
value?: ISOInstant | undefined;
|
|
17
|
+
defaultValue?: ISOInstant | undefined;
|
|
18
|
+
/** Called with a canonical UTC instant string, or undefined when cleared. */
|
|
19
|
+
onChange?: (instant: ISOInstant | undefined) => void;
|
|
16
20
|
|
|
17
21
|
// Date constraints
|
|
18
|
-
minDate?:
|
|
19
|
-
maxDate?:
|
|
20
|
-
disabledDates?:
|
|
22
|
+
minDate?: ISODate;
|
|
23
|
+
maxDate?: ISODate;
|
|
24
|
+
disabledDates?: DisabledDates | DisabledDates[];
|
|
21
25
|
|
|
22
26
|
// Time constraints
|
|
23
|
-
minTime?:
|
|
24
|
-
maxTime?:
|
|
27
|
+
minTime?: ISOTime;
|
|
28
|
+
maxTime?: ISOTime;
|
|
25
29
|
minuteStep?: 1 | 5 | 10 | 15 | 30;
|
|
26
30
|
|
|
27
31
|
// Time format
|
|
@@ -1,2 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public surface of `@sixthshift/design-system/datetime-picker`.
|
|
3
|
+
*
|
|
4
|
+
* `DisabledDateMatcher` was a Temporal-shaped type and is gone; the ISO
|
|
5
|
+
* equivalent `DisabledDates` is re-exported here.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export type { DisabledDates, ISODate, ISOInstant, ISOTime } from "../../date-time";
|
|
1
9
|
export { DateTimePicker } from "./DateTimePicker";
|
|
2
|
-
export type { DateTimePickerProps
|
|
10
|
+
export type { DateTimePickerProps } from "./datetimepicker.types";
|
|
@@ -2,12 +2,23 @@ import { autoUpdate, FloatingPortal, flip, offset, shift, useClick, useDismiss,
|
|
|
2
2
|
import { useControllableState } from "@sixthshift/design-system/hooks";
|
|
3
3
|
import { cn } from "@sixthshift/design-system/utils";
|
|
4
4
|
import { Calendar as CalendarIcon, X } from "lucide-react";
|
|
5
|
-
import
|
|
5
|
+
import * as React from "react";
|
|
6
6
|
import { useCallback, useId, useMemo, useState } from "react";
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
adaptDisabledDates,
|
|
9
|
+
fromISODateOrUndefined,
|
|
10
|
+
fromISOInstantRange,
|
|
11
|
+
fromISOTimeOrUndefined,
|
|
12
|
+
now,
|
|
13
|
+
Temporal,
|
|
14
|
+
type TemporalInstantRange,
|
|
15
|
+
today,
|
|
16
|
+
toISOInstant,
|
|
17
|
+
toISOInstantRange,
|
|
18
|
+
} from "../../date-time";
|
|
8
19
|
|
|
9
20
|
import { Button } from "../Button";
|
|
10
|
-
import {
|
|
21
|
+
import { CalendarView } from "../Calendar/CalendarView";
|
|
11
22
|
import type { DateRangeValue } from "../Calendar/calendar.types";
|
|
12
23
|
import { Separator } from "../Separator";
|
|
13
24
|
import { PeriodSelector } from "../TimePicker/PeriodSelector";
|
|
@@ -57,9 +68,12 @@ function formatInstantDisplay(instant: Temporal.Instant, clockFormat: "12h" | "2
|
|
|
57
68
|
}
|
|
58
69
|
|
|
59
70
|
/**
|
|
60
|
-
* Format an Instant range for display
|
|
71
|
+
* Format an Instant range for display.
|
|
72
|
+
*
|
|
73
|
+
* Takes the internal Temporal range, not the public ISO shape — display runs
|
|
74
|
+
* below the boundary.
|
|
61
75
|
*/
|
|
62
|
-
function formatRangeDisplay(range:
|
|
76
|
+
function formatRangeDisplay(range: TemporalInstantRange | undefined, clockFormat: "12h" | "24h", showSeconds: boolean): string {
|
|
63
77
|
if (!range?.from && !range?.to) {
|
|
64
78
|
return "";
|
|
65
79
|
}
|
|
@@ -78,7 +92,7 @@ function formatRangeDisplay(range: DateTimeRangeValue | undefined, clockFormat:
|
|
|
78
92
|
/**
|
|
79
93
|
* Default preset ranges for DateTimeRangePicker
|
|
80
94
|
*
|
|
81
|
-
* Uses clean hour boundaries and returns
|
|
95
|
+
* Uses clean hour boundaries and returns canonical UTC instant strings
|
|
82
96
|
*/
|
|
83
97
|
function getDefaultPresets(): DateTimeRangePresetOption[] {
|
|
84
98
|
return [
|
|
@@ -87,7 +101,7 @@ function getDefaultPresets(): DateTimeRangePresetOption[] {
|
|
|
87
101
|
value: () => {
|
|
88
102
|
const end = now().round({ smallestUnit: "hour", roundingMode: "ceil" });
|
|
89
103
|
const start = end.subtract({ hours: 1 });
|
|
90
|
-
return { from: start, to: end };
|
|
104
|
+
return { from: toISOInstant(start), to: toISOInstant(end) };
|
|
91
105
|
},
|
|
92
106
|
},
|
|
93
107
|
{
|
|
@@ -95,7 +109,7 @@ function getDefaultPresets(): DateTimeRangePresetOption[] {
|
|
|
95
109
|
value: () => {
|
|
96
110
|
const end = now().round({ smallestUnit: "hour", roundingMode: "ceil" });
|
|
97
111
|
const start = end.subtract({ hours: 24 });
|
|
98
|
-
return { from: start, to: end };
|
|
112
|
+
return { from: toISOInstant(start), to: toISOInstant(end) };
|
|
99
113
|
},
|
|
100
114
|
},
|
|
101
115
|
{
|
|
@@ -103,7 +117,7 @@ function getDefaultPresets(): DateTimeRangePresetOption[] {
|
|
|
103
117
|
value: () => {
|
|
104
118
|
const end = now().round({ smallestUnit: "hour", roundingMode: "ceil" });
|
|
105
119
|
const start = end.subtract({ hours: 7 * 24 });
|
|
106
|
-
return { from: start, to: end };
|
|
120
|
+
return { from: toISOInstant(start), to: toISOInstant(end) };
|
|
107
121
|
},
|
|
108
122
|
},
|
|
109
123
|
{
|
|
@@ -111,7 +125,7 @@ function getDefaultPresets(): DateTimeRangePresetOption[] {
|
|
|
111
125
|
value: () => {
|
|
112
126
|
const end = now().round({ smallestUnit: "hour", roundingMode: "ceil" });
|
|
113
127
|
const start = end.subtract({ hours: 30 * 24 });
|
|
114
|
-
return { from: start, to: end };
|
|
128
|
+
return { from: toISOInstant(start), to: toISOInstant(end) };
|
|
115
129
|
},
|
|
116
130
|
},
|
|
117
131
|
{
|
|
@@ -121,7 +135,7 @@ function getDefaultPresets(): DateTimeRangePresetOption[] {
|
|
|
121
135
|
const tz = Temporal.Now.timeZoneId();
|
|
122
136
|
const zonedNow = end.toZonedDateTimeISO(tz);
|
|
123
137
|
const startOfMonth = zonedNow.toPlainDate().with({ day: 1 }).toPlainDateTime(Temporal.PlainTime.from("00:00:00")).toZonedDateTime(tz).toInstant();
|
|
124
|
-
return { from: startOfMonth, to: end };
|
|
138
|
+
return { from: toISOInstant(startOfMonth), to: toISOInstant(end) };
|
|
125
139
|
},
|
|
126
140
|
},
|
|
127
141
|
];
|
|
@@ -131,9 +145,9 @@ function getDefaultPresets(): DateTimeRangePresetOption[] {
|
|
|
131
145
|
* DateTimeRangePicker - A component for selecting a datetime range
|
|
132
146
|
*
|
|
133
147
|
* Combines date range selection with separate time pickers for start and end times.
|
|
134
|
-
*
|
|
148
|
+
* All values cross the boundary as canonical UTC instant strings.
|
|
135
149
|
*/
|
|
136
|
-
export const DateTimeRangePicker = (props
|
|
150
|
+
export const DateTimeRangePicker = React.forwardRef<HTMLDivElement, DateTimeRangePickerProps>((props, ref) => {
|
|
137
151
|
const {
|
|
138
152
|
value,
|
|
139
153
|
defaultValue,
|
|
@@ -161,11 +175,30 @@ export const DateTimeRangePicker = (props: DateTimeRangePickerProps) => {
|
|
|
161
175
|
// Open state
|
|
162
176
|
const [open, setOpen] = useState(false);
|
|
163
177
|
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
// The ISO boundary.
|
|
180
|
+
//
|
|
181
|
+
// Both ends of the range cross as canonical UTC instant strings; constraints
|
|
182
|
+
// cross as ISO dates and times. Below this block everything is Temporal, as
|
|
183
|
+
// before. Each conversion is memoised on its source value so the Temporal
|
|
184
|
+
// objects handed downstream stay referentially stable.
|
|
185
|
+
// ---------------------------------------------------------------------------
|
|
186
|
+
|
|
187
|
+
const temporalValue = useMemo(() => fromISOInstantRange(value), [value]);
|
|
188
|
+
const temporalDefaultValue = useMemo(() => fromISOInstantRange(defaultValue), [defaultValue]);
|
|
189
|
+
const temporalMinDate = useMemo(() => fromISODateOrUndefined(minDate), [minDate]);
|
|
190
|
+
const temporalMaxDate = useMemo(() => fromISODateOrUndefined(maxDate), [maxDate]);
|
|
191
|
+
const temporalMinTime = useMemo(() => fromISOTimeOrUndefined(minTime), [minTime]);
|
|
192
|
+
const temporalMaxTime = useMemo(() => fromISOTimeOrUndefined(maxTime), [maxTime]);
|
|
193
|
+
const temporalDisabledDates = useMemo(() => adaptDisabledDates(disabledDates), [disabledDates]);
|
|
194
|
+
|
|
195
|
+
const handleChange = useCallback((next: TemporalInstantRange | undefined) => onChange?.(toISOInstantRange(next)), [onChange]);
|
|
196
|
+
|
|
164
197
|
// Controllable value state (external/committed value)
|
|
165
|
-
const [committedValue, setCommittedValue] = useControllableState({
|
|
166
|
-
value,
|
|
167
|
-
defaultValue,
|
|
168
|
-
onChange,
|
|
198
|
+
const [committedValue, setCommittedValue] = useControllableState<TemporalInstantRange | undefined>({
|
|
199
|
+
value: temporalValue,
|
|
200
|
+
defaultValue: temporalDefaultValue,
|
|
201
|
+
onChange: handleChange,
|
|
169
202
|
});
|
|
170
203
|
|
|
171
204
|
// Draft state (date range + time parts for both start and end)
|
|
@@ -303,8 +336,8 @@ export const DateTimeRangePicker = (props: DateTimeRangePickerProps) => {
|
|
|
303
336
|
};
|
|
304
337
|
}, [clockFormat, draftEndHour, draftEndMinute, draftEndSecond, draftEndPeriod]);
|
|
305
338
|
|
|
306
|
-
// Combine draft dates and times into
|
|
307
|
-
const getDraftRange = useCallback(():
|
|
339
|
+
// Combine draft dates and times into the internal Temporal range
|
|
340
|
+
const getDraftRange = useCallback((): TemporalInstantRange => {
|
|
308
341
|
const tz = Temporal.Now.timeZoneId();
|
|
309
342
|
|
|
310
343
|
const from = draftDateRange?.from
|
|
@@ -392,7 +425,7 @@ export const DateTimeRangePicker = (props: DateTimeRangePickerProps) => {
|
|
|
392
425
|
// Apply preset
|
|
393
426
|
const _handlePresetClick = useCallback(
|
|
394
427
|
(preset: { label: string; value: DateTimeRangeValue }) => {
|
|
395
|
-
setCommittedValue(preset.value);
|
|
428
|
+
setCommittedValue(fromISOInstantRange(preset.value));
|
|
396
429
|
setOpen(false);
|
|
397
430
|
},
|
|
398
431
|
[setCommittedValue]
|
|
@@ -445,15 +478,15 @@ export const DateTimeRangePicker = (props: DateTimeRangePickerProps) => {
|
|
|
445
478
|
const checkTimeDisabled = useCallback(
|
|
446
479
|
(hour: number, minute: number, second: number): boolean => {
|
|
447
480
|
const temporal = Temporal.PlainTime.from({ hour, minute, second });
|
|
448
|
-
return isTimeDisabled(temporal,
|
|
481
|
+
return isTimeDisabled(temporal, temporalMinTime, temporalMaxTime);
|
|
449
482
|
},
|
|
450
|
-
[
|
|
483
|
+
[temporalMinTime, temporalMaxTime]
|
|
451
484
|
);
|
|
452
485
|
|
|
453
486
|
return (
|
|
454
487
|
<>
|
|
455
488
|
{/* Trigger Input */}
|
|
456
|
-
<div className="relative flex min-w-125 items-center">
|
|
489
|
+
<div ref={ref} className="relative flex min-w-125 items-center">
|
|
457
490
|
<CalendarIcon className="pointer-events-none absolute left-3 h-4 w-4 text-fg-subtle" />
|
|
458
491
|
<input
|
|
459
492
|
ref={refs.setReference as React.Ref<HTMLInputElement>}
|
|
@@ -531,15 +564,15 @@ export const DateTimeRangePicker = (props: DateTimeRangePickerProps) => {
|
|
|
531
564
|
)}
|
|
532
565
|
|
|
533
566
|
{/* Date Calendar */}
|
|
534
|
-
<
|
|
567
|
+
<CalendarView
|
|
535
568
|
mode="range"
|
|
536
569
|
value={draftDateRange}
|
|
537
570
|
onSelect={setDraftDateRange as (range: DateRangeValue | undefined) => void}
|
|
538
571
|
month={month}
|
|
539
572
|
onMonthChange={setMonth}
|
|
540
|
-
minDate={
|
|
541
|
-
maxDate={
|
|
542
|
-
disabled={
|
|
573
|
+
minDate={temporalMinDate}
|
|
574
|
+
maxDate={temporalMaxDate}
|
|
575
|
+
disabled={temporalDisabledDates}
|
|
543
576
|
weekStartsOn={weekStartsOn}
|
|
544
577
|
showFooter={false}
|
|
545
578
|
/>
|
|
@@ -676,4 +709,5 @@ export const DateTimeRangePicker = (props: DateTimeRangePickerProps) => {
|
|
|
676
709
|
)}
|
|
677
710
|
</>
|
|
678
711
|
);
|
|
679
|
-
};
|
|
712
|
+
});
|
|
713
|
+
DateTimeRangePicker.displayName = "DateTimeRangePicker";
|
|
@@ -1,20 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
/**
|
|
2
|
+
* DateTimeRangePicker types.
|
|
3
|
+
*
|
|
4
|
+
* Both ends of the range are absolute instants, exchanged as canonical UTC ISO
|
|
5
|
+
* strings (`"2026-08-26T00:30:00Z"`). Date and time constraints are plain dates
|
|
6
|
+
* and wall-clock times, since they describe the picker's grid rather than an
|
|
7
|
+
* absolute moment.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { DisabledDates, ISODate, ISOInstantRange, ISOTime, WeekStartsOn } from "../../date-time";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* A datetime range.
|
|
14
|
+
*
|
|
15
|
+
* Alias of `ISOInstantRange`, kept under this name because it is the historical
|
|
16
|
+
* public type for this component.
|
|
17
|
+
*/
|
|
18
|
+
export type DateTimeRangeValue = ISOInstantRange;
|
|
15
19
|
|
|
16
20
|
export type DateTimeRangePresetOption = {
|
|
17
21
|
label: string;
|
|
22
|
+
/** Called when the picker renders, so relative ranges stay current. */
|
|
18
23
|
value: () => DateTimeRangeValue;
|
|
19
24
|
};
|
|
20
25
|
|
|
@@ -29,13 +34,13 @@ export type DateTimeRangePickerProps = {
|
|
|
29
34
|
showPresets?: boolean; // Default: true
|
|
30
35
|
|
|
31
36
|
// Date constraints
|
|
32
|
-
minDate?:
|
|
33
|
-
maxDate?:
|
|
34
|
-
disabledDates?:
|
|
37
|
+
minDate?: ISODate;
|
|
38
|
+
maxDate?: ISODate;
|
|
39
|
+
disabledDates?: DisabledDates | DisabledDates[];
|
|
35
40
|
|
|
36
41
|
// Time constraints (apply to both start and end times)
|
|
37
|
-
minTime?:
|
|
38
|
-
maxTime?:
|
|
42
|
+
minTime?: ISOTime;
|
|
43
|
+
maxTime?: ISOTime;
|
|
39
44
|
minuteStep?: 1 | 5 | 10 | 15 | 30;
|
|
40
45
|
|
|
41
46
|
// Time format
|
|
@@ -1,2 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public surface of `@sixthshift/design-system/datetime-range-picker`.
|
|
3
|
+
*
|
|
4
|
+
* `DisabledDateMatcher` was a Temporal-shaped type and is gone; the ISO
|
|
5
|
+
* equivalent `DisabledDates` is re-exported here. `DateTimeRangeValue` survives
|
|
6
|
+
* as an alias of `ISOInstantRange`.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export type { DisabledDates, ISODate, ISOInstant, ISOInstantRange, ISOTime } from "../../date-time";
|
|
1
10
|
export { DateTimeRangePicker } from "./DateTimeRangePicker";
|
|
2
11
|
export type { DateTimeRangePickerProps, DateTimeRangePresetOption, DateTimeRangeValue } from "./datetimerangepicker.types";
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import { Muted } from "@sixthshift/design-system/muted";
|
|
2
2
|
import { cn } from "@sixthshift/design-system/utils";
|
|
3
|
-
import
|
|
3
|
+
import * as React from "react";
|
|
4
4
|
|
|
5
|
-
export type EmptyStateProps = HTMLAttributes<HTMLDivElement> & {
|
|
5
|
+
export type EmptyStateProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
6
6
|
/** Optional icon to display */
|
|
7
|
-
icon?: ReactNode;
|
|
7
|
+
icon?: React.ReactNode;
|
|
8
8
|
/** Message to display */
|
|
9
9
|
message: string;
|
|
10
10
|
/** Optional description for more context */
|
|
11
11
|
description?: string;
|
|
12
12
|
/** Optional action button or element */
|
|
13
|
-
action?: ReactNode;
|
|
13
|
+
action?: React.ReactNode;
|
|
14
14
|
/** Additional CSS classes */
|
|
15
15
|
className?: string;
|
|
16
16
|
};
|
|
17
17
|
|
|
18
|
-
export const EmptyState = ({ icon, message, description, action, className, ...props }
|
|
18
|
+
export const EmptyState = React.forwardRef<HTMLDivElement, EmptyStateProps>(({ icon, message, description, action, className, ...props }, ref) => {
|
|
19
19
|
return (
|
|
20
|
-
<div className={cn("flex flex-col items-center justify-center gap-3 p-8 text-center", className)} {...props}>
|
|
20
|
+
<div ref={ref} className={cn("flex flex-col items-center justify-center gap-3 p-8 text-center", className)} {...props}>
|
|
21
21
|
{icon && <div className="text-fg-subtle">{icon}</div>}
|
|
22
22
|
<div className="flex flex-col gap-1">
|
|
23
23
|
<Muted>{message}</Muted>
|
|
@@ -26,4 +26,5 @@ export const EmptyState = ({ icon, message, description, action, className, ...p
|
|
|
26
26
|
{action && <div className="mt-2">{action}</div>}
|
|
27
27
|
</div>
|
|
28
28
|
);
|
|
29
|
-
};
|
|
29
|
+
});
|
|
30
|
+
EmptyState.displayName = "EmptyState";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { cn } from "@sixthshift/design-system/utils";
|
|
2
|
-
import
|
|
2
|
+
import * as React from "react";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* The labelled identifier carve-out used by identity-disclosure surfaces
|
|
@@ -22,7 +22,7 @@ export type FieldProps = {
|
|
|
22
22
|
/** The humane label for what the identifier identifies ("WhatsApp", "Email"). */
|
|
23
23
|
label: string;
|
|
24
24
|
/** The identifier itself. Rendered monospaced + breakable by default. */
|
|
25
|
-
children: ReactNode;
|
|
25
|
+
children: React.ReactNode;
|
|
26
26
|
/**
|
|
27
27
|
* `stacked` (default): label above, value below — best for long identifiers
|
|
28
28
|
* that need horizontal room to wrap.
|
|
@@ -39,12 +39,12 @@ export type FieldProps = {
|
|
|
39
39
|
className?: string;
|
|
40
40
|
};
|
|
41
41
|
|
|
42
|
-
export const Field = ({ label, children, layout = "stacked", mono = true, className }
|
|
42
|
+
export const Field = React.forwardRef<HTMLDivElement, FieldProps>(({ label, children, layout = "stacked", mono = true, className }, ref) => {
|
|
43
43
|
const valueClass = cn("text-fg-subtle text-xs", mono && "break-all font-mono");
|
|
44
44
|
|
|
45
45
|
if (layout === "row") {
|
|
46
46
|
return (
|
|
47
|
-
<div className={cn("flex items-baseline justify-between gap-3", className)}>
|
|
47
|
+
<div ref={ref} className={cn("flex items-baseline justify-between gap-3", className)}>
|
|
48
48
|
<span className="shrink-0 text-fg-subtle text-sm">{label}</span>
|
|
49
49
|
<span className={cn(valueClass, "min-w-0 text-right")}>{children}</span>
|
|
50
50
|
</div>
|
|
@@ -52,9 +52,10 @@ export const Field = ({ label, children, layout = "stacked", mono = true, classN
|
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
return (
|
|
55
|
-
<div className={cn("flex flex-col gap-1", className)}>
|
|
55
|
+
<div ref={ref} className={cn("flex flex-col gap-1", className)}>
|
|
56
56
|
<span className="text-fg-subtle text-xs uppercase tracking-wide">{label}</span>
|
|
57
57
|
<span className={valueClass}>{children}</span>
|
|
58
58
|
</div>
|
|
59
59
|
);
|
|
60
|
-
};
|
|
60
|
+
});
|
|
61
|
+
Field.displayName = "Field";
|