@dxos/react-ui-stack 0.7.4 → 0.7.5-labs.071a3e2

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 (43) hide show
  1. package/dist/lib/browser/index.mjs +228 -130
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node/index.cjs +229 -129
  5. package/dist/lib/node/index.cjs.map +4 -4
  6. package/dist/lib/node/meta.json +1 -1
  7. package/dist/lib/node-esm/index.mjs +228 -130
  8. package/dist/lib/node-esm/index.mjs.map +4 -4
  9. package/dist/lib/node-esm/meta.json +1 -1
  10. package/dist/types/src/components/LayoutControls.d.ts.map +1 -1
  11. package/dist/types/src/components/Stack.d.ts +3 -0
  12. package/dist/types/src/components/Stack.d.ts.map +1 -1
  13. package/dist/types/src/components/Stack.stories.d.ts.map +1 -1
  14. package/dist/types/src/components/StackContext.d.ts +9 -4
  15. package/dist/types/src/components/StackContext.d.ts.map +1 -1
  16. package/dist/types/src/components/StackItem.d.ts +14 -9
  17. package/dist/types/src/components/StackItem.d.ts.map +1 -1
  18. package/dist/types/src/components/StackItemContent.d.ts +35 -2
  19. package/dist/types/src/components/StackItemContent.d.ts.map +1 -1
  20. package/dist/types/src/components/StackItemDragHandle.d.ts +6 -0
  21. package/dist/types/src/components/StackItemDragHandle.d.ts.map +1 -0
  22. package/dist/types/src/components/StackItemHeading.d.ts.map +1 -1
  23. package/dist/types/src/components/StackItemResizeHandle.d.ts +1 -0
  24. package/dist/types/src/components/StackItemResizeHandle.d.ts.map +1 -1
  25. package/dist/types/src/components/StackItemSigil.d.ts.map +1 -1
  26. package/dist/types/src/components/index.d.ts +1 -0
  27. package/dist/types/src/components/index.d.ts.map +1 -1
  28. package/dist/types/tsconfig.tsbuildinfo +1 -0
  29. package/package.json +28 -26
  30. package/src/components/LayoutControls.tsx +1 -3
  31. package/src/components/Stack.stories.tsx +5 -4
  32. package/src/components/Stack.tsx +73 -10
  33. package/src/components/StackContext.tsx +13 -4
  34. package/src/components/StackItem.tsx +49 -16
  35. package/src/components/StackItemContent.tsx +48 -33
  36. package/src/components/StackItemDragHandle.tsx +22 -0
  37. package/src/components/StackItemHeading.tsx +3 -5
  38. package/src/components/StackItemResizeHandle.tsx +27 -15
  39. package/src/components/StackItemSigil.tsx +90 -103
  40. package/src/components/index.ts +1 -0
  41. package/dist/types/src/testing/EditorContent.d.ts +0 -8
  42. package/dist/types/src/testing/EditorContent.d.ts.map +0 -1
  43. package/src/testing/EditorContent.tsx +0 -60
@@ -35,47 +35,61 @@ __export(node_exports, {
35
35
  Stack: () => Stack,
36
36
  StackContext: () => StackContext,
37
37
  StackItem: () => StackItem,
38
+ StackItemContext: () => StackItemContext,
39
+ autoScrollRootAttributes: () => autoScrollRootAttributes,
38
40
  railGridHorizontal: () => railGridHorizontal,
39
41
  railGridVertical: () => railGridVertical,
40
- translations: () => translations_default
42
+ translations: () => translations_default,
43
+ useStack: () => useStack,
44
+ useStackItem: () => useStackItem
41
45
  });
42
46
  module.exports = __toCommonJS(node_exports);
47
+ var import_combine = require("@atlaskit/pragmatic-drag-and-drop/combine");
48
+ var import_adapter = require("@atlaskit/pragmatic-drag-and-drop/element/adapter");
49
+ var import_element = require("@atlaskit/pragmatic-drag-and-drop-auto-scroll/element");
50
+ var import_closest_edge = require("@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge");
43
51
  var import_react_tabster = require("@fluentui/react-tabster");
52
+ var import_react_compose_refs = require("@radix-ui/react-compose-refs");
44
53
  var import_react = __toESM(require("react"));
54
+ var import_react_ui = require("@dxos/react-ui");
45
55
  var import_react_ui_theme = require("@dxos/react-ui-theme");
46
56
  var import_react2 = require("react");
47
- var import_combine = require("@atlaskit/pragmatic-drag-and-drop/combine");
48
- var import_adapter = require("@atlaskit/pragmatic-drag-and-drop/element/adapter");
49
- var import_closest_edge = require("@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge");
57
+ var import_combine2 = require("@atlaskit/pragmatic-drag-and-drop/combine");
58
+ var import_adapter2 = require("@atlaskit/pragmatic-drag-and-drop/element/adapter");
59
+ var import_preserve_offset_on_source = require("@atlaskit/pragmatic-drag-and-drop/element/preserve-offset-on-source");
60
+ var import_scroll_just_enough_into_view = require("@atlaskit/pragmatic-drag-and-drop/element/scroll-just-enough-into-view");
61
+ var import_closest_edge2 = require("@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge");
50
62
  var import_react_tabster2 = require("@fluentui/react-tabster");
51
- var import_react_compose_refs = require("@radix-ui/react-compose-refs");
63
+ var import_react_compose_refs2 = require("@radix-ui/react-compose-refs");
52
64
  var import_react3 = __toESM(require("react"));
65
+ var import_react_ui2 = require("@dxos/react-ui");
53
66
  var import_react_ui_theme2 = require("@dxos/react-ui-theme");
54
67
  var import_react4 = __toESM(require("react"));
55
68
  var import_react_ui_theme3 = require("@dxos/react-ui-theme");
56
- var import_react_tabster3 = require("@fluentui/react-tabster");
69
+ var import_react_slot = require("@radix-ui/react-slot");
57
70
  var import_react5 = __toESM(require("react"));
