@dxos/react-ui-menu 0.8.3-staging.0fa589b → 0.8.4-main.1da679c

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 (46) hide show
  1. package/dist/lib/browser/index.mjs +123 -41
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +123 -41
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/builder.d.ts +14 -0
  8. package/dist/types/src/builder.d.ts.map +1 -0
  9. package/dist/types/src/components/ActionLabel.d.ts +1 -1
  10. package/dist/types/src/components/ActionLabel.d.ts.map +1 -1
  11. package/dist/types/src/components/DropdownMenu.d.ts +1 -1
  12. package/dist/types/src/components/DropdownMenu.d.ts.map +1 -1
  13. package/dist/types/src/components/MenuContext.d.ts.map +1 -1
  14. package/dist/types/src/components/ToolbarMenu.d.ts +1 -1
  15. package/dist/types/src/components/ToolbarMenu.d.ts.map +1 -1
  16. package/dist/types/src/components/{Menus.stories.d.ts → ToolbarMenu.stories.d.ts} +10 -14
  17. package/dist/types/src/components/ToolbarMenu.stories.d.ts.map +1 -0
  18. package/dist/types/src/hooks/useMenuActions.d.ts.map +1 -1
  19. package/dist/types/src/index.d.ts +1 -0
  20. package/dist/types/src/index.d.ts.map +1 -1
  21. package/dist/types/src/testing/generator.d.ts +2 -2
  22. package/dist/types/src/testing/generator.d.ts.map +1 -1
  23. package/dist/types/src/translations.d.ts +3 -4
  24. package/dist/types/src/translations.d.ts.map +1 -1
  25. package/dist/types/src/types.d.ts +2 -2
  26. package/dist/types/src/types.d.ts.map +1 -1
  27. package/dist/types/src/util.d.ts +1 -1
  28. package/dist/types/src/util.d.ts.map +1 -1
  29. package/dist/types/tsconfig.tsbuildinfo +1 -1
  30. package/package.json +19 -17
  31. package/src/builder.ts +62 -0
  32. package/src/components/ActionLabel.tsx +4 -5
  33. package/src/components/DropdownMenu.tsx +6 -3
  34. package/src/components/MenuContext.tsx +1 -1
  35. package/src/components/{Menus.stories.tsx → ToolbarMenu.stories.tsx} +19 -11
  36. package/src/components/ToolbarMenu.tsx +34 -24
  37. package/src/hooks/useMenuActions.ts +1 -1
  38. package/src/index.ts +1 -0
  39. package/src/testing/generator.ts +4 -4
  40. package/src/translations.ts +5 -3
  41. package/src/types.ts +2 -2
  42. package/src/util.ts +1 -1
  43. package/dist/lib/node/index.cjs +0 -506
  44. package/dist/lib/node/index.cjs.map +0 -7
  45. package/dist/lib/node/meta.json +0 -1
  46. package/dist/types/src/components/Menus.stories.d.ts.map +0 -1
@@ -1,22 +1,22 @@
1
- // packages/ui/react-ui-menu/src/index.ts
1
+ // src/index.ts
2
2
  import { rxFromSignal } from "@dxos/app-graph";
3
3
 
4
- // packages/ui/react-ui-menu/src/components/DropdownMenu.tsx
4
+ // src/components/DropdownMenu.tsx
5
5
  import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
6
6
  import { useControllableState } from "@radix-ui/react-use-controllable-state";
7
7
  import React3, { useCallback } from "react";
8
- import { DropdownMenu as NaturalDropdownMenu, Icon } from "@dxos/react-ui";
8
+ import { Icon, DropdownMenu as NaturalDropdownMenu } from "@dxos/react-ui";
9
9
 
10
- // packages/ui/react-ui-menu/src/components/ActionLabel.tsx
10
+ // src/components/ActionLabel.tsx
11
11
  import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
12
12
  import React from "react";
13
13
  import { keySymbols } from "@dxos/keyboard";
14
14
  import { toLocalizedString, useTranslation } from "@dxos/react-ui";
15
- import { mx, descriptionText } from "@dxos/react-ui-theme";
15
+ import { descriptionText, mx } from "@dxos/react-ui-theme";
16
16
 
