@dxos/react-ui-stack 0.8.3 → 0.8.4-main.03d5cd7b56

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 (114) hide show
  1. package/dist/lib/browser/index.mjs +546 -1025
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/browser/{testing → playwright}/index.mjs +5 -1
  5. package/dist/lib/browser/{testing → playwright}/index.mjs.map +3 -3
  6. package/dist/lib/browser/translations.mjs +23 -0
  7. package/dist/lib/browser/translations.mjs.map +7 -0
  8. package/dist/lib/node-esm/index.mjs +546 -1025
  9. package/dist/lib/node-esm/index.mjs.map +4 -4
  10. package/dist/lib/node-esm/meta.json +1 -1
  11. package/dist/lib/node-esm/{testing → playwright}/index.mjs +5 -1
  12. package/dist/lib/node-esm/{testing → playwright}/index.mjs.map +3 -3
  13. package/dist/lib/node-esm/translations.mjs +25 -0
  14. package/dist/lib/node-esm/translations.mjs.map +7 -0
  15. package/dist/types/src/components/Stack/Stack.d.ts +13 -10
  16. package/dist/types/src/components/Stack/Stack.d.ts.map +1 -1
  17. package/dist/types/src/components/Stack/Stack.stories.d.ts +12 -3
  18. package/dist/types/src/components/Stack/Stack.stories.d.ts.map +1 -1
  19. package/dist/types/src/components/StackContext.d.ts +2 -1
  20. package/dist/types/src/components/StackContext.d.ts.map +1 -1
  21. package/dist/types/src/components/StackItem/MenuSignifier.d.ts.map +1 -1
  22. package/dist/types/src/components/StackItem/StackItem.d.ts +14 -17
  23. package/dist/types/src/components/StackItem/StackItem.d.ts.map +1 -1
  24. package/dist/types/src/components/StackItem/StackItem.stories.d.ts +13 -5
  25. package/dist/types/src/components/StackItem/StackItem.stories.d.ts.map +1 -1
  26. package/dist/types/src/components/StackItem/StackItemContent.d.ts +4 -37
  27. package/dist/types/src/components/StackItem/StackItemContent.d.ts.map +1 -1
  28. package/dist/types/src/components/StackItem/StackItemDragHandle.d.ts.map +1 -1
  29. package/dist/types/src/components/StackItem/StackItemHeading.d.ts +2 -2
  30. package/dist/types/src/components/StackItem/StackItemHeading.d.ts.map +1 -1
  31. package/dist/types/src/components/StackItem/StackItemResizeHandle.d.ts +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/index.d.ts +1 -1
  36. package/dist/types/src/components/index.d.ts.map +1 -1
  37. package/dist/types/src/components/{defs.d.ts → types.d.ts} +1 -1
  38. package/dist/types/src/components/types.d.ts.map +1 -0
  39. package/dist/types/src/hooks/useStackDropForElements.d.ts +9 -7
  40. package/dist/types/src/hooks/useStackDropForElements.d.ts.map +1 -1
  41. package/dist/types/src/index.d.ts +0 -2
  42. package/dist/types/src/index.d.ts.map +1 -1
  43. package/dist/types/src/playwright/index.d.ts.map +1 -0
  44. package/dist/types/src/playwright/playwright.config.d.ts +3 -0
  45. package/dist/types/src/playwright/playwright.config.d.ts.map +1 -0
  46. package/dist/types/src/playwright/stack-manager.d.ts.map +1 -0
  47. package/dist/types/src/translations.d.ts +13 -14
  48. package/dist/types/src/translations.d.ts.map +1 -1
  49. package/dist/types/tsconfig.tsbuildinfo +1 -1
  50. package/package.json +54 -48
  51. package/src/components/Stack/Stack.stories.tsx +15 -18
  52. package/src/components/Stack/Stack.tsx +239 -53
  53. package/src/components/StackContext.tsx +2 -1
  54. package/src/components/StackItem/MenuSignifier.tsx +2 -9
  55. package/src/components/StackItem/StackItem.stories.tsx +23 -19
  56. package/src/components/StackItem/StackItem.tsx +61 -43
  57. package/src/components/StackItem/StackItemContent.tsx +24 -44
  58. package/src/components/StackItem/StackItemDragHandle.tsx +4 -3
  59. package/src/components/StackItem/StackItemHeading.tsx +17 -24
  60. package/src/components/StackItem/StackItemResizeHandle.tsx +2 -2
  61. package/src/components/StackItem/StackItemSigil.tsx +11 -7
  62. package/src/components/index.ts +2 -1
  63. package/src/hooks/useStackDropForElements.ts +61 -44
  64. package/src/index.ts +0 -5
  65. package/src/{testing → playwright}/index.ts +1 -1
  66. package/src/playwright/playwright.config.ts +17 -0
  67. package/src/playwright/smoke.spec.ts +7 -5
  68. package/src/translations.ts +13 -11
  69. package/dist/lib/node/index.cjs +0 -1220
  70. package/dist/lib/node/index.cjs.map +0 -7
  71. package/dist/lib/node/meta.json +0 -1
  72. package/dist/lib/node/testing/index.cjs +0 -81
  73. package/dist/lib/node/testing/index.cjs.map +0 -7
  74. package/dist/types/src/components/defs.d.ts.map +0 -1
  75. package/dist/types/src/components/deprecated/LayoutControls.d.ts +0 -19
  76. package/dist/types/src/components/deprecated/LayoutControls.d.ts.map +0 -1
  77. package/dist/types/src/exemplars/Card/Card.d.ts +0 -62
  78. package/dist/types/src/exemplars/Card/Card.d.ts.map +0 -1
  79. package/dist/types/src/exemplars/Card/Card.stories-todo.d.ts +0 -1
  80. package/dist/types/src/exemplars/Card/Card.stories-todo.d.ts.map +0 -1
  81. package/dist/types/src/exemplars/Card/CardDragPreview.d.ts +0 -6
  82. package/dist/types/src/exemplars/Card/CardDragPreview.d.ts.map +0 -1
  83. package/dist/types/src/exemplars/Card/fragments.d.ts +0 -13
  84. package/dist/types/src/exemplars/Card/fragments.d.ts.map +0 -1
  85. package/dist/types/src/exemplars/Card/index.d.ts +0 -4
  86. package/dist/types/src/exemplars/Card/index.d.ts.map +0 -1
  87. package/dist/types/src/exemplars/CardStack/CardStack.d.ts +0 -34
  88. package/dist/types/src/exemplars/CardStack/CardStack.d.ts.map +0 -1
  89. package/dist/types/src/exemplars/CardStack/CardStack.stories-todo.d.ts +0 -1
  90. package/dist/types/src/exemplars/CardStack/CardStack.stories-todo.d.ts.map +0 -1
  91. package/dist/types/src/exemplars/CardStack/CardStackDragPreview.d.ts +0 -9
  92. package/dist/types/src/exemplars/CardStack/CardStackDragPreview.d.ts.map +0 -1
  93. package/dist/types/src/exemplars/CardStack/index.d.ts +0 -3
  94. package/dist/types/src/exemplars/CardStack/index.d.ts.map +0 -1
  95. package/dist/types/src/exemplars/index.d.ts +0 -3
  96. package/dist/types/src/exemplars/index.d.ts.map +0 -1
  97. package/dist/types/src/testing/index.d.ts.map +0 -1
  98. package/dist/types/src/testing/stack-manager.d.ts.map +0 -1
  99. package/src/components/deprecated/LayoutControls.tsx +0 -109
  100. package/src/exemplars/Card/Card.stories-todo.tsx +0 -135
  101. package/src/exemplars/Card/Card.tsx +0 -182
  102. package/src/exemplars/Card/CardDragPreview.tsx +0 -22
  103. package/src/exemplars/Card/fragments.ts +0 -25
  104. package/src/exemplars/Card/index.ts +0 -7
  105. package/src/exemplars/CardStack/CardStack.stories-todo.tsx +0 -80
  106. package/src/exemplars/CardStack/CardStack.tsx +0 -119
  107. package/src/exemplars/CardStack/CardStackDragPreview.tsx +0 -61
  108. package/src/exemplars/CardStack/index.ts +0 -6
  109. package/src/exemplars/index.ts +0 -6
  110. package/src/playwright/playwright.config.cts +0 -18
  111. /package/dist/types/src/{testing → playwright}/index.d.ts +0 -0
  112. /package/dist/types/src/{testing → playwright}/stack-manager.d.ts +0 -0
  113. /package/src/components/{defs.ts → types.ts} +0 -0
  114. /package/src/{testing → playwright}/stack-manager.ts +0 -0
