@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.
Files changed (130) hide show
  1. package/dist/asset-discovery.d.ts +25 -0
  2. package/dist/asset-discovery.d.ts.map +1 -0
  3. package/dist/asset-discovery.js +145 -0
  4. package/dist/asset-discovery.js.map +1 -0
  5. package/dist/base.d.ts +6 -0
  6. package/dist/base.d.ts.map +1 -1
  7. package/dist/base.js +11 -1
  8. package/dist/base.js.map +1 -1
  9. package/dist/class-detection.d.ts +32 -0
  10. package/dist/class-detection.d.ts.map +1 -0
  11. package/dist/class-detection.js +86 -0
  12. package/dist/class-detection.js.map +1 -0
  13. package/dist/collections/ReactiveArray.d.ts +97 -0
  14. package/dist/collections/ReactiveArray.d.ts.map +1 -0
  15. package/dist/collections/ReactiveArray.js +158 -0
  16. package/dist/collections/ReactiveArray.js.map +1 -0
  17. package/dist/collections/ReactiveMap.d.ts +50 -0
  18. package/dist/collections/ReactiveMap.d.ts.map +1 -0
  19. package/dist/collections/ReactiveMap.js +71 -0
  20. package/dist/collections/ReactiveMap.js.map +1 -0
  21. package/dist/collections/ReactiveSet.d.ts +50 -0
  22. package/dist/collections/ReactiveSet.d.ts.map +1 -0
  23. package/dist/collections/ReactiveSet.js +71 -0
  24. package/dist/collections/ReactiveSet.js.map +1 -0
  25. package/dist/collections/index.d.ts +44 -0
  26. package/dist/collections/index.d.ts.map +1 -0
  27. package/dist/collections/index.js +44 -0
  28. package/dist/collections/index.js.map +1 -0
  29. package/dist/compiler.d.ts +22 -0
  30. package/dist/compiler.d.ts.map +1 -0
  31. package/dist/compiler.js +48 -0
  32. package/dist/compiler.js.map +1 -0
  33. package/dist/env-utils.d.ts +61 -0
  34. package/dist/env-utils.d.ts.map +1 -0
  35. package/dist/env-utils.js +171 -0
  36. package/dist/env-utils.js.map +1 -0
  37. package/dist/index.d.ts +9 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +37 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/mime-types.d.ts +13 -0
  42. package/dist/mime-types.d.ts.map +1 -0
  43. package/dist/mime-types.js +47 -0
  44. package/dist/mime-types.js.map +1 -0
  45. package/dist/rendering/index.d.ts +49 -0
  46. package/dist/rendering/index.d.ts.map +1 -1
  47. package/dist/rendering/index.js +153 -0
  48. package/dist/rendering/index.js.map +1 -1
  49. package/dist/schema-extractor.d.ts.map +1 -1
  50. package/dist/schema-extractor.js +3 -0
  51. package/dist/schema-extractor.js.map +1 -1
  52. package/dist/types.d.ts +4 -0
  53. package/dist/types.d.ts.map +1 -1
  54. package/dist/types.js.map +1 -1
  55. package/dist/ui-types/Cards.d.ts +139 -0
  56. package/dist/ui-types/Cards.d.ts.map +1 -0
  57. package/dist/ui-types/Cards.js +235 -0
  58. package/dist/ui-types/Cards.js.map +1 -0
  59. package/dist/ui-types/Chart.d.ts +136 -0
  60. package/dist/ui-types/Chart.d.ts.map +1 -0
  61. package/dist/ui-types/Chart.js +188 -0
  62. package/dist/ui-types/Chart.js.map +1 -0
  63. package/dist/ui-types/Field.d.ts +342 -0
  64. package/dist/ui-types/Field.d.ts.map +1 -0
  65. package/dist/ui-types/Field.js +200 -0
  66. package/dist/ui-types/Field.js.map +1 -0
  67. package/dist/ui-types/FieldRenderer.d.ts +32 -0
  68. package/dist/ui-types/FieldRenderer.d.ts.map +1 -0
  69. package/dist/ui-types/FieldRenderer.js +277 -0
  70. package/dist/ui-types/FieldRenderer.js.map +1 -0
  71. package/dist/ui-types/Form.d.ts +212 -0
  72. package/dist/ui-types/Form.d.ts.map +1 -0
  73. package/dist/ui-types/Form.js +278 -0
  74. package/dist/ui-types/Form.js.map +1 -0
  75. package/dist/ui-types/Progress.d.ts +130 -0
  76. package/dist/ui-types/Progress.d.ts.map +1 -0
  77. package/dist/ui-types/Progress.js +191 -0
  78. package/dist/ui-types/Progress.js.map +1 -0
  79. package/dist/ui-types/Stats.d.ts +108 -0
  80. package/dist/ui-types/Stats.d.ts.map +1 -0
  81. package/dist/ui-types/Stats.js +162 -0
  82. package/dist/ui-types/Stats.js.map +1 -0
  83. package/dist/ui-types/Table.d.ts +206 -0
  84. package/dist/ui-types/Table.d.ts.map +1 -0
  85. package/dist/ui-types/Table.js +367 -0
  86. package/dist/ui-types/Table.js.map +1 -0
  87. package/dist/ui-types/base.d.ts +17 -0
  88. package/dist/ui-types/base.d.ts.map +1 -0
  89. package/dist/ui-types/base.js +18 -0
  90. package/dist/ui-types/base.js.map +1 -0
  91. package/dist/ui-types/index.d.ts +42 -0
  92. package/dist/ui-types/index.d.ts.map +1 -0
  93. package/dist/ui-types/index.js +50 -0
  94. package/dist/ui-types/index.js.map +1 -0
  95. package/dist/validation.d.ts +51 -0
  96. package/dist/validation.d.ts.map +1 -0
  97. package/dist/validation.js +249 -0
  98. package/dist/validation.js.map +1 -0
  99. package/dist/version-check.d.ts +22 -0
  100. package/dist/version-check.d.ts.map +1 -0
  101. package/dist/version-check.js +91 -0
  102. package/dist/version-check.js.map +1 -0
  103. package/package.json +2 -2
  104. package/src/asset-discovery.ts +161 -0
  105. package/src/base.ts +13 -1
  106. package/src/class-detection.ts +94 -0
  107. package/src/collections/ReactiveArray.ts +179 -0
  108. package/src/collections/ReactiveMap.ts +81 -0
  109. package/src/collections/ReactiveSet.ts +81 -0
  110. package/src/collections/index.ts +44 -0
  111. package/src/compiler.ts +57 -0
  112. package/src/env-utils.ts +216 -0
  113. package/src/index.ts +155 -0
  114. package/src/mime-types.ts +49 -0
  115. package/src/rendering/index.ts +197 -0
  116. package/src/schema-extractor.ts +4 -0
  117. package/src/types.ts +4 -0
  118. package/src/ui-types/Cards.ts +286 -0
  119. package/src/ui-types/Chart.ts +239 -0
  120. package/src/ui-types/Field.ts +594 -0
  121. package/src/ui-types/FieldRenderer.ts +364 -0
  122. package/src/ui-types/Form.ts +363 -0
  123. package/src/ui-types/Progress.ts +237 -0
  124. package/src/ui-types/Stats.ts +204 -0
  125. package/src/ui-types/Table.ts +438 -0
  126. package/src/ui-types/base.ts +25 -0
  127. package/src/ui-types/index.ts +96 -0
  128. package/src/ui-types/ui-types.test.ts +444 -0
  129. package/src/validation.ts +363 -0
  130. package/src/version-check.ts +92 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../src/ui-types/Table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,367 @@
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 { formatFieldLabel, Field } from './Field.js';
37
+ import { renderFieldToText } from './FieldRenderer.js';
38
+ export class Table extends PhotonUIType {
39
+ _photonType = 'table';
40
+ _columns = [];
41
+ _fields = [];
42
+ _rows = [];
43
+ _options = {};
44
+ /**
45
+ * Create a new Table
46
+ * @param data Optional initial data (array of objects)
47
+ */
48
+ constructor(data) {
49
+ super();
50
+ if (data && data.length > 0) {
51
+ this._rows = data;
52
+ // Auto-infer columns from first row
53
+ this._inferColumns(data[0]);
54
+ }
55
+ }
56
+ /**
57
+ * Add a column definition
58
+ */
59
+ column(key, label, type = 'string', options) {
60
+ this._columns.push({
61
+ key,
62
+ label,
63
+ type,
64
+ sortable: this._options.sortable ?? true,
65
+ ...options,
66
+ });
67
+ return this;
68
+ }
69
+ /**
70
+ * Add multiple columns at once
71
+ */
72
+ columns(cols) {
73
+ for (const col of cols) {
74
+ if (Array.isArray(col)) {
75
+ this.column(col[0], col[1], col[2] ?? 'string');
76
+ }
77
+ else {
78
+ this._columns.push(col);
79
+ }
80
+ }
81
+ return this;
82
+ }
83
+ // ═══════════════════════════════════════════════════════════════════════════
84
+ // Field-based API (React Admin-style)
85
+ // ═══════════════════════════════════════════════════════════════════════════
86
+ /**
87
+ * Add fields using the Field system
88
+ */
89
+ fields(fieldDefs) {
90
+ this._fields = fieldDefs;
91
+ return this;
92
+ }
93
+ /**
94
+ * Add a single field
95
+ */
96
+ field(fieldDef) {
97
+ this._fields.push(fieldDef);
98
+ return this;
99
+ }
100
+ // Convenience methods for common field types
101
+ /** Add text field */
102
+ text(source, options) {
103
+ return this.field(Field.text(source, options));
104
+ }
105
+ /** Add email field */
106
+ email(source, options) {
107
+ return this.field(Field.email(source, options));
108
+ }
109
+ /** Add URL field */
110
+ url(source, options) {
111
+ return this.field(Field.url(source, options));
112
+ }
113
+ /** Add phone field */
114
+ phone(source, options) {
115
+ return this.field(Field.phone(source, options));
116
+ }
117
+ /** Add number field */
118
+ number(source, options) {
119
+ return this.field(Field.number(source, options));
120
+ }
121
+ /** Add currency field */
122
+ currency(source, options) {
123
+ return this.field(Field.currency(source, options));
124
+ }
125
+ /** Add percent field */
126
+ percent(source, options) {
127
+ return this.field(Field.percent(source, options));
128
+ }
129
+ /** Add date field */
130
+ date(source, options) {
131
+ return this.field(Field.date(source, options));
132
+ }
133
+ /** Add datetime field */
134
+ datetime(source, options) {
135
+ return this.field(Field.datetime(source, options));
136
+ }
137
+ /** Add boolean field */
138
+ boolean(source, options) {
139
+ return this.field(Field.boolean(source, options));
140
+ }
141
+ /** Add image field */
142
+ image(source, options) {
143
+ return this.field(Field.image(source, options));
144
+ }
145
+ /** Add avatar field */
146
+ avatar(source, options) {
147
+ return this.field(Field.avatar(source, options));
148
+ }
149
+ /** Add badge field */
150
+ badge(source, options) {
151
+ return this.field(Field.badge(source, options));
152
+ }
153
+ /** Add tags field */
154
+ tags(source, options) {
155
+ return this.field(Field.tags(source, options));
156
+ }
157
+ /** Add rating field */
158
+ rating(source, options) {
159
+ return this.field(Field.rating(source, options));
160
+ }
161
+ /** Add price field */
162
+ price(source, options) {
163
+ return this.field(Field.price(source, options));
164
+ }
165
+ /** Add stock field */
166
+ stock(source, options) {
167
+ return this.field(Field.stock(source, options));
168
+ }
169
+ /** Add user field */
170
+ user(source, options) {
171
+ return this.field(Field.user(source, options));
172
+ }
173
+ /** Add reference field */
174
+ reference(source, options) {
175
+ return this.field(Field.reference(source, options));
176
+ }
177
+ /** Add actions field */
178
+ actions(items, options) {
179
+ return this.field(Field.actions(items, options));
180
+ }
181
+ /** Add custom field */
182
+ custom(source, render, options) {
183
+ return this.field(Field.custom(source, render, options));
184
+ }
185
+ // ═══════════════════════════════════════════════════════════════════════════
186
+ // Data Methods
187
+ // ═══════════════════════════════════════════════════════════════════════════
188
+ /**
189
+ * Set the table rows
190
+ */
191
+ rows(data) {
192
+ this._rows = data;
193
+ // If no columns defined, infer from data
194
+ if (this._columns.length === 0 && data.length > 0) {
195
+ this._inferColumns(data[0]);
196
+ }
197
+ return this;
198
+ }
199
+ /**
200
+ * Add a single row
201
+ */
202
+ row(data) {
203
+ this._rows.push(data);
204
+ if (this._columns.length === 0) {
205
+ this._inferColumns(data);
206
+ }
207
+ return this;
208
+ }
209
+ /**
210
+ * Set table title
211
+ */
212
+ title(title) {
213
+ this._options.title = title;
214
+ return this;
215
+ }
216
+ /**
217
+ * Enable/disable search
218
+ */
219
+ searchable(enabled = true) {
220
+ this._options.searchable = enabled;
221
+ return this;
222
+ }
223
+ /**
224
+ * Enable/disable sorting
225
+ */
226
+ sortable(enabled = true) {
227
+ this._options.sortable = enabled;
228
+ return this;
229
+ }
230
+ /**
231
+ * Enable pagination
232
+ */
233
+ paginated(pageSize = 10) {
234
+ this._options.paginated = true;
235
+ this._options.pageSize = pageSize;
236
+ return this;
237
+ }
238
+ /**
239
+ * Enable row selection
240
+ */
241
+ selectable(enabled = true) {
242
+ this._options.selectable = enabled;
243
+ return this;
244
+ }
245
+ /**
246
+ * Use striped rows
247
+ */
248
+ striped(enabled = true) {
249
+ this._options.striped = enabled;
250
+ return this;
251
+ }
252
+ /**
253
+ * Use compact layout
254
+ */
255
+ compact(enabled = true) {
256
+ this._options.compact = enabled;
257
+ return this;
258
+ }
259
+ /**
260
+ * Infer columns from a data row
261
+ */
262
+ _inferColumns(row) {
263
+ for (const [key, value] of Object.entries(row)) {
264
+ const type = this._inferType(value);
265
+ const label = this._formatLabel(key);
266
+ this._columns.push({ key, label, type, sortable: true });
267
+ }
268
+ }
269
+ /**
270
+ * Infer column type from value
271
+ */
272
+ _inferType(value) {
273
+ if (typeof value === 'number')
274
+ return 'number';
275
+ if (typeof value === 'boolean')
276
+ return 'boolean';
277
+ if (value instanceof Date)
278
+ return 'date';
279
+ if (typeof value === 'string') {
280
+ if (value.match(/^\d{4}-\d{2}-\d{2}/))
281
+ return 'date';
282
+ if (value.match(/^https?:\/\//))
283
+ return 'link';
284
+ if (value.match(/\.(jpg|jpeg|png|gif|webp|svg)$/i))
285
+ return 'image';
286
+ }
287
+ return 'string';
288
+ }
289
+ /**
290
+ * Format key to human-readable label
291
+ */
292
+ _formatLabel(key) {
293
+ return key
294
+ .replace(/([A-Z])/g, ' $1') // camelCase to spaces
295
+ .replace(/[_-]/g, ' ') // snake_case/kebab-case to spaces
296
+ .replace(/^\w/, c => c.toUpperCase()) // Capitalize first letter
297
+ .trim();
298
+ }
299
+ /**
300
+ * Get row count
301
+ */
302
+ get length() {
303
+ return this._rows.length;
304
+ }
305
+ /**
306
+ * Check if table is empty
307
+ */
308
+ get isEmpty() {
309
+ return this._rows.length === 0;
310
+ }
311
+ /**
312
+ * Check if using Field system or legacy columns
313
+ */
314
+ get _useFields() {
315
+ return this._fields.length > 0;
316
+ }
317
+ /**
318
+ * Get effective headers for display
319
+ */
320
+ _getHeaders() {
321
+ if (this._useFields) {
322
+ return this._fields.map(f => f.options.label ?? formatFieldLabel(f.source));
323
+ }
324
+ return this._columns.map(c => c.label);
325
+ }
326
+ /**
327
+ * Get cell values for a row
328
+ */
329
+ _getCells(row) {
330
+ if (this._useFields) {
331
+ return this._fields.map(f => renderFieldToText(f, row));
332
+ }
333
+ return this._columns.map(c => String(row[c.key] ?? ''));
334
+ }
335
+ toJSON() {
336
+ return {
337
+ _photonType: this._photonType,
338
+ columns: this._columns,
339
+ fields: this._fields,
340
+ rows: this._rows,
341
+ options: this._options,
342
+ };
343
+ }
344
+ /**
345
+ * Render as plain text/markdown for MCP clients
346
+ */
347
+ toString() {
348
+ if (this._rows.length === 0) {
349
+ return this._options.title ? `${this._options.title}\n\n(No data)` : '(No data)';
350
+ }
351
+ const lines = [];
352
+ if (this._options.title) {
353
+ lines.push(`## ${this._options.title}`, '');
354
+ }
355
+ // Header row
356
+ const headers = this._getHeaders();
357
+ lines.push('| ' + headers.join(' | ') + ' |');
358
+ lines.push('| ' + headers.map(() => '---').join(' | ') + ' |');
359
+ // Data rows
360
+ for (const row of this._rows) {
361
+ const cells = this._getCells(row);
362
+ lines.push('| ' + cells.join(' | ') + ' |');
363
+ }
364
+ return lines.join('\n');
365
+ }
366
+ }
367
+ //# sourceMappingURL=Table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Table.js","sourceRoot":"","sources":["../../src/ui-types/Table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Base class for purpose-driven UI types
3
+ *
4
+ * All UI types extend this to get the _photonType discriminator
5
+ * that auto-UI uses to select the appropriate renderer.
6
+ */
7
+ export declare abstract class PhotonUIType {
8
+ /** Discriminator for auto-UI type detection */
9
+ abstract readonly _photonType: string;
10
+ /** Convert to JSON-serializable format */
11
+ abstract toJSON(): Record<string, any>;
12
+ }
13
+ /**
14
+ * Check if a value is a PhotonUIType
15
+ */
16
+ export declare function isPhotonUIType(value: unknown): value is PhotonUIType;
17
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/ui-types/base.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,8BAAsB,YAAY;IAChC,+CAA+C;IAC/C,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAEtC,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;CACvC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAOpE"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Base class for purpose-driven UI types
3
+ *
4
+ * All UI types extend this to get the _photonType discriminator
5
+ * that auto-UI uses to select the appropriate renderer.
6
+ */
7
+ export class PhotonUIType {
8
+ }
9
+ /**
10
+ * Check if a value is a PhotonUIType
11
+ */
12
+ export function isPhotonUIType(value) {
13
+ return (value !== null &&
14
+ typeof value === 'object' &&
15
+ '_photonType' in value &&
16
+ typeof value._photonType === 'string');
17
+ }
18
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/ui-types/base.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,OAAgB,YAAY;CAMjC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,CACL,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,aAAa,IAAI,KAAK;QACtB,OAAQ,KAAa,CAAC,WAAW,KAAK,QAAQ,CAC/C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Purpose-Driven UI Types
3
+ *
4
+ * These types enable polymorphic return values that automatically
5
+ * render with the appropriate UI component.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { Table, Chart, Cards, Stats } from '@portel/photon-core';
10
+ *
11
+ * export default class Dashboard {
12
+ * async users() {
13
+ * return new Table()
14
+ * .column('name', 'Name')
15
+ * .column('email', 'Email')
16
+ * .rows(await this.fetchUsers());
17
+ * }
18
+ *
19
+ * async metrics() {
20
+ * return new Chart('line')
21
+ * .labels(['Jan', 'Feb', 'Mar'])
22
+ * .series('Revenue', [100, 200, 300]);
23
+ * }
24
+ *
25
+ * async overview() {
26
+ * return new Stats()
27
+ * .stat('Users', 1234)
28
+ * .currency('Revenue', 50000);
29
+ * }
30
+ * }
31
+ * ```
32
+ */
33
+ export { PhotonUIType, isPhotonUIType } from './base.js';
34
+ export { Field, type FieldDefinition, type FieldType, type FieldAlignment, type BaseFieldOptions, type TextFieldOptions, type EmailFieldOptions, type UrlFieldOptions, type PhoneFieldOptions, type NumberFieldOptions, type CurrencyFieldOptions, type PercentFieldOptions, type DateFieldOptions, type DateFormat, type TimeFieldOptions, type DateRangeFieldOptions, type BooleanFieldOptions, type ImageFieldOptions, type AvatarFieldOptions, type GalleryFieldOptions, type FileFieldOptions, type BadgeFieldOptions, type TagsFieldOptions, type RatingFieldOptions, type PriceFieldOptions, type StockFieldOptions, type QuantityFieldOptions, type UserFieldOptions, type ReferenceFieldOptions, type ActionItem, type ActionsFieldOptions, type CustomFieldOptions, type RenderFunction, getFieldValue, formatFieldLabel, interpolateTemplate, } from './Field.js';
35
+ export { renderFieldToText, renderFieldToStructured, type RenderedField, } from './FieldRenderer.js';
36
+ export { Table, type TableColumn, type TableOptions, type ColumnType } from './Table.js';
37
+ export { Cards, type CardFieldMapping, type CardsOptions } from './Cards.js';
38
+ export { Chart, type ChartType, type ChartSeries, type ChartDataPoint, type ChartOptions } from './Chart.js';
39
+ export { Stats, type StatItem, type StatFormat, type StatsOptions } from './Stats.js';
40
+ export { Progress, type ProgressBar, type ProgressStep, type ProgressStyle, type StepStatus, type ProgressOptions } from './Progress.js';
41
+ export { Form, type FormField, type FieldType as FormFieldType, type FormOptions } from './Form.js';
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui-types/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAGH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGzD,OAAO,EACL,KAAK,EACL,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,gBAAgB,EAErB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EAEnB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,aAAa,GACnB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,KAAK,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,EAAE,KAAK,EAAE,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG7E,OAAO,EAAE,KAAK,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7G,OAAO,EAAE,KAAK,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAGzI,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,IAAI,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Purpose-Driven UI Types
3
+ *
4
+ * These types enable polymorphic return values that automatically
5
+ * render with the appropriate UI component.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { Table, Chart, Cards, Stats } from '@portel/photon-core';
10
+ *
11
+ * export default class Dashboard {
12
+ * async users() {
13
+ * return new Table()
14
+ * .column('name', 'Name')
15
+ * .column('email', 'Email')
16
+ * .rows(await this.fetchUsers());
17
+ * }
18
+ *
19
+ * async metrics() {
20
+ * return new Chart('line')
21
+ * .labels(['Jan', 'Feb', 'Mar'])
22
+ * .series('Revenue', [100, 200, 300]);
23
+ * }
24
+ *
25
+ * async overview() {
26
+ * return new Stats()
27
+ * .stat('Users', 1234)
28
+ * .currency('Revenue', 50000);
29
+ * }
30
+ * }
31
+ * ```
32
+ */
33
+ // Base
34
+ export { PhotonUIType, isPhotonUIType } from './base.js';
35
+ // Field System
36
+ export { Field,
37
+ // Utilities
38
+ getFieldValue, formatFieldLabel, interpolateTemplate, } from './Field.js';
39
+ // Field Rendering
40
+ export { renderFieldToText, renderFieldToStructured, } from './FieldRenderer.js';
41
+ // Data Display
42
+ export { Table } from './Table.js';
43
+ export { Cards } from './Cards.js';
44
+ // Visualization
45
+ export { Chart } from './Chart.js';
46
+ export { Stats } from './Stats.js';
47
+ export { Progress } from './Progress.js';
48
+ // Interactive
49
+ export { Form } from './Form.js';
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui-types/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO;AACP,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEzD,eAAe;AACf,OAAO,EACL,KAAK;AAkCL,YAAY;AACZ,aAAa,EACb,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,kBAAkB;AAClB,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GAExB,MAAM,oBAAoB,CAAC;AAE5B,eAAe;AACf,OAAO,EAAE,KAAK,EAAwD,MAAM,YAAY,CAAC;AACzF,OAAO,EAAE,KAAK,EAA4C,MAAM,YAAY,CAAC;AAE7E,gBAAgB;AAChB,OAAO,EAAE,KAAK,EAA4E,MAAM,YAAY,CAAC;AAC7G,OAAO,EAAE,KAAK,EAAqD,MAAM,YAAY,CAAC;AACtF,OAAO,EAAE,QAAQ,EAAkG,MAAM,eAAe,CAAC;AAEzI,cAAc;AACd,OAAO,EAAE,IAAI,EAAqE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Input Validation Utilities
3
+ *
4
+ * Type-safe validation with user-friendly error messages.
5
+ * Adapted from photon's shared/validation.ts.
6
+ *
7
+ * Also includes PhotonError and ValidationError base classes
8
+ * (originally from photon's shared/error-handler.ts).
9
+ */
10
+ export declare class PhotonError extends Error {
11
+ readonly code: string;
12
+ readonly details?: Record<string, unknown> | undefined;
13
+ readonly suggestion?: string | undefined;
14
+ constructor(message: string, code: string, details?: Record<string, unknown> | undefined, suggestion?: string | undefined);
15
+ }
16
+ export declare class ValidationError extends PhotonError {
17
+ constructor(message: string, details?: Record<string, unknown>, suggestion?: string);
18
+ }
19
+ export interface ValidationResult {
20
+ valid: boolean;
21
+ errors: string[];
22
+ }
23
+ export type Validator<T> = (value: T) => ValidationResult;
24
+ export declare function combineResults(...results: ValidationResult[]): ValidationResult;
25
+ export declare function isString(value: unknown): value is string;
26
+ export declare function isNumber(value: unknown): value is number;
27
+ export declare function isBoolean(value: unknown): value is boolean;
28
+ export declare function isObject(value: unknown): value is Record<string, unknown>;
29
+ export declare function isArray(value: unknown): value is unknown[];
30
+ export declare function notEmpty(fieldName: string): Validator<string>;
31
+ export declare function hasLength(fieldName: string, min?: number, max?: number): Validator<string>;
32
+ export declare function matchesPattern(fieldName: string, pattern: RegExp, message?: string): Validator<string>;
33
+ export declare function isEmail(fieldName: string): Validator<string>;
34
+ export declare function isUrl(fieldName: string): Validator<string>;
35
+ export declare function inRange(fieldName: string, min?: number, max?: number): Validator<number>;
36
+ export declare function isPositive(fieldName: string): Validator<number>;
37
+ export declare function isInteger(fieldName: string): Validator<number>;
38
+ export declare function hasArrayLength(fieldName: string, min?: number, max?: number): Validator<unknown[]>;
39
+ export declare function arrayOf<T>(fieldName: string, itemValidator: Validator<T>): Validator<T[]>;
40
+ export declare function hasFields(fieldName: string, requiredFields: string[]): Validator<Record<string, unknown>>;
41
+ export declare function oneOf<T>(fieldName: string, allowed: T[]): Validator<T>;
42
+ export declare function validate<T>(value: T, validators: Validator<T>[]): ValidationResult;
43
+ export declare function validateOrThrow<T>(value: T, validators: Validator<T>[], context?: string): void;
44
+ export declare function pathExists(fieldName: string): Validator<string>;
45
+ export declare function hasExtension(fieldName: string, extensions: string[]): Validator<string>;
46
+ export declare function assertDefined<T>(value: T | null | undefined, fieldName: string): asserts value is T;
47
+ export declare function assertString(value: unknown, fieldName: string): asserts value is string;
48
+ export declare function assertNumber(value: unknown, fieldName: string): asserts value is number;
49
+ export declare function assertObject(value: unknown, fieldName: string): asserts value is Record<string, unknown>;
50
+ export declare function assertArray(value: unknown, fieldName: string): asserts value is unknown[];
51
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}