@dxos/react-ui-menu 0.8.2-main.fbd8ed0 → 0.8.2-staging.42af850

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.
@@ -40,30 +40,35 @@ __export(node_exports, {
40
40
  isMenuGroup: () => isMenuGroup,
41
41
  isSeparator: () => isSeparator,
42
42
  menuContextDefaults: () => menuContextDefaults,
43
+ rxFromSignal: () => import_app_graph.rxFromSignal,
43
44
  useMenu: () => useMenu,
44
45
  useMenuActions: () => useMenuActions,
45
46
  useMenuItems: () => useMenuItems
46
47
  });
47
48
  module.exports = __toCommonJS(node_exports);
49
+ var import_app_graph = require("@dxos/app-graph");
50
+ var import_tracking = require("@preact-signals/safe-react/tracking");
48
51
  var import_react_use_controllable_state = require("@radix-ui/react-use-controllable-state");
49
52
  var import_react = __toESM(require("react"));
50
53
  var import_react_ui = require("@dxos/react-ui");
54
+ var import_tracking2 = require("@preact-signals/safe-react/tracking");
51
55
  var import_react2 = __toESM(require("react"));
52
56
  var import_keyboard = require("@dxos/keyboard");
53
57
  var import_react_ui2 = require("@dxos/react-ui");
54
58
  var import_react_ui_theme = require("@dxos/react-ui-theme");
55
- var import_app_graph = require("@dxos/app-graph");
59
+ var import_app_graph2 = require("@dxos/app-graph");
56
60
  var import_util = require("@dxos/util");
61
+ var import_tracking3 = require("@preact-signals/safe-react/tracking");
57
62
  var import_react_context = require("@radix-ui/react-context");
58
63
  var import_react3 = __toESM(require("react"));
64
+ var import_tracking4 = require("@preact-signals/safe-react/tracking");
59
65
  var import_react4 = __toESM(require("react"));
60
66
  var import_react_ui3 = require("@dxos/react-ui");
61
67
  var import_react_ui_attention = require("@dxos/react-ui-attention");
62
- var import_app_graph2 = require("@dxos/app-graph");
68
+ var import_app_graph3 = require("@dxos/app-graph");
63
69
  var import_rx_react = require("@effect-rx/rx-react");
64
- var import_signals_react = require("@preact/signals-react");
65
70
  var import_react5 = require("react");
66
- var import_app_graph3 = require("@dxos/app-graph");
71
+ var import_app_graph4 = require("@dxos/app-graph");
67
72
  var translationKey = "menus";
