@mcp-html-bridge/ui-engine 0.5.0 → 0.5.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.
Files changed (52) hide show
  1. package/dist/bridge.d.ts +3 -0
  2. package/dist/bridge.d.ts.map +1 -0
  3. package/{src/bridge.ts → dist/bridge.js} +6 -3
  4. package/dist/bridge.js.map +1 -0
  5. package/dist/engine.d.ts +26 -0
  6. package/dist/engine.d.ts.map +1 -0
  7. package/dist/engine.js +92 -0
  8. package/dist/engine.js.map +1 -0
  9. package/dist/html-builder.d.ts +16 -0
  10. package/dist/html-builder.d.ts.map +1 -0
  11. package/dist/html-builder.js +54 -0
  12. package/dist/html-builder.js.map +1 -0
  13. package/{src/index.ts → dist/index.d.ts} +3 -26
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +36 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/llm-renderer.d.ts +36 -0
  18. package/dist/llm-renderer.d.ts.map +1 -0
  19. package/dist/llm-renderer.js +103 -0
  20. package/dist/llm-renderer.js.map +1 -0
  21. package/dist/playground.d.ts +4 -0
  22. package/dist/playground.d.ts.map +1 -0
  23. package/{src/playground.ts → dist/playground.js} +12 -11
  24. package/dist/playground.js.map +1 -0
  25. package/dist/renderer.d.ts +7 -0
  26. package/dist/renderer.d.ts.map +1 -0
  27. package/dist/renderer.js +345 -0
  28. package/dist/renderer.js.map +1 -0
  29. package/dist/renderers/form.d.ts +4 -0
  30. package/dist/renderers/form.d.ts.map +1 -0
  31. package/dist/renderers/form.js +181 -0
  32. package/dist/renderers/form.js.map +1 -0
  33. package/dist/theme.d.ts +2 -0
  34. package/dist/theme.d.ts.map +1 -0
  35. package/{src/theme.ts → dist/theme.js} +6 -3
  36. package/dist/theme.js.map +1 -0
  37. package/dist/types.d.ts +50 -0
  38. package/dist/types.d.ts.map +1 -0
  39. package/dist/types.js +3 -0
  40. package/dist/types.js.map +1 -0
  41. package/dist/utilities.d.ts +19 -0
  42. package/dist/utilities.d.ts.map +1 -0
  43. package/{src/utilities.ts → dist/utilities.js} +6 -3
  44. package/dist/utilities.js.map +1 -0
  45. package/package.json +4 -1
  46. package/src/engine.ts +0 -118
  47. package/src/html-builder.ts +0 -61
  48. package/src/llm-renderer.ts +0 -129
  49. package/src/renderer.ts +0 -380
  50. package/src/renderers/form.ts +0 -200
  51. package/src/types.ts +0 -60
  52. package/tsconfig.json +0 -8
