@jiujue/react-canvas-fiber 1.1.1

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/runtime/nodes.ts","../src/render/drawTree.ts","../src/utils/style.ts","../src/layout/layoutTree.ts","../src/runtime/reconciler.ts","../src/runtime/root.ts","../src/components/Canvas.tsx","../src/jsx/index.ts"],"names":["resolveInheritedTextStyle","metrics","travel","deltaThumb","clamped","target","rootInstanceId"],"mappings":"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","file":"index.js","sourcesContent":["import type { CanvasNode, NodeType, RootNode } from '../types'\nexport type { CanvasNode, Layout, NodeType, RootNode, RectNode, TextNode, ViewNode } from '../types'\n\nlet nextDebugId = 1\n\n/**\n * 场景树节点的运行时实现。\n *\n * 类型定义集中在 src/types,runtime 侧只保留“创建节点”的行为:\n * - createRootNode: 容器根节点(不对应 JSX)\n * - createNode: JSX intrinsic element 对应的节点\n */\nexport function createRootNode(): RootNode {\n\treturn {\n\t\ttype: 'Root',\n\t\tdebugId: nextDebugId++,\n\t\tparent: null,\n\t\tchildren: [],\n\t\tprops: {},\n\t\tlayout: { x: 0, y: 0, width: 0, height: 0 },\n\t\tyogaNode: null,\n\t\tscrollLeft: 0,\n\t\tscrollTop: 0,\n\t\tscrollContentWidth: 0,\n\t\tscrollContentHeight: 0,\n\t\tscrollbarDrag: null,\n\t}\n}\n\n/**\n * 根据 intrinsic element type 创建场景节点。\n */\nexport function createNode(type: Exclude<NodeType, 'Root'>, props: any): CanvasNode {\n\treturn {\n\t\ttype,\n\t\tdebugId: nextDebugId++,\n\t\tparent: null,\n\t\tchildren: [],\n\t\tprops,\n\t\tlayout: { x: 0, y: 0, width: 0, height: 0 },\n\t\tyogaNode: null,\n\t\tscrollLeft: 0,\n\t\tscrollTop: 0,\n\t\tscrollContentWidth: 0,\n\t\tscrollContentHeight: 0,\n\t\tscrollbarDrag: null,\n\t} as CanvasNode\n}\n","import type { CanvasNode, RootNode } from '../runtime/nodes'\nimport type { DrawState } from '../types'\nimport type { CanvasRootOptions } from '../types'\n\n/**\n * Canvas2D 绘制层:将布局后的场景树绘制到 CanvasRenderingContext2D。\n *\n * 约束:\n * - 只实现最小图元:View(背景)、Rect、Text\n * - Text 只支持 \\n 手动换行,不做自动换行与对齐\n * - 子节点坐标以父节点为参照系,递归累加 offset\n */\nfunction resolveInheritedTextStyle(node: CanvasNode, defaults?: CanvasRootOptions) {\n\tconst own = (node.props as any)?.style ?? {}\n\tlet fontSize: number | undefined = own.fontSize\n\tlet fontFamily: string | undefined = own.fontFamily\n\tlet fontWeight: number | string | undefined = own.fontWeight\n\tlet lineHeight: number | undefined = own.lineHeight\n\n\tlet current = node.parent\n\twhile (\n\t\tcurrent &&\n\t\t(fontSize == null || fontFamily == null || fontWeight == null || lineHeight == null)\n\t) {\n\t\tconst s = (current.props as any)?.style ?? {}\n\t\tif (fontSize == null && typeof s.fontSize === 'number') fontSize = s.fontSize\n\t\tif (fontFamily == null && typeof s.fontFamily === 'string') fontFamily = s.fontFamily\n\t\tif (\n\t\t\tfontWeight == null &&\n\t\t\t(typeof s.fontWeight === 'number' || typeof s.fontWeight === 'string')\n\t\t)\n\t\t\tfontWeight = s.fontWeight\n\t\tif (lineHeight == null && typeof s.lineHeight === 'number') lineHeight = s.lineHeight\n\t\tcurrent = current.parent\n\t}\n\n\tconst resolvedFontSize = fontSize ?? defaults?.fontSize ?? 16\n\tconst resolvedFontFamily = fontFamily ?? defaults?.fontFamily ?? 'system-ui'\n\tconst resolvedFontWeight = fontWeight ?? defaults?.fontWeight ?? 400\n\tconst resolvedLineHeight =\n\t\tlineHeight ?? defaults?.lineHeight ?? Math.round(resolvedFontSize * 1.2)\n\treturn {\n\t\tfontSize: resolvedFontSize,\n\t\tfontFamily: resolvedFontFamily,\n\t\tfontWeight: resolvedFontWeight,\n\t\tlineHeight: resolvedLineHeight,\n\t\tfont: `${resolvedFontWeight} ${resolvedFontSize}px ${resolvedFontFamily}`,\n\t}\n}\n\n/**\n * 绘制圆角矩形路径(仅创建 path,不会自动 fill/stroke)。\n */\nfunction drawRoundedRect(\n\tctx: CanvasRenderingContext2D,\n\tx: number,\n\ty: number,\n\tw: number,\n\th: number,\n\tr: number,\n) {\n\tconst radius = Math.max(0, Math.min(r, Math.min(w, h) / 2))\n\tctx.beginPath()\n\tctx.moveTo(x + radius, y)\n\tctx.arcTo(x + w, y, x + w, y + h, radius)\n\tctx.arcTo(x + w, y + h, x, y + h, radius)\n\tctx.arcTo(x, y + h, x, y, radius)\n\tctx.arcTo(x, y, x + w, y, radius)\n\tctx.closePath()\n}\n\n/**\n * 绘制单个节点及其子树。\n * offsetX/offsetY 为父节点累加的偏移,用于把 computed layout 转换成最终画布坐标。\n */\nfunction drawNode(state: DrawState, node: CanvasNode, offsetX: number, offsetY: number) {\n\tconst { ctx } = state\n\tconst x = offsetX + node.layout.x\n\tconst y = offsetY + node.layout.y\n\tconst w = node.layout.width\n\tconst h = node.layout.height\n\n\tif (node.type === 'View') {\n\t\tconst background = (node.props as any).background\n\t\tconst scrollX = !!(node.props as any)?.scrollX\n\t\tconst scrollY = !!(node.props as any)?.scrollY\n\t\tconst scrollLeft = scrollX ? (node.scrollLeft ?? 0) : 0\n\t\tconst scrollTop = scrollY ? (node.scrollTop ?? 0) : 0\n\t\tconst scrollbarX = scrollX ? (node.props as any)?.scrollbarX !== false : false\n\t\tconst scrollbarY = scrollY ? (node.props as any)?.scrollbarY !== false : false\n\t\tconst scrollbarWidth = (node.props as any)?.scrollbarWidth ?? 10\n\t\tconst scrollbarInset = (node.props as any)?.scrollbarInset ?? 6\n\t\tconst scrollbarTrackColor = (node.props as any)?.scrollbarTrackColor ?? 'rgba(255,255,255,0.12)'\n\t\tconst scrollbarThumbColor = (node.props as any)?.scrollbarThumbColor ?? 'rgba(255,255,255,0.35)'\n\t\tconst contentWidth = node.scrollContentWidth ?? 0\n\t\tconst contentHeight = node.scrollContentHeight ?? 0\n\t\tconst maxScrollLeft = Math.max(0, contentWidth - w)\n\t\tconst maxScrollTop = Math.max(0, contentHeight - h)\n\n\t\tif (background) {\n\t\t\tconst radius = (node.props as any).borderRadius ?? 0\n\t\t\tctx.save()\n\t\t\tctx.fillStyle = background\n\t\t\tdrawRoundedRect(ctx, x, y, w, h, radius)\n\t\t\tctx.fill()\n\t\t\tctx.restore()\n\t\t}\n\n\t\tif (scrollX || scrollY) {\n\t\t\tctx.save()\n\t\t\tctx.beginPath()\n\t\t\tctx.rect(x, y, w, h)\n\t\t\tctx.clip()\n\t\t\tfor (const child of node.children) {\n\t\t\t\tdrawNode(state, child, x - scrollLeft, y - scrollTop)\n\t\t\t}\n\t\t\tctx.restore()\n\n\t\t\tconst corner = scrollbarInset + scrollbarWidth\n\n\t\t\tif (scrollbarY && maxScrollTop > 0) {\n\t\t\t\tconst trackX = x + w - scrollbarInset - scrollbarWidth\n\t\t\t\tconst trackY = y + scrollbarInset\n\t\t\t\tconst trackH = Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\th - scrollbarInset * 2 - (scrollbarX && maxScrollLeft > 0 ? corner : 0),\n\t\t\t\t)\n\t\t\t\tconst minThumbH = 16\n\t\t\t\tconst thumbH =\n\t\t\t\t\tcontentHeight > 0\n\t\t\t\t\t\t? Math.max(minThumbH, Math.min(trackH, (trackH * h) / contentHeight))\n\t\t\t\t\t\t: trackH\n\t\t\t\tconst travel = Math.max(0, trackH - thumbH)\n\t\t\t\tconst thumbY = travel > 0 ? trackY + (scrollTop / maxScrollTop) * travel : trackY\n\t\t\t\tconst radius = Math.min(6, scrollbarWidth / 2)\n\n\t\t\t\tctx.save()\n\t\t\t\tctx.fillStyle = scrollbarTrackColor\n\t\t\t\tdrawRoundedRect(ctx, trackX, trackY, scrollbarWidth, trackH, radius)\n\t\t\t\tctx.fill()\n\t\t\t\tctx.fillStyle = scrollbarThumbColor\n\t\t\t\tdrawRoundedRect(ctx, trackX, thumbY, scrollbarWidth, thumbH, radius)\n\t\t\t\tctx.fill()\n\t\t\t\tctx.restore()\n\t\t\t}\n\n\t\t\tif (scrollbarX && maxScrollLeft > 0) {\n\t\t\t\tconst trackX = x + scrollbarInset\n\t\t\t\tconst trackY = y + h - scrollbarInset - scrollbarWidth\n\t\t\t\tconst trackW = Math.max(\n\t\t\t\t\t0,\n\t\t\t\t\tw - scrollbarInset * 2 - (scrollbarY && maxScrollTop > 0 ? corner : 0),\n\t\t\t\t)\n\t\t\t\tconst minThumbW = 16\n\t\t\t\tconst thumbW =\n\t\t\t\t\tcontentWidth > 0\n\t\t\t\t\t\t? Math.max(minThumbW, Math.min(trackW, (trackW * w) / contentWidth))\n\t\t\t\t\t\t: trackW\n\t\t\t\tconst travel = Math.max(0, trackW - thumbW)\n\t\t\t\tconst thumbX = travel > 0 ? trackX + (scrollLeft / maxScrollLeft) * travel : trackX\n\t\t\t\tconst radius = Math.min(6, scrollbarWidth / 2)\n\n\t\t\t\tctx.save()\n\t\t\t\tctx.fillStyle = scrollbarTrackColor\n\t\t\t\tdrawRoundedRect(ctx, trackX, trackY, trackW, scrollbarWidth, radius)\n\t\t\t\tctx.fill()\n\t\t\t\tctx.fillStyle = scrollbarThumbColor\n\t\t\t\tdrawRoundedRect(ctx, thumbX, trackY, thumbW, scrollbarWidth, radius)\n\t\t\t\tctx.fill()\n\t\t\t\tctx.restore()\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\t}\n\n\tif (node.type === 'Rect') {\n\t\tconst fill = node.props.fill ?? '#ffffff'\n\t\tconst stroke = node.props.stroke\n\t\tconst lineWidth = node.props.lineWidth ?? 1\n\t\tconst radius = node.props.borderRadius ?? 0\n\t\tctx.save()\n\t\tdrawRoundedRect(ctx, x, y, w, h, radius)\n\t\tif (fill) {\n\t\t\tctx.fillStyle = fill\n\t\t\tctx.fill()\n\t\t}\n\t\tif (stroke) {\n\t\t\tctx.strokeStyle = stroke\n\t\t\tctx.lineWidth = lineWidth\n\t\t\tctx.stroke()\n\t\t}\n\t\tctx.restore()\n\t}\n\n\tif (node.type === 'Text') {\n\t\tconst text = node.props.text\n\t\tconst color = node.props.color ?? '#ffffff'\n\t\tconst { font, lineHeight } = resolveInheritedTextStyle(node, state.defaults)\n\t\tctx.save()\n\t\tctx.font = font\n\t\tctx.fillStyle = color\n\t\tctx.textBaseline = 'top'\n\t\tconst lines = String(text).split('\\n')\n\t\tfor (let i = 0; i < lines.length; i += 1) {\n\t\t\tctx.fillText(lines[i], x, y + i * lineHeight)\n\t\t}\n\t\tctx.restore()\n\t}\n\n\tfor (const child of node.children) {\n\t\tdrawNode(state, child, x, y)\n\t}\n}\n\n/**\n * draw pass 入口:\n * - 先清屏(clearColor 存在则填充底色,否则 clearRect)\n * - 再设置 dpr 变换,保证布局使用“逻辑像素”时也能在高分屏清晰绘制\n */\nexport function drawTree(\n\troot: RootNode,\n\tctx: CanvasRenderingContext2D,\n\tdpr: number,\n\tclearColor?: string,\n\tdefaults?: CanvasRootOptions,\n) {\n\tconst w = ctx.canvas.width\n\tconst h = ctx.canvas.height\n\tctx.save()\n\tif (clearColor) {\n\t\tctx.fillStyle = clearColor\n\t\tctx.fillRect(0, 0, w, h)\n\t} else {\n\t\tctx.clearRect(0, 0, w, h)\n\t}\n\tctx.restore()\n\n\tctx.save()\n\tctx.setTransform(dpr, 0, 0, dpr, 0, 0)\n\tconst state: DrawState = { ctx, dpr, defaults }\n\tfor (const child of root.children) {\n\t\tdrawNode(state, child, 0, 0)\n\t}\n\tctx.restore()\n}\n","import type { YogaStyle } from '../types'\n\n/**\n * 将类似 CSS 的 padding/margin 简写归一化为四边值。\n *\n * 支持:\n * - padding / paddingHorizontal / paddingVertical / paddingTop/Right/Bottom/Left\n * - margin / marginHorizontal / marginVertical / marginTop/Right/Bottom/Left\n */\nexport function normalizeInsets(style?: YogaStyle) {\n\tconst paddingHorizontal = style?.paddingHorizontal ?? style?.padding ?? 0\n\tconst paddingVertical = style?.paddingVertical ?? style?.padding ?? 0\n\tconst marginHorizontal = style?.marginHorizontal ?? style?.margin ?? 0\n\tconst marginVertical = style?.marginVertical ?? style?.margin ?? 0\n\n\treturn {\n\t\tpaddingTop: style?.paddingTop ?? paddingVertical,\n\t\tpaddingRight: style?.paddingRight ?? paddingHorizontal,\n\t\tpaddingBottom: style?.paddingBottom ?? paddingVertical,\n\t\tpaddingLeft: style?.paddingLeft ?? paddingHorizontal,\n\t\tmarginTop: style?.marginTop ?? marginVertical,\n\t\tmarginRight: style?.marginRight ?? marginHorizontal,\n\t\tmarginBottom: style?.marginBottom ?? marginVertical,\n\t\tmarginLeft: style?.marginLeft ?? marginHorizontal,\n\t}\n}\n","import {\n\tAlign,\n\tDirection,\n\tEdge,\n\tFlexDirection,\n\tGutter,\n\tJustify,\n\tMeasureMode,\n\tPositionType,\n\tWrap,\n\tloadYoga,\n} from 'yoga-layout/load'\nimport type { CanvasNode, RootNode, TextNode, ViewNode } from '../runtime/nodes'\nimport { normalizeInsets } from '../utils'\nimport type { LayoutEngine } from '../types'\nimport type { CanvasRootOptions } from '../types'\n\n/**\n * Yoga 布局层:把场景树同步到 Yoga 树,计算布局,再把 computed layout 写回节点。\n *\n * 约束:\n * - 这里只实现“足够 demo 使用”的 YogaStyle 子集(不含百分比/auto/边框等复杂 CSS 特性)\n * - Text 的测量依赖 measureText 回调(通常来自 Canvas2D measureText)\n */\nlet layoutEnginePromise: Promise<LayoutEngine> | null = null\n\n/**\n * Yoga WASM 只需初始化一次;这里用 Promise 缓存,避免重复加载。\n */\nexport function getLayoutEngine(): Promise<LayoutEngine> {\n\tif (!layoutEnginePromise) {\n\t\tlayoutEnginePromise = (async () => {\n\t\t\tconst yoga = await loadYoga()\n\t\t\treturn { yoga }\n\t\t})()\n\t}\n\treturn layoutEnginePromise\n}\n\n/**\n * 将 YogaStyle 映射到 yoga Node。\n */\nfunction applyYogaStyle(node: any, style: any) {\n\tconst s = style ?? {}\n\tif (typeof s.width === 'number') node.setWidth(s.width)\n\tif (typeof s.height === 'number') node.setHeight(s.height)\n\tif (typeof s.minWidth === 'number') node.setMinWidth(s.minWidth)\n\tif (typeof s.minHeight === 'number') node.setMinHeight(s.minHeight)\n\tif (typeof s.maxWidth === 'number') node.setMaxWidth(s.maxWidth)\n\tif (typeof s.maxHeight === 'number') node.setMaxHeight(s.maxHeight)\n\n\tconst insets = normalizeInsets(s)\n\tnode.setPadding(Edge.Top, insets.paddingTop)\n\tnode.setPadding(Edge.Right, insets.paddingRight)\n\tnode.setPadding(Edge.Bottom, insets.paddingBottom)\n\tnode.setPadding(Edge.Left, insets.paddingLeft)\n\n\tnode.setMargin(Edge.Top, insets.marginTop)\n\tnode.setMargin(Edge.Right, insets.marginRight)\n\tnode.setMargin(Edge.Bottom, insets.marginBottom)\n\tnode.setMargin(Edge.Left, insets.marginLeft)\n\n\tif (typeof s.flexGrow === 'number') node.setFlexGrow(s.flexGrow)\n\tif (typeof s.flexShrink === 'number') node.setFlexShrink(s.flexShrink)\n\tif (typeof s.flexBasis === 'number') node.setFlexBasis(s.flexBasis)\n\n\tif (s.flexDirection === 'row') node.setFlexDirection(FlexDirection.Row)\n\tif (s.flexDirection === 'column') node.setFlexDirection(FlexDirection.Column)\n\n\tif (s.justifyContent === 'flex-start') node.setJustifyContent(Justify.FlexStart)\n\tif (s.justifyContent === 'center') node.setJustifyContent(Justify.Center)\n\tif (s.justifyContent === 'flex-end') node.setJustifyContent(Justify.FlexEnd)\n\tif (s.justifyContent === 'space-between') node.setJustifyContent(Justify.SpaceBetween)\n\tif (s.justifyContent === 'space-around') node.setJustifyContent(Justify.SpaceAround)\n\n\tif (s.alignItems === 'stretch') node.setAlignItems(Align.Stretch)\n\tif (s.alignItems === 'flex-start') node.setAlignItems(Align.FlexStart)\n\tif (s.alignItems === 'center') node.setAlignItems(Align.Center)\n\tif (s.alignItems === 'flex-end') node.setAlignItems(Align.FlexEnd)\n\n\tif (s.alignContent === 'stretch') node.setAlignContent(Align.Stretch)\n\tif (s.alignContent === 'flex-start') node.setAlignContent(Align.FlexStart)\n\tif (s.alignContent === 'center') node.setAlignContent(Align.Center)\n\tif (s.alignContent === 'flex-end') node.setAlignContent(Align.FlexEnd)\n\tif (s.alignContent === 'space-between') node.setAlignContent(Align.SpaceBetween)\n\tif (s.alignContent === 'space-around') node.setAlignContent(Align.SpaceAround)\n\n\tif (s.flexWrap === 'no-wrap') node.setFlexWrap(Wrap.NoWrap)\n\tif (s.flexWrap === 'wrap') node.setFlexWrap(Wrap.Wrap)\n\n\tif (s.position === 'absolute') node.setPositionType(PositionType.Absolute)\n\tif (s.position === 'relative') node.setPositionType(PositionType.Relative)\n\n\tif (typeof s.top === 'number') node.setPosition(Edge.Top, s.top)\n\tif (typeof s.right === 'number') node.setPosition(Edge.Right, s.right)\n\tif (typeof s.bottom === 'number') node.setPosition(Edge.Bottom, s.bottom)\n\tif (typeof s.left === 'number') node.setPosition(Edge.Left, s.left)\n\n\tif (typeof s.gap === 'number') {\n\t\tnode.setGap(Gutter.All, s.gap)\n\t}\n}\n\nfunction resolveInheritedTextStyle(textNode: TextNode, defaults?: CanvasRootOptions) {\n\tconst own = textNode.props.style ?? {}\n\tlet fontSize: number | undefined = own.fontSize\n\tlet fontFamily: string | undefined = own.fontFamily\n\tlet fontWeight: number | string | undefined = own.fontWeight\n\tlet lineHeight: number | undefined = own.lineHeight\n\n\tlet current = textNode.parent\n\twhile (\n\t\tcurrent &&\n\t\t(fontSize == null || fontFamily == null || fontWeight == null || lineHeight == null)\n\t) {\n\t\tconst s = (current.props as any)?.style ?? {}\n\t\tif (fontSize == null && typeof s.fontSize === 'number') fontSize = s.fontSize\n\t\tif (fontFamily == null && typeof s.fontFamily === 'string') fontFamily = s.fontFamily\n\t\tif (\n\t\t\tfontWeight == null &&\n\t\t\t(typeof s.fontWeight === 'number' || typeof s.fontWeight === 'string')\n\t\t)\n\t\t\tfontWeight = s.fontWeight\n\t\tif (lineHeight == null && typeof s.lineHeight === 'number') lineHeight = s.lineHeight\n\t\tcurrent = current.parent\n\t}\n\n\tconst resolvedFontSize = fontSize ?? defaults?.fontSize ?? 16\n\tconst resolvedFontFamily = fontFamily ?? defaults?.fontFamily ?? 'system-ui'\n\tconst resolvedFontWeight = fontWeight ?? defaults?.fontWeight ?? 400\n\tconst resolvedLineHeight =\n\t\tlineHeight ?? defaults?.lineHeight ?? Math.round(resolvedFontSize * 1.2)\n\treturn {\n\t\tfontSize: resolvedFontSize,\n\t\tfontFamily: resolvedFontFamily,\n\t\tfontWeight: resolvedFontWeight,\n\t\tlineHeight: resolvedLineHeight,\n\t\tfont: `${resolvedFontWeight} ${resolvedFontSize}px ${resolvedFontFamily}`,\n\t}\n}\n\n/**\n * 确保每个 CanvasNode 都有对应的 YogaNode:\n * - View/Rect:只需要样式即可参与布局\n * - Text:需要 setMeasureFunc 才能自适应宽高\n */\nfunction ensureYogaNode(\n\tengine: LayoutEngine,\n\tnode: CanvasNode,\n\tmeasureText?: (\n\t\ttext: string,\n\t\tfont: string,\n\t\tmaxWidth?: number,\n\t) => { width: number; height: number },\n\tdefaults?: CanvasRootOptions,\n) {\n\tif (node.yogaNode) return\n\tconst yogaNode = engine.yoga.Node.create()\n\tnode.yogaNode = yogaNode\n\n\tif (node.type === 'Text') {\n\t\tconst textNode = node as TextNode\n\t\t/**\n\t\t * Yoga 通过 measureFunc 询问:在给定约束(width + widthMode)下的理想尺寸。\n\t\t * 这里做最小实现:只用 measureText 粗算,不做自动换行排版。\n\t\t */\n\t\tyogaNode.setMeasureFunc(\n\t\t\t(width: number, widthMode: number, _height: number, _heightMode: number) => {\n\t\t\t\tconst { font, fontSize, lineHeight } = resolveInheritedTextStyle(textNode, defaults)\n\t\t\t\tconst maxWidth = widthMode === MeasureMode.Undefined ? textNode.props.maxWidth : width\n\t\t\t\tconst measured = measureText?.(textNode.props.text, font, maxWidth)\n\t\t\t\tconst w =\n\t\t\t\t\tmeasured?.width ??\n\t\t\t\t\tMath.min(\n\t\t\t\t\t\ttextNode.props.text.length * fontSize,\n\t\t\t\t\t\tmaxWidth ?? textNode.props.text.length * fontSize,\n\t\t\t\t\t)\n\t\t\t\tconst lines = measured?.height ? Math.max(1, Math.round(measured.height / lineHeight)) : 1\n\t\t\t\treturn { width: w, height: lines * lineHeight }\n\t\t\t},\n\t\t)\n\t}\n}\n\n/**\n * 将当前场景树“同步”为 Yoga 树结构:\n * - 先移除旧 child 关系,避免增删改后 Yoga 内残留旧结构\n * - 再按 children 顺序 insertChild,并应用 style\n */\nfunction syncYogaTree(\n\tengine: LayoutEngine,\n\trootYoga: any,\n\troot: RootNode,\n\tmeasureText: (text: string, font: string, maxWidth?: number) => { width: number; height: number },\n\tdefaults?: CanvasRootOptions,\n) {\n\tconst detachAll = (yogaNode: any) => {\n\t\tconst count = yogaNode.getChildCount()\n\t\tfor (let i = count - 1; i >= 0; i -= 1) {\n\t\t\tyogaNode.removeChild(yogaNode.getChild(i))\n\t\t}\n\t}\n\n\tconst clearLinks = (parent: RootNode | CanvasNode) => {\n\t\tif ((parent as any).yogaNode) detachAll((parent as any).yogaNode)\n\t\tfor (const child of (parent as any).children ?? []) clearLinks(child)\n\t}\n\n\tclearLinks(root as any)\n\tdetachAll(rootYoga)\n\n\tconst visit = (parentYoga: any, parent: ViewNode | RootNode) => {\n\t\tfor (let i = 0; i < parent.children.length; i += 1) {\n\t\t\tconst child = parent.children[i]\n\t\t\tensureYogaNode(engine, child, measureText, defaults)\n\t\t\tconst style = (child as any).props?.style\n\t\t\tapplyYogaStyle(child.yogaNode, style)\n\t\t\tconst currentParent = child.yogaNode.getParent?.()\n\t\t\tif (currentParent && currentParent !== parentYoga) {\n\t\t\t\tcurrentParent.removeChild(child.yogaNode)\n\t\t\t}\n\t\t\tparentYoga.insertChild(child.yogaNode, parentYoga.getChildCount())\n\t\t\tif (child.children.length) {\n\t\t\t\tvisit(child.yogaNode, child as any)\n\t\t\t}\n\t\t}\n\t}\n\n\tvisit(rootYoga, root as any)\n}\n\n/**\n * 将 Yoga computed layout 写回 CanvasNode。\n */\nfunction readComputedLayout(node: CanvasNode) {\n\tif (!node.yogaNode) return\n\tconst layout = node.yogaNode.getComputedLayout()\n\tnode.layout = {\n\t\tx: layout.left,\n\t\ty: layout.top,\n\t\twidth: layout.width,\n\t\theight: layout.height,\n\t}\n}\n\n/**\n * 对整棵树执行一次 layout pass:\n * 1) 初始化/更新 Root 的 YogaNode 尺寸\n * 2) 同步结构与样式\n * 3) calculateLayout\n * 4) 回写 computed layout\n */\nexport async function layoutTree(\n\troot: RootNode,\n\twidth: number,\n\theight: number,\n\tmeasureText: (text: string, font: string, maxWidth?: number) => { width: number; height: number },\n\tdefaults?: CanvasRootOptions,\n) {\n\tconst engine = await getLayoutEngine()\n\tif (!root.yogaNode) {\n\t\troot.yogaNode = engine.yoga.Node.create()\n\t\troot.yogaNode.setWidth(width)\n\t\troot.yogaNode.setHeight(height)\n\t} else {\n\t\troot.yogaNode.setWidth(width)\n\t\troot.yogaNode.setHeight(height)\n\t}\n\n\troot.yogaNode.setFlexDirection(FlexDirection.Column)\n\troot.yogaNode.setAlignItems(Align.Stretch)\n\n\tsyncYogaTree(engine, root.yogaNode, root, measureText, defaults)\n\troot.yogaNode.calculateLayout(width, height, Direction.LTR)\n\n\tconst computeContentWidth = (node: CanvasNode) => {\n\t\tlet maxRight = 0\n\t\tfor (const child of node.children) {\n\t\t\tmaxRight = Math.max(maxRight, child.layout.x + child.layout.width)\n\t\t}\n\t\treturn maxRight\n\t}\n\n\tconst computeContentHeight = (node: CanvasNode) => {\n\t\tlet maxBottom = 0\n\t\tfor (const child of node.children) {\n\t\t\tmaxBottom = Math.max(maxBottom, child.layout.y + child.layout.height)\n\t\t}\n\t\treturn maxBottom\n\t}\n\n\tconst clampScrollTop = (node: CanvasNode) => {\n\t\tif (node.type !== 'View') return\n\t\tif (!(node.props as any)?.scrollY) return\n\t\tconst viewportH = node.layout.height\n\t\tconst contentH = node.scrollContentHeight ?? 0\n\t\tconst maxScrollTop = Math.max(0, contentH - viewportH)\n\t\tif (typeof node.scrollTop !== 'number') node.scrollTop = 0\n\t\tnode.scrollTop = Math.max(0, Math.min(node.scrollTop, maxScrollTop))\n\t}\n\n\tconst clampScrollLeft = (node: CanvasNode) => {\n\t\tif (node.type !== 'View') return\n\t\tif (!(node.props as any)?.scrollX) return\n\t\tconst viewportW = node.layout.width\n\t\tconst contentW = node.scrollContentWidth ?? 0\n\t\tconst maxScrollLeft = Math.max(0, contentW - viewportW)\n\t\tif (typeof node.scrollLeft !== 'number') node.scrollLeft = 0\n\t\tnode.scrollLeft = Math.max(0, Math.min(node.scrollLeft, maxScrollLeft))\n\t}\n\n\tconst walk = (parent: RootNode | CanvasNode) => {\n\t\tfor (const child of parent.children) {\n\t\t\treadComputedLayout(child)\n\t\t\tif (child.children.length) walk(child)\n\t\t\tif (\n\t\t\t\tchild.type === 'View' &&\n\t\t\t\t((child.props as any)?.scrollY || (child.props as any)?.scrollX)\n\t\t\t) {\n\t\t\t\tif ((child.props as any)?.scrollY) {\n\t\t\t\t\tchild.scrollContentHeight = computeContentHeight(child)\n\t\t\t\t\tclampScrollTop(child)\n\t\t\t\t}\n\t\t\t\tif ((child.props as any)?.scrollX) {\n\t\t\t\t\tchild.scrollContentWidth = computeContentWidth(child)\n\t\t\t\t\tclampScrollLeft(child)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\twalk(root)\n}\n\n/**\n * 释放某个节点对应的 Yoga 子树(WASM 对象需要显式 free)。\n */\nexport function freeYogaSubtree(node: CanvasNode) {\n\tif (node.yogaNode) {\n\t\tconst parent = node.yogaNode.getParent?.()\n\t\tif (parent) {\n\t\t\tparent.removeChild(node.yogaNode)\n\t\t}\n\t\tnode.yogaNode.freeRecursive()\n\t}\n\tconst clearRefs = (target: CanvasNode) => {\n\t\ttarget.yogaNode = null\n\t\tfor (const child of target.children) clearRefs(child)\n\t}\n\tclearRefs(node)\n}\n","import Reconciler from 'react-reconciler'\nimport { DefaultEventPriority, LegacyRoot } from 'react-reconciler/constants'\nimport type { ReactNode } from 'react'\nimport type { CanvasNode } from './nodes'\nimport { createNode } from './nodes'\nimport { freeYogaSubtree } from '../layout'\nimport type { CanvasContainer } from '../types'\n\ntype UpdatePayload = any\n\n/**\n * React Reconciler HostConfig(Mutation 模式)。\n *\n * 它的职责是把 React element 的增删改映射到我们的场景树:\n * - createInstance: 由 JSX intrinsic element 创建 CanvasNode\n * - append/remove/insert: 维护 parent.children 数组与 parent 指针\n * - resetAfterCommit: commit 结束后触发一次 invalidate(下一帧 layout+draw)\n *\n * 这里选择 Mutation 模式是为了实现简单:直接改 children 数组即可。\n */\nconst hostConfig: any = {\n\tnow: Date.now,\n\tsupportsMutation: true,\n\tisPrimaryRenderer: false,\n\tscheduleTimeout: setTimeout,\n\tcancelTimeout: clearTimeout,\n\tnoTimeout: -1,\n\tsupportsMicrotasks: true,\n\tscheduleMicrotask: typeof queueMicrotask === 'function' ? queueMicrotask : (cb: () => void) => void Promise.resolve().then(cb),\n\tgetCurrentEventPriority() {\n\t\treturn DefaultEventPriority\n\t},\n\n\tgetRootHostContext() {\n\t\treturn null\n\t},\n\tgetChildHostContext() {\n\t\treturn null\n\t},\n\tshouldSetTextContent() {\n\t\treturn false\n\t},\n\n\tcreateInstance(type: string, props: any) {\n\t\treturn createNode(type as any, props)\n\t},\n\tcreateTextInstance() {\n\t\t/**\n\t\t * 为了避免 React 字符串子节点与我们自定义 Text 节点语义冲突:\n\t\t * 只支持 <Text text=\"...\"/>,不支持 <Text>string</Text>。\n\t\t */\n\t\tthrow new Error('Text instances are not supported. Use <Text text=\"...\"/>.')\n\t},\n\tappendInitialChild(parent: any, child: any) {\n\t\thostConfig.appendChild(parent, child)\n\t},\n\tappendChild(parent: CanvasNode, child: CanvasNode) {\n\t\tchild.parent = parent\n\t\tparent.children.push(child)\n\t},\n\tappendChildToContainer(container: CanvasContainer, child: CanvasNode) {\n\t\tchild.parent = null\n\t\tcontainer.root.children.push(child)\n\t\tcontainer.invalidate()\n\t},\n\tinsertBefore(parent: CanvasNode, child: CanvasNode, beforeChild: CanvasNode) {\n\t\tchild.parent = parent\n\t\tconst idx = parent.children.indexOf(beforeChild)\n\t\tif (idx >= 0) parent.children.splice(idx, 0, child)\n\t\telse parent.children.push(child)\n\t},\n\tinsertInContainerBefore(container: CanvasContainer, child: CanvasNode, beforeChild: CanvasNode) {\n\t\tchild.parent = null\n\t\tconst idx = container.root.children.indexOf(beforeChild)\n\t\tif (idx >= 0) container.root.children.splice(idx, 0, child)\n\t\telse container.root.children.push(child)\n\t\tcontainer.invalidate()\n\t},\n\tremoveChild(parent: CanvasNode, child: CanvasNode) {\n\t\tconst idx = parent.children.indexOf(child)\n\t\tif (idx >= 0) parent.children.splice(idx, 1)\n\t\tchild.parent = null\n\t\t/**\n\t\t * Yoga WASM 对象需要显式释放,否则频繁增删节点会导致内存泄漏。\n\t\t */\n\t\tfreeYogaSubtree(child)\n\t},\n\tremoveChildFromContainer(container: CanvasContainer, child: CanvasNode) {\n\t\tconst idx = container.root.children.indexOf(child)\n\t\tif (idx >= 0) container.root.children.splice(idx, 1)\n\t\tchild.parent = null\n\t\tfreeYogaSubtree(child)\n\t\tcontainer.invalidate()\n\t},\n\n\tfinalizeInitialChildren() {\n\t\treturn false\n\t},\n\tprepareUpdate(_instance: CanvasNode, _type: string, _oldProps: any, newProps: any) {\n\t\t/**\n\t\t * 为了保持实现最小:不做细粒度 diff,直接把 newProps 作为 updatePayload。\n\t\t * commitUpdate 时整体替换 props,然后统一在 resetAfterCommit 做 invalidate。\n\t\t */\n\t\treturn newProps as UpdatePayload\n\t},\n\tcommitUpdate(instance: CanvasNode, updatePayload: UpdatePayload) {\n\t\tinstance.props = updatePayload\n\t},\n\tcommitTextUpdate() {},\n\tresetTextContent() {},\n\n\tprepareForCommit() {\n\t\treturn null\n\t},\n\tresetAfterCommit(container: CanvasContainer) {\n\t\t/**\n\t\t * React commit 完成后安排下一帧渲染。\n\t\t * 多次同步 commit 也会被 rAF 合帧。\n\t\t */\n\t\tcontainer.invalidate()\n\t\tcontainer.notifyCommit?.()\n\t},\n\tclearContainer(container: CanvasContainer) {\n\t\tcontainer.root.children = []\n\t\tcontainer.invalidate()\n\t\treturn false\n\t},\n\n\tgetPublicInstance(instance: any) {\n\t\treturn instance\n\t},\n\n\thideInstance() {},\n\tunhideInstance() {},\n\thideTextInstance() {},\n\tunhideTextInstance() {},\n\tdetachDeletedInstance() {},\n}\n\nexport const CanvasReconciler: any = Reconciler(hostConfig)\n\n/**\n * 提供更接近 ReactDOMRoot 的接口:render/unmount。\n */\nexport function createReconcilerRoot(container: CanvasContainer) {\n\tconst root = CanvasReconciler.createContainer(\n\t\tcontainer,\n\t\tLegacyRoot,\n\t\tnull,\n\t\tfalse,\n\t\tnull,\n\t\t'',\n\t\tconsole.error,\n\t\tnull,\n\t)\n\treturn {\n\t\trender(element: ReactNode) {\n\t\t\tCanvasReconciler.updateContainer(element, root, null, () => {})\n\t\t},\n\t\tunmount() {\n\t\t\tCanvasReconciler.updateContainer(null, root, null, () => {})\n\t\t},\n\t}\n}\n","import type { ReactNode } from 'react'\nimport { createRootNode } from './nodes'\nimport { drawTree } from '../render'\nimport { layoutTree } from '../layout'\nimport { createReconcilerRoot } from './reconciler'\nimport type { CanvasNode } from './nodes'\nimport type { CanvasPointerEventType, CanvasRootOptions, MeasureTextFn } from '../types'\n\n/**\n * 创建自定义 renderer 的运行时 Root。\n *\n * 它串起三段流水线:\n * 1) React 提交阶段(reconciler)把 JSX 变成场景树节点\n * 2) Yoga layout pass 计算每个节点的 x/y/width/height\n * 3) Canvas2D draw pass 按布局结果把节点绘制到画布\n *\n * 注意:这里用 requestAnimationFrame 合帧,避免一次提交触发多次绘制。\n */\nexport function createCanvasRoot(canvas: HTMLCanvasElement, options: CanvasRootOptions) {\n\tconst ctx = canvas.getContext('2d')\n\tif (!ctx) throw new Error('CanvasRenderingContext2D is not available')\n\n\t/**\n\t * 容器根节点(不对应 JSX),其 children 是 React 渲染出来的顶层节点。\n\t */\n\tconst rootNode = createRootNode()\n\n\tconst commitSubscribers = new Set<() => void>()\n\tconst notifyCommit = () => {\n\t\tfor (const cb of commitSubscribers) cb()\n\t}\n\n\tlet hoverId: number | null = null\n\tlet selectedId: number | null = null\n\n\tconst toCanvasPoint = (clientX: number, clientY: number) => {\n\t\tconst rect = canvas.getBoundingClientRect()\n\t\tconst scaleX = rect.width ? options.width / rect.width : 1\n\t\tconst scaleY = rect.height ? options.height / rect.height : 1\n\t\tconst x = (clientX - rect.left) * scaleX\n\t\tconst y = (clientY - rect.top) * scaleY\n\t\treturn { x, y }\n\t}\n\n\tconst findNodeById = (id: number): CanvasNode | null => {\n\t\tconst walk = (node: CanvasNode): CanvasNode | null => {\n\t\t\tif (node.debugId === id) return node\n\t\t\tfor (const child of node.children) {\n\t\t\t\tconst hit = walk(child)\n\t\t\t\tif (hit) return hit\n\t\t\t}\n\t\t\treturn null\n\t\t}\n\t\tfor (const child of rootNode.children) {\n\t\t\tconst hit = walk(child)\n\t\t\tif (hit) return hit\n\t\t}\n\t\treturn null\n\t}\n\n\tconst getAbsoluteRect = (node: CanvasNode) => {\n\t\tconst path: CanvasNode[] = []\n\t\tlet current: CanvasNode | null = node\n\t\twhile (current) {\n\t\t\tpath.push(current)\n\t\t\tcurrent = current.parent\n\t\t}\n\n\t\tlet absLeft = 0\n\t\tlet absTop = 0\n\t\tfor (let i = path.length - 1; i >= 0; i -= 1) {\n\t\t\tconst n = path[i]\n\t\t\tabsLeft += n.layout.x\n\t\t\tabsTop += n.layout.y\n\t\t\tconst hasNext = i > 0\n\t\t\tif (hasNext && n.type === 'View' && (n.props as any)?.scrollX) absLeft -= n.scrollLeft ?? 0\n\t\t\tif (hasNext && n.type === 'View' && (n.props as any)?.scrollY) absTop -= n.scrollTop ?? 0\n\t\t}\n\n\t\treturn { x: absLeft, y: absTop, width: node.layout.width, height: node.layout.height }\n\t}\n\n\tconst getScrollClipRects = (node: CanvasNode) => {\n\t\tconst rects: { x: number; y: number; width: number; height: number }[] = []\n\t\tlet current = node.parent\n\t\twhile (current) {\n\t\t\tif (current.type === 'View') {\n\t\t\t\tconst scrollX = !!(current.props as any)?.scrollX\n\t\t\t\tconst scrollY = !!(current.props as any)?.scrollY\n\t\t\t\tif (scrollX || scrollY) rects.push(getAbsoluteRect(current))\n\t\t\t}\n\t\t\tcurrent = current.parent\n\t\t}\n\t\treturn rects.reverse()\n\t}\n\n\tconst serializeValue = (value: any, depth: number, seen: WeakSet<object>): any => {\n\t\tif (depth > 6) return '[MaxDepth]'\n\t\tif (value == null) return value\n\t\tconst t = typeof value\n\t\tif (t === 'string' || t === 'number' || t === 'boolean') return value\n\t\tif (t === 'bigint') return String(value)\n\t\tif (t === 'symbol') return String(value)\n\t\tif (t === 'function') return '[Function]'\n\t\tif (t !== 'object') return String(value)\n\t\tif (seen.has(value)) return '[Circular]'\n\t\tseen.add(value)\n\t\tif (Array.isArray(value)) {\n\t\t\tconst next: any[] = []\n\t\t\tconst len = Math.min(value.length, 50)\n\t\t\tfor (let i = 0; i < len; i += 1) next.push(serializeValue(value[i], depth + 1, seen))\n\t\t\tif (value.length > len) next.push(`[+${value.length - len}]`)\n\t\t\treturn next\n\t\t}\n\t\tconst out: Record<string, any> = {}\n\t\tconst keys = Object.keys(value).slice(0, 80)\n\t\tfor (const k of keys) out[k] = serializeValue(value[k], depth + 1, seen)\n\t\tconst allKeys = Object.keys(value)\n\t\tif (allKeys.length > keys.length) out.__moreKeys = allKeys.length - keys.length\n\t\treturn out\n\t}\n\n\t/**\n\t * 合帧状态:\n\t * - dirty:本帧是否需要 layout+draw\n\t * - frameId:是否已安排下一帧\n\t */\n\tlet frameId: number | null = null\n\tlet dirty = true\n\n\t/**\n\t * Text 的 Yoga 测量依赖外部测量函数。\n\t * 这里直接复用当前 CanvasRenderingContext2D 的 measureText,做最小可用实现。\n\t */\n\tconst measureText: MeasureTextFn = (text: string, font: string, maxWidth?: number) => {\n\t\tctx.save()\n\t\tctx.font = font\n\t\tconst metrics = ctx.measureText(text)\n\t\tctx.restore()\n\t\tconst width = typeof maxWidth === 'number' ? Math.min(metrics.width, maxWidth) : metrics.width\n\t\tconst height = Math.ceil(\n\t\t\tmetrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent || 0,\n\t\t)\n\t\treturn { width, height: Math.max(1, height) }\n\t}\n\n\t/**\n\t * 通知下一帧执行一次 layout + draw。\n\t * reconciler commit 完成后会调用它,从而把 React 更新“推”到画布渲染。\n\t */\n\tconst invalidate = () => {\n\t\tdirty = true\n\t\tif (frameId != null) return\n\t\tframeId = requestAnimationFrame(async () => {\n\t\t\tframeId = null\n\t\t\tif (!dirty) return\n\t\t\tdirty = false\n\t\t\tawait layoutTree(rootNode, options.width, options.height, measureText, options)\n\t\t\tdrawTree(rootNode, ctx, options.dpr, options.clearColor, options)\n\t\t\tconst overlayHover = typeof hoverId === 'number' ? findNodeById(hoverId) : null\n\t\t\tconst overlaySelected = typeof selectedId === 'number' ? findNodeById(selectedId) : null\n\t\t\tif (overlayHover || overlaySelected) {\n\t\t\t\tctx.save()\n\t\t\t\tctx.setTransform(options.dpr, 0, 0, options.dpr, 0, 0)\n\n\t\t\t\tif (\n\t\t\t\t\toverlayHover &&\n\t\t\t\t\t(!overlaySelected || overlayHover.debugId !== overlaySelected.debugId)\n\t\t\t\t) {\n\t\t\t\t\tconst r = getAbsoluteRect(overlayHover)\n\t\t\t\t\tctx.save()\n\t\t\t\t\tfor (const clip of getScrollClipRects(overlayHover)) {\n\t\t\t\t\t\tctx.beginPath()\n\t\t\t\t\t\tctx.rect(clip.x, clip.y, clip.width, clip.height)\n\t\t\t\t\t\tctx.clip()\n\t\t\t\t\t}\n\t\t\t\t\tctx.fillStyle = 'rgba(59,130,246,0.12)'\n\t\t\t\t\tctx.strokeStyle = 'rgba(59,130,246,0.9)'\n\t\t\t\t\tctx.lineWidth = 1\n\t\t\t\t\tctx.fillRect(r.x, r.y, r.width, r.height)\n\t\t\t\t\tctx.strokeRect(r.x + 0.5, r.y + 0.5, Math.max(0, r.width - 1), Math.max(0, r.height - 1))\n\t\t\t\t\tctx.restore()\n\t\t\t\t}\n\n\t\t\t\tif (overlaySelected) {\n\t\t\t\t\tconst r = getAbsoluteRect(overlaySelected)\n\t\t\t\t\tctx.save()\n\t\t\t\t\tfor (const clip of getScrollClipRects(overlaySelected)) {\n\t\t\t\t\t\tctx.beginPath()\n\t\t\t\t\t\tctx.rect(clip.x, clip.y, clip.width, clip.height)\n\t\t\t\t\t\tctx.clip()\n\t\t\t\t\t}\n\t\t\t\t\tctx.fillStyle = 'rgba(16,185,129,0.12)'\n\t\t\t\t\tctx.strokeStyle = 'rgba(16,185,129,0.95)'\n\t\t\t\t\tctx.lineWidth = 2\n\t\t\t\t\tctx.fillRect(r.x, r.y, r.width, r.height)\n\t\t\t\t\tctx.strokeRect(r.x + 1, r.y + 1, Math.max(0, r.width - 2), Math.max(0, r.height - 2))\n\t\t\t\t\tctx.restore()\n\t\t\t\t}\n\n\t\t\t\tctx.restore()\n\t\t\t}\n\t\t})\n\t}\n\n\tconst getScrollbarMetricsY = (\n\t\tview: CanvasNode,\n\t\tleft: number,\n\t\ttop: number,\n\t): {\n\t\tmaxScrollTop: number\n\t\ttrackX: number\n\t\ttrackY: number\n\t\ttrackH: number\n\t\tthumbY: number\n\t\tthumbH: number\n\t} | null => {\n\t\tif (view.type !== 'View') return null\n\t\tif (!(view.props as any)?.scrollY) return null\n\t\tif ((view.props as any)?.scrollbarY === false) return null\n\n\t\tconst w = view.layout.width\n\t\tconst h = view.layout.height\n\t\tconst contentHeight = view.scrollContentHeight ?? 0\n\t\tconst maxScrollTop = Math.max(0, contentHeight - h)\n\t\tif (maxScrollTop <= 0) return null\n\n\t\tconst scrollbarWidth = (view.props as any)?.scrollbarWidth ?? 10\n\t\tconst scrollbarInset = (view.props as any)?.scrollbarInset ?? 6\n\t\tconst corner = scrollbarInset + scrollbarWidth\n\n\t\tconst contentWidth = view.scrollContentWidth ?? 0\n\t\tconst maxScrollLeft = Math.max(0, contentWidth - w)\n\t\tconst hasScrollX =\n\t\t\t!!(view.props as any)?.scrollX &&\n\t\t\t(view.props as any)?.scrollbarX !== false &&\n\t\t\tmaxScrollLeft > 0\n\n\t\tconst trackX = left + w - scrollbarInset - scrollbarWidth\n\t\tconst trackY = top + scrollbarInset\n\t\tconst trackH = Math.max(0, h - scrollbarInset * 2 - (hasScrollX ? corner : 0))\n\t\tif (trackH <= 0) return null\n\n\t\tconst minThumbH = 16\n\t\tconst thumbH =\n\t\t\tcontentHeight > 0\n\t\t\t\t? Math.max(minThumbH, Math.min(trackH, (trackH * h) / contentHeight))\n\t\t\t\t: trackH\n\t\tconst travel = Math.max(0, trackH - thumbH)\n\t\tconst scrollTop = view.scrollTop ?? 0\n\t\tconst thumbY = travel > 0 ? trackY + (scrollTop / maxScrollTop) * travel : trackY\n\t\treturn { maxScrollTop, trackX, trackY, trackH, thumbY, thumbH }\n\t}\n\n\tconst getScrollbarMetricsX = (\n\t\tview: CanvasNode,\n\t\tleft: number,\n\t\ttop: number,\n\t): {\n\t\tmaxScrollLeft: number\n\t\ttrackX: number\n\t\ttrackY: number\n\t\ttrackW: number\n\t\tthumbX: number\n\t\tthumbW: number\n\t} | null => {\n\t\tif (view.type !== 'View') return null\n\t\tif (!(view.props as any)?.scrollX) return null\n\t\tif ((view.props as any)?.scrollbarX === false) return null\n\n\t\tconst w = view.layout.width\n\t\tconst h = view.layout.height\n\t\tconst contentWidth = view.scrollContentWidth ?? 0\n\t\tconst maxScrollLeft = Math.max(0, contentWidth - w)\n\t\tif (maxScrollLeft <= 0) return null\n\n\t\tconst scrollbarWidth = (view.props as any)?.scrollbarWidth ?? 10\n\t\tconst scrollbarInset = (view.props as any)?.scrollbarInset ?? 6\n\t\tconst corner = scrollbarInset + scrollbarWidth\n\n\t\tconst contentHeight = view.scrollContentHeight ?? 0\n\t\tconst maxScrollTop = Math.max(0, contentHeight - h)\n\t\tconst hasScrollY =\n\t\t\t!!(view.props as any)?.scrollY &&\n\t\t\t(view.props as any)?.scrollbarY !== false &&\n\t\t\tmaxScrollTop > 0\n\n\t\tconst trackX = left + scrollbarInset\n\t\tconst trackY = top + h - scrollbarInset - scrollbarWidth\n\t\tconst trackW = Math.max(0, w - scrollbarInset * 2 - (hasScrollY ? corner : 0))\n\t\tif (trackW <= 0) return null\n\n\t\tconst minThumbW = 16\n\t\tconst thumbW =\n\t\t\tcontentWidth > 0 ? Math.max(minThumbW, Math.min(trackW, (trackW * w) / contentWidth)) : trackW\n\t\tconst travel = Math.max(0, trackW - thumbW)\n\t\tconst scrollLeft = view.scrollLeft ?? 0\n\t\tconst thumbX = travel > 0 ? trackX + (scrollLeft / maxScrollLeft) * travel : trackX\n\t\treturn { maxScrollLeft, trackX, trackY, trackW, thumbX, thumbW }\n\t}\n\n\tconst hitTestNode = (\n\t\tnode: CanvasNode,\n\t\tx: number,\n\t\ty: number,\n\t\toffsetX: number,\n\t\toffsetY: number,\n\t): CanvasNode | null => {\n\t\tif ((node.props as any)?.pointerEvents === 'none') return null\n\t\tconst left = offsetX + node.layout.x\n\t\tconst top = offsetY + node.layout.y\n\t\tconst right = left + node.layout.width\n\t\tconst bottom = top + node.layout.height\n\t\tif (x < left || x > right || y < top || y > bottom) return null\n\n\t\tconst childOffsetX =\n\t\t\tnode.type === 'View' && (node.props as any)?.scrollX ? left - (node.scrollLeft ?? 0) : left\n\t\tconst childOffsetY =\n\t\t\tnode.type === 'View' && (node.props as any)?.scrollY ? top - (node.scrollTop ?? 0) : top\n\n\t\tfor (let i = node.children.length - 1; i >= 0; i -= 1) {\n\t\t\tconst child = node.children[i]\n\t\t\tconst hit = hitTestNode(child, x, y, childOffsetX, childOffsetY)\n\t\t\tif (hit) return hit\n\t\t}\n\n\t\treturn node\n\t}\n\n\tconst hitTestScrollbarThumbNode = (\n\t\tnode: CanvasNode,\n\t\tx: number,\n\t\ty: number,\n\t\toffsetX: number,\n\t\toffsetY: number,\n\t): { view: CanvasNode; axis: 'x' | 'y' } | null => {\n\t\tif ((node.props as any)?.pointerEvents === 'none') return null\n\t\tconst left = offsetX + node.layout.x\n\t\tconst top = offsetY + node.layout.y\n\t\tconst right = left + node.layout.width\n\t\tconst bottom = top + node.layout.height\n\t\tif (x < left || x > right || y < top || y > bottom) return null\n\n\t\tconst metricsY = getScrollbarMetricsY(node, left, top)\n\t\tif (metricsY) {\n\t\t\tconst { trackX, thumbY, thumbH } = metricsY\n\t\t\tconst thumbLeft = trackX\n\t\t\tconst thumbRight = trackX + ((node.props as any)?.scrollbarWidth ?? 10)\n\t\t\tconst thumbTop = thumbY\n\t\t\tconst thumbBottom = thumbY + thumbH\n\t\t\tif (x >= thumbLeft && x <= thumbRight && y >= thumbTop && y <= thumbBottom) {\n\t\t\t\treturn { view: node, axis: 'y' }\n\t\t\t}\n\t\t}\n\n\t\tconst metricsX = getScrollbarMetricsX(node, left, top)\n\t\tif (metricsX) {\n\t\t\tconst { trackY, thumbX, thumbW } = metricsX\n\t\t\tconst thumbLeft = thumbX\n\t\t\tconst thumbRight = thumbX + thumbW\n\t\t\tconst thumbTop = trackY\n\t\t\tconst thumbBottom = trackY + ((node.props as any)?.scrollbarWidth ?? 10)\n\t\t\tif (x >= thumbLeft && x <= thumbRight && y >= thumbTop && y <= thumbBottom) {\n\t\t\t\treturn { view: node, axis: 'x' }\n\t\t\t}\n\t\t}\n\n\t\tconst childOffsetX =\n\t\t\tnode.type === 'View' && (node.props as any)?.scrollX ? left - (node.scrollLeft ?? 0) : left\n\t\tconst childOffsetY =\n\t\t\tnode.type === 'View' && (node.props as any)?.scrollY ? top - (node.scrollTop ?? 0) : top\n\n\t\tfor (let i = node.children.length - 1; i >= 0; i -= 1) {\n\t\t\tconst child = node.children[i]\n\t\t\tconst hit = hitTestScrollbarThumbNode(child, x, y, childOffsetX, childOffsetY)\n\t\t\tif (hit) return hit\n\t\t}\n\n\t\treturn null\n\t}\n\n\tconst hitTestScrollbarThumb = (\n\t\tx: number,\n\t\ty: number,\n\t): { view: CanvasNode; axis: 'x' | 'y' } | null => {\n\t\tfor (let i = rootNode.children.length - 1; i >= 0; i -= 1) {\n\t\t\tconst child = rootNode.children[i]\n\t\t\tconst hit = hitTestScrollbarThumbNode(child, x, y, 0, 0)\n\t\t\tif (hit) return hit\n\t\t}\n\t\treturn null\n\t}\n\n\tconst hitTest = (x: number, y: number): CanvasNode | null => {\n\t\tfor (let i = rootNode.children.length - 1; i >= 0; i -= 1) {\n\t\t\tconst child = rootNode.children[i]\n\t\t\tconst hit = hitTestNode(child, x, y, 0, 0)\n\t\t\tif (hit) return hit\n\t\t}\n\t\treturn null\n\t}\n\n\tconst buildPath = (target: CanvasNode) => {\n\t\tconst path: CanvasNode[] = []\n\t\tlet current: CanvasNode | null = target\n\t\twhile (current) {\n\t\t\tpath.push(current)\n\t\t\tcurrent = current.parent\n\t\t}\n\t\treturn path\n\t}\n\n\tconst pointerCapture = new Map<number, CanvasNode>()\n\tconst pointerDownTarget = new Map<number, CanvasNode>()\n\n\tconst clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(value, max))\n\n\tconst applyScrollY = (node: CanvasNode, delta: number) => {\n\t\tif (node.type !== 'View') return false\n\t\tif (!(node.props as any)?.scrollY) return false\n\t\tconst contentHeight = node.scrollContentHeight ?? 0\n\t\tconst maxScrollTop = Math.max(0, contentHeight - node.layout.height)\n\t\tif (maxScrollTop <= 0) return false\n\t\tconst current = node.scrollTop ?? 0\n\t\tconst next = clamp(current + delta, 0, maxScrollTop)\n\t\tif (next === current) return false\n\t\tnode.scrollTop = next\n\t\tconst onScroll = (node.props as any)?.onScroll\n\t\tif (typeof onScroll === 'function') onScroll(next)\n\n\t\treturn true\n\t}\n\n\tconst applyScrollX = (node: CanvasNode, delta: number) => {\n\t\tif (node.type !== 'View') return false\n\t\tif (!(node.props as any)?.scrollX) return false\n\t\tconst contentWidth = node.scrollContentWidth ?? 0\n\t\tconst maxScrollLeft = Math.max(0, contentWidth - node.layout.width)\n\t\tif (maxScrollLeft <= 0) return false\n\t\tconst current = node.scrollLeft ?? 0\n\t\tconst next = clamp(current + delta, 0, maxScrollLeft)\n\t\tif (next === current) return false\n\t\tnode.scrollLeft = next\n\t\tconst onScrollX = (node.props as any)?.onScrollX\n\t\tif (typeof onScrollX === 'function') onScrollX(next)\n\n\t\treturn true\n\t}\n\n\tconst dispatchOnPath = (\n\t\teventType: CanvasPointerEventType,\n\t\tpath: CanvasNode[],\n\t\tinit: {\n\t\t\tx: number\n\t\t\ty: number\n\t\t\tpointerId: number\n\t\t\tbutton: number\n\t\t\tbuttons: number\n\t\t\taltKey: boolean\n\t\t\tctrlKey: boolean\n\t\t\tshiftKey: boolean\n\t\t\tmetaKey: boolean\n\t\t},\n\t\ttarget: CanvasNode,\n\t) => {\n\t\tconst baseName =\n\t\t\teventType === 'pointerdown'\n\t\t\t\t? 'onPointerDown'\n\t\t\t\t: eventType === 'pointermove'\n\t\t\t\t\t? 'onPointerMove'\n\t\t\t\t\t: eventType === 'pointerup'\n\t\t\t\t\t\t? 'onPointerUp'\n\t\t\t\t\t\t: eventType === 'pointercancel'\n\t\t\t\t\t\t\t? 'onPointerCancel'\n\t\t\t\t\t\t\t: 'onClick'\n\n\t\tlet propagationStopped = false\n\t\tlet defaultPrevented = false\n\n\t\tconst eventObject: any = {\n\t\t\ttype: eventType,\n\t\t\t...init,\n\t\t\ttarget,\n\t\t\tcurrentTarget: null,\n\t\t\tdefaultPrevented,\n\t\t\tstopPropagation() {\n\t\t\t\tpropagationStopped = true\n\t\t\t},\n\t\t\tpreventDefault() {\n\t\t\t\tdefaultPrevented = true\n\t\t\t\teventObject.defaultPrevented = true\n\t\t\t},\n\t\t}\n\n\t\tfor (let i = path.length - 1; i >= 0; i -= 1) {\n\t\t\tif (propagationStopped) break\n\t\t\tconst currentTarget = path[i]\n\t\t\tconst handler = (currentTarget.props as any)?.[`${baseName}Capture`]\n\t\t\tif (typeof handler === 'function') {\n\t\t\t\teventObject.currentTarget = currentTarget\n\t\t\t\thandler(eventObject)\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < path.length; i += 1) {\n\t\t\tif (propagationStopped) break\n\t\t\tconst currentTarget = path[i]\n\t\t\tconst handler = (currentTarget.props as any)?.[baseName]\n\t\t\tif (typeof handler === 'function') {\n\t\t\t\teventObject.currentTarget = currentTarget\n\t\t\t\thandler(eventObject)\n\t\t\t}\n\t\t}\n\n\t\treturn { defaultPrevented }\n\t}\n\n\tconst dispatchPointerEvent = (\n\t\teventType: CanvasPointerEventType,\n\t\tinit: {\n\t\t\tx: number\n\t\t\ty: number\n\t\t\tpointerId: number\n\t\t\tbutton: number\n\t\t\tbuttons: number\n\t\t\taltKey: boolean\n\t\t\tctrlKey: boolean\n\t\t\tshiftKey: boolean\n\t\t\tmetaKey: boolean\n\t\t},\n\t) => {\n\t\tconst { pointerId } = init\n\n\t\tconst capturedForScroll = pointerCapture.get(pointerId)\n\t\tif (\n\t\t\tcapturedForScroll &&\n\t\t\tcapturedForScroll.type === 'View' &&\n\t\t\tcapturedForScroll.scrollbarDrag &&\n\t\t\tcapturedForScroll.scrollbarDrag.pointerId === pointerId\n\t\t) {\n\t\t\tif (eventType === 'pointermove') {\n\t\t\t\tconst drag = capturedForScroll.scrollbarDrag\n\n\t\t\t\tconst path = buildPath(capturedForScroll)\n\t\t\t\tlet absLeft = 0\n\t\t\t\tlet absTop = 0\n\t\t\t\tfor (let i = path.length - 1; i >= 0; i -= 1) {\n\t\t\t\t\tconst n = path[i]\n\t\t\t\t\tabsLeft += n.layout.x\n\t\t\t\t\tabsTop += n.layout.y\n\t\t\t\t\tconst hasNext = i > 0\n\t\t\t\t\tif (hasNext && n.type === 'View' && (n.props as any)?.scrollX)\n\t\t\t\t\t\tabsLeft -= n.scrollLeft ?? 0\n\t\t\t\t\tif (hasNext && n.type === 'View' && (n.props as any)?.scrollY) absTop -= n.scrollTop ?? 0\n\t\t\t\t}\n\n\t\t\t\tif (drag.axis === 'y') {\n\t\t\t\t\tconst metrics = getScrollbarMetricsY(capturedForScroll, absLeft, absTop)\n\t\t\t\t\tif (!metrics) return { defaultPrevented: true }\n\t\t\t\t\tconst travel = Math.max(0, metrics.trackH - metrics.thumbH)\n\t\t\t\t\tif (travel <= 0) return { defaultPrevented: true }\n\t\t\t\t\tconst deltaThumb = init.y - drag.startPointer\n\t\t\t\t\tconst nextScrollTop = drag.startScroll + deltaThumb * (metrics.maxScrollTop / travel)\n\t\t\t\t\tconst clamped = Math.max(0, Math.min(nextScrollTop, metrics.maxScrollTop))\n\t\t\t\t\tcapturedForScroll.scrollTop = clamped\n\t\t\t\t\tconst onScroll = (capturedForScroll.props as any)?.onScroll\n\t\t\t\t\tif (typeof onScroll === 'function') onScroll(clamped)\n\t\t\t\t\tinvalidate()\n\t\t\t\t\treturn { defaultPrevented: true }\n\t\t\t\t}\n\n\t\t\t\tconst metrics = getScrollbarMetricsX(capturedForScroll, absLeft, absTop)\n\t\t\t\tif (!metrics) return { defaultPrevented: true }\n\t\t\t\tconst travel = Math.max(0, metrics.trackW - metrics.thumbW)\n\t\t\t\tif (travel <= 0) return { defaultPrevented: true }\n\t\t\t\tconst deltaThumb = init.x - drag.startPointer\n\t\t\t\tconst nextScrollLeft = drag.startScroll + deltaThumb * (metrics.maxScrollLeft / travel)\n\t\t\t\tconst clamped = Math.max(0, Math.min(nextScrollLeft, metrics.maxScrollLeft))\n\t\t\t\tcapturedForScroll.scrollLeft = clamped\n\t\t\t\tconst onScrollX = (capturedForScroll.props as any)?.onScrollX\n\t\t\t\tif (typeof onScrollX === 'function') onScrollX(clamped)\n\t\t\t\tinvalidate()\n\t\t\t\treturn { defaultPrevented: true }\n\t\t\t}\n\n\t\t\tif (eventType === 'pointerup' || eventType === 'pointercancel') {\n\t\t\t\tcapturedForScroll.scrollbarDrag = null\n\t\t\t\tpointerCapture.delete(pointerId)\n\t\t\t\tpointerDownTarget.delete(pointerId)\n\t\t\t\tinvalidate()\n\t\t\t\treturn { defaultPrevented: true }\n\t\t\t}\n\t\t}\n\n\t\tif (eventType === 'pointerdown') {\n\t\t\tconst scrollbarTarget = hitTestScrollbarThumb(init.x, init.y)\n\t\t\tif (scrollbarTarget && scrollbarTarget.view.type === 'View') {\n\t\t\t\tscrollbarTarget.view.scrollbarDrag = {\n\t\t\t\t\taxis: scrollbarTarget.axis,\n\t\t\t\t\tpointerId,\n\t\t\t\t\tstartPointer: scrollbarTarget.axis === 'y' ? init.y : init.x,\n\t\t\t\t\tstartScroll:\n\t\t\t\t\t\tscrollbarTarget.axis === 'y'\n\t\t\t\t\t\t\t? (scrollbarTarget.view.scrollTop ?? 0)\n\t\t\t\t\t\t\t: (scrollbarTarget.view.scrollLeft ?? 0),\n\t\t\t\t}\n\t\t\t\tpointerCapture.set(pointerId, scrollbarTarget.view)\n\t\t\t\treturn { defaultPrevented: true }\n\t\t\t}\n\n\t\t\tconst target = hitTest(init.x, init.y)\n\t\t\tif (!target) return { defaultPrevented: false }\n\t\t\tpointerCapture.set(pointerId, target)\n\t\t\tpointerDownTarget.set(pointerId, target)\n\t\t\treturn dispatchOnPath(eventType, buildPath(target), init, target)\n\t\t}\n\n\t\tif (eventType === 'pointermove') {\n\t\t\tconst captured = pointerCapture.get(pointerId)\n\t\t\tconst target = captured ?? hitTest(init.x, init.y)\n\t\t\tif (!target) return { defaultPrevented: false }\n\t\t\treturn dispatchOnPath(eventType, buildPath(target), init, target)\n\t\t}\n\n\t\tif (eventType === 'pointerup') {\n\t\t\tconst captured = pointerCapture.get(pointerId)\n\t\t\tconst target = captured ?? hitTest(init.x, init.y)\n\t\t\tif (!target) return { defaultPrevented: false }\n\t\t\tconst res = dispatchOnPath(eventType, buildPath(target), init, target)\n\n\t\t\tconst downTarget = pointerDownTarget.get(pointerId)\n\t\t\tpointerCapture.delete(pointerId)\n\t\t\tpointerDownTarget.delete(pointerId)\n\n\t\t\tif (downTarget && downTarget === target && init.button === 0) {\n\t\t\t\tconst clickRes = dispatchOnPath('click', buildPath(target), init, target)\n\t\t\t\treturn { defaultPrevented: res.defaultPrevented || clickRes.defaultPrevented }\n\t\t\t}\n\n\t\t\treturn res\n\t\t}\n\n\t\tif (eventType === 'pointercancel') {\n\t\t\tconst captured = pointerCapture.get(pointerId)\n\t\t\tconst target = captured ?? hitTest(init.x, init.y)\n\t\t\tif (!target) return { defaultPrevented: false }\n\t\t\tconst res = dispatchOnPath(eventType, buildPath(target), init, target)\n\t\t\tpointerCapture.delete(pointerId)\n\t\t\tpointerDownTarget.delete(pointerId)\n\t\t\treturn res\n\t\t}\n\n\t\tconst target = hitTest(init.x, init.y)\n\t\tif (!target) return { defaultPrevented: false }\n\t\treturn dispatchOnPath(eventType, buildPath(target), init, target)\n\t}\n\n\tconst dispatchWheelEvent = (init: {\n\t\tx: number\n\t\ty: number\n\t\tdeltaX: number\n\t\tdeltaY: number\n\t\taltKey: boolean\n\t\tctrlKey: boolean\n\t\tshiftKey: boolean\n\t\tmetaKey: boolean\n\t}) => {\n\t\tconst target = hitTest(init.x, init.y)\n\n\t\tif (!target) return { defaultPrevented: false }\n\n\t\tconst path = buildPath(target)\n\t\tlet remainingX = init.deltaX\n\t\tlet remainingY = init.deltaY\n\t\tlet defaultPrevented = false\n\n\t\tfor (let i = 0; i < path.length; i += 1) {\n\t\t\tconst node = path[i]\n\n\t\t\tif (remainingY !== 0) {\n\t\t\t\tconst applied = applyScrollY(node, remainingY)\n\t\t\t\tif (applied) {\n\t\t\t\t\tremainingY = 0\n\t\t\t\t\tdefaultPrevented = true\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (remainingX !== 0) {\n\t\t\t\tconst applied = applyScrollX(node, remainingX)\n\t\t\t\tif (applied) {\n\t\t\t\t\tremainingX = 0\n\t\t\t\t\tdefaultPrevented = true\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (remainingX === 0 && remainingY === 0) break\n\t\t}\n\n\t\tif (defaultPrevented) invalidate()\n\t\treturn { defaultPrevented }\n\t}\n\n\t/**\n\t * React reconciler 的容器对象:RootNode + invalidate 回调。\n\t */\n\tconst container = { root: rootNode, invalidate, notifyCommit }\n\tconst reconcilerRoot = createReconcilerRoot(container)\n\n\t/**\n\t * 先触发一次绘制,避免画布初始为空(即使 children 还没挂上)。\n\t */\n\tinvalidate()\n\n\tconst __devtools = {\n\t\trootId: rootNode.debugId,\n\t\tgetSnapshot() {\n\t\t\tconst nodesById: Record<\n\t\t\t\tnumber,\n\t\t\t\t{\n\t\t\t\t\tid: number\n\t\t\t\t\ttype: CanvasNode['type']\n\t\t\t\t\tparentId: number | null\n\t\t\t\t\tchildrenIds: number[]\n\t\t\t\t\tlayout: { x: number; y: number; width: number; height: number }\n\t\t\t\t}\n\t\t\t> = {}\n\t\t\tconst walk = (node: CanvasNode, parentId: number | null) => {\n\t\t\t\tnodesById[node.debugId] = {\n\t\t\t\t\tid: node.debugId,\n\t\t\t\t\ttype: node.type,\n\t\t\t\t\tparentId,\n\t\t\t\t\tchildrenIds: node.children.map((c) => c.debugId),\n\t\t\t\t\tlayout: node.layout,\n\t\t\t\t}\n\t\t\t\tfor (const child of node.children) walk(child, node.debugId)\n\t\t\t}\n\t\t\tfor (const child of rootNode.children) walk(child, null)\n\t\t\treturn {\n\t\t\t\trootId: rootNode.debugId,\n\t\t\t\trootChildrenIds: rootNode.children.map((c) => c.debugId),\n\t\t\t\tnodesById,\n\t\t\t}\n\t\t},\n\t\tgetNode(id: number) {\n\t\t\tconst node = findNodeById(id)\n\t\t\tif (!node) return null\n\t\t\treturn {\n\t\t\t\tid: node.debugId,\n\t\t\t\ttype: node.type,\n\t\t\t\tparentId: node.parent ? node.parent.debugId : null,\n\t\t\t\tchildrenIds: node.children.map((c) => c.debugId),\n\t\t\t\tlayout: node.layout,\n\t\t\t}\n\t\t},\n\t\tgetNodeProps(id: number) {\n\t\t\tconst node = findNodeById(id)\n\t\t\tif (!node) return null\n\t\t\treturn serializeValue(node.props, 0, new WeakSet())\n\t\t},\n\t\thitTestCanvas(x: number, y: number) {\n\t\t\tconst node = hitTest(x, y)\n\t\t\treturn node ? node.debugId : null\n\t\t},\n\t\thitTestClient(clientX: number, clientY: number) {\n\t\t\tconst { x, y } = toCanvasPoint(clientX, clientY)\n\t\t\tconst node = hitTest(x, y)\n\t\t\treturn node ? node.debugId : null\n\t\t},\n\t\tsetHighlight(next: { hoverId?: number | null; selectedId?: number | null }) {\n\t\t\tif ('hoverId' in next) hoverId = next.hoverId ?? null\n\t\t\tif ('selectedId' in next) selectedId = next.selectedId ?? null\n\t\t\tinvalidate()\n\t\t},\n\t\tsubscribe(cb: () => void) {\n\t\t\tcommitSubscribers.add(cb)\n\t\t\treturn () => {\n\t\t\t\tcommitSubscribers.delete(cb)\n\t\t\t}\n\t\t},\n\t}\n\n\tconst registryRootInstanceId = (() => {\n\t\tif (typeof window === 'undefined') return null\n\t\tconst w = window as any\n\t\tconst key = '__REACT_CANVAS_FIBER_DEVTOOLS__'\n\t\tif (!w[key]) {\n\t\t\tw[key] = {\n\t\t\t\tversion: 1,\n\t\t\t\tnextRootInstanceId: 1,\n\t\t\t\troots: new Map<\n\t\t\t\t\tnumber,\n\t\t\t\t\t{\n\t\t\t\t\t\tid: number\n\t\t\t\t\t\tcanvas: HTMLCanvasElement\n\t\t\t\t\t\toptions: { width: number; height: number; dpr: number }\n\t\t\t\t\t\tdevtools: typeof __devtools\n\t\t\t\t\t\trevision: number\n\t\t\t\t\t\tunsubscribe: null | (() => void)\n\t\t\t\t\t}\n\t\t\t\t>(),\n\t\t\t\tpicker: {\n\t\t\t\t\tenabled: false,\n\t\t\t\t\trootInstanceId: null as number | null,\n\t\t\t\t\thoverId: null as number | null,\n\t\t\t\t\tselectedId: null as number | null,\n\t\t\t\t},\n\t\t\t\tpickerCleanup: null as null | (() => void),\n\t\t\t\tlistRoots() {\n\t\t\t\t\tconst res: Array<{\n\t\t\t\t\t\tid: number\n\t\t\t\t\t\trect: { left: number; top: number; width: number; height: number }\n\t\t\t\t\t\toptions: { width: number; height: number; dpr: number }\n\t\t\t\t\t\trevision: number\n\t\t\t\t\t}> = []\n\t\t\t\t\tfor (const r of this.roots.values()) {\n\t\t\t\t\t\tconst rect = r.canvas.getBoundingClientRect()\n\t\t\t\t\t\tres.push({\n\t\t\t\t\t\t\tid: r.id,\n\t\t\t\t\t\t\trect: { left: rect.left, top: rect.top, width: rect.width, height: rect.height },\n\t\t\t\t\t\t\toptions: r.options,\n\t\t\t\t\t\t\trevision: r.revision,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\treturn res\n\t\t\t\t},\n\t\t\t\tgetRootDevtools(id: number) {\n\t\t\t\t\treturn this.roots.get(id)?.devtools ?? null\n\t\t\t\t},\n\t\t\t\tgetSnapshot(rootInstanceId: number) {\n\t\t\t\t\treturn this.getRootDevtools(rootInstanceId)?.getSnapshot?.() ?? null\n\t\t\t\t},\n\t\t\t\tgetNodeProps(rootInstanceId: number, nodeId: number) {\n\t\t\t\t\treturn this.getRootDevtools(rootInstanceId)?.getNodeProps?.(nodeId) ?? null\n\t\t\t\t},\n\t\t\t\tsetHighlight(\n\t\t\t\t\trootInstanceId: number,\n\t\t\t\t\tnext: { hoverId?: number | null; selectedId?: number | null },\n\t\t\t\t) {\n\t\t\t\t\tthis.getRootDevtools(rootInstanceId)?.setHighlight?.(next)\n\t\t\t\t},\n\t\t\t\tstartPicker(rootInstanceId: number) {\n\t\t\t\t\tthis.stopPicker()\n\t\t\t\t\tconst handle = this.roots.get(rootInstanceId)\n\t\t\t\t\tif (!handle) return false\n\t\t\t\t\tthis.picker.enabled = true\n\t\t\t\t\tthis.picker.rootInstanceId = rootInstanceId\n\t\t\t\t\tthis.picker.hoverId = null\n\t\t\t\t\tthis.picker.selectedId = null\n\n\t\t\t\t\tconst onMove = (e: PointerEvent) => {\n\t\t\t\t\t\tif (!this.picker.enabled) return\n\t\t\t\t\t\tif (e.target !== handle.canvas) {\n\t\t\t\t\t\t\tif (this.picker.hoverId != null) {\n\t\t\t\t\t\t\t\tthis.picker.hoverId = null\n\t\t\t\t\t\t\t\thandle.devtools.setHighlight({ hoverId: null })\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst id = handle.devtools.hitTestClient(e.clientX, e.clientY)\n\t\t\t\t\t\tif (id !== this.picker.hoverId) {\n\t\t\t\t\t\t\tthis.picker.hoverId = id\n\t\t\t\t\t\t\thandle.devtools.setHighlight({ hoverId: id, selectedId: this.picker.selectedId })\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst onDown = (e: PointerEvent) => {\n\t\t\t\t\t\tif (!this.picker.enabled) return\n\t\t\t\t\t\tif (e.target !== handle.canvas) return\n\t\t\t\t\t\tif (e.button !== 0) return\n\t\t\t\t\t\tconst id = handle.devtools.hitTestClient(e.clientX, e.clientY)\n\t\t\t\t\t\tthis.picker.selectedId = id\n\t\t\t\t\t\thandle.devtools.setHighlight({ hoverId: null, selectedId: id })\n\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\tthis.stopPicker()\n\t\t\t\t\t}\n\n\t\t\t\t\tconst onKeyDown = (e: KeyboardEvent) => {\n\t\t\t\t\t\tif (e.key !== 'Escape') return\n\t\t\t\t\t\tthis.stopPicker()\n\t\t\t\t\t}\n\n\t\t\t\t\twindow.addEventListener('pointermove', onMove, true)\n\t\t\t\t\twindow.addEventListener('pointerdown', onDown, true)\n\t\t\t\t\twindow.addEventListener('keydown', onKeyDown, true)\n\t\t\t\t\tthis.pickerCleanup = () => {\n\t\t\t\t\t\twindow.removeEventListener('pointermove', onMove, true)\n\t\t\t\t\t\twindow.removeEventListener('pointerdown', onDown, true)\n\t\t\t\t\t\twindow.removeEventListener('keydown', onKeyDown, true)\n\t\t\t\t\t\thandle.devtools.setHighlight({ hoverId: null })\n\t\t\t\t\t}\n\t\t\t\t\treturn true\n\t\t\t\t},\n\t\t\t\tstopPicker() {\n\t\t\t\t\tif (!this.picker.enabled) return\n\t\t\t\t\tthis.picker.enabled = false\n\t\t\t\t\tthis.picker.rootInstanceId = null\n\t\t\t\t\tthis.picker.hoverId = null\n\t\t\t\t\tthis.picker.selectedId = null\n\t\t\t\t\tthis.pickerCleanup?.()\n\t\t\t\t\tthis.pickerCleanup = null\n\t\t\t\t},\n\t\t\t\tgetPickerState() {\n\t\t\t\t\treturn { ...this.picker }\n\t\t\t\t},\n\t\t\t\tunregisterRoot(id: number) {\n\t\t\t\t\tconst handle = this.roots.get(id)\n\t\t\t\t\tif (!handle) return\n\t\t\t\t\tif (this.picker.rootInstanceId === id) this.stopPicker()\n\t\t\t\t\thandle.unsubscribe?.()\n\t\t\t\t\tthis.roots.delete(id)\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tconst registry = w[key]\n\t\tconst rootInstanceId: number = registry.nextRootInstanceId++\n\t\tconst entry = {\n\t\t\tid: rootInstanceId,\n\t\t\tcanvas,\n\t\t\toptions: { width: options.width, height: options.height, dpr: options.dpr },\n\t\t\tdevtools: __devtools,\n\t\t\trevision: 0,\n\t\t\tunsubscribe: null as null | (() => void),\n\t\t}\n\t\tentry.unsubscribe = __devtools.subscribe(() => {\n\t\t\tentry.revision += 1\n\t\t})\n\t\tregistry.roots.set(rootInstanceId, entry)\n\t\treturn rootInstanceId\n\t})()\n\n\treturn {\n\t\trender(element: ReactNode) {\n\t\t\treconcilerRoot.render(element)\n\t\t},\n\t\tunmount() {\n\t\t\treconcilerRoot.unmount()\n\t\t\tif (typeof window !== 'undefined' && registryRootInstanceId != null) {\n\t\t\t\tconst w = window as any\n\t\t\t\tw.__REACT_CANVAS_FIBER_DEVTOOLS__?.unregisterRoot?.(registryRootInstanceId)\n\t\t\t}\n\t\t},\n\t\tdispatchPointerEvent,\n\t\tdispatchWheelEvent,\n\t\t__devtools,\n\t}\n}\n","import type { CSSProperties } from 'react'\nimport { useCallback, useLayoutEffect, useMemo, useRef } from 'react'\nimport { createCanvasRoot } from '../runtime'\nimport type { CanvasProps } from '../types'\n\n/**\n * React 侧桥接组件:\n * - 负责创建/管理 DOM <canvas>\n * - 初始化自定义 renderer 的运行时 root\n * - 将 children 交给 reconciler 渲染为场景树\n */\nexport function Canvas(props: CanvasProps) {\n\tconst canvasRef = useRef<HTMLCanvasElement | null>(null)\n\tconst rootRef = useRef<ReturnType<typeof createCanvasRoot> | null>(null)\n\n\tconst dpr = props.dpr ?? 1\n\n\t/**\n\t * DOM canvas 的 style 尺寸使用“逻辑像素”,实际渲染像素由 width/height attribute 决定。\n\t */\n\tconst canvasStyle = useMemo<CSSProperties>(\n\t\t() => ({\n\t\t\twidth: props.width,\n\t\t\theight: props.height,\n\t\t\tdisplay: 'block',\n\t\t\ttouchAction: 'none',\n\t\t\t...props.style,\n\t\t}),\n\t\t[props.width, props.height, props.style],\n\t)\n\n\tconst dispatchPointer = useCallback(\n\t\t(type: 'pointerdown' | 'pointermove' | 'pointerup' | 'pointercancel', e: any) => {\n\t\t\tconst canvas = canvasRef.current\n\t\t\tconst root = rootRef.current\n\t\t\tif (!canvas || !root) return\n\n\t\t\tconst rect = canvas.getBoundingClientRect()\n\t\t\tconst scaleX = rect.width ? props.width / rect.width : 1\n\t\t\tconst scaleY = rect.height ? props.height / rect.height : 1\n\n\t\t\tconst x = (e.clientX - rect.left) * scaleX\n\t\t\tconst y = (e.clientY - rect.top) * scaleY\n\n\t\t\tconst res = root.dispatchPointerEvent(type as any, {\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\tpointerId: e.pointerId ?? 0,\n\t\t\t\tbutton: e.button ?? 0,\n\t\t\t\tbuttons: e.buttons ?? 0,\n\t\t\t\taltKey: !!e.altKey,\n\t\t\t\tctrlKey: !!e.ctrlKey,\n\t\t\t\tshiftKey: !!e.shiftKey,\n\t\t\t\tmetaKey: !!e.metaKey,\n\t\t\t})\n\n\t\t\tif (res?.defaultPrevented && typeof e.preventDefault === 'function') {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\t\t},\n\t\t[props.width, props.height],\n\t)\n\n\tconst handleWheel = useCallback(\n\t\t(e: any) => {\n\t\t\tconst canvas = canvasRef.current\n\t\t\tconst root = rootRef.current\n\t\t\tif (!canvas || !root) return\n\n\t\t\tconst rect = canvas.getBoundingClientRect()\n\t\t\tconst scaleX = rect.width ? props.width / rect.width : 1\n\t\t\tconst scaleY = rect.height ? props.height / rect.height : 1\n\n\t\t\tlet deltaX = e.deltaX ?? 0\n\t\t\tlet deltaY = e.deltaY ?? 0\n\t\t\tif (e.deltaMode === 1) {\n\t\t\t\tdeltaX *= 16\n\t\t\t\tdeltaY *= 16\n\t\t\t} else if (e.deltaMode === 2) {\n\t\t\t\tdeltaX *= props.width\n\t\t\t\tdeltaY *= props.height\n\t\t\t}\n\n\t\t\tconst x = (e.clientX - rect.left) * scaleX\n\t\t\tconst y = (e.clientY - rect.top) * scaleY\n\n\t\t\tconst payload = {\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\tdeltaX: deltaX * scaleX,\n\t\t\t\tdeltaY: deltaY * scaleY,\n\t\t\t\taltKey: !!e.altKey,\n\t\t\t\tctrlKey: !!e.ctrlKey,\n\t\t\t\tshiftKey: !!e.shiftKey,\n\t\t\t\tmetaKey: !!e.metaKey,\n\t\t\t}\n\t\t\tconst res = root.dispatchWheelEvent(payload)\n\n\t\t\tif (res?.defaultPrevented && typeof e.preventDefault === 'function') {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\t\t},\n\t\t[props.width, props.height],\n\t)\n\n\tconst handlePointerDown = useCallback(\n\t\t(e: any) => {\n\t\t\tconst canvas = canvasRef.current\n\t\t\tif (canvas && typeof canvas.setPointerCapture === 'function') {\n\t\t\t\ttry {\n\t\t\t\t\tcanvas.setPointerCapture(e.pointerId)\n\t\t\t\t} catch (err) {\n\t\t\t\t\tvoid err\n\t\t\t\t}\n\t\t\t}\n\t\t\tdispatchPointer('pointerdown', e)\n\t\t},\n\t\t[dispatchPointer],\n\t)\n\n\tuseLayoutEffect(() => {\n\t\tconst canvas = canvasRef.current\n\t\tif (!canvas) return\n\t\tconst listener = (e: WheelEvent) => {\n\t\t\thandleWheel(e as any)\n\t\t}\n\t\tcanvas.addEventListener('wheel', listener, { passive: false })\n\t\treturn () => {\n\t\t\tcanvas.removeEventListener('wheel', listener)\n\t\t}\n\t}, [handleWheel])\n\n\t/**\n\t * 当 canvas 或关键参数变化时,重新创建运行时 root。\n\t */\n\tuseLayoutEffect(() => {\n\t\tconst canvas = canvasRef.current\n\t\tif (!canvas) return\n\n\t\trootRef.current = createCanvasRoot(canvas, {\n\t\t\twidth: props.width,\n\t\t\theight: props.height,\n\t\t\tdpr,\n\t\t\tclearColor: props.clearColor,\n\t\t\tfontFamily: props.fontFamily,\n\t\t\tfontSize: props.fontSize,\n\t\t\tfontWeight: props.fontWeight,\n\t\t\tlineHeight: props.lineHeight,\n\t\t})\n\n\t\treturn () => {\n\t\t\trootRef.current?.unmount()\n\t\t\trootRef.current = null\n\t\t}\n\t}, [\n\t\tprops.width,\n\t\tprops.height,\n\t\tprops.clearColor,\n\t\tprops.fontFamily,\n\t\tprops.fontSize,\n\t\tprops.fontWeight,\n\t\tprops.lineHeight,\n\t\tdpr,\n\t])\n\n\t/**\n\t * children 变更时,推送到 reconciler 触发一次 commit。\n\t */\n\tuseLayoutEffect(() => {\n\t\trootRef.current?.render(props.children ?? null)\n\t}, [props.children])\n\n\treturn (\n\t\t<canvas\n\t\t\tref={canvasRef}\n\t\t\tstyle={canvasStyle}\n\t\t\twidth={Math.floor(props.width * dpr)}\n\t\t\theight={Math.floor(props.height * dpr)}\n\t\t\tonPointerDown={handlePointerDown}\n\t\t\tonPointerMove={(e) => dispatchPointer('pointermove', e)}\n\t\t\tonPointerUp={(e) => dispatchPointer('pointerup', e)}\n\t\t\tonPointerCancel={(e) => dispatchPointer('pointercancel', e)}\n\t\t/>\n\t)\n}\n","import { createElement } from 'react'\nimport type { RectProps, TextProps, ViewProps } from '../types/jsx'\nexport type { RectProps, TextProps, ViewProps, YogaStyle } from '../types/jsx'\n\n/**\n * JSX 层组件:本身不渲染到 DOM。\n *\n * 它们返回 intrinsic element(字符串 type),由自定义 reconciler 接管创建/更新节点:\n * - <View/> -> CanvasNode(type='View')\n * - <Rect/> -> CanvasNode(type='Rect')\n * - <Text/> -> CanvasNode(type='Text')\n */\nexport function View(props: ViewProps) {\n\treturn createElement('View', props)\n}\n\nexport function Rect(props: RectProps) {\n\treturn createElement('Rect', props)\n}\n\nexport function Text(props: TextProps) {\n\treturn createElement('Text', props)\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@jiujue/react-canvas-fiber",
3
+ "version": "1.1.1",
4
+ "private": false,
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "description": "A React custom renderer for Canvas2D with Yoga layout",
8
+ "sideEffects": false,
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/jiujue/react-canvas-fiber",
15
+ "directory": "packages/react-canvas-fiber"
16
+ },
17
+ "main": "./dist/index.cjs",
18
+ "module": "./dist/index.js",
19
+ "types": "./dist/index.d.ts",
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js",
24
+ "require": "./dist/index.cjs"
25
+ }
26
+ },
27
+ "scripts": {
28
+ "build": "tsup --config tsup.config.ts",
29
+ "dev": "tsup --config tsup.config.ts --watch",
30
+ "clean": "rimraf dist"
31
+ },
32
+ "peerDependencies": {
33
+ "react": "^18.0.0 || ^19.0.0",
34
+ "react-dom": "^18.0.0 || ^19.0.0",
35
+ "react-reconciler": "^0.29.0 || ^0.31.0"
36
+ },
37
+ "dependencies": {
38
+ "yoga-layout": "^3.2.1"
39
+ },
40
+ "devDependencies": {
41
+ "@types/react": "^18.2.48",
42
+ "@types/react-reconciler": "^0.28.9",
43
+ "react-reconciler": "^0.29.0",
44
+ "rimraf": "^6.0.1",
45
+ "tsup": "^8.3.5",
46
+ "typescript": "^5.5.4"
47
+ }
48
+ }