@dxos/react-ui-menu 0.7.5-main.937ce75 → 0.7.5-main.9d2a38b

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 (56) hide show
  1. package/dist/lib/browser/index.mjs +322 -115
  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 +320 -103
  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 +322 -115
  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/DropdownMenu.d.ts +9 -8
  11. package/dist/types/src/components/DropdownMenu.d.ts.map +1 -1
  12. package/dist/types/src/components/MenuContext.d.ts +13 -0
  13. package/dist/types/src/components/MenuContext.d.ts.map +1 -0
  14. package/dist/types/src/components/ToolbarMenu.d.ts +20 -0
  15. package/dist/types/src/components/ToolbarMenu.d.ts.map +1 -0
  16. package/dist/types/src/components/index.d.ts +2 -1
  17. package/dist/types/src/components/index.d.ts.map +1 -1
  18. package/dist/types/src/defs.d.ts +34 -7
  19. package/dist/types/src/defs.d.ts.map +1 -1
  20. package/dist/types/src/hooks.d.ts +17 -0
  21. package/dist/types/src/hooks.d.ts.map +1 -0
  22. package/dist/types/src/index.d.ts +2 -0
  23. package/dist/types/src/index.d.ts.map +1 -1
  24. package/dist/types/src/testing/Menus.stories.d.ts +4 -1
  25. package/dist/types/src/testing/Menus.stories.d.ts.map +1 -1
  26. package/dist/types/src/testing/index.d.ts +6 -6
  27. package/dist/types/src/testing/index.d.ts.map +1 -1
  28. package/dist/types/src/util.d.ts +42 -1
  29. package/dist/types/src/util.d.ts.map +1 -1
  30. package/dist/types/tsconfig.tsbuildinfo +1 -1
  31. package/package.json +14 -11
  32. package/src/components/DropdownMenu.tsx +35 -27
  33. package/src/components/MenuContext.tsx +57 -0
  34. package/src/components/ToolbarMenu.tsx +185 -0
  35. package/src/components/index.ts +2 -1
  36. package/src/defs.ts +38 -7
  37. package/src/hooks.ts +72 -0
  38. package/src/index.ts +2 -0
  39. package/src/testing/Menus.stories.tsx +30 -18
  40. package/src/testing/index.ts +24 -5
  41. package/src/util.ts +58 -1
  42. package/dist/types/src/components/Toolbar/Toolbar.d.ts +0 -4
  43. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +0 -1
  44. package/dist/types/src/components/Toolbar/ToolbarDropdownMenu.d.ts +0 -4
  45. package/dist/types/src/components/Toolbar/ToolbarDropdownMenu.d.ts.map +0 -1
  46. package/dist/types/src/components/Toolbar/ToolbarToggleGroup.d.ts +0 -4
  47. package/dist/types/src/components/Toolbar/ToolbarToggleGroup.d.ts.map +0 -1
  48. package/dist/types/src/components/Toolbar/defs.d.ts +0 -30
  49. package/dist/types/src/components/Toolbar/defs.d.ts.map +0 -1
  50. package/dist/types/src/components/Toolbar/index.d.ts +0 -3
  51. package/dist/types/src/components/Toolbar/index.d.ts.map +0 -1
  52. package/src/components/Toolbar/Toolbar.tsx +0 -71
  53. package/src/components/Toolbar/ToolbarDropdownMenu.tsx +0 -36
  54. package/src/components/Toolbar/ToolbarToggleGroup.tsx +0 -39
  55. package/src/components/Toolbar/defs.ts +0 -36
  56. package/src/components/Toolbar/index.ts +0 -6
@@ -29,10 +29,20 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
29
29
  var node_exports = {};
