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

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 (55) hide show
  1. package/LICENSE +8 -0
  2. package/README.md +3 -0
  3. package/dist/lib/browser/index.mjs +231 -0
  4. package/dist/lib/browser/index.mjs.map +7 -0
  5. package/dist/lib/browser/meta.json +1 -0
  6. package/dist/lib/node/index.cjs +248 -0
  7. package/dist/lib/node/index.cjs.map +7 -0
  8. package/dist/lib/node/meta.json +1 -0
  9. package/dist/lib/node-esm/index.mjs +233 -0
  10. package/dist/lib/node-esm/index.mjs.map +7 -0
  11. package/dist/lib/node-esm/meta.json +1 -0
  12. package/dist/types/src/components/ActionLabel.d.ts +7 -0
  13. package/dist/types/src/components/ActionLabel.d.ts.map +1 -0
  14. package/dist/types/src/components/DropdownMenu.d.ts +19 -0
  15. package/dist/types/src/components/DropdownMenu.d.ts.map +1 -0
  16. package/dist/types/src/components/Toolbar/Toolbar.d.ts +4 -0
  17. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -0
  18. package/dist/types/src/components/Toolbar/ToolbarDropdownMenu.d.ts +4 -0
  19. package/dist/types/src/components/Toolbar/ToolbarDropdownMenu.d.ts.map +1 -0
  20. package/dist/types/src/components/Toolbar/ToolbarToggleGroup.d.ts +4 -0
  21. package/dist/types/src/components/Toolbar/ToolbarToggleGroup.d.ts.map +1 -0
  22. package/dist/types/src/components/Toolbar/defs.d.ts +30 -0
  23. package/dist/types/src/components/Toolbar/defs.d.ts.map +1 -0
  24. package/dist/types/src/components/Toolbar/index.d.ts +3 -0
  25. package/dist/types/src/components/Toolbar/index.d.ts.map +1 -0
  26. package/dist/types/src/components/index.d.ts +3 -0
  27. package/dist/types/src/components/index.d.ts.map +1 -0
  28. package/dist/types/src/defs.d.ts +18 -0
  29. package/dist/types/src/defs.d.ts.map +1 -0
  30. package/dist/types/src/index.d.ts +3 -0
  31. package/dist/types/src/index.d.ts.map +1 -0
  32. package/dist/types/src/testing/Menus.stories.d.ts +22 -0
  33. package/dist/types/src/testing/Menus.stories.d.ts.map +1 -0
  34. package/dist/types/src/testing/index.d.ts +26 -0
  35. package/dist/types/src/testing/index.d.ts.map +1 -0
  36. package/dist/types/src/translations.d.ts +8 -0
  37. package/dist/types/src/translations.d.ts.map +1 -0
  38. package/dist/types/src/util.d.ts +4 -0
  39. package/dist/types/src/util.d.ts.map +1 -0
  40. package/dist/types/tsconfig.tsbuildinfo +1 -0
  41. package/package.json +52 -0
  42. package/src/components/ActionLabel.tsx +30 -0
  43. package/src/components/DropdownMenu.tsx +104 -0
  44. package/src/components/Toolbar/Toolbar.tsx +71 -0
  45. package/src/components/Toolbar/ToolbarDropdownMenu.tsx +36 -0
  46. package/src/components/Toolbar/ToolbarToggleGroup.tsx +39 -0
  47. package/src/components/Toolbar/defs.ts +36 -0
  48. package/src/components/Toolbar/index.ts +6 -0
  49. package/src/components/index.ts +6 -0
  50. package/src/defs.ts +23 -0
  51. package/src/index.ts +6 -0
  52. package/src/testing/Menus.stories.tsx +55 -0
  53. package/src/testing/index.ts +92 -0
  54. package/src/translations.ts +13 -0
  55. package/src/util.ts +14 -0
