@lytjs/plugin-chart 6.5.0 → 6.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.
package/dist/index.cjs CHANGED
@@ -24,10 +24,8 @@ var DEFAULT_CONFIG = {
24
24
  padding: 40
25
25
  };
26
26
  function createChart(canvas, config, options = {}) {
27
- const {
28
- defaultAnimationDuration = 500
29
- } = options;
30
- let currentConfig = { ...DEFAULT_CONFIG, ...config };
27
+ const { defaultAnimationDuration = 500 } = options;
28
+ const currentConfig = { ...DEFAULT_CONFIG, ...config };
31
29
  let animationFrame = null;
32
30
  function getColor(datasetIndex, dataIndex) {
33
31
  const dataset = currentConfig.datasets[datasetIndex];
@@ -59,11 +57,7 @@ function createChart(canvas, config, options = {}) {
59
57
  ctx.fillStyle = "#666";
60
58
  ctx.font = "12px sans-serif";
61
59
  ctx.textAlign = "right";
62
- ctx.fillText(
63
- Math.round(maxValue - maxValue / 5 * i).toString(),
64
- padding - 10,
65
- y + 4
66
- );
60
+ ctx.fillText(Math.round(maxValue - maxValue / 5 * i).toString(), padding - 10, y + 4);
67
61
  }
68
62
  }
69
63
  const totalBars = datasets.reduce((sum, ds) => sum + ds.data.length, 0);
@@ -79,11 +73,7 @@ function createChart(canvas, config, options = {}) {
79
73
  ctx.fillStyle = "#666";
80
74
  ctx.font = "11px sans-serif";
81
75
  ctx.textAlign = "center";
82
- ctx.fillText(
83
- point.label,
84
- x + barWidth / 2,
85
- height - padding + 20
86
- );
76
+ ctx.fillText(point.label, x + barWidth / 2, height - padding + 20);
87
77
  x += barWidth + gap;
88
78
  });
89
79
  });
@@ -110,11 +100,7 @@ function createChart(canvas, config, options = {}) {
110
100
  ctx.fillStyle = "#666";
111
101
  ctx.font = "12px sans-serif";
112
102
  ctx.textAlign = "right";
113
- ctx.fillText(
114
- Math.round(maxValue - maxValue / 5 * i).toString(),
115
- padding - 10,
116
- y + 4
117
- );
103
+ ctx.fillText(Math.round(maxValue - maxValue / 5 * i).toString(), padding - 10, y + 4);
118
104
  }
119
105
  }
120
106
  datasets.forEach((dataset, datasetIndex) => {
@@ -140,11 +126,7 @@ function createChart(canvas, config, options = {}) {
140
126
  ctx.fillStyle = "#666";
141
127
  ctx.font = "11px sans-serif";
142
128
  ctx.textAlign = "center";
143
- ctx.fillText(
144
- point.label,
145
- x,
146
- height - padding + 20
147
- );
129
+ ctx.fillText(point.label, x, height - padding + 20);
148
130
  });
149
131
  ctx.stroke();
150
132
  });
@@ -221,6 +203,7 @@ function createChart(canvas, config, options = {}) {
221
203
  ctx.textAlign = "left";
222
204
  ctx.fillText(point.label, legendX + 18, legendY + 10);
223
205
  legendX += 100;
206
+ itemIndex++;
224
207
  });
225
208
  });
