@x12i/charts 0.0.0-stage → 1.0.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 x12i
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,37 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
1
+ # @x12i/charts
2
+
3
+ `ChartSpec` for the Unified UI Kit: one JSON-serializable description of a chart.
4
+
5
+ > **Status: foundation.** This package ships the spec types and the renderer
6
+ > choice logic. The renderers themselves are not built yet.
7
+
8
+ ```ts
9
+ import { defineChartSpec } from "@x12i/charts";
10
+
11
+ export const signups = defineChartSpec({
12
+ title: "Weekly signups passed target in week 4",
13
+ source: "Product analytics",
14
+ data: { ref: "signups_by_week" },
15
+ mark: "bar",
16
+ x: { field: "week", type: "category" },
17
+ y: { field: "signups", type: "number", format: "compact" },
18
+ highlight: { where: "week == 'W4'" },
19
+ annotations: [{ type: "reference-line", y: 300, label: "Target" }],
20
+ a11y: { description: "Bars of weekly signups; week 4 is highest." },
21
+ });
22
+ ```
23
+
24
+ ## Renderers (planned)
25
+
26
+ | Renderer | Engine | Used for |
27
+ | --- | --- | --- |
28
+ | SVG (default) | D3 scale, shape and array modules (ISC) and visx primitives (MIT) | Up to about 5,000 points; always in reports and print |
29
+ | Canvas | Apache ECharts (Apache-2.0), through a token bridge | Above 5,000 points, and types such as Sankey and sunburst |
30
+
31
+ `resolveRenderer()` implements the `renderer="auto"` rule today.
32
+
33
+ ## Design rules the defaults will enforce
34
+
35
+ Grey first with one accent, bars start at zero, no 3D, dual axes only behind an
36
+ explicit flag, and every chart has a title that states the finding, a source
37
+ line, an accessible description and a "View as table" toggle.
@@ -0,0 +1,166 @@
1
+ /**
2
+ * ChartSpec: a JSON-serializable description of one chart (spec section 8).
3
+ * The grammar is deliberately smaller than Vega-Lite. Renderers read a spec and
4
+ * draw it with kit tokens, so an engine can change without breaking apps.
5
+ */
6
+ /** Chart types by family. Entries marked 1.x in the spec are included so specs written today stay valid. */
7
+ declare const chartTypes: readonly ["bar", "lollipop", "dot-plot", "bullet", "slope", "dumbbell", "line", "area", "step", "sparkline", "range-band", "candlestick", "ohlc", "histogram", "box-plot", "density", "strip", "beeswarm", "violin", "ecdf", "donut", "treemap", "waterfall", "funnel", "waffle", "sunburst", "marimekko", "scatter", "bubble", "connected-scatter", "heatmap", "hexbin", "contour", "stat", "gauge", "progress-ring", "sankey", "chord", "alluvial", "choropleth", "point-map", "heat-layer", "flow-map", "gantt", "timeline", "burndown", "cumulative-flow", "calendar-heatmap"];
8
+ type ChartType = (typeof chartTypes)[number];
9
+ type FieldType = "category" | "number" | "time" | "boolean";
10
+ /** Where the rows come from: a named dataset resolved by the app, or inline values. */
11
+ type ChartData = {
12
+ ref: string;
13
+ } | {
14
+ values: ReadonlyArray<Record<string, unknown>>;
15
+ };
16
+ interface Encoding {
17
+ field: string;
18
+ type: FieldType;
19
+ /** A named format such as `compact` or `percent`, or an ICU pattern. */
20
+ format?: string;
21
+ /** Axis or legend title. Axis titles carry units. */
22
+ title?: string;
23
+ }
24
+ /** Transforms run in order before drawing. */
25
+ type Transform = {
26
+ type: "aggregate";
27
+ groupBy: string[];
28
+ op: "sum" | "mean" | "min" | "max" | "count";
29
+ field?: string;
30
+ as: string;
31
+ } | {
32
+ type: "bin";
33
+ field: string;
34
+ maxBins?: number;
35
+ as: string;
36
+ } | {
37
+ type: "stack";
38
+ field: string;
39
+ groupBy?: string[];
40
+ offset?: "zero" | "normalize";
41
+ } | {
42
+ type: "percent-of-total";
43
+ field: string;
44
+ as: string;
45
+ } | {
46
+ type: "sort";
47
+ field: string;
48
+ order?: "asc" | "desc";
49
+ } | {
50
+ type: "top-n";
51
+ field: string;
52
+ n: number;
53
+ otherLabel?: string;
54
+ } | {
55
+ type: "rolling-average";
56
+ field: string;
57
+ window: number;
58
+ as: string;
59
+ } | {
60
+ type: "cumulative-sum";
61
+ field: string;
62
+ as: string;
63
+ } | {
64
+ type: "period-change";
65
+ field: string;
66
+ periods?: number;
67
+ as: string;
68
+ } | {
69
+ type: "downsample";
70
+ method: "lttb";
71
+ field: string;
72
+ threshold: number;
73
+ };
74
+ /** Targets, limits and forecasts are always labeled marks, never unlabeled lines. */
75
+ type Annotation = {
76
+ type: "reference-line";
77
+ x?: number | string;
78
+ y?: number | string;
79
+ label: string;
80
+ } | {
81
+ type: "reference-band";
82
+ from: number | string;
83
+ to: number | string;
84
+ axis: "x" | "y";
85
+ label: string;
86
+ } | {
87
+ type: "text";
88
+ x: number | string;
89
+ y: number | string;
90
+ text: string;
91
+ } | {
92
+ type: "forecast";
93
+ from: number | string;
94
+ label: string;
95
+ };
96
+ interface ChartInteractions {
97
+ tooltip?: boolean;
98
+ /** Brush to filter other charts and grids through the shared filter store. */
99
+ brush?: boolean;
100
+ /** Click a legend entry to isolate a series. */
101
+ legendIsolate?: boolean;
102
+ zoom?: boolean;
103
+ /** Click to drill down through the shared filter store. */
104
+ drilldown?: boolean;
105
+ }
106
+ /** Accessibility fields. Every chart has an accessible name, a description and a table view. */
107
+ interface ChartA11y {
108
+ /** The long description read to screen reader users. */
109
+ description: string;
110
+ /** Show the underlying data as a table behind a "View as table" toggle. Defaults to true. */
111
+ table?: boolean;
112
+ }
113
+ type RendererChoice = "svg" | "canvas" | "auto";
114
+ interface ChartSpec {
115
+ /** Schema version, so saved specs can be migrated. */
116
+ version?: 1;
117
+ /** The finding: a sentence that states what the chart shows. */
118
+ title: string;
119
+ /** Scope and units. */
120
+ subtitle?: string;
121
+ /** Where the data came from. Required in reports. */
122
+ source?: string;
123
+ data: ChartData;
124
+ mark: ChartType;
125
+ x?: Encoding;
126
+ y?: Encoding;
127
+ /** Series that differ in kind use the categorical palette, capped at 8 hues. */
128
+ color?: Encoding;
129
+ size?: Encoding;
130
+ /** One accent on what the title is about, for example `week == 'W4'`. */
131
+ highlight?: {
132
+ where: string;
133
+ };
134
+ transforms?: Transform[];
135
+ annotations?: Annotation[];
136
+ interactions?: ChartInteractions;
137
+ /** Dual axes only behind an explicit flag, which adds a visible warning. */
138
+ dualAxis?: boolean;
139
+ renderer?: RendererChoice;
140
+ /** Whether axes mirror in right-to-left locales. */
141
+ direction?: "ltr" | "rtl" | "auto";
142
+ a11y: ChartA11y;
143
+ }
144
+ /** Identity helper that gives authoring-time type checking and autocomplete. */
145
+ declare function defineChartSpec(spec: ChartSpec): ChartSpec;
146
+
147
+ /**
148
+ * The SVG renderer is comfortable up to roughly this many points per chart
149
+ * (spec section 8: about 1,000 to 5,000). Beyond it, auto mode uses canvas.
150
+ */
151
+ declare const SVG_POINT_LIMIT = 5000;
152
+ type RenderTarget = "screen" | "print" | "report";
153
+ interface ResolveRendererInput {
154
+ renderer?: RendererChoice;
155
+ mark: ChartType;
156
+ pointCount: number;
157
+ target?: RenderTarget;
158
+ }
159
+ /**
160
+ * Picks a renderer for a chart. Reports and print always use SVG so the output
161
+ * stays vector; on screen, `auto` switches to canvas by point count and type.
162
+ */
163
+ declare function resolveRenderer({ renderer, mark, pointCount, target, }: ResolveRendererInput): "svg" | "canvas";
164
+
165
+ export { SVG_POINT_LIMIT, chartTypes, defineChartSpec, resolveRenderer };
166
+ export type { Annotation, ChartA11y, ChartData, ChartInteractions, ChartSpec, ChartType, Encoding, FieldType, RenderTarget, RendererChoice, ResolveRendererInput, Transform };
package/dist/index.js ADDED
@@ -0,0 +1,92 @@
1
+ // src/spec.ts
2
+ var chartTypes = [
3
+ // Comparison
4
+ "bar",
5
+ "lollipop",
6
+ "dot-plot",
7
+ "bullet",
8
+ "slope",
9
+ "dumbbell",
10
+ // Trend
11
+ "line",
12
+ "area",
13
+ "step",
14
+ "sparkline",
15
+ "range-band",
16
+ "candlestick",
17
+ "ohlc",
18
+ // Distribution
19
+ "histogram",
20
+ "box-plot",
21
+ "density",
22
+ "strip",
23
+ "beeswarm",
24
+ "violin",
25
+ "ecdf",
26
+ // Composition
27
+ "donut",
28
+ "treemap",
29
+ "waterfall",
30
+ "funnel",
31
+ "waffle",
32
+ "sunburst",
33
+ "marimekko",
34
+ // Relationship
35
+ "scatter",
36
+ "bubble",
37
+ "connected-scatter",
38
+ "heatmap",
39
+ "hexbin",
40
+ "contour",
41
+ // KPI
42
+ "stat",
43
+ "gauge",
44
+ "progress-ring",
45
+ // Flow
46
+ "sankey",
47
+ "chord",
48
+ "alluvial",
49
+ // Geo
50
+ "choropleth",
51
+ "point-map",
52
+ "heat-layer",
53
+ "flow-map",
54
+ // Schedule and process
55
+ "gantt",
56
+ "timeline",
57
+ "burndown",
58
+ "cumulative-flow",
59
+ "calendar-heatmap"
60
+ ];
61
+ function defineChartSpec(spec) {
62
+ return spec;
63
+ }
64
+
65
+ // src/renderer.ts
66
+ var SVG_POINT_LIMIT = 5e3;
67
+ var CANVAS_ONLY = /* @__PURE__ */ new Set([
68
+ "candlestick",
69
+ "ohlc",
70
+ "sunburst",
71
+ "marimekko",
72
+ "hexbin",
73
+ "contour",
74
+ "sankey",
75
+ "chord",
76
+ "alluvial"
77
+ ]);
78
+ function resolveRenderer({
79
+ renderer = "auto",
80
+ mark,
81
+ pointCount,
82
+ target = "screen"
83
+ }) {
84
+ if (target !== "screen") return "svg";
85
+ if (renderer !== "auto") return renderer;
86
+ if (CANVAS_ONLY.has(mark)) return "canvas";
87
+ return pointCount > SVG_POINT_LIMIT ? "canvas" : "svg";
88
+ }
89
+
90
+ export { SVG_POINT_LIMIT, chartTypes, defineChartSpec, resolveRenderer };
91
+ //# sourceMappingURL=index.js.map
92
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/spec.ts","../src/renderer.ts"],"names":[],"mappings":";AAOO,IAAM,UAAA,GAAa;AAAA;AAAA,EAExB,KAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA;AAAA,EAEA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA;AAAA,EAEA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA;AAAA,EAEA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA;AAAA,EAEA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,mBAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA;AAAA,EAEA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA;AAAA,EAEA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA;AAAA,EAEA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA;AAAA,EAEA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF;AA2FO,SAAS,gBAAgB,IAAA,EAA4B;AAC1D,EAAA,OAAO,IAAA;AACT;;;ACxJO,IAAM,eAAA,GAAkB;AAG/B,IAAM,WAAA,uBAA0C,GAAA,CAAe;AAAA,EAC7D,aAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAeM,SAAS,eAAA,CAAgB;AAAA,EAC9B,QAAA,GAAW,MAAA;AAAA,EACX,IAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA,GAAS;AACX,CAAA,EAA2C;AACzC,EAAA,IAAI,MAAA,KAAW,UAAU,OAAO,KAAA;AAChC,EAAA,IAAI,QAAA,KAAa,QAAQ,OAAO,QAAA;AAChC,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA,EAAG,OAAO,QAAA;AAClC,EAAA,OAAO,UAAA,GAAa,kBAAkB,QAAA,GAAW,KAAA;AACnD","file":"index.js","sourcesContent":["/**\r\n * ChartSpec: a JSON-serializable description of one chart (spec section 8).\r\n * The grammar is deliberately smaller than Vega-Lite. Renderers read a spec and\r\n * draw it with kit tokens, so an engine can change without breaking apps.\r\n */\r\n\r\n/** Chart types by family. Entries marked 1.x in the spec are included so specs written today stay valid. */\r\nexport const chartTypes = [\r\n // Comparison\r\n \"bar\",\r\n \"lollipop\",\r\n \"dot-plot\",\r\n \"bullet\",\r\n \"slope\",\r\n \"dumbbell\",\r\n // Trend\r\n \"line\",\r\n \"area\",\r\n \"step\",\r\n \"sparkline\",\r\n \"range-band\",\r\n \"candlestick\",\r\n \"ohlc\",\r\n // Distribution\r\n \"histogram\",\r\n \"box-plot\",\r\n \"density\",\r\n \"strip\",\r\n \"beeswarm\",\r\n \"violin\",\r\n \"ecdf\",\r\n // Composition\r\n \"donut\",\r\n \"treemap\",\r\n \"waterfall\",\r\n \"funnel\",\r\n \"waffle\",\r\n \"sunburst\",\r\n \"marimekko\",\r\n // Relationship\r\n \"scatter\",\r\n \"bubble\",\r\n \"connected-scatter\",\r\n \"heatmap\",\r\n \"hexbin\",\r\n \"contour\",\r\n // KPI\r\n \"stat\",\r\n \"gauge\",\r\n \"progress-ring\",\r\n // Flow\r\n \"sankey\",\r\n \"chord\",\r\n \"alluvial\",\r\n // Geo\r\n \"choropleth\",\r\n \"point-map\",\r\n \"heat-layer\",\r\n \"flow-map\",\r\n // Schedule and process\r\n \"gantt\",\r\n \"timeline\",\r\n \"burndown\",\r\n \"cumulative-flow\",\r\n \"calendar-heatmap\",\r\n] as const;\r\n\r\nexport type ChartType = (typeof chartTypes)[number];\r\n\r\nexport type FieldType = \"category\" | \"number\" | \"time\" | \"boolean\";\r\n\r\n/** Where the rows come from: a named dataset resolved by the app, or inline values. */\r\nexport type ChartData =\r\n | { ref: string }\r\n | { values: ReadonlyArray<Record<string, unknown>> };\r\n\r\nexport interface Encoding {\r\n field: string;\r\n type: FieldType;\r\n /** A named format such as `compact` or `percent`, or an ICU pattern. */\r\n format?: string;\r\n /** Axis or legend title. Axis titles carry units. */\r\n title?: string;\r\n}\r\n\r\n/** Transforms run in order before drawing. */\r\nexport type Transform =\r\n | { type: \"aggregate\"; groupBy: string[]; op: \"sum\" | \"mean\" | \"min\" | \"max\" | \"count\"; field?: string; as: string }\r\n | { type: \"bin\"; field: string; maxBins?: number; as: string }\r\n | { type: \"stack\"; field: string; groupBy?: string[]; offset?: \"zero\" | \"normalize\" }\r\n | { type: \"percent-of-total\"; field: string; as: string }\r\n | { type: \"sort\"; field: string; order?: \"asc\" | \"desc\" }\r\n | { type: \"top-n\"; field: string; n: number; otherLabel?: string }\r\n | { type: \"rolling-average\"; field: string; window: number; as: string }\r\n | { type: \"cumulative-sum\"; field: string; as: string }\r\n | { type: \"period-change\"; field: string; periods?: number; as: string }\r\n | { type: \"downsample\"; method: \"lttb\"; field: string; threshold: number };\r\n\r\n/** Targets, limits and forecasts are always labeled marks, never unlabeled lines. */\r\nexport type Annotation =\r\n | { type: \"reference-line\"; x?: number | string; y?: number | string; label: string }\r\n | { type: \"reference-band\"; from: number | string; to: number | string; axis: \"x\" | \"y\"; label: string }\r\n | { type: \"text\"; x: number | string; y: number | string; text: string }\r\n | { type: \"forecast\"; from: number | string; label: string };\r\n\r\nexport interface ChartInteractions {\r\n tooltip?: boolean;\r\n /** Brush to filter other charts and grids through the shared filter store. */\r\n brush?: boolean;\r\n /** Click a legend entry to isolate a series. */\r\n legendIsolate?: boolean;\r\n zoom?: boolean;\r\n /** Click to drill down through the shared filter store. */\r\n drilldown?: boolean;\r\n}\r\n\r\n/** Accessibility fields. Every chart has an accessible name, a description and a table view. */\r\nexport interface ChartA11y {\r\n /** The long description read to screen reader users. */\r\n description: string;\r\n /** Show the underlying data as a table behind a \"View as table\" toggle. Defaults to true. */\r\n table?: boolean;\r\n}\r\n\r\nexport type RendererChoice = \"svg\" | \"canvas\" | \"auto\";\r\n\r\nexport interface ChartSpec {\r\n /** Schema version, so saved specs can be migrated. */\r\n version?: 1;\r\n /** The finding: a sentence that states what the chart shows. */\r\n title: string;\r\n /** Scope and units. */\r\n subtitle?: string;\r\n /** Where the data came from. Required in reports. */\r\n source?: string;\r\n data: ChartData;\r\n mark: ChartType;\r\n x?: Encoding;\r\n y?: Encoding;\r\n /** Series that differ in kind use the categorical palette, capped at 8 hues. */\r\n color?: Encoding;\r\n size?: Encoding;\r\n /** One accent on what the title is about, for example `week == 'W4'`. */\r\n highlight?: { where: string };\r\n transforms?: Transform[];\r\n annotations?: Annotation[];\r\n interactions?: ChartInteractions;\r\n /** Dual axes only behind an explicit flag, which adds a visible warning. */\r\n dualAxis?: boolean;\r\n renderer?: RendererChoice;\r\n /** Whether axes mirror in right-to-left locales. */\r\n direction?: \"ltr\" | \"rtl\" | \"auto\";\r\n a11y: ChartA11y;\r\n}\r\n\r\n/** Identity helper that gives authoring-time type checking and autocomplete. */\r\nexport function defineChartSpec(spec: ChartSpec): ChartSpec {\r\n return spec;\r\n}\r\n","import type { ChartType, RendererChoice } from \"./spec\";\r\n\r\n/**\r\n * The SVG renderer is comfortable up to roughly this many points per chart\r\n * (spec section 8: about 1,000 to 5,000). Beyond it, auto mode uses canvas.\r\n */\r\nexport const SVG_POINT_LIMIT = 5000;\r\n\r\n/** Chart types that only the canvas renderer draws. */\r\nconst CANVAS_ONLY: ReadonlySet<ChartType> = new Set<ChartType>([\r\n \"candlestick\",\r\n \"ohlc\",\r\n \"sunburst\",\r\n \"marimekko\",\r\n \"hexbin\",\r\n \"contour\",\r\n \"sankey\",\r\n \"chord\",\r\n \"alluvial\",\r\n]);\r\n\r\nexport type RenderTarget = \"screen\" | \"print\" | \"report\";\r\n\r\nexport interface ResolveRendererInput {\r\n renderer?: RendererChoice;\r\n mark: ChartType;\r\n pointCount: number;\r\n target?: RenderTarget;\r\n}\r\n\r\n/**\r\n * Picks a renderer for a chart. Reports and print always use SVG so the output\r\n * stays vector; on screen, `auto` switches to canvas by point count and type.\r\n */\r\nexport function resolveRenderer({\r\n renderer = \"auto\",\r\n mark,\r\n pointCount,\r\n target = \"screen\",\r\n}: ResolveRendererInput): \"svg\" | \"canvas\" {\r\n if (target !== \"screen\") return \"svg\";\r\n if (renderer !== \"auto\") return renderer;\r\n if (CANVAS_ONLY.has(mark)) return \"canvas\";\r\n return pointCount > SVG_POINT_LIMIT ? \"canvas\" : \"svg\";\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,37 @@
1
1
  {
2
2
  "name": "@x12i/charts",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "1.0.0",
4
+ "description": "ChartSpec for the Unified UI Kit: one JSON-serializable description of a chart. Renderers (token-themed SVG, ECharts canvas) are planned.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/x12i/unified-ui-kit.git",
9
+ "directory": "packages/charts"
10
+ },
11
+ "homepage": "https://github.com/x12i/unified-ui-kit/tree/main/packages/charts#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/x12i/unified-ui-kit/issues"
14
+ },
15
+ "type": "module",
16
+ "sideEffects": false,
17
+ "files": [
18
+ "dist",
19
+ "README.md"
20
+ ],
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "default": "./dist/index.js"
25
+ },
26
+ "./package.json": "./package.json"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "scripts": {
32
+ "build": "tsup",
33
+ "typecheck": "tsc --noEmit",
34
+ "lint": "eslint .",
35
+ "test": "vitest run --passWithNoTests"
36
+ }
6
37
  }