@visactor/vgrammar-core 0.8.2 → 0.8.3-alpha.0

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 (59) hide show
  1. package/cjs/graph/canvas-renderer.d.ts +1 -0
  2. package/cjs/graph/canvas-renderer.js +6 -2
  3. package/cjs/graph/canvas-renderer.js.map +1 -1
  4. package/cjs/index.d.ts +1 -1
  5. package/cjs/index.js +1 -1
  6. package/cjs/index.js.map +1 -1
  7. package/cjs/types/renderer.d.ts +1 -0
  8. package/cjs/types/renderer.js.map +1 -1
  9. package/cjs/types/view.d.ts +1 -0
  10. package/cjs/types/view.js.map +1 -1
  11. package/cjs/util/grammar-heap.js +1 -1
  12. package/cjs/util/grammar-heap.js.map +1 -1
  13. package/cjs/view/View.d.ts +2 -0
  14. package/cjs/view/View.js +40 -28
  15. package/cjs/view/View.js.map +1 -1
  16. package/cjs/view/dataflow.d.ts +1 -0
  17. package/cjs/view/dataflow.js +7 -5
  18. package/cjs/view/dataflow.js.map +1 -1
  19. package/cjs/view/mark.js +2 -2
  20. package/cjs/view/mark.js.map +1 -1
  21. package/es/graph/canvas-renderer.d.ts +1 -0
  22. package/es/graph/canvas-renderer.js +6 -2
  23. package/es/graph/canvas-renderer.js.map +1 -1
  24. package/es/index.d.ts +1 -1
  25. package/es/index.js +1 -1
  26. package/es/index.js.map +1 -1
  27. package/es/interactions/brush-filter.js +2 -1
  28. package/es/interactions/element-highlight-by-group.js +1 -2
  29. package/es/interactions/index.js +2 -1
  30. package/es/interactions/legend-filter.js +1 -1
  31. package/es/interactions/player-filter.js +1 -1
  32. package/es/interactions/roll-up.js +1 -1
  33. package/es/interactions/scrollbar-filter.js +1 -1
  34. package/es/interactions/slider-filter.js +1 -1
  35. package/es/interactions/tooltip.js +1 -1
  36. package/es/interactions/view-drag-mixin.js +1 -1
  37. package/es/parse/coordinate.js +1 -1
  38. package/es/parse/event.js +1 -1
  39. package/es/parse/mark.js +1 -1
  40. package/es/parse/option.js +1 -1
  41. package/es/parse/scale.js +1 -2
  42. package/es/parse/transform.js +1 -1
  43. package/es/parse/util.js +1 -1
  44. package/es/parse/view.js +1 -1
  45. package/es/types/renderer.d.ts +1 -0
  46. package/es/types/renderer.js.map +1 -1
  47. package/es/types/view.d.ts +1 -0
  48. package/es/types/view.js.map +1 -1
  49. package/es/util/grammar-heap.js +1 -1
  50. package/es/util/grammar-heap.js.map +1 -1
  51. package/es/view/View.d.ts +2 -0
  52. package/es/view/View.js +41 -28
  53. package/es/view/View.js.map +1 -1
  54. package/es/view/dataflow.d.ts +1 -0
  55. package/es/view/dataflow.js +7 -5
  56. package/es/view/dataflow.js.map +1 -1
  57. package/es/view/mark.js +2 -2
  58. package/es/view/mark.js.map +1 -1
  59. package/package.json +11 -11
package/es/parse/util.js CHANGED
@@ -62,4 +62,4 @@ export const isGrammar = el => el && !isNil(el.grammarType);
62
62
  export const parseField = field => isFunction(field) ? field : datum => datum[field];
63
63
 
64
64
  export const parseColor = color => isString(color) && Color.parseColorString(color) ? color : null;
65
- //# sourceMappingURL=util.js.map
65
+ //# sourceMappingURL=util.js.map
package/es/parse/view.js CHANGED
@@ -95,4 +95,4 @@ export const normalizeRunningConfig = runningConfig => {
95
95
  enableExitAnimation: null !== (_p = null == runningConfig ? void 0 : runningConfig.enableExitAnimation) && void 0 !== _p ? _p : DefaultEnableExitAnimation
96
96
  };
97
97
  };
