@dxos/react-ui-stack 0.8.4-main.3a94e84 → 0.8.4-main.3eb6e50203

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.
Files changed (107) hide show
  1. package/dist/lib/browser/index.mjs +921 -50
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/browser/playwright/index.mjs +4 -0
  5. package/dist/lib/browser/playwright/index.mjs.map +2 -2
  6. package/dist/lib/node-esm/index.mjs +922 -50
  7. package/dist/lib/node-esm/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/meta.json +1 -1
  9. package/dist/lib/node-esm/playwright/index.mjs +4 -0
  10. package/dist/lib/node-esm/playwright/index.mjs.map +2 -2
  11. package/dist/types/src/{exemplars → components}/CardStack/CardStack.d.ts +20 -13
  12. package/dist/types/src/components/CardStack/CardStack.d.ts.map +1 -0
  13. package/dist/types/src/components/CardStack/CardStack.stories.d.ts +15 -0
  14. package/dist/types/src/components/CardStack/CardStack.stories.d.ts.map +1 -0
  15. package/dist/types/src/{exemplars → components}/CardStack/CardStackDragPreview.d.ts +4 -1
  16. package/dist/types/src/components/CardStack/CardStackDragPreview.d.ts.map +1 -0
  17. package/dist/types/src/components/CardStack/index.d.ts.map +1 -0
  18. package/dist/types/src/components/Stack/Stack.d.ts +15 -7
  19. package/dist/types/src/components/Stack/Stack.d.ts.map +1 -1
  20. package/dist/types/src/components/Stack/Stack.stories.d.ts +12 -3
  21. package/dist/types/src/components/Stack/Stack.stories.d.ts.map +1 -1
  22. package/dist/types/src/components/StackContext.d.ts +2 -1
  23. package/dist/types/src/components/StackContext.d.ts.map +1 -1
  24. package/dist/types/src/components/StackItem/StackItem.d.ts +9 -12
  25. package/dist/types/src/components/StackItem/StackItem.d.ts.map +1 -1
  26. package/dist/types/src/components/StackItem/StackItem.stories.d.ts +13 -5
  27. package/dist/types/src/components/StackItem/StackItem.stories.d.ts.map +1 -1
  28. package/dist/types/src/components/StackItem/StackItemContent.d.ts +4 -37
  29. package/dist/types/src/components/StackItem/StackItemContent.d.ts.map +1 -1
  30. package/dist/types/src/components/StackItem/StackItemHeading.d.ts +1 -1
  31. package/dist/types/src/components/StackItem/StackItemHeading.d.ts.map +1 -1
  32. package/dist/types/src/components/StackItem/StackItemResizeHandle.d.ts.map +1 -1
  33. package/dist/types/src/components/StackItem/StackItemSigil.d.ts +2 -2
  34. package/dist/types/src/components/StackItem/StackItemSigil.d.ts.map +1 -1
  35. package/dist/types/src/components/deprecated/LayoutControls.d.ts +3 -0
  36. package/dist/types/src/components/deprecated/LayoutControls.d.ts.map +1 -1
  37. package/dist/types/src/components/index.d.ts +2 -1
  38. package/dist/types/src/components/index.d.ts.map +1 -1
  39. package/dist/types/src/components/{defs.d.ts → types.d.ts} +1 -1
  40. package/dist/types/src/components/types.d.ts.map +1 -0
  41. package/dist/types/src/hooks/useStackDropForElements.d.ts +9 -7
  42. package/dist/types/src/hooks/useStackDropForElements.d.ts.map +1 -1
  43. package/dist/types/src/index.d.ts +0 -1
  44. package/dist/types/src/index.d.ts.map +1 -1
  45. package/dist/types/src/translations.d.ts +2 -2
  46. package/dist/types/src/translations.d.ts.map +1 -1
  47. package/dist/types/tsconfig.tsbuildinfo +1 -1
  48. package/package.json +41 -38
  49. package/src/{exemplars → components}/CardStack/CardStack.stories.tsx +19 -18
  50. package/src/{exemplars → components}/CardStack/CardStack.tsx +113 -54
  51. package/src/{exemplars → components}/CardStack/CardStackDragPreview.tsx +12 -9
  52. package/src/components/Stack/Stack.stories.tsx +8 -9
  53. package/src/components/Stack/Stack.tsx +225 -26
  54. package/src/components/StackContext.tsx +2 -1
  55. package/src/components/StackItem/StackItem.stories.tsx +20 -16
  56. package/src/components/StackItem/StackItem.tsx +49 -29
  57. package/src/components/StackItem/StackItemContent.tsx +22 -41
  58. package/src/components/StackItem/StackItemHeading.tsx +5 -9
  59. package/src/components/StackItem/StackItemResizeHandle.tsx +2 -1
  60. package/src/components/StackItem/StackItemSigil.tsx +5 -4
  61. package/src/components/deprecated/LayoutControls.tsx +3 -0
  62. package/src/components/index.ts +2 -1
  63. package/src/hooks/useStackDropForElements.ts +59 -45
  64. package/src/index.ts +0 -3
  65. package/src/playwright/playwright.config.ts +1 -1
  66. package/src/translations.ts +1 -1
  67. package/dist/lib/browser/chunk-P3TQV4BA.mjs +0 -1198
  68. package/dist/lib/browser/chunk-P3TQV4BA.mjs.map +0 -7
  69. package/dist/lib/browser/testing/index.mjs +0 -31
  70. package/dist/lib/browser/testing/index.mjs.map +0 -7
  71. package/dist/lib/node-esm/chunk-3WVEPAJ4.mjs +0 -1200
  72. package/dist/lib/node-esm/chunk-3WVEPAJ4.mjs.map +0 -7
  73. package/dist/lib/node-esm/testing/index.mjs +0 -32
  74. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  75. package/dist/types/src/components/defs.d.ts.map +0 -1
  76. package/dist/types/src/exemplars/Card/Card.d.ts +0 -58
  77. package/dist/types/src/exemplars/Card/Card.d.ts.map +0 -1
  78. package/dist/types/src/exemplars/Card/Card.stories.d.ts +0 -13
  79. package/dist/types/src/exemplars/Card/Card.stories.d.ts.map +0 -1
  80. package/dist/types/src/exemplars/Card/CardDragPreview.d.ts +0 -6
  81. package/dist/types/src/exemplars/Card/CardDragPreview.d.ts.map +0 -1
  82. package/dist/types/src/exemplars/Card/fragments.d.ts +0 -12
  83. package/dist/types/src/exemplars/Card/fragments.d.ts.map +0 -1
  84. package/dist/types/src/exemplars/Card/index.d.ts +0 -4
  85. package/dist/types/src/exemplars/Card/index.d.ts.map +0 -1
  86. package/dist/types/src/exemplars/CardStack/CardStack.d.ts.map +0 -1
  87. package/dist/types/src/exemplars/CardStack/CardStack.stories.d.ts +0 -9
  88. package/dist/types/src/exemplars/CardStack/CardStack.stories.d.ts.map +0 -1
  89. package/dist/types/src/exemplars/CardStack/CardStackDragPreview.d.ts.map +0 -1
  90. package/dist/types/src/exemplars/CardStack/index.d.ts.map +0 -1
  91. package/dist/types/src/exemplars/index.d.ts +0 -3
  92. package/dist/types/src/exemplars/index.d.ts.map +0 -1
  93. package/dist/types/src/testing/CardContainer.d.ts +0 -6
  94. package/dist/types/src/testing/CardContainer.d.ts.map +0 -1
  95. package/dist/types/src/testing/index.d.ts +0 -2
  96. package/dist/types/src/testing/index.d.ts.map +0 -1
  97. package/src/exemplars/Card/Card.stories.tsx +0 -78
  98. package/src/exemplars/Card/Card.tsx +0 -186
  99. package/src/exemplars/Card/CardDragPreview.tsx +0 -22
  100. package/src/exemplars/Card/fragments.ts +0 -23
  101. package/src/exemplars/Card/index.ts +0 -7
  102. package/src/exemplars/index.ts +0 -6
  103. package/src/testing/CardContainer.tsx +0 -34
  104. package/src/testing/index.ts +0 -5
  105. /package/dist/types/src/{exemplars → components}/CardStack/index.d.ts +0 -0
  106. /package/src/{exemplars → components}/CardStack/index.ts +0 -0
  107. /package/src/components/{defs.ts → types.ts} +0 -0
