@seed-ship/mcp-ui-solid 4.0.0 → 4.0.2
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/dist/components/DataPreviewSection.cjs +145 -104
- package/dist/components/DataPreviewSection.cjs.map +1 -1
- package/dist/components/DataPreviewSection.d.ts +1 -1
- package/dist/components/DataPreviewSection.d.ts.map +1 -1
- package/dist/components/DataPreviewSection.js +147 -106
- package/dist/components/DataPreviewSection.js.map +1 -1
- package/dist/components/ScratchpadPanel.cjs +54 -34
- package/dist/components/ScratchpadPanel.cjs.map +1 -1
- package/dist/components/ScratchpadPanel.js +54 -34
- package/dist/components/ScratchpadPanel.js.map +1 -1
- package/package.json +1 -1
- package/src/components/DataPreviewSection.tsx +148 -103
- package/src/components/ScratchpadPanel.tsx +35 -17
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const web = require("solid-js/web");
|
|
4
4
|
const solidJs = require("solid-js");
|
|
5
|
-
var _tmpl$ = /* @__PURE__ */ web.template(`<span class=font-medium>`), _tmpl$
|
|
5
|
+
var _tmpl$ = /* @__PURE__ */ web.template(`<div class="text-xs text-amber-600 dark:text-amber-400 p-2">[DataPreviewSection] Invalid content format`), _tmpl$2 = /* @__PURE__ */ web.template(`<span class=font-medium>`), _tmpl$3 = /* @__PURE__ */ web.template(`<span class="px-1.5 py-0.5 rounded bg-blue-50 dark:bg-blue-900/20 text-blue-700 dark:text-blue-300">`), _tmpl$4 = /* @__PURE__ */ web.template(`<div class="flex items-center gap-1"><button class="px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors"title="Export CSV">CSV</button><button class="px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors"title="Export JSON">JSON`), _tmpl$5 = /* @__PURE__ */ web.template(`<div class="flex items-center gap-1"><button class="px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 transition-colors">«</button><span><!$><!/> / <!$><!/></span><button class="px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 transition-colors">»`), _tmpl$6 = /* @__PURE__ */ web.template(`<div class=data-preview-section><div class="flex items-center justify-between mb-2"><div class="flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400"><!$><!/><!$><!/></div><!$><!/></div><div class="overflow-x-auto rounded border border-gray-200 dark:border-gray-700"><table class="w-full text-sm"><thead><tr class="bg-gray-50 dark:bg-gray-800"></tr></thead><tbody></tbody></table></div><div class="flex items-center justify-between mt-2 text-xs text-gray-500 dark:text-gray-400"><span></span><!$><!/>`), _tmpl$7 = /* @__PURE__ */ web.template(`<th class="px-3 py-2 font-medium text-xs text-gray-600 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700">`), _tmpl$8 = /* @__PURE__ */ web.template(`<tr class="border-b border-gray-100 dark:border-gray-800 hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors">`), _tmpl$9 = /* @__PURE__ */ web.template(`<td class="px-3 py-2 text-gray-800 dark:text-gray-200">`);
|
|
6
6
|
function formatNumber(value, format) {
|
|
7
7
|
if (typeof value !== "number" || !isFinite(value)) return String(value ?? "");
|
|
8
8
|
if (format === "percent") return `${(value * 100).toFixed(1)}%`;
|
|
@@ -46,22 +46,55 @@ function downloadFile(content, filename, mimeType) {
|
|
|
46
46
|
a.click();
|
|
47
47
|
URL.revokeObjectURL(url);
|
|
48
48
|
}
|
|
49
|
+
function resolveContent(raw) {
|
|
50
|
+
if (!raw || typeof raw !== "object") return null;
|
|
51
|
+
const obj = raw;
|
|
52
|
+
if (Array.isArray(obj.columns) && Array.isArray(obj.rows)) {
|
|
53
|
+
return obj;
|
|
54
|
+
}
|
|
55
|
+
if (obj.content && typeof obj.content === "object") {
|
|
56
|
+
const inner = obj.content;
|
|
57
|
+
if (Array.isArray(inner.columns) && Array.isArray(inner.rows)) {
|
|
58
|
+
return inner;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
49
63
|
function DataPreviewSection(props) {
|
|
50
|
-
const content = () =>
|
|
51
|
-
|
|
64
|
+
const content = solidJs.createMemo(() => {
|
|
65
|
+
const resolved = resolveContent(props.content);
|
|
66
|
+
if (!resolved) {
|
|
67
|
+
console.warn("[MCP-UI] DataPreviewSection: invalid content — expected { columns: [...], rows: [...] }, got:", props.content);
|
|
68
|
+
}
|
|
69
|
+
return resolved;
|
|
70
|
+
});
|
|
71
|
+
const columns = () => {
|
|
72
|
+
var _a;
|
|
73
|
+
return ((_a = content()) == null ? void 0 : _a.columns) || [];
|
|
74
|
+
};
|
|
75
|
+
const rows = () => {
|
|
76
|
+
var _a;
|
|
77
|
+
return ((_a = content()) == null ? void 0 : _a.rows) || [];
|
|
78
|
+
};
|
|
79
|
+
const pageSize = () => {
|
|
80
|
+
var _a;
|
|
81
|
+
return ((_a = content()) == null ? void 0 : _a.pageSize) || 25;
|
|
82
|
+
};
|
|
52
83
|
const [page, setPage] = solidJs.createSignal(0);
|
|
53
|
-
const totalRows = () =>
|
|
84
|
+
const totalRows = () => rows().length;
|
|
54
85
|
const totalPages = () => Math.max(1, Math.ceil(totalRows() / pageSize()));
|
|
55
86
|
const pagedRows = solidJs.createMemo(() => {
|
|
56
87
|
const start = page() * pageSize();
|
|
57
|
-
return
|
|
88
|
+
return rows().slice(start, start + pageSize());
|
|
58
89
|
});
|
|
59
90
|
const handleExportCSV = () => {
|
|
60
|
-
const
|
|
91
|
+
const c = content();
|
|
92
|
+
if (!c) return;
|
|
93
|
+
const csv = toCSV(c.columns, c.rows);
|
|
61
94
|
downloadFile(csv, "data-export.csv", "text/csv;charset=utf-8");
|
|
62
95
|
};
|
|
63
96
|
const handleExportJSON = () => {
|
|
64
|
-
const json = JSON.stringify(
|
|
97
|
+
const json = JSON.stringify(rows(), null, 2);
|
|
65
98
|
downloadFile(json, "data-export.json", "application/json");
|
|
66
99
|
};
|
|
67
100
|
const columnAlign = (col) => {
|
|
@@ -69,103 +102,111 @@ function DataPreviewSection(props) {
|
|
|
69
102
|
if (col.type === "number") return "right";
|
|
70
103
|
return "left";
|
|
71
104
|
};
|
|
72
|
-
return (
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
105
|
+
return web.createComponent(solidJs.Show, {
|
|
106
|
+
get when() {
|
|
107
|
+
return content();
|
|
108
|
+
},
|
|
109
|
+
get fallback() {
|
|
110
|
+
return web.getNextElement(_tmpl$);
|
|
111
|
+
},
|
|
112
|
+
children: (c) => (() => {
|
|
113
|
+
var _el$2 = web.getNextElement(_tmpl$6), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$7 = _el$4.firstChild, [_el$8, _co$] = web.getNextMarker(_el$7.nextSibling), _el$9 = _el$8.nextSibling, [_el$0, _co$2] = web.getNextMarker(_el$9.nextSibling), _el$12 = _el$4.nextSibling, [_el$13, _co$3] = web.getNextMarker(_el$12.nextSibling), _el$14 = _el$3.nextSibling, _el$15 = _el$14.firstChild, _el$16 = _el$15.firstChild, _el$17 = _el$16.firstChild, _el$18 = _el$16.nextSibling, _el$19 = _el$14.nextSibling, _el$20 = _el$19.firstChild, _el$30 = _el$20.nextSibling, [_el$31, _co$6] = web.getNextMarker(_el$30.nextSibling);
|
|
114
|
+
web.insert(_el$4, web.createComponent(solidJs.Show, {
|
|
115
|
+
get when() {
|
|
116
|
+
return c().source;
|
|
117
|
+
},
|
|
118
|
+
get children() {
|
|
119
|
+
var _el$5 = web.getNextElement(_tmpl$2);
|
|
120
|
+
web.insert(_el$5, () => c().source);
|
|
121
|
+
return _el$5;
|
|
122
|
+
}
|
|
123
|
+
}), _el$8, _co$);
|
|
124
|
+
web.insert(_el$4, web.createComponent(solidJs.Show, {
|
|
125
|
+
get when() {
|
|
126
|
+
return c().freshness;
|
|
127
|
+
},
|
|
128
|
+
get children() {
|
|
129
|
+
var _el$6 = web.getNextElement(_tmpl$3);
|
|
130
|
+
web.insert(_el$6, () => c().freshness);
|
|
131
|
+
return _el$6;
|
|
132
|
+
}
|
|
133
|
+
}), _el$0, _co$2);
|
|
134
|
+
web.insert(_el$3, web.createComponent(solidJs.Show, {
|
|
135
|
+
get when() {
|
|
136
|
+
return c().exportable !== false;
|
|
137
|
+
},
|
|
138
|
+
get children() {
|
|
139
|
+
var _el$1 = web.getNextElement(_tmpl$4), _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling;
|
|
140
|
+
_el$10.$$click = handleExportCSV;
|
|
141
|
+
_el$11.$$click = handleExportJSON;
|
|
142
|
+
web.runHydrationEvents();
|
|
143
|
+
return _el$1;
|
|
144
|
+
}
|
|
145
|
+
}), _el$13, _co$3);
|
|
146
|
+
web.insert(_el$17, web.createComponent(solidJs.For, {
|
|
147
|
+
get each() {
|
|
148
|
+
return columns();
|
|
149
|
+
},
|
|
150
|
+
children: (col) => (() => {
|
|
151
|
+
var _el$32 = web.getNextElement(_tmpl$7);
|
|
152
|
+
web.insert(_el$32, () => col.label);
|
|
153
|
+
web.effect((_$p) => web.setStyleProperty(_el$32, "text-align", columnAlign(col)));
|
|
154
|
+
return _el$32;
|
|
155
|
+
})()
|
|
156
|
+
}));
|
|
157
|
+
web.insert(_el$18, web.createComponent(solidJs.For, {
|
|
158
|
+
get each() {
|
|
159
|
+
return pagedRows();
|
|
160
|
+
},
|
|
161
|
+
children: (row, i) => (() => {
|
|
162
|
+
var _el$33 = web.getNextElement(_tmpl$8);
|
|
163
|
+
web.insert(_el$33, web.createComponent(solidJs.For, {
|
|
164
|
+
get each() {
|
|
165
|
+
return columns();
|
|
166
|
+
},
|
|
167
|
+
children: (col) => (() => {
|
|
168
|
+
var _el$34 = web.getNextElement(_tmpl$9);
|
|
169
|
+
web.insert(_el$34, () => formatCell(row[col.key], col));
|
|
170
|
+
web.effect((_$p) => web.setStyleProperty(_el$34, "text-align", columnAlign(col)));
|
|
171
|
+
return _el$34;
|
|
172
|
+
})()
|
|
173
|
+
}));
|
|
174
|
+
web.effect((_$p) => web.classList(_el$33, {
|
|
175
|
+
"bg-gray-25 dark:bg-gray-850": i() % 2 === 1
|
|
176
|
+
}, _$p));
|
|
177
|
+
return _el$33;
|
|
178
|
+
})()
|
|
179
|
+
}));
|
|
180
|
+
web.insert(_el$20, (() => {
|
|
181
|
+
var _c$ = web.memo(() => !!c().totalRows);
|
|
182
|
+
return () => _c$() ? `${totalRows()} / ${c().totalRows.toLocaleString("fr-FR")} rows` : `${totalRows()} row${totalRows() !== 1 ? "s" : ""}`;
|
|
183
|
+
})());
|
|
184
|
+
web.insert(_el$19, web.createComponent(solidJs.Show, {
|
|
185
|
+
get when() {
|
|
186
|
+
return totalPages() > 1;
|
|
187
|
+
},
|
|
188
|
+
get children() {
|
|
189
|
+
var _el$21 = web.getNextElement(_tmpl$5), _el$22 = _el$21.firstChild, _el$23 = _el$22.nextSibling, _el$25 = _el$23.firstChild, [_el$26, _co$4] = web.getNextMarker(_el$25.nextSibling), _el$24 = _el$26.nextSibling, _el$27 = _el$24.nextSibling, [_el$28, _co$5] = web.getNextMarker(_el$27.nextSibling), _el$29 = _el$23.nextSibling;
|
|
190
|
+
_el$22.$$click = () => setPage((p) => p - 1);
|
|
191
|
+
web.insert(_el$23, () => page() + 1, _el$26, _co$4);
|
|
192
|
+
web.insert(_el$23, totalPages, _el$28, _co$5);
|
|
193
|
+
_el$29.$$click = () => setPage((p) => p + 1);
|
|
194
|
+
web.effect((_p$) => {
|
|
195
|
+
var _v$ = page() === 0, _v$2 = page() >= totalPages() - 1;
|
|
196
|
+
_v$ !== _p$.e && web.setProperty(_el$22, "disabled", _p$.e = _v$);
|
|
197
|
+
_v$2 !== _p$.t && web.setProperty(_el$29, "disabled", _p$.t = _v$2);
|
|
198
|
+
return _p$;
|
|
199
|
+
}, {
|
|
200
|
+
e: void 0,
|
|
201
|
+
t: void 0
|
|
202
|
+
});
|
|
203
|
+
web.runHydrationEvents();
|
|
204
|
+
return _el$21;
|
|
205
|
+
}
|
|
206
|
+
}), _el$31, _co$6);
|
|
207
|
+
return _el$2;
|
|
208
|
+
})()
|
|
209
|
+
});
|
|
169
210
|
}
|
|
170
211
|
web.delegateEvents(["click"]);
|
|
171
212
|
exports.DataPreviewSection = DataPreviewSection;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataPreviewSection.cjs","sources":["../../src/components/DataPreviewSection.tsx"],"sourcesContent":["/**\n * DataPreviewSection — paginated data table with export\n * v3.1.0: Replaces LLM-generated markdown tables with exact source data\n *\n * @experimental\n *\n * Features:\n * - Column types (number right-aligned, string left-aligned)\n * - Pagination (configurable page size)\n * - CSV / JSON export buttons\n * - Source attribution + freshness label\n * - Number formatting (FR locale)\n */\n\nimport { createSignal, createMemo, For, Show } from 'solid-js'\nimport type { DataPreviewContent, DataPreviewColumn } from '../types/chat-bus'\n\nexport interface DataPreviewSectionProps {\n content: DataPreviewContent\n}\n\n/** Format a number for display (French locale) */\nfunction formatNumber(value: unknown, format?: string): string {\n if (typeof value !== 'number' || !isFinite(value)) return String(value ?? '')\n // Simple formatting: use locale\n if (format === 'percent') return `${(value * 100).toFixed(1)}%`\n if (format === 'currency') return `${value.toLocaleString('fr-FR')} EUR`\n if (Number.isInteger(value)) return value.toLocaleString('fr-FR')\n return value.toLocaleString('fr-FR', { maximumFractionDigits: 2 })\n}\n\n/** Format a cell value based on column type */\nfunction formatCell(value: unknown, col: DataPreviewColumn): string {\n if (value == null) return '—'\n if (col.type === 'number') return formatNumber(value, col.format)\n if (col.type === 'date' && typeof value === 'string') {\n try {\n return new Date(value).toLocaleDateString('fr-FR')\n } catch {\n return value\n }\n }\n return String(value)\n}\n\n/** Generate CSV from columns + rows */\nfunction toCSV(columns: DataPreviewColumn[], rows: Record<string, unknown>[]): string {\n const header = columns.map(c => `\"${c.label.replace(/\"/g, '\"\"')}\"`).join(';')\n const body = rows.map(row =>\n columns.map(c => {\n const val = row[c.key]\n if (val == null) return ''\n if (typeof val === 'string') return `\"${val.replace(/\"/g, '\"\"')}\"`\n return String(val)\n }).join(';')\n ).join('\\n')\n return `${header}\\n${body}`\n}\n\n/** Trigger browser download */\nfunction downloadFile(content: string, filename: string, mimeType: string) {\n const blob = new Blob([content], { type: mimeType })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n URL.revokeObjectURL(url)\n}\n\nexport function DataPreviewSection(props: DataPreviewSectionProps) {\n const content = () => props.content\n const pageSize = () => content().pageSize || 25\n const [page, setPage] = createSignal(0)\n\n const totalRows = () => content().rows.length\n const totalPages = () => Math.max(1, Math.ceil(totalRows() / pageSize()))\n\n const pagedRows = createMemo(() => {\n const start = page() * pageSize()\n return content().rows.slice(start, start + pageSize())\n })\n\n const handleExportCSV = () => {\n const csv = toCSV(content().columns, content().rows)\n downloadFile(csv, 'data-export.csv', 'text/csv;charset=utf-8')\n }\n\n const handleExportJSON = () => {\n const json = JSON.stringify(content().rows, null, 2)\n downloadFile(json, 'data-export.json', 'application/json')\n }\n\n const columnAlign = (col: DataPreviewColumn) => {\n if (col.align) return col.align\n if (col.type === 'number') return 'right'\n return 'left'\n }\n\n return (\n <div class=\"data-preview-section\">\n {/* Header with source + export */}\n <div class=\"flex items-center justify-between mb-2\">\n <div class=\"flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400\">\n <Show when={content().source}>\n <span class=\"font-medium\">{content().source}</span>\n </Show>\n <Show when={content().freshness}>\n <span class=\"px-1.5 py-0.5 rounded bg-blue-50 dark:bg-blue-900/20 text-blue-700 dark:text-blue-300\">\n {content().freshness}\n </span>\n </Show>\n </div>\n\n <Show when={content().exportable !== false}>\n <div class=\"flex items-center gap-1\">\n <button\n class=\"px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n onClick={handleExportCSV}\n title=\"Export CSV\"\n >\n CSV\n </button>\n <button\n class=\"px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n onClick={handleExportJSON}\n title=\"Export JSON\"\n >\n JSON\n </button>\n </div>\n </Show>\n </div>\n\n {/* Table */}\n <div class=\"overflow-x-auto rounded border border-gray-200 dark:border-gray-700\">\n <table class=\"w-full text-sm\">\n <thead>\n <tr class=\"bg-gray-50 dark:bg-gray-800\">\n <For each={content().columns}>\n {(col) => (\n <th\n class=\"px-3 py-2 font-medium text-xs text-gray-600 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700\"\n style={{ \"text-align\": columnAlign(col) }}\n >\n {col.label}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={pagedRows()}>\n {(row, i) => (\n <tr\n class=\"border-b border-gray-100 dark:border-gray-800 hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors\"\n classList={{ 'bg-gray-25 dark:bg-gray-850': i() % 2 === 1 }}\n >\n <For each={content().columns}>\n {(col) => (\n <td\n class=\"px-3 py-2 text-gray-800 dark:text-gray-200\"\n style={{ \"text-align\": columnAlign(col) }}\n >\n {formatCell(row[col.key], col)}\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n </div>\n\n {/* Footer: pagination + row count */}\n <div class=\"flex items-center justify-between mt-2 text-xs text-gray-500 dark:text-gray-400\">\n <span>\n {content().totalRows\n ? `${totalRows()} / ${content().totalRows!.toLocaleString('fr-FR')} rows`\n : `${totalRows()} row${totalRows() !== 1 ? 's' : ''}`}\n </span>\n\n <Show when={totalPages() > 1}>\n <div class=\"flex items-center gap-1\">\n <button\n class=\"px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 transition-colors\"\n disabled={page() === 0}\n onClick={() => setPage(p => p - 1)}\n >\n «\n </button>\n <span>{page() + 1} / {totalPages()}</span>\n <button\n class=\"px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 transition-colors\"\n disabled={page() >= totalPages() - 1}\n onClick={() => setPage(p => p + 1)}\n >\n »\n </button>\n </div>\n </Show>\n </div>\n </div>\n )\n}\n"],"names":["formatNumber","value","format","isFinite","String","toFixed","toLocaleString","Number","isInteger","maximumFractionDigits","formatCell","col","type","Date","toLocaleDateString","toCSV","columns","rows","header","map","c","label","replace","join","body","row","val","key","downloadFile","content","filename","mimeType","blob","Blob","url","URL","createObjectURL","a","document","createElement","href","download","click","revokeObjectURL","DataPreviewSection","props","pageSize","page","setPage","createSignal","totalRows","length","totalPages","Math","max","ceil","pagedRows","createMemo","start","slice","handleExportCSV","csv","handleExportJSON","json","JSON","stringify","columnAlign","align","_el$","_$getNextElement","_tmpl$5","_el$2","firstChild","_el$3","_el$6","_el$7","_co$","_$getNextMarker","nextSibling","_el$8","_el$9","_co$2","_el$11","_el$12","_co$3","_el$13","_el$14","_el$15","_el$16","_el$17","_el$18","_el$19","_el$29","_el$30","_co$6","_$insert","_$createComponent","Show","when","source","children","_el$4","_tmpl$","freshness","_el$5","_tmpl$2","exportable","_el$0","_tmpl$3","_el$1","_el$10","$$click","_$runHydrationEvents","For","each","_el$31","_tmpl$6","_$effect","_$p","_$setStyleProperty","i","_el$32","_tmpl$7","_el$33","_tmpl$8","_$classList","_c$","_$memo","_el$20","_tmpl$4","_el$21","_el$22","_el$24","_el$25","_co$4","_el$23","_el$26","_el$27","_co$5","_el$28","p","_p$","_v$","_v$2","e","_$setProperty","t","undefined","_$delegateEvents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DataPreviewSection.cjs","sources":["../../src/components/DataPreviewSection.tsx"],"sourcesContent":["/**\n * DataPreviewSection — paginated data table with export\n * v4.0.1: Fixed rendering — defensive guards for store proxy content\n *\n * @experimental\n *\n * Features:\n * - Column types (number right-aligned, string left-aligned)\n * - Pagination (configurable page size)\n * - CSV / JSON export buttons\n * - Source attribution + freshness label\n * - Number formatting (FR locale)\n */\n\nimport { createSignal, createMemo, For, Show } from 'solid-js'\nimport type { DataPreviewContent, DataPreviewColumn } from '../types/chat-bus'\n\nexport interface DataPreviewSectionProps {\n content: DataPreviewContent\n}\n\n/** Format a number for display (French locale) */\nfunction formatNumber(value: unknown, format?: string): string {\n if (typeof value !== 'number' || !isFinite(value)) return String(value ?? '')\n if (format === 'percent') return `${(value * 100).toFixed(1)}%`\n if (format === 'currency') return `${value.toLocaleString('fr-FR')} EUR`\n if (Number.isInteger(value)) return value.toLocaleString('fr-FR')\n return value.toLocaleString('fr-FR', { maximumFractionDigits: 2 })\n}\n\n/** Format a cell value based on column type */\nfunction formatCell(value: unknown, col: DataPreviewColumn): string {\n if (value == null) return '\\u2014'\n if (col.type === 'number') return formatNumber(value, col.format)\n if (col.type === 'date' && typeof value === 'string') {\n try {\n return new Date(value).toLocaleDateString('fr-FR')\n } catch {\n return value\n }\n }\n return String(value)\n}\n\n/** Generate CSV from columns + rows */\nfunction toCSV(columns: DataPreviewColumn[], rows: Record<string, unknown>[]): string {\n const header = columns.map(c => `\"${c.label.replace(/\"/g, '\"\"')}\"`).join(';')\n const body = rows.map(row =>\n columns.map(c => {\n const val = row[c.key]\n if (val == null) return ''\n if (typeof val === 'string') return `\"${val.replace(/\"/g, '\"\"')}\"`\n return String(val)\n }).join(';')\n ).join('\\n')\n return `${header}\\n${body}`\n}\n\n/** Trigger browser download */\nfunction downloadFile(content: string, filename: string, mimeType: string) {\n const blob = new Blob([content], { type: mimeType })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n URL.revokeObjectURL(url)\n}\n\n/**\n * Extract a valid DataPreviewContent from props.content.\n * Handles: direct DataPreviewContent, or wrapped in an extra layer.\n */\nfunction resolveContent(raw: unknown): DataPreviewContent | null {\n if (!raw || typeof raw !== 'object') return null\n const obj = raw as Record<string, unknown>\n\n // Direct shape: { columns: [...], rows: [...] }\n if (Array.isArray(obj.columns) && Array.isArray(obj.rows)) {\n return obj as unknown as DataPreviewContent\n }\n\n // Wrapped shape: { content: { columns: [...], rows: [...] } }\n if (obj.content && typeof obj.content === 'object') {\n const inner = obj.content as Record<string, unknown>\n if (Array.isArray(inner.columns) && Array.isArray(inner.rows)) {\n return inner as unknown as DataPreviewContent\n }\n }\n\n return null\n}\n\nexport function DataPreviewSection(props: DataPreviewSectionProps) {\n const content = createMemo(() => {\n const resolved = resolveContent(props.content)\n if (!resolved) {\n console.warn(\n '[MCP-UI] DataPreviewSection: invalid content — expected { columns: [...], rows: [...] }, got:',\n props.content\n )\n }\n return resolved\n })\n\n const columns = () => content()?.columns || []\n const rows = () => content()?.rows || []\n const pageSize = () => content()?.pageSize || 25\n const [page, setPage] = createSignal(0)\n\n const totalRows = () => rows().length\n const totalPages = () => Math.max(1, Math.ceil(totalRows() / pageSize()))\n\n const pagedRows = createMemo(() => {\n const start = page() * pageSize()\n return rows().slice(start, start + pageSize())\n })\n\n const handleExportCSV = () => {\n const c = content()\n if (!c) return\n const csv = toCSV(c.columns, c.rows)\n downloadFile(csv, 'data-export.csv', 'text/csv;charset=utf-8')\n }\n\n const handleExportJSON = () => {\n const json = JSON.stringify(rows(), null, 2)\n downloadFile(json, 'data-export.json', 'application/json')\n }\n\n const columnAlign = (col: DataPreviewColumn) => {\n if (col.align) return col.align\n if (col.type === 'number') return 'right'\n return 'left'\n }\n\n return (\n <Show when={content()} fallback={\n <div class=\"text-xs text-amber-600 dark:text-amber-400 p-2\">\n [DataPreviewSection] Invalid content format\n </div>\n }>\n {(c) => (\n <div class=\"data-preview-section\">\n {/* Header with source + export */}\n <div class=\"flex items-center justify-between mb-2\">\n <div class=\"flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400\">\n <Show when={c().source}>\n <span class=\"font-medium\">{c().source}</span>\n </Show>\n <Show when={c().freshness}>\n <span class=\"px-1.5 py-0.5 rounded bg-blue-50 dark:bg-blue-900/20 text-blue-700 dark:text-blue-300\">\n {c().freshness}\n </span>\n </Show>\n </div>\n\n <Show when={c().exportable !== false}>\n <div class=\"flex items-center gap-1\">\n <button\n class=\"px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n onClick={handleExportCSV}\n title=\"Export CSV\"\n >\n CSV\n </button>\n <button\n class=\"px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n onClick={handleExportJSON}\n title=\"Export JSON\"\n >\n JSON\n </button>\n </div>\n </Show>\n </div>\n\n {/* Table */}\n <div class=\"overflow-x-auto rounded border border-gray-200 dark:border-gray-700\">\n <table class=\"w-full text-sm\">\n <thead>\n <tr class=\"bg-gray-50 dark:bg-gray-800\">\n <For each={columns()}>\n {(col) => (\n <th\n class=\"px-3 py-2 font-medium text-xs text-gray-600 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700\"\n style={{ \"text-align\": columnAlign(col) }}\n >\n {col.label}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={pagedRows()}>\n {(row, i) => (\n <tr\n class=\"border-b border-gray-100 dark:border-gray-800 hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors\"\n classList={{ 'bg-gray-25 dark:bg-gray-850': i() % 2 === 1 }}\n >\n <For each={columns()}>\n {(col) => (\n <td\n class=\"px-3 py-2 text-gray-800 dark:text-gray-200\"\n style={{ \"text-align\": columnAlign(col) }}\n >\n {formatCell(row[col.key], col)}\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n </div>\n\n {/* Footer: pagination + row count */}\n <div class=\"flex items-center justify-between mt-2 text-xs text-gray-500 dark:text-gray-400\">\n <span>\n {c().totalRows\n ? `${totalRows()} / ${c().totalRows!.toLocaleString('fr-FR')} rows`\n : `${totalRows()} row${totalRows() !== 1 ? 's' : ''}`}\n </span>\n\n <Show when={totalPages() > 1}>\n <div class=\"flex items-center gap-1\">\n <button\n class=\"px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 transition-colors\"\n disabled={page() === 0}\n onClick={() => setPage(p => p - 1)}\n >\n «\n </button>\n <span>{page() + 1} / {totalPages()}</span>\n <button\n class=\"px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 transition-colors\"\n disabled={page() >= totalPages() - 1}\n onClick={() => setPage(p => p + 1)}\n >\n »\n </button>\n </div>\n </Show>\n </div>\n </div>\n )}\n </Show>\n )\n}\n"],"names":["formatNumber","value","format","isFinite","String","toFixed","toLocaleString","Number","isInteger","maximumFractionDigits","formatCell","col","type","Date","toLocaleDateString","toCSV","columns","rows","header","map","c","label","replace","join","body","row","val","key","downloadFile","content","filename","mimeType","blob","Blob","url","URL","createObjectURL","a","document","createElement","href","download","click","revokeObjectURL","resolveContent","raw","obj","Array","isArray","inner","DataPreviewSection","props","createMemo","resolved","console","warn","pageSize","page","setPage","createSignal","totalRows","length","totalPages","Math","max","ceil","pagedRows","start","slice","handleExportCSV","csv","handleExportJSON","json","JSON","stringify","columnAlign","align","_$createComponent","Show","when","fallback","_$getNextElement","_tmpl$","children","_el$2","_tmpl$6","_el$3","firstChild","_el$4","_el$7","_el$8","_co$","_$getNextMarker","nextSibling","_el$9","_el$0","_co$2","_el$12","_el$13","_co$3","_el$14","_el$15","_el$16","_el$17","_el$18","_el$19","_el$20","_el$30","_el$31","_co$6","_$insert","source","_el$5","_tmpl$2","freshness","_el$6","_tmpl$3","exportable","_el$1","_tmpl$4","_el$10","_el$11","$$click","_$runHydrationEvents","For","each","_el$32","_tmpl$7","_$effect","_$p","_$setStyleProperty","i","_el$33","_tmpl$8","_el$34","_tmpl$9","_$classList","_c$","_$memo","_el$21","_tmpl$5","_el$22","_el$23","_el$25","_el$26","_co$4","_el$24","_el$27","_el$28","_co$5","_el$29","p","_p$","_v$","_v$2","e","_$setProperty","t","undefined","_$delegateEvents"],"mappings":";;;;;AAsBA,SAASA,aAAaC,OAAgBC,QAAyB;AAC7D,MAAI,OAAOD,UAAU,YAAY,CAACE,SAASF,KAAK,EAAG,QAAOG,OAAOH,SAAS,EAAE;AAC5E,MAAIC,WAAW,UAAW,QAAO,IAAID,QAAQ,KAAKI,QAAQ,CAAC,CAAC;AAC5D,MAAIH,WAAW,WAAY,QAAO,GAAGD,MAAMK,eAAe,OAAO,CAAC;AAClE,MAAIC,OAAOC,UAAUP,KAAK,EAAG,QAAOA,MAAMK,eAAe,OAAO;AAChE,SAAOL,MAAMK,eAAe,SAAS;AAAA,IAAEG,uBAAuB;AAAA,EAAA,CAAG;AACnE;AAGA,SAASC,WAAWT,OAAgBU,KAAgC;AAClE,MAAIV,SAAS,KAAM,QAAO;AAC1B,MAAIU,IAAIC,SAAS,iBAAiBZ,aAAaC,OAAOU,IAAIT,MAAM;AAChE,MAAIS,IAAIC,SAAS,UAAU,OAAOX,UAAU,UAAU;AACpD,QAAI;AACF,aAAO,IAAIY,KAAKZ,KAAK,EAAEa,mBAAmB,OAAO;AAAA,IACnD,QAAQ;AACN,aAAOb;AAAAA,IACT;AAAA,EACF;AACA,SAAOG,OAAOH,KAAK;AACrB;AAGA,SAASc,MAAMC,SAA8BC,MAAyC;AACpF,QAAMC,SAASF,QAAQG,IAAIC,CAAAA,MAAK,IAAIA,EAAEC,MAAMC,QAAQ,MAAM,IAAI,CAAC,GAAG,EAAEC,KAAK,GAAG;AAC5E,QAAMC,OAAOP,KAAKE,IAAIM,CAAAA,QACpBT,QAAQG,IAAIC,CAAAA,MAAK;AACf,UAAMM,MAAMD,IAAIL,EAAEO,GAAG;AACrB,QAAID,OAAO,KAAM,QAAO;AACxB,QAAI,OAAOA,QAAQ,SAAU,QAAO,IAAIA,IAAIJ,QAAQ,MAAM,IAAI,CAAC;AAC/D,WAAOlB,OAAOsB,GAAG;AAAA,EACnB,CAAC,EAAEH,KAAK,GAAG,CACb,EAAEA,KAAK,IAAI;AACX,SAAO,GAAGL,MAAM;AAAA,EAAKM,IAAI;AAC3B;AAGA,SAASI,aAAaC,SAAiBC,UAAkBC,UAAkB;AACzE,QAAMC,OAAO,IAAIC,KAAK,CAACJ,OAAO,GAAG;AAAA,IAAEjB,MAAMmB;AAAAA,EAAAA,CAAU;AACnD,QAAMG,MAAMC,IAAIC,gBAAgBJ,IAAI;AACpC,QAAMK,IAAIC,SAASC,cAAc,GAAG;AACpCF,IAAEG,OAAON;AACTG,IAAEI,WAAWX;AACbO,IAAEK,MAAAA;AACFP,MAAIQ,gBAAgBT,GAAG;AACzB;AAMA,SAASU,eAAeC,KAAyC;AAC/D,MAAI,CAACA,OAAO,OAAOA,QAAQ,SAAU,QAAO;AAC5C,QAAMC,MAAMD;AAGZ,MAAIE,MAAMC,QAAQF,IAAI9B,OAAO,KAAK+B,MAAMC,QAAQF,IAAI7B,IAAI,GAAG;AACzD,WAAO6B;AAAAA,EACT;AAGA,MAAIA,IAAIjB,WAAW,OAAOiB,IAAIjB,YAAY,UAAU;AAClD,UAAMoB,QAAQH,IAAIjB;AAClB,QAAIkB,MAAMC,QAAQC,MAAMjC,OAAO,KAAK+B,MAAMC,QAAQC,MAAMhC,IAAI,GAAG;AAC7D,aAAOgC;AAAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAASC,mBAAmBC,OAAgC;AACjE,QAAMtB,UAAUuB,QAAAA,WAAW,MAAM;AAC/B,UAAMC,WAAWT,eAAeO,MAAMtB,OAAO;AAC7C,QAAI,CAACwB,UAAU;AACbC,cAAQC,KACN,iGACAJ,MAAMtB,OACR;AAAA,IACF;AACA,WAAOwB;AAAAA,EACT,CAAC;AAED,QAAMrC,UAAUA,MAAAA;;AAAMa,0BAAAA,MAAAA,mBAAWb,YAAW,CAAA;AAAA;AAC5C,QAAMC,OAAOA,MAAAA;;AAAMY,0BAAAA,MAAAA,mBAAWZ,SAAQ,CAAA;AAAA;AACtC,QAAMuC,WAAWA,MAAAA;;AAAM3B,0BAAAA,MAAAA,mBAAW2B,aAAY;AAAA;AAC9C,QAAM,CAACC,MAAMC,OAAO,IAAIC,QAAAA,aAAa,CAAC;AAEtC,QAAMC,YAAYA,MAAM3C,KAAAA,EAAO4C;AAC/B,QAAMC,aAAaA,MAAMC,KAAKC,IAAI,GAAGD,KAAKE,KAAKL,UAAAA,IAAcJ,SAAAA,CAAU,CAAC;AAExE,QAAMU,YAAYd,QAAAA,WAAW,MAAM;AACjC,UAAMe,QAAQV,KAAAA,IAASD,SAAAA;AACvB,WAAOvC,OAAOmD,MAAMD,OAAOA,QAAQX,UAAU;AAAA,EAC/C,CAAC;AAED,QAAMa,kBAAkBA,MAAM;AAC5B,UAAMjD,IAAIS,QAAAA;AACV,QAAI,CAACT,EAAG;AACR,UAAMkD,MAAMvD,MAAMK,EAAEJ,SAASI,EAAEH,IAAI;AACnCW,iBAAa0C,KAAK,mBAAmB,wBAAwB;AAAA,EAC/D;AAEA,QAAMC,mBAAmBA,MAAM;AAC7B,UAAMC,OAAOC,KAAKC,UAAUzD,KAAAA,GAAQ,MAAM,CAAC;AAC3CW,iBAAa4C,MAAM,oBAAoB,kBAAkB;AAAA,EAC3D;AAEA,QAAMG,cAAcA,CAAChE,QAA2B;AAC9C,QAAIA,IAAIiE,MAAO,QAAOjE,IAAIiE;AAC1B,QAAIjE,IAAIC,SAAS,SAAU,QAAO;AAClC,WAAO;AAAA,EACT;AAEA,SAAAiE,IAAAA,gBACGC,QAAAA,MAAI;AAAA,IAAA,IAACC,OAAI;AAAA,aAAElD,QAAAA;AAAAA,IAAS;AAAA,IAAA,IAAEmD,WAAQ;AAAA,aAAAC,IAAAA,eAAAC,MAAA;AAAA,IAAA;AAAA,IAAAC,UAK3B/D,QAAC,MAAA;AAAA,UAAAgE,QAAAH,IAAAA,eAAAI,OAAA,GAAAC,QAAAF,MAAAG,YAAAC,QAAAF,MAAAC,YAAAE,QAAAD,MAAAD,YAAA,CAAAG,OAAAC,IAAA,IAAAC,IAAAA,cAAAH,MAAAI,WAAA,GAAAC,QAAAJ,MAAAG,aAAA,CAAAE,OAAAC,KAAA,IAAAJ,IAAAA,cAAAE,MAAAD,WAAA,GAAAI,SAAAT,MAAAK,aAAA,CAAAK,QAAAC,KAAA,IAAAP,IAAAA,cAAAK,OAAAJ,WAAA,GAAAO,SAAAd,MAAAO,aAAAQ,SAAAD,OAAAb,YAAAe,SAAAD,OAAAd,YAAAgB,SAAAD,OAAAf,YAAAiB,SAAAF,OAAAT,aAAAY,SAAAL,OAAAP,aAAAa,SAAAD,OAAAlB,YAAAoB,SAAAD,OAAAb,aAAA,CAAAe,QAAAC,KAAA,IAAAjB,IAAAA,cAAAe,OAAAd,WAAA;AAAAiB,iBAAAtB,OAAAX,IAAAA,gBAKMC,cAAI;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAE3D,IAAI2F;AAAAA,QAAM;AAAA,QAAA,IAAA5B,WAAA;AAAA,cAAA6B,QAAA/B,IAAAA,eAAAgC,OAAA;AAAAH,cAAAA,OAAAE,OAAA,MACO5F,EAAAA,EAAI2F,MAAM;AAAA,iBAAAC;AAAAA,QAAA;AAAA,MAAA,CAAA,GAAAtB,OAAAC,IAAA;AAAAmB,iBAAAtB,OAAAX,IAAAA,gBAEtCC,cAAI;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAE3D,IAAI8F;AAAAA,QAAS;AAAA,QAAA,IAAA/B,WAAA;AAAA,cAAAgC,QAAAlC,IAAAA,eAAAmC,OAAA;AAAAN,cAAAA,OAAAK,OAAA,MAEpB/F,EAAAA,EAAI8F,SAAS;AAAA,iBAAAC;AAAAA,QAAA;AAAA,MAAA,CAAA,GAAApB,OAAAC,KAAA;AAAAc,iBAAAxB,OAAAT,IAAAA,gBAKnBC,cAAI;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAE3D,EAAAA,EAAIiG,eAAe;AAAA,QAAK;AAAA,QAAA,IAAAlC,WAAA;AAAA,cAAAmC,QAAArC,mBAAAsC,OAAA,GAAAC,SAAAF,MAAA/B,YAAAkC,SAAAD,OAAA3B;AAAA2B,iBAAAE,UAIrBrD;AAAeoD,iBAAAC,UAOfnD;AAAgBoD,iCAAAA;AAAA,iBAAAL;AAAAA,QAAA;AAAA,MAAA,CAAA,GAAApB,QAAAC,KAAA;AAAAW,iBAAAP,QAAA1B,IAAAA,gBAcxB+C,aAAG;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAE7G,QAAAA;AAAAA,QAAS;AAAA,QAAAmE,UAChBxE,UAAG,MAAA;AAAA,cAAAmH,SAAA7C,IAAAA,eAAA8C,OAAA;AAAAjB,cAAAA,OAAAgB,QAAA,MAKAnH,IAAIU,KAAK;AAAA2G,qBAAAC,SAAAC,qBAAAJ,QAAA,cAFanD,YAAYhE,GAAG,CAAC,CAAA;AAAA,iBAAAmH;AAAAA,QAAA,GAAA;AAAA,MAAA,CAI1C,CAAA;AAAAhB,iBAAAN,QAAA3B,IAAAA,gBAKJ+C,aAAG;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAE3D,UAAAA;AAAAA,QAAW;AAAA,QAAAiB,UACnBA,CAAC1D,KAAK0G,OAAC,MAAA;AAAA,cAAAC,SAAAnD,IAAAA,eAAAoD,OAAA;AAAAvB,qBAAAsB,QAAAvD,IAAAA,gBAKH+C,aAAG;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAE7G,QAAAA;AAAAA,YAAS;AAAA,YAAAmE,UAChBxE,UAAG,MAAA;AAAA,kBAAA2H,SAAArD,IAAAA,eAAAsD,OAAA;AAAAzB,yBAAAwB,QAAA,MAKA5H,WAAWe,IAAId,IAAIgB,GAAG,GAAGhB,GAAG,CAAC;AAAAqH,yBAAAC,SAAAC,qBAAAI,QAAA,cAFP3D,YAAYhE,GAAG,CAAC,CAAA;AAAA,qBAAA2H;AAAAA,YAAA,GAAA;AAAA,UAAA,CAI1C,CAAA;AAAAN,cAAAA,OAAAC,CAAAA,QAAAO,IAAAA,UAAAJ,QAVQ;AAAA,YAAE,+BAA+BD,EAAAA,IAAM,MAAM;AAAA,UAAA,GAAGF,GAAA,CAAA;AAAA,iBAAAG;AAAAA,QAAA,GAAA;AAAA,MAAA,CAa9D,CAAA;AAAAtB,UAAAA,OAAAJ,SAAA,MAAA;AAAA,YAAA+B,MAAAC,IAAAA,KAAA,MAAA,CAAA,CASJtH,EAAAA,EAAIwC,SAAS;AAAA,eAAA,MAAb6E,QACG,GAAG7E,WAAW,MAAMxC,EAAAA,EAAIwC,UAAWtD,eAAe,OAAO,CAAC,UAC1D,GAAGsD,WAAW,OAAOA,UAAAA,MAAgB,IAAI,MAAM,EAAE;AAAA,MAAE,IAAA;AAAAkD,iBAAAL,QAAA5B,IAAAA,gBAGxDC,cAAI;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAEjB,eAAe;AAAA,QAAC;AAAA,QAAA,IAAAqB,WAAA;AAAA,cAAAwD,SAAA1D,IAAAA,eAAA2D,OAAA,GAAAC,SAAAF,OAAApD,YAAAuD,SAAAD,OAAAhD,aAAAkD,SAAAD,OAAAvD,YAAA,CAAAyD,QAAAC,KAAA,IAAArD,IAAAA,cAAAmD,OAAAlD,WAAA,GAAAqD,SAAAF,OAAAnD,aAAAsD,SAAAD,OAAArD,aAAA,CAAAuD,QAAAC,KAAA,IAAAzD,IAAAA,cAAAuD,OAAAtD,WAAA,GAAAyD,SAAAR,OAAAjD;AAAAgD,iBAAAnB,UAKb,MAAMhE,QAAQ6F,CAAAA,MAAKA,IAAI,CAAC;AAACzC,cAAAA,OAAAgC,QAAA,MAI7BrF,KAAAA,IAAS,GAACuF,QAAAC,KAAA;AAAAnC,cAAAA,OAAAgC,QAAKhF,YAAUsF,QAAAC,KAAA;AAAAC,iBAAA5B,UAIrB,MAAMhE,QAAQ6F,CAAAA,MAAKA,IAAI,CAAC;AAACvB,cAAAA,OAAAwB,CAAAA,QAAA;AAAA,gBAAAC,MATxBhG,WAAW,GAACiG,OAQZjG,KAAAA,KAAUK,eAAe;AAAC2F,oBAAAD,IAAAG,KAAAC,IAAAA,YAAAf,QAAA,YAAAW,IAAAG,IAAAF,GAAA;AAAAC,qBAAAF,IAAAK,KAAAD,IAAAA,YAAAN,QAAA,YAAAE,IAAAK,IAAAH,IAAA;AAAA,mBAAAF;AAAAA,UAAA,GAAA;AAAA,YAAAG,GAAAG;AAAAA,YAAAD,GAAAC;AAAAA,UAAAA,CAAA;AAAAnC,iCAAAA;AAAA,iBAAAgB;AAAAA,QAAA;AAAA,MAAA,CAAA,GAAA/B,QAAAC,KAAA;AAAA,aAAAzB;AAAAA,IAAA,GAAA;AAAA,EAAA,CAS/C;AAGP;AAAC2E,IAAAA,eAAA,CAAA,OAAA,CAAA;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataPreviewSection.d.ts","sourceRoot":"","sources":["../../src/components/DataPreviewSection.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAqB,MAAM,mBAAmB,CAAA;AAE9E,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,kBAAkB,CAAA;CAC5B;
|
|
1
|
+
{"version":3,"file":"DataPreviewSection.d.ts","sourceRoot":"","sources":["../../src/components/DataPreviewSection.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAqB,MAAM,mBAAmB,CAAA;AAE9E,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,kBAAkB,CAAA;CAC5B;AA0ED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,kCA6JhE"}
|