226
209
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["definePlugin"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * @lytjs/plugin-chart\r\n *\r\n * LytJS official chart plugin for rendering charts using Canvas API with zero dependencies.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { definePlugin } from '@lytjs/core';\r\nimport type {\r\n ChartDataPoint,\r\n ChartDataset,\r\n ChartType,\r\n ChartConfig,\r\n ChartInstance,\r\n ChartPluginOptions,\r\n} from './types';\r\n\r\n// 默认颜色 palette\r\nconst DEFAULT_COLORS = [\r\n '#1890ff',\r\n '#52c41a',\r\n '#faad14',\r\n '#ff4d4f',\r\n '#722ed1',\r\n '#13c2c2',\r\n '#eb2f96',\r\n '#fa541c',\r\n];\r\n\r\n// 默认配置\r\nconst DEFAULT_CONFIG = {\r\n showLegend: true,\r\n showGrid: true,\r\n width: 400,\r\n height: 300,\r\n animationDuration: 500,\r\n padding: 40,\r\n};\r\n\r\n/**\r\n * 创建图表实例\r\n */\r\nfunction createChart(\r\n canvas: HTMLCanvasElement,\r\n config: ChartConfig,\r\n options: ChartPluginOptions = {}\r\n): ChartInstance {\r\n const {\r\n defaultAnimationDuration = 500,\r\n } = options;\r\n\r\n let currentConfig = { ...DEFAULT_CONFIG, ...config };\r\n let animationFrame: number | null = null;\r\n\r\n // 获取颜色\r\n function getColor(datasetIndex: number, dataIndex: number): string {\r\n const dataset = currentConfig.datasets[datasetIndex];\r\n const dataPoint = dataset?.data?.[dataIndex];\r\n if (dataPoint?.color) return dataPoint.color;\r\n if (dataset?.color) return dataset.color;\r\n const colorIndex = dataIndex % DEFAULT_COLORS.length;\r\n return DEFAULT_COLORS[colorIndex] || '#1890ff';\r\n }\r\n\r\n // 绘制柱状图\r\n function drawBarChart(ctx: CanvasRenderingContext2D, progress: number = 1) {\r\n const { width, height, padding, datasets, showGrid } = currentConfig;\r\n const ctxWidth = width - padding * 2;\r\n const ctxHeight = height - padding * 2;\r\n\r\n // 找到最大值\r\n let maxValue = 0;\r\n datasets.forEach((dataset) => {\r\n dataset.data.forEach((point) => {\r\n if (point.value > maxValue) maxValue = point.value;\r\n });\r\n });\r\n\r\n // 绘制网格线\r\n if (showGrid) {\r\n ctx.strokeStyle = '#e8e8e8';\r\n ctx.lineWidth = 1;\r\n for (let i = 0; i <= 5; i++) {\r\n const y = padding + (ctxHeight / 5) * i;\r\n ctx.beginPath();\r\n ctx.moveTo(padding, y);\r\n ctx.lineTo(width - padding, y);\r\n ctx.stroke();\r\n\r\n // Y轴标签\r\n ctx.fillStyle = '#666';\r\n ctx.font = '12px sans-serif';\r\n ctx.textAlign = 'right';\r\n ctx.fillText(\r\n Math.round((maxValue - (maxValue / 5) * i)).toString(),\r\n padding - 10,\r\n y + 4\r\n );\r\n }\r\n }\r\n\r\n // 绘制柱状图\r\n const totalBars = datasets.reduce((sum, ds) => sum + ds.data.length, 0);\r\n const barWidth = ctxWidth / totalBars * 0.7;\r\n const gap = ctxWidth / totalBars * 0.3;\r\n\r\n let x = padding + gap / 2;\r\n\r\n datasets.forEach((dataset, datasetIndex) => {\r\n dataset.data.forEach((point, dataIndex) => {\r\n const barHeight = (point.value / maxValue) * ctxHeight * progress;\r\n const y = height - padding - barHeight;\r\n\r\n ctx.fillStyle = getColor(datasetIndex, dataIndex);\r\n ctx.fillRect(x, y, barWidth, barHeight);\r\n\r\n // X轴标签\r\n ctx.fillStyle = '#666';\r\n ctx.font = '11px sans-serif';\r\n ctx.textAlign = 'center';\r\n ctx.fillText(\r\n point.label,\r\n x + barWidth / 2,\r\n height - padding + 20\r\n );\r\n\r\n x += barWidth + gap;\r\n });\r\n });\r\n }\r\n\r\n // 绘制折线图\r\n function drawLineChart(ctx: CanvasRenderingContext2D, progress: number = 1) {\r\n const { width, height, padding, datasets, showGrid } = currentConfig;\r\n const ctxWidth = width - padding * 2;\r\n const ctxHeight = height - padding * 2;\r\n\r\n // 找到最大值\r\n let maxValue = 0;\r\n datasets.forEach((dataset) => {\r\n dataset.data.forEach((point) => {\r\n if (point.value > maxValue) maxValue = point.value;\r\n });\r\n });\r\n\r\n // 绘制网格线\r\n if (showGrid) {\r\n ctx.strokeStyle = '#e8e8e8';\r\n ctx.lineWidth = 1;\r\n for (let i = 0; i <= 5; i++) {\r\n const y = padding + (ctxHeight / 5) * i;\r\n ctx.beginPath();\r\n ctx.moveTo(padding, y);\r\n ctx.lineTo(width - padding, y);\r\n ctx.stroke();\r\n\r\n // Y轴标签\r\n ctx.fillStyle = '#666';\r\n ctx.font = '12px sans-serif';\r\n ctx.textAlign = 'right';\r\n ctx.fillText(\r\n Math.round((maxValue - (maxValue / 5) * i)).toString(),\r\n padding - 10,\r\n y + 4\r\n );\r\n }\r\n }\r\n\r\n // 绘制折线\r\n datasets.forEach((dataset, datasetIndex) => {\r\n const color = getColor(datasetIndex, 0);\r\n ctx.strokeStyle = color;\r\n ctx.fillStyle = color;\r\n ctx.lineWidth = dataset.borderWidth || 2;\r\n ctx.beginPath();\r\n\r\n const stepX = ctxWidth / (dataset.data.length - 1);\r\n\r\n dataset.data.forEach((point, index) => {\r\n const x = padding + stepX * index;\r\n const y = height - padding - (point.value / maxValue) * ctxHeight * progress;\r\n\r\n if (index === 0) {\r\n ctx.moveTo(x, y);\r\n } else {\r\n ctx.lineTo(x, y);\r\n }\r\n\r\n // 绘制点\r\n ctx.beginPath();\r\n ctx.arc(x, y, 4, 0, Math.PI * 2);\r\n ctx.fill();\r\n ctx.beginPath();\r\n ctx.moveTo(x, y);\r\n\r\n // X轴标签\r\n ctx.fillStyle = '#666';\r\n ctx.font = '11px sans-serif';\r\n ctx.textAlign = 'center';\r\n ctx.fillText(\r\n point.label,\r\n x,\r\n height - padding + 20\r\n );\r\n });\r\n\r\n ctx.stroke();\r\n });\r\n }\r\n\r\n // 绘制饼图\r\n function drawPieChart(ctx: CanvasRenderingContext2D, progress: number = 1) {\r\n const { width, height, padding, datasets } = currentConfig;\r\n const centerX = width / 2;\r\n const centerY = height / 2;\r\n const radius = Math.min(width, height) / 2 - padding;\r\n\r\n // 计算总值\r\n let totalValue = 0;\r\n datasets.forEach((dataset) => {\r\n dataset.data.forEach((point) => {\r\n totalValue += point.value;\r\n });\r\n });\r\n\r\n let currentAngle = -Math.PI / 2; // 从顶部开始\r\n\r\n datasets.forEach((dataset, datasetIndex) => {\r\n dataset.data.forEach((point, dataIndex) => {\r\n const sliceAngle = (point.value / totalValue) * Math.PI * 2 * progress;\r\n\r\n ctx.fillStyle = getColor(datasetIndex, dataIndex);\r\n ctx.beginPath();\r\n ctx.moveTo(centerX, centerY);\r\n ctx.arc(centerX, centerY, radius, currentAngle, currentAngle + sliceAngle);\r\n ctx.closePath();\r\n ctx.fill();\r\n\r\n currentAngle += sliceAngle;\r\n });\r\n });\r\n }\r\n\r\n // 绘制环形图\r\n function drawDoughnutChart(ctx: CanvasRenderingContext2D, progress: number = 1) {\r\n const { width, height, padding, datasets } = currentConfig;\r\n const centerX = width / 2;\r\n const centerY = height / 2;\r\n const outerRadius = Math.min(width, height) / 2 - padding;\r\n const innerRadius = outerRadius * 0.5;\r\n\r\n // 计算总值\r\n let totalValue = 0;\r\n datasets.forEach((dataset) => {\r\n dataset.data.forEach((point) => {\r\n totalValue += point.value;\r\n });\r\n });\r\n\r\n let currentAngle = -Math.PI / 2;\r\n\r\n datasets.forEach((dataset, datasetIndex) => {\r\n dataset.data.forEach((point, dataIndex) => {\r\n const sliceAngle = (point.value / totalValue) * Math.PI * 2 * progress;\r\n\r\n ctx.fillStyle = getColor(datasetIndex, dataIndex);\r\n ctx.beginPath();\r\n ctx.arc(centerX, centerY, outerRadius, currentAngle, currentAngle + sliceAngle);\r\n ctx.arc(centerX, centerY, innerRadius, currentAngle + sliceAngle, currentAngle, true);\r\n ctx.closePath();\r\n ctx.fill();\r\n\r\n currentAngle += sliceAngle;\r\n });\r\n });\r\n }\r\n\r\n // 绘制标题\r\n function drawTitle(ctx: CanvasRenderingContext2D) {\r\n if (!currentConfig.title) return;\r\n\r\n ctx.fillStyle = '#333';\r\n ctx.font = 'bold 16px sans-serif';\r\n ctx.textAlign = 'center';\r\n ctx.fillText(currentConfig.title, currentConfig.width / 2, 25);\r\n }\r\n\r\n // 绘制图例\r\n function drawLegend(ctx: CanvasRenderingContext2D) {\r\n if (!currentConfig.showLegend) return;\r\n\r\n let legendX = currentConfig.padding;\r\n const legendY = currentConfig.height - 20;\r\n let itemIndex = 0;\r\n\r\n currentConfig.datasets.forEach((dataset, datasetIndex) => {\r\n dataset.data.forEach((point, dataIndex) => {\r\n const color = getColor(datasetIndex, dataIndex);\r\n\r\n // 绘制颜色方块\r\n ctx.fillStyle = color;\r\n ctx.fillRect(legendX, legendY, 12, 12);\r\n\r\n // 绘制标签\r\n ctx.fillStyle = '#666';\r\n ctx.font = '12px sans-serif';\r\n ctx.textAlign = 'left';\r\n ctx.fillText(point.label, legendX + 18, legendY + 10);\r\n\r\n legendX += 100;\r\n itemIndex++;\r\n });\r\n });\r\n }\r\n\r\n // 渲染函数\r\n function render() {\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return;\r\n\r\n // 设置 canvas 尺寸\r\n canvas.width = currentConfig.width;\r\n canvas.height = currentConfig.height;\r\n\r\n // 清空画布\r\n ctx.clearRect(0, 0, currentConfig.width, currentConfig.height);\r\n\r\n const startTime = Date.now();\r\n const duration = currentConfig.animationDuration || defaultAnimationDuration;\r\n\r\n function animate() {\r\n if (!ctx) return;\r\n \r\n const elapsed = Date.now() - startTime;\r\n const progress = Math.min(elapsed / duration, 1);\r\n\r\n ctx.clearRect(0, 0, currentConfig.width, currentConfig.height);\r\n\r\n // 绘制标题\r\n drawTitle(ctx);\r\n\r\n // 绘制图表\r\n switch (currentConfig.type) {\r\n case 'bar':\r\n drawBarChart(ctx, progress);\r\n break;\r\n case 'line':\r\n drawLineChart(ctx, progress);\r\n break;\r\n case 'pie':\r\n drawPieChart(ctx, progress);\r\n break;\r\n case 'doughnut':\r\n drawDoughnutChart(ctx, progress);\r\n break;\r\n }\r\n\r\n // 绘制图例\r\n drawLegend(ctx);\r\n\r\n if (progress < 1) {\r\n animationFrame = requestAnimationFrame(animate);\r\n }\r\n }\r\n\r\n animate();\r\n }\r\n\r\n // 更新数据\r\n function updateData(datasets: ChartDataset[]) {\r\n currentConfig.datasets = datasets;\r\n render();\r\n }\r\n\r\n // 销毁\r\n function destroy() {\r\n if (animationFrame) {\r\n cancelAnimationFrame(animationFrame);\r\n }\r\n }\r\n\r\n // 初始化渲染\r\n render();\r\n\r\n return {\r\n render,\r\n updateData,\r\n destroy,\r\n getCanvas: () => canvas,\r\n };\r\n}\r\n\r\nconst pluginChart = definePlugin({\r\n name: 'chart',\r\n version: '6.0.0',\r\n description: 'LytJS official chart plugin for rendering charts using Canvas API',\r\n author: 'LytJS Team',\r\n keywords: ['lytjs', 'chart', 'canvas', 'visualization'],\r\n schema: {\r\n type: 'object',\r\n object: {\r\n properties: {\r\n defaultColors: { \r\n type: 'array', \r\n default: DEFAULT_COLORS,\r\n },\r\n defaultAnimationDuration: { type: 'number', default: 500 },\r\n responsive: { type: 'boolean', default: true },\r\n },\r\n },\r\n },\r\n install(app, options) {\r\n const chartOptions = options as ChartPluginOptions;\r\n\r\n // 提供创建图表的方法\r\n app.provide('lyt-chart', {\r\n create: (canvas: HTMLCanvasElement, config: ChartConfig) =>\r\n createChart(canvas, config, chartOptions),\r\n });\r\n\r\n // 挂载到全局属性\r\n app.config.globalProperties.$chart = {\r\n create: (canvas: HTMLCanvasElement, config: ChartConfig) =>\r\n createChart(canvas, config, chartOptions),\r\n };\r\n },\r\n});\r\n\r\nexport default pluginChart;\r\nexport type {\r\n ChartDataPoint,\r\n ChartDataset,\r\n ChartType,\r\n ChartConfig,\r\n ChartInstance,\r\n ChartPluginOptions,\r\n};\r\nexport { createChart, DEFAULT_COLORS };\r\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["definePlugin"],"mappings":";;;;;;;AAmBA,IAAM,cAAA,GAAiB;AAAA,EACrB,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF;AAGA,IAAM,cAAA,GAAiB;AAAA,EACrB,UAAA,EAAY,IAAA;AAAA,EACZ,QAAA,EAAU,IAAA;AAAA,EACV,KAAA,EAAO,GAAA;AAAA,EACP,MAAA,EAAQ,GAAA;AAAA,EACR,iBAAA,EAAmB,GAAA;AAAA,EACnB,OAAA,EAAS;AACX,CAAA;AAKA,SAAS,WAAA,CACP,MAAA,EACA,MAAA,EACA,OAAA,GAA8B,EAAC,EAChB;AACf,EAAA,MAAM,EAAE,wBAAA,GAA2B,GAAA,EAAI,GAAI,OAAA;AAE3C,EAAA,MAAM,aAAA,GAAgB,EAAE,GAAG,cAAA,EAAgB,GAAG,MAAA,EAAO;AACrD,EAAA,IAAI,cAAA,GAAgC,IAAA;AAGpC,EAAA,SAAS,QAAA,CAAS,cAAsB,SAAA,EAA2B;AACjE,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,QAAA,CAAS,YAAY,CAAA;AACnD,IAAA,MAAM,SAAA,GAAY,OAAA,EAAS,IAAA,GAAO,SAAS,CAAA;AAC3C,IAAA,IAAI,SAAA,EAAW,KAAA,EAAO,OAAO,SAAA,CAAU,KAAA;AACvC,IAAA,IAAI,OAAA,EAAS,KAAA,EAAO,OAAO,OAAA,CAAQ,KAAA;AACnC,IAAA,MAAM,UAAA,GAAa,YAAY,cAAA,CAAe,MAAA;AAC9C,IAAA,OAAO,cAAA,CAAe,UAAU,CAAA,IAAK,SAAA;AAAA,EACvC;AAGA,EAAA,SAAS,YAAA,CAAa,GAAA,EAA+B,QAAA,GAAmB,CAAA,EAAG;AACzE,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,UAAS,GAAI,aAAA;AACvD,IAAA,MAAM,QAAA,GAAW,QAAQ,OAAA,GAAU,CAAA;AACnC,IAAA,MAAM,SAAA,GAAY,SAAS,OAAA,GAAU,CAAA;AAGrC,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC5B,MAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC9B,QAAA,IAAI,KAAA,CAAM,KAAA,GAAQ,QAAA,EAAU,QAAA,GAAW,KAAA,CAAM,KAAA;AAAA,MAC/C,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAGD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,GAAA,CAAI,WAAA,GAAc,SAAA;AAClB,MAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,QAAA,MAAM,CAAA,GAAI,OAAA,GAAW,SAAA,GAAY,CAAA,GAAK,CAAA;AACtC,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,SAAS,CAAC,CAAA;AACrB,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,OAAA,EAAS,CAAC,CAAA;AAC7B,QAAA,GAAA,CAAI,MAAA,EAAO;AAGX,QAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,QAAA,GAAA,CAAI,IAAA,GAAO,iBAAA;AACX,QAAA,GAAA,CAAI,SAAA,GAAY,OAAA;AAChB,QAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA,GAAY,QAAA,GAAW,CAAA,GAAK,CAAC,CAAA,CAAE,QAAA,EAAS,EAAG,OAAA,GAAU,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,MACxF;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,EAAK,OAAO,GAAA,GAAM,EAAA,CAAG,IAAA,CAAK,MAAA,EAAQ,CAAC,CAAA;AACtE,IAAA,MAAM,QAAA,GAAY,WAAW,SAAA,GAAa,GAAA;AAC1C,IAAA,MAAM,GAAA,GAAO,WAAW,SAAA,GAAa,GAAA;AAErC,IAAA,IAAI,CAAA,GAAI,UAAU,GAAA,GAAM,CAAA;AAExB,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,EAAS,YAAA,KAAiB;AAC1C,MAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,EAAO,SAAA,KAAc;AACzC,QAAA,MAAM,SAAA,GAAa,KAAA,CAAM,KAAA,GAAQ,QAAA,GAAY,SAAA,GAAY,QAAA;AACzD,QAAA,MAAM,CAAA,GAAI,SAAS,OAAA,GAAU,SAAA;AAE7B,QAAA,GAAA,CAAI,SAAA,GAAY,QAAA,CAAS,YAAA,EAAc,SAAS,CAAA;AAChD,QAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,QAAA,EAAU,SAAS,CAAA;AAGtC,QAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,QAAA,GAAA,CAAI,IAAA,GAAO,iBAAA;AACX,QAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,QAAA,GAAA,CAAI,QAAA,CAAS,MAAM,KAAA,EAAO,CAAA,GAAI,WAAW,CAAA,EAAG,MAAA,GAAS,UAAU,EAAE,CAAA;AAEjE,QAAA,CAAA,IAAK,QAAA,GAAW,GAAA;AAAA,MAClB,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,SAAS,aAAA,CAAc,GAAA,EAA+B,QAAA,GAAmB,CAAA,EAAG;AAC1E,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,UAAS,GAAI,aAAA;AACvD,IAAA,MAAM,QAAA,GAAW,QAAQ,OAAA,GAAU,CAAA;AACnC,IAAA,MAAM,SAAA,GAAY,SAAS,OAAA,GAAU,CAAA;AAGrC,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC5B,MAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC9B,QAAA,IAAI,KAAA,CAAM,KAAA,GAAQ,QAAA,EAAU,QAAA,GAAW,KAAA,CAAM,KAAA;AAAA,MAC/C,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAGD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,GAAA,CAAI,WAAA,GAAc,SAAA;AAClB,MAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,QAAA,MAAM,CAAA,GAAI,OAAA,GAAW,SAAA,GAAY,CAAA,GAAK,CAAA;AACtC,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,SAAS,CAAC,CAAA;AACrB,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,OAAA,EAAS,CAAC,CAAA;AAC7B,QAAA,GAAA,CAAI,MAAA,EAAO;AAGX,QAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,QAAA,GAAA,CAAI,IAAA,GAAO,iBAAA;AACX,QAAA,GAAA,CAAI,SAAA,GAAY,OAAA;AAChB,QAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA,GAAY,QAAA,GAAW,CAAA,GAAK,CAAC,CAAA,CAAE,QAAA,EAAS,EAAG,OAAA,GAAU,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,MACxF;AAAA,IACF;AAGA,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,EAAS,YAAA,KAAiB;AAC1C,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,YAAA,EAAc,CAAC,CAAA;AACtC,MAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,MAAA,GAAA,CAAI,SAAA,GAAY,QAAQ,WAAA,IAAe,CAAA;AACvC,MAAA,GAAA,CAAI,SAAA,EAAU;AAEd,MAAA,MAAM,KAAA,GAAQ,QAAA,IAAY,OAAA,CAAQ,IAAA,CAAK,MAAA,GAAS,CAAA,CAAA;AAEhD,MAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AACrC,QAAA,MAAM,CAAA,GAAI,UAAU,KAAA,GAAQ,KAAA;AAC5B,QAAA,MAAM,IAAI,MAAA,GAAS,OAAA,GAAW,KAAA,CAAM,KAAA,GAAQ,WAAY,SAAA,GAAY,QAAA;AAEpE,QAAA,IAAI,UAAU,CAAA,EAAG;AACf,UAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,QACjB,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,QACjB;AAGA,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,IAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAC/B,QAAA,GAAA,CAAI,IAAA,EAAK;AACT,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AAGf,QAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,QAAA,GAAA,CAAI,IAAA,GAAO,iBAAA;AACX,QAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,QAAA,GAAA,CAAI,SAAS,KAAA,CAAM,KAAA,EAAO,CAAA,EAAG,MAAA,GAAS,UAAU,EAAE,CAAA;AAAA,MACpD,CAAC,CAAA;AAED,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACb,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,SAAS,YAAA,CAAa,GAAA,EAA+B,QAAA,GAAmB,CAAA,EAAG;AACzE,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,UAAS,GAAI,aAAA;AAC7C,IAAA,MAAM,UAAU,KAAA,GAAQ,CAAA;AACxB,IAAA,MAAM,UAAU,MAAA,GAAS,CAAA;AACzB,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,MAAM,IAAI,CAAA,GAAI,OAAA;AAG7C,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC5B,MAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC9B,QAAA,UAAA,IAAc,KAAA,CAAM,KAAA;AAAA,MACtB,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,IAAI,YAAA,GAAe,CAAC,IAAA,CAAK,EAAA,GAAK,CAAA;AAE9B,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,EAAS,YAAA,KAAiB;AAC1C,MAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,EAAO,SAAA,KAAc;AACzC,QAAA,MAAM,aAAc,KAAA,CAAM,KAAA,GAAQ,UAAA,GAAc,IAAA,CAAK,KAAK,CAAA,GAAI,QAAA;AAE9D,QAAA,GAAA,CAAI,SAAA,GAAY,QAAA,CAAS,YAAA,EAAc,SAAS,CAAA;AAChD,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,SAAS,OAAO,CAAA;AAC3B,QAAA,GAAA,CAAI,IAAI,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,YAAA,EAAc,eAAe,UAAU,CAAA;AACzE,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,IAAA,EAAK;AAET,QAAA,YAAA,IAAgB,UAAA;AAAA,MAClB,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,SAAS,iBAAA,CAAkB,GAAA,EAA+B,QAAA,GAAmB,CAAA,EAAG;AAC9E,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,UAAS,GAAI,aAAA;AAC7C,IAAA,MAAM,UAAU,KAAA,GAAQ,CAAA;AACxB,IAAA,MAAM,UAAU,MAAA,GAAS,CAAA;AACzB,IAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,MAAM,IAAI,CAAA,GAAI,OAAA;AAClD,IAAA,MAAM,cAAc,WAAA,GAAc,GAAA;AAGlC,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC5B,MAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC9B,QAAA,UAAA,IAAc,KAAA,CAAM,KAAA;AAAA,MACtB,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,IAAI,YAAA,GAAe,CAAC,IAAA,CAAK,EAAA,GAAK,CAAA;AAE9B,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,EAAS,YAAA,KAAiB;AAC1C,MAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,EAAO,SAAA,KAAc;AACzC,QAAA,MAAM,aAAc,KAAA,CAAM,KAAA,GAAQ,UAAA,GAAc,IAAA,CAAK,KAAK,CAAA,GAAI,QAAA;AAE9D,QAAA,GAAA,CAAI,SAAA,GAAY,QAAA,CAAS,YAAA,EAAc,SAAS,CAAA;AAChD,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,IAAI,OAAA,EAAS,OAAA,EAAS,WAAA,EAAa,YAAA,EAAc,eAAe,UAAU,CAAA;AAC9E,QAAA,GAAA,CAAI,IAAI,OAAA,EAAS,OAAA,EAAS,aAAa,YAAA,GAAe,UAAA,EAAY,cAAc,IAAI,CAAA;AACpF,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,IAAA,EAAK;AAET,QAAA,YAAA,IAAgB,UAAA;AAAA,MAClB,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,SAAS,UAAU,GAAA,EAA+B;AAChD,IAAA,IAAI,CAAC,cAAc,KAAA,EAAO;AAE1B,IAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,IAAA,GAAA,CAAI,IAAA,GAAO,sBAAA;AACX,IAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,IAAA,GAAA,CAAI,SAAS,aAAA,CAAc,KAAA,EAAO,aAAA,CAAc,KAAA,GAAQ,GAAG,EAAE,CAAA;AAAA,EAC/D;AAGA,EAAA,SAAS,WAAW,GAAA,EAA+B;AACjD,IAAA,IAAI,CAAC,cAAc,UAAA,EAAY;AAE/B,IAAA,IAAI,UAAU,aAAA,CAAc,OAAA;AAC5B,IAAA,MAAM,OAAA,GAAU,cAAc,MAAA,GAAS,EAAA;AAGvC,IAAA,aAAA,CAAc,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,EAAS,YAAA,KAAiB;AACxD,MAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,EAAO,SAAA,KAAc;AACzC,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,YAAA,EAAc,SAAS,CAAA;AAG9C,QAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,QAAA,GAAA,CAAI,QAAA,CAAS,OAAA,EAAS,OAAA,EAAS,EAAA,EAAI,EAAE,CAAA;AAGrC,QAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,QAAA,GAAA,CAAI,IAAA,GAAO,iBAAA;AACX,QAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,QAAA,GAAA,CAAI,SAAS,KAAA,CAAM,KAAA,EAAO,OAAA,GAAU,EAAA,EAAI,UAAU,EAAE,CAAA;AAEpD,QAAA,OAAA,IAAW,GAAA;AACX,QAAA,SAAA,EAAA;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,SAAS,MAAA,GAAS;AAChB,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,GAAA,EAAK;AAGV,IAAA,MAAA,CAAO,QAAQ,aAAA,CAAc,KAAA;AAC7B,IAAA,MAAA,CAAO,SAAS,aAAA,CAAc,MAAA;AAG9B,IAAA,GAAA,CAAI,UAAU,CAAA,EAAG,CAAA,EAAG,aAAA,CAAc,KAAA,EAAO,cAAc,MAAM,CAAA;AAE7D,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,QAAA,GAAW,cAAc,iBAAA,IAAqB,wBAAA;AAEpD,IAAA,SAAS,OAAA,GAAU;AACjB,MAAA,IAAI,CAAC,GAAA,EAAK;AAEV,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC7B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,UAAU,CAAC,CAAA;AAE/C,MAAA,GAAA,CAAI,UAAU,CAAA,EAAG,CAAA,EAAG,aAAA,CAAc,KAAA,EAAO,cAAc,MAAM,CAAA;AAG7D,MAAA,SAAA,CAAU,GAAG,CAAA;AAGb,MAAA,QAAQ,cAAc,IAAA;AAAM,QAC1B,KAAK,KAAA;AACH,UAAA,YAAA,CAAa,KAAK,QAAQ,CAAA;AAC1B,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,aAAA,CAAc,KAAK,QAAQ,CAAA;AAC3B,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,YAAA,CAAa,KAAK,QAAQ,CAAA;AAC1B,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,iBAAA,CAAkB,KAAK,QAAQ,CAAA;AAC/B,UAAA;AAAA;AAIJ,MAAA,UAAA,CAAW,GAAG,CAAA;AAEd,MAAA,IAAI,WAAW,CAAA,EAAG;AAChB,QAAA,cAAA,GAAiB,sBAAsB,OAAO,CAAA;AAAA,MAChD;AAAA,IACF;AAEA,IAAA,OAAA,EAAQ;AAAA,EACV;AAGA,EAAA,SAAS,WAAW,QAAA,EAA0B;AAC5C,IAAA,aAAA,CAAc,QAAA,GAAW,QAAA;AACzB,IAAA,MAAA,EAAO;AAAA,EACT;AAGA,EAAA,SAAS,OAAA,GAAU;AACjB,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,oBAAA,CAAqB,cAAc,CAAA;AAAA,IACrC;AAAA,EACF;AAGA,EAAA,MAAA,EAAO;AAEP,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAW,MAAM;AAAA,GACnB;AACF;AAEA,IAAM,cAAcA,iBAAA,CAAa;AAAA,EAC/B,IAAA,EAAM,OAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,WAAA,EAAa,mEAAA;AAAA,EACb,MAAA,EAAQ,YAAA;AAAA,EACR,QAAA,EAAU,CAAC,OAAA,EAAS,OAAA,EAAS,UAAU,eAAe,CAAA;AAAA,EACtD,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ;AAAA,MACN,UAAA,EAAY;AAAA,QACV,aAAA,EAAe;AAAA,UACb,IAAA,EAAM,OAAA;AAAA,UACN,OAAA,EAAS;AAAA,SACX;AAAA,QACA,wBAAA,EAA0B,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,GAAA,EAAI;AAAA,QACzD,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,IAAA;AAAK;AAC/C;AACF,GACF;AAAA,EACA,OAAA,CAAQ,KAAK,OAAA,EAAS;AACpB,IAAA,MAAM,YAAA,GAAe,OAAA;AAGrB,IAAA,GAAA,CAAI,QAAQ,WAAA,EAAa;AAAA,MACvB,QAAQ,CAAC,MAAA,EAA2B,WAClC,WAAA,CAAY,MAAA,EAAQ,QAAQ,YAAY;AAAA,KAC3C,CAAA;AAGD,IAAA,GAAA,CAAI,MAAA,CAAO,iBAAiB,MAAA,GAAS;AAAA,MACnC,QAAQ,CAAC,MAAA,EAA2B,WAClC,WAAA,CAAY,MAAA,EAAQ,QAAQ,YAAY;AAAA,KAC5C;AAAA,EACF;AACF,CAAC,CAAA;AAED,IAAO,aAAA,GAAQ","file":"index.cjs","sourcesContent":["/**\n * @lytjs/plugin-chart\n *\n * LytJS official chart plugin for rendering charts using Canvas API with zero dependencies.\n *\n * @packageDocumentation\n */\n\nimport { definePlugin } from '@lytjs/core';\nimport type {\n ChartDataPoint,\n ChartDataset,\n ChartType,\n ChartConfig,\n ChartInstance,\n ChartPluginOptions,\n} from './types';\n\n// 默认颜色 palette\nconst DEFAULT_COLORS = [\n '#1890ff',\n '#52c41a',\n '#faad14',\n '#ff4d4f',\n '#722ed1',\n '#13c2c2',\n '#eb2f96',\n '#fa541c',\n];\n\n// 默认配置\nconst DEFAULT_CONFIG = {\n showLegend: true,\n showGrid: true,\n width: 400,\n height: 300,\n animationDuration: 500,\n padding: 40,\n};\n\n/**\n * 创建图表实例\n */\nfunction createChart(\n canvas: HTMLCanvasElement,\n config: ChartConfig,\n options: ChartPluginOptions = {},\n): ChartInstance {\n const { defaultAnimationDuration = 500 } = options;\n\n const currentConfig = { ...DEFAULT_CONFIG, ...config };\n let animationFrame: number | null = null;\n\n // 获取颜色\n function getColor(datasetIndex: number, dataIndex: number): string {\n const dataset = currentConfig.datasets[datasetIndex];\n const dataPoint = dataset?.data?.[dataIndex];\n if (dataPoint?.color) return dataPoint.color;\n if (dataset?.color) return dataset.color;\n const colorIndex = dataIndex % DEFAULT_COLORS.length;\n return DEFAULT_COLORS[colorIndex] || '#1890ff';\n }\n\n // 绘制柱状图\n function drawBarChart(ctx: CanvasRenderingContext2D, progress: number = 1) {\n const { width, height, padding, datasets, showGrid } = currentConfig;\n const ctxWidth = width - padding * 2;\n const ctxHeight = height - padding * 2;\n\n // 找到最大值\n let maxValue = 0;\n datasets.forEach((dataset) => {\n dataset.data.forEach((point) => {\n if (point.value > maxValue) maxValue = point.value;\n });\n });\n\n // 绘制网格线\n if (showGrid) {\n ctx.strokeStyle = '#e8e8e8';\n ctx.lineWidth = 1;\n for (let i = 0; i <= 5; i++) {\n const y = padding + (ctxHeight / 5) * i;\n ctx.beginPath();\n ctx.moveTo(padding, y);\n ctx.lineTo(width - padding, y);\n ctx.stroke();\n\n // Y轴标签\n ctx.fillStyle = '#666';\n ctx.font = '12px sans-serif';\n ctx.textAlign = 'right';\n ctx.fillText(Math.round(maxValue - (maxValue / 5) * i).toString(), padding - 10, y + 4);\n }\n }\n\n // 绘制柱状图\n const totalBars = datasets.reduce((sum, ds) => sum + ds.data.length, 0);\n const barWidth = (ctxWidth / totalBars) * 0.7;\n const gap = (ctxWidth / totalBars) * 0.3;\n\n let x = padding + gap / 2;\n\n datasets.forEach((dataset, datasetIndex) => {\n dataset.data.forEach((point, dataIndex) => {\n const barHeight = (point.value / maxValue) * ctxHeight * progress;\n const y = height - padding - barHeight;\n\n ctx.fillStyle = getColor(datasetIndex, dataIndex);\n ctx.fillRect(x, y, barWidth, barHeight);\n\n // X轴标签\n ctx.fillStyle = '#666';\n ctx.font = '11px sans-serif';\n ctx.textAlign = 'center';\n ctx.fillText(point.label, x + barWidth / 2, height - padding + 20);\n\n x += barWidth + gap;\n });\n });\n }\n\n // 绘制折线图\n function drawLineChart(ctx: CanvasRenderingContext2D, progress: number = 1) {\n const { width, height, padding, datasets, showGrid } = currentConfig;\n const ctxWidth = width - padding * 2;\n const ctxHeight = height - padding * 2;\n\n // 找到最大值\n let maxValue = 0;\n datasets.forEach((dataset) => {\n dataset.data.forEach((point) => {\n if (point.value > maxValue) maxValue = point.value;\n });\n });\n\n // 绘制网格线\n if (showGrid) {\n ctx.strokeStyle = '#e8e8e8';\n ctx.lineWidth = 1;\n for (let i = 0; i <= 5; i++) {\n const y = padding + (ctxHeight / 5) * i;\n ctx.beginPath();\n ctx.moveTo(padding, y);\n ctx.lineTo(width - padding, y);\n ctx.stroke();\n\n // Y轴标签\n ctx.fillStyle = '#666';\n ctx.font = '12px sans-serif';\n ctx.textAlign = 'right';\n ctx.fillText(Math.round(maxValue - (maxValue / 5) * i).toString(), padding - 10, y + 4);\n }\n }\n\n // 绘制折线\n datasets.forEach((dataset, datasetIndex) => {\n const color = getColor(datasetIndex, 0);\n ctx.strokeStyle = color;\n ctx.fillStyle = color;\n ctx.lineWidth = dataset.borderWidth || 2;\n ctx.beginPath();\n\n const stepX = ctxWidth / (dataset.data.length - 1);\n\n dataset.data.forEach((point, index) => {\n const x = padding + stepX * index;\n const y = height - padding - (point.value / maxValue) * ctxHeight * progress;\n\n if (index === 0) {\n ctx.moveTo(x, y);\n } else {\n ctx.lineTo(x, y);\n }\n\n // 绘制点\n ctx.beginPath();\n ctx.arc(x, y, 4, 0, Math.PI * 2);\n ctx.fill();\n ctx.beginPath();\n ctx.moveTo(x, y);\n\n // X轴标签\n ctx.fillStyle = '#666';\n ctx.font = '11px sans-serif';\n ctx.textAlign = 'center';\n ctx.fillText(point.label, x, height - padding + 20);\n });\n\n ctx.stroke();\n });\n }\n\n // 绘制饼图\n function drawPieChart(ctx: CanvasRenderingContext2D, progress: number = 1) {\n const { width, height, padding, datasets } = currentConfig;\n const centerX = width / 2;\n const centerY = height / 2;\n const radius = Math.min(width, height) / 2 - padding;\n\n // 计算总值\n let totalValue = 0;\n datasets.forEach((dataset) => {\n dataset.data.forEach((point) => {\n totalValue += point.value;\n });\n });\n\n let currentAngle = -Math.PI / 2; // 从顶部开始\n\n datasets.forEach((dataset, datasetIndex) => {\n dataset.data.forEach((point, dataIndex) => {\n const sliceAngle = (point.value / totalValue) * Math.PI * 2 * progress;\n\n ctx.fillStyle = getColor(datasetIndex, dataIndex);\n ctx.beginPath();\n ctx.moveTo(centerX, centerY);\n ctx.arc(centerX, centerY, radius, currentAngle, currentAngle + sliceAngle);\n ctx.closePath();\n ctx.fill();\n\n currentAngle += sliceAngle;\n });\n });\n }\n\n // 绘制环形图\n function drawDoughnutChart(ctx: CanvasRenderingContext2D, progress: number = 1) {\n const { width, height, padding, datasets } = currentConfig;\n const centerX = width / 2;\n const centerY = height / 2;\n const outerRadius = Math.min(width, height) / 2 - padding;\n const innerRadius = outerRadius * 0.5;\n\n // 计算总值\n let totalValue = 0;\n datasets.forEach((dataset) => {\n dataset.data.forEach((point) => {\n totalValue += point.value;\n });\n });\n\n let currentAngle = -Math.PI / 2;\n\n datasets.forEach((dataset, datasetIndex) => {\n dataset.data.forEach((point, dataIndex) => {\n const sliceAngle = (point.value / totalValue) * Math.PI * 2 * progress;\n\n ctx.fillStyle = getColor(datasetIndex, dataIndex);\n ctx.beginPath();\n ctx.arc(centerX, centerY, outerRadius, currentAngle, currentAngle + sliceAngle);\n ctx.arc(centerX, centerY, innerRadius, currentAngle + sliceAngle, currentAngle, true);\n ctx.closePath();\n ctx.fill();\n\n currentAngle += sliceAngle;\n });\n });\n }\n\n // 绘制标题\n function drawTitle(ctx: CanvasRenderingContext2D) {\n if (!currentConfig.title) return;\n\n ctx.fillStyle = '#333';\n ctx.font = 'bold 16px sans-serif';\n ctx.textAlign = 'center';\n ctx.fillText(currentConfig.title, currentConfig.width / 2, 25);\n }\n\n // 绘制图例\n function drawLegend(ctx: CanvasRenderingContext2D) {\n if (!currentConfig.showLegend) return;\n\n let legendX = currentConfig.padding;\n const legendY = currentConfig.height - 20;\n const _itemIndex = 0;\n\n currentConfig.datasets.forEach((dataset, datasetIndex) => {\n dataset.data.forEach((point, dataIndex) => {\n const color = getColor(datasetIndex, dataIndex);\n\n // 绘制颜色方块\n ctx.fillStyle = color;\n ctx.fillRect(legendX, legendY, 12, 12);\n\n // 绘制标签\n ctx.fillStyle = '#666';\n ctx.font = '12px sans-serif';\n ctx.textAlign = 'left';\n ctx.fillText(point.label, legendX + 18, legendY + 10);\n\n legendX += 100;\n itemIndex++;\n });\n });\n }\n\n // 渲染函数\n function render() {\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n // 设置 canvas 尺寸\n canvas.width = currentConfig.width;\n canvas.height = currentConfig.height;\n\n // 清空画布\n ctx.clearRect(0, 0, currentConfig.width, currentConfig.height);\n\n const startTime = Date.now();\n const duration = currentConfig.animationDuration || defaultAnimationDuration;\n\n function animate() {\n if (!ctx) return;\n\n const elapsed = Date.now() - startTime;\n const progress = Math.min(elapsed / duration, 1);\n\n ctx.clearRect(0, 0, currentConfig.width, currentConfig.height);\n\n // 绘制标题\n drawTitle(ctx);\n\n // 绘制图表\n switch (currentConfig.type) {\n case 'bar':\n drawBarChart(ctx, progress);\n break;\n case 'line':\n drawLineChart(ctx, progress);\n break;\n case 'pie':\n drawPieChart(ctx, progress);\n break;\n case 'doughnut':\n drawDoughnutChart(ctx, progress);\n break;\n }\n\n // 绘制图例\n drawLegend(ctx);\n\n if (progress < 1) {\n animationFrame = requestAnimationFrame(animate);\n }\n }\n\n animate();\n }\n\n // 更新数据\n function updateData(datasets: ChartDataset[]) {\n currentConfig.datasets = datasets;\n render();\n }\n\n // 销毁\n function destroy() {\n if (animationFrame) {\n cancelAnimationFrame(animationFrame);\n }\n }\n\n // 初始化渲染\n render();\n\n return {\n render,\n updateData,\n destroy,\n getCanvas: () => canvas,\n };\n}\n\nconst pluginChart = definePlugin({\n name: 'chart',\n version: '6.0.0',\n description: 'LytJS official chart plugin for rendering charts using Canvas API',\n author: 'LytJS Team',\n keywords: ['lytjs', 'chart', 'canvas', 'visualization'],\n schema: {\n type: 'object',\n object: {\n properties: {\n defaultColors: {\n type: 'array',\n default: DEFAULT_COLORS,\n },\n defaultAnimationDuration: { type: 'number', default: 500 },\n responsive: { type: 'boolean', default: true },\n },\n },\n },\n install(app, options) {\n const chartOptions = options as ChartPluginOptions;\n\n // 提供创建图表的方法\n app.provide('lyt-chart', {\n create: (canvas: HTMLCanvasElement, config: ChartConfig) =>\n createChart(canvas, config, chartOptions),\n });\n\n // 挂载到全局属性\n app.config.globalProperties.$chart = {\n create: (canvas: HTMLCanvasElement, config: ChartConfig) =>\n createChart(canvas, config, chartOptions),\n };\n },\n});\n\nexport default pluginChart;\nexport type {\n ChartDataPoint,\n ChartDataset,\n ChartType,\n ChartConfig,\n ChartInstance,\n ChartPluginOptions,\n};\nexport { createChart, DEFAULT_COLORS };\n"]}
package/dist/index.mjs CHANGED
@@ -20,10 +20,8 @@ var DEFAULT_CONFIG = {
20
20
  padding: 40
21
21
  };
22
22
  function createChart(canvas, config, options = {}) {
23
- const {
24
- defaultAnimationDuration = 500
25
- } = options;
26
- let currentConfig = { ...DEFAULT_CONFIG, ...config };
23
+ const { defaultAnimationDuration = 500 } = options;
24
+ const currentConfig = { ...DEFAULT_CONFIG, ...config };
27
25
  let animationFrame = null;
28
26
  function getColor(datasetIndex, dataIndex) {
29
27
  const dataset = currentConfig.datasets[datasetIndex];
@@ -55,11 +53,7 @@ function createChart(canvas, config, options = {}) {
55
53
  ctx.fillStyle = "#666";
56
54
  ctx.font = "12px sans-serif";
57
55
  ctx.textAlign = "right";
58
- ctx.fillText(
59
- Math.round(maxValue - maxValue / 5 * i).toString(),
60
- padding - 10,
61
- y + 4
62
- );
56
+ ctx.fillText(Math.round(maxValue - maxValue / 5 * i).toString(), padding - 10, y + 4);
63
57
  }
64
58
  }
65
59
  const totalBars = datasets.reduce((sum, ds) => sum + ds.data.length, 0);
@@ -75,11 +69,7 @@ function createChart(canvas, config, options = {}) {
75
69
  ctx.fillStyle = "#666";
76
70
  ctx.font = "11px sans-serif";
77
71
  ctx.textAlign = "center";
78
- ctx.fillText(
79
- point.label,
80
- x + barWidth / 2,
81
- height - padding + 20
82
- );
72
+ ctx.fillText(point.label, x + barWidth / 2, height - padding + 20);
83
73
  x += barWidth + gap;
84
74
  });
85
75
  });