68
73
  var translations_default = [
69
74
  {
@@ -77,15 +82,15 @@ var getShortcut = (action) => {
77
82
  };
78
83
  var createMenuAction = (id, invoke, properties) => ({
79
84
  id,
80
- type: import_app_graph.ACTION_TYPE,
85
+ type: import_app_graph2.ACTION_TYPE,
81
86
  properties,
82
87
  data: invoke
83
88
  });
84
89
  var createMenuItemGroup = (id, properties) => ({
85
90
  id,
86
- type: import_app_graph.ACTION_GROUP_TYPE,
91
+ type: import_app_graph2.ACTION_GROUP_TYPE,
87
92
  properties,
88
- data: import_app_graph.actionGroupSymbol
93
+ data: import_app_graph2.actionGroupSymbol
89
94
  });
90
95
  var createGapSeparator = (id = "gap", source = "root") => ({
91
96
  nodes: [
@@ -124,13 +129,18 @@ var createLineSeparator = (id = "line", source = "root") => ({
124
129
  ]
125
130
  });
126
131
  var ActionLabel = ({ action }) => {
127
- const shortcut = getShortcut(action);
128
- const { t } = (0, import_react_ui2.useTranslation)(translationKey);
129
- return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement("span", {
130
- className: "grow truncate"
131
- }, (0, import_react_ui2.toLocalizedString)(action.properties.label, t)), shortcut && /* @__PURE__ */ import_react2.default.createElement("span", {
132
- className: (0, import_react_ui_theme.mx)("shrink-0", import_react_ui_theme.descriptionText)
133
- }, (0, import_keyboard.keySymbols)(shortcut).join("")));
132
+ var _effect = (0, import_tracking2.useSignals)();
133
+ try {
134
+ const shortcut = getShortcut(action);
135
+ const { t } = (0, import_react_ui2.useTranslation)(translationKey);
136
+ return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement("span", {
137
+ className: "grow truncate"
138
+ }, (0, import_react_ui2.toLocalizedString)(action.properties.label, t)), shortcut && /* @__PURE__ */ import_react2.default.createElement("span", {
139
+ className: (0, import_react_ui_theme.mx)("shrink-0", import_react_ui_theme.descriptionText)
140
+ }, (0, import_keyboard.keySymbols)(shortcut).join("")));
141
+ } finally {
142
+ _effect.f();
143
+ }
134
144
  };
135
145
  var actionLabel = (action, t) => {
136
146
  const shortcut = getShortcut(action);
@@ -145,13 +155,18 @@ var menuContextDefaults = {
145
155
  };
146
156
  var useMenuScope = createMenuScope();
147
157
  var MenuProvider = ({ children, useGroupItems = menuContextDefaults.useGroupItems, iconSize = menuContextDefaults.iconSize, attendableId }) => {
148
- const { scope } = useMenuScope(void 0);
149
- return /* @__PURE__ */ import_react3.default.createElement(MenuContextProvider, {
150
- useGroupItems,
151
- iconSize,
152
- attendableId,
153
- scope
154
- }, children);
158
+ var _effect = (0, import_tracking3.useSignals)();
159
+ try {
160
+ const { scope } = useMenuScope(void 0);
161
+ return /* @__PURE__ */ import_react3.default.createElement(MenuContextProvider, {
162
+ useGroupItems,
163
+ iconSize,
164
+ attendableId,
165
+ scope
166
+ }, children);
167
+ } finally {
168
+ _effect.f();
169
+ }
155
170
  };
156
171
  var useMenuItems = (group, propsItems, consumerName = "useMenuItemConsumer", __menuScope) => {
157
172
  const { useGroupItems } = useMenu(consumerName, __menuScope);
@@ -162,65 +177,66 @@ var useMenuItems = (group, propsItems, consumerName = "useMenuItemConsumer", __m
162
177
  ]);
163
178
  };
164
179
  var DropdownMenuItem = ({ item, onClick, __menuScope }) => {
165
- const action = item;
166
- const handleClick = (0, import_react.useCallback)((event) => onClick(action, event), [
167
- action,
168
- onClick
169
- ]);
170
- const { iconSize } = useMenu("DropdownMenuItem", __menuScope);
171
- return /* @__PURE__ */ import_react.default.createElement(import_react_ui.DropdownMenu.Item, {
172
- onClick: handleClick,
173
- classNames: "gap-2",
174
- disabled: action.properties?.disabled,
175
- ...action.properties?.testId && {
176
- "data-testid": action.properties.testId
177
- }
178
- }, action.properties?.icon && /* @__PURE__ */ import_react.default.createElement(import_react_ui.Icon, {
179
- icon: action.properties.icon,
180
- size: iconSize
181
- }), /* @__PURE__ */ import_react.default.createElement(ActionLabel, {
182
- action
183
- }));
180
+ var _effect = (0, import_tracking.useSignals)();
181
+ try {
182
+ const action = item;
183
+ const handleClick = (0, import_react.useCallback)((event) => onClick(action, event), [
184
+ action,
185
+ onClick
186
+ ]);
187
+ const { iconSize } = useMenu("DropdownMenuItem", __menuScope);
188
+ return /* @__PURE__ */ import_react.default.createElement(import_react_ui.DropdownMenu.Item, {
189
+ onClick: handleClick,
190
+ classNames: "gap-2",
191
+ disabled: action.properties?.disabled,
192
+ ...action.properties?.testId && {
193
+ "data-testid": action.properties.testId
194
+ }
195
+ }, action.properties?.icon && /* @__PURE__ */ import_react.default.createElement(import_react_ui.Icon, {
196
+ icon: action.properties.icon,
197
+ size: iconSize
198
+ }), /* @__PURE__ */ import_react.default.createElement(ActionLabel, {
199
+ action
200
+ }));
201
+ } finally {
202
+ _effect.f();
203
+ }
184
204
  };
185
- var DropdownMenuRoot = ({ items: propsItems, group, open, defaultOpen, onOpenChange, suppressNextTooltip, caller, children, __menuScope, ...naturalProps }) => {
186
- const [optionsMenuOpen, setOptionsMenuOpen] = (0, import_react_use_controllable_state.useControllableState)({
187
- prop: open,
188
- defaultProp: defaultOpen,
189
- onChange: onOpenChange
190
- });
191
- const handleActionClick = (0, import_react.useCallback)((action, event) => {
192
- if (action.properties?.disabled) {
193
- return;
194
- }
195
- event.stopPropagation();
196
- if (suppressNextTooltip) {
197
- suppressNextTooltip.current = true;
198
- }
199
- setOptionsMenuOpen(false);
200
- void action.data?.({
201
- parent: group,
202
- caller
205
+ var DropdownMenuRoot = ({ items: propsItems, group, open, defaultOpen, onOpenChange, caller, children, __menuScope, ...naturalProps }) => {
206
+ var _effect = (0, import_tracking.useSignals)();
207
+ try {
208
+ const [optionsMenuOpen, setOptionsMenuOpen] = (0, import_react_use_controllable_state.useControllableState)({
209
+ prop: open,
210
+ defaultProp: defaultOpen,
211
+ onChange: onOpenChange
203
212
  });
204
- }, [
205
- suppressNextTooltip,
206
- group,
207
- caller
208
- ]);
209
- const items = useMenuItems(group, propsItems);
210
- return /* @__PURE__ */ import_react.default.createElement(import_react_ui.DropdownMenu.Root, {
211
- open: optionsMenuOpen,
212
- onOpenChange: (nextOpen) => {
213
- if (!nextOpen && suppressNextTooltip) {
214
- suppressNextTooltip.current = true;
213
+ const handleActionClick = (0, import_react.useCallback)((action, event) => {
214
+ if (action.properties?.disabled) {
215
+ return;
215
216
  }
216
- return setOptionsMenuOpen(nextOpen);
217
- },
218
- ...naturalProps
219
- }, 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, {
220
- key: item.id,
221
- item,
222
- onClick: handleActionClick
223
- }))), /* @__PURE__ */ import_react.default.createElement(import_react_ui.DropdownMenu.Arrow, null))));
217
+ event.stopPropagation();
218
+ setOptionsMenuOpen(false);
219
+ void action.data?.({
220
+ parent: group,
221
+ caller
222
+ });
223
+ }, [
224
+ group,
225
+ caller
226
+ ]);
227
+ const items = useMenuItems(group, propsItems);
228
+ return /* @__PURE__ */ import_react.default.createElement(import_react_ui.DropdownMenu.Root, {
229
+ open: optionsMenuOpen,
230
+ onOpenChange: setOptionsMenuOpen,
231
+ ...naturalProps
232
+ }, 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, {
233
+ key: item.id,
234
+ item,
235
+ onClick: handleActionClick
236
+ }))), /* @__PURE__ */ import_react.default.createElement(import_react_ui.DropdownMenu.Arrow, null))));
237
+ } finally {
238
+ _effect.f();
239
+ }
224
240
  };
