@dxos/react-ui-stack 0.8.4-main.7ace549 → 0.8.4-main.937b3ca

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 (104) hide show
  1. package/dist/lib/browser/index.mjs +922 -57
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +923 -57
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/{exemplars → components}/CardStack/CardStack.d.ts +18 -13
  8. package/dist/types/src/components/CardStack/CardStack.d.ts.map +1 -0
  9. package/dist/types/src/components/CardStack/CardStack.stories.d.ts.map +1 -0
  10. package/dist/types/src/{exemplars → components}/CardStack/CardStackDragPreview.d.ts +1 -1
  11. package/dist/types/src/components/CardStack/CardStackDragPreview.d.ts.map +1 -0
  12. package/dist/types/src/components/CardStack/index.d.ts.map +1 -0
  13. package/dist/types/src/components/Stack/Stack.d.ts +1 -1
  14. package/dist/types/src/components/Stack/Stack.d.ts.map +1 -1
  15. package/dist/types/src/components/StackContext.d.ts +1 -1
  16. package/dist/types/src/components/StackContext.d.ts.map +1 -1
  17. package/dist/types/src/components/StackItem/StackItem.d.ts +5 -9
  18. package/dist/types/src/components/StackItem/StackItem.d.ts.map +1 -1
  19. package/dist/types/src/components/StackItem/StackItem.stories.d.ts.map +1 -1
  20. package/dist/types/src/components/StackItem/StackItemContent.d.ts +2 -45
  21. package/dist/types/src/components/StackItem/StackItemContent.d.ts.map +1 -1
  22. package/dist/types/src/components/StackItem/StackItemSigil.d.ts +2 -2
  23. package/dist/types/src/components/StackItem/StackItemSigil.d.ts.map +1 -1
  24. package/dist/types/src/components/deprecated/LayoutControls.d.ts +3 -0
  25. package/dist/types/src/components/deprecated/LayoutControls.d.ts.map +1 -1
  26. package/dist/types/src/components/index.d.ts +2 -2
  27. package/dist/types/src/components/index.d.ts.map +1 -1
  28. package/dist/types/src/components/{defs.d.ts → types.d.ts} +1 -1
  29. package/dist/types/src/components/types.d.ts.map +1 -0
  30. package/dist/types/src/hooks/useStackDropForElements.d.ts +7 -5
  31. package/dist/types/src/hooks/useStackDropForElements.d.ts.map +1 -1
  32. package/dist/types/src/index.d.ts +0 -1
  33. package/dist/types/src/index.d.ts.map +1 -1
  34. package/dist/types/src/translations.d.ts +2 -2
  35. package/dist/types/src/translations.d.ts.map +1 -1
  36. package/dist/types/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +40 -37
  38. package/src/{exemplars → components}/CardStack/CardStack.stories.tsx +9 -9
  39. package/src/{exemplars → components}/CardStack/CardStack.tsx +114 -57
  40. package/src/{exemplars → components}/CardStack/CardStackDragPreview.tsx +3 -3
  41. package/src/components/Stack/Stack.stories.tsx +1 -1
  42. package/src/components/Stack/Stack.tsx +5 -3
  43. package/src/components/StackContext.tsx +1 -1
  44. package/src/components/StackItem/StackItem.stories.tsx +4 -2
  45. package/src/components/StackItem/StackItem.tsx +24 -12
  46. package/src/components/StackItem/StackItemContent.tsx +15 -48
  47. package/src/components/StackItem/StackItemHeading.tsx +1 -1
  48. package/src/components/StackItem/StackItemSigil.tsx +3 -3
  49. package/src/components/deprecated/LayoutControls.tsx +3 -0
  50. package/src/components/index.ts +2 -2
  51. package/src/hooks/useStackDropForElements.ts +17 -10
  52. package/src/index.ts +0 -3
  53. package/src/playwright/playwright.config.ts +1 -1
  54. package/src/translations.ts +1 -1
  55. package/dist/lib/browser/chunk-3F2KBXLP.mjs +0 -1482
  56. package/dist/lib/browser/chunk-3F2KBXLP.mjs.map +0 -7
  57. package/dist/lib/browser/testing/index.mjs +0 -31
  58. package/dist/lib/browser/testing/index.mjs.map +0 -7
  59. package/dist/lib/node-esm/chunk-SYKFLQGK.mjs +0 -1484
  60. package/dist/lib/node-esm/chunk-SYKFLQGK.mjs.map +0 -7
  61. package/dist/lib/node-esm/testing/index.mjs +0 -32
  62. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  63. package/dist/types/src/components/Image/Image.d.ts +0 -14
  64. package/dist/types/src/components/Image/Image.d.ts.map +0 -1
  65. package/dist/types/src/components/Image/Image.stories.d.ts +0 -33
  66. package/dist/types/src/components/Image/Image.stories.d.ts.map +0 -1
  67. package/dist/types/src/components/Image/index.d.ts +0 -2
  68. package/dist/types/src/components/Image/index.d.ts.map +0 -1
  69. package/dist/types/src/components/defs.d.ts.map +0 -1
  70. package/dist/types/src/exemplars/Card/Card.d.ts +0 -69
  71. package/dist/types/src/exemplars/Card/Card.d.ts.map +0 -1
  72. package/dist/types/src/exemplars/Card/Card.stories.d.ts +0 -21
  73. package/dist/types/src/exemplars/Card/Card.stories.d.ts.map +0 -1
  74. package/dist/types/src/exemplars/Card/CardDragPreview.d.ts +0 -6
  75. package/dist/types/src/exemplars/Card/CardDragPreview.d.ts.map +0 -1
  76. package/dist/types/src/exemplars/Card/fragments.d.ts +0 -13
  77. package/dist/types/src/exemplars/Card/fragments.d.ts.map +0 -1
  78. package/dist/types/src/exemplars/Card/index.d.ts +0 -4
  79. package/dist/types/src/exemplars/Card/index.d.ts.map +0 -1
  80. package/dist/types/src/exemplars/CardStack/CardStack.d.ts.map +0 -1
  81. package/dist/types/src/exemplars/CardStack/CardStack.stories.d.ts.map +0 -1
  82. package/dist/types/src/exemplars/CardStack/CardStackDragPreview.d.ts.map +0 -1
  83. package/dist/types/src/exemplars/CardStack/index.d.ts.map +0 -1
  84. package/dist/types/src/exemplars/index.d.ts +0 -3
  85. package/dist/types/src/exemplars/index.d.ts.map +0 -1
  86. package/dist/types/src/testing/CardContainer.d.ts +0 -6
  87. package/dist/types/src/testing/CardContainer.d.ts.map +0 -1
  88. package/dist/types/src/testing/index.d.ts +0 -2
  89. package/dist/types/src/testing/index.d.ts.map +0 -1
  90. package/src/components/Image/Image.stories.tsx +0 -84
  91. package/src/components/Image/Image.tsx +0 -222
  92. package/src/components/Image/index.ts +0 -5
  93. package/src/exemplars/Card/Card.stories.tsx +0 -64
  94. package/src/exemplars/Card/Card.tsx +0 -210
  95. package/src/exemplars/Card/CardDragPreview.tsx +0 -22
  96. package/src/exemplars/Card/fragments.ts +0 -24
  97. package/src/exemplars/Card/index.ts +0 -7
  98. package/src/exemplars/index.ts +0 -6
  99. package/src/testing/CardContainer.tsx +0 -37
  100. package/src/testing/index.ts +0 -5
  101. /package/dist/types/src/{exemplars → components}/CardStack/CardStack.stories.d.ts +0 -0
  102. /package/dist/types/src/{exemplars → components}/CardStack/index.d.ts +0 -0
  103. /package/src/{exemplars → components}/CardStack/index.ts +0 -0
  104. /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.7ace549",
