@dxos/react-ui-menu 0.8.2-staging.7ac8446 → 0.8.3-main.672df60
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 +298 -262
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +299 -264
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +298 -262
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/components/ActionLabel.d.ts +8 -4
- package/dist/types/src/components/ActionLabel.d.ts.map +1 -1
- package/dist/types/src/components/DropdownMenu.d.ts +4 -4
- package/dist/types/src/components/DropdownMenu.d.ts.map +1 -1
- package/dist/types/src/components/MenuContext.d.ts +4 -13
- package/dist/types/src/components/MenuContext.d.ts.map +1 -1
- package/dist/types/src/{testing → components}/Menus.stories.d.ts +1 -1
- package/dist/types/src/components/Menus.stories.d.ts.map +1 -0
- package/dist/types/src/components/ToolbarMenu.d.ts +5 -1
- package/dist/types/src/components/ToolbarMenu.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +2 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -0
- package/dist/types/src/hooks/useMenuActions.d.ts +13 -0
- package/dist/types/src/hooks/useMenuActions.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +2 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/testing/generator.d.ts +27 -0
- package/dist/types/src/testing/generator.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +1 -25
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/{defs.d.ts → types.d.ts} +3 -5
- package/dist/types/src/types.d.ts.map +1 -0
- package/dist/types/src/util.d.ts +2 -2
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +20 -13
- package/src/components/ActionLabel.tsx +11 -8
- package/src/components/DropdownMenu.tsx +7 -23
- package/src/components/MenuContext.tsx +11 -26
- package/src/{testing → components}/Menus.stories.tsx +13 -13
- package/src/components/ToolbarMenu.tsx +29 -32
- package/src/hooks/index.ts +5 -0
- package/src/hooks/useMenuActions.ts +69 -0
- package/src/index.ts +3 -1
- package/src/testing/generator.ts +116 -0
- package/src/testing/index.ts +1 -107
- package/src/{defs.ts → types.ts} +2 -5
- package/src/util.ts +7 -7
- package/dist/types/src/defs.d.ts.map +0 -1
- package/dist/types/src/hooks.d.ts +0 -17
- package/dist/types/src/hooks.d.ts.map +0 -1
- package/dist/types/src/testing/Menus.stories.d.ts.map +0 -1
- package/src/hooks.ts +0 -72
package/dist/lib/node/index.cjs
CHANGED
|
@@ -40,29 +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 import_app_graph2 = require("@dxos/app-graph");
|
|
63
|
-
var import_signals_react = require("@preact/signals-react");
|
|
64
|
-
var import_react5 = require("react");
|
|
65
68
|
var import_app_graph3 = require("@dxos/app-graph");
|
|
69
|
+
var import_rx_react = require("@effect-rx/rx-react");
|
|
70
|
+
var import_react5 = require("react");
|
|
71
|
+
var import_app_graph4 = require("@dxos/app-graph");
|
|
66
72
|
var translationKey = "menus";
|
|
67
73
|
var translations_default = [
|
|
68
74
|
{
|
|
@@ -74,19 +80,17 @@ var translations_default = [
|
|
|
74
80
|
var getShortcut = (action) => {
|
|
75
81
|
return typeof action.properties?.keyBinding === "string" ? action.properties.keyBinding : action.properties?.keyBinding?.[(0, import_util.getHostPlatform)()];
|
|
76
82
|
};
|
|
77
|
-
var
|
|
78
|
-
};
|
|
79
|
-
var createMenuAction = (id, properties) => ({
|
|
83
|
+
var createMenuAction = (id, invoke, properties) => ({
|
|
80
84
|
id,
|
|
81
|
-
type:
|
|
85
|
+
type: import_app_graph2.ACTION_TYPE,
|
|
82
86
|
properties,
|
|
83
|
-
data:
|
|
87
|
+
data: invoke
|
|
84
88
|
});
|
|
85
89
|
var createMenuItemGroup = (id, properties) => ({
|
|
86
90
|
id,
|
|
87
|
-
type:
|
|
91
|
+
type: import_app_graph2.ACTION_GROUP_TYPE,
|
|
88
92
|
properties,
|
|
89
|
-
data:
|
|
93
|
+
data: import_app_graph2.actionGroupSymbol
|
|
90
94
|
});
|
|
91
95
|
var createGapSeparator = (id = "gap", source = "root") => ({
|
|
92
96
|
nodes: [
|
|
@@ -125,98 +129,114 @@ var createLineSeparator = (id = "line", source = "root") => ({
|
|
|
125
129
|
]
|
|
126
130
|
});
|
|
127
131
|
var ActionLabel = ({ action }) => {
|
|
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
|
+
}
|
|
144
|
+
};
|
|
145
|
+
var actionLabel = (action, t) => {
|
|
128
146
|
const shortcut = getShortcut(action);
|
|
129
|
-
|
|
130
|
-
return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement("span", {
|
|
131
|
-
className: "grow truncate"
|
|
132
|
-
}, (0, import_react_ui2.toLocalizedString)(action.properties.label, t)), shortcut && /* @__PURE__ */ import_react2.default.createElement("span", {
|
|
133
|
-
className: (0, import_react_ui_theme.mx)("shrink-0", import_react_ui_theme.descriptionText)
|
|
134
|
-
}, (0, import_keyboard.keySymbols)(shortcut).join("")));
|
|
147
|
+
return `${(0, import_react_ui2.toLocalizedString)(action.properties.label, t)}${shortcut ? ` (${(0, import_keyboard.keySymbols)(shortcut).join("")})` : ""}`;
|
|
135
148
|
};
|
|
136
149
|
var MENU_NAME = "GraphMenu";
|
|
137
150
|
var [createMenuContext, createMenuScope] = (0, import_react_context.createContextScope)(MENU_NAME, []);
|
|
138
151
|
var [MenuContextProvider, useMenu] = createMenuContext(MENU_NAME);
|
|
139
152
|
var menuContextDefaults = {
|
|
140
153
|
iconSize: 5,
|
|
141
|
-
|
|
142
|
-
},
|
|
143
|
-
resolveGroupItems: () => null
|
|
154
|
+
useGroupItems: () => null
|
|
144
155
|
};
|
|
145
156
|
var useMenuScope = createMenuScope();
|
|
146
|
-
var MenuProvider = ({ children,
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
157
|
+
var MenuProvider = ({ children, useGroupItems = menuContextDefaults.useGroupItems, iconSize = menuContextDefaults.iconSize, attendableId }) => {
|
|
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
|
-
const {
|
|
158
|
-
|
|
172
|
+
const { useGroupItems } = useMenu(consumerName, __menuScope);
|
|
173
|
+
const groupItems = useGroupItems(group);
|
|
174
|
+
return (0, import_react3.useMemo)(() => propsItems ?? groupItems ?? void 0, [
|
|
159
175
|
propsItems,
|
|
160
|
-
|
|
161
|
-
resolveGroupItems
|
|
176
|
+
groupItems
|
|
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
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
event.stopPropagation();
|
|
197
|
-
if (suppressNextTooltip) {
|
|
198
|
-
suppressNextTooltip.current = true;
|
|
199
|
-
}
|
|
200
|
-
setOptionsMenuOpen(false);
|
|
201
|
-
onAction?.(action);
|
|
202
|
-
}, [
|
|
203
|
-
onAction
|
|
204
|
-
]);
|
|
205
|
-
const items = useMenuItems(group, propsItems);
|
|
206
|
-
return /* @__PURE__ */ import_react.default.createElement(import_react_ui.DropdownMenu.Root, {
|
|
207
|
-
open: optionsMenuOpen,
|
|
208
|
-
onOpenChange: (nextOpen) => {
|
|
209
|
-
if (!nextOpen && suppressNextTooltip) {
|
|
210
|
-
suppressNextTooltip.current = true;
|
|
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
|
|
212
|
+
});
|
|
213
|
+
const handleActionClick = (0, import_react.useCallback)((action, event) => {
|
|
214
|
+
if (action.properties?.disabled) {
|
|
215
|
+
return;
|
|
211
216
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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
|
+
}
|
|
220
240
|
};
|
|
221
241
|
var DropdownMenu = {
|
|
222
242
|
Root: DropdownMenuRoot,
|
|
@@ -225,170 +245,189 @@ var DropdownMenu = {
|
|
|
225
245
|
};
|
|
226
246
|
var MenuSeparatorType = "@dxos/react-ui-toolbar/separator";
|
|
227
247
|
var isSeparator = (node) => node.type === MenuSeparatorType;
|
|
228
|
-
var isMenuGroup = (node) => node.type ===
|
|
248
|
+
var isMenuGroup = (node) => node.type === import_app_graph3.ACTION_GROUP_TYPE;
|
|
229
249
|
var ActionToolbarItem = ({ action, __menuScope }) => {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
action,
|
|
235
|
-
onAction
|
|
236
|
-
]);
|
|
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, {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
}
|
|
303
327
|
};
|
|
304
|
-
var ToggleGroupItem = ({ action, __menuScope }) => {
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
action
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
328
|
+
var ToggleGroupItem = ({ group, action, __menuScope }) => {
|
|
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
|
-
action
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
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
|
+
}
|
|
358
392
|
};
|
|
359
393
|
var ToolbarMenu = ({ __menuScope, classNames, ...props }) => {
|
|
360
|
-
|
|
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
|
-
|
|
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
|
+
}
|
|
392
431
|
};
|
|
393
432
|
var edgesArrayToRecord = (edges) => {
|
|
394
433
|
return Object.fromEntries(Object.entries(edges.reduce((acc, { source, target }) => {
|
|
@@ -413,35 +452,30 @@ var edgesArrayToRecord = (edges) => {
|
|
|
413
452
|
targetEdges.inbound.push(source);
|
|
414
453
|
}
|
|
415
454
|
return acc;
|
|
416
|
-
}, {}))
|
|
417
|
-
id,
|
|
418
|
-
outbound
|
|
419
|
-
]));
|
|
455
|
+
}, {})));
|
|
420
456
|
};
|
|
421
|
-
var useMenuActions = (
|
|
422
|
-
const
|
|
423
|
-
const
|
|
424
|
-
|
|
425
|
-
|
|
457
|
+
var useMenuActions = (props) => {
|
|
458
|
+
const registry = (0, import_react5.useContext)(import_rx_react.RegistryContext);
|
|
459
|
+
const menuGraphProps = (0, import_rx_react.useRxValue)(props);
|
|
460
|
+
const [graph] = (0, import_react5.useState)(new import_app_graph4.Graph({
|
|
461
|
+
registry,
|
|
462
|
+
nodes: menuGraphProps.nodes,
|
|
463
|
+
edges: edgesArrayToRecord(menuGraphProps.edges)
|
|
426
464
|
}));
|
|
427
|
-
(0,
|
|
428
|
-
|
|
429
|
-
graph.
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
}) || null;
|
|
437
|
-
} else {
|
|
438
|
-
return null;
|
|
439
|
-
}
|
|
465
|
+
(0, import_react5.useEffect)(() => {
|
|
466
|
+
graph.addNodes(menuGraphProps.nodes);
|
|
467
|
+
graph.addEdges(menuGraphProps.edges);
|
|
468
|
+
}, [
|
|
469
|
+
menuGraphProps
|
|
470
|
+
]);
|
|
471
|
+
const useGroupItems = (0, import_react5.useCallback)((sourceNode) => {
|
|
472
|
+
const items = (0, import_rx_react.useRxValue)(graph.connections(sourceNode?.id || import_app_graph4.ROOT_ID));
|
|
473
|
+
return items;
|
|
440
474
|
}, [
|
|
441
475
|
graph
|
|
442
476
|
]);
|
|
443
477
|
return {
|
|
444
|
-
|
|
478
|
+
useGroupItems
|
|
445
479
|
};
|
|
446
480
|
};
|
|
447
481
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -458,6 +492,7 @@ var useMenuActions = (actionCreator) => {
|
|
|
458
492
|
isMenuGroup,
|
|
459
493
|
isSeparator,
|
|
460
494
|
menuContextDefaults,
|
|
495
|
+
rxFromSignal,
|
|
461
496
|
useMenu,
|
|
462
497
|
useMenuActions,
|
|
463
498
|
useMenuItems
|