@dxos/react-ui-stack 0.8.4-main.f9ba587 → 0.8.4-main.fffef41

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 (88) hide show
  1. package/dist/lib/browser/chunk-3F2KBXLP.mjs +1482 -0
  2. package/dist/lib/browser/chunk-3F2KBXLP.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +45 -1158
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/playwright/index.mjs +61 -0
  7. package/dist/lib/browser/playwright/index.mjs.map +7 -0
  8. package/dist/lib/browser/testing/index.mjs +25 -51
  9. package/dist/lib/browser/testing/index.mjs.map +4 -4
  10. package/dist/lib/node-esm/chunk-SYKFLQGK.mjs +1484 -0
  11. package/dist/lib/node-esm/chunk-SYKFLQGK.mjs.map +7 -0
  12. package/dist/lib/node-esm/index.mjs +45 -1159
  13. package/dist/lib/node-esm/index.mjs.map +4 -4
  14. package/dist/lib/node-esm/meta.json +1 -1
  15. package/dist/lib/node-esm/playwright/index.mjs +63 -0
  16. package/dist/lib/node-esm/playwright/index.mjs.map +7 -0
  17. package/dist/lib/node-esm/testing/index.mjs +24 -51
  18. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  19. package/dist/types/src/components/Image/Image.d.ts +14 -0
  20. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  21. package/dist/types/src/components/Image/Image.stories.d.ts +33 -0
  22. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  23. package/dist/types/src/components/Image/index.d.ts +2 -0
  24. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  25. package/dist/types/src/components/Stack/Stack.d.ts +15 -7
  26. package/dist/types/src/components/Stack/Stack.d.ts.map +1 -1
  27. package/dist/types/src/components/Stack/Stack.stories.d.ts +12 -3
  28. package/dist/types/src/components/Stack/Stack.stories.d.ts.map +1 -1
  29. package/dist/types/src/components/StackContext.d.ts +2 -1
  30. package/dist/types/src/components/StackContext.d.ts.map +1 -1
  31. package/dist/types/src/components/StackItem/StackItem.d.ts +7 -6
  32. package/dist/types/src/components/StackItem/StackItem.d.ts.map +1 -1
  33. package/dist/types/src/components/StackItem/StackItem.stories.d.ts +13 -5
  34. package/dist/types/src/components/StackItem/StackItem.stories.d.ts.map +1 -1
  35. package/dist/types/src/components/StackItem/StackItemContent.d.ts +20 -10
  36. package/dist/types/src/components/StackItem/StackItemContent.d.ts.map +1 -1
  37. package/dist/types/src/components/StackItem/StackItemHeading.d.ts +1 -1
  38. package/dist/types/src/components/StackItem/StackItemHeading.d.ts.map +1 -1
  39. package/dist/types/src/components/StackItem/StackItemResizeHandle.d.ts.map +1 -1
  40. package/dist/types/src/components/StackItem/StackItemSigil.d.ts.map +1 -1
  41. package/dist/types/src/components/index.d.ts +2 -1
  42. package/dist/types/src/components/index.d.ts.map +1 -1
  43. package/dist/types/src/exemplars/Card/Card.d.ts +25 -13
  44. package/dist/types/src/exemplars/Card/Card.d.ts.map +1 -1
  45. package/dist/types/src/exemplars/Card/Card.stories.d.ts +12 -4
  46. package/dist/types/src/exemplars/Card/Card.stories.d.ts.map +1 -1
  47. package/dist/types/src/exemplars/Card/fragments.d.ts +3 -2
  48. package/dist/types/src/exemplars/Card/fragments.d.ts.map +1 -1
  49. package/dist/types/src/exemplars/CardStack/CardStack.d.ts +3 -1
  50. package/dist/types/src/exemplars/CardStack/CardStack.d.ts.map +1 -1
  51. package/dist/types/src/exemplars/CardStack/CardStack.stories.d.ts +9 -3
  52. package/dist/types/src/exemplars/CardStack/CardStack.stories.d.ts.map +1 -1
  53. package/dist/types/src/hooks/useStackDropForElements.d.ts +3 -3
  54. package/dist/types/src/hooks/useStackDropForElements.d.ts.map +1 -1
  55. package/dist/types/src/playwright/index.d.ts +2 -0
  56. package/dist/types/src/playwright/index.d.ts.map +1 -0
  57. package/dist/types/src/playwright/stack-manager.d.ts.map +1 -0
  58. package/dist/types/src/testing/CardContainer.d.ts +6 -0
  59. package/dist/types/src/testing/CardContainer.d.ts.map +1 -0
  60. package/dist/types/src/testing/index.d.ts +1 -1
  61. package/dist/types/tsconfig.tsbuildinfo +1 -1
  62. package/package.json +36 -30
  63. package/src/components/Image/Image.stories.tsx +84 -0
  64. package/src/components/Image/Image.tsx +222 -0
  65. package/src/components/Image/index.ts +5 -0
  66. package/src/components/Stack/Stack.stories.tsx +8 -9
  67. package/src/components/Stack/Stack.tsx +222 -25
  68. package/src/components/StackContext.tsx +2 -1
  69. package/src/components/StackItem/StackItem.stories.tsx +16 -14
  70. package/src/components/StackItem/StackItem.tsx +26 -18
  71. package/src/components/StackItem/StackItemContent.tsx +21 -9
  72. package/src/components/StackItem/StackItemHeading.tsx +4 -8
  73. package/src/components/StackItem/StackItemResizeHandle.tsx +2 -1
  74. package/src/components/StackItem/StackItemSigil.tsx +2 -1
  75. package/src/components/index.ts +2 -1
  76. package/src/exemplars/Card/Card.stories.tsx +29 -43
  77. package/src/exemplars/Card/Card.tsx +67 -24
  78. package/src/exemplars/Card/fragments.ts +3 -2
  79. package/src/exemplars/CardStack/CardStack.stories.tsx +11 -10
  80. package/src/exemplars/CardStack/CardStack.tsx +12 -9
  81. package/src/hooks/useStackDropForElements.ts +43 -36
  82. package/src/playwright/index.ts +5 -0
  83. package/src/playwright/smoke.spec.ts +1 -1
  84. package/src/testing/CardContainer.tsx +37 -0
  85. package/src/testing/index.ts +1 -1
  86. package/dist/types/src/testing/stack-manager.d.ts.map +0 -1
  87. /package/dist/types/src/{testing → playwright}/stack-manager.d.ts +0 -0
  88. /package/src/{testing → playwright}/stack-manager.ts +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/react-ui-stack",
