@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 ChartTheme } from '../../theme/colors'
3
+ import { resolveThemeColors } from '../../../tokens'
4
4
  import { alignToPhysicalPixelCenter } from '../../draw/pixelAlign'
5
5
  import type { FASTKRenderState } from '../../indicators/fastkState'
6
6
  import { createFASTKStateKey } from '../../indicators/fastkState'
@@ -148,7 +148,7 @@ export function createFASTKRendererPlugin(options: FASTKRendererOptions = {}): R
148
148
 
149
149
  draw(context: RenderContext) {
150
150
  const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = context
151
- const colors = getColors(context.theme)
151
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
152
152
 
153
153
  const stateKey = resolveKey()
154
154
  if (!stateKey) return
@@ -218,7 +218,7 @@ const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = co
218
218
  if (enableWebGL && lineWebGLSurface?.isAvailable()) {
219
219
  if (params.showFASTK && cachedFASTKPoints.length >= 2) {
220
220
  const ok = lineWebGLSurface.drawLineStrips(
221
- [{ points: cachedFASTKPoints, width: 1, color: colors.KDJ.K }],
221
+ [{ points: cachedFASTKPoints, width: 1, color: colors.kdj.k }],
222
222
  scrollLeft
223
223
  )
224
224
  if (ok) {
@@ -254,13 +254,13 @@ function drawFASTKLineWithCanvas2D(
254
254
  scrollLeft: number,
255
255
  fastkPoints: LinePoint[],
256
256
  params: { showFASTK: boolean },
257
- colors: { KDJ: { K: string } }
257
+ colors: { kdj: { k: string } }
258
258
  ): void {
259
259
  if (!params.showFASTK || fastkPoints.length < 2) return
260
260
 
261
261
  ctx.save()
262
262
  ctx.translate(-scrollLeft, 0)
263
- ctx.strokeStyle = colors.KDJ.K
263
+ ctx.strokeStyle = colors.kdj.k
264
264
  ctx.lineWidth = 1
265
265
  ctx.lineJoin = 'round'
266
266
  ctx.lineCap = 'round'
@@ -282,9 +282,10 @@ export function getFASTKTitleInfo(
282
282
  period: number,
283
283
  pluginHost: PluginHost,
284
284
  paneId: string = 'sub_FASTK',
285
- theme: ChartTheme = 'light'
285
+ theme: 'light' | 'dark' = 'light',
286
+ isAsiaMarket?: boolean
286
287
  ): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
287
- const colors = getColors(theme)
288
+ const colors = resolveThemeColors(theme, isAsiaMarket)
288
289
  const state = pluginHost.getSharedState<FASTKRenderState>(createFASTKStateKey(paneId))
289
290
  if (!state) return null
290
291
 
@@ -295,7 +296,7 @@ export function getFASTKTitleInfo(
295
296
  name: 'FASTK',
296
297
  params: [period],
297
298
  values: [
298
- { label: 'FASTK', value: fastk, color: colors.KDJ.K },
299
+ { label: 'FASTK', value: fastk, color: colors.kdj.k },
299
300
  ],
300
301
  }
301
302
  }
@@ -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 type { KSTRenderState } from '../../indicators/kstState'
5
5
  import { createKSTStateKey } from '../../indicators/kstState'
6
6
  import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
@@ -99,7 +99,7 @@ export function createKSTRendererPlugin(options: KSTRendererOptions = {}): Rende
99
99
 
100
100
  draw(context: RenderContext) {
101
101
  const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = context
102
- const colors = getColors(context.theme)
102
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
103
103
 
104
104
  const stateKey = resolveKey()
105
105
  if (!stateKey) return
@@ -178,10 +178,10 @@ const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = co
178
178
  if (enableWebGL && lineWebGLSurface?.isAvailable()) {
179
179
  const lines: Array<{ points: LinePoint[]; width: number; color: string }> = []
180
180
  if (params.showKST && cachedKSTPoints.length >= 2) {
181
- lines.push({ points: cachedKSTPoints, width: 1, color: colors.KST.KST })
181
+ lines.push({ points: cachedKSTPoints, width: 1, color: colors.kst.kst })
182
182
  }
183
183
  if (params.showSignal && cachedSignalPoints.length >= 2) {
184
- lines.push({ points: cachedSignalPoints, width: 1, color: colors.KST.SIGNAL })
184
+ lines.push({ points: cachedSignalPoints, width: 1, color: colors.kst.signal })
185
185
  }
186
186
 
187
187
  const allOk = lines.length > 0 && lineWebGLSurface.drawLineStrips(lines, scrollLeft)
@@ -219,7 +219,7 @@ function drawKSTLinesWithCanvas2D(
219
219
  kstPoints: LinePoint[],
220
220
  signalPoints: LinePoint[],
221
221
  params: { showKST: boolean; showSignal: boolean },
222
- colors: { KST: { KST: string; SIGNAL: string } }
222
+ colors: { kst: { kst: string; signal: string } }
223
223
  ): void {
224
224
  ctx.save()
225
225
  ctx.translate(-scrollLeft, 0)
@@ -228,7 +228,7 @@ function drawKSTLinesWithCanvas2D(
228
228
  ctx.lineCap = 'round'
229
229
 
230
230
  if (params.showKST && kstPoints.length >= 2) {
231
- ctx.strokeStyle = colors.KST.KST
231
+ ctx.strokeStyle = colors.kst.kst
232
232
  ctx.beginPath()
233
233
  ctx.moveTo(kstPoints[0]!.x, kstPoints[0]!.y)
234
234
  for (let i = 1; i < kstPoints.length; i++) {
@@ -239,7 +239,7 @@ function drawKSTLinesWithCanvas2D(
239
239
  }
240
240
 
241
241
  if (params.showSignal && signalPoints.length >= 2) {
242
- ctx.strokeStyle = colors.KST.SIGNAL
242
+ ctx.strokeStyle = colors.kst.signal
243
243
  ctx.beginPath()
244
244
  ctx.moveTo(signalPoints[0]!.x, signalPoints[0]!.y)
245
245
  for (let i = 1; i < signalPoints.length; i++) {
@@ -264,9 +264,10 @@ export function getKSTTitleInfo(
264
264
  signalPeriod: number,
265
265
  pluginHost: PluginHost,
266
266
  paneId: string = 'sub_KST',
267
- theme: ChartTheme = 'light'
267
+ theme: 'light' | 'dark' = 'light',
268
+ isAsiaMarket?: boolean
268
269
  ): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
269
- const colors = getColors(theme)
270
+ const colors = resolveThemeColors(theme, isAsiaMarket)
270
271
  const state = pluginHost.getSharedState<KSTRenderState>(createKSTStateKey(paneId))
271
272
  if (!state) return null
272
273
 
@@ -274,8 +275,8 @@ export function getKSTTitleInfo(
274
275
  if (!point) return null
275
276
 
276
277
  const values = []
277
- if (state.params.showKST) values.push({ label: 'KST', value: point.kst, color: colors.KST.KST })
278
- if (state.params.showSignal) values.push({ label: 'Signal', value: point.signal, color: colors.KST.SIGNAL })
278
+ if (state.params.showKST) values.push({ label: 'KST', value: point.kst, color: colors.kst.kst })
279
+ if (state.params.showSignal) values.push({ label: 'Signal', value: point.signal, color: colors.kst.signal })
279
280
 
280
281
  if (values.length === 0) return null
281
282
 
@@ -5,7 +5,7 @@ import { Indicator } from '../../indicators/indicatorDefinitionRegistry'
5
5
  import { resolveStateKey } from '../../indicators/indicatorMetadata'
6
6
  import type { IndicatorScheduler } from '../../indicators/scheduler'
7
7
  import { alignToPhysicalPixelCenter } from '../../draw/pixelAlign'
8
- import { getColors } from '../../theme/colors'
8
+ import { resolveThemeColors } from '../../../tokens'
9
9
 
10
10
  // Re-export MAFlags from calculators for backward compatibility
11
11
  export type { MAFlags } from '../../indicators/calculators'
@@ -97,8 +97,8 @@ export function createMARendererPlugin(): RendererPluginWithHost {
97
97
 
98
98
  draw(context: RenderContext) {
99
99
  const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = context
100
- const colors = getColors(context.theme)
101
- const maColors: Record<number, string> = { 5: colors.MA.MA5, 10: colors.MA.MA10, 20: colors.MA.MA20, 30: colors.MA.MA30, 60: colors.MA.MA60 }
100
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
101
+ const maColors: Record<number, string> = { 5: colors.ma.ma5, 10: colors.ma.ma10, 20: colors.ma.ma20, 30: colors.ma.ma30, 60: colors.ma.ma60 }
102
102
  const stateKey = resolveKey()
103
103
  if (!stateKey) return
104
104
  const state = pluginHost?.getSharedState<MARenderState>(stateKey)
@@ -147,7 +147,7 @@ export function createMARendererPlugin(): RendererPluginWithHost {
147
147
  for (const period of state.enabledPeriods) {
148
148
  const points = cachedLines.get(period)
149
149
  if (!points) continue
150
- lines.push({ points, width: 1, color: maColors[period] ?? colors.MA.MA5 })
150
+ lines.push({ points, width: 1, color: maColors[period] ?? colors.ma.ma5 })
151
151
  }
152
152
  const allOk = lines.length > 0 && lineWebGLSurface.drawLineStrips(lines, scrollLeft)
153
153
 
@@ -170,7 +170,7 @@ export function createMARendererPlugin(): RendererPluginWithHost {
170
170
  for (const period of state.enabledPeriods) {
171
171
  const points = cachedLines.get(period)
172
172
  if (!points || points.length < 2) continue
173
- ctx.strokeStyle = maColors[period] ?? colors.MA.MA5
173
+ ctx.strokeStyle = maColors[period] ?? colors.ma.ma5
174
174
  ctx.beginPath()
175
175
  ctx.moveTo(points[0]!.x, points[0]!.y)
176
176
  for (let i = 1; i < points.length; i++) {
@@ -1,8 +1,7 @@
1
1
  import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
2
2
  import { RENDERER_PRIORITY } from '../../../plugin'
3
3
  import type { KLineData } from '../../../types/price'
4
- import { getColors } from '../../theme/colors'
5
- import type { ChartTheme, ThemeColors } from '../../theme/colors'
4
+ import { resolveThemeColors } from '../../../tokens'
6
5
  import { alignToPhysicalPixelCenter } from '../../draw/pixelAlign'
7
6
  import type { MACDRenderState } from '../../indicators/macdState'
8
7
  import { createMACDStateKey } from '../../indicators/macdState'
@@ -131,7 +130,7 @@ export function createMACDRendererPlugin(options: MACDRendererOptions = {}): Ren
131
130
  draw(context: RenderContext) {
132
131
  const { ctx, pane, data, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = context
133
132
  const klineData = data as KLineData[]
134
- const colors = getColors(context.theme)
133
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
135
134
 
136
135
  // 从 StateStore 读取 MACD 状态
137
136
  const stateKey = resolveKey()
@@ -214,7 +213,7 @@ export function createMACDRendererPlugin(options: MACDRendererOptions = {}): Ren
214
213
 
215
214
  const usedWebGL = drawMacdBarsWithWebGL(context, barUpBuf, barUpCount, barUpLightBuf, barUpLightCount, barDownBuf, barDownCount, barDownLightBuf, barDownLightCount)
216
215
  if (!usedWebGL) {
217
- drawMacdBarsWithCanvas2D(ctx, scrollLeft, colors, barUpBuf, barUpCount, barUpLightBuf, barUpLightCount, barDownBuf, barDownCount, barDownLightBuf, barDownLightCount)
216
+ drawMacdBarsWithCanvas2D(ctx, scrollLeft, colors.macd.barUp, colors.macd.barUpLight, colors.macd.barDown, colors.macd.barDownLight, barUpBuf, barUpCount, barUpLightBuf, barUpLightCount, barDownBuf, barDownCount, barDownLightBuf, barDownLightCount)
218
217
  } else {
219
218
  compositeMacdWebGL(ctx, context)
220
219
  }
@@ -256,10 +255,10 @@ export function createMACDRendererPlugin(options: MACDRendererOptions = {}): Ren
256
255
  if (enableWebGL && lineWebGLSurface?.isAvailable()) {
257
256
  const lines: Array<{ points: LinePoint[]; width: number; color: string }> = []
258
257
  if (config.showDIF && cachedDifPoints.length >= 2) {
259
- lines.push({ points: cachedDifPoints, width: 1, color: colors.MACD.DIF })
258
+ lines.push({ points: cachedDifPoints, width: 1, color: colors.macd.dif })
260
259
  }
261
260
  if (config.showDEA && cachedDeaPoints.length >= 2) {
262
- lines.push({ points: cachedDeaPoints, width: 1, color: colors.MACD.DEA })
261
+ lines.push({ points: cachedDeaPoints, width: 1, color: colors.macd.dea })
263
262
  }
264
263
  const allOk = lines.length > 0 && lineWebGLSurface.drawLineStrips(lines, scrollLeft)
265
264
  if (allOk) {
@@ -269,7 +268,7 @@ export function createMACDRendererPlugin(options: MACDRendererOptions = {}): Ren
269
268
  }
270
269
 
271
270
  if (!usedWebGLForLines) {
272
- drawMacdLinesWithCanvas2D(ctx, scrollLeft, colors, cachedDifPoints, cachedDeaPoints, config)
271
+ drawMacdLinesWithCanvas2D(ctx, scrollLeft, colors.macd.dif, colors.macd.dea, cachedDifPoints, cachedDeaPoints, config)
273
272
  }
274
273
  },
275
274
 
@@ -313,17 +312,17 @@ function drawMacdBarsWithWebGL(
313
312
  barDownBuf: Float32Array, barDownCount: number,
314
313
  barDownLightBuf: Float32Array, barDownLightCount: number
315
314
  ): boolean {
316
- const colors = getColors(context.theme)
315
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
317
316
  if (context.settings?.enableWebGLRendering === false) return false
318
317
  const surface = context.candleWebGLSurface
319
318
  if (!surface || !surface.isAvailable()) return false
320
319
 
321
320
  surface.clear()
322
321
 
323
- const ok1 = barUpCount === 0 || surface.drawRectBuffer(barUpBuf.subarray(0, barUpCount * 4), barUpCount, colors.MACD.BAR_UP, context.scrollLeft)
324
- const ok2 = barUpLightCount === 0 || surface.drawRectBuffer(barUpLightBuf.subarray(0, barUpLightCount * 4), barUpLightCount, colors.MACD.BAR_UP_LIGHT, context.scrollLeft)
325
- const ok3 = barDownCount === 0 || surface.drawRectBuffer(barDownBuf.subarray(0, barDownCount * 4), barDownCount, colors.MACD.BAR_DOWN, context.scrollLeft)
326
- const ok4 = barDownLightCount === 0 || surface.drawRectBuffer(barDownLightBuf.subarray(0, barDownLightCount * 4), barDownLightCount, colors.MACD.BAR_DOWN_LIGHT, context.scrollLeft)
322
+ const ok1 = barUpCount === 0 || surface.drawRectBuffer(barUpBuf.subarray(0, barUpCount * 4), barUpCount, colors.macd.barUp, context.scrollLeft)
323
+ const ok2 = barUpLightCount === 0 || surface.drawRectBuffer(barUpLightBuf.subarray(0, barUpLightCount * 4), barUpLightCount, colors.macd.barUpLight, context.scrollLeft)
324
+ const ok3 = barDownCount === 0 || surface.drawRectBuffer(barDownBuf.subarray(0, barDownCount * 4), barDownCount, colors.macd.barDown, context.scrollLeft)
325
+ const ok4 = barDownLightCount === 0 || surface.drawRectBuffer(barDownLightBuf.subarray(0, barDownLightCount * 4), barDownLightCount, colors.macd.barDownLight, context.scrollLeft)
327
326
 
328
327
  return ok1 && ok2 && ok3 && ok4
329
328
  }
@@ -331,7 +330,8 @@ function drawMacdBarsWithWebGL(
331
330
  function drawMacdBarsWithCanvas2D(
332
331
  ctx: CanvasRenderingContext2D,
333
332
  scrollLeft: number,
334
- colors: { MACD: { BAR_UP: string; BAR_UP_LIGHT: string; BAR_DOWN: string; BAR_DOWN_LIGHT: string } },
333
+ barUpColor: string, barUpLightColor: string,
334
+ barDownColor: string, barDownLightColor: string,
335
335
  barUpBuf: Float32Array, barUpCount: number,
336
336
  barUpLightBuf: Float32Array, barUpLightCount: number,
337
337
  barDownBuf: Float32Array, barDownCount: number,
@@ -340,25 +340,25 @@ function drawMacdBarsWithCanvas2D(
340
340
  ctx.save()
341
341
  ctx.translate(-scrollLeft, 0)
342
342
 
343
- ctx.fillStyle = colors.MACD.BAR_UP
343
+ ctx.fillStyle = barUpColor
344
344
  for (let i = 0; i < barUpCount; i++) {
345
345
  const off = i * 4
346
346
  ctx.fillRect(barUpBuf[off], barUpBuf[off + 1], barUpBuf[off + 2], barUpBuf[off + 3])
347
347
  }
348
348
 
349
- ctx.fillStyle = colors.MACD.BAR_UP_LIGHT
349
+ ctx.fillStyle = barUpLightColor
350
350
  for (let i = 0; i < barUpLightCount; i++) {
351
351
  const off = i * 4
352
352
  ctx.fillRect(barUpLightBuf[off], barUpLightBuf[off + 1], barUpLightBuf[off + 2], barUpLightBuf[off + 3])
353
353
  }
354
354
 
355
- ctx.fillStyle = colors.MACD.BAR_DOWN
355
+ ctx.fillStyle = barDownColor
356
356
  for (let i = 0; i < barDownCount; i++) {
357
357
  const off = i * 4
358
358
  ctx.fillRect(barDownBuf[off], barDownBuf[off + 1], barDownBuf[off + 2], barDownBuf[off + 3])
359
359
  }
360
360
 
361
- ctx.fillStyle = colors.MACD.BAR_DOWN_LIGHT
361
+ ctx.fillStyle = barDownLightColor
362
362
  for (let i = 0; i < barDownLightCount; i++) {
363
363
  const off = i * 4
364
364
  ctx.fillRect(barDownLightBuf[off], barDownLightBuf[off + 1], barDownLightBuf[off + 2], barDownLightBuf[off + 3])
@@ -370,7 +370,8 @@ function drawMacdBarsWithCanvas2D(
370
370
  function drawMacdLinesWithCanvas2D(
371
371
  ctx: CanvasRenderingContext2D,
372
372
  scrollLeft: number,
373
- colors: ThemeColors,
373
+ difColor: string,
374
+ deaColor: string,
374
375
  difPoints: LinePoint[],
375
376
  deaPoints: LinePoint[],
376
377
  config: { showDIF: boolean; showDEA: boolean }
@@ -382,7 +383,7 @@ function drawMacdLinesWithCanvas2D(
382
383
  ctx.lineCap = 'round'
383
384
 
384
385
  if (config.showDIF && difPoints.length >= 2) {
385
- ctx.strokeStyle = colors.MACD.DIF
386
+ ctx.strokeStyle = difColor
386
387
  ctx.beginPath()
387
388
  ctx.moveTo(difPoints[0]!.x, difPoints[0]!.y)
388
389
  for (let i = 1; i < difPoints.length; i++) {
@@ -393,7 +394,7 @@ function drawMacdLinesWithCanvas2D(
393
394
  }
394
395
 
395
396
  if (config.showDEA && deaPoints.length >= 2) {
396
- ctx.strokeStyle = colors.MACD.DEA
397
+ ctx.strokeStyle = deaColor
397
398
  ctx.beginPath()
398
399
  ctx.moveTo(deaPoints[0]!.x, deaPoints[0]!.y)
399
400
  for (let i = 1; i < deaPoints.length; i++) {
@@ -441,9 +442,10 @@ export function getMACDTitleInfo(
441
442
  signalPeriod: number,
442
443
  pluginHost: PluginHost,
443
444
  paneId: string = 'sub_MACD',
444
- theme: ChartTheme = 'light'
445
+ theme: 'light' | 'dark' = 'light',
446
+ isAsiaMarket?: boolean
445
447
  ): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
446
- const colors = getColors(theme)
448
+ const colors = resolveThemeColors(theme, isAsiaMarket)
447
449
  const state = pluginHost.getSharedState<MACDRenderState>(createMACDStateKey(paneId))
448
450
  if (!state) return null
449
451
 
@@ -454,9 +456,9 @@ export function getMACDTitleInfo(
454
456
  name: 'MACD',
455
457
  params: [fastPeriod, slowPeriod, signalPeriod],
456
458
  values: [
457
- { label: 'DIF', value: point.dif, color: colors.MACD.DIF },
458
- { label: 'DEA', value: point.dea, color: colors.MACD.DEA },
459
- { label: 'MACD', value: point.macd, color: point.macd >= 0 ? colors.MACD.BAR_UP : colors.MACD.BAR_DOWN },
459
+ { label: 'DIF', value: point.dif, color: colors.macd.dif },
460
+ { label: 'DEA', value: point.dea, color: colors.macd.dea },
461
+ { label: 'MACD', value: point.macd, color: point.macd >= 0 ? colors.macd.barUp : colors.macd.barDown },
460
462
  ],
461
463
  }
462
464
  }
@@ -1,6 +1,6 @@
1
1
  import type { RendererPluginWithHost, PluginHost, RenderContext } 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 type { MACDRenderState } from '../../indicators/macdState'
6
6
  import { createMACDStateKey } from '../../indicators/macdState'
@@ -59,7 +59,7 @@ export function createMACDLegendRendererPlugin(options: MACDLegendOptions = {}):
59
59
 
60
60
  draw(context: RenderContext) {
61
61
  const { ctx, range } = context
62
- const colors = getColors(context.theme)
62
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
63
63
 
64
64
  // 从 StateStore 读取 MACD 状态
65
65
  const state = pluginHost?.getSharedState<MACDRenderState>(stateKey)
@@ -103,22 +103,22 @@ export function createMACDLegendRendererPlugin(options: MACDLegendOptions = {}):
103
103
  ctx.textBaseline = 'top'
104
104
 
105
105
  const paramText = `MACD(${fastPeriod},${slowPeriod},${signalPeriod})`
106
- ctx.fillStyle = colors.TEXT.TERTIARY
106
+ ctx.fillStyle = colors.text.tertiary
107
107
  ctx.fillText(paramText, x, y)
108
108
  x += measureTextWidth(ctx, paramText) + gap
109
109
 
110
110
  const difText = `DIF:${macdValue.dif.toFixed(2)}`
111
- ctx.fillStyle = colors.MACD.DIF
111
+ ctx.fillStyle = colors.macd.dif
112
112
  ctx.fillText(difText, x, y)
113
113
  x += measureTextWidth(ctx, difText) + gap
114
114
 
115
115
  const deaText = `DEA:${macdValue.dea.toFixed(2)}`
116
- ctx.fillStyle = colors.MACD.DEA
116
+ ctx.fillStyle = colors.macd.dea
117
117
  ctx.fillText(deaText, x, y)
118
118
  x += measureTextWidth(ctx, deaText) + gap
119
119
 
120
120
  const macdText = `MACD:${macdValue.macd.toFixed(2)}`
121
- ctx.fillStyle = macdValue.macd >= 0 ? colors.MACD.BAR_UP : colors.MACD.BAR_DOWN
121
+ ctx.fillStyle = macdValue.macd >= 0 ? colors.macd.barUp : colors.macd.barDown
122
122
  ctx.fillText(macdText, x, y)
123
123
 
124
124
  ctx.restore()
@@ -5,7 +5,7 @@ import { MA_STATE_KEY, type MARenderState } from '../../indicators/maState'
5
5
  import { BOLL_STATE_KEY, type BOLLRenderState } from '../../indicators/bollState'
6
6
  import { EXPMA_STATE_KEY, type EXPMARenderState } from '../../indicators/expmaState'
7
7
  import { ENE_STATE_KEY, type ENERenderState } from '../../indicators/eneState'
8
- import { getColors } from '../../theme/colors'
8
+ import { resolveThemeColors } from '../../../tokens'
9
9
  import { getFont, setCanvasFont } from '../../theme/fonts'
10
10
 
11
11
  const textWidthCache = new Map<string, number>()
@@ -80,7 +80,7 @@ export function createMainIndicatorLegendRendererPlugin(options: {
80
80
  draw(context: RenderContext) {
81
81
  const { overlayCtx, data, range, crosshairIndex } = context
82
82
  const klineData = data as KLineData[]
83
- const colors = getColors(context.theme)
83
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
84
84
  if (!klineData.length || !overlayCtx) return
85
85
 
86
86
  const fontSize = 12
@@ -104,13 +104,13 @@ export function createMainIndicatorLegendRendererPlugin(options: {
104
104
 
105
105
  if (state && state.visibleMin <= state.visibleMax) {
106
106
  for (const period of state.enabledPeriods) {
107
- const colorKey = `MA${period}` as keyof typeof colors.MA
107
+ const colorKey = `ma${period}` as keyof typeof colors.ma
108
108
  const series = state.series[period]
109
109
  const value = series?.[targetIndex]
110
110
 
111
111
  items.push({
112
112
  label: `MA${period}`,
113
- color: colors.MA[colorKey] || colors.MA.MA5,
113
+ color: colors.ma[colorKey] || colors.ma.ma5,
114
114
  value: value,
115
115
  })
116
116
  }
@@ -120,7 +120,7 @@ export function createMainIndicatorLegendRendererPlugin(options: {
120
120
  let x = legendX
121
121
  const y = config.yPaddingPx / 2 + fontSize + rowIndex * lineHeight
122
122
 
123
- overlayCtx.fillStyle = colors.PRICE.NEUTRAL
123
+ overlayCtx.fillStyle = colors.text.primary
124
124
  overlayCtx.fillText('MA', x, y)
125
125
  x += measureTextWidth(overlayCtx, 'MA') + gap
126
126
 
@@ -149,23 +149,23 @@ export function createMainIndicatorLegendRendererPlugin(options: {
149
149
  const y = config.yPaddingPx / 2 + fontSize + rowIndex * lineHeight
150
150
  const titleText = `BOLL(${period},${multiplier})`
151
151
 
152
- overlayCtx.fillStyle = colors.PRICE.NEUTRAL
152
+ overlayCtx.fillStyle = colors.text.primary
153
153
  overlayCtx.fillText(titleText, x, y)
154
154
  x += measureTextWidth(overlayCtx, titleText) + gap
155
155
 
156
156
  if (boll) {
157
157
  const upperText = `上轨:${boll.upper.toFixed(2)}`
158
- overlayCtx.fillStyle = colors.BOLL.UPPER
158
+ overlayCtx.fillStyle = colors.boll.upper
159
159
  overlayCtx.fillText(upperText, x, y)
160
160
  x += measureTextWidth(overlayCtx, upperText) + gap
161
161
 
162
162
  const middleText = `中轨:${boll.middle.toFixed(2)}`
163
- overlayCtx.fillStyle = colors.BOLL.MIDDLE
163
+ overlayCtx.fillStyle = colors.boll.middle
164
164
  overlayCtx.fillText(middleText, x, y)
165
165
  x += measureTextWidth(overlayCtx, middleText) + gap
166
166
 
167
167
  const lowerText = `下轨:${boll.lower.toFixed(2)}`
168
- overlayCtx.fillStyle = colors.BOLL.LOWER
168
+ overlayCtx.fillStyle = colors.boll.lower
169
169
  overlayCtx.fillText(lowerText, x, y)
170
170
  }
171
171
  }
@@ -185,18 +185,18 @@ export function createMainIndicatorLegendRendererPlugin(options: {
185
185
  const y = config.yPaddingPx / 2 + fontSize + rowIndex * lineHeight
186
186
  const titleText = `EXPMA(${fastPeriod},${slowPeriod})`
187
187
 
188
- overlayCtx.fillStyle = colors.PRICE.NEUTRAL
188
+ overlayCtx.fillStyle = colors.text.primary
189
189
  overlayCtx.fillText(titleText, x, y)
190
190
  x += measureTextWidth(overlayCtx, titleText) + gap
191
191
 
192
192
  if (expma) {
193
193
  const fastText = `快:${expma.fast.toFixed(2)}`
194
- overlayCtx.fillStyle = colors.EXPMA.FAST
194
+ overlayCtx.fillStyle = colors.expma.fast
195
195
  overlayCtx.fillText(fastText, x, y)
196
196
  x += measureTextWidth(overlayCtx, fastText) + gap
197
197
 
198
198
  const slowText = `慢:${expma.slow.toFixed(2)}`
199
- overlayCtx.fillStyle = colors.EXPMA.SLOW
199
+ overlayCtx.fillStyle = colors.expma.slow
200
200
  overlayCtx.fillText(slowText, x, y)
201
201
  }
202
202
  }
@@ -216,23 +216,23 @@ export function createMainIndicatorLegendRendererPlugin(options: {
216
216
  const y = config.yPaddingPx / 2 + fontSize + rowIndex * lineHeight
217
217
  const titleText = `ENE(${period},${deviation})`
218
218
 
219
- overlayCtx.fillStyle = colors.PRICE.NEUTRAL
219
+ overlayCtx.fillStyle = colors.text.primary
220
220
  overlayCtx.fillText(titleText, x, y)
221
221
  x += measureTextWidth(overlayCtx, titleText) + gap
222
222
 
223
223
  if (ene) {
224
224
  const upperText = `上轨:${ene.upper.toFixed(2)}`
225
- overlayCtx.fillStyle = colors.ENE.UPPER
225
+ overlayCtx.fillStyle = colors.ene.upper
226
226
  overlayCtx.fillText(upperText, x, y)
227
227
  x += measureTextWidth(overlayCtx, upperText) + gap
228
228
 
229
229
  const middleText = `中轨:${ene.middle.toFixed(2)}`
230
- overlayCtx.fillStyle = colors.ENE.MIDDLE
230
+ overlayCtx.fillStyle = colors.ene.middle
231
231
  overlayCtx.fillText(middleText, x, y)
232
232
  x += measureTextWidth(overlayCtx, middleText) + gap
233
233
 
234
234
  const lowerText = `下轨:${ene.lower.toFixed(2)}`
235
- overlayCtx.fillStyle = colors.ENE.LOWER
235
+ overlayCtx.fillStyle = colors.ene.lower
236
236
  overlayCtx.fillText(lowerText, x, y)
237
237
  }
238
238
  }
@@ -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 { MOMRenderState } from '../../indicators/momState'
6
6
  import { createMOMStateKey } from '../../indicators/momState'
@@ -82,7 +82,7 @@ export function createMOMRendererPlugin(options: MOMRendererOptions = {}): Rende
82
82
  displayMin: number,
83
83
  displayMax: number,
84
84
  dpr: number,
85
- colors: { MOM: { ZERO: string } }
85
+ colors: { mom: { zero: string } }
86
86
  ): void {
87
87
  const displayValueRange = displayMax - displayMin || 1
88
88
  const zeroY = alignToPhysicalPixelCenter(paneHeight - (0 - displayMin) / displayValueRange * paneHeight, dpr)
@@ -90,7 +90,7 @@ export function createMOMRendererPlugin(options: MOMRendererOptions = {}): Rende
90
90
  ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height)
91
91
  ctx.save()
92
92
  ctx.scale(dpr, dpr)
93
- ctx.strokeStyle = colors.MOM.ZERO
93
+ ctx.strokeStyle = colors.mom.zero
94
94
  ctx.lineWidth = 1
95
95
  ctx.beginPath()
96
96
  ctx.moveTo(0, zeroY)
@@ -143,7 +143,7 @@ export function createMOMRendererPlugin(options: MOMRendererOptions = {}): Rende
143
143
 
144
144
  draw(context: RenderContext) {
145
145
  const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = context
146
- const colors = getColors(context.theme)
146
+ const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
147
147
 
148
148
  const stateKey = resolveKey()
149
149
  if (!stateKey) return
@@ -213,7 +213,7 @@ const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = co
213
213
  if (enableWebGL && lineWebGLSurface?.isAvailable()) {
214
214
  if (params.showMOM && cachedMOMPoints.length >= 2) {
215
215
  const ok = lineWebGLSurface.drawLineStrips(
216
- [{ points: cachedMOMPoints, width: 1, color: colors.MOM.MOM }],
216
+ [{ points: cachedMOMPoints, width: 1, color: colors.mom.mom }],
217
217
  scrollLeft
218
218
  )
219
219
  if (ok) {
@@ -249,13 +249,13 @@ function drawMOMLineWithCanvas2D(
249
249
  scrollLeft: number,
250
250
  momPoints: LinePoint[],
251
251
  params: { showMOM: boolean },
252
- colors: { MOM: { MOM: string } }
252
+ colors: { mom: { mom: string } }
253
253
  ): void {
254
254
  if (!params.showMOM || momPoints.length < 2) return
255
255
 
256
256
  ctx.save()
257
257
  ctx.translate(-scrollLeft, 0)
258
- ctx.strokeStyle = colors.MOM.MOM
258
+ ctx.strokeStyle = colors.mom.mom
259
259
  ctx.lineWidth = 1
260
260
  ctx.lineJoin = 'round'
261
261
  ctx.lineCap = 'round'
@@ -277,9 +277,10 @@ export function getMOMTitleInfo(
277
277
  period: number,
278
278
  pluginHost: PluginHost,
279
279
  paneId: string = 'sub_MOM',
280
- theme: ChartTheme = 'light'
280
+ theme: 'light' | 'dark' = 'light',
281
+ isAsiaMarket?: boolean
281
282
  ): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
282
- const colors = getColors(theme)
283
+ const colors = resolveThemeColors(theme, isAsiaMarket)
283
284
  const state = pluginHost.getSharedState<MOMRenderState>(createMOMStateKey(paneId))
284
285
  if (!state) return null
285
286
 
@@ -290,7 +291,7 @@ export function getMOMTitleInfo(
290
291
  name: 'MOM',
291
292
  params: [period],
292
293
  values: [
293
- { label: 'MOM', value: mom, color: colors.MOM.MOM },
294
+ { label: 'MOM', value: mom, color: colors.mom.mom },
294
295
  ],
295
296
  }
296
297
  }