225
241
  var DropdownMenu = {
226
242
  Root: DropdownMenuRoot,
@@ -229,167 +245,189 @@ var DropdownMenu = {
229
245
  };
230
246
  var MenuSeparatorType = "@dxos/react-ui-toolbar/separator";
231
247
  var isSeparator = (node) => node.type === MenuSeparatorType;
232
- var isMenuGroup = (node) => node.type === import_app_graph2.ACTION_GROUP_TYPE;
248
+ var isMenuGroup = (node) => node.type === import_app_graph3.ACTION_GROUP_TYPE;
233
249
  var ActionToolbarItem = ({ action, __menuScope }) => {
234
- const { iconSize } = useMenu("ActionToolbarItem", __menuScope);
235
- const { t } = (0, import_react_ui3.useTranslation)(translationKey);
236
- const handleClick = (0, import_react4.useCallback)(() => action.data?.(), [
237
- action
238
- ]);
239
- const { icon, iconOnly = true, disabled, testId, hidden, classNames } = action.properties;
240
- const Root = icon ? import_react_ui3.Toolbar.IconButton : import_react_ui3.Toolbar.Button;
241
- const rootProps = icon ? {
242
- icon,
243
- size: iconSize,
244
- iconOnly,
245
- label: actionLabel(action, t)
246
- } : {
247
- children: /* @__PURE__ */ import_react4.default.createElement(ActionLabel, {
250
+ var _effect = (0, import_tracking4.useSignals)();
251
+ try {
252
+ const { iconSize } = useMenu("ActionToolbarItem", __menuScope);
253
+ const { t } = (0, import_react_ui3.useTranslation)(translationKey);
254
+ const handleClick = (0, import_react4.useCallback)(() => action.data?.(), [
248
255
  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
- });
256
+ ]);
257
+ const { icon, iconOnly = true, disabled, testId, hidden, classNames } = action.properties;
258
+ const Root = icon ? import_react_ui3.Toolbar.IconButton : import_react_ui3.Toolbar.Button;
259
+ const rootProps = icon ? {
260
+ icon,
261
+ size: iconSize,
262
+ iconOnly,
263
+ label: actionLabel(action, t)
264
+ } : {
265
+ children: /* @__PURE__ */ import_react4.default.createElement(ActionLabel, {
266
+ action
267
+ })
268
+ };
269
+ return hidden ? null : /* @__PURE__ */ import_react4.default.createElement(Root, {
270
+ key: action.id,
271
+ disabled,
272
+ onClick: handleClick,
273
+ variant: "ghost",
274
+ ...testId && {
275
+ "data-testid": testId
276
+ },
277
+ ...rootProps,
278
+ classNames
279
+ });
280
+ } finally {
281
+ _effect.f();
282
+ }
262
283
  };
263
284
  var DropdownMenuToolbarItem = ({ group, items: propsItems, __menuScope }) => {
264
- const { iconOnly, disabled, testId } = group.properties;
265
- const suppressNextTooltip = (0, import_react4.useRef)(false);
266
- const { t } = (0, import_react_ui3.useTranslation)(translationKey);
267
- const { iconSize } = useMenu("DropdownMenuToolbarItem", __menuScope);
268
- const items = useMenuItems(group, propsItems, "DropdownMenuToolbarItem", __menuScope);
269
- const activeItem = items?.find((item) => !!item.properties.checked);
270
- const icon = group.properties.applyActive && // TODO(thure): Handle other menu item types.
271
- activeItem?.properties.icon || group.properties.icon;
272
- const Root = icon ? import_react_ui3.Toolbar.IconButton : import_react_ui3.Toolbar.Button;
273
- const labelAction = group.properties.applyActive && activeItem ? activeItem : group;
274
- const rootProps = icon ? {
275
- icon,
276
- size: iconSize,
277
- iconOnly,
278
- label: actionLabel(labelAction, t),
279
- caretDown: true,
280
- suppressNextTooltip
281
- } : {
282
- children: /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null, /* @__PURE__ */ import_react4.default.createElement(ActionLabel, {
283
- action: labelAction
284
- }), /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Icon, {
285
- size: 3,
286
- icon: "ph--caret-down--bold",
287
- classNames: "mis-1"
288
- }))
289
- };
290
- return /* @__PURE__ */ import_react4.default.createElement(DropdownMenu.Root, {
291
- group,
292
- items,
293
- suppressNextTooltip
294
- }, /* @__PURE__ */ import_react4.default.createElement(DropdownMenu.Trigger, {
295
- asChild: true
296
- }, /* @__PURE__ */ import_react4.default.createElement(Root, {
297
- variant: "ghost",
298
- disabled,
299
- ...rootProps,
300
- ...testId && {
301
- "data-testid": testId
302
- }
303
- })));
285
+ var _effect = (0, import_tracking4.useSignals)();
286
+ try {
287
+ const { iconOnly, disabled, testId } = group.properties;
288
+ const { t } = (0, import_react_ui3.useTranslation)(translationKey);
289
+ const { iconSize } = useMenu("DropdownMenuToolbarItem", __menuScope);
290
+ const items = useMenuItems(group, propsItems, "DropdownMenuToolbarItem", __menuScope);
291
+ const activeItem = items?.find((item) => !!item.properties.checked);
292
+ const icon = group.properties.applyActive && // TODO(thure): Handle other menu item types.
293
+ activeItem?.properties.icon || group.properties.icon;
294
+ const Root = icon ? import_react_ui3.Toolbar.IconButton : import_react_ui3.Toolbar.Button;
295
+ const labelAction = group.properties.applyActive && activeItem ? activeItem : group;
296
+ const rootProps = icon ? {
297
+ icon,
298
+ size: iconSize,
299
+ iconOnly,
300
+ label: actionLabel(labelAction, t),
301
+ caretDown: true
302
+ } : {
303
+ children: /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null, /* @__PURE__ */ import_react4.default.createElement(ActionLabel, {
304
+ action: labelAction
305
+ }), /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Icon, {
306
+ size: 3,
307
+ icon: "ph--caret-down--bold",
308
+ classNames: "mis-1"
309
+ }))
310
+ };
311
+ return /* @__PURE__ */ import_react4.default.createElement(DropdownMenu.Root, {
312
+ group,
313
+ items
314
+ }, /* @__PURE__ */ import_react4.default.createElement(DropdownMenu.Trigger, {
315
+ asChild: true
316
+ }, /* @__PURE__ */ import_react4.default.createElement(Root, {
317
+ variant: "ghost",
318
+ disabled,
319
+ ...rootProps,
320
+ ...testId && {
321
+ "data-testid": testId
322
+ }
323
+ })));
324
+ } finally {
325
+ _effect.f();
326
+ }
304
327
  };
