@sixthshift/design-system 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +114 -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 +13 -0
- package/dist/components/Card/Card.d.ts.map +1 -1
- package/dist/components/Card/Card.js +15 -2
- package/dist/components/Card/Card.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.d.ts +21 -0
- package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
- package/dist/components/Checkbox/Checkbox.js +22 -1
- package/dist/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +22 -0
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts.map +1 -1
- package/dist/components/CheckboxGroup/CheckboxGroup.js +22 -0
- package/dist/components/CheckboxGroup/CheckboxGroup.js.map +1 -1
- package/dist/components/Code/Editor/Editor.js +2 -2
- package/dist/components/Code/Editor/Editor.js.map +1 -1
- package/dist/components/Code/Editor/themes.d.ts +2 -2
- package/dist/components/Code/Editor/themes.d.ts.map +1 -1
- package/dist/components/Code/Editor/themes.js +50 -32
- package/dist/components/Code/Editor/themes.js.map +1 -1
- package/dist/components/Code/ValidationStatus/ValidationStatus.d.ts.map +1 -1
- package/dist/components/Code/ValidationStatus/ValidationStatus.js.map +1 -1
- package/dist/components/DatePicker/DatePicker.d.ts +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/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 +3 -45
- 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 +15 -2
- package/src/components/Checkbox/Checkbox.tsx +22 -2
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +22 -0
- package/src/components/Code/Editor/Editor.tsx +2 -2
- package/src/components/Code/Editor/themes.ts +50 -32
- package/src/components/Code/ValidationStatus/ValidationStatus.tsx +6 -3
- package/src/components/DatePicker/DatePicker.tsx +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/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 +26 -0
- package/src/theme/recipes/checkbox.css +44 -0
- package/src/theme/recipes/field.css +14 -0
- package/src/theme/recipes/index.css +28 -0
- package/src/theme/recipes/input.css +29 -0
- package/src/theme/recipes/message.css +47 -0
- package/src/theme/recipes/modal.css +31 -0
- package/src/theme/recipes/radio-button.css +42 -0
- package/src/theme/recipes/search-input.css +16 -0
- package/src/theme/recipes/select.css +105 -0
- package/src/theme/recipes/sheet.css +34 -0
- package/src/theme/recipes/spinner.css +17 -0
- package/src/theme/recipes/switch.css +39 -0
- package/src/theme/recipes/tabs.css +41 -0
- package/src/theme/recipes/tag-chip.css +27 -0
- package/src/theme/recipes/textarea.css +20 -0
- package/src/theme/recipes/toggle.css +92 -0
- package/src/theme/schema.ts +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
|
@@ -6,27 +6,48 @@ import { MessageDescription } from "./components/MessageDescription";
|
|
|
6
6
|
import { MessageIcon } from "./components/MessageIcon";
|
|
7
7
|
import { MessageTitle } from "./components/MessageTitle";
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Geometry only, plus the three `--message-*` component tokens.
|
|
11
|
+
*
|
|
12
|
+
* Every colour reads a `--message-*` component token whose value is decided by
|
|
13
|
+
* src/theme/recipes/message.css. That file is the mapping from `intent` to a
|
|
14
|
+
* semantic token — the layer that used to be the `intent` entry in `variants`
|
|
15
|
+
* here, compiled into class-name literals and unreachable from outside.
|
|
16
|
+
* `size` stays here: it is pure geometry (padding, gap, font-size), not
|
|
17
|
+
* colour, so it has no reason to move.
|
|
18
|
+
*/
|
|
19
|
+
export const messageVariants = cva(
|
|
20
|
+
// One literal, deliberately: `useSortedClasses --unsafe` strips the trailing
|
|
21
|
+
// space before a `+`, silently welding the last class of one fragment to the
|
|
22
|
+
// first of the next. A single string means the sorter has nothing to break.
|
|
23
|
+
"message border-(color:--message-border) flex gap-3 rounded-lg border bg-(--message-bg) p-4 text-(--message-fg) text-sm [&>svg]:shrink-0",
|
|
24
|
+
{
|
|
25
|
+
variants: {
|
|
26
|
+
size: {
|
|
27
|
+
md: "p-4",
|
|
28
|
+
sm: "gap-2 p-3 text-xs",
|
|
29
|
+
},
|
|
16
30
|
},
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
sm: "gap-2 p-3 text-xs",
|
|
31
|
+
defaultVariants: {
|
|
32
|
+
size: "md",
|
|
20
33
|
},
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Widened deliberately, same reasoning as `ButtonIntent` in Button.tsx: adding
|
|
39
|
+
* an intent is a CSS change in the consuming app (a new `.message[data-intent=…]`
|
|
40
|
+
* cell in message.css), not a release here, so the type has to admit values
|
|
41
|
+
* this file has never heard of while still autocompleting the ones it ships.
|
|
42
|
+
*/
|
|
43
|
+
type Loose<T extends string> = T | (string & {});
|
|
44
|
+
|
|
45
|
+
export type MessageIntentName = "neutral" | "success" | "warning" | "danger";
|
|
46
|
+
export type MessageIntent = Loose<MessageIntentName>;
|
|
27
47
|
|
|
28
48
|
export type MessageProps = React.HTMLAttributes<HTMLDivElement> &
|
|
29
49
|
VariantProps<typeof messageVariants> & {
|
|
50
|
+
intent?: MessageIntent | undefined;
|
|
30
51
|
/** Simple API: Optional title displayed above children */
|
|
31
52
|
title?: React.ReactNode;
|
|
32
53
|
/** Simple API: Optional icon displayed on the left */
|
|
@@ -41,14 +62,43 @@ export type MessageProps = React.HTMLAttributes<HTMLDivElement> &
|
|
|
41
62
|
* success confirmation or a static "Note" callout stamped as `alert` trains
|
|
42
63
|
* users to ignore the role that actually matters. Consumers can override by
|
|
43
64
|
* passing their own `role` — `props` is spread after this.
|
|
65
|
+
*
|
|
66
|
+
* `intent` is widened to admit values this file has never heard of (see
|
|
67
|
+
* `MessageIntent` above), so this is deliberately not a lookup keyed by the
|
|
68
|
+
* closed union: an unrecognised intent has no entry and must fall through to
|
|
69
|
+
* `"status"` rather than resolving to `undefined`, which would render with no
|
|
70
|
+
* live-region role at all.
|
|
44
71
|
*/
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
danger: "alert",
|
|
50
|
-
} as const;
|
|
72
|
+
const ALERT_INTENTS: ReadonlySet<string> = new Set<MessageIntentName>(["danger"]);
|
|
73
|
+
function intentRole(intent: MessageIntent): "status" | "alert" {
|
|
74
|
+
return ALERT_INTENTS.has(intent) ? "alert" : "status";
|
|
75
|
+
}
|
|
51
76
|
|
|
77
|
+
/**
|
|
78
|
+
* An inline feedback banner — info, success, warning, or error — that
|
|
79
|
+
* renders wherever the caller places it and stays until the caller removes
|
|
80
|
+
* it. Reach for `Message` over `Toast` when the feedback belongs in the
|
|
81
|
+
* page's own layout (form validation, an in-card load error); reach for
|
|
82
|
+
* `Toast` when it should float above the page and disappear on its own.
|
|
83
|
+
* `Toast` itself renders a `Message` internally.
|
|
84
|
+
*
|
|
85
|
+
* `intent` (`"neutral"` (default) | `"success"` | `"warning"` | `"danger"`,
|
|
86
|
+
* widened to accept any string) drives both the color, via `--message-*`
|
|
87
|
+
* component tokens, and the ARIA live-region role: `"danger"` is the only
|
|
88
|
+
* intent that gets `role="alert"` (assertive — cuts off whatever a screen
|
|
89
|
+
* reader was announcing); every other intent, including one this library has
|
|
90
|
+
* never heard of, gets `role="status"` (polite — announced at the next
|
|
91
|
+
* natural pause). An unrecognised intent still falls through to
|
|
92
|
+
* `role="status"` rather than resolving to no role at all. `role` can be
|
|
93
|
+
* overridden directly if a specific case needs it. `size` (`"md"` | `"sm"`)
|
|
94
|
+
* is geometry only (padding/gap/font-size) and carries no color.
|
|
95
|
+
*
|
|
96
|
+
* Two ways to give it content: the simple API (`title` + `icon` props, with
|
|
97
|
+
* `children` as the description), or compound children (`Message.Icon`,
|
|
98
|
+
* `Message.Body`, `Message.Title`, `Message.Description`) for layouts the
|
|
99
|
+
* simple API can't express. Message detects which one is in use by
|
|
100
|
+
* inspecting its children, so the two aren't meant to be mixed.
|
|
101
|
+
*/
|
|
52
102
|
export const Message = React.forwardRef<HTMLDivElement, MessageProps>(({ className, intent = "neutral", size, title, icon, children, ...props }, ref) => {
|
|
53
103
|
const hasCompoundChildren = React.Children.toArray(children).some(
|
|
54
104
|
(child) =>
|
|
@@ -57,7 +107,7 @@ export const Message = React.forwardRef<HTMLDivElement, MessageProps>(({ classNa
|
|
|
57
107
|
);
|
|
58
108
|
|
|
59
109
|
return (
|
|
60
|
-
<div ref={ref} role={intentRole
|
|
110
|
+
<div ref={ref} role={intentRole(intent)} data-intent={intent} className={cn(messageVariants({ size, className }))} {...props}>
|
|
61
111
|
{hasCompoundChildren ? (
|
|
62
112
|
children
|
|
63
113
|
) : (
|
|
@@ -6,5 +6,5 @@ export type { MessageIconProps } from "./components/MessageIcon";
|
|
|
6
6
|
export { MessageIcon } from "./components/MessageIcon";
|
|
7
7
|
export type { MessageTitleProps } from "./components/MessageTitle";
|
|
8
8
|
export { MessageTitle } from "./components/MessageTitle";
|
|
9
|
-
export type { MessageProps } from "./Message";
|
|
9
|
+
export type { MessageIntent, MessageIntentName, MessageProps } from "./Message";
|
|
10
10
|
export { Message, messageVariants } from "./Message";
|
|
@@ -126,7 +126,10 @@ const ModalRoot = forwardRef<HTMLDivElement, ModalProps>(
|
|
|
126
126
|
|
|
127
127
|
return (
|
|
128
128
|
<FloatingFocusManager context={context} modal>
|
|
129
|
-
<FloatingOverlay
|
|
129
|
+
<FloatingOverlay
|
|
130
|
+
lockScroll
|
|
131
|
+
className={cn("modal-overlay fixed inset-0 z-modal bg-(--modal-overlay-bg)", isEntering && "animate-fade-in", isExiting && "animate-fade-out")}
|
|
132
|
+
>
|
|
130
133
|
<div
|
|
131
134
|
ref={mergedRef}
|
|
132
135
|
role="dialog"
|
|
@@ -137,8 +140,8 @@ const ModalRoot = forwardRef<HTMLDivElement, ModalProps>(
|
|
|
137
140
|
tabIndex={-1}
|
|
138
141
|
data-state={state}
|
|
139
142
|
className={cn(
|
|
140
|
-
"fixed flex flex-col overflow-hidden outline-hidden",
|
|
141
|
-
"rounded-xl border
|
|
143
|
+
"modal fixed flex flex-col overflow-hidden outline-hidden",
|
|
144
|
+
"border-(color:--modal-border) rounded-xl border bg-(--modal-bg)",
|
|
142
145
|
// Size
|
|
143
146
|
sizeClasses[size],
|
|
144
147
|
// Cap height so ModalBody scrolls instead of overflowing the viewport
|
|
@@ -171,6 +174,42 @@ ModalRoot.displayName = "Modal";
|
|
|
171
174
|
// Compound Component Export
|
|
172
175
|
// =============================================================================
|
|
173
176
|
|
|
177
|
+
/**
|
|
178
|
+
* A centered, backdrop-dimmed dialog that fully interrupts the page — the
|
|
179
|
+
* background stays visually present but the user can't reach it. Reach for
|
|
180
|
+
* `Modal` when the interruption should own the user's attention completely
|
|
181
|
+
* (a confirmation, a focused form); reach for `Sheet` when the page behind
|
|
182
|
+
* should stay visible and interactive, or `Popover` when there's no need for
|
|
183
|
+
* a backdrop at all.
|
|
184
|
+
*
|
|
185
|
+
* `size` (`"sm" | "md" | "lg" | "full"`, default `"md"`) sets the desktop
|
|
186
|
+
* width — every size slides up full-width from the bottom on mobile.
|
|
187
|
+
* `align` positions the desktop dialog `"center"` (default) or `"top"`.
|
|
188
|
+
* `dismissable` (default `true`) governs outside-press only: clicking the
|
|
189
|
+
* backdrop closes the modal unless set to `false`. `closable` shows an X
|
|
190
|
+
* button in `Modal.Header`.
|
|
191
|
+
*
|
|
192
|
+
* Modal is mount-driven — a parent (or `useModal`'s stack) decides whether it
|
|
193
|
+
* renders at all, so there's no `open` prop. `onOpenChange` still exists,
|
|
194
|
+
* firing only with `false` on dismissal, so every overlay in this library
|
|
195
|
+
* shares one open/close shape. Escape is *not* wired inside Modal itself:
|
|
196
|
+
* `OverlayProvider` owns it globally so a stack of modals closes
|
|
197
|
+
* topmost-first. That means Escape only closes a Modal opened through
|
|
198
|
+
* `useModal()` — one a parent mounts directly from its own boolean state
|
|
199
|
+
* won't respond to Escape unless the app wires that separately.
|
|
200
|
+
*
|
|
201
|
+
* Focus moves into the modal on mount and is trapped there
|
|
202
|
+
* (`FloatingFocusManager modal`) until it unmounts, then returns to whatever
|
|
203
|
+
* triggered it. The dialog carries `role="dialog"` and `aria-modal="true"`,
|
|
204
|
+
* and names itself from `Modal.Header` via `aria-labelledby` unless the
|
|
205
|
+
* caller passes their own `aria-label`. It stays mounted through its
|
|
206
|
+
* fade-out exit animation (`usePresence`), so `onOpenChange(false)` fires
|
|
207
|
+
* only after the animation completes.
|
|
208
|
+
*
|
|
209
|
+
* Compound: `Modal.Header` (title + optional close button), `Modal.Body`
|
|
210
|
+
* (scrolls internally so the modal itself never grows past the viewport),
|
|
211
|
+
* `Modal.Footer` (action buttons). None are required.
|
|
212
|
+
*/
|
|
174
213
|
export const Modal = Object.assign(ModalRoot, {
|
|
175
214
|
Header: ModalHeader,
|
|
176
215
|
Body: ModalBody,
|
|
@@ -30,7 +30,7 @@ export const ModalHeader = React.forwardRef<HTMLDivElement, ModalHeaderProps>(({
|
|
|
30
30
|
type="button"
|
|
31
31
|
onClick={onClose}
|
|
32
32
|
aria-label="Close"
|
|
33
|
-
className="absolute top-4 right-4 cursor-pointer rounded-md p-1 text-fg
|
|
33
|
+
className="modal-close absolute top-4 right-4 cursor-pointer rounded-md p-1 text-(--modal-close-fg) transition-colors hover:bg-(--modal-close-bg-hovered) hover:text-(--modal-close-fg-hovered)"
|
|
34
34
|
>
|
|
35
35
|
<X size={16} />
|
|
36
36
|
</button>
|
|
@@ -68,6 +68,35 @@ const PopoverRoot = ({ open: controlledOpen, onOpenChange, defaultOpen = false,
|
|
|
68
68
|
return <PopoverContext.Provider value={contextValue}>{children}</PopoverContext.Provider>;
|
|
69
69
|
};
|
|
70
70
|
|
|
71
|
+
/**
|
|
72
|
+
* A click-triggered floating panel anchored to a trigger element, with no
|
|
73
|
+
* backdrop. Reach for `Popover` over `Modal`/`Sheet` when the content is a
|
|
74
|
+
* menu, a small edit form, or info-on-demand that should stay tethered to
|
|
75
|
+
* whatever the user clicked, rather than taking over the page. Reach for
|
|
76
|
+
* `HoverCard` instead when the panel should open passively on hover/focus
|
|
77
|
+
* rather than a click, and for `Tooltip` when it's a short text label rather
|
|
78
|
+
* than a panel with real content.
|
|
79
|
+
*
|
|
80
|
+
* Works both controlled (`open` + `onOpenChange`) and uncontrolled
|
|
81
|
+
* (`defaultOpen`) via `useControllableState`. `placement` (default
|
|
82
|
+
* `"bottom"`) and `offsetPx` (default `8`) position it relative to the
|
|
83
|
+
* trigger through floating-ui's `offset → flip → shift` middleware, which
|
|
84
|
+
* repositions automatically on scroll/resize (`autoUpdate`).
|
|
85
|
+
*
|
|
86
|
+
* Opens via `useClick` and dismisses via `useDismiss` — outside-press and
|
|
87
|
+
* Escape both close it, handled directly by floating-ui rather than
|
|
88
|
+
* `OverlayProvider`, since a Popover isn't part of the modal stack.
|
|
89
|
+
* `Popover.Body` renders in a `FloatingPortal` to `document.body` and hard
|
|
90
|
+
* unmounts (`return null`) when closed — there's no exit animation. It
|
|
91
|
+
* carries `role="dialog"` and, since there's no title slot to read from,
|
|
92
|
+
* names itself from `Popover.Trigger` via `aria-labelledby` unless the
|
|
93
|
+
* caller passes their own `aria-label`/`aria-labelledby`.
|
|
94
|
+
*
|
|
95
|
+
* Compound: `Popover.Trigger` (`asChild` to render the child element as the
|
|
96
|
+
* trigger instead of wrapping it in a `<button>`), `Popover.Body`,
|
|
97
|
+
* `Popover.Close` (a button that calls `onOpenChange(false)` — for a close
|
|
98
|
+
* affordance inside the panel's own content).
|
|
99
|
+
*/
|
|
71
100
|
export const Popover = Object.assign(PopoverRoot, {
|
|
72
101
|
Trigger: PopoverTrigger,
|
|
73
102
|
Body: PopoverBody,
|
|
@@ -11,6 +11,20 @@ export type ProgressBarProps = {
|
|
|
11
11
|
className?: string;
|
|
12
12
|
};
|
|
13
13
|
|
|
14
|
+
/**
|
|
15
|
+
* Determinate progress meter: a labelled fill bar plus an optional `n/total`
|
|
16
|
+
* fraction (`showFraction`, default `true`).
|
|
17
|
+
*
|
|
18
|
+
* The bar itself is `role="progressbar"` with `aria-valuemin`/`-valuenow`/
|
|
19
|
+
* `-valuemax`/`-valuetext`, and `label` (default `"Progress"`) sets its
|
|
20
|
+
* accessible name — give it something more specific than the default when
|
|
21
|
+
* more than one bar can appear on a page. `completed` is clamped into
|
|
22
|
+
* `[0, total]` before it drives the fill width or `aria-valuenow`, so an
|
|
23
|
+
* out-of-range value (negative, or greater than `total`) can't produce
|
|
24
|
+
* invalid CSS or an impossible reported value — though the fraction text
|
|
25
|
+
* still shows the raw, unclamped numbers. When `total` is not positive the
|
|
26
|
+
* bar renders as indeterminate: no `aria-valuenow`/`aria-valuemax`, 0% fill.
|
|
27
|
+
*/
|
|
14
28
|
export const ProgressBar = React.forwardRef<HTMLDivElement, ProgressBarProps>(
|
|
15
29
|
({ completed, total, showFraction = true, label = "Progress", className }, ref) => {
|
|
16
30
|
// A caller can hand us anything; the bar must not render an out-of-range
|
|
@@ -23,6 +23,32 @@ const RadioButtonIcon = () => (
|
|
|
23
23
|
</svg>
|
|
24
24
|
);
|
|
25
25
|
|
|
26
|
+
/**
|
|
27
|
+
* A single custom radio option — a button with `role="radio"` rather than
|
|
28
|
+
* a native `<input type="radio">`, so it can be styled without fighting
|
|
29
|
+
* native radio rendering.
|
|
30
|
+
*
|
|
31
|
+
* Unlike `Checkbox`, it holds no internal state: `checked` is a plain
|
|
32
|
+
* controlled prop (default `false`, no `defaultChecked`), and clicking an
|
|
33
|
+
* unselected radio calls `onCheckedChange(true)` — the caller owns tracking
|
|
34
|
+
* which option in a group is selected. In practice that means using
|
|
35
|
+
* `RadioButtonGroup` to manage a group's value, or wiring up the shared
|
|
36
|
+
* selection by hand.
|
|
37
|
+
*
|
|
38
|
+
* Clicking an already-selected radio does nothing and reports nothing: a radio
|
|
39
|
+
* is not a toggle, and the way to deselect one is to select a sibling. That
|
|
40
|
+
* makes `onCheckedChange` a one-way signal — it is only ever called with
|
|
41
|
+
* `true`.
|
|
42
|
+
*
|
|
43
|
+
* Only participates in native form submission when `name` is set, via a
|
|
44
|
+
* hidden native `<input type="radio">` rendered alongside the button and
|
|
45
|
+
* kept in sync (`value` defaults to `"on"`); give every radio in a group the
|
|
46
|
+
* same `name` to group them for native submission.
|
|
47
|
+
*
|
|
48
|
+
* Passing `label` wraps the button and a `<Label>` together and wires
|
|
49
|
+
* `htmlFor`/`id` between them; without it, you get just the button and must
|
|
50
|
+
* supply your own accessible name.
|
|
51
|
+
*/
|
|
26
52
|
const RadioButton = React.forwardRef<HTMLButtonElement, RadioButtonProps>(
|
|
27
53
|
({ className, checked = false, onCheckedChange, disabled, name, value = "on", label, labelClassName, id: idProp, ...props }, ref) => {
|
|
28
54
|
const generatedId = React.useId();
|
|
@@ -39,10 +65,15 @@ const RadioButton = React.forwardRef<HTMLButtonElement, RadioButtonProps>(
|
|
|
39
65
|
data-state={checked ? "checked" : "unchecked"}
|
|
40
66
|
disabled={disabled}
|
|
41
67
|
ref={ref}
|
|
42
|
-
|
|
68
|
+
// A radio is not a toggle: activating the selected option leaves it
|
|
69
|
+
// selected, and reports nothing, so a caller holding the selection
|
|
70
|
+
// does not see a spurious change. Deselection happens by selecting a
|
|
71
|
+
// sibling, which is what `RadioButtonGroup` does.
|
|
72
|
+
onClick={() => {
|
|
73
|
+
if (!checked) onCheckedChange?.(true);
|
|
74
|
+
}}
|
|
43
75
|
className={cn(
|
|
44
|
-
"peer h-4 w-4 shrink-0 cursor-pointer rounded-full border
|
|
45
|
-
checked && "bg-bg-brand text-fg-on-brand",
|
|
76
|
+
"radio-button peer border-(color:--radio-button-border) focus-visible:ring-(color:--radio-button-ring) h-4 w-4 shrink-0 cursor-pointer rounded-full border bg-(--radio-button-bg) text-(--radio-button-fg) shadow focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
|
|
46
77
|
className
|
|
47
78
|
)}
|
|
48
79
|
{...props}
|
|
@@ -37,6 +37,32 @@ export type RadioButtonGroupProps = Omit<React.HTMLAttributes<HTMLDivElement>, "
|
|
|
37
37
|
onBlur?: () => void;
|
|
38
38
|
};
|
|
39
39
|
|
|
40
|
+
/**
|
|
41
|
+
* A set of mutually exclusive radio options sharing one controlled/
|
|
42
|
+
* uncontrolled `string` selection, via the `value`/`defaultValue`/
|
|
43
|
+
* `onValueChange` triad (`useControllableState`).
|
|
44
|
+
*
|
|
45
|
+
* `variant="default"` (the default) renders one `RadioButton` per option.
|
|
46
|
+
* `variant="button"` is a separate rendering path — not a re-skinned
|
|
47
|
+
* `RadioButton` — a row/column of plain buttons with `role="radio"`;
|
|
48
|
+
* contiguous buttons touch and share borders (`appearance="segmented"`, the
|
|
49
|
+
* default) or sit apart with their own rounded corners
|
|
50
|
+
* (`appearance="separate"`).
|
|
51
|
+
*
|
|
52
|
+
* Implements the WAI-ARIA radiogroup keyboard pattern: the group is one tab
|
|
53
|
+
* stop, landing on the checked option (or the first enabled option if none
|
|
54
|
+
* is checked), and arrow/Home/End keys move focus *and* selection between
|
|
55
|
+
* enabled options, wrapping at the ends.
|
|
56
|
+
*
|
|
57
|
+
* Form submission only happens when `name` is set. In the default variant
|
|
58
|
+
* that means each underlying `RadioButton` gets `name`, so one hidden
|
|
59
|
+
* native radio input is rendered per option; in the button variant the
|
|
60
|
+
* group itself renders a single hidden `<input type="hidden">` carrying the
|
|
61
|
+
* selected value.
|
|
62
|
+
*
|
|
63
|
+
* Renders `role="radiogroup"`; focus leaving the whole group — not just
|
|
64
|
+
* moving between options — fires `onBlur`.
|
|
65
|
+
*/
|
|
40
66
|
const RadioButtonGroup = React.forwardRef<HTMLDivElement, RadioButtonGroupProps>(
|
|
41
67
|
(
|
|
42
68
|
{
|
|
@@ -81,6 +107,12 @@ const RadioButtonGroup = React.forwardRef<HTMLDivElement, RadioButtonGroupProps>
|
|
|
81
107
|
);
|
|
82
108
|
|
|
83
109
|
const handleOptionSelect = (optionValue: string) => {
|
|
110
|
+
// Re-selecting the current option reports nothing, as a native radio does
|
|
111
|
+
// not. The guard lives here as well as in `RadioButton` because the button
|
|
112
|
+
// variant is a separate rendering path that never goes through it — and
|
|
113
|
+
// the two variants must not disagree about this. `ToggleGroup` in
|
|
114
|
+
// `"single"` mode already works this way.
|
|
115
|
+
if (optionValue === value) return;
|
|
84
116
|
setValue(optionValue);
|
|
85
117
|
};
|
|
86
118
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Input } from "@sixthshift/design-system/input";
|
|
2
|
+
import { cn } from "@sixthshift/design-system/utils";
|
|
2
3
|
import { Search, X } from "lucide-react";
|
|
3
4
|
import * as React from "react";
|
|
4
5
|
|
|
@@ -10,6 +11,16 @@ export type SearchInputProps = Omit<React.InputHTMLAttributes<HTMLInputElement>,
|
|
|
10
11
|
clearLabel?: string;
|
|
11
12
|
};
|
|
12
13
|
|
|
14
|
+
/**
|
|
15
|
+
* Text input specialised for search: a search icon fixed on the left and,
|
|
16
|
+
* once there is a value, a clear button on the right.
|
|
17
|
+
*
|
|
18
|
+
* Wraps `Input`, using its `iconLeft`/`iconRight` slots, rather than
|
|
19
|
+
* reimplementing the field. Always controlled — `value` is required and
|
|
20
|
+
* there is no `defaultValue`/uncontrolled mode. `onChange` receives the
|
|
21
|
+
* string value directly, not the change event. Clearing calls `onClear` if
|
|
22
|
+
* provided, otherwise calls `onChange("")`.
|
|
23
|
+
*/
|
|
13
24
|
const SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(
|
|
14
25
|
({ className, value, onChange, onClear, clearLabel = "Clear search", ...props }, ref) => {
|
|
15
26
|
const handleClear = () => {
|
|
@@ -29,12 +40,12 @@ const SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(
|
|
|
29
40
|
iconLeft={<Search />}
|
|
30
41
|
iconRight={
|
|
31
42
|
value ? (
|
|
32
|
-
<button type="button" onClick={handleClear} aria-label={clearLabel} className="rounded hover:bg-bg-
|
|
43
|
+
<button type="button" onClick={handleClear} aria-label={clearLabel} className="rounded hover:bg-(--search-input-clear-bg-hovered)">
|
|
33
44
|
<X />
|
|
34
45
|
</button>
|
|
35
46
|
) : undefined
|
|
36
47
|
}
|
|
37
|
-
className={className}
|
|
48
|
+
className={cn("search-input", className)}
|
|
38
49
|
{...props}
|
|
39
50
|
/>
|
|
40
51
|
);
|
|
@@ -337,10 +337,9 @@ const SelectRoot = forwardRef(function SelectRoot<T extends string = string>(pro
|
|
|
337
337
|
SelectRoot.displayName = "Select";
|
|
338
338
|
|
|
339
339
|
/**
|
|
340
|
-
*
|
|
341
|
-
*
|
|
342
|
-
*
|
|
343
|
-
*
|
|
344
|
-
* for conditional rendering, but worth knowing if you cache the node.
|
|
340
|
+
* NOTE: Storybook shows the copy in Select.stories.tsx
|
|
341
|
+
* (`parameters.docs.description.component`), not this comment. react-docgen
|
|
342
|
+
* cannot extract a description from this declaration shape, so keeping a
|
|
343
|
+
* second copy here would only drift. Edit the stories file.
|
|
345
344
|
*/
|
|
346
345
|
export const Select = SelectRoot as <T extends string = string>(props: SelectProps<T> & { ref?: Ref<HTMLDivElement> }) => ReactElement;
|
|
@@ -66,13 +66,16 @@ export const SelectDropdown = <T extends string>({
|
|
|
66
66
|
tabIndex={-1}
|
|
67
67
|
onKeyDown={onKeyDown}
|
|
68
68
|
style={floatingStyles}
|
|
69
|
-
className="z-popover max-h-60 overflow-y-auto rounded-md border
|
|
69
|
+
className="select-dropdown border-(color:--select-dropdown-border) z-popover max-h-60 overflow-y-auto rounded-md border bg-(--select-dropdown-bg) shadow-lg"
|
|
70
70
|
>
|
|
71
71
|
{displayOptions.length === 0 ? (
|
|
72
|
-
<div className="px-3 py-2 text-center text-fg
|
|
72
|
+
<div className="px-3 py-2 text-center text-(--select-dropdown-empty-fg) text-sm">
|
|
73
|
+
{searchValue ? `No results for "${searchValue}"` : "No options available"}
|
|
74
|
+
</div>
|
|
73
75
|
) : (
|
|
74
76
|
displayOptions.map((option, index) => {
|
|
75
77
|
const isSelected = selectedValues.has(option.value);
|
|
78
|
+
const isHighlighted = highlightedIndex === index;
|
|
76
79
|
return (
|
|
77
80
|
<button
|
|
78
81
|
key={option.value}
|
|
@@ -84,6 +87,10 @@ export const SelectDropdown = <T extends string>({
|
|
|
84
87
|
id={selectOptionId(listboxId, index)}
|
|
85
88
|
role="option"
|
|
86
89
|
aria-selected={isSelected}
|
|
90
|
+
// Surfaces the keyboard/mouse "current" option as an attribute
|
|
91
|
+
// the select.css recipe selects on, rather than compiling it
|
|
92
|
+
// straight into a class name — see select.css's header.
|
|
93
|
+
data-highlighted={isHighlighted ? "true" : undefined}
|
|
87
94
|
// The options are not tab stops and must not steal focus: the
|
|
88
95
|
// listbox holds it and delegates via aria-activedescendant, so a
|
|
89
96
|
// click that moved focus onto the option would strand the keyboard
|
|
@@ -93,18 +100,15 @@ export const SelectDropdown = <T extends string>({
|
|
|
93
100
|
onClick={() => onSelect(option.value)}
|
|
94
101
|
onMouseEnter={() => onHighlight(index)}
|
|
95
102
|
className={cn(
|
|
96
|
-
`flex w-full cursor-pointer items-center px-3 py-2 text-fg
|
|
103
|
+
`select-option flex w-full cursor-pointer items-center bg-(--select-option-bg) px-3 py-2 text-(--select-option-fg) text-sm transition-colors`,
|
|
97
104
|
multiple && "gap-2",
|
|
98
|
-
|
|
99
|
-
isSelected ? "font-medium text-fg-normal" : "text-fg-subtle"
|
|
105
|
+
isSelected && "font-medium"
|
|
100
106
|
)}
|
|
101
107
|
>
|
|
102
108
|
{multiple && (
|
|
103
109
|
<span
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
isSelected ? "border-border-brand bg-bg-brand text-fg-on-brand" : "border-border-normal"
|
|
107
|
-
)}
|
|
110
|
+
data-selected={isSelected ? "true" : undefined}
|
|
111
|
+
className="select-option-indicator border-(color:--select-option-indicator-border) flex h-4 w-4 shrink-0 items-center justify-center rounded-xs border bg-(--select-option-indicator-bg) text-(--select-option-indicator-fg)"
|
|
108
112
|
>
|
|
109
113
|
{isSelected && <Check className="h-3 w-3" />}
|
|
110
114
|
</span>
|
|
@@ -41,7 +41,7 @@ export const SelectTriggerButton = ({
|
|
|
41
41
|
const showClear = showClearButton && !collapsed;
|
|
42
42
|
|
|
43
43
|
return (
|
|
44
|
-
<div ref={rootRef} className="relative w-full">
|
|
44
|
+
<div ref={rootRef} className="select-trigger relative w-full">
|
|
45
45
|
<button
|
|
46
46
|
ref={setReference}
|
|
47
47
|
type="button"
|
|
@@ -49,7 +49,7 @@ export const SelectTriggerButton = ({
|
|
|
49
49
|
onKeyDown={onKeyDown}
|
|
50
50
|
disabled={disabled}
|
|
51
51
|
className={cn(
|
|
52
|
-
`flex w-full cursor-pointer items-center gap-2 rounded-md border
|
|
52
|
+
`border-(color:--select-trigger-border) focus-visible:ring-(color:--select-trigger-ring) flex w-full cursor-pointer items-center gap-2 rounded-md border bg-(--select-trigger-bg) px-3 py-2 font-medium text-(--select-trigger-fg) text-sm transition-colors hover:bg-(--select-trigger-bg-hovered) focus-visible:outline-none focus-visible:ring-2 disabled:cursor-not-allowed disabled:opacity-50`,
|
|
53
53
|
collapsed ? "justify-center" : "justify-between",
|
|
54
54
|
showClear && "pr-9",
|
|
55
55
|
className
|
|
@@ -67,7 +67,7 @@ export const SelectTriggerButton = ({
|
|
|
67
67
|
<>
|
|
68
68
|
<span className="truncate">{displayLabel}</span>
|
|
69
69
|
<span className="flex shrink-0 items-center gap-1">
|
|
70
|
-
<ChevronDown className={cn("h-4 w-4 text-fg
|
|
70
|
+
<ChevronDown className={cn("h-4 w-4 text-(--select-trigger-icon-fg) transition-transform", open && "rotate-180")} />
|
|
71
71
|
</span>
|
|
72
72
|
</>
|
|
73
73
|
)}
|
|
@@ -77,7 +77,7 @@ export const SelectTriggerButton = ({
|
|
|
77
77
|
type="button"
|
|
78
78
|
onClick={onClear}
|
|
79
79
|
disabled={disabled}
|
|
80
|
-
className="absolute top-1/2 right-8 -translate-y-1/2 rounded-sm p-0.5 text-fg
|
|
80
|
+
className="select-trigger-clear focus-visible:ring-(color:--select-trigger-ring) absolute top-1/2 right-8 -translate-y-1/2 rounded-sm p-0.5 text-(--select-trigger-clear-fg) hover:bg-(--select-trigger-clear-bg-hovered) hover:text-(--select-trigger-clear-fg-hovered) focus-visible:outline-none focus-visible:ring-2"
|
|
81
81
|
aria-label="Clear selection"
|
|
82
82
|
>
|
|
83
83
|
<X className="h-3.5 w-3.5" />
|
|
@@ -128,7 +128,7 @@ export const SelectTriggerSearch = ({
|
|
|
128
128
|
if (typeof rootRef === "function") rootRef(node);
|
|
129
129
|
else if (rootRef) (rootRef as WritableRefObject<HTMLDivElement | null>).current = node;
|
|
130
130
|
}}
|
|
131
|
-
className={cn("relative flex w-full items-center", className)}
|
|
131
|
+
className={cn("select-trigger relative flex w-full items-center", className)}
|
|
132
132
|
>
|
|
133
133
|
<input
|
|
134
134
|
ref={inputRef as React.RefObject<HTMLInputElement>}
|
|
@@ -139,7 +139,7 @@ export const SelectTriggerSearch = ({
|
|
|
139
139
|
placeholder={displayLabel}
|
|
140
140
|
disabled={disabled}
|
|
141
141
|
className={cn(
|
|
142
|
-
`flex-1 rounded-md border
|
|
142
|
+
`border-(color:--select-trigger-border) focus-visible:ring-(color:--select-trigger-ring) flex-1 rounded-md border bg-(--select-trigger-bg) px-3 py-2 font-medium text-(--select-trigger-fg) text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 disabled:cursor-not-allowed disabled:opacity-50`
|
|
143
143
|
)}
|
|
144
144
|
role="combobox"
|
|
145
145
|
aria-expanded={open}
|
|
@@ -148,6 +148,6 @@ export const SelectTriggerSearch = ({
|
|
|
148
148
|
aria-autocomplete="list"
|
|
149
149
|
{...props}
|
|
150
150
|
/>
|
|
151
|
-
<ChevronDown className="pointer-events-none absolute right-3 h-4 w-4 text-fg
|
|
151
|
+
<ChevronDown className="pointer-events-none absolute right-3 h-4 w-4 text-(--select-trigger-icon-fg)" />
|
|
152
152
|
</div>
|
|
153
153
|
);
|
|
@@ -6,6 +6,16 @@ export type SeparatorProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
|
6
6
|
decorative?: boolean;
|
|
7
7
|
};
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Thin dividing line, horizontal or vertical (`orientation`, default
|
|
11
|
+
* `"horizontal"`). Renders a `<div>`, not `<hr>`.
|
|
12
|
+
*
|
|
13
|
+
* `decorative` (default `true`) controls whether it is exposed to assistive
|
|
14
|
+
* tech: decorative renders `role="none"` and no `aria-orientation`, so it is
|
|
15
|
+
* invisible to a screen reader; set `decorative={false}` for a divider that
|
|
16
|
+
* is actually part of the content's structure (e.g. between menu sections),
|
|
17
|
+
* which renders `role="separator"` and `aria-orientation` instead.
|
|
18
|
+
*/
|
|
9
19
|
const Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(({ className, orientation = "horizontal", decorative = true, ...props }, ref) => (
|
|
10
20
|
<div
|
|
11
21
|
ref={ref}
|
|
@@ -128,8 +128,8 @@ const SheetRoot = forwardRef<HTMLDivElement, SheetProps>(
|
|
|
128
128
|
data-state={state}
|
|
129
129
|
data-side={side}
|
|
130
130
|
className={cn(
|
|
131
|
-
"fixed top-0 bottom-0 z-sheet flex flex-col overflow-hidden bg-bg
|
|
132
|
-
"border-border
|
|
131
|
+
"sheet fixed top-0 bottom-0 z-sheet flex flex-col overflow-hidden bg-(--sheet-bg) outline-hidden",
|
|
132
|
+
"border-(color:--sheet-border) shadow-lg",
|
|
133
133
|
side === "right" ? "right-0 border-l" : "left-0 border-r",
|
|
134
134
|
sizeClasses[size],
|
|
135
135
|
"max-sm:inset-x-0",
|
|
@@ -154,6 +154,12 @@ SheetRoot.displayName = "Sheet";
|
|
|
154
154
|
// Compound Component Export
|
|
155
155
|
// =============================================================================
|
|
156
156
|
|
|
157
|
+
/**
|
|
158
|
+
* NOTE: Storybook shows the copy in Sheet.stories.tsx
|
|
159
|
+
* (`parameters.docs.description.component`), not this comment. react-docgen
|
|
160
|
+
* cannot extract a description from this declaration shape, so keeping a
|
|
161
|
+
* second copy here would only drift. Edit the stories file.
|
|
162
|
+
*/
|
|
157
163
|
export const Sheet = Object.assign(SheetRoot, {
|
|
158
164
|
Header: SheetHeader,
|
|
159
165
|
Body: SheetBody,
|
|
@@ -4,6 +4,6 @@ import * as React from "react";
|
|
|
4
4
|
export type SheetFooterProps = React.HTMLAttributes<HTMLDivElement>;
|
|
5
5
|
|
|
6
6
|
export const SheetFooter = React.forwardRef<HTMLDivElement, SheetFooterProps>(({ className, ...props }, ref) => (
|
|
7
|
-
<div ref={ref} className={cn("
|
|
7
|
+
<div ref={ref} className={cn("sheet-footer border-(color:--sheet-footer-border) flex items-center border-t p-4", className)} {...props} />
|
|
8
8
|
));
|
|
9
9
|
SheetFooter.displayName = "SheetFooter";
|
|
@@ -24,7 +24,7 @@ export const SheetHeader = React.forwardRef<HTMLDivElement, SheetHeaderProps>(({
|
|
|
24
24
|
<div
|
|
25
25
|
ref={ref}
|
|
26
26
|
id={id ?? context?.titleId}
|
|
27
|
-
className={cn("flex flex-col space-y-1.5 border-
|
|
27
|
+
className={cn("sheet-header border-(color:--sheet-header-border) flex flex-col space-y-1.5 border-b p-6", closable && "pr-12", className)}
|
|
28
28
|
{...props}
|
|
29
29
|
>
|
|
30
30
|
{children}
|
|
@@ -33,7 +33,7 @@ export const SheetHeader = React.forwardRef<HTMLDivElement, SheetHeaderProps>(({
|
|
|
33
33
|
type="button"
|
|
34
34
|
onClick={onClose}
|
|
35
35
|
aria-label="Close"
|
|
36
|
-
className="absolute top-4 right-4 cursor-pointer rounded-md p-1 text-fg
|
|
36
|
+
className="sheet-close absolute top-4 right-4 cursor-pointer rounded-md p-1 text-(--sheet-close-fg) transition-colors hover:bg-(--sheet-close-bg-hovered) hover:text-(--sheet-close-fg-hovered)"
|
|
37
37
|
>
|
|
38
38
|
<X size={16} />
|
|
39
39
|
</button>
|
|
@@ -51,6 +51,17 @@ function buildPath(points: { x: number; y: number }[], interpolation: Interpolat
|
|
|
51
51
|
return parts.join(" ");
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
+
/**
|
|
55
|
+
* A minimal inline trend line for embedding in a table cell or card — an
|
|
56
|
+
* `<svg>` inside an `inline-block` `<span>`, sized to `width`/`height` rather
|
|
57
|
+
* than a chart that lays out its own labels or axes.
|
|
58
|
+
*
|
|
59
|
+
* Requires at least 2 data points; with fewer it renders nothing (`null`).
|
|
60
|
+
* `color` is a single CSS color string (default `var(--fg-brand)`), and
|
|
61
|
+
* `interpolation` reuses the same `Interpolation` type as `LineChart`. The
|
|
62
|
+
* accessible name is a static `aria-label="Trend line"` — it does not
|
|
63
|
+
* describe the actual values.
|
|
64
|
+
*/
|
|
54
65
|
export const Sparkline = React.forwardRef<HTMLSpanElement, SparklineProps>(
|
|
55
66
|
({ data, width = 80, height = 24, color = "var(--fg-brand)", fillArea = false, interpolation = "monotone", strokeWidth = 1.5, className, ...rest }, ref) => {
|
|
56
67
|
if (data.length < 2) return null;
|