@dxos/react-ui 0.10.0 → 0.11.1
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/dist/lib/chunk-parse-stack.mjs +1566 -0
- package/dist/lib/chunk-parse-stack.mjs.map +1 -0
- package/dist/lib/index.mjs +5220 -0
- package/dist/lib/index.mjs.map +1 -0
- package/dist/lib/testing.mjs +144 -0
- package/dist/lib/testing.mjs.map +1 -0
- package/dist/lib/translations.mjs +38 -0
- package/dist/lib/translations.mjs.map +1 -0
- package/dist/types/src/components/Avatars/Avatar.d.ts +1 -6
- package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
- package/dist/types/src/components/Avatars/AvatarContext.d.ts +9 -0
- package/dist/types/src/components/Avatars/AvatarContext.d.ts.map +1 -0
- package/dist/types/src/components/Avatars/index.d.ts +1 -0
- package/dist/types/src/components/Avatars/index.d.ts.map +1 -1
- package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts +1 -1
- package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
- package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
- package/dist/types/src/components/Breadcrumb/Breadcrumb.theme.d.ts.map +1 -1
- package/dist/types/src/components/Button/Button.d.ts +1 -6
- package/dist/types/src/components/Button/Button.d.ts.map +1 -1
- package/dist/types/src/components/Button/ButtonGroupContext.d.ts +9 -0
- package/dist/types/src/components/Button/ButtonGroupContext.d.ts.map +1 -0
- package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
- package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
- package/dist/types/src/components/Button/IconButton.theme.d.ts +1 -0
- package/dist/types/src/components/Button/IconButton.theme.d.ts.map +1 -1
- package/dist/types/src/components/Button/SystemIconButton.d.ts +1 -1
- package/dist/types/src/components/Button/SystemIconButton.d.ts.map +1 -1
- package/dist/types/src/components/Button/index.d.ts +1 -0
- package/dist/types/src/components/Button/index.d.ts.map +1 -1
- package/dist/types/src/components/Calendar/Calendar.d.ts +0 -2
- package/dist/types/src/components/Calendar/Calendar.d.ts.map +1 -1
- package/dist/types/src/components/Calendar/index.d.ts +1 -0
- package/dist/types/src/components/Calendar/index.d.ts.map +1 -1
- package/dist/types/src/components/Calendar/parse-calendar-date.d.ts +3 -0
- package/dist/types/src/components/Calendar/parse-calendar-date.d.ts.map +1 -0
- package/dist/types/src/components/Card/Card.d.ts +42 -15
- package/dist/types/src/components/Card/Card.d.ts.map +1 -1
- package/dist/types/src/components/Card/Card.theme.d.ts +0 -1
- package/dist/types/src/components/Card/Card.theme.d.ts.map +1 -1
- package/dist/types/src/components/Carousel/Carousel.d.ts +2 -4
- package/dist/types/src/components/Carousel/Carousel.d.ts.map +1 -1
- package/dist/types/src/components/Carousel/CarouselContext.d.ts +8 -0
- package/dist/types/src/components/Carousel/CarouselContext.d.ts.map +1 -0
- package/dist/types/src/components/Carousel/index.d.ts +1 -0
- package/dist/types/src/components/Carousel/index.d.ts.map +1 -1
- package/dist/types/src/components/Clipboard/ClipboardContext.d.ts +7 -0
- package/dist/types/src/components/Clipboard/ClipboardContext.d.ts.map +1 -0
- package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts +0 -6
- package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
- package/dist/types/src/components/Clipboard/index.d.ts +1 -1
- package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
- package/dist/types/src/components/Column/Column.d.ts +7 -12
- package/dist/types/src/components/Column/Column.d.ts.map +1 -1
- package/dist/types/src/components/Column/Column.stories.d.ts +2 -2
- package/dist/types/src/components/Column/Column.theme.d.ts +0 -1
- package/dist/types/src/components/Column/Column.theme.d.ts.map +1 -1
- package/dist/types/src/components/Column/ColumnContext.d.ts +9 -0
- package/dist/types/src/components/Column/ColumnContext.d.ts.map +1 -0
- package/dist/types/src/components/Column/index.d.ts +1 -0
- package/dist/types/src/components/Column/index.d.ts.map +1 -1
- package/dist/types/src/components/Column/withColumn.d.ts +40 -4
- package/dist/types/src/components/Column/withColumn.d.ts.map +1 -1
- package/dist/types/src/components/DatePicker/DatePicker.d.ts +0 -10
- package/dist/types/src/components/DatePicker/DatePicker.d.ts.map +1 -1
- package/dist/types/src/components/DatePicker/DatePickerContext.d.ts +13 -0
- package/dist/types/src/components/DatePicker/DatePickerContext.d.ts.map +1 -0
- package/dist/types/src/components/DatePicker/index.d.ts +1 -0
- package/dist/types/src/components/DatePicker/index.d.ts.map +1 -1
- package/dist/types/src/components/Dialog/AlertDialog.d.ts +3 -3
- package/dist/types/src/components/Dialog/Dialog.d.ts +3 -3
- package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +5 -10
- package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -1
- package/dist/types/src/components/ErrorFallback/index.d.ts +1 -0
- package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -1
- package/dist/types/src/components/ErrorFallback/parse-stack.d.ts +8 -0
- package/dist/types/src/components/ErrorFallback/parse-stack.d.ts.map +1 -0
- package/dist/types/src/components/Focus/Focus.d.ts +2 -10
- package/dist/types/src/components/Focus/Focus.d.ts.map +1 -1
- package/dist/types/src/components/Focus/FocusContext.d.ts +10 -0
- package/dist/types/src/components/Focus/FocusContext.d.ts.map +1 -0
- package/dist/types/src/components/Focus/index.d.ts +1 -0
- package/dist/types/src/components/Focus/index.d.ts.map +1 -1
- package/dist/types/src/components/Input/Input.d.ts +9 -10
- package/dist/types/src/components/Input/Input.d.ts.map +1 -1
- package/dist/types/src/components/Input/Input.stories.d.ts +7 -2
- package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
- package/dist/types/src/components/Input/Input.theme.d.ts +13 -0
- package/dist/types/src/components/Input/Input.theme.d.ts.map +1 -1
- package/dist/types/src/components/Input/InputTriggerContext.d.ts +15 -0
- package/dist/types/src/components/Input/InputTriggerContext.d.ts.map +1 -0
- package/dist/types/src/components/Input/SegmentedInput.d.ts.map +1 -1
- package/dist/types/src/components/Input/index.d.ts +1 -0
- package/dist/types/src/components/Input/index.d.ts.map +1 -1
- package/dist/types/src/components/Main/Main.d.ts +2 -35
- package/dist/types/src/components/Main/Main.d.ts.map +1 -1
- package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
- package/dist/types/src/components/Main/Main.theme.d.ts.map +1 -1
- package/dist/types/src/components/Main/MainContext.d.ts +38 -0
- package/dist/types/src/components/Main/MainContext.d.ts.map +1 -0
- package/dist/types/src/components/Main/index.d.ts +1 -0
- package/dist/types/src/components/Main/index.d.ts.map +1 -1
- package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts +1 -17
- package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts.map +1 -1
- package/dist/types/src/components/MediaPlayer/index.d.ts +1 -0
- package/dist/types/src/components/MediaPlayer/index.d.ts.map +1 -1
- package/dist/types/src/components/MediaPlayer/media-kind.d.ts +18 -0
- package/dist/types/src/components/MediaPlayer/media-kind.d.ts.map +1 -0
- package/dist/types/src/components/Menu/DropdownMenu.d.ts +6 -22
- package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -1
- package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +1 -11
- package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
- package/dist/types/src/components/Menu/DropdownMenuContext.d.ts +27 -0
- package/dist/types/src/components/Menu/DropdownMenuContext.d.ts.map +1 -0
- package/dist/types/src/components/Menu/index.d.ts +1 -0
- package/dist/types/src/components/Menu/index.d.ts.map +1 -1
- package/dist/types/src/components/Message/Message.d.ts +11 -6
- package/dist/types/src/components/Message/Message.d.ts.map +1 -1
- package/dist/types/src/components/Message/Message.stories.d.ts +4 -1
- package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
- package/dist/types/src/components/Message/Message.theme.d.ts.map +1 -1
- package/dist/types/src/components/Message/index.d.ts +1 -0
- package/dist/types/src/components/Message/index.d.ts.map +1 -1
- package/dist/types/src/components/Message/message-icons.d.ts +3 -0
- package/dist/types/src/components/Message/message-icons.d.ts.map +1 -0
- package/dist/types/src/components/Panel/Panel.d.ts +4 -4
- package/dist/types/src/components/Panel/Panel.stories.d.ts.map +1 -1
- package/dist/types/src/components/Panel/Panel.theme.d.ts +1 -1
- package/dist/types/src/components/Panel/Panel.theme.d.ts.map +1 -1
- package/dist/types/src/components/Popover/Popover.d.ts +6 -10
- package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
- package/dist/types/src/components/Popover/PopoverContext.d.ts +29 -0
- package/dist/types/src/components/Popover/PopoverContext.d.ts.map +1 -0
- package/dist/types/src/components/Popover/index.d.ts +1 -0
- package/dist/types/src/components/Popover/index.d.ts.map +1 -1
- package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +2 -2
- package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +2 -2
- package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +3 -16
- package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
- package/dist/types/src/components/ScrollContainer/ScrollContainerContext.d.ts +16 -0
- package/dist/types/src/components/ScrollContainer/ScrollContainerContext.d.ts.map +1 -0
- package/dist/types/src/components/ScrollContainer/index.d.ts +1 -0
- package/dist/types/src/components/ScrollContainer/index.d.ts.map +1 -1
- package/dist/types/src/components/Slider/Slider.d.ts +25 -0
- package/dist/types/src/components/Slider/Slider.d.ts.map +1 -0
- package/dist/types/src/components/Slider/Slider.stories.d.ts +29 -0
- package/dist/types/src/components/Slider/Slider.stories.d.ts.map +1 -0
- package/dist/types/src/components/Slider/Slider.test.d.ts +2 -0
- package/dist/types/src/components/Slider/Slider.test.d.ts.map +1 -0
- package/dist/types/src/components/Slider/Slider.theme.d.ts +7 -0
- package/dist/types/src/components/Slider/Slider.theme.d.ts.map +1 -0
- package/dist/types/src/components/Slider/index.d.ts +2 -0
- package/dist/types/src/components/Slider/index.d.ts.map +1 -0
- package/dist/types/src/components/Splitter/Splitter.d.ts +3 -3
- package/dist/types/src/components/Status/Status.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.d.ts +4 -2
- package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.theme.d.ts.map +1 -1
- package/dist/types/src/components/Tooltip/TextTooltip.d.ts.map +1 -1
- package/dist/types/src/components/Tooltip/Tooltip.d.ts +2 -23
- package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/types/src/components/Tooltip/TooltipContext.d.ts +35 -0
- package/dist/types/src/components/Tooltip/TooltipContext.d.ts.map +1 -0
- package/dist/types/src/components/Tooltip/index.d.ts +1 -0
- package/dist/types/src/components/Tooltip/index.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +1 -0
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/exemplars/generics.stories.d.ts +1 -1
- package/dist/types/src/hooks/useIconHref.d.ts +8 -0
- package/dist/types/src/hooks/useIconHref.d.ts.map +1 -1
- package/dist/types/src/hooks/useThemeContext.d.ts +2 -1
- package/dist/types/src/hooks/useThemeContext.d.ts.map +1 -1
- package/dist/types/src/hooks/useThemeContext.test.d.ts +2 -0
- package/dist/types/src/hooks/useThemeContext.test.d.ts.map +1 -0
- package/dist/types/src/playground/Density.stories.d.ts +11 -0
- package/dist/types/src/playground/Density.stories.d.ts.map +1 -0
- package/dist/types/src/playground/Elevation.stories.d.ts +14 -0
- package/dist/types/src/playground/Elevation.stories.d.ts.map +1 -0
- package/dist/types/src/primitives/Container/Container.d.ts +1 -1
- package/dist/types/src/primitives/Container/Container.d.ts.map +1 -1
- package/dist/types/src/primitives/DensityProvider/DensityContext.d.ts +6 -0
- package/dist/types/src/primitives/DensityProvider/DensityContext.d.ts.map +1 -0
- package/dist/types/src/primitives/DensityProvider/DensityProvider.d.ts +10 -4
- package/dist/types/src/primitives/DensityProvider/DensityProvider.d.ts.map +1 -1
- package/dist/types/src/primitives/DensityProvider/index.d.ts +1 -0
- package/dist/types/src/primitives/DensityProvider/index.d.ts.map +1 -1
- package/dist/types/src/primitives/Flex/Flex.d.ts +1 -1
- package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -1
- package/dist/types/src/primitives/Grid/Grid.d.ts +1 -1
- package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -1
- package/dist/types/src/primitives/ThemeProvider/IconRegistry.d.ts +15 -0
- package/dist/types/src/primitives/ThemeProvider/IconRegistry.d.ts.map +1 -0
- package/dist/types/src/primitives/ThemeProvider/ThemeProvider.d.ts +1 -2
- package/dist/types/src/primitives/ThemeProvider/ThemeProvider.d.ts.map +1 -1
- package/dist/types/src/primitives/ThemeProvider/ThemeProvider.stories.d.ts +1 -1
- package/dist/types/src/primitives/ThemeProvider/TranslationsContext.d.ts +112 -0
- package/dist/types/src/primitives/ThemeProvider/TranslationsContext.d.ts.map +1 -0
- package/dist/types/src/primitives/ThemeProvider/TranslationsProvider.d.ts +0 -109
- package/dist/types/src/primitives/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
- package/dist/types/src/primitives/ThemeProvider/icon-registry.d.ts +34 -0
- package/dist/types/src/primitives/ThemeProvider/icon-registry.d.ts.map +1 -0
- package/dist/types/src/primitives/ThemeProvider/index.d.ts +3 -1
- package/dist/types/src/primitives/ThemeProvider/index.d.ts.map +1 -1
- package/dist/types/src/testing/decorators/withTheme.d.ts +1 -1
- package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
- package/dist/types/src/theme/defaultTheme.d.ts.map +1 -1
- package/dist/types/src/theme/index.d.ts +1 -0
- package/dist/types/src/theme/index.d.ts.map +1 -1
- package/dist/types/src/util/slots.d.ts +6 -3
- package/dist/types/src/util/slots.d.ts.map +1 -1
- package/dist/types/src/util/slots.stories.d.ts +14 -0
- package/dist/types/src/util/slots.stories.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +25 -27
- package/src/components/Avatars/Avatar.tsx +1 -11
- package/src/components/Avatars/AvatarContext.ts +16 -0
- package/src/components/Avatars/index.ts +2 -0
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +27 -25
- package/src/components/Breadcrumb/Breadcrumb.theme.ts +7 -5
- package/src/components/Breadcrumb/Breadcrumb.tsx +2 -2
- package/src/components/Button/Button.tsx +2 -11
- package/src/components/Button/ButtonGroupContext.ts +17 -0
- package/src/components/Button/IconButton.stories.tsx +2 -3
- package/src/components/Button/IconButton.theme.ts +15 -2
- package/src/components/Button/IconButton.tsx +6 -1
- package/src/components/Button/SystemIconButton.tsx +23 -16
- package/src/components/Button/index.ts +2 -0
- package/src/components/Calendar/Calendar.theme.ts +5 -5
- package/src/components/Calendar/Calendar.tsx +1 -3
- package/src/components/Calendar/index.ts +2 -0
- package/src/components/Calendar/parse-calendar-date.ts +9 -0
- package/src/components/Card/Card.theme.ts +48 -38
- package/src/components/Card/Card.tsx +77 -16
- package/src/components/Carousel/Carousel.tsx +4 -11
- package/src/components/Carousel/CarouselContext.ts +17 -0
- package/src/components/Carousel/index.ts +2 -0
- package/src/components/Clipboard/ClipboardContext.ts +20 -0
- package/src/components/Clipboard/ClipboardProvider.tsx +2 -12
- package/src/components/Clipboard/CopyButton.tsx +1 -1
- package/src/components/Clipboard/index.ts +1 -1
- package/src/components/Column/Column.stories.tsx +2 -2
- package/src/components/Column/Column.theme.ts +2 -11
- package/src/components/Column/Column.tsx +35 -57
- package/src/components/Column/ColumnContext.ts +22 -0
- package/src/components/Column/index.ts +2 -0
- package/src/components/Column/withColumn.ts +41 -4
- package/src/components/DatePicker/DatePicker.theme.ts +2 -2
- package/src/components/DatePicker/DatePicker.tsx +1 -14
- package/src/components/DatePicker/DatePickerContext.ts +21 -0
- package/src/components/DatePicker/index.ts +2 -0
- package/src/components/ErrorFallback/ErrorStack.tsx +8 -28
- package/src/components/ErrorFallback/index.ts +1 -0
- package/src/components/ErrorFallback/parse-stack.ts +33 -0
- package/src/components/Focus/Focus.stories.tsx +6 -6
- package/src/components/Focus/Focus.tsx +2 -30
- package/src/components/Focus/FocusContext.ts +22 -0
- package/src/components/Focus/index.ts +2 -0
- package/src/components/Image/Image.tsx +1 -1
- package/src/components/Input/Input.stories.tsx +63 -48
- package/src/components/Input/Input.theme.ts +33 -27
- package/src/components/Input/Input.tsx +46 -43
- package/src/components/Input/InputTriggerContext.ts +45 -0
- package/src/components/Input/SegmentedInput.tsx +2 -1
- package/src/components/Input/index.ts +2 -0
- package/src/components/Main/Main.stories.tsx +2 -1
- package/src/components/Main/Main.theme.ts +10 -1
- package/src/components/Main/Main.tsx +1 -115
- package/src/components/Main/MainContext.ts +126 -0
- package/src/components/Main/index.ts +2 -0
- package/src/components/MediaPlayer/MediaPlayer.tsx +16 -47
- package/src/components/MediaPlayer/index.ts +2 -0
- package/src/components/MediaPlayer/media-kind.ts +41 -0
- package/src/components/Menu/DropdownMenu.tsx +27 -44
- package/src/components/Menu/DropdownMenuContext.ts +35 -0
- package/src/components/Menu/Menu.theme.ts +3 -3
- package/src/components/Menu/index.ts +2 -0
- package/src/components/Message/Message.stories.tsx +32 -15
- package/src/components/Message/Message.theme.ts +8 -2
- package/src/components/Message/Message.tsx +47 -23
- package/src/components/Message/index.ts +2 -0
- package/src/components/Message/message-icons.ts +16 -0
- package/src/components/Panel/Panel.stories.tsx +15 -2
- package/src/components/Panel/Panel.theme.ts +15 -6
- package/src/components/Popover/Popover.theme.ts +1 -1
- package/src/components/Popover/Popover.tsx +22 -37
- package/src/components/Popover/PopoverContext.ts +32 -0
- package/src/components/Popover/index.ts +2 -0
- package/src/components/ScrollContainer/ScrollContainer.stories.tsx +1 -1
- package/src/components/ScrollContainer/ScrollContainer.tsx +1 -18
- package/src/components/ScrollContainer/ScrollContainerContext.ts +25 -0
- package/src/components/ScrollContainer/index.ts +2 -0
- package/src/components/Select/Select.theme.ts +2 -2
- package/src/components/Slider/Slider.stories.tsx +107 -0
- package/src/components/Slider/Slider.test.tsx +105 -0
- package/src/components/Slider/Slider.theme.ts +38 -0
- package/src/components/Slider/Slider.tsx +64 -0
- package/src/components/Slider/index.ts +5 -0
- package/src/components/Status/Status.theme.ts +1 -1
- package/src/components/Status/Status.tsx +0 -1
- package/src/components/Tag/Tag.stories.tsx +1 -1
- package/src/components/Toolbar/Toolbar.theme.ts +14 -5
- package/src/components/Toolbar/Toolbar.tsx +5 -1
- package/src/components/Tooltip/TextTooltip.tsx +2 -1
- package/src/components/Tooltip/Tooltip.tsx +12 -35
- package/src/components/Tooltip/TooltipContext.ts +41 -0
- package/src/components/Tooltip/index.ts +2 -0
- package/src/components/index.ts +1 -0
- package/src/hooks/useIconHref.ts +26 -5
- package/src/hooks/useThemeContext.test.tsx +33 -0
- package/src/hooks/useThemeContext.ts +28 -3
- package/src/playground/Density.stories.tsx +41 -0
- package/src/playground/Elevation.stories.tsx +348 -0
- package/src/primitives/DensityProvider/DensityContext.ts +15 -0
- package/src/primitives/DensityProvider/DensityProvider.tsx +12 -6
- package/src/primitives/DensityProvider/index.ts +1 -0
- package/src/primitives/Flex/Flex.stories.tsx +1 -1
- package/src/primitives/Grid/Grid.stories.tsx +1 -1
- package/src/primitives/ThemeProvider/IconRegistry.tsx +42 -0
- package/src/primitives/ThemeProvider/ThemeProvider.tsx +16 -15
- package/src/primitives/ThemeProvider/TranslationsContext.ts +24 -0
- package/src/primitives/ThemeProvider/TranslationsProvider.tsx +4 -16
- package/src/primitives/ThemeProvider/icon-registry.ts +272 -0
- package/src/primitives/ThemeProvider/index.ts +9 -1
- package/src/testing/decorators/withLayout.tsx +4 -4
- package/src/testing/decorators/withLayoutVariants.tsx +3 -3
- package/src/testing/decorators/withTheme.tsx +1 -2
- package/src/theme/defaultTheme.ts +2 -0
- package/src/theme/index.ts +1 -0
- package/src/util/slots.stories.tsx +80 -0
- package/src/util/slots.ts +14 -5
- package/dist/lib/browser/chunk-CMHHVHX3.mjs +0 -46
- package/dist/lib/browser/chunk-CMHHVHX3.mjs.map +0 -7
- package/dist/lib/browser/chunk-GTHV4WYK.mjs +0 -1499
- package/dist/lib/browser/chunk-GTHV4WYK.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -5632
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/testing/index.mjs +0 -133
- package/dist/lib/browser/testing/index.mjs.map +0 -7
- package/dist/lib/browser/translations.mjs +0 -9
- package/dist/lib/browser/translations.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-3VSKWNCQ.mjs +0 -1501
- package/dist/lib/node-esm/chunk-3VSKWNCQ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-P4KFQGJI.mjs +0 -48
- package/dist/lib/node-esm/chunk-P4KFQGJI.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -5633
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/testing/index.mjs +0 -134
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
- package/dist/lib/node-esm/translations.mjs +0 -10
- package/dist/lib/node-esm/translations.mjs.map +0 -7
- package/src/components/Column/AUDIT.md +0 -148
- package/src/components/Focus/AUDIT.md +0 -43
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { createContext, useContext } from 'react';
|
|
6
|
+
|
|
7
|
+
// Kept out of `IconRegistry.tsx`: react-refresh only fast-refreshes a module whose exports are all
|
|
8
|
+
// components, so the registry, context and hooks exported beside the provider force a full page
|
|
9
|
+
// reload on every edit.
|
|
10
|
+
|
|
11
|
+
const SVG_NS = 'http://www.w3.org/2000/svg';
|
|
12
|
+
const SPRITE_URL = '/icons.svg';
|
|
13
|
+
|
|
14
|
+
const SYMBOL_PATTERN = /^([a-z0-9]+)--([a-z0-9-]+)--([a-z]+)$/;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Locates the standalone SVG for one icon set, so glyphs missing from the static sprite can be
|
|
18
|
+
* fetched at runtime. The route must be served by the host (see the `assets` option of
|
|
19
|
+
* `@dxos/vite-plugin-icons`); sets without a source stay sprite-only.
|
|
20
|
+
*/
|
|
21
|
+
export type IconSource = {
|
|
22
|
+
/** Symbol-name prefix, e.g. `ph` for `ph--house--regular`. */
|
|
23
|
+
iconSet: string;
|
|
24
|
+
/** Resolves a parsed symbol name to a URL. */
|
|
25
|
+
url: (name: string, variant: string) => string;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Phosphor's published layout: `{variant}/{name}[-{variant}].svg`, regular being unsuffixed.
|
|
30
|
+
*/
|
|
31
|
+
export const phosphorIconSource = (route = '/phosphor'): IconSource => ({
|
|
32
|
+
iconSet: 'ph',
|
|
33
|
+
url: (name, variant) => `${route}/${variant}/${name}${variant === 'regular' ? '' : `-${variant}`}.svg`,
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
export const defaultSources: IconSource[] = [phosphorIconSource()];
|
|
37
|
+
|
|
38
|
+
export type IconRegistry = {
|
|
39
|
+
hasIcon(name: string): boolean;
|
|
40
|
+
requestIcon(name: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* Subscribe to changes — fires whenever a new symbol becomes available (static sprite
|
|
43
|
+
* finished ingesting, or a runtime fetch resolved). Returns an unsubscribe function.
|
|
44
|
+
*/
|
|
45
|
+
subscribe(listener: () => void): () => void;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export const NoopRegistry: IconRegistry = {
|
|
49
|
+
hasIcon: () => false,
|
|
50
|
+
requestIcon: () => {},
|
|
51
|
+
subscribe: () => () => {},
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export const IconRegistryContext = createContext<IconRegistry>(NoopRegistry);
|
|
55
|
+
|
|
56
|
+
// Singleton bridge so non-React renderers (Lit's <dx-icon>, etc.) and packages that don't
|
|
57
|
+
// depend on @dxos/react-ui can access the same registry. The convention is intentionally a
|
|
58
|
+
// globalThis property so that any package can read it without importing from this module.
|
|
59
|
+
const REGISTRY_GLOBAL = '__dxIconRegistry' as const;
|
|
60
|
+
|
|
61
|
+
type RegistryHost = { [REGISTRY_GLOBAL]?: IconRegistry };
|
|
62
|
+
|
|
63
|
+
const getHost = (): RegistryHost => globalThis as unknown as RegistryHost;
|
|
64
|
+
|
|
65
|
+
const setActiveRegistry = (registry: IconRegistry | undefined): void => {
|
|
66
|
+
const host = getHost();
|
|
67
|
+
if (registry === undefined) {
|
|
68
|
+
delete host[REGISTRY_GLOBAL];
|
|
69
|
+
} else {
|
|
70
|
+
host[REGISTRY_GLOBAL] = registry;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export const getIconRegistry = (): IconRegistry => getHost()[REGISTRY_GLOBAL] ?? NoopRegistry;
|
|
75
|
+
|
|
76
|
+
export const useIconRegistry = (): IconRegistry => useContext(IconRegistryContext);
|
|
77
|
+
|
|
78
|
+
type RegistryHandle = {
|
|
79
|
+
registry: IconRegistry;
|
|
80
|
+
dispose: () => void;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const createDefsContainer = (): SVGSVGElement => {
|
|
84
|
+
const svg = document.createElementNS(SVG_NS, 'svg');
|
|
85
|
+
svg.setAttribute('aria-hidden', 'true');
|
|
86
|
+
svg.setAttribute('data-dx-icon-sprite', '');
|
|
87
|
+
svg.style.position = 'absolute';
|
|
88
|
+
svg.style.width = '0';
|
|
89
|
+
svg.style.height = '0';
|
|
90
|
+
svg.style.overflow = 'hidden';
|
|
91
|
+
document.body.appendChild(svg);
|
|
92
|
+
return svg;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const parseSymbolName = (name: string) => {
|
|
96
|
+
const match = name.match(SYMBOL_PATTERN);
|
|
97
|
+
if (!match) {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
return { iconSet: match[1], iconName: match[2], variant: match[3] };
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
type RegistryState = {
|
|
104
|
+
defs: SVGSVGElement;
|
|
105
|
+
sources: IconSource[];
|
|
106
|
+
loaded: Set<string>;
|
|
107
|
+
inflight: Map<string, Promise<void>>;
|
|
108
|
+
// Permanent misses (no source for the set, 404, malformed source) — never re-fetched, so a
|
|
109
|
+
// component that re-renders with a bad icon name doesn't produce repeated network churn.
|
|
110
|
+
failed: Set<string>;
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const ingestSvgChildrenAsSymbol = (sourceSvg: Element, id: string): SVGSymbolElement | undefined => {
|
|
114
|
+
if (sourceSvg.tagName.toLowerCase() !== 'svg') {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
const symbol = document.createElementNS(SVG_NS, 'symbol') as SVGSymbolElement;
|
|
118
|
+
symbol.setAttribute('id', id);
|
|
119
|
+
const viewBox = sourceSvg.getAttribute('viewBox');
|
|
120
|
+
if (viewBox) {
|
|
121
|
+
symbol.setAttribute('viewBox', viewBox);
|
|
122
|
+
}
|
|
123
|
+
// Standalone sources don't set fill; the sprite convention is fill="currentColor" on each symbol.
|
|
124
|
+
symbol.setAttribute('fill', 'currentColor');
|
|
125
|
+
for (const child of Array.from(sourceSvg.children)) {
|
|
126
|
+
symbol.appendChild(child.cloneNode(true));
|
|
127
|
+
}
|
|
128
|
+
return symbol;
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
const loadStaticSprite = async (state: RegistryState): Promise<void> => {
|
|
132
|
+
let text: string;
|
|
133
|
+
try {
|
|
134
|
+
const response = await fetch(SPRITE_URL);
|
|
135
|
+
if (!response.ok) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
text = await response.text();
|
|
139
|
+
} catch {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const doc = new DOMParser().parseFromString(text, 'image/svg+xml');
|
|
143
|
+
const root = doc.documentElement;
|
|
144
|
+
if (root.tagName.toLowerCase() !== 'svg') {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
for (const child of Array.from(root.children)) {
|
|
148
|
+
const node = state.defs.ownerDocument.importNode(child, true);
|
|
149
|
+
state.defs.appendChild(node);
|
|
150
|
+
}
|
|
151
|
+
for (const symbol of state.defs.querySelectorAll('symbol[id]')) {
|
|
152
|
+
state.loaded.add(symbol.id);
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
const resolveDynamic = async (state: RegistryState, staticReady: Promise<void>, name: string): Promise<void> => {
|
|
157
|
+
// Wait until the static sprite has been ingested before deciding to fetch — the icon may already be present.
|
|
158
|
+
await staticReady;
|
|
159
|
+
if (state.loaded.has(name)) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const parsed = parseSymbolName(name);
|
|
163
|
+
const source = parsed && state.sources.find(({ iconSet }) => iconSet === parsed.iconSet);
|
|
164
|
+
if (!parsed || !source) {
|
|
165
|
+
// Sets without a configured source (custom brand glyphs, plugin namespaces) are sprite-only.
|
|
166
|
+
state.failed.add(name);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
let svgText: string;
|
|
170
|
+
try {
|
|
171
|
+
const response = await fetch(source.url(parsed.iconName, parsed.variant));
|
|
172
|
+
if (!response.ok) {
|
|
173
|
+
if (response.status === 404) {
|
|
174
|
+
state.failed.add(name);
|
|
175
|
+
}
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
svgText = await response.text();
|
|
179
|
+
} catch {
|
|
180
|
+
// Network errors are transient — leave the name eligible for a retry.
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const doc = new DOMParser().parseFromString(svgText, 'image/svg+xml');
|
|
184
|
+
const symbol = ingestSvgChildrenAsSymbol(doc.documentElement, name);
|
|
185
|
+
if (!symbol) {
|
|
186
|
+
state.failed.add(name);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
state.defs.appendChild(symbol);
|
|
190
|
+
state.loaded.add(name);
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
const createRegistry = (sources: IconSource[]): RegistryHandle => {
|
|
194
|
+
const defs = createDefsContainer();
|
|
195
|
+
const listeners = new Set<() => void>();
|
|
196
|
+
const notify = () => {
|
|
197
|
+
for (const listener of listeners) {
|
|
198
|
+
listener();
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
const state: RegistryState = {
|
|
202
|
+
defs,
|
|
203
|
+
sources,
|
|
204
|
+
loaded: new Set<string>(),
|
|
205
|
+
inflight: new Map<string, Promise<void>>(),
|
|
206
|
+
failed: new Set<string>(),
|
|
207
|
+
};
|
|
208
|
+
const staticReady = loadStaticSprite(state).then(notify);
|
|
209
|
+
|
|
210
|
+
const registry: IconRegistry = {
|
|
211
|
+
hasIcon: (name) => state.loaded.has(name),
|
|
212
|
+
requestIcon: (name) => {
|
|
213
|
+
if (state.loaded.has(name) || state.inflight.has(name) || state.failed.has(name)) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
const promise = resolveDynamic(state, staticReady, name)
|
|
217
|
+
.then(notify)
|
|
218
|
+
.finally(() => {
|
|
219
|
+
state.inflight.delete(name);
|
|
220
|
+
});
|
|
221
|
+
state.inflight.set(name, promise);
|
|
222
|
+
},
|
|
223
|
+
subscribe: (listener) => {
|
|
224
|
+
listeners.add(listener);
|
|
225
|
+
return () => {
|
|
226
|
+
listeners.delete(listener);
|
|
227
|
+
};
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
return {
|
|
232
|
+
registry,
|
|
233
|
+
dispose: () => {
|
|
234
|
+
listeners.clear();
|
|
235
|
+
defs.remove();
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
// Refcounted document-level singleton: ThemeProvider mounts many times in one document
|
|
241
|
+
// (editor tooltip roots, the shell, dialogs), and a registry per mount would re-fetch the
|
|
242
|
+
// static sprite and duplicate every symbol id in the DOM on each mount.
|
|
243
|
+
type SharedRegistry = RegistryHandle & { refCount: number };
|
|
244
|
+
|
|
245
|
+
let sharedRegistry: SharedRegistry | undefined;
|
|
246
|
+
|
|
247
|
+
export const acquireRegistry = (sources: IconSource[]): { registry: IconRegistry; release: () => void } => {
|
|
248
|
+
if (!sharedRegistry) {
|
|
249
|
+
sharedRegistry = { ...createRegistry(sources), refCount: 0 };
|
|
250
|
+
setActiveRegistry(sharedRegistry.registry);
|
|
251
|
+
}
|
|
252
|
+
const handle = sharedRegistry;
|
|
253
|
+
handle.refCount += 1;
|
|
254
|
+
let released = false;
|
|
255
|
+
return {
|
|
256
|
+
registry: handle.registry,
|
|
257
|
+
release: () => {
|
|
258
|
+
if (released) {
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
released = true;
|
|
262
|
+
handle.refCount -= 1;
|
|
263
|
+
if (handle.refCount === 0 && sharedRegistry === handle) {
|
|
264
|
+
sharedRegistry = undefined;
|
|
265
|
+
if (getIconRegistry() === handle.registry) {
|
|
266
|
+
setActiveRegistry(undefined);
|
|
267
|
+
}
|
|
268
|
+
handle.dispose();
|
|
269
|
+
}
|
|
270
|
+
},
|
|
271
|
+
};
|
|
272
|
+
};
|
|
@@ -4,5 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
export { type Label, isLabel, toLocalizedString } from '@dxos/ui-types/translations';
|
|
6
6
|
|
|
7
|
+
export {
|
|
8
|
+
type IconRegistry,
|
|
9
|
+
type IconSource,
|
|
10
|
+
getIconRegistry,
|
|
11
|
+
phosphorIconSource,
|
|
12
|
+
useIconRegistry,
|
|
13
|
+
} from './icon-registry';
|
|
14
|
+
export * from './IconRegistry';
|
|
7
15
|
export * from './ThemeProvider';
|
|
8
|
-
export { TranslationsContext, useTranslation } from './
|
|
16
|
+
export { TranslationsContext, useTranslation } from './TranslationsContext';
|
|
@@ -54,14 +54,14 @@ const layouts: Record<ContainerType, FC<ContainerProps>> = {
|
|
|
54
54
|
),
|
|
55
55
|
|
|
56
56
|
centered: ({ classNames, children }: ContainerProps) => (
|
|
57
|
-
<div className={mx('fixed inset-0 grid overflow-hidden place-items-center
|
|
58
|
-
<div className={mx('flex flex-col
|
|
57
|
+
<div className={mx('fixed inset-0 grid overflow-hidden place-items-center dx-deck-surface')}>
|
|
58
|
+
<div className={mx('flex flex-col dx-base-surface', classNames)}>{children}</div>
|
|
59
59
|
</div>
|
|
60
60
|
),
|
|
61
61
|
|
|
62
62
|
column: ({ classNames, children }: ContainerProps) => (
|
|
63
|
-
<div className='fixed inset-0 flex overflow-hidden justify-center
|
|
64
|
-
<div className={mx('flex flex-col w-[40rem]
|
|
63
|
+
<div className='fixed inset-0 flex overflow-hidden justify-center dx-deck-surface'>
|
|
64
|
+
<div className={mx('flex flex-col w-[40rem] dx-base-surface', classNames)}>{children}</div>
|
|
65
65
|
</div>
|
|
66
66
|
),
|
|
67
67
|
};
|
|
@@ -38,9 +38,9 @@ const Panel = ({
|
|
|
38
38
|
|
|
39
39
|
export const withLayoutVariants = ({
|
|
40
40
|
elevations = [
|
|
41
|
-
{ elevation: 'dialog', surface: '
|
|
42
|
-
{ elevation: 'positioned', surface: '
|
|
43
|
-
{ elevation: 'base', surface: '
|
|
41
|
+
{ elevation: 'dialog', surface: 'dx-modal-surface' },
|
|
42
|
+
{ elevation: 'positioned', surface: 'dx-card-surface' },
|
|
43
|
+
{ elevation: 'base', surface: 'dx-base-surface' },
|
|
44
44
|
],
|
|
45
45
|
densities = ['md'],
|
|
46
46
|
}: Config = {}): Decorator => {
|
|
@@ -20,7 +20,7 @@ import { defaultTx } from '../../theme';
|
|
|
20
20
|
* empty.
|
|
21
21
|
*/
|
|
22
22
|
export const withTheme =
|
|
23
|
-
({ tx = defaultTx,
|
|
23
|
+
({ tx = defaultTx, platform }: Partial<ThemeContextValue> = {}): Decorator =>
|
|
24
24
|
(Story, context) => {
|
|
25
25
|
const {
|
|
26
26
|
globals: { theme },
|
|
@@ -33,7 +33,6 @@ export const withTheme =
|
|
|
33
33
|
tx={tx}
|
|
34
34
|
themeMode={(theme as ThemeMode) || 'dark'}
|
|
35
35
|
resourceExtensions={translations}
|
|
36
|
-
noCache={noCache}
|
|
37
36
|
platform={platform}
|
|
38
37
|
>
|
|
39
38
|
<Tooltip.Provider>
|
|
@@ -26,6 +26,7 @@ import { scrollAreaTheme } from '../components/ScrollArea/ScrollArea.theme';
|
|
|
26
26
|
import { selectTheme } from '../components/Select/Select.theme';
|
|
27
27
|
import { separatorTheme } from '../components/Separator/Separator.theme';
|
|
28
28
|
import { skeletonTheme } from '../components/Skeleton/Skeleton.theme';
|
|
29
|
+
import { sliderTheme } from '../components/Slider/Slider.theme';
|
|
29
30
|
import { splitterTheme } from '../components/Splitter/Splitter.theme';
|
|
30
31
|
import { statusTheme } from '../components/Status/Status.theme';
|
|
31
32
|
import { tagTheme } from '../components/Tag/Tag.theme';
|
|
@@ -68,6 +69,7 @@ export const defaultTheme: Theme<Record<string, any>> = {
|
|
|
68
69
|
select: selectTheme,
|
|
69
70
|
separator: separatorTheme,
|
|
70
71
|
skeleton: skeletonTheme,
|
|
72
|
+
slider: sliderTheme,
|
|
71
73
|
splitter: splitterTheme,
|
|
72
74
|
status: statusTheme,
|
|
73
75
|
tag: tagTheme,
|
package/src/theme/index.ts
CHANGED
|
@@ -25,6 +25,7 @@ export * from '../components/ScrollArea/ScrollArea.theme';
|
|
|
25
25
|
export * from '../components/Select/Select.theme';
|
|
26
26
|
export * from '../components/Separator/Separator.theme';
|
|
27
27
|
export * from '../components/Skeleton/Skeleton.theme';
|
|
28
|
+
export * from '../components/Slider/Slider.theme';
|
|
28
29
|
export * from '../components/Splitter/Splitter.theme';
|
|
29
30
|
export * from '../components/Status/Status.theme';
|
|
30
31
|
export * from '../components/Tag/Tag.theme';
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
6
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
7
|
+
import React, { type ReactNode, forwardRef } from 'react';
|
|
8
|
+
|
|
9
|
+
import { withLayout, withTheme } from '../testing';
|
|
10
|
+
import { composable, composableProps, slottable } from './slots';
|
|
11
|
+
|
|
12
|
+
//
|
|
13
|
+
// A slottable host and two candidate children: one built with `composable()`, one a plain
|
|
14
|
+
// `forwardRef`. Radix `Slot` merges its props into whichever child it is given, but a child that
|
|
15
|
+
// does not spread them drops the injected `className` and `ref` — silently, with no error and no
|
|
16
|
+
// type complaint. `slottable()` detects that in dev builds and marks the rendered element with
|
|
17
|
+
// `dx-slot-warning` (a dashed rose outline).
|
|
18
|
+
//
|
|
19
|
+
|
|
20
|
+
const Host = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
|
|
21
|
+
const Comp: any = asChild ? Slot : 'div';
|
|
22
|
+
return (
|
|
23
|
+
<Comp {...composableProps(props, { classNames: 'p-2 rounded-sm bg-base-surface text-base-fg' })} ref={forwardedRef}>
|
|
24
|
+
{children}
|
|
25
|
+
</Comp>
|
|
26
|
+
);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
/** Correct: built with `composable()`, so it carries the COMPOSABLE marker and spreads props. */
|
|
30
|
+
const GoodChild = composable<HTMLDivElement>(({ children, ...props }, forwardedRef) => (
|
|
31
|
+
<div {...composableProps(props)} ref={forwardedRef}>
|
|
32
|
+
{children}
|
|
33
|
+
</div>
|
|
34
|
+
));
|
|
35
|
+
|
|
36
|
+
/** Incorrect: a plain `forwardRef`. It renders fine on its own, but as an `asChild` target the
|
|
37
|
+
* host's className never reaches the DOM — the failure this diagnostic exists to surface. */
|
|
38
|
+
const BadChild = forwardRef<HTMLDivElement, { children?: ReactNode }>(({ children }, forwardedRef) => (
|
|
39
|
+
<div ref={forwardedRef}>{children}</div>
|
|
40
|
+
));
|
|
41
|
+
|
|
42
|
+
const Row = ({ label, children }: { label: string; children: ReactNode }) => (
|
|
43
|
+
<div className='flex flex-col gap-1'>
|
|
44
|
+
<span className='text-sm text-description'>{label}</span>
|
|
45
|
+
{children}
|
|
46
|
+
</div>
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const DefaultStory = () => (
|
|
50
|
+
<div className='flex flex-col gap-6 p-4 w-96'>
|
|
51
|
+
<Row label='No asChild — host renders its own element.'>
|
|
52
|
+
<Host>Plain host</Host>
|
|
53
|
+
</Row>
|
|
54
|
+
|
|
55
|
+
<Row label='asChild with a composable child — no warning.'>
|
|
56
|
+
<Host asChild>
|
|
57
|
+
<GoodChild>Composable child</GoodChild>
|
|
58
|
+
</Host>
|
|
59
|
+
</Row>
|
|
60
|
+
|
|
61
|
+
<Row label='asChild with a non-composable child — dashed rose outline, and a console warning.'>
|
|
62
|
+
<Host asChild>
|
|
63
|
+
<BadChild>Non-composable child</BadChild>
|
|
64
|
+
</Host>
|
|
65
|
+
</Row>
|
|
66
|
+
</div>
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
const meta = {
|
|
70
|
+
title: 'ui/react-ui-core/util/slots',
|
|
71
|
+
render: DefaultStory,
|
|
72
|
+
decorators: [withTheme(), withLayout()],
|
|
73
|
+
parameters: { layout: 'fullscreen' },
|
|
74
|
+
} satisfies Meta<typeof DefaultStory>;
|
|
75
|
+
|
|
76
|
+
export default meta;
|
|
77
|
+
|
|
78
|
+
type Story = StoryObj<typeof meta>;
|
|
79
|
+
|
|
80
|
+
export const Default: Story = {};
|
package/src/util/slots.ts
CHANGED
|
@@ -21,12 +21,13 @@ import { type ComposableProps, type SlottableProps, type ThemedClassName } from
|
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Reconciles className properties from a parent slot.
|
|
24
|
-
* - `className` is
|
|
24
|
+
* - `className` is injected at runtime by the Slot merge mechanism; it is absent from
|
|
25
|
+
* `ComposableProps` so consumers cannot pass it, hence the widened parameter type here.
|
|
25
26
|
* - `classNames` is the consumer-facing prop for theming overrides.
|
|
26
27
|
* Use `composableProps` to reconcile both into a single `className`.
|
|
27
28
|
*/
|
|
28
29
|
export const composableProps = <P extends HTMLElement = HTMLElement>(
|
|
29
|
-
{ className, classNames, role, style, ...props }: ComposableProps,
|
|
30
|
+
{ className, classNames, role, style, ...props }: ComposableProps & { className?: string },
|
|
30
31
|
{ classNames: defaultClassNames, ...defaults }: ThemedClassName<Partial<HTMLAttributes<P>>> | undefined = {},
|
|
31
32
|
) => ({
|
|
32
33
|
// Default props.
|
|
@@ -35,8 +36,10 @@ export const composableProps = <P extends HTMLElement = HTMLElement>(
|
|
|
35
36
|
// Spread supplied props.
|
|
36
37
|
...props,
|
|
37
38
|
|
|
38
|
-
//
|
|
39
|
-
|
|
39
|
+
// No `role='none'` default. On a div it is a no-op, so the only elements it ever reached were the
|
|
40
|
+
// semantic ones — `Card.Header` renders a <header>, `Main.Content` a <main> — where it stripped
|
|
41
|
+
// the landmark. A part that genuinely wants its element ignored passes the role itself.
|
|
42
|
+
...((role ?? defaults.role) ? { role: role ?? defaults.role } : null),
|
|
40
43
|
|
|
41
44
|
// Merge styles.
|
|
42
45
|
style: { ...defaults.style, ...style } as CSSProperties,
|
|
@@ -73,7 +76,9 @@ export function slottable<E extends HTMLElement, P extends object = {}>(
|
|
|
73
76
|
): ForwardRefExoticComponent<SlottableProps<P> & RefAttributes<E>> {
|
|
74
77
|
const wrapped = (props: SlottableProps<P> & HTMLAttributes<E>, forwardedRef: ForwardedRef<E>) => {
|
|
75
78
|
let warn = false;
|
|
76
|
-
|
|
79
|
+
// Dev-only: the check walks children on every render of every `asChild` part, and the marker it
|
|
80
|
+
// paints is a developer diagnostic, not a product affordance.
|
|
81
|
+
if (process.env.NODE_ENV !== 'production' && props.asChild) {
|
|
77
82
|
try {
|
|
78
83
|
const child = Children.only(props.children);
|
|
79
84
|
if (isValidElement(child) && typeof child.type !== 'string' && !(child.type as any)[COMPOSABLE]) {
|
|
@@ -89,6 +94,10 @@ export function slottable<E extends HTMLElement, P extends object = {}>(
|
|
|
89
94
|
|
|
90
95
|
const result = render(props, forwardedRef);
|
|
91
96
|
if (warn) {
|
|
97
|
+
// The marker cannot go on the rendered element: under `asChild` that element is the `Slot`,
|
|
98
|
+
// which merges the class into the very child that is dropping props — the bug being flagged
|
|
99
|
+
// swallows its own diagnostic. So it goes on a wrapper, which `dx-slot-warning` renders as
|
|
100
|
+
// `display: contents` so it adds no layout box; the outline is drawn on its children instead.
|
|
92
101
|
return createElement('div', { role: 'none', className: 'dx-slot-warning' }, result);
|
|
93
102
|
}
|
|
94
103
|
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
// src/translations.ts
|
|
2
|
-
var translationKey = "@dxos/react-ui";
|
|
3
|
-
var translations = [
|
|
4
|
-
{
|
|
5
|
-
"en-US": {
|
|
6
|
-
[translationKey]: {
|
|
7
|
-
"toolbar-menu.label": "Action menu",
|
|
8
|
-
"toolbar-drag-handle.label": "Drag to rearrange",
|
|
9
|
-
"toolbar-close.label": "Close",
|
|
10
|
-
"toolbar-delete.label": "Delete",
|
|
11
|
-
"system-button.star.label": "Star",
|
|
12
|
-
"system-button.unstar.label": "Unstar",
|
|
13
|
-
"system-button.bookmark.label": "Bookmark",
|
|
14
|
-
"system-button.unbookmark.label": "Remove bookmark",
|
|
15
|
-
"system-button.expand.label": "Expand",
|
|
16
|
-
"system-button.collapse.label": "Collapse",
|
|
17
|
-
"system-button.add.label": "Add",
|
|
18
|
-
"system-button.delete.label": "Delete",
|
|
19
|
-
"system-button.edit.label": "Edit",
|
|
20
|
-
"system-button.close.label": "Close",
|
|
21
|
-
"system-button.upload.label": "Upload",
|
|
22
|
-
"system-button.download.label": "Download",
|
|
23
|
-
"system-button.clipboard.label": "Copy",
|
|
24
|
-
"carousel-viewport.label": "Carousel",
|
|
25
|
-
"carousel-prev.label": "Previous slide",
|
|
26
|
-
"carousel-next.label": "Next slide",
|
|
27
|
-
"carousel-indicators.label": "Carousel slides",
|
|
28
|
-
"carousel-go-to.label": "Go to slide {{index}}",
|
|
29
|
-
"date-picker.placeholder.single.label": "Pick a date",
|
|
30
|
-
"date-picker.placeholder.range.label": "Pick a date range",
|
|
31
|
-
"date-picker.placeholder.multiple.label": "Pick dates",
|
|
32
|
-
"date-picker.clear.label": "Clear",
|
|
33
|
-
"calendar.nav.previous.label": "Previous month",
|
|
34
|
-
"calendar.nav.next.label": "Next month",
|
|
35
|
-
"calendar.footer.today.label": "Today",
|
|
36
|
-
"trigger-button.label": "Open"
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
];
|
|
41
|
-
|
|
42
|
-
export {
|
|
43
|
-
translationKey,
|
|
44
|
-
translations
|
|
45
|
-
};
|
|
46
|
-
//# sourceMappingURL=chunk-CMHHVHX3.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/translations.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nexport const translationKey = '@dxos/react-ui';\n\nexport const translations = [\n {\n 'en-US': {\n [translationKey]: {\n 'toolbar-menu.label': 'Action menu',\n 'toolbar-drag-handle.label': 'Drag to rearrange',\n 'toolbar-close.label': 'Close',\n 'toolbar-delete.label': 'Delete',\n\n 'system-button.star.label': 'Star',\n 'system-button.unstar.label': 'Unstar',\n 'system-button.bookmark.label': 'Bookmark',\n 'system-button.unbookmark.label': 'Remove bookmark',\n 'system-button.expand.label': 'Expand',\n 'system-button.collapse.label': 'Collapse',\n 'system-button.add.label': 'Add',\n 'system-button.delete.label': 'Delete',\n 'system-button.edit.label': 'Edit',\n 'system-button.close.label': 'Close',\n 'system-button.upload.label': 'Upload',\n 'system-button.download.label': 'Download',\n 'system-button.clipboard.label': 'Copy',\n\n 'carousel-viewport.label': 'Carousel',\n 'carousel-prev.label': 'Previous slide',\n 'carousel-next.label': 'Next slide',\n 'carousel-indicators.label': 'Carousel slides',\n 'carousel-go-to.label': 'Go to slide {{index}}',\n\n 'date-picker.placeholder.single.label': 'Pick a date',\n 'date-picker.placeholder.range.label': 'Pick a date range',\n 'date-picker.placeholder.multiple.label': 'Pick dates',\n 'date-picker.clear.label': 'Clear',\n\n 'calendar.nav.previous.label': 'Previous month',\n 'calendar.nav.next.label': 'Next month',\n 'calendar.footer.today.label': 'Today',\n\n 'trigger-button.label': 'Open',\n },\n },\n },\n] as const satisfies Resource[];\n"],
|
|
5
|
-
"mappings": ";AAMO,IAAMA,iBAAiB;AAEvB,IAAMC,eAAe;EAC1B;IACE,SAAS;MACP,CAACD,cAAAA,GAAiB;QAChB,sBAAsB;QACtB,6BAA6B;QAC7B,uBAAuB;QACvB,wBAAwB;QAExB,4BAA4B;QAC5B,8BAA8B;QAC9B,gCAAgC;QAChC,kCAAkC;QAClC,8BAA8B;QAC9B,gCAAgC;QAChC,2BAA2B;QAC3B,8BAA8B;QAC9B,4BAA4B;QAC5B,6BAA6B;QAC7B,8BAA8B;QAC9B,gCAAgC;QAChC,iCAAiC;QAEjC,2BAA2B;QAC3B,uBAAuB;QACvB,uBAAuB;QACvB,6BAA6B;QAC7B,wBAAwB;QAExB,wCAAwC;QACxC,uCAAuC;QACvC,0CAA0C;QAC1C,2BAA2B;QAE3B,+BAA+B;QAC/B,2BAA2B;QAC3B,+BAA+B;QAE/B,wBAAwB;MAC1B;IACF;EACF;;",
|
|
6
|
-
"names": ["translationKey", "translations"]
|
|
7
|
-
}
|