@363045841yyt/klinechart-core 0.7.6 → 0.7.8

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 +19 -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 +22 -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,6 +1,6 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
- import { getColors, type ThemeColors, type ChartTheme } from '../../theme/colors'
3
+ import { resolveThemeColors } from '../../../tokens'
4
4
  import { alignToPhysicalPixelCenter } from '../../draw/pixelAlign'
5
5
  import type { RSIRenderState } from '../../indicators/rsiState'
6
6
  import { createRSIStateKey } from '../../indicators/rsiState'
@@ -168,7 +168,7 @@ export function createRSIRendererPlugin(options: RSIRendererOptions = {}): Rende
168
168
 
169
169
  draw(context: RenderContext) {
170
170
  const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = context
171
- const colors = getColors(context.theme)
171
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
172
172
 
173
173
  // 从 StateStore 读取 RSI 状态
174
174
  const stateKey = resolveKey()
@@ -191,6 +191,10 @@ const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = co
191
191
  // ========== 优化1: 使用离屏 Canvas 缓存虚线背景线 ==========
192
192
  const paneWidth = context.paneWidth
193
193
  const paneHeight = pane.height
194
+ if (paneWidth <= 0 || paneHeight <= 0) {
195
+ clearLineCache()
196
+ return
197
+ }
194
198
  const dashedLinesKey = buildDashedLinesKey(paneWidth, paneHeight, displayMin, displayMax, dpr)
195
199
 
196
200
  if (cachedDashedLinesKey !== dashedLinesKey) {
@@ -251,13 +255,13 @@ const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = co
251
255
  if (enableWebGL && lineWebGLSurface?.isAvailable()) {
252
256
  const lines: Array<{ points: LinePoint[]; width: number; color: string }> = []
253
257
  if (params.showRSI1 && cachedRSI1Points.length >= 2) {
254
- lines.push({ points: cachedRSI1Points, width: 1, color: colors.RSI.RSI1 })
258
+ lines.push({ points: cachedRSI1Points, width: 1, color: colors.rsi.rsi1 })
255
259
  }
256
260
  if (params.showRSI2 && cachedRSI2Points.length >= 2) {
257
- lines.push({ points: cachedRSI2Points, width: 1, color: colors.RSI.RSI2 })
261
+ lines.push({ points: cachedRSI2Points, width: 1, color: colors.rsi.rsi2 })
258
262
  }
259
263
  if (params.showRSI3 && cachedRSI3Points.length >= 2) {
260
- lines.push({ points: cachedRSI3Points, width: 1, color: colors.RSI.RSI3 })
264
+ lines.push({ points: cachedRSI3Points, width: 1, color: colors.rsi.rsi3 })
261
265
  }
262
266
 
263
267
  const allOk = lines.length > 0 && lineWebGLSurface.drawLineStrips(lines, scrollLeft)
@@ -269,7 +273,7 @@ const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = co
269
273
  }
270
274
 
271
275
  if (!usedWebGL) {
272
- drawRSILinesWithCanvas2D(ctx, scrollLeft, cachedRSI1Points, cachedRSI2Points, cachedRSI3Points, params, colors)
276
+ drawRSILinesWithCanvas2D(ctx, scrollLeft, cachedRSI1Points, cachedRSI2Points, cachedRSI3Points, params, colors.rsi.rsi1, colors.rsi.rsi2, colors.rsi.rsi3)
273
277
  }
274
278
  },
275
279
 
@@ -297,7 +301,9 @@ export function drawRSILinesWithCanvas2D(
297
301
  rsi2Points: LinePoint[],
298
302
  rsi3Points: LinePoint[],
299
303
  params: { showRSI1: boolean; showRSI2: boolean; showRSI3: boolean },
300
- colors: ThemeColors
304
+ rsi1Color: string,
305
+ rsi2Color: string,
306
+ rsi3Color: string
301
307
  ): void {
302
308
  ctx.save()
303
309
  ctx.translate(-scrollLeft, 0)
@@ -306,7 +312,7 @@ export function drawRSILinesWithCanvas2D(
306
312
  ctx.lineCap = 'round'
307
313
 
308
314
  if (params.showRSI1 && rsi1Points.length >= 2) {
309
- ctx.strokeStyle = colors.RSI.RSI1
315
+ ctx.strokeStyle = rsi1Color
310
316
  ctx.beginPath()
311
317
  ctx.moveTo(rsi1Points[0]!.x, rsi1Points[0]!.y)
312
318
  for (let i = 1; i < rsi1Points.length; i++) {
@@ -317,7 +323,7 @@ export function drawRSILinesWithCanvas2D(
317
323
  }
318
324
 
319
325
  if (params.showRSI2 && rsi2Points.length >= 2) {
320
- ctx.strokeStyle = colors.RSI.RSI2
326
+ ctx.strokeStyle = rsi2Color
321
327
  ctx.beginPath()
322
328
  ctx.moveTo(rsi2Points[0]!.x, rsi2Points[0]!.y)
323
329
  for (let i = 1; i < rsi2Points.length; i++) {
@@ -328,7 +334,7 @@ export function drawRSILinesWithCanvas2D(
328
334
  }
329
335
 
330
336
  if (params.showRSI3 && rsi3Points.length >= 2) {
331
- ctx.strokeStyle = colors.RSI.RSI3
337
+ ctx.strokeStyle = rsi3Color
332
338
  ctx.beginPath()
333
339
  ctx.moveTo(rsi3Points[0]!.x, rsi3Points[0]!.y)
334
340
  for (let i = 1; i < rsi3Points.length; i++) {
@@ -348,9 +354,10 @@ export function getRSITitleInfo(
348
354
  period3: number,
349
355
  pluginHost: PluginHost,
350
356
  paneId: string = 'sub_RSI',
351
- theme: ChartTheme = 'light'
357
+ theme: 'light' | 'dark' = 'light',
358
+ isAsiaMarket?: boolean
352
359
  ): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
353
- const colors = getColors(theme)
360
+ const colors = resolveThemeColors(theme, isAsiaMarket)
354
361
  const stateKey = createRSIStateKey(paneId)
355
362
  const state = pluginHost.getSharedState<RSIRenderState>(stateKey)
356
363
 
@@ -361,9 +368,9 @@ export function getRSITitleInfo(
361
368
  const rsi3 = state.series[period3]?.[index]
362
369
 
363
370
  const values: Array<{ label: string; value: number; color: string }> = []
364
- if (rsi1 !== undefined) values.push({ label: `RSI${period1}`, value: rsi1, color: colors.RSI.RSI1 })
365
- if (rsi2 !== undefined) values.push({ label: `RSI${period2}`, value: rsi2, color: colors.RSI.RSI2 })
366
- if (rsi3 !== undefined) values.push({ label: `RSI${period3}`, value: rsi3, color: colors.RSI.RSI3 })
371
+ if (rsi1 !== undefined) values.push({ label: `RSI${period1}`, value: rsi1, color: colors.rsi.rsi1 })
372
+ if (rsi2 !== undefined) values.push({ label: `RSI${period2}`, value: rsi2, color: colors.rsi.rsi2 })
373
+ if (rsi3 !== undefined) values.push({ label: `RSI${period3}`, value: rsi3, color: colors.rsi.rsi3 })
367
374
 
368
375
  if (values.length === 0) return null
369
376
 
@@ -1,7 +1,7 @@
1
1
  import type { RendererPluginWithHost, PluginHost, RenderContext, BaseIndicatorState } from '../../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../../plugin'
3
3
  import { createIndicatorStateKey } from '../../../../plugin/stateKeys'
4
- import { getColors, type ThemeColors } from '../../../theme/colors'
4
+ import { resolveThemeColors } from '../../../../tokens'
5
5
  import { getFont, setCanvasFont } from '../../../theme/fonts'
6
6
  import { calculateValueTickPositions, type ScaleType } from '../../../utils/tickPosition'
7
7
  import { drawCrosshairPriceLabel } from '../../../../utils/kLineDraw/axis'
@@ -62,7 +62,7 @@ export interface DrawScaleTicksOptions {
62
62
  const BASELINE_MIDDLE = 'middle' as const
63
63
  const ALIGN_CENTER = 'center' as const
64
64
 
65
- export function drawScaleTicks(options: DrawScaleTicksOptions & { colors: ThemeColors }): void {
65
+ export function drawScaleTicks(options: DrawScaleTicksOptions & { tickColor: string }): void {
66
66
  const {
67
67
  ctx,
68
68
  dpr,
@@ -85,7 +85,7 @@ export function drawScaleTicks(options: DrawScaleTicksOptions & { colors: ThemeC
85
85
  setCanvasFont(ctx, font)
86
86
  ctx.textBaseline = BASELINE_MIDDLE
87
87
  ctx.textAlign = ALIGN_CENTER
88
- ctx.fillStyle = options.colors.TEXT.SECONDARY
88
+ ctx.fillStyle = options.tickColor
89
89
 
90
90
  const centerX = axisWidth / 2
91
91
  const centerXPx = roundToPhysicalPixel(centerX, dpr)
@@ -148,7 +148,7 @@ export function createIndicatorScaleRendererPlugin(options: IndicatorScaleRender
148
148
 
149
149
  const effectiveScaleType: ScaleType = pane.yAxis.getScaleType() ?? scaleType
150
150
  const effectiveAxisWidth = yAxisCtx.canvas ? (yAxisCtx.canvas.width / dpr) : axisWidth
151
- const colors = getColors(context.theme)
151
+ const tokenColors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
152
152
 
153
153
  const displayRange = pane.yAxis.getDisplayRange({
154
154
  minPrice: state.valueMin,
@@ -156,7 +156,7 @@ export function createIndicatorScaleRendererPlugin(options: IndicatorScaleRender
156
156
  })
157
157
 
158
158
  drawScaleTicks({
159
- colors,
159
+ tickColor: tokenColors.text.secondary,
160
160
  ctx: yAxisCtx,
161
161
  dpr,
162
162
  axisWidth: effectiveAxisWidth,
@@ -198,7 +198,7 @@ export function createIndicatorScaleRendererPlugin(options: IndicatorScaleRender
198
198
  priceOffset: 0,
199
199
  price: displayPrice,
200
200
  formatPrice: formatCrosshairLabel,
201
- })
201
+ }, context.theme, context.isAsiaMarket, context.colorPresetSettings)
202
202
  },
203
203
  }
204
204
  }
@@ -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 { STOCHRenderState } from '../../indicators/stochState'
6
6
  import { createSTOCHStateKey } from '../../indicators/stochState'
@@ -152,7 +152,7 @@ export function createSTOCHRendererPlugin(options: STOCHRendererOptions = {}): R
152
152
 
153
153
  draw(context: RenderContext) {
154
154
  const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = context
155
- const colors = getColors(context.theme)
155
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
156
156
 
157
157
  const stateKey = resolveKey()
158
158
  if (!stateKey) return
@@ -238,10 +238,10 @@ const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = co
238
238
  if (enableWebGL && lineWebGLSurface?.isAvailable()) {
239
239
  const lines: Array<{ points: LinePoint[]; width: number; color: string }> = []
240
240
  if (params.showK && cachedKPoints.length >= 2) {
241
- lines.push({ points: cachedKPoints, width: 1, color: colors.KDJ.K })
241
+ lines.push({ points: cachedKPoints, width: 1, color: colors.kdj.k })
242
242
  }
243
243
  if (params.showD && cachedDPoints.length >= 2) {
244
- lines.push({ points: cachedDPoints, width: 1, color: colors.KDJ.D })
244
+ lines.push({ points: cachedDPoints, width: 1, color: colors.kdj.d })
245
245
  }
246
246
 
247
247
  const allOk = lines.length > 0 && lineWebGLSurface.drawLineStrips(lines, scrollLeft)
@@ -279,7 +279,7 @@ function drawSTOCHLinesWithCanvas2D(
279
279
  kPoints: LinePoint[],
280
280
  dPoints: LinePoint[],
281
281
  params: { showK: boolean; showD: boolean },
282
- colors: { KDJ: { K: string; D: string } }
282
+ colors: { kdj: { k: string; d: string } }
283
283
  ): void {
284
284
  ctx.save()
285
285
  ctx.translate(-scrollLeft, 0)
@@ -288,7 +288,7 @@ function drawSTOCHLinesWithCanvas2D(
288
288
  ctx.lineCap = 'round'
289
289
 
290
290
  if (params.showK && kPoints.length >= 2) {
291
- ctx.strokeStyle = colors.KDJ.K
291
+ ctx.strokeStyle = colors.kdj.k
292
292
  ctx.beginPath()
293
293
  ctx.moveTo(kPoints[0]!.x, kPoints[0]!.y)
294
294
  for (let i = 1; i < kPoints.length; i++) {
@@ -299,7 +299,7 @@ function drawSTOCHLinesWithCanvas2D(
299
299
  }
300
300
 
301
301
  if (params.showD && dPoints.length >= 2) {
302
- ctx.strokeStyle = colors.KDJ.D
302
+ ctx.strokeStyle = colors.kdj.d
303
303
  ctx.beginPath()
304
304
  ctx.moveTo(dPoints[0]!.x, dPoints[0]!.y)
305
305
  for (let i = 1; i < dPoints.length; i++) {
@@ -321,9 +321,10 @@ export function getSTOCHTitleInfo(
321
321
  m: number,
322
322
  pluginHost: PluginHost,
323
323
  paneId: string = 'sub_STOCH',
324
- theme: ChartTheme = 'light'
324
+ theme: 'light' | 'dark' = 'light',
325
+ isAsiaMarket?: boolean
325
326
  ): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
326
- const colors = getColors(theme)
327
+ const colors = resolveThemeColors(theme, isAsiaMarket)
327
328
  const state = pluginHost.getSharedState<STOCHRenderState>(createSTOCHStateKey(paneId))
328
329
  if (!state) return null
329
330
 
@@ -331,8 +332,8 @@ export function getSTOCHTitleInfo(
331
332
  if (!point || point.k === undefined) return null
332
333
 
333
334
  const values = []
334
- if (state.params.showK) values.push({ label: 'K', value: point.k, color: colors.KDJ.K })
335
- if (state.params.showD) values.push({ label: 'D', value: point.d, color: colors.KDJ.D })
335
+ if (state.params.showK) values.push({ label: 'K', value: point.k, color: colors.kdj.k })
336
+ if (state.params.showD) values.push({ label: 'D', value: point.d, color: colors.kdj.d })
336
337
 
337
338
  if (values.length === 0) return null
338
339
 
@@ -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)