@dxos/react-ui 0.8.4-main.b97322e → 0.8.4-main.bd9b33e6c8
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-LUPEFGHJ.mjs +776 -0
- package/dist/lib/browser/chunk-LUPEFGHJ.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +4101 -61
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +99 -60
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/chunk-EQOBFLZC.mjs +778 -0
- package/dist/lib/node-esm/chunk-EQOBFLZC.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +4101 -61
- 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 +99 -60
- 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 +5 -31
- package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
- package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts +5 -11
- package/dist/types/src/components/Avatars/AvatarGroup.stories.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 +8 -20
- package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
- package/dist/types/src/components/{Buttons → Button}/Button.d.ts +4 -4
- package/dist/types/src/components/Button/Button.d.ts.map +1 -0
- package/dist/types/src/components/Button/Button.stories.d.ts +17 -0
- package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -0
- package/dist/types/src/components/{Buttons → Button}/IconButton.d.ts +4 -4
- package/dist/types/src/components/Button/IconButton.d.ts.map +1 -0
- package/dist/types/src/components/Button/IconButton.stories.d.ts +13 -0
- package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -0
- package/dist/types/src/components/{Buttons → Button}/Toggle.d.ts +2 -2
- package/dist/types/src/components/Button/Toggle.d.ts.map +1 -0
- package/dist/types/src/components/Button/Toggle.stories.d.ts +16 -0
- package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -0
- package/dist/types/src/components/Button/ToggleGroup.d.ts +27 -0
- package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -0
- package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +27 -0
- package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -0
- package/dist/types/src/components/Button/index.d.ts.map +1 -0
- package/dist/types/src/components/Card/Card.d.ts +145 -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/ClipboardProvider.d.ts.map +1 -1
- package/dist/types/src/components/Clipboard/CopyButton.d.ts +1 -1
- 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 +53 -0
- package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -0
- package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts +11 -0
- package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -0
- package/dist/types/src/components/Dialog/Dialog.d.ts +66 -0
- package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -0
- package/dist/types/src/components/Dialog/Dialog.stories.d.ts +25 -0
- package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -0
- package/dist/types/src/components/Dialog/index.d.ts.map +1 -0
- 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 +5 -2
- package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
- package/dist/types/src/components/Icon/Icon.stories.d.ts +25 -0
- package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -0
- 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 +8 -10
- package/dist/types/src/components/Input/Input.d.ts.map +1 -1
- package/dist/types/src/components/Input/Input.stories.d.ts +17 -18
- package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
- package/dist/types/src/components/Link/Link.stories.d.ts +8 -8
- package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
- package/dist/types/src/components/{Lists → List}/List.d.ts +12 -6
- package/dist/types/src/components/List/List.d.ts.map +1 -0
- package/dist/types/src/components/List/List.stories.d.ts +20 -0
- package/dist/types/src/components/List/List.stories.d.ts.map +1 -0
- package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -0
- package/dist/types/src/components/{Lists → List}/Tree.d.ts +1 -1
- package/dist/types/src/components/List/Tree.d.ts.map +1 -0
- package/dist/types/src/components/List/Tree.stories.d.ts +15 -0
- package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -0
- package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -0
- package/dist/types/src/components/{Lists → List}/Treegrid.d.ts +1 -1
- package/dist/types/src/components/{Lists → List}/Treegrid.d.ts.map +1 -1
- package/dist/types/src/components/List/Treegrid.stories.d.ts +12 -0
- package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -0
- package/dist/types/src/components/List/index.d.ts.map +1 -0
- package/dist/types/src/components/Main/Main.d.ts +18 -28
- package/dist/types/src/components/Main/Main.d.ts.map +1 -1
- package/dist/types/src/components/Main/Main.stories.d.ts +6 -10
- 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 +12 -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 +12 -22
- package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
- package/dist/types/src/components/Popover/Popover.d.ts +34 -25
- package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
- package/dist/types/src/components/Popover/Popover.stories.d.ts +6 -34
- 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 +55 -24
- package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
- package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +55 -0
- package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -0
- package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +23 -0
- package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -0
- package/dist/types/src/components/ScrollContainer/index.d.ts +2 -0
- package/dist/types/src/components/ScrollContainer/index.d.ts.map +1 -0
- package/dist/types/src/components/Select/Select.d.ts +10 -10
- package/dist/types/src/components/Select/Select.d.ts.map +1 -1
- package/dist/types/src/components/Select/Select.stories.d.ts +6 -11
- 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 +37 -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 +6 -10
- 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 +8 -13
- package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
- package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +4 -4
- package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
- package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts +12 -0
- 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 +6 -44
- package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.d.ts +46 -20
- package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +6 -50
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
- package/dist/types/src/components/Tooltip/Tooltip.d.ts +10 -12
- package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +10 -63
- package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +14 -8
- 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/hooks/useSafeArea.d.ts.map +1 -1
- package/dist/types/src/hooks/useVisualViewport.d.ts +2 -2
- package/dist/types/src/hooks/useVisualViewport.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 +5 -9
- package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
- package/dist/types/src/playground/Custom.stories.d.ts +12 -4
- package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
- package/dist/types/src/playground/Typography.stories.d.ts +5 -11
- package/dist/types/src/playground/Typography.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 +46 -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/index.d.ts +2 -1
- package/dist/types/src/testing/decorators/index.d.ts.map +1 -1
- package/dist/types/src/testing/decorators/withLayout.d.ts +15 -0
- package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -0
- package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +12 -0
- package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -0
- package/dist/types/src/testing/decorators/withTheme.d.ts +5 -1
- 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 +2 -1
- package/dist/types/src/util/index.d.ts.map +1 -1
- package/dist/types/src/util/usePx.d.ts +8 -0
- package/dist/types/src/util/usePx.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +43 -31
- package/src/components/Avatars/Avatar.stories.tsx +24 -16
- package/src/components/Avatars/Avatar.tsx +9 -16
- package/src/components/Avatars/AvatarGroup.stories.tsx +12 -8
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +20 -15
- package/src/components/Breadcrumb/Breadcrumb.tsx +12 -38
- package/src/components/{Buttons → Button}/Button.stories.tsx +10 -11
- package/src/components/{Buttons → Button}/Button.tsx +12 -26
- package/src/components/{Buttons → Button}/IconButton.stories.tsx +15 -12
- package/src/components/{Buttons → Button}/IconButton.tsx +22 -16
- package/src/components/Button/Toggle.stories.tsx +37 -0
- package/src/components/{Buttons → Button}/Toggle.tsx +4 -4
- package/src/components/{Buttons → Button}/ToggleGroup.stories.tsx +12 -9
- package/src/components/Button/ToggleGroup.tsx +50 -0
- package/src/components/Card/Card.stories.tsx +151 -0
- package/src/components/Card/Card.tsx +394 -0
- package/src/components/Card/index.ts +5 -0
- package/src/components/Clipboard/ClipboardProvider.tsx +1 -1
- package/src/components/Clipboard/CopyButton.tsx +9 -8
- package/src/components/DensityProvider/DensityProvider.tsx +2 -2
- package/src/components/Dialog/AlertDialog.stories.tsx +69 -0
- package/src/components/Dialog/AlertDialog.tsx +211 -0
- package/src/components/Dialog/Dialog.stories.tsx +178 -0
- package/src/components/Dialog/Dialog.tsx +280 -0
- package/src/components/ElevationProvider/ElevationProvider.tsx +2 -2
- package/src/components/ErrorFallback/ErrorFallback.stories.tsx +50 -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 +144 -0
- package/src/components/Icon/Icon.tsx +6 -2
- 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 +28 -49
- package/src/components/Input/Input.tsx +49 -85
- package/src/components/Link/Link.stories.tsx +12 -8
- package/src/components/Link/Link.tsx +2 -2
- package/src/components/{Lists → List}/List.stories.tsx +44 -45
- package/src/components/{Lists → List}/List.tsx +31 -30
- package/src/components/{Lists → List}/ListDropIndicator.tsx +7 -7
- package/src/components/{Lists → List}/Tree.stories.tsx +16 -13
- package/src/components/{Lists → List}/Tree.tsx +4 -3
- package/src/components/{Lists → List}/TreeDropIndicator.tsx +7 -7
- package/src/components/{Lists → List}/Treegrid.stories.tsx +15 -9
- package/src/components/{Lists → List}/Treegrid.tsx +67 -31
- package/src/components/Main/Main.stories.tsx +53 -27
- package/src/components/Main/Main.tsx +177 -105
- package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +13 -10
- package/src/components/{Menus → Menu}/ContextMenu.tsx +10 -33
- package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +14 -11
- package/src/components/{Menus → Menu}/DropdownMenu.tsx +157 -120
- package/src/components/Message/Message.stories.tsx +37 -18
- package/src/components/Message/Message.tsx +43 -34
- package/src/components/Popover/Popover.stories.tsx +16 -13
- package/src/components/Popover/Popover.tsx +124 -102
- package/src/components/ScrollArea/ScrollArea.stories.tsx +224 -31
- package/src/components/ScrollArea/ScrollArea.tsx +97 -79
- package/src/components/ScrollArea/index.ts +1 -1
- package/src/components/ScrollContainer/ScrollContainer.stories.tsx +90 -0
- package/src/components/ScrollContainer/ScrollContainer.tsx +320 -0
- package/src/components/ScrollContainer/index.ts +5 -0
- package/src/components/Select/Select.stories.tsx +17 -14
- package/src/components/Select/Select.tsx +16 -31
- package/src/components/Separator/Separator.tsx +5 -8
- package/src/components/Skeleton/Skeleton.stories.tsx +52 -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 +140 -0
- package/src/components/Splitter/index.ts +5 -0
- package/src/components/Status/Status.stories.tsx +30 -23
- package/src/components/Status/Status.tsx +10 -7
- package/src/components/Tag/Tag.stories.tsx +17 -13
- package/src/components/Tag/Tag.tsx +3 -8
- package/src/components/ThemeProvider/ThemeProvider.stories.tsx +32 -0
- package/src/components/ThemeProvider/ThemeProvider.tsx +12 -10
- package/src/components/ThemeProvider/TranslationsProvider.tsx +3 -18
- package/src/components/ThemeProvider/index.ts +3 -3
- package/src/components/Toast/Toast.stories.tsx +14 -11
- package/src/components/Toast/Toast.tsx +23 -42
- package/src/components/Toolbar/Toolbar.stories.tsx +16 -14
- package/src/components/Toolbar/Toolbar.tsx +185 -12
- package/src/components/Tooltip/Tooltip.stories.tsx +32 -26
- package/src/components/Tooltip/Tooltip.tsx +44 -41
- package/src/components/index.ts +15 -9
- 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/hooks/useSafeArea.ts +3 -2
- package/src/hooks/useVisualViewport.ts +4 -4
- package/src/index.ts +2 -1
- package/src/playground/Controls.stories.tsx +12 -15
- package/src/playground/Custom.stories.tsx +17 -38
- package/src/playground/Typography.stories.tsx +11 -9
- package/src/primitives/Column/AUDIT.md +354 -0
- package/src/primitives/Column/Column.stories.tsx +183 -0
- package/src/primitives/Column/Column.tsx +169 -0
- package/src/primitives/Column/index.ts +5 -0
- package/src/primitives/Container/Container.stories.tsx +30 -0
- package/src/primitives/Container/Container.tsx +19 -0
- package/src/primitives/Container/index.ts +5 -0
- package/src/primitives/Flex/Flex.stories.tsx +58 -0
- package/src/primitives/Flex/Flex.tsx +24 -0
- package/src/primitives/Flex/index.ts +5 -0
- package/src/primitives/Grid/Grid.stories.tsx +57 -0
- package/src/primitives/Grid/Grid.tsx +30 -0
- package/src/primitives/Grid/index.ts +5 -0
- package/src/primitives/Panel/Panel.stories.tsx +67 -0
- package/src/primitives/Panel/Panel.tsx +114 -0
- package/src/primitives/Panel/index.ts +5 -0
- package/src/primitives/index.ts +9 -0
- package/src/testing/Loading.tsx +26 -0
- package/src/testing/decorators/index.ts +2 -1
- package/src/testing/decorators/withLayout.tsx +77 -0
- package/src/testing/decorators/withLayoutVariants.tsx +48 -0
- package/src/testing/decorators/withTheme.tsx +37 -0
- package/src/testing/index.ts +2 -0
- package/src/translations.ts +19 -0
- package/src/util/index.ts +3 -1
- package/src/util/usePx.ts +62 -0
- package/dist/lib/browser/chunk-2COVUP44.mjs +0 -4373
- package/dist/lib/browser/chunk-2COVUP44.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-GHXHND5V.mjs +0 -4375
- package/dist/lib/node-esm/chunk-GHXHND5V.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/Buttons/Button.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/Button.stories.d.ts +0 -12
- package/dist/types/src/components/Buttons/Button.stories.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/IconButton.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/IconButton.stories.d.ts +0 -22
- package/dist/types/src/components/Buttons/IconButton.stories.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/Toggle.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/Toggle.stories.d.ts +0 -19
- package/dist/types/src/components/Buttons/Toggle.stories.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/ToggleGroup.d.ts +0 -28
- package/dist/types/src/components/Buttons/ToggleGroup.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts +0 -39
- package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts.map +0 -1
- package/dist/types/src/components/Buttons/index.d.ts.map +0 -1
- package/dist/types/src/components/Dialogs/AlertDialog.d.ts +0 -31
- package/dist/types/src/components/Dialogs/AlertDialog.d.ts.map +0 -1
- package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts +0 -43
- package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts.map +0 -1
- package/dist/types/src/components/Dialogs/Dialog.d.ts +0 -31
- package/dist/types/src/components/Dialogs/Dialog.d.ts.map +0 -1
- package/dist/types/src/components/Dialogs/Dialog.stories.d.ts +0 -48
- package/dist/types/src/components/Dialogs/Dialog.stories.d.ts.map +0 -1
- package/dist/types/src/components/Dialogs/index.d.ts.map +0 -1
- package/dist/types/src/components/Lists/List.d.ts.map +0 -1
- package/dist/types/src/components/Lists/List.stories.d.ts +0 -37
- package/dist/types/src/components/Lists/List.stories.d.ts.map +0 -1
- package/dist/types/src/components/Lists/ListDropIndicator.d.ts.map +0 -1
- package/dist/types/src/components/Lists/Tree.d.ts.map +0 -1
- package/dist/types/src/components/Lists/Tree.stories.d.ts +0 -41
- package/dist/types/src/components/Lists/Tree.stories.d.ts.map +0 -1
- package/dist/types/src/components/Lists/TreeDropIndicator.d.ts.map +0 -1
- package/dist/types/src/components/Lists/Treegrid.stories.d.ts +0 -10
- package/dist/types/src/components/Lists/Treegrid.stories.d.ts.map +0 -1
- package/dist/types/src/components/Lists/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 +0 -50
- package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
- package/dist/types/src/components/Menus/DropdownMenu.d.ts +0 -112
- package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
- package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts +0 -50
- 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/testing/decorators/withSurfaceVariantsLayout.d.ts +0 -12
- package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.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/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
- package/src/components/AnchoredOverflow/index.ts +0 -5
- package/src/components/Buttons/Toggle.stories.tsx +0 -33
- package/src/components/Buttons/ToggleGroup.tsx +0 -41
- package/src/components/Dialogs/AlertDialog.stories.tsx +0 -66
- package/src/components/Dialogs/AlertDialog.tsx +0 -172
- package/src/components/Dialogs/Dialog.stories.tsx +0 -65
- package/src/components/Dialogs/Dialog.tsx +0 -159
- package/src/testing/decorators/withSurfaceVariantsLayout.tsx +0 -51
- package/src/testing/decorators/withTheme.ts +0 -25
- package/src/util/ThemedClassName.ts +0 -7
- /package/dist/types/src/components/{Buttons → Button}/index.d.ts +0 -0
- /package/dist/types/src/components/{Dialogs → Dialog}/index.d.ts +0 -0
- /package/dist/types/src/components/{Lists → List}/ListDropIndicator.d.ts +0 -0
- /package/dist/types/src/components/{Lists → List}/TreeDropIndicator.d.ts +0 -0
- /package/dist/types/src/components/{Lists → List}/index.d.ts +0 -0
- /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
- /package/src/components/{Buttons → Button}/index.ts +0 -0
- /package/src/components/{Dialogs → Dialog}/index.ts +0 -0
- /package/src/components/{Lists → List}/index.ts +0 -0
- /package/src/components/{Menus → Menu}/index.ts +0 -0
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
# Column composition
|
|
2
|
+
|
|
3
|
+
## Background
|
|
4
|
+
|
|
5
|
+
We have a complex design issue that requires research and deep thinking.
|
|
6
|
+
|
|
7
|
+
`Column` is a primitive that establishes a 3 column grid (side gutters and main content channel) by creating a CSS `grid` and setting the `--gutter` CSS variable.
|
|
8
|
+
Both `Dialog` and `Card` use `Column` to establish their grid and both have separate sub-components.
|
|
9
|
+
Also `ScrollArea` uses the `Column` grid to establish the side margins (padding via `--gutter`) for the main content.
|
|
10
|
+
Various components (e.g., `Form`) define a `Viewport` that implements a `ScrollArea` to establish their grid.
|
|
11
|
+
|
|
12
|
+
## Initial Tasks
|
|
13
|
+
|
|
14
|
+
1. Create a column-aligned Markdown table listing the sub-components for `Card` and `Dialog`.
|
|
15
|
+
2. Add to this table all Radix-style components that have a `Viewport` sub-component that uses `ScrollArea`.
|
|
16
|
+
3. For each of these component comment on whether they use appropraite standard for `Content` and `Viewport`, and call out any major design issues.
|
|
17
|
+
|
|
18
|
+
## Design Challenge
|
|
19
|
+
|
|
20
|
+
The use of `Column` is intended to standardize how components establish a grid.
|
|
21
|
+
It is intended that this supports nesting; e.g., a `Dialog` that has a `Form` in its `Viewport`.
|
|
22
|
+
However there is a problem when child components contain other components that contain `Viewport`.
|
|
23
|
+
For example:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
- CreateObjectDialog (plugin-space)
|
|
27
|
+
- Dialog.Root
|
|
28
|
+
- Dialog.Body
|
|
29
|
+
- Dialog.Viewport => ScrollArea
|
|
30
|
+
- CreateObjectPanel
|
|
31
|
+
- Form.Root
|
|
32
|
+
- Form.Viewport => ScrollArea
|
|
33
|
+
- Form.Content
|
|
34
|
+
- Form.FieldSet
|
|
35
|
+
- Form.Actions
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The nested Viewports create a double set of scrollbars,
|
|
39
|
+
whereas the entire contents of the `Dialog.Body` should be considered to be a single scroll-area.
|
|
40
|
+
In this case we could omit the `Dialog.Viewport`, but inside `CreateObjectPanel` there are other components that do not define `Viewports`.
|
|
41
|
+
|
|
42
|
+
Determine if this is really a problem. And consider different approachs.
|
|
43
|
+
|
|
44
|
+
## Audit
|
|
45
|
+
|
|
46
|
+
### Sub-components for Dialog and Card
|
|
47
|
+
|
|
48
|
+
| Component | Sub-component | Uses Column | Uses ScrollArea | Has Viewport | Notes |
|
|
49
|
+
| :--------- | :-------------- | :------------------------------ | :--------------------------------- | :----------- | :------------------------------- |
|
|
50
|
+
| **Dialog** | Root | — | — | — | ElevationProvider wrapper |
|
|
51
|
+
| | Trigger | — | — | — | Radix primitive |
|
|
52
|
+
| | Portal | — | — | — | Radix primitive |
|
|
53
|
+
| | Overlay | — | — | — | OverlayLayoutProvider |
|
|
54
|
+
| | Content | **Column.Root** (gutter='sm') | — | — | Establishes the 3-col grid |
|
|
55
|
+
| | Header | **Column.Row** (center) | — | — | Title + Close row |
|
|
56
|
+
| | Body | col-span-full | — | — | Plain div, no gutters applied |
|
|
57
|
+
| | **Viewport** | **Column.Viewport** | **ScrollArea** (vertical, padding) | **Yes** | Alias for Column.Viewport |
|
|
58
|
+
| | Title | — | — | — | Radix primitive |
|
|
59
|
+
| | Description | — | — | — | Radix primitive |
|
|
60
|
+
| | ActionBar | **Column.Row** (center) | — | — | Action buttons row |
|
|
61
|
+
| | Close | — | — | — | Radix primitive |
|
|
62
|
+
| | CloseIconButton | — | — | — | Icon button |
|
|
63
|
+
| **Card** | Root | **Column.Root** (gutter varies) | — | — | gutter='lg' coarse, 'md' default |
|
|
64
|
+
| | Toolbar | col-span-3, subgrid | — | — | Toolbar.Root wrapper |
|
|
65
|
+
| | DragHandle | — | — | — | In CardIconBlock |
|
|
66
|
+
| | CloseIconButton | — | — | — | In CardIconBlock |
|
|
67
|
+
| | Menu | — | — | — | In CardIconBlock |
|
|
68
|
+
| | Icon | — | — | — | In CardIconBlock |
|
|
69
|
+
| | IconBlock | — | — | — | Grid cell for icons |
|
|
70
|
+
| | Title | — | — | — | Heading div |
|
|
71
|
+
| | Content | — | — | — | `display: contents` |
|
|
72
|
+
| | Row | **Column.Row** | — | — | With optional icon slot |
|
|
73
|
+
| | Section | col-span-full | — | — | **Deprecated** |
|
|
74
|
+
| | Heading | — | — | — | **Deprecated** |
|
|
75
|
+
| | Text | — | — | — | Text display |
|
|
76
|
+
| | Poster | col-span-full | — | — | Image/icon |
|
|
77
|
+
| | Action | Column.Row via subgrid | — | — | Button row |
|
|
78
|
+
| | Link | Column.Row via subgrid | — | — | External link row |
|
|
79
|
+
|
|
80
|
+
### Components with Viewport sub-components using ScrollArea
|
|
81
|
+
|
|
82
|
+
| Component | Viewport impl | ScrollArea config | Notes |
|
|
83
|
+
| :------------- | :--------------------- | :---------------------------------------- | :--------------------------------------- |
|
|
84
|
+
| **Column** | Column.Viewport | vertical, padding | Base primitive; adds `py-2` |
|
|
85
|
+
| **Dialog** | Dialog.Viewport | (alias for Column.Viewport) | No Dialog-specific behavior |
|
|
86
|
+
| **Form** | Form.Viewport | vertical, margin, padding, thin | Sets `role='listbox'` |
|
|
87
|
+
| **SearchList** | SearchList.Viewport | thin only | Sets `role='listbox'`; no margin/padding |
|
|
88
|
+
| **Settings** | Settings.Root (itself) | vertical, margin | Root IS the ScrollArea; adds `p-trim-md` |
|
|
89
|
+
| **Popover** | Popover.Viewport | **None** (constraint div, not ScrollArea) | Just constrains inline/block size |
|
|
90
|
+
| **Combobox** | Combobox.List | (delegates to SearchList.Viewport) | Nested inside Popover.Viewport |
|
|
91
|
+
|
|
92
|
+
### Design issues per component
|
|
93
|
+
|
|
94
|
+
| Component | Content/Viewport standard | Issues |
|
|
95
|
+
| :------------- | :-------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
96
|
+
| **Dialog** | Content → Column.Root; Viewport → Column.Viewport | `Dialog.Viewport` is a raw alias with no Dialog-specific awareness. `Dialog.Body` has `col-span-full` but no gutter padding — non-scrolling content inside it has no side margins. |
|
|
97
|
+
| **Card** | Content → `display:contents`; No Viewport | Card has no scroll support. Card.Content using `display:contents` collapses the element from layout, which can cause containment/styling issues. No Body equivalent exists. |
|
|
98
|
+
| **Form** | Root → context provider; Viewport → ScrollArea | Form.Viewport applies its own gutter padding via `--gutter`. When nested inside Dialog.Content (which sets `--gutter`), the padding aligns — but creates a second scroll container. |
|
|
99
|
+
| **SearchList** | Content → flex column; Viewport → ScrollArea (thin) | SearchList.Viewport uses `thin` but NOT `margin` or `padding` — it doesn't apply `--gutter` padding at all. Content alignment inside a Column grid depends entirely on the parent. |
|
|
100
|
+
| **Settings** | Root IS the ScrollArea | Standalone design; would double-scroll if placed inside another Viewport. |
|
|
101
|
+
| **Combobox** | Delegates to SearchList.Viewport inside Popover | No conflict — Popover.Viewport is not ScrollArea-based. |
|
|
102
|
+
|
|
103
|
+
## Analysis
|
|
104
|
+
|
|
105
|
+
### The problem
|
|
106
|
+
|
|
107
|
+
The core tension is between two responsibilities that `Viewport` (ScrollArea) currently conflates:
|
|
108
|
+
|
|
109
|
+
1. **Scrolling** — overflow handling and scrollbar styling.
|
|
110
|
+
2. **Gutter padding** — applying `px-[var(--gutter)]` (with scrollbar-width offset) to align content within the Column grid.
|
|
111
|
+
|
|
112
|
+
When a container like `Dialog` provides its own Viewport and a child like `Form` also provides one,
|
|
113
|
+
you get double scrollbars. Removing the container's Viewport fixes scrolling but breaks gutter alignment
|
|
114
|
+
for child paths that don't bring their own Viewport (e.g., plain text content).
|
|
115
|
+
|
|
116
|
+
### The real nesting in CreateObjectDialog today
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
Dialog.Content (Column.Root, sets --gutter)
|
|
120
|
+
Dialog.Header (Column.Row)
|
|
121
|
+
Dialog.Body (col-span-full, NO gutter padding)
|
|
122
|
+
CreateObjectPanel (switches between paths):
|
|
123
|
+
Path A: SelectType → SearchList → SearchList.Viewport (ScrollArea, thin)
|
|
124
|
+
Path B: SelectSpace → SearchList → SearchList.Viewport (ScrollArea, thin)
|
|
125
|
+
Path C: Form.Root → Form.Viewport (ScrollArea, margin, padding, thin) → Form.Content
|
|
126
|
+
Path D: (future) plain content — no Viewport, no gutters, broken alignment
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Dialog.Viewport was removed to avoid double scrollbars in paths A–C.
|
|
130
|
+
But path D would have no gutter padding because Dialog.Body doesn't provide it.
|
|
131
|
+
|
|
132
|
+
### Design principles
|
|
133
|
+
|
|
134
|
+
1. **Column.Content provides gutters via subgrid.** `Column.Root` sets `--gutter` and establishes the 3-column grid. `Column.Content` inherits this grid via CSS subgrid, placing non-scrolling children in the center column and allowing ScrollArea children to span full width.
|
|
135
|
+
2. **Leaves own scrolling.** Components that need to scroll (Form, SearchList) provide their own Viewport. Components that don't need to scroll do nothing.
|
|
136
|
+
3. **ScrollArea is always full width.** ScrollArea.Root must span all 3 grid columns and apply its own gutter padding via `--gutter` on its Viewport. No parent should constrain its width.
|
|
137
|
+
4. **Subgrid propagation.** Components with both Content and Viewport sub-components (e.g., SearchList) propagate the subgrid in their Content element when inside a Column context.
|
|
138
|
+
|
|
139
|
+
## Implemented Solution: Column.Content as subgrid
|
|
140
|
+
|
|
141
|
+
### Mechanism
|
|
142
|
+
|
|
143
|
+
`Column.Content` uses `grid-cols-subgrid` to inherit `Column.Root`'s 3-column grid. Non-scrolling children default to the center column; ScrollArea children span all 3 columns.
|
|
144
|
+
|
|
145
|
+
Direct children of `Column.Root` participate in the grid in one of three ways:
|
|
146
|
+
|
|
147
|
+
- **Column.Row** — 3-col subgrid row (icons in gutters, content in center).
|
|
148
|
+
- **Column.Content** — multi-row subgrid; children default to center column, ScrollArea spans full width.
|
|
149
|
+
- **Column.Viewport** — full-width scrollable area (delegates gutters to ScrollArea).
|
|
150
|
+
|
|
151
|
+
```css
|
|
152
|
+
/* Column.Content — subgrid that inherits Column.Root's 3-column grid */
|
|
153
|
+
.column-content {
|
|
154
|
+
col-span-full;
|
|
155
|
+
display: grid;
|
|
156
|
+
grid-template-columns: subgrid;
|
|
157
|
+
min-height: 0; /* allow shrinking in flex/grid parents */
|
|
158
|
+
> *:not(.dx-container) { col-start: 2 } /* non-ScrollArea children → center column */
|
|
159
|
+
/* ScrollArea children span full width via [.dx-column_&]:col-span-full (existing) */
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Why subgrid instead of padding
|
|
164
|
+
|
|
165
|
+
An earlier approach used `px-[var(--gutter)]` padding on Column.Content with a `--gutter-offset`
|
|
166
|
+
CSS variable for ScrollArea to break out via negative margins. This failed because:
|
|
167
|
+
|
|
168
|
+
1. **Height constraint required `overflow-hidden`** — needed for ScrollArea to get a bounded height.
|
|
169
|
+
2. **`overflow-hidden` clips negative margins** — ScrollArea couldn't break out horizontally.
|
|
170
|
+
3. **CSS doesn't allow mixed overflow** — `overflow-y: hidden` with `overflow-x: visible` isn't possible (browser converts visible to auto).
|
|
171
|
+
|
|
172
|
+
Subgrid avoids all three issues: gutters come from grid columns (not padding), so there's nothing to break out of and no overflow conflict.
|
|
173
|
+
|
|
174
|
+
### Subgrid propagation pattern
|
|
175
|
+
|
|
176
|
+
Components that have both a Content element and a ScrollArea-based Viewport must propagate
|
|
177
|
+
the subgrid in their Content element when inside a Column context. This ensures the grid chain
|
|
178
|
+
is maintained from Column.Root through intermediate components down to ScrollArea.Root.
|
|
179
|
+
|
|
180
|
+
```css
|
|
181
|
+
/* Applied to SearchList.Content (and similar) when inside a Column context */
|
|
182
|
+
[.dx-column_&]:col-span-full
|
|
183
|
+
[.dx-column_&]:grid
|
|
184
|
+
[.dx-column_&]:grid-cols-subgrid
|
|
185
|
+
[.dx-column_&]:[&>:not(.dx-container)]:col-start-2
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
Components using this pattern:
|
|
189
|
+
|
|
190
|
+
- **SearchList.Content** — propagates subgrid; SearchList.Viewport (ScrollArea) spans full width
|
|
191
|
+
|
|
192
|
+
Outside a Column context, these remain normal flex containers.
|
|
193
|
+
|
|
194
|
+
### Example: CreateObjectDialog
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
Dialog.Content (Column.Root, --gutter: var(--dx-gutter-sm), grid: 16px|1fr|16px)
|
|
198
|
+
Dialog.Header (Column.Row, center)
|
|
199
|
+
Dialog.Body → Column.Content (subgrid, children default to col-start-2)
|
|
200
|
+
CreateObjectPanel:
|
|
201
|
+
Path A: SearchList.Content (subgrid in column context)
|
|
202
|
+
→ SearchList.Input (col-start-2, in center — guttered ✓)
|
|
203
|
+
→ SearchList.Viewport (ScrollArea, col-span-full — full width ✓)
|
|
204
|
+
→ ScrollArea.Viewport (pl/pr with --gutter and scrollbar offset ✓)
|
|
205
|
+
Path B: (same as A) ✓
|
|
206
|
+
Path C: Form.Viewport (ScrollArea, col-span-full — full width ✓)
|
|
207
|
+
→ ScrollArea.Viewport (pl/pr with --gutter and scrollbar offset ✓)
|
|
208
|
+
Path D: <plain text> — col-start-2 (center column, guttered ✓)
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Dialog sub-component mapping
|
|
212
|
+
|
|
213
|
+
| Dialog sub-component | Column primitive | Gutter mechanism |
|
|
214
|
+
| :------------------- | :--------------- | :--------------------------------------------- |
|
|
215
|
+
| Dialog.Content | Column.Root | Establishes the 3-col grid and sets `--gutter` |
|
|
216
|
+
| Dialog.Header | Column.Row | Gutters via grid columns (subgrid) |
|
|
217
|
+
| Dialog.Body | Column.Content | Subgrid; children in center column |
|
|
218
|
+
| Dialog.ActionBar | Column.Row | Gutters via grid columns (subgrid) |
|
|
219
|
+
|
|
220
|
+
### AlertDialog unified with Dialog ✅
|
|
221
|
+
|
|
222
|
+
AlertDialog now shares sub-components with Dialog:
|
|
223
|
+
|
|
224
|
+
| Sub-component | Source | Notes |
|
|
225
|
+
| :---------------- | :------------------------- | :------------------------------------------------------------- |
|
|
226
|
+
| Header | **Dialog.Header** | Shared — was missing from AlertDialog |
|
|
227
|
+
| Body | **Dialog.Body** | Shared — was Column.Viewport, now Column.Content |
|
|
228
|
+
| ActionBar | **Dialog.ActionBar** | Shared — was duplicated, now shared |
|
|
229
|
+
| CloseIconButton | **Dialog.CloseIconButton** | Shared — AlertDialog gains this |
|
|
230
|
+
| Content | AlertDialog-specific | Uses AlertDialogPrimitive.Content; gutter normalized to `'sm'` |
|
|
231
|
+
| Overlay | AlertDialog-specific | Uses AlertDialogPrimitive.Overlay |
|
|
232
|
+
| Title/Description | AlertDialog-specific | Uses AlertDialogPrimitive.Title/Description |
|
|
233
|
+
| Cancel/Action | AlertDialog-specific | Radix dismissal primitives |
|
|
234
|
+
|
|
235
|
+
## Dialog Usage Audit
|
|
236
|
+
|
|
237
|
+
Full audit of all Dialog/AlertDialog consumers, checking whether they use the standard
|
|
238
|
+
`Dialog.Content > Dialog.Header > Dialog.Body > Dialog.ActionBar` structure.
|
|
239
|
+
|
|
240
|
+
### Correctly structured (uses Dialog.Body)
|
|
241
|
+
|
|
242
|
+
| File | Type | Sub-components used | Body content |
|
|
243
|
+
| :--------------------------------------------- | :----- | :------------------------------- | :---------------------------------- |
|
|
244
|
+
| `devtools/.../DialogRestoreSpace.tsx` | Dialog | Content, Header, Body, ActionBar | Paragraph text + FileUploader |
|
|
245
|
+
| `plugin-navtree/.../CommandsDialogContent.tsx` | Dialog | Content, Header, Body, ActionBar | SearchList with Viewport |
|
|
246
|
+
| `plugin-space/.../CreateObjectDialog.tsx` | Dialog | Content, Header, Body | CreateObjectPanel (Form/SearchList) |
|
|
247
|
+
| `shell/.../ConfirmReset.tsx` | Dialog | Body, ActionBar (step component) | Message, TextInput, checkboxes |
|
|
248
|
+
| `react-ui/.../Dialog.stories.tsx` | Dialog | Content, Header, Body, ActionBar | ScrollArea with Input |
|
|
249
|
+
|
|
250
|
+
### Correctly structured (AlertDialog with Body)
|
|
251
|
+
|
|
252
|
+
| File | Type | Sub-components used | Body content |
|
|
253
|
+
| :----------------------------------------- | :---------- | :------------------------------ | :---------------------------- |
|
|
254
|
+
| `plugin-client/.../RecoveryCodeDialog.tsx` | AlertDialog | Content, Body, Title, ActionBar | Checkboxes, code grid, inputs |
|
|
255
|
+
| `composer-app/.../ResetDialog.tsx` | AlertDialog | Content, Body, Title, ActionBar | Error display, IconButtons |
|
|
256
|
+
| `shell/.../JoinDialog.tsx` | AlertDialog | Content, Body, Cancel, Action | JoinPanel |
|
|
257
|
+
| `shell/.../StatusDialog.tsx` | AlertDialog | Content, Body | StatusPanel |
|
|
258
|
+
| `react-ui/.../AlertDialog.stories.tsx` | AlertDialog | Content, Body, Title, ActionBar | Title, Description |
|
|
259
|
+
|
|
260
|
+
### Missing Dialog.Body (should be added)
|
|
261
|
+
|
|
262
|
+
| File | Type | What's used instead | Body content | Issue |
|
|
263
|
+
| :------------------------------------------- | :----- | :----------------------- | :----------------------------- | :---------------------------------------------------- |
|
|
264
|
+
| `plugin-script/.../DeploymentDialog.tsx` | Dialog | Custom flex divs | Text, list items, buttons | No Header, no Body, no gutter padding |
|
|
265
|
+
| `plugin-search/.../SearchDialog.tsx` | Dialog | Content directly | SearchList with max-h overflow | No Header, no Body; SearchList has own scroll |
|
|
266
|
+
| `plugin-help/.../ShortcutsDialogContent.tsx` | Dialog | Custom flex divs | ShortcutsList | No Header, no Body |
|
|
267
|
+
| `plugin-space/.../CreateSpaceDialog.tsx` | Dialog | Form.Viewport in Content | Form fields | Has Header but no Body; Form.Viewport provides scroll |
|
|
268
|
+
| `plugin-space/.../JoinDialog.tsx` | Dialog | Content directly | JoinPanel | No Header, no Body; panel manages layout |
|
|
269
|
+
| `plugin-client/.../JoinDialog.tsx` | Dialog | Content directly | JoinPanel | No Body; panel manages layout |
|
|
270
|
+
| `plugin-client/.../ResetDialog.tsx` | Dialog | Content directly | ConfirmReset step | No Body; step component has its own Body |
|
|
271
|
+
| `shell/.../SpaceDialog.tsx` | Dialog | Content directly | SpacePanel | No Header, no Body; panel manages layout |
|
|
272
|
+
| `shell/.../IdentityDialog.tsx` | Dialog | Content directly | IdentityPanel | No Header, no Body; panel manages layout |
|
|
273
|
+
| `shell/.../run-shell.tsx` | Dialog | Content directly | Button (fallback) | No Header, no Body; minimal fallback UI |
|
|
274
|
+
|
|
275
|
+
### Custom layout (not standard Dialog)
|
|
276
|
+
|
|
277
|
+
| File | Type | Notes |
|
|
278
|
+
| :------------------------------------ | :----- | :-------------------------------------------------------- |
|
|
279
|
+
| `react-ui-chat/.../ChatDialog.tsx` | Custom | Own Column-based grid layout with Header, Content, Footer |
|
|
280
|
+
| `plugin-assistant/.../ChatDialog.tsx` | Custom | Uses ChatDialog from react-ui-chat |
|
|
281
|
+
|
|
282
|
+
### Observations
|
|
283
|
+
|
|
284
|
+
1. **Shell panel dialogs** (SpaceDialog, IdentityDialog, JoinDialog) all delegate layout to internal Panel components. These panels manage their own structure inside Dialog.Content, bypassing Dialog.Body/Header. This may be intentional (panels are reusable outside dialogs) but means they lack standard gutter alignment.
|
|
285
|
+
|
|
286
|
+
2. **Search-style dialogs** (SearchDialog, CommandsDialogContent) have full-bleed SearchList content. CommandsDialogContent correctly uses Dialog.Body; SearchDialog does not and handles its own max-height overflow.
|
|
287
|
+
|
|
288
|
+
3. **Form dialogs** (CreateSpaceDialog) use Form.Viewport directly in Dialog.Content, skipping Dialog.Body. This is safe because `--gutter-offset` is set by Column.Content (not Column.Root), so Form.Viewport's ScrollArea.Root sees `--gutter-offset` defaulting to `0px` and applies no negative margin. These dialogs should still be updated to use Dialog.Body for consistency, but they won't break.
|
|
289
|
+
|
|
290
|
+
4. **AlertDialog.Body uses Column.Viewport** (ScrollArea), while **Dialog.Body uses Column.Content** (non-scrolling). This inconsistency should be resolved — AlertDialog.Body should likely also use Column.Content so that child components can bring their own scroll.
|
|
291
|
+
|
|
292
|
+
## Completed Work
|
|
293
|
+
|
|
294
|
+
### Column.Content primitive ✅
|
|
295
|
+
|
|
296
|
+
- New `Column.Content` component using CSS subgrid
|
|
297
|
+
- `Column.Root` JSDoc updated to document three child types (Row, Content, Viewport)
|
|
298
|
+
- `ColumnContentProps` exported from `@dxos/react-ui`
|
|
299
|
+
- Column stories added (WithContent, ContentWithScrollArea)
|
|
300
|
+
|
|
301
|
+
### Dialog standardization ✅
|
|
302
|
+
|
|
303
|
+
- `Dialog.Viewport` removed (no consumers)
|
|
304
|
+
- `Dialog.Body` delegates to `Column.Content`
|
|
305
|
+
- Dialog stories updated (DefaultStory, ScrollingStory)
|
|
306
|
+
- All dialog stories use consistent `Root > Overlay > Content` wrapping (no Portal)
|
|
307
|
+
|
|
308
|
+
### AlertDialog unified with Dialog ✅
|
|
309
|
+
|
|
310
|
+
- AlertDialog shares Header, Body, ActionBar, CloseIconButton with Dialog
|
|
311
|
+
- AlertDialog.Content normalized to `gutter='sm'`
|
|
312
|
+
- AlertDialog.Body changed from Column.Viewport (scroll) to Column.Content (subgrid)
|
|
313
|
+
|
|
314
|
+
### Consumer migrations ✅
|
|
315
|
+
|
|
316
|
+
All dialogs updated to standard `Dialog.Content > Dialog.Header > Dialog.Body` structure:
|
|
317
|
+
|
|
318
|
+
1. CreateSpaceDialog — wrapped Form.Root in Dialog.Body ✅
|
|
319
|
+
2. SearchDialog — added Header and Body ✅
|
|
320
|
+
3. ShortcutsDialogContent — replaced custom flex layout with Header and Body ✅
|
|
321
|
+
4. DeploymentDialog — restructured to use Header, Body, ActionBar ✅
|
|
322
|
+
5. SpaceDialog — wrapped SpacePanel in Dialog.Body ✅
|
|
323
|
+
6. IdentityDialog — wrapped IdentityPanel in Dialog.Body ✅
|
|
324
|
+
7. JoinDialog (plugin-space) — wrapped JoinPanel in Dialog.Body ✅
|
|
325
|
+
8. JoinDialog (plugin-client) — wrapped JoinPanel in Dialog.Body ✅
|
|
326
|
+
9. plugin-client ResetDialog — already correct (ConfirmReset uses Dialog.Body internally) ✅
|
|
327
|
+
|
|
328
|
+
### SearchList subgrid propagation ✅
|
|
329
|
+
|
|
330
|
+
- SearchList.Content propagates subgrid when inside a Column context
|
|
331
|
+
- SearchList.Viewport now passes `padding` for gutter alignment
|
|
332
|
+
|
|
333
|
+
## Remaining Work
|
|
334
|
+
|
|
335
|
+
### Storybook verification
|
|
336
|
+
|
|
337
|
+
Visually verify all migrated dialogs in storybook:
|
|
338
|
+
|
|
339
|
+
- Gutter alignment for non-scrolling content in Dialog.Body
|
|
340
|
+
- ScrollArea full width with correct gutter padding on Viewport
|
|
341
|
+
- Height constraint and scrolling behavior
|
|
342
|
+
- AlertDialog stories with the aligned Body implementation
|
|
343
|
+
|
|
344
|
+
### Form subgrid propagation
|
|
345
|
+
|
|
346
|
+
Form currently doesn't propagate the subgrid in Column context.
|
|
347
|
+
If Form is used inside Dialog.Body, Form.Viewport (ScrollArea) needs to
|
|
348
|
+
span full width. This may require the same subgrid propagation pattern
|
|
349
|
+
applied to SearchList.Content.
|
|
350
|
+
|
|
351
|
+
### Card alignment
|
|
352
|
+
|
|
353
|
+
Card has no Body equivalent. Consider adding Card.Body using Column.Content
|
|
354
|
+
for cards that need scrollable or guttered content areas.
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
6
|
+
import React from 'react';
|
|
7
|
+
|
|
8
|
+
import { Input, ScrollArea } from '../../components';
|
|
9
|
+
import { withLayout, withTheme } from '../../testing';
|
|
10
|
+
|
|
11
|
+
import { Column } from './Column';
|
|
12
|
+
import { Flex } from '../Flex';
|
|
13
|
+
|
|
14
|
+
const List = () => {
|
|
15
|
+
return (
|
|
16
|
+
<ScrollArea.Root centered>
|
|
17
|
+
<ScrollArea.Viewport>
|
|
18
|
+
{Array.from({ length: 100 }).map((_, i) => (
|
|
19
|
+
<Input.Root key={i}>
|
|
20
|
+
<Input.TextInput value={`Item ${i}`} readOnly />
|
|
21
|
+
</Input.Root>
|
|
22
|
+
))}
|
|
23
|
+
</ScrollArea.Viewport>
|
|
24
|
+
</ScrollArea.Root>
|
|
25
|
+
);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const DefaultStory = () => {
|
|
29
|
+
return (
|
|
30
|
+
<Column.Root classNames='overflow-hidden' gutter='md'>
|
|
31
|
+
<Column.Row center>
|
|
32
|
+
<h1 className='p-1 bg-blue-500 text-black'>Header</h1>
|
|
33
|
+
</Column.Row>
|
|
34
|
+
|
|
35
|
+
<Column.Row>
|
|
36
|
+
<div className='p-1 bg-blue-500'>A</div>
|
|
37
|
+
<div className='p-1 bg-red-500'>B</div>
|
|
38
|
+
<div className='p-1 bg-blue-500'>C</div>
|
|
39
|
+
</Column.Row>
|
|
40
|
+
|
|
41
|
+
<Column.Row asChild center>
|
|
42
|
+
<div className='py-2'>
|
|
43
|
+
<Input.Root>
|
|
44
|
+
<Input.TextInput placeholder='Search' />
|
|
45
|
+
</Input.Root>
|
|
46
|
+
</div>
|
|
47
|
+
</Column.Row>
|
|
48
|
+
|
|
49
|
+
<Column.Viewport asChild>
|
|
50
|
+
<div className='flex flex-col gap-2'>
|
|
51
|
+
{Array.from({ length: 100 }).map((_, i) => (
|
|
52
|
+
<Input.Root key={i}>
|
|
53
|
+
<Input.TextInput value={`Item ${i}`} readOnly />
|
|
54
|
+
</Input.Root>
|
|
55
|
+
))}
|
|
56
|
+
</div>
|
|
57
|
+
</Column.Viewport>
|
|
58
|
+
|
|
59
|
+
<Column.Row asChild center>
|
|
60
|
+
<Flex column>
|
|
61
|
+
<h1 className='p-1 bg-red-500 text-black'>Section with overflow</h1>
|
|
62
|
+
<pre className='p-1 text-xs text-subdued overflow-auto'>{new Error().stack}</pre>
|
|
63
|
+
</Flex>
|
|
64
|
+
</Column.Row>
|
|
65
|
+
|
|
66
|
+
<Column.Row center>
|
|
67
|
+
<div className='p-1 bg-green-500 text-black'>Footer</div>
|
|
68
|
+
</Column.Row>
|
|
69
|
+
</Column.Root>
|
|
70
|
+
);
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const meta: Meta = {
|
|
74
|
+
title: 'ui/react-ui-core/primitives/Column',
|
|
75
|
+
render: DefaultStory,
|
|
76
|
+
decorators: [withTheme(), withLayout({ layout: 'column', classNames: 'w-[25rem]' })],
|
|
77
|
+
parameters: {
|
|
78
|
+
layout: 'fullscreen',
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export default meta;
|
|
83
|
+
|
|
84
|
+
type Story = StoryObj<typeof meta>;
|
|
85
|
+
|
|
86
|
+
export const Default: Story = {};
|
|
87
|
+
|
|
88
|
+
const InputList = ({ items = 50 }: { items?: number }) => (
|
|
89
|
+
<div className='flex flex-col gap-2'>
|
|
90
|
+
{Array.from({ length: items }).map((_, index) => (
|
|
91
|
+
<Input.Root key={index}>
|
|
92
|
+
<Input.TextInput value={`Item ${index + 1}`} readOnly />
|
|
93
|
+
</Input.Root>
|
|
94
|
+
))}
|
|
95
|
+
</div>
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
export const WithScrollArea = {
|
|
99
|
+
decorators: [withLayout({ layout: 'column' })],
|
|
100
|
+
render: () => (
|
|
101
|
+
<Column.Root classNames='overflow-hidden' gutter='md'>
|
|
102
|
+
<Column.Row center>
|
|
103
|
+
<h2 className='py-3'>Header</h2>
|
|
104
|
+
</Column.Row>
|
|
105
|
+
<ScrollArea.Root padding centered orientation='vertical' classNames='col-span-full'>
|
|
106
|
+
<ScrollArea.Viewport>
|
|
107
|
+
<InputList items={30} />
|
|
108
|
+
</ScrollArea.Viewport>
|
|
109
|
+
</ScrollArea.Root>
|
|
110
|
+
<Column.Row center>
|
|
111
|
+
<h2 className='py-3'>Footer</h2>
|
|
112
|
+
</Column.Row>
|
|
113
|
+
</Column.Root>
|
|
114
|
+
),
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Column.Content provides gutter padding for non-scrolling content.
|
|
119
|
+
* Compare with Column.Row which uses subgrid for gutter alignment.
|
|
120
|
+
*/
|
|
121
|
+
export const WithContent: Story = {
|
|
122
|
+
decorators: [withLayout({ layout: 'column', classNames: 'w-[25rem]' })],
|
|
123
|
+
render: () => (
|
|
124
|
+
<Column.Root classNames='overflow-hidden' gutter='md'>
|
|
125
|
+
<Column.Row center>
|
|
126
|
+
<h2 className='py-3'>Header (Column.Row)</h2>
|
|
127
|
+
</Column.Row>
|
|
128
|
+
<Column.Content>
|
|
129
|
+
<p className='py-2'>This text is inside Column.Content. It gets gutter padding automatically.</p>
|
|
130
|
+
<Input.Root>
|
|
131
|
+
<Input.Label>Name</Input.Label>
|
|
132
|
+
<Input.TextInput placeholder='Enter name' />
|
|
133
|
+
</Input.Root>
|
|
134
|
+
</Column.Content>
|
|
135
|
+
<Column.Row center>
|
|
136
|
+
<h2 className='py-3'>Footer (Column.Row)</h2>
|
|
137
|
+
</Column.Row>
|
|
138
|
+
</Column.Root>
|
|
139
|
+
),
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Column.Content with a nested ScrollArea.
|
|
144
|
+
* The ScrollArea breaks out of Content's gutter padding via `--gutter-offset`
|
|
145
|
+
* and applies its own asymmetric padding (accounting for scrollbar width).
|
|
146
|
+
*/
|
|
147
|
+
export const ContentWithScrollArea: Story = {
|
|
148
|
+
decorators: [withLayout({ layout: 'column', classNames: 'w-[25rem]' })],
|
|
149
|
+
render: () => (
|
|
150
|
+
<Column.Root classNames='overflow-hidden' gutter='md'>
|
|
151
|
+
<Column.Row center>
|
|
152
|
+
<h2 className='py-3'>Header (Column.Row)</h2>
|
|
153
|
+
</Column.Row>
|
|
154
|
+
<Column.Content>
|
|
155
|
+
<ScrollArea.Root orientation='vertical' padding thin>
|
|
156
|
+
<ScrollArea.Viewport>
|
|
157
|
+
<InputList items={30} />
|
|
158
|
+
</ScrollArea.Viewport>
|
|
159
|
+
</ScrollArea.Root>
|
|
160
|
+
</Column.Content>
|
|
161
|
+
<Column.Row center>
|
|
162
|
+
<h2 className='py-3'>Footer (Column.Row)</h2>
|
|
163
|
+
</Column.Row>
|
|
164
|
+
</Column.Root>
|
|
165
|
+
),
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
export const Experimental = {
|
|
169
|
+
render: () => {
|
|
170
|
+
return (
|
|
171
|
+
<div className='grid grid-cols-[2rem_1fr_2rem]'>
|
|
172
|
+
<div className='col-span-full grid grid-cols-subgrid'>
|
|
173
|
+
<div className='bg-red-surface'>A</div>
|
|
174
|
+
<div className='bg-green-surface'>B</div>
|
|
175
|
+
<div className='bg-blue-surface'>C</div>
|
|
176
|
+
</div>
|
|
177
|
+
<div className='col-span-full grid grid-cols-subgrid col-start-2'>
|
|
178
|
+
<div className='bg-green-surface'>B</div>
|
|
179
|
+
</div>
|
|
180
|
+
</div>
|
|
181
|
+
);
|
|
182
|
+
},
|
|
183
|
+
};
|