@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.
Files changed (163) hide show
  1. package/dist/auto-ui.js +1 -1
  2. package/dist/auto-ui.js.map +1 -1
  3. package/dist/base.d.ts +1 -1
  4. package/dist/base.d.ts.map +1 -1
  5. package/dist/base.js +2 -2
  6. package/dist/base.js.map +1 -1
  7. package/dist/cli-ui-renderer.js +1 -1
  8. package/dist/cli-ui-renderer.js.map +1 -1
  9. package/dist/design-system/index.d.ts +21 -0
  10. package/dist/design-system/index.d.ts.map +1 -0
  11. package/dist/design-system/index.js +27 -0
  12. package/dist/design-system/index.js.map +1 -0
  13. package/dist/design-system/tokens.d.ts +149 -0
  14. package/dist/design-system/tokens.d.ts.map +1 -0
  15. package/dist/design-system/tokens.js +413 -0
  16. package/dist/design-system/tokens.js.map +1 -0
  17. package/dist/design-system/transaction-ui.d.ts +70 -0
  18. package/dist/design-system/transaction-ui.d.ts.map +1 -0
  19. package/dist/design-system/transaction-ui.js +982 -0
  20. package/dist/design-system/transaction-ui.js.map +1 -0
  21. package/dist/generator.d.ts +56 -6
  22. package/dist/generator.d.ts.map +1 -1
  23. package/dist/generator.js.map +1 -1
  24. package/dist/index.d.ts +6 -7
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +46 -56
  27. package/dist/index.js.map +1 -1
  28. package/dist/io.d.ts +103 -2
  29. package/dist/io.d.ts.map +1 -1
  30. package/dist/io.js +37 -1
  31. package/dist/io.js.map +1 -1
  32. package/dist/rendering/components.d.ts +29 -0
  33. package/dist/rendering/components.d.ts.map +1 -0
  34. package/dist/rendering/components.js +773 -0
  35. package/dist/rendering/components.js.map +1 -0
  36. package/dist/rendering/field-analyzer.d.ts +48 -0
  37. package/dist/rendering/field-analyzer.d.ts.map +1 -0
  38. package/dist/rendering/field-analyzer.js +270 -0
  39. package/dist/rendering/field-analyzer.js.map +1 -0
  40. package/dist/rendering/field-renderers.d.ts +64 -0
  41. package/dist/rendering/field-renderers.d.ts.map +1 -0
  42. package/dist/rendering/field-renderers.js +317 -0
  43. package/dist/rendering/field-renderers.js.map +1 -0
  44. package/dist/rendering/index.d.ts +28 -0
  45. package/dist/rendering/index.d.ts.map +1 -0
  46. package/dist/rendering/index.js +60 -0
  47. package/dist/rendering/index.js.map +1 -0
  48. package/dist/rendering/layout-selector.d.ts +48 -0
  49. package/dist/rendering/layout-selector.d.ts.map +1 -0
  50. package/dist/rendering/layout-selector.js +347 -0
  51. package/dist/rendering/layout-selector.js.map +1 -0
  52. package/dist/rendering/template-engine.d.ts +41 -0
  53. package/dist/rendering/template-engine.d.ts.map +1 -0
  54. package/dist/rendering/template-engine.js +236 -0
  55. package/dist/rendering/template-engine.js.map +1 -0
  56. package/dist/schema-extractor.d.ts +30 -0
  57. package/dist/schema-extractor.d.ts.map +1 -1
  58. package/dist/schema-extractor.js +205 -12
  59. package/dist/schema-extractor.js.map +1 -1
  60. package/dist/stateful.js +1 -1
  61. package/dist/stateful.js.map +1 -1
  62. package/dist/types.d.ts +9 -1
  63. package/dist/types.d.ts.map +1 -1
  64. package/dist/types.js.map +1 -1
  65. package/dist/ucp/ap2/handlers.d.ts +242 -0
  66. package/dist/ucp/ap2/handlers.d.ts.map +1 -0
  67. package/dist/ucp/ap2/handlers.js +482 -0
  68. package/dist/ucp/ap2/handlers.js.map +1 -0
  69. package/dist/ucp/ap2/mandates.d.ts +95 -0
  70. package/dist/ucp/ap2/mandates.d.ts.map +1 -0
  71. package/dist/ucp/ap2/mandates.js +234 -0
  72. package/dist/ucp/ap2/mandates.js.map +1 -0
  73. package/dist/ucp/ap2/types.d.ts +305 -0
  74. package/dist/ucp/ap2/types.d.ts.map +1 -0
  75. package/dist/ucp/ap2/types.js +8 -0
  76. package/dist/ucp/ap2/types.js.map +1 -0
  77. package/dist/ucp/capabilities/checkout.d.ts +118 -0
  78. package/dist/ucp/capabilities/checkout.d.ts.map +1 -0
  79. package/dist/ucp/capabilities/checkout.js +344 -0
  80. package/dist/ucp/capabilities/checkout.js.map +1 -0
  81. package/dist/ucp/capabilities/identity.d.ts +130 -0
  82. package/dist/ucp/capabilities/identity.d.ts.map +1 -0
  83. package/dist/ucp/capabilities/identity.js +290 -0
  84. package/dist/ucp/capabilities/identity.js.map +1 -0
  85. package/dist/ucp/capabilities/order.d.ts +142 -0
  86. package/dist/ucp/capabilities/order.d.ts.map +1 -0
  87. package/dist/ucp/capabilities/order.js +383 -0
  88. package/dist/ucp/capabilities/order.js.map +1 -0
  89. package/dist/ucp/index.d.ts +18 -0
  90. package/dist/ucp/index.d.ts.map +1 -0
  91. package/dist/ucp/index.js +19 -0
  92. package/dist/ucp/index.js.map +1 -0
  93. package/dist/ucp/manifest.d.ts +62 -0
  94. package/dist/ucp/manifest.d.ts.map +1 -0
  95. package/dist/ucp/manifest.js +180 -0
  96. package/dist/ucp/manifest.js.map +1 -0
  97. package/dist/ucp/types.d.ts +327 -0
  98. package/dist/ucp/types.d.ts.map +1 -0
  99. package/dist/ucp/types.js +8 -0
  100. package/dist/ucp/types.js.map +1 -0
  101. package/package.json +3 -4
  102. package/src/auto-ui.ts +1 -1
  103. package/src/base.ts +2 -2
  104. package/src/cli-ui-renderer.ts +1 -1
  105. package/src/design-system/index.ts +30 -0
  106. package/src/design-system/tokens.ts +451 -0
  107. package/src/design-system/transaction-ui.ts +1038 -0
  108. package/src/generator.ts +58 -2
  109. package/src/index.ts +135 -124
  110. package/src/io.ts +108 -3
  111. package/src/rendering/components.ts +785 -0
  112. package/src/rendering/field-analyzer.ts +299 -0
  113. package/src/rendering/field-renderers.ts +356 -0
  114. package/src/rendering/index.ts +63 -0
  115. package/src/rendering/layout-selector.ts +390 -0
  116. package/src/rendering/template-engine.ts +254 -0
  117. package/src/schema-extractor.ts +225 -12
  118. package/src/stateful.ts +1 -1
  119. package/src/types.ts +10 -1
  120. package/src/ucp/ap2/handlers.ts +779 -0
  121. package/src/ucp/ap2/mandates.ts +354 -0
  122. package/src/ucp/ap2/types.ts +441 -0
  123. package/src/ucp/capabilities/checkout.ts +497 -0
  124. package/src/ucp/capabilities/identity.ts +425 -0
  125. package/src/ucp/capabilities/order.ts +549 -0
  126. package/src/ucp/index.ts +27 -0
  127. package/src/ucp/manifest.ts +257 -0
  128. package/src/ucp/types.ts +454 -0
  129. package/dist/cli-formatter.d.ts +0 -92
  130. package/dist/cli-formatter.d.ts.map +0 -1
  131. package/dist/cli-formatter.js +0 -486
  132. package/dist/cli-formatter.js.map +0 -1
  133. package/dist/context.d.ts +0 -6
  134. package/dist/context.d.ts.map +0 -1
  135. package/dist/context.js +0 -3
  136. package/dist/context.js.map +0 -1
  137. package/dist/elicit.d.ts +0 -93
  138. package/dist/elicit.d.ts.map +0 -1
  139. package/dist/elicit.js +0 -373
  140. package/dist/elicit.js.map +0 -1
  141. package/dist/mcp-client.d.ts +0 -218
  142. package/dist/mcp-client.d.ts.map +0 -1
  143. package/dist/mcp-client.js +0 -424
  144. package/dist/mcp-client.js.map +0 -1
  145. package/dist/mcp-sdk-transport.d.ts +0 -88
  146. package/dist/mcp-sdk-transport.d.ts.map +0 -1
  147. package/dist/mcp-sdk-transport.js +0 -360
  148. package/dist/mcp-sdk-transport.js.map +0 -1
  149. package/dist/photon-config.d.ts +0 -86
  150. package/dist/photon-config.d.ts.map +0 -1
  151. package/dist/photon-config.js +0 -156
  152. package/dist/photon-config.js.map +0 -1
  153. package/dist/progress.d.ts +0 -93
  154. package/dist/progress.d.ts.map +0 -1
  155. package/dist/progress.js +0 -195
  156. package/dist/progress.js.map +0 -1
  157. package/src/cli-formatter.ts +0 -579
  158. package/src/context.ts +0 -7
  159. package/src/elicit.ts +0 -438
  160. package/src/mcp-client.ts +0 -561
  161. package/src/mcp-sdk-transport.ts +0 -449
  162. package/src/photon-config.ts +0 -201
  163. 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"}