@dxos/react-ui 0.8.4-main.72ec0f3 → 0.8.4-main.74a063c4e0
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/browser/chunk-KRSEIVRM.mjs +776 -0
- package/dist/lib/browser/chunk-KRSEIVRM.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +4157 -67
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +74 -63
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/chunk-ENYC4TYH.mjs +778 -0
- package/dist/lib/node-esm/chunk-ENYC4TYH.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +4157 -67
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +74 -63
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/types/src/components/Avatars/Avatar.d.ts +1 -1
- package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
- package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
- package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +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/Button/Button.d.ts +3 -3
- package/dist/types/src/components/Button/Button.d.ts.map +1 -1
- package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -1
- package/dist/types/src/components/Button/IconButton.d.ts +2 -1
- package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
- package/dist/types/src/components/Button/IconButton.stories.d.ts +3 -0
- package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
- package/dist/types/src/components/Button/Toggle.d.ts +2 -2
- package/dist/types/src/components/Button/Toggle.d.ts.map +1 -1
- package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -1
- package/dist/types/src/components/Button/ToggleGroup.d.ts +10 -10
- package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -1
- package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +4 -4
- package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
- package/dist/types/src/components/Card/Card.d.ts +150 -0
- package/dist/types/src/components/Card/Card.d.ts.map +1 -0
- package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
- package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
- package/dist/types/src/components/Card/index.d.ts +2 -0
- package/dist/types/src/components/Card/index.d.ts.map +1 -0
- package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
- package/dist/types/src/components/Clipboard/index.d.ts +10 -1
- package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
- package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
- package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
- package/dist/types/src/components/Dialog/AlertDialog.d.ts +41 -19
- package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
- package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
- package/dist/types/src/components/Dialog/Dialog.d.ts +56 -21
- package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
- package/dist/types/src/components/Dialog/Dialog.stories.d.ts +10 -10
- package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
- package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
- package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
- package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
- package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
- package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
- package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
- package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +8 -0
- package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
- package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
- package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
- package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
- package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
- package/dist/types/src/components/Focus/Focus.d.ts +44 -0
- package/dist/types/src/components/Focus/Focus.d.ts.map +1 -0
- package/dist/types/src/components/Focus/Focus.stories.d.ts +9 -0
- package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -0
- package/dist/types/src/components/Focus/index.d.ts +2 -0
- package/dist/types/src/components/Focus/index.d.ts.map +1 -0
- package/dist/types/src/components/Icon/Icon.d.ts +4 -1
- package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
- package/dist/types/src/components/Icon/Icon.stories.d.ts +11 -3
- package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
- package/dist/types/src/components/Image/Image.d.ts +14 -0
- package/dist/types/src/components/Image/Image.d.ts.map +1 -0
- package/dist/types/src/components/Image/Image.stories.d.ts +33 -0
- package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
- package/dist/types/src/components/Image/index.d.ts +2 -0
- package/dist/types/src/components/Image/index.d.ts.map +1 -0
- package/dist/types/src/components/Input/Input.d.ts +7 -7
- package/dist/types/src/components/Input/Input.d.ts.map +1 -1
- package/dist/types/src/components/Input/Input.stories.d.ts +8 -8
- package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
- package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
- package/dist/types/src/components/List/List.d.ts +10 -4
- package/dist/types/src/components/List/List.d.ts.map +1 -1
- package/dist/types/src/components/List/List.stories.d.ts +8 -2
- package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
- package/dist/types/src/components/List/Tree.d.ts.map +1 -1
- package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
- package/dist/types/src/components/List/Treegrid.d.ts +9 -9
- package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
- package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
- package/dist/types/src/components/Main/Main.d.ts +9 -10
- package/dist/types/src/components/Main/Main.d.ts.map +1 -1
- package/dist/types/src/components/Main/Main.stories.d.ts +0 -3
- package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
- package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
- package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
- package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
- package/dist/types/src/components/Menu/DropdownMenu.d.ts +113 -0
- package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
- package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +28 -0
- package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
- package/dist/types/src/components/Menu/index.d.ts.map +1 -0
- package/dist/types/src/components/Message/Message.d.ts +1 -1
- package/dist/types/src/components/Message/Message.d.ts.map +1 -1
- package/dist/types/src/components/Message/Message.stories.d.ts +5 -6
- package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
- package/dist/types/src/components/Popover/Popover.d.ts +33 -24
- package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
- package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
- package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +32 -24
- package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
- package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +65 -8
- package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
- package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +48 -13
- package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
- package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +10 -5
- package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/Select/Select.d.ts +9 -9
- package/dist/types/src/components/Select/Select.d.ts.map +1 -1
- package/dist/types/src/components/Select/Select.stories.d.ts +2 -2
- package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
- package/dist/types/src/components/Separator/Separator.d.ts +4 -4
- package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
- package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
- package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
- package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
- package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
- package/dist/types/src/components/Skeleton/index.d.ts +2 -0
- package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
- package/dist/types/src/components/Splitter/Splitter.d.ts +42 -0
- package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
- package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
- package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
- package/dist/types/src/components/Splitter/index.d.ts +2 -0
- package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
- package/dist/types/src/components/Status/Status.d.ts +3 -4
- package/dist/types/src/components/Status/Status.d.ts.map +1 -1
- package/dist/types/src/components/Status/Status.stories.d.ts +4 -2
- package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
- package/dist/types/src/components/Tag/Tag.d.ts +1 -1
- package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
- package/dist/types/src/components/Tag/Tag.stories.d.ts +0 -5
- package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
- package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +3 -3
- package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
- package/dist/types/src/components/{Menus/DropdownMenu.stories.d.ts → ThemeProvider/ThemeProvider.stories.d.ts} +2 -5
- package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
- package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
- package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
- package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
- package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
- package/dist/types/src/components/Toast/Toast.d.ts +19 -19
- package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
- package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.d.ts +43 -17
- package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
- package/dist/types/src/components/Tooltip/Tooltip.d.ts +9 -9
- package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +2 -2
- package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +10 -5
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/exemplars/generics.stories.d.ts +23 -0
- package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
- package/dist/types/src/exemplars/slot.stories.d.ts +15 -0
- package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
- package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
- package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
- package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
- package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
- package/dist/types/src/hooks/index.d.ts +1 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useDensityContext.d.ts +2 -2
- package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
- package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
- package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +2 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
- package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
- package/dist/types/src/primitives/Column/Column.d.ts +51 -0
- package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
- package/dist/types/src/primitives/Column/Column.stories.d.ts +25 -0
- package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
- package/dist/types/src/primitives/Column/index.d.ts +2 -0
- package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
- package/dist/types/src/primitives/Container/Container.d.ts +11 -0
- package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
- package/dist/types/src/primitives/Container/Container.stories.d.ts +6 -0
- package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
- package/dist/types/src/primitives/Container/index.d.ts +2 -0
- package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
- package/dist/types/src/primitives/Flex/Flex.d.ts +15 -0
- package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
- package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
- package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
- package/dist/types/src/primitives/Flex/index.d.ts +2 -0
- package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
- package/dist/types/src/primitives/Grid/Grid.d.ts +14 -0
- package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
- package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
- package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
- package/dist/types/src/primitives/Grid/index.d.ts +2 -0
- package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
- package/dist/types/src/primitives/Panel/Panel.d.ts +51 -0
- package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
- package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
- package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
- package/dist/types/src/primitives/Panel/index.d.ts +2 -0
- package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
- package/dist/types/src/primitives/index.d.ts +6 -0
- package/dist/types/src/primitives/index.d.ts.map +1 -0
- package/dist/types/src/testing/Loading.d.ts +9 -0
- package/dist/types/src/testing/Loading.d.ts.map +1 -0
- package/dist/types/src/testing/decorators/withLayout.d.ts +3 -3
- package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
- package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +1 -1
- package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
- package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
- package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +1 -0
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +11 -0
- package/dist/types/src/translations.d.ts.map +1 -0
- package/dist/types/src/util/index.d.ts +1 -2
- package/dist/types/src/util/index.d.ts.map +1 -1
- package/dist/types/src/util/usePx.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +42 -32
- package/src/components/Avatars/Avatar.stories.tsx +7 -9
- package/src/components/Avatars/Avatar.tsx +7 -15
- package/src/components/Avatars/AvatarGroup.stories.tsx +2 -3
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +3 -4
- package/src/components/Breadcrumb/Breadcrumb.tsx +11 -37
- package/src/components/Button/Button.stories.tsx +3 -4
- package/src/components/Button/Button.tsx +12 -26
- package/src/components/Button/IconButton.stories.tsx +8 -6
- package/src/components/Button/IconButton.tsx +9 -6
- package/src/components/Button/Toggle.stories.tsx +2 -3
- package/src/components/Button/Toggle.tsx +4 -4
- package/src/components/Button/ToggleGroup.stories.tsx +2 -3
- package/src/components/Button/ToggleGroup.tsx +12 -16
- package/src/components/Card/Card.stories.tsx +151 -0
- package/src/components/Card/Card.tsx +492 -0
- package/src/components/Card/index.ts +5 -0
- package/src/components/Clipboard/CopyButton.tsx +7 -8
- package/src/components/DensityProvider/DensityProvider.tsx +1 -1
- package/src/components/Dialog/AlertDialog.stories.tsx +16 -17
- package/src/components/Dialog/AlertDialog.tsx +123 -82
- package/src/components/Dialog/Dialog.stories.tsx +138 -28
- package/src/components/Dialog/Dialog.tsx +197 -71
- package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
- package/src/components/ErrorFallback/ErrorFallback.stories.tsx +45 -0
- package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
- package/src/components/ErrorFallback/ErrorStack.tsx +80 -0
- package/src/components/ErrorFallback/ThrowError.tsx +37 -0
- package/src/components/ErrorFallback/index.ts +9 -0
- package/src/components/Focus/AUDIT.md +43 -0
- package/src/components/Focus/Focus.stories.tsx +230 -0
- package/src/components/Focus/Focus.tsx +201 -0
- package/src/components/Focus/index.ts +5 -0
- package/src/components/Icon/Icon.stories.tsx +45 -15
- package/src/components/Icon/Icon.tsx +7 -3
- package/src/components/Image/Image.stories.tsx +86 -0
- package/src/components/Image/Image.tsx +223 -0
- package/src/components/Image/index.ts +5 -0
- package/src/components/Input/Input.stories.tsx +21 -41
- package/src/components/Input/Input.tsx +36 -72
- package/src/components/Link/Link.stories.tsx +2 -3
- package/src/components/Link/Link.tsx +2 -2
- package/src/components/List/List.stories.tsx +30 -34
- package/src/components/List/List.tsx +17 -21
- package/src/components/List/ListDropIndicator.tsx +7 -7
- package/src/components/List/Tree.stories.tsx +5 -6
- package/src/components/List/Tree.tsx +0 -1
- package/src/components/List/TreeDropIndicator.tsx +6 -6
- package/src/components/List/Treegrid.stories.tsx +29 -30
- package/src/components/List/Treegrid.tsx +23 -28
- package/src/components/Main/Main.stories.tsx +41 -24
- package/src/components/Main/Main.tsx +139 -83
- package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +2 -3
- package/src/components/{Menus → Menu}/ContextMenu.tsx +9 -33
- package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +2 -3
- package/src/components/{Menus → Menu}/DropdownMenu.tsx +119 -109
- package/src/components/Message/Message.stories.tsx +27 -13
- package/src/components/Message/Message.tsx +43 -34
- package/src/components/Popover/Popover.stories.tsx +7 -8
- package/src/components/Popover/Popover.tsx +97 -92
- package/src/components/ScrollArea/ScrollArea.stories.tsx +223 -34
- package/src/components/ScrollArea/ScrollArea.tsx +97 -79
- package/src/components/ScrollArea/index.ts +1 -1
- package/src/components/ScrollContainer/ScrollContainer.stories.tsx +47 -25
- package/src/components/ScrollContainer/ScrollContainer.tsx +225 -109
- package/src/components/Select/Select.stories.tsx +7 -8
- package/src/components/Select/Select.tsx +11 -27
- package/src/components/Separator/Separator.tsx +5 -8
- package/src/components/Skeleton/Skeleton.stories.tsx +51 -0
- package/src/components/Skeleton/Skeleton.tsx +26 -0
- package/src/components/Skeleton/index.ts +5 -0
- package/src/components/Splitter/Splitter.stories.tsx +83 -0
- package/src/components/Splitter/Splitter.tsx +127 -0
- package/src/components/Splitter/index.ts +5 -0
- package/src/components/Status/Status.stories.tsx +21 -18
- package/src/components/Status/Status.tsx +10 -7
- package/src/components/Tag/Tag.stories.tsx +6 -12
- package/src/components/Tag/Tag.tsx +3 -8
- package/src/components/ThemeProvider/ThemeProvider.stories.tsx +31 -0
- package/src/components/ThemeProvider/ThemeProvider.tsx +10 -10
- package/src/components/ThemeProvider/TranslationsProvider.tsx +1 -16
- package/src/components/ThemeProvider/index.ts +3 -3
- package/src/components/Toast/Toast.stories.tsx +2 -3
- package/src/components/Toast/Toast.tsx +22 -41
- package/src/components/Toolbar/Toolbar.stories.tsx +2 -3
- package/src/components/Toolbar/Toolbar.tsx +185 -23
- package/src/components/Tooltip/Tooltip.stories.tsx +20 -19
- package/src/components/Tooltip/Tooltip.tsx +40 -38
- package/src/components/index.ts +11 -6
- package/src/exemplars/generics.stories.tsx +41 -0
- package/src/exemplars/slot.stories.tsx +117 -0
- package/src/exemplars/tabster.stories.tsx +127 -0
- package/src/exemplars/virtualizer.stories.tsx +137 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useDensityContext.ts +3 -3
- package/src/hooks/useElevationContext.ts +1 -1
- package/src/index.ts +2 -1
- package/src/playground/Controls.stories.tsx +3 -10
- package/src/playground/Custom.stories.tsx +11 -21
- package/src/playground/Typography.stories.tsx +3 -3
- package/src/primitives/Column/AUDIT.md +354 -0
- package/src/primitives/Column/Column.stories.tsx +182 -0
- package/src/primitives/Column/Column.tsx +169 -0
- package/src/primitives/Column/index.ts +5 -0
- package/src/primitives/Container/Container.stories.tsx +29 -0
- package/src/primitives/Container/Container.tsx +19 -0
- package/src/primitives/Container/index.ts +5 -0
- package/src/primitives/Flex/Flex.stories.tsx +57 -0
- package/src/primitives/Flex/Flex.tsx +27 -0
- package/src/primitives/Flex/index.ts +5 -0
- package/src/primitives/Grid/Grid.stories.tsx +56 -0
- package/src/primitives/Grid/Grid.tsx +30 -0
- package/src/primitives/Grid/index.ts +5 -0
- package/src/primitives/Panel/Panel.stories.tsx +68 -0
- package/src/primitives/Panel/Panel.tsx +120 -0
- package/src/primitives/Panel/index.ts +5 -0
- package/src/primitives/index.ts +9 -0
- package/src/testing/Loading.tsx +27 -0
- package/src/testing/decorators/withLayout.tsx +39 -18
- package/src/testing/decorators/withLayoutVariants.tsx +20 -23
- package/src/testing/decorators/withTheme.tsx +26 -20
- package/src/testing/index.ts +2 -0
- package/src/translations.ts +19 -0
- package/src/util/index.ts +2 -2
- package/src/util/usePx.ts +1 -0
- package/dist/lib/browser/chunk-53MI2QCM.mjs +0 -4707
- package/dist/lib/browser/chunk-53MI2QCM.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ID67AFFF.mjs +0 -4709
- package/dist/lib/node-esm/chunk-ID67AFFF.mjs.map +0 -7
- package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
- package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
- package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
- package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
- package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
- package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
- package/dist/types/src/components/Menus/DropdownMenu.d.ts +0 -113
- package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
- package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
- package/dist/types/src/components/Menus/index.d.ts.map +0 -1
- package/dist/types/src/util/ThemedClassName.d.ts +0 -5
- package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
- package/dist/types/src/util/domino.d.ts +0 -18
- package/dist/types/src/util/domino.d.ts.map +0 -1
- package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
- package/src/components/AnchoredOverflow/index.ts +0 -5
- package/src/util/ThemedClassName.ts +0 -7
- package/src/util/domino.ts +0 -53
- /package/dist/types/src/components/{Menus → Menu}/ContextMenu.stories.d.ts +0 -0
- /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
- /package/src/components/{Menus → Menu}/index.ts +0 -0
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
// This is based upon `@radix-ui/react-tooltip` fetched 17 March 2025 at https://github.com/radix-ui/primitives at commit 6e75e11.
|
|
6
|
+
// TODO(burdon): Replace with https://ui.shadcn.com/docs/components/radix/tooltip
|
|
6
7
|
|
|
7
8
|
import { composeEventHandlers } from '@radix-ui/primitive';
|
|
8
9
|
import { useComposedRefs } from '@radix-ui/react-compose-refs';
|
|
@@ -21,9 +22,8 @@ import { useControllableState } from '@radix-ui/react-use-controllable-state';
|
|
|
21
22
|
import * as VisuallyHiddenPrimitive from '@radix-ui/react-visually-hidden';
|
|
22
23
|
import React, {
|
|
23
24
|
type ComponentPropsWithoutRef,
|
|
24
|
-
type
|
|
25
|
+
type ComponentRef,
|
|
25
26
|
type FC,
|
|
26
|
-
type MutableRefObject,
|
|
27
27
|
type ReactNode,
|
|
28
28
|
type RefObject,
|
|
29
29
|
type SyntheticEvent,
|
|
@@ -41,9 +41,9 @@ type TooltipScopedProps<P = {}> = P & { __scopeTooltip?: Scope };
|
|
|
41
41
|
const [createTooltipContext, createTooltipScope] = createContextScope('Tooltip', [createPopperScope]);
|
|
42
42
|
const usePopperScope = createPopperScope();
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
//
|
|
45
|
+
// Tooltip
|
|
46
|
+
//
|
|
47
47
|
|
|
48
48
|
const DEFAULT_DELAY_DURATION = 700;
|
|
49
49
|
const TOOLTIP_OPEN = 'tooltip.open';
|
|
@@ -60,13 +60,13 @@ type TooltipContextValue = {
|
|
|
60
60
|
onOpen(): void;
|
|
61
61
|
onClose(): void;
|
|
62
62
|
onPointerInTransitChange(inTransit: boolean): void;
|
|
63
|
-
isPointerInTransitRef:
|
|
63
|
+
isPointerInTransitRef: RefObject<boolean>;
|
|
64
64
|
disableHoverableContent: boolean;
|
|
65
65
|
};
|
|
66
66
|
|
|
67
67
|
const [TooltipContextProvider, useTooltipContext] = createTooltipContext<TooltipContextValue>(TOOLTIP_NAME);
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
type TooltipProviderProps = {
|
|
70
70
|
children?: ReactNode;
|
|
71
71
|
open?: boolean;
|
|
72
72
|
defaultOpen?: boolean;
|
|
@@ -87,7 +87,7 @@ interface TooltipProviderProps {
|
|
|
87
87
|
* @defaultValue 300
|
|
88
88
|
*/
|
|
89
89
|
skipDelayDuration?: number;
|
|
90
|
-
}
|
|
90
|
+
};
|
|
91
91
|
|
|
92
92
|
const TooltipProvider: FC<TooltipProviderProps> = (props: TooltipScopedProps<TooltipProviderProps>) => {
|
|
93
93
|
const {
|
|
@@ -215,9 +215,9 @@ const TooltipProvider: FC<TooltipProviderProps> = (props: TooltipScopedProps<Too
|
|
|
215
215
|
isPointerInTransitRef.current = inTransit;
|
|
216
216
|
}, [])}
|
|
217
217
|
>
|
|
218
|
-
<TooltipContent side={side} className={tx('tooltip.content',
|
|
218
|
+
<TooltipContent side={side} className={tx('tooltip.content', { elevation })}>
|
|
219
219
|
{content}
|
|
220
|
-
<TooltipArrow className={tx('tooltip.arrow'
|
|
220
|
+
<TooltipArrow className={tx('tooltip.arrow')} />
|
|
221
221
|
</TooltipContent>
|
|
222
222
|
<TooltipVirtualTrigger virtualRef={triggerRef as RefObject<HTMLButtonElement>} />
|
|
223
223
|
{children}
|
|
@@ -228,9 +228,9 @@ const TooltipProvider: FC<TooltipProviderProps> = (props: TooltipScopedProps<Too
|
|
|
228
228
|
|
|
229
229
|
TooltipProvider.displayName = TOOLTIP_NAME;
|
|
230
230
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
231
|
+
//
|
|
232
|
+
// TooltipVirtualTrigger
|
|
233
|
+
//
|
|
234
234
|
|
|
235
235
|
const TooltipVirtualTrigger = ({
|
|
236
236
|
virtualRef,
|
|
@@ -240,13 +240,13 @@ const TooltipVirtualTrigger = ({
|
|
|
240
240
|
return <PopperPrimitive.Anchor asChild {...popperScope} virtualRef={virtualRef} />;
|
|
241
241
|
};
|
|
242
242
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
243
|
+
//
|
|
244
|
+
// TooltipTrigger
|
|
245
|
+
//
|
|
246
246
|
|
|
247
247
|
const TRIGGER_NAME = 'TooltipTrigger';
|
|
248
248
|
|
|
249
|
-
type TooltipTriggerElement =
|
|
249
|
+
type TooltipTriggerElement = ComponentRef<typeof Primitive.button>;
|
|
250
250
|
type PrimitiveButtonProps = ComponentPropsWithoutRef<typeof Primitive.button>;
|
|
251
251
|
type TooltipTriggerProps = PrimitiveButtonProps &
|
|
252
252
|
Pick<TooltipProps, 'delayDuration'> & {
|
|
@@ -322,9 +322,9 @@ const TooltipTrigger = forwardRef<TooltipTriggerElement, TooltipTriggerProps>(
|
|
|
322
322
|
|
|
323
323
|
TooltipTrigger.displayName = TRIGGER_NAME;
|
|
324
324
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
325
|
+
//
|
|
326
|
+
// TooltipPortal
|
|
327
|
+
//
|
|
328
328
|
|
|
329
329
|
const PORTAL_NAME = 'TooltipPortal';
|
|
330
330
|
|
|
@@ -334,7 +334,7 @@ const [PortalProvider, usePortalContext] = createTooltipContext<PortalContextVal
|
|
|
334
334
|
});
|
|
335
335
|
|
|
336
336
|
type PortalProps = ComponentPropsWithoutRef<typeof PortalPrimitive>;
|
|
337
|
-
|
|
337
|
+
type TooltipPortalProps = {
|
|
338
338
|
children?: ReactNode;
|
|
339
339
|
/**
|
|
340
340
|
* Specify a container element to portal the content into.
|
|
@@ -345,7 +345,7 @@ interface TooltipPortalProps {
|
|
|
345
345
|
* controlling animation with React animation libraries.
|
|
346
346
|
*/
|
|
347
347
|
forceMount?: true;
|
|
348
|
-
}
|
|
348
|
+
};
|
|
349
349
|
|
|
350
350
|
const TooltipPortal: FC<TooltipPortalProps> = (props: TooltipScopedProps<TooltipPortalProps>) => {
|
|
351
351
|
const { __scopeTooltip, forceMount, children, container } = props;
|
|
@@ -363,20 +363,20 @@ const TooltipPortal: FC<TooltipPortalProps> = (props: TooltipScopedProps<Tooltip
|
|
|
363
363
|
|
|
364
364
|
TooltipPortal.displayName = PORTAL_NAME;
|
|
365
365
|
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
366
|
+
//
|
|
367
|
+
// TooltipContent
|
|
368
|
+
//
|
|
369
369
|
|
|
370
370
|
const CONTENT_NAME = 'TooltipContent';
|
|
371
371
|
|
|
372
372
|
type TooltipContentElement = TooltipContentImplElement;
|
|
373
|
-
|
|
373
|
+
type TooltipContentProps = TooltipContentImplProps & {
|
|
374
374
|
/**
|
|
375
375
|
* Used to force mounting when more control is needed. Useful when
|
|
376
376
|
* controlling animation with React animation libraries.
|
|
377
377
|
*/
|
|
378
378
|
forceMount?: true;
|
|
379
|
-
}
|
|
379
|
+
};
|
|
380
380
|
|
|
381
381
|
const TooltipContent = forwardRef<TooltipContentElement, TooltipContentProps>(
|
|
382
382
|
(props: TooltipScopedProps<TooltipContentProps>, forwardedRef) => {
|
|
@@ -400,7 +400,7 @@ type Point = { x: number; y: number };
|
|
|
400
400
|
type Polygon = Point[];
|
|
401
401
|
|
|
402
402
|
type TooltipContentHoverableElement = TooltipContentImplElement;
|
|
403
|
-
|
|
403
|
+
type TooltipContentHoverableProps = TooltipContentImplProps;
|
|
404
404
|
|
|
405
405
|
const TooltipContentHoverable = forwardRef<TooltipContentHoverableElement, TooltipContentHoverableProps>(
|
|
406
406
|
(props: TooltipScopedProps<TooltipContentHoverableProps>, forwardedRef) => {
|
|
@@ -479,10 +479,10 @@ const [VisuallyHiddenContentContextProvider, useVisuallyHiddenContentContext] =
|
|
|
479
479
|
isInside: false,
|
|
480
480
|
});
|
|
481
481
|
|
|
482
|
-
type TooltipContentImplElement =
|
|
482
|
+
type TooltipContentImplElement = ComponentRef<typeof PopperPrimitive.Content>;
|
|
483
483
|
type DismissableLayerProps = ComponentPropsWithoutRef<typeof DismissableLayer>;
|
|
484
484
|
type PopperContentProps = ComponentPropsWithoutRef<typeof PopperPrimitive.Content>;
|
|
485
|
-
|
|
485
|
+
type TooltipContentImplProps = Omit<PopperContentProps, 'onPlaced'> & {
|
|
486
486
|
/**
|
|
487
487
|
* A more descriptive label for accessibility purpose
|
|
488
488
|
*/
|
|
@@ -498,7 +498,7 @@ interface TooltipContentImplProps extends Omit<PopperContentProps, 'onPlaced'> {
|
|
|
498
498
|
* Can be prevented.
|
|
499
499
|
*/
|
|
500
500
|
onPointerDownOutside?: DismissableLayerProps['onPointerDownOutside'];
|
|
501
|
-
}
|
|
501
|
+
};
|
|
502
502
|
|
|
503
503
|
const TooltipContentImpl = forwardRef<TooltipContentImplElement, TooltipContentImplProps>(
|
|
504
504
|
(props: TooltipScopedProps<TooltipContentImplProps>, forwardedRef) => {
|
|
@@ -574,15 +574,15 @@ const TooltipContentImpl = forwardRef<TooltipContentImplElement, TooltipContentI
|
|
|
574
574
|
|
|
575
575
|
TooltipContent.displayName = CONTENT_NAME;
|
|
576
576
|
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
577
|
+
//
|
|
578
|
+
// TooltipArrow
|
|
579
|
+
//
|
|
580
580
|
|
|
581
581
|
const ARROW_NAME = 'TooltipArrow';
|
|
582
582
|
|
|
583
|
-
type TooltipArrowElement =
|
|
583
|
+
type TooltipArrowElement = ComponentRef<typeof PopperPrimitive.Arrow>;
|
|
584
584
|
type PopperArrowProps = ComponentPropsWithoutRef<typeof PopperPrimitive.Arrow>;
|
|
585
|
-
|
|
585
|
+
type TooltipArrowProps = PopperArrowProps;
|
|
586
586
|
|
|
587
587
|
const TooltipArrow = forwardRef<TooltipArrowElement, TooltipArrowProps>(
|
|
588
588
|
(props: TooltipScopedProps<TooltipArrowProps>, forwardedRef) => {
|
|
@@ -599,8 +599,6 @@ const TooltipArrow = forwardRef<TooltipArrowElement, TooltipArrowProps>(
|
|
|
599
599
|
|
|
600
600
|
TooltipArrow.displayName = ARROW_NAME;
|
|
601
601
|
|
|
602
|
-
/* ----------------------------------------------------------------------------------------------- */
|
|
603
|
-
|
|
604
602
|
type TooltipSide = NonNullable<TooltipContentProps['side']>;
|
|
605
603
|
|
|
606
604
|
const getExitSideFromRect = (point: Point, rect: DOMRect): TooltipSide => {
|
|
@@ -755,6 +753,10 @@ const getHullPresorted = <P extends Point>(points: Readonly<Array<P>>): Array<P>
|
|
|
755
753
|
}
|
|
756
754
|
};
|
|
757
755
|
|
|
756
|
+
//
|
|
757
|
+
// Tooltip
|
|
758
|
+
//
|
|
759
|
+
|
|
758
760
|
export const Tooltip = {
|
|
759
761
|
Provider: TooltipProvider,
|
|
760
762
|
Trigger: TooltipTrigger,
|
package/src/components/index.ts
CHANGED
|
@@ -2,18 +2,25 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
export * from './
|
|
5
|
+
export * from './DensityProvider';
|
|
6
|
+
export * from './ElevationProvider';
|
|
7
|
+
export * from './ThemeProvider';
|
|
8
|
+
|
|
6
9
|
export * from './Avatars';
|
|
7
10
|
export * from './Breadcrumb';
|
|
8
11
|
export * from './Button';
|
|
12
|
+
export * from './Card';
|
|
9
13
|
export * from './Clipboard';
|
|
10
14
|
export * from './Dialog';
|
|
15
|
+
export * from './ErrorFallback';
|
|
16
|
+
export * from './Focus';
|
|
11
17
|
export * from './Icon';
|
|
18
|
+
export * from './Image';
|
|
12
19
|
export * from './Input';
|
|
13
20
|
export * from './Link';
|
|
14
21
|
export * from './List';
|
|
15
22
|
export * from './Main';
|
|
16
|
-
export * from './
|
|
23
|
+
export * from './Menu';
|
|
17
24
|
export * from './Message';
|
|
18
25
|
export * from './Popover';
|
|
19
26
|
export * from './Status';
|
|
@@ -21,11 +28,9 @@ export * from './ScrollArea';
|
|
|
21
28
|
export * from './ScrollContainer';
|
|
22
29
|
export * from './Select';
|
|
23
30
|
export * from './Separator';
|
|
31
|
+
export * from './Skeleton';
|
|
32
|
+
export * from './Splitter';
|
|
24
33
|
export * from './Tag';
|
|
25
34
|
export * from './Toast';
|
|
26
35
|
export * from './Toolbar';
|
|
27
36
|
export * from './Tooltip';
|
|
28
|
-
|
|
29
|
-
export * from './DensityProvider';
|
|
30
|
-
export * from './ElevationProvider';
|
|
31
|
-
export * from './ThemeProvider';
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2023 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
6
|
+
import React from 'react';
|
|
7
|
+
|
|
8
|
+
import { slottable } from '@dxos/ui-theme';
|
|
9
|
+
|
|
10
|
+
import { withTheme } from '../testing';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Generic component pattern using the slottable factory.
|
|
14
|
+
*/
|
|
15
|
+
const Component = slottable<HTMLDivElement>(({ children, ...props }, forwardedRef) => {
|
|
16
|
+
return (
|
|
17
|
+
<div {...props} ref={forwardedRef}>
|
|
18
|
+
{children}
|
|
19
|
+
</div>
|
|
20
|
+
);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const meta = {
|
|
24
|
+
title: 'ui/react-ui-core/exemplars/generics',
|
|
25
|
+
component: Component,
|
|
26
|
+
render: (props) => <Component {...props} />,
|
|
27
|
+
decorators: [withTheme()],
|
|
28
|
+
parameters: {
|
|
29
|
+
layout: 'centered',
|
|
30
|
+
},
|
|
31
|
+
} satisfies Meta;
|
|
32
|
+
|
|
33
|
+
export default meta;
|
|
34
|
+
|
|
35
|
+
type Story = StoryObj<typeof meta>;
|
|
36
|
+
|
|
37
|
+
export const Default: Story = {
|
|
38
|
+
args: {
|
|
39
|
+
children: 'Hello',
|
|
40
|
+
},
|
|
41
|
+
};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2023 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { Primitive } from '@radix-ui/react-primitive';
|
|
6
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
7
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
8
|
+
import React, { PropsWithChildren } from 'react';
|
|
9
|
+
|
|
10
|
+
import { composable, composableProps, mx, slottable } from '@dxos/ui-theme';
|
|
11
|
+
|
|
12
|
+
import { withTheme } from '../testing';
|
|
13
|
+
import { ThemedClassName } from '../util';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Radix-style composition.
|
|
17
|
+
* All Radix primitive parts that render a DOM element accept an asChild prop.
|
|
18
|
+
* When asChild is set to true, Radix will not render a default DOM element,
|
|
19
|
+
* instead cloning the part's child and passing it the props and behavior required to make it functional.
|
|
20
|
+
* https://www.radix-ui.com/primitives/docs/guides/composition
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
const Outer = slottable<HTMLDivElement, { priority?: number }>(
|
|
24
|
+
({ children, asChild, priority, ...props }, forwardedRef) => {
|
|
25
|
+
const Comp = asChild ? Slot : Primitive.div;
|
|
26
|
+
return (
|
|
27
|
+
<Comp
|
|
28
|
+
{...composableProps<HTMLDivElement>(props, { classNames: 'p-2 border border-red-500 rounded' })}
|
|
29
|
+
ref={forwardedRef}
|
|
30
|
+
>
|
|
31
|
+
{children}
|
|
32
|
+
</Comp>
|
|
33
|
+
);
|
|
34
|
+
},
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
const Middle = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
|
|
38
|
+
const Comp = asChild ? Slot : Primitive.div;
|
|
39
|
+
return (
|
|
40
|
+
<Comp
|
|
41
|
+
{...composableProps<HTMLDivElement>(props, { classNames: 'p-2 border border-red-500 rounded' })}
|
|
42
|
+
ref={forwardedRef}
|
|
43
|
+
>
|
|
44
|
+
{children}
|
|
45
|
+
</Comp>
|
|
46
|
+
);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const Leaf = composable<HTMLButtonElement>(({ children, ...props }, forwardedRef) => {
|
|
50
|
+
return (
|
|
51
|
+
<button
|
|
52
|
+
{...composableProps<HTMLButtonElement>(props, { classNames: 'p-2 border border-red-500 rounded' })}
|
|
53
|
+
ref={forwardedRef}
|
|
54
|
+
>
|
|
55
|
+
{children}
|
|
56
|
+
</button>
|
|
57
|
+
);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
/** This isn't a valid child for a `slottable` component. */
|
|
61
|
+
const Simple = ({ children, classNames }: ThemedClassName<PropsWithChildren>) => (
|
|
62
|
+
<div role='none' className={mx(classNames)}>
|
|
63
|
+
{children}
|
|
64
|
+
</div>
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
const meta = {
|
|
68
|
+
title: 'ui/react-ui-core/exemplars/slot',
|
|
69
|
+
decorators: [withTheme()],
|
|
70
|
+
parameters: {
|
|
71
|
+
layout: 'centered',
|
|
72
|
+
},
|
|
73
|
+
} satisfies Meta;
|
|
74
|
+
|
|
75
|
+
export default meta;
|
|
76
|
+
|
|
77
|
+
type Story = StoryObj<typeof meta>;
|
|
78
|
+
|
|
79
|
+
export const Single: Story = {
|
|
80
|
+
render: () => (
|
|
81
|
+
<Outer asChild role='article' classNames='border-green-500' priority={1}>
|
|
82
|
+
<Leaf>Single asChild (non-compliant — see console)</Leaf>
|
|
83
|
+
</Outer>
|
|
84
|
+
),
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const Nested: Story = {
|
|
88
|
+
render: () => (
|
|
89
|
+
<Outer asChild role='article' classNames='border-blue-500'>
|
|
90
|
+
<Middle asChild>
|
|
91
|
+
<Leaf>Nested asChild</Leaf>
|
|
92
|
+
</Middle>
|
|
93
|
+
</Outer>
|
|
94
|
+
),
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
export const Inner: Story = {
|
|
98
|
+
render: () => (
|
|
99
|
+
<Outer asChild role='article' classNames='border-orange-500'>
|
|
100
|
+
<Middle asChild>
|
|
101
|
+
<Leaf>
|
|
102
|
+
<div role='none'>Leaf</div>
|
|
103
|
+
</Leaf>
|
|
104
|
+
</Middle>
|
|
105
|
+
</Outer>
|
|
106
|
+
),
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
export const Error: Story = {
|
|
110
|
+
render: () => (
|
|
111
|
+
<Outer asChild role='none' classNames='p-2 border border-green-500 rounded'>
|
|
112
|
+
<Middle asChild>
|
|
113
|
+
<Simple>Simple</Simple>
|
|
114
|
+
</Middle>
|
|
115
|
+
</Outer>
|
|
116
|
+
),
|
|
117
|
+
};
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
useArrowNavigationGroup,
|
|
7
|
+
useFocusFinders,
|
|
8
|
+
useFocusableGroup,
|
|
9
|
+
useMergedTabsterAttributes_unstable,
|
|
10
|
+
} from '@fluentui/react-tabster';
|
|
11
|
+
import { type Decorator, type Meta, type StoryObj } from '@storybook/react-vite';
|
|
12
|
+
import React, { forwardRef, useEffect, useMemo, useRef } from 'react';
|
|
13
|
+
import { createTabster, disposeTabster } from 'tabster';
|
|
14
|
+
|
|
15
|
+
import { Input, ScrollArea } from '@dxos/react-ui';
|
|
16
|
+
import { withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
17
|
+
import { mx } from '@dxos/ui-theme';
|
|
18
|
+
|
|
19
|
+
// TODO(burdon): Factor out styles (incl. tabster debugging).
|
|
20
|
+
// TODO(burdon): Implement horizontal movement between columns when column is selected.
|
|
21
|
+
// TODO(burdon): Prevent tab out of app.
|
|
22
|
+
|
|
23
|
+
const border =
|
|
24
|
+
'rounded-xs outline-hidden border border-subdued-separator focus:border-primary-500 focus-within:border-rose-500';
|
|
25
|
+
|
|
26
|
+
const Board = forwardRef<HTMLDivElement, { columns: string[][] }>(({ columns }, ref) => {
|
|
27
|
+
const arrowNavigationAttrs = useArrowNavigationGroup({ axis: 'horizontal', memorizeCurrent: true, tabbable: true });
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
<div ref={ref} tabIndex={0} {...arrowNavigationAttrs} className='flex h-full w-full overflow-hidden'>
|
|
31
|
+
<div className={mx('flex h-full overflow-x-auto p-4 gap-4')}>
|
|
32
|
+
{columns.map((column) => (
|
|
33
|
+
<Column key={column[0]} items={column} />
|
|
34
|
+
))}
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const Column = forwardRef<HTMLDivElement, { items: string[] }>(({ items }, ref) => {
|
|
41
|
+
const focusableGroupAttrs = useFocusableGroup({ tabBehavior: 'limited' });
|
|
42
|
+
const arrowNavigationAttrs = useArrowNavigationGroup({ axis: 'vertical', memorizeCurrent: true });
|
|
43
|
+
const tabsterAttrs = useMergedTabsterAttributes_unstable(focusableGroupAttrs, arrowNavigationAttrs);
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<ScrollArea.Root orientation='vertical' classNames={mx('w-[25rem]', border)}>
|
|
47
|
+
<ScrollArea.Viewport {...tabsterAttrs} classNames='p-4 gap-4' ref={ref}>
|
|
48
|
+
{items.map((item) => (
|
|
49
|
+
<Item key={item} value={item} />
|
|
50
|
+
))}
|
|
51
|
+
</ScrollArea.Viewport>
|
|
52
|
+
</ScrollArea.Root>
|
|
53
|
+
);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
const Item = forwardRef<HTMLDivElement, { value: string }>(({ value }, ref) => {
|
|
57
|
+
const focusableGroupAttrs = useFocusableGroup();
|
|
58
|
+
|
|
59
|
+
return (
|
|
60
|
+
<div
|
|
61
|
+
ref={ref}
|
|
62
|
+
tabIndex={0}
|
|
63
|
+
{...focusableGroupAttrs}
|
|
64
|
+
className={mx('flex shrink-0 w-full gap-4 p-4 items-center', border)}
|
|
65
|
+
>
|
|
66
|
+
<Input.Root>
|
|
67
|
+
<Input.Checkbox />
|
|
68
|
+
</Input.Root>
|
|
69
|
+
<Input.Root>
|
|
70
|
+
<Input.TextInput defaultValue={value} />
|
|
71
|
+
</Input.Root>
|
|
72
|
+
</div>
|
|
73
|
+
);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
const DefaultStory = () => {
|
|
77
|
+
const columns = useMemo(() => {
|
|
78
|
+
return [['A1', 'A2', 'A3'], ['B1'], ['C1', 'C2', 'C3', 'C4', 'C5', 'C6'], ['D1', 'D2']];
|
|
79
|
+
}, []);
|
|
80
|
+
|
|
81
|
+
const ref = useRef<HTMLDivElement>(null);
|
|
82
|
+
const { findFirstFocusable } = useFocusFinders();
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
if (ref.current) {
|
|
85
|
+
findFirstFocusable(ref.current)?.focus();
|
|
86
|
+
}
|
|
87
|
+
}, []);
|
|
88
|
+
|
|
89
|
+
return <Board columns={columns} ref={ref} />;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// TODO(burdon): This doesn't seem to be necessary or recongized; memoization doesn't work.
|
|
93
|
+
const withTabster: Decorator = (Story) => {
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
const tabster = createTabster(window, {
|
|
96
|
+
autoRoot: {},
|
|
97
|
+
// TODO(burdon): Not called.
|
|
98
|
+
// checkUncontrolledCompletely: (el) => {
|
|
99
|
+
// console.log(el);
|
|
100
|
+
// return true;
|
|
101
|
+
// },
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
return () => {
|
|
105
|
+
disposeTabster(tabster);
|
|
106
|
+
};
|
|
107
|
+
}, []);
|
|
108
|
+
|
|
109
|
+
return <Story />;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
const meta: Meta<typeof DefaultStory> = {
|
|
113
|
+
title: 'ui/react-ui-core/exemplars/tabster',
|
|
114
|
+
component: DefaultStory,
|
|
115
|
+
decorators: [withTheme(), withLayout({ layout: 'fullscreen' }), withTabster],
|
|
116
|
+
parameters: {
|
|
117
|
+
layout: 'fullscreen',
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
export default meta;
|
|
122
|
+
|
|
123
|
+
type Story = StoryObj<typeof meta>;
|
|
124
|
+
|
|
125
|
+
export const Default: Story = {
|
|
126
|
+
args: {},
|
|
127
|
+
};
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2023 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Meta } from '@storybook/react-vite';
|
|
6
|
+
import { useVirtualizer } from '@tanstack/react-virtual';
|
|
7
|
+
import React, { useEffect, useMemo, useRef, useState } from 'react';
|
|
8
|
+
|
|
9
|
+
import { random } from '@dxos/random';
|
|
10
|
+
import { Panel, ScrollArea, Toolbar } from '@dxos/react-ui';
|
|
11
|
+
import { withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
12
|
+
|
|
13
|
+
random.seed(999);
|
|
14
|
+
|
|
15
|
+
type TestItem = {
|
|
16
|
+
name: string;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const meta: Meta = {
|
|
20
|
+
title: 'ui/react-ui-core/exemplars/virtualizer',
|
|
21
|
+
decorators: [withLayout({ layout: 'column' }), withTheme()],
|
|
22
|
+
parameters: {
|
|
23
|
+
layout: 'fullscreen',
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default meta;
|
|
28
|
+
|
|
29
|
+
const NUM_ITEMS = 500;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* https://tanstack.com/virtual/latest/docs/introduction
|
|
33
|
+
*/
|
|
34
|
+
export const Default = {
|
|
35
|
+
render: () => {
|
|
36
|
+
const [index, setIndex] = useState(0);
|
|
37
|
+
const items = useMemo<TestItem[]>(
|
|
38
|
+
() =>
|
|
39
|
+
Array.from({ length: NUM_ITEMS }, () => ({
|
|
40
|
+
name: random.lorem.paragraph(),
|
|
41
|
+
})),
|
|
42
|
+
[],
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
const parentRef = useRef(null);
|
|
46
|
+
const [viewport, setViewport] = useState<HTMLElement | null>(null);
|
|
47
|
+
const virtualizer = useVirtualizer({
|
|
48
|
+
getScrollElement: () => viewport,
|
|
49
|
+
estimateSize: () => 40,
|
|
50
|
+
count: items.length,
|
|
51
|
+
gap: 8,
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
virtualizer.scrollToIndex(index, { align: 'start' });
|
|
56
|
+
}, [virtualizer, index]);
|
|
57
|
+
|
|
58
|
+
const virtualItems = virtualizer.getVirtualItems();
|
|
59
|
+
|
|
60
|
+
return (
|
|
61
|
+
<Panel.Root>
|
|
62
|
+
<Panel.Toolbar asChild>
|
|
63
|
+
<ScrollToolbar items={items} index={index} setIndex={setIndex} />
|
|
64
|
+
</Panel.Toolbar>
|
|
65
|
+
<Panel.Content asChild>
|
|
66
|
+
<ScrollArea.Root orientation='vertical' centered>
|
|
67
|
+
<ScrollArea.Viewport classNames='p-2' ref={setViewport}>
|
|
68
|
+
<div
|
|
69
|
+
role='none'
|
|
70
|
+
style={{
|
|
71
|
+
position: 'relative',
|
|
72
|
+
height: virtualizer.getTotalSize(),
|
|
73
|
+
width: '100%',
|
|
74
|
+
}}
|
|
75
|
+
ref={parentRef}
|
|
76
|
+
>
|
|
77
|
+
{virtualItems.map((virtualItem) => (
|
|
78
|
+
<div
|
|
79
|
+
key={virtualItem.key}
|
|
80
|
+
role='list'
|
|
81
|
+
className='grid grid-cols-[3rem_1fr] overflow-hidden border border-separator rounded-xs'
|
|
82
|
+
style={{
|
|
83
|
+
position: 'absolute',
|
|
84
|
+
top: 0,
|
|
85
|
+
left: 0,
|
|
86
|
+
width: '100%',
|
|
87
|
+
transform: `translateY(${virtualItem.start}px)`,
|
|
88
|
+
}}
|
|
89
|
+
data-index={virtualItem.index}
|
|
90
|
+
ref={virtualizer.measureElement}
|
|
91
|
+
>
|
|
92
|
+
<div className='p-1'>{virtualItem.index + 1}</div>
|
|
93
|
+
<div className='p-1'>{items[virtualItem.index].name}</div>
|
|
94
|
+
</div>
|
|
95
|
+
))}
|
|
96
|
+
</div>
|
|
97
|
+
</ScrollArea.Viewport>
|
|
98
|
+
</ScrollArea.Root>
|
|
99
|
+
</Panel.Content>
|
|
100
|
+
</Panel.Root>
|
|
101
|
+
);
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const ScrollToolbar = ({
|
|
106
|
+
items,
|
|
107
|
+
index,
|
|
108
|
+
setIndex,
|
|
109
|
+
}: {
|
|
110
|
+
items: any[];
|
|
111
|
+
index: number;
|
|
112
|
+
setIndex: (index: number) => void;
|
|
113
|
+
}) => {
|
|
114
|
+
return (
|
|
115
|
+
<Toolbar.Root classNames='grid grid-cols-3'>
|
|
116
|
+
<div />
|
|
117
|
+
<div className='flex justify-center gap-1'>
|
|
118
|
+
<Toolbar.IconButton icon='ph--arrow-line-left--regular' iconOnly label='start' onClick={() => setIndex(0)} />
|
|
119
|
+
<Toolbar.IconButton
|
|
120
|
+
icon='ph--arrows-out-line-horizontal--regular'
|
|
121
|
+
iconOnly
|
|
122
|
+
label='random'
|
|
123
|
+
onClick={() => setIndex(Math.floor(Math.random() * items.length))}
|
|
124
|
+
/>
|
|
125
|
+
<Toolbar.IconButton
|
|
126
|
+
icon='ph--arrow-line-right--regular'
|
|
127
|
+
iconOnly
|
|
128
|
+
label='end'
|
|
129
|
+
onClick={() => setIndex(items.length - 1)}
|
|
130
|
+
/>
|
|
131
|
+
</div>
|
|
132
|
+
<div className='p-1 text-right'>
|
|
133
|
+
{index + 1}/{items.length}
|
|
134
|
+
</div>
|
|
135
|
+
</Toolbar.Root>
|
|
136
|
+
);
|
|
137
|
+
};
|