@astryxdesign/cli 0.4.2 → 0.4.3-canary.00bed29

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 (69) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +45 -43
  3. package/api/discover/_adapter.d.mts +5 -3
  4. package/api/discover/_adapter.mjs +6 -4
  5. package/api/template/cdn/cdn.d.mts +23 -0
  6. package/api/template/cdn/cdn.mjs +86 -0
  7. package/api/template/cdn/cdn.test.mjs +108 -0
  8. package/api/template/template.d.mts +2 -0
  9. package/api/template/template.doc.mjs +21 -3
  10. package/api/template/template.mjs +16 -2
  11. package/api/template/template.type.d.mts +19 -0
  12. package/api/template/template.type.mjs +12 -0
  13. package/api/theme/build/build.font-warning.test.mjs +23 -14
  14. package/api/theme/build/build.icons-specifier.test.mjs +149 -0
  15. package/api/theme/build/build.mjs +88 -16
  16. package/api/theme/build/build.test.mjs +185 -14
  17. package/api/theme/theme.type.d.mts +22 -0
  18. package/api/theme/theme.type.mjs +15 -1
  19. package/assets/cdn.template.html +124 -0
  20. package/assets/docs/theme.doc.dense.mjs +1 -1
  21. package/assets/docs/theme.doc.mjs +11 -5
  22. package/assets/docs/theme.doc.zh.mjs +1 -1
  23. package/assets/templates/blocks/components/BottomSheet/BottomSheetHeights.doc.mjs +21 -0
  24. package/assets/templates/blocks/components/BottomSheet/BottomSheetHeights.tsx +46 -0
  25. package/assets/templates/blocks/components/BottomSheet/BottomSheetMobileKeyboard.doc.mjs +23 -0
  26. package/assets/templates/blocks/components/BottomSheet/BottomSheetMobileKeyboard.tsx +100 -0
  27. package/assets/templates/blocks/components/BottomSheet/BottomSheetNoScrim.doc.mjs +22 -0
  28. package/assets/templates/blocks/components/BottomSheet/BottomSheetNoScrim.tsx +47 -0
  29. package/assets/templates/blocks/components/BottomSheet/BottomSheetShowcase.doc.mjs +22 -0
  30. package/assets/templates/blocks/components/BottomSheet/BottomSheetShowcase.tsx +51 -0
  31. package/assets/templates/blocks/components/BottomSheet/BottomSheetSwitcherShowcase.doc.mjs +26 -0
  32. package/assets/templates/blocks/components/BottomSheet/BottomSheetSwitcherShowcase.tsx +221 -0
  33. package/assets/templates/blocks/components/ComplexSelector/ComplexSelectorDeadlinePicker.doc.mjs +20 -0
  34. package/assets/templates/blocks/components/ComplexSelector/ComplexSelectorDeadlinePicker.tsx +87 -0
  35. package/assets/templates/blocks/components/ComplexSelector/ComplexSelectorShowcase.doc.mjs +15 -0
  36. package/assets/templates/blocks/components/ComplexSelector/ComplexSelectorShowcase.tsx +199 -0
  37. package/assets/templates/blocks/components/ComplexSelector/ComplexSelectorTreeSearch.doc.mjs +14 -0
  38. package/assets/templates/blocks/components/ComplexSelector/ComplexSelectorTreeSearch.tsx +188 -0
  39. package/assets/templates/themes/neutral/neutralTheme.ts +6 -4
  40. package/assets/theme.template.ts +4 -3
  41. package/authoring/doctypes/base/type.ts +9 -0
  42. package/clients/cli/commands/build-theme.font-warning.test.mjs +9 -6
  43. package/clients/cli/commands/build-theme.icons-specifier.test.mjs +132 -7
  44. package/clients/cli/commands/build-theme.mjs +154 -65
  45. package/clients/cli/commands/build-theme.multi.test.mjs +148 -0
  46. package/clients/cli/commands/build-theme.watch.test.mjs +67 -0
  47. package/clients/cli/commands/discover.broken-integration.test.mjs +112 -0
  48. package/clients/cli/commands/discover.mjs +12 -0
  49. package/clients/cli/commands/search.mjs +9 -0
  50. package/clients/cli/commands/template-cdn.behavior.test.mjs +113 -0
  51. package/clients/cli/commands/template.doc.mjs +12 -2
  52. package/clients/cli/commands/template.mjs +24 -3
  53. package/clients/cli/commands/theme-build.doc.mjs +11 -5
  54. package/clients/cli/lib/json-shim.test.mjs +1 -1
  55. package/clients/cli/lib/manifest.mjs +3 -2
  56. package/clients/cli/lib/manifest.test.mjs +4 -2
  57. package/foundation/fs/path-safety.mjs +2 -2
  58. package/foundation/fs/path-safety.test.mjs +7 -0
  59. package/foundation/integrations/integration-warnings.test.mjs +17 -0
  60. package/foundation/integrations/validate-contributions.mjs +7 -0
  61. package/foundation/response/response-types.doc.mjs +11 -0
  62. package/foundation/text/copyright-header.mjs +11 -4
  63. package/package.json +12 -9
  64. package/assets/templates/pages/table-page-chart/page.tsx +0 -577
  65. package/assets/templates/pages/table-page-chart/template.doc.mjs +0 -13
  66. package/assets/templates/pages/table-page-heatmap-status/page.tsx +0 -467
  67. package/assets/templates/pages/table-page-heatmap-status/template.doc.mjs +0 -13
  68. package/assets/templates/pages/table-page-shoe-store-heatmap/page.tsx +0 -931
  69. package/assets/templates/pages/table-page-shoe-store-heatmap/template.doc.mjs +0 -13
