@portel/photon-core 2.3.0 → 2.5.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/asset-discovery.d.ts +25 -0
- package/dist/asset-discovery.d.ts.map +1 -0
- package/dist/asset-discovery.js +145 -0
- package/dist/asset-discovery.js.map +1 -0
- package/dist/base.d.ts +6 -0
- package/dist/base.d.ts.map +1 -1
- package/dist/base.js +11 -1
- package/dist/base.js.map +1 -1
- package/dist/class-detection.d.ts +32 -0
- package/dist/class-detection.d.ts.map +1 -0
- package/dist/class-detection.js +86 -0
- package/dist/class-detection.js.map +1 -0
- package/dist/collections/ReactiveArray.d.ts +97 -0
- package/dist/collections/ReactiveArray.d.ts.map +1 -0
- package/dist/collections/ReactiveArray.js +158 -0
- package/dist/collections/ReactiveArray.js.map +1 -0
- package/dist/collections/ReactiveMap.d.ts +50 -0
- package/dist/collections/ReactiveMap.d.ts.map +1 -0
- package/dist/collections/ReactiveMap.js +71 -0
- package/dist/collections/ReactiveMap.js.map +1 -0
- package/dist/collections/ReactiveSet.d.ts +50 -0
- package/dist/collections/ReactiveSet.d.ts.map +1 -0
- package/dist/collections/ReactiveSet.js +71 -0
- package/dist/collections/ReactiveSet.js.map +1 -0
- package/dist/collections/index.d.ts +44 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/index.js +44 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/compiler.d.ts +22 -0
- package/dist/compiler.d.ts.map +1 -0
- package/dist/compiler.js +48 -0
- package/dist/compiler.js.map +1 -0
- package/dist/env-utils.d.ts +61 -0
- package/dist/env-utils.d.ts.map +1 -0
- package/dist/env-utils.js +171 -0
- package/dist/env-utils.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -1
- package/dist/mime-types.d.ts +13 -0
- package/dist/mime-types.d.ts.map +1 -0
- package/dist/mime-types.js +47 -0
- package/dist/mime-types.js.map +1 -0
- package/dist/rendering/index.d.ts +49 -0
- package/dist/rendering/index.d.ts.map +1 -1
- package/dist/rendering/index.js +153 -0
- package/dist/rendering/index.js.map +1 -1
- package/dist/schema-extractor.d.ts.map +1 -1
- package/dist/schema-extractor.js +3 -0
- package/dist/schema-extractor.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/ui-types/Cards.d.ts +139 -0
- package/dist/ui-types/Cards.d.ts.map +1 -0
- package/dist/ui-types/Cards.js +235 -0
- package/dist/ui-types/Cards.js.map +1 -0
- package/dist/ui-types/Chart.d.ts +136 -0
- package/dist/ui-types/Chart.d.ts.map +1 -0
- package/dist/ui-types/Chart.js +188 -0
- package/dist/ui-types/Chart.js.map +1 -0
- package/dist/ui-types/Field.d.ts +342 -0
- package/dist/ui-types/Field.d.ts.map +1 -0
- package/dist/ui-types/Field.js +200 -0
- package/dist/ui-types/Field.js.map +1 -0
- package/dist/ui-types/FieldRenderer.d.ts +32 -0
- package/dist/ui-types/FieldRenderer.d.ts.map +1 -0
- package/dist/ui-types/FieldRenderer.js +277 -0
- package/dist/ui-types/FieldRenderer.js.map +1 -0
- package/dist/ui-types/Form.d.ts +212 -0
- package/dist/ui-types/Form.d.ts.map +1 -0
- package/dist/ui-types/Form.js +278 -0
- package/dist/ui-types/Form.js.map +1 -0
- package/dist/ui-types/Progress.d.ts +130 -0
- package/dist/ui-types/Progress.d.ts.map +1 -0
- package/dist/ui-types/Progress.js +191 -0
- package/dist/ui-types/Progress.js.map +1 -0
- package/dist/ui-types/Stats.d.ts +108 -0
- package/dist/ui-types/Stats.d.ts.map +1 -0
- package/dist/ui-types/Stats.js +162 -0
- package/dist/ui-types/Stats.js.map +1 -0
- package/dist/ui-types/Table.d.ts +206 -0
- package/dist/ui-types/Table.d.ts.map +1 -0
- package/dist/ui-types/Table.js +367 -0
- package/dist/ui-types/Table.js.map +1 -0
- package/dist/ui-types/base.d.ts +17 -0
- package/dist/ui-types/base.d.ts.map +1 -0
- package/dist/ui-types/base.js +18 -0
- package/dist/ui-types/base.js.map +1 -0
- package/dist/ui-types/index.d.ts +42 -0
- package/dist/ui-types/index.d.ts.map +1 -0
- package/dist/ui-types/index.js +50 -0
- package/dist/ui-types/index.js.map +1 -0
- package/dist/validation.d.ts +51 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +249 -0
- package/dist/validation.js.map +1 -0
- package/dist/version-check.d.ts +22 -0
- package/dist/version-check.d.ts.map +1 -0
- package/dist/version-check.js +91 -0
- package/dist/version-check.js.map +1 -0
- package/package.json +2 -2
- package/src/asset-discovery.ts +161 -0
- package/src/base.ts +13 -1
- package/src/class-detection.ts +94 -0
- package/src/collections/ReactiveArray.ts +179 -0
- package/src/collections/ReactiveMap.ts +81 -0
- package/src/collections/ReactiveSet.ts +81 -0
- package/src/collections/index.ts +44 -0
- package/src/compiler.ts +57 -0
- package/src/env-utils.ts +216 -0
- package/src/index.ts +155 -0
- package/src/mime-types.ts +49 -0
- package/src/rendering/index.ts +197 -0
- package/src/schema-extractor.ts +4 -0
- package/src/types.ts +4 -0
- package/src/ui-types/Cards.ts +286 -0
- package/src/ui-types/Chart.ts +239 -0
- package/src/ui-types/Field.ts +594 -0
- package/src/ui-types/FieldRenderer.ts +364 -0
- package/src/ui-types/Form.ts +363 -0
- package/src/ui-types/Progress.ts +237 -0
- package/src/ui-types/Stats.ts +204 -0
- package/src/ui-types/Table.ts +438 -0
- package/src/ui-types/base.ts +25 -0
- package/src/ui-types/index.ts +96 -0
- package/src/ui-types/ui-types.test.ts +444 -0
- package/src/validation.ts +363 -0
- package/src/version-check.ts +92 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress - Purpose-driven type for progress indicators
|
|
3
|
+
*
|
|
4
|
+
* Automatically renders as progress bars or steps.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* // Simple progress bar
|
|
9
|
+
* async uploadStatus() {
|
|
10
|
+
* return new Progress(75)
|
|
11
|
+
* .label('Uploading files...')
|
|
12
|
+
* .color('blue');
|
|
13
|
+
* }
|
|
14
|
+
*
|
|
15
|
+
* // Multiple progress bars
|
|
16
|
+
* async projectStatus() {
|
|
17
|
+
* return new Progress()
|
|
18
|
+
* .bar('Design', 100, { color: 'green' })
|
|
19
|
+
* .bar('Development', 65, { color: 'blue' })
|
|
20
|
+
* .bar('Testing', 20, { color: 'yellow' });
|
|
21
|
+
* }
|
|
22
|
+
*
|
|
23
|
+
* // Step indicator
|
|
24
|
+
* async checkoutSteps() {
|
|
25
|
+
* return new Progress('steps')
|
|
26
|
+
* .step('Cart', 'completed')
|
|
27
|
+
* .step('Shipping', 'current')
|
|
28
|
+
* .step('Payment', 'pending')
|
|
29
|
+
* .step('Confirm', 'pending');
|
|
30
|
+
* }
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
import { PhotonUIType } from './base.js';
|
|
34
|
+
export class Progress extends PhotonUIType {
|
|
35
|
+
_photonType = 'progress';
|
|
36
|
+
_bars = [];
|
|
37
|
+
_steps = [];
|
|
38
|
+
_value = 0;
|
|
39
|
+
_max = 100;
|
|
40
|
+
_options = {
|
|
41
|
+
style: 'bar',
|
|
42
|
+
size: 'md',
|
|
43
|
+
showValue: true,
|
|
44
|
+
animated: true,
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Create a new Progress indicator
|
|
48
|
+
* @param valueOrStyle Initial value (0-100) or style ('steps', 'circle')
|
|
49
|
+
*/
|
|
50
|
+
constructor(valueOrStyle) {
|
|
51
|
+
super();
|
|
52
|
+
if (typeof valueOrStyle === 'number') {
|
|
53
|
+
this._value = valueOrStyle;
|
|
54
|
+
}
|
|
55
|
+
else if (valueOrStyle) {
|
|
56
|
+
this._options.style = valueOrStyle;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Set progress value (0-100)
|
|
61
|
+
*/
|
|
62
|
+
value(val, max) {
|
|
63
|
+
this._value = val;
|
|
64
|
+
if (max !== undefined)
|
|
65
|
+
this._max = max;
|
|
66
|
+
return this;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Set label
|
|
70
|
+
*/
|
|
71
|
+
label(text) {
|
|
72
|
+
this._options.title = text;
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Add a progress bar (for multi-bar display)
|
|
77
|
+
*/
|
|
78
|
+
bar(label, value, options) {
|
|
79
|
+
this._bars.push({
|
|
80
|
+
label,
|
|
81
|
+
value,
|
|
82
|
+
max: options?.max ?? 100,
|
|
83
|
+
color: options?.color,
|
|
84
|
+
showValue: options?.showValue ?? true,
|
|
85
|
+
});
|
|
86
|
+
return this;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Add a step (for step indicator)
|
|
90
|
+
*/
|
|
91
|
+
step(label, status = 'pending', options) {
|
|
92
|
+
this._options.style = 'steps';
|
|
93
|
+
this._steps.push({
|
|
94
|
+
label,
|
|
95
|
+
status,
|
|
96
|
+
...options,
|
|
97
|
+
});
|
|
98
|
+
return this;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Set color
|
|
102
|
+
*/
|
|
103
|
+
color(color) {
|
|
104
|
+
this._options.color = color;
|
|
105
|
+
return this;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Set size
|
|
109
|
+
*/
|
|
110
|
+
size(size) {
|
|
111
|
+
this._options.size = size;
|
|
112
|
+
return this;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Use striped style
|
|
116
|
+
*/
|
|
117
|
+
striped(enabled = true) {
|
|
118
|
+
this._options.striped = enabled;
|
|
119
|
+
return this;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Enable animation
|
|
123
|
+
*/
|
|
124
|
+
animated(enabled = true) {
|
|
125
|
+
this._options.animated = enabled;
|
|
126
|
+
return this;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Show/hide value text
|
|
130
|
+
*/
|
|
131
|
+
showValue(enabled = true) {
|
|
132
|
+
this._options.showValue = enabled;
|
|
133
|
+
return this;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Use circle style
|
|
137
|
+
*/
|
|
138
|
+
circle() {
|
|
139
|
+
this._options.style = 'circle';
|
|
140
|
+
return this;
|
|
141
|
+
}
|
|
142
|
+
toJSON() {
|
|
143
|
+
return {
|
|
144
|
+
_photonType: this._photonType,
|
|
145
|
+
value: this._value,
|
|
146
|
+
max: this._max,
|
|
147
|
+
bars: this._bars,
|
|
148
|
+
steps: this._steps,
|
|
149
|
+
options: this._options,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Render as plain text for MCP clients
|
|
154
|
+
*/
|
|
155
|
+
toString() {
|
|
156
|
+
const lines = [];
|
|
157
|
+
if (this._options.title) {
|
|
158
|
+
lines.push(this._options.title);
|
|
159
|
+
}
|
|
160
|
+
// Steps display
|
|
161
|
+
if (this._steps.length > 0) {
|
|
162
|
+
const stepMarkers = this._steps.map(s => {
|
|
163
|
+
switch (s.status) {
|
|
164
|
+
case 'completed': return `[✓] ${s.label}`;
|
|
165
|
+
case 'current': return `[●] ${s.label}`;
|
|
166
|
+
case 'error': return `[✗] ${s.label}`;
|
|
167
|
+
default: return `[ ] ${s.label}`;
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
lines.push(stepMarkers.join(' → '));
|
|
171
|
+
return lines.join('\n');
|
|
172
|
+
}
|
|
173
|
+
// Multiple bars
|
|
174
|
+
if (this._bars.length > 0) {
|
|
175
|
+
for (const bar of this._bars) {
|
|
176
|
+
const pct = Math.round((bar.value / (bar.max ?? 100)) * 100);
|
|
177
|
+
const filled = Math.round(pct / 5);
|
|
178
|
+
const barStr = '█'.repeat(filled) + '░'.repeat(20 - filled);
|
|
179
|
+
lines.push(`${bar.label}: [${barStr}] ${pct}%`);
|
|
180
|
+
}
|
|
181
|
+
return lines.join('\n');
|
|
182
|
+
}
|
|
183
|
+
// Single progress bar
|
|
184
|
+
const pct = Math.round((this._value / this._max) * 100);
|
|
185
|
+
const filled = Math.round(pct / 5);
|
|
186
|
+
const barStr = '█'.repeat(filled) + '░'.repeat(20 - filled);
|
|
187
|
+
lines.push(`[${barStr}] ${pct}%`);
|
|
188
|
+
return lines.join('\n');
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=Progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Progress.js","sourceRoot":"","sources":["../../src/ui-types/Progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stats - Purpose-driven type for key metrics/KPIs
|
|
3
|
+
*
|
|
4
|
+
* Automatically renders as a dashboard-style stats display.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* async overview() {
|
|
9
|
+
* return new Stats()
|
|
10
|
+
* .stat('Users', 1234, { trend: '+12%', trendUp: true })
|
|
11
|
+
* .stat('Revenue', 50000, { format: 'currency', prefix: '$' })
|
|
12
|
+
* .stat('Orders', 89, { suffix: 'today' })
|
|
13
|
+
* .stat('Conversion', 3.2, { format: 'percent' });
|
|
14
|
+
* }
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
import { PhotonUIType } from './base.js';
|
|
18
|
+
export type StatFormat = 'number' | 'currency' | 'percent' | 'compact';
|
|
19
|
+
export interface StatItem {
|
|
20
|
+
label: string;
|
|
21
|
+
value: number | string;
|
|
22
|
+
format?: StatFormat;
|
|
23
|
+
prefix?: string;
|
|
24
|
+
suffix?: string;
|
|
25
|
+
trend?: string;
|
|
26
|
+
trendUp?: boolean;
|
|
27
|
+
icon?: string;
|
|
28
|
+
color?: string;
|
|
29
|
+
description?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface StatsOptions {
|
|
32
|
+
title?: string;
|
|
33
|
+
columns?: 2 | 3 | 4 | 6;
|
|
34
|
+
compact?: boolean;
|
|
35
|
+
bordered?: boolean;
|
|
36
|
+
animated?: boolean;
|
|
37
|
+
}
|
|
38
|
+
export declare class Stats extends PhotonUIType {
|
|
39
|
+
readonly _photonType: "stats";
|
|
40
|
+
private _stats;
|
|
41
|
+
private _options;
|
|
42
|
+
/**
|
|
43
|
+
* Create a new Stats display
|
|
44
|
+
*/
|
|
45
|
+
constructor();
|
|
46
|
+
/**
|
|
47
|
+
* Add a stat
|
|
48
|
+
*/
|
|
49
|
+
stat(label: string, value: number | string, options?: Partial<Omit<StatItem, 'label' | 'value'>>): this;
|
|
50
|
+
/**
|
|
51
|
+
* Add a currency stat
|
|
52
|
+
*/
|
|
53
|
+
currency(label: string, value: number, options?: {
|
|
54
|
+
prefix?: string;
|
|
55
|
+
trend?: string;
|
|
56
|
+
trendUp?: boolean;
|
|
57
|
+
}): this;
|
|
58
|
+
/**
|
|
59
|
+
* Add a percentage stat
|
|
60
|
+
*/
|
|
61
|
+
percent(label: string, value: number, options?: {
|
|
62
|
+
trend?: string;
|
|
63
|
+
trendUp?: boolean;
|
|
64
|
+
}): this;
|
|
65
|
+
/**
|
|
66
|
+
* Add a count stat with compact formatting (1.2K, 5M, etc.)
|
|
67
|
+
*/
|
|
68
|
+
count(label: string, value: number, options?: {
|
|
69
|
+
trend?: string;
|
|
70
|
+
trendUp?: boolean;
|
|
71
|
+
suffix?: string;
|
|
72
|
+
}): this;
|
|
73
|
+
/**
|
|
74
|
+
* Set section title
|
|
75
|
+
*/
|
|
76
|
+
title(title: string): this;
|
|
77
|
+
/**
|
|
78
|
+
* Set number of columns
|
|
79
|
+
*/
|
|
80
|
+
columns(count: 2 | 3 | 4 | 6): this;
|
|
81
|
+
/**
|
|
82
|
+
* Use compact layout
|
|
83
|
+
*/
|
|
84
|
+
compact(enabled?: boolean): this;
|
|
85
|
+
/**
|
|
86
|
+
* Show borders
|
|
87
|
+
*/
|
|
88
|
+
bordered(enabled?: boolean): this;
|
|
89
|
+
/**
|
|
90
|
+
* Enable count-up animation
|
|
91
|
+
*/
|
|
92
|
+
animated(enabled?: boolean): this;
|
|
93
|
+
/**
|
|
94
|
+
* Get stat count
|
|
95
|
+
*/
|
|
96
|
+
get length(): number;
|
|
97
|
+
toJSON(): {
|
|
98
|
+
_photonType: "stats";
|
|
99
|
+
stats: StatItem[];
|
|
100
|
+
options: StatsOptions;
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* Render as plain text for MCP clients
|
|
104
|
+
*/
|
|
105
|
+
toString(): string;
|
|
106
|
+
private _formatCompact;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=Stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stats.d.ts","sourceRoot":"","sources":["../../src/ui-types/Stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAEvE,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,KAAM,SAAQ,YAAY;IACrC,QAAQ,CAAC,WAAW,EAAG,OAAO,CAAU;IAExC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,QAAQ,CAId;IAEF;;OAEG;;IAKH;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI;IASvG;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAS9G;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAQ5F;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAO3G;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI;IAKnC;;OAEG;IACH,OAAO,CAAC,OAAO,GAAE,OAAc,GAAG,IAAI;IAKtC;;OAEG;IACH,QAAQ,CAAC,OAAO,GAAE,OAAc,GAAG,IAAI;IAKvC;;OAEG;IACH,QAAQ,CAAC,OAAO,GAAE,OAAc,GAAG,IAAI;IAKvC;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,MAAM;;;;;IAQN;;OAEG;IACH,QAAQ,IAAI,MAAM;IAoClB,OAAO,CAAC,cAAc;CAKvB"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stats - Purpose-driven type for key metrics/KPIs
|
|
3
|
+
*
|
|
4
|
+
* Automatically renders as a dashboard-style stats display.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* async overview() {
|
|
9
|
+
* return new Stats()
|
|
10
|
+
* .stat('Users', 1234, { trend: '+12%', trendUp: true })
|
|
11
|
+
* .stat('Revenue', 50000, { format: 'currency', prefix: '$' })
|
|
12
|
+
* .stat('Orders', 89, { suffix: 'today' })
|
|
13
|
+
* .stat('Conversion', 3.2, { format: 'percent' });
|
|
14
|
+
* }
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
import { PhotonUIType } from './base.js';
|
|
18
|
+
export class Stats extends PhotonUIType {
|
|
19
|
+
_photonType = 'stats';
|
|
20
|
+
_stats = [];
|
|
21
|
+
_options = {
|
|
22
|
+
columns: 4,
|
|
23
|
+
bordered: true,
|
|
24
|
+
animated: true,
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Create a new Stats display
|
|
28
|
+
*/
|
|
29
|
+
constructor() {
|
|
30
|
+
super();
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Add a stat
|
|
34
|
+
*/
|
|
35
|
+
stat(label, value, options) {
|
|
36
|
+
this._stats.push({
|
|
37
|
+
label,
|
|
38
|
+
value,
|
|
39
|
+
...options,
|
|
40
|
+
});
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Add a currency stat
|
|
45
|
+
*/
|
|
46
|
+
currency(label, value, options) {
|
|
47
|
+
return this.stat(label, value, {
|
|
48
|
+
format: 'currency',
|
|
49
|
+
prefix: options?.prefix ?? '$',
|
|
50
|
+
trend: options?.trend,
|
|
51
|
+
trendUp: options?.trendUp,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Add a percentage stat
|
|
56
|
+
*/
|
|
57
|
+
percent(label, value, options) {
|
|
58
|
+
return this.stat(label, value, {
|
|
59
|
+
format: 'percent',
|
|
60
|
+
suffix: '%',
|
|
61
|
+
...options,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Add a count stat with compact formatting (1.2K, 5M, etc.)
|
|
66
|
+
*/
|
|
67
|
+
count(label, value, options) {
|
|
68
|
+
return this.stat(label, value, {
|
|
69
|
+
format: 'compact',
|
|
70
|
+
...options,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Set section title
|
|
75
|
+
*/
|
|
76
|
+
title(title) {
|
|
77
|
+
this._options.title = title;
|
|
78
|
+
return this;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Set number of columns
|
|
82
|
+
*/
|
|
83
|
+
columns(count) {
|
|
84
|
+
this._options.columns = count;
|
|
85
|
+
return this;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Use compact layout
|
|
89
|
+
*/
|
|
90
|
+
compact(enabled = true) {
|
|
91
|
+
this._options.compact = enabled;
|
|
92
|
+
return this;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Show borders
|
|
96
|
+
*/
|
|
97
|
+
bordered(enabled = true) {
|
|
98
|
+
this._options.bordered = enabled;
|
|
99
|
+
return this;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Enable count-up animation
|
|
103
|
+
*/
|
|
104
|
+
animated(enabled = true) {
|
|
105
|
+
this._options.animated = enabled;
|
|
106
|
+
return this;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get stat count
|
|
110
|
+
*/
|
|
111
|
+
get length() {
|
|
112
|
+
return this._stats.length;
|
|
113
|
+
}
|
|
114
|
+
toJSON() {
|
|
115
|
+
return {
|
|
116
|
+
_photonType: this._photonType,
|
|
117
|
+
stats: this._stats,
|
|
118
|
+
options: this._options,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Render as plain text for MCP clients
|
|
123
|
+
*/
|
|
124
|
+
toString() {
|
|
125
|
+
const lines = [];
|
|
126
|
+
if (this._options.title) {
|
|
127
|
+
lines.push(`## ${this._options.title}`, '');
|
|
128
|
+
}
|
|
129
|
+
for (const stat of this._stats) {
|
|
130
|
+
let value = String(stat.value);
|
|
131
|
+
// Format value
|
|
132
|
+
if (stat.format === 'currency' || stat.prefix) {
|
|
133
|
+
value = (stat.prefix ?? '$') + value;
|
|
134
|
+
}
|
|
135
|
+
if (stat.format === 'percent' || stat.suffix === '%') {
|
|
136
|
+
value = value + '%';
|
|
137
|
+
}
|
|
138
|
+
else if (stat.suffix) {
|
|
139
|
+
value = value + ' ' + stat.suffix;
|
|
140
|
+
}
|
|
141
|
+
if (stat.format === 'compact' && typeof stat.value === 'number') {
|
|
142
|
+
value = this._formatCompact(stat.value);
|
|
143
|
+
}
|
|
144
|
+
// Add trend
|
|
145
|
+
let line = `**${stat.label}**: ${value}`;
|
|
146
|
+
if (stat.trend) {
|
|
147
|
+
const arrow = stat.trendUp ? '↑' : stat.trendUp === false ? '↓' : '';
|
|
148
|
+
line += ` (${arrow}${stat.trend})`;
|
|
149
|
+
}
|
|
150
|
+
lines.push(line);
|
|
151
|
+
}
|
|
152
|
+
return lines.join('\n');
|
|
153
|
+
}
|
|
154
|
+
_formatCompact(num) {
|
|
155
|
+
if (num >= 1_000_000)
|
|
156
|
+
return (num / 1_000_000).toFixed(1) + 'M';
|
|
157
|
+
if (num >= 1_000)
|
|
158
|
+
return (num / 1_000).toFixed(1) + 'K';
|
|
159
|
+
return String(num);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=Stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stats.js","sourceRoot":"","sources":["../../src/ui-types/Stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Table - Purpose-driven type for tabular data
|
|
3
|
+
*
|
|
4
|
+
* Automatically renders as a table UI with sorting, filtering, etc.
|
|
5
|
+
*
|
|
6
|
+
* @example Basic usage
|
|
7
|
+
* ```typescript
|
|
8
|
+
* async users() {
|
|
9
|
+
* return new Table()
|
|
10
|
+
* .column('name', 'Name', 'string')
|
|
11
|
+
* .column('email', 'Email', 'string')
|
|
12
|
+
* .rows(users);
|
|
13
|
+
* }
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @example With Field system (React Admin-style)
|
|
17
|
+
* ```typescript
|
|
18
|
+
* async products() {
|
|
19
|
+
* return new Table()
|
|
20
|
+
* .fields([
|
|
21
|
+
* Field.image('thumbnail', { width: 60, rounded: true }),
|
|
22
|
+
* Field.text('name', { link: '/products/{id}' }),
|
|
23
|
+
* Field.price('price', { originalSource: 'msrp', currency: 'USD' }),
|
|
24
|
+
* Field.rating('rating', { countSource: 'reviewCount' }),
|
|
25
|
+
* Field.badge('status', { colors: { active: 'green', draft: 'gray' } }),
|
|
26
|
+
* Field.actions([
|
|
27
|
+
* { label: 'Edit', method: 'edit', icon: 'pencil' },
|
|
28
|
+
* { label: 'Delete', method: 'delete', confirm: true },
|
|
29
|
+
* ]),
|
|
30
|
+
* ])
|
|
31
|
+
* .rows(products);
|
|
32
|
+
* }
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
import { PhotonUIType } from './base.js';
|
|
36
|
+
import { FieldDefinition, Field } from './Field.js';
|
|
37
|
+
export type ColumnType = 'string' | 'number' | 'boolean' | 'date' | 'currency' | 'link' | 'image' | 'badge';
|
|
38
|
+
export interface TableColumn {
|
|
39
|
+
key: string;
|
|
40
|
+
label: string;
|
|
41
|
+
type: ColumnType;
|
|
42
|
+
sortable?: boolean;
|
|
43
|
+
width?: string;
|
|
44
|
+
align?: 'left' | 'center' | 'right';
|
|
45
|
+
format?: string;
|
|
46
|
+
}
|
|
47
|
+
export interface TableOptions {
|
|
48
|
+
title?: string;
|
|
49
|
+
searchable?: boolean;
|
|
50
|
+
sortable?: boolean;
|
|
51
|
+
paginated?: boolean;
|
|
52
|
+
pageSize?: number;
|
|
53
|
+
selectable?: boolean;
|
|
54
|
+
striped?: boolean;
|
|
55
|
+
compact?: boolean;
|
|
56
|
+
}
|
|
57
|
+
export declare class Table extends PhotonUIType {
|
|
58
|
+
readonly _photonType: "table";
|
|
59
|
+
private _columns;
|
|
60
|
+
private _fields;
|
|
61
|
+
private _rows;
|
|
62
|
+
private _options;
|
|
63
|
+
/**
|
|
64
|
+
* Create a new Table
|
|
65
|
+
* @param data Optional initial data (array of objects)
|
|
66
|
+
*/
|
|
67
|
+
constructor(data?: Record<string, any>[]);
|
|
68
|
+
/**
|
|
69
|
+
* Add a column definition
|
|
70
|
+
*/
|
|
71
|
+
column(key: string, label: string, type?: ColumnType, options?: Partial<TableColumn>): this;
|
|
72
|
+
/**
|
|
73
|
+
* Add multiple columns at once
|
|
74
|
+
*/
|
|
75
|
+
columns(cols: Array<[key: string, label: string, type?: ColumnType] | TableColumn>): this;
|
|
76
|
+
/**
|
|
77
|
+
* Add fields using the Field system
|
|
78
|
+
*/
|
|
79
|
+
fields(fieldDefs: FieldDefinition[]): this;
|
|
80
|
+
/**
|
|
81
|
+
* Add a single field
|
|
82
|
+
*/
|
|
83
|
+
field(fieldDef: FieldDefinition): this;
|
|
84
|
+
/** Add text field */
|
|
85
|
+
text(source: string, options?: Parameters<typeof Field.text>[1]): this;
|
|
86
|
+
/** Add email field */
|
|
87
|
+
email(source: string, options?: Parameters<typeof Field.email>[1]): this;
|
|
88
|
+
/** Add URL field */
|
|
89
|
+
url(source: string, options?: Parameters<typeof Field.url>[1]): this;
|
|
90
|
+
/** Add phone field */
|
|
91
|
+
phone(source: string, options?: Parameters<typeof Field.phone>[1]): this;
|
|
92
|
+
/** Add number field */
|
|
93
|
+
number(source: string, options?: Parameters<typeof Field.number>[1]): this;
|
|
94
|
+
/** Add currency field */
|
|
95
|
+
currency(source: string, options?: Parameters<typeof Field.currency>[1]): this;
|
|
96
|
+
/** Add percent field */
|
|
97
|
+
percent(source: string, options?: Parameters<typeof Field.percent>[1]): this;
|
|
98
|
+
/** Add date field */
|
|
99
|
+
date(source: string, options?: Parameters<typeof Field.date>[1]): this;
|
|
100
|
+
/** Add datetime field */
|
|
101
|
+
datetime(source: string, options?: Parameters<typeof Field.datetime>[1]): this;
|
|
102
|
+
/** Add boolean field */
|
|
103
|
+
boolean(source: string, options?: Parameters<typeof Field.boolean>[1]): this;
|
|
104
|
+
/** Add image field */
|
|
105
|
+
image(source: string, options?: Parameters<typeof Field.image>[1]): this;
|
|
106
|
+
/** Add avatar field */
|
|
107
|
+
avatar(source: string, options?: Parameters<typeof Field.avatar>[1]): this;
|
|
108
|
+
/** Add badge field */
|
|
109
|
+
badge(source: string, options?: Parameters<typeof Field.badge>[1]): this;
|
|
110
|
+
/** Add tags field */
|
|
111
|
+
tags(source: string, options?: Parameters<typeof Field.tags>[1]): this;
|
|
112
|
+
/** Add rating field */
|
|
113
|
+
rating(source: string, options?: Parameters<typeof Field.rating>[1]): this;
|
|
114
|
+
/** Add price field */
|
|
115
|
+
price(source: string, options?: Parameters<typeof Field.price>[1]): this;
|
|
116
|
+
/** Add stock field */
|
|
117
|
+
stock(source: string, options?: Parameters<typeof Field.stock>[1]): this;
|
|
118
|
+
/** Add user field */
|
|
119
|
+
user(source: string, options?: Parameters<typeof Field.user>[1]): this;
|
|
120
|
+
/** Add reference field */
|
|
121
|
+
reference(source: string, options?: Parameters<typeof Field.reference>[1]): this;
|
|
122
|
+
/** Add actions field */
|
|
123
|
+
actions(items: Parameters<typeof Field.actions>[0], options?: Parameters<typeof Field.actions>[1]): this;
|
|
124
|
+
/** Add custom field */
|
|
125
|
+
custom(source: string, render: Parameters<typeof Field.custom>[1], options?: Parameters<typeof Field.custom>[2]): this;
|
|
126
|
+
/**
|
|
127
|
+
* Set the table rows
|
|
128
|
+
*/
|
|
129
|
+
rows(data: Record<string, any>[]): this;
|
|
130
|
+
/**
|
|
131
|
+
* Add a single row
|
|
132
|
+
*/
|
|
133
|
+
row(data: Record<string, any>): this;
|
|
134
|
+
/**
|
|
135
|
+
* Set table title
|
|
136
|
+
*/
|
|
137
|
+
title(title: string): this;
|
|
138
|
+
/**
|
|
139
|
+
* Enable/disable search
|
|
140
|
+
*/
|
|
141
|
+
searchable(enabled?: boolean): this;
|
|
142
|
+
/**
|
|
143
|
+
* Enable/disable sorting
|
|
144
|
+
*/
|
|
145
|
+
sortable(enabled?: boolean): this;
|
|
146
|
+
/**
|
|
147
|
+
* Enable pagination
|
|
148
|
+
*/
|
|
149
|
+
paginated(pageSize?: number): this;
|
|
150
|
+
/**
|
|
151
|
+
* Enable row selection
|
|
152
|
+
*/
|
|
153
|
+
selectable(enabled?: boolean): this;
|
|
154
|
+
/**
|
|
155
|
+
* Use striped rows
|
|
156
|
+
*/
|
|
157
|
+
striped(enabled?: boolean): this;
|
|
158
|
+
/**
|
|
159
|
+
* Use compact layout
|
|
160
|
+
*/
|
|
161
|
+
compact(enabled?: boolean): this;
|
|
162
|
+
/**
|
|
163
|
+
* Infer columns from a data row
|
|
164
|
+
*/
|
|
165
|
+
private _inferColumns;
|
|
166
|
+
/**
|
|
167
|
+
* Infer column type from value
|
|
168
|
+
*/
|
|
169
|
+
private _inferType;
|
|
170
|
+
/**
|
|
171
|
+
* Format key to human-readable label
|
|
172
|
+
*/
|
|
173
|
+
private _formatLabel;
|
|
174
|
+
/**
|
|
175
|
+
* Get row count
|
|
176
|
+
*/
|
|
177
|
+
get length(): number;
|
|
178
|
+
/**
|
|
179
|
+
* Check if table is empty
|
|
180
|
+
*/
|
|
181
|
+
get isEmpty(): boolean;
|
|
182
|
+
/**
|
|
183
|
+
* Check if using Field system or legacy columns
|
|
184
|
+
*/
|
|
185
|
+
private get _useFields();
|
|
186
|
+
/**
|
|
187
|
+
* Get effective headers for display
|
|
188
|
+
*/
|
|
189
|
+
private _getHeaders;
|
|
190
|
+
/**
|
|
191
|
+
* Get cell values for a row
|
|
192
|
+
*/
|
|
193
|
+
private _getCells;
|
|
194
|
+
toJSON(): {
|
|
195
|
+
_photonType: "table";
|
|
196
|
+
columns: TableColumn[];
|
|
197
|
+
fields: FieldDefinition[];
|
|
198
|
+
rows: Record<string, any>[];
|
|
199
|
+
options: TableOptions;
|
|
200
|
+
};
|
|
201
|
+
/**
|
|
202
|
+
* Render as plain text/markdown for MCP clients
|
|
203
|
+
*/
|
|
204
|
+
toString(): string;
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=Table.d.ts.map
|