98
- //# sourceMappingURL=view.js.map
98
+ //# sourceMappingURL=view.js.map
@@ -8,6 +8,7 @@ export interface IRenderer {
8
8
  resize: (width: number, height: number) => this;
9
9
  shouldResize: (width: number, height: number) => boolean;
10
10
  combineIncrementalLayers: () => this;
11
+ preventRender: (tag: boolean) => void;
11
12
  setDpr: (resolution: number, redraw: boolean) => this;
12
13
  background: (color: IColor) => this;
13
14
  setViewBox: (viewBox: IBoundsLike, rerender: boolean) => this;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/renderer.ts"],"names":[],"mappings":"","file":"renderer.js","sourcesContent":["import type { IBoundsLike } from '@visactor/vutils';\nimport type { IColor, Stage } from '@visactor/vrender-core';\nimport type { IViewEventConfig, IViewOptions } from './view';\n\nexport interface IRenderer {\n initialize: (width: number, height: number, options: IViewOptions, eventConfig: IViewEventConfig) => this;\n\n render: (immediately?: boolean) => this;\n renderNextFrame: () => this;\n resize: (width: number, height: number) => this;\n shouldResize: (width: number, height: number) => boolean;\n combineIncrementalLayers: () => this;\n\n setDpr: (resolution: number, redraw: boolean) => this;\n background: (color: IColor) => this;\n setViewBox: (viewBox: IBoundsLike, rerender: boolean) => this;\n\n stage: () => Stage;\n canvas: () => HTMLCanvasElement;\n context: () => CanvasRenderingContext2D;\n\n toCanvas: () => HTMLCanvasElement;\n // toImageData: () => Promise<ImageData | undefined>;\n\n release: () => void;\n}\n"]}
1
+ {"version":3,"sources":["../src/types/renderer.ts"],"names":[],"mappings":"","file":"renderer.js","sourcesContent":["import type { IBoundsLike } from '@visactor/vutils';\nimport type { IColor, Stage } from '@visactor/vrender-core';\nimport type { IViewEventConfig, IViewOptions } from './view';\n\nexport interface IRenderer {\n initialize: (width: number, height: number, options: IViewOptions, eventConfig: IViewEventConfig) => this;\n\n render: (immediately?: boolean) => this;\n renderNextFrame: () => this;\n resize: (width: number, height: number) => this;\n shouldResize: (width: number, height: number) => boolean;\n combineIncrementalLayers: () => this;\n preventRender: (tag: boolean) => void;\n\n setDpr: (resolution: number, redraw: boolean) => this;\n background: (color: IColor) => this;\n setViewBox: (viewBox: IBoundsLike, rerender: boolean) => this;\n\n stage: () => Stage;\n canvas: () => HTMLCanvasElement;\n context: () => CanvasRenderingContext2D;\n\n toCanvas: () => HTMLCanvasElement;\n // toImageData: () => Promise<ImageData | undefined>;\n\n release: () => void;\n}\n"]}
@@ -107,6 +107,7 @@ export interface IView {
107
107
  addGrammar: (grammar: IGrammarBase) => this;
108
108
  removeGrammar: (grammar: string | IGrammarBase) => this;
109
109
  removeAllGrammars: () => this;
110
+ removeAllGraphicItems: () => this;
110
111
  getGrammarById: (id: string) => IGrammarBase | null;
111
112
  getCustomizedById: (id: string) => IGrammarBase | null;
112
113
  getSignalById: <T>(id: string) => ISignal<T> | null;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/view.ts"],"names":[],"mappings":"","file":"view.js","sourcesContent":["import type { EventEmitter, IBounds, ILogger } from '@visactor/vutils';\nimport type { EnvType, IStage, IColor, IOption3D, ILayer, IStageParams } from '@visactor/vrender-core';\nimport type { CoordinateType } from '@visactor/vgrammar-coordinate';\nimport type { DataSpec } from './data';\nimport type { SignalFunctionType, SignalSpec } from './signal';\nimport type {\n IData,\n ISignal,\n IScale,\n IMark,\n IGrammarBase,\n ICoordinate,\n IGlyphMark,\n IGroupMark,\n IComponent\n} from './grammar';\nimport type { ScaleSpec, GrammarScaleType } from './scale';\nimport type { MarkSpec, MarkType } from './mark';\nimport type { Hooks } from './hooks';\nimport type { ProjectionSpec } from './projection';\nimport type { BaseEventHandler, EventSpec } from './event';\nimport type { CommonPaddingSpec } from './base';\nimport type { IMorphAnimationConfig } from './morph';\nimport type { IBaseAnimate } from './animate';\nimport type { IRenderer } from './renderer';\nimport type { IAxis, IDatazoom, IGrid, ILabel, ILegend, IPlayer, IScrollbar, ISlider, ITitle } from './component';\nimport type { CoordinateSpec } from './coordinate';\nimport type { ITheme } from './theme';\nimport type { IInteraction, InteractionSpec } from './interaction';\n\nexport interface IViewThemeConfig {\n labelMonospace?: boolean;\n}\n\n/**\n * 获取state相关配置\n */\nexport interface IViewStateOptions {\n signals?: (name?: string, operator?: any) => boolean;\n data?: (name?: string, object?: any) => boolean;\n recurse?: boolean;\n}\n\nexport interface IEnvironmentOptions {\n /** 环境参数 */\n mode?: EnvType;\n /**\n * 环境带的配置\n */\n modeParams?: any;\n}\n\nexport interface IRendererOptions extends Partial<IStageParams> {\n /** 非浏览器环境下,如小程序,需要传入经过包装的伪 canvas 实例 */\n renderCanvas?: string | HTMLCanvasElement;\n /** vRender stage */\n stage?: IStage;\n rendererTitle?: string;\n /** vRender layer */\n layer?: ILayer;\n}\n\nexport interface ILayoutOptions {\n parseMarkBounds?: (bounds: IBounds, mark: IMark) => IBounds;\n doLayout?: (marks: IMark[], options: ILayoutOptions, view: IView) => void;\n}\n\n/** 事件配置 */\nexport interface IViewEventConfig {\n /**\n * preventDefaults相关配置\n */\n defaults?: {\n prevent?: boolean | Record<string, boolean>;\n allow?: boolean | Record<string, boolean>;\n };\n /**\n * whether permit events of view\n */\n view?: boolean | Record<string, boolean>;\n /** disable all the events */\n disable?: boolean;\n /** use gesture events or not */\n gesture?: boolean;\n /** use drag events or not */\n drag?: boolean;\n}\n\nexport interface srIOption3DType extends IOption3D {\n enable?: boolean;\n /* 是否支持3d视角变换 */\n enableView3dTranform?: boolean;\n}\nexport interface IViewOptions extends IEnvironmentOptions, IRendererOptions, ILayoutOptions {\n width?: number;\n height?: number;\n padding?: CommonPaddingSpec;\n autoFit?: boolean;\n\n options3d?: srIOption3DType;\n /** 外部传入的logger方法 */\n logger?: ILogger;\n /**\n * 0 - None\n * 1 - Error\n * 2 - Warn\n * 3 - Info\n * 4 - Debug\n */\n logLevel?: number;\n\n /** 生命周期等事件钩子 */\n hooks?: Hooks;\n\n /**\n * 事件相关配置\n * {\n * defaults: {\n * prevent: ['mousemove', 'mouseenter']\n * }\n * }\n */\n eventConfig?: IViewEventConfig;\n background?: IColor;\n disableTheme?: boolean;\n}\n\nexport interface IRunningConfig {\n /** whether enable reusing of grammar */\n reuse?: boolean;\n /** whether enable morph */\n morph?: boolean;\n /** force all marks to participate in morphing */\n morphAll?: boolean;\n /** morphing animation config */\n animation?: IMorphAnimationConfig;\n /** whether apply exit animations for released marks */\n enableExitAnimation?: boolean;\n}\n\nexport interface IView {\n readonly renderer: IRenderer;\n readonly rootMark: IGroupMark;\n readonly animate: IBaseAnimate;\n readonly grammars: IRecordedGrammars;\n readonly logger: ILogger;\n\n // --- Grammar API ---\n signal: <T>(value?: T, update?: SignalFunctionType<T>) => ISignal<T>;\n data: (values?: any[]) => IData;\n scale: (type: GrammarScaleType) => IScale;\n coordinate: (type: CoordinateType) => ICoordinate;\n mark: (\n type: MarkType,\n group: IGroupMark | string,\n markOptions?: { glyphType?: string; componentType?: string; mode?: '2d' | '3d' }\n ) => IMark;\n group: (group: IGroupMark | string) => IGroupMark;\n glyph: (glyphType: string, group: IGroupMark | string) => IGlyphMark;\n component: (componentType: string, group: IGroupMark | string, mode?: '2d' | '3d') => IComponent;\n axis: (group: IGroupMark | string, mode?: '2d' | '3d') => IAxis;\n grid: (group: IGroupMark | string, mode?: '2d' | '3d') => IGrid;\n legend: (group: IGroupMark | string) => ILegend;\n slider: (group: IGroupMark | string) => ISlider;\n label: (group: IGroupMark | string) => ILabel;\n datazoom: (group: IGroupMark | string) => IDatazoom;\n player: (group: IGroupMark | string) => IPlayer;\n title: (group: IGroupMark | string) => ITitle;\n scrollbar: (group: IGroupMark | string) => IScrollbar;\n\n interaction: (type: string, spec: Partial<InteractionSpec>) => IInteraction;\n removeInteraction: (type: string) => this;\n removeAllInteractions: () => this;\n\n addGrammar: (grammar: IGrammarBase) => this;\n removeGrammar: (grammar: string | IGrammarBase) => this;\n removeAllGrammars: () => this;\n\n getGrammarById: (id: string) => IGrammarBase | null;\n getCustomizedById: (id: string) => IGrammarBase | null;\n getSignalById: <T>(id: string) => ISignal<T> | null;\n getDataById: (id: string) => IData | null;\n getScaleById: (id: string) => IScale | null;\n getCoordinateById: (id: string) => ICoordinate | null;\n getMarkById: (id: string) => IMark | null;\n getGrammarsByName: (name: string) => IGrammarBase[];\n getGrammarsByType: (grammarType: string) => IGrammarBase[];\n getMarksByType: (markType: string) => IMark[];\n getMarksByName: (name: string) => IMark[] | null;\n getMarksBySelector: (selector: string | string[] | IMark | IMark[]) => IMark[] | null;\n\n commit: (grammar: IGrammarBase) => this;\n\n // --- Spec API ---\n parseSpec: (spec: ViewSpec) => this;\n updateSpec: (spec: ViewSpec) => this;\n\n // --- Evaluate API ---\n run: (runningConfig?: IRunningConfig) => this;\n runNextTick: (runningConfig?: IRunningConfig) => Promise<this>;\n runAsync: (runningConfig?: IRunningConfig) => Promise<this>;\n runSync: (runningConfig?: IRunningConfig) => this;\n runBefore: (callback: (view: IView) => void) => this;\n runAfter: (callback: (view: IView) => void) => this;\n\n // --- Theme API ---\n theme: (theme: ITheme | string) => this;\n getCurrentTheme: () => ITheme;\n setCurrentTheme: (theme: ITheme | string, render?: boolean) => Promise<this>;\n\n // --- Global Config API ---\n background: (value?: IColor) => IColor;\n width: (value?: number) => number;\n height: (value?: number) => number;\n viewWidth: (value?: number) => number;\n viewHeight: (value?: number) => number;\n padding: (p?: number | { left?: number; right?: number; top?: number; bottom?: number }) => {\n left: number;\n right: number;\n top: number;\n bottom: number;\n };\n getViewBox: () => IBounds;\n\n // --- Event API ---\n addEventListener: (type: string, handler: BaseEventHandler, options?: any) => this;\n removeEventListener: (type: string, handler: BaseEventHandler) => this;\n\n // --- Other API ---\n emit: <T extends EventEmitter.EventNames<string | symbol>>(\n event: T,\n ...args: EventEmitter.EventArgs<string | symbol, T>\n ) => boolean;\n\n resize: (width: number, height: number, render?: boolean) => Promise<this>;\n traverseMarkTree: (apply: (mark: IMark) => any, filter?: (mark: IMark) => boolean, leafFirst?: boolean) => this;\n\n getLayoutState: () => string;\n updateLayoutTag: () => this;\n\n pauseProgressive: () => boolean;\n resumeProgressive: () => boolean;\n restartProgressive: () => boolean;\n\n release: () => void;\n getImageBuffer: () => Buffer;\n}\n\nexport interface IViewConstructor {\n new (options?: IViewOptions, config?: IViewThemeConfig): IView;\n}\n\nexport interface ViewSpec {\n /** 梳理详细配置 */\n theme?: string;\n background?: IColor;\n width?: number;\n height?: number;\n padding?: number | { left?: number; right?: number; top?: number; bottom?: number };\n signals?: SignalSpec<any>[];\n projections?: ProjectionSpec[];\n data?: DataSpec[];\n scales?: ScaleSpec[];\n coordinates?: CoordinateSpec[];\n marks?: MarkSpec[];\n events?: EventSpec[];\n interactions?: InteractionSpec[];\n animation?: boolean;\n}\n\nexport interface IRecordedGrammars {\n record: (grammar: IGrammarBase) => this;\n unrecord: (grammar: IGrammarBase) => this;\n\n size: () => number;\n\n getSignal: <T>(key: string) => ISignal<T> | null;\n getData: (key: string) => IData | null;\n getScale: (key: string) => IScale | null;\n getCoordinate: (key: string) => ICoordinate | null;\n getMark: (key: string) => IMark | null;\n getCustomized: (key: string) => IGrammarBase | null;\n getGrammar: (key: string) => IGrammarBase | null;\n\n getAllSignals: () => ISignal<any>[];\n getAllData: () => IData[];\n getAllScales: () => IScale[];\n getAllCoordinates: () => ICoordinate[];\n getAllMarks: () => IMark[];\n getAllCustomized: () => IGrammarBase[];\n\n clear: () => void;\n\n traverse: (func: (grammar: IGrammarBase) => boolean | void) => void;\n find: (func: (grammar: IGrammarBase) => boolean) => IGrammarBase | null;\n filter: (func: (grammar: IGrammarBase) => boolean) => IGrammarBase[];\n\n release: () => void;\n}\n\nexport interface IMarkTreeNode {\n mark: IMark;\n parent: IMarkTreeNode;\n children: IMarkTreeNode[];\n}\n\nexport interface IRecordedTreeGrammars extends IRecordedGrammars {\n getAllMarkNodes: () => IMarkTreeNode[];\n}\n"]}
1
+ {"version":3,"sources":["../src/types/view.ts"],"names":[],"mappings":"","file":"view.js","sourcesContent":["import type { EventEmitter, IBounds, ILogger } from '@visactor/vutils';\nimport type { EnvType, IStage, IColor, IOption3D, ILayer, IStageParams } from '@visactor/vrender-core';\nimport type { CoordinateType } from '@visactor/vgrammar-coordinate';\nimport type { DataSpec } from './data';\nimport type { SignalFunctionType, SignalSpec } from './signal';\nimport type {\n IData,\n ISignal,\n IScale,\n IMark,\n IGrammarBase,\n ICoordinate,\n IGlyphMark,\n IGroupMark,\n IComponent\n} from './grammar';\nimport type { ScaleSpec, GrammarScaleType } from './scale';\nimport type { MarkSpec, MarkType } from './mark';\nimport type { Hooks } from './hooks';\nimport type { ProjectionSpec } from './projection';\nimport type { BaseEventHandler, EventSpec } from './event';\nimport type { CommonPaddingSpec } from './base';\nimport type { IMorphAnimationConfig } from './morph';\nimport type { IBaseAnimate } from './animate';\nimport type { IRenderer } from './renderer';\nimport type { IAxis, IDatazoom, IGrid, ILabel, ILegend, IPlayer, IScrollbar, ISlider, ITitle } from './component';\nimport type { CoordinateSpec } from './coordinate';\nimport type { ITheme } from './theme';\nimport type { IInteraction, InteractionSpec } from './interaction';\n\nexport interface IViewThemeConfig {\n labelMonospace?: boolean;\n}\n\n/**\n * 获取state相关配置\n */\nexport interface IViewStateOptions {\n signals?: (name?: string, operator?: any) => boolean;\n data?: (name?: string, object?: any) => boolean;\n recurse?: boolean;\n}\n\nexport interface IEnvironmentOptions {\n /** 环境参数 */\n mode?: EnvType;\n /**\n * 环境带的配置\n */\n modeParams?: any;\n}\n\nexport interface IRendererOptions extends Partial<IStageParams> {\n /** 非浏览器环境下,如小程序,需要传入经过包装的伪 canvas 实例 */\n renderCanvas?: string | HTMLCanvasElement;\n /** vRender stage */\n stage?: IStage;\n rendererTitle?: string;\n /** vRender layer */\n layer?: ILayer;\n}\n\nexport interface ILayoutOptions {\n parseMarkBounds?: (bounds: IBounds, mark: IMark) => IBounds;\n doLayout?: (marks: IMark[], options: ILayoutOptions, view: IView) => void;\n}\n\n/** 事件配置 */\nexport interface IViewEventConfig {\n /**\n * preventDefaults相关配置\n */\n defaults?: {\n prevent?: boolean | Record<string, boolean>;\n allow?: boolean | Record<string, boolean>;\n };\n /**\n * whether permit events of view\n */\n view?: boolean | Record<string, boolean>;\n /** disable all the events */\n disable?: boolean;\n /** use gesture events or not */\n gesture?: boolean;\n /** use drag events or not */\n drag?: boolean;\n}\n\nexport interface srIOption3DType extends IOption3D {\n enable?: boolean;\n /* 是否支持3d视角变换 */\n enableView3dTranform?: boolean;\n}\nexport interface IViewOptions extends IEnvironmentOptions, IRendererOptions, ILayoutOptions {\n width?: number;\n height?: number;\n padding?: CommonPaddingSpec;\n autoFit?: boolean;\n\n options3d?: srIOption3DType;\n /** 外部传入的logger方法 */\n logger?: ILogger;\n /**\n * 0 - None\n * 1 - Error\n * 2 - Warn\n * 3 - Info\n * 4 - Debug\n */\n logLevel?: number;\n\n /** 生命周期等事件钩子 */\n hooks?: Hooks;\n\n /**\n * 事件相关配置\n * {\n * defaults: {\n * prevent: ['mousemove', 'mouseenter']\n * }\n * }\n */\n eventConfig?: IViewEventConfig;\n background?: IColor;\n disableTheme?: boolean;\n}\n\nexport interface IRunningConfig {\n /** whether enable reusing of grammar */\n reuse?: boolean;\n /** whether enable morph */\n morph?: boolean;\n /** force all marks to participate in morphing */\n morphAll?: boolean;\n /** morphing animation config */\n animation?: IMorphAnimationConfig;\n /** whether apply exit animations for released marks */\n enableExitAnimation?: boolean;\n}\n\nexport interface IView {\n readonly renderer: IRenderer;\n readonly rootMark: IGroupMark;\n readonly animate: IBaseAnimate;\n readonly grammars: IRecordedGrammars;\n readonly logger: ILogger;\n\n // --- Grammar API ---\n signal: <T>(value?: T, update?: SignalFunctionType<T>) => ISignal<T>;\n data: (values?: any[]) => IData;\n scale: (type: GrammarScaleType) => IScale;\n coordinate: (type: CoordinateType) => ICoordinate;\n mark: (\n type: MarkType,\n group: IGroupMark | string,\n markOptions?: { glyphType?: string; componentType?: string; mode?: '2d' | '3d' }\n ) => IMark;\n group: (group: IGroupMark | string) => IGroupMark;\n glyph: (glyphType: string, group: IGroupMark | string) => IGlyphMark;\n component: (componentType: string, group: IGroupMark | string, mode?: '2d' | '3d') => IComponent;\n axis: (group: IGroupMark | string, mode?: '2d' | '3d') => IAxis;\n grid: (group: IGroupMark | string, mode?: '2d' | '3d') => IGrid;\n legend: (group: IGroupMark | string) => ILegend;\n slider: (group: IGroupMark | string) => ISlider;\n label: (group: IGroupMark | string) => ILabel;\n datazoom: (group: IGroupMark | string) => IDatazoom;\n player: (group: IGroupMark | string) => IPlayer;\n title: (group: IGroupMark | string) => ITitle;\n scrollbar: (group: IGroupMark | string) => IScrollbar;\n\n interaction: (type: string, spec: Partial<InteractionSpec>) => IInteraction;\n removeInteraction: (type: string) => this;\n removeAllInteractions: () => this;\n\n addGrammar: (grammar: IGrammarBase) => this;\n removeGrammar: (grammar: string | IGrammarBase) => this;\n removeAllGrammars: () => this;\n removeAllGraphicItems: () => this;\n\n getGrammarById: (id: string) => IGrammarBase | null;\n getCustomizedById: (id: string) => IGrammarBase | null;\n getSignalById: <T>(id: string) => ISignal<T> | null;\n getDataById: (id: string) => IData | null;\n getScaleById: (id: string) => IScale | null;\n getCoordinateById: (id: string) => ICoordinate | null;\n getMarkById: (id: string) => IMark | null;\n getGrammarsByName: (name: string) => IGrammarBase[];\n getGrammarsByType: (grammarType: string) => IGrammarBase[];\n getMarksByType: (markType: string) => IMark[];\n getMarksByName: (name: string) => IMark[] | null;\n getMarksBySelector: (selector: string | string[] | IMark | IMark[]) => IMark[] | null;\n\n commit: (grammar: IGrammarBase) => this;\n\n // --- Spec API ---\n parseSpec: (spec: ViewSpec) => this;\n updateSpec: (spec: ViewSpec) => this;\n\n // --- Evaluate API ---\n run: (runningConfig?: IRunningConfig) => this;\n runNextTick: (runningConfig?: IRunningConfig) => Promise<this>;\n runAsync: (runningConfig?: IRunningConfig) => Promise<this>;\n runSync: (runningConfig?: IRunningConfig) => this;\n runBefore: (callback: (view: IView) => void) => this;\n runAfter: (callback: (view: IView) => void) => this;\n\n // --- Theme API ---\n theme: (theme: ITheme | string) => this;\n getCurrentTheme: () => ITheme;\n setCurrentTheme: (theme: ITheme | string, render?: boolean) => Promise<this>;\n\n // --- Global Config API ---\n background: (value?: IColor) => IColor;\n width: (value?: number) => number;\n height: (value?: number) => number;\n viewWidth: (value?: number) => number;\n viewHeight: (value?: number) => number;\n padding: (p?: number | { left?: number; right?: number; top?: number; bottom?: number }) => {\n left: number;\n right: number;\n top: number;\n bottom: number;\n };\n getViewBox: () => IBounds;\n\n // --- Event API ---\n addEventListener: (type: string, handler: BaseEventHandler, options?: any) => this;\n removeEventListener: (type: string, handler: BaseEventHandler) => this;\n\n // --- Other API ---\n emit: <T extends EventEmitter.EventNames<string | symbol>>(\n event: T,\n ...args: EventEmitter.EventArgs<string | symbol, T>\n ) => boolean;\n\n resize: (width: number, height: number, render?: boolean) => Promise<this>;\n traverseMarkTree: (apply: (mark: IMark) => any, filter?: (mark: IMark) => boolean, leafFirst?: boolean) => this;\n\n getLayoutState: () => string;\n updateLayoutTag: () => this;\n\n pauseProgressive: () => boolean;\n resumeProgressive: () => boolean;\n restartProgressive: () => boolean;\n\n release: () => void;\n getImageBuffer: () => Buffer;\n}\n\nexport interface IViewConstructor {\n new (options?: IViewOptions, config?: IViewThemeConfig): IView;\n}\n\nexport interface ViewSpec {\n /** 梳理详细配置 */\n theme?: string;\n background?: IColor;\n width?: number;\n height?: number;\n padding?: number | { left?: number; right?: number; top?: number; bottom?: number };\n signals?: SignalSpec<any>[];\n projections?: ProjectionSpec[];\n data?: DataSpec[];\n scales?: ScaleSpec[];\n coordinates?: CoordinateSpec[];\n marks?: MarkSpec[];\n events?: EventSpec[];\n interactions?: InteractionSpec[];\n animation?: boolean;\n}\n\nexport interface IRecordedGrammars {\n record: (grammar: IGrammarBase) => this;\n unrecord: (grammar: IGrammarBase) => this;\n\n size: () => number;\n\n getSignal: <T>(key: string) => ISignal<T> | null;\n getData: (key: string) => IData | null;\n getScale: (key: string) => IScale | null;\n getCoordinate: (key: string) => ICoordinate | null;\n getMark: (key: string) => IMark | null;\n getCustomized: (key: string) => IGrammarBase | null;\n getGrammar: (key: string) => IGrammarBase | null;\n\n getAllSignals: () => ISignal<any>[];\n getAllData: () => IData[];\n getAllScales: () => IScale[];\n getAllCoordinates: () => ICoordinate[];\n getAllMarks: () => IMark[];\n getAllCustomized: () => IGrammarBase[];\n\n clear: () => void;\n\n traverse: (func: (grammar: IGrammarBase) => boolean | void) => void;\n find: (func: (grammar: IGrammarBase) => boolean) => IGrammarBase | null;\n filter: (func: (grammar: IGrammarBase) => boolean) => IGrammarBase[];\n\n release: () => void;\n}\n\nexport interface IMarkTreeNode {\n mark: IMark;\n parent: IMarkTreeNode;\n children: IMarkTreeNode[];\n}\n\nexport interface IRecordedTreeGrammars extends IRecordedGrammars {\n getAllMarkNodes: () => IMarkTreeNode[];\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  function moveToHead(array, idx, start, cmp) {
2
2
  let parent, pidx;
3
3
  const item = array[idx];
4
- for (;idx > start && (pidx = Math.floor((idx - 1) / 2), parent = array[pidx], cmp(item, parent) < 0); ) array[idx] = parent,
4
+ for (;idx > start && (pidx = Math.floor((idx - 1) / 2), parent = array[pidx], item && parent && cmp(item, parent) < 0); ) array[idx] = parent,
5
5
  idx = pidx;
6
6
  return array[idx] = item;
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/util/grammar-heap.ts"],"names":[],"mappings":"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","file":"grammar-heap.js","sourcesContent":["type CompareFunc = (a: any, b: any) => number;\n\n/**\n * moveToHead - Moves an element down the array until the target element is `smallar` than all the elements in head\n *\n * @param {any[]} array - The array to sift through\n * @param {number} start - The start index of the element\n * @param {number} idx - The index of the element to sift down\n * @param {CompareFunc} cmp - The function used to compare elements in the array\n * @returns {any[]} - The updated array with the sifted element in the correct position\n */\nfunction moveToHead(array: any[], idx: number, start: number, cmp: CompareFunc) {\n let parent;\n let pidx;\n\n const item = array[idx];\n // Move the element down the array\n while (idx > start) {\n pidx = Math.floor((idx - 1) / 2);\n parent = array[pidx];\n if (cmp(item, parent) < 0) {\n array[idx] = parent;\n idx = pidx;\n continue;\n }\n break;\n }\n return (array[idx] = item);\n}\n\n/**\n * moveToTail - Moves an element up the array until the target element is `greater` than all the elements in tail\n *\n * @param {any[]} array - The array to sift through\n * @param {number} idx - The index of the element to sift up\n * @param {CompareFunc} cmp - The function used to compare elements in the array\n * @returns {any[]} - The updated array with the sifted element in the correct position\n */\nfunction moveToTail(array: any[], idx: number, end: number | undefined, cmp: CompareFunc) {\n const start = idx;\n const endIdx = end ?? array.length;\n const item = array[idx];\n let cidx = idx * 2 + 1;\n let ridx;\n\n // Move the element up the array until it is in the correct position\n while (cidx < endIdx) {\n ridx = cidx + 1;\n if (ridx < endIdx && cmp(array[cidx], array[ridx]) >= 0) {\n cidx = ridx;\n }\n array[idx] = array[cidx];\n idx = cidx;\n cidx = idx * 2 + 1;\n }\n array[idx] = item;\n return moveToHead(array, idx, start, cmp);\n}\n\nexport class Heap {\n protected compare: CompareFunc;\n\n protected nodes: any[];\n\n constructor(compare: CompareFunc) {\n this.compare = compare;\n this.nodes = [];\n }\n\n size() {\n return this.nodes.length;\n }\n\n last() {\n return this.nodes[0];\n }\n\n validate() {\n for (let i = this.nodes.length - 1; i > 0; i -= 1) {\n const parentIndex = Math.floor((i - 1) / 2);\n if (this.compare(this.nodes[parentIndex], this.nodes[i]) > 0) {\n return false;\n }\n }\n return true;\n }\n\n push(node: any) {\n if (this.nodes.includes(node)) {\n // node 的排序等级可能变更,需要重新执行 排序\n const index = this.nodes.indexOf(node);\n moveToHead(this.nodes, index, 0, this.compare);\n return moveToTail(this.nodes, index, null, this.compare);\n }\n this.nodes.push(node);\n return moveToHead(this.nodes, this.nodes.length - 1, 0, this.compare);\n }\n\n remove(node: any) {\n if (this.nodes.includes(node)) {\n const index = this.nodes.indexOf(node);\n\n this.nodes = this.nodes.slice(0, index).concat(this.nodes.slice(index + 1));\n\n moveToHead(this.nodes, index, 0, this.compare);\n moveToTail(this.nodes, index, null, this.compare);\n }\n }\n\n pop() {\n const last = this.nodes.pop();\n let item;\n\n if (this.nodes.length) {\n item = this.nodes[0];\n this.nodes[0] = last;\n\n moveToTail(this.nodes, 0, null, this.compare);\n } else {\n item = last;\n }\n return item;\n }\n\n clear() {\n this.nodes = [];\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/util/grammar-heap.ts"],"names":[],"mappings":"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","file":"grammar-heap.js","sourcesContent":["type CompareFunc = (a: any, b: any) => number;\n\n/**\n * moveToHead - Moves an element down the array until the target element is `smallar` than all the elements in head\n *\n * @param {any[]} array - The array to sift through\n * @param {number} start - The start index of the element\n * @param {number} idx - The index of the element to sift down\n * @param {CompareFunc} cmp - The function used to compare elements in the array\n * @returns {any[]} - The updated array with the sifted element in the correct position\n */\nfunction moveToHead(array: any[], idx: number, start: number, cmp: CompareFunc) {\n let parent;\n let pidx;\n\n const item = array[idx];\n // Move the element down the array\n while (idx > start) {\n pidx = Math.floor((idx - 1) / 2);\n parent = array[pidx];\n if (item && parent && cmp(item, parent) < 0) {\n array[idx] = parent;\n idx = pidx;\n continue;\n }\n break;\n }\n return (array[idx] = item);\n}\n\n/**\n * moveToTail - Moves an element up the array until the target element is `greater` than all the elements in tail\n *\n * @param {any[]} array - The array to sift through\n * @param {number} idx - The index of the element to sift up\n * @param {CompareFunc} cmp - The function used to compare elements in the array\n * @returns {any[]} - The updated array with the sifted element in the correct position\n */\nfunction moveToTail(array: any[], idx: number, end: number | undefined, cmp: CompareFunc) {\n const start = idx;\n const endIdx = end ?? array.length;\n const item = array[idx];\n let cidx = idx * 2 + 1;\n let ridx;\n\n // Move the element up the array until it is in the correct position\n while (cidx < endIdx) {\n ridx = cidx + 1;\n if (ridx < endIdx && cmp(array[cidx], array[ridx]) >= 0) {\n cidx = ridx;\n }\n array[idx] = array[cidx];\n idx = cidx;\n cidx = idx * 2 + 1;\n }\n array[idx] = item;\n return moveToHead(array, idx, start, cmp);\n}\n\nexport class Heap {\n protected compare: CompareFunc;\n\n protected nodes: any[];\n\n constructor(compare: CompareFunc) {\n this.compare = compare;\n this.nodes = [];\n }\n\n size() {\n return this.nodes.length;\n }\n\n last() {\n return this.nodes[0];\n }\n\n validate() {\n for (let i = this.nodes.length - 1; i > 0; i -= 1) {\n const parentIndex = Math.floor((i - 1) / 2);\n if (this.compare(this.nodes[parentIndex], this.nodes[i]) > 0) {\n return false;\n }\n }\n return true;\n }\n\n push(node: any) {\n if (this.nodes.includes(node)) {\n // node 的排序等级可能变更,需要重新执行 排序\n const index = this.nodes.indexOf(node);\n moveToHead(this.nodes, index, 0, this.compare);\n return moveToTail(this.nodes, index, null, this.compare);\n }\n this.nodes.push(node);\n return moveToHead(this.nodes, this.nodes.length - 1, 0, this.compare);\n }\n\n remove(node: any) {\n if (this.nodes.includes(node)) {\n const index = this.nodes.indexOf(node);\n\n this.nodes = this.nodes.slice(0, index).concat(this.nodes.slice(index + 1));\n\n moveToHead(this.nodes, index, 0, this.compare);\n moveToTail(this.nodes, index, null, this.compare);\n }\n }\n\n pop() {\n const last = this.nodes.pop();\n let item;\n\n if (this.nodes.length) {\n item = this.nodes[0];\n this.nodes[0] = last;\n\n moveToTail(this.nodes, 0, null, this.compare);\n } else {\n item = last;\n }\n return item;\n }\n\n clear() {\n this.nodes = [];\n }\n}\n"]}
package/es/view/View.d.ts CHANGED
@@ -14,6 +14,7 @@ export default class View extends EventEmitter implements IView {
14
14
  hooks: Hooks;
15
15
  logger: ILogger;
16
16
  grammars: IRecordedGrammars;
17
+ private _isReleased;
17
18
  private _spec;
18
19
  private _config;
19
20
  private _options;
@@ -75,6 +76,7 @@ export default class View extends EventEmitter implements IView {
75
76
  addGrammar(grammar: IGrammarBase): this;
76
77
  removeGrammar(grammar: string | IGrammarBase): this;
77
78
  removeAllGrammars(): this;
79
+ removeAllGraphicItems(): this;
78
80
  parseSpec(spec: ViewSpec): this;
79
81
  updateSpec(spec: ViewSpec): this;
80
82
  private parseBuiltIn;
package/es/view/View.js CHANGED
@@ -82,7 +82,7 @@ import { Factory } from "../core/factory";
82
82
 
83
83
  import { Component } from "./component";
84
84
 
85
- import { isMarkType } from "../graph/util/graphic";
85
+ import { isMarkType, removeGraphicItem } from "../graph/util/graphic";
86
86
 
87
87
  export default class View extends EventEmitter {
88
88
  static useRegisters(comps) {
@@ -276,6 +276,11 @@ export default class View extends EventEmitter {
276
276
  "signal" === grammar.grammarType && BuiltInSignalID.includes(grammar.id()) || "mark" === grammar.grammarType && "root" === grammar.id() || this.removeGrammar(grammar);
277
277
  })), this;
278
278
  }
279
+ removeAllGraphicItems() {
280
+ return this.traverseMarkTree((mark => {
281
+ mark.graphicItem && removeGraphicItem(mark.graphicItem), mark.graphicItem = null;
282
+ })), this;
283
+ }
279
284
  parseSpec(spec) {
280
285
  var _a, _b, _c, _d, _e, _f, _g, _h, _j;
281
286
  if (this.emit(HOOK_EVENT.BEFORE_PARSE_VIEW), this._spec = spec, normalizeMarkTree(spec),
@@ -363,10 +368,15 @@ export default class View extends EventEmitter {
363
368
  }
364
369
  setCurrentTheme(theme, render = !0) {
365
370
  return __awaiter(this, void 0, void 0, (function*() {
366
- return this.theme(theme), this.grammars.getAllMarks().forEach((mark => {
367
- mark.commit();
368
- })), render ? (yield this.evaluate(), this.renderer.render(!0)) : yield this._dataflow.evaluate(),
369
- this;
371
+ if (!this._isReleased) {
372
+ if (this.theme(theme), this.grammars.getAllMarks().forEach((mark => {
373
+ mark.commit();
374
+ })), render) {
375
+ if (yield this.evaluate(), this._isReleased) return;
376
+ this.renderer.render(!0);
377
+ } else yield this._dataflow.evaluate();
378
+ return this;
379
+ }
370
380
  }));
371
381
  }
372
382
  background(value) {
@@ -460,7 +470,8 @@ export default class View extends EventEmitter {
460
470
  }
461
471
  runAsync(runningConfig) {
462
472
  return __awaiter(this, void 0, void 0, (function*() {
463
- for (;this._running; ) yield this._running;
473
+ if (this._isReleased) return;
474
+ for (;this._running && (yield this._running, !this._isReleased); ) ;
464
475
  const clear = () => {
465
476
  this._running = null;
466
477
  };
@@ -481,31 +492,33 @@ export default class View extends EventEmitter {
481
492
  this.renderer.render(immediately), this.handleRenderEnd()), this.emit(HOOK_EVENT.AFTER_DO_RENDER);
482
493
  }
483
494
  evaluate(runningConfig) {
484
- var _a, _b;
495
+ var _a, _b, _c, _d;
485
496
  return __awaiter(this, void 0, void 0, (function*() {
486
- const normalizedRunningConfig = normalizeRunningConfig(runningConfig);
487
- this.reuseCachedGrammars(normalizedRunningConfig);
488
- const grammarWillDetach = this._cachedGrammars.size() > 0;
489
- grammarWillDetach && this.detachCachedGrammar();
497
+ if (this._isReleased) return;
498
+ const normalizedRunningConfig = normalizeRunningConfig(runningConfig), grammarWillDetach = this._cachedGrammars.size() > 0;
499
+ grammarWillDetach && (this.reuseCachedGrammars(normalizedRunningConfig), this.detachCachedGrammar());
490
500
  const hasResize = this._resizeRenderer(), hasUpdate = this._dataflow.hasCommitted();
491
- return grammarWillDetach || hasUpdate || this._layoutState || hasResize ? (this.clearProgressive(),
492
- yield this._dataflow.evaluate(), this._needBuildLayoutTree && (this.buildLayoutTree(),
493
- this._needBuildLayoutTree = !1), this._layoutState && (this._layoutState = LayoutState.layouting,
494
- this.doLayout(), this._dataflow.hasCommitted() && (this._layoutState = LayoutState.reevaluate,
495
- yield this._dataflow.evaluate()), this._layoutState = LayoutState.after, (null === (_a = this._layoutMarks) || void 0 === _a ? void 0 : _a.length) && this.handleLayoutEnd()),
496
- this._layoutState = null, this.findProgressiveMarks(), this._resizeRenderer(), this.doRender(!1),
497
- null === (_b = this._willMorphMarks) || void 0 === _b || _b.forEach((morphMarks => {
498
- this._morph.morph(morphMarks.prev, morphMarks.next, normalizedRunningConfig);
499
- })), this._willMorphMarks = null, this.releaseCachedGrammars(normalizedRunningConfig),
500
- this.doPreProgressive(), this) : this;
501
+ if (!(grammarWillDetach || hasUpdate || this._layoutState || hasResize)) return this;
502
+ if (this.clearProgressive(), null === (_a = this.renderer) || void 0 === _a || _a.preventRender(!0),
503
+ yield this._dataflow.evaluate(), !this._isReleased) {
504
+ if (this._needBuildLayoutTree && (this.buildLayoutTree(), this._needBuildLayoutTree = !1),
505
+ this._layoutState) {
506
+ if (this._layoutState = LayoutState.layouting, this.doLayout(), this._dataflow.hasCommitted() && (this._layoutState = LayoutState.reevaluate,
507
+ yield this._dataflow.evaluate(), this._isReleased)) return;
508
+ this._layoutState = LayoutState.after, (null === (_b = this._layoutMarks) || void 0 === _b ? void 0 : _b.length) && this.handleLayoutEnd();
509
+ }
510
+ return null === (_c = this.renderer) || void 0 === _c || _c.preventRender(!1), this._layoutState = null,
511
+ this.findProgressiveMarks(), this._resizeRenderer(), this.doRender(!1), null === (_d = this._willMorphMarks) || void 0 === _d || _d.forEach((morphMarks => {
512
+ this._morph.morph(morphMarks.prev, morphMarks.next, normalizedRunningConfig);
513
+ })), this._willMorphMarks = null, this.releaseCachedGrammars(normalizedRunningConfig),
514
+ this.doPreProgressive(), this;
515
+ }
501
516
  }));
502
517
  }
503
518
  evaluateSync(runningConfig) {
504
519
  var _a, _b;
505
- const normalizedRunningConfig = normalizeRunningConfig(runningConfig);
506
- this.reuseCachedGrammars(normalizedRunningConfig);
507
- const grammarWillDetach = this._cachedGrammars.size() > 0;
508
- grammarWillDetach && this.detachCachedGrammar();
520
+ const normalizedRunningConfig = normalizeRunningConfig(runningConfig), grammarWillDetach = this._cachedGrammars.size() > 0;
521
+ grammarWillDetach && (this.reuseCachedGrammars(normalizedRunningConfig), this.detachCachedGrammar());
509
522
  const hasResize = this._resizeRenderer(), hasUpdate = this._dataflow.hasCommitted();
510
523
  return grammarWillDetach || hasUpdate || this._layoutState || hasResize ? (this.clearProgressive(),
511
524
  this._dataflow.evaluateSync(), this._needBuildLayoutTree && (this.buildLayoutTree(),
@@ -787,9 +800,9 @@ export default class View extends EventEmitter {
787
800
  }
788
801
  release() {
789
802
  var _a, _b, _c;
790
- this._unBindResizeEvent(), this.clearProgressive(), Factory.unregisterRuntimeTransforms(),
791
- this.animate.stop(), this.grammars.release(), this._cachedGrammars.release(), this._dataflow = null,
792
- null === (_b = null === (_a = this.renderer) || void 0 === _a ? void 0 : _a.release) || void 0 === _b || _b.call(_a),
803
+ this._isReleased = !0, this._unBindResizeEvent(), this.clearProgressive(), Factory.unregisterRuntimeTransforms(),
804
+ this.animate.stop(), this.grammars.release(), this._cachedGrammars.release(), this._dataflow.release(),
805
+ this._dataflow = null, null === (_b = null === (_a = this.renderer) || void 0 === _a ? void 0 : _a.release) || void 0 === _b || _b.call(_a),
793
806
  this.renderer = null, this._boundInteractions = null, this.removeAllListeners(),
794
807
  null === (_c = this._eventListeners) || void 0 === _c || _c.forEach((listener => {
795
808
  listener.source.removeEventListener(listener.type, listener.handler);