@@ -1,931 +0,0 @@
1
- // Copyright (c) Meta Platforms, Inc. and affiliates.
2
-
3
- 'use client';
4
-
5
- import {
6
- VStack,
7
- HStack,
8
- StackItem,
9
- Layout,
10
- LayoutContent,
11
- LayoutHeader,
12
- } from '@astryxdesign/core/Layout';
13
- import {Text, Heading} from '@astryxdesign/core/Text';
14
- import {Button} from '@astryxdesign/core/Button';
15
- import {IconButton} from '@astryxdesign/core/IconButton';
16
- import {Icon} from '@astryxdesign/core/Icon';
17
- import {Badge} from '@astryxdesign/core/Badge';
18
- import {Link} from '@astryxdesign/core/Link';
19
- import {Thumbnail} from '@astryxdesign/core/Thumbnail';
20
- import {Table, proportional, pixel} from '@astryxdesign/core/Table';
21
- import type {TableColumn} from '@astryxdesign/core/Table';
22
- import {Chart, ChartGrid, ChartAxis, area, line} from '@astryxdesign/charts';
23
- import {
24
- FunnelIcon,
25
- ArrowDownTrayIcon,
26
- PlusIcon,
27
- } from '@heroicons/react/24/outline';
28
-
29
- // ============= DATA =============
30
-
31
- type ProductCategory =
32
- 'Running' | 'Lifestyle' | 'Basketball' | 'Training' | 'Skateboarding';
33
-
34
- function shoeSvg(bg: string, accent: string) {
35
- const svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><rect width="100" height="100" rx="12" fill="${bg}"/><g transform="translate(22.5, 22.5) scale(2.29)" fill="none" stroke="${accent}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="m15 10.42 4.8-5.07"/><path d="M19 18h3"/><path d="M9.5 22 21.414 9.415A2 2 0 0 0 21.2 6.4l-5.61-4.208A1 1 0 0 0 14 3v2a2 2 0 0 1-1.394 1.906L8.677 8.053A1 1 0 0 0 8 9c-.155 6.393-2.082 9-4 9a2 2 0 0 0 0 4h14"/></g></svg>`;
36
- return `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`;
37
- }
38
-
39
- interface OrderRow extends Record<string, unknown> {
40
- id: string;
41
- customer: string;
42
- email: string;
43
- product: string;
44
- category: ProductCategory;
45
- imageIndex: number;
46
- amount: number;
47
- status: 'completed' | 'processing' | 'shipped' | 'refunded';
48
- date: string;
49
- }
50
-
51
- const PRODUCTS = [
52
- {
53
- name: 'Air Max 90',
54
- category: 'Lifestyle' as ProductCategory,
55
- image: shoeSvg('#FDE68A', '#DC2626'),
56
- price: 130,
57
- },
58
- {
59
- name: 'UltraBoost 22',
60
- category: 'Running' as ProductCategory,
61
- image: shoeSvg('#DBEAFE', '#1E40AF'),
62
- price: 190,
63
- },
64
- {
65
- name: 'Old Skool',
66
- category: 'Skateboarding' as ProductCategory,
67
- image: shoeSvg('#FED7AA', '#EA580C'),
68
- price: 70,
69
- },
70
- {
71
- name: 'Jordan 1 Retro',
72
- category: 'Basketball' as ProductCategory,
73
- image: shoeSvg('#E5E7EB', '#111827'),
74
- price: 180,
75
- },
76
- {
77
- name: 'Metcon 8',
78
- category: 'Training' as ProductCategory,
79
- image: shoeSvg('#FEE2E2', '#991B1B'),
80
- price: 140,
81
- },
82
- {
83
- name: 'Dunk Low',
84
- category: 'Skateboarding' as ProductCategory,
85
- image: shoeSvg('#D1FAE5', '#065F46'),
86
- price: 110,
87
- },
88
- ];
89
-
90
- const orders: OrderRow[] = [
91
- // Sun (0) — spread across 9am–5pm, very hot
92
- {
93
- id: 'ORD-1001',
94
- customer: 'Sarah Chen',
95
- email: 'sarah.chen@acme.co',
96
- product: PRODUCTS[0].name,
97
- category: PRODUCTS[0].category,
98
- imageIndex: 0,
99
- amount: 130,
100
- status: 'completed',
101
- date: '2025-01-12',
102
- },
103
- {
104
- id: 'ORD-1002',
105
- customer: 'Marcus Rivera',
106
- email: 'mrivera@globex.com',
107
- product: PRODUCTS[1].name,
108
- category: PRODUCTS[1].category,
109
- imageIndex: 1,
110
- amount: 190,
111
- status: 'completed',
112
- date: '2025-01-12',
113
- },
114
- {
115
- id: 'ORD-1003',
116
- customer: 'Aisha Patel',
117
- email: 'aisha.p@initech.io',
118
- product: PRODUCTS[2].name,
119
- category: PRODUCTS[2].category,
120
- imageIndex: 2,
121
- amount: 70,
122
- status: 'shipped',
123
- date: '2025-01-12',
124
- },
125
- {
126
- id: 'ORD-1004',
127
- customer: "James O'Brien",
128
- email: 'jobrien@umbrella.net',
129
- product: PRODUCTS[3].name,
130
- category: PRODUCTS[3].category,
131
- imageIndex: 3,
132
- amount: 180,
133
- status: 'processing',
134
- date: '2025-01-12',
135
- },
136
- {
137
- id: 'ORD-1005',
138
- customer: 'Yuki Tanaka',
139
- email: 'yuki@soylent.jp',
140
- product: PRODUCTS[4].name,
141
- category: PRODUCTS[4].category,
142
- imageIndex: 4,
143
- amount: 140,
144
- status: 'completed',
145
- date: '2025-01-12',
146
- },
147
- {
148
- id: 'ORD-1006',
149
- customer: 'Elena Volkov',
150
- email: 'elena.v@wayne.com',
151
- product: PRODUCTS[5].name,
152
- category: PRODUCTS[5].category,
153
- imageIndex: 5,
154
- amount: 110,
155
- status: 'completed',
156
- date: '2025-01-12',
157
- },
158
- {
159
- id: 'ORD-1007',
160
- customer: 'David Kim',
161
- email: 'dkim@stark.io',
162
- product: PRODUCTS[0].name,
163
- category: PRODUCTS[0].category,
164
- imageIndex: 0,
165
- amount: 130,
166
- status: 'completed',
167
- date: '2025-01-12',
168
- },
169
- {
170
- id: 'ORD-1008',
171
- customer: 'Fatima Al-Rashid',
172
- email: 'fatima@oscorp.ae',
173
- product: PRODUCTS[1].name,
174
- category: PRODUCTS[1].category,
175
- imageIndex: 1,
176
- amount: 190,
177
- status: 'shipped',
178
- date: '2025-01-12',
179
- },
180
- {
181
- id: 'ORD-1009',
182
- customer: 'Lucas Andersson',
183
- email: 'lucas.a@cyberdyne.se',
184
- product: PRODUCTS[2].name,
185
- category: PRODUCTS[2].category,
186
- imageIndex: 2,
187
- amount: 70,
188
- status: 'completed',
189
- date: '2025-01-12',
190
- },
191
- {
192
- id: 'ORD-1010',
193
- customer: 'Priya Sharma',
194
- email: 'priya@aperture.in',
195
- product: PRODUCTS[3].name,
196
- category: PRODUCTS[3].category,
197
- imageIndex: 3,
198
- amount: 180,
199
- status: 'completed',
200
- date: '2025-01-12',
201
- },
202
- {
203
- id: 'ORD-1011',
204
- customer: 'Noah Williams',
205
- email: 'noah.w@massive.com',
206
- product: PRODUCTS[4].name,
207
- category: PRODUCTS[4].category,
208
- imageIndex: 4,
209
- amount: 140,
210
- status: 'completed',
211
- date: '2025-01-12',
212
- },
213
- {
214
- id: 'ORD-1012',
215
- customer: 'Sofia Garcia',
216
- email: 'sgarcia@tyrell.mx',
217
- product: PRODUCTS[5].name,
218
- category: PRODUCTS[5].category,
219
- imageIndex: 5,
220
- amount: 110,
221
- status: 'completed',
222
- date: '2025-01-12',
223
- },
224
- {
225
- id: 'ORD-1013',
226
- customer: 'Oliver Brown',
227
- email: 'oliver.b@weyland.uk',
228
- product: PRODUCTS[0].name,
229
- category: PRODUCTS[0].category,
230
- imageIndex: 0,
231
- amount: 130,
232
- status: 'shipped',
233
- date: '2025-01-12',
234
- },
235
- {
236
- id: 'ORD-1014',
237
- customer: 'Mei Lin',
238
- email: 'mei.lin@choam.cn',
239
- product: PRODUCTS[1].name,
240
- category: PRODUCTS[1].category,
241
- imageIndex: 1,
242
- amount: 190,
243
- status: 'completed',
244
- date: '2025-01-12',
245
- },
246
- // Mon (1) — light-medium, midday into afternoon
247
- {
248
- id: 'ORD-1015',
249
- customer: 'Hassan Ahmed',
250
- email: 'hahmed@abstergo.eg',
251
- product: PRODUCTS[2].name,
252
- category: PRODUCTS[2].category,
253
- imageIndex: 2,
254
- amount: 70,
255
- status: 'refunded',
256
- date: '2025-01-13',
257
- },
258
- {
259
- id: 'ORD-1016',
260
- customer: 'Isabella Rossi',
261
- email: 'irossi@genom.it',
262
- product: PRODUCTS[3].name,
263
- category: PRODUCTS[3].category,
264
- imageIndex: 3,
265
- amount: 180,
266
- status: 'completed',
267
- date: '2025-01-13',
268
- },
269
- {
270
- id: 'ORD-1058',
271
- customer: 'Thiago Lima',
272
- email: 'tlima@shinra.br',
273
- product: PRODUCTS[4].name,
274
- category: PRODUCTS[4].category,
275
- imageIndex: 4,
276
- amount: 140,
277
- status: 'completed',
278
- date: '2025-01-13',
279
- },
280
- {
281
- id: 'ORD-1059',
282
- customer: 'Nadia Popov',
283
- email: 'npopov@kaiba.ro',
284
- product: PRODUCTS[5].name,
285
- category: PRODUCTS[5].category,
286
- imageIndex: 5,
287
- amount: 110,
288
- status: 'shipped',
289
- date: '2025-01-13',
290
- },
291
- // Tue (2) — afternoon concentrated: 2pm–5pm hot
292
- {
293
- id: 'ORD-1017',
294
- customer: 'Liam Murphy',
295
- email: 'liam.m@mishima.ie',
296
- product: PRODUCTS[4].name,
297
- category: PRODUCTS[4].category,
298
- imageIndex: 4,
299
- amount: 140,
300
- status: 'processing',
301
- date: '2025-01-14',
302
- },
303
- {
304
- id: 'ORD-1018',
305
- customer: 'Chloe Dubois',
306
- email: 'cdubois@armacham.fr',
307
- product: PRODUCTS[5].name,
308
- category: PRODUCTS[5].category,
309
- imageIndex: 5,
310
- amount: 110,
311
- status: 'completed',
312
- date: '2025-01-14',
313
- },
314
- {
315
- id: 'ORD-1019',
316
- customer: 'Andre Santos',
317
- email: 'asantos@shinra.br',
318
- product: PRODUCTS[0].name,
319
- category: PRODUCTS[0].category,
320
- imageIndex: 0,
321
- amount: 130,
322
- status: 'shipped',
323
- date: '2025-01-14',
324
- },
325
- {
326
- id: 'ORD-1020',
327
- customer: 'Nina Johansson',
328
- email: 'nina.j@lexcorp.se',
329
- product: PRODUCTS[1].name,
330
- category: PRODUCTS[1].category,
331
- imageIndex: 1,
332
- amount: 190,
333
- status: 'completed',
334
- date: '2025-01-14',
335
- },
336
- {
337
- id: 'ORD-1021',
338
- customer: 'Raj Kapoor',
339
- email: 'raj.k@vaultec.in',
340
- product: PRODUCTS[2].name,
341
- category: PRODUCTS[2].category,
342
- imageIndex: 2,
343
- amount: 70,
344
- status: 'completed',
345
- date: '2025-01-14',
346
- },
347
- {
348
- id: 'ORD-1022',
349
- customer: 'Emma Thompson',
350
- email: 'ethompson@monarch.uk',
351
- product: PRODUCTS[3].name,
352
- category: PRODUCTS[3].category,
353
- imageIndex: 3,
354
- amount: 180,
355
- status: 'completed',
356
- date: '2025-01-14',
357
- },
358
- {
359
- id: 'ORD-1023',
360
- customer: 'Carlos Mendez',
361
- email: 'cmendez@sirius.ar',
362
- product: PRODUCTS[4].name,
363
- category: PRODUCTS[4].category,
364
- imageIndex: 4,
365
- amount: 140,
366
- status: 'shipped',
367
- date: '2025-01-14',
368
- },
369
- {
370
- id: 'ORD-1024',
371
- customer: 'Zoe Mitchell',
372
- email: 'zoe.m@hyperion.au',
373
- product: PRODUCTS[5].name,
374
- category: PRODUCTS[5].category,
375
- imageIndex: 5,
376
- amount: 110,
377
- status: 'processing',
378
- date: '2025-01-14',
379
- },
380
- {
381
- id: 'ORD-1025',
382
- customer: 'Henrik Larsson',
383
- email: 'hlarsson@volvo.se',
384
- product: PRODUCTS[0].name,
385
- category: PRODUCTS[0].category,
386
- imageIndex: 0,
387
- amount: 130,
388
- status: 'completed',
389
- date: '2025-01-14',
390
- },
391
- // Wed (3) — light-medium, midday into afternoon
392
- {
393
- id: 'ORD-1026',
394
- customer: 'Amara Okafor',
395
- email: 'aokafor@wakanda.ng',
396
- product: PRODUCTS[1].name,
397
- category: PRODUCTS[1].category,
398
- imageIndex: 1,
399
- amount: 190,
400
- status: 'completed',
401
- date: '2025-01-15',
402
- },
403
- {
404
- id: 'ORD-1027',
405
- customer: 'Leo Fischer',
406
- email: 'lfischer@kruger.de',
407
- product: PRODUCTS[2].name,
408
- category: PRODUCTS[2].category,
409
- imageIndex: 2,
410
- amount: 70,
411
- status: 'completed',
412
- date: '2025-01-15',
413
- },
414
- {
415
- id: 'ORD-1028',
416
- customer: 'Maya Petrov',
417
- email: 'mpetrov@kaiba.ru',
418
- product: PRODUCTS[3].name,
419
- category: PRODUCTS[3].category,
420
- imageIndex: 3,
421
- amount: 180,
422
- status: 'shipped',
423
- date: '2025-01-15',
424
- },
425
- {
426
- id: 'ORD-1060',
427
- customer: 'Kai Nakamura',
428
- email: 'knakamura@capsule.jp',
429
- product: PRODUCTS[0].name,
430
- category: PRODUCTS[0].category,
431
- imageIndex: 0,
432
- amount: 130,
433
- status: 'completed',
434
- date: '2025-01-15',
435
- },
436
- {
437
- id: 'ORD-1061',
438
- customer: 'Elisa Moretti',
439
- email: 'emoretti@genom.it',
440
- product: PRODUCTS[4].name,
441
- category: PRODUCTS[4].category,
442
- imageIndex: 4,
443
- amount: 140,
444
- status: 'completed',
445
- date: '2025-01-15',
446
- },
447
- // Thu (4) — afternoon concentrated: 1pm–5pm hot
448
- {
449
- id: 'ORD-1029',
450
- customer: 'Tomás Herrera',
451
- email: 'therrera@nexus.co',
452
- product: PRODUCTS[4].name,
453
- category: PRODUCTS[4].category,
454
- imageIndex: 4,
455
- amount: 140,
456
- status: 'completed',
457
- date: '2025-01-09',
458
- },
459
- {
460
- id: 'ORD-1030',
461
- customer: 'Grace Nakamura',
462
- email: 'gnakamura@capsule.jp',
463
- product: PRODUCTS[5].name,
464
- category: PRODUCTS[5].category,
465
- imageIndex: 5,
466
- amount: 110,
467
- status: 'completed',
468
- date: '2025-01-09',
469
- },
470
- {
471
- id: 'ORD-1031',
472
- customer: 'Kenji Watanabe',
473
- email: 'kwatanabe@tyrell.jp',
474
- product: PRODUCTS[0].name,
475
- category: PRODUCTS[0].category,
476
- imageIndex: 0,
477
- amount: 130,
478
- status: 'completed',
479
- date: '2025-01-09',
480
- },
481
- {
482
- id: 'ORD-1032',
483
- customer: 'Lucia Fernandez',
484
- email: 'lfernandez@nexus.es',
485
- product: PRODUCTS[1].name,
486
- category: PRODUCTS[1].category,
487
- imageIndex: 1,
488
- amount: 190,
489
- status: 'completed',
490
- date: '2025-01-09',
491
- },
492
- {
493
- id: 'ORD-1033',
494
- customer: 'Oscar Nilsson',
495
- email: 'onilsson@cyberdyne.se',
496
- product: PRODUCTS[2].name,
497
- category: PRODUCTS[2].category,
498
- imageIndex: 2,
499
- amount: 70,
500
- status: 'shipped',
501
- date: '2025-01-09',
502
- },
503
- {
504
- id: 'ORD-1034',
505
- customer: 'Dani Alves',
506
- email: 'dalves@globex.br',
507
- product: PRODUCTS[3].name,
508
- category: PRODUCTS[3].category,
509
- imageIndex: 3,
510
- amount: 180,
511
- status: 'completed',
512
- date: '2025-01-09',
513
- },
514
- {
515
- id: 'ORD-1035',
516
- customer: 'Rina Sato',
517
- email: 'rsato@soylent.jp',
518
- product: PRODUCTS[4].name,
519
- category: PRODUCTS[4].category,
520
- imageIndex: 4,
521
- amount: 140,
522
- status: 'completed',
523
- date: '2025-01-09',
524
- },
525
- {
526
- id: 'ORD-1036',
527
- customer: 'Ivan Petrov',
528
- email: 'ipetrov@kaiba.ru',
529
- product: PRODUCTS[5].name,
530
- category: PRODUCTS[5].category,
531
- imageIndex: 5,
532
- amount: 110,
533
- status: 'processing',
534
- date: '2025-01-09',
535
- },
536
- {
537
- id: 'ORD-1037',
538
- customer: 'Aiko Mori',
539
- email: 'amori@capsule.jp',
540
- product: PRODUCTS[0].name,
541
- category: PRODUCTS[0].category,
542
- imageIndex: 0,
543
- amount: 130,
544
- status: 'completed',
545
- date: '2025-01-09',
546
- },
547
- // Fri (5) — medium, early afternoon
548
- {
549
- id: 'ORD-1038',
550
- customer: 'Felix Braun',
551
- email: 'fbraun@kruger.de',
552
- product: PRODUCTS[1].name,
553
- category: PRODUCTS[1].category,
554
- imageIndex: 1,
555
- amount: 190,
556
- status: 'completed',
557
- date: '2025-01-10',
558
- },
559
- {
560
- id: 'ORD-1039',
561
- customer: 'Rosa Delgado',
562
- email: 'rdelgado@sirius.mx',
563
- product: PRODUCTS[2].name,
564
- category: PRODUCTS[2].category,
565
- imageIndex: 2,
566
- amount: 70,
567
- status: 'completed',
568
- date: '2025-01-10',
569
- },
570
- {
571
- id: 'ORD-1040',
572
- customer: 'Nils Eriksson',
573
- email: 'neriksson@volvo.se',
574
- product: PRODUCTS[3].name,
575
- category: PRODUCTS[3].category,
576
- imageIndex: 3,
577
- amount: 180,
578
- status: 'shipped',
579
- date: '2025-01-10',
580
- },
581
- {
582
- id: 'ORD-1041',
583
- customer: 'Suki Park',
584
- email: 'spark@stark.kr',
585
- product: PRODUCTS[4].name,
586
- category: PRODUCTS[4].category,
587
- imageIndex: 4,
588
- amount: 140,
589
- status: 'completed',
590
- date: '2025-01-10',
591
- },
592
- // Sat (6) — spread across 9am–6pm, very hot
593
- {
594
- id: 'ORD-1042',
595
- customer: 'Omar Haddad',
596
- email: 'ohaddad@oscorp.lb',
597
- product: PRODUCTS[5].name,
598
- category: PRODUCTS[5].category,
599
- imageIndex: 5,
600
- amount: 110,
601
- status: 'completed',
602
- date: '2025-01-11',
603
- },
604
- {
605
- id: 'ORD-1043',
606
- customer: 'Freya Jensen',
607
- email: 'fjensen@cyberdyne.dk',
608
- product: PRODUCTS[0].name,
609
- category: PRODUCTS[0].category,
610
- imageIndex: 0,
611
- amount: 130,
612
- status: 'shipped',
613
- date: '2025-01-11',
614
- },
615
- {
616
- id: 'ORD-1044',
617
- customer: 'Marco Bianchi',
618
- email: 'mbianchi@genom.it',
619
- product: PRODUCTS[1].name,
620
- category: PRODUCTS[1].category,
621
- imageIndex: 1,
622
- amount: 190,
623
- status: 'completed',
624
- date: '2025-01-11',
625
- },
626
- {
627
- id: 'ORD-1045',
628
- customer: 'Aya Tanaka',
629
- email: 'atanaka@capsule.jp',
630
- product: PRODUCTS[2].name,
631
- category: PRODUCTS[2].category,
632
- imageIndex: 2,
633
- amount: 70,
634
- status: 'completed',
635
- date: '2025-01-11',
636
- },
637
- {
638
- id: 'ORD-1046',
639
- customer: 'Lars Müller',
640
- email: 'lmuller@kruger.de',
641
- product: PRODUCTS[3].name,
642
- category: PRODUCTS[3].category,
643
- imageIndex: 3,
644
- amount: 180,
645
- status: 'completed',
646
- date: '2025-01-11',
647
- },
648
- {
649
- id: 'ORD-1047',
650
- customer: 'Mia Chang',
651
- email: 'mchang@aperture.tw',
652
- product: PRODUCTS[4].name,
653
- category: PRODUCTS[4].category,
654
- imageIndex: 4,
655
- amount: 140,
656
- status: 'processing',
657
- date: '2025-01-11',
658
- },
659
- {
660
- id: 'ORD-1048',
661
- customer: 'Petra Novak',
662
- email: 'pnovak@umbrella.cz',
663
- product: PRODUCTS[5].name,
664
- category: PRODUCTS[5].category,
665
- imageIndex: 5,
666
- amount: 110,
667
- status: 'completed',
668
- date: '2025-01-11',
669
- },
670
- {
671
- id: 'ORD-1049',
672
- customer: 'Tariq Osman',
673
- email: 'tosman@abstergo.eg',
674
- product: PRODUCTS[0].name,
675
- category: PRODUCTS[0].category,
676
- imageIndex: 0,
677
- amount: 130,
678
- status: 'completed',
679
- date: '2025-01-11',
680
- },
681
- {
682
- id: 'ORD-1050',
683
- customer: 'Lena Holm',
684
- email: 'lholm@lexcorp.se',
685
- product: PRODUCTS[1].name,
686
- category: PRODUCTS[1].category,
687
- imageIndex: 1,
688
- amount: 190,
689
- status: 'completed',
690
- date: '2025-01-11',
691
- },
692
- {
693
- id: 'ORD-1051',
694
- customer: 'Vera Costa',
695
- email: 'vcosta@shinra.pt',
696
- product: PRODUCTS[2].name,
697
- category: PRODUCTS[2].category,
698
- imageIndex: 2,
699
- amount: 70,
700
- status: 'shipped',
701
- date: '2025-01-11',
702
- },
703
- {
704
- id: 'ORD-1052',
705
- customer: 'Hugo Blanc',
706
- email: 'hblanc@armacham.fr',
707
- product: PRODUCTS[3].name,
708
- category: PRODUCTS[3].category,
709
- imageIndex: 3,
710
- amount: 180,
711
- status: 'completed',
712
- date: '2025-01-11',
713
- },
714
- {
715
- id: 'ORD-1053',
716
- customer: 'Ingrid Berg',
717
- email: 'iberg@volvo.no',
718
- product: PRODUCTS[4].name,
719
- category: PRODUCTS[4].category,
720
- imageIndex: 4,
721
- amount: 140,
722
- status: 'completed',
723
- date: '2025-01-11',
724
- },
725
- {
726
- id: 'ORD-1054',
727
- customer: 'Hana Kim',
728
- email: 'hkim@stark.kr',
729
- product: PRODUCTS[5].name,
730
- category: PRODUCTS[5].category,
731
- imageIndex: 5,
732
- amount: 110,
733
- status: 'completed',
734
- date: '2025-01-11',
735
- },
736
- {
737
- id: 'ORD-1055',
738
- customer: 'Axel Lindgren',
739
- email: 'alindgren@lexcorp.se',
740
- product: PRODUCTS[0].name,
741
- category: PRODUCTS[0].category,
742
- imageIndex: 0,
743
- amount: 130,
744
- status: 'shipped',
745
- date: '2025-01-11',
746
- },
747
- {
748
- id: 'ORD-1056',
749
- customer: 'Yara Mansour',
750
- email: 'ymansour@abstergo.lb',
751
- product: PRODUCTS[1].name,
752
- category: PRODUCTS[1].category,
753
- imageIndex: 1,
754
- amount: 190,
755
- status: 'completed',
756
- date: '2025-01-11',
757
- },
758
- {
759
- id: 'ORD-1057',
760
- customer: 'Dmitri Volkov',
761
- email: 'dvolkov@kaiba.ru',
762
- product: PRODUCTS[2].name,
763
- category: PRODUCTS[2].category,
764
- imageIndex: 2,
765
- amount: 70,
766
- status: 'completed',
767
- date: '2025-01-11',
768
- },
769
- ];
770
-
771
- const revenueData = [
772
- {date: 'Jan 1', revenue: 5200},
773
- {date: 'Jan 2', revenue: 4800},
774
- {date: 'Jan 3', revenue: 6100},
775
- {date: 'Jan 4', revenue: 7400},
776
- {date: 'Jan 5', revenue: 5900},
777
- {date: 'Jan 6', revenue: 6800},
778
- {date: 'Jan 7', revenue: 7200},
779
- {date: 'Jan 8', revenue: 8300},
780
- {date: 'Jan 9', revenue: 6500},
781
- {date: 'Jan 10', revenue: 5400},
782
- {date: 'Jan 11', revenue: 7800},
783
- {date: 'Jan 12', revenue: 9200},
784
- {date: 'Jan 13', revenue: 6900},
785
- {date: 'Jan 14', revenue: 8600},
786
- {date: 'Jan 15', revenue: 7100},
787
- ];
788
-
789
- const statusColor: Record<string, 'green' | 'blue' | 'orange' | 'red'> = {
790
- completed: 'green',
791
- shipped: 'blue',
792
- processing: 'orange',
793
- refunded: 'red',
794
- };
795
-
796
- const columns: TableColumn<OrderRow>[] = [
797
- {
798
- key: 'id',
799
- header: 'Order',
800
- width: pixel(110),
801
- renderCell: (item: OrderRow) => (
802
- <Link href="#" isStandalone>
803
- {item.id}
804
- </Link>
805
- ),
806
- },
807
- {
808
- key: 'product',
809
- header: 'Product',
810
- width: proportional(3),
811
- renderCell: (item: OrderRow) => (
812
- <HStack gap={3} vAlign="center">
813
- <Thumbnail
814
- src={PRODUCTS[item.imageIndex].image}
815
- alt={item.product}
816
- label={item.product}
817
- style={{width: 36, height: 36, flexShrink: 0}}
818
- />
819
- <VStack gap={0}>
820
- <Text type="body">{item.product}</Text>
821
- <Text type="supporting" color="secondary">
822
- {item.category}
823
- </Text>
824
- </VStack>
825
- </HStack>
826
- ),
827
- },
828
- {
829
- key: 'amount',
830
- header: 'Amount',
831
- width: pixel(90),
832
- renderCell: (item: OrderRow) => <Text type="body">${item.amount}</Text>,
833
- },
834
- {
835
- key: 'customer',
836
- header: 'Customer',
837
- width: proportional(2),
838
- renderCell: (item: OrderRow) => <Text type="body">{item.customer}</Text>,
839
- },
840
- {
841
- key: 'email',
842
- header: 'Email',
843
- width: proportional(2),
844
- renderCell: (item: OrderRow) => <Text type="body">{item.email}</Text>,
845
- },
846
- {
847
- key: 'status',
848
- header: 'Status',
849
- width: pixel(120),
850
- renderCell: (item: OrderRow) => (
851
- <Badge
852
- label={item.status.charAt(0).toUpperCase() + item.status.slice(1)}
853
- variant={statusColor[item.status]}
854
- />
855
- ),
856
- },
857
- {
858
- key: 'date',
859
- header: 'Date',
860
- width: pixel(110),
861
- renderCell: (item: OrderRow) => <Text type="body">{item.date}</Text>,
862
- },
863
- ];
864
-
865
- // ============= PAGE =============
866
-
867
- export default function TablePageShoeStoreHeatmapTemplate() {
868
- return (
869
- <Layout
870
- height="fill"
871
- header={
872
- <LayoutHeader hasDivider>
873
- <HStack gap={2} vAlign="center">
874
- <StackItem size="fill">
875
- <Heading level={1}>Sales</Heading>
876
- </StackItem>
877
- <IconButton
878
- label="Filter"
879
- icon={<Icon icon={FunnelIcon} size="sm" />}
880
- variant="ghost"
881
- />
882
- <IconButton
883
- label="Export"
884
- icon={<Icon icon={ArrowDownTrayIcon} size="sm" />}
885
- variant="ghost"
886
- />
887
- <Button
888
- label="New order"
889
- icon={<Icon icon={PlusIcon} size="sm" />}
890
- />
891
- </HStack>
892
- </LayoutHeader>
893
- }
894
- content={
895
- <LayoutContent padding={3}>
896
- <VStack gap={4}>
897
- <Chart
898
- data={revenueData}
899
- xKey="date"
900
- series={[
901
- area('revenue', {color: '#3b82f6', gradient: true}),
902
- line('revenue', {color: '#3b82f6'}),
903
- ]}
904
- grid={<ChartGrid horizontal />}
905
- axes={
906
- <>
907
- <ChartAxis position="bottom" />
908
- <ChartAxis
909
- position="left"
910
- tickFormat={(v: unknown) => `$${Number(v) / 1000}k`}
911
- />
912
- </>
913
- }
914
- height={280}
915
- margin={{left: 40, right: 10, top: 10, bottom: 30}}
916
- />
917
-
918
- <Table<OrderRow>
919
- data={orders}
920
- columns={columns}
921
- idKey="id"
922
- density="balanced"
923
- dividers="rows"
924
- hasHover
925
- />
926
- </VStack>
927
- </LayoutContent>
928
- }
929
- />
930
- );
931
- }