30
30
  __export(node_exports, {
31
31
  DropdownMenu: () => DropdownMenu,
32
- Toolbar: () => Toolbar,
33
- ToolbarSeparatorType: () => ToolbarSeparatorType,
34
- isMenu: () => isMenu,
35
- isSeparator: () => isSeparator
32
+ MenuProvider: () => MenuProvider,
33
+ MenuSeparatorType: () => MenuSeparatorType,
34
+ ToolbarMenu: () => ToolbarMenu,
35
+ createGapSeparator: () => createGapSeparator,
36
+ createLineSeparator: () => createLineSeparator,
37
+ createMenuAction: () => createMenuAction,
38
+ createMenuItemGroup: () => createMenuItemGroup,
39
+ createMenuScope: () => createMenuScope,
40
+ isMenuGroup: () => isMenuGroup,
41
+ isSeparator: () => isSeparator,
42
+ menuContextDefaults: () => menuContextDefaults,
43
+ useMenu: () => useMenu,
44
+ useMenuActions: () => useMenuActions,
45
+ useMenuItems: () => useMenuItems
36
46
  });
37
47
  module.exports = __toCommonJS(node_exports);
38
48
  var import_react_use_controllable_state = require("@radix-ui/react-use-controllable-state");
@@ -42,14 +52,17 @@ var import_react2 = __toESM(require("react"));
42
52
  var import_keyboard = require("@dxos/keyboard");
43
53
  var import_react_ui2 = require("@dxos/react-ui");
44
54
  var import_react_ui_theme = require("@dxos/react-ui-theme");
55
+ var import_app_graph = require("@dxos/app-graph");
45
56
  var import_util = require("@dxos/util");
57
+ var import_react_context = require("@radix-ui/react-context");
46
58
  var import_react3 = __toESM(require("react"));
47
- var import_react_ui3 = require("@dxos/react-ui");
48
59
  var import_react4 = __toESM(require("react"));
49
- var import_react_ui4 = require("@dxos/react-ui");
50
- var import_react5 = __toESM(require("react"));
51
- var import_react_ui5 = require("@dxos/react-ui");
52
- var import_app_graph = require("@dxos/app-graph");
60
+ var import_react_ui3 = require("@dxos/react-ui");
61
+ var import_react_ui_attention = require("@dxos/react-ui-attention");
62
+ var import_app_graph2 = require("@dxos/app-graph");
63
+ var import_signals_react = require("@preact/signals-react");
64
+ var import_react5 = require("react");
65
+ var import_app_graph3 = require("@dxos/app-graph");
53
66
  var translationKey = "menus";