package/package.json CHANGED
@@ -1,12 +1,16 @@
1
1
  {
2
2
  "name": "@dxos/react-ui-stack",
3
- "version": "0.8.4-main.3a94e84",
3
+ "version": "0.8.4-main.3eb6e50203",
4
4
  "description": "A stack component.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/dxos/dxos"
10
+ },
7
11
  "license": "MIT",
8
12
  "author": "DXOS.org",
9
- "sideEffects": true,
13
+ "sideEffects": false,
10
14
  "type": "module",
11
15
  "exports": {
12
16
  ".": {
@@ -18,11 +22,6 @@
18
22
  "types": "./dist/types/src/playwright/index.d.ts",
19
23
  "browser": "./dist/lib/browser/playwright/index.mjs",
20
24
  "node": "./dist/lib/node-esm/playwright/index.mjs"
21
- },
22
- "./testing": {
23
- "types": "./dist/types/src/testing/index.d.ts",
24
- "browser": "./dist/lib/browser/testing/index.mjs",
25
- "node": "./dist/lib/node-esm/testing/index.mjs"
26
25
  }
27
26
  },
28
27
  "types": "dist/types/src/index.d.ts",
@@ -41,11 +40,11 @@
41
40
  "src"
42
41
  ],
43
42
  "dependencies": {
44
- "@atlaskit/pragmatic-drag-and-drop": "^1.4.0",
45
- "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^2.1.0",
46
- "@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.0.3",
47
- "@fluentui/react-tabster": "^9.24.2",
48
- "@preact-signals/safe-react": "^0.9.0",
43
+ "@atlaskit/pragmatic-drag-and-drop": "1.7.7",
44
+ "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^2.1.2",
45
+ "@atlaskit/pragmatic-drag-and-drop-hitbox": "1.1.0",
46
+ "@atlaskit/pragmatic-drag-and-drop-react-drop-indicator": "3.2.10",
47
+ "@fluentui/react-tabster": "9.26.11",
49
48
  "@radix-ui/primitive": "1.1.1",
50
49
  "@radix-ui/react-compose-refs": "1.1.1",
51
50
  "@radix-ui/react-context": "1.1.1",
@@ -54,36 +53,40 @@
54
53
  "@radix-ui/react-slot": "1.1.2",
55
54
  "@radix-ui/react-use-controllable-state": "1.1.0",
56
55
  "react-resize-detector": "^11.0.1",
57
- "@dxos/echo-schema": "0.8.4-main.3a94e84",
58
- "@dxos/keyboard": "0.8.4-main.3a94e84",
59
- "@dxos/react-ui-attention": "0.8.4-main.3a94e84",
60
- "@dxos/react-ui-dnd": "0.8.4-main.3a94e84",
61
- "@dxos/storybook-utils": "0.8.4-main.3a94e84",
62
- "@dxos/live-object": "0.8.4-main.3a94e84",
63
- "@dxos/util": "0.8.4-main.3a94e84"
56
+ "@dxos/echo": "0.8.4-main.3eb6e50203",
57
+ "@dxos/keyboard": "0.8.4-main.3eb6e50203",
58
+ "@dxos/react-ui-attention": "0.8.4-main.3eb6e50203",
59
+ "@dxos/react-ui-dnd": "0.8.4-main.3eb6e50203",
60
+ "@dxos/react-ui-mosaic": "0.8.4-main.3eb6e50203",
61
+ "@dxos/util": "0.8.4-main.3eb6e50203"
64
62
  },
