@easy-editor/materials-dashboard-gauge-chart 0.0.2 → 0.0.3

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 (45) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/component.min.js +2 -3
  3. package/dist/index.min.js +2 -3
  4. package/dist/meta.min.js +1 -2
  5. package/easypack.config.ts +10 -0
  6. package/package.json +4 -8
  7. package/src/component.tsx +225 -180
  8. package/src/configure.ts +140 -285
  9. package/src/index.tsx +7 -7
  10. package/src/meta.ts +23 -23
  11. package/src/snippets.ts +69 -55
  12. package/tsconfig.json +20 -9
  13. package/.vite/plugins/vite-plugin-external-deps.ts +0 -224
  14. package/.vite/plugins/vite-plugin-material-dev.ts +0 -218
  15. package/dist/component.esm.js +0 -28857
  16. package/dist/component.esm.js.map +0 -1
  17. package/dist/component.js +0 -28864
  18. package/dist/component.js.map +0 -1
  19. package/dist/component.min.js.map +0 -1
  20. package/dist/index.cjs +0 -29174
  21. package/dist/index.cjs.map +0 -1
  22. package/dist/index.esm.js +0 -29171
  23. package/dist/index.esm.js.map +0 -1
  24. package/dist/index.js +0 -29178
  25. package/dist/index.js.map +0 -1
  26. package/dist/index.min.js.map +0 -1
  27. package/dist/meta.esm.js +0 -319
  28. package/dist/meta.esm.js.map +0 -1
  29. package/dist/meta.js +0 -329
  30. package/dist/meta.js.map +0 -1
  31. package/dist/meta.min.js.map +0 -1
  32. package/dist/src/component.d.ts +0 -19
  33. package/dist/src/configure.d.ts +0 -7
  34. package/dist/src/constants.d.ts +0 -28
  35. package/dist/src/index.d.ts +0 -6
  36. package/dist/src/meta.d.ts +0 -3
  37. package/dist/src/snippets.d.ts +0 -3
  38. package/dist/src/types.d.ts +0 -50
  39. package/dist/src/utils.d.ts +0 -28
  40. package/rollup.config.js +0 -212
  41. package/src/types.ts +0 -55
  42. package/src/utils.ts +0 -57
  43. package/tsconfig.build.json +0 -12
  44. package/tsconfig.test.json +0 -7
  45. package/vite.config.ts +0 -54
