@dxos/react-ui 0.8.4-main.8360d9e660 → 0.8.4-main.8baae0fced
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/LICENSE +102 -5
- package/README.md +1 -1
- package/dist/lib/browser/chunk-A5QCIG5R.mjs +24 -0
- package/dist/lib/browser/chunk-A5QCIG5R.mjs.map +7 -0
- package/dist/lib/browser/{chunk-EJSGYGYH.mjs → chunk-LY5XDQR5.mjs} +84 -12
- package/dist/lib/browser/chunk-LY5XDQR5.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +1322 -811
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +30 -24
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/browser/translations.mjs +9 -0
- package/dist/lib/browser/translations.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-B7MXDDMJ.mjs → chunk-NGKLIKP3.mjs} +84 -12
- package/dist/lib/node-esm/chunk-NGKLIKP3.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XCFLA74M.mjs +26 -0
- package/dist/lib/node-esm/chunk-XCFLA74M.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +1322 -811
- 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 +30 -24
- package/dist/lib/node-esm/testing/index.mjs.map +3 -3
- package/dist/lib/node-esm/translations.mjs +10 -0
- package/dist/lib/node-esm/translations.mjs.map +7 -0
- 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.map +1 -1
- package/dist/types/src/components/Button/Button.stories.d.ts +1 -1
- package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -1
- package/dist/types/src/components/Button/IconButton.d.ts +1 -0
- 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.stories.d.ts.map +1 -1
- package/dist/types/src/components/Button/ToggleGroup.d.ts +2 -2
- package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +2 -2
- package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
- package/dist/types/src/components/Card/Card.d.ts +59 -42
- package/dist/types/src/components/Card/Card.d.ts.map +1 -1
- package/dist/types/src/components/Card/Card.stories.d.ts +2 -2
- package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -1
- package/dist/types/src/components/Carousel/Carousel.d.ts +106 -0
- package/dist/types/src/components/Carousel/Carousel.d.ts.map +1 -0
- package/dist/types/src/components/Carousel/index.d.ts +2 -0
- package/dist/types/src/components/Carousel/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.map +1 -1
- package/dist/types/src/components/Clipboard/index.d.ts +1 -1
- package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
- package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
- package/dist/types/src/components/Dialog/AlertDialog.d.ts +34 -23
- 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 +38 -21
- package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
- package/dist/types/src/components/Dialog/Dialog.stories.d.ts +3 -2
- package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
- package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
- package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -1
- package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -1
- package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +14 -3
- package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -1
- package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -1
- package/dist/types/src/components/Focus/Focus.d.ts +36 -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 -0
- 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 +2 -1
- package/dist/types/src/components/Image/Image.d.ts.map +1 -1
- package/dist/types/src/components/Image/Image.stories.d.ts +3 -2
- package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -1
- package/dist/types/src/components/Input/Input.d.ts +12 -15
- package/dist/types/src/components/Input/Input.d.ts.map +1 -1
- package/dist/types/src/components/Input/Input.stories.d.ts +3 -3
- package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
- package/dist/types/src/components/Link/Link.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 +5 -3
- package/dist/types/src/components/List/List.d.ts.map +1 -1
- package/dist/types/src/components/List/List.stories.d.ts +3 -1
- package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
- package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -1
- package/dist/types/src/components/List/Tree.d.ts +2 -2
- 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/TreeDropIndicator.d.ts.map +1 -1
- package/dist/types/src/components/List/Treegrid.d.ts +5 -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 +7 -3
- package/dist/types/src/components/Main/Main.d.ts.map +1 -1
- package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
- package/dist/types/src/components/Main/useSwipeToDismiss.d.ts.map +1 -1
- package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts +46 -0
- package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts.map +1 -0
- package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts +16 -0
- package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts.map +1 -0
- package/dist/types/src/components/MediaPlayer/index.d.ts +2 -0
- package/dist/types/src/components/MediaPlayer/index.d.ts.map +1 -0
- package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -1
- package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -1
- package/dist/types/src/components/Menu/DropdownMenu.d.ts +13 -6
- package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -1
- package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +9 -1
- package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
- 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 +2 -2
- package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
- package/dist/types/src/components/Popover/Popover.d.ts +14 -3
- 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 +12 -9
- package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
- package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +18 -5
- package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
- package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +42 -13
- package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
- package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +5 -6
- package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
- 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/Skeleton/Skeleton.stories.d.ts.map +1 -1
- package/dist/types/src/components/Splitter/Splitter.d.ts +19 -17
- package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -1
- package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -1
- 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.map +1 -1
- package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
- package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +1 -1
- package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
- package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts +1 -1
- package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -1
- package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +54 -55
- package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
- package/dist/types/src/components/ThemeProvider/index.d.ts +1 -1
- package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
- package/dist/types/src/components/Toast/Toast.d.ts +4 -4
- 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 +11 -15
- 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 +8 -8
- 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 +3 -0
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/exemplars/generics.stories.d.ts +6 -5
- package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -1
- package/dist/types/src/exemplars/slot.stories.d.ts +1 -0
- package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -1
- package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -1
- package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -1
- package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
- package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
- package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
- package/dist/types/src/hooks/useIconHref.d.ts.map +1 -1
- package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
- package/dist/types/src/hooks/useSafeCollisionPadding.d.ts.map +1 -1
- package/dist/types/src/hooks/useVisualViewport.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 +1 -1
- package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
- package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
- package/dist/types/src/primitives/Column/Column.d.ts +21 -14
- package/dist/types/src/primitives/Column/Column.d.ts.map +1 -1
- package/dist/types/src/primitives/Column/Column.stories.d.ts +19 -0
- package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -1
- package/dist/types/src/primitives/Container/Container.d.ts +4 -5
- package/dist/types/src/primitives/Container/Container.d.ts.map +1 -1
- package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -1
- package/dist/types/src/primitives/Flex/Flex.d.ts +5 -7
- package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -1
- package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -1
- package/dist/types/src/primitives/Grid/Grid.d.ts +3 -8
- package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -1
- package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -1
- package/dist/types/src/primitives/Panel/Panel.d.ts +24 -15
- package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -1
- package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -1
- package/dist/types/src/testing/Loading.d.ts.map +1 -1
- package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
- package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
- package/dist/types/src/testing/decorators/withTheme.d.ts +1 -1
- package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +8 -3
- package/dist/types/src/translations.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 +29 -26
- package/src/components/Avatars/Avatar.stories.tsx +2 -3
- package/src/components/Avatars/Avatar.tsx +1 -2
- package/src/components/Avatars/AvatarGroup.stories.tsx +0 -1
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -2
- package/src/components/Button/Button.stories.tsx +0 -1
- package/src/components/Button/Button.tsx +3 -11
- package/src/components/Button/IconButton.stories.tsx +6 -4
- package/src/components/Button/IconButton.tsx +3 -3
- package/src/components/Button/Toggle.stories.tsx +0 -1
- package/src/components/Button/ToggleGroup.stories.tsx +0 -1
- package/src/components/Card/Card.stories.tsx +15 -15
- package/src/components/Card/Card.tsx +190 -66
- package/src/components/Carousel/Carousel.tsx +379 -0
- package/src/components/Carousel/index.ts +5 -0
- package/src/components/Clipboard/CopyButton.tsx +5 -6
- package/src/components/Dialog/AlertDialog.stories.tsx +5 -6
- package/src/components/Dialog/AlertDialog.tsx +51 -93
- package/src/components/Dialog/Dialog.stories.tsx +64 -9
- package/src/components/Dialog/Dialog.tsx +66 -56
- package/src/components/ErrorFallback/ErrorFallback.stories.tsx +3 -8
- package/src/components/ErrorFallback/ErrorStack.tsx +36 -2
- 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 +43 -13
- package/src/components/Icon/Icon.tsx +13 -3
- package/src/components/Image/Image.stories.tsx +3 -3
- package/src/components/Image/Image.tsx +31 -8
- package/src/components/Input/Input.stories.tsx +3 -4
- package/src/components/Input/Input.tsx +3 -3
- package/src/components/Link/Link.stories.tsx +0 -1
- package/src/components/Link/Link.tsx +10 -2
- package/src/components/List/List.stories.tsx +1 -2
- package/src/components/List/List.tsx +7 -6
- package/src/components/List/ListDropIndicator.tsx +0 -1
- package/src/components/List/Tree.stories.tsx +2 -3
- package/src/components/List/Tree.tsx +0 -1
- package/src/components/List/Treegrid.stories.tsx +26 -27
- package/src/components/List/Treegrid.tsx +14 -14
- package/src/components/Main/Main.stories.tsx +0 -1
- package/src/components/Main/Main.tsx +0 -1
- package/src/components/MediaPlayer/MediaPlayer.stories.tsx +50 -0
- package/src/components/MediaPlayer/MediaPlayer.tsx +153 -0
- package/src/components/MediaPlayer/index.ts +5 -0
- package/src/components/Menu/ContextMenu.stories.tsx +0 -1
- package/src/components/Menu/DropdownMenu.stories.tsx +0 -1
- package/src/components/Menu/DropdownMenu.tsx +3 -3
- package/src/components/Message/Message.stories.tsx +7 -8
- package/src/components/Message/Message.tsx +23 -10
- package/src/components/Popover/Popover.stories.tsx +4 -5
- package/src/components/Popover/Popover.tsx +1 -1
- package/src/components/ScrollArea/ScrollArea.stories.tsx +89 -30
- package/src/components/ScrollArea/ScrollArea.tsx +39 -23
- package/src/components/ScrollContainer/ScrollContainer.stories.tsx +19 -17
- package/src/components/ScrollContainer/ScrollContainer.tsx +199 -92
- package/src/components/Select/Select.stories.tsx +5 -6
- package/src/components/Skeleton/Skeleton.stories.tsx +0 -1
- package/src/components/Splitter/Splitter.stories.tsx +29 -29
- package/src/components/Splitter/Splitter.tsx +35 -34
- package/src/components/Status/Status.stories.tsx +0 -1
- package/src/components/Status/Status.tsx +8 -5
- package/src/components/Tag/Tag.stories.tsx +0 -1
- package/src/components/ThemeProvider/ThemeProvider.stories.tsx +0 -1
- package/src/components/ThemeProvider/ThemeProvider.tsx +5 -4
- package/src/components/ThemeProvider/index.ts +1 -1
- package/src/components/Toast/Toast.stories.tsx +0 -1
- package/src/components/Toolbar/Toolbar.stories.tsx +0 -1
- package/src/components/Toolbar/Toolbar.tsx +19 -15
- package/src/components/Tooltip/Tooltip.stories.tsx +7 -8
- package/src/components/Tooltip/Tooltip.tsx +14 -13
- package/src/components/index.ts +3 -0
- package/src/exemplars/generics.stories.tsx +7 -15
- package/src/exemplars/slot.stories.tsx +65 -57
- package/src/exemplars/tabster.stories.tsx +1 -1
- package/src/exemplars/virtualizer.stories.tsx +4 -5
- package/src/hooks/useDensityContext.ts +2 -2
- package/src/playground/Custom.stories.tsx +6 -9
- package/src/primitives/Column/AUDIT.md +148 -0
- package/src/primitives/Column/Column.stories.tsx +122 -19
- package/src/primitives/Column/Column.tsx +73 -41
- package/src/primitives/Container/Container.stories.tsx +0 -1
- package/src/primitives/Container/Container.tsx +5 -8
- package/src/primitives/Flex/Flex.stories.tsx +0 -1
- package/src/primitives/Flex/Flex.tsx +10 -12
- package/src/primitives/Grid/Grid.stories.tsx +0 -1
- package/src/primitives/Grid/Grid.tsx +4 -9
- package/src/primitives/Panel/Panel.stories.tsx +8 -7
- package/src/primitives/Panel/Panel.tsx +64 -63
- package/src/testing/Loading.tsx +25 -4
- package/src/testing/decorators/withLayout.tsx +7 -17
- package/src/testing/decorators/withTheme.tsx +10 -7
- package/src/translations.ts +8 -3
- package/src/util/usePx.ts +1 -0
- package/dist/lib/browser/chunk-EJSGYGYH.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-B7MXDDMJ.mjs.map +0 -7
|
@@ -5,15 +5,15 @@
|
|
|
5
5
|
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
6
6
|
import React from 'react';
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import { random } from '@dxos/random';
|
|
9
9
|
|
|
10
10
|
import { withTheme } from '../../testing';
|
|
11
11
|
import { Button } from '../Button';
|
|
12
12
|
import { Input } from '../Input';
|
|
13
|
-
|
|
13
|
+
import { ScrollArea } from '../ScrollArea';
|
|
14
14
|
import { Dialog, type DialogContentProps } from './Dialog';
|
|
15
15
|
|
|
16
|
-
type
|
|
16
|
+
type DefaultStoryProps = Pick<DialogContentProps, 'size'> &
|
|
17
17
|
Partial<{
|
|
18
18
|
title: string;
|
|
19
19
|
description: string;
|
|
@@ -22,7 +22,11 @@ type StoryProps = Pick<DialogContentProps, 'size'> &
|
|
|
22
22
|
blockAlign: 'start' | 'center';
|
|
23
23
|
}>;
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Standard Dialog with non-scrolling content in Dialog.Body.
|
|
27
|
+
* Dialog.Body propagates the Column grid via subgrid. Children auto-center via --dx-col.
|
|
28
|
+
*/
|
|
29
|
+
const DefaultStory = ({ size, title, description, openTrigger, closeTrigger, blockAlign }: DefaultStoryProps) => {
|
|
26
30
|
return (
|
|
27
31
|
<Dialog.Root defaultOpen modal>
|
|
28
32
|
<Dialog.Trigger asChild>
|
|
@@ -56,6 +60,45 @@ const DefaultStory = ({ size, title, description, openTrigger, closeTrigger, blo
|
|
|
56
60
|
);
|
|
57
61
|
};
|
|
58
62
|
|
|
63
|
+
/**
|
|
64
|
+
* Dialog with a ScrollArea child inside Dialog.Body.
|
|
65
|
+
* The ScrollArea breaks out of Body's gutter padding via `--gutter`
|
|
66
|
+
* and applies its own asymmetric padding (accounting for scrollbar width).
|
|
67
|
+
*/
|
|
68
|
+
const ScrollingStory = ({ size, title, description, openTrigger, closeTrigger, blockAlign }: DefaultStoryProps) => {
|
|
69
|
+
return (
|
|
70
|
+
<Dialog.Root defaultOpen modal>
|
|
71
|
+
<Dialog.Trigger asChild>
|
|
72
|
+
<Button>{openTrigger}</Button>
|
|
73
|
+
</Dialog.Trigger>
|
|
74
|
+
<Dialog.Overlay blockAlign={blockAlign}>
|
|
75
|
+
<Dialog.Content size={size}>
|
|
76
|
+
<Dialog.Header>
|
|
77
|
+
<Dialog.Title>{title}</Dialog.Title>
|
|
78
|
+
{closeTrigger && (
|
|
79
|
+
<Dialog.Close asChild>
|
|
80
|
+
<Dialog.CloseIconButton />
|
|
81
|
+
</Dialog.Close>
|
|
82
|
+
)}
|
|
83
|
+
</Dialog.Header>
|
|
84
|
+
<Dialog.Body>
|
|
85
|
+
<ScrollArea.Root orientation='vertical' padding thin>
|
|
86
|
+
<ScrollArea.Viewport>
|
|
87
|
+
<Dialog.Description>{description}</Dialog.Description>
|
|
88
|
+
</ScrollArea.Viewport>
|
|
89
|
+
</ScrollArea.Root>
|
|
90
|
+
</Dialog.Body>
|
|
91
|
+
<Dialog.ActionBar>
|
|
92
|
+
<Dialog.Close asChild>
|
|
93
|
+
<Button variant='primary'>{closeTrigger}</Button>
|
|
94
|
+
</Dialog.Close>
|
|
95
|
+
</Dialog.ActionBar>
|
|
96
|
+
</Dialog.Content>
|
|
97
|
+
</Dialog.Overlay>
|
|
98
|
+
</Dialog.Root>
|
|
99
|
+
);
|
|
100
|
+
};
|
|
101
|
+
|
|
59
102
|
const meta = {
|
|
60
103
|
title: 'ui/react-ui-core/components/Dialog',
|
|
61
104
|
component: Dialog as any,
|
|
@@ -70,7 +113,7 @@ type Story = StoryObj<typeof meta>;
|
|
|
70
113
|
export const Default: Story = {
|
|
71
114
|
args: {
|
|
72
115
|
title: 'Dialog title',
|
|
73
|
-
description:
|
|
116
|
+
description: random.lorem.paragraph(1),
|
|
74
117
|
openTrigger: 'Open',
|
|
75
118
|
closeTrigger: 'Close',
|
|
76
119
|
blockAlign: 'start',
|
|
@@ -80,7 +123,7 @@ export const Default: Story = {
|
|
|
80
123
|
export const Small: Story = {
|
|
81
124
|
args: {
|
|
82
125
|
title: 'Dialog title',
|
|
83
|
-
description:
|
|
126
|
+
description: random.lorem.paragraph(1),
|
|
84
127
|
openTrigger: 'Open',
|
|
85
128
|
closeTrigger: 'Close',
|
|
86
129
|
blockAlign: 'center',
|
|
@@ -91,7 +134,7 @@ export const Small: Story = {
|
|
|
91
134
|
export const Medium: Story = {
|
|
92
135
|
args: {
|
|
93
136
|
title: 'Dialog title',
|
|
94
|
-
description:
|
|
137
|
+
description: random.lorem.paragraph(1),
|
|
95
138
|
openTrigger: 'Open',
|
|
96
139
|
closeTrigger: 'Close',
|
|
97
140
|
blockAlign: 'center',
|
|
@@ -102,7 +145,7 @@ export const Medium: Story = {
|
|
|
102
145
|
export const Large: Story = {
|
|
103
146
|
args: {
|
|
104
147
|
title: 'Dialog title',
|
|
105
|
-
description:
|
|
148
|
+
description: random.lorem.paragraph(2),
|
|
106
149
|
openTrigger: 'Open Dialog',
|
|
107
150
|
closeTrigger: 'Close',
|
|
108
151
|
blockAlign: 'center',
|
|
@@ -113,10 +156,22 @@ export const Large: Story = {
|
|
|
113
156
|
export const ExtraLarge: Story = {
|
|
114
157
|
args: {
|
|
115
158
|
title: 'Dialog title',
|
|
116
|
-
description:
|
|
159
|
+
description: random.lorem.paragraph(2),
|
|
117
160
|
openTrigger: 'Open Dialog',
|
|
118
161
|
closeTrigger: 'Close',
|
|
119
162
|
blockAlign: 'center',
|
|
120
163
|
size: 'xl',
|
|
121
164
|
},
|
|
122
165
|
};
|
|
166
|
+
|
|
167
|
+
export const Scrolling: Story = {
|
|
168
|
+
render: ScrollingStory,
|
|
169
|
+
args: {
|
|
170
|
+
title: 'Dialog title',
|
|
171
|
+
description: random.lorem.paragraph(20),
|
|
172
|
+
openTrigger: 'Open Dialog',
|
|
173
|
+
closeTrigger: 'Close',
|
|
174
|
+
blockAlign: 'center',
|
|
175
|
+
size: 'md',
|
|
176
|
+
},
|
|
177
|
+
};
|
|
@@ -2,18 +2,20 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import * as DialogPrimitive from '@radix-ui/react-dialog';
|
|
6
5
|
import { createContext } from '@radix-ui/react-context';
|
|
6
|
+
import * as DialogPrimitive from '@radix-ui/react-dialog';
|
|
7
|
+
import { Primitive } from '@radix-ui/react-primitive';
|
|
8
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
7
9
|
import React, {
|
|
8
10
|
type ComponentPropsWithRef,
|
|
9
11
|
type ForwardRefExoticComponent,
|
|
10
12
|
type FunctionComponent,
|
|
11
|
-
type PropsWithChildren,
|
|
12
13
|
forwardRef,
|
|
13
14
|
} from 'react';
|
|
14
15
|
import { useTranslation } from 'react-i18next';
|
|
15
16
|
|
|
16
|
-
import { type DialogSize, osTranslations } from '@dxos/ui-theme';
|
|
17
|
+
import { composableProps, type DialogSize, osTranslations, slottable } from '@dxos/ui-theme';
|
|
18
|
+
import { type SlottableProps } from '@dxos/ui-types';
|
|
17
19
|
|
|
18
20
|
import { useThemeContext } from '../../hooks';
|
|
19
21
|
import { Column } from '../../primitives';
|
|
@@ -29,7 +31,12 @@ type DialogRootProps = DialogPrimitive.DialogProps;
|
|
|
29
31
|
|
|
30
32
|
const DialogRoot: FunctionComponent<DialogRootProps> = (props) => (
|
|
31
33
|
<ElevationProvider elevation='dialog'>
|
|
32
|
-
<DialogPrimitive.Root
|
|
34
|
+
<DialogPrimitive.Root
|
|
35
|
+
// NOTE: Radix warning unless set to undefined.
|
|
36
|
+
// https://www.radix-ui.com/primitives/docs/components/dialog#description
|
|
37
|
+
aria-describedby={undefined}
|
|
38
|
+
{...props}
|
|
39
|
+
/>
|
|
33
40
|
</ElevationProvider>
|
|
34
41
|
);
|
|
35
42
|
|
|
@@ -107,10 +114,19 @@ const DialogContent: ForwardRefExoticComponent<DialogContentProps> = forwardRef<
|
|
|
107
114
|
// NOTE: Radix warning unless set to undefined.
|
|
108
115
|
// https://www.radix-ui.com/primitives/docs/components/dialog#description
|
|
109
116
|
aria-describedby={undefined}
|
|
110
|
-
className={tx(
|
|
117
|
+
className={tx(
|
|
118
|
+
'dialog.content',
|
|
119
|
+
{
|
|
120
|
+
size,
|
|
121
|
+
inOverlayLayout: propsInOverlayLayout || inOverlayLayout,
|
|
122
|
+
},
|
|
123
|
+
classNames,
|
|
124
|
+
)}
|
|
111
125
|
ref={forwardedRef}
|
|
112
126
|
>
|
|
113
|
-
<Column.Root gutter='
|
|
127
|
+
<Column.Root classNames='dx-expander' gutter='sm'>
|
|
128
|
+
{children}
|
|
129
|
+
</Column.Root>
|
|
114
130
|
</DialogPrimitive.Content>
|
|
115
131
|
);
|
|
116
132
|
},
|
|
@@ -122,18 +138,18 @@ DialogContent.displayName = DIALOG_CONTENT_NAME;
|
|
|
122
138
|
// Header
|
|
123
139
|
//
|
|
124
140
|
|
|
125
|
-
type DialogHeaderProps =
|
|
141
|
+
type DialogHeaderProps = SlottableProps;
|
|
126
142
|
|
|
127
|
-
const DialogHeader
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
);
|
|
143
|
+
const DialogHeader = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
|
|
144
|
+
const { className, ...rest } = composableProps(props);
|
|
145
|
+
const Comp = asChild ? Slot : Primitive.div;
|
|
146
|
+
const { tx } = useThemeContext();
|
|
147
|
+
return (
|
|
148
|
+
<Comp {...rest} className={tx('dialog.header', {}, className)} ref={forwardedRef}>
|
|
149
|
+
{children}
|
|
150
|
+
</Comp>
|
|
151
|
+
);
|
|
152
|
+
});
|
|
137
153
|
|
|
138
154
|
//
|
|
139
155
|
// CloseIconButton
|
|
@@ -147,11 +163,10 @@ const DialogCloseIconButton = forwardRef<HTMLButtonElement, DialogCloseIconButto
|
|
|
147
163
|
return (
|
|
148
164
|
<IconButton
|
|
149
165
|
{...props}
|
|
150
|
-
label={label ?? t('close
|
|
166
|
+
label={label ?? t('close-dialog.label')}
|
|
151
167
|
icon='ph--x--regular'
|
|
152
168
|
iconOnly
|
|
153
169
|
size={4}
|
|
154
|
-
density='fine'
|
|
155
170
|
variant='ghost'
|
|
156
171
|
ref={forwardedRef}
|
|
157
172
|
/>
|
|
@@ -163,20 +178,18 @@ const DialogCloseIconButton = forwardRef<HTMLButtonElement, DialogCloseIconButto
|
|
|
163
178
|
// Body
|
|
164
179
|
//
|
|
165
180
|
|
|
166
|
-
type DialogBodyProps =
|
|
181
|
+
type DialogBodyProps = SlottableProps;
|
|
167
182
|
|
|
168
|
-
const DialogBody
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
},
|
|
179
|
-
);
|
|
183
|
+
const DialogBody = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
|
|
184
|
+
const { className, ...rest } = composableProps(props);
|
|
185
|
+
const Comp = asChild ? Slot : Primitive.div;
|
|
186
|
+
const { tx } = useThemeContext();
|
|
187
|
+
return (
|
|
188
|
+
<Comp {...rest} className={tx('dialog.body', {}, className)} ref={forwardedRef}>
|
|
189
|
+
{children}
|
|
190
|
+
</Comp>
|
|
191
|
+
);
|
|
192
|
+
});
|
|
180
193
|
|
|
181
194
|
//
|
|
182
195
|
// Title
|
|
@@ -184,7 +197,7 @@ const DialogBody: ForwardRefExoticComponent<DialogBodyProps> = forwardRef<HTMLDi
|
|
|
184
197
|
|
|
185
198
|
type DialogTitleProps = ThemedClassName<DialogPrimitive.DialogTitleProps> & { srOnly?: boolean };
|
|
186
199
|
|
|
187
|
-
const DialogTitle
|
|
200
|
+
const DialogTitle = forwardRef<HTMLHeadingElement, DialogTitleProps>(
|
|
188
201
|
({ classNames, srOnly, ...props }, forwardedRef) => {
|
|
189
202
|
const { tx } = useThemeContext();
|
|
190
203
|
return (
|
|
@@ -199,37 +212,33 @@ const DialogTitle: ForwardRefExoticComponent<DialogTitleProps> = forwardRef<HTML
|
|
|
199
212
|
|
|
200
213
|
type DialogDescriptionProps = ThemedClassName<DialogPrimitive.DialogDescriptionProps> & { srOnly?: boolean };
|
|
201
214
|
|
|
202
|
-
const DialogDescription
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
});
|
|
215
|
+
const DialogDescription = forwardRef<HTMLParagraphElement, DialogDescriptionProps>(
|
|
216
|
+
({ classNames, srOnly, ...props }, forwardedRef) => {
|
|
217
|
+
const { tx } = useThemeContext();
|
|
218
|
+
return (
|
|
219
|
+
<DialogPrimitive.Description
|
|
220
|
+
{...props}
|
|
221
|
+
className={tx('dialog.description', { srOnly }, classNames)}
|
|
222
|
+
ref={forwardedRef}
|
|
223
|
+
/>
|
|
224
|
+
);
|
|
225
|
+
},
|
|
226
|
+
);
|
|
215
227
|
|
|
216
228
|
//
|
|
217
229
|
// ActionBar
|
|
218
230
|
//
|
|
219
231
|
|
|
220
|
-
type DialogActionBarProps =
|
|
232
|
+
type DialogActionBarProps = SlottableProps;
|
|
221
233
|
|
|
222
|
-
const DialogActionBar
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
>(({ children, classNames, ...props }, forwardedRef) => {
|
|
234
|
+
const DialogActionBar = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
|
|
235
|
+
const { className: classNames, ...rest } = composableProps(props);
|
|
236
|
+
const Comp = asChild ? Slot : Primitive.div;
|
|
226
237
|
const { tx } = useThemeContext();
|
|
227
238
|
return (
|
|
228
|
-
<
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
</div>
|
|
232
|
-
</Column.Segment>
|
|
239
|
+
<Comp {...rest} className={tx('dialog.actionbar', {}, classNames)} ref={forwardedRef}>
|
|
240
|
+
{children}
|
|
241
|
+
</Comp>
|
|
233
242
|
);
|
|
234
243
|
});
|
|
235
244
|
|
|
@@ -272,4 +281,5 @@ export type {
|
|
|
272
281
|
DialogDescriptionProps,
|
|
273
282
|
DialogActionBarProps,
|
|
274
283
|
DialogCloseProps,
|
|
284
|
+
DialogCloseIconButtonProps,
|
|
275
285
|
};
|
|
@@ -8,11 +8,10 @@ import React from 'react';
|
|
|
8
8
|
import { ErrorBoundary } from '@dxos/react-error-boundary';
|
|
9
9
|
|
|
10
10
|
import { withLayout, withTheme } from '../../testing';
|
|
11
|
-
|
|
12
11
|
import { ErrorFallback } from './ErrorFallback';
|
|
13
12
|
import { ThrowError } from './ThrowError';
|
|
14
13
|
|
|
15
|
-
const
|
|
14
|
+
const DefaultStory = () => {
|
|
16
15
|
return (
|
|
17
16
|
<ErrorBoundary name='story' FallbackComponent={ErrorFallback}>
|
|
18
17
|
<ThrowError />
|
|
@@ -20,10 +19,6 @@ const BasicStory = () => {
|
|
|
20
19
|
);
|
|
21
20
|
};
|
|
22
21
|
|
|
23
|
-
const StringErrorStory = () => {
|
|
24
|
-
return <ErrorFallback error='This is a string error message' data={{ context: 'story' }} />;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
22
|
const meta: Meta = {
|
|
28
23
|
title: 'ui/react-ui-core/components/ErrorFallback',
|
|
29
24
|
component: ErrorFallback,
|
|
@@ -38,7 +33,7 @@ export default meta;
|
|
|
38
33
|
type Story = StoryObj<typeof meta>;
|
|
39
34
|
|
|
40
35
|
export const Default: Story = {
|
|
41
|
-
render:
|
|
36
|
+
render: DefaultStory,
|
|
42
37
|
play: async () => {
|
|
43
38
|
// This story intentionally renders an ErrorBoundary fallback; clear the smoke-test error flag.
|
|
44
39
|
(window as any).__ERROR_BOUNDARY_ERRORS__ = [];
|
|
@@ -46,5 +41,5 @@ export const Default: Story = {
|
|
|
46
41
|
};
|
|
47
42
|
|
|
48
43
|
export const StringError: Story = {
|
|
49
|
-
render:
|
|
44
|
+
render: () => <ErrorFallback error='This is a string error message' data={{ context: 'story' }} />,
|
|
50
45
|
};
|
|
@@ -9,11 +9,45 @@ import { mx } from '@dxos/ui-theme';
|
|
|
9
9
|
|
|
10
10
|
type LocalFrame = { href: string; fileName: string };
|
|
11
11
|
|
|
12
|
+
export type ParsedStackFrame = ReturnType<typeof ErrorStackParser.parse>[number];
|
|
13
|
+
|
|
14
|
+
export type ErrorStackProps = {
|
|
15
|
+
/** When set, these frames are shown instead of parsing `error`. */
|
|
16
|
+
frames?: ParsedStackFrame[];
|
|
17
|
+
/** Used when `frames` is omitted. */
|
|
18
|
+
error?: Error;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Parses `captureOwnerStack()` output (React dev) into frames for {@link ErrorStack}.
|
|
23
|
+
* Prefixes a synthetic Error line when needed so `error-stack-parser` can read V8-style stacks.
|
|
24
|
+
*/
|
|
25
|
+
export const parseCaptureOwnerStack = (stack: string | null): ParsedStackFrame[] | null => {
|
|
26
|
+
if (stack == null || stack.length === 0) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const err = new Error();
|
|
30
|
+
err.stack = stack;
|
|
31
|
+
try {
|
|
32
|
+
return ErrorStackParser.parse(err);
|
|
33
|
+
} catch {
|
|
34
|
+
err.stack = `Error\n${stack}`;
|
|
35
|
+
try {
|
|
36
|
+
return ErrorStackParser.parse(err);
|
|
37
|
+
} catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
|
|
12
43
|
/**
|
|
13
44
|
* Renders a parsed error stack trace with tree connector symbols and clickable vscode:// links for local frames.
|
|
14
45
|
*/
|
|
15
|
-
export const ErrorStack = ({ error
|
|
16
|
-
const frames = ErrorStackParser.parse(error);
|
|
46
|
+
export const ErrorStack = ({ error, frames: framesProp }: ErrorStackProps) => {
|
|
47
|
+
const frames = framesProp ?? (error ? ErrorStackParser.parse(error) : []);
|
|
48
|
+
if (frames.length === 0) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
17
51
|
|
|
18
52
|
return (
|
|
19
53
|
<div className='font-mono text-sm'>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Focus
|
|
2
|
+
|
|
3
|
+
## Problem
|
|
4
|
+
|
|
5
|
+
Grid cells use `overflow-hidden` which clips outward CSS `ring` (box-shadow) and `outline` styles.
|
|
6
|
+
Using `border` for focus indicators creates doubled lines at grid cell boundaries.
|
|
7
|
+
Inset `box-shadow` alone is obscured by child elements with backgrounds (e.g., toolbar headers).
|
|
8
|
+
|
|
9
|
+
## Solution
|
|
10
|
+
|
|
11
|
+
Uses a `::after` pseudo-element overlay with `ring-inset` to paint the focus ring above all child content.
|
|
12
|
+
The pseudo-element is absolutely positioned, `pointer-events-none`, and inherits `border-radius`.
|
|
13
|
+
|
|
14
|
+
- **Default**: ring is transparent (invisible until focused).
|
|
15
|
+
- **`border` prop**: shows a CSS `border-separator` when unfocused (e.g., for grid cell edges).
|
|
16
|
+
- **Focus/active/error states**: ring color changes to the appropriate indicator color.
|
|
17
|
+
|
|
18
|
+
Both `Focus.Group` and `Focus.Item` support the `border` prop.
|
|
19
|
+
|
|
20
|
+
## Why `::after` overlay
|
|
21
|
+
|
|
22
|
+
| Approach | Clipped? | Obscured by children? | Notes |
|
|
23
|
+
| ------------------------ | -------- | --------------------- | --------------------------------------------------------------------- |
|
|
24
|
+
| `ring` (outward) | Yes | N/A | Extends outside bounds, clipped by parent `overflow-hidden`. |
|
|
25
|
+
| `ring-inset` | No | Yes | Inset box-shadow is part of background layer; children paint over it. |
|
|
26
|
+
| `::after` + `ring-inset` | No | No | Pseudo-element paints above children. Requires `position: relative`. |
|
|
27
|
+
|
|
28
|
+
## Relationship to `dx-focus-ring-inset-over-all`
|
|
29
|
+
|
|
30
|
+
The CSS class `dx-focus-ring-inset-over-all` (in `focus-ring.css`) uses the same `::after` technique
|
|
31
|
+
but only reacts to `:focus-visible`. `Focus.Group/Item` additionally support programmatic states
|
|
32
|
+
via `data-focus-state` (`active`, `error`).
|
|
33
|
+
|
|
34
|
+
## Clean-up
|
|
35
|
+
|
|
36
|
+
- [ ] Unify: extend `dx-focus-ring-inset-over-all` to support `data-focus-state` attributes,
|
|
37
|
+
then have `Focus.Group/Item` use the CSS class instead of inline Tailwind utilities.
|
|
38
|
+
Consumers: Plank, StackItem, Tabs, AttentionProvider, main sidebar.
|
|
39
|
+
|
|
40
|
+
## Audit
|
|
41
|
+
|
|
42
|
+
- [ ] Create a list of all container components (outside of `react-ui`) that directly use `overflow-hidden`;
|
|
43
|
+
Consider containers to be components that have `children` and expand (e.g., `grid`, `grow`, `h-full`, `w-full`).
|