@meonode/canvas 1.6.0-beta.2 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/cjs/canvas/canvas.helper.d.ts +20 -1
  2. package/dist/cjs/canvas/canvas.helper.d.ts.map +1 -1
  3. package/dist/cjs/canvas/canvas.helper.js +230 -0
  4. package/dist/cjs/canvas/canvas.helper.js.map +1 -1
  5. package/dist/cjs/canvas/canvas.type.d.ts +19 -8
  6. package/dist/cjs/canvas/canvas.type.d.ts.map +1 -1
  7. package/dist/cjs/canvas/chart.canvas.util.d.ts +2 -2
  8. package/dist/cjs/canvas/chart.canvas.util.d.ts.map +1 -1
  9. package/dist/cjs/canvas/chart.canvas.util.js +101 -26
  10. package/dist/cjs/canvas/chart.canvas.util.js.map +1 -1
  11. package/dist/cjs/canvas/grid.canvas.util.d.ts +3 -3
  12. package/dist/cjs/canvas/grid.canvas.util.d.ts.map +1 -1
  13. package/dist/cjs/canvas/grid.canvas.util.js.map +1 -1
  14. package/dist/cjs/canvas/image.canvas.util.d.ts +2 -2
  15. package/dist/cjs/canvas/image.canvas.util.d.ts.map +1 -1
  16. package/dist/cjs/canvas/image.canvas.util.js.map +1 -1
  17. package/dist/cjs/canvas/layout.canvas.util.d.ts +4 -4
  18. package/dist/cjs/canvas/layout.canvas.util.d.ts.map +1 -1
  19. package/dist/cjs/canvas/layout.canvas.util.js +1 -1
  20. package/dist/cjs/canvas/layout.canvas.util.js.map +1 -1
  21. package/dist/cjs/canvas/root.canvas.util.d.ts +3 -3
  22. package/dist/cjs/canvas/root.canvas.util.d.ts.map +1 -1
  23. package/dist/cjs/canvas/root.canvas.util.js +6 -4
  24. package/dist/cjs/canvas/root.canvas.util.js.map +1 -1
  25. package/dist/cjs/canvas/text.canvas.util.d.ts +2 -2
  26. package/dist/cjs/canvas/text.canvas.util.d.ts.map +1 -1
  27. package/dist/cjs/canvas/text.canvas.util.js +0 -1
  28. package/dist/cjs/canvas/text.canvas.util.js.map +1 -1
  29. package/dist/esm/canvas/canvas.helper.d.ts +20 -1
  30. package/dist/esm/canvas/canvas.helper.d.ts.map +1 -1
  31. package/dist/esm/canvas/canvas.helper.js +230 -1
  32. package/dist/esm/canvas/canvas.type.d.ts +19 -8
  33. package/dist/esm/canvas/canvas.type.d.ts.map +1 -1
  34. package/dist/esm/canvas/chart.canvas.util.d.ts +2 -2
  35. package/dist/esm/canvas/chart.canvas.util.d.ts.map +1 -1
  36. package/dist/esm/canvas/chart.canvas.util.js +102 -27
  37. package/dist/esm/canvas/grid.canvas.util.d.ts +3 -3
  38. package/dist/esm/canvas/grid.canvas.util.d.ts.map +1 -1
  39. package/dist/esm/canvas/image.canvas.util.d.ts +2 -2
  40. package/dist/esm/canvas/image.canvas.util.d.ts.map +1 -1
  41. package/dist/esm/canvas/layout.canvas.util.d.ts +4 -4
  42. package/dist/esm/canvas/layout.canvas.util.d.ts.map +1 -1
  43. package/dist/esm/canvas/layout.canvas.util.js +1 -1
  44. package/dist/esm/canvas/root.canvas.util.d.ts +3 -3
  45. package/dist/esm/canvas/root.canvas.util.d.ts.map +1 -1
  46. package/dist/esm/canvas/root.canvas.util.js +6 -4
  47. package/dist/esm/canvas/text.canvas.util.d.ts +2 -2
  48. package/dist/esm/canvas/text.canvas.util.d.ts.map +1 -1
  49. package/dist/esm/canvas/text.canvas.util.js +0 -1
  50. package/package.json +1 -1