@@ -106,11 +96,7 @@ function createChart(canvas, config, options = {}) {
106
96
  ctx.fillStyle = "#666";
107
97
  ctx.font = "12px sans-serif";
108
98
  ctx.textAlign = "right";
109
- ctx.fillText(
110
- Math.round(maxValue - maxValue / 5 * i).toString(),
111
- padding - 10,
112
- y + 4
113
- );
99
+ ctx.fillText(Math.round(maxValue - maxValue / 5 * i).toString(), padding - 10, y + 4);
114
100
  }
115
101
  }
116
102
  datasets.forEach((dataset, datasetIndex) => {
@@ -136,11 +122,7 @@ function createChart(canvas, config, options = {}) {
136
122
  ctx.fillStyle = "#666";
137
123
  ctx.font = "11px sans-serif";
138
124
  ctx.textAlign = "center";
139
- ctx.fillText(
140
- point.label,
141
- x,
142
- height - padding + 20
143
- );
125
+ ctx.fillText(point.label, x, height - padding + 20);
144
126
  });
145
127
  ctx.stroke();
146
128
  });
@@ -217,6 +199,7 @@ function createChart(canvas, config, options = {}) {
217
199
  ctx.textAlign = "left";
218
200
  ctx.fillText(point.label, legendX + 18, legendY + 10);
219
201
  legendX += 100;
202
+ itemIndex++;
220
203
  });