package/dist/meta.min.js CHANGED
@@ -1,2 +1 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).EasyEditorMaterialsGaugeChartMeta={})}(this,function(e){"use strict";const t="EasyEditorMaterialsGaugeChart";const r={componentName:t,title:"仪表盘",group:"chart",devMode:"proCode",npm:{package:"@easy-editor/materials-dashboard-gauge-chart",version:"0.0.1",globalName:t,componentName:t},snippets:[{title:"仪表盘",screenshot:"",schema:{componentName:t,props:{value:65,min:0,max:100,showScale:!0,divisions:10,showLabels:!0,pointerType:"needle",pointerColor:"#ffffff"},$dashboard:{rect:{width:220,height:140}}}},{title:"发光仪表盘",screenshot:"",schema:{componentName:t,props:{value:78,min:0,max:100,unit:"%",showScale:!0,divisions:10,showLabels:!0,pointerType:"needle",pointerColor:"#00ffff",glowEffect:!0},$dashboard:{rect:{width:220,height:140}}}}],configure:{props:[{type:"group",title:"属性",setter:"TabSetter",items:[{type:"group",key:"config",title:"配置",setter:{componentName:"CollapseSetter",props:{icon:!1}},items:[{name:"id",title:"ID",setter:"NodeIdSetter",extraProps:{label:!1}},{name:"title",title:"标题",setter:"StringSetter",extraProps:{getValue:e=>e.getExtraPropValue("title"),setValue(e,t){e.setExtraPropValue("title",t)}}},{type:"group",title:"基础属性",setter:{componentName:"CollapseSetter",props:{icon:!1}},items:[{name:"rect",title:"位置尺寸",setter:"RectSetter",extraProps:{getValue:e=>e.getExtraPropValue("$dashboard.rect"),setValue(e,t){e.setExtraPropValue("$dashboard.rect",t)}}}]},{type:"group",title:"数值",setter:{componentName:"CollapseSetter",props:{icon:!1}},items:[{name:"value",title:"当前值",setter:"NumberSetter",extraProps:{defaultValue:0}},{name:"min",title:"最小值",setter:"NumberSetter",extraProps:{defaultValue:0}},{name:"max",title:"最大值",setter:"NumberSetter",extraProps:{defaultValue:100}},{name:"unit",title:"单位",setter:"StringSetter"}]},{type:"group",title:"数值格式",setter:{componentName:"CollapseSetter",props:{icon:!1}},items:[{name:"valuePrefix",title:"前缀",setter:"StringSetter"},{name:"valueSuffix",title:"后缀",setter:"StringSetter"},{name:"valueDecimals",title:"小数位数",setter:{componentName:"NumberSetter",props:{suffix:"位"}},extraProps:{defaultValue:0}},{name:"valueSeparator",title:"千分位分隔",setter:"SwitchSetter",extraProps:{defaultValue:!1}}]},{type:"group",title:"刻度",setter:{componentName:"CollapseSetter",props:{icon:!1}},items:[{name:"showScale",title:"显示刻度",setter:"SwitchSetter",extraProps:{defaultValue:!0}},{name:"divisions",title:"刻度数量",setter:{componentName:"SliderSetter",props:{min:2,max:20,step:1}},extraProps:{defaultValue:10}},{name:"showLabels",title:"显示刻度值",setter:"SwitchSetter",extraProps:{defaultValue:!0}}]},{type:"group",title:"样式",setter:{componentName:"CollapseSetter",props:{icon:!1}},items:[{name:"pointerType",title:"指针类型",setter:{componentName:"SegmentedSetter",props:{options:[{label:"针形",value:"needle"},{label:"三角形",value:"triangle"},{label:"矩形",value:"rect"}]}},extraProps:{defaultValue:"needle"}},{name:"pointerColor",title:"指针颜色",setter:"ColorSetter",extraProps:{defaultValue:"#ffffff"}},{name:"glowEffect",title:"发光效果",setter:"SwitchSetter",extraProps:{defaultValue:!1}}]}]},{type:"group",key:"data",title:"数据",items:[{name:"dataBinding",title:"数据绑定",setter:"DataBindingSetter"}]},{type:"group",key:"advanced",title:"高级",items:[{name:"condition",title:"显隐控制",setter:"SwitchSetter",extraProps:{defaultValue:!0,supportVariable:!0}}]}]}],component:{},supports:{},advanced:{}}};e.default=r,Object.defineProperty(e,"__esModule",{value:!0})});
2
- //# sourceMappingURL=meta.min.js.map
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).EasyEditorMaterialsGaugeChartMeta={})}(this,function(e){"use strict";const t=(e,t)=>{const a=Array.isArray(e)?e:[e],r=a[0]||{};return{sourceType:"static",staticData:a,fieldMappings:Object.keys(r).map(e=>({componentField:e,sourceField:e}))}},a=(e,t,a)=>({type:"group",title:e,setter:{componentName:"CollapseSetter",props:{icon:!1,...a}},items:t}),r={name:"nodeInfo",title:"节点信息",setter:"NodeInfoSetter",extraProps:{label:!1}},o=a("基础配置",[{name:"title",title:"标题",setter:"StringSetter",extraProps:{getValue:e=>e.getExtraPropValue("title"),setValue(e,t){e.setExtraPropValue("title",t)}}},{name:"rect",title:"位置尺寸",setter:"RectSetter",extraProps:{getValue:e=>e.getExtraPropValue("$dashboard.rect"),setValue(e,t){e.setExtraPropValue("$dashboard.rect",t)}}},{name:"rotation",title:"旋转角度",setter:{componentName:"SliderSetter",props:{min:0,max:360,suffix:"°"}},extraProps:{defaultValue:0}},{name:"opacity",title:"不透明度",setter:{componentName:"SliderSetter",props:{min:0,max:100,suffix:"%"}},extraProps:{defaultValue:100}},{name:"background",title:"背景颜色",setter:"ColorSetter",extraProps:{defaultValue:"transparent"}}]),l=[{title:"点击事件",children:[{label:"点击",value:"onClick",description:"鼠标点击时触发"},{label:"双击",value:"onDoubleClick",description:"鼠标双击时触发"}]},{title:"鼠标事件",children:[{label:"鼠标进入",value:"onMouseEnter",description:"鼠标进入时触发"},{label:"鼠标离开",value:"onMouseLeave",description:"鼠标离开时触发"}]}],i=((e=l)=>a("事件绑定",[{name:"events",title:"事件",setter:{componentName:"EventSetter",props:{events:e}},extraProps:{label:!1}}]))(),s=a("高级配置",[{title:"条件渲染",setter:"SwitchSetter",extraProps:{supportVariable:!0,getValue:e=>e.getNode().getExtraPropValue("condition"),setValue(e,t){e.getNode().setExtraProp("condition",t)}}}]),n="EasyEditorMaterialsGaugeChart";const p=((e,t)=>({props:[{type:"group",title:"属性",setter:"TabSetter",items:[{type:"group",key:"config",title:"配置",items:[r,o,e]},{type:"group",key:"data",title:"数据",items:[r,t]},{type:"group",key:"advanced",title:"高级",items:[r,i,s]}]}],component:{},supports:{},advanced:{}}))(a("组件配置",[{type:"group",title:"组件配置",setter:"SubTabSetter",items:[{type:"group",key:"value",title:"数值",items:[{name:"min",title:"最小值",setter:"NumberSetter",extraProps:{defaultValue:0}},{name:"max",title:"最大值",setter:"NumberSetter",extraProps:{defaultValue:100}},{name:"unit",title:"单位",setter:"StringSetter"}]},{type:"group",key:"scale",title:"刻度",items:[{name:"showScale",title:"显示刻度",setter:"SwitchSetter",extraProps:{defaultValue:!0}},{name:"divisions",title:"刻度数量",setter:{componentName:"SliderSetter",props:{min:2,max:20,step:1}},extraProps:{defaultValue:10}},{name:"showLabels",title:"显示刻度值",setter:"SwitchSetter",extraProps:{defaultValue:!0}}]},{type:"group",key:"style",title:"样式",items:[{name:"pointerType",title:"指针类型",setter:{componentName:"SegmentedSetter",props:{options:[{label:"针形",value:"needle"},{label:"三角形",value:"triangle"},{label:"矩形",value:"rect"}]}},extraProps:{defaultValue:"needle"}},{name:"pointerColor",title:"指针颜色",setter:"ColorSetter",extraProps:{defaultValue:"#00d4ff"}},{name:"glowEffect",title:"发光效果",setter:"SwitchSetter",extraProps:{defaultValue:!0}}]}]}],{padding:"6px 16px 12px"}),{name:"$data",title:"数据配置",setter:{componentName:"DataSetter",props:{expectedFields:[{name:"value",label:"value",type:"number",required:!0,description:"当前值"}],showPreview:!0,previewLimit:10}},extraProps:{label:!1}});const u={componentName:n,title:"仪表盘",group:"chart",devMode:"proCode",npm:{package:"@easy-editor/materials-dashboard-gauge-chart",version:"0.0.3",globalName:n,componentName:n},snippets:[{title:"仪表盘",screenshot:"",schema:{componentName:n,title:"仪表盘",props:{$data:t({value:65}),min:0,max:100,showScale:!0,divisions:10,showLabels:!0,pointerType:"needle",pointerColor:"#ffffff",rotation:0,opacity:100,background:"transparent"},$dashboard:{rect:{width:220,height:140}}}},{title:"发光仪表盘",screenshot:"",schema:{componentName:n,title:"发光仪表盘",props:{$data:t({value:78}),min:0,max:100,unit:"%",showScale:!0,divisions:10,showLabels:!0,pointerType:"needle",pointerColor:"#00ffff",glowEffect:!0,rotation:0,opacity:100,background:"transparent"},$dashboard:{rect:{width:220,height:140}}}}],configure:p};e.meta=u});
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @easy-editor/easypack configuration
3
+ * @type {import('@easy-editor/easypack').EasypackConfig}
4
+ */
5
+ export default {
6
+ preset: 'material',
7
+ dev: {
8
+ port: 5001,
9
+ },
10
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easy-editor/materials-dashboard-gauge-chart",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "Gauge Chart component for EasyEditor dashboard",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -47,20 +47,16 @@
47
47
  },
