@363045841yyt/klinechart-core 0.7.6 → 0.7.7

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 (191) hide show
  1. package/dist/config/chartSettings.d.ts +27 -2
  2. package/dist/config/chartSettings.d.ts.map +1 -1
  3. package/dist/config/chartSettings.js +6 -0
  4. package/dist/config/chartSettings.js.map +1 -1
  5. package/dist/engine/chart.d.ts.map +1 -1
  6. package/dist/engine/chart.js +4 -0
  7. package/dist/engine/chart.js.map +1 -1
  8. package/dist/engine/draw/pixelAlign.d.ts.map +1 -1
  9. package/dist/engine/draw/pixelAlign.js.map +1 -1
  10. package/dist/engine/drawing/plugin.js +1 -1
  11. package/dist/engine/drawing/plugin.js.map +1 -1
  12. package/dist/engine/renderers/Indicator/atr.d.ts.map +1 -1
  13. package/dist/engine/renderers/Indicator/atr.js +7 -4
  14. package/dist/engine/renderers/Indicator/atr.js.map +1 -1
  15. package/dist/engine/renderers/Indicator/boll.js +12 -12
  16. package/dist/engine/renderers/Indicator/boll.js.map +1 -1
  17. package/dist/engine/renderers/Indicator/cci.d.ts +1 -2
  18. package/dist/engine/renderers/Indicator/cci.d.ts.map +1 -1
  19. package/dist/engine/renderers/Indicator/cci.js +9 -9
  20. package/dist/engine/renderers/Indicator/cci.js.map +1 -1
  21. package/dist/engine/renderers/Indicator/ene.js +12 -12
  22. package/dist/engine/renderers/Indicator/ene.js.map +1 -1
  23. package/dist/engine/renderers/Indicator/expma.js +6 -6
  24. package/dist/engine/renderers/Indicator/expma.js.map +1 -1
  25. package/dist/engine/renderers/Indicator/fastk.d.ts +1 -2
  26. package/dist/engine/renderers/Indicator/fastk.d.ts.map +1 -1
  27. package/dist/engine/renderers/Indicator/fastk.js +7 -7
  28. package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
  29. package/dist/engine/renderers/Indicator/kst.d.ts +1 -2
  30. package/dist/engine/renderers/Indicator/kst.d.ts.map +1 -1
  31. package/dist/engine/renderers/Indicator/kst.js +10 -10
  32. package/dist/engine/renderers/Indicator/kst.js.map +1 -1
  33. package/dist/engine/renderers/Indicator/ma.js +5 -5
  34. package/dist/engine/renderers/Indicator/ma.js.map +1 -1
  35. package/dist/engine/renderers/Indicator/macd.d.ts +1 -2
  36. package/dist/engine/renderers/Indicator/macd.d.ts.map +1 -1
  37. package/dist/engine/renderers/Indicator/macd.js +24 -24
  38. package/dist/engine/renderers/Indicator/macd.js.map +1 -1
  39. package/dist/engine/renderers/Indicator/macdLegend.js +6 -6
  40. package/dist/engine/renderers/Indicator/macdLegend.js.map +1 -1
  41. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js +16 -16
  42. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js.map +1 -1
  43. package/dist/engine/renderers/Indicator/mom.d.ts +1 -2
  44. package/dist/engine/renderers/Indicator/mom.d.ts.map +1 -1
  45. package/dist/engine/renderers/Indicator/mom.js +8 -8
  46. package/dist/engine/renderers/Indicator/mom.js.map +1 -1
  47. package/dist/engine/renderers/Indicator/rsi.d.ts +2 -3
  48. package/dist/engine/renderers/Indicator/rsi.d.ts.map +1 -1
  49. package/dist/engine/renderers/Indicator/rsi.js +15 -15
  50. package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
  51. package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts +1 -2
  52. package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts.map +1 -1
  53. package/dist/engine/renderers/Indicator/scale/indicator_scale.js +5 -5
  54. package/dist/engine/renderers/Indicator/scale/indicator_scale.js.map +1 -1
  55. package/dist/engine/renderers/Indicator/stoch.d.ts +1 -2
  56. package/dist/engine/renderers/Indicator/stoch.d.ts.map +1 -1
  57. package/dist/engine/renderers/Indicator/stoch.js +10 -10
  58. package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
  59. package/dist/engine/renderers/Indicator/structure.js +5 -5
  60. package/dist/engine/renderers/Indicator/structure.js.map +1 -1
  61. package/dist/engine/renderers/Indicator/wmsr.d.ts +1 -2
  62. package/dist/engine/renderers/Indicator/wmsr.d.ts.map +1 -1
  63. package/dist/engine/renderers/Indicator/wmsr.js +10 -10
  64. package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
  65. package/dist/engine/renderers/Indicator/zones.js +6 -6
  66. package/dist/engine/renderers/Indicator/zones.js.map +1 -1
  67. package/dist/engine/renderers/candle.d.ts +1 -1
  68. package/dist/engine/renderers/candle.d.ts.map +1 -1
  69. package/dist/engine/renderers/candle.js +21 -21
  70. package/dist/engine/renderers/candle.js.map +1 -1
  71. package/dist/engine/renderers/crosshair.js +3 -3
  72. package/dist/engine/renderers/crosshair.js.map +1 -1
  73. package/dist/engine/renderers/extremaMarkers.d.ts.map +1 -1
  74. package/dist/engine/renderers/extremaMarkers.js +12 -12
  75. package/dist/engine/renderers/extremaMarkers.js.map +1 -1
  76. package/dist/engine/renderers/gridLines.js +3 -3
  77. package/dist/engine/renderers/gridLines.js.map +1 -1
  78. package/dist/engine/renderers/lastPrice.js +7 -7
  79. package/dist/engine/renderers/lastPrice.js.map +1 -1
  80. package/dist/engine/renderers/paneTitle.js +6 -6
  81. package/dist/engine/renderers/paneTitle.js.map +1 -1
  82. package/dist/engine/renderers/subVolume.d.ts.map +1 -1
  83. package/dist/engine/renderers/subVolume.js +23 -20
  84. package/dist/engine/renderers/subVolume.js.map +1 -1
  85. package/dist/engine/renderers/timeAxis.js +9 -9
  86. package/dist/engine/renderers/timeAxis.js.map +1 -1
  87. package/dist/engine/renderers/webgl/candleSurface.d.ts.map +1 -1
  88. package/dist/engine/renderers/webgl/candleSurface.js +39 -7
  89. package/dist/engine/renderers/webgl/candleSurface.js.map +1 -1
  90. package/dist/engine/renderers/yAxis.d.ts.map +1 -1
  91. package/dist/engine/renderers/yAxis.js +5 -5
  92. package/dist/engine/renderers/yAxis.js.map +1 -1
  93. package/dist/index.d.ts +1 -0
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/index.js +1 -0
  96. package/dist/index.js.map +1 -1
  97. package/dist/plugin/types.d.ts +5 -1
  98. package/dist/plugin/types.d.ts.map +1 -1
  99. package/dist/plugin/types.js.map +1 -1
  100. package/dist/tokens/colorPresetSettings.d.ts +15 -0
  101. package/dist/tokens/colorPresetSettings.d.ts.map +1 -0
  102. package/dist/tokens/colorPresetSettings.js +65 -0
  103. package/dist/tokens/colorPresetSettings.js.map +1 -0
  104. package/dist/tokens/index.d.ts +17 -0
  105. package/dist/tokens/index.d.ts.map +1 -0
  106. package/dist/tokens/index.js +16 -0
  107. package/dist/tokens/index.js.map +1 -0
  108. package/dist/tokens/mergeTheme.d.ts +17 -0
  109. package/dist/tokens/mergeTheme.d.ts.map +1 -0
  110. package/dist/tokens/mergeTheme.js +43 -0
  111. package/dist/tokens/mergeTheme.js.map +1 -0
  112. package/dist/tokens/theme-china.d.ts +45 -0
  113. package/dist/tokens/theme-china.d.ts.map +1 -0
  114. package/dist/tokens/theme-china.js +116 -0
  115. package/dist/tokens/theme-china.js.map +1 -0
  116. package/dist/tokens/theme-dark.d.ts +21 -0
  117. package/dist/tokens/theme-dark.d.ts.map +1 -0
  118. package/dist/tokens/theme-dark.js +228 -0
  119. package/dist/tokens/theme-dark.js.map +1 -0
  120. package/dist/tokens/theme-light.d.ts +23 -0
  121. package/dist/tokens/theme-light.d.ts.map +1 -0
  122. package/dist/tokens/theme-light.js +234 -0
  123. package/dist/tokens/theme-light.js.map +1 -0
  124. package/dist/tokens/themeToCssVars.d.ts +74 -0
  125. package/dist/tokens/themeToCssVars.d.ts.map +1 -0
  126. package/dist/tokens/themeToCssVars.js +108 -0
  127. package/dist/tokens/themeToCssVars.js.map +1 -0
  128. package/dist/tokens/types.d.ts +335 -0
  129. package/dist/tokens/types.d.ts.map +1 -0
  130. package/dist/tokens/types.js +20 -0
  131. package/dist/tokens/types.js.map +1 -0
  132. package/dist/utils/kLineDraw/axis.d.ts +8 -7
  133. package/dist/utils/kLineDraw/axis.d.ts.map +1 -1
  134. package/dist/utils/kLineDraw/axis.js +24 -24
  135. package/dist/utils/kLineDraw/axis.js.map +1 -1
  136. package/dist/version.d.ts +1 -1
  137. package/dist/version.js +1 -1
  138. package/package.json +1 -1
  139. package/src/config/chartSettings.ts +11 -2
  140. package/src/engine/chart.ts +4 -0
  141. package/src/engine/draw/pixelAlign.ts +0 -2
  142. package/src/engine/drawing/plugin.ts +1 -1
  143. package/src/engine/renderers/Indicator/atr.ts +7 -3
  144. package/src/engine/renderers/Indicator/boll.ts +12 -12
  145. package/src/engine/renderers/Indicator/cci.ts +11 -10
  146. package/src/engine/renderers/Indicator/ene.ts +12 -12
  147. package/src/engine/renderers/Indicator/expma.ts +6 -6
  148. package/src/engine/renderers/Indicator/fastk.ts +9 -8
  149. package/src/engine/renderers/Indicator/kst.ts +12 -11
  150. package/src/engine/renderers/Indicator/ma.ts +5 -5
  151. package/src/engine/renderers/Indicator/macd.ts +27 -25
  152. package/src/engine/renderers/Indicator/macdLegend.ts +6 -6
  153. package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +16 -16
  154. package/src/engine/renderers/Indicator/mom.ts +11 -10
  155. package/src/engine/renderers/Indicator/rsi.ts +18 -15
  156. package/src/engine/renderers/Indicator/scale/indicator_scale.ts +6 -6
  157. package/src/engine/renderers/Indicator/stoch.ts +12 -11
  158. package/src/engine/renderers/Indicator/structure.ts +5 -5
  159. package/src/engine/renderers/Indicator/wmsr.ts +13 -12
  160. package/src/engine/renderers/Indicator/zones.ts +7 -7
  161. package/src/engine/renderers/candle.ts +21 -21
  162. package/src/engine/renderers/crosshair.ts +3 -3
  163. package/src/engine/renderers/extremaMarkers.ts +13 -12
  164. package/src/engine/renderers/gridLines.ts +3 -3
  165. package/src/engine/renderers/lastPrice.ts +7 -7
  166. package/src/engine/renderers/paneTitle.ts +6 -6
  167. package/src/engine/renderers/subVolume.ts +23 -20
  168. package/src/engine/renderers/timeAxis.ts +9 -9
  169. package/src/engine/renderers/webgl/candleSurface.ts +43 -7
  170. package/src/engine/renderers/yAxis.ts +6 -5
  171. package/src/index.ts +1 -0
  172. package/src/plugin/types.ts +5 -1
  173. package/src/tokens/__tests__/__snapshots__/baseline.test.ts.snap +393 -0
  174. package/src/tokens/__tests__/baseline.test.ts +183 -0
  175. package/src/tokens/__tests__/themeToCssVars.test.ts +175 -0
  176. package/src/tokens/__tests__/tokens.test.ts +215 -0
  177. package/src/tokens/colorPresetSettings.ts +128 -0
  178. package/src/tokens/index.ts +65 -0
  179. package/src/tokens/mergeTheme.ts +48 -0
  180. package/src/tokens/theme-china.ts +132 -0
  181. package/src/tokens/theme-dark.ts +244 -0
  182. package/src/tokens/theme-light.ts +250 -0
  183. package/src/tokens/themeToCssVars.ts +138 -0
  184. package/src/tokens/types.ts +394 -0
  185. package/src/utils/kLineDraw/axis.ts +31 -30
  186. package/src/version.ts +1 -1
  187. package/dist/engine/theme/colors.d.ts +0 -223
  188. package/dist/engine/theme/colors.d.ts.map +0 -1
  189. package/dist/engine/theme/colors.js +0 -375
  190. package/dist/engine/theme/colors.js.map +0 -1
  191. package/src/engine/theme/colors.ts +0 -642