305
328
  var ToggleGroupItem = ({ group, action, __menuScope }) => {
306
- const { iconSize } = useMenu("ToggleGroupItem", __menuScope);
307
- const { t } = (0, import_react_ui3.useTranslation)(translationKey);
308
- const { icon, iconOnly = true, disabled, testId, hidden, classNames } = action.properties;
309
- const handleClick = (0, import_react4.useCallback)(() => action.data?.({
310
- parent: group
311
- }), [
312
- action,
313
- group
314
- ]);
315
- const Root = icon ? import_react_ui3.Toolbar.ToggleGroupIconItem : import_react_ui3.Toolbar.ToggleGroupItem;
316
- const rootProps = icon ? {
317
- icon,
318
- size: iconSize,
319
- iconOnly,
320
- label: actionLabel(action, t)
321
- } : {
322
- children: /* @__PURE__ */ import_react4.default.createElement(ActionLabel, {
323
- action
324
- })
325
- };
326
- return hidden ? null : /* @__PURE__ */ import_react4.default.createElement(Root, {
327
- key: action.id,
328
- value: action.id,
329
- disabled,
330
- onClick: handleClick,
331
- variant: "ghost",
332
- ...testId && {
333
- "data-testid": testId
334
- },
335
- ...rootProps,
336
- classNames
337
- });
329
+ var _effect = (0, import_tracking4.useSignals)();
330
+ try {
331
+ const { iconSize } = useMenu("ToggleGroupItem", __menuScope);
332
+ const { t } = (0, import_react_ui3.useTranslation)(translationKey);
333
+ const { icon, iconOnly = true, disabled, testId, hidden, classNames } = action.properties;
334
+ const handleClick = (0, import_react4.useCallback)(() => action.data?.({
335
+ parent: group
336
+ }), [
337
+ action,
338
+ group
339
+ ]);
340
+ const Root = icon ? import_react_ui3.Toolbar.ToggleGroupIconItem : import_react_ui3.Toolbar.ToggleGroupItem;
341
+ const rootProps = icon ? {
342
+ icon,
343
+ size: iconSize,
344
+ iconOnly,
345
+ label: actionLabel(action, t)
346
+ } : {
347
+ children: /* @__PURE__ */ import_react4.default.createElement(ActionLabel, {
348
+ action
349
+ })
350
+ };
351
+ return hidden ? null : /* @__PURE__ */ import_react4.default.createElement(Root, {
352
+ key: action.id,
353
+ value: action.id,
354
+ disabled,
355
+ onClick: handleClick,
356
+ variant: "ghost",
357
+ ...testId && {
358
+ "data-testid": testId
359
+ },
360
+ ...rootProps,
361
+ classNames
362
+ });
363
+ } finally {
364
+ _effect.f();
365
+ }
338
366
  };
