@dxos/react-ui-stack 0.6.14-staging.e15392e → 0.7.1-staging.599df14

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 (92) hide show
  1. package/dist/lib/browser/index.mjs +493 -335
  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/index.mjs +3 -6
  5. package/dist/lib/browser/testing/index.mjs.map +3 -3
  6. package/dist/lib/node/index.cjs +477 -326
  7. package/dist/lib/node/index.cjs.map +4 -4
  8. package/dist/lib/node/meta.json +1 -1
  9. package/dist/lib/node/testing/index.cjs +3 -6
  10. package/dist/lib/node/testing/index.cjs.map +3 -3
  11. package/dist/lib/node-esm/index.mjs +493 -335
  12. package/dist/lib/node-esm/index.mjs.map +4 -4
  13. package/dist/lib/node-esm/meta.json +1 -1
  14. package/dist/lib/node-esm/testing/index.mjs +3 -6
  15. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  16. package/dist/types/src/components/LayoutControls.d.ts +19 -0
  17. package/dist/types/src/components/LayoutControls.d.ts.map +1 -0
  18. package/dist/types/src/components/MenuSignifier.d.ts +4 -0
  19. package/dist/types/src/components/MenuSignifier.d.ts.map +1 -0
  20. package/dist/types/src/components/Stack.d.ts +12 -12
  21. package/dist/types/src/components/Stack.d.ts.map +1 -1
  22. package/dist/types/src/components/Stack.stories.d.ts +6 -83
  23. package/dist/types/src/components/Stack.stories.d.ts.map +1 -1
  24. package/dist/types/src/components/StackContext.d.ts +19 -0
  25. package/dist/types/src/components/StackContext.d.ts.map +1 -0
  26. package/dist/types/src/components/StackItem.d.ts +41 -0
  27. package/dist/types/src/components/StackItem.d.ts.map +1 -0
  28. package/dist/types/src/components/StackItemContent.d.ts +8 -0
  29. package/dist/types/src/components/StackItemContent.d.ts.map +1 -0
  30. package/dist/types/src/components/StackItemHeading.d.ts +8 -0
  31. package/dist/types/src/components/StackItemHeading.d.ts.map +1 -0
  32. package/dist/types/src/components/StackItemResizeHandle.d.ts +3 -0
  33. package/dist/types/src/components/StackItemResizeHandle.d.ts.map +1 -0
  34. package/dist/types/src/components/StackItemSigil.d.ts +31 -0
  35. package/dist/types/src/components/StackItemSigil.d.ts.map +1 -0
  36. package/dist/types/src/components/index.d.ts +2 -1
  37. package/dist/types/src/components/index.d.ts.map +1 -1
  38. package/dist/types/src/testing/EditorContent.d.ts +2 -2
  39. package/dist/types/src/testing/EditorContent.d.ts.map +1 -1
  40. package/dist/types/src/testing/stack-manager.d.ts +0 -1
  41. package/dist/types/src/testing/stack-manager.d.ts.map +1 -1
  42. package/dist/types/src/translations.d.ts +7 -8
  43. package/dist/types/src/translations.d.ts.map +1 -1
  44. package/package.json +20 -21
  45. package/src/components/LayoutControls.tsx +131 -0
  46. package/src/components/MenuSignifier.tsx +33 -0
  47. package/src/components/Stack.stories.tsx +109 -182
  48. package/src/components/Stack.tsx +61 -156
  49. package/src/components/StackContext.tsx +38 -0
  50. package/src/components/StackItem.tsx +173 -0
  51. package/src/components/StackItemContent.tsx +47 -0
  52. package/src/components/StackItemHeading.tsx +55 -0
  53. package/src/components/StackItemResizeHandle.tsx +115 -0
  54. package/src/components/StackItemSigil.tsx +170 -0
  55. package/src/components/index.ts +3 -2
  56. package/src/playwright/smoke.spec.ts +3 -3
  57. package/src/testing/EditorContent.tsx +4 -4
  58. package/src/testing/stack-manager.ts +3 -7
  59. package/src/translations.ts +7 -8
  60. package/dist/types/src/components/CaretDownUp.d.ts +0 -4
  61. package/dist/types/src/components/CaretDownUp.d.ts.map +0 -1
  62. package/dist/types/src/components/ContentTypes.stories.d.ts +0 -96
  63. package/dist/types/src/components/ContentTypes.stories.d.ts.map +0 -1
  64. package/dist/types/src/components/Deck.stories.d.ts +0 -19
  65. package/dist/types/src/components/Deck.stories.d.ts.map +0 -1
  66. package/dist/types/src/components/Section.d.ts +0 -53
  67. package/dist/types/src/components/Section.d.ts.map +0 -1
  68. package/dist/types/src/components/Section.stories.d.ts +0 -36
  69. package/dist/types/src/components/Section.stories.d.ts.map +0 -1
  70. package/dist/types/src/components/style-fragments.d.ts +0 -2
  71. package/dist/types/src/components/style-fragments.d.ts.map +0 -1
  72. package/dist/types/src/next/Stack.d.ts +0 -9
  73. package/dist/types/src/next/Stack.d.ts.map +0 -1
  74. package/dist/types/src/next/Stack.stories.d.ts +0 -8
  75. package/dist/types/src/next/Stack.stories.d.ts.map +0 -1
  76. package/dist/types/src/next/StackItem.d.ts +0 -14
  77. package/dist/types/src/next/StackItem.d.ts.map +0 -1
  78. package/dist/types/src/next/index.d.ts +0 -2
  79. package/dist/types/src/next/index.d.ts.map +0 -1
  80. package/dist/types/src/testing/TableContent.d.ts +0 -20
  81. package/dist/types/src/testing/TableContent.d.ts.map +0 -1
  82. package/src/components/CaretDownUp.tsx +0 -31
  83. package/src/components/ContentTypes.stories.tsx +0 -104
  84. package/src/components/Deck.stories.tsx +0 -362
  85. package/src/components/Section.stories.tsx +0 -50
  86. package/src/components/Section.tsx +0 -378
  87. package/src/components/style-fragments.ts +0 -5
  88. package/src/next/Stack.stories.tsx +0 -148
  89. package/src/next/Stack.tsx +0 -30
  90. package/src/next/StackItem.tsx +0 -78
  91. package/src/next/index.ts +0 -5
  92. package/src/testing/TableContent.tsx +0 -119
@@ -28,374 +28,525 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
  var node_exports = {};
