import {Axis as VgAxis, SignalRef, Text} from 'vega'; import { AxisInternal, AxisPart, AxisPropsWithCondition, COMMON_AXIS_PROPERTIES_INDEX, ConditionalAxisProp, } from '../../axis.js'; import {FieldDefBase} from '../../channeldef.js'; import {duplicate, Flag, keys} from '../../util.js'; import {isSignalRef} from '../../vega.schema.js'; import {Split} from '../split.js'; function isFalseOrNull(v: any) { return v === false || v === null; } export type AxisComponentProps = Omit & Omit, 'title'> & { title: Text | FieldDefBase[] | SignalRef; labelExpr: string; disable: boolean; }; const AXIS_COMPONENT_PROPERTIES_INDEX: Flag = { disable: 1, gridScale: 1, scale: 1, ...COMMON_AXIS_PROPERTIES_INDEX, labelExpr: 1, encode: 1, }; export const AXIS_COMPONENT_PROPERTIES = keys(AXIS_COMPONENT_PROPERTIES_INDEX); export class AxisComponent extends Split { constructor( public readonly explicit: Partial = {}, public readonly implicit: Partial = {}, public mainExtracted = false, ) { super(); } public clone() { return new AxisComponent(duplicate(this.explicit), duplicate(this.implicit), this.mainExtracted); } public hasAxisPart(part: AxisPart) { // FIXME(https://github.com/vega/vega-lite/issues/2552) this method can be wrong if users use a Vega theme. if (part === 'axis') { // always has the axis container part return true; } if (part === 'grid' || part === 'title') { return !!this.get(part); } // Other parts are enabled by default, so they should not be false or null. return !isFalseOrNull(this.get(part)); } public hasOrientSignalRef() { return isSignalRef(this.explicit.orient); } } export interface AxisComponentIndex { x?: AxisComponent[]; y?: AxisComponent[]; } export interface AxisInternalIndex { x?: AxisInternal; y?: AxisInternal; }