71
+ var import_react_tabster3 = require("@fluentui/react-tabster");
72
+ var import_react6 = __toESM(require("react"));
58
73
  var import_react_ui_attention = require("@dxos/react-ui-attention");
59
74
  var import_react_ui_theme4 = require("@dxos/react-ui-theme");
60
- var import_adapter2 = require("@atlaskit/pragmatic-drag-and-drop/element/adapter");
75
+ var import_adapter3 = require("@atlaskit/pragmatic-drag-and-drop/element/adapter");
61
76
  var import_disable_native_drag_preview = require("@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview");
62
77
  var import_prevent_unhandled = require("@atlaskit/pragmatic-drag-and-drop/prevent-unhandled");
63
- var import_react6 = __toESM(require("react"));
64
- var import_react_ui_theme5 = require("@dxos/react-ui-theme");
65
78
  var import_react7 = __toESM(require("react"));
79
+ var import_react_ui_theme5 = require("@dxos/react-ui-theme");
80
+ var import_react8 = __toESM(require("react"));
66
81
  var import_keyboard = require("@dxos/keyboard");
67
- var import_react_ui = require("@dxos/react-ui");
82
+ var import_react_ui3 = require("@dxos/react-ui");
68
83
  var import_react_ui_attention2 = require("@dxos/react-ui-attention");
69
84
  var import_react_ui_theme6 = require("@dxos/react-ui-theme");
70
85
  var import_util = require("@dxos/util");
71
- var import_react8 = __toESM(require("react"));
72
86
  var import_react9 = __toESM(require("react"));
73
- var import_react_ui2 = require("@dxos/react-ui");
87
+ var import_react10 = __toESM(require("react"));
88
+ var import_react_ui4 = require("@dxos/react-ui");
74
89
  var StackContext = /* @__PURE__ */ (0, import_react2.createContext)({
75
90
  orientation: "vertical",
76
91
  rail: true,
77
- size: "intrinsic",
78
- separators: true
92
+ size: "intrinsic"
79
93
  });
80
94
  var useStack = () => (0, import_react2.useContext)(StackContext);
