@os-team-11/editor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/schema/validate.ts","../src/adapter/toEditor.ts","../src/adapter/toBid.ts","../src/editor/BidEditor.ts","../src/export/pdf.ts","../src/react/BidEditor.tsx","../src/react/hooks/useBidEditor.ts","../src/react/hooks/useFormatState.ts","../src/react/hooks/useBreakpoint.ts","../src/react/theme/tokens.ts","../src/react/theme/mergeTheme.ts","../src/react/theme/cssVars.ts","../src/react/Toolbar.tsx","../src/react/config/buttonCommands.ts","../src/react/config/mergeConfig.ts","../src/react/hooks/useCommand.ts","../src/react/icons.tsx","../src/react/ToolbarButton.tsx","../src/react/Dropdown.tsx","../src/react/ColorPicker.tsx","../src/react/TableGridPicker.tsx","../src/react/HyperlinkDialog.tsx","../src/react/LatexDialog.tsx","../src/react/FieldPanel.tsx"],"sourcesContent":["// src/index.ts\r\nimport './react/styles.css'\r\n\r\nexport type {\r\n BidSchema,\r\n BidSection,\r\n BidBlock,\r\n BidMeta,\r\n BidPage,\r\n BidPageMargins,\r\n BidPageHeader,\r\n BidPageFooter,\r\n BidPageWatermark,\r\n BidPageSize\r\n} from './schema/types'\r\n\r\nexport { validateBid, bidSchema } from './schema/validate'\r\n\r\nexport { bidToEditorElements } from './adapter/toEditor'\r\nexport type { BidEditorElement } from './adapter/toEditor'\r\n\r\nexport { editorElementsToSections } from './adapter/toBid'\r\n\r\nexport { BidEditor as BidEditorCore } from './editor/BidEditor'\r\n\r\nexport { printBid } from './export/pdf'\r\n\r\n// React 组件(命名沿用 React 入口)\r\nexport { BidEditor } from './react/BidEditor'\r\nexport type {\r\n BidEditorProps,\r\n BidEditorHandle,\r\n ToolbarConfig,\r\n ToolbarButtonId,\r\n Theme,\r\n Renderers\r\n} from './react/config/types'\r\n","// src/schema/validate.ts\nimport { z } from 'zod'\nimport type { BidSchema } from './types'\n\nexport const bidSchema = z.object({\n meta: z.object({\n title: z.string().min(1),\n docNo: z.string().min(1),\n tenderer: z.string().min(1),\n version: z.string().min(1),\n generatedAt: z.string().min(1),\n generator: z.string().optional()\n }),\n page: z.object({\n size: z.union([\n z.literal('A4'),\n z.literal('Letter'),\n z.object({\n width: z.number().positive(),\n height: z.number().positive()\n })\n ]),\n margins: z.object({\n top: z.number().nonnegative(),\n right: z.number().nonnegative(),\n bottom: z.number().nonnegative(),\n left: z.number().nonnegative()\n }),\n header: z\n .object({\n template: z.string(),\n showOnFirstPage: z.boolean()\n })\n .optional(),\n footer: z.object({ template: z.string() }).optional(),\n watermark: z\n .object({\n text: z.string(),\n opacity: z.number().min(0).max(1)\n })\n .optional()\n }),\n sections: z.array(\n z.object({\n id: z.string().min(1),\n title: z.string().min(1),\n level: z.union([z.literal(1), z.literal(2), z.literal(3)]),\n blocks: z.array(\n z.discriminatedUnion('type', [\n z.object({\n type: z.literal('heading'),\n level: z.union([z.literal(2), z.literal(3), z.literal(4)]),\n text: z.string().min(1)\n }),\n z.object({\n type: z.literal('paragraph'),\n text: z.string()\n }),\n z.object({\n type: z.literal('list'),\n ordered: z.boolean(),\n items: z.array(z.string())\n }),\n z.object({\n type: z.literal('table'),\n rows: z.array(z.array(z.string())),\n caption: z.string().optional()\n }),\n z.object({\n type: z.literal('image'),\n src: z.string().min(1),\n alt: z.string().optional(),\n caption: z.string().optional()\n })\n ])\n )\n })\n ).min(1)\n})\n\n// Compile-time check: zod inferred type must be assignable to BidSchema type\n// If Task 2 types drift from this zod schema, tsc will fail here.\nconst _typeBridgeCheck: BidSchema = {} as z.infer<typeof bidSchema>\nvoid _typeBridgeCheck\n\nexport function validateBid(input: unknown) {\n return bidSchema.safeParse(input)\n}\n","// src/adapter/toEditor.ts\nimport type { BidSection, BidBlock } from '../schema/types'\n\n// 类型策略:BidEditorElement 是本适配器与 BidEditor 之间的契约层,\n// 故意不直接引入 @hufe921/canvas-editor 的完整 IElement 类型\n// (其类型是 16 个 interface 的交叉,字段繁多)。\n// 当本适配器需要新字段时,优先扩展 BidEditorElement 接口,\n// 而非在调用点用 as 断言塞入上游类型。\n\n// canvas-editor IElement 的最小可用结构。完整类型由上游导出,\n// 这里只列出本适配器产出的字段,避免引入完整 IElement 的复杂度。\nexport interface BidEditorElement {\n value: string\n type?: string\n level?: number\n listType?: 'ol' | 'ul'\n listId?: string\n valueList?: Array<{ value: string; [k: string]: unknown }>\n alt?: string\n tableId?: string\n trList?: unknown\n colspan?: number\n rowspan?: number\n}\n\nfunction convertBlock(\n block: BidBlock,\n nextListId: () => string\n): BidEditorElement[] {\n switch (block.type) {\n case 'paragraph':\n return [{ value: block.text + '\\n' }]\n case 'heading':\n return [\n {\n value: block.text,\n type: 'title',\n level: block.level\n }\n ]\n case 'list': {\n const listId = nextListId()\n const listType = block.ordered ? 'ol' : 'ul'\n return block.items.map(item => ({\n value: item + '\\n',\n listType,\n listId,\n valueList: [{ value: item }]\n }))\n }\n case 'table': {\n const out: BidEditorElement[] = []\n if (block.caption) {\n out.push({ value: block.caption + '\\n' })\n }\n for (const row of block.rows) {\n out.push({ value: row.join('\\t') + '\\n' })\n }\n return out\n }\n case 'image': {\n const out: BidEditorElement[] = []\n if (block.caption) {\n out.push({ value: block.caption + '\\n' })\n }\n out.push({\n value: block.src,\n type: 'image',\n alt: block.alt\n })\n return out\n }\n }\n}\n\nexport function bidToEditorElements(sections: BidSection[]): BidEditorElement[] {\n const result: BidEditorElement[] = []\n let listCounter = 0\n const nextListId = () => `bid-list-${++listCounter}`\n for (const section of sections) {\n result.push({\n value: section.title,\n type: 'title',\n level: section.level\n })\n for (const block of section.blocks) {\n result.push(...convertBlock(block, nextListId))\n }\n }\n return result\n}\n","// src/adapter/toBid.ts\nimport type { BidEditorElement } from './toEditor'\nimport type { BidSection } from '../schema/types'\n\nfunction isTabRow(value: string): boolean {\n return value.includes('\\t') && value.endsWith('\\n')\n}\n\nexport function editorElementsToSections(elements: BidEditorElement[]): BidSection[] {\n const sections: BidSection[] = []\n let current: BidSection | null = null\n let pendingList: { ordered: boolean; items: string[]; listId: string } | null = null\n let pendingTableRows: string[][] = []\n\n function flushList() {\n if (current && pendingList && pendingList.items.length > 0) {\n current.blocks.push({\n type: 'list',\n ordered: pendingList.ordered,\n items: pendingList.items\n })\n }\n pendingList = null\n }\n\n function flushTable() {\n if (current && pendingTableRows.length > 0) {\n current.blocks.push({\n type: 'table',\n rows: pendingTableRows\n })\n }\n pendingTableRows = []\n }\n\n for (const el of elements) {\n // Section 分隔\n if (el.type === 'title' && el.level === 1) {\n flushList()\n flushTable()\n current = {\n id: `sec-${sections.length + 1}`,\n title: el.value,\n level: 1,\n blocks: []\n }\n sections.push(current)\n continue\n }\n\n if (!current) {\n // 容错:没有 section title 就忽略前置元素\n continue\n }\n\n // 子标题\n if (el.type === 'title' && typeof el.level === 'number' && el.level >= 2) {\n flushList()\n flushTable()\n current.blocks.push({\n type: 'heading',\n level: el.level as 2 | 3 | 4,\n text: el.value\n })\n continue\n }\n\n // 列表\n if (el.listType && el.listId) {\n flushTable()\n if (!pendingList || pendingList.listId !== el.listId) {\n flushList()\n pendingList = {\n ordered: el.listType === 'ol',\n items: [],\n listId: el.listId\n }\n }\n pendingList.items.push(el.value.replace(/\\n$/, ''))\n continue\n }\n\n // 图片\n if (el.type === 'image') {\n flushList()\n flushTable()\n current.blocks.push({\n type: 'image',\n src: el.value,\n alt: el.alt\n })\n continue\n }\n\n // 表格行(tab 分隔 + 换行结尾)\n if (isTabRow(el.value)) {\n flushList()\n const cells = el.value.slice(0, -1).split('\\t')\n pendingTableRows.push(cells)\n continue\n }\n\n // 普通段落\n flushList()\n flushTable()\n const text = el.value.replace(/\\n$/, '')\n if (text.length > 0) {\n current.blocks.push({ type: 'paragraph', text })\n }\n }\n\n flushList()\n flushTable()\n return sections\n}\n","// src/editor/BidEditor.ts\nimport Editor from '@hufe921/canvas-editor'\nimport type { BidSchema } from '../schema/types'\nimport { bidToEditorElements, type BidEditorElement } from '../adapter/toEditor'\nimport { editorElementsToSections } from '../adapter/toBid'\n\nexport class BidEditor {\n private readonly editor: InstanceType<typeof Editor>\n private readonly container: HTMLElement\n private meta: BidSchema['meta']\n private page: BidSchema['page']\n\n constructor(container: HTMLElement, bid: BidSchema) {\n this.container = container\n this.meta = bid.meta\n this.page = bid.page\n\n const elements = bidToEditorElements(bid.sections)\n this.editor = new Editor(\n container as unknown as HTMLDivElement,\n { main: elements } as never\n ) as InstanceType<typeof Editor>\n }\n\n load(bid: BidSchema): void {\n this.meta = bid.meta\n this.page = bid.page\n const elements = bidToEditorElements(bid.sections)\n // canvas-editor 没有公开的\"替换整个文档\"API,\n // M1 用清除后重新插入的近似做法;M2 评估是否重建实例\n const cmd = this.editor.command as unknown as {\n executeSelectAll?: () => void\n executeBackspace?: () => void\n executeInsertElementList: (els: unknown[]) => void\n }\n if (typeof cmd.executeSelectAll === 'function' && typeof cmd.executeBackspace === 'function') {\n cmd.executeSelectAll()\n cmd.executeBackspace()\n }\n cmd.executeInsertElementList(elements)\n }\n\n getBid(): BidSchema {\n const value = (\n this.editor.command as unknown as {\n getValue: () => { data: { main: BidEditorElement[] } }\n }\n ).getValue()\n const sections = editorElementsToSections(value.data.main || [])\n return {\n meta: this.meta,\n page: this.page,\n sections\n }\n }\n\n getCommand(): unknown {\n return this.editor.command\n }\n\n /** 直接暴露 canvas-editor 的 command,便于 hooks 模式访问 */\n get command(): unknown {\n return this.editor.command\n }\n\n destroy(): void {\n if (typeof (this.editor as unknown as { destroy?: () => void }).destroy === 'function') {\n ;(this.editor as unknown as { destroy: () => void }).destroy()\n }\n this.container.innerHTML = ''\n }\n}\n","// src/export/pdf.ts\n\n/**\n * 触发浏览器打印对话框,由用户选择\"另存为 PDF\"完成导出。\n *\n * canvas-editor 0.9.x 没有公开的 PDF 生成 API;\n * M2 会评估接入 feature/pdf 实验分支或服务端生成方案。\n */\nexport function printBid(): void {\n window.print()\n}\n","import { useRef, useImperativeHandle, forwardRef } from 'react'\r\nimport type { BidEditorHandle, BidEditorProps } from './config/types'\r\nimport { useBidEditor } from './hooks/useBidEditor'\r\nimport { useFormatState } from './hooks/useFormatState'\r\nimport { useBreakpoint } from './hooks/useBreakpoint'\r\nimport { mergeTheme } from './theme/mergeTheme'\r\nimport { themeToCssVars } from './theme/cssVars'\r\nimport { Toolbar } from './Toolbar'\r\nimport { FieldPanel } from './FieldPanel'\r\n\r\nexport const BidEditor = forwardRef<BidEditorHandle, BidEditorProps>(function BidEditor(\r\n props,\r\n ref\r\n) {\r\n const {\r\n bid,\r\n onChange,\r\n readOnly = false,\r\n toolbar = true,\r\n theme,\r\n renderers,\r\n fieldPanel = false,\r\n breakpoint: forcedBreakpoint,\r\n className,\r\n style\r\n } = props\r\n\r\n const containerRef = useRef<HTMLDivElement>(null)\r\n const { handle, editorRef } = useBidEditor({ containerRef, bid, onChange, readOnly })\r\n const formatState = useFormatState(editorRef as never)\r\n const breakpoint = useBreakpoint(forcedBreakpoint)\r\n\r\n useImperativeHandle(ref, () => handle, [handle])\r\n\r\n const mergedTheme = mergeTheme(theme)\r\n const cssVars = themeToCssVars(mergedTheme)\r\n\r\n const rootClass = ['bke-root', mergedTheme.dark ? 'bke-dark' : '', className ?? '']\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n return (\r\n <div className={rootClass} style={{ ...cssVars, ...style }}>\r\n <Toolbar\r\n editorRef={editorRef}\r\n config={toolbar}\r\n formatState={formatState}\r\n breakpoint={breakpoint}\r\n renderers={renderers}\r\n readOnly={readOnly}\r\n />\r\n <div className=\"bke-editor-host\">\r\n <div className=\"bke-editor-canvas\" ref={containerRef} />\r\n </div>\r\n <FieldPanel visible={fieldPanel} />\r\n </div>\r\n )\r\n})\r\n","import { useEffect, useRef, useState, useCallback } from 'react'\r\nimport { BidEditor as BidEditorCore } from '../../editor/BidEditor'\r\nimport type { BidSchema } from '../../schema/types'\r\nimport type { BidEditorHandle } from '../config/types'\r\nimport { printBid } from '../../export/pdf'\r\n\r\ninterface UseBidEditorArgs {\r\n containerRef: React.RefObject<HTMLDivElement | null>\r\n bid: BidSchema\r\n onChange?: (bid: BidSchema) => void\r\n readOnly?: boolean\r\n}\r\n\r\ninterface UseBidEditorResult {\r\n handle: BidEditorHandle\r\n editorRef: React.RefObject<BidEditorCore | null>\r\n}\r\n\r\n/**\r\n * 管理 M1 BidEditor 实例的生命周期。\r\n *\r\n * 重要:`onChange` 仅在调用 `handle.getBid()` 时触发(\"读时触发\"),\r\n * 不是编辑器内容变化时自动触发。\r\n *\r\n * M5.0 阶段接受这种按需读取的语义;canvas-editor 0.9.x 没有公开的\r\n * 内容变更事件,无法做\"写时通知\"。M6 评估接入事件化。\r\n *\r\n * 如果消费方需要受控 state,应在合适的时机(如保存按钮、卸载时)\r\n * 主动调用 `handle.getBid()` 拉取最新数据。\r\n */\r\nexport function useBidEditor({ containerRef, bid, onChange }: UseBidEditorArgs): UseBidEditorResult {\r\n const editorRef = useRef<BidEditorCore | null>(null)\r\n const [, force] = useState(0)\r\n const onChangeRef = useRef(onChange)\r\n onChangeRef.current = onChange\r\n\r\n useEffect(() => {\r\n const container = containerRef.current\r\n if (!container) return\r\n editorRef.current = new BidEditorCore(container, bid)\r\n force(x => x + 1)\r\n return () => {\r\n editorRef.current?.destroy()\r\n editorRef.current = null\r\n }\r\n }, [containerRef, bid])\r\n\r\n const handle: BidEditorHandle = {\r\n getBid: useCallback(() => {\r\n const e = editorRef.current\r\n if (!e) return bid\r\n const next = e.getBid()\r\n onChangeRef.current?.(next)\r\n return next\r\n }, [bid]),\r\n getCommand: useCallback(() => editorRef.current?.getCommand(), []),\r\n print: useCallback(() => printBid(), []),\r\n focus: useCallback(() => {\r\n // canvas-editor 0.9.x 没有 focus API,做 noop\r\n }, [])\r\n }\r\n\r\n return { handle, editorRef }\r\n}\r\n","import { useEffect, useState } from 'react'\r\n\r\nexport interface FormatState {\r\n bold: boolean\r\n italic: boolean\r\n underline: boolean\r\n strikeout: boolean\r\n superscript: boolean\r\n subscript: boolean\r\n align: 'left' | 'center' | 'right' | 'justify' | null\r\n level: number | null\r\n listType: 'ol' | 'ul' | null\r\n color: string | null\r\n highlight: string | null\r\n}\r\n\r\nconst EMPTY: FormatState = {\r\n bold: false,\r\n italic: false,\r\n underline: false,\r\n strikeout: false,\r\n superscript: false,\r\n subscript: false,\r\n align: null,\r\n level: null,\r\n listType: null,\r\n color: null,\r\n highlight: null\r\n}\r\n\r\ninterface EditorLike {\r\n command?: {\r\n getFormat?: () => Record<string, unknown>\r\n }\r\n}\r\n\r\n/**\r\n * 监听 canvas-editor 当前选区格式(驱动按钮 active 状态)。\r\n *\r\n * canvas-editor 0.9.x 没有暴露选区变化事件,所以用 200ms 轮询。\r\n * editorRef.current 在 mount 后由 useBidEditor 异步赋值,所以这里\r\n * 先轮询检测就绪(100ms 间隔),就绪后切换到 200ms 的 getFormat 轮询。\r\n * M6 评估接入事件化。\r\n */\r\nexport function useFormatState(editorRef: React.RefObject<EditorLike | null>): FormatState {\r\n const [state, setState] = useState<FormatState>(EMPTY)\r\n\r\n useEffect(() => {\r\n let readyTimer: ReturnType<typeof setInterval> | undefined\r\n let pollTimer: ReturnType<typeof setInterval> | undefined\r\n let attempts = 0\r\n\r\n const read = () => {\r\n const editor = editorRef.current\r\n const getFormat = editor?.command?.getFormat\r\n if (typeof getFormat !== 'function') return false\r\n\r\n const raw = getFormat.call(editor!.command) as Record<string, unknown>\r\n setState({\r\n bold: !!raw.bold,\r\n italic: !!raw.italic,\r\n underline: !!raw.underline,\r\n strikeout: !!raw.strikeout,\r\n superscript: !!raw.superscript,\r\n subscript: !!raw.subscript,\r\n align: (raw.rowFlex as FormatState['align']) ?? null,\r\n level: (raw.level as number) ?? null,\r\n listType: (raw.listType as FormatState['listType']) ?? null,\r\n color: (raw.color as string) ?? null,\r\n highlight: (raw.highlight as string) ?? null\r\n })\r\n return true\r\n }\r\n\r\n const startPolling = () => {\r\n if (read()) {\r\n clearInterval(readyTimer)\r\n readyTimer = undefined\r\n pollTimer = setInterval(read, 200)\r\n } else {\r\n attempts++\r\n if (attempts > 100) {\r\n // ~10s 超时(editor 始终未就绪,可能是只读模式)\r\n clearInterval(readyTimer)\r\n readyTimer = undefined\r\n }\r\n }\r\n }\r\n\r\n readyTimer = setInterval(startPolling, 100)\r\n startPolling()\r\n\r\n return () => {\r\n if (readyTimer) clearInterval(readyTimer)\r\n if (pollTimer) clearInterval(pollTimer)\r\n }\r\n }, [editorRef])\r\n\r\n return state\r\n}\r\n","import { useEffect, useState } from 'react'\r\nimport type { Breakpoint } from '../config/types'\r\n\r\nconst MOBILE_QUERY = '(max-width: 767px)'\r\nconst TABLET_QUERY = '(min-width: 768px) and (max-width: 1023px)'\r\n\r\nfunction readBreakpoint(): Breakpoint {\r\n if (typeof window === 'undefined' || !window.matchMedia) return 'desktop'\r\n if (window.matchMedia(MOBILE_QUERY).matches) return 'mobile'\r\n if (window.matchMedia(TABLET_QUERY).matches) return 'tablet'\r\n return 'desktop'\r\n}\r\n\r\nexport function useBreakpoint(forced?: Breakpoint): Breakpoint {\r\n const [bp, setBp] = useState<Breakpoint>(forced ?? readBreakpoint)\r\n\r\n useEffect(() => {\r\n if (forced) {\r\n setBp(forced)\r\n return\r\n }\r\n if (typeof window === 'undefined' || !window.matchMedia) return\r\n\r\n const mobileMql = window.matchMedia(MOBILE_QUERY)\r\n const tabletMql = window.matchMedia(TABLET_QUERY)\r\n const handler = () => setBp(readBreakpoint())\r\n\r\n mobileMql.addEventListener('change', handler)\r\n tabletMql.addEventListener('change', handler)\r\n return () => {\r\n mobileMql.removeEventListener('change', handler)\r\n tabletMql.removeEventListener('change', handler)\r\n }\r\n }, [forced])\r\n\r\n return bp\r\n}\r\n","// src/react/theme/tokens.ts\r\nimport type { Theme } from '../config/types'\r\n\r\nexport const LIGHT_TOKENS: Theme = {\r\n colors: {\r\n primary: '#2383E2',\r\n text: '#37352F',\r\n border: '#EDEDED',\r\n background: '#FAFAFA',\r\n hover: '#F1F1F0',\r\n active: '#E8E8E7'\r\n },\r\n radius: { button: 4, container: 8 },\r\n spacing: { button: 6, group: 4 },\r\n fontSize: 13,\r\n fontFamily: \"system-ui, -apple-system, 'Segoe UI', sans-serif\"\r\n}\r\n\r\nexport const DARK_TOKENS: Theme = {\r\n ...LIGHT_TOKENS,\r\n dark: true,\r\n colors: {\r\n primary: '#4A9BE8',\r\n text: '#E6E6E6',\r\n border: '#2A2A2A',\r\n background: '#1F1F1F',\r\n hover: '#2D2D2D',\r\n active: '#3A3A3A'\r\n }\r\n}\r\n","import type { Theme } from '../config/types'\r\nimport { LIGHT_TOKENS, DARK_TOKENS } from './tokens'\r\n\r\ntype Rec = Record<string, unknown>\r\n\r\nfunction deepMerge<T extends Rec>(base: T, override?: Partial<T>): T {\r\n if (!override) return base\r\n const result: Rec = { ...base }\r\n for (const key of Object.keys(override)) {\r\n const ov = (override as Rec)[key]\r\n if (ov && typeof ov === 'object' && !Array.isArray(ov)) {\r\n result[key] = deepMerge(\r\n base[key] as Rec,\r\n ov as Rec\r\n )\r\n } else if (ov !== undefined) {\r\n result[key] = ov\r\n }\r\n }\r\n return result as T\r\n}\r\n\r\nexport function mergeTheme(override?: Partial<Theme>): Theme {\r\n const base = override?.dark ? DARK_TOKENS : LIGHT_TOKENS\r\n const merged = deepMerge(base as unknown as Rec, override as unknown as Rec) as unknown as Theme\r\n if (override?.dark !== undefined) {\r\n merged.dark = override.dark\r\n }\r\n return merged\r\n}\r\n","import type { CSSProperties } from 'react'\r\nimport type { Theme } from '../config/types'\r\n\r\nexport type BkeCssVars = Record<string, string>\r\n\r\nexport function themeToCssVars(theme: Theme): BkeCssVars {\r\n return {\r\n '--bke-color-primary': theme.colors.primary,\r\n '--bke-color-text': theme.colors.text,\r\n '--bke-color-border': theme.colors.border,\r\n '--bke-color-bg': theme.colors.background,\r\n '--bke-color-hover': theme.colors.hover,\r\n '--bke-color-active': theme.colors.active,\r\n '--bke-radius-button': `${theme.radius.button}px`,\r\n '--bke-radius-container': `${theme.radius.container}px`,\r\n '--bke-spacing-button': `${theme.spacing.button}px`,\r\n '--bke-spacing-group': `${theme.spacing.group}px`,\r\n '--bke-font-size': `${theme.fontSize}px`,\r\n '--bke-font-family': theme.fontFamily\r\n }\r\n}\r\n\r\n/** 用于 React style prop 的类型 */\r\nexport const cssVarsAsStyle = (theme: Theme): CSSProperties =>\r\n themeToCssVars(theme) as CSSProperties\r\n","import { useState, useRef, useLayoutEffect, useMemo } from 'react'\nimport type {\n ToolbarConfig,\n ToolbarButtonId,\n Breakpoint,\n Renderers\n} from './config/types'\nimport { mergeToolbarConfig } from './config/mergeConfig'\nimport { TABLET_COLLAPSE_GROUP_IDS } from './config/buttonCommands'\nimport type { FormatState } from './hooks/useFormatState'\nimport { useCommand } from './hooks/useCommand'\nimport { ToolbarButton } from './ToolbarButton'\nimport { Dropdown } from './Dropdown'\nimport { ColorPicker } from './ColorPicker'\nimport { TableGridPicker } from './TableGridPicker'\nimport { HyperlinkDialog } from './HyperlinkDialog'\nimport { LatexDialog } from './LatexDialog'\n\ninterface ToolbarProps {\n editorRef: React.RefObject<unknown>\n config: ToolbarConfig | false\n formatState: FormatState\n breakpoint: Breakpoint\n renderers?: Renderers\n readOnly?: boolean\n}\n\nconst ACTIVE_MAP: Partial<Record<ToolbarButtonId, (f: FormatState) => boolean>> = {\n bold: f => f.bold,\n italic: f => f.italic,\n underline: f => f.underline,\n strikeout: f => f.strikeout,\n superscript: f => f.superscript,\n subscript: f => f.subscript,\n 'align-left': f => f.align === 'left',\n 'align-center': f => f.align === 'center',\n 'align-right': f => f.align === 'right',\n 'align-justify': f => f.align === 'justify',\n 'list-ol': f => f.listType === 'ol',\n 'list-ul': f => f.listType === 'ul',\n h1: f => f.level === 1,\n h2: f => f.level === 2,\n h3: f => f.level === 3,\n h4: f => f.level === 4\n}\n\n/** \"更多\"按钮预留宽度(含左右 gap),用于溢出计算 */\nconst MORE_BUTTON_RESERVED_WIDTH = 48\n\nexport function Toolbar({\n editorRef,\n config,\n formatState,\n breakpoint,\n renderers,\n readOnly = false\n}: ToolbarProps) {\n const { execute } = useCommand(editorRef as never)\n const [hyperlinkOpen, setHyperlinkOpen] = useState(false)\n const [latexOpen, setLatexOpen] = useState(false)\n const [colorOpen, setColorOpen] = useState(false)\n const [highlightOpen, setHighlightOpen] = useState(false)\n const [tableOpen, setTableOpen] = useState(false)\n const [fontOpen, setFontOpen] = useState(false)\n const [sizeOpen, setSizeOpen] = useState(false)\n const [lineHeightOpen, setLineHeightOpen] = useState(false)\n const [overflowIds, setOverflowIds] = useState<string[]>([])\n\n const disabled = config === false || readOnly || breakpoint === 'mobile'\n const groups = useMemo(\n () => (disabled ? [] : mergeToolbarConfig(config)),\n [disabled, config]\n )\n const isTablet = breakpoint === 'tablet'\n\n const toolbarRef = useRef<HTMLDivElement>(null)\n const measureRef = useRef<HTMLDivElement>(null)\n\n useLayoutEffect(() => {\n if (disabled) {\n setOverflowIds([])\n return\n }\n const toolbar = toolbarRef.current\n const measure = measureRef.current\n if (!toolbar || !measure) return\n\n const compute = () => {\n const widths = new Map<string, number>()\n measure.querySelectorAll<HTMLElement>('[data-group-id]').forEach(el => {\n const id = el.dataset.groupId\n if (id) widths.set(id, el.offsetWidth)\n })\n\n const available = toolbar.clientWidth - MORE_BUTTON_RESERVED_WIDTH\n const result: string[] = []\n let acc = 0\n let crossed = false\n for (const g of groups) {\n const w = widths.get(g.id) ?? 0\n if (crossed) {\n result.push(g.id)\n continue\n }\n acc += w\n if (acc > available) {\n crossed = true\n result.push(g.id)\n }\n }\n setOverflowIds(prev => {\n const same =\n prev.length === result.length &&\n prev.every((v, i) => v === result[i])\n return same ? prev : result\n })\n }\n\n compute()\n const ro = new ResizeObserver(compute)\n ro.observe(toolbar)\n return () => ro.disconnect()\n // disabled / groups 依赖:disabled 变化时重置;groups 引用变化时重测\n }, [disabled, groups, isTablet])\n\n if (disabled) return null\n\n const renderButtonItem = (id: ToolbarButtonId, keySuffix = '') => {\n const renderer = renderers?.button?.[id]\n const active = ACTIVE_MAP[id]?.(formatState) ?? false\n const key = `${id}${keySuffix}`\n\n if (id === 'color' || id === 'highlight') {\n const open = id === 'color' ? colorOpen : highlightOpen\n const setOpen = id === 'color' ? setColorOpen : setHighlightOpen\n return (\n <Dropdown\n key={key}\n open={open}\n onOpenChange={setOpen}\n trigger={\n <ToolbarButton id={id} active={active} renderer={renderer as never} onClick={() => { /* toggled by Dropdown wrapper */ }} />\n }\n >\n <ColorPicker onSelect={c => { execute(id, c); setOpen(false) }} />\n </Dropdown>\n )\n }\n\n if (id === 'table') {\n return (\n <Dropdown\n key={key}\n open={tableOpen}\n onOpenChange={setTableOpen}\n trigger={\n <ToolbarButton id={id} active={active} renderer={renderer as never} onClick={() => { /* toggled by Dropdown wrapper */ }} />\n }\n >\n <TableGridPicker\n onSelect={(rows, cols) => { execute('table', rows, cols); setTableOpen(false) }}\n />\n </Dropdown>\n )\n }\n\n if (id === 'font-family') {\n return (\n <Dropdown\n key={key}\n open={fontOpen}\n onOpenChange={setFontOpen}\n trigger={<ToolbarButton id={id} label=\"字体\" renderer={renderer as never} onClick={() => { /* toggled by Dropdown wrapper */ }} />}\n >\n <div className=\"bke-list-menu\">\n {['宋体', '黑体', '微软雅黑', 'Arial', 'Times New Roman'].map(name => (\n <button\n key={name}\n type=\"button\"\n style={{ fontFamily: name }}\n onClick={() => { execute('font-family', name); setFontOpen(false) }}\n >\n {name}\n </button>\n ))}\n </div>\n </Dropdown>\n )\n }\n\n if (id === 'font-size') {\n return (\n <Dropdown\n key={key}\n open={sizeOpen}\n onOpenChange={setSizeOpen}\n trigger={<ToolbarButton id={id} label=\"字号\" renderer={renderer as never} onClick={() => { /* toggled by Dropdown wrapper */ }} />}\n >\n <div className=\"bke-list-menu\">\n {[12, 14, 16, 18, 24, 32].map(size => (\n <button\n key={size}\n type=\"button\"\n onClick={() => { execute('font-size', size); setSizeOpen(false) }}\n >\n {size}\n </button>\n ))}\n </div>\n </Dropdown>\n )\n }\n\n if (id === 'line-height') {\n return (\n <Dropdown\n key={key}\n open={lineHeightOpen}\n onOpenChange={setLineHeightOpen}\n trigger={<ToolbarButton id={id} label=\"行距\" renderer={renderer as never} onClick={() => { /* toggled by Dropdown wrapper */ }} />}\n >\n <div className=\"bke-list-menu\">\n {[1, 1.15, 1.5, 2, 2.5].map(v => (\n <button\n key={v}\n type=\"button\"\n onClick={() => { execute('line-height', v); setLineHeightOpen(false) }}\n >\n {v}\n </button>\n ))}\n </div>\n </Dropdown>\n )\n }\n\n if (id === 'image') {\n return (\n <ToolbarButton\n key={key}\n id={id}\n active={active}\n renderer={renderer as never}\n onClick={() => {\n const input = document.createElement('input')\n input.type = 'file'\n input.accept = 'image/*'\n input.onchange = () => {\n const file = input.files?.[0]\n if (!file) return\n const reader = new FileReader()\n reader.onload = () => {\n execute('image', { value: reader.result, width: 200, height: 150 })\n }\n reader.readAsDataURL(file)\n }\n input.click()\n }}\n />\n )\n }\n\n if (id === 'hyperlink') {\n return (\n <ToolbarButton\n key={key}\n id={id}\n renderer={renderer as never}\n onClick={() => setHyperlinkOpen(true)}\n />\n )\n }\n\n if (id === 'math') {\n return (\n <ToolbarButton\n key={key}\n id={id}\n renderer={renderer as never}\n onClick={() => setLatexOpen(true)}\n />\n )\n }\n\n return (\n <ToolbarButton\n key={key}\n id={id}\n active={active}\n renderer={renderer as never}\n onClick={() => execute(id)}\n />\n )\n }\n\n const renderGroup = (group: { id: string; buttons: Array<ToolbarButtonId | '|'> }, keySuffix = '') => (\n <div\n key={`${group.id}${keySuffix}`}\n className=\"bke-toolbar-group\"\n data-group-id={group.id}\n >\n {group.buttons.map((b, i) =>\n b === '|' ? (\n <span key={`d-${i}`} className=\"bke-toolbar-divider\" />\n ) : (\n renderButtonItem(b, keySuffix)\n )\n )}\n </div>\n )\n\n const forcedOverflow = isTablet ? TABLET_COLLAPSE_GROUP_IDS : []\n const finalOverflow = new Set<string>([...overflowIds, ...forcedOverflow])\n const visibleGroups = groups.filter(g => !finalOverflow.has(g.id))\n const hiddenGroups = groups.filter(g => finalOverflow.has(g.id))\n\n return (\n <>\n <div className=\"bke-toolbar bke-toolbar-main\" ref={toolbarRef}>\n {visibleGroups.map(g => renderGroup(g))}\n {hiddenGroups.length > 0 && (\n <Dropdown\n key=\"more\"\n align=\"right\"\n trigger={\n <button\n type=\"button\"\n className=\"bke-btn bke-more-btn\"\n title=\"更多\"\n aria-label=\"更多\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"5\" cy=\"12\" r=\"1.6\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.6\" />\n <circle cx=\"19\" cy=\"12\" r=\"1.6\" />\n </svg>\n </button>\n }\n >\n <div className=\"bke-toolbar-overflow\">\n {hiddenGroups.map(g => renderGroup(g, '-overflow'))}\n </div>\n </Dropdown>\n )}\n </div>\n\n {/* 测量层:始终渲染所有 group,用于动态计算溢出宽度。不可见、不交互。 */}\n <div className=\"bke-toolbar-measure\" ref={measureRef} aria-hidden=\"true\">\n {groups.map(g => renderGroup(g, '-measure'))}\n </div>\n\n <HyperlinkDialog\n open={hyperlinkOpen}\n onSubmit={({ url, text }) => {\n execute('hyperlink', { url, valueList: text ? [{ value: text }] : undefined })\n setHyperlinkOpen(false)\n }}\n onCancel={() => setHyperlinkOpen(false)}\n />\n <LatexDialog\n open={latexOpen}\n onSubmit={latex => {\n execute('math', [{ type: 'latex', value: latex }])\n setLatexOpen(false)\n }}\n onCancel={() => setLatexOpen(false)}\n />\n </>\n )\n}\n","// src/react/config/buttonCommands.ts\r\nimport type { ToolbarButtonId, ToolbarGroupConfig } from './types'\r\n\r\n/** 默认 6 个分组 + 完整 36 按钮(实际 8 个 group,包含 history/insert/collab) */\r\nexport const DEFAULT_TOOLBAR_GROUPS: ToolbarGroupConfig[] = [\r\n {\r\n id: 'font',\r\n buttons: ['font-family', 'font-size']\r\n },\r\n {\r\n id: 'format',\r\n buttons: ['bold', 'italic', 'underline', 'strikeout', 'superscript', 'subscript']\r\n },\r\n {\r\n id: 'color',\r\n buttons: ['color', 'highlight']\r\n },\r\n {\r\n id: 'layout',\r\n buttons: ['align-left', 'align-center', 'align-right', 'align-justify', 'line-height']\r\n },\r\n {\r\n id: 'structure',\r\n buttons: ['h1', 'h2', 'h3', 'h4', 'list-ol', 'list-ul', 'indent', 'outdent']\r\n },\r\n {\r\n id: 'history',\r\n buttons: ['undo', 'redo', 'format-painter', 'clear-format']\r\n },\r\n {\r\n id: 'insert',\r\n buttons: ['table', 'image', 'hyperlink', 'separator', 'page-break', 'math', 'control', 'date']\r\n },\r\n {\r\n id: 'collab',\r\n buttons: ['comment']\r\n }\r\n]\r\n\r\nexport const ALL_TOOLBAR_BUTTON_IDS: ToolbarButtonId[] = DEFAULT_TOOLBAR_GROUPS.flatMap(g =>\r\n g.buttons.filter((b): b is ToolbarButtonId => b !== '|')\r\n)\r\n\r\n/** 平板模式下折叠到\"更多\"菜单的分组 */\r\nexport const TABLET_COLLAPSE_GROUP_IDS = ['history', 'insert', 'collab']\r\n","import { DEFAULT_TOOLBAR_GROUPS, ALL_TOOLBAR_BUTTON_IDS } from './buttonCommands'\r\nimport type { ToolbarConfig, ToolbarGroupConfig, ToolbarButtonId, ToolbarItem } from './types'\r\n\r\nconst VALID_BUTTON_SET = new Set<string>(ALL_TOOLBAR_BUTTON_IDS)\r\n\r\nfunction isValidButton(id: string): id is ToolbarButtonId {\r\n return VALID_BUTTON_SET.has(id)\r\n}\r\n\r\nfunction filterValidItems(items: ToolbarItem[]): ToolbarItem[] {\r\n return items.filter(item => item === '|' || isValidButton(item))\r\n}\r\n\r\nfunction applyHide(groups: ToolbarGroupConfig[], hide: ToolbarButtonId[]): ToolbarGroupConfig[] {\r\n const hideSet = new Set(hide)\r\n return groups\r\n .map(g => ({\r\n ...g,\r\n buttons: g.buttons.filter(b => b === '|' || !hideSet.has(b as ToolbarButtonId))\r\n }))\r\n .filter(g => g.buttons.length > 0)\r\n}\r\n\r\nexport function mergeToolbarConfig(config: ToolbarConfig): ToolbarGroupConfig[] {\r\n if (config === (false as ToolbarConfig)) return []\r\n if (config === true) {\r\n return DEFAULT_TOOLBAR_GROUPS.map(g => ({ ...g, buttons: [...g.buttons] }))\r\n }\r\n if (Array.isArray(config)) {\r\n return [{ id: 'custom', buttons: filterValidItems(config) }]\r\n }\r\n if (config.groups) {\r\n return config.groups.map(g => ({\r\n id: g.id,\r\n buttons: filterValidItems(g.buttons)\r\n }))\r\n }\r\n if (config.hide) {\r\n return applyHide(\r\n DEFAULT_TOOLBAR_GROUPS.map(g => ({ ...g, buttons: [...g.buttons] })),\r\n config.hide\r\n )\r\n }\r\n return DEFAULT_TOOLBAR_GROUPS.map(g => ({ ...g, buttons: [...g.buttons] }))\r\n}\r\n","import { useCallback } from 'react'\r\nimport type { ToolbarButtonId } from '../config/types'\r\n\r\ninterface EditorLike {\r\n command?: Record<string, (...args: unknown[]) => void>\r\n}\r\n\r\nconst METHOD_MAP: Partial<Record<ToolbarButtonId, string>> = {\r\n bold: 'executeBold',\r\n italic: 'executeItalic',\r\n underline: 'executeUnderline',\r\n strikeout: 'executeStrikeout',\r\n superscript: 'executeSuperscript',\r\n subscript: 'executeSubscript',\r\n color: 'executeColor',\r\n highlight: 'executeHighlight',\r\n 'align-left': 'executeRowFlex',\r\n 'align-center': 'executeRowFlex',\r\n 'align-right': 'executeRowFlex',\r\n 'align-justify': 'executeRowFlex',\r\n 'line-height': 'executeRowMargin',\r\n h1: 'executeTitle',\r\n h2: 'executeTitle',\r\n h3: 'executeTitle',\r\n h4: 'executeTitle',\r\n 'list-ol': 'executeList',\r\n 'list-ul': 'executeList',\r\n indent: 'executeIndent',\r\n outdent: 'executeOutdent',\r\n undo: 'executeUndo',\r\n redo: 'executeRedo',\r\n 'format-painter': 'executePainter',\r\n 'clear-format': 'executeFormat',\r\n table: 'executeInsertTable',\r\n image: 'executeImage',\r\n hyperlink: 'executeHyperlink',\r\n separator: 'executeSeparator',\r\n 'page-break': 'executePageBreak',\r\n math: 'executeInsertElementList',\r\n control: 'executeInsertControl',\r\n date: 'executeInsertControl',\r\n comment: 'executeInsertGroupAnnotation',\r\n 'font-family': 'executeFont',\r\n 'font-size': 'executeSize'\r\n}\r\n\r\nexport function useCommand(editorRef: React.RefObject<EditorLike | null>) {\r\n return {\r\n execute: useCallback(\r\n (buttonId: ToolbarButtonId, ...args: unknown[]) => {\r\n const editor = editorRef.current\r\n const method = METHOD_MAP[buttonId]\r\n if (!editor?.command || !method) return\r\n const fn = editor.command[method]\r\n if (typeof fn !== 'function') return\r\n\r\n // 对齐类按钮:把 buttonId 翻译为对齐值\r\n if (\r\n buttonId === 'align-left' ||\r\n buttonId === 'align-center' ||\r\n buttonId === 'align-right' ||\r\n buttonId === 'align-justify'\r\n ) {\r\n const align = buttonId.replace('align-', '')\r\n ;(fn as (...a: unknown[]) => void).call(editor.command, align)\r\n return\r\n }\r\n // 标题类按钮:从 h1/h2/h3/h4 提取 level\r\n if (buttonId === 'h1' || buttonId === 'h2' || buttonId === 'h3' || buttonId === 'h4') {\r\n const level = Number(buttonId[1])\r\n ;(fn as (...a: unknown[]) => void).call(editor.command, level)\r\n return\r\n }\r\n // 列表类\r\n if (buttonId === 'list-ol') {\r\n ;(fn as (...a: unknown[]) => void).call(editor.command, 'ol', 'decimal')\r\n return\r\n }\r\n if (buttonId === 'list-ul') {\r\n ;(fn as (...a: unknown[]) => void).call(editor.command, 'ul', 'disc')\r\n return\r\n }\r\n // 日期控件\r\n if (buttonId === 'date') {\r\n ;(fn as (...a: unknown[]) => void).call(editor.command, {\r\n type: 'control',\r\n value: '',\r\n control: { type: 'date', code: 'bid-date', placeholder: '选择日期' }\r\n })\r\n return\r\n }\r\n\r\n ;(fn as (...a: unknown[]) => void).apply(editor.command, args)\r\n },\r\n [editorRef]\r\n )\r\n }\r\n}\r\n","// src/react/icons.tsx\r\nimport type { ToolbarButtonId } from './config/types'\r\n\r\nconst B = ({ d }: { d: string }) => (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <path d={d} />\r\n </svg>\r\n)\r\n\r\nexport const ICONS: Record<ToolbarButtonId, React.ReactNode> = {\r\n 'font-family': <span style={{ fontSize: 12 }}>Aa</span>,\r\n 'font-size': <span style={{ fontSize: 12 }}>14</span>,\r\n bold: <B d=\"M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\" />,\r\n italic: <B d=\"M19 4h-9 M14 20H5 M15 4L9 20\" />,\r\n underline: <B d=\"M6 3v9a6 6 0 0 0 6 6 6 6 0 0 0 6-6V3 M4 21h16\" />,\r\n strikeout: <B d=\"M16 4H9a3 3 0 0 0-2.83 4 M14 12a3 3 0 0 1 2.83 4H7 M4 12h16\" />,\r\n superscript: <B d=\"M4 19l6-6 6 6 M14 5l4-2 0 4\" />,\r\n subscript: <B d=\"M4 5l6 6 6-6 M14 14l4 4 M18 14v4h-4\" />,\r\n color: (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\">\r\n <path d=\"M4 4h16v12H4z\" fill=\"currentColor\" opacity=\"0.2\" />\r\n <path d=\"M4 4h16v12H4z M4 20h16\" stroke=\"currentColor\" strokeWidth=\"2\" fill=\"none\" />\r\n </svg>\r\n ),\r\n highlight: (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\">\r\n <path d=\"M9 11l-4 4v4h4l4-4 M14 7l3-3 4 4-3 3-4-4z\" fill=\"currentColor\" stroke=\"currentColor\" strokeWidth=\"2\" fillOpacity=\"0.3\" />\r\n </svg>\r\n ),\r\n 'align-left': <B d=\"M3 6h18 M3 12h12 M3 18h18 M3 24h8\" />,\r\n 'align-center': <B d=\"M3 6h18 M6 12h12 M3 18h18 M6 24h12\" />,\r\n 'align-right': <B d=\"M3 6h18 M9 12h12 M3 18h18 M12 24h9\" />,\r\n 'align-justify': <B d=\"M3 6h18 M3 12h18 M3 18h18 M3 24h18\" />,\r\n 'line-height': <B d=\"M4 12h16 M7 6l-3 6 3 6 M17 6l3 6-3 6\" />,\r\n h1: <span style={{ fontSize: 12, fontWeight: 700 }}>H1</span>,\r\n h2: <span style={{ fontSize: 12, fontWeight: 700 }}>H2</span>,\r\n h3: <span style={{ fontSize: 12, fontWeight: 700 }}>H3</span>,\r\n h4: <span style={{ fontSize: 12, fontWeight: 700 }}>H4</span>,\r\n 'list-ol': <B d=\"M10 6h10 M10 12h10 M10 18h10 M4 6l1-1v4 M4 12h2a1 1 0 0 1 0 2H4l2 2 M4 18h2a1 1 0 0 1 0 2H4l2 2\" />,\r\n 'list-ul': <B d=\"M10 6h10 M10 12h10 M10 18h10 M4 6h.01 M4 12h.01 M4 18h.01\" />,\r\n indent: <B d=\"M3 4h18 M3 12h10 M21 12h-8 M3 20h18 M14 9l3 3-3 3\" />,\r\n outdent: <B d=\"M3 4h18 M11 12h10 M3 20h18 M7 9l-3 3 3 3\" />,\r\n undo: <B d=\"M3 8h11a5 5 0 0 1 0 10h-5 M3 8l4-4 M3 8l4 4\" />,\r\n redo: <B d=\"M21 8H10a5 5 0 0 0 0 10h5 M21 8l-4-4 M21 8l-4 4\" />,\r\n 'format-painter': <B d=\"M3 7l4-4h7l4 4-3 3-2-2v6H8V8L6 10z\" />,\r\n 'clear-format': <B d=\"M4 7V4h16v3 M9 20h6 M12 4v16\" />,\r\n table: <B d=\"M3 3h18v18H3z M3 9h18 M3 15h18 M9 3v18 M15 3v18\" />,\r\n image: <B d=\"M3 3h18v18H3z M3 15l5-5 4 4 3-3 6 6 M8.5 8a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z\" />,\r\n hyperlink: <B d=\"M10 14a4 4 0 0 0 5.66 0l3-3a4 4 0 0 0-5.66-5.66l-1 1 M14 10a4 4 0 0 0-5.66 0l-3 3a4 4 0 1 0 5.66 5.66l1-1\" />,\r\n separator: <B d=\"M3 12h18\" />,\r\n 'page-break': <B d=\"M3 7h18 M3 13l3-3 3 3 3-3 3 3 3-3 3 3 M3 19h18\" />,\r\n math: <span style={{ fontSize: 12, fontStyle: 'italic' }}>∑</span>,\r\n control: <B d=\"M3 6h18v12H3z M7 10h10\" />,\r\n date: <B d=\"M3 5h18v16H3z M3 9h18 M8 3v4 M16 3v4\" />,\r\n comment: <B d=\"M3 4h18v12H7l-4 4V4z\" />\r\n}\r\n","import type { ComponentType } from 'react'\r\nimport type { ButtonRendererProps, ToolbarButtonId } from './config/types'\r\nimport { ICONS } from './icons'\r\n\r\ninterface ToolbarButtonProps {\r\n id: ToolbarButtonId\r\n active?: boolean\r\n disabled?: boolean\r\n onClick: () => void\r\n renderer?: ComponentType<ButtonRendererProps>\r\n label?: string\r\n shortcut?: string\r\n}\r\n\r\nexport function ToolbarButton({\r\n id,\r\n active = false,\r\n disabled = false,\r\n onClick,\r\n renderer: Renderer,\r\n label,\r\n shortcut\r\n}: ToolbarButtonProps) {\r\n if (Renderer) {\r\n return (\r\n <Renderer\r\n id={id}\r\n active={active}\r\n disabled={disabled}\r\n onClick={onClick}\r\n icon={ICONS[id]}\r\n label={label}\r\n shortcut={shortcut}\r\n />\r\n )\r\n }\r\n\r\n const className = [\r\n 'bke-btn',\r\n active ? 'bke-btn-active' : '',\r\n disabled ? 'bke-btn-disabled' : ''\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className={className}\r\n disabled={disabled}\r\n title={shortcut ?? label}\r\n onClick={onClick}\r\n data-bke-id={id}\r\n >\r\n {ICONS[id]}\r\n </button>\r\n )\r\n}\r\n","import { useState, useRef, useEffect, type ReactNode } from 'react'\r\n\r\ninterface DropdownProps {\r\n trigger: ReactNode\r\n children: ReactNode\r\n open?: boolean\r\n onOpenChange?: (open: boolean) => void\r\n align?: 'left' | 'right'\r\n}\r\n\r\nexport function Dropdown({ trigger, children, open, onOpenChange, align = 'left' }: DropdownProps) {\r\n const [internalOpen, setInternalOpen] = useState(false)\r\n const isControlled = open !== undefined\r\n const isOpen = isControlled ? open : internalOpen\r\n const ref = useRef<HTMLDivElement>(null)\r\n\r\n const setOpen = (next: boolean) => {\r\n if (!isControlled) setInternalOpen(next)\r\n onOpenChange?.(next)\r\n }\r\n\r\n useEffect(() => {\r\n if (!isOpen) return\r\n const onDocClick = (e: MouseEvent) => {\r\n if (ref.current && !ref.current.contains(e.target as Node)) {\r\n setOpen(false)\r\n }\r\n }\r\n document.addEventListener('mousedown', onDocClick)\r\n return () => document.removeEventListener('mousedown', onDocClick)\r\n }, [isOpen])\r\n\r\n return (\r\n <div className=\"bke-dropdown\" ref={ref}>\r\n <div className=\"bke-dropdown-trigger\" onClick={() => setOpen(!isOpen)}>\r\n {trigger}\r\n </div>\r\n {isOpen && (\r\n <div className={`bke-dropdown-panel bke-dropdown-align-${align}`}>{children}</div>\r\n )}\r\n </div>\r\n )\r\n}\r\n","interface ColorPickerProps {\r\n palette?: string[]\r\n onSelect: (color: string) => void\r\n}\r\n\r\nexport const DEFAULT_COLOR_PALETTE = [\r\n '#000000', '#666666', '#999999', '#FFFFFF',\r\n '#FF0000', '#FF6B35', '#FFD700', '#00C853',\r\n '#2383E2', '#6C5CE7', '#E84393', '#00B894'\r\n]\r\n\r\nexport function ColorPicker({ palette = DEFAULT_COLOR_PALETTE, onSelect }: ColorPickerProps) {\r\n return (\r\n <div className=\"bke-color-picker\">\r\n {palette.map(color => (\r\n <button\r\n key={color}\r\n type=\"button\"\r\n className=\"bke-color-swatch\"\r\n title={color}\r\n style={{ backgroundColor: color }}\r\n onClick={() => onSelect(color)}\r\n />\r\n ))}\r\n </div>\r\n )\r\n}\r\n","import { useState } from 'react'\r\n\r\ninterface TableGridPickerProps {\r\n maxRows?: number\r\n maxCols?: number\r\n onSelect: (rows: number, cols: number) => void\r\n}\r\n\r\nexport function TableGridPicker({ maxRows = 6, maxCols = 6, onSelect }: TableGridPickerProps) {\r\n const [hoverRow, setHoverRow] = useState(0)\r\n const [hoverCol, setHoverCol] = useState(0)\r\n\r\n return (\r\n <div className=\"bke-table-grid\">\r\n {Array.from({ length: maxRows }).map((_, r) => (\r\n <div key={r} className=\"bke-grid-row\">\r\n {Array.from({ length: maxCols }).map((_, c) => {\r\n const active = r < hoverRow && c < hoverCol\r\n return (\r\n <button\r\n key={c}\r\n type=\"button\"\r\n className={active ? 'bke-grid-cell bke-grid-cell-active' : 'bke-grid-cell'}\r\n onMouseEnter={() => {\r\n setHoverRow(r + 1)\r\n setHoverCol(c + 1)\r\n }}\r\n onClick={() => onSelect(r + 1, c + 1)}\r\n />\r\n )\r\n })}\r\n </div>\r\n ))}\r\n <div className=\"bke-grid-label\">\r\n {hoverRow > 0 && hoverCol > 0 ? `${hoverRow} × ${hoverCol}` : '选择行列'}\r\n </div>\r\n </div>\r\n )\r\n}\r\n","import { useState, useEffect } from 'react'\r\n\r\ninterface HyperlinkDialogProps {\r\n open: boolean\r\n initialUrl?: string\r\n initialText?: string\r\n onSubmit: (payload: { url: string; text: string }) => void\r\n onCancel: () => void\r\n}\r\n\r\nexport function HyperlinkDialog({\r\n open,\r\n initialUrl = '',\r\n initialText = '',\r\n onSubmit,\r\n onCancel\r\n}: HyperlinkDialogProps) {\r\n const [url, setUrl] = useState(initialUrl)\r\n const [text, setText] = useState(initialText)\r\n\r\n useEffect(() => {\r\n if (open) {\r\n setUrl(initialUrl)\r\n setText(initialText)\r\n }\r\n }, [open, initialUrl, initialText])\r\n\r\n if (!open) return null\r\n\r\n const submit = () => {\r\n if (!url.trim()) return\r\n onSubmit({ url: url.trim(), text: text.trim() })\r\n }\r\n\r\n return (\r\n <div className=\"bke-dialog-overlay\" onClick={onCancel}>\r\n <div className=\"bke-dialog\" onClick={e => e.stopPropagation()}>\r\n <h3 className=\"bke-dialog-title\">插入链接</h3>\r\n <label className=\"bke-field\">\r\n <span>URL</span>\r\n <input\r\n type=\"url\"\r\n placeholder=\"https://\"\r\n value={url}\r\n onChange={e => setUrl(e.target.value)}\r\n autoFocus\r\n />\r\n </label>\r\n <label className=\"bke-field\">\r\n <span>文字</span>\r\n <input\r\n type=\"text\"\r\n placeholder=\"链接文字(可选)\"\r\n value={text}\r\n onChange={e => setText(e.target.value)}\r\n />\r\n </label>\r\n <div className=\"bke-dialog-actions\">\r\n <button type=\"button\" onClick={onCancel}>取消</button>\r\n <button type=\"button\" onClick={submit} disabled={!url.trim()}>确定</button>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n","import { useState, useEffect } from 'react'\r\n\r\ninterface LatexDialogProps {\r\n open: boolean\r\n onSubmit: (latex: string) => void\r\n onCancel: () => void\r\n}\r\n\r\nexport function LatexDialog({ open, onSubmit, onCancel }: LatexDialogProps) {\r\n const [latex, setLatex] = useState('')\r\n\r\n useEffect(() => {\r\n if (open) setLatex('')\r\n }, [open])\r\n\r\n if (!open) return null\r\n\r\n const submit = () => {\r\n if (!latex.trim()) return\r\n onSubmit(latex.trim())\r\n }\r\n\r\n return (\r\n <div className=\"bke-dialog-overlay\" onClick={onCancel}>\r\n <div className=\"bke-dialog\" onClick={e => e.stopPropagation()}>\r\n <h3 className=\"bke-dialog-title\">插入公式</h3>\r\n <label className=\"bke-field\">\r\n <span>LaTeX</span>\r\n <textarea\r\n placeholder=\"E = mc^2\"\r\n value={latex}\r\n onChange={e => setLatex(e.target.value)}\r\n rows={4}\r\n autoFocus\r\n />\r\n </label>\r\n <div className=\"bke-dialog-actions\">\r\n <button type=\"button\" onClick={onCancel}>取消</button>\r\n <button type=\"button\" onClick={submit} disabled={!latex.trim()}>确定</button>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n","interface FieldPanelProps {\r\n visible: boolean\r\n}\r\n\r\nexport function FieldPanel({ visible }: FieldPanelProps) {\r\n if (!visible) return null\r\n return (\r\n <aside className=\"bke-field-panel\">\r\n <h3>字段</h3>\r\n <p style={{ fontSize: 12, opacity: 0.6 }}>字段面板将在 M3 实现</p>\r\n </aside>\r\n )\r\n}\r\n"],"mappings":"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","names":["BidEditor","Editor","import_react","import_react","import_react","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","_","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","BidEditor"]}
package/dist/index.css ADDED
@@ -0,0 +1,326 @@
1
+ /* src/react/styles.css */
2
+ .bke-root {
3
+ display: flex;
4
+ flex-direction: column;
5
+ width: 100%;
6
+ height: 100%;
7
+ font-family: var(--bke-font-family);
8
+ font-size: var(--bke-font-size);
9
+ color: var(--bke-color-text);
10
+ background: var(--bke-color-bg);
11
+ --bke-color-primary: #2383E2;
12
+ --bke-color-text: #37352F;
13
+ --bke-color-border: #EDEDED;
14
+ --bke-color-bg: #FAFAFA;
15
+ --bke-color-hover: #F1F1F0;
16
+ --bke-color-active: #E8E8E7;
17
+ --bke-radius-button: 4px;
18
+ --bke-radius-container: 8px;
19
+ --bke-spacing-button: 6px;
20
+ --bke-spacing-group: 4px;
21
+ --bke-font-size: 13px;
22
+ --bke-font-family:
23
+ system-ui,
24
+ -apple-system,
25
+ "Segoe UI",
26
+ sans-serif;
27
+ --bke-page-width: 794px;
28
+ }
29
+ .bke-root.bke-dark {
30
+ --bke-color-text: #E6E6E6;
31
+ --bke-color-border: #2A2A2A;
32
+ --bke-color-bg: #1F1F1F;
33
+ --bke-color-hover: #2D2D2D;
34
+ --bke-color-active: #3A3A3A;
35
+ }
36
+ .bke-toolbar {
37
+ display: flex;
38
+ align-items: center;
39
+ gap: var(--bke-spacing-group);
40
+ padding: 4px 8px;
41
+ background: var(--bke-color-bg);
42
+ border-bottom: 1px solid var(--bke-color-border);
43
+ border-radius: var(--bke-radius-container) var(--bke-radius-container) 0 0;
44
+ position: sticky;
45
+ top: 0;
46
+ z-index: 100;
47
+ min-height: 36px;
48
+ width: 100%;
49
+ max-width: var(--bke-page-width);
50
+ margin: 0 auto;
51
+ box-sizing: border-box;
52
+ flex-wrap: nowrap;
53
+ white-space: nowrap;
54
+ }
55
+ .bke-toolbar-group {
56
+ display: flex;
57
+ align-items: center;
58
+ gap: 1px;
59
+ flex-shrink: 0;
60
+ white-space: nowrap;
61
+ }
62
+ .bke-toolbar-divider {
63
+ width: 1px;
64
+ height: 14px;
65
+ background: var(--bke-color-border);
66
+ margin: 0 3px;
67
+ flex-shrink: 0;
68
+ }
69
+ .bke-btn {
70
+ display: inline-flex;
71
+ align-items: center;
72
+ justify-content: center;
73
+ width: 22px;
74
+ height: 22px;
75
+ border: none;
76
+ background: transparent;
77
+ color: var(--bke-color-text);
78
+ border-radius: var(--bke-radius-button);
79
+ cursor: pointer;
80
+ padding: 0;
81
+ transition: background-color 0.1s;
82
+ }
83
+ .bke-btn:hover:not(:disabled) {
84
+ background: var(--bke-color-hover);
85
+ }
86
+ .bke-btn-active {
87
+ background: var(--bke-color-active);
88
+ color: var(--bke-color-primary);
89
+ }
90
+ .bke-btn-disabled,
91
+ .bke-btn:disabled {
92
+ opacity: 0.4;
93
+ cursor: not-allowed;
94
+ }
95
+ .bke-dropdown {
96
+ position: relative;
97
+ display: inline-block;
98
+ }
99
+ .bke-dropdown-panel {
100
+ position: absolute;
101
+ top: 100%;
102
+ margin-top: 4px;
103
+ background: white;
104
+ border: 1px solid var(--bke-color-border);
105
+ border-radius: var(--bke-radius-container);
106
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);
107
+ padding: 8px;
108
+ z-index: 100;
109
+ min-width: 200px;
110
+ }
111
+ .bke-dropdown-align-right {
112
+ right: 0;
113
+ }
114
+ .bke-dark .bke-dropdown-panel {
115
+ background: #2A2A2A;
116
+ }
117
+ .bke-color-picker {
118
+ display: grid;
119
+ grid-template-columns: repeat(4, 1fr);
120
+ gap: 4px;
121
+ }
122
+ .bke-color-swatch {
123
+ width: 24px;
124
+ height: 24px;
125
+ border: 1px solid var(--bke-color-border);
126
+ border-radius: var(--bke-radius-button);
127
+ cursor: pointer;
128
+ }
129
+ .bke-table-grid {
130
+ display: flex;
131
+ flex-direction: column;
132
+ gap: 2px;
133
+ }
134
+ .bke-grid-row {
135
+ display: flex;
136
+ gap: 2px;
137
+ }
138
+ .bke-grid-cell {
139
+ width: 16px;
140
+ height: 16px;
141
+ border: 1px solid var(--bke-color-border);
142
+ background: transparent;
143
+ cursor: pointer;
144
+ }
145
+ .bke-grid-cell-active {
146
+ background: var(--bke-color-primary);
147
+ opacity: 0.3;
148
+ }
149
+ .bke-grid-label {
150
+ font-size: 11px;
151
+ color: var(--bke-color-text);
152
+ margin-top: 4px;
153
+ text-align: center;
154
+ }
155
+ .bke-list-menu {
156
+ display: flex;
157
+ flex-direction: column;
158
+ }
159
+ .bke-list-menu button {
160
+ border: none;
161
+ background: transparent;
162
+ padding: 6px 12px;
163
+ text-align: left;
164
+ cursor: pointer;
165
+ color: var(--bke-color-text);
166
+ font-size: var(--bke-font-size);
167
+ border-radius: var(--bke-radius-button);
168
+ }
169
+ .bke-list-menu button:hover {
170
+ background: var(--bke-color-hover);
171
+ }
172
+ .bke-dialog-overlay {
173
+ position: fixed;
174
+ top: 0;
175
+ left: 0;
176
+ width: 100%;
177
+ height: 100%;
178
+ background: rgba(0, 0, 0, 0.3);
179
+ display: flex;
180
+ align-items: center;
181
+ justify-content: center;
182
+ z-index: 1000;
183
+ }
184
+ .bke-dialog {
185
+ background: white;
186
+ padding: 24px;
187
+ border-radius: var(--bke-radius-container);
188
+ min-width: 360px;
189
+ display: flex;
190
+ flex-direction: column;
191
+ gap: 12px;
192
+ }
193
+ .bke-dark .bke-dialog {
194
+ background: #2A2A2A;
195
+ }
196
+ .bke-dialog-title {
197
+ margin: 0;
198
+ font-size: 16px;
199
+ }
200
+ .bke-field {
201
+ display: flex;
202
+ flex-direction: column;
203
+ gap: 4px;
204
+ font-size: 12px;
205
+ }
206
+ .bke-field input,
207
+ .bke-field textarea {
208
+ padding: 6px 8px;
209
+ border: 1px solid var(--bke-color-border);
210
+ border-radius: var(--bke-radius-button);
211
+ font-family: inherit;
212
+ font-size: var(--bke-font-size);
213
+ }
214
+ .bke-dialog-actions {
215
+ display: flex;
216
+ gap: 8px;
217
+ justify-content: flex-end;
218
+ }
219
+ .bke-dialog-actions button {
220
+ padding: 6px 16px;
221
+ border: 1px solid var(--bke-color-border);
222
+ background: white;
223
+ border-radius: var(--bke-radius-button);
224
+ cursor: pointer;
225
+ }
226
+ .bke-dialog-actions button:last-child {
227
+ background: var(--bke-color-primary);
228
+ color: white;
229
+ border-color: var(--bke-color-primary);
230
+ }
231
+ .bke-dialog-actions button:disabled {
232
+ opacity: 0.4;
233
+ cursor: not-allowed;
234
+ }
235
+ .bke-editor-host {
236
+ flex: 1;
237
+ overflow: auto;
238
+ padding: 0 16px 24px;
239
+ background: var(--bke-color-bg);
240
+ display: flex;
241
+ justify-content: center;
242
+ align-items: flex-start;
243
+ }
244
+ .bke-editor-canvas {
245
+ width: 100%;
246
+ max-width: var(--bke-page-width);
247
+ min-height: 1056px;
248
+ background: white;
249
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);
250
+ border-radius: 0 0 var(--bke-radius-container) var(--bke-radius-container);
251
+ box-sizing: border-box;
252
+ }
253
+ .bke-dark .bke-editor-canvas {
254
+ background: #2A2A2A;
255
+ }
256
+ .bke-editor-canvas .ce-page-container {
257
+ margin: 0 auto !important;
258
+ background: transparent !important;
259
+ box-shadow: none !important;
260
+ }
261
+ .bke-field-panel {
262
+ width: 240px;
263
+ border-left: 1px solid var(--bke-color-border);
264
+ padding: 16px;
265
+ }
266
+ .bke-toolbar-measure {
267
+ position: absolute;
268
+ top: -9999px;
269
+ left: -9999px;
270
+ visibility: hidden;
271
+ pointer-events: none;
272
+ display: flex;
273
+ align-items: center;
274
+ gap: var(--bke-spacing-group);
275
+ padding: 4px 8px;
276
+ box-sizing: border-box;
277
+ z-index: -1;
278
+ }
279
+ .bke-more-btn {
280
+ flex-shrink: 0;
281
+ }
282
+ .bke-more-btn:hover:not(:disabled) {
283
+ background: var(--bke-color-hover);
284
+ }
285
+ .bke-toolbar-overflow {
286
+ display: flex;
287
+ flex-direction: column;
288
+ gap: 8px;
289
+ padding: 4px;
290
+ min-width: 240px;
291
+ max-width: 320px;
292
+ }
293
+ .bke-toolbar-overflow .bke-toolbar-group {
294
+ flex-wrap: wrap;
295
+ gap: 2px;
296
+ row-gap: 2px;
297
+ }
298
+ .bke-toolbar-overflow .bke-toolbar-divider {
299
+ display: none;
300
+ }
301
+ .bke-toolbar-collapsed {
302
+ display: flex;
303
+ flex-direction: column;
304
+ gap: 8px;
305
+ padding: 8px;
306
+ }
307
+ .bke-toolbar-collapsed .bke-toolbar-group {
308
+ flex-direction: column;
309
+ }
310
+ @media print {
311
+ .bke-toolbar {
312
+ display: none !important;
313
+ }
314
+ .bke-toolbar-measure {
315
+ display: none !important;
316
+ }
317
+ .bke-editor-host {
318
+ padding: 0;
319
+ background: white;
320
+ overflow: visible;
321
+ }
322
+ .bke-editor-canvas {
323
+ box-shadow: none;
324
+ }
325
+ }
326
+ /*# sourceMappingURL=index.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/styles.css"],"sourcesContent":[".bke-root {\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n height: 100%;\r\n font-family: var(--bke-font-family);\r\n font-size: var(--bke-font-size);\r\n color: var(--bke-color-text);\r\n background: var(--bke-color-bg);\r\n --bke-color-primary: #2383E2;\r\n --bke-color-text: #37352F;\r\n --bke-color-border: #EDEDED;\r\n --bke-color-bg: #FAFAFA;\r\n --bke-color-hover: #F1F1F0;\r\n --bke-color-active: #E8E8E7;\r\n --bke-radius-button: 4px;\r\n --bke-radius-container: 8px;\r\n --bke-spacing-button: 6px;\r\n --bke-spacing-group: 4px;\r\n --bke-font-size: 13px;\r\n --bke-font-family: system-ui, -apple-system, 'Segoe UI', sans-serif;\r\n /* canvas-editor 默认 A4 page 宽度为 794px(在内部根 div 上硬编码)。\r\n * toolbar 与 canvas 容器使用同一宽度,保证两者与可见纸张左右对齐。 */\r\n --bke-page-width: 794px;\r\n}\r\n\r\n.bke-root.bke-dark {\r\n --bke-color-text: #E6E6E6;\r\n --bke-color-border: #2A2A2A;\r\n --bke-color-bg: #1F1F1F;\r\n --bke-color-hover: #2D2D2D;\r\n --bke-color-active: #3A3A3A;\r\n}\r\n\r\n.bke-toolbar {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--bke-spacing-group);\r\n padding: 4px 8px;\r\n background: var(--bke-color-bg);\r\n border-bottom: 1px solid var(--bke-color-border);\r\n border-radius: var(--bke-radius-container) var(--bke-radius-container) 0 0;\r\n position: sticky;\r\n top: 0;\r\n z-index: 100;\r\n min-height: 36px;\r\n width: 100%;\r\n max-width: var(--bke-page-width);\r\n margin: 0 auto;\r\n box-sizing: border-box;\r\n flex-wrap: nowrap;\r\n white-space: nowrap;\r\n}\r\n\r\n.bke-toolbar-group {\r\n display: flex;\r\n align-items: center;\r\n gap: 1px;\r\n flex-shrink: 0;\r\n white-space: nowrap;\r\n}\r\n\r\n.bke-toolbar-divider {\r\n width: 1px;\r\n height: 14px;\r\n background: var(--bke-color-border);\r\n margin: 0 3px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.bke-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 22px;\r\n height: 22px;\r\n border: none;\r\n background: transparent;\r\n color: var(--bke-color-text);\r\n border-radius: var(--bke-radius-button);\r\n cursor: pointer;\r\n padding: 0;\r\n transition: background-color 0.1s;\r\n}\r\n.bke-btn:hover:not(:disabled) {\r\n background: var(--bke-color-hover);\r\n}\r\n.bke-btn-active {\r\n background: var(--bke-color-active);\r\n color: var(--bke-color-primary);\r\n}\r\n.bke-btn-disabled,\r\n.bke-btn:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n}\r\n\r\n.bke-dropdown {\r\n position: relative;\r\n display: inline-block;\r\n}\r\n.bke-dropdown-panel {\r\n position: absolute;\r\n top: 100%;\r\n margin-top: 4px;\r\n background: white;\r\n border: 1px solid var(--bke-color-border);\r\n border-radius: var(--bke-radius-container);\r\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);\r\n padding: 8px;\r\n z-index: 100;\r\n min-width: 200px;\r\n}\r\n.bke-dropdown-align-right {\r\n right: 0;\r\n}\r\n.bke-dark .bke-dropdown-panel {\r\n background: #2A2A2A;\r\n}\r\n\r\n.bke-color-picker {\r\n display: grid;\r\n grid-template-columns: repeat(4, 1fr);\r\n gap: 4px;\r\n}\r\n.bke-color-swatch {\r\n width: 24px;\r\n height: 24px;\r\n border: 1px solid var(--bke-color-border);\r\n border-radius: var(--bke-radius-button);\r\n cursor: pointer;\r\n}\r\n\r\n.bke-table-grid {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 2px;\r\n}\r\n.bke-grid-row {\r\n display: flex;\r\n gap: 2px;\r\n}\r\n.bke-grid-cell {\r\n width: 16px;\r\n height: 16px;\r\n border: 1px solid var(--bke-color-border);\r\n background: transparent;\r\n cursor: pointer;\r\n}\r\n.bke-grid-cell-active {\r\n background: var(--bke-color-primary);\r\n opacity: 0.3;\r\n}\r\n.bke-grid-label {\r\n font-size: 11px;\r\n color: var(--bke-color-text);\r\n margin-top: 4px;\r\n text-align: center;\r\n}\r\n\r\n.bke-list-menu {\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n.bke-list-menu button {\r\n border: none;\r\n background: transparent;\r\n padding: 6px 12px;\r\n text-align: left;\r\n cursor: pointer;\r\n color: var(--bke-color-text);\r\n font-size: var(--bke-font-size);\r\n border-radius: var(--bke-radius-button);\r\n}\r\n.bke-list-menu button:hover {\r\n background: var(--bke-color-hover);\r\n}\r\n\r\n.bke-dialog-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: rgba(0, 0, 0, 0.3);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 1000;\r\n}\r\n.bke-dialog {\r\n background: white;\r\n padding: 24px;\r\n border-radius: var(--bke-radius-container);\r\n min-width: 360px;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n}\r\n.bke-dark .bke-dialog {\r\n background: #2A2A2A;\r\n}\r\n.bke-dialog-title {\r\n margin: 0;\r\n font-size: 16px;\r\n}\r\n.bke-field {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n font-size: 12px;\r\n}\r\n.bke-field input,\r\n.bke-field textarea {\r\n padding: 6px 8px;\r\n border: 1px solid var(--bke-color-border);\r\n border-radius: var(--bke-radius-button);\r\n font-family: inherit;\r\n font-size: var(--bke-font-size);\r\n}\r\n.bke-dialog-actions {\r\n display: flex;\r\n gap: 8px;\r\n justify-content: flex-end;\r\n}\r\n.bke-dialog-actions button {\r\n padding: 6px 16px;\r\n border: 1px solid var(--bke-color-border);\r\n background: white;\r\n border-radius: var(--bke-radius-button);\r\n cursor: pointer;\r\n}\r\n.bke-dialog-actions button:last-child {\r\n background: var(--bke-color-primary);\r\n color: white;\r\n border-color: var(--bke-color-primary);\r\n}\r\n.bke-dialog-actions button:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n}\r\n\r\n.bke-editor-host {\r\n flex: 1;\r\n overflow: auto;\r\n padding: 0 16px 24px;\r\n background: var(--bke-color-bg);\r\n display: flex;\r\n justify-content: center;\r\n align-items: flex-start;\r\n}\r\n.bke-editor-canvas {\r\n width: 100%;\r\n max-width: var(--bke-page-width);\r\n min-height: 1056px;\r\n background: white;\r\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);\r\n border-radius: 0 0 var(--bke-radius-container) var(--bke-radius-container);\r\n box-sizing: border-box;\r\n}\r\n.bke-dark .bke-editor-canvas {\r\n background: #2A2A2A;\r\n}\r\n/* canvas-editor 内部 page 容器:透明背景、无圆角(外层 .bke-editor-canvas 已提供轮廓) */\r\n.bke-editor-canvas .ce-page-container {\r\n margin: 0 auto !important;\r\n background: transparent !important;\r\n box-shadow: none !important;\r\n}\r\n\r\n.bke-field-panel {\r\n width: 240px;\r\n border-left: 1px solid var(--bke-color-border);\r\n padding: 16px;\r\n}\r\n\r\n/* 动态测量层:用于计算 group 实际宽度,决定哪些溢出收起到\"更多\" */\r\n.bke-toolbar-measure {\r\n position: absolute;\r\n top: -9999px;\r\n left: -9999px;\r\n visibility: hidden;\r\n pointer-events: none;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--bke-spacing-group);\r\n padding: 4px 8px;\r\n box-sizing: border-box;\r\n z-index: -1;\r\n}\r\n\r\n/* \"更多\"按钮:跟普通按钮同尺寸,但稍微强调 */\r\n.bke-more-btn {\r\n flex-shrink: 0;\r\n}\r\n.bke-more-btn:hover:not(:disabled) {\r\n background: var(--bke-color-hover);\r\n}\r\n\r\n/* \"更多\"下拉面板:按分组纵向排列,分组之间有 label + 分割 */\r\n.bke-toolbar-overflow {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n padding: 4px;\r\n min-width: 240px;\r\n max-width: 320px;\r\n}\r\n.bke-toolbar-overflow .bke-toolbar-group {\r\n flex-wrap: wrap;\r\n gap: 2px;\r\n row-gap: 2px;\r\n}\r\n.bke-toolbar-overflow .bke-toolbar-divider {\r\n display: none;\r\n}\r\n\r\n.bke-toolbar-collapsed {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n padding: 8px;\r\n}\r\n.bke-toolbar-collapsed .bke-toolbar-group {\r\n flex-direction: column;\r\n}\r\n\r\n@media print {\r\n .bke-toolbar { display: none !important; }\r\n .bke-toolbar-measure { display: none !important; }\r\n .bke-editor-host { padding: 0; background: white; overflow: visible; }\r\n .bke-editor-canvas { box-shadow: none; }\r\n}\r\n"],"mappings":"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","names":[]}