339
367
  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
- group,
355
- action
356
- }))
357
- )
358
- );
368
+ var _effect = (0, import_tracking4.useSignals)();
369
+ try {
370
+ const items = useMenuItems(group, propsItems, "ToggleGroupToolbarItem", __menuScope);
371
+ const { selectCardinality, value } = group.properties;
372
+ return (
373
+ // TODO(thure): The type here is difficult to manage, what do?
374
+ // @ts-ignore
375
+ /* @__PURE__ */ import_react4.default.createElement(
376
+ import_react_ui3.Toolbar.ToggleGroup,
377
+ {
378
+ type: selectCardinality,
379
+ value
380
+ },
381
+ // TODO(thure): Handle other menu item types.
382
+ items.map((action) => /* @__PURE__ */ import_react4.default.createElement(ToggleGroupItem, {
383
+ key: action.id,
384
+ group,
385
+ action
386
+ }))
387
+ )
388
+ );
389
+ } finally {
390
+ _effect.f();
391
+ }
359
392
  };
360
393
  var ToolbarMenu = ({ __menuScope, classNames, ...props }) => {
361
- const items = useMenuItems(void 0, void 0, "ToolbarMenu", __menuScope);
362
- const { attendableId } = useMenu("ToolbarMenu", __menuScope);
363
- const { hasAttention } = (0, import_react_ui_attention.useAttention)(attendableId);
364
- return /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Toolbar.Root, {
365
- ...props,
366
- classNames: [
367
- "p-1",
368
- !hasAttention && "[&>*]:opacity-20 !bg-transparent",
369
- classNames
370
- ]
371
- }, items?.map((item, i) => isSeparator(item) ? /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Toolbar.Separator, {
372
- key: i,
373
- variant: item.properties.variant
374
- }) : isMenuGroup(item) ? item.properties.variant === "dropdownMenu" ? (
375
- // TODO(thure): Figure out type narrowing that doesn’t require so much use of `as`.
376
- /* @__PURE__ */ import_react4.default.createElement(DropdownMenuToolbarItem, {
377
- key: item.id,
378
- group: item
379
- })
380
- ) : (
381
- // TODO(thure): Figure out type narrowing that doesn’t require so much use of `as`.
382
- /* @__PURE__ */ import_react4.default.createElement(ToggleGroupToolbarItem, {
383
- key: item.id,
384
- group: item
385
- })
386
- ) : (
387
- // TODO(thure): Figure out type narrowing that doesn’t require so much use of `as`.
388
- /* @__PURE__ */ import_react4.default.createElement(ActionToolbarItem, {
389
- key: item.id,
390
- action: item
391
- })
392
- )));
394
+ var _effect = (0, import_tracking4.useSignals)();
395
+ try {
396
+ const items = useMenuItems(void 0, void 0, "ToolbarMenu", __menuScope);
397
+ const { attendableId } = useMenu("ToolbarMenu", __menuScope);
398
+ const { hasAttention } = (0, import_react_ui_attention.useAttention)(attendableId);
399
+ return /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Toolbar.Root, {
400
+ ...props,
401
+ classNames: [
402
+ "p-1",
403
+ attendableId && !hasAttention && "[&>*]:opacity-20 !bg-transparent",
404
+ classNames
405
+ ]
406
+ }, items?.map((item, i) => isSeparator(item) ? /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Toolbar.Separator, {
407
+ key: i,
408
+ variant: item.properties.variant
409
+ }) : isMenuGroup(item) ? item.properties.variant === "dropdownMenu" ? (
410
+ // TODO(thure): Figure out type narrowing that doesn’t require so much use of `as`.
411
+ /* @__PURE__ */ import_react4.default.createElement(DropdownMenuToolbarItem, {
412
+ key: item.id,
413
+ group: item
414
+ })
415
+ ) : (
416
+ // TODO(thure): Figure out type narrowing that doesn’t require so much use of `as`.
417
+ /* @__PURE__ */ import_react4.default.createElement(ToggleGroupToolbarItem, {
418
+ key: item.id,
419
+ group: item
420
+ })
421
+ ) : (
422
+ // TODO(thure): Figure out type narrowing that doesn’t require so much use of `as`.
423
+ /* @__PURE__ */ import_react4.default.createElement(ActionToolbarItem, {
424
+ key: item.id,
425
+ action: item
426
+ })
427
+ )));
428
+ } finally {
429
+ _effect.f();
430
+ }
393
431
  };
