@cfasim-ui/charts 0.3.18 → 0.4.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.
@@ -0,0 +1,131 @@
1
+ import { ChartData } from '../_shared/index.js';
2
+ export type BarChartData = ChartData;
3
+ export interface BarSeries {
4
+ /** Bar values; one entry per category. `y` is accepted as an alias. */
5
+ y?: BarChartData;
6
+ data?: BarChartData;
7
+ color?: string;
8
+ opacity?: number;
9
+ /** Label shown in the inline legend. */
10
+ legend?: string;
11
+ }
12
+ type __VLS_Props = {
13
+ /** Single-series values. Equivalent to `y`. */
14
+ data?: BarChartData;
15
+ /** Single-series values (alias for `data`). */
16
+ y?: BarChartData;
17
+ /** Multi-series mode. Each series has its own values. */
18
+ series?: BarSeries[];
19
+ /**
20
+ * Category labels for the categorical axis. Length should match the
21
+ * longest series. When omitted, indices (0, 1, 2, ...) are used.
22
+ */
23
+ categories?: readonly string[];
24
+ /** "vertical" (default, aka column) draws upright bars; "horizontal" draws sideways. */
25
+ orientation?: "vertical" | "horizontal";
26
+ /** "grouped" (default) places series side-by-side; "stacked" stacks them. */
27
+ layout?: "grouped" | "stacked";
28
+ width?: number;
29
+ height?: number;
30
+ title?: string;
31
+ xLabel?: string;
32
+ yLabel?: string;
33
+ /** Force the value axis to start at this value or lower (default 0). */
34
+ valueMin?: number;
35
+ /**
36
+ * Tick placement on the value axis (numeric). Number = interval,
37
+ * array = explicit values. When omitted, ticks are chosen automatically.
38
+ */
39
+ valueTicks?: number | number[];
40
+ /** Formatter for value-axis tick labels. */
41
+ valueTickFormat?: (value: number) => string;
42
+ /** Formatter for category-axis labels. Receives the resolved category string. */
43
+ categoryFormat?: (label: string, index: number) => string;
44
+ /**
45
+ * Fraction of each category slot reserved as gap between groups (0..1).
46
+ * Default 0.2 — i.e. bars/groups fill 80% of their slot.
47
+ */
48
+ barPadding?: number;
49
+ /**
50
+ * Pixel gap between bars within a single category group in `grouped` layout.
51
+ * Default 1.
52
+ */
53
+ groupGap?: number;
54
+ debounce?: number;
55
+ menu?: boolean | string;
56
+ valueGrid?: boolean;
57
+ /** Custom per-index data passed to the tooltip slot. */
58
+ tooltipData?: unknown[];
59
+ /** Tooltip activation mode. */
60
+ tooltipTrigger?: "hover" | "click";
61
+ /** Boundary for tooltip flip/clamp. Default "chart". */
62
+ tooltipClamp?: "none" | "chart" | "window";
63
+ /** Custom CSV content (string or function). When omitted, generated from the bars. */
64
+ csv?: string | (() => string);
65
+ /** Filename (without extension) for downloaded SVG, PNG, CSV. */
66
+ filename?: string;
67
+ /** Show a plain text link below the chart to download the CSV. */
68
+ downloadLink?: boolean | string;
69
+ };
70
+ declare function __VLS_template(): {
71
+ attrs: Partial<{}>;
72
+ slots: Readonly<{
73
+ tooltip?(props: {
74
+ index: number;
75
+ category: string;
76
+ values: {
77
+ value: number;
78
+ color: string;
79
+ seriesIndex: number;
80
+ }[];
81
+ data: unknown;
82
+ }): unknown;
83
+ }> & {
84
+ tooltip?(props: {
85
+ index: number;
86
+ category: string;
87
+ values: {
88
+ value: number;
89
+ color: string;
90
+ seriesIndex: number;
91
+ }[];
92
+ data: unknown;
93
+ }): unknown;
94
+ };
95
+ refs: {
96
+ containerRef: HTMLDivElement;
97
+ svgRef: SVGSVGElement;
98
+ tooltipRef: HTMLDivElement;
99
+ };
100
+ rootEl: HTMLDivElement;
101
+ };
102
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
103
+ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
104
+ hover: (payload: {
105
+ index: number;
106
+ } | null) => any;
107
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
108
+ onHover?: ((payload: {
109
+ index: number;
110
+ } | null) => any) | undefined;
111
+ }>, {
112
+ menu: boolean | string;
113
+ tooltipClamp: "none" | "chart" | "window";
114
+ orientation: "vertical" | "horizontal";
115
+ layout: "grouped" | "stacked";
116
+ valueMin: number;
117
+ barPadding: number;
118
+ groupGap: number;
119
+ valueGrid: boolean;
120
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
121
+ containerRef: HTMLDivElement;
122
+ svgRef: SVGSVGElement;
123
+ tooltipRef: HTMLDivElement;
124
+ }, HTMLDivElement>;
125
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
126
+ export default _default;
127
+ type __VLS_WithTemplateSlots<T, S> = T & {
128
+ new (): {
129
+ $slots: S;
130
+ };
131
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -1,10 +1,11 @@
1
+ import { ChartData } from '../_shared/index.js';
1
2
  /**
2
3
  * Numeric input accepted by the chart. `number[]` and any standard numeric
3
4
  * typed array are supported, so the output of
4
5
  * `ModelOutput.column('x')` (e.g. a `Float64Array`) can be passed directly
5
6
  * without copying into a plain array.
6
7
  */
7
- export type LineChartData = readonly number[] | Float64Array | Float32Array | Int32Array | Uint32Array | Int16Array | Uint16Array | Int8Array | Uint8Array | Uint8ClampedArray;
8
+ export type LineChartData = ChartData;
8
9
  export interface Series {
9
10
  /**
10
11
  * Y-values. One of `y` or `data` must be supplied; `y` wins if both
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Pure helpers shared by chart components for axis tick math and value
3
+ * formatting. No Vue reactivity here; see `useAxisTicks` for the
4
+ * reactive wrapper.
5
+ */
6
+ /** Round to nearest half-pixel so 1px SVG strokes stay sharp. */
7
+ export declare function snap(v: number): number;
8
+ export declare function niceStep(range: number, targetTicks: number): number;
9
+ /** Generate interval-spaced values in [min, max], inclusive. */
10
+ export declare function intervalValues(min: number, max: number, step: number): number[];
11
+ export declare function formatTick(v: number): string;
12
+ /**
13
+ * Numeric input accepted by chart components. `number[]` and any standard
14
+ * numeric typed array are supported, so the output of
15
+ * `ModelOutput.column('x')` (e.g. a `Float64Array`) can be passed
16
+ * directly without copying.
17
+ */
18
+ export type ChartData = readonly number[] | Float64Array | Float32Array | Int32Array | Uint32Array | Int16Array | Uint16Array | Int8Array | Uint8Array | Uint8ClampedArray;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,21 @@
1
+ export interface TickValueOptions {
2
+ /** Data-space extent. */
3
+ min: number;
4
+ max: number;
5
+ /** Tick spec: number = interval, array = explicit values, undefined = auto. */
6
+ ticks?: number | number[];
7
+ /** Target tick count when auto-spacing (typically innerSize / 50 for y, /80 for x). */
8
+ targetTickCount?: number;
9
+ /**
10
+ * Display-space offset added to user-supplied explicit/interval values
11
+ * before they are interpreted. Used by LineChart's `xMin` semantics so
12
+ * users supply tick values in display coordinates.
13
+ */
14
+ displayOffset?: number;
15
+ }
16
+ /**
17
+ * Returns tick values in data-space ([min, max]) according to the spec.
18
+ * Display-space conversions (for labels) happen at the call site so
19
+ * each chart can layer its own formatting / fallback behavior.
20
+ */
21
+ export declare function computeTickValues(opts: TickValueOptions): number[];
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ export { snap, niceStep, intervalValues, formatTick, type ChartData, } from './axes.js';
2
+ export { computeTickValues, type TickValueOptions } from './computeTicks.js';
3
+ export { useChartSize, type ChartSizeOptions } from './useChartSize.js';
4
+ export { useChartPadding, INLINE_LEGEND_HEIGHT, type ChartPaddingOptions, } from './useChartPadding.js';
5
+ export { useChartTooltip, type ChartTooltipOptions, } from './useChartTooltip.js';
6
+ export { useChartMenu, type ChartMenuOptions } from './useChartMenu.js';
7
+ export { seriesToCsv, categoricalToCsv, type CsvSeries } from './seriesCsv.js';
@@ -0,0 +1,20 @@
1
+ import { ChartData } from './axes.js';
2
+ export interface CsvSeries {
3
+ data: ChartData;
4
+ /** Optional parallel x-values; when all series share the same x, an `x` column is used. */
5
+ x?: ChartData;
6
+ }
7
+ /**
8
+ * Build a CSV string for one or more numeric series. When every series
9
+ * shares the same `x` reference an `x` column is emitted; otherwise
10
+ * rows are indexed.
11
+ */
12
+ export declare function seriesToCsv(series: CsvSeries[]): string;
13
+ /**
14
+ * Build a CSV for a categorical chart (BarChart vertical / horizontal):
15
+ * one row per category, one column per series.
16
+ */
17
+ export declare function categoricalToCsv(categories: readonly string[], series: {
18
+ label?: string;
19
+ data: ChartData;
20
+ }[], categoryHeader?: string): string;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,22 @@
1
+ import { Ref } from 'vue';
2
+ import { ChartMenuItem } from '../ChartMenu/ChartMenu';
3
+ export interface ChartMenuOptions {
4
+ filename: () => string | undefined;
5
+ /** Used as the menu's filename fallback when `filename` is unset. */
6
+ legacyMenuLabel: () => boolean | string | undefined;
7
+ /** Builds the CSV content for downloads. */
8
+ getCsv: () => string;
9
+ /** Whether a separate download link is rendered (and the CSV menu item should be hidden). */
10
+ downloadLink: () => boolean | string | undefined;
11
+ }
12
+ /**
13
+ * Computes the standard chart menu items (SVG / PNG / CSV) plus the
14
+ * CSV-download-link state shared by every chart.
15
+ */
16
+ export declare function useChartMenu(opts: ChartMenuOptions): {
17
+ svgRef: Ref<SVGSVGElement | null>;
18
+ items: import('vue').ComputedRef<ChartMenuItem[]>;
19
+ downloadLinkText: import('vue').ComputedRef<string | null>;
20
+ csvHref: import('vue').ComputedRef<string | null>;
21
+ resolvedFilename: () => string;
22
+ };
@@ -0,0 +1,26 @@
1
+ /** Vertical space reserved at the top of the chart for inline legend swatches. */
2
+ export declare const INLINE_LEGEND_HEIGHT = 20;
3
+ export interface ChartPaddingOptions {
4
+ title: () => string | undefined;
5
+ xLabel: () => string | undefined;
6
+ yLabel: () => string | undefined;
7
+ hasInlineLegend: () => boolean;
8
+ width: () => number;
9
+ height: () => number;
10
+ }
11
+ /**
12
+ * Computes the standard chart padding (top/right/bottom/left) and the
13
+ * derived inner plotting region (innerW, innerH). Shared by LineChart
14
+ * and BarChart so the axis label spacing and inline legend strip stay
15
+ * consistent.
16
+ */
17
+ export declare function useChartPadding(opts: ChartPaddingOptions): {
18
+ padding: import('vue').ComputedRef<{
19
+ top: number;
20
+ right: number;
21
+ bottom: number;
22
+ left: number;
23
+ }>;
24
+ innerW: import('vue').ComputedRef<number>;
25
+ innerH: import('vue').ComputedRef<number>;
26
+ };
@@ -0,0 +1,16 @@
1
+ import { Ref } from 'vue';
2
+ export interface ChartSizeOptions {
3
+ /** Fallback width when measurement is not yet available. */
4
+ fallbackWidth?: number;
5
+ /** Optional debounce in ms applied to ResizeObserver updates. */
6
+ debounce?: () => number | undefined;
7
+ }
8
+ /**
9
+ * Watches an element ref for size changes and exposes the measured width.
10
+ * Mirrors the per-chart ResizeObserver wiring previously inlined in each
11
+ * chart component.
12
+ */
13
+ export declare function useChartSize(opts?: ChartSizeOptions): {
14
+ containerRef: Ref<HTMLElement | null>;
15
+ measuredWidth: Ref<number>;
16
+ };
@@ -0,0 +1,66 @@
1
+ import { Ref } from 'vue';
2
+ import { TooltipClamp } from '../tooltip-position.js';
3
+ export interface ChartTooltipOptions {
4
+ /** Whether tooltip interactions are wired up at all. */
5
+ enabled: () => boolean;
6
+ /** Tooltip activation mode. */
7
+ trigger?: () => "hover" | "click" | undefined;
8
+ /** Boundary for tooltip flip/clamp. */
9
+ clamp?: () => TooltipClamp;
10
+ /**
11
+ * Maps a client (x, y) pointer location to a data index, or null when
12
+ * the pointer is outside the chart. Most charts only need `clientX`
13
+ * (categorical or x-indexed), but horizontal bar charts also need
14
+ * `clientY`.
15
+ */
16
+ pointerToIndex: (clientX: number, clientY: number) => number | null;
17
+ /** The chart's container element (used to compute relative position). */
18
+ containerRef: Ref<HTMLElement | null>;
19
+ /** Pointer-vertical offset applied for touch interactions. */
20
+ touchYOffset?: number;
21
+ /**
22
+ * Emit hover events. The first arg is `{ index }` while hovering and
23
+ * `null` when leaving.
24
+ */
25
+ onHover?: (payload: {
26
+ index: number;
27
+ } | null) => void;
28
+ }
29
+ /**
30
+ * Shared tooltip state + pointer/touch handlers used by chart components.
31
+ * The caller wires the returned `handlers` to its hit-test overlay and
32
+ * places the floating tooltip with `tooltipPos`.
33
+ */
34
+ export declare function useChartTooltip(opts: ChartTooltipOptions): {
35
+ hoverIndex: Ref<number | null, number | null>;
36
+ isTouching: Ref<boolean, boolean>;
37
+ pointer: Ref<{
38
+ clientX: number;
39
+ clientY: number;
40
+ } | null, {
41
+ clientX: number;
42
+ clientY: number;
43
+ } | {
44
+ clientX: number;
45
+ clientY: number;
46
+ } | null>;
47
+ tooltipRef: Ref<HTMLElement | null, HTMLElement | null>;
48
+ tooltipPos: Ref<{
49
+ left: number;
50
+ top: number;
51
+ } | null, {
52
+ left: number;
53
+ top: number;
54
+ } | {
55
+ left: number;
56
+ top: number;
57
+ } | null>;
58
+ handlers: {
59
+ mousemove: (event: MouseEvent) => void;
60
+ mouseleave: () => void;
61
+ click: (event: MouseEvent) => void;
62
+ touchstart: (event: TouchEvent) => void;
63
+ touchmove: (event: TouchEvent) => void;
64
+ touchend: () => void;
65
+ };
66
+ };
package/dist/index.css CHANGED
@@ -1,2 +1,2 @@
1
- .chart-menu-trigger-area[data-v-fe2f6904]{z-index:1;position:absolute;top:0;right:0}.chart-menu-button[data-v-fe2f6904]{border:1px solid var(--color-border);background:var(--color-bg-0,#fff);width:28px;height:28px;color:var(--color-text-secondary);cursor:pointer;opacity:0;border-radius:.25em;justify-content:center;align-items:center;transition:opacity .15s;display:flex}.chart-menu-button[data-state=open][data-v-fe2f6904]{opacity:1}.chart-menu-button[data-v-fe2f6904]:hover{background:var(--color-bg-1,#0000000d);color:var(--color-text)}.chart-menu-content{z-index:100;background:var(--color-bg-0);border:1px solid var(--color-border);border-radius:.25em;min-width:140px;padding:.25em;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.chart-menu-item{font-size:var(--font-size-sm);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;border-radius:.25em;outline:none;align-items:center;padding:.375em .5em;display:flex}.chart-menu-item[data-highlighted]{background:var(--color-primary);color:#fff}.line-chart-wrapper[data-v-dc8afa83]{width:100%;position:relative}.line-chart-wrapper[data-v-dc8afa83]:hover .chart-menu-button{opacity:1}.line-chart-tooltip-label[data-v-dc8afa83]{margin-bottom:.25em;font-weight:600}.line-chart-tooltip-row[data-v-dc8afa83]{align-items:center;gap:.375em;display:flex}.line-chart-download-link[data-v-dc8afa83]{text-align:right;font-size:var(--font-size-sm);margin-top:.25em;display:block}.line-chart-tooltip-swatch[data-v-dc8afa83]{border-radius:50%;flex-shrink:0;width:.625em;height:.625em;display:inline-block}.choropleth-wrapper[data-v-25a20d5b]{width:100%;position:relative}.choropleth-wrapper.pannable svg[data-v-25a20d5b]{cursor:grab}.choropleth-wrapper.pannable svg[data-v-25a20d5b]:active{cursor:grabbing}.choropleth-wrapper[data-v-25a20d5b]:hover .chart-menu-button{opacity:1}.state-path[data-v-25a20d5b]{cursor:pointer}.chart-tooltip-anchor[data-v-44377f70]{pointer-events:none;width:1px;height:1px;position:absolute}.chart-tooltip-content{z-index:100;background:var(--color-bg-0,#fff);border:1px solid var(--color-border,#e5e7eb);font-size:var(--font-size-sm,.875rem);pointer-events:none;border-radius:.375em;padding:.5em .75em;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.TableOuter[data-v-505e2187]{display:inline-block;position:relative}.TableOuter.has-menu[data-v-505e2187]{margin-top:32px}.TableOuter[data-v-505e2187] .chart-menu-trigger-area{top:-32px;right:0}.TableOuter[data-v-505e2187]:hover .chart-menu-button{opacity:1}.TableWrapper[data-v-505e2187]{font-size:var(--font-size-sm);overflow-x:auto}.Table[data-v-505e2187]{border-collapse:collapse;font-variant-numeric:tabular-nums;border:1px solid var(--color-border);margin:0;display:table}.Table tr[data-v-505e2187],.Table th[data-v-505e2187],.Table td[data-v-505e2187]{background:0 0;border:none}.Table th[data-v-505e2187],.Table td[data-v-505e2187]{white-space:nowrap;padding:.75em 1.25em}.Table th[data-v-505e2187]{border-bottom:1px solid var(--color-border-header);font-weight:600;position:sticky;top:0}.Table tbody td[data-v-505e2187]{border-bottom:1px solid var(--color-border)}.Table tbody tr:last-child td[data-v-505e2187]{border-bottom:none}.data-table-download-link[data-v-505e2187]{text-align:right;font-size:var(--font-size-sm);margin-top:.25em;display:block}
1
+ .chart-menu-trigger-area[data-v-fe2f6904]{z-index:1;position:absolute;top:0;right:0}.chart-menu-button[data-v-fe2f6904]{border:1px solid var(--color-border);background:var(--color-bg-0,#fff);width:28px;height:28px;color:var(--color-text-secondary);cursor:pointer;opacity:0;border-radius:.25em;justify-content:center;align-items:center;transition:opacity .15s;display:flex}.chart-menu-button[data-state=open][data-v-fe2f6904]{opacity:1}.chart-menu-button[data-v-fe2f6904]:hover{background:var(--color-bg-1,#0000000d);color:var(--color-text)}.chart-menu-content{z-index:100;background:var(--color-bg-0);border:1px solid var(--color-border);border-radius:.25em;min-width:140px;padding:.25em;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.chart-menu-item{font-size:var(--font-size-sm);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;border-radius:.25em;outline:none;align-items:center;padding:.375em .5em;display:flex}.chart-menu-item[data-highlighted]{background:var(--color-primary);color:#fff}.line-chart-wrapper[data-v-d66a19bd]{width:100%;position:relative}.line-chart-wrapper[data-v-d66a19bd]:hover .chart-menu-button{opacity:1}.line-chart-tooltip-label[data-v-d66a19bd]{margin-bottom:.25em;font-weight:600}.line-chart-tooltip-row[data-v-d66a19bd]{align-items:center;gap:.375em;display:flex}.line-chart-download-link[data-v-d66a19bd]{text-align:right;font-size:var(--font-size-sm);margin-top:.25em;display:block}.line-chart-tooltip-swatch[data-v-d66a19bd]{border-radius:50%;flex-shrink:0;width:.625em;height:.625em;display:inline-block}.bar-chart-wrapper[data-v-c2d91885]{width:100%;position:relative}.bar-chart-wrapper[data-v-c2d91885]:hover .chart-menu-button{opacity:1}.bar-chart-tooltip-label[data-v-c2d91885]{margin-bottom:.25em;font-weight:600}.bar-chart-tooltip-row[data-v-c2d91885]{align-items:center;gap:.375em;display:flex}.bar-chart-download-link[data-v-c2d91885]{text-align:right;font-size:var(--font-size-sm);margin-top:.25em;display:block}.bar-chart-tooltip-swatch[data-v-c2d91885]{border-radius:50%;flex-shrink:0;width:.625em;height:.625em;display:inline-block}.choropleth-wrapper[data-v-25a20d5b]{width:100%;position:relative}.choropleth-wrapper.pannable svg[data-v-25a20d5b]{cursor:grab}.choropleth-wrapper.pannable svg[data-v-25a20d5b]:active{cursor:grabbing}.choropleth-wrapper[data-v-25a20d5b]:hover .chart-menu-button{opacity:1}.state-path[data-v-25a20d5b]{cursor:pointer}.chart-tooltip-anchor[data-v-44377f70]{pointer-events:none;width:1px;height:1px;position:absolute}.chart-tooltip-content{z-index:100;background:var(--color-bg-0,#fff);border:1px solid var(--color-border,#e5e7eb);font-size:var(--font-size-sm,.875rem);pointer-events:none;border-radius:.375em;padding:.5em .75em;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.TableOuter[data-v-505e2187]{display:inline-block;position:relative}.TableOuter.has-menu[data-v-505e2187]{margin-top:32px}.TableOuter[data-v-505e2187] .chart-menu-trigger-area{top:-32px;right:0}.TableOuter[data-v-505e2187]:hover .chart-menu-button{opacity:1}.TableWrapper[data-v-505e2187]{font-size:var(--font-size-sm);overflow-x:auto}.Table[data-v-505e2187]{border-collapse:collapse;font-variant-numeric:tabular-nums;border:1px solid var(--color-border);margin:0;display:table}.Table tr[data-v-505e2187],.Table th[data-v-505e2187],.Table td[data-v-505e2187]{background:0 0;border:none}.Table th[data-v-505e2187],.Table td[data-v-505e2187]{white-space:nowrap;padding:.75em 1.25em}.Table th[data-v-505e2187]{border-bottom:1px solid var(--color-border-header);font-weight:600;position:sticky;top:0}.Table tbody td[data-v-505e2187]{border-bottom:1px solid var(--color-border)}.Table tbody tr:last-child td[data-v-505e2187]{border-bottom:none}.data-table-download-link[data-v-505e2187]{text-align:right;font-size:var(--font-size-sm);margin-top:.25em;display:block}
2
2
  /*$vite$:1*/
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { default as LineChart, type LineChartData, type Series, type Area, type AreaSection, } from './LineChart/LineChart';
2
+ export { default as BarChart, type BarChartData, type BarSeries, } from './BarChart/BarChart';
2
3
  export { default as ChoroplethMap, type GeoType, type StateData, type ChoroplethColorScale, type ThresholdStop, type CategoricalStop, } from './ChoroplethMap/ChoroplethMap';
3
4
  export { default as ChartTooltip } from './ChartTooltip/ChartTooltip';
4
5
  export { default as DataTable, type TableData, type TableRecord, type ColumnAlign, type ColumnConfig, type ColumnWidth, } from './DataTable/DataTable';