221
204
  });
222
205
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * @lytjs/plugin-chart\r\n *\r\n * LytJS official chart plugin for rendering charts using Canvas API with zero dependencies.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { definePlugin } from '@lytjs/core';\r\nimport type {\r\n ChartDataPoint,\r\n ChartDataset,\r\n ChartType,\r\n ChartConfig,\r\n ChartInstance,\r\n ChartPluginOptions,\r\n} from './types';\r\n\r\n// 默认颜色 palette\r\nconst DEFAULT_COLORS = [\r\n '#1890ff',\r\n '#52c41a',\r\n '#faad14',\r\n '#ff4d4f',\r\n '#722ed1',\r\n '#13c2c2',\r\n '#eb2f96',\r\n '#fa541c',\r\n];\r\n\r\n// 默认配置\r\nconst DEFAULT_CONFIG = {\r\n showLegend: true,\r\n showGrid: true,\r\n width: 400,\r\n height: 300,\r\n animationDuration: 500,\r\n padding: 40,\r\n};\r\n\r\n/**\r\n * 创建图表实例\r\n */\r\nfunction createChart(\r\n canvas: HTMLCanvasElement,\r\n config: ChartConfig,\r\n options: ChartPluginOptions = {}\r\n): ChartInstance {\r\n const {\r\n defaultAnimationDuration = 500,\r\n } = options;\r\n\r\n let currentConfig = { ...DEFAULT_CONFIG, ...config };\r\n let animationFrame: number | null = null;\r\n\r\n // 获取颜色\r\n function getColor(datasetIndex: number, dataIndex: number): string {\r\n const dataset = currentConfig.datasets[datasetIndex];\r\n const dataPoint = dataset?.data?.[dataIndex];\r\n if (dataPoint?.color) return dataPoint.color;\r\n if (dataset?.color) return dataset.color;\r\n const colorIndex = dataIndex % DEFAULT_COLORS.length;\r\n return DEFAULT_COLORS[colorIndex] || '#1890ff';\r\n }\r\n\r\n // 绘制柱状图\r\n function drawBarChart(ctx: CanvasRenderingContext2D, progress: number = 1) {\r\n const { width, height, padding, datasets, showGrid } = currentConfig;\r\n const ctxWidth = width - padding * 2;\r\n const ctxHeight = height - padding * 2;\r\n\r\n // 找到最大值\r\n let maxValue = 0;\r\n datasets.forEach((dataset) => {\r\n dataset.data.forEach((point) => {\r\n if (point.value > maxValue) maxValue = point.value;\r\n });\r\n });\r\n\r\n // 绘制网格线\r\n if (showGrid) {\r\n ctx.strokeStyle = '#e8e8e8';\r\n ctx.lineWidth = 1;\r\n for (let i = 0; i <= 5; i++) {\r\n const y = padding + (ctxHeight / 5) * i;\r\n ctx.beginPath();\r\n ctx.moveTo(padding, y);\r\n ctx.lineTo(width - padding, y);\r\n ctx.stroke();\r\n\r\n // Y轴标签\r\n ctx.fillStyle = '#666';\r\n ctx.font = '12px sans-serif';\r\n ctx.textAlign = 'right';\r\n ctx.fillText(\r\n Math.round((maxValue - (maxValue / 5) * i)).toString(),\r\n padding - 10,\r\n y + 4\r\n );\r\n }\r\n }\r\n\r\n // 绘制柱状图\r\n const totalBars = datasets.reduce((sum, ds) => sum + ds.data.length, 0);\r\n const barWidth = ctxWidth / totalBars * 0.7;\r\n const gap = ctxWidth / totalBars * 0.3;\r\n\r\n let x = padding + gap / 2;\r\n\r\n datasets.forEach((dataset, datasetIndex) => {\r\n dataset.data.forEach((point, dataIndex) => {\r\n const barHeight = (point.value / maxValue) * ctxHeight * progress;\r\n const y = height - padding - barHeight;\r\n\r\n ctx.fillStyle = getColor(datasetIndex, dataIndex);\r\n ctx.fillRect(x, y, barWidth, barHeight);\r\n\r\n // X轴标签\r\n ctx.fillStyle = '#666';\r\n ctx.font = '11px sans-serif';\r\n ctx.textAlign = 'center';\r\n ctx.fillText(\r\n point.label,\r\n x + barWidth / 2,\r\n height - padding + 20\r\n );\r\n\r\n x += barWidth + gap;\r\n });\r\n });\r\n }\r\n\r\n // 绘制折线图\r\n function drawLineChart(ctx: CanvasRenderingContext2D, progress: number = 1) {\r\n const { width, height, padding, datasets, showGrid } = currentConfig;\r\n const ctxWidth = width - padding * 2;\r\n const ctxHeight = height - padding * 2;\r\n\r\n // 找到最大值\r\n let maxValue = 0;\r\n datasets.forEach((dataset) => {\r\n dataset.data.forEach((point) => {\r\n if (point.value > maxValue) maxValue = point.value;\r\n });\r\n });\r\n\r\n // 绘制网格线\r\n if (showGrid) {\r\n ctx.strokeStyle = '#e8e8e8';\r\n ctx.lineWidth = 1;\r\n for (let i = 0; i <= 5; i++) {\r\n const y = padding + (ctxHeight / 5) * i;\r\n ctx.beginPath();\r\n ctx.moveTo(padding, y);\r\n ctx.lineTo(width - padding, y);\r\n ctx.stroke();\r\n\r\n // Y轴标签\r\n ctx.fillStyle = '#666';\r\n ctx.font = '12px sans-serif';\r\n ctx.textAlign = 'right';\r\n ctx.fillText(\r\n Math.round((maxValue - (maxValue / 5) * i)).toString(),\r\n padding - 10,\r\n y + 4\r\n );\r\n }\r\n }\r\n\r\n // 绘制折线\r\n datasets.forEach((dataset, datasetIndex) => {\r\n const color = getColor(datasetIndex, 0);\r\n ctx.strokeStyle = color;\r\n ctx.fillStyle = color;\r\n ctx.lineWidth = dataset.borderWidth || 2;\r\n ctx.beginPath();\r\n\r\n const stepX = ctxWidth / (dataset.data.length - 1);\r\n\r\n dataset.data.forEach((point, index) => {\r\n const x = padding + stepX * index;\r\n const y = height - padding - (point.value / maxValue) * ctxHeight * progress;\r\n\r\n if (index === 0) {\r\n ctx.moveTo(x, y);\r\n } else {\r\n ctx.lineTo(x, y);\r\n }\r\n\r\n // 绘制点\r\n ctx.beginPath();\r\n ctx.arc(x, y, 4, 0, Math.PI * 2);\r\n ctx.fill();\r\n ctx.beginPath();\r\n ctx.moveTo(x, y);\r\n\r\n // X轴标签\r\n ctx.fillStyle = '#666';\r\n ctx.font = '11px sans-serif';\r\n ctx.textAlign = 'center';\r\n ctx.fillText(\r\n point.label,\r\n x,\r\n height - padding + 20\r\n );\r\n });\r\n\r\n ctx.stroke();\r\n });\r\n }\r\n\r\n // 绘制饼图\r\n function drawPieChart(ctx: CanvasRenderingContext2D, progress: number = 1) {\r\n const { width, height, padding, datasets } = currentConfig;\r\n const centerX = width / 2;\r\n const centerY = height / 2;\r\n const radius = Math.min(width, height) / 2 - padding;\r\n\r\n // 计算总值\r\n let totalValue = 0;\r\n datasets.forEach((dataset) => {\r\n dataset.data.forEach((point) => {\r\n totalValue += point.value;\r\n });\r\n });\r\n\r\n let currentAngle = -Math.PI / 2; // 从顶部开始\r\n\r\n datasets.forEach((dataset, datasetIndex) => {\r\n dataset.data.forEach((point, dataIndex) => {\r\n const sliceAngle = (point.value / totalValue) * Math.PI * 2 * progress;\r\n\r\n ctx.fillStyle = getColor(datasetIndex, dataIndex);\r\n ctx.beginPath();\r\n ctx.moveTo(centerX, centerY);\r\n ctx.arc(centerX, centerY, radius, currentAngle, currentAngle + sliceAngle);\r\n ctx.closePath();\r\n ctx.fill();\r\n\r\n currentAngle += sliceAngle;\r\n });\r\n });\r\n }\r\n\r\n // 绘制环形图\r\n function drawDoughnutChart(ctx: CanvasRenderingContext2D, progress: number = 1) {\r\n const { width, height, padding, datasets } = currentConfig;\r\n const centerX = width / 2;\r\n const centerY = height / 2;\r\n const outerRadius = Math.min(width, height) / 2 - padding;\r\n const innerRadius = outerRadius * 0.5;\r\n\r\n // 计算总值\r\n let totalValue = 0;\r\n datasets.forEach((dataset) => {\r\n dataset.data.forEach((point) => {\r\n totalValue += point.value;\r\n });\r\n });\r\n\r\n let currentAngle = -Math.PI / 2;\r\n\r\n datasets.forEach((dataset, datasetIndex) => {\r\n dataset.data.forEach((point, dataIndex) => {\r\n const sliceAngle = (point.value / totalValue) * Math.PI * 2 * progress;\r\n\r\n ctx.fillStyle = getColor(datasetIndex, dataIndex);\r\n ctx.beginPath();\r\n ctx.arc(centerX, centerY, outerRadius, currentAngle, currentAngle + sliceAngle);\r\n ctx.arc(centerX, centerY, innerRadius, currentAngle + sliceAngle, currentAngle, true);\r\n ctx.closePath();\r\n ctx.fill();\r\n\r\n currentAngle += sliceAngle;\r\n });\r\n });\r\n }\r\n\r\n // 绘制标题\r\n function drawTitle(ctx: CanvasRenderingContext2D) {\r\n if (!currentConfig.title) return;\r\n\r\n ctx.fillStyle = '#333';\r\n ctx.font = 'bold 16px sans-serif';\r\n ctx.textAlign = 'center';\r\n ctx.fillText(currentConfig.title, currentConfig.width / 2, 25);\r\n }\r\n\r\n // 绘制图例\r\n function drawLegend(ctx: CanvasRenderingContext2D) {\r\n if (!currentConfig.showLegend) return;\r\n\r\n let legendX = currentConfig.padding;\r\n const legendY = currentConfig.height - 20;\r\n let itemIndex = 0;\r\n\r\n currentConfig.datasets.forEach((dataset, datasetIndex) => {\r\n dataset.data.forEach((point, dataIndex) => {\r\n const color = getColor(datasetIndex, dataIndex);\r\n\r\n // 绘制颜色方块\r\n ctx.fillStyle = color;\r\n ctx.fillRect(legendX, legendY, 12, 12);\r\n\r\n // 绘制标签\r\n ctx.fillStyle = '#666';\r\n ctx.font = '12px sans-serif';\r\n ctx.textAlign = 'left';\r\n ctx.fillText(point.label, legendX + 18, legendY + 10);\r\n\r\n legendX += 100;\r\n itemIndex++;\r\n });\r\n });\r\n }\r\n\r\n // 渲染函数\r\n function render() {\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return;\r\n\r\n // 设置 canvas 尺寸\r\n canvas.width = currentConfig.width;\r\n canvas.height = currentConfig.height;\r\n\r\n // 清空画布\r\n ctx.clearRect(0, 0, currentConfig.width, currentConfig.height);\r\n\r\n const startTime = Date.now();\r\n const duration = currentConfig.animationDuration || defaultAnimationDuration;\r\n\r\n function animate() {\r\n if (!ctx) return;\r\n \r\n const elapsed = Date.now() - startTime;\r\n const progress = Math.min(elapsed / duration, 1);\r\n\r\n ctx.clearRect(0, 0, currentConfig.width, currentConfig.height);\r\n\r\n // 绘制标题\r\n drawTitle(ctx);\r\n\r\n // 绘制图表\r\n switch (currentConfig.type) {\r\n case 'bar':\r\n drawBarChart(ctx, progress);\r\n break;\r\n case 'line':\r\n drawLineChart(ctx, progress);\r\n break;\r\n case 'pie':\r\n drawPieChart(ctx, progress);\r\n break;\r\n case 'doughnut':\r\n drawDoughnutChart(ctx, progress);\r\n break;\r\n }\r\n\r\n // 绘制图例\r\n drawLegend(ctx);\r\n\r\n if (progress < 1) {\r\n animationFrame = requestAnimationFrame(animate);\r\n }\r\n }\r\n\r\n animate();\r\n }\r\n\r\n // 更新数据\r\n function updateData(datasets: ChartDataset[]) {\r\n currentConfig.datasets = datasets;\r\n render();\r\n }\r\n\r\n // 销毁\r\n function destroy() {\r\n if (animationFrame) {\r\n cancelAnimationFrame(animationFrame);\r\n }\r\n }\r\n\r\n // 初始化渲染\r\n render();\r\n\r\n return {\r\n render,\r\n updateData,\r\n destroy,\r\n getCanvas: () => canvas,\r\n };\r\n}\r\n\r\nconst pluginChart = definePlugin({\r\n name: 'chart',\r\n version: '6.0.0',\r\n description: 'LytJS official chart plugin for rendering charts using Canvas API',\r\n author: 'LytJS Team',\r\n keywords: ['lytjs', 'chart', 'canvas', 'visualization'],\r\n schema: {\r\n type: 'object',\r\n object: {\r\n properties: {\r\n defaultColors: { \r\n type: 'array', \r\n default: DEFAULT_COLORS,\r\n },\r\n defaultAnimationDuration: { type: 'number', default: 500 },\r\n responsive: { type: 'boolean', default: true },\r\n },\r\n },\r\n },\r\n install(app, options) {\r\n const chartOptions = options as ChartPluginOptions;\r\n\r\n // 提供创建图表的方法\r\n app.provide('lyt-chart', {\r\n create: (canvas: HTMLCanvasElement, config: ChartConfig) =>\r\n createChart(canvas, config, chartOptions),\r\n });\r\n\r\n // 挂载到全局属性\r\n app.config.globalProperties.$chart = {\r\n create: (canvas: HTMLCanvasElement, config: ChartConfig) =>\r\n createChart(canvas, config, chartOptions),\r\n };\r\n },\r\n});\r\n\r\nexport default pluginChart;\r\nexport type {\r\n ChartDataPoint,\r\n ChartDataset,\r\n ChartType,\r\n ChartConfig,\r\n ChartInstance,\r\n ChartPluginOptions,\r\n};\r\nexport { createChart, DEFAULT_COLORS };\r\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @lytjs/plugin-chart\n *\n * LytJS official chart plugin for rendering charts using Canvas API with zero dependencies.\n *\n * @packageDocumentation\n */\n\nimport { definePlugin } from '@lytjs/core';\nimport type {\n ChartDataPoint,\n ChartDataset,\n ChartType,\n ChartConfig,\n ChartInstance,\n ChartPluginOptions,\n} from './types';\n\n// 默认颜色 palette\nconst DEFAULT_COLORS = [\n '#1890ff',\n '#52c41a',\n '#faad14',\n '#ff4d4f',\n '#722ed1',\n '#13c2c2',\n '#eb2f96',\n '#fa541c',\n];\n\n// 默认配置\nconst DEFAULT_CONFIG = {\n showLegend: true,\n showGrid: true,\n width: 400,\n height: 300,\n animationDuration: 500,\n padding: 40,\n};\n\n/**\n * 创建图表实例\n */\nfunction createChart(\n canvas: HTMLCanvasElement,\n config: ChartConfig,\n options: ChartPluginOptions = {},\n): ChartInstance {\n const { defaultAnimationDuration = 500 } = options;\n\n const currentConfig = { ...DEFAULT_CONFIG, ...config };\n let animationFrame: number | null = null;\n\n // 获取颜色\n function getColor(datasetIndex: number, dataIndex: number): string {\n const dataset = currentConfig.datasets[datasetIndex];\n const dataPoint = dataset?.data?.[dataIndex];\n if (dataPoint?.color) return dataPoint.color;\n if (dataset?.color) return dataset.color;\n const colorIndex = dataIndex % DEFAULT_COLORS.length;\n return DEFAULT_COLORS[colorIndex] || '#1890ff';\n }\n\n // 绘制柱状图\n function drawBarChart(ctx: CanvasRenderingContext2D, progress: number = 1) {\n const { width, height, padding, datasets, showGrid } = currentConfig;\n const ctxWidth = width - padding * 2;\n const ctxHeight = height - padding * 2;\n\n // 找到最大值\n let maxValue = 0;\n datasets.forEach((dataset) => {\n dataset.data.forEach((point) => {\n if (point.value > maxValue) maxValue = point.value;\n });\n });\n\n // 绘制网格线\n if (showGrid) {\n ctx.strokeStyle = '#e8e8e8';\n ctx.lineWidth = 1;\n for (let i = 0; i <= 5; i++) {\n const y = padding + (ctxHeight / 5) * i;\n ctx.beginPath();\n ctx.moveTo(padding, y);\n ctx.lineTo(width - padding, y);\n ctx.stroke();\n\n // Y轴标签\n ctx.fillStyle = '#666';\n ctx.font = '12px sans-serif';\n ctx.textAlign = 'right';\n ctx.fillText(Math.round(maxValue - (maxValue / 5) * i).toString(), padding - 10, y + 4);\n }\n }\n\n // 绘制柱状图\n const totalBars = datasets.reduce((sum, ds) => sum + ds.data.length, 0);\n const barWidth = (ctxWidth / totalBars) * 0.7;\n const gap = (ctxWidth / totalBars) * 0.3;\n\n let x = padding + gap / 2;\n\n datasets.forEach((dataset, datasetIndex) => {\n dataset.data.forEach((point, dataIndex) => {\n const barHeight = (point.value / maxValue) * ctxHeight * progress;\n const y = height - padding - barHeight;\n\n ctx.fillStyle = getColor(datasetIndex, dataIndex);\n ctx.fillRect(x, y, barWidth, barHeight);\n\n // X轴标签\n ctx.fillStyle = '#666';\n ctx.font = '11px sans-serif';\n ctx.textAlign = 'center';\n ctx.fillText(point.label, x + barWidth / 2, height - padding + 20);\n\n x += barWidth + gap;\n });\n });\n }\n\n // 绘制折线图\n function drawLineChart(ctx: CanvasRenderingContext2D, progress: number = 1) {\n const { width, height, padding, datasets, showGrid } = currentConfig;\n const ctxWidth = width - padding * 2;\n const ctxHeight = height - padding * 2;\n\n // 找到最大值\n let maxValue = 0;\n datasets.forEach((dataset) => {\n dataset.data.forEach((point) => {\n if (point.value > maxValue) maxValue = point.value;\n });\n });\n\n // 绘制网格线\n if (showGrid) {\n ctx.strokeStyle = '#e8e8e8';\n ctx.lineWidth = 1;\n for (let i = 0; i <= 5; i++) {\n const y = padding + (ctxHeight / 5) * i;\n ctx.beginPath();\n ctx.moveTo(padding, y);\n ctx.lineTo(width - padding, y);\n ctx.stroke();\n\n // Y轴标签\n ctx.fillStyle = '#666';\n ctx.font = '12px sans-serif';\n ctx.textAlign = 'right';\n ctx.fillText(Math.round(maxValue - (maxValue / 5) * i).toString(), padding - 10, y + 4);\n }\n }\n\n // 绘制折线\n datasets.forEach((dataset, datasetIndex) => {\n const color = getColor(datasetIndex, 0);\n ctx.strokeStyle = color;\n ctx.fillStyle = color;\n ctx.lineWidth = dataset.borderWidth || 2;\n ctx.beginPath();\n\n const stepX = ctxWidth / (dataset.data.length - 1);\n\n dataset.data.forEach((point, index) => {\n const x = padding + stepX * index;\n const y = height - padding - (point.value / maxValue) * ctxHeight * progress;\n\n if (index === 0) {\n ctx.moveTo(x, y);\n } else {\n ctx.lineTo(x, y);\n }\n\n // 绘制点\n ctx.beginPath();\n ctx.arc(x, y, 4, 0, Math.PI * 2);\n ctx.fill();\n ctx.beginPath();\n ctx.moveTo(x, y);\n\n // X轴标签\n ctx.fillStyle = '#666';\n ctx.font = '11px sans-serif';\n ctx.textAlign = 'center';\n ctx.fillText(point.label, x, height - padding + 20);\n });\n\n ctx.stroke();\n });\n }\n\n // 绘制饼图\n function drawPieChart(ctx: CanvasRenderingContext2D, progress: number = 1) {\n const { width, height, padding, datasets } = currentConfig;\n const centerX = width / 2;\n const centerY = height / 2;\n const radius = Math.min(width, height) / 2 - padding;\n\n // 计算总值\n let totalValue = 0;\n datasets.forEach((dataset) => {\n dataset.data.forEach((point) => {\n totalValue += point.value;\n });\n });\n\n let currentAngle = -Math.PI / 2; // 从顶部开始\n\n datasets.forEach((dataset, datasetIndex) => {\n dataset.data.forEach((point, dataIndex) => {\n const sliceAngle = (point.value / totalValue) * Math.PI * 2 * progress;\n\n ctx.fillStyle = getColor(datasetIndex, dataIndex);\n ctx.beginPath();\n ctx.moveTo(centerX, centerY);\n ctx.arc(centerX, centerY, radius, currentAngle, currentAngle + sliceAngle);\n ctx.closePath();\n ctx.fill();\n\n currentAngle += sliceAngle;\n });\n });\n }\n\n // 绘制环形图\n function drawDoughnutChart(ctx: CanvasRenderingContext2D, progress: number = 1) {\n const { width, height, padding, datasets } = currentConfig;\n const centerX = width / 2;\n const centerY = height / 2;\n const outerRadius = Math.min(width, height) / 2 - padding;\n const innerRadius = outerRadius * 0.5;\n\n // 计算总值\n let totalValue = 0;\n datasets.forEach((dataset) => {\n dataset.data.forEach((point) => {\n totalValue += point.value;\n });\n });\n\n let currentAngle = -Math.PI / 2;\n\n datasets.forEach((dataset, datasetIndex) => {\n dataset.data.forEach((point, dataIndex) => {\n const sliceAngle = (point.value / totalValue) * Math.PI * 2 * progress;\n\n ctx.fillStyle = getColor(datasetIndex, dataIndex);\n ctx.beginPath();\n ctx.arc(centerX, centerY, outerRadius, currentAngle, currentAngle + sliceAngle);\n ctx.arc(centerX, centerY, innerRadius, currentAngle + sliceAngle, currentAngle, true);\n ctx.closePath();\n ctx.fill();\n\n currentAngle += sliceAngle;\n });\n });\n }\n\n // 绘制标题\n function drawTitle(ctx: CanvasRenderingContext2D) {\n if (!currentConfig.title) return;\n\n ctx.fillStyle = '#333';\n ctx.font = 'bold 16px sans-serif';\n ctx.textAlign = 'center';\n ctx.fillText(currentConfig.title, currentConfig.width / 2, 25);\n }\n\n // 绘制图例\n function drawLegend(ctx: CanvasRenderingContext2D) {\n if (!currentConfig.showLegend) return;\n\n let legendX = currentConfig.padding;\n const legendY = currentConfig.height - 20;\n const _itemIndex = 0;\n\n currentConfig.datasets.forEach((dataset, datasetIndex) => {\n dataset.data.forEach((point, dataIndex) => {\n const color = getColor(datasetIndex, dataIndex);\n\n // 绘制颜色方块\n ctx.fillStyle = color;\n ctx.fillRect(legendX, legendY, 12, 12);\n\n // 绘制标签\n ctx.fillStyle = '#666';\n ctx.font = '12px sans-serif';\n ctx.textAlign = 'left';\n ctx.fillText(point.label, legendX + 18, legendY + 10);\n\n legendX += 100;\n itemIndex++;\n });\n });\n }\n\n // 渲染函数\n function render() {\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n // 设置 canvas 尺寸\n canvas.width = currentConfig.width;\n canvas.height = currentConfig.height;\n\n // 清空画布\n ctx.clearRect(0, 0, currentConfig.width, currentConfig.height);\n\n const startTime = Date.now();\n const duration = currentConfig.animationDuration || defaultAnimationDuration;\n\n function animate() {\n if (!ctx) return;\n\n const elapsed = Date.now() - startTime;\n const progress = Math.min(elapsed / duration, 1);\n\n ctx.clearRect(0, 0, currentConfig.width, currentConfig.height);\n\n // 绘制标题\n drawTitle(ctx);\n\n // 绘制图表\n switch (currentConfig.type) {\n case 'bar':\n drawBarChart(ctx, progress);\n break;\n case 'line':\n drawLineChart(ctx, progress);\n break;\n case 'pie':\n drawPieChart(ctx, progress);\n break;\n case 'doughnut':\n drawDoughnutChart(ctx, progress);\n break;\n }\n\n // 绘制图例\n drawLegend(ctx);\n\n if (progress < 1) {\n animationFrame = requestAnimationFrame(animate);\n }\n }\n\n animate();\n }\n\n // 更新数据\n function updateData(datasets: ChartDataset[]) {\n currentConfig.datasets = datasets;\n render();\n }\n\n // 销毁\n function destroy() {\n if (animationFrame) {\n cancelAnimationFrame(animationFrame);\n }\n }\n\n // 初始化渲染\n render();\n\n return {\n render,\n updateData,\n destroy,\n getCanvas: () => canvas,\n };\n}\n\nconst pluginChart = definePlugin({\n name: 'chart',\n version: '6.0.0',\n description: 'LytJS official chart plugin for rendering charts using Canvas API',\n author: 'LytJS Team',\n keywords: ['lytjs', 'chart', 'canvas', 'visualization'],\n schema: {\n type: 'object',\n object: {\n properties: {\n defaultColors: {\n type: 'array',\n default: DEFAULT_COLORS,\n },\n defaultAnimationDuration: { type: 'number', default: 500 },\n responsive: { type: 'boolean', default: true },\n },\n },\n },\n install(app, options) {\n const chartOptions = options as ChartPluginOptions;\n\n // 提供创建图表的方法\n app.provide('lyt-chart', {\n create: (canvas: HTMLCanvasElement, config: ChartConfig) =>\n createChart(canvas, config, chartOptions),\n });\n\n // 挂载到全局属性\n app.config.globalProperties.$chart = {\n create: (canvas: HTMLCanvasElement, config: ChartConfig) =>\n createChart(canvas, config, chartOptions),\n };\n },\n});\n\nexport default pluginChart;\nexport type {\n ChartDataPoint,\n ChartDataset,\n ChartType,\n ChartConfig,\n ChartInstance,\n ChartPluginOptions,\n};\nexport { createChart, DEFAULT_COLORS };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lytjs/plugin-chart",
3
- "version": "6.5.0",
3
+ "version": "6.7.0",
4
4
  "description": "LytJS official chart plugin for rendering charts using Canvas API with zero dependencies",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -29,7 +29,7 @@
