@unovis/mcp 1.7.0-mcp.1 → 1.7.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/README.md +3 -2
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -1
- package/dist/codegen/index.js +23 -8
- package/dist/codegen/index.js.map +1 -1
- package/dist/html/document.d.ts +16 -3
- package/dist/html/document.js +50 -20
- package/dist/html/document.js.map +1 -1
- package/dist/index.d.ts +7 -6
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/recipes/area.d.ts +3 -2
- package/dist/recipes/bar.d.ts +4 -3
- package/dist/recipes/bar.js +4 -1
- package/dist/recipes/bar.js.map +1 -1
- package/dist/recipes/boxplot.d.ts +3 -2
- package/dist/recipes/chord.d.ts +1 -0
- package/dist/recipes/choropleth.d.ts +1 -0
- package/dist/recipes/donut.d.ts +1 -0
- package/dist/recipes/graph.d.ts +1 -0
- package/dist/recipes/heatmap.d.ts +1 -0
- package/dist/recipes/index.d.ts +2 -0
- package/dist/recipes/index.js +3 -0
- package/dist/recipes/index.js.map +1 -1
- package/dist/recipes/line.d.ts +3 -2
- package/dist/recipes/nested-donut.d.ts +1 -0
- package/dist/recipes/radial-bar.d.ts +1 -0
- package/dist/recipes/sankey.d.ts +1 -0
- package/dist/recipes/scatter.d.ts +3 -2
- package/dist/recipes/shared.d.ts +6 -10
- package/dist/recipes/shared.js +7 -53
- package/dist/recipes/shared.js.map +1 -1
- package/dist/recipes/timeline.d.ts +1 -0
- package/dist/recipes/treemap.d.ts +1 -0
- package/dist/render/materialize.d.ts +9 -3
- package/dist/render/materialize.js +66 -27
- package/dist/render/materialize.js.map +1 -1
- package/dist/render/renderer.d.ts +2 -7
- package/dist/render/renderer.js +1 -1
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/spec-schema.d.ts +1180 -0
- package/dist/render/spec-schema.js +71 -0
- package/dist/render/spec-schema.js.map +1 -0
- package/dist/render/spec.d.ts +15 -7
- package/dist/render/spec.js +9 -8
- package/dist/render/spec.js.map +1 -1
- package/dist/render/time-ticks.d.ts +10 -0
- package/dist/render/time-ticks.js +56 -0
- package/dist/render/time-ticks.js.map +1 -0
- package/dist/server.js +12 -3
- package/dist/server.js.map +1 -1
- package/dist/tools/register.d.ts +20 -1
- package/dist/tools/register.js +98 -15
- package/dist/tools/register.js.map +1 -1
- package/dist/widget/bundle.js +470 -465
- package/dist/widget/bundle.meta.json +2 -1
- package/dist/widget/bundle.standard.js +799 -0
- package/dist/widget/entry.d.ts +4 -0
- package/dist/widget/entry.js +149 -13
- package/dist/widget/entry.js.map +1 -1
- package/dist/widget/events.d.ts +25 -0
- package/dist/widget/events.js +97 -0
- package/dist/widget/events.js.map +1 -0
- package/dist/widget/interactions.js +22 -12
- package/dist/widget/interactions.js.map +1 -1
- package/dist/widget/unpack.d.ts +1 -0
- package/dist/widget/unpack.js +1 -0
- package/dist/widget/unpack.js.map +1 -0
- package/dist/widget/variants.d.ts +14 -0
- package/dist/widget/variants.js +22 -0
- package/dist/widget/variants.js.map +1 -0
- package/docs/README.md +2 -1
- package/docs/architecture.md +29 -76
- package/docs/chart-spec.md +41 -0
- package/docs/getting-started.md +5 -0
- package/docs/interactive.md +72 -14
- package/docs/output-types.md +9 -9
- package/docs/programmatic.md +24 -0
- package/docs/tools.md +7 -7
- package/docs/troubleshooting.md +14 -44
- package/docs/webview.md +83 -0
- package/package.json +35 -13
- package/schema/chart-spec.v0.1.baseline.json +309 -0
- package/schema/chart-spec.v0.1.json +309 -0
- package/dist/env/bbox.d.ts +0 -13
- package/dist/env/bbox.js +0 -335
- package/dist/env/bbox.js.map +0 -1
- package/dist/env/canvas.d.ts +0 -9
- package/dist/env/canvas.js +0 -55
- package/dist/env/canvas.js.map +0 -1
- package/dist/env/computed-style.d.ts +0 -38
- package/dist/env/computed-style.js +0 -186
- package/dist/env/computed-style.js.map +0 -1
- package/dist/env/fonts.d.ts +0 -3
- package/dist/env/fonts.js +0 -103
- package/dist/env/fonts.js.map +0 -1
- package/dist/env/index.d.ts +0 -13
- package/dist/env/index.js +0 -121
- package/dist/env/index.js.map +0 -1
- package/dist/env/raf-queue.d.ts +0 -23
- package/dist/env/raf-queue.js +0 -51
- package/dist/env/raf-queue.js.map +0 -1
- package/dist/env/size.d.ts +0 -9
- package/dist/env/size.js +0 -30
- package/dist/env/size.js.map +0 -1
- package/dist/render/headless.d.ts +0 -62
- package/dist/render/headless.js +0 -158
- package/dist/render/headless.js.map +0 -1
- package/dist/render/mutex.d.ts +0 -9
- package/dist/render/mutex.js +0 -14
- package/dist/render/mutex.js.map +0 -1
- package/dist/render/rasterize.d.ts +0 -10
- package/dist/render/rasterize.js +0 -29
- package/dist/render/rasterize.js.map +0 -1
- package/dist/svg/collect-css.d.ts +0 -14
- package/dist/svg/collect-css.js +0 -53
- package/dist/svg/collect-css.js.map +0 -1
- package/dist/svg/css-vars.d.ts +0 -17
- package/dist/svg/css-vars.js +0 -64
- package/dist/svg/css-vars.js.map +0 -1
- package/dist/svg/header.d.ts +0 -8
- package/dist/svg/header.js +0 -81
- package/dist/svg/header.js.map +0 -1
- package/dist/svg/ids.d.ts +0 -12
- package/dist/svg/ids.js +0 -94
- package/dist/svg/ids.js.map +0 -1
- package/dist/svg/postprocess.d.ts +0 -41
- package/dist/svg/postprocess.js +0 -135
- package/dist/svg/postprocess.js.map +0 -1
- package/fonts/README.md +0 -19
package/dist/widget/entry.d.ts
CHANGED
|
@@ -7,12 +7,16 @@
|
|
|
7
7
|
* protocol so any page can host the widget in an iframe.
|
|
8
8
|
*/
|
|
9
9
|
import * as unovis from './unovis-slim.js';
|
|
10
|
+
import type { ChartEvent } from './events.js';
|
|
10
11
|
import type { ChartSpec } from '../render/spec.js';
|
|
11
12
|
export interface RenderOptions {
|
|
12
13
|
/** Animation duration in ms (0 disables animations) */
|
|
13
14
|
duration?: number;
|
|
14
15
|
/** Render the spec title as a heading above the chart */
|
|
15
16
|
showTitle?: boolean;
|
|
17
|
+
/** Receive clicks on chart elements (bars, segments, nodes…), normalized to
|
|
18
|
+
* the caller's own data records. In embed mode, set `events: true` instead */
|
|
19
|
+
onEvent?: (event: ChartEvent) => void;
|
|
16
20
|
}
|
|
17
21
|
export interface ChartHandle {
|
|
18
22
|
destroy: () => void;
|
package/dist/widget/entry.js
CHANGED
|
@@ -9,6 +9,18 @@
|
|
|
9
9
|
import * as unovis from './unovis-slim.js';
|
|
10
10
|
import { materializeChart } from '../render/materialize.js';
|
|
11
11
|
import { buildInteractions } from './interactions.js';
|
|
12
|
+
import { componentEvents } from './events.js';
|
|
13
|
+
import { SPEC_VERSION } from '../render/spec.js';
|
|
14
|
+
/** Error text comes from exceptions that can echo spec content, so it is
|
|
15
|
+
* rendered as a text node rather than markup */
|
|
16
|
+
function showError(root, message) {
|
|
17
|
+
const el = document.createElement('div');
|
|
18
|
+
el.className = 'uv-error';
|
|
19
|
+
el.textContent = message;
|
|
20
|
+
root.replaceChildren(el);
|
|
21
|
+
}
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
23
|
+
const BUNDLE_VERSION = typeof __UNOVIS_MCP_VERSION__ !== 'undefined' ? __UNOVIS_MCP_VERSION__ : 'dev';
|
|
12
24
|
const THEME_ATTR = 'data-theme';
|
|
13
25
|
function applyTheme(theme) {
|
|
14
26
|
const root = document.documentElement;
|
|
@@ -37,6 +49,18 @@ export function render(spec, container, options = {}) {
|
|
|
37
49
|
}
|
|
38
50
|
const lib = unovis;
|
|
39
51
|
const { containerConfig: interactionConfig, legendItems } = buildInteractions(lib, spec);
|
|
52
|
+
// Interaction events are widget behavior, not chart description, so they
|
|
53
|
+
// merge into the components here rather than living in the spec
|
|
54
|
+
const onEvent = options.onEvent;
|
|
55
|
+
if (onEvent) {
|
|
56
|
+
spec = {
|
|
57
|
+
...spec,
|
|
58
|
+
components: spec.components.map((component, i) => {
|
|
59
|
+
const events = componentEvents(lib, component, i, onEvent);
|
|
60
|
+
return events ? { ...component, config: { ...component.config, events } } : component;
|
|
61
|
+
}),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
40
64
|
let legend;
|
|
41
65
|
if (legendItems?.length) {
|
|
42
66
|
const legendEl = document.createElement('div');
|
|
@@ -68,30 +92,142 @@ export function render(spec, container, options = {}) {
|
|
|
68
92
|
},
|
|
69
93
|
};
|
|
70
94
|
}
|
|
95
|
+
/** The MCP Apps extension revision this view implements */
|
|
96
|
+
const APPS_PROTOCOL_VERSION = '2026-01-26';
|
|
97
|
+
/** Fixed request id for the view-initiated ui/initialize */
|
|
98
|
+
const APPS_INIT_ID = 'unovis-ui-init';
|
|
71
99
|
function startEmbedMode() {
|
|
72
100
|
const root = document.getElementById('uv-embed-root') ?? document.body;
|
|
73
101
|
let handle;
|
|
102
|
+
let lastSpec;
|
|
103
|
+
let lastOptions;
|
|
104
|
+
let appsAnswered = false;
|
|
105
|
+
// In a React Native WebView the host listens on its own bridge, not on
|
|
106
|
+
// window.parent — and receives strings, not structured clones
|
|
107
|
+
const post = (message) => {
|
|
108
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
109
|
+
const bridge = window.ReactNativeWebView;
|
|
110
|
+
if (bridge)
|
|
111
|
+
bridge.postMessage(JSON.stringify(message));
|
|
112
|
+
else
|
|
113
|
+
window.parent?.postMessage(message, '*');
|
|
114
|
+
};
|
|
74
115
|
const postSize = () => {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
width: root.scrollWidth,
|
|
78
|
-
height: root.scrollHeight,
|
|
79
|
-
}, '*');
|
|
116
|
+
post({ type: 'unovis:size', width: root.scrollWidth, height: root.scrollHeight });
|
|
117
|
+
post({ jsonrpc: '2.0', method: 'ui/notifications/size-changed', params: { width: root.scrollWidth, height: root.scrollHeight } });
|
|
80
118
|
};
|
|
81
|
-
|
|
82
|
-
const message = event.data;
|
|
83
|
-
if (message?.type !== 'unovis:render' || !message.spec)
|
|
84
|
-
return;
|
|
119
|
+
const renderMessage = (spec, rawOptions) => {
|
|
85
120
|
handle?.destroy();
|
|
86
121
|
try {
|
|
87
|
-
|
|
122
|
+
const { events, ...options } = rawOptions ?? {};
|
|
123
|
+
if (events) {
|
|
124
|
+
options.onEvent = (chartEvent) => post({ type: 'unovis:event', ...chartEvent });
|
|
125
|
+
}
|
|
126
|
+
handle = render(spec, root, options);
|
|
127
|
+
lastSpec = spec;
|
|
128
|
+
lastOptions = rawOptions;
|
|
88
129
|
postSize();
|
|
89
130
|
}
|
|
90
131
|
catch (e) {
|
|
91
|
-
root
|
|
132
|
+
showError(root, String(e instanceof Error ? e.message : e));
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
// MCP Apps hosts speak JSON-RPC. The view initiates the lifecycle
|
|
136
|
+
// (ui/initialize → host result → ui/notifications/initialized) — hosts MUST
|
|
137
|
+
// NOT send tool data before the initialized notification arrives, so the
|
|
138
|
+
// handshake is not optional. Returns true when the message was JSON-RPC.
|
|
139
|
+
const applyHostTheme = (theme) => {
|
|
140
|
+
if (theme !== 'dark' && theme !== 'light')
|
|
141
|
+
return;
|
|
142
|
+
if (lastSpec)
|
|
143
|
+
renderMessage({ ...lastSpec, theme }, lastOptions);
|
|
144
|
+
else
|
|
145
|
+
applyTheme(theme);
|
|
146
|
+
};
|
|
147
|
+
const onJsonRpc = (message) => {
|
|
148
|
+
if (message.jsonrpc !== '2.0')
|
|
149
|
+
return false;
|
|
150
|
+
// The host answered our ui/initialize: adopt its context, signal readiness
|
|
151
|
+
if (message.id === APPS_INIT_ID && message.result) {
|
|
152
|
+
appsAnswered = true;
|
|
153
|
+
applyHostTheme(message.result.hostContext?.theme);
|
|
154
|
+
post({ jsonrpc: '2.0', method: 'ui/notifications/initialized' });
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
if (message.method === 'ui/notifications/tool-result') {
|
|
158
|
+
const spec = message.params?.structuredContent?.spec;
|
|
159
|
+
// Results without a spec (static output types) leave the frame empty
|
|
160
|
+
if (spec)
|
|
161
|
+
renderMessage(spec, { events: true });
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
if (message.method === 'ui/notifications/host-context-changed') {
|
|
165
|
+
applyHostTheme(message.params?.hostContext?.theme);
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
if (message.method === 'ping' && message.id !== undefined) {
|
|
169
|
+
post({ jsonrpc: '2.0', id: message.id, result: {} });
|
|
170
|
+
return true;
|
|
92
171
|
}
|
|
172
|
+
return true; // tool-input, tool-cancelled, other ui/*: acknowledged by ignoring
|
|
173
|
+
};
|
|
174
|
+
const onMessage = (event) => {
|
|
175
|
+
// React Native posts strings; iframes post structured clones
|
|
176
|
+
const raw = event.data;
|
|
177
|
+
let message;
|
|
178
|
+
if (typeof raw === 'string') {
|
|
179
|
+
try {
|
|
180
|
+
message = JSON.parse(raw);
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
message = raw;
|
|
188
|
+
}
|
|
189
|
+
if (onJsonRpc(message))
|
|
190
|
+
return;
|
|
191
|
+
if (message?.type === 'unovis:render' && message.spec)
|
|
192
|
+
renderMessage(message.spec, message.options);
|
|
193
|
+
// Theme flips shouldn't force the host to resend the spec (or reload the
|
|
194
|
+
// document): re-render the last spec, or restyle the empty page
|
|
195
|
+
if (message?.type === 'unovis:theme' && (message.theme === 'light' || message.theme === 'dark')) {
|
|
196
|
+
if (lastSpec)
|
|
197
|
+
renderMessage({ ...lastSpec, theme: message.theme }, lastOptions);
|
|
198
|
+
else
|
|
199
|
+
applyTheme(message.theme);
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
// React Native delivers 'message' on document (Android) or window (iOS);
|
|
203
|
+
// iframes always on window. Same handler everywhere.
|
|
204
|
+
window.addEventListener('message', onMessage);
|
|
205
|
+
document.addEventListener('message', onMessage);
|
|
206
|
+
// Version handshake: hosts that persist embed documents or specs assert
|
|
207
|
+
// compatibility here instead of discovering drift as a blank chart
|
|
208
|
+
post({ type: 'unovis:ready', version: BUNDLE_VERSION, specVersion: SPEC_VERSION });
|
|
209
|
+
// MCP Apps lifecycle: view initiates. Retried briefly because a host may
|
|
210
|
+
// attach its bridge after this document's scripts run; non-Apps hosts never
|
|
211
|
+
// answer, and the retries stop on their own — harmless either way
|
|
212
|
+
const postInitialize = () => post({
|
|
213
|
+
jsonrpc: '2.0',
|
|
214
|
+
id: APPS_INIT_ID,
|
|
215
|
+
method: 'ui/initialize',
|
|
216
|
+
params: {
|
|
217
|
+
protocolVersion: APPS_PROTOCOL_VERSION,
|
|
218
|
+
appInfo: { name: 'unovis-chart-widget', version: BUNDLE_VERSION },
|
|
219
|
+
appCapabilities: {},
|
|
220
|
+
},
|
|
93
221
|
});
|
|
94
|
-
|
|
222
|
+
postInitialize();
|
|
223
|
+
let initializeAttempts = 0;
|
|
224
|
+
const initializeRetry = setInterval(() => {
|
|
225
|
+
if (appsAnswered || ++initializeAttempts > 8) {
|
|
226
|
+
clearInterval(initializeRetry);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
postInitialize();
|
|
230
|
+
}, 500);
|
|
95
231
|
}
|
|
96
232
|
/** Render a spec embedded in the page as <script type="application/json" id="uv-spec"> */
|
|
97
233
|
function renderInlineSpec() {
|
|
@@ -105,7 +241,7 @@ function renderInlineSpec() {
|
|
|
105
241
|
render(JSON.parse(specEl.textContent), root, options);
|
|
106
242
|
}
|
|
107
243
|
catch (e) {
|
|
108
|
-
root
|
|
244
|
+
showError(root, `Failed to render chart: ${String(e instanceof Error ? e.message : e)}`);
|
|
109
245
|
}
|
|
110
246
|
}
|
|
111
247
|
window.UnovisChart = { render, startEmbed: startEmbedMode, unovis };
|
package/dist/widget/entry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../../src/widget/entry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../../src/widget/entry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Interaction events for hosted widgets.
|
|
2
|
+
*
|
|
3
|
+
* The embed protocol was render-only: a host could show a chart but a tap on
|
|
4
|
+
* a donut segment could reach nothing. When a host opts in, every element
|
|
5
|
+
* that has a tooltip also reports clicks, normalized to the caller's own flat
|
|
6
|
+
* data records — never Unovis's internal render wrappers.
|
|
7
|
+
*/
|
|
8
|
+
import type { ComponentSpec } from '../render/spec.js';
|
|
9
|
+
type Lib = Record<string, any>;
|
|
10
|
+
type Datum = Record<string, any>;
|
|
11
|
+
/** What a host receives for one user interaction on a chart element */
|
|
12
|
+
export interface ChartEvent {
|
|
13
|
+
/** Component type the element belongs to, e.g. "Donut" */
|
|
14
|
+
component: string;
|
|
15
|
+
/** Index of that component in the spec's components array */
|
|
16
|
+
componentIndex: number;
|
|
17
|
+
/** DOM event name — "click" (a tap, on touch devices) */
|
|
18
|
+
event: string;
|
|
19
|
+
/** The element's datum, reduced to JSON-safe fields of the caller's record */
|
|
20
|
+
datum: unknown;
|
|
21
|
+
}
|
|
22
|
+
/** Unovis `events` config for one component, or undefined when it has no
|
|
23
|
+
* clickable primitives. Merged into the component config by the renderer. */
|
|
24
|
+
export declare function componentEvents(lib: Lib, component: ComponentSpec, componentIndex: number, onEvent: (event: ChartEvent) => void): Record<string, Record<string, (d: Datum) => void>> | undefined;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/** Keep only JSON-scalar fields — internal wrappers carry functions, DOM
|
|
2
|
+
* nodes and circular state that must never cross postMessage. */
|
|
3
|
+
const flatRecord = (value) => {
|
|
4
|
+
if (value === null || typeof value !== 'object')
|
|
5
|
+
return value;
|
|
6
|
+
const out = {};
|
|
7
|
+
for (const [key, v] of Object.entries(value)) {
|
|
8
|
+
if (key.startsWith('_'))
|
|
9
|
+
continue;
|
|
10
|
+
if (v === null || typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean')
|
|
11
|
+
out[key] = v;
|
|
12
|
+
}
|
|
13
|
+
return out;
|
|
14
|
+
};
|
|
15
|
+
/** Per-type unwrap of Unovis's internal datum to the user's record — the same
|
|
16
|
+
* shapes the tooltip templates in interactions.ts unwrap. */
|
|
17
|
+
const extractors = {
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
19
|
+
GroupedBar: d => flatRecord(d?.datum ?? d),
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
21
|
+
StackedBar: d => flatRecord(d?.datum ?? d),
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
23
|
+
Scatter: d => flatRecord(d?.datum ?? d),
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
25
|
+
Boxplot: d => flatRecord(d?.datum ?? d),
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
27
|
+
Timeline: d => flatRecord(d?.datum ?? d),
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
29
|
+
Donut: d => flatRecord(d?.data ?? d),
|
|
30
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
31
|
+
NestedDonut: d => ({ key: d?.data?.key, value: d?.value ?? d?.data?.value }),
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
33
|
+
RadialBar: d => flatRecord(d?.data ?? d),
|
|
34
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
35
|
+
Heatmap: d => flatRecord(d?.datum ?? d),
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
37
|
+
Treemap: d => ({ key: d?.data?.key ?? d?.key, value: d?.value }),
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
39
|
+
Sankey: d => (d?.source || d?.target
|
|
40
|
+
? { source: d?.source?.label ?? d?.source?.id, target: d?.target?.label ?? d?.target?.id, value: d?.value }
|
|
41
|
+
: { id: d?.id, label: d?.label, value: d?.value }),
|
|
42
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
43
|
+
ChordDiagram: d => ({ label: d?.data?.label ?? d?.key, value: d?.value ?? d?.data?.value }),
|
|
44
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
45
|
+
Graph: d => (d?.source || d?.target
|
|
46
|
+
? { source: d?.source?.id, target: d?.target?.id }
|
|
47
|
+
: flatRecord(d?._state ? d : d?.data ?? d)),
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
49
|
+
TopoJSONMap: d => flatRecord(d?.data ?? d),
|
|
50
|
+
};
|
|
51
|
+
/** CSS selectors of the clickable primitives per component type */
|
|
52
|
+
function clickableSelectors(lib, type) {
|
|
53
|
+
if (!lib[type])
|
|
54
|
+
return []; // variant bundle without this component
|
|
55
|
+
switch (type) {
|
|
56
|
+
case 'GroupedBar': return [lib.GroupedBar.selectors.bar];
|
|
57
|
+
case 'StackedBar': return [lib.StackedBar.selectors.bar];
|
|
58
|
+
case 'Scatter': return [lib.Scatter.selectors.point];
|
|
59
|
+
case 'Boxplot': return [lib.Boxplot.selectors.box];
|
|
60
|
+
case 'Timeline': return [lib.Timeline.selectors.line];
|
|
61
|
+
case 'Donut': return [lib.Donut.selectors.segment];
|
|
62
|
+
case 'NestedDonut': return [lib.NestedDonut.selectors.segment];
|
|
63
|
+
case 'RadialBar': return [lib.RadialBar.selectors.segment];
|
|
64
|
+
case 'Heatmap': return [lib.Heatmap.selectors.node];
|
|
65
|
+
case 'Treemap': return [lib.Treemap.selectors.tile];
|
|
66
|
+
case 'Sankey': return [lib.Sankey.selectors.node, lib.Sankey.selectors.link];
|
|
67
|
+
case 'ChordDiagram': return [lib.ChordDiagram.selectors.node];
|
|
68
|
+
case 'Graph': return [lib.Graph.selectors.node, lib.Graph.selectors.link];
|
|
69
|
+
case 'TopoJSONMap': return [lib.TopoJSONMap.selectors.feature];
|
|
70
|
+
// Line/Area have no per-datum element — the crosshair reads them; a
|
|
71
|
+
// future x-position event would live on the container, not the shapes
|
|
72
|
+
default: return [];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** Unovis `events` config for one component, or undefined when it has no
|
|
76
|
+
* clickable primitives. Merged into the component config by the renderer. */
|
|
77
|
+
export function componentEvents(lib, component, componentIndex, onEvent) {
|
|
78
|
+
const selectors = clickableSelectors(lib, component.type);
|
|
79
|
+
if (!selectors.length)
|
|
80
|
+
return undefined;
|
|
81
|
+
// Inline own-property check, so static analysis can see the name is validated
|
|
82
|
+
const candidate = Object.prototype.hasOwnProperty.call(extractors, component.type) ? extractors[component.type] : undefined;
|
|
83
|
+
const extract = typeof candidate === 'function' ? candidate : flatRecord;
|
|
84
|
+
const events = {};
|
|
85
|
+
for (const selector of selectors) {
|
|
86
|
+
events[selector] = {
|
|
87
|
+
click: (d) => onEvent({
|
|
88
|
+
component: component.type,
|
|
89
|
+
componentIndex,
|
|
90
|
+
event: 'click',
|
|
91
|
+
datum: extract(d),
|
|
92
|
+
}),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
return events;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/widget/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,17 +5,17 @@
|
|
|
5
5
|
* a crosshair on continuous XY charts, and — unlike SVG output — Unovis's
|
|
6
6
|
* real HTML BulletLegend.
|
|
7
7
|
*/
|
|
8
|
-
import { materializeValue } from '../render/materialize.js';
|
|
8
|
+
import { formatNumTick, materializeValue } from '../render/materialize.js';
|
|
9
9
|
const escapeHtml = (value) => String(value)
|
|
10
10
|
.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
11
|
-
const formatValue = (value) => {
|
|
11
|
+
const formatValue = (value, locale) => {
|
|
12
12
|
if (value === null || value === undefined)
|
|
13
13
|
return '—';
|
|
14
14
|
if (typeof value === 'number')
|
|
15
|
-
return value
|
|
15
|
+
return formatNumTick(value, locale);
|
|
16
16
|
return escapeHtml(value);
|
|
17
17
|
};
|
|
18
|
-
const row = (label, value) => `<div class="uv-tt-row"><span class="uv-tt-key">${escapeHtml(label)}</span><span class="uv-tt-val">${formatValue(value)}</span></div>`;
|
|
18
|
+
const row = (label, value, locale) => `<div class="uv-tt-row"><span class="uv-tt-key">${escapeHtml(label)}</span><span class="uv-tt-val">${formatValue(value, locale)}</span></div>`;
|
|
19
19
|
const title = (text) => `<div class="uv-tt-title">${escapeHtml(text)}</div>`;
|
|
20
20
|
/** Field names referenced by a component config, in declaration order —
|
|
21
21
|
* used to show the fields the chart actually plots, not every data column. */
|
|
@@ -41,14 +41,14 @@ function specFields(config) {
|
|
|
41
41
|
}
|
|
42
42
|
/** Records carry internal Unovis state under `_`-prefixed keys */
|
|
43
43
|
const publicEntries = (datum) => Object.entries(datum ?? {}).filter(([key, value]) => !key.startsWith('_') && (value === null || typeof value !== 'object'));
|
|
44
|
-
function recordTooltip(fields, labelField) {
|
|
44
|
+
function recordTooltip(fields, labelField, locale) {
|
|
45
45
|
return (d) => {
|
|
46
46
|
if (!d)
|
|
47
47
|
return '';
|
|
48
48
|
const head = labelField && d[labelField] !== undefined ? title(d[labelField]) : '';
|
|
49
49
|
const shown = fields.length
|
|
50
|
-
? fields.filter(f => d[f] !== undefined).map(f => row(f, d[f]))
|
|
51
|
-
: publicEntries(d).map(([key, value]) => row(key, value));
|
|
50
|
+
? fields.filter(f => d[f] !== undefined).map(f => row(f, d[f], locale))
|
|
51
|
+
: publicEntries(d).map(([key, value]) => row(key, value, locale));
|
|
52
52
|
return `${head}${shown.join('')}` || title('no data');
|
|
53
53
|
};
|
|
54
54
|
}
|
|
@@ -57,8 +57,12 @@ export function buildInteractions(lib, spec) {
|
|
|
57
57
|
const containerConfig = {};
|
|
58
58
|
const triggers = {};
|
|
59
59
|
for (const component of spec.components) {
|
|
60
|
+
// A variant bundle may not carry this component — let the materializer
|
|
61
|
+
// report it instead of crashing on lib.X.selectors
|
|
62
|
+
if (!lib[component.type])
|
|
63
|
+
continue;
|
|
60
64
|
const fields = specFields(component.config);
|
|
61
|
-
const generic = recordTooltip(fields);
|
|
65
|
+
const generic = recordTooltip(fields, undefined, spec.locale);
|
|
62
66
|
switch (component.type) {
|
|
63
67
|
case 'Line':
|
|
64
68
|
case 'Area':
|
|
@@ -126,19 +130,25 @@ export function buildInteractions(lib, spec) {
|
|
|
126
130
|
containerConfig.tooltip = new lib.Tooltip({ triggers, horizontalPlacement: 'center' });
|
|
127
131
|
}
|
|
128
132
|
if (usesCrosshair && crosshairComponent) {
|
|
129
|
-
const x = materializeValue(crosshairComponent.config.x);
|
|
133
|
+
const x = materializeValue(crosshairComponent.config.x, spec.locale);
|
|
130
134
|
const yFields = specFields(crosshairComponent.config)
|
|
131
135
|
.filter(f => f !== crosshairComponent.config.x?.$field);
|
|
132
136
|
const labels = spec.legend?.map(item => item.name) ?? yFields;
|
|
133
137
|
const xField = crosshairComponent.config.x?.$field;
|
|
138
|
+
// Format the header with the x axis's own tick formatter — the raw value
|
|
139
|
+
// on a time axis is epoch milliseconds
|
|
140
|
+
const headFormat = spec.xAxis?.tickFormat
|
|
141
|
+
? materializeValue(spec.xAxis.tickFormat, spec.locale)
|
|
142
|
+
: undefined;
|
|
134
143
|
containerConfig.crosshair = new lib.Crosshair({
|
|
135
144
|
x,
|
|
136
145
|
// Crosshair places one marker per y accessor — without these it warns
|
|
137
146
|
// and renders only the vertical line
|
|
138
|
-
y: materializeValue(crosshairComponent.config.y),
|
|
147
|
+
y: materializeValue(crosshairComponent.config.y, spec.locale),
|
|
139
148
|
template: (d) => {
|
|
140
|
-
const
|
|
141
|
-
const
|
|
149
|
+
const xValue = xField ? d?.[xField] : undefined;
|
|
150
|
+
const head = xValue !== undefined ? title(headFormat ? headFormat(xValue) : xValue) : '';
|
|
151
|
+
const rows = yFields.map((f, i) => row(labels[i] ?? f, d?.[f], spec.locale));
|
|
142
152
|
return `${head}${rows.join('')}`;
|
|
143
153
|
},
|
|
144
154
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactions.js","sourceRoot":"","sources":["../../src/widget/interactions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"interactions.js","sourceRoot":"","sources":["../../src/widget/interactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(()=>{var f=Uint8Array,S=Uint16Array,xr=Int32Array,er=new f([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),ir=new f([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),zr=new f([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),ar=function(r,t){for(var n=new S(31),e=0;e<31;++e)n[e]=t+=1<<r[e-1];for(var i=new xr(n[30]),e=1;e<30;++e)for(var l=n[e];l<n[e+1];++l)i[l]=l-n[e]<<5|e;return{b:n,r:i}},or=ar(er,2),sr=or.b,Ar=or.r;sr[28]=258,Ar[258]=28;var fr=ar(ir,0),Mr=fr.b,dr=fr.r,W=new S(32768);for(o=0;o<32768;++o)g=(o&43690)>>1|(o&21845)<<1,g=(g&52428)>>2|(g&13107)<<2,g=(g&61680)>>4|(g&3855)<<4,W[o]=((g&65280)>>8|(g&255)<<8)>>1;var g,o,I=(function(r,t,n){for(var e=r.length,i=0,l=new S(t);i<e;++i)r[i]&&++l[r[i]-1];var y=new S(t);for(i=1;i<t;++i)y[i]=y[i-1]+l[i-1]<<1;var p;if(n){p=new S(1<<t);var z=15-t;for(i=0;i<e;++i)if(r[i])for(var C=i<<4|r[i],w=t-r[i],a=y[r[i]-1]++<<w,s=a|(1<<w)-1;a<=s;++a)p[W[a]>>z]=C}else for(p=new S(e),i=0;i<e;++i)r[i]&&(p[i]=W[y[r[i]-1]++]>>15-r[i]);return p}),B=new f(288);for(o=0;o<144;++o)B[o]=8;var o;for(o=144;o<256;++o)B[o]=9;var o;for(o=256;o<280;++o)B[o]=7;var o;for(o=280;o<288;++o)B[o]=8;var o,hr=new f(32);for(o=0;o<32;++o)hr[o]=5;var o;var Sr=I(B,9,1);var Cr=I(hr,5,1),R=function(r){for(var t=r[0],n=1;n<r.length;++n)r[n]>t&&(t=r[n]);return t},v=function(r,t,n){var e=t/8|0;return(r[e]|r[e+1]<<8)>>(t&7)&n},V=function(r,t){var n=t/8|0;return(r[n]|r[n+1]<<8|r[n+2]<<16)>>(t&7)},Ur=function(r){return(r+7)/8|0},ur=function(r,t,n){return(t==null||t<0)&&(t=0),(n==null||n>r.length)&&(n=r.length),new f(r.subarray(t,n))};var Fr=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],u=function(r,t,n){var e=new Error(t||Fr[r]);if(e.code=r,Error.captureStackTrace&&Error.captureStackTrace(e,u),!n)throw e;return e},Dr=function(r,t,n,e){var i=r.length,l=e?e.length:0;if(!i||t.f&&!t.l)return n||new f(0);var y=!n,p=y||t.i!=2,z=t.i;y&&(n=new f(i*3));var C=function(rr){var tr=n.length;if(rr>tr){var nr=new f(Math.max(tr*2,rr));nr.set(n),n=nr}},w=t.f||0,a=t.p||0,s=t.b||0,x=t.l,E=t.d,U=t.m,F=t.n,d=i*8;do{if(!x){w=v(r,a,1);var G=v(r,a+1,3);if(a+=3,G)if(G==1)x=Sr,E=Cr,U=9,F=5;else if(G==2){var L=v(r,a,31)+257,j=v(r,a+10,15)+4,k=L+v(r,a+5,31)+1;a+=14;for(var D=new f(k),$=new f(19),h=0;h<j;++h)$[zr[h]]=v(r,a+h*3,7);a+=j*3;for(var J=R($),pr=(1<<J)-1,gr=I($,J,1),h=0;h<k;){var K=gr[v(r,a,pr)];a+=K&15;var c=K>>4;if(c<16)D[h++]=c;else{var A=0,Z=0;for(c==16?(Z=3+v(r,a,3),a+=2,A=D[h-1]):c==17?(Z=3+v(r,a,7),a+=3):c==18&&(Z=11+v(r,a,127),a+=7);Z--;)D[h++]=A}}var Q=D.subarray(0,L),m=D.subarray(L);U=R(Q),F=R(m),x=I(Q,U,1),E=I(m,F,1)}else u(1);else{var c=Ur(a)+4,O=r[c-4]|r[c-3]<<8,q=c+O;if(q>i){z&&u(0);break}p&&C(s+O),n.set(r.subarray(c,q),s),t.b=s+=O,t.p=a=q*8,t.f=w;continue}if(a>d){z&&u(0);break}}p&&C(s+131072);for(var yr=(1<<U)-1,wr=(1<<F)-1,P=a;;P=a){var A=x[V(r,a)&yr],M=A>>4;if(a+=A&15,a>d){z&&u(0);break}if(A||u(2),M<256)n[s++]=M;else if(M==256){P=a,x=null;break}else{var X=M-254;if(M>264){var h=M-257,T=er[h];X=v(r,a,(1<<T)-1)+sr[h],a+=T}var H=E[V(r,a)&wr],N=H>>4;H||u(3),a+=H&15;var m=Mr[N];if(N>3){var T=ir[N];m+=V(r,a)&(1<<T)-1,a+=T}if(a>d){z&&u(0);break}p&&C(s+131072);var b=s+X;if(s<m){var _=l-m,mr=Math.min(m,b);for(_+s<0&&u(3);s<mr;++s)n[s]=e[_+s]}for(;s<b;++s)n[s]=n[s-m]}}t.l=x,t.p=P,t.b=s,t.f=w,x&&(w=1,t.m=U,t.d=E,t.n=F)}while(!w);return s!=n.length&&y?ur(n,0,s):n.subarray(0,s)};var Tr=new f(0);var Ir=function(r){(r[0]!=31||r[1]!=139||r[2]!=8)&&u(6,"invalid gzip data");var t=r[3],n=10;t&4&&(n+=(r[10]|r[11]<<8)+2);for(var e=(t>>3&1)+(t>>4&1);e>0;e-=!r[n++]);return n+(t&2)},Br=function(r){var t=r.length;return(r[t-4]|r[t-3]<<8|r[t-2]<<16|r[t-1]<<24)>>>0};function lr(r,t){var n=Ir(r);return n+8>r.length&&u(6,"invalid gzip data"),Dr(r.subarray(n,-8),{i:2},t&&t.out||new f(Br(r)),t&&t.dictionary)}var Y=typeof TextDecoder<"u"&&new TextDecoder,Er=0;try{Y.decode(Tr,{stream:!0}),Er=1}catch{}var Zr=function(r){for(var t="",n=0;;){var e=r[n++],i=(e>127)+(e>223)+(e>239);if(n+i>r.length)return{s:t,r:ur(r,n-1)};i?i==3?(e=((e&15)<<18|(r[n++]&63)<<12|(r[n++]&63)<<6|r[n++]&63)-65536,t+=String.fromCharCode(55296|e>>10,56320|e&1023)):i&1?t+=String.fromCharCode((e&31)<<6|r[n++]&63):t+=String.fromCharCode((e&15)<<12|(r[n++]&63)<<6|r[n++]&63):t+=String.fromCharCode(e)}};function vr(r,t){if(t){for(var n="",e=0;e<r.length;e+=16384)n+=String.fromCharCode.apply(null,r.subarray(e,e+16384));return n}else{if(Y)return Y.decode(r);var i=Zr(r),l=i.s,n=i.r;return n.length&&u(8),l}}var cr=document.getElementById("uv-bundle-gz");if(cr?.textContent)try{let r=cr.textContent.replace(/\s+/g,""),t=Uint8Array.from(atob(r),i=>i.charCodeAt(0)),n=vr(lr(t)),e=document.createElement("script");e.textContent=n,document.head.appendChild(e)}catch(r){let t=document.createElement("div");t.className="uv-error",t.textContent=`Failed to unpack the chart bundle: ${String(r instanceof Error?r.message:r)}`,document.body.replaceChildren(t)}})();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unpack.js","sourceRoot":"","sources":["../../src/widget/unpack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAE9C,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,CAAA;AACvD,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACnD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9D,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;QAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QAC/C,MAAM,CAAC,WAAW,GAAG,MAAM,CAAA;QAC3B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;IACnC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QACxC,EAAE,CAAC,SAAS,GAAG,UAAU,CAAA;QACzB,EAAE,CAAC,WAAW,GAAG,sCAAsC,MAAM,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACnG,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;IACnC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Widget bundle variants.
|
|
2
|
+
*
|
|
3
|
+
* Most real charts are XY or radial; the network/flow/geo families carry the
|
|
4
|
+
* heavy dependencies (dagre + d3-force for Graph, d3-geo + topojson for maps,
|
|
5
|
+
* d3-sankey…). Two prebuilt bundles split along that line, and the document
|
|
6
|
+
* builder picks per spec — so a bar chart never ships graph-layout engines.
|
|
7
|
+
*
|
|
8
|
+
* `scripts/build-widget.mjs` reads this list (it filters unovis-slim.ts by
|
|
9
|
+
* export name), so adding a component here is the single switch.
|
|
10
|
+
*/
|
|
11
|
+
export declare const STANDARD_COMPONENTS: readonly string[];
|
|
12
|
+
export type BundleVariant = 'standard' | 'full';
|
|
13
|
+
/** The smallest prebuilt bundle that covers every listed component type */
|
|
14
|
+
export declare function bundleVariantFor(componentTypes: string[]): BundleVariant;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Widget bundle variants.
|
|
2
|
+
*
|
|
3
|
+
* Most real charts are XY or radial; the network/flow/geo families carry the
|
|
4
|
+
* heavy dependencies (dagre + d3-force for Graph, d3-geo + topojson for maps,
|
|
5
|
+
* d3-sankey…). Two prebuilt bundles split along that line, and the document
|
|
6
|
+
* builder picks per spec — so a bar chart never ships graph-layout engines.
|
|
7
|
+
*
|
|
8
|
+
* `scripts/build-widget.mjs` reads this list (it filters unovis-slim.ts by
|
|
9
|
+
* export name), so adding a component here is the single switch.
|
|
10
|
+
*/
|
|
11
|
+
export const STANDARD_COMPONENTS = [
|
|
12
|
+
'XYContainer', 'SingleContainer',
|
|
13
|
+
'Axis', 'Line', 'Area', 'GroupedBar', 'StackedBar', 'Scatter',
|
|
14
|
+
'Timeline', 'Boxplot', 'XYLabels', 'Plotband', 'Plotline',
|
|
15
|
+
'Donut', 'NestedDonut', 'RadialBar',
|
|
16
|
+
'Tooltip', 'Crosshair', 'BulletLegend',
|
|
17
|
+
];
|
|
18
|
+
/** The smallest prebuilt bundle that covers every listed component type */
|
|
19
|
+
export function bundleVariantFor(componentTypes) {
|
|
20
|
+
return componentTypes.every(type => STANDARD_COMPONENTS.includes(type)) ? 'standard' : 'full';
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=variants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variants.js","sourceRoot":"","sources":["../../src/widget/variants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAsB;IACpD,aAAa,EAAE,iBAAiB;IAChC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS;IAC7D,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;IACzD,OAAO,EAAE,aAAa,EAAE,WAAW;IACnC,SAAS,EAAE,WAAW,EAAE,cAAc;CACvC,CAAA;AAID,2EAA2E;AAC3E,MAAM,UAAU,gBAAgB,CAAE,cAAwB;IACxD,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAA;AAC/F,CAAC"}
|
package/docs/README.md
CHANGED
|
@@ -12,7 +12,8 @@ rendered locally in Node, with no browser and no remote services.
|
|
|
12
12
|
| [Output types](./output-types.md) | `svg`, `png`, `html`, `interactive`, `config`, `code` — what each returns and when to use it |
|
|
13
13
|
| [Chart spec](./chart-spec.md) | The JSON IR behind every chart: containers, components, accessor references |
|
|
14
14
|
| [Programmatic use](./programmatic.md) | Use it as a library: `renderChart`, the `renderToSvg` SSR primitive, PNG rasterization, embedding the tools in your own MCP server |
|
|
15
|
-
| [Interactive charts](./interactive.md) | The browser widget, self-contained HTML, iframe embedding, MCP
|
|
15
|
+
| [Interactive charts](./interactive.md) | The browser widget, self-contained HTML, iframe embedding, the MCP Apps extension |
|
|
16
|
+
| [Native WebViews](./webview.md) | React Native embedding: the bridge, theme switching without reloads, version pinning |
|
|
16
17
|
| [Architecture](./architecture.md) | How headless rendering actually works, and why each piece exists |
|
|
17
18
|
| [Troubleshooting](./troubleshooting.md) | Fonts, blank charts, timeouts, large data, known limitations |
|
|
18
19
|
|