@orbcharts/plugins-basic 3.0.0-beta.10 → 3.0.0-beta.11

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 (99) hide show
  1. package/LICENSE +200 -200
  2. package/dist/orbcharts-plugins-basic.es.js +177 -177
  3. package/dist/orbcharts-plugins-basic.umd.js +55 -55
  4. package/lib/core-types.ts +7 -7
  5. package/lib/core.ts +6 -6
  6. package/lib/plugins-basic-types.ts +6 -6
  7. package/package.json +44 -44
  8. package/src/base/BaseBars.ts +765 -765
  9. package/src/base/BaseBarsTriangle.ts +676 -676
  10. package/src/base/BaseDots.ts +464 -464
  11. package/src/base/BaseGroupAxis.ts +679 -679
  12. package/src/base/BaseLegend.ts +684 -684
  13. package/src/base/BaseLineAreas.ts +629 -629
  14. package/src/base/BaseLines.ts +706 -706
  15. package/src/base/BaseStackedBar.ts +782 -782
  16. package/src/base/BaseTooltip.ts +385 -385
  17. package/src/base/BaseValueAxis.ts +583 -583
  18. package/src/base/types.ts +2 -2
  19. package/src/const.ts +30 -30
  20. package/src/grid/defaults.ts +246 -246
  21. package/src/grid/gridObservables.ts +554 -554
  22. package/src/grid/index.ts +16 -16
  23. package/src/grid/plugins/Bars.ts +69 -69
  24. package/src/grid/plugins/BarsPN.ts +66 -66
  25. package/src/grid/plugins/BarsTriangle.ts +73 -73
  26. package/src/grid/plugins/Dots.ts +68 -68
  27. package/src/grid/plugins/GridLegend.ts +107 -107
  28. package/src/grid/plugins/GridTooltip.ts +66 -66
  29. package/src/grid/plugins/GridZoom.ts +218 -218
  30. package/src/grid/plugins/GroupAux.ts +1103 -1103
  31. package/src/grid/plugins/GroupAxis.ts +97 -97
  32. package/src/grid/plugins/LineAreas.ts +65 -65
  33. package/src/grid/plugins/Lines.ts +59 -59
  34. package/src/grid/plugins/StackedBar.ts +64 -64
  35. package/src/grid/plugins/StackedValueAxis.ts +96 -96
  36. package/src/grid/plugins/ValueAxis.ts +94 -94
  37. package/src/index.ts +6 -6
  38. package/src/multiGrid/defaults.ts +224 -224
  39. package/src/multiGrid/index.ts +14 -14
  40. package/src/multiGrid/multiGridObservables.ts +49 -49
  41. package/src/multiGrid/plugins/MultiBars.ts +108 -108
  42. package/src/multiGrid/plugins/MultiBarsTriangle.ts +114 -114
  43. package/src/multiGrid/plugins/MultiDots.ts +102 -102
  44. package/src/multiGrid/plugins/MultiGridLegend.ts +159 -159
  45. package/src/multiGrid/plugins/MultiGridTooltip.ts +66 -66
  46. package/src/multiGrid/plugins/MultiGroupAxis.ts +137 -137
  47. package/src/multiGrid/plugins/MultiLineAreas.ts +107 -107
  48. package/src/multiGrid/plugins/MultiLines.ts +101 -101
  49. package/src/multiGrid/plugins/MultiStackedBar.ts +106 -106
  50. package/src/multiGrid/plugins/MultiStackedValueAxis.ts +134 -134
  51. package/src/multiGrid/plugins/MultiValueAxis.ts +134 -134
  52. package/src/multiGrid/plugins/OverlappingStackedValueAxes.ts +299 -299
  53. package/src/multiGrid/plugins/OverlappingValueAxes.ts +300 -300
  54. package/src/multiValue/defaults.ts +166 -166
  55. package/src/multiValue/index.ts +8 -8
  56. package/src/multiValue/multiValueObservables.ts +297 -297
  57. package/src/multiValue/plugins/MultiValueLegend.ts +107 -107
  58. package/src/multiValue/plugins/MultiValueTooltip.ts +66 -66
  59. package/src/multiValue/plugins/Scatter.ts +426 -426
  60. package/src/multiValue/plugins/ScatterBubbles.ts +554 -554
  61. package/src/multiValue/plugins/XYAux.ts +681 -681
  62. package/src/multiValue/plugins/XYAxes.ts +684 -684
  63. package/src/multiValue/plugins/XYZoom.ts +299 -299
  64. package/src/noneData/defaults.ts +102 -102
  65. package/src/noneData/index.ts +3 -3
  66. package/src/noneData/plugins/Container.ts +27 -27
  67. package/src/noneData/plugins/Tooltip.ts +373 -373
  68. package/src/relationship/defaults.ts +196 -195
  69. package/src/relationship/index.ts +5 -5
  70. package/src/relationship/plugins/ForceDirected.ts +1168 -1166
  71. package/src/relationship/plugins/ForceDirectedBubbles.ts +1393 -1390
  72. package/src/relationship/plugins/RelationshipLegend.ts +100 -100
  73. package/src/relationship/plugins/RelationshipTooltip.ts +66 -66
  74. package/src/relationship/relationshipObservables.ts +49 -49
  75. package/src/series/defaults.ts +207 -206
  76. package/src/series/index.ts +9 -9
  77. package/src/series/plugins/Bubbles.ts +603 -606
  78. package/src/series/plugins/Pie.ts +623 -623
  79. package/src/series/plugins/PieEventTexts.ts +284 -284
  80. package/src/series/plugins/PieLabels.ts +640 -640
  81. package/src/series/plugins/Rose.ts +516 -516
  82. package/src/series/plugins/RoseLabels.ts +600 -600
  83. package/src/series/plugins/SeriesLegend.ts +107 -107
  84. package/src/series/plugins/SeriesTooltip.ts +66 -66
  85. package/src/series/seriesObservables.ts +145 -145
  86. package/src/series/seriesUtils.ts +51 -51
  87. package/src/tree/defaults.ts +78 -78
  88. package/src/tree/index.ts +4 -4
  89. package/src/tree/plugins/TreeLegend.ts +100 -100
  90. package/src/tree/plugins/TreeMap.ts +333 -333
  91. package/src/tree/plugins/TreeTooltip.ts +66 -66
  92. package/src/utils/commonUtils.ts +21 -21
  93. package/src/utils/d3Graphics.ts +174 -174
  94. package/src/utils/d3Utils.ts +74 -74
  95. package/src/utils/observables.ts +14 -14
  96. package/src/utils/orbchartsUtils.ts +115 -115
  97. package/tsconfig.base.json +13 -13
  98. package/tsconfig.json +2 -2
  99. package/vite.config.js +22 -22