29
29
  "clean": "rm -rf dist"
30
30
  },
31
31
  "dependencies": {
32
- "@lytjs/core": "^6.0.0"
32
+ "@lytjs/core": "^6.7.0"
33
33
  },
34
34
  "devDependencies": {
35
35
  "tsup": "^8.0.0",
package/dist/index.d.cts DELETED
@@ -1,79 +0,0 @@
1
- import * as _lytjs_core from '@lytjs/core';
2
-
3
- /**
4
- * @lytjs/plugin-chart types
5
- *
6
- * Type definitions for the chart plugin
7
- */
8
- /** 图表数据点 */
9
- interface ChartDataPoint {
10
- /** 标签 */
11
- label: string;
12
- /** 数值 */
13
- value: number;
14
- /** 颜色(可选) */
15
- color?: string;
16
- }
17
- /** 数据集 */
18
- interface ChartDataset {
19
- /** 数据集标签 */
20
- label: string;
21
- /** 数据点数组 */
22
- data: ChartDataPoint[];
23
- /** 颜色(可选,应用于整个数据集) */
24
- color?: string;
25
- /** 边框宽度(可选) */
26
- borderWidth?: number;
27
- }
28
- /** 图表类型 */
29
- type ChartType = 'bar' | 'line' | 'pie' | 'doughnut';
30
- /** 图表配置 */
31
- interface ChartConfig {
32
- /** 图表类型 */
33
- type: ChartType;
34
- /** 数据集 */
35
- datasets: ChartDataset[];
36
- /** 标题(可选) */
37
- title?: string;
38
- /** 是否显示图例 */
39
- showLegend?: boolean;
40
- /** 是否显示网格线 */
41
- showGrid?: boolean;
42
- /** 图表宽度 */
43
- width?: number;
44
- /** 图表高度 */
45
- height?: number;
46
- /** 动画持续时间(毫秒) */
47
- animationDuration?: number;
48
- /** 内边距 */
49
- padding?: number;
50
- }
51
- /** 图表实例接口 */
52
- interface ChartInstance {
53
- /** 渲染图表 */
54
- render(): void;
55
- /** 更新数据 */
56
- updateData(datasets: ChartDataset[]): void;
57
- /** 销毁图表 */
58
- destroy(): void;
59
- /** 获取 Canvas 元素 */
60
- getCanvas(): HTMLCanvasElement;
61
- }
62
- /** 图表插件选项 */
63
- interface ChartPluginOptions {
64
- /** 默认颜色 palette */
65
- defaultColors?: string[];
66
- /** 默认动画持续时间 */
67
- defaultAnimationDuration?: number;
68
- /** 响应式配置 */
69
- responsive?: boolean;
70
- }
71
-
72
- declare const DEFAULT_COLORS: string[];
73
- /**
74
- * 创建图表实例
75
- */
76
- declare function createChart(canvas: HTMLCanvasElement, config: ChartConfig, options?: ChartPluginOptions): ChartInstance;
77
- declare const pluginChart: _lytjs_core.PluginDefinition<unknown>;
78
-
79
- export { type ChartConfig, type ChartDataPoint, type ChartDataset, type ChartInstance, type ChartPluginOptions, type ChartType, DEFAULT_COLORS, createChart, pluginChart as default };
package/dist/index.d.ts DELETED
@@ -1,79 +0,0 @@
1
- import * as _lytjs_core from '@lytjs/core';
2
-
3
- /**
4
- * @lytjs/plugin-chart types
5
- *
6
- * Type definitions for the chart plugin
7
- */
8
- /** 图表数据点 */
9
- interface ChartDataPoint {
10
- /** 标签 */
11
- label: string;
12
- /** 数值 */
13
- value: number;
14
- /** 颜色(可选) */
15
- color?: string;
16
- }
17
- /** 数据集 */
18
- interface ChartDataset {
19
- /** 数据集标签 */
20
- label: string;
21
- /** 数据点数组 */
22
- data: ChartDataPoint[];
23
- /** 颜色(可选,应用于整个数据集) */
24
- color?: string;
25
- /** 边框宽度(可选) */
26
- borderWidth?: number;
27
- }
28
- /** 图表类型 */
29
- type ChartType = 'bar' | 'line' | 'pie' | 'doughnut';
30
- /** 图表配置 */
31
- interface ChartConfig {
32
- /** 图表类型 */
33
- type: ChartType;
34
- /** 数据集 */
35
- datasets: ChartDataset[];
36
- /** 标题(可选) */
37
- title?: string;
38
- /** 是否显示图例 */
39
- showLegend?: boolean;
40
- /** 是否显示网格线 */
41
- showGrid?: boolean;
42
- /** 图表宽度 */
43
- width?: number;
44
- /** 图表高度 */
45
- height?: number;
46
- /** 动画持续时间(毫秒) */
47
- animationDuration?: number;
48
- /** 内边距 */
49
- padding?: number;
50
- }
51
- /** 图表实例接口 */
52
- interface ChartInstance {
53
- /** 渲染图表 */
54
- render(): void;
55
- /** 更新数据 */
56
- updateData(datasets: ChartDataset[]): void;
57
- /** 销毁图表 */
58
- destroy(): void;
59
- /** 获取 Canvas 元素 */
60
- getCanvas(): HTMLCanvasElement;
61
- }
62
- /** 图表插件选项 */
63
- interface ChartPluginOptions {
64
- /** 默认颜色 palette */
65
- defaultColors?: string[];
66
- /** 默认动画持续时间 */
67
- defaultAnimationDuration?: number;
68
- /** 响应式配置 */
69
- responsive?: boolean;
70
- }
71
-
72
- declare const DEFAULT_COLORS: string[];
73
- /**
74
- * 创建图表实例
75
- */
76
- declare function createChart(canvas: HTMLCanvasElement, config: ChartConfig, options?: ChartPluginOptions): ChartInstance;
77
- declare const pluginChart: _lytjs_core.PluginDefinition<unknown>;
78
-
79
- export { type ChartConfig, type ChartDataPoint, type ChartDataset, type ChartInstance, type ChartPluginOptions, type ChartType, DEFAULT_COLORS, createChart, pluginChart as default };