@portel/photon-core 1.5.0 → 2.1.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/dist/auto-ui.js +1 -1
- package/dist/auto-ui.js.map +1 -1
- package/dist/base.d.ts +1 -1
- package/dist/base.d.ts.map +1 -1
- package/dist/base.js +2 -2
- package/dist/base.js.map +1 -1
- package/dist/cli-ui-renderer.js +1 -1
- package/dist/cli-ui-renderer.js.map +1 -1
- package/dist/design-system/index.d.ts +21 -0
- package/dist/design-system/index.d.ts.map +1 -0
- package/dist/design-system/index.js +27 -0
- package/dist/design-system/index.js.map +1 -0
- package/dist/design-system/tokens.d.ts +149 -0
- package/dist/design-system/tokens.d.ts.map +1 -0
- package/dist/design-system/tokens.js +413 -0
- package/dist/design-system/tokens.js.map +1 -0
- package/dist/design-system/transaction-ui.d.ts +70 -0
- package/dist/design-system/transaction-ui.d.ts.map +1 -0
- package/dist/design-system/transaction-ui.js +982 -0
- package/dist/design-system/transaction-ui.js.map +1 -0
- package/dist/generator.d.ts +56 -6
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js.map +1 -1
- package/dist/index.d.ts +6 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -56
- package/dist/index.js.map +1 -1
- package/dist/io.d.ts +103 -2
- package/dist/io.d.ts.map +1 -1
- package/dist/io.js +37 -1
- package/dist/io.js.map +1 -1
- package/dist/rendering/components.d.ts +29 -0
- package/dist/rendering/components.d.ts.map +1 -0
- package/dist/rendering/components.js +773 -0
- package/dist/rendering/components.js.map +1 -0
- package/dist/rendering/field-analyzer.d.ts +48 -0
- package/dist/rendering/field-analyzer.d.ts.map +1 -0
- package/dist/rendering/field-analyzer.js +270 -0
- package/dist/rendering/field-analyzer.js.map +1 -0
- package/dist/rendering/field-renderers.d.ts +64 -0
- package/dist/rendering/field-renderers.d.ts.map +1 -0
- package/dist/rendering/field-renderers.js +317 -0
- package/dist/rendering/field-renderers.js.map +1 -0
- package/dist/rendering/index.d.ts +28 -0
- package/dist/rendering/index.d.ts.map +1 -0
- package/dist/rendering/index.js +60 -0
- package/dist/rendering/index.js.map +1 -0
- package/dist/rendering/layout-selector.d.ts +48 -0
- package/dist/rendering/layout-selector.d.ts.map +1 -0
- package/dist/rendering/layout-selector.js +347 -0
- package/dist/rendering/layout-selector.js.map +1 -0
- package/dist/rendering/template-engine.d.ts +41 -0
- package/dist/rendering/template-engine.d.ts.map +1 -0
- package/dist/rendering/template-engine.js +236 -0
- package/dist/rendering/template-engine.js.map +1 -0
- package/dist/schema-extractor.d.ts +30 -0
- package/dist/schema-extractor.d.ts.map +1 -1
- package/dist/schema-extractor.js +205 -12
- package/dist/schema-extractor.js.map +1 -1
- package/dist/stateful.js +1 -1
- package/dist/stateful.js.map +1 -1
- package/dist/types.d.ts +9 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/ucp/ap2/handlers.d.ts +242 -0
- package/dist/ucp/ap2/handlers.d.ts.map +1 -0
- package/dist/ucp/ap2/handlers.js +482 -0
- package/dist/ucp/ap2/handlers.js.map +1 -0
- package/dist/ucp/ap2/mandates.d.ts +95 -0
- package/dist/ucp/ap2/mandates.d.ts.map +1 -0
- package/dist/ucp/ap2/mandates.js +234 -0
- package/dist/ucp/ap2/mandates.js.map +1 -0
- package/dist/ucp/ap2/types.d.ts +305 -0
- package/dist/ucp/ap2/types.d.ts.map +1 -0
- package/dist/ucp/ap2/types.js +8 -0
- package/dist/ucp/ap2/types.js.map +1 -0
- package/dist/ucp/capabilities/checkout.d.ts +118 -0
- package/dist/ucp/capabilities/checkout.d.ts.map +1 -0
- package/dist/ucp/capabilities/checkout.js +344 -0
- package/dist/ucp/capabilities/checkout.js.map +1 -0
- package/dist/ucp/capabilities/identity.d.ts +130 -0
- package/dist/ucp/capabilities/identity.d.ts.map +1 -0
- package/dist/ucp/capabilities/identity.js +290 -0
- package/dist/ucp/capabilities/identity.js.map +1 -0
- package/dist/ucp/capabilities/order.d.ts +142 -0
- package/dist/ucp/capabilities/order.d.ts.map +1 -0
- package/dist/ucp/capabilities/order.js +383 -0
- package/dist/ucp/capabilities/order.js.map +1 -0
- package/dist/ucp/index.d.ts +18 -0
- package/dist/ucp/index.d.ts.map +1 -0
- package/dist/ucp/index.js +19 -0
- package/dist/ucp/index.js.map +1 -0
- package/dist/ucp/manifest.d.ts +62 -0
- package/dist/ucp/manifest.d.ts.map +1 -0
- package/dist/ucp/manifest.js +180 -0
- package/dist/ucp/manifest.js.map +1 -0
- package/dist/ucp/types.d.ts +327 -0
- package/dist/ucp/types.d.ts.map +1 -0
- package/dist/ucp/types.js +8 -0
- package/dist/ucp/types.js.map +1 -0
- package/package.json +3 -4
- package/src/auto-ui.ts +1 -1
- package/src/base.ts +2 -2
- package/src/cli-ui-renderer.ts +1 -1
- package/src/design-system/index.ts +30 -0
- package/src/design-system/tokens.ts +451 -0
- package/src/design-system/transaction-ui.ts +1038 -0
- package/src/generator.ts +58 -2
- package/src/index.ts +135 -124
- package/src/io.ts +108 -3
- package/src/rendering/components.ts +785 -0
- package/src/rendering/field-analyzer.ts +299 -0
- package/src/rendering/field-renderers.ts +356 -0
- package/src/rendering/index.ts +63 -0
- package/src/rendering/layout-selector.ts +390 -0
- package/src/rendering/template-engine.ts +254 -0
- package/src/schema-extractor.ts +225 -12
- package/src/stateful.ts +1 -1
- package/src/types.ts +10 -1
- package/src/ucp/ap2/handlers.ts +779 -0
- package/src/ucp/ap2/mandates.ts +354 -0
- package/src/ucp/ap2/types.ts +441 -0
- package/src/ucp/capabilities/checkout.ts +497 -0
- package/src/ucp/capabilities/identity.ts +425 -0
- package/src/ucp/capabilities/order.ts +549 -0
- package/src/ucp/index.ts +27 -0
- package/src/ucp/manifest.ts +257 -0
- package/src/ucp/types.ts +454 -0
- package/dist/cli-formatter.d.ts +0 -92
- package/dist/cli-formatter.d.ts.map +0 -1
- package/dist/cli-formatter.js +0 -486
- package/dist/cli-formatter.js.map +0 -1
- package/dist/context.d.ts +0 -6
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js +0 -3
- package/dist/context.js.map +0 -1
- package/dist/elicit.d.ts +0 -93
- package/dist/elicit.d.ts.map +0 -1
- package/dist/elicit.js +0 -373
- package/dist/elicit.js.map +0 -1
- package/dist/mcp-client.d.ts +0 -218
- package/dist/mcp-client.d.ts.map +0 -1
- package/dist/mcp-client.js +0 -424
- package/dist/mcp-client.js.map +0 -1
- package/dist/mcp-sdk-transport.d.ts +0 -88
- package/dist/mcp-sdk-transport.d.ts.map +0 -1
- package/dist/mcp-sdk-transport.js +0 -360
- package/dist/mcp-sdk-transport.js.map +0 -1
- package/dist/photon-config.d.ts +0 -86
- package/dist/photon-config.d.ts.map +0 -1
- package/dist/photon-config.js +0 -156
- package/dist/photon-config.js.map +0 -1
- package/dist/progress.d.ts +0 -93
- package/dist/progress.d.ts.map +0 -1
- package/dist/progress.js +0 -195
- package/dist/progress.js.map +0 -1
- package/src/cli-formatter.ts +0 -579
- package/src/context.ts +0 -7
- package/src/elicit.ts +0 -438
- package/src/mcp-client.ts +0 -561
- package/src/mcp-sdk-transport.ts +0 -449
- package/src/photon-config.ts +0 -201
- package/src/progress.ts +0 -224
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Field Renderers - Type-specific value rendering
|
|
3
|
+
*
|
|
4
|
+
* Provides specialized renderers for different field types:
|
|
5
|
+
* - Email (mailto link)
|
|
6
|
+
* - URL (clickable link)
|
|
7
|
+
* - Date (formatted)
|
|
8
|
+
* - Currency ($X.XX)
|
|
9
|
+
* - Boolean (checkmark)
|
|
10
|
+
* - Badge (status pill)
|
|
11
|
+
* - Code (syntax highlighted)
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Render a field value based on its type
|
|
15
|
+
*/
|
|
16
|
+
export function renderField(value, type, options) {
|
|
17
|
+
const { escapeHtml, locale = 'en-US', currency = 'USD', dateFormat = 'medium' } = options;
|
|
18
|
+
if (value === null || value === undefined) {
|
|
19
|
+
return '<span class="field-empty">—</span>';
|
|
20
|
+
}
|
|
21
|
+
switch (type) {
|
|
22
|
+
case 'email':
|
|
23
|
+
return renderEmail(value, escapeHtml);
|
|
24
|
+
case 'url':
|
|
25
|
+
case 'link':
|
|
26
|
+
return renderUrl(value, escapeHtml);
|
|
27
|
+
case 'date':
|
|
28
|
+
return renderDate(value, dateFormat, locale);
|
|
29
|
+
case 'currency':
|
|
30
|
+
return renderCurrency(value, currency, locale);
|
|
31
|
+
case 'boolean':
|
|
32
|
+
return renderBoolean(value);
|
|
33
|
+
case 'badge':
|
|
34
|
+
return renderBadge(value, escapeHtml);
|
|
35
|
+
case 'code':
|
|
36
|
+
return renderCode(value, escapeHtml);
|
|
37
|
+
case 'image':
|
|
38
|
+
return renderImage(value, escapeHtml);
|
|
39
|
+
case 'text':
|
|
40
|
+
default:
|
|
41
|
+
return escapeHtml(String(value));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Render email as mailto link
|
|
46
|
+
*/
|
|
47
|
+
export function renderEmail(value, escapeHtml) {
|
|
48
|
+
const email = String(value);
|
|
49
|
+
return `<a href="mailto:${escapeHtml(email)}" class="field-email">${escapeHtml(email)}</a>`;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Render URL as clickable link
|
|
53
|
+
*/
|
|
54
|
+
export function renderUrl(value, escapeHtml) {
|
|
55
|
+
const url = String(value);
|
|
56
|
+
// Add protocol if missing
|
|
57
|
+
const href = url.startsWith('http') ? url : `https://${url}`;
|
|
58
|
+
// Display shortened URL
|
|
59
|
+
const display = url.replace(/^https?:\/\//, '').replace(/\/$/, '');
|
|
60
|
+
return `<a href="${escapeHtml(href)}" target="_blank" rel="noopener" class="field-url">${escapeHtml(display)}</a>`;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Render date with formatting
|
|
64
|
+
*/
|
|
65
|
+
export function renderDate(value, format, locale) {
|
|
66
|
+
try {
|
|
67
|
+
const date = new Date(value);
|
|
68
|
+
if (isNaN(date.getTime())) {
|
|
69
|
+
return `<span class="field-date">${String(value)}</span>`;
|
|
70
|
+
}
|
|
71
|
+
if (format === 'relative') {
|
|
72
|
+
const diff = Date.now() - date.getTime();
|
|
73
|
+
const seconds = Math.floor(diff / 1000);
|
|
74
|
+
const minutes = Math.floor(seconds / 60);
|
|
75
|
+
const hours = Math.floor(minutes / 60);
|
|
76
|
+
const days = Math.floor(hours / 24);
|
|
77
|
+
let text;
|
|
78
|
+
if (days > 30) {
|
|
79
|
+
text = date.toLocaleDateString(locale);
|
|
80
|
+
}
|
|
81
|
+
else if (days > 0) {
|
|
82
|
+
text = `${days}d ago`;
|
|
83
|
+
}
|
|
84
|
+
else if (hours > 0) {
|
|
85
|
+
text = `${hours}h ago`;
|
|
86
|
+
}
|
|
87
|
+
else if (minutes > 0) {
|
|
88
|
+
text = `${minutes}m ago`;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
text = 'just now';
|
|
92
|
+
}
|
|
93
|
+
return `<span class="field-date" title="${date.toISOString()}">${text}</span>`;
|
|
94
|
+
}
|
|
95
|
+
const options = format === 'short'
|
|
96
|
+
? { month: 'numeric', day: 'numeric', year: '2-digit' }
|
|
97
|
+
: format === 'long'
|
|
98
|
+
? { month: 'long', day: 'numeric', year: 'numeric', hour: 'numeric', minute: '2-digit' }
|
|
99
|
+
: { month: 'short', day: 'numeric', year: 'numeric' };
|
|
100
|
+
return `<span class="field-date">${date.toLocaleDateString(locale, options)}</span>`;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return `<span class="field-date">${String(value)}</span>`;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Render number as currency
|
|
108
|
+
*/
|
|
109
|
+
export function renderCurrency(value, currency, locale) {
|
|
110
|
+
const num = typeof value === 'number' ? value : parseFloat(String(value));
|
|
111
|
+
if (isNaN(num)) {
|
|
112
|
+
return `<span class="field-currency">${String(value)}</span>`;
|
|
113
|
+
}
|
|
114
|
+
const formatted = new Intl.NumberFormat(locale, {
|
|
115
|
+
style: 'currency',
|
|
116
|
+
currency,
|
|
117
|
+
}).format(num);
|
|
118
|
+
return `<span class="field-currency">${formatted}</span>`;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Render boolean as checkmark
|
|
122
|
+
*/
|
|
123
|
+
export function renderBoolean(value) {
|
|
124
|
+
const bool = Boolean(value);
|
|
125
|
+
const icon = bool ? '✓' : '✗';
|
|
126
|
+
const className = bool ? 'field-boolean true' : 'field-boolean false';
|
|
127
|
+
return `<span class="${className}">${icon}</span>`;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Render value as status badge
|
|
131
|
+
*/
|
|
132
|
+
export function renderBadge(value, escapeHtml) {
|
|
133
|
+
const text = String(value);
|
|
134
|
+
const lower = text.toLowerCase();
|
|
135
|
+
let statusClass = '';
|
|
136
|
+
if (/active|success|complete|done|enabled|yes|true|approved/.test(lower)) {
|
|
137
|
+
statusClass = 'status-success';
|
|
138
|
+
}
|
|
139
|
+
else if (/inactive|error|failed|disabled|no|false|rejected|cancelled/.test(lower)) {
|
|
140
|
+
statusClass = 'status-error';
|
|
141
|
+
}
|
|
142
|
+
else if (/pending|warning|waiting|processing|review/.test(lower)) {
|
|
143
|
+
statusClass = 'status-warning';
|
|
144
|
+
}
|
|
145
|
+
else if (/draft|new|created/.test(lower)) {
|
|
146
|
+
statusClass = 'status-info';
|
|
147
|
+
}
|
|
148
|
+
return `<span class="field-badge ${statusClass}">${escapeHtml(text)}</span>`;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Render value as code
|
|
152
|
+
*/
|
|
153
|
+
export function renderCode(value, escapeHtml) {
|
|
154
|
+
const code = typeof value === 'object' ? JSON.stringify(value, null, 2) : String(value);
|
|
155
|
+
return `<code class="field-code">${escapeHtml(code)}</code>`;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Render value as image
|
|
159
|
+
*/
|
|
160
|
+
export function renderImage(value, escapeHtml) {
|
|
161
|
+
const url = String(value);
|
|
162
|
+
return `<img src="${escapeHtml(url)}" class="field-image" alt="" loading="lazy">`;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Generate CSS for field renderers
|
|
166
|
+
*/
|
|
167
|
+
export function generateFieldRendererCSS() {
|
|
168
|
+
return `
|
|
169
|
+
/* Field Renderers */
|
|
170
|
+
.field-empty {
|
|
171
|
+
color: var(--text-tertiary);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.field-email,
|
|
175
|
+
.field-url {
|
|
176
|
+
color: var(--accent-color);
|
|
177
|
+
text-decoration: none;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.field-email:hover,
|
|
181
|
+
.field-url:hover {
|
|
182
|
+
text-decoration: underline;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.field-date {
|
|
186
|
+
color: var(--text-secondary);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.field-currency {
|
|
190
|
+
font-variant-numeric: tabular-nums;
|
|
191
|
+
font-weight: 500;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.field-boolean {
|
|
195
|
+
font-weight: 600;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.field-boolean.true {
|
|
199
|
+
color: #22c55e;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.field-boolean.false {
|
|
203
|
+
color: #ef4444;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.field-badge {
|
|
207
|
+
display: inline-block;
|
|
208
|
+
padding: 2px 8px;
|
|
209
|
+
border-radius: 12px;
|
|
210
|
+
font-size: 0.75rem;
|
|
211
|
+
font-weight: 500;
|
|
212
|
+
text-transform: capitalize;
|
|
213
|
+
background: var(--bg-tertiary);
|
|
214
|
+
color: var(--text-primary);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.field-badge.status-success {
|
|
218
|
+
background: #dcfce7;
|
|
219
|
+
color: #166534;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.field-badge.status-error {
|
|
223
|
+
background: #fee2e2;
|
|
224
|
+
color: #991b1b;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
.field-badge.status-warning {
|
|
228
|
+
background: #fef3c7;
|
|
229
|
+
color: #92400e;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.field-badge.status-info {
|
|
233
|
+
background: #dbeafe;
|
|
234
|
+
color: #1e40af;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
.field-code {
|
|
238
|
+
font-family: var(--font-mono);
|
|
239
|
+
font-size: 0.875em;
|
|
240
|
+
padding: 2px 6px;
|
|
241
|
+
background: var(--bg-tertiary);
|
|
242
|
+
border-radius: 4px;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
.field-image {
|
|
246
|
+
max-width: 100%;
|
|
247
|
+
max-height: 200px;
|
|
248
|
+
border-radius: 8px;
|
|
249
|
+
object-fit: cover;
|
|
250
|
+
}
|
|
251
|
+
`;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Generate JavaScript for field renderers (to embed in HTML)
|
|
255
|
+
*/
|
|
256
|
+
export function generateFieldRenderersJS() {
|
|
257
|
+
return `
|
|
258
|
+
// Field Renderers
|
|
259
|
+
|
|
260
|
+
function renderFieldByType(value, type) {
|
|
261
|
+
if (value === null || value === undefined) {
|
|
262
|
+
return '<span class="field-empty">—</span>';
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
switch (type) {
|
|
266
|
+
case 'email':
|
|
267
|
+
return '<a href="mailto:' + escapeHtml(value) + '" class="field-email">' + escapeHtml(value) + '</a>';
|
|
268
|
+
|
|
269
|
+
case 'url':
|
|
270
|
+
case 'link':
|
|
271
|
+
const href = String(value).startsWith('http') ? value : 'https://' + value;
|
|
272
|
+
const display = String(value).replace(/^https?:\\/\\//, '').replace(/\\/$/, '');
|
|
273
|
+
return '<a href="' + escapeHtml(href) + '" target="_blank" rel="noopener" class="field-url">' + escapeHtml(display) + '</a>';
|
|
274
|
+
|
|
275
|
+
case 'date':
|
|
276
|
+
try {
|
|
277
|
+
const date = new Date(value);
|
|
278
|
+
if (isNaN(date.getTime())) return escapeHtml(String(value));
|
|
279
|
+
return '<span class="field-date">' + date.toLocaleDateString() + '</span>';
|
|
280
|
+
} catch {
|
|
281
|
+
return escapeHtml(String(value));
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
case 'currency':
|
|
285
|
+
const num = typeof value === 'number' ? value : parseFloat(value);
|
|
286
|
+
if (isNaN(num)) return escapeHtml(String(value));
|
|
287
|
+
return '<span class="field-currency">$' + num.toFixed(2) + '</span>';
|
|
288
|
+
|
|
289
|
+
case 'boolean':
|
|
290
|
+
const bool = Boolean(value);
|
|
291
|
+
return '<span class="field-boolean ' + (bool ? 'true' : 'false') + '">' + (bool ? '✓' : '✗') + '</span>';
|
|
292
|
+
|
|
293
|
+
case 'badge':
|
|
294
|
+
const text = String(value);
|
|
295
|
+
const lower = text.toLowerCase();
|
|
296
|
+
let statusClass = '';
|
|
297
|
+
if (/active|success|complete|done|enabled|yes|true|approved/.test(lower)) statusClass = 'status-success';
|
|
298
|
+
else if (/inactive|error|failed|disabled|no|false|rejected|cancelled/.test(lower)) statusClass = 'status-error';
|
|
299
|
+
else if (/pending|warning|waiting|processing|review/.test(lower)) statusClass = 'status-warning';
|
|
300
|
+
else if (/draft|new|created/.test(lower)) statusClass = 'status-info';
|
|
301
|
+
return '<span class="field-badge ' + statusClass + '">' + escapeHtml(text) + '</span>';
|
|
302
|
+
|
|
303
|
+
case 'code':
|
|
304
|
+
const code = typeof value === 'object' ? JSON.stringify(value, null, 2) : String(value);
|
|
305
|
+
return '<code class="field-code">' + escapeHtml(code) + '</code>';
|
|
306
|
+
|
|
307
|
+
case 'image':
|
|
308
|
+
return '<img src="' + escapeHtml(String(value)) + '" class="field-image" alt="" loading="lazy">';
|
|
309
|
+
|
|
310
|
+
case 'text':
|
|
311
|
+
default:
|
|
312
|
+
return escapeHtml(String(value));
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
`;
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=field-renderers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-renderers.js","sourceRoot":"","sources":["../../src/rendering/field-renderers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Rendering Module
|
|
3
|
+
*
|
|
4
|
+
* iOS-inspired, React Admin-influenced rendering system that:
|
|
5
|
+
* - Convention over configuration - works beautifully with zero annotations
|
|
6
|
+
* - Smart field detection - guesses meaning from field names and types
|
|
7
|
+
* - Progressive customization - JSDoc annotations for fine-tuning
|
|
8
|
+
* - List-centric paradigm - everything renders as configurable list items
|
|
9
|
+
*
|
|
10
|
+
* Design System based on:
|
|
11
|
+
* - Material Design 3 tokens: https://m3.material.io/foundations/design-tokens
|
|
12
|
+
* - Apple HIG (8pt grid): https://developer.apple.com/design/human-interface-guidelines/layout
|
|
13
|
+
*/
|
|
14
|
+
export * from './field-analyzer.js';
|
|
15
|
+
export * from './layout-selector.js';
|
|
16
|
+
export * from './components.js';
|
|
17
|
+
export * from './field-renderers.js';
|
|
18
|
+
export * from './template-engine.js';
|
|
19
|
+
export * from '../design-system/index.js';
|
|
20
|
+
/**
|
|
21
|
+
* Generate all JavaScript code for embedding in HTML
|
|
22
|
+
*/
|
|
23
|
+
export declare function generateSmartRenderingJS(): string;
|
|
24
|
+
/**
|
|
25
|
+
* Generate all CSS for embedding in HTML
|
|
26
|
+
*/
|
|
27
|
+
export declare function generateSmartRenderingCSS(): string;
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rendering/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAS1C;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAmBjD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAOlD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Rendering Module
|
|
3
|
+
*
|
|
4
|
+
* iOS-inspired, React Admin-influenced rendering system that:
|
|
5
|
+
* - Convention over configuration - works beautifully with zero annotations
|
|
6
|
+
* - Smart field detection - guesses meaning from field names and types
|
|
7
|
+
* - Progressive customization - JSDoc annotations for fine-tuning
|
|
8
|
+
* - List-centric paradigm - everything renders as configurable list items
|
|
9
|
+
*
|
|
10
|
+
* Design System based on:
|
|
11
|
+
* - Material Design 3 tokens: https://m3.material.io/foundations/design-tokens
|
|
12
|
+
* - Apple HIG (8pt grid): https://developer.apple.com/design/human-interface-guidelines/layout
|
|
13
|
+
*/
|
|
14
|
+
export * from './field-analyzer.js';
|
|
15
|
+
export * from './layout-selector.js';
|
|
16
|
+
export * from './components.js';
|
|
17
|
+
export * from './field-renderers.js';
|
|
18
|
+
export * from './template-engine.js';
|
|
19
|
+
export * from '../design-system/index.js';
|
|
20
|
+
import { generateFieldAnalyzerJS } from './field-analyzer.js';
|
|
21
|
+
import { generateLayoutSelectorJS } from './layout-selector.js';
|
|
22
|
+
import { generateComponentsJS, generateComponentCSS } from './components.js';
|
|
23
|
+
import { generateFieldRenderersJS, generateFieldRendererCSS } from './field-renderers.js';
|
|
24
|
+
import { generateTemplateEngineJS, generateTemplateEngineCSS } from './template-engine.js';
|
|
25
|
+
import { generateDesignSystemCSS, generateDesignSystemJS } from '../design-system/index.js';
|
|
26
|
+
/**
|
|
27
|
+
* Generate all JavaScript code for embedding in HTML
|
|
28
|
+
*/
|
|
29
|
+
export function generateSmartRenderingJS() {
|
|
30
|
+
return [
|
|
31
|
+
'// ==========================================================================',
|
|
32
|
+
'// Photon Design System + Smart Rendering',
|
|
33
|
+
'// Based on Material Design 3 + Apple HIG',
|
|
34
|
+
'// ==========================================================================',
|
|
35
|
+
'',
|
|
36
|
+
generateDesignSystemJS(),
|
|
37
|
+
'',
|
|
38
|
+
generateFieldAnalyzerJS(),
|
|
39
|
+
'',
|
|
40
|
+
generateLayoutSelectorJS(),
|
|
41
|
+
'',
|
|
42
|
+
generateFieldRenderersJS(),
|
|
43
|
+
'',
|
|
44
|
+
generateComponentsJS(),
|
|
45
|
+
'',
|
|
46
|
+
generateTemplateEngineJS(),
|
|
47
|
+
].join('\n');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Generate all CSS for embedding in HTML
|
|
51
|
+
*/
|
|
52
|
+
export function generateSmartRenderingCSS() {
|
|
53
|
+
return [
|
|
54
|
+
generateDesignSystemCSS(),
|
|
55
|
+
generateComponentCSS(),
|
|
56
|
+
generateFieldRendererCSS(),
|
|
57
|
+
generateTemplateEngineCSS(),
|
|
58
|
+
].join('\n');
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rendering/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAE1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAE5F;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,+EAA+E;QAC/E,2CAA2C;QAC3C,2CAA2C;QAC3C,+EAA+E;QAC/E,EAAE;QACF,sBAAsB,EAAE;QACxB,EAAE;QACF,uBAAuB,EAAE;QACzB,EAAE;QACF,wBAAwB,EAAE;QAC1B,EAAE;QACF,wBAAwB,EAAE;QAC1B,EAAE;QACF,oBAAoB,EAAE;QACtB,EAAE;QACF,wBAAwB,EAAE;KAC3B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,OAAO;QACL,uBAAuB,EAAE;QACzB,oBAAoB,EAAE;QACtB,wBAAwB,EAAE;QAC1B,yBAAyB,EAAE;KAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layout Selector - Auto-detect best layout for data
|
|
3
|
+
*
|
|
4
|
+
* Determines the optimal component/layout to render data based on:
|
|
5
|
+
* 1. Explicit @format annotation (highest priority)
|
|
6
|
+
* 2. Data shape (array vs object vs primitive)
|
|
7
|
+
* 3. Data content (has images -> grid, etc.)
|
|
8
|
+
*/
|
|
9
|
+
export type LayoutType = 'text' | 'card' | 'list' | 'grid' | 'tree' | 'kv' | 'chips' | 'table' | 'markdown' | 'mermaid' | 'code' | 'json' | 'html';
|
|
10
|
+
export interface LayoutHints {
|
|
11
|
+
title?: string;
|
|
12
|
+
subtitle?: string;
|
|
13
|
+
icon?: string;
|
|
14
|
+
badge?: string;
|
|
15
|
+
detail?: string;
|
|
16
|
+
image?: string;
|
|
17
|
+
style?: string;
|
|
18
|
+
accessory?: string;
|
|
19
|
+
columns?: number;
|
|
20
|
+
fields?: string[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Select the best layout type for given data
|
|
24
|
+
*/
|
|
25
|
+
export declare function selectLayout(data: any, format?: string, hints?: LayoutHints): LayoutType;
|
|
26
|
+
/**
|
|
27
|
+
* Check if object has fields that look like actual images (not just icon characters)
|
|
28
|
+
* We need to verify the VALUE looks like an image URL, not just the field name
|
|
29
|
+
*/
|
|
30
|
+
export declare function hasImageFields(obj: object): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Check if object is nested (has object/array values)
|
|
33
|
+
*/
|
|
34
|
+
export declare function isNested(obj: object, depth?: number): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Check if string contains markdown syntax
|
|
37
|
+
*/
|
|
38
|
+
export declare function hasMarkdownSyntax(text: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Parse layout hints from nested JSDoc syntax
|
|
41
|
+
* Example: {@title name, @subtitle email, @style inset}
|
|
42
|
+
*/
|
|
43
|
+
export declare function parseLayoutHints(hintsString: string): LayoutHints;
|
|
44
|
+
/**
|
|
45
|
+
* Generate JavaScript code for layout selector (to embed in HTML)
|
|
46
|
+
*/
|
|
47
|
+
export declare function generateLayoutSelectorJS(): string;
|
|
48
|
+
//# sourceMappingURL=layout-selector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-selector.d.ts","sourceRoot":"","sources":["../../src/rendering/layout-selector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,IAAI,GACJ,OAAO,GACP,OAAO,GACP,UAAU,GACV,SAAS,GACT,MAAM,GACN,MAAM,GACN,MAAM,CAAC;AAEX,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAoBD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,GAAG,EACT,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,WAAW,GAClB,UAAU,CAoFZ;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CA0BnD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAahE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAavD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAmCjE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAiIjD"}
|