bridgerte 0.9.2 → 0.9.3

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-hd9Zi2DV.cjs","sources":["../../dom/src/menuIcon/uiIcons.ts","../../dom/src/richTextToolbar/groupMenuKeyboard.ts","../../dom/src/richTextToolbar/render.ts","../../dom/src/richTextToolbar/index.ts"],"sourcesContent":["/**\n * DOM UI chrome icon 表。\n *\n * 这里放 toolbar 收纳入口、下拉箭头这类控件自身图标。它们不属于 `MenuItem.icon`\n * 跨端 schema,也不应该进入 `defaultMenuIcons` 的 schema 对齐检查。\n */\nexport const defaultMenuUiIcons = {\n toolbarGroup: `\n <svg\n aria-hidden=\"true\"\n class=\"lucide lucide-ellipsis\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"19\" cy=\"12\" r=\"1\" />\n <circle cx=\"5\" cy=\"12\" r=\"1\" />\n </svg>\n `,\n chevronDown: `\n <svg\n aria-hidden=\"true\"\n class=\"lucide lucide-chevron-down\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n `\n} as const;\n","export const getEnabledGroupMenuButtons = (menuElement: HTMLElement) => (\n Array.from(\n menuElement.querySelectorAll<HTMLButtonElement>('.bridgerte__toolbar-group-menu-item')\n ).filter((button) => !button.disabled)\n);\n\nexport const focusToolbarGroupMenuItem = (menuElement: HTMLElement, index: number) => {\n const buttons = getEnabledGroupMenuButtons(menuElement);\n const nextButton = buttons[index];\n\n if (nextButton) nextButton.focus();\n};\n\nexport const focusFirstToolbarGroupMenuItem = (menuElement: HTMLElement) => {\n /*\n * group menu 使用 ARIA menu 语义,打开后焦点必须进入第一个可操作项。\n * 这样键盘用户可以继续用方向键浏览,而不是停留在展开按钮上。\n */\n focusToolbarGroupMenuItem(menuElement, 0);\n};\n\nexport const handleToolbarGroupMenuKeyDown = (\n event: KeyboardEvent,\n menuElement: HTMLElement,\n returnButton: HTMLButtonElement,\n executeToolbarButton: (button: HTMLButtonElement) => void,\n closeGroupMenu: () => void\n) => {\n const buttons = getEnabledGroupMenuButtons(menuElement);\n const activeIndex = document.activeElement instanceof HTMLButtonElement\n ? buttons.indexOf(document.activeElement)\n : -1;\n const focusByOffset = (offset: number) => {\n if (buttons.length === 0) return;\n\n const baseIndex = activeIndex >= 0 ? activeIndex : 0;\n const nextIndex = (baseIndex + offset + buttons.length) % buttons.length;\n\n buttons[nextIndex]?.focus();\n };\n\n /*\n * ARIA menu 语义要求支持 roving focus。这里不改 toolbar 的横向键盘模型,\n * 只在已打开的纵向收纳菜单内处理上下方向、首尾跳转和执行/关闭。\n */\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n focusByOffset(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n focusByOffset(-1);\n break;\n case 'Home':\n event.preventDefault();\n buttons[0]?.focus();\n break;\n case 'End':\n event.preventDefault();\n buttons.at(-1)?.focus();\n break;\n case 'Enter':\n case ' ':\n if (document.activeElement instanceof HTMLButtonElement) {\n event.preventDefault();\n executeToolbarButton(document.activeElement);\n closeGroupMenu();\n returnButton.focus();\n }\n break;\n case 'Escape':\n event.preventDefault();\n returnButton.focus();\n closeGroupMenu();\n break;\n default:\n break;\n }\n};\n","import type { CommandState } from '@bridgerte/core';\nimport type { MenuItem, ResolvedToolbarItem } from '@bridgerte/native-spec';\nimport {\n appendMenuIcon,\n defaultMenuIcons,\n defaultMenuUiIcons\n} from './icons';\nimport { getMenuStateForItem } from '../menuRuntime';\nimport type {\n RichTextToolbarIcons,\n ToolbarGroupMenuState\n} from './type';\n\nexport const toolbarGroupButtonSelector = 'button[data-bridgerte-toolbar-group-id]';\nexport const toolbarButtonSelector = 'button[data-bridgerte-toolbar-item-id]';\n// 可执行按钮同时覆盖 toolbar 主按钮和 group menu 子项,避免浮层子菜单绕过统一命令入口。\nexport const toolbarExecutableButtonSelector = [\n toolbarButtonSelector,\n '.bridgerte__toolbar-group-menu-item'\n].join(',');\n\nconst getGroupMenuState = (items: MenuItem[], commandStates: CommandState[]) => {\n const itemStates = items.map((item) => getMenuStateForItem(item, commandStates));\n\n return {\n active: itemStates.some((state) => state.active),\n disabled: itemStates.length > 0 && itemStates.every((state) => state.disabled)\n };\n};\n\nconst renderToolbarButton = (\n groupElement: HTMLElement,\n item: MenuItem,\n commandStates: CommandState[],\n icons: RichTextToolbarIcons,\n enableTooltip: boolean\n) => {\n const state = getMenuStateForItem(item, commandStates);\n const button = document.createElement('button');\n // icon 兜底顺序固定为:业务覆盖 > DOM 默认 SVG > label 文本。\n const iconSvg = icons[item.icon] ?? defaultMenuIcons[item.icon];\n\n button.type = 'button';\n button.className = 'bridgerte__toolbar-button';\n button.disabled = state.disabled;\n button.dataset.active = String(state.active);\n button.dataset.bridgerteToolbarItemId = item.id;\n button.setAttribute('aria-label', item.label);\n button.setAttribute('aria-pressed', String(state.active));\n if (enableTooltip) button.dataset.tooltip = item.label;\n\n appendMenuIcon(button, iconSvg, item.label);\n\n groupElement.append(button);\n};\n\nconst renderToolbarGroupButton = (\n groupElement: HTMLElement,\n toolbarItem: Extract<ResolvedToolbarItem, { type: 'group' }>,\n commandStates: CommandState[],\n icons: RichTextToolbarIcons,\n enableTooltip: boolean\n) => {\n const button = document.createElement('button');\n const groupState = getGroupMenuState(toolbarItem.items, commandStates);\n const iconSvg = toolbarItem.icon\n ? icons[toolbarItem.icon] ?? defaultMenuIcons[toolbarItem.icon]\n : defaultMenuUiIcons.toolbarGroup;\n const indicator = document.createElement('span');\n\n button.type = 'button';\n button.className = 'bridgerte__toolbar-button bridgerte__toolbar-group-button';\n button.disabled = groupState.disabled;\n button.dataset.active = String(groupState.active);\n button.dataset.bridgerteToolbarGroupId = toolbarItem.key;\n button.dataset.open = 'false';\n button.setAttribute('aria-label', toolbarItem.title);\n button.setAttribute('aria-haspopup', 'menu');\n button.setAttribute('aria-expanded', 'false');\n button.setAttribute('aria-pressed', String(groupState.active));\n if (enableTooltip) button.dataset.tooltip = toolbarItem.title;\n\n appendMenuIcon(button, iconSvg, toolbarItem.title);\n\n indicator.className = 'bridgerte__toolbar-group-indicator';\n indicator.setAttribute('aria-hidden', 'true');\n indicator.innerHTML = defaultMenuUiIcons.chevronDown;\n button.append(indicator);\n groupElement.append(button);\n};\n\n/**\n * 渲染 toolbar 横向主入口。\n *\n * 字符串菜单渲染为按钮,`|` 渲染分割线,group 只渲染一个收纳入口;组内命令交给\n * renderToolbarGroupMenu 渲染,避免 `menuKeys` 退化成另一种横向分隔语法。\n */\nexport const renderToolbar = (\n toolbarElement: HTMLElement,\n toolbarItems: ResolvedToolbarItem[],\n commandStates: CommandState[],\n icons: RichTextToolbarIcons,\n enableTooltip: boolean\n) => {\n toolbarElement.textContent = '';\n\n let currentGroup = '';\n let groupElement: HTMLDivElement | null = null;\n\n toolbarItems.forEach((toolbarItem) => {\n if (toolbarItem.type === 'separator') {\n currentGroup = '';\n groupElement = null;\n\n const separatorElement = document.createElement('span');\n\n separatorElement.className = 'bridgerte__toolbar-separator';\n separatorElement.dataset.separatorId = toolbarItem.key;\n separatorElement.setAttribute('aria-hidden', 'true');\n toolbarElement.append(separatorElement);\n return;\n }\n\n const nextGroup = toolbarItem.type === 'button' ? toolbarItem.item.group : toolbarItem.key;\n\n if (!groupElement || currentGroup !== nextGroup) {\n currentGroup = nextGroup;\n groupElement = document.createElement('div');\n groupElement.className = 'bridgerte__toolbar-group';\n groupElement.dataset.group = nextGroup;\n if (toolbarItem.type === 'group') {\n groupElement.setAttribute('aria-label', toolbarItem.title);\n }\n toolbarElement.append(groupElement);\n }\n\n const activeGroupElement = groupElement;\n\n if (toolbarItem.type === 'button') {\n renderToolbarButton(\n activeGroupElement,\n toolbarItem.item,\n commandStates,\n icons,\n enableTooltip\n );\n return;\n }\n\n renderToolbarGroupButton(\n activeGroupElement,\n toolbarItem,\n commandStates,\n icons,\n enableTooltip\n );\n });\n};\n\n/**\n * 渲染 group button 打开的纵向收纳菜单。\n *\n * 浮层只展示 MenuItem 子项并复用现有 item id,点击执行仍由 index.ts 统一走 EditorAPI。\n */\nexport const renderToolbarGroupMenu = (\n menuElement: HTMLElement,\n groupMenuState: ToolbarGroupMenuState | null,\n commandStates: CommandState[],\n icons: RichTextToolbarIcons\n) => {\n menuElement.textContent = '';\n\n if (!groupMenuState) {\n menuElement.dataset.visible = 'false';\n return;\n }\n\n groupMenuState.items.forEach((item) => {\n const state = getMenuStateForItem(item, commandStates);\n const button = document.createElement('button');\n const iconSvg = icons[item.icon] ?? defaultMenuIcons[item.icon];\n const labelElement = document.createElement('span');\n\n button.type = 'button';\n button.className = 'bridgerte__menu-item bridgerte__toolbar-group-menu-item';\n button.disabled = state.disabled;\n button.dataset.active = String(state.active);\n button.dataset.bridgerteToolbarItemId = item.id;\n button.setAttribute('role', 'menuitem');\n button.setAttribute('aria-label', item.label);\n button.setAttribute('aria-pressed', String(state.active));\n\n appendMenuIcon(button, iconSvg, item.label);\n labelElement.className = 'bridgerte__toolbar-group-menu-label';\n labelElement.textContent = item.label;\n button.append(labelElement);\n menuElement.append(button);\n });\n\n menuElement.dataset.visible = 'true';\n menuElement.style.minWidth = `${groupMenuState.button.offsetWidth}px`;\n};\n\nexport const syncToolbarGroupButtonState = (\n container: HTMLElement,\n groupMenuState: ToolbarGroupMenuState | null\n) => {\n container.querySelectorAll<HTMLButtonElement>(toolbarGroupButtonSelector).forEach((button) => {\n const open = groupMenuState?.groupKey === button.dataset.bridgerteToolbarGroupId;\n\n button.dataset.open = String(open);\n button.setAttribute('aria-expanded', String(open));\n });\n};\n\nexport const findToolbarGroupMenuItem = (\n toolbarItems: ResolvedToolbarItem[],\n groupKey: string | undefined\n) => toolbarItems.find((item): item is Extract<ResolvedToolbarItem, { type: 'group' }> => (\n item.type === 'group' && item.key === groupKey\n));\n","import type { CommandState } from '@bridgerte/core';\nimport {\n defaultMenuSchema,\n resolveToolbarMenu\n} from '@bridgerte/native-spec';\nimport { createFloatingLayer, type RichTextFloatingLayer } from '../floatingLayer';\nimport { bindTouchPressedState } from '../interactionState';\nimport {\n getPayloadPanelCurrentValues,\n resolveMenuSchemaForDom\n} from '../menuRuntime';\nimport {\n focusFirstToolbarGroupMenuItem,\n handleToolbarGroupMenuKeyDown\n} from './groupMenuKeyboard';\nimport {\n findToolbarGroupMenuItem,\n renderToolbar,\n renderToolbarGroupMenu,\n syncToolbarGroupButtonState,\n toolbarExecutableButtonSelector,\n toolbarGroupButtonSelector\n} from './render';\nimport type {\n RichTextToolbarAPI,\n ToolbarGroupMenuState,\n RichTextToolbarOptions,\n ToolbarDragState\n} from './type';\n\nconst toolbarDragClickThresholdPx = 4;\nconst toolbarTooltipOffsetPx = 8;\nconst toolbarGroupMenuOffsetPx = 6;\n\nexport type * from './type';\n\nconst canUseHoverTooltip = () => (\n typeof window !== 'undefined'\n && window.matchMedia?.('(hover: hover) and (pointer: fine)').matches === true\n);\n\nconst getToolbarButtonFromTarget = (target: EventTarget | null) => {\n /*\n * 图标覆盖常用 SVG,H5 pointer 事件可能落在 svg/path 上。\n * 这里用 Element 而不是 HTMLElement,保证触屏兜底和 click 都能向上命中真实按钮。\n */\n const button = target instanceof Element\n ? target.closest<HTMLButtonElement>(toolbarExecutableButtonSelector)\n : null;\n\n return button instanceof HTMLButtonElement ? button : null;\n};\n\nconst getToolbarGroupButtonFromTarget = (target: EventTarget | null) => {\n const button = target instanceof Element\n ? target.closest<HTMLButtonElement>(toolbarGroupButtonSelector)\n : null;\n\n return button instanceof HTMLButtonElement ? button : null;\n};\n\n/**\n * 创建独立菜单实例。\n *\n * toolbar/tabbar 只订阅 EditorAPI 状态并派发命令,不接触编辑器内部 DOM 或 Lexical 实例。\n */\nexport function createRichTextToolbar(\n container: HTMLElement,\n options: RichTextToolbarOptions\n): RichTextToolbarAPI {\n const placement = options.placement ?? 'top';\n const menuSchema = resolveMenuSchemaForDom(options.menuSchema ?? defaultMenuSchema, {\n menuLabels: options.menuLabels,\n payloadPanelConfig: options.payloadPanelConfig\n });\n const toolbarItems = resolveToolbarMenu(options.toolbarConfig, menuSchema);\n /*\n * click 事件只需要能执行命令的菜单项。分割线和 group 容器是渲染结构,\n * 先在这里摊平,后续点击时就不用理解 toolbarConfig 的展示层级。\n */\n const executableMenuItems = toolbarItems.flatMap((toolbarItem) => (\n toolbarItem.type === 'button' ? [toolbarItem.item]\n : toolbarItem.type === 'group' ? toolbarItem.items\n : []\n ));\n const icons = options.icons ?? {};\n /*\n * tooltip 只属于 PC 精细指针体验。H5 上即使没有原生 title,部分浏览器也会把 hover/mouseover\n * 模拟成首触摸状态,导致第一次点像是只唤醒提示;所以触屏端不写 tooltip 数据也不挂监听。\n */\n const enableTooltip = canUseHoverTooltip();\n const tooltipElement = document.createElement('div');\n const groupMenuElement = document.createElement('div');\n const overlayHost = container.closest('.bridgerte') ?? container;\n let destroyed = false;\n let dragState: ToolbarDragState | null = null;\n let shouldSuppressNextClick = false;\n let latestCommandStates = options.editor.getCommandStates();\n let groupMenuState: ToolbarGroupMenuState | null = null;\n let groupMenuFloatingLayer: RichTextFloatingLayer | null = null;\n const clearToolbarPressedState = bindTouchPressedState(container, {\n targetSelector: [\n 'button[data-bridgerte-toolbar-item-id]',\n 'button[data-bridgerte-toolbar-group-id]'\n ].join(',')\n });\n const clearGroupMenuPressedState = bindTouchPressedState(groupMenuElement, {\n targetSelector: '.bridgerte__toolbar-group-menu-item'\n });\n\n const mountToolbarOverlays = () => {\n // 独立 toolbar 可能不在 `.bridgerte` 内,渲染按钮会清空 container,需要把浮层重新挂回去。\n overlayHost.append(tooltipElement);\n overlayHost.append(groupMenuElement);\n };\n\n const closeGroupMenuFloatingLayer = () => {\n groupMenuFloatingLayer?.setOpen(false);\n groupMenuFloatingLayer?.destroy();\n groupMenuFloatingLayer = null;\n };\n\n const openGroupMenuFloatingLayer = () => {\n if (!groupMenuState) return;\n\n closeGroupMenuFloatingLayer();\n /*\n * group menu 和 hoverbar/mention/slash 一样属于轻浮层,必须走 floatingLayer。\n * 这里按 toolbar placement 给出首选方向,真正的翻转、键盘可视区和左右夹紧交给\n * createFloatingLayer 内部的 visualViewport + flip + shift + clamp 统一处理。\n */\n groupMenuFloatingLayer = createFloatingLayer(groupMenuState.button, groupMenuElement, {\n placement: placement === 'bottom' ? 'top-start' : 'bottom-start',\n offset: toolbarGroupMenuOffsetPx,\n strategy: 'fixed'\n });\n groupMenuFloatingLayer.setOpen(true);\n };\n\n const closeGroupMenu = () => {\n closeGroupMenuFloatingLayer();\n groupMenuState = null;\n renderToolbarGroupMenu(groupMenuElement, groupMenuState, latestCommandStates, icons);\n syncToolbarGroupButtonState(container, groupMenuState);\n };\n\n const renderStates = (states: CommandState[]) => {\n if (destroyed) return;\n\n latestCommandStates = states;\n if (groupMenuState) closeGroupMenuFloatingLayer();\n renderToolbar(container, toolbarItems, states, icons, enableTooltip);\n mountToolbarOverlays();\n if (groupMenuState) {\n const nextButton = Array.from(\n container.querySelectorAll<HTMLButtonElement>(toolbarGroupButtonSelector)\n ).find((button) => button.dataset.bridgerteToolbarGroupId === groupMenuState?.groupKey);\n const nextGroupItem = findToolbarGroupMenuItem(toolbarItems, groupMenuState.groupKey);\n\n groupMenuState = nextButton && nextGroupItem\n ? {\n groupKey: groupMenuState.groupKey,\n button: nextButton,\n items: nextGroupItem.items\n }\n : null;\n renderToolbarGroupMenu(groupMenuElement, groupMenuState, latestCommandStates, icons);\n syncToolbarGroupButtonState(container, groupMenuState);\n if (groupMenuState) openGroupMenuFloatingLayer();\n }\n };\n\n const update = () => {\n if (destroyed) return;\n\n renderStates(options.editor.getCommandStates());\n };\n\n const hideTooltip = () => {\n tooltipElement.dataset.visible = 'false';\n tooltipElement.textContent = '';\n };\n\n const showTooltip = (button: HTMLButtonElement) => {\n const tooltipText = button.dataset.tooltip;\n\n if (!enableTooltip || !tooltipText || dragState) return;\n\n const buttonRect = button.getBoundingClientRect();\n\n tooltipElement.textContent = tooltipText;\n tooltipElement.dataset.visible = 'true';\n tooltipElement.style.left = `${buttonRect.left + buttonRect.width / 2}px`;\n tooltipElement.style.top = `${buttonRect.top - toolbarTooltipOffsetPx}px`;\n };\n\n const handleTooltipTarget = (event: Event) => {\n const button = getToolbarButtonFromTarget(event.target);\n\n if (button) {\n showTooltip(button);\n }\n };\n\n const handleTooltipLeave = (event: MouseEvent) => {\n const relatedTarget = event.relatedTarget;\n const button = getToolbarButtonFromTarget(event.target);\n\n if (\n button\n && relatedTarget instanceof Node\n && button.contains(relatedTarget)\n ) return;\n\n hideTooltip();\n };\n\n const stopToolbarDrag = () => {\n dragState = null;\n\n delete container.dataset.dragging;\n // 拖动过程中监听挂在 document 上,松手或 destroy 必须统一清掉,避免离开 toolbar 后残留滚动状态。\n document.removeEventListener('pointermove', handlePointerMove);\n document.removeEventListener('pointerup', handlePointerUp);\n document.removeEventListener('pointercancel', handlePointerUp);\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n if (!dragState) return;\n\n const deltaX = dragState.startClientX - event.clientX;\n\n if (Math.abs(deltaX) > toolbarDragClickThresholdPx) {\n dragState.hasDragged = true;\n shouldSuppressNextClick = true;\n hideTooltip();\n closeGroupMenu();\n }\n\n container.scrollLeft = dragState.startScrollLeft + deltaX;\n };\n\n const handlePointerUp = (event: PointerEvent) => {\n const currentDragState = dragState;\n\n stopToolbarDrag();\n if (\n currentDragState\n && event.type !== 'pointercancel'\n && currentDragState.pointerType !== 'mouse'\n && !currentDragState.hasDragged\n && currentDragState.startButton\n ) {\n executeToolbarButton(currentDragState.startButton);\n shouldSuppressNextClick = true;\n }\n };\n\n const handlePointerDown = (event: PointerEvent) => {\n if (event.pointerType === 'mouse' && event.button !== 0) return;\n\n const startButton = getToolbarButtonFromTarget(event.target);\n\n // 点击和拖动 toolbar 都要保留编辑区 selection,命令才能继续作用在原选区。\n event.preventDefault();\n dragState = {\n startClientX: event.clientX,\n startScrollLeft: container.scrollLeft,\n pointerType: event.pointerType,\n hasDragged: false,\n startButton: startButton ?? undefined\n };\n container.dataset.dragging = 'true';\n hideTooltip();\n // pointermove 放到 document,保证用户按住 X 轴拖出 toolbar 后仍能完成滚动和释放。\n document.addEventListener('pointermove', handlePointerMove);\n document.addEventListener('pointerup', handlePointerUp);\n document.addEventListener('pointercancel', handlePointerUp);\n };\n\n const executeToolbarButton = (button: HTMLButtonElement) => {\n if (!(button instanceof HTMLButtonElement) || button.disabled) return;\n\n const menuItem = executableMenuItems.find((item) => (\n item.id === button.dataset.bridgerteToolbarItemId\n ));\n\n if (!menuItem) return;\n\n if (menuItem.payloadPanel) {\n const buttonRect = button.getBoundingClientRect();\n\n /*\n * 带 payloadPanel 的菜单不直接执行基础 command,而是发起参数请求。\n * DOM 内置面板和业务/RN/Flutter 自绘都走同一个 request,避免后续颜色、\n * 字体、链接等参数菜单各自发明一套协议。\n */\n options.editor.requestPayloadPanel({\n menuId: menuItem.id,\n command: menuItem.command,\n panel: menuItem.payloadPanel,\n currentValues: getPayloadPanelCurrentValues(menuItem, options.editor.getCommandStates()),\n anchorRect: {\n x: buttonRect.left,\n y: buttonRect.top,\n width: buttonRect.width,\n height: buttonRect.height\n }\n });\n return;\n }\n\n options.editor.executeCommand(menuItem.command);\n };\n\n const toggleGroupMenu = (button: HTMLButtonElement) => {\n const groupItem = findToolbarGroupMenuItem(\n toolbarItems,\n button.dataset.bridgerteToolbarGroupId\n );\n\n if (!groupItem || button.disabled) return;\n\n if (groupMenuState?.groupKey === groupItem.key) {\n closeGroupMenu();\n return;\n }\n\n groupMenuState = {\n groupKey: groupItem.key,\n button,\n items: groupItem.items\n };\n hideTooltip();\n renderToolbarGroupMenu(groupMenuElement, groupMenuState, latestCommandStates, icons);\n syncToolbarGroupButtonState(container, groupMenuState);\n openGroupMenuFloatingLayer();\n focusFirstToolbarGroupMenuItem(groupMenuElement);\n };\n\n const handleClick = (event: MouseEvent) => {\n if (shouldSuppressNextClick) {\n shouldSuppressNextClick = false;\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n const groupButton = getToolbarGroupButtonFromTarget(event.target);\n if (groupButton) {\n event.preventDefault();\n event.stopPropagation();\n toggleGroupMenu(groupButton);\n return;\n }\n\n const button = getToolbarButtonFromTarget(event.target);\n if (!button) return;\n\n event.preventDefault();\n event.stopPropagation();\n executeToolbarButton(button);\n closeGroupMenu();\n };\n\n const handleGroupMenuPointerDown = (event: PointerEvent) => {\n /*\n * group 菜单浮层挂在 toolbar 容器外,不能复用容器级 pointerdown。\n * 子菜单点击仍要保留编辑区 selection,否则格式命令会丢失原选区。\n */\n if (event.pointerType === 'mouse' && event.button !== 0) return;\n\n event.preventDefault();\n };\n\n const handleDocumentClick = (event: MouseEvent) => {\n const target = event.target;\n\n if (\n target instanceof Node\n && (container.contains(target) || groupMenuElement.contains(target))\n ) return;\n\n closeGroupMenu();\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (groupMenuState && groupMenuElement.contains(document.activeElement)) {\n handleToolbarGroupMenuKeyDown(\n event,\n groupMenuElement,\n groupMenuState.button,\n executeToolbarButton,\n closeGroupMenu\n );\n return;\n }\n\n if (event.key !== 'Escape') return;\n\n closeGroupMenu();\n };\n\n container.classList.add('bridgerte__toolbar');\n tooltipElement.className = 'bridgerte__toolbar-tooltip';\n tooltipElement.dataset.visible = 'false';\n groupMenuElement.className = 'bridgerte__floating-menu bridgerte__toolbar-group-menu';\n groupMenuElement.dataset.visible = 'false';\n groupMenuElement.setAttribute('role', 'menu');\n container.dataset.placement = placement;\n container.setAttribute('role', 'toolbar');\n container.setAttribute(\n 'aria-label',\n placement === 'bottom' ? 'BridgeRTE tabbar' : 'BridgeRTE toolbar'\n );\n container.addEventListener('pointerdown', handlePointerDown, true);\n container.addEventListener('click', handleClick);\n groupMenuElement.addEventListener('pointerdown', handleGroupMenuPointerDown, true);\n groupMenuElement.addEventListener('click', handleClick);\n document.addEventListener('click', handleDocumentClick);\n document.addEventListener('keydown', handleKeyDown);\n if (enableTooltip) {\n container.addEventListener('mouseover', handleTooltipTarget);\n container.addEventListener('mouseout', handleTooltipLeave);\n }\n container.addEventListener('focusout', hideTooltip);\n // 浮层挂在最近的编辑器根容器下,既能继承变量,也不会操作编辑内容 DOM。\n mountToolbarOverlays();\n\n // 独立 toolbar 只订阅 public API 状态,不依赖 DOM 编辑器内部实现。\n const unsubscribe = options.editor.subscribeCommandStateChange(renderStates);\n\n return {\n update,\n destroy() {\n if (destroyed) return;\n\n destroyed = true;\n stopToolbarDrag();\n unsubscribe();\n closeGroupMenu();\n container.removeEventListener('pointerdown', handlePointerDown, true);\n container.removeEventListener('click', handleClick);\n groupMenuElement.removeEventListener('pointerdown', handleGroupMenuPointerDown, true);\n groupMenuElement.removeEventListener('click', handleClick);\n document.removeEventListener('click', handleDocumentClick);\n document.removeEventListener('keydown', handleKeyDown);\n if (enableTooltip) {\n container.removeEventListener('mouseover', handleTooltipTarget);\n container.removeEventListener('mouseout', handleTooltipLeave);\n }\n clearToolbarPressedState();\n clearGroupMenuPressedState();\n container.removeEventListener('focusout', hideTooltip);\n tooltipElement.remove();\n groupMenuElement.remove();\n container.classList.remove('bridgerte__toolbar');\n delete container.dataset.placement;\n container.textContent = '';\n container.removeAttribute('role');\n container.removeAttribute('aria-label');\n }\n };\n}\n"],"names":["defaultMenuUiIcons","getEnabledGroupMenuButtons","menuElement","button","focusToolbarGroupMenuItem","index","nextButton","focusFirstToolbarGroupMenuItem","handleToolbarGroupMenuKeyDown","event","returnButton","executeToolbarButton","closeGroupMenu","buttons","activeIndex","focusByOffset","offset","nextIndex","_a","_b","toolbarGroupButtonSelector","toolbarButtonSelector","toolbarExecutableButtonSelector","getGroupMenuState","items","commandStates","itemStates","item","getMenuStateForItem","state","renderToolbarButton","groupElement","icons","enableTooltip","iconSvg","defaultMenuIcons","appendMenuIcon","renderToolbarGroupButton","toolbarItem","groupState","indicator","renderToolbar","toolbarElement","toolbarItems","currentGroup","separatorElement","nextGroup","activeGroupElement","renderToolbarGroupMenu","groupMenuState","labelElement","syncToolbarGroupButtonState","container","open","findToolbarGroupMenuItem","groupKey","toolbarDragClickThresholdPx","toolbarTooltipOffsetPx","toolbarGroupMenuOffsetPx","canUseHoverTooltip","getToolbarButtonFromTarget","target","getToolbarGroupButtonFromTarget","createRichTextToolbar","options","placement","menuSchema","resolveMenuSchemaForDom","defaultMenuSchema","resolveToolbarMenu","executableMenuItems","tooltipElement","groupMenuElement","overlayHost","destroyed","dragState","shouldSuppressNextClick","latestCommandStates","groupMenuFloatingLayer","clearToolbarPressedState","bindTouchPressedState","clearGroupMenuPressedState","mountToolbarOverlays","closeGroupMenuFloatingLayer","openGroupMenuFloatingLayer","createFloatingLayer","renderStates","states","nextGroupItem","update","hideTooltip","showTooltip","tooltipText","buttonRect","handleTooltipTarget","handleTooltipLeave","relatedTarget","stopToolbarDrag","handlePointerMove","handlePointerUp","deltaX","currentDragState","handlePointerDown","startButton","menuItem","getPayloadPanelCurrentValues","toggleGroupMenu","groupItem","handleClick","groupButton","handleGroupMenuPointerDown","handleDocumentClick","handleKeyDown","unsubscribe"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./index-GaS65GL0.cjs"),a=require("./bridge.cjs"),e=require("./native-spec.cjs"),o=require("./index-CkgUKPh3.cjs"),r=require("./index-CqOH1_5N.cjs"),n=require("./core.cjs");exports.BRIDGERTE_CONTENT_VERSION=t.BRIDGERTE_CONTENT_VERSION;exports.BRIDGERTE_TABLE_INSERT_MAX_COLS=t.BRIDGERTE_TABLE_INSERT_MAX_COLS;exports.BRIDGERTE_TABLE_INSERT_MAX_ROWS=t.BRIDGERTE_TABLE_INSERT_MAX_ROWS;exports.BRIDGE_CONTENT_CHANGE_DEBOUNCE_MS=a.BRIDGE_CONTENT_CHANGE_DEBOUNCE_MS;exports.BRIDGE_HEIGHT_CHANGE_THROTTLE_MS=a.BRIDGE_HEIGHT_CHANGE_THROTTLE_MS;exports.defaultBridgeEventTiming=a.defaultBridgeEventTiming;exports.isBridgeMessage=a.isBridgeMessage;exports.codeBlockLanguagePanel=e.codeBlockLanguagePanel;exports.codeBlockLanguagePayloadPanel=e.codeBlockLanguagePayloadPanel;exports.createDisabledCommandStates=e.createDisabledCommandStates;exports.defaultMenuSchema=e.defaultMenuSchema;exports.defaultToolbarConfig=e.defaultToolbarConfig;exports.getCommandStateMatchValue=e.getCommandStateMatchValue;exports.isCommandStateForCommand=e.isCommandStateForCommand;exports.isMenuItemCommandState=e.isMenuItemCommandState;exports.resolveToolbarMenu=e.resolveToolbarMenu;exports.tableHeaderMenuItems=e.tableHeaderMenuItems;exports.createFloatingLayer=o.createFloatingLayer;exports.createRichTextEditor=o.createRichTextEditor;exports.createWebViewBridgeRuntime=o.createWebViewBridgeRuntime;exports.createRichTextToolbar=r.createRichTextToolbar;exports.resolvePayloadPanelSchema=n.resolvePayloadPanelSchema;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./index-GaS65GL0.cjs"),a=require("./bridge.cjs"),e=require("./native-spec.cjs"),o=require("./index-BaOlPu8L.cjs"),r=require("./index-hd9Zi2DV.cjs"),n=require("./core.cjs");exports.BRIDGERTE_CONTENT_VERSION=t.BRIDGERTE_CONTENT_VERSION;exports.BRIDGERTE_TABLE_INSERT_MAX_COLS=t.BRIDGERTE_TABLE_INSERT_MAX_COLS;exports.BRIDGERTE_TABLE_INSERT_MAX_ROWS=t.BRIDGERTE_TABLE_INSERT_MAX_ROWS;exports.BRIDGE_CONTENT_CHANGE_DEBOUNCE_MS=a.BRIDGE_CONTENT_CHANGE_DEBOUNCE_MS;exports.BRIDGE_HEIGHT_CHANGE_THROTTLE_MS=a.BRIDGE_HEIGHT_CHANGE_THROTTLE_MS;exports.defaultBridgeEventTiming=a.defaultBridgeEventTiming;exports.isBridgeMessage=a.isBridgeMessage;exports.codeBlockLanguagePanel=e.codeBlockLanguagePanel;exports.codeBlockLanguagePayloadPanel=e.codeBlockLanguagePayloadPanel;exports.createDisabledCommandStates=e.createDisabledCommandStates;exports.defaultMenuSchema=e.defaultMenuSchema;exports.defaultToolbarConfig=e.defaultToolbarConfig;exports.getCommandStateMatchValue=e.getCommandStateMatchValue;exports.isCommandStateForCommand=e.isCommandStateForCommand;exports.isMenuItemCommandState=e.isMenuItemCommandState;exports.resolveToolbarMenu=e.resolveToolbarMenu;exports.tableHeaderMenuItems=e.tableHeaderMenuItems;exports.createFloatingLayer=o.createFloatingLayer;exports.createRichTextEditor=o.createRichTextEditor;exports.createWebViewBridgeRuntime=o.createWebViewBridgeRuntime;exports.createRichTextToolbar=r.createRichTextToolbar;exports.resolvePayloadPanelSchema=n.resolvePayloadPanelSchema;
2
2
  //# sourceMappingURL=index.cjs.map
