@sixthshift/design-system 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +242 -33
- package/dist/components/Badge/Badge.d.ts +65 -7
- package/dist/components/Badge/Badge.d.ts.map +1 -1
- package/dist/components/Badge/Badge.js +56 -46
- package/dist/components/Badge/Badge.js.map +1 -1
- package/dist/components/Badge/index.d.ts +1 -1
- package/dist/components/Badge/index.d.ts.map +1 -1
- package/dist/components/Badge/index.js +1 -1
- package/dist/components/Badge/index.js.map +1 -1
- package/dist/components/BarChart/BarChart.d.ts +20 -2
- package/dist/components/BarChart/BarChart.d.ts.map +1 -1
- package/dist/components/BarChart/BarChart.js +17 -3
- package/dist/components/BarChart/BarChart.js.map +1 -1
- package/dist/components/Button/Button.d.ts +85 -6
- package/dist/components/Button/Button.d.ts.map +1 -1
- package/dist/components/Button/Button.js +97 -106
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/Button/index.d.ts +1 -1
- package/dist/components/Button/index.d.ts.map +1 -1
- package/dist/components/Button/index.js +1 -1
- package/dist/components/Button/index.js.map +1 -1
- package/dist/components/Calendar/Calendar.d.ts +31 -1
- package/dist/components/Calendar/Calendar.d.ts.map +1 -1
- package/dist/components/Calendar/Calendar.js +94 -225
- package/dist/components/Calendar/Calendar.js.map +1 -1
- package/dist/components/Calendar/CalendarView.d.ts +15 -0
- package/dist/components/Calendar/CalendarView.d.ts.map +1 -0
- package/dist/components/Calendar/CalendarView.js +263 -0
- package/dist/components/Calendar/CalendarView.js.map +1 -0
- package/dist/components/Calendar/calendar.types.d.ts +87 -27
- package/dist/components/Calendar/calendar.types.d.ts.map +1 -1
- package/dist/components/Calendar/calendar.types.js +10 -3
- package/dist/components/Calendar/calendar.types.js.map +1 -1
- package/dist/components/Calendar/index.d.ts +16 -2
- package/dist/components/Calendar/index.d.ts.map +1 -1
- package/dist/components/Calendar/index.js +15 -1
- package/dist/components/Calendar/index.js.map +1 -1
- package/dist/components/Card/Card.d.ts +13 -0
- package/dist/components/Card/Card.d.ts.map +1 -1
- package/dist/components/Card/Card.js +15 -2
- package/dist/components/Card/Card.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.d.ts +21 -0
- package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
- package/dist/components/Checkbox/Checkbox.js +22 -1
- package/dist/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +22 -0
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts.map +1 -1
- package/dist/components/CheckboxGroup/CheckboxGroup.js +22 -0
- package/dist/components/CheckboxGroup/CheckboxGroup.js.map +1 -1
- package/dist/components/Code/Editor/Editor.js +2 -2
- package/dist/components/Code/Editor/Editor.js.map +1 -1
- package/dist/components/Code/Editor/themes.d.ts +2 -2
- package/dist/components/Code/Editor/themes.d.ts.map +1 -1
- package/dist/components/Code/Editor/themes.js +50 -32
- package/dist/components/Code/Editor/themes.js.map +1 -1
- package/dist/components/Code/ValidationStatus/ValidationStatus.d.ts.map +1 -1
- package/dist/components/Code/ValidationStatus/ValidationStatus.js.map +1 -1
- package/dist/components/DatePicker/DatePicker.d.ts +45 -2
- package/dist/components/DatePicker/DatePicker.d.ts.map +1 -1
- package/dist/components/DatePicker/DatePicker.js +228 -11
- package/dist/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/components/DatePicker/DateSegments.d.ts +60 -0
- package/dist/components/DatePicker/DateSegments.d.ts.map +1 -0
- package/dist/components/DatePicker/DateSegments.js +80 -0
- package/dist/components/DatePicker/DateSegments.js.map +1 -0
- package/dist/components/DatePicker/datepicker.types.d.ts +53 -37
- package/dist/components/DatePicker/datepicker.types.d.ts.map +1 -1
- package/dist/components/DatePicker/datepicker.types.js +5 -3
- package/dist/components/DatePicker/datepicker.types.js.map +1 -1
- package/dist/components/DatePicker/index.d.ts +10 -1
- package/dist/components/DatePicker/index.d.ts.map +1 -1
- package/dist/components/DatePicker/index.js +8 -0
- package/dist/components/DatePicker/index.js.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.d.ts +22 -3
- package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.js +38 -24
- package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
- package/dist/components/DateRangePicker/daterangepicker.types.d.ts +26 -21
- package/dist/components/DateRangePicker/daterangepicker.types.d.ts.map +1 -1
- package/dist/components/DateRangePicker/daterangepicker.types.js +6 -0
- package/dist/components/DateRangePicker/daterangepicker.types.js.map +1 -1
- package/dist/components/DateRangePicker/index.d.ts +8 -1
- package/dist/components/DateRangePicker/index.d.ts.map +1 -1
- package/dist/components/DateRangePicker/index.js +6 -0
- package/dist/components/DateRangePicker/index.js.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.d.ts +32 -4
- package/dist/components/DateTimePicker/DateTimePicker.d.ts.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.js +133 -42
- package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
- package/dist/components/DateTimePicker/DateTimeSegments.d.ts +41 -0
- package/dist/components/DateTimePicker/DateTimeSegments.d.ts.map +1 -0
- package/dist/components/DateTimePicker/DateTimeSegments.js +67 -0
- package/dist/components/DateTimePicker/DateTimeSegments.js.map +1 -0
- package/dist/components/DateTimePicker/datetimepicker.types.d.ts +26 -18
- package/dist/components/DateTimePicker/datetimepicker.types.d.ts.map +1 -1
- package/dist/components/DateTimePicker/datetimepicker.types.js +10 -0
- package/dist/components/DateTimePicker/datetimepicker.types.js.map +1 -1
- package/dist/components/DateTimePicker/index.d.ts +8 -1
- package/dist/components/DateTimePicker/index.d.ts.map +1 -1
- package/dist/components/DateTimePicker/index.js +6 -0
- package/dist/components/DateTimePicker/index.js.map +1 -1
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts +30 -4
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts.map +1 -1
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js +171 -72
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js.map +1 -1
- package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts +28 -19
- package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts.map +1 -1
- package/dist/components/DateTimeRangePicker/datetimerangepicker.types.js +8 -0
- package/dist/components/DateTimeRangePicker/datetimerangepicker.types.js.map +1 -1
- package/dist/components/DateTimeRangePicker/index.d.ts +8 -0
- package/dist/components/DateTimeRangePicker/index.d.ts.map +1 -1
- package/dist/components/DateTimeRangePicker/index.js +7 -0
- package/dist/components/DateTimeRangePicker/index.js.map +1 -1
- package/dist/components/Field/Field.d.ts +18 -20
- package/dist/components/Field/Field.d.ts.map +1 -1
- package/dist/components/Field/Field.js +22 -5
- package/dist/components/Field/Field.js.map +1 -1
- package/dist/components/FormField/FormField.d.ts +15 -0
- package/dist/components/FormField/FormField.d.ts.map +1 -1
- package/dist/components/FormField/FormField.js +15 -0
- package/dist/components/FormField/FormField.js.map +1 -1
- package/dist/components/HoverCard/HoverCard.d.ts +6 -0
- package/dist/components/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/components/HoverCard/HoverCard.js +6 -0
- package/dist/components/HoverCard/HoverCard.js.map +1 -1
- package/dist/components/Input/Input.d.ts +15 -0
- package/dist/components/Input/Input.d.ts.map +1 -1
- package/dist/components/Input/Input.js +18 -3
- package/dist/components/Input/Input.js.map +1 -1
- package/dist/components/LineChart/LineChart.d.ts +35 -2
- package/dist/components/LineChart/LineChart.d.ts.map +1 -1
- package/dist/components/LineChart/LineChart.js +22 -3
- package/dist/components/LineChart/LineChart.js.map +1 -1
- package/dist/components/Markdown/Markdown.d.ts +19 -4
- package/dist/components/Markdown/Markdown.d.ts.map +1 -1
- package/dist/components/Markdown/Markdown.js +20 -2
- package/dist/components/Markdown/Markdown.js.map +1 -1
- package/dist/components/Message/Message.d.ts +49 -4
- package/dist/components/Message/Message.d.ts.map +1 -1
- package/dist/components/Message/Message.js +62 -11
- package/dist/components/Message/Message.js.map +1 -1
- package/dist/components/Message/index.d.ts +1 -1
- package/dist/components/Message/index.d.ts.map +1 -1
- package/dist/components/Modal/Modal.d.ts +60 -5
- package/dist/components/Modal/Modal.d.ts.map +1 -1
- package/dist/components/Modal/Modal.js +52 -6
- package/dist/components/Modal/Modal.js.map +1 -1
- package/dist/components/Modal/components/ModalContext.d.ts +14 -0
- package/dist/components/Modal/components/ModalContext.d.ts.map +1 -1
- package/dist/components/Modal/components/ModalContext.js.map +1 -1
- package/dist/components/Modal/components/ModalHeader.d.ts.map +1 -1
- package/dist/components/Modal/components/ModalHeader.js +13 -2
- package/dist/components/Modal/components/ModalHeader.js.map +1 -1
- package/dist/components/Popover/Popover.d.ts +29 -0
- package/dist/components/Popover/Popover.d.ts.map +1 -1
- package/dist/components/Popover/Popover.js +36 -0
- package/dist/components/Popover/Popover.js.map +1 -1
- package/dist/components/Popover/components/PopoverBody.d.ts.map +1 -1
- package/dist/components/Popover/components/PopoverBody.js +5 -2
- package/dist/components/Popover/components/PopoverBody.js.map +1 -1
- package/dist/components/Popover/components/PopoverContext.d.ts +1 -0
- package/dist/components/Popover/components/PopoverContext.d.ts.map +1 -1
- package/dist/components/Popover/components/PopoverContext.js.map +1 -1
- package/dist/components/Popover/components/PopoverTrigger.d.ts.map +1 -1
- package/dist/components/Popover/components/PopoverTrigger.js +2 -2
- package/dist/components/Popover/components/PopoverTrigger.js.map +1 -1
- package/dist/components/ProgressBar/ProgressBar.d.ts +16 -1
- package/dist/components/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/components/ProgressBar/ProgressBar.js +19 -3
- package/dist/components/ProgressBar/ProgressBar.js.map +1 -1
- package/dist/components/RadioButton/RadioButton.d.ts +26 -0
- package/dist/components/RadioButton/RadioButton.d.ts.map +1 -1
- package/dist/components/RadioButton/RadioButton.js +35 -1
- package/dist/components/RadioButton/RadioButton.js.map +1 -1
- package/dist/components/RadioButtonGroup/RadioButtonGroup.d.ts +26 -0
- package/dist/components/RadioButtonGroup/RadioButtonGroup.d.ts.map +1 -1
- package/dist/components/RadioButtonGroup/RadioButtonGroup.js +33 -0
- package/dist/components/RadioButtonGroup/RadioButtonGroup.js.map +1 -1
- package/dist/components/SearchInput/SearchInput.d.ts +10 -0
- package/dist/components/SearchInput/SearchInput.d.ts.map +1 -1
- package/dist/components/SearchInput/SearchInput.js +12 -1
- package/dist/components/SearchInput/SearchInput.js.map +1 -1
- package/dist/components/Select/Select.d.ts +10 -2
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/Select.js +63 -18
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/Select/SelectDropdown.d.ts +14 -2
- package/dist/components/Select/SelectDropdown.d.ts.map +1 -1
- package/dist/components/Select/SelectDropdown.js +20 -4
- package/dist/components/Select/SelectDropdown.js.map +1 -1
- package/dist/components/Select/SelectTrigger.d.ts +10 -3
- package/dist/components/Select/SelectTrigger.d.ts.map +1 -1
- package/dist/components/Select/SelectTrigger.js +12 -3
- package/dist/components/Select/SelectTrigger.js.map +1 -1
- package/dist/components/Select/useSelectKeyboard.d.ts +15 -1
- package/dist/components/Select/useSelectKeyboard.d.ts.map +1 -1
- package/dist/components/Select/useSelectKeyboard.js +73 -65
- package/dist/components/Select/useSelectKeyboard.js.map +1 -1
- package/dist/components/Separator/Separator.d.ts +10 -0
- package/dist/components/Separator/Separator.d.ts.map +1 -1
- package/dist/components/Separator/Separator.js +10 -0
- package/dist/components/Separator/Separator.js.map +1 -1
- package/dist/components/Sheet/Sheet.d.ts +25 -5
- package/dist/components/Sheet/Sheet.d.ts.map +1 -1
- package/dist/components/Sheet/Sheet.js +24 -6
- package/dist/components/Sheet/Sheet.js.map +1 -1
- package/dist/components/Sheet/components/SheetContext.d.ts +10 -0
- package/dist/components/Sheet/components/SheetContext.d.ts.map +1 -1
- package/dist/components/Sheet/components/SheetContext.js.map +1 -1
- package/dist/components/Sheet/components/SheetFooter.js +1 -1
- package/dist/components/Sheet/components/SheetFooter.js.map +1 -1
- package/dist/components/Sheet/components/SheetHeader.d.ts.map +1 -1
- package/dist/components/Sheet/components/SheetHeader.js +11 -2
- package/dist/components/Sheet/components/SheetHeader.js.map +1 -1
- package/dist/components/Sparkline/Sparkline.d.ts +21 -2
- package/dist/components/Sparkline/Sparkline.d.ts.map +1 -1
- package/dist/components/Sparkline/Sparkline.js +16 -3
- package/dist/components/Sparkline/Sparkline.js.map +1 -1
- package/dist/components/Spinner/Spinner.d.ts +27 -2
- package/dist/components/Spinner/Spinner.d.ts.map +1 -1
- package/dist/components/Spinner/Spinner.js +28 -3
- package/dist/components/Spinner/Spinner.js.map +1 -1
- package/dist/components/Switch/Switch.d.ts +18 -0
- package/dist/components/Switch/Switch.d.ts.map +1 -1
- package/dist/components/Switch/Switch.js +19 -1
- package/dist/components/Switch/Switch.js.map +1 -1
- package/dist/components/Tabs/Tabs.d.ts +8 -2
- package/dist/components/Tabs/Tabs.d.ts.map +1 -1
- package/dist/components/Tabs/Tabs.js +6 -0
- package/dist/components/Tabs/Tabs.js.map +1 -1
- package/dist/components/Tabs/components/TabsList.d.ts +1 -1
- package/dist/components/Tabs/components/TabsList.d.ts.map +1 -1
- package/dist/components/Tabs/components/TabsList.js +5 -4
- package/dist/components/Tabs/components/TabsList.js.map +1 -1
- package/dist/components/Tabs/components/TabsPanels.d.ts +1 -1
- package/dist/components/Tabs/components/TabsPanels.d.ts.map +1 -1
- package/dist/components/Tabs/components/TabsPanels.js +5 -3
- package/dist/components/Tabs/components/TabsPanels.js.map +1 -1
- package/dist/components/Tabs/components/TabsTrigger.d.ts.map +1 -1
- package/dist/components/Tabs/components/TabsTrigger.js +22 -6
- package/dist/components/Tabs/components/TabsTrigger.js.map +1 -1
- package/dist/components/TagChip/TagChip.d.ts +16 -13
- package/dist/components/TagChip/TagChip.d.ts.map +1 -1
- package/dist/components/TagChip/TagChip.js +18 -3
- package/dist/components/TagChip/TagChip.js.map +1 -1
- package/dist/components/TagInput/TagInput.d.ts +12 -9
- package/dist/components/TagInput/TagInput.d.ts.map +1 -1
- package/dist/components/TagInput/TagInput.js +16 -4
- package/dist/components/TagInput/TagInput.js.map +1 -1
- package/dist/components/Text/Text.d.ts +9 -0
- package/dist/components/Text/Text.d.ts.map +1 -1
- package/dist/components/Text/Text.js +9 -0
- package/dist/components/Text/Text.js.map +1 -1
- package/dist/components/TextInline/TextInline.d.ts +15 -4
- package/dist/components/TextInline/TextInline.d.ts.map +1 -1
- package/dist/components/TextInline/TextInline.js +11 -0
- package/dist/components/TextInline/TextInline.js.map +1 -1
- package/dist/components/Textarea/Textarea.d.ts +12 -0
- package/dist/components/Textarea/Textarea.d.ts.map +1 -1
- package/dist/components/Textarea/Textarea.js +13 -1
- package/dist/components/Textarea/Textarea.js.map +1 -1
- package/dist/components/TimePicker/TimeColumn.d.ts +10 -1
- package/dist/components/TimePicker/TimeColumn.d.ts.map +1 -1
- package/dist/components/TimePicker/TimeColumn.js +8 -1
- package/dist/components/TimePicker/TimeColumn.js.map +1 -1
- package/dist/components/TimePicker/TimePicker.d.ts +34 -2
- package/dist/components/TimePicker/TimePicker.d.ts.map +1 -1
- package/dist/components/TimePicker/TimePicker.js +118 -15
- package/dist/components/TimePicker/TimePicker.js.map +1 -1
- package/dist/components/TimePicker/TimeSegments.d.ts +50 -0
- package/dist/components/TimePicker/TimeSegments.d.ts.map +1 -0
- package/dist/components/TimePicker/TimeSegments.js +93 -0
- package/dist/components/TimePicker/TimeSegments.js.map +1 -0
- package/dist/components/TimePicker/timepicker.hooks.d.ts +0 -4
- package/dist/components/TimePicker/timepicker.hooks.d.ts.map +1 -1
- package/dist/components/TimePicker/timepicker.hooks.js +1 -23
- package/dist/components/TimePicker/timepicker.hooks.js.map +1 -1
- package/dist/components/TimePicker/timepicker.types.d.ts +14 -15
- package/dist/components/TimePicker/timepicker.types.d.ts.map +1 -1
- package/dist/components/TimePicker/timepicker.types.js +4 -3
- package/dist/components/TimePicker/timepicker.types.js.map +1 -1
- package/dist/components/Toast/Toast.d.ts +27 -0
- package/dist/components/Toast/Toast.d.ts.map +1 -1
- package/dist/components/Toast/Toast.js +28 -1
- package/dist/components/Toast/Toast.js.map +1 -1
- package/dist/components/Toggle/Toggle.d.ts +31 -12
- package/dist/components/Toggle/Toggle.d.ts.map +1 -1
- package/dist/components/Toggle/Toggle.js +19 -31
- package/dist/components/Toggle/Toggle.js.map +1 -1
- package/dist/components/Toggle/index.d.ts +1 -1
- package/dist/components/Toggle/index.d.ts.map +1 -1
- package/dist/components/Toggle/index.js +1 -1
- package/dist/components/Toggle/index.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.d.ts +17 -0
- package/dist/components/ToggleGroup/ToggleGroup.d.ts.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.js +17 -0
- package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupItem.d.ts +1 -1
- package/dist/components/ToggleGroup/ToggleGroupItem.d.ts.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupItem.js +7 -6
- package/dist/components/ToggleGroup/ToggleGroupItem.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts +4 -3
- package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupMultiple.js +2 -2
- package/dist/components/ToggleGroup/ToggleGroupMultiple.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts +4 -3
- package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupSingle.js +2 -2
- package/dist/components/ToggleGroup/ToggleGroupSingle.js.map +1 -1
- package/dist/components/ToggleGroup/toggleGroup.types.d.ts +12 -3
- package/dist/components/ToggleGroup/toggleGroup.types.d.ts.map +1 -1
- package/dist/components/Tooltip/Tooltip.d.ts +6 -0
- package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/components/Tooltip/Tooltip.js +6 -0
- package/dist/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/date-time/index.d.ts +2 -0
- package/dist/date-time/index.d.ts.map +1 -1
- package/dist/date-time/index.js +9 -1
- package/dist/date-time/index.js.map +1 -1
- package/dist/date-time/iso.d.ts +261 -0
- package/dist/date-time/iso.d.ts.map +1 -0
- package/dist/date-time/iso.js +358 -0
- package/dist/date-time/iso.js.map +1 -0
- package/dist/date-time/now.d.ts +7 -6
- package/dist/date-time/now.d.ts.map +1 -1
- package/dist/date-time/now.js +3 -3
- package/dist/date-time/now.js.map +1 -1
- package/dist/internal/PickerField.d.ts +45 -0
- package/dist/internal/PickerField.d.ts.map +1 -0
- package/dist/internal/PickerField.js +24 -0
- package/dist/internal/PickerField.js.map +1 -0
- package/dist/internal/SegmentedField.d.ts +98 -0
- package/dist/internal/SegmentedField.d.ts.map +1 -0
- package/dist/internal/SegmentedField.js +315 -0
- package/dist/internal/SegmentedField.js.map +1 -0
- package/dist/internal/index.d.ts +2 -0
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +2 -0
- package/dist/internal/index.js.map +1 -1
- package/dist/theme/index.d.ts +4 -3
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +3 -2
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/schema.d.ts +49 -33
- package/dist/theme/schema.d.ts.map +1 -1
- package/dist/theme/schema.js +30 -21
- package/dist/theme/schema.js.map +1 -1
- package/package.json +11 -59
- package/src/components/Badge/Badge.tsx +87 -49
- package/src/components/Badge/index.ts +10 -1
- package/src/components/BarChart/BarChart.tsx +37 -30
- package/src/components/Button/Button.tsx +129 -106
- package/src/components/Button/index.ts +10 -1
- package/src/components/Calendar/Calendar.tsx +104 -401
- package/src/components/Calendar/CalendarView.tsx +454 -0
- package/src/components/Calendar/calendar.types.ts +104 -29
- package/src/components/Calendar/index.ts +16 -17
- package/src/components/Card/Card.tsx +15 -2
- package/src/components/Checkbox/Checkbox.tsx +22 -2
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +22 -0
- package/src/components/Code/Editor/Editor.tsx +2 -2
- package/src/components/Code/Editor/themes.ts +50 -32
- package/src/components/Code/ValidationStatus/ValidationStatus.tsx +6 -3
- package/src/components/DatePicker/DatePicker.tsx +369 -42
- package/src/components/DatePicker/DateSegments.tsx +125 -0
- package/src/components/DatePicker/datepicker.types.ts +58 -39
- package/src/components/DatePicker/index.ts +11 -3
- package/src/components/DateRangePicker/DateRangePicker.tsx +38 -24
- package/src/components/DateRangePicker/daterangepicker.types.ts +29 -23
- package/src/components/DateRangePicker/index.ts +9 -1
- package/src/components/DateTimePicker/DateTimePicker.tsx +189 -88
- package/src/components/DateTimePicker/DateTimeSegments.tsx +113 -0
- package/src/components/DateTimePicker/datetimepicker.types.ts +29 -19
- package/src/components/DateTimePicker/index.ts +9 -1
- package/src/components/DateTimeRangePicker/DateTimeRangePicker.tsx +251 -126
- package/src/components/DateTimeRangePicker/datetimerangepicker.types.ts +31 -20
- package/src/components/DateTimeRangePicker/index.ts +9 -0
- package/src/components/Field/Field.tsx +25 -26
- package/src/components/FormField/FormField.tsx +15 -0
- package/src/components/HoverCard/HoverCard.tsx +6 -0
- package/src/components/Input/Input.tsx +19 -4
- package/src/components/LineChart/LineChart.tsx +164 -141
- package/src/components/Markdown/Markdown.tsx +21 -3
- package/src/components/Message/Message.tsx +83 -17
- package/src/components/Message/index.ts +1 -1
- package/src/components/Modal/Modal.tsx +157 -86
- package/src/components/Modal/components/ModalContext.tsx +14 -0
- package/src/components/Modal/components/ModalHeader.tsx +15 -3
- package/src/components/Popover/Popover.tsx +36 -0
- package/src/components/Popover/components/PopoverBody.tsx +6 -1
- package/src/components/Popover/components/PopoverContext.tsx +1 -0
- package/src/components/Popover/components/PopoverTrigger.tsx +2 -1
- package/src/components/ProgressBar/ProgressBar.tsx +46 -28
- package/src/components/RadioButton/RadioButton.tsx +34 -3
- package/src/components/RadioButtonGroup/RadioButtonGroup.tsx +32 -0
- package/src/components/SearchInput/SearchInput.tsx +13 -2
- package/src/components/Select/Select.tsx +75 -19
- package/src/components/Select/SelectDropdown.tsx +45 -12
- package/src/components/Select/SelectTrigger.tsx +31 -8
- package/src/components/Select/useSelectKeyboard.ts +20 -10
- package/src/components/Separator/Separator.tsx +10 -0
- package/src/components/Sheet/Sheet.tsx +114 -83
- package/src/components/Sheet/components/SheetContext.tsx +10 -0
- package/src/components/Sheet/components/SheetFooter.tsx +1 -1
- package/src/components/Sheet/components/SheetHeader.tsx +18 -3
- package/src/components/Sparkline/Sparkline.tsx +40 -36
- package/src/components/Spinner/Spinner.tsx +28 -3
- package/src/components/Switch/Switch.tsx +27 -4
- package/src/components/Tabs/Tabs.tsx +6 -0
- package/src/components/Tabs/components/TabsList.tsx +5 -3
- package/src/components/Tabs/components/TabsPanels.tsx +5 -3
- package/src/components/Tabs/components/TabsTrigger.tsx +22 -5
- package/src/components/TagChip/TagChip.tsx +27 -18
- package/src/components/TagInput/TagInput.tsx +16 -11
- package/src/components/Text/Text.tsx +9 -0
- package/src/components/TextInline/TextInline.tsx +11 -0
- package/src/components/Textarea/Textarea.tsx +13 -1
- package/src/components/TimePicker/TimeColumn.tsx +24 -1
- package/src/components/TimePicker/TimePicker.tsx +157 -51
- package/src/components/TimePicker/TimeSegments.tsx +131 -0
- package/src/components/TimePicker/timepicker.hooks.ts +1 -24
- package/src/components/TimePicker/timepicker.types.ts +14 -16
- package/src/components/Toast/Toast.tsx +28 -1
- package/src/components/Toggle/Toggle.tsx +34 -32
- package/src/components/Toggle/index.ts +1 -1
- package/src/components/ToggleGroup/ToggleGroup.tsx +17 -0
- package/src/components/ToggleGroup/ToggleGroupItem.tsx +13 -8
- package/src/components/ToggleGroup/ToggleGroupMultiple.tsx +3 -1
- package/src/components/ToggleGroup/ToggleGroupSingle.tsx +3 -1
- package/src/components/ToggleGroup/toggleGroup.types.ts +12 -3
- package/src/components/Tooltip/Tooltip.tsx +6 -0
- package/src/date-time/index.ts +61 -1
- package/src/date-time/iso.ts +511 -0
- package/src/date-time/now.ts +10 -9
- package/src/internal/PickerField.tsx +90 -0
- package/src/internal/SegmentedField.tsx +445 -0
- package/src/internal/index.ts +2 -0
- package/src/theme/index.ts +11 -9
- package/src/theme/recipes/badge.css +140 -0
- package/src/theme/recipes/button.css +167 -0
- package/src/theme/recipes/card.css +26 -0
- package/src/theme/recipes/checkbox.css +44 -0
- package/src/theme/recipes/field.css +14 -0
- package/src/theme/recipes/index.css +28 -0
- package/src/theme/recipes/input.css +29 -0
- package/src/theme/recipes/message.css +47 -0
- package/src/theme/recipes/modal.css +31 -0
- package/src/theme/recipes/radio-button.css +42 -0
- package/src/theme/recipes/search-input.css +16 -0
- package/src/theme/recipes/select.css +105 -0
- package/src/theme/recipes/sheet.css +34 -0
- package/src/theme/recipes/spinner.css +17 -0
- package/src/theme/recipes/switch.css +39 -0
- package/src/theme/recipes/tabs.css +41 -0
- package/src/theme/recipes/tag-chip.css +27 -0
- package/src/theme/recipes/textarea.css +20 -0
- package/src/theme/recipes/toggle.css +92 -0
- package/src/theme/schema.ts +59 -58
- package/src/theme/tokens.css +824 -0
- package/dist/components/Avatar/Avatar.d.ts +0 -6
- package/dist/components/Avatar/Avatar.d.ts.map +0 -1
- package/dist/components/Avatar/Avatar.js +0 -11
- package/dist/components/Avatar/Avatar.js.map +0 -1
- package/dist/components/Avatar/index.d.ts +0 -2
- package/dist/components/Avatar/index.d.ts.map +0 -1
- package/dist/components/Avatar/index.js +0 -2
- package/dist/components/Avatar/index.js.map +0 -1
- package/dist/components/Breadcrumb/Breadcrumb.d.ts +0 -12
- package/dist/components/Breadcrumb/Breadcrumb.d.ts.map +0 -1
- package/dist/components/Breadcrumb/Breadcrumb.js +0 -19
- package/dist/components/Breadcrumb/Breadcrumb.js.map +0 -1
- package/dist/components/Breadcrumb/index.d.ts +0 -2
- package/dist/components/Breadcrumb/index.d.ts.map +0 -1
- package/dist/components/Breadcrumb/index.js +0 -2
- package/dist/components/Breadcrumb/index.js.map +0 -1
- package/dist/components/ColorDot/ColorDot.d.ts +0 -13
- package/dist/components/ColorDot/ColorDot.d.ts.map +0 -1
- package/dist/components/ColorDot/ColorDot.js +0 -34
- package/dist/components/ColorDot/ColorDot.js.map +0 -1
- package/dist/components/ColorDot/index.d.ts +0 -2
- package/dist/components/ColorDot/index.d.ts.map +0 -1
- package/dist/components/ColorDot/index.js +0 -2
- package/dist/components/ColorDot/index.js.map +0 -1
- package/dist/components/EmptyState/EmptyState.d.ts +0 -15
- package/dist/components/EmptyState/EmptyState.d.ts.map +0 -1
- package/dist/components/EmptyState/EmptyState.js +0 -7
- package/dist/components/EmptyState/EmptyState.js.map +0 -1
- package/dist/components/EmptyState/index.d.ts +0 -2
- package/dist/components/EmptyState/index.d.ts.map +0 -1
- package/dist/components/EmptyState/index.js +0 -2
- package/dist/components/EmptyState/index.js.map +0 -1
- package/dist/components/HeatMap/HeatMapCalendar.d.ts +0 -11
- package/dist/components/HeatMap/HeatMapCalendar.d.ts.map +0 -1
- package/dist/components/HeatMap/HeatMapCalendar.js +0 -68
- package/dist/components/HeatMap/HeatMapCalendar.js.map +0 -1
- package/dist/components/HeatMap/HeatMapMatrix.d.ts +0 -12
- package/dist/components/HeatMap/HeatMapMatrix.d.ts.map +0 -1
- package/dist/components/HeatMap/HeatMapMatrix.js +0 -35
- package/dist/components/HeatMap/HeatMapMatrix.js.map +0 -1
- package/dist/components/HeatMap/heat-map.utils.d.ts +0 -10
- package/dist/components/HeatMap/heat-map.utils.d.ts.map +0 -1
- package/dist/components/HeatMap/heat-map.utils.js +0 -10
- package/dist/components/HeatMap/heat-map.utils.js.map +0 -1
- package/dist/components/HeatMap/index.d.ts +0 -4
- package/dist/components/HeatMap/index.d.ts.map +0 -1
- package/dist/components/HeatMap/index.js +0 -3
- package/dist/components/HeatMap/index.js.map +0 -1
- package/dist/components/MetricList/MetricList.d.ts +0 -9
- package/dist/components/MetricList/MetricList.d.ts.map +0 -1
- package/dist/components/MetricList/MetricList.js +0 -6
- package/dist/components/MetricList/MetricList.js.map +0 -1
- package/dist/components/MetricList/MetricRow.d.ts +0 -13
- package/dist/components/MetricList/MetricRow.d.ts.map +0 -1
- package/dist/components/MetricList/MetricRow.js +0 -13
- package/dist/components/MetricList/MetricRow.js.map +0 -1
- package/dist/components/MetricList/index.d.ts +0 -3
- package/dist/components/MetricList/index.d.ts.map +0 -1
- package/dist/components/MetricList/index.js +0 -3
- package/dist/components/MetricList/index.js.map +0 -1
- package/dist/components/NavBottom/NavBottom.d.ts +0 -15
- package/dist/components/NavBottom/NavBottom.d.ts.map +0 -1
- package/dist/components/NavBottom/NavBottom.js +0 -19
- package/dist/components/NavBottom/NavBottom.js.map +0 -1
- package/dist/components/NavBottom/index.d.ts +0 -3
- package/dist/components/NavBottom/index.d.ts.map +0 -1
- package/dist/components/NavBottom/index.js +0 -2
- package/dist/components/NavBottom/index.js.map +0 -1
- package/dist/components/NavSide/NavItem.d.ts +0 -9
- package/dist/components/NavSide/NavItem.d.ts.map +0 -1
- package/dist/components/NavSide/NavItem.js +0 -13
- package/dist/components/NavSide/NavItem.js.map +0 -1
- package/dist/components/NavSide/NavSide.d.ts +0 -15
- package/dist/components/NavSide/NavSide.d.ts.map +0 -1
- package/dist/components/NavSide/NavSide.js +0 -10
- package/dist/components/NavSide/NavSide.js.map +0 -1
- package/dist/components/NavSide/index.d.ts +0 -3
- package/dist/components/NavSide/index.d.ts.map +0 -1
- package/dist/components/NavSide/index.js +0 -2
- package/dist/components/NavSide/index.js.map +0 -1
- package/dist/components/NavSide/types.d.ts +0 -38
- package/dist/components/NavSide/types.d.ts.map +0 -1
- package/dist/components/NavSide/types.js +0 -2
- package/dist/components/NavSide/types.js.map +0 -1
- package/dist/components/Pagination/Pagination.d.ts +0 -35
- package/dist/components/Pagination/Pagination.d.ts.map +0 -1
- package/dist/components/Pagination/Pagination.js +0 -26
- package/dist/components/Pagination/Pagination.js.map +0 -1
- package/dist/components/Pagination/index.d.ts +0 -3
- package/dist/components/Pagination/index.d.ts.map +0 -1
- package/dist/components/Pagination/index.js +0 -2
- package/dist/components/Pagination/index.js.map +0 -1
- package/dist/components/Skeleton/Skeleton.d.ts +0 -3
- package/dist/components/Skeleton/Skeleton.d.ts.map +0 -1
- package/dist/components/Skeleton/Skeleton.js +0 -7
- package/dist/components/Skeleton/Skeleton.js.map +0 -1
- package/dist/components/Skeleton/index.d.ts +0 -2
- package/dist/components/Skeleton/index.d.ts.map +0 -1
- package/dist/components/Skeleton/index.js +0 -2
- package/dist/components/Skeleton/index.js.map +0 -1
- package/dist/components/StatsCard/StatsCard.d.ts +0 -17
- package/dist/components/StatsCard/StatsCard.d.ts.map +0 -1
- package/dist/components/StatsCard/StatsCard.js +0 -13
- package/dist/components/StatsCard/StatsCard.js.map +0 -1
- package/dist/components/StatsCard/index.d.ts +0 -2
- package/dist/components/StatsCard/index.d.ts.map +0 -1
- package/dist/components/StatsCard/index.js +0 -2
- package/dist/components/StatsCard/index.js.map +0 -1
- package/dist/styles.css +0 -2
- package/dist/theme.generated.css +0 -438
- package/src/components/Avatar/Avatar.tsx +0 -19
- package/src/components/Avatar/index.ts +0 -1
- package/src/components/Breadcrumb/Breadcrumb.tsx +0 -47
- package/src/components/Breadcrumb/index.ts +0 -5
- package/src/components/ColorDot/ColorDot.tsx +0 -50
- package/src/components/ColorDot/index.ts +0 -1
- package/src/components/EmptyState/EmptyState.tsx +0 -29
- package/src/components/EmptyState/index.ts +0 -1
- package/src/components/HeatMap/HeatMapCalendar.tsx +0 -127
- package/src/components/HeatMap/HeatMapMatrix.tsx +0 -75
- package/src/components/HeatMap/heat-map.utils.ts +0 -15
- package/src/components/HeatMap/index.ts +0 -3
- package/src/components/MetricList/MetricList.tsx +0 -13
- package/src/components/MetricList/MetricRow.tsx +0 -30
- package/src/components/MetricList/index.ts +0 -2
- package/src/components/NavBottom/NavBottom.tsx +0 -53
- package/src/components/NavBottom/index.ts +0 -3
- package/src/components/NavSide/NavItem.tsx +0 -39
- package/src/components/NavSide/NavSide.tsx +0 -40
- package/src/components/NavSide/index.ts +0 -2
- package/src/components/NavSide/types.ts +0 -36
- package/src/components/Pagination/Pagination.tsx +0 -86
- package/src/components/Pagination/index.ts +0 -2
- package/src/components/Skeleton/Skeleton.tsx +0 -7
- package/src/components/Skeleton/index.ts +0 -1
- package/src/components/StatsCard/StatsCard.tsx +0 -40
- package/src/components/StatsCard/index.ts +0 -1
- package/src/styles/base.css +0 -41
- package/src/theme/palette.json +0 -100
- package/src/theme/palette.schema.json +0 -40
- package/src/theme/theme.json +0 -349
- package/src/theme/theme.schema.json +0 -876
- package/src/theme/typography.json +0 -7
- package/src/theme/typography.schema.json +0 -36
- package/tailwind.config.ts +0 -261
|
@@ -6,33 +6,99 @@ 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 */
|
|
33
54
|
icon?: React.ReactNode;
|
|
34
55
|
};
|
|
35
56
|
|
|
57
|
+
/**
|
|
58
|
+
* A message is a live region, and the intent decides how rudely it interrupts.
|
|
59
|
+
* `danger` is the only intent that earns `role="alert"` — an assertive region
|
|
60
|
+
* cuts off whatever the screen reader was saying. Everything else is
|
|
61
|
+
* `role="status"` (polite), which is announced at the next natural pause. A
|
|
62
|
+
* success confirmation or a static "Note" callout stamped as `alert` trains
|
|
63
|
+
* users to ignore the role that actually matters. Consumers can override by
|
|
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.
|
|
71
|
+
*/
|
|
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
|
+
}
|
|
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
|
+
*/
|
|
36
102
|
export const Message = React.forwardRef<HTMLDivElement, MessageProps>(({ className, intent = "neutral", size, title, icon, children, ...props }, ref) => {
|
|
37
103
|
const hasCompoundChildren = React.Children.toArray(children).some(
|
|
38
104
|
(child) =>
|
|
@@ -41,7 +107,7 @@ export const Message = React.forwardRef<HTMLDivElement, MessageProps>(({ classNa
|
|
|
41
107
|
);
|
|
42
108
|
|
|
43
109
|
return (
|
|
44
|
-
<div ref={ref} role=
|
|
110
|
+
<div ref={ref} role={intentRole(intent)} data-intent={intent} className={cn(messageVariants({ size, className }))} {...props}>
|
|
45
111
|
{hasCompoundChildren ? (
|
|
46
112
|
children
|
|
47
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";
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { FloatingFocusManager, FloatingOverlay, useDismiss, useFloating, useInteractions, useRole } from "@floating-ui/react";
|
|
2
2
|
import { useMergedFloatingRef, usePresence } from "@sixthshift/design-system/hooks";
|
|
3
3
|
import { cn } from "@sixthshift/design-system/utils";
|
|
4
|
-
import { type HTMLAttributes, type ReactNode, useCallback, useContext, useEffect, useMemo } from "react";
|
|
4
|
+
import { forwardRef, type HTMLAttributes, type ReactNode, useCallback, useContext, useEffect, useId, useMemo, useState } from "react";
|
|
5
5
|
import { ModalBody, ModalContext, ModalFooter, ModalHeader } from "./components";
|
|
6
6
|
|
|
7
7
|
// =============================================================================
|
|
8
8
|
// Types
|
|
9
9
|
// =============================================================================
|
|
10
10
|
|
|
11
|
-
export type ModalProps = Pick<HTMLAttributes<HTMLDivElement>, "className" | "style"> & {
|
|
11
|
+
export type ModalProps = Pick<HTMLAttributes<HTMLDivElement>, "className" | "style" | "aria-label" | "aria-labelledby" | "aria-describedby"> & {
|
|
12
12
|
/**
|
|
13
13
|
* Called when the modal's open state should change. Today Modal is mount-driven
|
|
14
14
|
* (parent conditionally renders), so this fires only with `false` on dismissal.
|
|
@@ -47,98 +47,169 @@ const sizeClasses = {
|
|
|
47
47
|
// Modal
|
|
48
48
|
// =============================================================================
|
|
49
49
|
|
|
50
|
-
const ModalRoot =
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const handleClose = useCallback(() => {
|
|
66
|
-
hide(handleDismiss);
|
|
67
|
-
}, [handleDismiss, hide]);
|
|
68
|
-
|
|
69
|
-
const { refs, context } = useFloating({
|
|
70
|
-
open: true,
|
|
71
|
-
onOpenChange: (nextOpen) => {
|
|
72
|
-
if (!nextOpen) handleClose();
|
|
50
|
+
const ModalRoot = forwardRef<HTMLDivElement, ModalProps>(
|
|
51
|
+
(
|
|
52
|
+
{
|
|
53
|
+
onOpenChange,
|
|
54
|
+
size = "md",
|
|
55
|
+
className,
|
|
56
|
+
style,
|
|
57
|
+
children,
|
|
58
|
+
dismissable = true,
|
|
59
|
+
closable,
|
|
60
|
+
align = "center",
|
|
61
|
+
"aria-label": ariaLabel,
|
|
62
|
+
"aria-labelledby": ariaLabelledBy,
|
|
63
|
+
"aria-describedby": ariaDescribedBy,
|
|
73
64
|
},
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
65
|
+
ref
|
|
66
|
+
) => {
|
|
67
|
+
// Prefer explicit prop over context (context is set by useModal's overlay system)
|
|
68
|
+
const contextValue = useContext(ModalContext);
|
|
69
|
+
// Context provides a parameterless onClose for programmatic modals; adapt to the boolean shape.
|
|
70
|
+
const handleDismiss = useCallback(() => {
|
|
71
|
+
if (onOpenChange) onOpenChange(false);
|
|
72
|
+
else contextValue?.onClose();
|
|
73
|
+
}, [onOpenChange, contextValue]);
|
|
74
|
+
|
|
75
|
+
const { ref: presenceRef, state, isMounted, show, hide } = usePresence();
|
|
76
|
+
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
show();
|
|
79
|
+
}, [show]);
|
|
80
|
+
|
|
81
|
+
const handleClose = useCallback(() => {
|
|
82
|
+
hide(handleDismiss);
|
|
83
|
+
}, [handleDismiss, hide]);
|
|
84
|
+
|
|
85
|
+
const { refs, context } = useFloating({
|
|
86
|
+
open: true,
|
|
87
|
+
onOpenChange: (nextOpen) => {
|
|
88
|
+
if (!nextOpen) handleClose();
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
const mergedRef = useMergedFloatingRef<HTMLDivElement>(refs, presenceRef, ref);
|
|
93
|
+
|
|
94
|
+
const dismiss = useDismiss(context, {
|
|
95
|
+
enabled: dismissable,
|
|
96
|
+
// OverlayContext handles escape key for proper stack ordering
|
|
97
|
+
escapeKey: false,
|
|
98
|
+
outsidePress: true,
|
|
99
|
+
outsidePressEvent: "mousedown",
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const role = useRole(context, {
|
|
103
|
+
role: "dialog",
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
const { getFloatingProps } = useInteractions([dismiss, role]);
|
|
107
|
+
|
|
108
|
+
// The dialog names itself from its header. `Modal.Header` stamps `titleId`
|
|
109
|
+
// on itself and reports back, so a headerless modal falls through to the
|
|
110
|
+
// caller's `aria-label` instead of referencing an id that isn't there.
|
|
111
|
+
const titleId = useId();
|
|
112
|
+
const [hasTitle, setHasTitle] = useState(false);
|
|
113
|
+
const registerTitle = useCallback((present: boolean) => setHasTitle(present), []);
|
|
114
|
+
|
|
115
|
+
// `aria-labelledby` beats `aria-label` in the name computation, so a caller
|
|
116
|
+
// who passes a label must not also be pointed at the header — they would
|
|
117
|
+
// never see their own string win.
|
|
118
|
+
const labelledBy = ariaLabelledBy ?? (ariaLabel || !hasTitle ? undefined : titleId);
|
|
119
|
+
|
|
120
|
+
const modalContextValue = useMemo(() => ({ onClose: handleClose, closable, titleId, registerTitle }), [closable, handleClose, titleId, registerTitle]);
|
|
121
|
+
|
|
122
|
+
if (!isMounted) return null;
|
|
123
|
+
|
|
124
|
+
const isEntering = state === "entering";
|
|
125
|
+
const isExiting = state === "exiting";
|
|
126
|
+
|
|
127
|
+
return (
|
|
128
|
+
<FloatingFocusManager context={context} modal>
|
|
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")}
|
|
129
132
|
>
|
|
130
|
-
<
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}
|
|
133
|
+
<div
|
|
134
|
+
ref={mergedRef}
|
|
135
|
+
role="dialog"
|
|
136
|
+
aria-modal="true"
|
|
137
|
+
aria-label={ariaLabel}
|
|
138
|
+
aria-labelledby={labelledBy}
|
|
139
|
+
aria-describedby={ariaDescribedBy}
|
|
140
|
+
tabIndex={-1}
|
|
141
|
+
data-state={state}
|
|
142
|
+
className={cn(
|
|
143
|
+
"modal fixed flex flex-col overflow-hidden outline-hidden",
|
|
144
|
+
"border-(color:--modal-border) rounded-xl border bg-(--modal-bg)",
|
|
145
|
+
// Size
|
|
146
|
+
sizeClasses[size],
|
|
147
|
+
// Cap height so ModalBody scrolls instead of overflowing the viewport
|
|
148
|
+
"max-h-[95%]",
|
|
149
|
+
// Mobile: slide up from bottom, full width
|
|
150
|
+
"max-sm:inset-x-0 max-sm:bottom-0 max-sm:rounded-b-none",
|
|
151
|
+
isEntering && "max-sm:animate-slide-up-in",
|
|
152
|
+
isExiting && "max-sm:animate-slide-up-out",
|
|
153
|
+
// Desktop: horizontal center + vertical alignment
|
|
154
|
+
"sm:left-1/2 sm:-translate-x-1/2",
|
|
155
|
+
align === "center" && "sm:top-1/2 sm:-translate-y-1/2",
|
|
156
|
+
align === "top" && "sm:top-[15vh]",
|
|
157
|
+
isEntering && "sm:animate-fade-in",
|
|
158
|
+
isExiting && "sm:animate-fade-out",
|
|
159
|
+
className
|
|
160
|
+
)}
|
|
161
|
+
style={style}
|
|
162
|
+
{...getFloatingProps({})}
|
|
163
|
+
>
|
|
164
|
+
<ModalContext.Provider value={modalContextValue}>{children}</ModalContext.Provider>
|
|
165
|
+
</div>
|
|
166
|
+
</FloatingOverlay>
|
|
167
|
+
</FloatingFocusManager>
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
);
|
|
136
171
|
ModalRoot.displayName = "Modal";
|
|
137
172
|
|
|
138
173
|
// =============================================================================
|
|
139
174
|
// Compound Component Export
|
|
140
175
|
// =============================================================================
|
|
141
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
|
+
*/
|
|
142
213
|
export const Modal = Object.assign(ModalRoot, {
|
|
143
214
|
Header: ModalHeader,
|
|
144
215
|
Body: ModalBody,
|
|
@@ -9,6 +9,20 @@ export type OnClose = () => void;
|
|
|
9
9
|
interface ModalContextValue {
|
|
10
10
|
onClose: OnClose;
|
|
11
11
|
closable?: boolean | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* The id `Modal.Header` stamps on itself so the dialog can name itself from
|
|
14
|
+
* its own title. A dialog with no accessible name is announced as just
|
|
15
|
+
* "dialog", which tells a screen-reader user nothing about what interrupted
|
|
16
|
+
* them.
|
|
17
|
+
*/
|
|
18
|
+
titleId?: string;
|
|
19
|
+
/**
|
|
20
|
+
* The header reports its presence, because a headerless modal must not point
|
|
21
|
+
* `aria-labelledby` at an element that never rendered — a dangling reference
|
|
22
|
+
* is worse than no reference at all (it resolves to an empty name and axe
|
|
23
|
+
* flags it as an invalid attribute value).
|
|
24
|
+
*/
|
|
25
|
+
registerTitle?: (present: boolean) => void;
|
|
12
26
|
}
|
|
13
27
|
|
|
14
28
|
export const ModalContext = createContext<ModalContextValue | null>(null);
|
|
@@ -5,20 +5,32 @@ import { ModalContext } from "./ModalContext";
|
|
|
5
5
|
|
|
6
6
|
export type ModalHeaderProps = React.HTMLAttributes<HTMLDivElement>;
|
|
7
7
|
|
|
8
|
-
export const ModalHeader = React.forwardRef<HTMLDivElement, ModalHeaderProps>(({ className, children, ...props }, ref) => {
|
|
8
|
+
export const ModalHeader = React.forwardRef<HTMLDivElement, ModalHeaderProps>(({ className, children, id, ...props }, ref) => {
|
|
9
9
|
const context = React.useContext(ModalContext);
|
|
10
10
|
const closable = context?.closable;
|
|
11
11
|
const onClose = context?.onClose;
|
|
12
|
+
const registerTitle = context?.registerTitle;
|
|
13
|
+
|
|
14
|
+
// Tell the dialog it has a title to point `aria-labelledby` at, and take that
|
|
15
|
+
// back on unmount so a header removed at runtime doesn't leave a dangling
|
|
16
|
+
// reference behind. A caller-supplied `id` wins over the generated one, which
|
|
17
|
+
// also means the dialog can no longer find it — say so rather than pointing
|
|
18
|
+
// at an id that isn't in the DOM, and let the caller label the Modal itself.
|
|
19
|
+
const ownsTitleId = id === undefined;
|
|
20
|
+
React.useEffect(() => {
|
|
21
|
+
registerTitle?.(ownsTitleId);
|
|
22
|
+
return () => registerTitle?.(false);
|
|
23
|
+
}, [registerTitle, ownsTitleId]);
|
|
12
24
|
|
|
13
25
|
return (
|
|
14
|
-
<div ref={ref} className={cn("flex flex-col space-y-1.5 p-6", closable && "pr-12", className)} {...props}>
|
|
26
|
+
<div ref={ref} id={id ?? context?.titleId} className={cn("flex flex-col space-y-1.5 p-6", closable && "pr-12", className)} {...props}>
|
|
15
27
|
{children}
|
|
16
28
|
{closable && (
|
|
17
29
|
<button
|
|
18
30
|
type="button"
|
|
19
31
|
onClick={onClose}
|
|
20
32
|
aria-label="Close"
|
|
21
|
-
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)"
|
|
22
34
|
>
|
|
23
35
|
<X size={16} />
|
|
24
36
|
</button>
|
|
@@ -44,6 +44,12 @@ const PopoverRoot = ({ open: controlledOpen, onOpenChange, defaultOpen = false,
|
|
|
44
44
|
|
|
45
45
|
const id = useId();
|
|
46
46
|
const contentId = `popover-content-${id}`;
|
|
47
|
+
// `Popover.Body` is a `role="dialog"`, and a dialog with no accessible name is
|
|
48
|
+
// announced as just "dialog". There is no title sub-part to read from, so the
|
|
49
|
+
// trigger — which always has a label, because it is what the user clicked —
|
|
50
|
+
// names the popover. A caller passing their own `aria-label`/`aria-labelledby`
|
|
51
|
+
// to `Popover.Body` still wins.
|
|
52
|
+
const triggerId = `popover-trigger-${id}`;
|
|
47
53
|
|
|
48
54
|
const contextValue = {
|
|
49
55
|
open,
|
|
@@ -56,11 +62,41 @@ const PopoverRoot = ({ open: controlledOpen, onOpenChange, defaultOpen = false,
|
|
|
56
62
|
getReferenceProps,
|
|
57
63
|
getFloatingProps,
|
|
58
64
|
contentId,
|
|
65
|
+
triggerId,
|
|
59
66
|
};
|
|
60
67
|
|
|
61
68
|
return <PopoverContext.Provider value={contextValue}>{children}</PopoverContext.Provider>;
|
|
62
69
|
};
|
|
63
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
|
+
*/
|
|
64
100
|
export const Popover = Object.assign(PopoverRoot, {
|
|
65
101
|
Trigger: PopoverTrigger,
|
|
66
102
|
Body: PopoverBody,
|
|
@@ -6,7 +6,11 @@ import { usePopoverContext } from "./PopoverContext";
|
|
|
6
6
|
export type PopoverBodyProps = React.HTMLAttributes<HTMLDivElement>;
|
|
7
7
|
|
|
8
8
|
export const PopoverBody = React.forwardRef<HTMLDivElement, PopoverBodyProps>(({ className, children, ...props }, forwardedRef) => {
|
|
9
|
-
const { open, refs, floatingStyles, getFloatingProps, contentId } = usePopoverContext();
|
|
9
|
+
const { open, refs, floatingStyles, getFloatingProps, contentId, triggerId } = usePopoverContext();
|
|
10
|
+
|
|
11
|
+
// `aria-labelledby` outranks `aria-label` in the name computation, so the
|
|
12
|
+
// trigger only names the dialog when the caller hasn't named it themselves.
|
|
13
|
+
const hasOwnLabel = props["aria-label"] !== undefined || props["aria-labelledby"] !== undefined;
|
|
10
14
|
|
|
11
15
|
if (!open) return null;
|
|
12
16
|
|
|
@@ -20,6 +24,7 @@ export const PopoverBody = React.forwardRef<HTMLDivElement, PopoverBodyProps>(({
|
|
|
20
24
|
}}
|
|
21
25
|
id={contentId}
|
|
22
26
|
role="dialog"
|
|
27
|
+
aria-labelledby={hasOwnLabel ? undefined : triggerId}
|
|
23
28
|
style={floatingStyles}
|
|
24
29
|
className={cn("z-popover rounded-lg border border-border-normal bg-bg-normal p-4 shadow-lg", className)}
|
|
25
30
|
{...getFloatingProps(props)}
|
|
@@ -11,6 +11,7 @@ export type PopoverContextValue = {
|
|
|
11
11
|
getReferenceProps: (props?: React.HTMLProps<HTMLElement>) => Record<string, unknown>;
|
|
12
12
|
getFloatingProps: (props?: React.HTMLProps<HTMLElement>) => Record<string, unknown>;
|
|
13
13
|
contentId: string;
|
|
14
|
+
triggerId: string;
|
|
14
15
|
};
|
|
15
16
|
|
|
16
17
|
export const PopoverContext = createContext<PopoverContextValue | null>(null);
|
|
@@ -8,7 +8,7 @@ export type PopoverTriggerProps = React.ButtonHTMLAttributes<HTMLButtonElement>
|
|
|
8
8
|
};
|
|
9
9
|
|
|
10
10
|
export const PopoverTrigger = React.forwardRef<HTMLButtonElement, PopoverTriggerProps>(({ asChild = false, children, ...props }, forwardedRef) => {
|
|
11
|
-
const { refs, getReferenceProps, contentId, open } = usePopoverContext();
|
|
11
|
+
const { refs, getReferenceProps, contentId, triggerId, open } = usePopoverContext();
|
|
12
12
|
const Comp = asChild ? Slot : "button";
|
|
13
13
|
|
|
14
14
|
return (
|
|
@@ -19,6 +19,7 @@ export const PopoverTrigger = React.forwardRef<HTMLButtonElement, PopoverTrigger
|
|
|
19
19
|
else if (forwardedRef) forwardedRef.current = node;
|
|
20
20
|
}}
|
|
21
21
|
type={asChild ? undefined : "button"}
|
|
22
|
+
id={triggerId}
|
|
22
23
|
aria-haspopup="dialog"
|
|
23
24
|
aria-expanded={open}
|
|
24
25
|
aria-controls={open ? contentId : undefined}
|