50 lines
1.6 KiB
JavaScript
50 lines
1.6 KiB
JavaScript
// Chart interface and context helpers
|
|
// This is a fresh, original implementation inspired conceptually by patterns
|
|
// observed in external registries. No code copied.
|
|
|
|
import { inject, provide, reactive } from 'vue';
|
|
|
|
/**
|
|
* @typedef {Object} ChartSeriesConfig
|
|
* @property {string|import('vue').Component} [label] Display label or component
|
|
* @property {import('vue').Component} [icon] Optional icon component
|
|
* @property {string} [color] Static CSS color value (e.g. 'var(--chart-1)')
|
|
* @property {Object} [theme] Optional theme map: { light: string, dark: string }
|
|
*/
|
|
|
|
/**
|
|
* @typedef {Object.<string, ChartSeriesConfig>} ChartConfig
|
|
* Keys are series identifiers. Each value declares label/icon and either a
|
|
* static color or a theme object with light/dark variants.
|
|
*/
|
|
|
|
const ChartContextSymbol = Symbol('ChartContext');
|
|
let _idCounter = 0;
|
|
|
|
/**
|
|
* Provide chart context for descendants.
|
|
* @param {ChartConfig} config Reactive or plain config object.
|
|
* @param {string} [explicitId] Optional id override.
|
|
* @returns {{ id: string, config: ChartConfig }}
|
|
*/
|
|
export function provideChartContext(config, explicitId) {
|
|
const id = explicitId || `c${Date.now().toString(36)}${(++_idCounter).toString(36)}`;
|
|
const ctx = { id, config: reactive(config) };
|
|
provide(ChartContextSymbol, ctx);
|
|
return ctx;
|
|
}
|
|
|
|
/**
|
|
* Inject previously provided chart context.
|
|
* @returns {{ id: string, config: ChartConfig }}
|
|
*/
|
|
export function useChartContext() {
|
|
const ctx = inject(ChartContextSymbol, null);
|
|
if (!ctx) {
|
|
throw new Error('useChartContext() called without a provider. Wrap in <ChartContainer>.');
|
|
}
|
|
return ctx;
|
|
}
|
|
|
|
export {}; // preserve module boundaries
|