@@ -1,4 +1,4 @@
1
- import { getColors } from '../../theme/colors'
1
+ import { resolveThemeColors } from '../../../tokens'
2
2
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
3
3
  import { RENDERER_PRIORITY } from '../../../plugin'
4
4
  import type { StructureRenderState } from '../../indicators/structureState'
@@ -41,7 +41,7 @@ export function createStructureRendererPlugin(options: { paneId?: string } = {})
41
41
  getDeclaredNamespaces() { const key = resolveKey(); return key ? [key] : [] },
42
42
  draw(context: RenderContext) {
43
43
  const { ctx, pane, range, scrollLeft, kLineCenters } = context
44
- const colors = getColors(context.theme)
44
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
45
45
  const stateKey = resolveKey()
46
46
  if (!stateKey) return
47
47
  const state = pluginHost?.getSharedState<StructureRenderState>(stateKey)
@@ -64,7 +64,7 @@ export function createStructureRendererPlugin(options: { paneId?: string } = {})
64
64
  const centerX = kLineCenters[s.index - range.start]
65
65
  if (centerX === undefined) continue
66
66
  const y = toY(s.price)
67
- ctx.fillStyle = s.label === 'HH' ? colors.STRUCTURE.HH : s.label === 'HL' ? colors.STRUCTURE.HL : s.label === 'LH' ? colors.STRUCTURE.LH : colors.STRUCTURE.LL
67
+ ctx.fillStyle = s.label === 'HH' ? colors.structure.hh : s.label === 'HL' ? colors.structure.hl : s.label === 'LH' ? colors.structure.lh : colors.structure.ll
68
68
  const labelY = s.kind === 'high' ? y - 8 : y + 16
69
69
  ctx.fillText(s.label, centerX, labelY)
70
70
  // Dot
@@ -86,12 +86,12 @@ export function createStructureRendererPlugin(options: { paneId?: string } = {})
86
86
  const x2 = kLineCenters[ev.index - range.start]
87
87
  if (x1 === undefined || x2 === undefined) continue
88
88
  const y = toY(ev.brokenLevel)
89
- ctx.strokeStyle = ev.kind === 'BOS' ? colors.STRUCTURE.BOS : colors.STRUCTURE.CHOCH
89
+ ctx.strokeStyle = ev.kind === 'BOS' ? colors.structure.bos : colors.structure.choch
90
90
  ctx.beginPath()
91
91
  ctx.moveTo(x1, y)
92
92
  ctx.lineTo(x2, y)
93
93
  ctx.stroke()
94
- ctx.fillStyle = ev.kind === 'BOS' ? colors.STRUCTURE.BOS : colors.STRUCTURE.CHOCH
94
+ ctx.fillStyle = ev.kind === 'BOS' ? colors.structure.bos : colors.structure.choch
95
95
  ctx.fillText(ev.kind, (x1 + x2) / 2, y - 4)
96
96
  }
