@363045841yyt/klinechart-core 0.8.7 → 0.8.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 (60) hide show
  1. package/dist/config/chartSettings.d.ts +2 -5
  2. package/dist/config/chartSettings.d.ts.map +1 -1
  3. package/dist/config/chartSettings.js +1 -2
  4. package/dist/config/chartSettings.js.map +1 -1
  5. package/dist/controllers/createChartController.d.ts.map +1 -1
  6. package/dist/controllers/createChartController.js +7 -0
  7. package/dist/controllers/createChartController.js.map +1 -1
  8. package/dist/controllers/types.d.ts +2 -0
  9. package/dist/controllers/types.d.ts.map +1 -1
  10. package/dist/engine/chart.d.ts +3 -0
  11. package/dist/engine/chart.d.ts.map +1 -1
  12. package/dist/engine/chart.js +9 -3
  13. package/dist/engine/chart.js.map +1 -1
  14. package/dist/engine/controller/interaction.js +1 -1
  15. package/dist/engine/controller/interaction.js.map +1 -1
  16. package/dist/engine/data/chartDataManager.d.ts +1 -3
  17. package/dist/engine/data/chartDataManager.d.ts.map +1 -1
  18. package/dist/engine/data/chartDataManager.js +27 -38
  19. package/dist/engine/data/chartDataManager.js.map +1 -1
  20. package/dist/engine/render/chartRenderer.d.ts.map +1 -1
  21. package/dist/engine/render/chartRenderer.js +26 -1
  22. package/dist/engine/render/chartRenderer.js.map +1 -1
  23. package/dist/engine/renderers/gridLines.d.ts.map +1 -1
  24. package/dist/engine/renderers/gridLines.js +7 -35
  25. package/dist/engine/renderers/gridLines.js.map +1 -1
  26. package/dist/engine/renderers/leftYAxis.d.ts.map +1 -1
  27. package/dist/engine/renderers/leftYAxis.js +32 -20
  28. package/dist/engine/renderers/leftYAxis.js.map +1 -1
  29. package/dist/engine/renderers/yAxis.d.ts.map +1 -1
  30. package/dist/engine/renderers/yAxis.js +16 -22
  31. package/dist/engine/renderers/yAxis.js.map +1 -1
  32. package/dist/engine/utils/tickPosition.d.ts +12 -0
  33. package/dist/engine/utils/tickPosition.d.ts.map +1 -1
  34. package/dist/engine/utils/tickPosition.js +15 -0
  35. package/dist/engine/utils/tickPosition.js.map +1 -1
  36. package/dist/engine/viewport/chartViewportManager.d.ts +0 -4
  37. package/dist/engine/viewport/chartViewportManager.d.ts.map +1 -1
  38. package/dist/engine/viewport/chartViewportManager.js +4 -8
  39. package/dist/engine/viewport/chartViewportManager.js.map +1 -1
  40. package/dist/plugin/types.d.ts +9 -0
  41. package/dist/plugin/types.d.ts.map +1 -1
  42. package/dist/plugin/types.js.map +1 -1
  43. package/dist/version.d.ts +1 -1
  44. package/dist/version.js +1 -1
  45. package/package.json +1 -1
  46. package/src/config/chartSettings.ts +1 -2
  47. package/src/controllers/createChartController.ts +7 -0
  48. package/src/controllers/types.ts +2 -0
  49. package/src/engine/chart.ts +11 -3
  50. package/src/engine/controller/interaction.ts +1 -1
  51. package/src/engine/data/chartDataManager.ts +28 -40
  52. package/src/engine/render/chartRenderer.ts +27 -2
  53. package/src/engine/renderers/__tests__/yAxis.renderer.test.ts +30 -26
  54. package/src/engine/renderers/gridLines.ts +7 -36
  55. package/src/engine/renderers/leftYAxis.ts +37 -21
  56. package/src/engine/renderers/yAxis.ts +19 -23
  57. package/src/engine/utils/tickPosition.ts +34 -0
  58. package/src/engine/viewport/chartViewportManager.ts +5 -10
  59. package/src/plugin/types.ts +10 -0
  60. package/src/version.ts +1 -1