@@ -2,73 +2,90 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';
6
- import { dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
7
5
  import { autoScrollForElements } from '@atlaskit/pragmatic-drag-and-drop-auto-scroll/element';
8
6
  import { attachClosestEdge, extractClosestEdge } from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge';
7
+ import { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';
8
+ import { dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
9
9
  import { useLayoutEffect, useState } from 'react';
10
10
 
11
- import { type StackItemRearrangeHandler, type StackItemData, type Orientation } from '../components';
11
+ import { type Orientation, type StackItemData, type StackItemRearrangeHandler } from '../components';
12
+
13
+ const noop = () => {};
14
+
15
+ export type UseStackDropForElementsProps = {
16
+ id?: string;
17
+ element: HTMLDivElement | null;
18
+ scrollElement?: HTMLDivElement | null;
19
+ orientation: Orientation;
20
+ selfDroppable: boolean;
21
+ onRearrange?: StackItemRearrangeHandler;
22
+ };
23
+
24
+ export type UseStackDropForElements = {
25
+ dropping: boolean;
26
+ };
12
27
 
13
28
  /**
14
- * Hook to handle drag and drop functionality for Stack components.
29
+ * Hook to handle drag-and-drop functionality for Stack components.
15
30
  */
16
31
  export const useStackDropForElements = ({
17
32
  id,
18
33
  element,
19
34
  scrollElement = element,
20
- selfDroppable,
21
35
  orientation,
36
+ selfDroppable,
22
37
  onRearrange,
23
- }: {
24
- id?: string;
25
- element: HTMLDivElement | null;
26
- scrollElement?: HTMLDivElement | null;
27
- selfDroppable: boolean;
28
- orientation: Orientation;
29
- onRearrange?: StackItemRearrangeHandler;
30
- }) => {
38
+ }: UseStackDropForElementsProps): UseStackDropForElements => {
31
39
  const [dropping, setDropping] = useState(false);
32
40
 
33
41
  useLayoutEffect(() => {
34
- if (!element || !selfDroppable) {
42
+ if (!element) {
35
43
  return;
36
44
  }
37
45
 
38
46
  const acceptSourceType = orientation === 'horizontal' ? 'column' : 'card';
39
47
 
48
+ // TODO(burdon): Use monitor?
40
49
  return combine(
41
- dropTargetForElements({
42
- element,
43
- getData: ({ input, element }) => {
44
- return attachClosestEdge(
45
- { id, type: orientation === 'horizontal' ? 'card' : 'column' },
46
- { input, element, allowedEdges: [orientation === 'horizontal' ? 'left' : 'top'] },
47
- );
48
- },
49
- onDragEnter: ({ source }) => {
50
- if (source.data.type === acceptSourceType) {
51
- setDropping(true);
52
- }
53
- },
54
- onDrag: ({ source }) => {
55
- if (source.data.type === acceptSourceType) {
56
- setDropping(true);
57
- }
58
- },
59
- onDragLeave: () => {
60
- return setDropping(false);
61
- },
62
- onDrop: ({ self, source }) => {
63
- setDropping(false);
64
- if (source.data.type === acceptSourceType && selfDroppable && onRearrange) {
65
- onRearrange(source.data as StackItemData, self.data as StackItemData, extractClosestEdge(self.data));
66
- }
67
- },
68
- }),
69
- autoScrollForElements({ element: scrollElement as Element, getAllowedAxis: () => orientation }),
50
+ selfDroppable
51
+ ? dropTargetForElements({
52
+ element,
53
+ getData: ({ input, element }) => {
54
+ return attachClosestEdge(
55
+ { id, type: orientation === 'horizontal' ? 'card' : 'column' },
56
+ { input, element, allowedEdges: [orientation === 'horizontal' ? 'left' : 'top'] },
57
+ );
58
+ },
59
+ onDragEnter: ({ source }) => {
60
+ if (source.data.type === acceptSourceType) {
61
+ setDropping(true);
62
+ }
63
+ },
64
+ onDrag: ({ source }) => {
65
+ if (source.data.type === acceptSourceType) {
66
+ setDropping(true);
67
+ }
68
+ },
69
+ onDragLeave: () => {
70
+ return setDropping(false);
71
+ },
72
+ onDrop: ({ self, source }) => {
73
+ setDropping(false);
74
+ if (source.data.type === acceptSourceType && selfDroppable && onRearrange) {
75
+ onRearrange(source.data as StackItemData, self.data as StackItemData, extractClosestEdge(self.data));
76
+ }
77
+ },
78
+ })
79
+ : noop,
80
+
81
+ scrollElement
82
+ ? autoScrollForElements({
83
+ element: scrollElement,
84
+ getAllowedAxis: () => orientation,
85
+ })
86
+ : noop,
70
87
  );
71
- }, [element, scrollElement, selfDroppable, orientation, id, onRearrange]);
88
+ }, [id, element, scrollElement, selfDroppable, orientation, onRearrange]);
72
89
 
73
90
  return { dropping };
74
91
  };
package/src/index.ts CHANGED
@@ -3,8 +3,3 @@
3
3
  //
4
4
 
5
5
  export * from './components';
6
-
7
- // TODO(thure): Consider exporting exemplars from separate endpoints.
8
- export * from './exemplars';
9
-
10
- export { default as translations } from './translations';
@@ -1,5 +1,5 @@
1
1
  //
2
- // Copyright 2023 DXOS.org
2
+ // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
5
  export * from './stack-manager';
@@ -0,0 +1,17 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { defineConfig } from '@playwright/test';
6
+
7
+ import { e2ePreset } from '@dxos/test-utils/playwright';
8
+
9
+ export default defineConfig({
10
+ ...e2ePreset(import.meta.dirname),
11
+ // TODO(wittjosiah): Avoid hard-coding ports.
12
+ webServer: {
13
+ command: 'pnpm storybook dev --ci --quiet --port=9003 --config-dir=.storybook',
14
+ port: 9003,
15
+ reuseExistingServer: false,
16
+ },
17
+ });
@@ -6,12 +6,14 @@ import { expect, test } from '@playwright/test';
6
6
 
7
7
  import { setupPage, storybookUrl } from '@dxos/test-utils/playwright';
8
8
 
9
- import { StackManager } from '../testing';
9
+ import { StackManager } from './stack-manager';
10
+
11
+ const PORT = 9003;
10
12
 
11
13
  // TODO(wittjosiah): Update for new stack.
12
14
  test.describe.skip('Stack', () => {
13
15
  test('remove', async ({ browser }) => {
14
- const { page } = await setupPage(browser, { url: storybookUrl('ui-react-ui-stack-stack--transfer') });
16
+ const { page } = await setupPage(browser, { url: storybookUrl('ui-react-ui-stack-stack--transfer', PORT) });
15
17
  await page.getByTestId('stack-transfer').waitFor({ state: 'visible' });
16
18
 
17
19
  const stack = new StackManager(page.getByTestId('stack-1'));
@@ -24,7 +26,7 @@ test.describe.skip('Stack', () => {
24
26
  });
25
27
 
26
28
  test('rearrange', async ({ browser }) => {
27
- const { page } = await setupPage(browser, { url: storybookUrl('ui-react-ui-stack-stack--transfer') });
29
+ const { page } = await setupPage(browser, { url: storybookUrl('ui-react-ui-stack-stack--transfer', PORT) });
28
30
  await page.getByTestId('stack-transfer').waitFor({ state: 'visible' });
29
31
 
30
32
  const stack = new StackManager(page.getByTestId('stack-1'));
@@ -41,7 +43,7 @@ test.describe.skip('Stack', () => {
41
43
  test.skip();
42
44
  }
43
45
 
44
- const { page } = await setupPage(browser, { url: storybookUrl('ui-react-ui-stack-stack--transfer') });
46
+ const { page } = await setupPage(browser, { url: storybookUrl('ui-react-ui-stack-stack--transfer', PORT) });
45
47
  await page.getByTestId('stack-transfer').waitFor({ state: 'visible' });
46
48
 
47
49
  const stack1 = new StackManager(page.getByTestId('stack-1'));
@@ -61,7 +63,7 @@ test.describe.skip('Stack', () => {
61
63
  });
62
64
 
63
65
  test('copy', async ({ browser }) => {
64
- const { page } = await setupPage(browser, { url: storybookUrl('ui-react-ui-stack-stack--copy') });
66
+ const { page } = await setupPage(browser, { url: storybookUrl('ui-react-ui-stack-stack--copy', PORT) });
65
67
  await page.getByTestId('stack-copy').waitFor({ state: 'visible' });
66
68
 
67
69
  const stack1 = new StackManager(page.getByTestId('stack-1'));
@@ -2,21 +2,23 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export const translationKey = 'stack';
5
+ import { type Resource } from '@dxos/react-ui';
6
6
 
7
- export default [
7
+ export const translationKey = '@dxos/react-ui-stack';
8
+
9
+ export const translations = [
8
10
  {
9
11
  'en-US': {
10
12
  [translationKey]: {
11
- 'resize label': 'Drag to resize',
12
- 'drag handle label': 'Drag to rearrange',
13
- 'pin start label': 'Pin to the left sidebar',
14
- 'pin end label': 'Pin to the right sidebar',
15
- 'increment start label': 'Move to the left',
16
- 'increment end label': 'Move to the right',
17
- 'close label': 'Close',
18
- 'minify label': 'Minify',
13
+ 'resize.label': 'Drag to resize',
14
+ 'drag-handle.label': 'Drag to rearrange',
15
+ 'pin-start.label': 'Pin to the left sidebar',
16
+ 'pin-end.label': 'Pin to the right sidebar',
17
+ 'increment-start.label': 'Move to the left',
18
+ 'increment-end.label': 'Move to the right',
19
+ 'close.label': 'Close',
20
+ 'minify.label': 'Minify',
19
21
  },
20
22
  },
21
23
  },
22
- ];
24
+ ] as const satisfies Resource[];