97
97
  ctx.setLineDash([])
@@ -1,6 +1,6 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
- import { getColors, type ChartTheme } from '../../theme/colors'
3
+ import { resolveThemeColors } from '../../../tokens'
4
4
  import { alignToPhysicalPixelCenter } from '../../draw/pixelAlign'
5
5
  import type { WMSRRenderState } from '../../indicators/wmsrState'
6
6
  import { createWMSRStateKey } from '../../indicators/wmsrState'
@@ -82,7 +82,7 @@ export function createWMSRRendererPlugin(options: WMSRRendererOptions = {}): Ren
82
82
  displayMin: number,
83
83
  displayMax: number,
84
84
  dpr: number,
85
- colors: { WMSR: { OVERBOUGHT: string; OVERSOLD: string }; WMSR_GRID: string }
85
+ colors: { wmsr: { overbought: string; oversold: string }; wmsrGrid: string }
86
86
  ): void {
87
87
  const displayValueRange = displayMax - displayMin || 1
88
88
  const y20 = alignToPhysicalPixelCenter(paneHeight - (-20 - displayMin) / displayValueRange * paneHeight, dpr)
@@ -95,19 +95,19 @@ export function createWMSRRendererPlugin(options: WMSRRendererOptions = {}): Ren
95
95
  ctx.lineWidth = 1
96
96
  ctx.setLineDash([4, 4])
97
97
 
98
- ctx.strokeStyle = colors.WMSR.OVERBOUGHT
98
+ ctx.strokeStyle = colors.wmsr.overbought
99
99
  ctx.beginPath()
100
100
  ctx.moveTo(0, y20)
101
101
  ctx.lineTo(paneWidth, y20)
102
102
  ctx.stroke()
103
103
 
104
- ctx.strokeStyle = colors.WMSR.OVERSOLD
104
+ ctx.strokeStyle = colors.wmsr.oversold
105
105
  ctx.beginPath()
106
106
  ctx.moveTo(0, y80)
107
107
  ctx.lineTo(paneWidth, y80)
108
108
  ctx.stroke()
109
109
 
110
- ctx.strokeStyle = colors.WMSR_GRID
110
+ ctx.strokeStyle = colors.wmsrGrid
111
111
  ctx.beginPath()
112
112
  ctx.moveTo(0, y50)
113
113
  ctx.lineTo(paneWidth, y50)
@@ -160,7 +160,7 @@ export function createWMSRRendererPlugin(options: WMSRRendererOptions = {}): Ren
160
160
 
161
161
  draw(context: RenderContext) {
162
162
  const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = context
163
- const colors = getColors(context.theme)
163
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
164
164
 
165
165
  const stateKey = resolveKey()
166
166
  if (!stateKey) return
@@ -230,7 +230,7 @@ const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = co
230
230
  if (enableWebGL && lineWebGLSurface?.isAvailable()) {
231
231
  if (params.showWMSR && cachedWMSRPoints.length >= 2) {
232
232
  const ok = lineWebGLSurface.drawLineStrips(
233
- [{ points: cachedWMSRPoints, width: 1, color: colors.WMSR.WMSR }],
233
+ [{ points: cachedWMSRPoints, width: 1, color: colors.wmsr.wmsr }],
234
234
  scrollLeft
235
235
  )
236
236
  if (ok) {
@@ -266,13 +266,13 @@ function drawWMSRLineWithCanvas2D(
266
266
  scrollLeft: number,
267
267
  wmsrPoints: LinePoint[],
268
268
  params: { showWMSR: boolean },
269
- colors: { WMSR: { WMSR: string } }
269
+ colors: { wmsr: { wmsr: string } }
270
270
  ): void {
271
271
  if (!params.showWMSR || wmsrPoints.length < 2) return
272
272
 
273
273
  ctx.save()
274
274
  ctx.translate(-scrollLeft, 0)
275
- ctx.strokeStyle = colors.WMSR.WMSR
275
+ ctx.strokeStyle = colors.wmsr.wmsr
276
276
  ctx.lineWidth = 1
277
277
  ctx.lineJoin = 'round'
278
278
  ctx.lineCap = 'round'
@@ -294,9 +294,10 @@ export function getWMSRTitleInfo(
294
294
  period: number,
295
295
  pluginHost: PluginHost,
296
296
  paneId: string = 'sub_WMSR',
297
- theme: ChartTheme = 'light'
297
+ theme: 'light' | 'dark' = 'light',
298
+ isAsiaMarket?: boolean
298
299
  ): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
299
- const colors = getColors(theme)
300
+ const colors = resolveThemeColors(theme, isAsiaMarket)
300
301
  const state = pluginHost.getSharedState<WMSRRenderState>(createWMSRStateKey(paneId))
301
302
  if (!state) return null
302
303
 
@@ -307,7 +308,7 @@ export function getWMSRTitleInfo(
307
308
  name: 'WMSR',
308
309
  params: [period],
309
310
  values: [
310
- { label: 'WMSR', value: wmsr, color: colors.WMSR.WMSR },
311
+ { label: 'WMSR', value: wmsr, color: colors.wmsr.wmsr },
311
312
  ],
312
313
  }
313
314
  }
@@ -1,4 +1,4 @@
1
- import { getColors } from '../../theme/colors'
1
+ import { resolveThemeColors } from '../../../tokens'
2
2
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
3
3
  import { RENDERER_PRIORITY } from '../../../plugin'
4
4
  import type { ZonesRenderState } from '../../indicators/zonesState'
@@ -39,7 +39,7 @@ export function createZonesRendererPlugin(options: { paneId?: string } = {}): Re
39
39
  getDeclaredNamespaces() { const key = resolveKey(); return key ? [key] : [] },
40
40
  draw(context: RenderContext) {
41
41
  const { ctx, pane, range, scrollLeft, kLineCenters } = context
42
- const colors = getColors(context.theme)
42
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
43
43
  const stateKey = resolveKey()
44
44
  if (!stateKey) return
45
45
  const state = pluginHost?.getSharedState<ZonesRenderState>(stateKey)
@@ -69,10 +69,10 @@ export function createZonesRendererPlugin(options: { paneId?: string } = {}): Re
69
69
 
70
70
  const yHigh = toY(zone.high)
71
71
  const yLow = toY(zone.low)
72
- const fill = zone.kind === 'FVG_BULL' ? colors.ZONES.FVG_BULL_FILL
73
- : zone.kind === 'FVG_BEAR' ? colors.ZONES.FVG_BEAR_FILL
74
- : zone.kind === 'OB_BULL' ? colors.ZONES.OB_BULL_FILL
75
- : colors.ZONES.OB_BEAR_FILL
72
+ const fill = zone.kind === 'FVG_BULL' ? colors.zones.fvgBullFill
73
+ : zone.kind === 'FVG_BEAR' ? colors.zones.fvgBearFill
74
+ : zone.kind === 'OB_BULL' ? colors.zones.obBullFill
75
+ : colors.zones.obBearFill
76
76
  ctx.fillStyle = fill
77
77
  ctx.fillRect(startX, yHigh, endX - startX, yLow - yHigh)
78
78
  }
@@ -102,4 +102,4 @@ export function createZonesRendererPlugin(options: { paneId?: string } = {}): Re
102
102
  })
103
103
  class ZonesDefinition {
104
104
  static rendererFactory = createZonesRendererPlugin
105
- }
105
+ }
@@ -3,7 +3,7 @@ import { RENDERER_PRIORITY } from '../../plugin'
3
3
  import type { KLineData } from '../../types/price'
4
4
  import { getKLineTrend, type kLineTrend } from '../../types/kLine'
5
5
  import { createAlignedKLineFromPx, createVerticalLineRect } from '../draw/pixelAlign'
6
- import { getColors, type PriceColors, type VolumePriceColors } from '../theme/colors'
6
+ import { resolveThemeColors, type VolumePriceColors } from '../../tokens'
7
7
  import { getPhysicalKLineConfig } from '../chart'
8
8
  import { VolumePriceRelation } from '../../types/volumePrice'
9
9
  import { analyzeVolumePriceRelationBatch, DEFAULT_VOLUME_PRICE_CONFIG } from '../../utils/volumePrice'
@@ -52,7 +52,7 @@ export function createCandleRenderer(): RendererPlugin {
52
52
 
53
53
  draw(context: RenderContext) {
54
54
  const { ctx, pane, data, range, scrollLeft, kWidth, kGap, dpr, kLinePositions, markerManager, settings } = context
55
- const colors = getColors(context.theme)
55
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
56
56
  const klineData = data as KLineData[]
57
57
  if (!klineData.length) return
58
58
 
@@ -67,9 +67,9 @@ export function createCandleRenderer(): RendererPlugin {
67
67
  settings,
68
68
  })
69
69
 
70
- const usedWebGL = drawCandlesWithWebGL(context, prepared, colors.PRICE)
70
+ const usedWebGL = drawCandlesWithWebGL(context, prepared, colors.candleUpBody, colors.candleDownBody)
71
71
  if (!usedWebGL) {
72
- drawCandlesWithCanvas2D(ctx, scrollLeft, prepared, colors.PRICE)
72
+ drawCandlesWithCanvas2D(ctx, scrollLeft, prepared, colors.candleUpBody, colors.candleDownBody)
73
73
  } else {
74
74
  compositeWebGLToMainCanvas(ctx, context)
75
75
  }
@@ -238,29 +238,29 @@ function prepareCandles(args: {
238
238
  }
239
239
  }
240
240
 
241
- function drawCandlesWithCanvas2D(ctx: CanvasRenderingContext2D, scrollLeft: number, prepared: PreparedCandles, priceColors: PriceColors): void {
241
+ function drawCandlesWithCanvas2D(ctx: CanvasRenderingContext2D, scrollLeft: number, prepared: PreparedCandles, upColor: string, downColor: string): void {
242
242
  ctx.save()
243
243
  ctx.translate(-scrollLeft, 0)
244
244
 
245
- ctx.fillStyle = priceColors.UP
245
+ ctx.fillStyle = upColor
246
246
  for (let i = 0; i < prepared.upBodyCount; i++) {
247
247
  const off = i * 4
248
248
  ctx.fillRect(prepared.upBodyBuf[off], prepared.upBodyBuf[off + 1], prepared.upBodyBuf[off + 2], prepared.upBodyBuf[off + 3])
249
249
  }
250
250
 
251
- ctx.fillStyle = priceColors.DOWN
251
+ ctx.fillStyle = downColor
252
252
  for (let i = 0; i < prepared.downBodyCount; i++) {
253
253
  const off = i * 4
254
254
  ctx.fillRect(prepared.downBodyBuf[off], prepared.downBodyBuf[off + 1], prepared.downBodyBuf[off + 2], prepared.downBodyBuf[off + 3])
255
255
  }
256
256
 
257
- ctx.fillStyle = priceColors.UP
257
+ ctx.fillStyle = upColor
258
258
  for (let i = 0; i < prepared.upWickCount; i++) {
259
259
  const off = i * 4
260
260
  ctx.fillRect(prepared.upWickBuf[off], prepared.upWickBuf[off + 1], prepared.wickWidth, prepared.upWickBuf[off + 3])
261
261
  }
262
262
 
263
- ctx.fillStyle = priceColors.DOWN
263
+ ctx.fillStyle = downColor
264
264
  for (let i = 0; i < prepared.downWickCount; i++) {
265
265
  const off = i * 4
266
266
  ctx.fillRect(prepared.downWickBuf[off], prepared.downWickBuf[off + 1], prepared.wickWidth, prepared.downWickBuf[off + 3])
@@ -269,17 +269,17 @@ function drawCandlesWithCanvas2D(ctx: CanvasRenderingContext2D, scrollLeft: numb
269
269
  ctx.restore()
270
270
  }
271
271
 
272
- function drawCandlesWithWebGL(context: RenderContext, prepared: PreparedCandles, priceColors: PriceColors): boolean {
272
+ function drawCandlesWithWebGL(context: RenderContext, prepared: PreparedCandles, upColor: string, downColor: string): boolean {
273
273
  if (context.settings?.enableWebGLRendering === false) return false
274
274
  const surface = context.candleWebGLSurface
275
275
  if (!surface || !surface.isAvailable()) return false
276
276
 
277
277
  surface.clear()
278
278
 
279
- const bodyUpOk = prepared.upBodyCount === 0 || surface.drawRectBuffer(prepared.upBodyBuf.subarray(0, prepared.upBodyCount * 4), prepared.upBodyCount, priceColors.UP, context.scrollLeft)
280
- const bodyDownOk = prepared.downBodyCount === 0 || surface.drawRectBuffer(prepared.downBodyBuf.subarray(0, prepared.downBodyCount * 4), prepared.downBodyCount, priceColors.DOWN, context.scrollLeft)
281
- const wickUpOk = prepared.upWickCount === 0 || surface.drawRectBuffer(prepared.upWickBuf.subarray(0, prepared.upWickCount * 4), prepared.upWickCount, priceColors.UP, context.scrollLeft)
282
- const wickDownOk = prepared.downWickCount === 0 || surface.drawRectBuffer(prepared.downWickBuf.subarray(0, prepared.downWickCount * 4), prepared.downWickCount, priceColors.DOWN, context.scrollLeft)
279
+ const bodyUpOk = prepared.upBodyCount === 0 || surface.drawRectBuffer(prepared.upBodyBuf.subarray(0, prepared.upBodyCount * 4), prepared.upBodyCount, upColor, context.scrollLeft)
280
+ const bodyDownOk = prepared.downBodyCount === 0 || surface.drawRectBuffer(prepared.downBodyBuf.subarray(0, prepared.downBodyCount * 4), prepared.downBodyCount, downColor, context.scrollLeft)
281
+ const wickUpOk = prepared.upWickCount === 0 || surface.drawRectBuffer(prepared.upWickBuf.subarray(0, prepared.upWickCount * 4), prepared.upWickCount, upColor, context.scrollLeft)
282
+ const wickDownOk = prepared.downWickCount === 0 || surface.drawRectBuffer(prepared.downWickBuf.subarray(0, prepared.downWickCount * 4), prepared.downWickCount, downColor, context.scrollLeft)
283
283
 
284
284
  return bodyUpOk && bodyDownOk && wickUpOk && wickDownOk
285
285
  }
@@ -297,7 +297,7 @@ function drawVolumePriceMarkers(
297
297
  markerManager: MarkerManager | undefined
298
298
  ): void {
299
299
  const { ctx, range, kWidth, dpr } = context
300
- const colors = getColors(context.theme)
300
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
301
301
  if (!prepared.showVolumePriceMarkers || !markerManager || (context.zoomLevel ?? 1) < 2) {
302
302
  return
303
303
  }
@@ -312,7 +312,7 @@ function drawVolumePriceMarkers(
312
312
  const markerY = isRising ? k.alignedHighY - 15 : k.alignedLowY + 15
313
313
  const posIndex = k.i - range.start
314
314
  const markerX = context.kLineCenters[posIndex]!
315
- drawVolumePriceMarker(ctx, markerX, markerY, relation, k.i, kWidth, 4, markerManager, dpr, colors.VOLUME_PRICE)
315
+ drawVolumePriceMarker(ctx, markerX, markerY, relation, k.i, kWidth, 4, markerManager, dpr, colors.volumePrice)
316
316
  }
317
317
  }
318
318
 
@@ -323,7 +323,7 @@ function drawVolumePriceMarkers(
323
323
  const markerY = isRising ? k.alignedHighY - 15 : k.alignedLowY + 15
324
324
  const posIndex = k.i - range.start
325
325
  const markerX = context.kLineCenters[posIndex]!
326
- drawVolumePriceMarker(ctx, markerX, markerY, relation, k.i, kWidth, 4, markerManager, dpr, colors.VOLUME_PRICE)
326
+ drawVolumePriceMarker(ctx, markerX, markerY, relation, k.i, kWidth, 4, markerManager, dpr, colors.volumePrice)
327
327
  }
328
328
  }
329
329
 
@@ -366,19 +366,19 @@ export function drawVolumePriceMarker(
366
366
 
367
367
  switch (relation) {
368
368
  case VolumePriceRelation.RISE_WITH_VOLUME:
369
- color = volumePriceColors.RISE_WITH
369
+ color = volumePriceColors.riseWith
370
370
  isUp = true
371
371
  break
372
372
  case VolumePriceRelation.RISE_WITHOUT_VOLUME:
373
- color = volumePriceColors.RISE_WITHOUT
373
+ color = volumePriceColors.riseWithout
374
374
  isUp = true
375
375
  break
376
376
  case VolumePriceRelation.FALL_WITH_VOLUME:
377
- color = volumePriceColors.FALL_WITH
377
+ color = volumePriceColors.fallWith
378
378
  isUp = false
379
379
  break
380
380
  case VolumePriceRelation.FALL_WITHOUT_VOLUME:
381
- color = volumePriceColors.FALL_WITHOUT
381
+ color = volumePriceColors.fallWithout
382
382
  isUp = false
383
383
  break
384
384
  default:
@@ -1,7 +1,7 @@
1
1
  import type { RendererPlugin, RenderContext } from '../../plugin'
2
2
  import { RENDERER_PRIORITY, GLOBAL_PANE_ID } from '../../plugin'
3
3
  import { createHorizontalLineRect, createVerticalLineRect } from '../draw/pixelAlign'
4
- import { getColors } from '../theme/colors'
4
+ import { resolveThemeColors } from '../../tokens'
5
5
 
6
6
  /**
7
7
  * 创建十字线渲染器插件
@@ -27,7 +27,7 @@ export function createCrosshairRendererPlugin(options: {
27
27
 
28
28
  draw(context: RenderContext) {
29
29
  const { pane, dpr, paneWidth, overlayCtx } = context
30
- const colors = getColors(context.theme)
30
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
31
31
  const state = options.getCrosshairState()
32
32
 
33
33
  if (state.isDragging || !state.pos) return
@@ -50,7 +50,7 @@ export function createCrosshairRendererPlugin(options: {
50
50
  ctx.rect(0, 0, paneWidth, pane.height)
51
51
  ctx.clip()
52
52
 
53
- ctx.fillStyle = colors.CROSSHAIR.LINE
53
+ ctx.fillStyle = colors.crosshairLine
54
54
 
55
55
  // 绘制垂直线
56
56
  const v = createVerticalLineRect(x, 0, pane.height, dpr)
@@ -2,7 +2,7 @@ import type { RendererPlugin, RenderContext } from '../../plugin'
2
2
  import { RENDERER_PRIORITY, GLOBAL_PANE_ID } from '../../plugin'
3
3
  import type { KLineData } from '../../types/price'
4
4
  import { roundToPhysicalPixel, alignToPhysicalPixelCenter, createHorizontalLineRect } from '../draw/pixelAlign'
5
- import { getColors, type ThemeColors } from '../theme/colors'
5
+ import { resolveThemeColors } from '../../tokens'
6
6
  import { getFont, setCanvasFont } from '../theme/fonts'
7
7
 
8
8
  const textWidthCache = new Map<string, number>()
@@ -58,14 +58,15 @@ function drawAllMarkers(
58
58
  ctx: CanvasRenderingContext2D,
59
59
  markers: MarkerData[],
60
60
  dpr: number,
61
- colors: ThemeColors
61
+ lineColor: string,
62
+ textColor: string
62
63
  ) {
63
64
  if (markers.length === 0) return
64
65
 
65
66
  ctx.save()
66
67
 
67
68
  // ========== 阶段1:批量绘制所有线条(同一 fillStyle)==========
68
- ctx.fillStyle = colors.TEXT.WEAK
69
+ ctx.fillStyle = lineColor
69
70
  for (const m of markers) {
70
71
  const lineRect = createHorizontalLineRect(m.lineStartX, m.lineEndX, m.y, dpr)
71
72
  if (lineRect) {
@@ -84,7 +85,7 @@ function drawAllMarkers(
84
85
  // ========== 阶段3:批量绘制所有文字(同一 font/baseline/fillStyle)==========
85
86
  setCanvasFont(ctx, MARKER_FONT)
86
87
  ctx.textBaseline = 'middle'
87
- ctx.fillStyle = colors.PRICE.NEUTRAL
88
+ ctx.fillStyle = textColor
88
89
 
89
90
  for (const m of markers) {
90
91
  ctx.textAlign = m.drawLeft ? 'right' : 'left'
@@ -108,7 +109,7 @@ export function createExtremaMarkersRendererPlugin(): RendererPlugin {
108
109
 
109
110
  draw(context: RenderContext) {
110
111
  const { ctx, pane, data, range, scrollLeft, dpr, paneWidth, kLineCenters } = context
111
- const colors = getColors(context.theme)
112
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
112
113
  const klineData = data as KLineData[]
113
114
  if (!klineData.length) return
114
115
  if (pane.role !== 'price') return
@@ -150,9 +151,9 @@ export function createExtremaMarkersRendererPlugin(): RendererPlugin {
150
151
  price: max,
151
152
  y: pane.yAxis.priceToY(max),
152
153
  style: {
153
- bgColor: colors.LAST_PRICE_LABEL.BG,
154
- borderColor: colors.PRICE.LAST_PRICE,
155
- textColor: colors.PRICE.LAST_PRICE,
154
+ bgColor: colors.lastPriceLabel.bg,
155
+ borderColor: colors.price.lastPrice,
156
+ textColor: colors.price.lastPrice,
156
157
  }
157
158
  })
158
159
 
@@ -161,9 +162,9 @@ export function createExtremaMarkersRendererPlugin(): RendererPlugin {
161
162
  price: min,
162
163
  y: pane.yAxis.priceToY(min),
163
164
  style: {
164
- bgColor: colors.LAST_PRICE_LABEL.BG,
165
- borderColor: colors.PRICE.LAST_PRICE,
166
- textColor: colors.PRICE.LAST_PRICE,
165
+ bgColor: colors.lastPriceLabel.bg,
166
+ borderColor: colors.price.lastPrice,
167
+ textColor: colors.price.lastPrice,
167
168
  }
168
169
  })
169
170
 
@@ -193,7 +194,7 @@ export function createExtremaMarkersRendererPlugin(): RendererPlugin {
193
194
  // 批量绘制所有 markers
194
195
  ctx.save()
195
196
  ctx.translate(-scrollLeft, 0)
196
- drawAllMarkers(ctx, markers, dpr, colors)
197
+ drawAllMarkers(ctx, markers, dpr, colors.text.weak, colors.text.primary)
197
198
  ctx.restore()
198
199
  },
199
200
  }
@@ -3,7 +3,7 @@ import { RENDERER_PRIORITY, GLOBAL_PANE_ID } from '../../plugin'
3
3
  import type { KLineData } from '../../types/price'
4
4
  import { createHorizontalLineRect, createVerticalLineRect } from '../draw/pixelAlign'
5
5
  import { findMonthBoundaries } from '../../utils/dateFormat'
6
- import { getColors } from '../theme/colors'
6
+ import { resolveThemeColors } from '../../tokens'
7
7
  import { calculateTickPositions, calculateValueTickPositions, type ScaleType } from '../utils/tickPosition'
8
8
 
9
9
  /**
@@ -22,13 +22,13 @@ export function createGridLinesRendererPlugin(): RendererPlugin {
22
22
 
23
23
  draw(context: RenderContext) {
24
24
  const { ctx, pane, data, range, scrollLeft, kWidth, dpr, kLinePositions, settings } = context
25
- const colors = getColors(context.theme)
25
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
26
26
  const klineData = data as KLineData[]
27
27
  if (!klineData.length) return
28
28
  if (settings?.showGridLines === false) return
29
29
 
30
30
  ctx.save()
31
- ctx.fillStyle = colors.GRID.HORIZONTAL
31
+ ctx.fillStyle = colors.gridMajor
32
32
  ctx.translate(-scrollLeft, 0)
33
33
 
34
34
  const plotWidth = ctx.canvas.width / dpr
@@ -1,7 +1,7 @@
1
1
  import type { RendererPlugin, RenderContext } from '../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../plugin'
3
3
  import type { KLineData } from '../../types/price'
4
- import { getColors } from '../theme/colors'
4
+ import { resolveThemeColors } from '../../tokens'
5
5
 
6
6
  function getLastPriceInfo(context: RenderContext) {
7
7
  const { pane, data } = context
@@ -35,7 +35,7 @@ export function createLastPriceLabelRegistrarPlugin(): RendererPlugin {
35
35
  priority: RENDERER_PRIORITY.LAST_PRICE_LABEL,
36
36
 
37
37
  draw(context: RenderContext) {
38
- const colors = getColors(context.theme)
38
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
39
39
  const info = getLastPriceInfo(context)
40
40
  if (!info) return
41
41
 
@@ -46,9 +46,9 @@ export function createLastPriceLabelRegistrarPlugin(): RendererPlugin {
46
46
  y: info.y,
47
47
  type: 'lastPrice',
48
48
  style: {
49
- bgColor: colors.LAST_PRICE_LABEL.BG,
50
- borderColor: colors.PRICE.LAST_PRICE,
51
- textColor: colors.PRICE.LAST_PRICE,
49
+ bgColor: colors.lastPriceLabel.bg,
50
+ borderColor: colors.price.lastPrice,
51
+ textColor: colors.price.lastPrice,
52
52
  }
53
53
  })
54
54
  },
@@ -69,7 +69,7 @@ export function createLastPriceLineRendererPlugin(): RendererPlugin {
69
69
 
70
70
  draw(context: RenderContext) {
71
71
  const { ctx, scrollLeft, dpr, kLinePositions, paneWidth } = context
72
- const colors = getColors(context.theme)
72
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
73
73
  const info = getLastPriceInfo(context)
74
74
  if (!info) return
75
75
 
@@ -81,7 +81,7 @@ export function createLastPriceLineRendererPlugin(): RendererPlugin {
81
81
  const startX = kLinePositions[0] ?? 0
82
82
  const endX = paneWidth + scrollLeft
83
83
 
84
- ctx.strokeStyle = colors.PRICE.LAST_PRICE
84
+ ctx.strokeStyle = colors.price.lastPrice
85
85
  ctx.lineWidth = 1
86
86
  ctx.setLineDash([4, 3])
87
87
  ctx.beginPath()
@@ -1,6 +1,6 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../plugin'
3
- import { getColors } from '../theme/colors'
3
+ import { resolveThemeColors } from '../../tokens'
4
4
  import { getFont, setCanvasFont } from '../theme/fonts'
5
5
  import { SUB_PANE_INDICATOR_CONFIGS } from './Indicator/subPaneConfig'
6
6
  import type { SubIndicatorType } from './Indicator'
@@ -63,7 +63,7 @@ export function createPaneTitleRendererPlugin(options: PaneTitleOptions): Render
63
63
 
64
64
  draw(context: RenderContext) {
65
65
  const { overlayCtx, pane, paneWidth } = context
66
- const colors = getColors(context.theme)
66
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
67
67
  if (pane.id !== currentOptions.paneId || !overlayCtx) return
68
68
 
69
69
  const fontSize = 12
@@ -85,13 +85,13 @@ export function createPaneTitleRendererPlugin(options: PaneTitleOptions): Render
85
85
  if (titleInfo) {
86
86
  let currentX = x
87
87
 
88
- overlayCtx.fillStyle = colors.TEXT.PRIMARY
88
+ overlayCtx.fillStyle = colors.text.primary
89
89
  overlayCtx.fillText(titleInfo.name, currentX, y)
90
90
  currentX += measureTextWidth(overlayCtx, titleInfo.name)
91
91
 
92
92
  if (titleInfo.params && titleInfo.params.length > 0) {
93
93
  const paramText = `(${titleInfo.params.join(',')})`
94
- overlayCtx.fillStyle = colors.TEXT.TERTIARY
94
+ overlayCtx.fillStyle = colors.text.tertiary
95
95
  overlayCtx.fillText(paramText, currentX, y)
96
96
  currentX += measureTextWidth(overlayCtx, paramText) + gap
97
97
  } else {
@@ -107,12 +107,12 @@ export function createPaneTitleRendererPlugin(options: PaneTitleOptions): Render
107
107
  }
108
108
  }
109
109
  } else {
110
- overlayCtx.fillStyle = colors.TEXT.PRIMARY
110
+ overlayCtx.fillStyle = colors.text.primary
111
111
  overlayCtx.fillText(currentOptions.title, x, y)
112
112
 
113
113
  if (currentOptions.description) {
114
114
  const titleWidth = measureTextWidth(overlayCtx, currentOptions.title)
115
- overlayCtx.fillStyle = colors.TEXT.WEAK
115
+ overlayCtx.fillStyle = colors.text.weak
116
116
  overlayCtx.fillText(` - ${currentOptions.description}`, x + titleWidth, y)
117
117
  }
118
118
  }