@dxos/react-ui-menu 0.8.2-main.fbd8ed0 → 0.8.2-staging.4d6ad0f
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.
- package/dist/lib/browser/index.mjs +271 -230
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +277 -237
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +271 -230
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/components/DropdownMenu.d.ts +2 -3
- package/dist/types/src/components/DropdownMenu.d.ts.map +1 -1
- package/dist/types/src/components/ToolbarMenu.d.ts.map +1 -1
- package/dist/types/src/hooks/useMenuActions.d.ts +2 -1
- package/dist/types/src/hooks/useMenuActions.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/testing/generator.d.ts +2 -1
- package/dist/types/src/testing/generator.d.ts.map +1 -1
- package/package.json +14 -13
- package/src/components/DropdownMenu.tsx +3 -19
- package/src/components/ToolbarMenu.tsx +4 -5
- package/src/hooks/useMenuActions.ts +8 -11
- package/src/index.ts +2 -0
- package/src/testing/generator.ts +4 -3
package/dist/lib/node/index.cjs
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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:
|
|
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:
|
|
91
|
+
type: import_app_graph2.ACTION_GROUP_TYPE,
|
|
87
92
|
properties,
|
|
88
|
-
data:
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
|
|
166
|
-
|
|
167
|
-
action
|
|
168
|
-
onClick
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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,
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
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
|
-
|
|
206
|
-
|
|
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
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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 ===
|
|
248
|
+
var isMenuGroup = (node) => node.type === import_app_graph3.ACTION_GROUP_TYPE;
|
|
233
249
|
var ActionToolbarItem = ({ action, __menuScope }) => {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
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
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
icon
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
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
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
icon
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
"
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
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
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
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
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
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 = (
|
|
457
|
+
var useMenuActions = (props) => {
|
|
420
458
|
const registry = (0, import_react5.useContext)(import_rx_react.RegistryContext);
|
|
421
|
-
const
|
|
422
|
-
const [graph] = (0, import_react5.useState)(new
|
|
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:
|
|
425
|
-
edges: edgesArrayToRecord(
|
|
462
|
+
nodes: menuGraphProps.nodes,
|
|
463
|
+
edges: edgesArrayToRecord(menuGraphProps.edges)
|
|
426
464
|
}));
|
|
427
|
-
(0,
|
|
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 ||
|
|
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
|