3
- "version": "0.8.4-main.f9ba587",
3
+ "version": "0.8.4-main.fffef41",
4
4
  "description": "A stack component.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -14,18 +14,23 @@
14
14
  "browser": "./dist/lib/browser/index.mjs",
15
15
  "node": "./dist/lib/node-esm/index.mjs"
16
16
  },
17
+ "./playwright": {
18
+ "types": "./dist/types/src/playwright/index.d.ts",
19
+ "browser": "./dist/lib/browser/playwright/index.mjs",
20
+ "node": "./dist/lib/node-esm/playwright/index.mjs"
21
+ },
17
22
  "./testing": {
18
23
  "types": "./dist/types/src/testing/index.d.ts",
19
24
  "browser": "./dist/lib/browser/testing/index.mjs",
20
- "node": {
21
- "require": "./dist/lib/node/testing/index.cjs",
22
- "default": "./dist/lib/node-esm/testing/index.mjs"
23
- }
25
+ "node": "./dist/lib/node-esm/testing/index.mjs"
24
26
  }
25
27
  },
26
28
  "types": "dist/types/src/index.d.ts",
27
29
  "typesVersions": {
28
30
  "*": {
31
+ "playwright": [
32
+ "dist/types/src/playwright/index.d.ts"
33
+ ],
29
34
  "testing": [
30
35
  "dist/types/src/testing/index.d.ts"
31
36
  ]
@@ -49,35 +54,36 @@
49
54
  "@radix-ui/react-slot": "1.1.2",
50
55
  "@radix-ui/react-use-controllable-state": "1.1.0",
51
56
  "react-resize-detector": "^11.0.1",
52
- "@dxos/echo-schema": "0.8.4-main.f9ba587",
53
- "@dxos/keyboard": "0.8.4-main.f9ba587",
54
- "@dxos/live-object": "0.8.4-main.f9ba587",
55
- "@dxos/react-ui-attention": "0.8.4-main.f9ba587",
56
- "@dxos/util": "0.8.4-main.f9ba587",
57
- "@dxos/react-ui-dnd": "0.8.4-main.f9ba587"
57
+ "@dxos/echo": "0.8.4-main.fffef41",
58
+ "@dxos/keyboard": "0.8.4-main.fffef41",
59
+ "@dxos/react-ui-attention": "0.8.4-main.fffef41",
60
+ "@dxos/live-object": "0.8.4-main.fffef41",
61
+ "@dxos/react-ui-dnd": "0.8.4-main.fffef41",
62
+ "@dxos/storybook-utils": "0.8.4-main.fffef41",
63
+ "@dxos/util": "0.8.4-main.fffef41"
58
64
  },
59
65
  "devDependencies": {
60
- "@types/react": "~18.2.0",
61
- "@types/react-dom": "~18.2.0",
62
- "react": "~18.2.0",
63
- "react-dom": "~18.2.0",
64
- "vite": "5.4.7",
65
- "@dxos/app-graph": "0.8.4-main.f9ba587",
66
- "@dxos/echo-schema": "0.8.4-main.f9ba587",
67
- "@dxos/random": "0.8.4-main.f9ba587",
68
- "@dxos/client": "0.8.4-main.f9ba587",
69
- "@dxos/react-ui-theme": "0.8.4-main.f9ba587",
70
- "@dxos/react-ui": "0.8.4-main.f9ba587",
71
- "@dxos/storybook-utils": "0.8.4-main.f9ba587",
72
- "@dxos/test-utils": "0.8.4-main.f9ba587"
66
+ "@types/react": "~19.2.2",
67
+ "@types/react-dom": "~19.2.2",
68
+ "react": "~19.2.0",
69
+ "react-dom": "~19.2.0",
70
+ "vite": "7.1.9",
71
+ "@dxos/app-graph": "0.8.4-main.fffef41",
72
+ "@dxos/client": "0.8.4-main.fffef41",
73
+ "@dxos/random": "0.8.4-main.fffef41",
74
+ "@dxos/react-ui-theme": "0.8.4-main.fffef41",
75
+ "@dxos/react-ui": "0.8.4-main.fffef41",
76
+ "@dxos/echo": "0.8.4-main.fffef41",
77
+ "@dxos/test-utils": "0.8.4-main.fffef41",
78
+ "@dxos/storybook-utils": "0.8.4-main.fffef41"
73
79
  },
74
80
  "peerDependencies": {
75
- "react": "~18.2.0",
76
- "react-dom": "~18.2.0",
77
- "@dxos/client": "0.8.4-main.f9ba587",
78
- "@dxos/random": "0.8.4-main.f9ba587",
79
- "@dxos/react-ui": "0.8.4-main.f9ba587",
80
- "@dxos/react-ui-theme": "0.8.4-main.f9ba587"
81
+ "react": "^19.0.0",
82
+ "react-dom": "^19.0.0",
83
+ "@dxos/client": "0.8.4-main.fffef41",
84
+ "@dxos/random": "0.8.4-main.fffef41",
85
+ "@dxos/react-ui": "0.8.4-main.fffef41",
86
+ "@dxos/react-ui-theme": "0.8.4-main.fffef41"
81
87
  },
82
88
  "publishConfig": {
83
89
  "access": "public"
@@ -0,0 +1,84 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useMemo } from 'react';
7
+
8
+ import { faker } from '@dxos/random';
9
+ import { withTheme } from '@dxos/react-ui/testing';
10
+
11
+ import { Image } from './Image';
12
+
13
+ const seed = Math.random();
14
+
15
+ faker.seed(seed);
16
+
17
+ const meta = {
18
+ title: 'ui/react-ui-stack/Image',
19
+ component: Image,
20
+ render: (args) => (
21
+ <div className='absolute inset-0 flex place-items-center'>
22
+ <Image {...args} />
23
+ </div>
24
+ ),
25
+ decorators: [withTheme],
26
+ parameters: {
27
+ layout: 'centered',
28
+ },
29
+ } satisfies Meta<typeof Image>;
30
+
31
+ export default meta;
32
+
33
+ type Story = StoryObj<typeof meta>;
34
+
35
+ export const Default: Story = {
36
+ args: {
37
+ src: faker.image.url(),
38
+ },
39
+ };
40
+
41
+ /**
42
+ * Access to image at 'https://dxos.network/dxos-logotype-blue.png'
43
+ * from origin 'http://localhost:9009' has been blocked by CORS policy:
44
+ * No 'Access-Control-Allow-Origin' header is present on the requested resource.
45
+ */
46
+ export const Cors: Story = {
47
+ args: {
48
+ src: 'https://dxos.network/dxos-logotype-blue.png',
49
+ classNames: 'is-[20rem]',
50
+ },
51
+ };
52
+
53
+ export const Corners: Story = {
54
+ args: {
55
+ src: 'https://media.licdn.com/dms/image/v2/D4D0BAQEY4OiENeMR4A/company-logo_200_200/company-logo_200_200/0/1728648673877/moonfire_logo?e=1763596800&v=beta&t=_Jmhg-vu5uqUR88YiTbDFOC4ShlUbjk63_7-JQpgK9A',
56
+ classNames: 'is-[20rem]',
57
+ },
58
+ };
59
+
60
+ export const SVG: Story = {
61
+ args: {
62
+ src: 'https://dxos.network/bg-kube.svg',
63
+ classNames: 'is-[20rem]',
64
+ },
65
+ };
66
+
67
+ export const Many: Story = {
68
+ args: {
69
+ src: 'https://dxos.network/bg-kube.svg',
70
+ },
71
+ render: () => {
72
+ const images = useMemo(
73
+ () => Array.from({ length: 9 }, (_, i) => `https://picsum.photos/seed/${seed + i}/500/500`),
74
+ [],
75
+ );
76
+ return (
77
+ <div className='is-[60rem] grid grid-cols-3 grid-rows-3 gap-8'>
78
+ {images.map((src, i) => (
79
+ <Image key={i} src={src} classNames='is-[18rem] bs-[12rem]' />
80
+ ))}
81
+ </div>
82
+ );
83
+ },
84
+ };
@@ -0,0 +1,222 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, { type SyntheticEvent, useCallback, useRef, useState } from 'react';
6
+
7
+ import { type ThemedClassName } from '@dxos/react-ui';
8
+ import { mx } from '@dxos/react-ui-theme';
9
+
10
+ const cache = new Map<string, string>();
11
+
12
+ export type ImageProps = ThemedClassName<
13
+ {
14
+ src: string;
15
+ alt?: string;
16
+ crossOrigin?: 'anonymous' | 'use-credentials' | '';
17
+ } & ColorOptions
18
+ >;
19
+
20
+ export const Image = ({
21
+ classNames,
22
+ src,
23
+ alt = '',
24
+ crossOrigin = 'anonymous',
25
+ sampleSize = 64,
26
+ contrast = 0.9,
27
+ }: ImageProps) => {
28
+ const [crossOriginState, setCrossOriginState] = useState<ImageProps['crossOrigin']>(crossOrigin);
29
+ const [dominantColor, setDominantColor] = useState<string | undefined>(undefined);
30
+ const [imageLoaded, setImageLoaded] = useState<boolean>(false);
31
+ const canvasRef = useRef<HTMLCanvasElement>(null);
32
+
33
+ // CORS not supported by server.
34
+ const handleImageError = (): void => {
35
+ setCrossOriginState(undefined);
36
+ };
37
+
38
+ const handleImageLoad = useCallback(
39
+ ({ target }: SyntheticEvent<HTMLImageElement>): void => {
40
+ const rgb = cache.get(src);
41
+ if (rgb) {
42
+ setDominantColor(rgb);
43
+ setImageLoaded(true);
44
+ return;
45
+ }
46
+
47
+ const img = target as HTMLImageElement;
48
+ if (!canvasRef.current) {
49
+ return;
50
+ }
51
+
52
+ try {
53
+ const color = extractDominantColor(canvasRef.current, img, { sampleSize, contrast });
54
+ if (color) {
55
+ const rgb = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
56
+ cache.set(src, rgb);
57
+ setDominantColor(rgb);
58
+ }
59
+ } catch {
60
+ setCrossOriginState(undefined);
61
+ }
62
+
63
+ setImageLoaded(true);
64
+ },
65
+ [sampleSize, contrast, src],
66
+ );
67
+
68
+ return (
69
+ <div
70
+ className={mx(`relative flex is-full justify-center overflow-hidden transition-all duration-700`, classNames)}
71
+ style={{
72
+ backgroundColor: dominantColor,
73
+ }}
74
+ >
75
+ {/* Hidden canvas for color extraction. */}
76
+ <canvas ref={canvasRef} style={{ display: 'none' }} aria-hidden='true' />
77
+
78
+ {/* Background gradient overlay for smooth transition. */}
79
+ <div
80
+ className='absolute inset-0 pointer-events-none'
81
+ style={{
82
+ background: dominantColor
83
+ ? `radial-gradient(circle at center, transparent 30%, ${dominantColor} 100%)`
84
+ : undefined,
85
+ transition: 'opacity 0.7s ease-in-out',
86
+ opacity: 0.5,
87
+ }}
88
+ />
89
+
90
+ <img
91
+ src={src}
92
+ alt={alt}
93
+ crossOrigin={crossOriginState}
94
+ onError={handleImageError}
95
+ onLoad={handleImageLoad}
96
+ className={mx('z-10 object-contain transition-opacity duration-500', classNames)}
97
+ style={{
98
+ opacity: imageLoaded ? 1 : 0,
99
+ }}
100
+ />
101
+ </div>
102
+ );
103
+ };
104
+
105
+ type ColorOptions = {
106
+ sampleSize?: number;
107
+ contrast?: number;
108
+ };
109
+
110
+ /**
111
+ * Get dominant color from image (esp. from corners).
112
+ */
113
+ const extractDominantColor = (
114
+ canvas: HTMLCanvasElement,
115
+ img: HTMLImageElement,
116
+ { sampleSize = 64, contrast = 0.95 }: ColorOptions,
117
+ ): [number, number, number] | null => {
118
+ const ctx = canvas.getContext('2d');
119
+ if (!ctx) {
120
+ return null;
121
+ }
122
+
123
+ // Draw the image scaled down.
124
+ canvas.width = sampleSize;
125
+ canvas.height = sampleSize;
126
+ ctx.drawImage(img, 0, 0, sampleSize, sampleSize);
127
+
128
+ // Get image data.
129
+ const imageData = ctx.getImageData(0, 0, sampleSize, sampleSize);
130
+ const pixels = imageData.data;
131
+
132
+ // Check for transparent background.
133
+ if (isTransparent(pixels, sampleSize)) {
134
+ return null;
135
+ }
136
+
137
+ let r = 0;
138
+ let g = 0;
139
+ let b = 0;
140
+ let totalWeight = 0;
141
+
142
+ // Define corner sampling areas (e.g., 25% of each dimension from each corner).
143
+ const cornerSize = Math.floor(sampleSize * 0.125);
144
+
145
+ // Sample only pixels in corner areas.
146
+ for (let y = 0; y < sampleSize; y++) {
147
+ for (let x = 0; x < sampleSize; x++) {
148
+ // Check if pixel is in any corner area.
149
+ const isInTopLeft = x < cornerSize && y < cornerSize;
150
+ const isInTopRight = x >= sampleSize - cornerSize && y < cornerSize;
151
+ const isInBottomLeft = x < cornerSize && y >= sampleSize - cornerSize;
152
+ const isInBottomRight = x >= sampleSize - cornerSize && y >= sampleSize - cornerSize;
153
+ if (!isInTopLeft && !isInTopRight && !isInBottomLeft && !isInBottomRight) {
154
+ continue; // Skip pixels not in corner areas.
155
+ }
156
+
157
+ const i = (y * sampleSize + x) * 4;
158
+ const red = pixels[i];
159
+ const green = pixels[i + 1];
160
+ const blue = pixels[i + 2];
161
+ const alpha = pixels[i + 3];
162
+
163
+ // Skip transparent pixels.
164
+ if (alpha === 0) continue;
165
+
166
+ // Calculate saturation to weight vibrant colors more.
167
+ const max = Math.max(red, green, blue);
168
+ const min = Math.min(red, green, blue);
169
+ const saturation = max === 0 ? 0 : (max - min) / max;
170
+ const weight = 1 + saturation * 2;
171
+
172
+ r += red * weight;
173
+ g += green * weight;
174
+ b += blue * weight;
175
+ totalWeight += weight;
176
+ }
177
+ }
178
+
179
+ if (totalWeight > 0) {
180
+ // Slightly darken the color for better contrast.
181
+ r = Math.round(Math.round(r / totalWeight) * contrast);
182
+ g = Math.round(Math.round(g / totalWeight) * contrast);
183
+ b = Math.round(Math.round(b / totalWeight) * contrast);
184
+ return [r, g, b];
185
+ }
186
+
187
+ return null;
188
+ };
189
+
190
+ /**
191
+ * Detects if an image has a transparent background by examining edge pixels.
192
+ * @param pixels - Image pixel data from canvas
193
+ * @param sampleSize - Size of the sampled image
194
+ * @param threshold - Percentage threshold for considering background transparent (default: 0.5)
195
+ * @returns True if the image has a transparent background
196
+ */
197
+ const isTransparent = (pixels: Uint8ClampedArray, sampleSize: number, threshold: number = 0.5): boolean => {
198
+ let edgeTransparentPixels = 0;
199
+ const edgePixels = sampleSize * 4 - 4; // Perimeter minus corners counted twice.
200
+
201
+ for (let x = 0; x < sampleSize; x++) {
202
+ // Top edge.
203
+ const topIndex = x * 4;
204
+ if (pixels[topIndex + 3] === 0) edgeTransparentPixels++;
205
+
206
+ // Bottom edge.
207
+ const bottomIndex = ((sampleSize - 1) * sampleSize + x) * 4;
208
+ if (pixels[bottomIndex + 3] === 0) edgeTransparentPixels++;
209
+ }
210
+
211
+ for (let y = 1; y < sampleSize - 1; y++) {
212
+ // Left edge.
213
+ const leftIndex = y * sampleSize * 4;
214
+ if (pixels[leftIndex + 3] === 0) edgeTransparentPixels++;
215
+
216
+ // Right edge.
217
+ const rightIndex = (y * sampleSize + sampleSize - 1) * 4;
218
+ if (pixels[rightIndex + 3] === 0) edgeTransparentPixels++;
219
+ }
220
+
221
+ return edgeTransparentPixels / edgePixels > threshold;
222
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './Image';
@@ -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
- import { StackItem } from '../StackItem';
16
12
  import { type StackItemData } from '../defs';
13
+ import { StackItem } from '../StackItem';
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