@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/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/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":["useRef","useEffect","useState","useEffect","useState","useState","useRef","useCallback","jsx","useState","useRef","useEffect","jsx","jsxs","jsx","useState","jsx","jsxs","_","useState","useEffect","jsx","jsxs","useState","useEffect","jsx","jsxs","jsx","jsxs","useState","useRef","jsx","jsxs","jsx","jsxs","BidEditor","useRef"]}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@os-team-11/editor",
3
+ "version": "0.1.0",
4
+ "description": "Bid document editor built on @hufe921/canvas-editor",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "README.md",
20
+ "LICENSE"
21
+ ],
22
+ "scripts": {
23
+ "build": "tsup",
24
+ "test": "vitest run",
25
+ "test:watch": "vitest",
26
+ "type:check": "tsc --noEmit",
27
+ "playground": "vite playground"
28
+ },
29
+ "peerDependencies": {
30
+ "@hufe921/canvas-editor": "^0.9.0",
31
+ "react": "^18.0.0 || ^19.0.0",
32
+ "react-dom": "^18.0.0 || ^19.0.0"
33
+ },
34
+ "dependencies": {
35
+ "zod": "^3.23.8"
36
+ },
37
+ "devDependencies": {
38
+ "@hufe921/canvas-editor": "^0.9.131",
39
+ "@testing-library/react": "^16.0.0",
40
+ "@testing-library/jest-dom": "^6.4.0",
41
+ "@types/node": "^20.11.0",
42
+ "@types/react": "^18.2.0",
43
+ "@types/react-dom": "^18.2.0",
44
+ "jsdom": "^25.0.1",
45
+ "react": "^18.2.0",
46
+ "react-dom": "^18.2.0",
47
+ "tsup": "^8.0.1",
48
+ "typescript": "^5.3.3",
49
+ "vite": "^5.0.0",
50
+ "vitest": "^2.0.0"
51
+ }
52
+ }