@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 @@
|
|
|
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":"AAAA;;;;;GAKG;AAoBH,wCAAwC;AACxC,MAAM,cAAc,GAAG;IACrB,KAAK,EAAE,mDAAmD;IAC1D,QAAQ,EAAE,uFAAuF;IACjG,IAAI,EAAE,qDAAqD;IAC3D,KAAK,EAAE,qDAAqD;IAC5D,MAAM,EAAE,yDAAyD;IACjE,IAAI,EAAE,yCAAyC;IAC/C,EAAE,EAAE,gCAAgC;IACpC,IAAI,EAAE,iFAAiF;IACvF,OAAO,EAAE,6FAA6F;CACvG,CAAC;AAEF,gDAAgD;AAChD,MAAM,cAAc,GAAG;IACrB,KAAK,EAAE,4BAA4B;IACnC,GAAG,EAAE,uBAAuB;IAC5B,OAAO,EAAE,yCAAyC;IAClD,QAAQ,EAAE,oBAAoB;IAC9B,KAAK,EAAE,4CAA4C;CACpD,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAuB;IACnD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,OAAO,GAAiB,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,2CAA2C;IAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,IAAI,KAAK,EAAE,CAAC;YACT,OAAe,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YAC/B,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtB,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,QAAQ,GAAG,UAAU,CAAC;YAC9B,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAuB;IACtD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAoB,EAAE,CAAC;IAElC,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACpD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAEpD,oBAAoB;QACpB,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACvC,SAAS;QACX,CAAC;QAED,yBAAyB;QACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACvC,CAAC;iBAAM,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACrC,CAAC;iBAAM,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACvC,CAAC;iBAAM,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACtC,CAAC;iBAAM,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACtC,CAAC;YACD,SAAS;QACX,CAAC;QAED,uCAAuC;QACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAU;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5C,oEAAoE;IACpE,MAAM,UAAU,GAAG,gBAAgB,CAAC;IACpC,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAChD,qDAAqD;QACrD,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,SAAS,GAAG,OAAO;YAAE,OAAO,IAAI,CAAC;IACvC,CAAC;IAED,sBAAsB;IACtB,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,KAAK;QACV,sBAAsB;SACrB,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;QACpC,uBAAuB;SACtB,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;QACnB,uCAAuC;SACtC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SACtC,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAU,EAAE,QAAiB;IAC3D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IACtD,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAE5D,kBAAkB;IAClB,IAAI,QAAQ,KAAK,MAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,QAAQ,KAAK,UAAU,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACzD,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAChC,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqGR,CAAC;AACF,CAAC"}
|
|
@@ -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"}
|