@363045841yyt/klinechart-core 0.7.5 → 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 (235) hide show
  1. package/README.md +8 -8
  2. package/README.zh-CN.md +8 -8
  3. package/dist/config/chartSettings.d.ts +27 -2
  4. package/dist/config/chartSettings.d.ts.map +1 -1
  5. package/dist/config/chartSettings.js +6 -0
  6. package/dist/config/chartSettings.js.map +1 -1
  7. package/dist/controllers/createChartController.d.ts.map +1 -1
  8. package/dist/controllers/createChartController.js +145 -21
  9. package/dist/controllers/createChartController.js.map +1 -1
  10. package/dist/controllers/index.d.ts +9 -1
  11. package/dist/controllers/index.d.ts.map +1 -1
  12. package/dist/controllers/index.js +9 -0
  13. package/dist/controllers/index.js.map +1 -1
  14. package/dist/controllers/types.d.ts +65 -8
  15. package/dist/controllers/types.d.ts.map +1 -1
  16. package/dist/engine/chart.d.ts +2 -12
  17. package/dist/engine/chart.d.ts.map +1 -1
  18. package/dist/engine/chart.js +32 -31
  19. package/dist/engine/chart.js.map +1 -1
  20. package/dist/engine/controller/interaction.d.ts +1 -1
  21. package/dist/engine/controller/interaction.d.ts.map +1 -1
  22. package/dist/engine/controller/interaction.js +10 -2
  23. package/dist/engine/controller/interaction.js.map +1 -1
  24. package/dist/engine/draw/pixelAlign.d.ts.map +1 -1
  25. package/dist/engine/draw/pixelAlign.js.map +1 -1
  26. package/dist/engine/drawing/interaction.d.ts +3 -3
  27. package/dist/engine/drawing/interaction.d.ts.map +1 -1
  28. package/dist/engine/drawing/interaction.js +38 -46
  29. package/dist/engine/drawing/interaction.js.map +1 -1
  30. package/dist/engine/drawing/plugin.js +1 -1
  31. package/dist/engine/drawing/plugin.js.map +1 -1
  32. package/dist/engine/renderers/Indicator/atr.d.ts.map +1 -1
  33. package/dist/engine/renderers/Indicator/atr.js +7 -4
  34. package/dist/engine/renderers/Indicator/atr.js.map +1 -1
  35. package/dist/engine/renderers/Indicator/boll.js +12 -12
  36. package/dist/engine/renderers/Indicator/boll.js.map +1 -1
  37. package/dist/engine/renderers/Indicator/cci.d.ts +1 -2
  38. package/dist/engine/renderers/Indicator/cci.d.ts.map +1 -1
  39. package/dist/engine/renderers/Indicator/cci.js +9 -9
  40. package/dist/engine/renderers/Indicator/cci.js.map +1 -1
  41. package/dist/engine/renderers/Indicator/ene.js +12 -12
  42. package/dist/engine/renderers/Indicator/ene.js.map +1 -1
  43. package/dist/engine/renderers/Indicator/expma.js +6 -6
  44. package/dist/engine/renderers/Indicator/expma.js.map +1 -1
  45. package/dist/engine/renderers/Indicator/fastk.d.ts +1 -2
  46. package/dist/engine/renderers/Indicator/fastk.d.ts.map +1 -1
  47. package/dist/engine/renderers/Indicator/fastk.js +7 -7
  48. package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
  49. package/dist/engine/renderers/Indicator/kst.d.ts +1 -2
  50. package/dist/engine/renderers/Indicator/kst.d.ts.map +1 -1
  51. package/dist/engine/renderers/Indicator/kst.js +10 -10
  52. package/dist/engine/renderers/Indicator/kst.js.map +1 -1
  53. package/dist/engine/renderers/Indicator/ma.js +5 -5
  54. package/dist/engine/renderers/Indicator/ma.js.map +1 -1
  55. package/dist/engine/renderers/Indicator/macd.d.ts +1 -2
  56. package/dist/engine/renderers/Indicator/macd.d.ts.map +1 -1
  57. package/dist/engine/renderers/Indicator/macd.js +24 -24
  58. package/dist/engine/renderers/Indicator/macd.js.map +1 -1
  59. package/dist/engine/renderers/Indicator/macdLegend.js +6 -6
  60. package/dist/engine/renderers/Indicator/macdLegend.js.map +1 -1
  61. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js +16 -16
  62. package/dist/engine/renderers/Indicator/mainIndicatorLegend.js.map +1 -1
  63. package/dist/engine/renderers/Indicator/mom.d.ts +1 -2
  64. package/dist/engine/renderers/Indicator/mom.d.ts.map +1 -1
  65. package/dist/engine/renderers/Indicator/mom.js +8 -8
  66. package/dist/engine/renderers/Indicator/mom.js.map +1 -1
  67. package/dist/engine/renderers/Indicator/rsi.d.ts +2 -3
  68. package/dist/engine/renderers/Indicator/rsi.d.ts.map +1 -1
  69. package/dist/engine/renderers/Indicator/rsi.js +15 -15
  70. package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
  71. package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts +1 -2
  72. package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts.map +1 -1
  73. package/dist/engine/renderers/Indicator/scale/indicator_scale.js +5 -5
  74. package/dist/engine/renderers/Indicator/scale/indicator_scale.js.map +1 -1
  75. package/dist/engine/renderers/Indicator/stoch.d.ts +1 -2
  76. package/dist/engine/renderers/Indicator/stoch.d.ts.map +1 -1
  77. package/dist/engine/renderers/Indicator/stoch.js +10 -10
  78. package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
  79. package/dist/engine/renderers/Indicator/structure.js +5 -5
  80. package/dist/engine/renderers/Indicator/structure.js.map +1 -1
  81. package/dist/engine/renderers/Indicator/wmsr.d.ts +1 -2
  82. package/dist/engine/renderers/Indicator/wmsr.d.ts.map +1 -1
  83. package/dist/engine/renderers/Indicator/wmsr.js +10 -10
  84. package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
  85. package/dist/engine/renderers/Indicator/zones.js +6 -6
  86. package/dist/engine/renderers/Indicator/zones.js.map +1 -1
  87. package/dist/engine/renderers/candle.d.ts +1 -1
  88. package/dist/engine/renderers/candle.d.ts.map +1 -1
  89. package/dist/engine/renderers/candle.js +21 -21
  90. package/dist/engine/renderers/candle.js.map +1 -1
  91. package/dist/engine/renderers/crosshair.js +3 -3
  92. package/dist/engine/renderers/crosshair.js.map +1 -1
  93. package/dist/engine/renderers/extremaMarkers.d.ts.map +1 -1
  94. package/dist/engine/renderers/extremaMarkers.js +12 -12
  95. package/dist/engine/renderers/extremaMarkers.js.map +1 -1
  96. package/dist/engine/renderers/gridLines.js +3 -3
  97. package/dist/engine/renderers/gridLines.js.map +1 -1
  98. package/dist/engine/renderers/lastPrice.js +7 -7
  99. package/dist/engine/renderers/lastPrice.js.map +1 -1
  100. package/dist/engine/renderers/paneTitle.d.ts +5 -24
  101. package/dist/engine/renderers/paneTitle.d.ts.map +1 -1
  102. package/dist/engine/renderers/paneTitle.js +16 -11
  103. package/dist/engine/renderers/paneTitle.js.map +1 -1
  104. package/dist/engine/renderers/subVolume.d.ts.map +1 -1
  105. package/dist/engine/renderers/subVolume.js +23 -20
  106. package/dist/engine/renderers/subVolume.js.map +1 -1
  107. package/dist/engine/renderers/timeAxis.js +9 -9
  108. package/dist/engine/renderers/timeAxis.js.map +1 -1
  109. package/dist/engine/renderers/webgl/candleSurface.d.ts +4 -4
  110. package/dist/engine/renderers/webgl/candleSurface.d.ts.map +1 -1
  111. package/dist/engine/renderers/webgl/candleSurface.js +72 -60
  112. package/dist/engine/renderers/webgl/candleSurface.js.map +1 -1
  113. package/dist/engine/renderers/yAxis.d.ts.map +1 -1
  114. package/dist/engine/renderers/yAxis.js +5 -5
  115. package/dist/engine/renderers/yAxis.js.map +1 -1
  116. package/dist/engine/subPaneManager.d.ts +2 -0
  117. package/dist/engine/subPaneManager.d.ts.map +1 -1
  118. package/dist/engine/subPaneManager.js +25 -1
  119. package/dist/engine/subPaneManager.js.map +1 -1
  120. package/dist/index.d.ts +1 -0
  121. package/dist/index.d.ts.map +1 -1
  122. package/dist/index.js +1 -0
  123. package/dist/index.js.map +1 -1
  124. package/dist/plugin/types.d.ts +5 -1
  125. package/dist/plugin/types.d.ts.map +1 -1
  126. package/dist/plugin/types.js.map +1 -1
  127. package/dist/semantic/controller.d.ts +1 -2
  128. package/dist/semantic/controller.d.ts.map +1 -1
  129. package/dist/semantic/index.d.ts +1 -1
  130. package/dist/semantic/index.d.ts.map +1 -1
  131. package/dist/tokens/colorPresetSettings.d.ts +15 -0
  132. package/dist/tokens/colorPresetSettings.d.ts.map +1 -0
  133. package/dist/tokens/colorPresetSettings.js +65 -0
  134. package/dist/tokens/colorPresetSettings.js.map +1 -0
  135. package/dist/tokens/index.d.ts +17 -0
  136. package/dist/tokens/index.d.ts.map +1 -0
  137. package/dist/tokens/index.js +16 -0
  138. package/dist/tokens/index.js.map +1 -0
  139. package/dist/tokens/mergeTheme.d.ts +17 -0
  140. package/dist/tokens/mergeTheme.d.ts.map +1 -0
  141. package/dist/tokens/mergeTheme.js +43 -0
  142. package/dist/tokens/mergeTheme.js.map +1 -0
  143. package/dist/tokens/theme-china.d.ts +45 -0
  144. package/dist/tokens/theme-china.d.ts.map +1 -0
  145. package/dist/tokens/theme-china.js +116 -0
  146. package/dist/tokens/theme-china.js.map +1 -0
  147. package/dist/tokens/theme-dark.d.ts +21 -0
  148. package/dist/tokens/theme-dark.d.ts.map +1 -0
  149. package/dist/tokens/theme-dark.js +228 -0
  150. package/dist/tokens/theme-dark.js.map +1 -0
  151. package/dist/tokens/theme-light.d.ts +23 -0
  152. package/dist/tokens/theme-light.d.ts.map +1 -0
  153. package/dist/tokens/theme-light.js +234 -0
  154. package/dist/tokens/theme-light.js.map +1 -0
  155. package/dist/tokens/themeToCssVars.d.ts +74 -0
  156. package/dist/tokens/themeToCssVars.d.ts.map +1 -0
  157. package/dist/tokens/themeToCssVars.js +108 -0
  158. package/dist/tokens/themeToCssVars.js.map +1 -0
  159. package/dist/tokens/types.d.ts +335 -0
  160. package/dist/tokens/types.d.ts.map +1 -0
  161. package/dist/tokens/types.js +20 -0
  162. package/dist/tokens/types.js.map +1 -0
  163. package/dist/utils/kLineDraw/axis.d.ts +8 -7
  164. package/dist/utils/kLineDraw/axis.d.ts.map +1 -1
  165. package/dist/utils/kLineDraw/axis.js +24 -24
  166. package/dist/utils/kLineDraw/axis.js.map +1 -1
  167. package/dist/version.d.ts +1 -1
  168. package/dist/version.js +1 -1
  169. package/package.json +6 -6
  170. package/src/config/chartSettings.ts +11 -2
  171. package/src/controllers/createChartController.ts +158 -29
  172. package/src/controllers/index.ts +33 -0
  173. package/src/controllers/types.ts +79 -8
  174. package/src/engine/chart.ts +32 -37
  175. package/src/engine/controller/interaction.ts +9 -2
  176. package/src/engine/draw/pixelAlign.ts +0 -2
  177. package/src/engine/drawing/interaction.ts +38 -47
  178. package/src/engine/drawing/plugin.ts +1 -1
  179. package/src/engine/renderers/Indicator/atr.ts +7 -3
  180. package/src/engine/renderers/Indicator/boll.ts +12 -12
  181. package/src/engine/renderers/Indicator/cci.ts +11 -10
  182. package/src/engine/renderers/Indicator/ene.ts +12 -12
  183. package/src/engine/renderers/Indicator/expma.ts +6 -6
  184. package/src/engine/renderers/Indicator/fastk.ts +9 -8
  185. package/src/engine/renderers/Indicator/kst.ts +12 -11
  186. package/src/engine/renderers/Indicator/ma.ts +5 -5
  187. package/src/engine/renderers/Indicator/macd.ts +27 -25
  188. package/src/engine/renderers/Indicator/macdLegend.ts +6 -6
  189. package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +16 -16
  190. package/src/engine/renderers/Indicator/mom.ts +11 -10
  191. package/src/engine/renderers/Indicator/rsi.ts +18 -15
  192. package/src/engine/renderers/Indicator/scale/indicator_scale.ts +6 -6
  193. package/src/engine/renderers/Indicator/stoch.ts +12 -11
  194. package/src/engine/renderers/Indicator/structure.ts +5 -5
  195. package/src/engine/renderers/Indicator/wmsr.ts +13 -12
  196. package/src/engine/renderers/Indicator/zones.ts +7 -7
  197. package/src/engine/renderers/candle.ts +21 -21
  198. package/src/engine/renderers/crosshair.ts +3 -3
  199. package/src/engine/renderers/extremaMarkers.ts +13 -12
  200. package/src/engine/renderers/gridLines.ts +3 -3
  201. package/src/engine/renderers/lastPrice.ts +7 -7
  202. package/src/engine/renderers/paneTitle.ts +22 -31
  203. package/src/engine/renderers/subVolume.ts +23 -20
  204. package/src/engine/renderers/timeAxis.ts +9 -9
  205. package/src/engine/renderers/webgl/candleSurface.ts +80 -60
  206. package/src/engine/renderers/yAxis.ts +6 -5
  207. package/src/engine/subPaneManager.ts +28 -1
  208. package/src/index.ts +1 -0
  209. package/src/plugin/types.ts +5 -1
  210. package/src/semantic/controller.ts +1 -1
  211. package/src/semantic/index.ts +1 -1
  212. package/src/tokens/__tests__/__snapshots__/baseline.test.ts.snap +393 -0
  213. package/src/tokens/__tests__/baseline.test.ts +183 -0
  214. package/src/tokens/__tests__/themeToCssVars.test.ts +175 -0
  215. package/src/tokens/__tests__/tokens.test.ts +215 -0
  216. package/src/tokens/colorPresetSettings.ts +128 -0
  217. package/src/tokens/index.ts +65 -0
  218. package/src/tokens/mergeTheme.ts +48 -0
  219. package/src/tokens/theme-china.ts +132 -0
  220. package/src/tokens/theme-dark.ts +244 -0
  221. package/src/tokens/theme-light.ts +250 -0
  222. package/src/tokens/themeToCssVars.ts +138 -0
  223. package/src/tokens/types.ts +394 -0
  224. package/src/utils/kLineDraw/axis.ts +31 -30
  225. package/src/version.ts +1 -1
  226. package/dist/engine/chart-store.d.ts +0 -75
  227. package/dist/engine/chart-store.d.ts.map +0 -1
  228. package/dist/engine/chart-store.js +0 -88
  229. package/dist/engine/chart-store.js.map +0 -1
  230. package/dist/engine/theme/colors.d.ts +0 -223
  231. package/dist/engine/theme/colors.d.ts.map +0 -1
  232. package/dist/engine/theme/colors.js +0 -375
  233. package/dist/engine/theme/colors.js.map +0 -1
  234. package/src/engine/chart-store.ts +0 -121
  235. package/src/engine/theme/colors.ts +0 -642