54
67
  var translations_default = [
55
68
  {
@@ -61,6 +74,56 @@ var translations_default = [
61
74
  var getShortcut = (action) => {
62
75
  return typeof action.properties?.keyBinding === "string" ? action.properties.keyBinding : action.properties?.keyBinding?.[(0, import_util.getHostPlatform)()];
63
76
  };
77
+ var noop = () => {
78
+ };
79
+ var createMenuAction = (id, properties) => ({
80
+ id,
81
+ type: import_app_graph.ACTION_TYPE,
82
+ properties,
83
+ data: noop
84
+ });
85
+ var createMenuItemGroup = (id, properties) => ({
86
+ id,
87
+ type: import_app_graph.ACTION_GROUP_TYPE,
88
+ properties,
89
+ data: import_app_graph.actionGroupSymbol
90
+ });
91
+ var createGapSeparator = (id = "gap", source = "root") => ({
92
+ nodes: [
93
+ {
94
+ id,
95
+ type: "@dxos/react-ui-toolbar/separator",
96
+ properties: {
97
+ variant: "gap"
98
+ },
99
+ data: void 0
100
+ }
101
+ ],
102
+ edges: [
103
+ {
104
+ source,
105
+ target: id
106
+ }
107
+ ]
108
+ });
109
+ var createLineSeparator = (id = "line", source = "root") => ({
110
+ nodes: [
111
+ {
112
+ id,
113
+ type: "@dxos/react-ui-toolbar/separator",
114
+ properties: {
115
+ variant: "line"
116
+ },
117
+ data: void 0
118
+ }
119
+ ],
120
+ edges: [
121
+ {
122
+ source,
123
+ target: id
124
+ }
125
+ ]
126
+ });
64
127
  var ActionLabel = ({ action }) => {
65
128
  const shortcut = getShortcut(action);
66
129
  const { t } = (0, import_react_ui2.useTranslation)(translationKey);
@@ -70,11 +133,41 @@ var ActionLabel = ({ action }) => {
70
133
  className: (0, import_react_ui_theme.mx)("shrink-0", import_react_ui_theme.descriptionText)
71
134
  }, (0, import_keyboard.keySymbols)(shortcut).join("")));
72
135
  };
73
- var DropdownMenuItem = ({ action, onClick }) => {
136
+ var MENU_NAME = "GraphMenu";
137
+ var [createMenuContext, createMenuScope] = (0, import_react_context.createContextScope)(MENU_NAME, []);
138
+ var [MenuContextProvider, useMenu] = createMenuContext(MENU_NAME);
139
+ var menuContextDefaults = {
140
+ iconSize: 5,
141
+ onAction: () => {
142
+ },
143
+ resolveGroupItems: () => null
144
+ };
145
+ var useMenuScope = createMenuScope();
146
+ var MenuProvider = ({ children, resolveGroupItems = menuContextDefaults.resolveGroupItems, onAction = menuContextDefaults.onAction, iconSize = menuContextDefaults.iconSize, attendableId }) => {
147
+ const { scope } = useMenuScope(void 0);
148
+ return /* @__PURE__ */ import_react3.default.createElement(MenuContextProvider, {
149
+ resolveGroupItems,
150
+ onAction,
151
+ iconSize,
152
+ attendableId,
153
+ scope
154
+ }, children);
155
+ };
156
+ var useMenuItems = (group, propsItems, consumerName = "useMenuItemConsumer", __menuScope) => {
157
+ const { resolveGroupItems } = useMenu(consumerName, __menuScope);
158
+ return (0, import_react3.useMemo)(() => propsItems ?? resolveGroupItems?.(group) ?? void 0, [
159
+ propsItems,
160
+ group,
161
+ resolveGroupItems
162
+ ]);
163
+ };
164
+ var DropdownMenuItem = ({ item, onClick, __menuScope }) => {
165
+ const action = item;
74
166
  const handleClick = (0, import_react.useCallback)((event) => onClick(action, event), [
75
167
  action,
76
168
  onClick
77
169
  ]);
170
+ const { iconSize } = useMenu("DropdownMenuItem", __menuScope);
78
171
  return /* @__PURE__ */ import_react.default.createElement(import_react_ui.DropdownMenu.Item, {
79
172
  onClick: handleClick,
80
173
  classNames: "gap-2",
@@ -84,17 +177,18 @@ var DropdownMenuItem = ({ action, onClick }) => {
84
177
  }
85
178
  }, action.properties?.icon && /* @__PURE__ */ import_react.default.createElement(import_react_ui.Icon, {
86
179
  icon: action.properties.icon,
87
- size: 4
180
+ size: iconSize
88
181
  }), /* @__PURE__ */ import_react.default.createElement(ActionLabel, {
89
182
  action
90
183
  }));
91
184
  };
92
- var DropdownMenuRoot = ({ defaultMenuOpen, actions, menuOpen, suppressNextTooltip, onMenuOpenChange, onAction, children }) => {
185
+ var DropdownMenuRoot = ({ items: propsItems, group, open, defaultOpen, onOpenChange, suppressNextTooltip, children, __menuScope, ...naturalProps }) => {
93
186
  const [optionsMenuOpen, setOptionsMenuOpen] = (0, import_react_use_controllable_state.useControllableState)({
94
- prop: menuOpen,
95
- defaultProp: defaultMenuOpen,
96
- onChange: onMenuOpenChange
187
+ prop: open,
188
+ defaultProp: defaultOpen,
189
+ onChange: onOpenChange
97
190
  });
191
+ const { onAction } = useMenu("DropdownMenuRoot", __menuScope);
98
192
  const handleActionClick = (0, import_react.useCallback)((action, event) => {
99
193
  if (action.properties?.disabled) {
100
194
  return;
@@ -108,6 +202,7 @@ var DropdownMenuRoot = ({ defaultMenuOpen, actions, menuOpen, suppressNextToolti
108
202
  }, [
109
203
  onAction
110
204
  ]);
205
+ const items = useMenuItems(group, propsItems);
111
206
  return /* @__PURE__ */ import_react.default.createElement(import_react_ui.DropdownMenu.Root, {
112
207
  open: optionsMenuOpen,
113
208
  onOpenChange: (nextOpen) => {
@@ -115,10 +210,11 @@ var DropdownMenuRoot = ({ defaultMenuOpen, actions, menuOpen, suppressNextToolti
115
210
  suppressNextTooltip.current = true;
116
211
  }
117
212
  return setOptionsMenuOpen(nextOpen);
118
- }
119
- }, children, /* @__PURE__ */ import_react.default.createElement(import_react_ui.DropdownMenu.Portal, null, /* @__PURE__ */ import_react.default.createElement(import_react_ui.DropdownMenu.Content, null, /* @__PURE__ */ import_react.default.createElement(import_react_ui.DropdownMenu.Viewport, null, actions?.map((action) => /* @__PURE__ */ import_react.default.createElement(DropdownMenuItem, {
120
- key: action.id,
121
- action,
213
+ },
214
+ ...naturalProps
215
+ }, children, /* @__PURE__ */ import_react.default.createElement(import_react_ui.DropdownMenu.Portal, null, /* @__PURE__ */ import_react.default.createElement(import_react_ui.DropdownMenu.Content, null, /* @__PURE__ */ import_react.default.createElement(import_react_ui.DropdownMenu.Viewport, null, items?.map((item) => /* @__PURE__ */ import_react.default.createElement(DropdownMenuItem, {
216
+ key: item.id,
217
+ item,
122
218
  onClick: handleActionClick
123
219
  }))), /* @__PURE__ */ import_react.default.createElement(import_react_ui.DropdownMenu.Arrow, null))));
124
220
  };
@@ -127,122 +223,243 @@ var DropdownMenu = {
127
223
  Trigger: import_react_ui.DropdownMenu.Trigger,
128
224
  VirtualTrigger: import_react_ui.DropdownMenu.VirtualTrigger
129
225
  };
130
- var ToolbarDropdownMenu = ({ actionGroup, graph, onAction, applyActiveIcon }) => {
131
- const menuActions = (0, import_react4.useMemo)(() => graph ? graph.actions(actionGroup) : [], [
132
- actionGroup,
133
- graph
226
+ var MenuSeparatorType = "@dxos/react-ui-toolbar/separator";
227
+ var isSeparator = (node) => node.type === MenuSeparatorType;
228
+ var isMenuGroup = (node) => node.type === import_app_graph2.ACTION_GROUP_TYPE;
229
+ var ActionToolbarItem = ({ action, __menuScope }) => {
230
+ const { onAction, iconSize } = useMenu("ActionToolbarItem", __menuScope);
231
+ const handleClick = (0, import_react4.useCallback)(() => {
232
+ onAction?.(action);
233
+ }, [
234
+ action,
235
+ onAction
134
236
  ]);
135
- const { icon, iconOnly = true, disabled, testId } = actionGroup.properties;
237
+ const { icon, iconOnly = true, disabled, testId, hidden, classNames } = action.properties;
238
+ const Root = icon ? import_react_ui3.Toolbar.IconButton : import_react_ui3.Toolbar.Button;
239
+ const rootProps = icon ? {
240
+ icon,
241
+ size: iconSize,
242
+ iconOnly,
243
+ label: /* @__PURE__ */ import_react4.default.createElement(ActionLabel, {
244
+ action
245
+ })
246
+ } : {
247
+ children: /* @__PURE__ */ import_react4.default.createElement(ActionLabel, {
248
+ action
249
+ })
250
+ };
251
+ return hidden ? null : /* @__PURE__ */ import_react4.default.createElement(Root, {
252
+ key: action.id,
253
+ disabled,
254
+ onClick: handleClick,
255
+ variant: "ghost",
256
+ ...testId && {
257
+ "data-testid": testId
258
+ },
259
+ ...rootProps,
260
+ classNames
261
+ });
262
+ };
263
+ var DropdownMenuToolbarItem = ({ group, items: propsItems, __menuScope }) => {
264
+ const { iconOnly, disabled, testId } = group.properties;
136
265
  const suppressNextTooltip = (0, import_react4.useRef)(false);
266
+ const { iconSize } = useMenu("DropdownMenuToolbarItem", __menuScope);
267
+ const items = useMenuItems(group, propsItems, "DropdownMenuToolbarItem", __menuScope);
268
+ const activeItem = items?.find((item) => !!item.properties.checked);
269
+ const icon = group.properties.applyActive && // TODO(thure): Handle other menu item types.
270
+ activeItem?.properties.icon || group.properties.icon;
271
+ const Root = icon ? import_react_ui3.Toolbar.IconButton : import_react_ui3.Toolbar.Button;
272
+ const label = /* @__PURE__ */ import_react4.default.createElement(ActionLabel, {
273
+ action: group.properties.applyActive && activeItem ? activeItem : group
274
+ });
275
+ const rootProps = icon ? {
276
+ icon,
277
+ size: iconSize,
278
+ iconOnly,
279
+ label,
280
+ caretDown: true,
281
+ suppressNextTooltip
282
+ } : {
283
+ children: /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null, label, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Icon, {
284
+ size: 3,
285
+ icon: "ph--caret-down--bold",
286
+ classNames: "mis-1"
287
+ }))
288
+ };
137
289
  return /* @__PURE__ */ import_react4.default.createElement(DropdownMenu.Root, {
138
- actions: menuActions,
139
- onAction,
290
+ group,
291
+ items,
140
292
  suppressNextTooltip
141
293
  }, /* @__PURE__ */ import_react4.default.createElement(DropdownMenu.Trigger, {
142
294
  asChild: true
143
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui4.Toolbar.IconButton, {
144
- size: 5,
295
+ }, /* @__PURE__ */ import_react4.default.createElement(Root, {
145
296
  variant: "ghost",
146
- iconOnly,
147
297
  disabled,
148
- icon: applyActiveIcon && menuActions.find((action) => !!action.properties.checked)?.properties.icon || icon,
149
- label: /* @__PURE__ */ import_react4.default.createElement(ActionLabel, {
150
- action: actionGroup
151
- }),
298
+ ...rootProps,
152
299
  ...testId && {
153
300
  "data-testid": testId
154
- },
155
- suppressNextTooltip,
156
- caretDown: true
301
+ }
157
302
  })));
158
303
  };
159
- var ToolbarToggleGroupItem = ({ action }) => {
160
- const { icon, iconOnly, disabled } = action.properties;
161
- return /* @__PURE__ */ import_react5.default.createElement(import_react_ui5.Toolbar.ToggleGroupIconItem, {
162
- key: action.id,
163
- value: action.id,
164
- icon,
165
- iconOnly,
166
- disabled,
167
- label: /* @__PURE__ */ import_react5.default.createElement(ActionLabel, {
168
- action
169
- })
170
- });
171
- };
172
- var ToolbarToggleGroup = ({ actionGroup, graph }) => {
173
- const menuActions = (0, import_react5.useMemo)(() => graph ? graph.actions(actionGroup) : [], [
174
- actionGroup,
175
- graph
176
- ]);
177
- const { selectCardinality, value } = actionGroup.properties;
178
- return (
179
- // TODO(thure): This is extremely difficult to manage, what do?
180
- // @ts-ignore
181
- /* @__PURE__ */ import_react5.default.createElement(import_react_ui5.Toolbar.ToggleGroup, {
182
- type: selectCardinality,
183
- value
184
- }, menuActions.map((action) => /* @__PURE__ */ import_react5.default.createElement(ToolbarToggleGroupItem, {
185
- key: action.id,
186
- action
187
- })))
188
- );
189
- };
190
- var ToolbarSeparatorType = "@dxos/react-ui-toolbar/separator";
191
- var isSeparator = (node) => node.type === ToolbarSeparatorType;
192
- var isMenu = (node) => node.type === import_app_graph.ACTION_GROUP_TYPE;
193
- var ToolbarItem = ({ iconSize, action, onAction }) => {
194
- const handleClick = (0, import_react3.useCallback)(() => {
304
+ var ToggleGroupItem = ({ action, __menuScope }) => {
305
+ const { iconSize, onAction } = useMenu("ToggleGroupItem", __menuScope);
306
+ const { icon, iconOnly = true, disabled, testId, hidden, classNames } = action.properties;
307
+ const handleClick = (0, import_react4.useCallback)(() => {
195
308
  onAction?.(action);
196
309
  }, [
197
310
  action,
198
311
  onAction
199
312
  ]);
200
- const { icon, iconOnly = true, disabled, testId } = action.properties;
201
- return /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Toolbar.IconButton, {
202
- key: action.id,
203
- iconOnly,
204
- variant: "ghost",
313
+ const Root = icon ? import_react_ui3.Toolbar.ToggleGroupIconItem : import_react_ui3.Toolbar.ToggleGroupItem;
314
+ const rootProps = icon ? {
205
315
  icon,
206
316
  size: iconSize,
207
- label: /* @__PURE__ */ import_react3.default.createElement(ActionLabel, {
317
+ iconOnly,
318
+ label: /* @__PURE__ */ import_react4.default.createElement(ActionLabel, {
319
+ action
320
+ })
321
+ } : {
322
+ children: /* @__PURE__ */ import_react4.default.createElement(ActionLabel, {
208
323
  action
209
- }),
324
+ })
325
+ };
326
+ return hidden ? null : /* @__PURE__ */ import_react4.default.createElement(Root, {
327
+ key: action.id,
328
+ value: action.id,
210
329
  disabled,
211
330
  onClick: handleClick,
331
+ variant: "ghost",
212
332
  ...testId && {
213
333
  "data-testid": testId
214
- }
334
+ },
335
+ ...rootProps,
336
+ classNames
215
337
  });
216
338
  };
217
- var Toolbar = ({ actions: items, onAction, iconSize = 5, graph, ...props }) => {
218
- return /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Toolbar.Root, props, items?.map((item, i) => isSeparator(item) ? /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Toolbar.Separator, {
339
+ var ToggleGroupToolbarItem = ({ group, items: propsItems, __menuScope }) => {
340
+ const items = useMenuItems(group, propsItems, "ToggleGroupToolbarItem", __menuScope);
341
+ const { selectCardinality, value } = group.properties;
342
+ return (
343
+ // TODO(thure): The type here is difficult to manage, what do?
344
+ // @ts-ignore
345
+ /* @__PURE__ */ import_react4.default.createElement(
346
+ import_react_ui3.Toolbar.ToggleGroup,
347
+ {
348
+ type: selectCardinality,
349
+ value
350
+ },
351
+ // TODO(thure): Handle other menu item types.
352
+ items.map((action) => /* @__PURE__ */ import_react4.default.createElement(ToggleGroupItem, {
353
+ key: action.id,
354
+ action
355
+ }))
356
+ )
357
+ );
358
+ };
359
+ var ToolbarMenu = ({ __menuScope, classNames, ...props }) => {
360
+ const items = useMenuItems(void 0, void 0, "ToolbarMenu", __menuScope);
361
+ const { attendableId } = useMenu("ToolbarMenu", __menuScope);
362
+ const { hasAttention } = (0, import_react_ui_attention.useAttention)(attendableId);
363
+ return /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Toolbar.Root, {
364
+ ...props,
365
+ classNames: [
366
+ "p-0 pointer-fine:p-1 attention-surface",
367
+ !hasAttention && "opacity-20",
368
+ classNames
369
+ ]
370
+ }, items?.map((item, i) => isSeparator(item) ? /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Toolbar.Separator, {
219
371
  key: i,
220
372
  variant: item.properties.variant
221
- }) : isMenu(item) ? item.properties.variant === "dropdownMenu" ? /* @__PURE__ */ import_react3.default.createElement(ToolbarDropdownMenu, {
222
- key: item.id,
223
- actionGroup: item,
224
- onAction,
225
- iconSize,
226
- graph
227
- }) : /* @__PURE__ */ import_react3.default.createElement(ToolbarToggleGroup, {
228
- key: item.id,
229
- actionGroup: item,
230
- onAction,
231
- iconSize,
373
+ }) : isMenuGroup(item) ? item.properties.variant === "dropdownMenu" ? (
374
+ // TODO(thure): Figure out type narrowing that doesn’t require so much use of `as`.
375
+ /* @__PURE__ */ import_react4.default.createElement(DropdownMenuToolbarItem, {
376
+ key: item.id,
377
+ group: item
378
+ })
379
+ ) : (
380
+ // TODO(thure): Figure out type narrowing that doesn’t require so much use of `as`.
381
+ /* @__PURE__ */ import_react4.default.createElement(ToggleGroupToolbarItem, {
382
+ key: item.id,
383
+ group: item
384
+ })
385
+ ) : (
386
+ // TODO(thure): Figure out type narrowing that doesn’t require so much use of `as`.
387
+ /* @__PURE__ */ import_react4.default.createElement(ActionToolbarItem, {
388
+ key: item.id,
389
+ action: item
390
+ })
391
+ )));
392
+ };
393
+ var edgesArrayToRecord = (edges) => {
394
+ return Object.fromEntries(Object.entries(edges.reduce((acc, { source, target }) => {
395
+ if (!acc[source]) {
396
+ acc[source] = {
397
+ inbound: [],
398
+ outbound: []
399
+ };
400
+ }
401
+ if (!acc[target]) {
402
+ acc[target] = {
403
+ inbound: [],
404
+ outbound: []
405
+ };
406
+ }
407
+ const sourceEdges = acc[source];
408
+ if (!sourceEdges.outbound.includes(target)) {
409
+ sourceEdges.outbound.push(target);
410
+ }
411
+ const targetEdges = acc[target];
412
+ if (!targetEdges.inbound.includes(source)) {
413
+ targetEdges.inbound.push(source);
414
+ }
415
+ return acc;
416
+ }, {})).map(([id, { outbound }]) => [
417
+ id,
418
+ outbound
419
+ ]));
420
+ };
421
+ var useMenuActions = (actionCreator) => {
422
+ const initialMenuGraphProps = actionCreator();
423
+ const [graph] = (0, import_react5.useState)(new import_app_graph3.Graph({
424
+ nodes: initialMenuGraphProps.nodes,
425
+ edges: edgesArrayToRecord(initialMenuGraphProps.edges)
426
+ }));
427
+ (0, import_signals_react.useSignalEffect)(() => {
428
+ const menuGraphProps = actionCreator();
429
+ graph._addNodes(menuGraphProps.nodes);
430
+ graph._addEdges(menuGraphProps.edges);
431
+ });
432
+ const resolveGroupItems = (0, import_react5.useCallback)((sourceNode = graph.root) => {
433
+ if (graph) {
434
+ return graph.nodes(sourceNode, {
435
+ filter: (n) => true
436
+ }) || null;
437
+ } else {
438
+ return null;
439
+ }
440
+ }, [
232
441
  graph
233
- }) : /* @__PURE__ */ import_react3.default.createElement(ToolbarItem, {
234
- key: item.id,
235
- action: item,
236
- onAction,
237
- iconSize
238
- })));
442
+ ]);
443
+ return {
444
+ resolveGroupItems
445
+ };
239
446
  };
240
447
  // Annotate the CommonJS export names for ESM import in node:
241
448
  0 && (module.exports = {
242
449
  DropdownMenu,
243
- Toolbar,
244
- ToolbarSeparatorType,
245
- isMenu,
246
- isSeparator
450
+ MenuProvider,
451
+ MenuSeparatorType,
452
+ ToolbarMenu,
453
+ createGapSeparator,
454
+ createLineSeparator,
455
+ createMenuAction,
456
+ createMenuItemGroup,
457
+ createMenuScope,
458
+ isMenuGroup,
459
+ isSeparator,
460
+ menuContextDefaults,
461
+ useMenu,
462
+ useMenuActions,
463
+ useMenuItems
247
464
  });
248
465
  //# sourceMappingURL=index.cjs.map