17
- // packages/ui/react-ui-menu/src/translations.ts
18
- var translationKey = "menus";
19
- var translations_default = [
17
+ // src/translations.ts
18
+ var translationKey = "react-ui-menu";
19
+ var translations = [
20
20
  {
21
21
  "en-US": {
22
22
  [translationKey]: {}
@@ -24,7 +24,7 @@ var translations_default = [
24
24
  }
25
25
  ];
26
26
 
27
- // packages/ui/react-ui-menu/src/util.ts
27
+ // src/util.ts
28
28
  import { ACTION_GROUP_TYPE, ACTION_TYPE, actionGroupSymbol } from "@dxos/app-graph";
29
29
  import { getHostPlatform } from "@dxos/util";
30
30
  var getShortcut = (action) => {
@@ -79,12 +79,12 @@ var createLineSeparator = (id = "line", source = "root") => ({
79
79
  ]
80
80
  });
81
81
 
82
- // packages/ui/react-ui-menu/src/components/ActionLabel.tsx
82
+ // src/components/ActionLabel.tsx
83
83
  var ActionLabel = ({ action }) => {
84
84
  var _effect = _useSignals();
85
85
  try {
86
- const shortcut = getShortcut(action);
87
86
  const { t } = useTranslation(translationKey);
87
+ const shortcut = getShortcut(action);
88
88
  return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("span", {
89
89
  className: "grow truncate"
90
90
  }, toLocalizedString(action.properties.label, t)), shortcut && /* @__PURE__ */ React.createElement("span", {
@@ -99,7 +99,7 @@ var actionLabel = (action, t) => {
99
99
  return `${toLocalizedString(action.properties.label, t)}${shortcut ? ` (${keySymbols(shortcut).join("")})` : ""}`;
100
100
  };
101
101
 
102
- // packages/ui/react-ui-menu/src/components/MenuContext.tsx
102
+ // src/components/MenuContext.tsx
103
103
  import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
104
104
  import { createContextScope } from "@radix-ui/react-context";
105
105
  import React2, { useMemo } from "react";
@@ -134,7 +134,7 @@ var useMenuItems = (group, propsItems, consumerName = "useMenuItemConsumer", __m
134
134
  ]);
135
135
  };
136
136
 
137
- // packages/ui/react-ui-menu/src/components/DropdownMenu.tsx
137
+ // src/components/DropdownMenu.tsx
138
138
  var DropdownMenuItem = ({ item, onClick, __menuScope }) => {
139
139
  var _effect = _useSignals3();
140
140
  try {
@@ -203,20 +203,20 @@ var DropdownMenu = {
203
203
  VirtualTrigger: NaturalDropdownMenu.VirtualTrigger
204
204
  };
205
205
 
206
- // packages/ui/react-ui-menu/src/components/ToolbarMenu.tsx
206
+ // src/components/ToolbarMenu.tsx
207
207
  import { useSignals as _useSignals4 } from "@preact-signals/safe-react/tracking";
208
208
  import React4, { Fragment, useCallback as useCallback2 } from "react";
209
209
  import { Icon as Icon2, Toolbar as NaturalToolbar, useTranslation as useTranslation2 } from "@dxos/react-ui";
210
210
  import { useAttention } from "@dxos/react-ui-attention";
211
211
  import { mx as mx2, textBlockWidth, toolbarLayout } from "@dxos/react-ui-theme";
212
212
 
213
- // packages/ui/react-ui-menu/src/types.ts
213
+ // src/types.ts
214
214
  import { ACTION_GROUP_TYPE as ACTION_GROUP_TYPE2 } from "@dxos/app-graph";
215
215
  var MenuSeparatorType = "@dxos/react-ui-toolbar/separator";
216
216
  var isSeparator = (node) => node.type === MenuSeparatorType;
217
217
  var isMenuGroup = (node) => node.type === ACTION_GROUP_TYPE2;
218
218
 
219
- // packages/ui/react-ui-menu/src/components/ToolbarMenu.tsx
219
+ // src/components/ToolbarMenu.tsx
220
220
  var ActionToolbarItem = ({ action, __menuScope }) => {
221
221
  var _effect = _useSignals4();
222
222
  try {
@@ -341,7 +341,7 @@ var ToggleGroupToolbarItem = ({ group, items: propsItems, __menuScope }) => {
341
341
  const items = useMenuItems(group, propsItems, "ToggleGroupToolbarItem", __menuScope);
342
342
  const { selectCardinality, value } = group.properties;
343
343
  return (
344
- // TODO(thure): The type here is difficult to manage, what do?
344
+ // TODO(thure): Fix.
345
345
  // @ts-ignore
346
346
  /* @__PURE__ */ React4.createElement(
347
347
  NaturalToolbar.ToggleGroup,
@@ -370,7 +370,7 @@ var ToolbarMenu = ({ __menuScope, classNames, textBlockWidth: wrapContents, ...p
370
370
  const InnerRoot = wrapContents ? "div" : Fragment;
371
371
  const innerRootProps = wrapContents ? {
372
372
  role: "none",
373
- className: mx2(textBlockWidth, toolbarLayout)
373
+ className: mx2(textBlockWidth, toolbarLayout, "bs-full")
374
374
  } : {};
375
375
  return /* @__PURE__ */ React4.createElement(NaturalToolbar.Root, {
376
376
  ...props,
@@ -379,34 +379,42 @@ var ToolbarMenu = ({ __menuScope, classNames, textBlockWidth: wrapContents, ...p
379
379
  attendableId && !hasAttention && "*:opacity-20 !bg-transparent",
380
380
  classNames
381
381
  ]
382
- }, /* @__PURE__ */ React4.createElement(InnerRoot, innerRootProps, items?.map((item, i) => isSeparator(item) ? /* @__PURE__ */ React4.createElement(NaturalToolbar.Separator, {
383
- key: i,
384
- variant: item.properties.variant
385
- }) : isMenuGroup(item) ? item.properties.variant === "dropdownMenu" ? (
386
- // TODO(thure): Figure out type narrowing that doesn’t require so much use of `as`.
387
- /* @__PURE__ */ React4.createElement(DropdownMenuToolbarItem, {
388
- key: item.id,
389
- group: item
390
- })
391
- ) : (
392
- // TODO(thure): Figure out type narrowing that doesn’t require so much use of `as`.
393
- /* @__PURE__ */ React4.createElement(ToggleGroupToolbarItem, {
394
- key: item.id,
395
- group: item
396
- })
397
- ) : (
398
- // TODO(thure): Figure out type narrowing that doesn’t require so much use of `as`.
399
- /* @__PURE__ */ React4.createElement(ActionToolbarItem, {
400
- key: item.id,
401
- action: item
402
- })
403
- ))));
382
+ }, /* @__PURE__ */ React4.createElement(InnerRoot, innerRootProps, items?.map((item, i) => /* @__PURE__ */ React4.createElement(ToolbarMenuItem, {
383
+ key: item.id ?? i,
384
+ item
385
+ }))));
386
+ } finally {
387
+ _effect.f();
388
+ }
389
+ };
390
+ var ToolbarMenuItem = ({ item }) => {
391
+ var _effect = _useSignals4();
392
+ try {
393
+ if (isSeparator(item)) {
394
+ return /* @__PURE__ */ React4.createElement(NaturalToolbar.Separator, {
395
+ variant: item.properties.variant
396
+ });
397
+ }
398
+ if (isMenuGroup(item)) {
399
+ if (item.properties.variant === "dropdownMenu") {
400
+ return /* @__PURE__ */ React4.createElement(DropdownMenuToolbarItem, {
401
+ group: item
402
+ });
403
+ } else {
404
+ return /* @__PURE__ */ React4.createElement(ToggleGroupToolbarItem, {
405
+ group: item
406
+ });
407
+ }
408
+ }
409
+ return /* @__PURE__ */ React4.createElement(ActionToolbarItem, {
410
+ action: item
411
+ });
404
412
  } finally {
405
413
  _effect.f();
406
414
  }
407
415
  };
408
416
 
409
- // packages/ui/react-ui-menu/src/hooks/useMenuActions.ts
417
+ // src/hooks/useMenuActions.ts
410
418
  import { RegistryContext, useRxValue } from "@effect-rx/rx-react";
411
419
  import { useCallback as useCallback3, useContext, useEffect, useState } from "react";
412
420
  import { Graph, ROOT_ID } from "@dxos/app-graph";
@@ -459,8 +467,82 @@ var useMenuActions = (props) => {
459
467
  useGroupItems
460
468
  };
461
469
  };
470
+
471
+ // src/builder.ts
472
+ import { invariant } from "@dxos/invariant";
473
+ function _define_property(obj, key, value) {
474
+ if (key in obj) {
475
+ Object.defineProperty(obj, key, {
476
+ value,
477
+ enumerable: true,
478
+ configurable: true,
479
+ writable: true
480
+ });
481
+ } else {
482
+ obj[key] = value;
483
+ }
484
+ return obj;
485
+ }
486
+ var __dxlog_file = "/__w/dxos/dxos/packages/ui/react-ui-menu/src/builder.ts";
487
+ var MenuBuilder = Object.freeze({
488
+ make: () => new MenuBuilderImpl({
489
+ nodes: [],
490
+ edges: []
491
+ }, "root")
492
+ });
493
+ var MenuBuilderImpl = class _MenuBuilderImpl {
494
+ root(props) {
495
+ invariant(this._rootId === "root", "Root group can only be at the top level", {
496
+ F: __dxlog_file,
497
+ L: 36,
498
+ S: this,
499
+ A: [
500
+ "this._rootId === 'root'",
501
+ "'Root group can only be at the top level'"
502
+ ]
503
+ });
504
+ invariant(this._data.nodes.find((node) => node.id === "root") === void 0, "Root group can only be created once", {
505
+ F: __dxlog_file,
506
+ L: 37,
507
+ S: this,
508
+ A: [
509
+ "this._data.nodes.find((node) => node.id === 'root') === undefined",
510
+ "'Root group can only be created once'"
511
+ ]
512
+ });
513
+ this._data.nodes.push(createMenuItemGroup("root", props));
514
+ return this;
515
+ }
516
+ action(id, props, invoke) {
517
+ this._data.nodes.push(createMenuAction(id, invoke, props));
518
+ this._data.edges.push({
519
+ source: this._rootId,
520
+ target: id
521
+ });
522
+ return this;
523
+ }
524
+ group(id, props, cb) {
525
+ this._data.nodes.push(createMenuItemGroup(id, props));
526
+ this._data.edges.push({
527
+ source: this._rootId,
528
+ target: id
529
+ });
530
+ cb(new _MenuBuilderImpl(this._data, id));
531
+ return this;
532
+ }
533
+ build() {
534
+ return this._data;
535
+ }
536
+ constructor(_data, _rootId) {
537
+ _define_property(this, "_data", void 0);
538
+ _define_property(this, "_rootId", void 0);
539
+ this._data = _data;
540
+ this._rootId = _rootId;
541
+ }
542
+ };
462
543
  export {
463
544
  DropdownMenu,
545
+ MenuBuilder,
464
546
  MenuProvider,
465
547
  MenuSeparatorType,
466
548
  ToolbarMenu,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/index.ts", "../../../src/components/DropdownMenu.tsx", "../../../src/components/ActionLabel.tsx", "../../../src/translations.ts", "../../../src/util.ts", "../../../src/components/MenuContext.tsx", "../../../src/components/ToolbarMenu.tsx", "../../../src/types.ts", "../../../src/hooks/useMenuActions.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nexport { rxFromSignal } from '@dxos/app-graph';\n\nexport * from './components';\nexport * from './hooks';\nexport * from './types';\nexport { createMenuAction, createMenuItemGroup, createLineSeparator, createGapSeparator } from './util';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, { type MouseEvent, useCallback } from 'react';\n\nimport { DropdownMenu as NaturalDropdownMenu, Icon, type DropdownMenuRootProps } from '@dxos/react-ui';\n\nimport { ActionLabel } from './ActionLabel';\nimport { type MenuScopedProps, useMenu, useMenuItems } from './MenuContext';\nimport { type MenuAction, type MenuItem, type MenuItemGroup } from '../types';\n\nexport type DropdownMenuProps = DropdownMenuRootProps & {\n group?: MenuItemGroup;\n items?: MenuItem[];\n caller?: string;\n};\n\nconst DropdownMenuItem = ({\n item,\n onClick,\n __menuScope,\n}: MenuScopedProps<{\n item: MenuItem;\n onClick: (action: MenuAction, event: MouseEvent) => void;\n}>) => {\n // TODO(thure): handle other items.\n const action = item as MenuAction;\n const handleClick = useCallback((event: MouseEvent) => onClick(action, event), [action, onClick]);\n const { iconSize } = useMenu('DropdownMenuItem', __menuScope);\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={iconSize} />}\n <ActionLabel action={action} />\n </NaturalDropdownMenu.Item>\n );\n};\n\nconst DropdownMenuRoot = ({\n items: propsItems,\n group,\n open,\n defaultOpen,\n onOpenChange,\n caller,\n children,\n __menuScope,\n ...naturalProps\n}: MenuScopedProps<DropdownMenuProps>) => {\n const [optionsMenuOpen, setOptionsMenuOpen] = useControllableState({\n prop: open,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\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 setOptionsMenuOpen(false);\n void action.data?.({ parent: group, caller });\n },\n [group, caller],\n );\n\n const items = useMenuItems(group, propsItems);\n\n return (\n <NaturalDropdownMenu.Root open={optionsMenuOpen} onOpenChange={setOptionsMenuOpen} {...naturalProps}>\n {children}\n <NaturalDropdownMenu.Portal>\n <NaturalDropdownMenu.Content>\n <NaturalDropdownMenu.Viewport>\n {items?.map((item) => <DropdownMenuItem key={item.id} item={item} 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 as GraphAction, type ActionGroup } from '@dxos/app-graph';\nimport { keySymbols } from '@dxos/keyboard';\nimport { toLocalizedString, useTranslation, type TFunction } from '@dxos/react-ui';\nimport { mx, descriptionText } from '@dxos/react-ui-theme';\n\nimport { translationKey } from '../translations';\nimport { type MenuActionProperties } from '../types';\nimport { getShortcut } from '../util';\n\ntype Action = GraphAction<MenuActionProperties> | ActionGroup<Omit<MenuActionProperties, 'variant'>>;\n\nexport const ActionLabel = ({ action }: { action: Action }) => {\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\nexport const actionLabel = (action: Action, t: TFunction) => {\n const shortcut = getShortcut(action);\n return `${toLocalizedString(action.properties!.label, t)}${shortcut ? ` (${keySymbols(shortcut).join('')})` : ''}`;\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 { ACTION_GROUP_TYPE, ACTION_TYPE, actionGroupSymbol, type ActionLike } from '@dxos/app-graph';\nimport { getHostPlatform } from '@dxos/util';\n\nimport {\n type MenuAction,\n type MenuActionProperties,\n type MenuItemGroup,\n type MenuItemGroupProperties,\n type MenuSeparator,\n} from './types';\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\nexport const createMenuAction = <P extends {} = {}>(\n id: string,\n invoke: () => void,\n properties: P & MenuActionProperties,\n) =>\n ({\n id,\n type: ACTION_TYPE,\n properties,\n data: invoke,\n }) satisfies MenuAction;\n\nexport const createMenuItemGroup = <\n P extends MenuItemGroupProperties = MenuItemGroupProperties & Partial<MenuActionProperties>,\n>(\n id: string,\n properties: P,\n) =>\n ({\n id,\n type: ACTION_GROUP_TYPE,\n properties,\n data: actionGroupSymbol,\n }) satisfies MenuItemGroup;\n\nexport const createGapSeparator = (id: string = 'gap', source: string = 'root') => ({\n nodes: [\n {\n id,\n type: '@dxos/react-ui-toolbar/separator',\n properties: { variant: 'gap' },\n data: undefined as never,\n } satisfies MenuSeparator,\n ],\n edges: [{ source, target: id }],\n});\n\nexport const createLineSeparator = (id: string = 'line', source: string = 'root') => ({\n nodes: [\n {\n id,\n type: '@dxos/react-ui-toolbar/separator',\n properties: { variant: 'line' },\n data: undefined as never,\n } satisfies MenuSeparator,\n ],\n edges: [{ source, target: id }],\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContextScope, type Scope } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, useMemo } from 'react';\n\nimport { type MenuContextValue, type MenuItem, type MenuItemGroup } from '../types';\n\nexport type MenuScopedProps<P> = P & { __menuScope?: Scope };\n\nconst MENU_NAME = 'GraphMenu';\n\nconst [createMenuContext, createMenuScope] = createContextScope(MENU_NAME, []);\n\nconst [MenuContextProvider, useMenu] = createMenuContext<MenuContextValue>(MENU_NAME);\n\nexport const menuContextDefaults: MenuContextValue = {\n iconSize: 5,\n useGroupItems: () => null,\n};\n\nconst useMenuScope = createMenuScope();\n\nconst MenuProvider = ({\n children,\n useGroupItems = menuContextDefaults.useGroupItems,\n iconSize = menuContextDefaults.iconSize,\n attendableId,\n}: PropsWithChildren<Partial<MenuContextValue>>) => {\n const { scope } = useMenuScope(undefined);\n return (\n <MenuContextProvider useGroupItems={useGroupItems} iconSize={iconSize} attendableId={attendableId} scope={scope}>\n {children}\n </MenuContextProvider>\n );\n};\n\nexport const useMenuItems = (\n group?: MenuItemGroup,\n propsItems?: MenuItem[],\n consumerName: string = 'useMenuItemConsumer',\n __menuScope?: Scope,\n) => {\n const { useGroupItems } = useMenu(consumerName, __menuScope);\n const groupItems = useGroupItems(group);\n return useMemo(() => propsItems ?? groupItems ?? undefined, [propsItems, groupItems]);\n};\n\nexport { useMenu, createMenuScope, MenuProvider };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { Fragment, useCallback } from 'react';\n\nimport { Icon, Toolbar as NaturalToolbar, type ToolbarRootProps, useTranslation } from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport { mx, textBlockWidth, toolbarLayout } from '@dxos/react-ui-theme';\n\nimport { actionLabel, ActionLabel } from './ActionLabel';\nimport { DropdownMenu } from './DropdownMenu';\nimport { type MenuScopedProps, useMenu, useMenuItems } from './MenuContext';\nimport { translationKey } from '../translations';\nimport {\n type MenuAction,\n type MenuItem,\n isMenuGroup,\n isSeparator,\n type MenuItemGroup,\n type MenuActionProperties,\n type MenuMultipleSelectActionGroup,\n type MenuSingleSelectActionGroup,\n} from '../types';\n\nexport type ToolbarMenuDropdownMenuActionGroup = Omit<MenuActionProperties, 'variant' | 'icon'> & {\n variant: 'dropdownMenu';\n icon: string;\n applyActive?: boolean;\n};\n\nexport type ToolbarMenuToggleGroupActionGroup = Omit<MenuActionProperties, 'variant'> & {\n variant: 'toggleGroup';\n};\n\nexport type ToolbarMenuActionGroupProperties = (\n | ToolbarMenuDropdownMenuActionGroup\n | ToolbarMenuToggleGroupActionGroup\n) &\n (MenuSingleSelectActionGroup | MenuMultipleSelectActionGroup);\n\nexport type ToolbarMenuProps = ToolbarRootProps & { textBlockWidth?: boolean };\n\nexport type ToolbarMenuActionGroupProps = {\n group: MenuItemGroup<ToolbarMenuActionGroupProperties>;\n items?: MenuItem[];\n};\n\nexport type ToolbarMenuActionProps = {\n group: MenuItemGroup<ToolbarMenuActionGroupProperties>;\n action: MenuAction;\n};\n\nconst ActionToolbarItem = ({ action, __menuScope }: MenuScopedProps<{ action: MenuAction }>) => {\n const { iconSize } = useMenu('ActionToolbarItem', __menuScope);\n const { t } = useTranslation(translationKey);\n const handleClick = useCallback(() => action.data?.(), [action]);\n const { icon, iconOnly = true, disabled, testId, hidden, classNames } = action.properties;\n const Root = icon ? NaturalToolbar.IconButton : NaturalToolbar.Button;\n const rootProps = icon\n ? { icon, size: iconSize, iconOnly, label: actionLabel(action, t) }\n : { children: <ActionLabel action={action} /> };\n return hidden ? null : (\n <Root\n key={action.id}\n disabled={disabled}\n onClick={handleClick}\n variant='ghost'\n {...(testId && { 'data-testid': testId })}\n {...(rootProps as any)}\n classNames={classNames}\n />\n );\n};\n\nconst DropdownMenuToolbarItem = ({\n group,\n items: propsItems,\n __menuScope,\n}: MenuScopedProps<ToolbarMenuActionGroupProps>) => {\n const { iconOnly, disabled, testId } = group.properties;\n const { t } = useTranslation(translationKey);\n const { iconSize } = useMenu('DropdownMenuToolbarItem', __menuScope);\n const items = useMenuItems(group, propsItems, 'DropdownMenuToolbarItem', __menuScope);\n const activeItem = items?.find((item) => !!(item as MenuAction).properties.checked);\n const icon =\n ((group.properties as any).applyActive &&\n // TODO(thure): Handle other menu item types.\n (activeItem as MenuAction)?.properties.icon) ||\n group.properties.icon;\n const Root = icon ? NaturalToolbar.IconButton : NaturalToolbar.Button;\n const labelAction = (group.properties as any).applyActive && activeItem ? (activeItem as MenuAction) : group;\n const rootProps = icon\n ? { icon, size: iconSize, iconOnly, label: actionLabel(labelAction, t), caretDown: true }\n : {\n children: (\n <>\n <ActionLabel action={labelAction} />\n <Icon size={3} icon='ph--caret-down--bold' classNames='mis-1' />\n </>\n ),\n };\n return (\n <DropdownMenu.Root group={group} items={items}>\n <DropdownMenu.Trigger asChild>\n <Root variant='ghost' disabled={disabled} {...(rootProps as any)} {...(testId && { 'data-testid': testId })} />\n </DropdownMenu.Trigger>\n </DropdownMenu.Root>\n );\n};\n\nconst ToggleGroupItem = ({ group, action, __menuScope }: MenuScopedProps<ToolbarMenuActionProps>) => {\n const { iconSize } = useMenu('ToggleGroupItem', __menuScope);\n const { t } = useTranslation(translationKey);\n const { icon, iconOnly = true, disabled, testId, hidden, classNames } = action.properties;\n const handleClick = useCallback(() => action.data?.({ parent: group }), [action, group]);\n const Root = icon ? NaturalToolbar.ToggleGroupIconItem : NaturalToolbar.ToggleGroupItem;\n const rootProps = icon\n ? { icon, size: iconSize, iconOnly, label: actionLabel(action, t) }\n : { children: <ActionLabel action={action} /> };\n return hidden ? null : (\n <Root\n key={action.id}\n value={action.id as any}\n disabled={disabled}\n onClick={handleClick}\n variant='ghost'\n {...(testId && { 'data-testid': testId })}\n {...(rootProps as any)}\n classNames={classNames}\n />\n );\n};\n\nconst ToggleGroupToolbarItem = ({\n group,\n items: propsItems,\n __menuScope,\n}: MenuScopedProps<ToolbarMenuActionGroupProps>) => {\n const items = useMenuItems(group, propsItems, 'ToggleGroupToolbarItem', __menuScope);\n const { selectCardinality, value } = group.properties;\n return (\n // TODO(thure): The type here is difficult to manage, what do?\n // @ts-ignore\n <NaturalToolbar.ToggleGroup type={selectCardinality} value={value}>\n {\n // TODO(thure): Handle other menu item types.\n (items as MenuAction[]).map((action) => (\n <ToggleGroupItem key={action.id} group={group} action={action} />\n ))\n }\n </NaturalToolbar.ToggleGroup>\n );\n};\n\nexport const ToolbarMenu = ({\n __menuScope,\n classNames,\n textBlockWidth: wrapContents,\n ...props\n}: MenuScopedProps<ToolbarMenuProps>) => {\n const items = useMenuItems(undefined, undefined, 'ToolbarMenu', __menuScope);\n const { attendableId } = useMenu('ToolbarMenu', __menuScope);\n const { hasAttention } = useAttention(attendableId);\n const InnerRoot = wrapContents ? 'div' : Fragment;\n const innerRootProps = wrapContents ? { role: 'none', className: mx(textBlockWidth, toolbarLayout) } : {};\n return (\n <NaturalToolbar.Root\n {...props}\n layoutManaged={wrapContents}\n classNames={[attendableId && !hasAttention && '*:opacity-20 !bg-transparent', classNames]}\n >\n <InnerRoot {...innerRootProps}>\n {items?.map((item: MenuItem, i: number) =>\n isSeparator(item) ? (\n <NaturalToolbar.Separator key={i} variant={item.properties.variant} />\n ) : isMenuGroup(item) ? (\n item.properties.variant === 'dropdownMenu' ? (\n // TODO(thure): Figure out type narrowing that doesn’t require so much use of `as`.\n <DropdownMenuToolbarItem key={item.id} group={item as MenuItemGroup<ToolbarMenuActionGroupProperties>} />\n ) : (\n // TODO(thure): Figure out type narrowing that doesn’t require so much use of `as`.\n <ToggleGroupToolbarItem key={item.id} group={item as MenuItemGroup<ToolbarMenuActionGroupProperties>} />\n )\n ) : (\n // TODO(thure): Figure out type narrowing that doesn’t require so much use of `as`.\n <ActionToolbarItem key={item.id} action={item as MenuAction} />\n ),\n )}\n </InnerRoot>\n </NaturalToolbar.Root>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Node, type Action, type ActionGroup, ACTION_GROUP_TYPE } from '@dxos/app-graph';\nimport { type ToolbarSeparatorProps, type Label, type IconButtonProps, type ClassNameValue } from '@dxos/react-ui';\n\nexport type MenuActionProperties = {\n label: Label;\n icon?: string;\n value?: string;\n disabled?: boolean;\n hidden?: boolean;\n iconOnly?: boolean;\n testId?: string;\n variant?: 'action' | 'toggle';\n checked?: boolean;\n classNames?: ClassNameValue;\n};\n\nexport type MenuItemGroupProperties = {\n label: Label;\n icon?: string;\n iconOnly?: boolean;\n};\n\nexport type MenuAction<P extends {} = {}> = Action<P & MenuActionProperties>;\n\nexport const MenuSeparatorType = '@dxos/react-ui-toolbar/separator' as const;\n\nexport type MenuSeparator = Node<never, Pick<ToolbarSeparatorProps, 'variant'>> & {\n type: typeof MenuSeparatorType;\n};\n\nexport const isSeparator = (node: Node): node is MenuSeparator => node.type === MenuSeparatorType;\n\nexport type MenuSingleSelectActionGroup = { selectCardinality: 'single'; value: string };\nexport type MenuMultipleSelectActionGroup = { selectCardinality: 'multiple'; value: string[] };\n\nexport type MenuItemGroup<P extends Record<string, any> = Record<string, any>> = ActionGroup<P>;\n\nexport const isMenuGroup = (node: Node): node is MenuItemGroup => node.type === ACTION_GROUP_TYPE;\n\nexport type MenuItem = MenuSeparator | MenuAction | MenuItemGroup;\n\nexport type MenuItemsResolver = (group?: MenuItemGroup) => MenuItem[] | null;\n\nexport type MenuContextValue = {\n useGroupItems: MenuItemsResolver;\n iconSize: IconButtonProps['size'];\n attendableId?: string;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { RegistryContext, type Rx, useRxValue } from '@effect-rx/rx-react';\nimport { useCallback, useContext, useEffect, useState } from 'react';\n\nimport { type Edge, type Edges, Graph, type NodeArg, type Node, ROOT_ID } from '@dxos/app-graph';\n\nimport { type MenuItem, type MenuItemGroup } from '../types';\n\nconst edgesArrayToRecord = (edges: Edge[]): Record<string, Edges> => {\n return Object.fromEntries(\n Object.entries(\n edges.reduce((acc: Record<string, { inbound: string[]; outbound: string[] }>, { source, target }) => {\n if (!acc[source]) {\n acc[source] = { inbound: [], outbound: [] };\n }\n if (!acc[target]) {\n acc[target] = { inbound: [], outbound: [] };\n }\n\n const sourceEdges = acc[source];\n if (!sourceEdges.outbound.includes(target)) {\n sourceEdges.outbound.push(target);\n }\n\n const targetEdges = acc[target];\n if (!targetEdges.inbound.includes(source)) {\n targetEdges.inbound.push(source);\n }\n\n return acc;\n }, {}),\n ),\n );\n};\n\nexport type ActionGraphNodes = NodeArg<any>[];\nexport type ActionGraphEdges = Edge[];\nexport type ActionGraphProps = { nodes: ActionGraphNodes; edges: ActionGraphEdges };\n\nexport const useMenuActions = (props: Rx.Rx<ActionGraphProps>) => {\n const registry = useContext(RegistryContext);\n const menuGraphProps = useRxValue(props);\n\n const [graph] = useState(\n new Graph({\n registry,\n nodes: menuGraphProps.nodes as Node[],\n edges: edgesArrayToRecord(menuGraphProps.edges),\n }),\n );\n\n useEffect(() => {\n graph.addNodes(menuGraphProps.nodes);\n graph.addEdges(menuGraphProps.edges);\n }, [menuGraphProps]);\n\n const useGroupItems = useCallback(\n (sourceNode?: MenuItemGroup) => {\n const items = useRxValue(graph.connections(sourceNode?.id || ROOT_ID)) as MenuItem[];\n return items;\n },\n [graph],\n );\n\n return { useGroupItems };\n};\n"],
5
- "mappings": "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",
6
- "names": ["rxFromSignal", "useControllableState", "React", "useCallback", "DropdownMenu", "NaturalDropdownMenu", "Icon", "React", "keySymbols", "toLocalizedString", "useTranslation", "mx", "descriptionText", "translationKey", "ACTION_GROUP_TYPE", "ACTION_TYPE", "actionGroupSymbol", "getHostPlatform", "getShortcut", "action", "properties", "keyBinding", "getHostPlatform", "createMenuAction", "id", "invoke", "properties", "type", "ACTION_TYPE", "data", "createMenuItemGroup", "ACTION_GROUP_TYPE", "actionGroupSymbol", "createGapSeparator", "source", "nodes", "variant", "undefined", "edges", "target", "createLineSeparator", "ActionLabel", "action", "shortcut", "getShortcut", "t", "useTranslation", "translationKey", "span", "className", "toLocalizedString", "properties", "label", "mx", "descriptionText", "keySymbols", "join", "actionLabel", "createContextScope", "React", "useMemo", "MENU_NAME", "createMenuContext", "createMenuScope", "createContextScope", "MenuContextProvider", "useMenu", "menuContextDefaults", "iconSize", "useGroupItems", "useMenuScope", "MenuProvider", "children", "attendableId", "scope", "undefined", "React", "useMenuItems", "group", "propsItems", "consumerName", "__menuScope", "groupItems", "useMemo", "DropdownMenuItem", "item", "onClick", "__menuScope", "action", "handleClick", "useCallback", "event", "iconSize", "useMenu", "React", "NaturalDropdownMenu", "Item", "classNames", "disabled", "properties", "testId", "icon", "Icon", "size", "ActionLabel", "DropdownMenuRoot", "items", "propsItems", "group", "open", "defaultOpen", "onOpenChange", "caller", "children", "naturalProps", "optionsMenuOpen", "setOptionsMenuOpen", "useControllableState", "prop", "defaultProp", "onChange", "handleActionClick", "stopPropagation", "data", "parent", "useMenuItems", "Root", "Portal", "Content", "Viewport", "map", "key", "id", "Arrow", "DropdownMenu", "Trigger", "VirtualTrigger", "React", "Fragment", "useCallback", "Icon", "Toolbar", "NaturalToolbar", "useTranslation", "useAttention", "mx", "textBlockWidth", "toolbarLayout", "ACTION_GROUP_TYPE", "MenuSeparatorType", "isSeparator", "node", "type", "isMenuGroup", "ACTION_GROUP_TYPE", "ActionToolbarItem", "action", "__menuScope", "iconSize", "useMenu", "t", "useTranslation", "translationKey", "handleClick", "useCallback", "data", "icon", "iconOnly", "disabled", "testId", "hidden", "classNames", "properties", "Root", "NaturalToolbar", "IconButton", "Button", "rootProps", "size", "label", "actionLabel", "children", "React", "ActionLabel", "key", "id", "onClick", "variant", "DropdownMenuToolbarItem", "group", "items", "propsItems", "useMenuItems", "activeItem", "find", "item", "checked", "applyActive", "labelAction", "caretDown", "Icon", "DropdownMenu", "Trigger", "asChild", "ToggleGroupItem", "parent", "ToggleGroupIconItem", "value", "ToggleGroupToolbarItem", "selectCardinality", "ToggleGroup", "type", "map", "ToolbarMenu", "textBlockWidth", "wrapContents", "props", "undefined", "attendableId", "hasAttention", "useAttention", "InnerRoot", "Fragment", "innerRootProps", "role", "className", "mx", "toolbarLayout", "layoutManaged", "i", "isSeparator", "Separator", "isMenuGroup", "RegistryContext", "useRxValue", "useCallback", "useContext", "useEffect", "useState", "Graph", "ROOT_ID", "edgesArrayToRecord", "edges", "Object", "fromEntries", "entries", "reduce", "acc", "source", "target", "inbound", "outbound", "sourceEdges", "includes", "push", "targetEdges", "useMenuActions", "props", "registry", "useContext", "RegistryContext", "menuGraphProps", "useRxValue", "graph", "useState", "Graph", "nodes", "useEffect", "addNodes", "addEdges", "useGroupItems", "useCallback", "sourceNode", "items", "connections", "id", "ROOT_ID"]
3
+ "sources": ["../../../src/index.ts", "../../../src/components/DropdownMenu.tsx", "../../../src/components/ActionLabel.tsx", "../../../src/translations.ts", "../../../src/util.ts", "../../../src/components/MenuContext.tsx", "../../../src/components/ToolbarMenu.tsx", "../../../src/types.ts", "../../../src/hooks/useMenuActions.ts", "../../../src/builder.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nexport { rxFromSignal } from '@dxos/app-graph';\n\nexport * from './components';\nexport * from './hooks';\nexport * from './types';\nexport { createMenuAction, createMenuItemGroup, createLineSeparator, createGapSeparator } from './util';\nexport { MenuBuilder } from './builder';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, { type MouseEvent, useCallback } from 'react';\n\nimport { type DropdownMenuRootProps, Icon, DropdownMenu as NaturalDropdownMenu } from '@dxos/react-ui';\n\nimport { type MenuAction, type MenuItem, type MenuItemGroup } from '../types';\n\nimport { ActionLabel } from './ActionLabel';\nimport { type MenuScopedProps, useMenu, useMenuItems } from './MenuContext';\n\nexport type DropdownMenuProps = DropdownMenuRootProps & {\n group?: MenuItemGroup;\n items?: MenuItem[];\n caller?: string;\n};\n\nconst DropdownMenuItem = ({\n item,\n onClick,\n __menuScope,\n}: MenuScopedProps<{\n item: MenuItem;\n onClick: (action: MenuAction, event: MouseEvent) => void;\n}>) => {\n // TODO(thure): handle other items.\n const action = item as MenuAction;\n const handleClick = useCallback((event: MouseEvent) => onClick(action, event), [action, onClick]);\n const { iconSize } = useMenu('DropdownMenuItem', __menuScope);\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={iconSize} />}\n <ActionLabel action={action} />\n </NaturalDropdownMenu.Item>\n );\n};\n\nconst DropdownMenuRoot = ({\n items: propsItems,\n group,\n open,\n defaultOpen,\n onOpenChange,\n caller,\n children,\n __menuScope,\n ...naturalProps\n}: MenuScopedProps<DropdownMenuProps>) => {\n const [optionsMenuOpen, setOptionsMenuOpen] = useControllableState({\n prop: open,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\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 setOptionsMenuOpen(false);\n void action.data?.({ parent: group, caller });\n },\n [group, caller],\n );\n\n const items = useMenuItems(group, propsItems);\n\n return (\n <NaturalDropdownMenu.Root open={optionsMenuOpen} onOpenChange={setOptionsMenuOpen} {...naturalProps}>\n {children}\n <NaturalDropdownMenu.Portal>\n <NaturalDropdownMenu.Content>\n <NaturalDropdownMenu.Viewport>\n {items?.map((item) => (\n <DropdownMenuItem key={item.id} item={item} onClick={handleActionClick} />\n ))}\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 ActionGroup, type Action as GraphAction } from '@dxos/app-graph';\nimport { keySymbols } from '@dxos/keyboard';\nimport { type TFunction, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { descriptionText, mx } from '@dxos/react-ui-theme';\n\nimport { translationKey } from '../translations';\nimport { type MenuActionProperties } from '../types';\nimport { getShortcut } from '../util';\n\ntype Action = GraphAction<MenuActionProperties> | ActionGroup<Omit<MenuActionProperties, 'variant'>>;\n\nexport const ActionLabel = ({ action }: { action: Action }) => {\n const { t } = useTranslation(translationKey);\n const shortcut = getShortcut(action);\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\nexport const actionLabel = (action: Action, t: TFunction) => {\n const shortcut = getShortcut(action);\n return `${toLocalizedString(action.properties!.label, t)}${shortcut ? ` (${keySymbols(shortcut).join('')})` : ''}`;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nexport const translationKey = 'react-ui-menu';\n\nexport const translations = [\n {\n 'en-US': {\n [translationKey]: {},\n },\n },\n] as const satisfies Resource[];\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { ACTION_GROUP_TYPE, ACTION_TYPE, type ActionLike, actionGroupSymbol } from '@dxos/app-graph';\nimport { getHostPlatform } from '@dxos/util';\n\nimport {\n type MenuAction,\n type MenuActionProperties,\n type MenuItemGroup,\n type MenuItemGroupProperties,\n type MenuSeparator,\n} from './types';\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\nexport const createMenuAction = <P extends {} = {}>(\n id: string,\n invoke: () => void,\n properties: P & MenuActionProperties,\n) =>\n ({\n id,\n type: ACTION_TYPE,\n properties,\n data: invoke,\n }) satisfies MenuAction;\n\nexport const createMenuItemGroup = <\n P extends MenuItemGroupProperties = MenuItemGroupProperties & Partial<MenuActionProperties>,\n>(\n id: string,\n properties: P,\n) =>\n ({\n id,\n type: ACTION_GROUP_TYPE,\n properties,\n data: actionGroupSymbol,\n }) satisfies MenuItemGroup;\n\nexport const createGapSeparator = (id: string = 'gap', source: string = 'root') => ({\n nodes: [\n {\n id,\n type: '@dxos/react-ui-toolbar/separator',\n properties: { variant: 'gap' },\n data: undefined as never,\n } satisfies MenuSeparator,\n ],\n edges: [{ source, target: id }],\n});\n\nexport const createLineSeparator = (id: string = 'line', source: string = 'root') => ({\n nodes: [\n {\n id,\n type: '@dxos/react-ui-toolbar/separator',\n properties: { variant: 'line' },\n data: undefined as never,\n } satisfies MenuSeparator,\n ],\n edges: [{ source, target: id }],\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Scope, createContextScope } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, useMemo } from 'react';\n\nimport { type MenuContextValue, type MenuItem, type MenuItemGroup } from '../types';\n\nexport type MenuScopedProps<P> = P & { __menuScope?: Scope };\n\nconst MENU_NAME = 'GraphMenu';\n\nconst [createMenuContext, createMenuScope] = createContextScope(MENU_NAME, []);\n\nconst [MenuContextProvider, useMenu] = createMenuContext<MenuContextValue>(MENU_NAME);\n\nexport const menuContextDefaults: MenuContextValue = {\n iconSize: 5,\n useGroupItems: () => null,\n};\n\nconst useMenuScope = createMenuScope();\n\nconst MenuProvider = ({\n children,\n useGroupItems = menuContextDefaults.useGroupItems,\n iconSize = menuContextDefaults.iconSize,\n attendableId,\n}: PropsWithChildren<Partial<MenuContextValue>>) => {\n const { scope } = useMenuScope(undefined);\n return (\n <MenuContextProvider useGroupItems={useGroupItems} iconSize={iconSize} attendableId={attendableId} scope={scope}>\n {children}\n </MenuContextProvider>\n );\n};\n\nexport const useMenuItems = (\n group?: MenuItemGroup,\n propsItems?: MenuItem[],\n consumerName: string = 'useMenuItemConsumer',\n __menuScope?: Scope,\n) => {\n const { useGroupItems } = useMenu(consumerName, __menuScope);\n const groupItems = useGroupItems(group);\n return useMemo(() => propsItems ?? groupItems ?? undefined, [propsItems, groupItems]);\n};\n\nexport { useMenu, createMenuScope, MenuProvider };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { Fragment, useCallback } from 'react';\n\nimport { Icon, Toolbar as NaturalToolbar, type ToolbarRootProps, useTranslation } from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport { mx, textBlockWidth, toolbarLayout } from '@dxos/react-ui-theme';\n\nimport { translationKey } from '../translations';\nimport {\n type MenuAction,\n type MenuActionProperties,\n type MenuItem,\n type MenuItemGroup,\n type MenuMultipleSelectActionGroup,\n type MenuSingleSelectActionGroup,\n isMenuGroup,\n isSeparator,\n} from '../types';\n\nimport { ActionLabel, actionLabel } from './ActionLabel';\nimport { DropdownMenu } from './DropdownMenu';\nimport { type MenuScopedProps, useMenu, useMenuItems } from './MenuContext';\n\nexport type ToolbarMenuDropdownMenuActionGroup = Omit<MenuActionProperties, 'variant' | 'icon'> & {\n variant: 'dropdownMenu';\n icon: string;\n applyActive?: boolean;\n};\n\nexport type ToolbarMenuToggleGroupActionGroup = Omit<MenuActionProperties, 'variant'> & {\n variant: 'toggleGroup';\n};\n\nexport type ToolbarMenuActionGroupProperties = (\n | ToolbarMenuDropdownMenuActionGroup\n | ToolbarMenuToggleGroupActionGroup\n) &\n (MenuSingleSelectActionGroup | MenuMultipleSelectActionGroup);\n\nexport type ToolbarMenuProps = ToolbarRootProps & { textBlockWidth?: boolean };\n\nexport type ToolbarMenuActionGroupProps = {\n group: MenuItemGroup<ToolbarMenuActionGroupProperties>;\n items?: MenuItem[];\n};\n\nexport type ToolbarMenuActionProps = {\n group: MenuItemGroup<ToolbarMenuActionGroupProperties>;\n action: MenuAction;\n};\n\nconst ActionToolbarItem = ({ action, __menuScope }: MenuScopedProps<{ action: MenuAction }>) => {\n const { iconSize } = useMenu('ActionToolbarItem', __menuScope);\n const { t } = useTranslation(translationKey);\n const handleClick = useCallback(() => action.data?.(), [action]);\n const { icon, iconOnly = true, disabled, testId, hidden, classNames } = action.properties;\n const Root = icon ? NaturalToolbar.IconButton : NaturalToolbar.Button;\n const rootProps = icon\n ? { icon, size: iconSize, iconOnly, label: actionLabel(action, t) }\n : { children: <ActionLabel action={action} /> };\n\n return hidden ? null : (\n <Root\n key={action.id}\n disabled={disabled}\n onClick={handleClick}\n variant='ghost'\n {...(testId && { 'data-testid': testId })}\n {...(rootProps as any)}\n classNames={classNames}\n />\n );\n};\n\nconst DropdownMenuToolbarItem = ({\n group,\n items: propsItems,\n __menuScope,\n}: MenuScopedProps<ToolbarMenuActionGroupProps>) => {\n const { iconOnly, disabled, testId } = group.properties;\n const { t } = useTranslation(translationKey);\n const { iconSize } = useMenu('DropdownMenuToolbarItem', __menuScope);\n const items = useMenuItems(group, propsItems, 'DropdownMenuToolbarItem', __menuScope);\n const activeItem = items?.find((item) => !!(item as MenuAction).properties.checked);\n const icon =\n ((group.properties as any).applyActive &&\n // TODO(thure): Handle other menu item types.\n (activeItem as MenuAction)?.properties.icon) ||\n group.properties.icon;\n const Root = icon ? NaturalToolbar.IconButton : NaturalToolbar.Button;\n const labelAction = (group.properties as any).applyActive && activeItem ? (activeItem as MenuAction) : group;\n const rootProps = icon\n ? { icon, size: iconSize, iconOnly, label: actionLabel(labelAction, t), caretDown: true }\n : {\n children: (\n <>\n <ActionLabel action={labelAction} />\n <Icon size={3} icon='ph--caret-down--bold' classNames='mis-1' />\n </>\n ),\n };\n\n return (\n <DropdownMenu.Root group={group} items={items}>\n <DropdownMenu.Trigger asChild>\n <Root variant='ghost' disabled={disabled} {...(rootProps as any)} {...(testId && { 'data-testid': testId })} />\n </DropdownMenu.Trigger>\n </DropdownMenu.Root>\n );\n};\n\nconst ToggleGroupItem = ({ group, action, __menuScope }: MenuScopedProps<ToolbarMenuActionProps>) => {\n const { iconSize } = useMenu('ToggleGroupItem', __menuScope);\n const { t } = useTranslation(translationKey);\n const { icon, iconOnly = true, disabled, testId, hidden, classNames } = action.properties;\n const handleClick = useCallback(() => action.data?.({ parent: group }), [action, group]);\n const Root = icon ? NaturalToolbar.ToggleGroupIconItem : NaturalToolbar.ToggleGroupItem;\n const rootProps = icon\n ? { icon, size: iconSize, iconOnly, label: actionLabel(action, t) }\n : { children: <ActionLabel action={action} /> };\n\n return hidden ? null : (\n <Root\n key={action.id}\n value={action.id as any}\n disabled={disabled}\n onClick={handleClick}\n variant='ghost'\n {...(testId && { 'data-testid': testId })}\n {...(rootProps as any)}\n classNames={classNames}\n />\n );\n};\n\nconst ToggleGroupToolbarItem = ({\n group,\n items: propsItems,\n __menuScope,\n}: MenuScopedProps<ToolbarMenuActionGroupProps>) => {\n const items = useMenuItems(group, propsItems, 'ToggleGroupToolbarItem', __menuScope);\n const { selectCardinality, value } = group.properties;\n\n return (\n // TODO(thure): Fix.\n // @ts-ignore\n <NaturalToolbar.ToggleGroup type={selectCardinality} value={value}>\n {\n // TODO(thure): Handle other menu item types.\n (items as MenuAction[]).map((action) => (\n <ToggleGroupItem key={action.id} group={group} action={action} />\n ))\n }\n </NaturalToolbar.ToggleGroup>\n );\n};\n\nexport const ToolbarMenu = ({\n __menuScope,\n classNames,\n textBlockWidth: wrapContents,\n ...props\n}: MenuScopedProps<ToolbarMenuProps>) => {\n const items = useMenuItems(undefined, undefined, 'ToolbarMenu', __menuScope);\n const { attendableId } = useMenu('ToolbarMenu', __menuScope);\n const { hasAttention } = useAttention(attendableId);\n const InnerRoot = wrapContents ? 'div' : Fragment;\n const innerRootProps = wrapContents ? { role: 'none', className: mx(textBlockWidth, toolbarLayout, 'bs-full') } : {};\n\n return (\n <NaturalToolbar.Root\n {...props}\n layoutManaged={wrapContents}\n classNames={[attendableId && !hasAttention && '*:opacity-20 !bg-transparent', classNames]}\n >\n <InnerRoot {...innerRootProps}>\n {items?.map((item: MenuItem, i: number) => (\n <ToolbarMenuItem key={item.id ?? i} item={item} />\n ))}\n </InnerRoot>\n </NaturalToolbar.Root>\n );\n};\n\nconst ToolbarMenuItem = ({ item }: { item: MenuItem }) => {\n if (isSeparator(item)) {\n return <NaturalToolbar.Separator variant={item.properties.variant} />;\n }\n\n // TODO(thure): Figure out type narrowing that doesn’t require so much use of `as`.\n if (isMenuGroup(item)) {\n if (item.properties.variant === 'dropdownMenu') {\n return <DropdownMenuToolbarItem group={item as MenuItemGroup<ToolbarMenuActionGroupProperties>} />;\n } else {\n return <ToggleGroupToolbarItem group={item as MenuItemGroup<ToolbarMenuActionGroupProperties>} />;\n }\n }\n\n return <ActionToolbarItem action={item as MenuAction} />;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { ACTION_GROUP_TYPE, type Action, type ActionGroup, type Node } from '@dxos/app-graph';\nimport { type ClassNameValue, type IconButtonProps, type Label, type ToolbarSeparatorProps } from '@dxos/react-ui';\n\nexport type MenuActionProperties = {\n label: Label;\n icon?: string;\n value?: string;\n disabled?: boolean;\n hidden?: boolean;\n iconOnly?: boolean;\n testId?: string;\n variant?: 'action' | 'toggle';\n checked?: boolean;\n classNames?: ClassNameValue;\n};\n\nexport type MenuItemGroupProperties = {\n label: Label;\n icon?: string;\n iconOnly?: boolean;\n};\n\nexport type MenuAction<P extends {} = {}> = Action<P & MenuActionProperties>;\n\nexport const MenuSeparatorType = '@dxos/react-ui-toolbar/separator' as const;\n\nexport type MenuSeparator = Node<never, Pick<ToolbarSeparatorProps, 'variant'>> & {\n type: typeof MenuSeparatorType;\n};\n\nexport const isSeparator = (node: Node): node is MenuSeparator => node.type === MenuSeparatorType;\n\nexport type MenuSingleSelectActionGroup = { selectCardinality: 'single'; value: string };\nexport type MenuMultipleSelectActionGroup = { selectCardinality: 'multiple'; value: string[] };\n\nexport type MenuItemGroup<P extends Record<string, any> = Record<string, any>> = ActionGroup<P>;\n\nexport const isMenuGroup = (node: Node): node is MenuItemGroup => node.type === ACTION_GROUP_TYPE;\n\nexport type MenuItem = MenuSeparator | MenuAction | MenuItemGroup;\n\nexport type MenuItemsResolver = (group?: MenuItemGroup) => MenuItem[] | null;\n\nexport type MenuContextValue = {\n useGroupItems: MenuItemsResolver;\n iconSize: IconButtonProps['size'];\n attendableId?: string;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { RegistryContext, type Rx, useRxValue } from '@effect-rx/rx-react';\nimport { useCallback, useContext, useEffect, useState } from 'react';\n\nimport { type Edge, type Edges, Graph, type Node, type NodeArg, ROOT_ID } from '@dxos/app-graph';\n\nimport { type MenuItem, type MenuItemGroup } from '../types';\n\nconst edgesArrayToRecord = (edges: Edge[]): Record<string, Edges> => {\n return Object.fromEntries(\n Object.entries(\n edges.reduce((acc: Record<string, { inbound: string[]; outbound: string[] }>, { source, target }) => {\n if (!acc[source]) {\n acc[source] = { inbound: [], outbound: [] };\n }\n if (!acc[target]) {\n acc[target] = { inbound: [], outbound: [] };\n }\n\n const sourceEdges = acc[source];\n if (!sourceEdges.outbound.includes(target)) {\n sourceEdges.outbound.push(target);\n }\n\n const targetEdges = acc[target];\n if (!targetEdges.inbound.includes(source)) {\n targetEdges.inbound.push(source);\n }\n\n return acc;\n }, {}),\n ),\n );\n};\n\nexport type ActionGraphNodes = NodeArg<any>[];\nexport type ActionGraphEdges = Edge[];\nexport type ActionGraphProps = { nodes: ActionGraphNodes; edges: ActionGraphEdges };\n\nexport const useMenuActions = (props: Rx.Rx<ActionGraphProps>) => {\n const registry = useContext(RegistryContext);\n const menuGraphProps = useRxValue(props);\n\n const [graph] = useState(\n new Graph({\n registry,\n nodes: menuGraphProps.nodes as Node[],\n edges: edgesArrayToRecord(menuGraphProps.edges),\n }),\n );\n\n useEffect(() => {\n graph.addNodes(menuGraphProps.nodes);\n graph.addEdges(menuGraphProps.edges);\n }, [menuGraphProps]);\n\n const useGroupItems = useCallback(\n (sourceNode?: MenuItemGroup) => {\n const items = useRxValue(graph.connections(sourceNode?.id || ROOT_ID)) as MenuItem[];\n return items;\n },\n [graph],\n );\n\n return { useGroupItems };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\n\nimport type { ActionGraphProps } from './hooks';\nimport type { MenuActionProperties, MenuItemGroupProperties } from './types';\nimport { createMenuAction, createMenuItemGroup } from './util';\n\nexport interface ActionGroupBuilder {\n action<P extends {} = {}>(id: string, props: P & MenuActionProperties, invoke: () => void): this;\n group<P extends {} = {}>(\n id: string,\n props: P & MenuItemGroupProperties,\n cb: (builder: ActionGroupBuilder) => void,\n ): this;\n}\n\nexport interface MenuBuilder extends ActionGroupBuilder {\n root(props: MenuItemGroupProperties): this;\n build(): ActionGraphProps;\n}\n\nexport const MenuBuilder = Object.freeze({\n make: (): MenuBuilder => new MenuBuilderImpl({ nodes: [], edges: [] }, 'root'),\n});\n\nclass MenuBuilderImpl implements MenuBuilder {\n constructor(\n private readonly _data: ActionGraphProps,\n private readonly _rootId: string,\n ) {}\n\n root(props: MenuItemGroupProperties): this {\n invariant(this._rootId === 'root', 'Root group can only be at the top level');\n invariant(this._data.nodes.find((node) => node.id === 'root') === undefined, 'Root group can only be created once');\n this._data.nodes.push(createMenuItemGroup('root', props));\n return this;\n }\n\n action<P extends {} = {}>(id: string, props: P & MenuActionProperties, invoke: () => void): this {\n this._data.nodes.push(createMenuAction(id, invoke, props));\n this._data.edges.push({ source: this._rootId, target: id });\n return this;\n }\n\n group<P extends {} = {}>(\n id: string,\n props: P & MenuItemGroupProperties,\n cb: (builder: ActionGroupBuilder) => void,\n ): this {\n this._data.nodes.push(createMenuItemGroup(id, props));\n this._data.edges.push({ source: this._rootId, target: id });\n cb(new MenuBuilderImpl(this._data, id));\n return this;\n }\n\n build(): ActionGraphProps {\n return this._data;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["rxFromSignal", "useControllableState", "React", "useCallback", "Icon", "DropdownMenu", "NaturalDropdownMenu", "React", "keySymbols", "toLocalizedString", "useTranslation", "descriptionText", "mx", "translationKey", "translations", "ACTION_GROUP_TYPE", "ACTION_TYPE", "actionGroupSymbol", "getHostPlatform", "getShortcut", "action", "properties", "keyBinding", "getHostPlatform", "createMenuAction", "id", "invoke", "properties", "type", "ACTION_TYPE", "data", "createMenuItemGroup", "ACTION_GROUP_TYPE", "actionGroupSymbol", "createGapSeparator", "source", "nodes", "variant", "undefined", "edges", "target", "createLineSeparator", "ActionLabel", "action", "t", "useTranslation", "translationKey", "shortcut", "getShortcut", "span", "className", "toLocalizedString", "properties", "label", "mx", "descriptionText", "keySymbols", "join", "actionLabel", "createContextScope", "React", "useMemo", "MENU_NAME", "createMenuContext", "createMenuScope", "createContextScope", "MenuContextProvider", "useMenu", "menuContextDefaults", "iconSize", "useGroupItems", "useMenuScope", "MenuProvider", "children", "attendableId", "scope", "undefined", "React", "useMenuItems", "group", "propsItems", "consumerName", "__menuScope", "groupItems", "useMemo", "DropdownMenuItem", "item", "onClick", "__menuScope", "action", "handleClick", "useCallback", "event", "iconSize", "useMenu", "React", "NaturalDropdownMenu", "Item", "classNames", "disabled", "properties", "testId", "icon", "Icon", "size", "ActionLabel", "DropdownMenuRoot", "items", "propsItems", "group", "open", "defaultOpen", "onOpenChange", "caller", "children", "naturalProps", "optionsMenuOpen", "setOptionsMenuOpen", "useControllableState", "prop", "defaultProp", "onChange", "handleActionClick", "stopPropagation", "data", "parent", "useMenuItems", "Root", "Portal", "Content", "Viewport", "map", "key", "id", "Arrow", "DropdownMenu", "Trigger", "VirtualTrigger", "React", "Fragment", "useCallback", "Icon", "Toolbar", "NaturalToolbar", "useTranslation", "useAttention", "mx", "textBlockWidth", "toolbarLayout", "ACTION_GROUP_TYPE", "MenuSeparatorType", "isSeparator", "node", "type", "isMenuGroup", "ACTION_GROUP_TYPE", "ActionToolbarItem", "action", "__menuScope", "iconSize", "useMenu", "t", "useTranslation", "translationKey", "handleClick", "useCallback", "data", "icon", "iconOnly", "disabled", "testId", "hidden", "classNames", "properties", "Root", "NaturalToolbar", "IconButton", "Button", "rootProps", "size", "label", "actionLabel", "children", "React", "ActionLabel", "key", "id", "onClick", "variant", "DropdownMenuToolbarItem", "group", "items", "propsItems", "useMenuItems", "activeItem", "find", "item", "checked", "applyActive", "labelAction", "caretDown", "Icon", "DropdownMenu", "Trigger", "asChild", "ToggleGroupItem", "parent", "ToggleGroupIconItem", "value", "ToggleGroupToolbarItem", "selectCardinality", "ToggleGroup", "type", "map", "ToolbarMenu", "textBlockWidth", "wrapContents", "props", "undefined", "attendableId", "hasAttention", "useAttention", "InnerRoot", "Fragment", "innerRootProps", "role", "className", "mx", "toolbarLayout", "layoutManaged", "i", "ToolbarMenuItem", "isSeparator", "Separator", "isMenuGroup", "RegistryContext", "useRxValue", "useCallback", "useContext", "useEffect", "useState", "Graph", "ROOT_ID", "edgesArrayToRecord", "edges", "Object", "fromEntries", "entries", "reduce", "acc", "source", "target", "inbound", "outbound", "sourceEdges", "includes", "push", "targetEdges", "useMenuActions", "props", "registry", "useContext", "RegistryContext", "menuGraphProps", "useRxValue", "graph", "useState", "Graph", "nodes", "useEffect", "addNodes", "addEdges", "useGroupItems", "useCallback", "sourceNode", "items", "connections", "id", "ROOT_ID", "invariant", "MenuBuilder", "Object", "freeze", "make", "MenuBuilderImpl", "nodes", "edges", "root", "props", "invariant", "_rootId", "_data", "find", "node", "id", "undefined", "push", "createMenuItemGroup", "action", "invoke", "createMenuAction", "source", "target", "group", "cb", "build"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/ui/react-ui-menu/src/translations.ts":{"bytes":869,"imports":[],"format":"esm"},"packages/ui/react-ui-menu/src/util.ts":{"bytes":5896,"imports":[{"path":"@dxos/app-graph","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-menu/src/components/ActionLabel.tsx":{"bytes":4330,"imports":[{"path":"@preact-signals/safe-react/tracking","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":"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/MenuContext.tsx":{"bytes":5222,"imports":[{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-menu/src/components/DropdownMenu.tsx":{"bytes":10503,"imports":[{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"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"},{"path":"packages/ui/react-ui-menu/src/components/MenuContext.tsx","kind":"import-statement","original":"./MenuContext"}],"format":"esm"},"packages/ui/react-ui-menu/src/types.ts":{"bytes":3207,"imports":[{"path":"@dxos/app-graph","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-menu/src/components/ToolbarMenu.tsx":{"bytes":24564,"imports":[{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-attention","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","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"},{"path":"packages/ui/react-ui-menu/src/components/MenuContext.tsx","kind":"import-statement","original":"./MenuContext"},{"path":"packages/ui/react-ui-menu/src/translations.ts","kind":"import-statement","original":"../translations"},{"path":"packages/ui/react-ui-menu/src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"packages/ui/react-ui-menu/src/components/index.ts":{"bytes":686,"imports":[{"path":"packages/ui/react-ui-menu/src/components/DropdownMenu.tsx","kind":"import-statement","original":"./DropdownMenu"},{"path":"packages/ui/react-ui-menu/src/components/ToolbarMenu.tsx","kind":"import-statement","original":"./ToolbarMenu"},{"path":"packages/ui/react-ui-menu/src/components/MenuContext.tsx","kind":"import-statement","original":"./MenuContext"}],"format":"esm"},"packages/ui/react-ui-menu/src/hooks/useMenuActions.ts":{"bytes":6891,"imports":[{"path":"@effect-rx/rx-react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-graph","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-menu/src/hooks/index.ts":{"bytes":489,"imports":[{"path":"packages/ui/react-ui-menu/src/hooks/useMenuActions.ts","kind":"import-statement","original":"./useMenuActions"}],"format":"esm"},"packages/ui/react-ui-menu/src/index.ts":{"bytes":1254,"imports":[{"path":"@dxos/app-graph","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-menu/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/ui/react-ui-menu/src/hooks/index.ts","kind":"import-statement","original":"./hooks"},{"path":"packages/ui/react-ui-menu/src/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/ui/react-ui-menu/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"}},"outputs":{"packages/ui/react-ui-menu/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":31882},"packages/ui/react-ui-menu/dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/app-graph","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"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":"@preact-signals/safe-react/tracking","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/app-graph","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-attention","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/app-graph","kind":"import-statement","external":true},{"path":"@effect-rx/rx-react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-graph","kind":"import-statement","external":true}],"exports":["DropdownMenu","MenuProvider","MenuSeparatorType","ToolbarMenu","createGapSeparator","createLineSeparator","createMenuAction","createMenuItemGroup","createMenuScope","isMenuGroup","isSeparator","menuContextDefaults","rxFromSignal","useMenu","useMenuActions","useMenuItems"],"entryPoint":"packages/ui/react-ui-menu/src/index.ts","inputs":{"packages/ui/react-ui-menu/src/index.ts":{"bytesInOutput":48},"packages/ui/react-ui-menu/src/components/DropdownMenu.tsx":{"bytesInOutput":2621},"packages/ui/react-ui-menu/src/components/ActionLabel.tsx":{"bytesInOutput":1031},"packages/ui/react-ui-menu/src/translations.ts":{"bytesInOutput":118},"packages/ui/react-ui-menu/src/util.ts":{"bytesInOutput":1113},"packages/ui/react-ui-menu/src/components/MenuContext.tsx":{"bytesInOutput":1199},"packages/ui/react-ui-menu/src/components/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-menu/src/components/ToolbarMenu.tsx":{"bytesInOutput":6689},"packages/ui/react-ui-menu/src/types.ts":{"bytesInOutput":258},"packages/ui/react-ui-menu/src/hooks/useMenuActions.ts":{"bytesInOutput":1447},"packages/ui/react-ui-menu/src/hooks/index.ts":{"bytesInOutput":0}},"bytes":15523}}}
1
+ {"inputs":{"src/translations.ts":{"bytes":1041,"imports":[],"format":"esm"},"src/util.ts":{"bytes":5883,"imports":[{"path":"@dxos/app-graph","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"src/components/ActionLabel.tsx":{"bytes":4313,"imports":[{"path":"@preact-signals/safe-react/tracking","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":"src/translations.ts","kind":"import-statement","original":"../translations"},{"path":"src/util.ts","kind":"import-statement","original":"../util"}],"format":"esm"},"src/components/MenuContext.tsx":{"bytes":5209,"imports":[{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"src/components/DropdownMenu.tsx":{"bytes":10534,"imports":[{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"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":"src/components/ActionLabel.tsx","kind":"import-statement","original":"./ActionLabel"},{"path":"src/components/MenuContext.tsx","kind":"import-statement","original":"./MenuContext"}],"format":"esm"},"src/types.ts":{"bytes":3194,"imports":[{"path":"@dxos/app-graph","kind":"import-statement","external":true}],"format":"esm"},"src/components/ToolbarMenu.tsx":{"bytes":24514,"imports":[{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-attention","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"src/translations.ts","kind":"import-statement","original":"../translations"},{"path":"src/types.ts","kind":"import-statement","original":"../types"},{"path":"src/components/ActionLabel.tsx","kind":"import-statement","original":"./ActionLabel"},{"path":"src/components/DropdownMenu.tsx","kind":"import-statement","original":"./DropdownMenu"},{"path":"src/components/MenuContext.tsx","kind":"import-statement","original":"./MenuContext"}],"format":"esm"},"src/components/index.ts":{"bytes":673,"imports":[{"path":"src/components/DropdownMenu.tsx","kind":"import-statement","original":"./DropdownMenu"},{"path":"src/components/ToolbarMenu.tsx","kind":"import-statement","original":"./ToolbarMenu"},{"path":"src/components/MenuContext.tsx","kind":"import-statement","original":"./MenuContext"}],"format":"esm"},"src/hooks/useMenuActions.ts":{"bytes":6878,"imports":[{"path":"@effect-rx/rx-react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-graph","kind":"import-statement","external":true}],"format":"esm"},"src/hooks/index.ts":{"bytes":476,"imports":[{"path":"src/hooks/useMenuActions.ts","kind":"import-statement","original":"./useMenuActions"}],"format":"esm"},"src/builder.ts":{"bytes":6944,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"src/index.ts":{"bytes":1394,"imports":[{"path":"@dxos/app-graph","kind":"import-statement","external":true},{"path":"src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"src/hooks/index.ts","kind":"import-statement","original":"./hooks"},{"path":"src/types.ts","kind":"import-statement","original":"./types"},{"path":"src/util.ts","kind":"import-statement","original":"./util"},{"path":"src/builder.ts","kind":"import-statement","original":"./builder"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":35257},"dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/app-graph","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"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":"@preact-signals/safe-react/tracking","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/app-graph","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-attention","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/app-graph","kind":"import-statement","external":true},{"path":"@effect-rx/rx-react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-graph","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"exports":["DropdownMenu","MenuBuilder","MenuProvider","MenuSeparatorType","ToolbarMenu","createGapSeparator","createLineSeparator","createMenuAction","createMenuItemGroup","createMenuScope","isMenuGroup","isSeparator","menuContextDefaults","rxFromSignal","useMenu","useMenuActions","useMenuItems"],"entryPoint":"src/index.ts","inputs":{"src/index.ts":{"bytesInOutput":48},"src/components/DropdownMenu.tsx":{"bytesInOutput":2621},"src/components/ActionLabel.tsx":{"bytesInOutput":1031},"src/translations.ts":{"bytesInOutput":118},"src/util.ts":{"bytesInOutput":1113},"src/components/MenuContext.tsx":{"bytesInOutput":1199},"src/components/index.ts":{"bytesInOutput":0},"src/components/ToolbarMenu.tsx":{"bytesInOutput":6599},"src/types.ts":{"bytesInOutput":258},"src/hooks/useMenuActions.ts":{"bytesInOutput":1447},"src/hooks/index.ts":{"bytesInOutput":0},"src/builder.ts":{"bytesInOutput":1855}},"bytes":17010}}}