@@ -0,0 +1,345 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderJSON = renderJSON;
4
+ exports.getRendererCSS = getRendererCSS;
5
+ exports.getRendererJS = getRendererJS;
6
+ /**
7
+ * Universal JSON → HTML renderer.
8
+ *
9
+ * No hardcoded business logic. No status badges, no price formatting,
10
+ * no regex-based field type guessing. Just clean structural rendering
11
+ * that handles any JSON shape gracefully:
12
+ *
13
+ * Array<Object> → sortable <table> (union of all keys)
14
+ * Object → <dl> key-value pairs (recursive for nesting)
15
+ * Array<mixed> → <ul> list with recursive items
16
+ * string → text (auto-links URLs)
17
+ * number → number
18
+ * boolean → true/false
19
+ * null → placeholder
20
+ * empty → explicit empty indicator
21
+ *
22
+ * All formatting decisions are the caller's responsibility (LLM or user).
23
+ */
24
+ const html_builder_js_1 = require("./html-builder.js");
25
+ // ── Constants ──
26
+ const MAX_DEPTH = 30;
27
+ const MAX_TABLE_ROWS = 500;
28
+ const MAX_LIST_ITEMS = 200;
29
+ const URL_REGEX = /^https?:\/\/[^\s<>"{}|\\^`[\]]+$/;
30
+ const IMAGE_EXT_REGEX = /\.(png|jpe?g|gif|webp|svg|ico|bmp)(\?[^\s]*)?$/i;
31
+ // ── Structural detection ──
32
+ function isArrayOfObjects(data) {
33
+ if (!Array.isArray(data) || data.length === 0)
34
+ return false;
35
+ // At least 80% must be non-null objects (tolerates a few nulls in the array)
36
+ let objCount = 0;
37
+ for (const item of data) {
38
+ if (item !== null && typeof item === 'object' && !Array.isArray(item)) {
39
+ objCount++;
40
+ }
41
+ }
42
+ return objCount / data.length >= 0.8 && objCount >= 1;
43
+ }
44
+ function isFlatObject(data) {
45
+ if (data === null || typeof data !== 'object' || Array.isArray(data))
46
+ return false;
47
+ const values = Object.values(data);
48
+ if (values.length === 0)
49
+ return true;
50
+ return values.every(v => v === null || typeof v !== 'object');
51
+ }
52
+ function humanizeKey(key) {
53
+ return key
54
+ .replace(/([A-Z])/g, ' $1')
55
+ .replace(/[_-]/g, ' ')
56
+ .replace(/^\w/, c => c.toUpperCase())
57
+ .trim();
58
+ }
59
+ function isUrl(value) {
60
+ return URL_REGEX.test(value);
61
+ }
62
+ function isImageUrl(value) {
63
+ return IMAGE_EXT_REGEX.test(value);
64
+ }
65
+ // ── Render primitives ──
66
+ function renderValue(value, depth) {
67
+ if (value === null || value === undefined) {
68
+ return '<span class="mcp-null">\u2014</span>';
69
+ }
70
+ if (typeof value === 'boolean') {
71
+ return `<span class="mcp-bool mcp-bool-${value}">${value}</span>`;
72
+ }
73
+ if (typeof value === 'number') {
74
+ return `<span class="mcp-num">${value}</span>`;
75
+ }
76
+ if (typeof value === 'string') {
77
+ if (value.length === 0) {
78
+ return '<span class="mcp-null">(empty)</span>';
79
+ }
80
+ // Auto-link URLs
81
+ if (isUrl(value)) {
82
+ const escaped = (0, html_builder_js_1.escapeHtml)(value);
83
+ if (isImageUrl(value)) {
84
+ return `<a href="${escaped}" target="_blank" rel="noopener"><img class="mcp-img" src="${escaped}" alt="" loading="lazy"></a>`;
85
+ }
86
+ return `<a class="mcp-link" href="${escaped}" target="_blank" rel="noopener">${escaped}</a>`;
87
+ }
88
+ if (value.length > 300) {
89
+ return `<div class="mcp-text">${(0, html_builder_js_1.escapeHtml)(value)}</div>`;
90
+ }
91
+ return (0, html_builder_js_1.escapeHtml)(value);
92
+ }
93
+ // Recurse into objects/arrays
94
+ return renderAny(value, depth + 1);
95
+ }
96
+ // ── Core recursive renderer ──
97
+ /** Collect union of all keys across an array of objects, preserving order */
98
+ function collectColumns(rows) {
99
+ const seen = new Set();
100
+ const columns = [];
101
+ for (const row of rows) {
102
+ for (const key of Object.keys(row)) {
103
+ if (!seen.has(key)) {
104
+ seen.add(key);
105
+ columns.push(key);
106
+ }
107
+ }
108
+ }
109
+ return columns;
110
+ }
111
+ function renderTable(rows, tableId) {
112
+ const columns = collectColumns(rows);
113
+ const truncated = rows.length > MAX_TABLE_ROWS;
114
+ const displayRows = truncated ? rows.slice(0, MAX_TABLE_ROWS) : rows;
115
+ const headerCells = columns
116
+ .map((col, i) => `<th onclick="__mcpSort('${(0, html_builder_js_1.escapeHtml)(tableId)}',${i})" class="mcp-sortable">${(0, html_builder_js_1.escapeHtml)(humanizeKey(col))}<span class="mcp-sort-icon">\u21C5</span></th>`)
117
+ .join('');
118
+ const bodyRows = displayRows
119
+ .map(row => {
120
+ const cells = columns.map(col => {
121
+ const val = Object.prototype.hasOwnProperty.call(row, col) ? row[col] : undefined;
122
+ return `<td>${renderValue(val, 1)}</td>`;
123
+ }).join('');
124
+ return `<tr>${cells}</tr>`;
125
+ })
126
+ .join('\n');
127
+ const meta = truncated
128
+ ? `${rows.length} rows \u00D7 ${columns.length} columns (showing first ${MAX_TABLE_ROWS})`
129
+ : `${rows.length} rows \u00D7 ${columns.length} columns`;
130
+ return `<div class="mcp-table-wrap">
131
+ <div class="mcp-table-meta">${meta}</div>
132
+ <div class="mcp-table-scroll">
133
+ <table class="mcp-table" id="${(0, html_builder_js_1.escapeHtml)(tableId)}">
134
+ <thead><tr>${headerCells}</tr></thead>
135
+ <tbody>${bodyRows}</tbody>
136
+ </table>
137
+ </div>
138
+ </div>`;
139
+ }
140
+ function renderKeyValue(obj, depth) {
141
+ const entries = Object.entries(obj);
142
+ if (entries.length === 0) {
143
+ return '<div class="mcp-empty">(empty object)</div>';
144
+ }
145
+ const items = entries.map(([key, val]) => {
146
+ const rendered = renderValue(val, depth);
147
+ return `<div class="mcp-kv">
148
+ <dt class="mcp-key">${(0, html_builder_js_1.escapeHtml)(humanizeKey(key))}</dt>
149
+ <dd class="mcp-val">${rendered}</dd>
150
+ </div>`;
151
+ }).join('\n');
152
+ return `<dl class="mcp-dl">${items}</dl>`;
153
+ }
154
+ function renderList(arr, depth) {
155
+ if (arr.length === 0) {
156
+ return '<div class="mcp-empty">(empty array)</div>';
157
+ }
158
+ const truncated = arr.length > MAX_LIST_ITEMS;
159
+ const displayItems = truncated ? arr.slice(0, MAX_LIST_ITEMS) : arr;
160
+ const items = displayItems.map(item => `<li>${renderValue(item, depth)}</li>`).join('\n');
161
+ const suffix = truncated
162
+ ? `<li class="mcp-truncated">\u2026 and ${arr.length - MAX_LIST_ITEMS} more items</li>`
163
+ : '';
164
+ return `<ul class="mcp-list">${items}\n${suffix}</ul>`;
165
+ }
166
+ function renderCollapsible(label, content, open = true) {
167
+ return `<details class="mcp-details" ${open ? 'open' : ''}>
168
+ <summary class="mcp-summary">${(0, html_builder_js_1.escapeHtml)(label)}</summary>
169
+ <div class="mcp-details-body">${content}</div>
170
+ </details>`;
171
+ }
172
+ // Global table counter for unique IDs
173
+ let tableCounter = 0;
174
+ function renderAny(data, depth) {
175
+ // Depth guard
176
+ if (depth > MAX_DEPTH) {
177
+ return '<span class="mcp-null">(max depth reached)</span>';
178
+ }
179
+ // Primitive
180
+ if (data === null || data === undefined || typeof data !== 'object') {
181
+ return renderValue(data, depth);
182
+ }
183
+ // Array of objects → table
184
+ if (isArrayOfObjects(data)) {
185
+ // Filter to only objects for the table, skip non-objects
186
+ const objectRows = data.filter((item) => item !== null && typeof item === 'object' && !Array.isArray(item));
187
+ const tableId = `mcp-grid-${tableCounter++}`;
188
+ const content = renderTable(objectRows, tableId);
189
+ return depth > 0 ? renderCollapsible(`Array (${data.length} items)`, content) : content;
190
+ }
191
+ // Generic array → list or collapsible
192
+ if (Array.isArray(data)) {
193
+ const content = renderList(data, depth);
194
+ return depth > 0 ? renderCollapsible(`Array (${data.length})`, content) : content;
195
+ }
196
+ // Flat object → key-value pairs
197
+ const obj = data;
198
+ if (isFlatObject(obj)) {
199
+ return renderKeyValue(obj, depth);
200
+ }
201
+ // Nested object → grouped sections
202
+ const entries = Object.entries(obj);
203
+ if (entries.length === 0) {
204
+ return '<div class="mcp-empty">(empty object)</div>';
205
+ }
206
+ const sections = entries.map(([key, val]) => {
207
+ if (val !== null && typeof val === 'object') {
208
+ return renderCollapsible(humanizeKey(key), renderAny(val, depth + 1), depth < 2);
209
+ }
210
+ return `<div class="mcp-kv">
211
+ <dt class="mcp-key">${(0, html_builder_js_1.escapeHtml)(humanizeKey(key))}</dt>
212
+ <dd class="mcp-val">${renderValue(val, depth)}</dd>
213
+ </div>`;
214
+ });
215
+ // If all entries are primitives at this level, use dl
216
+ const allPrimitive = entries.every(([, v]) => v === null || typeof v !== 'object');
217
+ if (allPrimitive) {
218
+ return renderKeyValue(obj, depth);
219
+ }
220
+ return `<div class="mcp-section">${sections.join('\n')}</div>`;
221
+ }
222
+ // ── Public API ──
223
+ /** Render any JSON data as an HTML fragment. No business logic, pure structure. */
224
+ function renderJSON(data) {
225
+ tableCounter = 0; // Reset per render call
226
+ return `<div class="mcp-root">${renderAny(data, 0)}</div>`;
227
+ }
228
+ /** Get the CSS for the universal renderer */
229
+ function getRendererCSS() {
230
+ return `
231
+ .mcp-root { max-width: 960px; margin: 0 auto; }
232
+
233
+ /* Table */
234
+ .mcp-table-wrap { overflow: hidden; }
235
+ .mcp-table-meta {
236
+ font-size: var(--text-xs); color: var(--text-tertiary);
237
+ padding-bottom: var(--sp-2); margin-bottom: var(--sp-2);
238
+ border-bottom: 1px solid var(--border);
239
+ }
240
+ .mcp-table-scroll { overflow-x: auto; }
241
+ .mcp-table { width: 100%; border-collapse: collapse; font-size: var(--text-sm); }
242
+ .mcp-table th {
243
+ text-align: left; padding: var(--sp-2) var(--sp-3);
244
+ font-weight: 600; color: var(--text-secondary); font-size: var(--text-xs);
245
+ text-transform: uppercase; letter-spacing: 0.05em;
246
+ border-bottom: 2px solid var(--border);
247
+ white-space: nowrap; user-select: none;
248
+ position: sticky; top: 0; background: var(--bg-primary); z-index: 1;
249
+ }
250
+ .mcp-sortable { cursor: pointer; }
251
+ .mcp-sortable:hover { color: var(--accent); }
252
+ .mcp-sort-icon { margin-left: 4px; opacity: 0.3; font-size: 10px; }
253
+ .mcp-table td {
254
+ padding: var(--sp-2) var(--sp-3); border-bottom: 1px solid var(--border);
255
+ vertical-align: top; max-width: 400px;
256
+ }
257
+ .mcp-table tbody tr:hover { background: var(--accent-subtle); }
258
+
259
+ /* Key-Value */
260
+ .mcp-dl { display: grid; grid-template-columns: 1fr; gap: 0; }
261
+ .mcp-kv {
262
+ display: grid; grid-template-columns: minmax(120px, auto) 1fr;
263
+ gap: var(--sp-3); padding: var(--sp-2) 0;
264
+ border-bottom: 1px solid var(--border);
265
+ }
266
+ .mcp-kv:last-child { border-bottom: none; }
267
+ .mcp-key {
268
+ font-weight: 600; font-size: var(--text-sm); color: var(--text-secondary);
269
+ word-break: break-word;
270
+ }
271
+ .mcp-val { font-size: var(--text-sm); word-break: break-word; }
272
+
273
+ /* List */
274
+ .mcp-list {
275
+ list-style: none; padding: 0; margin: 0;
276
+ display: flex; flex-direction: column; gap: var(--sp-1);
277
+ }
278
+ .mcp-list li {
279
+ padding: var(--sp-1) var(--sp-2); font-size: var(--text-sm);
280
+ border-left: 2px solid var(--border); margin-left: var(--sp-2);
281
+ }
282
+
283
+ /* Collapsible sections */
284
+ .mcp-details {
285
+ border: 1px solid var(--border); border-radius: var(--radius-sm);
286
+ margin-bottom: var(--sp-2);
287
+ }
288
+ .mcp-summary {
289
+ padding: var(--sp-2) var(--sp-3); font-weight: 600; font-size: var(--text-sm);
290
+ cursor: pointer; user-select: none;
291
+ }
292
+ .mcp-summary:hover { color: var(--accent); }
293
+ .mcp-details-body { padding: var(--sp-3); border-top: 1px solid var(--border); }
294
+
295
+ /* Sections */
296
+ .mcp-section { display: flex; flex-direction: column; gap: var(--sp-3); }
297
+
298
+ /* Primitives */
299
+ .mcp-null { color: var(--text-tertiary); font-style: italic; }
300
+ .mcp-bool { font-weight: 600; }
301
+ .mcp-bool-true { color: var(--success); }
302
+ .mcp-bool-false { color: var(--danger); }
303
+ .mcp-num { font-variant-numeric: tabular-nums; }
304
+ .mcp-text { white-space: pre-wrap; line-height: 1.6; }
305
+ .mcp-empty { color: var(--text-tertiary); font-style: italic; padding: var(--sp-2) 0; }
306
+ .mcp-truncated { color: var(--text-tertiary); font-style: italic; }
307
+
308
+ /* Links & images */
309
+ .mcp-link { color: var(--accent); text-decoration: none; word-break: break-all; }
310
+ .mcp-link:hover { text-decoration: underline; }
311
+ .mcp-img { max-width: 200px; max-height: 150px; border-radius: var(--radius-sm); border: 1px solid var(--border); }
312
+
313
+ /* Nested table styling */
314
+ .mcp-details .mcp-table-wrap { margin: 0; }
315
+ .mcp-details .mcp-table th { position: static; }
316
+ `;
317
+ }
318
+ /** Get the JS for table sorting (supports multiple tables) */
319
+ function getRendererJS() {
320
+ return `
321
+ function __mcpSort(tableId, colIdx) {
322
+ var table = document.getElementById(tableId);
323
+ if (!table) return;
324
+ var tbody = table.tBodies[0];
325
+ var rows = Array.from(tbody.rows);
326
+ var key = tableId + '_' + colIdx;
327
+ var dir = table.dataset.sortKey === key && table.dataset.sortDir === 'asc' ? 'desc' : 'asc';
328
+ table.dataset.sortDir = dir;
329
+ table.dataset.sortKey = key;
330
+
331
+ rows.sort(function(a, b) {
332
+ var ac = a.cells[colIdx], bc = b.cells[colIdx];
333
+ if (!ac || !bc) return 0;
334
+ var av = ac.textContent.trim();
335
+ var bv = bc.textContent.trim();
336
+ var an = parseFloat(av.replace(/[^\\d.-]/g, ''));
337
+ var bn = parseFloat(bv.replace(/[^\\d.-]/g, ''));
338
+ if (!isNaN(an) && !isNaN(bn)) return dir === 'asc' ? an - bn : bn - an;
339
+ return dir === 'asc' ? av.localeCompare(bv) : bv.localeCompare(av);
340
+ });
341
+
342
+ rows.forEach(function(row) { tbody.appendChild(row); });
343
+ }`;
344
+ }
345
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { JSONSchema } from '../types.js';
2
+ export declare function renderForm(schema: JSONSchema, metadata: Record<string, unknown>): string;
3
+ export declare function getFormCSS(): string;
4
+ //# sourceMappingURL=form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../src/renderers/form.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAyG9C,wBAAgB,UAAU,CACxB,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,MAAM,CAoBR;AAED,wBAAgB,UAAU,IAAI,MAAM,CAoEnC"}
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderForm = renderForm;
4
+ exports.getFormCSS = getFormCSS;
5
+ const html_builder_js_1 = require("../html-builder.js");
6
+ function renderField(name, schema, required) {
7
+ const label = schema.title ?? name;
8
+ const desc = schema.description ? `<div class="field-desc">${(0, html_builder_js_1.escapeHtml)(schema.description)}</div>` : '';
9
+ const requiredAttr = required ? 'required' : '';
10
+ const requiredMark = required ? '<span class="required">*</span>' : '';
11
+ // Enum → capsule select
12
+ if (schema.enum && schema.enum.length > 0) {
13
+ const capsules = schema.enum
14
+ .map((v) => {
15
+ const val = (0, html_builder_js_1.escapeHtml)(String(v));
16
+ return `<label class="capsule"><input type="radio" name="${(0, html_builder_js_1.escapeHtml)(name)}" value="${val}"><span>${val}</span></label>`;
17
+ })
18
+ .join('\n');
19
+ return `<div class="field animate-in">
20
+ <label class="field-label">${(0, html_builder_js_1.escapeHtml)(label)}${requiredMark}</label>
21
+ ${desc}
22
+ <div class="capsule-group">${capsules}</div>
23
+ </div>`;
24
+ }
25
+ // Boolean → toggle
26
+ if (schema.type === 'boolean') {
27
+ const checked = schema.default === true ? 'checked' : '';
28
+ return `<div class="field animate-in">
29
+ <label class="toggle-label">
30
+ <input type="checkbox" name="${(0, html_builder_js_1.escapeHtml)(name)}" ${checked}>
31
+ <span class="toggle-switch"></span>
32
+ <span>${(0, html_builder_js_1.escapeHtml)(label)}${requiredMark}</span>
33
+ </label>
34
+ ${desc}
35
+ </div>`;
36
+ }
37
+ // Nested object → collapsible section
38
+ if (schema.type === 'object' && schema.properties) {
39
+ const inner = renderProperties(schema.properties, schema.required ?? []);
40
+ return `<details class="nested-section animate-in" open>
41
+ <summary class="section-title">${(0, html_builder_js_1.escapeHtml)(label)}${requiredMark}</summary>
42
+ ${desc}
43
+ <div class="nested-fields">${inner}</div>
44
+ </details>`;
45
+ }
46
+ // Array → textarea hint
47
+ if (schema.type === 'array') {
48
+ return `<div class="field animate-in">
49
+ <label class="field-label" for="f-${(0, html_builder_js_1.escapeHtml)(name)}">${(0, html_builder_js_1.escapeHtml)(label)}${requiredMark}</label>
50
+ ${desc}
51
+ <textarea id="f-${(0, html_builder_js_1.escapeHtml)(name)}" name="${(0, html_builder_js_1.escapeHtml)(name)}" class="input textarea" placeholder="JSON array..." ${requiredAttr}>${(0, html_builder_js_1.escapeHtml)(String(schema.default ?? ''))}</textarea>
52
+ </div>`;
53
+ }
54
+ // Number/integer
55
+ if (schema.type === 'number' || schema.type === 'integer') {
56
+ const min = schema.minimum !== undefined ? `min="${schema.minimum}"` : '';
57
+ const max = schema.maximum !== undefined ? `max="${schema.maximum}"` : '';
58
+ const step = schema.type === 'integer' ? 'step="1"' : '';
59
+ const def = schema.default !== undefined ? `value="${(0, html_builder_js_1.escapeHtml)(String(schema.default))}"` : '';
60
+ return `<div class="field animate-in">
61
+ <label class="field-label" for="f-${(0, html_builder_js_1.escapeHtml)(name)}">${(0, html_builder_js_1.escapeHtml)(label)}${requiredMark}</label>
62
+ ${desc}
63
+ <input type="number" id="f-${(0, html_builder_js_1.escapeHtml)(name)}" name="${(0, html_builder_js_1.escapeHtml)(name)}" class="input" ${min} ${max} ${step} ${def} ${requiredAttr}>
64
+ </div>`;
65
+ }
66
+ // String (default)
67
+ const inputType = schema.format === 'email' ? 'email'
68
+ : schema.format === 'uri' ? 'url'
69
+ : schema.format === 'date' ? 'date'
70
+ : schema.format === 'date-time' ? 'datetime-local'
71
+ : schema.format === 'password' ? 'password'
72
+ : 'text';
73
+ const isLong = (schema.maxLength && schema.maxLength > 200) || schema.format === 'textarea';
74
+ const def = schema.default !== undefined ? (0, html_builder_js_1.escapeHtml)(String(schema.default)) : '';
75
+ if (isLong) {
76
+ return `<div class="field animate-in">
77
+ <label class="field-label" for="f-${(0, html_builder_js_1.escapeHtml)(name)}">${(0, html_builder_js_1.escapeHtml)(label)}${requiredMark}</label>
78
+ ${desc}
79
+ <textarea id="f-${(0, html_builder_js_1.escapeHtml)(name)}" name="${(0, html_builder_js_1.escapeHtml)(name)}" class="input textarea" ${requiredAttr}>${def}</textarea>
80
+ </div>`;
81
+ }
82
+ return `<div class="field animate-in">
83
+ <label class="field-label" for="f-${(0, html_builder_js_1.escapeHtml)(name)}">${(0, html_builder_js_1.escapeHtml)(label)}${requiredMark}</label>
84
+ ${desc}
85
+ <input type="${inputType}" id="f-${(0, html_builder_js_1.escapeHtml)(name)}" name="${(0, html_builder_js_1.escapeHtml)(name)}" class="input" value="${def}" ${requiredAttr}>
86
+ </div>`;
87
+ }
88
+ function renderProperties(properties, required) {
89
+ const reqSet = new Set(required);
90
+ return Object.entries(properties)
91
+ .map(([name, schema]) => renderField(name, schema, reqSet.has(name)))
92
+ .join('\n');
93
+ }
94
+ function renderForm(schema, metadata) {
95
+ const toolName = metadata['toolName'];
96
+ const toolDesc = metadata['toolDescription'];
97
+ const header = toolName
98
+ ? `<div class="form-header"><h2>${(0, html_builder_js_1.escapeHtml)(toolName)}</h2>${toolDesc ? `<p class="form-desc">${(0, html_builder_js_1.escapeHtml)(toolDesc)}</p>` : ''}</div>`
99
+ : '';
100
+ const fields = schema.properties
101
+ ? renderProperties(schema.properties, schema.required ?? [])
102
+ : '<p class="text-secondary">No input parameters required.</p>';
103
+ return `${header}
104
+ <form id="mcp-form" class="mcp-form card" onsubmit="return __mcpSubmit(event)">
105
+ ${fields}
106
+ <div class="form-actions">
107
+ <button type="submit" class="btn btn-primary">Execute Tool</button>
108
+ <button type="reset" class="btn btn-ghost">Reset</button>
109
+ </div>
110
+ </form>`;
111
+ }
112
+ function getFormCSS() {
113
+ return `
114
+ .mcp-form { display: flex; flex-direction: column; gap: var(--sp-5); max-width: 640px; }
115
+ .form-header h2 { font-size: var(--text-2xl); font-weight: 700; }
116
+ .form-desc { color: var(--text-secondary); margin-top: var(--sp-1); }
117
+
118
+ .field { display: flex; flex-direction: column; gap: var(--sp-1); }
119
+ .field-label { font-weight: 600; font-size: var(--text-sm); color: var(--text-primary); }
120
+ .field-desc { font-size: var(--text-xs); color: var(--text-tertiary); }
121
+ .required { color: var(--danger); margin-left: 2px; }
122
+
123
+ .input {
124
+ padding: var(--sp-2) var(--sp-3);
125
+ border: 1px solid var(--border);
126
+ border-radius: var(--radius-sm);
127
+ font-size: var(--text-sm);
128
+ font-family: var(--font-sans);
129
+ background: var(--bg-primary);
130
+ color: var(--text-primary);
131
+ transition: border-color var(--duration-fast) var(--ease-out),
132
+ box-shadow var(--duration-fast) var(--ease-out);
133
+ }
134
+ .input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-subtle); }
135
+ .textarea { min-height: 80px; resize: vertical; }
136
+
137
+ .capsule-group { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
138
+ .capsule input { display: none; }
139
+ .capsule span {
140
+ display: inline-block;
141
+ padding: var(--sp-1) var(--sp-3);
142
+ border: 1px solid var(--border);
143
+ border-radius: var(--radius-full);
144
+ font-size: var(--text-sm);
145
+ cursor: pointer;
146
+ transition: all var(--duration-fast) var(--ease-out);
147
+ }
148
+ .capsule input:checked + span { background: var(--accent); color: var(--accent-text); border-color: var(--accent); }
149
+ .capsule span:hover { border-color: var(--accent); }
150
+
151
+ .toggle-label { display: flex; align-items: center; gap: var(--sp-2); cursor: pointer; font-weight: 600; font-size: var(--text-sm); }
152
+ .toggle-label input { display: none; }
153
+ .toggle-switch {
154
+ width: 36px; height: 20px; background: var(--border-strong); border-radius: 10px;
155
+ position: relative; transition: background var(--duration-fast) var(--ease-out);
156
+ }
157
+ .toggle-switch::after {
158
+ content: ''; position: absolute; top: 2px; left: 2px;
159
+ width: 16px; height: 16px; background: white; border-radius: 50%;
160
+ transition: transform var(--duration-fast) var(--ease-out);
161
+ }
162
+ .toggle-label input:checked + .toggle-switch { background: var(--accent); }
163
+ .toggle-label input:checked + .toggle-switch::after { transform: translateX(16px); }
164
+
165
+ .nested-section { border: 1px solid var(--border); border-radius: var(--radius-md); padding: var(--sp-4); }
166
+ .nested-section summary { cursor: pointer; user-select: none; }
167
+ .nested-fields { margin-top: var(--sp-4); display: flex; flex-direction: column; gap: var(--sp-4); }
168
+
169
+ .form-actions { display: flex; gap: var(--sp-3); margin-top: var(--sp-2); }
170
+ .btn {
171
+ padding: var(--sp-2) var(--sp-5); border-radius: var(--radius-sm);
172
+ font-weight: 600; font-size: var(--text-sm); cursor: pointer; border: none;
173
+ transition: all var(--duration-fast) var(--ease-out);
174
+ }
175
+ .btn-primary { background: var(--accent); color: var(--accent-text); }
176
+ .btn-primary:hover { background: var(--accent-hover); }
177
+ .btn-ghost { background: transparent; color: var(--text-secondary); border: 1px solid var(--border); }
178
+ .btn-ghost:hover { background: var(--bg-tertiary); }
179
+ `;
180
+ }
181
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/renderers/form.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function generateThemeCSS(): string;
2
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,IAAI,MAAM,CAqLzC"}
@@ -1,7 +1,9 @@
1
+ "use strict";
1
2
  // ── Theme system: CSS variables + dark mode + glassmorphism ──
2
-
3
- export function generateThemeCSS(): string {
4
- return `
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateThemeCSS = generateThemeCSS;
5
+ function generateThemeCSS() {
6
+ return `
5
7
  /* ── Reset ── */
6
8
  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
7
9
 
@@ -182,3 +184,4 @@ body {
182
184
  }
183
185
  `;
184
186
  }
187
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":";AAAA,gEAAgE;;AAEhE,4CAqLC;AArLD,SAAgB,gBAAgB;IAC9B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmLR,CAAC;AACF,CAAC"}
@@ -0,0 +1,50 @@
1
+ export interface RenderOptions {
2
+ darkMode?: boolean;
3
+ debug?: boolean;
4
+ title?: string;
5
+ }
6
+ export interface SchemaInput {
7
+ mode: 'schema';
8
+ schema: JSONSchema;
9
+ toolName?: string;
10
+ toolDescription?: string;
11
+ }
12
+ export interface DataInput {
13
+ mode: 'data';
14
+ data: unknown;
15
+ toolName?: string;
16
+ toolDescription?: string;
17
+ }
18
+ export type EngineInput = SchemaInput | DataInput;
19
+ export interface JSONSchema {
20
+ type?: string | string[];
21
+ properties?: Record<string, JSONSchema>;
22
+ required?: string[];
23
+ items?: JSONSchema;
24
+ enum?: unknown[];
25
+ description?: string;
26
+ default?: unknown;
27
+ title?: string;
28
+ format?: string;
29
+ minimum?: number;
30
+ maximum?: number;
31
+ minLength?: number;
32
+ maxLength?: number;
33
+ pattern?: string;
34
+ oneOf?: JSONSchema[];
35
+ anyOf?: JSONSchema[];
36
+ allOf?: JSONSchema[];
37
+ $ref?: string;
38
+ additionalProperties?: boolean | JSONSchema;
39
+ }
40
+ export interface MCPToolDefinition {
41
+ name: string;
42
+ description?: string;
43
+ inputSchema: JSONSchema;
44
+ }
45
+ export interface MCPServerInfo {
46
+ name: string;
47
+ version: string;
48
+ tools: MCPToolDefinition[];
49
+ }
50
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;AAGlD,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oBAAoB,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CAC7C;AAGD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,UAAU,CAAC;CACzB;AAGD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,iBAAiB,EAAE,CAAC;CAC5B"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}