@@ -3,7 +3,29 @@
3
3
  var layout_canvas_util = require('./layout.canvas.util.js');
4
4
  var common_const = require('../constant/common.const.js');
5
5
  var text_canvas_util = require('./text.canvas.util.js');
6
+ var image_canvas_util = require('./image.canvas.util.js');
6
7
 
8
+ /**
9
+ * Local buildTree for pre-computed render function results.
10
+ * Handles only node types that render functions would return (Box, Column, Row, Text, Image).
11
+ * Avoids circular dependency with root.canvas.util.ts.
12
+ */
13
+ function buildDescriptorTree(descriptor) {
14
+ switch (descriptor.__type) {
15
+ case 'Box':
16
+ return new layout_canvas_util.BoxNode({ ...descriptor.props, children: descriptor.children?.map(buildDescriptorTree) });
17
+ case 'Column':
18
+ return new layout_canvas_util.ColumnNode({ ...descriptor.props, children: descriptor.children?.map(buildDescriptorTree) });
19
+ case 'Row':
20
+ return new layout_canvas_util.RowNode({ ...descriptor.props, children: descriptor.children?.map(buildDescriptorTree) });
21
+ case 'Image':
22
+ return new image_canvas_util.ImageNode(descriptor.props);
23
+ case 'Text':
24
+ return new text_canvas_util.TextNode(descriptor.text, descriptor.props);
25
+ default:
26
+ return new layout_canvas_util.BoxNode({});
27
+ }
28
+ }
7
29
  class ChartNode extends layout_canvas_util.BoxNode {
8
30
  chartData;
9
31
  chartType;
@@ -206,8 +228,8 @@ class ChartNode extends layout_canvas_util.BoxNode {
206
228
  if (chartOptions?.showYAxis) {
207
229
  const fontSize = chartOptions.yAxisFontSize || 12;
208
230
  ctx.font = `${fontSize}px ${this.props.fontFamily || 'sans-serif'}`;
209
- const formatter = chartOptions.yAxisLabelFormatter || this.getSmartYAxisFormatter(maxValue);
210
- const maxLabel = formatter(maxValue);
231
+ const maxLabel = chartOptions._preComputedYAxisLabels?.[0] ??
232
+ (chartOptions.yAxisLabelFormatter ? chartOptions.yAxisLabelFormatter(maxValue) : this.getSmartYAxisFormatter(maxValue)(maxValue));
211
233
  const yAxisWidth = ctx.measureText(maxLabel).width + 10;
212
234
  chartX += yAxisWidth;
213
235
  chartWidth -= yAxisWidth;
@@ -241,8 +263,8 @@ class ChartNode extends layout_canvas_util.BoxNode {
241
263
  ctx.stroke();
242
264
  if (chartOptions?.showYAxis) {
243
265
  const value = maxValue - (maxValue / 5) * i;
244
- const formatter = chartOptions.yAxisLabelFormatter || this.getSmartYAxisFormatter(maxValue);
245
- const label = formatter(value);
266
+ const label = chartOptions._preComputedYAxisLabels?.[i] ??
267
+ (chartOptions.yAxisLabelFormatter ? chartOptions.yAxisLabelFormatter(value) : this.getSmartYAxisFormatter(maxValue)(value));
246
268
  text_canvas_util.TextNode.renderSimpleText(ctx, label, chartX - 5, gridY, {
247
269
  color: chartOptions.yAxisColor || chartOptions.axisColor || '#000',
248
270
  fontSize: chartOptions.yAxisFontSize || 12,
@@ -266,11 +288,18 @@ class ChartNode extends layout_canvas_util.BoxNode {
266
288
  // Render values
267
289
  if (chartOptions?.showValues) {
268
290
  const value = dataset.data[index];
269
- const { renderValueItem } = chartOptions;
270
291
  const valueX = barX + barWidth / 2;
271
292
  const valueY = barY - 5; // 5px padding above bar
272
- if (renderValueItem) {
273
- const valueNode = renderValueItem({ item: value, index, datasetIndex });
293
+ const preComputedValueDesc = chartOptions._preComputedValueItems?.[datasetIndex]?.[index];
294
+ if (preComputedValueDesc) {
295
+ const valueNode = buildDescriptorTree(preComputedValueDesc);
296
+ valueNode.processInitialChildren();
297
+ valueNode.node.calculateLayout(undefined, undefined, common_const.Style.Direction.LTR);
298
+ const layout = valueNode.node.getComputedLayout();
299
+ valueNode.render(ctx, valueX - layout.width / 2, valueY - layout.height);
300
+ }
301
+ else if (chartOptions.renderValueItem) {
302
+ const valueNode = chartOptions.renderValueItem({ item: value, index, datasetIndex });
274
303
  if (valueNode) {
275
304
  valueNode.processInitialChildren();
276
305
  valueNode.node.calculateLayout(undefined, undefined, common_const.Style.Direction.LTR);
@@ -291,10 +320,17 @@ class ChartNode extends layout_canvas_util.BoxNode {
291
320
  });
292
321
  // Render labels
293
322
  if (chartOptions?.showLabels) {
294
- const { renderLabelItem, xAxisLabelFormatter } = chartOptions;
295
- const displayLabel = xAxisLabelFormatter ? xAxisLabelFormatter(label, index) : label;
296
- if (renderLabelItem) {
297
- const labelNode = renderLabelItem({ item: label, index });
323
+ const displayLabel = chartOptions._preComputedXAxisLabels?.[index] ?? (chartOptions.xAxisLabelFormatter ? chartOptions.xAxisLabelFormatter(label, index) : label);
324
+ const preComputedLabelDesc = chartOptions._preComputedLabelItems?.[index];
325
+ if (preComputedLabelDesc) {
326
+ const labelNode = buildDescriptorTree(preComputedLabelDesc);
327
+ labelNode.processInitialChildren();
328
+ labelNode.node.calculateLayout(undefined, undefined, common_const.Style.Direction.LTR);
329
+ const layout = labelNode.node.getComputedLayout();
330
+ labelNode.render(ctx, groupX + (groupWidth - barSpacing) / 2 - layout.width / 2, chartY + finalChartHeight + labelHeight / 2 - layout.height / 2);
331
+ }
332
+ else if (chartOptions.renderLabelItem) {
333
+ const labelNode = chartOptions.renderLabelItem({ item: label, index });
298
334
  if (labelNode) {
299
335
  labelNode.processInitialChildren();
300
336
  labelNode.node.calculateLayout(undefined, undefined, common_const.Style.Direction.LTR);
@@ -333,8 +369,8 @@ class ChartNode extends layout_canvas_util.BoxNode {
333
369
  if (chartOptions?.showYAxis) {
334
370
  const fontSize = chartOptions.yAxisFontSize || 12;
335
371
  ctx.font = `${fontSize}px ${this.props.fontFamily || 'sans-serif'}`;
336
- const formatter = chartOptions.yAxisLabelFormatter || this.getSmartYAxisFormatter(maxValue);
337
- const maxLabel = formatter(maxValue);
372
+ const maxLabel = chartOptions._preComputedYAxisLabels?.[0] ??
373
+ (chartOptions.yAxisLabelFormatter ? chartOptions.yAxisLabelFormatter(maxValue) : this.getSmartYAxisFormatter(maxValue)(maxValue));
338
374
  const yAxisWidth = ctx.measureText(maxLabel).width + 10;
339
375
  chartX += yAxisWidth;
340
376
  chartWidth -= yAxisWidth;
@@ -366,8 +402,8 @@ class ChartNode extends layout_canvas_util.BoxNode {
366
402
  ctx.stroke();
367
403
  if (chartOptions?.showYAxis) {
368
404
  const value = maxValue - (maxValue / 5) * i;
369
- const formatter = chartOptions.yAxisLabelFormatter || this.getSmartYAxisFormatter(maxValue);
370
- const label = formatter(value);
405
+ const label = chartOptions._preComputedYAxisLabels?.[i] ??
406
+ (chartOptions.yAxisLabelFormatter ? chartOptions.yAxisLabelFormatter(value) : this.getSmartYAxisFormatter(maxValue)(value));
371
407
  text_canvas_util.TextNode.renderSimpleText(ctx, label, chartX - 5, gridY, {
372
408
  color: chartOptions.yAxisColor || chartOptions.axisColor || '#000',
373
409
  fontSize: chartOptions.yAxisFontSize || 12,
@@ -407,12 +443,19 @@ class ChartNode extends layout_canvas_util.BoxNode {
407
443
  });
408
444
  // Render labels
409
445
  if (chartOptions?.showLabels) {
410
- const { renderLabelItem, xAxisLabelFormatter } = chartOptions;
411
446
  labels.forEach((label, index) => {
412
447
  const pointX = chartX + index * pointSpacing;
413
- const displayLabel = xAxisLabelFormatter ? xAxisLabelFormatter(label, index) : label;
414
- if (renderLabelItem) {
415
- const labelNode = renderLabelItem({ item: label, index });
448
+ const displayLabel = chartOptions._preComputedXAxisLabels?.[index] ?? (chartOptions.xAxisLabelFormatter ? chartOptions.xAxisLabelFormatter(label, index) : label);
449
+ const preComputedLabelDesc = chartOptions._preComputedLabelItems?.[index];
450
+ if (preComputedLabelDesc) {
451
+ const labelNode = buildDescriptorTree(preComputedLabelDesc);
452
+ labelNode.processInitialChildren();
453
+ labelNode.node.calculateLayout(undefined, undefined, common_const.Style.Direction.LTR);
454
+ const layout = labelNode.node.getComputedLayout();
455
+ labelNode.render(ctx, pointX - layout.width / 2, chartY + finalChartHeight + labelHeight / 2 - layout.height / 2);
456
+ }
457
+ else if (chartOptions.renderLabelItem) {
458
+ const labelNode = chartOptions.renderLabelItem({ item: label, index });
416
459
  if (labelNode) {
417
460
  labelNode.processInitialChildren();
418
461
  labelNode.node.calculateLayout(undefined, undefined, common_const.Style.Direction.LTR);
@@ -466,13 +509,20 @@ class ChartNode extends layout_canvas_util.BoxNode {
466
509
  ctx.stroke();
467
510
  // Render labels
468
511
  if (chartOptions?.showLabels) {
469
- const { renderLabelItem } = chartOptions;
470
512
  const labelAngle = startAngle + sliceAngle / 2;
471
513
  const labelRadius = radius * 0.7;
472
514
  const labelX = centerX + Math.cos(labelAngle) * labelRadius;
473
515
  const labelY = centerY + Math.sin(labelAngle) * labelRadius;
474
- if (renderLabelItem) {
475
- const labelNode = renderLabelItem({ item: point, index });
516
+ const preComputedLabelDesc = chartOptions._preComputedLabelItems?.[index];
517
+ if (preComputedLabelDesc) {
518
+ const labelNode = buildDescriptorTree(preComputedLabelDesc);
519
+ labelNode.processInitialChildren();
520
+ labelNode.node.calculateLayout(undefined, undefined, common_const.Style.Direction.LTR);
521
+ const layout = labelNode.node.getComputedLayout();
522
+ labelNode.render(ctx, labelX - layout.width / 2, labelY - layout.height / 2);
523
+ }
524
+ else if (chartOptions.renderLabelItem) {
525
+ const labelNode = chartOptions.renderLabelItem({ item: point, index });
476
526
  if (labelNode) {
477
527
  labelNode.processInitialChildren();
478
528
  labelNode.node.calculateLayout(undefined, undefined, common_const.Style.Direction.LTR);
@@ -527,13 +577,20 @@ class ChartNode extends layout_canvas_util.BoxNode {
527
577
  ctx.stroke();
528
578
  // Render labels
529
579
  if (chartOptions?.showLabels) {
530
- const { renderLabelItem } = chartOptions;
531
580
  const labelAngle = startAngle + sliceAngle / 2;
532
581
  const labelRadius = innerRadius + (outerRadius - innerRadius) / 2;
533
582
  const labelX = centerX + Math.cos(labelAngle) * labelRadius;
534
583
  const labelY = centerY + Math.sin(labelAngle) * labelRadius;
535
- if (renderLabelItem) {
536
- const labelNode = renderLabelItem({ item: point, index });
584
+ const preComputedLabelDesc = chartOptions._preComputedLabelItems?.[index];
585
+ if (preComputedLabelDesc) {
586
+ const labelNode = buildDescriptorTree(preComputedLabelDesc);
587
+ labelNode.processInitialChildren();
588
+ labelNode.node.calculateLayout(undefined, undefined, common_const.Style.Direction.LTR);
589
+ const layout = labelNode.node.getComputedLayout();
590
+ labelNode.render(ctx, labelX - layout.width / 2, labelY - layout.height / 2);
591
+ }
592
+ else if (chartOptions.renderLabelItem) {
593
+ const labelNode = chartOptions.renderLabelItem({ item: point, index });
537
594
  if (labelNode) {
538
595
  labelNode.processInitialChildren();
539
596
  labelNode.node.calculateLayout(undefined, undefined, common_const.Style.Direction.LTR);
@@ -558,7 +615,25 @@ class ChartNode extends layout_canvas_util.BoxNode {
558
615
  }
559
616
  }
560
617
  renderLegend(ctx, x, y, width, height) {
561
- const { renderLegendItem } = this.chartOptions;
618
+ const { renderLegendItem, _preComputedLegendItems } = this.chartOptions;
619
+ if (_preComputedLegendItems) {
620
+ const finalNodes = _preComputedLegendItems.filter((desc) => !!desc).map(desc => buildDescriptorTree(desc));
621
+ if (finalNodes.length > 0) {
622
+ const legendContainer = new layout_canvas_util.RowNode({
623
+ children: finalNodes,
624
+ width,
625
+ height,
626
+ justifyContent: common_const.Style.Justify.Center,
627
+ alignItems: common_const.Style.Align.Center,
628
+ flexWrap: common_const.Style.Wrap.Wrap,
629
+ gap: 10,
630
+ });
631
+ legendContainer.processInitialChildren();
632
+ legendContainer.node.calculateLayout(width, height, common_const.Style.Direction.LTR);
633
+ legendContainer.render(ctx, x, y);
634
+ }
635
+ return;
636
+ }
562
637
  if (renderLegendItem) {
563
638
  let legendNodes;
564
639
  if (this.chartType === 'bar' || this.chartType === 'line') {
@@ -1 +1 @@
1
- {"version":3,"file":"chart.canvas.util.js","sources":["../../../../src/canvas/chart.canvas.util.ts"],"sourcesContent":["import { BoxNode, RowNode } from '@/canvas/layout.canvas.util.js'\nimport type { BaseProps, CartesianChartData, ChartDataset, ChartProps, ChartType, PieChartDataPoint, NodeDescriptor } from '@/canvas/canvas.type.js'\nimport type { CanvasRenderingContext2D } from 'skia-canvas'\nimport { Style } from '@/constant/common.const.js'\nimport { TextNode } from '@/canvas/text.canvas.util.js'\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']\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 }\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']\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 formatter = chartOptions.yAxisLabelFormatter || this.getSmartYAxisFormatter(maxValue)\n const maxLabel = formatter(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 formatter = chartOptions.yAxisLabelFormatter || this.getSmartYAxisFormatter(maxValue)\n const label = formatter(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 { renderValueItem } = chartOptions\n const valueX = barX + barWidth / 2\n const valueY = barY - 5 // 5px padding above bar\n\n if (renderValueItem) {\n const valueNode = 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 { renderLabelItem, xAxisLabelFormatter } = chartOptions\n const displayLabel = xAxisLabelFormatter ? xAxisLabelFormatter(label, index) : label\n if (renderLabelItem) {\n const labelNode = 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']\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 formatter = chartOptions.yAxisLabelFormatter || this.getSmartYAxisFormatter(maxValue)\n const maxLabel = formatter(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 formatter = chartOptions.yAxisLabelFormatter || this.getSmartYAxisFormatter(maxValue)\n const label = formatter(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 const { renderLabelItem, xAxisLabelFormatter } = chartOptions\n labels.forEach((label, index) => {\n const pointX = chartX + index * pointSpacing\n const displayLabel = xAxisLabelFormatter ? xAxisLabelFormatter(label, index) : label\n if (renderLabelItem) {\n const labelNode = 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']\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 { renderLabelItem } = chartOptions\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 if (renderLabelItem) {\n const labelNode = 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']\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 { renderLabelItem } = chartOptions\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 if (renderLabelItem) {\n const labelNode = 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 } = this.chartOptions\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): NodeDescriptor => ({\n __type: 'Chart',\n props: props as any,\n})\n"],"names":["BoxNode","Style","TextNode","RowNode"],"mappings":"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"}
1
+ {"version":3,"file":"chart.canvas.util.js","sources":["../../../../src/canvas/chart.canvas.util.ts"],"sourcesContent":["import { BoxNode, ColumnNode, RowNode } from '@/canvas/layout.canvas.util.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.util.js'\nimport { ImageNode } from '@/canvas/image.canvas.util.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.util.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,4 +1,4 @@
1
- import type { GridProps, GridItemProps, NodeDescriptor } from '../canvas/canvas.type.js';
1
+ import type { GridProps, GridItemProps, CanvasElement } from '../canvas/canvas.type.js';
2
2
  import { BoxNode, RowNode } from '../canvas/layout.canvas.util.js';
3
3
  /**
4
4
  * GridItem Node. Theoretically just a BoxNode but typed differently in factory.
@@ -11,7 +11,7 @@ export declare class GridItemNode extends BoxNode {
11
11
  /**
12
12
  * Factory for GridItem.
13
13
  */
14
- export declare const GridItem: ({ children, ...rest }: GridItemProps) => NodeDescriptor;
14
+ export declare const GridItem: ({ children, ...rest }: GridItemProps) => CanvasElement;
15
15
  /**
16
16
  * Grid layout node that arranges children in a 2D grid.
17
17
  * Implements a simplified version of the CSS Grid Layout algorithm.
@@ -42,5 +42,5 @@ export declare class GridNode extends RowNode {
42
42
  /**
43
43
  * Factory function to create a new GridNode instance.
44
44
  */
45
- export declare const Grid: ({ children, ...rest }: GridProps) => NodeDescriptor;
45
+ export declare const Grid: ({ children, ...rest }: GridProps) => CanvasElement;
46
46
  //# sourceMappingURL=grid.canvas.util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"grid.canvas.util.d.ts","sourceRoot":"","sources":["../../../src/canvas/grid.canvas.util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAiB,aAAa,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAEtG,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAUjE;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,OAAO;gBAC3B,KAAK,EAAE,aAAa;CAMjC;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAI,uBAAuB,aAAa,KAAG,cAI9D,CAAA;AAEF;;;GAGG;AACH,qBAAa,QAAS,SAAQ,OAAO;IACnC;;;OAGG;gBACS,KAAK,EAAE,SAAS;IAQ5B;;OAEG;IACH,OAAO,CAAC,UAAU;IAwBlB;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;OAEG;cACgB,+BAA+B;IAoTlD;;OAEG;IACH,OAAO,CAAC,aAAa;CAkCtB;AAED;;GAEG;AACH,eAAO,MAAM,IAAI,GAAI,uBAAuB,SAAS,KAAG,cAItD,CAAA"}
1
+ {"version":3,"file":"grid.canvas.util.d.ts","sourceRoot":"","sources":["../../../src/canvas/grid.canvas.util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAiB,aAAa,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAErG,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAUjE;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,OAAO;gBAC3B,KAAK,EAAE,aAAa;CAMjC;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAI,uBAAuB,aAAa,KAAG,aAI9D,CAAA;AAEF;;;GAGG;AACH,qBAAa,QAAS,SAAQ,OAAO;IACnC;;;OAGG;gBACS,KAAK,EAAE,SAAS;IAQ5B;;OAEG;IACH,OAAO,CAAC,UAAU;IAwBlB;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;OAEG;cACgB,+BAA+B;IAoTlD;;OAEG;IACH,OAAO,CAAC,aAAa;CAkCtB;AAED;;GAEG;AACH,eAAO,MAAM,IAAI,GAAI,uBAAuB,SAAS,KAAG,aAItD,CAAA"}