65
63
  "devDependencies": {
66
- "@types/react": "~18.2.0",
67
- "@types/react-dom": "~18.2.0",
68
- "react": "~18.2.0",
69
- "react-dom": "~18.2.0",
70
- "vite": "5.4.7",
71
- "@dxos/app-graph": "0.8.4-main.3a94e84",
72
- "@dxos/echo-schema": "0.8.4-main.3a94e84",
73
- "@dxos/random": "0.8.4-main.3a94e84",
74
- "@dxos/client": "0.8.4-main.3a94e84",
75
- "@dxos/react-ui": "0.8.4-main.3a94e84",
76
- "@dxos/react-ui-theme": "0.8.4-main.3a94e84",
77
- "@dxos/storybook-utils": "0.8.4-main.3a94e84",
78
- "@dxos/test-utils": "0.8.4-main.3a94e84"
64
+ "@types/react": "~19.2.7",
65
+ "@types/react-dom": "~19.2.3",
66
+ "react": "~19.2.3",
67
+ "react-dom": "~19.2.3",
68
+ "vite": "7.1.9",
69
+ "@dxos/app-framework": "0.8.4-main.3eb6e50203",
70
+ "@dxos/app-graph": "0.8.4-main.3eb6e50203",
71
+ "@dxos/echo-db": "0.8.4-main.3eb6e50203",
72
+ "@dxos/echo": "0.8.4-main.3eb6e50203",
73
+ "@dxos/client": "0.8.4-main.3eb6e50203",
74
+ "@dxos/react-client": "0.8.4-main.3eb6e50203",
75
+ "@dxos/random": "0.8.4-main.3eb6e50203",
76
+ "@dxos/react-ui": "0.8.4-main.3eb6e50203",
77
+ "@dxos/storybook-utils": "0.8.4-main.3eb6e50203",
78
+ "@dxos/test-utils": "0.8.4-main.3eb6e50203",
79
+ "@dxos/schema": "0.8.4-main.3eb6e50203",
80
+ "@dxos/types": "0.8.4-main.3eb6e50203",
81
+ "@dxos/ui-theme": "0.8.4-main.3eb6e50203"
79
82
  },