@@ -1,11 +1,11 @@
1
1
  import type { RendererPlugin, RenderContext } from '../../plugin'
2
2
  import { RENDERER_PRIORITY, GLOBAL_PANE_ID } from '../../plugin'
3
3
  import { drawCrosshairPriceLabel, drawAxisPriceLabel } from '../../utils/kLineDraw/axis'
4
- import { drawScaleTicks } from '../renderers/Indicator/scale/indicator_scale'
5
4
  import { resolveThemeColors } from '../../tokens'
5
+ import { getFont, setCanvasFont } from '../theme/fonts'
6
+ import { roundToPhysicalPixel } from '../draw/pixelAlign'
6
7
 
7
8
  import type { KLineData } from '../../types/price'
8
- import type { ScaleType } from '../utils/tickPosition'
9
9
 
10
10
  /**
11
11
  * 创建 Y 轴渲染器插件
@@ -42,32 +42,28 @@ export function createYAxisRendererPlugin(options: {
42
42
 
43
43
  const isPercent = scaleType === 'percent' && pane.role === 'price'
44
44
 
45
- if (pane.capabilities.showPriceAxisTicks) {
46
- const tickValueMin = isPercent ? pane.yAxis.getDisplayPercentRange().minPct : displayRange.minPrice
47
- const tickValueMax = isPercent ? pane.yAxis.getDisplayPercentRange().maxPct : displayRange.maxPrice
48
- const formatLabel = isPercent
45
+ if (pane.capabilities.showPriceAxisTicks && context.yAxisTicks) {
46
+ targetCtx.clearRect(0, 0, axisWidth, pane.height)
47
+
48
+ const font = getFont(12)
49
+ setCanvasFont(targetCtx, font)
50
+ targetCtx.textBaseline = 'middle'
51
+ targetCtx.textAlign = 'center'
52
+ targetCtx.fillStyle = tokenColors.text.secondary
53
+
54
+ const format = isPercent
49
55
  ? (v: number) => {
50
56
  const sign = v >= 0 ? '+' : ''
51
57
  return sign + v.toFixed(2) + '%'
52
58
  }
53
- : undefined
59
+ : (v: number) => v.toFixed(2)
54
60
 
55
- drawScaleTicks({
56
- tickColor: tokenColors.text.secondary,
57
- ctx: targetCtx,
58
- dpr,
59
- axisWidth,
60
- height: pane.height,
61
- paddingTop: pane.yAxis.getPaddingTop(),
62
- paddingBottom: pane.yAxis.getPaddingBottom(),
63
- valueMin: tickValueMin,
64
- valueMax: tickValueMax,
65
- isMain: true,
66
- decimals: 2,
67
- hideEdgeTicks: false,
68
- scaleType: isPercent ? 'percent' : scaleType,
69
- formatLabel,
70
- })
61
+ const textX = roundToPhysicalPixel(axisWidth / 2, dpr)
62
+
63
+ for (const tick of context.yAxisTicks) {
64
+ const displayValue = isPercent ? pane.yAxis.toPercent(tick.value) : tick.value
65
+ targetCtx.fillText(format(displayValue), textX, tick.y)
66
+ }
71
67
  }
72
68
 
73
69
  // 绘制价格范围带(先于标签,使标签覆盖在范围带之上)
@@ -206,6 +206,40 @@ function generatePixelUniformPercentTicks(options: {
206
206
  return positions
207
207
  }
208
208
 
209
+ /**
210
+ * 计算均匀像素 Y 位置的值(统一像素反算)
211
+ * 所有刻度类型都先确定像素均匀 Y 位置,再通过 yToPrice 反算该位置的值
212
+ */
213
+ export interface UniformPixelTick {
214
+ y: number
215
+ value: number
216
+ }
217
+
218
+ /**
219
+ * 在给定 Y 像素位置,按指定刻度类型反算价格/值
220
+ */
221
+ export function priceAtYForScaleType(
222
+ y: number,
223
+ valueMin: number,
224
+ valueMax: number,
225
+ scaleType: ScaleType,
226
+ height: number,
227
+ paddingTop: number,
228
+ paddingBottom: number,
229
+ ): number {
230
+ const viewH = Math.max(1, height - paddingTop - paddingBottom)
231
+ const ratio = 1 - (y - paddingTop) / viewH
232
+
233
+ if (scaleType === 'log') {
234
+ if (valueMin <= 0 || valueMax <= 0) return valueMin + ratio * (valueMax - valueMin)
235
+ const logMin = Math.log(valueMin)
236
+ const logMax = Math.log(valueMax)
237
+ return Math.exp(logMin + ratio * (logMax - logMin))
238
+ }
239
+
240
+ return valueMin + ratio * (valueMax - valueMin)
241
+ }
242
+
209
243
  // calculateValueTickPositions 缓存
