@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.
- package/dist/config/chartSettings.d.ts +2 -5
- package/dist/config/chartSettings.d.ts.map +1 -1
- package/dist/config/chartSettings.js +1 -2
- package/dist/config/chartSettings.js.map +1 -1
- package/dist/controllers/createChartController.d.ts.map +1 -1
- package/dist/controllers/createChartController.js +7 -0
- package/dist/controllers/createChartController.js.map +1 -1
- package/dist/controllers/types.d.ts +2 -0
- package/dist/controllers/types.d.ts.map +1 -1
- package/dist/engine/chart.d.ts +3 -0
- package/dist/engine/chart.d.ts.map +1 -1
- package/dist/engine/chart.js +9 -3
- package/dist/engine/chart.js.map +1 -1
- package/dist/engine/controller/interaction.js +1 -1
- package/dist/engine/controller/interaction.js.map +1 -1
- package/dist/engine/data/chartDataManager.d.ts +1 -3
- package/dist/engine/data/chartDataManager.d.ts.map +1 -1
- package/dist/engine/data/chartDataManager.js +27 -38
- package/dist/engine/data/chartDataManager.js.map +1 -1
- package/dist/engine/render/chartRenderer.d.ts.map +1 -1
- package/dist/engine/render/chartRenderer.js +26 -1
- package/dist/engine/render/chartRenderer.js.map +1 -1
- package/dist/engine/renderers/gridLines.d.ts.map +1 -1
- package/dist/engine/renderers/gridLines.js +7 -35
- package/dist/engine/renderers/gridLines.js.map +1 -1
- package/dist/engine/renderers/leftYAxis.d.ts.map +1 -1
- package/dist/engine/renderers/leftYAxis.js +32 -20
- package/dist/engine/renderers/leftYAxis.js.map +1 -1
- package/dist/engine/renderers/yAxis.d.ts.map +1 -1
- package/dist/engine/renderers/yAxis.js +16 -22
- package/dist/engine/renderers/yAxis.js.map +1 -1
- package/dist/engine/utils/tickPosition.d.ts +12 -0
- package/dist/engine/utils/tickPosition.d.ts.map +1 -1
- package/dist/engine/utils/tickPosition.js +15 -0
- package/dist/engine/utils/tickPosition.js.map +1 -1
- package/dist/engine/viewport/chartViewportManager.d.ts +0 -4
- package/dist/engine/viewport/chartViewportManager.d.ts.map +1 -1
- package/dist/engine/viewport/chartViewportManager.js +4 -8
- package/dist/engine/viewport/chartViewportManager.js.map +1 -1
- package/dist/plugin/types.d.ts +9 -0
- package/dist/plugin/types.d.ts.map +1 -1
- package/dist/plugin/types.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/src/config/chartSettings.ts +1 -2
- package/src/controllers/createChartController.ts +7 -0
- package/src/controllers/types.ts +2 -0
- package/src/engine/chart.ts +11 -3
- package/src/engine/controller/interaction.ts +1 -1
- package/src/engine/data/chartDataManager.ts +28 -40
- package/src/engine/render/chartRenderer.ts +27 -2
- package/src/engine/renderers/__tests__/yAxis.renderer.test.ts +30 -26
- package/src/engine/renderers/gridLines.ts +7 -36
- package/src/engine/renderers/leftYAxis.ts +37 -21
- package/src/engine/renderers/yAxis.ts +19 -23
- package/src/engine/utils/tickPosition.ts +34 -0
- package/src/engine/viewport/chartViewportManager.ts +5 -10
- package/src/plugin/types.ts +10 -0
- 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
|
-
|
|
47
|
-
|
|
48
|
-
const
|
|
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
|
-
:
|
|
59
|
+
: (v: number) => v.toFixed(2)
|
|
54
60
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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) {
|
package/src/plugin/types.ts
CHANGED
|
@@ -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.
|
|
1
|
+
export const VERSION = "0.8.8"
|