80
83
  "peerDependencies": {
81
- "react": "~18.2.0",
82
- "react-dom": "~18.2.0",
83
- "@dxos/client": "0.8.4-main.3a94e84",
84
- "@dxos/react-ui": "0.8.4-main.3a94e84",
85
- "@dxos/react-ui-theme": "0.8.4-main.3a94e84",
86
- "@dxos/random": "0.8.4-main.3a94e84"
84
+ "react": "~19.2.3",
85
+ "react-dom": "~19.2.3",
86
+ "@dxos/client": "0.8.4-main.3eb6e50203",
87
+ "@dxos/ui-theme": "0.8.4-main.3eb6e50203",
88
+ "@dxos/random": "0.8.4-main.3eb6e50203",
89
+ "@dxos/react-ui": "0.8.4-main.3eb6e50203"
87
90
  },
88
91
  "publishConfig": {
89
92
  "access": "public"
@@ -2,21 +2,19 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Edge } from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge';
8
6
  import { type Meta, type StoryObj } from '@storybook/react-vite';
9
- import React, { useState, useCallback } from 'react';
7
+ import React, { useCallback, useState } from 'react';
10
8
 
11
9
  import { faker } from '@dxos/random';
12
10
  import { IconButton } from '@dxos/react-ui';
13
- import { withLayout, withTheme } from '@dxos/storybook-utils';
11
+ import { withTheme } from '@dxos/react-ui/testing';
12
+ import { Card, CardDragPreview } from '@dxos/react-ui-mosaic';
13
+
14
+ import { StackItem } from '../StackItem';
14
15
 
15
16
  import { CardStack } from './CardStack';
16
- import { StackItem } from '../../components';
17
- import { Card, CardDragPreview } from '../Card';
18
17
 
19
- // Set a seed for reproducible random values
20
18
  faker.seed(0);
21
19
 