210
244
  let _cvtpCacheKey = ''
211
245
  let _cvtpCacheResult: TickPositionWithValue[] = []
@@ -95,16 +95,6 @@ export class ChartViewportManager {
95
95
  this._pendingScrollLeft = v
96
96
  }
97
97
 
98
- /** 仅设置缓存 scrollLeft(由 DataManager 内部使用) */
99
- setCachedScrollLeft(v: number): void {
100
- this.cachedScrollLeft = v
101
- }
102
-
103
- /** 仅设置待写入 scrollLeft(由 DataManager 内部使用) */
104
- setPendingScrollLeft(v: number): void {
105
- this._pendingScrollLeft = v
106
- }
107
-
108
98
  /** 在 RAF 回调中应用待写入的 scrollLeft */
109
99
  applyPendingScrollLeft(container: HTMLElement): void {
110
100
  if (this._pendingScrollLeft !== null) {
@@ -298,6 +288,11 @@ export class ChartViewportManager {
298
288
  this.observedSize.width = cssWidth
299
289
  this.observedSize.height = cssHeight
300
290
 
291
+ if (this.cachedScrollLeft === 0 && cssWidth > 0) {
292
+ this.cachedScrollLeft = cssWidth
293
+ this._pendingScrollLeft = cssWidth
294
+ }
295
+
301
296
  const pixelSize = entry.devicePixelContentBoxSize?.[0]
302
297
  const cssSize = entry.contentBoxSize?.[0]
303
298
  if (!pixelSize || !cssSize || cssSize.inlineSize <= 0) {
@@ -262,6 +262,14 @@ export interface XAxisRange {
262
262
  opacity: number
263
263
  }
264
264
 
265
+ /** Y轴刻度(位置+值),由 RenderContext 构建时预计算,所有 Y 轴渲染器共用 */
266
+ export interface YAxisTick {
267
+ /** Y像素位置(相对 pane 顶部,逻辑像素) */
268
+ y: number
269
+ /** 该Y位置通过 pane.yAxis.yToPrice 反算的价格值 */
270
+ value: number
271
+ }
272
+
265
273
  /** 渲染上下文 */
266
274
  /** MarkerManager 接口(用于 RenderContext) */
267
275
  export interface MarkerManagerLike {
@@ -328,6 +336,8 @@ export interface RenderContext {
328
336
  isAsiaMarket?: boolean
329
337
  /** 用户颜色预设覆盖项 */
330
338
  colorPresetSettings?: import('../tokens').ColorPresetSettings
339
+ /** 预计算的 Y 轴刻度列表(统一像素均匀分布 → yToPrice 反算),所有 Y 轴渲染器共用 */
340
+ yAxisTicks?: YAxisTick[]
331
341
  }
332
342
 
333
343
  export type DrawingAnchor = {
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const VERSION = "0.8.7"
1
+ export const VERSION = "0.8.8"