@sixthshift/design-system 0.3.0 → 0.5.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 +116 -12
- package/dist/components/Badge/Badge.d.ts +64 -9
- package/dist/components/Badge/Badge.d.ts.map +1 -1
- package/dist/components/Badge/Badge.js +54 -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 +12 -0
- package/dist/components/BarChart/BarChart.d.ts.map +1 -1
- package/dist/components/BarChart/BarChart.js +12 -0
- 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 +18 -4
- package/dist/components/Calendar/Calendar.d.ts.map +1 -1
- package/dist/components/Calendar/Calendar.js +19 -5
- package/dist/components/Calendar/Calendar.js.map +1 -1
- package/dist/components/Calendar/CalendarView.d.ts.map +1 -1
- package/dist/components/Calendar/CalendarView.js +10 -2
- package/dist/components/Calendar/CalendarView.js.map +1 -1
- package/dist/components/Calendar/calendar.types.d.ts +9 -0
- package/dist/components/Calendar/calendar.types.d.ts.map +1 -1
- package/dist/components/Card/Card.d.ts +61 -2
- package/dist/components/Card/Card.d.ts.map +1 -1
- package/dist/components/Card/Card.js +99 -3
- package/dist/components/Card/Card.js.map +1 -1
- package/dist/components/Card/index.d.ts +1 -1
- package/dist/components/Card/index.d.ts.map +1 -1
- package/dist/components/Card/index.js +1 -1
- package/dist/components/Card/index.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 +43 -0
- package/dist/components/DatePicker/DatePicker.d.ts.map +1 -1
- package/dist/components/DatePicker/DatePicker.js +166 -4
- 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 +19 -1
- package/dist/components/DatePicker/datepicker.types.d.ts.map +1 -1
- package/dist/components/DatePicker/index.d.ts +1 -1
- package/dist/components/DatePicker/index.d.ts.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.d.ts +20 -2
- package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.js +22 -4
- package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
- package/dist/components/DateRangePicker/daterangepicker.types.d.ts +6 -1
- package/dist/components/DateRangePicker/daterangepicker.types.d.ts.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.d.ts +30 -2
- package/dist/components/DateTimePicker/DateTimePicker.d.ts.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.js +105 -32
- 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 +6 -1
- package/dist/components/DateTimePicker/datetimepicker.types.d.ts.map +1 -1
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts +28 -2
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts.map +1 -1
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js +136 -58
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js.map +1 -1
- package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts +6 -1
- package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts.map +1 -1
- package/dist/components/Field/Field.d.ts +15 -17
- package/dist/components/Field/Field.d.ts.map +1 -1
- package/dist/components/Field/Field.js +18 -3
- 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 +17 -0
- package/dist/components/LineChart/LineChart.d.ts.map +1 -1
- package/dist/components/LineChart/LineChart.js +17 -0
- package/dist/components/LineChart/LineChart.js.map +1 -1
- package/dist/components/Markdown/Markdown.d.ts +17 -0
- package/dist/components/Markdown/Markdown.d.ts.map +1 -1
- package/dist/components/Markdown/Markdown.js +17 -0
- 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 +53 -17
- 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 +36 -0
- package/dist/components/Modal/Modal.d.ts.map +1 -1
- package/dist/components/Modal/Modal.js +37 -1
- package/dist/components/Modal/Modal.js.map +1 -1
- package/dist/components/Modal/components/ModalHeader.js +1 -1
- 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 +29 -0
- package/dist/components/Popover/Popover.js.map +1 -1
- package/dist/components/ProgressBar/ProgressBar.d.ts +14 -0
- package/dist/components/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/components/ProgressBar/ProgressBar.js +14 -0
- 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 +4 -5
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/Select.js +4 -5
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/Select/SelectDropdown.d.ts.map +1 -1
- package/dist/components/Select/SelectDropdown.js +4 -3
- package/dist/components/Select/SelectDropdown.js.map +1 -1
- package/dist/components/Select/SelectTrigger.js +2 -2
- package/dist/components/Select/SelectTrigger.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 +6 -0
- package/dist/components/Sheet/Sheet.d.ts.map +1 -1
- package/dist/components/Sheet/Sheet.js +7 -1
- package/dist/components/Sheet/Sheet.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.js +1 -1
- package/dist/components/Sheet/components/SheetHeader.js.map +1 -1
- package/dist/components/Sparkline/Sparkline.d.ts +11 -0
- package/dist/components/Sparkline/Sparkline.d.ts.map +1 -1
- package/dist/components/Sparkline/Sparkline.js +11 -0
- 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 +6 -0
- 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/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 +14 -12
- package/dist/components/TagChip/TagChip.d.ts.map +1 -1
- package/dist/components/TagChip/TagChip.js +14 -1
- package/dist/components/TagChip/TagChip.js.map +1 -1
- package/dist/components/TagInput/TagInput.d.ts +11 -8
- package/dist/components/TagInput/TagInput.d.ts.map +1 -1
- package/dist/components/TagInput/TagInput.js +11 -0
- 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 +32 -0
- package/dist/components/TimePicker/TimePicker.d.ts.map +1 -1
- package/dist/components/TimePicker/TimePicker.js +93 -6
- 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 +0 -2
- package/dist/components/TimePicker/timepicker.types.d.ts.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.map +1 -1
- package/dist/date-time/index.js +0 -1
- package/dist/date-time/index.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/lib/contexts/OverlayContext/OverlayContext.d.ts +2 -2
- package/dist/lib/contexts/OverlayContext/OverlayContext.d.ts.map +1 -1
- package/dist/lib/contexts/OverlayContext/OverlayContext.js +17 -6
- package/dist/lib/contexts/OverlayContext/OverlayContext.js.map +1 -1
- package/dist/theme/index.d.ts +2 -2
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +1 -1
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/schema.d.ts +0 -22
- package/dist/theme/schema.d.ts.map +1 -1
- package/dist/theme/schema.js +0 -9
- package/dist/theme/schema.js.map +1 -1
- package/package.json +7 -48
- package/src/components/Badge/Badge.tsx +85 -48
- package/src/components/Badge/index.ts +10 -1
- package/src/components/BarChart/BarChart.tsx +12 -0
- package/src/components/Button/Button.tsx +129 -106
- package/src/components/Button/index.ts +10 -1
- package/src/components/Calendar/Calendar.tsx +29 -16
- package/src/components/Calendar/CalendarView.tsx +10 -1
- package/src/components/Calendar/calendar.types.ts +10 -0
- package/src/components/Card/Card.tsx +114 -15
- package/src/components/Card/index.ts +1 -1
- 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 +279 -28
- package/src/components/DatePicker/DateSegments.tsx +125 -0
- package/src/components/DatePicker/datepicker.types.ts +21 -1
- package/src/components/DatePicker/index.ts +8 -1
- package/src/components/DateRangePicker/DateRangePicker.tsx +22 -4
- package/src/components/DateRangePicker/daterangepicker.types.ts +7 -1
- package/src/components/DateTimePicker/DateTimePicker.tsx +143 -70
- package/src/components/DateTimePicker/DateTimeSegments.tsx +113 -0
- package/src/components/DateTimePicker/datetimepicker.types.ts +7 -1
- package/src/components/DateTimeRangePicker/DateTimeRangePicker.tsx +195 -104
- package/src/components/DateTimeRangePicker/datetimerangepicker.types.ts +7 -1
- package/src/components/Field/Field.tsx +20 -22
- 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 +17 -0
- package/src/components/Markdown/Markdown.tsx +17 -0
- package/src/components/Message/Message.tsx +73 -23
- package/src/components/Message/index.ts +1 -1
- package/src/components/Modal/Modal.tsx +42 -3
- package/src/components/Modal/components/ModalHeader.tsx +1 -1
- package/src/components/Popover/Popover.tsx +29 -0
- package/src/components/ProgressBar/ProgressBar.tsx +14 -0
- 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 +4 -5
- package/src/components/Select/SelectDropdown.tsx +13 -9
- package/src/components/Select/SelectTrigger.tsx +7 -7
- package/src/components/Separator/Separator.tsx +10 -0
- package/src/components/Sheet/Sheet.tsx +8 -2
- package/src/components/Sheet/components/SheetFooter.tsx +1 -1
- package/src/components/Sheet/components/SheetHeader.tsx +2 -2
- package/src/components/Sparkline/Sparkline.tsx +11 -0
- 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/TabsTrigger.tsx +22 -5
- package/src/components/TagChip/TagChip.tsx +18 -16
- package/src/components/TagInput/TagInput.tsx +11 -8
- 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 +127 -39
- package/src/components/TimePicker/TimeSegments.tsx +131 -0
- package/src/components/TimePicker/timepicker.hooks.ts +1 -24
- package/src/components/TimePicker/timepicker.types.ts +0 -3
- 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 +0 -1
- package/src/internal/PickerField.tsx +90 -0
- package/src/internal/SegmentedField.tsx +445 -0
- package/src/internal/index.ts +2 -0
- package/src/lib/contexts/OverlayContext/OverlayContext.tsx +21 -10
- package/src/theme/index.ts +0 -6
- package/src/theme/recipes/badge.css +140 -0
- package/src/theme/recipes/button.css +167 -0
- package/src/theme/recipes/card.css +31 -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 +0 -27
- package/src/theme/tokens.css +26 -9
- 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 -19
- package/dist/components/ColorDot/ColorDot.d.ts.map +0 -1
- package/dist/components/ColorDot/ColorDot.js +0 -36
- 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 -26
- package/dist/components/EmptyState/EmptyState.d.ts.map +0 -1
- package/dist/components/EmptyState/EmptyState.js +0 -9
- 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 -8
- 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 -16
- package/dist/components/NavBottom/NavBottom.d.ts.map +0 -1
- package/dist/components/NavBottom/NavBottom.js +0 -21
- 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 -16
- package/dist/components/NavSide/NavSide.d.ts.map +0 -1
- package/dist/components/NavSide/NavSide.js +0 -12
- 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 -4
- package/dist/components/Skeleton/Skeleton.d.ts.map +0 -1
- package/dist/components/Skeleton/Skeleton.js +0 -9
- 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 -15
- 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/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 -52
- package/src/components/ColorDot/index.ts +0 -1
- package/src/components/EmptyState/EmptyState.tsx +0 -30
- 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 -18
- package/src/components/MetricList/MetricRow.tsx +0 -30
- package/src/components/MetricList/index.ts +0 -2
- package/src/components/NavBottom/NavBottom.tsx +0 -55
- package/src/components/NavBottom/index.ts +0 -3
- package/src/components/NavSide/NavItem.tsx +0 -39
- package/src/components/NavSide/NavSide.tsx +0 -42
- 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 -9
- package/src/components/Skeleton/index.ts +0 -1
- package/src/components/StatsCard/StatsCard.tsx +0 -41
- package/src/components/StatsCard/index.ts +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
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
|
|
4
|
+
import { Clock } from "lucide-react";
|
|
5
5
|
import * as React from "react";
|
|
6
6
|
import { useCallback, useId, useMemo, useState } from "react";
|
|
7
7
|
import {
|
|
@@ -14,8 +14,10 @@ import {
|
|
|
14
14
|
toISOInstantOrUndefined,
|
|
15
15
|
} from "../../date-time";
|
|
16
16
|
|
|
17
|
+
import { PickerField } from "../../internal";
|
|
17
18
|
import { Button } from "../Button";
|
|
18
19
|
import { CalendarView } from "../Calendar/CalendarView";
|
|
20
|
+
import { isDateDisabled } from "../Calendar/calendar.hooks";
|
|
19
21
|
import { Separator } from "../Separator";
|
|
20
22
|
import { PeriodSelector } from "../TimePicker/PeriodSelector";
|
|
21
23
|
import { TimeColumn } from "../TimePicker/TimeColumn";
|
|
@@ -30,44 +32,42 @@ import {
|
|
|
30
32
|
to24Hour,
|
|
31
33
|
} from "../TimePicker/timepicker.hooks";
|
|
32
34
|
import type { ParsedTime, TimePeriod } from "../TimePicker/timepicker.types";
|
|
35
|
+
import { DateTimeSegments } from "./DateTimeSegments";
|
|
33
36
|
import type { DateTimePickerProps } from "./datetimepicker.types";
|
|
34
37
|
|
|
35
|
-
/**
|
|
36
|
-
* Format an Instant for display
|
|
37
|
-
*/
|
|
38
|
-
function formatInstantDisplay(instant: Temporal.Instant, clockFormat: "12h" | "24h", showSeconds: boolean, timeZone?: string): string {
|
|
39
|
-
const tz = timeZone ?? Temporal.Now.timeZoneId();
|
|
40
|
-
const zoned = instant.toZonedDateTimeISO(tz);
|
|
41
|
-
const plainDateTime = zoned.toPlainDateTime();
|
|
42
|
-
|
|
43
|
-
// Format date part
|
|
44
|
-
const datePart = plainDateTime.toLocaleString("en-US", {
|
|
45
|
-
month: "long",
|
|
46
|
-
day: "numeric",
|
|
47
|
-
year: "numeric",
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
// Format time part based on props
|
|
51
|
-
const timeOptions: Intl.DateTimeFormatOptions = {
|
|
52
|
-
hour: "numeric",
|
|
53
|
-
minute: "2-digit",
|
|
54
|
-
hour12: clockFormat === "12h",
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
if (showSeconds) {
|
|
58
|
-
timeOptions.second = "2-digit";
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const timePart = plainDateTime.toLocaleString("en-US", timeOptions);
|
|
62
|
-
|
|
63
|
-
return `${datePart}, ${timePart}`;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
38
|
/**
|
|
67
39
|
* DateTimePicker - A component for selecting both date and time
|
|
68
40
|
*
|
|
69
|
-
* Combines date and time selection in a single popup with side-by-side layout
|
|
70
|
-
*
|
|
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.
|
|
71
71
|
*/
|
|
72
72
|
export const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerProps>((props, ref) => {
|
|
73
73
|
const {
|
|
@@ -82,7 +82,6 @@ export const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerPro
|
|
|
82
82
|
minuteStep = 1,
|
|
83
83
|
clockFormat = "12h",
|
|
84
84
|
showSeconds = false,
|
|
85
|
-
placeholder = "Select date and time...",
|
|
86
85
|
weekStartsOn = 0,
|
|
87
86
|
name,
|
|
88
87
|
isDisabled = false,
|
|
@@ -90,10 +89,13 @@ export const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerPro
|
|
|
90
89
|
className,
|
|
91
90
|
align = "end",
|
|
92
91
|
clearable = true,
|
|
92
|
+
segmentOrder = "mdy",
|
|
93
93
|
} = props;
|
|
94
94
|
|
|
95
95
|
// Open state
|
|
96
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);
|
|
97
99
|
|
|
98
100
|
// ---------------------------------------------------------------------------
|
|
99
101
|
// The ISO boundary.
|
|
@@ -144,6 +146,7 @@ export const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerPro
|
|
|
144
146
|
// Sync draft when popup opens
|
|
145
147
|
const handleOpenChange = useCallback(
|
|
146
148
|
(newOpen: boolean) => {
|
|
149
|
+
if (!newOpen) setAutoFocusDay(false);
|
|
147
150
|
if (newOpen) {
|
|
148
151
|
const tz = Temporal.Now.timeZoneId();
|
|
149
152
|
if (committedValue) {
|
|
@@ -256,9 +259,82 @@ export const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerPro
|
|
|
256
259
|
const inputId = `datetimepicker-input-${id}`;
|
|
257
260
|
|
|
258
261
|
// Display value (from committed value)
|
|
259
|
-
const displayValue = committedValue ? formatInstantDisplay(committedValue, clockFormat, showSeconds) : "";
|
|
260
262
|
const hasValue = Boolean(committedValue);
|
|
261
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
|
+
|
|
262
338
|
// Time selection handlers
|
|
263
339
|
const handleHourChange = (hour: number) => setDraftHour(hour);
|
|
264
340
|
const handleMinuteChange = (minute: number) => setDraftMinute(minute);
|
|
@@ -286,38 +362,34 @@ export const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerPro
|
|
|
286
362
|
<>
|
|
287
363
|
{/* Trigger Input */}
|
|
288
364
|
<div ref={ref} className="relative flex items-center">
|
|
289
|
-
<
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
>
|
|
318
|
-
<X className="h-3.5 w-3.5" />
|
|
319
|
-
</button>
|
|
320
|
-
)}
|
|
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>
|
|
321
393
|
|
|
322
394
|
{/* Hidden input for form submission */}
|
|
323
395
|
{name && committedValue && <input type="hidden" name={name} value={committedValue.toString()} />}
|
|
@@ -330,7 +402,7 @@ export const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerPro
|
|
|
330
402
|
ref={refs.setFloating}
|
|
331
403
|
id={contentId}
|
|
332
404
|
role="dialog"
|
|
333
|
-
aria-
|
|
405
|
+
aria-label="Choose date and time"
|
|
334
406
|
style={floatingStyles}
|
|
335
407
|
className="z-popover rounded-xl border border-border-normal bg-bg-normal p-4 shadow-lg"
|
|
336
408
|
{...getFloatingProps()}
|
|
@@ -348,6 +420,7 @@ export const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerPro
|
|
|
348
420
|
disabled={temporalDisabledDates}
|
|
349
421
|
weekStartsOn={weekStartsOn}
|
|
350
422
|
showFooter={false}
|
|
423
|
+
autoFocusDay={autoFocusDay}
|
|
351
424
|
/>
|
|
352
425
|
|
|
353
426
|
<Separator orientation="vertical" />
|
|
@@ -414,7 +487,7 @@ export const DateTimePicker = React.forwardRef<HTMLDivElement, DateTimePickerPro
|
|
|
414
487
|
<Button type="button" variant="ghost" size="sm" onClick={handleCancel}>
|
|
415
488
|
Cancel
|
|
416
489
|
</Button>
|
|
417
|
-
<Button type="button" variant="solid" size="sm" onClick={handleApply}>
|
|
490
|
+
<Button type="button" variant="solid" intent="brand" size="sm" onClick={handleApply}>
|
|
418
491
|
Apply
|
|
419
492
|
</Button>
|
|
420
493
|
</div>
|
|
@@ -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
|
+
}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import type { DisabledDates, ISODate, ISOInstant, ISOTime, WeekStartsOn } from "../../date-time";
|
|
13
|
+
import type { DateSegmentOrder } from "../DatePicker/datepicker.types";
|
|
13
14
|
|
|
14
15
|
export type DateTimePickerProps = {
|
|
15
16
|
// Value (controlled/uncontrolled) — an absolute instant, in UTC
|
|
@@ -33,9 +34,14 @@ export type DateTimePickerProps = {
|
|
|
33
34
|
showSeconds?: boolean; // Default: false
|
|
34
35
|
|
|
35
36
|
// Display
|
|
36
|
-
placeholder?: string;
|
|
37
37
|
weekStartsOn?: WeekStartsOn;
|
|
38
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
|
+
|
|
39
45
|
// Form
|
|
40
46
|
name?: string;
|
|
41
47
|
|