22
20
  type CardItem = {
@@ -96,7 +94,7 @@ const CardStackStory = () => {
96
94
 
97
95
  return (
98
96
  <CardStack.Root classNames='is-96'>
99
- <CardStack.Content>
97
+ <CardStack.Content footer>
100
98
  <CardStack.Stack id='story column' onRearrange={handleRearrange} itemsCount={column.length}>
101
99
  {column.map((card, cardIndex, cardsArray) => {
102
100
  const cardItem = { id: card.id, type: 'card' as const };
@@ -111,10 +109,10 @@ const CardStackStory = () => {
111
109
  prevSiblingId={prevCardId}
112
110
  nextSiblingId={nextCardId}
113
111
  >
114
- <Card.StaticRoot>
112
+ <Card.Root>
115
113
  <Card.Toolbar>
116
114
  <StackItem.DragHandle asChild>
117
- <Card.DragHandle toolbarItem />
115
+ <Card.DragHandle />
118
116
  </StackItem.DragHandle>
119
117
  <Card.ToolbarSeparator variant='gap' />
120
118
  <Card.ToolbarIconButton
@@ -127,18 +125,18 @@ const CardStackStory = () => {
127
125
  </Card.Toolbar>
128
126
  <Card.Poster alt={card.title} image={card.image} />
129
127
  <Card.Heading>{card.title}</Card.Heading>
130
- <Card.Text classNames='line-clamp-2'>{card.description}</Card.Text>
131
- </Card.StaticRoot>
128
+ <Card.Text variant='description'>{card.description}</Card.Text>
129
+ </Card.Root>
132
130
  <StackItem.DragPreview>
133
- {({ item }) => (
131
+ {() => (
134
132
  <CardDragPreview.Root>
135
133
  <CardDragPreview.Content>
136
134
  <Card.Toolbar>
137
- <Card.DragHandle toolbarItem />
135
+ <Card.DragHandle />
138
136
  </Card.Toolbar>
139
137
  <Card.Poster alt={card.title} image={card.image} />
140
138
  <Card.Heading>{card.title}</Card.Heading>
141
- <Card.Text classNames='line-clamp-2'>{card.description}</Card.Text>
139
+ <Card.Text variant='description'>{card.description}</Card.Text>
142
140
  </CardDragPreview.Content>
143
141
  </CardDragPreview.Root>
144
142
  )}
@@ -159,11 +157,14 @@ const CardStackStory = () => {
159
157
  );
160
158
  };
161
159
 
162
- const meta: Meta<typeof CardStackStory> = {
160
+ const meta = {
163
161
  title: 'ui/react-ui-stack/CardStack',
164
162
  component: CardStackStory,
165
- decorators: [withTheme, withLayout({ fullscreen: true })],
166
- };
163
+ decorators: [withTheme()],
164
+ parameters: {
165
+ layout: 'fullscreen',
166
+ },
167
+ } satisfies Meta<typeof CardStackStory>;
167
168
 
168
169
  export default meta;
169
170
 
@@ -6,17 +6,78 @@ import { Slot } from '@radix-ui/react-slot';
6
6
  import React, { type ComponentPropsWithoutRef, forwardRef } from 'react';
7
7
 
8
8
  import type { ThemedClassName } from '@dxos/react-ui';
9
- import { mx } from '@dxos/react-ui-theme';
9
+ import { Card } from '@dxos/react-ui-mosaic';
10
+ import { cardDefaultInlineSize, mx } from '@dxos/ui-theme';
10
11
 
11
- import { railGridHorizontalContainFitContent, Stack, type StackProps } from '../../components';
12
- import { Card } from '../Card';
12
+ import { Stack, type StackProps, railGridHorizontalContainFitContent } from '../Stack';
13
13
 
14
- type SharedCardStackProps = ThemedClassName<ComponentPropsWithoutRef<'div'>> & { asChild?: boolean };
14
+ /**
15
+ * This is `cardDefaultInlineSize` plus 2 times the sum of the inner and outer spacing applied by CardStack on the inline axis.
16
+ */
17
+ const cardStackDefaultInlineSizeRem = cardDefaultInlineSize + 2.125;
18
+
19
+ //
20
+ // Root
21
+ //
22
+
23
+ const cardStackRoot = 'flex flex-col';
24
+
25
+ const CardStackRoot = forwardRef<HTMLDivElement, SharedCardStackProps>(
26
+ ({ children, classNames, asChild, role = 'none', ...props }, forwardedRef) => {
27
+ const Root = asChild ? Slot : 'div';
28
+ const rootProps = asChild
29
+ ? { classNames: [cardStackRoot, classNames] }
30
+ : { className: mx(cardStackRoot, classNames), role };
31
+
32
+ return (
33
+ <Root {...props} {...rootProps} ref={forwardedRef}>
34
+ {children}
35
+ </Root>
36
+ );
37
+ },
38
+ );
39
+
40
+ //
41
+ // Content
42
+ // TODO(burdon): Rename Viewport (should be the component that scrolls).
43
+ //
44
+
45
+ const cardStackContent = 'shrink min-bs-0 grid dx-focus-ring-group-x-indicator bg-baseSurface';
46
+
47
+ type CardStackContentProps = SharedCardStackProps & {
48
+ footer?: boolean;
49
+ };
50
+
51
+ const CardStackContent = forwardRef<HTMLDivElement, CardStackContentProps>(
52
+ ({ children, classNames, asChild, role = 'none', footer, ...props }, forwardedRef) => {
53
+ const Root = asChild ? Slot : 'div';
54
+ const baseClassNames = footer ? [cardStackContent, railGridHorizontalContainFitContent] : [cardStackContent];
55
+ const rootProps = asChild
56
+ ? { classNames: [...baseClassNames, classNames] }
57
+ : { className: mx(...baseClassNames, classNames), role };
58
+
59
+ return (
60
+ <Root {...props} {...rootProps} data-scroll-separator='false' ref={forwardedRef}>
61
+ {children}
62
+ </Root>
63
+ );
64
+ },
65
+ );
66
+
67
+ //
68
+ // Stack
69
+ // TODO(burdon): Rename Content.
70
+ //
71
+
72
+ type SharedCardStackProps = ThemedClassName<ComponentPropsWithoutRef<'div'>> & {
73
+ asChild?: boolean;
74
+ };
15
75
 
16
76
  const CardStackStack = forwardRef<
17
77
  HTMLDivElement,
18
78
  Omit<StackProps, 'orientation' | 'size' | 'rail' | 'separatorOnScroll'>
19
79
  >(({ children, classNames, itemsCount = 0, ...props }, forwardedRef) => {
80
+ // NOTE: Should not have horizontal padding since separatorOnScroll should be full width.
20
81
  return (
21
82
  <Stack
22
83
  orientation='vertical'
@@ -24,7 +85,7 @@ const CardStackStack = forwardRef<
24
85
  rail={false}
25
86
  classNames={
26
87
  /* NOTE(thure): Do not let this element have zero intrinsic size, otherwise the drop indicator will not display. See #9035. */
27
- ['plb-1', itemsCount > 0 && 'plb-2', classNames]
88
+ ['plb-2', classNames]
28
89
  }
29
90
  itemsCount={itemsCount}
30
91
  separatorOnScroll={9}
@@ -37,16 +98,19 @@ const CardStackStack = forwardRef<
37
98
  );
38
99
  });
39
100
 
40
- const CardStackDragHandle = Card.DragHandle;
101
+ //
102
+ // Item
103
+ //
41
104
 
42
- const cardStackHeading = 'mli-2 order-first bg-transparent rounded-bs-md flex items-center';
105
+ const cardStackItem = 'contain-layout pli-2 plb-1 first-of-type:pbs-0 last-of-type:pbe-0';
43
106
 
44
- const CardStackHeading = forwardRef<HTMLDivElement, SharedCardStackProps>(
45
- ({ children, classNames, asChild, role = 'heading', ...props }, forwardedRef) => {
107
+ const CardStackItem = forwardRef<HTMLDivElement, SharedCardStackProps>(
108
+ ({ children, classNames, asChild, role = 'none', ...props }, forwardedRef) => {
46
109
  const Root = asChild ? Slot : 'div';
47
110
  const rootProps = asChild
48
- ? { classNames: [cardStackHeading, classNames] }
49
- : { className: mx(cardStackHeading, classNames), role };
111
+ ? { classNames: [cardStackItem, classNames] }
112
+ : { className: mx(cardStackItem, classNames), role };
113
+
50
114
  return (
51
115
  <Root {...props} {...rootProps} ref={forwardedRef}>
52
116
  {children}
@@ -55,15 +119,19 @@ const CardStackHeading = forwardRef<HTMLDivElement, SharedCardStackProps>(
55
119
  },
56
120
  );
57
121
 
58
- const cardStackFooter =
59
- 'plb-2 mli-2 border-bs border-transparent [[data-scroll-separator-end="true"]_&]:border-subduedSeparator';
122
+ //
123
+ // Heading
124
+ //
60
125
 
61
- const CardStackFooter = forwardRef<HTMLDivElement, SharedCardStackProps>(
62
- ({ children, classNames, asChild, role = 'none', ...props }, forwardedRef) => {
126
+ const cardStackHeading = 'mli-2 order-first bg-transparent rounded-bs-md flex items-center';
127
+
128
+ const CardStackHeading = forwardRef<HTMLDivElement, SharedCardStackProps>(
129
+ ({ children, classNames, asChild, role = 'heading', ...props }, forwardedRef) => {
63
130
  const Root = asChild ? Slot : 'div';
64
131
  const rootProps = asChild
65
- ? { classNames: [cardStackFooter, classNames] }
66
- : { className: mx(cardStackFooter, classNames), role };
132
+ ? { classNames: [cardStackHeading, classNames] }
133
+ : { className: mx(cardStackHeading, classNames), role };
134
+
67
135
  return (
68
136
  <Root {...props} {...rootProps} ref={forwardedRef}>
69
137
  {children}
@@ -72,33 +140,20 @@ const CardStackFooter = forwardRef<HTMLDivElement, SharedCardStackProps>(
72
140
  },
73
141
  );
74
142
 
75
- const cardStackContent = [
76
- 'shrink min-bs-0 bg-baseSurface border border-separator rounded-md grid dx-focus-ring-group-x-indicator kanban-drop',
77
- railGridHorizontalContainFitContent,
78
- ];
79
-
80
- const CardStackContent = forwardRef<HTMLDivElement, SharedCardStackProps>(
81
- ({ children, classNames, asChild, role = 'none', ...props }, forwardedRef) => {
82
- const Root = asChild ? Slot : 'div';
83
- const rootProps = asChild
84
- ? { classNames: [...cardStackContent, classNames] }
85
- : { className: mx(...cardStackContent, classNames), role };
86
- return (
87
- <Root {...props} {...rootProps} data-scroll-separator='false' ref={forwardedRef}>
88
- {children}
89
- </Root>
90
- );
91
- },
92
- );
143
+ //
144
+ // Footer
145
+ //
93
146
 
94
- const cardStackRoot = 'flex flex-col pli-2 plb-2';
147
+ const cardStackFooter =
148
+ 'plb-2 mli-2 border-bs border-transparent [[data-scroll-separator-end="true"]_&]:border-subduedSeparator';
95
149
 
96
- const CardStackRoot = forwardRef<HTMLDivElement, SharedCardStackProps>(
150
+ const CardStackFooter = forwardRef<HTMLDivElement, SharedCardStackProps>(
97
151
  ({ children, classNames, asChild, role = 'none', ...props }, forwardedRef) => {
98
152
  const Root = asChild ? Slot : 'div';
99
153
  const rootProps = asChild
100
- ? { classNames: [cardStackRoot, classNames] }
101
- : { className: mx(cardStackRoot, classNames), role };
154
+ ? { classNames: [cardStackFooter, classNames] }
155
+ : { className: mx(cardStackFooter, classNames), role };
156
+
102
157
  return (
103
158
  <Root {...props} {...rootProps} ref={forwardedRef}>
104
159
  {children}
@@ -107,22 +162,19 @@ const CardStackRoot = forwardRef<HTMLDivElement, SharedCardStackProps>(
107
162
  },
108
163
  );
109
164
 
110
- const cardStackItem = 'contain-layout pli-2 plb-1 first-of-type:pbs-0 last-of-type:pbe-0';
165
+ //
166
+ // DragHandle
167
+ //
111
168
 
112
- const CardStackItem = forwardRef<HTMLDivElement, SharedCardStackProps>(
113
- ({ children, classNames, asChild, role = 'none', ...props }, forwardedRef) => {
114
- const Root = asChild ? Slot : 'div';
115
- const rootProps = asChild
116
- ? { classNames: [cardStackItem, classNames] }
117
- : { className: mx(cardStackItem, classNames), role };
118
- return (
119
- <Root {...props} {...rootProps} ref={forwardedRef}>
120
- {children}
121
- </Root>
122
- );
123
- },
124
- );
169
+ const CardStackDragHandle = Card.DragHandle;
125
170
 
171
+ //
172
+ // CardStack
173
+ //
174
+
175
+ /**
176
+ * @deprecated Replace with Mosaic.Stack.
177
+ */
126
178
  export const CardStack = {
127
179
  Root: CardStackRoot,
128
180
  Content: CardStackContent,
@@ -133,4 +185,11 @@ export const CardStack = {
133
185
  Item: CardStackItem,
134
186
  };
135
187
 
136
- export { cardStackRoot, cardStackFooter, cardStackHeading, cardStackContent, cardStackItem };
188
+ export {
189
+ cardStackRoot,
190
+ cardStackFooter,
191
+ cardStackHeading,
192
+ cardStackContent,
193
+ cardStackItem,
194
+ cardStackDefaultInlineSizeRem,
195
+ };
@@ -4,11 +4,11 @@
4
4
 
5
5
  import React, { type PropsWithChildren } from 'react';
6
6
 
7
- import { IconButton, useTranslation } from '@dxos/react-ui';
8
- import { mx } from '@dxos/react-ui-theme';
7
+ import { IconButton, ScrollArea, useTranslation } from '@dxos/react-ui';
8
+ import { mx } from '@dxos/ui-theme';
9
9
 
10
- import { type StackProps } from '../../components';
11
10
  import { translationKey } from '../../translations';
11
+ import { type StackProps } from '../Stack';
12
12
 
13
13
  const CardStackDragPreviewRoot = ({ children }: PropsWithChildren<{}>) => {
14
14
  return (
@@ -41,18 +41,21 @@ const CardStackDragPreviewContent = ({
41
41
  itemsCount = 0,
42
42
  }: PropsWithChildren<Pick<StackProps, 'itemsCount'>>) => {
43
43
  return (
44
- <div
45
- className={mx('overflow-y-auto flex-1 pli-2 flex flex-col gap-2', 'plb-1', itemsCount > 0 ? 'plb-2' : 'plb-1')}
46
- >
47
- {children}
48
- </div>
44
+ <ScrollArea.Root orientation='vertical'>
45
+ <ScrollArea.Viewport classNames={mx('pli-2 plb-1 gap-2', itemsCount > 0 ? 'plb-2' : 'plb-1')}>
46
+ {children}
47
+ </ScrollArea.Viewport>
48
+ </ScrollArea.Root>
49
49
  );
50
50
  };
51
51
 
52
52
  const CardStackDragPreviewFooter = ({ children }: PropsWithChildren<{}>) => {
53
- return <div className='p-2 border-t border-separator'>{children}</div>;
53
+ return <div className='p-2 border-bs border-separator'>{children}</div>;
54
54
  };
55
55
 
56
+ /**
57
+ * @deprecated
58
+ */
56
59
  export const CardStackDragPreview = {
57
60
  Root: CardStackDragPreviewRoot,
58
61
  Heading: CardStackDragPreviewHeading,
@@ -2,18 +2,17 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Edge } from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge';
8
6
  import { type Meta, type StoryObj } from '@storybook/react-vite';
9
- import React, { useState, useCallback } from 'react';
7
+ import React, { useCallback, useState } from 'react';
10
8
 
11
9
  import { faker } from '@dxos/random';
12
- import { withTheme } from '@dxos/storybook-utils';
10
+ import { withTheme } from '@dxos/react-ui/testing';
13
11
 
14
- import { Stack } from './Stack';
15
12
  import { StackItem } from '../StackItem';
16
- import { type StackItemData } from '../defs';
13
+ import { type StackItemData } from '../types';
14
+
15
+ import { Stack } from './Stack';
17
16
 
18
17
  type StoryStackItem = {
19
18
  id: string;
@@ -129,12 +128,12 @@ const DefaultStory = () => {
129
128
  );
130
129
  };
131
130
 
132
- const meta: Meta<typeof DefaultStory> = {
131
+ const meta = {
133
132
  title: 'ui/react-ui-stack/Stack',
134
133
  component: DefaultStory,
135
- decorators: [withTheme],
136
134
  argTypes: { orientation: { control: 'radio', options: ['horizontal', 'vertical'] } },
137
- };
135
+ decorators: [withTheme()],
136
+ } satisfies Meta<typeof DefaultStory>;
138
137
 
139
138
  export default meta;
140
139