package/LICENSE ADDED
@@ -0,0 +1,8 @@
1
+ MIT License
2
+ Copyright (c) 2024 DXOS
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
5
+
6
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @dxos/react-ui-menu
2
+
3
+ Components for facilitating reactive and consistent menus.
@@ -0,0 +1,231 @@
1
+ // packages/ui/react-ui-menu/src/components/DropdownMenu.tsx
2
+ import { useControllableState } from "@radix-ui/react-use-controllable-state";
3
+ import React2, { useCallback } from "react";
4
+ import { DropdownMenu as NaturalDropdownMenu, Icon } from "@dxos/react-ui";
5
+
6
+ // packages/ui/react-ui-menu/src/components/ActionLabel.tsx
7
+ import React from "react";
8
+ import { keySymbols } from "@dxos/keyboard";
9
+ import { toLocalizedString, useTranslation } from "@dxos/react-ui";
10
+ import { mx, descriptionText } from "@dxos/react-ui-theme";
11
+
12
+ // packages/ui/react-ui-menu/src/translations.ts
13
+ var translationKey = "menus";
14
+ var translations_default = [
15
+ {
16
+ "en-US": {
17
+ [translationKey]: {}
18
+ }
19
+ }
20
+ ];
21
+
22
+ // packages/ui/react-ui-menu/src/util.ts
23
+ import { getHostPlatform } from "@dxos/util";
24
+ var getShortcut = (action) => {
25
+ return typeof action.properties?.keyBinding === "string" ? action.properties.keyBinding : action.properties?.keyBinding?.[getHostPlatform()];
26
+ };
27
+
28
+ // packages/ui/react-ui-menu/src/components/ActionLabel.tsx
29
+ var ActionLabel = ({ action }) => {
30
+ const shortcut = getShortcut(action);
31
+ const { t } = useTranslation(translationKey);
32
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("span", {
33
+ className: "grow truncate"
34
+ }, toLocalizedString(action.properties.label, t)), shortcut && /* @__PURE__ */ React.createElement("span", {
35
+ className: mx("shrink-0", descriptionText)
36
+ }, keySymbols(shortcut).join("")));
37
+ };
38
+
39
+ // packages/ui/react-ui-menu/src/components/DropdownMenu.tsx
40
+ var DropdownMenuItem = ({ action, onClick }) => {
41
+ const handleClick = useCallback((event) => onClick(action, event), [
42
+ action,
43
+ onClick
44
+ ]);
45
+ return /* @__PURE__ */ React2.createElement(NaturalDropdownMenu.Item, {
46
+ onClick: handleClick,
47
+ classNames: "gap-2",
48
+ disabled: action.properties?.disabled,
49
+ ...action.properties?.testId && {
50
+ "data-testid": action.properties.testId
51
+ }
52
+ }, action.properties?.icon && /* @__PURE__ */ React2.createElement(Icon, {
53
+ icon: action.properties.icon,
54
+ size: 4
55
+ }), /* @__PURE__ */ React2.createElement(ActionLabel, {
56
+ action
57
+ }));
58
+ };
59
+ var DropdownMenuRoot = ({ defaultMenuOpen, actions, menuOpen, suppressNextTooltip, onMenuOpenChange, onAction, children }) => {
60
+ const [optionsMenuOpen, setOptionsMenuOpen] = useControllableState({
61
+ prop: menuOpen,
62
+ defaultProp: defaultMenuOpen,
63
+ onChange: onMenuOpenChange
64
+ });
65
+ const handleActionClick = useCallback((action, event) => {
66
+ if (action.properties?.disabled) {
67
+ return;
68
+ }
69
+ event.stopPropagation();
70
+ if (suppressNextTooltip) {
71
+ suppressNextTooltip.current = true;
72
+ }
73
+ setOptionsMenuOpen(false);
74
+ onAction?.(action);
75
+ }, [
76
+ onAction
77
+ ]);
78
+ return /* @__PURE__ */ React2.createElement(NaturalDropdownMenu.Root, {
79
+ open: optionsMenuOpen,
80
+ onOpenChange: (nextOpen) => {
81
+ if (!nextOpen && suppressNextTooltip) {
82
+ suppressNextTooltip.current = true;
83
+ }
84
+ return setOptionsMenuOpen(nextOpen);
85
+ }
86
+ }, children, /* @__PURE__ */ React2.createElement(NaturalDropdownMenu.Portal, null, /* @__PURE__ */ React2.createElement(NaturalDropdownMenu.Content, null, /* @__PURE__ */ React2.createElement(NaturalDropdownMenu.Viewport, null, actions?.map((action) => /* @__PURE__ */ React2.createElement(DropdownMenuItem, {
87
+ key: action.id,
88
+ action,
89
+ onClick: handleActionClick
90
+ }))), /* @__PURE__ */ React2.createElement(NaturalDropdownMenu.Arrow, null))));
91
+ };
92
+ var DropdownMenu = {
93
+ Root: DropdownMenuRoot,
94
+ Trigger: NaturalDropdownMenu.Trigger,
95
+ VirtualTrigger: NaturalDropdownMenu.VirtualTrigger
96
+ };
97
+
98
+ // packages/ui/react-ui-menu/src/components/Toolbar/Toolbar.tsx
99
+ import React5, { useCallback as useCallback2 } from "react";
100
+ import { Toolbar as NaturalToolbar3 } from "@dxos/react-ui";
101
+
102
+ // packages/ui/react-ui-menu/src/components/Toolbar/ToolbarDropdownMenu.tsx
103
+ import React3, { useMemo, useRef } from "react";
104
+ import { Toolbar as NaturalToolbar } from "@dxos/react-ui";
105
+ var ToolbarDropdownMenu = ({ actionGroup, graph, onAction, applyActiveIcon }) => {
106
+ const menuActions = useMemo(() => graph ? graph.actions(actionGroup) : [], [
107
+ actionGroup,
108
+ graph
109
+ ]);
110
+ const { icon, iconOnly = true, disabled, testId } = actionGroup.properties;
111
+ const suppressNextTooltip = useRef(false);
112
+ return /* @__PURE__ */ React3.createElement(DropdownMenu.Root, {
113
+ actions: menuActions,
114
+ onAction,
115
+ suppressNextTooltip
116
+ }, /* @__PURE__ */ React3.createElement(DropdownMenu.Trigger, {
117
+ asChild: true
118
+ }, /* @__PURE__ */ React3.createElement(NaturalToolbar.IconButton, {
119
+ size: 5,
120
+ variant: "ghost",
121
+ iconOnly,
122
+ disabled,
123
+ icon: applyActiveIcon && menuActions.find((action) => !!action.properties.checked)?.properties.icon || icon,
124
+ label: /* @__PURE__ */ React3.createElement(ActionLabel, {
125
+ action: actionGroup
126
+ }),
127
+ ...testId && {
128
+ "data-testid": testId
129
+ },
130
+ suppressNextTooltip,
131
+ caretDown: true
132
+ })));
133
+ };
134
+
135
+ // packages/ui/react-ui-menu/src/components/Toolbar/ToolbarToggleGroup.tsx
136
+ import React4, { useMemo as useMemo2 } from "react";
137
+ import { Toolbar as NaturalToolbar2 } from "@dxos/react-ui";
138
+ var ToolbarToggleGroupItem = ({ action }) => {
139
+ const { icon, iconOnly, disabled } = action.properties;
140
+ return /* @__PURE__ */ React4.createElement(NaturalToolbar2.ToggleGroupIconItem, {
141
+ key: action.id,
142
+ value: action.id,
143
+ icon,
144
+ iconOnly,
145
+ disabled,
146
+ label: /* @__PURE__ */ React4.createElement(ActionLabel, {
147
+ action
148
+ })
149
+ });
150
+ };
151
+ var ToolbarToggleGroup = ({ actionGroup, graph }) => {
152
+ const menuActions = useMemo2(() => graph ? graph.actions(actionGroup) : [], [
153
+ actionGroup,
154
+ graph
155
+ ]);
156
+ const { selectCardinality, value } = actionGroup.properties;
157
+ return (
158
+ // TODO(thure): This is extremely difficult to manage, what do?
159
+ // @ts-ignore
160
+ /* @__PURE__ */ React4.createElement(NaturalToolbar2.ToggleGroup, {
161
+ type: selectCardinality,
162
+ value
163
+ }, menuActions.map((action) => /* @__PURE__ */ React4.createElement(ToolbarToggleGroupItem, {
164
+ key: action.id,
165
+ action
166
+ })))
167
+ );
168
+ };
169
+
170
+ // packages/ui/react-ui-menu/src/components/Toolbar/defs.ts
171
+ import { ACTION_GROUP_TYPE } from "@dxos/app-graph";
172
+ var ToolbarSeparatorType = "@dxos/react-ui-toolbar/separator";
173
+ var isSeparator = (node) => node.type === ToolbarSeparatorType;
174
+ var isMenu = (node) => node.type === ACTION_GROUP_TYPE;
175
+
176
+ // packages/ui/react-ui-menu/src/components/Toolbar/Toolbar.tsx
177
+ var ToolbarItem = ({ iconSize, action, onAction }) => {
178
+ const handleClick = useCallback2(() => {
179
+ onAction?.(action);
180
+ }, [
181
+ action,
182
+ onAction
183
+ ]);
184
+ const { icon, iconOnly = true, disabled, testId } = action.properties;
185
+ return /* @__PURE__ */ React5.createElement(NaturalToolbar3.IconButton, {
186
+ key: action.id,
187
+ iconOnly,
188
+ variant: "ghost",
189
+ icon,
190
+ size: iconSize,
191
+ label: /* @__PURE__ */ React5.createElement(ActionLabel, {
192
+ action
193
+ }),
194
+ disabled,
195
+ onClick: handleClick,
196
+ ...testId && {
197
+ "data-testid": testId
198
+ }
199
+ });
200
+ };
201
+ var Toolbar = ({ actions: items, onAction, iconSize = 5, graph, ...props }) => {
202
+ return /* @__PURE__ */ React5.createElement(NaturalToolbar3.Root, props, items?.map((item, i) => isSeparator(item) ? /* @__PURE__ */ React5.createElement(NaturalToolbar3.Separator, {
203
+ key: i,
204
+ variant: item.properties.variant
205
+ }) : isMenu(item) ? item.properties.variant === "dropdownMenu" ? /* @__PURE__ */ React5.createElement(ToolbarDropdownMenu, {
206
+ key: item.id,
207
+ actionGroup: item,
208
+ onAction,
209
+ iconSize,
210
+ graph
211
+ }) : /* @__PURE__ */ React5.createElement(ToolbarToggleGroup, {
212
+ key: item.id,
213
+ actionGroup: item,
214
+ onAction,
215
+ iconSize,
216
+ graph
217
+ }) : /* @__PURE__ */ React5.createElement(ToolbarItem, {
218
+ key: item.id,
219
+ action: item,
220
+ onAction,
221
+ iconSize
222
+ })));
223
+ };
224
+ export {
225
+ DropdownMenu,
226
+ Toolbar,
227
+ ToolbarSeparatorType,
228
+ isMenu,
229
+ isSeparator
230
+ };
231
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/DropdownMenu.tsx", "../../../src/components/ActionLabel.tsx", "../../../src/translations.ts", "../../../src/util.ts", "../../../src/components/Toolbar/Toolbar.tsx", "../../../src/components/Toolbar/ToolbarDropdownMenu.tsx", "../../../src/components/Toolbar/ToolbarToggleGroup.tsx", "../../../src/components/Toolbar/defs.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, { type MouseEvent, type MutableRefObject, type PropsWithChildren, useCallback } from 'react';\n\nimport { DropdownMenu as NaturalDropdownMenu, Icon } from '@dxos/react-ui';\n\nimport { ActionLabel } from './ActionLabel';\nimport { type MenuAction, type MenuProps } from '../defs';\n\nexport type DropdownMenuProps = MenuProps &\n PropsWithChildren<\n Partial<{\n defaultMenuOpen: boolean;\n menuOpen: boolean;\n onMenuOpenChange: (nextOpen: boolean) => void;\n suppressNextTooltip?: MutableRefObject<boolean>;\n }>\n >;\n\nconst DropdownMenuItem = ({\n action,\n onClick,\n}: {\n action: MenuAction;\n onClick: (action: MenuAction, event: MouseEvent) => void;\n}) => {\n const handleClick = useCallback((event: MouseEvent) => onClick(action, event), [action, onClick]);\n return (\n <NaturalDropdownMenu.Item\n onClick={handleClick}\n classNames='gap-2'\n disabled={action.properties?.disabled}\n {...(action.properties?.testId && { 'data-testid': action.properties.testId })}\n >\n {action.properties?.icon && <Icon icon={action.properties!.icon} size={4} />}\n <ActionLabel action={action} />\n </NaturalDropdownMenu.Item>\n );\n};\n\nconst DropdownMenuRoot = ({\n defaultMenuOpen,\n actions,\n menuOpen,\n suppressNextTooltip,\n onMenuOpenChange,\n onAction,\n children,\n}: DropdownMenuProps) => {\n const [optionsMenuOpen, setOptionsMenuOpen] = useControllableState({\n prop: menuOpen,\n defaultProp: defaultMenuOpen,\n onChange: onMenuOpenChange,\n });\n\n const handleActionClick = useCallback(\n (action: MenuAction, event: MouseEvent) => {\n if (action.properties?.disabled) {\n return;\n }\n event.stopPropagation();\n // TODO(thure): Why does Dialog’s modal-ness cause issues if we don’t explicitly close the menu here?\n if (suppressNextTooltip) {\n suppressNextTooltip.current = true;\n }\n setOptionsMenuOpen(false);\n onAction?.(action);\n },\n [onAction],\n );\n\n return (\n <NaturalDropdownMenu.Root\n {...{\n open: optionsMenuOpen,\n onOpenChange: (nextOpen: boolean) => {\n if (!nextOpen && suppressNextTooltip) {\n suppressNextTooltip.current = true;\n }\n return setOptionsMenuOpen(nextOpen);\n },\n }}\n >\n {children}\n <NaturalDropdownMenu.Portal>\n <NaturalDropdownMenu.Content>\n <NaturalDropdownMenu.Viewport>\n {actions?.map((action) => <DropdownMenuItem key={action.id} action={action} onClick={handleActionClick} />)}\n </NaturalDropdownMenu.Viewport>\n <NaturalDropdownMenu.Arrow />\n </NaturalDropdownMenu.Content>\n </NaturalDropdownMenu.Portal>\n </NaturalDropdownMenu.Root>\n );\n};\n\nexport const DropdownMenu = {\n Root: DropdownMenuRoot,\n Trigger: NaturalDropdownMenu.Trigger,\n VirtualTrigger: NaturalDropdownMenu.VirtualTrigger,\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Action, type ActionGroup } from '@dxos/app-graph';\nimport { keySymbols } from '@dxos/keyboard';\nimport { toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { mx, descriptionText } from '@dxos/react-ui-theme';\n\nimport { type MenuActionProperties } from '../defs';\nimport { translationKey } from '../translations';\nimport { getShortcut } from '../util';\n\nexport const ActionLabel = ({\n action,\n}: {\n action: Action<MenuActionProperties> | ActionGroup<Omit<MenuActionProperties, 'variant'>>;\n}) => {\n const shortcut = getShortcut(action);\n const { t } = useTranslation(translationKey);\n\n return (\n <>\n <span className='grow truncate'>{toLocalizedString(action.properties!.label, t)}</span>\n {shortcut && <span className={mx('shrink-0', descriptionText)}>{keySymbols(shortcut).join('')}</span>}\n </>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nexport const translationKey = 'menus';\n\nexport default [\n {\n 'en-US': {\n [translationKey]: {},\n },\n },\n] as const;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ActionLike } from '@dxos/app-graph';\nimport { getHostPlatform } from '@dxos/util';\n\nexport const getShortcut = (action: ActionLike) => {\n return typeof action.properties?.keyBinding === 'string'\n ? action.properties.keyBinding\n : action.properties?.keyBinding?.[getHostPlatform()];\n};\n\nexport const fallbackIcon = 'ph--placeholder--regular';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { Toolbar as NaturalToolbar } from '@dxos/react-ui';\n\nimport { ToolbarDropdownMenu } from './ToolbarDropdownMenu';\nimport { ToolbarToggleGroup } from './ToolbarToggleGroup';\nimport { isMenu, isSeparator, type ToolbarProps } from './defs';\nimport { type MenuAction } from '../../defs';\nimport { ActionLabel } from '../ActionLabel';\n\nconst ToolbarItem = ({\n iconSize,\n action,\n onAction,\n}: Pick<ToolbarProps, 'iconSize' | 'onAction'> & {\n action: MenuAction;\n}) => {\n const handleClick = useCallback(() => {\n onAction?.(action);\n }, [action, onAction]);\n const { icon, iconOnly = true, disabled, testId } = action.properties;\n return (\n <NaturalToolbar.IconButton\n key={action.id}\n iconOnly={iconOnly}\n variant='ghost'\n icon={icon}\n size={iconSize}\n label={<ActionLabel action={action} />}\n disabled={disabled}\n onClick={handleClick}\n {...(testId && { 'data-testid': testId })}\n />\n );\n};\n\nexport const Toolbar = ({ actions: items, onAction, iconSize = 5, graph, ...props }: ToolbarProps) => {\n return (\n <NaturalToolbar.Root {...props}>\n {items?.map((item, i) =>\n isSeparator(item) ? (\n <NaturalToolbar.Separator key={i} variant={item.properties.variant} />\n ) : isMenu(item) ? (\n item.properties.variant === 'dropdownMenu' ? (\n <ToolbarDropdownMenu\n key={item.id}\n actionGroup={item}\n onAction={onAction}\n iconSize={iconSize}\n graph={graph}\n />\n ) : (\n <ToolbarToggleGroup\n key={item.id}\n actionGroup={item}\n onAction={onAction}\n iconSize={iconSize}\n graph={graph}\n />\n )\n ) : (\n <ToolbarItem key={item.id} action={item as MenuAction} onAction={onAction} iconSize={iconSize} />\n ),\n )}\n </NaturalToolbar.Root>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useMemo, useRef } from 'react';\n\nimport { Toolbar as NaturalToolbar } from '@dxos/react-ui';\n\nimport { type ToolbarActionGroupProps } from './defs';\nimport { type MenuAction } from '../../defs';\nimport { ActionLabel } from '../ActionLabel';\nimport { DropdownMenu } from '../DropdownMenu';\n\nexport const ToolbarDropdownMenu = ({ actionGroup, graph, onAction, applyActiveIcon }: ToolbarActionGroupProps) => {\n const menuActions = useMemo(() => (graph ? graph.actions(actionGroup) : []) as MenuAction[], [actionGroup, graph]);\n const { icon, iconOnly = true, disabled, testId } = actionGroup.properties;\n const suppressNextTooltip = useRef(false);\n\n return (\n <DropdownMenu.Root actions={menuActions} onAction={onAction} suppressNextTooltip={suppressNextTooltip}>\n <DropdownMenu.Trigger asChild>\n <NaturalToolbar.IconButton\n size={5}\n variant='ghost'\n iconOnly={iconOnly}\n disabled={disabled}\n icon={(applyActiveIcon && menuActions.find((action) => !!action.properties.checked)?.properties.icon) || icon}\n label={<ActionLabel action={actionGroup} />}\n {...(testId && { 'data-testid': testId })}\n suppressNextTooltip={suppressNextTooltip}\n caretDown\n />\n </DropdownMenu.Trigger>\n </DropdownMenu.Root>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { Toolbar as NaturalToolbar } from '@dxos/react-ui';\n\nimport type { ToolbarActionGroupProps } from './defs';\nimport { type MenuAction } from '../../defs';\nimport { ActionLabel } from '../ActionLabel';\n\nconst ToolbarToggleGroupItem = ({ action }: { action: MenuAction }) => {\n const { icon, iconOnly, disabled } = action.properties;\n return (\n <NaturalToolbar.ToggleGroupIconItem\n key={action.id}\n value={action.id}\n icon={icon}\n iconOnly={iconOnly}\n disabled={disabled}\n label={<ActionLabel action={action} />}\n />\n );\n};\n\nexport const ToolbarToggleGroup = ({ actionGroup, graph }: ToolbarActionGroupProps) => {\n const menuActions = useMemo(() => (graph ? (graph.actions(actionGroup) as MenuAction[]) : []), [actionGroup, graph]);\n const { selectCardinality, value } = actionGroup.properties;\n return (\n // TODO(thure): This is extremely difficult to manage, what do?\n // @ts-ignore\n <NaturalToolbar.ToggleGroup type={selectCardinality} value={value}>\n {menuActions.map((action) => (\n <ToolbarToggleGroupItem key={action.id} action={action} />\n ))}\n </NaturalToolbar.ToggleGroup>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Node, type ActionGroup, type Graph, ACTION_GROUP_TYPE } from '@dxos/app-graph';\nimport { type ToolbarRootProps, type ToolbarSeparatorProps, type IconButtonProps } from '@dxos/react-ui';\n\nimport { type MenuAction, type MenuActionProperties, type MenuProps } from '../../defs';\n\nexport const ToolbarSeparatorType = '@dxos/react-ui-toolbar/separator' as const;\n\nexport type ToolbarSeparatorNode = Node<never, Pick<ToolbarSeparatorProps, 'variant'>> & {\n type: typeof ToolbarSeparatorType;\n};\n\nexport const isSeparator = (node: Node): node is ToolbarSeparatorNode => node.type === ToolbarSeparatorType;\n\nexport type ToolbarActionGroupProperties = Omit<MenuActionProperties, 'variant'> & {\n variant: 'dropdownMenu' | 'toggleGroup';\n} & ({ selectCardinality?: 'single'; value?: string } | { selectCardinality?: 'multiple'; value?: string[] });\n\nexport type ToolbarActionGroup = ActionGroup<ToolbarActionGroupProperties>;\n\nexport const isMenu = (node: Node): node is ToolbarActionGroup => node.type === ACTION_GROUP_TYPE;\n\nexport type ToolbarItem = ToolbarSeparatorNode | MenuAction | ToolbarActionGroup;\n\nexport type ToolbarProps = ToolbarRootProps &\n MenuProps<ToolbarItem, MenuAction> & { iconSize?: IconButtonProps['size']; graph?: Graph };\n\nexport type ToolbarActionGroupProps = Pick<ToolbarProps, 'iconSize'> &\n Omit<MenuProps<MenuAction>, 'actions'> & {\n actionGroup: ToolbarActionGroup;\n graph?: Graph;\n applyActiveIcon?: boolean;\n };\n"],
5
+ "mappings": "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",
6
+ "names": ["useControllableState", "React", "useCallback", "DropdownMenu", "NaturalDropdownMenu", "Icon", "React", "keySymbols", "toLocalizedString", "useTranslation", "mx", "descriptionText", "translationKey", "getHostPlatform", "getShortcut", "action", "properties", "keyBinding", "getHostPlatform", "ActionLabel", "action", "shortcut", "getShortcut", "t", "useTranslation", "translationKey", "span", "className", "toLocalizedString", "properties", "label", "mx", "descriptionText", "keySymbols", "join", "DropdownMenuItem", "action", "onClick", "handleClick", "useCallback", "event", "React", "NaturalDropdownMenu", "Item", "classNames", "disabled", "properties", "testId", "icon", "Icon", "size", "ActionLabel", "DropdownMenuRoot", "defaultMenuOpen", "actions", "menuOpen", "suppressNextTooltip", "onMenuOpenChange", "onAction", "children", "optionsMenuOpen", "setOptionsMenuOpen", "useControllableState", "prop", "defaultProp", "onChange", "handleActionClick", "stopPropagation", "current", "Root", "open", "onOpenChange", "nextOpen", "Portal", "Content", "Viewport", "map", "key", "id", "Arrow", "DropdownMenu", "Trigger", "VirtualTrigger", "React", "useCallback", "Toolbar", "NaturalToolbar", "React", "useMemo", "useRef", "Toolbar", "NaturalToolbar", "ToolbarDropdownMenu", "actionGroup", "graph", "onAction", "applyActiveIcon", "menuActions", "useMemo", "actions", "icon", "iconOnly", "disabled", "testId", "properties", "suppressNextTooltip", "useRef", "React", "DropdownMenu", "Root", "Trigger", "asChild", "NaturalToolbar", "IconButton", "size", "variant", "find", "action", "checked", "label", "ActionLabel", "caretDown", "React", "useMemo", "Toolbar", "NaturalToolbar", "ToolbarToggleGroupItem", "action", "icon", "iconOnly", "disabled", "properties", "React", "NaturalToolbar", "ToggleGroupIconItem", "key", "id", "value", "label", "ActionLabel", "ToolbarToggleGroup", "actionGroup", "graph", "menuActions", "useMemo", "actions", "selectCardinality", "ToggleGroup", "type", "map", "ACTION_GROUP_TYPE", "ToolbarSeparatorType", "isSeparator", "node", "type", "isMenu", "ACTION_GROUP_TYPE", "ToolbarItem", "iconSize", "action", "onAction", "handleClick", "useCallback", "icon", "iconOnly", "disabled", "testId", "properties", "React", "NaturalToolbar", "IconButton", "key", "id", "variant", "size", "label", "ActionLabel", "onClick", "Toolbar", "actions", "items", "graph", "props", "Root", "map", "item", "i", "isSeparator", "Separator", "isMenu", "ToolbarDropdownMenu", "actionGroup", "ToolbarToggleGroup"]
7
+ }
@@ -0,0 +1 @@
1
+ {"inputs":{"packages/ui/react-ui-menu/src/translations.ts":{"bytes":909,"imports":[],"format":"esm"},"packages/ui/react-ui-menu/src/util.ts":{"bytes":1578,"imports":[{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-menu/src/components/ActionLabel.tsx":{"bytes":3310,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/keyboard","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-menu/src/translations.ts","kind":"import-statement","original":"../translations"},{"path":"packages/ui/react-ui-menu/src/util.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"packages/ui/react-ui-menu/src/components/DropdownMenu.tsx":{"bytes":9986,"imports":[{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-menu/src/components/ActionLabel.tsx","kind":"import-statement","original":"./ActionLabel"}],"format":"esm"},"packages/ui/react-ui-menu/src/components/Toolbar/ToolbarDropdownMenu.tsx":{"bytes":5223,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-menu/src/components/ActionLabel.tsx","kind":"import-statement","original":"../ActionLabel"},{"path":"packages/ui/react-ui-menu/src/components/DropdownMenu.tsx","kind":"import-statement","original":"../DropdownMenu"}],"format":"esm"},"packages/ui/react-ui-menu/src/components/Toolbar/ToolbarToggleGroup.tsx":{"bytes":4731,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-menu/src/components/ActionLabel.tsx","kind":"import-statement","original":"../ActionLabel"}],"format":"esm"},"packages/ui/react-ui-menu/src/components/Toolbar/defs.ts":{"bytes":3030,"imports":[{"path":"@dxos/app-graph","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-menu/src/components/Toolbar/Toolbar.tsx":{"bytes":7348,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-menu/src/components/Toolbar/ToolbarDropdownMenu.tsx","kind":"import-statement","original":"./ToolbarDropdownMenu"},{"path":"packages/ui/react-ui-menu/src/components/Toolbar/ToolbarToggleGroup.tsx","kind":"import-statement","original":"./ToolbarToggleGroup"},{"path":"packages/ui/react-ui-menu/src/components/Toolbar/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/ui/react-ui-menu/src/components/ActionLabel.tsx","kind":"import-statement","original":"../ActionLabel"}],"format":"esm"},"packages/ui/react-ui-menu/src/components/Toolbar/index.ts":{"bytes":595,"imports":[{"path":"packages/ui/react-ui-menu/src/components/Toolbar/Toolbar.tsx","kind":"import-statement","original":"./Toolbar"},{"path":"packages/ui/react-ui-menu/src/components/Toolbar/defs.ts","kind":"import-statement","original":"./defs"}],"format":"esm"},"packages/ui/react-ui-menu/src/components/index.ts":{"bytes":607,"imports":[{"path":"packages/ui/react-ui-menu/src/components/DropdownMenu.tsx","kind":"import-statement","original":"./DropdownMenu"},{"path":"packages/ui/react-ui-menu/src/components/Toolbar/index.ts","kind":"import-statement","original":"./Toolbar"}],"format":"esm"},"packages/ui/react-ui-menu/src/defs.ts":{"bytes":1144,"imports":[],"format":"esm"},"packages/ui/react-ui-menu/src/index.ts":{"bytes":583,"imports":[{"path":"packages/ui/react-ui-menu/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/ui/react-ui-menu/src/defs.ts","kind":"import-statement","original":"./defs"}],"format":"esm"}},"outputs":{"packages/ui/react-ui-menu/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":18403},"packages/ui/react-ui-menu/dist/lib/browser/index.mjs":{"imports":[{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/keyboard","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/app-graph","kind":"import-statement","external":true}],"exports":["DropdownMenu","Toolbar","ToolbarSeparatorType","isMenu","isSeparator"],"entryPoint":"packages/ui/react-ui-menu/src/index.ts","inputs":{"packages/ui/react-ui-menu/src/components/DropdownMenu.tsx":{"bytesInOutput":2296},"packages/ui/react-ui-menu/src/components/ActionLabel.tsx":{"bytesInOutput":667},"packages/ui/react-ui-menu/src/translations.ts":{"bytesInOutput":118},"packages/ui/react-ui-menu/src/util.ts":{"bytesInOutput":225},"packages/ui/react-ui-menu/src/components/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-menu/src/components/Toolbar/Toolbar.tsx":{"bytesInOutput":1503},"packages/ui/react-ui-menu/src/components/Toolbar/ToolbarDropdownMenu.tsx":{"bytesInOutput":1096},"packages/ui/react-ui-menu/src/components/Toolbar/ToolbarToggleGroup.tsx":{"bytesInOutput":1069},"packages/ui/react-ui-menu/src/components/Toolbar/defs.ts":{"bytesInOutput":236},"packages/ui/react-ui-menu/src/components/Toolbar/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-menu/src/index.ts":{"bytesInOutput":0}},"bytes":8013}}}
@@ -0,0 +1,248 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var node_exports = {};
30
+ __export(node_exports, {
31
+ DropdownMenu: () => DropdownMenu,
32
+ Toolbar: () => Toolbar,
33
+ ToolbarSeparatorType: () => ToolbarSeparatorType,
34
+ isMenu: () => isMenu,
35
+ isSeparator: () => isSeparator
36
+ });
37
+ module.exports = __toCommonJS(node_exports);
38
+ var import_react_use_controllable_state = require("@radix-ui/react-use-controllable-state");
39
+ var import_react = __toESM(require("react"));
40
+ var import_react_ui = require("@dxos/react-ui");
41
+ var import_react2 = __toESM(require("react"));
42
+ var import_keyboard = require("@dxos/keyboard");
43
+ var import_react_ui2 = require("@dxos/react-ui");
44
+ var import_react_ui_theme = require("@dxos/react-ui-theme");
45
+ var import_util = require("@dxos/util");
46
+ var import_react3 = __toESM(require("react"));
47
+ var import_react_ui3 = require("@dxos/react-ui");
48
+ 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");
53
+ var translationKey = "menus";
54
+ var translations_default = [
55
+ {
56
+ "en-US": {
57
+ [translationKey]: {}
58
+ }
59
+ }
60
+ ];
61
+ var getShortcut = (action) => {
62
+ return typeof action.properties?.keyBinding === "string" ? action.properties.keyBinding : action.properties?.keyBinding?.[(0, import_util.getHostPlatform)()];
63
+ };
64
+ var ActionLabel = ({ action }) => {
65
+ const shortcut = getShortcut(action);
66
+ const { t } = (0, import_react_ui2.useTranslation)(translationKey);
67
+ return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement("span", {
68
+ className: "grow truncate"
69
+ }, (0, import_react_ui2.toLocalizedString)(action.properties.label, t)), shortcut && /* @__PURE__ */ import_react2.default.createElement("span", {
70
+ className: (0, import_react_ui_theme.mx)("shrink-0", import_react_ui_theme.descriptionText)
71
+ }, (0, import_keyboard.keySymbols)(shortcut).join("")));
72
+ };
73
+ var DropdownMenuItem = ({ action, onClick }) => {
74
+ const handleClick = (0, import_react.useCallback)((event) => onClick(action, event), [
75
+ action,
76
+ onClick
77
+ ]);
78
+ return /* @__PURE__ */ import_react.default.createElement(import_react_ui.DropdownMenu.Item, {
79
+ onClick: handleClick,
80
+ classNames: "gap-2",
81
+ disabled: action.properties?.disabled,
82
+ ...action.properties?.testId && {
83
+ "data-testid": action.properties.testId
84
+ }
85
+ }, action.properties?.icon && /* @__PURE__ */ import_react.default.createElement(import_react_ui.Icon, {
86
+ icon: action.properties.icon,
87
+ size: 4
88
+ }), /* @__PURE__ */ import_react.default.createElement(ActionLabel, {
89
+ action
90
+ }));
91
+ };
92
+ var DropdownMenuRoot = ({ defaultMenuOpen, actions, menuOpen, suppressNextTooltip, onMenuOpenChange, onAction, children }) => {
93
+ const [optionsMenuOpen, setOptionsMenuOpen] = (0, import_react_use_controllable_state.useControllableState)({
94
+ prop: menuOpen,
95
+ defaultProp: defaultMenuOpen,
96
+ onChange: onMenuOpenChange
97
+ });
98
+ const handleActionClick = (0, import_react.useCallback)((action, event) => {
99
+ if (action.properties?.disabled) {
100
+ return;
101
+ }
102
+ event.stopPropagation();
103
+ if (suppressNextTooltip) {
104
+ suppressNextTooltip.current = true;
105
+ }
106
+ setOptionsMenuOpen(false);
107
+ onAction?.(action);
108
+ }, [
109
+ onAction
110
+ ]);
111
+ return /* @__PURE__ */ import_react.default.createElement(import_react_ui.DropdownMenu.Root, {
112
+ open: optionsMenuOpen,
113
+ onOpenChange: (nextOpen) => {
114
+ if (!nextOpen && suppressNextTooltip) {
115
+ suppressNextTooltip.current = true;
116
+ }
117
+ 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,
122
+ onClick: handleActionClick
123
+ }))), /* @__PURE__ */ import_react.default.createElement(import_react_ui.DropdownMenu.Arrow, null))));
124
+ };
125
+ var DropdownMenu = {
126
+ Root: DropdownMenuRoot,
127
+ Trigger: import_react_ui.DropdownMenu.Trigger,
128
+ VirtualTrigger: import_react_ui.DropdownMenu.VirtualTrigger
129
+ };
130
+ var ToolbarDropdownMenu = ({ actionGroup, graph, onAction, applyActiveIcon }) => {
131
+ const menuActions = (0, import_react4.useMemo)(() => graph ? graph.actions(actionGroup) : [], [
132
+ actionGroup,
133
+ graph
134
+ ]);
135
+ const { icon, iconOnly = true, disabled, testId } = actionGroup.properties;
136
+ const suppressNextTooltip = (0, import_react4.useRef)(false);
137
+ return /* @__PURE__ */ import_react4.default.createElement(DropdownMenu.Root, {
138
+ actions: menuActions,
139
+ onAction,
140
+ suppressNextTooltip
141
+ }, /* @__PURE__ */ import_react4.default.createElement(DropdownMenu.Trigger, {
142
+ asChild: true
143
+ }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui4.Toolbar.IconButton, {
144
+ size: 5,
145
+ variant: "ghost",
146
+ iconOnly,
147
+ 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
+ }),
152
+ ...testId && {
153
+ "data-testid": testId
154
+ },
155
+ suppressNextTooltip,
156
+ caretDown: true
157
+ })));
158
+ };
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)(() => {
195
+ onAction?.(action);
196
+ }, [
197
+ action,
198
+ onAction
199
+ ]);
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",
205
+ icon,
206
+ size: iconSize,
207
+ label: /* @__PURE__ */ import_react3.default.createElement(ActionLabel, {
208
+ action
209
+ }),
210
+ disabled,
211
+ onClick: handleClick,
212
+ ...testId && {
213
+ "data-testid": testId
214
+ }
215
+ });
216
+ };
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, {
219
+ key: i,
220
+ 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,
232
+ graph
233
+ }) : /* @__PURE__ */ import_react3.default.createElement(ToolbarItem, {
234
+ key: item.id,
235
+ action: item,
236
+ onAction,
237
+ iconSize
238
+ })));
239
+ };
240
+ // Annotate the CommonJS export names for ESM import in node:
241
+ 0 && (module.exports = {
242
+ DropdownMenu,
243
+ Toolbar,
244
+ ToolbarSeparatorType,
245
+ isMenu,
246
+ isSeparator
247
+ });
248
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/DropdownMenu.tsx", "../../../src/components/ActionLabel.tsx", "../../../src/translations.ts", "../../../src/util.ts", "../../../src/components/Toolbar/Toolbar.tsx", "../../../src/components/Toolbar/ToolbarDropdownMenu.tsx", "../../../src/components/Toolbar/ToolbarToggleGroup.tsx", "../../../src/components/Toolbar/defs.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, { type MouseEvent, type MutableRefObject, type PropsWithChildren, useCallback } from 'react';\n\nimport { DropdownMenu as NaturalDropdownMenu, Icon } from '@dxos/react-ui';\n\nimport { ActionLabel } from './ActionLabel';\nimport { type MenuAction, type MenuProps } from '../defs';\n\nexport type DropdownMenuProps = MenuProps &\n PropsWithChildren<\n Partial<{\n defaultMenuOpen: boolean;\n menuOpen: boolean;\n onMenuOpenChange: (nextOpen: boolean) => void;\n suppressNextTooltip?: MutableRefObject<boolean>;\n }>\n >;\n\nconst DropdownMenuItem = ({\n action,\n onClick,\n}: {\n action: MenuAction;\n onClick: (action: MenuAction, event: MouseEvent) => void;\n}) => {\n const handleClick = useCallback((event: MouseEvent) => onClick(action, event), [action, onClick]);\n return (\n <NaturalDropdownMenu.Item\n onClick={handleClick}\n classNames='gap-2'\n disabled={action.properties?.disabled}\n {...(action.properties?.testId && { 'data-testid': action.properties.testId })}\n >\n {action.properties?.icon && <Icon icon={action.properties!.icon} size={4} />}\n <ActionLabel action={action} />\n </NaturalDropdownMenu.Item>\n );\n};\n\nconst DropdownMenuRoot = ({\n defaultMenuOpen,\n actions,\n menuOpen,\n suppressNextTooltip,\n onMenuOpenChange,\n onAction,\n children,\n}: DropdownMenuProps) => {\n const [optionsMenuOpen, setOptionsMenuOpen] = useControllableState({\n prop: menuOpen,\n defaultProp: defaultMenuOpen,\n onChange: onMenuOpenChange,\n });\n\n const handleActionClick = useCallback(\n (action: MenuAction, event: MouseEvent) => {\n if (action.properties?.disabled) {\n return;\n }\n event.stopPropagation();\n // TODO(thure): Why does Dialog’s modal-ness cause issues if we don’t explicitly close the menu here?\n if (suppressNextTooltip) {\n suppressNextTooltip.current = true;\n }\n setOptionsMenuOpen(false);\n onAction?.(action);\n },\n [onAction],\n );\n\n return (\n <NaturalDropdownMenu.Root\n {...{\n open: optionsMenuOpen,\n onOpenChange: (nextOpen: boolean) => {\n if (!nextOpen && suppressNextTooltip) {\n suppressNextTooltip.current = true;\n }\n return setOptionsMenuOpen(nextOpen);\n },\n }}\n >\n {children}\n <NaturalDropdownMenu.Portal>\n <NaturalDropdownMenu.Content>\n <NaturalDropdownMenu.Viewport>\n {actions?.map((action) => <DropdownMenuItem key={action.id} action={action} onClick={handleActionClick} />)}\n </NaturalDropdownMenu.Viewport>\n <NaturalDropdownMenu.Arrow />\n </NaturalDropdownMenu.Content>\n </NaturalDropdownMenu.Portal>\n </NaturalDropdownMenu.Root>\n );\n};\n\nexport const DropdownMenu = {\n Root: DropdownMenuRoot,\n Trigger: NaturalDropdownMenu.Trigger,\n VirtualTrigger: NaturalDropdownMenu.VirtualTrigger,\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Action, type ActionGroup } from '@dxos/app-graph';\nimport { keySymbols } from '@dxos/keyboard';\nimport { toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { mx, descriptionText } from '@dxos/react-ui-theme';\n\nimport { type MenuActionProperties } from '../defs';\nimport { translationKey } from '../translations';\nimport { getShortcut } from '../util';\n\nexport const ActionLabel = ({\n action,\n}: {\n action: Action<MenuActionProperties> | ActionGroup<Omit<MenuActionProperties, 'variant'>>;\n}) => {\n const shortcut = getShortcut(action);\n const { t } = useTranslation(translationKey);\n\n return (\n <>\n <span className='grow truncate'>{toLocalizedString(action.properties!.label, t)}</span>\n {shortcut && <span className={mx('shrink-0', descriptionText)}>{keySymbols(shortcut).join('')}</span>}\n </>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nexport const translationKey = 'menus';\n\nexport default [\n {\n 'en-US': {\n [translationKey]: {},\n },\n },\n] as const;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ActionLike } from '@dxos/app-graph';\nimport { getHostPlatform } from '@dxos/util';\n\nexport const getShortcut = (action: ActionLike) => {\n return typeof action.properties?.keyBinding === 'string'\n ? action.properties.keyBinding\n : action.properties?.keyBinding?.[getHostPlatform()];\n};\n\nexport const fallbackIcon = 'ph--placeholder--regular';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { Toolbar as NaturalToolbar } from '@dxos/react-ui';\n\nimport { ToolbarDropdownMenu } from './ToolbarDropdownMenu';\nimport { ToolbarToggleGroup } from './ToolbarToggleGroup';\nimport { isMenu, isSeparator, type ToolbarProps } from './defs';\nimport { type MenuAction } from '../../defs';\nimport { ActionLabel } from '../ActionLabel';\n\nconst ToolbarItem = ({\n iconSize,\n action,\n onAction,\n}: Pick<ToolbarProps, 'iconSize' | 'onAction'> & {\n action: MenuAction;\n}) => {\n const handleClick = useCallback(() => {\n onAction?.(action);\n }, [action, onAction]);\n const { icon, iconOnly = true, disabled, testId } = action.properties;\n return (\n <NaturalToolbar.IconButton\n key={action.id}\n iconOnly={iconOnly}\n variant='ghost'\n icon={icon}\n size={iconSize}\n label={<ActionLabel action={action} />}\n disabled={disabled}\n onClick={handleClick}\n {...(testId && { 'data-testid': testId })}\n />\n );\n};\n\nexport const Toolbar = ({ actions: items, onAction, iconSize = 5, graph, ...props }: ToolbarProps) => {\n return (\n <NaturalToolbar.Root {...props}>\n {items?.map((item, i) =>\n isSeparator(item) ? (\n <NaturalToolbar.Separator key={i} variant={item.properties.variant} />\n ) : isMenu(item) ? (\n item.properties.variant === 'dropdownMenu' ? (\n <ToolbarDropdownMenu\n key={item.id}\n actionGroup={item}\n onAction={onAction}\n iconSize={iconSize}\n graph={graph}\n />\n ) : (\n <ToolbarToggleGroup\n key={item.id}\n actionGroup={item}\n onAction={onAction}\n iconSize={iconSize}\n graph={graph}\n />\n )\n ) : (\n <ToolbarItem key={item.id} action={item as MenuAction} onAction={onAction} iconSize={iconSize} />\n ),\n )}\n </NaturalToolbar.Root>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useMemo, useRef } from 'react';\n\nimport { Toolbar as NaturalToolbar } from '@dxos/react-ui';\n\nimport { type ToolbarActionGroupProps } from './defs';\nimport { type MenuAction } from '../../defs';\nimport { ActionLabel } from '../ActionLabel';\nimport { DropdownMenu } from '../DropdownMenu';\n\nexport const ToolbarDropdownMenu = ({ actionGroup, graph, onAction, applyActiveIcon }: ToolbarActionGroupProps) => {\n const menuActions = useMemo(() => (graph ? graph.actions(actionGroup) : []) as MenuAction[], [actionGroup, graph]);\n const { icon, iconOnly = true, disabled, testId } = actionGroup.properties;\n const suppressNextTooltip = useRef(false);\n\n return (\n <DropdownMenu.Root actions={menuActions} onAction={onAction} suppressNextTooltip={suppressNextTooltip}>\n <DropdownMenu.Trigger asChild>\n <NaturalToolbar.IconButton\n size={5}\n variant='ghost'\n iconOnly={iconOnly}\n disabled={disabled}\n icon={(applyActiveIcon && menuActions.find((action) => !!action.properties.checked)?.properties.icon) || icon}\n label={<ActionLabel action={actionGroup} />}\n {...(testId && { 'data-testid': testId })}\n suppressNextTooltip={suppressNextTooltip}\n caretDown\n />\n </DropdownMenu.Trigger>\n </DropdownMenu.Root>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { Toolbar as NaturalToolbar } from '@dxos/react-ui';\n\nimport type { ToolbarActionGroupProps } from './defs';\nimport { type MenuAction } from '../../defs';\nimport { ActionLabel } from '../ActionLabel';\n\nconst ToolbarToggleGroupItem = ({ action }: { action: MenuAction }) => {\n const { icon, iconOnly, disabled } = action.properties;\n return (\n <NaturalToolbar.ToggleGroupIconItem\n key={action.id}\n value={action.id}\n icon={icon}\n iconOnly={iconOnly}\n disabled={disabled}\n label={<ActionLabel action={action} />}\n />\n );\n};\n\nexport const ToolbarToggleGroup = ({ actionGroup, graph }: ToolbarActionGroupProps) => {\n const menuActions = useMemo(() => (graph ? (graph.actions(actionGroup) as MenuAction[]) : []), [actionGroup, graph]);\n const { selectCardinality, value } = actionGroup.properties;\n return (\n // TODO(thure): This is extremely difficult to manage, what do?\n // @ts-ignore\n <NaturalToolbar.ToggleGroup type={selectCardinality} value={value}>\n {menuActions.map((action) => (\n <ToolbarToggleGroupItem key={action.id} action={action} />\n ))}\n </NaturalToolbar.ToggleGroup>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Node, type ActionGroup, type Graph, ACTION_GROUP_TYPE } from '@dxos/app-graph';\nimport { type ToolbarRootProps, type ToolbarSeparatorProps, type IconButtonProps } from '@dxos/react-ui';\n\nimport { type MenuAction, type MenuActionProperties, type MenuProps } from '../../defs';\n\nexport const ToolbarSeparatorType = '@dxos/react-ui-toolbar/separator' as const;\n\nexport type ToolbarSeparatorNode = Node<never, Pick<ToolbarSeparatorProps, 'variant'>> & {\n type: typeof ToolbarSeparatorType;\n};\n\nexport const isSeparator = (node: Node): node is ToolbarSeparatorNode => node.type === ToolbarSeparatorType;\n\nexport type ToolbarActionGroupProperties = Omit<MenuActionProperties, 'variant'> & {\n variant: 'dropdownMenu' | 'toggleGroup';\n} & ({ selectCardinality?: 'single'; value?: string } | { selectCardinality?: 'multiple'; value?: string[] });\n\nexport type ToolbarActionGroup = ActionGroup<ToolbarActionGroupProperties>;\n\nexport const isMenu = (node: Node): node is ToolbarActionGroup => node.type === ACTION_GROUP_TYPE;\n\nexport type ToolbarItem = ToolbarSeparatorNode | MenuAction | ToolbarActionGroup;\n\nexport type ToolbarProps = ToolbarRootProps &\n MenuProps<ToolbarItem, MenuAction> & { iconSize?: IconButtonProps['size']; graph?: Graph };\n\nexport type ToolbarActionGroupProps = Pick<ToolbarProps, 'iconSize'> &\n Omit<MenuProps<MenuAction>, 'actions'> & {\n actionGroup: ToolbarActionGroup;\n graph?: Graph;\n applyActiveIcon?: boolean;\n };\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,0CAAqC;AACrC,mBAAmG;AAEnG,sBAA0D;ACH1D,IAAAA,gBAAkB;AAGlB,sBAA2B;AAC3B,IAAAC,mBAAkD;AAClD,4BAAoC;AEJpC,kBAAgC;ACDhC,IAAAD,gBAAmC;AAEnC,IAAAC,mBAA0C;ACF1C,IAAAD,gBAAuC;AAEvC,IAAAC,mBAA0C;ACF1C,IAAAD,gBAA+B;AAE/B,IAAAC,mBAA0C;ACF1C,uBAA2E;ALApE,IAAMC,iBAAiB;AAE9B,IAAA,uBAAe;EACb;IACE,SAAS;MACP,CAACA,cAAAA,GAAiB,CAAC;IACrB;EACF;;ACJK,IAAMC,cAAc,CAACC,WAAAA;AAC1B,SAAO,OAAOA,OAAOC,YAAYC,eAAe,WAC5CF,OAAOC,WAAWC,aAClBF,OAAOC,YAAYC,iBAAaC,6BAAAA,CAAAA;AACtC;AFIO,IAAMC,cAAc,CAAC,EAC1BJ,OAAM,MAGP;AACC,QAAMK,WAAWN,YAAYC,MAAAA;AAC7B,QAAM,EAAEM,EAAC,QAAKC,iCAAeT,cAAAA;AAE7B,SACE,8BAAAU,QAAA,cAAA,cAAAA,QAAA,UAAA,MACE,8BAAAA,QAAA,cAACC,QAAAA;IAAKC,WAAU;SAAiBC,oCAAkBX,OAAOC,WAAYW,OAAON,CAAAA,CAAAA,GAC5ED,YAAY,8BAAAG,QAAA,cAACC,QAAAA;IAAKC,eAAWG,0BAAG,YAAYC,qCAAAA;SAAmBC,4BAAWV,QAAAA,EAAUW,KAAK,EAAA,CAAA,CAAA;AAGhG;ADPA,IAAMC,mBAAmB,CAAC,EACxBjB,QACAkB,QAAO,MAIR;AACC,QAAMC,kBAAcC,0BAAY,CAACC,UAAsBH,QAAQlB,QAAQqB,KAAAA,GAAQ;IAACrB;IAAQkB;GAAQ;AAChG,SACEV,6BAAAA,QAAA,cAACc,gBAAAA,aAAoBC,MAAI;IACvBL,SAASC;IACTK,YAAW;IACXC,UAAUzB,OAAOC,YAAYwB;IAC5B,GAAIzB,OAAOC,YAAYyB,UAAU;MAAE,eAAe1B,OAAOC,WAAWyB;IAAO;KAE3E1B,OAAOC,YAAY0B,QAAQnB,6BAAAA,QAAA,cAACoB,sBAAAA;IAAKD,MAAM3B,OAAOC,WAAY0B;IAAME,MAAM;MACvErB,6BAAAA,QAAA,cAACJ,aAAAA;IAAYJ;;AAGnB;AAEA,IAAM8B,mBAAmB,CAAC,EACxBC,iBACAC,SACAC,UACAC,qBACAC,kBACAC,UACAC,SAAQ,MACU;AAClB,QAAM,CAACC,iBAAiBC,kBAAAA,QAAsBC,0DAAqB;IACjEC,MAAMR;IACNS,aAAaX;IACbY,UAAUR;EACZ,CAAA;AAEA,QAAMS,wBAAoBxB,0BACxB,CAACpB,QAAoBqB,UAAAA;AACnB,QAAIrB,OAAOC,YAAYwB,UAAU;AAC/B;IACF;AACAJ,UAAMwB,gBAAe;AAErB,QAAIX,qBAAqB;AACvBA,0BAAoBY,UAAU;IAChC;AACAP,uBAAmB,KAAA;AACnBH,eAAWpC,MAAAA;EACb,GACA;IAACoC;GAAS;AAGZ,SACE5B,6BAAAA,QAAA,cAACc,gBAAAA,aAAoByB,MACf;IACFC,MAAMV;IACNW,cAAc,CAACC,aAAAA;AACb,UAAI,CAACA,YAAYhB,qBAAqB;AACpCA,4BAAoBY,UAAU;MAChC;AACA,aAAOP,mBAAmBW,QAAAA;IAC5B;EACF,GAECb,UACD7B,6BAAAA,QAAA,cAACc,gBAAAA,aAAoB6B,QAAM,MACzB3C,6BAAAA,QAAA,cAACc,gBAAAA,aAAoB8B,SAAO,MAC1B5C,6BAAAA,QAAA,cAACc,gBAAAA,aAAoB+B,UAAQ,MAC1BrB,SAASsB,IAAI,CAACtD,WAAWQ,6BAAAA,QAAA,cAACS,kBAAAA;IAAiBsC,KAAKvD,OAAOwD;IAAIxD;IAAgBkB,SAAS0B;QAEvFpC,6BAAAA,QAAA,cAACc,gBAAAA,aAAoBmC,OAAK,IAAA,CAAA,CAAA,CAAA;AAKpC;AAEO,IAAMC,eAAe;EAC1BX,MAAMjB;EACN6B,SAASrC,gBAAAA,aAAoBqC;EAC7BC,gBAAgBtC,gBAAAA,aAAoBsC;AACtC;AK1FO,IAAMC,sBAAsB,CAAC,EAAEC,aAAaC,OAAO3B,UAAU4B,gBAAe,MAA2B;AAC5G,QAAMC,kBAAcC,uBAAQ,MAAOH,QAAQA,MAAM/B,QAAQ8B,WAAAA,IAAe,CAAA,GAAqB;IAACA;IAAaC;GAAM;AACjH,QAAM,EAAEpC,MAAMwC,WAAW,MAAM1C,UAAUC,OAAM,IAAKoC,YAAY7D;AAChE,QAAMiC,0BAAsBkC,sBAAO,KAAA;AAEnC,SACE5D,8BAAAA,QAAA,cAACkD,aAAaX,MAAI;IAACf,SAASiC;IAAa7B;IAAoBF;KAC3D1B,8BAAAA,QAAA,cAACkD,aAAaC,SAAO;IAACU,SAAAA;KACpB7D,8BAAAA,QAAA,cAAC8D,iBAAAA,QAAeC,YAAU;IACxB1C,MAAM;IACN2C,SAAQ;IACRL;IACA1C;IACAE,MAAOqC,mBAAmBC,YAAYQ,KAAK,CAACzE,WAAW,CAAC,CAACA,OAAOC,WAAWyE,OAAO,GAAGzE,WAAW0B,QAASA;IACzGf,OAAOJ,8BAAAA,QAAA,cAACJ,aAAAA;MAAYJ,QAAQ8D;;IAC3B,GAAIpC,UAAU;MAAE,eAAeA;IAAO;IACvCQ;IACAyC,WAAAA;;AAKV;ACvBA,IAAMC,yBAAyB,CAAC,EAAE5E,OAAM,MAA0B;AAChE,QAAM,EAAE2B,MAAMwC,UAAU1C,SAAQ,IAAKzB,OAAOC;AAC5C,SACEO,8BAAAA,QAAA,cAAC8D,iBAAAA,QAAeO,qBAAmB;IACjCtB,KAAKvD,OAAOwD;IACZsB,OAAO9E,OAAOwD;IACd7B;IACAwC;IACA1C;IACAb,OAAOJ,8BAAAA,QAAA,cAACJ,aAAAA;MAAYJ;;;AAG1B;AAEO,IAAM+E,qBAAqB,CAAC,EAAEjB,aAAaC,MAAK,MAA2B;AAChF,QAAME,kBAAcC,cAAAA,SAAQ,MAAOH,QAASA,MAAM/B,QAAQ8B,WAAAA,IAAgC,CAAA,GAAK;IAACA;IAAaC;GAAM;AACnH,QAAM,EAAEiB,mBAAmBF,MAAK,IAAKhB,YAAY7D;AACjD;;;IAGEO,8BAAAA,QAAA,cAAC8D,iBAAAA,QAAeW,aAAW;MAACC,MAAMF;MAAmBF;OAClDb,YAAYX,IAAI,CAACtD,WAChBQ,8BAAAA,QAAA,cAACoE,wBAAAA;MAAuBrB,KAAKvD,OAAOwD;MAAIxD;;;AAIhD;AC7BO,IAAMmF,uBAAuB;AAM7B,IAAMC,cAAc,CAACC,SAA6CA,KAAKH,SAASC;AAQhF,IAAMG,SAAS,CAACD,SAA2CA,KAAKH,SAASK;AHThF,IAAMC,cAAc,CAAC,EACnBC,UACAzF,QACAoC,SAAQ,MAGT;AACC,QAAMjB,kBAAcC,cAAAA,aAAY,MAAA;AAC9BgB,eAAWpC,MAAAA;EACb,GAAG;IAACA;IAAQoC;GAAS;AACrB,QAAM,EAAET,MAAMwC,WAAW,MAAM1C,UAAUC,OAAM,IAAK1B,OAAOC;AAC3D,SACEO,8BAAAA,QAAA,cAAC8D,iBAAAA,QAAeC,YAAU;IACxBhB,KAAKvD,OAAOwD;IACZW;IACAK,SAAQ;IACR7C;IACAE,MAAM4D;IACN7E,OAAOJ,8BAAAA,QAAA,cAACJ,aAAAA;MAAYJ;;IACpByB;IACAP,SAASC;IACR,GAAIO,UAAU;MAAE,eAAeA;IAAO;;AAG7C;AAEO,IAAMgE,UAAU,CAAC,EAAE1D,SAAS2D,OAAOvD,UAAUqD,WAAW,GAAG1B,OAAO,GAAG6B,MAAAA,MAAqB;AAC/F,SACEpF,8BAAAA,QAAA,cAAC8D,iBAAAA,QAAevB,MAAS6C,OACtBD,OAAOrC,IAAI,CAACuC,MAAMC,MACjBV,YAAYS,IAAAA,IACVrF,8BAAAA,QAAA,cAAC8D,iBAAAA,QAAeyB,WAAS;IAACxC,KAAKuC;IAAGtB,SAASqB,KAAK5F,WAAWuE;OACzDc,OAAOO,IAAAA,IACTA,KAAK5F,WAAWuE,YAAY,iBAC1BhE,8BAAAA,QAAA,cAACqD,qBAAAA;IACCN,KAAKsC,KAAKrC;IACVM,aAAa+B;IACbzD;IACAqD;IACA1B;OAGFvD,8BAAAA,QAAA,cAACuE,oBAAAA;IACCxB,KAAKsC,KAAKrC;IACVM,aAAa+B;IACbzD;IACAqD;IACA1B;OAIJvD,8BAAAA,QAAA,cAACgF,aAAAA;IAAYjC,KAAKsC,KAAKrC;IAAIxD,QAAQ6F;IAAoBzD;IAAoBqD;;AAKrF;",
6
+ "names": ["import_react", "import_react_ui", "translationKey", "getShortcut", "action", "properties", "keyBinding", "getHostPlatform", "ActionLabel", "shortcut", "t", "useTranslation", "React", "span", "className", "toLocalizedString", "label", "mx", "descriptionText", "keySymbols", "join", "DropdownMenuItem", "onClick", "handleClick", "useCallback", "event", "NaturalDropdownMenu", "Item", "classNames", "disabled", "testId", "icon", "Icon", "size", "DropdownMenuRoot", "defaultMenuOpen", "actions", "menuOpen", "suppressNextTooltip", "onMenuOpenChange", "onAction", "children", "optionsMenuOpen", "setOptionsMenuOpen", "useControllableState", "prop", "defaultProp", "onChange", "handleActionClick", "stopPropagation", "current", "Root", "open", "onOpenChange", "nextOpen", "Portal", "Content", "Viewport", "map", "key", "id", "Arrow", "DropdownMenu", "Trigger", "VirtualTrigger", "ToolbarDropdownMenu", "actionGroup", "graph", "applyActiveIcon", "menuActions", "useMemo", "iconOnly", "useRef", "asChild", "NaturalToolbar", "IconButton", "variant", "find", "checked", "caretDown", "ToolbarToggleGroupItem", "ToggleGroupIconItem", "value", "ToolbarToggleGroup", "selectCardinality", "ToggleGroup", "type", "ToolbarSeparatorType", "isSeparator", "node", "isMenu", "ACTION_GROUP_TYPE", "ToolbarItem", "iconSize", "Toolbar", "items", "props", "item", "i", "Separator"]
7
+ }
@@ -0,0 +1 @@
1
+ {"inputs":{"packages/ui/react-ui-menu/src/translations.ts":{"bytes":909,"imports":[],"format":"esm"},"packages/ui/react-ui-menu/src/util.ts":{"bytes":1578,"imports":[{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-menu/src/components/ActionLabel.tsx":{"bytes":3310,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/keyboard","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-menu/src/translations.ts","kind":"import-statement","original":"../translations"},{"path":"packages/ui/react-ui-menu/src/util.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"packages/ui/react-ui-menu/src/components/DropdownMenu.tsx":{"bytes":9986,"imports":[{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-menu/src/components/ActionLabel.tsx","kind":"import-statement","original":"./ActionLabel"}],"format":"esm"},"packages/ui/react-ui-menu/src/components/Toolbar/ToolbarDropdownMenu.tsx":{"bytes":5223,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-menu/src/components/ActionLabel.tsx","kind":"import-statement","original":"../ActionLabel"},{"path":"packages/ui/react-ui-menu/src/components/DropdownMenu.tsx","kind":"import-statement","original":"../DropdownMenu"}],"format":"esm"},"packages/ui/react-ui-menu/src/components/Toolbar/ToolbarToggleGroup.tsx":{"bytes":4731,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-menu/src/components/ActionLabel.tsx","kind":"import-statement","original":"../ActionLabel"}],"format":"esm"},"packages/ui/react-ui-menu/src/components/Toolbar/defs.ts":{"bytes":3030,"imports":[{"path":"@dxos/app-graph","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-menu/src/components/Toolbar/Toolbar.tsx":{"bytes":7348,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-menu/src/components/Toolbar/ToolbarDropdownMenu.tsx","kind":"import-statement","original":"./ToolbarDropdownMenu"},{"path":"packages/ui/react-ui-menu/src/components/Toolbar/ToolbarToggleGroup.tsx","kind":"import-statement","original":"./ToolbarToggleGroup"},{"path":"packages/ui/react-ui-menu/src/components/Toolbar/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/ui/react-ui-menu/src/components/ActionLabel.tsx","kind":"import-statement","original":"../ActionLabel"}],"format":"esm"},"packages/ui/react-ui-menu/src/components/Toolbar/index.ts":{"bytes":595,"imports":[{"path":"packages/ui/react-ui-menu/src/components/Toolbar/Toolbar.tsx","kind":"import-statement","original":"./Toolbar"},{"path":"packages/ui/react-ui-menu/src/components/Toolbar/defs.ts","kind":"import-statement","original":"./defs"}],"format":"esm"},"packages/ui/react-ui-menu/src/components/index.ts":{"bytes":607,"imports":[{"path":"packages/ui/react-ui-menu/src/components/DropdownMenu.tsx","kind":"import-statement","original":"./DropdownMenu"},{"path":"packages/ui/react-ui-menu/src/components/Toolbar/index.ts","kind":"import-statement","original":"./Toolbar"}],"format":"esm"},"packages/ui/react-ui-menu/src/defs.ts":{"bytes":1144,"imports":[],"format":"esm"},"packages/ui/react-ui-menu/src/index.ts":{"bytes":583,"imports":[{"path":"packages/ui/react-ui-menu/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/ui/react-ui-menu/src/defs.ts","kind":"import-statement","original":"./defs"}],"format":"esm"}},"outputs":{"packages/ui/react-ui-menu/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":18403},"packages/ui/react-ui-menu/dist/lib/node/index.cjs":{"imports":[{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/keyboard","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/app-graph","kind":"import-statement","external":true}],"exports":["DropdownMenu","Toolbar","ToolbarSeparatorType","isMenu","isSeparator"],"entryPoint":"packages/ui/react-ui-menu/src/index.ts","inputs":{"packages/ui/react-ui-menu/src/components/DropdownMenu.tsx":{"bytesInOutput":2296},"packages/ui/react-ui-menu/src/components/ActionLabel.tsx":{"bytesInOutput":667},"packages/ui/react-ui-menu/src/translations.ts":{"bytesInOutput":118},"packages/ui/react-ui-menu/src/util.ts":{"bytesInOutput":225},"packages/ui/react-ui-menu/src/components/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-menu/src/components/Toolbar/Toolbar.tsx":{"bytesInOutput":1503},"packages/ui/react-ui-menu/src/components/Toolbar/ToolbarDropdownMenu.tsx":{"bytesInOutput":1096},"packages/ui/react-ui-menu/src/components/Toolbar/ToolbarToggleGroup.tsx":{"bytesInOutput":1069},"packages/ui/react-ui-menu/src/components/Toolbar/defs.ts":{"bytesInOutput":236},"packages/ui/react-ui-menu/src/components/Toolbar/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-menu/src/index.ts":{"bytesInOutput":0}},"bytes":8013}}}