@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
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import type { Temporal } from "../../date-time";
|
|
2
|
+
import { SegmentedField, type SegmentSpec, type SegmentValues } from "../../internal";
|
|
3
|
+
import { parsedToTemporal, temporalTimeToISO, to12Hour, to24Hour } from "./timepicker.hooks";
|
|
4
|
+
import type { ClockFormat, TimeFormat } from "./timepicker.types";
|
|
5
|
+
|
|
6
|
+
export type TimeSegmentsProps = {
|
|
7
|
+
/** The time the segments display. `undefined` leaves them empty. */
|
|
8
|
+
value: Temporal.PlainTime | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Fires with a complete time, or `undefined` the moment the segments stop
|
|
11
|
+
* describing one. Never fires a partial time.
|
|
12
|
+
*/
|
|
13
|
+
onChange: (time: Temporal.PlainTime | undefined) => void;
|
|
14
|
+
/** `"HH:mm:ss"` adds a seconds segment. */
|
|
15
|
+
format?: TimeFormat | undefined;
|
|
16
|
+
/** `"12h"` runs the hour 1–12 and adds an AM/PM segment. */
|
|
17
|
+
clockFormat?: ClockFormat | undefined;
|
|
18
|
+
isDisabled?: boolean | undefined;
|
|
19
|
+
isInvalid?: boolean | undefined;
|
|
20
|
+
label?: string | undefined;
|
|
21
|
+
onOpenRequest?: (() => void) | undefined;
|
|
22
|
+
onSubmit?: (() => void) | undefined;
|
|
23
|
+
id?: string | undefined;
|
|
24
|
+
className?: string | undefined;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const PERIODS = ["AM", "PM"];
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The segments for a clock, which depend on both format props: the hour's range
|
|
31
|
+
* is the difference between a 12-hour and a 24-hour clock, and AM/PM only exists
|
|
32
|
+
* in the former.
|
|
33
|
+
*/
|
|
34
|
+
export function timeSpec(format: TimeFormat, clockFormat: ClockFormat, leadingSeparator?: string): SegmentSpec[] {
|
|
35
|
+
const twelve = clockFormat === "12h";
|
|
36
|
+
const spec: SegmentSpec[] = [
|
|
37
|
+
{ name: "hour", label: "Hour", placeholder: "hh", digits: 2, min: twelve ? 1 : 0, max: twelve ? 12 : 23, separatorBefore: leadingSeparator },
|
|
38
|
+
{ name: "minute", label: "Minute", placeholder: "mm", digits: 2, min: 0, max: 59, separatorBefore: ":" },
|
|
39
|
+
];
|
|
40
|
+
if (format === "HH:mm:ss") {
|
|
41
|
+
spec.push({ name: "second", label: "Second", placeholder: "ss", digits: 2, min: 0, max: 59, separatorBefore: ":" });
|
|
42
|
+
}
|
|
43
|
+
if (twelve) {
|
|
44
|
+
// A choice segment rather than a number: `a` and `p` type it, arrows toggle
|
|
45
|
+
// it, and it announces "AM" instead of an index.
|
|
46
|
+
spec.push({ kind: "choice", name: "period", label: "AM/PM", placeholder: "--", options: PERIODS, separatorBefore: " " });
|
|
47
|
+
}
|
|
48
|
+
return spec;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function timeCodec(format: TimeFormat, clockFormat: ClockFormat) {
|
|
52
|
+
const twelve = clockFormat === "12h";
|
|
53
|
+
const withSeconds = format === "HH:mm:ss";
|
|
54
|
+
|
|
55
|
+
const toSegments = (time: Temporal.PlainTime | undefined): SegmentValues => {
|
|
56
|
+
if (!time) {
|
|
57
|
+
return {
|
|
58
|
+
hour: null,
|
|
59
|
+
minute: null,
|
|
60
|
+
...(withSeconds ? { second: null } : {}),
|
|
61
|
+
...(twelve ? { period: null } : {}),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const { hour12, period } = to12Hour(time.hour);
|
|
65
|
+
return {
|
|
66
|
+
hour: twelve ? hour12 : time.hour,
|
|
67
|
+
minute: time.minute,
|
|
68
|
+
...(withSeconds ? { second: time.second } : {}),
|
|
69
|
+
...(twelve ? { period: period === "PM" ? 1 : 0 } : {}),
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const fromSegments = (values: Record<string, number>): Temporal.PlainTime => {
|
|
74
|
+
const hour = twelve ? to24Hour(values.hour!, values.period === 1 ? "PM" : "AM") : values.hour!;
|
|
75
|
+
// Seconds are part of the value even when the field does not show them —
|
|
76
|
+
// `onChange` always emits canonical `HH:MM:SS`.
|
|
77
|
+
return parsedToTemporal({ hour, minute: values.minute!, second: withSeconds ? values.second! : 0 });
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* A pasted time is read as `H:MM`, `H:MM:SS`, optionally followed by a
|
|
82
|
+
* meridiem. The hour is interpreted in the field's own clock, so `9:30 PM`
|
|
83
|
+
* pasted into a 24-hour field still lands on 21:30.
|
|
84
|
+
*/
|
|
85
|
+
const parsePaste = (text: string): SegmentValues | null => {
|
|
86
|
+
const match = /^(\d{1,2}):(\d{2})(?::(\d{2}))?\s*(am|pm)?$/i.exec(text.trim());
|
|
87
|
+
if (!match) return null;
|
|
88
|
+
const meridiem = match[4]?.toUpperCase();
|
|
89
|
+
let hour = Number(match[1]);
|
|
90
|
+
if (meridiem) hour = to24Hour(hour, meridiem === "PM" ? "PM" : "AM");
|
|
91
|
+
if (hour > 23 || Number(match[2]) > 59) return null;
|
|
92
|
+
const second = match[3] === undefined ? 0 : Number(match[3]);
|
|
93
|
+
if (second > 59) return null;
|
|
94
|
+
return toSegments(parsedToTemporal({ hour, minute: Number(match[2]), second }));
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
return { toSegments, fromSegments, parsePaste };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* The typeable half of `TimePicker`: a time as spinbutton segments.
|
|
102
|
+
*
|
|
103
|
+
* A thin spec over `SegmentedField`, which owns the keyboard model. What belongs
|
|
104
|
+
* to clocks specifically lives here: the hour's range and the AM/PM segment,
|
|
105
|
+
* both decided by `clockFormat`, and the fact that the value always carries
|
|
106
|
+
* seconds even when the field does not show them.
|
|
107
|
+
*
|
|
108
|
+
* `minuteStep` deliberately does not constrain typing. It sets the popover
|
|
109
|
+
* column's increment, but snapping a typed `:37` onto a 15-minute grid would
|
|
110
|
+
* fight the keystrokes.
|
|
111
|
+
*
|
|
112
|
+
* Internal to `TimePicker`; not exported from `./index.ts`.
|
|
113
|
+
*/
|
|
114
|
+
export function TimeSegments({ value, onChange, format = "HH:mm", clockFormat = "12h", label = "Time", ...rest }: TimeSegmentsProps) {
|
|
115
|
+
const spec = timeSpec(format, clockFormat);
|
|
116
|
+
const { toSegments, fromSegments, parsePaste } = timeCodec(format, clockFormat);
|
|
117
|
+
|
|
118
|
+
return (
|
|
119
|
+
<SegmentedField<Temporal.PlainTime>
|
|
120
|
+
spec={spec}
|
|
121
|
+
value={value}
|
|
122
|
+
toSegments={toSegments}
|
|
123
|
+
fromSegments={fromSegments}
|
|
124
|
+
keyOf={(time) => temporalTimeToISO(time, "HH:mm:ss")}
|
|
125
|
+
onChange={onChange}
|
|
126
|
+
parsePaste={parsePaste}
|
|
127
|
+
label={label}
|
|
128
|
+
{...rest}
|
|
129
|
+
/>
|
|
130
|
+
);
|
|
131
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Temporal } from "../../date-time";
|
|
2
2
|
import type { ClockFormat, ParsedTime, TimeFormat, TimePeriod } from "./timepicker.types";
|
|
3
3
|
|
|
4
4
|
// =============================================================================
|
|
@@ -41,29 +41,6 @@ export function temporalTimeToISO(time: Temporal.PlainTime, format: TimeFormat =
|
|
|
41
41
|
// Time Formatting
|
|
42
42
|
// =============================================================================
|
|
43
43
|
|
|
44
|
-
/**
|
|
45
|
-
* Format Temporal.PlainTime for display
|
|
46
|
-
*/
|
|
47
|
-
export function formatTimeDisplay(time: Temporal.PlainTime, clockFormat: ClockFormat = "12h", format: TimeFormat = "HH:mm"): string {
|
|
48
|
-
if (clockFormat === "12h") {
|
|
49
|
-
return formatTimePadded(time);
|
|
50
|
-
}
|
|
51
|
-
// 24h format
|
|
52
|
-
if (format === "HH:mm:ss") {
|
|
53
|
-
return time.toLocaleString("en-US", {
|
|
54
|
-
hour: "2-digit",
|
|
55
|
-
minute: "2-digit",
|
|
56
|
-
second: "2-digit",
|
|
57
|
-
hour12: false,
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
return time.toLocaleString("en-US", {
|
|
61
|
-
hour: "2-digit",
|
|
62
|
-
minute: "2-digit",
|
|
63
|
-
hour12: false,
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
|
|
67
44
|
// =============================================================================
|
|
68
45
|
// Time Comparison
|
|
69
46
|
// =============================================================================
|
|
@@ -31,6 +31,33 @@ export type ToastProps = Omit<MessageProps, "size"> & {
|
|
|
31
31
|
// Toast
|
|
32
32
|
// =============================================================================
|
|
33
33
|
|
|
34
|
+
/**
|
|
35
|
+
* A transient notification for the outcome of an action that already
|
|
36
|
+
* happened — a save, a delete, a failed request — self-positioned bottom
|
|
37
|
+
* center. Reach for `Toast` over `Message` when the feedback is about an
|
|
38
|
+
* action and shouldn't stick around in the page's layout; reach for
|
|
39
|
+
* `Message` when the feedback belongs inline, in the place the caller puts
|
|
40
|
+
* it (a form's own validation state, an in-card page-load error).
|
|
41
|
+
*
|
|
42
|
+
* Toast renders `Message` internally (`<Message intent={intent}>` wrapping
|
|
43
|
+
* `MessageIcon`/`MessageBody`/`MessageTitle`/`MessageDescription`), so it
|
|
44
|
+
* inherits Message's live-region role mapping: `intent="danger"` gets
|
|
45
|
+
* `role="alert"` (assertive), everything else gets `role="status"` (polite).
|
|
46
|
+
* `action`/`onAction` render a link-style button inside the description; the
|
|
47
|
+
* dismiss (X) button only renders when `onClose` is provided.
|
|
48
|
+
*
|
|
49
|
+
* `standalone` (default `true`) controls positioning: when `true`, Toast
|
|
50
|
+
* portals itself (`FloatingPortal`, optionally to a custom `root`) and
|
|
51
|
+
* applies the fixed bottom-center classes itself. Set it to `false` when a
|
|
52
|
+
* parent already handles portalling and position — this is how
|
|
53
|
+
* `OverlayContext`'s toast stack renders it. Toast has no built-in
|
|
54
|
+
* auto-dismiss timer; that's `useToast`'s job, one layer up.
|
|
55
|
+
*
|
|
56
|
+
* Exit animation (`usePresence`) keeps Toast mounted through its fade-out,
|
|
57
|
+
* so `onClose` fires only after the animation completes. Toast has no focus
|
|
58
|
+
* trap and no Escape handling of its own — it's a passive notification, not
|
|
59
|
+
* a dialog.
|
|
60
|
+
*/
|
|
34
61
|
export const Toast = React.forwardRef<HTMLDivElement, ToastProps>(
|
|
35
62
|
({ className, intent = "neutral", title, icon, action, onAction, onClose, root, standalone = true, children, ...props }, ref) => {
|
|
36
63
|
const { ref: presenceRef, state, isMounted, show, hide } = usePresence();
|
|
@@ -93,7 +120,7 @@ export const Toast = React.forwardRef<HTMLDivElement, ToastProps>(
|
|
|
93
120
|
</MessageDescription>
|
|
94
121
|
</MessageBody>
|
|
95
122
|
{onClose && (
|
|
96
|
-
<Button variant="ghost"
|
|
123
|
+
<Button variant="ghost" iconOnly className="h-6 w-6 shrink-0 opacity-70 hover:opacity-100" onClick={handleClose} aria-label="Dismiss">
|
|
97
124
|
<X className="h-4 w-4" />
|
|
98
125
|
</Button>
|
|
99
126
|
)}
|
|
@@ -1,40 +1,20 @@
|
|
|
1
1
|
import { useControllableState } from "@sixthshift/design-system/hooks";
|
|
2
2
|
import { cn } from "@sixthshift/design-system/utils";
|
|
3
|
-
import {
|
|
3
|
+
import type { VariantProps } from "class-variance-authority";
|
|
4
4
|
import * as React from "react";
|
|
5
|
-
import { buttonVariants } from "../Button/Button";
|
|
5
|
+
import { type ButtonIntent, type ButtonVariant, buttonRecipe, type buttonVariants } from "../Button/Button";
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* `variant` and `intent` are no longer CVA variants on `buttonVariants` — they
|
|
9
|
+
* select a recipe cell in CSS — so they are declared here rather than inherited
|
|
10
|
+
* through `VariantProps`, which now yields `size` alone.
|
|
10
11
|
*/
|
|
11
|
-
const togglePressedVariants = cva("", {
|
|
12
|
-
variants: {
|
|
13
|
-
variant: { solid: "", outline: "", ghost: "", link: "" },
|
|
14
|
-
intent: { neutral: "", danger: "", success: "", warning: "" },
|
|
15
|
-
},
|
|
16
|
-
compoundVariants: [
|
|
17
|
-
// Solid — use the main -pressed background
|
|
18
|
-
{ variant: "solid", intent: "neutral", className: "bg-bg-brand-pressed hover:bg-bg-brand-pressed" },
|
|
19
|
-
{ variant: "solid", intent: "danger", className: "bg-bg-danger-pressed hover:bg-bg-danger-pressed" },
|
|
20
|
-
{ variant: "solid", intent: "success", className: "bg-bg-success-pressed hover:bg-bg-success-pressed" },
|
|
21
|
-
{ variant: "solid", intent: "warning", className: "bg-bg-warning-pressed hover:bg-bg-warning-pressed" },
|
|
22
|
-
// Outline — use the subtle -pressed background
|
|
23
|
-
{ variant: "outline", intent: "neutral", className: "bg-bg-subtle-pressed text-fg-normal hover:bg-bg-subtle-pressed" },
|
|
24
|
-
{ variant: "outline", intent: "danger", className: "bg-bg-danger-subtle-pressed text-fg-on-danger-subtle-pressed hover:bg-bg-danger-subtle-pressed" },
|
|
25
|
-
{ variant: "outline", intent: "success", className: "bg-bg-success-subtle-pressed text-fg-on-success-subtle-pressed hover:bg-bg-success-subtle-pressed" },
|
|
26
|
-
{ variant: "outline", intent: "warning", className: "bg-bg-warning-subtle-pressed text-fg-on-warning-subtle-pressed hover:bg-bg-warning-subtle-pressed" },
|
|
27
|
-
// Ghost — same as outline
|
|
28
|
-
{ variant: "ghost", intent: "neutral", className: "bg-bg-subtle-pressed text-fg-normal hover:bg-bg-subtle-pressed" },
|
|
29
|
-
{ variant: "ghost", intent: "danger", className: "bg-bg-danger-subtle-pressed text-fg-on-danger-subtle-pressed hover:bg-bg-danger-subtle-pressed" },
|
|
30
|
-
{ variant: "ghost", intent: "success", className: "bg-bg-success-subtle-pressed text-fg-on-success-subtle-pressed hover:bg-bg-success-subtle-pressed" },
|
|
31
|
-
{ variant: "ghost", intent: "warning", className: "bg-bg-warning-subtle-pressed text-fg-on-warning-subtle-pressed hover:bg-bg-warning-subtle-pressed" },
|
|
32
|
-
],
|
|
33
|
-
defaultVariants: { variant: "solid", intent: "neutral" },
|
|
34
|
-
});
|
|
35
|
-
|
|
36
12
|
export type ToggleProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "onChange" | "value"> &
|
|
37
13
|
VariantProps<typeof buttonVariants> & {
|
|
14
|
+
variant?: ButtonVariant | undefined;
|
|
15
|
+
intent?: ButtonIntent | undefined;
|
|
16
|
+
/** Square the toggle at its current size, for an icon with no label. */
|
|
17
|
+
iconOnly?: boolean;
|
|
38
18
|
/** Controlled pressed state */
|
|
39
19
|
pressed?: boolean;
|
|
40
20
|
/** Default pressed state for uncontrolled mode */
|
|
@@ -43,14 +23,35 @@ export type ToggleProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "o
|
|
|
43
23
|
onPressedChange?: (pressed: boolean) => void;
|
|
44
24
|
};
|
|
45
25
|
|
|
26
|
+
/**
|
|
27
|
+
* A single button that toggles between pressed and unpressed, for a binary
|
|
28
|
+
* setting styled like an action (e.g. a bold/italic button in a toolbar) —
|
|
29
|
+
* for a set of mutually exclusive or multi-select options, use `ToggleGroup`
|
|
30
|
+
* instead.
|
|
31
|
+
*
|
|
32
|
+
* Built directly on Button: it calls `buttonRecipe(...)` and takes the same
|
|
33
|
+
* `variant`/`intent`/`size` axes Button does, plus `iconOnly` for a toolbar
|
|
34
|
+
* toggle whose whole content is an icon. The
|
|
35
|
+
* pressed-state colour mapping lives in `src/theme/recipes/toggle.css`,
|
|
36
|
+
* keyed off the `data-state="on" | "off"` attribute this component renders
|
|
37
|
+
* alongside `aria-pressed`.
|
|
38
|
+
*
|
|
39
|
+
* Controlled via `pressed`/`defaultPressed`/`onPressedChange`
|
|
40
|
+
* (`useControllableState`).
|
|
41
|
+
*/
|
|
46
42
|
const Toggle = React.forwardRef<HTMLButtonElement, ToggleProps>(
|
|
47
|
-
(
|
|
43
|
+
(
|
|
44
|
+
{ className, variant, intent, size, iconOnly = false, pressed: controlledPressed, defaultPressed = false, onPressedChange, disabled, children, ...props },
|
|
45
|
+
ref
|
|
46
|
+
) => {
|
|
48
47
|
const [pressed, setPressed] = useControllableState({
|
|
49
48
|
value: controlledPressed,
|
|
50
49
|
defaultValue: defaultPressed,
|
|
51
50
|
onChange: onPressedChange,
|
|
52
51
|
});
|
|
53
52
|
|
|
53
|
+
const recipe = buttonRecipe({ variant, intent, size, iconOnly });
|
|
54
|
+
|
|
54
55
|
return (
|
|
55
56
|
<button
|
|
56
57
|
type="button"
|
|
@@ -59,7 +60,8 @@ const Toggle = React.forwardRef<HTMLButtonElement, ToggleProps>(
|
|
|
59
60
|
disabled={disabled}
|
|
60
61
|
ref={ref}
|
|
61
62
|
onClick={() => setPressed(!pressed)}
|
|
62
|
-
|
|
63
|
+
{...recipe}
|
|
64
|
+
className={cn(recipe.className, className)}
|
|
63
65
|
{...props}
|
|
64
66
|
>
|
|
65
67
|
{children}
|
|
@@ -69,4 +71,4 @@ const Toggle = React.forwardRef<HTMLButtonElement, ToggleProps>(
|
|
|
69
71
|
);
|
|
70
72
|
Toggle.displayName = "Toggle";
|
|
71
73
|
|
|
72
|
-
export { Toggle
|
|
74
|
+
export { Toggle };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { Toggle, type ToggleProps
|
|
1
|
+
export { Toggle, type ToggleProps } from "./Toggle";
|
|
@@ -3,6 +3,23 @@ import { ToggleGroupMultiple } from "./ToggleGroupMultiple";
|
|
|
3
3
|
import { ToggleGroupSingle } from "./ToggleGroupSingle";
|
|
4
4
|
import type { ToggleGroupProps } from "./toggleGroup.types";
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* A group of `Toggle`-styled buttons for choosing one or more options,
|
|
8
|
+
* switched by `type`: `"single"` renders `role="radiogroup"` with
|
|
9
|
+
* `role="radio"` items — one tab stop, arrow keys move focus and selection
|
|
10
|
+
* together (clicking the already-selected item is a no-op, there's no
|
|
11
|
+
* deselect) — while `"multiple"` renders `role="group"` with `aria-pressed`
|
|
12
|
+
* items, each independently tabbable and toggled on its own. `value`/
|
|
13
|
+
* `defaultValue`/`onValueChange` follow `type`: a string for single, a
|
|
14
|
+
* string array for multiple (`useControllableState`).
|
|
15
|
+
*
|
|
16
|
+
* Items are built on the same `buttonRecipe` as `Button`/`Toggle` and take
|
|
17
|
+
* the same `variant`/`intent`, with two differences: `variant` excludes
|
|
18
|
+
* `"link"` (no clear pressed state for an underline in a group) and `size`
|
|
19
|
+
* excludes `"xl"` (too large for grouped toggles) — see
|
|
20
|
+
* `toggleGroup.types.ts`. `appearance` chooses `"segmented"` (items joined
|
|
21
|
+
* into one border) or `"separate"` (individually bordered, gapped) rendering.
|
|
22
|
+
*/
|
|
6
23
|
const ToggleGroup = React.forwardRef<HTMLDivElement, ToggleGroupProps>((props, ref) => {
|
|
7
24
|
if (props.type === "multiple") {
|
|
8
25
|
return <ToggleGroupMultiple ref={ref} {...props} />;
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { cn } from "@sixthshift/design-system/utils";
|
|
2
2
|
import * as React from "react";
|
|
3
|
-
import {
|
|
4
|
-
import { togglePressedVariants } from "../Toggle/Toggle";
|
|
3
|
+
import { buttonRecipe } from "../Button/Button";
|
|
5
4
|
import type { ToggleGroupBaseProps, ToggleGroupOption } from "./toggleGroup.types";
|
|
6
5
|
|
|
7
6
|
type ItemProps = React.ButtonHTMLAttributes<HTMLButtonElement> &
|
|
8
|
-
Required<Pick<ToggleGroupBaseProps, "appearance" | "orientation" | "variant" | "intent" | "size">> & {
|
|
7
|
+
Required<Pick<ToggleGroupBaseProps, "appearance" | "orientation" | "variant" | "intent" | "size" | "iconOnly">> & {
|
|
9
8
|
option: ToggleGroupOption;
|
|
10
9
|
selected: boolean;
|
|
11
10
|
groupDisabled?: boolean | undefined;
|
|
@@ -14,24 +13,30 @@ type ItemProps = React.ButtonHTMLAttributes<HTMLButtonElement> &
|
|
|
14
13
|
};
|
|
15
14
|
|
|
16
15
|
const ToggleGroupItem = React.forwardRef<HTMLButtonElement, ItemProps>(
|
|
17
|
-
({ option, selected, groupDisabled, appearance, orientation, variant, intent, size, index, total, ...props }, ref) => {
|
|
16
|
+
({ option, selected, groupDisabled, appearance, orientation, variant, intent, size, iconOnly, index, total, ...props }, ref) => {
|
|
18
17
|
const isDisabled = groupDisabled || option.disabled;
|
|
19
18
|
const isFirst = index === 0;
|
|
20
19
|
const isLast = index === total - 1;
|
|
21
20
|
const isVertical = orientation === "vertical";
|
|
22
21
|
const isSegmented = appearance === "segmented";
|
|
23
22
|
|
|
24
|
-
// Both modes share the same base: buttonVariants +
|
|
25
|
-
// Segmented just overrides border/shadow/rounding
|
|
23
|
+
// Both modes share the same base: buttonVariants + the pressed-state cells
|
|
24
|
+
// in recipes/toggle.css. Segmented just overrides border/shadow/rounding
|
|
25
|
+
// so items join cleanly.
|
|
26
|
+
const recipe = buttonRecipe({ variant, intent, size, iconOnly });
|
|
27
|
+
|
|
26
28
|
return (
|
|
27
29
|
<button
|
|
28
30
|
ref={ref}
|
|
31
|
+
{...recipe}
|
|
29
32
|
type="button"
|
|
33
|
+
// Same attribute Toggle renders for `pressed` — recipes/toggle.css
|
|
34
|
+
// selects on it, so selected/unselected items pick up the same cells.
|
|
35
|
+
data-state={selected ? "on" : "off"}
|
|
30
36
|
disabled={isDisabled}
|
|
31
37
|
aria-label={option.ariaLabel}
|
|
32
38
|
className={cn(
|
|
33
|
-
|
|
34
|
-
selected && togglePressedVariants({ variant, intent }),
|
|
39
|
+
recipe.className,
|
|
35
40
|
// Segmented: only override rounding (let buttonVariants handle border/color).
|
|
36
41
|
// Negative margin collapses double borders between outline items.
|
|
37
42
|
isSegmented &&
|
|
@@ -15,7 +15,8 @@ const ToggleGroupMultiple = React.forwardRef<HTMLDivElement, ToggleGroupMultiple
|
|
|
15
15
|
orientation = "horizontal",
|
|
16
16
|
variant = "solid",
|
|
17
17
|
intent = "neutral",
|
|
18
|
-
size = "
|
|
18
|
+
size = "md",
|
|
19
|
+
iconOnly = false,
|
|
19
20
|
disabled,
|
|
20
21
|
className,
|
|
21
22
|
...props
|
|
@@ -46,6 +47,7 @@ const ToggleGroupMultiple = React.forwardRef<HTMLDivElement, ToggleGroupMultiple
|
|
|
46
47
|
variant={variant}
|
|
47
48
|
intent={intent}
|
|
48
49
|
size={size}
|
|
50
|
+
iconOnly={iconOnly}
|
|
49
51
|
index={index}
|
|
50
52
|
total={options.length}
|
|
51
53
|
aria-pressed={value.includes(option.value)}
|
|
@@ -17,7 +17,8 @@ const ToggleGroupSingle = React.forwardRef<HTMLDivElement, ToggleGroupSingleProp
|
|
|
17
17
|
orientation = "horizontal",
|
|
18
18
|
variant = "solid",
|
|
19
19
|
intent = "neutral",
|
|
20
|
-
size = "
|
|
20
|
+
size = "md",
|
|
21
|
+
iconOnly = false,
|
|
21
22
|
disabled,
|
|
22
23
|
className,
|
|
23
24
|
...props
|
|
@@ -88,6 +89,7 @@ const ToggleGroupSingle = React.forwardRef<HTMLDivElement, ToggleGroupSingleProp
|
|
|
88
89
|
variant={variant}
|
|
89
90
|
intent={intent}
|
|
90
91
|
size={size}
|
|
92
|
+
iconOnly={iconOnly}
|
|
91
93
|
index={index}
|
|
92
94
|
total={options.length}
|
|
93
95
|
role="radio"
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type * as React from "react";
|
|
2
|
+
import type { ButtonIntentName, ButtonVariantName } from "../Button/Button";
|
|
2
3
|
import type { ToggleProps } from "../Toggle/Toggle";
|
|
3
4
|
|
|
4
5
|
/** Extract a prop's union type from ToggleProps, stripping null added by CVA */
|
|
@@ -22,12 +23,20 @@ export type ToggleGroupBaseProps = Omit<React.HTMLAttributes<HTMLDivElement>, "o
|
|
|
22
23
|
appearance?: "segmented" | "separate";
|
|
23
24
|
/** Layout orientation */
|
|
24
25
|
orientation?: "vertical" | "horizontal";
|
|
25
|
-
/**
|
|
26
|
-
|
|
26
|
+
/**
|
|
27
|
+
* Button variant (link excluded as it has no clear pressed state in groups).
|
|
28
|
+
*
|
|
29
|
+
* Deliberately the closed union, not Button's widened `ButtonVariant`: an
|
|
30
|
+
* `Exclude` cannot remove `link` from a type that already admits any string,
|
|
31
|
+
* so narrowing here requires narrowing from the closed names.
|
|
32
|
+
*/
|
|
33
|
+
variant?: Exclude<ButtonVariantName, "link">;
|
|
27
34
|
/** Color intent */
|
|
28
|
-
intent?:
|
|
35
|
+
intent?: ButtonIntentName;
|
|
29
36
|
/** Button size (xl excluded — too large for grouped toggles) */
|
|
30
37
|
size?: Exclude<ToggleProp<"size">, "xl">;
|
|
38
|
+
/** Square every item at the current size, for icon-only options */
|
|
39
|
+
iconOnly?: boolean;
|
|
31
40
|
/** Disable all options */
|
|
32
41
|
disabled?: boolean;
|
|
33
42
|
};
|
|
@@ -60,6 +60,12 @@ const TooltipRoot = ({ open: controlledOpen, onOpenChange, placement = "top", de
|
|
|
60
60
|
return <TooltipContext.Provider value={contextValue}>{children}</TooltipContext.Provider>;
|
|
61
61
|
};
|
|
62
62
|
|
|
63
|
+
/**
|
|
64
|
+
* NOTE: Storybook shows the copy in Tooltip.stories.tsx
|
|
65
|
+
* (`parameters.docs.description.component`), not this comment. react-docgen
|
|
66
|
+
* cannot extract a description from an `Object.assign` / cast export, so a
|
|
67
|
+
* second copy here would only drift. Edit the stories file.
|
|
68
|
+
*/
|
|
63
69
|
export const Tooltip = Object.assign(TooltipRoot, {
|
|
64
70
|
Trigger: TooltipTrigger,
|
|
65
71
|
Body: TooltipBody,
|
package/src/date-time/index.ts
CHANGED
|
@@ -315,7 +315,6 @@ export {
|
|
|
315
315
|
// until: dateRange?.to ? serialize(dateRange.to) : undefined,
|
|
316
316
|
// };
|
|
317
317
|
//
|
|
318
|
-
// See: packages/web/src/api/activity-log/useActivityLog.ts for reference implementation
|
|
319
318
|
// =============================================================================
|
|
320
319
|
|
|
321
320
|
// =============================================================================
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { cn } from "@sixthshift/design-system/utils";
|
|
2
|
+
import { X } from "lucide-react";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
|
|
5
|
+
export type PickerFieldProps = {
|
|
6
|
+
/** The segments, or whatever the field holds. */
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
/** Icon for the button that opens the popover — a calendar or a clock. */
|
|
9
|
+
icon: React.ReactNode;
|
|
10
|
+
/** Accessible name for that button, e.g. `"Open calendar for start date"`. */
|
|
11
|
+
toggleLabel: string;
|
|
12
|
+
/**
|
|
13
|
+
* Props for the toggle button — in practice Floating UI's
|
|
14
|
+
* `getReferenceProps()`, spread last so its handlers win.
|
|
15
|
+
*/
|
|
16
|
+
toggleProps?: React.ButtonHTMLAttributes<HTMLButtonElement> | undefined;
|
|
17
|
+
/** Drives `aria-expanded` and whether `aria-controls` is set. */
|
|
18
|
+
isOpen: boolean;
|
|
19
|
+
/** Id of the popover this field opens. */
|
|
20
|
+
contentId: string;
|
|
21
|
+
isDisabled?: boolean | undefined;
|
|
22
|
+
isInvalid?: boolean | undefined;
|
|
23
|
+
/** Omit to render no clear button. */
|
|
24
|
+
onClear?: ((event: React.MouseEvent) => void) | undefined;
|
|
25
|
+
/** Accessible name for the clear button, e.g. `"Clear end date"`. */
|
|
26
|
+
clearLabel?: string | undefined;
|
|
27
|
+
className?: string | undefined;
|
|
28
|
+
onFocusCapture?: React.FocusEventHandler<HTMLDivElement> | undefined;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The bordered box every picker trigger is: an icon button that opens the
|
|
33
|
+
* popover, the field itself, and an optional clear button.
|
|
34
|
+
*
|
|
35
|
+
* Extracted because there were six of these — `DatePicker` alone had three, one
|
|
36
|
+
* per mode plus the two range halves — and they had already started to drift in
|
|
37
|
+
* padding. The field height, the `focus-within` ring, the invalid border and the
|
|
38
|
+
* disabled treatment are decided once here, so changing them is one edit rather
|
|
39
|
+
* than six.
|
|
40
|
+
*
|
|
41
|
+
* Width is deliberately not decided here: a time field is narrower than a
|
|
42
|
+
* date-and-time field, so callers pass their own `min-w-*` through `className`.
|
|
43
|
+
*
|
|
44
|
+
* The ref is the box element — what Floating UI anchors to.
|
|
45
|
+
*
|
|
46
|
+
* Internal. Not exported from the package.
|
|
47
|
+
*/
|
|
48
|
+
export const PickerField = React.forwardRef<HTMLDivElement, PickerFieldProps>(
|
|
49
|
+
(
|
|
50
|
+
{ children, icon, toggleLabel, toggleProps, isOpen, contentId, isDisabled = false, isInvalid = false, onClear, clearLabel, className, onFocusCapture },
|
|
51
|
+
ref
|
|
52
|
+
) => (
|
|
53
|
+
<div
|
|
54
|
+
ref={ref}
|
|
55
|
+
onFocusCapture={onFocusCapture}
|
|
56
|
+
className={cn(
|
|
57
|
+
"relative flex h-9 items-center gap-1 rounded-md border border-border-normal bg-transparent py-1 pl-1.5 shadow-xs transition-colors focus-within:ring-2 focus-within:ring-focus-ring",
|
|
58
|
+
onClear ? "pr-9" : "pr-3",
|
|
59
|
+
isInvalid && "border-border-danger",
|
|
60
|
+
isDisabled && "cursor-not-allowed opacity-50",
|
|
61
|
+
className
|
|
62
|
+
)}
|
|
63
|
+
>
|
|
64
|
+
<button
|
|
65
|
+
type="button"
|
|
66
|
+
disabled={isDisabled}
|
|
67
|
+
aria-label={toggleLabel}
|
|
68
|
+
aria-haspopup="dialog"
|
|
69
|
+
aria-expanded={isOpen}
|
|
70
|
+
aria-controls={isOpen ? contentId : undefined}
|
|
71
|
+
className="rounded-sm p-1 text-fg-subtle transition-colors hover:text-fg-normal focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring disabled:cursor-not-allowed"
|
|
72
|
+
{...toggleProps}
|
|
73
|
+
>
|
|
74
|
+
{icon}
|
|
75
|
+
</button>
|
|
76
|
+
{children}
|
|
77
|
+
{onClear && (
|
|
78
|
+
<button
|
|
79
|
+
type="button"
|
|
80
|
+
onClick={onClear}
|
|
81
|
+
aria-label={clearLabel}
|
|
82
|
+
className="absolute right-3 rounded-sm p-0.5 text-fg-subtle hover:bg-bg-subtle hover:text-fg-normal focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-focus-ring"
|
|
83
|
+
>
|
|
84
|
+
<X className="h-3.5 w-3.5" />
|
|
85
|
+
</button>
|
|
86
|
+
)}
|
|
87
|
+
</div>
|
|
88
|
+
)
|
|
89
|
+
);
|
|
90
|
+
PickerField.displayName = "PickerField";
|