3
+ "version": "0.8.4-main.937b3ca",
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": "0.8.4-main.7ace549",
58
- "@dxos/live-object": "0.8.4-main.7ace549",
59
- "@dxos/keyboard": "0.8.4-main.7ace549",
60
- "@dxos/react-ui-attention": "0.8.4-main.7ace549",
61
- "@dxos/react-ui-dnd": "0.8.4-main.7ace549",
62
- "@dxos/util": "0.8.4-main.7ace549",
63
- "@dxos/storybook-utils": "0.8.4-main.7ace549"
56
+ "@dxos/echo": "0.8.4-main.937b3ca",
57
+ "@dxos/keyboard": "0.8.4-main.937b3ca",
58
+ "@dxos/react-ui-dnd": "0.8.4-main.937b3ca",
59
+ "@dxos/react-ui-mosaic": "0.8.4-main.937b3ca",
60
+ "@dxos/react-ui-attention": "0.8.4-main.937b3ca",
61
+ "@dxos/util": "0.8.4-main.937b3ca"
64
62
  },
65
63
  "devDependencies": {
66
- "@types/react": "~19.2.2",
67
- "@types/react-dom": "~19.2.2",
68
- "react": "~19.2.0",
69
- "react-dom": "~19.2.0",
64
+ "@types/react": "~19.2.7",
65
+ "@types/react-dom": "~19.2.3",
66
+ "react": "~19.2.3",
67
+ "react-dom": "~19.2.3",
70
68
  "vite": "7.1.9",
71
- "@dxos/app-graph": "0.8.4-main.7ace549",
72
- "@dxos/echo": "0.8.4-main.7ace549",
73
- "@dxos/random": "0.8.4-main.7ace549",
74
- "@dxos/client": "0.8.4-main.7ace549",
75
- "@dxos/react-ui": "0.8.4-main.7ace549",
76
- "@dxos/react-ui-theme": "0.8.4-main.7ace549",
77
- "@dxos/storybook-utils": "0.8.4-main.7ace549",
78
- "@dxos/test-utils": "0.8.4-main.7ace549"
69
+ "@dxos/app-graph": "0.8.4-main.937b3ca",
70
+ "@dxos/app-framework": "0.8.4-main.937b3ca",
71
+ "@dxos/client": "0.8.4-main.937b3ca",
72
+ "@dxos/echo": "0.8.4-main.937b3ca",
73
+ "@dxos/echo-db": "0.8.4-main.937b3ca",
74
+ "@dxos/random": "0.8.4-main.937b3ca",
75
+ "@dxos/react-client": "0.8.4-main.937b3ca",
76
+ "@dxos/react-ui": "0.8.4-main.937b3ca",
77
+ "@dxos/schema": "0.8.4-main.937b3ca",
78
+ "@dxos/test-utils": "0.8.4-main.937b3ca",
79
+ "@dxos/storybook-utils": "0.8.4-main.937b3ca",
80
+ "@dxos/types": "0.8.4-main.937b3ca",
81
+ "@dxos/ui-theme": "0.8.4-main.937b3ca"
79
82
  },
