@dxos/react-ui-menu 0.8.2-main.12df754 → 0.8.2-main.30e4dbb
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/index.mjs +38 -38
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +35 -35
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +38 -38
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/components/ActionLabel.d.ts +8 -4
- package/dist/types/src/components/ActionLabel.d.ts.map +1 -1
- package/dist/types/src/components/DropdownMenu.d.ts +3 -2
- package/dist/types/src/components/DropdownMenu.d.ts.map +1 -1
- package/dist/types/src/components/MenuContext.d.ts +4 -13
- package/dist/types/src/components/MenuContext.d.ts.map +1 -1
- package/dist/types/src/{testing → components}/Menus.stories.d.ts +1 -1
- package/dist/types/src/components/Menus.stories.d.ts.map +1 -0
- package/dist/types/src/components/ToolbarMenu.d.ts +5 -1
- package/dist/types/src/components/ToolbarMenu.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +2 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -0
- package/dist/types/src/{hooks.d.ts → hooks/useMenuActions.d.ts} +2 -2
- package/dist/types/src/hooks/useMenuActions.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/testing/generator.d.ts +26 -0
- package/dist/types/src/testing/generator.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +1 -25
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/{defs.d.ts → types.d.ts} +2 -4
- package/dist/types/src/types.d.ts.map +1 -0
- package/dist/types/src/util.d.ts +2 -2
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -12
- package/src/components/ActionLabel.tsx +11 -8
- package/src/components/DropdownMenu.tsx +5 -5
- package/src/components/MenuContext.tsx +5 -16
- package/src/{testing → components}/Menus.stories.tsx +14 -14
- package/src/components/ToolbarMenu.tsx +26 -28
- package/src/hooks/index.ts +5 -0
- package/src/{hooks.ts → hooks/useMenuActions.ts} +1 -1
- package/src/index.ts +1 -1
- package/src/testing/generator.ts +111 -0
- package/src/testing/index.ts +1 -107
- package/src/{defs.ts → types.ts} +1 -4
- package/src/util.ts +7 -7
- package/dist/types/src/defs.d.ts.map +0 -1
- package/dist/types/src/hooks.d.ts.map +0 -1
- package/dist/types/src/testing/Menus.stories.d.ts.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../src/components/DropdownMenu.tsx", "../../../src/components/ActionLabel.tsx", "../../../src/translations.ts", "../../../src/util.ts", "../../../src/components/MenuContext.tsx", "../../../src/components/ToolbarMenu.tsx", "../../../src/
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, { type MouseEvent, type MutableRefObject, 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 '../defs';\n\nexport type DropdownMenuProps = DropdownMenuRootProps & {\n group?: MenuItemGroup;\n items?: MenuItem[];\n suppressNextTooltip?: MutableRefObject<boolean>;\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 suppressNextTooltip,\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 { onAction } = useMenu('DropdownMenuRoot', __menuScope);\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 const items = useMenuItems(group, propsItems);\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 {...naturalProps}\n >\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, 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 { 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 './defs';\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// TODO(thure,wittjosiah): This is probably a smell; consider the whether react-ui-menu should use action nodes if the\n// callback in `data` is never used. See https://github.com/dxos/dxos/pull/8506#discussion_r1925855118\nconst noop = () => {};\n\nexport const createMenuAction = <P extends {} = {}>(id: string, properties: P & MenuActionProperties) =>\n ({\n id,\n type: ACTION_TYPE,\n properties,\n data: noop,\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 Node } from '@dxos/app-graph';\n\nimport {\n type MenuActionHandler,\n type MenuAction,\n type MenuContextValue,\n type MenuItem,\n type MenuItemGroup,\n} from '../defs';\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<any>>(MENU_NAME);\n\nexport const menuContextDefaults: MenuContextValue<MenuAction> = {\n iconSize: 5,\n onAction: () => {},\n resolveGroupItems: () => null,\n};\n\nconst useMenuScope = createMenuScope();\n\nconst MenuProvider = <A extends Node = MenuAction>({\n children,\n resolveGroupItems = menuContextDefaults.resolveGroupItems,\n onAction = menuContextDefaults.onAction as MenuActionHandler<A>,\n iconSize = menuContextDefaults.iconSize,\n attendableId,\n}: PropsWithChildren<Partial<MenuContextValue<A>>>) => {\n const { scope } = useMenuScope(undefined);\n return (\n <MenuContextProvider\n resolveGroupItems={resolveGroupItems}\n onAction={onAction}\n iconSize={iconSize}\n attendableId={attendableId}\n scope={scope}\n >\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 { resolveGroupItems } = useMenu(consumerName, __menuScope);\n return useMemo(() => propsItems ?? resolveGroupItems?.(group) ?? undefined, [propsItems, group, resolveGroupItems]);\n};\n\nexport { useMenu, createMenuScope, MenuProvider };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useRef } from 'react';\n\nimport { Icon, type IconButtonProps, Toolbar as NaturalToolbar, type ToolbarRootProps } from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\n\nimport { ActionLabel } from './ActionLabel';\nimport { DropdownMenu } from './DropdownMenu';\nimport { type MenuScopedProps, useMenu, useMenuItems } from './MenuContext';\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 '../defs';\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;\n\nexport type ToolbarMenuActionGroupProps = {\n group: MenuItemGroup<ToolbarMenuActionGroupProperties>;\n items?: MenuItem[];\n};\n\nconst ActionToolbarItem = ({ action, __menuScope }: MenuScopedProps<{ action: MenuAction }>) => {\n const { onAction, iconSize } = useMenu('ActionToolbarItem', __menuScope);\n const handleClick = useCallback(() => {\n onAction?.(action);\n }, [action, onAction]);\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={action} /> }\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 IconButtonProps)}\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 suppressNextTooltip = useRef(false);\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 label = (\n <ActionLabel action={(group.properties as any).applyActive && activeItem ? (activeItem as MenuAction) : group} />\n );\n const rootProps = icon\n ? { icon, size: iconSize, iconOnly, label, caretDown: true, suppressNextTooltip }\n : {\n children: (\n <>\n {label}\n <Icon size={3} icon='ph--caret-down--bold' classNames='mis-1' />\n </>\n ),\n };\n return (\n <DropdownMenu.Root group={group} items={items} suppressNextTooltip={suppressNextTooltip}>\n <DropdownMenu.Trigger asChild>\n <Root\n variant='ghost'\n disabled={disabled}\n {...(rootProps as IconButtonProps)}\n {...(testId && { 'data-testid': testId })}\n />\n </DropdownMenu.Trigger>\n </DropdownMenu.Root>\n );\n};\n\nconst ToggleGroupItem = ({ action, __menuScope }: MenuScopedProps<{ action: MenuAction }>) => {\n const { iconSize, onAction } = useMenu('ToggleGroupItem', __menuScope);\n const { icon, iconOnly = true, disabled, testId, hidden, classNames } = action.properties;\n const handleClick = useCallback(() => {\n onAction?.(action);\n }, [action, onAction]);\n const Root = icon ? NaturalToolbar.ToggleGroupIconItem : NaturalToolbar.ToggleGroupItem;\n const rootProps = icon\n ? { icon, size: iconSize, iconOnly, label: <ActionLabel action={action} /> }\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 IconButtonProps)}\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} action={action} />\n ))\n }\n </NaturalToolbar.ToggleGroup>\n );\n};\n\nexport const ToolbarMenu = ({ __menuScope, classNames, ...props }: MenuScopedProps<ToolbarMenuProps>) => {\n const items = useMenuItems(undefined, undefined, 'ToolbarMenu', __menuScope);\n const { attendableId } = useMenu('ToolbarMenu', __menuScope);\n const { hasAttention } = useAttention(attendableId);\n return (\n <NaturalToolbar.Root\n {...props}\n classNames={['p-0 pointer-fine:p-1 attention-surface', !hasAttention && 'opacity-20', classNames]}\n >\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 </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 type MenuActionHandler<A extends Node = MenuAction> = (action: A) => void;\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<A extends Node = MenuAction> = {\n resolveGroupItems: MenuItemsResolver;\n iconSize: IconButtonProps['size'];\n onAction: MenuActionHandler<A>;\n attendableId?: string;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useSignalEffect } from '@preact/signals-react';\nimport { useCallback, useState } from 'react';\n\nimport { Graph, type NodeArg, type Node } from '@dxos/app-graph';\n\nimport { type MenuItem, type MenuItemGroup } from './defs';\n\ntype Edge = { source: string; target: string };\n\nconst edgesArrayToRecord = (edges: { source: string; target: string }[]): Record<string, string[]> => {\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 ).map(([id, { outbound }]): [string, string[]] => [id, outbound]),\n );\n};\n\nexport type ActionGraphNodes = NodeArg<any>[];\nexport type ActionGraphEdges = Edge[];\nexport type ActionGraphProps = { nodes: ActionGraphNodes; edges: ActionGraphEdges };\n\nexport const useMenuActions = (actionCreator: () => ActionGraphProps) => {\n const initialMenuGraphProps = actionCreator();\n\n const [graph] = useState(\n new Graph({ nodes: initialMenuGraphProps.nodes as Node[], edges: edgesArrayToRecord(initialMenuGraphProps.edges) }),\n );\n\n useSignalEffect(() => {\n const menuGraphProps = actionCreator();\n // @ts-ignore\n graph._addNodes(menuGraphProps.nodes);\n // @ts-ignore\n graph._addEdges(menuGraphProps.edges);\n });\n\n const resolveGroupItems = useCallback(\n (sourceNode: MenuItemGroup = graph.root as MenuItemGroup) => {\n if (graph) {\n return (graph.nodes(sourceNode, { filter: (n): n is any => true }) || null) as MenuItem[] | null;\n } else {\n return null;\n }\n },\n [graph],\n );\n\n return { resolveGroupItems };\n};\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,0CAAqC;AACrC,mBAA2E;AAE3E,sBAAsF;ACHtF,IAAAA,gBAAkB;AAGlB,sBAA2B;AAC3B,IAAAC,
|
|
6
|
-
"names": ["import_react", "import_react_ui", "import_app_graph", "translationKey", "getShortcut", "action", "properties", "keyBinding", "getHostPlatform", "
|
|
3
|
+
"sources": ["../../../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 2025 DXOS.org\n//\n\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport React, { type MouseEvent, type MutableRefObject, 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 suppressNextTooltip?: MutableRefObject<boolean>;\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 suppressNextTooltip,\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 if (suppressNextTooltip) {\n suppressNextTooltip.current = true;\n }\n setOptionsMenuOpen(false);\n void action.data?.({ parent: group, caller });\n },\n [suppressNextTooltip, group, caller],\n );\n\n const items = useMenuItems(group, propsItems);\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 {...naturalProps}\n >\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 resolveGroupItems: () => null,\n};\n\nconst useMenuScope = createMenuScope();\n\nconst MenuProvider = ({\n children,\n resolveGroupItems = menuContextDefaults.resolveGroupItems,\n iconSize = menuContextDefaults.iconSize,\n attendableId,\n}: PropsWithChildren<Partial<MenuContextValue>>) => {\n const { scope } = useMenuScope(undefined);\n return (\n <MenuContextProvider\n resolveGroupItems={resolveGroupItems}\n iconSize={iconSize}\n attendableId={attendableId}\n scope={scope}\n >\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 { resolveGroupItems } = useMenu(consumerName, __menuScope);\n return useMemo(() => propsItems ?? resolveGroupItems?.(group) ?? undefined, [propsItems, group, resolveGroupItems]);\n};\n\nexport { useMenu, createMenuScope, MenuProvider };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useRef } from 'react';\n\nimport { Icon, Toolbar as NaturalToolbar, type ToolbarRootProps, useTranslation } from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\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;\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 suppressNextTooltip = useRef(false);\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, suppressNextTooltip }\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} suppressNextTooltip={suppressNextTooltip}>\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 = ({ __menuScope, classNames, ...props }: MenuScopedProps<ToolbarMenuProps>) => {\n const items = useMenuItems(undefined, undefined, 'ToolbarMenu', __menuScope);\n const { attendableId } = useMenu('ToolbarMenu', __menuScope);\n const { hasAttention } = useAttention(attendableId);\n return (\n <NaturalToolbar.Root\n {...props}\n classNames={['p-0 pointer-fine:p-1 attention-surface', !hasAttention && 'opacity-20', classNames]}\n >\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 </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 resolveGroupItems: MenuItemsResolver;\n iconSize: IconButtonProps['size'];\n attendableId?: string;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useSignalEffect } from '@preact/signals-react';\nimport { useCallback, useState } from 'react';\n\nimport { Graph, type NodeArg, type Node } from '@dxos/app-graph';\n\nimport { type MenuItem, type MenuItemGroup } from '../types';\n\ntype Edge = { source: string; target: string };\n\nconst edgesArrayToRecord = (edges: { source: string; target: string }[]): Record<string, string[]> => {\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 ).map(([id, { outbound }]): [string, string[]] => [id, outbound]),\n );\n};\n\nexport type ActionGraphNodes = NodeArg<any>[];\nexport type ActionGraphEdges = Edge[];\nexport type ActionGraphProps = { nodes: ActionGraphNodes; edges: ActionGraphEdges };\n\nexport const useMenuActions = (actionCreator: () => ActionGraphProps) => {\n const initialMenuGraphProps = actionCreator();\n\n const [graph] = useState(\n new Graph({ nodes: initialMenuGraphProps.nodes as Node[], edges: edgesArrayToRecord(initialMenuGraphProps.edges) }),\n );\n\n useSignalEffect(() => {\n const menuGraphProps = actionCreator();\n // @ts-ignore\n graph._addNodes(menuGraphProps.nodes);\n // @ts-ignore\n graph._addEdges(menuGraphProps.edges);\n });\n\n const resolveGroupItems = useCallback(\n (sourceNode: MenuItemGroup = graph.root as MenuItemGroup) => {\n if (graph) {\n return (graph.nodes(sourceNode, { filter: (n): n is any => true }) || null) as MenuItem[] | null;\n } else {\n return null;\n }\n },\n [graph],\n );\n\n return { resolveGroupItems };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_react", "import_react_ui", "import_app_graph", "translationKey", "getShortcut", "action", "properties", "keyBinding", "getHostPlatform", "createMenuAction", "id", "invoke", "type", "ACTION_TYPE", "data", "createMenuItemGroup", "ACTION_GROUP_TYPE", "actionGroupSymbol", "createGapSeparator", "source", "nodes", "variant", "undefined", "edges", "target", "createLineSeparator", "ActionLabel", "shortcut", "t", "useTranslation", "React", "span", "className", "toLocalizedString", "label", "mx", "descriptionText", "keySymbols", "join", "actionLabel", "MENU_NAME", "createMenuContext", "createMenuScope", "createContextScope", "MenuContextProvider", "useMenu", "menuContextDefaults", "iconSize", "resolveGroupItems", "useMenuScope", "MenuProvider", "children", "attendableId", "scope", "useMenuItems", "group", "propsItems", "consumerName", "__menuScope", "useMemo", "DropdownMenuItem", "item", "onClick", "handleClick", "useCallback", "event", "NaturalDropdownMenu", "Item", "classNames", "disabled", "testId", "icon", "Icon", "size", "DropdownMenuRoot", "items", "open", "defaultOpen", "onOpenChange", "suppressNextTooltip", "caller", "naturalProps", "optionsMenuOpen", "setOptionsMenuOpen", "useControllableState", "prop", "defaultProp", "onChange", "handleActionClick", "stopPropagation", "current", "parent", "Root", "nextOpen", "Portal", "Content", "Viewport", "map", "key", "Arrow", "DropdownMenu", "Trigger", "VirtualTrigger", "MenuSeparatorType", "isSeparator", "node", "isMenuGroup", "ActionToolbarItem", "iconOnly", "hidden", "NaturalToolbar", "IconButton", "Button", "rootProps", "DropdownMenuToolbarItem", "useRef", "activeItem", "find", "checked", "applyActive", "labelAction", "caretDown", "asChild", "ToggleGroupItem", "ToggleGroupIconItem", "value", "ToggleGroupToolbarItem", "selectCardinality", "ToggleGroup", "ToolbarMenu", "props", "hasAttention", "useAttention", "i", "Separator", "edgesArrayToRecord", "Object", "fromEntries", "entries", "reduce", "acc", "inbound", "outbound", "sourceEdges", "includes", "push", "targetEdges", "useMenuActions", "actionCreator", "initialMenuGraphProps", "graph", "useState", "Graph", "useSignalEffect", "menuGraphProps", "_addNodes", "_addEdges", "sourceNode", "root", "filter", "n"]
|
|
7
7
|
}
|
package/dist/lib/node/meta.json
CHANGED
|
@@ -1 +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":
|
|
1
|
+
{"inputs":{"packages/ui/react-ui-menu/src/translations.ts":{"bytes":909,"imports":[],"format":"esm"},"packages/ui/react-ui-menu/src/util.ts":{"bytes":5996,"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":4200,"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/MenuContext.tsx":{"bytes":5149,"imports":[{"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":11327,"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"},{"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":3247,"imports":[{"path":"@dxos/app-graph","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-menu/src/components/ToolbarMenu.tsx":{"bytes":22625,"imports":[{"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":"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":718,"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":7491,"imports":[{"path":"@preact/signals-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":521,"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":1114,"imports":[{"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/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":31700},"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/app-graph","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"react","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/app-graph","kind":"import-statement","external":true},{"path":"@preact/signals-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","useMenu","useMenuActions","useMenuItems"],"entryPoint":"packages/ui/react-ui-menu/src/index.ts","inputs":{"packages/ui/react-ui-menu/src/components/DropdownMenu.tsx":{"bytesInOutput":2562},"packages/ui/react-ui-menu/src/components/ActionLabel.tsx":{"bytesInOutput":862},"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":1039},"packages/ui/react-ui-menu/src/components/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-menu/src/components/ToolbarMenu.tsx":{"bytesInOutput":5651},"packages/ui/react-ui-menu/src/types.ts":{"bytesInOutput":258},"packages/ui/react-ui-menu/src/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-menu/src/hooks/useMenuActions.ts":{"bytesInOutput":1519},"packages/ui/react-ui-menu/src/hooks/index.ts":{"bytesInOutput":0}},"bytes":14062}}}
|
|
@@ -27,13 +27,11 @@ import { getHostPlatform } from "@dxos/util";
|
|
|
27
27
|
var getShortcut = (action) => {
|
|
28
28
|
return typeof action.properties?.keyBinding === "string" ? action.properties.keyBinding : action.properties?.keyBinding?.[getHostPlatform()];
|
|
29
29
|
};
|
|
30
|
-
var
|
|
31
|
-
};
|
|
32
|
-
var createMenuAction = (id, properties) => ({
|
|
30
|
+
var createMenuAction = (id, invoke, properties) => ({
|
|
33
31
|
id,
|
|
34
32
|
type: ACTION_TYPE,
|
|
35
33
|
properties,
|
|
36
|
-
data:
|
|
34
|
+
data: invoke
|
|
37
35
|
});
|
|
38
36
|
var createMenuItemGroup = (id, properties) => ({
|
|
39
37
|
id,
|
|
@@ -88,6 +86,10 @@ var ActionLabel = ({ action }) => {
|
|
|
88
86
|
className: mx("shrink-0", descriptionText)
|
|
89
87
|
}, keySymbols(shortcut).join("")));
|
|
90
88
|
};
|
|
89
|
+
var actionLabel = (action, t) => {
|
|
90
|
+
const shortcut = getShortcut(action);
|
|
91
|
+
return `${toLocalizedString(action.properties.label, t)}${shortcut ? ` (${keySymbols(shortcut).join("")})` : ""}`;
|
|
92
|
+
};
|
|
91
93
|
|
|
92
94
|
// packages/ui/react-ui-menu/src/components/MenuContext.tsx
|
|
93
95
|
import { createContextScope } from "@radix-ui/react-context";
|
|
@@ -97,16 +99,13 @@ var [createMenuContext, createMenuScope] = createContextScope(MENU_NAME, []);
|
|
|
97
99
|
var [MenuContextProvider, useMenu] = createMenuContext(MENU_NAME);
|
|
98
100
|
var menuContextDefaults = {
|
|
99
101
|
iconSize: 5,
|
|
100
|
-
onAction: () => {
|
|
101
|
-
},
|
|
102
102
|
resolveGroupItems: () => null
|
|
103
103
|
};
|
|
104
104
|
var useMenuScope = createMenuScope();
|
|
105
|
-
var MenuProvider = ({ children, resolveGroupItems = menuContextDefaults.resolveGroupItems,
|
|
105
|
+
var MenuProvider = ({ children, resolveGroupItems = menuContextDefaults.resolveGroupItems, iconSize = menuContextDefaults.iconSize, attendableId }) => {
|
|
106
106
|
const { scope } = useMenuScope(void 0);
|
|
107
107
|
return /* @__PURE__ */ React2.createElement(MenuContextProvider, {
|
|
108
108
|
resolveGroupItems,
|
|
109
|
-
onAction,
|
|
110
109
|
iconSize,
|
|
111
110
|
attendableId,
|
|
112
111
|
scope
|
|
@@ -143,13 +142,12 @@ var DropdownMenuItem = ({ item, onClick, __menuScope }) => {
|
|
|
143
142
|
action
|
|
144
143
|
}));
|
|
145
144
|
};
|
|
146
|
-
var DropdownMenuRoot = ({ items: propsItems, group, open, defaultOpen, onOpenChange, suppressNextTooltip, children, __menuScope, ...naturalProps }) => {
|
|
145
|
+
var DropdownMenuRoot = ({ items: propsItems, group, open, defaultOpen, onOpenChange, suppressNextTooltip, caller, children, __menuScope, ...naturalProps }) => {
|
|
147
146
|
const [optionsMenuOpen, setOptionsMenuOpen] = useControllableState({
|
|
148
147
|
prop: open,
|
|
149
148
|
defaultProp: defaultOpen,
|
|
150
149
|
onChange: onOpenChange
|
|
151
150
|
});
|
|
152
|
-
const { onAction } = useMenu("DropdownMenuRoot", __menuScope);
|
|
153
151
|
const handleActionClick = useCallback((action, event) => {
|
|
154
152
|
if (action.properties?.disabled) {
|
|
155
153
|
return;
|
|
@@ -159,9 +157,14 @@ var DropdownMenuRoot = ({ items: propsItems, group, open, defaultOpen, onOpenCha
|
|
|
159
157
|
suppressNextTooltip.current = true;
|
|
160
158
|
}
|
|
161
159
|
setOptionsMenuOpen(false);
|
|
162
|
-
|
|
160
|
+
void action.data?.({
|
|
161
|
+
parent: group,
|
|
162
|
+
caller
|
|
163
|
+
});
|
|
163
164
|
}, [
|
|
164
|
-
|
|
165
|
+
suppressNextTooltip,
|
|
166
|
+
group,
|
|
167
|
+
caller
|
|
165
168
|
]);
|
|
166
169
|
const items = useMenuItems(group, propsItems);
|
|
167
170
|
return /* @__PURE__ */ React3.createElement(NaturalDropdownMenu.Root, {
|
|
@@ -187,10 +190,10 @@ var DropdownMenu = {
|
|
|
187
190
|
|
|
188
191
|
// packages/ui/react-ui-menu/src/components/ToolbarMenu.tsx
|
|
189
192
|
import React4, { useCallback as useCallback2, useRef } from "react";
|
|
190
|
-
import { Icon as Icon2, Toolbar as NaturalToolbar } from "@dxos/react-ui";
|
|
193
|
+
import { Icon as Icon2, Toolbar as NaturalToolbar, useTranslation as useTranslation2 } from "@dxos/react-ui";
|
|
191
194
|
import { useAttention } from "@dxos/react-ui-attention";
|
|
192
195
|
|
|
193
|
-
// packages/ui/react-ui-menu/src/
|
|
196
|
+
// packages/ui/react-ui-menu/src/types.ts
|
|
194
197
|
import { ACTION_GROUP_TYPE as ACTION_GROUP_TYPE2 } from "@dxos/app-graph";
|
|
195
198
|
var MenuSeparatorType = "@dxos/react-ui-toolbar/separator";
|
|
196
199
|
var isSeparator = (node) => node.type === MenuSeparatorType;
|
|
@@ -198,12 +201,10 @@ var isMenuGroup = (node) => node.type === ACTION_GROUP_TYPE2;
|
|
|
198
201
|
|
|
199
202
|
// packages/ui/react-ui-menu/src/components/ToolbarMenu.tsx
|
|
200
203
|
var ActionToolbarItem = ({ action, __menuScope }) => {
|
|
201
|
-
const {
|
|
202
|
-
const
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
action,
|
|
206
|
-
onAction
|
|
204
|
+
const { iconSize } = useMenu("ActionToolbarItem", __menuScope);
|
|
205
|
+
const { t } = useTranslation2(translationKey);
|
|
206
|
+
const handleClick = useCallback2(() => action.data?.(), [
|
|
207
|
+
action
|
|
207
208
|
]);
|
|
208
209
|
const { icon, iconOnly = true, disabled, testId, hidden, classNames } = action.properties;
|
|
209
210
|
const Root = icon ? NaturalToolbar.IconButton : NaturalToolbar.Button;
|
|
@@ -211,9 +212,7 @@ var ActionToolbarItem = ({ action, __menuScope }) => {
|
|
|
211
212
|
icon,
|
|
212
213
|
size: iconSize,
|
|
213
214
|
iconOnly,
|
|
214
|
-
label:
|
|
215
|
-
action
|
|
216
|
-
})
|
|
215
|
+
label: actionLabel(action, t)
|
|
217
216
|
} : {
|
|
218
217
|
children: /* @__PURE__ */ React4.createElement(ActionLabel, {
|
|
219
218
|
action
|
|
@@ -234,24 +233,25 @@ var ActionToolbarItem = ({ action, __menuScope }) => {
|
|
|
234
233
|
var DropdownMenuToolbarItem = ({ group, items: propsItems, __menuScope }) => {
|
|
235
234
|
const { iconOnly, disabled, testId } = group.properties;
|
|
236
235
|
const suppressNextTooltip = useRef(false);
|
|
236
|
+
const { t } = useTranslation2(translationKey);
|
|
237
237
|
const { iconSize } = useMenu("DropdownMenuToolbarItem", __menuScope);
|
|
238
238
|
const items = useMenuItems(group, propsItems, "DropdownMenuToolbarItem", __menuScope);
|
|
239
239
|
const activeItem = items?.find((item) => !!item.properties.checked);
|
|
240
240
|
const icon = group.properties.applyActive && // TODO(thure): Handle other menu item types.
|
|
241
241
|
activeItem?.properties.icon || group.properties.icon;
|
|
242
242
|
const Root = icon ? NaturalToolbar.IconButton : NaturalToolbar.Button;
|
|
243
|
-
const
|
|
244
|
-
action: group.properties.applyActive && activeItem ? activeItem : group
|
|
245
|
-
});
|
|
243
|
+
const labelAction = group.properties.applyActive && activeItem ? activeItem : group;
|
|
246
244
|
const rootProps = icon ? {
|
|
247
245
|
icon,
|
|
248
246
|
size: iconSize,
|
|
249
247
|
iconOnly,
|
|
250
|
-
label,
|
|
248
|
+
label: actionLabel(labelAction, t),
|
|
251
249
|
caretDown: true,
|
|
252
250
|
suppressNextTooltip
|
|
253
251
|
} : {
|
|
254
|
-
children: /* @__PURE__ */ React4.createElement(React4.Fragment, null,
|
|
252
|
+
children: /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement(ActionLabel, {
|
|
253
|
+
action: labelAction
|
|
254
|
+
}), /* @__PURE__ */ React4.createElement(Icon2, {
|
|
255
255
|
size: 3,
|
|
256
256
|
icon: "ph--caret-down--bold",
|
|
257
257
|
classNames: "mis-1"
|
|
@@ -272,23 +272,22 @@ var DropdownMenuToolbarItem = ({ group, items: propsItems, __menuScope }) => {
|
|
|
272
272
|
}
|
|
273
273
|
})));
|
|
274
274
|
};
|
|
275
|
-
var ToggleGroupItem = ({ action, __menuScope }) => {
|
|
276
|
-
const { iconSize
|
|
275
|
+
var ToggleGroupItem = ({ group, action, __menuScope }) => {
|
|
276
|
+
const { iconSize } = useMenu("ToggleGroupItem", __menuScope);
|
|
277
|
+
const { t } = useTranslation2(translationKey);
|
|
277
278
|
const { icon, iconOnly = true, disabled, testId, hidden, classNames } = action.properties;
|
|
278
|
-
const handleClick = useCallback2(() => {
|
|
279
|
-
|
|
280
|
-
}, [
|
|
279
|
+
const handleClick = useCallback2(() => action.data?.({
|
|
280
|
+
parent: group
|
|
281
|
+
}), [
|
|
281
282
|
action,
|
|
282
|
-
|
|
283
|
+
group
|
|
283
284
|
]);
|
|
284
285
|
const Root = icon ? NaturalToolbar.ToggleGroupIconItem : NaturalToolbar.ToggleGroupItem;
|
|
285
286
|
const rootProps = icon ? {
|
|
286
287
|
icon,
|
|
287
288
|
size: iconSize,
|
|
288
289
|
iconOnly,
|
|
289
|
-
label:
|
|
290
|
-
action
|
|
291
|
-
})
|
|
290
|
+
label: actionLabel(action, t)
|
|
292
291
|
} : {
|
|
293
292
|
children: /* @__PURE__ */ React4.createElement(ActionLabel, {
|
|
294
293
|
action
|
|
@@ -322,6 +321,7 @@ var ToggleGroupToolbarItem = ({ group, items: propsItems, __menuScope }) => {
|
|
|
322
321
|
// TODO(thure): Handle other menu item types.
|
|
323
322
|
items.map((action) => /* @__PURE__ */ React4.createElement(ToggleGroupItem, {
|
|
324
323
|
key: action.id,
|
|
324
|
+
group,
|
|
325
325
|
action
|
|
326
326
|
}))
|
|
327
327
|
)
|
|
@@ -362,7 +362,7 @@ var ToolbarMenu = ({ __menuScope, classNames, ...props }) => {
|
|
|
362
362
|
)));
|
|
363
363
|
};
|
|
364
364
|
|
|
365
|
-
// packages/ui/react-ui-menu/src/hooks.ts
|
|
365
|
+
// packages/ui/react-ui-menu/src/hooks/useMenuActions.ts
|
|
366
366
|
import { useSignalEffect } from "@preact/signals-react";
|
|
367
367
|
import { useCallback as useCallback3, useState } from "react";
|
|
368
368
|
import { Graph } from "@dxos/app-graph";
|