Teren-app/resources/js/Components/ui/chart/interface.js

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