30
30
  __export(node_exports, {
31
- DEFAULT_TYPE: () => DEFAULT_TYPE,
32
- SectionToolbar: () => SectionToolbar,
31
+ DEFAULT_EXTRINSIC_SIZE: () => DEFAULT_EXTRINSIC_SIZE,
32
+ DEFAULT_HORIZONTAL_SIZE: () => DEFAULT_HORIZONTAL_SIZE,
33
+ DEFAULT_VERTICAL_SIZE: () => DEFAULT_VERTICAL_SIZE,
34
+ LayoutControls: () => LayoutControls,
33
35
  Stack: () => Stack,
34
- sectionToolbarLayout: () => sectionToolbarLayout,
36
+ StackContext: () => StackContext,
37
+ StackItem: () => StackItem,
38
+ railGridHorizontal: () => railGridHorizontal,
39
+ railGridVertical: () => railGridVertical,
35
40
  translations: () => translations_default
36
41
  });
37
42
  module.exports = __toCommonJS(node_exports);
38
43
  var import_react_tabster = require("@fluentui/react-tabster");
39
44
  var import_react = __toESM(require("react"));
40
- var import_react_resize_detector = require("react-resize-detector");
41
- var import_react_ui = require("@dxos/react-ui");
42
- var import_react_ui_mosaic = require("@dxos/react-ui-mosaic");
43
45
  var import_react_ui_theme = require("@dxos/react-ui-theme");
46
+ 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");
50
+ var import_box = require("@atlaskit/pragmatic-drag-and-drop-react-drop-indicator/box");
44
51
  var import_react_tabster2 = require("@fluentui/react-tabster");
45
- var import_react2 = require("@phosphor-icons/react");
46
- var CollapsiblePrimitive = __toESM(require("@radix-ui/react-collapsible"));
52
+ var import_react_compose_refs = require("@radix-ui/react-compose-refs");
47
53
  var import_react3 = __toESM(require("react"));
48
- var import_react_ui2 = require("@dxos/react-ui");
49
- var import_react_ui_attention = require("@dxos/react-ui-attention");
50
- var import_react_ui_deck = require("@dxos/react-ui-deck");
51
- var import_react_ui_mosaic2 = require("@dxos/react-ui-mosaic");
52
54
  var import_react_ui_theme2 = require("@dxos/react-ui-theme");
53
55
  var import_react4 = __toESM(require("react"));