48
48
  "dependencies": {
49
49
  "echarts": "^5.6.0",
50
- "@easy-editor/materials-shared": "0.0.0"
50
+ "@easy-editor/materials-shared": "0.0.1"
51
51
  },
52
52
  "scripts": {
53
- "dev": "vite",
53
+ "dev": "easypack dev",
54
54
  "dev:debug": "vite --port 5006",
55
55
  "format": "biome format --write .",
56
56
  "lint": "biome check .",
57
57
  "build": "npm-run-all -nl build:*",
58
58
  "build:clean": "rimraf dist/",
59
- "build:js": "rollup -c",
60
- "build:types": "pnpm types",
61
- "types": "npm-run-all -nl types:*",
62
- "types:src": "tsc --project tsconfig.build.json",
63
- "test-types": "tsc --project tsconfig.test.json"
59
+ "build:js": "easypack build"
64
60
  },
65
61
  "module": "dist/index.esm.js",
66
62
  "unpkg": "dist/index.min.js"
package/src/component.tsx CHANGED
@@ -1,180 +1,225 @@
1
- import { useEffect, useRef, type CSSProperties, type Ref } from 'react'
2
- import * as echarts from 'echarts/core'
3
- import { GaugeChart } from 'echarts/charts'
4
- import { TooltipComponent } from 'echarts/components'
5
- import { CanvasRenderer } from 'echarts/renderers'
6
- import type { EChartsOption } from 'echarts'
7
- import { DEFAULT_RANGES, type GaugeRange } from './constants'
8
- import styles from './component.module.css'
9
-
10
- // 按需注册 ECharts 组件
11
- echarts.use([GaugeChart, TooltipComponent, CanvasRenderer])
12
-
13
- interface GaugeChartProps {
14
- ref?: Ref<HTMLDivElement>
15
- value?: number
16
- min?: number
17
- max?: number
18
- unit?: string
19
- showScale?: boolean
20
- divisions?: number
21
- showLabels?: boolean
22
- pointerType?: 'needle' | 'triangle' | 'rect'
23
- pointerColor?: string
24
- ranges?: GaugeRange[]
25
- glowEffect?: boolean
26
- style?: CSSProperties
27
- }
28
-
29
- const GaugeChartComponent = (props: GaugeChartProps) => {
30
- const {
31
- ref,
32
- value = 0,
33
- min = 0,
34
- max = 100,
35
- unit = '',
36
- showScale = true,
37
- divisions = 10,
38
- showLabels = true,
39
- pointerType = 'needle',
40
- pointerColor = '#00d4ff',
41
- ranges = DEFAULT_RANGES,
42
- glowEffect = true,
43
- style: externalStyle,
44
- } = props
45
-
46
- const chartRef = useRef<HTMLDivElement>(null)
47
- const chartInstance = useRef<echarts.ECharts | null>(null)
48
-
49
- useEffect(() => {
50
- if (!chartRef.current) {
51
- return
52
- }
53
-
54
- chartInstance.current = echarts.init(chartRef.current)
55
-
56
- // 构建颜色区间
57
- const axisLineColors: [number, string][] = ranges.map(range => [(range.to - min) / (max - min), range.color])
58
-
59
- // 指针宽度根据类型调整
60
- const pointerWidthMap: Record<string, number> = {
61
- needle: 4,
62
- triangle: 8,
63
- rect: 6,
64
- }
65
- const pointerWidth = pointerWidthMap[pointerType] ?? 6
66
-
67
- const option: EChartsOption = {
68
- backgroundColor: 'transparent',
69
- series: [
70
- {
71
- type: 'gauge',
72
- min,
73
- max,
74
- startAngle: 180,
75
- endAngle: 0,
76
- center: ['50%', '70%'],
77
- radius: '90%',
78
- progress: {
79
- show: false,
80
- },
81
- axisLine: {
82
- lineStyle: {
83
- width: 20,
84
- color: axisLineColors,
85
- shadowColor: glowEffect ? 'rgba(0, 212, 255, 0.3)' : 'transparent',
86
- shadowBlur: glowEffect ? 10 : 0,
87
- },
88
- },
89
- axisTick: {
90
- show: showScale,
91
- distance: -25,
92
- length: 6,
93
- lineStyle: {
94
- color: '#8899aa',
95
- width: 1,
96
- },
97
- splitNumber: divisions / 5,
98
- },
99
- splitLine: {
100
- show: showScale,
101
- distance: -30,
102
- length: 12,
103
- lineStyle: {
104
- color: '#8899aa',
105
- width: 2,
106
- },
107
- },
108
- axisLabel: {
109
- show: showLabels,
110
- distance: -40,
111
- color: '#8899aa',
112
- fontSize: 10,
113
- },
114
- pointer: {
115
- show: true,
116
- length: '60%',
117
- width: pointerWidth,
118
- itemStyle: {
119
- color: pointerColor,
120
- shadowColor: glowEffect ? pointerColor : 'transparent',
121
- shadowBlur: glowEffect ? 10 : 0,
122
- },
123
- },
124
- anchor: {
125
- show: true,
126
- size: 12,
127
- itemStyle: {
128
- color: pointerColor,
129
- shadowColor: glowEffect ? pointerColor : 'transparent',
130
- shadowBlur: glowEffect ? 5 : 0,
131
- },
132
- },
133
- title: {
134
- show: true,
135
- offsetCenter: [0, '30%'],
136
- color: '#8899aa',
137
- fontSize: 12,
138
- },
139
- detail: {
140
- valueAnimation: true,
141
- offsetCenter: [0, '50%'],
142
- fontSize: 28,
143
- fontWeight: 'bold',
144
- color: '#fff',
145
- formatter: (val: number) => `${val}${unit}`,
146
- textShadowColor: glowEffect ? 'rgba(0, 212, 255, 0.5)' : 'transparent',
147
- textShadowBlur: glowEffect ? 10 : 0,
148
- },
149
- data: [{ value }],
150
- },
151
- ],
152
- }
153
-
154
- chartInstance.current.setOption(option)
155
-
156
- const resizeObserver = new ResizeObserver(() => {
157
- chartInstance.current?.resize()
158
- })
159
- resizeObserver.observe(chartRef.current)
160
-
161
- return () => {
162
- resizeObserver.disconnect()
163
- chartInstance.current?.dispose()
164
- }
165
- }, [value, min, max, unit, showScale, divisions, showLabels, pointerType, pointerColor, ranges, glowEffect])
166
-
167
- const containerStyle: CSSProperties = {
168
- width: '100%',
169
- height: '100%',
170
- ...externalStyle,
171
- }
172
-
173
- return (
174
- <div className={styles.container} ref={ref} style={containerStyle}>
175
- <div className={styles.chart} ref={chartRef} />
176
- </div>
177
- )
178
- }
179
-
180
- export default GaugeChartComponent
1
+ /**
2
+ * Gauge Chart Component
3
+ * 仪表盘组件 - 支持数据源绑定和事件交互
4
+ */
5
+
6
+ import { useEffect, useMemo, useRef, type CSSProperties } from 'react'
7
+ import * as echarts from 'echarts/core'
8
+ import { GaugeChart as EChartsGaugeChart } from 'echarts/charts'
9
+ import { TooltipComponent } from 'echarts/components'
10
+ import { CanvasRenderer } from 'echarts/renderers'
11
+ import type { EChartsOption } from 'echarts'
12
+ import { type MaterialComponet, useDataSource } from '@easy-editor/materials-shared'
13
+ import { DEFAULT_RANGES, type GaugeRange } from './constants'
14
+ import styles from './component.module.css'
15
+
16
+ // 按需注册 ECharts 组件
17
+ echarts.use([EChartsGaugeChart, TooltipComponent, CanvasRenderer])
18
+
19
+ export interface GaugeChartProps extends MaterialComponet {
20
+ /** 最小值 */
21
+ min?: number
22
+ /** 最大值 */
23
+ max?: number
24
+ /** 单位 */
25
+ unit?: string
26
+ /** 显示刻度 */
27
+ showScale?: boolean
28
+ /** 刻度数量 */
29
+ divisions?: number
30
+ /** 显示刻度值 */
31
+ showLabels?: boolean
32
+ /** 指针类型 */
33
+ pointerType?: 'needle' | 'triangle' | 'rect'
34
+ /** 指针颜色 */
35
+ pointerColor?: string
36
+ /** 颜色区间 */
37
+ ranges?: GaugeRange[]
38
+ /** 发光效果 */
39
+ glowEffect?: boolean
40
+ /** 点击事件 */
41
+ onClick?: (e: React.MouseEvent) => void
42
+ /** 双击事件 */
43
+ onDoubleClick?: (e: React.MouseEvent) => void
44
+ /** 鼠标进入 */
45
+ onMouseEnter?: (e: React.MouseEvent) => void
46
+ /** 鼠标离开 */
47
+ onMouseLeave?: (e: React.MouseEvent) => void
48
+ }
49
+
50
+ export const GaugeChart: React.FC<GaugeChartProps> = ({
51
+ ref,
52
+ $data,
53
+ __dataSource,
54
+ min = 0,
55
+ max = 100,
56
+ unit = '',
57
+ showScale = true,
58
+ divisions = 10,
59
+ showLabels = true,
60
+ pointerType = 'needle',
61
+ pointerColor = '#00d4ff',
62
+ ranges = DEFAULT_RANGES,
63
+ glowEffect = true,
64
+ rotation = 0,
65
+ opacity = 100,
66
+ background = 'transparent',
67
+ style: externalStyle,
68
+ onClick,
69
+ onDoubleClick,
70
+ onMouseEnter,
71
+ onMouseLeave,
72
+ }) => {
73
+ const chartRef = useRef<HTMLDivElement>(null)
74
+ const chartInstance = useRef<echarts.ECharts | null>(null)
75
+
76
+ // 解析数据源(单值)
77
+ const dataSource = useDataSource($data, __dataSource)
78
+ const value = useMemo<number>(() => {
79
+ if (dataSource.length > 0 && dataSource[0]?.value !== undefined) {
80
+ return Number(dataSource[0].value)
81
+ }
82
+ return 0
83
+ }, [dataSource])
84
+
85
+ useEffect(() => {
86
+ if (!chartRef.current) {
87
+ return
88
+ }
89
+
90
+ chartInstance.current = echarts.init(chartRef.current)
91
+
92
+ // 构建颜色区间
93
+ const axisLineColors: [number, string][] = ranges.map(range => [(range.to - min) / (max - min), range.color])
94
+
95
+ // 指针宽度根据类型调整
96
+ const pointerWidthMap: Record<string, number> = {
97
+ needle: 4,
98
+ triangle: 8,
99
+ rect: 6,
100
+ }
101
+ const pointerWidth = pointerWidthMap[pointerType] ?? 6
102
+
103
+ const option: EChartsOption = {
104
+ backgroundColor: 'transparent',
105
+ series: [
106
+ {
107
+ type: 'gauge',
108
+ min,
109
+ max,
110
+ startAngle: 180,
111
+ endAngle: 0,
112
+ center: ['50%', '80%'],
113
+ radius: '72%',
114
+ progress: {
115
+ show: false,
116
+ },
117
+ axisLine: {
118
+ lineStyle: {
119
+ width: 16,
120
+ color: axisLineColors,
121
+ shadowColor: glowEffect ? 'rgba(0, 212, 255, 0.3)' : 'transparent',
122
+ shadowBlur: glowEffect ? 10 : 0,
123
+ },
124
+ },
125
+ axisTick: {
126
+ show: showScale,
127
+ distance: -20,
128
+ length: 4,
129
+ lineStyle: {
130
+ color: '#8899aa',
131
+ width: 1,
132
+ },
133
+ splitNumber: divisions / 5,
134
+ },
135
+ splitLine: {
136
+ show: showScale,
137
+ distance: -24,
138
+ length: 8,
139
+ lineStyle: {
140
+ color: '#8899aa',
141
+ width: 2,
142
+ },
143
+ },
144
+ axisLabel: {
145
+ show: showLabels,
146
+ distance: -32,
147
+ color: '#8899aa',
148
+ fontSize: 9,
149
+ },
150
+ pointer: {
151
+ show: true,
152
+ length: '55%',
153
+ width: pointerWidth,
154
+ itemStyle: {
155
+ color: pointerColor,
156
+ shadowColor: glowEffect ? pointerColor : 'transparent',
157
+ shadowBlur: glowEffect ? 10 : 0,
158
+ },
159
+ },
160
+ anchor: {
161
+ show: true,
162
+ size: 10,
163
+ itemStyle: {
164
+ color: pointerColor,
165
+ shadowColor: glowEffect ? pointerColor : 'transparent',
166
+ shadowBlur: glowEffect ? 5 : 0,
167
+ },
168
+ },
169
+ title: {
170
+ show: true,
171
+ offsetCenter: [0, '20%'],
172
+ color: '#8899aa',
173
+ fontSize: 11,
174
+ },
175
+ detail: {
176
+ valueAnimation: true,
177
+ offsetCenter: [0, '40%'],
178
+ fontSize: 22,
179
+ fontWeight: 'bold',
180
+ color: '#fff',
181
+ formatter: (val: number) => `${val}${unit}`,
182
+ textShadowColor: glowEffect ? 'rgba(0, 212, 255, 0.5)' : 'transparent',
183
+ textShadowBlur: glowEffect ? 10 : 0,
184
+ },
185
+ data: [{ value }],
186
+ },
187
+ ],
188
+ }
189
+
190
+ chartInstance.current.setOption(option)
191
+
192
+ const resizeObserver = new ResizeObserver(() => {
193
+ chartInstance.current?.resize()
194
+ })
195
+ resizeObserver.observe(chartRef.current)
196
+
197
+ return () => {
198
+ resizeObserver.disconnect()
199
+ chartInstance.current?.dispose()
200
+ }
201
+ }, [value, min, max, unit, showScale, divisions, showLabels, pointerType, pointerColor, ranges, glowEffect])
202
+
203
+ const containerStyle: CSSProperties = {
204
+ width: '100%',
205
+ height: '100%',
206
+ transform: rotation !== 0 ? `rotate(${rotation}deg)` : undefined,
207
+ opacity: opacity / 100,
208
+ backgroundColor: background,
209
+ ...externalStyle,
210
+ }
211
+
212
+ return (
213
+ <div
214
+ className={styles.container}
215
+ onClick={onClick}
216
+ onDoubleClick={onDoubleClick}
217
+ onMouseEnter={onMouseEnter}
218
+ onMouseLeave={onMouseLeave}
219
+ ref={ref}
220
+ style={containerStyle}
221
+ >
222
+ <div className={styles.chart} ref={chartRef} />
223
+ </div>
224
+ )
225
+ }