@@ -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
  }
@@ -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()
@@ -251,13 +251,13 @@ const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = co
251
251
  if (enableWebGL && lineWebGLSurface?.isAvailable()) {
252
252
  const lines: Array<{ points: LinePoint[]; width: number; color: string }> = []
253
253
  if (params.showRSI1 && cachedRSI1Points.length >= 2) {
254
- lines.push({ points: cachedRSI1Points, width: 1, color: colors.RSI.RSI1 })
254
+ lines.push({ points: cachedRSI1Points, width: 1, color: colors.rsi.rsi1 })
255
255
  }
256
256
  if (params.showRSI2 && cachedRSI2Points.length >= 2) {
257
- lines.push({ points: cachedRSI2Points, width: 1, color: colors.RSI.RSI2 })
257
+ lines.push({ points: cachedRSI2Points, width: 1, color: colors.rsi.rsi2 })
258
258
  }
259
259
  if (params.showRSI3 && cachedRSI3Points.length >= 2) {
260
- lines.push({ points: cachedRSI3Points, width: 1, color: colors.RSI.RSI3 })
260
+ lines.push({ points: cachedRSI3Points, width: 1, color: colors.rsi.rsi3 })
261
261
  }
262
262
 
263
263
  const allOk = lines.length > 0 && lineWebGLSurface.drawLineStrips(lines, scrollLeft)
@@ -269,7 +269,7 @@ const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = co
269
269
  }