81
95
  var StackItemContext = /* @__PURE__ */ (0, import_react2.createContext)({
@@ -88,7 +102,13 @@ var StackItemContext = /* @__PURE__ */ (0, import_react2.createContext)({
88
102
  var useStackItem = () => (0, import_react2.useContext)(StackItemContext);
89
103
  var railGridHorizontal = "grid-rows-[[rail-start]_var(--rail-size)_[content-start]_1fr_[content-end]]";
90
104
  var railGridVertical = "grid-cols-[[rail-start]_var(--rail-size)_[content-start]_1fr_[content-end]]";
91
- var Stack = /* @__PURE__ */ (0, import_react.forwardRef)(({ children, classNames, style, orientation = "vertical", rail = true, separators = true, size = "intrinsic", itemsCount = import_react.Children.count(children), ...props }, forwardedRef) => {
105
+ var autoScrollRootAttributes = {
106
+ "data-drag-autoscroll": "idle"
107
+ };
108
+ var Stack = /* @__PURE__ */ (0, import_react.forwardRef)(({ children, classNames, style, orientation = "vertical", rail = true, size = "intrinsic", onRearrange, itemsCount = import_react.Children.count(children), ...props }, forwardedRef) => {
109
+ const [stackElement, stackRef] = (0, import_react.useState)(null);
110
+ const composedItemRef = (0, import_react_compose_refs.composeRefs)(stackRef, forwardedRef);
111
+ const [dropping, setDropping] = (0, import_react.useState)(false);
92
112
  const arrowNavigationGroup = (0, import_react_tabster.useArrowNavigationGroup)({
93
113
  axis: orientation
94
114
  });
@@ -96,28 +116,80 @@ var Stack = /* @__PURE__ */ (0, import_react.forwardRef)(({ children, classNames
96
116
  [orientation === "horizontal" ? "gridTemplateColumns" : "gridTemplateRows"]: `repeat(${itemsCount}, min-content)`,
97
117
  ...style
98
118
  };
119
+ const selfDroppable = !!(itemsCount < 1 && onRearrange && props.id);
120
+ (0, import_react.useLayoutEffect)(() => {
121
+ if (!stackElement || !selfDroppable) {
122
+ return;
123
+ }
124
+ const acceptSourceType = orientation === "horizontal" ? "column" : "card";
125
+ return (0, import_combine.combine)((0, import_adapter.dropTargetForElements)({
126
+ element: stackElement,
127
+ getData: ({ input, element }) => {
128
+ return (0, import_closest_edge.attachClosestEdge)({
129
+ id: props.id,
130
+ type: orientation === "horizontal" ? "card" : "column"
131
+ }, {
132
+ input,
133
+ element,
134
+ allowedEdges: [
135
+ orientation === "horizontal" ? "left" : "top"
136
+ ]
137
+ });
138
+ },
139
+ onDragEnter: ({ source }) => {
140
+ if (source.data.type === acceptSourceType) {
141
+ setDropping(true);
142
+ }
143
+ },
144
+ onDrag: ({ source }) => {
145
+ if (source.data.type === acceptSourceType) {
146
+ setDropping(true);
147
+ }
148
+ },
149
+ onDragLeave: () => setDropping(false),
150
+ onDrop: ({ self, source }) => {
151
+ setDropping(false);
152
+ if (source.data.type === acceptSourceType && selfDroppable) {
153
+ onRearrange(source.data, self.data, (0, import_closest_edge.extractClosestEdge)(self.data));
154
+ }
155
+ }
156
+ }), (0, import_element.autoScrollForElements)({
157
+ element: stackElement,
158
+ getAllowedAxis: () => orientation
159
+ }));
160
+ }, [
161
+ stackElement,
162
+ selfDroppable,
163
+ orientation
164
+ ]);
99
165
  return /* @__PURE__ */ import_react.default.createElement(StackContext.Provider, {
100
166
  value: {
101
167
  orientation,
102
168
  rail,
103
169
  size,
104
- separators
170
+ onRearrange
105
171
  }
106
172
  }, /* @__PURE__ */ import_react.default.createElement("div", {
107
173
  ...props,
108
174
  ...arrowNavigationGroup,
109
- className: (0, import_react_ui_theme.mx)("grid relative", rail ? orientation === "horizontal" ? railGridHorizontal : railGridVertical : orientation === "horizontal" ? "grid-rows-1" : "grid-cols-1", size === "contain" && (orientation === "horizontal" ? "overflow-x-auto min-bs-0 bs-full max-bs-full" : "overflow-y-auto min-is-0 is-full max-is-full"), separators && (orientation === "horizontal" ? "divide-separator divide-x" : "divide-separator divide-y"), classNames),
175
+ className: (0, import_react_ui_theme.mx)("grid relative", rail ? orientation === "horizontal" ? railGridHorizontal : railGridVertical : orientation === "horizontal" ? "grid-rows-1 pli-1" : "grid-cols-1 plb-1", size === "contain" && (orientation === "horizontal" ? "overflow-x-auto min-bs-0 bs-full max-bs-full" : "overflow-y-auto min-is-0 is-full max-is-full"), classNames),
176
+ "data-rail": rail,
110
177
  "aria-orientation": orientation,
111
178
  style: styles,
112
- ref: forwardedRef
113
- }, children));
179
+ ref: composedItemRef
180
+ }, children, selfDroppable && dropping && /* @__PURE__ */ import_react.default.createElement(import_react_ui.ListItem.DropIndicator, {
181
+ lineInset: 8,
182
+ terminalInset: -8,
183
+ gap: -8,
184
+ edge: orientation === "horizontal" ? "left" : "top"
185
+ })));
114
186
  });
115
- var StackItemContent = ({ children, toolbar = true, statusbar, classNames, ...props }) => {
116
- const { size, separators } = useStack();
187
+ var StackItemContent = /* @__PURE__ */ (0, import_react4.forwardRef)(({ children, toolbar, statusbar, classNames, size = "intrinsic", ...props }, forwardedRef) => {
188
+ const { size: stackItemSize } = useStack();
117
189
  return /* @__PURE__ */ import_react4.default.createElement("div", {
118
190
  role: "none",
119
191
  ...props,
120
- className: (0, import_react_ui_theme3.mx)("group grid grid-cols-[100%]", size === "contain" && "min-bs-0 overflow-hidden", separators && "divide-separator divide-y", classNames),
192
+ className: (0, import_react_ui_theme3.mx)("group grid grid-cols-[100%]", stackItemSize === "contain" && "min-bs-0 overflow-hidden", size === "video" ? "aspect-video" : size === "square" && "aspect-square", classNames),
121
193
  style: {
122
194
  gridTemplateRows: [
123
195
  ...toolbar ? [
@@ -128,35 +200,43 @@ var StackItemContent = ({ children, toolbar = true, statusbar, classNames, ...pr
128
200
  "var(--statusbar-size)"
129
201
  ] : []
130
202
  ].join(" ")
131
- }
203
+ },
204
+ ref: forwardedRef
205
+ }, children);
206
+ });
207
+ var StackItemDragHandle = ({ asChild, children }) => {
208
+ const { selfDragHandleRef } = useStackItem();
209
+ const Root = asChild ? import_react_slot.Slot : "div";
210
+ return /* @__PURE__ */ import_react5.default.createElement(Root, {
211
+ ref: selfDragHandleRef,
212
+ role: "button"
132
213
  }, children);
133
214
  };
134
215
  var StackItemHeading = ({ children, classNames, ...props }) => {
135
216
  const { orientation } = useStack();
136
- const { selfDragHandleRef } = useStackItem();
137
217
  const focusableGroupAttrs = (0, import_react_tabster3.useFocusableGroup)({
138
218
  tabBehavior: "limited"
139
219
  });
140
- return /* @__PURE__ */ import_react5.default.createElement("div", {
220
+ return /* @__PURE__ */ import_react6.default.createElement("div", {
141
221
  role: "heading",
142
222
  ...props,
143
223
  tabIndex: 0,
144
224
  ...focusableGroupAttrs,
145
- className: (0, import_react_ui_theme4.mx)("flex items-center ch-focus-ring-inset-over-all relative !border-is-0", orientation === "horizontal" ? "bs-[--rail-size]" : "is-[--rail-size] flex-col", classNames),
146
- ref: selfDragHandleRef
225
+ className: (0, import_react_ui_theme4.mx)("flex items-center dx-focus-ring-inset-over-all relative !border-is-0", orientation === "horizontal" ? "bs-[--rail-size]" : "is-[--rail-size] flex-col", classNames)
147
226
  }, children);
148
227
  };
149
- var StackItemHeadingLabel = /* @__PURE__ */ (0, import_react5.forwardRef)(({ attendableId, related, classNames, ...props }, forwardedRef) => {
228
+ var StackItemHeadingLabel = /* @__PURE__ */ (0, import_react6.forwardRef)(({ attendableId, related, classNames, ...props }, forwardedRef) => {
150
229
  const { hasAttention, isAncestor, isRelated } = (0, import_react_ui_attention.useAttention)(attendableId);
151
- return /* @__PURE__ */ import_react5.default.createElement("h1", {
230
+ return /* @__PURE__ */ import_react6.default.createElement("h1", {
152
231
  ...props,
153
232
  "data-attention": (related && isRelated || hasAttention || isAncestor).toString(),
154
- className: (0, import_react_ui_theme4.mx)("pli-1 min-is-0 is-0 grow truncate font-medium text-baseText data-[attention=true]:text-accentText", classNames),
233
+ className: (0, import_react_ui_theme4.mx)("pli-1 min-is-0 is-0 grow truncate font-medium text-baseText data-[attention=true]:text-accentText self-center", classNames),
155
234
  ref: forwardedRef
156
235
  });
157
236
  });
158
237
  var REM = parseFloat(getComputedStyle(document.documentElement).fontSize);
159
- var MIN_SIZE = 20;
238
+ var MIN_WIDTH = 20;
239
+ var MIN_HEIGHT = 3;
160
240
  var measureStackItem = (element) => {
161
241
  const stackItemElement = element.closest("[data-dx-stack-item]");
162
242
  return stackItemElement?.getBoundingClientRect() ?? {
@@ -165,19 +245,19 @@ var measureStackItem = (element) => {
165
245
  };
166
246
  };
167
247
  var getNextSize = (startSize, location, client) => {
168
- return Math.max(MIN_SIZE, startSize + (location.current.input[client] - location.initial.input[client]) / REM);
248
+ return Math.max(client === "clientX" ? MIN_WIDTH : MIN_HEIGHT, startSize + (location.current.input[client] - location.initial.input[client]) / REM);
169
249
  };
170
250
  var StackItemResizeHandle = () => {
171
251
  const { orientation } = useStack();
172
252
  const { setSize, size } = useStackItem();
173
- const buttonRef = (0, import_react6.useRef)(null);
174
- const dragStartSize = (0, import_react6.useRef)(size);
253
+ const buttonRef = (0, import_react7.useRef)(null);
254
+ const dragStartSize = (0, import_react7.useRef)(size);
175
255
  const client = orientation === "horizontal" ? "clientX" : "clientY";
176
- (0, import_react6.useLayoutEffect)(() => {
256
+ (0, import_react7.useLayoutEffect)(() => {
177
257
  if (!buttonRef.current || buttonRef.current.hasAttribute("draggable")) {
178
258
  return;
179
259
  }
180
- (0, import_adapter2.draggable)({
260
+ (0, import_adapter3.draggable)({
181
261
  element: buttonRef.current,
182
262
  onGenerateDragPreview: ({ nativeSetDragImage }) => {
183
263
  (0, import_disable_native_drag_preview.disableNativeDragPreview)({
@@ -204,38 +284,40 @@ var StackItemResizeHandle = () => {
204
284
  }
205
285
  });
206
286
  }, []);
207
- return /* @__PURE__ */ import_react6.default.createElement("button", {
287
+ return /* @__PURE__ */ import_react7.default.createElement("button", {
208
288
  ref: buttonRef,
209
- className: (0, import_react_ui_theme5.mx)(orientation === "horizontal" ? "cursor-col-resize" : "cursor-row-resize", "group absolute is-3 bs-full inline-end-[-1px] !border-lb-0", "before:transition-opacity before:duration-100 before:ease-in-out before:opacity-0 hover:before:opacity-100 focus-visible:before:opacity-100 active:before:opacity-100", "before:absolute before:block before:inset-block-0 before:inline-end-0 before:is-1 before:bg-accentFocusIndicator")
210
- }, /* @__PURE__ */ import_react6.default.createElement("div", {
289
+ className: (0, import_react_ui_theme5.mx)("group absolute", orientation === "horizontal" ? "cursor-col-resize is-3 bs-full inline-end-[-1px] !border-lb-0 before:inset-block-0 before:inline-end-0 before:is-1" : "cursor-row-resize bs-3 is-full block-end-[-1px] !border-li-0 before:inset-inline-0 before:block-end-0 before:bs-1", "before:transition-opacity before:duration-100 before:ease-in-out before:opacity-0 hover:before:opacity-100 focus-visible:before:opacity-100 active:before:opacity-100", "before:absolute before:block before:bg-accentFocusIndicator")
290
+ }, /* @__PURE__ */ import_react7.default.createElement("div", {
211
291
  role: "none",
212
- className: "absolute block-start-0 inline-end-[1px] bs-[--rail-size] flex items-center group-hover:opacity-0 group-focus-visible:opacity-0 group-active:opacity-0"
213
- }, /* @__PURE__ */ import_react6.default.createElement(DragHandleSignifier, null)));
292
+ className: (0, import_react_ui_theme5.mx)("absolute flex items-center group-hover:opacity-0 group-focus-visible:opacity-0 group-active:opacity-0", orientation === "horizontal" ? "block-start-0 inline-end-px bs-[--rail-size]" : "inline-start-0 block-end-px is-[--rail-size] flex justify-center")
293
+ }, /* @__PURE__ */ import_react7.default.createElement(DragHandleSignifier, {
294
+ orientation
295
+ })));
214
296
  };
215
- var DragHandleSignifier = () => {
216
- return /* @__PURE__ */ import_react6.default.createElement("svg", {
297
+ var DragHandleSignifier = ({ orientation }) => {
298
+ return /* @__PURE__ */ import_react7.default.createElement("svg", {
217
299
  xmlns: "http://www.w3.org/2000/svg",
218
300
  viewBox: "0 0 256 256",
219
301
  fill: "currentColor",
220
- className: "shrink-0 bs-[1em] is-[1em] text-unAccent"
221
- }, /* @__PURE__ */ import_react6.default.createElement("path", {
302
+ className: (0, import_react_ui_theme5.mx)("shrink-0 bs-[1em] is-[1em] text-unAccent", orientation === "vertical" && "rotate-90")
303
+ }, /* @__PURE__ */ import_react7.default.createElement("path", {
222
304
  d: "M256,64c-8.8,0-16-7.2-16-16s7.2-16,16-16v32Z"
223
- }), /* @__PURE__ */ import_react6.default.createElement("path", {
305
+ }), /* @__PURE__ */ import_react7.default.createElement("path", {
224
306
  d: "M256,120c-8.8,0-16-7.2-16-16s7.2-16,16-16v32Z"
225
- }), /* @__PURE__ */ import_react6.default.createElement("path", {
307
+ }), /* @__PURE__ */ import_react7.default.createElement("path", {
226
308
  d: "M256,176c-8.8,0-16-7.2-16-16s7.2-16,16-16v32Z"
227
- }), /* @__PURE__ */ import_react6.default.createElement("path", {
309
+ }), /* @__PURE__ */ import_react7.default.createElement("path", {
228
310
  d: "M256,232c-8.8,0-16-7.2-16-16s7.2-16,16-16v32Z"
229
311
  }));
230
312
  };
231
- var MenuSignifierHorizontal = () => /* @__PURE__ */ import_react8.default.createElement("svg", {
313
+ var MenuSignifierHorizontal = () => /* @__PURE__ */ import_react9.default.createElement("svg", {
232
314
  className: "absolute block-end-[7px]",
233
315
  width: 20,
234
316
  height: 2,
235
317
  viewBox: "0 0 20 2",
236
318
  stroke: "currentColor",
237
319
  opacity: 0.5
238
- }, /* @__PURE__ */ import_react8.default.createElement("line", {
320
+ }, /* @__PURE__ */ import_react9.default.createElement("line", {
239
321
  x1: 0.5,
240
322
  y1: 0.75,
241
323
  x2: 19,
@@ -261,35 +343,40 @@ var translations_default = [
261
343
  }
262
344
  }
263
345
  ];
264
- var StackItemSigilButton = /* @__PURE__ */ (0, import_react7.forwardRef)(({ attendableId, classNames, related, children, ...props }, forwardedRef) => {
346
+ var StackItemSigilButton = /* @__PURE__ */ (0, import_react8.forwardRef)(({ attendableId, classNames, related, children, ...props }, forwardedRef) => {
265
347
  const { hasAttention, isAncestor, isRelated } = (0, import_react_ui_attention2.useAttention)(attendableId);
266
348
  const variant = related && isRelated || hasAttention || isAncestor ? "primary" : "ghost";
267
- return /* @__PURE__ */ import_react7.default.createElement(import_react_ui.Button, {
349
+ return /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.Button, {
268
350
  ...props,
269
351
  variant,
270
352
  classNames: [
271
- "m-1 shrink-0 pli-0 min-bs-0 is-[--rail-action] bs-[--rail-action] relative",
353
+ "shrink-0 pli-0 min-bs-0 is-[--rail-action] bs-[--rail-action] relative app-no-drag",
272
354
  classNames
273
355
  ],
274
356
  ref: forwardedRef
275
- }, /* @__PURE__ */ import_react7.default.createElement(MenuSignifierHorizontal, null), children);
357
+ }, /* @__PURE__ */ import_react8.default.createElement(MenuSignifierHorizontal, null), children);
276
358
  });
277
- var StackItemSigil = /* @__PURE__ */ (0, import_react7.forwardRef)(({ actions: actionGroups, onAction, triggerLabel, attendableId, icon, related, children }, forwardedRef) => {
278
- const { t } = (0, import_react_ui.useTranslation)(translationKey);
279
- const suppressNextTooltip = (0, import_react7.useRef)(false);
280
- const [optionsMenuOpen, setOptionsMenuOpen] = (0, import_react7.useState)(false);
281
- const [triggerTooltipOpen, setTriggerTooltipOpen] = (0, import_react7.useState)(false);
282
- return /* @__PURE__ */ import_react7.default.createElement(import_react_ui.Tooltip.Root, {
283
- open: triggerTooltipOpen,
284
- onOpenChange: (nextOpen) => {
285
- if (suppressNextTooltip.current) {
286
- setTriggerTooltipOpen(false);
287
- suppressNextTooltip.current = false;
288
- } else {
289
- setTriggerTooltipOpen(nextOpen);
290
- }
291
- }
292
- }, /* @__PURE__ */ import_react7.default.createElement(import_react_ui.DropdownMenu.Root, {
359
+ var StackItemSigil = /* @__PURE__ */ (0, import_react8.forwardRef)(({ actions: actionGroups, onAction, triggerLabel, attendableId, icon, related, children }, forwardedRef) => {
360
+ const { t } = (0, import_react_ui3.useTranslation)(translationKey);
361
+ const suppressNextTooltip = (0, import_react8.useRef)(false);
362
+ const [optionsMenuOpen, setOptionsMenuOpen] = (0, import_react8.useState)(false);
363
+ const hasActions = actionGroups && actionGroups.length > 0;
364
+ const button = /* @__PURE__ */ import_react8.default.createElement(StackItemSigilButton, {
365
+ attendableId,
366
+ related,
367
+ // TODO(wittjosiah): Better disabling of interactive styles when no action are available.
368
+ // Remove underscore icon when no actions are available?
369
+ classNames: !hasActions && "cursor-default"
370
+ }, /* @__PURE__ */ import_react8.default.createElement("span", {
371
+ className: "sr-only"
372
+ }, triggerLabel), /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.Icon, {
373
+ icon,
374
+ size: 5
375
+ }));
376
+ if (!hasActions) {
377
+ return button;
378
+ }
379
+ return /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.DropdownMenu.Root, {
293
380
  open: optionsMenuOpen,
294
381
  onOpenChange: (nextOpen) => {
295
382
  if (!nextOpen) {
@@ -297,30 +384,20 @@ var StackItemSigil = /* @__PURE__ */ (0, import_react7.forwardRef)(({ actions: a
297
384
  }
298
385
  return setOptionsMenuOpen(nextOpen);
299
386
  }
300
- }, /* @__PURE__ */ import_react7.default.createElement(import_react_ui.Tooltip.Trigger, {
301
- asChild: true
302
- }, /* @__PURE__ */ import_react7.default.createElement(import_react_ui.DropdownMenu.Trigger, {
387
+ }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.DropdownMenu.Trigger, {
303
388
  asChild: true,
304
389
  ref: forwardedRef
305
- }, /* @__PURE__ */ import_react7.default.createElement(StackItemSigilButton, {
306
- attendableId,
307
- related
308
- }, /* @__PURE__ */ import_react7.default.createElement("span", {
309
- className: "sr-only"
310
- }, triggerLabel), /* @__PURE__ */ import_react7.default.createElement(import_react_ui.Icon, {
311
- icon,
312
- size: 5
313
- })))), /* @__PURE__ */ import_react7.default.createElement(import_react_ui.DropdownMenu.Portal, null, /* @__PURE__ */ import_react7.default.createElement(import_react_ui.DropdownMenu.Content, {
390
+ }, button), /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.DropdownMenu.Portal, null, /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.DropdownMenu.Content, {
314
391
  classNames: "z-[31]"
315
- }, /* @__PURE__ */ import_react7.default.createElement(import_react_ui.DropdownMenu.Viewport, null, actionGroups?.map((actions, index) => {
316
- const separator = index > 0 ? /* @__PURE__ */ import_react7.default.createElement(import_react_ui.DropdownMenu.Separator, null) : null;
317
- return /* @__PURE__ */ import_react7.default.createElement(import_react7.Fragment, {
392
+ }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.DropdownMenu.Viewport, null, actionGroups?.map((actions, index) => {
393
+ const separator = index > 0 ? /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.DropdownMenu.Separator, null) : null;
394
+ return /* @__PURE__ */ import_react8.default.createElement(import_react8.Fragment, {
318
395
  key: index
319
396
  }, separator, actions.map((action) => {
320
397
  const shortcut = typeof action.properties.keyBinding === "string" ? action.properties.keyBinding : action.properties.keyBinding?.[(0, import_util.getHostPlatform)()];
321
398
  const menuItemType = action.properties.menuItemType;
322
- const Root = menuItemType === "toggle" ? import_react_ui.DropdownMenu.CheckboxItem : import_react_ui.DropdownMenu.Item;
323
- return /* @__PURE__ */ import_react7.default.createElement(Root, {
399
+ const Root = menuItemType === "toggle" ? import_react_ui3.DropdownMenu.CheckboxItem : import_react_ui3.DropdownMenu.Item;
400
+ return /* @__PURE__ */ import_react8.default.createElement(Root, {
324
401
  key: action.id,
325
402
  onClick: (event) => {
326
403
  if (action.properties.disabled) {
@@ -337,38 +414,33 @@ var StackItemSigil = /* @__PURE__ */ (0, import_react7.forwardRef)(({ actions: a
337
414
  ...action.properties?.testId && {
338
415
  "data-testid": action.properties.testId
339
416
  }
340
- }, /* @__PURE__ */ import_react7.default.createElement(import_react_ui.Icon, {
417
+ }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.Icon, {
341
418
  icon: action.properties.icon ?? "ph--placeholder--regular",
342
419
  size: 4
343
- }), /* @__PURE__ */ import_react7.default.createElement("span", {
420
+ }), /* @__PURE__ */ import_react8.default.createElement("span", {
344
421
  className: "grow truncate"
345
- }, (0, import_react_ui.toLocalizedString)(action.properties.label ?? "", t)), menuItemType === "toggle" && /* @__PURE__ */ import_react7.default.createElement(import_react_ui.DropdownMenu.ItemIndicator, {
422
+ }, (0, import_react_ui3.toLocalizedString)(action.properties.label ?? "", t)), menuItemType === "toggle" && /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.DropdownMenu.ItemIndicator, {
346
423
  asChild: true
347
- }, /* @__PURE__ */ import_react7.default.createElement(import_react_ui.Icon, {
424
+ }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.Icon, {
348
425
  icon: "ph--check--regular",
349
426
  size: 4
350
- })), shortcut && /* @__PURE__ */ import_react7.default.createElement("span", {
427
+ })), shortcut && /* @__PURE__ */ import_react8.default.createElement("span", {
351
428
  className: (0, import_react_ui_theme6.mx)("shrink-0", import_react_ui_theme6.descriptionText)
352
429
  }, (0, import_keyboard.keySymbols)(shortcut).join("")));
353
430
  }));
354
- }), children), /* @__PURE__ */ import_react7.default.createElement(import_react_ui.DropdownMenu.Arrow, null)))), /* @__PURE__ */ import_react7.default.createElement(import_react_ui.Tooltip.Portal, null, /* @__PURE__ */ import_react7.default.createElement(import_react_ui.Tooltip.Content, {
355
- style: {
356
- zIndex: 70
357
- },
358
- side: "bottom"
359
- }, triggerLabel, /* @__PURE__ */ import_react7.default.createElement(import_react_ui.Tooltip.Arrow, null))));
431
+ }), children), /* @__PURE__ */ import_react8.default.createElement(import_react_ui3.DropdownMenu.Arrow, null))));
360
432
  });
361
433
  var DEFAULT_HORIZONTAL_SIZE = 44;
362
434
  var DEFAULT_VERTICAL_SIZE = "min-content";
363
435
  var DEFAULT_EXTRINSIC_SIZE = DEFAULT_HORIZONTAL_SIZE;
364
- var StackItemRoot = /* @__PURE__ */ (0, import_react3.forwardRef)(({ item, children, classNames, onRearrange, size: propsSize, onSizeChange, role, order, style, ...props }, forwardedRef) => {
436
+ var StackItemRoot = /* @__PURE__ */ (0, import_react3.forwardRef)(({ item, children, classNames, size: propsSize, onSizeChange, role, order, style, disableRearrange, focusIndicatorVariant = "over-all", ...props }, forwardedRef) => {
365
437
  const [itemElement, itemRef] = (0, import_react3.useState)(null);
366
438
  const [selfDragHandleElement, selfDragHandleRef] = (0, import_react3.useState)(null);
367
- const [_closestEdge, setEdge] = (0, import_react3.useState)(null);
368
- const { orientation, rail, separators } = useStack();
439
+ const [closestEdge, setEdge] = (0, import_react3.useState)(null);
440
+ const { orientation, rail, onRearrange } = useStack();
369
441
  const [size = orientation === "horizontal" ? DEFAULT_HORIZONTAL_SIZE : DEFAULT_VERTICAL_SIZE, setInternalSize] = (0, import_react3.useState)(propsSize);
370
442
  const Root = role ?? "div";
371
- const composedItemRef = (0, import_react_compose_refs.composeRefs)(itemRef, forwardedRef);
443
+ const composedItemRef = (0, import_react_compose_refs2.composeRefs)(itemRef, forwardedRef);
372
444
  const setSize = (0, import_react3.useCallback)((nextSize, commit) => {
373
445
  setInternalSize(nextSize);
374
446
  if (commit) {
@@ -379,10 +451,10 @@ var StackItemRoot = /* @__PURE__ */ (0, import_react3.forwardRef)(({ item, child
379
451
  ]);
380
452
  const type = orientation === "horizontal" ? "column" : "card";
381
453
  (0, import_react3.useLayoutEffect)(() => {
382
- if (!itemElement || !onRearrange) {
454
+ if (!itemElement || !onRearrange || disableRearrange) {
383
455
  return;
384
456
  }
385
- return (0, import_combine.combine)((0, import_adapter.draggable)({
457
+ return (0, import_combine2.combine)((0, import_adapter2.draggable)({
386
458
  element: itemElement,
387
459
  ...selfDragHandleElement && {
388
460
  dragHandle: selfDragHandleElement
@@ -390,11 +462,31 @@ var StackItemRoot = /* @__PURE__ */ (0, import_react3.forwardRef)(({ item, child
390
462
  getInitialData: () => ({
391
463
  id: item.id,
392
464
  type
393
- })
394
- }), (0, import_adapter.dropTargetForElements)({
465
+ }),
466
+ onGenerateDragPreview: ({ nativeSetDragImage, source, location }) => {
467
+ document.body.setAttribute("data-drag-preview", "true");
468
+ (0, import_scroll_just_enough_into_view.scrollJustEnoughIntoView)({
469
+ element: source.element
470
+ });
471
+ const { x, y } = (0, import_preserve_offset_on_source.preserveOffsetOnSource)({
472
+ element: source.element,
473
+ input: location.current.input
474
+ })({
475
+ container: source.element.offsetParent ?? document.body
476
+ });
477
+ nativeSetDragImage?.(source.element, x, y);
478
+ },
479
+ onDragStart: () => {
480
+ document.body.removeAttribute("data-drag-preview");
481
+ itemElement?.closest("[data-drag-autoscroll]")?.setAttribute("data-drag-autoscroll", "active");
482
+ },
483
+ onDrop: () => {
484
+ itemElement?.closest("[data-drag-autoscroll]")?.setAttribute("data-drag-autoscroll", "idle");
485
+ }
486
+ }), (0, import_adapter2.dropTargetForElements)({
395
487
  element: itemElement,
396
488
  getData: ({ input, element }) => {
397
- return (0, import_closest_edge.attachClosestEdge)({
489
+ return (0, import_closest_edge2.attachClosestEdge)({
398
490
  id: item.id,
399
491
  type
400
492
  }, {
@@ -411,19 +503,19 @@ var StackItemRoot = /* @__PURE__ */ (0, import_react3.forwardRef)(({ item, child
411
503
  },
412
504
  onDragEnter: ({ self, source }) => {
413
505
  if (source.data.type === self.data.type) {
414
- setEdge((0, import_closest_edge.extractClosestEdge)(self.data));
506
+ setEdge((0, import_closest_edge2.extractClosestEdge)(self.data));
415
507
  }
416
508
  },
417
509
  onDrag: ({ self, source }) => {
418
510
  if (source.data.type === self.data.type) {
419
- setEdge((0, import_closest_edge.extractClosestEdge)(self.data));
511
+ setEdge((0, import_closest_edge2.extractClosestEdge)(self.data));
420
512
  }
421
513
  },
422
514
  onDragLeave: () => setEdge(null),
423
515
  onDrop: ({ self, source }) => {
424
516
  setEdge(null);
425
517
  if (source.data.type === self.data.type) {
426
- onRearrange(source.data, self.data, (0, import_closest_edge.extractClosestEdge)(self.data));
518
+ onRearrange(source.data, self.data, (0, import_closest_edge2.extractClosestEdge)(self.data));
427
519
  }
428
520
  }
429
521
  }));
@@ -447,7 +539,7 @@ var StackItemRoot = /* @__PURE__ */ (0, import_react3.forwardRef)(({ item, child
447
539
  ...props,
448
540
  tabIndex: 0,
449
541
  ...focusGroupAttrs,
450
- className: (0, import_react_ui_theme2.mx)("group/stack-item grid relative ch-focus-ring-inset-over-all", size === "min-content" && (orientation === "horizontal" ? "is-min" : "bs-min"), orientation === "horizontal" ? "grid-rows-subgrid" : "grid-cols-subgrid", rail && (orientation === "horizontal" ? "row-span-2" : "col-span-2"), separators && (orientation === "horizontal" ? "divide-separator divide-y" : "divide-separator divide-x"), classNames),
542
+ className: (0, import_react_ui_theme2.mx)("group/stack-item grid relative", focusIndicatorVariant === "over-all" ? "dx-focus-ring-inset-over-all" : orientation === "horizontal" ? "dx-focus-ring-group-x" : "dx-focus-ring-group-y", size === "min-content" && (orientation === "horizontal" ? "is-min" : "bs-min"), orientation === "horizontal" ? "grid-rows-subgrid" : "grid-cols-subgrid", rail && (orientation === "horizontal" ? "row-span-2" : "col-span-2"), classNames),
451
543
  "data-dx-stack-item": true,
452
544
  style: {
453
545
  ...size !== "min-content" && {
@@ -459,7 +551,11 @@ var StackItemRoot = /* @__PURE__ */ (0, import_react3.forwardRef)(({ item, child
459
551
  ...style
460
552
  },
461
553
  ref: composedItemRef
462
- }, children));
554
+ }, children, closestEdge && /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ListItem.DropIndicator, {
555
+ lineInset: 8,
556
+ terminalInset: -8,
557
+ edge: closestEdge
558
+ })));
463
559
  });
464
560
  var StackItem = {
465
561
  Root: StackItemRoot,
@@ -467,51 +563,51 @@ var StackItem = {
467
563
  Heading: StackItemHeading,
468
564
  HeadingLabel: StackItemHeadingLabel,
469
565
  ResizeHandle: StackItemResizeHandle,
566
+ DragHandle: StackItemDragHandle,
470
567
  Sigil: StackItemSigil,
471
568
  SigilButton: StackItemSigilButton
472
569
  };
473
570
  var LayoutControl = ({ icon, label, ...props }) => {
474
- return /* @__PURE__ */ import_react9.default.createElement(import_react_ui2.Tooltip.Root, null, /* @__PURE__ */ import_react9.default.createElement(import_react_ui2.Tooltip.Trigger, {
571
+ return /* @__PURE__ */ import_react10.default.createElement(import_react_ui4.Tooltip.Root, null, /* @__PURE__ */ import_react10.default.createElement(import_react_ui4.Tooltip.Trigger, {
475
572
  asChild: true
476
- }, /* @__PURE__ */ import_react9.default.createElement(import_react_ui2.Button, {
573
+ }, /* @__PURE__ */ import_react10.default.createElement(import_react_ui4.Button, {
477
574
  variant: "ghost",
478
575
  ...props
479
- }, /* @__PURE__ */ import_react9.default.createElement("span", {
576
+ }, /* @__PURE__ */ import_react10.default.createElement("span", {
480
577
  className: "sr-only"
481
- }, label), /* @__PURE__ */ import_react9.default.createElement(import_react_ui2.Icon, {
578
+ }, label), /* @__PURE__ */ import_react10.default.createElement(import_react_ui4.Icon, {
482
579
  icon
483
- }))), /* @__PURE__ */ import_react9.default.createElement(import_react_ui2.Tooltip.Portal, null, /* @__PURE__ */ import_react9.default.createElement(import_react_ui2.Tooltip.Content, {
484
- side: "bottom",
485
- classNames: "z-[70]"
580
+ }))), /* @__PURE__ */ import_react10.default.createElement(import_react_ui4.Tooltip.Portal, null, /* @__PURE__ */ import_react10.default.createElement(import_react_ui4.Tooltip.Content, {
581
+ side: "bottom"
486
582
  }, label)));
487
583
  };
488
- var LayoutControls = /* @__PURE__ */ (0, import_react9.forwardRef)(({ onClick, variant = "default", capabilities: can, isSolo, pin, close = false, children, ...props }, forwardedRef) => {
489
- const { t } = (0, import_react_ui2.useTranslation)(translationKey);
584
+ var LayoutControls = /* @__PURE__ */ (0, import_react10.forwardRef)(({ onClick, variant = "default", capabilities: can, isSolo, pin, close = false, children, ...props }, forwardedRef) => {
585
+ const { t } = (0, import_react_ui4.useTranslation)(translationKey);
490
586
  const buttonClassNames = variant === "hide-disabled" ? "disabled:hidden !p-1" : "!p-1";
491
- return /* @__PURE__ */ import_react9.default.createElement(import_react_ui2.ButtonGroup, {
587
+ return /* @__PURE__ */ import_react10.default.createElement(import_react_ui4.ButtonGroup, {
492
588
  ...props,
493
589
  ref: forwardedRef
494
590
  }, pin && !isSolo && [
495
591
  "both",
496
592
  "start"
497
- ].includes(pin) && /* @__PURE__ */ import_react9.default.createElement(LayoutControl, {
593
+ ].includes(pin) && /* @__PURE__ */ import_react10.default.createElement(LayoutControl, {
498
594
  label: t("pin start label"),
499
595
  variant: "ghost",
500
596
  classNames: buttonClassNames,
501
597
  onClick: () => onClick?.("pin-start"),
502
598
  icon: "ph--caret-line-left--regular"
503
- }), can.solo && /* @__PURE__ */ import_react9.default.createElement(LayoutControl, {
599
+ }), can.solo && /* @__PURE__ */ import_react10.default.createElement(LayoutControl, {
504
600
  label: t("solo layout label"),
505
601
  classNames: buttonClassNames,
506
602
  onClick: () => onClick?.("solo"),
507
603
  icon: isSolo ? "ph--arrows-in--regular" : "ph--arrows-out--regular"
508
- }), !isSolo && can.solo && /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, /* @__PURE__ */ import_react9.default.createElement(LayoutControl, {
604
+ }), !isSolo && can.solo && /* @__PURE__ */ import_react10.default.createElement(import_react10.default.Fragment, null, /* @__PURE__ */ import_react10.default.createElement(LayoutControl, {
509
605
  label: t("increment start label"),
510
606
  disabled: !can.incrementStart,
511
607
  classNames: buttonClassNames,
512
608
  onClick: () => onClick?.("increment-start"),
513
609
  icon: "ph--caret-left--regular"
514
- }), /* @__PURE__ */ import_react9.default.createElement(LayoutControl, {
610
+ }), /* @__PURE__ */ import_react10.default.createElement(LayoutControl, {
515
611
  label: t("increment end label"),
516
612
  disabled: !can.incrementEnd,
517
613
  classNames: buttonClassNames,
@@ -520,12 +616,12 @@ var LayoutControls = /* @__PURE__ */ (0, import_react9.forwardRef)(({ onClick, v
520
616
  })), pin && !isSolo && [
521
617
  "both",
522
618
  "end"
523
- ].includes(pin) && /* @__PURE__ */ import_react9.default.createElement(LayoutControl, {
619
+ ].includes(pin) && /* @__PURE__ */ import_react10.default.createElement(LayoutControl, {
524
620
  label: t("pin end label"),
525
621
  classNames: buttonClassNames,
526
622
  onClick: () => onClick?.("pin-end"),
527
623
  icon: "ph--caret-line-right--regular"
528
- }), close && !isSolo && /* @__PURE__ */ import_react9.default.createElement(LayoutControl, {
624
+ }), close && !isSolo && /* @__PURE__ */ import_react10.default.createElement(LayoutControl, {
529
625
  label: t(`${typeof close === "string" ? "minify" : "close"} label`),
530
626
  classNames: buttonClassNames,
531
627
  onClick: () => onClick?.("close"),
@@ -542,8 +638,12 @@ var LayoutControls = /* @__PURE__ */ (0, import_react9.forwardRef)(({ onClick, v
542
638
  Stack,
543
639
  StackContext,
544
640
  StackItem,
641
+ StackItemContext,
642
+ autoScrollRootAttributes,
545
643
  railGridHorizontal,
546
644
  railGridVertical,
547
- translations
645
+ translations,
646
+ useStack,
647
+ useStackItem
548
648
  });
549
649
  //# sourceMappingURL=index.cjs.map