54
- var CaretDownUp = ({ children, weight, ...props }) => {
55
- return /* @__PURE__ */ import_react4.default.createElement("svg", {
56
+ var import_react_ui_theme3 = require("@dxos/react-ui-theme");
57
+ var import_react_tabster3 = require("@fluentui/react-tabster");
58
+ var import_react5 = __toESM(require("react"));
59
+ var import_react_ui_attention = require("@dxos/react-ui-attention");
60
+ var import_react_ui_theme4 = require("@dxos/react-ui-theme");
61
+ var import_adapter2 = require("@atlaskit/pragmatic-drag-and-drop/element/adapter");
62
+ var import_disable_native_drag_preview = require("@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview");
63
+ var import_prevent_unhandled = require("@atlaskit/pragmatic-drag-and-drop/prevent-unhandled");
64
+ var import_react6 = __toESM(require("react"));
65
+ var import_react_ui_theme5 = require("@dxos/react-ui-theme");
66
+ var import_react7 = __toESM(require("react"));
67
+ var import_keyboard = require("@dxos/keyboard");
68
+ var import_react_ui = require("@dxos/react-ui");
69
+ var import_react_ui_attention2 = require("@dxos/react-ui-attention");
70
+ var import_react_ui_theme6 = require("@dxos/react-ui-theme");
71
+ var import_util = require("@dxos/util");
72
+ var import_react8 = __toESM(require("react"));
73
+ var import_react9 = __toESM(require("react"));
74
+ var import_react_ui2 = require("@dxos/react-ui");
75
+ var StackContext = /* @__PURE__ */ (0, import_react2.createContext)({
76
+ orientation: "vertical",
77
+ rail: true,
78
+ size: "intrinsic",
79
+ separators: true
80
+ });
81
+ var useStack = () => (0, import_react2.useContext)(StackContext);
82
+ var StackItemContext = /* @__PURE__ */ (0, import_react2.createContext)({
83
+ selfDragHandleRef: () => {
84
+ },
85
+ size: "min-content",
86
+ setSize: () => {
87
+ }
88
+ });
89
+ var useStackItem = () => (0, import_react2.useContext)(StackItemContext);
90
+ var railGridHorizontal = "grid-rows-[[rail-start]_var(--rail-size)_[content-start]_1fr_[content-end]]";
91
+ var railGridVertical = "grid-cols-[[rail-start]_var(--rail-size)_[content-start]_1fr_[content-end]]";
92
+ 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) => {
93
+ const arrowNavigationGroup = (0, import_react_tabster.useArrowNavigationGroup)({
94
+ axis: orientation
95
+ });
96
+ const styles = {
97
+ [orientation === "horizontal" ? "gridTemplateColumns" : "gridTemplateRows"]: `repeat(${itemsCount}, min-content)`,
98
+ ...style
99
+ };
100
+ return /* @__PURE__ */ import_react.default.createElement(StackContext.Provider, {
101
+ value: {
102
+ orientation,
103
+ rail,
104
+ size,
105
+ separators
106
+ }
107
+ }, /* @__PURE__ */ import_react.default.createElement("div", {
108
+ ...props,
109
+ ...arrowNavigationGroup,
110
+ 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),
111
+ "aria-orientation": orientation,
112
+ style: styles,
113
+ ref: forwardedRef
114
+ }, children));
115
+ });
116
+ var StackItemContent = ({ children, toolbar = true, statusbar, classNames, ...props }) => {
117
+ const { size, separators } = useStack();
118
+ return /* @__PURE__ */ import_react4.default.createElement("div", {
119
+ role: "none",
120
+ ...props,
121
+ 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),
122
+ style: {
123
+ gridTemplateRows: [
124
+ ...toolbar ? [
125
+ "var(--rail-action)"
126
+ ] : [],
127
+ "1fr",
128
+ ...statusbar ? [
129
+ "var(--statusbar-size)"
130
+ ] : []
131
+ ].join(" ")
132
+ }
133
+ }, children);
134
+ };
135
+ var StackItemHeading = ({ children, classNames, ...props }) => {
136
+ const { orientation } = useStack();
137
+ const { selfDragHandleRef } = useStackItem();
138
+ const focusableGroupAttrs = (0, import_react_tabster3.useFocusableGroup)({
139
+ tabBehavior: "limited"
140
+ });
141
+ return /* @__PURE__ */ import_react5.default.createElement("div", {
142
+ role: "heading",
143
+ ...props,
144
+ tabIndex: 0,
145
+ ...focusableGroupAttrs,
146
+ 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),
147
+ ref: selfDragHandleRef
148
+ }, children);
149
+ };
150
+ var StackItemHeadingLabel = /* @__PURE__ */ (0, import_react5.forwardRef)(({ attendableId, related, classNames, ...props }, forwardedRef) => {
151
+ const { hasAttention, isAncestor, isRelated } = (0, import_react_ui_attention.useAttention)(attendableId);
152
+ return /* @__PURE__ */ import_react5.default.createElement("h1", {
153
+ ...props,
154
+ "data-attention": (related && isRelated || hasAttention || isAncestor).toString(),
155
+ 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),
156
+ ref: forwardedRef
157
+ });
158
+ });
159
+ var REM = parseFloat(getComputedStyle(document.documentElement).fontSize);
160
+ var MIN_SIZE = 20;
161
+ var measureStackItem = (element) => {
162
+ const stackItemElement = element.closest("[data-dx-stack-item]");
163
+ return stackItemElement?.getBoundingClientRect() ?? {
164
+ width: DEFAULT_EXTRINSIC_SIZE,
165
+ height: DEFAULT_EXTRINSIC_SIZE
166
+ };
167
+ };
168
+ var getNextSize = (startSize, location, client) => {
169
+ return Math.max(MIN_SIZE, startSize + (location.current.input[client] - location.initial.input[client]) / REM);
170
+ };
171
+ var StackItemResizeHandle = () => {
172
+ const { orientation } = useStack();
173
+ const { setSize, size } = useStackItem();
174
+ const buttonRef = (0, import_react6.useRef)(null);
175
+ const dragStartSize = (0, import_react6.useRef)(size);
176
+ const client = orientation === "horizontal" ? "clientX" : "clientY";
177
+ (0, import_react6.useLayoutEffect)(() => {
178
+ if (!buttonRef.current || buttonRef.current.hasAttribute("draggable")) {
179
+ return;
180
+ }
181
+ (0, import_adapter2.draggable)({
182
+ element: buttonRef.current,
183
+ onGenerateDragPreview: ({ nativeSetDragImage }) => {
184
+ (0, import_disable_native_drag_preview.disableNativeDragPreview)({
185
+ nativeSetDragImage
186
+ });
187
+ import_prevent_unhandled.preventUnhandled.start();
188
+ },
189
+ onDragStart: () => {
190
+ dragStartSize.current = dragStartSize.current === "min-content" ? measureStackItem(buttonRef.current)[orientation === "horizontal" ? "width" : "height"] / REM : dragStartSize.current;
191
+ },
192
+ onDrag: ({ location }) => {
193
+ if (typeof dragStartSize.current !== "number") {
194
+ return;
195
+ }
196
+ setSize(getNextSize(dragStartSize.current, location, client));
197
+ },
198
+ onDrop: ({ location }) => {
199
+ if (typeof dragStartSize.current !== "number") {
200
+ return;
201
+ }
202
+ const nextSize = getNextSize(dragStartSize.current, location, client);
203
+ setSize(nextSize, true);
204
+ dragStartSize.current = nextSize;
205
+ }
206
+ });
207
+ }, []);
208
+ return /* @__PURE__ */ import_react6.default.createElement("button", {
209
+ ref: buttonRef,
210
+ 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")
211
+ }, /* @__PURE__ */ import_react6.default.createElement("div", {
212
+ role: "none",
213
+ 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"
214
+ }, /* @__PURE__ */ import_react6.default.createElement(DragHandleSignifier, null)));
215
+ };
216
+ var DragHandleSignifier = () => {
217
+ return /* @__PURE__ */ import_react6.default.createElement("svg", {
56
218
  xmlns: "http://www.w3.org/2000/svg",
57
219
  viewBox: "0 0 256 256",
58
- ...props
59
- }, /* @__PURE__ */ import_react4.default.createElement("rect", {
60
- width: "256",
61
- height: "256",
62
- fill: "none"
63
- }), /* @__PURE__ */ import_react4.default.createElement("polyline", {
64
- points: "80 224 128 176 176 224",
65
- fill: "none",
66
- stroke: "currentColor",
67
- strokeLinecap: "round",
68
- strokeLinejoin: "round",
69
- strokeWidth: "16"
70
- }), /* @__PURE__ */ import_react4.default.createElement("polyline", {
71
- points: "80 32 128 80 176 32",
72
- fill: "none",
73
- stroke: "currentColor",
74
- strokeLinecap: "round",
75
- strokeLinejoin: "round",
76
- strokeWidth: "16"
77
- }), children);
220
+ fill: "currentColor",
221
+ className: "shrink-0 bs-[1em] is-[1em] text-unAccent"
222
+ }, /* @__PURE__ */ import_react6.default.createElement("path", {
223
+ d: "M256,64c-8.8,0-16-7.2-16-16s7.2-16,16-16v32Z"
224
+ }), /* @__PURE__ */ import_react6.default.createElement("path", {
225
+ d: "M256,120c-8.8,0-16-7.2-16-16s7.2-16,16-16v32Z"
226
+ }), /* @__PURE__ */ import_react6.default.createElement("path", {
227
+ d: "M256,176c-8.8,0-16-7.2-16-16s7.2-16,16-16v32Z"
228
+ }), /* @__PURE__ */ import_react6.default.createElement("path", {
229
+ d: "M256,232c-8.8,0-16-7.2-16-16s7.2-16,16-16v32Z"
230
+ }));
78
231
  };
79
- var stackColumns = "grid-cols-[var(--rail-size)_calc(100%-var(--rail-size))]";
232
+ var MenuSignifierHorizontal = () => /* @__PURE__ */ import_react8.default.createElement("svg", {
233
+ className: "absolute block-end-[7px]",
234
+ width: 20,
235
+ height: 2,
236
+ viewBox: "0 0 20 2",
237
+ stroke: "currentColor",
238
+ opacity: 0.5
239
+ }, /* @__PURE__ */ import_react8.default.createElement("line", {
240
+ x1: 0.5,
241
+ y1: 0.75,
242
+ x2: 19,
243
+ y2: 0.75,
244
+ strokeWidth: 1.25,
245
+ strokeLinecap: "round",
246
+ strokeDasharray: "6 20",
247
+ strokeDashoffset: "-6.5"
248
+ }));
80
249
  var translationKey = "stack";
