@sixthshift/design-system 0.2.1 → 0.4.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 +242 -33
- package/dist/components/Badge/Badge.d.ts +65 -7
- package/dist/components/Badge/Badge.d.ts.map +1 -1
- package/dist/components/Badge/Badge.js +56 -46
- package/dist/components/Badge/Badge.js.map +1 -1
- package/dist/components/Badge/index.d.ts +1 -1
- package/dist/components/Badge/index.d.ts.map +1 -1
- package/dist/components/Badge/index.js +1 -1
- package/dist/components/Badge/index.js.map +1 -1
- package/dist/components/BarChart/BarChart.d.ts +20 -2
- package/dist/components/BarChart/BarChart.d.ts.map +1 -1
- package/dist/components/BarChart/BarChart.js +17 -3
- package/dist/components/BarChart/BarChart.js.map +1 -1
- package/dist/components/Button/Button.d.ts +85 -6
- package/dist/components/Button/Button.d.ts.map +1 -1
- package/dist/components/Button/Button.js +97 -106
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/Button/index.d.ts +1 -1
- package/dist/components/Button/index.d.ts.map +1 -1
- package/dist/components/Button/index.js +1 -1
- package/dist/components/Button/index.js.map +1 -1
- package/dist/components/Calendar/Calendar.d.ts +31 -1
- package/dist/components/Calendar/Calendar.d.ts.map +1 -1
- package/dist/components/Calendar/Calendar.js +94 -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 +263 -0
- package/dist/components/Calendar/CalendarView.js.map +1 -0
- package/dist/components/Calendar/calendar.types.d.ts +87 -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/Card/Card.d.ts +13 -0
- package/dist/components/Card/Card.d.ts.map +1 -1
- package/dist/components/Card/Card.js +15 -2
- package/dist/components/Card/Card.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.d.ts +21 -0
- package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
- package/dist/components/Checkbox/Checkbox.js +22 -1
- package/dist/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +22 -0
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts.map +1 -1
- package/dist/components/CheckboxGroup/CheckboxGroup.js +22 -0
- package/dist/components/CheckboxGroup/CheckboxGroup.js.map +1 -1
- package/dist/components/Code/Editor/Editor.js +2 -2
- package/dist/components/Code/Editor/Editor.js.map +1 -1
- package/dist/components/Code/Editor/themes.d.ts +2 -2
- package/dist/components/Code/Editor/themes.d.ts.map +1 -1
- package/dist/components/Code/Editor/themes.js +50 -32
- package/dist/components/Code/Editor/themes.js.map +1 -1
- package/dist/components/Code/ValidationStatus/ValidationStatus.d.ts.map +1 -1
- package/dist/components/Code/ValidationStatus/ValidationStatus.js.map +1 -1
- package/dist/components/DatePicker/DatePicker.d.ts +45 -2
- package/dist/components/DatePicker/DatePicker.d.ts.map +1 -1
- package/dist/components/DatePicker/DatePicker.js +228 -11
- package/dist/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/components/DatePicker/DateSegments.d.ts +60 -0
- package/dist/components/DatePicker/DateSegments.d.ts.map +1 -0
- package/dist/components/DatePicker/DateSegments.js +80 -0
- package/dist/components/DatePicker/DateSegments.js.map +1 -0
- package/dist/components/DatePicker/datepicker.types.d.ts +53 -37
- 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 +22 -3
- package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.js +38 -24
- package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
- package/dist/components/DateRangePicker/daterangepicker.types.d.ts +26 -21
- 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 +32 -4
- package/dist/components/DateTimePicker/DateTimePicker.d.ts.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.js +133 -42
- package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
- package/dist/components/DateTimePicker/DateTimeSegments.d.ts +41 -0
- package/dist/components/DateTimePicker/DateTimeSegments.d.ts.map +1 -0
- package/dist/components/DateTimePicker/DateTimeSegments.js +67 -0
- package/dist/components/DateTimePicker/DateTimeSegments.js.map +1 -0
- package/dist/components/DateTimePicker/datetimepicker.types.d.ts +26 -18
- 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 +30 -4
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts.map +1 -1
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js +171 -72
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js.map +1 -1
- package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts +28 -19
- 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/Field/Field.d.ts +18 -20
- package/dist/components/Field/Field.d.ts.map +1 -1
- package/dist/components/Field/Field.js +22 -5
- package/dist/components/Field/Field.js.map +1 -1
- package/dist/components/FormField/FormField.d.ts +15 -0
- package/dist/components/FormField/FormField.d.ts.map +1 -1
- package/dist/components/FormField/FormField.js +15 -0
- package/dist/components/FormField/FormField.js.map +1 -1
- package/dist/components/HoverCard/HoverCard.d.ts +6 -0
- package/dist/components/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/components/HoverCard/HoverCard.js +6 -0
- package/dist/components/HoverCard/HoverCard.js.map +1 -1
- package/dist/components/Input/Input.d.ts +15 -0
- package/dist/components/Input/Input.d.ts.map +1 -1
- package/dist/components/Input/Input.js +18 -3
- package/dist/components/Input/Input.js.map +1 -1
- package/dist/components/LineChart/LineChart.d.ts +35 -2
- package/dist/components/LineChart/LineChart.d.ts.map +1 -1
- package/dist/components/LineChart/LineChart.js +22 -3
- package/dist/components/LineChart/LineChart.js.map +1 -1
- package/dist/components/Markdown/Markdown.d.ts +19 -4
- package/dist/components/Markdown/Markdown.d.ts.map +1 -1
- package/dist/components/Markdown/Markdown.js +20 -2
- package/dist/components/Markdown/Markdown.js.map +1 -1
- package/dist/components/Message/Message.d.ts +49 -4
- package/dist/components/Message/Message.d.ts.map +1 -1
- package/dist/components/Message/Message.js +62 -11
- package/dist/components/Message/Message.js.map +1 -1
- package/dist/components/Message/index.d.ts +1 -1
- package/dist/components/Message/index.d.ts.map +1 -1
- package/dist/components/Modal/Modal.d.ts +60 -5
- package/dist/components/Modal/Modal.d.ts.map +1 -1
- package/dist/components/Modal/Modal.js +52 -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/Popover/Popover.d.ts +29 -0
- package/dist/components/Popover/Popover.d.ts.map +1 -1
- package/dist/components/Popover/Popover.js +36 -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 +16 -1
- package/dist/components/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/components/ProgressBar/ProgressBar.js +19 -3
- package/dist/components/ProgressBar/ProgressBar.js.map +1 -1
- package/dist/components/RadioButton/RadioButton.d.ts +26 -0
- package/dist/components/RadioButton/RadioButton.d.ts.map +1 -1
- package/dist/components/RadioButton/RadioButton.js +35 -1
- package/dist/components/RadioButton/RadioButton.js.map +1 -1
- package/dist/components/RadioButtonGroup/RadioButtonGroup.d.ts +26 -0
- package/dist/components/RadioButtonGroup/RadioButtonGroup.d.ts.map +1 -1
- package/dist/components/RadioButtonGroup/RadioButtonGroup.js +33 -0
- package/dist/components/RadioButtonGroup/RadioButtonGroup.js.map +1 -1
- package/dist/components/SearchInput/SearchInput.d.ts +10 -0
- package/dist/components/SearchInput/SearchInput.d.ts.map +1 -1
- package/dist/components/SearchInput/SearchInput.js +12 -1
- package/dist/components/SearchInput/SearchInput.js.map +1 -1
- package/dist/components/Select/Select.d.ts +10 -2
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/Select.js +63 -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 +20 -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/Separator/Separator.d.ts +10 -0
- package/dist/components/Separator/Separator.d.ts.map +1 -1
- package/dist/components/Separator/Separator.js +10 -0
- package/dist/components/Separator/Separator.js.map +1 -1
- package/dist/components/Sheet/Sheet.d.ts +25 -5
- package/dist/components/Sheet/Sheet.d.ts.map +1 -1
- package/dist/components/Sheet/Sheet.js +24 -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/SheetFooter.js +1 -1
- package/dist/components/Sheet/components/SheetFooter.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/Sparkline/Sparkline.d.ts +21 -2
- package/dist/components/Sparkline/Sparkline.d.ts.map +1 -1
- package/dist/components/Sparkline/Sparkline.js +16 -3
- package/dist/components/Sparkline/Sparkline.js.map +1 -1
- package/dist/components/Spinner/Spinner.d.ts +27 -2
- package/dist/components/Spinner/Spinner.d.ts.map +1 -1
- package/dist/components/Spinner/Spinner.js +28 -3
- package/dist/components/Spinner/Spinner.js.map +1 -1
- package/dist/components/Switch/Switch.d.ts +18 -0
- package/dist/components/Switch/Switch.d.ts.map +1 -1
- package/dist/components/Switch/Switch.js +19 -1
- package/dist/components/Switch/Switch.js.map +1 -1
- package/dist/components/Tabs/Tabs.d.ts +8 -2
- package/dist/components/Tabs/Tabs.d.ts.map +1 -1
- package/dist/components/Tabs/Tabs.js +6 -0
- package/dist/components/Tabs/Tabs.js.map +1 -1
- 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/Tabs/components/TabsTrigger.d.ts.map +1 -1
- package/dist/components/Tabs/components/TabsTrigger.js +22 -6
- package/dist/components/Tabs/components/TabsTrigger.js.map +1 -1
- package/dist/components/TagChip/TagChip.d.ts +16 -13
- package/dist/components/TagChip/TagChip.d.ts.map +1 -1
- package/dist/components/TagChip/TagChip.js +18 -3
- package/dist/components/TagChip/TagChip.js.map +1 -1
- package/dist/components/TagInput/TagInput.d.ts +12 -9
- package/dist/components/TagInput/TagInput.d.ts.map +1 -1
- package/dist/components/TagInput/TagInput.js +16 -4
- package/dist/components/TagInput/TagInput.js.map +1 -1
- package/dist/components/Text/Text.d.ts +9 -0
- package/dist/components/Text/Text.d.ts.map +1 -1
- package/dist/components/Text/Text.js +9 -0
- package/dist/components/Text/Text.js.map +1 -1
- package/dist/components/TextInline/TextInline.d.ts +15 -4
- package/dist/components/TextInline/TextInline.d.ts.map +1 -1
- package/dist/components/TextInline/TextInline.js +11 -0
- package/dist/components/TextInline/TextInline.js.map +1 -1
- package/dist/components/Textarea/Textarea.d.ts +12 -0
- package/dist/components/Textarea/Textarea.d.ts.map +1 -1
- package/dist/components/Textarea/Textarea.js +13 -1
- package/dist/components/Textarea/Textarea.js.map +1 -1
- package/dist/components/TimePicker/TimeColumn.d.ts +10 -1
- package/dist/components/TimePicker/TimeColumn.d.ts.map +1 -1
- package/dist/components/TimePicker/TimeColumn.js +8 -1
- package/dist/components/TimePicker/TimeColumn.js.map +1 -1
- package/dist/components/TimePicker/TimePicker.d.ts +34 -2
- package/dist/components/TimePicker/TimePicker.d.ts.map +1 -1
- package/dist/components/TimePicker/TimePicker.js +118 -15
- package/dist/components/TimePicker/TimePicker.js.map +1 -1
- package/dist/components/TimePicker/TimeSegments.d.ts +50 -0
- package/dist/components/TimePicker/TimeSegments.d.ts.map +1 -0
- package/dist/components/TimePicker/TimeSegments.js +93 -0
- package/dist/components/TimePicker/TimeSegments.js.map +1 -0
- package/dist/components/TimePicker/timepicker.hooks.d.ts +0 -4
- package/dist/components/TimePicker/timepicker.hooks.d.ts.map +1 -1
- package/dist/components/TimePicker/timepicker.hooks.js +1 -23
- package/dist/components/TimePicker/timepicker.hooks.js.map +1 -1
- package/dist/components/TimePicker/timepicker.types.d.ts +14 -15
- 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/components/Toast/Toast.d.ts +27 -0
- package/dist/components/Toast/Toast.d.ts.map +1 -1
- package/dist/components/Toast/Toast.js +28 -1
- package/dist/components/Toast/Toast.js.map +1 -1
- package/dist/components/Toggle/Toggle.d.ts +31 -12
- package/dist/components/Toggle/Toggle.d.ts.map +1 -1
- package/dist/components/Toggle/Toggle.js +19 -31
- package/dist/components/Toggle/Toggle.js.map +1 -1
- package/dist/components/Toggle/index.d.ts +1 -1
- package/dist/components/Toggle/index.d.ts.map +1 -1
- package/dist/components/Toggle/index.js +1 -1
- package/dist/components/Toggle/index.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.d.ts +17 -0
- package/dist/components/ToggleGroup/ToggleGroup.d.ts.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.js +17 -0
- package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupItem.d.ts +1 -1
- package/dist/components/ToggleGroup/ToggleGroupItem.d.ts.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupItem.js +7 -6
- package/dist/components/ToggleGroup/ToggleGroupItem.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts +4 -3
- package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupMultiple.js +2 -2
- package/dist/components/ToggleGroup/ToggleGroupMultiple.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts +4 -3
- package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupSingle.js +2 -2
- package/dist/components/ToggleGroup/ToggleGroupSingle.js.map +1 -1
- package/dist/components/ToggleGroup/toggleGroup.types.d.ts +12 -3
- package/dist/components/ToggleGroup/toggleGroup.types.d.ts.map +1 -1
- package/dist/components/Tooltip/Tooltip.d.ts +6 -0
- package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/components/Tooltip/Tooltip.js +6 -0
- package/dist/components/Tooltip/Tooltip.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 -1
- 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/internal/PickerField.d.ts +45 -0
- package/dist/internal/PickerField.d.ts.map +1 -0
- package/dist/internal/PickerField.js +24 -0
- package/dist/internal/PickerField.js.map +1 -0
- package/dist/internal/SegmentedField.d.ts +98 -0
- package/dist/internal/SegmentedField.d.ts.map +1 -0
- package/dist/internal/SegmentedField.js +315 -0
- package/dist/internal/SegmentedField.js.map +1 -0
- package/dist/internal/index.d.ts +2 -0
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +2 -0
- package/dist/internal/index.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 +49 -33
- package/dist/theme/schema.d.ts.map +1 -1
- package/dist/theme/schema.js +30 -21
- package/dist/theme/schema.js.map +1 -1
- package/package.json +11 -59
- package/src/components/Badge/Badge.tsx +87 -49
- package/src/components/Badge/index.ts +10 -1
- package/src/components/BarChart/BarChart.tsx +37 -30
- package/src/components/Button/Button.tsx +129 -106
- package/src/components/Button/index.ts +10 -1
- package/src/components/Calendar/Calendar.tsx +104 -401
- package/src/components/Calendar/CalendarView.tsx +454 -0
- package/src/components/Calendar/calendar.types.ts +104 -29
- package/src/components/Calendar/index.ts +16 -17
- package/src/components/Card/Card.tsx +15 -2
- package/src/components/Checkbox/Checkbox.tsx +22 -2
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +22 -0
- package/src/components/Code/Editor/Editor.tsx +2 -2
- package/src/components/Code/Editor/themes.ts +50 -32
- package/src/components/Code/ValidationStatus/ValidationStatus.tsx +6 -3
- package/src/components/DatePicker/DatePicker.tsx +369 -42
- package/src/components/DatePicker/DateSegments.tsx +125 -0
- package/src/components/DatePicker/datepicker.types.ts +58 -39
- package/src/components/DatePicker/index.ts +11 -3
- package/src/components/DateRangePicker/DateRangePicker.tsx +38 -24
- package/src/components/DateRangePicker/daterangepicker.types.ts +29 -23
- package/src/components/DateRangePicker/index.ts +9 -1
- package/src/components/DateTimePicker/DateTimePicker.tsx +189 -88
- package/src/components/DateTimePicker/DateTimeSegments.tsx +113 -0
- package/src/components/DateTimePicker/datetimepicker.types.ts +29 -19
- package/src/components/DateTimePicker/index.ts +9 -1
- package/src/components/DateTimeRangePicker/DateTimeRangePicker.tsx +251 -126
- package/src/components/DateTimeRangePicker/datetimerangepicker.types.ts +31 -20
- package/src/components/DateTimeRangePicker/index.ts +9 -0
- package/src/components/Field/Field.tsx +25 -26
- package/src/components/FormField/FormField.tsx +15 -0
- package/src/components/HoverCard/HoverCard.tsx +6 -0
- package/src/components/Input/Input.tsx +19 -4
- package/src/components/LineChart/LineChart.tsx +164 -141
- package/src/components/Markdown/Markdown.tsx +21 -3
- package/src/components/Message/Message.tsx +83 -17
- package/src/components/Message/index.ts +1 -1
- package/src/components/Modal/Modal.tsx +157 -86
- package/src/components/Modal/components/ModalContext.tsx +14 -0
- package/src/components/Modal/components/ModalHeader.tsx +15 -3
- package/src/components/Popover/Popover.tsx +36 -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 +46 -28
- package/src/components/RadioButton/RadioButton.tsx +34 -3
- package/src/components/RadioButtonGroup/RadioButtonGroup.tsx +32 -0
- package/src/components/SearchInput/SearchInput.tsx +13 -2
- package/src/components/Select/Select.tsx +75 -19
- package/src/components/Select/SelectDropdown.tsx +45 -12
- package/src/components/Select/SelectTrigger.tsx +31 -8
- package/src/components/Select/useSelectKeyboard.ts +20 -10
- package/src/components/Separator/Separator.tsx +10 -0
- package/src/components/Sheet/Sheet.tsx +114 -83
- package/src/components/Sheet/components/SheetContext.tsx +10 -0
- package/src/components/Sheet/components/SheetFooter.tsx +1 -1
- package/src/components/Sheet/components/SheetHeader.tsx +18 -3
- package/src/components/Sparkline/Sparkline.tsx +40 -36
- package/src/components/Spinner/Spinner.tsx +28 -3
- package/src/components/Switch/Switch.tsx +27 -4
- package/src/components/Tabs/Tabs.tsx +6 -0
- package/src/components/Tabs/components/TabsList.tsx +5 -3
- package/src/components/Tabs/components/TabsPanels.tsx +5 -3
- package/src/components/Tabs/components/TabsTrigger.tsx +22 -5
- package/src/components/TagChip/TagChip.tsx +27 -18
- package/src/components/TagInput/TagInput.tsx +16 -11
- package/src/components/Text/Text.tsx +9 -0
- package/src/components/TextInline/TextInline.tsx +11 -0
- package/src/components/Textarea/Textarea.tsx +13 -1
- package/src/components/TimePicker/TimeColumn.tsx +24 -1
- package/src/components/TimePicker/TimePicker.tsx +157 -51
- package/src/components/TimePicker/TimeSegments.tsx +131 -0
- package/src/components/TimePicker/timepicker.hooks.ts +1 -24
- package/src/components/TimePicker/timepicker.types.ts +14 -16
- package/src/components/Toast/Toast.tsx +28 -1
- package/src/components/Toggle/Toggle.tsx +34 -32
- package/src/components/Toggle/index.ts +1 -1
- package/src/components/ToggleGroup/ToggleGroup.tsx +17 -0
- package/src/components/ToggleGroup/ToggleGroupItem.tsx +13 -8
- package/src/components/ToggleGroup/ToggleGroupMultiple.tsx +3 -1
- package/src/components/ToggleGroup/ToggleGroupSingle.tsx +3 -1
- package/src/components/ToggleGroup/toggleGroup.types.ts +12 -3
- package/src/components/Tooltip/Tooltip.tsx +6 -0
- package/src/date-time/index.ts +61 -1
- package/src/date-time/iso.ts +511 -0
- package/src/date-time/now.ts +10 -9
- package/src/internal/PickerField.tsx +90 -0
- package/src/internal/SegmentedField.tsx +445 -0
- package/src/internal/index.ts +2 -0
- package/src/theme/index.ts +11 -9
- package/src/theme/recipes/badge.css +140 -0
- package/src/theme/recipes/button.css +167 -0
- package/src/theme/recipes/card.css +26 -0
- package/src/theme/recipes/checkbox.css +44 -0
- package/src/theme/recipes/field.css +14 -0
- package/src/theme/recipes/index.css +28 -0
- package/src/theme/recipes/input.css +29 -0
- package/src/theme/recipes/message.css +47 -0
- package/src/theme/recipes/modal.css +31 -0
- package/src/theme/recipes/radio-button.css +42 -0
- package/src/theme/recipes/search-input.css +16 -0
- package/src/theme/recipes/select.css +105 -0
- package/src/theme/recipes/sheet.css +34 -0
- package/src/theme/recipes/spinner.css +17 -0
- package/src/theme/recipes/switch.css +39 -0
- package/src/theme/recipes/tabs.css +41 -0
- package/src/theme/recipes/tag-chip.css +27 -0
- package/src/theme/recipes/textarea.css +20 -0
- package/src/theme/recipes/toggle.css +92 -0
- package/src/theme/schema.ts +59 -58
- package/src/theme/tokens.css +824 -0
- package/dist/components/Avatar/Avatar.d.ts +0 -6
- package/dist/components/Avatar/Avatar.d.ts.map +0 -1
- package/dist/components/Avatar/Avatar.js +0 -11
- package/dist/components/Avatar/Avatar.js.map +0 -1
- package/dist/components/Avatar/index.d.ts +0 -2
- package/dist/components/Avatar/index.d.ts.map +0 -1
- package/dist/components/Avatar/index.js +0 -2
- package/dist/components/Avatar/index.js.map +0 -1
- package/dist/components/Breadcrumb/Breadcrumb.d.ts +0 -12
- package/dist/components/Breadcrumb/Breadcrumb.d.ts.map +0 -1
- package/dist/components/Breadcrumb/Breadcrumb.js +0 -19
- package/dist/components/Breadcrumb/Breadcrumb.js.map +0 -1
- package/dist/components/Breadcrumb/index.d.ts +0 -2
- package/dist/components/Breadcrumb/index.d.ts.map +0 -1
- package/dist/components/Breadcrumb/index.js +0 -2
- package/dist/components/Breadcrumb/index.js.map +0 -1
- package/dist/components/ColorDot/ColorDot.d.ts +0 -13
- package/dist/components/ColorDot/ColorDot.d.ts.map +0 -1
- package/dist/components/ColorDot/ColorDot.js +0 -34
- package/dist/components/ColorDot/ColorDot.js.map +0 -1
- package/dist/components/ColorDot/index.d.ts +0 -2
- package/dist/components/ColorDot/index.d.ts.map +0 -1
- package/dist/components/ColorDot/index.js +0 -2
- package/dist/components/ColorDot/index.js.map +0 -1
- package/dist/components/EmptyState/EmptyState.d.ts +0 -15
- package/dist/components/EmptyState/EmptyState.d.ts.map +0 -1
- package/dist/components/EmptyState/EmptyState.js +0 -7
- package/dist/components/EmptyState/EmptyState.js.map +0 -1
- package/dist/components/EmptyState/index.d.ts +0 -2
- package/dist/components/EmptyState/index.d.ts.map +0 -1
- package/dist/components/EmptyState/index.js +0 -2
- package/dist/components/EmptyState/index.js.map +0 -1
- package/dist/components/HeatMap/HeatMapCalendar.d.ts +0 -11
- package/dist/components/HeatMap/HeatMapCalendar.d.ts.map +0 -1
- package/dist/components/HeatMap/HeatMapCalendar.js +0 -68
- package/dist/components/HeatMap/HeatMapCalendar.js.map +0 -1
- package/dist/components/HeatMap/HeatMapMatrix.d.ts +0 -12
- package/dist/components/HeatMap/HeatMapMatrix.d.ts.map +0 -1
- package/dist/components/HeatMap/HeatMapMatrix.js +0 -35
- package/dist/components/HeatMap/HeatMapMatrix.js.map +0 -1
- package/dist/components/HeatMap/heat-map.utils.d.ts +0 -10
- package/dist/components/HeatMap/heat-map.utils.d.ts.map +0 -1
- package/dist/components/HeatMap/heat-map.utils.js +0 -10
- package/dist/components/HeatMap/heat-map.utils.js.map +0 -1
- package/dist/components/HeatMap/index.d.ts +0 -4
- package/dist/components/HeatMap/index.d.ts.map +0 -1
- package/dist/components/HeatMap/index.js +0 -3
- package/dist/components/HeatMap/index.js.map +0 -1
- package/dist/components/MetricList/MetricList.d.ts +0 -9
- package/dist/components/MetricList/MetricList.d.ts.map +0 -1
- package/dist/components/MetricList/MetricList.js +0 -6
- package/dist/components/MetricList/MetricList.js.map +0 -1
- package/dist/components/MetricList/MetricRow.d.ts +0 -13
- package/dist/components/MetricList/MetricRow.d.ts.map +0 -1
- package/dist/components/MetricList/MetricRow.js +0 -13
- package/dist/components/MetricList/MetricRow.js.map +0 -1
- package/dist/components/MetricList/index.d.ts +0 -3
- package/dist/components/MetricList/index.d.ts.map +0 -1
- package/dist/components/MetricList/index.js +0 -3
- package/dist/components/MetricList/index.js.map +0 -1
- package/dist/components/NavBottom/NavBottom.d.ts +0 -15
- package/dist/components/NavBottom/NavBottom.d.ts.map +0 -1
- package/dist/components/NavBottom/NavBottom.js +0 -19
- package/dist/components/NavBottom/NavBottom.js.map +0 -1
- package/dist/components/NavBottom/index.d.ts +0 -3
- package/dist/components/NavBottom/index.d.ts.map +0 -1
- package/dist/components/NavBottom/index.js +0 -2
- package/dist/components/NavBottom/index.js.map +0 -1
- package/dist/components/NavSide/NavItem.d.ts +0 -9
- package/dist/components/NavSide/NavItem.d.ts.map +0 -1
- package/dist/components/NavSide/NavItem.js +0 -13
- package/dist/components/NavSide/NavItem.js.map +0 -1
- package/dist/components/NavSide/NavSide.d.ts +0 -15
- package/dist/components/NavSide/NavSide.d.ts.map +0 -1
- package/dist/components/NavSide/NavSide.js +0 -10
- package/dist/components/NavSide/NavSide.js.map +0 -1
- package/dist/components/NavSide/index.d.ts +0 -3
- package/dist/components/NavSide/index.d.ts.map +0 -1
- package/dist/components/NavSide/index.js +0 -2
- package/dist/components/NavSide/index.js.map +0 -1
- package/dist/components/NavSide/types.d.ts +0 -38
- package/dist/components/NavSide/types.d.ts.map +0 -1
- package/dist/components/NavSide/types.js +0 -2
- package/dist/components/NavSide/types.js.map +0 -1
- package/dist/components/Pagination/Pagination.d.ts +0 -35
- package/dist/components/Pagination/Pagination.d.ts.map +0 -1
- package/dist/components/Pagination/Pagination.js +0 -26
- package/dist/components/Pagination/Pagination.js.map +0 -1
- package/dist/components/Pagination/index.d.ts +0 -3
- package/dist/components/Pagination/index.d.ts.map +0 -1
- package/dist/components/Pagination/index.js +0 -2
- package/dist/components/Pagination/index.js.map +0 -1
- package/dist/components/Skeleton/Skeleton.d.ts +0 -3
- package/dist/components/Skeleton/Skeleton.d.ts.map +0 -1
- package/dist/components/Skeleton/Skeleton.js +0 -7
- package/dist/components/Skeleton/Skeleton.js.map +0 -1
- package/dist/components/Skeleton/index.d.ts +0 -2
- package/dist/components/Skeleton/index.d.ts.map +0 -1
- package/dist/components/Skeleton/index.js +0 -2
- package/dist/components/Skeleton/index.js.map +0 -1
- package/dist/components/StatsCard/StatsCard.d.ts +0 -17
- package/dist/components/StatsCard/StatsCard.d.ts.map +0 -1
- package/dist/components/StatsCard/StatsCard.js +0 -13
- package/dist/components/StatsCard/StatsCard.js.map +0 -1
- package/dist/components/StatsCard/index.d.ts +0 -2
- package/dist/components/StatsCard/index.d.ts.map +0 -1
- package/dist/components/StatsCard/index.js +0 -2
- package/dist/components/StatsCard/index.js.map +0 -1
- package/dist/styles.css +0 -2
- package/dist/theme.generated.css +0 -438
- package/src/components/Avatar/Avatar.tsx +0 -19
- package/src/components/Avatar/index.ts +0 -1
- package/src/components/Breadcrumb/Breadcrumb.tsx +0 -47
- package/src/components/Breadcrumb/index.ts +0 -5
- package/src/components/ColorDot/ColorDot.tsx +0 -50
- package/src/components/ColorDot/index.ts +0 -1
- package/src/components/EmptyState/EmptyState.tsx +0 -29
- package/src/components/EmptyState/index.ts +0 -1
- package/src/components/HeatMap/HeatMapCalendar.tsx +0 -127
- package/src/components/HeatMap/HeatMapMatrix.tsx +0 -75
- package/src/components/HeatMap/heat-map.utils.ts +0 -15
- package/src/components/HeatMap/index.ts +0 -3
- package/src/components/MetricList/MetricList.tsx +0 -13
- package/src/components/MetricList/MetricRow.tsx +0 -30
- package/src/components/MetricList/index.ts +0 -2
- package/src/components/NavBottom/NavBottom.tsx +0 -53
- package/src/components/NavBottom/index.ts +0 -3
- package/src/components/NavSide/NavItem.tsx +0 -39
- package/src/components/NavSide/NavSide.tsx +0 -40
- package/src/components/NavSide/index.ts +0 -2
- package/src/components/NavSide/types.ts +0 -36
- package/src/components/Pagination/Pagination.tsx +0 -86
- package/src/components/Pagination/index.ts +0 -2
- package/src/components/Skeleton/Skeleton.tsx +0 -7
- package/src/components/Skeleton/index.ts +0 -1
- package/src/components/StatsCard/StatsCard.tsx +0 -40
- package/src/components/StatsCard/index.ts +0 -1
- 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,13 +1,23 @@
|
|
|
1
1
|
import { autoUpdate, FloatingPortal, flip, offset, shift, useClick, useDismiss, useFloating, useInteractions } from "@floating-ui/react";
|
|
2
2
|
import { useControllableState } from "@sixthshift/design-system/hooks";
|
|
3
3
|
import { cn } from "@sixthshift/design-system/utils";
|
|
4
|
-
import { Clock
|
|
5
|
-
import
|
|
6
|
-
import { useCallback, useId, useState } from "react";
|
|
7
|
-
import {
|
|
8
|
-
|
|
4
|
+
import { Clock } from "lucide-react";
|
|
5
|
+
import * as React from "react";
|
|
6
|
+
import { useCallback, useId, useMemo, useState } from "react";
|
|
7
|
+
import {
|
|
8
|
+
adaptDisabledDates,
|
|
9
|
+
fromISODateOrUndefined,
|
|
10
|
+
fromISOInstantOrUndefined,
|
|
11
|
+
fromISOTimeOrUndefined,
|
|
12
|
+
Temporal,
|
|
13
|
+
today,
|
|
14
|
+
toISOInstantOrUndefined,
|
|
15
|
+
} from "../../date-time";
|
|
16
|
+
|
|
17
|
+
import { PickerField } from "../../internal";
|
|
9
18
|
import { Button } from "../Button";
|
|
10
|
-
import {
|
|
19
|
+
import { CalendarView } from "../Calendar/CalendarView";
|
|
20
|
+
import { isDateDisabled } from "../Calendar/calendar.hooks";
|
|
11
21
|
import { Separator } from "../Separator";
|
|
12
22
|
import { PeriodSelector } from "../TimePicker/PeriodSelector";
|
|
13
23
|
import { TimeColumn } from "../TimePicker/TimeColumn";
|
|
@@ -22,46 +32,44 @@ import {
|
|
|
22
32
|
to24Hour,
|
|
23
33
|
} from "../TimePicker/timepicker.hooks";
|
|
24
34
|
import type { ParsedTime, TimePeriod } from "../TimePicker/timepicker.types";
|
|
35
|
+
import { DateTimeSegments } from "./DateTimeSegments";
|
|
25
36
|
import type { DateTimePickerProps } from "./datetimepicker.types";
|
|
26
37
|
|
|
27
|
-
/**
|
|
28
|
-
* Format an Instant for display
|
|
29
|
-
*/
|
|
30
|
-
function formatInstantDisplay(instant: Temporal.Instant, clockFormat: "12h" | "24h", showSeconds: boolean, timeZone?: string): string {
|
|
31
|
-
const tz = timeZone ?? Temporal.Now.timeZoneId();
|
|
32
|
-
const zoned = instant.toZonedDateTimeISO(tz);
|
|
33
|
-
const plainDateTime = zoned.toPlainDateTime();
|
|
34
|
-
|
|
35
|
-
// Format date part
|
|
36
|
-
const datePart = plainDateTime.toLocaleString("en-US", {
|
|
37
|
-
month: "long",
|
|
38
|
-
day: "numeric",
|
|
39
|
-
year: "numeric",
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
// Format time part based on props
|
|
43
|
-
const timeOptions: Intl.DateTimeFormatOptions = {
|
|
44
|
-
hour: "numeric",
|
|
45
|
-
minute: "2-digit",
|
|
46
|
-
hour12: clockFormat === "12h",
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
if (showSeconds) {
|
|
50
|
-
timeOptions.second = "2-digit";
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const timePart = plainDateTime.toLocaleString("en-US", timeOptions);
|
|
54
|
-
|
|
55
|
-
return `${datePart}, ${timePart}`;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
38
|
/**
|
|
59
39
|
* DateTimePicker - A component for selecting both date and time
|
|
60
40
|
*
|
|
61
|
-
* Combines date and time selection in a single popup with side-by-side layout
|
|
62
|
-
*
|
|
41
|
+
* Combines date and time selection in a single popup with side-by-side layout:
|
|
42
|
+
* a `Calendar` grid on the left, hour/minute(/second) columns on the right.
|
|
43
|
+
*
|
|
44
|
+
* The trigger is one typeable field of date *and* time segments — one value, so
|
|
45
|
+
* the digits roll straight from the year into the hour: `1520260330p` is January
|
|
46
|
+
* 5th 2026 at 3:30pm, typed without a tab. `segmentOrder` sets the date half's
|
|
47
|
+
* order (never inferred from the locale), `clockFormat` decides the hour's range
|
|
48
|
+
* and whether there is an AM/PM segment, and `Alt+ArrowDown` opens the popover
|
|
49
|
+
* on the month being typed. See `SegmentedField` for the whole keyboard model.
|
|
50
|
+
* It is not a composition of `DatePicker` and `TimePicker` — it builds
|
|
51
|
+
* directly on the same internal calendar grid and time-column primitives
|
|
52
|
+
* those two use, so the two stay visually consistent without either being
|
|
53
|
+
* mounted as a component.
|
|
54
|
+
*
|
|
55
|
+
* The value is a single absolute instant: an `ISOInstant` string
|
|
56
|
+
* (`"2026-08-26T00:30:00Z"`), always UTC and always ending in `Z`. It is
|
|
57
|
+
* edited in the viewer's local timezone (`Temporal.Now.timeZoneId()`) and
|
|
58
|
+
* converted to/from UTC at the boundary, so the same stored instant displays
|
|
59
|
+
* differently to viewers in different timezones. Input written with a
|
|
60
|
+
* numeric offset is normalised to the `Z` form. Supports controlled
|
|
61
|
+
* (`value`/`onChange`) and uncontrolled (`defaultValue`) use.
|
|
62
|
+
*
|
|
63
|
+
* Opening the popover seeds date and time drafts from the committed value (or
|
|
64
|
+
* today + the current time, if none); the footer's Apply combines them into
|
|
65
|
+
* an instant and commits, Cancel discards the draft. `minDate`/`maxDate` and
|
|
66
|
+
* `disabledDates` bound the date grid; `minTime`/`maxTime` bound the wall-clock
|
|
67
|
+
* time columns — these are plain date/time constraints on the picker's grid,
|
|
68
|
+
* not constraints on the resulting instant. `clockFormat` and `showSeconds`
|
|
69
|
+
* control the time columns; `clearable` (default `true`) shows the clear
|
|
70
|
+
* button.
|
|
63
71
|
*/
|
|
64
|
-
export const DateTimePicker = (props
|
|
72
|
+
export const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerProps>((props, ref) => {
|
|
65
73
|
const {
|
|
66
74
|
value,
|
|
67
75
|
defaultValue,
|
|
@@ -74,7 +82,6 @@ export const DateTimePicker = (props: DateTimePickerProps) => {
|
|
|
74
82
|
minuteStep = 1,
|
|
75
83
|
clockFormat = "12h",
|
|
76
84
|
showSeconds = false,
|
|
77
|
-
placeholder = "Select date and time...",
|
|
78
85
|
weekStartsOn = 0,
|
|
79
86
|
name,
|
|
80
87
|
isDisabled = false,
|
|
@@ -82,16 +89,38 @@ export const DateTimePicker = (props: DateTimePickerProps) => {
|
|
|
82
89
|
className,
|
|
83
90
|
align = "end",
|
|
84
91
|
clearable = true,
|
|
92
|
+
segmentOrder = "mdy",
|
|
85
93
|
} = props;
|
|
86
94
|
|
|
87
95
|
// Open state
|
|
88
96
|
const [open, setOpen] = useState(false);
|
|
97
|
+
// The day grid takes focus only when the popover was opened from the keyboard.
|
|
98
|
+
const [autoFocusDay, setAutoFocusDay] = useState(false);
|
|
99
|
+
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
// The ISO boundary.
|
|
102
|
+
//
|
|
103
|
+
// The value crosses as a canonical UTC instant string; constraints cross as
|
|
104
|
+
// ISO dates and times. Below this block everything is Temporal, exactly as
|
|
105
|
+
// before. Each conversion is memoised on its source string so the Temporal
|
|
106
|
+
// values stay referentially stable across renders.
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
|
|
109
|
+
const temporalValue = useMemo(() => fromISOInstantOrUndefined(value), [value]);
|
|
110
|
+
const temporalDefaultValue = useMemo(() => fromISOInstantOrUndefined(defaultValue), [defaultValue]);
|
|
111
|
+
const temporalMinDate = useMemo(() => fromISODateOrUndefined(minDate), [minDate]);
|
|
112
|
+
const temporalMaxDate = useMemo(() => fromISODateOrUndefined(maxDate), [maxDate]);
|
|
113
|
+
const temporalMinTime = useMemo(() => fromISOTimeOrUndefined(minTime), [minTime]);
|
|
114
|
+
const temporalMaxTime = useMemo(() => fromISOTimeOrUndefined(maxTime), [maxTime]);
|
|
115
|
+
const temporalDisabledDates = useMemo(() => adaptDisabledDates(disabledDates), [disabledDates]);
|
|
116
|
+
|
|
117
|
+
const handleChange = useCallback((next: Temporal.Instant | undefined) => onChange?.(toISOInstantOrUndefined(next)), [onChange]);
|
|
89
118
|
|
|
90
119
|
// Controllable value state (external/committed value)
|
|
91
|
-
const [committedValue, setCommittedValue] = useControllableState({
|
|
92
|
-
value,
|
|
93
|
-
defaultValue,
|
|
94
|
-
onChange,
|
|
120
|
+
const [committedValue, setCommittedValue] = useControllableState<Temporal.Instant | undefined>({
|
|
121
|
+
value: temporalValue,
|
|
122
|
+
defaultValue: temporalDefaultValue,
|
|
123
|
+
onChange: handleChange,
|
|
95
124
|
});
|
|
96
125
|
|
|
97
126
|
// Draft state (date + time parts)
|
|
@@ -117,6 +146,7 @@ export const DateTimePicker = (props: DateTimePickerProps) => {
|
|
|
117
146
|
// Sync draft when popup opens
|
|
118
147
|
const handleOpenChange = useCallback(
|
|
119
148
|
(newOpen: boolean) => {
|
|
149
|
+
if (!newOpen) setAutoFocusDay(false);
|
|
120
150
|
if (newOpen) {
|
|
121
151
|
const tz = Temporal.Now.timeZoneId();
|
|
122
152
|
if (committedValue) {
|
|
@@ -229,9 +259,82 @@ export const DateTimePicker = (props: DateTimePickerProps) => {
|
|
|
229
259
|
const inputId = `datetimepicker-input-${id}`;
|
|
230
260
|
|
|
231
261
|
// Display value (from committed value)
|
|
232
|
-
const displayValue = committedValue ? formatInstantDisplay(committedValue, clockFormat, showSeconds) : "";
|
|
233
262
|
const hasValue = Boolean(committedValue);
|
|
234
263
|
|
|
264
|
+
// ---------------------------------------------------------------------------
|
|
265
|
+
// The typeable field.
|
|
266
|
+
//
|
|
267
|
+
// The segments show the draft while the popover is open and the committed
|
|
268
|
+
// value while it is closed, so typing moves the grid and columns, and picking
|
|
269
|
+
// in either shows up in the segments. Open means the popover's Apply/Cancel
|
|
270
|
+
// owns the value; closed means a complete date-time commits as soon as it is
|
|
271
|
+
// complete.
|
|
272
|
+
//
|
|
273
|
+
// The draft is a date plus loose time parts, so it only composes into an
|
|
274
|
+
// instant once the date exists. Until then the field has nothing to show,
|
|
275
|
+
// which is exactly `undefined`.
|
|
276
|
+
// ---------------------------------------------------------------------------
|
|
277
|
+
|
|
278
|
+
const userZone = Temporal.Now.timeZoneId();
|
|
279
|
+
|
|
280
|
+
const draftInstant = useMemo(() => {
|
|
281
|
+
if (!draftDate) return undefined;
|
|
282
|
+
const parsed = getDraftTime();
|
|
283
|
+
return draftDate
|
|
284
|
+
.toPlainDateTime({ hour: parsed.hour, minute: parsed.minute, second: showSeconds ? parsed.second : 0 })
|
|
285
|
+
.toZonedDateTime(userZone)
|
|
286
|
+
.toInstant();
|
|
287
|
+
}, [draftDate, getDraftTime, showSeconds, userZone]);
|
|
288
|
+
|
|
289
|
+
const segmentValue = open ? draftInstant : committedValue;
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* A typed instant can fall outside what the grid and columns allow — the date
|
|
293
|
+
* past `maxDate`, or the time outside `minTime`/`maxTime`. The field flags it
|
|
294
|
+
* rather than clamping; see `DatePicker` for why.
|
|
295
|
+
*/
|
|
296
|
+
const outOfBounds = useMemo(() => {
|
|
297
|
+
if (!segmentValue) return false;
|
|
298
|
+
const zoned = segmentValue.toZonedDateTimeISO(userZone);
|
|
299
|
+
return (
|
|
300
|
+
isDateDisabled(zoned.toPlainDate(), temporalDisabledDates, temporalMinDate, temporalMaxDate) ||
|
|
301
|
+
isTimeDisabled(zoned.toPlainTime(), temporalMinTime, temporalMaxTime)
|
|
302
|
+
);
|
|
303
|
+
}, [segmentValue, temporalDisabledDates, temporalMaxDate, temporalMaxTime, temporalMinDate, temporalMinTime, userZone]);
|
|
304
|
+
|
|
305
|
+
const handleSegmentsChange = useCallback(
|
|
306
|
+
(instant: Temporal.Instant | undefined) => {
|
|
307
|
+
if (!open) {
|
|
308
|
+
setCommittedValue(instant);
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
if (!instant) {
|
|
312
|
+
setDraftDate(undefined);
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
const zoned = instant.toZonedDateTimeISO(userZone);
|
|
316
|
+
const parsed = temporalToParsed(zoned.toPlainTime());
|
|
317
|
+
setDraftDate(zoned.toPlainDate());
|
|
318
|
+
setMonth(zoned.toPlainDate());
|
|
319
|
+
setDraftHour(clockFormat === "12h" ? to12Hour(parsed.hour).hour12 : parsed.hour);
|
|
320
|
+
setDraftMinute(parsed.minute);
|
|
321
|
+
setDraftSecond(parsed.second);
|
|
322
|
+
setDraftPeriod(to12Hour(parsed.hour).period);
|
|
323
|
+
},
|
|
324
|
+
[clockFormat, open, setCommittedValue, userZone]
|
|
325
|
+
);
|
|
326
|
+
|
|
327
|
+
/** `Alt+ArrowDown` from a segment: open the popover *and* go to the grid. */
|
|
328
|
+
const openWithGridFocus = useCallback(() => {
|
|
329
|
+
setAutoFocusDay(true);
|
|
330
|
+
handleOpenChange(true);
|
|
331
|
+
}, [handleOpenChange]);
|
|
332
|
+
|
|
333
|
+
/** `Enter` in a segment commits the draft, matching the popover's Apply. */
|
|
334
|
+
const handleFieldSubmit = useCallback(() => {
|
|
335
|
+
if (open) handleApply();
|
|
336
|
+
}, [handleApply, open]);
|
|
337
|
+
|
|
235
338
|
// Time selection handlers
|
|
236
339
|
const handleHourChange = (hour: number) => setDraftHour(hour);
|
|
237
340
|
const handleMinuteChange = (minute: number) => setDraftMinute(minute);
|
|
@@ -250,47 +353,43 @@ export const DateTimePicker = (props: DateTimePickerProps) => {
|
|
|
250
353
|
const checkTimeDisabled = useCallback(
|
|
251
354
|
(hour: number, minute: number, second: number): boolean => {
|
|
252
355
|
const temporal = Temporal.PlainTime.from({ hour, minute, second });
|
|
253
|
-
return isTimeDisabled(temporal,
|
|
356
|
+
return isTimeDisabled(temporal, temporalMinTime, temporalMaxTime);
|
|
254
357
|
},
|
|
255
|
-
[
|
|
358
|
+
[temporalMinTime, temporalMaxTime]
|
|
256
359
|
);
|
|
257
360
|
|
|
258
361
|
return (
|
|
259
362
|
<>
|
|
260
363
|
{/* Trigger Input */}
|
|
261
|
-
<div className="relative flex items-center">
|
|
262
|
-
<
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
>
|
|
291
|
-
<X className="h-3.5 w-3.5" />
|
|
292
|
-
</button>
|
|
293
|
-
)}
|
|
364
|
+
<div ref={ref} className="relative flex items-center">
|
|
365
|
+
<PickerField
|
|
366
|
+
ref={refs.setReference as React.Ref<HTMLDivElement>}
|
|
367
|
+
className={cn("w-full min-w-80", className)}
|
|
368
|
+
icon={<Clock className="h-4 w-4" />}
|
|
369
|
+
toggleLabel="Open date and time picker"
|
|
370
|
+
toggleProps={getReferenceProps()}
|
|
371
|
+
isOpen={open}
|
|
372
|
+
contentId={contentId}
|
|
373
|
+
isDisabled={isDisabled}
|
|
374
|
+
isInvalid={isInvalid || outOfBounds}
|
|
375
|
+
onClear={clearable && hasValue && !isDisabled ? handleClear : undefined}
|
|
376
|
+
clearLabel="Clear date and time"
|
|
377
|
+
>
|
|
378
|
+
<DateTimeSegments
|
|
379
|
+
className="h-full flex-1"
|
|
380
|
+
id={inputId}
|
|
381
|
+
value={segmentValue}
|
|
382
|
+
onChange={handleSegmentsChange}
|
|
383
|
+
timeZone={userZone}
|
|
384
|
+
order={segmentOrder}
|
|
385
|
+
clockFormat={clockFormat}
|
|
386
|
+
showSeconds={showSeconds}
|
|
387
|
+
isDisabled={isDisabled}
|
|
388
|
+
isInvalid={isInvalid || outOfBounds}
|
|
389
|
+
onOpenRequest={openWithGridFocus}
|
|
390
|
+
onSubmit={handleFieldSubmit}
|
|
391
|
+
/>
|
|
392
|
+
</PickerField>
|
|
294
393
|
|
|
295
394
|
{/* Hidden input for form submission */}
|
|
296
395
|
{name && committedValue && <input type="hidden" name={name} value={committedValue.toString()} />}
|
|
@@ -303,24 +402,25 @@ export const DateTimePicker = (props: DateTimePickerProps) => {
|
|
|
303
402
|
ref={refs.setFloating}
|
|
304
403
|
id={contentId}
|
|
305
404
|
role="dialog"
|
|
306
|
-
aria-
|
|
405
|
+
aria-label="Choose date and time"
|
|
307
406
|
style={floatingStyles}
|
|
308
407
|
className="z-popover rounded-xl border border-border-normal bg-bg-normal p-4 shadow-lg"
|
|
309
408
|
{...getFloatingProps()}
|
|
310
409
|
>
|
|
311
410
|
<div className="flex gap-4">
|
|
312
411
|
{/* Date Calendar (left side) */}
|
|
313
|
-
<
|
|
412
|
+
<CalendarView
|
|
314
413
|
mode="single"
|
|
315
414
|
value={draftDate}
|
|
316
415
|
onSelect={setDraftDate as (date: Temporal.PlainDate | undefined) => void}
|
|
317
416
|
month={month}
|
|
318
417
|
onMonthChange={setMonth}
|
|
319
|
-
minDate={
|
|
320
|
-
maxDate={
|
|
321
|
-
disabled={
|
|
418
|
+
minDate={temporalMinDate}
|
|
419
|
+
maxDate={temporalMaxDate}
|
|
420
|
+
disabled={temporalDisabledDates}
|
|
322
421
|
weekStartsOn={weekStartsOn}
|
|
323
422
|
showFooter={false}
|
|
423
|
+
autoFocusDay={autoFocusDay}
|
|
324
424
|
/>
|
|
325
425
|
|
|
326
426
|
<Separator orientation="vertical" />
|
|
@@ -387,7 +487,7 @@ export const DateTimePicker = (props: DateTimePickerProps) => {
|
|
|
387
487
|
<Button type="button" variant="ghost" size="sm" onClick={handleCancel}>
|
|
388
488
|
Cancel
|
|
389
489
|
</Button>
|
|
390
|
-
<Button type="button" variant="solid" size="sm" onClick={handleApply}>
|
|
490
|
+
<Button type="button" variant="solid" intent="brand" size="sm" onClick={handleApply}>
|
|
391
491
|
Apply
|
|
392
492
|
</Button>
|
|
393
493
|
</div>
|
|
@@ -396,4 +496,5 @@ export const DateTimePicker = (props: DateTimePickerProps) => {
|
|
|
396
496
|
)}
|
|
397
497
|
</>
|
|
398
498
|
);
|
|
399
|
-
};
|
|
499
|
+
});
|
|
500
|
+
DateTimePicker.displayName = "DateTimePicker";
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { Temporal } from "../../date-time";
|
|
2
|
+
import { SegmentedField, type SegmentSpec, type SegmentValues } from "../../internal";
|
|
3
|
+
import { dateFromSegments, dateSpec, dateToSegments, parseDatePasteIn } from "../DatePicker/DateSegments";
|
|
4
|
+
import type { DateSegmentOrder } from "../DatePicker/datepicker.types";
|
|
5
|
+
import { timeCodec, timeSpec } from "../TimePicker/TimeSegments";
|
|
6
|
+
import type { ClockFormat } from "../TimePicker/timepicker.types";
|
|
7
|
+
|
|
8
|
+
export type DateTimeSegmentsProps = {
|
|
9
|
+
/** The instant the segments display, or `undefined` for an empty field. */
|
|
10
|
+
value: Temporal.Instant | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Fires with a complete instant, or `undefined` the moment the segments stop
|
|
13
|
+
* describing one. Never fires a partial value.
|
|
14
|
+
*/
|
|
15
|
+
onChange: (instant: Temporal.Instant | undefined) => void;
|
|
16
|
+
/** The zone the segments are read and written in. */
|
|
17
|
+
timeZone: string;
|
|
18
|
+
order?: DateSegmentOrder | undefined;
|
|
19
|
+
clockFormat?: ClockFormat | undefined;
|
|
20
|
+
showSeconds?: boolean | undefined;
|
|
21
|
+
isDisabled?: boolean | undefined;
|
|
22
|
+
isInvalid?: boolean | undefined;
|
|
23
|
+
label?: string | undefined;
|
|
24
|
+
onOpenRequest?: (() => void) | undefined;
|
|
25
|
+
onSubmit?: (() => void) | undefined;
|
|
26
|
+
id?: string | undefined;
|
|
27
|
+
className?: string | undefined;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The typeable half of `DateTimePicker`: one field of date *and* time segments.
|
|
32
|
+
*
|
|
33
|
+
* Deliberately one `SegmentedField` rather than a date field beside a time
|
|
34
|
+
* field: it is one value, so `Tab` and the digit roll-forward should carry
|
|
35
|
+
* straight from the year into the hour. `152026330p` is January 5th 2026 at
|
|
36
|
+
* 3:30pm, typed without a single tab.
|
|
37
|
+
*
|
|
38
|
+
* The date and time halves reuse the specs and codecs from `DatePicker` and
|
|
39
|
+
* `TimePicker`, so the three fields cannot drift apart in behaviour. What is
|
|
40
|
+
* specific here is the zone: segments are wall-clock, the value is an instant,
|
|
41
|
+
* and this is where that conversion happens.
|
|
42
|
+
*
|
|
43
|
+
* Internal to `DateTimePicker`; not exported from `./index.ts`.
|
|
44
|
+
*/
|
|
45
|
+
export function DateTimeSegments({
|
|
46
|
+
value,
|
|
47
|
+
onChange,
|
|
48
|
+
timeZone,
|
|
49
|
+
order = "mdy",
|
|
50
|
+
clockFormat = "12h",
|
|
51
|
+
showSeconds = false,
|
|
52
|
+
label = "Date and time",
|
|
53
|
+
...rest
|
|
54
|
+
}: DateTimeSegmentsProps) {
|
|
55
|
+
const format = showSeconds ? "HH:mm:ss" : "HH:mm";
|
|
56
|
+
// A space, not a slash: it separates the date from the time rather than one
|
|
57
|
+
// number from the next.
|
|
58
|
+
const spec: SegmentSpec[] = [...dateSpec(order), ...timeSpec(format, clockFormat, " ")];
|
|
59
|
+
const time = timeCodec(format, clockFormat);
|
|
60
|
+
|
|
61
|
+
const toSegments = (instant: Temporal.Instant | undefined): SegmentValues => {
|
|
62
|
+
if (!instant) return { ...dateToSegments(undefined), ...time.toSegments(undefined) };
|
|
63
|
+
const zoned = instant.toZonedDateTimeISO(timeZone);
|
|
64
|
+
return { ...dateToSegments(zoned.toPlainDate()), ...time.toSegments(zoned.toPlainTime()) };
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const fromSegments = (values: Record<string, number>): Temporal.Instant => {
|
|
68
|
+
const date = dateFromSegments(values);
|
|
69
|
+
const plainTime = time.fromSegments(values);
|
|
70
|
+
return date.toPlainDateTime(plainTime).toZonedDateTime(timeZone).toInstant();
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* A pasted string is split at the first space: the date half is read by the
|
|
75
|
+
* date field's rules (ISO always, otherwise the segment order) and the time
|
|
76
|
+
* half by the clock's. Either half alone is accepted, leaving the other empty.
|
|
77
|
+
*/
|
|
78
|
+
const parsePaste = (text: string): SegmentValues | null => {
|
|
79
|
+
const trimmed = text.trim();
|
|
80
|
+
// An ISO instant pastes as a whole.
|
|
81
|
+
try {
|
|
82
|
+
if (/\d{4}-\d{2}-\d{2}T/.test(trimmed)) return toSegments(Temporal.Instant.from(trimmed));
|
|
83
|
+
} catch {
|
|
84
|
+
// Not an instant after all; fall through to the halves below.
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const [datePart, ...timeParts] = trimmed.split(/\s+/);
|
|
88
|
+
const datePasted = datePart ? parseDatePasteIn(order)(datePart) : null;
|
|
89
|
+
const timePasted = timeParts.length > 0 ? time.parsePaste(timeParts.join(" ")) : null;
|
|
90
|
+
if (!datePasted && !timePasted) return null;
|
|
91
|
+
|
|
92
|
+
return {
|
|
93
|
+
...dateToSegments(undefined),
|
|
94
|
+
...time.toSegments(undefined),
|
|
95
|
+
...(datePasted ?? {}),
|
|
96
|
+
...(timePasted ?? {}),
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
return (
|
|
101
|
+
<SegmentedField<Temporal.Instant>
|
|
102
|
+
spec={spec}
|
|
103
|
+
value={value}
|
|
104
|
+
toSegments={toSegments}
|
|
105
|
+
fromSegments={fromSegments}
|
|
106
|
+
keyOf={(instant) => instant.toString()}
|
|
107
|
+
onChange={onChange}
|
|
108
|
+
parsePaste={parsePaste}
|
|
109
|
+
label={label}
|
|
110
|
+
{...rest}
|
|
111
|
+
/>
|
|
112
|
+
);
|
|
113
|
+
}
|
|
@@ -1,27 +1,32 @@
|
|
|
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";
|
|
13
|
+
import type { DateSegmentOrder } from "../DatePicker/datepicker.types";
|
|
10
14
|
|
|
11
15
|
export type DateTimePickerProps = {
|
|
12
|
-
// Value (controlled/uncontrolled)
|
|
13
|
-
value?:
|
|
14
|
-
defaultValue?:
|
|
15
|
-
|
|
16
|
+
// Value (controlled/uncontrolled) — an absolute instant, in UTC
|
|
17
|
+
value?: ISOInstant | undefined;
|
|
18
|
+
defaultValue?: ISOInstant | undefined;
|
|
19
|
+
/** Called with a canonical UTC instant string, or undefined when cleared. */
|
|
20
|
+
onChange?: (instant: ISOInstant | undefined) => void;
|
|
16
21
|
|
|
17
22
|
// Date constraints
|
|
18
|
-
minDate?:
|
|
19
|
-
maxDate?:
|
|
20
|
-
disabledDates?:
|
|
23
|
+
minDate?: ISODate;
|
|
24
|
+
maxDate?: ISODate;
|
|
25
|
+
disabledDates?: DisabledDates | DisabledDates[];
|
|
21
26
|
|
|
22
27
|
// Time constraints
|
|
23
|
-
minTime?:
|
|
24
|
-
maxTime?:
|
|
28
|
+
minTime?: ISOTime;
|
|
29
|
+
maxTime?: ISOTime;
|
|
25
30
|
minuteStep?: 1 | 5 | 10 | 15 | 30;
|
|
26
31
|
|
|
27
32
|
// Time format
|
|
@@ -29,9 +34,14 @@ export type DateTimePickerProps = {
|
|
|
29
34
|
showSeconds?: boolean; // Default: false
|
|
30
35
|
|
|
31
36
|
// Display
|
|
32
|
-
placeholder?: string;
|
|
33
37
|
weekStartsOn?: WeekStartsOn;
|
|
34
38
|
|
|
39
|
+
/**
|
|
40
|
+
* Segment order for the date half of the typeable field (default `mdy`).
|
|
41
|
+
* Never inferred from the locale — `08/09` is a different date under each.
|
|
42
|
+
*/
|
|
43
|
+
segmentOrder?: DateSegmentOrder;
|
|
44
|
+
|
|
35
45
|
// Form
|
|
36
46
|
name?: string;
|
|
37
47
|
|
|
@@ -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";
|