bridgerte 0.9.4 → 0.9.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -9
- package/dist/bridge.d.ts +1 -3
- package/dist/core.d.ts +9 -3
- package/dist/dom.cjs +1 -1
- package/dist/dom.d.ts +9 -3
- package/dist/dom.js +2 -2
- package/dist/index-B_g23O7q.cjs +4 -0
- package/dist/index-B_g23O7q.cjs.map +1 -0
- package/dist/index-Ce7rOCpH.cjs +36 -0
- package/dist/index-Ce7rOCpH.cjs.map +1 -0
- package/dist/index-DGPoit9-.js +323 -0
- package/dist/index-DGPoit9-.js.map +1 -0
- package/dist/{index-BzpD9bI2.js → index-DyCMSFrm.js} +10 -19
- package/dist/index-DyCMSFrm.js.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +17 -3
- package/dist/index.js +2 -2
- package/dist/native-spec.cjs +1 -1
- package/dist/native-spec.cjs.map +1 -1
- package/dist/native-spec.d.ts +1 -3
- package/dist/native-spec.js +73 -119
- package/dist/native-spec.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/webview.cjs +1 -1
- package/dist/webview.d.ts +1 -3
- package/dist/webview.js +1 -1
- package/package.json +1 -1
- package/dist/index-5d8qaSP5.cjs +0 -36
- package/dist/index-5d8qaSP5.cjs.map +0 -1
- package/dist/index-BzpD9bI2.js.map +0 -1
- package/dist/index-C26bdJ7I.js +0 -319
- package/dist/index-C26bdJ7I.js.map +0 -1
- package/dist/index-DKalD8mx.cjs +0 -4
- package/dist/index-DKalD8mx.cjs.map +0 -1
package/dist/native-spec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-spec.js","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';\r\nimport {\r\n backgroundColorPanel,\r\n fontFamilyPanel,\r\n fontSizePanel,\r\n lineHeightPanel,\r\n tableInsertPanel,\r\n textColorPanel\r\n} from './payloadPanels';\r\nimport { tableHeaderMenuItems } from './tableHeaderMenuItems';\r\n\r\n/**\r\n * 默认菜单 schema 覆盖 wangEditor 常用入口。\r\n *\r\n * RN/Flutter 可以按 group 渲染分组,也可以基于 id 做业务侧排序或裁剪。\r\n */\r\nexport const defaultMenuSchema: MenuItem[] = [\r\n {\r\n id: 'bold',\r\n command: { type: 'format.bold' },\r\n label: '加粗',\r\n icon: 'bold',\r\n group: 'text'\r\n },\r\n {\r\n id: 'italic',\r\n command: { type: 'format.italic' },\r\n label: '斜体',\r\n icon: 'italic',\r\n group: 'text'\r\n },\r\n {\r\n id: 'underline',\r\n command: { type: 'format.underline' },\r\n label: '下划线',\r\n icon: 'underline',\r\n group: 'text'\r\n },\r\n {\r\n id: 'strike',\r\n command: { type: 'format.strike' },\r\n label: '删除线',\r\n icon: 'strikethrough',\r\n group: 'text'\r\n },\r\n {\r\n id: 'inline-code',\r\n command: { type: 'format.inlineCode' },\r\n label: '行内代码',\r\n icon: 'code',\r\n group: 'text'\r\n },\r\n {\r\n id: 'superscript',\r\n command: { type: 'format.superscript' },\r\n label: '上标',\r\n icon: 'superscript',\r\n group: 'text'\r\n },\r\n {\r\n id: 'subscript',\r\n command: { type: 'format.subscript' },\r\n label: '下标',\r\n icon: 'subscript',\r\n group: 'text'\r\n },\r\n {\r\n id: 'clear-style',\r\n command: { type: 'format.clear' },\r\n label: '清除样式',\r\n icon: 'remove-formatting',\r\n group: 'text'\r\n },\r\n {\r\n id: 'color',\r\n command: { type: 'format.color', value: '' },\r\n label: '文字颜色',\r\n icon: 'palette',\r\n group: 'style',\r\n requiresPayload: true,\r\n payloadPanel: textColorPanel\r\n },\r\n {\r\n id: 'background-color',\r\n command: { type: 'format.backgroundColor', value: '' },\r\n label: '背景色',\r\n icon: 'paint-bucket',\r\n group: 'style',\r\n requiresPayload: true,\r\n payloadPanel: backgroundColorPanel\r\n },\r\n {\r\n id: 'font-size',\r\n command: { type: 'format.fontSize', value: '' },\r\n label: '字号',\r\n icon: 'case-sensitive',\r\n group: 'style',\r\n requiresPayload: true,\r\n payloadPanel: fontSizePanel\r\n },\r\n {\r\n id: 'font-family',\r\n command: { type: 'format.fontFamily', value: '' },\r\n label: '字体',\r\n icon: 'type',\r\n group: 'style',\r\n requiresPayload: true,\r\n payloadPanel: fontFamilyPanel\r\n },\r\n {\r\n id: 'line-height',\r\n command: { type: 'format.lineHeight', value: '' },\r\n label: '行高',\r\n icon: 'wrap-text',\r\n group: 'style',\r\n requiresPayload: true,\r\n payloadPanel: lineHeightPanel\r\n },\r\n {\r\n id: 'paragraph',\r\n command: { type: 'block.paragraph' },\r\n label: '正文',\r\n icon: 'pilcrow',\r\n group: 'block'\r\n },\r\n {\r\n id: 'heading-1',\r\n command: { type: 'block.heading', level: 1 },\r\n label: '一级标题',\r\n icon: 'heading-1',\r\n group: 'block'\r\n },\r\n {\r\n id: 'heading-2',\r\n command: { type: 'block.heading', level: 2 },\r\n label: '二级标题',\r\n icon: 'heading-2',\r\n group: 'block'\r\n },\r\n {\r\n id: 'heading-3',\r\n command: { type: 'block.heading', level: 3 },\r\n label: '三级标题',\r\n icon: 'heading-3',\r\n group: 'block'\r\n },\r\n {\r\n id: 'heading-4',\r\n command: { type: 'block.heading', level: 4 },\r\n label: '四级标题',\r\n icon: 'heading-4',\r\n group: 'block'\r\n },\r\n {\r\n id: 'heading-5',\r\n command: { type: 'block.heading', level: 5 },\r\n label: '五级标题',\r\n icon: 'heading-5',\r\n group: 'block'\r\n },\r\n {\r\n id: 'heading-6',\r\n command: { type: 'block.heading', level: 6 },\r\n label: '六级标题',\r\n icon: 'heading-6',\r\n group: 'block'\r\n },\r\n {\r\n id: 'quote',\r\n command: { type: 'block.quote' },\r\n label: '引用',\r\n icon: 'quote',\r\n group: 'block'\r\n },\r\n {\r\n id: 'divider',\r\n command: { type: 'block.divider' },\r\n label: '分割线',\r\n icon: 'minus',\r\n group: 'block'\r\n },\r\n {\r\n id: 'code-block',\r\n command: { type: 'block.code' },\r\n label: '代码块',\r\n icon: 'square-code',\r\n group: 'block'\r\n },\r\n {\r\n id: 'ordered-list',\r\n command: { type: 'list.ordered' },\r\n label: '有序列表',\r\n icon: 'list-ordered',\r\n group: 'list'\r\n },\r\n {\r\n id: 'unordered-list',\r\n command: { type: 'list.unordered' },\r\n label: '无序列表',\r\n icon: 'list',\r\n group: 'list'\r\n },\r\n {\r\n id: 'todo-list',\r\n command: { type: 'list.todo' },\r\n label: '待办列表',\r\n icon: 'list-todo',\r\n group: 'list'\r\n },\r\n {\r\n id: 'align-left',\r\n command: { type: 'align', value: 'left' },\r\n label: '左对齐',\r\n icon: 'align-left',\r\n group: 'align'\r\n },\r\n {\r\n id: 'align-center',\r\n command: { type: 'align', value: 'center' },\r\n label: '居中',\r\n icon: 'align-center',\r\n group: 'align'\r\n },\r\n {\r\n id: 'align-right',\r\n command: { type: 'align', value: 'right' },\r\n label: '右对齐',\r\n icon: 'align-right',\r\n group: 'align'\r\n },\r\n {\r\n id: 'align-justify',\r\n command: { type: 'align', value: 'justify' },\r\n label: '两端对齐',\r\n icon: 'align-justify',\r\n group: 'align'\r\n },\r\n {\r\n id: 'indent-increase',\r\n command: { type: 'indent.increase' },\r\n label: '增加缩进',\r\n icon: 'indent-increase',\r\n group: 'align'\r\n },\r\n {\r\n id: 'indent-decrease',\r\n command: { type: 'indent.decrease' },\r\n label: '减少缩进',\r\n icon: 'indent-decrease',\r\n group: 'align'\r\n },\r\n {\r\n id: 'mention',\r\n command: { type: 'mention.insert', item: { id: '', label: '', value: '' } },\r\n label: '@ 提及',\r\n icon: 'at-sign',\r\n group: 'insert',\r\n requiresPayload: true\r\n },\r\n {\r\n id: 'upload-image',\r\n command: { type: 'media.pickImage' },\r\n label: '上传图片',\r\n icon: 'upload-image',\r\n group: 'media'\r\n },\r\n {\r\n id: 'upload-video',\r\n command: { type: 'media.pickVideo' },\r\n label: '上传视频',\r\n icon: 'upload-video',\r\n group: 'media'\r\n },\r\n {\r\n id: 'table',\r\n command: { type: 'table.insert', rows: 3, cols: 3 },\r\n label: '表格',\r\n icon: 'table',\r\n group: 'table',\r\n requiresPayload: true,\r\n payloadPanel: tableInsertPanel\r\n },\r\n ...tableHeaderMenuItems,\r\n {\r\n id: 'slash-command',\r\n command: { type: 'slash.open' },\r\n label: '/ 命令',\r\n icon: 'list-plus',\r\n group: 'insert'\r\n },\r\n {\r\n id: 'undo',\r\n command: { type: 'history.undo' },\r\n label: '撤销',\r\n icon: 'undo',\r\n group: 'history'\r\n },\r\n {\r\n id: 'redo',\r\n command: { type: 'history.redo' },\r\n label: '重做',\r\n icon: 'redo',\r\n group: 'history'\r\n },\r\n {\r\n id: 'clear',\r\n command: { type: 'content.clear' },\r\n label: '清空',\r\n icon: 'trash-2',\r\n group: 'history'\r\n },\r\n {\r\n id: 'fullscreen',\r\n command: { type: 'fullscreen.toggle' },\r\n label: '全屏',\r\n icon: 'maximize',\r\n group: 'view'\r\n }\r\n];\r\n","import type { CommandState, EditorCommand } from '@bridgerte/core';\r\nimport type { MenuItem } from '../menuSchema';\r\nimport { defaultMenuSchema } from '../menuSchema';\r\n\r\nconst commandStateValueByType: Partial<Record<EditorCommand['type'], (command: EditorCommand) => (\r\n CommandState['value'] | undefined\r\n)>> = {\r\n align: (command) => command.type === 'align' ? command.value : undefined,\r\n 'block.heading': (command) => command.type === 'block.heading' ? command.level : undefined,\r\n 'block.setCodeLanguage': (command) => (\r\n command.type === 'block.setCodeLanguage' ? command.language : undefined\r\n )\r\n};\r\n\r\n/**\r\n * 取出菜单命令用于匹配 `CommandState.value` 的稳定值。\r\n *\r\n * 同类命令存在多个菜单项时使用这个值区分,比如对齐方式和标题级别。\r\n */\r\nexport const getCommandStateMatchValue = (\r\n command: EditorCommand\r\n): CommandState['value'] | undefined => commandStateValueByType[command.type]?.(command);\r\n\r\n/**\r\n * 判断某条命令状态是否对应一个完整命令 payload。\r\n */\r\nexport const isCommandStateForCommand = (\r\n command: EditorCommand,\r\n state: CommandState\r\n): boolean => {\r\n const matchValue = getCommandStateMatchValue(command);\r\n\r\n return state.command === command.type\r\n && (matchValue === undefined || state.value === matchValue);\r\n};\r\n\r\n/**\r\n * 判断某条命令状态是否对应一个菜单项。\r\n *\r\n * 原生 toolbar 可以用它把 `CommandState[]` 映射回具体按钮 active/disabled 状态。\r\n */\r\nexport const isMenuItemCommandState = (item: MenuItem, state: CommandState): boolean => (\r\n isCommandStateForCommand(item.command, state)\r\n);\r\n\r\n/**\r\n * 为给定菜单生成默认禁用状态。\r\n *\r\n * 编辑器未 ready 或无选区时,原生 toolbar 可以先使用这组状态兜底。\r\n */\r\nexport function createDisabledCommandStates(menuSchema = defaultMenuSchema): CommandState[] {\r\n return menuSchema.map((item) => ({\r\n command: item.command.type,\r\n active: false,\r\n disabled: true,\r\n value: getCommandStateMatchValue(item.command)\r\n }));\r\n}\r\n","import type { ToolbarConfig, ToolbarGroupConfig, ToolbarKey } from '@bridgerte/core';\r\nimport type { MenuItem } from '../menuSchema';\r\nimport { defaultMenuSchema } from '../menuSchema';\r\nimport type { ResolvedToolbarItem } from './type';\r\n\r\nexport type * from './type';\r\n\r\n/**\r\n * 默认 DOM toolbar 配置。\r\n *\r\n * 这里只选择已实现或带参数面板的基础按钮;完整菜单全集仍由 `defaultMenuSchema` 维护。\r\n */\r\nexport const defaultToolbarConfig: ToolbarConfig = {\r\n toolbarKeys: [\r\n 'undo',\r\n 'redo',\r\n 'clear',\r\n '|',\r\n 'paragraph',\r\n 'heading-1',\r\n 'heading-2',\r\n 'heading-3',\r\n 'heading-4',\r\n 'heading-5',\r\n 'heading-6',\r\n 'quote',\r\n 'divider',\r\n 'code-block',\r\n '|',\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'strike',\r\n 'inline-code',\r\n 'superscript',\r\n 'subscript',\r\n 'clear-style',\r\n 'color',\r\n 'background-color',\r\n 'font-size',\r\n 'font-family',\r\n 'line-height',\r\n '|',\r\n 'ordered-list',\n 'unordered-list',\n 'todo-list',\n '|',\n 'upload-image',\n 'upload-video',\n '|',\n 'table',\n '|',\n 'align-left',\r\n 'align-center',\r\n 'align-right',\r\n 'align-justify',\r\n 'indent-increase',\r\n 'indent-decrease',\r\n '|',\r\n 'fullscreen'\r\n ]\r\n};\r\n\r\nconst isToolbarGroupConfig = (key: ToolbarKey): key is ToolbarGroupConfig => (\r\n typeof key === 'object' && Array.isArray(key.menuKeys)\r\n);\r\n\r\nconst createMenuMap = (menuSchema: MenuItem[]) => new Map(\r\n menuSchema.map((item) => [item.id, item])\r\n);\r\n\r\nconst shouldExcludeToolbarKey = (\r\n key: ToolbarKey,\r\n excludeKeys: Set<string>\r\n) => {\r\n if (typeof key === 'string') return key !== '|' && excludeKeys.has(key);\r\n\r\n return excludeKeys.has(key.key) || key.menuKeys.every((menuKey) => excludeKeys.has(menuKey));\r\n};\r\n\r\nconst applyToolbarConfigOverrides = (\r\n baseKeys: ToolbarKey[],\r\n toolbarConfig?: ToolbarConfig\r\n): ToolbarKey[] => {\r\n const excludeKeys = new Set(toolbarConfig?.excludeKeys ?? []);\r\n /*\r\n * 先排除再插入,等价于“在用户最终想保留的默认菜单里加东西”。\r\n * insert index 做夹取,避免业务传入负数或超长下标时破坏默认 toolbar。\r\n */\r\n const filteredKeys = baseKeys.filter((key) => !shouldExcludeToolbarKey(key, excludeKeys));\r\n\r\n if (!toolbarConfig?.insertKeys) return filteredKeys;\r\n\r\n const insertIndex = Math.max(0, Math.min(toolbarConfig.insertKeys.index, filteredKeys.length));\r\n\r\n return [\r\n ...filteredKeys.slice(0, insertIndex),\r\n ...toolbarConfig.insertKeys.keys,\r\n ...filteredKeys.slice(insertIndex)\r\n ];\r\n};\r\n\r\nconst resolveToolbarKey = (\r\n key: ToolbarKey,\r\n menuMap: Map<string, MenuItem>,\r\n excludeKeys: Set<string>,\r\n separatorIndex: number\r\n): ResolvedToolbarItem[] => {\r\n if (key === '|') {\r\n return [{ type: 'separator', key: `separator-${separatorIndex}` }];\r\n }\r\n\r\n if (typeof key === 'string') {\r\n const item = menuMap.get(key);\r\n\r\n // 未知 key 直接忽略;需要 payload 但没有 panel 的菜单暂不渲染,避免按钮点击后无法生成合法命令。\r\n if (!item || (item.requiresPayload && !item.payloadPanel) || excludeKeys.has(item.id)) {\r\n return [];\r\n }\r\n\r\n return [{ type: 'button', item }];\r\n }\r\n\r\n if (isToolbarGroupConfig(key)) {\r\n const items = key.menuKeys\r\n .filter((menuKey) => !excludeKeys.has(menuKey))\r\n .map((menuKey) => menuMap.get(menuKey))\r\n .filter((item): item is MenuItem => (\r\n item !== undefined && (!item.requiresPayload || item.payloadPanel !== undefined)\r\n ));\r\n\r\n return items.length > 0 ? [{\r\n type: 'group',\r\n key: key.key,\r\n title: key.title,\r\n icon: key.icon,\r\n items\r\n }] : [];\r\n }\r\n\r\n return [];\r\n};\r\n\r\nconst shouldKeepResolvedToolbarItem = (\r\n item: ResolvedToolbarItem,\r\n items: ResolvedToolbarItem[]\r\n) => {\r\n if (item.type !== 'separator') return true;\r\n\r\n const previousItem = items[items.length - 1];\r\n\r\n return previousItem !== undefined && previousItem.type !== 'separator';\r\n};\r\n\r\nconst trimTrailingToolbarSeparators = (items: ResolvedToolbarItem[]) => {\r\n while (items.at(-1)?.type === 'separator') {\r\n items.pop();\r\n }\r\n\r\n return items;\r\n};\r\n\r\n/**\r\n * 把 wangEditor 风格的 JSON 配置解析成 DOM/RN/Flutter 都能消费的菜单结构。\r\n *\r\n * 未知 key 和缺少 payloadPanel 的 requiresPayload 菜单会被忽略,避免默认 toolbar 渲染无法处理的按钮。\r\n * 分割线会自动去掉开头、结尾和连续项,避免被跳过的菜单留下空分隔。\r\n */\r\nexport const resolveToolbarMenu = (\r\n toolbarConfig: ToolbarConfig = defaultToolbarConfig,\r\n menuSchema: MenuItem[] = defaultMenuSchema\r\n): ResolvedToolbarItem[] => {\r\n const menuMap = createMenuMap(menuSchema);\r\n const baseKeys = toolbarConfig.toolbarKeys ?? defaultToolbarConfig.toolbarKeys ?? [];\r\n const toolbarKeys = applyToolbarConfigOverrides(baseKeys, toolbarConfig);\r\n const excludeKeys = new Set(toolbarConfig.excludeKeys ?? []);\r\n let separatorIndex = 0;\r\n\r\n const resolvedItems = toolbarKeys.reduce<ResolvedToolbarItem[]>((items, key) => {\r\n const nextItems = resolveToolbarKey(key, menuMap, excludeKeys, separatorIndex);\r\n\r\n if (key === '|') separatorIndex += 1;\r\n\r\n nextItems.forEach((item) => {\r\n if (shouldKeepResolvedToolbarItem(item, items)) {\r\n items.push(item);\r\n }\r\n });\r\n\r\n return items;\r\n }, []);\r\n\r\n return trimTrailingToolbarSeparators(resolvedItems);\r\n};\r\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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"}
|
|
1
|
+
{"version":3,"file":"native-spec.js","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';\r\n\r\n/*\r\n * 表格 header 和后续表格浮动菜单共用这组操作入口。\r\n * 这些菜单默认不进入 toolbar 排列,但仍放在 native-spec,保证 DOM/RN/Flutter 自绘读取同一份\r\n * command/label/icon 协议。\r\n */\r\nexport const tableHeaderMenuItems: MenuItem[] = [\r\n {\r\n id: 'table-insert-row-after',\r\n command: { type: 'table.insertRow', direction: 'after' },\r\n label: '插入行',\r\n icon: 'rows-plus'\r\n },\r\n {\r\n id: 'table-delete-row',\r\n command: { type: 'table.deleteRow' },\r\n label: '删除行',\r\n icon: 'rows-minus'\r\n },\r\n {\r\n id: 'table-insert-column-after',\r\n command: { type: 'table.insertColumn', direction: 'after' },\r\n label: '插入列',\r\n icon: 'columns-plus'\r\n },\r\n {\r\n id: 'table-delete-column',\r\n command: { type: 'table.deleteColumn' },\r\n label: '删除列',\r\n icon: 'columns-minus'\r\n },\r\n {\r\n id: 'table-delete',\r\n command: { type: 'table.delete' },\r\n label: '删除表格',\r\n icon: 'table-delete'\r\n }\r\n];\r\n","import type { MenuItem } from './type';\r\nimport {\r\n backgroundColorPanel,\r\n fontFamilyPanel,\r\n fontSizePanel,\r\n lineHeightPanel,\r\n tableInsertPanel,\r\n textColorPanel\r\n} from './payloadPanels';\r\nimport { tableHeaderMenuItems } from './tableHeaderMenuItems';\r\n\r\n/**\r\n * 默认菜单 schema 覆盖 wangEditor 常用入口。\r\n *\r\n * RN/Flutter 基于 id、icon、label 和 command 自绘菜单;显示分组和分割线由 toolbarConfig 决定。\n */\r\nexport const defaultMenuSchema: MenuItem[] = [\r\n {\r\n id: 'bold',\r\n command: { type: 'format.bold' },\r\n label: '加粗',\r\n icon: 'bold'\r\n },\r\n {\r\n id: 'italic',\r\n command: { type: 'format.italic' },\r\n label: '斜体',\r\n icon: 'italic'\r\n },\r\n {\r\n id: 'underline',\r\n command: { type: 'format.underline' },\r\n label: '下划线',\r\n icon: 'underline'\r\n },\r\n {\r\n id: 'strike',\r\n command: { type: 'format.strike' },\r\n label: '删除线',\r\n icon: 'strikethrough'\r\n },\r\n {\r\n id: 'inline-code',\r\n command: { type: 'format.inlineCode' },\r\n label: '行内代码',\r\n icon: 'code'\r\n },\r\n {\r\n id: 'superscript',\r\n command: { type: 'format.superscript' },\r\n label: '上标',\r\n icon: 'superscript'\r\n },\r\n {\r\n id: 'subscript',\r\n command: { type: 'format.subscript' },\r\n label: '下标',\r\n icon: 'subscript'\r\n },\r\n {\r\n id: 'clear-style',\r\n command: { type: 'format.clear' },\r\n label: '清除样式',\r\n icon: 'remove-formatting'\r\n },\r\n {\r\n id: 'color',\r\n command: { type: 'format.color', value: '' },\r\n label: '文字颜色',\r\n icon: 'palette',\r\n requiresPayload: true,\r\n payloadPanel: textColorPanel\r\n },\r\n {\r\n id: 'background-color',\r\n command: { type: 'format.backgroundColor', value: '' },\r\n label: '背景色',\r\n icon: 'paint-bucket',\r\n requiresPayload: true,\r\n payloadPanel: backgroundColorPanel\r\n },\r\n {\r\n id: 'font-size',\r\n command: { type: 'format.fontSize', value: '' },\r\n label: '字号',\r\n icon: 'case-sensitive',\r\n requiresPayload: true,\r\n payloadPanel: fontSizePanel\r\n },\r\n {\r\n id: 'font-family',\r\n command: { type: 'format.fontFamily', value: '' },\r\n label: '字体',\r\n icon: 'type',\r\n requiresPayload: true,\r\n payloadPanel: fontFamilyPanel\r\n },\r\n {\r\n id: 'line-height',\r\n command: { type: 'format.lineHeight', value: '' },\r\n label: '行高',\r\n icon: 'wrap-text',\r\n requiresPayload: true,\r\n payloadPanel: lineHeightPanel\r\n },\r\n {\r\n id: 'paragraph',\r\n command: { type: 'block.paragraph' },\r\n label: '正文',\r\n icon: 'pilcrow'\r\n },\r\n {\r\n id: 'heading-1',\r\n command: { type: 'block.heading', level: 1 },\r\n label: '一级标题',\r\n icon: 'heading-1'\r\n },\r\n {\r\n id: 'heading-2',\r\n command: { type: 'block.heading', level: 2 },\r\n label: '二级标题',\r\n icon: 'heading-2'\r\n },\r\n {\r\n id: 'heading-3',\r\n command: { type: 'block.heading', level: 3 },\r\n label: '三级标题',\r\n icon: 'heading-3'\r\n },\r\n {\r\n id: 'heading-4',\r\n command: { type: 'block.heading', level: 4 },\r\n label: '四级标题',\r\n icon: 'heading-4'\r\n },\r\n {\r\n id: 'heading-5',\r\n command: { type: 'block.heading', level: 5 },\r\n label: '五级标题',\r\n icon: 'heading-5'\r\n },\r\n {\r\n id: 'heading-6',\r\n command: { type: 'block.heading', level: 6 },\r\n label: '六级标题',\r\n icon: 'heading-6'\r\n },\r\n {\r\n id: 'quote',\r\n command: { type: 'block.quote' },\r\n label: '引用',\r\n icon: 'quote'\r\n },\r\n {\r\n id: 'divider',\r\n command: { type: 'block.divider' },\r\n label: '分割线',\r\n icon: 'minus'\r\n },\r\n {\r\n id: 'code-block',\r\n command: { type: 'block.code' },\r\n label: '代码块',\r\n icon: 'square-code'\r\n },\r\n {\r\n id: 'ordered-list',\r\n command: { type: 'list.ordered' },\r\n label: '有序列表',\r\n icon: 'list-ordered'\r\n },\r\n {\r\n id: 'unordered-list',\r\n command: { type: 'list.unordered' },\r\n label: '无序列表',\r\n icon: 'list'\r\n },\r\n {\r\n id: 'todo-list',\r\n command: { type: 'list.todo' },\r\n label: '待办列表',\r\n icon: 'list-todo'\r\n },\r\n {\r\n id: 'align-left',\r\n command: { type: 'align', value: 'left' },\r\n label: '左对齐',\r\n icon: 'align-left'\r\n },\r\n {\r\n id: 'align-center',\r\n command: { type: 'align', value: 'center' },\r\n label: '居中',\r\n icon: 'align-center'\r\n },\r\n {\r\n id: 'align-right',\r\n command: { type: 'align', value: 'right' },\r\n label: '右对齐',\r\n icon: 'align-right'\r\n },\r\n {\r\n id: 'align-justify',\r\n command: { type: 'align', value: 'justify' },\r\n label: '两端对齐',\r\n icon: 'align-justify'\r\n },\r\n {\r\n id: 'indent-increase',\r\n command: { type: 'indent.increase' },\r\n label: '增加缩进',\r\n icon: 'indent-increase'\r\n },\r\n {\r\n id: 'indent-decrease',\r\n command: { type: 'indent.decrease' },\r\n label: '减少缩进',\r\n icon: 'indent-decrease'\r\n },\r\n {\r\n id: 'mention',\r\n command: { type: 'mention.insert', item: { id: '', label: '', value: '' } },\r\n label: '@ 提及',\r\n icon: 'at-sign',\r\n requiresPayload: true\r\n },\r\n {\r\n id: 'upload-image',\r\n command: { type: 'media.pickImage' },\r\n label: '上传图片',\r\n icon: 'upload-image'\r\n },\r\n {\r\n id: 'upload-video',\r\n command: { type: 'media.pickVideo' },\r\n label: '上传视频',\r\n icon: 'upload-video'\r\n },\r\n {\r\n id: 'table',\r\n command: { type: 'table.insert', rows: 3, cols: 3 },\r\n label: '表格',\r\n icon: 'table',\r\n requiresPayload: true,\r\n payloadPanel: tableInsertPanel\r\n },\r\n ...tableHeaderMenuItems,\r\n {\r\n id: 'slash-command',\r\n command: { type: 'slash.open' },\r\n label: '/ 命令',\r\n icon: 'list-plus'\r\n },\r\n {\r\n id: 'undo',\r\n command: { type: 'history.undo' },\r\n label: '撤销',\r\n icon: 'undo'\r\n },\r\n {\r\n id: 'redo',\r\n command: { type: 'history.redo' },\r\n label: '重做',\r\n icon: 'redo'\r\n },\r\n {\r\n id: 'clear',\r\n command: { type: 'content.clear' },\r\n label: '清空',\r\n icon: 'trash-2'\r\n },\r\n {\r\n id: 'fullscreen',\r\n command: { type: 'fullscreen.toggle' },\r\n label: '全屏',\r\n icon: 'maximize'\r\n }\r\n];\r\n","import type { CommandState, EditorCommand } from '@bridgerte/core';\r\nimport type { MenuItem } from '../menuSchema';\r\nimport { defaultMenuSchema } from '../menuSchema';\r\n\r\nconst commandStateValueByType: Partial<Record<EditorCommand['type'], (command: EditorCommand) => (\r\n CommandState['value'] | undefined\r\n)>> = {\r\n align: (command) => command.type === 'align' ? command.value : undefined,\r\n 'block.heading': (command) => command.type === 'block.heading' ? command.level : undefined,\r\n 'block.setCodeLanguage': (command) => (\r\n command.type === 'block.setCodeLanguage' ? command.language : undefined\r\n )\r\n};\r\n\r\n/**\r\n * 取出菜单命令用于匹配 `CommandState.value` 的稳定值。\r\n *\r\n * 同类命令存在多个菜单项时使用这个值区分,比如对齐方式和标题级别。\r\n */\r\nexport const getCommandStateMatchValue = (\r\n command: EditorCommand\r\n): CommandState['value'] | undefined => commandStateValueByType[command.type]?.(command);\r\n\r\n/**\r\n * 判断某条命令状态是否对应一个完整命令 payload。\r\n */\r\nexport const isCommandStateForCommand = (\r\n command: EditorCommand,\r\n state: CommandState\r\n): boolean => {\r\n const matchValue = getCommandStateMatchValue(command);\r\n\r\n return state.command === command.type\r\n && (matchValue === undefined || state.value === matchValue);\r\n};\r\n\r\n/**\r\n * 判断某条命令状态是否对应一个菜单项。\r\n *\r\n * 原生 toolbar 可以用它把 `CommandState[]` 映射回具体按钮 active/disabled 状态。\r\n */\r\nexport const isMenuItemCommandState = (item: MenuItem, state: CommandState): boolean => (\r\n isCommandStateForCommand(item.command, state)\r\n);\r\n\r\n/**\r\n * 为给定菜单生成默认禁用状态。\r\n *\r\n * 编辑器未 ready 或无选区时,原生 toolbar 可以先使用这组状态兜底。\r\n */\r\nexport function createDisabledCommandStates(menuSchema = defaultMenuSchema): CommandState[] {\r\n return menuSchema.map((item) => ({\r\n command: item.command.type,\r\n active: false,\r\n disabled: true,\r\n value: getCommandStateMatchValue(item.command)\r\n }));\r\n}\r\n","import type { ToolbarConfig, ToolbarGroupConfig, ToolbarKey } from '@bridgerte/core';\r\nimport type { MenuItem } from '../menuSchema';\r\nimport { defaultMenuSchema } from '../menuSchema';\r\nimport type { ResolvedToolbarItem } from './type';\r\n\r\nexport type * from './type';\r\n\r\n/**\r\n * 默认 DOM toolbar 配置。\r\n *\r\n * 这里只选择已实现或带参数面板的基础按钮;完整菜单全集仍由 `defaultMenuSchema` 维护。\r\n */\r\nexport const defaultToolbarConfig: ToolbarConfig = {\r\n toolbarKeys: [\r\n 'undo',\r\n 'redo',\r\n 'clear',\r\n '|',\r\n 'paragraph',\r\n 'heading-1',\r\n 'heading-2',\r\n 'heading-3',\r\n 'heading-4',\r\n 'heading-5',\r\n 'heading-6',\r\n 'quote',\r\n 'divider',\r\n 'code-block',\r\n '|',\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'strike',\r\n 'inline-code',\r\n 'superscript',\r\n 'subscript',\r\n 'clear-style',\r\n 'color',\r\n 'background-color',\r\n 'font-size',\r\n 'font-family',\r\n 'line-height',\r\n '|',\r\n 'ordered-list',\n 'unordered-list',\n 'todo-list',\n '|',\n 'upload-image',\n 'upload-video',\n '|',\n 'table',\n '|',\n 'align-left',\r\n 'align-center',\r\n 'align-right',\r\n 'align-justify',\r\n 'indent-increase',\r\n 'indent-decrease',\r\n '|',\r\n 'fullscreen'\r\n ]\r\n};\r\n\r\nconst isToolbarGroupConfig = (key: ToolbarKey): key is ToolbarGroupConfig => (\r\n typeof key === 'object' && Array.isArray(key.menuKeys)\r\n);\r\n\r\nconst createMenuMap = (menuSchema: MenuItem[]) => new Map(\r\n menuSchema.map((item) => [item.id, item])\r\n);\r\n\r\nconst shouldExcludeToolbarKey = (\r\n key: ToolbarKey,\r\n excludeKeys: Set<string>\r\n) => {\r\n if (typeof key === 'string') return key !== '|' && excludeKeys.has(key);\r\n\r\n return excludeKeys.has(key.key) || key.menuKeys.every((menuKey) => excludeKeys.has(menuKey));\r\n};\r\n\r\nconst applyToolbarConfigOverrides = (\r\n baseKeys: ToolbarKey[],\r\n toolbarConfig?: ToolbarConfig\r\n): ToolbarKey[] => {\r\n const excludeKeys = new Set(toolbarConfig?.excludeKeys ?? []);\r\n /*\r\n * 先排除再插入,等价于“在用户最终想保留的默认菜单里加东西”。\r\n * insert index 做夹取,避免业务传入负数或超长下标时破坏默认 toolbar。\r\n */\r\n const filteredKeys = baseKeys.filter((key) => !shouldExcludeToolbarKey(key, excludeKeys));\r\n\r\n if (!toolbarConfig?.insertKeys) return filteredKeys;\r\n\r\n const insertIndex = Math.max(0, Math.min(toolbarConfig.insertKeys.index, filteredKeys.length));\r\n\r\n return [\r\n ...filteredKeys.slice(0, insertIndex),\r\n ...toolbarConfig.insertKeys.keys,\r\n ...filteredKeys.slice(insertIndex)\r\n ];\r\n};\r\n\r\nconst resolveToolbarKey = (\r\n key: ToolbarKey,\r\n menuMap: Map<string, MenuItem>,\r\n excludeKeys: Set<string>,\r\n separatorIndex: number\r\n): ResolvedToolbarItem[] => {\r\n if (key === '|') {\r\n return [{ type: 'separator', key: `separator-${separatorIndex}` }];\r\n }\r\n\r\n if (typeof key === 'string') {\r\n const item = menuMap.get(key);\r\n\r\n // 未知 key 直接忽略;需要 payload 但没有 panel 的菜单暂不渲染,避免按钮点击后无法生成合法命令。\r\n if (!item || (item.requiresPayload && !item.payloadPanel) || excludeKeys.has(item.id)) {\r\n return [];\r\n }\r\n\r\n return [{ type: 'button', item }];\r\n }\r\n\r\n if (isToolbarGroupConfig(key)) {\r\n const items = key.menuKeys\r\n .filter((menuKey) => !excludeKeys.has(menuKey))\r\n .map((menuKey) => menuMap.get(menuKey))\r\n .filter((item): item is MenuItem => (\r\n item !== undefined && (!item.requiresPayload || item.payloadPanel !== undefined)\r\n ));\r\n\r\n return items.length > 0 ? [{\r\n type: 'group',\r\n key: key.key,\r\n title: key.title,\r\n icon: key.icon,\r\n items\r\n }] : [];\r\n }\r\n\r\n return [];\r\n};\r\n\r\nconst shouldKeepResolvedToolbarItem = (\r\n item: ResolvedToolbarItem,\r\n items: ResolvedToolbarItem[]\r\n) => {\r\n if (item.type !== 'separator') return true;\r\n\r\n const previousItem = items[items.length - 1];\r\n\r\n return previousItem !== undefined && previousItem.type !== 'separator';\r\n};\r\n\r\nconst trimTrailingToolbarSeparators = (items: ResolvedToolbarItem[]) => {\r\n while (items.at(-1)?.type === 'separator') {\r\n items.pop();\r\n }\r\n\r\n return items;\r\n};\r\n\r\n/**\r\n * 把 wangEditor 风格的 JSON 配置解析成 DOM/RN/Flutter 都能消费的菜单结构。\r\n *\r\n * 未知 key 和缺少 payloadPanel 的 requiresPayload 菜单会被忽略,避免默认 toolbar 渲染无法处理的按钮。\r\n * 分割线会自动去掉开头、结尾和连续项,避免被跳过的菜单留下空分隔。\r\n */\r\nexport const resolveToolbarMenu = (\r\n toolbarConfig: ToolbarConfig = defaultToolbarConfig,\r\n menuSchema: MenuItem[] = defaultMenuSchema\r\n): ResolvedToolbarItem[] => {\r\n const menuMap = createMenuMap(menuSchema);\r\n const baseKeys = toolbarConfig.toolbarKeys ?? defaultToolbarConfig.toolbarKeys ?? [];\r\n const toolbarKeys = applyToolbarConfigOverrides(baseKeys, toolbarConfig);\r\n const excludeKeys = new Set(toolbarConfig.excludeKeys ?? []);\r\n let separatorIndex = 0;\r\n\r\n const resolvedItems = toolbarKeys.reduce<ResolvedToolbarItem[]>((items, key) => {\r\n const nextItems = resolveToolbarKey(key, menuMap, excludeKeys, separatorIndex);\r\n\r\n if (key === '|') separatorIndex += 1;\r\n\r\n nextItems.forEach((item) => {\r\n if (shouldKeepResolvedToolbarItem(item, items)) {\r\n items.push(item);\r\n }\r\n });\r\n\r\n return items;\r\n }, []);\r\n\r\n return trimTrailingToolbarSeparators(resolvedItems);\r\n};\r\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":";AAYO,MAAMA,IAA6C;AAAA,EACxD,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,QAAQ;AAAA,IACN;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc;AAAA,MACd,SAAS;AAAA,QACP,EAAE,OAAO,OAAO,OAAO,GAAA;AAAA,QACvB,EAAE,OAAO,QAAQ,OAAO,cAAA;AAAA,QACxB,EAAE,OAAO,KAAK,OAAO,IAAA;AAAA,QACrB,EAAE,OAAO,OAAO,OAAO,MAAA;AAAA,QACvB,EAAE,OAAO,MAAM,OAAO,SAAA;AAAA,QACtB,EAAE,OAAO,OAAO,OAAO,MAAA;AAAA,QACvB,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,QACxB,EAAE,OAAO,cAAc,OAAO,SAAA;AAAA,QAC9B,EAAE,OAAO,MAAM,OAAO,KAAA;AAAA,QACtB,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,QACxB,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,QACxB,EAAE,OAAO,cAAc,OAAO,aAAA;AAAA,QAC9B,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,QACxB,EAAE,OAAO,UAAU,OAAO,SAAA;AAAA,QAC1B,EAAE,OAAO,YAAY,OAAO,WAAA;AAAA,QAC5B,EAAE,OAAO,OAAO,OAAO,MAAA;AAAA,QACvB,EAAE,OAAO,UAAU,OAAO,SAAA;AAAA,QAC1B,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,QACxB,EAAE,OAAO,OAAO,OAAO,MAAA;AAAA,QACvB,EAAE,OAAO,SAAS,OAAO,QAAA;AAAA,QACzB,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,QACxB,EAAE,OAAO,OAAO,OAAO,MAAA;AAAA,QACvB,EAAE,OAAO,cAAc,OAAO,aAAA;AAAA,QAC9B,EAAE,OAAO,OAAO,OAAO,MAAA;AAAA,QACvB,EAAE,OAAO,OAAO,OAAO,MAAA;AAAA,QACvB,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,MAAO;AAAA,IACjC;AAAA,EACF;AAEJ,GAOaC,IAAgCD,GAOhCE,IAAqC;AAAA,EAChD,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,QAAQ;AAAA,IACN;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,IAAA;AAAA,EACT;AAEJ,GAEaC,IAA2C;AAAA,EACtD,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,QAAQ;AAAA,IACN;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,IAAA;AAAA,EACT;AAEJ,GAEaC,IAAoC;AAAA,EAC/C,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,QAAQ;AAAA,IACN;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc;AAAA,MACd,SAAS;AAAA,QACP,EAAE,OAAO,WAAW,OAAO,OAAA;AAAA,QAC3B,EAAE,OAAO,WAAW,OAAO,OAAA;AAAA,QAC3B,EAAE,OAAO,WAAW,OAAO,OAAA;AAAA,QAC3B,EAAE,OAAO,WAAW,OAAO,OAAA;AAAA,QAC3B,EAAE,OAAO,YAAY,OAAO,OAAA;AAAA,MAAO;AAAA,IACrC;AAAA,EACF;AAEJ,GAEaC,IAAsC;AAAA,EACjD,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,QAAQ;AAAA,IACN;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc;AAAA,MACd,SAAS;AAAA,QACP,EAAE,OAAO,QAAQ,OAAO,GAAA;AAAA,QACxB,EAAE,OAAO,OAAO,OAAO,aAAA;AAAA,QACvB,EAAE,OAAO,MAAM,OAAO,QAAA;AAAA,QACtB,EAAE,OAAO,MAAM,OAAO,YAAA;AAAA,MAAY;AAAA,IACpC;AAAA,EACF;AAEJ,GAEaC,IAAsC;AAAA,EACjD,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,QAAQ;AAAA,IACN;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc;AAAA,MACd,SAAS;AAAA,QACP,EAAE,OAAO,UAAU,OAAO,MAAA;AAAA,QAC1B,EAAE,OAAO,UAAU,OAAO,MAAA;AAAA,QAC1B,EAAE,OAAO,QAAQ,OAAO,IAAA;AAAA,MAAI;AAAA,IAC9B;AAAA,EACF;AAEJ,GAQaC,IAAuC;AAAA,EAClD,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,QAAQ;AAAA,IACN;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc;AAAA,MACd,KAAK;AAAA,MACL,KAAKC;AAAA,MACL,MAAM;AAAA,IAAA;AAAA,IAER;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc;AAAA,MACd,KAAK;AAAA,MACL,KAAKC;AAAA,MACL,MAAM;AAAA,IAAA;AAAA,EACR;AAEJ,GCxKaC,IAAmC;AAAA,EAC9C;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,mBAAmB,WAAW,QAAA;AAAA,IAC/C,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,kBAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,sBAAsB,WAAW,QAAA;AAAA,IAClD,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,qBAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,eAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAEV,GCtBaC,IAAgC;AAAA,EAC3C;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,cAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,gBAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,mBAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,gBAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,oBAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,qBAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,mBAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,eAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,gBAAgB,OAAO,GAAA;AAAA,IACxC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,cAAcT;AAAA,EAAA;AAAA,EAEhB;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,0BAA0B,OAAO,GAAA;AAAA,IAClD,OAAO;AAAA,IACP,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,cAAcC;AAAA,EAAA;AAAA,EAEhB;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,mBAAmB,OAAO,GAAA;AAAA,IAC3C,OAAO;AAAA,IACP,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,cAAcC;AAAA,EAAA;AAAA,EAEhB;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,qBAAqB,OAAO,GAAA;AAAA,IAC7C,OAAO;AAAA,IACP,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,cAAcC;AAAA,EAAA;AAAA,EAEhB;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,qBAAqB,OAAO,GAAA;AAAA,IAC7C,OAAO;AAAA,IACP,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,cAAcC;AAAA,EAAA;AAAA,EAEhB;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,kBAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,iBAAiB,OAAO,EAAA;AAAA,IACzC,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,iBAAiB,OAAO,EAAA;AAAA,IACzC,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,iBAAiB,OAAO,EAAA;AAAA,IACzC,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,iBAAiB,OAAO,EAAA;AAAA,IACzC,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,iBAAiB,OAAO,EAAA;AAAA,IACzC,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,iBAAiB,OAAO,EAAA;AAAA,IACzC,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,cAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,gBAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,aAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,eAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,iBAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,YAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,SAAS,OAAO,OAAA;AAAA,IACjC,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,SAAS,OAAO,SAAA;AAAA,IACjC,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,SAAS,OAAO,QAAA;AAAA,IACjC,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,SAAS,OAAO,UAAA;AAAA,IACjC,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,kBAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,kBAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,kBAAkB,MAAM,EAAE,IAAI,IAAI,OAAO,IAAI,OAAO,GAAA,EAAG;AAAA,IACxE,OAAO;AAAA,IACP,MAAM;AAAA,IACN,iBAAiB;AAAA,EAAA;AAAA,EAEnB;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,kBAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,kBAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,gBAAgB,MAAM,GAAG,MAAM,EAAA;AAAA,IAChD,OAAO;AAAA,IACP,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,cAAcC;AAAA,EAAA;AAAA,EAEhB,GAAGG;AAAA,EACH;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,aAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,eAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,eAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,gBAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,IAAI;AAAA,IACJ,SAAS,EAAE,MAAM,oBAAA;AAAA,IACjB,OAAO;AAAA,IACP,MAAM;AAAA,EAAA;AAEV,GCjRME,IAEA;AAAA,EACJ,OAAO,CAACC,MAAYA,EAAQ,SAAS,UAAUA,EAAQ,QAAQ;AAAA,EAC/D,iBAAiB,CAACA,MAAYA,EAAQ,SAAS,kBAAkBA,EAAQ,QAAQ;AAAA,EACjF,yBAAyB,CAACA,MACxBA,EAAQ,SAAS,0BAA0BA,EAAQ,WAAW;AAElE,GAOaC,IAA4B,CACvCD,MAAA;;AACsC,UAAAE,IAAAH,EAAwBC,EAAQ,UAAhC,gBAAAE,EAAA,KAAAH,GAAwCC;AAAA,GAKnEG,IAA2B,CACtCH,GACAI,MACY;AACZ,QAAMC,IAAaJ,EAA0BD,CAAO;AAEpD,SAAOI,EAAM,YAAYJ,EAAQ,SAC3BK,MAAe,UAAaD,EAAM,UAAUC;AACpD,GAOaC,IAAyB,CAACC,GAAgBH,MACrDD,EAAyBI,EAAK,SAASH,CAAK;AAQvC,SAASI,EAA4BC,IAAaX,GAAmC;AAC1F,SAAOW,EAAW,IAAI,CAACF,OAAU;AAAA,IAC/B,SAASA,EAAK,QAAQ;AAAA,IACtB,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAON,EAA0BM,EAAK,OAAO;AAAA,EAAA,EAC7C;AACJ;AC7CO,MAAMG,IAAsC;AAAA,EACjD,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ,GAEMC,IAAuB,CAACC,MAC5B,OAAOA,KAAQ,YAAY,MAAM,QAAQA,EAAI,QAAQ,GAGjDC,IAAgB,CAACJ,MAA2B,IAAI;AAAA,EACpDA,EAAW,IAAI,CAACF,MAAS,CAACA,EAAK,IAAIA,CAAI,CAAC;AAC1C,GAEMO,IAA0B,CAC9BF,GACAG,MAEI,OAAOH,KAAQ,WAAiBA,MAAQ,OAAOG,EAAY,IAAIH,CAAG,IAE/DG,EAAY,IAAIH,EAAI,GAAG,KAAKA,EAAI,SAAS,MAAM,CAACI,MAAYD,EAAY,IAAIC,CAAO,CAAC,GAGvFC,IAA8B,CAClCC,GACAC,MACiB;AACjB,QAAMJ,IAAc,IAAI,KAAII,KAAA,gBAAAA,EAAe,gBAAe,CAAA,CAAE,GAKtDC,IAAeF,EAAS,OAAO,CAACN,MAAQ,CAACE,EAAwBF,GAAKG,CAAW,CAAC;AAExF,MAAI,EAACI,KAAA,QAAAA,EAAe,YAAY,QAAOC;AAEvC,QAAMC,IAAc,KAAK,IAAI,GAAG,KAAK,IAAIF,EAAc,WAAW,OAAOC,EAAa,MAAM,CAAC;AAE7F,SAAO;AAAA,IACL,GAAGA,EAAa,MAAM,GAAGC,CAAW;AAAA,IACpC,GAAGF,EAAc,WAAW;AAAA,IAC5B,GAAGC,EAAa,MAAMC,CAAW;AAAA,EAAA;AAErC,GAEMC,IAAoB,CACxBV,GACAW,GACAR,GACAS,MAC0B;AAC1B,MAAIZ,MAAQ;AACV,WAAO,CAAC,EAAE,MAAM,aAAa,KAAK,aAAaY,CAAc,IAAI;AAGnE,MAAI,OAAOZ,KAAQ,UAAU;AAC3B,UAAML,IAAOgB,EAAQ,IAAIX,CAAG;AAG5B,WAAI,CAACL,KAASA,EAAK,mBAAmB,CAACA,EAAK,gBAAiBQ,EAAY,IAAIR,EAAK,EAAE,IAC3E,CAAA,IAGF,CAAC,EAAE,MAAM,UAAU,MAAAA,GAAM;AAAA,EAClC;AAEA,MAAII,EAAqBC,CAAG,GAAG;AAC7B,UAAMa,IAAQb,EAAI,SACf,OAAO,CAACI,MAAY,CAACD,EAAY,IAAIC,CAAO,CAAC,EAC7C,IAAI,CAACA,MAAYO,EAAQ,IAAIP,CAAO,CAAC,EACrC,OAAO,CAACT,MACPA,MAAS,WAAc,CAACA,EAAK,mBAAmBA,EAAK,iBAAiB,OACvE;AAEH,WAAOkB,EAAM,SAAS,IAAI,CAAC;AAAA,MACzB,MAAM;AAAA,MACN,KAAKb,EAAI;AAAA,MACT,OAAOA,EAAI;AAAA,MACX,MAAMA,EAAI;AAAA,MACV,OAAAa;AAAA,IAAA,CACD,IAAI,CAAA;AAAA,EACP;AAEA,SAAO,CAAA;AACT,GAEMC,IAAgC,CACpCnB,GACAkB,MACG;AACH,MAAIlB,EAAK,SAAS,YAAa,QAAO;AAEtC,QAAMoB,IAAeF,EAAMA,EAAM,SAAS,CAAC;AAE3C,SAAOE,MAAiB,UAAaA,EAAa,SAAS;AAC7D,GAEMC,IAAgC,CAACH,MAAiC;;AACtE,WAAOvB,IAAAuB,EAAM,GAAG,EAAE,MAAX,gBAAAvB,EAAc,UAAS;AAC5B,IAAAuB,EAAM,IAAA;AAGR,SAAOA;AACT,GAQaI,IAAqB,CAChCV,IAA+BT,GAC/BD,IAAyBX,MACC;AAC1B,QAAMyB,IAAUV,EAAcJ,CAAU,GAClCS,IAAWC,EAAc,eAAeT,EAAqB,eAAe,CAAA,GAC5EoB,IAAcb,EAA4BC,GAAUC,CAAa,GACjEJ,IAAc,IAAI,IAAII,EAAc,eAAe,CAAA,CAAE;AAC3D,MAAIK,IAAiB;AAErB,QAAMO,IAAgBD,EAAY,OAA8B,CAACL,GAAOb,MAAQ;AAC9E,UAAMoB,IAAYV,EAAkBV,GAAKW,GAASR,GAAaS,CAAc;AAE7E,WAAIZ,MAAQ,QAAKY,KAAkB,IAEnCQ,EAAU,QAAQ,CAACzB,MAAS;AAC1B,MAAImB,EAA8BnB,GAAMkB,CAAK,KAC3CA,EAAM,KAAKlB,CAAI;AAAA,IAEnB,CAAC,GAEMkB;AAAA,EACT,GAAG,CAAA,CAAE;AAEL,SAAOG,EAA8BG,CAAa;AACpD;"}
|
package/dist/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
:root,.bridgerte{--bridgerte-color-primary:#1677ff;--bridgerte-color-text:#1f2329;--bridgerte-color-text-muted:#86909c;--bridgerte-color-bg:#fff;--bridgerte-color-panel:#fff;--bridgerte-color-border:#e5e6eb;--bridgerte-color-active-bg:#e8f3ff;--bridgerte-color-code-bg:#f3f4f6;--bridgerte-color-placeholder:#b7bcc5;--bridgerte-color-disabled:#c9cdd4;--bridgerte-color-danger:#f53f3f;--bridgerte-shadow-panel:0 12px 32px #0f172a24;--bridgerte-shadow-popup:0 10px 24px #0f172a1a;--bridgerte-font-size:15px;--bridgerte-line-height:1.7;--bridgerte-radius:8px;--bridgerte-radius-large:12px;--bridgerte-toolbar-height:42px;--bridgerte-control-height:32px;--bridgerte-control-height-small:28px;--bridgerte-touch-target-size:32px;--bridgerte-hoverbar-button-size:28px;--bridgerte-safe-area-bottom:env(safe-area-inset-bottom,0px);--bridgerte-editor-padding:12px;--bridgerte-z-index-toolbar:20;--bridgerte-code-font-family:"JetBrains Mono", Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace;--bridgerte-code-block-control-height:32px;--bridgerte-code-token-text:#000;--bridgerte-code-token-comment:#708090;--bridgerte-code-token-keyword:#a626a4;--bridgerte-code-token-operator:#0184bc;--bridgerte-code-token-function:#4078f2;--bridgerte-code-token-string:#50a14f;--bridgerte-code-token-number:#986801;--bridgerte-code-token-class:#4078f2;--bridgerte-code-token-builtin:#50a14f;--bridgerte-code-token-property:#e45649;--bridgerte-code-token-variable:#e90;--bridgerte-code-token-tag:#c18401;--bridgerte-code-token-punctuation:#999;--bridgerte-code-token-regex:#e90;--bridgerte-code-token-inserted:#690;--bridgerte-code-token-deleted:#905;--bridgerte-media-controls-button-height:28px;--bridgerte-table-controls-button-height:28px;--bridgerte-payload-panel-color-wheel-size:136px;--bridgerte-payload-panel-color-handle-size:14px;--bridgerte-payload-panel-color-swatch-width:22px;--bridgerte-payload-panel-color-swatch-height:40px;--bridgerte-payload-panel-table-cell-size:16px;--bridgerte-payload-panel-title-height:28px;--bridgerte-payload-panel-option-height:28px;--bridgerte-payload-panel-field-height:32px;--bridgerte-todo-marker-hit-size:32px;--bridgerte-todo-marker-size:16px}.bridgerte{width:100%;height:100%;min-height:0;color:var(--bridgerte-color-text);background:var(--bridgerte-color-bg);font-family:inherit;font-size:var(--bridgerte-font-size);line-height:var(--bridgerte-line-height);overflow-wrap:anywhere;outline:none;transition:background-color .16s,color .16s;position:relative}.bridgerte[data-readonly=true]{color:var(--bridgerte-color-text-muted);background:var(--bridgerte-color-panel);cursor:default}.bridgerte__editor{flex-direction:column;width:100%;height:100%;min-height:0;display:flex}.bridgerte__body{flex-direction:column;flex:1;min-height:0;display:flex}.bridgerte__content{min-height:0;padding:var(--bridgerte-editor-padding);-webkit-tap-highlight-color:transparent;outline:none;flex:1;position:relative;overflow-y:auto}.bridgerte__content[data-placeholder][data-empty=true]:before{top:var(--bridgerte-editor-padding);left:var(--bridgerte-editor-padding);color:var(--bridgerte-color-text-muted);content:attr(data-placeholder);pointer-events:none;position:absolute}.bridgerte__content[data-empty=true] .bridgerte__paragraph:first-child{margin-top:0}.bridgerte__paragraph{margin:0 0 .75em}.bridgerte__heading{color:var(--bridgerte-color-text);margin:1em 0 .55em;font-weight:700;line-height:1.25}.bridgerte__heading--h1{font-size:32px}.bridgerte__heading--h2{font-size:28px}.bridgerte__heading--h3{font-size:24px}.bridgerte__heading--h4{font-size:21px}.bridgerte__heading--h5{font-size:18px}.bridgerte__heading--h6{font-size:16px}.bridgerte__list{margin:0 0 .75em;padding-left:1.5em}.bridgerte__list-item{margin:.25em 0}.bridgerte__quote{border-left:3px solid var(--bridgerte-color-primary);border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-text);background:var(--bridgerte-color-code-bg);margin:.85em 0;padding:.45em .85em}.bridgerte__quote>:last-child{margin-bottom:0}.bridgerte__divider{background:var(--bridgerte-color-border);border:0;height:1px;margin:1em 0}.bridgerte__link{color:var(--bridgerte-color-primary);text-underline-offset:.18em;text-decoration:underline}.bridgerte__text--bold{font-weight:700}.bridgerte__text--italic{font-style:italic}.bridgerte__text--underline{text-underline-offset:.18em;text-decoration-line:underline}.bridgerte__text--strike{text-decoration-line:line-through}.bridgerte__text--underline-strike,.bridgerte__text--underline.bridgerte__text--strike{text-underline-offset:.18em;text-decoration-line:underline line-through}.bridgerte__list--todo{padding-left:0;list-style:none}.bridgerte__list-item--checked,.bridgerte__list-item--unchecked{outline:none;margin-left:.15em;padding-left:2em;list-style:none;position:relative}.bridgerte__list-item--checked:before,.bridgerte__list-item--unchecked:before{top:calc(var(--bridgerte-line-height) * .5em);width:var(--bridgerte-todo-marker-hit-size);height:var(--bridgerte-todo-marker-hit-size);box-sizing:border-box;content:"";border-radius:999px;position:absolute;left:0;transform:translateY(-50%)}.bridgerte__list-item--checked:after,.bridgerte__list-item--unchecked:after{top:calc(var(--bridgerte-line-height) * .5em);width:var(--bridgerte-todo-marker-size);height:var(--bridgerte-todo-marker-size);box-sizing:border-box;border:1px solid var(--bridgerte-color-border);content:"";pointer-events:none;border-radius:999px;position:absolute;left:0;transform:translateY(-50%)}.bridgerte__list-item--checked:focus-visible:after,.bridgerte__list-item--unchecked:focus-visible:after{border-color:var(--bridgerte-color-primary);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg)}.bridgerte__list-item--checked{color:var(--bridgerte-color-text-muted);text-decoration:line-through}.bridgerte__list-item--checked:after{border-color:var(--bridgerte-color-primary);background:radial-gradient(circle at center,var(--bridgerte-color-bg) 0 4px,transparent 4.5px),var(--bridgerte-color-primary)}.bridgerte__code{border-radius:var(--bridgerte-radius);color:var(--bridgerte-color-text);background:var(--bridgerte-color-code-bg);font-family:var(--bridgerte-code-font-family);padding:.12em .3em;font-size:.92em}.bridgerte__code-block{border:1px solid var(--bridgerte-color-border);border-radius:var(--bridgerte-radius-large);color:var(--bridgerte-code-token-text);background:var(--bridgerte-color-code-bg);font-family:var(--bridgerte-code-font-family);line-height:var(--bridgerte-line-height);white-space:pre;margin:12px 0;padding:44px 12px 12px;display:block;overflow:auto}.bridgerte__code-token{color:var(--bridgerte-code-token-text)}.bridgerte__code-token--comment{color:var(--bridgerte-code-token-comment);font-style:italic}.bridgerte__code-token--keyword{color:var(--bridgerte-code-token-keyword)}.bridgerte__code-token--operator{color:var(--bridgerte-code-token-operator)}.bridgerte__code-token--function{color:var(--bridgerte-code-token-function)}.bridgerte__code-token--string,.bridgerte__code-token--attr-value{color:var(--bridgerte-code-token-string)}.bridgerte__code-token--number,.bridgerte__code-token--boolean,.bridgerte__code-token--constant{color:var(--bridgerte-code-token-number)}.bridgerte__code-token--class-name{color:var(--bridgerte-code-token-class)}.bridgerte__code-token--builtin{color:var(--bridgerte-code-token-builtin)}.bridgerte__code-token--property,.bridgerte__code-token--attr,.bridgerte__code-token--attr-name{color:var(--bridgerte-code-token-property)}.bridgerte__code-token--variable{color:var(--bridgerte-code-token-variable)}.bridgerte__code-token--tag,.bridgerte__code-token--selector,.bridgerte__code-token--namespace{color:var(--bridgerte-code-token-tag)}.bridgerte__code-token--punctuation,.bridgerte__code-token--prefix,.bridgerte__code-token--unchanged{color:var(--bridgerte-code-token-punctuation)}.bridgerte__code-token--regex,.bridgerte__code-token--url{color:var(--bridgerte-code-token-regex)}.bridgerte__code-token--inserted{color:var(--bridgerte-code-token-inserted)}.bridgerte__code-token--deleted{color:var(--bridgerte-code-token-deleted)}.bridgerte__code-block-controls-layer{z-index:calc(var(--bridgerte-z-index-toolbar) - 1);pointer-events:none;position:absolute;top:0;right:0;bottom:0;left:0}.bridgerte__code-block-control{width:max-content;min-height:var(--bridgerte-code-block-control-height);border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-placeholder);font:inherit;cursor:pointer;pointer-events:auto;touch-action:manipulation;-webkit-tap-highlight-color:transparent;background:0 0;border:0;align-items:center;gap:8px;padding:0 8px;font-size:13px;display:flex;position:absolute;top:0;left:0}.bridgerte__code-block-control:focus-visible{color:var(--bridgerte-color-text-muted);background:var(--bridgerte-color-panel);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg);outline:none}.bridgerte__code-block-control-arrow{border-top:5px solid var(--bridgerte-color-text-muted);border-left:5px solid #0000;border-right:5px solid #0000;flex:none;width:0;height:0}.bridgerte__code-block-control-label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.bridgerte__media{width:var(--bridgerte-media-display-width,50%);border:1px solid var(--bridgerte-color-border);border-radius:var(--bridgerte-radius-large);background:var(--bridgerte-color-panel);max-width:100%;margin:12px 0;display:block;overflow:hidden}.bridgerte__media-placeholder{min-height:160px;aspect-ratio:var(--bridgerte-media-aspect-ratio,16 / 9);color:var(--bridgerte-color-text-muted);background:var(--bridgerte-color-code-bg);justify-content:center;align-items:center;gap:8px;font-size:13px;display:flex}.bridgerte__media-placeholder-icon{border:1px solid var(--bridgerte-color-border);border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-text-muted);background:var(--bridgerte-color-bg);padding:2px 6px;font-size:11px;line-height:1.4}.bridgerte__media[data-load-state=loaded] .bridgerte__media-placeholder{display:none}.bridgerte__media[data-load-state=error] .bridgerte__media-placeholder{color:var(--bridgerte-color-danger)}.bridgerte__media[data-align=center]{margin-left:auto;margin-right:auto}.bridgerte__media[data-align=right]{margin-left:auto;margin-right:0}.bridgerte__media-element{width:100%;max-width:100%;height:auto;display:block}.bridgerte__media[data-load-state=loading] .bridgerte__media-element,.bridgerte__media[data-load-state=error] .bridgerte__media-element{opacity:0;width:1px;height:1px}.bridgerte__media[data-load-state=loaded] .bridgerte__media-element,.bridgerte__media:not([data-load-state]) .bridgerte__media-element{opacity:1}.bridgerte__media-status{border-top:1px solid var(--bridgerte-color-border);color:var(--bridgerte-color-text-muted);background:var(--bridgerte-color-bg);padding:8px 10px;font-size:13px}.bridgerte__media[data-status=error] .bridgerte__media-status{color:var(--bridgerte-color-danger)}.bridgerte__media-controls-layer{z-index:calc(var(--bridgerte-z-index-toolbar) - 1);pointer-events:none;position:absolute;top:0;right:0;bottom:0;left:0}.bridgerte__media-controls{border:1px solid var(--bridgerte-color-border);border-radius:var(--bridgerte-radius);color:var(--bridgerte-color-text);background:var(--bridgerte-color-panel);box-shadow:var(--bridgerte-shadow-popup);pointer-events:auto;touch-action:manipulation;-webkit-tap-highlight-color:transparent;align-items:center;gap:2px;padding:3px;display:inline-flex;position:absolute;top:0;left:0}.bridgerte__media-controls-button{min-height:var(--bridgerte-media-controls-button-height);border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-text);font:inherit;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;background:0 0;border:0;align-items:center;padding:0 8px;font-size:12px;line-height:1;display:inline-flex}.bridgerte__media-controls-button:focus-visible{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg);outline:none}.bridgerte__media-controls-button[data-active=true]{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte[data-readonly=true] .bridgerte__media-controls-button{color:var(--bridgerte-color-disabled);cursor:not-allowed}.bridgerte__table-wrapper{box-sizing:border-box;border:1px solid var(--bridgerte-color-border);border-radius:var(--bridgerte-radius-large);background:var(--bridgerte-color-panel);scrollbar-width:thin;margin:12px 0;position:relative;overflow-x:auto}.bridgerte__table{border-collapse:separate;border-spacing:0;width:max-content;min-width:100%;color:var(--bridgerte-color-text);background:var(--bridgerte-color-bg)}.bridgerte__table-cell{border:0;border-top:1px solid var(--bridgerte-color-border);border-left:1px solid var(--bridgerte-color-border);vertical-align:top;padding:8px}.bridgerte__table-cell:first-child{border-left:0}.bridgerte__table-row:first-of-type .bridgerte__table-cell{border-top:0}.bridgerte__table-cell--header{background:var(--bridgerte-color-code-bg);font-weight:700}.bridgerte__table-controls-layer{z-index:calc(var(--bridgerte-z-index-toolbar) - 1);pointer-events:none;position:absolute;top:0;right:0;bottom:0;left:0}.bridgerte__table-controls{border:1px solid var(--bridgerte-color-border);border-radius:var(--bridgerte-radius);color:var(--bridgerte-color-text);background:var(--bridgerte-color-panel);box-shadow:var(--bridgerte-shadow-popup);pointer-events:auto;scrollbar-width:none;touch-action:pan-x;-webkit-tap-highlight-color:transparent;align-items:center;gap:2px;padding:4px;display:inline-flex;position:absolute;top:0;left:0;overflow-x:auto}.bridgerte__table-controls::-webkit-scrollbar{display:none}.bridgerte__table-controls-button{min-height:var(--bridgerte-table-controls-button-height);border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-text);font:inherit;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;background:0 0;border:0;flex:none;align-items:center;padding:0 8px;font-size:12px;line-height:1;display:inline-flex}.bridgerte__table-controls-button:focus-visible{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg);outline:none}.bridgerte[data-readonly=true] .bridgerte__table-controls-button{color:var(--bridgerte-color-disabled);cursor:not-allowed}.bridgerte__toolbar{z-index:var(--bridgerte-z-index-toolbar);min-height:var(--bridgerte-toolbar-height);border-bottom:1px solid var(--bridgerte-color-border);padding:5px calc(var(--bridgerte-editor-padding) - 2px);color:var(--bridgerte-color-text);background:var(--bridgerte-color-panel);cursor:grab;overscroll-behavior-x:contain;scrollbar-width:none;touch-action:pan-x;-webkit-tap-highlight-color:transparent;flex-wrap:nowrap;align-items:center;gap:4px;display:flex;position:sticky;top:0;overflow:auto hidden}.bridgerte__toolbar::-webkit-scrollbar{display:none}.bridgerte__toolbar[data-placement=bottom]{min-height:calc(var(--bridgerte-toolbar-height) + var(--bridgerte-safe-area-bottom));border-top:1px solid var(--bridgerte-color-border);padding-top:5px;padding-bottom:calc(5px + var(--bridgerte-safe-area-bottom));border-bottom:0;top:auto;bottom:0}.bridgerte__toolbar[data-dragging=true]{cursor:grabbing;-webkit-user-select:none;user-select:none}.bridgerte__toolbar-group{flex:none;align-items:center;gap:2px;display:inline-flex}.bridgerte__toolbar-separator{background:var(--bridgerte-color-border);flex:none;width:1px;height:22px;margin:0 6px}.bridgerte__toolbar-button{border-radius:calc(var(--bridgerte-radius) - 2px);min-width:30px;height:30px;color:var(--bridgerte-color-text);cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;background:0 0;border:1px solid #0000;justify-content:center;align-items:center;padding:0 7px;font-family:inherit;font-size:13px;font-weight:600;line-height:1;transition:border-color .12s,background-color .12s,color .12s;display:inline-flex;position:relative}.bridgerte__toolbar-button:focus-visible{border-color:var(--bridgerte-color-primary);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg);outline:none}.bridgerte__toolbar-button[aria-pressed=true],.bridgerte__toolbar-button[data-active=true]{border-color:var(--bridgerte-color-active-bg);color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__toolbar-button:disabled,.bridgerte__toolbar-button[aria-disabled=true]{color:var(--bridgerte-color-disabled);cursor:not-allowed;background:0 0}.bridgerte__toolbar-button>svg,.bridgerte__toolbar-group-indicator>svg{flex:none;display:block}.bridgerte__toolbar-group-button{gap:4px}.bridgerte__toolbar-group-button[data-open=true]{border-color:var(--bridgerte-color-primary);color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__toolbar-group-indicator{justify-content:center;align-items:center;width:12px;height:12px;font-size:11px;line-height:1;display:inline-flex}.bridgerte__toolbar-group-menu{opacity:0;pointer-events:none;gap:2px;min-width:128px;max-height:min(320px,100vh - 24px);padding:4px;transition:opacity .12s,transform .12s;display:grid;position:fixed;overflow:hidden auto;transform:translateY(-2px)}.bridgerte__toolbar-group-menu[data-visible=true]{opacity:1;pointer-events:auto;transform:translateY(0)}.bridgerte__menu-item.bridgerte__toolbar-group-menu-item{border-radius:calc(var(--bridgerte-radius) - 2px);gap:6px;min-height:30px;padding:0 7px;font-size:13px;font-weight:500;line-height:1.15}.bridgerte__toolbar-group-menu-item>svg,.bridgerte__toolbar-group-menu-item>.bridgerte__menu-icon-text{flex:none;width:16px;height:16px}.bridgerte__toolbar-group-menu-label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.bridgerte__toolbar-tooltip{z-index:calc(var(--bridgerte-z-index-toolbar) + 2);opacity:0;border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-bg);background:var(--bridgerte-color-text);box-shadow:var(--bridgerte-shadow-panel);pointer-events:none;white-space:nowrap;padding:5px 7px;font-size:12px;font-weight:500;line-height:1;transition:opacity .12s,transform .12s;position:fixed;transform:translate(-50%,-100%)translateY(2px)}.bridgerte__toolbar-tooltip[data-visible=true]{opacity:1;transform:translate(-50%,-100%)translateY(0)}.bridgerte__panel,.bridgerte__floating-menu{border:1px solid var(--bridgerte-color-border);border-radius:var(--bridgerte-radius);color:var(--bridgerte-color-text);background:var(--bridgerte-color-panel);box-shadow:var(--bridgerte-shadow-panel)}.bridgerte__floating-menu{z-index:calc(var(--bridgerte-z-index-toolbar) + 1);min-width:180px;padding:6px}.bridgerte__menu-item{border-radius:var(--bridgerte-radius);width:100%;min-height:34px;color:var(--bridgerte-color-text);font:inherit;text-align:left;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;background:0 0;border:0;align-items:center;gap:8px;padding:0 8px;display:flex}.bridgerte__menu-item:focus-visible{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg);outline:none}.bridgerte__menu-item[data-active=true]{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__menu-item:disabled,.bridgerte__menu-item[aria-disabled=true]{color:var(--bridgerte-color-disabled);cursor:not-allowed}.bridgerte__menu-icon-text{text-overflow:ellipsis;white-space:nowrap;flex:none;display:inline-block;overflow:hidden}.bridgerte__slash-command-menu{overscroll-behavior:contain;scrollbar-width:thin;touch-action:pan-y;-webkit-overflow-scrolling:touch;gap:2px;width:min(120px,100vw - 24px);min-width:0;max-height:min(232px,100vh - 24px);padding:4px;display:grid;overflow-y:auto}.bridgerte__slash-command-menu[hidden]{display:none}.bridgerte__slash-command-anchor{pointer-events:none;width:1px;position:fixed}.bridgerte__slash-command-item{text-align:left;flex-direction:row;justify-content:flex-start;align-items:center;gap:4px;min-height:30px;padding:0 8px}.bridgerte__slash-command-item-icon{width:18px;height:18px;color:var(--bridgerte-color-text-muted);flex:none;place-items:center;display:inline-grid}.bridgerte__slash-command-item-title{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;font-weight:700;line-height:1.2;overflow:hidden}.bridgerte__slash-command-item-description{color:var(--bridgerte-color-text-muted);font-size:12px;line-height:1.2;display:none}.bridgerte__slash-command-status{color:var(--bridgerte-color-text-muted);text-align:center;padding:8px;font-size:13px;line-height:1.3}.bridgerte__mention{border-radius:calc(var(--bridgerte-radius) - 2px);max-width:100%;color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg);white-space:nowrap;align-items:center;padding:0 3px;display:inline-flex}.bridgerte__mention-menu{overscroll-behavior:contain;scrollbar-width:thin;touch-action:pan-y;-webkit-overflow-scrolling:touch;gap:2px;width:min(120px,100vw - 24px);min-width:0;max-height:min(232px,100vh - 24px);padding:4px;display:grid;overflow-y:auto}.bridgerte__mention-menu[hidden]{display:none}.bridgerte__mention-anchor{pointer-events:none;width:1px;position:fixed}.bridgerte__mention-item{text-align:left;flex-direction:row;justify-content:flex-start;align-items:center;gap:4px;min-height:30px;padding:0 8px}.bridgerte__mention-item-avatar,.bridgerte__mention-item-icon{border-radius:50%;flex:none;width:18px;height:18px}.bridgerte__mention-item-avatar{object-fit:cover;background:var(--bridgerte-color-active-bg)}.bridgerte__mention-item-icon{color:var(--bridgerte-color-text-muted);background:var(--bridgerte-color-active-bg);place-items:center;font-size:12px;line-height:1;display:inline-grid}.bridgerte__mention-item-title{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;font-weight:700;line-height:1.2;overflow:hidden}.bridgerte__mention-item-description{color:var(--bridgerte-color-text-muted);font-size:12px;line-height:1.2;display:none}.bridgerte__mention-status{color:var(--bridgerte-color-text-muted);text-align:center;padding:8px;font-size:13px;line-height:1.3}.bridgerte__hoverbar{gap:2px;width:max-content;min-width:0;max-width:calc(100vw - 24px);padding:4px;display:flex}.bridgerte__hoverbar[hidden]{display:none}.bridgerte__hoverbar-anchor{pointer-events:none;position:fixed}.bridgerte__hoverbar-separator{width:1px;height:var(--bridgerte-hoverbar-button-size);background:var(--bridgerte-color-border);margin:0 2px}.bridgerte__hoverbar-button{width:var(--bridgerte-hoverbar-button-size);min-width:var(--bridgerte-hoverbar-button-size);height:var(--bridgerte-hoverbar-button-size);border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-text-muted);font:inherit;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;background:0 0;border:0;justify-content:center;align-items:center;font-size:12px;font-weight:700;line-height:1;display:inline-flex;overflow:hidden}.bridgerte__hoverbar-button[data-active=true]{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__hoverbar-button:disabled{color:var(--bridgerte-color-disabled);cursor:not-allowed}.bridgerte__hoverbar-button:focus-visible{box-shadow:0 0 0 2px var(--bridgerte-color-active-bg);outline:none}.bridgerte__hoverbar-button>svg,.bridgerte__hoverbar-button>.bridgerte__menu-icon-text{width:calc(var(--bridgerte-hoverbar-button-size) - 12px);height:calc(var(--bridgerte-hoverbar-button-size) - 12px);flex:none}.bridgerte__dialog-backdrop{z-index:var(--bridgerte-z-index-toolbar);opacity:0;pointer-events:none;background:0 0;position:fixed;top:0;right:0;bottom:0;left:0}.bridgerte__dialog-backdrop[data-visible=true]{opacity:1;pointer-events:auto}.bridgerte__dialog{z-index:calc(var(--bridgerte-z-index-toolbar) + 2);width:min(220px,100vw - 24px);max-height:calc(var(--bridgerte-dialog-visible-height,100vh) - 32px);opacity:0;border:1px solid var(--bridgerte-color-border);border-radius:var(--bridgerte-radius);color:var(--bridgerte-color-text);background:var(--bridgerte-color-panel);box-shadow:var(--bridgerte-shadow-panel);font:inherit;pointer-events:none;transition:opacity .12s,transform .12s;display:grid;position:fixed;top:0;left:0;transform:translateY(-4px)scale(.98)}.bridgerte__dialog[data-visible=true]{opacity:1;pointer-events:auto;transform:translateY(0)scale(1)}.bridgerte__code-block-menu{width:min(var(--bridgerte-dialog-anchor-width),calc(100vw - 24px));max-height:min(360px,calc(var(--bridgerte-dialog-visible-height,100vh) - 32px));border-color:var(--bridgerte-color-border);background:var(--bridgerte-color-panel);box-shadow:var(--bridgerte-shadow-popup)}.bridgerte__code-block-menu .bridgerte__dialog-content{min-height:0;max-height:inherit;overflow:hidden}.bridgerte__code-block-menu-list{max-height:min(340px,calc(var(--bridgerte-dialog-visible-height,100vh) - 48px));overscroll-behavior:contain;scrollbar-width:thin;touch-action:pan-y;-webkit-overflow-scrolling:touch;gap:2px;padding:8px;display:grid;overflow-y:auto}.bridgerte__code-block-menu-item{min-height:var(--bridgerte-payload-panel-field-height);border-radius:calc(var(--bridgerte-radius) - 2px);padding:0 12px}.bridgerte__payload-panel{padding:6px}.bridgerte__payload-panel-title{min-height:var(--bridgerte-payload-panel-title-height);color:var(--bridgerte-color-text);justify-content:space-between;align-items:center;gap:8px;padding:2px 4px 6px;font-size:13px;font-weight:700;line-height:1.2;display:flex}.bridgerte__payload-panel-clear{color:var(--bridgerte-color-text-muted);font:inherit;text-align:right;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;background:0 0;border:0;flex:none;padding:0;font-size:12px;font-weight:600;line-height:1}.bridgerte__payload-panel-clear:focus-visible{color:var(--bridgerte-color-primary);text-underline-offset:.18em;outline:none;text-decoration:underline}.bridgerte__payload-panel-field{gap:7px;display:grid}.bridgerte__payload-panel-option-list{gap:2px;display:grid}.bridgerte__payload-panel-color-picker{width:calc(var(--bridgerte-payload-panel-color-wheel-size) + var(--bridgerte-payload-panel-color-swatch-width) * 2 + 20px);justify-self:center;place-items:center;max-width:100%;display:grid;position:relative}.bridgerte__payload-panel-color-wheel{width:var(--bridgerte-payload-panel-color-wheel-size);aspect-ratio:1;border:1px solid var(--bridgerte-color-border);background:radial-gradient(circle,var(--bridgerte-color-bg) 0%,transparent 68%),conic-gradient(from 90deg,red,#ff0,#0f0,#0ff,#00f,#f0f,red);cursor:crosshair;touch-action:none;border-radius:999px;position:relative}.bridgerte__payload-panel-color-wheel:focus-visible{box-shadow:0 0 0 3px var(--bridgerte-color-active-bg);outline:none}.bridgerte__payload-panel-color-wheel-handle{width:var(--bridgerte-payload-panel-color-handle-size);height:var(--bridgerte-payload-panel-color-handle-size);border:2px solid var(--bridgerte-color-bg);box-shadow:0 0 0 1px var(--bridgerte-color-border),var(--bridgerte-shadow-panel);opacity:0;pointer-events:none;border-radius:999px;position:absolute;transform:translate(-50%,-50%)}.bridgerte__payload-panel-color-wheel[data-active=true] .bridgerte__payload-panel-color-wheel-handle{opacity:1}.bridgerte__payload-panel-color-preview{border:1px solid var(--bridgerte-color-border);border-radius:calc(var(--bridgerte-radius) - 2px);min-height:24px;box-shadow:inset 0 0 0 1px var(--bridgerte-color-panel)}.bridgerte__payload-panel-color-preview[data-empty=true]{background:linear-gradient(45deg,transparent 45%,var(--bridgerte-color-border) 45%,var(--bridgerte-color-border) 55%,transparent 55%),linear-gradient(-45deg,transparent 45%,var(--bridgerte-color-border) 45%,var(--bridgerte-color-border) 55%,transparent 55%),var(--bridgerte-color-bg);background-position:50%;background-size:12px 12px}.bridgerte__payload-panel-color-actions{align-items:center;gap:6px;display:flex}.bridgerte__payload-panel-color-actions[data-layout=sides]{pointer-events:none;justify-content:space-between;position:absolute;top:0;right:0;bottom:0;left:0}.bridgerte__payload-panel-color-actions[data-layout=grid]{flex-wrap:wrap;justify-content:center;margin-top:6px}.bridgerte__payload-panel-color-swatch{width:var(--bridgerte-payload-panel-color-swatch-width);height:var(--bridgerte-payload-panel-color-swatch-height);border:1px solid var(--bridgerte-color-border);border-radius:calc(var(--bridgerte-radius) - 2px);background:var(--bridgerte-color-bg);box-shadow:inset 0 0 0 1px var(--bridgerte-color-panel);cursor:pointer;pointer-events:auto;touch-action:manipulation;-webkit-tap-highlight-color:transparent;padding:0}.bridgerte__payload-panel-color-swatch:focus-visible{border-color:var(--bridgerte-color-primary);box-shadow:inset 0 0 0 1px var(--bridgerte-color-bg),0 0 0 2px var(--bridgerte-color-active-bg);outline:none}.bridgerte__payload-panel-text-field{color:var(--bridgerte-color-text-muted);gap:5px;font-size:12px;font-weight:600;line-height:1.2;display:grid}.bridgerte__payload-panel-text-input{width:100%;min-height:var(--bridgerte-payload-panel-field-height);border:1px solid var(--bridgerte-color-border);border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-text);background:var(--bridgerte-color-bg);font:inherit;-webkit-tap-highlight-color:transparent;padding:0 10px;font-size:13px}.bridgerte__payload-panel-text-input:focus-visible{border-color:var(--bridgerte-color-active-bg);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg);outline:none}.bridgerte__payload-panel-table-grid{grid-template-columns:repeat(var(--bridgerte-payload-panel-table-cols),var(--bridgerte-payload-panel-table-cell-size));touch-action:none;-webkit-tap-highlight-color:transparent;justify-content:center;gap:2px;max-width:100%;padding:2px;display:grid}.bridgerte__payload-panel-table-cell{width:var(--bridgerte-payload-panel-table-cell-size);height:var(--bridgerte-payload-panel-table-cell-size);border:1px solid var(--bridgerte-color-border);border-radius:calc(var(--bridgerte-radius) - 4px);background:var(--bridgerte-color-bg);cursor:pointer;-webkit-tap-highlight-color:transparent;padding:0}.bridgerte__payload-panel-table-cell[data-active=true]{border-color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-table-cell:focus-visible{border-color:var(--bridgerte-color-primary);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg);outline:none}.bridgerte__payload-panel-table-status{min-height:18px;color:var(--bridgerte-color-text-muted);text-align:center;font-size:12px;font-weight:600;line-height:1.5}.bridgerte__payload-panel-submit{min-height:var(--bridgerte-payload-panel-field-height);border:1px solid var(--bridgerte-color-border);border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-bg);background:var(--bridgerte-color-primary);font:inherit;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;padding:0 10px;font-size:13px;font-weight:700}.bridgerte__payload-panel-submit:focus-visible{box-shadow:0 0 0 2px var(--bridgerte-color-active-bg);outline:none}.bridgerte__payload-panel-option{min-height:var(--bridgerte-payload-panel-option-height);border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-text);font:inherit;text-align:left;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;background:0 0;border:0;align-items:center;padding:0 7px;display:flex}.bridgerte__payload-panel-option[data-active=true]{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-option:focus-visible{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg);outline:none}@media(hover:hover)and (pointer:fine){.bridgerte__code-block-control:hover{color:var(--bridgerte-color-text-muted);background:var(--bridgerte-color-panel)}.bridgerte__toolbar-button:hover{border-color:var(--bridgerte-color-active-bg);color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__code-block-menu-item:hover,.bridgerte__media-controls-button:hover,.bridgerte__table-controls-button:hover,.bridgerte__hoverbar-button:hover,.bridgerte__payload-panel-option:hover,.bridgerte__mention-item:hover,.bridgerte__slash-command-item:hover,.bridgerte__menu-item:hover{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-clear:hover{color:var(--bridgerte-color-primary)}.bridgerte__payload-panel-color-wheel:hover{box-shadow:0 0 0 3px var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-table-cell:hover{border-color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-color-swatch:hover{border-color:var(--bridgerte-color-primary);box-shadow:inset 0 0 0 1px var(--bridgerte-color-bg),0 0 0 2px var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-submit:hover{border-color:var(--bridgerte-color-primary);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg)}}@media(hover:none),(pointer:coarse){.bridgerte__code-block-control:active,.bridgerte__code-block-control[data-pressed=true]{color:var(--bridgerte-color-text-muted);background:var(--bridgerte-color-panel)}.bridgerte__toolbar-button:active,.bridgerte__toolbar-button[data-pressed=true]{border-color:var(--bridgerte-color-active-bg);color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__code-block-menu-item:active,.bridgerte__code-block-menu-item[data-pressed=true],.bridgerte__media-controls-button:active,.bridgerte__media-controls-button[data-pressed=true],.bridgerte__table-controls-button:active,.bridgerte__table-controls-button[data-pressed=true],.bridgerte__hoverbar-button:active,.bridgerte__hoverbar-button[data-pressed=true],.bridgerte__payload-panel-option:active,.bridgerte__payload-panel-option[data-pressed=true],.bridgerte__mention-item:active,.bridgerte__mention-item[data-pressed=true],.bridgerte__slash-command-item:active,.bridgerte__slash-command-item[data-pressed=true],.bridgerte__menu-item[data-pressed=true],.bridgerte__menu-item:active{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-clear:active,.bridgerte__payload-panel-clear[data-pressed=true]{color:var(--bridgerte-color-primary)}.bridgerte__payload-panel-color-wheel:active,.bridgerte__payload-panel-color-wheel[data-pressed=true]{box-shadow:0 0 0 3px var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-table-cell:active,.bridgerte__payload-panel-table-cell[data-pressed=true]{border-color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-color-swatch:active,.bridgerte__payload-panel-color-swatch[data-pressed=true]{border-color:var(--bridgerte-color-primary);box-shadow:inset 0 0 0 1px var(--bridgerte-color-bg),0 0 0 2px var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-submit:active,.bridgerte__payload-panel-submit[data-pressed=true]{border-color:var(--bridgerte-color-primary);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg)}}@media(max-width:760px){.bridgerte{min-height:220px}.bridgerte__toolbar-button{min-width:38px;height:38px}}
|
|
1
|
+
:root,.bridgerte{--bridgerte-color-primary:#1677ff;--bridgerte-color-text:#1f2329;--bridgerte-color-text-muted:#86909c;--bridgerte-color-bg:#fff;--bridgerte-color-panel:#fff;--bridgerte-color-border:#e5e6eb;--bridgerte-color-active-bg:#e8f3ff;--bridgerte-color-code-bg:#f3f4f6;--bridgerte-color-placeholder:#b7bcc5;--bridgerte-color-disabled:#c9cdd4;--bridgerte-color-danger:#f53f3f;--bridgerte-shadow-panel:0 12px 32px #0f172a24;--bridgerte-shadow-popup:0 10px 24px #0f172a1a;--bridgerte-font-size:15px;--bridgerte-line-height:1.7;--bridgerte-radius:8px;--bridgerte-radius-large:12px;--bridgerte-toolbar-height:42px;--bridgerte-control-height:32px;--bridgerte-control-height-small:28px;--bridgerte-touch-target-size:32px;--bridgerte-hoverbar-button-size:28px;--bridgerte-safe-area-bottom:env(safe-area-inset-bottom,0px);--bridgerte-editor-padding:12px;--bridgerte-z-index-toolbar:20;--bridgerte-code-font-family:"JetBrains Mono", Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace;--bridgerte-code-block-control-height:32px;--bridgerte-code-token-text:#000;--bridgerte-code-token-comment:#708090;--bridgerte-code-token-keyword:#a626a4;--bridgerte-code-token-operator:#0184bc;--bridgerte-code-token-function:#4078f2;--bridgerte-code-token-string:#50a14f;--bridgerte-code-token-number:#986801;--bridgerte-code-token-class:#4078f2;--bridgerte-code-token-builtin:#50a14f;--bridgerte-code-token-property:#e45649;--bridgerte-code-token-variable:#e90;--bridgerte-code-token-tag:#c18401;--bridgerte-code-token-punctuation:#999;--bridgerte-code-token-regex:#e90;--bridgerte-code-token-inserted:#690;--bridgerte-code-token-deleted:#905;--bridgerte-media-controls-button-height:28px;--bridgerte-table-controls-button-height:28px;--bridgerte-payload-panel-color-wheel-size:136px;--bridgerte-payload-panel-color-handle-size:14px;--bridgerte-payload-panel-color-swatch-width:22px;--bridgerte-payload-panel-color-swatch-height:40px;--bridgerte-payload-panel-table-cell-size:16px;--bridgerte-payload-panel-title-height:28px;--bridgerte-payload-panel-option-height:28px;--bridgerte-payload-panel-field-height:32px;--bridgerte-todo-marker-hit-size:32px;--bridgerte-todo-marker-size:16px}.bridgerte{width:100%;height:100%;min-height:0;color:var(--bridgerte-color-text);background:var(--bridgerte-color-bg);font-family:inherit;font-size:var(--bridgerte-font-size);line-height:var(--bridgerte-line-height);overflow-wrap:anywhere;outline:none;transition:background-color .16s,color .16s;position:relative}.bridgerte[data-readonly=true]{color:var(--bridgerte-color-text-muted);background:var(--bridgerte-color-panel);cursor:default}.bridgerte__editor{flex-direction:column;width:100%;height:100%;min-height:0;display:flex}.bridgerte__body{flex-direction:column;flex:1;min-height:0;display:flex}.bridgerte__content{min-height:0;padding:var(--bridgerte-editor-padding);-webkit-tap-highlight-color:transparent;outline:none;flex:1;position:relative;overflow-y:auto}.bridgerte__content[data-placeholder][data-empty=true]:before{top:var(--bridgerte-editor-padding);left:var(--bridgerte-editor-padding);color:var(--bridgerte-color-text-muted);content:attr(data-placeholder);pointer-events:none;position:absolute}.bridgerte__content[data-empty=true] .bridgerte__paragraph:first-child{margin-top:0}.bridgerte__paragraph{margin:0 0 .75em}.bridgerte__heading{color:var(--bridgerte-color-text);margin:1em 0 .55em;font-weight:700;line-height:1.25}.bridgerte__heading--h1{font-size:32px}.bridgerte__heading--h2{font-size:28px}.bridgerte__heading--h3{font-size:24px}.bridgerte__heading--h4{font-size:21px}.bridgerte__heading--h5{font-size:18px}.bridgerte__heading--h6{font-size:16px}.bridgerte__list{margin:0 0 .75em;padding-left:1.5em}.bridgerte__list-item{margin:.25em 0}.bridgerte__quote{border-left:3px solid var(--bridgerte-color-primary);border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-text);background:var(--bridgerte-color-code-bg);margin:.85em 0;padding:.45em .85em}.bridgerte__quote>:last-child{margin-bottom:0}.bridgerte__divider{background:var(--bridgerte-color-border);border:0;height:1px;margin:1em 0}.bridgerte__link{color:var(--bridgerte-color-primary);text-underline-offset:.18em;text-decoration:underline}.bridgerte__text--bold{font-weight:700}.bridgerte__text--italic{font-style:italic}.bridgerte__text--underline{text-underline-offset:.18em;text-decoration-line:underline}.bridgerte__text--strike{text-decoration-line:line-through}.bridgerte__text--underline-strike,.bridgerte__text--underline.bridgerte__text--strike{text-underline-offset:.18em;text-decoration-line:underline line-through}.bridgerte__list--todo{padding-left:0;list-style:none}.bridgerte__list-item--checked,.bridgerte__list-item--unchecked{outline:none;margin-left:.15em;padding-left:2em;list-style:none;position:relative}.bridgerte__list-item--checked:before,.bridgerte__list-item--unchecked:before{top:calc(var(--bridgerte-line-height) * .5em);width:var(--bridgerte-todo-marker-hit-size);height:var(--bridgerte-todo-marker-hit-size);box-sizing:border-box;content:"";border-radius:999px;position:absolute;left:0;transform:translateY(-50%)}.bridgerte__list-item--checked:after,.bridgerte__list-item--unchecked:after{top:calc(var(--bridgerte-line-height) * .5em);width:var(--bridgerte-todo-marker-size);height:var(--bridgerte-todo-marker-size);box-sizing:border-box;border:1px solid var(--bridgerte-color-border);content:"";pointer-events:none;border-radius:999px;position:absolute;left:0;transform:translateY(-50%)}.bridgerte__list-item--checked:focus-visible:after,.bridgerte__list-item--unchecked:focus-visible:after{border-color:var(--bridgerte-color-primary);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg)}.bridgerte__list-item--checked{color:var(--bridgerte-color-text-muted);text-decoration:line-through}.bridgerte__list-item--checked:after{border-color:var(--bridgerte-color-primary);background:radial-gradient(circle at center,var(--bridgerte-color-bg) 0 4px,transparent 4.5px),var(--bridgerte-color-primary)}.bridgerte__code{border-radius:var(--bridgerte-radius);color:var(--bridgerte-color-text);background:var(--bridgerte-color-code-bg);font-family:var(--bridgerte-code-font-family);padding:.12em .3em;font-size:.92em}.bridgerte__code-block{border:1px solid var(--bridgerte-color-border);border-radius:var(--bridgerte-radius-large);color:var(--bridgerte-code-token-text);background:var(--bridgerte-color-code-bg);font-family:var(--bridgerte-code-font-family);line-height:var(--bridgerte-line-height);white-space:pre;margin:12px 0;padding:44px 12px 12px;display:block;overflow:auto}.bridgerte__code-token{color:var(--bridgerte-code-token-text)}.bridgerte__code-token--comment{color:var(--bridgerte-code-token-comment);font-style:italic}.bridgerte__code-token--keyword{color:var(--bridgerte-code-token-keyword)}.bridgerte__code-token--operator{color:var(--bridgerte-code-token-operator)}.bridgerte__code-token--function{color:var(--bridgerte-code-token-function)}.bridgerte__code-token--string,.bridgerte__code-token--attr-value{color:var(--bridgerte-code-token-string)}.bridgerte__code-token--number,.bridgerte__code-token--boolean,.bridgerte__code-token--constant{color:var(--bridgerte-code-token-number)}.bridgerte__code-token--class-name{color:var(--bridgerte-code-token-class)}.bridgerte__code-token--builtin{color:var(--bridgerte-code-token-builtin)}.bridgerte__code-token--property,.bridgerte__code-token--attr,.bridgerte__code-token--attr-name{color:var(--bridgerte-code-token-property)}.bridgerte__code-token--variable{color:var(--bridgerte-code-token-variable)}.bridgerte__code-token--tag,.bridgerte__code-token--selector,.bridgerte__code-token--namespace{color:var(--bridgerte-code-token-tag)}.bridgerte__code-token--punctuation,.bridgerte__code-token--prefix,.bridgerte__code-token--unchanged{color:var(--bridgerte-code-token-punctuation)}.bridgerte__code-token--regex,.bridgerte__code-token--url{color:var(--bridgerte-code-token-regex)}.bridgerte__code-token--inserted{color:var(--bridgerte-code-token-inserted)}.bridgerte__code-token--deleted{color:var(--bridgerte-code-token-deleted)}.bridgerte__code-block-controls-layer{z-index:calc(var(--bridgerte-z-index-toolbar) - 1);pointer-events:none;position:absolute;top:0;right:0;bottom:0;left:0}.bridgerte__code-block-control{width:max-content;min-height:var(--bridgerte-code-block-control-height);border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-placeholder);font:inherit;cursor:pointer;pointer-events:auto;touch-action:manipulation;-webkit-tap-highlight-color:transparent;background:0 0;border:0;align-items:center;gap:8px;padding:0 8px;font-size:13px;display:flex;position:absolute;top:0;left:0}.bridgerte__code-block-control:focus-visible{color:var(--bridgerte-color-text-muted);background:var(--bridgerte-color-panel);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg);outline:none}.bridgerte__code-block-control-arrow{border-top:5px solid var(--bridgerte-color-text-muted);border-left:5px solid #0000;border-right:5px solid #0000;flex:none;width:0;height:0}.bridgerte__code-block-control-label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.bridgerte__media{width:var(--bridgerte-media-display-width,50%);border:1px solid var(--bridgerte-color-border);border-radius:var(--bridgerte-radius-large);background:var(--bridgerte-color-panel);max-width:100%;margin:12px 0;display:block;overflow:hidden}.bridgerte__media-placeholder{min-height:160px;aspect-ratio:var(--bridgerte-media-aspect-ratio,16 / 9);color:var(--bridgerte-color-text-muted);background:var(--bridgerte-color-code-bg);justify-content:center;align-items:center;gap:8px;font-size:13px;display:flex}.bridgerte__media-placeholder-icon{border:1px solid var(--bridgerte-color-border);border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-text-muted);background:var(--bridgerte-color-bg);padding:2px 6px;font-size:11px;line-height:1.4}.bridgerte__media[data-load-state=loaded] .bridgerte__media-placeholder{display:none}.bridgerte__media[data-load-state=error] .bridgerte__media-placeholder{color:var(--bridgerte-color-danger)}.bridgerte__media[data-align=center]{margin-left:auto;margin-right:auto}.bridgerte__media[data-align=right]{margin-left:auto;margin-right:0}.bridgerte__media-element{width:100%;max-width:100%;height:auto;display:block}.bridgerte__media[data-load-state=loading] .bridgerte__media-element,.bridgerte__media[data-load-state=error] .bridgerte__media-element{opacity:0;width:1px;height:1px}.bridgerte__media[data-load-state=loaded] .bridgerte__media-element,.bridgerte__media:not([data-load-state]) .bridgerte__media-element{opacity:1}.bridgerte__media-status{border-top:1px solid var(--bridgerte-color-border);color:var(--bridgerte-color-text-muted);background:var(--bridgerte-color-bg);padding:8px 10px;font-size:13px}.bridgerte__media[data-status=error] .bridgerte__media-status{color:var(--bridgerte-color-danger)}.bridgerte__media-controls-layer{z-index:calc(var(--bridgerte-z-index-toolbar) - 1);pointer-events:none;position:absolute;top:0;right:0;bottom:0;left:0}.bridgerte__media-controls{border:1px solid var(--bridgerte-color-border);border-radius:var(--bridgerte-radius);color:var(--bridgerte-color-text);background:var(--bridgerte-color-panel);box-shadow:var(--bridgerte-shadow-popup);pointer-events:auto;touch-action:manipulation;-webkit-tap-highlight-color:transparent;align-items:center;gap:2px;padding:3px;display:inline-flex;position:absolute;top:0;left:0}.bridgerte__media-controls-button{min-height:var(--bridgerte-media-controls-button-height);border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-text);font:inherit;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;background:0 0;border:0;align-items:center;padding:0 8px;font-size:12px;line-height:1;display:inline-flex}.bridgerte__media-controls-button:focus-visible{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg);outline:none}.bridgerte__media-controls-button[data-active=true]{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte[data-readonly=true] .bridgerte__media-controls-button{color:var(--bridgerte-color-disabled);cursor:not-allowed}.bridgerte__table-wrapper{box-sizing:border-box;border:1px solid var(--bridgerte-color-border);border-radius:var(--bridgerte-radius-large);background:var(--bridgerte-color-panel);scrollbar-width:thin;margin:12px 0;position:relative;overflow-x:auto}.bridgerte__table{border-collapse:separate;border-spacing:0;width:max-content;min-width:100%;color:var(--bridgerte-color-text);background:var(--bridgerte-color-bg)}.bridgerte__table-cell{border:0;border-top:1px solid var(--bridgerte-color-border);border-left:1px solid var(--bridgerte-color-border);vertical-align:top;padding:8px}.bridgerte__table-cell:first-child{border-left:0}.bridgerte__table-row:first-of-type .bridgerte__table-cell{border-top:0}.bridgerte__table-cell--header{background:var(--bridgerte-color-code-bg);font-weight:700}.bridgerte__table-controls-layer{z-index:calc(var(--bridgerte-z-index-toolbar) - 1);pointer-events:none;position:absolute;top:0;right:0;bottom:0;left:0}.bridgerte__table-controls{border:1px solid var(--bridgerte-color-border);border-radius:var(--bridgerte-radius);color:var(--bridgerte-color-text);background:var(--bridgerte-color-panel);box-shadow:var(--bridgerte-shadow-popup);pointer-events:auto;scrollbar-width:none;touch-action:pan-x;-webkit-tap-highlight-color:transparent;align-items:center;gap:2px;padding:4px;display:inline-flex;position:absolute;top:0;left:0;overflow-x:auto}.bridgerte__table-controls::-webkit-scrollbar{display:none}.bridgerte__table-controls-button{min-height:var(--bridgerte-table-controls-button-height);border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-text);font:inherit;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;background:0 0;border:0;flex:none;align-items:center;padding:0 8px;font-size:12px;line-height:1;display:inline-flex}.bridgerte__table-controls-button:focus-visible{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg);outline:none}.bridgerte[data-readonly=true] .bridgerte__table-controls-button{color:var(--bridgerte-color-disabled);cursor:not-allowed}.bridgerte__toolbar{z-index:var(--bridgerte-z-index-toolbar);min-height:var(--bridgerte-toolbar-height);border-bottom:1px solid var(--bridgerte-color-border);padding:5px calc(var(--bridgerte-editor-padding) - 2px);color:var(--bridgerte-color-text);background:var(--bridgerte-color-panel);cursor:grab;overscroll-behavior-x:contain;scrollbar-width:none;touch-action:pan-x;-webkit-tap-highlight-color:transparent;flex-wrap:nowrap;align-items:center;gap:4px;display:flex;position:sticky;top:0;overflow:auto hidden}.bridgerte__toolbar::-webkit-scrollbar{display:none}.bridgerte__toolbar[data-placement=bottom]{min-height:calc(var(--bridgerte-toolbar-height) + var(--bridgerte-safe-area-bottom));border-top:1px solid var(--bridgerte-color-border);padding-top:5px;padding-bottom:calc(5px + var(--bridgerte-safe-area-bottom));border-bottom:0;top:auto;bottom:0}.bridgerte__toolbar[data-dragging=true]{cursor:grabbing;-webkit-user-select:none;user-select:none}.bridgerte__toolbar-group{flex:none;align-items:center;gap:2px;display:inline-flex}.bridgerte__toolbar-separator{background:var(--bridgerte-color-border);flex:none;width:1px;height:22px;margin:0 6px}.bridgerte__toolbar-button{border-radius:calc(var(--bridgerte-radius) - 2px);min-width:30px;height:30px;color:var(--bridgerte-color-text);cursor:pointer;touch-action:pan-x;-webkit-tap-highlight-color:transparent;background:0 0;border:1px solid #0000;justify-content:center;align-items:center;padding:0 7px;font-family:inherit;font-size:13px;font-weight:600;line-height:1;transition:border-color .12s,background-color .12s,color .12s;display:inline-flex;position:relative}.bridgerte__toolbar-button:focus-visible{border-color:var(--bridgerte-color-primary);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg);outline:none}.bridgerte__toolbar-button[aria-pressed=true],.bridgerte__toolbar-button[data-active=true]{border-color:var(--bridgerte-color-active-bg);color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__toolbar-button:disabled,.bridgerte__toolbar-button[aria-disabled=true]{color:var(--bridgerte-color-disabled);cursor:not-allowed;background:0 0}.bridgerte__toolbar-button>svg,.bridgerte__toolbar-group-indicator>svg{flex:none;display:block}.bridgerte__toolbar-group-button{gap:4px}.bridgerte__toolbar-group-button[data-open=true]{border-color:var(--bridgerte-color-primary);color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__toolbar-group-indicator{justify-content:center;align-items:center;width:12px;height:12px;font-size:11px;line-height:1;display:inline-flex}.bridgerte__toolbar-group-menu{opacity:0;pointer-events:none;gap:2px;min-width:128px;max-height:min(320px,100vh - 24px);padding:4px;transition:opacity .12s,transform .12s;display:grid;position:fixed;overflow:hidden auto;transform:translateY(-2px)}.bridgerte__toolbar-group-menu[data-visible=true]{opacity:1;pointer-events:auto;transform:translateY(0)}.bridgerte__menu-item.bridgerte__toolbar-group-menu-item{border-radius:calc(var(--bridgerte-radius) - 2px);gap:6px;min-height:30px;padding:0 7px;font-size:13px;font-weight:500;line-height:1.15}.bridgerte__toolbar-group-menu-item>svg,.bridgerte__toolbar-group-menu-item>.bridgerte__menu-icon-text{flex:none;width:16px;height:16px}.bridgerte__toolbar-group-menu-label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.bridgerte__toolbar-tooltip{z-index:calc(var(--bridgerte-z-index-toolbar) + 2);opacity:0;border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-bg);background:var(--bridgerte-color-text);box-shadow:var(--bridgerte-shadow-panel);pointer-events:none;white-space:nowrap;padding:5px 7px;font-size:12px;font-weight:500;line-height:1;transition:opacity .12s,transform .12s;position:fixed;transform:translate(-50%,-100%)translateY(2px)}.bridgerte__toolbar-tooltip[data-visible=true]{opacity:1;transform:translate(-50%,-100%)translateY(0)}.bridgerte__panel,.bridgerte__floating-menu{border:1px solid var(--bridgerte-color-border);border-radius:var(--bridgerte-radius);color:var(--bridgerte-color-text);background:var(--bridgerte-color-panel);box-shadow:var(--bridgerte-shadow-panel)}.bridgerte__floating-menu{z-index:calc(var(--bridgerte-z-index-toolbar) + 1);min-width:180px;padding:6px}.bridgerte__menu-item{border-radius:var(--bridgerte-radius);width:100%;min-height:34px;color:var(--bridgerte-color-text);font:inherit;text-align:left;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;background:0 0;border:0;align-items:center;gap:8px;padding:0 8px;display:flex}.bridgerte__menu-item:focus-visible{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg);outline:none}.bridgerte__menu-item[data-active=true]{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__menu-item:disabled,.bridgerte__menu-item[aria-disabled=true]{color:var(--bridgerte-color-disabled);cursor:not-allowed}.bridgerte__menu-icon-text{text-overflow:ellipsis;white-space:nowrap;flex:none;display:inline-block;overflow:hidden}.bridgerte__slash-command-menu{overscroll-behavior:contain;scrollbar-width:thin;touch-action:pan-y;-webkit-overflow-scrolling:touch;gap:2px;width:min(120px,100vw - 24px);min-width:0;max-height:min(232px,100vh - 24px);padding:4px;display:grid;overflow-y:auto}.bridgerte__slash-command-menu[hidden]{display:none}.bridgerte__slash-command-anchor{pointer-events:none;width:1px;position:fixed}.bridgerte__slash-command-item{text-align:left;flex-direction:row;justify-content:flex-start;align-items:center;gap:4px;min-height:30px;padding:0 8px}.bridgerte__slash-command-item-icon{width:18px;height:18px;color:var(--bridgerte-color-text-muted);flex:none;place-items:center;display:inline-grid}.bridgerte__slash-command-item-title{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;font-weight:700;line-height:1.2;overflow:hidden}.bridgerte__slash-command-item-description{color:var(--bridgerte-color-text-muted);font-size:12px;line-height:1.2;display:none}.bridgerte__slash-command-status{color:var(--bridgerte-color-text-muted);text-align:center;padding:8px;font-size:13px;line-height:1.3}.bridgerte__mention{border-radius:calc(var(--bridgerte-radius) - 2px);max-width:100%;color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg);white-space:nowrap;align-items:center;padding:0 3px;display:inline-flex}.bridgerte__mention-menu{overscroll-behavior:contain;scrollbar-width:thin;touch-action:pan-y;-webkit-overflow-scrolling:touch;gap:2px;width:min(120px,100vw - 24px);min-width:0;max-height:min(232px,100vh - 24px);padding:4px;display:grid;overflow-y:auto}.bridgerte__mention-menu[hidden]{display:none}.bridgerte__mention-anchor{pointer-events:none;width:1px;position:fixed}.bridgerte__mention-item{text-align:left;flex-direction:row;justify-content:flex-start;align-items:center;gap:4px;min-height:30px;padding:0 8px}.bridgerte__mention-item-avatar,.bridgerte__mention-item-icon{border-radius:50%;flex:none;width:18px;height:18px}.bridgerte__mention-item-avatar{object-fit:cover;background:var(--bridgerte-color-active-bg)}.bridgerte__mention-item-icon{color:var(--bridgerte-color-text-muted);background:var(--bridgerte-color-active-bg);place-items:center;font-size:12px;line-height:1;display:inline-grid}.bridgerte__mention-item-title{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;font-weight:700;line-height:1.2;overflow:hidden}.bridgerte__mention-item-description{color:var(--bridgerte-color-text-muted);font-size:12px;line-height:1.2;display:none}.bridgerte__mention-status{color:var(--bridgerte-color-text-muted);text-align:center;padding:8px;font-size:13px;line-height:1.3}.bridgerte__hoverbar{gap:2px;width:max-content;min-width:0;max-width:calc(100vw - 24px);padding:4px;display:flex}.bridgerte__hoverbar[hidden]{display:none}.bridgerte__hoverbar-anchor{pointer-events:none;position:fixed}.bridgerte__hoverbar-separator{width:1px;height:var(--bridgerte-hoverbar-button-size);background:var(--bridgerte-color-border);margin:0 2px}.bridgerte__hoverbar-button{width:var(--bridgerte-hoverbar-button-size);min-width:var(--bridgerte-hoverbar-button-size);height:var(--bridgerte-hoverbar-button-size);border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-text-muted);font:inherit;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;background:0 0;border:0;justify-content:center;align-items:center;font-size:12px;font-weight:700;line-height:1;display:inline-flex;overflow:hidden}.bridgerte__hoverbar-button[data-active=true]{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__hoverbar-button:disabled{color:var(--bridgerte-color-disabled);cursor:not-allowed}.bridgerte__hoverbar-button:focus-visible{box-shadow:0 0 0 2px var(--bridgerte-color-active-bg);outline:none}.bridgerte__hoverbar-button>svg,.bridgerte__hoverbar-button>.bridgerte__menu-icon-text{width:calc(var(--bridgerte-hoverbar-button-size) - 12px);height:calc(var(--bridgerte-hoverbar-button-size) - 12px);flex:none}.bridgerte__dialog-backdrop{z-index:var(--bridgerte-z-index-toolbar);opacity:0;pointer-events:none;background:0 0;position:fixed;top:0;right:0;bottom:0;left:0}.bridgerte__dialog-backdrop[data-visible=true]{opacity:1;pointer-events:auto}.bridgerte__dialog{z-index:calc(var(--bridgerte-z-index-toolbar) + 2);width:min(220px,100vw - 24px);max-height:calc(var(--bridgerte-dialog-visible-height,100vh) - 32px);opacity:0;border:1px solid var(--bridgerte-color-border);border-radius:var(--bridgerte-radius);color:var(--bridgerte-color-text);background:var(--bridgerte-color-panel);box-shadow:var(--bridgerte-shadow-panel);font:inherit;pointer-events:none;transition:opacity .12s,transform .12s;display:grid;position:fixed;top:0;left:0;transform:translateY(-4px)scale(.98)}.bridgerte__dialog[data-visible=true]{opacity:1;pointer-events:auto;transform:translateY(0)scale(1)}.bridgerte__code-block-menu{width:min(var(--bridgerte-dialog-anchor-width),calc(100vw - 24px));max-height:min(360px,calc(var(--bridgerte-dialog-visible-height,100vh) - 32px));border-color:var(--bridgerte-color-border);background:var(--bridgerte-color-panel);box-shadow:var(--bridgerte-shadow-popup)}.bridgerte__code-block-menu .bridgerte__dialog-content{min-height:0;max-height:inherit;overflow:hidden}.bridgerte__code-block-menu-list{max-height:min(340px,calc(var(--bridgerte-dialog-visible-height,100vh) - 48px));overscroll-behavior:contain;scrollbar-width:thin;touch-action:pan-y;-webkit-overflow-scrolling:touch;gap:2px;padding:8px;display:grid;overflow-y:auto}.bridgerte__code-block-menu-item{min-height:var(--bridgerte-payload-panel-field-height);border-radius:calc(var(--bridgerte-radius) - 2px);padding:0 12px}.bridgerte__payload-panel{padding:6px}.bridgerte__payload-panel-title{min-height:var(--bridgerte-payload-panel-title-height);color:var(--bridgerte-color-text);justify-content:space-between;align-items:center;gap:8px;padding:2px 4px 6px;font-size:13px;font-weight:700;line-height:1.2;display:flex}.bridgerte__payload-panel-clear{color:var(--bridgerte-color-text-muted);font:inherit;text-align:right;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;background:0 0;border:0;flex:none;padding:0;font-size:12px;font-weight:600;line-height:1}.bridgerte__payload-panel-clear:focus-visible{color:var(--bridgerte-color-primary);text-underline-offset:.18em;outline:none;text-decoration:underline}.bridgerte__payload-panel-field{gap:7px;display:grid}.bridgerte__payload-panel-option-list{gap:2px;display:grid}.bridgerte__payload-panel-color-picker{width:calc(var(--bridgerte-payload-panel-color-wheel-size) + var(--bridgerte-payload-panel-color-swatch-width) * 2 + 20px);justify-self:center;place-items:center;max-width:100%;display:grid;position:relative}.bridgerte__payload-panel-color-wheel{width:var(--bridgerte-payload-panel-color-wheel-size);aspect-ratio:1;border:1px solid var(--bridgerte-color-border);background:radial-gradient(circle,var(--bridgerte-color-bg) 0%,transparent 68%),conic-gradient(from 90deg,red,#ff0,#0f0,#0ff,#00f,#f0f,red);cursor:crosshair;touch-action:none;border-radius:999px;position:relative}.bridgerte__payload-panel-color-wheel:focus-visible{box-shadow:0 0 0 3px var(--bridgerte-color-active-bg);outline:none}.bridgerte__payload-panel-color-wheel-handle{width:var(--bridgerte-payload-panel-color-handle-size);height:var(--bridgerte-payload-panel-color-handle-size);border:2px solid var(--bridgerte-color-bg);box-shadow:0 0 0 1px var(--bridgerte-color-border),var(--bridgerte-shadow-panel);opacity:0;pointer-events:none;border-radius:999px;position:absolute;transform:translate(-50%,-50%)}.bridgerte__payload-panel-color-wheel[data-active=true] .bridgerte__payload-panel-color-wheel-handle{opacity:1}.bridgerte__payload-panel-color-preview{border:1px solid var(--bridgerte-color-border);border-radius:calc(var(--bridgerte-radius) - 2px);min-height:24px;box-shadow:inset 0 0 0 1px var(--bridgerte-color-panel)}.bridgerte__payload-panel-color-preview[data-empty=true]{background:linear-gradient(45deg,transparent 45%,var(--bridgerte-color-border) 45%,var(--bridgerte-color-border) 55%,transparent 55%),linear-gradient(-45deg,transparent 45%,var(--bridgerte-color-border) 45%,var(--bridgerte-color-border) 55%,transparent 55%),var(--bridgerte-color-bg);background-position:50%;background-size:12px 12px}.bridgerte__payload-panel-color-actions{align-items:center;gap:6px;display:flex}.bridgerte__payload-panel-color-actions[data-layout=sides]{pointer-events:none;justify-content:space-between;position:absolute;top:0;right:0;bottom:0;left:0}.bridgerte__payload-panel-color-actions[data-layout=grid]{flex-wrap:wrap;justify-content:center;margin-top:6px}.bridgerte__payload-panel-color-swatch{width:var(--bridgerte-payload-panel-color-swatch-width);height:var(--bridgerte-payload-panel-color-swatch-height);border:1px solid var(--bridgerte-color-border);border-radius:calc(var(--bridgerte-radius) - 2px);background:var(--bridgerte-color-bg);box-shadow:inset 0 0 0 1px var(--bridgerte-color-panel);cursor:pointer;pointer-events:auto;touch-action:manipulation;-webkit-tap-highlight-color:transparent;padding:0}.bridgerte__payload-panel-color-swatch:focus-visible{border-color:var(--bridgerte-color-primary);box-shadow:inset 0 0 0 1px var(--bridgerte-color-bg),0 0 0 2px var(--bridgerte-color-active-bg);outline:none}.bridgerte__payload-panel-text-field{color:var(--bridgerte-color-text-muted);gap:5px;font-size:12px;font-weight:600;line-height:1.2;display:grid}.bridgerte__payload-panel-text-input{width:100%;min-height:var(--bridgerte-payload-panel-field-height);border:1px solid var(--bridgerte-color-border);border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-text);background:var(--bridgerte-color-bg);font:inherit;-webkit-tap-highlight-color:transparent;padding:0 10px;font-size:13px}.bridgerte__payload-panel-text-input:focus-visible{border-color:var(--bridgerte-color-active-bg);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg);outline:none}.bridgerte__payload-panel-table-grid{grid-template-columns:repeat(var(--bridgerte-payload-panel-table-cols),var(--bridgerte-payload-panel-table-cell-size));touch-action:none;-webkit-tap-highlight-color:transparent;justify-content:center;gap:2px;max-width:100%;padding:2px;display:grid}.bridgerte__payload-panel-table-cell{width:var(--bridgerte-payload-panel-table-cell-size);height:var(--bridgerte-payload-panel-table-cell-size);border:1px solid var(--bridgerte-color-border);border-radius:calc(var(--bridgerte-radius) - 4px);background:var(--bridgerte-color-bg);cursor:pointer;-webkit-tap-highlight-color:transparent;padding:0}.bridgerte__payload-panel-table-cell[data-active=true]{border-color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-table-cell:focus-visible{border-color:var(--bridgerte-color-primary);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg);outline:none}.bridgerte__payload-panel-table-status{min-height:18px;color:var(--bridgerte-color-text-muted);text-align:center;font-size:12px;font-weight:600;line-height:1.5}.bridgerte__payload-panel-submit{min-height:var(--bridgerte-payload-panel-field-height);border:1px solid var(--bridgerte-color-border);border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-bg);background:var(--bridgerte-color-primary);font:inherit;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;padding:0 10px;font-size:13px;font-weight:700}.bridgerte__payload-panel-submit:focus-visible{box-shadow:0 0 0 2px var(--bridgerte-color-active-bg);outline:none}.bridgerte__payload-panel-option{min-height:var(--bridgerte-payload-panel-option-height);border-radius:calc(var(--bridgerte-radius) - 2px);color:var(--bridgerte-color-text);font:inherit;text-align:left;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;background:0 0;border:0;align-items:center;padding:0 7px;display:flex}.bridgerte__payload-panel-option[data-active=true]{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-option:focus-visible{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg);outline:none}@media(hover:hover)and (pointer:fine){.bridgerte__code-block-control:hover{color:var(--bridgerte-color-text-muted);background:var(--bridgerte-color-panel)}.bridgerte__toolbar-button:hover{border-color:var(--bridgerte-color-active-bg);color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__code-block-menu-item:hover,.bridgerte__media-controls-button:hover,.bridgerte__table-controls-button:hover,.bridgerte__hoverbar-button:hover,.bridgerte__payload-panel-option:hover,.bridgerte__mention-item:hover,.bridgerte__slash-command-item:hover,.bridgerte__menu-item:hover{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-clear:hover{color:var(--bridgerte-color-primary)}.bridgerte__payload-panel-color-wheel:hover{box-shadow:0 0 0 3px var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-table-cell:hover{border-color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-color-swatch:hover{border-color:var(--bridgerte-color-primary);box-shadow:inset 0 0 0 1px var(--bridgerte-color-bg),0 0 0 2px var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-submit:hover{border-color:var(--bridgerte-color-primary);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg)}}@media(hover:none),(pointer:coarse){.bridgerte__code-block-control:active,.bridgerte__code-block-control[data-pressed=true]{color:var(--bridgerte-color-text-muted);background:var(--bridgerte-color-panel)}.bridgerte__toolbar-button:active,.bridgerte__toolbar-button[data-pressed=true]{border-color:var(--bridgerte-color-active-bg);color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__code-block-menu-item:active,.bridgerte__code-block-menu-item[data-pressed=true],.bridgerte__media-controls-button:active,.bridgerte__media-controls-button[data-pressed=true],.bridgerte__table-controls-button:active,.bridgerte__table-controls-button[data-pressed=true],.bridgerte__hoverbar-button:active,.bridgerte__hoverbar-button[data-pressed=true],.bridgerte__payload-panel-option:active,.bridgerte__payload-panel-option[data-pressed=true],.bridgerte__mention-item:active,.bridgerte__mention-item[data-pressed=true],.bridgerte__slash-command-item:active,.bridgerte__slash-command-item[data-pressed=true],.bridgerte__menu-item[data-pressed=true],.bridgerte__menu-item:active{color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-clear:active,.bridgerte__payload-panel-clear[data-pressed=true]{color:var(--bridgerte-color-primary)}.bridgerte__payload-panel-color-wheel:active,.bridgerte__payload-panel-color-wheel[data-pressed=true]{box-shadow:0 0 0 3px var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-table-cell:active,.bridgerte__payload-panel-table-cell[data-pressed=true]{border-color:var(--bridgerte-color-primary);background:var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-color-swatch:active,.bridgerte__payload-panel-color-swatch[data-pressed=true]{border-color:var(--bridgerte-color-primary);box-shadow:inset 0 0 0 1px var(--bridgerte-color-bg),0 0 0 2px var(--bridgerte-color-active-bg)}.bridgerte__payload-panel-submit:active,.bridgerte__payload-panel-submit[data-pressed=true]{border-color:var(--bridgerte-color-primary);box-shadow:0 0 0 2px var(--bridgerte-color-active-bg)}}@media(max-width:760px){.bridgerte{min-height:220px}.bridgerte__toolbar-button{min-width:38px;height:38px}}
|
package/dist/webview.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-B_g23O7q.cjs");exports.createWebViewBridgeRuntime=e.createWebViewBridgeRuntime;
|
|
2
2
|
//# sourceMappingURL=webview.cjs.map
|
package/dist/webview.d.ts
CHANGED
|
@@ -182,7 +182,7 @@ export type ToolbarGroupConfig = {
|
|
|
182
182
|
/**
|
|
183
183
|
* toolbar JSON 配置项。
|
|
184
184
|
*
|
|
185
|
-
* 字符串使用 `MenuItem.id`;特殊字符串 `|`
|
|
185
|
+
* 字符串使用 `MenuItem.id`;特殊字符串 `|` 表示分割线,收纳菜单用对象配置显式声明。
|
|
186
186
|
*/
|
|
187
187
|
export type ToolbarKey = string | ToolbarGroupConfig;
|
|
188
188
|
/**
|
|
@@ -513,7 +513,6 @@ export type SlashCommandItem = {
|
|
|
513
513
|
icon?: string;
|
|
514
514
|
description?: string;
|
|
515
515
|
keywords?: string[];
|
|
516
|
-
group?: string;
|
|
517
516
|
requiresPayload?: boolean;
|
|
518
517
|
payloadPanel?: PayloadPanelSchema;
|
|
519
518
|
};
|
|
@@ -579,7 +578,6 @@ export type MenuItem = {
|
|
|
579
578
|
command: EditorCommand;
|
|
580
579
|
label: string;
|
|
581
580
|
icon: string;
|
|
582
|
-
group: 'text' | 'style' | 'block' | 'list' | 'align' | 'insert' | 'media' | 'table' | 'history' | 'view';
|
|
583
581
|
requiresPayload?: boolean;
|
|
584
582
|
payloadPanel?: PayloadPanelSchema;
|
|
585
583
|
children?: MenuItem[];
|
package/dist/webview.js
CHANGED
package/package.json
CHANGED
package/dist/index-5d8qaSP5.cjs
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"use strict";const O=require("./native-spec.cjs"),m=require("./index-DKalD8mx.cjs"),j={toolbarGroup:`
|
|
2
|
-
<svg
|
|
3
|
-
aria-hidden="true"
|
|
4
|
-
class="lucide lucide-ellipsis"
|
|
5
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
6
|
-
width="18"
|
|
7
|
-
height="18"
|
|
8
|
-
viewBox="0 0 24 24"
|
|
9
|
-
fill="none"
|
|
10
|
-
stroke="currentColor"
|
|
11
|
-
stroke-width="2"
|
|
12
|
-
stroke-linecap="round"
|
|
13
|
-
stroke-linejoin="round"
|
|
14
|
-
>
|
|
15
|
-
<circle cx="12" cy="12" r="1" />
|
|
16
|
-
<circle cx="19" cy="12" r="1" />
|
|
17
|
-
<circle cx="5" cy="12" r="1" />
|
|
18
|
-
</svg>
|
|
19
|
-
`,chevronDown:`
|
|
20
|
-
<svg
|
|
21
|
-
aria-hidden="true"
|
|
22
|
-
class="lucide lucide-chevron-down"
|
|
23
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
24
|
-
width="12"
|
|
25
|
-
height="12"
|
|
26
|
-
viewBox="0 0 24 24"
|
|
27
|
-
fill="none"
|
|
28
|
-
stroke="currentColor"
|
|
29
|
-
stroke-width="2"
|
|
30
|
-
stroke-linecap="round"
|
|
31
|
-
stroke-linejoin="round"
|
|
32
|
-
>
|
|
33
|
-
<path d="m6 9 6 6 6-6" />
|
|
34
|
-
</svg>
|
|
35
|
-
`},$=e=>Array.from(e.querySelectorAll(".bridgerte__toolbar-group-menu-item")).filter(t=>!t.disabled),ee=(e,t)=>{const i=$(e)[t];i&&i.focus()},te=e=>{ee(e,0)},oe=(e,t,s,i,p)=>{var l,c;const a=$(t),n=document.activeElement instanceof HTMLButtonElement?a.indexOf(document.activeElement):-1,u=f=>{var h;if(a.length===0)return;const g=((n>=0?n:0)+f+a.length)%a.length;(h=a[g])==null||h.focus()};switch(e.key){case"ArrowDown":e.preventDefault(),u(1);break;case"ArrowUp":e.preventDefault(),u(-1);break;case"Home":e.preventDefault(),(l=a[0])==null||l.focus();break;case"End":e.preventDefault(),(c=a.at(-1))==null||c.focus();break;case"Enter":case" ":document.activeElement instanceof HTMLButtonElement&&(e.preventDefault(),i(document.activeElement),p(),s.focus());break;case"Escape":e.preventDefault(),s.focus(),p();break}},M="button[data-bridgerte-toolbar-group-id]",ne="button[data-bridgerte-toolbar-item-id]",re=[ne,".bridgerte__toolbar-group-menu-item"].join(","),ae=(e,t)=>{const s=e.map(i=>m.getMenuStateForItem(i,t));return{active:s.some(i=>i.active),disabled:s.length>0&&s.every(i=>i.disabled)}},se=(e,t,s,i,p)=>{const a=m.getMenuStateForItem(t,s),n=document.createElement("button"),u=i[t.icon]??m.defaultMenuIcons[t.icon];n.type="button",n.className="bridgerte__toolbar-button",n.disabled=a.disabled,n.dataset.active=String(a.active),n.dataset.bridgerteToolbarItemId=t.id,n.setAttribute("aria-label",t.label),n.setAttribute("aria-pressed",String(a.active)),p&&(n.dataset.tooltip=t.label),m.appendMenuIcon(n,u,t.label),e.append(n)},le=(e,t,s,i,p)=>{const a=document.createElement("button"),n=ae(t.items,s),u=t.icon?i[t.icon]??m.defaultMenuIcons[t.icon]:j.toolbarGroup,l=document.createElement("span");a.type="button",a.className="bridgerte__toolbar-button bridgerte__toolbar-group-button",a.disabled=n.disabled,a.dataset.active=String(n.active),a.dataset.bridgerteToolbarGroupId=t.key,a.dataset.open="false",a.setAttribute("aria-label",t.title),a.setAttribute("aria-haspopup","menu"),a.setAttribute("aria-expanded","false"),a.setAttribute("aria-pressed",String(n.active)),p&&(a.dataset.tooltip=t.title),m.appendMenuIcon(a,u,t.title),l.className="bridgerte__toolbar-group-indicator",l.setAttribute("aria-hidden","true"),l.innerHTML=j.chevronDown,a.append(l),e.append(a)},ie=(e,t,s,i,p)=>{e.textContent="";let a="",n=null;t.forEach(u=>{if(u.type==="separator"){a="",n=null;const f=document.createElement("span");f.className="bridgerte__toolbar-separator",f.dataset.separatorId=u.key,f.setAttribute("aria-hidden","true"),e.append(f);return}const l=u.type==="button"?u.item.group:u.key;(!n||a!==l)&&(a=l,n=document.createElement("div"),n.className="bridgerte__toolbar-group",n.dataset.group=l,u.type==="group"&&n.setAttribute("aria-label",u.title),e.append(n));const c=n;if(u.type==="button"){se(c,u.item,s,i,p);return}le(c,u,s,i,p)})},C=(e,t,s,i)=>{if(e.textContent="",!t){e.dataset.visible="false";return}t.items.forEach(p=>{const a=m.getMenuStateForItem(p,s),n=document.createElement("button"),u=i[p.icon]??m.defaultMenuIcons[p.icon],l=document.createElement("span");n.type="button",n.className="bridgerte__menu-item bridgerte__toolbar-group-menu-item",n.disabled=a.disabled,n.dataset.active=String(a.active),n.dataset.bridgerteToolbarItemId=p.id,n.setAttribute("role","menuitem"),n.setAttribute("aria-label",p.label),n.setAttribute("aria-pressed",String(a.active)),m.appendMenuIcon(n,u,p.label),l.className="bridgerte__toolbar-group-menu-label",l.textContent=p.label,n.append(l),e.append(n)}),e.dataset.visible="true",e.style.minWidth=`${t.button.offsetWidth}px`},B=(e,t)=>{e.querySelectorAll(M).forEach(s=>{const i=(t==null?void 0:t.groupKey)===s.dataset.bridgerteToolbarGroupId;s.dataset.open=String(i),s.setAttribute("aria-expanded",String(i))})},X=(e,t)=>e.find(s=>s.type==="group"&&s.key===t),ue=4,ce=8,de=6,pe=()=>{var e;return typeof window<"u"&&((e=window.matchMedia)==null?void 0:e.call(window,"(hover: hover) and (pointer: fine)").matches)===!0},S=e=>{const t=e instanceof Element?e.closest(re):null;return t instanceof HTMLButtonElement?t:null},be=e=>{const t=e instanceof Element?e.closest(M):null;return t instanceof HTMLButtonElement?t:null};function me(e,t){const s=t.placement??"top",i=m.resolveMenuSchemaForDom(t.menuSchema??O.defaultMenuSchema,{menuLabels:t.menuLabels,payloadPanelConfig:t.payloadPanelConfig}),p=O.resolveToolbarMenu(t.toolbarConfig,i),a=p.flatMap(o=>o.type==="button"?[o.item]:o.type==="group"?o.items:[]),n=t.icons??{},u=pe(),l=document.createElement("div"),c=document.createElement("div"),f=e.closest(".bridgerte")??e;let T=!1,g=null,h=!1,x=t.editor.getCommandStates(),d=null,v=null;const V=m.bindTouchPressedState(e,{targetSelector:["button[data-bridgerte-toolbar-item-id]","button[data-bridgerte-toolbar-group-id]"].join(",")}),W=m.bindTouchPressedState(c,{targetSelector:".bridgerte__toolbar-group-menu-item"}),D=()=>{f.append(l),f.append(c)},k=()=>{v==null||v.setOpen(!1),v==null||v.destroy(),v=null},G=()=>{d&&(k(),v=m.createFloatingLayer(d.button,c,{placement:s==="bottom"?"top-start":"bottom-start",offset:de,strategy:"fixed"}),v.setOpen(!0))},y=()=>{k(),d=null,C(c,d,x,n),B(e,d)},A=o=>{if(!T&&(x=o,d&&k(),ie(e,p,o,n,u),D(),d)){const r=Array.from(e.querySelectorAll(M)).find(Z=>Z.dataset.bridgerteToolbarGroupId===(d==null?void 0:d.groupKey)),b=X(p,d.groupKey);d=r&&b?{groupKey:d.groupKey,button:r,items:b.items}:null,C(c,d,x,n),B(e,d),d&&G()}},z=()=>{T||A(t.editor.getCommandStates())},E=()=>{l.dataset.visible="false",l.textContent=""},J=o=>{const r=o.dataset.tooltip;if(!u||!r||g)return;const b=o.getBoundingClientRect();l.textContent=r,l.dataset.visible="true",l.style.left=`${b.left+b.width/2}px`,l.style.top=`${b.top-ce}px`},P=o=>{const r=S(o.target);r&&J(r)},I=o=>{const r=o.relatedTarget,b=S(o.target);b&&r instanceof Node&&b.contains(r)||E()},H=()=>{g=null,delete e.dataset.dragging,document.removeEventListener("pointermove",N),document.removeEventListener("pointerup",L),document.removeEventListener("pointercancel",L)},N=o=>{if(!g)return;const r=g.startClientX-o.clientX;Math.abs(r)>ue&&(g.hasDragged=!0,h=!0,E(),y()),e.scrollLeft=g.startScrollLeft+r},L=o=>{const r=g;H(),r&&o.type!=="pointercancel"&&r.pointerType!=="mouse"&&!r.hasDragged&&r.startButton&&(_(r.startButton),h=!0)},F=o=>{if(o.pointerType==="mouse"&&o.button!==0)return;const r=S(o.target);o.preventDefault(),g={startClientX:o.clientX,startScrollLeft:e.scrollLeft,pointerType:o.pointerType,hasDragged:!1,startButton:r??void 0},e.dataset.dragging="true",E(),document.addEventListener("pointermove",N),document.addEventListener("pointerup",L),document.addEventListener("pointercancel",L)},_=o=>{if(!(o instanceof HTMLButtonElement)||o.disabled)return;const r=a.find(b=>b.id===o.dataset.bridgerteToolbarItemId);if(r){if(r.payloadPanel){const b=o.getBoundingClientRect();t.editor.requestPayloadPanel({menuId:r.id,command:r.command,panel:r.payloadPanel,currentValues:m.getPayloadPanelCurrentValues(r,t.editor.getCommandStates()),anchorRect:{x:b.left,y:b.top,width:b.width,height:b.height}});return}t.editor.executeCommand(r.command)}},Q=o=>{const r=X(p,o.dataset.bridgerteToolbarGroupId);if(!(!r||o.disabled)){if((d==null?void 0:d.groupKey)===r.key){y();return}d={groupKey:r.key,button:o,items:r.items},E(),C(c,d,x,n),B(e,d),G(),te(c)}},w=o=>{if(h){h=!1,o.preventDefault(),o.stopPropagation();return}const r=be(o.target);if(r){o.preventDefault(),o.stopPropagation(),Q(r);return}const b=S(o.target);b&&(o.preventDefault(),o.stopPropagation(),_(b),y())},K=o=>{o.pointerType==="mouse"&&o.button!==0||o.preventDefault()},R=o=>{const r=o.target;r instanceof Node&&(e.contains(r)||c.contains(r))||y()},q=o=>{if(d&&c.contains(document.activeElement)){oe(o,c,d.button,_,y);return}o.key==="Escape"&&y()};e.classList.add("bridgerte__toolbar"),l.className="bridgerte__toolbar-tooltip",l.dataset.visible="false",c.className="bridgerte__floating-menu bridgerte__toolbar-group-menu",c.dataset.visible="false",c.setAttribute("role","menu"),e.dataset.placement=s,e.setAttribute("role","toolbar"),e.setAttribute("aria-label",s==="bottom"?"BridgeRTE tabbar":"BridgeRTE toolbar"),e.addEventListener("pointerdown",F,!0),e.addEventListener("click",w),c.addEventListener("pointerdown",K,!0),c.addEventListener("click",w),document.addEventListener("click",R),document.addEventListener("keydown",q),u&&(e.addEventListener("mouseover",P),e.addEventListener("mouseout",I)),e.addEventListener("focusout",E),D();const Y=t.editor.subscribeCommandStateChange(A);return{update:z,destroy(){T||(T=!0,H(),Y(),y(),e.removeEventListener("pointerdown",F,!0),e.removeEventListener("click",w),c.removeEventListener("pointerdown",K,!0),c.removeEventListener("click",w),document.removeEventListener("click",R),document.removeEventListener("keydown",q),u&&(e.removeEventListener("mouseover",P),e.removeEventListener("mouseout",I)),V(),W(),e.removeEventListener("focusout",E),l.remove(),c.remove(),e.classList.remove("bridgerte__toolbar"),delete e.dataset.placement,e.textContent="",e.removeAttribute("role"),e.removeAttribute("aria-label"))}}}const ge=/[\u200B-\u200D\uFEFF]/g,fe=["img","video","audio","iframe","table","pre","code","hr","figure","canvas","svg","math",'[data-type="mention"]'].join(","),U=e=>(e==null?void 0:e.replace(ge,"").trim())??"",ve=e=>{if(!U(e))return!1;const t=document.createElement("template");return t.innerHTML=e,!!(U(t.content.textContent)||t.content.querySelector(fe))};exports.createRichTextToolbar=me;exports.hasMeaningfulHtmlContent=ve;
|
|
36
|
-
//# sourceMappingURL=index-5d8qaSP5.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-5d8qaSP5.cjs","sources":["../../dom/src/menuIcon/uiIcons.ts","../../dom/src/richTextToolbar/groupMenuKeyboard.ts","../../dom/src/richTextToolbar/render.ts","../../dom/src/richTextToolbar/index.ts","../../dom/src/htmlContent/index.ts"],"sourcesContent":["/**\r\n * DOM UI chrome icon 表。\r\n *\r\n * 这里放 toolbar 收纳入口、下拉箭头这类控件自身图标。它们不属于 `MenuItem.icon`\r\n * 跨端 schema,也不应该进入 `defaultMenuIcons` 的 schema 对齐检查。\r\n */\r\nexport const defaultMenuUiIcons = {\r\n toolbarGroup: `\r\n <svg\r\n aria-hidden=\"true\"\r\n class=\"lucide lucide-ellipsis\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\r\n <circle cx=\"19\" cy=\"12\" r=\"1\" />\r\n <circle cx=\"5\" cy=\"12\" r=\"1\" />\r\n </svg>\r\n `,\r\n chevronDown: `\r\n <svg\r\n aria-hidden=\"true\"\r\n class=\"lucide lucide-chevron-down\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"12\"\r\n height=\"12\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path d=\"m6 9 6 6 6-6\" />\r\n </svg>\r\n `\r\n} as const;\r\n","export const getEnabledGroupMenuButtons = (menuElement: HTMLElement) => (\r\n Array.from(\r\n menuElement.querySelectorAll<HTMLButtonElement>('.bridgerte__toolbar-group-menu-item')\r\n ).filter((button) => !button.disabled)\r\n);\r\n\r\nexport const focusToolbarGroupMenuItem = (menuElement: HTMLElement, index: number) => {\r\n const buttons = getEnabledGroupMenuButtons(menuElement);\r\n const nextButton = buttons[index];\r\n\r\n if (nextButton) nextButton.focus();\r\n};\r\n\r\nexport const focusFirstToolbarGroupMenuItem = (menuElement: HTMLElement) => {\r\n /*\r\n * group menu 使用 ARIA menu 语义,打开后焦点必须进入第一个可操作项。\r\n * 这样键盘用户可以继续用方向键浏览,而不是停留在展开按钮上。\r\n */\r\n focusToolbarGroupMenuItem(menuElement, 0);\r\n};\r\n\r\nexport const handleToolbarGroupMenuKeyDown = (\r\n event: KeyboardEvent,\r\n menuElement: HTMLElement,\r\n returnButton: HTMLButtonElement,\r\n executeToolbarButton: (button: HTMLButtonElement) => void,\r\n closeGroupMenu: () => void\r\n) => {\r\n const buttons = getEnabledGroupMenuButtons(menuElement);\r\n const activeIndex = document.activeElement instanceof HTMLButtonElement\r\n ? buttons.indexOf(document.activeElement)\r\n : -1;\r\n const focusByOffset = (offset: number) => {\r\n if (buttons.length === 0) return;\r\n\r\n const baseIndex = activeIndex >= 0 ? activeIndex : 0;\r\n const nextIndex = (baseIndex + offset + buttons.length) % buttons.length;\r\n\r\n buttons[nextIndex]?.focus();\r\n };\r\n\r\n /*\r\n * ARIA menu 语义要求支持 roving focus。这里不改 toolbar 的横向键盘模型,\r\n * 只在已打开的纵向收纳菜单内处理上下方向、首尾跳转和执行/关闭。\r\n */\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n focusByOffset(1);\r\n break;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n focusByOffset(-1);\r\n break;\r\n case 'Home':\r\n event.preventDefault();\r\n buttons[0]?.focus();\r\n break;\r\n case 'End':\r\n event.preventDefault();\r\n buttons.at(-1)?.focus();\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n if (document.activeElement instanceof HTMLButtonElement) {\r\n event.preventDefault();\r\n executeToolbarButton(document.activeElement);\r\n closeGroupMenu();\r\n returnButton.focus();\r\n }\r\n break;\r\n case 'Escape':\r\n event.preventDefault();\r\n returnButton.focus();\r\n closeGroupMenu();\r\n break;\r\n default:\r\n break;\r\n }\r\n};\r\n","import type { CommandState } from '@bridgerte/core';\r\nimport type { MenuItem, ResolvedToolbarItem } from '@bridgerte/native-spec';\r\nimport {\r\n appendMenuIcon,\r\n defaultMenuIcons,\r\n defaultMenuUiIcons\r\n} from './icons';\r\nimport { getMenuStateForItem } from '../menuRuntime';\r\nimport type {\r\n RichTextToolbarIcons,\r\n ToolbarGroupMenuState\r\n} from './type';\r\n\r\nexport const toolbarGroupButtonSelector = 'button[data-bridgerte-toolbar-group-id]';\r\nexport const toolbarButtonSelector = 'button[data-bridgerte-toolbar-item-id]';\r\n// 可执行按钮同时覆盖 toolbar 主按钮和 group menu 子项,避免浮层子菜单绕过统一命令入口。\r\nexport const toolbarExecutableButtonSelector = [\n toolbarButtonSelector,\n '.bridgerte__toolbar-group-menu-item'\n].join(',');\n\r\nconst getGroupMenuState = (items: MenuItem[], commandStates: CommandState[]) => {\r\n const itemStates = items.map((item) => getMenuStateForItem(item, commandStates));\r\n\r\n return {\r\n active: itemStates.some((state) => state.active),\r\n disabled: itemStates.length > 0 && itemStates.every((state) => state.disabled)\r\n };\r\n};\r\n\r\nconst renderToolbarButton = (\r\n groupElement: HTMLElement,\r\n item: MenuItem,\r\n commandStates: CommandState[],\r\n icons: RichTextToolbarIcons,\r\n enableTooltip: boolean\r\n) => {\r\n const state = getMenuStateForItem(item, commandStates);\r\n const button = document.createElement('button');\r\n // icon 兜底顺序固定为:业务覆盖 > DOM 默认 SVG > label 文本。\r\n const iconSvg = icons[item.icon] ?? defaultMenuIcons[item.icon];\r\n\r\n button.type = 'button';\r\n button.className = 'bridgerte__toolbar-button';\r\n button.disabled = state.disabled;\r\n button.dataset.active = String(state.active);\r\n button.dataset.bridgerteToolbarItemId = item.id;\r\n button.setAttribute('aria-label', item.label);\r\n button.setAttribute('aria-pressed', String(state.active));\r\n if (enableTooltip) button.dataset.tooltip = item.label;\r\n\r\n appendMenuIcon(button, iconSvg, item.label);\r\n\r\n groupElement.append(button);\r\n};\r\n\r\nconst renderToolbarGroupButton = (\r\n groupElement: HTMLElement,\r\n toolbarItem: Extract<ResolvedToolbarItem, { type: 'group' }>,\r\n commandStates: CommandState[],\r\n icons: RichTextToolbarIcons,\r\n enableTooltip: boolean\r\n) => {\r\n const button = document.createElement('button');\r\n const groupState = getGroupMenuState(toolbarItem.items, commandStates);\r\n const iconSvg = toolbarItem.icon\r\n ? icons[toolbarItem.icon] ?? defaultMenuIcons[toolbarItem.icon]\r\n : defaultMenuUiIcons.toolbarGroup;\r\n const indicator = document.createElement('span');\r\n\r\n button.type = 'button';\r\n button.className = 'bridgerte__toolbar-button bridgerte__toolbar-group-button';\r\n button.disabled = groupState.disabled;\r\n button.dataset.active = String(groupState.active);\r\n button.dataset.bridgerteToolbarGroupId = toolbarItem.key;\r\n button.dataset.open = 'false';\r\n button.setAttribute('aria-label', toolbarItem.title);\r\n button.setAttribute('aria-haspopup', 'menu');\r\n button.setAttribute('aria-expanded', 'false');\r\n button.setAttribute('aria-pressed', String(groupState.active));\r\n if (enableTooltip) button.dataset.tooltip = toolbarItem.title;\r\n\r\n appendMenuIcon(button, iconSvg, toolbarItem.title);\r\n\r\n indicator.className = 'bridgerte__toolbar-group-indicator';\r\n indicator.setAttribute('aria-hidden', 'true');\r\n indicator.innerHTML = defaultMenuUiIcons.chevronDown;\r\n button.append(indicator);\r\n groupElement.append(button);\r\n};\r\n\r\n/**\r\n * 渲染 toolbar 横向主入口。\r\n *\r\n * 字符串菜单渲染为按钮,`|` 渲染分割线,group 只渲染一个收纳入口;组内命令交给\r\n * renderToolbarGroupMenu 渲染,避免 `menuKeys` 退化成另一种横向分隔语法。\r\n */\r\nexport const renderToolbar = (\r\n toolbarElement: HTMLElement,\r\n toolbarItems: ResolvedToolbarItem[],\r\n commandStates: CommandState[],\r\n icons: RichTextToolbarIcons,\r\n enableTooltip: boolean\r\n) => {\r\n toolbarElement.textContent = '';\r\n\r\n let currentGroup = '';\r\n let groupElement: HTMLDivElement | null = null;\r\n\r\n toolbarItems.forEach((toolbarItem) => {\r\n if (toolbarItem.type === 'separator') {\r\n currentGroup = '';\r\n groupElement = null;\r\n\r\n const separatorElement = document.createElement('span');\r\n\r\n separatorElement.className = 'bridgerte__toolbar-separator';\r\n separatorElement.dataset.separatorId = toolbarItem.key;\r\n separatorElement.setAttribute('aria-hidden', 'true');\r\n toolbarElement.append(separatorElement);\r\n return;\r\n }\r\n\r\n const nextGroup = toolbarItem.type === 'button' ? toolbarItem.item.group : toolbarItem.key;\r\n\r\n if (!groupElement || currentGroup !== nextGroup) {\r\n currentGroup = nextGroup;\r\n groupElement = document.createElement('div');\r\n groupElement.className = 'bridgerte__toolbar-group';\r\n groupElement.dataset.group = nextGroup;\r\n if (toolbarItem.type === 'group') {\r\n groupElement.setAttribute('aria-label', toolbarItem.title);\r\n }\r\n toolbarElement.append(groupElement);\r\n }\r\n\r\n const activeGroupElement = groupElement;\r\n\r\n if (toolbarItem.type === 'button') {\r\n renderToolbarButton(\r\n activeGroupElement,\r\n toolbarItem.item,\r\n commandStates,\r\n icons,\r\n enableTooltip\r\n );\r\n return;\r\n }\r\n\r\n renderToolbarGroupButton(\r\n activeGroupElement,\r\n toolbarItem,\r\n commandStates,\r\n icons,\r\n enableTooltip\r\n );\r\n });\r\n};\r\n\r\n/**\r\n * 渲染 group button 打开的纵向收纳菜单。\r\n *\r\n * 浮层只展示 MenuItem 子项并复用现有 item id,点击执行仍由 index.ts 统一走 EditorAPI。\r\n */\r\nexport const renderToolbarGroupMenu = (\r\n menuElement: HTMLElement,\r\n groupMenuState: ToolbarGroupMenuState | null,\r\n commandStates: CommandState[],\r\n icons: RichTextToolbarIcons\r\n) => {\r\n menuElement.textContent = '';\r\n\r\n if (!groupMenuState) {\r\n menuElement.dataset.visible = 'false';\r\n return;\r\n }\r\n\r\n groupMenuState.items.forEach((item) => {\r\n const state = getMenuStateForItem(item, commandStates);\r\n const button = document.createElement('button');\r\n const iconSvg = icons[item.icon] ?? defaultMenuIcons[item.icon];\r\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;\r\n button.dataset.active = String(state.active);\r\n button.dataset.bridgerteToolbarItemId = item.id;\r\n button.setAttribute('role', 'menuitem');\r\n button.setAttribute('aria-label', item.label);\r\n button.setAttribute('aria-pressed', String(state.active));\r\n\r\n appendMenuIcon(button, iconSvg, item.label);\r\n labelElement.className = 'bridgerte__toolbar-group-menu-label';\r\n labelElement.textContent = item.label;\r\n button.append(labelElement);\r\n menuElement.append(button);\r\n });\r\n\r\n menuElement.dataset.visible = 'true';\r\n menuElement.style.minWidth = `${groupMenuState.button.offsetWidth}px`;\r\n};\r\n\r\nexport const syncToolbarGroupButtonState = (\r\n container: HTMLElement,\r\n groupMenuState: ToolbarGroupMenuState | null\r\n) => {\r\n container.querySelectorAll<HTMLButtonElement>(toolbarGroupButtonSelector).forEach((button) => {\r\n const open = groupMenuState?.groupKey === button.dataset.bridgerteToolbarGroupId;\r\n\r\n button.dataset.open = String(open);\r\n button.setAttribute('aria-expanded', String(open));\r\n });\r\n};\r\n\r\nexport const findToolbarGroupMenuItem = (\r\n toolbarItems: ResolvedToolbarItem[],\r\n groupKey: string | undefined\r\n) => toolbarItems.find((item): item is Extract<ResolvedToolbarItem, { type: 'group' }> => (\r\n item.type === 'group' && item.key === groupKey\r\n));\r\n","import type { CommandState } from '@bridgerte/core';\r\nimport {\r\n defaultMenuSchema,\r\n resolveToolbarMenu\r\n} from '@bridgerte/native-spec';\r\nimport { createFloatingLayer, type RichTextFloatingLayer } from '../floatingLayer';\r\nimport { bindTouchPressedState } from '../interactionState';\r\nimport {\r\n getPayloadPanelCurrentValues,\r\n resolveMenuSchemaForDom\r\n} from '../menuRuntime';\r\nimport {\r\n focusFirstToolbarGroupMenuItem,\r\n handleToolbarGroupMenuKeyDown\r\n} from './groupMenuKeyboard';\r\nimport {\r\n findToolbarGroupMenuItem,\r\n renderToolbar,\r\n renderToolbarGroupMenu,\r\n syncToolbarGroupButtonState,\r\n toolbarExecutableButtonSelector,\r\n toolbarGroupButtonSelector\r\n} from './render';\r\nimport type {\r\n RichTextToolbarAPI,\r\n ToolbarGroupMenuState,\r\n RichTextToolbarOptions,\r\n ToolbarDragState\r\n} from './type';\r\n\r\nconst toolbarDragClickThresholdPx = 4;\r\nconst toolbarTooltipOffsetPx = 8;\r\nconst toolbarGroupMenuOffsetPx = 6;\r\n\r\nexport type * from './type';\r\n\r\nconst canUseHoverTooltip = () => (\r\n typeof window !== 'undefined'\r\n && window.matchMedia?.('(hover: hover) and (pointer: fine)').matches === true\r\n);\r\n\r\nconst getToolbarButtonFromTarget = (target: EventTarget | null) => {\r\n /*\r\n * 图标覆盖常用 SVG,H5 pointer 事件可能落在 svg/path 上。\r\n * 这里用 Element 而不是 HTMLElement,保证触屏兜底和 click 都能向上命中真实按钮。\r\n */\r\n const button = target instanceof Element\r\n ? target.closest<HTMLButtonElement>(toolbarExecutableButtonSelector)\r\n : null;\r\n\r\n return button instanceof HTMLButtonElement ? button : null;\r\n};\r\n\r\nconst getToolbarGroupButtonFromTarget = (target: EventTarget | null) => {\r\n const button = target instanceof Element\r\n ? target.closest<HTMLButtonElement>(toolbarGroupButtonSelector)\r\n : null;\r\n\r\n return button instanceof HTMLButtonElement ? button : null;\r\n};\r\n\r\n/**\r\n * 创建独立菜单实例。\r\n *\r\n * toolbar/tabbar 只订阅 EditorAPI 状态并派发命令,不接触编辑器内部 DOM 或 Lexical 实例。\r\n */\r\nexport function createRichTextToolbar(\r\n container: HTMLElement,\r\n options: RichTextToolbarOptions\r\n): RichTextToolbarAPI {\r\n const placement = options.placement ?? 'top';\r\n const menuSchema = resolveMenuSchemaForDom(options.menuSchema ?? defaultMenuSchema, {\r\n menuLabels: options.menuLabels,\r\n payloadPanelConfig: options.payloadPanelConfig\r\n });\r\n const toolbarItems = resolveToolbarMenu(options.toolbarConfig, menuSchema);\r\n /*\r\n * click 事件只需要能执行命令的菜单项。分割线和 group 容器是渲染结构,\r\n * 先在这里摊平,后续点击时就不用理解 toolbarConfig 的展示层级。\r\n */\r\n const executableMenuItems = toolbarItems.flatMap((toolbarItem) => (\r\n toolbarItem.type === 'button' ? [toolbarItem.item]\r\n : toolbarItem.type === 'group' ? toolbarItem.items\r\n : []\r\n ));\r\n const icons = options.icons ?? {};\r\n /*\r\n * tooltip 只属于 PC 精细指针体验。H5 上即使没有原生 title,部分浏览器也会把 hover/mouseover\r\n * 模拟成首触摸状态,导致第一次点像是只唤醒提示;所以触屏端不写 tooltip 数据也不挂监听。\r\n */\r\n const enableTooltip = canUseHoverTooltip();\r\n const tooltipElement = document.createElement('div');\r\n const groupMenuElement = document.createElement('div');\r\n const overlayHost = container.closest('.bridgerte') ?? container;\r\n let destroyed = false;\r\n let dragState: ToolbarDragState | null = null;\r\n let shouldSuppressNextClick = false;\r\n let latestCommandStates = options.editor.getCommandStates();\r\n let groupMenuState: ToolbarGroupMenuState | null = null;\r\n let groupMenuFloatingLayer: RichTextFloatingLayer | null = null;\r\n const clearToolbarPressedState = bindTouchPressedState(container, {\r\n targetSelector: [\r\n 'button[data-bridgerte-toolbar-item-id]',\r\n 'button[data-bridgerte-toolbar-group-id]'\r\n ].join(',')\r\n });\r\n const clearGroupMenuPressedState = bindTouchPressedState(groupMenuElement, {\r\n targetSelector: '.bridgerte__toolbar-group-menu-item'\r\n });\r\n\r\n const mountToolbarOverlays = () => {\r\n // 独立 toolbar 可能不在 `.bridgerte` 内,渲染按钮会清空 container,需要把浮层重新挂回去。\r\n overlayHost.append(tooltipElement);\r\n overlayHost.append(groupMenuElement);\r\n };\r\n\r\n const closeGroupMenuFloatingLayer = () => {\r\n groupMenuFloatingLayer?.setOpen(false);\r\n groupMenuFloatingLayer?.destroy();\r\n groupMenuFloatingLayer = null;\r\n };\r\n\r\n const openGroupMenuFloatingLayer = () => {\r\n if (!groupMenuState) return;\r\n\r\n closeGroupMenuFloatingLayer();\r\n /*\r\n * group menu 和 hoverbar/mention/slash 一样属于轻浮层,必须走 floatingLayer。\r\n * 这里按 toolbar placement 给出首选方向,真正的翻转、键盘可视区和左右夹紧交给\r\n * createFloatingLayer 内部的 visualViewport + flip + shift + clamp 统一处理。\r\n */\r\n groupMenuFloatingLayer = createFloatingLayer(groupMenuState.button, groupMenuElement, {\r\n placement: placement === 'bottom' ? 'top-start' : 'bottom-start',\r\n offset: toolbarGroupMenuOffsetPx,\r\n strategy: 'fixed'\r\n });\r\n groupMenuFloatingLayer.setOpen(true);\r\n };\r\n\r\n const closeGroupMenu = () => {\r\n closeGroupMenuFloatingLayer();\r\n groupMenuState = null;\r\n renderToolbarGroupMenu(groupMenuElement, groupMenuState, latestCommandStates, icons);\r\n syncToolbarGroupButtonState(container, groupMenuState);\r\n };\r\n\r\n const renderStates = (states: CommandState[]) => {\r\n if (destroyed) return;\r\n\r\n latestCommandStates = states;\r\n if (groupMenuState) closeGroupMenuFloatingLayer();\r\n renderToolbar(container, toolbarItems, states, icons, enableTooltip);\r\n mountToolbarOverlays();\r\n if (groupMenuState) {\r\n const nextButton = Array.from(\r\n container.querySelectorAll<HTMLButtonElement>(toolbarGroupButtonSelector)\r\n ).find((button) => button.dataset.bridgerteToolbarGroupId === groupMenuState?.groupKey);\r\n const nextGroupItem = findToolbarGroupMenuItem(toolbarItems, groupMenuState.groupKey);\r\n\r\n groupMenuState = nextButton && nextGroupItem\r\n ? {\r\n groupKey: groupMenuState.groupKey,\r\n button: nextButton,\r\n items: nextGroupItem.items\r\n }\r\n : null;\r\n renderToolbarGroupMenu(groupMenuElement, groupMenuState, latestCommandStates, icons);\r\n syncToolbarGroupButtonState(container, groupMenuState);\r\n if (groupMenuState) openGroupMenuFloatingLayer();\r\n }\r\n };\r\n\r\n const update = () => {\r\n if (destroyed) return;\r\n\r\n renderStates(options.editor.getCommandStates());\r\n };\r\n\r\n const hideTooltip = () => {\r\n tooltipElement.dataset.visible = 'false';\r\n tooltipElement.textContent = '';\r\n };\r\n\r\n const showTooltip = (button: HTMLButtonElement) => {\r\n const tooltipText = button.dataset.tooltip;\r\n\r\n if (!enableTooltip || !tooltipText || dragState) return;\r\n\r\n const buttonRect = button.getBoundingClientRect();\r\n\r\n tooltipElement.textContent = tooltipText;\r\n tooltipElement.dataset.visible = 'true';\r\n tooltipElement.style.left = `${buttonRect.left + buttonRect.width / 2}px`;\r\n tooltipElement.style.top = `${buttonRect.top - toolbarTooltipOffsetPx}px`;\r\n };\r\n\r\n const handleTooltipTarget = (event: Event) => {\r\n const button = getToolbarButtonFromTarget(event.target);\r\n\r\n if (button) {\r\n showTooltip(button);\r\n }\r\n };\r\n\r\n const handleTooltipLeave = (event: MouseEvent) => {\r\n const relatedTarget = event.relatedTarget;\r\n const button = getToolbarButtonFromTarget(event.target);\r\n\r\n if (\r\n button\r\n && relatedTarget instanceof Node\r\n && button.contains(relatedTarget)\r\n ) return;\r\n\r\n hideTooltip();\r\n };\r\n\r\n const stopToolbarDrag = () => {\r\n dragState = null;\r\n\r\n delete container.dataset.dragging;\r\n // 拖动过程中监听挂在 document 上,松手或 destroy 必须统一清掉,避免离开 toolbar 后残留滚动状态。\r\n document.removeEventListener('pointermove', handlePointerMove);\r\n document.removeEventListener('pointerup', handlePointerUp);\r\n document.removeEventListener('pointercancel', handlePointerUp);\r\n };\r\n\r\n const handlePointerMove = (event: PointerEvent) => {\r\n if (!dragState) return;\r\n\r\n const deltaX = dragState.startClientX - event.clientX;\r\n\r\n if (Math.abs(deltaX) > toolbarDragClickThresholdPx) {\r\n dragState.hasDragged = true;\r\n shouldSuppressNextClick = true;\r\n hideTooltip();\r\n closeGroupMenu();\r\n }\r\n\r\n container.scrollLeft = dragState.startScrollLeft + deltaX;\r\n };\r\n\r\n const handlePointerUp = (event: PointerEvent) => {\r\n const currentDragState = dragState;\r\n\r\n stopToolbarDrag();\r\n if (\r\n currentDragState\r\n && event.type !== 'pointercancel'\r\n && currentDragState.pointerType !== 'mouse'\r\n && !currentDragState.hasDragged\r\n && currentDragState.startButton\r\n ) {\r\n executeToolbarButton(currentDragState.startButton);\r\n shouldSuppressNextClick = true;\r\n }\r\n };\r\n\r\n const handlePointerDown = (event: PointerEvent) => {\r\n if (event.pointerType === 'mouse' && event.button !== 0) return;\r\n\r\n const startButton = getToolbarButtonFromTarget(event.target);\r\n\r\n // 点击和拖动 toolbar 都要保留编辑区 selection,命令才能继续作用在原选区。\r\n event.preventDefault();\r\n dragState = {\r\n startClientX: event.clientX,\r\n startScrollLeft: container.scrollLeft,\r\n pointerType: event.pointerType,\r\n hasDragged: false,\r\n startButton: startButton ?? undefined\r\n };\r\n container.dataset.dragging = 'true';\r\n hideTooltip();\r\n // pointermove 放到 document,保证用户按住 X 轴拖出 toolbar 后仍能完成滚动和释放。\r\n document.addEventListener('pointermove', handlePointerMove);\r\n document.addEventListener('pointerup', handlePointerUp);\r\n document.addEventListener('pointercancel', handlePointerUp);\r\n };\r\n\r\n const executeToolbarButton = (button: HTMLButtonElement) => {\r\n if (!(button instanceof HTMLButtonElement) || button.disabled) return;\r\n\r\n const menuItem = executableMenuItems.find((item) => (\r\n item.id === button.dataset.bridgerteToolbarItemId\r\n ));\r\n\r\n if (!menuItem) return;\r\n\r\n if (menuItem.payloadPanel) {\r\n const buttonRect = button.getBoundingClientRect();\r\n\r\n /*\r\n * 带 payloadPanel 的菜单不直接执行基础 command,而是发起参数请求。\r\n * DOM 内置面板和业务/RN/Flutter 自绘都走同一个 request,避免后续颜色、\r\n * 字体、链接等参数菜单各自发明一套协议。\r\n */\r\n options.editor.requestPayloadPanel({\r\n menuId: menuItem.id,\r\n command: menuItem.command,\r\n panel: menuItem.payloadPanel,\r\n currentValues: getPayloadPanelCurrentValues(menuItem, options.editor.getCommandStates()),\r\n anchorRect: {\r\n x: buttonRect.left,\r\n y: buttonRect.top,\r\n width: buttonRect.width,\r\n height: buttonRect.height\r\n }\r\n });\r\n return;\r\n }\r\n\r\n options.editor.executeCommand(menuItem.command);\r\n };\r\n\r\n const toggleGroupMenu = (button: HTMLButtonElement) => {\r\n const groupItem = findToolbarGroupMenuItem(\r\n toolbarItems,\r\n button.dataset.bridgerteToolbarGroupId\r\n );\r\n\r\n if (!groupItem || button.disabled) return;\r\n\r\n if (groupMenuState?.groupKey === groupItem.key) {\r\n closeGroupMenu();\r\n return;\r\n }\r\n\r\n groupMenuState = {\r\n groupKey: groupItem.key,\r\n button,\r\n items: groupItem.items\r\n };\r\n hideTooltip();\r\n renderToolbarGroupMenu(groupMenuElement, groupMenuState, latestCommandStates, icons);\r\n syncToolbarGroupButtonState(container, groupMenuState);\r\n openGroupMenuFloatingLayer();\r\n focusFirstToolbarGroupMenuItem(groupMenuElement);\r\n };\r\n\r\n const handleClick = (event: MouseEvent) => {\r\n if (shouldSuppressNextClick) {\r\n shouldSuppressNextClick = false;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n\r\n const groupButton = getToolbarGroupButtonFromTarget(event.target);\r\n if (groupButton) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n toggleGroupMenu(groupButton);\r\n return;\r\n }\r\n\r\n const button = getToolbarButtonFromTarget(event.target);\r\n if (!button) return;\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n executeToolbarButton(button);\r\n closeGroupMenu();\r\n };\r\n\r\n const handleGroupMenuPointerDown = (event: PointerEvent) => {\r\n /*\r\n * group 菜单浮层挂在 toolbar 容器外,不能复用容器级 pointerdown。\r\n * 子菜单点击仍要保留编辑区 selection,否则格式命令会丢失原选区。\r\n */\r\n if (event.pointerType === 'mouse' && event.button !== 0) return;\r\n\r\n event.preventDefault();\r\n };\r\n\r\n const handleDocumentClick = (event: MouseEvent) => {\r\n const target = event.target;\r\n\r\n if (\r\n target instanceof Node\r\n && (container.contains(target) || groupMenuElement.contains(target))\r\n ) return;\r\n\r\n closeGroupMenu();\r\n };\r\n\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (groupMenuState && groupMenuElement.contains(document.activeElement)) {\r\n handleToolbarGroupMenuKeyDown(\r\n event,\r\n groupMenuElement,\r\n groupMenuState.button,\r\n executeToolbarButton,\r\n closeGroupMenu\r\n );\r\n return;\r\n }\r\n\r\n if (event.key !== 'Escape') return;\r\n\r\n closeGroupMenu();\r\n };\r\n\r\n container.classList.add('bridgerte__toolbar');\r\n tooltipElement.className = 'bridgerte__toolbar-tooltip';\r\n tooltipElement.dataset.visible = 'false';\r\n groupMenuElement.className = 'bridgerte__floating-menu bridgerte__toolbar-group-menu';\n groupMenuElement.dataset.visible = 'false';\r\n groupMenuElement.setAttribute('role', 'menu');\r\n container.dataset.placement = placement;\r\n container.setAttribute('role', 'toolbar');\r\n container.setAttribute(\r\n 'aria-label',\r\n placement === 'bottom' ? 'BridgeRTE tabbar' : 'BridgeRTE toolbar'\r\n );\r\n container.addEventListener('pointerdown', handlePointerDown, true);\r\n container.addEventListener('click', handleClick);\r\n groupMenuElement.addEventListener('pointerdown', handleGroupMenuPointerDown, true);\r\n groupMenuElement.addEventListener('click', handleClick);\r\n document.addEventListener('click', handleDocumentClick);\r\n document.addEventListener('keydown', handleKeyDown);\r\n if (enableTooltip) {\r\n container.addEventListener('mouseover', handleTooltipTarget);\r\n container.addEventListener('mouseout', handleTooltipLeave);\r\n }\r\n container.addEventListener('focusout', hideTooltip);\r\n // 浮层挂在最近的编辑器根容器下,既能继承变量,也不会操作编辑内容 DOM。\r\n mountToolbarOverlays();\r\n\r\n // 独立 toolbar 只订阅 public API 状态,不依赖 DOM 编辑器内部实现。\r\n const unsubscribe = options.editor.subscribeCommandStateChange(renderStates);\r\n\r\n return {\r\n update,\r\n destroy() {\r\n if (destroyed) return;\r\n\r\n destroyed = true;\r\n stopToolbarDrag();\r\n unsubscribe();\r\n closeGroupMenu();\r\n container.removeEventListener('pointerdown', handlePointerDown, true);\r\n container.removeEventListener('click', handleClick);\r\n groupMenuElement.removeEventListener('pointerdown', handleGroupMenuPointerDown, true);\r\n groupMenuElement.removeEventListener('click', handleClick);\r\n document.removeEventListener('click', handleDocumentClick);\r\n document.removeEventListener('keydown', handleKeyDown);\r\n if (enableTooltip) {\r\n container.removeEventListener('mouseover', handleTooltipTarget);\r\n container.removeEventListener('mouseout', handleTooltipLeave);\r\n }\r\n clearToolbarPressedState();\r\n clearGroupMenuPressedState();\r\n container.removeEventListener('focusout', hideTooltip);\r\n tooltipElement.remove();\r\n groupMenuElement.remove();\r\n container.classList.remove('bridgerte__toolbar');\r\n delete container.dataset.placement;\r\n container.textContent = '';\r\n container.removeAttribute('role');\r\n container.removeAttribute('aria-label');\r\n }\r\n };\r\n}\r\n","const invisibleTextPattern = /[\\u200B-\\u200D\\uFEFF]/g;\n\n/*\n * HTML 片段里这些元素没有 textContent 也应算有效内容。\n * 纯排版容器不放进来,避免 `<p><br></p>`、空列表项这类编辑器占位被误判为非空。\n */\nconst meaningfulHtmlContentSelector = [\n 'img',\n 'video',\n 'audio',\n 'iframe',\n 'table',\n 'pre',\n 'code',\n 'hr',\n 'figure',\n 'canvas',\n 'svg',\n 'math',\n '[data-type=\"mention\"]'\n].join(',');\n\nconst normalizeHtmlText = (text: string | null | undefined): string => (\n text?.replace(invisibleTextPattern, '').trim() ?? ''\n);\n\n/**\n * 判断一段 HTML 片段是否包含可保存的富文本内容。\n *\n * 这个工具会使用浏览器 template 解析 HTML,适合只拿到 HTML 字符串的业务表单;如果已经持有\n * `EditorContent`,优先使用 core 的 `isEditorContentEmpty()`,避免额外 DOM parse。\n */\nexport const hasMeaningfulHtmlContent = (html: string): boolean => {\n if (!normalizeHtmlText(html)) return false;\n\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n return Boolean(\n normalizeHtmlText(template.content.textContent)\n || template.content.querySelector(meaningfulHtmlContentSelector)\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","invisibleTextPattern","meaningfulHtmlContentSelector","normalizeHtmlText","text","hasMeaningfulHtmlContent","html","template"],"mappings":"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"}
|