@dxos/react-ui 0.8.4-main.d05673bc65 → 0.8.4-main.dfabb4ec29
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-2FKSMWNY.mjs → chunk-BDBC6H6V.mjs} +79 -5
- package/dist/lib/browser/chunk-BDBC6H6V.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +949 -758
- 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 +18 -0
- package/dist/lib/browser/translations.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-ZNBLTSHI.mjs → chunk-3JSJK2ZY.mjs} +79 -5
- package/dist/lib/node-esm/chunk-3JSJK2ZY.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +949 -758
- 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 +20 -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 +2 -2
- 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.d.ts +2 -2
- package/dist/types/src/components/Button/Toggle.d.ts.map +1 -1
- package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -1
- package/dist/types/src/components/Button/ToggleGroup.d.ts +6 -6
- package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -1
- 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 +68 -51
- 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/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 +10 -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 +42 -31
- 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 +47 -30
- 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 +14 -17
- 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.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/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 +58 -49
- package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -1
- package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +14 -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 +38 -22
- 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/Separator/Separator.d.ts +3 -3
- package/dist/types/src/components/Separator/Separator.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 +16 -16
- 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 -19
- 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 +10 -10
- 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 +1 -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/index.d.ts +1 -0
- package/dist/types/src/hooks/index.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 +3 -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 +28 -25
- 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 +5 -13
- package/src/components/Button/IconButton.stories.tsx +6 -4
- package/src/components/Button/IconButton.tsx +3 -4
- package/src/components/Button/Toggle.stories.tsx +0 -1
- package/src/components/Button/Toggle.tsx +4 -4
- package/src/components/Button/ToggleGroup.stories.tsx +0 -1
- package/src/components/Button/ToggleGroup.tsx +12 -16
- package/src/components/Card/Card.stories.tsx +15 -15
- package/src/components/Card/Card.tsx +280 -115
- package/src/components/Clipboard/CopyButton.tsx +5 -6
- package/src/components/Dialog/AlertDialog.stories.tsx +5 -6
- package/src/components/Dialog/AlertDialog.tsx +67 -126
- package/src/components/Dialog/Dialog.stories.tsx +64 -9
- package/src/components/Dialog/Dialog.tsx +84 -88
- 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 +14 -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 +7 -7
- package/src/components/Link/Link.stories.tsx +0 -1
- 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 +1 -2
- package/src/components/Menu/ContextMenu.stories.tsx +0 -1
- package/src/components/Menu/DropdownMenu.stories.tsx +0 -1
- package/src/components/Menu/DropdownMenu.tsx +48 -42
- 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 +42 -42
- package/src/components/ScrollArea/ScrollArea.stories.tsx +89 -30
- package/src/components/ScrollArea/ScrollArea.tsx +39 -23
- package/src/components/ScrollContainer/ScrollContainer.stories.tsx +20 -18
- package/src/components/ScrollContainer/ScrollContainer.tsx +199 -92
- package/src/components/Select/Select.stories.tsx +5 -6
- package/src/components/Separator/Separator.tsx +4 -7
- 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/Toast/Toast.tsx +16 -31
- package/src/components/Toolbar/Toolbar.stories.tsx +0 -1
- package/src/components/Toolbar/Toolbar.tsx +21 -35
- package/src/components/Tooltip/Tooltip.stories.tsx +7 -8
- package/src/components/Tooltip/Tooltip.tsx +15 -16
- package/src/components/index.ts +1 -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/index.ts +1 -0
- 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 -42
- 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 +9 -8
- 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 +3 -3
- package/src/util/usePx.ts +1 -0
- package/dist/lib/browser/chunk-2FKSMWNY.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ZNBLTSHI.mjs.map +0 -7
|
@@ -4,10 +4,19 @@
|
|
|
4
4
|
|
|
5
5
|
import { Primitive } from '@radix-ui/react-primitive';
|
|
6
6
|
import { Slot } from '@radix-ui/react-slot';
|
|
7
|
-
import
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
import DOMPurify from 'dompurify';
|
|
8
|
+
import React, {
|
|
9
|
+
CSSProperties,
|
|
10
|
+
MouseEventHandler,
|
|
11
|
+
type PropsWithChildren,
|
|
12
|
+
createContext,
|
|
13
|
+
forwardRef,
|
|
14
|
+
useContext,
|
|
15
|
+
useMemo,
|
|
16
|
+
} from 'react';
|
|
17
|
+
|
|
18
|
+
import { composable, composableProps, iconSize, mx, slottable } from '@dxos/ui-theme';
|
|
19
|
+
import { type Density } from '@dxos/ui-types';
|
|
11
20
|
|
|
12
21
|
import { useThemeContext } from '../../hooks';
|
|
13
22
|
import { Column } from '../../primitives';
|
|
@@ -15,12 +24,21 @@ import { type ThemedClassName } from '../../util';
|
|
|
15
24
|
import { Button } from '../Button';
|
|
16
25
|
import { Icon, type IconProps } from '../Icon';
|
|
17
26
|
import { Image } from '../Image';
|
|
18
|
-
import {
|
|
27
|
+
import {
|
|
28
|
+
Toolbar,
|
|
29
|
+
ToolbarCloseIconButtonProps,
|
|
30
|
+
ToolbarDragHandleProps,
|
|
31
|
+
type ToolbarMenuItem,
|
|
32
|
+
type ToolbarMenuProps,
|
|
33
|
+
type ToolbarRootProps,
|
|
34
|
+
} from '../Toolbar';
|
|
19
35
|
|
|
20
36
|
//
|
|
21
37
|
// Context
|
|
22
38
|
//
|
|
23
39
|
|
|
40
|
+
const CARD_NAME = 'Card';
|
|
41
|
+
|
|
24
42
|
type CardContextValue = {
|
|
25
43
|
menuItems?: CardMenuItem<any>[];
|
|
26
44
|
};
|
|
@@ -32,154 +50,264 @@ const CardContext = createContext<CardContextValue>({});
|
|
|
32
50
|
// Root
|
|
33
51
|
//
|
|
34
52
|
|
|
35
|
-
|
|
36
|
-
HTMLDivElement,
|
|
37
|
-
{
|
|
38
|
-
id?: string;
|
|
39
|
-
border?: boolean;
|
|
40
|
-
fullWidth?: boolean;
|
|
41
|
-
}
|
|
42
|
-
>;
|
|
53
|
+
const CARD_ROOT_NAME = 'Card.Root';
|
|
43
54
|
|
|
44
|
-
|
|
45
|
-
|
|
55
|
+
type CardRootProps = {
|
|
56
|
+
id?: string;
|
|
57
|
+
border?: boolean;
|
|
58
|
+
fullWidth?: boolean;
|
|
59
|
+
density?: Density;
|
|
60
|
+
style?: CSSProperties;
|
|
61
|
+
tabIndex?: number;
|
|
62
|
+
onClick?: MouseEventHandler<HTMLDivElement>;
|
|
63
|
+
'data-selected'?: boolean;
|
|
64
|
+
'data-testid'?: string;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// `Card.Root` does not support `asChild`. The Column grid is the root element
|
|
68
|
+
// (one `<div>` carrying both the `dx-card` and `dx-column-root` classes
|
|
69
|
+
// instead of the previous outer-card + inner-column pair), so caller-provided
|
|
70
|
+
// HTML attributes — `onClick`, `tabIndex`, `style`, `data-*`, `grid-template-rows`
|
|
71
|
+
// overrides via `classNames` — land directly on the grid container. Slot-parents
|
|
72
|
+
// (`Focus.Item asChild`, `Mosaic.Tile asChild`, etc.) continue to work because
|
|
73
|
+
// `composable()` preserves the COMPOSABLE marker that slottable parents check
|
|
74
|
+
// before warning, and Radix `Slot` merges the parent's props onto the inner
|
|
75
|
+
// `<div>` exactly the way `slottable`'s `Slot`/`Primitive.div` branch did.
|
|
76
|
+
const CardRoot = composable<HTMLDivElement, CardRootProps>(
|
|
77
|
+
({ children, id, role, border = true, fullWidth, density, ...props }, forwardedRef) => {
|
|
46
78
|
const { className, ...rest } = composableProps(props);
|
|
47
|
-
const Comp = asChild ? Slot : Primitive.div;
|
|
48
79
|
const { tx } = useThemeContext();
|
|
49
80
|
|
|
50
81
|
return (
|
|
51
|
-
<
|
|
52
|
-
|
|
53
|
-
{
|
|
82
|
+
<Column.Root
|
|
83
|
+
asChild
|
|
84
|
+
gutter={density === 'coarse' ? 'lg' : 'md'}
|
|
85
|
+
classNames={tx('card.root', { border, fullWidth }, className)}
|
|
54
86
|
role={role ?? 'group'}
|
|
55
|
-
className={tx('card.root', { border, fullWidth }, className)}
|
|
56
|
-
ref={forwardedRef}
|
|
57
87
|
>
|
|
58
|
-
<
|
|
59
|
-
|
|
88
|
+
<div {...rest} {...(id && { 'data-object-id': id })} ref={forwardedRef}>
|
|
89
|
+
{children}
|
|
90
|
+
</div>
|
|
91
|
+
</Column.Root>
|
|
60
92
|
);
|
|
61
93
|
},
|
|
62
94
|
);
|
|
63
95
|
|
|
96
|
+
CardRoot.displayName = CARD_ROOT_NAME;
|
|
97
|
+
|
|
64
98
|
//
|
|
65
99
|
// Toolbar
|
|
66
100
|
//
|
|
67
101
|
|
|
68
|
-
|
|
69
|
-
density?: Density;
|
|
70
|
-
};
|
|
102
|
+
const CARD_TOOLBAR_NAME = 'Card.Toolbar';
|
|
71
103
|
|
|
72
|
-
|
|
73
|
-
const CardToolbar = forwardRef<HTMLDivElement, CardToolbarProps>(
|
|
74
|
-
({ children, classNames, density = 'fine', ...props }, forwardedRef) => {
|
|
75
|
-
const { tx } = useThemeContext();
|
|
104
|
+
type CardToolbarProps = ToolbarRootProps;
|
|
76
105
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
106
|
+
const CardToolbar = composable<HTMLDivElement, CardToolbarProps>(({ children, classNames, ...props }, forwardedRef) => {
|
|
107
|
+
const { tx } = useThemeContext();
|
|
108
|
+
|
|
109
|
+
return (
|
|
110
|
+
<Toolbar.Root {...props} style={iconSize(5)} classNames={[tx('card.toolbar', {}), classNames]} ref={forwardedRef}>
|
|
111
|
+
{children}
|
|
112
|
+
</Toolbar.Root>
|
|
113
|
+
);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
CardToolbar.displayName = CARD_TOOLBAR_NAME;
|
|
117
|
+
|
|
118
|
+
//
|
|
119
|
+
// DragHandle
|
|
120
|
+
//
|
|
121
|
+
|
|
122
|
+
const CARD_DRAG_HANDLE_NAME = 'Card.DragHandle';
|
|
123
|
+
|
|
124
|
+
type CardDragHandleProps = ToolbarDragHandleProps;
|
|
125
|
+
|
|
126
|
+
const CardDragHandle = forwardRef<HTMLButtonElement, CardDragHandleProps>((props, forwardedRef) => {
|
|
127
|
+
return (
|
|
128
|
+
<CardIconBlock padding>
|
|
129
|
+
<Toolbar.DragHandle {...props} ref={forwardedRef} />
|
|
130
|
+
</CardIconBlock>
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
CardDragHandle.displayName = CARD_DRAG_HANDLE_NAME;
|
|
88
135
|
|
|
89
136
|
//
|
|
90
|
-
//
|
|
137
|
+
// CloseIconButton
|
|
91
138
|
//
|
|
92
139
|
|
|
140
|
+
const CARD_CLOSE_ICON_BUTTON_NAME = 'Card.CloseIconButton';
|
|
141
|
+
|
|
142
|
+
type CloseIconButtonProps = ToolbarCloseIconButtonProps;
|
|
143
|
+
|
|
144
|
+
const CloseIconButton = forwardRef<HTMLButtonElement, CloseIconButtonProps>((props, forwardedRef) => {
|
|
145
|
+
return (
|
|
146
|
+
<CardIconBlock padding>
|
|
147
|
+
<Toolbar.CloseIconButton {...props} ref={forwardedRef} />
|
|
148
|
+
</CardIconBlock>
|
|
149
|
+
);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
CloseIconButton.displayName = CARD_CLOSE_ICON_BUTTON_NAME;
|
|
153
|
+
|
|
154
|
+
//
|
|
155
|
+
// Menu
|
|
156
|
+
//
|
|
157
|
+
|
|
158
|
+
const CARD_MENU_NAME = 'Card.Menu';
|
|
159
|
+
|
|
93
160
|
type CardMenuItem<T extends any | void = void> = ToolbarMenuItem<T>;
|
|
161
|
+
|
|
94
162
|
type CardMenuProps<T extends any | void = void> = ToolbarMenuProps<T>;
|
|
95
163
|
|
|
96
|
-
const CardMenu = <T extends any | void = void>({ context, items }: CardMenuProps<T>) => {
|
|
164
|
+
const CardMenu = <T extends any | void = void>({ context, items, ...props }: CardMenuProps<T>) => {
|
|
97
165
|
const { menuItems } = useContext(CardContext) ?? {};
|
|
98
166
|
const combinedItems = [...(items ?? []), ...((menuItems as CardMenuItem<T>[]) ?? [])];
|
|
99
167
|
|
|
100
|
-
return
|
|
168
|
+
return (
|
|
169
|
+
<CardIconBlock padding>
|
|
170
|
+
<Toolbar.Menu {...props} context={context} items={combinedItems} />
|
|
171
|
+
</CardIconBlock>
|
|
172
|
+
);
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
(CardMenu as any).displayName = CARD_MENU_NAME;
|
|
176
|
+
|
|
177
|
+
//
|
|
178
|
+
// Icon
|
|
179
|
+
//
|
|
180
|
+
|
|
181
|
+
const CARD_ICON_NAME = 'Card.Icon';
|
|
182
|
+
|
|
183
|
+
const CardIcon = (props: IconProps) => {
|
|
184
|
+
return (
|
|
185
|
+
<CardIconBlock>
|
|
186
|
+
<Icon {...props} />
|
|
187
|
+
</CardIconBlock>
|
|
188
|
+
);
|
|
101
189
|
};
|
|
102
190
|
|
|
191
|
+
(CardIcon as any).displayName = CARD_ICON_NAME;
|
|
192
|
+
|
|
193
|
+
//
|
|
194
|
+
// IconBlock
|
|
195
|
+
//
|
|
196
|
+
|
|
197
|
+
const CARD_ICON_BLOCK_NAME = 'Card.IconBlock';
|
|
198
|
+
|
|
199
|
+
const CardIconBlock = forwardRef<HTMLDivElement, ThemedClassName<PropsWithChildren<{ padding?: boolean }>>>(
|
|
200
|
+
({ classNames, children, padding, ...props }, forwardedRef) => {
|
|
201
|
+
const { tx } = useThemeContext();
|
|
202
|
+
|
|
203
|
+
return (
|
|
204
|
+
<div {...props} className={tx('card.icon-block', { padding }, classNames)} ref={forwardedRef}>
|
|
205
|
+
{children}
|
|
206
|
+
</div>
|
|
207
|
+
);
|
|
208
|
+
},
|
|
209
|
+
);
|
|
210
|
+
|
|
211
|
+
CardIconBlock.displayName = CARD_ICON_BLOCK_NAME;
|
|
212
|
+
|
|
103
213
|
//
|
|
104
214
|
// Title
|
|
105
215
|
//
|
|
106
216
|
|
|
107
|
-
|
|
217
|
+
const CARD_TITLE_NAME = 'Card.Title';
|
|
108
218
|
|
|
109
|
-
const CardTitle =
|
|
110
|
-
const { className, ...rest } = composableProps(props);
|
|
111
|
-
const Comp = asChild ? Slot : Primitive.div;
|
|
219
|
+
const CardTitle = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
|
|
112
220
|
const { tx } = useThemeContext();
|
|
221
|
+
const { className, ...rest } = composableProps(props, { role: 'heading' });
|
|
222
|
+
const Comp = asChild ? Slot : Primitive.div;
|
|
113
223
|
|
|
114
224
|
return (
|
|
115
|
-
<Comp {...rest}
|
|
225
|
+
<Comp {...rest} className={tx('card.title', {}, className)} ref={forwardedRef}>
|
|
116
226
|
{children}
|
|
117
227
|
</Comp>
|
|
118
228
|
);
|
|
119
229
|
});
|
|
120
230
|
|
|
231
|
+
CardTitle.displayName = CARD_TITLE_NAME;
|
|
232
|
+
|
|
121
233
|
//
|
|
122
234
|
// Content
|
|
123
235
|
//
|
|
124
236
|
|
|
125
|
-
|
|
237
|
+
const CARD_CONTENT_NAME = 'Card.Content';
|
|
126
238
|
|
|
127
|
-
const CardContent =
|
|
239
|
+
const CardContent = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
|
|
240
|
+
const { className, ...rest } = composableProps(props);
|
|
241
|
+
const Comp = asChild ? Slot : Primitive.div;
|
|
128
242
|
const { tx } = useThemeContext();
|
|
129
243
|
|
|
130
244
|
return (
|
|
131
|
-
<
|
|
245
|
+
<Comp {...rest} className={tx('card.content', {}, className)} ref={forwardedRef}>
|
|
132
246
|
{children}
|
|
133
|
-
</
|
|
247
|
+
</Comp>
|
|
134
248
|
);
|
|
135
249
|
});
|
|
136
250
|
|
|
251
|
+
CardContent.displayName = CARD_CONTENT_NAME;
|
|
252
|
+
|
|
137
253
|
//
|
|
138
254
|
// Row
|
|
139
255
|
//
|
|
140
256
|
|
|
141
|
-
|
|
257
|
+
const CARD_ROW_NAME = 'Card.Row';
|
|
258
|
+
|
|
259
|
+
type CardRowProps = { icon?: string; fullWidth?: boolean };
|
|
142
260
|
|
|
143
|
-
|
|
261
|
+
// TODO(burdon): fullWidth should mean no columns.
|
|
262
|
+
const CardRow = slottable<HTMLDivElement, CardRowProps>(({ children, asChild, icon, ...props }, forwardedRef) => {
|
|
144
263
|
const { className, ...rest } = composableProps(props);
|
|
264
|
+
const Comp = asChild ? Slot : Primitive.div;
|
|
265
|
+
const { tx } = useThemeContext();
|
|
266
|
+
|
|
145
267
|
return (
|
|
146
|
-
<
|
|
147
|
-
{(icon && <CardIcon classNames='text-subdued' icon={icon} />) || <div />}
|
|
268
|
+
<Comp {...rest} className={tx('card.row', {}, className)} ref={forwardedRef}>
|
|
269
|
+
{(icon && <CardIcon classNames='text-subdued' icon={icon} size={4} />) || <div />}
|
|
148
270
|
{children}
|
|
149
|
-
|
|
150
|
-
</Column.Row>
|
|
271
|
+
</Comp>
|
|
151
272
|
);
|
|
152
273
|
});
|
|
153
274
|
|
|
275
|
+
CardRow.displayName = CARD_ROW_NAME;
|
|
276
|
+
|
|
154
277
|
//
|
|
155
278
|
// Section
|
|
156
279
|
//
|
|
157
280
|
|
|
158
|
-
|
|
281
|
+
const CARD_SECTION_NAME = 'Card.Section';
|
|
159
282
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
283
|
+
/**
|
|
284
|
+
* @deprecated Merge with Card.Row fullWidth
|
|
285
|
+
*/
|
|
286
|
+
const CardSection = slottable<HTMLDivElement>(({ children, asChild, role, ...props }, forwardedRef) => {
|
|
287
|
+
const { className, ...rest } = composableProps(props);
|
|
288
|
+
const Comp = asChild ? Slot : Primitive.div;
|
|
164
289
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
290
|
+
return (
|
|
291
|
+
<Comp {...rest} role={role ?? 'none'} className={mx('col-span-full', className)} ref={forwardedRef}>
|
|
292
|
+
{children}
|
|
293
|
+
</Comp>
|
|
294
|
+
);
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
CardSection.displayName = CARD_SECTION_NAME;
|
|
172
298
|
|
|
173
299
|
//
|
|
174
300
|
// Heading
|
|
175
301
|
//
|
|
176
302
|
|
|
177
|
-
|
|
303
|
+
const CARD_HEADING_NAME = 'Card.Heading';
|
|
304
|
+
|
|
305
|
+
type CardHeadingProps = { variant?: 'default' | 'subtitle' };
|
|
178
306
|
|
|
179
307
|
/**
|
|
180
308
|
* @deprecated Use typography.
|
|
181
309
|
*/
|
|
182
|
-
const CardHeading =
|
|
310
|
+
const CardHeading = slottable<HTMLDivElement, CardHeadingProps>(
|
|
183
311
|
({ children, asChild, role, variant = 'default', ...props }, forwardedRef) => {
|
|
184
312
|
const { className, ...rest } = composableProps(props);
|
|
185
313
|
const Comp = asChild ? Slot : Primitive.div;
|
|
@@ -198,13 +326,17 @@ const CardHeading = forwardRef<HTMLDivElement, CardHeadingProps>(
|
|
|
198
326
|
},
|
|
199
327
|
);
|
|
200
328
|
|
|
329
|
+
CardHeading.displayName = CARD_HEADING_NAME;
|
|
330
|
+
|
|
201
331
|
//
|
|
202
332
|
// Text
|
|
203
333
|
//
|
|
204
334
|
|
|
205
|
-
|
|
335
|
+
const CARD_TEXT_NAME = 'Card.Text';
|
|
336
|
+
|
|
337
|
+
type CardTextProps = { truncate?: boolean; variant?: 'default' | 'description' };
|
|
206
338
|
|
|
207
|
-
const CardText =
|
|
339
|
+
const CardText = slottable<HTMLDivElement, CardTextProps>(
|
|
208
340
|
({ children, asChild, role, truncate, variant = 'default', ...props }, forwardedRef) => {
|
|
209
341
|
const { className, ...rest } = composableProps(props);
|
|
210
342
|
const Comp = asChild ? Slot : Primitive.div;
|
|
@@ -218,24 +350,69 @@ const CardText = forwardRef<HTMLDivElement, CardTextProps>(
|
|
|
218
350
|
},
|
|
219
351
|
);
|
|
220
352
|
|
|
353
|
+
CardText.displayName = CARD_TEXT_NAME;
|
|
354
|
+
|
|
355
|
+
//
|
|
356
|
+
// Html
|
|
357
|
+
//
|
|
358
|
+
|
|
359
|
+
const CARD_HTML_NAME = 'Card.Html';
|
|
360
|
+
|
|
361
|
+
type CardHtmlProps = { html: string; variant?: 'default' | 'description' };
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Renders sanitized HTML content inside a card text slot.
|
|
365
|
+
* Uses DOMPurify to prevent XSS from untrusted markup (e.g. RSS feed content).
|
|
366
|
+
*/
|
|
367
|
+
const CardHtml = ({ html, variant = 'default', ...props }: CardHtmlProps & ThemedClassName<object>) => {
|
|
368
|
+
const { tx } = useThemeContext();
|
|
369
|
+
const sanitized = useMemo(() => DOMPurify.sanitize(html), [html]);
|
|
370
|
+
|
|
371
|
+
return (
|
|
372
|
+
<div
|
|
373
|
+
{...props}
|
|
374
|
+
className={tx('card.text', { variant })}
|
|
375
|
+
// eslint-disable-next-line react/no-danger
|
|
376
|
+
dangerouslySetInnerHTML={{ __html: sanitized }}
|
|
377
|
+
/>
|
|
378
|
+
);
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
(CardHtml as any).displayName = CARD_HTML_NAME;
|
|
382
|
+
|
|
221
383
|
//
|
|
222
384
|
// Poster
|
|
223
385
|
//
|
|
224
386
|
|
|
387
|
+
const CARD_POSTER_NAME = 'Card.Poster';
|
|
388
|
+
|
|
225
389
|
type CardPosterProps = ThemedClassName<
|
|
226
390
|
{
|
|
227
391
|
alt: string;
|
|
228
392
|
aspect?: 'video' | 'auto';
|
|
393
|
+
/**
|
|
394
|
+
* How the image fills the poster box. `'contain'` (default) preserves
|
|
395
|
+
* aspect ratio and may letterbox; `'cover'` fills the box edge-to-edge,
|
|
396
|
+
* cropping as needed. Forwarded to the underlying `Image`'s
|
|
397
|
+
* `object-fit`.
|
|
398
|
+
*/
|
|
399
|
+
fit?: 'contain' | 'cover';
|
|
229
400
|
} & Partial<{ image: string; icon: string }>
|
|
230
401
|
>;
|
|
231
402
|
|
|
232
403
|
const CardPoster = (props: CardPosterProps) => {
|
|
233
404
|
const { tx } = useThemeContext();
|
|
234
405
|
const aspect = props.aspect === 'auto' ? 'aspect-auto' : 'aspect-video';
|
|
406
|
+
|
|
235
407
|
if (props.image) {
|
|
236
408
|
return (
|
|
237
|
-
<div
|
|
238
|
-
<Image
|
|
409
|
+
<div className='col-span-full'>
|
|
410
|
+
<Image
|
|
411
|
+
classNames={[tx('card.poster', {}), aspect, props.classNames]}
|
|
412
|
+
src={props.image}
|
|
413
|
+
alt={props.alt}
|
|
414
|
+
fit={props.fit}
|
|
415
|
+
/>
|
|
239
416
|
</div>
|
|
240
417
|
);
|
|
241
418
|
}
|
|
@@ -249,27 +426,35 @@ const CardPoster = (props: CardPosterProps) => {
|
|
|
249
426
|
}
|
|
250
427
|
};
|
|
251
428
|
|
|
429
|
+
(CardPoster as any).displayName = CARD_POSTER_NAME;
|
|
430
|
+
|
|
252
431
|
//
|
|
253
432
|
// Action
|
|
254
433
|
//
|
|
255
434
|
|
|
435
|
+
const CARD_ACTION_NAME = 'Card.Action';
|
|
436
|
+
|
|
256
437
|
type CardActionProps = { icon?: string; label: string; actionIcon?: string; onClick?: () => void };
|
|
257
438
|
|
|
258
439
|
const CardAction = ({ icon, actionIcon = 'ph--arrow-right--regular', label, onClick }: CardActionProps) => {
|
|
259
440
|
const { tx } = useThemeContext();
|
|
260
441
|
return (
|
|
261
442
|
<Button variant='ghost' classNames={tx('card.action', {})} onClick={onClick}>
|
|
262
|
-
{icon ? <CardIcon classNames='text-subdued' icon={icon} /> : <div />}
|
|
443
|
+
{icon ? <CardIcon classNames='text-subdued' icon={icon} size={4} /> : <div />}
|
|
263
444
|
<span className={tx('card.action-label', {}, !actionIcon ? 'col-span-2' : undefined)}>{label}</span>
|
|
264
|
-
{actionIcon && <CardIcon icon={actionIcon} />}
|
|
445
|
+
{actionIcon && <CardIcon icon={actionIcon} size={4} />}
|
|
265
446
|
</Button>
|
|
266
447
|
);
|
|
267
448
|
};
|
|
268
449
|
|
|
450
|
+
(CardAction as any).displayName = CARD_ACTION_NAME;
|
|
451
|
+
|
|
269
452
|
//
|
|
270
453
|
// Link
|
|
271
454
|
//
|
|
272
455
|
|
|
456
|
+
const CARD_LINK_NAME = 'Card.Link';
|
|
457
|
+
|
|
273
458
|
type CardLinkProps = { label: string; href: string };
|
|
274
459
|
|
|
275
460
|
const CardLink = ({ label, href }: CardLinkProps) => {
|
|
@@ -283,35 +468,7 @@ const CardLink = ({ label, href }: CardLinkProps) => {
|
|
|
283
468
|
);
|
|
284
469
|
};
|
|
285
470
|
|
|
286
|
-
|
|
287
|
-
// Icon
|
|
288
|
-
//
|
|
289
|
-
|
|
290
|
-
const CardIcon = ({ toolbar, ...props }: IconProps & { toolbar?: boolean }) => {
|
|
291
|
-
return (
|
|
292
|
-
<CardIconBlock>
|
|
293
|
-
<Icon {...props} size={toolbar ? 5 : 4} />
|
|
294
|
-
</CardIconBlock>
|
|
295
|
-
);
|
|
296
|
-
};
|
|
297
|
-
|
|
298
|
-
//
|
|
299
|
-
// IconBlock
|
|
300
|
-
//
|
|
301
|
-
|
|
302
|
-
const CardIconBlock = ({
|
|
303
|
-
classNames,
|
|
304
|
-
children,
|
|
305
|
-
role,
|
|
306
|
-
...props
|
|
307
|
-
}: ThemedClassName<PropsWithChildren<HTMLAttributes<HTMLDivElement>>>) => {
|
|
308
|
-
const { tx } = useThemeContext();
|
|
309
|
-
return (
|
|
310
|
-
<div {...props} role={role ?? 'none'} className={tx('card.icon-block', {}, classNames)}>
|
|
311
|
-
{children}
|
|
312
|
-
</div>
|
|
313
|
-
);
|
|
314
|
-
};
|
|
471
|
+
(CardLink as any).displayName = CARD_LINK_NAME;
|
|
315
472
|
|
|
316
473
|
//
|
|
317
474
|
// Card
|
|
@@ -324,14 +481,14 @@ export const Card = {
|
|
|
324
481
|
Toolbar: CardToolbar,
|
|
325
482
|
ToolbarIconButton: Toolbar.IconButton,
|
|
326
483
|
ToolbarSeparator: Toolbar.Separator,
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
484
|
+
|
|
485
|
+
// Toolbar blocks
|
|
486
|
+
IconBlock: CardIconBlock,
|
|
487
|
+
DragHandle: CardDragHandle,
|
|
488
|
+
CloseIconButton: CloseIconButton,
|
|
332
489
|
Menu: CardMenu,
|
|
333
490
|
Icon: CardIcon,
|
|
334
|
-
|
|
491
|
+
Title: CardTitle,
|
|
335
492
|
|
|
336
493
|
// Content
|
|
337
494
|
Content: CardContent,
|
|
@@ -339,9 +496,17 @@ export const Card = {
|
|
|
339
496
|
Section: CardSection,
|
|
340
497
|
Heading: CardHeading,
|
|
341
498
|
Text: CardText,
|
|
499
|
+
Html: CardHtml,
|
|
342
500
|
Poster: CardPoster,
|
|
343
501
|
Action: CardAction,
|
|
344
502
|
Link: CardLink,
|
|
345
503
|
};
|
|
346
504
|
|
|
347
|
-
export type {
|
|
505
|
+
export type {
|
|
506
|
+
CardContextValue,
|
|
507
|
+
CardRootProps,
|
|
508
|
+
CardToolbarProps,
|
|
509
|
+
CardDragHandleProps,
|
|
510
|
+
CloseIconButtonProps,
|
|
511
|
+
CardMenuProps,
|
|
512
|
+
};
|
|
@@ -10,7 +10,6 @@ import { Button, type ButtonProps, IconButton } from '../Button';
|
|
|
10
10
|
import { Icon, type IconProps } from '../Icon';
|
|
11
11
|
import { useTranslation } from '../ThemeProvider';
|
|
12
12
|
import { type TooltipScopedProps, useTooltipContext } from '../Tooltip';
|
|
13
|
-
|
|
14
13
|
import { useClipboard } from './ClipboardProvider';
|
|
15
14
|
|
|
16
15
|
export type CopyButtonProps = ButtonProps &
|
|
@@ -31,12 +30,12 @@ export const CopyButton = ({ classNames, value, size = 5, ...props }: CopyButton
|
|
|
31
30
|
onClick={() => setTextValue(value)}
|
|
32
31
|
data-testid='copy-invitation'
|
|
33
32
|
>
|
|
34
|
-
<div
|
|
35
|
-
<span className='px-1'>{t('copy
|
|
33
|
+
<div className={mx('flex gap-1 items-center', isCopied && inactiveLabelStyles)}>
|
|
34
|
+
<span className='px-1'>{t('copy.label')}</span>
|
|
36
35
|
<Icon icon='ph--copy--regular' size={size} />
|
|
37
36
|
</div>
|
|
38
|
-
<div
|
|
39
|
-
<span className='px-1'>{t('copy
|
|
37
|
+
<div className={mx('flex gap-1 items-center', !isCopied && inactiveLabelStyles)}>
|
|
38
|
+
<span className='px-1'>{t('copy-success.label')}</span>
|
|
40
39
|
<Icon icon='ph--check--regular' size={size} />
|
|
41
40
|
</div>
|
|
42
41
|
</Button>
|
|
@@ -58,7 +57,7 @@ export const CopyButtonIconOnly = ({
|
|
|
58
57
|
const { t } = useTranslation(osTranslations);
|
|
59
58
|
const { textValue, setTextValue } = useClipboard();
|
|
60
59
|
const isCopied = textValue === value;
|
|
61
|
-
const label = isCopied ? t('copy
|
|
60
|
+
const label = isCopied ? t('copy-success.label') : (props.label ?? t('copy.label'));
|
|
62
61
|
const { onOpen } = useTooltipContext('CopyButton', __scopeTooltip);
|
|
63
62
|
return (
|
|
64
63
|
<IconButton
|
|
@@ -5,14 +5,13 @@
|
|
|
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
|
-
|
|
13
12
|
import { AlertDialog } from './AlertDialog';
|
|
14
13
|
|
|
15
|
-
type
|
|
14
|
+
type DefaultStoryProps = Partial<{
|
|
16
15
|
title: string;
|
|
17
16
|
description: string;
|
|
18
17
|
openTrigger: string;
|
|
@@ -20,7 +19,7 @@ type StoryProps = Partial<{
|
|
|
20
19
|
actionTrigger: string;
|
|
21
20
|
}>;
|
|
22
21
|
|
|
23
|
-
const DefaultStory = ({ title, description, openTrigger, cancelTrigger, actionTrigger }:
|
|
22
|
+
const DefaultStory = ({ title, description, openTrigger, cancelTrigger, actionTrigger }: DefaultStoryProps) => {
|
|
24
23
|
return (
|
|
25
24
|
<AlertDialog.Root defaultOpen>
|
|
26
25
|
<AlertDialog.Trigger asChild>
|
|
@@ -60,8 +59,8 @@ type Story = StoryObj<typeof meta>;
|
|
|
60
59
|
|
|
61
60
|
export const Default: Story = {
|
|
62
61
|
args: {
|
|
63
|
-
title:
|
|
64
|
-
description:
|
|
62
|
+
title: random.lorem.sentence(3),
|
|
63
|
+
description: random.lorem.paragraph(1),
|
|
65
64
|
openTrigger: 'Open AlertDialog',
|
|
66
65
|
cancelTrigger: 'Cancel',
|
|
67
66
|
actionTrigger: 'Action',
|