package/dist/index.d.ts CHANGED
@@ -283,7 +283,7 @@ export type FormatClearScope = 'selection' | 'block';
283
283
  /**
284
284
  * 代码块语言标识。
285
285
  *
286
- * 保持 string 是为了兼容 highlight.js、Prism 或业务自定义语言表。
286
+ * 保持 string 是为了兼容 Shiki、highlight.js 或业务自定义语言表。
287
287
  */
288
288
  export type CodeBlockLanguage = string;
289
289
  /**
@@ -527,7 +527,14 @@ export type SlashCommandMenuAnchorRect = {
527
527
  width: number;
528
528
  height: number;
529
529
  };
530
+ /**
531
+ * slash command 菜单展示配置。
532
+ *
533
+ * `showIcon` 只决定默认候选菜单是否展示 icon;候选数据仍保留 icon key,方便 DOM、
534
+ * WebView 或业务自绘层按自己的 UI 策略渲染。
535
+ */
530
536
  export type SlashCommandMenuConfig = {
537
+ showIcon?: boolean;
531
538
  loadingText?: string;
532
539
  emptyText?: string;
533
540
  errorText?: string;
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { B as o, a as t, b as r } from "./index-CuNKUHed.js";
2
2
  import { BRIDGE_CONTENT_CHANGE_DEBOUNCE_MS as m, BRIDGE_HEIGHT_CHANGE_THROTTLE_MS as T, defaultBridgeEventTiming as l, isBridgeMessage as n } from "./bridge.js";
3
3
  import { codeBlockLanguagePanel as _, codeBlockLanguagePayloadPanel as s, createDisabledCommandStates as c, defaultMenuSchema as i, defaultToolbarConfig as R, getCommandStateMatchValue as B, isCommandStateForCommand as S, isMenuItemCommandState as g, resolveToolbarMenu as C, tableHeaderMenuItems as u } from "./native-spec.js";
4
- import { c as f, a as M, b as N } from "./index-KRuLtGv9.js";
5
- import { c as x } from "./index-DRWIM218.js";
4
+ import { c as f, a as M, b as N } from "./index-BwZ0II4h.js";
5
+ import { c as x } from "./index-bN5Hs6-3.js";
6
6
  import { resolvePayloadPanelSchema as D } from "./core.js";
7
7
  export {
8
8
  o as BRIDGERTE_CONTENT_VERSION,
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("./index-GaS65GL0.cjs"),g={id:"code-block-language",title:"代码语言",fields:[{type:"select",name:"language",label:"语言",defaultValue:"",options:[{label:"纯文本",value:""},{label:"C",value:"c"},{label:"C-like",value:"clike"},{label:"C++",value:"cpp"},{label:"CSS",value:"css"},{label:"HTML",value:"html"},{label:"Java",value:"java"},{label:"JavaScript",value:"javascript"},{label:"JSON",value:"json"},{label:"Markdown",value:"markdown"},{label:"Objective-C",value:"objc"},{label:"PowerShell",value:"powershell"},{label:"Python",value:"python"},{label:"Rust",value:"rust"},{label:"SQL",value:"sql"},{label:"Swift",value:"swift"},{label:"TypeScript",value:"typescript"},{label:"XML",value:"xml"}]}]},k=g,x={id:"text-color",title:"文字颜色",fields:[{type:"color",name:"value",label:"颜色"}]},P={id:"background-color",title:"背景色",fields:[{type:"color",name:"value",label:"背景"}]},S={id:"font-size",title:"字号",fields:[{type:"select",name:"value",label:"字号",defaultValue:"16px",options:[{label:"小号 14px",value:"14px"},{label:"正文 16px",value:"16px"},{label:"强调 18px",value:"18px"},{label:"标题 20px",value:"20px"},{label:"大标题 24px",value:"24px"}]}]},w={id:"font-family",title:"字体",fields:[{type:"select",name:"value",label:"字体",defaultValue:"",options:[{label:"跟随页面",value:""},{label:"无衬线",value:"sans-serif"},{label:"衬线",value:"serif"},{label:"等宽",value:"monospace"}]}]},M={id:"line-height",title:"行高",fields:[{type:"select",name:"value",label:"行高",defaultValue:"1.7",options:[{label:"紧凑 1.4",value:"1.4"},{label:"常规 1.7",value:"1.7"},{label:"舒展 2",value:"2"}]}]},T={id:"table-insert",title:"插入表格",fields:[{type:"number",name:"rows",label:"行数",defaultValue:"3",min:1,max:b.BRIDGERTE_TABLE_INSERT_MAX_ROWS,step:1},{type:"number",name:"cols",label:"列数",defaultValue:"3",min:1,max:b.BRIDGERTE_TABLE_INSERT_MAX_COLS,step:1}]},y=[{id:"table-insert-row-after",command:{type:"table.insertRow",direction:"after"},label:"插入行",icon:"rows-plus",group:"table"},{id:"table-delete-row",command:{type:"table.deleteRow"},label:"删除行",icon:"rows-minus",group:"table"},{id:"table-insert-column-after",command:{type:"table.insertColumn",direction:"after"},label:"插入列",icon:"columns-plus",group:"table"},{id:"table-delete-column",command:{type:"table.deleteColumn"},label:"删除列",icon:"columns-minus",group:"table"},{id:"table-delete",command:{type:"table.delete"},label:"删除表格",icon:"table-delete",group:"table"}],c=[{id:"bold",command:{type:"format.bold"},label:"加粗",icon:"bold",group:"text"},{id:"italic",command:{type:"format.italic"},label:"斜体",icon:"italic",group:"text"},{id:"underline",command:{type:"format.underline"},label:"下划线",icon:"underline",group:"text"},{id:"strike",command:{type:"format.strike"},label:"删除线",icon:"strikethrough",group:"text"},{id:"inline-code",command:{type:"format.inlineCode"},label:"行内代码",icon:"code",group:"text"},{id:"superscript",command:{type:"format.superscript"},label:"上标",icon:"superscript",group:"text"},{id:"subscript",command:{type:"format.subscript"},label:"下标",icon:"subscript",group:"text"},{id:"clear-style",command:{type:"format.clear"},label:"清除样式",icon:"remove-formatting",group:"text"},{id:"color",command:{type:"format.color",value:""},label:"文字颜色",icon:"palette",group:"style",requiresPayload:!0,payloadPanel:x},{id:"background-color",command:{type:"format.backgroundColor",value:""},label:"背景色",icon:"paint-bucket",group:"style",requiresPayload:!0,payloadPanel:P},{id:"font-size",command:{type:"format.fontSize",value:""},label:"字号",icon:"case-sensitive",group:"style",requiresPayload:!0,payloadPanel:S},{id:"font-family",command:{type:"format.fontFamily",value:""},label:"字体",icon:"type",group:"style",requiresPayload:!0,payloadPanel:w},{id:"line-height",command:{type:"format.lineHeight",value:""},label:"行高",icon:"wrap-text",group:"style",requiresPayload:!0,payloadPanel:M},{id:"paragraph",command:{type:"block.paragraph"},label:"正文",icon:"pilcrow",group:"block"},{id:"heading-1",command:{type:"block.heading",level:1},label:"一级标题",icon:"heading-1",group:"block"},{id:"heading-2",command:{type:"block.heading",level:2},label:"二级标题",icon:"heading-2",group:"block"},{id:"heading-3",command:{type:"block.heading",level:3},label:"三级标题",icon:"heading-3",group:"block"},{id:"heading-4",command:{type:"block.heading",level:4},label:"四级标题",icon:"heading-4",group:"block"},{id:"heading-5",command:{type:"block.heading",level:5},label:"五级标题",icon:"heading-5",group:"block"},{id:"heading-6",command:{type:"block.heading",level:6},label:"六级标题",icon:"heading-6",group:"block"},{id:"quote",command:{type:"block.quote"},label:"引用",icon:"quote",group:"block"},{id:"divider",command:{type:"block.divider"},label:"分割线",icon:"minus",group:"block"},{id:"code-block",command:{type:"block.code"},label:"代码块",icon:"square-code",group:"block"},{id:"ordered-list",command:{type:"list.ordered"},label:"有序列表",icon:"list-ordered",group:"list"},{id:"unordered-list",command:{type:"list.unordered"},label:"无序列表",icon:"list",group:"list"},{id:"todo-list",command:{type:"list.todo"},label:"待办列表",icon:"list-todo",group:"list"},{id:"align-left",command:{type:"align",value:"left"},label:"左对齐",icon:"align-left",group:"align"},{id:"align-center",command:{type:"align",value:"center"},label:"居中",icon:"align-center",group:"align"},{id:"align-right",command:{type:"align",value:"right"},label:"右对齐",icon:"align-right",group:"align"},{id:"align-justify",command:{type:"align",value:"justify"},label:"两端对齐",icon:"align-justify",group:"align"},{id:"indent-increase",command:{type:"indent.increase"},label:"增加缩进",icon:"indent-increase",group:"align"},{id:"indent-decrease",command:{type:"indent.decrease"},label:"减少缩进",icon:"indent-decrease",group:"align"},{id:"mention",command:{type:"mention.insert",item:{id:"",label:"",value:""}},label:"@ 提及",icon:"at-sign",group:"insert",requiresPayload:!0},{id:"upload-image",command:{type:"media.pickImage"},label:"上传图片",icon:"upload-image",group:"media"},{id:"upload-video",command:{type:"media.pickVideo"},label:"上传视频",icon:"upload-video",group:"media"},{id:"table",command:{type:"table.insert",rows:3,cols:3},label:"表格",icon:"table",group:"table",requiresPayload:!0,payloadPanel:T},...y,{id:"slash-command",command:{type:"slash.open"},label:"/ 命令",icon:"list-plus",group:"insert"},{id:"undo",command:{type:"history.undo"},label:"撤销",icon:"undo",group:"history"},{id:"redo",command:{type:"history.redo"},label:"重做",icon:"redo",group:"history"},{id:"clear",command:{type:"content.clear"},label:"清空",icon:"trash-2",group:"history"},{id:"fullscreen",command:{type:"fullscreen.toggle"},label:"全屏",icon:"maximize",group:"view"}],r={align:e=>e.type==="align"?e.value:void 0,"block.heading":e=>e.type==="block.heading"?e.level:void 0,"block.setCodeLanguage":e=>e.type==="block.setCodeLanguage"?e.language:void 0},u=e=>{var l;return(l=r[e.type])==null?void 0:l.call(r,e)},v=(e,l)=>{const a=u(e);return l.command===e.type&&(a===void 0||l.value===a)},q=(e,l)=>v(e.command,l);function I(e=c){return e.map(l=>({command:l.command.type,active:!1,disabled:!0,value:u(l.command)}))}const d={toolbarKeys:["undo","redo","clear","|","paragraph","heading-1","heading-2","heading-3","heading-4","heading-5","heading-6","quote","divider","code-block","|","bold","italic","underline","strike","inline-code","superscript","subscript","clear-style","color","background-color","font-size","font-family","line-height","|","ordered-list","unordered-list","todo-list","|","upload-image","upload-video","|","table","|","align-left","align-center","align-right","align-justify","indent-increase","indent-decrease","|","fullscreen"]},K=e=>typeof e=="object"&&Array.isArray(e.menuKeys),C=e=>new Map(e.map(l=>[l.id,l])),L=(e,l)=>typeof e=="string"?e!=="|"&&l.has(e):l.has(e.key)||e.menuKeys.every(a=>l.has(a)),j=(e,l)=>{const a=new Set((l==null?void 0:l.excludeKeys)??[]),n=e.filter(o=>!L(o,a));if(!(l!=null&&l.insertKeys))return n;const t=Math.max(0,Math.min(l.insertKeys.index,n.length));return[...n.slice(0,t),...l.insertKeys.keys,...n.slice(t)]},R=(e,l,a,n)=>{if(e==="|")return[{type:"separator",key:`separator-${n}`}];if(typeof e=="string"){const t=l.get(e);return!t||t.requiresPayload&&!t.payloadPanel||a.has(t.id)?[]:[{type:"button",item:t}]}if(K(e)){const t=e.menuKeys.filter(o=>!a.has(o)).map(o=>l.get(o)).filter(o=>o!==void 0&&(!o.requiresPayload||o.payloadPanel!==void 0));return t.length>0?[{type:"group",key:e.key,title:e.title,icon:e.icon,items:t}]:[]}return[]},E=(e,l)=>{if(e.type!=="separator")return!0;const a=l[l.length-1];return a!==void 0&&a.type!=="separator"},V=e=>{var l;for(;((l=e.at(-1))==null?void 0:l.type)==="separator";)e.pop();return e},_=(e=d,l=c)=>{const a=C(l),n=e.toolbarKeys??d.toolbarKeys??[],t=j(n,e),o=new Set(e.excludeKeys??[]);let s=0;const h=t.reduce((i,p)=>{const f=R(p,a,o,s);return p==="|"&&(s+=1),f.forEach(m=>{E(m,i)&&i.push(m)}),i},[]);return V(h)};exports.codeBlockLanguagePanel=g;exports.codeBlockLanguagePayloadPanel=k;exports.createDisabledCommandStates=I;exports.defaultMenuSchema=c;exports.defaultToolbarConfig=d;exports.getCommandStateMatchValue=u;exports.isCommandStateForCommand=v;exports.isMenuItemCommandState=q;exports.resolveToolbarMenu=_;exports.tableHeaderMenuItems=y;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("./index-GaS65GL0.cjs"),g={id:"code-block-language",title:"代码语言",fields:[{type:"select",name:"language",label:"语言",defaultValue:"",options:[{label:"纯文本",value:""},{label:"Bash",value:"shellscript"},{label:"C",value:"c"},{label:"C++",value:"cpp"},{label:"C#",value:"csharp"},{label:"CSS",value:"css"},{label:"Dart",value:"dart"},{label:"Dockerfile",value:"docker"},{label:"Go",value:"go"},{label:"HTML",value:"html"},{label:"Java",value:"java"},{label:"JavaScript",value:"javascript"},{label:"JSON",value:"json"},{label:"Kotlin",value:"kotlin"},{label:"Markdown",value:"markdown"},{label:"PHP",value:"php"},{label:"Python",value:"python"},{label:"Rust",value:"rust"},{label:"SQL",value:"sql"},{label:"Swift",value:"swift"},{label:"TOML",value:"toml"},{label:"TSX",value:"tsx"},{label:"TypeScript",value:"typescript"},{label:"Vue",value:"vue"},{label:"XML",value:"xml"},{label:"YAML",value:"yaml"}]}]},k=g,x={id:"text-color",title:"文字颜色",fields:[{type:"color",name:"value",label:"颜色"}]},P={id:"background-color",title:"背景色",fields:[{type:"color",name:"value",label:"背景"}]},S={id:"font-size",title:"字号",fields:[{type:"select",name:"value",label:"字号",defaultValue:"16px",options:[{label:"小号 14px",value:"14px"},{label:"正文 16px",value:"16px"},{label:"强调 18px",value:"18px"},{label:"标题 20px",value:"20px"},{label:"大标题 24px",value:"24px"}]}]},M={id:"font-family",title:"字体",fields:[{type:"select",name:"value",label:"字体",defaultValue:"",options:[{label:"跟随页面",value:""},{label:"无衬线",value:"sans-serif"},{label:"衬线",value:"serif"},{label:"等宽",value:"monospace"}]}]},T={id:"line-height",title:"行高",fields:[{type:"select",name:"value",label:"行高",defaultValue:"1.7",options:[{label:"紧凑 1.4",value:"1.4"},{label:"常规 1.7",value:"1.7"},{label:"舒展 2",value:"2"}]}]},w={id:"table-insert",title:"插入表格",fields:[{type:"number",name:"rows",label:"行数",defaultValue:"3",min:1,max:b.BRIDGERTE_TABLE_INSERT_MAX_ROWS,step:1},{type:"number",name:"cols",label:"列数",defaultValue:"3",min:1,max:b.BRIDGERTE_TABLE_INSERT_MAX_COLS,step:1}]},y=[{id:"table-insert-row-after",command:{type:"table.insertRow",direction:"after"},label:"插入行",icon:"rows-plus",group:"table"},{id:"table-delete-row",command:{type:"table.deleteRow"},label:"删除行",icon:"rows-minus",group:"table"},{id:"table-insert-column-after",command:{type:"table.insertColumn",direction:"after"},label:"插入列",icon:"columns-plus",group:"table"},{id:"table-delete-column",command:{type:"table.deleteColumn"},label:"删除列",icon:"columns-minus",group:"table"},{id:"table-delete",command:{type:"table.delete"},label:"删除表格",icon:"table-delete",group:"table"}],c=[{id:"bold",command:{type:"format.bold"},label:"加粗",icon:"bold",group:"text"},{id:"italic",command:{type:"format.italic"},label:"斜体",icon:"italic",group:"text"},{id:"underline",command:{type:"format.underline"},label:"下划线",icon:"underline",group:"text"},{id:"strike",command:{type:"format.strike"},label:"删除线",icon:"strikethrough",group:"text"},{id:"inline-code",command:{type:"format.inlineCode"},label:"行内代码",icon:"code",group:"text"},{id:"superscript",command:{type:"format.superscript"},label:"上标",icon:"superscript",group:"text"},{id:"subscript",command:{type:"format.subscript"},label:"下标",icon:"subscript",group:"text"},{id:"clear-style",command:{type:"format.clear"},label:"清除样式",icon:"remove-formatting",group:"text"},{id:"color",command:{type:"format.color",value:""},label:"文字颜色",icon:"palette",group:"style",requiresPayload:!0,payloadPanel:x},{id:"background-color",command:{type:"format.backgroundColor",value:""},label:"背景色",icon:"paint-bucket",group:"style",requiresPayload:!0,payloadPanel:P},{id:"font-size",command:{type:"format.fontSize",value:""},label:"字号",icon:"case-sensitive",group:"style",requiresPayload:!0,payloadPanel:S},{id:"font-family",command:{type:"format.fontFamily",value:""},label:"字体",icon:"type",group:"style",requiresPayload:!0,payloadPanel:M},{id:"line-height",command:{type:"format.lineHeight",value:""},label:"行高",icon:"wrap-text",group:"style",requiresPayload:!0,payloadPanel:T},{id:"paragraph",command:{type:"block.paragraph"},label:"正文",icon:"pilcrow",group:"block"},{id:"heading-1",command:{type:"block.heading",level:1},label:"一级标题",icon:"heading-1",group:"block"},{id:"heading-2",command:{type:"block.heading",level:2},label:"二级标题",icon:"heading-2",group:"block"},{id:"heading-3",command:{type:"block.heading",level:3},label:"三级标题",icon:"heading-3",group:"block"},{id:"heading-4",command:{type:"block.heading",level:4},label:"四级标题",icon:"heading-4",group:"block"},{id:"heading-5",command:{type:"block.heading",level:5},label:"五级标题",icon:"heading-5",group:"block"},{id:"heading-6",command:{type:"block.heading",level:6},label:"六级标题",icon:"heading-6",group:"block"},{id:"quote",command:{type:"block.quote"},label:"引用",icon:"quote",group:"block"},{id:"divider",command:{type:"block.divider"},label:"分割线",icon:"minus",group:"block"},{id:"code-block",command:{type:"block.code"},label:"代码块",icon:"square-code",group:"block"},{id:"ordered-list",command:{type:"list.ordered"},label:"有序列表",icon:"list-ordered",group:"list"},{id:"unordered-list",command:{type:"list.unordered"},label:"无序列表",icon:"list",group:"list"},{id:"todo-list",command:{type:"list.todo"},label:"待办列表",icon:"list-todo",group:"list"},{id:"align-left",command:{type:"align",value:"left"},label:"左对齐",icon:"align-left",group:"align"},{id:"align-center",command:{type:"align",value:"center"},label:"居中",icon:"align-center",group:"align"},{id:"align-right",command:{type:"align",value:"right"},label:"右对齐",icon:"align-right",group:"align"},{id:"align-justify",command:{type:"align",value:"justify"},label:"两端对齐",icon:"align-justify",group:"align"},{id:"indent-increase",command:{type:"indent.increase"},label:"增加缩进",icon:"indent-increase",group:"align"},{id:"indent-decrease",command:{type:"indent.decrease"},label:"减少缩进",icon:"indent-decrease",group:"align"},{id:"mention",command:{type:"mention.insert",item:{id:"",label:"",value:""}},label:"@ 提及",icon:"at-sign",group:"insert",requiresPayload:!0},{id:"upload-image",command:{type:"media.pickImage"},label:"上传图片",icon:"upload-image",group:"media"},{id:"upload-video",command:{type:"media.pickVideo"},label:"上传视频",icon:"upload-video",group:"media"},{id:"table",command:{type:"table.insert",rows:3,cols:3},label:"表格",icon:"table",group:"table",requiresPayload:!0,payloadPanel:w},...y,{id:"slash-command",command:{type:"slash.open"},label:"/ 命令",icon:"list-plus",group:"insert"},{id:"undo",command:{type:"history.undo"},label:"撤销",icon:"undo",group:"history"},{id:"redo",command:{type:"history.redo"},label:"重做",icon:"redo",group:"history"},{id:"clear",command:{type:"content.clear"},label:"清空",icon:"trash-2",group:"history"},{id:"fullscreen",command:{type:"fullscreen.toggle"},label:"全屏",icon:"maximize",group:"view"}],r={align:e=>e.type==="align"?e.value:void 0,"block.heading":e=>e.type==="block.heading"?e.level:void 0,"block.setCodeLanguage":e=>e.type==="block.setCodeLanguage"?e.language:void 0},u=e=>{var l;return(l=r[e.type])==null?void 0:l.call(r,e)},v=(e,l)=>{const a=u(e);return l.command===e.type&&(a===void 0||l.value===a)},K=(e,l)=>v(e.command,l);function q(e=c){return e.map(l=>({command:l.command.type,active:!1,disabled:!0,value:u(l.command)}))}const d={toolbarKeys:["undo","redo","clear","|","paragraph","heading-1","heading-2","heading-3","heading-4","heading-5","heading-6","quote","divider","code-block","|","bold","italic","underline","strike","inline-code","superscript","subscript","clear-style","color","background-color","font-size","font-family","line-height","|","ordered-list","unordered-list","todo-list","|","upload-image","upload-video","|","table","|","align-left","align-center","align-right","align-justify","indent-increase","indent-decrease","|","fullscreen"]},I=e=>typeof e=="object"&&Array.isArray(e.menuKeys),C=e=>new Map(e.map(l=>[l.id,l])),L=(e,l)=>typeof e=="string"?e!=="|"&&l.has(e):l.has(e.key)||e.menuKeys.every(a=>l.has(a)),R=(e,l)=>{const a=new Set((l==null?void 0:l.excludeKeys)??[]),n=e.filter(o=>!L(o,a));if(!(l!=null&&l.insertKeys))return n;const t=Math.max(0,Math.min(l.insertKeys.index,n.length));return[...n.slice(0,t),...l.insertKeys.keys,...n.slice(t)]},E=(e,l,a,n)=>{if(e==="|")return[{type:"separator",key:`separator-${n}`}];if(typeof e=="string"){const t=l.get(e);return!t||t.requiresPayload&&!t.payloadPanel||a.has(t.id)?[]:[{type:"button",item:t}]}if(I(e)){const t=e.menuKeys.filter(o=>!a.has(o)).map(o=>l.get(o)).filter(o=>o!==void 0&&(!o.requiresPayload||o.payloadPanel!==void 0));return t.length>0?[{type:"group",key:e.key,title:e.title,icon:e.icon,items:t}]:[]}return[]},V=(e,l)=>{if(e.type!=="separator")return!0;const a=l[l.length-1];return a!==void 0&&a.type!=="separator"},j=e=>{var l;for(;((l=e.at(-1))==null?void 0:l.type)==="separator";)e.pop();return e},B=(e=d,l=c)=>{const a=C(l),n=e.toolbarKeys??d.toolbarKeys??[],t=R(n,e),o=new Set(e.excludeKeys??[]);let s=0;const h=t.reduce((i,p)=>{const f=E(p,a,o,s);return p==="|"&&(s+=1),f.forEach(m=>{V(m,i)&&i.push(m)}),i},[]);return j(h)};exports.codeBlockLanguagePanel=g;exports.codeBlockLanguagePayloadPanel=k;exports.createDisabledCommandStates=q;exports.defaultMenuSchema=c;exports.defaultToolbarConfig=d;exports.getCommandStateMatchValue=u;exports.isCommandStateForCommand=v;exports.isMenuItemCommandState=K;exports.resolveToolbarMenu=B;exports.tableHeaderMenuItems=y;
2
2
  //# sourceMappingURL=native-spec.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"native-spec.cjs","sources":["../../native-spec/src/menuSchema/payloadPanels.ts","../../native-spec/src/menuSchema/tableHeaderMenuItems.ts","../../native-spec/src/menuSchema/defaultMenuSchema.ts","../../native-spec/src/commandState/index.ts","../../native-spec/src/toolbarConfig/index.ts"],"sourcesContent":["import {\n BRIDGERTE_TABLE_INSERT_MAX_COLS,\n BRIDGERTE_TABLE_INSERT_MAX_ROWS,\n type PayloadPanelSchema\n} from '@bridgerte/core';\n\n/**\n * 代码块语言列表给 DOM 代码块顶部控制栏和原生侧自绘使用。\n *\n * 空字符串表示纯文本;默认候选覆盖 Lexical Prism tokenizer 当前内置语言,并保留\n * JSON 这个高频实用项。业务如需裁剪语言、调整顺序或接入更多 Prism 语言,传入\n * 自己的 `codeBlockLanguagePanel` 即可,不需要改 DOM 内置语言菜单。\n */\nexport const codeBlockLanguagePanel: PayloadPanelSchema = {\n id: 'code-block-language',\n title: '代码语言',\n fields: [\n {\n type: 'select',\n name: 'language',\n label: '语言',\n defaultValue: '',\n options: [\n { label: '纯文本', value: '' },\n { label: 'C', value: 'c' },\n { label: 'C-like', value: 'clike' },\n { label: 'C++', value: 'cpp' },\n { label: 'CSS', value: 'css' },\n { label: 'HTML', value: 'html' },\n { label: 'Java', value: 'java' },\n { label: 'JavaScript', value: 'javascript' },\n { label: 'JSON', value: 'json' },\n { label: 'Markdown', value: 'markdown' },\n { label: 'Objective-C', value: 'objc' },\n { label: 'PowerShell', value: 'powershell' },\n { label: 'Python', value: 'python' },\n { label: 'Rust', value: 'rust' },\n { label: 'SQL', value: 'sql' },\n { label: 'Swift', value: 'swift' },\n { label: 'TypeScript', value: 'typescript' },\n { label: 'XML', value: 'xml' }\n ]\n }\n ]\n};\n\n/**\n * 兼容旧导出名。\n *\n * 代码块语言现在由代码块 header 触发,不再代表 toolbar 菜单 payload。\n */\nexport const codeBlockLanguagePayloadPanel = codeBlockLanguagePanel;\n\n/**\n * 颜色菜单使用 color 字段而不是预设色列表。\n *\n * DOM 默认面板可以渲染内置颜色控件,RN/Flutter/WebView 或业务自绘层仍读取同一份 schema。\n */\nexport const textColorPanel: PayloadPanelSchema = {\n id: 'text-color',\n title: '文字颜色',\n fields: [\n {\n type: 'color',\n name: 'value',\n label: '颜色'\n }\n ]\n};\n\nexport const backgroundColorPanel: PayloadPanelSchema = {\n id: 'background-color',\n title: '背景色',\n fields: [\n {\n type: 'color',\n name: 'value',\n label: '背景'\n }\n ]\n};\n\nexport const fontSizePanel: PayloadPanelSchema = {\n id: 'font-size',\n title: '字号',\n fields: [\n {\n type: 'select',\n name: 'value',\n label: '字号',\n defaultValue: '16px',\n options: [\n { label: '小号 14px', value: '14px' },\n { label: '正文 16px', value: '16px' },\n { label: '强调 18px', value: '18px' },\n { label: '标题 20px', value: '20px' },\n { label: '大标题 24px', value: '24px' }\n ]\n }\n ]\n};\n\nexport const fontFamilyPanel: PayloadPanelSchema = {\n id: 'font-family',\n title: '字体',\n fields: [\n {\n type: 'select',\n name: 'value',\n label: '字体',\n defaultValue: '',\n options: [\n { label: '跟随页面', value: '' },\n { label: '无衬线', value: 'sans-serif' },\n { label: '衬线', value: 'serif' },\n { label: '等宽', value: 'monospace' }\n ]\n }\n ]\n};\n\nexport const lineHeightPanel: PayloadPanelSchema = {\n id: 'line-height',\n title: '行高',\n fields: [\n {\n type: 'select',\n name: 'value',\n label: '行高',\n defaultValue: '1.7',\n options: [\n { label: '紧凑 1.4', value: '1.4' },\n { label: '常规 1.7', value: '1.7' },\n { label: '舒展 2', value: '2' }\n ]\n }\n ]\n};\n\n/**\n * 表格插入使用 number 字段收集行列。\n *\n * DOM 默认面板、H5 自绘和 RN/Flutter 原生表单都读取同一份 schema;真正的表格进阶操作\n * 仍放后续表格菜单阶段继续扩展。\n */\nexport const tableInsertPanel: PayloadPanelSchema = {\n id: 'table-insert',\n title: '插入表格',\n fields: [\n {\n type: 'number',\n name: 'rows',\n label: '行数',\n defaultValue: '3',\n min: 1,\n max: BRIDGERTE_TABLE_INSERT_MAX_ROWS,\n step: 1\n },\n {\n type: 'number',\n name: 'cols',\n label: '列数',\n defaultValue: '3',\n min: 1,\n max: BRIDGERTE_TABLE_INSERT_MAX_COLS,\n step: 1\n }\n ]\n};\n","import type { MenuItem } from './type';\n\n/*\n * 表格 header 和后续表格浮动菜单共用这组操作入口。\n * 这些菜单默认不进入 toolbar 排列,但仍放在 native-spec,保证 DOM/RN/Flutter 自绘读取同一份\n * command/label/icon 协议。\n */\nexport const tableHeaderMenuItems: MenuItem[] = [\n {\n id: 'table-insert-row-after',\n command: { type: 'table.insertRow', direction: 'after' },\n label: '插入行',\n icon: 'rows-plus',\n group: 'table'\n },\n {\n id: 'table-delete-row',\n command: { type: 'table.deleteRow' },\n label: '删除行',\n icon: 'rows-minus',\n group: 'table'\n },\n {\n id: 'table-insert-column-after',\n command: { type: 'table.insertColumn', direction: 'after' },\n label: '插入列',\n icon: 'columns-plus',\n group: 'table'\n },\n {\n id: 'table-delete-column',\n command: { type: 'table.deleteColumn' },\n label: '删除列',\n icon: 'columns-minus',\n group: 'table'\n },\n {\n id: 'table-delete',\n command: { type: 'table.delete' },\n label: '删除表格',\n icon: 'table-delete',\n group: 'table'\n }\n];\n","import type { MenuItem } from './type';\nimport {\n backgroundColorPanel,\n fontFamilyPanel,\n fontSizePanel,\n lineHeightPanel,\n tableInsertPanel,\n textColorPanel\n} from './payloadPanels';\nimport { tableHeaderMenuItems } from './tableHeaderMenuItems';\n\n/**\n * 默认菜单 schema 覆盖 wangEditor 常用入口。\n *\n * RN/Flutter 可以按 group 渲染分组,也可以基于 id 做业务侧排序或裁剪。\n */\nexport const defaultMenuSchema: MenuItem[] = [\n {\n id: 'bold',\n command: { type: 'format.bold' },\n label: '加粗',\n icon: 'bold',\n group: 'text'\n },\n {\n id: 'italic',\n command: { type: 'format.italic' },\n label: '斜体',\n icon: 'italic',\n group: 'text'\n },\n {\n id: 'underline',\n command: { type: 'format.underline' },\n label: '下划线',\n icon: 'underline',\n group: 'text'\n },\n {\n id: 'strike',\n command: { type: 'format.strike' },\n label: '删除线',\n icon: 'strikethrough',\n group: 'text'\n },\n {\n id: 'inline-code',\n command: { type: 'format.inlineCode' },\n label: '行内代码',\n icon: 'code',\n group: 'text'\n },\n {\n id: 'superscript',\n command: { type: 'format.superscript' },\n label: '上标',\n icon: 'superscript',\n group: 'text'\n },\n {\n id: 'subscript',\n command: { type: 'format.subscript' },\n label: '下标',\n icon: 'subscript',\n group: 'text'\n },\n {\n id: 'clear-style',\n command: { type: 'format.clear' },\n label: '清除样式',\n icon: 'remove-formatting',\n group: 'text'\n },\n {\n id: 'color',\n command: { type: 'format.color', value: '' },\n label: '文字颜色',\n icon: 'palette',\n group: 'style',\n requiresPayload: true,\n payloadPanel: textColorPanel\n },\n {\n id: 'background-color',\n command: { type: 'format.backgroundColor', value: '' },\n label: '背景色',\n icon: 'paint-bucket',\n group: 'style',\n requiresPayload: true,\n payloadPanel: backgroundColorPanel\n },\n {\n id: 'font-size',\n command: { type: 'format.fontSize', value: '' },\n label: '字号',\n icon: 'case-sensitive',\n group: 'style',\n requiresPayload: true,\n payloadPanel: fontSizePanel\n },\n {\n id: 'font-family',\n command: { type: 'format.fontFamily', value: '' },\n label: '字体',\n icon: 'type',\n group: 'style',\n requiresPayload: true,\n payloadPanel: fontFamilyPanel\n },\n {\n id: 'line-height',\n command: { type: 'format.lineHeight', value: '' },\n label: '行高',\n icon: 'wrap-text',\n group: 'style',\n requiresPayload: true,\n payloadPanel: lineHeightPanel\n },\n {\n id: 'paragraph',\n command: { type: 'block.paragraph' },\n label: '正文',\n icon: 'pilcrow',\n group: 'block'\n },\n {\n id: 'heading-1',\n command: { type: 'block.heading', level: 1 },\n label: '一级标题',\n icon: 'heading-1',\n group: 'block'\n },\n {\n id: 'heading-2',\n command: { type: 'block.heading', level: 2 },\n label: '二级标题',\n icon: 'heading-2',\n group: 'block'\n },\n {\n id: 'heading-3',\n command: { type: 'block.heading', level: 3 },\n label: '三级标题',\n icon: 'heading-3',\n group: 'block'\n },\n {\n id: 'heading-4',\n command: { type: 'block.heading', level: 4 },\n label: '四级标题',\n icon: 'heading-4',\n group: 'block'\n },\n {\n id: 'heading-5',\n command: { type: 'block.heading', level: 5 },\n label: '五级标题',\n icon: 'heading-5',\n group: 'block'\n },\n {\n id: 'heading-6',\n command: { type: 'block.heading', level: 6 },\n label: '六级标题',\n icon: 'heading-6',\n group: 'block'\n },\n {\n id: 'quote',\n command: { type: 'block.quote' },\n label: '引用',\n icon: 'quote',\n group: 'block'\n },\n {\n id: 'divider',\n command: { type: 'block.divider' },\n label: '分割线',\n icon: 'minus',\n group: 'block'\n },\n {\n id: 'code-block',\n command: { type: 'block.code' },\n label: '代码块',\n icon: 'square-code',\n group: 'block'\n },\n {\n id: 'ordered-list',\n command: { type: 'list.ordered' },\n label: '有序列表',\n icon: 'list-ordered',\n group: 'list'\n },\n {\n id: 'unordered-list',\n command: { type: 'list.unordered' },\n label: '无序列表',\n icon: 'list',\n group: 'list'\n },\n {\n id: 'todo-list',\n command: { type: 'list.todo' },\n label: '待办列表',\n icon: 'list-todo',\n group: 'list'\n },\n {\n id: 'align-left',\n command: { type: 'align', value: 'left' },\n label: '左对齐',\n icon: 'align-left',\n group: 'align'\n },\n {\n id: 'align-center',\n command: { type: 'align', value: 'center' },\n label: '居中',\n icon: 'align-center',\n group: 'align'\n },\n {\n id: 'align-right',\n command: { type: 'align', value: 'right' },\n label: '右对齐',\n icon: 'align-right',\n group: 'align'\n },\n {\n id: 'align-justify',\n command: { type: 'align', value: 'justify' },\n label: '两端对齐',\n icon: 'align-justify',\n group: 'align'\n },\n {\n id: 'indent-increase',\n command: { type: 'indent.increase' },\n label: '增加缩进',\n icon: 'indent-increase',\n group: 'align'\n },\n {\n id: 'indent-decrease',\n command: { type: 'indent.decrease' },\n label: '减少缩进',\n icon: 'indent-decrease',\n group: 'align'\n },\n {\n id: 'mention',\n command: { type: 'mention.insert', item: { id: '', label: '', value: '' } },\n label: '@ 提及',\n icon: 'at-sign',\n group: 'insert',\n requiresPayload: true\n },\n {\n id: 'upload-image',\n command: { type: 'media.pickImage' },\n label: '上传图片',\n icon: 'upload-image',\n group: 'media'\n },\n {\n id: 'upload-video',\n command: { type: 'media.pickVideo' },\n label: '上传视频',\n icon: 'upload-video',\n group: 'media'\n },\n {\n id: 'table',\n command: { type: 'table.insert', rows: 3, cols: 3 },\n label: '表格',\n icon: 'table',\n group: 'table',\n requiresPayload: true,\n payloadPanel: tableInsertPanel\n },\n ...tableHeaderMenuItems,\n {\n id: 'slash-command',\n command: { type: 'slash.open' },\n label: '/ 命令',\n icon: 'list-plus',\n group: 'insert'\n },\n {\n id: 'undo',\n command: { type: 'history.undo' },\n label: '撤销',\n icon: 'undo',\n group: 'history'\n },\n {\n id: 'redo',\n command: { type: 'history.redo' },\n label: '重做',\n icon: 'redo',\n group: 'history'\n },\n {\n id: 'clear',\n command: { type: 'content.clear' },\n label: '清空',\n icon: 'trash-2',\n group: 'history'\n },\n {\n id: 'fullscreen',\n command: { type: 'fullscreen.toggle' },\n label: '全屏',\n icon: 'maximize',\n group: 'view'\n }\n];\n","import type { CommandState, EditorCommand } from '@bridgerte/core';\nimport type { MenuItem } from '../menuSchema';\nimport { defaultMenuSchema } from '../menuSchema';\n\nconst commandStateValueByType: Partial<Record<EditorCommand['type'], (command: EditorCommand) => (\n CommandState['value'] | undefined\n)>> = {\n align: (command) => command.type === 'align' ? command.value : undefined,\n 'block.heading': (command) => command.type === 'block.heading' ? command.level : undefined,\n 'block.setCodeLanguage': (command) => (\n command.type === 'block.setCodeLanguage' ? command.language : undefined\n )\n};\n\n/**\n * 取出菜单命令用于匹配 `CommandState.value` 的稳定值。\n *\n * 同类命令存在多个菜单项时使用这个值区分,比如对齐方式和标题级别。\n */\nexport const getCommandStateMatchValue = (\n command: EditorCommand\n): CommandState['value'] | undefined => commandStateValueByType[command.type]?.(command);\n\n/**\n * 判断某条命令状态是否对应一个完整命令 payload。\n */\nexport const isCommandStateForCommand = (\n command: EditorCommand,\n state: CommandState\n): boolean => {\n const matchValue = getCommandStateMatchValue(command);\n\n return state.command === command.type\n && (matchValue === undefined || state.value === matchValue);\n};\n\n/**\n * 判断某条命令状态是否对应一个菜单项。\n *\n * 原生 toolbar 可以用它把 `CommandState[]` 映射回具体按钮 active/disabled 状态。\n */\nexport const isMenuItemCommandState = (item: MenuItem, state: CommandState): boolean => (\n isCommandStateForCommand(item.command, state)\n);\n\n/**\n * 为给定菜单生成默认禁用状态。\n *\n * 编辑器未 ready 或无选区时,原生 toolbar 可以先使用这组状态兜底。\n */\nexport function createDisabledCommandStates(menuSchema = defaultMenuSchema): CommandState[] {\n return menuSchema.map((item) => ({\n command: item.command.type,\n active: false,\n disabled: true,\n value: getCommandStateMatchValue(item.command)\n }));\n}\n","import type { ToolbarConfig, ToolbarGroupConfig, ToolbarKey } from '@bridgerte/core';\nimport type { MenuItem } from '../menuSchema';\nimport { defaultMenuSchema } from '../menuSchema';\nimport type { ResolvedToolbarItem } from './type';\n\nexport type * from './type';\n\n/**\n * 默认 DOM toolbar 配置。\n *\n * 这里只选择已实现或带参数面板的基础按钮;完整菜单全集仍由 `defaultMenuSchema` 维护。\n */\nexport const defaultToolbarConfig: ToolbarConfig = {\n toolbarKeys: [\n 'undo',\n 'redo',\n 'clear',\n '|',\n 'paragraph',\n 'heading-1',\n 'heading-2',\n 'heading-3',\n 'heading-4',\n 'heading-5',\n 'heading-6',\n 'quote',\n 'divider',\n 'code-block',\n '|',\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'inline-code',\n 'superscript',\n 'subscript',\n 'clear-style',\n 'color',\n 'background-color',\n 'font-size',\n 'font-family',\n 'line-height',\n '|',\n 'ordered-list',\n 'unordered-list',\n 'todo-list',\n '|',\n 'upload-image',\n 'upload-video',\n '|',\n 'table',\n '|',\n 'align-left',\n 'align-center',\n 'align-right',\n 'align-justify',\n 'indent-increase',\n 'indent-decrease',\n '|',\n 'fullscreen'\n ]\n};\n\nconst isToolbarGroupConfig = (key: ToolbarKey): key is ToolbarGroupConfig => (\n typeof key === 'object' && Array.isArray(key.menuKeys)\n);\n\nconst createMenuMap = (menuSchema: MenuItem[]) => new Map(\n menuSchema.map((item) => [item.id, item])\n);\n\nconst shouldExcludeToolbarKey = (\n key: ToolbarKey,\n excludeKeys: Set<string>\n) => {\n if (typeof key === 'string') return key !== '|' && excludeKeys.has(key);\n\n return excludeKeys.has(key.key) || key.menuKeys.every((menuKey) => excludeKeys.has(menuKey));\n};\n\nconst applyToolbarConfigOverrides = (\n baseKeys: ToolbarKey[],\n toolbarConfig?: ToolbarConfig\n): ToolbarKey[] => {\n const excludeKeys = new Set(toolbarConfig?.excludeKeys ?? []);\n /*\n * 先排除再插入,等价于“在用户最终想保留的默认菜单里加东西”。\n * insert index 做夹取,避免业务传入负数或超长下标时破坏默认 toolbar。\n */\n const filteredKeys = baseKeys.filter((key) => !shouldExcludeToolbarKey(key, excludeKeys));\n\n if (!toolbarConfig?.insertKeys) return filteredKeys;\n\n const insertIndex = Math.max(0, Math.min(toolbarConfig.insertKeys.index, filteredKeys.length));\n\n return [\n ...filteredKeys.slice(0, insertIndex),\n ...toolbarConfig.insertKeys.keys,\n ...filteredKeys.slice(insertIndex)\n ];\n};\n\nconst resolveToolbarKey = (\n key: ToolbarKey,\n menuMap: Map<string, MenuItem>,\n excludeKeys: Set<string>,\n separatorIndex: number\n): ResolvedToolbarItem[] => {\n if (key === '|') {\n return [{ type: 'separator', key: `separator-${separatorIndex}` }];\n }\n\n if (typeof key === 'string') {\n const item = menuMap.get(key);\n\n // 未知 key 直接忽略;需要 payload 但没有 panel 的菜单暂不渲染,避免按钮点击后无法生成合法命令。\n if (!item || (item.requiresPayload && !item.payloadPanel) || excludeKeys.has(item.id)) {\n return [];\n }\n\n return [{ type: 'button', item }];\n }\n\n if (isToolbarGroupConfig(key)) {\n const items = key.menuKeys\n .filter((menuKey) => !excludeKeys.has(menuKey))\n .map((menuKey) => menuMap.get(menuKey))\n .filter((item): item is MenuItem => (\n item !== undefined && (!item.requiresPayload || item.payloadPanel !== undefined)\n ));\n\n return items.length > 0 ? [{\n type: 'group',\n key: key.key,\n title: key.title,\n icon: key.icon,\n items\n }] : [];\n }\n\n return [];\n};\n\nconst shouldKeepResolvedToolbarItem = (\n item: ResolvedToolbarItem,\n items: ResolvedToolbarItem[]\n) => {\n if (item.type !== 'separator') return true;\n\n const previousItem = items[items.length - 1];\n\n return previousItem !== undefined && previousItem.type !== 'separator';\n};\n\nconst trimTrailingToolbarSeparators = (items: ResolvedToolbarItem[]) => {\n while (items.at(-1)?.type === 'separator') {\n items.pop();\n }\n\n return items;\n};\n\n/**\n * 把 wangEditor 风格的 JSON 配置解析成 DOM/RN/Flutter 都能消费的菜单结构。\n *\n * 未知 key 和缺少 payloadPanel 的 requiresPayload 菜单会被忽略,避免默认 toolbar 渲染无法处理的按钮。\n * 分割线会自动去掉开头、结尾和连续项,避免被跳过的菜单留下空分隔。\n */\nexport const resolveToolbarMenu = (\n toolbarConfig: ToolbarConfig = defaultToolbarConfig,\n menuSchema: MenuItem[] = defaultMenuSchema\n): ResolvedToolbarItem[] => {\n const menuMap = createMenuMap(menuSchema);\n const baseKeys = toolbarConfig.toolbarKeys ?? defaultToolbarConfig.toolbarKeys ?? [];\n const toolbarKeys = applyToolbarConfigOverrides(baseKeys, toolbarConfig);\n const excludeKeys = new Set(toolbarConfig.excludeKeys ?? []);\n let separatorIndex = 0;\n\n const resolvedItems = toolbarKeys.reduce<ResolvedToolbarItem[]>((items, key) => {\n const nextItems = resolveToolbarKey(key, menuMap, excludeKeys, separatorIndex);\n\n if (key === '|') separatorIndex += 1;\n\n nextItems.forEach((item) => {\n if (shouldKeepResolvedToolbarItem(item, items)) {\n items.push(item);\n }\n });\n\n return items;\n }, []);\n\n return trimTrailingToolbarSeparators(resolvedItems);\n};\n"],"names":["codeBlockLanguagePanel","codeBlockLanguagePayloadPanel","textColorPanel","backgroundColorPanel","fontSizePanel","fontFamilyPanel","lineHeightPanel","tableInsertPanel","BRIDGERTE_TABLE_INSERT_MAX_ROWS","BRIDGERTE_TABLE_INSERT_MAX_COLS","tableHeaderMenuItems","defaultMenuSchema","commandStateValueByType","command","getCommandStateMatchValue","_a","isCommandStateForCommand","state","matchValue","isMenuItemCommandState","item","createDisabledCommandStates","menuSchema","defaultToolbarConfig","isToolbarGroupConfig","key","createMenuMap","shouldExcludeToolbarKey","excludeKeys","menuKey","applyToolbarConfigOverrides","baseKeys","toolbarConfig","filteredKeys","insertIndex","resolveToolbarKey","menuMap","separatorIndex","items","shouldKeepResolvedToolbarItem","previousItem","trimTrailingToolbarSeparators","resolveToolbarMenu","toolbarKeys","resolvedItems","nextItems"],"mappings":"wHAaaA,EAA6C,CACxD,GAAI,sBACJ,MAAO,OACP,OAAQ,CACN,CACE,KAAM,SACN,KAAM,WACN,MAAO,KACP,aAAc,GACd,QAAS,CACP,CAAE,MAAO,MAAO,MAAO,EAAA,EACvB,CAAE,MAAO,IAAK,MAAO,GAAA,EACrB,CAAE,MAAO,SAAU,MAAO,OAAA,EAC1B,CAAE,MAAO,MAAO,MAAO,KAAA,EACvB,CAAE,MAAO,MAAO,MAAO,KAAA,EACvB,CAAE,MAAO,OAAQ,MAAO,MAAA,EACxB,CAAE,MAAO,OAAQ,MAAO,MAAA,EACxB,CAAE,MAAO,aAAc,MAAO,YAAA,EAC9B,CAAE,MAAO,OAAQ,MAAO,MAAA,EACxB,CAAE,MAAO,WAAY,MAAO,UAAA,EAC5B,CAAE,MAAO,cAAe,MAAO,MAAA,EAC/B,CAAE,MAAO,aAAc,MAAO,YAAA,EAC9B,CAAE,MAAO,SAAU,MAAO,QAAA,EAC1B,CAAE,MAAO,OAAQ,MAAO,MAAA,EACxB,CAAE,MAAO,MAAO,MAAO,KAAA,EACvB,CAAE,MAAO,QAAS,MAAO,OAAA,EACzB,CAAE,MAAO,aAAc,MAAO,YAAA,EAC9B,CAAE,MAAO,MAAO,MAAO,KAAA,CAAM,CAC/B,CACF,CAEJ,EAOaC,EAAgCD,EAOhCE,EAAqC,CAChD,GAAI,aACJ,MAAO,OACP,OAAQ,CACN,CACE,KAAM,QACN,KAAM,QACN,MAAO,IAAA,CACT,CAEJ,EAEaC,EAA2C,CACtD,GAAI,mBACJ,MAAO,MACP,OAAQ,CACN,CACE,KAAM,QACN,KAAM,QACN,MAAO,IAAA,CACT,CAEJ,EAEaC,EAAoC,CAC/C,GAAI,YACJ,MAAO,KACP,OAAQ,CACN,CACE,KAAM,SACN,KAAM,QACN,MAAO,KACP,aAAc,OACd,QAAS,CACP,CAAE,MAAO,UAAW,MAAO,MAAA,EAC3B,CAAE,MAAO,UAAW,MAAO,MAAA,EAC3B,CAAE,MAAO,UAAW,MAAO,MAAA,EAC3B,CAAE,MAAO,UAAW,MAAO,MAAA,EAC3B,CAAE,MAAO,WAAY,MAAO,MAAA,CAAO,CACrC,CACF,CAEJ,EAEaC,EAAsC,CACjD,GAAI,cACJ,MAAO,KACP,OAAQ,CACN,CACE,KAAM,SACN,KAAM,QACN,MAAO,KACP,aAAc,GACd,QAAS,CACP,CAAE,MAAO,OAAQ,MAAO,EAAA,EACxB,CAAE,MAAO,MAAO,MAAO,YAAA,EACvB,CAAE,MAAO,KAAM,MAAO,OAAA,EACtB,CAAE,MAAO,KAAM,MAAO,WAAA,CAAY,CACpC,CACF,CAEJ,EAEaC,EAAsC,CACjD,GAAI,cACJ,MAAO,KACP,OAAQ,CACN,CACE,KAAM,SACN,KAAM,QACN,MAAO,KACP,aAAc,MACd,QAAS,CACP,CAAE,MAAO,SAAU,MAAO,KAAA,EAC1B,CAAE,MAAO,SAAU,MAAO,KAAA,EAC1B,CAAE,MAAO,OAAQ,MAAO,GAAA,CAAI,CAC9B,CACF,CAEJ,EAQaC,EAAuC,CAClD,GAAI,eACJ,MAAO,OACP,OAAQ,CACN,CACE,KAAM,SACN,KAAM,OACN,MAAO,KACP,aAAc,IACd,IAAK,EACL,IAAKC,EAAAA,gCACL,KAAM,CAAA,EAER,CACE,KAAM,SACN,KAAM,OACN,MAAO,KACP,aAAc,IACd,IAAK,EACL,IAAKC,EAAAA,gCACL,KAAM,CAAA,CACR,CAEJ,ECjKaC,EAAmC,CAC9C,CACE,GAAI,yBACJ,QAAS,CAAE,KAAM,kBAAmB,UAAW,OAAA,EAC/C,MAAO,MACP,KAAM,YACN,MAAO,OAAA,EAET,CACE,GAAI,mBACJ,QAAS,CAAE,KAAM,iBAAA,EACjB,MAAO,MACP,KAAM,aACN,MAAO,OAAA,EAET,CACE,GAAI,4BACJ,QAAS,CAAE,KAAM,qBAAsB,UAAW,OAAA,EAClD,MAAO,MACP,KAAM,eACN,MAAO,OAAA,EAET,CACE,GAAI,sBACJ,QAAS,CAAE,KAAM,oBAAA,EACjB,MAAO,MACP,KAAM,gBACN,MAAO,OAAA,EAET,CACE,GAAI,eACJ,QAAS,CAAE,KAAM,cAAA,EACjB,MAAO,OACP,KAAM,eACN,MAAO,OAAA,CAEX,EC3BaC,EAAgC,CAC3C,CACE,GAAI,OACJ,QAAS,CAAE,KAAM,aAAA,EACjB,MAAO,KACP,KAAM,OACN,MAAO,MAAA,EAET,CACE,GAAI,SACJ,QAAS,CAAE,KAAM,eAAA,EACjB,MAAO,KACP,KAAM,SACN,MAAO,MAAA,EAET,CACE,GAAI,YACJ,QAAS,CAAE,KAAM,kBAAA,EACjB,MAAO,MACP,KAAM,YACN,MAAO,MAAA,EAET,CACE,GAAI,SACJ,QAAS,CAAE,KAAM,eAAA,EACjB,MAAO,MACP,KAAM,gBACN,MAAO,MAAA,EAET,CACE,GAAI,cACJ,QAAS,CAAE,KAAM,mBAAA,EACjB,MAAO,OACP,KAAM,OACN,MAAO,MAAA,EAET,CACE,GAAI,cACJ,QAAS,CAAE,KAAM,oBAAA,EACjB,MAAO,KACP,KAAM,cACN,MAAO,MAAA,EAET,CACE,GAAI,YACJ,QAAS,CAAE,KAAM,kBAAA,EACjB,MAAO,KACP,KAAM,YACN,MAAO,MAAA,EAET,CACE,GAAI,cACJ,QAAS,CAAE,KAAM,cAAA,EACjB,MAAO,OACP,KAAM,oBACN,MAAO,MAAA,EAET,CACE,GAAI,QACJ,QAAS,CAAE,KAAM,eAAgB,MAAO,EAAA,EACxC,MAAO,OACP,KAAM,UACN,MAAO,QACP,gBAAiB,GACjB,aAAcT,CAAA,EAEhB,CACE,GAAI,mBACJ,QAAS,CAAE,KAAM,yBAA0B,MAAO,EAAA,EAClD,MAAO,MACP,KAAM,eACN,MAAO,QACP,gBAAiB,GACjB,aAAcC,CAAA,EAEhB,CACE,GAAI,YACJ,QAAS,CAAE,KAAM,kBAAmB,MAAO,EAAA,EAC3C,MAAO,KACP,KAAM,iBACN,MAAO,QACP,gBAAiB,GACjB,aAAcC,CAAA,EAEhB,CACE,GAAI,cACJ,QAAS,CAAE,KAAM,oBAAqB,MAAO,EAAA,EAC7C,MAAO,KACP,KAAM,OACN,MAAO,QACP,gBAAiB,GACjB,aAAcC,CAAA,EAEhB,CACE,GAAI,cACJ,QAAS,CAAE,KAAM,oBAAqB,MAAO,EAAA,EAC7C,MAAO,KACP,KAAM,YACN,MAAO,QACP,gBAAiB,GACjB,aAAcC,CAAA,EAEhB,CACE,GAAI,YACJ,QAAS,CAAE,KAAM,iBAAA,EACjB,MAAO,KACP,KAAM,UACN,MAAO,OAAA,EAET,CACE,GAAI,YACJ,QAAS,CAAE,KAAM,gBAAiB,MAAO,CAAA,EACzC,MAAO,OACP,KAAM,YACN,MAAO,OAAA,EAET,CACE,GAAI,YACJ,QAAS,CAAE,KAAM,gBAAiB,MAAO,CAAA,EACzC,MAAO,OACP,KAAM,YACN,MAAO,OAAA,EAET,CACE,GAAI,YACJ,QAAS,CAAE,KAAM,gBAAiB,MAAO,CAAA,EACzC,MAAO,OACP,KAAM,YACN,MAAO,OAAA,EAET,CACE,GAAI,YACJ,QAAS,CAAE,KAAM,gBAAiB,MAAO,CAAA,EACzC,MAAO,OACP,KAAM,YACN,MAAO,OAAA,EAET,CACE,GAAI,YACJ,QAAS,CAAE,KAAM,gBAAiB,MAAO,CAAA,EACzC,MAAO,OACP,KAAM,YACN,MAAO,OAAA,EAET,CACE,GAAI,YACJ,QAAS,CAAE,KAAM,gBAAiB,MAAO,CAAA,EACzC,MAAO,OACP,KAAM,YACN,MAAO,OAAA,EAET,CACE,GAAI,QACJ,QAAS,CAAE,KAAM,aAAA,EACjB,MAAO,KACP,KAAM,QACN,MAAO,OAAA,EAET,CACE,GAAI,UACJ,QAAS,CAAE,KAAM,eAAA,EACjB,MAAO,MACP,KAAM,QACN,MAAO,OAAA,EAET,CACE,GAAI,aACJ,QAAS,CAAE,KAAM,YAAA,EACjB,MAAO,MACP,KAAM,cACN,MAAO,OAAA,EAET,CACE,GAAI,eACJ,QAAS,CAAE,KAAM,cAAA,EACjB,MAAO,OACP,KAAM,eACN,MAAO,MAAA,EAET,CACE,GAAI,iBACJ,QAAS,CAAE,KAAM,gBAAA,EACjB,MAAO,OACP,KAAM,OACN,MAAO,MAAA,EAET,CACE,GAAI,YACJ,QAAS,CAAE,KAAM,WAAA,EACjB,MAAO,OACP,KAAM,YACN,MAAO,MAAA,EAET,CACE,GAAI,aACJ,QAAS,CAAE,KAAM,QAAS,MAAO,MAAA,EACjC,MAAO,MACP,KAAM,aACN,MAAO,OAAA,EAET,CACE,GAAI,eACJ,QAAS,CAAE,KAAM,QAAS,MAAO,QAAA,EACjC,MAAO,KACP,KAAM,eACN,MAAO,OAAA,EAET,CACE,GAAI,cACJ,QAAS,CAAE,KAAM,QAAS,MAAO,OAAA,EACjC,MAAO,MACP,KAAM,cACN,MAAO,OAAA,EAET,CACE,GAAI,gBACJ,QAAS,CAAE,KAAM,QAAS,MAAO,SAAA,EACjC,MAAO,OACP,KAAM,gBACN,MAAO,OAAA,EAET,CACE,GAAI,kBACJ,QAAS,CAAE,KAAM,iBAAA,EACjB,MAAO,OACP,KAAM,kBACN,MAAO,OAAA,EAET,CACE,GAAI,kBACJ,QAAS,CAAE,KAAM,iBAAA,EACjB,MAAO,OACP,KAAM,kBACN,MAAO,OAAA,EAET,CACE,GAAI,UACJ,QAAS,CAAE,KAAM,iBAAkB,KAAM,CAAE,GAAI,GAAI,MAAO,GAAI,MAAO,EAAA,CAAG,EACxE,MAAO,OACP,KAAM,UACN,MAAO,SACP,gBAAiB,EAAA,EAEnB,CACE,GAAI,eACJ,QAAS,CAAE,KAAM,iBAAA,EACjB,MAAO,OACP,KAAM,eACN,MAAO,OAAA,EAET,CACE,GAAI,eACJ,QAAS,CAAE,KAAM,iBAAA,EACjB,MAAO,OACP,KAAM,eACN,MAAO,OAAA,EAET,CACE,GAAI,QACJ,QAAS,CAAE,KAAM,eAAgB,KAAM,EAAG,KAAM,CAAA,EAChD,MAAO,KACP,KAAM,QACN,MAAO,QACP,gBAAiB,GACjB,aAAcC,CAAA,EAEhB,GAAGG,EACH,CACE,GAAI,gBACJ,QAAS,CAAE,KAAM,YAAA,EACjB,MAAO,OACP,KAAM,YACN,MAAO,QAAA,EAET,CACE,GAAI,OACJ,QAAS,CAAE,KAAM,cAAA,EACjB,MAAO,KACP,KAAM,OACN,MAAO,SAAA,EAET,CACE,GAAI,OACJ,QAAS,CAAE,KAAM,cAAA,EACjB,MAAO,KACP,KAAM,OACN,MAAO,SAAA,EAET,CACE,GAAI,QACJ,QAAS,CAAE,KAAM,eAAA,EACjB,MAAO,KACP,KAAM,UACN,MAAO,SAAA,EAET,CACE,GAAI,aACJ,QAAS,CAAE,KAAM,mBAAA,EACjB,MAAO,KACP,KAAM,WACN,MAAO,MAAA,CAEX,EC1TME,EAEA,CACJ,MAAQC,GAAYA,EAAQ,OAAS,QAAUA,EAAQ,MAAQ,OAC/D,gBAAkBA,GAAYA,EAAQ,OAAS,gBAAkBA,EAAQ,MAAQ,OACjF,wBAA0BA,GACxBA,EAAQ,OAAS,wBAA0BA,EAAQ,SAAW,MAElE,EAOaC,EACXD,GAAA,OACsC,OAAAE,EAAAH,EAAwBC,EAAQ,QAAhC,YAAAE,EAAA,KAAAH,EAAwCC,IAKnEG,EAA2B,CACtCH,EACAI,IACY,CACZ,MAAMC,EAAaJ,EAA0BD,CAAO,EAEpD,OAAOI,EAAM,UAAYJ,EAAQ,OAC3BK,IAAe,QAAaD,EAAM,QAAUC,EACpD,EAOaC,EAAyB,CAACC,EAAgBH,IACrDD,EAAyBI,EAAK,QAASH,CAAK,EAQvC,SAASI,EAA4BC,EAAaX,EAAmC,CAC1F,OAAOW,EAAW,IAAKF,IAAU,CAC/B,QAASA,EAAK,QAAQ,KACtB,OAAQ,GACR,SAAU,GACV,MAAON,EAA0BM,EAAK,OAAO,CAAA,EAC7C,CACJ,CC7CO,MAAMG,EAAsC,CACjD,YAAa,CACX,OACA,OACA,QACA,IACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,QACA,UACA,aACA,IACA,OACA,SACA,YACA,SACA,cACA,cACA,YACA,cACA,QACA,mBACA,YACA,cACA,cACA,IACA,eACA,iBACA,YACA,IACA,eACA,eACA,IACA,QACA,IACA,aACA,eACA,cACA,gBACA,kBACA,kBACA,IACA,YAAA,CAEJ,EAEMC,EAAwBC,GAC5B,OAAOA,GAAQ,UAAY,MAAM,QAAQA,EAAI,QAAQ,EAGjDC,EAAiBJ,GAA2B,IAAI,IACpDA,EAAW,IAAKF,GAAS,CAACA,EAAK,GAAIA,CAAI,CAAC,CAC1C,EAEMO,EAA0B,CAC9BF,EACAG,IAEI,OAAOH,GAAQ,SAAiBA,IAAQ,KAAOG,EAAY,IAAIH,CAAG,EAE/DG,EAAY,IAAIH,EAAI,GAAG,GAAKA,EAAI,SAAS,MAAOI,GAAYD,EAAY,IAAIC,CAAO,CAAC,EAGvFC,EAA8B,CAClCC,EACAC,IACiB,CACjB,MAAMJ,EAAc,IAAI,KAAII,GAAA,YAAAA,EAAe,cAAe,CAAA,CAAE,EAKtDC,EAAeF,EAAS,OAAQN,GAAQ,CAACE,EAAwBF,EAAKG,CAAW,CAAC,EAExF,GAAI,EAACI,GAAA,MAAAA,EAAe,YAAY,OAAOC,EAEvC,MAAMC,EAAc,KAAK,IAAI,EAAG,KAAK,IAAIF,EAAc,WAAW,MAAOC,EAAa,MAAM,CAAC,EAE7F,MAAO,CACL,GAAGA,EAAa,MAAM,EAAGC,CAAW,EACpC,GAAGF,EAAc,WAAW,KAC5B,GAAGC,EAAa,MAAMC,CAAW,CAAA,CAErC,EAEMC,EAAoB,CACxBV,EACAW,EACAR,EACAS,IAC0B,CAC1B,GAAIZ,IAAQ,IACV,MAAO,CAAC,CAAE,KAAM,YAAa,IAAK,aAAaY,CAAc,GAAI,EAGnE,GAAI,OAAOZ,GAAQ,SAAU,CAC3B,MAAML,EAAOgB,EAAQ,IAAIX,CAAG,EAG5B,MAAI,CAACL,GAASA,EAAK,iBAAmB,CAACA,EAAK,cAAiBQ,EAAY,IAAIR,EAAK,EAAE,EAC3E,CAAA,EAGF,CAAC,CAAE,KAAM,SAAU,KAAAA,EAAM,CAClC,CAEA,GAAII,EAAqBC,CAAG,EAAG,CAC7B,MAAMa,EAAQb,EAAI,SACf,OAAQI,GAAY,CAACD,EAAY,IAAIC,CAAO,CAAC,EAC7C,IAAKA,GAAYO,EAAQ,IAAIP,CAAO,CAAC,EACrC,OAAQT,GACPA,IAAS,SAAc,CAACA,EAAK,iBAAmBA,EAAK,eAAiB,OACvE,EAEH,OAAOkB,EAAM,OAAS,EAAI,CAAC,CACzB,KAAM,QACN,IAAKb,EAAI,IACT,MAAOA,EAAI,MACX,KAAMA,EAAI,KACV,MAAAa,CAAA,CACD,EAAI,CAAA,CACP,CAEA,MAAO,CAAA,CACT,EAEMC,EAAgC,CACpCnB,EACAkB,IACG,CACH,GAAIlB,EAAK,OAAS,YAAa,MAAO,GAEtC,MAAMoB,EAAeF,EAAMA,EAAM,OAAS,CAAC,EAE3C,OAAOE,IAAiB,QAAaA,EAAa,OAAS,WAC7D,EAEMC,EAAiCH,GAAiC,OACtE,OAAOvB,EAAAuB,EAAM,GAAG,EAAE,IAAX,YAAAvB,EAAc,QAAS,aAC5BuB,EAAM,IAAA,EAGR,OAAOA,CACT,EAQaI,EAAqB,CAChCV,EAA+BT,EAC/BD,EAAyBX,IACC,CAC1B,MAAMyB,EAAUV,EAAcJ,CAAU,EAClCS,EAAWC,EAAc,aAAeT,EAAqB,aAAe,CAAA,EAC5EoB,EAAcb,EAA4BC,EAAUC,CAAa,EACjEJ,EAAc,IAAI,IAAII,EAAc,aAAe,CAAA,CAAE,EAC3D,IAAIK,EAAiB,EAErB,MAAMO,EAAgBD,EAAY,OAA8B,CAACL,EAAOb,IAAQ,CAC9E,MAAMoB,EAAYV,EAAkBV,EAAKW,EAASR,EAAaS,CAAc,EAE7E,OAAIZ,IAAQ,MAAKY,GAAkB,GAEnCQ,EAAU,QAASzB,GAAS,CACtBmB,EAA8BnB,EAAMkB,CAAK,GAC3CA,EAAM,KAAKlB,CAAI,CAEnB,CAAC,EAEMkB,CACT,EAAG,CAAA,CAAE,EAEL,OAAOG,EAA8BG,CAAa,CACpD"}
1
+ {"version":3,"file":"native-spec.cjs","sources":["../../native-spec/src/menuSchema/payloadPanels.ts","../../native-spec/src/menuSchema/tableHeaderMenuItems.ts","../../native-spec/src/menuSchema/defaultMenuSchema.ts","../../native-spec/src/commandState/index.ts","../../native-spec/src/toolbarConfig/index.ts"],"sourcesContent":["import {\n BRIDGERTE_TABLE_INSERT_MAX_COLS,\n BRIDGERTE_TABLE_INSERT_MAX_ROWS,\n type PayloadPanelSchema\n} from '@bridgerte/core';\n\n/**\n * 代码块语言列表给 DOM 代码块顶部控制栏和原生侧自绘使用。\n *\n * 空字符串表示纯文本;默认候选按 Shiki 高频技术文档语言维护。业务如需裁剪语言、\n * 调整顺序或接入更多 Shiki 语言,传入自己的 `codeBlockLanguagePanel` 即可。\n */\nexport const codeBlockLanguagePanel: PayloadPanelSchema = {\n id: 'code-block-language',\n title: '代码语言',\n fields: [\n {\n type: 'select',\n name: 'language',\n label: '语言',\n defaultValue: '',\n options: [\n { label: '纯文本', value: '' },\n { label: 'Bash', value: 'shellscript' },\n { label: 'C', value: 'c' },\n { label: 'C++', value: 'cpp' },\n { label: 'C#', value: 'csharp' },\n { label: 'CSS', value: 'css' },\n { label: 'Dart', value: 'dart' },\n { label: 'Dockerfile', value: 'docker' },\n { label: 'Go', value: 'go' },\n { label: 'HTML', value: 'html' },\n { label: 'Java', value: 'java' },\n { label: 'JavaScript', value: 'javascript' },\n { label: 'JSON', value: 'json' },\n { label: 'Kotlin', value: 'kotlin' },\n { label: 'Markdown', value: 'markdown' },\n { label: 'PHP', value: 'php' },\n { label: 'Python', value: 'python' },\n { label: 'Rust', value: 'rust' },\n { label: 'SQL', value: 'sql' },\n { label: 'Swift', value: 'swift' },\n { label: 'TOML', value: 'toml' },\n { label: 'TSX', value: 'tsx' },\n { label: 'TypeScript', value: 'typescript' },\n { label: 'Vue', value: 'vue' },\n { label: 'XML', value: 'xml' },\n { label: 'YAML', value: 'yaml' }\n ]\n }\n ]\n};\n\n/**\n * 兼容旧导出名。\n *\n * 代码块语言现在由代码块 header 触发,不再代表 toolbar 菜单 payload。\n */\nexport const codeBlockLanguagePayloadPanel = codeBlockLanguagePanel;\n\n/**\n * 颜色菜单使用 color 字段而不是预设色列表。\n *\n * DOM 默认面板可以渲染内置颜色控件,RN/Flutter/WebView 或业务自绘层仍读取同一份 schema。\n */\nexport const textColorPanel: PayloadPanelSchema = {\n id: 'text-color',\n title: '文字颜色',\n fields: [\n {\n type: 'color',\n name: 'value',\n label: '颜色'\n }\n ]\n};\n\nexport const backgroundColorPanel: PayloadPanelSchema = {\n id: 'background-color',\n title: '背景色',\n fields: [\n {\n type: 'color',\n name: 'value',\n label: '背景'\n }\n ]\n};\n\nexport const fontSizePanel: PayloadPanelSchema = {\n id: 'font-size',\n title: '字号',\n fields: [\n {\n type: 'select',\n name: 'value',\n label: '字号',\n defaultValue: '16px',\n options: [\n { label: '小号 14px', value: '14px' },\n { label: '正文 16px', value: '16px' },\n { label: '强调 18px', value: '18px' },\n { label: '标题 20px', value: '20px' },\n { label: '大标题 24px', value: '24px' }\n ]\n }\n ]\n};\n\nexport const fontFamilyPanel: PayloadPanelSchema = {\n id: 'font-family',\n title: '字体',\n fields: [\n {\n type: 'select',\n name: 'value',\n label: '字体',\n defaultValue: '',\n options: [\n { label: '跟随页面', value: '' },\n { label: '无衬线', value: 'sans-serif' },\n { label: '衬线', value: 'serif' },\n { label: '等宽', value: 'monospace' }\n ]\n }\n ]\n};\n\nexport const lineHeightPanel: PayloadPanelSchema = {\n id: 'line-height',\n title: '行高',\n fields: [\n {\n type: 'select',\n name: 'value',\n label: '行高',\n defaultValue: '1.7',\n options: [\n { label: '紧凑 1.4', value: '1.4' },\n { label: '常规 1.7', value: '1.7' },\n { label: '舒展 2', value: '2' }\n ]\n }\n ]\n};\n\n/**\n * 表格插入使用 number 字段收集行列。\n *\n * DOM 默认面板、H5 自绘和 RN/Flutter 原生表单都读取同一份 schema;真正的表格进阶操作\n * 仍放后续表格菜单阶段继续扩展。\n */\nexport const tableInsertPanel: PayloadPanelSchema = {\n id: 'table-insert',\n title: '插入表格',\n fields: [\n {\n type: 'number',\n name: 'rows',\n label: '行数',\n defaultValue: '3',\n min: 1,\n max: BRIDGERTE_TABLE_INSERT_MAX_ROWS,\n step: 1\n },\n {\n type: 'number',\n name: 'cols',\n label: '列数',\n defaultValue: '3',\n min: 1,\n max: BRIDGERTE_TABLE_INSERT_MAX_COLS,\n step: 1\n }\n ]\n};\n","import type { MenuItem } from './type';\n\n/*\n * 表格 header 和后续表格浮动菜单共用这组操作入口。\n * 这些菜单默认不进入 toolbar 排列,但仍放在 native-spec,保证 DOM/RN/Flutter 自绘读取同一份\n * command/label/icon 协议。\n */\nexport const tableHeaderMenuItems: MenuItem[] = [\n {\n id: 'table-insert-row-after',\n command: { type: 'table.insertRow', direction: 'after' },\n label: '插入行',\n icon: 'rows-plus',\n group: 'table'\n },\n {\n id: 'table-delete-row',\n command: { type: 'table.deleteRow' },\n label: '删除行',\n icon: 'rows-minus',\n group: 'table'\n },\n {\n id: 'table-insert-column-after',\n command: { type: 'table.insertColumn', direction: 'after' },\n label: '插入列',\n icon: 'columns-plus',\n group: 'table'\n },\n {\n id: 'table-delete-column',\n command: { type: 'table.deleteColumn' },\n label: '删除列',\n icon: 'columns-minus',\n group: 'table'\n },\n {\n id: 'table-delete',\n command: { type: 'table.delete' },\n label: '删除表格',\n icon: 'table-delete',\n group: 'table'\n }\n];\n","import type { MenuItem } from './type';\nimport {\n backgroundColorPanel,\n fontFamilyPanel,\n fontSizePanel,\n lineHeightPanel,\n tableInsertPanel,\n textColorPanel\n} from './payloadPanels';\nimport { tableHeaderMenuItems } from './tableHeaderMenuItems';\n\n/**\n * 默认菜单 schema 覆盖 wangEditor 常用入口。\n *\n * RN/Flutter 可以按 group 渲染分组,也可以基于 id 做业务侧排序或裁剪。\n */\nexport const defaultMenuSchema: MenuItem[] = [\n {\n id: 'bold',\n command: { type: 'format.bold' },\n label: '加粗',\n icon: 'bold',\n group: 'text'\n },\n {\n id: 'italic',\n command: { type: 'format.italic' },\n label: '斜体',\n icon: 'italic',\n group: 'text'\n },\n {\n id: 'underline',\n command: { type: 'format.underline' },\n label: '下划线',\n icon: 'underline',\n group: 'text'\n },\n {\n id: 'strike',\n command: { type: 'format.strike' },\n label: '删除线',\n icon: 'strikethrough',\n group: 'text'\n },\n {\n id: 'inline-code',\n command: { type: 'format.inlineCode' },\n label: '行内代码',\n icon: 'code',\n group: 'text'\n },\n {\n id: 'superscript',\n command: { type: 'format.superscript' },\n label: '上标',\n icon: 'superscript',\n group: 'text'\n },\n {\n id: 'subscript',\n command: { type: 'format.subscript' },\n label: '下标',\n icon: 'subscript',\n group: 'text'\n },\n {\n id: 'clear-style',\n command: { type: 'format.clear' },\n label: '清除样式',\n icon: 'remove-formatting',\n group: 'text'\n },\n {\n id: 'color',\n command: { type: 'format.color', value: '' },\n label: '文字颜色',\n icon: 'palette',\n group: 'style',\n requiresPayload: true,\n payloadPanel: textColorPanel\n },\n {\n id: 'background-color',\n command: { type: 'format.backgroundColor', value: '' },\n label: '背景色',\n icon: 'paint-bucket',\n group: 'style',\n requiresPayload: true,\n payloadPanel: backgroundColorPanel\n },\n {\n id: 'font-size',\n command: { type: 'format.fontSize', value: '' },\n label: '字号',\n icon: 'case-sensitive',\n group: 'style',\n requiresPayload: true,\n payloadPanel: fontSizePanel\n },\n {\n id: 'font-family',\n command: { type: 'format.fontFamily', value: '' },\n label: '字体',\n icon: 'type',\n group: 'style',\n requiresPayload: true,\n payloadPanel: fontFamilyPanel\n },\n {\n id: 'line-height',\n command: { type: 'format.lineHeight', value: '' },\n label: '行高',\n icon: 'wrap-text',\n group: 'style',\n requiresPayload: true,\n payloadPanel: lineHeightPanel\n },\n {\n id: 'paragraph',\n command: { type: 'block.paragraph' },\n label: '正文',\n icon: 'pilcrow',\n group: 'block'\n },\n {\n id: 'heading-1',\n command: { type: 'block.heading', level: 1 },\n label: '一级标题',\n icon: 'heading-1',\n group: 'block'\n },\n {\n id: 'heading-2',\n command: { type: 'block.heading', level: 2 },\n label: '二级标题',\n icon: 'heading-2',\n group: 'block'\n },\n {\n id: 'heading-3',\n command: { type: 'block.heading', level: 3 },\n label: '三级标题',\n icon: 'heading-3',\n group: 'block'\n },\n {\n id: 'heading-4',\n command: { type: 'block.heading', level: 4 },\n label: '四级标题',\n icon: 'heading-4',\n group: 'block'\n },\n {\n id: 'heading-5',\n command: { type: 'block.heading', level: 5 },\n label: '五级标题',\n icon: 'heading-5',\n group: 'block'\n },\n {\n id: 'heading-6',\n command: { type: 'block.heading', level: 6 },\n label: '六级标题',\n icon: 'heading-6',\n group: 'block'\n },\n {\n id: 'quote',\n command: { type: 'block.quote' },\n label: '引用',\n icon: 'quote',\n group: 'block'\n },\n {\n id: 'divider',\n command: { type: 'block.divider' },\n label: '分割线',\n icon: 'minus',\n group: 'block'\n },\n {\n id: 'code-block',\n command: { type: 'block.code' },\n label: '代码块',\n icon: 'square-code',\n group: 'block'\n },\n {\n id: 'ordered-list',\n command: { type: 'list.ordered' },\n label: '有序列表',\n icon: 'list-ordered',\n group: 'list'\n },\n {\n id: 'unordered-list',\n command: { type: 'list.unordered' },\n label: '无序列表',\n icon: 'list',\n group: 'list'\n },\n {\n id: 'todo-list',\n command: { type: 'list.todo' },\n label: '待办列表',\n icon: 'list-todo',\n group: 'list'\n },\n {\n id: 'align-left',\n command: { type: 'align', value: 'left' },\n label: '左对齐',\n icon: 'align-left',\n group: 'align'\n },\n {\n id: 'align-center',\n command: { type: 'align', value: 'center' },\n label: '居中',\n icon: 'align-center',\n group: 'align'\n },\n {\n id: 'align-right',\n command: { type: 'align', value: 'right' },\n label: '右对齐',\n icon: 'align-right',\n group: 'align'\n },\n {\n id: 'align-justify',\n command: { type: 'align', value: 'justify' },\n label: '两端对齐',\n icon: 'align-justify',\n group: 'align'\n },\n {\n id: 'indent-increase',\n command: { type: 'indent.increase' },\n label: '增加缩进',\n icon: 'indent-increase',\n group: 'align'\n },\n {\n id: 'indent-decrease',\n command: { type: 'indent.decrease' },\n label: '减少缩进',\n icon: 'indent-decrease',\n group: 'align'\n },\n {\n id: 'mention',\n command: { type: 'mention.insert', item: { id: '', label: '', value: '' } },\n label: '@ 提及',\n icon: 'at-sign',\n group: 'insert',\n requiresPayload: true\n },\n {\n id: 'upload-image',\n command: { type: 'media.pickImage' },\n label: '上传图片',\n icon: 'upload-image',\n group: 'media'\n },\n {\n id: 'upload-video',\n command: { type: 'media.pickVideo' },\n label: '上传视频',\n icon: 'upload-video',\n group: 'media'\n },\n {\n id: 'table',\n command: { type: 'table.insert', rows: 3, cols: 3 },\n label: '表格',\n icon: 'table',\n group: 'table',\n requiresPayload: true,\n payloadPanel: tableInsertPanel\n },\n ...tableHeaderMenuItems,\n {\n id: 'slash-command',\n command: { type: 'slash.open' },\n label: '/ 命令',\n icon: 'list-plus',\n group: 'insert'\n },\n {\n id: 'undo',\n command: { type: 'history.undo' },\n label: '撤销',\n icon: 'undo',\n group: 'history'\n },\n {\n id: 'redo',\n command: { type: 'history.redo' },\n label: '重做',\n icon: 'redo',\n group: 'history'\n },\n {\n id: 'clear',\n command: { type: 'content.clear' },\n label: '清空',\n icon: 'trash-2',\n group: 'history'\n },\n {\n id: 'fullscreen',\n command: { type: 'fullscreen.toggle' },\n label: '全屏',\n icon: 'maximize',\n group: 'view'\n }\n];\n","import type { CommandState, EditorCommand } from '@bridgerte/core';\nimport type { MenuItem } from '../menuSchema';\nimport { defaultMenuSchema } from '../menuSchema';\n\nconst commandStateValueByType: Partial<Record<EditorCommand['type'], (command: EditorCommand) => (\n CommandState['value'] | undefined\n)>> = {\n align: (command) => command.type === 'align' ? command.value : undefined,\n 'block.heading': (command) => command.type === 'block.heading' ? command.level : undefined,\n 'block.setCodeLanguage': (command) => (\n command.type === 'block.setCodeLanguage' ? command.language : undefined\n )\n};\n\n/**\n * 取出菜单命令用于匹配 `CommandState.value` 的稳定值。\n *\n * 同类命令存在多个菜单项时使用这个值区分,比如对齐方式和标题级别。\n */\nexport const getCommandStateMatchValue = (\n command: EditorCommand\n): CommandState['value'] | undefined => commandStateValueByType[command.type]?.(command);\n\n/**\n * 判断某条命令状态是否对应一个完整命令 payload。\n */\nexport const isCommandStateForCommand = (\n command: EditorCommand,\n state: CommandState\n): boolean => {\n const matchValue = getCommandStateMatchValue(command);\n\n return state.command === command.type\n && (matchValue === undefined || state.value === matchValue);\n};\n\n/**\n * 判断某条命令状态是否对应一个菜单项。\n *\n * 原生 toolbar 可以用它把 `CommandState[]` 映射回具体按钮 active/disabled 状态。\n */\nexport const isMenuItemCommandState = (item: MenuItem, state: CommandState): boolean => (\n isCommandStateForCommand(item.command, state)\n);\n\n/**\n * 为给定菜单生成默认禁用状态。\n *\n * 编辑器未 ready 或无选区时,原生 toolbar 可以先使用这组状态兜底。\n */\nexport function createDisabledCommandStates(menuSchema = defaultMenuSchema): CommandState[] {\n return menuSchema.map((item) => ({\n command: item.command.type,\n active: false,\n disabled: true,\n value: getCommandStateMatchValue(item.command)\n }));\n}\n","import type { ToolbarConfig, ToolbarGroupConfig, ToolbarKey } from '@bridgerte/core';\nimport type { MenuItem } from '../menuSchema';\nimport { defaultMenuSchema } from '../menuSchema';\nimport type { ResolvedToolbarItem } from './type';\n\nexport type * from './type';\n\n/**\n * 默认 DOM toolbar 配置。\n *\n * 这里只选择已实现或带参数面板的基础按钮;完整菜单全集仍由 `defaultMenuSchema` 维护。\n */\nexport const defaultToolbarConfig: ToolbarConfig = {\n toolbarKeys: [\n 'undo',\n 'redo',\n 'clear',\n '|',\n 'paragraph',\n 'heading-1',\n 'heading-2',\n 'heading-3',\n 'heading-4',\n 'heading-5',\n 'heading-6',\n 'quote',\n 'divider',\n 'code-block',\n '|',\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'inline-code',\n 'superscript',\n 'subscript',\n 'clear-style',\n 'color',\n 'background-color',\n 'font-size',\n 'font-family',\n 'line-height',\n '|',\n 'ordered-list',\n 'unordered-list',\n 'todo-list',\n '|',\n 'upload-image',\n 'upload-video',\n '|',\n 'table',\n '|',\n 'align-left',\n 'align-center',\n 'align-right',\n 'align-justify',\n 'indent-increase',\n 'indent-decrease',\n '|',\n 'fullscreen'\n ]\n};\n\nconst isToolbarGroupConfig = (key: ToolbarKey): key is ToolbarGroupConfig => (\n typeof key === 'object' && Array.isArray(key.menuKeys)\n);\n\nconst createMenuMap = (menuSchema: MenuItem[]) => new Map(\n menuSchema.map((item) => [item.id, item])\n);\n\nconst shouldExcludeToolbarKey = (\n key: ToolbarKey,\n excludeKeys: Set<string>\n) => {\n if (typeof key === 'string') return key !== '|' && excludeKeys.has(key);\n\n return excludeKeys.has(key.key) || key.menuKeys.every((menuKey) => excludeKeys.has(menuKey));\n};\n\nconst applyToolbarConfigOverrides = (\n baseKeys: ToolbarKey[],\n toolbarConfig?: ToolbarConfig\n): ToolbarKey[] => {\n const excludeKeys = new Set(toolbarConfig?.excludeKeys ?? []);\n /*\n * 先排除再插入,等价于“在用户最终想保留的默认菜单里加东西”。\n * insert index 做夹取,避免业务传入负数或超长下标时破坏默认 toolbar。\n */\n const filteredKeys = baseKeys.filter((key) => !shouldExcludeToolbarKey(key, excludeKeys));\n\n if (!toolbarConfig?.insertKeys) return filteredKeys;\n\n const insertIndex = Math.max(0, Math.min(toolbarConfig.insertKeys.index, filteredKeys.length));\n\n return [\n ...filteredKeys.slice(0, insertIndex),\n ...toolbarConfig.insertKeys.keys,\n ...filteredKeys.slice(insertIndex)\n ];\n};\n\nconst resolveToolbarKey = (\n key: ToolbarKey,\n menuMap: Map<string, MenuItem>,\n excludeKeys: Set<string>,\n separatorIndex: number\n): ResolvedToolbarItem[] => {\n if (key === '|') {\n return [{ type: 'separator', key: `separator-${separatorIndex}` }];\n }\n\n if (typeof key === 'string') {\n const item = menuMap.get(key);\n\n // 未知 key 直接忽略;需要 payload 但没有 panel 的菜单暂不渲染,避免按钮点击后无法生成合法命令。\n if (!item || (item.requiresPayload && !item.payloadPanel) || excludeKeys.has(item.id)) {\n return [];\n }\n\n return [{ type: 'button', item }];\n }\n\n if (isToolbarGroupConfig(key)) {\n const items = key.menuKeys\n .filter((menuKey) => !excludeKeys.has(menuKey))\n .map((menuKey) => menuMap.get(menuKey))\n .filter((item): item is MenuItem => (\n item !== undefined && (!item.requiresPayload || item.payloadPanel !== undefined)\n ));\n\n return items.length > 0 ? [{\n type: 'group',\n key: key.key,\n title: key.title,\n icon: key.icon,\n items\n }] : [];\n }\n\n return [];\n};\n\nconst shouldKeepResolvedToolbarItem = (\n item: ResolvedToolbarItem,\n items: ResolvedToolbarItem[]\n) => {\n if (item.type !== 'separator') return true;\n\n const previousItem = items[items.length - 1];\n\n return previousItem !== undefined && previousItem.type !== 'separator';\n};\n\nconst trimTrailingToolbarSeparators = (items: ResolvedToolbarItem[]) => {\n while (items.at(-1)?.type === 'separator') {\n items.pop();\n }\n\n return items;\n};\n\n/**\n * 把 wangEditor 风格的 JSON 配置解析成 DOM/RN/Flutter 都能消费的菜单结构。\n *\n * 未知 key 和缺少 payloadPanel 的 requiresPayload 菜单会被忽略,避免默认 toolbar 渲染无法处理的按钮。\n * 分割线会自动去掉开头、结尾和连续项,避免被跳过的菜单留下空分隔。\n */\nexport const resolveToolbarMenu = (\n toolbarConfig: ToolbarConfig = defaultToolbarConfig,\n menuSchema: MenuItem[] = defaultMenuSchema\n): ResolvedToolbarItem[] => {\n const menuMap = createMenuMap(menuSchema);\n const baseKeys = toolbarConfig.toolbarKeys ?? defaultToolbarConfig.toolbarKeys ?? [];\n const toolbarKeys = applyToolbarConfigOverrides(baseKeys, toolbarConfig);\n const excludeKeys = new Set(toolbarConfig.excludeKeys ?? []);\n let separatorIndex = 0;\n\n const resolvedItems = toolbarKeys.reduce<ResolvedToolbarItem[]>((items, key) => {\n const nextItems = resolveToolbarKey(key, menuMap, excludeKeys, separatorIndex);\n\n if (key === '|') separatorIndex += 1;\n\n nextItems.forEach((item) => {\n if (shouldKeepResolvedToolbarItem(item, items)) {\n items.push(item);\n }\n });\n\n return items;\n }, []);\n\n return trimTrailingToolbarSeparators(resolvedItems);\n};\n"],"names":["codeBlockLanguagePanel","codeBlockLanguagePayloadPanel","textColorPanel","backgroundColorPanel","fontSizePanel","fontFamilyPanel","lineHeightPanel","tableInsertPanel","BRIDGERTE_TABLE_INSERT_MAX_ROWS","BRIDGERTE_TABLE_INSERT_MAX_COLS","tableHeaderMenuItems","defaultMenuSchema","commandStateValueByType","command","getCommandStateMatchValue","_a","isCommandStateForCommand","state","matchValue","isMenuItemCommandState","item","createDisabledCommandStates","menuSchema","defaultToolbarConfig","isToolbarGroupConfig","key","createMenuMap","shouldExcludeToolbarKey","excludeKeys","menuKey","applyToolbarConfigOverrides","baseKeys","toolbarConfig","filteredKeys","insertIndex","resolveToolbarKey","menuMap","separatorIndex","items","shouldKeepResolvedToolbarItem","previousItem","trimTrailingToolbarSeparators","resolveToolbarMenu","toolbarKeys","resolvedItems","nextItems"],"mappings":"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"}
@@ -283,7 +283,7 @@ export type FormatClearScope = 'selection' | 'block';
283
283
  /**
284
284
  * 代码块语言标识。
285
285
  *
286
- * 保持 string 是为了兼容 highlight.js、Prism 或业务自定义语言表。
286
+ * 保持 string 是为了兼容 Shiki、highlight.js 或业务自定义语言表。
287
287
  */
288
288
  export type CodeBlockLanguage = string;
289
289
  /**
@@ -527,7 +527,14 @@ export type SlashCommandMenuAnchorRect = {
527
527
  width: number;
528
528
  height: number;
529
529
  };
530
+ /**
531
+ * slash command 菜单展示配置。
532
+ *
533
+ * `showIcon` 只决定默认候选菜单是否展示 icon;候选数据仍保留 icon key,方便 DOM、
534
+ * WebView 或业务自绘层按自己的 UI 策略渲染。
535
+ */
530
536
  export type SlashCommandMenuConfig = {
537
+ showIcon?: boolean;
531
538
  loadingText?: string;
532
539
  emptyText?: string;
533
540
  errorText?: string;
@@ -10,27 +10,35 @@ const h = {
10
10
  defaultValue: "",
11
11
  options: [
12
12
  { label: "纯文本", value: "" },
13
+ { label: "Bash", value: "shellscript" },
13
14
  { label: "C", value: "c" },
14
- { label: "C-like", value: "clike" },
15
15
  { label: "C++", value: "cpp" },
16
+ { label: "C#", value: "csharp" },
16
17
  { label: "CSS", value: "css" },
18
+ { label: "Dart", value: "dart" },
19
+ { label: "Dockerfile", value: "docker" },
20
+ { label: "Go", value: "go" },
17
21
  { label: "HTML", value: "html" },
18
22
  { label: "Java", value: "java" },
19
23
  { label: "JavaScript", value: "javascript" },
20
24
  { label: "JSON", value: "json" },
25
+ { label: "Kotlin", value: "kotlin" },
21
26
  { label: "Markdown", value: "markdown" },
22
- { label: "Objective-C", value: "objc" },
23
- { label: "PowerShell", value: "powershell" },
27
+ { label: "PHP", value: "php" },
24
28
  { label: "Python", value: "python" },
25
29
  { label: "Rust", value: "rust" },
26
30
  { label: "SQL", value: "sql" },
27
31
  { label: "Swift", value: "swift" },
32
+ { label: "TOML", value: "toml" },
33
+ { label: "TSX", value: "tsx" },
28
34
  { label: "TypeScript", value: "typescript" },
29
- { label: "XML", value: "xml" }
35
+ { label: "Vue", value: "vue" },
36
+ { label: "XML", value: "xml" },
37
+ { label: "YAML", value: "yaml" }
30
38
  ]
31
39
  }
32
40
  ]
33
- }, V = h, f = {
41
+ }, C = h, f = {
34
42
  id: "text-color",
35
43
  title: "文字颜色",
36
44
  fields: [
@@ -85,7 +93,7 @@ const h = {
85
93
  ]
86
94
  }
87
95
  ]
88
- }, w = {
96
+ }, S = {
89
97
  id: "line-height",
90
98
  title: "行高",
91
99
  fields: [
@@ -101,7 +109,7 @@ const h = {
101
109
  ]
102
110
  }
103
111
  ]
