@meonode/canvas 2.0.0 → 2.0.2

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.
Files changed (118) hide show
  1. package/README.md +272 -256
  2. package/dist/cjs/canvas/canvas.helper.js.map +1 -1
  3. package/dist/cjs/canvas/{chart.canvas.util.js → chart.canvas.js} +23 -23
  4. package/dist/cjs/canvas/chart.canvas.js.map +1 -0
  5. package/dist/cjs/canvas/{grid.canvas.util.js → grid.canvas.js} +4 -4
  6. package/dist/cjs/canvas/grid.canvas.js.map +1 -0
  7. package/dist/cjs/canvas/{image.canvas.util.js → image.canvas.js} +3 -3
  8. package/dist/cjs/canvas/image.canvas.js.map +1 -0
  9. package/dist/cjs/canvas/{layout.canvas.util.js → layout.canvas.js} +18 -11
  10. package/dist/cjs/canvas/layout.canvas.js.map +1 -0
  11. package/dist/cjs/canvas/{root.canvas.util.js → root.canvas.js} +17 -17
  12. package/dist/cjs/canvas/root.canvas.js.map +1 -0
  13. package/dist/cjs/canvas/{text.canvas.util.js → text.canvas.js} +3 -3
  14. package/dist/cjs/canvas/text.canvas.js.map +1 -0
  15. package/dist/cjs/constant/common.const.js.map +1 -1
  16. package/dist/cjs/index.js +17 -17
  17. package/dist/cjs/src/canvas/canvas.helper.d.ts.map +1 -0
  18. package/dist/{esm → cjs/src}/canvas/canvas.type.d.ts +4 -4
  19. package/dist/cjs/src/canvas/canvas.type.d.ts.map +1 -0
  20. package/dist/cjs/{canvas/chart.canvas.util.d.ts → src/canvas/chart.canvas.d.ts} +2 -2
  21. package/dist/cjs/src/canvas/chart.canvas.d.ts.map +1 -0
  22. package/dist/{esm/canvas/grid.canvas.util.d.ts → cjs/src/canvas/grid.canvas.d.ts} +2 -2
  23. package/dist/cjs/src/canvas/grid.canvas.d.ts.map +1 -0
  24. package/dist/{esm/canvas/image.canvas.util.d.ts → cjs/src/canvas/image.canvas.d.ts} +2 -2
  25. package/dist/cjs/src/canvas/image.canvas.d.ts.map +1 -0
  26. package/dist/{esm/canvas/layout.canvas.util.d.ts → cjs/src/canvas/layout.canvas.d.ts} +1 -1
  27. package/dist/cjs/src/canvas/layout.canvas.d.ts.map +1 -0
  28. package/dist/{esm/canvas/root.canvas.util.d.ts → cjs/src/canvas/root.canvas.d.ts} +2 -2
  29. package/dist/cjs/src/canvas/root.canvas.d.ts.map +1 -0
  30. package/dist/cjs/{canvas/text.canvas.util.d.ts → src/canvas/text.canvas.d.ts} +2 -2
  31. package/dist/cjs/src/canvas/text.canvas.d.ts.map +1 -0
  32. package/dist/cjs/src/constant/common.const.d.ts +18 -0
  33. package/dist/cjs/src/constant/common.const.d.ts.map +1 -0
  34. package/dist/cjs/src/index.d.ts +11 -0
  35. package/dist/cjs/src/index.d.ts.map +1 -0
  36. package/dist/cjs/src/util/disk.cache.d.ts.map +1 -0
  37. package/dist/cjs/src/worker/render.worker.d.ts.map +1 -0
  38. package/dist/cjs/src/worker/worker.types.d.ts.map +1 -0
  39. package/dist/cjs/util/disk.cache.js +9 -3
  40. package/dist/cjs/util/disk.cache.js.map +1 -1
  41. package/dist/cjs/worker/render.worker.js +2 -2
  42. package/dist/cjs/worker/render.worker.js.map +1 -1
  43. package/dist/esm/canvas/{chart.canvas.util.js → chart.canvas.js} +4 -4
  44. package/dist/esm/canvas/{grid.canvas.util.js → grid.canvas.js} +1 -1
  45. package/dist/esm/canvas/{image.canvas.util.js → image.canvas.js} +1 -1
  46. package/dist/esm/canvas/{layout.canvas.util.js → layout.canvas.js} +17 -10
  47. package/dist/esm/canvas/{root.canvas.util.js → root.canvas.js} +5 -5
  48. package/dist/esm/canvas/{text.canvas.util.js → text.canvas.js} +1 -1
  49. package/dist/esm/index.js +6 -6
  50. package/dist/esm/src/canvas/canvas.helper.d.ts.map +1 -0
  51. package/dist/{cjs → esm/src}/canvas/canvas.type.d.ts +4 -4
  52. package/dist/esm/src/canvas/canvas.type.d.ts.map +1 -0
  53. package/dist/esm/{canvas/chart.canvas.util.d.ts → src/canvas/chart.canvas.d.ts} +2 -2
  54. package/dist/esm/src/canvas/chart.canvas.d.ts.map +1 -0
  55. package/dist/{cjs/canvas/grid.canvas.util.d.ts → esm/src/canvas/grid.canvas.d.ts} +2 -2
  56. package/dist/esm/src/canvas/grid.canvas.d.ts.map +1 -0
  57. package/dist/{cjs/canvas/image.canvas.util.d.ts → esm/src/canvas/image.canvas.d.ts} +2 -2
  58. package/dist/esm/src/canvas/image.canvas.d.ts.map +1 -0
  59. package/dist/{cjs/canvas/layout.canvas.util.d.ts → esm/src/canvas/layout.canvas.d.ts} +1 -1
  60. package/dist/esm/src/canvas/layout.canvas.d.ts.map +1 -0
  61. package/dist/{cjs/canvas/root.canvas.util.d.ts → esm/src/canvas/root.canvas.d.ts} +2 -2
  62. package/dist/esm/src/canvas/root.canvas.d.ts.map +1 -0
  63. package/dist/esm/{canvas/text.canvas.util.d.ts → src/canvas/text.canvas.d.ts} +2 -2
  64. package/dist/esm/src/canvas/text.canvas.d.ts.map +1 -0
  65. package/dist/esm/src/constant/common.const.d.ts +18 -0
  66. package/dist/esm/src/constant/common.const.d.ts.map +1 -0
  67. package/dist/esm/src/index.d.ts +11 -0
  68. package/dist/esm/src/index.d.ts.map +1 -0
  69. package/dist/esm/src/util/disk.cache.d.ts.map +1 -0
  70. package/dist/esm/src/worker/render.worker.d.ts.map +1 -0
  71. package/dist/esm/src/worker/worker.types.d.ts.map +1 -0
  72. package/dist/esm/util/disk.cache.js +9 -3
  73. package/dist/esm/worker/render.worker.js +1 -1
  74. package/package.json +9 -8
  75. package/dist/cjs/canvas/canvas.helper.d.ts.map +0 -1
  76. package/dist/cjs/canvas/canvas.type.d.ts.map +0 -1
  77. package/dist/cjs/canvas/chart.canvas.util.d.ts.map +0 -1
  78. package/dist/cjs/canvas/chart.canvas.util.js.map +0 -1
  79. package/dist/cjs/canvas/grid.canvas.util.d.ts.map +0 -1
  80. package/dist/cjs/canvas/grid.canvas.util.js.map +0 -1
  81. package/dist/cjs/canvas/image.canvas.util.d.ts.map +0 -1
  82. package/dist/cjs/canvas/image.canvas.util.js.map +0 -1
  83. package/dist/cjs/canvas/layout.canvas.util.d.ts.map +0 -1
  84. package/dist/cjs/canvas/layout.canvas.util.js.map +0 -1
  85. package/dist/cjs/canvas/root.canvas.util.d.ts.map +0 -1
  86. package/dist/cjs/canvas/root.canvas.util.js.map +0 -1
  87. package/dist/cjs/canvas/text.canvas.util.d.ts.map +0 -1
  88. package/dist/cjs/canvas/text.canvas.util.js.map +0 -1
  89. package/dist/cjs/constant/common.const.d.ts +0 -37
  90. package/dist/cjs/constant/common.const.d.ts.map +0 -1
  91. package/dist/cjs/index.d.ts +0 -11
  92. package/dist/cjs/index.d.ts.map +0 -1
  93. package/dist/cjs/util/disk.cache.d.ts.map +0 -1
  94. package/dist/cjs/worker/render.worker.d.ts.map +0 -1
  95. package/dist/cjs/worker/worker.types.d.ts.map +0 -1
  96. package/dist/esm/canvas/canvas.helper.d.ts.map +0 -1
  97. package/dist/esm/canvas/canvas.type.d.ts.map +0 -1
  98. package/dist/esm/canvas/chart.canvas.util.d.ts.map +0 -1
  99. package/dist/esm/canvas/grid.canvas.util.d.ts.map +0 -1
  100. package/dist/esm/canvas/image.canvas.util.d.ts.map +0 -1
  101. package/dist/esm/canvas/layout.canvas.util.d.ts.map +0 -1
  102. package/dist/esm/canvas/root.canvas.util.d.ts.map +0 -1
  103. package/dist/esm/canvas/text.canvas.util.d.ts.map +0 -1
  104. package/dist/esm/constant/common.const.d.ts +0 -37
  105. package/dist/esm/constant/common.const.d.ts.map +0 -1
  106. package/dist/esm/index.d.ts +0 -11
  107. package/dist/esm/index.d.ts.map +0 -1
  108. package/dist/esm/util/disk.cache.d.ts.map +0 -1
  109. package/dist/esm/worker/render.worker.d.ts.map +0 -1
  110. package/dist/esm/worker/worker.types.d.ts.map +0 -1
  111. /package/dist/cjs/{canvas → src/canvas}/canvas.helper.d.ts +0 -0
  112. /package/dist/cjs/{util → src/util}/disk.cache.d.ts +0 -0
  113. /package/dist/cjs/{worker → src/worker}/render.worker.d.ts +0 -0
  114. /package/dist/cjs/{worker → src/worker}/worker.types.d.ts +0 -0
  115. /package/dist/esm/{canvas → src/canvas}/canvas.helper.d.ts +0 -0
  116. /package/dist/esm/{util → src/util}/disk.cache.d.ts +0 -0
  117. /package/dist/esm/{worker → src/worker}/render.worker.d.ts +0 -0
  118. /package/dist/esm/{worker → src/worker}/worker.types.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"canvas.helper.js","sources":["../../../../src/canvas/canvas.helper.ts"],"sourcesContent":["import type { CanvasRenderingContext2D } from 'skia-canvas'\nimport * as YogaTypes from 'yoga-layout'\nimport { Style } from '@/constant/common.const.js'\nimport type { BoxProps, RootProps, CanvasElement, CartesianChartData, PieChartDataPoint, ChartType, ChartDataset } from '@/canvas/canvas.type.js'\n\nexport const drawBorders = ({\n ctx,\n node,\n x,\n y,\n width,\n height,\n radii,\n borderColor,\n borderStyle,\n}: {\n ctx: CanvasRenderingContext2D\n node: YogaTypes.Node\n x: number\n y: number\n width: number\n height: number\n radii: {\n TopLeft: number\n TopRight: number\n BottomLeft: number\n BottomRight: number\n }\n borderColor: BoxProps['borderColor']\n borderStyle: BoxProps['borderStyle']\n}) => {\n const borderAll = node.getBorder(YogaTypes.Edge.All) || 0\n const borderTop = Math.max(0, node.getBorder(YogaTypes.Edge.Top) || borderAll)\n const borderRight = Math.max(0, node.getBorder(YogaTypes.Edge.Right) || borderAll)\n const borderBottom = Math.max(0, node.getBorder(YogaTypes.Edge.Bottom) || borderAll)\n const borderLeft = Math.max(0, node.getBorder(YogaTypes.Edge.Left) || borderAll)\n\n const hasBorder = borderTop > 0 || borderRight > 0 || borderBottom > 0 || borderLeft > 0\n const boxSizing = node.getBoxSizing()\n\n if (hasBorder && borderColor) {\n ctx.strokeStyle = borderColor\n ctx.lineCap = 'butt'\n ctx.lineJoin = 'miter' // Use miter for sharp corners unless rounded\n\n const setDash = (width: number) => {\n if (borderStyle === Style.Border.Dotted && width > 0) {\n // Dotted: tight spacing with round caps for circular dots\n ctx.lineCap = 'round'\n ctx.setLineDash([0, width * 2]) // 0-length dash with spacing creates dots with round caps\n } else if (borderStyle === Style.Border.Dashed && width > 0) {\n ctx.lineCap = 'butt'\n const dashLength = Math.max(2, width * 1.5)\n const gapLength = Math.max(1, width)\n ctx.setLineDash([dashLength, gapLength])\n } else {\n ctx.lineCap = 'butt'\n ctx.setLineDash([]) // Solid line\n }\n }\n\n /**\n * Draws a rounded corner arc for the border.\n * @param cx The x-coordinate of the visual center of the corner curve.\n * @param cy The y-coordinate of the visual center of the corner curve.\n * @param radius The visual radius of the corner curve.\n * @param startAngle The starting angle of the arc in radians.\n * @param endAngle The ending angle of the arc in radians.\n * @param border1 The border width leading into the corner.\n * @param border2 The border width leading out of the corner.\n */\n const drawCornerArc = (cx: number, cy: number, radius: number, startAngle: number, endAngle: number, border1: number, border2: number) => {\n if (radius <= 0) return\n\n const cornerWidth = Math.max(border1, border2)\n if (cornerWidth <= 0) return\n\n let centerlineArcRadius: number\n\n if (boxSizing === Style.BoxSizing.ContentBox) {\n // For content-box, the border is outside the box, so the centerline radius is the visual radius plus half the border width.\n centerlineArcRadius = radius + cornerWidth / 2\n } else {\n // For border-box, the border is inside the box, so the centerline radius is the visual radius minus half the border width.\n // Ensure the centerline radius is not negative.\n centerlineArcRadius = Math.max(0, radius - cornerWidth / 2)\n\n if (centerlineArcRadius <= 0 && radius > 0) {\n // Draw cap for border-box when border is thicker than radius allows for centerline arc\n ctx.fillStyle = borderColor! // Use border color for fill\n ctx.beginPath()\n // Cap is centered on the visual corner center with the visual radius\n ctx.arc(cx, cy, radius, 0, 2 * Math.PI)\n ctx.fill()\n return // Cap drawn, skip arc stroke\n }\n }\n // Draw the normal arc stroke using the calculated centerline radius\n ctx.beginPath()\n ctx.lineWidth = cornerWidth\n setDash(cornerWidth)\n ctx.arc(cx, cy, centerlineArcRadius, startAngle, endAngle)\n ctx.stroke()\n }\n\n /**\n * Draws a straight line segment for the border.\n * @param x1 The x-coordinate of the starting point.\n * @param y1 The y-coordinate of the starting point.\n * @param x2 The x-coordinate of the ending point.\n * @param y2 The y-coordinate of the ending point.\n * @param borderWidth The width of the border.\n */\n const drawLine = (x1: number, y1: number, x2: number, y2: number, borderWidth: number) => {\n if (borderWidth <= 0) return\n ctx.beginPath()\n ctx.lineWidth = borderWidth\n setDash(borderWidth)\n ctx.moveTo(x1, y1)\n ctx.lineTo(x2, y2)\n ctx.stroke()\n }\n\n // Calculate half-border widths\n const halfBt = borderTop / 2\n const halfBr = borderRight / 2\n const halfBb = borderBottom / 2\n const halfBl = borderLeft / 2\n\n // Calculate effective visual radii, clamped to half dimensions of the *layout box*\n const maxRadiusX = width / 2 // This matches CSS behavior where radius is relative to the box it's applied to.\n const maxRadiusY = height / 2\n const rTL = Math.max(0, Math.min(radii.TopLeft, maxRadiusX, maxRadiusY))\n const rTR = Math.max(0, Math.min(radii.TopRight, maxRadiusX, maxRadiusY))\n const rBR = Math.max(0, Math.min(radii.BottomRight, maxRadiusX, maxRadiusY))\n const rBL = Math.max(0, Math.min(radii.BottomLeft, maxRadiusX, maxRadiusY))\n\n // --- Draw border segments based on boxSizing ---\n // For content-box, coordinates are offset *outwards* from x, y, width, height\n if (boxSizing === Style.BoxSizing.ContentBox) {\n // Top line segment\n void drawLine(x + rTL, y - halfBt, x + width - rTR, y - halfBt, borderTop)\n // Right line segment\n void drawLine(x + width + halfBr, y + rTR, x + width + halfBr, y + height - rBR, borderRight)\n // Bottom line segment\n void drawLine(x + width - rBR, y + height + halfBb, x + rBL, y + height + halfBb, borderBottom)\n // Left line segment\n void drawLine(x - halfBl, y + height - rBL, x - halfBl, y + rTL, borderLeft)\n\n void drawCornerArc(x + rTL, y + rTL, rTL, Math.PI, 1.5 * Math.PI, borderLeft, borderTop)\n void drawCornerArc(x + width - rTR, y + rTR, rTR, 1.5 * Math.PI, 2 * Math.PI, borderTop, borderRight)\n void drawCornerArc(x + width - rBR, y + height - rBR, rBR, 0, 0.5 * Math.PI, borderRight, borderBottom)\n void drawCornerArc(x + rBL, y + height - rBL, rBL, 0.5 * Math.PI, Math.PI, borderBottom, borderLeft)\n } else {\n // For border-box, coordinates are offset *inwards* from x, y, width, height\n // Top line segment\n void drawLine(x + rTL, y + halfBt, x + width - rTR, y + halfBt, borderTop)\n // Right line segment\n void drawLine(x + width - halfBr, y + rTR, x + width - halfBr, y + height - rBR, borderRight)\n // Bottom line segment\n void drawLine(x + width - rBR, y + height - halfBb, x + rBL, y + height - halfBb, borderBottom)\n // Left line segment\n void drawLine(x + halfBl, y + height - rBL, x + halfBl, y + rTL, borderLeft)\n\n // Draw corner arcs (centers relative to layout box corners, adjusted for inward border)\n // Pass visual radius (rTL, rTR etc.) to drawCornerArc\n void drawCornerArc(x + rTL, y + rTL, rTL, Math.PI, 1.5 * Math.PI, borderLeft, borderTop) // Top-Left\n void drawCornerArc(x + width - rTR, y + rTR, rTR, 1.5 * Math.PI, 2 * Math.PI, borderTop, borderRight) // Top-Right\n void drawCornerArc(x + width - rBR, y + height - rBR, rBR, 0, 0.5 * Math.PI, borderRight, borderBottom) // Bottom-Right\n void drawCornerArc(x + rBL, y + height - rBL, rBL, 0.5 * Math.PI, Math.PI, borderBottom, borderLeft) // Bottom-Left\n }\n }\n}\n\n/**\n * Draws an optimized rounded rectangle path on the canvas context.\n * Automatically clamps radius values to prevent visual artifacts based on box dimensions.\n * Uses arc-based rendering for crisp corners and consistent border appearance.\n * @param ctx The canvas 2D rendering context to draw on\n * @param x Left position of the rectangle\n * @param y Top position of the rectangle\n * @param width Width of the rectangle\n * @param height Height of the rectangle\n * @param radii Corner radius values for each corner. Values are clamped to box constraints.\n */\nexport const drawRoundedRectPath = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radii: { TopLeft: number; TopRight: number; BottomRight: number; BottomLeft: number },\n) => {\n if (width <= 0 || height <= 0) {\n ctx.beginPath()\n ctx.rect(x, y, width, height)\n return\n }\n\n ctx.beginPath()\n\n // Clamp radius values to prevent visual artifacts\n const maxRadius = Math.min(width / 2, height / 2)\n const clampedTL = Math.max(0, Math.min(radii.TopLeft, maxRadius))\n const clampedTR = Math.max(0, Math.min(radii.TopRight, maxRadius))\n const clampedBR = Math.max(0, Math.min(radii.BottomRight, maxRadius))\n const clampedBL = Math.max(0, Math.min(radii.BottomLeft, maxRadius))\n\n ctx.moveTo(x + clampedTL, y)\n\n // Draw top edge and top-right corner\n ctx.lineTo(x + width - clampedTR, y)\n clampedTR > 0 ? ctx.arc(x + width - clampedTR, y + clampedTR, clampedTR, 1.5 * Math.PI, 0) : ctx.lineTo(x + width, y)\n\n // Draw right edge and bottom-right corner\n ctx.lineTo(x + width, y + height - clampedBR)\n clampedBR > 0 ? ctx.arc(x + width - clampedBR, y + height - clampedBR, clampedBR, 0, 0.5 * Math.PI) : ctx.lineTo(x + width, y + height)\n\n // Draw bottom edge and bottom-left corner\n ctx.lineTo(x + clampedBL, y + height)\n clampedBL > 0 ? ctx.arc(x + clampedBL, y + height - clampedBL, clampedBL, 0.5 * Math.PI, Math.PI) : ctx.lineTo(x, y + height)\n\n // Draw left edge and top-left corner\n ctx.lineTo(x, y + clampedTL)\n clampedTL > 0 ? ctx.arc(x + clampedTL, y + clampedTL, clampedTL, Math.PI, 1.5 * Math.PI) : ctx.lineTo(x, y)\n\n ctx.closePath()\n}\n\n/**\n * Calculates border radius values from props\n * @param radiusProp Border radius property value\n * @returns Calculated border radii for all corners\n */\nexport const parseBorderRadius = (\n radiusProp: BoxProps['borderRadius'],\n): {\n TopLeft: number\n TopRight: number\n BottomRight: number\n BottomLeft: number\n} => {\n const radii = { TopLeft: 0, TopRight: 0, BottomRight: 0, BottomLeft: 0 }\n if (typeof radiusProp === 'number') {\n radii.TopLeft = radii.TopRight = radii.BottomRight = radii.BottomLeft = Math.max(0, radiusProp)\n } else if (typeof radiusProp === 'object' && radiusProp !== null) {\n radii.TopLeft = Math.max(0, radiusProp.TopLeft ?? 0)\n radii.TopRight = Math.max(0, radiusProp.TopRight ?? 0)\n radii.BottomRight = Math.max(0, radiusProp.BottomRight ?? 0)\n radii.BottomLeft = Math.max(0, radiusProp.BottomLeft ?? 0)\n }\n return radii\n}\n\n/**\n * Parses a percentage value or a number, returning the calculated value based on the base.\n * @param value The value to parse, can be a number, a percentage string, or undefined.\n * @param base The base value to calculate the percentage from.\n * @returns The parsed number, or 0 if the value is not a number or a valid percentage.\n */\nexport function parsePercentage(value: number | string | undefined, base: number): number {\n if (typeof value === 'number') {\n return value\n }\n if (typeof value === 'string' && value.endsWith('%')) {\n return base !== 0 ? (parseFloat(value) / 100) * base : 0\n }\n return 0\n}\n\n/**\n * Pre-processes a RootProps descriptor tree on the main thread before postMessage.\n * Executes function props against available data, stores results as serializable fields,\n * then strips remaining functions as a safety net.\n */\nexport class WorkerPreProcessor {\n private static readonly CHART_COLORS = ['#FF6384', '#36A2EB', '#FFCE56', '#4BC0C0', '#9966FF', '#FF9F40', '#C9CBCF']\n\n static process(props: RootProps): RootProps {\n const cloned = { ...props }\n if (cloned.children) {\n const childArray = Array.isArray(cloned.children) ? cloned.children : [cloned.children]\n cloned.children = childArray.map(child => {\n if (child && typeof child === 'object' && '__type' in child) {\n return this.processDescriptor(child as CanvasElement)\n }\n return child\n }) as any\n }\n return this.stripNonSerializable(cloned)\n }\n\n private static processDescriptor(desc: CanvasElement): CanvasElement {\n if (desc.__type === 'Chart') {\n return this.processChartDescriptor(desc)\n }\n\n if ('children' in desc && desc.children) {\n return { ...desc, children: desc.children.map(c => this.processDescriptor(c)) } as CanvasElement\n }\n\n return desc\n }\n\n private static processChartDescriptor(desc: CanvasElement & { __type: 'Chart' }): CanvasElement {\n const props = { ...desc.props }\n const options = { ...(props.options || {}) } as Record<string, any>\n const chartType = props.type as ChartType\n const data = props.data as any\n\n // xAxisLabelFormatter\n if (typeof options.xAxisLabelFormatter === 'function' && (chartType === 'bar' || chartType === 'line')) {\n const cartData = data as CartesianChartData\n if (cartData.labels) {\n options._preComputedXAxisLabels = cartData.labels.map((label: string, index: number) => {\n try {\n return options.xAxisLabelFormatter(label, index)\n } catch (err) {\n console.warn(`[WorkerPreProcessor] xAxisLabelFormatter threw for label \"${label}\" at index ${index}:`, err)\n return label\n }\n })\n }\n delete options.xAxisLabelFormatter\n }\n\n // yAxisLabelFormatter\n if (typeof options.yAxisLabelFormatter === 'function' && (chartType === 'bar' || chartType === 'line')) {\n const cartData = data as CartesianChartData\n const maxValue = Math.max(...cartData.datasets.flatMap((d: ChartDataset) => d.data))\n const labels: string[] = []\n for (let i = 0; i <= 5; i++) {\n const value = maxValue - (maxValue / 5) * i\n try {\n labels.push(options.yAxisLabelFormatter(value))\n } catch (err) {\n console.warn(`[WorkerPreProcessor] yAxisLabelFormatter threw for value ${value}:`, err)\n labels.push(String(value))\n }\n }\n options._preComputedYAxisLabels = labels\n delete options.yAxisLabelFormatter\n }\n\n // renderLegendItem\n if (typeof options.renderLegendItem === 'function') {\n if (chartType === 'bar' || chartType === 'line') {\n const cartData = data as CartesianChartData\n options._preComputedLegendItems = cartData.datasets.map((item: ChartDataset, index: number) => {\n const color = item.color || this.generateColor(index)\n try {\n const result = options.renderLegendItem({ item, index, color })\n return this.nodeToDescriptor(result)\n } catch (err) {\n console.warn(`[WorkerPreProcessor] renderLegendItem threw at index ${index}:`, err)\n return null\n }\n })\n } else {\n const pieData = data as PieChartDataPoint[]\n options._preComputedLegendItems = pieData.map((item: PieChartDataPoint, index: number) => {\n const color = item.color || this.generateColor(index)\n try {\n const result = options.renderLegendItem({ item, index, color })\n return this.nodeToDescriptor(result)\n } catch (err) {\n console.warn(`[WorkerPreProcessor] renderLegendItem threw at index ${index}:`, err)\n return null\n }\n })\n }\n delete options.renderLegendItem\n }\n\n // renderLabelItem\n if (typeof options.renderLabelItem === 'function') {\n if (chartType === 'bar' || chartType === 'line') {\n const cartData = data as CartesianChartData\n options._preComputedLabelItems = cartData.labels.map((label: string, index: number) => {\n try {\n const result = options.renderLabelItem({ item: label, index })\n return this.nodeToDescriptor(result)\n } catch (err) {\n console.warn(`[WorkerPreProcessor] renderLabelItem threw at index ${index}:`, err)\n return null\n }\n })\n } else {\n const pieData = data as PieChartDataPoint[]\n options._preComputedLabelItems = pieData.map((item: PieChartDataPoint, index: number) => {\n try {\n const result = options.renderLabelItem({ item, index })\n return this.nodeToDescriptor(result)\n } catch (err) {\n console.warn(`[WorkerPreProcessor] renderLabelItem threw at index ${index}:`, err)\n return null\n }\n })\n }\n delete options.renderLabelItem\n }\n\n // renderValueItem\n if (typeof options.renderValueItem === 'function' && (chartType === 'bar' || chartType === 'line')) {\n const cartData = data as CartesianChartData\n options._preComputedValueItems = cartData.datasets.map((dataset: ChartDataset, datasetIndex: number) =>\n dataset.data.map((value: number, index: number) => {\n try {\n const result = options.renderValueItem({ item: value, index, datasetIndex })\n return this.nodeToDescriptor(result)\n } catch (err) {\n console.warn(`[WorkerPreProcessor] renderValueItem threw at dataset ${datasetIndex}, index ${index}:`, err)\n return null\n }\n }),\n )\n delete options.renderValueItem\n }\n\n props.options = options\n return { ...desc, props } as CanvasElement\n }\n\n /**\n * Converts a BoxNode instance or CanvasElement to a CanvasElement.\n * Public API functions (Box(), Text(), etc.) already return CanvasElements,\n * but if someone returns an actual class instance, we convert it via initialProps.\n */\n private static nodeToDescriptor(node: any): CanvasElement | null | undefined {\n if (!node) return node\n // Already a CanvasElement (has __type)\n if (typeof node === 'object' && '__type' in node) return node as CanvasElement\n // Class instance (e.g. BoxNode, TextNode, ImageNode) — convert via duck-typing\n if (typeof node === 'object' && node.constructor !== Object) {\n if ('initialProps' in node && 'name' in node) {\n const { children, ...rest } = node.initialProps || {}\n const childArray = Array.isArray(children) ? children : children ? [children] : []\n const convertedChildren = childArray\n .filter((c: any) => c)\n .map((c: any) => this.nodeToDescriptor(c))\n .filter((c: any): c is CanvasElement => !!c)\n\n const name = node.name as string\n const type =\n name === 'TextNode'\n ? 'Text'\n : name === 'Row'\n ? 'Row'\n : name === 'Image'\n ? 'Image'\n : rest.flexDirection === Style.FlexDirection.Column\n ? 'Column'\n : 'Box'\n if (type === 'Text') {\n // TextNode stores original text in segments — fall back to joined segment text\n const text = node.segments?.map((s: any) => s.text).join('') ?? ''\n return { __type: 'Text', text, props: rest } as CanvasElement\n }\n if (type === 'Image') {\n return { __type: 'Image', props: rest } as CanvasElement\n }\n return {\n __type: type,\n props: rest,\n ...(convertedChildren.length > 0 ? { children: convertedChildren } : {}),\n } as CanvasElement\n }\n console.warn('[WorkerPreProcessor] Render function returned an unrecognized class instance. Use descriptor functions (Box(), Text(), etc.) instead.')\n return null\n }\n return node\n }\n\n private static generateColor(index: number): string {\n return this.CHART_COLORS[index % this.CHART_COLORS.length]\n }\n\n static stripNonSerializable<T>(obj: T): T {\n if (obj === null || obj === undefined) return obj\n if (typeof obj === 'function') return undefined as unknown as T\n if (typeof obj === 'symbol') return undefined as unknown as T\n if (typeof obj !== 'object') return obj\n\n // Preserve binary data types\n if (Buffer.isBuffer(obj)) return obj\n if (obj instanceof ArrayBuffer) return obj\n if (ArrayBuffer.isView(obj)) return obj\n\n if (Array.isArray(obj)) {\n return obj.map(item => this.stripNonSerializable(item)) as unknown as T\n }\n\n const result: Record<string, unknown> = {}\n for (const key of Object.keys(obj as Record<string, unknown>)) {\n const value = (obj as Record<string, unknown>)[key]\n if (typeof value === 'function' || typeof value === 'symbol') continue\n result[key] = this.stripNonSerializable(value)\n }\n return result as T\n }\n}\n"],"names":["YogaTypes","Style"],"mappings":"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"}