@@ -1,52 +1,52 @@
1
- import * as d3 from 'd3'
2
- import type { ComputedDataSeries, ComputedDatumSeries, EventName, EventSeries, HighlightTarget } from '../../lib/core-types'
3
- // import type { D3PieDatum, PieDatum } from '../types'
4
-
5
- // 由d3.pie()建出來的資料格式
6
- export interface D3PieDatum {
7
- data: any
8
- index: number,
9
- value: number,
10
- startAngle: number,
11
- endAngle: number,
12
- padAngle: number,
13
- }
14
-
15
- export interface PieDatum extends D3PieDatum {
16
- data: ComputedDatumSeries
17
- id: string
18
- }
19
-
20
- export function makePieData ({ data, startAngle, endAngle }: {
21
- data: ComputedDatumSeries[]
22
- startAngle: number
23
- endAngle: number
24
- // itemLabels: string[]
25
- // arcLabels: string[]
26
- }): PieDatum[] {
27
- let pie = d3.pie<any, any>()
28
- .startAngle(startAngle)
29
- // .endAngle(startAngle + (endAngle - startAngle) * t)
30
- .endAngle(endAngle)
31
- .value(d => d.value)
32
- // .value((d) => d.visible == false ? 0 : d.value)
33
- // .sort(null) // 不要排序
34
- .sort((a, b) => a.seq - b.seq)
35
- // .sort((a: any, b: any) => {
36
- // return b.value - a.value
37
- // })
38
- // .sort(d3.ascending)
39
- const pieData = pie(data)
40
- return pieData.map((d: D3PieDatum, i: number) => {
41
- // const itemLabel = d.data.itemLabel
42
- let _d: any = d
43
- _d.id = d.data.id
44
- return _d
45
- // return {
46
- // ...d,
47
- // itemIndex: itemLabels.indexOf(itemLabel),
48
- // itemLabel,
49
- // id: d.data.id,
50
- // }
51
- })
1
+ import * as d3 from 'd3'
2
+ import type { ComputedDataSeries, ComputedDatumSeries, EventName, EventSeries, HighlightTarget } from '../../lib/core-types'
3
+ // import type { D3PieDatum, PieDatum } from '../types'
4
+
5
+ // 由d3.pie()建出來的資料格式
6
+ export interface D3PieDatum {
7
+ data: any
8
+ index: number,
9
+ value: number,
10
+ startAngle: number,
11
+ endAngle: number,
12
+ padAngle: number,
13
+ }
14
+
15
+ export interface PieDatum extends D3PieDatum {
16
+ data: ComputedDatumSeries
17
+ id: string
18
+ }
19
+
20
+ export function makePieData ({ data, startAngle, endAngle }: {
21
+ data: ComputedDatumSeries[]
22
+ startAngle: number
23
+ endAngle: number
24
+ // itemLabels: string[]
25
+ // arcLabels: string[]
26
+ }): PieDatum[] {
27
+ let pie = d3.pie<any, any>()
28
+ .startAngle(startAngle)
29
+ // .endAngle(startAngle + (endAngle - startAngle) * t)
30
+ .endAngle(endAngle)
31
+ .value(d => d.value)
32
+ // .value((d) => d.visible == false ? 0 : d.value)
33
+ // .sort(null) // 不要排序
34
+ .sort((a, b) => a.seq - b.seq)
35
+ // .sort((a: any, b: any) => {
36
+ // return b.value - a.value
37
+ // })
38
+ // .sort(d3.ascending)
39
+ const pieData = pie(data)
40
+ return pieData.map((d: D3PieDatum, i: number) => {
41
+ // const itemLabel = d.data.itemLabel
42
+ let _d: any = d
43
+ _d.id = d.data.id
44
+ return _d
45
+ // return {
46
+ // ...d,
47
+ // itemIndex: itemLabels.indexOf(itemLabel),
48
+ // itemLabel,
49
+ // id: d.data.id,
50
+ // }
51
+ })
52
52
  }
@@ -1,79 +1,79 @@
1
- import type { TreeMapParams, TreeLegendParams, TreeTooltipParams } from '../../lib/plugins-basic-types'
2
-
3
- export const DEFAULT_TREE_MAP_PARAMS: TreeMapParams = {
4
- paddingInner: 2,
5
- paddingOuter: 2,
6
- labelColorType: 'primary',
7
- squarifyRatio: 1.618034, // 黃金比例
8
- sort: (a, b) => b.value - a.value
9
- }
10
- DEFAULT_TREE_MAP_PARAMS.sort.toString = () => `(a, b) => b.value - a.value`
11
-
12
- export const DEFAULT_TREE_LEGEND_PARAMS: TreeLegendParams = {
13
- // position: 'right',
14
- // justify: 'end',
15
- placement: 'right-end',
16
- padding: 28,
17
- backgroundFill: 'none',
18
- backgroundStroke: 'none',
19
- gap: 10,
20
- listRectWidth: 14,
21
- listRectHeight: 14,
22
- listRectRadius: 0,
23
- textColorType: 'primary'
24
- }
25
-
26
- export const DEFAULT_TREE_TOOLTIP_PARAMS: TreeTooltipParams = {
27
- backgroundColorType: 'background',
28
- strokeColorType: 'primary',
29
- backgroundOpacity: 0.8,
30
- textColorType: 'primary',
31
- offset: [20, 5],
32
- padding: 10,
33
- renderFn: (eventData, { styles, utils }) => {
34
- const hasCategoryLabel = eventData.categoryLabel ? true : false
35
- const hasDatumLabel = eventData.datum.label ? true : false
36
- const bulletWidth = styles.textSizePx * 0.7
37
- const offset = (styles.textSizePx / 2) - (bulletWidth / 2)
38
- const categorySvg = hasCategoryLabel
39
- ? `<rect width="${bulletWidth}" height="${bulletWidth}" x="${offset}" y="${offset - 1}" rx="${bulletWidth / 2}" fill="${eventData.datum.color}"></rect>
40
- <text x="${styles.textSizePx * 1.5}" font-size="${styles.textSizePx}" dominant-baseline="hanging" fill="${styles.textColor}">
41
- <tspan>${eventData.categoryLabel}</tspan>
42
- </text>`
43
- : ''
44
- const datumLabelSvg = hasDatumLabel
45
- ? `<tspan>${eventData.datum.label}</tspan> `
46
- : ''
47
- const datumSvg = `<text font-size="${styles.textSizePx}" dominant-baseline="hanging" fill="${styles.textColor}">
48
- ${datumLabelSvg}<tspan font-weight="bold">${eventData.datum.value}</tspan>
49
- </text>`
50
-
51
- return `${categorySvg}
52
- <g ${hasCategoryLabel ? `transform="translate(0, ${styles.textSizePx * 2})"` : ''}>
53
- ${datumSvg}
54
- </g>`
55
- },
56
- }
57
- DEFAULT_TREE_TOOLTIP_PARAMS.renderFn.toString = () => `(eventData, { styles, utils }) => {
58
- const hasCategoryLabel = eventData.categoryLabel ? true : false
59
- const hasDatumLabel = eventData.datum.label ? true : false
60
- const bulletWidth = styles.textSizePx * 0.7
61
- const offset = (styles.textSizePx / 2) - (bulletWidth / 2)
62
- const categorySvg = hasCategoryLabel
63
- ? \`<rect width="\${bulletWidth}" height="\${bulletWidth}" x="\${offset}" y="\${offset - 1}" rx="\${bulletWidth / 2}" fill="\${eventData.datum.color}"></rect>
64
- <text x="\${styles.textSizePx * 1.5}" font-size="\${styles.textSizePx}" dominant-baseline="hanging" fill="\${styles.textColor}">
65
- <tspan>\${eventData.categoryLabel}</tspan>
66
- </text>\`
67
- : ''
68
- const datumLabelSvg = hasDatumLabel
69
- ? \`<tspan>\${eventData.datum.label}</tspan> \`
70
- : ''
71
- const datumSvg = \`<text font-size="\${styles.textSizePx}" dominant-baseline="hanging" fill="\${styles.textColor}">
72
- \${datumLabelSvg}<tspan font-weight="bold">\${eventData.datum.value}</tspan>
73
- </text>\`
74
-
75
- return \`\${categorySvg}
76
- <g \${hasCategoryLabel ? \`transform="translate(0, \${styles.textSizePx * 2})"\` : ''}>
77
- \${datumSvg}
78
- </g>\`
1
+ import type { TreeMapParams, TreeLegendParams, TreeTooltipParams } from '../../lib/plugins-basic-types'
2
+
3
+ export const DEFAULT_TREE_MAP_PARAMS: TreeMapParams = {
4
+ paddingInner: 2,
5
+ paddingOuter: 2,
6
+ labelColorType: 'primary',
7
+ squarifyRatio: 1.618034, // 黃金比例
8
+ sort: (a, b) => b.value - a.value
9
+ }
10
+ DEFAULT_TREE_MAP_PARAMS.sort.toString = () => `(a, b) => b.value - a.value`
11
+
12
+ export const DEFAULT_TREE_LEGEND_PARAMS: TreeLegendParams = {
13
+ // position: 'right',
14
+ // justify: 'end',
15
+ placement: 'right-end',
16
+ padding: 28,
17
+ backgroundFill: 'none',
18
+ backgroundStroke: 'none',
19
+ gap: 10,
20
+ listRectWidth: 14,
21
+ listRectHeight: 14,
22
+ listRectRadius: 0,
23
+ textColorType: 'primary'
24
+ }
25
+
26
+ export const DEFAULT_TREE_TOOLTIP_PARAMS: TreeTooltipParams = {
27
+ backgroundColorType: 'background',
28
+ strokeColorType: 'primary',
29
+ backgroundOpacity: 0.8,
30
+ textColorType: 'primary',
31
+ offset: [20, 5],
32
+ padding: 10,
33
+ renderFn: (eventData, { styles, utils }) => {
34
+ const hasCategoryLabel = eventData.categoryLabel ? true : false
35
+ const hasDatumLabel = eventData.datum.label ? true : false
36
+ const bulletWidth = styles.textSizePx * 0.7
37
+ const offset = (styles.textSizePx / 2) - (bulletWidth / 2)
38
+ const categorySvg = hasCategoryLabel
39
+ ? `<rect width="${bulletWidth}" height="${bulletWidth}" x="${offset}" y="${offset - 1}" rx="${bulletWidth / 2}" fill="${eventData.datum.color}"></rect>
40
+ <text x="${styles.textSizePx * 1.5}" font-size="${styles.textSizePx}" dominant-baseline="hanging" fill="${styles.textColor}">
41
+ <tspan>${eventData.categoryLabel}</tspan>
42
+ </text>`
43
+ : ''
44
+ const datumLabelSvg = hasDatumLabel
45
+ ? `<tspan>${eventData.datum.label}</tspan> `
46
+ : ''
47
+ const datumSvg = `<text font-size="${styles.textSizePx}" dominant-baseline="hanging" fill="${styles.textColor}">
48
+ ${datumLabelSvg}<tspan font-weight="bold">${eventData.datum.value}</tspan>
49
+ </text>`
50
+
51
+ return `${categorySvg}
52
+ <g ${hasCategoryLabel ? `transform="translate(0, ${styles.textSizePx * 2})"` : ''}>
53
+ ${datumSvg}
54
+ </g>`
55
+ },
56
+ }
57
+ DEFAULT_TREE_TOOLTIP_PARAMS.renderFn.toString = () => `(eventData, { styles, utils }) => {
58
+ const hasCategoryLabel = eventData.categoryLabel ? true : false
59
+ const hasDatumLabel = eventData.datum.label ? true : false
60
+ const bulletWidth = styles.textSizePx * 0.7
61
+ const offset = (styles.textSizePx / 2) - (bulletWidth / 2)
62
+ const categorySvg = hasCategoryLabel
63
+ ? \`<rect width="\${bulletWidth}" height="\${bulletWidth}" x="\${offset}" y="\${offset - 1}" rx="\${bulletWidth / 2}" fill="\${eventData.datum.color}"></rect>
64
+ <text x="\${styles.textSizePx * 1.5}" font-size="\${styles.textSizePx}" dominant-baseline="hanging" fill="\${styles.textColor}">
65
+ <tspan>\${eventData.categoryLabel}</tspan>
66
+ </text>\`
67
+ : ''
68
+ const datumLabelSvg = hasDatumLabel
69
+ ? \`<tspan>\${eventData.datum.label}</tspan> \`
70
+ : ''
71
+ const datumSvg = \`<text font-size="\${styles.textSizePx}" dominant-baseline="hanging" fill="\${styles.textColor}">
72
+ \${datumLabelSvg}<tspan font-weight="bold">\${eventData.datum.value}</tspan>
73
+ </text>\`
74
+
75
+ return \`\${categorySvg}
76
+ <g \${hasCategoryLabel ? \`transform="translate(0, \${styles.textSizePx * 2})"\` : ''}>
77
+ \${datumSvg}
78
+ </g>\`
79
79
  }`
package/src/tree/index.ts CHANGED
@@ -1,5 +1,5 @@
1
- export * from './defaults'
2
- // export * from './types'
3
- export { TreeLegend } from './plugins/TreeLegend'
4
- export { TreeMap } from './plugins/TreeMap'
1
+ export * from './defaults'
2
+ // export * from './types'
3
+ export { TreeLegend } from './plugins/TreeLegend'
4
+ export { TreeMap } from './plugins/TreeMap'
5
5
  export { TreeTooltip } from './plugins/TreeTooltip'
@@ -1,100 +1,100 @@
1
- import * as d3 from 'd3'
2
- import {
3
- combineLatest,
4
- map,
5
- switchMap,
6
- takeUntil,
7
- Observable,
8
- Subject } from 'rxjs'
9
- import type { DefinePluginConfig } from '../../../lib/core-types'
10
- import {
11
- defineTreePlugin } from '../../../lib/core'
12
- import { DEFAULT_TREE_LEGEND_PARAMS } from '../defaults'
13
- import { createBaseLegend } from '../../base/BaseLegend'
14
- import { LAYER_INDEX_OF_INFO } from '../../const'
15
-
16
- const pluginName = 'TreeLegend'
17
-
18
- const pluginConfig: DefinePluginConfig<typeof pluginName, typeof DEFAULT_TREE_LEGEND_PARAMS> = {
19
- name: pluginName,
20
- defaultParams: DEFAULT_TREE_LEGEND_PARAMS,
21
- layerIndex: LAYER_INDEX_OF_INFO,
22
- validator: (params, { validateColumns }) => {
23
- const result = validateColumns(params, {
24
- placement: {
25
- toBe: '"top" | "top-start" | "top-end" | "bottom" | "bottom-start" | "bottom-end" | "left" | "left-start" | "left-end" | "right" | "right-start" | "right-end"',
26
- test: (value) => {
27
- return [
28
- 'top', 'top-start', 'top-end',
29
- 'bottom', 'bottom-start', 'bottom-end',
30
- 'left', 'left-start', 'left-end',
31
- 'right', 'right-start', 'right-end'
32
- ].includes(value)
33
- }
34
- },
35
- padding: {
36
- toBeTypes: ['number']
37
- },
38
- backgroundFill: {
39
- toBeOption: 'ColorType',
40
- },
41
- backgroundStroke: {
42
- toBeOption: 'ColorType',
43
- },
44
- gap: {
45
- toBeTypes: ['number']
46
- },
47
- listRectWidth: {
48
- toBeTypes: ['number']
49
- },
50
- listRectHeight: {
51
- toBeTypes: ['number']
52
- },
53
- listRectRadius: {
54
- toBeTypes: ['number']
55
- },
56
- textColorType: {
57
- toBeOption: 'ColorType',
58
- }
59
- })
60
- return result
61
- }
62
- }
63
-
64
- export const TreeLegend = defineTreePlugin(pluginConfig)(({ selection, rootSelection, observer, subject }) => {
65
-
66
- const destroy$ = new Subject()
67
-
68
- // 全部列點矩型使用相同樣式參數
69
- const fullParams$ = observer.fullParams$.pipe(
70
- takeUntil(destroy$),
71
- map(d => {
72
- const labelList = [
73
- {
74
- listRectWidth: d.listRectWidth,
75
- listRectHeight: d.listRectHeight,
76
- listRectRadius: d.listRectRadius,
77
- }
78
- ]
79
- return {
80
- ...d,
81
- labelList
82
- }
83
- })
84
- )
85
-
86
- const unsubscribeBaseLegend = createBaseLegend(pluginName, {
87
- rootSelection,
88
- legendLabels$: observer.categoryLabels$,
89
- fullParams$,
90
- layout$: observer.layout$,
91
- fullChartParams$: observer.fullChartParams$,
92
- textSizePx$: observer.textSizePx$
93
- })
94
-
95
- return () => {
96
- destroy$.next(undefined)
97
- unsubscribeBaseLegend()
98
- }
99
- })
100
-
1
+ import * as d3 from 'd3'
2
+ import {
3
+ combineLatest,
4
+ map,
5
+ switchMap,
6
+ takeUntil,
7
+ Observable,
8
+ Subject } from 'rxjs'
9
+ import type { DefinePluginConfig } from '../../../lib/core-types'
10
+ import {
11
+ defineTreePlugin } from '../../../lib/core'
12
+ import { DEFAULT_TREE_LEGEND_PARAMS } from '../defaults'
13
+ import { createBaseLegend } from '../../base/BaseLegend'
14
+ import { LAYER_INDEX_OF_INFO } from '../../const'
15
+
16
+ const pluginName = 'TreeLegend'
17
+
18
+ const pluginConfig: DefinePluginConfig<typeof pluginName, typeof DEFAULT_TREE_LEGEND_PARAMS> = {
19
+ name: pluginName,
20
+ defaultParams: DEFAULT_TREE_LEGEND_PARAMS,
21
+ layerIndex: LAYER_INDEX_OF_INFO,
22
+ validator: (params, { validateColumns }) => {
23
+ const result = validateColumns(params, {
24
+ placement: {
25
+ toBe: '"top" | "top-start" | "top-end" | "bottom" | "bottom-start" | "bottom-end" | "left" | "left-start" | "left-end" | "right" | "right-start" | "right-end"',
26
+ test: (value) => {
27
+ return [
28
+ 'top', 'top-start', 'top-end',
29
+ 'bottom', 'bottom-start', 'bottom-end',
30
+ 'left', 'left-start', 'left-end',
31
+ 'right', 'right-start', 'right-end'
32
+ ].includes(value)
33
+ }
34
+ },
35
+ padding: {
36
+ toBeTypes: ['number']
37
+ },
38
+ backgroundFill: {
39
+ toBeOption: 'ColorType',
40
+ },
41
+ backgroundStroke: {
42
+ toBeOption: 'ColorType',
43
+ },
44
+ gap: {
45
+ toBeTypes: ['number']
46
+ },
47
+ listRectWidth: {
48
+ toBeTypes: ['number']
49
+ },
50
+ listRectHeight: {
51
+ toBeTypes: ['number']
52
+ },
53
+ listRectRadius: {
54
+ toBeTypes: ['number']
55
+ },
56
+ textColorType: {
57
+ toBeOption: 'ColorType',
58
+ }
59
+ })
60
+ return result
61
+ }
62
+ }
63
+
64
+ export const TreeLegend = defineTreePlugin(pluginConfig)(({ selection, rootSelection, observer, subject }) => {
65
+
66
+ const destroy$ = new Subject()
67
+
68
+ // 全部列點矩型使用相同樣式參數
69
+ const fullParams$ = observer.fullParams$.pipe(
70
+ takeUntil(destroy$),
71
+ map(d => {
72
+ const labelList = [
73
+ {
74
+ listRectWidth: d.listRectWidth,
75
+ listRectHeight: d.listRectHeight,
76
+ listRectRadius: d.listRectRadius,
77
+ }
78
+ ]
79
+ return {
80
+ ...d,
81
+ labelList
82
+ }
83
+ })
84
+ )
85
+
86
+ const unsubscribeBaseLegend = createBaseLegend(pluginName, {
87
+ rootSelection,
88
+ legendLabels$: observer.categoryLabels$,
89
+ fullParams$,
90
+ layout$: observer.layout$,
91
+ fullChartParams$: observer.fullChartParams$,
92
+ textSizePx$: observer.textSizePx$
93
+ })
94
+
95
+ return () => {
96
+ destroy$.next(undefined)
97
+ unsubscribeBaseLegend()
98
+ }
99
+ })
100
+