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