394
432
  var edgesArrayToRecord = (edges) => {
395
433
  return Object.fromEntries(Object.entries(edges.reduce((acc, { source, target }) => {
@@ -416,21 +454,22 @@ var edgesArrayToRecord = (edges) => {
416
454
  return acc;
417
455
  }, {})));
418
456
  };
419
- var useMenuActions = (actionCreator) => {
457
+ var useMenuActions = (props) => {
420
458
  const registry = (0, import_react5.useContext)(import_rx_react.RegistryContext);
421
- const initialMenuGraphProps = actionCreator();
422
- const [graph] = (0, import_react5.useState)(new import_app_graph3.Graph({
459
+ const menuGraphProps = (0, import_rx_react.useRxValue)(props);
460
+ const [graph] = (0, import_react5.useState)(new import_app_graph4.Graph({
423
461
  registry,
424
- nodes: initialMenuGraphProps.nodes,
425
- edges: edgesArrayToRecord(initialMenuGraphProps.edges)
462
+ nodes: menuGraphProps.nodes,
463
+ edges: edgesArrayToRecord(menuGraphProps.edges)
426
464
  }));
427
- (0, import_signals_react.useSignalEffect)(() => {
428
- const menuGraphProps = actionCreator();
465
+ (0, import_react5.useEffect)(() => {
429
466
  graph.addNodes(menuGraphProps.nodes);
430
467
  graph.addEdges(menuGraphProps.edges);
431
- });
468
+ }, [
469
+ menuGraphProps
470
+ ]);
432
471
  const useGroupItems = (0, import_react5.useCallback)((sourceNode) => {
433
- const items = (0, import_rx_react.useRxValue)(graph.connections(sourceNode?.id || import_app_graph3.ROOT_ID));
472
+ const items = (0, import_rx_react.useRxValue)(graph.connections(sourceNode?.id || import_app_graph4.ROOT_ID));
434
473
  return items;
435
474
  }, [
436
475
  graph
@@ -453,6 +492,7 @@ var useMenuActions = (actionCreator) => {
453
492
  isMenuGroup,
454
493
  isSeparator,
455
494
  menuContextDefaults,
495
+ rxFromSignal,
456
496
  useMenu,
457
497
  useMenuActions,
458
498
  useMenuItems