@sixthshift/design-system 0.5.0 → 0.7.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 +132 -87
- package/dist/components/Badge/Badge.d.ts +12 -4
- package/dist/components/Badge/Badge.d.ts.map +1 -1
- package/dist/components/Badge/Badge.js +8 -6
- package/dist/components/Badge/Badge.js.map +1 -1
- package/dist/components/Button/Button.d.ts +26 -3
- package/dist/components/Button/Button.d.ts.map +1 -1
- package/dist/components/Button/Button.js +14 -5
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/Calendar/Calendar.d.ts.map +1 -1
- package/dist/components/Calendar/Calendar.js +1 -0
- package/dist/components/Calendar/Calendar.js.map +1 -1
- package/dist/components/Calendar/CalendarView.d.ts +0 -11
- package/dist/components/Calendar/CalendarView.d.ts.map +1 -1
- package/dist/components/Calendar/CalendarView.js +1 -0
- package/dist/components/Calendar/CalendarView.js.map +1 -1
- package/dist/components/Calendar/calendar.hooks.d.ts.map +1 -1
- package/dist/components/Calendar/calendar.hooks.js +1 -0
- package/dist/components/Calendar/calendar.hooks.js.map +1 -1
- package/dist/components/Card/Card.d.ts +2 -2
- package/dist/components/Card/Card.d.ts.map +1 -1
- package/dist/components/Card/Card.js +3 -2
- package/dist/components/Card/Card.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
- package/dist/components/Checkbox/Checkbox.js +1 -0
- package/dist/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts.map +1 -1
- package/dist/components/CheckboxGroup/CheckboxGroup.js +1 -0
- package/dist/components/CheckboxGroup/CheckboxGroup.js.map +1 -1
- package/dist/components/Code/Editor/Editor.d.ts.map +1 -1
- package/dist/components/Code/Editor/Editor.js +1 -0
- package/dist/components/Code/Editor/Editor.js.map +1 -1
- package/dist/components/Code/Workspace/StatusBar.d.ts.map +1 -1
- package/dist/components/Code/Workspace/StatusBar.js +1 -0
- package/dist/components/Code/Workspace/StatusBar.js.map +1 -1
- package/dist/components/Code/Workspace/Toolbar.d.ts.map +1 -1
- package/dist/components/Code/Workspace/Toolbar.js +1 -0
- package/dist/components/Code/Workspace/Toolbar.js.map +1 -1
- package/dist/components/Code/Workspace/Workspace.d.ts.map +1 -1
- package/dist/components/Code/Workspace/Workspace.js +1 -0
- package/dist/components/Code/Workspace/Workspace.js.map +1 -1
- package/dist/components/DatePicker/DatePicker.d.ts.map +1 -1
- package/dist/components/DatePicker/DatePicker.js +7 -1
- package/dist/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/components/DatePicker/DateSegments.d.ts.map +1 -1
- package/dist/components/DatePicker/DateSegments.js +1 -0
- package/dist/components/DatePicker/DateSegments.js.map +1 -1
- package/dist/components/DatePicker/datepicker.hooks.d.ts.map +1 -1
- package/dist/components/DatePicker/datepicker.hooks.js +1 -0
- package/dist/components/DatePicker/datepicker.hooks.js.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.js +1 -0
- package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.d.ts.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.js +7 -1
- package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
- package/dist/components/DateTimePicker/DateTimeSegments.d.ts.map +1 -1
- package/dist/components/DateTimePicker/DateTimeSegments.js +1 -0
- package/dist/components/DateTimePicker/DateTimeSegments.js.map +1 -1
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts.map +1 -1
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js +7 -1
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js.map +1 -1
- package/dist/components/FormField/FormField.d.ts +31 -10
- package/dist/components/FormField/FormField.d.ts.map +1 -1
- package/dist/components/FormField/FormField.js +46 -17
- package/dist/components/FormField/FormField.js.map +1 -1
- package/dist/components/FormField/index.d.ts +2 -2
- package/dist/components/FormField/index.d.ts.map +1 -1
- package/dist/components/FormField/index.js +1 -1
- package/dist/components/FormField/index.js.map +1 -1
- package/dist/components/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/components/HoverCard/HoverCard.js +4 -0
- package/dist/components/HoverCard/HoverCard.js.map +1 -1
- package/dist/components/HoverCard/components/HoverCardContent.d.ts +16 -2
- package/dist/components/HoverCard/components/HoverCardContent.d.ts.map +1 -1
- package/dist/components/HoverCard/components/HoverCardContent.js +4 -3
- package/dist/components/HoverCard/components/HoverCardContent.js.map +1 -1
- package/dist/components/HoverCard/components/HoverCardContext.d.ts +2 -0
- package/dist/components/HoverCard/components/HoverCardContext.d.ts.map +1 -1
- package/dist/components/HoverCard/components/HoverCardContext.js +1 -0
- package/dist/components/HoverCard/components/HoverCardContext.js.map +1 -1
- package/dist/components/HoverCard/components/HoverCardTrigger.d.ts.map +1 -1
- package/dist/components/HoverCard/components/HoverCardTrigger.js +1 -0
- package/dist/components/HoverCard/components/HoverCardTrigger.js.map +1 -1
- package/dist/components/Message/Message.d.ts +5 -1
- package/dist/components/Message/Message.d.ts.map +1 -1
- package/dist/components/Message/Message.js +3 -3
- package/dist/components/Message/Message.js.map +1 -1
- package/dist/components/Modal/Modal.d.ts +26 -9
- package/dist/components/Modal/Modal.d.ts.map +1 -1
- package/dist/components/Modal/Modal.js +46 -21
- package/dist/components/Modal/Modal.js.map +1 -1
- package/dist/components/Modal/components/ModalContext.d.ts.map +1 -1
- package/dist/components/Modal/components/ModalContext.js +1 -0
- 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 +1 -0
- package/dist/components/Modal/components/ModalHeader.js.map +1 -1
- package/dist/components/Popover/Popover.d.ts +3 -1
- package/dist/components/Popover/Popover.d.ts.map +1 -1
- package/dist/components/Popover/Popover.js +8 -0
- package/dist/components/Popover/Popover.js.map +1 -1
- package/dist/components/Popover/components/PopoverBody.d.ts +16 -2
- package/dist/components/Popover/components/PopoverBody.d.ts.map +1 -1
- package/dist/components/Popover/components/PopoverBody.js +4 -3
- package/dist/components/Popover/components/PopoverBody.js.map +1 -1
- package/dist/components/Popover/components/PopoverClose.d.ts.map +1 -1
- package/dist/components/Popover/components/PopoverClose.js +1 -0
- package/dist/components/Popover/components/PopoverClose.js.map +1 -1
- package/dist/components/Popover/components/PopoverContext.d.ts +2 -0
- package/dist/components/Popover/components/PopoverContext.d.ts.map +1 -1
- package/dist/components/Popover/components/PopoverContext.js +1 -0
- 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 +1 -0
- package/dist/components/Popover/components/PopoverTrigger.js.map +1 -1
- package/dist/components/RadioButton/RadioButton.d.ts.map +1 -1
- package/dist/components/RadioButton/RadioButton.js +1 -0
- package/dist/components/RadioButton/RadioButton.js.map +1 -1
- package/dist/components/RadioButtonGroup/RadioButtonGroup.d.ts.map +1 -1
- package/dist/components/RadioButtonGroup/RadioButtonGroup.js +1 -0
- package/dist/components/RadioButtonGroup/RadioButtonGroup.js.map +1 -1
- package/dist/components/SearchInput/SearchInput.d.ts +10 -7
- package/dist/components/SearchInput/SearchInput.d.ts.map +1 -1
- package/dist/components/SearchInput/SearchInput.js +11 -6
- package/dist/components/SearchInput/SearchInput.js.map +1 -1
- package/dist/components/Select/Select.d.ts +6 -0
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/Select.js +11 -4
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/Select/SelectDropdown.d.ts +3 -1
- package/dist/components/Select/SelectDropdown.d.ts.map +1 -1
- package/dist/components/Select/SelectDropdown.js +3 -2
- package/dist/components/Select/SelectDropdown.js.map +1 -1
- package/dist/components/Select/SelectTrigger.d.ts.map +1 -1
- package/dist/components/Select/SelectTrigger.js +5 -1
- package/dist/components/Select/SelectTrigger.js.map +1 -1
- package/dist/components/Select/useSelectKeyboard.d.ts.map +1 -1
- package/dist/components/Select/useSelectKeyboard.js +1 -0
- package/dist/components/Select/useSelectKeyboard.js.map +1 -1
- package/dist/components/Sheet/Sheet.d.ts +12 -0
- package/dist/components/Sheet/Sheet.d.ts.map +1 -1
- package/dist/components/Sheet/Sheet.js +26 -10
- package/dist/components/Sheet/Sheet.js.map +1 -1
- package/dist/components/Sheet/components/SheetContext.d.ts.map +1 -1
- package/dist/components/Sheet/components/SheetContext.js +1 -0
- package/dist/components/Sheet/components/SheetContext.js.map +1 -1
- package/dist/components/Sheet/components/SheetHeader.d.ts.map +1 -1
- package/dist/components/Sheet/components/SheetHeader.js +1 -0
- package/dist/components/Sheet/components/SheetHeader.js.map +1 -1
- package/dist/components/Spinner/Spinner.d.ts +2 -2
- package/dist/components/Spinner/Spinner.js +2 -2
- package/dist/components/Switch/Switch.d.ts.map +1 -1
- package/dist/components/Switch/Switch.js +1 -0
- package/dist/components/Switch/Switch.js.map +1 -1
- package/dist/components/Tabs/Tabs.d.ts.map +1 -1
- package/dist/components/Tabs/Tabs.js +1 -0
- package/dist/components/Tabs/Tabs.js.map +1 -1
- package/dist/components/Tabs/components/TabsContext.d.ts.map +1 -1
- package/dist/components/Tabs/components/TabsContext.js +1 -0
- package/dist/components/Tabs/components/TabsContext.js.map +1 -1
- package/dist/components/Tabs/components/TabsList.d.ts.map +1 -1
- package/dist/components/Tabs/components/TabsList.js +1 -0
- package/dist/components/Tabs/components/TabsList.js.map +1 -1
- package/dist/components/Tabs/components/TabsPanels.d.ts.map +1 -1
- package/dist/components/Tabs/components/TabsPanels.js +1 -0
- 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 +2 -1
- package/dist/components/Tabs/components/TabsTrigger.js.map +1 -1
- package/dist/components/TagChip/TagChip.d.ts.map +1 -1
- package/dist/components/TagChip/TagChip.js +1 -0
- package/dist/components/TagChip/TagChip.js.map +1 -1
- package/dist/components/TagInput/TagInput.d.ts +8 -2
- package/dist/components/TagInput/TagInput.d.ts.map +1 -1
- package/dist/components/TagInput/TagInput.js +8 -5
- package/dist/components/TagInput/TagInput.js.map +1 -1
- package/dist/components/Textarea/Textarea.d.ts +21 -5
- package/dist/components/Textarea/Textarea.d.ts.map +1 -1
- package/dist/components/Textarea/Textarea.js +31 -5
- package/dist/components/Textarea/Textarea.js.map +1 -1
- package/dist/components/TimePicker/PeriodSelector.d.ts.map +1 -1
- package/dist/components/TimePicker/PeriodSelector.js +1 -0
- package/dist/components/TimePicker/PeriodSelector.js.map +1 -1
- package/dist/components/TimePicker/TimeColumn.d.ts.map +1 -1
- package/dist/components/TimePicker/TimeColumn.js +1 -0
- package/dist/components/TimePicker/TimeColumn.js.map +1 -1
- package/dist/components/TimePicker/TimePicker.d.ts.map +1 -1
- package/dist/components/TimePicker/TimePicker.js +7 -1
- package/dist/components/TimePicker/TimePicker.js.map +1 -1
- package/dist/components/TimePicker/TimeSegments.d.ts.map +1 -1
- package/dist/components/TimePicker/TimeSegments.js +1 -0
- package/dist/components/TimePicker/TimeSegments.js.map +1 -1
- package/dist/components/Toast/Toast.d.ts +16 -2
- package/dist/components/Toast/Toast.d.ts.map +1 -1
- package/dist/components/Toast/Toast.js +17 -7
- package/dist/components/Toast/Toast.js.map +1 -1
- package/dist/components/Toggle/Toggle.d.ts +5 -1
- package/dist/components/Toggle/Toggle.d.ts.map +1 -1
- package/dist/components/Toggle/Toggle.js +4 -3
- package/dist/components/Toggle/Toggle.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts +3 -0
- package/dist/components/ToggleGroup/ToggleGroupMultiple.d.ts.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupMultiple.js +4 -3
- package/dist/components/ToggleGroup/ToggleGroupMultiple.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts +3 -0
- package/dist/components/ToggleGroup/ToggleGroupSingle.d.ts.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroupSingle.js +4 -3
- package/dist/components/ToggleGroup/ToggleGroupSingle.js.map +1 -1
- package/dist/components/ToggleGroup/toggleGroup.types.d.ts +13 -0
- package/dist/components/ToggleGroup/toggleGroup.types.d.ts.map +1 -1
- package/dist/components/Tooltip/Tooltip.d.ts +3 -1
- package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/components/Tooltip/Tooltip.js +4 -0
- package/dist/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/components/Tooltip/components/TooltipBody.d.ts +16 -2
- package/dist/components/Tooltip/components/TooltipBody.d.ts.map +1 -1
- package/dist/components/Tooltip/components/TooltipBody.js +4 -3
- package/dist/components/Tooltip/components/TooltipBody.js.map +1 -1
- package/dist/components/Tooltip/components/TooltipContext.d.ts +2 -0
- package/dist/components/Tooltip/components/TooltipContext.d.ts.map +1 -1
- package/dist/components/Tooltip/components/TooltipContext.js +1 -0
- package/dist/components/Tooltip/components/TooltipContext.js.map +1 -1
- package/dist/components/Tooltip/components/TooltipTrigger.d.ts.map +1 -1
- package/dist/components/Tooltip/components/TooltipTrigger.js +1 -0
- package/dist/components/Tooltip/components/TooltipTrigger.js.map +1 -1
- package/dist/hooks/useCollapsible.d.ts.map +1 -1
- package/dist/hooks/useCollapsible.js +1 -0
- package/dist/hooks/useCollapsible.js.map +1 -1
- package/dist/hooks/useControllableState.d.ts.map +1 -1
- package/dist/hooks/useControllableState.js +1 -0
- package/dist/hooks/useControllableState.js.map +1 -1
- package/dist/hooks/useDebouncedCallback.d.ts.map +1 -1
- package/dist/hooks/useDebouncedCallback.js +1 -0
- package/dist/hooks/useDebouncedCallback.js.map +1 -1
- package/dist/hooks/useDebouncedState.d.ts.map +1 -1
- package/dist/hooks/useDebouncedState.js +1 -0
- package/dist/hooks/useDebouncedState.js.map +1 -1
- package/dist/hooks/useDeviceFormFactor.d.ts.map +1 -1
- package/dist/hooks/useDeviceFormFactor.js +1 -0
- package/dist/hooks/useDeviceFormFactor.js.map +1 -1
- package/dist/hooks/useLocalStorage.d.ts.map +1 -1
- package/dist/hooks/useLocalStorage.js +1 -0
- package/dist/hooks/useLocalStorage.js.map +1 -1
- package/dist/hooks/useMergedFloatingRef.d.ts.map +1 -1
- package/dist/hooks/useMergedFloatingRef.js +1 -0
- package/dist/hooks/useMergedFloatingRef.js.map +1 -1
- package/dist/hooks/usePresence.d.ts.map +1 -1
- package/dist/hooks/usePresence.js +1 -0
- package/dist/hooks/usePresence.js.map +1 -1
- package/dist/hooks/useStack.d.ts.map +1 -1
- package/dist/hooks/useStack.js +34 -10
- package/dist/hooks/useStack.js.map +1 -1
- package/dist/hooks/useTheme.d.ts.map +1 -1
- package/dist/hooks/useTheme.js +1 -0
- package/dist/hooks/useTheme.js.map +1 -1
- package/dist/internal/PickerField.d.ts.map +1 -1
- package/dist/internal/PickerField.js +1 -0
- package/dist/internal/PickerField.js.map +1 -1
- package/dist/internal/SegmentedField.d.ts.map +1 -1
- package/dist/internal/SegmentedField.js +1 -0
- package/dist/internal/SegmentedField.js.map +1 -1
- package/dist/internal/brandScope.d.ts +25 -0
- package/dist/internal/brandScope.d.ts.map +1 -0
- package/dist/internal/brandScope.js +37 -0
- package/dist/internal/brandScope.js.map +1 -0
- package/dist/internal/escapeLayers.d.ts +12 -0
- package/dist/internal/escapeLayers.d.ts.map +1 -0
- package/dist/internal/escapeLayers.js +48 -0
- package/dist/internal/escapeLayers.js.map +1 -0
- package/dist/lib/ErrorBoundary.d.ts.map +1 -1
- package/dist/lib/ErrorBoundary.js +1 -0
- package/dist/lib/ErrorBoundary.js.map +1 -1
- package/dist/lib/contexts/ComponentsContext/ComponentsContext.d.ts.map +1 -1
- package/dist/lib/contexts/ComponentsContext/ComponentsContext.js +1 -0
- package/dist/lib/contexts/ComponentsContext/ComponentsContext.js.map +1 -1
- package/dist/lib/contexts/OverlayContext/OverlayContext.d.ts +9 -4
- package/dist/lib/contexts/OverlayContext/OverlayContext.d.ts.map +1 -1
- package/dist/lib/contexts/OverlayContext/OverlayContext.js +25 -12
- package/dist/lib/contexts/OverlayContext/OverlayContext.js.map +1 -1
- package/dist/lib/contexts/OverlayContext/ToastStack.d.ts +20 -0
- package/dist/lib/contexts/OverlayContext/ToastStack.d.ts.map +1 -0
- package/dist/lib/contexts/OverlayContext/ToastStack.js +45 -0
- package/dist/lib/contexts/OverlayContext/ToastStack.js.map +1 -0
- package/dist/lib/contexts/OverlayContext/hooks/useModal.d.ts.map +1 -1
- package/dist/lib/contexts/OverlayContext/hooks/useModal.js +1 -0
- package/dist/lib/contexts/OverlayContext/hooks/useModal.js.map +1 -1
- package/dist/lib/contexts/OverlayContext/hooks/useToast.d.ts +27 -10
- package/dist/lib/contexts/OverlayContext/hooks/useToast.d.ts.map +1 -1
- package/dist/lib/contexts/OverlayContext/hooks/useToast.js +31 -49
- package/dist/lib/contexts/OverlayContext/hooks/useToast.js.map +1 -1
- package/dist/lib/contexts/OverlayContext/index.d.ts +2 -0
- package/dist/lib/contexts/OverlayContext/index.d.ts.map +1 -1
- package/dist/lib/contexts/OverlayContext/index.js +2 -0
- package/dist/lib/contexts/OverlayContext/index.js.map +1 -1
- package/dist/lib/contexts/OverlayContext/toastStore.d.ts +68 -0
- package/dist/lib/contexts/OverlayContext/toastStore.d.ts.map +1 -0
- package/dist/lib/contexts/OverlayContext/toastStore.js +69 -0
- package/dist/lib/contexts/OverlayContext/toastStore.js.map +1 -0
- package/dist/lib/withErrorBoundary.d.ts.map +1 -1
- package/dist/lib/withErrorBoundary.js +1 -0
- package/dist/lib/withErrorBoundary.js.map +1 -1
- package/dist/lib/withSuspenseAndErrorBoundary.d.ts.map +1 -1
- package/dist/lib/withSuspenseAndErrorBoundary.js +1 -0
- package/dist/lib/withSuspenseAndErrorBoundary.js.map +1 -1
- package/dist/{theme/schema.d.ts → theming/vocabulary.d.ts} +4 -4
- package/dist/theming/vocabulary.d.ts.map +1 -0
- package/dist/{theme/schema.js → theming/vocabulary.js} +4 -4
- package/dist/theming/vocabulary.js.map +1 -0
- package/package.json +18 -6
- package/src/components/Badge/Badge.tsx +12 -6
- package/src/components/Button/Button.tsx +25 -5
- package/src/{theme/recipes/button.css → components/Button/button.recipe.css} +2 -2
- package/src/components/Calendar/Calendar.tsx +2 -0
- package/src/components/Calendar/CalendarView.tsx +2 -0
- package/src/components/Calendar/calendar.hooks.ts +2 -0
- package/src/components/Card/Card.tsx +4 -2
- package/src/components/Checkbox/Checkbox.tsx +2 -0
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +2 -0
- package/src/components/Code/Editor/Editor.tsx +2 -0
- package/src/components/Code/Workspace/StatusBar.tsx +2 -0
- package/src/components/Code/Workspace/Toolbar.tsx +2 -0
- package/src/components/Code/Workspace/Workspace.tsx +2 -0
- package/src/components/DatePicker/DatePicker.tsx +10 -0
- package/src/components/DatePicker/DateSegments.tsx +2 -0
- package/src/components/DatePicker/datepicker.hooks.ts +2 -0
- package/src/components/DateRangePicker/DateRangePicker.tsx +2 -0
- package/src/components/DateTimePicker/DateTimePicker.tsx +10 -1
- package/src/components/DateTimePicker/DateTimeSegments.tsx +2 -0
- package/src/components/DateTimeRangePicker/DateTimeRangePicker.tsx +10 -1
- package/src/components/FormField/FormField.tsx +94 -42
- package/src/components/FormField/index.ts +2 -2
- package/src/components/HoverCard/HoverCard.tsx +5 -0
- package/src/components/HoverCard/components/HoverCardContent.tsx +13 -3
- package/src/components/HoverCard/components/HoverCardContext.tsx +4 -0
- package/src/components/HoverCard/components/HoverCardTrigger.tsx +2 -0
- package/src/components/Message/Message.tsx +27 -23
- package/src/components/Modal/Modal.tsx +88 -51
- package/src/components/Modal/components/ModalContext.tsx +2 -0
- package/src/components/Modal/components/ModalHeader.tsx +2 -0
- package/src/components/Popover/Popover.tsx +10 -0
- package/src/components/Popover/components/PopoverBody.tsx +13 -3
- package/src/components/Popover/components/PopoverClose.tsx +2 -0
- package/src/components/Popover/components/PopoverContext.tsx +4 -0
- package/src/components/Popover/components/PopoverTrigger.tsx +2 -0
- package/src/components/RadioButton/RadioButton.tsx +2 -0
- package/src/components/RadioButtonGroup/RadioButtonGroup.tsx +2 -0
- package/src/components/SearchInput/SearchInput.tsx +15 -8
- package/src/components/Select/Select.tsx +27 -2
- package/src/components/Select/SelectDropdown.tsx +6 -0
- package/src/components/Select/SelectTrigger.tsx +5 -0
- package/src/components/Select/useSelectKeyboard.ts +2 -0
- package/src/components/Sheet/Sheet.tsx +59 -34
- package/src/components/Sheet/components/SheetContext.tsx +2 -0
- package/src/components/Sheet/components/SheetHeader.tsx +2 -0
- package/src/components/Spinner/Spinner.tsx +2 -2
- package/src/components/Switch/Switch.tsx +2 -0
- package/src/components/Tabs/Tabs.tsx +2 -0
- package/src/components/Tabs/components/TabsContext.tsx +2 -0
- package/src/components/Tabs/components/TabsList.tsx +2 -0
- package/src/components/Tabs/components/TabsPanels.tsx +2 -0
- package/src/components/Tabs/components/TabsTrigger.tsx +3 -1
- package/src/{theme/recipes/tabs.css → components/Tabs/tabs.recipe.css} +1 -1
- package/src/components/TagChip/TagChip.tsx +2 -0
- package/src/components/TagInput/TagInput.tsx +15 -6
- package/src/components/Textarea/Textarea.tsx +42 -6
- package/src/{theme/recipes/textarea.css → components/Textarea/textarea.recipe.css} +1 -1
- package/src/components/TimePicker/PeriodSelector.tsx +2 -0
- package/src/components/TimePicker/TimeColumn.tsx +2 -0
- package/src/components/TimePicker/TimePicker.tsx +10 -0
- package/src/components/TimePicker/TimeSegments.tsx +2 -0
- package/src/components/Toast/Toast.tsx +26 -6
- package/src/components/Toggle/Toggle.tsx +20 -3
- package/src/components/ToggleGroup/ToggleGroupMultiple.tsx +8 -1
- package/src/components/ToggleGroup/ToggleGroupSingle.tsx +8 -0
- package/src/components/ToggleGroup/toggleGroup.types.ts +13 -0
- package/src/components/Tooltip/Tooltip.tsx +5 -0
- package/src/components/Tooltip/components/TooltipBody.tsx +13 -3
- package/src/components/Tooltip/components/TooltipContext.tsx +4 -0
- package/src/components/Tooltip/components/TooltipTrigger.tsx +2 -0
- package/src/hooks/useCollapsible.ts +2 -0
- package/src/hooks/useControllableState.ts +2 -0
- package/src/hooks/useDebouncedCallback.ts +2 -0
- package/src/hooks/useDebouncedState.ts +2 -0
- package/src/hooks/useDeviceFormFactor.ts +2 -0
- package/src/hooks/useLocalStorage.ts +2 -0
- package/src/hooks/useMergedFloatingRef.ts +2 -0
- package/src/hooks/usePresence.ts +2 -0
- package/src/hooks/useStack.ts +35 -12
- package/src/hooks/useTheme.ts +2 -0
- package/src/internal/PickerField.tsx +2 -0
- package/src/internal/SegmentedField.tsx +2 -0
- package/src/internal/brandScope.ts +39 -0
- package/src/internal/escapeLayers.ts +53 -0
- package/src/lib/ErrorBoundary.tsx +2 -0
- package/src/lib/contexts/ComponentsContext/ComponentsContext.tsx +2 -0
- package/src/lib/contexts/OverlayContext/OverlayContext.tsx +42 -26
- package/src/lib/contexts/OverlayContext/ToastStack.tsx +71 -0
- package/src/lib/contexts/OverlayContext/hooks/useModal.tsx +2 -0
- package/src/lib/contexts/OverlayContext/hooks/useToast.ts +30 -73
- package/src/lib/contexts/OverlayContext/index.ts +2 -0
- package/src/lib/contexts/OverlayContext/toastStore.ts +138 -0
- package/src/lib/withErrorBoundary.tsx +2 -0
- package/src/lib/withSuspenseAndErrorBoundary.tsx +2 -0
- package/src/theme/linen/index.css +11 -0
- package/src/theme/linen/palette.css +87 -0
- package/src/theme/linen/theme.css +371 -0
- package/src/theming/tailwind.css +356 -0
- package/src/{theme/schema.ts → theming/vocabulary.ts} +3 -3
- package/dist/theme/index.d.ts +0 -9
- package/dist/theme/index.d.ts.map +0 -1
- package/dist/theme/index.js +0 -8
- package/dist/theme/index.js.map +0 -1
- package/dist/theme/schema.d.ts.map +0 -1
- package/dist/theme/schema.js.map +0 -1
- package/src/theme/index.ts +0 -39
- package/src/theme/recipes/index.css +0 -28
- package/src/theme/tokens.css +0 -824
- /package/src/{theme/recipes/badge.css → components/Badge/badge.recipe.css} +0 -0
- /package/src/{theme/recipes/card.css → components/Card/card.recipe.css} +0 -0
- /package/src/{theme/recipes/checkbox.css → components/Checkbox/checkbox.recipe.css} +0 -0
- /package/src/{theme/recipes/field.css → components/Field/field.recipe.css} +0 -0
- /package/src/{theme/recipes/input.css → components/Input/input.recipe.css} +0 -0
- /package/src/{theme/recipes/message.css → components/Message/message.recipe.css} +0 -0
- /package/src/{theme/recipes/modal.css → components/Modal/modal.recipe.css} +0 -0
- /package/src/{theme/recipes/radio-button.css → components/RadioButton/radio-button.recipe.css} +0 -0
- /package/src/{theme/recipes/search-input.css → components/SearchInput/search-input.recipe.css} +0 -0
- /package/src/{theme/recipes/select.css → components/Select/select.recipe.css} +0 -0
- /package/src/{theme/recipes/sheet.css → components/Sheet/sheet.recipe.css} +0 -0
- /package/src/{theme/recipes/spinner.css → components/Spinner/spinner.recipe.css} +0 -0
- /package/src/{theme/recipes/switch.css → components/Switch/switch.recipe.css} +0 -0
- /package/src/{theme/recipes/tag-chip.css → components/TagChip/tag-chip.recipe.css} +0 -0
- /package/src/{theme/recipes/toggle.css → components/Toggle/toggle.recipe.css} +0 -0
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
1
3
|
import { Input } from "@sixthshift/design-system/input";
|
|
2
4
|
import { cn } from "@sixthshift/design-system/utils";
|
|
3
5
|
import { Search, X } from "lucide-react";
|
|
4
6
|
import * as React from "react";
|
|
5
7
|
|
|
6
|
-
export type SearchInputProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, "type"
|
|
8
|
+
export type SearchInputProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, "type"> & {
|
|
7
9
|
value: string;
|
|
8
|
-
|
|
10
|
+
/** Called with the input's string value on every change. The native `onChange(event)` also fires, unchanged. */
|
|
11
|
+
onValueChange: (value: string) => void;
|
|
9
12
|
onClear?: () => void;
|
|
10
13
|
/** Accessible name for the clear button — it is icon-only. */
|
|
11
14
|
clearLabel?: string;
|
|
@@ -17,17 +20,18 @@ export type SearchInputProps = Omit<React.InputHTMLAttributes<HTMLInputElement>,
|
|
|
17
20
|
*
|
|
18
21
|
* Wraps `Input`, using its `iconLeft`/`iconRight` slots, rather than
|
|
19
22
|
* reimplementing the field. Always controlled — `value` is required and
|
|
20
|
-
* there is no `defaultValue`/uncontrolled mode. `
|
|
21
|
-
* string value directly
|
|
22
|
-
* provided, otherwise calls
|
|
23
|
+
* there is no `defaultValue`/uncontrolled mode. `onValueChange` receives the
|
|
24
|
+
* string value directly; the native `onChange` keeps its event signature and
|
|
25
|
+
* fires too if passed. Clearing calls `onClear` if provided, otherwise calls
|
|
26
|
+
* `onValueChange("")` — note a programmatic clear dispatches no native event.
|
|
23
27
|
*/
|
|
24
28
|
const SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(
|
|
25
|
-
({ className, value, onChange, onClear, clearLabel = "Clear search", ...props }, ref) => {
|
|
29
|
+
({ className, value, onValueChange, onChange, onClear, clearLabel = "Clear search", ...props }, ref) => {
|
|
26
30
|
const handleClear = () => {
|
|
27
31
|
if (onClear) {
|
|
28
32
|
onClear();
|
|
29
33
|
} else {
|
|
30
|
-
|
|
34
|
+
onValueChange("");
|
|
31
35
|
}
|
|
32
36
|
};
|
|
33
37
|
|
|
@@ -36,7 +40,10 @@ const SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(
|
|
|
36
40
|
ref={ref}
|
|
37
41
|
type="text"
|
|
38
42
|
value={value}
|
|
39
|
-
onChange={(e) =>
|
|
43
|
+
onChange={(e) => {
|
|
44
|
+
onValueChange(e.target.value);
|
|
45
|
+
onChange?.(e);
|
|
46
|
+
}}
|
|
40
47
|
iconLeft={<Search />}
|
|
41
48
|
iconRight={
|
|
42
49
|
value ? (
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
1
3
|
import { autoUpdate, flip, offset, shift, size, useFloating } from "@floating-ui/react";
|
|
2
4
|
import { useControllableState } from "@sixthshift/design-system/hooks";
|
|
3
5
|
import { forwardRef, type HTMLAttributes, type ReactElement, type Ref, useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
|
|
6
|
+
import { closestBrand } from "../../internal/brandScope";
|
|
7
|
+
import { useEscapeLayer } from "../../internal/escapeLayers";
|
|
4
8
|
import { SelectDropdown, selectOptionId } from "./SelectDropdown";
|
|
5
9
|
import { SelectTriggerButton, SelectTriggerSearch } from "./SelectTrigger";
|
|
6
10
|
import { useSelectKeyboard } from "./useSelectKeyboard";
|
|
@@ -19,6 +23,12 @@ type SelectBaseProps<T extends string = string> = Omit<HTMLAttributes<HTMLElemen
|
|
|
19
23
|
placeholder?: string;
|
|
20
24
|
searchable?: boolean;
|
|
21
25
|
clearable?: boolean;
|
|
26
|
+
/** Input name for native form submission. Selected value(s) are mirrored into hidden `<input>`s, `${name}[]` in multiple mode. */
|
|
27
|
+
name?: string;
|
|
28
|
+
/** The `form` attribute for the hidden input(s), for a Select rendered outside its `<form>`. */
|
|
29
|
+
form?: string;
|
|
30
|
+
/** Marks the combobox `aria-required`. Constraint validation is the caller's job — the mirrored inputs are hidden. */
|
|
31
|
+
required?: boolean;
|
|
22
32
|
};
|
|
23
33
|
|
|
24
34
|
type SelectSingleProps<T extends string = string> = SelectBaseProps<T> & {
|
|
@@ -54,6 +64,9 @@ const SelectRoot = forwardRef(function SelectRoot<T extends string = string>(pro
|
|
|
54
64
|
placeholder = "Select...",
|
|
55
65
|
searchable = false,
|
|
56
66
|
clearable = false,
|
|
67
|
+
name,
|
|
68
|
+
form,
|
|
69
|
+
required = false,
|
|
57
70
|
...restProps
|
|
58
71
|
} = props;
|
|
59
72
|
|
|
@@ -105,7 +118,7 @@ const SelectRoot = forwardRef(function SelectRoot<T extends string = string>(pro
|
|
|
105
118
|
const showClearButton = clearable && hasValue && !disabled;
|
|
106
119
|
|
|
107
120
|
// Floating UI
|
|
108
|
-
const { refs, floatingStyles } = useFloating({
|
|
121
|
+
const { refs, elements, floatingStyles } = useFloating({
|
|
109
122
|
open,
|
|
110
123
|
onOpenChange: setOpen,
|
|
111
124
|
placement: "bottom-start",
|
|
@@ -244,6 +257,10 @@ const SelectRoot = forwardRef(function SelectRoot<T extends string = string>(pro
|
|
|
244
257
|
}
|
|
245
258
|
}, [highlightedIndex, open]);
|
|
246
259
|
|
|
260
|
+
// While open, an Escape press closes the dropdown and must not also close
|
|
261
|
+
// a Modal/Sheet this Select is rendered inside.
|
|
262
|
+
useEscapeLayer(open);
|
|
263
|
+
|
|
247
264
|
// Close on outside click
|
|
248
265
|
useEffect(() => {
|
|
249
266
|
if (!open) return;
|
|
@@ -266,7 +283,8 @@ const SelectRoot = forwardRef(function SelectRoot<T extends string = string>(pro
|
|
|
266
283
|
const activeOptionId = open && highlightedIndex >= 0 && highlightedIndex < filteredOptions.length ? selectOptionId(listboxId, highlightedIndex) : undefined;
|
|
267
284
|
|
|
268
285
|
// Strip mode from DOM props
|
|
269
|
-
const { mode: _, value: _v, defaultValue: _dv, onValueChange: _oc, ...
|
|
286
|
+
const { mode: _, value: _v, defaultValue: _dv, onValueChange: _oc, ...strippedProps } = restProps as Record<string, unknown>;
|
|
287
|
+
const htmlProps = required ? { "aria-required": true, ...strippedProps } : strippedProps;
|
|
270
288
|
|
|
271
289
|
// `role="listbox"` requires an accessible name of its own, and the trigger
|
|
272
290
|
// can't supply one: its label is the current *value*, and in searchable mode
|
|
@@ -311,6 +329,12 @@ const SelectRoot = forwardRef(function SelectRoot<T extends string = string>(pro
|
|
|
311
329
|
/>
|
|
312
330
|
)}
|
|
313
331
|
|
|
332
|
+
{/* Hidden inputs mirror the selection for native form submission — same
|
|
333
|
+
contract as DatePicker: rendered inline (not portalled) so they sit
|
|
334
|
+
inside the surrounding <form> unless `form` points elsewhere. */}
|
|
335
|
+
{name && !isMultiple && singleValue && <input type="hidden" name={name} value={singleValue} {...(form ? { form } : {})} />}
|
|
336
|
+
{name && isMultiple && multiValue.map((v) => <input key={v} type="hidden" name={`${name}[]`} value={v} {...(form ? { form } : {})} />)}
|
|
337
|
+
|
|
314
338
|
{open && !collapsed && (
|
|
315
339
|
<SelectDropdown
|
|
316
340
|
setFloating={refs.setFloating}
|
|
@@ -319,6 +343,7 @@ const SelectRoot = forwardRef(function SelectRoot<T extends string = string>(pro
|
|
|
319
343
|
label={listboxLabel}
|
|
320
344
|
activeOptionId={activeOptionId}
|
|
321
345
|
floatingStyles={floatingStyles}
|
|
346
|
+
brand={closestBrand(elements.domReference)}
|
|
322
347
|
displayOptions={filteredOptions}
|
|
323
348
|
highlightedIndex={highlightedIndex}
|
|
324
349
|
selectedValues={selectedValues}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
1
3
|
import { FloatingPortal } from "@floating-ui/react";
|
|
2
4
|
import { cn } from "@sixthshift/design-system/utils";
|
|
3
5
|
import { Check } from "lucide-react";
|
|
@@ -21,6 +23,8 @@ interface SelectDropdownProps<T extends string> {
|
|
|
21
23
|
/** The highlighted option's id, or undefined when nothing is highlighted. */
|
|
22
24
|
activeOptionId: string | undefined;
|
|
23
25
|
floatingStyles: React.CSSProperties;
|
|
26
|
+
/** The trigger's brand scope, re-stamped here because the portal leaves it behind. */
|
|
27
|
+
brand: string | undefined;
|
|
24
28
|
displayOptions: readonly { value: T; label: string }[];
|
|
25
29
|
highlightedIndex: number;
|
|
26
30
|
selectedValues: Set<T>;
|
|
@@ -39,6 +43,7 @@ export const SelectDropdown = <T extends string>({
|
|
|
39
43
|
label,
|
|
40
44
|
activeOptionId,
|
|
41
45
|
floatingStyles,
|
|
46
|
+
brand,
|
|
42
47
|
displayOptions,
|
|
43
48
|
highlightedIndex,
|
|
44
49
|
selectedValues,
|
|
@@ -66,6 +71,7 @@ export const SelectDropdown = <T extends string>({
|
|
|
66
71
|
tabIndex={-1}
|
|
67
72
|
onKeyDown={onKeyDown}
|
|
68
73
|
style={floatingStyles}
|
|
74
|
+
data-brand={brand}
|
|
69
75
|
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
76
|
>
|
|
71
77
|
{displayOptions.length === 0 ? (
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
1
3
|
import { cn } from "@sixthshift/design-system/utils";
|
|
2
4
|
import { ChevronDown, X } from "lucide-react";
|
|
3
5
|
import type { HTMLAttributes, Ref } from "react";
|
|
@@ -55,6 +57,9 @@ export const SelectTriggerButton = ({
|
|
|
55
57
|
className
|
|
56
58
|
)}
|
|
57
59
|
title={collapsed ? displayLabel : undefined}
|
|
60
|
+
// The APG select-only combobox: a button-behaving element announced as
|
|
61
|
+
// a combobox, which also admits aria-required — a plain button doesn't.
|
|
62
|
+
role="combobox"
|
|
58
63
|
aria-haspopup="listbox"
|
|
59
64
|
aria-expanded={open}
|
|
60
65
|
// The listbox unmounts when closed, so only reference it while it exists.
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { FloatingFocusManager, FloatingPortal, useDismiss, useFloating, useInteractions, useRole } from "@floating-ui/react";
|
|
2
4
|
import { useMergedFloatingRef, usePresence } from "@sixthshift/design-system/hooks";
|
|
3
5
|
import { cn } from "@sixthshift/design-system/utils";
|
|
4
6
|
import { forwardRef, type HTMLAttributes, type ReactNode, useCallback, useEffect, useId, useMemo, useState } from "react";
|
|
7
|
+
import { useOpenerBrand } from "../../internal/brandScope";
|
|
8
|
+
import { hasOpenEscapeDialog, hasOpenEscapeLayer } from "../../internal/escapeLayers";
|
|
5
9
|
import { SheetBody, SheetContext, SheetFooter, SheetHeader } from "./components";
|
|
6
10
|
|
|
7
11
|
// =============================================================================
|
|
@@ -23,6 +27,12 @@ export type SheetProps = Pick<HTMLAttributes<HTMLDivElement>, "className" | "sty
|
|
|
23
27
|
dismissOnOutsidePress?: boolean;
|
|
24
28
|
/** When true, shows a close (X) button in the header */
|
|
25
29
|
closable?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Name of a brand the theme defines, rendered as `data-brand` on the sheet.
|
|
32
|
+
* Omitted, the sheet takes the brand scope of the control that opened it
|
|
33
|
+
* (whatever held focus), since the portal leaves the trigger's scope behind.
|
|
34
|
+
*/
|
|
35
|
+
brand?: string | undefined;
|
|
26
36
|
/** Children — use Sheet.Header, Sheet.Body, Sheet.Footer */
|
|
27
37
|
children: ReactNode;
|
|
28
38
|
};
|
|
@@ -51,6 +61,7 @@ const SheetRoot = forwardRef<HTMLDivElement, SheetProps>(
|
|
|
51
61
|
dismissable = true,
|
|
52
62
|
dismissOnOutsidePress = false,
|
|
53
63
|
closable,
|
|
64
|
+
brand,
|
|
54
65
|
className,
|
|
55
66
|
style,
|
|
56
67
|
children,
|
|
@@ -61,6 +72,7 @@ const SheetRoot = forwardRef<HTMLDivElement, SheetProps>(
|
|
|
61
72
|
ref
|
|
62
73
|
) => {
|
|
63
74
|
const { ref: presenceRef, state, isMounted, show, hide } = usePresence();
|
|
75
|
+
const openerBrand = useOpenerBrand(open);
|
|
64
76
|
|
|
65
77
|
// Drive presence from the controlled `open` prop.
|
|
66
78
|
// When `open` flips to false, we play the exit animation, then unmount.
|
|
@@ -78,8 +90,14 @@ const SheetRoot = forwardRef<HTMLDivElement, SheetProps>(
|
|
|
78
90
|
|
|
79
91
|
const { refs, context } = useFloating({
|
|
80
92
|
open,
|
|
81
|
-
onOpenChange: (nextOpen) => {
|
|
82
|
-
if (
|
|
93
|
+
onOpenChange: (nextOpen, _event, reason) => {
|
|
94
|
+
if (nextOpen) return;
|
|
95
|
+
// The sheet is non-modal, so overlays above it keep their own Escape
|
|
96
|
+
// handling: a transient layer (Select dropdown, Popover, picker)
|
|
97
|
+
// consumes the press, and an open Modal owns it. Only a bare Escape
|
|
98
|
+
// — nothing stacked above — closes the sheet.
|
|
99
|
+
if (reason === "escape-key" && (hasOpenEscapeLayer() || hasOpenEscapeDialog())) return;
|
|
100
|
+
requestClose();
|
|
83
101
|
},
|
|
84
102
|
});
|
|
85
103
|
|
|
@@ -114,37 +132,44 @@ const SheetRoot = forwardRef<HTMLDivElement, SheetProps>(
|
|
|
114
132
|
const isExiting = state === "exiting";
|
|
115
133
|
|
|
116
134
|
return (
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
135
|
+
// Self-portalled for the same reason as Modal: `position: fixed` inside
|
|
136
|
+
// a transformed/filtered ancestor would anchor (and clip) the sheet to
|
|
137
|
+
// that ancestor instead of the viewport. `FloatingPortal` preserves tab
|
|
138
|
+
// order around the trigger for non-modal focus management.
|
|
139
|
+
<FloatingPortal>
|
|
140
|
+
<FloatingFocusManager context={context} modal={false}>
|
|
141
|
+
<div
|
|
142
|
+
ref={mergedRef}
|
|
143
|
+
// Explicit, though `getFloatingProps` also supplies it from `useRole`:
|
|
144
|
+
// the ARIA attributes below are only valid on a dialog, and static
|
|
145
|
+
// analysis cannot see a role that arrives through a spread. Matches Modal.
|
|
146
|
+
role="dialog"
|
|
147
|
+
aria-label={ariaLabel}
|
|
148
|
+
aria-labelledby={labelledBy}
|
|
149
|
+
aria-describedby={ariaDescribedBy}
|
|
150
|
+
tabIndex={-1}
|
|
151
|
+
data-state={state}
|
|
152
|
+
data-side={side}
|
|
153
|
+
data-brand={brand ?? openerBrand}
|
|
154
|
+
className={cn(
|
|
155
|
+
"sheet fixed top-0 bottom-0 z-sheet flex flex-col overflow-hidden bg-(--sheet-bg) outline-hidden",
|
|
156
|
+
"border-(color:--sheet-border) shadow-lg",
|
|
157
|
+
side === "right" ? "right-0 border-l" : "left-0 border-r",
|
|
158
|
+
sizeClasses[size],
|
|
159
|
+
"max-sm:inset-x-0",
|
|
160
|
+
isEntering && side === "right" && "animate-slide-right-in",
|
|
161
|
+
isExiting && side === "right" && "animate-slide-right-out",
|
|
162
|
+
isEntering && side === "left" && "animate-slide-left-in",
|
|
163
|
+
isExiting && side === "left" && "animate-slide-left-out",
|
|
164
|
+
className
|
|
165
|
+
)}
|
|
166
|
+
style={style}
|
|
167
|
+
{...getFloatingProps({})}
|
|
168
|
+
>
|
|
169
|
+
<SheetContext.Provider value={sheetContextValue}>{children}</SheetContext.Provider>
|
|
170
|
+
</div>
|
|
171
|
+
</FloatingFocusManager>
|
|
172
|
+
</FloatingPortal>
|
|
148
173
|
);
|
|
149
174
|
}
|
|
150
175
|
);
|
|
@@ -8,7 +8,7 @@ import * as React from "react";
|
|
|
8
8
|
* The colour used to be `text-fg-subtle`, a semantic token named directly in
|
|
9
9
|
* the class string — the one thing a consumer could not do was recolour a
|
|
10
10
|
* spinner without fighting `className` against it. `--spinner-fg` in
|
|
11
|
-
* src/
|
|
11
|
+
* src/components/Spinner/spinner.recipe.css is now that seam: a consumer overrides the
|
|
12
12
|
* variable, scoped to whatever subtree they like, instead of overriding a
|
|
13
13
|
* class.
|
|
14
14
|
*/
|
|
@@ -40,7 +40,7 @@ export type SpinnerProps = React.SVGAttributes<SVGElement> & VariantProps<typeof
|
|
|
40
40
|
* live region) if the loading state needs to be announced.
|
|
41
41
|
*
|
|
42
42
|
* Colour reads the `--spinner-fg` component token
|
|
43
|
-
* (src/
|
|
43
|
+
* (src/components/Spinner/spinner.recipe.css) rather than a class name, so a consumer
|
|
44
44
|
* can recolour a spinner scoped to a subtree without fighting `className`.
|
|
45
45
|
*/
|
|
46
46
|
const Spinner = React.forwardRef<SVGSVGElement, SpinnerProps>(({ className, size, ...props }, ref) => (
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
1
3
|
import { Badge } from "@sixthshift/design-system/badge";
|
|
2
4
|
import { cn } from "@sixthshift/design-system/utils";
|
|
3
5
|
import { cva } from "class-variance-authority";
|
|
@@ -9,7 +11,7 @@ import { type TabItem, useTabsContext } from "./TabsContext";
|
|
|
9
11
|
*
|
|
10
12
|
* Colour reads `--tabs-trigger-bg` / `--tabs-trigger-fg` component tokens
|
|
11
13
|
* (each with a `-hovered` state) whose values are decided by
|
|
12
|
-
* src/
|
|
14
|
+
* src/components/Tabs/tabs.recipe.css. That file is the mapping from `selected` to a
|
|
13
15
|
* semantic token — the layer that used to be the two branches of a `cva`
|
|
14
16
|
* `selected` variant here, compiled into class-name literals and unreachable
|
|
15
17
|
* from outside. Nothing in this file names a colour, which is the point: the
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* data, so a consumer can re-point a cell or scope a change to a subtree.
|
|
8
8
|
*
|
|
9
9
|
* The grammar is `--tabs-trigger-{context}[-{state}]` — the same `context`
|
|
10
|
-
* and `state` words the semantic layer uses (src/
|
|
10
|
+
* and `state` words the semantic layer uses (src/theming/vocabulary.ts). `selected`
|
|
11
11
|
* never appears in a token name: it selects, via the `data-selected`
|
|
12
12
|
* attribute below. Putting it in the name (`--tabs-trigger-bg-selected`)
|
|
13
13
|
* would restore the combinatorial explosion this layer exists to remove.
|
|
@@ -1,32 +1,40 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
1
3
|
import { TagChip } from "@sixthshift/design-system/tag-chip";
|
|
2
4
|
import { cn } from "@sixthshift/design-system/utils";
|
|
3
5
|
import { forwardRef, type KeyboardEvent, useState } from "react";
|
|
4
6
|
|
|
5
7
|
export type TagInputProps = {
|
|
6
8
|
value: string[];
|
|
7
|
-
|
|
9
|
+
onValueChange: (tags: string[]) => void;
|
|
8
10
|
placeholder?: string;
|
|
9
11
|
id?: string;
|
|
10
12
|
className?: string;
|
|
13
|
+
/** Input name for native form submission. Each tag is mirrored into a hidden `<input name="${name}[]">`. */
|
|
14
|
+
name?: string;
|
|
15
|
+
/** The `form` attribute for the hidden inputs, for a TagInput rendered outside its `<form>`. */
|
|
16
|
+
form?: string;
|
|
11
17
|
};
|
|
12
18
|
|
|
13
19
|
/**
|
|
14
20
|
* Token input for tags: existing tags render as removable `TagChip`s, typing
|
|
15
21
|
* plus Enter or comma commits a new one, Backspace on an empty field removes
|
|
16
22
|
* the last. Duplicates are ignored. Controlled only — there is no
|
|
17
|
-
* `defaultValue`, the parent always owns `value
|
|
23
|
+
* `defaultValue`, the parent always owns `value` and receives changes via
|
|
24
|
+
* `onValueChange`. With `name` set, each tag is mirrored into a hidden
|
|
25
|
+
* `<input name="${name}[]">` for native form submission.
|
|
18
26
|
*
|
|
19
27
|
* The chrome matches `Input` (same border/focus tokens) so it sits naturally
|
|
20
28
|
* among other form fields; the field has no visible label of its own, so
|
|
21
29
|
* give it an accessible name via a `<label htmlFor={id}>` (pass `id`) or
|
|
22
30
|
* `aria-label`.
|
|
23
31
|
*/
|
|
24
|
-
export const TagInput = forwardRef<HTMLDivElement, TagInputProps>(({ value,
|
|
32
|
+
export const TagInput = forwardRef<HTMLDivElement, TagInputProps>(({ value, onValueChange, placeholder = "Add a tag…", id, className, name, form }, ref) => {
|
|
25
33
|
const [draft, setDraft] = useState("");
|
|
26
34
|
|
|
27
35
|
const commit = () => {
|
|
28
36
|
const tag = draft.trim();
|
|
29
|
-
if (tag && !value.includes(tag))
|
|
37
|
+
if (tag && !value.includes(tag)) onValueChange([...value, tag]);
|
|
30
38
|
setDraft("");
|
|
31
39
|
};
|
|
32
40
|
|
|
@@ -35,7 +43,7 @@ export const TagInput = forwardRef<HTMLDivElement, TagInputProps>(({ value, onCh
|
|
|
35
43
|
e.preventDefault();
|
|
36
44
|
commit();
|
|
37
45
|
} else if (e.key === "Backspace" && draft === "" && value.length > 0) {
|
|
38
|
-
|
|
46
|
+
onValueChange(value.slice(0, -1));
|
|
39
47
|
}
|
|
40
48
|
};
|
|
41
49
|
|
|
@@ -48,8 +56,9 @@ export const TagInput = forwardRef<HTMLDivElement, TagInputProps>(({ value, onCh
|
|
|
48
56
|
)}
|
|
49
57
|
>
|
|
50
58
|
{value.map((tag) => (
|
|
51
|
-
<TagChip key={tag} tag={tag} onRemove={() =>
|
|
59
|
+
<TagChip key={tag} tag={tag} onRemove={() => onValueChange(value.filter((t) => t !== tag))} />
|
|
52
60
|
))}
|
|
61
|
+
{name && value.map((tag) => <input key={tag} type="hidden" name={`${name}[]`} value={tag} {...(form ? { form } : {})} />)}
|
|
53
62
|
<input
|
|
54
63
|
id={id}
|
|
55
64
|
value={draft}
|
|
@@ -1,28 +1,64 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
1
3
|
import { cn } from "@sixthshift/design-system/utils";
|
|
2
4
|
import * as React from "react";
|
|
5
|
+
import type { WritableRefObject } from "../../internal/types";
|
|
3
6
|
|
|
4
|
-
export type TextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement
|
|
7
|
+
export type TextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement> & {
|
|
8
|
+
/**
|
|
9
|
+
* Grows the textarea to fit its content instead of scrolling internally.
|
|
10
|
+
* Off by default — a fixed box that scrolls is still correct for e.g. a
|
|
11
|
+
* bounded comment field. `rows` still sets the starting height.
|
|
12
|
+
*/
|
|
13
|
+
autosize?: boolean;
|
|
14
|
+
};
|
|
5
15
|
|
|
6
16
|
/**
|
|
7
17
|
* Multi-line text input for longer free-form text.
|
|
8
18
|
*
|
|
9
19
|
* A thin styled wrapper around `<textarea>` — no custom props beyond
|
|
10
|
-
* `React.TextareaHTMLAttributes`,
|
|
20
|
+
* `autosize` and `React.TextareaHTMLAttributes`, and no maximum-length UI of
|
|
11
21
|
* its own. Height comes from a `min-h-[60px]` default plus whatever `rows`
|
|
12
|
-
* or `className` the caller passes
|
|
13
|
-
*
|
|
22
|
+
* or `className` the caller passes. With `autosize`, that starting height
|
|
23
|
+
* grows with content instead; without it, growing with content is the
|
|
24
|
+
* caller's responsibility. Controlled or uncontrolled exactly like a native
|
|
25
|
+
* textarea.
|
|
14
26
|
*
|
|
15
27
|
* Meant to be wrapped by `FormField` for label, description and validation
|
|
16
28
|
* wiring.
|
|
17
29
|
*/
|
|
18
|
-
const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(({ className, ...props }, ref) => {
|
|
30
|
+
const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(({ className, autosize = false, onInput, value, ...props }, ref) => {
|
|
31
|
+
const innerRef = React.useRef<HTMLTextAreaElement | null>(null);
|
|
32
|
+
|
|
33
|
+
const resize = React.useCallback(() => {
|
|
34
|
+
const el = innerRef.current;
|
|
35
|
+
if (!el) return;
|
|
36
|
+
el.style.height = "auto";
|
|
37
|
+
el.style.height = `${el.scrollHeight}px`;
|
|
38
|
+
}, []);
|
|
39
|
+
|
|
40
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: value only triggers the resize, it isn't read here
|
|
41
|
+
React.useLayoutEffect(() => {
|
|
42
|
+
if (autosize) resize();
|
|
43
|
+
}, [autosize, resize, value]);
|
|
44
|
+
|
|
19
45
|
return (
|
|
20
46
|
<textarea
|
|
47
|
+
value={value}
|
|
21
48
|
className={cn(
|
|
22
49
|
"textarea border-(color:--textarea-border) focus-visible:ring-(color:--textarea-ring) flex min-h-[60px] w-full rounded-md border bg-transparent px-3 py-2 text-sm shadow-xs placeholder:text-(--textarea-placeholder-fg) focus-visible:outline-hidden focus-visible:ring-2 disabled:cursor-not-allowed disabled:opacity-50",
|
|
50
|
+
autosize && "resize-none overflow-hidden",
|
|
23
51
|
className
|
|
24
52
|
)}
|
|
25
|
-
ref={
|
|
53
|
+
ref={(node) => {
|
|
54
|
+
innerRef.current = node;
|
|
55
|
+
if (typeof ref === "function") ref(node);
|
|
56
|
+
else if (ref) (ref as WritableRefObject<HTMLTextAreaElement | null>).current = node;
|
|
57
|
+
}}
|
|
58
|
+
onInput={(event) => {
|
|
59
|
+
if (autosize) resize();
|
|
60
|
+
onInput?.(event);
|
|
61
|
+
}}
|
|
26
62
|
{...props}
|
|
27
63
|
/>
|
|
28
64
|
);
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* button.css's header for why `@layer components` is load-bearing.
|
|
6
6
|
*
|
|
7
7
|
* Textarea's background is literal `bg-transparent` in the markup, not a
|
|
8
|
-
* semantic token today — there is nothing in
|
|
8
|
+
* semantic token today — there is nothing in the semantic layer to point a `--textarea-bg`
|
|
9
9
|
* at, so no such token is introduced here. Border, placeholder and focus ring
|
|
10
10
|
* are the tokens that existed as semantic classes before this file, and are
|
|
11
11
|
* the ones made overridable.
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
1
3
|
import { autoUpdate, FloatingPortal, flip, offset, shift, useClick, useDismiss, useFloating, useInteractions } from "@floating-ui/react";
|
|
2
4
|
import { useControllableState } from "@sixthshift/design-system/hooks";
|
|
3
5
|
import { cn } from "@sixthshift/design-system/utils";
|
|
@@ -6,6 +8,8 @@ import * as React from "react";
|
|
|
6
8
|
import { useCallback, useId, useMemo, useState } from "react";
|
|
7
9
|
import { fromISOTime, fromISOTimeOrUndefined, type Temporal, toISOTimeOrUndefined } from "../../date-time";
|
|
8
10
|
import { PickerField } from "../../internal";
|
|
11
|
+
import { closestBrand } from "../../internal/brandScope";
|
|
12
|
+
import { useEscapeLayer } from "../../internal/escapeLayers";
|
|
9
13
|
import { Button } from "../Button";
|
|
10
14
|
import { Separator } from "../Separator";
|
|
11
15
|
import { PeriodSelector } from "./PeriodSelector";
|
|
@@ -241,6 +245,10 @@ export const TimePicker = React.forwardRef<HTMLDivElement, TimePickerProps>((pro
|
|
|
241
245
|
|
|
242
246
|
const click = useClick(context);
|
|
243
247
|
const dismiss = useDismiss(context);
|
|
248
|
+
|
|
249
|
+
// While open, an Escape press closes this picker's popover and must not
|
|
250
|
+
// also close a Modal/Sheet it is rendered inside.
|
|
251
|
+
useEscapeLayer(open);
|
|
244
252
|
const { getReferenceProps, getFloatingProps } = useInteractions([click, dismiss]);
|
|
245
253
|
|
|
246
254
|
// IDs for accessibility
|
|
@@ -347,6 +355,8 @@ export const TimePicker = React.forwardRef<HTMLDivElement, TimePickerProps>((pro
|
|
|
347
355
|
role="dialog"
|
|
348
356
|
aria-label="Choose time"
|
|
349
357
|
style={floatingStyles}
|
|
358
|
+
// Portalled out of the trigger's brand scope, so carry it across.
|
|
359
|
+
data-brand={closestBrand(context.elements.domReference)}
|
|
350
360
|
className="z-popover rounded-xl border border-border-normal bg-bg-normal p-4 shadow-lg"
|
|
351
361
|
{...getFloatingProps()}
|
|
352
362
|
>
|