81
250
  var translations_default = [
82
251
  {
83
252
  "en-US": {
84
253
  [translationKey]: {
85
- "empty stack message": "Drag items into the stack.",
86
- "remove section label": "Delete",
87
- "navigate to section label": "Navigate to item",
88
- "untitled section title": "Untitled section",
89
- "add section before label": "Add before",
90
- "add section after label": "Add after",
91
- "expand label": "Expand",
92
- "collapse label": "Collapse"
254
+ "resize label": "Drag to resize",
255
+ "pin start label": "Pin to the left sidebar",
256
+ "pin end label": "Pin to the right sidebar",
257
+ "increment start label": "Move to the left",
258
+ "increment end label": "Move to the right",
259
+ "close label": "Close",
260
+ "minify label": "Minify"
93
261
  }
94
262
  }
95
263
  }
96
264
  ];
97
- var sectionActionDimensions = "p-1 shrink-0 min-bs-0 is-[--rail-action] bs-min";
98
- var resizeHandleStyles = (0, import_react_ui_theme2.mx)(import_react_ui_deck.resizeHandle, import_react_ui_deck.resizeHandleHorizontal, "is-full bs-[--rail-action] col-start-2");
99
- var Section = /* @__PURE__ */ (0, import_react3.forwardRef)(({ id, title, icon = "ph--placeholder--regular", size = "intrinsic", collapsed, active, isResizable, draggableProps, draggableStyle, onDelete, onNavigate, onAddBefore, onAddAfter, onCollapseSection, children }, forwardedRef) => {
100
- const { t } = (0, import_react_ui2.useTranslation)(translationKey);
101
- const [optionsMenuOpen, setOptionsMenuOpen] = (0, import_react3.useState)(false);
102
- const sectionActionsToolbar = (0, import_react_tabster2.useTabsterAttributes)({
103
- groupper: {},
104
- focusable: {},
105
- mover: {
106
- cyclic: true,
107
- direction: 1,
108
- memorizeCurrent: false
109
- }
110
- });
111
- const sectionContentGroup = (0, import_react_tabster2.useFocusableGroup)({});
112
- const attendableAttrs = (0, import_react_ui_attention.useAttendableAttributes)(id);
113
- return /* @__PURE__ */ import_react3.default.createElement(CollapsiblePrimitive.Root, {
114
- asChild: true,
115
- open: !collapsed,
116
- onOpenChange: (nextOpen) => onCollapseSection?.(id, !nextOpen)
117
- }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ListItem.Root, {
118
- ref: forwardedRef,
119
- id,
120
- ...attendableAttrs,
265
+ var StackItemSigilButton = /* @__PURE__ */ (0, import_react7.forwardRef)(({ attendableId, classNames, related, children, ...props }, forwardedRef) => {
266
+ const { hasAttention, isAncestor, isRelated } = (0, import_react_ui_attention2.useAttention)(attendableId);
267
+ const variant = related && isRelated || hasAttention || isAncestor ? "primary" : "ghost";
268
+ return /* @__PURE__ */ import_react7.default.createElement(import_react_ui.Button, {
269
+ ...props,
270
+ variant,
121
271
  classNames: [
122
- "grid col-span-2 group/section",
123
- active === "overlay" ? stackColumns : "grid-cols-subgrid snap-start"
272
+ "m-1 shrink-0 pli-0 min-bs-0 is-[--rail-action] bs-[--rail-action] relative",
273
+ classNames
124
274
  ],
125
- style: draggableStyle
126
- }, /* @__PURE__ */ import_react3.default.createElement("div", {
127
- role: "none",
128
- className: (0, import_react_ui_theme2.mx)("grid col-span-2 grid-cols-subgrid", "bg-base attention-surface", import_react_ui_theme2.hoverableControls, import_react_ui_theme2.hoverableFocusedWithinControls, (active === "origin" || active === "rearrange" || active === "destination") && "opacity-0")
129
- }, /* @__PURE__ */ import_react3.default.createElement("div", {
130
- role: "toolbar",
131
- "aria-orientation": "vertical",
132
- "aria-label": t("section controls label"),
133
- ...!active && {
134
- tabIndex: 0
135
- },
136
- ...!active && sectionActionsToolbar,
137
- className: (0, import_react_ui_theme2.mx)("grid grid-cols-subgrid ch-focus-ring rounded-sm grid-rows-[min-content_min-content_1fr] m-1", "group-has-[[role=toolbar][aria-orientation=horizontal]]/section:pbs-[--rail-action]")
138
- }, /* @__PURE__ */ import_react3.default.createElement("div", {
139
- role: "none",
140
- className: "sticky -block-start-px bg-[--sticky-bg]"
141
- }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.DropdownMenu.Root, {
275
+ ref: forwardedRef
276
+ }, /* @__PURE__ */ import_react7.default.createElement(MenuSignifierHorizontal, null), children);
277
+ });
278
+ var StackItemSigil = /* @__PURE__ */ (0, import_react7.forwardRef)(({ actions: actionGroups, onAction, triggerLabel, attendableId, icon, related, children }, forwardedRef) => {
279
+ const { t } = (0, import_react_ui.useTranslation)(translationKey);
280
+ const suppressNextTooltip = (0, import_react7.useRef)(false);
281
+ const [optionsMenuOpen, setOptionsMenuOpen] = (0, import_react7.useState)(false);
282
+ const [triggerTooltipOpen, setTriggerTooltipOpen] = (0, import_react7.useState)(false);
283
+ return /* @__PURE__ */ import_react7.default.createElement(import_react_ui.Tooltip.Root, {
284
+ open: triggerTooltipOpen,
285
+ onOpenChange: (nextOpen) => {
286
+ if (suppressNextTooltip.current) {
287
+ setTriggerTooltipOpen(false);
288
+ suppressNextTooltip.current = false;
289
+ } else {
290
+ setTriggerTooltipOpen(nextOpen);
291
+ }
292
+ }
293
+ }, /* @__PURE__ */ import_react7.default.createElement(import_react_ui.DropdownMenu.Root, {
142
294
  open: optionsMenuOpen,
143
- onOpenChange: setOptionsMenuOpen
144
- }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui_deck.DropDownMenuDragHandleTrigger, {
145
- active: !!active,
146
- variant: "ghost",
147
- classNames: "m-0",
148
- ...draggableProps
149
- }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Icon, {
150
- icon,
151
- size: 5,
152
- classNames: "transition-opacity"
153
- })), /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.DropdownMenu.Portal, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.DropdownMenu.Content, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.DropdownMenu.Viewport, null, collapsed ? /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.DropdownMenu.Item, {
154
- onClick: onNavigate,
155
- "data-testid": "section.navigate-to"
156
- }, /* @__PURE__ */ import_react3.default.createElement(import_react2.ArrowSquareOut, {
157
- className: (0, import_react_ui_theme2.mx)((0, import_react_ui_theme2.getSize)(5), "mr-2")
158
- }), /* @__PURE__ */ import_react3.default.createElement("span", {
159
- className: "grow"
160
- }, t("navigate to section label"))) : /* @__PURE__ */ import_react3.default.createElement(CollapsiblePrimitive.Trigger, {
161
- asChild: true
162
- }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.DropdownMenu.Item, null, /* @__PURE__ */ import_react3.default.createElement(CaretDownUp, {
163
- className: (0, import_react_ui_theme2.mx)((0, import_react_ui_theme2.getSize)(5), "mr-2")
164
- }), /* @__PURE__ */ import_react3.default.createElement("span", {
165
- className: "grow"
166
- }, t("collapse label")))), /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.DropdownMenu.Item, {
167
- onClick: onAddBefore,
168
- "data-testid": "section.add-before"
169
- }, /* @__PURE__ */ import_react3.default.createElement(import_react2.ArrowLineUp, {
170
- className: (0, import_react_ui_theme2.mx)((0, import_react_ui_theme2.getSize)(5), "mr-2")
171
- }), /* @__PURE__ */ import_react3.default.createElement("span", {
172
- className: "grow"
173
- }, t("add section before label"))), /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.DropdownMenu.Item, {
174
- onClick: onAddAfter,
175
- "data-testid": "section.add-after"
176
- }, /* @__PURE__ */ import_react3.default.createElement(import_react2.ArrowLineDown, {
177
- className: (0, import_react_ui_theme2.mx)((0, import_react_ui_theme2.getSize)(5), "mr-2")
178
- }), /* @__PURE__ */ import_react3.default.createElement("span", {
179
- className: "grow"
180
- }, t("add section after label"))), /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.DropdownMenu.Item, {
181
- onClick: () => onDelete?.(),
182
- "data-testid": "section.remove"
183
- }, /* @__PURE__ */ import_react3.default.createElement(import_react2.Trash, {
184
- className: (0, import_react_ui_theme2.mx)((0, import_react_ui_theme2.getSize)(5), "mr-2")
185
- }), /* @__PURE__ */ import_react3.default.createElement("span", {
186
- className: "grow"
187
- }, t("remove section label")))), /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.DropdownMenu.Arrow, null)))), collapsed ? /* @__PURE__ */ import_react3.default.createElement(CollapsiblePrimitive.Trigger, {
188
- asChild: true
189
- }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Button, {
190
- variant: "ghost",
191
- classNames: sectionActionDimensions
192
- }, /* @__PURE__ */ import_react3.default.createElement("span", {
193
- className: "sr-only"
194
- }, t("expand label")), /* @__PURE__ */ import_react3.default.createElement(import_react2.CaretUpDown, {
195
- className: (0, import_react_ui_theme2.getSize)(4)
196
- }))) : /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Button, {
197
- variant: "ghost",
198
- classNames: sectionActionDimensions,
199
- onClick: onNavigate,
200
- "data-testid": "section.navigate-to"
201
- }, /* @__PURE__ */ import_react3.default.createElement(import_react2.ArrowSquareOut, {
202
- className: (0, import_react_ui_theme2.mx)((0, import_react_ui_theme2.getSize)(4))
203
- }), /* @__PURE__ */ import_react3.default.createElement("span", {
204
- className: "sr-only"
205
- }, t("navigate to section label"))))), /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ListItem.Heading, {
206
- classNames: collapsed ? [
207
- "grid grid-rows-subgrid grid-cols-subgrid items-center",
208
- import_react_ui_theme2.focusRing
209
- ] : "sr-only",
210
- ...collapsed && {
211
- ...sectionContentGroup,
212
- tabIndex: 0
295
+ onOpenChange: (nextOpen) => {
296
+ if (!nextOpen) {
297
+ suppressNextTooltip.current = true;
298
+ }
299
+ return setOptionsMenuOpen(nextOpen);
213
300
  }
214
- }, /* @__PURE__ */ import_react3.default.createElement("span", {
215
- className: "truncate"
216
- }, title)), size === "intrinsic" ? /* @__PURE__ */ import_react3.default.createElement(CollapsiblePrimitive.Content, {
217
- ...!collapsed && {
218
- ...sectionContentGroup,
219
- tabIndex: 0
220
- },
221
- // TODO(burdon): Add margin to fragment?
222
- className: (0, import_react_ui_theme2.mx)(import_react_ui_theme2.focusRing, "m-[2px]")
223
- }, children) : /* @__PURE__ */ import_react3.default.createElement(CollapsiblePrimitive.Content, {
301
+ }, /* @__PURE__ */ import_react7.default.createElement(import_react_ui.Tooltip.Trigger, {
224
302
  asChild: true
225
- }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ScrollArea.Root, {
226
- type: "always",
227
- ...!collapsed && {
228
- ...sectionContentGroup,
229
- tabIndex: 0
230
- },
231
- classNames: (0, import_react_ui_theme2.mx)(import_react_ui_theme2.focusRing, "is-full has-[[data-radix-scroll-area-viewport]]:pbe-4")
232
- }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ScrollArea.Viewport, null, children), /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ScrollArea.Scrollbar, {
233
- orientation: "horizontal",
234
- variant: "coarse",
235
- classNames: "hidden has-[div]:flex !inline-end-[max(.25rem,var(--radix-scroll-area-corner-width))]"
236
- }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ScrollArea.Thumb, null)), /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ScrollArea.Scrollbar, {
237
- orientation: "vertical",
238
- variant: "coarse",
239
- classNames: "hidden has-[div]:flex"
240
- }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ScrollArea.Thumb, null)), /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ScrollArea.Corner, null)))), isResizable && !collapsed && /* @__PURE__ */ import_react3.default.createElement("button", {
241
- className: resizeHandleStyles
242
- }, /* @__PURE__ */ import_react3.default.createElement("span", {
303
+ }, /* @__PURE__ */ import_react7.default.createElement(import_react_ui.DropdownMenu.Trigger, {
304
+ asChild: true,
305
+ ref: forwardedRef
306
+ }, /* @__PURE__ */ import_react7.default.createElement(StackItemSigilButton, {
307
+ attendableId,
308
+ related
309
+ }, /* @__PURE__ */ import_react7.default.createElement("span", {
243
310
  className: "sr-only"
244
- }, t("resize section label")))));
311
+ }, triggerLabel), /* @__PURE__ */ import_react7.default.createElement(import_react_ui.Icon, {
312
+ icon,
313
+ size: 5
314
+ })))), /* @__PURE__ */ import_react7.default.createElement(import_react_ui.DropdownMenu.Portal, null, /* @__PURE__ */ import_react7.default.createElement(import_react_ui.DropdownMenu.Content, {
315
+ classNames: "z-[31]"
316
+ }, /* @__PURE__ */ import_react7.default.createElement(import_react_ui.DropdownMenu.Viewport, null, actionGroups?.map((actions, index) => {
317
+ const separator = index > 0 ? /* @__PURE__ */ import_react7.default.createElement(import_react_ui.DropdownMenu.Separator, null) : null;
318
+ return /* @__PURE__ */ import_react7.default.createElement(import_react7.Fragment, {
319
+ key: index
320
+ }, separator, actions.map((action) => {
321
+ const shortcut = typeof action.properties.keyBinding === "string" ? action.properties.keyBinding : action.properties.keyBinding?.[(0, import_util.getHostPlatform)()];
322
+ const menuItemType = action.properties.menuItemType;
323
+ const Root = menuItemType === "toggle" ? import_react_ui.DropdownMenu.CheckboxItem : import_react_ui.DropdownMenu.Item;
324
+ return /* @__PURE__ */ import_react7.default.createElement(Root, {
325
+ key: action.id,
326
+ onClick: (event) => {
327
+ if (action.properties.disabled) {
328
+ return;
329
+ }
330
+ event.stopPropagation();
331
+ suppressNextTooltip.current = true;
332
+ setOptionsMenuOpen(false);
333
+ onAction?.(action);
334
+ },
335
+ classNames: "gap-2",
336
+ disabled: action.properties.disabled,
337
+ checked: menuItemType === "toggle" ? action.properties.isChecked : void 0,
338
+ ...action.properties?.testId && {
339
+ "data-testid": action.properties.testId
340
+ }
341
+ }, /* @__PURE__ */ import_react7.default.createElement(import_react_ui.Icon, {
342
+ icon: action.properties.icon ?? "ph--placeholder--regular",
343
+ size: 4
344
+ }), /* @__PURE__ */ import_react7.default.createElement("span", {
345
+ className: "grow truncate"
346
+ }, (0, import_react_ui.toLocalizedString)(action.properties.label ?? "", t)), menuItemType === "toggle" && /* @__PURE__ */ import_react7.default.createElement(import_react_ui.DropdownMenu.ItemIndicator, {
347
+ asChild: true
348
+ }, /* @__PURE__ */ import_react7.default.createElement(import_react_ui.Icon, {
349
+ icon: "ph--check--regular",
350
+ size: 4
351
+ })), shortcut && /* @__PURE__ */ import_react7.default.createElement("span", {
352
+ className: (0, import_react_ui_theme6.mx)("shrink-0", import_react_ui_theme6.descriptionText)
353
+ }, (0, import_keyboard.keySymbols)(shortcut).join("")));
354
+ }));
355
+ }), 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, {
356
+ style: {
357
+ zIndex: 70
358
+ },
359
+ side: "bottom"
360
+ }, triggerLabel, /* @__PURE__ */ import_react7.default.createElement(import_react_ui.Tooltip.Arrow, null))));
245
361
  });
