import type { Block, Component, LiteralUnion, ToolbarButtonProps, Trait, TraitProperties } from 'grapesjs'; import { MenuListItem, MenuListItemActionProps } from '../components/MenuList'; import { WithEditorProps } from './common'; export interface ContextMenuItem extends Omit { onClick?: (props: MenuListItemActionProps & WithEditorProps) => void; } export interface ToolbarItem extends ToolbarButtonProps { tooltip?: string; } export declare enum ComponentContextMenuSource { canvas = "canvas", layers = "layers" } export declare enum ComponentContextMenuItem { selectParent = "selectParent", duplicate = "duplicate", delete = "delete", symbolCreate = "symbolCreate", symbolDetach = "symbolDetach", symbolOverride = "symbolOverride", symbolOverrideClear = "symbolOverrideClear" } export interface ComponentContextMenuProps extends WithEditorProps { items: ContextMenuItem[]; component: Component; type: string; source: LiteralUnion; event?: Event; } export interface ComponentToolbarProps extends WithEditorProps { items: ToolbarItem[]; component: Component; } export type ContextMenuItemResult = ContextMenuItem | false | undefined | null; export type ToolbarItemResult = ToolbarItem | false | undefined | null; export type ContextMenuFn = (props: ComponentContextMenuProps) => ContextMenuItemResult[] | Promise; export type ToolbarFn = (props: ComponentToolbarProps) => ToolbarItemResult[] | Promise; export interface StudioTraitProperties extends TraitProperties { tip?: string; labelToTitle?: boolean; subTraits?: Record; visible?: (props: { component: Component; trait: Trait; }) => boolean; } export interface StyleManagerConfigFnProps extends WithEditorProps { component: Component; } export interface StudioStyleManagerConfig { disabled?: boolean; } export type StyleManagerConfigFn = (props: StyleManagerConfigFnProps) => StudioStyleManagerConfig; export interface SelectorManagerConfigFnProps extends WithEditorProps { component: Component; } export interface StudioSelectorManagerConfig { /** * Disable classes selector */ disableClasses?: boolean; /** * Disable component selector */ disableComponent?: boolean; } export type SelectorManagerConfigFn = (props: SelectorManagerConfigFnProps) => StudioSelectorManagerConfig; export interface DropTarget { component: Component; } export type DropTargetItems = (DropTarget | null | false | undefined)[]; export interface DropTargetObjectResult { items?: DropTargetItems; notFound?: string; } export interface DropTargetsFnProps extends WithEditorProps { root: Component; block?: Block; component?: Component; } export type DropTargetResult = DropTargetItems | DropTargetObjectResult; export type DropTargetsFn = (props: DropTargetsFnProps) => DropTargetResult | Promise; export interface ComponentAppendFallbackResult { /** * Component used as parent for the fallback insertion. */ target?: Component; /** * Content appended to the target when the fallback is used. */ content?: unknown; /** * Error message to surface when the append fallback cannot insert anything. */ notFound?: string; } export interface ComponentAppendFallbackFnProps extends WithEditorProps { /** * Original content resolved from the block or command input. */ content: unknown; /** * Source block, when the fallback is triggered from a block insertion. */ block?: Block; /** * Valid custom drop targets resolved from the component type. */ dropTargets: DropTarget[]; } export type ComponentAppendFallbackFn = (props: ComponentAppendFallbackFnProps) => ComponentAppendFallbackResult | void; export interface ComponentsConfig { /** * Extend the component context menu. * @example * contextMenu: ({ items, editor, component, type }) => { * return [ * ...items, * { * id: 'customGlobalAction', * label: 'Custom Global Action', * onClick: () => alert('Component HTML: ' + component.toHTML()), * }, * type === 'image' && { id: 'customImageAction', label: 'Only for images' }, * ] * } */ contextMenu?: ContextMenuFn; /** * Extend the component toolbar menu. * @example * toolbar: ({ items, editor, component, type }) => { * return [ * ...items, * { * id: 'customGlobalAction', * label: 'Custom Global Action', * command: () => alert('Component HTML: ' + component.toHTML()), * } * ] * } */ toolbar?: ToolbarFn; }