80
83
  "peerDependencies": {
81
- "react": "^19.0.0",
82
- "react-dom": "^19.0.0",
83
- "@dxos/client": "0.8.4-main.7ace549",
84
- "@dxos/react-ui": "0.8.4-main.7ace549",
85
- "@dxos/react-ui-theme": "0.8.4-main.7ace549",
86
- "@dxos/random": "0.8.4-main.7ace549"
84
+ "react": "~19.2.3",
85
+ "react-dom": "~19.2.3",
86
+ "@dxos/random": "0.8.4-main.937b3ca",
87
+ "@dxos/react-ui": "0.8.4-main.937b3ca",
88
+ "@dxos/client": "0.8.4-main.937b3ca",
89
+ "@dxos/ui-theme": "0.8.4-main.937b3ca"
87
90
  },
88
91
  "publishConfig": {
89
92
  "access": "public"
@@ -9,9 +9,9 @@ import React, { useCallback, useState } from 'react';
9
9
  import { faker } from '@dxos/random';
10
10
  import { IconButton } from '@dxos/react-ui';
11
11
  import { withTheme } from '@dxos/react-ui/testing';
12
+ import { Card, CardDragPreview } from '@dxos/react-ui-mosaic';
12
13
 
13
- import { StackItem } from '../../components';
14
- import { Card, CardDragPreview } from '../Card';
14
+ import { StackItem } from '../StackItem';
15
15
 
16
16
  import { CardStack } from './CardStack';
17
17
 
@@ -94,7 +94,7 @@ const CardStackStory = () => {
94
94
 
95
95
  return (
96
96
  <CardStack.Root classNames='is-96'>
97
- <CardStack.Content>
97
+ <CardStack.Content footer>
98
98
  <CardStack.Stack id='story column' onRearrange={handleRearrange} itemsCount={column.length}>
99
99
  {column.map((card, cardIndex, cardsArray) => {
100
100
  const cardItem = { id: card.id, type: 'card' as const };
@@ -109,10 +109,10 @@ const CardStackStory = () => {
109
109
  prevSiblingId={prevCardId}
110
110
  nextSiblingId={nextCardId}
111
111
  >
112
- <Card.StaticRoot>
112
+ <Card.Root>
113
113
  <Card.Toolbar>
114
114
  <StackItem.DragHandle asChild>
115
- <Card.DragHandle toolbarItem />
115
+ <Card.DragHandle />
116
116
  </StackItem.DragHandle>
117
117
  <Card.ToolbarSeparator variant='gap' />
118
118
  <Card.ToolbarIconButton
@@ -125,18 +125,18 @@ const CardStackStory = () => {
125
125
  </Card.Toolbar>
126
126
  <Card.Poster alt={card.title} image={card.image} />
127
127
  <Card.Heading>{card.title}</Card.Heading>
128
- <Card.Text classNames='line-clamp-2'>{card.description}</Card.Text>
129
- </Card.StaticRoot>
128
+ <Card.Text variant='description'>{card.description}</Card.Text>
129
+ </Card.Root>
130
130
  <StackItem.DragPreview>
131
131
  {() => (
132
132
  <CardDragPreview.Root>
133
133
  <CardDragPreview.Content>
134
134
  <Card.Toolbar>
135
- <Card.DragHandle toolbarItem />
135
+ <Card.DragHandle />
136
136
  </Card.Toolbar>
137
137
  <Card.Poster alt={card.title} image={card.image} />
138
138
  <Card.Heading>{card.title}</Card.Heading>
139
- <Card.Text classNames='line-clamp-2'>{card.description}</Card.Text>
139
+ <Card.Text variant='description'>{card.description}</Card.Text>
140
140
  </CardDragPreview.Content>
141
141
  </CardDragPreview.Root>
142
142
  )}
@@ -6,17 +6,79 @@ 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 { Stack, type StackProps, railGridHorizontalContainFitContent } 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
+ // TODO(burdon): Root should be headless.
26
+ const CardStackRoot = forwardRef<HTMLDivElement, SharedCardStackProps>(
27
+ ({ children, classNames, asChild, role = 'none', ...props }, forwardedRef) => {
28
+ const Root = asChild ? Slot : 'div';
29
+ const rootProps = asChild
30
+ ? { classNames: [cardStackRoot, classNames] }
31
+ : { className: mx(cardStackRoot, classNames), role };
32
+
33
+ return (
34
+ <Root {...props} {...rootProps} ref={forwardedRef}>
35
+ {children}
36
+ </Root>
37
+ );
38
+ },
39
+ );
40
+
41
+ //
42
+ // Content
43
+ // TODO(burdon): Rename Viewport (should be the component that scrolls).
44
+ //
45
+
46
+ const cardStackContent = 'shrink min-bs-0 grid dx-focus-ring-group-x-indicator bg-baseSurface';
47
+
48
+ type CardStackContentProps = SharedCardStackProps & {
49
+ footer?: boolean;
50
+ };
51
+
52
+ const CardStackContent = forwardRef<HTMLDivElement, CardStackContentProps>(
53
+ ({ children, classNames, asChild, role = 'none', footer, ...props }, forwardedRef) => {
54
+ const Root = asChild ? Slot : 'div';
55
+ const baseClassNames = footer ? [cardStackContent, railGridHorizontalContainFitContent] : [cardStackContent];
56
+ const rootProps = asChild
57
+ ? { classNames: [...baseClassNames, classNames] }
58
+ : { className: mx(...baseClassNames, classNames), role };
59
+
60
+ return (
61
+ <Root {...props} {...rootProps} data-scroll-separator='false' ref={forwardedRef}>
62
+ {children}
63
+ </Root>
64
+ );
65
+ },
66
+ );
67
+
68
+ //
69
+ // Stack
70
+ // TODO(burdon): Rename Content.
71
+ //
72
+
73
+ type SharedCardStackProps = ThemedClassName<ComponentPropsWithoutRef<'div'>> & {
74
+ asChild?: boolean;
75
+ };
15
76
 
16
77
  const CardStackStack = forwardRef<
17
78
  HTMLDivElement,
18
79
  Omit<StackProps, 'orientation' | 'size' | 'rail' | 'separatorOnScroll'>
19
80
  >(({ children, classNames, itemsCount = 0, ...props }, forwardedRef) => {
81
+ // NOTE: Should not have horizontal padding since separatorOnScroll should be full width.
20
82
  return (
21
83
  <Stack
22
84
  orientation='vertical'
@@ -24,7 +86,7 @@ const CardStackStack = forwardRef<
24
86
  rail={false}
25
87
  classNames={
26
88
  /* 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]
89
+ ['plb-2', classNames]
28
90
  }
29
91
  itemsCount={itemsCount}
30
92
  separatorOnScroll={9}
@@ -37,33 +99,19 @@ const CardStackStack = forwardRef<
37
99
  );
38
100
  });
39
101
 
40
- const CardStackDragHandle = Card.DragHandle;
41
-
42
- const cardStackHeading = 'mli-2 order-first bg-transparent rounded-bs-md flex items-center';
43
-
44
- const CardStackHeading = forwardRef<HTMLDivElement, SharedCardStackProps>(
45
- ({ children, classNames, asChild, role = 'heading', ...props }, forwardedRef) => {
46
- const Root = asChild ? Slot : 'div';
47
- const rootProps = asChild
48
- ? { classNames: [cardStackHeading, classNames] }
49
- : { className: mx(cardStackHeading, classNames), role };
50
- return (
51
- <Root {...props} {...rootProps} ref={forwardedRef}>
52
- {children}
53
- </Root>
54
- );
55
- },
56
- );
102
+ //
103
+ // Item
104
+ //
57
105
 
58
- const cardStackFooter =
59
- 'plb-2 mli-2 border-bs border-transparent [[data-scroll-separator-end="true"]_&]:border-subduedSeparator';
106
+ const cardStackItem = 'contain-layout pli-2 plb-1 first-of-type:pbs-0 last-of-type:pbe-0';
60
107
 
61
- const CardStackFooter = forwardRef<HTMLDivElement, SharedCardStackProps>(
108
+ const CardStackItem = forwardRef<HTMLDivElement, SharedCardStackProps>(
62
109
  ({ children, classNames, asChild, role = 'none', ...props }, forwardedRef) => {
63
110
  const Root = asChild ? Slot : 'div';
64
111
  const rootProps = asChild
65
- ? { classNames: [cardStackFooter, classNames] }
66
- : { className: mx(cardStackFooter, classNames), role };
112
+ ? { classNames: [cardStackItem, classNames] }
113
+ : { className: mx(cardStackItem, classNames), role };
114
+
67
115
  return (
68
116
  <Root {...props} {...rootProps} ref={forwardedRef}>
69
117
  {children}
@@ -72,36 +120,19 @@ const CardStackFooter = forwardRef<HTMLDivElement, SharedCardStackProps>(
72
120
  },
73
121
  );
74
122
 
75
- const cardStackContent =
76
- 'shrink min-bs-0 bg-baseSurface border border-separator rounded-md grid dx-focus-ring-group-x-indicator kanban-drop';
123
+ //
124
+ // Heading
125
+ //
77
126
 
78
- type CardStackContentProps = SharedCardStackProps & {
79
- footer?: boolean;
80
- };
127
+ const cardStackHeading = 'mli-2 order-first bg-transparent rounded-bs-md flex items-center';
81
128
 
82
- const CardStackContent = forwardRef<HTMLDivElement, CardStackContentProps>(
83
- ({ children, classNames, asChild, role = 'none', footer = true, ...props }, forwardedRef) => {
129
+ const CardStackHeading = forwardRef<HTMLDivElement, SharedCardStackProps>(
130
+ ({ children, classNames, asChild, role = 'heading', ...props }, forwardedRef) => {
84
131
  const Root = asChild ? Slot : 'div';
85
- const baseClassNames = footer ? [cardStackContent, railGridHorizontalContainFitContent] : [cardStackContent];
86
132
  const rootProps = asChild
87
- ? { classNames: [...baseClassNames, classNames] }
88
- : { className: mx(...baseClassNames, classNames), role };
89
- return (
90
- <Root {...props} {...rootProps} data-scroll-separator='false' ref={forwardedRef}>
91
- {children}
92
- </Root>
93
- );
94
- },
95
- );
96
-
97
- const cardStackRoot = 'flex flex-col pli-2 plb-2';
133
+ ? { classNames: [cardStackHeading, classNames] }
134
+ : { className: mx(cardStackHeading, classNames), role };
98
135
 
99
- const CardStackRoot = forwardRef<HTMLDivElement, SharedCardStackProps>(
100
- ({ children, classNames, asChild, role = 'none', ...props }, forwardedRef) => {
101
- const Root = asChild ? Slot : 'div';
102
- const rootProps = asChild
103
- ? { classNames: [cardStackRoot, classNames] }
104
- : { className: mx(cardStackRoot, classNames), role };
105
136
  return (
106
137
  <Root {...props} {...rootProps} ref={forwardedRef}>
107
138
  {children}
@@ -110,14 +141,20 @@ const CardStackRoot = forwardRef<HTMLDivElement, SharedCardStackProps>(
110
141
  },
111
142
  );
112
143
 
113
- const cardStackItem = 'contain-layout pli-2 plb-1 first-of-type:pbs-0 last-of-type:pbe-0';
144
+ //
145
+ // Footer
146
+ //
114
147
 
115
- const CardStackItem = forwardRef<HTMLDivElement, SharedCardStackProps>(
148
+ const cardStackFooter =
149
+ 'plb-2 mli-2 border-bs border-transparent [[data-scroll-separator-end="true"]_&]:border-subduedSeparator';
150
+
151
+ const CardStackFooter = forwardRef<HTMLDivElement, SharedCardStackProps>(
116
152
  ({ children, classNames, asChild, role = 'none', ...props }, forwardedRef) => {
117
153
  const Root = asChild ? Slot : 'div';
118
154
  const rootProps = asChild
119
- ? { classNames: [cardStackItem, classNames] }
120
- : { className: mx(cardStackItem, classNames), role };
155
+ ? { classNames: [cardStackFooter, classNames] }
156
+ : { className: mx(cardStackFooter, classNames), role };
157
+
121
158
  return (
122
159
  <Root {...props} {...rootProps} ref={forwardedRef}>
123
160
  {children}
@@ -126,6 +163,19 @@ const CardStackItem = forwardRef<HTMLDivElement, SharedCardStackProps>(
126
163
  },
127
164
  );
128
165
 
166
+ //
167
+ // DragHandle
168
+ //
169
+
170
+ const CardStackDragHandle = Card.DragHandle;
171
+
172
+ //
173
+ // CardStack
174
+ //
175
+
176
+ /**
177
+ * @deprecated Replace with Mosaic.Stack.
178
+ */
129
179
  export const CardStack = {
130
180
  Root: CardStackRoot,
131
181
  Content: CardStackContent,
@@ -136,4 +186,11 @@ export const CardStack = {
136
186
  Item: CardStackItem,
137
187
  };
138
188
 
139
- export { cardStackRoot, cardStackFooter, cardStackHeading, cardStackContent, cardStackItem };
189
+ export {
190
+ cardStackRoot,
191
+ cardStackFooter,
192
+ cardStackHeading,
193
+ cardStackContent,
194
+ cardStackItem,
195
+ cardStackDefaultInlineSizeRem,
196
+ };
@@ -5,10 +5,10 @@
5
5
  import React, { type PropsWithChildren } from 'react';
6
6
 
7
7
  import { IconButton, useTranslation } from '@dxos/react-ui';
8
- import { mx } from '@dxos/react-ui-theme';
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 (
@@ -50,7 +50,7 @@ const CardStackDragPreviewContent = ({
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
56
  export const CardStackDragPreview = {
@@ -9,8 +9,8 @@ import React, { useCallback, useState } from 'react';
9
9
  import { faker } from '@dxos/random';
10
10
  import { withTheme } from '@dxos/react-ui/testing';
11
11
 
12
- import { type StackItemData } from '../defs';
13
12
  import { StackItem } from '../StackItem';
13
+ import { type StackItemData } from '../types';
14
14
 
15
15
  import { Stack } from './Stack';
16
16
 
@@ -7,6 +7,7 @@ import React, {
7
7
  type CSSProperties,
8
8
  Children,
9
9
  type ComponentPropsWithRef,
10
+ type FocusEvent,
10
11
  type KeyboardEvent,
11
12
  forwardRef,
12
13
  useCallback,
@@ -16,11 +17,11 @@ import React, {
16
17
  } from 'react';
17
18
 
18
19
  import { ListItem, type ThemedClassName, useId } from '@dxos/react-ui';
19
- import { mx } from '@dxos/react-ui-theme';
20
+ import { mx } from '@dxos/ui-theme';
20
21
 
21
22
  import { useStackDropForElements } from '../../hooks';
22
- import { type StackContextValue } from '../defs';
23
23
  import { StackContext } from '../StackContext';
24
+ import { type StackContextValue } from '../types';
24
25
 
25
26
  export type Orientation = 'horizontal' | 'vertical';
26
27
 
@@ -122,7 +123,7 @@ export const Stack = forwardRef<HTMLDivElement, StackProps>(
122
123
  * Handles blur events to track the last focused item within this stack.
123
124
  */
124
125
  const handleBlur = useCallback(
125
- (event: React.FocusEvent<HTMLDivElement>) => {
126
+ (event: FocusEvent<HTMLDivElement>) => {
126
127
  if (event.target) {
127
128
  const target = event.target as HTMLElement;
128
129
  const closestStackItem = target.closest(`[data-dx-item-id]`) as HTMLElement | null;
@@ -194,6 +195,7 @@ export const Stack = forwardRef<HTMLDivElement, StackProps>(
194
195
  scrollIntoViewAndFocus(adjacentItem, closestStackOrientation);
195
196
  }
196
197
  }
198
+
197
199
  if (perpendicularDelta !== 0) {
198
200
  if (ancestorStack && ancestorOrientation !== closestStackOrientation) {
199
201
  const siblingStacks = Array.from(
@@ -4,8 +4,8 @@
4
4
 
5
5
  import { createContext, useContext } from 'react';
6
6
 
7
- import { type StackItemRearrangeHandler, type StackItemSize } from './defs';
8
7
  import { type Orientation, type Size } from './Stack';
8
+ import { type StackItemRearrangeHandler, type StackItemSize } from './types';
9
9
 
10
10
  export type StackContextValue = {
11
11
  orientation: Orientation;
@@ -13,7 +13,7 @@ import { StackItem, type StackItemRootProps } from './StackItem';
13
13
  const DefaultStory = (props: StackItemRootProps) => {
14
14
  return (
15
15
  <StackItem.Root role='section' {...props} classNames='is-[20rem] border border-separator'>
16
- <StackItem.Heading>
16
+ <StackItem.Heading classNames='is-full border-be border-separator'>
17
17
  <span className='sr-only'>Title</span>
18
18
  <div role='none' className='sticky -block-start-px bg-[--sticky-bg] p-1 is-full'>
19
19
  <DropdownMenu.Root>
@@ -25,7 +25,9 @@ const DefaultStory = (props: StackItemRootProps) => {
25
25
  </DropdownMenu.Root>
26
26
  </div>
27
27
  </StackItem.Heading>
28
- <StackItem.Content>Content</StackItem.Content>
28
+ <StackItem.Content>
29
+ <div className='p-4 text-center'>Content</div>
30
+ </StackItem.Content>
29
31
  </StackItem.Root>
30
32
  );
31
33
  };
@@ -26,10 +26,10 @@ import { createPortal } from 'react-dom';
26
26
 
27
27
  import { ListItem, type ThemedClassName } from '@dxos/react-ui';
28
28
  import { resizeAttributes, sizeStyle } from '@dxos/react-ui-dnd';
29
- import { mx } from '@dxos/react-ui-theme';
29
+ import { mx } from '@dxos/ui-theme';
30
30
 
31
- import { type StackItemData, type StackItemSize } from '../defs';
32
31
  import { type ItemDragState, StackItemContext, idle, useStack, useStackItem } from '../StackContext';
32
+ import { type StackItemData, type StackItemSize } from '../types';
33
33
 
34
34
  import { StackItemContent, type StackItemContentProps } from './StackItemContent';
35
35
  import { StackItemDragHandle, type StackItemDragHandleProps } from './StackItemDragHandle';
@@ -54,6 +54,10 @@ export const DEFAULT_HORIZONTAL_SIZE = 48 satisfies StackItemSize;
54
54
  export const DEFAULT_VERTICAL_SIZE = 'min-content' satisfies StackItemSize;
55
55
  export const DEFAULT_EXTRINSIC_SIZE = DEFAULT_HORIZONTAL_SIZE satisfies StackItemSize;
56
56
 
57
+ //
58
+ // StackItemRoot
59
+ //
60
+
57
61
  type StackItemRootProps = ThemedClassName<ComponentPropsWithRef<'div'>> & {
58
62
  item: Omit<StackItemData, 'type'>;
59
63
  order?: number;
@@ -86,6 +90,7 @@ const StackItemRoot = forwardRef<HTMLDivElement, StackItemRootProps>(
86
90
  forwardedRef,
87
91
  ) => {
88
92
  const [itemElement, itemRef] = useState<HTMLDivElement | null>(null);
93
+ const composedItemRef = composeRefs<HTMLDivElement>(itemRef, forwardedRef);
89
94
  const [selfDragHandleElement, selfDragHandleRef] = useState<HTMLDivElement | null>(null);
90
95
  const [closestEdge, setEdge] = useState<Edge | null>(null);
91
96
  const [sourceId, setSourceId] = useState<string | null>(null);
@@ -96,8 +101,6 @@ const StackItemRoot = forwardRef<HTMLDivElement, StackItemRootProps>(
96
101
 
97
102
  const Root = role ?? 'div';
98
103
 
99
- const composedItemRef = composeRefs<HTMLDivElement>(itemRef, forwardedRef);
100
-
101
104
  const setSize = useCallback(
102
105
  (nextSize: StackItemSize, commit?: boolean) => {
103
106
  setInternalSize(nextSize);
@@ -110,6 +113,7 @@ const StackItemRoot = forwardRef<HTMLDivElement, StackItemRootProps>(
110
113
 
111
114
  const type = orientation === 'horizontal' ? 'column' : 'card';
112
115
 
116
+ // TODO(burdon): Factor out?
113
117
  useLayoutEffect(() => {
114
118
  if (!itemElement || !onRearrange || disableRearrange) {
115
119
  return;
@@ -183,18 +187,18 @@ const StackItemRoot = forwardRef<HTMLDivElement, StackItemRootProps>(
183
187
 
184
188
  const focusableGroupAttrs = useFocusableGroup({ tabBehavior: 'limited' });
185
189
 
186
- // Determine if the drop would result in any changes
190
+ // Determine if the drop would result in any changes.
187
191
  const shouldShowDropIndicator = () => {
188
192
  if (!closestEdge || !sourceId) {
189
193
  return false;
190
194
  }
191
195
 
192
- // Don't show indicator when dragged item is over itself
196
+ // Don't show indicator when dragged item is over itself.
193
197
  if (sourceId === item.id) {
194
198
  return false;
195
199
  }
196
200
 
197
- // Don't show indicator when dragged item is over the trailing edge of its previous sibling
201
+ // Don't show indicator when dragged item is over the trailing edge of its previous sibling.
198
202
  const isTrailingEdgeOfPrevSibling =
199
203
  prevSiblingId !== undefined &&
200
204
  sourceId === prevSiblingId &&
@@ -268,37 +272,45 @@ const StackItemRoot = forwardRef<HTMLDivElement, StackItemRootProps>(
268
272
  },
269
273
  );
270
274
 
275
+ //
276
+ // StackItemDragPreview
277
+ //
278
+
271
279
  type StackItemDragPreviewProps = {
272
280
  children: ({ item }: { item: any }) => ReactNode;
273
281
  };
274
282
 
275
- export const StackItemDragPreview = ({ children }: StackItemDragPreviewProps) => {
283
+ const StackItemDragPreview = ({ children }: StackItemDragPreviewProps) => {
276
284
  const { state } = useStackItem();
277
285
  return state?.type === 'preview' ? createPortal(children({ item: state.item }), state.container) : null;
278
286
  };
279
287
 
288
+ //
289
+ // StackItem
290
+ //
291
+
280
292
  export const StackItem = {
281
293
  Root: StackItemRoot,
282
294
  Content: StackItemContent,
295
+ DragHandle: StackItemDragHandle,
296
+ DragPreview: StackItemDragPreview,
283
297
  Heading: StackItemHeading,
284
298
  HeadingLabel: StackItemHeadingLabel,
285
299
  HeadingStickyContent: StackItemHeadingStickyContent,
286
300
  ResizeHandle: StackItemResizeHandle,
287
- DragHandle: StackItemDragHandle,
288
301
  Sigil: StackItemSigil,
289
302
  SigilButton: StackItemSigilButton,
290
- DragPreview: StackItemDragPreview,
291
303
  };
292
304
 
293
305
  export type {
294
306
  StackItemRootProps,
295
307
  StackItemContentProps,
308
+ StackItemDragHandleProps,
309
+ StackItemDragPreviewProps,
296
310
  StackItemHeadingProps,
297
311
  StackItemHeadingLabelProps,
298
312
  StackItemResizeHandleProps,
299
- StackItemDragHandleProps,
300
313
  StackItemSigilProps,
301
314
  StackItemSigilButtonProps,
302
315
  StackItemSigilAction,
303
- StackItemDragPreviewProps,
304
316
  };