246
- var sectionToolbarLayout = "bs-[--rail-action] bg-[--sticky-bg] sticky block-start-0 __-block-start-px transition-opacity";
247
- var SectionToolbar = ({ children, classNames }) => {
248
- return /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Toolbar.Root, {
249
- orientation: "horizontal",
250
- classNames: [
251
- sectionToolbarLayout,
252
- import_react_ui_theme2.hoverableControlItem,
253
- classNames
254
- ]
255
- }, children);
256
- };
257
- var SectionTile = /* @__PURE__ */ (0, import_react3.forwardRef)(({ path, type, active, draggableStyle, draggableProps, item, itemContext }, forwardedRef) => {
258
- const { t } = (0, import_react_ui2.useTranslation)(translationKey);
259
- const { activeItem } = (0, import_react_ui_mosaic2.useMosaic)();
260
- const separation = !!itemContext?.separation;
261
- const isResizable = !!itemContext?.isResizable;
262
- const { transform, onDeleteSection, onNavigateToSection, onAddSection, onCollapseSection, SectionContent } = itemContext;
263
- const transformedItem = transform ? transform(
264
- item,
265
- // TODO(wittjosiah): `active` doesn't always seem to be accurate here.
266
- activeItem?.item.id === item.id ? activeItem?.type : type
267
- ) : item;
268
- const placeholder = transformedItem.metadata?.placeholder ?? [
269
- "untitled section title",
270
- {
271
- ns: translationKey
362
+ var DEFAULT_HORIZONTAL_SIZE = 44;
363
+ var DEFAULT_VERTICAL_SIZE = "min-content";
364
+ var DEFAULT_EXTRINSIC_SIZE = DEFAULT_HORIZONTAL_SIZE;
365
+ var StackItemRoot = /* @__PURE__ */ (0, import_react3.forwardRef)(({ item, children, classNames, onRearrange, size: propsSize, onSizeChange, role, order, style, ...props }, forwardedRef) => {
366
+ const [itemElement, itemRef] = (0, import_react3.useState)(null);
367
+ const [selfDragHandleElement, selfDragHandleRef] = (0, import_react3.useState)(null);
368
+ const [closestEdge, setEdge] = (0, import_react3.useState)(null);
369
+ const { orientation, rail, separators } = useStack();
370
+ const [size = orientation === "horizontal" ? DEFAULT_HORIZONTAL_SIZE : DEFAULT_VERTICAL_SIZE, setInternalSize] = (0, import_react3.useState)(propsSize);
371
+ const Root = role ?? "div";
372
+ const composedItemRef = (0, import_react_compose_refs.composeRefs)(itemRef, forwardedRef);
373
+ const setSize = (0, import_react3.useCallback)((nextSize, commit) => {
374
+ setInternalSize(nextSize);
375
+ if (commit) {
376
+ onSizeChange?.(nextSize);
272
377
  }
273
- ];
274
- const title = transformedItem.view?.title ?? (0, import_react_ui2.toLocalizedString)(placeholder, t);
275
- const section = /* @__PURE__ */ import_react3.default.createElement(Section, {
276
- ref: forwardedRef,
277
- title,
278
- id: transformedItem.id,
279
- size: transformedItem.view?.size,
280
- icon: transformedItem.metadata?.icon,
281
- collapsed: transformedItem.view?.collapsed,
282
- separation,
283
- active,
284
- draggableProps,
285
- draggableStyle,
286
- onCollapseSection,
287
- isResizable,
288
- onDelete: () => onDeleteSection?.(path),
289
- onNavigate: () => onNavigateToSection?.(transformedItem),
290
- onAddAfter: () => onAddSection?.(path, "after"),
291
- onAddBefore: () => onAddSection?.(path, "before")
292
- }, SectionContent && /* @__PURE__ */ import_react3.default.createElement(SectionContent, {
293
- data: transformedItem.object
294
- }));
295
- return active === "overlay" ? /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.List, null, section) : section;
296
- });
297
- var DEFAULT_TYPE = "stack-section";
298
- var Stack = ({ id, type = DEFAULT_TYPE, SectionContent, items = [], separation = true, transform, onOver, onDrop, onAddSection, onDeleteSection, onNavigateToSection, onCollapseSection, ...props }) => {
299
- const { ref: containerRef, width = 0 } = (0, import_react_resize_detector.useResizeDetector)({
300
- refreshRate: 200
301
- });
302
- const { operation, overItem } = (0, import_react_ui_mosaic.useMosaic)();
303
- const itemsWithPreview = (0, import_react_ui_mosaic.useItemsWithPreview)({
304
- path: id,
305
- items
306
- });
307
- const getOverlayStyle = (0, import_react.useCallback)(() => ({
308
- width
309
- }), [
310
- width
378
+ }, [
379
+ onSizeChange
311
380
  ]);
312
- const getOverlayProps = (0, import_react.useCallback)(() => ({
313
- itemContext: {
314
- transform,
315
- SectionContent
381
+ const type = orientation === "horizontal" ? "column" : "card";
382
+ (0, import_react3.useLayoutEffect)(() => {
383
+ if (!itemElement || !onRearrange) {
384
+ return;
316
385
  }
317
- }), [
318
- transform,
319
- SectionContent
386
+ return (0, import_combine.combine)((0, import_adapter.draggable)({
387
+ element: itemElement,
388
+ ...selfDragHandleElement && {
389
+ dragHandle: selfDragHandleElement
390
+ },
391
+ getInitialData: () => ({
392
+ id: item.id,
393
+ type
394
+ })
395
+ }), (0, import_adapter.dropTargetForElements)({
396
+ element: itemElement,
397
+ getData: ({ input, element }) => {
398
+ return (0, import_closest_edge.attachClosestEdge)({
399
+ id: item.id,
400
+ type
401
+ }, {
402
+ input,
403
+ element,
404
+ allowedEdges: orientation === "horizontal" ? [
405
+ "left",
406
+ "right"
407
+ ] : [
408
+ "top",
409
+ "bottom"
410
+ ]
411
+ });
412
+ },
413
+ onDragEnter: ({ self, source }) => {
414
+ if (source.data.type === self.data.type) {
415
+ setEdge((0, import_closest_edge.extractClosestEdge)(self.data));
416
+ }
417
+ },
418
+ onDrag: ({ self, source }) => {
419
+ if (source.data.type === self.data.type) {
420
+ setEdge((0, import_closest_edge.extractClosestEdge)(self.data));
421
+ }
422
+ },
423
+ onDragLeave: () => setEdge(null),
424
+ onDrop: ({ self, source }) => {
425
+ setEdge(null);
426
+ if (source.data.type === self.data.type) {
427
+ onRearrange(source.data, self.data, (0, import_closest_edge.extractClosestEdge)(self.data));
428
+ }
429
+ }
430
+ }));
431
+ }, [
432
+ orientation,
433
+ item,
434
+ onRearrange,
435
+ selfDragHandleElement,
436
+ itemElement
320
437
  ]);
321
- const stackModifier = (0, import_react.useCallback)((_activeItem, { transform: transform2, activeNodeRect, overlayNodeRect }) => {
322
- if (activeNodeRect && overlayNodeRect) {
323
- transform2.y += activeNodeRect?.top - overlayNodeRect?.top;
438
+ const focusGroupAttrs = (0, import_react_tabster2.useFocusableGroup)({
439
+ tabBehavior: "limited"
440
+ });
441
+ return /* @__PURE__ */ import_react3.default.createElement(StackItemContext.Provider, {
442
+ value: {
443
+ selfDragHandleRef,
444
+ size,
445
+ setSize
324
446
  }
325
- return transform2;
326
- }, []);
327
- return /* @__PURE__ */ import_react.default.createElement(import_react_ui_mosaic.Mosaic.Container, {
328
- id,
329
- type,
330
- Component: SectionTile,
331
- getOverlayStyle,
332
- getOverlayProps,
333
- onOver,
334
- onDrop,
335
- modifier: stackModifier
336
- }, /* @__PURE__ */ import_react.default.createElement(import_react_ui_mosaic.Mosaic.DroppableTile, {
337
- path: id,
338
- type,
339
- item: {
340
- id,
341
- items: itemsWithPreview
342
- },
343
- // TODO(wittjosiah): Should this actually be a context?
344
- itemContext: {
345
- separation,
346
- transform,
347
- onDeleteSection,
348
- onNavigateToSection,
349
- onAddSection,
350
- onCollapseSection,
351
- SectionContent
352
- },
353
- isOver: overItem && !!overItem.path && import_react_ui_mosaic.Path.hasRoot(overItem.path, id) && (operation === "copy" || operation === "transfer"),
354
- Component: StackTile,
447
+ }, /* @__PURE__ */ import_react3.default.createElement(Root, {
355
448
  ...props,
356
- ref: containerRef
357
- }));
449
+ tabIndex: 0,
450
+ ...focusGroupAttrs,
451
+ 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),
452
+ "data-dx-stack-item": true,
453
+ style: {
454
+ ...size !== "min-content" && {
455
+ [orientation === "horizontal" ? "inlineSize" : "blockSize"]: `${size}rem`
456
+ },
457
+ ...Number.isFinite(order) && {
458
+ [orientation === "horizontal" ? "gridColumn" : "gridRow"]: `${order}`
459
+ },
460
+ ...style
461
+ },
462
+ ref: composedItemRef
463
+ }, children, closestEdge && /* @__PURE__ */ import_react3.default.createElement(import_box.DropIndicator, {
464
+ edge: closestEdge
465
+ })));
466
+ });
467
+ var StackItem = {
468
+ Root: StackItemRoot,
469
+ Content: StackItemContent,
470
+ Heading: StackItemHeading,
471
+ HeadingLabel: StackItemHeadingLabel,
472
+ ResizeHandle: StackItemResizeHandle,
473
+ Sigil: StackItemSigil,
474
+ SigilButton: StackItemSigilButton
358
475
  };
359
- var StackTile = /* @__PURE__ */ (0, import_react.forwardRef)(({ classNames, path, isOver, item: { items }, itemContext, type: _type, emptyComponent, ...props }, forwardedRef) => {
360
- const { t } = (0, import_react_ui.useTranslation)(translationKey);
361
- const { Component, type } = (0, import_react_ui_mosaic.useContainer)();
362
- const domAttributes = (0, import_react_tabster.useArrowNavigationGroup)({
363
- axis: "grid"
364
- });
365
- const { activeItem } = (0, import_react_ui_mosaic.useMosaic)();
366
- const _group = (0, import_react_tabster.useFocusableGroup)();
367
- return /* @__PURE__ */ import_react.default.createElement(import_react_ui.List, {
368
- ref: forwardedRef,
369
- classNames: [
370
- "grid relative",
371
- stackColumns,
372
- isOver && import_react_ui_theme.dropRingInner,
373
- classNames
374
- ],
375
- ...!activeItem && domAttributes,
476
+ var LayoutControl = ({ icon, label, ...props }) => {
477
+ return /* @__PURE__ */ import_react9.default.createElement(import_react_ui2.Tooltip.Root, null, /* @__PURE__ */ import_react9.default.createElement(import_react_ui2.Tooltip.Trigger, {
478
+ asChild: true
479
+ }, /* @__PURE__ */ import_react9.default.createElement(import_react_ui2.Button, {
480
+ variant: "ghost",
376
481
  ...props
377
- }, items.length > 0 ? /* @__PURE__ */ import_react.default.createElement(import_react_ui_mosaic.Mosaic.SortableContext, {
378
- items,
379
- direction: "vertical"
380
- }, items.map((item, index) => /* @__PURE__ */ import_react.default.createElement(import_react_ui_mosaic.Mosaic.SortableTile, {
381
- key: item.id,
382
- item,
383
- itemContext,
384
- path,
385
- type,
386
- position: index,
387
- Component
388
- }))) : emptyComponent !== void 0 ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, emptyComponent) : /* @__PURE__ */ import_react.default.createElement("p", {
389
- className: "grid col-span-2 text-center p-4 border border-dashed border-neutral-500/50 rounded",
390
- "data-testid": "stack.empty"
391
- }, t("empty stack message")));
482
+ }, /* @__PURE__ */ import_react9.default.createElement("span", {
483
+ className: "sr-only"
484
+ }, label), /* @__PURE__ */ import_react9.default.createElement(import_react_ui2.Icon, {
485
+ icon
486
+ }))), /* @__PURE__ */ import_react9.default.createElement(import_react_ui2.Tooltip.Portal, null, /* @__PURE__ */ import_react9.default.createElement(import_react_ui2.Tooltip.Content, {
487
+ side: "bottom",
488
+ classNames: "z-[70]"
489
+ }, label)));
490
+ };
491
+ var LayoutControls = /* @__PURE__ */ (0, import_react9.forwardRef)(({ onClick, variant = "default", capabilities: can, isSolo, pin, close = false, children, ...props }, forwardedRef) => {
492
+ const { t } = (0, import_react_ui2.useTranslation)(translationKey);
493
+ const buttonClassNames = variant === "hide-disabled" ? "disabled:hidden !p-1" : "!p-1";
494
+ return /* @__PURE__ */ import_react9.default.createElement(import_react_ui2.ButtonGroup, {
495
+ ...props,
496
+ ref: forwardedRef
497
+ }, pin && !isSolo && [
498
+ "both",
499
+ "start"
500
+ ].includes(pin) && /* @__PURE__ */ import_react9.default.createElement(LayoutControl, {
501
+ label: t("pin start label"),
502
+ variant: "ghost",
503
+ classNames: buttonClassNames,
504
+ onClick: () => onClick?.("pin-start"),
505
+ icon: "ph--caret-line-left--regular"
506
+ }), can.solo && /* @__PURE__ */ import_react9.default.createElement(LayoutControl, {
507
+ label: t("solo layout label"),
508
+ classNames: buttonClassNames,
509
+ onClick: () => onClick?.("solo"),
510
+ icon: isSolo ? "ph--arrows-in--regular" : "ph--arrows-out--regular"
511
+ }), !isSolo && can.solo && /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, /* @__PURE__ */ import_react9.default.createElement(LayoutControl, {
512
+ label: t("increment start label"),
513
+ disabled: !can.incrementStart,
514
+ classNames: buttonClassNames,
515
+ onClick: () => onClick?.("increment-start"),
516
+ icon: "ph--caret-left--regular"
517
+ }), /* @__PURE__ */ import_react9.default.createElement(LayoutControl, {
518
+ label: t("increment end label"),
519
+ disabled: !can.incrementEnd,
520
+ classNames: buttonClassNames,
521
+ onClick: () => onClick?.("increment-end"),
522
+ icon: "ph--caret-right--regular"
523
+ })), pin && !isSolo && [
524
+ "both",
525
+ "end"
526
+ ].includes(pin) && /* @__PURE__ */ import_react9.default.createElement(LayoutControl, {
527
+ label: t("pin end label"),
528
+ classNames: buttonClassNames,
529
+ onClick: () => onClick?.("pin-end"),
530
+ icon: "ph--caret-line-right--regular"
531
+ }), close && !isSolo && /* @__PURE__ */ import_react9.default.createElement(LayoutControl, {
532
+ label: t(`${typeof close === "string" ? "minify" : "close"} label`),
533
+ classNames: buttonClassNames,
534
+ onClick: () => onClick?.("close"),
535
+ "data-testid": "layoutHeading.close",
536
+ icon: close === "minify-start" ? "ph--caret-line-left--regular" : close === "minify-end" ? "ph--caret-line-right--regular" : "ph--x--regular"
537
+ }), children);
392
538
  });
393
539
  // Annotate the CommonJS export names for ESM import in node:
394
540
  0 && (module.exports = {
395
- DEFAULT_TYPE,
396
- SectionToolbar,
541
+ DEFAULT_EXTRINSIC_SIZE,
542
+ DEFAULT_HORIZONTAL_SIZE,
543
+ DEFAULT_VERTICAL_SIZE,
544
+ LayoutControls,
397
545
  Stack,
398
- sectionToolbarLayout,
546
+ StackContext,
547
+ StackItem,
548
+ railGridHorizontal,
549
+ railGridVertical,
399
550
  translations
400
551
  });
401
552
  //# sourceMappingURL=index.cjs.map