270
270
 
271
271
  if (!usedWebGL) {
272
- drawRSILinesWithCanvas2D(ctx, scrollLeft, cachedRSI1Points, cachedRSI2Points, cachedRSI3Points, params, colors)
272
+ drawRSILinesWithCanvas2D(ctx, scrollLeft, cachedRSI1Points, cachedRSI2Points, cachedRSI3Points, params, colors.rsi.rsi1, colors.rsi.rsi2, colors.rsi.rsi3)
273
273
  }
274
274
  },
275
275
 
@@ -297,7 +297,9 @@ export function drawRSILinesWithCanvas2D(
297
297
  rsi2Points: LinePoint[],
298
298
  rsi3Points: LinePoint[],
299
299
  params: { showRSI1: boolean; showRSI2: boolean; showRSI3: boolean },
300
- colors: ThemeColors
300
+ rsi1Color: string,
301
+ rsi2Color: string,
302
+ rsi3Color: string
301
303
  ): void {
302
304
  ctx.save()
303
305
  ctx.translate(-scrollLeft, 0)
@@ -306,7 +308,7 @@ export function drawRSILinesWithCanvas2D(
306
308
  ctx.lineCap = 'round'
307
309
 
308
310
  if (params.showRSI1 && rsi1Points.length >= 2) {
309
- ctx.strokeStyle = colors.RSI.RSI1
311
+ ctx.strokeStyle = rsi1Color
310
312
  ctx.beginPath()
311
313
  ctx.moveTo(rsi1Points[0]!.x, rsi1Points[0]!.y)
312
314
  for (let i = 1; i < rsi1Points.length; i++) {
@@ -317,7 +319,7 @@ export function drawRSILinesWithCanvas2D(
317
319
  }
318
320
 
319
321
  if (params.showRSI2 && rsi2Points.length >= 2) {
320
- ctx.strokeStyle = colors.RSI.RSI2
322
+ ctx.strokeStyle = rsi2Color
321
323
  ctx.beginPath()
322
324
  ctx.moveTo(rsi2Points[0]!.x, rsi2Points[0]!.y)
323
325
  for (let i = 1; i < rsi2Points.length; i++) {
@@ -328,7 +330,7 @@ export function drawRSILinesWithCanvas2D(
328
330
  }
329
331
 
330
332
  if (params.showRSI3 && rsi3Points.length >= 2) {
331
- ctx.strokeStyle = colors.RSI.RSI3
333
+ ctx.strokeStyle = rsi3Color
332
334
  ctx.beginPath()
333
335
  ctx.moveTo(rsi3Points[0]!.x, rsi3Points[0]!.y)
334
336
  for (let i = 1; i < rsi3Points.length; i++) {
@@ -348,9 +350,10 @@ export function getRSITitleInfo(
348
350
  period3: number,
349
351
  pluginHost: PluginHost,
350
352
  paneId: string = 'sub_RSI',
351
- theme: ChartTheme = 'light'
353
+ theme: 'light' | 'dark' = 'light',
354
+ isAsiaMarket?: boolean
352
355
  ): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
353
- const colors = getColors(theme)
356
+ const colors = resolveThemeColors(theme, isAsiaMarket)
354
357
  const stateKey = createRSIStateKey(paneId)
355
358
  const state = pluginHost.getSharedState<RSIRenderState>(stateKey)
356
359
 
@@ -361,9 +364,9 @@ export function getRSITitleInfo(
361
364
  const rsi3 = state.series[period3]?.[index]
362
365
 
363
366
  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 })
367
+ if (rsi1 !== undefined) values.push({ label: `RSI${period1}`, value: rsi1, color: colors.rsi.rsi1 })
368
+ if (rsi2 !== undefined) values.push({ label: `RSI${period2}`, value: rsi2, color: colors.rsi.rsi2 })
369
+ if (rsi3 !== undefined) values.push({ label: `RSI${period3}`, value: rsi3, color: colors.rsi.rsi3 })
367
370
 
368
371
  if (values.length === 0) return null
369
372
 
@@ -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
+ }