104
- }, S = {
112
+ }, w = {
105
113
  id: "table-insert",
106
114
  title: "插入表格",
107
115
  fields: [
@@ -124,7 +132,7 @@ const h = {
124
132
  step: 1
125
133
  }
126
134
  ]
127
- }, K = [
135
+ }, T = [
128
136
  {
129
137
  id: "table-insert-row-after",
130
138
  command: { type: "table.insertRow", direction: "after" },
@@ -260,7 +268,7 @@ const h = {
260
268
  icon: "wrap-text",
261
269
  group: "style",
262
270
  requiresPayload: !0,
263
- payloadPanel: w
271
+ payloadPanel: S
264
272
  },
265
273
  {
266
274
  id: "paragraph",
@@ -424,9 +432,9 @@ const h = {
424
432
  icon: "table",
425
433
  group: "table",
426
434
  requiresPayload: !0,
427
- payloadPanel: S
435
+ payloadPanel: w
428
436
  },
429
- ...K,
437
+ ...T,
430
438
  {
431
439
  id: "slash-command",
432
440
  command: { type: "slash.open" },
@@ -469,11 +477,11 @@ const h = {
469
477
  }, m = (e) => {
470
478
  var l;
471
479
  return (l = r[e.type]) == null ? void 0 : l.call(r, e);
472
- }, T = (e, l) => {
480
+ }, K = (e, l) => {
473
481
  const a = m(e);
474
482
  return l.command === e.type && (a === void 0 || l.value === a);
475
- }, _ = (e, l) => T(e.command, l);
476
- function z(e = p) {
483
+ }, _ = (e, l) => K(e.command, l);
484
+ function A(e = p) {
477
485
  return e.map((l) => ({
478
486
  command: l.command.type,
479
487
  active: !1,
@@ -481,7 +489,7 @@ function z(e = p) {
481
489
  value: m(l.command)
482
490
  }));
483
491
  }
484
- const u = {
492
+ const s = {
485
493
  toolbarKeys: [
486
494
  "undo",
487
495
  "redo",
@@ -530,32 +538,32 @@ const u = {
530
538
  "|",
531
539
  "fullscreen"
532
540
  ]
533
- }, q = (e) => typeof e == "object" && Array.isArray(e.menuKeys), M = (e) => new Map(
541
+ }, M = (e) => typeof e == "object" && Array.isArray(e.menuKeys), q = (e) => new Map(
534
542
  e.map((l) => [l.id, l])
535
- ), I = (e, l) => typeof e == "string" ? e !== "|" && l.has(e) : l.has(e.key) || e.menuKeys.every((a) => l.has(a)), R = (e, l) => {
536
- const a = new Set((l == null ? void 0 : l.excludeKeys) ?? []), n = e.filter((t) => !I(t, a));
543
+ ), I = (e, l) => typeof e == "string" ? e !== "|" && l.has(e) : l.has(e.key) || e.menuKeys.every((a) => l.has(a)), L = (e, l) => {
544
+ const a = new Set((l == null ? void 0 : l.excludeKeys) ?? []), n = e.filter((o) => !I(o, a));
537
545
  if (!(l != null && l.insertKeys)) return n;
538
- const o = Math.max(0, Math.min(l.insertKeys.index, n.length));
546
+ const t = Math.max(0, Math.min(l.insertKeys.index, n.length));
539
547
  return [
540
- ...n.slice(0, o),
548
+ ...n.slice(0, t),
541
549
  ...l.insertKeys.keys,
542
- ...n.slice(o)
550
+ ...n.slice(t)
543
551
  ];
544
- }, j = (e, l, a, n) => {
552
+ }, R = (e, l, a, n) => {
545
553
  if (e === "|")
546
554
  return [{ type: "separator", key: `separator-${n}` }];
547
555
  if (typeof e == "string") {
548
- const o = l.get(e);
549
- return !o || o.requiresPayload && !o.payloadPanel || a.has(o.id) ? [] : [{ type: "button", item: o }];
556
+ const t = l.get(e);
557
+ return !t || t.requiresPayload && !t.payloadPanel || a.has(t.id) ? [] : [{ type: "button", item: t }];
550
558
  }
551
- if (q(e)) {
552
- const o = e.menuKeys.filter((t) => !a.has(t)).map((t) => l.get(t)).filter((t) => t !== void 0 && (!t.requiresPayload || t.payloadPanel !== void 0));
553
- return o.length > 0 ? [{
559
+ if (M(e)) {
560
+ const t = e.menuKeys.filter((o) => !a.has(o)).map((o) => l.get(o)).filter((o) => o !== void 0 && (!o.requiresPayload || o.payloadPanel !== void 0));
561
+ return t.length > 0 ? [{
554
562
  type: "group",
555
563
  key: e.key,
556
564
  title: e.title,
557
565
  icon: e.icon,
558
- items: o
566
+ items: t
559
567
  }] : [];
560
568
  }
561
569
  return [];
@@ -563,32 +571,32 @@ const u = {
563
571
  if (e.type !== "separator") return !0;
564
572
  const a = l[l.length - 1];
565
573
  return a !== void 0 && a.type !== "separator";
566
- }, L = (e) => {
574
+ }, V = (e) => {
567
575
  var l;
568
576
  for (; ((l = e.at(-1)) == null ? void 0 : l.type) === "separator"; )
569
577
  e.pop();
570
578
  return e;
571
- }, A = (e = u, l = p) => {
572
- const a = M(l), n = e.toolbarKeys ?? u.toolbarKeys ?? [], o = R(n, e), t = new Set(e.excludeKeys ?? []);
579
+ }, z = (e = s, l = p) => {
580
+ const a = q(l), n = e.toolbarKeys ?? s.toolbarKeys ?? [], t = L(n, e), o = new Set(e.excludeKeys ?? []);
573
581
  let d = 0;
574
- const b = o.reduce((i, c) => {
575
- const g = j(c, a, t, d);
576
- return c === "|" && (d += 1), g.forEach((s) => {
577
- E(s, i) && i.push(s);
582
+ const b = t.reduce((i, c) => {
583
+ const g = R(c, a, o, d);
584
+ return c === "|" && (d += 1), g.forEach((u) => {
585
+ E(u, i) && i.push(u);
578
586
  }), i;
579
587
  }, []);
580
- return L(b);
588
+ return V(b);
581
589
  };
582
590
  export {
583
591
  h as codeBlockLanguagePanel,
584
- V as codeBlockLanguagePayloadPanel,
585
- z as createDisabledCommandStates,
592
+ C as codeBlockLanguagePayloadPanel,
593
+ A as createDisabledCommandStates,
586
594
  p as defaultMenuSchema,
587
- u as defaultToolbarConfig,
595
+ s as defaultToolbarConfig,
588
596
  m as getCommandStateMatchValue,
589
- T as isCommandStateForCommand,
597
+ K as isCommandStateForCommand,
590
598
  _ as isMenuItemCommandState,
591
- A as resolveToolbarMenu,
592
- K as tableHeaderMenuItems
599
+ z as resolveToolbarMenu,
600
+ T as tableHeaderMenuItems
593
601
  };
594
602
  //# sourceMappingURL=native-spec.js.map