@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 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/rendering/components.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+YR,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8VR,CAAC;AACF,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Field Analyzer - Smart detection of field semantics
3
+ *
4
+ * Analyzes object fields to determine their semantic meaning
5
+ * for automatic UI rendering (iOS/React Admin inspired).
6
+ */
7
+ export interface FieldMapping {
8
+ title?: string;
9
+ subtitle?: string;
10
+ icon?: string;
11
+ badge?: string;
12
+ detail?: string;
13
+ link?: string;
14
+ id?: string;
15
+ date?: string;
16
+ boolean?: string;
17
+ remaining: string[];
18
+ }
19
+ export interface FieldTypeHint {
20
+ field: string;
21
+ type: 'email' | 'url' | 'date' | 'currency' | 'boolean' | 'code' | 'image' | 'text';
22
+ }
23
+ /**
24
+ * Analyze an object's fields to determine semantic mapping
25
+ */
26
+ export declare function analyzeFields(data: object | object[]): FieldMapping;
27
+ /**
28
+ * Detect field types from sample values
29
+ */
30
+ export declare function detectFieldTypes(data: object | object[]): FieldTypeHint[];
31
+ /**
32
+ * Check if a field value looks like an image URL or emoji
33
+ */
34
+ export declare function isVisualField(value: any): boolean;
35
+ /**
36
+ * Format a field name as a human-readable label
37
+ * camelCase -> Title Case, snake_case -> Title Case
38
+ */
39
+ export declare function formatFieldLabel(field: string): string;
40
+ /**
41
+ * Get the best display value for a field
42
+ */
43
+ export declare function getDisplayValue(value: any, typeHint?: string): string;
44
+ /**
45
+ * Generate JavaScript code for field analyzer (to embed in HTML)
46
+ */
47
+ export declare function generateFieldAnalyzerJS(): string;
48
+ //# sourceMappingURL=field-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-analyzer.d.ts","sourceRoot":"","sources":["../../src/rendering/field-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,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,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;CACrF;AAwBD;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,YAAY,CAgCnE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,aAAa,EAAE,CA4CzE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAajD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAStD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAqBrE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAuGhD"}
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Field Analyzer - Smart detection of field semantics
3
+ *
4
+ * Analyzes object fields to determine their semantic meaning
5
+ * for automatic UI rendering (iOS/React Admin inspired).
6
+ */
7
+ // Patterns for semantic field detection
8
+ const FIELD_PATTERNS = {
9
+ title: /^(name|title|label|displayName|heading|subject)$/i,
10
+ subtitle: /^(description|subtitle|summary|bio|about|tagline|ip|address|host|hostname|endpoint)$/i,
11
+ icon: /^(icon|avatar|image|photo|thumbnail|picture|logo)$/i,
12
+ badge: /^(status|state|type|role|category|kind|tag|level)$/i,
13
+ detail: /^(count|total|amount|price|value|size|quantity|score)$/i,
14
+ link: /^(url|link|href|website|homepage|uri)$/i,
15
+ id: /^(id|key|code|uuid|slug|_id)$/i,
16
+ date: /^(date|time|createdAt|updatedAt|created|updated|timestamp|.*At|.*Date|.*Time)$/i,
17
+ boolean: /^(is[A-Z]|has[A-Z]|can[A-Z]|should[A-Z]|enabled|disabled|active|visible|checked|selected)$/i,
18
+ };
19
+ // Patterns for type detection from field values
20
+ const VALUE_PATTERNS = {
21
+ email: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
22
+ url: /^(https?:\/\/|www\.)/i,
23
+ isoDate: /^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2})?/,
24
+ currency: /^\$?\d+(\.\d{2})?$/,
25
+ image: /\.(jpg|jpeg|png|gif|webp|svg|ico)(\?.*)?$/i,
26
+ };
27
+ /**
28
+ * Analyze an object's fields to determine semantic mapping
29
+ */
30
+ export function analyzeFields(data) {
31
+ const sample = Array.isArray(data) ? data[0] : data;
32
+ if (!sample || typeof sample !== 'object') {
33
+ return { remaining: [] };
34
+ }
35
+ const fields = Object.keys(sample);
36
+ const mapping = { remaining: [] };
37
+ const assigned = new Set();
38
+ // First pass: match by field name patterns
39
+ for (const [slot, pattern] of Object.entries(FIELD_PATTERNS)) {
40
+ const match = fields.find(f => pattern.test(f) && !assigned.has(f));
41
+ if (match) {
42
+ mapping[slot] = match;
43
+ assigned.add(match);
44
+ }
45
+ }
46
+ // Special case: if no subtitle but we have email, use it
47
+ if (!mapping.subtitle) {
48
+ const emailField = fields.find(f => /email/i.test(f) && !assigned.has(f));
49
+ if (emailField) {
50
+ mapping.subtitle = emailField;
51
+ assigned.add(emailField);
52
+ }
53
+ }
54
+ // Collect remaining fields
55
+ mapping.remaining = fields.filter(f => !assigned.has(f));
56
+ return mapping;
57
+ }
58
+ /**
59
+ * Detect field types from sample values
60
+ */
61
+ export function detectFieldTypes(data) {
62
+ const sample = Array.isArray(data) ? data[0] : data;
63
+ if (!sample || typeof sample !== 'object') {
64
+ return [];
65
+ }
66
+ const hints = [];
67
+ for (const [field, value] of Object.entries(sample)) {
68
+ if (value === null || value === undefined)
69
+ continue;
70
+ // Boolean detection
71
+ if (typeof value === 'boolean') {
72
+ hints.push({ field, type: 'boolean' });
73
+ continue;
74
+ }
75
+ // String-based detection
76
+ if (typeof value === 'string') {
77
+ if (VALUE_PATTERNS.email.test(value)) {
78
+ hints.push({ field, type: 'email' });
79
+ }
80
+ else if (VALUE_PATTERNS.url.test(value)) {
81
+ hints.push({ field, type: 'url' });
82
+ }
83
+ else if (VALUE_PATTERNS.image.test(value)) {
84
+ hints.push({ field, type: 'image' });
85
+ }
86
+ else if (VALUE_PATTERNS.isoDate.test(value)) {
87
+ hints.push({ field, type: 'date' });
88
+ }
89
+ else if (VALUE_PATTERNS.currency.test(value)) {
90
+ hints.push({ field, type: 'currency' });
91
+ }
92
+ else {
93
+ hints.push({ field, type: 'text' });
94
+ }
95
+ continue;
96
+ }
97
+ // Number with currency-like field name
98
+ if (typeof value === 'number') {
99
+ if (/price|cost|amount|total|fee/i.test(field)) {
100
+ hints.push({ field, type: 'currency' });
101
+ }
102
+ }
103
+ }
104
+ return hints;
105
+ }
106
+ /**
107
+ * Check if a field value looks like an image URL or emoji
108
+ */
109
+ export function isVisualField(value) {
110
+ if (typeof value !== 'string')
111
+ return false;
112
+ // Emoji detection (single emoji character or common emoji patterns)
113
+ const emojiRegex = /^[\p{Emoji}]$/u;
114
+ if (emojiRegex.test(value) || value.length <= 2) {
115
+ // Check if it's actually an emoji (simplified check)
116
+ const codePoint = value.codePointAt(0) || 0;
117
+ if (codePoint > 0x1F000)
118
+ return true;
119
+ }
120
+ // Image URL detection
121
+ return VALUE_PATTERNS.image.test(value) || VALUE_PATTERNS.url.test(value);
122
+ }
123
+ /**
124
+ * Format a field name as a human-readable label
125
+ * camelCase -> Title Case, snake_case -> Title Case
126
+ */
127
+ export function formatFieldLabel(field) {
128
+ return field
129
+ // camelCase to spaces
130
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
131
+ // snake_case to spaces
132
+ .replace(/_/g, ' ')
133
+ // Capitalize first letter of each word
134
+ .replace(/\b\w/g, c => c.toUpperCase())
135
+ .trim();
136
+ }
137
+ /**
138
+ * Get the best display value for a field
139
+ */
140
+ export function getDisplayValue(value, typeHint) {
141
+ if (value === null || value === undefined)
142
+ return '—';
143
+ if (typeof value === 'boolean')
144
+ return value ? '✓' : '✗';
145
+ if (typeof value === 'object')
146
+ return JSON.stringify(value);
147
+ // Date formatting
148
+ if (typeHint === 'date' && typeof value === 'string') {
149
+ try {
150
+ const date = new Date(value);
151
+ return date.toLocaleDateString();
152
+ }
153
+ catch {
154
+ return String(value);
155
+ }
156
+ }
157
+ // Currency formatting
158
+ if (typeHint === 'currency' && typeof value === 'number') {
159
+ return `$${value.toFixed(2)}`;
160
+ }
161
+ return String(value);
162
+ }
163
+ /**
164
+ * Generate JavaScript code for field analyzer (to embed in HTML)
165
+ */
166
+ export function generateFieldAnalyzerJS() {
167
+ return `
168
+ // Field Analyzer - Smart detection of field semantics
169
+ const FIELD_PATTERNS = {
170
+ title: /^(name|title|label|displayName|heading|subject)$/i,
171
+ subtitle: /^(description|subtitle|summary|bio|about|tagline|ip|address|host|hostname|endpoint)$/i,
172
+ icon: /^(icon|avatar|image|photo|thumbnail|picture|logo)$/i,
173
+ badge: /^(status|state|type|role|category|kind|tag|level)$/i,
174
+ detail: /^(count|total|amount|price|value|size|quantity|score)$/i,
175
+ link: /^(url|link|href|website|homepage|uri)$/i,
176
+ id: /^(id|key|code|uuid|slug|_id)$/i,
177
+ date: /^(date|time|createdAt|updatedAt|created|updated|timestamp|.*At|.*Date|.*Time)$/i,
178
+ boolean: /^(is[A-Z]|has[A-Z]|can[A-Z]|should[A-Z]|enabled|disabled|active|visible|checked|selected)$/i,
179
+ };
180
+
181
+ const VALUE_PATTERNS = {
182
+ email: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,
183
+ url: /^(https?:\\/\\/|www\\.)/i,
184
+ isoDate: /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2})?/,
185
+ currency: /^\\$?\\d+(\\.\\d{2})?$/,
186
+ image: /\\.(jpg|jpeg|png|gif|webp|svg|ico)(\\?.*)?$/i,
187
+ };
188
+
189
+ function analyzeFields(data) {
190
+ const sample = Array.isArray(data) ? data[0] : data;
191
+ if (!sample || typeof sample !== 'object') {
192
+ return { remaining: [] };
193
+ }
194
+
195
+ const fields = Object.keys(sample);
196
+ const mapping = { remaining: [] };
197
+ const assigned = new Set();
198
+
199
+ for (const [slot, pattern] of Object.entries(FIELD_PATTERNS)) {
200
+ const match = fields.find(f => pattern.test(f) && !assigned.has(f));
201
+ if (match) {
202
+ mapping[slot] = match;
203
+ assigned.add(match);
204
+ }
205
+ }
206
+
207
+ if (!mapping.subtitle) {
208
+ const emailField = fields.find(f => /email/i.test(f) && !assigned.has(f));
209
+ if (emailField) {
210
+ mapping.subtitle = emailField;
211
+ assigned.add(emailField);
212
+ }
213
+ }
214
+
215
+ mapping.remaining = fields.filter(f => !assigned.has(f));
216
+ return mapping;
217
+ }
218
+
219
+ function detectFieldTypes(data) {
220
+ const sample = Array.isArray(data) ? data[0] : data;
221
+ if (!sample || typeof sample !== 'object') return [];
222
+
223
+ const hints = [];
224
+ for (const [field, value] of Object.entries(sample)) {
225
+ if (value === null || value === undefined) continue;
226
+ if (typeof value === 'boolean') {
227
+ hints.push({ field, type: 'boolean' });
228
+ } else if (typeof value === 'string') {
229
+ if (VALUE_PATTERNS.email.test(value)) hints.push({ field, type: 'email' });
230
+ else if (VALUE_PATTERNS.url.test(value)) hints.push({ field, type: 'url' });
231
+ else if (VALUE_PATTERNS.image.test(value)) hints.push({ field, type: 'image' });
232
+ else if (VALUE_PATTERNS.isoDate.test(value)) hints.push({ field, type: 'date' });
233
+ else hints.push({ field, type: 'text' });
234
+ } else if (typeof value === 'number' && /price|cost|amount|total|fee/i.test(field)) {
235
+ hints.push({ field, type: 'currency' });
236
+ }
237
+ }
238
+ return hints;
239
+ }
240
+
241
+ function isVisualField(value) {
242
+ if (typeof value !== 'string') return false;
243
+ const codePoint = value.codePointAt(0) || 0;
244
+ if (codePoint > 0x1F000 && value.length <= 2) return true;
245
+ return VALUE_PATTERNS.image.test(value) || VALUE_PATTERNS.url.test(value);
246
+ }
247
+
248
+ function formatFieldLabel(field) {
249
+ return field
250
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
251
+ .replace(/_/g, ' ')
252
+ .replace(/\\b\\w/g, c => c.toUpperCase())
253
+ .trim();
254
+ }
255
+
256
+ function getDisplayValue(value, typeHint) {
257
+ if (value === null || value === undefined) return '—';
258
+ if (typeof value === 'boolean') return value ? '✓' : '✗';
259
+ if (typeof value === 'object') return JSON.stringify(value);
260
+ if (typeHint === 'date' && typeof value === 'string') {
261
+ try { return new Date(value).toLocaleDateString(); } catch { return String(value); }
262
+ }
263
+ if (typeHint === 'currency' && typeof value === 'number') {
264
+ return '$' + value.toFixed(2);
265
+ }
266
+ return String(value);
267
+ }
268
+ `;
269
+ }
270
+ //# sourceMappingURL=field-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-analyzer.js","sourceRoot":"","sources":["../../src/rendering/field-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
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
+ export type FieldRendererType = 'text' | 'email' | 'url' | 'link' | 'date' | 'currency' | 'boolean' | 'badge' | 'code' | 'image';
14
+ export interface FieldRendererOptions {
15
+ escapeHtml: (str: string) => string;
16
+ locale?: string;
17
+ currency?: string;
18
+ dateFormat?: 'short' | 'medium' | 'long' | 'relative';
19
+ }
20
+ /**
21
+ * Render a field value based on its type
22
+ */
23
+ export declare function renderField(value: any, type: FieldRendererType, options: FieldRendererOptions): string;
24
+ /**
25
+ * Render email as mailto link
26
+ */
27
+ export declare function renderEmail(value: any, escapeHtml: (s: string) => string): string;
28
+ /**
29
+ * Render URL as clickable link
30
+ */
31
+ export declare function renderUrl(value: any, escapeHtml: (s: string) => string): string;
32
+ /**
33
+ * Render date with formatting
34
+ */
35
+ export declare function renderDate(value: any, format: 'short' | 'medium' | 'long' | 'relative', locale: string): string;
36
+ /**
37
+ * Render number as currency
38
+ */
39
+ export declare function renderCurrency(value: any, currency: string, locale: string): string;
40
+ /**
41
+ * Render boolean as checkmark
42
+ */
43
+ export declare function renderBoolean(value: any): string;
44
+ /**
45
+ * Render value as status badge
46
+ */
47
+ export declare function renderBadge(value: any, escapeHtml: (s: string) => string): string;
48
+ /**
49
+ * Render value as code
50
+ */
51
+ export declare function renderCode(value: any, escapeHtml: (s: string) => string): string;
52
+ /**
53
+ * Render value as image
54
+ */
55
+ export declare function renderImage(value: any, escapeHtml: (s: string) => string): string;
56
+ /**
57
+ * Generate CSS for field renderers
58
+ */
59
+ export declare function generateFieldRendererCSS(): string;
60
+ /**
61
+ * Generate JavaScript for field renderers (to embed in HTML)
62
+ */
63
+ export declare function generateFieldRenderersJS(): string;
64
+ //# sourceMappingURL=field-renderers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-renderers.d.ts","sourceRoot":"","sources":["../../src/rendering/field-renderers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,OAAO,GACP,KAAK,GACL,MAAM,GACN,MAAM,GACN,UAAU,GACV,SAAS,GACT,OAAO,GACP,MAAM,GACN,OAAO,CAAC;AAEZ,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;CACvD;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,GAAG,EACV,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,oBAAoB,GAC5B,MAAM,CA6BR;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAGjF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAO/E;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,EAChD,MAAM,EAAE,MAAM,GACb,MAAM,CAuCR;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAYnF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAKhD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAgBjF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAGhF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAGjF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAqFjD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CA4DjD"}