1
+ {"version":3,"file":"canvas.helper.js","sources":["../../../../../src/canvas/canvas.helper.ts"],"sourcesContent":["import type { CanvasRenderingContext2D } from 'skia-canvas'\nimport * as YogaTypes from 'yoga-layout'\nimport { Style } from '@/constant/common.const.js'\nimport type { BoxProps, RootProps, CanvasElement, CartesianChartData, PieChartDataPoint, ChartType, ChartDataset } from '@/canvas/canvas.type.js'\n\nexport const drawBorders = ({\n ctx,\n node,\n x,\n y,\n width,\n height,\n radii,\n borderColor,\n borderStyle,\n}: {\n ctx: CanvasRenderingContext2D\n node: YogaTypes.Node\n x: number\n y: number\n width: number\n height: number\n radii: {\n TopLeft: number\n TopRight: number\n BottomLeft: number\n BottomRight: number\n }\n borderColor: BoxProps['borderColor']\n borderStyle: BoxProps['borderStyle']\n}) => {\n const borderAll = node.getBorder(YogaTypes.Edge.All) || 0\n const borderTop = Math.max(0, node.getBorder(YogaTypes.Edge.Top) || borderAll)\n const borderRight = Math.max(0, node.getBorder(YogaTypes.Edge.Right) || borderAll)\n const borderBottom = Math.max(0, node.getBorder(YogaTypes.Edge.Bottom) || borderAll)\n const borderLeft = Math.max(0, node.getBorder(YogaTypes.Edge.Left) || borderAll)\n\n const hasBorder = borderTop > 0 || borderRight > 0 || borderBottom > 0 || borderLeft > 0\n const boxSizing = node.getBoxSizing()\n\n if (hasBorder && borderColor) {\n ctx.strokeStyle = borderColor\n ctx.lineCap = 'butt'\n ctx.lineJoin = 'miter' // Use miter for sharp corners unless rounded\n\n const setDash = (width: number) => {\n if (borderStyle === Style.Border.Dotted && width > 0) {\n // Dotted: tight spacing with round caps for circular dots\n ctx.lineCap = 'round'\n ctx.setLineDash([0, width * 2]) // 0-length dash with spacing creates dots with round caps\n } else if (borderStyle === Style.Border.Dashed && width > 0) {\n ctx.lineCap = 'butt'\n const dashLength = Math.max(2, width * 1.5)\n const gapLength = Math.max(1, width)\n ctx.setLineDash([dashLength, gapLength])\n } else {\n ctx.lineCap = 'butt'\n ctx.setLineDash([]) // Solid line\n }\n }\n\n /**\n * Draws a rounded corner arc for the border.\n * @param cx The x-coordinate of the visual center of the corner curve.\n * @param cy The y-coordinate of the visual center of the corner curve.\n * @param radius The visual radius of the corner curve.\n * @param startAngle The starting angle of the arc in radians.\n * @param endAngle The ending angle of the arc in radians.\n * @param border1 The border width leading into the corner.\n * @param border2 The border width leading out of the corner.\n */\n const drawCornerArc = (cx: number, cy: number, radius: number, startAngle: number, endAngle: number, border1: number, border2: number) => {\n if (radius <= 0) return\n\n const cornerWidth = Math.max(border1, border2)\n if (cornerWidth <= 0) return\n\n let centerlineArcRadius: number\n\n if (boxSizing === Style.BoxSizing.ContentBox) {\n // For content-box, the border is outside the box, so the centerline radius is the visual radius plus half the border width.\n centerlineArcRadius = radius + cornerWidth / 2\n } else {\n // For border-box, the border is inside the box, so the centerline radius is the visual radius minus half the border width.\n // Ensure the centerline radius is not negative.\n centerlineArcRadius = Math.max(0, radius - cornerWidth / 2)\n\n if (centerlineArcRadius <= 0 && radius > 0) {\n // Draw cap for border-box when border is thicker than radius allows for centerline arc\n ctx.fillStyle = borderColor! // Use border color for fill\n ctx.beginPath()\n // Cap is centered on the visual corner center with the visual radius\n ctx.arc(cx, cy, radius, 0, 2 * Math.PI)\n ctx.fill()\n return // Cap drawn, skip arc stroke\n }\n }\n // Draw the normal arc stroke using the calculated centerline radius\n ctx.beginPath()\n ctx.lineWidth = cornerWidth\n setDash(cornerWidth)\n ctx.arc(cx, cy, centerlineArcRadius, startAngle, endAngle)\n ctx.stroke()\n }\n\n /**\n * Draws a straight line segment for the border.\n * @param x1 The x-coordinate of the starting point.\n * @param y1 The y-coordinate of the starting point.\n * @param x2 The x-coordinate of the ending point.\n * @param y2 The y-coordinate of the ending point.\n * @param borderWidth The width of the border.\n */\n const drawLine = (x1: number, y1: number, x2: number, y2: number, borderWidth: number) => {\n if (borderWidth <= 0) return\n ctx.beginPath()\n ctx.lineWidth = borderWidth\n setDash(borderWidth)\n ctx.moveTo(x1, y1)\n ctx.lineTo(x2, y2)\n ctx.stroke()\n }\n\n // Calculate half-border widths\n const halfBt = borderTop / 2\n const halfBr = borderRight / 2\n const halfBb = borderBottom / 2\n const halfBl = borderLeft / 2\n\n // Calculate effective visual radii, clamped to half dimensions of the *layout box*\n const maxRadiusX = width / 2 // This matches CSS behavior where radius is relative to the box it's applied to.\n const maxRadiusY = height / 2\n const rTL = Math.max(0, Math.min(radii.TopLeft, maxRadiusX, maxRadiusY))\n const rTR = Math.max(0, Math.min(radii.TopRight, maxRadiusX, maxRadiusY))\n const rBR = Math.max(0, Math.min(radii.BottomRight, maxRadiusX, maxRadiusY))\n const rBL = Math.max(0, Math.min(radii.BottomLeft, maxRadiusX, maxRadiusY))\n\n // --- Draw border segments based on boxSizing ---\n // For content-box, coordinates are offset *outwards* from x, y, width, height\n if (boxSizing === Style.BoxSizing.ContentBox) {\n // Top line segment\n void drawLine(x + rTL, y - halfBt, x + width - rTR, y - halfBt, borderTop)\n // Right line segment\n void drawLine(x + width + halfBr, y + rTR, x + width + halfBr, y + height - rBR, borderRight)\n // Bottom line segment\n void drawLine(x + width - rBR, y + height + halfBb, x + rBL, y + height + halfBb, borderBottom)\n // Left line segment\n void drawLine(x - halfBl, y + height - rBL, x - halfBl, y + rTL, borderLeft)\n\n void drawCornerArc(x + rTL, y + rTL, rTL, Math.PI, 1.5 * Math.PI, borderLeft, borderTop)\n void drawCornerArc(x + width - rTR, y + rTR, rTR, 1.5 * Math.PI, 2 * Math.PI, borderTop, borderRight)\n void drawCornerArc(x + width - rBR, y + height - rBR, rBR, 0, 0.5 * Math.PI, borderRight, borderBottom)\n void drawCornerArc(x + rBL, y + height - rBL, rBL, 0.5 * Math.PI, Math.PI, borderBottom, borderLeft)\n } else {\n // For border-box, coordinates are offset *inwards* from x, y, width, height\n // Top line segment\n void drawLine(x + rTL, y + halfBt, x + width - rTR, y + halfBt, borderTop)\n // Right line segment\n void drawLine(x + width - halfBr, y + rTR, x + width - halfBr, y + height - rBR, borderRight)\n // Bottom line segment\n void drawLine(x + width - rBR, y + height - halfBb, x + rBL, y + height - halfBb, borderBottom)\n // Left line segment\n void drawLine(x + halfBl, y + height - rBL, x + halfBl, y + rTL, borderLeft)\n\n // Draw corner arcs (centers relative to layout box corners, adjusted for inward border)\n // Pass visual radius (rTL, rTR etc.) to drawCornerArc\n void drawCornerArc(x + rTL, y + rTL, rTL, Math.PI, 1.5 * Math.PI, borderLeft, borderTop) // Top-Left\n void drawCornerArc(x + width - rTR, y + rTR, rTR, 1.5 * Math.PI, 2 * Math.PI, borderTop, borderRight) // Top-Right\n void drawCornerArc(x + width - rBR, y + height - rBR, rBR, 0, 0.5 * Math.PI, borderRight, borderBottom) // Bottom-Right\n void drawCornerArc(x + rBL, y + height - rBL, rBL, 0.5 * Math.PI, Math.PI, borderBottom, borderLeft) // Bottom-Left\n }\n }\n}\n\n/**\n * Draws an optimized rounded rectangle path on the canvas context.\n * Automatically clamps radius values to prevent visual artifacts based on box dimensions.\n * Uses arc-based rendering for crisp corners and consistent border appearance.\n * @param ctx The canvas 2D rendering context to draw on\n * @param x Left position of the rectangle\n * @param y Top position of the rectangle\n * @param width Width of the rectangle\n * @param height Height of the rectangle\n * @param radii Corner radius values for each corner. Values are clamped to box constraints.\n */\nexport const drawRoundedRectPath = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radii: { TopLeft: number; TopRight: number; BottomRight: number; BottomLeft: number },\n) => {\n if (width <= 0 || height <= 0) {\n ctx.beginPath()\n ctx.rect(x, y, width, height)\n return\n }\n\n ctx.beginPath()\n\n // Clamp radius values to prevent visual artifacts\n const maxRadius = Math.min(width / 2, height / 2)\n const clampedTL = Math.max(0, Math.min(radii.TopLeft, maxRadius))\n const clampedTR = Math.max(0, Math.min(radii.TopRight, maxRadius))\n const clampedBR = Math.max(0, Math.min(radii.BottomRight, maxRadius))\n const clampedBL = Math.max(0, Math.min(radii.BottomLeft, maxRadius))\n\n ctx.moveTo(x + clampedTL, y)\n\n // Draw top edge and top-right corner\n ctx.lineTo(x + width - clampedTR, y)\n clampedTR > 0 ? ctx.arc(x + width - clampedTR, y + clampedTR, clampedTR, 1.5 * Math.PI, 0) : ctx.lineTo(x + width, y)\n\n // Draw right edge and bottom-right corner\n ctx.lineTo(x + width, y + height - clampedBR)\n clampedBR > 0 ? ctx.arc(x + width - clampedBR, y + height - clampedBR, clampedBR, 0, 0.5 * Math.PI) : ctx.lineTo(x + width, y + height)\n\n // Draw bottom edge and bottom-left corner\n ctx.lineTo(x + clampedBL, y + height)\n clampedBL > 0 ? ctx.arc(x + clampedBL, y + height - clampedBL, clampedBL, 0.5 * Math.PI, Math.PI) : ctx.lineTo(x, y + height)\n\n // Draw left edge and top-left corner\n ctx.lineTo(x, y + clampedTL)\n clampedTL > 0 ? ctx.arc(x + clampedTL, y + clampedTL, clampedTL, Math.PI, 1.5 * Math.PI) : ctx.lineTo(x, y)\n\n ctx.closePath()\n}\n\n/**\n * Calculates border radius values from props\n * @param radiusProp Border radius property value\n * @returns Calculated border radii for all corners\n */\nexport const parseBorderRadius = (\n radiusProp: BoxProps['borderRadius'],\n): {\n TopLeft: number\n TopRight: number\n BottomRight: number\n BottomLeft: number\n} => {\n const radii = { TopLeft: 0, TopRight: 0, BottomRight: 0, BottomLeft: 0 }\n if (typeof radiusProp === 'number') {\n radii.TopLeft = radii.TopRight = radii.BottomRight = radii.BottomLeft = Math.max(0, radiusProp)\n } else if (typeof radiusProp === 'object' && radiusProp !== null) {\n radii.TopLeft = Math.max(0, radiusProp.TopLeft ?? 0)\n radii.TopRight = Math.max(0, radiusProp.TopRight ?? 0)\n radii.BottomRight = Math.max(0, radiusProp.BottomRight ?? 0)\n radii.BottomLeft = Math.max(0, radiusProp.BottomLeft ?? 0)\n }\n return radii\n}\n\n/**\n * Parses a percentage value or a number, returning the calculated value based on the base.\n * @param value The value to parse, can be a number, a percentage string, or undefined.\n * @param base The base value to calculate the percentage from.\n * @returns The parsed number, or 0 if the value is not a number or a valid percentage.\n */\nexport function parsePercentage(value: number | string | undefined, base: number): number {\n if (typeof value === 'number') {\n return value\n }\n if (typeof value === 'string' && value.endsWith('%')) {\n return base !== 0 ? (parseFloat(value) / 100) * base : 0\n }\n return 0\n}\n\n/**\n * Pre-processes a RootProps descriptor tree on the main thread before postMessage.\n * Executes function props against available data, stores results as serializable fields,\n * then strips remaining functions as a safety net.\n */\nexport class WorkerPreProcessor {\n private static readonly CHART_COLORS = ['#FF6384', '#36A2EB', '#FFCE56', '#4BC0C0', '#9966FF', '#FF9F40', '#C9CBCF']\n\n static process(props: RootProps): RootProps {\n const cloned = { ...props }\n if (cloned.children) {\n const childArray = Array.isArray(cloned.children) ? cloned.children : [cloned.children]\n cloned.children = childArray.map(child => {\n if (child && typeof child === 'object' && '__type' in child) {\n return this.processDescriptor(child as CanvasElement)\n }\n return child\n }) as any\n }\n return this.stripNonSerializable(cloned)\n }\n\n private static processDescriptor(desc: CanvasElement): CanvasElement {\n if (desc.__type === 'Chart') {\n return this.processChartDescriptor(desc)\n }\n\n if ('children' in desc && desc.children) {\n return { ...desc, children: desc.children.map(c => this.processDescriptor(c)) } as CanvasElement\n }\n\n return desc\n }\n\n private static processChartDescriptor(desc: CanvasElement & { __type: 'Chart' }): CanvasElement {\n const props = { ...desc.props }\n const options = { ...(props.options || {}) } as Record<string, any>\n const chartType = props.type as ChartType\n const data = props.data as any\n\n // xAxisLabelFormatter\n if (typeof options.xAxisLabelFormatter === 'function' && (chartType === 'bar' || chartType === 'line')) {\n const cartData = data as CartesianChartData\n if (cartData.labels) {\n options._preComputedXAxisLabels = cartData.labels.map((label: string, index: number) => {\n try {\n return options.xAxisLabelFormatter(label, index)\n } catch (err) {\n console.warn(`[WorkerPreProcessor] xAxisLabelFormatter threw for label \"${label}\" at index ${index}:`, err)\n return label\n }\n })\n }\n delete options.xAxisLabelFormatter\n }\n\n // yAxisLabelFormatter\n if (typeof options.yAxisLabelFormatter === 'function' && (chartType === 'bar' || chartType === 'line')) {\n const cartData = data as CartesianChartData\n const maxValue = Math.max(...cartData.datasets.flatMap((d: ChartDataset) => d.data))\n const labels: string[] = []\n for (let i = 0; i <= 5; i++) {\n const value = maxValue - (maxValue / 5) * i\n try {\n labels.push(options.yAxisLabelFormatter(value))\n } catch (err) {\n console.warn(`[WorkerPreProcessor] yAxisLabelFormatter threw for value ${value}:`, err)\n labels.push(String(value))\n }\n }\n options._preComputedYAxisLabels = labels\n delete options.yAxisLabelFormatter\n }\n\n // renderLegendItem\n if (typeof options.renderLegendItem === 'function') {\n if (chartType === 'bar' || chartType === 'line') {\n const cartData = data as CartesianChartData\n options._preComputedLegendItems = cartData.datasets.map((item: ChartDataset, index: number) => {\n const color = item.color || this.generateColor(index)\n try {\n const result = options.renderLegendItem({ item, index, color })\n return this.nodeToDescriptor(result)\n } catch (err) {\n console.warn(`[WorkerPreProcessor] renderLegendItem threw at index ${index}:`, err)\n return null\n }\n })\n } else {\n const pieData = data as PieChartDataPoint[]\n options._preComputedLegendItems = pieData.map((item: PieChartDataPoint, index: number) => {\n const color = item.color || this.generateColor(index)\n try {\n const result = options.renderLegendItem({ item, index, color })\n return this.nodeToDescriptor(result)\n } catch (err) {\n console.warn(`[WorkerPreProcessor] renderLegendItem threw at index ${index}:`, err)\n return null\n }\n })\n }\n delete options.renderLegendItem\n }\n\n // renderLabelItem\n if (typeof options.renderLabelItem === 'function') {\n if (chartType === 'bar' || chartType === 'line') {\n const cartData = data as CartesianChartData\n options._preComputedLabelItems = cartData.labels.map((label: string, index: number) => {\n try {\n const result = options.renderLabelItem({ item: label, index })\n return this.nodeToDescriptor(result)\n } catch (err) {\n console.warn(`[WorkerPreProcessor] renderLabelItem threw at index ${index}:`, err)\n return null\n }\n })\n } else {\n const pieData = data as PieChartDataPoint[]\n options._preComputedLabelItems = pieData.map((item: PieChartDataPoint, index: number) => {\n try {\n const result = options.renderLabelItem({ item, index })\n return this.nodeToDescriptor(result)\n } catch (err) {\n console.warn(`[WorkerPreProcessor] renderLabelItem threw at index ${index}:`, err)\n return null\n }\n })\n }\n delete options.renderLabelItem\n }\n\n // renderValueItem\n if (typeof options.renderValueItem === 'function' && (chartType === 'bar' || chartType === 'line')) {\n const cartData = data as CartesianChartData\n options._preComputedValueItems = cartData.datasets.map((dataset: ChartDataset, datasetIndex: number) =>\n dataset.data.map((value: number, index: number) => {\n try {\n const result = options.renderValueItem({ item: value, index, datasetIndex })\n return this.nodeToDescriptor(result)\n } catch (err) {\n console.warn(`[WorkerPreProcessor] renderValueItem threw at dataset ${datasetIndex}, index ${index}:`, err)\n return null\n }\n }),\n )\n delete options.renderValueItem\n }\n\n props.options = options\n return { ...desc, props } as CanvasElement\n }\n\n /**\n * Converts a BoxNode instance or CanvasElement to a CanvasElement.\n * Public API functions (Box(), Text(), etc.) already return CanvasElements,\n * but if someone returns an actual class instance, we convert it via initialProps.\n */\n private static nodeToDescriptor(node: any): CanvasElement | null | undefined {\n if (!node) return node\n // Already a CanvasElement (has __type)\n if (typeof node === 'object' && '__type' in node) return node as CanvasElement\n // Class instance (e.g. BoxNode, TextNode, ImageNode) — convert via duck-typing\n if (typeof node === 'object' && node.constructor !== Object) {\n if ('initialProps' in node && 'name' in node) {\n const { children, ...rest } = node.initialProps || {}\n const childArray = Array.isArray(children) ? children : children ? [children] : []\n const convertedChildren = childArray\n .filter((c: any) => c)\n .map((c: any) => this.nodeToDescriptor(c))\n .filter((c: any): c is CanvasElement => !!c)\n\n const name = node.name as string\n const type =\n name === 'TextNode'\n ? 'Text'\n : name === 'Row'\n ? 'Row'\n : name === 'Image'\n ? 'Image'\n : rest.flexDirection === Style.FlexDirection.Column\n ? 'Column'\n : 'Box'\n if (type === 'Text') {\n // TextNode stores original text in segments — fall back to joined segment text\n const text = node.segments?.map((s: any) => s.text).join('') ?? ''\n return { __type: 'Text', text, props: rest } as CanvasElement\n }\n if (type === 'Image') {\n return { __type: 'Image', props: rest } as CanvasElement\n }\n return {\n __type: type,\n props: rest,\n ...(convertedChildren.length > 0 ? { children: convertedChildren } : {}),\n } as CanvasElement\n }\n console.warn('[WorkerPreProcessor] Render function returned an unrecognized class instance. Use descriptor functions (Box(), Text(), etc.) instead.')\n return null\n }\n return node\n }\n\n private static generateColor(index: number): string {\n return this.CHART_COLORS[index % this.CHART_COLORS.length]\n }\n\n static stripNonSerializable<T>(obj: T): T {\n if (obj === null || obj === undefined) return obj\n if (typeof obj === 'function') return undefined as unknown as T\n if (typeof obj === 'symbol') return undefined as unknown as T\n if (typeof obj !== 'object') return obj\n\n // Preserve binary data types\n if (Buffer.isBuffer(obj)) return obj\n if (obj instanceof ArrayBuffer) return obj\n if (ArrayBuffer.isView(obj)) return obj\n\n if (Array.isArray(obj)) {\n return obj.map(item => this.stripNonSerializable(item)) as unknown as T\n }\n\n const result: Record<string, unknown> = {}\n for (const key of Object.keys(obj as Record<string, unknown>)) {\n const value = (obj as Record<string, unknown>)[key]\n if (typeof value === 'function' || typeof value === 'symbol') continue\n result[key] = this.stripNonSerializable(value)\n }\n return result as T\n }\n}\n"],"names":["YogaTypes","Style"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAKO,MAAM,WAAW,GAAG,CAAC,EAC1B,GAAG,EACH,IAAI,EACJ,CAAC,EACD,CAAC,EACD,KAAK,EACL,MAAM,EACN,KAAK,EACL,WAAW,EACX,WAAW,GAgBZ,KAAI;AACH,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAACA,oBAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAACA,oBAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;IAC9E,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAACA,oBAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC;IAClF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAACA,oBAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;IACpF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAACA,oBAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;AAEhF,IAAA,MAAM,SAAS,GAAG,SAAS,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC;AACxF,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;AAErC,IAAA,IAAI,SAAS,IAAI,WAAW,EAAE;AAC5B,QAAA,GAAG,CAAC,WAAW,GAAG,WAAW;AAC7B,QAAA,GAAG,CAAC,OAAO,GAAG,MAAM;AACpB,QAAA,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAA;AAEtB,QAAA,MAAM,OAAO,GAAG,CAAC,KAAa,KAAI;AAChC,YAAA,IAAI,WAAW,KAAKC,kBAAK,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,EAAE;;AAEpD,gBAAA,GAAG,CAAC,OAAO,GAAG,OAAO;AACrB,gBAAA,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAA;YACjC;AAAO,iBAAA,IAAI,WAAW,KAAKA,kBAAK,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,EAAE;AAC3D,gBAAA,GAAG,CAAC,OAAO,GAAG,MAAM;AACpB,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC;gBAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC;gBACpC,GAAG,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAC1C;iBAAO;AACL,gBAAA,GAAG,CAAC,OAAO,GAAG,MAAM;AACpB,gBAAA,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;YACrB;AACF,QAAA,CAAC;AAED;;;;;;;;;AASG;AACH,QAAA,MAAM,aAAa,GAAG,CAAC,EAAU,EAAE,EAAU,EAAE,MAAc,EAAE,UAAkB,EAAE,QAAgB,EAAE,OAAe,EAAE,OAAe,KAAI;YACvI,IAAI,MAAM,IAAI,CAAC;gBAAE;YAEjB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC;YAC9C,IAAI,WAAW,IAAI,CAAC;gBAAE;AAEtB,YAAA,IAAI,mBAA2B;YAE/B,IAAI,SAAS,KAAKA,kBAAK,CAAC,SAAS,CAAC,UAAU,EAAE;;AAE5C,gBAAA,mBAAmB,GAAG,MAAM,GAAG,WAAW,GAAG,CAAC;YAChD;iBAAO;;;AAGL,gBAAA,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,CAAC,CAAC;gBAE3D,IAAI,mBAAmB,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE;;AAE1C,oBAAA,GAAG,CAAC,SAAS,GAAG,WAAY,CAAA;oBAC5B,GAAG,CAAC,SAAS,EAAE;;AAEf,oBAAA,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;oBACvC,GAAG,CAAC,IAAI,EAAE;AACV,oBAAA,OAAM;gBACR;YACF;;YAEA,GAAG,CAAC,SAAS,EAAE;AACf,YAAA,GAAG,CAAC,SAAS,GAAG,WAAW;YAC3B,OAAO,CAAC,WAAW,CAAC;AACpB,YAAA,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,mBAAmB,EAAE,UAAU,EAAE,QAAQ,CAAC;YAC1D,GAAG,CAAC,MAAM,EAAE;AACd,QAAA,CAAC;AAED;;;;;;;AAOG;AACH,QAAA,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,WAAmB,KAAI;YACvF,IAAI,WAAW,IAAI,CAAC;gBAAE;YACtB,GAAG,CAAC,SAAS,EAAE;AACf,YAAA,GAAG,CAAC,SAAS,GAAG,WAAW;YAC3B,OAAO,CAAC,WAAW,CAAC;AACpB,YAAA,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC;AAClB,YAAA,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC;YAClB,GAAG,CAAC,MAAM,EAAE;AACd,QAAA,CAAC;;AAGD,QAAA,MAAM,MAAM,GAAG,SAAS,GAAG,CAAC;AAC5B,QAAA,MAAM,MAAM,GAAG,WAAW,GAAG,CAAC;AAC9B,QAAA,MAAM,MAAM,GAAG,YAAY,GAAG,CAAC;AAC/B,QAAA,MAAM,MAAM,GAAG,UAAU,GAAG,CAAC;;AAG7B,QAAA,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAA;AAC5B,QAAA,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QACzE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;;;QAI3E,IAAI,SAAS,KAAKA,kBAAK,CAAC,SAAS,CAAC,UAAU,EAAE;;YAE5C,KAAK,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,KAAK,GAAG,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,SAAS,CAAC;;YAE1E,KAAK,QAAQ,CAAC,CAAC,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,GAAG,EAAE,WAAW,CAAC;;YAE7F,KAAK,QAAQ,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE,YAAY,CAAC;;YAE/F,KAAK,QAAQ,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,UAAU,CAAC;YAE5E,KAAK,aAAa,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC;AACxF,YAAA,KAAK,aAAa,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC;AACrG,YAAA,KAAK,aAAa,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,YAAY,CAAC;AACvG,YAAA,KAAK,aAAa,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,UAAU,CAAC;QACtG;aAAO;;;YAGL,KAAK,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,KAAK,GAAG,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,SAAS,CAAC;;YAE1E,KAAK,QAAQ,CAAC,CAAC,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,GAAG,EAAE,WAAW,CAAC;;YAE7F,KAAK,QAAQ,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE,YAAY,CAAC;;YAE/F,KAAK,QAAQ,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,UAAU,CAAC;;;AAI5E,YAAA,KAAK,aAAa,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC,CAAA;AACxF,YAAA,KAAK,aAAa,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;AACrG,YAAA,KAAK,aAAa,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,YAAY,CAAC,CAAA;AACvG,YAAA,KAAK,aAAa,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,UAAU,CAAC,CAAA;QACtG;IACF;AACF;AAEA;;;;;;;;;;AAUG;AACI,MAAM,mBAAmB,GAAG,CACjC,GAA6B,EAC7B,CAAS,EACT,CAAS,EACT,KAAa,EACb,MAAc,EACd,KAAqF,KACnF;IACF,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE;QAC7B,GAAG,CAAC,SAAS,EAAE;QACf,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC;QAC7B;IACF;IAEA,GAAG,CAAC,SAAS,EAAE;;AAGf,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;AACjD,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACjE,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAClE,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AACrE,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAEpE,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC;;IAG5B,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC,CAAC;AACpC,IAAA,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC,GAAG,SAAS,EAAE,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;;AAGrH,IAAA,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC;IAC7C,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC,GAAG,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC;;IAGvI,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,MAAM,CAAC;IACrC,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;;IAG7H,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;AAC5B,IAAA,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAE3G,GAAG,CAAC,SAAS,EAAE;AACjB;AAEA;;;;AAIG;AACI,MAAM,iBAAiB,GAAG,CAC/B,UAAoC,KAMlC;AACF,IAAA,MAAM,KAAK,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;AACxE,IAAA,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;QAClC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC;IACjG;SAAO,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE;AAChE,QAAA,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;AACpD,QAAA,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC;AACtD,QAAA,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC;AAC5D,QAAA,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,UAAU,IAAI,CAAC,CAAC;IAC5D;AACA,IAAA,OAAO,KAAK;AACd;AAEA;;;;;AAKG;AACG,SAAU,eAAe,CAAC,KAAkC,EAAE,IAAY,EAAA;AAC9E,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QACpD,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,IAAI,GAAG,CAAC;IAC1D;AACA,IAAA,OAAO,CAAC;AACV;AAEA;;;;AAIG;MACU,kBAAkB,CAAA;AACrB,IAAA,OAAgB,YAAY,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;IAEpH,OAAO,OAAO,CAAC,KAAgB,EAAA;AAC7B,QAAA,MAAM,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE;AAC3B,QAAA,IAAI,MAAM,CAAC,QAAQ,EAAE;YACnB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,QAAQ,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;YACvF,MAAM,CAAC,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,IAAG;gBACvC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,IAAI,KAAK,EAAE;AAC3D,oBAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAsB,CAAC;gBACvD;AACA,gBAAA,OAAO,KAAK;AACd,YAAA,CAAC,CAAQ;QACX;AACA,QAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;IAC1C;IAEQ,OAAO,iBAAiB,CAAC,IAAmB,EAAA;AAClD,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE;AAC3B,YAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC;QAC1C;QAEA,IAAI,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE;YACvC,OAAO,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAmB;QAClG;AAEA,QAAA,OAAO,IAAI;IACb;IAEQ,OAAO,sBAAsB,CAAC,IAAyC,EAAA;QAC7E,MAAM,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE;AAC/B,QAAA,MAAM,OAAO,GAAG,EAAE,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAyB;AACnE,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,IAAiB;AACzC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAW;;AAG9B,QAAA,IAAI,OAAO,OAAO,CAAC,mBAAmB,KAAK,UAAU,KAAK,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,MAAM,CAAC,EAAE;YACtG,MAAM,QAAQ,GAAG,IAA0B;AAC3C,YAAA,IAAI,QAAQ,CAAC,MAAM,EAAE;AACnB,gBAAA,OAAO,CAAC,uBAAuB,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAa,EAAE,KAAa,KAAI;AACrF,oBAAA,IAAI;wBACF,OAAO,OAAO,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC;oBAClD;oBAAE,OAAO,GAAG,EAAE;wBACZ,OAAO,CAAC,IAAI,CAAC,CAAA,0DAAA,EAA6D,KAAK,CAAA,WAAA,EAAc,KAAK,CAAA,CAAA,CAAG,EAAE,GAAG,CAAC;AAC3G,wBAAA,OAAO,KAAK;oBACd;AACF,gBAAA,CAAC,CAAC;YACJ;YACA,OAAO,OAAO,CAAC,mBAAmB;QACpC;;AAGA,QAAA,IAAI,OAAO,OAAO,CAAC,mBAAmB,KAAK,UAAU,KAAK,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,MAAM,CAAC,EAAE;YACtG,MAAM,QAAQ,GAAG,IAA0B;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAe,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;YACpF,MAAM,MAAM,GAAa,EAAE;AAC3B,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC3B,MAAM,KAAK,GAAG,QAAQ,GAAG,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC;AAC3C,gBAAA,IAAI;oBACF,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBACjD;gBAAE,OAAO,GAAG,EAAE;oBACZ,OAAO,CAAC,IAAI,CAAC,CAAA,yDAAA,EAA4D,KAAK,CAAA,CAAA,CAAG,EAAE,GAAG,CAAC;oBACvF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5B;YACF;AACA,YAAA,OAAO,CAAC,uBAAuB,GAAG,MAAM;YACxC,OAAO,OAAO,CAAC,mBAAmB;QACpC;;AAGA,QAAA,IAAI,OAAO,OAAO,CAAC,gBAAgB,KAAK,UAAU,EAAE;YAClD,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,MAAM,EAAE;gBAC/C,MAAM,QAAQ,GAAG,IAA0B;AAC3C,gBAAA,OAAO,CAAC,uBAAuB,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAkB,EAAE,KAAa,KAAI;AAC5F,oBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AACrD,oBAAA,IAAI;AACF,wBAAA,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC/D,wBAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;oBACtC;oBAAE,OAAO,GAAG,EAAE;wBACZ,OAAO,CAAC,IAAI,CAAC,CAAA,qDAAA,EAAwD,KAAK,CAAA,CAAA,CAAG,EAAE,GAAG,CAAC;AACnF,wBAAA,OAAO,IAAI;oBACb;AACF,gBAAA,CAAC,CAAC;YACJ;iBAAO;gBACL,MAAM,OAAO,GAAG,IAA2B;AAC3C,gBAAA,OAAO,CAAC,uBAAuB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAuB,EAAE,KAAa,KAAI;AACvF,oBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AACrD,oBAAA,IAAI;AACF,wBAAA,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC/D,wBAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;oBACtC;oBAAE,OAAO,GAAG,EAAE;wBACZ,OAAO,CAAC,IAAI,CAAC,CAAA,qDAAA,EAAwD,KAAK,CAAA,CAAA,CAAG,EAAE,GAAG,CAAC;AACnF,wBAAA,OAAO,IAAI;oBACb;AACF,gBAAA,CAAC,CAAC;YACJ;YACA,OAAO,OAAO,CAAC,gBAAgB;QACjC;;AAGA,QAAA,IAAI,OAAO,OAAO,CAAC,eAAe,KAAK,UAAU,EAAE;YACjD,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,MAAM,EAAE;gBAC/C,MAAM,QAAQ,GAAG,IAA0B;AAC3C,gBAAA,OAAO,CAAC,sBAAsB,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAa,EAAE,KAAa,KAAI;AACpF,oBAAA,IAAI;AACF,wBAAA,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC9D,wBAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;oBACtC;oBAAE,OAAO,GAAG,EAAE;wBACZ,OAAO,CAAC,IAAI,CAAC,CAAA,oDAAA,EAAuD,KAAK,CAAA,CAAA,CAAG,EAAE,GAAG,CAAC;AAClF,wBAAA,OAAO,IAAI;oBACb;AACF,gBAAA,CAAC,CAAC;YACJ;iBAAO;gBACL,MAAM,OAAO,GAAG,IAA2B;AAC3C,gBAAA,OAAO,CAAC,sBAAsB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAuB,EAAE,KAAa,KAAI;AACtF,oBAAA,IAAI;AACF,wBAAA,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACvD,wBAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;oBACtC;oBAAE,OAAO,GAAG,EAAE;wBACZ,OAAO,CAAC,IAAI,CAAC,CAAA,oDAAA,EAAuD,KAAK,CAAA,CAAA,CAAG,EAAE,GAAG,CAAC;AAClF,wBAAA,OAAO,IAAI;oBACb;AACF,gBAAA,CAAC,CAAC;YACJ;YACA,OAAO,OAAO,CAAC,eAAe;QAChC;;AAGA,QAAA,IAAI,OAAO,OAAO,CAAC,eAAe,KAAK,UAAU,KAAK,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,MAAM,CAAC,EAAE;YAClG,MAAM,QAAQ,GAAG,IAA0B;YAC3C,OAAO,CAAC,sBAAsB,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAqB,EAAE,YAAoB,KACjG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAa,EAAE,KAAa,KAAI;AAChD,gBAAA,IAAI;AACF,oBAAA,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;AAC5E,oBAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;gBACtC;gBAAE,OAAO,GAAG,EAAE;oBACZ,OAAO,CAAC,IAAI,CAAC,CAAA,sDAAA,EAAyD,YAAY,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA,CAAG,EAAE,GAAG,CAAC;AAC3G,oBAAA,OAAO,IAAI;gBACb;YACF,CAAC,CAAC,CACH;YACD,OAAO,OAAO,CAAC,eAAe;QAChC;AAEA,QAAA,KAAK,CAAC,OAAO,GAAG,OAAO;AACvB,QAAA,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAmB;IAC5C;AAEA;;;;AAIG;IACK,OAAO,gBAAgB,CAAC,IAAS,EAAA;AACvC,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,IAAI;;AAEtB,QAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,QAAQ,IAAI,IAAI;AAAE,YAAA,OAAO,IAAqB;;QAE9E,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,KAAK,MAAM,EAAE;YAC3D,IAAI,cAAc,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE;AAC5C,gBAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE;gBACrD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,QAAQ,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;gBAClF,MAAM,iBAAiB,GAAG;AACvB,qBAAA,MAAM,CAAC,CAAC,CAAM,KAAK,CAAC;AACpB,qBAAA,GAAG,CAAC,CAAC,CAAM,KAAK,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;qBACxC,MAAM,CAAC,CAAC,CAAM,KAAyB,CAAC,CAAC,CAAC,CAAC;AAE9C,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAc;AAChC,gBAAA,MAAM,IAAI,GACR,IAAI,KAAK;AACP,sBAAE;sBACA,IAAI,KAAK;AACT,0BAAE;0BACA,IAAI,KAAK;AACT,8BAAE;8BACA,IAAI,CAAC,aAAa,KAAKA,kBAAK,CAAC,aAAa,CAAC;AAC3C,kCAAE;kCACA,KAAK;AACjB,gBAAA,IAAI,IAAI,KAAK,MAAM,EAAE;;oBAEnB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;oBAClE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAmB;gBAC/D;AACA,gBAAA,IAAI,IAAI,KAAK,OAAO,EAAE;oBACpB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAmB;gBAC1D;gBACA,OAAO;AACL,oBAAA,MAAM,EAAE,IAAI;AACZ,oBAAA,KAAK,EAAE,IAAI;AACX,oBAAA,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC;iBACxD;YACpB;AACA,YAAA,OAAO,CAAC,IAAI,CAAC,uIAAuI,CAAC;AACrJ,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,IAAI;IACb;IAEQ,OAAO,aAAa,CAAC,KAAa,EAAA;AACxC,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;IAC5D;IAEA,OAAO,oBAAoB,CAAI,GAAM,EAAA;AACnC,QAAA,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;AAAE,YAAA,OAAO,GAAG;QACjD,IAAI,OAAO,GAAG,KAAK,UAAU;AAAE,YAAA,OAAO,SAAyB;QAC/D,IAAI,OAAO,GAAG,KAAK,QAAQ;AAAE,YAAA,OAAO,SAAyB;QAC7D,IAAI,OAAO,GAAG,KAAK,QAAQ;AAAE,YAAA,OAAO,GAAG;;AAGvC,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,GAAG;QACpC,IAAI,GAAG,YAAY,WAAW;AAAE,YAAA,OAAO,GAAG;AAC1C,QAAA,IAAI,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,GAAG;AAEvC,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AACtB,YAAA,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAiB;QACzE;QAEA,MAAM,MAAM,GAA4B,EAAE;QAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAA8B,CAAC,EAAE;AAC7D,YAAA,MAAM,KAAK,GAAI,GAA+B,CAAC,GAAG,CAAC;YACnD,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE;YAC9D,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;QAChD;AACA,QAAA,OAAO,MAAW;IACpB;;;;;;;;;"}
@@ -1,32 +1,32 @@
1
1
  'use strict';
2
2
 
3
- var layout_canvas_util = require('./layout.canvas.util.js');
3
+ var layout_canvas = require('./layout.canvas.js');
4
4
  var common_const = require('../constant/common.const.js');
5
- var text_canvas_util = require('./text.canvas.util.js');
6
- var image_canvas_util = require('./image.canvas.util.js');
5
+ var text_canvas = require('./text.canvas.js');
6
+ var image_canvas = require('./image.canvas.js');
7
7
 
8
8
  /**
9
9
  * Local buildTree for pre-computed render function results.
10
10
  * Handles only node types that render functions would return (Box, Column, Row, Text, Image).
11
- * Avoids circular dependency with root.canvas.util.ts.
11
+ * Avoids circular dependency with root.canvas.ts.
12
12
  */
13
13
  function buildDescriptorTree(descriptor) {
14
14
  switch (descriptor.__type) {
15
15
  case 'Box':
16
- return new layout_canvas_util.BoxNode({ ...descriptor.props, children: descriptor.children?.map(buildDescriptorTree) });
16
+ return new layout_canvas.BoxNode({ ...descriptor.props, children: descriptor.children?.map(buildDescriptorTree) });
17
17
  case 'Column':
18
- return new layout_canvas_util.ColumnNode({ ...descriptor.props, children: descriptor.children?.map(buildDescriptorTree) });
18
+ return new layout_canvas.ColumnNode({ ...descriptor.props, children: descriptor.children?.map(buildDescriptorTree) });
19
19
  case 'Row':
20
- return new layout_canvas_util.RowNode({ ...descriptor.props, children: descriptor.children?.map(buildDescriptorTree) });
20
+ return new layout_canvas.RowNode({ ...descriptor.props, children: descriptor.children?.map(buildDescriptorTree) });
21
21
  case 'Image':
22
- return new image_canvas_util.ImageNode(descriptor.props);
22
+ return new image_canvas.ImageNode(descriptor.props);
23
23
  case 'Text':
24
- return new text_canvas_util.TextNode(descriptor.text, descriptor.props);
24
+ return new text_canvas.TextNode(descriptor.text, descriptor.props);
25
25
  default:
26
- return new layout_canvas_util.BoxNode({});
26
+ return new layout_canvas.BoxNode({});
27
27
  }
28
28
  }
29
- class ChartNode extends layout_canvas_util.BoxNode {
29
+ class ChartNode extends layout_canvas.BoxNode {
30
30
  chartData;
31
31
  chartType;
32
32
  chartOptions;
@@ -265,7 +265,7 @@ class ChartNode extends layout_canvas_util.BoxNode {
265
265
  const value = maxValue - (maxValue / 5) * i;
266
266
  const label = chartOptions._preComputedYAxisLabels?.[i] ??
267
267
  (chartOptions.yAxisLabelFormatter ? chartOptions.yAxisLabelFormatter(value) : this.getSmartYAxisFormatter(maxValue)(value));
268
- text_canvas_util.TextNode.renderSimpleText(ctx, label, chartX - 5, gridY, {
268
+ text_canvas.TextNode.renderSimpleText(ctx, label, chartX - 5, gridY, {
269
269
  color: chartOptions.yAxisColor || chartOptions.axisColor || '#000',
270
270
  fontSize: chartOptions.yAxisFontSize || 12,
271
271
  fontFamily: this.props.fontFamily,
@@ -308,7 +308,7 @@ class ChartNode extends layout_canvas_util.BoxNode {
308
308
  }
309
309
  }
310
310
  else {
311
- text_canvas_util.TextNode.renderSimpleText(ctx, value.toString(), valueX, valueY, {
311
+ text_canvas.TextNode.renderSimpleText(ctx, value.toString(), valueX, valueY, {
312
312
  color: chartOptions.valueColor || '#000',
313
313
  fontSize: chartOptions.valueFontSize || 12,
314
314
  fontFamily: this.props.fontFamily,
@@ -339,7 +339,7 @@ class ChartNode extends layout_canvas_util.BoxNode {
339
339
  }
340
340
  }
341
341
  else {
342
- text_canvas_util.TextNode.renderSimpleText(ctx, displayLabel, groupX + (groupWidth - barSpacing) / 2, chartY + finalChartHeight + labelHeight / 2, {
342
+ text_canvas.TextNode.renderSimpleText(ctx, displayLabel, groupX + (groupWidth - barSpacing) / 2, chartY + finalChartHeight + labelHeight / 2, {
343
343
  color: chartOptions.labelColor || chartOptions.axisColor,
344
344
  fontSize: chartOptions.labelFontSize,
345
345
  fontFamily: this.props.fontFamily,
@@ -404,7 +404,7 @@ class ChartNode extends layout_canvas_util.BoxNode {
404
404
  const value = maxValue - (maxValue / 5) * i;
405
405
  const label = chartOptions._preComputedYAxisLabels?.[i] ??
406
406
  (chartOptions.yAxisLabelFormatter ? chartOptions.yAxisLabelFormatter(value) : this.getSmartYAxisFormatter(maxValue)(value));
407
- text_canvas_util.TextNode.renderSimpleText(ctx, label, chartX - 5, gridY, {
407
+ text_canvas.TextNode.renderSimpleText(ctx, label, chartX - 5, gridY, {
408
408
  color: chartOptions.yAxisColor || chartOptions.axisColor || '#000',
409
409
  fontSize: chartOptions.yAxisFontSize || 12,
410
410
  fontFamily: this.props.fontFamily,
@@ -464,7 +464,7 @@ class ChartNode extends layout_canvas_util.BoxNode {
464
464
  }
465
465
  }
466
466
  else {
467
- text_canvas_util.TextNode.renderSimpleText(ctx, displayLabel, pointX, chartY + finalChartHeight + labelHeight / 2, {
467
+ text_canvas.TextNode.renderSimpleText(ctx, displayLabel, pointX, chartY + finalChartHeight + labelHeight / 2, {
468
468
  color: chartOptions.labelColor || chartOptions.axisColor,
469
469
  fontSize: chartOptions.labelFontSize,
470
470
  fontFamily: this.props.fontFamily,
@@ -531,7 +531,7 @@ class ChartNode extends layout_canvas_util.BoxNode {
531
531
  }
532
532
  }
533
533
  else {
534
- text_canvas_util.TextNode.renderSimpleText(ctx, point.label, labelX, labelY, {
534
+ text_canvas.TextNode.renderSimpleText(ctx, point.label, labelX, labelY, {
535
535
  color: chartOptions.labelColor,
536
536
  fontSize: chartOptions.labelFontSize,
537
537
  fontFamily: this.props.fontFamily,
@@ -599,7 +599,7 @@ class ChartNode extends layout_canvas_util.BoxNode {
599
599
  }
600
600
  }
601
601
  else {
602
- text_canvas_util.TextNode.renderSimpleText(ctx, point.label, labelX, labelY, {
602
+ text_canvas.TextNode.renderSimpleText(ctx, point.label, labelX, labelY, {
603
603
  color: chartOptions.labelColor,
604
604
  fontSize: chartOptions.labelFontSize,
605
605
  fontFamily: this.props.fontFamily,
@@ -619,7 +619,7 @@ class ChartNode extends layout_canvas_util.BoxNode {
619
619
  if (_preComputedLegendItems) {
620
620
  const finalNodes = _preComputedLegendItems.filter((desc) => !!desc).map(desc => buildDescriptorTree(desc));
621
621
  if (finalNodes.length > 0) {
622
- const legendContainer = new layout_canvas_util.RowNode({
622
+ const legendContainer = new layout_canvas.RowNode({
623
623
  children: finalNodes,
624
624
  width,
625
625
  height,
@@ -654,7 +654,7 @@ class ChartNode extends layout_canvas_util.BoxNode {
654
654
  }
655
655
  const finalNodes = legendNodes.filter((node) => !!node);
656
656
  if (finalNodes.length > 0) {
657
- const legendContainer = new layout_canvas_util.RowNode({
657
+ const legendContainer = new layout_canvas.RowNode({
658
658
  children: finalNodes,
659
659
  width,
660
660
  height,
@@ -704,7 +704,7 @@ class ChartNode extends layout_canvas_util.BoxNode {
704
704
  const boxY = currentY + (itemHeight - boxSize) / 2;
705
705
  ctx.fillStyle = item.color;
706
706
  ctx.fillRect(currentX, boxY, boxSize, boxSize);
707
- text_canvas_util.TextNode.renderSimpleText(ctx, item.label, currentX + boxSize + 5, currentY + itemHeight / 2, {
707
+ text_canvas.TextNode.renderSimpleText(ctx, item.label, currentX + boxSize + 5, currentY + itemHeight / 2, {
708
708
  color: this.chartOptions?.labelColor,
709
709
  fontSize,
710
710
  fontFamily: this.props.fontFamily,
@@ -728,7 +728,7 @@ class ChartNode extends layout_canvas_util.BoxNode {
728
728
  ('datasets' in this.chartData ? this.chartData.datasets[index].color : point.color) || this.generateColor(index);
729
729
  ctx.fillRect(itemX, boxY, boxSize, boxSize);
730
730
  const label = 'datasets' in this.chartData ? point.label : `${point.label} (${point.value})`;
731
- text_canvas_util.TextNode.renderSimpleText(ctx, label, itemX + boxSize + 5, itemY + itemHeight / 2, {
731
+ text_canvas.TextNode.renderSimpleText(ctx, label, itemX + boxSize + 5, itemY + itemHeight / 2, {
732
732
  color: this.chartOptions?.labelColor,
733
733
  fontSize,
734
734
  fontFamily: this.props.fontFamily,
@@ -750,4 +750,4 @@ const Chart = (props) => ({
750
750
 
751
751
  exports.Chart = Chart;
752
752
  exports.ChartNode = ChartNode;
753
- //# sourceMappingURL=chart.canvas.util.js.map
753
+ //# sourceMappingURL=chart.canvas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart.canvas.js","sources":["../../../../../src/canvas/chart.canvas.ts"],"sourcesContent":["import { BoxNode, ColumnNode, RowNode } from '@/canvas/layout.canvas.js'\nimport type {\n BaseProps,\n CartesianChartData,\n ChartDataset,\n ChartProps,\n ChartType,\n PieChartDataPoint,\n CanvasElement,\n PreComputedChartOptions,\n} from '@/canvas/canvas.type.js'\nimport type { CanvasRenderingContext2D } from 'skia-canvas'\nimport { Style } from '@/constant/common.const.js'\nimport { TextNode } from '@/canvas/text.canvas.js'\nimport { ImageNode } from '@/canvas/image.canvas.js'\n\n/**\n * Local buildTree for pre-computed render function results.\n * Handles only node types that render functions would return (Box, Column, Row, Text, Image).\n * Avoids circular dependency with root.canvas.ts.\n */\nfunction buildDescriptorTree(descriptor: CanvasElement): BoxNode {\n switch (descriptor.__type) {\n case 'Box':\n return new BoxNode({ ...descriptor.props, children: descriptor.children?.map(buildDescriptorTree) })\n case 'Column':\n return new ColumnNode({ ...descriptor.props, children: descriptor.children?.map(buildDescriptorTree) })\n case 'Row':\n return new RowNode({ ...descriptor.props, children: descriptor.children?.map(buildDescriptorTree) })\n case 'Image':\n return new ImageNode(descriptor.props as any)\n case 'Text':\n return new TextNode(descriptor.text, descriptor.props)\n default:\n return new BoxNode({})\n }\n}\n\nexport class ChartNode<T extends ChartType> extends BoxNode {\n private chartData: CartesianChartData | PieChartDataPoint[]\n private chartType: ChartProps<T>['type']\n private chartOptions: ChartProps<T>['options'] & PreComputedChartOptions\n\n constructor(props: ChartProps<T> & BaseProps) {\n // Set default intrinsic size if not provided\n const defaultWidth = props.width ?? 400\n const defaultHeight = props.height ?? 300\n\n super({\n ...props,\n width: defaultWidth,\n height: defaultHeight,\n name: 'Chart',\n })\n\n this.chartData = props.data\n this.chartType = props.type\n this.chartOptions = {\n showLabels: true,\n showLegend: true,\n labelFontSize: 12,\n legendPosition: 'bottom',\n ...props.options,\n } as ChartProps<T>['options'] & PreComputedChartOptions\n\n this.validateProps()\n }\n\n private validateProps() {\n if (this.chartType === 'bar' || this.chartType === 'line') {\n const data = this.chartData as CartesianChartData\n if (!data.labels || !data.datasets) {\n console.warn(`[ChartNode] Warning: Cartesian chart (${this.chartType}) is missing 'labels' or 'datasets' in its data prop.`)\n }\n data.datasets?.forEach((dataset, i) => {\n if (dataset.data.length !== data.labels.length) {\n console.warn(\n `[ChartNode] Warning: In dataset ${i} (\"${dataset.label}\"), the number of data points (${dataset.data.length}) does not match the number of labels (${data.labels.length}).`,\n )\n }\n })\n } else if (this.chartType === 'pie' || this.chartType === 'doughnut') {\n const data = this.chartData as PieChartDataPoint[]\n if (!Array.isArray(data)) {\n console.warn(`[ChartNode] Warning: ${this.chartType} chart expects an array of PieChartDataPoint, but received a different type.`)\n }\n }\n }\n\n protected _renderContent(ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number) {\n // First render background/borders from parent\n super._renderContent(ctx, x, y, width, height)\n\n // Then render chart-specific content\n const paddingLeft = this.node.getComputedPadding(Style.Edge.Left)\n const paddingRight = this.node.getComputedPadding(Style.Edge.Right)\n const paddingTop = this.node.getComputedPadding(Style.Edge.Top)\n const paddingBottom = this.node.getComputedPadding(Style.Edge.Bottom)\n const contentX = x + paddingLeft\n const contentY = y + paddingTop\n const contentWidth = width - paddingLeft - paddingRight\n const contentHeight = height - paddingTop - paddingBottom\n\n switch (this.chartType) {\n case 'bar':\n this.renderBarChart(ctx, contentX, contentY, contentWidth, contentHeight)\n break\n case 'line':\n this.renderLineChart(ctx, contentX, contentY, contentWidth, contentHeight)\n break\n case 'pie':\n this.renderPieChart(ctx, contentX, contentY, contentWidth, contentHeight)\n break\n case 'doughnut':\n this.renderDoughnutChart(ctx, contentX, contentY, contentWidth, contentHeight)\n break\n }\n }\n\n private getSmartYAxisFormatter(maxValue: number): (v: number) => string {\n const absMax = Math.abs(maxValue)\n\n // Thresholds with corresponding decimal places, divisors, and suffixes\n const thresholds = [\n { min: 1000000, decimals: 1, divisor: 1000000, suffix: 'M' },\n { min: 1000, decimals: 0, divisor: 1, suffix: '' },\n { min: 100, decimals: 1, divisor: 1, suffix: '' },\n { min: 1, decimals: 2, divisor: 1, suffix: '' },\n { min: 0, decimals: 4, divisor: 1, suffix: '' },\n ]\n\n let config = thresholds[thresholds.length - 1]\n for (const threshold of thresholds) {\n if (absMax >= threshold.min) {\n config = threshold\n break\n }\n }\n\n return (v: number) => {\n const scaled = v / config.divisor\n const factor = Math.pow(10, config.decimals)\n const rounded = Math.round(scaled * factor) / factor\n return rounded.toString() + config.suffix\n }\n }\n\n private getLegendLayout(ctx: CanvasRenderingContext2D, totalWidth: number, totalHeight: number) {\n if (!this.chartOptions?.showLegend) {\n return { x: 0, y: 0, width: 0, height: 0, chartWidth: totalWidth, chartHeight: totalHeight, chartX: 0, chartY: 0 }\n }\n\n const legendItems = 'datasets' in this.chartData ? this.chartData.datasets : (this.chartData as PieChartDataPoint[])\n if (legendItems.length === 0) {\n return { x: 0, y: 0, width: 0, height: 0, chartWidth: totalWidth, chartHeight: totalHeight, chartX: 0, chartY: 0 }\n }\n\n const fontSize = this.chartOptions?.labelFontSize || 12\n ctx.font = `${fontSize}px ${this.props.fontFamily || 'sans-serif'}`\n const metrics = ctx.measureText('Mg')\n const textHeight = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent\n const itemHeight = Math.ceil(textHeight + 8)\n const position = this.chartOptions.legendPosition\n const boxSize = Math.min(15, itemHeight - 2)\n\n const legendItemLabels =\n 'datasets' in this.chartData ? this.chartData.datasets.map(d => d.label) : (this.chartData as PieChartDataPoint[]).map(p => `${p.label} (${p.value})`)\n\n let calculatedLegendHeight: number\n let calculatedLegendWidth: number\n\n if (position === 'top' || position === 'bottom') {\n let currentX = 0\n let numRows = 1\n const itemPadding = 20\n legendItemLabels.forEach(label => {\n const labelWidth = ctx.measureText(label).width\n const itemWidth = boxSize + 5 + labelWidth + itemPadding\n\n if (currentX > 0 && currentX + itemWidth > totalWidth) {\n numRows++\n currentX = 0\n }\n currentX += itemWidth\n })\n calculatedLegendHeight = numRows * itemHeight + 10\n calculatedLegendWidth = totalWidth\n } else {\n // 'left' or 'right'\n const maxLabelWidth = Math.max(...legendItemLabels.map(label => ctx.measureText(label).width))\n calculatedLegendWidth = maxLabelWidth + boxSize + 25 // padding + box + padding + text\n calculatedLegendHeight = totalHeight\n }\n\n let effectiveChartWidth = totalWidth\n let effectiveChartHeight = totalHeight\n let legendAreaX: number\n let legendAreaY: number\n let chartAreaX: number\n let chartAreaY: number\n let legendAreaWidth: number\n let legendAreaHeight: number\n\n if (position === 'top' || position === 'bottom') {\n effectiveChartHeight -= calculatedLegendHeight\n legendAreaHeight = calculatedLegendHeight\n legendAreaWidth = totalWidth\n legendAreaX = 0\n chartAreaX = 0\n\n if (position === 'top') {\n chartAreaY = calculatedLegendHeight\n legendAreaY = 0\n } else {\n // bottom\n legendAreaY = effectiveChartHeight\n chartAreaY = 0\n }\n } else {\n // 'left' or 'right'\n effectiveChartWidth -= calculatedLegendWidth\n legendAreaWidth = calculatedLegendWidth\n legendAreaHeight = totalHeight\n legendAreaY = 0\n chartAreaY = 0\n\n if (position === 'left') {\n chartAreaX = calculatedLegendWidth\n legendAreaX = 0\n } else {\n // right\n legendAreaX = effectiveChartWidth\n chartAreaX = 0\n }\n }\n\n return {\n x: legendAreaX,\n y: legendAreaY,\n width: legendAreaWidth,\n height: legendAreaHeight,\n chartWidth: effectiveChartWidth,\n chartHeight: effectiveChartHeight,\n chartX: chartAreaX,\n chartY: chartAreaY,\n }\n }\n\n private renderBarChart(ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number) {\n if (this.chartType !== 'bar') return\n const chartData = this.chartData as CartesianChartData\n const chartOptions = this.chartOptions as ChartProps<'bar'>['options'] & PreComputedChartOptions\n\n const { labels, datasets } = chartData\n const maxValue = Math.max(...datasets.flatMap(d => d.data))\n\n const legendLayout = this.getLegendLayout(ctx, width, height)\n let chartX = x + legendLayout.chartX\n const chartY = y + legendLayout.chartY\n let chartWidth = legendLayout.chartWidth\n const chartHeight = legendLayout.chartHeight\n\n if (chartOptions?.showYAxis) {\n const fontSize = chartOptions.yAxisFontSize || 12\n ctx.font = `${fontSize}px ${this.props.fontFamily || 'sans-serif'}`\n const maxLabel =\n chartOptions._preComputedYAxisLabels?.[0] ??\n (chartOptions.yAxisLabelFormatter ? chartOptions.yAxisLabelFormatter(maxValue) : this.getSmartYAxisFormatter(maxValue)(maxValue))\n const yAxisWidth = ctx.measureText(maxLabel).width + 10\n chartX += yAxisWidth\n chartWidth -= yAxisWidth\n }\n\n let labelHeight = 0\n if (chartOptions?.showLabels) {\n const fontSize = chartOptions.labelFontSize || 12\n ctx.font = `${fontSize}px ${this.props.fontFamily || 'sans-serif'}`\n const metrics = ctx.measureText('Mg')\n labelHeight = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent + 10 // with padding\n }\n const finalChartHeight = chartHeight - labelHeight\n\n const groupWidth = chartWidth / labels.length\n const barSpacing = groupWidth * 0.2\n const barWidth = (groupWidth - barSpacing) / datasets.length\n\n // Render grid\n if (chartOptions?.grid?.show) {\n ctx.strokeStyle = chartOptions.grid.color || '#e0e0e0'\n ctx.lineWidth = 1\n if (chartOptions.grid.style === 'dashed') {\n ctx.setLineDash([5, 5])\n } else if (chartOptions.grid.style === 'dotted') {\n ctx.setLineDash([2, 2])\n }\n\n for (let i = 0; i <= 5; i++) {\n const gridY = chartY + (finalChartHeight / 5) * i\n ctx.beginPath()\n ctx.moveTo(chartX, gridY)\n ctx.lineTo(chartX + chartWidth, gridY)\n ctx.stroke()\n\n if (chartOptions?.showYAxis) {\n const value = maxValue - (maxValue / 5) * i\n const label =\n chartOptions._preComputedYAxisLabels?.[i] ??\n (chartOptions.yAxisLabelFormatter ? chartOptions.yAxisLabelFormatter(value) : this.getSmartYAxisFormatter(maxValue)(value))\n\n TextNode.renderSimpleText(ctx, label, chartX - 5, gridY, {\n color: chartOptions.yAxisColor || chartOptions.axisColor || '#000',\n fontSize: chartOptions.yAxisFontSize || 12,\n fontFamily: this.props.fontFamily,\n textAlign: 'right',\n textBaseline: 'middle',\n })\n }\n }\n ctx.setLineDash([])\n }\n\n // Render bars\n labels.forEach((label, index) => {\n const groupX = chartX + index * groupWidth + barSpacing / 2\n\n datasets.forEach((dataset, datasetIndex) => {\n const barHeight = (dataset.data[index] / maxValue) * finalChartHeight\n const barX = groupX + datasetIndex * barWidth\n const barY = chartY + finalChartHeight - barHeight\n\n ctx.fillStyle = dataset.color || this.generateColor(datasetIndex)\n ctx.fillRect(barX, barY, barWidth, barHeight)\n\n // Render values\n if (chartOptions?.showValues) {\n const value = dataset.data[index]\n const valueX = barX + barWidth / 2\n const valueY = barY - 5 // 5px padding above bar\n\n const preComputedValueDesc = chartOptions._preComputedValueItems?.[datasetIndex]?.[index]\n if (preComputedValueDesc) {\n const valueNode = buildDescriptorTree(preComputedValueDesc)\n valueNode.processInitialChildren()\n valueNode.node.calculateLayout(undefined, undefined, Style.Direction.LTR)\n const layout = valueNode.node.getComputedLayout()\n valueNode.render(ctx, valueX - layout.width / 2, valueY - layout.height)\n } else if (chartOptions.renderValueItem) {\n const valueNode = chartOptions.renderValueItem({ item: value, index, datasetIndex })\n if (valueNode) {\n valueNode.processInitialChildren()\n valueNode.node.calculateLayout(undefined, undefined, Style.Direction.LTR)\n const layout = valueNode.node.getComputedLayout()\n valueNode.render(ctx, valueX - layout.width / 2, valueY - layout.height)\n }\n } else {\n TextNode.renderSimpleText(ctx, value.toString(), valueX, valueY, {\n color: chartOptions.valueColor || '#000',\n fontSize: chartOptions.valueFontSize || 12,\n fontFamily: this.props.fontFamily,\n textAlign: 'center',\n textBaseline: 'bottom',\n })\n }\n }\n })\n\n // Render labels\n if (chartOptions?.showLabels) {\n const displayLabel =\n chartOptions._preComputedXAxisLabels?.[index] ?? (chartOptions.xAxisLabelFormatter ? chartOptions.xAxisLabelFormatter(label, index) : label)\n\n const preComputedLabelDesc = chartOptions._preComputedLabelItems?.[index]\n if (preComputedLabelDesc) {\n const labelNode = buildDescriptorTree(preComputedLabelDesc)\n labelNode.processInitialChildren()\n labelNode.node.calculateLayout(undefined, undefined, Style.Direction.LTR)\n const layout = labelNode.node.getComputedLayout()\n labelNode.render(ctx, groupX + (groupWidth - barSpacing) / 2 - layout.width / 2, chartY + finalChartHeight + labelHeight / 2 - layout.height / 2)\n } else if (chartOptions.renderLabelItem) {\n const labelNode = chartOptions.renderLabelItem({ item: label, index })\n if (labelNode) {\n labelNode.processInitialChildren()\n labelNode.node.calculateLayout(undefined, undefined, Style.Direction.LTR)\n const layout = labelNode.node.getComputedLayout()\n labelNode.render(ctx, groupX + (groupWidth - barSpacing) / 2 - layout.width / 2, chartY + finalChartHeight + labelHeight / 2 - layout.height / 2)\n }\n } else {\n TextNode.renderSimpleText(ctx, displayLabel, groupX + (groupWidth - barSpacing) / 2, chartY + finalChartHeight + labelHeight / 2, {\n color: chartOptions.labelColor || chartOptions.axisColor,\n fontSize: chartOptions.labelFontSize,\n fontFamily: this.props.fontFamily,\n textAlign: 'center',\n textBaseline: 'middle',\n })\n }\n }\n })\n\n // Render legend\n if (chartOptions?.showLegend) {\n this.renderLegend(ctx, x + legendLayout.x, y + legendLayout.y, legendLayout.width, legendLayout.height)\n }\n }\n\n private renderLineChart(ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number) {\n if (this.chartType !== 'line') return\n const chartData = this.chartData as CartesianChartData\n const chartOptions = this.chartOptions as ChartProps<'line'>['options'] & PreComputedChartOptions\n\n const { labels, datasets } = chartData\n const maxValue = Math.max(...datasets.flatMap(d => d.data))\n\n const legendLayout = this.getLegendLayout(ctx, width, height)\n let chartX = x + legendLayout.chartX\n const chartY = y + legendLayout.chartY\n let chartWidth = legendLayout.chartWidth\n const chartHeight = legendLayout.chartHeight\n\n if (chartOptions?.showYAxis) {\n const fontSize = chartOptions.yAxisFontSize || 12\n ctx.font = `${fontSize}px ${this.props.fontFamily || 'sans-serif'}`\n const maxLabel =\n chartOptions._preComputedYAxisLabels?.[0] ??\n (chartOptions.yAxisLabelFormatter ? chartOptions.yAxisLabelFormatter(maxValue) : this.getSmartYAxisFormatter(maxValue)(maxValue))\n const yAxisWidth = ctx.measureText(maxLabel).width + 10\n chartX += yAxisWidth\n chartWidth -= yAxisWidth\n }\n\n let labelHeight = 0\n if (chartOptions?.showLabels) {\n const fontSize = chartOptions.labelFontSize || 12\n ctx.font = `${fontSize}px ${this.props.fontFamily || 'sans-serif'}`\n const metrics = ctx.measureText('Mg')\n labelHeight = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent + 10 // with padding\n }\n const finalChartHeight = chartHeight - labelHeight\n const pointSpacing = chartWidth / (labels.length > 1 ? labels.length - 1 : 1)\n\n // Render grid\n if (chartOptions?.grid?.show) {\n ctx.strokeStyle = chartOptions.grid.color || '#e0e0e0'\n ctx.lineWidth = 1\n if (chartOptions.grid.style === 'dashed') {\n ctx.setLineDash([5, 5])\n } else if (chartOptions.grid.style === 'dotted') {\n ctx.setLineDash([2, 2])\n }\n\n for (let i = 0; i <= 5; i++) {\n const gridY = chartY + (finalChartHeight / 5) * i\n ctx.beginPath()\n ctx.moveTo(chartX, gridY)\n ctx.lineTo(chartX + chartWidth, gridY)\n ctx.stroke()\n\n if (chartOptions?.showYAxis) {\n const value = maxValue - (maxValue / 5) * i\n const label =\n chartOptions._preComputedYAxisLabels?.[i] ??\n (chartOptions.yAxisLabelFormatter ? chartOptions.yAxisLabelFormatter(value) : this.getSmartYAxisFormatter(maxValue)(value))\n\n TextNode.renderSimpleText(ctx, label, chartX - 5, gridY, {\n color: chartOptions.yAxisColor || chartOptions.axisColor || '#000',\n fontSize: chartOptions.yAxisFontSize || 12,\n fontFamily: this.props.fontFamily,\n textAlign: 'right',\n textBaseline: 'middle',\n })\n }\n }\n ctx.setLineDash([])\n }\n\n // Render lines and points\n datasets.forEach((dataset, datasetIndex) => {\n ctx.strokeStyle = dataset.color || this.generateColor(datasetIndex)\n ctx.lineWidth = 2\n ctx.beginPath()\n\n dataset.data.forEach((value, index) => {\n const pointX = chartX + index * pointSpacing\n const pointY = chartY + finalChartHeight - (value / maxValue) * finalChartHeight\n\n if (index === 0) {\n ctx.moveTo(pointX, pointY)\n } else {\n ctx.lineTo(pointX, pointY)\n }\n })\n ctx.stroke()\n\n // Render points\n dataset.data.forEach((value, index) => {\n const pointX = chartX + index * pointSpacing\n const pointY = chartY + finalChartHeight - (value / maxValue) * finalChartHeight\n ctx.fillStyle = dataset.color || this.generateColor(datasetIndex)\n ctx.beginPath()\n ctx.arc(pointX, pointY, 4, 0, Math.PI * 2)\n ctx.fill()\n })\n })\n\n // Render labels\n if (chartOptions?.showLabels) {\n labels.forEach((label, index) => {\n const pointX = chartX + index * pointSpacing\n const displayLabel =\n chartOptions._preComputedXAxisLabels?.[index] ?? (chartOptions.xAxisLabelFormatter ? chartOptions.xAxisLabelFormatter(label, index) : label)\n\n const preComputedLabelDesc = chartOptions._preComputedLabelItems?.[index]\n if (preComputedLabelDesc) {\n const labelNode = buildDescriptorTree(preComputedLabelDesc)\n labelNode.processInitialChildren()\n labelNode.node.calculateLayout(undefined, undefined, Style.Direction.LTR)\n const layout = labelNode.node.getComputedLayout()\n labelNode.render(ctx, pointX - layout.width / 2, chartY + finalChartHeight + labelHeight / 2 - layout.height / 2)\n } else if (chartOptions.renderLabelItem) {\n const labelNode = chartOptions.renderLabelItem({ item: label, index })\n if (labelNode) {\n labelNode.processInitialChildren()\n labelNode.node.calculateLayout(undefined, undefined, Style.Direction.LTR)\n const layout = labelNode.node.getComputedLayout()\n labelNode.render(ctx, pointX - layout.width / 2, chartY + finalChartHeight + labelHeight / 2 - layout.height / 2)\n }\n } else {\n TextNode.renderSimpleText(ctx, displayLabel, pointX, chartY + finalChartHeight + labelHeight / 2, {\n color: chartOptions.labelColor || chartOptions.axisColor,\n fontSize: chartOptions.labelFontSize,\n fontFamily: this.props.fontFamily,\n textAlign: 'center',\n textBaseline: 'middle',\n })\n }\n })\n }\n\n if (chartOptions?.showLegend) {\n this.renderLegend(ctx, x + legendLayout.x, y + legendLayout.y, legendLayout.width, legendLayout.height)\n }\n }\n\n private renderPieChart(ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number) {\n if (this.chartType !== 'pie') return\n const data = this.chartData as PieChartDataPoint[]\n const chartOptions = this.chartOptions as ChartProps<'pie'>['options'] & PreComputedChartOptions\n\n const legendLayout = this.getLegendLayout(ctx, width, height)\n const chartX = x + legendLayout.chartX\n const chartY = y + legendLayout.chartY\n const chartWidth = legendLayout.chartWidth\n const chartHeight = legendLayout.chartHeight\n\n const centerX = chartX + chartWidth / 2\n const centerY = chartY + chartHeight / 2\n const radius = Math.min(chartWidth, chartHeight) / 2 - 10\n\n const total = data.reduce((sum, point) => sum + point.value, 0)\n let currentAngle = -Math.PI / 2 // Start at top\n\n data.forEach((point, index) => {\n const sliceAngle = (point.value / total) * Math.PI * 2\n const startAngle = currentAngle\n const endAngle = currentAngle + sliceAngle\n\n ctx.fillStyle = point.color || this.generateColor(index)\n ctx.beginPath()\n ctx.moveTo(centerX, centerY)\n ctx.arc(centerX, centerY, radius, startAngle, endAngle)\n ctx.closePath()\n ctx.fill()\n\n // Draw slice border\n ctx.strokeStyle = '#fff'\n ctx.lineWidth = 2\n ctx.stroke()\n\n // Render labels\n if (chartOptions?.showLabels) {\n const labelAngle = startAngle + sliceAngle / 2\n const labelRadius = radius * 0.7\n const labelX = centerX + Math.cos(labelAngle) * labelRadius\n const labelY = centerY + Math.sin(labelAngle) * labelRadius\n\n const preComputedLabelDesc = chartOptions._preComputedLabelItems?.[index]\n if (preComputedLabelDesc) {\n const labelNode = buildDescriptorTree(preComputedLabelDesc)\n labelNode.processInitialChildren()\n labelNode.node.calculateLayout(undefined, undefined, Style.Direction.LTR)\n const layout = labelNode.node.getComputedLayout()\n labelNode.render(ctx, labelX - layout.width / 2, labelY - layout.height / 2)\n } else if (chartOptions.renderLabelItem) {\n const labelNode = chartOptions.renderLabelItem({ item: point, index })\n if (labelNode) {\n labelNode.processInitialChildren()\n labelNode.node.calculateLayout(undefined, undefined, Style.Direction.LTR)\n const layout = labelNode.node.getComputedLayout()\n labelNode.render(ctx, labelX - layout.width / 2, labelY - layout.height / 2)\n }\n } else {\n TextNode.renderSimpleText(ctx, point.label, labelX, labelY, {\n color: chartOptions.labelColor,\n fontSize: chartOptions.labelFontSize,\n fontFamily: this.props.fontFamily,\n textAlign: 'center',\n textBaseline: 'middle',\n })\n }\n }\n\n currentAngle = endAngle\n })\n\n if (chartOptions?.showLegend) {\n this.renderLegend(ctx, x + legendLayout.x, y + legendLayout.y, legendLayout.width, legendLayout.height)\n }\n }\n\n private renderDoughnutChart(ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number) {\n if (this.chartType !== 'doughnut') return\n const data = this.chartData as PieChartDataPoint[]\n const chartOptions = this.chartOptions as ChartProps<'doughnut'>['options'] & PreComputedChartOptions\n\n const legendLayout = this.getLegendLayout(ctx, width, height)\n const chartX = x + legendLayout.chartX\n const chartY = y + legendLayout.chartY\n const chartWidth = legendLayout.chartWidth\n const chartHeight = legendLayout.chartHeight\n\n const centerX = chartX + chartWidth / 2\n const centerY = chartY + chartHeight / 2\n const outerRadius = Math.min(chartWidth, chartHeight) / 2 - 10\n const innerRadius = outerRadius * (chartOptions?.innerRadius ?? 0.6)\n\n const total = data.reduce((sum, point) => sum + point.value, 0)\n let currentAngle = -Math.PI / 2\n\n data.forEach((point, index) => {\n const sliceAngle = (point.value / total) * Math.PI * 2\n const startAngle = currentAngle\n const endAngle = currentAngle + sliceAngle\n\n ctx.fillStyle = point.color || this.generateColor(index)\n ctx.beginPath()\n ctx.arc(centerX, centerY, outerRadius, startAngle, endAngle)\n ctx.arc(centerX, centerY, innerRadius, endAngle, startAngle, true)\n ctx.closePath()\n ctx.fill()\n\n ctx.strokeStyle = '#fff'\n ctx.lineWidth = 2\n ctx.stroke()\n\n // Render labels\n if (chartOptions?.showLabels) {\n const labelAngle = startAngle + sliceAngle / 2\n const labelRadius = innerRadius + (outerRadius - innerRadius) / 2\n const labelX = centerX + Math.cos(labelAngle) * labelRadius\n const labelY = centerY + Math.sin(labelAngle) * labelRadius\n\n const preComputedLabelDesc = chartOptions._preComputedLabelItems?.[index]\n if (preComputedLabelDesc) {\n const labelNode = buildDescriptorTree(preComputedLabelDesc)\n labelNode.processInitialChildren()\n labelNode.node.calculateLayout(undefined, undefined, Style.Direction.LTR)\n const layout = labelNode.node.getComputedLayout()\n labelNode.render(ctx, labelX - layout.width / 2, labelY - layout.height / 2)\n } else if (chartOptions.renderLabelItem) {\n const labelNode = chartOptions.renderLabelItem({ item: point, index })\n if (labelNode) {\n labelNode.processInitialChildren()\n labelNode.node.calculateLayout(undefined, undefined, Style.Direction.LTR)\n const layout = labelNode.node.getComputedLayout()\n labelNode.render(ctx, labelX - layout.width / 2, labelY - layout.height / 2)\n }\n } else {\n TextNode.renderSimpleText(ctx, point.label, labelX, labelY, {\n color: chartOptions.labelColor,\n fontSize: chartOptions.labelFontSize,\n fontFamily: this.props.fontFamily,\n textAlign: 'center',\n textBaseline: 'middle',\n })\n }\n }\n\n currentAngle = endAngle\n })\n\n if (chartOptions?.showLegend) {\n this.renderLegend(ctx, x + legendLayout.x, y + legendLayout.y, legendLayout.width, legendLayout.height)\n }\n }\n\n private renderLegend(ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number) {\n const { renderLegendItem, _preComputedLegendItems } = this.chartOptions\n\n if (_preComputedLegendItems) {\n const finalNodes = _preComputedLegendItems.filter((desc): desc is CanvasElement => !!desc).map(desc => buildDescriptorTree(desc))\n\n if (finalNodes.length > 0) {\n const legendContainer = new RowNode({\n children: finalNodes,\n width,\n height,\n justifyContent: Style.Justify.Center,\n alignItems: Style.Align.Center,\n flexWrap: Style.Wrap.Wrap,\n gap: 10,\n })\n legendContainer.processInitialChildren()\n legendContainer.node.calculateLayout(width, height, Style.Direction.LTR)\n legendContainer.render(ctx, x, y)\n }\n return\n }\n\n if (renderLegendItem) {\n let legendNodes: (BoxNode | null | undefined)[]\n if (this.chartType === 'bar' || this.chartType === 'line') {\n const items = (this.chartData as CartesianChartData).datasets\n const render = renderLegendItem as (props: { item: ChartDataset; index: number; color: string }) => BoxNode | null | undefined\n legendNodes = items.map((item, index) => {\n const color = item.color || this.generateColor(index)\n return render({ item, index, color })\n })\n } else {\n const items = this.chartData as PieChartDataPoint[]\n const render = renderLegendItem as (props: { item: PieChartDataPoint; index: number; color: string }) => BoxNode | null | undefined\n legendNodes = items.map((item, index) => {\n const color = item.color || this.generateColor(index)\n return render({ item, index, color })\n })\n }\n\n const finalNodes = legendNodes.filter((node): node is BoxNode => !!node)\n\n if (finalNodes.length > 0) {\n const legendContainer = new RowNode({\n children: finalNodes,\n width,\n height,\n justifyContent: Style.Justify.Center,\n alignItems: Style.Align.Center,\n flexWrap: Style.Wrap.Wrap,\n gap: 10,\n })\n legendContainer.processInitialChildren()\n legendContainer.node.calculateLayout(width, height, Style.Direction.LTR)\n legendContainer.render(ctx, x, y)\n }\n return\n }\n\n // Fallback to default rendering if renderLegendItem is not provided\n const legendItems =\n 'datasets' in this.chartData\n ? this.chartData.datasets.map(d => ({ label: d.label, value: d.data.reduce((a, b) => a + b, 0) }))\n : (this.chartData as PieChartDataPoint[])\n const fontSize = this.chartOptions?.labelFontSize || 12\n ctx.font = `${fontSize}px ${this.props.fontFamily || 'sans-serif'}`\n\n const metrics = ctx.measureText('Mg')\n const textHeight = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent\n const itemHeight = Math.ceil(textHeight + 8)\n const boxSize = Math.min(15, itemHeight - 2)\n\n const position = this.chartOptions.legendPosition\n if (position === 'top' || position === 'bottom') {\n const itemPadding = 20 // horizontal padding between items\n const rows: { items: { label: string; color: string; width: number }[]; width: number }[] = []\n let currentRow: { items: { label: string; color: string; width: number }[]; width: number } = { items: [], width: 0 }\n\n legendItems.forEach((point, index) => {\n const color =\n ('datasets' in this.chartData ? (this.chartData as CartesianChartData).datasets[index].color : (point as any).color) || this.generateColor(index)\n const label = 'datasets' in this.chartData ? point.label : `${point.label} (${point.value})`\n const labelWidth = ctx.measureText(label).width\n const itemWidth = boxSize + 5 + labelWidth\n\n if (currentRow.items.length > 0 && currentRow.width + itemPadding + itemWidth > width) {\n rows.push(currentRow)\n currentRow = { items: [], width: 0 }\n }\n\n currentRow.items.push({ label, color, width: itemWidth })\n currentRow.width += itemWidth + (currentRow.items.length > 1 ? itemPadding : 0)\n })\n rows.push(currentRow)\n\n let currentY = y + 5\n rows.forEach(row => {\n let currentX = x + (width - row.width) / 2\n row.items.forEach(item => {\n const boxY = currentY + (itemHeight - boxSize) / 2\n ctx.fillStyle = item.color\n ctx.fillRect(currentX, boxY, boxSize, boxSize)\n\n TextNode.renderSimpleText(ctx, item.label, currentX + boxSize + 5, currentY + itemHeight / 2, {\n color: this.chartOptions?.labelColor,\n fontSize,\n fontFamily: this.props.fontFamily,\n textAlign: 'left',\n textBaseline: 'middle',\n })\n\n currentX += item.width + itemPadding\n })\n currentY += itemHeight\n })\n } else {\n // 'left' or 'right'\n const totalHeight = legendItems.length * itemHeight\n const startY = y + (height - totalHeight) / 2\n\n legendItems.forEach((point, index) => {\n const itemX = x + 10\n const itemY = startY + index * itemHeight\n\n const boxY = itemY + (itemHeight - boxSize) / 2\n ctx.fillStyle =\n ('datasets' in this.chartData ? (this.chartData as CartesianChartData).datasets[index].color : (point as any).color) || this.generateColor(index)\n ctx.fillRect(itemX, boxY, boxSize, boxSize)\n\n const label = 'datasets' in this.chartData ? point.label : `${point.label} (${point.value})`\n TextNode.renderSimpleText(ctx, label, itemX + boxSize + 5, itemY + itemHeight / 2, {\n color: this.chartOptions?.labelColor,\n fontSize,\n fontFamily: this.props.fontFamily,\n textAlign: 'left',\n textBaseline: 'middle',\n })\n })\n }\n }\n\n private generateColor(index: number): string {\n const colors = ['#FF6384', '#36A2EB', '#FFCE56', '#4BC0C0', '#9966FF', '#FF9F40', '#C9CBCF']\n return colors[index % colors.length]\n }\n}\n\nexport const Chart = <T extends ChartType>(props: ChartProps<T> & BaseProps): CanvasElement => ({\n __type: 'Chart',\n props: props as any,\n})\n"],"names":["BoxNode","ColumnNode","RowNode","ImageNode","TextNode","Style"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var layout_canvas_util = require('./layout.canvas.util.js');
3
+ var layout_canvas = require('./layout.canvas.js');
4
4
  var common_const = require('../constant/common.const.js');
5
5
  var canvas_helper = require('./canvas.helper.js');
6
6
 
@@ -15,7 +15,7 @@ function normalizeDescriptorChildren(children) {
15
15
  * In runtime, it behaves almost like a BoxNode, but we can detect it if needed,
16
16
  * or simply rely on the props being present in the instance.
17
17
  */
18
- class GridItemNode extends layout_canvas_util.BoxNode {
18
+ class GridItemNode extends layout_canvas.BoxNode {
19
19
  constructor(props) {
20
20
  super({
21
21
  ...props,
@@ -35,7 +35,7 @@ const GridItem = ({ children, ...rest }) => ({
35
35
  * Grid layout node that arranges children in a 2D grid.
36
36
  * Implements a simplified version of the CSS Grid Layout algorithm.
37
37
  */
38
- class GridNode extends layout_canvas_util.RowNode {
38
+ class GridNode extends layout_canvas.RowNode {
39
39
  /**
40
40
  * Creates a new grid layout node
41
41
  * @param props Grid configuration properties
@@ -420,4 +420,4 @@ exports.Grid = Grid;
420
420
  exports.GridItem = GridItem;
421
421
  exports.GridItemNode = GridItemNode;
422
422
  exports.GridNode = GridNode;
423
- //# sourceMappingURL=grid.canvas.util.js.map
423
+ //# sourceMappingURL=grid.canvas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.canvas.js","sources":["../../../../../src/canvas/grid.canvas.ts"],"sourcesContent":["import type { GridProps, GridTrackSize, GridItemProps, CanvasElement } from '@/canvas/canvas.type.js'\nimport type { BoxProps } from '@/canvas/canvas.type.js'\nimport { BoxNode, RowNode } from '@/canvas/layout.canvas.js'\nimport { Style } from '@/constant/common.const.js'\nimport { parsePercentage } from '@/canvas/canvas.helper.js'\n\nfunction normalizeDescriptorChildren(children: BoxProps['children']): CanvasElement[] | undefined {\n if (children === undefined || children === null || children === false) return undefined\n const arr = (Array.isArray(children) ? children : [children]).filter(Boolean) as CanvasElement[]\n return arr.length > 0 ? arr : undefined\n}\n\n/**\n * GridItem Node. Theoretically just a BoxNode but typed differently in factory.\n * In runtime, it behaves almost like a BoxNode, but we can detect it if needed,\n * or simply rely on the props being present in the instance.\n */\nexport class GridItemNode extends BoxNode {\n constructor(props: GridItemProps) {\n super({\n ...props,\n name: 'GridItem',\n })\n }\n}\n\n/**\n * Factory for GridItem.\n */\nexport const GridItem = ({ children, ...rest }: GridItemProps): CanvasElement => ({\n __type: 'GridItem',\n props: rest,\n children: normalizeDescriptorChildren(children),\n})\n\n/**\n * Grid layout node that arranges children in a 2D grid.\n * Implements a simplified version of the CSS Grid Layout algorithm.\n */\nexport class GridNode extends RowNode {\n /**\n * Creates a new grid layout node\n * @param props Grid configuration properties\n */\n constructor(props: GridProps) {\n super({\n ...props,\n name: props.name || 'Grid',\n flexWrap: Style.Wrap.Wrap,\n })\n }\n\n /**\n * Helper to parse a track size definition.\n */\n private parseTrack(track: GridTrackSize, availableSpace: number): { type: 'px' | '%' | 'fr' | 'auto'; value: number } {\n if (typeof track === 'number') {\n return { type: 'px', value: track }\n }\n if (track === 'auto') {\n return { type: 'auto', value: 0 }\n }\n if (typeof track === 'string') {\n if (track.endsWith('fr')) {\n return { type: 'fr', value: parseFloat(track) }\n }\n if (track.endsWith('%')) {\n return { type: '%', value: parsePercentage(track, availableSpace) }\n }\n if (track.endsWith('px')) {\n return { type: 'px', value: parseFloat(track) }\n }\n // Try parsing as number (px) if just string \"100\"\n const num = parseFloat(track)\n if (!isNaN(num)) return { type: 'px', value: num }\n }\n return { type: 'auto', value: 0 }\n }\n\n /**\n * Parses the gap property into pixels.\n */\n private getGapPixels(gap: GridProps['gap'], width: number, height: number) {\n let rowGap = 0\n let colGap = 0\n\n if (typeof gap === 'number') {\n rowGap = colGap = gap\n } else if (typeof gap === 'string') {\n const val = parsePercentage(gap, width) // Use width as base for simplicity if %\n rowGap = colGap = val\n } else if (gap && typeof gap === 'object') {\n const colVal = gap.Column ?? gap.All ?? 0\n const rowVal = gap.Row ?? gap.All ?? 0\n colGap = parsePercentage(colVal as string | number, width)\n rowGap = parsePercentage(rowVal as string | number, height)\n }\n\n return { rowGap, colGap }\n }\n\n /**\n * Update layout calculations after the initial layout is computed.\n */\n protected override updateLayoutBasedOnComputedSize() {\n // 1. Get Container Dimensions\n let width = this.node.getComputedWidth()\n const parent = this.node.getParent()\n\n if (parent) {\n const parentWidth = parent.getWidth()\n const parentMinWidth = parent.getMinWidth()\n const parentMaxWidth = parent.getMaxWidth()\n\n // Parent has % minWidth but no hard width/maxWidth constraint\n const hasPercentMinWidth = parentMinWidth.unit === Style.Unit.Percent\n const hasExplicitWidth = parentWidth.unit !== Style.Unit.Undefined && parentWidth.unit !== Style.Unit.Auto\n const hasMaxWidth = parentMaxWidth.unit !== Style.Unit.Undefined && parentMaxWidth.unit !== Style.Unit.Auto\n\n if (hasPercentMinWidth && !hasExplicitWidth && !hasMaxWidth) {\n const grandparent = parent.getParent()\n if (grandparent) {\n const intendedWidth = (parentMinWidth.value / 100) * grandparent.getComputedWidth()\n\n // Check if parent has flexGrow - if so, don't constrain\n const parentFlexGrow = parent.getFlexGrow()\n if (parentFlexGrow > 0) {\n // Allow expansion - use computed width\n } else {\n // No flexGrow - constrain to minWidth\n width = Math.min(width, intendedWidth)\n }\n }\n }\n }\n\n const paddingLeft = this.node.getComputedPadding(Style.Edge.Left)\n const paddingRight = this.node.getComputedPadding(Style.Edge.Right)\n const paddingTop = this.node.getComputedPadding(Style.Edge.Top)\n const paddingBottom = this.node.getComputedPadding(Style.Edge.Bottom)\n\n const contentWidth = Math.max(0, width - paddingLeft - paddingRight)\n const computedHeight = this.node.getComputedHeight()\n const contentHeight = Math.max(0, computedHeight - paddingTop - paddingBottom)\n\n const { templateColumns, templateRows, autoRows = 'auto', gap, columns } = this.props as GridProps\n\n // 2. Resolve Gaps\n const { rowGap, colGap } = this.getGapPixels(gap, contentWidth, contentHeight)\n\n // 3. Resolve Columns (Tracks)\n let explicitColTracks: GridTrackSize[] = templateColumns || []\n if (explicitColTracks.length === 0 && columns) {\n explicitColTracks = Array(columns).fill('1fr')\n }\n if (explicitColTracks.length === 0) explicitColTracks = ['1fr']\n\n const resolvedColTracks = this.resolveTracks(explicitColTracks, contentWidth, colGap)\n\n // Pre-calculate Col Offsets needed for placement/width\n const colOffsetsValues = [0]\n for (let i = 0; i < resolvedColTracks.length; i++) {\n colOffsetsValues.push(colOffsetsValues[i] + resolvedColTracks[i] + colGap)\n }\n\n // 4. Place Items & Resolve Explicit Row Tracks\n const explicitRowTracks = templateRows || []\n const resolvedExplicitRowTracks = this.resolveTracks(explicitRowTracks, contentHeight, rowGap)\n\n const cells: boolean[][] = [] // true if occupied\n const items: { node: BoxNode; rowStart: number; rowEnd: number; colStart: number; colEnd: number }[] = []\n\n const isOccupied = (r: number, c: number) => {\n if (!cells[r]) return false\n return cells[r][c] === true\n }\n const setOccupied = (r: number, c: number) => {\n if (!cells[r]) cells[r] = []\n cells[r][c] = true\n }\n\n let cursorRow = 0\n let cursorCol = 0\n\n for (const child of this.children) {\n const childProps = child.props as GridItemProps\n const { gridColumn, gridRow } = childProps\n\n let colStart: number | undefined\n let colEnd: number | undefined\n let colSpan = 1\n let rowStart: number | undefined\n let rowEnd: number | undefined\n let rowSpan = 1\n\n // ... Grid Placement Logic ...\n if (gridColumn) {\n const parts = gridColumn.split('/').map(s => s.trim())\n if (parts[0]) {\n if (parts[0].startsWith('span')) {\n colSpan = parseInt(parts[0].replace('span', '')) || 1\n } else {\n colStart = parseInt(parts[0]) - 1\n }\n }\n if (parts[1]) {\n if (parts[1].startsWith('span')) {\n const span = parseInt(parts[1].replace('span', '')) || 1\n if (colStart !== undefined) {\n colEnd = colStart + span\n colSpan = span\n } else {\n // If start is undefined but end is span? Unusual. Treat as span.\n colSpan = span\n }\n } else {\n colEnd = parseInt(parts[1]) - 1\n if (colStart !== undefined) {\n colSpan = colEnd - colStart\n }\n }\n }\n }\n\n if (gridRow) {\n const parts = gridRow.split('/').map(s => s.trim())\n if (parts[0]) {\n if (parts[0].startsWith('span')) {\n rowSpan = parseInt(parts[0].replace('span', '')) || 1\n } else {\n rowStart = parseInt(parts[0]) - 1\n }\n }\n if (parts[1]) {\n if (parts[1].startsWith('span')) {\n const span = parseInt(parts[1].replace('span', '')) || 1\n if (rowStart !== undefined) {\n rowEnd = rowStart + span\n rowSpan = span\n } else {\n rowSpan = span\n }\n } else {\n rowEnd = parseInt(parts[1]) - 1\n if (rowStart !== undefined) {\n rowSpan = rowEnd - rowStart\n }\n }\n }\n }\n\n if (colStart !== undefined && rowStart !== undefined) {\n // Fixed position: Check overlap in simpler V1? Or just place?\n // Just place.\n } else {\n // Auto placement\n let placed = false\n while (!placed) {\n if (!cells[cursorRow]) cells[cursorRow] = []\n\n if (colStart !== undefined) cursorCol = colStart\n\n let fits = true\n for (let r = 0; r < rowSpan; r++) {\n for (let c = 0; c < colSpan; c++) {\n if (isOccupied(cursorRow + r, cursorCol + c)) {\n fits = false\n break\n }\n }\n if (!fits) break\n }\n\n if (fits) {\n rowStart = cursorRow\n colStart = cursorCol\n placed = true\n } else {\n cursorCol++\n if (cursorCol + colSpan > resolvedColTracks.length) {\n cursorCol = 0\n cursorRow++\n }\n }\n }\n cursorCol += colSpan\n if (cursorCol >= resolvedColTracks.length) {\n cursorCol = 0\n cursorRow++\n }\n }\n\n rowEnd = (rowStart ?? 0) + rowSpan\n colEnd = (colStart ?? 0) + colSpan\n\n for (let r = rowStart!; r < rowEnd!; r++) {\n for (let c = colStart!; c < colEnd!; c++) {\n setOccupied(r, c)\n }\n }\n\n // CRITICAL FIX: Pre-set width on item to ensure height calculation is accurate later\n const itemColStart = colStart!\n const itemColEnd = colEnd!\n\n // Extend local offsets if needed for spanned columns beyond track count (rare but safe)\n while (colOffsetsValues.length <= itemColEnd) {\n colOffsetsValues.push(colOffsetsValues[colOffsetsValues.length - 1] + 0 + colGap)\n }\n\n const cs = Math.min(itemColStart, colOffsetsValues.length - 1)\n const ce = Math.min(itemColEnd, colOffsetsValues.length - 1)\n const targetWidth = Math.max(0, colOffsetsValues[ce] - colOffsetsValues[cs] - colGap)\n\n child.node.setWidth(targetWidth)\n child.node.calculateLayout(targetWidth, Number.NaN, Style.Direction.LTR)\n\n // Recursively finalize nested children (e.g. inner Grids) so their\n // computed heights are accurate before we measure row sizes.\n child.finalizeLayout()\n if (child.node.isDirty()) {\n child.node.calculateLayout(targetWidth, Number.NaN, Style.Direction.LTR)\n }\n\n items.push({ node: child, rowStart: rowStart!, rowEnd: rowEnd!, colStart: itemColStart, colEnd: itemColEnd })\n }\n\n // 6. Finalize Rows (Implicit)\n const totalRowsNeeded = Math.max(resolvedExplicitRowTracks.length, ...items.map(i => i.rowEnd))\n const resolvedRowTracks = [...resolvedExplicitRowTracks]\n\n // Fill implicit rows\n for (let r = resolvedExplicitRowTracks.length; r < totalRowsNeeded; r++) {\n let rowSize = 0\n\n // Better 'auto' handling:\n if (autoRows === 'auto') {\n const rowItems = items.filter(i => i.rowStart === r && i.rowEnd - i.rowStart === 1)\n for (const item of rowItems) {\n rowSize = Math.max(rowSize, item.node.node.getComputedHeight())\n }\n } else {\n const parsed = this.parseTrack(autoRows, contentHeight)\n rowSize = parsed.value\n }\n resolvedRowTracks.push(rowSize)\n }\n\n // 6. Calculate Offsets (Rows) & Final Layout Application\n const colOffsets = colOffsetsValues // Re-use\n const rowOffsets = [0]\n for (let i = 0; i < resolvedRowTracks.length; i++) {\n let size = resolvedRowTracks[i]\n // Re-check auto-sized explicit rows (value 0)\n if (size === 0) {\n const rowItems = items.filter(it => it.rowStart === i && it.rowEnd - it.rowStart === 1)\n for (const item of rowItems) {\n size = Math.max(size, item.node.node.getComputedHeight())\n }\n resolvedRowTracks[i] = size\n }\n rowOffsets.push(rowOffsets[i] + size + rowGap)\n }\n\n // 7. Apply Positions\n for (const item of items) {\n const x = colOffsets[item.colStart] + paddingLeft\n\n while (colOffsets.length <= item.colEnd) {\n colOffsets.push(colOffsets[colOffsets.length - 1] + 0 + colGap)\n }\n\n const widthStart = colOffsets[item.colStart]\n const widthEnd = colOffsets[item.colEnd]\n const totalWidth = Math.max(0, widthEnd - widthStart - colGap)\n\n const y = rowOffsets[item.rowStart] + paddingTop\n\n const heightStart = rowOffsets[item.rowStart]\n const heightEnd = rowOffsets[item.rowEnd]\n const totalHeight = Math.max(0, heightEnd - heightStart - rowGap)\n\n const childNode = item.node.node\n\n if (childNode.getPositionType() !== Style.PositionType.Absolute) {\n childNode.setPositionType(Style.PositionType.Absolute)\n }\n\n if (childNode.getPosition(Style.Edge.Left).value !== x) {\n childNode.setPosition(Style.Edge.Left, x)\n }\n if (childNode.getPosition(Style.Edge.Top).value !== y) {\n childNode.setPosition(Style.Edge.Top, y)\n }\n\n if (childNode.getWidth().unit !== Style.Unit.Point || Math.abs(childNode.getWidth().value - totalWidth) > 0.1) {\n childNode.setWidth(totalWidth)\n }\n if (childNode.getHeight().unit !== Style.Unit.Point || Math.abs(childNode.getHeight().value - totalHeight) > 0.1) {\n childNode.setHeight(totalHeight)\n }\n }\n\n // 9. Update Grid Height\n const totalGridHeight = Math.max(0, rowOffsets[rowOffsets.length - 1] - rowGap)\n const currentHeightStyle = this.node.getHeight()\n if (currentHeightStyle.unit === Style.Unit.Auto || currentHeightStyle.unit === Style.Unit.Undefined) {\n const targetTotalHeight = totalGridHeight + paddingTop + paddingBottom\n this.node.setHeight(targetTotalHeight)\n }\n }\n\n /**\n * Resolves track sizes to pixels.\n */\n private resolveTracks(tracks: GridTrackSize[], availableSpace: number, gap: number): number[] {\n const resolved: number[] = []\n let usedSpace = 0\n let totalFr = 0\n const frIndices: number[] = []\n\n tracks.forEach((t, i) => {\n const parsed = this.parseTrack(t, availableSpace)\n if (parsed.type === 'px' || parsed.type === '%') {\n resolved[i] = parsed.value\n usedSpace += parsed.value\n } else if (parsed.type === 'fr') {\n totalFr += parsed.value\n resolved[i] = 0\n frIndices.push(i)\n } else {\n resolved[i] = 0\n }\n })\n\n const totalGaps = Math.max(0, tracks.length - 1) * gap\n usedSpace += totalGaps\n\n const remainingSpace = Math.max(0, availableSpace - usedSpace)\n if (totalFr > 0) {\n frIndices.forEach(i => {\n const parsed = this.parseTrack(tracks[i], availableSpace)\n const share = (parsed.value / totalFr) * remainingSpace\n resolved[i] = share\n })\n }\n\n return resolved\n }\n}\n\n/**\n * Factory function to create a new GridNode instance.\n */\nexport const Grid = ({ children, ...rest }: GridProps): CanvasElement => ({\n __type: 'Grid',\n props: rest,\n children: normalizeDescriptorChildren(children),\n})\n"],"names":["BoxNode","RowNode","Style","parsePercentage"],"mappings":"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"}